[
  {
    "path": ".dockerignore",
    "content": "integration/**/*\nscripts/**/*\nhack/**/*\nexamples/**/*\ndocs/**/*\n.github/**/*\nlogo/**/*\nout/**/*\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Report a bug in kaniko\n\n---\n\n**Actual behavior**\nA clear and concise description of what the bug is.\n\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. ...\n2. ...\n\n**Additional Information**\n - Dockerfile \n   Please provide either the Dockerfile you're trying to build or one that can reproduce this error.\n - Build Context\n   Please provide or clearly describe any files needed to build the Dockerfile (ADD/COPY commands)\n - Kaniko Image (fully qualified with digest)\n \n **Triage Notes for the Maintainers**\n <!-- 🎉🎉🎉 Thank you for an opening an issue !!! 🎉🎉🎉\nWe are doing our best to get to this. Please help us by helping us prioritize your issue by filling the section below -->\n\n \n | **Description** | **Yes/No** |\n |----------------|---------------|\n | Please check if this a new feature you are proposing        | <ul><li>- [ ] </li></ul>|\n | Please check if the build works in docker but not in kaniko | <ul><li>- [ ] </li></ul>| \n | Please check if this error is seen when you use `--cache` flag | <ul><li>- [ ] </li></ul>|\n | Please check if your dockerfile is a multistage dockerfile | <ul><li>- [ ] </li></ul>| \n \n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n- package-ecosystem: gomod\n  directory: /\n  schedule:\n    interval: weekly\n- package-ecosystem: github-actions\n  directory: /\n  schedule:\n    interval: weekly\n- package-ecosystem: docker\n  directory: /deploy\n  schedule:\n    interval: weekly\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "<!-- 🎉🎉🎉 Thank you for the PR!!! 🎉🎉🎉 -->\n\n\nFixes #<issue number> _in case of a bug fix, this should point to a bug and any other related issue(s)_\n\n**Description**\n\n<!-- Describe your changes here- ideally you can get that description straight from\nyour descriptive commit message(s)! -->\n\n**Submitter Checklist**\n\nThese are the criteria that every PR should meet, please check them off as you\nreview them:\n\n- [ ] Includes [unit tests](../DEVELOPMENT.md#creating-a-pr)\n- [ ] Adds integration tests if needed.\n\n_See [the contribution guide](../CONTRIBUTING.md) for more details._\n\n\n**Reviewer Notes**\n\n- [ ] The code flow looks good. \n- [ ] Unit tests and or integration tests added.\n\n\n**Release Notes**\n\nDescribe any changes here so maintainer can include it in the release notes, or delete this block.\n\n```\nExamples of user facing changes:\n- kaniko adds a new flag `--registry-repo` to override registry\n\n```\n"
  },
  {
    "path": ".github/workflows/images.yaml",
    "content": "name: Build images\n\non:\n  pull_request:\n    branches: ['main']\n  push:\n    branches: ['main']\n    tags: ['v[0-9]+.[0-9]+.[0-9]+*']\n\njobs:\n  build-images:\n    concurrency:\n      # If a previous run is ongoing with the same head_ref (it's a run on the\n      # same PR) then cancel it to save time. If it isn't a PR, only cancel the\n      # previous run if it's on the same commit SHA. This prevents a run for a\n      # commit push from cancelling a previous commit push's build, since we\n      # want an image built and tagged for each commit.\n      group: build-images-${{ matrix.image }}-${{ github.head_ref || github.sha }}\n      cancel-in-progress: true\n    permissions:\n      contents: read  # Read the repo contents.\n      id-token: write # Produce identity token for keyless signing.\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        image:\n        - executor\n        - executor-debug\n        - executor-slim\n        - warmer\n\n        include:\n\n        \n        - image: executor\n          target: kaniko-executor\n          platforms: linux/amd64,linux/arm64,linux/s390x,linux/ppc64le\n          image-name: gcr.io/kaniko-project/executor\n          tag: ${{ github.sha }}\n          release-tag: latest\n\n        - image: executor-debug\n          target: kaniko-debug\n          platforms: linux/amd64,linux/arm64,linux/s390x\n          image-name: gcr.io/kaniko-project/executor\n          tag: ${{ github.sha }}-debug\n          release-tag: debug\n\n        - image: executor-slim\n          target: kaniko-slim\n          platforms: linux/amd64,linux/arm64,linux/s390x,linux/ppc64le\n          image-name: gcr.io/kaniko-project/executor\n          tag: ${{ github.sha }}-slim\n          release-tag: slim\n\n        - image: warmer\n          target: kaniko-warmer\n          platforms: linux/amd64,linux/arm64,linux/s390x,linux/ppc64le\n          image-name: gcr.io/kaniko-project/warmer\n          tag: ${{ github.sha }}\n          release-tag: latest\n\n    steps:\n    - uses: actions/checkout@b0e28b5ac45a892f91e7d036f8200cf5ed489415 # v3\n\n    # Setup auth if not a PR.\n    - if: github.event_name != 'pull_request'\n      uses: google-github-actions/auth@ba79af03959ebeac9769e648f473a284504d9193 # v2.1.10\n      with:\n        credentials_json: '${{ secrets.GCR_DEVOPS_SERVICE_ACCOUNT_KEY }}'\n        export_environment_variables: true\n        create_credentials_file: true\n    - if: github.event_name != 'pull_request'\n      uses: google-github-actions/setup-gcloud@98ddc00a17442e89a24bbf282954a3b65ce6d200 # v2.1.0\n    - if: github.event_name != 'pull_request'\n      run: gcloud auth configure-docker\n\n    # Don't build for all platforms on PRs.\n    - id: platforms\n      run: |\n        event=\"${{ github.event_name }}\"\n        if [[ \"$event\" == \"pull_request\" ]]; then\n          echo \"platforms=linux/amd64\" >> $GITHUB_OUTPUT\n        else\n          platforms=\"${{ matrix.platforms }}\"\n          echo \"platforms=${platforms}\" >> $GITHUB_OUTPUT\n        fi\n    # Build and push with Docker.\n    - uses: docker/setup-qemu-action@5927c834f5b4fdf503fca6f4c7eccda82949e1ee # v3.1.0\n      with:\n        platforms: ${{ matrix.platforms }}\n    - uses: docker/setup-buildx-action@4fd812986e6c8c2a69e18311145f9371337f27d4 # v1\n    - uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0\n      id: build-and-push\n      with:\n        context: .\n        file: ./deploy/Dockerfile\n        platforms: ${{ steps.platforms.outputs.platforms }}\n        push: ${{ github.event_name != 'pull_request' }} # Only push if not a PR.\n        tags: ${{ matrix.image-name }}:${{ matrix.tag }}\n        no-cache-filters: certs\n        # https://github.com/docker/build-push-action/blob/master/docs/advanced/cache.md#github-cache\n        cache-from: type=gha\n        cache-to: type=gha,mode=max\n        target: ${{ matrix.target }}\n\n    # Sign images if not a PR.\n    - if: github.event_name != 'pull_request'\n      uses: sigstore/cosign-installer@3454372f43399081ed03b604cb2d021dabca52bb # v3.8.2\n    - if: github.event_name != 'pull_request'\n      run: |\n        cosign sign --yes \\\n            --key gcpkms://projects/kaniko-project/locations/global/keyRings/cosign/cryptoKeys/cosign \\\n            ${{ matrix.image-name }}@${{ steps.build-and-push.outputs.digest }}\n        cosign sign --yes \\\n            ${{ matrix.image-name }}@${{ steps.build-and-push.outputs.digest }}\n\n    # If a tag push, use crane to add more tags.\n    - if: startsWith(github.ref, 'refs/tags/v')\n      uses: imjasonh/setup-crane@31b88efe9de28ae0ffa220711af4b60be9435f6e # v0.4\n    - if: startsWith(github.ref, 'refs/tags/v')\n      name: Apply release tags\n      run: |\n        tag=${GITHUB_REF/refs\\/tags\\//}\n\n        # Tag :latest, :debug, :slim\n        crane cp ${{ matrix.image-name }}@${{ steps.build-and-push.outputs.digest }} \\\n            ${{ matrix.image-name }}:${{ matrix.release-tag }}\n\n        if [[ \"${{ matrix.release-tag }}\" == \"latest\" ]]; then\n          # Tag :latest images as :v1.X.Y\n          crane cp ${{ matrix.image-name }}@${{ steps.build-and-push.outputs.digest }} \\\n              ${{ matrix.image-name }}:${tag}\n        else\n          # Or tag :v1.X.Y-debug and :v1.X.Y-slim\n          crane cp ${{ matrix.image-name }}@${{ steps.build-and-push.outputs.digest }} \\\n              ${{ matrix.image-name }}:${tag}-${{ matrix.release-tag }}\n        fi\n"
  },
  {
    "path": ".github/workflows/integration-tests.yaml",
    "content": "name: Integration tests\n\non:\n  push:\n    branches: ['main']\n  pull_request:\n    branches: ['main']\n\npermissions:\n  contents: read\n\njobs:\n  tests:\n    runs-on: ubuntu-latest\n    env:\n      IMAGE_REPO: 'localhost:5000'\n      REGISTRY: 'localhost:5000'\n      DOCKER_BUILDKIT: '0'\n    strategy:\n      fail-fast: false\n      matrix:\n        make-target:\n        - integration-test-layers\n        - integration-test-misc\n        - integration-test-run\n        - k8s-executor-build-push integration-test-k8s\n\n    steps:\n    - name: Maximize build space\n      uses: AdityaGarg8/remove-unwanted-software@v4\n      with:\n        remove-android: 'true'\n        remove-dotnet: 'true'\n        remove-haskell: 'true'\n    - uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2\n      with:\n        go-version: '1.22'\n    - uses: actions/checkout@b0e28b5ac45a892f91e7d036f8200cf5ed489415 # v3\n    - uses: docker/setup-buildx-action@4fd812986e6c8c2a69e18311145f9371337f27d4 # v1\n\n    - run: make install-container-diff k3s-setup\n    - run: make ${{ matrix.make-target }}\n"
  },
  {
    "path": ".github/workflows/nightly-vulnerability-scan.yml",
    "content": "name: Nightly Vulnerability Scan\n\non:\n  schedule:\n    # Schedule to run every night at midnight\n    - cron: '0 0 * * *'\n\njobs:\n  vulnerability-scan:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v2\n\n      - name: Set up Grype\n        run: |\n          # Install Grype\n          curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin\n\n      - name: Get latest commit SHA of Kaniko project\n        id: get-commit\n        run: |\n          LATEST_COMMIT_SHA=$(git rev-parse HEAD)\n          echo \"Latest commit SHA: $LATEST_COMMIT_SHA\"\n          echo \"::set-output name=sha::$LATEST_COMMIT_SHA\"\n\n      - name: Scan the latest CI/CD image\n        run: |\n          IMAGE_ID=\"gcr.io/kaniko-project/executor:${{ steps.get-commit.outputs.sha }}\"\n          echo \"Scanning image $IMAGE_ID\"\n          grype $IMAGE_ID > grype-output.txt\n\n      - name: Check for vulnerabilities and create an issue\n        run: |\n          if grep -q 'No vulnerabilities found' grype-output.txt; then\n            echo \"No vulnerabilities found.\"\n          else\n            gh issue create --title \"Vulnerabilities Found in Nightly Scan\" --body \"Vulnerabilities found in the latest image scan. Please check the attached report.\" --body-file grype-output.txt\n          fi\n"
  },
  {
    "path": ".github/workflows/unit-tests.yaml",
    "content": "name: Unit tests\n\non:\n  push:\n    branches: ['main']\n  pull_request:\n    branches: ['main']\n\npermissions:\n  contents: read\n\njobs:\n  tests:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v4.01\n      with:\n        go-version: '1.22'\n    - uses: actions/checkout@b0e28b5ac45a892f91e7d036f8200cf5ed489415 # v3\n    - run: make test\n"
  },
  {
    "path": ".gitignore",
    "content": "out/\nbazel-*\n*~\nBUILD.bazel\n.idea/**\n*.iml\n.vagrant\n.vscode/"
  },
  {
    "path": ".golangci.yaml",
    "content": "# This file contains all available configuration options\n# with their default values.\n\n# options for analysis running\nrun:\n  # default concurrency is a available CPU number\n  concurrency: 4\n\n  # timeout for analysis, e.g. 30s, 5m, default is 1m\n  deadline: 1m\n\n  # exit code when at least one issue was found, default is 1\n  issues-exit-code: 1\n\n  # include test files or not, default is true\n  tests: true\n\n  # list of build tags, all linters use it. Default is empty list.\n  build-tags:\n\n  # which dirs to skip: they won't be analyzed;\n  # can use regexp here: generated.*, regexp is applied on full path;\n  # default value is empty list, but next dirs are always skipped independently\n  # from this option's value:\n  #   \tvendor$, third_party$, testdata$, examples$, Godeps$, builtin$\n  skip-dirs:\n\n  # which files to skip: they will be analyzed, but issues from them\n  # won't be reported. Default value is empty list, but there is\n  # no need to include all autogenerated files, we confidently recognize\n  # autogenerated files. If it's not please let us know.\n  skip-files:\n\n# output configuration options\noutput:\n  # colored-line-number|line-number|json|tab|checkstyle, default is \"colored-line-number\"\n  format: colored-line-number\n\n  # print lines of code with issue, default is true\n  print-issued-lines: true\n\n  # print linter name in the end of issue text, default is true\n  print-linter-name: true\n\n\n# all available settings of specific linters\nlinters-settings:\n  errcheck:\n    # report about not checking of errors in type assetions: `a := b.(MyStruct)`;\n    # default is false: such cases aren't reported by default.\n    check-type-assertions: false\n\n    # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`;\n    # default is false: such cases aren't reported by default.\n    check-blank: false\n  govet:\n    # report about shadowed variables\n    #check-shadowing: true\n\n    # Obtain type information from installed (to $GOPATH/pkg) package files:\n    # golangci-lint will execute `go install -i` and `go test -i` for analyzed packages\n    # before analyzing them.\n    # By default this option is disabled and govet gets type information by loader from source code.\n    # Loading from source code is slow, but it's done only once for all linters.\n    # Go-installing of packages first time is much slower than loading them from source code,\n    # therefore this option is disabled by default.\n    # But repeated installation is fast in go >= 1.10 because of build caching.\n    # Enable this option only if all conditions are met:\n    #  1. you use only \"fast\" linters (--fast e.g.): no program loading occurs\n    #  2. you use go >= 1.10\n    #  3. you do repeated runs (false for CI) or cache $GOPATH/pkg or `go env GOCACHE` dir in CI.\n    #use-installed-packages: false\n  golint:\n    # minimal confidence for issues, default is 0.8\n    min-confidence: 0.8\n  gofmt:\n    # simplify code: gofmt with `-s` option, true by default\n    simplify: true\n  #gocyclo:\n  #  # minimal code complexity to report, 30 by default (but we recommend 10-20)\n  #  min-complexity: 10\n  maligned:\n    # print struct with more effective memory layout or not, false by default\n    suggest-new: true\n  #dupl:\n  #  # tokens count to trigger issue, 150 by default\n  #  threshold: 100\n  goconst:\n    # minimal length of string constant, 3 by default\n    min-len: 3\n    # minimal occurrences count to trigger, 3 by default\n    min-occurrences: 3\n  misspell:\n    # Correct spellings using locale preferences for US or UK.\n    # Default is to use a neutral variety of English.\n    # Setting locale to US will correct the British spelling of 'colour' to 'color'.\n    locale: US\n  #lll:\n  #  # max line length, lines longer will be reported. Default is 120.\n  #  # '\\t' is counted as 1 character by default, and can be changed with the tab-width option\n  #  line-length: 120\n  #  # tab width in spaces. Default to 1.\n  #  tab-width: 1\n  unused:\n    # treat code as a program (not a library) and report unused exported identifiers; default is false.\n    # XXX: if you enable this setting, unused will report a lot of false-positives in text editors:\n    # if it's called for subdir of a project it can't find funcs usages. All text editor integrations\n    # with golangci-lint call it on a directory with the changed file.\n    check-exported: false\n  unparam:\n    # call graph construction algorithm (cha, rta). In general, use cha for libraries,\n    # and rta for programs with main packages. Default is cha.\n    algo: cha\n\n    # Inspect exported functions, default is false. Set to true if no external program/library imports your code.\n    # XXX: if you enable this setting, unparam will report a lot of false-positives in text editors:\n    # if it's called for subdir of a project it can't find external interfaces. All text editor integrations\n    # with golangci-lint call it on a directory with the changed file.\n    check-exported: false\n  #nakedret:\n  #  # make an issue if func has more lines of code than this setting and it has naked returns; default is 30\n  #  max-func-lines: 30\n  #prealloc:\n  #  # XXX: we don't recommend using this linter before doing performance profiling.\n  #  # For most programs usage of prealloc will be a premature optimization.\n\n  #  # Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.\n  #  # True by default.\n  #  simple: true\n  #  range-loops: true # Report preallocation suggestions on range loops, true by default\n  #  for-loops: false # Report preallocation suggestions on for loops, false by default\n\n\nlinters:\n  enable:\n    - goconst\n    - goimports\n    - golint\n    - interfacer\n    - maligned\n    - misspell\n    - unconvert\n    - unparam\n  enable-all: false\n  disable:\n    - errcheck\n    - gas\n    - scopelint\n    - bodyclose\n    - staticcheck\n  disable-all: false\n  presets:\n    - bugs\n    - unused\n  fast: false\n\n\nissues:\n  # List of regexps of issue texts to exclude, empty list by default.\n  # But independently from this option we use default exclude patterns,\n  # it can be disabled by `exclude-use-default: false`. To list all\n  # excluded by default patterns execute `golangci-lint run --help`\n  exclude:\n\n  # Independently from option `exclude` we use default exclude patterns,\n  # it can be disabled by this option. To list all\n  # excluded by default patterns execute `golangci-lint run --help`.\n  # Default value for this option is true.\n  exclude-use-default: true\n\n  # Maximum issues count per one linter. Set to 0 to disable. Default is 50.\n  max-per-linter: 50\n\n  # Maximum count of issues with the same text. Set to 0 to disable. Default is 3.\n  max-same: 3\n\n  # Show only new issues: if there are unstaged changes or untracked files,\n  # only those changes are analyzed, else only changes in HEAD~ are analyzed.\n  # It's a super-useful option for integration of golangci-lint into existing\n  # large codebase. It's not practical to fix all existing issues at the moment\n  # of integration: much better don't allow issues in new code.\n  # Default is false.\n  new: false\n\n  ## Show only new issues created after git revision `REV`\n  #new-from-rev: REV\n\n  ## Show only new issues created in git patch with set file path.\n  #new-from-patch: path/to/patch/file\n"
  },
  {
    "path": ".prettierrc",
    "content": "printWidth: 80\ntabWidth: 2\nsemi: false\nsingleQuote: false\noverrides: [{ files: \"*.md\", options: { proseWrap: always } }]\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# v1.24.0 Release 2025-05-21\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.24.0\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.24.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.24.0-slim\n```\n\n\n\nHuge thank you for this release towards our contributors: \n- Aaron Prindle\n- Aswin A\n- dependabot[bot]\n- Michael Plump\n- Mick van Gelderen\n- Thomas L. Kjeldsen\n\n\n\n# v1.23.2 Release 2024-07-09\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.23.2\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.23.2-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.23.2-slim\n```\n\n* deps: bump github.com/moby/buildkit and github.com/docker/docker [#3242](https://github.com/GoogleContainerTools/kaniko/pull/3242)\n* chore(deps): bump docker/build-push-action from 6.1.0 to 6.3.0 [#3236](https://github.com/GoogleContainerTools/kaniko/pull/3236)\n* chore(deps): bump docker/setup-qemu-action from 3.0.0 to 3.1.0 [#3235](https://github.com/GoogleContainerTools/kaniko/pull/3235)\n* chore(deps): bump docker/setup-buildx-action from 3.3.0 to 3.4.0 [#3237](https://github.com/GoogleContainerTools/kaniko/pull/3237)\n* chore(deps): bump google.golang.org/api from 0.185.0 to 0.187.0 [#3238](https://github.com/GoogleContainerTools/kaniko/pull/3238)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.17.1 to 1.17.5 [#3239](https://github.com/GoogleContainerTools/kaniko/pull/3239)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.16.24 to 1.17.1 [#3220](https://github.com/GoogleContainerTools/kaniko/pull/3220)\n* chore(deps): bump docker/build-push-action from 6.0.0 to 6.1.0 [#3218](https://github.com/GoogleContainerTools/kaniko/pull/3218)\n* chore(deps): bump google.golang.org/api from 0.183.0 to 0.185.0 [#3219](https://github.com/GoogleContainerTools/kaniko/pull/3219)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.55.1 to 1.56.1 [#3221](https://github.com/GoogleContainerTools/kaniko/pull/3221)\n* chore(deps): bump docker/build-push-action from 5.3.0 to 6.0.0 [#3212](https://github.com/GoogleContainerTools/kaniko/pull/3212)\n* chore(deps): bump cloud.google.com/go/storage from 1.41.0 to 1.42.0 [#3204](https://github.com/GoogleContainerTools/kaniko/pull/3204)\n* chore(deps): bump github.com/spf13/cobra from 1.8.0 to 1.8.1 [#3205](https://github.com/GoogleContainerTools/kaniko/pull/3205)\n* chore(deps): bump github.com/google/go-containerregistry from 0.19.1 to 0.19.2 [#3206](https://github.com/GoogleContainerTools/kaniko/pull/3206)\n* chore(deps): bump imjasonh/setup-crane from 0.3 to 0.4 [#3210](https://github.com/GoogleContainerTools/kaniko/pull/3210)\n* chore(deps): bump golang.org/x/net from 0.25.0 to 0.26.0 [#3190](https://github.com/GoogleContainerTools/kaniko/pull/3190)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.16.21 to 1.16.24 [#3191](https://github.com/GoogleContainerTools/kaniko/pull/3191)\n* chore(deps): bump google.golang.org/api from 0.182.0 to 0.183.0 [#3192](https://github.com/GoogleContainerTools/kaniko/pull/3192)\n* chore(deps): bump github.com/containerd/containerd from 1.7.17 to 1.7.18 [#3193](https://github.com/GoogleContainerTools/kaniko/pull/3193)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.27.0 to 1.27.2 [#3194](https://github.com/GoogleContainerTools/kaniko/pull/3194)\n\n\nHuge thank you for this release towards our contributors: \n- Aaron Prindle\n- dependabot[bot]\n\n\n# v1.23.1 Release 2024-06-07\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.23.1\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.23.1-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.23.1-slim\n```\n\n* Enable pushing cache with --no-push [#3181](https://github.com/GoogleContainerTools/kaniko/pull/3181)\n* docs: document --no-push-cache flag in README.md [#3188](https://github.com/GoogleContainerTools/kaniko/pull/3188)\n* chore(deps): bump google.golang.org/api from 0.181.0 to 0.182.0 [#3187](https://github.com/GoogleContainerTools/kaniko/pull/3187)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.16.17 to 1.16.21 [#3179](https://github.com/GoogleContainerTools/kaniko/pull/3179)\n* chore(deps): bump google.golang.org/api from 0.180.0 to 0.181.0 [#3170](https://github.com/GoogleContainerTools/kaniko/pull/3170)\n* chore(deps): bump google-github-actions/auth from 2.1.2 to 2.1.3 [#3168](https://github.com/GoogleContainerTools/kaniko/pull/3168)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.53.2 to 1.54.2 [#3169](https://github.com/GoogleContainerTools/kaniko/pull/3169)\n* chore(deps): bump cloud.google.com/go/storage from 1.40.0 to 1.41.0 [#3171](https://github.com/GoogleContainerTools/kaniko/pull/3171)\n* chore(deps): bump github.com/containerd/containerd from 1.7.16 to 1.7.17 [#3172](https://github.com/GoogleContainerTools/kaniko/pull/3172)\n* chore(deps): bump github.com/docker/docker from 26.1.2+incompatible to 26.1.3+incompatible [#3173](https://github.com/GoogleContainerTools/kaniko/pull/3173)\n\n\nHuge thank you for this release towards our contributors: \n- Aaron Prindle\n- dependabot[bot]\n- Leo Palmer Sunmo\n\n\n# v1.23.0 Release 2024-05-14\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.23.0\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.23.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.23.0-slim\n```\n\n* give warn instead of error when wildcard not match any files [#3127](https://github.com/GoogleContainerTools/kaniko/pull/3127)\n* warmer validate and copy registry mirror to registry map [#3140](https://github.com/GoogleContainerTools/kaniko/pull/3140)\n* docs: update docs on mirrors and registry map. [#3153](https://github.com/GoogleContainerTools/kaniko/pull/3153)\n* Fix: Make `--registry-map` compatible with namespaced images [#3138](https://github.com/GoogleContainerTools/kaniko/pull/3138)\n* \"Fixes #2752\" [#3132](https://github.com/GoogleContainerTools/kaniko/pull/3132)\n* chore(deps): bump github.com/docker/docker from 26.1.1+incompatible to 26.1.2+incompatible [#3161](https://github.com/GoogleContainerTools/kaniko/pull/3161)\n* chore(deps): bump google.golang.org/api from 0.177.0 to 0.180.0 [#3160](https://github.com/GoogleContainerTools/kaniko/pull/3160)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.16.15 to 1.16.17 [#3158](https://github.com/GoogleContainerTools/kaniko/pull/3158)\n* chore(deps): bump github.com/docker/docker from 26.1.0+incompatible to 26.1.1+incompatible [#3149](https://github.com/GoogleContainerTools/kaniko/pull/3149)\n* chore(deps): bump actions/setup-go from 5.0.0 to 5.0.1 [#3152](https://github.com/GoogleContainerTools/kaniko/pull/3152)\n* chore(deps): bump google.golang.org/api from 0.175.0 to 0.177.0 [#3151](https://github.com/GoogleContainerTools/kaniko/pull/3151)\n* chore(deps): bump golang.org/x/oauth2 from 0.19.0 to 0.20.0 [#3150](https://github.com/GoogleContainerTools/kaniko/pull/3150)\n* chore(deps): bump github.com/moby/buildkit from 0.13.1 to 0.13.2 [#3145](https://github.com/GoogleContainerTools/kaniko/pull/3145)\n* chore(deps): bump github.com/containerd/containerd from 1.7.15 to 1.7.16 [#3144](https://github.com/GoogleContainerTools/kaniko/pull/3144)\n* chore: bump cred helper libraries [#3133](https://github.com/GoogleContainerTools/kaniko/pull/3133)\n* Added --chmod for ADD and COPY commands. Fixes #2850 and #1751 [#3119](https://github.com/GoogleContainerTools/kaniko/pull/3119)\n* chore(deps): bump github.com/google/slowjam from 1.1.0 to 1.1.1 [#3129](https://github.com/GoogleContainerTools/kaniko/pull/3129)\n* chore(deps): bump google.golang.org/api from 0.172.0 to 0.175.0 [#3128](https://github.com/GoogleContainerTools/kaniko/pull/3128)\n* fix: integration: fail on error when build with docker [#3131](https://github.com/GoogleContainerTools/kaniko/pull/3131)\n* fix(doc): wiki url [#3117](https://github.com/GoogleContainerTools/kaniko/pull/3117)\n* chore(deps): bump golang.org/x/net from 0.22.0 to 0.24.0 [#3113](https://github.com/GoogleContainerTools/kaniko/pull/3113)\n* chore(deps): bump github.com/Azure/azure-sdk-for-go/sdk/storage/azblob from 1.3.1 to 1.3.2 [#3114](https://github.com/GoogleContainerTools/kaniko/pull/3114)\n* chore(deps): bump github.com/containerd/containerd from 1.7.14 to 1.7.15 [#3112](https://github.com/GoogleContainerTools/kaniko/pull/3112)\n* chore(deps): bump docker/setup-buildx-action from 3.2.0 to 3.3.0 [#3111](https://github.com/GoogleContainerTools/kaniko/pull/3111)\n* chore(deps): bump github.com/docker/docker from 26.0.0+incompatible to 26.0.2+incompatible [#3121](https://github.com/GoogleContainerTools/kaniko/pull/3121)\n* chore(deps): bump AdityaGarg8/remove-unwanted-software from 2 to 3 [#3110](https://github.com/GoogleContainerTools/kaniko/pull/3110)\n* chore(deps): bump sigstore/cosign-installer from 3.4.0 to 3.5.0 [#3109](https://github.com/GoogleContainerTools/kaniko/pull/3109)\n* chore(deps): bump golang.org/x/sys from 0.18.0 to 0.19.0 [#3103](https://github.com/GoogleContainerTools/kaniko/pull/3103)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.16.9 to 1.16.15 [#3104](https://github.com/GoogleContainerTools/kaniko/pull/3104)\n* chore(deps): bump golang.org/x/sync from 0.6.0 to 0.7.0 [#3105](https://github.com/GoogleContainerTools/kaniko/pull/3105)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.27.7 to 1.27.11 [#3106](https://github.com/GoogleContainerTools/kaniko/pull/3106)\n* chore(deps): bump golang.org/x/oauth2 from 0.18.0 to 0.19.0 [#3107](https://github.com/GoogleContainerTools/kaniko/pull/3107)\n* chore(deps): bump google.golang.org/api from 0.171.0 to 0.172.0 [#3094](https://github.com/GoogleContainerTools/kaniko/pull/3094)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.52.1 to 1.53.1 [#3096](https://github.com/GoogleContainerTools/kaniko/pull/3096)\n* chore(deps): bump github.com/go-git/go-git/v5 from 5.11.0 to 5.12.0 [#3095](https://github.com/GoogleContainerTools/kaniko/pull/3095)\n* chore(deps): bump github.com/moby/buildkit from 0.13.0 to 0.13.1 [#3093](https://github.com/GoogleContainerTools/kaniko/pull/3093)\n* chore(deps): bump cloud.google.com/go/storage from 1.39.1 to 1.40.0 [#3097](https://github.com/GoogleContainerTools/kaniko/pull/3097)\n* chore: update cred helper go libraries [#3087](https://github.com/GoogleContainerTools/kaniko/pull/3087)\n\n\nHuge thank you for this release towards our contributors: \n- Aaron Prindle\n- dependabot[bot]\n- Djabx\n- Marc Lallaouret\n- Matthias Schneider\n- Prima Adi Pradana\n- Samarth08\n- Verlhac Gaëtan\n\n\n# v1.22.0 Release 2024-03-26\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.22.0\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.22.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.22.0-slim\n```\n\n* chore(deps): bump github.com/docker/docker from 25.0.4+incompatible to 26.0.0+incompatible [#3085](https://github.com/GoogleContainerTools/kaniko/pull/3085)\n* chore(deps): bump google.golang.org/api from 0.167.0 to 0.171.0 [#3082](https://github.com/GoogleContainerTools/kaniko/pull/3082)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.25.3 to 1.26.0 [#3083](https://github.com/GoogleContainerTools/kaniko/pull/3083)\n* chore(deps): bump github.com/containerd/containerd from 1.7.13 to 1.7.14 [#3084](https://github.com/GoogleContainerTools/kaniko/pull/3084)\n* chore(deps): bump docker/build-push-action from 5.2.0 to 5.3.0 [#3070](https://github.com/GoogleContainerTools/kaniko/pull/3070)\n* Fix #3032: Remove query parameters in ADD command when the destinatio… [#3053](https://github.com/GoogleContainerTools/kaniko/pull/3053)\n* Kaniko/add path regmaps [possible in registry maps and/or mirror] [#3051](https://github.com/GoogleContainerTools/kaniko/pull/3051)\n* chore(deps): bump docker/setup-buildx-action from 3.1.0 to 3.2.0 [#3071](https://github.com/GoogleContainerTools/kaniko/pull/3071)\n* chore(deps): bump github.com/moby/buildkit from 0.12.5 to 0.13.0 [#3072](https://github.com/GoogleContainerTools/kaniko/pull/3072)\n* chore(deps): bump github.com/google/go-containerregistry from 0.19.0 to 0.19.1 [#3073](https://github.com/GoogleContainerTools/kaniko/pull/3073)\n* chore(deps): bump golang.org/x/oauth2 from 0.17.0 to 0.18.0 [#3074](https://github.com/GoogleContainerTools/kaniko/pull/3074)\n* chore(deps): bump cloud.google.com/go/storage from 1.39.0 to 1.39.1 [#3075](https://github.com/GoogleContainerTools/kaniko/pull/3075)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.51.4 to 1.52.1 [#3076](https://github.com/GoogleContainerTools/kaniko/pull/3076)\n* Fix COPY fails when multiple files are copied to path specified in ENV [#3034](https://github.com/GoogleContainerTools/kaniko/pull/3034)\n* Add AWS ECR error message for tag Immutability [#3045](https://github.com/GoogleContainerTools/kaniko/pull/3045)\n* chore: update google.golang.org/protobuff to resolve CVE-2024-24786 [#3068](https://github.com/GoogleContainerTools/kaniko/pull/3068)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.16.6 to 1.16.9 [#3058](https://github.com/GoogleContainerTools/kaniko/pull/3058)\n* chore(deps): bump golang.org/x/net from 0.21.0 to 0.22.0 [#3056](https://github.com/GoogleContainerTools/kaniko/pull/3056)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.25.2 to 1.25.3 [#3057](https://github.com/GoogleContainerTools/kaniko/pull/3057)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.51.1 to 1.51.4 [#3059](https://github.com/GoogleContainerTools/kaniko/pull/3059)\n* chore(deps): bump github.com/docker/docker from 25.0.3+incompatible to 25.0.4+incompatible [#3060](https://github.com/GoogleContainerTools/kaniko/pull/3060)\n* chore(deps): bump docker/build-push-action from 5.1.0 to 5.2.0 [#3061](https://github.com/GoogleContainerTools/kaniko/pull/3061)\n\n\nHuge thank you for this release towards our contributors: \n- Aaron Prindle\n- Alessandro Bitocchi\n- dependabot[bot]\n- Jérémie Augustin\n- Prima Adi Pradana\n\n\n# v1.21.1 Release 2024-03-06\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.21.1\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.21.1-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.21.1-slim\n```\n\n* chore(deps): bump cloud.google.com/go/storage from 1.38.0 to 1.39.0 [#3040](https://github.com/GoogleContainerTools/kaniko/pull/3040)\n* chore(deps): bump github.com/containerd/containerd from 1.7.6 to 1.7.13 [#3038](https://github.com/GoogleContainerTools/kaniko/pull/3038)\n* test: fix test breakage caused by external dependency update [#3049](https://github.com/GoogleContainerTools/kaniko/pull/3049)\n* chore(deps): bump docker/setup-buildx-action from 3.0.0 to 3.1.0 [#3037](https://github.com/GoogleContainerTools/kaniko/pull/3037)\n* chore(deps): bump github.com/Azure/azure-sdk-for-go/sdk/storage/azblob from 1.3.0 to 1.3.1 [#3039](https://github.com/GoogleContainerTools/kaniko/pull/3039)\n\n\nHuge thank you for this release towards our contributors: \n- Aaron Prindle\n- dependabot[bot]\n\n\n# v1.21.0 Release 2024-02-29\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.21.0\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.21.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.21.0-slim\n```\n\n* Add --push-ignore-immutable-tag-errors boolean CLI option [#2774](https://github.com/GoogleContainerTools/kaniko/pull/2774)\n* docs: fix broken links and redirects [#3009](https://github.com/GoogleContainerTools/kaniko/pull/3009)\n* feat: add skip tls flag for private git context [#2854](https://github.com/GoogleContainerTools/kaniko/pull/2854)\n* Fix unpack tar.gz archive with ADD instruction, issue #2409 [#2991](https://github.com/GoogleContainerTools/kaniko/pull/2991)\n* chore: update google github-action auth version [#3030](https://github.com/GoogleContainerTools/kaniko/pull/3030)\n* refactor: remove artifact upload from nightly-vulnerabiliy-scan.yml [#3029](https://github.com/GoogleContainerTools/kaniko/pull/3029)\n* feat: add nightly grype vuln scan to kaniko executor image [#2970](https://github.com/GoogleContainerTools/kaniko/pull/2970)\n* chore: update docker-credential-gcr to use v2 [#3026](https://github.com/GoogleContainerTools/kaniko/pull/3026)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.16.1 to 1.16.6 [#3020](https://github.com/GoogleContainerTools/kaniko/pull/3020)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.50.0 to 1.51.1 [#3021](https://github.com/GoogleContainerTools/kaniko/pull/3021)\n* chore(deps): bump google.golang.org/api from 0.165.0 to 0.167.0 [#3023](https://github.com/GoogleContainerTools/kaniko/pull/3023)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.27.0 to 1.27.4 [#3024](https://github.com/GoogleContainerTools/kaniko/pull/3024)\n* chore(deps): bump google-github-actions/auth from 2.1.1 to 2.1.2 [#3025](https://github.com/GoogleContainerTools/kaniko/pull/3025)\n* feat: add support for no push environment variable [#2983](https://github.com/GoogleContainerTools/kaniko/pull/2983)\n* Add documentation for --chown support limitation [#3019](https://github.com/GoogleContainerTools/kaniko/pull/3019)\n* chore(deps): bump github.com/Azure/azure-sdk-for-go/sdk/storage/azblob from 1.2.1 to 1.3.0 [#3013](https://github.com/GoogleContainerTools/kaniko/pull/3013)\n* chore(deps): bump google.golang.org/api from 0.161.0 to 0.165.0 [#3016](https://github.com/GoogleContainerTools/kaniko/pull/3016)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.15.15 to 1.16.1 [#3014](https://github.com/GoogleContainerTools/kaniko/pull/3014)\n* chore(deps): bump cloud.google.com/go/storage from 1.37.0 to 1.38.0 [#3015](https://github.com/GoogleContainerTools/kaniko/pull/3015)\n* Add flag to remap registries for any registry mirror [#2935](https://github.com/GoogleContainerTools/kaniko/pull/2935)\n* FIX: missing or partial support for pattern substition in variable when cache enabled [#2968](https://github.com/GoogleContainerTools/kaniko/pull/2968)\n* docs: add ROADMAP.md to kaniko project [#3005](https://github.com/GoogleContainerTools/kaniko/pull/3005)\n* chore: update MAINTAINERS file with up-to-date information [#3003](https://github.com/GoogleContainerTools/kaniko/pull/3003)\n* chore(deps): bump golang.org/x/oauth2 from 0.16.0 to 0.17.0 [#3000](https://github.com/GoogleContainerTools/kaniko/pull/3000)\n* chore(deps): bump golang.org/x/net from 0.20.0 to 0.21.0 [#2999](https://github.com/GoogleContainerTools/kaniko/pull/2999)\n* chore(deps): bump golang from 1.21 to 1.22 in /deploy [#2997](https://github.com/GoogleContainerTools/kaniko/pull/2997)\n* chore(deps): bump cloud.google.com/go/storage from 1.36.0 to 1.37.0 [#2998](https://github.com/GoogleContainerTools/kaniko/pull/2998)\n* chore(deps): bump golang.org/x/sys from 0.16.0 to 0.17.0 [#3001](https://github.com/GoogleContainerTools/kaniko/pull/3001)\n* chore(deps): bump google-github-actions/auth from 2.1.0 to 2.1.1 [#3002](https://github.com/GoogleContainerTools/kaniko/pull/3002)\n\n\nHuge thank you for this release towards our contributors: \n- Aaron Prindle\n- Alessandro Bitocchi\n- Damien Degois\n- dependabot[bot]\n- JeromeJu\n- Kraev Sergei\n- Matheus Pimenta\n- Oliver Radwell\n- Sacha Smart\n- schwannden\n\n\n# v1.20.1 Release 2024-02-10\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.20.1\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.20.1-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.20.1-slim\n```\n\n* chore(deps): bump github.com/moby/buildkit from 0.11.6 to 0.12.5, github.com/docker/docker from 24.0.7+incompatible to 25.0.2+incompatible, and other deps [#2995](https://github.com/GoogleContainerTools/kaniko/pull/2995)\n* chore(deps): bump google.golang.org/api from 0.157.0 to 0.161.0 [#2987](https://github.com/GoogleContainerTools/kaniko/pull/2987)\n* chore(deps): bump github.com/google/go-containerregistry from 0.18.0 to 0.19.0 [#2988](https://github.com/GoogleContainerTools/kaniko/pull/2988)\n* chore(deps): bump sigstore/cosign-installer from 3.3.0 to 3.4.0 [#2989](https://github.com/GoogleContainerTools/kaniko/pull/2989)\n* chore(deps): bump github.com/opencontainers/runc from 1.1.5 to 1.1.12 [#2981](https://github.com/GoogleContainerTools/kaniko/pull/2981)\n* README change only: Clarify why merging into another container is a bad idea [#2965](https://github.com/GoogleContainerTools/kaniko/pull/2965)\n* chore(deps): bump google-github-actions/auth from 2.0.1 to 2.1.0 [#2972](https://github.com/GoogleContainerTools/kaniko/pull/2972)\n* chore(deps): bump google-github-actions/setup-gcloud from 2.0.1 to 2.1.0 [#2973](https://github.com/GoogleContainerTools/kaniko/pull/2973)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.15.14 to 1.15.15 [#2975](https://github.com/GoogleContainerTools/kaniko/pull/2975)\n* chore(deps): bump github.com/google/go-containerregistry from 0.17.0 to 0.18.0 [#2976](https://github.com/GoogleContainerTools/kaniko/pull/2976)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.15.11 to 1.15.14 [#2966](https://github.com/GoogleContainerTools/kaniko/pull/2966)\n* chore(deps): bump google.golang.org/api from 0.155.0 to 0.157.0 [#2960](https://github.com/GoogleContainerTools/kaniko/pull/2960)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.26.3 to 1.26.5 [#2963](https://github.com/GoogleContainerTools/kaniko/pull/2963)\n* chore(deps): update go-git/go-git, ProtonMail/go-cryto, and cloudflare/circl deps [#2959](https://github.com/GoogleContainerTools/kaniko/pull/2959)\n* Update clarification for release.md [#2957](https://github.com/GoogleContainerTools/kaniko/pull/2957)\n\n\nHuge thank you for this release towards our contributors: \n- Aaron Prindle\n- Asher\n- Bob Du\n- dependabot[bot]\n- JeromeJu\n- Maximilian Hippler\n- timbavtbc\n\n\n# v1.20.0 Release 2024-01-17\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.20.0\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.20.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.20.0-slim\n```\n\n* chore(deps): bump golang.org/x/oauth2 from 0.15.0 to 0.16.0 [#2948](https://github.com/GoogleContainerTools/kaniko/pull/2948)\n* chore(deps): bump google-github-actions/auth from 2.0.0 to 2.0.1 [#2947](https://github.com/GoogleContainerTools/kaniko/pull/2947)\n* chore(deps): bump golang.org/x/sync from 0.5.0 to 0.6.0 [#2950](https://github.com/GoogleContainerTools/kaniko/pull/2950)\n* chore(deps): bump github.com/containerd/containerd from 1.7.11 to 1.7.12 [#2951](https://github.com/GoogleContainerTools/kaniko/pull/2951)\n* Prevent extra snapshot with --use-new-run [#2943](https://github.com/GoogleContainerTools/kaniko/pull/2943)\n* replace github.com/Azure/azure-storage-blob-go => github.com/Azure/azure-sdk-for-go/sdk/storage/azblob [#2945](https://github.com/GoogleContainerTools/kaniko/pull/2945)\n* Fixed wrong example in README.md [#2931](https://github.com/GoogleContainerTools/kaniko/pull/2931)\n* chore(deps): bump golang.org/x/sys from 0.15.0 to 0.16.0 [#2936](https://github.com/GoogleContainerTools/kaniko/pull/2936)\n* chore(deps): bump google.golang.org/api from 0.154.0 to 0.155.0 [#2937](https://github.com/GoogleContainerTools/kaniko/pull/2937)\n* chore(deps): bump github.com/cloudflare/circl from 1.3.3 to 1.3.7 [#2942](https://github.com/GoogleContainerTools/kaniko/pull/2942)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.15.9 to 1.15.11 [#2939](https://github.com/GoogleContainerTools/kaniko/pull/2939)\n* chore(deps): bump AdityaGarg8/remove-unwanted-software from 1 to 2 [#2940](https://github.com/GoogleContainerTools/kaniko/pull/2940)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.47.7 to 1.47.8 [#2932](https://github.com/GoogleContainerTools/kaniko/pull/2932)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.26.2 to 1.26.3 [#2933](https://github.com/GoogleContainerTools/kaniko/pull/2933)\n* chore(deps): bump github.com/google/go-containerregistry from 0.15.2 to 0.17.0 [#2924](https://github.com/GoogleContainerTools/kaniko/pull/2924)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.15.7 to 1.15.9 [#2926](https://github.com/GoogleContainerTools/kaniko/pull/2926)\n* chore(deps): bump google-github-actions/setup-gcloud from 2.0.0 to 2.0.1 [#2927](https://github.com/GoogleContainerTools/kaniko/pull/2927)\n\n\nHuge thank you for this release towards our contributors: \n- Asher\n- Bob Du\n- dependabot[bot]\n- Maximilian Hippler\n\n\n# v1.19.2 Release 2023-12-19\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.19.2\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.19.2-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.19.2-slim\n```\n\n* chore: update gcr and acr cred helpers [#2910](https://github.com/GoogleContainerTools/kaniko/pull/2910)\n* chore(deps): bump sigstore/cosign-installer from 3.2.0 to 3.3.0 [#2911](https://github.com/GoogleContainerTools/kaniko/pull/2911)\n* chore(deps): bump google.golang.org/api from 0.152.0 to 0.154.0 [#2912](https://github.com/GoogleContainerTools/kaniko/pull/2912)\n* chore(deps): bump cloud.google.com/go/storage from 1.35.1 to 1.36.0 [#2913](https://github.com/GoogleContainerTools/kaniko/pull/2913)\n* chore(deps): bump github.com/spf13/cobra from 1.7.0 to 1.8.0 [#2914](https://github.com/GoogleContainerTools/kaniko/pull/2914)\n* chore(deps): bump golang.org/x/crypto from 0.16.0 to 0.17.0 [#2915](https://github.com/GoogleContainerTools/kaniko/pull/2915)\n* fix: resolve integration test issue issue where container-diff cannot pull OCI images properly from registry [#2918](https://github.com/GoogleContainerTools/kaniko/pull/2918)\n* fix: also update github.com/awslabs/amazon-ecr-credential-helper to resolve issues with AWS ECR authentication (resolves #2882) [#2908](https://github.com/GoogleContainerTools/kaniko/pull/2908)\n\n\nHuge thank you for this release towards our contributors: \n- Aaron Prindle\n- dependabot[bot]\n- Patrick Decat\n\n\n# v1.19.1 Release 2023-12-15\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.19.1\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.19.1-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.19.1-slim\n```\n\n* Reproducing and Fixing #2892 [#2893](https://github.com/GoogleContainerTools/kaniko/pull/2893)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.15.3 to 1.15.7 [#2897](https://github.com/GoogleContainerTools/kaniko/pull/2897)\n* chore(deps): bump google-github-actions/setup-gcloud from 1.1.1 to 2.0.0 [#2902](https://github.com/GoogleContainerTools/kaniko/pull/2902)\n* chore(deps): bump actions/setup-go from 4.1.0 to 5.0.0 [#2901](https://github.com/GoogleContainerTools/kaniko/pull/2901)\n* chore(deps): bump github.com/containerd/containerd from 1.7.10 to 1.7.11 [#2899](https://github.com/GoogleContainerTools/kaniko/pull/2899)\n* chore(deps): bump github.com/go-git/go-git/v5 from 5.10.1 to 5.11.0 [#2898](https://github.com/GoogleContainerTools/kaniko/pull/2898)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.23.5 to 1.24.0 [#2896](https://github.com/GoogleContainerTools/kaniko/pull/2896)\n* chore(deps): bump github.com/containerd/containerd from 1.7.9 to 1.7.10 [#2888](https://github.com/GoogleContainerTools/kaniko/pull/2888)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.25.8 to 1.25.11 [#2889](https://github.com/GoogleContainerTools/kaniko/pull/2889)\n* chore(deps): bump google-github-actions/auth from 1.2.0 to 2.0.0 [#2886](https://github.com/GoogleContainerTools/kaniko/pull/2886)\n* chore(deps): bump github.com/go-git/go-git/v5 from 5.10.0 to 5.10.1 [#2890](https://github.com/GoogleContainerTools/kaniko/pull/2890)\n* fix: resolve aws-sdk-go-v2 lib compat issues causing ECR failures [#2885](https://github.com/GoogleContainerTools/kaniko/pull/2885)\n* chore(deps): bump github.com/spf13/afero from 1.10.0 to 1.11.0 [#2891](https://github.com/GoogleContainerTools/kaniko/pull/2891)\n\n\nHuge thank you for this release towards our contributors: \n- Aaron Prindle\n- dependabot[bot]\n- Maxime BOSSARD\n\n\n# v1.19.0 Release 2023-11-29\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.19.0\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.19.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.19.0-slim\n```\n\n* fix: resolve issue with copy_multistage_test.go and broken ioutil import [#2879](https://github.com/GoogleContainerTools/kaniko/pull/2879)\n* Fix warmer memory leak. [#2763](https://github.com/GoogleContainerTools/kaniko/pull/2763)\n* Skip the /kaniko directory when copying root [#2863](https://github.com/GoogleContainerTools/kaniko/pull/2863)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.25.5 to 1.25.8 [#2875](https://github.com/GoogleContainerTools/kaniko/pull/2875)\n* fix: Remove references to deprecated io/ioutil pkg [#2867](https://github.com/GoogleContainerTools/kaniko/pull/2867)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.14.0 to 1.14.3 [#2874](https://github.com/GoogleContainerTools/kaniko/pull/2874)\n* Create intermediate directories in COPY with correct uid and gid [#2795](https://github.com/GoogleContainerTools/kaniko/pull/2795)\n* chore(deps): bump google-github-actions/auth from 1.1.1 to 1.2.0 [#2868](https://github.com/GoogleContainerTools/kaniko/pull/2868)\n* chore(deps): bump golang.org/x/oauth2 from 0.13.0 to 0.14.0 [#2871](https://github.com/GoogleContainerTools/kaniko/pull/2871)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.43.0 to 1.44.0 [#2872](https://github.com/GoogleContainerTools/kaniko/pull/2872)\n* chore(deps): bump github.com/containerd/containerd from 1.7.8 to 1.7.9 [#2873](https://github.com/GoogleContainerTools/kaniko/pull/2873)\n* impl: add a retry with result function (#2837) [#2853](https://github.com/GoogleContainerTools/kaniko/pull/2853)\n* chore(deps): bump docker/build-push-action from 5.0.0 to 5.1.0 [#2857](https://github.com/GoogleContainerTools/kaniko/pull/2857)\n* chore(deps): bump golang.org/x/net from 0.17.0 to 0.18.0 [#2859](https://github.com/GoogleContainerTools/kaniko/pull/2859)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.13.1 to 1.14.0 [#2861](https://github.com/GoogleContainerTools/kaniko/pull/2861)\n* chore(deps): bump google.golang.org/api from 0.150.0 to 0.151.0 [#2862](https://github.com/GoogleContainerTools/kaniko/pull/2862)\n* fix: makefile container-diff on darwin [#2842](https://github.com/GoogleContainerTools/kaniko/pull/2842)\n* Print error to stderr instead of stdout before exiting [#2823](https://github.com/GoogleContainerTools/kaniko/pull/2823)\n* refactor: rm bool param detectFilesystem in `InitIgnoreList` [#2843](https://github.com/GoogleContainerTools/kaniko/pull/2843)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.22.0 to 1.24.0 [#2851](https://github.com/GoogleContainerTools/kaniko/pull/2851)\n* chore(deps): bump google.golang.org/api from 0.149.0 to 0.150.0 [#2845](https://github.com/GoogleContainerTools/kaniko/pull/2845)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.22.1 to 1.22.2 [#2846](https://github.com/GoogleContainerTools/kaniko/pull/2846)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.42.0 to 1.42.1 [#2847](https://github.com/GoogleContainerTools/kaniko/pull/2847)\n* chore(deps): bump golang.org/x/sys from 0.13.0 to 0.14.0 [#2848](https://github.com/GoogleContainerTools/kaniko/pull/2848)\n* chore(deps): bump sigstore/cosign-installer from 3.1.2 to 3.2.0 [#2849](https://github.com/GoogleContainerTools/kaniko/pull/2849)\n* feat: support https URLs for digest-file [#2811](https://github.com/GoogleContainerTools/kaniko/pull/2811)\n* impl: add a retry with result function [#2837](https://github.com/GoogleContainerTools/kaniko/pull/2837)\n\n\nHuge thank you for this release towards our contributors: \n- Aaron Prindle\n- Adrià Garriga-Alonso\n- Anna Levenberg\n- Anoop S\n- dependabot[bot]\n- JeromeJu\n- Lio李歐\n- Manish Giri\n- Maxime BOSSARD\n- tal66\n\n\n# v1.18.0 Release 2023-11-07\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.18.0\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.18.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.18.0-slim\n```\n\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.92 to 1.13.1 [#2829](https://github.com/GoogleContainerTools/kaniko/pull/2829)\n* chore(deps): bump google.golang.org/api from 0.148.0 to 0.149.0 [#2831](https://github.com/GoogleContainerTools/kaniko/pull/2831)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.40.2 to 1.42.0 [#2828](https://github.com/GoogleContainerTools/kaniko/pull/2828)\n* chore(deps): bump golang.org/x/sync from 0.4.0 to 0.5.0 [#2827](https://github.com/GoogleContainerTools/kaniko/pull/2827)\n* fix: fix COPY command error due to missing but ignored files [#2812](https://github.com/GoogleContainerTools/kaniko/pull/2812)\n* snapshotter: use syncfs system call [#2816](https://github.com/GoogleContainerTools/kaniko/pull/2816)\n* Fix missing slash [#2658](https://github.com/GoogleContainerTools/kaniko/pull/2658)\n* chore(deps): bump github.com/containerd/containerd from 1.7.7 to 1.7.8 [#2819](https://github.com/GoogleContainerTools/kaniko/pull/2819)\n* chore(deps): bump github.com/go-git/go-git/v5 from 5.9.0 to 5.10.0 [#2818](https://github.com/GoogleContainerTools/kaniko/pull/2818)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.91 to 1.11.92 [#2814](https://github.com/GoogleContainerTools/kaniko/pull/2814)\n* chore(deps): bump google.golang.org/api from 0.145.0 to 0.148.0 [#2810](https://github.com/GoogleContainerTools/kaniko/pull/2810)\n\n\nHuge thank you for this release towards our contributors: \n- dependabot[bot]\n- Paolo Di Tommaso\n- Quan Zhang\n- zhouhaibing089\n\n\n# v1.17.0 Release 2023-10-18\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.17.0\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.17.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.17.0-slim\n```\n\n* docs: fix readme sample typo [#2792](https://github.com/GoogleContainerTools/kaniko/pull/2792)\n* fix: remove log line from listpullreqs.go and additional release.sh fixes [#2790](https://github.com/GoogleContainerTools/kaniko/pull/2790)\n* chore(deps): bump golang.org/x/sync from 0.3.0 to 0.4.0 [#2798](https://github.com/GoogleContainerTools/kaniko/pull/2798)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.87 to 1.11.91 [#2805](https://github.com/GoogleContainerTools/kaniko/pull/2805)\n* chore(deps): bump github.com/containerd/containerd from 1.7.6 to 1.7.7 [#2797](https://github.com/GoogleContainerTools/kaniko/pull/2797)\n* chore(deps): bump github.com/google/go-cmp from 0.5.9 to 0.6.0 [#2796](https://github.com/GoogleContainerTools/kaniko/pull/2796)\n* chore(deps): bump golang.org/x/net from 0.16.0 to 0.17.0 [#2791](https://github.com/GoogleContainerTools/kaniko/pull/2791)\n* fix: resolve issue with integration tests where lack of disk space caused k3s issues [#2804](https://github.com/GoogleContainerTools/kaniko/pull/2804)\n* test: add test cases and docString for regex in COPY command [#2773](https://github.com/GoogleContainerTools/kaniko/pull/2773)\n* feat: add automated way of cutting releases w/ generation of CHANGELOG.md {{PULL_REQUESTS}} Makefile changes [#2786](https://github.com/GoogleContainerTools/kaniko/pull/2786)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.40.0 to 1.40.1 [#2780](https://github.com/GoogleContainerTools/kaniko/pull/2780)\n* docs: Update designdoc.md with correct link to skaffold repository [#2775](https://github.com/GoogleContainerTools/kaniko/pull/2775)\n* chore(deps): bump google.golang.org/api from 0.143.0 to 0.145.0 [#2778](https://github.com/GoogleContainerTools/kaniko/pull/2778)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.42 to 1.18.44 [#2777](https://github.com/GoogleContainerTools/kaniko/pull/2777)\n* chore(deps): bump golang.org/x/oauth2 from 0.12.0 to 0.13.0 [#2781](https://github.com/GoogleContainerTools/kaniko/pull/2781)\n* refactor: Remove fallbackToUID bool option from Kaniko code [#2767](https://github.com/GoogleContainerTools/kaniko/pull/2767)\n* chore(deps): bump github.com/otiai10/copy from 1.12.0 to 1.14.0 [#2772](https://github.com/GoogleContainerTools/kaniko/pull/2772)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.86 to 1.11.87 [#2770](https://github.com/GoogleContainerTools/kaniko/pull/2770)\n* chore(deps): bump google.golang.org/api from 0.142.0 to 0.143.0 [#2769](https://github.com/GoogleContainerTools/kaniko/pull/2769)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.39.0 to 1.40.0 [#2771](https://github.com/GoogleContainerTools/kaniko/pull/2771)\n* chore(deps): bump github.com/spf13/afero from 1.9.5 to 1.10.0 [#2758](https://github.com/GoogleContainerTools/kaniko/pull/2758)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.83 to 1.11.86 [#2757](https://github.com/GoogleContainerTools/kaniko/pull/2757)\n* chore(deps): bump google.golang.org/api from 0.141.0 to 0.142.0 [#2756](https://github.com/GoogleContainerTools/kaniko/pull/2756)\n\n\nHuge thank you for this release towards our contributors: \n- Aaron Prindle\n- dependabot[bot]\n- JeromeJu\n- Vishal Khot\n- vivekkoya\n- zhangzhiqiangcs\n\n\n# v1.16.0 Release 2023-09-22\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.16.0\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.16.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.16.0-slim\n```\n\n* fix: make it so release.sh script doesn't output duplicate change PRs [#2735](https://github.com/GoogleContainerTools/kaniko/pull/2735)\n* chore: update function names to be correct and representative of functionality [#2720](https://github.com/GoogleContainerTools/kaniko/pull/2720)\n* chore(deps): bump github.com/go-git/go-git/v5 from 5.8.1 to 5.9.0 [#2749](https://github.com/GoogleContainerTools/kaniko/pull/2749)\n* chore(deps): bump google.golang.org/api from 0.140.0 to 0.141.0 [#2748](https://github.com/GoogleContainerTools/kaniko/pull/2748)\n* chore(deps): bump github.com/containerd/containerd from 1.7.5 to 1.7.6 [#2750](https://github.com/GoogleContainerTools/kaniko/pull/2750)\n* fix: ensure images layers correspond with the image media type [#2719](https://github.com/GoogleContainerTools/kaniko/pull/2719)\n* chore(deps): bump github.com/google/slowjam from 1.0.1 to 1.1.0 [#2745](https://github.com/GoogleContainerTools/kaniko/pull/2745)\n* chore(deps): bump docker/setup-buildx-action from 2.10.0 to 3.0.0 [#2743](https://github.com/GoogleContainerTools/kaniko/pull/2743)\n* chore(deps): bump github.com/go-git/go-billy/v5 from 5.4.1 to 5.5.0 [#2746](https://github.com/GoogleContainerTools/kaniko/pull/2746)\n* chore(deps): bump google.golang.org/api from 0.138.0 to 0.140.0 [#2747](https://github.com/GoogleContainerTools/kaniko/pull/2747)\n* chore(deps): bump docker/setup-qemu-action from 2.2.0 to 3.0.0 [#2744](https://github.com/GoogleContainerTools/kaniko/pull/2744)\n* chore(deps): bump docker/build-push-action from 4.2.1 to 5.0.0 [#2742](https://github.com/GoogleContainerTools/kaniko/pull/2742)\n* chore(deps): bump google.golang.org/api from 0.138.0 to 0.139.0 [#2741](https://github.com/GoogleContainerTools/kaniko/pull/2741)\n* chore(deps): bump cloud.google.com/go/storage from 1.32.0 to 1.33.0 [#2740](https://github.com/GoogleContainerTools/kaniko/pull/2740)\n* chore(deps): bump docker/build-push-action from 4.1.1 to 4.2.1 [#2739](https://github.com/GoogleContainerTools/kaniko/pull/2739)\n* chore(deps): bump golang.org/x/oauth2 from 0.11.0 to 0.12.0 [#2732](https://github.com/GoogleContainerTools/kaniko/pull/2732)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.81 to 1.11.83 [#2733](https://github.com/GoogleContainerTools/kaniko/pull/2733)\n* chore(deps): bump golang.org/x/net from 0.14.0 to 0.15.0 [#2734](https://github.com/GoogleContainerTools/kaniko/pull/2734)\n* chore(deps): bump github.com/containerd/containerd from 1.7.3 to 1.7.5 [#2723](https://github.com/GoogleContainerTools/kaniko/pull/2723)\n* chore(deps): bump sigstore/cosign-installer from 3.1.1 to 3.1.2 [#2727](https://github.com/GoogleContainerTools/kaniko/pull/2727)\n* chore(deps): bump docker/setup-buildx-action from 2.9.1 to 2.10.0 [#2726](https://github.com/GoogleContainerTools/kaniko/pull/2726)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.37 to 1.18.38 [#2724](https://github.com/GoogleContainerTools/kaniko/pull/2724)\n* chore(deps): bump golang.org/x/sys from 0.11.0 to 0.12.0 [#2722](https://github.com/GoogleContainerTools/kaniko/pull/2722)\n* chore: unnecessary use of fmt.Sprintf [#2717](https://github.com/GoogleContainerTools/kaniko/pull/2717)\n* fix function name on comment [#2707](https://github.com/GoogleContainerTools/kaniko/pull/2707)\n* Avoid returning the UID when resolving the GIDs. [#2689](https://github.com/GoogleContainerTools/kaniko/pull/2689)\n\nHuge thank you for this release towards our contributors: \n- Aaron Prindle\n- dependabot[bot]\n- Diego Gonzalez\n- geekvest\n- guangwu\n- Logan Price\n\n\n# v1.15.0 Release 2023-08-29\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.15.0\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.15.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.15.0-slim\n```\n\n* Ensure New Layers Match Image Media Type [#2700](https://github.com/GoogleContainerTools/kaniko/pull/2700)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.79 to 1.11.81 [#2702](https://github.com/GoogleContainerTools/kaniko/pull/2702)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.38.4 to 1.38.5 [#2706](https://github.com/GoogleContainerTools/kaniko/pull/2706)\n* chore(deps): bump google.golang.org/api from 0.136.0 to 0.138.0 [#2704](https://github.com/GoogleContainerTools/kaniko/pull/2704)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.20.3 to 1.21.0 [#2703](https://github.com/GoogleContainerTools/kaniko/pull/2703)\n* docs: fix --use-new-run typo [#2698](https://github.com/GoogleContainerTools/kaniko/pull/2698)\n* docs: add more information regarding --use-new-run [#2687](https://github.com/GoogleContainerTools/kaniko/pull/2687)\n* chore(deps): bump cloud.google.com/go/storage from 1.31.0 to 1.32.0 [#2692](https://github.com/GoogleContainerTools/kaniko/pull/2692)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.77 to 1.11.79 [#2690](https://github.com/GoogleContainerTools/kaniko/pull/2690)\n* Fix: Change condition for the behaviour when --no-push=true without setting --destinations [#2676](https://github.com/GoogleContainerTools/kaniko/pull/2676)\n\nHuge thank you for this release towards our contributors: \n- Aaron Prindle\n- dependabot[bot]\n- JeromeJu\n- Logan Price\n\n\n# v1.14.0 Release 2023-08-15\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.14.0\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.14.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.14.0-slim\n```\n\n* chore(deps): bump actions/setup-go from 4.0.1 to 4.1.0 [#2672](https://github.com/GoogleContainerTools/kaniko/pull/2672)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.29 to 1.18.31 [#2651](https://github.com/GoogleContainerTools/kaniko/pull/2651)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.31 to 1.18.33 [#2680](https://github.com/GoogleContainerTools/kaniko/pull/2680)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.73 to 1.11.75 [#2650](https://github.com/GoogleContainerTools/kaniko/pull/2650)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.75 to 1.11.77 [#2679](https://github.com/GoogleContainerTools/kaniko/pull/2679)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.37.0 to 1.37.1 [#2648](https://github.com/GoogleContainerTools/kaniko/pull/2648)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.38.0 to 1.38.2 [#2673](https://github.com/GoogleContainerTools/kaniko/pull/2673)\n* chore(deps): bump github.com/containerd/containerd from 1.7.2 to 1.7.3 [#2644](https://github.com/GoogleContainerTools/kaniko/pull/2644)\n* chore(deps): bump github.com/go-git/go-git/v5 from 5.8.0 to 5.8.1 [#2662](https://github.com/GoogleContainerTools/kaniko/pull/2662)\n* chore(deps): bump golang from 1.20 to 1.21 in /deploy [#2682](https://github.com/GoogleContainerTools/kaniko/pull/2682)\n* chore(deps): bump golang.org/x/net from 0.12.0 to 0.14.0 [#2663](https://github.com/GoogleContainerTools/kaniko/pull/2663)\n* chore(deps): bump golang.org/x/oauth2 from 0.10.0 to 0.11.0 [#2661](https://github.com/GoogleContainerTools/kaniko/pull/2661)\n* chore(deps): bump golang.org/x/sys from 0.10.0 to 0.11.0 [#2659](https://github.com/GoogleContainerTools/kaniko/pull/2659)\n* chore(deps): bump google.golang.org/api from 0.133.0 to 0.134.0 [#2645](https://github.com/GoogleContainerTools/kaniko/pull/2645)\n* chore(deps): bump google.golang.org/api from 0.134.0 to 0.136.0 [#2681](https://github.com/GoogleContainerTools/kaniko/pull/2681)\n* docs: add enforcement section to code-of-conduct.md [#2654](https://github.com/GoogleContainerTools/kaniko/pull/2654)\n* feat: added skip-push-permission flag [#2657](https://github.com/GoogleContainerTools/kaniko/pull/2657)\n* fix: resolve issue where CI env was failing due to dependency change [#2668](https://github.com/GoogleContainerTools/kaniko/pull/2668)\n* refactor: Avoid redundant calls to filepath.Clean [#2652](https://github.com/GoogleContainerTools/kaniko/pull/2652)\n\nHuge thank you for this release towards our contributors:\n- Aaron Lehmann\n- Aaron Prindle\n- dependabot[bot]\n- Julian\n\n\n# v1.13.0 Release 2023-07-26\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.13.0\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.13.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.13.0-slim\n```\n\n\n* chore(deps): bump cloud.google.com/go/storage from 1.30.1 to 1.31.0 [#2611](https://github.com/GoogleContainerTools/kaniko/pull/2611)\n* chore(deps): bump docker/setup-buildx-action from 2.7.0 to 2.8.0 [#2606](https://github.com/GoogleContainerTools/kaniko/pull/2606)\n* chore(deps): bump docker/setup-buildx-action from 2.8.0 to 2.9.1 [#2626](https://github.com/GoogleContainerTools/kaniko/pull/2626)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.18.1 to 1.19.0 [#2623](https://github.com/GoogleContainerTools/kaniko/pull/2623)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.28 to 1.18.29 [#2638](https://github.com/GoogleContainerTools/kaniko/pull/2638)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.70 to 1.11.71 [#2610](https://github.com/GoogleContainerTools/kaniko/pull/2610)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.71 to 1.11.72 [#2624](https://github.com/GoogleContainerTools/kaniko/pull/2624)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.72 to 1.11.73 [#2639](https://github.com/GoogleContainerTools/kaniko/pull/2639)\n* chore(deps): bump github.com/go-git/go-git/v5 from 5.7.0 to 5.8.0 [#2633](https://github.com/GoogleContainerTools/kaniko/pull/2633)\n* chore(deps): bump golang.org/x/oauth2 from 0.9.0 to 0.10.0 [#2617](https://github.com/GoogleContainerTools/kaniko/pull/2617)\n* chore(deps): bump golang.org/x/sys from 0.9.0 to 0.10.0 [#2613](https://github.com/GoogleContainerTools/kaniko/pull/2613)\n* chore(deps): bump google.golang.org/api from 0.128.0 to 0.129.0 [#2609](https://github.com/GoogleContainerTools/kaniko/pull/2609)\n* chore(deps): bump google.golang.org/api from 0.129.0 to 0.131.0 [#2625](https://github.com/GoogleContainerTools/kaniko/pull/2625)\n* chore(deps): bump google.golang.org/api from 0.131.0 to 0.132.0 [#2634](https://github.com/GoogleContainerTools/kaniko/pull/2634)\n* chore(deps): bump google.golang.org/api from 0.132.0 to 0.133.0 [#2636](https://github.com/GoogleContainerTools/kaniko/pull/2636)\n* chore(deps): bump sigstore/cosign-installer from 3.1.0 to 3.1.1 [#2607](https://github.com/GoogleContainerTools/kaniko/pull/2607)\n* feat: Allows to disable the fallback to the default registry on image pull [#2637](https://github.com/GoogleContainerTools/kaniko/pull/2637)\n\nHuge thank you for this release towards our contributors: \n- dependabot[bot]\n- Fernando Giannetti\n\n\n# v1.12.1 Release 2023-06-29\n\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.12.1\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.12.1-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.12.1-slim\n```\n\nThe warmer images are available at:\n```\ngcr.io/kaniko-project/warmer:v1.12.1\ngcr.io/kaniko-project/warmer:latest\n```\n\nFixes:\n* fix: resolve issue where warmer CLI always validated optional arg -> breakage for majority of users [#2603](https://github.com/GoogleContainerTools/kaniko/pull/2603)\n\n\n# v1.12.0 Release 2023-06-28\n\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.12.0\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.12.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.12.0-slim\n```\n\n* chore: add debug line to RedoHasher [#2591](https://github.com/GoogleContainerTools/kaniko/pull/2591)\n* chore(deps): bump docker/build-push-action from 4.0.0 to 4.1.0 [#2557](https://github.com/GoogleContainerTools/kaniko/pull/2557)\n* chore(deps): bump docker/build-push-action from 4.1.0 to 4.1.1 [#2580](https://github.com/GoogleContainerTools/kaniko/pull/2580)\n* chore(deps): bump docker/setup-buildx-action from 2.5.0 to 2.6.0 [#2555](https://github.com/GoogleContainerTools/kaniko/pull/2555)\n* chore(deps): bump docker/setup-buildx-action from 2.6.0 to 2.7.0 [#2579](https://github.com/GoogleContainerTools/kaniko/pull/2579)\n* chore(deps): bump docker/setup-qemu-action from 2.1.0 to 2.2.0 [#2556](https://github.com/GoogleContainerTools/kaniko/pull/2556)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.25 to 1.18.27 [#2581](https://github.com/GoogleContainerTools/kaniko/pull/2581)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.67 to 1.11.70 [#2597](https://github.com/GoogleContainerTools/kaniko/pull/2597)\n* chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.33.1 to 1.35.0 [#2582](https://github.com/GoogleContainerTools/kaniko/pull/2582)\n* chore(deps): bump github.com/otiai10/copy from 1.11.0 to 1.12.0 [#2598](https://github.com/GoogleContainerTools/kaniko/pull/2598)\n* chore(deps): bump golang.org/x/oauth2 from 0.8.0 to 0.9.0 [#2578](https://github.com/GoogleContainerTools/kaniko/pull/2578)\n* chore(deps): bump golang.org/x/sync from 0.2.0 to 0.3.0 [#2573](https://github.com/GoogleContainerTools/kaniko/pull/2573)\n* chore(deps): bump golang.org/x/sys from 0.8.0 to 0.9.0 [#2564](https://github.com/GoogleContainerTools/kaniko/pull/2564)\n* chore(deps): bump google.golang.org/api from 0.125.0 to 0\n* chore(deps): bump google.golang.org/api from 0.126.0 to 0.127.0 [#2565](https://github.com/GoogleContainerTools/kaniko/pull/2565)\n* chore(deps): bump google.golang.org/api from 0.127.0 to 0.128.0 [#2596](https://github.com/GoogleContainerTools/kaniko/pull/2596)\n* chore(deps): bump sigstore/cosign-installer from 3.0.5 to 3.1.0 [#2595](https://github.com/GoogleContainerTools/kaniko/pull/2595)\n* Don't write whiteout files to directories that were replaced with files or links [#2590](https://github.com/GoogleContainerTools/kaniko/pull/2590)\n* feat: cache dockerfile images through warmer [#2499](https://github.com/GoogleContainerTools/kaniko/pull/2499)\n* Fix fs_util tests failing on systems with /tmp mountpoint [#2583](https://github.com/GoogleContainerTools/kaniko/pull/2583)\n* Fix multistage caching with COPY --from [#2559](https://github.com/GoogleContainerTools/kaniko/pull/2559)\n* fix: hack/boilerplate.sh: fix error handling and use python3 [#2587](https://github.com/GoogleContainerTools/kaniko/pull/2587)\n* fix: hack/install_golint.sh: allow installation on linux/arm64 [#2585](https://github.com/GoogleContainerTools/kaniko/pull/2585)\n* fix: install tools using go.mod for versioning [#2562](https://github.com/GoogleContainerTools/kaniko/pull/2562)\n* fix: Refactors IsSrcRemoteFileURL to only validate the URL is valid [#2563](https://github.com/GoogleContainerTools/kaniko/pull/2563)\n* fix: update cache-ttl help text to be correct regarding unit of duration [#2568](https://github.com/GoogleContainerTools/kaniko/pull/2568)\n* fix: valdiateFlags typo fixed [#2554](https://github.com/GoogleContainerTools/kaniko/pull/2554)\n\nHuge thank you for this release towards our contributors: \n- Aaron Prindle\n- alexezio\n- Andreas Fleig\n- Angus Williams\n- dependabot[bot]\n- Kraev Sergei\n- Liam Newman\n- Zigelboim Misha\n\n\n# v1.11.0 Release 2023-06-08\n\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.11.0\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.11.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.11.0-slim\n```\n\n* chore: run go mod tidy [#2532](https://github.com/GoogleContainerTools/kaniko/pull/2532)\n* chore(deps): bump actions/setup-go from 3.2.0 to 4.0.1 [#2517](https://github.com/GoogleContainerTools/kaniko/pull/2517)\n* chore(deps): bump cloud.google.com/go/storage from 1.29.0 to 1.30.1 [#2439](https://github.com/GoogleContainerTools/kaniko/pull/2439)\n* chore(deps): bump docker/setup-buildx-action from 2.0.0 to 2.5.0 [#2519](https://github.com/GoogleContainerTools/kaniko/pull/2519)\n* chore(deps): bump github.com/containerd/containerd from 1.7.0 to 1.7.1 [#2534](https://github.com/GoogleContainerTools/kaniko/pull/2534)\n* chore(deps): bump github.com/containerd/containerd from 1.7.1 to 1.7.2 [#2542](https://github.com/GoogleContainerTools/kaniko/pull/2542)\n* chore(deps): bump github.com/go-git/go-git/v5 from 5.4.2 to 5.7.0 [#2528](https://github.com/GoogleContainerTools/kaniko/pull/2528)\n* chore(deps): bump github.com/google/go-containerregistry from 0.15.1 to 0.15.2 [#2546](https://github.com/GoogleContainerTools/kaniko/pull/2546)\n* chore(deps): bump github.com/moby/buildkit from 0.11.4 to 0.11.6 [#2520](https://github.com/GoogleContainerTools/kaniko/pull/2520)\n* chore(deps): bump github.com/sirupsen/logrus from 1.9.2 to 1.9.3 [#2545](https://github.com/GoogleContainerTools/kaniko/pull/2545)\n* chore(deps): bump google.golang.org/api from 0.121.0 to 0.124.0 [#2535](https://github.com/GoogleContainerTools/kaniko/pull/2535)\n* chore(deps): bump google.golang.org/api from 0.124.0 to 0.125.0 [#2544](https://github.com/GoogleContainerTools/kaniko/pull/2544)\n* chore(deps): bump sigstore/cosign-installer from 3.0.3 to 3.0.5 [#2518](https://github.com/GoogleContainerTools/kaniko/pull/2518)\n* chore(deps): update docker-credential-* binaries in kaniko images [#2531](https://github.com/GoogleContainerTools/kaniko/pull/2531)\n* chore(deps): Update google-github-actions/setup-gcloud to v1.1.1 [#2548](https://github.com/GoogleContainerTools/kaniko/pull/2548)\n* chore(deps): use aws-sdk-go-v2 [#2550](https://github.com/GoogleContainerTools/kaniko/pull/2550)\n* docs: Add guide on creating multi-arch manifests [#2306](https://github.com/GoogleContainerTools/kaniko/pull/2306)\n* docs: update changelog to correct old release tags [#2536](https://github.com/GoogleContainerTools/kaniko/pull/2536)\n* fix: Deduplicate paths while saving files for later use [#2504](https://github.com/GoogleContainerTools/kaniko/pull/2504)\n* fix: Download docker-credential-gcr from release artifacts [#2540](https://github.com/GoogleContainerTools/kaniko/pull/2540)\n* refactor: Use a multistage image to remove all redundancies on Dockerfiles [#2547](https://github.com/GoogleContainerTools/kaniko/pull/2547)\n* test: only build for linux/amd64 on PRs [#2460](https://github.com/GoogleContainerTools/kaniko/pull/2460)\n\nHuge thank you for this release towards our contributors: \n- Aaron Prindle\n- Bob Du\n- dependabot[bot]\n- Fedor V\n- Ferran Vidal\n- Jason Hall\n- Jasper Ben Orschulko\n\n\n# v1.10.0 Release 2023-05-24\n\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.10.0\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.10.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.10.0-slim\n```\n\n* chore(deps): bump github.com/sirupsen/logrus from 1.9.0 to 1.9.2 [#2522](https://github.com/GoogleContainerTools/kaniko/pull/2522)\n* chore(deps): bump github.com/otiai10/copy from 1.7.0 to 1.11.0 [#2523](https://github.com/GoogleContainerTools/kaniko/pull/2523)\n* Add mTLS (client cert) registry authentication [#2180](https://github.com/GoogleContainerTools/kaniko/pull/2180)\n* chore: Revert \"chore(deps): bump google-github-actions/setup-gcloud from 0.5.1 to 1.1.1 (#2502)\" [#2524](https://github.com/GoogleContainerTools/kaniko/pull/2524)\n* Light editing to scripts in hack/gofmt [#2236](https://github.com/GoogleContainerTools/kaniko/pull/2236)\n* chore(deps): bump golang from 1.19 to 1.20 in /deploy [#2388](https://github.com/GoogleContainerTools/kaniko/pull/2388)\n* chore(deps): bump imjasonh/setup-crane from 0.1 to 0.3 [#2401](https://github.com/GoogleContainerTools/kaniko/pull/2401)\n* chore(deps): bump golang.org/x/sync from 0.1.0 to 0.2.0 [#2497](https://github.com/GoogleContainerTools/kaniko/pull/2497)\n* fix: Correct deprecated flags in `README.md` [#2335](https://github.com/GoogleContainerTools/kaniko/pull/2335)\n* chore(deps): bump docker/setup-qemu-action from 1.2.0 to 2.1.0 [#2287](https://github.com/GoogleContainerTools/kaniko/pull/2287)\n* Delete scorecards-analysis.yml [#2510](https://github.com/GoogleContainerTools/kaniko/pull/2510)\n* chore(deps): bump docker/build-push-action from 3.2.0 to 4.0.0 [#2505](https://github.com/GoogleContainerTools/kaniko/pull/2505)\n* chore(deps): bump github.com/docker/distribution from 2.8.1+incompatible to 2.8.2+incompatible [#2503](https://github.com/GoogleContainerTools/kaniko/pull/2503)\n* chore(deps): bump ossf/scorecard-action from 1.1.1 to 2.1.3 [#2506](https://github.com/GoogleContainerTools/kaniko/pull/2506)\n* chore(deps): bump golang.org/x/sys from 0.7.0 to 0.8.0 [#2507](https://github.com/GoogleContainerTools/kaniko/pull/2507)\n* chore(deps): bump github.com/google/go-containerregistry from 0.14.0 to 0.15.1 [#2508](https://github.com/GoogleContainerTools/kaniko/pull/2508)\n* chore(deps): bump github.com/google/slowjam from 1.0.0 to 1.0.1 [#2498](https://github.com/GoogleContainerTools/kaniko/pull/2498)\n* chore(deps): bump google-github-actions/setup-gcloud from 0.5.1 to 1.1.1 [#2502](https://github.com/GoogleContainerTools/kaniko/pull/2502)\n* chore: add .vscode/ dir to .gitignore [#2501](https://github.com/GoogleContainerTools/kaniko/pull/2501)\n* chore(deps): bump sigstore/cosign-installer from 3.0.1 to 3.0.3 [#2495](https://github.com/GoogleContainerTools/kaniko/pull/2495)\n* chore(deps): bump google.golang.org/api from 0.120.0 to 0.121.0 [#2496](https://github.com/GoogleContainerTools/kaniko/pull/2496)\n* chore(deps): bump github.com/spf13/afero from 1.9.2 to 1.9.5 [#2448](https://github.com/GoogleContainerTools/kaniko/pull/2448)\n* chore(deps): bump google.golang.org/api from 0.110.0 to 0.120.0 [#2484](https://github.com/GoogleContainerTools/kaniko/pull/2484)\n* chore(deps): bump github/codeql-action from 2.1.8 to 2.3.2 [#2487](https://github.com/GoogleContainerTools/kaniko/pull/2487)\n* chore(deps): bump github.com/docker/docker from 23.0.1+incompatible to 23.0.5+incompatible [#2489](https://github.com/GoogleContainerTools/kaniko/pull/2489)\n* chore(deps): bump github.com/aws/aws-sdk-go from 1.44.24 to 1.44.253 [#2490](https://github.com/GoogleContainerTools/kaniko/pull/2490)\n* fix: use debian buster to fix tests using no longer supported stretch which had broken apt-get urls [#2485](https://github.com/GoogleContainerTools/kaniko/pull/2485)\n* chore(deps): bump google.golang.org/protobuf from 1.29.0 to 1.29.1 [#2442](https://github.com/GoogleContainerTools/kaniko/pull/2442)\n* Use correct media type for zstd layers [#2459](https://github.com/GoogleContainerTools/kaniko/pull/2459)\n* Add support for zstd compression [#2313](https://github.com/GoogleContainerTools/kaniko/pull/2313)\n* chore(deps): bump github.com/opencontainers/runc from 1.1.4 to 1.1.5 [#2453](https://github.com/GoogleContainerTools/kaniko/pull/2453)\n\nHuge thank you for this release towards our contributors: \n- Aaron Prindle\n- Aaruni Aggarwal\n- Abirdcfly\n- Adrian Newby\n- almg80\n- Anbraten\n- Andreas Fleig\n- Andrei Kvapil\n- ankitm123\n- Aris Buzachis\n- Benjamin Krenn\n- Bernardo Marques\n- Bryan A. S\n- chenggui53\n- Chuang Wang\n- claudex\n- Dávid Szakállas\n- Dawei Ma\n- dependabot[bot]\n- Diego Gonzalez\n- dmr\n- ejose19\n- Eng Zer Jun\n- ePirat\n- Eric\n- Florian Apolloner\n- François JACQUES\n- Gabriel Nützi\n- Gilbert Gilb's\n- Guillaume Calmettes\n- Herman\n- Hingbong Lo\n- Igor Scheller\n- Ishant Mrinal Haloi\n- Jack\n- Jake Sanders\n- Janosch Maier\n- Jason D'Amour\n- Jason Hall\n- Jasper Ben Orschulko\n- Jerry Jones\n- jeunii\n- Joe Kimmel\n- Joël Pepper\n- Jonas Gröger\n- Jose Donizetti\n- Junwon Kwon\n- Kamal Nasser\n- Konstantin Demin\n- Kun Lu\n- Lars Seipel\n- Lavrenti Frobeen\n- Liwen Guo\n- Lukas\n- Mark Moretto\n- Matt Moore\n- Max Walther\n- Mikhail Vasin\n- Natalie Arellano\n- Naveen\n- nihilo\n- Oliver Gregorius\n- Pat Litke\n- Patrick Barker\n- priyawadhwa\n- Ramy\n- Rhianna\n- Sebastiaan Tammer\n- Shude Li\n- Sigurd Spieckermann\n- Silvano Cirujano Cuesta\n- Tejal Desai\n- Tony De La Nuez\n- Travis DePrato\n- Viacheslav Artamonov\n- Víctor\n- Wolfgang Walther\n- wwade\n- Yahav Itzhak\n- ygelfand\n- Yonatan Koren\n- zhouhaibing089\n\n# v1.9.2 Release 2023-03-27\n\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.9.2\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.9.2-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.9.2-slim\n```\n\n* fix(executor): make pax tar builds reproducible again [#2384](https://github.com/GoogleContainerTools/kaniko/pull/2384)\n* Upgrade docker [#2440](https://github.com/GoogleContainerTools/kaniko/pull/2440)\n* Update ACR credential helper to enable Azure Workload Identity [#2431](https://github.com/GoogleContainerTools/kaniko/pull/2431)\n* bump cosign version used to sign images [#2437](https://github.com/GoogleContainerTools/kaniko/pull/2437)\n* Fix Integration tests [#2425](https://github.com/GoogleContainerTools/kaniko/pull/2425)\n* chore(deps): bump golang from 1.17 to 1.19 in /deploy [#2328](https://github.com/GoogleContainerTools/kaniko/pull/2328)\n* chore: fix typo [#2316](https://github.com/GoogleContainerTools/kaniko/pull/2316)\n* ci: don't cache certs stage [#2296](https://github.com/GoogleContainerTools/kaniko/pull/2296)\n* fix(executor): make pax tar builds reproducible again [#2384](https://github.com/GoogleContainerTools/kaniko/pull/2384)\n* Upgrade docker [#2440](https://github.com/GoogleContainerTools/kaniko/pull/2440)\n* Update ACR credential helper to enable Azure Workload Identity [#2431](https://github.com/GoogleContainerTools/kaniko/pull/2431)\n* bump cosign version used to sign images [#2437](https://github.com/GoogleContainerTools/kaniko/pull/2437)\n* Fix Integration tests [#2425](https://github.com/GoogleContainerTools/kaniko/pull/2425)\n* chore(deps): bump golang from 1.17 to 1.19 in /deploy [#2328](https://github.com/GoogleContainerTools/kaniko/pull/2328)\n* chore: fix typo [#2316](https://github.com/GoogleContainerTools/kaniko/pull/2316)\n* ci: don't cache certs stage [#2296](https://github.com/GoogleContainerTools/kaniko/pull/2296)\n* chore: fix typo [#2289](https://github.com/GoogleContainerTools/kaniko/pull/2289)\n* fix(WORKDIR): use the config.User for the new dir permissions [#2269](https://github.com/GoogleContainerTools/kaniko/pull/2269)\n* Provide `--cache-repo` as OCI image layout path [#2250](https://github.com/GoogleContainerTools/kaniko/pull/2250)\nHuge thank you for this release towards our contributors: \n- Aaruni Aggarwal\n- Abirdcfly\n- Adrian Newby\n- almg80\n- Anbraten\n- Andreas Fleig\n- Andrei Kvapil\n- ankitm123\n- Aris Buzachis\n- Benjamin Krenn\n- Bernardo Marques\n- Bryan A. S\n- chenggui53\n- Chuang Wang\n- claudex\n- Dávid Szakállas\n- Dawei Ma\n- dependabot[bot]\n- Diego Gonzalez\n- dmr\n- ejose19\n- Eng Zer Jun\n- ePirat\n- Florian Apolloner\n- François JACQUES\n- Gabriel Nützi\n- Gilbert Gilb's\n- Guillaume Calmettes\n- Herman\n- Hingbong Lo\n- Igor Scheller\n- Ishant Mrinal Haloi\n- Jack\n- Jake Sanders\n- Janosch Maier\n- Jason D'Amour\n- Jason Hall\n- Jasper Ben Orschulko\n- Jerry Jones\n- jeunii\n- Joe Kimmel\n- Joël Pepper\n- Jonas Gröger\n- Jose Donizetti\n- Junwon Kwon\n- Kamal Nasser\n- Konstantin Demin\n- Kun Lu\n- Lars Seipel\n- Liwen Guo\n- Lukas\n- Matt Moore\n- Max Walther\n- Mikhail Vasin\n- Natalie Arellano\n- Naveen\n- nihilo\n- Oliver Gregorius\n- Pat Litke\n- Patrick Barker\n- priyawadhwa\n- Ramy\n- Rhianna\n- Sebastiaan Tammer\n- Shude Li\n- Sigurd Spieckermann\n- Silvano Cirujano Cuesta\n- Tejal Desai\n- Tony De La Nuez\n- Travis DePrato\n- Viacheslav Artamonov\n- Víctor\n- Wolfgang Walther\n- wwade\n- Yahav Itzhak\n- ygelfand\n- Yonatan Koren\n- zhouhaibing089\n\n# v1.9.1 Release 2022-09-26\n\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.9.1\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.9.1-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.9.1-slim\n```\n\n\n* (fix):Pass full URI path to `bucket.GetNameAndFilepathFromURI` [#2221](https://github.com/GoogleContainerTools/kaniko/pull/2221)\n* Add the ability to skip unpacking the initial file system [#2234](https://github.com/GoogleContainerTools/kaniko/pull/2234)\n* chore: remove duplicate word in comments [#2232](https://github.com/GoogleContainerTools/kaniko/pull/2232)\n* docs(CHANGELOG.md): fix link to issue #2040 [#2228](https://github.com/GoogleContainerTools/kaniko/pull/2228)\n* feat: disable cache-copy-layers in multistage builds; closes 2065 [#2227](https://github.com/GoogleContainerTools/kaniko/pull/2227)\n* bump cosign version so it can sign [#2224](https://github.com/GoogleContainerTools/kaniko/pull/2224)\n* fix(README.md): remove duplicate caching section [#2223](https://github.com/GoogleContainerTools/kaniko/pull/2223)\n* refactor: Make CLI argument names consistent [#2084](https://github.com/GoogleContainerTools/kaniko/pull/2084)\n* fix(KanikoDir): update DOCKER_CONFIG env when use custom kanikoDir [#2202](https://github.com/GoogleContainerTools/kaniko/pull/2202)\n* (fix):Pass full URI path to `bucket.GetNameAndFilepathFromURI` [#2221](https://github.com/GoogleContainerTools/kaniko/pull/2221)\n* Add the ability to skip unpacking the initial file system [#2234](https://github.com/GoogleContainerTools/kaniko/pull/2234)\n* chore: remove duplicate word in comments [#2232](https://github.com/GoogleContainerTools/kaniko/pull/2232)\n* docs(CHANGELOG.md): fix link to issue #2040 [#2228](https://github.com/GoogleContainerTools/kaniko/pull/2228)\n* feat: disable cache-copy-layers in multistage builds; closes 2065 [#2227](https://github.com/GoogleContainerTools/kaniko/pull/2227)\n* bump cosign version so it can sign [#2224](https://github.com/GoogleContainerTools/kaniko/pull/2224)\n* fix(README.md): remove duplicate caching section [#2223](https://github.com/GoogleContainerTools/kaniko/pull/2223)\n* refactor: Make CLI argument names consistent [#2084](https://github.com/GoogleContainerTools/kaniko/pull/2084)\n* fix(KanikoDir): update DOCKER_CONFIG env when use custom kanikoDir [#2202](https://github.com/GoogleContainerTools/kaniko/pull/2202)\nHuge thank you for this release towards our contributors: \n- Aaruni Aggarwal\n- Abirdcfly\n- Adrian Newby\n- almg80\n- Anbraten\n- Andreas Fleig\n- Andrei Kvapil\n- ankitm123\n- Benjamin Krenn\n- Bernardo Marques\n- Bryan A. S\n- chenggui53\n- Chuang Wang\n- claudex\n- Dávid Szakállas\n- Dawei Ma\n- dependabot[bot]\n- Diego Gonzalez\n- dmr\n- ejose19\n- Eng Zer Jun\n- ePirat\n- Florian Apolloner\n- François JACQUES\n- Gabriel Nützi\n- Gilbert Gilb's\n- Guillaume Calmettes\n- Herman\n- Hingbong Lo\n- Igor Scheller\n- Ishant Mrinal Haloi\n- Jack\n- Jake Sanders\n- Janosch Maier\n- Jason D'Amour\n- Jason Hall\n- Jasper Ben Orschulko\n- jeunii\n- Jonas Gröger\n- Jose Donizetti\n- Kamal Nasser\n- Konstantin Demin\n- Kun Lu\n- Lars Seipel\n- Liwen Guo\n- Lukas\n- Matt Moore\n- Max Walther\n- Mikhail Vasin\n- Natalie Arellano\n- Naveen\n- nihilo\n- Oliver Gregorius\n- Pat Litke\n- Patrick Barker\n- priyawadhwa\n- Ramy\n- Rhianna\n- Sebastiaan Tammer\n- Sigurd Spieckermann\n- Silvano Cirujano Cuesta\n- Tejal Desai\n- Tony De La Nuez\n- Travis DePrato\n- Víctor\n- Wolfgang Walther\n- wwade\n- Yahav Itzhak\n- ygelfand\n- Yonatan Koren\n- zhouhaibing089\n\n# v1.9.0 Release 2022-08-09\n\n## Highlights\n- Installed binaries are missing from image [#2049](https://github.com/GoogleContainerTools/kaniko/issues/2049)\n- proc: detect kubernetes runtime by mounts [#2054](https://github.com/GoogleContainerTools/kaniko/pull/2054)\n- Fixes #2046: make target stage lookup case insensitive [#2047](https://github.com/GoogleContainerTools/kaniko/pull/2047)\n- fix: Refactor LayersMap to correct old strange code behavior [#2066](https://github.com/GoogleContainerTools/kaniko/pull/2066)\n- Fix missing setuid flags on COPY --from=build operation [#2089](https://github.com/GoogleContainerTools/kaniko/pull/2089)\n- Fixes #2046: make target stage lookup case insensitive [#2047](https://github.com/GoogleContainerTools/kaniko/pull/2047)\n- Add GitLab CI credentials helper [#2040](https://github.com/GoogleContainerTools/kaniko/pull/2040)\n- and a number of dependency bumps\n\n\n\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.9.0\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.9.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.9.0-slim\n```\n\n* add cache option for run command [#2032](https://github.com/GoogleContainerTools/kaniko/pull/2032)\n* fix: kaniko dir env unused [#2067](https://github.com/GoogleContainerTools/kaniko/pull/2067)\n* fix: getUIDandGID is able to resolve non-existing users and groups [#2106](https://github.com/GoogleContainerTools/kaniko/pull/2106)\n* fix(Dockerfile): use temporary busybox mount to create /kaniko directory [#2155](https://github.com/GoogleContainerTools/kaniko/pull/2155)\n* Fix the /kaniko directory permissions in container [#2009](https://github.com/GoogleContainerTools/kaniko/pull/2009)\n* ci(setup-minikube): use cri-dockerd [#2149](https://github.com/GoogleContainerTools/kaniko/pull/2149)\n* CA certificates tasks in kaniko images [#2142](https://github.com/GoogleContainerTools/kaniko/pull/2142)\n* refactor: simpler local integration tests [#2110](https://github.com/GoogleContainerTools/kaniko/pull/2110)\n* fix: use refrence should after err handles [#2128](https://github.com/GoogleContainerTools/kaniko/pull/2128)\n* fix: Add test for issue #2049 [#2114](https://github.com/GoogleContainerTools/kaniko/pull/2114)\n* Bump ossf/scorecard-action from 1.0.4 to 1.1.1 [#2116](https://github.com/GoogleContainerTools/kaniko/pull/2116)\n* Bump github.com/aws/aws-sdk-go from 1.43.36 to 1.44.24 [#2111](https://github.com/GoogleContainerTools/kaniko/pull/2111)\n* Bump actions/setup-go from 3.0.0 to 3.2.0 [#2112](https://github.com/GoogleContainerTools/kaniko/pull/2112)\n* Write parent directories to tar before whiteout files [#2113](https://github.com/GoogleContainerTools/kaniko/pull/2113)\n* fix(ci): Docker build for issue 1837 [#2095](https://github.com/GoogleContainerTools/kaniko/pull/2095)\n* Update Azure credHelpers docs [#2109](https://github.com/GoogleContainerTools/kaniko/pull/2109)\n* Fix missing setuid flags on COPY --from=build operation [#2089](https://github.com/GoogleContainerTools/kaniko/pull/2089)\n* fix: `COPY --chown` regression tests [#2097](https://github.com/GoogleContainerTools/kaniko/pull/2097)\n* fix: Regression test for #2066 [#2096](https://github.com/GoogleContainerTools/kaniko/pull/2096)\n* fix: Refactor `LayersMap` to correct old strange code behavior [#2066](https://github.com/GoogleContainerTools/kaniko/pull/2066)\n* fix: Main [#2094](https://github.com/GoogleContainerTools/kaniko/pull/2094)\n* feat: add flag to disable pushing cache [#2038](https://github.com/GoogleContainerTools/kaniko/pull/2038)\n* hasher: hash security.capability attributes [#1994](https://github.com/GoogleContainerTools/kaniko/pull/1994)\n* Documentation: Clarify README.md blurb on `--cache-copy-layers` [#2064](https://github.com/GoogleContainerTools/kaniko/pull/2064)\n* Fix release tagging workflow [#2034](https://github.com/GoogleContainerTools/kaniko/pull/2034)\n* Bump docker/setup-buildx-action from 1.6.0 to 2 [#2081](https://github.com/GoogleContainerTools/kaniko/pull/2081)\n* Bump go-containerregistry dependency [#2076](https://github.com/GoogleContainerTools/kaniko/pull/2076)\n* Fix: Flatten layer function needs to return existing files in the layer correctly [#2057](https://github.com/GoogleContainerTools/kaniko/pull/2057)\n* fix: Remove hardcoded whiteout prefix [#2056](https://github.com/GoogleContainerTools/kaniko/pull/2056)\n* proc: detect kubernetes runtime by mounts [#2054](https://github.com/GoogleContainerTools/kaniko/pull/2054)\n* Fixes #2046: make target stage lookup case insensitive [#2047](https://github.com/GoogleContainerTools/kaniko/pull/2047)\n* Add GitLab CI credentials helper [#2040](https://github.com/GoogleContainerTools/kaniko/pull/2040)\n* Bump sigstore/cosign-installer from b4f55743d10d066fee1de1cf0fa26069700c0195 to 2.2.0 [#2044](https://github.com/GoogleContainerTools/kaniko/pull/2044)\n* Bump github/codeql-action from 2.1.6 to 2.1.8 [#2043](https://github.com/GoogleContainerTools/kaniko/pull/2043)\n* Bump github.com/aws/aws-sdk-go from 1.43.31 to 1.43.36 [#2042](https://github.com/GoogleContainerTools/kaniko/pull/2042)\n* Bump cloud.google.com/go/storage from 1.21.0 to 1.22.0 [#2041](https://github.com/GoogleContainerTools/kaniko/pull/2041)\n* add cache option for run command [#2032](https://github.com/GoogleContainerTools/kaniko/pull/2032)\n* fix: kaniko dir env unused [#2067](https://github.com/GoogleContainerTools/kaniko/pull/2067)\n* fix: getUIDandGID is able to resolve non-existing users and groups [#2106](https://github.com/GoogleContainerTools/kaniko/pull/2106)\n* fix(Dockerfile): use temporary busybox mount to create /kaniko directory [#2155](https://github.com/GoogleContainerTools/kaniko/pull/2155)\n* Fix the /kaniko directory permissions in container [#2009](https://github.com/GoogleContainerTools/kaniko/pull/2009)\n* ci(setup-minikube): use cri-dockerd [#2149](https://github.com/GoogleContainerTools/kaniko/pull/2149)\n* CA certificates tasks in kaniko images [#2142](https://github.com/GoogleContainerTools/kaniko/pull/2142)\n* refactor: simpler local integration tests [#2110](https://github.com/GoogleContainerTools/kaniko/pull/2110)\n* fix: use refrence should after err handles [#2128](https://github.com/GoogleContainerTools/kaniko/pull/2128)\n* fix: Add test for issue #2049 [#2114](https://github.com/GoogleContainerTools/kaniko/pull/2114)\n* Bump ossf/scorecard-action from 1.0.4 to 1.1.1 [#2116](https://github.com/GoogleContainerTools/kaniko/pull/2116)\n* Bump github.com/aws/aws-sdk-go from 1.43.36 to 1.44.24 [#2111](https://github.com/GoogleContainerTools/kaniko/pull/2111)\n* Bump actions/setup-go from 3.0.0 to 3.2.0 [#2112](https://github.com/GoogleContainerTools/kaniko/pull/2112)\n* Write parent directories to tar before whiteout files [#2113](https://github.com/GoogleContainerTools/kaniko/pull/2113)\n* fix(ci): Docker build for issue 1837 [#2095](https://github.com/GoogleContainerTools/kaniko/pull/2095)\n* Update Azure credHelpers docs [#2109](https://github.com/GoogleContainerTools/kaniko/pull/2109)\n* Fix missing setuid flags on COPY --from=build operation [#2089](https://github.com/GoogleContainerTools/kaniko/pull/2089)\n* fix: `COPY --chown` regression tests [#2097](https://github.com/GoogleContainerTools/kaniko/pull/2097)\n* fix: Regression test for #2066 [#2096](https://github.com/GoogleContainerTools/kaniko/pull/2096)\n* fix: Refactor `LayersMap` to correct old strange code behavior [#2066](https://github.com/GoogleContainerTools/kaniko/pull/2066)\n* fix: Main [#2094](https://github.com/GoogleContainerTools/kaniko/pull/2094)\n* feat: add flag to disable pushing cache [#2038](https://github.com/GoogleContainerTools/kaniko/pull/2038)\n* hasher: hash security.capability attributes [#1994](https://github.com/GoogleContainerTools/kaniko/pull/1994)\n* Documentation: Clarify README.md blurb on `--cache-copy-layers` [#2064](https://github.com/GoogleContainerTools/kaniko/pull/2064)\n* Fix release tagging workflow [#2034](https://github.com/GoogleContainerTools/kaniko/pull/2034)\n* Bump docker/setup-buildx-action from 1.6.0 to 2 [#2081](https://github.com/GoogleContainerTools/kaniko/pull/2081)\n* Bump go-containerregistry dependency [#2076](https://github.com/GoogleContainerTools/kaniko/pull/2076)\n* Fix: Flatten layer function needs to return existing files in the layer correctly [#2057](https://github.com/GoogleContainerTools/kaniko/pull/2057)\n* fix: Remove hardcoded whiteout prefix [#2056](https://github.com/GoogleContainerTools/kaniko/pull/2056)\n* proc: detect kubernetes runtime by mounts [#2054](https://github.com/GoogleContainerTools/kaniko/pull/2054)\n* Fixes #2046: make target stage lookup case insensitive [#2047](https://github.com/GoogleContainerTools/kaniko/pull/2047)\n* Add GitLab CI credentials helper [#2040](https://github.com/GoogleContainerTools/kaniko/pull/2040)\n* Bump sigstore/cosign-installer from b4f55743d10d066fee1de1cf0fa26069700c0195 to 2.2.0 [#2044](https://github.com/GoogleContainerTools/kaniko/pull/2044)\n* Bump github/codeql-action from 2.1.6 to 2.1.8 [#2043](https://github.com/GoogleContainerTools/kaniko/pull/2043)\n* Bump github.com/aws/aws-sdk-go from 1.43.31 to 1.43.36 [#2042](https://github.com/GoogleContainerTools/kaniko/pull/2042)\n* Bump cloud.google.com/go/storage from 1.21.0 to 1.22.0 [#2041](https://github.com/GoogleContainerTools/kaniko/pull/2041)\nHuge thank you for this release towards our contributors: \n- Aaruni Aggarwal\n- Adrian Newby\n- Anbraten\n- Andreas Fleig\n- Andrei Kvapil\n- ankitm123\n- Benjamin Krenn\n- Bernardo Marques\n- Chuang Wang\n- claudex\n- Dávid Szakállas\n- Dawei Ma\n- dependabot[bot]\n- Diego Gonzalez\n- ejose19\n- Eng Zer Jun\n- ePirat\n- Florian Apolloner\n- François JACQUES\n- Gabriel Nützi\n- Gilbert Gilb's\n- Guillaume Calmettes\n- Herman\n- Hingbong Lo\n- Igor Scheller\n- Ishant Mrinal Haloi\n- Jack\n- Jake Sanders\n- Janosch Maier\n- Jason D'Amour\n- Jason Hall\n- Jasper Ben Orschulko\n- jeunii\n- Jose Donizetti\n- Kamal Nasser\n- Konstantin Demin\n- Kun Lu\n- Lars Seipel\n- Liwen Guo\n- Lukas\n- Matt Moore\n- Max Walther\n- Mikhail Vasin\n- Naveen\n- nihilo\n- Oliver Gregorius\n- Pat Litke\n- Patrick Barker\n- priyawadhwa\n- Ramy\n- Rhianna\n- Sebastiaan Tammer\n- Sigurd Spieckermann\n- Silvano Cirujano Cuesta\n- Tejal Desai\n- Tony De La Nuez\n- Travis DePrato\n- Víctor\n- Wolfgang Walther\n- wwade\n- Yahav Itzhak\n- ygelfand\n- Yonatan Koren\n- zhouhaibing089\n\n# v1.8.1 Release 2022-04-01\nThis is Apr's 2022 release.\n\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.8.1\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.8.1-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.8.1-slim\n```\n\n* Use canonical platform values. Fix 1995. [#2025](https://github.com/GoogleContainerTools/kaniko/pull/2025)\n* feat: kaniko dir config option [#1997](https://github.com/GoogleContainerTools/kaniko/pull/1997)\n* Bump github.com/aws/aws-sdk-go from 1.43.17 to 1.43.26 [#2018](https://github.com/GoogleContainerTools/kaniko/pull/2018)\n* Bump github.com/containerd/containerd from 1.6.1 to 1.6.2 [#2017](https://github.com/GoogleContainerTools/kaniko/pull/2017)\n* Bump github.com/docker/docker from 20.10.13+incompatible to 20.10.14+incompatible [#2016](https://github.com/GoogleContainerTools/kaniko/pull/2016)\n* README.md: Update docs on building for AWS ECR [#2020](https://github.com/GoogleContainerTools/kaniko/pull/2020)\n* Move and fix GetContainerRuntime check from bpfd proc [#1996](https://github.com/GoogleContainerTools/kaniko/pull/1996)\n* Fix minor glitch in the SVG logos [#2004](https://github.com/GoogleContainerTools/kaniko/pull/2004)\n* Add SVG logos [#2002](https://github.com/GoogleContainerTools/kaniko/pull/2002)\n* Bump github/codeql-action from 1.1.3 to 1.1.5 [#2000](https://github.com/GoogleContainerTools/kaniko/pull/2000)\n* Fix - Incomplete regular expression for hostnames [#1993](https://github.com/GoogleContainerTools/kaniko/pull/1993)\n* Bump github.com/spf13/cobra from 1.3.0 to 1.4.0 [#1985](https://github.com/GoogleContainerTools/kaniko/pull/1985)\n* Bump github.com/aws/aws-sdk-go from 1.43.12 to 1.43.17 [#1986](https://github.com/GoogleContainerTools/kaniko/pull/1986)\n* Bump github.com/spf13/afero from 1.8.1 to 1.8.2 [#1987](https://github.com/GoogleContainerTools/kaniko/pull/1987)\n* Bump github.com/docker/docker from 20.10.12+incompatible to 20.10.13+incompatible [#1988](https://github.com/GoogleContainerTools/kaniko/pull/1988)\n* Fix image tags in release workflow [#1977](https://github.com/GoogleContainerTools/kaniko/pull/1977)\n* Use canonical platform values. Fix 1995. [#2025](https://github.com/GoogleContainerTools/kaniko/pull/2025)\n* feat: kaniko dir config option [#1997](https://github.com/GoogleContainerTools/kaniko/pull/1997)\n* Bump github.com/aws/aws-sdk-go from 1.43.17 to 1.43.26 [#2018](https://github.com/GoogleContainerTools/kaniko/pull/2018)\n* Bump github.com/containerd/containerd from 1.6.1 to 1.6.2 [#2017](https://github.com/GoogleContainerTools/kaniko/pull/2017)\n* Bump github.com/docker/docker from 20.10.13+incompatible to 20.10.14+incompatible [#2016](https://github.com/GoogleContainerTools/kaniko/pull/2016)\n* README.md: Update docs on building for AWS ECR [#2020](https://github.com/GoogleContainerTools/kaniko/pull/2020)\n* Move and fix GetContainerRuntime check from bpfd proc [#1996](https://github.com/GoogleContainerTools/kaniko/pull/1996)\n* Fix minor glitch in the SVG logos [#2004](https://github.com/GoogleContainerTools/kaniko/pull/2004)\n* Add SVG logos [#2002](https://github.com/GoogleContainerTools/kaniko/pull/2002)\n* Bump github/codeql-action from 1.1.3 to 1.1.5 [#2000](https://github.com/GoogleContainerTools/kaniko/pull/2000)\n* Fix - Incomplete regular expression for hostnames [#1993](https://github.com/GoogleContainerTools/kaniko/pull/1993)\n* Bump github.com/spf13/cobra from 1.3.0 to 1.4.0 [#1985](https://github.com/GoogleContainerTools/kaniko/pull/1985)\n* Bump github.com/aws/aws-sdk-go from 1.43.12 to 1.43.17 [#1986](https://github.com/GoogleContainerTools/kaniko/pull/1986)\n* Bump github.com/spf13/afero from 1.8.1 to 1.8.2 [#1987](https://github.com/GoogleContainerTools/kaniko/pull/1987)\n* Bump github.com/docker/docker from 20.10.12+incompatible to 20.10.13+incompatible [#1988](https://github.com/GoogleContainerTools/kaniko/pull/1988)\n* Fix image tags in release workflow [#1977](https://github.com/GoogleContainerTools/kaniko/pull/1977)\nHuge thank you for this release towards our contributors:\n- Aaruni Aggarwal\n- Adrian Newby\n- Anbraten\n- Andrei Kvapil\n- ankitm123\n- Benjamin Krenn\n- Bernardo Marques\n- Chuang Wang\n- Dávid Szakállas\n- Dawei Ma\n- dependabot[bot]\n- Diego Gonzalez\n- ejose19\n- Eng Zer Jun\n- Florian Apolloner\n- François JACQUES\n- Gabriel Nützi\n- Gilbert Gilb's\n- Guillaume Calmettes\n- Herman\n- Igor Scheller\n- Jack\n- Jake Sanders\n- Janosch Maier\n- Jason Hall\n- Jasper Ben Orschulko\n- jeunii\n- Jose Donizetti\n- Kamal Nasser\n- Kun Lu\n- Lars Seipel\n- Liwen Guo\n- Matt Moore\n- Max Walther\n- Mikhail Vasin\n- Naveen\n- nihilo\n- Oliver Gregorius\n- Pat Litke\n- Patrick Barker\n- priyawadhwa\n- Rhianna\n- Sebastiaan Tammer\n- Sigurd Spieckermann\n- Silvano Cirujano Cuesta\n- Tejal Desai\n- Travis DePrato\n- Wolfgang Walther\n- wwade\n- Yahav Itzhak\n- ygelfand\n\n\n# v1.8.0 Release 2022-03-08\nThis is Mar's 2022 release.\n\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.8.0\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.8.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.8.0-slim\n```\n\n* Update dependabot settings to get updates for docker [#1969](https://github.com/GoogleContainerTools/kaniko/pull/1969)\n* Bump actions/setup-go from 2.2.0 to 3 [#1970](https://github.com/GoogleContainerTools/kaniko/pull/1970)\n* Bump google-github-actions/setup-gcloud from 0.5.0 to 0.5.1 [#1950](https://github.com/GoogleContainerTools/kaniko/pull/1950)\n* Pinned GitHub actions by SHA [#1963](https://github.com/GoogleContainerTools/kaniko/pull/1963)\n* Bump actions/upload-artifact from 2.3.1 to 3 [#1968](https://github.com/GoogleContainerTools/kaniko/pull/1968)\n* Bump actions/checkout from 2 to 3 [#1967](https://github.com/GoogleContainerTools/kaniko/pull/1967)\n* Bump github.com/aws/aws-sdk-go from 1.42.52 to 1.43.12 [#1966](https://github.com/GoogleContainerTools/kaniko/pull/1966)\n* Bump github.com/containerd/containerd from 1.6.0 to 1.6.1 [#1961](https://github.com/GoogleContainerTools/kaniko/pull/1961)\n* Fix bug with log disabling [#1959](https://github.com/GoogleContainerTools/kaniko/pull/1959)\n* Bump github/codeql-action from 1.1.2 to 1.1.3 [#1958](https://github.com/GoogleContainerTools/kaniko/pull/1958)\n* Bump github.com/aws/aws-sdk-go from 1.42.52 to 1.43.7 [#1957](https://github.com/GoogleContainerTools/kaniko/pull/1957)\n* Removed --whitelist-var-run normalization as this breaks functionality [#1956](https://github.com/GoogleContainerTools/kaniko/pull/1956)\n* Bump github.com/containerd/containerd from 1.5.9 to 1.6.0 [#1948](https://github.com/GoogleContainerTools/kaniko/pull/1948)\n* Bump cloud.google.com/go/storage from 1.20.0 to 1.21.0 [#1947](https://github.com/GoogleContainerTools/kaniko/pull/1947)\n* Bump github/codeql-action from 1.1.0 to 1.1.2 [#1951](https://github.com/GoogleContainerTools/kaniko/pull/1951)\n* Bump ossf/scorecard-action from 1.0.3 to 1.0.4 [#1952](https://github.com/GoogleContainerTools/kaniko/pull/1952)\n* Bump ecr-login dep to avoid some log spam [#1946](https://github.com/GoogleContainerTools/kaniko/pull/1946)\n* readme: Fix formatting for `--image-fs-extract-retry` [#1942](https://github.com/GoogleContainerTools/kaniko/pull/1942)\n* Pick up per-repository auth changes from go-containerregistry [#1939](https://github.com/GoogleContainerTools/kaniko/pull/1939)\n* Bump github.com/aws/aws-sdk-go from 1.42.47 to 1.42.52 [#1937](https://github.com/GoogleContainerTools/kaniko/pull/1937)\n* Bump github/codeql-action from 1.0.31 to 1.1.0 [#1938](https://github.com/GoogleContainerTools/kaniko/pull/1938)\n* Set DOCKER_BUILDKIT=1 in make images [#1906](https://github.com/GoogleContainerTools/kaniko/pull/1906)\n* Fix resolving arguments over multi-stage build [#1928](https://github.com/GoogleContainerTools/kaniko/pull/1928)\n* Correctly handle platforms that include CPU variants [#1929](https://github.com/GoogleContainerTools/kaniko/pull/1929)\n* Restore build args after optimize. Fixes #1910, #1912. [#1915](https://github.com/GoogleContainerTools/kaniko/pull/1915)\n* test: use `T.TempDir` to create temporary test directory [#1918](https://github.com/GoogleContainerTools/kaniko/pull/1918)\n* Bump github.com/spf13/afero from 1.8.0 to 1.8.1 [#1922](https://github.com/GoogleContainerTools/kaniko/pull/1922)\n* Bump github.com/aws/aws-sdk-go from 1.42.44 to 1.42.47 [#1923](https://github.com/GoogleContainerTools/kaniko/pull/1923)\n* Bump cloud.google.com/go/storage from 1.19.0 to 1.20.0 [#1924](https://github.com/GoogleContainerTools/kaniko/pull/1924)\n* Bump ossf/scorecard-action from 1.0.2 to 1.0.3 [#1926](https://github.com/GoogleContainerTools/kaniko/pull/1926)\n* Bump google-github-actions/setup-gcloud from 0.4.0 to 0.5.0 [#1925](https://github.com/GoogleContainerTools/kaniko/pull/1925)\n* Bump github/codeql-action from 1.0.30 to 1.0.31 [#1927](https://github.com/GoogleContainerTools/kaniko/pull/1927)\n* Vagrantfile should install and configure go (see #1913) [#1914](https://github.com/GoogleContainerTools/kaniko/pull/1914)\n* adding ppc64le support for executor and warmer image [#1908](https://github.com/GoogleContainerTools/kaniko/pull/1908)\n* Remove deploy/cloudbuild-*.yaml files [#1907](https://github.com/GoogleContainerTools/kaniko/pull/1907)\n* Bump go-containerregistry to pick up ACR fix [#1898](https://github.com/GoogleContainerTools/kaniko/pull/1898)\n* Bump cloud.google.com/go/storage from 1.18.2 to 1.19.0 [#1903](https://github.com/GoogleContainerTools/kaniko/pull/1903)\n* Bump github.com/aws/aws-sdk-go from 1.42.38 to 1.42.44 [#1902](https://github.com/GoogleContainerTools/kaniko/pull/1902)\n* Bump ossf/scorecard-action from 5da1b6b2680a229f2e66131f5c6a692bcd80b246 to 1.0.2 [#1899](https://github.com/GoogleContainerTools/kaniko/pull/1899)\n* Bump google-github-actions/setup-gcloud from 0.3.0 to 0.4.0 [#1900](https://github.com/GoogleContainerTools/kaniko/pull/1900)\n* Bump github/codeql-action from 1.0.26 to 1.0.30 [#1901](https://github.com/GoogleContainerTools/kaniko/pull/1901)\n* Enable dependabot for Go and GitHub Actions dependencies [#1884](https://github.com/GoogleContainerTools/kaniko/pull/1884)\n* Update readme [#1897](https://github.com/GoogleContainerTools/kaniko/pull/1897)\n* Remove k8schain, directly depend on cred helpers [#1891](https://github.com/GoogleContainerTools/kaniko/pull/1891)\n* Update golang.org/x/oauth2/google [#1890](https://github.com/GoogleContainerTools/kaniko/pull/1890)\n* Bump dependencies [#1885](https://github.com/GoogleContainerTools/kaniko/pull/1885)\n* Fix broken anchor link [#1804](https://github.com/GoogleContainerTools/kaniko/pull/1804)\n* Bump github.com/docker/docker to latest release [#1866](https://github.com/GoogleContainerTools/kaniko/pull/1866)\n* Run GitHub Actions on pushes and PRs to main, not master [#1883](https://github.com/GoogleContainerTools/kaniko/pull/1883)\n* Add KANIKO_REGISTRY_MIRROR env var [#1875](https://github.com/GoogleContainerTools/kaniko/pull/1875)\n* Bump AWS ecr-login cred helper to v0.5.0 [#1880](https://github.com/GoogleContainerTools/kaniko/pull/1880)\n* Pin to more recent version of scorecard [#1878](https://github.com/GoogleContainerTools/kaniko/pull/1878)\n* Add ossf/scorecard Github Action to kaniko [#1874](https://github.com/GoogleContainerTools/kaniko/pull/1874)\n* Attempt to fix erroneous build cancellation [#1867](https://github.com/GoogleContainerTools/kaniko/pull/1867)\n* Add s390x support to docker images [#1749](https://github.com/GoogleContainerTools/kaniko/pull/1749)\n* fix: ARG/ENV used in script does not invalidate build cache (#1688) [#1693](https://github.com/GoogleContainerTools/kaniko/pull/1693)\n* fix: change the name of the acr cred helper [#1865](https://github.com/GoogleContainerTools/kaniko/pull/1865)\n* Fix implicit GCR auth [#1856](https://github.com/GoogleContainerTools/kaniko/pull/1856)\n* Log full image ref by digest when pushing an image [#1857](https://github.com/GoogleContainerTools/kaniko/pull/1857)\n* Remove GitHub Actions concurrency limits [#1858](https://github.com/GoogleContainerTools/kaniko/pull/1858)\n* tar: read directly from stdin [#1728](https://github.com/GoogleContainerTools/kaniko/pull/1728)\n* Fix regression: can fetch branches and tags references without specifying commit hashes for private git repository used as context [#1823](https://github.com/GoogleContainerTools/kaniko/pull/1823)\n* Use pax tar format [#1809](https://github.com/GoogleContainerTools/kaniko/pull/1809)\n* Fix calculating path for copying ownership [#1859](https://github.com/GoogleContainerTools/kaniko/pull/1859)\n* Fix copying ownership [#1725](https://github.com/GoogleContainerTools/kaniko/pull/1725)\n* Fix typo [#1825](https://github.com/GoogleContainerTools/kaniko/pull/1825)\n* Fix possible nil pointer derefence in fs_util.go [#1813](https://github.com/GoogleContainerTools/kaniko/pull/1813)\n* include auth for FetchOptions [#1796](https://github.com/GoogleContainerTools/kaniko/pull/1796)\n* Update readme insecure flags [#1811](https://github.com/GoogleContainerTools/kaniko/pull/1811)\n* Add documentation on pushing to ACR [#1831](https://github.com/GoogleContainerTools/kaniko/pull/1831)\n* Fixes #1837 : keep file capabilities on archival [#1838](https://github.com/GoogleContainerTools/kaniko/pull/1838)\n* Use setup-gcloud@v0.3.0 instead of @master [#1854](https://github.com/GoogleContainerTools/kaniko/pull/1854)\n* Collapse integration test workflows into one config [#1855](https://github.com/GoogleContainerTools/kaniko/pull/1855)\n* Share the Go build cache when building in Dockerfiles [#1853](https://github.com/GoogleContainerTools/kaniko/pull/1853)\n* Call cosign sign --key [#1849](https://github.com/GoogleContainerTools/kaniko/pull/1849)\n* Consolidate PR and real release workflows [#1845](https://github.com/GoogleContainerTools/kaniko/pull/1845)\n* Use golang:1.17 and build from reproducible source [#1848](https://github.com/GoogleContainerTools/kaniko/pull/1848)\n* Start keyless signing kaniko releases [#1841](https://github.com/GoogleContainerTools/kaniko/pull/1841)\n* Attempt to speed up PR image builds by sharing a cache [#1844](https://github.com/GoogleContainerTools/kaniko/pull/1844)\n* Sign digests not tags. [#1840](https://github.com/GoogleContainerTools/kaniko/pull/1840)\n* Fix the e2e K8s test [#1842](https://github.com/GoogleContainerTools/kaniko/pull/1842)\n* Bump the cosign version (a lot) [#1839](https://github.com/GoogleContainerTools/kaniko/pull/1839)\n* Revert \"Support mirror registries with path component (#1707)\" [#1794](https://github.com/GoogleContainerTools/kaniko/pull/1794)\n* Fix syntax error in release.yaml [#1800](https://github.com/GoogleContainerTools/kaniko/pull/1800)\n* Update dependabot settings to get updates for docker [#1969](https://github.com/GoogleContainerTools/kaniko/pull/1969)\n* Bump actions/setup-go from 2.2.0 to 3 [#1970](https://github.com/GoogleContainerTools/kaniko/pull/1970)\n* Bump google-github-actions/setup-gcloud from 0.5.0 to 0.5.1 [#1950](https://github.com/GoogleContainerTools/kaniko/pull/1950)\n* Pinned GitHub actions by SHA [#1963](https://github.com/GoogleContainerTools/kaniko/pull/1963)\n* Bump actions/upload-artifact from 2.3.1 to 3 [#1968](https://github.com/GoogleContainerTools/kaniko/pull/1968)\n* Bump actions/checkout from 2 to 3 [#1967](https://github.com/GoogleContainerTools/kaniko/pull/1967)\n* Bump github.com/aws/aws-sdk-go from 1.42.52 to 1.43.12 [#1966](https://github.com/GoogleContainerTools/kaniko/pull/1966)\n* Bump github.com/containerd/containerd from 1.6.0 to 1.6.1 [#1961](https://github.com/GoogleContainerTools/kaniko/pull/1961)\n* Fix bug with log disabling [#1959](https://github.com/GoogleContainerTools/kaniko/pull/1959)\n* Bump github/codeql-action from 1.1.2 to 1.1.3 [#1958](https://github.com/GoogleContainerTools/kaniko/pull/1958)\n* Bump github.com/aws/aws-sdk-go from 1.42.52 to 1.43.7 [#1957](https://github.com/GoogleContainerTools/kaniko/pull/1957)\n* Removed --whitelist-var-run normalization as this breaks functionality [#1956](https://github.com/GoogleContainerTools/kaniko/pull/1956)\n* Bump github.com/containerd/containerd from 1.5.9 to 1.6.0 [#1948](https://github.com/GoogleContainerTools/kaniko/pull/1948)\n* Bump cloud.google.com/go/storage from 1.20.0 to 1.21.0 [#1947](https://github.com/GoogleContainerTools/kaniko/pull/1947)\n* Bump github/codeql-action from 1.1.0 to 1.1.2 [#1951](https://github.com/GoogleContainerTools/kaniko/pull/1951)\n* Bump ossf/scorecard-action from 1.0.3 to 1.0.4 [#1952](https://github.com/GoogleContainerTools/kaniko/pull/1952)\n* Bump ecr-login dep to avoid some log spam [#1946](https://github.com/GoogleContainerTools/kaniko/pull/1946)\n* readme: Fix formatting for `--image-fs-extract-retry` [#1942](https://github.com/GoogleContainerTools/kaniko/pull/1942)\n* Pick up per-repository auth changes from go-containerregistry [#1939](https://github.com/GoogleContainerTools/kaniko/pull/1939)\n* Bump github.com/aws/aws-sdk-go from 1.42.47 to 1.42.52 [#1937](https://github.com/GoogleContainerTools/kaniko/pull/1937)\n* Bump github/codeql-action from 1.0.31 to 1.1.0 [#1938](https://github.com/GoogleContainerTools/kaniko/pull/1938)\n* Set DOCKER_BUILDKIT=1 in make images [#1906](https://github.com/GoogleContainerTools/kaniko/pull/1906)\n* Fix resolving arguments over multi-stage build [#1928](https://github.com/GoogleContainerTools/kaniko/pull/1928)\n* Correctly handle platforms that include CPU variants [#1929](https://github.com/GoogleContainerTools/kaniko/pull/1929)\n* Restore build args after optimize. Fixes #1910, #1912. [#1915](https://github.com/GoogleContainerTools/kaniko/pull/1915)\n* test: use `T.TempDir` to create temporary test directory [#1918](https://github.com/GoogleContainerTools/kaniko/pull/1918)\n* Bump github.com/spf13/afero from 1.8.0 to 1.8.1 [#1922](https://github.com/GoogleContainerTools/kaniko/pull/1922)\n* Bump github.com/aws/aws-sdk-go from 1.42.44 to 1.42.47 [#1923](https://github.com/GoogleContainerTools/kaniko/pull/1923)\n* Bump cloud.google.com/go/storage from 1.19.0 to 1.20.0 [#1924](https://github.com/GoogleContainerTools/kaniko/pull/1924)\n* Bump ossf/scorecard-action from 1.0.2 to 1.0.3 [#1926](https://github.com/GoogleContainerTools/kaniko/pull/1926)\n* Bump google-github-actions/setup-gcloud from 0.4.0 to 0.5.0 [#1925](https://github.com/GoogleContainerTools/kaniko/pull/1925)\n* Bump github/codeql-action from 1.0.30 to 1.0.31 [#1927](https://github.com/GoogleContainerTools/kaniko/pull/1927)\n* Vagrantfile should install and configure go (see #1913) [#1914](https://github.com/GoogleContainerTools/kaniko/pull/1914)\n* adding ppc64le support for executor and warmer image [#1908](https://github.com/GoogleContainerTools/kaniko/pull/1908)\n* Remove deploy/cloudbuild-*.yaml files [#1907](https://github.com/GoogleContainerTools/kaniko/pull/1907)\n* Bump go-containerregistry to pick up ACR fix [#1898](https://github.com/GoogleContainerTools/kaniko/pull/1898)\n* Bump cloud.google.com/go/storage from 1.18.2 to 1.19.0 [#1903](https://github.com/GoogleContainerTools/kaniko/pull/1903)\n* Bump github.com/aws/aws-sdk-go from 1.42.38 to 1.42.44 [#1902](https://github.com/GoogleContainerTools/kaniko/pull/1902)\n* Bump ossf/scorecard-action from 5da1b6b2680a229f2e66131f5c6a692bcd80b246 to 1.0.2 [#1899](https://github.com/GoogleContainerTools/kaniko/pull/1899)\n* Bump google-github-actions/setup-gcloud from 0.3.0 to 0.4.0 [#1900](https://github.com/GoogleContainerTools/kaniko/pull/1900)\n* Bump github/codeql-action from 1.0.26 to 1.0.30 [#1901](https://github.com/GoogleContainerTools/kaniko/pull/1901)\n* Enable dependabot for Go and GitHub Actions dependencies [#1884](https://github.com/GoogleContainerTools/kaniko/pull/1884)\n* Update readme [#1897](https://github.com/GoogleContainerTools/kaniko/pull/1897)\n* Remove k8schain, directly depend on cred helpers [#1891](https://github.com/GoogleContainerTools/kaniko/pull/1891)\n* Update golang.org/x/oauth2/google [#1890](https://github.com/GoogleContainerTools/kaniko/pull/1890)\n* Bump dependencies [#1885](https://github.com/GoogleContainerTools/kaniko/pull/1885)\n* Fix broken anchor link [#1804](https://github.com/GoogleContainerTools/kaniko/pull/1804)\n* Bump github.com/docker/docker to latest release [#1866](https://github.com/GoogleContainerTools/kaniko/pull/1866)\n* Run GitHub Actions on pushes and PRs to main, not master [#1883](https://github.com/GoogleContainerTools/kaniko/pull/1883)\n* Add KANIKO_REGISTRY_MIRROR env var [#1875](https://github.com/GoogleContainerTools/kaniko/pull/1875)\n* Bump AWS ecr-login cred helper to v0.5.0 [#1880](https://github.com/GoogleContainerTools/kaniko/pull/1880)\n* Pin to more recent version of scorecard [#1878](https://github.com/GoogleContainerTools/kaniko/pull/1878)\n* Add ossf/scorecard Github Action to kaniko [#1874](https://github.com/GoogleContainerTools/kaniko/pull/1874)\n* Attempt to fix erroneous build cancellation [#1867](https://github.com/GoogleContainerTools/kaniko/pull/1867)\n* Add s390x support to docker images [#1749](https://github.com/GoogleContainerTools/kaniko/pull/1749)\n* fix: ARG/ENV used in script does not invalidate build cache (#1688) [#1693](https://github.com/GoogleContainerTools/kaniko/pull/1693)\n* fix: change the name of the acr cred helper [#1865](https://github.com/GoogleContainerTools/kaniko/pull/1865)\n* Fix implicit GCR auth [#1856](https://github.com/GoogleContainerTools/kaniko/pull/1856)\n* Log full image ref by digest when pushing an image [#1857](https://github.com/GoogleContainerTools/kaniko/pull/1857)\n* Remove GitHub Actions concurrency limits [#1858](https://github.com/GoogleContainerTools/kaniko/pull/1858)\n* tar: read directly from stdin [#1728](https://github.com/GoogleContainerTools/kaniko/pull/1728)\n* Fix regression: can fetch branches and tags references without specifying commit hashes for private git repository used as context [#1823](https://github.com/GoogleContainerTools/kaniko/pull/1823)\n* Use pax tar format [#1809](https://github.com/GoogleContainerTools/kaniko/pull/1809)\n* Fix calculating path for copying ownership [#1859](https://github.com/GoogleContainerTools/kaniko/pull/1859)\n* Fix copying ownership [#1725](https://github.com/GoogleContainerTools/kaniko/pull/1725)\n* Fix typo [#1825](https://github.com/GoogleContainerTools/kaniko/pull/1825)\n* Fix possible nil pointer derefence in fs_util.go [#1813](https://github.com/GoogleContainerTools/kaniko/pull/1813)\n* include auth for FetchOptions [#1796](https://github.com/GoogleContainerTools/kaniko/pull/1796)\n* Update readme insecure flags [#1811](https://github.com/GoogleContainerTools/kaniko/pull/1811)\n* Add documentation on pushing to ACR [#1831](https://github.com/GoogleContainerTools/kaniko/pull/1831)\n* Fixes #1837 : keep file capabilities on archival [#1838](https://github.com/GoogleContainerTools/kaniko/pull/1838)\n* Use setup-gcloud@v0.3.0 instead of @master [#1854](https://github.com/GoogleContainerTools/kaniko/pull/1854)\n* Collapse integration test workflows into one config [#1855](https://github.com/GoogleContainerTools/kaniko/pull/1855)\n* Share the Go build cache when building in Dockerfiles [#1853](https://github.com/GoogleContainerTools/kaniko/pull/1853)\n* Call cosign sign --key [#1849](https://github.com/GoogleContainerTools/kaniko/pull/1849)\n* Consolidate PR and real release workflows [#1845](https://github.com/GoogleContainerTools/kaniko/pull/1845)\n* Use golang:1.17 and build from reproducible source [#1848](https://github.com/GoogleContainerTools/kaniko/pull/1848)\n* Start keyless signing kaniko releases [#1841](https://github.com/GoogleContainerTools/kaniko/pull/1841)\n* Attempt to speed up PR image builds by sharing a cache [#1844](https://github.com/GoogleContainerTools/kaniko/pull/1844)\n* Sign digests not tags. [#1840](https://github.com/GoogleContainerTools/kaniko/pull/1840)\n* Fix the e2e K8s test [#1842](https://github.com/GoogleContainerTools/kaniko/pull/1842)\n* Bump the cosign version (a lot) [#1839](https://github.com/GoogleContainerTools/kaniko/pull/1839)\n* Revert \"Support mirror registries with path component (#1707)\" [#1794](https://github.com/GoogleContainerTools/kaniko/pull/1794)\n* Fix syntax error in release.yaml [#1800](https://github.com/GoogleContainerTools/kaniko/pull/1800)\nHuge thank you for this release towards our contributors:\n- Aaruni Aggarwal\n- Adrian Newby\n- Anbraten\n- Andrei Kvapil\n- ankitm123\n- Benjamin Krenn\n- Bernardo Marques\n- Dávid Szakállas\n- Dawei Ma\n- dependabot[bot]\n- ejose19\n- Eng Zer Jun\n- Florian Apolloner\n- François JACQUES\n- Gabriel Nützi\n- Gilbert Gilb's\n- Guillaume Calmettes\n- Herman\n- Jake Sanders\n- Janosch Maier\n- Jason Hall\n- jeunii\n- Jose Donizetti\n- Kamal Nasser\n- Kun Lu\n- Lars Seipel\n- Liwen Guo\n- Matt Moore\n- Max Walther\n- Mikhail Vasin\n- Naveen\n- nihilo\n- Oliver Gregorius\n- Pat Litke\n- Patrick Barker\n- priyawadhwa\n- Rhianna\n- Sebastiaan Tammer\n- Silvano Cirujano Cuesta\n- Tejal Desai\n- Travis DePrato\n- Wolfgang Walther\n- wwade\n- Yahav Itzhak\n- ygelfand\n\n\n# v1.7.0 Release 2021-10-19\nThis is Oct's 2021 release.\n\n## Highights\n\n* In this release, we have kaniko **s390x** platform support for multi-arch image.\n* Kaniko **Self Serve** documentation is up to enableuser to build and push kaniko images themselves [here](https://github.com/GoogleContainerTools/kaniko/blob/master/RELEASE.md)\n\n\n\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.7.0\ngcr.io/kaniko-project/executor:latest\n```\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.7.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.7.0-slim\n```\n\n*  git: accept explicit commit hash for git context [#1765](https://github.com/GoogleContainerTools/kaniko/pull/1765)\n* Remove tarball.WithCompressedCaching flag to resolve OOM Killed error [#1722](https://github.com/GoogleContainerTools/kaniko/pull/1722)\n* disable github action workflow on push to master [#1770](https://github.com/GoogleContainerTools/kaniko/pull/1770)\n* Add s390x support to docker images [copy] [#1769](https://github.com/GoogleContainerTools/kaniko/pull/1769)\n* Fix typo [#1719](https://github.com/GoogleContainerTools/kaniko/pull/1719)\n* Fix composite cache key for multi-stage copy command [#1735](https://github.com/GoogleContainerTools/kaniko/pull/1735)\n* chore: add workflows for pr tests [#1766](https://github.com/GoogleContainerTools/kaniko/pull/1766)\n* Make /bin/sh available to debug image [#1748](https://github.com/GoogleContainerTools/kaniko/pull/1748)\n* Fix executor Dockerfile, which wasn't building [#1741](https://github.com/GoogleContainerTools/kaniko/pull/1741)\n* Support force-building metadata layers into snapshot [#1731](https://github.com/GoogleContainerTools/kaniko/pull/1731)\n* Add support for CPU variants [#1676](https://github.com/GoogleContainerTools/kaniko/pull/1676)\n* refactor: adjust bpfd container runtime detection [#1686](https://github.com/GoogleContainerTools/kaniko/pull/1686)\n* Fix snapshotter ignore list; do not attempt to delete whiteouts of ignored paths [#1652](https://github.com/GoogleContainerTools/kaniko/pull/1652)\n* Add instructions for using JFrog Artifactory [#1715](https://github.com/GoogleContainerTools/kaniko/pull/1715)\n* add SECURITY.md [#1710](https://github.com/GoogleContainerTools/kaniko/pull/1710)\n* Support mirror registries with path component [#1707](https://github.com/GoogleContainerTools/kaniko/pull/1707)\n* Retry extracting filesystem from image [#1685](https://github.com/GoogleContainerTools/kaniko/pull/1685)\n* Bugfix/trailing path separator [#1683](https://github.com/GoogleContainerTools/kaniko/pull/1683)\n* docs: add missing cache-copy-layers arg in README [#1672](https://github.com/GoogleContainerTools/kaniko/pull/1672)\n* save snaphots to tmp dir [#1662](https://github.com/GoogleContainerTools/kaniko/pull/1662)\n* Revert \"save snaphots to tmp dir\" [#1670](https://github.com/GoogleContainerTools/kaniko/pull/1670)\n* Try to warm all images and warn about errors [#1653](https://github.com/GoogleContainerTools/kaniko/pull/1653)\n* Exit Code Propagation [#1655](https://github.com/GoogleContainerTools/kaniko/pull/1655)\n* Fix changelog headings [#1643](https://github.com/GoogleContainerTools/kaniko/pull/1643)\n\n\nHuge thank you for this release towards our contributors:\n- Anbraten\n- Benjamin Krenn\n- Gilbert Gilb's\n- Jake Sanders\n- Janosch Maier\n- Jason Hall\n- Jose Donizetti\n- Kamal Nasser\n- Liwen Guo\n- Max Walther\n- Mikhail Vasin\n- Patrick Barker\n- Rhianna\n- Silvano Cirujano Cuesta\n- Tejal Desai\n- Yahav Itzhak\n- ankitm123\n- ejose19\n- nihilo\n- priyawadhwa\n- wwade\n\n# v1.6.0 Release 2021-04-23\nThis is April's 2021 release.\n\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.6.0\ngcr.io/kaniko-project/executor:latest\n```\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.6.0-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.6.0-slim\n```\n\n* Support warming images by digest [#1629](https://github.com/GoogleContainerTools/kaniko/pull/1629)\n* Fix resolution of Dockerfile relative dockerignore [#1607](https://github.com/GoogleContainerTools/kaniko/pull/1607)\n* create parent directory before writing digest files [#1612](https://github.com/GoogleContainerTools/kaniko/pull/1612)\n* adds ignore-path command arguments to executor [#1622](https://github.com/GoogleContainerTools/kaniko/pull/1622)\n* Specifying a tarPath will push the image as well [#1597](https://github.com/GoogleContainerTools/kaniko/pull/1597)\n\nHuge thank you for this release towards our contributors:\n- Chris Hoffman\n- Colin\n- Jon Friesen\n- Lars Gröber\n- Sascha Schwarze\n- Tejal Desai\n- Viktor Farcic\n- Vivek Kumar\n- priyawadhwa\n\n# v1.5.2 Release 2021-03-30\n\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.5.2\ngcr.io/kaniko-project/executor:latest\n```\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.5.2-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.5.2-slim\n```\n\nThis release is the first to be signed by [cosign](https://github.com/sigstore/cosign)!\nThe PEM-encoded public key to validate against the released kaniko images is:\n\n```\n-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9aAfAcgAxIFMTstJUv8l/AMqnSKw\nP+vLu3NnnBDHCfREQpV/AJuiZ1UtgGpFpHlJLCNPmFkzQTnfyN5idzNl6Q==\n-----END PUBLIC KEY-----\n```\n\n# v1.5.1 Release 2021-02-22\nThis release is a minor release with following a fix to version number for v1.5.0\nThe kaniko images now report the right version number.\n\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.5.1\ngcr.io/kaniko-project/executor:latest\n```\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.5.1-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:v1.5.1-slim\n```\n\nIn this release, we have 1 new feature:\n* Improve retry behavior for push operation [#1578](https://github.com/GoogleContainerTools/kaniko/pull/1578)\n\nAnd followinf refactors/updates to documentation\n* Added a video introduction to Kaniko [#1517](https://github.com/GoogleContainerTools/kaniko/pull/1517)\n* Use up-to-date ca-certificates during build [#1580](https://github.com/GoogleContainerTools/kaniko/pull/1580)\n\n\nHuge thank you for this release towards our contributors:\n- Sascha Schwarze\n- Tejal Desai\n- Viktor Farcic\n\n# v1.5.0 Release 2021-01-25\n\nThis releases publishes multi-arch image kaniko images for following platforms\n1. linux/amd64\n2. linux/arm64\n3. linux/ppc64le\n\nIf you want to add other platforms, please talk to @tejal29.\n\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:v1.5.0\ngcr.io/kaniko-project/executor:latest\n```\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:v1.5.0-debug\n```\n\nIn this release, we have 2 slim executor images which don't contain any authentication binaries.\n\n1. `gcr.io/kaniko-project/executor:slim`  &\n2. `gcr.io/kaniko-project/executor:v1.5.0-slim`\n\n\n## New Features\n\n* Mutli-arch support  [#1531](https://github.com/GoogleContainerTools/kaniko/pull/1531), [#1474](https://github.com/GoogleContainerTools/kaniko/pull/1474)\n* Add support to fetch a github pull request [#1543](https://github.com/GoogleContainerTools/kaniko/pull/1543)\n* Add --image-name-tag-with-digest flag [#1541](https://github.com/GoogleContainerTools/kaniko/pull/1541)\n* add caching copy layers back [#1518](https://github.com/GoogleContainerTools/kaniko/pull/1518)\n* Profiling for Snapshotting errors. [#1530](https://github.com/GoogleContainerTools/kaniko/pull/1530)\n* feat(warmer): Warmer now supports all registry-related flags [#1499](https://github.com/GoogleContainerTools/kaniko/pull/1499)\n* feat: Add https tar.gz remote source for context [#1519](https://github.com/GoogleContainerTools/kaniko/pull/1519)\n* Add option customPlatform [#1500](https://github.com/GoogleContainerTools/kaniko/pull/1500)\n* feat: support multiple registry mirrors with fallback [#1498](https://github.com/GoogleContainerTools/kaniko/pull/1498)\n* Add s390x kaniko build to multi-arch list [#1475](https://github.com/GoogleContainerTools/kaniko/pull/1475)\n\n## Bug Fixes\n* reject tarball writes with no destinations [#1534](https://github.com/GoogleContainerTools/kaniko/pull/1534)\n* Fix travis-ci link [#1535](https://github.com/GoogleContainerTools/kaniko/pull/1535)\n* fix: extract file as same user for warmer docker image [#1538](https://github.com/GoogleContainerTools/kaniko/pull/1538)\n* fix: update busybox version to fix CVE-2018-1000500 [#1532](https://github.com/GoogleContainerTools/kaniko/pull/1532)\n* Fix typo in error message [#1494](https://github.com/GoogleContainerTools/kaniko/pull/1494)\n* Fix COPY with --chown command [#1477](https://github.com/GoogleContainerTools/kaniko/pull/1477)\n* Remove unused code [#1495](https://github.com/GoogleContainerTools/kaniko/pull/1495)\n* Fixes #1469 : Remove file that matches with the directory path [#1478](https://github.com/GoogleContainerTools/kaniko/pull/1478)\n* fix: CheckPushPermissions not being called when using --no-push and --cache-repo [#1471](https://github.com/GoogleContainerTools/kaniko/pull/1471)\n\n## Refactors\n* Switch to runtime detection via bpfd/proc [#1502](https://github.com/GoogleContainerTools/kaniko/pull/1502)\n* Update ggcr to pick up estargz and caching option [#1527](https://github.com/GoogleContainerTools/kaniko/pull/1527)\n\n## Documentation\n* Document flags for tarball build only [#1503](https://github.com/GoogleContainerTools/kaniko/pull/1503)\n* doc: clarify the format of --registry-mirror [#1504](https://github.com/GoogleContainerTools/kaniko/pull/1504)\n* add section to run lints [#1480](https://github.com/GoogleContainerTools/kaniko/pull/1480)\n* Add docs for GKE workload identity. [#1476](https://github.com/GoogleContainerTools/kaniko/pull/1476)\n\nHuge thank you for this release towards our contributors:\n- Alec Rajeev\n- Fabrice\n- Josh Chorlton\n- Lars\n- Lars Toenning\n- Matt Moore\n- Or Geva\n- Severin Strobl\n- Shashank\n- Sladyn\n- Tejal Desai\n- Theofilos Papapanagiotou\n- Vincent Behar\n- Yulia Gaponenko\n- ankitm123\n- bahetiamit\n- ejose19\n- mickkael\n- zhouhaibing089\n\n# v1.3.0 Release 2020-10-22\n\nThis release publishes, multi-arch image kaniko executor images.\n\nNote: The muti-arch images are **only** available for executor images. Contributions Welcome!!\n\nThe executor images in this release are:\n\n```\ngcr.io/kaniko-project/executor:v1.3.0\ngcr.io/kaniko-project/executor:latest\n\ngcr.io/kaniko-project/executor:arm64\ngcr.io/kaniko-project/executor:arm64-v1.3.0\n\ngcr.io/kaniko-project/executor:amd64\ngcr.io/kaniko-project/executor:amd64-v1.3.0\n\ngcr.io/kaniko-project/executor:multi-arch\ngcr.io/kaniko-project/executor:multi-arch-v1.3.0\n\n```\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:v1.3.0-debug\ngcr.io/kaniko-project/executor:debug-v1.3.0 and\ngcr.io/kaniko-project/executor:debug\n```\n\n## New Features\n* Added in docker cred helper for Azure Container Registry sourcing auth tokens directly from environment to debug image [#1458](https://github.com/GoogleContainerTools/kaniko/pull/1458)\n* Add multi-arch image via Bazel [#1452](https://github.com/GoogleContainerTools/kaniko/pull/1452)\n\n## Bug Fixes\n* Fix docker build tag [#1460](https://github.com/GoogleContainerTools/kaniko/pull/1460)\n* Fix .dockerignore for build context copies in later stages [#1447](https://github.com/GoogleContainerTools/kaniko/pull/1447)\n* Fix permissions on cache when --no-push is set [#1445](https://github.com/GoogleContainerTools/kaniko/pull/1445)\n\n\nHuge thank you for this release towards our contributors:\n\n- Akram Ben Aissi\n- Alex Szakaly\n- Alexander Sharov\n- Anthony Davies\n- Art Begolli\n- Batuhan Apaydın\n- Ben Einaudi\n- Carlos Alexandro Becker\n- Carlos Sanchez\n- Chris Mellard\n- Chris Sng\n- Christopher Hlubek\n- Cole Wippern\n- Dani Raznikov\n- Daniel Marks\n- David Dooling\n- Didier Durand\n- DracoBlue\n- Gabriel Virga\n- Gilbert Gilb's\n- Giovan Isa Musthofa\n- Gábor Lipták\n- Harmen Stoppels\n- Ian Kerins\n- James Ravn\n- Joe Kutner\n- Jon Henrik Bjørnstad\n- Jon Johnson\n- Jordan GOASDOUE\n- Jordan Goasdoue\n- Jordan Goasdoué\n- Josh Chorlton\n- Josh Soref\n- Keisuke Umegaki\n- Liubov Grinkevich\n- Logan.Price\n- Lukasz Jakimczuk\n- Martin Treusch von Buttlar\n- Matt Moore\n- Mehdi Abaakouk\n- Michel Hollands\n- Mitchell Friedman\n- Moritz Wanzenböck\n- Or Sela\n- PhoenixMage\n- Pierre-Louis Bonicoli\n- Renato Suero\n- Sam Stoelinga\n- Shihab Hasan\n- Sladyn\n- Takumasa Sakao\n- Tejal Desai\n- Thomas Bonfort\n- Thomas Stromberg\n- Tinjo Schöni\n- Tom Prince\n- Vincent Latombe\n- Wietse Muizelaar\n- Yoan Blanc\n- Yoriyasu Yano\n- Yuheng Zhang\n- aca\n- cvgw\n- ejose19\n- ohchang-kwon\n- priyawadhwa\n- tinkerborg\n- tsufeki\n- xanonid\n- yw-liu\n- 好风\n\n# v1.2.0 Release 2020-09-30\nThis is 27th release of Kaniko!\n\nIn this release, Copy layers are not cached there by making builds faster!!\n* Stop caching COPY layers [#1408](https://github.com/GoogleContainerTools/kaniko/pull/1408)\n\nHuge thank you for this release towards our contributors:\n- Ian Kerins\n\n# v1.1.0 Release 2020-09-30\nThis is the 26th release of Kaniko!\n\n## New Features\n* Add support for Vagrant [#1428](https://github.com/GoogleContainerTools/kaniko/pull/1428)\n* Allow DOCKER_CONFIG to be a filename [#1409](https://github.com/GoogleContainerTools/kaniko/pull/1409)\n\n## Bug Fixes\n* Fix docker-credential-gcr helper being called for multiple registries [#1439](https://github.com/GoogleContainerTools/kaniko/pull/1439)\n* Fix docker-credential-gcr not configured across regions[#1417](https://github.com/GoogleContainerTools/kaniko/pull/1417)\n\n## Updates and Refactors\n* add tests for configuring docker credentials across regions. [#1426](https://github.com/GoogleContainerTools/kaniko/pull/1426)\n\n## Documentation\n* Update README.md [#1437](https://github.com/GoogleContainerTools/kaniko/pull/1437)\n* spelling: storage [#1425](https://github.com/GoogleContainerTools/kaniko/pull/1425)\n* Readme.md : Kaniko -> kaniko [#1435](https://github.com/GoogleContainerTools/kaniko/pull/1435)\n* initial release instructions [#1419](https://github.com/GoogleContainerTools/kaniko/pull/1419)\n* Improve --use-new-run help text, update README with missing flags [#1405](https://github.com/GoogleContainerTools/kaniko/pull/1405)\n* Add func to append to ignorelist [#1397](https://github.com/GoogleContainerTools/kaniko/pull/1397)\n* Update README.md re: layer cache behavior [#1394](https://github.com/GoogleContainerTools/kaniko/pull/1394)\n* Fix links on README [#1398](https://github.com/GoogleContainerTools/kaniko/pull/1398)\n\nHuge thank you for this release towards our contributors:\n- aca\n- Akram Ben Aissi\n- Alexander Sharov\n- Alex Szakaly\n- Anthony Davies\n- Art Begolli\n- Batuhan Apaydın\n- Ben Einaudi\n- Carlos Alexandro Becker\n- Carlos Sanchez\n- Chris Sng\n- Christopher Hlubek\n- Cole Wippern\n- cvgw\n- Daniel Marks\n- Dani Raznikov\n- David Dooling\n- Didier Durand\n- DracoBlue\n- Gábor Lipták\n- Gabriel Virga\n- Gilbert Gilb's\n- Giovan Isa Musthofa\n- Harmen Stoppels\n- Ian Kerins\n- James Ravn\n- Joe Kutner\n- Jon Henrik Bjørnstad\n- Jon Johnson\n- Jordan Goasdoue\n- Jordan GOASDOUE\n- Jordan Goasdoué\n- Josh Chorlton\n- Josh Soref\n- Keisuke Umegaki\n- Liubov Grinkevich\n- Logan.Price\n- Lukasz Jakimczuk\n- Martin Treusch von Buttlar\n- Mehdi Abaakouk\n- Michel Hollands\n- Mitchell Friedman\n- Moritz Wanzenböck\n- ohchang-kwon\n- Or Sela\n- PhoenixMage\n- Pierre-Louis Bonicoli\n- priyawadhwa\n- Renato Suero\n- Sam Stoelinga\n- Shihab Hasan\n- Takumasa Sakao\n- Tejal Desai\n- Thomas Bonfort\n- Thomas Stromberg\n- Thomas Strömberg\n- tinkerborg\n- Tom Prince\n- tsufeki\n- Vincent Latombe\n- Wietse Muizelaar\n- xanonid\n- Yoan Blanc\n- Yoriyasu Yano\n- Yuheng Zhang\n- yw-liu\n- 好风\n\n# v1.0.0 Release 2020-08-17\nThis is the 25th release of Kaniko!\n\n## New Features\n* Specify advance options for git checkout branch. [#1322](https://github.com/GoogleContainerTools/kaniko/pull/1322)\n  * To specify a branch, use `--git=branch=branchName`\n  * To specify an option to checkout a single branch, use `--git=single-branch=true`\n  * To change submodule recursions behavior while cloning, use `--git=recurse-submodules=true`\n* Checkout a specific git commit [#1153](https://github.com/GoogleContainerTools/kaniko/pull/1153)\n* Add ability to specify GIT_TOKEN for git source repository. [#1318](https://github.com/GoogleContainerTools/kaniko/pull/1318)\n* The experimental `--use-new-run` flag avoid relying on timestamp. [#1383](https://github.com/GoogleContainerTools/kaniko/pull/1383)\n\n## Bug Fixes\n* Set correct PATH for exec form [#1342](https://github.com/GoogleContainerTools/kaniko/pull/1342)\n* executor image: fix USER environment variable [#1364](https://github.com/GoogleContainerTools/kaniko/pull/1364)\n* fix use new run marker [#1379](https://github.com/GoogleContainerTools/kaniko/pull/1379)\n* Use current platform when fetching image in warmer [#1374](https://github.com/GoogleContainerTools/kaniko/pull/1374)\n* Bump version number mismatch [#1338](https://github.com/GoogleContainerTools/kaniko/pull/1338)\n* Bugfix: Reproducible layers with whiteout [#1350](https://github.com/GoogleContainerTools/kaniko/pull/1350)\n* prepend image name when using `registry-mirror` so `library/` is inferred [#1264](https://github.com/GoogleContainerTools/kaniko/pull/1264)\n* Add command should fail on 40x when fetching remote file [#1326](https://github.com/GoogleContainerTools/kaniko/pull/1326)\n\n## Refactors & Updates\n* bump go-containerregistry dep [#1371](https://github.com/GoogleContainerTools/kaniko/pull/1371)\n* feat: upgrade go-git [#1319](https://github.com/GoogleContainerTools/kaniko/pull/1319)\n* Move snapshotPathPrefix into a method [#1359](https://github.com/GoogleContainerTools/kaniko/pull/1359)\n\n## Documentation\n* Added instructions to use gcr without kubernetes [#1385](https://github.com/GoogleContainerTools/kaniko/pull/1385)\n* Format json & yaml in README [#1358](https://github.com/GoogleContainerTools/kaniko/pull/1358)\n\n\nHuge thank you for this release towards our contributors:\n- Alex Szakaly\n- Alexander Sharov\n- Anthony Davies\n- Art Begolli\n- Batuhan Apaydın\n- Ben Einaudi\n- Carlos Alexandro Becker\n- Carlos Sanchez\n- Chris Sng\n- Christopher Hlubek\n- Cole Wippern\n- Dani Raznikov\n- Daniel Marks\n- David Dooling\n- DracoBlue\n- Gabriel Virga\n- Gilbert Gilb's\n- Giovan Isa Musthofa\n- Gábor Lipták\n- Harmen Stoppels\n- James Ravn\n- Joe Kutner\n- Jon Henrik Bjørnstad\n- Jon Johnson\n- Jordan GOASDOUE\n- Jordan Goasdoue\n- Jordan Goasdoué\n- Josh Chorlton\n- Liubov Grinkevich\n- Logan.Price\n- Lukasz Jakimczuk\n- Mehdi Abaakouk\n- Michel Hollands\n- Mitchell Friedman\n- Moritz Wanzenböck\n- Or Sela\n- PhoenixMage\n- Pierre-Louis Bonicoli\n- Renato Suero\n- Sam Stoelinga\n- Shihab Hasan\n- Takumasa Sakao\n- Tejal Desai\n- Thomas Bonfort\n- Thomas Stromberg\n- Thomas Strömberg\n- Tom Prince\n- Vincent Latombe\n- Wietse Muizelaar\n- Yoan Blanc\n- Yoriyasu Yano\n- Yuheng Zhang\n- aca\n- cvgw\n- ohchang-kwon\n- priyawadhwa\n- tinkerborg\n- tsufeki\n- xanonid\n- yw-liu\n\n# v0.24.0 Release 2020-07-01\nThis is the 24th release of Kaniko!\n\n## New Features\n* Add a new run command along with a new flag [#1300](https://github.com/GoogleContainerTools/kaniko/pull/1300)\n* Add redo snapshotter.  [#1301](https://github.com/GoogleContainerTools/kaniko/pull/1301)\n* Add pkg.dev to automagic config file population [#1328](https://github.com/GoogleContainerTools/kaniko/pull/1328)\n* kaniko now clone git repositories recursing submodules by default [#1320](https://github.com/GoogleContainerTools/kaniko/pull/1320)\n\n## Bug Fixes\n* Fix README.md [#1323](https://github.com/GoogleContainerTools/kaniko/pull/1323)\n* Fix docker-credential-gcr owner and group id [#1307](https://github.com/GoogleContainerTools/kaniko/pull/1307)\n\n## Refactors\n* check file changed in loop [#1302](https://github.com/GoogleContainerTools/kaniko/pull/1302)\n* ADD GCB benchmark code [#1299](https://github.com/GoogleContainerTools/kaniko/pull/1299)\n* benchmark FileSystem snapshot project added [#1288](https://github.com/GoogleContainerTools/kaniko/pull/1288)\n* [Perf] Reduce loops over files when taking FS snapshot. [#1283](https://github.com/GoogleContainerTools/kaniko/pull/1283)\n* Fix README.md [#1323](https://github.com/GoogleContainerTools/kaniko/pull/1323)\n* Fix docker-credential-gcr owner and group id [#1307](https://github.com/GoogleContainerTools/kaniko/pull/1307)\n* benchmark FileSystem snapshot project added [#1288](https://github.com/GoogleContainerTools/kaniko/pull/1288)\n* [Perf] Reduce loops over files when taking FS snapshot. [#1283](https://github.com/GoogleContainerTools/kaniko/pull/1283)\n\nHuge thank you for this release towards our contributors:\n- Alexander Sharov\n- Alex Szakaly\n- Anthony Davies\n- Art Begolli\n- Batuhan Apaydın\n- Ben Einaudi\n- Carlos Alexandro Becker\n- Carlos Sanchez\n- Chris Sng\n- Cole Wippern\n- cvgw\n- Daniel Marks\n- Dani Raznikov\n- David Dooling\n- DracoBlue\n- Gábor Lipták\n- Gabriel Virga\n- Gilbert Gilb's\n- Giovan Isa Musthofa\n- James Ravn\n- Jon Henrik Bjørnstad\n- Jon Johnson\n- Jordan Goasdoué\n- Liubov Grinkevich\n- Logan.Price\n- Lukasz Jakimczuk\n- Mehdi Abaakouk\n- Michel Hollands\n- Mitchell Friedman\n- Moritz Wanzenböck\n- ohchang-kwon\n- Or Sela\n- PhoenixMage\n- priyawadhwa\n- Sam Stoelinga\n- Tejal Desai\n- Thomas Bonfort\n- Thomas Stromberg\n- Thomas Strömberg\n- tinkerborg\n- Tom Prince\n- Vincent Latombe\n- Wietse Muizelaar\n- xanonid\n- Yoan Blanc\n- Yoriyasu Yano\n- Yuheng Zhang\n- yw-liu\n\n\n# v0.23.0 Release 2020-06-04\nThis is the 23rd release of Kaniko!\n\n## Bug Fixes\n* Resolving nested meta ARGs [#1260](https://github.com/GoogleContainerTools/kaniko/pull/1260)\n* add 64 busybox [#1254](https://github.com/GoogleContainerTools/kaniko/pull/1254)\n* Apply dockefile exclude only for first stage [#1234](https://github.com/GoogleContainerTools/kaniko/pull/1234)\n\n## New Features\n* Add /etc/nsswitch.conf for /etc/hosts name resolution [#1251](https://github.com/GoogleContainerTools/kaniko/pull/1251)\n* Add ability to set git auth token using environment variables [#1263](https://github.com/GoogleContainerTools/kaniko/pull/1263)\n* Add retries to image push. [#1258](https://github.com/GoogleContainerTools/kaniko/pull/1258)\n* Update docker-credential-gcr to support auth with GCP Artifact Registry [#1255](https://github.com/GoogleContainerTools/kaniko/pull/1255)\n\n## Updates and Refactors\n* Added integration test for multi level argument [#1285](https://github.com/GoogleContainerTools/kaniko/pull/1285)\n* rename whitelist to ignorelist [#1295](https://github.com/GoogleContainerTools/kaniko/pull/1295)\n* Remove direct use of DefaultTransport [#1221](https://github.com/GoogleContainerTools/kaniko/pull/1221)\n* fix switching to non existent workdir [#1253](https://github.com/GoogleContainerTools/kaniko/pull/1253)\n* remove duplicates save for the same dir [#1252](https://github.com/GoogleContainerTools/kaniko/pull/1252)\n* add timings for resolving paths [#1284](https://github.com/GoogleContainerTools/kaniko/pull/1284)\n\n## Documentation\n* Instructions for using stdin with kubectl [#1289](https://github.com/GoogleContainerTools/kaniko/pull/1289)\n* Add GoReportCard badge to README [#1249](https://github.com/GoogleContainerTools/kaniko/pull/1249)\n* Make support clause more bold. [#1273](https://github.com/GoogleContainerTools/kaniko/pull/1273)\n* Correct typo [#1250](https://github.com/GoogleContainerTools/kaniko/pull/1250)\n* docs: add registry-certificate flag to readme [#1276](https://github.com/GoogleContainerTools/kaniko/pull/1276)\n\nHuge thank you for this release towards our contributors:\n- Anthony Davies\n- Art Begolli\n- Batuhan Apaydın\n- Ben Einaudi\n- Carlos Alexandro Becker\n- Carlos Sanchez\n- Chris Sng\n- Cole Wippern\n- Dani Raznikov\n- Daniel Marks\n- David Dooling\n- DracoBlue\n- Gabriel Virga\n- Gilbert Gilb's\n- Giovan Isa Musthofa\n- Gábor Lipták\n- James Ravn\n- Jon Henrik Bjørnstad\n- Jordan GOASDOUE\n- Liubov Grinkevich\n- Logan.Price\n- Lukasz Jakimczuk\n- Mehdi Abaakouk\n- Michel Hollands\n- Mitchell Friedman\n- Moritz Wanzenböck\n- Or Sela\n- PhoenixMage\n- Sam Stoelinga\n- Tejal Desai\n- Thomas Bonfort\n- Thomas Stromberg\n- Thomas Strömberg\n- Tom Prince\n- Vincent Latombe\n- Wietse Muizelaar\n- Yoan Blanc\n- Yoriyasu Yano\n- Yuheng Zhang\n- cvgw\n- ohchang-kwon\n- tinkerborg\n- xanonid\n- yw-liu\n\n# v0.22.0 Release 2020-05-07\nThis is a minor release of kaniko fixing:\n- GCB Authentication issue\n  [1242](https://github.com/GoogleContainerTools/kaniko/issues/1242)\n- Re-added files if removed from base imaged [1236](https://github.com/GoogleContainerTools/kaniko/issues/1236)\n\nBig thanks to\n- David Dooling\n\n# v0.21.0 Release - 2020-05-04\nThis is the 21th release of Kaniko! Thank you for patience.\n\nThis is minor release which fixes the `/kaniko/.docker` being removed in executor image\n* Fixes #1227 - Readded the `/kaniko/.docker` directory [#1230](https://github.com/GoogleContainerTools/kaniko/pull/1230)\n\n# v0.20.0 Release - 2020-05-04\nThis is the 20th release of Kaniko! Thank you for patience.\nPlease give us feedback on how we are doing by taking a short [5 question survey](https://forms.gle/HhZGEM33x4FUz9Qa6)\n\nIn this release, the highlights are:\n1. Fix doubling cache layers size and error due to duplicate files in cached layers\n1. Kaniko now supports reading a tar context from a stdin using `--context=tar:/.\n1. Kaniko adds a new flag `--context-sub-path` to represent a subpath within the given context\n1. Skip buiklding unused stages using `--skip-unused-stages` flags.\n\n## Bug Fixes\n* Snapshot FS on first cache miss. [#1214](https://github.com/GoogleContainerTools/kaniko/pull/1214)\n* Add secondary group impersonation w/ !cgo support  [#1164](https://github.com/GoogleContainerTools/kaniko/pull/1164)\n* kaniko generates images that docker supports in the presence of dangling symlinks [#1193](https://github.com/GoogleContainerTools/kaniko/pull/1193)\n* Handle `MAINTAINERS` when passing `--single-snapshot`. [#1192](https://github.com/GoogleContainerTools/kaniko/pull/1192)\n* Multistage ONBUILD COPY Support [#1190](https://github.com/GoogleContainerTools/kaniko/pull/1190)\n* fix previous name checking in 'executor.build.fetchExtraStages' [#1167](https://github.com/GoogleContainerTools/kaniko/pull/1167)\n* Always add parent directories of files to snapshots. [#1166](https://github.com/GoogleContainerTools/kaniko/pull/1166)\n* Fix `workdir` command pointing to relative dir in first command.\n* fix stages are now resolved correctly when `--skip-unused-stages` is used\n\n## New Features\n* Add ability to use public GCR repos without being authenticated [#1140](https://github.com/GoogleContainerTools/kaniko/pull/1140)\n* Add timestamp to logs [#1211](https://github.com/GoogleContainerTools/kaniko/pull/1211)\n* Add http support for git repository context [#1196](https://github.com/GoogleContainerTools/kaniko/pull/1196)\n* Kaniko now resolves args from all stages [#1160](https://github.com/GoogleContainerTools/kaniko/pull/1160)\n* kaniko adds a new flag `--context-sub-path` to represent a subpath within the given context\n* feat: allow injecting through stdin tar.gz on kaniko [#1139](https://github.com/GoogleContainerTools/kaniko/pull/1139)\n* Set image platform for any build [#1130](https://github.com/GoogleContainerTools/kaniko/pull/1130)\n* Add --log-format parameter to README.md [#1216](https://github.com/GoogleContainerTools/kaniko/pull/1216)\n* feat: multistages now respect dependencies without building unnecessary stages [#1165](https://github.com/GoogleContainerTools/kaniko/pull/1165)\n\n## Refactors and Updates\n* Refactor Kaniko to test across multistages [#1155](https://github.com/GoogleContainerTools/kaniko/pull/1155)\n* upgrade go container registry to latest master [#1146](https://github.com/GoogleContainerTools/kaniko/pull/1146)\n* small perf optimizing. Only remove whiteout path if it needs to be included in base image [#1147](https://github.com/GoogleContainerTools/kaniko/pull/1147)\n* Don't generate cache key, if not caching builds. [#1194](https://github.com/GoogleContainerTools/kaniko/pull/1194)\n* Set very large logs to Trace level [#1203](https://github.com/GoogleContainerTools/kaniko/pull/1203)\n* optimize: don't parse Dockerfile twice, reusing stages [#1174](https://github.com/GoogleContainerTools/kaniko/pull/1174)\n* 32bit overflow fix [#1168](https://github.com/GoogleContainerTools/kaniko/pull/1168)\n\n## Documentation\n* Update Pushing to Docker Hub to use v2 api [#1204](https://github.com/GoogleContainerTools/kaniko/pull/1204)\n* Fix line endings in shell script [#1199](https://github.com/GoogleContainerTools/kaniko/pull/1199)\n\nHuge thank you for this release towards our contributors:\n- Anthony Davies\n- Batuhan Apaydın\n- Ben Einaudi\n- Carlos Alexandro Becker\n- Carlos Sanchez\n- Cole Wippern\n- cvgw\n- Dani Raznikov\n- DracoBlue\n- Gilbert Gilb's\n- Giovan Isa Musthofa\n- James Ravn\n- Jon Henrik Bjørnstad\n- Jordan GOASDOUE\n- Jordan Goasdoué\n- Liubov Grinkevich\n- Logan.Price\n- Michel Hollands\n- Moritz Wanzenböck\n- ohchang-kwon\n- Or Sela\n- PhoenixMage\n- Sam Stoelinga\n- Tejal Desai\n- Thomas Bonfort\n- Thomas Stromberg\n- Thomas Strömberg\n- tinkerborg\n- Tom Prince\n- Vincent Latombe\n- Wietse Muizelaar\n- xanonid\n- Yoan Blanc\n- Yuheng Zhang\n- yw-liu\n\n\n# v0.19.0 Release - 2020-03-18\nThis is the 19th release of Kaniko!\n\nIn this release, the highlights are:\n1. Cache layer size duplication regression in v0.18.0 is fixed. [#1138](https://github.com/GoogleContainerTools/kaniko/issues/1138)\n1. Cache performance when using build-args. `build-args` are only part of cache key for a layer if it is used.\n1. Kaniko can support a `tar.gz` context with `tar://` prefix.\n1. Users can provide registry certificates for private registries.\n\n## Bug Fixes\n* Use the correct name for acr helper [#1121](https://github.com/GoogleContainerTools/kaniko/pull/1121)\n* remove build args from composite key and replace all build args [#1085](https://github.com/GoogleContainerTools/kaniko/pull/1085)\n* fix resolve link for dirs with trailing / [#1113](https://github.com/GoogleContainerTools/kaniko/pull/1113)\n\n## New Features\n* feat: add support of local '.tar.gz' file inside the kaniko container [#1115](https://github.com/GoogleContainerTools/kaniko/pull/1115)\n* Add support to `--chown` flag to ADD command (Issue #57) [#1134](https://github.com/GoogleContainerTools/kaniko/pull/1134)\n* executor: add --label flag [#1075](https://github.com/GoogleContainerTools/kaniko/pull/1075)\n* Allow user to provide registry certificate [#1037](https://github.com/GoogleContainerTools/kaniko/pull/1037)\n\n## Refactors And Updates\n* Migrate to golang 1.14 [#1098](https://github.com/GoogleContainerTools/kaniko/pull/1098)\n* Make cloudbuild.yaml re-usable for anyone [#1135](https://github.com/GoogleContainerTools/kaniko/pull/1135)\n* fix: credential typo [#1128](https://github.com/GoogleContainerTools/kaniko/pull/1128)\n* Travis k8s integration test [#1124](https://github.com/GoogleContainerTools/kaniko/pull/1124)\n* Add more tests for Copy and some fixes. [#1114](https://github.com/GoogleContainerTools/kaniko/pull/1114)\n\n## Documentation\n* Update README on running in Docker [#1141](https://github.com/GoogleContainerTools/kaniko/pull/1141)\n\nHuge thank you for this release towards our contributors:\n - Anthony Davies\n - Batuhan Apaydın\n - Ben Einaudi\n - Carlos Sanchez\n - Cole Wippern\n - cvgw\n - Dani Raznikov\n - DracoBlue\n - James Ravn\n - Jordan GOASDOUE\n - Logan.Price\n - Moritz Wanzenböck\n - ohchang-kwon\n - Or Sela\n - Sam Stoelinga\n - Tejal Desai\n - Thomas Bonfort\n - Thomas Strömberg\n - tinkerborg\n - Wietse Muizelaar\n - xanonid\n - Yoan Blanc\n - Yuheng Zhang\n\n # v0.18.0 Release -2020-03-05\nThis release fixes all the regression bugs associated with v0.17.0 and v0.17.1.\nThis release, the team did a lot of work improving our test infrastructure, more tests cases\nand refactored filesystem walking.\n\nThank you all for your patience and supporting us throughout!\n\n## Bug Fixes\n* fix home being reset to root [#1072](https://github.com/GoogleContainerTools/kaniko/pull/1072)\n* fix user metadata set to USER:GROUP if group string is not set [#1105](https://github.com/GoogleContainerTools/kaniko/pull/1105)\n* check for filepath.Walk error everywhere [#1086](https://github.com/GoogleContainerTools/kaniko/pull/1086)\n* fix #1092 TestRelativePaths [#1093](https://github.com/GoogleContainerTools/kaniko/pull/1093)\n* Resolve filepaths before scanning for changes [#1069](https://github.com/GoogleContainerTools/kaniko/pull/1069)\n* Fix #1020 os.Chtimes invalid arg [#1074](https://github.com/GoogleContainerTools/kaniko/pull/1074)\n* Fix #1067 - image no longer available [#1068](https://github.com/GoogleContainerTools/kaniko/pull/1068)\n* Ensure image SHA stays consistent when layer contents haven't changed [#1032](https://github.com/GoogleContainerTools/kaniko/pull/1032)\n* fix flake TestRun/Dockerfile_test_copy_symlink [#1030](https://github.com/GoogleContainerTools/kaniko/pull/1030)\n\n## New Features\n* root: add --registry-mirror flag [#836](https://github.com/GoogleContainerTools/kaniko/pull/836)\n* set log format using a flag [#1031](https://github.com/GoogleContainerTools/kaniko/pull/1031)\n* Do not recompute layers retrieved from cache [#882](https://github.com/GoogleContainerTools/kaniko/pull/882)\n* More idiomatic logging config [#1040](https://github.com/GoogleContainerTools/kaniko/pull/1040)\n\n\n## Test Refactors and Updates\n* Split travis integration tests [#1090](https://github.com/GoogleContainerTools/kaniko/pull/1090)\n* Add integration tests from Issues [#1054](https://github.com/GoogleContainerTools/kaniko/pull/1054)\n* add integration tests with their own context [#1088](https://github.com/GoogleContainerTools/kaniko/pull/1088)\n* Fixed typo in README.md [#1060](https://github.com/GoogleContainerTools/kaniko/pull/1060)\n* test: refactor container-diff call [#1077](https://github.com/GoogleContainerTools/kaniko/pull/1077)\n* Refactor integration image built [#1049](https://github.com/GoogleContainerTools/kaniko/pull/1049)\n* separate travis into multiple jobs for parallelization [#1055](https://github.com/GoogleContainerTools/kaniko/pull/1055)\n* refactor copy.chown code and add more tests [#1027](https://github.com/GoogleContainerTools/kaniko/pull/1027)\n* Allow contributors to launch integration tests against local registry [#1014](https://github.com/GoogleContainerTools/kaniko/pull/1014)\n\n## Documentation\n* add design proposal template [#1046](https://github.com/GoogleContainerTools/kaniko/pull/1046)\n* Update filesystem proposal status to Reviewed [#1066](https://github.com/GoogleContainerTools/kaniko/pull/1066)\n* update instructions for running integration tests [#1034](https://github.com/GoogleContainerTools/kaniko/pull/1034)\n* design proposal 01: filesystem resolution [#1048](https://github.com/GoogleContainerTools/kaniko/pull/1048)\n* Document that this tool is not officially supported by Google [#1044](https://github.com/GoogleContainerTools/kaniko/pull/1044)\n* Fix example pod.yml to not mount to root [#1043](https://github.com/GoogleContainerTools/kaniko/pull/1043)\n* fixing docker run command in README.md [#1103](https://github.com/GoogleContainerTools/kaniko/pull/1103)\n\nHuge thank you for this release towards our contributors:\n- Anthony Davies\n- Batuhan Apaydın\n- Ben Einaudi\n- Cole Wippern\n- cvgw\n- DracoBlue\n- James Ravn\n- Logan.Price\n- Moritz Wanzenböck\n- ohchang-kwon\n- Or Sela\n- Sam Stoelinga\n- Tejal Desai\n- Thomas Bonfort\n- Thomas Strömberg\n- tinkerborg\n- Wietse Muizelaar\n- xanonid\n- Yoan Blanc\n\n# v0.17.1 Release - 2020-02-04\n\nThis is minor patch release to fix [#1002](https://github.com/GoogleContainerTools/kaniko/issues/1002)\n\n# v0.17.0 Release - 2020-02-03\n\n## New Features\n* Expand build argument from environment when no value specified [#993](https://github.com/GoogleContainerTools/kaniko/pull/993)\n* whitelist  /tmp/apt-key-gpghome.* directory [#1000](https://github.com/GoogleContainerTools/kaniko/pull/1000)\n* Add flag to `--whitelist-var-run` set to true to preserver default kani… [#1011](https://github.com/GoogleContainerTools/kaniko/pull/1011)\n* Prefer platform that is currently running for pulling remote images and kaniko binary Makefile target [#980](https://github.com/GoogleContainerTools/kaniko/pull/980)\n\n## Bug Fixes\n* Fix caching to respect .dockerignore [#854](https://github.com/GoogleContainerTools/kaniko/pull/854)\n* Fixes #988 run_in_docker.sh only works with gcr.io [#990](https://github.com/GoogleContainerTools/kaniko/pull/990)\n* Fix Symlinks not being copied across stages [#971](https://github.com/GoogleContainerTools/kaniko/pull/971)\n* Fix home and group set for user command [#995](https://github.com/GoogleContainerTools/kaniko/pull/995)\n* Fix COPY or ADD to symlink destination breaks image [#943](https://github.com/GoogleContainerTools/kaniko/pull/943)\n* [Caching] Fix bug with deleted files and cached run and copy commands\n* [Mutistage Build] Fix bug with capital letter in stage names [#983](https://github.com/GoogleContainerTools/kaniko/pull/983)\n* Fix #940 set modtime when extracting [#981](https://github.com/GoogleContainerTools/kaniko/pull/981)\n* Fix Ability for ADD to unTar a file [#792](https://github.com/GoogleContainerTools/kaniko/pull/792)\n\n## Updates and Refactors\n* fix test flake [#1016](https://github.com/GoogleContainerTools/kaniko/pull/1016)\n* Upgrade go-containerregistry third-party library [#957](https://github.com/GoogleContainerTools/kaniko/pull/957)\n* Remove debug tag being built for every push to master [#1004](https://github.com/GoogleContainerTools/kaniko/pull/1004)\n* Run integration tests in Travis CI [#979](https://github.com/GoogleContainerTools/kaniko/pull/979)\n\n\nHuge thank you for this release towards our contributors:\n- Anthony Davies\n- Ben Einaudi\n- Cole Wippern\n- cvgw\n- Logan.Price\n- Moritz Wanzenböck\n- ohchang-kwon\n- Sam Stoelinga\n- Tejal Desai\n- Thomas Bonfort\n- Wietse Muizelaar\n\n# v0.16.0 Release - 2020-01-17\n\nHappy New Year 2020!\n\n## Bug Fixes\n* Support for private registries in the cache warmer [#941](https://github.com/GoogleContainerTools/kaniko/pull/941)\n* Fix bug with docker compatibility ArgsEscaped [#964](https://github.com/GoogleContainerTools/kaniko/pull/964)\n* Clean code (Condition is always 'false' because 'err' is always 'nil' ). [#967](https://github.com/GoogleContainerTools/kaniko/pull/967)\n* Fix #647 Copy dir permissions [#961](https://github.com/GoogleContainerTools/kaniko/pull/961)\n* Allow setting serviceAccount in integration test [#965](https://github.com/GoogleContainerTools/kaniko/pull/965)\n* Fix #926 cache warmer and method signature [#927](https://github.com/GoogleContainerTools/kaniko/pull/927)\n* Fix #948 update valid license years [#949](https://github.com/GoogleContainerTools/kaniko/pull/949)\n* Move hash bang to first line. [#954](https://github.com/GoogleContainerTools/kaniko/pull/954)\n* Fix #944 include docker-credential-acr-linux [#945](https://github.com/GoogleContainerTools/kaniko/pull/945)\n* Fix #925 broken insecure pull [#932](https://github.com/GoogleContainerTools/kaniko/pull/932)\n* Push to ECR using instance roles [#930](https://github.com/GoogleContainerTools/kaniko/pull/930)\n* Upgrade aws go sdk for supporting eks oidc credential chain [#832](https://github.com/GoogleContainerTools/kaniko/pull/832)\n* Push image [#866](https://github.com/GoogleContainerTools/kaniko/pull/866)\n\n## Updates and Refactors\n* Fixes #950 integration test failing on go 1.13 [#955](https://github.com/GoogleContainerTools/kaniko/pull/955)\n* Tidy dependencies [#939](https://github.com/GoogleContainerTools/kaniko/pull/939)\n* changing to modules from dependencies [#869](https://github.com/GoogleContainerTools/kaniko/pull/869)\n* Changing Log to trace [#920](https://github.com/GoogleContainerTools/kaniko/pull/920)\n\n## Documentation\n* docs: fix document on DoBuild [#668](https://github.com/GoogleContainerTools/kaniko/pull/668)\n* Update outdated toc in README.md [#867](https://github.com/GoogleContainerTools/kaniko/pull/867)\n\nHuge thank you for this release towards our contributors:\n- Adrian Mouat\n- Balint Pato\n- Ben Einaudi\n- Benjamin EINAUDI\n- Carlos Sanchez\n- Cole Wippern\n- Daniel Strobusch\n- Eduard Laur\n- Fahri Yardımcı\n- Josh Soref\n- lou-lan\n- Nao YONASHIRO\n- poy\n- Prashant Arya\n- priyawadhwa\n- Pweetoo\n- Remko van Hunen\n- Sam Stoelinga\n- Stijn De Haes\n- Tejal Desai\n- tommaso.doninelli\n- Will Ripley\n\n\n# v0.15.0 Release - 2019-12-20\n\n## Bug fixes\n* Fix #899 cached copy results in inconsistent key [#914](https://github.com/GoogleContainerTools/kaniko/pull/914)\n* Fix contribution issue sentence [#912](https://github.com/GoogleContainerTools/kaniko/pull/912)\n* Include source stage cache key in cache key for COPY commands using --from [#883](https://github.com/GoogleContainerTools/kaniko/pull/883)\n* Fix failure when using capital letters in image alias in 'FROM ... AS…' instruction [#839](https://github.com/GoogleContainerTools/kaniko/pull/839)\n* Add golangci.yaml file matching current config [#893](https://github.com/GoogleContainerTools/kaniko/pull/893)\n* when copying, skip files with the same name [#905](https://github.com/GoogleContainerTools/kaniko/pull/905)\n* Modified error message for writing image with digest file [#849](https://github.com/GoogleContainerTools/kaniko/pull/849)\n* Don't exit optimize early; record last cachekey [#892](https://github.com/GoogleContainerTools/kaniko/pull/892)\n* Final cachekey for stage [#891](https://github.com/GoogleContainerTools/kaniko/pull/891)\n* Update error handling and logging for cache [#879](https://github.com/GoogleContainerTools/kaniko/pull/879)\n* Resolve symlink targets to abs path before copying [#857](https://github.com/GoogleContainerTools/kaniko/pull/857)\n* Fix quote strip behavior for ARG values [#850](https://github.com/GoogleContainerTools/kaniko/pull/850)\n\n## Updates and Refactors\n* add unit tests for caching run and copy [#888](https://github.com/GoogleContainerTools/kaniko/pull/888)\n* Only build required docker images for integration tests [#898](https://github.com/GoogleContainerTools/kaniko/pull/898)\n* Add integration test for add url with arg [#863](https://github.com/GoogleContainerTools/kaniko/pull/863)\n* Add unit tests for compositecache and stagebuilder [#890](https://github.com/GoogleContainerTools/kaniko/pull/890)\n\n## Documentation\n* updated readme [#906](https://github.com/GoogleContainerTools/kaniko/pull/906)\n* nits in README [#861](https://github.com/GoogleContainerTools/kaniko/pull/861)\n* Invalid link to missing file config.json [#876](https://github.com/GoogleContainerTools/kaniko/pull/876)\n* Fix README.md anchor links [#872](https://github.com/GoogleContainerTools/kaniko/pull/872)\n* Update readme known issues [#874](https://github.com/GoogleContainerTools/kaniko/pull/874)\n\nHuge thank you for this release towards our contributors:\n- Balint Pato\n- Ben Einaudi\n- Cole Wippern\n- Eduard Laur\n- Josh Soref\n- Pweetoo\n- Tejal Desai\n- Will Ripley\n- poy\n- priyawadhwa\n- tommaso.doninelli\n\n\n# v0.14.0 Release - 2019-11-08\n\n## New Features\n* Added --image-name-with-digest flag [#841](https://github.com/GoogleContainerTools/kaniko/pull/841)\n* Add support to download context file from Azure Blob Storage [#816](https://github.com/GoogleContainerTools/kaniko/pull/816)\n* Add BUILD_ARGs to ease use of proxy [#810](https://github.com/GoogleContainerTools/kaniko/pull/810)\n\n## Bug Fixes\n* fix tests for default home [#824](https://github.com/GoogleContainerTools/kaniko/pull/824)\n* Issue #439 Strip out double quotes in ARG value [#834](https://github.com/GoogleContainerTools/kaniko/pull/834)\n* Fixes caching with COPY command [#773](https://github.com/GoogleContainerTools/kaniko/pull/773)\n* 828: clean up docker doc, fix context var in run cmd [#829](https://github.com/GoogleContainerTools/kaniko/pull/829)\n* fix build_args in MakeFile, have Travis run make images to preven issue in future [#821](https://github.com/GoogleContainerTools/kaniko/pull/821)\n\n## Updates and Refactors\n* changing debug to trace [#825](https://github.com/GoogleContainerTools/kaniko/pull/825)\n\n## Documentation\n* Details about --tarPath usage improved [#811](https://github.com/GoogleContainerTools/kaniko/pull/811)\n\n\n# v0.13.0 Release - 2019-10-04\n\n## New Features\n* Add `kaniko version` command [#796](https://github.com/GoogleContainerTools/kaniko/pull/796)\n* Write data about pushed images for GCB kaniko build step if env var `BUILDER_OUTPUT` is set [#602](https://github.com/GoogleContainerTools/kaniko/pull/602)\n* Support `Dockerfile.dockerignore` relative to `Dockerfile` [#801](https://github.com/GoogleContainerTools/kaniko/pull/801)\n\n## Bug Fixes\n* fix creating abs path for urls [#804](https://github.com/GoogleContainerTools/kaniko/pull/804)\n* Fix #691 - ADD does not understand ENV variables [#768](https://github.com/GoogleContainerTools/kaniko/pull/768)\n* Resolve relative paths to absolute paths in command line arguments [#736](https://github.com/GoogleContainerTools/kaniko/pull/736)\n* insecure flag is now honored with `--cache` flag. [#685](https://github.com/GoogleContainerTools/kaniko/pull/685)\n* Reduce log level for adding file message [#624](https://github.com/GoogleContainerTools/kaniko/pull/624)\n* Fix SIGSEGV on file system deletion while building [#765](https://github.com/GoogleContainerTools/kaniko/pull/765)\n\n## Updates and Refactors\n* add debug level info what is the layer type [#805](https://github.com/GoogleContainerTools/kaniko/pull/805)\n* Update base image to golang:1.12 [#648](https://github.com/GoogleContainerTools/kaniko/pull/648)\n* Add some triage notes to issue template. [#794](https://github.com/GoogleContainerTools/kaniko/pull/794)\n* double help text about skip-verify-tls [#782](https://github.com/GoogleContainerTools/kaniko/pull/782)\n* Add a pull request template [#795](https://github.com/GoogleContainerTools/kaniko/pull/795)\n* Correct CheckPushPermission comment. [#671](https://github.com/GoogleContainerTools/kaniko/pull/671)\n\n## Documentation\n* Use kaniko with docker config.json password [#129](https://github.com/GoogleContainerTools/kaniko/pull/129)\n* Add getting started tutorial [#790](https://github.com/GoogleContainerTools/kaniko/pull/790)\n\n## Performance\n* feat: optimize build [#694](https://github.com/GoogleContainerTools/kaniko/pull/694)\n\nHuge thank you for this release towards our contributors:\n- alexa\n- Andreas Bergmeier\n- Carlos Alexandro Becker\n- Carlos Sanchez\n- chhsia0\n- debuggy\n- Deniz Zoeteman\n- Don McCasland\n- Fred Cox\n- Herrmann Hinz\n- Hugues Alary\n- Jason Hall\n- Johannes 'fish' Ziemke\n- jonjohnsonjr\n- Luke Wood\n- Matthew Dawson\n- Mingliang Tao\n- Monard Vong\n- Nao YONASHIRO\n- Niels Denissen\n- Prashant\n- priyawadhwa\n- Priya Wadhwa\n- Sascha Askani\n- sharifelgamal\n- Sharif Elgamal\n- Takeaki Matsumoto\n- Taylor Barrella\n- Tejal Desai\n- Thao-Nguyen Do\n- tralexa\n- Victor Noel\n- v.rul\n- Warren Seymour\n- xanonid\n- Xueshan Feng\n- Антон Костенко\n- Роман Небалуев\n\n# v0.12.0 Release - 2019-09/13\n\n## New Features\n* Added `--oci-layout-path` flag to save image in OCI layout. [#744](https://github.com/GoogleContainerTools/kaniko/pull/744)\n* Add support for S3 custom endpoint [#698](https://github.com/GoogleContainerTools/kaniko/pull/698)\n\n## Bug Fixes\n* Setting PATH [#760](https://github.com/GoogleContainerTools/kaniko/pull/760)\n* Remove leading slash in layer tarball paths (Closes: #726) [#729](https://github.com/GoogleContainerTools/kaniko/pull/729)\n\n## Updates and Refactors\n* Remove cruft [#635](https://github.com/GoogleContainerTools/kaniko/pull/635)\n* Add desc for `--skip-tls-verify-pull` to README [#493](https://github.com/GoogleContainerTools/kaniko/pull/493)\n\nHuge thank you for this release towards our contributors:\n- Carlos Alexandro Becker\n- Carlos Sanchez\n- chhsia0\n- Deniz Zoeteman\n- Luke Wood\n- Matthew Dawson\n- Niels Denissen\n- Priya Wadhwa\n- Sharif Elgamal\n- Takeaki Matsumoto\n- Taylor Barrella\n- Tejal Desai\n- v.rul\n- Warren Seymour\n- xanonid\n- Xueshan Feng\n- Роман Небалуев\n\n\n# v0.11.0 Release - 2019-08-23\n\n## Bug Fixes\n* fix unpacking archives via ADD [#717](https://github.com/GoogleContainerTools/kaniko/pull/717)\n* Reverted not including build args in cache key [#739](https://github.com/GoogleContainerTools/kaniko/pull/739)\n* Create cache directory if it doesn't already exist [#452](https://github.com/GoogleContainerTools/kaniko/pull/452)\n\n## New Features\n* add multiple user agents to kaniko if upstream_client_type value  is set [#750](https://github.com/GoogleContainerTools/kaniko/pull/750)\n* Make container layers captured using FS snapshots reproducible [#714](https://github.com/GoogleContainerTools/kaniko/pull/714)\n* Include warmer in debug image [#497](https://github.com/GoogleContainerTools/kaniko/pull/497)\n* Bailout when there is not enough input arguments [#735](https://github.com/GoogleContainerTools/kaniko/pull/735)\n* Add checking image presence in cache prior to downloading it [#723](https://github.com/GoogleContainerTools/kaniko/pull/723)\n\n## Additonal PRs\n* Document how to build from git reference [#730](https://github.com/GoogleContainerTools/kaniko/pull/730)\n* Misc. small changes/refactoring [#712](https://github.com/GoogleContainerTools/kaniko/pull/712)\n* Update go-containerregistry [#680](https://github.com/GoogleContainerTools/kaniko/pull/680)\n* Update version of go-containerregistry [#724](https://github.com/GoogleContainerTools/kaniko/pull/724)\n* feat: support specifying branch for cloning [#703](https://github.com/GoogleContainerTools/kaniko/pull/703)\n\nHuge thank you for this release towards our contributors:\n- Carlos Alexandro Becker\n- Carlos Sanchez\n- Deniz Zoeteman\n- Luke Wood\n- Matthew Dawson\n- priyawadhwa\n- sharifelgamal\n- Sharif Elgamal\n- Taylor Barrella\n- Tejal Desai\n- v.rul\n- Warren Seymour\n- Xueshan Feng\n- Роман Небалуе\n\n# v0.10.0 Release - 2019-06-19\n\n## Bug Fixes\n* Fix kaniko caching [#639](https://github.com/GoogleContainerTools/kaniko/pull/639)\n* chore: fix typo [#665](https://github.com/GoogleContainerTools/kaniko/pull/665)\n* Fix file mode bug [#618](https://github.com/GoogleContainerTools/kaniko/pull/618)\n* Fix arg handling for multi-stage images in COPY instructions. [#621](https://github.com/GoogleContainerTools/kaniko/pull/621)\n* Fix parent directory permissions [#619](https://github.com/GoogleContainerTools/kaniko/pull/619)\n* Environment variables should be replaced in URLs in ADD commands. [#580](https://github.com/GoogleContainerTools/kaniko/pull/580)\n* Update the cache warmer to also save manifests. [#576](https://github.com/GoogleContainerTools/kaniko/pull/576)\n* Fix typo in error message [#569](https://github.com/GoogleContainerTools/kaniko/pull/569)\n\n## New Features\n* Add SkipVerify support to CheckPushPermissions. [#663](https://github.com/GoogleContainerTools/kaniko/pull/663)\n* Creating  github Build Context [#672](https://github.com/GoogleContainerTools/kaniko/pull/672)\n* Add `--digest-file` flag to output built digest to file. [#655](https://github.com/GoogleContainerTools/kaniko/pull/655)\n* README.md: update BuildKit/img comparison [#642](https://github.com/GoogleContainerTools/kaniko/pull/642)\n* Add documentation for --verbosity flag [#634](https://github.com/GoogleContainerTools/kaniko/pull/634)\n* Optimize file copying and stage saving between stages. [#605](https://github.com/GoogleContainerTools/kaniko/pull/605)\n* Add an integration test for USER unpacking. [#600](https://github.com/GoogleContainerTools/kaniko/pull/600)\n* Added missing documentation for --skip-tls-verify-pull arg [#593](https://github.com/GoogleContainerTools/kaniko/pull/593)\n* README.me: update Buildah description [#586](https://github.com/GoogleContainerTools/kaniko/pull/586)\n* Add missing tests for bucket util [#565](https://github.com/GoogleContainerTools/kaniko/pull/565)\n* Look for manifests in the local cache next to the full images. [#570](https://github.com/GoogleContainerTools/kaniko/pull/570)\n* Make the run_in_docker script support caching. [#564](https://github.com/GoogleContainerTools/kaniko/pull/564)\n* Refactor snapshotting [#561](https://github.com/GoogleContainerTools/kaniko/pull/561)\n* Stop storing a separate cache hash. [#560](https://github.com/GoogleContainerTools/kaniko/pull/560)\n* Speed up workdir by always returning an empty filelist (rather than a… [#557](https://github.com/GoogleContainerTools/kaniko/pull/557)\n* Refactor whitelist handling. [#559](https://github.com/GoogleContainerTools/kaniko/pull/559)\n* Refactor the build loop to fetch stagebuilders earlier. [#558](https://github.com/GoogleContainerTools/kaniko/pull/558)\n\n## Additonal PRs\n* Improve changelog dates [#657](https://github.com/GoogleContainerTools/kaniko/pull/657)\n* Change verbose output from info to debug [#640](https://github.com/GoogleContainerTools/kaniko/pull/640)\n* Check push permissions before building images [#622](https://github.com/GoogleContainerTools/kaniko/pull/622)\n* Bump go-containerregistry to 8c1640add99804503b4126abc718931a4d93c31a [#609](https://github.com/GoogleContainerTools/kaniko/pull/609)\n* Update go-containerregistry [#599](https://github.com/GoogleContainerTools/kaniko/pull/599)\n* Log \"Skipping paths under...\" to debug [#571](https://github.com/GoogleContainerTools/kaniko/pull/571)\n\nHuge thank you for this release towards our contributors:\n- Achilleas Pipinellis\n- Adrian Duong\n- Akihiro Suda\n- Andreas Bergmeier\n- Andrew Rynhard\n- Anthony Weston\n- Anurag Goel\n- Balint Pato\n- Christie Wilson\n- Daisuke Taniwaki\n- Dan Cecile\n- Dirk Gustke\n- dlorenc\n- Fredrik Lönnegren\n- Gijs\n- Jake Shadle\n- James Rawlings\n- Jason Hall\n- Johan Hernandez\n- Johannes 'fish' Ziemke\n- Kartik Verma\n- linuxshokunin\n- MMeent\n- Myers Carpenter\n- Nándor István Krácser\n- Nao YONASHIRO\n- Priya Wadhwa\n- Sharif Elgamal\n- Shuhei Kitagawa\n- Valentin Rothberg\n- Vincent Demeester\n\n# v0.9.0 Release - 2019-02-08\n\n## Bug Fixes\n* Bug fix with volumes declared in base images during multi-stage builds\n* Bug fix during snapshotting multi-stage builds.\n* Bug fix for caching with tar output.\n\n# v0.8.0 Release - 2019-01-29\n\n## New Features\n* Even faster snapshotting with godirwalk\n* Added TTL for caching\n\n## Updates\n* Change cache key calculation to be more reproducible.\n* Make the Digest calculation faster for locally-cached images.\n* Simplify snapshotting.\n\n## Bug Fixes\n* Fix bug with USER command and unpacking base images.\n* Added COPY --from=previous stage name/number validation\n\n# v0.7.0 Release - 2018-12-10\n\n## New Features\n* Add support for COPY --from an unrelated image\n\n## Updates\n* Speed up snapshotting by using filepath.SkipDir\n* Improve layer cache upload performance\n* Skip unpacking the base image in certain cases\n\n## Bug Fixes\n* Fix bug with call loop\n* Fix caching for multi-step builds\n\n# v0.6.0 Release - 2018-11-06\n\n## New Features\n* parse arg commands at the top of dockerfiles [#404](https://github.com/GoogleContainerTools/kaniko/pull/404)\n* Add buffering for large layers. [#428](https://github.com/GoogleContainerTools/kaniko/pull/428)\n* Separate Insecure Pull Options [#409](https://github.com/GoogleContainerTools/kaniko/pull/409)\n* Add support for .dockerignore file [#394](https://github.com/GoogleContainerTools/kaniko/pull/394)\n* Support insecure pull [#401](https://github.com/GoogleContainerTools/kaniko/pull/401)\n\n## Updates\n* Preserve options when doing a cache push [#423](https://github.com/GoogleContainerTools/kaniko/pull/423)\n* More cache cleanups: [#397](https://github.com/GoogleContainerTools/kaniko/pull/397)\n*  adding documentation for base image caching [#421](https://github.com/GoogleContainerTools/kaniko/pull/421)\n* Update go-containerregistry [#420](https://github.com/GoogleContainerTools/kaniko/pull/420)\n* Update README [#419](https://github.com/GoogleContainerTools/kaniko/pull/419)\n* Use remoteImage function when getting digest for cache [#413](https://github.com/GoogleContainerTools/kaniko/pull/413)\n* adding exit 1 when there are not enough command line vars passed to `… [#415](https://github.com/GoogleContainerTools/kaniko/pull/415)\n* \"Container Builder\" - > \"Cloud Build\" [#414](https://github.com/GoogleContainerTools/kaniko/pull/414)\n* adding the cache warmer to the release process [#412](https://github.com/GoogleContainerTools/kaniko/pull/412)\n\n## Bug Fixes\n* Fix bugs with .dockerignore and improve integration test [#424](https://github.com/GoogleContainerTools/kaniko/pull/424)\n* fix releasing the cache warmer [#418](https://github.com/GoogleContainerTools/kaniko/pull/418)\n\n\n# v0.5.0 Release - 2018-10-16\n\n## New Features\n* Persistent volume caching for base images [#383](https://github.com/GoogleContainerTools/kaniko/pull/383)\n\n## Updates\n* Use only the necessary files in the cache keys. [#387](https://github.com/GoogleContainerTools/kaniko/pull/387)\n* Change loglevel for copying files to debug (#303) [#393](https://github.com/GoogleContainerTools/kaniko/pull/393)\n* Improve IsDestDir functionality with filesystem info [#390](https://github.com/GoogleContainerTools/kaniko/pull/390)\n* Refactor the build loop. [#385](https://github.com/GoogleContainerTools/kaniko/pull/385)\n* Rework cache key generation a bit. [#375](https://github.com/GoogleContainerTools/kaniko/pull/375)\n\n## Bug Fixes\n* fix mispell [#396](https://github.com/GoogleContainerTools/kaniko/pull/396)\n* Update go-containerregistry dependency [#388](https://github.com/GoogleContainerTools/kaniko/pull/388)\n* chore: fix broken markdown (CHANGELOG.md) [#382](https://github.com/GoogleContainerTools/kaniko/pull/382)\n* Don't cut everything after an equals sign [#381](https://github.com/GoogleContainerTools/kaniko/pull/381)\n\n\n# v0.4.0 Release - 2018-10-01\n\n## New Features\n* Add a benchmark package to store and monitor timings. [#367](https://github.com/GoogleContainerTools/kaniko/pull/367)\n* Add layer caching to kaniko [#353](https://github.com/GoogleContainerTools/kaniko/pull/353)\n* Update issue templates [#340](https://github.com/GoogleContainerTools/kaniko/pull/340)\n* Separate --insecure-skip-tls-verify flag into two separate flags [#311](https://github.com/GoogleContainerTools/kaniko/pull/311)\n* Updated created by time for built image [#328](https://github.com/GoogleContainerTools/kaniko/pull/328)\n* Add Flag to Disable Push to Container Registry [#292](https://github.com/GoogleContainerTools/kaniko/pull/292)\n* Add a new flag to cleanup the filesystem at the end [#370](https://github.com/GoogleContainerTools/kaniko/pull/370)\n\n## Updates\n* Update README to add information about layer caching [#364](https://github.com/GoogleContainerTools/kaniko/pull/364)\n* Suppress usage upon Run error [#356](https://github.com/GoogleContainerTools/kaniko/pull/356)\n* Refactor build into stageBuilder type [#343](https://github.com/GoogleContainerTools/kaniko/pull/343)\n* Replace gometalinter with GolangCI-Lint [#349](https://github.com/GoogleContainerTools/kaniko/pull/349)\n* Add Key() to LayeredMap and Snapshotter [#337](https://github.com/GoogleContainerTools/kaniko/pull/337)\n* Add CacheCommand to DockerCommand interface [#336](https://github.com/GoogleContainerTools/kaniko/pull/336)\n* Extract filesystem in order rather than in reverse [#326](https://github.com/GoogleContainerTools/kaniko/pull/326)\n* Configure logs to show colors [#327](https://github.com/GoogleContainerTools/kaniko/pull/327)\n* Enable shared config for s3 [#321](https://github.com/GoogleContainerTools/kaniko/pull/321)\n* Update go-containerregistry. [#305](https://github.com/GoogleContainerTools/kaniko/pull/305)\n* Tag latest in cloudbuild.yaml [#287](https://github.com/GoogleContainerTools/kaniko/pull/287)\n* Set default home value [#281](https://github.com/GoogleContainerTools/kaniko/pull/281)\n* Update deps [#265](https://github.com/GoogleContainerTools/kaniko/pull/265)\n* Update go-containerregistry dep and remove unnecessary Options [#376](https://github.com/GoogleContainerTools/kaniko/pull/376)\n* Add a bit more context to layer offset failures [#264](https://github.com/GoogleContainerTools/kaniko/pull/264)\n\n## Bug Fixes\n* Whitelist /busybox in the debug image [#369](https://github.com/GoogleContainerTools/kaniko/pull/369)\n* Check --cache-repo is provided with --cache and --no-push [#374](https://github.com/GoogleContainerTools/kaniko/pull/374)\n* Fixes a whitelist issue when untarring files in ADD commands. [#371](https://github.com/GoogleContainerTools/kaniko/pull/371)\n* set default HOME env properly [#341](https://github.com/GoogleContainerTools/kaniko/pull/341)\n* Review config for cmd/entrypoint after building a stage [#348](https://github.com/GoogleContainerTools/kaniko/pull/348)\n* Enable overwriting of links (solves #351) [#360](https://github.com/GoogleContainerTools/kaniko/pull/360)\n* Only return stdout when running commands for integration tests [#363](https://github.com/GoogleContainerTools/kaniko/pull/363)\n* Whitelist /etc/mtab [#347](https://github.com/GoogleContainerTools/kaniko/pull/347)\n* Added a KanikoStage type for each stage of a Dockerfile [#320](https://github.com/GoogleContainerTools/kaniko/pull/320)\n* Make sure paths are absolute before matching files to wildcard sources [#330](https://github.com/GoogleContainerTools/kaniko/pull/330)\n* Build each kaniko image separately [#324](https://github.com/GoogleContainerTools/kaniko/pull/324)\n* support multiple tags when writing to a tarfile [#323](https://github.com/GoogleContainerTools/kaniko/pull/323)\n* Snapshot only specific files for COPY [#319](https://github.com/GoogleContainerTools/kaniko/pull/319)\n* Remove some constraints from our Gopkg.toml. [#318](https://github.com/GoogleContainerTools/kaniko/pull/318)\n* Always snapshot files in COPY and RUN commands [#289](https://github.com/GoogleContainerTools/kaniko/pull/289)\n* Refactor command line arguments and the executor [#306](https://github.com/GoogleContainerTools/kaniko/pull/306)\n* Fix bug in SaveStage function for multistage builds [#295](https://github.com/GoogleContainerTools/kaniko/pull/295)\n* Get absolute path of file before checking whitelist [#293](https://github.com/GoogleContainerTools/kaniko/pull/293)\n* Fix support for insecure registry [#169](https://github.com/GoogleContainerTools/kaniko/pull/169)\n* ignore sockets when adding to tar [#288](https://github.com/GoogleContainerTools/kaniko/pull/288)\n* fix add command bug when adding remote URLs [#277](https://github.com/GoogleContainerTools/kaniko/pull/277)\n* Environment variables with multiple '=' are not parsed correctly [#278](https://github.com/GoogleContainerTools/kaniko/pull/278)\n* Ensure cmd.SysProcAttr is set before modifying it [#275](https://github.com/GoogleContainerTools/kaniko/pull/275)\n* Don't copy same files twice in copy integration tests [#273](https://github.com/GoogleContainerTools/kaniko/pull/273)\n* Extract intermediate stages to filesystem [#266](https://github.com/GoogleContainerTools/kaniko/pull/266)\n* Fix process group handling. [#271](https://github.com/GoogleContainerTools/kaniko/pull/271)\n* Only add whiteout files once [#270](https://github.com/GoogleContainerTools/kaniko/pull/270)\n* Fix handling of the volume directive [#334](https://github.com/GoogleContainerTools/kaniko/pull/334)\n\n\n# v0.3.0 Release - 2018-07-31\n## New Features\n* Local integration testing [#256](https://github.com/GoogleContainerTools/kaniko/pull/256)\n* Add --target flag for multistage builds [#255](https://github.com/GoogleContainerTools/kaniko/pull/255)\n* Look for on cluster credentials using k8s chain [#243](https://github.com/GoogleContainerTools/kaniko/pull/243)\n\n## Bug Fixes\n* Kill grandchildren spun up by child processes [#247](https://github.com/GoogleContainerTools/kaniko/issues/247)\n* Fix bug in copy command [#221](https://github.com/GoogleContainerTools/kaniko/issues/221)\n* Multi-stage errors when referencing earlier stages [#233](https://github.com/GoogleContainerTools/kaniko/issues/233)\n\n\n# v0.2.0 Release - 2018-07-09\n\n## New Features\n* Support for adding different source contexts, including Amazon S3 [#195](https://github.com/GoogleContainerTools/kaniko/issues/195)\n* Added --reproducible [#205](https://github.com/GoogleContainerTools/kaniko/pull/205) and --single-snapshot [#204](https://github.com/GoogleContainerTools/kaniko/pull/204) flags\n* Documented running kaniko in gVisor [#194](https://github.com/GoogleContainerTools/kaniko/pull/194)\n* Update go-containerregistry so kaniko works better with Harbor and Gitlab[#227](https://github.com/GoogleContainerTools/kaniko/pull/227)\n* Push image to multiple destinations [#184](https://github.com/GoogleContainerTools/kaniko/pull/184)\n\n# v0.1.0 Release - 2018-05-17\n\n## New Features\n* The majority of Dockerfile commands are feature complete [#1](https://github.com/GoogleContainerTools/kaniko/issues/1)\n* Support for multi-stage Dockerfile builds [#141](https://github.com/GoogleContainerTools/kaniko/pull/141)\n* Refactored integration tests [#126](https://github.com/GoogleContainerTools/kaniko/pull/126)\n* Added debug image with a busybox shell [#171](https://github.com/GoogleContainerTools/kaniko/pull/1710)\n* Added credential helper for Amazon ECR [#167](https://github.com/GoogleContainerTools/kaniko/pull/167)\n\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to Kaniko\n\nWe'd love to accept your patches and contributions to this project!!\n\nTo get started developing, see our [DEVELOPMENT.md](./DEVELOPMENT.md).\n\nIn this file you'll find info on:\n\n- [Contributing to Kaniko](#contributing-to-kaniko)\n  - [Contributor License Agreement](#contributor-license-agreement)\n  - [Code reviews](#code-reviews)\n  - [Standards](#standards)\n    - [Commit Messages](#commit-messages)\n    - [Coding standards](#coding-standards)\n  - [Finding something to work on](#finding-something-to-work-on)\n  [code](#coding-standards)\n- [Finding something to work on](#finding-something-to-work-on)\n\n## Contributor License Agreement\n\nContributions to this project must be accompanied by a Contributor License\nAgreement. You (or your employer) retain the copyright to your contribution;\nthis simply gives us permission to use and redistribute your contributions as\npart of the project. Head over to <https://cla.developers.google.com/> to see\nyour current agreements on file or to sign a new one.\n\nYou generally only need to submit a CLA once, so if you've already submitted one\n(even if it was for a different project), you probably don't need to do it\nagain.\n\n## Code reviews\n\nAll submissions, including submissions by project members, require review. We\nuse GitHub pull requests for this purpose. Consult\n[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more\ninformation on using pull requests.\n\n## Standards\n\nThis section describes the standards we will try to maintain in this repo.\n\n### Commit Messages\n\nAll commit messages should follow\n[these best practices](https://chris.beams.io/posts/git-commit/), specifically:\n\n- Start with a subject line\n- Contain a body that explains _why_ you're making the change you're making\n- Reference an issue number if one exists, closing it if applicable (with text\n  such as\n  [\"Fixes #245\" or \"Closes #111\"](https://help.github.com/articles/closing-issues-using-keywords/))\n\nAim for [2 paragraphs in the body](https://www.youtube.com/watch?v=PJjmw9TRB7s).\nNot sure what to put? Include:\n\n- What is the problem being solved?\n- Why is this the best approach?\n- What other approaches did you consider?\n- What side effects will this approach have?\n- What future work remains to be done?\n\n### Coding standards\n\nThe code in this repo should follow best practices, specifically:\n\n- [Go code review comments](https://go.dev/wiki/CodeReviewComments)\n\n## Finding something to work on\n\nThanks so much for considering contributing to our project!! We hope very much\nyou can find something interesting to work on:\n\n- To find issues that we particularly would like contributors to tackle, look\n  for\n  [issues with the \"help wanted\" label](https://github.com/GoogleContainerTools/kaniko/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22).\n- Issues that are good for new folks will additionally be marked with\n  [\"good first issue\"](https://github.com/GoogleContainerTools/kaniko/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22).\n"
  },
  {
    "path": "DEVELOPMENT.md",
    "content": "# Development\n\nThis doc explains the development workflow so you can get started\n[contributing](CONTRIBUTING.md) to Kaniko!\n\n## Getting started\n\nFirst you will need to setup your GitHub account and create a fork:\n\n1. Create [a GitHub account](https://github.com/join)\n1. Setup [GitHub access via\n   SSH](https://help.github.com/articles/connecting-to-github-with-ssh/)\n1. [Create and checkout a repo fork](#checkout-your-fork)\n\nOnce you have those, you can iterate on kaniko:\n\n1. [Run your instance of kaniko](README.md#running-kaniko)\n1. [Verifying kaniko builds](#verifying-kaniko-builds)\n1. [Run kaniko tests](#testing-kaniko)\n\nWhen you're ready, you can [create a PR](#creating-a-pr)!\n\n## Checkout your fork\n\nThe Go tools require that you clone the repository to the `src/github.com/GoogleContainerTools/kaniko` directory\nin your [`GOPATH`](https://go.dev/wiki/SettingGOPATH).\n\nTo check out this repository:\n\n1. Create your own [fork of this\n  repo](https://help.github.com/articles/fork-a-repo/)\n2. Clone it to your machine:\n\n  ```shell\n  mkdir -p ${GOPATH}/src/github.com/GoogleContainerTools\n  cd ${GOPATH}/src/github.com/GoogleContainerTools\n  git clone git@github.com:${YOUR_GITHUB_USERNAME}/kaniko.git\n  cd kaniko\n  git remote add upstream git@github.com:GoogleContainerTools/kaniko.git\n  git remote set-url --push upstream no_push\n  ```\n\n_Adding the `upstream` remote sets you up nicely for regularly [syncing your\nfork](https://help.github.com/articles/syncing-a-fork/)._\n\n## Verifying kaniko builds\n\nImages built with kaniko should be no different from images built elsewhere.\nWhile you iterate on kaniko, you can verify images built with kaniko by:\n\n1. Build the image using another system, such as `docker build`\n2. Use [`container-diff`](https://github.com/GoogleContainerTools/container-diff) to diff the images\n\n## Testing kaniko\n\nkaniko has both [unit tests](#unit-tests) and [integration tests](#integration-tests).\n\nPlease note that the tests require a Linux machine - use Vagrant to quickly set\nup the test environment needed if you work with macOS or Windows.\n\n### Unit Tests\n\nThe unit tests live with the code they test and can be run with:\n\n```shell\nmake test\n```\n\n_These tests will not run correctly unless you have [checked out your fork into your `$GOPATH`](#checkout-your-fork)._\n\n### Lint Checks\n\nThe helper script to install and run lint is placed here at the root of project.\n\n```shell\n./hack/linter.sh\n```\n\nTo fix any `gofmt` issues, you can simply run `gofmt` with `-w` flag like this\n\n```shell\nfind . -name \"*.go\" | grep -v vendor/ | xargs gofmt -l -s -w\n```\n\n### Integration tests\n\nCurrently the integration tests that live in [`integration`](./integration) can be run against your own gcloud space or a local registry.\n\nThese tests will be kicked off by [reviewers](#reviews) for submitted PRs using GitHub Actions.\n\nIn either case, you will need the following tools:\n\n* [`container-diff`](https://github.com/GoogleContainerTools/container-diff#installation)\n\n#### GCloud\n\nTo run integration tests with your GCloud Storage, you will also need the following tools:\n\n* [`gcloud`](https://cloud.google.com/sdk/install)\n* [`gsutil`](https://cloud.google.com/storage/docs/gsutil_install)\n* A bucket in [GCS](https://cloud.google.com/storage/) which you have write access to via\n  the user currently logged into `gcloud`\n* An image repo which you have write access to via the user currently logged into `gcloud`\n* A docker account and a `~/.docker/config.json` with login credentials if you run\n  into rate limiting problems during tests.\n\nOnce this step done, you must override the project using environment variables:\n\n* `GCS_BUCKET` - The name of your GCS bucket\n* `IMAGE_REPO` - The path to your docker image repo\n\nThis can be done as follows:\n\n```shell\nexport GCS_BUCKET=\"gs://<your bucket>\"\nexport IMAGE_REPO=\"gcr.io/somerepo\"\n```\n\nLogin for both user and application credentials\n```shell\ngcloud auth login\ngcloud auth application-default login\n```\n\nThen you can launch integration tests as follows:\n\n```shell\nmake integration-test\n```\n\nYou can also run tests with `go test`, for example to run tests individually:\n\n```shell\ngo test ./integration -v --bucket $GCS_BUCKET --repo $IMAGE_REPO -run TestLayers/test_layer_Dockerfile_test_copy_bucket\n```\n\nThese tests will be kicked off by [reviewers](#reviews) for submitted PRs by the kokoro task.\n\n#### Local integration tests\n\nTo run integration tests locally against a local registry and gcs bucket, set the LOCAL environment variable\n\n```shell\nLOCAL=1 make integration-test\n```\n\n#### Running integration tests for a specific dockerfile\n\nIn order to test only specific dockerfiles during local integration testing, you can specify a pattern to match against inside the integration/dockerfiles directory.\n\n```shell\nDOCKERFILE_PATTERN=\"Dockerfile_test_add*\" make integration-test-run\n```\n\nThis will only run dockerfiles that match the pattern `Dockerfile_test_add*`\n\n\n\n### Benchmarking\n\nThe goal is for Kaniko to be at least as fast at building Dockerfiles as Docker is, and to that end, we've built\nin benchmarking to check the speed of not only each full run, but also how long each step of each run takes. To turn\non benchmarking, just set the `BENCHMARK_FILE` environment variable, and kaniko will output all the benchmark info\nof each run to that file location.\n\n```shell\ndocker run -v $(pwd):/workspace -v ~/.config:/root/.config \\\n-e BENCHMARK_FILE=/workspace/benchmark_file \\\ngcr.io/kaniko-project/executor:latest \\\n--dockerfile=<path to Dockerfile> --context=/workspace \\\n--destination=gcr.io/my-repo/my-image\n```\nAdditionally, the integration tests can output benchmarking information to a `benchmarks` directory under the\n`integration` directory if the `BENCHMARK` environment variable is set to `true.`\n\n```shell\nBENCHMARK=true go test -v --bucket $GCS_BUCKET --repo $IMAGE_REPO\n```\n\n#### Benchmarking your GCB runs\nIf you are GCB builds are slow, you can check which phases in kaniko are bottlenecks or taking more time.\nTo do this, add \"BENCHMARK_ENV\" to your cloudbuild.yaml like this.\n```shell script\nsteps:\n- name: 'gcr.io/kaniko-project/executor:latest'\n  args:\n  - --build-arg=NUM=${_COUNT}\n  - --no-push\n  - --snapshot-mode=redo\n  env:\n  - 'BENCHMARK_FILE=gs://$PROJECT_ID/gcb/benchmark_file'\n```\nYou can download the file `gs://$PROJECT_ID/gcb/benchmark_file` using `gsutil cp` command.\n\n## Creating a PR\n\nWhen you have changes you would like to propose to kaniko, you will need to:\n\n1. Ensure the commit message(s) describe what issue you are fixing and how you are fixing it\n   (include references to [issue numbers](https://help.github.com/articles/closing-issues-using-keywords/)\n   if appropriate)\n1. [Create a pull request](https://help.github.com/articles/creating-a-pull-request-from-a-fork/)\n\n### Reviews\n\nEach PR must be reviewed by a maintainer. This maintainer will add the `kokoro:run` label\nto a PR to kick of [the integration tests](#integration-tests), which must pass for the PR\nto be submitted.\n"
  },
  {
    "path": "LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2018 Google LLC\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "MAINTAINERS",
    "content": ""
  },
  {
    "path": "Makefile",
    "content": "# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Bump these on release\nVERSION_MAJOR ?= 1\nVERSION_MINOR ?= 24\nVERSION_BUILD ?= 0\n\nVERSION ?= v$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_BUILD)\nVERSION_PACKAGE = $(REPOPATH/pkg/version)\n\nSHELL := /bin/bash\nGOOS ?= $(shell go env GOOS)\nGOARCH ?= $(shell go env GOARCH)\nORG := github.com/GoogleContainerTools\nPROJECT := kaniko\nREGISTRY?=gcr.io/kaniko-project\n\nREPOPATH ?= $(ORG)/$(PROJECT)\nVERSION_PACKAGE = $(REPOPATH)/pkg/version\n\nGO_FILES := $(shell find . -type f -name '*.go' -not -path \"./vendor/*\")\nGO_LDFLAGS := '-extldflags \"-static\"\nGO_LDFLAGS += -X $(VERSION_PACKAGE).version=$(VERSION)\nGO_LDFLAGS += -w -s # Drop debugging symbols.\nGO_LDFLAGS += '\n\nEXECUTOR_PACKAGE = $(REPOPATH)/cmd/executor\nWARMER_PACKAGE = $(REPOPATH)/cmd/warmer\nKANIKO_PROJECT = $(REPOPATH)/kaniko\nBUILD_ARG ?=\n\n# Force using Go Modules and always read the dependencies from\n# the `vendor` folder.\nexport GO111MODULE = on\nexport GOFLAGS = -mod=vendor\n\n\nout/executor: $(GO_FILES)\n\tGOARCH=$(GOARCH) GOOS=$(GOOS) CGO_ENABLED=0 go build -ldflags $(GO_LDFLAGS) -o $@ $(EXECUTOR_PACKAGE)\n\nout/warmer: $(GO_FILES)\n\tGOARCH=$(GOARCH) GOOS=$(GOOS) CGO_ENABLED=0 go build -ldflags $(GO_LDFLAGS) -o $@ $(WARMER_PACKAGE)\n\n.PHONY: install-container-diff\ninstall-container-diff:\n\t@ curl -LO https://github.com/GoogleContainerTools/container-diff/releases/download/v0.17.0/container-diff-$(GOOS)-amd64 && \\\n\t\tchmod +x container-diff-$(GOOS)-amd64 && sudo mv container-diff-$(GOOS)-amd64 /usr/local/bin/container-diff\n\n.PHONY: k3s-setup\nk3s-setup:\n\t@ ./scripts/k3s-setup.sh\n\n.PHONY: test\ntest: out/executor\n\t@ ./scripts/test.sh\n\ntest-with-coverage: test\n\tgo tool cover -html=out/coverage.out\n\n\n.PHONY: integration-test\nintegration-test:\n\t@ ./scripts/integration-test.sh\n\n.PHONY: integration-test-run\nintegration-test-run:\n\t@ ./scripts/integration-test.sh -run \"TestRun\"\n\n.PHONY: integration-test-layers\nintegration-test-layers:\n\t@ ./scripts/integration-test.sh -run \"TestLayers\"\n\n.PHONY: integration-test-k8s\nintegration-test-k8s:\n\t@ ./scripts/integration-test.sh -run \"TestK8s\"\n\n.PHONY: integration-test-misc\nintegration-test-misc:\n\t$(eval RUN_ARG=$(shell ./scripts/misc-integration-test.sh))\n\t@ ./scripts/integration-test.sh -run \"$(RUN_ARG)\"\n\n.PHONY: k8s-executor-build-push\nk8s-executor-build-push:\n\tDOCKER_BUILDKIT=1 docker build ${BUILD_ARG} --build-arg=GOARCH=$(GOARCH) --build-arg=TARGETOS=linux -t $(REGISTRY)/executor:latest -f deploy/Dockerfile --target kaniko-executor .\n\tdocker push $(REGISTRY)/executor:latest\n\n\n.PHONY: images\nimages: DOCKER_BUILDKIT=1\nimages:\n\tdocker build ${BUILD_ARG} --build-arg=TARGETARCH=$(GOARCH) --build-arg=TARGETOS=linux -t $(REGISTRY)/executor:latest -f deploy/Dockerfile --target kaniko-executor .\n\tdocker build ${BUILD_ARG} --build-arg=TARGETARCH=$(GOARCH) --build-arg=TARGETOS=linux -t $(REGISTRY)/executor:debug -f deploy/Dockerfile --target kaniko-debug .\n\tdocker build ${BUILD_ARG} --build-arg=TARGETARCH=$(GOARCH) --build-arg=TARGETOS=linux -t $(REGISTRY)/executor:slim -f deploy/Dockerfile --target kaniko-slim .\n\tdocker build ${BUILD_ARG} --build-arg=TARGETARCH=$(GOARCH) --build-arg=TARGETOS=linux -t $(REGISTRY)/warmer:latest -f deploy/Dockerfile --target kaniko-warmer .\n\n.PHONY: push\npush:\n\tdocker push $(REGISTRY)/executor:latest\n\tdocker push $(REGISTRY)/executor:debug\n\tdocker push $(REGISTRY)/executor:slim\n\tdocker push $(REGISTRY)/warmer:latest\n"
  },
  {
    "path": "README.md",
    "content": "# 🧊 This project is archived and no longer developed or maintained. 🧊\n\nThe code remains available for historic purposes.\n\nThe README as of the archival date remains unchanged below for historic purposes.\n\n-----\n\n# kaniko - Build Images In Kubernetes\n\n## 🚨NOTE: kaniko is not an officially supported Google product🚨\n\n[![Unit tests](https://github.com/GoogleContainerTools/kaniko/actions/workflows/unit-tests.yaml/badge.svg)](https://github.com/GoogleContainerTools/kaniko/actions/workflows/unit-tests.yaml)\n[![Integration tests](https://github.com/GoogleContainerTools/kaniko/actions/workflows/integration-tests.yaml/badge.svg)](https://github.com/GoogleContainerTools/kaniko/actions/workflows/integration-tests.yaml)\n[![Build images](https://github.com/GoogleContainerTools/kaniko/actions/workflows/images.yaml/badge.svg)](https://github.com/GoogleContainerTools/kaniko/actions/workflows/images.yaml)\n[![Go Report Card](https://goreportcard.com/badge/github.com/GoogleContainerTools/kaniko)](https://goreportcard.com/report/github.com/GoogleContainerTools/kaniko)\n\n![kaniko logo](logo/Kaniko-Logo.png)\n\nkaniko is a tool to build container images from a Dockerfile, inside a container\nor Kubernetes cluster.\n\nkaniko doesn't depend on a Docker daemon and executes each command within a\nDockerfile completely in userspace. This enables building container images in\nenvironments that can't easily or securely run a Docker daemon, such as a\nstandard Kubernetes cluster.\n\nkaniko is meant to be run as an image: `gcr.io/kaniko-project/executor`. We do\n**not** recommend running the kaniko executor binary in another image, as it\nmight not work as you expect - see [Known Issues](#known-issues).\n\nWe'd love to hear from you! Join us on\n[#kaniko Kubernetes Slack](https://kubernetes.slack.com/messages/CQDCHGX7Y/)\n\n:mega: **Please fill out our\n[quick 5-question survey](https://forms.gle/HhZGEM33x4FUz9Qa6)** so that we can\nlearn how satisfied you are with kaniko, and what improvements we should make.\nThank you! :dancers:\n\n_If you are interested in contributing to kaniko, see\n[DEVELOPMENT.md](DEVELOPMENT.md) and [CONTRIBUTING.md](CONTRIBUTING.md)._\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n**Table of Contents** _generated with\n[DocToc](https://github.com/thlorenz/doctoc)_\n\n- [kaniko - Build Images In Kubernetes](#kaniko---build-images-in-kubernetes)\n  - [🚨NOTE: kaniko is not an officially supported Google product🚨](#note-kaniko-is-not-an-officially-supported-google-product)\n  - [Community](#community)\n  - [How does kaniko work?](#how-does-kaniko-work)\n  - [Known Issues](#known-issues)\n  - [Demo](#demo)\n  - [Tutorial](#tutorial)\n  - [Using kaniko](#using-kaniko)\n    - [kaniko Build Contexts](#kaniko-build-contexts)\n    - [Using Azure Blob Storage](#using-azure-blob-storage)\n    - [Using Private Git Repository](#using-private-git-repository)\n    - [Using Standard Input](#using-standard-input)\n    - [Running kaniko](#running-kaniko)\n      - [Running kaniko in a Kubernetes cluster](#running-kaniko-in-a-kubernetes-cluster)\n        - [Kubernetes secret](#kubernetes-secret)\n      - [Running kaniko in gVisor](#running-kaniko-in-gvisor)\n      - [Running kaniko in Google Cloud Build](#running-kaniko-in-google-cloud-build)\n      - [Running kaniko in Docker](#running-kaniko-in-docker)\n    - [Caching](#caching)\n      - [Caching Layers](#caching-layers)\n      - [Caching Base Images](#caching-base-images)\n    - [Pushing to Different Registries](#pushing-to-different-registries)\n      - [Pushing to Docker Hub](#pushing-to-docker-hub)\n      - [Pushing to Google GCR](#pushing-to-google-gcr)\n      - [Pushing to GCR using Workload Identity](#pushing-to-gcr-using-workload-identity)\n      - [Pushing to Amazon ECR](#pushing-to-amazon-ecr)\n      - [Pushing to Azure Container Registry](#pushing-to-azure-container-registry)\n      - [Pushing to JFrog Container Registry or to JFrog Artifactory](#pushing-to-jfrog-container-registry-or-to-jfrog-artifactory)\n    - [Additional Flags](#additional-flags)\n      - [Flag `--build-arg`](#flag---build-arg)\n      - [Flag `--cache`](#flag---cache)\n      - [Flag `--cache-dir`](#flag---cache-dir)\n      - [Flag `--cache-repo`](#flag---cache-repo)\n      - [Flag `--cache-copy-layers`](#flag---cache-copy-layers)\n      - [Flag `--cache-run-layers`](#flag---cache-run-layers)\n      - [Flag `--cache-ttl duration`](#flag---cache-ttl-duration)\n      - [Flag `--cleanup`](#flag---cleanup)\n      - [Flag `--compressed-caching`](#flag---compressed-caching)\n      - [Flag `--context-sub-path`](#flag---context-sub-path)\n      - [Flag `--custom-platform`](#flag---custom-platform)\n      - [Flag `--digest-file`](#flag---digest-file)\n      - [Flag `--dockerfile`](#flag---dockerfile)\n      - [Flag `--force`](#flag---force)\n      - [Flag `--git`](#flag---git)\n      - [Flag `--image-name-with-digest-file`](#flag---image-name-with-digest-file)\n      - [Flag `--image-name-tag-with-digest-file`](#flag---image-name-tag-with-digest-file)\n      - [Flag `--insecure`](#flag---insecure)\n      - [Flag `--insecure-pull`](#flag---insecure-pull)\n      - [Flag `--insecure-registry`](#flag---insecure-registry)\n      - [Flag `--label`](#flag---label)\n      - [Flag `--log-format`](#flag---log-format)\n      - [Flag `--log-timestamp`](#flag---log-timestamp)\n      - [Flag `--no-push`](#flag---no-push)\n      - [Flag `--no-push-cache`](#flag---no-push-cache)\n      - [Flag `--oci-layout-path`](#flag---oci-layout-path)\n      - [Flag `--push-retry`](#flag---push-retry)\n      - [Flag `--registry-certificate`](#flag---registry-certificate)\n      - [Flag `--registry-client-cert`](#flag---registry-client-cert)\n      - [Flag `--registry-map`](#flag---registry-map)\n      - [Flag `--registry-mirror`](#flag---registry-mirror)\n      - [Flag `--skip-default-registry-fallback`](#flag---skip-default-registry-fallback)\n      - [Flag `--reproducible`](#flag---reproducible)\n      - [Flag `--single-snapshot`](#flag---single-snapshot)\n      - [Flag `--skip-push-permission-check`](#flag---skip-push-permission-check)\n      - [Flag `--skip-tls-verify`](#flag---skip-tls-verify)\n      - [Flag `--skip-tls-verify-pull`](#flag---skip-tls-verify-pull)\n      - [Flag `--skip-tls-verify-registry`](#flag---skip-tls-verify-registry)\n      - [Flag `--skip-unused-stages`](#flag---skip-unused-stages)\n      - [Flag `--snapshot-mode`](#flag---snapshot-mode)\n      - [Flag `--tar-path`](#flag---tar-path)\n      - [Flag `--target`](#flag---target)\n      - [Flag `--use-new-run`](#flag---use-new-run)\n      - [Flag `--verbosity`](#flag---verbosity)\n      - [Flag `--ignore-var-run`](#flag---ignore-var-run)\n      - [Flag `--ignore-path`](#flag---ignore-path)\n      - [Flag `--image-fs-extract-retry`](#flag---image-fs-extract-retry)\n      - [Flag `--image-download-retry`](#flag---image-download-retry)\n    - [Debug Image](#debug-image)\n  - [Security](#security)\n    - [Verifying Signed Kaniko Images](#verifying-signed-kaniko-images)\n  - [Kaniko Builds - Profiling](#kaniko-builds---profiling)\n  - [Creating Multi-arch Container Manifests Using Kaniko and Manifest-tool](#creating-multi-arch-container-manifests-using-kaniko-and-manifest-tool)\n    - [General Workflow](#general-workflow)\n    - [Limitations and Pitfalls](#limitations-and-pitfalls)\n    - [Example CI Pipeline (GitLab)](#example-ci-pipeline-gitlab)\n      - [Building the Separate Container Images](#building-the-separate-container-images)\n      - [Merging the Container Manifests](#merging-the-container-manifests)\n      - [On the Note of Adding Versioned Tags](#on-the-note-of-adding-versioned-tags)\n  - [Comparison with Other Tools](#comparison-with-other-tools)\n  - [Community](#community-1)\n  - [Limitations](#limitations)\n    - [mtime and snapshotting](#mtime-and-snapshotting)\n  - [References](#references)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Community\n\nWe'd love to hear from you! Join\n[#kaniko on Kubernetes Slack](https://kubernetes.slack.com/messages/CQDCHGX7Y/)\n\n## How does kaniko work?\n\nThe kaniko executor image is responsible for building an image from a Dockerfile\nand pushing it to a registry. Within the executor image, we extract the\nfilesystem of the base image (the FROM image in the Dockerfile). We then execute\nthe commands in the Dockerfile, snapshotting the filesystem in userspace after\neach one. After each command, we append a layer of changed files to the base\nimage (if there are any) and update image metadata.\n\n## Known Issues\n\n- kaniko does not support building Windows containers.\n- Running kaniko in any Docker image other than the official kaniko image is not\n  supported due to implementation details.\n  - This includes copying the kaniko executables from the official image into\n    another image (e.g. a Jenkins CI agent).\n  - In particular, it cannot use chroot or bind-mount because its container must\n    not require privilege, so it unpacks directly into its own container root\n    and may overwrite anything already there.\n- kaniko does not support the v1 Registry API\n  ([Registry v1 API Deprecation](https://www.docker.com/blog/registry-v1-api-deprecation/))\n\n## Demo\n\n![Demo](/docs/demo.gif)\n\n## Tutorial\n\nFor a detailed example of kaniko with local storage, please refer to a\n[getting started tutorial](./docs/tutorial.md).\n\nPlease see [References](#References) for more docs & video tutorials\n\n## Using kaniko\n\nTo use kaniko to build and push an image for you, you will need:\n\n1. A [build context](#kaniko-build-contexts), aka something to build\n2. A [running instance of kaniko](#running-kaniko)\n\n### kaniko Build Contexts\n\nkaniko's build context is very similar to the build context you would send your\nDocker daemon for an image build; it represents a directory containing a\nDockerfile which kaniko will use to build your image. For example, a `COPY`\ncommand in your Dockerfile should refer to a file in the build context.\n\nYou will need to store your build context in a place that kaniko can access.\nRight now, kaniko supports these storage solutions:\n\n- GCS Bucket\n- S3 Bucket\n- Azure Blob Storage\n- Local Directory\n- Local Tar\n- Standard Input\n- Git Repository\n\n_Note about Local Directory: this option refers to a directory within the kaniko\ncontainer. If you wish to use this option, you will need to mount in your build\ncontext into the container as a directory._\n\n_Note about Local Tar: this option refers to a tar gz file within the kaniko\ncontainer. If you wish to use this option, you will need to mount in your build\ncontext into the container as a file._\n\n_Note about Standard Input: the only Standard Input allowed by kaniko is in\n`.tar.gz` format._\n\nIf using a GCS or S3 bucket, you will first need to create a compressed tar of\nyour build context and upload it to your bucket. Once running, kaniko will then\ndownload and unpack the compressed tar of the build context before starting the\nimage build.\n\nTo create a compressed tar, you can run:\n\n```shell\ntar -C <path to build context> -zcvf context.tar.gz .\n```\n\nThen, copy over the compressed tar into your bucket. For example, we can copy\nover the compressed tar to a GCS bucket with gsutil:\n\n```shell\ngsutil cp context.tar.gz gs://<bucket name>\n```\n\nWhen running kaniko, use the `--context` flag with the appropriate prefix to\nspecify the location of your build context:\n\n| Source             | Prefix                                                                | Example                                                                       |\n| ------------------ | --------------------------------------------------------------------- | ----------------------------------------------------------------------------- |\n| Local Directory    | dir://[path to a directory in the kaniko container]                   | `dir:///workspace`                                                            |\n| Local Tar Gz       | tar://[path to a .tar.gz in the kaniko container]                     | `tar:///path/to/context.tar.gz`                                               |\n| Standard Input     | tar://[stdin]                                                         | `tar://stdin`                                                                 |\n| GCS Bucket         | gs://[bucket name]/[path to .tar.gz]                                  | `gs://kaniko-bucket/path/to/context.tar.gz`                                   |\n| S3 Bucket          | s3://[bucket name]/[path to .tar.gz]                                  | `s3://kaniko-bucket/path/to/context.tar.gz`                                   |\n| Azure Blob Storage | https://[account].[azureblobhostsuffix]/[container]/[path to .tar.gz] | `https://myaccount.blob.core.windows.net/container/path/to/context.tar.gz`    |\n| Git Repository     | git://[repository url][#reference][#commit-id]                        | `git://github.com/acme/myproject.git#refs/heads/mybranch#<desired-commit-id>` |\n\nIf you don't specify a prefix, kaniko will assume a local directory. For\nexample, to use a GCS bucket called `kaniko-bucket`, you would pass in\n`--context=gs://kaniko-bucket/path/to/context.tar.gz`.\n\n### Using Azure Blob Storage\n\nIf you are using Azure Blob Storage for context file, you will need to pass\n[Azure Storage Account Access Key](https://docs.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string?toc=%2fazure%2fstorage%2fblobs%2ftoc.json)\nas an environment variable named `AZURE_STORAGE_ACCESS_KEY` through Kubernetes\nSecrets\n\n### Using Private Git Repository\n\nYou can use `Personal Access Tokens` for Build Contexts from Private\nRepositories from\n[GitHub](https://blog.github.com/2012-09-21-easier-builds-and-deployments-using-git-over-https-and-oauth/).\n\nYou can either pass this in as part of the git URL (e.g.,\n`git://TOKEN@github.com/acme/myproject.git#refs/heads/mybranch`) or using the\nenvironment variable `GIT_TOKEN`.\n\nYou can also pass `GIT_USERNAME` and `GIT_PASSWORD` (password being the token)\nif you want to be explicit about the username.\n\n### Using Standard Input\n\nIf running kaniko and using Standard Input build context, you will need to add\nthe docker or kubernetes `-i, --interactive` flag. Once running, kaniko will\nthen get the data from `STDIN` and create the build context as a compressed tar.\nIt will then unpack the compressed tar of the build context before starting the\nimage build. If no data is piped during the interactive run, you will need to\nsend the EOF signal by yourself by pressing `Ctrl+D`.\n\nComplete example of how to interactively run kaniko with `.tar.gz` Standard\nInput data, using docker:\n\n```shell\necho -e 'FROM alpine \\nRUN echo \"created from standard input\"' > Dockerfile | tar -cf - Dockerfile | gzip -9 | docker run \\\n  --interactive -v $(pwd):/workspace gcr.io/kaniko-project/executor:latest \\\n  --context tar://stdin \\\n  --destination=<gcr.io/$project/$image:$tag>\n```\n\nComplete example of how to interactively run kaniko with `.tar.gz` Standard\nInput data, using Kubernetes command line with a temporary container and\ncompletely dockerless:\n\n```shell\necho -e 'FROM alpine \\nRUN echo \"created from standard input\"' > Dockerfile | tar -cf - Dockerfile | gzip -9 | kubectl run kaniko \\\n--rm --stdin=true \\\n--image=gcr.io/kaniko-project/executor:latest --restart=Never \\\n--overrides='{\n  \"apiVersion\": \"v1\",\n  \"spec\": {\n    \"containers\": [\n      {\n        \"name\": \"kaniko\",\n        \"image\": \"gcr.io/kaniko-project/executor:latest\",\n        \"stdin\": true,\n        \"stdinOnce\": true,\n        \"args\": [\n          \"--dockerfile=Dockerfile\",\n          \"--context=tar://stdin\",\n          \"--destination=gcr.io/my-repo/my-image\"\n        ],\n        \"volumeMounts\": [\n          {\n            \"name\": \"cabundle\",\n            \"mountPath\": \"/kaniko/ssl/certs/\"\n          },\n          {\n            \"name\": \"docker-config\",\n            \"mountPath\": \"/kaniko/.docker/\"\n          }\n        ]\n      }\n    ],\n    \"volumes\": [\n      {\n        \"name\": \"cabundle\",\n        \"configMap\": {\n          \"name\": \"cabundle\"\n        }\n      },\n      {\n        \"name\": \"docker-config\",\n        \"configMap\": {\n          \"name\": \"docker-config\"\n        }\n      }\n    ]\n  }\n}'\n```\n\n### Running kaniko\n\nThere are several different ways to deploy and run kaniko:\n\n- [In a Kubernetes cluster](#running-kaniko-in-a-kubernetes-cluster)\n- [In gVisor](#running-kaniko-in-gvisor)\n- [In Google Cloud Build](#running-kaniko-in-google-cloud-build)\n- [In Docker](#running-kaniko-in-docker)\n\n#### Running kaniko in a Kubernetes cluster\n\nRequirements:\n\n- Standard Kubernetes cluster (e.g. using\n  [GKE](https://cloud.google.com/kubernetes-engine/))\n- [Kubernetes Secret](#kubernetes-secret)\n- A [build context](#kaniko-build-contexts)\n\n##### Kubernetes secret\n\nTo run kaniko in a Kubernetes cluster, you will need a standard running\nKubernetes cluster and a Kubernetes secret, which contains the auth required to\npush the final image.\n\nTo create a secret to authenticate to Google Cloud Registry, follow these steps:\n\n1. Create a service account in the Google Cloud Console project you want to push\n   the final image to with `Storage Admin` permissions.\n2. Download a JSON key for this service account\n3. Rename the key to `kaniko-secret.json`\n4. To create the secret, run:\n\n```shell\nkubectl create secret generic kaniko-secret --from-file=<path to kaniko-secret.json>\n```\n\n_Note: If using a GCS bucket in the same GCP project as a build context, this\nservice account should now also have permissions to read from that bucket._\n\nThe Kubernetes Pod spec should look similar to this, with the args parameters\nfilled in:\n\n```yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: kaniko\nspec:\n  containers:\n    - name: kaniko\n      image: gcr.io/kaniko-project/executor:latest\n      args:\n        - \"--dockerfile=<path to Dockerfile within the build context>\"\n        - \"--context=gs://<GCS bucket>/<path to .tar.gz>\"\n        - \"--destination=<gcr.io/$PROJECT/$IMAGE:$TAG>\"\n      volumeMounts:\n        - name: kaniko-secret\n          mountPath: /secret\n      env:\n        - name: GOOGLE_APPLICATION_CREDENTIALS\n          value: /secret/kaniko-secret.json\n  restartPolicy: Never\n  volumes:\n    - name: kaniko-secret\n      secret:\n        secretName: kaniko-secret\n```\n\nThis example pulls the build context from a GCS bucket. To use a local directory\nbuild context, you could consider using configMaps to mount in small build\ncontexts.\n\n#### Running kaniko in gVisor\n\nRunning kaniko in [gVisor](https://github.com/google/gvisor) provides an\nadditional security boundary. You will need to add the `--force` flag to run\nkaniko in gVisor, since currently there isn't a way to determine whether or not\na container is running in gVisor.\n\n```shell\ndocker run --runtime=runsc -v $(pwd):/workspace -v ~/.config:/root/.config \\\ngcr.io/kaniko-project/executor:latest \\\n--dockerfile=<path to Dockerfile> --context=/workspace \\\n--destination=gcr.io/my-repo/my-image --force\n```\n\nWe pass in `--runtime=runsc` to use gVisor. This example mounts the current\ndirectory to `/workspace` for the build context and the `~/.config` directory\nfor GCR credentials.\n\n#### Running kaniko in Google Cloud Build\n\nRequirements:\n\n- A [build context](#kaniko-build-contexts)\n\nTo run kaniko in GCB, add it to your build config as a build step:\n\n```yaml\nsteps:\n  - name: gcr.io/kaniko-project/executor:latest\n    args:\n      [\n        \"--dockerfile=<path to Dockerfile within the build context>\",\n        \"--context=dir://<path to build context>\",\n        \"--destination=<gcr.io/$PROJECT/$IMAGE:$TAG>\",\n      ]\n```\n\nkaniko will build and push the final image in this build step.\n\n#### Running kaniko in Docker\n\nRequirements:\n\n- [Docker](https://docs.docker.com/install/)\n\nWe can run the kaniko executor image locally in a Docker daemon to build and\npush an image from a Dockerfile.\n\nFor example, when using gcloud and GCR you could run kaniko as follows:\n\n```shell\ndocker run \\\n    -v \"$HOME\"/.config/gcloud:/root/.config/gcloud \\\n    -v /path/to/context:/workspace \\\n    gcr.io/kaniko-project/executor:latest \\\n    --dockerfile /workspace/Dockerfile \\\n    --destination \"gcr.io/$PROJECT_ID/$IMAGE_NAME:$TAG\" \\\n    --context dir:///workspace/\n```\n\nThere is also a utility script [`run_in_docker.sh`](./run_in_docker.sh) that can\nbe used as follows:\n\n```shell\n./run_in_docker.sh <path to Dockerfile> <path to build context> <destination of final image>\n```\n\n_NOTE: `run_in_docker.sh` expects a path to a Dockerfile relative to the\nabsolute path of the build context._\n\nAn example run, specifying the Dockerfile in the container directory\n`/workspace`, the build context in the local directory\n`/home/user/kaniko-project`, and a Google Container Registry as a remote image\ndestination:\n\n```shell\n./run_in_docker.sh /workspace/Dockerfile /home/user/kaniko-project gcr.io/$PROJECT_ID/$TAG\n```\n\n### Caching\n\n#### Caching Layers\n\nkaniko can cache layers created by `RUN`(configured by flag\n`--cache-run-layers`) and `COPY` (configured by flag `--cache-copy-layers`)\ncommands in a remote repository. Before executing a command, kaniko checks the\ncache for the layer. If it exists, kaniko will pull and extract the cached layer\ninstead of executing the command. If not, kaniko will execute the command and\nthen push the newly created layer to the cache.\n\nNote that kaniko cannot read layers from the cache after a cache miss: once a\nlayer has not been found in the cache, all subsequent layers are built locally\nwithout consulting the cache.\n\nUsers can opt into caching by setting the `--cache=true` flag. A remote\nrepository for storing cached layers can be provided via the `--cache-repo`\nflag. If this flag isn't provided, a cached repo will be inferred from the\n`--destination` provided.\n\n#### Caching Base Images\n\nkaniko can cache images in a local directory that can be volume mounted into the\nkaniko pod. To do so, the cache must first be populated, as it is read-only. We\nprovide a kaniko cache warming image at `gcr.io/kaniko-project/warmer`:\n\n```shell\ndocker run -v $(pwd):/workspace gcr.io/kaniko-project/warmer:latest --cache-dir=/workspace/cache --image=<image to cache> --image=<another image to cache>\ndocker run -v $(pwd):/workspace gcr.io/kaniko-project/warmer:latest --cache-dir=/workspace/cache --dockerfile=<path to dockerfile>\ndocker run -v $(pwd):/workspace gcr.io/kaniko-project/warmer:latest --cache-dir=/workspace/cache --dockerfile=<path to dockerfile> --build-arg version=1.19\n```\n\n`--image` can be specified for any number of desired images. `--dockerfile` can\nbe specified for the path of dockerfile for cache.These command will combined to\ncache those images by digest in a local directory named `cache`. Once the cache\nis populated, caching is opted into with the same `--cache=true` flag as above.\nThe location of the local cache is provided via the `--cache-dir` flag,\ndefaulting to `/cache` as with the cache warmer. See the `examples` directory\nfor how to use with kubernetes clusters and persistent cache volumes.\n\n### Pushing to Different Registries\n\nkaniko uses Docker credential helpers to push images to a registry.\n\nkaniko comes with support for GCR, Docker `config.json` and Amazon ECR, but\nconfiguring another credential helper should allow pushing to a different\nregistry.\n\n#### Pushing to Docker Hub\n\nGet your docker registry user and password encoded in base64\n\n    echo -n USER:PASSWORD | base64\n\nCreate a `config.json` file with your Docker registry url and the previous\ngenerated base64 string\n\n**Note:** Please use v1 endpoint. See #1209 for more details\n\n```json\n{\n  \"auths\": {\n    \"https://index.docker.io/v1/\": {\n      \"auth\": \"xxxxxxxxxxxxxxx\"\n    }\n  }\n}\n```\n\nRun kaniko with the `config.json` inside `/kaniko/.docker/config.json`\n\n```shell\ndocker run -ti --rm -v `pwd`:/workspace -v `pwd`/config.json:/kaniko/.docker/config.json:ro gcr.io/kaniko-project/executor:latest --dockerfile=Dockerfile --destination=yourimagename\n```\n\n#### Pushing to Google GCR\n\nTo create a credentials to authenticate to Google Cloud Registry, follow these\nsteps:\n\n1. Create a\n   [service account](https://console.cloud.google.com/iam-admin/serviceaccounts)\n   or in the Google Cloud Console project you want to push the final image to\n   with `Storage Admin` permissions.\n2. Download a JSON key for this service account\n3. (optional) Rename the key to `kaniko-secret.json`, if you don't rename, you\n   have to change the name used the command(in the volume part)\n4. Run the container adding the path in GOOGLE_APPLICATION_CREDENTIALS env var\n\n```shell\ndocker run -ti --rm -e GOOGLE_APPLICATION_CREDENTIALS=/kaniko/config.json \\\n-v `pwd`:/workspace -v `pwd`/kaniko-secret.json:/kaniko/config.json:ro gcr.io/kaniko-project/executor:latest \\\n--dockerfile=Dockerfile --destination=yourimagename\n```\n\n#### Pushing to GCR using Workload Identity\n\nIf you have enabled Workload Identity on your GKE cluster then you can use the\nworkload identity to push built images to GCR without adding a\n`GOOGLE_APPLICATION_CREDENTIALS` in your kaniko pod specification.\n\nLearn more on how to\n[enable](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#enable_on_cluster)\nand\n[migrate existing apps](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#migrate_applications_to)\nto workload identity.\n\nTo authenticate using workload identity you need to run the kaniko pod using the\nKubernetes Service Account (KSA) bound to Google Service Account (GSA) which has\n`Storage.Admin` permissions to push images to Google Container registry.\n\nPlease follow the detailed steps\n[here](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#authenticating_to)\nto create a Kubernetes Service Account, Google Service Account and create an IAM\npolicy binding between the two to allow the Kubernetes Service account to act as\nthe Google service account.\n\nTo grant the Google Service account the right permission to push to GCR, run the\nfollowing GCR command\n\n```\ngcloud projects add-iam-policy-binding $PROJECT \\\n  --member=serviceAccount:[gsa-name]@${PROJECT}.iam.gserviceaccount.com \\\n  --role=roles/storage.objectAdmin\n```\n\nPlease ensure, kaniko pod is running in the namespace and with a Kubernetes\nService Account.\n\n#### Pushing to Amazon ECR\n\nThe Amazon ECR\n[credential helper](https://github.com/awslabs/amazon-ecr-credential-helper) is\nbuilt into the kaniko executor image.\n\n1. Configure credentials\n\n   1. You can use instance roles when pushing to ECR from a EC2 instance or from\n      EKS, by\n      [configuring the instance role permissions](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ECR_on_EKS.html)\n      (the AWS managed policy\n      `EC2InstanceProfileForImageBuilderECRContainerBuilds` provides broad\n      permissions to upload ECR images and may be used as configuration\n      baseline). Additionally, set `AWS_SDK_LOAD_CONFIG=true` as environment\n      variable within the kaniko pod. If running on an EC2 instance with an\n      instance profile, you may also need to set\n      `AWS_EC2_METADATA_DISABLED=true` for kaniko to pick up the correct\n      credentials.\n\n   2. Or you can create a Kubernetes secret for your `~/.aws/credentials` file\n      so that credentials can be accessed within the cluster. To create the\n      secret, run:\n      `shell kubectl create secret generic aws-secret --from-file=<path to .aws/credentials> `\n\nThe Kubernetes Pod spec should look similar to this, with the args parameters\nfilled in. Note that `aws-secret` volume mount and volume are only needed when\nusing AWS credentials from a secret, not when using instance roles.\n\n```yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: kaniko\nspec:\n  containers:\n    - name: kaniko\n      image: gcr.io/kaniko-project/executor:latest\n      args:\n        - \"--dockerfile=<path to Dockerfile within the build context>\"\n        - \"--context=s3://<bucket name>/<path to .tar.gz>\"\n        - \"--destination=<aws_account_id.dkr.ecr.region.amazonaws.com/my-repository:my-tag>\"\n      volumeMounts:\n        # when not using instance role\n        - name: aws-secret\n          mountPath: /root/.aws/\n  restartPolicy: Never\n  volumes:\n    # when not using instance role\n    - name: aws-secret\n      secret:\n        secretName: aws-secret\n```\n\n#### Pushing to Azure Container Registry\n\nAn ACR\n[credential helper](https://github.com/chrismellard/docker-credential-acr-env)\nis built into the kaniko executor image, which can be used to authenticate with\nwell-known Azure environmental information.\n\nTo configure credentials, you will need to do the following:\n\n1. Update the `credStore` section of `config.json`:\n\n```json\n{ \"credsStore\": \"acr\" }\n```\n\nA downside of this approach is that ACR authentication will be used for all\nregistries, which will fail if you also pull from DockerHub, GCR, etc. Thus, it\nis better to configure the credential tool only for your ACR registries by using\n`credHelpers` instead of `credsStore`:\n\n```json\n{ \"credHelpers\": { \"mycr.azurecr.io\": \"acr-env\" } }\n```\n\nYou can mount in the new config as a configMap:\n\n```shell\nkubectl create configmap docker-config --from-file=<path to config.json>\n```\n\n2. Configure credentials\n\nYou can create a Kubernetes secret with environment variables required for\nService Principal authentication and expose them to the builder container.\n\n```\nAZURE_CLIENT_ID=<clientID>\nAZURE_CLIENT_SECRET=<clientSecret>\nAZURE_TENANT_ID=<tenantId>\n```\n\nIf the above are not set then authentication falls back to managed service\nidentities and the MSI endpoint is attempted to be contacted which will work in\nvarious Azure contexts such as App Service and Azure Kubernetes Service where\nthe MSI endpoint will authenticate the MSI context the service is running under.\n\nThe Kubernetes Pod spec should look similar to this, with the args parameters\nfilled in. Note that `azure-secret` secret is only needed when using Azure\nService Principal credentials, not when using a managed service identity.\n\n```yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: kaniko\nspec:\n  containers:\n    - name: kaniko\n      image: gcr.io/kaniko-project/executor:latest\n      args:\n        - \"--dockerfile=<path to Dockerfile within the build context>\"\n        - \"--context=s3://<bucket name>/<path to .tar.gz>\"\n        - \"--destination=mycr.azurecr.io/my-repository:my-tag\"\n      envFrom:\n        # when authenticating with service principal\n        - secretRef:\n            name: azure-secret\n      volumeMounts:\n        - name: docker-config\n          mountPath: /kaniko/.docker/\n  volumes:\n    - name: docker-config\n      configMap:\n        name: docker-config\n  restartPolicy: Never\n```\n\n#### Pushing to JFrog Container Registry or to JFrog Artifactory\n\nKaniko can be used with both\n[JFrog Container Registry](https://www.jfrog.com/confluence/display/JFROG/JFrog+Container+Registry)\nand JFrog Artifactory.\n\nGet your JFrog Artifactory registry user and password encoded in base64\n\n    echo -n USER:PASSWORD | base64\n\nCreate a `config.json` file with your Artifactory Docker local registry URL and\nthe previous generated base64 string\n\n```json\n{\n  \"auths\": {\n    \"artprod.company.com\": {\n      \"auth\": \"xxxxxxxxxxxxxxx\"\n    }\n  }\n}\n```\n\nFor example, for Artifactory cloud users, the docker registry should be:\n`<company>.<local-repository-name>.io`.\n\nRun kaniko with the `config.json` inside `/kaniko/.docker/config.json`\n\n    docker run -ti --rm -v `pwd`:/workspace -v `pwd`/config.json:/kaniko/.docker/config.json:ro gcr.io/kaniko-project/executor:latest --dockerfile=Dockerfile --destination=yourimagename\n\nAfter the image is uploaded, using the JFrog CLI, you can\n[collect](https://www.jfrog.com/confluence/display/CLI/CLI+for+JFrog+Artifactory#CLIforJFrogArtifactory-PushingDockerImagesUsingKaniko)\nand\n[publish](https://www.jfrog.com/confluence/display/CLI/CLI+for+JFrog+Artifactory#CLIforJFrogArtifactory-PublishingBuild-Info)\nthe build information to Artifactory and trigger\n[build vulnerabilities scanning](https://www.jfrog.com/confluence/display/JFROG/Declarative+Pipeline+Syntax#DeclarativePipelineSyntax-ScanningBuildswithJFrogXray)\nusing JFrog Xray.\n\nTo collect and publish the image's build information using the Jenkins\nArtifactory plugin, see instructions for\n[scripted pipeline](https://www.jfrog.com/confluence/display/JFROG/Scripted+Pipeline+Syntax#ScriptedPipelineSyntax-UsingKaniko)\nand\n[declarative pipeline](https://www.jfrog.com/confluence/display/JFROG/Declarative+Pipeline+Syntax#DeclarativePipelineSyntax-UsingKaniko).\n\n### Additional Flags\n\n#### Flag `--build-arg`\n\nThis flag allows you to pass in ARG values at build time, similarly to Docker.\nYou can set it multiple times for multiple arguments.\n\nNote that passing values that contain spaces is not natively supported - you\nneed to ensure that the IFS is set to null before your executor command. You can\nset this by adding `export IFS=''` before your executor call. See the following\nexample\n\n```bash\nexport IFS=''\n/kaniko/executor --build-arg \"MY_VAR='value with spaces'\" ...\n```\n\n#### Flag `--cache`\n\nSet this flag as `--cache=true` to opt into caching with kaniko.\n\n#### Flag `--cache-dir`\n\nSet this flag to specify a local directory cache for base images. Defaults to\n`/cache`.\n\n_This flag must be used in conjunction with the `--cache=true` flag._\n\n#### Flag `--cache-repo`\n\nSet this flag to specify a remote repository that will be used to store cached\nlayers.\n\nIf this flag is not provided, a cache repo will be inferred from the\n`--destination` flag. If `--destination=gcr.io/kaniko-project/test`, then cached\nlayers will be stored in `gcr.io/kaniko-project/test/cache`.\n\n_This flag must be used in conjunction with the `--cache=true` flag._\n\n#### Flag `--cache-copy-layers`\n\nSet this flag to cache copy layers.\n\n#### Flag `--cache-run-layers`\n\nSet this flag to cache run layers (default=true).\n\n#### Flag `--cache-ttl duration`\n\nCache timeout in hours. Defaults to two weeks.\n\n#### Flag `--cleanup`\n\nSet this flag to clean the filesystem at the end of the build.\n\n#### Flag `--compressed-caching`\n\nSet this to false in order to prevent tar compression for cached layers. This\nwill increase the runtime of the build, but decrease the memory usage especially\nfor large builds. Try to use `--compressed-caching=false` if your build fails\nwith an out of memory error. Defaults to true.\n\n#### Flag `--context-sub-path`\n\nSet a sub path within the given `--context`.\n\nIts particularly useful when your context is, for example, a git repository, and\nyou want to build one of its subfolders instead of the root folder.\n\n#### Flag `--custom-platform`\n\nAllows to build with another default platform than the host, similarly to docker\nbuild --platform xxx the value has to be on the form\n`--custom-platform=linux/arm`, with acceptable values listed here:\n[GOOS/GOARCH](https://gist.github.com/asukakenji/f15ba7e588ac42795f421b48b8aede63).\n\nIt's also possible specifying CPU variants adding it as a third parameter (like\n`--custom-platform=linux/arm/v5`). Currently CPU variants are only known to be\nused for the ARM architecture as listed here:\n[GOARM](https://go.dev/wiki/GoArm#supported-architectures)\n\n_The resulting images cannot provide any metadata about CPU variant due to a\nlimitation of the OCI-image specification._\n\n_This is not virtualization and cannot help to build an architecture not\nnatively supported by the build host. This is used to build i386 on an amd64\nHost for example, or arm32 on an arm64 host._\n\n#### Flag `--digest-file`\n\nSet this flag to specify a file in the container. This file will receive the\ndigest of a built image. This can be used to automatically track the exact image\nbuilt by kaniko.\n\nFor example, setting the flag to `--digest-file=/dev/termination-log` will write\nthe digest to that file, which is picked up by Kubernetes automatically as the\n`{{.state.terminated.message}}` of the container.\n\n#### Flag `--dockerfile`\n\nPath to the dockerfile to be built. (default \"Dockerfile\")\n\n#### Flag `--force`\n\nForce building outside of a container\n\n#### Flag `--git`\n\nBranch to clone if build context is a git repository (default\nbranch=,single-branch=false,recurse-submodules=false,insecure-skip-tls=false)\n\n#### Flag `--image-name-with-digest-file`\n\nSpecify a file to save the image name w/ digest of the built image to.\n\n#### Flag `--image-name-tag-with-digest-file`\n\nSpecify a file to save the image name w/ image tag and digest of the built image\nto.\n\n#### Flag `--insecure`\n\nSet this flag if you want to push images to a plain HTTP registry. It is\nsupposed to be used for testing purposes only and should not be used in\nproduction!\n\n#### Flag `--insecure-pull`\n\nSet this flag if you want to pull images from a plain HTTP registry. It is\nsupposed to be used for testing purposes only and should not be used in\nproduction!\n\n#### Flag `--insecure-registry`\n\nYou can set `--insecure-registry <registry-name>` to use plain HTTP requests\nwhen accessing the specified registry. It is supposed to be used for testing\npurposes only and should not be used in production! You can set it multiple\ntimes for multiple registries.\n\n#### Flag `--label`\n\nSet this flag as `--label key=value` to set some metadata to the final image.\nThis is equivalent as using the `LABEL` within the Dockerfile.\n\n#### Flag `--log-format`\n\nSet this flag as `--log-format=<text|color|json>` to set the log format.\nDefaults to `color`.\n\n#### Flag `--log-timestamp`\n\nSet this flag as `--log-timestamp=<true|false>` to add timestamps to\n`<text|color>` log format. Defaults to `false`.\n\n#### Flag `--no-push`\n\nSet this flag if you only want to build the image, without pushing to a\nregistry. This can also be defined through `KANIKO_NO_PUSH` environment\nvariable.\n\nNOTE: this will still push cache layers to the repo, to disable pushing cache layers use `--no-push-cache`\n\n#### Flag `--no-push-cache`\n\nSet this flag if you do not want to push cache layers to a\nregistry.  Can be used in addition to `--no-push` to push no layers to a registry.\n\n#### Flag `--oci-layout-path`\n\nSet this flag to specify a directory in the container where the OCI image layout\nof a built image will be placed. This can be used to automatically track the\nexact image built by kaniko.\n\nFor example, to surface the image digest built in a\n[Tekton task](https://github.com/tektoncd/pipeline/blob/v0.6.0/docs/resources.md#surfacing-the-image-digest-built-in-a-task),\nthis flag should be set to match the image resource `outputImageDir`.\n\n_Note: Depending on the built image, the media type of the image manifest might\nbe either `application/vnd.oci.image.manifest.v1+json` or\n`application/vnd.docker.distribution.manifest.v2+json`._\n\n#### Flag `--push-ignore-immutable-tag-errors`\n\nSet this boolean flag to `true` if you want the Kaniko process to exit with\nsuccess when a push error related to tag immutability occurs.\n\nThis is useful for example if you have parallel builds pushing the same tag\nand do not care which one actually succeeds.\n\nDefaults to `false`.\n\n#### Flag `--push-retry`\n\nSet this flag to the number of retries that should happen for the push of an\nimage to a remote destination. Defaults to `0`.\n\n#### Flag `--registry-certificate`\n\nSet this flag to provide a certificate for TLS communication with a given\nregistry.\n\nExpected format is `my.registry.url=/path/to/the/certificate.cert`\n\n#### Flag `--registry-client-cert`\n\nSet this flag to provide a certificate/key pair for mutual TLS (mTLS)\ncommunication with a given\n[registry that requires mTLS](https://docs.docker.com/engine/security/certificates/)\nfor authentication.\n\nExpected format is\n`my.registry.url=/path/to/client/cert.crt,/path/to/client/key.key`\n\n#### Flag `--registry-map`\n\nSet this flag if you want to remap registries references. Usefull for air gap\nenvironement for example. You can use this flag more than once, if you want to\nset multiple mirrors for a given registry. You can mention several remap in a\nsingle flag too, separated by semi-colon. If an image is not found on the first\nmirror, Kaniko will try the next mirror(s), and at the end fallback on the\noriginal registry.\n\nRegistry maps can also be defined through `KANIKO_REGISTRY_MAP` environment\nvariable.\n\nExpected format is\n`original-registry=remapped-registry[;another-reg=another-remap[;...]]` for\nexample.\n\nNote that you **can** specify a URL with scheme for this flag. Some valid options\nare:\n\n- `index.docker.io=mirror.gcr.io`\n- `gcr.io=127.0.0.1`\n- `quay.io=192.168.0.1:5000`\n- `index.docker.io=docker-io.mirrors.corp.net;index.docker.io=mirror.gcr.io;gcr.io=127.0.0.1`\n  will try `docker-io.mirrors.corp.net` then `mirror.gcr.io` for\n  `index.docker.io` and `127.0.0.1` for `gcr.io`\n- `docker.io=harbor.provate.io/theproject`\n\n#### Flag `--registry-mirror`\n\nSet this flag if you want to use a registry mirror instead of the default\n`index.docker.io`. You can use this flag more than once, if you want to set\nmultiple mirrors. If an image is not found on the first mirror, Kaniko will try\nthe next mirror(s), and at the end fallback on the default registry.\n\nMirror can also be defined through `KANIKO_REGISTRY_MIRROR` environment\nvariable.\n\nExpected format is `mirror.gcr.io` or `mirror.gcr.io/path` for example.\n\nNote that you **can** specify a URL with scheme for this flag. Some valid options\nare:\n\n- `mirror.gcr.io`\n- `127.0.0.1`\n- `192.168.0.1:5000`\n- `mycompany-docker-virtual.jfrog.io`\n- `harbor.provate.io/theproject`\n\n#### Flag `--skip-default-registry-fallback`\n\nSet this flag if you want the build process to fail if none of the mirrors\nlisted in flag [registry-mirror](#flag---registry-mirror) can pull some image.\nThis should be used with mirrors that implements a whitelist or some image\nrestrictions.\n\nIf [registry-mirror](#flag---registry-mirror) is not set or is empty, this flag\nis ignored.\n\n#### Flag `--reproducible`\n\nSet this flag to strip timestamps out of the built image and make it\nreproducible.\n\n#### Flag `--single-snapshot`\n\nThis flag takes a single snapshot of the filesystem at the end of the build, so\nonly one layer will be appended to the base image.\n\n#### Flag `--skip-push-permission-check`\n\nSet this flag to skip push permission check. This can be useful to delay Kanikos\nfirst request for delayed network-policies.\n\n#### Flag `--skip-tls-verify`\n\nSet this flag to skip TLS certificate validation when pushing to a registry. It\nis supposed to be used for testing purposes only and should not be used in\nproduction!\n\n#### Flag `--skip-tls-verify-pull`\n\nSet this flag to skip TLS certificate validation when pulling from a registry.\nIt is supposed to be used for testing purposes only and should not be used in\nproduction!\n\n#### Flag `--skip-tls-verify-registry`\n\nYou can set `--skip-tls-verify-registry <registry-name>` to skip TLS certificate\nvalidation when accessing the specified registry. It is supposed to be used for\ntesting purposes only and should not be used in production! You can set it\nmultiple times for multiple registries.\n\n#### Flag `--skip-unused-stages`\n\nThis flag builds only used stages if defined to `true`. Otherwise it builds by\ndefault all stages, even the unnecessary ones until it reaches the target stage\n/ end of Dockerfile\n\n#### Flag `--snapshot-mode`\n\nYou can set the `--snapshot-mode=<full (default), redo, time>` flag to set how\nkaniko will snapshot the filesystem.\n\n- If `--snapshot-mode=full` is set, the full file contents and metadata are\n  considered when snapshotting. This is the least performant option, but also\n  the most robust.\n\n- If `--snapshot-mode=redo` is set, the file mtime, size, mode, owner uid and\n  gid will be considered when snapshotting. This may be up to 50% faster than\n  \"full\", particularly if your project has a large number files.\n\n- If `--snapshot-mode=time` is set, only file mtime will be considered when\n  snapshotting (see [limitations related to mtime](#mtime-and-snapshotting)).\n\n#### Flag `--tar-path`\n\nSet this flag as `--tar-path=<path>` to save the image as a tarball at path. You\nneed to set `--destination` as well (for example `--destination=image`). If you\nwant to save the image as tarball only you also need to set `--no-push`.\n\n#### Flag `--target`\n\nSet this flag to indicate which build stage is the target build stage.\n\n#### Flag `--use-new-run`\n\nUsing this flag enables an experimental implementation of the Run command which\ndoes not rely on snapshotting at all. In this approach, in order to compute\nwhich files were changed, a marker file is created before executing the Run\ncommand. Then the entire filesystem is walked (takes ~1-3 seconds for 700Kfiles)\nto find all files whose ModTime is greater than the marker file. With this new\nrun command implementation, the total build time is reduced seeing performance\nimprovements in the range of ~75%. This new run mode trades off\naccuracy/correctness in some cases (potential for missed files in a \"snapshot\")\nfor improved performance by avoiding the full filesystem snapshots.\n\n#### Flag `--verbosity`\n\nSet this flag as `--verbosity=<panic|fatal|error|warn|info|debug|trace>` to set\nthe logging level. Defaults to `info`.\n\n#### Flag `--ignore-var-run`\n\nIgnore /var/run when taking image snapshot. Set it to false to preserve\n/var/run/\\* in destination image. (Default true).\n\n#### Flag `--ignore-path`\n\nSet this flag as `--ignore-path=<path>` to ignore path when taking an image\nsnapshot. Set it multiple times for multiple ignore paths.\n\n#### Flag `--image-fs-extract-retry`\n\nSet this flag to the number of retries that should happen for the extracting an\nimage filesystem. Defaults to `0`.\n\n#### Flag `--image-download-retry`\n\nSet this flag to the number of retries that should happen when downloading the\nremote image. Consecutive retries occur with exponential backoff and an initial\ndelay of 1 second. Defaults to 0`.\n\n### Debug Image\n\nThe kaniko executor image is based on scratch and doesn't contain a shell. We\nprovide `gcr.io/kaniko-project/executor:debug`, a debug image which consists of\nthe kaniko executor image along with a busybox shell to enter.\n\nYou can launch the debug image with a shell entrypoint:\n\n```shell\ndocker run -it --entrypoint=/busybox/sh gcr.io/kaniko-project/executor:debug\n```\n\n## Security\n\nkaniko by itself **does not** make it safe to run untrusted builds inside your\ncluster, or anywhere else.\n\nkaniko relies on the security features of your container runtime to provide\nbuild security.\n\nThe minimum permissions kaniko needs inside your container are governed by a few\nthings:\n\n- The permissions required to unpack your base image into its container\n- The permissions required to execute the RUN commands inside the container\n\nIf you have a minimal base image (SCRATCH or similar) that doesn't require\npermissions to unpack, and your Dockerfile doesn't execute any commands as the\nroot user, you can run kaniko without root permissions. It should be noted that\nDocker runs as root by default, so you still require (in a sense) privileges to\nuse kaniko.\n\nYou may be able to achieve the same default seccomp profile that Docker uses in\nyour Pod by setting\n[seccomp](https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp)\nprofiles with annotations on a\n[PodSecurityPolicy](https://cloud.google.com/kubernetes-engine/docs/how-to/pod-security-policies)\nto create or update security policies on your cluster.\n\n### Verifying Signed Kaniko Images\n\nkaniko images are signed for versions >= 1.5.2 using\n[cosign](https://github.com/sigstore/cosign)!\n\nTo verify a public image, install [cosign](https://github.com/sigstore/cosign)\nand use the provided [public key](cosign.pub):\n\n```\n$ cat cosign.pub\n-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9aAfAcgAxIFMTstJUv8l/AMqnSKw\nP+vLu3NnnBDHCfREQpV/AJuiZ1UtgGpFpHlJLCNPmFkzQTnfyN5idzNl6Q==\n-----END PUBLIC KEY-----\n\n$ cosign verify -key ./cosign.pub gcr.io/kaniko-project/executor:latest\n```\n\n## Kaniko Builds - Profiling\n\nIf your builds are taking long, we recently added support to analyze kaniko\nfunction calls using [Slow Jam](https://github.com/google/slowjam) To start\nprofiling,\n\n1. Add an environment variable `STACKLOG_PATH` to your\n   [pod definition](https://github.com/GoogleContainerTools/kaniko/blob/master/examples/pod-build-profile.yaml#L15).\n2. If you are using the kaniko `debug` image, you can copy the file in the\n   `pre-stop` container lifecycle hook.\n\n## Creating Multi-arch Container Manifests Using Kaniko and Manifest-tool\n\nWhile Kaniko itself currently does not support creating multi-arch manifests\n(contributions welcome), one can use tools such as\n[manifest-tool](https://github.com/estesp/manifest-tool) to stitch multiple\nseparate builds together into a single container manifest.\n\n### General Workflow\n\nThe general workflow for creating multi-arch manifests is as follows:\n\n1. Build separate container images using Kaniko on build hosts matching your\n   target architecture and tag them with the appropriate ARCH tag.\n2. Push the separate images to your container registry.\n3. Manifest-tool identifies the separate manifests in your container registry,\n   according to a given template.\n4. Manifest-tool pushes a combined manifest referencing the separate manifests.\n\n![Workflow Multi-arch](docs/images/multi-arch.drawio.svg)\n\n### Limitations and Pitfalls\n\nThe following conditions must be met:\n\n1. You need access to build-machines running the desired architectures (running\n   Kaniko in an emulator, e.g. QEMU should also be possible but goes beyond the\n   scope of this documentation). This is something to keep in mind when using\n   SaaS build tools such as github.com or gitlab.com, of which at the time of\n   writing neither supports any non-x86_64 SaaS runners\n   ([GitHub](https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources),[GitLab](https://docs.gitlab.com/ee/ci/runners/saas/linux_saas_runner.html#machine-types-available-for-private-projects-x86-64)),\n   so be prepared to bring your own machines\n   ([GitHub](https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners),[GitLab](https://docs.gitlab.com/runner/register/).\n2. Kaniko needs to be able to run on the desired architectures. At the time of\n   writing, the official Kaniko container supports\n   [linux/amd64, linux/arm64, linux/s390x and linux/ppc64le (not on \\*-debug images)](https://github.com/GoogleContainerTools/kaniko/blob/main/.github/workflows/images.yaml).\n3. The container registry of your choice must be OCIv1 or Docker v2.2\n   compatible.\n\n### Example CI Pipeline (GitLab)\n\nIt is up to you to find an automation tool that suits your needs best. We\nrecommend using a modern CI/CD system such as GitHub workflows or GitLab CI. As\nwe (the authors) happen to use GitLab CI, the following examples are tailored to\nthis specific platform but the underlying principles should apply anywhere else\nand the examples are kept simple enough, so that you should be able to follow\nalong, even without any previous experiences with this specific platform. When\nin doubt, visit the\n[gitlab-ci.yml reference page](https://docs.gitlab.com/ee/ci/yaml/index.html)\nfor a comprehensive overview of the GitLab CI keywords.\n\n#### Building the Separate Container Images\n\ngitlab-ci.yml:\n\n```yaml\n# define a job for building the containers\nbuild-container:\n  stage: container-build\n  # run parallel builds for the desired architectures\n  parallel:\n    matrix:\n      - ARCH: amd64\n      - ARCH: arm64\n  tags:\n    # run each build on a suitable, preconfigured runner (must match the target architecture)\n    - runner-${ARCH}\n  image:\n    name: gcr.io/kaniko-project/executor:debug\n    entrypoint: [\"\"]\n  script:\n    # build the container image for the current arch using kaniko\n    - >-\n      /kaniko/executor --context \"${CI_PROJECT_DIR}\" --dockerfile\n      \"${CI_PROJECT_DIR}/Dockerfile\" # push the image to the GitLab container\n      registry, add the current arch as tag. --destination\n      \"${CI_REGISTRY_IMAGE}:${ARCH}\"\n```\n\n#### Merging the Container Manifests\n\ngitlab-ci.yml:\n\n```yaml\n# define a job for creating and pushing a merged manifest\nmerge-manifests:\n  stage: container-build\n  # all containers must be build before merging them\n  # alternatively the job may be configured to run in a later stage\n  needs:\n    - job: container-build\n      artifacts: false\n  tags:\n    # may run on any architecture supported by manifest-tool image\n    - runner-xyz\n  image:\n    name: mplatform/manifest-tool:alpine\n    entrypoint: [\"\"]\n  script:\n    - >-\n      manifest-tool # authorize against your container registry\n      --username=${CI_REGISTRY_USER} --password=${CI_REGISTRY_PASSWORD} push\n      from-args # define the architectures you want to merge --platforms\n      linux/amd64,linux/arm64 # \"ARCH\" will be automatically replaced by\n      manifest-tool # with the appropriate arch from the platform definitions\n      --template ${CI_REGISTRY_IMAGE}:ARCH # The name of the final, combined\n      image which will be pushed to your registry --target ${CI_REGISTRY_IMAGE}\n```\n\n#### On the Note of Adding Versioned Tags\n\nFor simplicity's sake we deliberately refrained from using versioned tagged\nimages (all builds will be tagged as \"latest\") in the previous examples, as we\nfeel like this adds to much platform and workflow specific code.\n\nNethertheless, for anyone interested in how we handle (dynamic) versioning in\nGitLab, here is a short rundown:\n\n- If you are only interested in building tagged releases, you can simply use the\n  [GitLab predefined](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html)\n  `CI_COMMIT_TAG` variable when running a tag pipeline.\n- When you (like us) want to additionally build container images outside of\n  releases, things get a bit messier. In our case, we added a additional job\n  which runs before the build and merge jobs (don't forget to extend the `needs`\n  section of the build and merge jobs accordingly), which will set the tag to\n  `latest` when running on the default branch, to the commit hash when run on\n  other branches and to the release tag when run on a tag pipeline.\n\ngitlab-ci.yml:\n\n```yaml\ncontainer-get-tag:\n  stage: pre-container-build-stage\n  tags:\n    - runner-xyz\n  image: busybox\n  script:\n    # All other branches are tagged with the currently built commit SHA hash\n    - |\n      # If pipeline runs on the default branch: Set tag to \"latest\"\n      if test \"$CI_COMMIT_BRANCH\" == \"$CI_DEFAULT_BRANCH\"; then\n        tag=\"latest\"\n      # If pipeline is a tag pipeline, set tag to the git commit tag\n      elif test -n \"$CI_COMMIT_TAG\"; then\n        tag=\"$CI_COMMIT_TAG\"\n      # Else set the tag to the git commit sha\n      else\n        tag=\"$CI_COMMIT_SHA\"\n      fi\n    - echo \"tag=$tag\" > build.env\n  # parse tag to the build and merge jobs.\n  # See: https://docs.gitlab.com/ee/ci/variables/#pass-an-environment-variable-to-another-job\n  artifacts:\n    reports:\n      dotenv: build.env\n```\n\n## Comparison with Other Tools\n\nSimilar tools include:\n\n- [BuildKit](https://github.com/moby/buildkit)\n- [img](https://github.com/genuinetools/img)\n- [orca-build](https://github.com/cyphar/orca-build)\n- [umoci](https://github.com/openSUSE/umoci)\n- [buildah](https://github.com/containers/buildah)\n- [FTL](https://github.com/GoogleCloudPlatform/runtimes-common/tree/master/ftl)\n- [Bazel rules_docker](https://github.com/bazelbuild/rules_docker)\n\nAll of these tools build container images with different approaches.\n\nBuildKit (and `img`) can perform as a non-root user from within a container but\nrequires seccomp and AppArmor to be disabled to create nested containers.\n`kaniko` does not actually create nested containers, so it does not require\nseccomp and AppArmor to be disabled. BuildKit supports \"cross-building\"\nmulti-arch containers by leveraging QEMU.\n\n`orca-build` depends on `runc` to build images from Dockerfiles, which can not\nrun inside a container (for similar reasons to `img` above). `kaniko` doesn't\nuse `runc` so it doesn't require the use of kernel namespacing techniques.\nHowever, `orca-build` does not require Docker or any privileged daemon (so\nbuilds can be done entirely without privilege).\n\n`umoci` works without any privileges, and also has no restrictions on the root\nfilesystem being extracted (though it requires additional handling if your\nfilesystem is sufficiently complicated). However, it has no `Dockerfile`-like\nbuild tooling (it's a slightly lower-level tool that can be used to build such\nbuilders -- such as `orca-build`).\n\n`Buildah` specializes in building OCI images. Buildah's commands replicate all\nof the commands that are found in a Dockerfile. This allows building images with\nand without Dockerfiles while not requiring any root privileges. Buildah’s\nultimate goal is to provide a lower-level coreutils interface to build images.\nThe flexibility of building images without Dockerfiles allows for the\nintegration of other scripting languages into the build process. Buildah follows\na simple fork-exec model and does not run as a daemon but it is based on a\ncomprehensive API in golang, which can be vendored into other tools.\n\n`FTL` and `Bazel` aim to achieve the fastest possible creation of Docker images\nfor a subset of images. These can be thought of as a special-case \"fast path\"\nthat can be used in conjunction with the support for general Dockerfiles kaniko\nprovides.\n\n## Community\n\n[kaniko-users](https://groups.google.com/forum/#!forum/kaniko-users) Google\ngroup\n\nTo Contribute to kaniko, see [DEVELOPMENT.md](DEVELOPMENT.md) and\n[CONTRIBUTING.md](CONTRIBUTING.md).\n\n## Limitations\n\n### mtime and snapshotting\n\nWhen taking a snapshot, kaniko's hashing algorithms include (or in the case of\n[`--snapshot-mode=time`](#--snapshotmode), only use) a file's\n[`mtime`](https://en.wikipedia.org/wiki/Inode#POSIX_inode_description) to\ndetermine if the file has changed. Unfortunately, there is a delay between when\nchanges to a file are made and when the `mtime` is updated. This means:\n\n- With the time-only snapshot mode (`--snapshot-mode=time`), kaniko may miss\n  changes introduced by `RUN` commands entirely.\n- With the default snapshot mode (`--snapshot-mode=full`), whether or not kaniko\n  will add a layer in the case where a `RUN` command modifies a file **but the\n  contents do not** change is theoretically non-deterministic. This _does not\n  affect the contents_ which will still be correct, but it does affect the\n  number of layers.\n\n_Note that these issues are currently theoretical only. If you see this issue\noccur, please\n[open an issue](https://github.com/GoogleContainerTools/kaniko/issues)._\n\n### Dockerfile commands `--chown` support\nKaniko currently supports `COPY --chown` and `ADD --chown` Dockerfile command. It does not support `RUN --chown`.\n\n## References\n\n- [Kaniko - Building Container Images In Kubernetes Without Docker](https://youtu.be/EgwVQN6GNJg).\n"
  },
  {
    "path": "RELEASE.md",
    "content": "# Kaniko Release Process\n\nThis document explains the Kaniko release process.\n\nKaniko is not an officially supported Google product. Kaniko is maintained by Google.\n\n\n## Self-Serve Kaniko Release  [Non-Google contributors]\nKaniko is not an officially supported Google product however only contributors part of\nGoogle organization can release Kaniko to official kaniko project at `kaniko-project`.\nIf you are a part of [Google organization](https://github.com/orgs/google/people), please see skip to [Kaniko Release Process - Google Contributors](https://github.com/GoogleContainerTools/kaniko/blob/master/RELEASE.md#kaniko-release-process-google-contributors)\n\nNon-Google Contributors or users, please follow the following steps:\n1. Follow the setup instruction to fork kaniko repository [here](https://github.com/GoogleContainerTools/kaniko/blob/master/DEVELOPMENT.md#getting-started)\n2. Run the following `make` commands to build and push Kaniko image to your organization image repository.\n  ```shell\n   REGISTRY=gcr.io/YOUR-PROJECT make images\n   ```\n  The above command will build and push all the 3 kaniko images\n  * gcr.io/YOUR-PROJECT/executor:latest\n  * gcr.io/YOUR-PROJECT/executor:debug\n  * gcr.io/YOUR-PROJECT/warmer:latest\n\n3. You can choose tag these images using `docker tag` \ne.g. To tag `gcr.io/YOUR-PROJECT/executor:latest` as `gcr.io/YOUR-PROJECT/executor:v1.6.0self-serve`, run\n   ```shell\n    docker tag gcr.io/YOUR-PROJECT/executor:latest gcr.io/YOUR-PROJECT/executor:v1.6.0self-serve\n   ```\n   \nPlease change all usages of `gcr.io/kaniko-project/executor:latest` to `gcr.io/YOUR-PROJECT/executor:latest` for executor image and so on.\n4. Finally, pushed your tagged images via docker. You could also use the Makefile target `push` to push these images like this\n  ```shell\n   REGISTRY=gcr.io/YOUR-PROJECT make images\n  ```\n\n## Kaniko Release Process [Google Contributors]\n### Getting write access to the Kaniko Project\nIn order to kick off kaniko release, you need to write access to Kaniko project.\n\nTo get write access, please ping one of the [Kaniko Maintainers](https://github.com/orgs/GoogleContainerTools/teams/kaniko-maintainers/members). \n\nOnce you have the correct access, you can kick off a release.\n\n\n### Kicking of a release.\n\n1. Create a release PR and update Changelog.\n\n    In order to release a new version of Kaniko, you will need to first\n\n    a. Create a new branch and bump the kaniko version in [Makefile](https://github.com/GoogleContainerTools/kaniko/blob/master/Makefile#L16)\n\n\n    In most cases, you will need to bump the `VERSION_MINOR` number.\n    In case you are doing a patch release for a hot fix, bump the `VERSION_BUILD` number.\n\n    b. Run the [script](https://github.com/GoogleContainerTools/kaniko/blob/master/hack/release.sh) to create release notes.\n    ```\n    ./hack/release.sh\n    Collecting pull request that were merged since the last release: v1.0.0 (2020-08-18 02:53:46 +0000 UTC)\n    * change repo string to just string [#1417](https://github.com/GoogleContainerTools/kaniko/pull/1417)\n    * Improve --use-new-run help text, update README with missing flags [#1405](https://github.com/GoogleContainerTools/kaniko/pull/1405)\n    ...\n    Huge thank you for this release towards our contributors: \n    - Alex Szakaly\n    - Alexander Sharov\n    ```\n    Copy the release notes and update the [CHANGELOG.md](https://github.com/GoogleContainerTools/kaniko/blob/master/CHANGELOG.md) at the root of the repository. \n\n    c. Create a pull request like [this](https://github.com/GoogleContainerTools/kaniko/pull/1388) and get it approved from Kaniko maintainers.\n\n2. Once the PR is approved and merged, create a release tag with name `vX.Y.Z` where\n    ```\n    X corresponds to VERSION_MAJOR\n    Y corresponds to VERSION_MINOR\n    Z corresponds to VERSION_BUILD\n    ```\n    E.g. to release 1.2.0 version of kaniko, please create a tag v1.2.0 like this\n    ```\n    git pull remote master\n    git tag v1.2.0\n    git push remote v1.2.0\n    ```\n3.  Pushing a tag to remote with above naming convention will trigger the Github workflow action defined [here](https://github.com/GoogleContainerTools/kaniko/blob/main/.github/workflows/images.yaml) It takes 20-30 mins for the job to finish and push images to [`kaniko-project`](https://pantheon.corp.google.com/gcr/images/kaniko-project?orgonly=true&project=kaniko-project&supportedpurview=organizationId)\n```\ngcr.io/kaniko-project/executor:latest\ngcr.io/kaniko-project/executor:vX.Y.Z\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:debug-vX.Y.Z\ngcr.io/kaniko-project/executor:warmer\ngcr.io/kaniko-project/executor:warmer-vX.Y.Z\n```\nYou could verify if the images are published using the `docker pull` command\n```\ndocker pull gcr.io/kaniko-project/executor:vX.Y.Z\ndocker pull gcr.io/kaniko-project/warmer:vX.Y.Z\n```\nIn case the images are still not published, ping one of the kaniko maintainers and they will provide the cloud build trigger logs.\nYou can also request read access to the Google `kaniko-project`.\n\n4. Finally, once the images are published, create a release for the newly created [tag](https://github.com/GoogleContainerTools/kaniko/tags) and publish it. \nSummarize the change log to mention, \n- new features added if any\n- bug fixes, \n- refactors and \n- documentation changes\n"
  },
  {
    "path": "ROADMAP.md",
    "content": "# Kaniko Project Roadmap 2024\n\n## Introduction\n\nKaniko is an open-source project designed to build container images from a Dockerfile, efficiently and securely, in environments that cannot run a Docker daemon. This roadmap outlines our strategic goals and key areas of development for 2024, aligning with our mission to enhance container building in cloud-native environments.\n\n## Vision\n\n- **To be the leading tool for building container images via Dockerfile in cloud-native environments - prioritizing security, efficiency, compatibility, and portability.**\n\n## Strategic Goals\n\n1. **Enhanced Security**: Strengthen security measures in container image building, addressing vulnerabilities and integrating best practices.\n2. **Performance Optimization**: Improve build performance to handle large-scale and complex applications.\n3. **Ecosystem Compatibility**: Ensure compatibility and integration with a wide range of cloud-native tools and platforms.\n4. **Community Engagement**: Foster an active community, encouraging contributions, feedback, and collaboration.\n\n## Key Initiatives\n\n### Q1 & Q2 2024\n\n- **Security Automation Improvements**\n  - Add automated image vulnerability scanning and notifications\n- **Release Automation Improvements**\n  - Improve automation of Kaniko releases to ensure frequent releases with minimal overhead.\n- **CI/CD Integration Improvements**\n  - Improve integration with popular CI/CD tools (e.g. GitLab CI, Jenkins, GHA, etc.).\n\n### Q3 & Q4 2024\n\n- **Improve Docker Compatibility**\n  - Improve kaniko compatibility with docker related to edge cases where current Dockerfiles and resulting images can differ than what docker supports/generates from the same Dockerfile\n- **Performance Benchmarking**\n  - Implement a performance benchmarking system with performance test suite.\n  - Identify performance bottlenecks.\n- **Improve Layer Caching Mechanisms**\n  - Improve layer caching generally for users (eg: reduce incorrect cache misses and usage).\n- **Enhanced Documentation**\n  - Update documentation to reflect 2024 best practices and usage patterns.\n"
  },
  {
    "path": "SECURITY.md",
    "content": "To report a security issue with Kaniko, please use https://g.co/vulnz. We use\nhttps://g.co/vulnz for our intake, and do coordination and disclosure here on\nGitHub (including using GitHub Security Advisory). The Google Security Team will\nrespond within 5 working days of your report on g.co/vulnz.\n"
  },
  {
    "path": "Vagrantfile",
    "content": "# -*- mode: ruby -*-\n# vi: set ft=ruby :\n\nVagrant.configure(\"2\") do |config|\n  config.vm.box = \"generic/debian10\"\n  config.vm.synced_folder \".\", \"/go/src/github.com/GoogleContainerTools/kaniko\"\n  config.ssh.extra_args = [\"-t\", \"cd /go/src/github.com/GoogleContainerTools/kaniko; bash --login\"]\n\n  config.vm.provision \"shell\", inline: <<-SHELL\n    apt-get update && apt-get install -y \\\n      apt-transport-https \\\n      ca-certificates \\\n      curl \\\n      gnupg-agent \\\n      html-xml-utils \\\n      python \\\n      wget \\\n      ca-certificates \\\n      jq \\\n      software-properties-common\n    curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -\n    add-apt-repository \"deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable\"\n    apt-get update\n    apt-get install -y docker-ce-cli docker-ce containerd.io\n    usermod -a -G docker vagrant\n\n    curl -LO https://storage.googleapis.com/container-diff/latest/container-diff-linux-amd64\n    chmod +x container-diff-linux-amd64 && mv container-diff-linux-amd64 /usr/local/bin/container-diff\n\n    wget --quiet https://storage.googleapis.com/pub/gsutil.tar.gz\n    mkdir -p /opt/gsutil\n    tar xfz gsutil.tar.gz -C /opt/\n    rm gsutil.tar.gz\n    ln -s /opt/gsutil/gsutil /usr/local/bin\n\n    export GODLURL=https://go.dev/dl/$(curl --silent --show-error https://go.dev/dl/ | hxnormalize -x | hxselect -s \"\\n\" \"span, #filename\" | grep linux | cut -d '>' -f 2 | cut -d '<' -f 1)\n    echo \"Downloading go from: $GODLURL\"\n    wget --quiet $GODLURL\n    tar -C /usr/local -xzf go*.linux-amd64.tar.gz\n    echo 'export PATH=$PATH:/usr/local/go/bin:/go/bin' > /etc/profile.d/go-path.sh\n    echo 'export GOPATH=/go' >> /etc/profile.d/go-path.sh\n    chmod a+x /etc/profile.d/go-path.sh\n    chown vagrant /go\n    chown vagrant /go/bin\n\n    docker run --rm  -d -p 5000:5000 --name registry -e DEBUG=true registry:2\n    echo 'export IMAGE_REPO=localhost:5000' > /etc/profile.d/local-registry.sh\n    chmod a+x /etc/profile.d/local-registry.sh\n    export PATH=$PATH:/usr/local/go/bin:/go/bin\n    export GOPATH=/go\n    go get github.com/google/go-containerregistry/cmd/crane\n  SHELL\nend\n"
  },
  {
    "path": "benchmark.sh",
    "content": "#!/bin/bash\n\n# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -ex\nscript_name=$0\nscript_full_path=$(dirname \"$0\")\nexport BENCHMARK=true\nexport IMAGE_REPO=\"gcr.io/kaniko-test/benchmarks\"\n./${script_full_path}/integration-test.sh\n"
  },
  {
    "path": "cmd/executor/cmd/root.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage cmd\n\nimport (\n\t\"fmt\"\n\t\"io/fs\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/buildcontext\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/constants\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/executor\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/logging\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/timing\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util/proc\"\n\t\"github.com/containerd/containerd/platforms\"\n\t\"github.com/google/go-containerregistry/pkg/name\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n\t\"github.com/spf13/cobra\"\n\t\"github.com/spf13/pflag\"\n)\n\nvar (\n\topts         = &config.KanikoOptions{}\n\tctxSubPath   string\n\tforce        bool\n\tlogLevel     string\n\tlogFormat    string\n\tlogTimestamp bool\n)\n\nfunc init() {\n\tRootCmd.PersistentFlags().StringVarP(&logLevel, \"verbosity\", \"v\", logging.DefaultLevel, \"Log level (trace, debug, info, warn, error, fatal, panic)\")\n\tRootCmd.PersistentFlags().StringVar(&logFormat, \"log-format\", logging.FormatColor, \"Log format (text, color, json)\")\n\tRootCmd.PersistentFlags().BoolVar(&logTimestamp, \"log-timestamp\", logging.DefaultLogTimestamp, \"Timestamp in log output\")\n\tRootCmd.PersistentFlags().BoolVarP(&force, \"force\", \"\", false, \"Force building outside of a container\")\n\n\taddKanikoOptionsFlags()\n\taddHiddenFlags(RootCmd)\n\tRootCmd.PersistentFlags().BoolVarP(&opts.IgnoreVarRun, \"whitelist-var-run\", \"\", true, \"Ignore /var/run directory when taking image snapshot. Set it to false to preserve /var/run/ in destination image.\")\n\tRootCmd.PersistentFlags().MarkDeprecated(\"whitelist-var-run\", \"Please use ignore-var-run instead.\")\n}\n\nfunc validateFlags() {\n\tcheckNoDeprecatedFlags()\n\n\t// Allow setting --registry-mirror using an environment variable.\n\tif val, ok := os.LookupEnv(\"KANIKO_REGISTRY_MIRROR\"); ok {\n\t\topts.RegistryMirrors.Set(val)\n\t}\n\n\t// Allow setting --no-push using an environment variable.\n\tif val, ok := os.LookupEnv(\"KANIKO_NO_PUSH\"); ok {\n\t\tvalBoolean, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\terrors.New(\"invalid value (true/false) for KANIKO_NO_PUSH environment variable\")\n\t\t}\n\t\topts.NoPush = valBoolean\n\t}\n\n\t// Allow setting --registry-maps using an environment variable.\n\tif val, ok := os.LookupEnv(\"KANIKO_REGISTRY_MAP\"); ok {\n\t\topts.RegistryMaps.Set(val)\n\t}\n\n\tfor _, target := range opts.RegistryMirrors {\n\t\topts.RegistryMaps.Set(fmt.Sprintf(\"%s=%s\", name.DefaultRegistry, target))\n\t}\n\n\tif len(opts.RegistryMaps) > 0 {\n\t\tfor src, dsts := range opts.RegistryMaps {\n\t\t\tlogrus.Debugf(\"registry-map remaps %s to %s.\", src, strings.Join(dsts, \", \"))\n\t\t}\n\t}\n\n\t// Default the custom platform flag to our current platform, and validate it.\n\tif opts.CustomPlatform == \"\" {\n\t\topts.CustomPlatform = platforms.Format(platforms.Normalize(platforms.DefaultSpec()))\n\t}\n\tif _, err := v1.ParsePlatform(opts.CustomPlatform); err != nil {\n\t\tlogrus.Fatalf(\"Invalid platform %q: %v\", opts.CustomPlatform, err)\n\t}\n}\n\n// RootCmd is the kaniko command that is run\nvar RootCmd = &cobra.Command{\n\tUse: \"executor\",\n\tPersistentPreRunE: func(cmd *cobra.Command, args []string) error {\n\t\tif cmd.Use == \"executor\" {\n\n\t\t\tif err := logging.Configure(logLevel, logFormat, logTimestamp); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tvalidateFlags()\n\n\t\t\t// Command line flag takes precedence over the KANIKO_DIR environment variable.\n\t\t\tdir := config.KanikoDir\n\t\t\tif opts.KanikoDir != constants.DefaultKanikoPath {\n\t\t\t\tdir = opts.KanikoDir\n\t\t\t}\n\n\t\t\tif err := checkKanikoDir(dir); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tresolveEnvironmentBuildArgs(opts.BuildArgs, os.Getenv)\n\n\t\t\tif !opts.NoPush && len(opts.Destinations) == 0 {\n\t\t\t\treturn errors.New(\"you must provide --destination, or use --no-push\")\n\t\t\t}\n\t\t\tif err := cacheFlagsValid(); err != nil {\n\t\t\t\treturn errors.Wrap(err, \"cache flags invalid\")\n\t\t\t}\n\t\t\tif err := resolveSourceContext(); err != nil {\n\t\t\t\treturn errors.Wrap(err, \"error resolving source context\")\n\t\t\t}\n\t\t\tif err := resolveDockerfilePath(); err != nil {\n\t\t\t\treturn errors.Wrap(err, \"error resolving dockerfile path\")\n\t\t\t}\n\t\t\tif len(opts.Destinations) == 0 && opts.ImageNameDigestFile != \"\" {\n\t\t\t\treturn errors.New(\"you must provide --destination if setting ImageNameDigestFile\")\n\t\t\t}\n\t\t\tif len(opts.Destinations) == 0 && opts.ImageNameTagDigestFile != \"\" {\n\t\t\t\treturn errors.New(\"you must provide --destination if setting ImageNameTagDigestFile\")\n\t\t\t}\n\t\t\t// Update ignored paths\n\t\t\tif opts.IgnoreVarRun {\n\t\t\t\t// /var/run is a special case. It's common to mount in /var/run/docker.sock\n\t\t\t\t// or something similar which leads to a special mount on the /var/run/docker.sock\n\t\t\t\t// file itself, but the directory to exist in the image with no way to tell if it came\n\t\t\t\t// from the base image or not.\n\t\t\t\tlogrus.Trace(\"Adding /var/run to default ignore list\")\n\t\t\t\tutil.AddToDefaultIgnoreList(util.IgnoreListEntry{\n\t\t\t\t\tPath:            \"/var/run\",\n\t\t\t\t\tPrefixMatchOnly: false,\n\t\t\t\t})\n\t\t\t}\n\t\t\tfor _, p := range opts.IgnorePaths {\n\t\t\t\tutil.AddToDefaultIgnoreList(util.IgnoreListEntry{\n\t\t\t\t\tPath:            p,\n\t\t\t\t\tPrefixMatchOnly: false,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t},\n\tRun: func(cmd *cobra.Command, args []string) {\n\t\tif !checkContained() {\n\t\t\tif !force {\n\t\t\t\texit(errors.New(\"kaniko should only be run inside of a container, run with the --force flag if you are sure you want to continue\"))\n\t\t\t}\n\t\t\tlogrus.Warn(\"Kaniko is being run outside of a container. This can have dangerous effects on your system\")\n\t\t}\n\t\tif !opts.NoPush || opts.CacheRepo != \"\" {\n\t\t\tif err := executor.CheckPushPermissions(opts); err != nil {\n\t\t\t\texit(errors.Wrap(err, \"error checking push permissions -- make sure you entered the correct tag name, and that you are authenticated correctly, and try again\"))\n\t\t\t}\n\t\t}\n\t\tif err := resolveRelativePaths(); err != nil {\n\t\t\texit(errors.Wrap(err, \"error resolving relative paths to absolute paths\"))\n\t\t}\n\t\tif err := os.Chdir(\"/\"); err != nil {\n\t\t\texit(errors.Wrap(err, \"error changing to root dir\"))\n\t\t}\n\t\timage, err := executor.DoBuild(opts)\n\t\tif err != nil {\n\t\t\texit(errors.Wrap(err, \"error building image\"))\n\t\t}\n\t\tif err := executor.DoPush(image, opts); err != nil {\n\t\t\texit(errors.Wrap(err, \"error pushing image\"))\n\t\t}\n\n\t\tbenchmarkFile := os.Getenv(\"BENCHMARK_FILE\")\n\t\t// false is a keyword for integration tests to turn off benchmarking\n\t\tif benchmarkFile != \"\" && benchmarkFile != \"false\" {\n\t\t\ts, err := timing.JSON()\n\t\t\tif err != nil {\n\t\t\t\tlogrus.Warnf(\"Unable to write benchmark file: %s\", err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif strings.HasPrefix(benchmarkFile, \"gs://\") {\n\t\t\t\tlogrus.Info(\"Uploading to gcs\")\n\t\t\t\tif err := buildcontext.UploadToBucket(strings.NewReader(s), benchmarkFile); err != nil {\n\t\t\t\t\tlogrus.Infof(\"Unable to upload %s due to %v\", benchmarkFile, err)\n\t\t\t\t}\n\t\t\t\tlogrus.Infof(\"Benchmark file written at %s\", benchmarkFile)\n\t\t\t} else {\n\t\t\t\tf, err := os.Create(benchmarkFile)\n\t\t\t\tif err != nil {\n\t\t\t\t\tlogrus.Warnf(\"Unable to create benchmarking file %s: %s\", benchmarkFile, err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tdefer f.Close()\n\t\t\t\tf.WriteString(s)\n\t\t\t\tlogrus.Infof(\"Benchmark file written at %s\", benchmarkFile)\n\t\t\t}\n\t\t}\n\t},\n}\n\n// addKanikoOptionsFlags configures opts\nfunc addKanikoOptionsFlags() {\n\tRootCmd.PersistentFlags().StringVarP(&opts.DockerfilePath, \"dockerfile\", \"f\", \"Dockerfile\", \"Path to the dockerfile to be built.\")\n\tRootCmd.PersistentFlags().StringVarP(&opts.SrcContext, \"context\", \"c\", \"/workspace/\", \"Path to the dockerfile build context.\")\n\tRootCmd.PersistentFlags().StringVarP(&ctxSubPath, \"context-sub-path\", \"\", \"\", \"Sub path within the given context.\")\n\tRootCmd.PersistentFlags().StringVarP(&opts.Bucket, \"bucket\", \"b\", \"\", \"Name of the GCS bucket from which to access build context as tarball.\")\n\tRootCmd.PersistentFlags().VarP(&opts.Destinations, \"destination\", \"d\", \"Registry the final image should be pushed to. Set it repeatedly for multiple destinations.\")\n\tRootCmd.PersistentFlags().StringVarP(&opts.SnapshotMode, \"snapshot-mode\", \"\", \"full\", \"Change the file attributes inspected during snapshotting\")\n\tRootCmd.PersistentFlags().StringVarP(&opts.CustomPlatform, \"custom-platform\", \"\", \"\", \"Specify the build platform if different from the current host\")\n\tRootCmd.PersistentFlags().VarP(&opts.BuildArgs, \"build-arg\", \"\", \"This flag allows you to pass in ARG values at build time. Set it repeatedly for multiple values.\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.Insecure, \"insecure\", \"\", false, \"Push to insecure registry using plain HTTP\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.SkipTLSVerify, \"skip-tls-verify\", \"\", false, \"Push to insecure registry ignoring TLS verify\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.InsecurePull, \"insecure-pull\", \"\", false, \"Pull from insecure registry using plain HTTP\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.SkipTLSVerifyPull, \"skip-tls-verify-pull\", \"\", false, \"Pull from insecure registry ignoring TLS verify\")\n\tRootCmd.PersistentFlags().IntVar(&opts.PushRetry, \"push-retry\", 0, \"Number of retries for the push operation\")\n\tRootCmd.PersistentFlags().BoolVar(&opts.PushIgnoreImmutableTagErrors, \"push-ignore-immutable-tag-errors\", false, \"If true, known tag immutability errors are ignored and the push finishes with success.\")\n\tRootCmd.PersistentFlags().IntVar(&opts.ImageFSExtractRetry, \"image-fs-extract-retry\", 0, \"Number of retries for image FS extraction\")\n\tRootCmd.PersistentFlags().IntVar(&opts.ImageDownloadRetry, \"image-download-retry\", 0, \"Number of retries for downloading the remote image\")\n\tRootCmd.PersistentFlags().StringVarP(&opts.KanikoDir, \"kaniko-dir\", \"\", constants.DefaultKanikoPath, \"Path to the kaniko directory, this takes precedence over the KANIKO_DIR environment variable.\")\n\tRootCmd.PersistentFlags().StringVarP(&opts.TarPath, \"tar-path\", \"\", \"\", \"Path to save the image in as a tarball instead of pushing\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.SingleSnapshot, \"single-snapshot\", \"\", false, \"Take a single snapshot at the end of the build.\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.Reproducible, \"reproducible\", \"\", false, \"Strip timestamps out of the image to make it reproducible\")\n\tRootCmd.PersistentFlags().StringVarP(&opts.Target, \"target\", \"\", \"\", \"Set the target build stage to build\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.NoPush, \"no-push\", \"\", false, \"Do not push the image to the registry\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.NoPushCache, \"no-push-cache\", \"\", false, \"Do not push the cache layers to the registry\")\n\tRootCmd.PersistentFlags().StringVarP(&opts.CacheRepo, \"cache-repo\", \"\", \"\", \"Specify a repository to use as a cache, otherwise one will be inferred from the destination provided; when prefixed with 'oci:' the repository will be written in OCI image layout format at the path provided\")\n\tRootCmd.PersistentFlags().StringVarP(&opts.CacheDir, \"cache-dir\", \"\", \"/cache\", \"Specify a local directory to use as a cache.\")\n\tRootCmd.PersistentFlags().StringVarP(&opts.DigestFile, \"digest-file\", \"\", \"\", \"Specify a file to save the digest of the built image to.\")\n\tRootCmd.PersistentFlags().StringVarP(&opts.ImageNameDigestFile, \"image-name-with-digest-file\", \"\", \"\", \"Specify a file to save the image name w/ digest of the built image to.\")\n\tRootCmd.PersistentFlags().StringVarP(&opts.ImageNameTagDigestFile, \"image-name-tag-with-digest-file\", \"\", \"\", \"Specify a file to save the image name w/ image tag w/ digest of the built image to.\")\n\tRootCmd.PersistentFlags().StringVarP(&opts.OCILayoutPath, \"oci-layout-path\", \"\", \"\", \"Path to save the OCI image layout of the built image.\")\n\tRootCmd.PersistentFlags().VarP(&opts.Compression, \"compression\", \"\", \"Compression algorithm (gzip, zstd)\")\n\tRootCmd.PersistentFlags().IntVarP(&opts.CompressionLevel, \"compression-level\", \"\", -1, \"Compression level\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.Cache, \"cache\", \"\", false, \"Use cache when building image\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.CompressedCaching, \"compressed-caching\", \"\", true, \"Compress the cached layers. Decreases build time, but increases memory usage.\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.Cleanup, \"cleanup\", \"\", false, \"Clean the filesystem at the end\")\n\tRootCmd.PersistentFlags().DurationVarP(&opts.CacheTTL, \"cache-ttl\", \"\", time.Hour*336, \"Cache timeout, requires value and unit of duration -> ex: 6h. Defaults to two weeks.\")\n\tRootCmd.PersistentFlags().VarP(&opts.InsecureRegistries, \"insecure-registry\", \"\", \"Insecure registry using plain HTTP to push and pull. Set it repeatedly for multiple registries.\")\n\tRootCmd.PersistentFlags().VarP(&opts.SkipTLSVerifyRegistries, \"skip-tls-verify-registry\", \"\", \"Insecure registry ignoring TLS verify to push and pull. Set it repeatedly for multiple registries.\")\n\topts.RegistriesCertificates = make(map[string]string)\n\tRootCmd.PersistentFlags().VarP(&opts.RegistriesCertificates, \"registry-certificate\", \"\", \"Use the provided certificate for TLS communication with the given registry. Expected format is 'my.registry.url=/path/to/the/server/certificate'.\")\n\topts.RegistriesClientCertificates = make(map[string]string)\n\tRootCmd.PersistentFlags().VarP(&opts.RegistriesClientCertificates, \"registry-client-cert\", \"\", \"Use the provided client certificate for mutual TLS (mTLS) communication with the given registry. Expected format is 'my.registry.url=/path/to/client/cert,/path/to/client/key'.\")\n\topts.RegistryMaps = make(map[string][]string)\n\tRootCmd.PersistentFlags().VarP(&opts.RegistryMaps, \"registry-map\", \"\", \"Registry map of mirror to use as pull-through cache instead. Expected format is 'orignal.registry=new.registry;other-original.registry=other-remap.registry'\")\n\tRootCmd.PersistentFlags().VarP(&opts.RegistryMirrors, \"registry-mirror\", \"\", \"Registry mirror to use as pull-through cache instead of docker.io. Set it repeatedly for multiple mirrors.\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.SkipDefaultRegistryFallback, \"skip-default-registry-fallback\", \"\", false, \"If an image is not found on any mirrors (defined with registry-mirror) do not fallback to the default registry. If registry-mirror is not defined, this flag is ignored.\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.IgnoreVarRun, \"ignore-var-run\", \"\", true, \"Ignore /var/run directory when taking image snapshot. Set it to false to preserve /var/run/ in destination image.\")\n\tRootCmd.PersistentFlags().VarP(&opts.Labels, \"label\", \"\", \"Set metadata for an image. Set it repeatedly for multiple labels.\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.SkipUnusedStages, \"skip-unused-stages\", \"\", false, \"Build only used stages if defined to true. Otherwise it builds by default all stages, even the unnecessaries ones until it reaches the target stage / end of Dockerfile\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.RunV2, \"use-new-run\", \"\", false, \"Use the experimental run implementation for detecting changes without requiring file system snapshots.\")\n\tRootCmd.PersistentFlags().Var(&opts.Git, \"git\", \"Branch to clone if build context is a git repository\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.CacheCopyLayers, \"cache-copy-layers\", \"\", false, \"Caches copy layers\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.CacheRunLayers, \"cache-run-layers\", \"\", true, \"Caches run layers\")\n\tRootCmd.PersistentFlags().VarP(&opts.IgnorePaths, \"ignore-path\", \"\", \"Ignore these paths when taking a snapshot. Set it repeatedly for multiple paths.\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.ForceBuildMetadata, \"force-build-metadata\", \"\", false, \"Force add metadata layers to build image\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.SkipPushPermissionCheck, \"skip-push-permission-check\", \"\", false, \"Skip check of the push permission\")\n\n\t// Deprecated flags.\n\tRootCmd.PersistentFlags().StringVarP(&opts.SnapshotModeDeprecated, \"snapshotMode\", \"\", \"\", \"This flag is deprecated. Please use '--snapshot-mode'.\")\n\tRootCmd.PersistentFlags().StringVarP(&opts.CustomPlatformDeprecated, \"customPlatform\", \"\", \"\", \"This flag is deprecated. Please use '--custom-platform'.\")\n\tRootCmd.PersistentFlags().StringVarP(&opts.TarPath, \"tarPath\", \"\", \"\", \"This flag is deprecated. Please use '--tar-path'.\")\n}\n\n// addHiddenFlags marks certain flags as hidden from the executor help text\nfunc addHiddenFlags(cmd *cobra.Command) {\n\t// This flag is added in a vendored directory, hide so that it doesn't come up via --help\n\tpflag.CommandLine.MarkHidden(\"azure-container-registry-config\")\n\t// Hide this flag as we want to encourage people to use the --context flag instead\n\tcmd.PersistentFlags().MarkHidden(\"bucket\")\n}\n\n// checkKanikoDir will check whether the executor is operating in the default '/kaniko' directory,\n// conducting the relevant operations if it is not\nfunc checkKanikoDir(dir string) error {\n\tif dir != constants.DefaultKanikoPath {\n\n\t\t// The destination directory may be across a different partition, so we cannot simply rename/move the directory in this case.\n\t\tif _, err := util.CopyDir(constants.DefaultKanikoPath, dir, util.FileContext{}, util.DoNotChangeUID, util.DoNotChangeGID, fs.FileMode(0o600), true); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := os.RemoveAll(constants.DefaultKanikoPath); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// After remove DefaultKankoPath, the DOKCER_CONFIG env will point to a non-exist dir, so we should update DOCKER_CONFIG env to new dir\n\t\tif err := os.Setenv(\"DOCKER_CONFIG\", filepath.Join(dir, \"/.docker\")); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc checkContained() bool {\n\treturn proc.GetContainerRuntime(0, 0) != proc.RuntimeNotFound\n}\n\n// checkNoDeprecatedFlags return an error if deprecated flags are used.\nfunc checkNoDeprecatedFlags() {\n\t// In version >=2.0.0 make it fail (`Warn` -> `Fatal`)\n\tif opts.CustomPlatformDeprecated != \"\" {\n\t\tlogrus.Warn(\"Flag --customPlatform is deprecated. Use: --custom-platform\")\n\t\topts.CustomPlatform = opts.CustomPlatformDeprecated\n\t}\n\n\tif opts.SnapshotModeDeprecated != \"\" {\n\t\tlogrus.Warn(\"Flag --snapshotMode is deprecated. Use: --snapshot-mode\")\n\t\topts.SnapshotMode = opts.SnapshotModeDeprecated\n\t}\n\n\tif opts.TarPathDeprecated != \"\" {\n\t\tlogrus.Warn(\"Flag --tarPath is deprecated. Use: --tar-path\")\n\t\topts.TarPath = opts.TarPathDeprecated\n\t}\n}\n\n// cacheFlagsValid makes sure the flags passed in related to caching are valid\nfunc cacheFlagsValid() error {\n\tif !opts.Cache {\n\t\treturn nil\n\t}\n\t// If --cache=true and --no-push=true, then cache repo must be provided\n\t// since cache can't be inferred from destination\n\tif opts.CacheRepo == \"\" && opts.NoPush {\n\t\treturn errors.New(\"if using cache with --no-push, specify cache repo with --cache-repo\")\n\t}\n\treturn nil\n}\n\n// resolveDockerfilePath resolves the Dockerfile path to an absolute path\nfunc resolveDockerfilePath() error {\n\tif isURL(opts.DockerfilePath) {\n\t\treturn nil\n\t}\n\tif util.FilepathExists(opts.DockerfilePath) {\n\t\tabs, err := filepath.Abs(opts.DockerfilePath)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"getting absolute path for dockerfile\")\n\t\t}\n\t\topts.DockerfilePath = abs\n\t\treturn copyDockerfile()\n\t}\n\t// Otherwise, check if the path relative to the build context exists\n\tif util.FilepathExists(filepath.Join(opts.SrcContext, opts.DockerfilePath)) {\n\t\tabs, err := filepath.Abs(filepath.Join(opts.SrcContext, opts.DockerfilePath))\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"getting absolute path for src context/dockerfile path\")\n\t\t}\n\t\topts.DockerfilePath = abs\n\t\treturn copyDockerfile()\n\t}\n\treturn errors.New(\"please provide a valid path to a Dockerfile within the build context with --dockerfile\")\n}\n\n// resolveEnvironmentBuildArgs replace build args without value by the same named environment variable\nfunc resolveEnvironmentBuildArgs(arguments []string, resolver func(string) string) {\n\tfor index, argument := range arguments {\n\t\ti := strings.Index(argument, \"=\")\n\t\tif i < 0 {\n\t\t\tvalue := resolver(argument)\n\t\t\targuments[index] = fmt.Sprintf(\"%s=%s\", argument, value)\n\t\t}\n\t}\n}\n\n// copy Dockerfile to /kaniko/Dockerfile so that if it's specified in the .dockerignore\n// it won't be copied into the image\nfunc copyDockerfile() error {\n\tif _, err := util.CopyFile(opts.DockerfilePath, config.DockerfilePath, util.FileContext{}, util.DoNotChangeUID, util.DoNotChangeGID, fs.FileMode(0o600), true); err != nil {\n\t\treturn errors.Wrap(err, \"copying dockerfile\")\n\t}\n\tdockerignorePath := opts.DockerfilePath + \".dockerignore\"\n\tif util.FilepathExists(dockerignorePath) {\n\t\tif _, err := util.CopyFile(dockerignorePath, config.DockerfilePath+\".dockerignore\", util.FileContext{}, util.DoNotChangeUID, util.DoNotChangeGID, fs.FileMode(0o600), true); err != nil {\n\t\t\treturn errors.Wrap(err, \"copying Dockerfile.dockerignore\")\n\t\t}\n\t}\n\topts.DockerfilePath = config.DockerfilePath\n\treturn nil\n}\n\n// resolveSourceContext unpacks the source context if it is a tar in a bucket or in kaniko container\n// it resets srcContext to be the path to the unpacked build context within the image\nfunc resolveSourceContext() error {\n\tif opts.SrcContext == \"\" && opts.Bucket == \"\" {\n\t\treturn errors.New(\"please specify a path to the build context with the --context flag or a bucket with the --bucket flag\")\n\t}\n\tif opts.SrcContext != \"\" && !strings.Contains(opts.SrcContext, \"://\") {\n\t\treturn nil\n\t}\n\tif opts.Bucket != \"\" {\n\t\tif !strings.Contains(opts.Bucket, \"://\") {\n\t\t\t// if no prefix use Google Cloud Storage as default for backwards compatibility\n\t\t\topts.SrcContext = constants.GCSBuildContextPrefix + opts.Bucket\n\t\t} else {\n\t\t\topts.SrcContext = opts.Bucket\n\t\t}\n\t}\n\tcontextExecutor, err := buildcontext.GetBuildContext(opts.SrcContext, buildcontext.BuildOptions{\n\t\tGitBranch:            opts.Git.Branch,\n\t\tGitSingleBranch:      opts.Git.SingleBranch,\n\t\tGitRecurseSubmodules: opts.Git.RecurseSubmodules,\n\t\tInsecureSkipTLS:      opts.Git.InsecureSkipTLS,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tlogrus.Debugf(\"Getting source context from %s\", opts.SrcContext)\n\topts.SrcContext, err = contextExecutor.UnpackTarFromBuildContext()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif ctxSubPath != \"\" {\n\t\topts.SrcContext = filepath.Join(opts.SrcContext, ctxSubPath)\n\t\tif _, err := os.Stat(opts.SrcContext); os.IsNotExist(err) {\n\t\t\treturn err\n\t\t}\n\t}\n\tlogrus.Debugf(\"Build context located at %s\", opts.SrcContext)\n\treturn nil\n}\n\nfunc resolveRelativePaths() error {\n\toptsPaths := []*string{\n\t\t&opts.DockerfilePath,\n\t\t&opts.SrcContext,\n\t\t&opts.CacheDir,\n\t\t&opts.TarPath,\n\t\t&opts.DigestFile,\n\t\t&opts.ImageNameDigestFile,\n\t\t&opts.ImageNameTagDigestFile,\n\t}\n\n\tfor _, p := range optsPaths {\n\t\tif path := *p; shdSkip(path) {\n\t\t\tlogrus.Debugf(\"Skip resolving path %s\", path)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Resolve relative path to absolute path\n\t\tvar err error\n\t\trelp := *p // save original relative path\n\t\tif *p, err = filepath.Abs(*p); err != nil {\n\t\t\treturn errors.Wrapf(err, \"Couldn't resolve relative path %s to an absolute path\", *p)\n\t\t}\n\t\tlogrus.Debugf(\"Resolved relative path %s to %s\", relp, *p)\n\t}\n\treturn nil\n}\n\nfunc exit(err error) {\n\tvar execErr *exec.ExitError\n\tif errors.As(err, &execErr) {\n\t\t// if there is an exit code propagate it\n\t\texitWithCode(err, execErr.ExitCode())\n\t}\n\t// otherwise exit with catch all 1\n\texitWithCode(err, 1)\n}\n\n// exits with the given error and exit code\nfunc exitWithCode(err error, exitCode int) {\n\tfmt.Fprintln(os.Stderr, err)\n\tos.Exit(exitCode)\n}\n\nfunc isURL(path string) bool {\n\tif match, _ := regexp.MatchString(\"^https?://\", path); match {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc shdSkip(path string) bool {\n\treturn path == \"\" || isURL(path) || filepath.IsAbs(path)\n}\n"
  },
  {
    "path": "cmd/executor/cmd/root_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage cmd\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n)\n\nfunc TestSkipPath(t *testing.T) {\n\ttests := []struct {\n\t\tdescription string\n\t\tpath        string\n\t\texpected    bool\n\t}{\n\t\t{\n\t\t\tdescription: \"path is a http url\",\n\t\t\tpath:        \"http://test\",\n\t\t\texpected:    true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"path is a https url\",\n\t\t\tpath:        \"https://test\",\n\t\t\texpected:    true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"path is a empty\",\n\t\t\tpath:        \"\",\n\t\t\texpected:    true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"path is already abs\",\n\t\t\tpath:        \"/tmp/test\",\n\t\t\texpected:    true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"path is relative\",\n\t\t\tpath:        \".././test\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.description, func(t *testing.T) {\n\t\t\ttestutil.CheckDeepEqual(t, tt.expected, shdSkip(tt.path))\n\t\t})\n\t}\n}\n\nfunc TestIsUrl(t *testing.T) {\n\ttests := []struct {\n\t\tdescription string\n\t\tpath        string\n\t\texpected    bool\n\t}{\n\t\t{\n\t\t\tdescription: \"path is a http url\",\n\t\t\tpath:        \"http://test\",\n\t\t\texpected:    true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"path is a https url\",\n\t\t\tpath:        \"https://test\",\n\t\t\texpected:    true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"path is a empty\",\n\t\t\tpath:        \"\",\n\t\t},\n\t\t{\n\t\t\tdescription: \"path is already abs\",\n\t\t\tpath:        \"/tmp/test\",\n\t\t},\n\t\t{\n\t\t\tdescription: \"path is relative\",\n\t\t\tpath:        \".././test\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.description, func(t *testing.T) {\n\t\t\ttestutil.CheckDeepEqual(t, tt.expected, isURL(tt.path))\n\t\t})\n\t}\n}\n\nfunc TestResolveEnvironmentBuildArgs(t *testing.T) {\n\ttests := []struct {\n\t\tdescription               string\n\t\tinput                     []string\n\t\texpected                  []string\n\t\tmockedEnvironmentResolver func(string) string\n\t}{\n\t\t{\n\t\t\tdescription: \"replace when environment variable is present and value is not specified\",\n\t\t\tinput:       []string{\"variable1\"},\n\t\t\texpected:    []string{\"variable1=value1\"},\n\t\t\tmockedEnvironmentResolver: func(variable string) string {\n\t\t\t\tif variable == \"variable1\" {\n\t\t\t\t\treturn \"value1\"\n\t\t\t\t}\n\t\t\t\treturn \"\"\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"do not replace when environment variable is present and value is specified\",\n\t\t\tinput:       []string{\"variable1=value1\", \"variable2=value2\"},\n\t\t\texpected:    []string{\"variable1=value1\", \"variable2=value2\"},\n\t\t\tmockedEnvironmentResolver: func(variable string) string {\n\t\t\t\treturn \"unexpected\"\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"do not replace when environment variable is present and empty value is specified\",\n\t\t\tinput:       []string{\"variable1=\"},\n\t\t\texpected:    []string{\"variable1=\"},\n\t\t\tmockedEnvironmentResolver: func(variable string) string {\n\t\t\t\treturn \"unexpected\"\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"replace with empty value when environment variable is not present or empty and value is not specified\",\n\t\t\tinput:       []string{\"variable1\", \"variable2=value2\"},\n\t\t\texpected:    []string{\"variable1=\", \"variable2=value2\"},\n\t\t\tmockedEnvironmentResolver: func(variable string) string {\n\t\t\t\treturn \"\"\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.description, func(t *testing.T) {\n\t\t\tresolveEnvironmentBuildArgs(tt.input, tt.mockedEnvironmentResolver)\n\t\t\ttestutil.CheckDeepEqual(t, tt.expected, tt.input)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "cmd/executor/cmd/version.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage cmd\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/version\"\n\t\"github.com/spf13/cobra\"\n)\n\nfunc init() {\n\tRootCmd.AddCommand(versionCmd)\n}\n\nvar versionCmd = &cobra.Command{\n\tUse:   \"version\",\n\tShort: \"Print the version number of kaniko\",\n\tRun: func(cmd *cobra.Command, args []string) {\n\t\tfmt.Println(\"Kaniko version : \", version.Version())\n\t},\n}\n"
  },
  {
    "path": "cmd/executor/main.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage main\n\nimport (\n\t\"os\"\n\n\t\"github.com/GoogleContainerTools/kaniko/cmd/executor/cmd\"\n\n\t\"github.com/google/slowjam/pkg/stacklog\"\n)\n\nfunc main() {\n\ts := stacklog.MustStartFromEnv(\"STACKLOG_PATH\")\n\tdefer s.Stop()\n\n\tif err := cmd.RootCmd.Execute(); err != nil {\n\t\tos.Exit(1)\n\t}\n}\n"
  },
  {
    "path": "cmd/warmer/cmd/root.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage cmd\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/cache\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/logging\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/containerd/containerd/platforms\"\n\t\"github.com/google/go-containerregistry/pkg/name\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n\t\"github.com/spf13/cobra\"\n)\n\nvar (\n\topts         = &config.WarmerOptions{}\n\tlogLevel     string\n\tlogFormat    string\n\tlogTimestamp bool\n)\n\nfunc init() {\n\tRootCmd.PersistentFlags().StringVarP(&logLevel, \"verbosity\", \"v\", logging.DefaultLevel, \"Log level (trace, debug, info, warn, error, fatal, panic)\")\n\tRootCmd.PersistentFlags().StringVar(&logFormat, \"log-format\", logging.FormatColor, \"Log format (text, color, json)\")\n\tRootCmd.PersistentFlags().BoolVar(&logTimestamp, \"log-timestamp\", logging.DefaultLogTimestamp, \"Timestamp in log output\")\n\n\taddKanikoOptionsFlags()\n\taddHiddenFlags()\n}\n\nvar RootCmd = &cobra.Command{\n\tUse: \"cache warmer\",\n\tPersistentPreRunE: func(cmd *cobra.Command, args []string) error {\n\t\tif err := logging.Configure(logLevel, logFormat, logTimestamp); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Allow setting --registry-maps using an environment variable.\n\t\t// some users use warmer with --regisry-mirror before v1.21.0\n\t\t// TODO may need all executors validation in here\n\n\t\tif val, ok := os.LookupEnv(\"KANIKO_REGISTRY_MAP\"); ok {\n\t\t\topts.RegistryMaps.Set(val)\n\t\t}\n\n\t\tfor _, target := range opts.RegistryMirrors {\n\t\t\topts.RegistryMaps.Set(fmt.Sprintf(\"%s=%s\", name.DefaultRegistry, target))\n\t\t}\n\n\t\tif len(opts.RegistryMaps) > 0 {\n\t\t\tfor src, dsts := range opts.RegistryMaps {\n\t\t\t\tlogrus.Debugf(\"registry-map remaps %s to %s.\", src, strings.Join(dsts, \", \"))\n\t\t\t}\n\t\t}\n\n\t\tif len(opts.Images) == 0 && opts.DockerfilePath == \"\" {\n\t\t\treturn errors.New(\"You must select at least one image to cache or a dockerfilepath to parse\")\n\t\t}\n\n\t\tif opts.DockerfilePath != \"\" {\n\t\t\tif err := validateDockerfilePath(); err != nil {\n\t\t\t\treturn errors.Wrap(err, \"error validating dockerfile path\")\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t},\n\tRun: func(cmd *cobra.Command, args []string) {\n\t\tif _, err := os.Stat(opts.CacheDir); os.IsNotExist(err) {\n\t\t\terr = os.MkdirAll(opts.CacheDir, 0755)\n\t\t\tif err != nil {\n\t\t\t\texit(errors.Wrap(err, \"Failed to create cache directory\"))\n\t\t\t}\n\t\t}\n\t\tif err := cache.WarmCache(opts); err != nil {\n\t\t\texit(errors.Wrap(err, \"Failed warming cache\"))\n\t\t}\n\n\t},\n}\n\n// addKanikoOptionsFlags configures opts\nfunc addKanikoOptionsFlags() {\n\tRootCmd.PersistentFlags().VarP(&opts.Images, \"image\", \"i\", \"Image to cache. Set it repeatedly for multiple images.\")\n\tRootCmd.PersistentFlags().StringVarP(&opts.CacheDir, \"cache-dir\", \"c\", \"/cache\", \"Directory of the cache.\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.Force, \"force\", \"f\", false, \"Force cache overwriting.\")\n\tRootCmd.PersistentFlags().DurationVarP(&opts.CacheTTL, \"cache-ttl\", \"\", time.Hour*336, \"Cache timeout in hours. Defaults to two weeks.\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.InsecurePull, \"insecure-pull\", \"\", false, \"Pull from insecure registry using plain HTTP\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.SkipTLSVerifyPull, \"skip-tls-verify-pull\", \"\", false, \"Pull from insecure registry ignoring TLS verify\")\n\tRootCmd.PersistentFlags().VarP(&opts.InsecureRegistries, \"insecure-registry\", \"\", \"Insecure registry using plain HTTP to pull. Set it repeatedly for multiple registries.\")\n\tRootCmd.PersistentFlags().VarP(&opts.SkipTLSVerifyRegistries, \"skip-tls-verify-registry\", \"\", \"Insecure registry ignoring TLS verify to pull. Set it repeatedly for multiple registries.\")\n\topts.RegistriesCertificates = make(map[string]string)\n\tRootCmd.PersistentFlags().VarP(&opts.RegistriesCertificates, \"registry-certificate\", \"\", \"Use the provided certificate for TLS communication with the given registry. Expected format is 'my.registry.url=/path/to/the/server/certificate'.\")\n\topts.RegistriesClientCertificates = make(map[string]string)\n\tRootCmd.PersistentFlags().VarP(&opts.RegistriesClientCertificates, \"registry-client-cert\", \"\", \"Use the provided client certificate for mutual TLS (mTLS) communication with the given registry. Expected format is 'my.registry.url=/path/to/client/cert,/path/to/client/key'.\")\n\topts.RegistryMaps = make(map[string][]string)\n\tRootCmd.PersistentFlags().VarP(&opts.RegistryMaps, \"registry-map\", \"\", \"Registry map of mirror to use as pull-through cache instead. Expected format is 'orignal.registry=new.registry;other-original.registry=other-remap.registry'\")\n\tRootCmd.PersistentFlags().VarP(&opts.RegistryMirrors, \"registry-mirror\", \"\", \"Registry mirror to use as pull-through cache instead of docker.io. Set it repeatedly for multiple mirrors.\")\n\tRootCmd.PersistentFlags().BoolVarP(&opts.SkipDefaultRegistryFallback, \"skip-default-registry-fallback\", \"\", false, \"If an image is not found on any mirrors (defined with registry-mirror) do not fallback to the default registry. If registry-mirror is not defined, this flag is ignored.\")\n\tRootCmd.PersistentFlags().StringVarP(&opts.CustomPlatform, \"customPlatform\", \"\", \"\", \"Specify the build platform if different from the current host\")\n\tRootCmd.PersistentFlags().StringVarP(&opts.DockerfilePath, \"dockerfile\", \"d\", \"\", \"Path to the dockerfile to be cached. The kaniko warmer will parse and write out each stage's base image layers to the cache-dir. Using the same dockerfile path as what you plan to build in the kaniko executor is the expected usage.\")\n\tRootCmd.PersistentFlags().VarP(&opts.BuildArgs, \"build-arg\", \"\", \"This flag should be used in conjunction with the dockerfile flag for scenarios where dynamic replacement of the base image is required.\")\n\n\t// Default the custom platform flag to our current platform, and validate it.\n\tif opts.CustomPlatform == \"\" {\n\t\topts.CustomPlatform = platforms.Format(platforms.Normalize(platforms.DefaultSpec()))\n\t}\n\tif _, err := v1.ParsePlatform(opts.CustomPlatform); err != nil {\n\t\tlogrus.Fatalf(\"Invalid platform %q: %v\", opts.CustomPlatform, err)\n\t}\n}\n\n// addHiddenFlags marks certain flags as hidden from the executor help text\nfunc addHiddenFlags() {\n\tRootCmd.PersistentFlags().MarkHidden(\"azure-container-registry-config\")\n}\n\nfunc validateDockerfilePath() error {\n\tif isURL(opts.DockerfilePath) {\n\t\treturn nil\n\t}\n\tif util.FilepathExists(opts.DockerfilePath) {\n\t\tabs, err := filepath.Abs(opts.DockerfilePath)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"getting absolute path for dockerfile\")\n\t\t}\n\t\topts.DockerfilePath = abs\n\t\treturn nil\n\t}\n\n\treturn errors.New(\"please provide a valid path to a Dockerfile within the build context with --dockerfile\")\n}\n\nfunc isURL(path string) bool {\n\tif match, _ := regexp.MatchString(\"^https?://\", path); match {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc exit(err error) {\n\tfmt.Println(err)\n\tos.Exit(1)\n}\n"
  },
  {
    "path": "cmd/warmer/main.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage main\n\nimport (\n\t\"os\"\n\n\t\"github.com/GoogleContainerTools/kaniko/cmd/warmer/cmd\"\n)\n\nfunc main() {\n\tif err := cmd.RootCmd.Execute(); err != nil {\n\t\tos.Exit(1)\n\t}\n}\n"
  },
  {
    "path": "code-of-conduct.md",
    "content": "# Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, gender identity and expression, level of\nexperience, education, socio-economic status, nationality, personal appearance,\nrace, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n*   Using welcoming and inclusive language\n*   Being respectful of differing viewpoints and experiences\n*   Gracefully accepting constructive criticism\n*   Focusing on what is best for the community\n*   Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n*   The use of sexualized language or imagery and unwelcome sexual attention or\n    advances\n*   Trolling, insulting/derogatory comments, and personal or political attacks\n*   Public or private harassment\n*   Publishing others' private information, such as a physical or electronic\n    address, without explicit permission\n*   Other conduct which could reasonably be considered inappropriate in a\n    professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers 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, or to ban temporarily or permanently any\ncontributor for other behaviors that they deem inappropriate, threatening,\noffensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\nThis Code of Conduct also applies outside the project spaces when the Project\nSteward has a reasonable belief that an individual's behavior may have a\nnegative impact on the project or its community.\n\n## Conflict Resolution\n\nWe do not believe that all conflict is bad; healthy debate and disagreement\noften yield positive results. However, it is never okay to be disrespectful or\nto engage in behavior that violates the project’s code of conduct.\n\nIf you see someone violating the code of conduct, you are encouraged to address\nthe behavior directly with those involved. Many issues can be resolved quickly\nand easily, and this gives people more control over the outcome of their\ndispute. If you are unable to resolve the matter for any reason, or if the\nbehavior is threatening or harassing, report it. We are dedicated to providing\nan environment where participants feel welcome and safe.\n\nReports should be directed to the maintainers, the Project Steward(s).\nIt is the Project Steward’s duty to receive and address reported \nviolations of the code of conduct. They will then work with a committee \nconsisting of representatives from the Open Source Programs Office and the \nGoogle Open Source Strategy team. If for any reason you are uncomfortable \nreaching out the Project Steward, please email opensource@google.com.\n\nWe will investigate every complaint, but you may not receive a direct response.\nWe will use our discretion in determining when and how to follow up on reported\nincidents, which may range from not taking action to permanent expulsion from\nthe project and project-sponsored spaces. We will notify the accused of the\nreport and provide them an opportunity to discuss it before any action is taken.\nThe identity of the reporter will be omitted from the details of the report\nsupplied to the accused. In potentially harmful situations, such as ongoing\nharassment or threats to anyone's safety, we may take action without notice.\n\n## Enforcement\n\n<!-- TODO: Need a real CoC contact list. -->\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team. All complaints will be reviewed and\ninvestigated and will result in a response that is deemed necessary and\nappropriate to the circumstances. The project team is obligated to maintain\nconfidentiality with regard to the reporter of an incident. Further details of\nspecific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the Contributor Covenant, version 1.4,\navailable at\nhttps://www.contributor-covenant.org/version/1/4/code-of-conduct.html\n"
  },
  {
    "path": "cosign.pub",
    "content": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9aAfAcgAxIFMTstJUv8l/AMqnSKw\nP+vLu3NnnBDHCfREQpV/AJuiZ1UtgGpFpHlJLCNPmFkzQTnfyN5idzNl6Q==\n-----END PUBLIC KEY-----\n"
  },
  {
    "path": "deploy/Dockerfile",
    "content": "# Copyright 2018 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nFROM golang:1.24 AS builder\nWORKDIR /src\n\n# This arg is passed by docker buildx & contains the target CPU architecture (e.g., amd64, arm64, etc.)\nARG TARGETARCH\nARG TARGETOS\n\nENV GOARCH=$TARGETARCH\nENV GOOS=$TARGETOS\n\nENV CGO_ENABLED=0\nENV GOBIN=/usr/local/bin\n\n# Add .docker config dir\nRUN mkdir -p /kaniko/.docker\n\nCOPY . .\n\n#  dependencies https://github.com/golang/go/issues/48332\n\n# The versions of these tools and their transitive dependencies are controlled via go.mod.\n# To update the version of any tool installed here, run\n#\n#   go get <tool>@<commit-sha-or-tag>\n#   go mod vendor\n#\n# Then submit a PR with the changes to `go.mod`, `go.sum`, and `vendor`.\n\n# Get GCR credential helper\nRUN go install github.com/GoogleCloudPlatform/docker-credential-gcr/v2\n\n# Get Amazon ECR credential helper\nRUN go install github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cli/docker-credential-ecr-login\n\n# Get ACR docker env credential helper\nRUN go install github.com/chrismellard/docker-credential-acr-env\n\nRUN \\\n  --mount=type=cache,target=/root/.cache/go-build \\\n  --mount=type=cache,target=/go/pkg \\\n  make out/executor out/warmer\n\n# Generate latest ca-certificates\nFROM debian:bookworm-slim AS certs\nRUN apt update && apt install -y ca-certificates\n\n# use musl busybox since it's staticly compiled on all platforms\nFROM busybox:musl AS busybox\n\nFROM scratch AS kaniko-base-slim\n\n# Create kaniko directory with world write permission to allow non root run\nRUN --mount=from=busybox,dst=/usr/ [\"busybox\", \"sh\", \"-c\", \"mkdir -p /kaniko && chmod 777 /kaniko\"]\n\nCOPY --from=certs /etc/ssl/certs/ca-certificates.crt /kaniko/ssl/certs/\nCOPY files/nsswitch.conf /etc/nsswitch.conf\nENV HOME /root\nENV USER root\nENV PATH /usr/local/bin:/kaniko\nENV SSL_CERT_DIR=/kaniko/ssl/certs\n\nFROM kaniko-base-slim AS kaniko-base\n\nCOPY --from=builder --chown=0:0 /usr/local/bin/docker-credential-gcr /kaniko/docker-credential-gcr\nCOPY --from=builder --chown=0:0 /usr/local/bin/docker-credential-ecr-login /kaniko/docker-credential-ecr-login\nCOPY --from=builder --chown=0:0 /usr/local/bin/docker-credential-acr-env /kaniko/docker-credential-acr-env\n\nCOPY --from=builder /kaniko/.docker /kaniko/.docker\n\nENV DOCKER_CONFIG /kaniko/.docker/\nENV DOCKER_CREDENTIAL_GCR_CONFIG /kaniko/.config/gcloud/docker_credential_gcr_config.json\nWORKDIR /workspace\n\n### FINAL STAGES ###\n\nFROM kaniko-base AS kaniko-warmer\n\nCOPY --from=builder /src/out/warmer /kaniko/warmer\n\nENTRYPOINT [\"/kaniko/warmer\"]\n\nFROM kaniko-base AS kaniko-executor\n\nCOPY --from=builder /src/out/executor /kaniko/executor\n\nENTRYPOINT [\"/kaniko/executor\"]\n\nFROM kaniko-executor AS kaniko-debug\n\nENV PATH /usr/local/bin:/kaniko:/busybox\n\nCOPY --from=builder /src/out/warmer /kaniko/warmer\n\nCOPY --from=busybox /bin /busybox\n# Declare /busybox as a volume to get it automatically in the path to ignore\nVOLUME /busybox\n\nRUN [\"/busybox/mkdir\", \"-p\", \"/bin\"]\nRUN [\"/busybox/ln\", \"-s\", \"/busybox/sh\", \"/bin/sh\"]\n\nFROM kaniko-base-slim AS kaniko-slim\n\nCOPY --from=builder /src/out/executor /kaniko/executor\n\nENTRYPOINT [\"/kaniko/executor\"]\n"
  },
  {
    "path": "docs/design_proposals/design-proposal-template.md",
    "content": "# Title\n\n* Author(s): \\<your name\\>\n* Reviewers: \\<reviewer name\\>\n\n    If you are already working with someone mention their name.\n    If not, please leave this empty, some one from the core team with assign it to themselves.\n* Date: \\<date\\>\n* Status: [Reviewed/Cancelled/Under implementation/Complete]\n\nHere is a brief explanation of the Statuses\n\n1. Reviewed: The proposal PR has been accepted, merged and ready for\n   implementation.\n2. Under implementation: An accepted proposal is being implemented by actual work.\n   Note: The design might change in this phase based on issues during\n   implementation.\n3. Cancelled: During or before implementation the proposal was cancelled.\n   It could be due to:\n   * other features added which made the current design proposal obsolete.\n   * No longer a priority.\n4. Complete: This feature/change is implemented.\n\n## Background\n\nIn this section, please mention and describe the new feature, redesign\nor refactor.\n\nPlease provide a brief explanation for the following questions:\n\n1. Why is this required?\n2. If this is a redesign, what are the drawbacks of the current implementation?\n3. Is there any another workaround, and if so, what are its drawbacks?\n4. Mention related issues, if there are any.\n\nHere is an example snippet for an enhancement:\n\n___\nCurrently, Kaniko includes `build-args` when calculating layer cache key even if they are not used\nin the corresponding dockerfile command.\n\nThis causes a 100% cache miss rate even if the layer contents are same. \nChange layer caching to include `build-args` in cache key computation only if they are used in command.\n___\n\n## Design\n\nPlease describe your solution. Please list any:\n\n* new command line flags\n* interface changes\n* design assumptions\n\n### Open Issues/Questions\n\nPlease list any open questions here in the following format:\n\n**\\<Question\\>**\n\nResolution: Please list the resolution if resolved during the design process or\nspecify __Not Yet Resolved__\n\n## Implementation plan\nAs a team, we've noticed that larger PRs can go unreviewed for long periods of\ntime. Small incremental changes get reviewed faster and are also easier for\nreviewers.\n___\n\n\n## Integration test plan\n\nPlease describe what new test cases you are going to consider."
  },
  {
    "path": "docs/design_proposals/filesystem-resolution-proposal-01.md",
    "content": "# Filesystem Resolution 01\n\n* Author(s): cgwippern@google.com\n* Reviewers: Tejal Desai\n* Date: 2020-02-12\n* Status: Reviewed\n\n## Background\n\nKaniko builds Docker image layers as overlay filesystem layers; specifically it\ncreates a tar file which contains the entire content of a given layer in the\noverlay filesystem. Each overlay layer corresponds to one image layer.\n\nOverlay filesystems should only contain the objects changed in each layer;\nmeaning that if only one file changes between some layer A and some B, layer B\nwould only contain a single file (the one that changed).\n\nTo accomplish this, Kaniko walks the entire filesystem to discover every object.\nSome of these objects may actually be a symlink to another object in the\nfilesystem; in these cases we must consider both the link and the target object.\n\nKaniko also maintains a set of ignored (aka ignored) filepaths. Any object\nwhich matches one of these filepaths should be ignored by kaniko.\n\nThis results in a 3 dimensional search space\n\n* changed relative to previous layer\n* symlink\n* whitelisted\n\nKaniko must also track which objects are referred to by multiple stages; this\nfunctionality is out of scope for this proposal.\n\nThis search space is currently managed in an inconsistent and somewhat ad-hoc\nway; code that manages the various search dimensions is spread out and\nduplicated. There are also a number of edge cases which continue\nto cause bugs.\n\nThe search space dimensions cannot be reduced or substituted.\n\nCurrently there are a number of bugs around symlinks incorrectly resolved,\nwhitelists not respected, and unchanged files added to layers.\n\n## Design\n\nDuring snapshotting, filepaths should be resolved using a consitent API which\ntakes into account both symlinks and whitelist.\n\n* Callers of this API should not be concerned with the type of object at a given filepath (e.g. symlink or not).\n* Callers of this API should not be concerned with whether a given path is whitelisted.\n* This API should return a set of filepaths which can be checked for changes\n  without further link resolution or whitelist checking.\n\nThe API should take a limited set of arguments\n* A list of absolute filepaths to scan\n* The whitelist\n\nThe API should return only two arguments\n* A set of filepaths\n* error or nil\n\nThe signature of the API should look similar to\n```\n  ResolveFilePaths(inputPaths []string, whitelist []WhitelistEntry) (resolvedPaths []string, err error)\n```\n\nThe API will iterate over the set of filepaths and for each item\n* check whether it is whitelisted; if it is, skip it\n* check whether it is a symlink\n  * if it is a symlink\n    * resolve the link ancestor (nearest ancestor which is a symlink) and the\n      target\n    * add the link ancestor to the output\n    * check whether the target is whitelisted and if\n      not add the target to the output\n\nAll ancestors of each filepath will also be added to the list, but the previous\nchecks will not be applied to the ancestors. This maintains the current behavior\nwhich we believe is needed to maintain correct permissions on the ancestor\ndirectories.\n\n### Open Issues/Questions\n\n\\<Ignore symlinks targeting whitelisted paths?\\>\n\nGiven some link `/foo/link/bar` whose target is a whitelisted path such as\n`/var/run`, should `/foo/link/bar` be added to the layer?\n\nResolution: Resolved\n\nYes, it should be added.\n\n\\<Adding ancestor directories\\>\n\nAccording to [this comment](https://github.com/GoogleContainerTools/kaniko/blob/1e9f525509d4e6a066a6e07ab9afbef69b3a3b2c/pkg/snapshot/snapshot.go#L193)\nthe ancestor directories (parent, grandparent, etc) must also be added to the\nlayer to preserve the permissions on those directories. This brings into\nquestion whether any filtering needs to happen on these ancestors. IIUC the\ncurrent whitelist logic it is possible for `/some/dir` to be whitelisted but not\n`/some/dir/containing-a-file.txt`. If filtering needs to be applied to these\nancestors does it make most sense to handle this within the proposed filtering\nAPI?\n\nResolution: Resolved\n\nYes, this should be handled in the API\n\n\\<Should the API handle diff'ing files?\\>\n\nThe proposal currently states that the list of files returned from the API\nshould be immediately added to the layer, but this would imply that diff'ing\nexisting files, finding newly created files, and handling deleted files would\nhave already been done. It may be advantageous to handle these outside of the\nAPI in order to reduce scope and complexity. If these are handled outside of the\nAPI how can we decouple and encapsulate these two functions?\n\nResolution: Resolved\n\nThe API will not handle file diffing or whiteouts.\n\n## Implementation plan\n\n* Write the new API\n* Write tests for the new API\n* Integrate the new API into existing code\n\n## Integration test plan\n\nAdd integration tests to the existing suite which cover the known bugs\n\n## Notes\n\nGiven some path `/usr/lib/foo` which is a link to `/etc/foo/`\n\nAnd `/etc/foo` contains `/etc/foo/bar.txt`\n\nAdding a link `/usr/lib/foo/bar.txt` => `/etc/foo/bar.txt` will break the image\n\nIn a linux shell this raises an error\n```\n$ ls /usr/lib/bar\n=> /usr/lib/bar/foo.txt\n$ ln -s /usr/lib/bar barlink\n$ ln -s /usr/lib/bar/foo.txt barlink/foo.txt\n=> ERROR\n```\n\nGiven some path `/usr/foo/bar` which is a link to `/dev/null`, and `/dev` is\nwhitelisted `/dev/null` should not be added to the image.\n"
  },
  {
    "path": "docs/designdoc.md",
    "content": "# Kaniko Design Doc \n\n_<span style=\"color:#666666;\">Authors: [priyawadhwa@google.com](mailto:priyawadhwa@google.com)<span style=\"color:#666666;\">, [dlorenc@google.com](mailto:dlorenc@google.com)</span></span>_\n\n\n[TOC]\n\n\n\n## Objective {#objective}\n\nKaniko aims to build container images, with enough Dockerfile support to be useful, without a dependency on a Docker daemon. There is nothing preventing us from adding full support other than the up-front engineering burden, but we'll know we're done when our customers are happy to use this in place of Docker.\n\nThis will enable building container images in environments that cannot run a Docker daemon, such as a Kubernetes cluster (where kernel privileges are unappealing). \n\n\n## Background {#background}\n\nCurrently, building a container image in a cluster can't be done safely with Docker because the Docker daemon requires privileged access. Despite no solution existing for arbitrary container images and arbitrary clusters, some workarounds exist today if users don't need full Dockerfile support or the ability to run in an arbitrary cluster with no extra privileges allowed.\n\n<span style=\"color:#000000;\">This Kubernetes [issue](https://github.com/kubernetes/kubernetes/issues/1806)<span style=\"color:#000000;\"> outlines many problems and other use-cases.</span></span>\n\n\n## Design Overview {#design-overview}\n\nKaniko is an open source tool to build container images from a Dockerfile in a Kubernetes cluster without using Docker. The user provides a Dockerfile, source context, and destination for the built image, and kaniko will build the image and push it to the desired location. This will be accomplished as follows:\n\n\n\n1.  The user will provide a Dockerfile, source context and destination for the image via a command line tool or API\n1.  The builder executable will run inside a container with access to the Dockerfile and source context supplied by the user (either as an Container Builder build step or Kubernetes Job)\n1.  The builder executable will parse the Dockerfile, and extract the filesystem of the base image (the image in the FROM line of the Dockerfile) to root. It will then execute each command in the Dockerfile, snapshotting the filesystem after each one. Snapshots will be saved as tarballs, and then appended to the base image as layers to build the final image and push it to a registry.\n\n\n## Detailed Design {#detailed-design}\n\n\n### Builder executable {#builder-executable}\n\nThe builder executable is responsible for parsing the Dockerfile, executing the commands within the Dockerfile, and building the final image. It first extracts the base image filesystem to root (the base image is the image declared in the FROM line of the Dockerfile). Next, it parses the Dockerfile, and executes each command in the Dockerfile in sequence. After executing each command, the executable will snapshot the filesystem, storing any changes in a tarball, which will be a layer in the final image. Once every command has been executed, the executable will append the new layers to the base image, and push the new image to the specified destination. \n\n\n### Snapshotting {#snapshotting}\n\nSnapshotting the filesystem can be done by checksumming every file in the image before command execution (including permission, mode and timestamp bits), then comparing these to the checksums after the command is executed. Files that have different checksums after (including files that have been deleted) need to be added to that layer's differential tarball.\n\nThis system mimics the behavior of `overlay` or `snapshotting` filesystems by moving the diffing operation into user-space. This will obviously result in lower performance than a real snapshotting filesystem, but some benchmarks show that this overhead is negligible when compared to the commands executed in a typical build. A snapshot of the entire Debian filesystem takes around .5s, unoptimized.\n\nThe tradeoff here is portability - a userspace snapshotter can execute in any storage driver or container runtime.\n\nThe following directories and files will be excluded from snapshotting. `workspace` is created by kaniko to store the builder executable and the Dockerfile. The other directories are injected by the Docker daemon or Kubernetes and can be ignored.\n\n\n\n*   `/workspace`\n*   `/dev`\n*   `/sys`\n*   `/proc`\n*   `/var/run/secrets`\n*   `/etc/hostname, /etc/hosts, /etc/mtab, /etc/resolv.conf`\n*   `/.dockerenv`\n\nThese directories and files can be dynamically discovered via introspection of the /proc/self/mountinfo file, allowing the build to run in more environments without manual whitelisting of directories.\n\n\n#### Whitelisting from /proc/self/mountinfo\n\nDocumentation for /proc/self/mountinfo can be found [here](https://www.kernel.org/doc/Documentation/filesystems/proc.txt), in section 3.5. This file contains information about mounted directories, which we want to ignore when snapshotting. Each line in the file is in the form:\n\n\n```\n36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue\n(1)(2)(3)  (4)   (5)   (6)        (7)     (8)(9)  (10)                    (11)\n```\n\n\nWhere (5) is the mount point relative to the process's root. We can parse the file line by line, storing the relative mount point in a whitelist array as we go. \n\n\n#### Ptrace Optimizations\n\nThe above discussed snapshotting can be thought of as a \"naive\" approach, examining the contents of every file after every command. Several optimizations to this are possible, including using the [ptrace(2)](http://man7.org/linux/man-pages/man2/ptrace.2.html) syscall to monitor what files are actually manipulated by the command.\n\nA rough proof of concept of this approach is available at github.com/dlorenc/ptracer.\n\nIt works as follows:\n\n\n\n1.  Setup ptrace to intercept syscalls from specified RUN commands.\n1.  Intercept syscalls that open file descriptors ([open(2), openat(2), creat(2)](http://man7.org/linux/man-pages/man2/open.2.html))\n1.  Parse the syscall arguments out of the registers using PTRACE_GETREGS, PTRACE_PEEK_DATA/TEXT and the x86_64 syscall tables.\n1.  Resolve the paths/FDs to filenames using the process's working directory/state\n\nThis can help limit the number of files that need to be examined for changes after each command.\n\n\n### Dockerfile Commands {#dockerfile-commands}\n\nThere are approximately [18 supported Dockerfile commands](https://docs.docker.com/engine/reference/builder/#from), many of which only operate on container metadata. The full set of commands is outlined below, but only \"interesting\" ones are detailed more thoroughly.\n\n\n<table>\n  <tr>\n   <td>Command\n   </td>\n   <td>Description\n   </td>\n  </tr>\n  <tr>\n   <td>FROM\n   </td>\n   <td>Used to unpack the initial (and subsequent base images for the mutli-step case).\n   </td>\n  </tr>\n  <tr>\n   <td>RUN\n   </td>\n   <td>The command will be run, with shell prepending, and the FS snapshotted after each command.\n   </td>\n  </tr>\n  <tr>\n   <td>CMD, ENTRYPOINT, LABEL, MAINTAINER, EXPOSE, VOLUME, STOPSIGNAL, HEALTHCHECK\n   </td>\n   <td>Metadata-only operations.\n   </td>\n  </tr>\n  <tr>\n   <td>ENV, WORKDIR, USER, SHELL\n   </td>\n   <td>Mostly metadata only - Variables must also be applied to the build environment at the proper time for use in subsequent RUN commands.\n   </td>\n  </tr>\n  <tr>\n   <td>ADD/COPY\n   </td>\n   <td>Files will be copied out of the build context and into the build environment. For multi-step builds, filesu will be saved from the previous build environment so they can be copied into later steps.\n   </td>\n  </tr>\n  <tr>\n   <td>ARG\n   </td>\n   <td>ARG variables will be supplied to the build executable and substituted in appropriately during parsing.\n   </td>\n  </tr>\n</table>\n\n\n\n### Source Context {#source-context}\n\nThe source context can be provided as a local directory, which will be uploaded to a GCS bucket.  Like [skaffold](https://github.com/GoogleContainerTools/skaffold), we could potentially parse the Dockerfile for dependencies and upload only the files we need to save time. Other possible source contexts include Git repositories or pre-packaged tarball contexts.\n\n\n### Permissions in the Kubernetes cluster {#permissions-in-the-kubernetes-cluster}\n\nThe Kubernetes cluster will require permission to push images to the desired registry, which will be accomplished with Secrets. \n\n\n## User Experience {#user-experience}\n\nKaniko will initially be packaged in a few formats, detailed below:\n\n\n\n*   An Container Builder build step container\n*   A command line tool for use with Kubernetes clusters\n\n\n### Container Builder Build Step Container {#Container Builder-build-step-container}\n\nThis container will surface an API as similar to the standard \"docker build\" step as possible, with changes required for the implicit \"docker push\". This container will expect the context to already be unpacked, and take an optional path to a Dockerfile. Authorization will be provided by Container Builder's spoofed metadata server, which provides the Container builder robot's credentials.\n\nThe surface will be roughly:\n\n\n```\nsteps:\n- name: 'gcr.io/some-project/kaniko\n  args: ['build-and-push', '-t', 'NAME_OF_IMAGE', '-f', 'PATH_TO_DOCKERFILE']\n# no images: stanza, image was pushed by kaniko\n```\n\n\n### Command Line Tool {#command-line-tool}\n\n\n```\n$ kaniko --dockerfile=<path to dockerfile> --context=<path to context>\n         --name=<name to push to in registry>\n```\n\n\nThe --context parameter will default to the directory of the specified dockerfile.\n\nUsing a command line tool, the user will provide a Dockerfile from which the resulting image will be built, a source context, and the full name of the registry the image should be pushed to. The command line tool will upload the source context to a GCS bucket, so that it can be accessed later on (for example, when carrying out ADD/COPY command in the Dockerfile). \n\n\n#### Kubernetes Job {#kubernetes-job}\n\nThe command line tool will then generate a Kubernetes `v1/batch Job` from the information the user has provided. The spec is shown below: \n\n\n```\n    apiVersion: batch/v1\n    kind: Job\n    metadata:\n      name: kaniko-build\n    spec:\n      template:\n        spec:\n          containers:\n          - name: init-static\n            image: gcr.io/priya-wadhwa/kaniko:latest\n            volumeMounts:\n            - name: dockerfile\n              mountPath: /dockerfile\n            command: [\"/work-dir/main\"]\n          restartPolicy: Never\n          volumes:\n          - name: dockerfile\n    \t configMap:\n            - name: build-dockerfile\n              items:\n    \t     key: dockerfile\n             data: \"dockerfile contents\" \n```\n\n\nThe Job specifies one container to run, called the init-static container. This container is based off of the distroless base image, and contains a Go builder executable and some additional files necessary for authentication. The entrypoint of the image is the builder executable, which allows the executable to examine the filesystem of the image and execute commands in this mount namespace. \n\n\n## Alternative Solutions {#alternative-solutions}\n\n\n### Docker Socket Mounting\n\nThis solution involves volume mounting the host Docker socket into the pod, essentially giving the pod full root access on the machine. This gives containers in the Pod the ability to create, delete and modify other containers running on the same node. See below for an example configuration that uses hostPath to mount the Docker socket into a pod:\n\n\n```\n        apiVersion: v1\n        kind: Pod\n        metadata:\n          name: docker\n        spec:\n          containers:\n          - image: docker\n            command: [\"docker\", \"ps\"]\n            name: docker\n            volumeMounts:\n            - name: dockersock\n              mountPath: /var/run/\n          volumes:\n          - name: dockersock\n            hostPath:\n              path: /var/run/\n```\n\n\nThis is similar to how Cloud Build exposes a Docker daemon to users.\n\nThis is a security problem and a leaky abstraction - containers in a cluster should **not** know about the container runtime of the node they are running on. This would prevent a Pod from being able to run on a node backed by an alternate CRI implementation, or even a virtual kubelet.\n\n\n### Docker-in-Docker {#docker-in-docker}\n\nSee [jpetazzo/dind](https://github.com/jpetazzo/dind) for instructions and a more thorough explanation of this approach. This approach runs a second Docker daemon inside a container, running inside the node's Docker daemon.\n\nDocker and cgroups don't handle nesting particularly well, which can lead to bugs and strange behavior. This approach also requires the `--privileged` flag on the outer container. While this is supported in Kubernetes, it must be explicitly allowed by each node's configuration before a node will accept privileged containers.\n\n\n### FTL/Bazel {#ftl-bazel}\n\nThese solutions aim to improve DevEx by achieving the fastest possible creation of Docker images, at the expense of build compatibility. By restricting the set of allowed builds to an optimizable subset, we get the nice side effect of being able to run without privileges inside an arbitrary cluster.\n\nThese approaches can be thought of as special-case \"fast paths\" that can be used in conjunction with the support for general Dockerfile builds outlined above.\n"
  },
  {
    "path": "docs/testplan.md",
    "content": "# Kaniko Test Plan\n\n\n## What do we want to test?\n\n\n\n*   The basic premise is to build the same Dockerfile, both through docker then through kaniko, then compare the resulting images. The goal is for the images to be identical, for some definition of identical, defined below.\n\n\n## What are the testing priorities?\n\n\n\n    *   Speed / Parallelization\n        *   We can build all the docker-built images and the kaniko-built images in parallel using Argo. Once everything is built, we can compare each respective image using container-diff (see what's \"good enough\" below). Once the newest container-diff release goes out, we'll be able to compare metadata as well and will no longer need to use container-structure-test, and the necessity to differentiate between types of tests will no longer exist.\n    *   Clear error messages\n        *   Currently each test is an argo build test that runs a container-diff check after both images are built. If one of the test fails, the entire test halts and we get a cryptic Argo error message. By building everything first then comparing, we're in charge of what error gets displayed on failure and we can run all the tests instead of halting at first failure.\n    *   Easy of use / Ability to read and add tests\n        *   The goal is to able to add a test to the suite by just adding a Dockerfile to a directory. The test will scan the directory for Dockerfiles and generate a test for each file. It will assume container-diff needs to return nothing by default, which can be overridden if needed (e.g. config_test_run.json). We should also be able to test any individual Dockerfile. \n    *   Thorough testing of each command \n        *   Each command currently implemented by Kaniko should have its own Dockerfile (and therefore its own test). As bugs come in and get fixed, we should be able to just add a new Dockerfile testing the bug and watch it pass. \n\n\n## What's \"good enough?\"\n\n\n\n*   Container-diff doesn't give us enough granularity since it only checks the resulting file system and metadata, without checking the layers themselves. If we add the ability to check each layer of both images side-by-side to container-diff, we could determine whether they are the same of not with confidence,\n*   We can potentially verify checksums of either the layers or the entire image as well.\n\n\n## How are we going to do this?\n\n\n\n*   Our current integration tests use` go test `to generate an Argo yaml. This yaml loops through each Dockerfile, builds it with docker and with Kaniko in parallel, then uses container-diff to test the two resulting images. If container-diff returns something unexpected, Argo exits and the entire test halts. \n*   The plan is to use go subtests.\n    *   Setup will be building all the images at once (or if a specific test is requested, just build the two images for that specific Dockerfile). \n    *   Then for each Dockerfile, invoke container-diff. If that succeeds, unpack each image tarball (this means we either need to push both images up to GCR or to docker save them at build time. I don't see a specific advantage to either) and inspect the layers.\n        *   If we pass, add it to the list of passing tests.\n        *   If we fail, specify which Dockerfile failed, and exactly what differs.\n    *   Teardown will be deleting all generated images.\n\n\n## What about testing on-cluster builds?\n\n\n\n*   We should be able to have a test Kubernetes cluster that can spin up pods for each Dockerfile. This will achieve everything we want for the tests while testing our main Kaniko use case.\n\n\n## Should we use this in CI?\n\n\n\n*   In order to reliably use this in Travis (or any other CI system), we need to separate Dockerfiles that result in non-reproducible image into a separate smoke test category. They need to be tested, but having them in CI doesn't make sense."
  },
  {
    "path": "docs/tutorial.md",
    "content": "# Getting Started Tutorial\n\nThis tutorial is for beginners who want to start using kaniko and aims to establish a quick start test case.\n\n## Table of Content\n\n1. [Prerequisities](#Prerequisities)\n2. [Prepare config files for kaniko](#Prepare-config-files-for-kaniko)\n3. [Prepare the local mounted directory](#Prepare-the-local-mounted-directory)\n4. [Create a Secret that holds your authorization token](#Create-a-Secret-that-holds-your-authorization-token)\n5. [Create resources in kubernetes](#Create-resources-in-kubernetes)\n6. [Pull the image and test](#Pull-the-image-and-test)\n\n## Prerequisities\n\n- A Kubernetes Cluster. You could use [Minikube](https://kubernetes.io/docs/setup/minikube/) to deploy kubernetes locally, or use kubernetes service from cloud provider like [Azure Kubernetes Service](https://azure.microsoft.com/en-us/services/kubernetes-service/).\n- A [dockerhub](https://hub.docker.com/) account to push built image public.\n\n## Prepare config files for kaniko\n\nPrepare several config files to create resources in kubernetes, which are:\n\n- [pod.yaml](../examples/pod.yaml) is for starting a kaniko container to build the example image.\n- [volume.yaml](../examples/volume.yaml) is for creating a persistent volume used as kaniko build context.\n- [volume-claim.yaml](../examples/volume-claim.yaml) is for creating a persistent volume claim which will mounted in the kaniko container.\n\n## Prepare the local mounted directory\n\nSSH into the cluster, and create a local directory which will be mounted in kaniko container as build context. Create a simple dockerfile there.\n\n> Note: To ssh into cluster, if you use minikube, you could use `minikube ssh` command. If you use cloud service, please refer to official doc, such as [Azure Kubernetes Service](https://docs.microsoft.com/en-us/azure/aks/ssh#code-try-0).\n\n```shell\n$ mkdir kaniko && cd kaniko\n$ echo 'FROM ubuntu' >> dockerfile\n$ echo 'ENTRYPOINT [\"/bin/bash\", \"-c\", \"echo hello\"]' >> dockerfile\n$ cat dockerfile\nFROM ubuntu\nENTRYPOINT [\"/bin/bash\", \"-c\", \"echo hello\"]\n$ pwd\n/home/<user-name>/kaniko # copy this path in volume.yaml file\n```\n\n> Note: It is important to notice that the `hostPath` in the volume.yaml need to be replaced with the local directory you created.\n\n## Create a Secret that holds your authorization token\n\nA Kubernetes cluster uses the Secret of docker-registry type to authenticate with a docker registry to push an image.\n\nCreate this Secret, naming it regcred:\n\n```shell\nkubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>\n```\n\n- `<your-registry-server>` is your Private Docker Registry FQDN. (https://index.docker.io/v1/ for DockerHub)\n- `<your-name>` is your Docker username.\n- `<your-pword>` is your Docker password.\n- `<your-email>` is your Docker email.\n\nThis secret will be used in pod.yaml config.\n\n## Create resources in kubernetes\n\n```shell\n# create persistent volume\n$ kubectl create -f volume.yaml\npersistentvolume/dockerfile created\n\n# create persistent volume claim\n$ kubectl create -f volume-claim.yaml\npersistentvolumeclaim/dockerfile-claim created\n\n# check whether the volume mounted correctly\n$ kubectl get pv dockerfile\nNAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS    REASON   AGE\ndockerfile   10Gi       RWO            Retain           Bound    default/dockerfile-claim   local-storage            1m\n\n# create pod\n$ kubectl create -f pod.yaml\npod/kaniko created\n$ kubectl get pods\nNAME     READY   STATUS              RESTARTS   AGE\nkaniko   0/1     ContainerCreating   0          7s\n\n# check whether the build complete and show the build logs\n$ kubectl get pods\nNAME     READY   STATUS      RESTARTS   AGE\nkaniko   0/1     Completed   0          34s\n$ kubectl logs kaniko\n➜ kubectl logs kaniko\nINFO[0000] Resolved base name ubuntu to ubuntu\nINFO[0000] Resolved base name ubuntu to ubuntu\nINFO[0000] Downloading base image ubuntu\nINFO[0000] Error while retrieving image from cache: getting file info: stat /cache/sha256:1bbdea4846231d91cce6c7ff3907d26fca444fd6b7e3c282b90c7fe4251f9f86: no such file or directory\nINFO[0000] Downloading base image ubuntu\nINFO[0001] Built cross stage deps: map[]\nINFO[0001] Downloading base image ubuntu\nINFO[0001] Error while retrieving image from cache: getting file info: stat /cache/sha256:1bbdea4846231d91cce6c7ff3907d26fca444fd6b7e3c282b90c7fe4251f9f86: no such file or directory\nINFO[0001] Downloading base image ubuntu\nINFO[0001] Skipping unpacking as no commands require it.\nINFO[0001] Taking snapshot of full filesystem...\nINFO[0001] ENTRYPOINT [\"/bin/bash\", \"-c\", \"echo hello\"]\n```\n\n> Note: It is important to notice that the `destination` in the pod.yaml need to be replaced with your own.\n\n## Pull the image and test\n\nIf as expected, the kaniko will build image and push to dockerhub successfully. Pull the image to local and run it to test:\n\n```shell\n$ sudo docker run -it <user-name>/<repo-name>\nUnable to find image 'debuggy/helloworld:latest' locally\nlatest: Pulling from debuggy/helloworld\n5667fdb72017: Pull complete\nd83811f270d5: Pull complete\nee671aafb583: Pull complete\n7fc152dfb3a6: Pull complete\nDigest: sha256:2707d17754ea99ce0cf15d84a7282ae746a44ff90928c2064755ee3b35c1057b\nStatus: Downloaded newer image for debuggy/helloworld:latest\nhello\n```\n\nCongratulation! You have gone through the hello world successfully, please refer to project for more details.\n"
  },
  {
    "path": "examples/kaniko-cache-claim.yaml",
    "content": "kind: PersistentVolumeClaim\napiVersion: v1\nmetadata:\n  name: kaniko-cache-claim\nspec:\n  storageClassName: manual\n  accessModes:\n    - ReadOnlyMany\n  resources:\n    requests:\n      storage: 8Gi\n"
  },
  {
    "path": "examples/kaniko-cache-volume.yaml",
    "content": "kind: PersistentVolume\napiVersion: v1\nmetadata:\n  name: kaniko-cache-volume\n  labels:\n    type: local\nspec:\n  storageClassName: manual\n  capacity:\n    storage: 10Gi\n  accessModes:\n    - ReadOnlyMany\n  hostPath:\n    path: \"/tmp/kaniko-cache\"\n"
  },
  {
    "path": "examples/kaniko-test.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: kaniko\nspec:\n  containers:\n  - name: kaniko\n    image: gcr.io/kaniko-project/executor:latest\n    args: [\"--dockerfile=<dockerfile>\",\n            \"--context=<context>\",\n            \"--destination=<destination>\",\n            \"--cache\",\n            \"--cache-dir=/cache\"]\n    volumeMounts:\n      - name: kaniko-secret\n        mountPath: /secret\n      - name: kaniko-cache\n        mountPath: /cache\n    env:\n      - name: GOOGLE_APPLICATION_CREDENTIALS\n        value: /secret/kaniko-secret.json\n  restartPolicy: Never\n  volumes:\n    - name: kaniko-secret\n      secret:\n        secretName: kaniko-secret\n    - name: kaniko-cache\n      persistentVolumeClaim:\n              claimName: kaniko-cache-claim\n\n"
  },
  {
    "path": "examples/kaniko-warmer.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: kaniko-warmer\nspec:\n  containers:\n  - name: kaniko-warmer\n    image: gcr.io/kaniko-project/warmer:latest\n    args: [\"--cache-dir=/cache\",\n           \"--image=gcr.io/google-appengine/debian9\"]\n    volumeMounts:\n      - name: kaniko-secret\n        mountPath: /secret\n      - name: kaniko-cache\n        mountPath: /cache\n    env:\n      - name: GOOGLE_APPLICATION_CREDENTIALS\n        value: /secret/kaniko-secret.json\n  restartPolicy: Never\n  volumes:\n    - name: kaniko-secret\n      secret:\n        secretName: kaniko-secret\n    - name: kaniko-cache\n      persistentVolumeClaim:\n              claimName: kaniko-cache-claim\n\n"
  },
  {
    "path": "examples/pod-blobstorage.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: kaniko\nspec:\n  containers:\n  - name: kaniko\n    image: gcr.io/kaniko-project/executor:latest\n    args: [\"--dockerfile=<path to Dockerfile within the build context>\",\n            \"--context=https://myaccount.blob.core.windows.net/container/path/to/context.tar.gz\",\n            \"--destination=<registry for image push>\"]\n...\n env:\n      - name: AZURE_STORAGE_ACCESS_KEY\n        valueFrom:\n          secretKeyRef:\n            name: azure-storage-access-key\n            key: azure-storage-access-key\n...\n  volumes:\n   - name: azure-storage-access-key\n    secret:\n      secretName: azure-storage-access-key\n"
  },
  {
    "path": "examples/pod-build-profile.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: kaniko\nspec:\n  containers:\n  - name: kaniko\n    image: gcr.io/kaniko-project/executor:debug\n    lifecycle:\n      preStop:\n        exec:\n          command: [\"/bin/sh\",\"-c\",\"cat $STACKLOG_PATH\"]\n    env:\n      - name: STACKLOG_PATH\n        value: /workspace/kaniko.slog\n    args: [\"--dockerfile=/workspace/dockerfile\",\n            \"--context=dir://workspace\",\n            \"--destination=<user-name>/<repo>\"] # replace with your dockerhub account\n    volumeMounts:\n      - name: kaniko-secret\n        mountPath: /kaniko/.docker\n      - name: dockerfile-storage\n        mountPath: /workspace\n  restartPolicy: Never\n  volumes:\n    - name: kaniko-secret\n      secret:\n        secretName: regcred\n        items:\n          - key: .dockerconfigjson\n            path: config.json\n    - name: dockerfile-storage\n      persistentVolumeClaim:\n        claimName: dockerfile-claim\n"
  },
  {
    "path": "examples/pod.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: kaniko\nspec:\n  containers:\n  - name: kaniko\n    image: gcr.io/kaniko-project/executor:latest\n    args: [\"--dockerfile=/workspace/dockerfile\",\n            \"--context=dir://workspace\",\n            \"--destination=<user-name>/<repo>\"] # replace with your dockerhub account\n    volumeMounts:\n      - name: kaniko-secret\n        mountPath: /kaniko/.docker\n      - name: dockerfile-storage\n        mountPath: /workspace\n  restartPolicy: Never\n  volumes:\n    - name: kaniko-secret\n      secret:\n        secretName: regcred\n        items:\n          - key: .dockerconfigjson\n            path: config.json\n    - name: dockerfile-storage\n      persistentVolumeClaim:\n        claimName: dockerfile-claim\n"
  },
  {
    "path": "examples/volume-claim.yaml",
    "content": "kind: PersistentVolumeClaim\napiVersion: v1\nmetadata:\n  name: dockerfile-claim\nspec:\n  accessModes:\n    - ReadWriteOnce\n  resources:\n    requests:\n      storage: 8Gi\n  storageClassName: local-storage\n"
  },
  {
    "path": "examples/volume.yaml",
    "content": "apiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: dockerfile\n  labels:\n    type: local\nspec:\n  capacity:\n    storage: 10Gi\n  accessModes:\n    - ReadWriteOnce\n  storageClassName: local-storage\n  hostPath:\n    path: <local-directory> # replace with local directory, such as \"/home/<user-name>/kaniko\""
  },
  {
    "path": "files/nsswitch.conf",
    "content": "# /etc/nsswitch.conf\n#\n# As described on the web page https://man7.org/linux/man-pages/man3/gethostbyname.3.html,\n# without the nsswitch.conf file, the gethostbyname() and gethostbyaddr() domain queries\n# will fail to a local name server, thus the /etc/hosts will take no effect.\n#\n# For example, when hostaliases are specified for a kubernetes pod, without proper settings\n# defined in this file, the hostaliases settings will not take effect.\n#\n# Following contents of this file is from the ubuntu:16.04 docker image.\n\npasswd:         compat\ngroup:          compat\nshadow:         compat\ngshadow:        files\n\nhosts:          files dns\nnetworks:       files\n\nprotocols:      db files\nservices:       db files\nethers:         db files\nrpc:            db files\n\nnetgroup:       nis"
  },
  {
    "path": "go.mod",
    "content": "module github.com/GoogleContainerTools/kaniko\n\ngo 1.24.0\n\nrequire (\n\tcloud.google.com/go/storage v1.54.0\n\tgithub.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1\n\tgithub.com/aws/aws-sdk-go-v2 v1.36.3\n\tgithub.com/aws/aws-sdk-go-v2/config v1.29.14\n\tgithub.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.75\n\tgithub.com/aws/aws-sdk-go-v2/service/s3 v1.79.3\n\tgithub.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.9.1\n\tgithub.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589\n\tgithub.com/docker/docker v28.1.1+incompatible\n\tgithub.com/go-git/go-billy/v5 v5.6.2\n\tgithub.com/go-git/go-git/v5 v5.16.0\n\tgithub.com/golang/mock v1.6.0\n\tgithub.com/google/go-cmp v0.7.0\n\tgithub.com/google/go-containerregistry v0.20.4\n\tgithub.com/google/go-github v17.0.0+incompatible\n\tgithub.com/google/slowjam v1.1.2\n\tgithub.com/karrick/godirwalk v1.17.0\n\tgithub.com/minio/highwayhash v1.0.3\n\tgithub.com/moby/buildkit v0.22.0\n\tgithub.com/otiai10/copy v1.14.1\n\tgithub.com/pkg/errors v0.9.1\n\tgithub.com/sirupsen/logrus v1.9.3\n\tgithub.com/spf13/afero v1.14.0\n\tgithub.com/spf13/cobra v1.9.1\n\tgithub.com/spf13/pflag v1.0.6\n\tgolang.org/x/net v0.40.0\n\tgolang.org/x/oauth2 v0.30.0\n\tgolang.org/x/sync v0.14.0\n)\n\nrequire (\n\tgithub.com/GoogleCloudPlatform/docker-credential-gcr/v2 v2.1.22\n\tgithub.com/containerd/containerd v1.7.27\n)\n\nrequire github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect\n\nrequire (\n\tcloud.google.com/go v0.121.1 // indirect\n\tcloud.google.com/go/compute/metadata v0.7.0 // indirect\n\tcloud.google.com/go/iam v1.5.2 // indirect\n\tgithub.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect\n\tgithub.com/Azure/go-autorest v14.2.0+incompatible // indirect\n\tgithub.com/Azure/go-autorest/autorest v0.11.30 // indirect\n\tgithub.com/Azure/go-autorest/autorest/adal v0.9.24 // indirect\n\tgithub.com/Azure/go-autorest/autorest/azure/auth v0.5.13 // indirect\n\tgithub.com/Azure/go-autorest/autorest/azure/cli v0.4.7 // indirect\n\tgithub.com/Azure/go-autorest/autorest/date v0.3.1 // indirect\n\tgithub.com/Azure/go-autorest/logger v0.2.2 // indirect\n\tgithub.com/Azure/go-autorest/tracing v0.6.1 // indirect\n\tgithub.com/Microsoft/go-winio v0.6.2 // indirect\n\tgithub.com/ProtonMail/go-crypto v1.2.0 // indirect\n\tgithub.com/agext/levenshtein v1.2.3 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/credentials v1.17.67 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.1 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/service/sso v1.25.3 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/service/sts v1.33.19 // indirect\n\tgithub.com/aws/smithy-go v1.22.3 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.3.0 // indirect\n\tgithub.com/containerd/continuity v0.4.5 // indirect\n\tgithub.com/containerd/fifo v1.1.0 // indirect\n\tgithub.com/containerd/stargz-snapshotter/estargz v0.16.3 // indirect\n\tgithub.com/dimchansky/utfbom v1.1.1 // indirect\n\tgithub.com/docker/cli v28.1.1+incompatible // indirect\n\tgithub.com/docker/distribution v2.8.3+incompatible // indirect\n\tgithub.com/docker/docker-credential-helpers v0.9.3 // indirect\n\tgithub.com/docker/go-connections v0.5.0 // indirect\n\tgithub.com/docker/go-events v0.0.0-20250114142523-c867878c5e32 // indirect\n\tgithub.com/docker/go-metrics v0.0.1 // indirect\n\tgithub.com/docker/go-units v0.5.0 // indirect\n\tgithub.com/ePirat/docker-credential-gitlabci v1.0.0\n\tgithub.com/emirpasic/gods v1.18.1 // indirect\n\tgithub.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang-jwt/jwt/v4 v4.5.2 // indirect\n\tgithub.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/googleapis/gax-go/v2 v2.14.2 // indirect\n\tgithub.com/hashicorp/go-immutable-radix v1.3.1 // indirect\n\tgithub.com/hashicorp/go-memdb v1.3.5 // indirect\n\tgithub.com/hashicorp/golang-lru v1.0.2 // indirect\n\tgithub.com/inconshreveable/mousetrap v1.1.0 // indirect\n\tgithub.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect\n\tgithub.com/kevinburke/ssh_config v1.2.0 // indirect\n\tgithub.com/klauspost/compress v1.18.0 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/moby/locker v1.0.1 // indirect\n\tgithub.com/moby/patternmatcher v0.6.0\n\tgithub.com/moby/sys/mount v0.3.4 // indirect\n\tgithub.com/moby/sys/mountinfo v0.7.2 // indirect\n\tgithub.com/moby/sys/sequential v0.6.0 // indirect\n\tgithub.com/moby/sys/signal v0.7.1\n\tgithub.com/moby/sys/symlink v0.3.0 // indirect\n\tgithub.com/moby/term v0.5.2 // indirect\n\tgithub.com/morikuni/aec v1.0.0 // indirect\n\tgithub.com/opencontainers/go-digest v1.0.0 // indirect\n\tgithub.com/opencontainers/image-spec v1.1.1 // indirect\n\tgithub.com/opencontainers/runtime-spec v1.2.1 // indirect\n\tgithub.com/opencontainers/selinux v1.12.0 // indirect\n\tgithub.com/prometheus/client_golang v1.22.0 // indirect\n\tgithub.com/prometheus/client_model v0.6.2 // indirect\n\tgithub.com/prometheus/common v0.64.0 // indirect\n\tgithub.com/prometheus/procfs v0.16.1 // indirect\n\tgithub.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect\n\tgithub.com/vbatts/tar-split v0.12.1 // indirect\n\tgithub.com/xanzy/ssh-agent v0.3.3 // indirect\n\tgo.etcd.io/etcd/raft/v3 v3.5.21 // indirect\n\tgo.opencensus.io v0.24.0 // indirect\n\tgolang.org/x/crypto v0.38.0 // indirect\n\tgolang.org/x/sys v0.33.0\n\tgolang.org/x/text v0.25.0 // indirect\n\tgolang.org/x/time v0.11.0 // indirect\n\tgoogle.golang.org/api v0.233.0\n\tgoogle.golang.org/genproto v0.0.0-20250519155744-55703ea1f237 // indirect\n\tgoogle.golang.org/grpc v1.72.1 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/warnings.v0 v0.1.2 // indirect\n)\n\nrequire (\n\tcel.dev/expr v0.24.0 // indirect\n\tcloud.google.com/go/auth v0.16.1 // indirect\n\tcloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect\n\tcloud.google.com/go/monitoring v1.24.2 // indirect\n\tdario.cat/mergo v1.0.2 // indirect\n\tgithub.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect\n\tgithub.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 // indirect\n\tgithub.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect\n\tgithub.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect\n\tgithub.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect\n\tgithub.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 // indirect\n\tgithub.com/Microsoft/hcsshim v0.13.0 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/service/ecr v1.44.0 // indirect\n\tgithub.com/aws/aws-sdk-go-v2/service/ecrpublic v1.33.0 // indirect\n\tgithub.com/cloudflare/circl v1.6.1 // indirect\n\tgithub.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect\n\tgithub.com/containerd/cgroups/v3 v3.0.5 // indirect\n\tgithub.com/containerd/containerd/api v1.9.0 // indirect\n\tgithub.com/containerd/containerd/v2 v2.1.1 // indirect\n\tgithub.com/containerd/errdefs v1.0.0 // indirect\n\tgithub.com/containerd/errdefs/pkg v0.3.0 // indirect\n\tgithub.com/containerd/log v0.1.0 // indirect\n\tgithub.com/containerd/platforms v1.0.0-rc.1 // indirect\n\tgithub.com/containerd/plugin v1.0.0 // indirect\n\tgithub.com/containerd/ttrpc v1.2.7 // indirect\n\tgithub.com/containerd/typeurl/v2 v2.2.3 // indirect\n\tgithub.com/cyphar/filepath-securejoin v0.4.1 // indirect\n\tgithub.com/distribution/reference v0.6.0 // indirect\n\tgithub.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect\n\tgithub.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect\n\tgithub.com/felixge/httpsnoop v1.0.4 // indirect\n\tgithub.com/fsnotify/fsnotify v1.9.0 // indirect\n\tgithub.com/go-jose/go-jose/v4 v4.1.0 // indirect\n\tgithub.com/go-logr/logr v1.4.2 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/google/go-querystring v1.1.0 // indirect\n\tgithub.com/google/s2a-go v0.1.9 // indirect\n\tgithub.com/google/subcommands v1.2.0 // indirect\n\tgithub.com/hashicorp/hcl v1.0.0 // indirect\n\tgithub.com/magiconair/properties v1.8.7 // indirect\n\tgithub.com/mitchellh/mapstructure v1.5.0 // indirect\n\tgithub.com/moby/docker-image-spec v1.3.1 // indirect\n\tgithub.com/moby/go-archive v0.1.0 // indirect\n\tgithub.com/moby/swarmkit/v2 v2.0.0-20250103191802-8c1959736554 // indirect\n\tgithub.com/moby/sys/atomicwriter v0.1.0 // indirect\n\tgithub.com/moby/sys/reexec v0.1.0 // indirect\n\tgithub.com/moby/sys/user v0.4.0 // indirect\n\tgithub.com/moby/sys/userns v0.1.0 // indirect\n\tgithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect\n\tgithub.com/otiai10/mint v1.6.3 // indirect\n\tgithub.com/pelletier/go-toml/v2 v2.2.4 // indirect\n\tgithub.com/pjbgf/sha1cd v0.3.2 // indirect\n\tgithub.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect\n\tgithub.com/sagikazarmark/locafero v0.4.0 // indirect\n\tgithub.com/sagikazarmark/slog-shim v0.1.0 // indirect\n\tgithub.com/skeema/knownhosts v1.3.1 // indirect\n\tgithub.com/sourcegraph/conc v0.3.0 // indirect\n\tgithub.com/spf13/cast v1.6.0 // indirect\n\tgithub.com/spf13/viper v1.18.2 // indirect\n\tgithub.com/spiffe/go-spiffe/v2 v2.5.0 // indirect\n\tgithub.com/subosito/gotenv v1.6.0 // indirect\n\tgithub.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0 // indirect\n\tgithub.com/toqueteos/webbrowser v1.2.0 // indirect\n\tgithub.com/zeebo/errs v1.4.0 // indirect\n\tgo.opentelemetry.io/auto/sdk v1.1.0 // indirect\n\tgo.opentelemetry.io/contrib/detectors/gcp v1.35.0 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect\n\tgo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect\n\tgo.opentelemetry.io/otel v1.36.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.36.0 // indirect\n\tgo.opentelemetry.io/otel/sdk v1.36.0 // indirect\n\tgo.opentelemetry.io/otel/sdk/metric v1.36.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.36.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 // indirect\n\tgopkg.in/ini.v1 v1.67.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "go.sum",
    "content": "cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=\ncel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=\ncloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.121.1 h1:S3kTQSydxmu1JfLRLpKtxRPA7rSrYPRPEUmL/PavVUw=\ncloud.google.com/go v0.121.1/go.mod h1:nRFlrHq39MNVWu+zESP2PosMWA0ryJw8KUBZ2iZpxbw=\ncloud.google.com/go/auth v0.16.1 h1:XrXauHMd30LhQYVRHLGvJiYeczweKQXZxsTbV9TiguU=\ncloud.google.com/go/auth v0.16.1/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI=\ncloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=\ncloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=\ncloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU=\ncloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo=\ncloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8=\ncloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE=\ncloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc=\ncloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA=\ncloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE=\ncloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY=\ncloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM=\ncloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U=\ncloud.google.com/go/storage v1.54.0 h1:Du3XEyliAiftfyW0bwfdppm2MMLdpVAfiIg4T2nAI+0=\ncloud.google.com/go/storage v1.54.0/go.mod h1:hIi9Boe8cHxTyaeqh7KMMwKg088VblFK46C2x/BWaZE=\ncloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4=\ncloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI=\ndario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8=\ndario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA=\ngithub.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk=\ngithub.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=\ngithub.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU=\ngithub.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=\ngithub.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U=\ngithub.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM=\ngithub.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0 h1:OVoM452qUFBrX+URdH3VpR299ma4kfom0yB0URYky9g=\ngithub.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0/go.mod h1:kUjrAo8bgEwLeZ/CmHqNl3Z/kPm7y6FKfxxK0izYUg4=\ngithub.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4=\ngithub.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA=\ngithub.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.0 h1:LR0kAX9ykz8G4YgLCaRDVJ3+n43R8MneB5dTy2konZo=\ngithub.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.0/go.mod h1:DWAciXemNf++PQJLeXUB4HHH5OpsAh12HZnu2wXE1jA=\ngithub.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1 h1:lhZdRq7TIx0GJQvSyX2Si406vrYsov2FXGp/RnSEtcs=\ngithub.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1/go.mod h1:8cl44BDmi+effbARHMQjgOKA2AYvcohNm7KEt42mSV8=\ngithub.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg=\ngithub.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=\ngithub.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=\ngithub.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=\ngithub.com/Azure/go-autorest/autorest v0.11.28/go.mod h1:MrkzG3Y3AH668QyF9KRk5neJnGgmhQ6krbhR8Q5eMvA=\ngithub.com/Azure/go-autorest/autorest v0.11.30 h1:iaZ1RGz/ALZtN5eq4Nr1SOFSlf2E4pDI3Tcsl+dZPVE=\ngithub.com/Azure/go-autorest/autorest v0.11.30/go.mod h1:t1kpPIOpIVX7annvothKvb0stsrXa37i7b+xpmBW8Fs=\ngithub.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ=\ngithub.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk=\ngithub.com/Azure/go-autorest/autorest/adal v0.9.24 h1:BHZfgGsGwdkHDyZdtQRQk1WeUdW0m2WPAwuHZwUi5i4=\ngithub.com/Azure/go-autorest/autorest/adal v0.9.24/go.mod h1:7T1+g0PYFmACYW5LlG2fcoPiPlFHjClyRGL7dRlP5c8=\ngithub.com/Azure/go-autorest/autorest/azure/auth v0.5.13 h1:Ov8avRZi2vmrE2JcXw+tu5K/yB41r7xK9GZDiBF7NdM=\ngithub.com/Azure/go-autorest/autorest/azure/auth v0.5.13/go.mod h1:5BAVfWLWXihP47vYrPuBKKf4cS0bXI+KM9Qx6ETDJYo=\ngithub.com/Azure/go-autorest/autorest/azure/cli v0.4.6/go.mod h1:piCfgPho7BiIDdEQ1+g4VmKyD5y+p/XtSNqE6Hc4QD0=\ngithub.com/Azure/go-autorest/autorest/azure/cli v0.4.7 h1:Q9R3utmFg9K1B4OYtAZ7ZUUvIUdzQt7G2MN5Hi/d670=\ngithub.com/Azure/go-autorest/autorest/azure/cli v0.4.7/go.mod h1:bVrAueELJ0CKLBpUHDIvD516TwmHmzqwCpvONWRsw3s=\ngithub.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=\ngithub.com/Azure/go-autorest/autorest/date v0.3.1 h1:o9Z8Jyt+VJJTCZ/UORishuHOusBwolhjokt9s5k8I4w=\ngithub.com/Azure/go-autorest/autorest/date v0.3.1/go.mod h1:Dz/RDmXlfiFFS/eW+b/xMUSFs1tboPVy6UjgADToWDM=\ngithub.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=\ngithub.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw=\ngithub.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU=\ngithub.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=\ngithub.com/Azure/go-autorest/logger v0.2.2 h1:hYqBsEBywrrOSW24kkOCXRcKfKhK76OzLTfF+MYDE2o=\ngithub.com/Azure/go-autorest/logger v0.2.2/go.mod h1:I5fg9K52o+iuydlWfa9T5K6WFos9XYr9dYTFzpqgibw=\ngithub.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=\ngithub.com/Azure/go-autorest/tracing v0.6.1 h1:YUMSrC/CeD1ZnnXcNYU4a/fzsO35u2Fsful9L/2nyR0=\ngithub.com/Azure/go-autorest/tracing v0.6.1/go.mod h1:/3EgjbsjraOqiicERAeu3m7/z0x1TzjQGAwDrJrXGkc=\ngithub.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs=\ngithub.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=\ngithub.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/GoogleCloudPlatform/docker-credential-gcr/v2 v2.1.22 h1:HevuUpLsTedep2D6wnIp6AAJbVgP0BiVxaMt3HXeOyA=\ngithub.com/GoogleCloudPlatform/docker-credential-gcr/v2 v2.1.22/go.mod h1:nzCpg7DFIIkQIZB3mdUPXVvqQ5f/GahA6xgWXTjnK7w=\ngithub.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc=\ngithub.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY=\ngithub.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU=\ngithub.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0=\ngithub.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk=\ngithub.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM=\ngithub.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 h1:6/0iUd0xrnX7qt+mLNRwg5c0PGv8wpE8K90ryANQwMI=\ngithub.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0=\ngithub.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=\ngithub.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=\ngithub.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=\ngithub.com/Microsoft/hcsshim v0.13.0 h1:/BcXOiS6Qi7N9XqUcv27vkIuVOkBEcWstd2pMlWSeaA=\ngithub.com/Microsoft/hcsshim v0.13.0/go.mod h1:9KWJ/8DgU+QzYGupX4tzMhRQE8h6w90lH6HAaclpEok=\ngithub.com/ProtonMail/go-crypto v1.2.0 h1:+PhXXn4SPGd+qk76TlEePBfOfivE0zkWFenhGhFLzWs=\ngithub.com/ProtonMail/go-crypto v1.2.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE=\ngithub.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo=\ngithub.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=\ngithub.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=\ngithub.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=\ngithub.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=\ngithub.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=\ngithub.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=\ngithub.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=\ngithub.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM=\ngithub.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg=\ngithub.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 h1:zAybnyUQXIZ5mok5Jqwlf58/TFE7uvd3IAsa1aF9cXs=\ngithub.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10/go.mod h1:qqvMj6gHLR/EXWZw4ZbqlPbQUyenf4h82UQUlKc+l14=\ngithub.com/aws/aws-sdk-go-v2/config v1.29.14 h1:f+eEi/2cKCg9pqKBoAIwRGzVb70MRKqWX4dg1BDcSJM=\ngithub.com/aws/aws-sdk-go-v2/config v1.29.14/go.mod h1:wVPHWcIFv3WO89w0rE10gzf17ZYy+UVS1Geq8Iei34g=\ngithub.com/aws/aws-sdk-go-v2/credentials v1.17.67 h1:9KxtdcIA/5xPNQyZRgUSpYOE6j9Bc4+D7nZua0KGYOM=\ngithub.com/aws/aws-sdk-go-v2/credentials v1.17.67/go.mod h1:p3C44m+cfnbv763s52gCqrjaqyPikj9Sg47kUVaNZQQ=\ngithub.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw=\ngithub.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M=\ngithub.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.75 h1:S61/E3N01oral6B3y9hZ2E1iFDqCZPPOBoBQretCnBI=\ngithub.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.75/go.mod h1:bDMQbkI1vJbNjnvJYpPTSNYBkI/VIv18ngWb/K84tkk=\ngithub.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q=\ngithub.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY=\ngithub.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0=\ngithub.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q=\ngithub.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo=\ngithub.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo=\ngithub.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 h1:ZNTqv4nIdE/DiBfUUfXcLZ/Spcuz+RjeziUtNJackkM=\ngithub.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34/go.mod h1:zf7Vcd1ViW7cPqYWEHLHJkS50X0JS2IKz9Cgaj6ugrs=\ngithub.com/aws/aws-sdk-go-v2/service/ecr v1.44.0 h1:E+UTVTDH6XTSjqxHWRuY8nB6s+05UllneWxnycplHFk=\ngithub.com/aws/aws-sdk-go-v2/service/ecr v1.44.0/go.mod h1:iQ1skgw1XRK+6Lgkb0I9ODatAP72WoTILh0zXQ5DtbU=\ngithub.com/aws/aws-sdk-go-v2/service/ecrpublic v1.33.0 h1:wA2O6pZ2r5smqJunFP4hp7qptMW4EQxs8O6RVHPulOE=\ngithub.com/aws/aws-sdk-go-v2/service/ecrpublic v1.33.0/go.mod h1:RZL7ov7c72wSmoM8bIiVxRHgcVdzhNkVW2J36C8RF4s=\ngithub.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE=\ngithub.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA=\ngithub.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.1 h1:4nm2G6A4pV9rdlWzGMPv4BNtQp22v1hg3yrtkYpeLl8=\ngithub.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.1/go.mod h1:iu6FSzgt+M2/x3Dk8zhycdIcHjEFb36IS8HVUVFoMg0=\ngithub.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM=\ngithub.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY=\ngithub.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15 h1:moLQUoVq91LiqT1nbvzDukyqAlCv89ZmwaHw/ZFlFZg=\ngithub.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15/go.mod h1:ZH34PJUc8ApjBIfgQCFvkWcUDBtl/WTD+uiYHjd8igA=\ngithub.com/aws/aws-sdk-go-v2/service/s3 v1.79.3 h1:BRXS0U76Z8wfF+bnkilA2QwpIch6URlm++yPUt9QPmQ=\ngithub.com/aws/aws-sdk-go-v2/service/s3 v1.79.3/go.mod h1:bNXKFFyaiVvWuR6O16h/I1724+aXe/tAkA9/QS01t5k=\ngithub.com/aws/aws-sdk-go-v2/service/sso v1.25.3 h1:1Gw+9ajCV1jogloEv1RRnvfRFia2cL6c9cuKV2Ps+G8=\ngithub.com/aws/aws-sdk-go-v2/service/sso v1.25.3/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI=\ngithub.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 h1:hXmVKytPfTy5axZ+fYbR5d0cFmC3JvwLm5kM83luako=\ngithub.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs=\ngithub.com/aws/aws-sdk-go-v2/service/sts v1.33.19 h1:1XuUZ8mYJw9B6lzAkXhqHlJd/XvaX32evhproijJEZY=\ngithub.com/aws/aws-sdk-go-v2/service/sts v1.33.19/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4=\ngithub.com/aws/smithy-go v1.22.3 h1:Z//5NuZCSW6R4PhQ93hShNbyBbn8BWCmCVCt+Q8Io5k=\ngithub.com/aws/smithy-go v1.22.3/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=\ngithub.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.9.1 h1:50sS0RWhGpW/yZx2KcDNEb1u1MANv5BMEkJgcieEDTA=\ngithub.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.9.1/go.mod h1:ErZOtbzuHabipRTDTor0inoRlYwbsV1ovwSxjGs/uJo=\ngithub.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=\ngithub.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=\ngithub.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\ngithub.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 h1:krfRl01rzPzxSxyLyrChD+U+MzsBXbm0OwYYB67uF+4=\ngithub.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589/go.mod h1:OuDyvmLnMCwa2ep4Jkm6nyA0ocJuZlGyk2gGseVzERM=\ngithub.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=\ngithub.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=\ngithub.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=\ngithub.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=\ngithub.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls=\ngithub.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=\ngithub.com/containerd/cgroups/v3 v3.0.5 h1:44na7Ud+VwyE7LIoJ8JTNQOa549a8543BmzaJHo6Bzo=\ngithub.com/containerd/cgroups/v3 v3.0.5/go.mod h1:SA5DLYnXO8pTGYiAHXz94qvLQTKfVM5GEVisn4jpins=\ngithub.com/containerd/containerd v1.7.27 h1:yFyEyojddO3MIGVER2xJLWoCIn+Up4GaHFquP7hsFII=\ngithub.com/containerd/containerd v1.7.27/go.mod h1:xZmPnl75Vc+BLGt4MIfu6bp+fy03gdHAn9bz+FreFR0=\ngithub.com/containerd/containerd/api v1.9.0 h1:HZ/licowTRazus+wt9fM6r/9BQO7S0vD5lMcWspGIg0=\ngithub.com/containerd/containerd/api v1.9.0/go.mod h1:GhghKFmTR3hNtyznBoQ0EMWr9ju5AqHjcZPsSpTKutI=\ngithub.com/containerd/containerd/v2 v2.1.1 h1:znnkm7Ajz8lg8BcIPMhc/9yjBRN3B+OkNKqKisKfwwM=\ngithub.com/containerd/containerd/v2 v2.1.1/go.mod h1:zIfkQj4RIodclYQkX7GSSswSwgP8d/XxDOtOAoSDIGU=\ngithub.com/containerd/continuity v0.4.5 h1:ZRoN1sXq9u7V6QoHMcVWGhOwDFqZ4B9i5H6un1Wh0x4=\ngithub.com/containerd/continuity v0.4.5/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE=\ngithub.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI=\ngithub.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=\ngithub.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE=\ngithub.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk=\ngithub.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY=\ngithub.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o=\ngithub.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=\ngithub.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=\ngithub.com/containerd/platforms v1.0.0-rc.1 h1:83KIq4yy1erSRgOVHNk1HYdPvzdJ5CnsWaRoJX4C41E=\ngithub.com/containerd/platforms v1.0.0-rc.1/go.mod h1:J71L7B+aiM5SdIEqmd9wp6THLVRzJGXfNuWCZCllLA4=\ngithub.com/containerd/plugin v1.0.0 h1:c8Kf1TNl6+e2TtMHZt+39yAPDbouRH9WAToRjex483Y=\ngithub.com/containerd/plugin v1.0.0/go.mod h1:hQfJe5nmWfImiqT1q8Si3jLv3ynMUIBB47bQ+KexvO8=\ngithub.com/containerd/stargz-snapshotter/estargz v0.16.3 h1:7evrXtoh1mSbGj/pfRccTampEyKpjpOnS3CyiV1Ebr8=\ngithub.com/containerd/stargz-snapshotter/estargz v0.16.3/go.mod h1:uyr4BfYfOj3G9WBVE8cOlQmXAbPN9VEQpBBeJIuOipU=\ngithub.com/containerd/ttrpc v1.2.7 h1:qIrroQvuOL9HQ1X6KHe2ohc7p+HP/0VE6XPU7elJRqQ=\ngithub.com/containerd/ttrpc v1.2.7/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o=\ngithub.com/containerd/typeurl/v2 v2.2.3 h1:yNA/94zxWdvYACdYO8zofhrTVuQY73fFU1y++dYSw40=\ngithub.com/containerd/typeurl/v2 v2.2.3/go.mod h1:95ljDnPfD3bAbDJRugOiShd/DlAAsxGtUBhJxIn7SCk=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=\ngithub.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=\ngithub.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=\ngithub.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s=\ngithub.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U=\ngithub.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE=\ngithub.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=\ngithub.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=\ngithub.com/docker/cli v28.1.1+incompatible h1:eyUemzeI45DY7eDPuwUcmDyDj1pM98oD5MdSpiItp8k=\ngithub.com/docker/cli v28.1.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=\ngithub.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=\ngithub.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=\ngithub.com/docker/docker v28.1.1+incompatible h1:49M11BFLsVO1gxY9UX9p/zwkE/rswggs8AdFmXQw51I=\ngithub.com/docker/docker v28.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=\ngithub.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8=\ngithub.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo=\ngithub.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=\ngithub.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=\ngithub.com/docker/go-events v0.0.0-20250114142523-c867878c5e32 h1:EHZfspsnLAz8Hzccd67D5abwLiqoqym2jz/jOS39mCk=\ngithub.com/docker/go-events v0.0.0-20250114142523-c867878c5e32/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=\ngithub.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8=\ngithub.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw=\ngithub.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=\ngithub.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=\ngithub.com/ePirat/docker-credential-gitlabci v1.0.0 h1:YRkUSvkON6rT88vtscClAmPEYWhtltGEAuRVYtz1/+Y=\ngithub.com/ePirat/docker-credential-gitlabci v1.0.0/go.mod h1:Ptmh+D0lzBQtgb6+QHjXl9HqOn3T1P8fKUHldiSQQGA=\ngithub.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o=\ngithub.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE=\ngithub.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=\ngithub.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=\ngithub.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=\ngithub.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=\ngithub.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M=\ngithub.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA=\ngithub.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A=\ngithub.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw=\ngithub.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI=\ngithub.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4=\ngithub.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=\ngithub.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8=\ngithub.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU=\ngithub.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=\ngithub.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=\ngithub.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=\ngithub.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=\ngithub.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=\ngithub.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=\ngithub.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c=\ngithub.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU=\ngithub.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=\ngithub.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=\ngithub.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM=\ngithub.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU=\ngithub.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=\ngithub.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII=\ngithub.com/go-git/go-git/v5 v5.16.0 h1:k3kuOEpkc0DeY7xlL6NaaNg39xdgQbtH5mwCafHO9AQ=\ngithub.com/go-git/go-git/v5 v5.16.0/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8=\ngithub.com/go-jose/go-jose/v4 v4.1.0 h1:cYSYxd3pw5zd2FSXk2vGdn9igQU2PS8MuxrCOCl0FdY=\ngithub.com/go-jose/go-jose/v4 v4.1.0/go.mod h1:GG/vqmYm3Von2nYiB2vGTXzdoNKE5tix5tuc6iAd+sw=\ngithub.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=\ngithub.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=\ngithub.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=\ngithub.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=\ngithub.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=\ngithub.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=\ngithub.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=\ngithub.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=\ngithub.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8=\ngithub.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=\ngithub.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=\ngithub.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=\ngithub.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=\ngithub.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=\ngithub.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=\ngithub.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=\ngithub.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=\ngithub.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/go-containerregistry v0.20.4 h1:w/Fdj3ef046SdV/GJU69cCnreaLpqbTo1X9XPyHbkd4=\ngithub.com/google/go-containerregistry v0.20.4/go.mod h1:Q14vdOOzug02bwnhMkZKD4e30pDaD9W65qzXpyzF49E=\ngithub.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY=\ngithub.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=\ngithub.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=\ngithub.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc=\ngithub.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0=\ngithub.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=\ngithub.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=\ngithub.com/google/slowjam v1.1.2 h1:uAsv7r9f1TP5xwerte6OseOYbRur2y47jLGvn22dXk8=\ngithub.com/google/slowjam v1.1.2/go.mod h1:XGDJY4mZ5Y4BAi7itXRLZ0Hl/fcfNwx9iX06qCwZu1M=\ngithub.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE=\ngithub.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=\ngithub.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4=\ngithub.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA=\ngithub.com/googleapis/gax-go/v2 v2.14.2 h1:eBLnkZ9635krYIPD+ag1USrOAI0Nr0QYF3+/3GqO0k0=\ngithub.com/googleapis/gax-go/v2 v2.14.2/go.mod h1:ON64QhlJkhVtSqp4v1uaK92VyZ2gmvDQsweuyLV+8+w=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M=\ngithub.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\ngithub.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=\ngithub.com/hashicorp/go-memdb v1.3.5 h1:b3taDMxCBCBVgyRrS1AZVHO14ubMYZB++QpNhBg+Nyo=\ngithub.com/hashicorp/go-memdb v1.3.5/go.mod h1:8IVKKBkVe+fxFgdFOYxzQQNjz+sWCyHCdIC/+5+Vy1Y=\ngithub.com/hashicorp/go-uuid v1.0.0 h1:RS8zrF7PhGwyNPOtxSClXXj9HA8feRnJzgnI1RJCSnM=\ngithub.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=\ngithub.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=\ngithub.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\ngithub.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=\ngithub.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=\ngithub.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=\ngithub.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=\ngithub.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=\ngithub.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=\ngithub.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=\ngithub.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=\ngithub.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=\ngithub.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=\ngithub.com/karrick/godirwalk v1.17.0 h1:b4kY7nqDdioR/6qnbHQyDvmA17u5G1cZ6J+CZXwSWoI=\ngithub.com/karrick/godirwalk v1.17.0/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk=\ngithub.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=\ngithub.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=\ngithub.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=\ngithub.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=\ngithub.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=\ngithub.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=\ngithub.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=\ngithub.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q=\ngithub.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\ngithub.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/moby/buildkit v0.22.0 h1:aWN06w1YGSVN1XfeZbj2ZbgY+zi5xDAjEFI8Cy9fTjA=\ngithub.com/moby/buildkit v0.22.0/go.mod h1:j4pP5hxiTWcz7xuTK2cyxQislHl/N2WWHzOy43DlLJw=\ngithub.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=\ngithub.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=\ngithub.com/moby/go-archive v0.1.0 h1:Kk/5rdW/g+H8NHdJW2gsXyZ7UnzvJNOy6VKJqueWdcQ=\ngithub.com/moby/go-archive v0.1.0/go.mod h1:G9B+YoujNohJmrIYFBpSd54GTUB4lt9S+xVQvsJyFuo=\ngithub.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg=\ngithub.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc=\ngithub.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk=\ngithub.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc=\ngithub.com/moby/swarmkit/v2 v2.0.0-20250103191802-8c1959736554 h1:DMHJbgyNZWyrPKYjCYt2IxEO7KA0eSd4fo6KQsv2W84=\ngithub.com/moby/swarmkit/v2 v2.0.0-20250103191802-8c1959736554/go.mod h1:mTTGIAz/59OGZR5Qe+QByIe3Nxc+sSuJkrsStFhr6Lg=\ngithub.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw=\ngithub.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs=\ngithub.com/moby/sys/mount v0.3.4 h1:yn5jq4STPztkkzSKpZkLcmjue+bZJ0u2AuQY1iNI1Ww=\ngithub.com/moby/sys/mount v0.3.4/go.mod h1:KcQJMbQdJHPlq5lcYT+/CjatWM4PuxKe+XLSVS4J6Os=\ngithub.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg=\ngithub.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4=\ngithub.com/moby/sys/reexec v0.1.0 h1:RrBi8e0EBTLEgfruBOFcxtElzRGTEUkeIFaVXgU7wok=\ngithub.com/moby/sys/reexec v0.1.0/go.mod h1:EqjBg8F3X7iZe5pU6nRZnYCMUTXoxsjiIfHup5wYIN8=\ngithub.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU=\ngithub.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko=\ngithub.com/moby/sys/signal v0.7.1 h1:PrQxdvxcGijdo6UXXo/lU/TvHUWyPhj7UOpSo8tuvk0=\ngithub.com/moby/sys/signal v0.7.1/go.mod h1:Se1VGehYokAkrSQwL4tDzHvETwUZlnY7S5XtQ50mQp8=\ngithub.com/moby/sys/symlink v0.3.0 h1:GZX89mEZ9u53f97npBy4Rc3vJKj7JBDj/PN2I22GrNU=\ngithub.com/moby/sys/symlink v0.3.0/go.mod h1:3eNdhduHmYPcgsJtZXW1W4XUJdZGBIkttZ8xKqPUJq0=\ngithub.com/moby/sys/user v0.4.0 h1:jhcMKit7SA80hivmFJcbB1vqmw//wU61Zdui2eQXuMs=\ngithub.com/moby/sys/user v0.4.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs=\ngithub.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g=\ngithub.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28=\ngithub.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ=\ngithub.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=\ngithub.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=\ngithub.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=\ngithub.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=\ngithub.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=\ngithub.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=\ngithub.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=\ngithub.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=\ngithub.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=\ngithub.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww=\ngithub.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=\ngithub.com/opencontainers/selinux v1.12.0 h1:6n5JV4Cf+4y0KNXW48TLj5DwfXpvWlxXplUkdTrmPb8=\ngithub.com/opencontainers/selinux v1.12.0/go.mod h1:BTPX+bjVbWGXw7ZZWUbdENt8w0htPSrlgOOysQaU62U=\ngithub.com/otiai10/copy v1.14.1 h1:5/7E6qsUMBaH5AnQ0sSLzzTg1oTECmcCmT6lvF45Na8=\ngithub.com/otiai10/copy v1.14.1/go.mod h1:oQwrEDDOci3IM8dJF0d8+jnbfPDllW6vUjNc3DoZm9I=\ngithub.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs=\ngithub.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM=\ngithub.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=\ngithub.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=\ngithub.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4=\ngithub.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A=\ngithub.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=\ngithub.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=\ngithub.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=\ngithub.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=\ngithub.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=\ngithub.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=\ngithub.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=\ngithub.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=\ngithub.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=\ngithub.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=\ngithub.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=\ngithub.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=\ngithub.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=\ngithub.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=\ngithub.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=\ngithub.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=\ngithub.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=\ngithub.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=\ngithub.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=\ngithub.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=\ngithub.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=\ngithub.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=\ngithub.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=\ngithub.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=\ngithub.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=\ngithub.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=\ngithub.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=\ngithub.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=\ngithub.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=\ngithub.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=\ngithub.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=\ngithub.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=\ngithub.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8=\ngithub.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY=\ngithub.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=\ngithub.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=\ngithub.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA=\ngithub.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo=\ngithub.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=\ngithub.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=\ngithub.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=\ngithub.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=\ngithub.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=\ngithub.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ=\ngithub.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk=\ngithub.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE=\ngithub.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=\ngithub.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=\ngithub.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=\ngithub.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0 h1:2f304B10LaZdB8kkVEaoXvAMVan2tl9AiK4G0odjQtE=\ngithub.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0/go.mod h1:278M4p8WsNh3n4a1eqiFcV2FGk7wE5fwUpUom9mK9lE=\ngithub.com/toqueteos/webbrowser v1.2.0 h1:tVP/gpK69Fx+qMJKsLE7TD8LuGWPnEV71wBN9rrstGQ=\ngithub.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM=\ngithub.com/vbatts/tar-split v0.12.1 h1:CqKoORW7BUWBe7UL/iqTVvkTBOF8UvOMKOIZykxnnbo=\ngithub.com/vbatts/tar-split v0.12.1/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA=\ngithub.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=\ngithub.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngithub.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM=\ngithub.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=\ngo.etcd.io/etcd/raft/v3 v3.5.21 h1:dOmE0mT55dIUsX77TKBLq+RgyumsQuYeiRQnW/ylugk=\ngo.etcd.io/etcd/raft/v3 v3.5.21/go.mod h1:fmcuY5R2SNkklU4+fKVBQi2biVp5vafMrWUEj4TJ4Cs=\ngo.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=\ngo.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=\ngo.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=\ngo.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=\ngo.opentelemetry.io/contrib/detectors/gcp v1.35.0 h1:bGvFt68+KTiAKFlacHW6AhA56GF2rS0bdD3aJYEnmzA=\ngo.opentelemetry.io/contrib/detectors/gcp v1.35.0/go.mod h1:qGWP8/+ILwMRIUf9uIVLloR1uo5ZYAslM4O6OqUi1DA=\ngo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw=\ngo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM=\ngo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU=\ngo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ=\ngo.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=\ngo.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 h1:1fTNlAIJZGWLP5FVu0fikVry1IsiUnXjf7QFvoNN3Xw=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0/go.mod h1:zjPK58DtkqQFn+YUMbx0M2XV3QgKU0gS9LeGohREyK4=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0 h1:xJ2qHD0C1BeYVTLLR9sX12+Qb95kfeD/byKj6Ky1pXg=\ngo.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0/go.mod h1:u5BF1xyjstDowA1R5QAO9JHzqK+ublenEW/dyqTjBVk=\ngo.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0 h1:PB3Zrjs1sG1GBX51SXyTSoOTqcDglmsk7nT6tkKPb/k=\ngo.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0/go.mod h1:U2R3XyVPzn0WX7wOIypPuptulsMcPDPs/oiSVOMVnHY=\ngo.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE=\ngo.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=\ngo.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs=\ngo.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=\ngo.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis=\ngo.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=\ngo.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=\ngo.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=\ngo.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=\ngo.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngolang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=\ngolang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=\ngolang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=\ngolang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=\ngolang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=\ngolang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=\ngolang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=\ngolang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=\ngolang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=\ngolang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=\ngolang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=\ngolang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=\ngolang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=\ngolang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=\ngolang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=\ngolang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=\ngolang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=\ngolang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=\ngolang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=\ngolang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=\ngolang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=\ngolang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=\ngolang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=\ngolang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=\ngolang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/api v0.233.0 h1:iGZfjXAJiUFSSaekVB7LzXl6tRfEKhUN7FkZN++07tI=\ngoogle.golang.org/api v0.233.0/go.mod h1:TCIVLLlcwunlMpZIhIp7Ltk77W+vUSdUKAAIlbxY44c=\ngoogle.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=\ngoogle.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=\ngoogle.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=\ngoogle.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=\ngoogle.golang.org/genproto v0.0.0-20250519155744-55703ea1f237 h1:2zGWyk04EwQ3mmV4dd4M4U7P/igHi5p7CBJEg1rI6A8=\ngoogle.golang.org/genproto v0.0.0-20250519155744-55703ea1f237/go.mod h1:LhI4bRmX3rqllzQ+BGneexULkEjBf2gsAfkbeCA8IbU=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 h1:Kog3KlB4xevJlAcbbbzPfRG0+X9fdoGM+UBRKVz6Wr0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237/go.mod h1:ezi0AVyMKDWy5xAncvjLWH7UcLBB5n7y2fQ8MzjJcto=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 h1:cJfm9zPbe1e873mHJzmQ1nwVEeRDU/T1wXDK2kUSU34=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=\ngoogle.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=\ngoogle.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=\ngoogle.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=\ngoogle.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=\ngoogle.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=\ngoogle.golang.org/grpc v1.72.1 h1:HR03wO6eyZ7lknl75XlxABNVLLFc2PAb6mHlYh756mA=\ngoogle.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=\ngoogle.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=\ngoogle.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=\ngopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=\ngopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=\ngopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=\ngopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=\ngopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q=\ngotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA=\nhonnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\nhonnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=\n"
  },
  {
    "path": "hack/.gitignore",
    "content": "bin"
  },
  {
    "path": "hack/boilerplate/boilerplate.Dockerfile.txt",
    "content": "# Copyright YEAR Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n"
  },
  {
    "path": "hack/boilerplate/boilerplate.Makefile.txt",
    "content": "# Copyright YEAR Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n"
  },
  {
    "path": "hack/boilerplate/boilerplate.go.txt",
    "content": "/*\nCopyright YEAR Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n"
  },
  {
    "path": "hack/boilerplate/boilerplate.py",
    "content": "#!/usr/bin/env python3\n\n# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom __future__ import print_function\n\nimport argparse\nimport glob\nimport os\nimport re\nimport sys\n\n\nSKIPPED_DIRS = [\"Godeps\", \"third_party\", \".git\", \"vendor\", \"examples\", \"testdata\"]\nSKIPPED_FILES = [\"install_golint.sh\"]\n\nparser = argparse.ArgumentParser()\nparser.add_argument(\"filenames\", help=\"list of files to check, all files if unspecified\", nargs='*')\n\nrootdir = os.path.dirname(__file__) + \"/../\"\nrootdir = os.path.abspath(rootdir)\nparser.add_argument(\"--rootdir\", default=rootdir, help=\"root directory to examine\")\n\ndefault_boilerplate_dir = os.path.join(rootdir, \"/boilerplate\")\nparser.add_argument(\"--boilerplate-dir\", default=default_boilerplate_dir)\nargs = parser.parse_args()\n\n\ndef get_refs():\n    refs = {}\n\n    for path in glob.glob(os.path.join(args.boilerplate_dir, \"boilerplate.*.txt\")):\n        extension = os.path.basename(path).split(\".\")[1]\n\n        ref_file = open(path, 'r')\n        ref = ref_file.read().splitlines()\n        ref_file.close()\n        refs[extension] = ref\n\n    return refs\n\ndef file_passes(filename, refs, regexs):\n    try:\n        f = open(filename, 'r')\n    except:\n        return False\n\n    data = f.read()\n    f.close()\n\n    basename = os.path.basename(filename)\n    extension = file_extension(filename)\n    if extension != \"\":\n        ref = refs[extension]\n    else:\n        ref = refs[basename]\n\n    # remove build tags from the top of Go files\n    if extension == \"go\":\n        p = regexs[\"go_build_constraints_go\"]\n        (data, found) = p.subn(\"\", data, 1)\n\n    if extension == \"go\":\n        p = regexs[\"go_build_constraints\"]\n        (data, found) = p.subn(\"\", data, 1)\n\n    # remove shebang from the top of shell files\n    elif extension == \"sh\":\n        p = regexs[\"shebang\"]\n        (data, found) = p.subn(\"\", data, 1)\n\n    data = data.splitlines()\n\n    # if our test file is smaller than the reference it surely fails!\n    if len(ref) > len(data):\n        return False\n\n    # trim our file to the same number of lines as the reference file\n    data = data[:len(ref)]\n\n    p = regexs[\"year\"]\n    for d in data:\n        if p.search(d):\n            return False\n\n    # Replace all occurrences of the date regex with \"YEAR\"\n    p = regexs[\"date\"]\n    for i, d in enumerate(data):\n        (data[i], found) = p.subn('YEAR', d)\n        if found != 0:\n            break\n\n    # if we don't match the reference at this point, fail\n    if ref != data:\n        return False\n\n    return True\n\ndef file_extension(filename):\n    return os.path.splitext(filename)[1].split(\".\")[-1].lower()\n\ndef normalize_files(files):\n    newfiles = []\n    for i, pathname in enumerate(files):\n        if not os.path.isabs(pathname):\n            newfiles.append(os.path.join(args.rootdir, pathname))\n    return newfiles\n\ndef get_files(extensions):\n    files = []\n    if len(args.filenames) > 0:\n        files = args.filenames\n    else:\n        for root, dirs, walkfiles in os.walk(args.rootdir):\n            for d in SKIPPED_DIRS:\n                if d in dirs:\n                    dirs.remove(d)\n\n            for name in walkfiles:\n                if name not in SKIPPED_FILES:\n                    pathname = os.path.join(root, name)\n                    files.append(pathname)\n\n    files = normalize_files(files)\n    outfiles = []\n    for pathname in files:\n        basename = os.path.basename(pathname)\n        extension = file_extension(pathname)\n        if extension in extensions or basename in extensions:\n            outfiles.append(pathname)\n    return outfiles\n\ndef get_regexs():\n    regexs = {}\n    # Search for \"YEAR\" which exists in the boilerplate, but shouldn't in the real thing\n    regexs[\"year\"] = re.compile( 'YEAR' )\n    # dates can be any year [2000-2099] company holder names can be anything\n    regexs[\"date\"] = re.compile( '(20\\d\\d)' )\n    # strip // go:build \\n\\n build constraints\n    regexs[\"go_build_constraints_go\"] = re.compile(r\"^(//go\\:build.*)+\\n\", re.MULTILINE)\n    # strip // +build \\n\\n build constraints\n    regexs[\"go_build_constraints\"] = re.compile(r\"^(// \\+build.*\\n)+\\n\", re.MULTILINE)\n    # strip #!.* from shell scripts\n    regexs[\"shebang\"] = re.compile(r\"^(#!.*\\n)\\n*\", re.MULTILINE)\n    return regexs\n\ndef main():\n    regexs = get_regexs()\n    refs = get_refs()\n    filenames = get_files(refs.keys())\n\n    for filename in filenames:\n        if not file_passes(filename, refs, regexs):\n            print(filename, file=sys.stdout)\n\nif __name__ == \"__main__\":\n  sys.exit(main())\n"
  },
  {
    "path": "hack/boilerplate/boilerplate.py.txt",
    "content": "#!/usr/bin/env python3\n\n# Copyright YEAR Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n"
  },
  {
    "path": "hack/boilerplate/boilerplate.sh.txt",
    "content": "# Copyright YEAR Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n"
  },
  {
    "path": "hack/boilerplate.sh",
    "content": "#!/bin/bash\n# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\nset -e\n\n# Ignore these paths in the following tests.\nignore=\"vendor\\|out\"\nBOILERPLATEDIR=./hack/boilerplate\nfiles=$(python3 ${BOILERPLATEDIR}/boilerplate.py --rootdir . --boilerplate-dir ${BOILERPLATEDIR})\n\n# Grep returns a non-zero exit code if we don't match anything, which is good in this case.\nset +e\nrelevant_files=$(echo \"$files\" | grep -v $ignore)\nset -e\n\nif [[ ! -z ${relevant_files} ]]; then\n\techo \"Boilerplate missing in:\"\n    echo \"${relevant_files}\"\n\texit 1\nfi\n"
  },
  {
    "path": "hack/gofmt.sh",
    "content": "#!/bin/bash\n\n# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\nfiles=$(find . -name \"*.go\" | grep -v vendor/ | xargs gofmt -l -s)\nif [[ $files ]]; then\n    echo \"Gofmt errors in files:\"\n    echo \"$files\"\n    diff=$(find . -name \"*.go\" | grep -v vendor/ | xargs gofmt -d -s)\n    echo \"$diff\"\n    exit 1\nfi\n"
  },
  {
    "path": "hack/install_golint.sh",
    "content": "#!/bin/sh\nset -e\n# Code generated by godownloader on 2018-06-05T12:04:55Z. DO NOT EDIT.\n#\n\nusage() {\n  this=$1\n  cat <<EOF\n$this: download go binaries for golangci/golangci-lint\n\nUsage: $this [-b] bindir [-d] [tag]\n  -b sets bindir or installation directory, Defaults to ./bin\n  -d turns on debug logging\n   [tag] is a tag from\n   https://github.com/golangci/golangci-lint/releases\n   If tag is missing, then the latest will be used.\n\n Generated by godownloader\n  https://github.com/goreleaser/godownloader\n\nEOF\n  exit 2\n}\n\nparse_args() {\n  #BINDIR is ./bin unless set be ENV\n  # over-ridden by flag below\n\n  BINDIR=${BINDIR:-./bin}\n  while getopts \"b:dh?\" arg; do\n    case \"$arg\" in\n      b) BINDIR=\"$OPTARG\" ;;\n      d) log_set_priority 10 ;;\n      h | \\?) usage \"$0\" ;;\n    esac\n  done\n  shift $((OPTIND - 1))\n  TAG=$1\n}\n# this function wraps all the destructive operations\n# if a curl|bash cuts off the end of the script due to\n# network, either nothing will happen or will syntax error\n# out preventing half-done work\nexecute() {\n  tmpdir=$(mktmpdir)\n  log_debug \"downloading files into ${tmpdir}\"\n  http_download \"${tmpdir}/${TARBALL}\" \"${TARBALL_URL}\"\n  http_download \"${tmpdir}/${CHECKSUM}\" \"${CHECKSUM_URL}\"\n  hash_sha256_verify \"${tmpdir}/${TARBALL}\" \"${tmpdir}/${CHECKSUM}\"\n  srcdir=\"${tmpdir}/${NAME}\"\n  rm -rf \"${srcdir}\"\n  (cd \"${tmpdir}\" && untar \"${TARBALL}\")\n  install -d \"${BINDIR}\"\n  for binexe in \"golangci-lint\" ; do\n    if [ \"$OS\" = \"windows\" ]; then\n      binexe=\"${binexe}.exe\"\n    fi\n    install \"${srcdir}/${binexe}\" \"${BINDIR}/\"\n    log_info \"installed ${BINDIR}/${binexe}\"\n  done\n}\nis_supported_platform() {\n  platform=$1\n  found=1\n  case \"$platform\" in\n    darwin/amd64) found=0 ;;\n    darwin/386) found=0 ;;\n    windows/amd64) found=0 ;;\n    windows/386) found=0 ;;\n    linux/amd64) found=0 ;;\n    linux/arm64) found=0 ;;\n    linux/386) found=0 ;;\n    linux/ppc64le) found=0 ;;\n    linux/s390x) found=0 ;;\n  esac\n  return $found\n}\ncheck_platform() {\n  if is_supported_platform \"$PLATFORM\"; then\n    # optional logging goes here\n    true\n  else\n    log_crit \"platform $PLATFORM is not supported.  Make sure this script is up-to-date and file request at https://github.com/${PREFIX}/issues/new\"\n    exit 1\n  fi\n}\ntag_to_version() {\n  if [ -z \"${TAG}\" ]; then\n    log_info \"checking GitHub for latest tag\"\n  else\n    log_info \"checking GitHub for tag '${TAG}'\"\n  fi\n  REALTAG=$(github_release \"$OWNER/$REPO\" \"${TAG}\") && true\n  if test -z \"$REALTAG\"; then\n    log_crit \"unable to find '${TAG}' - use 'latest' or see https://github.com/${PREFIX}/releases for details\"\n    exit 1\n  fi\n  # if version starts with 'v', remove it\n  TAG=\"$REALTAG\"\n  VERSION=${TAG#v}\n}\nadjust_format() {\n  # change format (tar.gz or zip) based on ARCH\n  case ${ARCH} in\n    windows) FORMAT=zip ;;\n  esac\n  true\n}\nadjust_os() {\n  # adjust archive name based on OS\n  true\n}\nadjust_arch() {\n  # adjust archive name based on ARCH\n  true\n}\n\ncat /dev/null <<EOF\n------------------------------------------------------------------------\nhttps://github.com/client9/shlib - portable posix shell functions\nPublic domain - http://unlicense.org\nhttps://github.com/client9/shlib/blob/master/LICENSE.md\nbut credit (and pull requests) appreciated.\n------------------------------------------------------------------------\nEOF\nis_command() {\n  command -v \"$1\" >/dev/null\n}\nechoerr() {\n  echo \"$@\" 1>&2\n}\nlog_prefix() {\n  echo \"$0\"\n}\n_logp=6\nlog_set_priority() {\n  _logp=\"$1\"\n}\nlog_priority() {\n  if test -z \"$1\"; then\n    echo \"$_logp\"\n    return\n  fi\n  [ \"$1\" -le \"$_logp\" ]\n}\nlog_tag() {\n  case $1 in\n    0) echo \"emerg\" ;;\n    1) echo \"alert\" ;;\n    2) echo \"crit\" ;;\n    3) echo \"err\" ;;\n    4) echo \"warning\" ;;\n    5) echo \"notice\" ;;\n    6) echo \"info\" ;;\n    7) echo \"debug\" ;;\n    *) echo \"$1\" ;;\n  esac\n}\nlog_debug() {\n  log_priority 7 || return 0\n  echoerr \"$(log_prefix)\" \"$(log_tag 7)\" \"$@\"\n}\nlog_info() {\n  log_priority 6 || return 0\n  echoerr \"$(log_prefix)\" \"$(log_tag 6)\" \"$@\"\n}\nlog_err() {\n  log_priority 3 || return 0\n  echoerr \"$(log_prefix)\" \"$(log_tag 3)\" \"$@\"\n}\nlog_crit() {\n  log_priority 2 || return 0\n  echoerr \"$(log_prefix)\" \"$(log_tag 2)\" \"$@\"\n}\nuname_os() {\n  os=$(uname -s | tr '[:upper:]' '[:lower:]')\n  case \"$os\" in\n    msys_nt) os=\"windows\" ;;\n  esac\n  echo \"$os\"\n}\nuname_arch() {\n  arch=$(uname -m)\n  case $arch in\n    x86_64) arch=\"amd64\" ;;\n    x86) arch=\"386\" ;;\n    i686) arch=\"386\" ;;\n    i386) arch=\"386\" ;;\n    aarch64) arch=\"arm64\" ;;\n    armv5*) arch=\"armv5\" ;;\n    armv6*) arch=\"armv6\" ;;\n    armv7*) arch=\"armv7\" ;;\n  esac\n  echo ${arch}\n}\nuname_os_check() {\n  os=$(uname_os)\n  case \"$os\" in\n    darwin) return 0 ;;\n    dragonfly) return 0 ;;\n    freebsd) return 0 ;;\n    linux) return 0 ;;\n    android) return 0 ;;\n    nacl) return 0 ;;\n    netbsd) return 0 ;;\n    openbsd) return 0 ;;\n    plan9) return 0 ;;\n    solaris) return 0 ;;\n    windows) return 0 ;;\n  esac\n  log_crit \"uname_os_check '$(uname -s)' got converted to '$os' which is not a GOOS value. Please file bug at https://github.com/client9/shlib\"\n  return 1\n}\nuname_arch_check() {\n  arch=$(uname_arch)\n  case \"$arch\" in\n    386) return 0 ;;\n    amd64) return 0 ;;\n    arm64) return 0 ;;\n    armv5) return 0 ;;\n    armv6) return 0 ;;\n    armv7) return 0 ;;\n    ppc64) return 0 ;;\n    ppc64le) return 0 ;;\n    mips) return 0 ;;\n    mipsle) return 0 ;;\n    mips64) return 0 ;;\n    mips64le) return 0 ;;\n    s390x) return 0 ;;\n    amd64p32) return 0 ;;\n  esac\n  log_crit \"uname_arch_check '$(uname -m)' got converted to '$arch' which is not a GOARCH value.  Please file bug report at https://github.com/client9/shlib\"\n  return 1\n}\nuntar() {\n  tarball=$1\n  case \"${tarball}\" in\n    *.tar.gz | *.tgz) tar -xzf \"${tarball}\" ;;\n    *.tar) tar -xf \"${tarball}\" ;;\n    *.zip) unzip \"${tarball}\" ;;\n    *)\n      log_err \"untar unknown archive format for ${tarball}\"\n      return 1\n      ;;\n  esac\n}\nmktmpdir() {\n  test -z \"$TMPDIR\" && TMPDIR=\"$(mktemp -d)\"\n  mkdir -p \"${TMPDIR}\"\n  echo \"${TMPDIR}\"\n}\nhttp_download_curl() {\n  local_file=$1\n  source_url=$2\n  header=$3\n  if [ -z \"$header\" ]; then\n    code=$(curl -w '%{http_code}' -sL -o \"$local_file\" \"$source_url\")\n  else\n    code=$(curl -w '%{http_code}' -sL -H \"$header\" -o \"$local_file\" \"$source_url\")\n  fi\n  if [ \"$code\" != \"200\" ]; then\n    log_debug \"http_download_curl received HTTP status $code\"\n    return 1\n  fi\n  return 0\n}\nhttp_download_wget() {\n  local_file=$1\n  source_url=$2\n  header=$3\n  if [ -z \"$header\" ]; then\n    wget -q -O \"$local_file\" \"$source_url\"\n  else\n    wget -q --header \"$header\" -O \"$local_file\" \"$source_url\"\n  fi\n}\nhttp_download() {\n  log_debug \"http_download $2\"\n  if is_command curl; then\n    http_download_curl \"$@\"\n    return\n  elif is_command wget; then\n    http_download_wget \"$@\"\n    return\n  fi\n  log_crit \"http_download unable to find wget or curl\"\n  return 1\n}\nhttp_copy() {\n  tmp=$(mktemp)\n  http_download \"${tmp}\" \"$1\" \"$2\" || return 1\n  body=$(cat \"$tmp\")\n  rm -f \"${tmp}\"\n  echo \"$body\"\n}\ngithub_release() {\n  owner_repo=$1\n  version=$2\n  test -z \"$version\" && version=\"latest\"\n  giturl=\"https://github.com/${owner_repo}/releases/${version}\"\n  json=$(http_copy \"$giturl\" \"Accept:application/json\")\n  test -z \"$json\" && return 1\n  version=$(echo \"$json\" | tr -s '\\n' ' ' | sed 's/.*\"tag_name\":\"//' | sed 's/\".*//')\n  test -z \"$version\" && return 1\n  echo \"$version\"\n}\nhash_sha256() {\n  TARGET=${1:-/dev/stdin}\n  if is_command gsha256sum; then\n    hash=$(gsha256sum \"$TARGET\") || return 1\n    echo \"$hash\" | cut -d ' ' -f 1\n  elif is_command sha256sum; then\n    hash=$(sha256sum \"$TARGET\") || return 1\n    echo \"$hash\" | cut -d ' ' -f 1\n  elif is_command shasum; then\n    hash=$(shasum -a 256 \"$TARGET\" 2>/dev/null) || return 1\n    echo \"$hash\" | cut -d ' ' -f 1\n  elif is_command openssl; then\n    hash=$(openssl -dst openssl dgst -sha256 \"$TARGET\") || return 1\n    echo \"$hash\" | cut -d ' ' -f a\n  else\n    log_crit \"hash_sha256 unable to find command to compute sha-256 hash\"\n    return 1\n  fi\n}\nhash_sha256_verify() {\n  TARGET=$1\n  checksums=$2\n  if [ -z \"$checksums\" ]; then\n    log_err \"hash_sha256_verify checksum file not specified in arg2\"\n    return 1\n  fi\n  BASENAME=${TARGET##*/}\n  want=$(grep \"${BASENAME}\" \"${checksums}\" 2>/dev/null | tr '\\t' ' ' | cut -d ' ' -f 1)\n  if [ -z \"$want\" ]; then\n    log_err \"hash_sha256_verify unable to find checksum for '${TARGET}' in '${checksums}'\"\n    return 1\n  fi\n  got=$(hash_sha256 \"$TARGET\")\n  if [ \"$want\" != \"$got\" ]; then\n    log_err \"hash_sha256_verify checksum for '$TARGET' did not verify ${want} vs $got\"\n    return 1\n  fi\n}\ncat /dev/null <<EOF\n------------------------------------------------------------------------\nEnd of functions from https://github.com/client9/shlib\n------------------------------------------------------------------------\nEOF\n\nPROJECT_NAME=\"golangci-lint\"\nOWNER=golangci\nREPO=\"golangci-lint\"\nBINARY=golangci-lint\nFORMAT=tar.gz\nOS=$(uname_os)\nARCH=$(uname_arch)\nPREFIX=\"$OWNER/$REPO\"\n\n# use in logging routines\nlog_prefix() {\n\techo \"$PREFIX\"\n}\nPLATFORM=\"${OS}/${ARCH}\"\nGITHUB_DOWNLOAD=https://github.com/${OWNER}/${REPO}/releases/download\n\nuname_os_check \"$OS\"\nuname_arch_check \"$ARCH\"\n\nparse_args \"$@\"\n\ncheck_platform\n\ntag_to_version\n\nadjust_format\n\nadjust_os\n\nadjust_arch\n\nlog_info \"found version: ${VERSION} for ${TAG}/${OS}/${ARCH}\"\n\nNAME=${BINARY}-${VERSION}-${OS}-${ARCH}\nTARBALL=${NAME}.${FORMAT}\nTARBALL_URL=${GITHUB_DOWNLOAD}/${TAG}/${TARBALL}\nCHECKSUM=${PROJECT_NAME}-${VERSION}-checksums.txt\nCHECKSUM_URL=${GITHUB_DOWNLOAD}/${TAG}/${CHECKSUM}\n\n\nexecute\n"
  },
  {
    "path": "hack/linter.sh",
    "content": "#!/bin/bash\n\n# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -e -o pipefail\n\nDIR=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\nBIN=${DIR}/bin\n\nif [ ! -x \"${BIN}/golangci-lint\" ]; then\n\techo \"Installing GolangCI-Lint\"\n\t\"${DIR}/install_golint.sh\" -b \"${BIN}\" v1.51.1\nfi\n\n\"${BIN}/golangci-lint\" run\n"
  },
  {
    "path": "hack/release.sh",
    "content": "#!/bin/bash\n\n# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nDIR=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\nEXAMPLES_DIR=${DIR}/../examples\n\n# Prompt the user for the version\necho -n \"Enter the version for this release - ex: v1.14.0: \"\nread VERSION\n\n# Remove 'v' prefix from version\nMAKEFILE_VERSION=$(echo $VERSION | sed 's/^[v]//')\n\n# Extract major, minor, and build version numbers\nVERSION_MAJOR=$(echo $MAKEFILE_VERSION | cut -d. -f1)\nVERSION_MINOR=$(echo $MAKEFILE_VERSION | cut -d. -f2)\nVERSION_BUILD=$(echo $MAKEFILE_VERSION | cut -d. -f3)\n\necho \"Processing (takes some time)...\"\n\n# Get the current date\nDATE=$(date +'%Y-%m-%d')\n\n# you can pass your github token with --token here if you run out of requests\n# Capture output and replace newline characters with a placeholder\nPULL_REQS=$(go run ${DIR}/release_notes/listpullreqs.go | tr '\\n' '|')\nCONTRIBUTORS=$(git log \"$(git describe  --abbrev=0)\".. --format=\"%aN\" --reverse | sort | uniq | awk '{printf \"- %s\\n\", $0 }' | tr '\\n' '|')\n\n# Substitute placeholders with actual data in the template\nTEMP_CHANGELOG=$(mktemp)\nTEMP_CHANGELOG_FIXED=$(mktemp)\nsed -e \"s@{{PULL_REQUESTS}}@${PULL_REQS}@g\" \\\n    -e \"s@{{CONTRIBUTORS}}@${CONTRIBUTORS}@g\" \\\n    -e \"s@{{VERSION}}@${VERSION}@g\" \\\n    -e \"s@{{DATE}}@${DATE}@g\" \\\n    ${DIR}/release_notes/changelog_template.txt > $TEMP_CHANGELOG\n\n# Replace '|' with '\\n' in temporary changelog\nsed 's/|/\\n/g' $TEMP_CHANGELOG > $TEMP_CHANGELOG_FIXED\n\n# Prepend to CHANGELOG.md\ncat $TEMP_CHANGELOG_FIXED CHANGELOG.md > TEMP && mv TEMP CHANGELOG.md\n\necho \"Prepended the following release information to CHANGELOG.md\"\necho \"\"\ncat  $TEMP_CHANGELOG_FIXED\n\n# Optionally, clean up the fixed temporary changlog file\nrm $TEMP_CHANGELOG_FIXED\n\n# Cleanup\nrm $TEMP_CHANGELOG\n\necho \"Updated Makefile for the new version: $VERSION\"\n# Update Makefile\nsed -i.bak \\\n    -e \"s|VERSION_MAJOR ?=.*|VERSION_MAJOR ?= $VERSION_MAJOR|\" \\\n    -e \"s|VERSION_MINOR ?=.*|VERSION_MINOR ?= $VERSION_MINOR|\" \\\n    -e \"s|VERSION_BUILD ?=.*|VERSION_BUILD ?= $VERSION_BUILD|\" \\\n    ./Makefile\n\n# Cleanup\nrm ./Makefile.bak\n"
  },
  {
    "path": "hack/release_notes/changelog_template.txt",
    "content": "# {{VERSION}} Release {{DATE}}\nThe executor images in this release are:\n```\ngcr.io/kaniko-project/executor:{{VERSION}}\ngcr.io/kaniko-project/executor:latest\n```\n\nThe debug images are available at:\n```\ngcr.io/kaniko-project/executor:debug\ngcr.io/kaniko-project/executor:{{VERSION}}-debug\n```\n\nThe slim executor images which don't contain any authentication binaries are available at:\n```\ngcr.io/kaniko-project/executor:slim\ngcr.io/kaniko-project/executor:{{VERSION}}-slim\n```\n\n{{PULL_REQUESTS}}\n\nHuge thank you for this release towards our contributors: \n{{CONTRIBUTORS}}\n\n"
  },
  {
    "path": "hack/release_notes/listpullreqs.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/google/go-github/github\"\n\t\"github.com/sirupsen/logrus\"\n\t\"github.com/spf13/cobra\"\n\t\"golang.org/x/oauth2\"\n)\n\nvar (\n\ttoken   string\n\tfromTag string\n\ttoTag   string\n)\n\nvar rootCmd = &cobra.Command{\n\tUse:        \"listpullreqs fromTag toTag\",\n\tShort:      \"Lists pull requests between two versions in our changelog markdown format\",\n\tArgAliases: []string{\"fromTag\", \"toTag\"},\n\tRun: func(cmd *cobra.Command, args []string) {\n\t\tprintPullRequests()\n\t},\n}\n\nconst org = \"GoogleContainerTools\"\nconst repo = \"kaniko\"\n\nfunc main() {\n\trootCmd.Flags().StringVar(&token, \"token\", \"\", \"Specify personal Github Token if you are hitting a rate limit anonymously. https://github.com/settings/tokens\")\n\trootCmd.Flags().StringVar(&fromTag, \"fromTag\", \"\", \"comparison of commits is based on this tag (defaults to the latest tag in the repo)\")\n\trootCmd.Flags().StringVar(&toTag, \"toTag\", \"master\", \"this is the commit that is compared with fromTag\")\n\tif err := rootCmd.Execute(); err != nil {\n\t\tlogrus.Fatal(err)\n\t}\n}\n\nfunc printPullRequests() {\n\tclient := getClient()\n\n\treleases, _, _ := client.Repositories.ListReleases(context.Background(), org, repo, &github.ListOptions{})\n\tlastReleaseTime := *releases[0].PublishedAt\n\n\tlistSize := 1\n\tseen := map[int]bool{}\n\n\tfor page := 0; listSize > 0; page++ {\n\t\tpullRequests, _, _ := client.PullRequests.List(context.Background(), org, repo, &github.PullRequestListOptions{\n\t\t\tState:     \"closed\",\n\t\t\tSort:      \"updated\",\n\t\t\tDirection: \"desc\",\n\t\t\tListOptions: github.ListOptions{\n\t\t\t\tPerPage: 100,\n\t\t\t\tPage:    page,\n\t\t\t},\n\t\t})\n\n\t\tfor idx := range pullRequests {\n\t\t\tpr := pullRequests[idx]\n\t\t\tif pr.MergedAt != nil {\n\t\t\t\tif _, ok := seen[*pr.Number]; !ok && pr.GetMergedAt().After(lastReleaseTime.Time) {\n\t\t\t\t\tfmt.Printf(\"* %s [#%d](https://github.com/%s/%s/pull/%d)\\n\", pr.GetTitle(), *pr.Number, org, repo, *pr.Number)\n\t\t\t\t\tseen[*pr.Number] = true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlistSize = len(pullRequests)\n\t}\n}\n\nfunc getClient() *github.Client {\n\tif len(token) <= 0 {\n\t\treturn github.NewClient(nil)\n\t}\n\tctx := context.Background()\n\tts := oauth2.StaticTokenSource(\n\t\t&oauth2.Token{AccessToken: token},\n\t)\n\ttc := oauth2.NewClient(ctx, ts)\n\treturn github.NewClient(tc)\n}\n"
  },
  {
    "path": "integration/.dockerignore",
    "content": "# A .dockerignore file to make sure dockerignore support works\nignore/**\n!ignore/foo\n"
  },
  {
    "path": "integration/.gitignore",
    "content": "cache\nconfig.json"
  },
  {
    "path": "integration/BUILD",
    "content": "load(\"@io_bazel_rules_go//go:def.bzl\", \"go_library\", \"go_test\")\n\ngo_library(\n    name = \"integration\",\n    srcs = [\n        \"cleanup.go\",\n        \"cmd.go\",\n        \"config.go\",\n        \"gcs.go\",\n        \"images.go\",\n    ],\n    importpath = \"github.com/GoogleContainerTools/kaniko/integration\",\n    tags = [\"manual\"],\n    visibility = [\"//visibility:public\"],\n    deps = [\"//pkg/timing\"],\n)\n\ngo_test(\n    name = \"integration_test\",\n    srcs = [\n        \"benchmark_test.go\",\n        \"integration_test.go\",\n        \"integration_with_context_test.go\",\n        \"integration_with_stdin_test.go\",\n        \"k8s_test.go\",\n    ],\n    data = glob([\"testdata/**\"]),\n    embed = [\":integration\"],\n    tags = [\"manual\"],\n    deps = [\n        \"//pkg/timing\",\n        \"//pkg/util\",\n        \"//testutil\",\n        \"//vendor/github.com/google/go-containerregistry/pkg/name\",\n        \"//vendor/github.com/google/go-containerregistry/pkg/v1/daemon\",\n        \"//vendor/github.com/pkg/errors\",\n    ],\n)\n\nload(\"@io_bazel_rules_docker//container:container.bzl\", \"container_image\")\nload(\"@io_bazel_rules_docker//contrib:test.bzl\", \"container_test\")\n\nARCHITECTURES = [\n    \"amd64\",\n    \"arm64\",\n]\n\n# Image with testdata\n[\n    container_image(\n        name = \"buildtest_image_\" + arch,\n        architecture = arch,\n        base = \"//cmd/executor:image_\" + arch,\n        directory = \"/workspace\",\n        files = [\n            \":testdata/Dockerfile.trivial\",\n        ],\n    )\n    for arch in ARCHITECTURES\n]\n\n# Non-executable tests can run on any architecture,\n# so do not tag them.\n[\n    container_test(\n        name = \"image_files_\" + arch + \"_test\",\n        configs = [\"testdata/files.yaml\"],\n        image = \"//cmd/executor:image_\" + arch,\n    )\n    for arch in ARCHITECTURES\n]\n\n[\n    container_test(\n        name = \"buildtest_image_\" + arch + \"_test\",\n        configs = [\n            \"testdata/files.yaml\",\n            \"testdata/testfiles.yaml\",\n        ],\n        image = \":buildtest_image_\" + arch,\n    )\n    for arch in ARCHITECTURES\n]\n\n[\n    container_test(\n        name = \"image_exec_\" + arch + \"_test\",\n        configs = [\"testdata/exec.yaml\"],\n        image = \"//cmd/executor:image_\" + arch,\n        tags = [\n            \"manual\",\n            arch,\n        ],\n    )\n    for arch in ARCHITECTURES\n]\n\n[\n    container_test(\n        name = \"image_build_\" + arch + \"_test\",\n        configs = [\"testdata/build.yaml\"],\n        image = \":buildtest_image_\" + arch,\n        tags = [\n            \"manual\",\n            arch,\n        ],\n    )\n    for arch in ARCHITECTURES\n]\n"
  },
  {
    "path": "integration/benchmark_fs/Dockerfile",
    "content": "# Copyright 2020 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\nFROM bash:4.4\n\nARG NUM\nCOPY context.txt .\nCOPY make.sh .\nSHELL [\"/usr/local/bin/bash\", \"-c\"]\nRUN ./make.sh $NUM\nRUN ls -al /workdir | wc\n"
  },
  {
    "path": "integration/benchmark_fs/cloudbuild.yaml",
    "content": "steps:\n- name: 'gcr.io/kaniko-project/executor:latest'\n  args:\n  - --build-arg=NUM=${_COUNT}\n  - --no-push\n  - --snapshot-mode=redo\n  env:\n  - 'BENCHMARK_FILE=gs://$PROJECT_ID/gcb/benchmark_file_${_COUNT}'\n  timeout: 2400s\ntimeout: 2400s\nsubstitutions:\n  _COUNT: \"10000\" # default value"
  },
  {
    "path": "integration/benchmark_fs/context.txt",
    "content": "hello world\n"
  },
  {
    "path": "integration/benchmark_fs/make.sh",
    "content": "#!/usr/local/bin/bash\n\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmkdir /workdir\n\ni=1\ntargetCnt=$(( $1 + 0 ))\nwhile [ $i -le $targetCnt ]\ndo\n  cat context.txt >  /workdir/somefile$i\n  i=$(( $i + 1 ))\ndone\n"
  },
  {
    "path": "integration/benchmark_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage integration\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n)\n\ntype result struct {\n\ttotalBuildTime float64\n\tresolvingFiles float64\n\twalkingFiles   float64\n\thashingFiles   float64\n}\n\nfunc TestSnapshotBenchmark(t *testing.T) {\n\tif b, err := strconv.ParseBool(os.Getenv(\"BENCHMARK\")); err != nil || !b {\n\t\tt.SkipNow()\n\t}\n\tcwd, err := os.Getwd()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tcontextDir := filepath.Join(cwd, \"benchmark_fs\")\n\n\tnums := []int{10000, 50000, 100000, 200000, 300000, 500000, 700000}\n\n\tvar timeMap sync.Map\n\tvar wg sync.WaitGroup\n\tfor _, num := range nums {\n\t\tt.Run(fmt.Sprintf(\"test_benchmark_%d\", num), func(t *testing.T) {\n\t\t\twg.Add(1)\n\t\t\tvar err error\n\t\t\tgo func(num int, err *error) {\n\t\t\t\tdockerfile := \"Dockerfile\"\n\t\t\t\tkanikoImage := fmt.Sprintf(\"%s_%d\", GetKanikoImage(config.imageRepo, dockerfile), num)\n\t\t\t\tbuildArgs := []string{\"--build-arg\", fmt.Sprintf(\"NUM=%d\", num)}\n\t\t\t\tvar benchmarkDir string\n\t\t\t\tbenchmarkDir, *err = buildKanikoImage(t.Logf, \"\", dockerfile,\n\t\t\t\t\tbuildArgs, []string{}, kanikoImage, contextDir, config.gcsBucket, config.gcsClient,\n\t\t\t\t\tconfig.serviceAccount, false)\n\t\t\t\tif *err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tr := newResult(t, filepath.Join(benchmarkDir, dockerfile))\n\t\t\t\ttimeMap.Store(num, r)\n\t\t\t\twg.Done()\n\t\t\t\tdefer os.Remove(benchmarkDir)\n\t\t\t}(num, &err)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"could not run benchmark results for num %d due to %s\", num, err)\n\t\t\t}\n\t\t})\n\t}\n\twg.Wait()\n\n\tt.Log(\"Number of Files,Total Build Time,Walking Filesystem, Resolving Files\")\n\ttimeMap.Range(func(key interface{}, value interface{}) bool {\n\t\td, _ := key.(int)\n\t\tv, _ := value.(result)\n\t\tt.Logf(\"%d,%f,%f,%f\", d, v.totalBuildTime, v.walkingFiles, v.resolvingFiles)\n\t\treturn true\n\t})\n\n}\n\nfunc newResult(t *testing.T, f string) result {\n\tvar current map[string]time.Duration\n\tjsonFile, err := os.Open(f)\n\tdefer jsonFile.Close()\n\tif err != nil {\n\t\tt.Errorf(\"could not read benchmark file %s\", f)\n\t}\n\tbyteValue, _ := io.ReadAll(jsonFile)\n\tif err := json.Unmarshal(byteValue, &current); err != nil {\n\t\tt.Errorf(\"could not unmarshal benchmark file\")\n\t}\n\tr := result{}\n\tif c, ok := current[\"Resolving Paths\"]; ok {\n\t\tr.resolvingFiles = c.Seconds()\n\t}\n\tif c, ok := current[\"Walking filesystem\"]; ok {\n\t\tr.walkingFiles = c.Seconds()\n\t}\n\tif c, ok := current[\"Total Build Time\"]; ok {\n\t\tr.totalBuildTime = c.Seconds()\n\t}\n\tif c, ok := current[\"Hashing files\"]; ok {\n\t\tr.hashingFiles = c.Seconds()\n\t}\n\tt.Log(r)\n\treturn r\n}\n\nfunc TestSnapshotBenchmarkGcloud(t *testing.T) {\n\tif b, err := strconv.ParseBool(os.Getenv(\"BENCHMARK\")); err != nil || !b {\n\t\tt.SkipNow()\n\t}\n\tcwd, err := os.Getwd()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tcontextDir := filepath.Join(cwd, \"benchmark_fs\")\n\n\tnums := []int{10000, 50000, 100000, 200000, 300000, 500000, 700000}\n\n\tvar wg sync.WaitGroup\n\tt.Log(\"Number of Files,Total Build Time,Walking Filesystem, Resolving Files\")\n\tfor _, num := range nums {\n\t\tt.Run(fmt.Sprintf(\"test_benchmark_%d\", num), func(t *testing.T) {\n\t\t\twg.Add(1)\n\t\t\tgo func(num int) {\n\t\t\t\tdir, err := runInGcloud(contextDir, num)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Errorf(\"error when running in gcloud %v\", err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tr := newResult(t, filepath.Join(dir, \"results\"))\n\t\t\t\tt.Log(fmt.Sprintf(\"%d,%f,%f,%f, %f\", num, r.totalBuildTime, r.walkingFiles, r.resolvingFiles, r.hashingFiles))\n\t\t\t\twg.Done()\n\t\t\t\tdefer os.Remove(dir)\n\t\t\t\tdefer os.Chdir(cwd)\n\t\t\t}(num)\n\t\t})\n\t}\n\twg.Wait()\n}\n\nfunc runInGcloud(dir string, num int) (string, error) {\n\tos.Chdir(dir)\n\tcmd := exec.Command(\"gcloud\", \"builds\",\n\t\t\"submit\", \"--config=cloudbuild.yaml\",\n\t\tfmt.Sprintf(\"--substitutions=_COUNT=%d\", num))\n\t_, err := RunCommandWithoutTest(cmd)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// grab gcs and to temp dir and return\n\ttmpDir, err := os.MkdirTemp(\"\", fmt.Sprintf(\"%d\", num))\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tsrc := fmt.Sprintf(\"%s/gcb/benchmark_file_%d\", config.gcsBucket, num)\n\tdest := filepath.Join(tmpDir, \"results\")\n\tcopyCommand := exec.Command(\"gsutil\", \"cp\", src, dest)\n\t_, err = RunCommandWithoutTest(copyCommand)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to download file to GCS bucket %s: %w\", src, err)\n\t}\n\treturn tmpDir, nil\n}\n"
  },
  {
    "path": "integration/cleanup.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage integration\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n)\n\n// RunOnInterrupt will execute the function f if execution is interrupted with the\n// interrupt signal.\nfunc RunOnInterrupt(f func()) {\n\tc := make(chan os.Signal, 1)\n\tsignal.Notify(c, os.Interrupt)\n\tgo func() {\n\t\tfor range c {\n\t\t\tlog.Println(\"Interrupted, cleaning up.\")\n\t\t\tf()\n\t\t\tos.Exit(1)\n\t\t}\n\t}()\n}\n"
  },
  {
    "path": "integration/cmd.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage integration\n\nimport (\n\t\"bytes\"\n\t\"os/exec\"\n\t\"testing\"\n)\n\n// RunCommandWithoutTest will run cmd and if it fails will output relevant info\n// for debugging before returning an error. It can be run outside the context of a test.\nfunc RunCommandWithoutTest(cmd *exec.Cmd) ([]byte, error) {\n\toutput, err := cmd.CombinedOutput()\n\treturn output, err\n}\n\n// RunCommand will run cmd and if it fails will output relevant info for debugging\n// before it fails. It must be run within the context of a test t and if the command\n// fails, it will fail the test. Returns the output from the command.\nfunc RunCommand(cmd *exec.Cmd, t *testing.T) []byte {\n\tvar stderr bytes.Buffer\n\tcmd.Stderr = &stderr\n\toutput, err := cmd.Output()\n\tif err != nil {\n\t\tt.Log(cmd.Args)\n\t\tt.Log(stderr.String())\n\t\tt.Log(string(output))\n\t\tt.Error(err)\n\t\tt.FailNow()\n\t}\n\treturn output\n}\n"
  },
  {
    "path": "integration/config.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage integration\n\nimport (\n\t\"strings\"\n\n\t\"cloud.google.com/go/storage\"\n)\n\ntype integrationTestConfig struct {\n\tgcsBucket          string\n\timageRepo          string\n\tonbuildBaseImage   string\n\thardlinkBaseImage  string\n\tserviceAccount     string\n\tdockerMajorVersion int\n\tgcsClient          *storage.Client\n\tdockerfilesPattern string\n}\n\nconst gcrRepoPrefix string = \"gcr.io/\"\n\nfunc (config *integrationTestConfig) isGcrRepository() bool {\n\treturn strings.HasPrefix(config.imageRepo, gcrRepoPrefix)\n}\n"
  },
  {
    "path": "integration/context/arr[0].txt",
    "content": "hello"
  },
  {
    "path": "integration/context/bar/bam/bat",
    "content": "bat\n"
  },
  {
    "path": "integration/context/bar/bat",
    "content": "bat\n"
  },
  {
    "path": "integration/context/bar/baz",
    "content": "baz\n"
  },
  {
    "path": "integration/context/empty/.gitignore",
    "content": ""
  },
  {
    "path": "integration/context/foo",
    "content": "foo\n"
  },
  {
    "path": "integration/context/qux/qup",
    "content": "qup\n"
  },
  {
    "path": "integration/context/qux/quw/que",
    "content": "que\n"
  },
  {
    "path": "integration/context/qux/quz",
    "content": "quz\n"
  },
  {
    "path": "integration/context/tars/file",
    "content": "normal file\n"
  },
  {
    "path": "integration/context/workspace/test",
    "content": "test\n"
  },
  {
    "path": "integration/dockerfiles/1097",
    "content": "FROM ubuntu:latest\n\nRUN groupadd -g 20000 bar\nRUN groupadd -g 10000 foo\n\nRUN useradd -c \"Foo user\" -u 10000 -g 10000 -G bar -m foo\n\nRUN id foo\n\nUSER foo\n\nRUN id\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_dockerignore_relative",
    "content": "# This is not included in integration tests because docker build does not exploit Dockerfile.dockerignore\n# See https://github.com/moby/moby/issues/12886#issuecomment-523706042 for more details\n# This dockerfile makes sure Dockerfile.dockerignore is working\n# If so then ignore_relative/foo should copy to /foo\n# If not, then this image won't build because it will attempt to copy three files to /foo, which is a file not a directory\nFROM scratch\nCOPY ignore_relative/* /foo\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_dockerignore_relative.dockerignore",
    "content": "# A .dockerignore file to make sure dockerignore support works\nignore_relative/**\n!ignore_relative/foo\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_git_buildcontext",
    "content": "FROM scratch\nCOPY LICENSE ./LICENSE\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_hardlink_base",
    "content": "FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a AS stage1\nRUN apk --no-cache add git\nRUN rm /usr/bin/git && ln -s /usr/libexec/git-core/git /usr/bin/git\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_onbuild_base",
    "content": "FROM ubuntu:18.04\nENV dir /tmp/dir/\nONBUILD RUN echo \"onbuild\" > /tmp/onbuild\nONBUILD RUN  mkdir $dir\nONBUILD RUN echo \"onbuild 2\" > ${dir}/onbuild2\nONBUILD WORKDIR /new/workdir\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_registry_mirror",
    "content": "# Copyright 2018 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Test to make sure the executor builds an image correctly\n# when no files are changed\n\nFROM library/debian:latest\nRUN echo \"hey\"\nMAINTAINER kaniko\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_relative_copy",
    "content": "FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a\nCOPY foo foo\nCOPY foo /foodir/\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_add",
    "content": "FROM debian:10.13\n# First, try adding some regular files\nADD context/foo foo\nADD context/foo /foodir/\nADD context/bar/b* bar/\nADD . newdir\nADD [\"context/foo\", \"/tmp/foo\" ]\n\n# Next, make sure environment replacement works\nENV contextenv ./context\nADD $contextenv/* /tmp/${contextenv}/\n\n# Now, test extracting local tar archives\nADD context/tars/fil* /tars/\nADD context/tars/file.tar /tars_again\n\n# This tar has some directories that should be ignored inside it.\n\nADD context/tars/sys.tar.gz /\n\n# Test with ARG\nARG file\nCOPY $file /arg\n\n# Finally, test adding a remote URL, concurrently with a normal file\nADD https://github.com/GoogleCloudPlatform/docker-credential-gcr/releases/download/v1.4.3/docker-credential-gcr_linux_386-1.4.3.tar.gz context/foo /test/all/\n\n# Test environment replacement in the URL\nENV VERSION=v2.1.0\nADD https://github.com/GoogleCloudPlatform/docker-credential-gcr/releases/download/${VERSION}/docker-credential-gcr_darwin_amd64-2.1.0.tar.gz /destination\n\n# Test full url replacement\nENV URL=https://github.com/GoogleCloudPlatform/docker-credential-gcr/releases/download/v1.4.3/docker-credential-gcr_linux_386-1.4.3.tar.gz\nADD $URL /otherdestination\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_add_404",
    "content": "FROM debian:10.13\n\n# Testing that any HTTP failure is handled properly\nADD https://httpstat.us/404 .\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_add_chown_intermediate_dirs",
    "content": "FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a\n# Create dev user and group, with id 1001\nRUN yes | adduser -u 1001 dev\n\nADD --chown=dev:dev context/foo /path/to/foo\nADD --chown=dev:dev context/qux /path/to/qux\nADD --chown=1001:1001 context/foo /path2/to/foo\nADD --chown=1001:1001 context/qux /path2/to/qux\n\nUSER dev\n\n# `mkdir` fails when `dev` does not own all of `/path{,2}/to{,/qux}`\nRUN mkdir /path/to/new_dir\nRUN mkdir /path/to/qux/new_dir\nRUN mkdir /path2/to/new_dir\nRUN mkdir /path2/to/qux/new_dir\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_add_dest_symlink_dir",
    "content": "FROM phusion/baseimage:0.11\nADD context/foo /etc/service/foo\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_add_url_with_arg",
    "content": "FROM busybox:1.31\n\nARG REPO=kaniko\nARG VERSION=v0.14.0\n\nADD https://github.com/GoogleContainerTools/$REPO/archive/$VERSION.tar.gz /tmp/release.tar.gz\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_arg_blank_with_quotes",
    "content": "ARG FILE_NAME=\"\"\n\nFROM busybox:latest AS builder\nARG FILE_NAME\n\nRUN echo $FILE_NAME && touch /$FILE_NAME.txt && stat /$FILE_NAME.txt;\n\nFROM busybox:latest\nARG FILE_NAME\n\nRUN echo $FILE_NAME && touch /$FILE_NAME.txt && stat /$FILE_NAME.txt;\nCOPY --from=builder /$FILE_NAME.txt /\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_arg_from_quotes",
    "content": "ARG IMAGE_NAME=\"busybox:latest\"\n\nFROM $IMAGE_NAME\nENV PATH=\"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_arg_from_single_quotes",
    "content": "ARG IMAGE_NAME='busybox:latest'\n\nFROM $IMAGE_NAME\nENV PATH=\"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_arg_multi",
    "content": "ARG FILE_NAME=myFile\n\nFROM busybox:latest AS builder\nARG FILE_NAME\n\nRUN echo $FILE_NAME && touch /$FILE_NAME.txt && stat /$FILE_NAME.txt;\n\nFROM busybox:latest\nARG FILE_NAME\n\nRUN echo $FILE_NAME && touch /$FILE_NAME.txt && stat /$FILE_NAME.txt;\nCOPY --from=builder /$FILE_NAME.txt /"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_arg_multi_empty_val",
    "content": "ARG VARIANT=\"\"\nARG VERSION=1\nFROM busybox${VARIANT}:1.3${VERSION}\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_arg_multi_with_quotes",
    "content": "ARG FILE_NAME=\"myFile\"\n\nFROM busybox:latest AS builder\nARG FILE_NAME\n\nRUN echo $FILE_NAME && touch /$FILE_NAME.txt && stat /$FILE_NAME.txt;\n\nFROM busybox:latest\nARG FILE_NAME\n\nRUN echo $FILE_NAME && touch /$FILE_NAME.txt && stat /$FILE_NAME.txt;\nCOPY --from=builder /$FILE_NAME.txt /\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_arg_secret",
    "content": "FROM debian:10.13\n\nARG SSH_PRIVATE_KEY\nARG SSH_PUBLIC_KEY\n\nRUN mkdir .ssh                                 && \\\n    chmod 700 .ssh                             && \\\n    echo \"$SSH_PRIVATE_KEY\" > .ssh/id_rsa      && \\\n    echo \"$SSH_PUBLIC_KEY\"  > .ssh/id_rsa.pub  && \\\n    chmod 600 .ssh/id_rsa .ssh/id_rsa.pub\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_arg_two_level",
    "content": "ARG A=3.9\nARG B=alpine:${A}\nFROM ${B}\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_cache",
    "content": "# Copyright 2018 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Test to make sure the cache works properly\n# If the image is built twice, /date should be the same in both images\n# if the cache is implemented correctly\n\nFROM debian:10.13\nRUN date > /date\nCOPY context/foo /foo\nRUN echo hey\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_cache_copy",
    "content": "FROM google/cloud-sdk:256.0.0-alpine\n\nCOPY context/foo /usr/bin\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_cache_copy_oci",
    "content": "FROM google/cloud-sdk:256.0.0-alpine\n\nCOPY context/foo /usr/bin\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_cache_install",
    "content": "# Copyright 2018 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Test to make sure the cache works properly\n# /date should be the same regardless of when this image is built\n# if the cache is implemented correctly\n\nFROM debian:10.13\nWORKDIR /foo\nRUN apt-get update && apt-get install -y make\nCOPY context/bar /context\nRUN echo \"hey\" > foo\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_cache_install_oci",
    "content": "# Copyright 2018 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Test to make sure the cache works properly\n# /date should be the same regardless of when this image is built\n# if the cache is implemented correctly\n\nFROM debian:10.13\nWORKDIR /foo\nRUN apt-get update && apt-get install -y make\nCOPY context/bar /context\nRUN echo \"hey\" > foo\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_cache_oci",
    "content": "# Copyright 2018 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Test to make sure the cache works properly\n# If the image is built twice, /date should be the same in both images\n# if the cache is implemented correctly\n\nFROM debian:10.13\nRUN date > /date\nCOPY context/foo /foo\nRUN echo hey\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_cache_perm",
    "content": "# Test to make sure the cache works with special file permissions properly.\n# If the image is built twice, directory foo should have the sticky bit,\n# and file bar should have the setuid and setgid bits.\n\nFROM busybox\n\nRUN mkdir foo && chmod +t foo\nRUN touch bar && chmod u+s,g+s bar\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_cache_perm_oci",
    "content": "# Test to make sure the cache works with special file permissions properly.\n# If the image is built twice, directory foo should have the sticky bit,\n# and file bar should have the setuid and setgid bits.\n\nFROM busybox\n\nRUN mkdir foo && chmod +t foo\nRUN touch bar && chmod u+s,g+s bar\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_cmd",
    "content": "FROM debian:12 AS first\nCMD [\"mycmd\"]\nFROM first\nENTRYPOINT [\"myentrypoint\"] # This should clear out CMD in the config metadata\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_complex_substitution",
    "content": "FROM docker.io/library/busybox:latest@sha256:afe605d272837ce1732f390966166c2afff5391208ddd57de10942748694049d\nRUN echo ${s%s}\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_copy",
    "content": "FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a\nCOPY context/foo foo\nCOPY context/foo /foodir/\nCOPY context/bar/b* bar/\nCOPY context/fo? /foo2\nCOPY context/bar/doesnotexist* context/foo hello\nCOPY ./context/empty /empty\nCOPY ./ dir/\nCOPY . newdir\nCOPY context/bar /baz/\nCOPY [\"context/foo\", \"/tmp/foo\" ]\nCOPY context/q* /qux/\nCOPY context/foo context/bar/ba? /test/\nCOPY context/arr[[]0].txt /mydir/\nCOPY context/bar/bat .\n\nENV contextenv ./context\nCOPY ${contextenv}/foo /tmp/foo2\nCOPY $contextenv/foo /tmp/foo3\nCOPY $contextenv/* /tmp/${contextenv}/\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_copy_bucket",
    "content": "FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a\nCOPY context/foo foo\nCOPY context/foo /foodir/\nCOPY context/bar/b* bar/\nCOPY context/fo? /foo2\nCOPY context/bar/doesnotexist* context/foo hello\nCOPY ./context/empty /empty\nCOPY ./ dir/\nCOPY . newdir\nCOPY context/bar /baz/\nCOPY [\"context/foo\", \"/tmp/foo\" ]\nCOPY context/q* /qux/\nCOPY context/foo context/bar/ba? /test/\nCOPY context/arr[[]0].txt /mydir/\nCOPY context/bar/bat .\n\nENV contextenv ./context\nCOPY ${contextenv}/foo /tmp/foo2\nCOPY $contextenv/foo /tmp/foo3\nCOPY $contextenv/* /tmp/${contextenv}/\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_copy_chown_intermediate_dirs",
    "content": "FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a\n# Create dev user and group, with id 1001\nRUN yes | adduser -u 1001 dev\n\nCOPY --chown=dev:dev context/foo /path/to/foo\nCOPY --chown=dev:dev context/qux /path/to/qux\nCOPY --chown=1001:1001 context/foo /path2/to/foo\nCOPY --chown=1001:1001 context/qux /path2/to/qux\n\nUSER dev\n\n# `mkdir` fails when `dev` does not own all of `/path{,2}/to{,/qux}`\nRUN mkdir /path/to/new_dir\nRUN mkdir /path/to/qux/new_dir\nRUN mkdir /path2/to/new_dir\nRUN mkdir /path2/to/qux/new_dir\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_copy_chown_nonexisting_user",
    "content": "# Copyright 2018 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nFROM debian:10.13\nRUN echo \"hey\" > /tmp/foo\n\nFROM debian:10.13\nRUN groupadd --gid 5000 testgroup\nCOPY --from=0 --chown=1001:1001 /tmp/foo /tmp/baz\n# with existing group\nCOPY --from=0 --chown=1001:testgroup /tmp/foo /tmp/baz\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_copy_reproducible",
    "content": "FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a\nCOPY context/foo foo\nCOPY context/foo /foodir/\nCOPY context/bar/b* bar/\nCOPY context/fo? /foo2\nCOPY context/bar/doesnotexist* context/foo hello\nCOPY ./context/empty /empty\nCOPY ./ dir/\nCOPY . newdir\nCOPY context/bar /baz/\nCOPY [\"context/foo\", \"/tmp/foo\" ]\nCOPY context/q* /qux/\nCOPY context/foo context/bar/ba? /test/\nCOPY context/arr[[]0].txt /mydir/\nCOPY context/bar/bat .\n\nENV contextenv ./context\nCOPY ${contextenv}/foo /tmp/foo2\nCOPY $contextenv/foo /tmp/foo3\nCOPY $contextenv/* /tmp/${contextenv}/\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_copy_root_multistage",
    "content": "FROM busybox:1.31\nCOPY context/foo foo\n\nFROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a\nCOPY / /foo\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_copy_same_file_many_times",
    "content": "FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\nCOPY context/foo /foo\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_copy_symlink",
    "content": "FROM busybox as t\nRUN mkdir temp\nRUN echo \"hello\" > temp/target\nRUN ln -s target temp/link\n## Relative link with paths\nRUN mkdir workdir && cd workdir && ln -s ../temp/target relative_link\n\nFROM scratch\nCOPY --from=t temp/ dest/\nCOPY --from=t /workdir/relative_link /workdirAnother/"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_copyadd_chmod",
    "content": "FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a\n\nADD --chmod=0666 context/foo /file666\nADD --chmod=777 context/qux /dir777\n\n# ADD tests\n# simple file\nRUN test \"$(stat -c \"%a\" /file666)\" = \"666\"\n\n# recurive dir\nRUN test \"$(stat -c \"%a\" /dir777/qup)\" = \"777\"\nRUN test \"$(stat -c \"%a\" /dir777/quw/que)\" = \"777\"\n\n# COPY tests\n\nCOPY --chmod=0755 context/foo /copyfile755\nCOPY --chmod=755 context/qux /copydir755\n\nRUN test \"$(stat -c \"%a\" /copyfile755)\" = \"755\"\n\nRUN test \"$(stat -c \"%a\" /copydir755/qup)\" = \"755\"\nRUN test \"$(stat -c \"%a\" /copydir755/quw/que)\" = \"755\"\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_daemons",
    "content": "FROM busybox\nRUN (while true; do sleep 10; dd if=/dev/zero of=file`date +%s`.txt count=16000 bs=256  > /dev/null 2>&1; done &); sleep 1\nRUN echo \"wait a second...\" && sleep 2 && ls -lrat file*.txt || echo \"test passed.\"\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_dangling_symlink",
    "content": "FROM busybox:latest@sha256:b26cd013274a657b86e706210ddd5cc1f82f50155791199d29b9e86e935ce135\nRUN [\"/bin/ln\", \"-s\", \"nowhere\", \"/link\"]\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_deleted_file_cached",
    "content": "FROM alpine\n\nRUN mkdir -p /some/dir/ && echo 'first' > /some/dir/first.txt\n\nRUN rm /some/dir/first.txt\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_dockerignore",
    "content": "# This dockerfile makes sure the .dockerignore is working\n# If so then ignore/foo should copy to /foo\n# If not, then this image won't build because it will attempt to copy three files to /foo, which is a file not a directory\nFROM scratch as base\nCOPY ignore/* /foo\n\nFrom base as first\nCOPY --from=base /foo ignore/bar\n\n# Make sure that .dockerignore also applies for later stages\nFROM scratch as base2\nCOPY ignore/* /foo\n\nFrom base2 as second\nCOPY --from=base2 /foo ignore/bar\n\nFROM scratch\nCOPY --from=first ignore/* /fooAnother/\nCOPY --from=second ignore/* /fooAnother2/\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_env",
    "content": "FROM debian:10.13\nENV hey hey\nENV PATH /usr/local\nENV testmultipleeq=\"this=is a=test string=with a=lot of=equals\"\nENV hey hello\nENV first=foo second=foo2\nENV third $second:/third\nENV myName=\"John Doe\" myDog=Rex\\ The\\ Dog \\\n    myCat=fluffy\nENV PATH something\nENV test=value\\ value2\nENV test1=\"a'b'c\"\nENV test2='a\"b\"c'\nENV test3=a\\ b name2=b\\ c\nENV test4=\"a\\\"b\"\nENV test5='a\\\"b'\nENV test6=\"a\\'b\"\nENV atomic=one\nENV atomic=two newatomic=$atomic\nENV newenv=$doesntexist/newenv\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_expose",
    "content": "FROM debian:10.13\nEXPOSE 80\nEXPOSE 81/udp\nENV protocol tcp\nEXPOSE 82/$protocol\nENV port 83\nEXPOSE $port/udp\nEXPOSE $port/$protocol\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_extract_fs",
    "content": "# Copyright 2018 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nFROM debian:10.13\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_extraction",
    "content": "# Tests extraction of symlink, hardlink and regular files to a path that is a non-empty directory\nFROM gcr.io/kaniko-test/extraction-base-image:latest\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_from_multistage_capital",
    "content": "FROM alpine as base_stage\n\nRUN echo base_stage\n\n\nFROM base_stage as BUG_stage\n\nRUN echo BUG_stage\n\n\nFROM BUG_stage as final_stage\n\nRUN echo final_stage\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_hardlink",
    "content": "FROM composer@sha256:4598feb4b58b4370893a29cbc654afa9420b4debed1d574531514b78a24cd608 AS composer\nFROM php@sha256:13813f20fec7ded7bf3a4305ea0ccd4df3cea900e263f7f86c3d5737f86669eb\nCOPY --from=composer /usr/bin/composer /usr/bin/composer\n\n# make sure hardlink extracts correctly\nFROM jboss/base-jdk@sha256:138591422fdab93a5844c13f6cbcc685631b37a16503675e9f340d2503617a41\n\nFROM gcr.io/kaniko-test/hardlink-base:latest\nRUN ls -al /usr/libexec/git-core/git /usr/bin/git /usr/libexec/git-core/git-diff\nRUN stat /usr/bin/git\nRUN stat /usr/libexec/git-core/git\nRUN git --version > /git-version\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_ignore",
    "content": "FROM scratch\nCOPY . .\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_issue_1039",
    "content": "FROM registry.access.redhat.com/ubi7/ubi:7.7-214\n\n# Install GCC, GCC-C++ and make libraries for build environment\n# Then clean caches\nRUN yum --disableplugin=subscription-manager update -y \\\n    && yum --disableplugin=subscription-manager install -y \\\n        gcc-4.8.5-39.el7 \\\n        gcc-c++-4.8.5-39.el7 \\\n        make-3.82-24.el7 \\\n    && yum --disableplugin=subscription-manager clean all\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_issue_1837",
    "content": "FROM registry.access.redhat.com/ubi8/ubi:8.2 AS base\n# Install ping\nRUN yum --disableplugin=subscription-manager install -y iputils\nRUN setcap cap_net_raw+ep /bin/ping || exit 1\n\nFROM base\nRUN [ ! -z \"$(getcap /bin/ping)\" ] || exit 1\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_issue_2049",
    "content": "FROM debian:bullseye-20220328\n\nRUN set -x; \\\n    apt-get update && \\\n    apt-get install -y curl openssh-client gnupg gpg-agent git make && \\\n    rm -rf /var/lib/apt/lists/*"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_issue_2066",
    "content": "FROM ubuntu:focal as base\nRUN apt update\nRUN apt install -y libbsd0\nRUN apt remove -y libbsd0\nRUN apt install -y libbsd0\nRUN ls -al /usr/lib/x86_64-linux-gnu/libbsd.so.0\n\nFROM base as b\n# Fails on main@28432d3c before #2066, the symlink is not existing here.\nRUN ls -al /usr/lib/x86_64-linux-gnu/libbsd.so.0\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_issue_519",
    "content": "FROM alpine as base_stage\nRUN echo base_stage\nRUN touch meow.txt\n\nFROM base_stage as BUG_stage\nRUN echo BUG_stage\nRUN touch purr.txt\n\n\nFROM BUG_stage as final_stage\nRUN echo final_stage\nRUN touch mew.txt\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_issue_647",
    "content": "FROM alpine:3.8 AS foo\nRUN mkdir /foo\nWORKDIR /foo\nRUN mkdir some_dir\nRUN touch some_file\nRUN chmod 777 some_dir\nRUN chmod 666 some_file\nRUN ls -l\n\nFROM alpine:3.8\nCOPY --from=foo /foo /bar\nRUN ls -l /bar\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_issue_684",
    "content": "# ubuntu:bionic-20200219\nFROM ubuntu@sha256:04d48df82c938587820d7b6006f5071dbbffceb7ca01d2814f81857c631d44df as builder\n\nRUN apt-get update && apt-get -y upgrade && apt-get -y install lib32stdc++6 wget\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_issue_704",
    "content": "FROM alpine\n\nRUN mkdir -p /some/dir/ && echo 'first' > /some/dir/first.txt\n\nRUN rm /some/dir/first.txt\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_label",
    "content": "FROM debian:10.13\nLABEL foo=bar\nLABEL \"baz\"=\"bat\"\nENV label1 \"mylabel\"\nLABEL label1=$label1\nLABEL multilabel1=multilabel1 multilabel2=multilabel2 multilabel3=multilabel3\n\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_maintainer",
    "content": "FROM scratch\nMAINTAINER nobody@domain.test\n# Add a file to the image to work around https://github.com/moby/moby/issues/38039\nCOPY context/foo /foo\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_meta_arg",
    "content": "ARG REGISTRY=docker.io\nARG IMAGE=debian\nARG TAG=9.11\nARG WORD=hello\nARG W0RD2=hey\n\nFROM ${REGISTRY}/${IMAGE}:${TAG} as stage1\n\n# Should evaluate WORD and create /tmp/hello\nARG WORD\nRUN touch /${WORD}\n\nFROM ${REGISTRY}/${IMAGE}:${TAG}\n\nCOPY --from=stage1 /hello /tmp\n\n# /tmp/hey should not get created without the ARG statement\n# Use -d 0 to force a time change because of stat resolution\nRUN touch -d 0 /tmp/${WORD2}\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_metadata",
    "content": "FROM debian:10.2\nCMD [\"command\", \"one\"]\nCMD [\"command\", \"two\"]\nCMD echo \"hello\"\n\nENTRYPOINT [\"execute\", \"something\"]\nENTRYPOINT [\"execute\", \"entrypoint\"]\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_multistage",
    "content": "FROM debian:10.13 as base\nCOPY . .\n\nFROM scratch as second\nENV foopath context/foo\nCOPY --from=0 $foopath context/b* /foo/\n\nFROM second as third\nCOPY --from=base /context/foo /new/foo\n\nFROM base as fourth\n# Make sure that we snapshot intermediate images correctly\nRUN date > /date\nENV foo bar\n\n# This base image contains symlinks with relative paths to ignored directories\n# We need to test they're extracted correctly\nFROM fedora@sha256:c4cc32b09c6ae3f1353e7e33a8dda93dc41676b923d6d89afa996b421cc5aa48\n\nFROM fourth\nARG file\nCOPY --from=second /foo ${file}\nCOPY --from=debian:10.13 /etc/os-release /new\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_multistage_args_issue_1911",
    "content": "ARG OTHER=\"fix\"\nFROM alpine:latest as base\nARG NAME=\"base\"\nRUN echo \"base:: $NAME\" >> A.txt\n\nFROM base AS base-dev\nARG NAME=\"$NAME-dev\"\nRUN echo \"dev:: $NAME\" >> B.txt\n\nFROM base-dev as base-custom\nARG NAME\nRUN echo \"custom:: $NAME\" >> C.txt\nRUN echo \"custom:: $OTHER\" >> C.txt\n\nFROM base-custom as base-custom2\nARG OTHER\nRUN echo \"custom:: $NAME\" >> D.txt\nRUN echo \"custom:: $OTHER\" >> D.txt"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_mv_add",
    "content": "FROM busybox@sha256:1bd6df27274fef1dd36eb529d0f4c8033f61c675d6b04213dd913f902f7cafb5\nADD context/tars /tmp/tars\nRUN stat /bin/sh\nRUN mv /tmp/tars /foo\nRUN echo \"hi\"\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_onbuild",
    "content": "FROM gcr.io/kaniko-test/onbuild-base:latest\nCOPY context/foo foo\nENV dir /new/workdir/\nARG file\nONBUILD RUN echo \"onbuild\" > $file\nONBUILD RUN echo \"onbuild 2\" > ${dir}\nONBUILD WORKDIR /new/workdir\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_parent_dir_perms",
    "content": "FROM busybox\n\nRUN adduser --disabled-password --gecos \"\" --uid 1000 user\nRUN mkdir -p /home/user/foo\nRUN chown -R user /home/user\nRUN chmod 700 /home/user/foo\nADD https://raw.githubusercontent.com/GoogleContainerTools/kaniko/master/README.md /home/user/foo/README.md\nRUN chown -R user /home/user\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_registry",
    "content": "FROM busybox@sha256:1bd6df27274fef1dd36eb529d0f4c8033f61c675d6b04213dd913f902f7cafb5\nRUN echo \"hey\" > /hey\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_replaced_hardlinks",
    "content": "FROM jboss/base-jdk@sha256:70d956f632c26d1f1df57cbb99870a6141cfe470de0eb2d51bccd44929df9367\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_replaced_symlinks",
    "content": "FROM alpine@sha256:ab00606a42621fb68f2ed6ad3c88be54397f981a7b70a79db3d1172b11c4367d\nRUN pwd\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_run",
    "content": "# Copyright 2018 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nFROM debian:10.13\nRUN echo \"hey\" > /etc/foo\nRUN echo \"baz\" > /etc/baz\nRUN cp /etc/baz /etc/bar\nRUN rm /etc/baz\n\n# Test with ARG\nARG file\nRUN echo \"run\" > $file\n\nRUN echo \"test home\" > $HOME/file\nCOPY context/foo $HOME/foo\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_run_2",
    "content": "# Copyright 2018 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Test to make sure the executor builds an image correctly\n# when no files are changed\n\nFROM debian:10.13\nRUN echo \"hey\" \nMAINTAINER kaniko\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_run_new",
    "content": "# Copyright 2020 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nFROM debian:10.13\nRUN echo \"hey\" > /etc/foo\nRUN echo \"baz\" > /etc/baz\nRUN cp /etc/baz /etc/bar\nRUN rm /etc/baz\n\n# Test with ARG\nARG file\nRUN echo \"run\" > $file\n\nRUN echo \"test home\" > $HOME/file\nCOPY context/foo $HOME/foo\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_run_redo",
    "content": "# Copyright 2020 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nFROM debian:10.13\nRUN echo \"hey\" > /etc/foo\nRUN echo \"baz\" > /etc/baz\nRUN cp /etc/baz /etc/bar\nRUN rm /etc/baz\n\n# Test with ARG\nARG file\nRUN echo \"run\" > $file\n\nRUN echo \"test home\" > $HOME/file\nCOPY context/foo $HOME/foo\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_scratch",
    "content": "ARG image\nFROM ${image}\n# First, make sure simple arg replacement works\nARG file\nCOPY $file /foo\n# Check that setting a default value works\nARG file2=context/bar/bat\nCOPY $file2 /bat\n# Check that overriding a default value works\nENV baz baz\nENV src file3\nARG ${src}=context/bar/${baz}\nCOPY $file3 /baz\n# Check that setting an ENV will override the ARG\nENV file context/bar/bam/bat\nCOPY $file /env \n\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_snapshotter_ignorelist",
    "content": "FROM alpine@sha256:def822f9851ca422481ec6fee59a9966f12b351c62ccb9aca841526ffaa9f748\nRUN ln -s /dev/null /hello"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_target",
    "content": "FROM gcr.io/distroless/base:latest as base\nCOPY . .\n\nFROM scratch as second\nENV foopath context/foo\nCOPY --from=0 $foopath context/b* /foo/\n\nFROM base\nARG file\nCOPY --from=second /foo $file\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_user",
    "content": "# Copyright 2018 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nFROM debian:10.13\nUSER testuser:testgroup\n\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_user_home",
    "content": "# Copyright 2020 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nFROM debian:10.13\n\n# default values for the root user.\nRUN touch $HOME/hello\n\n# testuser1 with the default home created by useradd.\n\nRUN groupadd testgroup && \\\n    useradd --create-home --gid testgroup alice && \\\n    useradd --create-home --uid 1111 --home-dir /home/john --gid testgroup bob\n\nUSER alice:testgroup\nRUN touch $HOME/hello\n\nUSER bob\nRUN touch $HOME/hello\n\nUSER root\n\nUSER 1111\nRUN touch $HOME/world\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_user_nonexisting",
    "content": "# Copyright 2018 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nFROM debian:10.13\nUSER 1001:1001\nRUN echo \"hey2\" > /tmp/foo\nUSER 1001\nRUN echo \"hello\" > /tmp/foobar\n\n# With existing group\nUSER root\nRUN groupadd testgroup\nUSER 1001:testgroup\nRUN echo \"hello\" > /tmp/foobar\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_user_run",
    "content": "# Copyright 2018 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nFROM debian:10.13\nRUN useradd testuser\nRUN groupadd testgroup\nUSER testuser:testgroup\nRUN echo \"hey\" > /tmp/foo\nUSER testuser:1001\nRUN echo \"hey2\" >> /tmp/foo\n\nUSER root\nRUN echo \"hi\" > $HOME/file\nCOPY context/foo $HOME/foo\n\nRUN useradd -ms /bin/bash newuser\nUSER newuser\nRUN echo \"hi\" > $HOME/file\nCOPY context/foo $HOME/foo\n\nUSER 1001\nRUN echo $HOME\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_volume",
    "content": "FROM debian:10.13\nRUN mkdir /foo\nRUN echo \"hello\" > /foo/hey\nVOLUME /foo/bar /tmp /qux/quux\nENV VOL /baz/bat\nVOLUME [\"${VOL}\"]\nRUN echo \"hello again\" > /tmp/hey\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_volume_2",
    "content": "FROM debian:10.13\nVOLUME /foo1\nRUN echo \"hello\" > /foo1/hello\nWORKDIR /foo1/bar\nADD context/foo /foo1/foo\nCOPY context/foo /foo1/foo2\nRUN mkdir /bar1\nVOLUME /foo2\nVOLUME /foo3\nRUN echo \"bar2\"\nVOLUME /foo4\nRUN mkdir /bar3\nVOLUME /foo5\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_volume_3",
    "content": "FROM scratch as one\nVOLUME /vol\n\nFROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a as two\nRUN mkdir /vol && echo hey > /vol/foo"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_volume_4",
    "content": "FROM rabbitmq@sha256:57b028a4bb9592ece3915e3e9cdbbaecb3eb82b753aaaf5250f8d25d81d318e2\n# This base image has a volume declared at /var/lib/rabbitmq\n# This is important because it should not exist in the child image.\nCOPY context/foo /usr/local/bin/\nCMD [\"script.sh\"]\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_whitelist",
    "content": "# Make sure that whitelisting (specifically, filepath.SkipDir) works correctly, and that /var/test/testfile and\n# /etc/test/testfile end up in the final image\n\nFROM debian@sha256:38236c068c393272ad02db100e09cac36a5465149e2924a035ee60d6c60c38fe\n\nRUN mkdir -p /var/test \\\n    && mkdir -p /etc/test \\\n    && touch /var/test/testfile \\\n    && touch /etc/test/testfile \\\n    && ls -lah /var/test \\\n    && ls -lah /etc/test;\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_workdir",
    "content": "FROM debian:10.13\nCOPY context/foo foo\nWORKDIR test\n# Test that this will be appended on to the previous command, to create /test/workdir\nWORKDIR workdir \nCOPY context/foo ./currentfoo\n# Test that the RUN command will happen in the correct directory\nRUN cp currentfoo newfoo\nWORKDIR /new/dir\nENV dir /another/new/dir\nWORKDIR $dir/newdir\nWORKDIR $dir/$doesntexist\nWORKDIR /\n\n# Test with ARG\nARG workdir\nWORKDIR $workdir\n"
  },
  {
    "path": "integration/dockerfiles/Dockerfile_test_workdir_with_user",
    "content": "FROM debian:10.13\nRUN groupadd -g 10000 bar\nRUN useradd -c \"Foo user\" -u 10000 -g 10000 -m foo\n\n\n# no passwd file\nFROM scratch\n\n# without a USER Set\nWORKDIR /workdir/wo/user\n\nUSER 9999\nWORKDIR /workdir/w/uid\n\nUSER 9999:9999\nWORKDIR /workdir/w/uid_gid\n\nUSER 0\nWORKDIR /workdir/w/root_uid\n\nUSER root\nWORKDIR /workdir/w/root_username\n\n# with passwd file\nCOPY --from=0 /etc/passwd /etc/passwd\nCOPY --from=0 /etc/group /etc/group\n\nUSER foo\nWORKDIR /workdir/w/foo_username\n\nUSER foo:10000\nWORKDIR /workdir/w/foo_username_gid\n\nUSER 10000\nWORKDIR /workdir/w/foo_uid\n\nUSER 10000:10000\nWORKDIR /workdir/w/foo_uid_gid\n\nUSER 10000:bar\nWORKDIR /workdir/w/foo_uid_groupname\n"
  },
  {
    "path": "integration/dockerfiles/TestReplaceFolderWithFile",
    "content": "# Not prefixed Dockerfile_test to exclude it from TestRun()\nFROM busybox\n\nRUN mkdir /a /b /c && echo a > /a/d\nRUN rm -r /a && echo \"foo\" > /a"
  },
  {
    "path": "integration/dockerfiles/TestReplaceFolderWithLink",
    "content": "# Not prefixed Dockerfile_test to exclude it from TestRun()\nFROM busybox\n\nRUN mkdir /a /b /c && echo a > /a/d\nRUN rm -r /a && ln -sf /b /a"
  },
  {
    "path": "integration/dockerfiles-with-context/issue-1020/Dockerfile",
    "content": "# Copyright 2020 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nFROM atomist/sdm-base:0.4.1\n\nCOPY package.json package-lock.json ./\nRUN npm ci \\\n    && npm cache clean --force\n\nCOPY . ./\n\nUSER atomist:atomist\n"
  },
  {
    "path": "integration/dockerfiles-with-context/issue-1020/package.json",
    "content": "{\n  \"name\": \"foo\",\n  \"version\": \"2.0.0\",\n  \"description\": \"Don't forget to sanitize your inputs\",\n  \"author\": \"Little Bobby Tables\",\n  \"private\": false,\n  \"devDependencies\": {},\n  \"scripts\": {},\n  \"license\": \"MIT\",\n  \"dependencies\": {}\n}\n"
  },
  {
    "path": "integration/dockerfiles-with-context/issue-1315/Dockerfile",
    "content": "# Copyright 2021 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nFROM alpine:3.11 as builder\n\nRUN mkdir -p /myapp/somedir \\\n && touch /myapp/somedir/somefile \\\n && chown 123:123 /myapp/somedir \\\n && chown 321:321 /myapp/somedir/somefile\n\nFROM alpine:3.11\nCOPY --from=builder /myapp /myapp\nRUN printf \"%s\\n\" \\\n      \"0 0 /myapp/\" \\\n      \"123 123 /myapp/somedir\" \\\n      \"321 321 /myapp/somedir/somefile\" \\\n      > /tmp/expected \\\n && stat -c \"%u %g %n\" \\\n      /myapp/ \\\n      /myapp/somedir \\\n      /myapp/somedir/somefile \\\n      > /tmp/got \\\n && diff -u /tmp/got /tmp/expected\n"
  },
  {
    "path": "integration/dockerfiles-with-context/issue-2075/Dockerfile",
    "content": "# Copyright 2022 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nFROM docker.io/debian:bullseye-slim as base\nFROM base as build\nCOPY [\"top1\", \"/tmp/top1\"]\nRUN \\\n  set -eu; \\\n  cp /tmp/top1 /usr/local/bin/top1; \\\n  chown root:root /usr/local/bin/top1; \\\n  chmod u=rxs,go=rx /usr/local/bin/top1; \\\n  ls -lh /usr/local/bin/top1\nFROM base as final\nCOPY --from=build [\"/usr/local/bin/top1\", \"/usr/local/bin/\"]\nRUN [ -u /usr/local/bin/top1 ]\nLABEL \\\n  description=\"Testing setuid behavior in Kaniko\"\n"
  },
  {
    "path": "integration/dockerfiles-with-context/issue-57/Dockerfile",
    "content": "# Copyright 2020 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nFROM busybox\n\nRUN addgroup -g 1001 -S appgroup \\\n  && adduser -u 1005 -S al -G appgroup \\\n  && adduser -u 1004 -S bob -G appgroup\n\n# Add local file with and without chown\nADD --chown=1005:appgroup a.txt /a.txt\nRUN [ \"$(ls -ln /a.txt | tr -s ' ' | cut -d' ' -f 3)\" = 1005 ] && \\\n  [ \"$(ls -ln /a.txt | tr -s ' ' | cut -d' ' -f 4)\" = 1001 ]\nADD b.txt /b.txt\n\n# Add remote file with and without chown\nADD --chown=bob:1001 https://raw.githubusercontent.com/GoogleContainerTools/kaniko/master/README.md /r1.txt\nRUN [ \"$(ls -ln /r1.txt | tr -s ' ' | cut -d' ' -f 3)\" = 1004 ] && \\\n  [ \"$(ls -ln /r1.txt | tr -s ' ' | cut -d' ' -f 4)\" = 1001 ]\nADD https://raw.githubusercontent.com/GoogleContainerTools/kaniko/master/README.md /r2.txt\n"
  },
  {
    "path": "integration/dockerfiles-with-context/issue-57/a.txt",
    "content": ""
  },
  {
    "path": "integration/dockerfiles-with-context/issue-57/b.txt",
    "content": ""
  },
  {
    "path": "integration/dockerfiles-with-context/issue-721/Dockerfile",
    "content": "# Copyright 2020 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nFROM alpine\n\nADD test.txt /tmp/\n"
  },
  {
    "path": "integration/dockerfiles-with-context/issue-721/test.txt",
    "content": "meow\n"
  },
  {
    "path": "integration/dockerfiles-with-context/issue-774/Dockerfile",
    "content": "# Copyright 2020 Google, Inc. All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nFROM phusion/baseimage:0.11\nADD test-file /etc/service/file\n"
  },
  {
    "path": "integration/dockerfiles-with-context/issue-774/test-file",
    "content": ""
  },
  {
    "path": "integration/ignore/bar",
    "content": ""
  },
  {
    "path": "integration/ignore/baz",
    "content": ""
  },
  {
    "path": "integration/ignore/foo",
    "content": ""
  },
  {
    "path": "integration/ignore_relative/bar",
    "content": ""
  },
  {
    "path": "integration/ignore_relative/baz",
    "content": ""
  },
  {
    "path": "integration/ignore_relative/foo",
    "content": ""
  },
  {
    "path": "integration/images.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage integration\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"cloud.google.com/go/storage\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/timing\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util/bucket\"\n)\n\nconst (\n\t// ExecutorImage is the name of the kaniko executor image\n\tExecutorImage = \"executor-image\"\n\t// WarmerImage is the name of the kaniko cache warmer image\n\tWarmerImage = \"warmer-image\"\n\n\tdockerPrefix     = \"docker-\"\n\tkanikoPrefix     = \"kaniko-\"\n\tbuildContextPath = \"/workspace\"\n\tcacheDir         = \"/workspace/cache\"\n\tbaseImageToCache = \"gcr.io/google-appengine/debian9@sha256:1d6a9a6d106bd795098f60f4abb7083626354fa6735e81743c7f8cfca11259f0\"\n)\n\n// Arguments to build Dockerfiles with, used for both docker and kaniko builds\nvar argsMap = map[string][]string{\n\t\"Dockerfile_test_run\":        {\"file=/file\"},\n\t\"Dockerfile_test_run_new\":    {\"file=/file\"},\n\t\"Dockerfile_test_run_redo\":   {\"file=/file\"},\n\t\"Dockerfile_test_workdir\":    {\"workdir=/arg/workdir\"},\n\t\"Dockerfile_test_add\":        {\"file=context/foo\"},\n\t\"Dockerfile_test_arg_secret\": {\"SSH_PRIVATE_KEY\", \"SSH_PUBLIC_KEY=Pµbl1cK€Y\"},\n\t\"Dockerfile_test_onbuild\":    {\"file=/tmp/onbuild\"},\n\t\"Dockerfile_test_scratch\": {\n\t\t\"image=scratch\",\n\t\t\"hello=hello-value\",\n\t\t\"file=context/foo\",\n\t\t\"file3=context/b*\",\n\t},\n\t\"Dockerfile_test_multistage\": {\"file=/foo2\"},\n}\n\n// Environment to build Dockerfiles with, used for both docker and kaniko builds\nvar envsMap = map[string][]string{\n\t\"Dockerfile_test_arg_secret\":    {\"SSH_PRIVATE_KEY=ThEPriv4t3Key\"},\n\t\"Dockerfile_test_copyadd_chmod\": {\"DOCKER_BUILDKIT=1\"},\n}\n\n// Arguments to build Dockerfiles with when building with docker\nvar additionalDockerFlagsMap = map[string][]string{\n\t\"Dockerfile_test_target\": {\"--target=second\"},\n}\n\n// Arguments to build Dockerfiles with when building with kaniko\nvar additionalKanikoFlagsMap = map[string][]string{\n\t\"Dockerfile_test_add\":                    {\"--single-snapshot\"},\n\t\"Dockerfile_test_run_new\":                {\"--use-new-run=true\"},\n\t\"Dockerfile_test_run_redo\":               {\"--snapshot-mode=redo\"},\n\t\"Dockerfile_test_scratch\":                {\"--single-snapshot\"},\n\t\"Dockerfile_test_maintainer\":             {\"--single-snapshot\"},\n\t\"Dockerfile_test_target\":                 {\"--target=second\"},\n\t\"Dockerfile_test_snapshotter_ignorelist\": {\"--use-new-run=true\", \"-v=trace\"},\n}\n\n// output check to do when building with kaniko\nvar outputChecks = map[string]func(string, []byte) error{\n\t\"Dockerfile_test_arg_secret\": checkArgsNotPrinted,\n\t\"Dockerfile_test_snapshotter_ignorelist\": func(_ string, out []byte) error {\n\t\tfor _, s := range []string{\n\t\t\t\"Adding whiteout for /dev\",\n\t\t} {\n\t\t\tif strings.Contains(string(out), s) {\n\t\t\t\treturn fmt.Errorf(\"output must not contain %s\", s)\n\t\t\t}\n\t\t}\n\n\t\tfor _, s := range []string{\n\t\t\t\"Resolved symlink /hello to /dev/null\",\n\t\t\t\"Path /dev/null is ignored, ignoring it\",\n\t\t} {\n\t\t\tif !strings.Contains(string(out), s) {\n\t\t\t\treturn fmt.Errorf(\"output must contain %s\", s)\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t},\n}\n\n// Checks if argument are not printed in output.\n// Argument may be passed through --build-arg key=value manner or --build-arg key with key in environment\nfunc checkArgsNotPrinted(dockerfile string, out []byte) error {\n\tfor _, arg := range argsMap[dockerfile] {\n\t\targSplitted := strings.Split(arg, \"=\")\n\t\tif len(argSplitted) == 2 {\n\t\t\tif idx := bytes.Index(out, []byte(argSplitted[1])); idx >= 0 {\n\t\t\t\treturn fmt.Errorf(\"Argument value %s for argument %s displayed in output\", argSplitted[1], argSplitted[0])\n\t\t\t}\n\t\t} else if len(argSplitted) == 1 {\n\t\t\tif envs, ok := envsMap[dockerfile]; ok {\n\t\t\t\tfor _, env := range envs {\n\t\t\t\t\tenvSplitted := strings.Split(env, \"=\")\n\t\t\t\t\tif len(envSplitted) == 2 {\n\t\t\t\t\t\tif idx := bytes.Index(out, []byte(envSplitted[1])); idx >= 0 {\n\t\t\t\t\t\t\treturn fmt.Errorf(\"Argument value %s for argument %s displayed in output\", envSplitted[1], argSplitted[0])\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nvar (\n\tbucketContextTests = []string{\"Dockerfile_test_copy_bucket\"}\n\treproducibleTests  = []string{\"Dockerfile_test_reproducible\"}\n)\n\n// GetDockerImage constructs the name of the docker image that would be built with\n// dockerfile if it was tagged with imageRepo.\nfunc GetDockerImage(imageRepo, dockerfile string) string {\n\treturn strings.ToLower(imageRepo + dockerPrefix + dockerfile)\n}\n\n// GetKanikoImage constructs the name of the kaniko image that would be built with\n// dockerfile if it was tagged with imageRepo.\nfunc GetKanikoImage(imageRepo, dockerfile string) string {\n\treturn strings.ToLower(imageRepo + kanikoPrefix + dockerfile)\n}\n\n// GetVersionedKanikoImage versions constructs the name of the kaniko image that would be built\n// with the dockerfile and versions it for cache testing\nfunc GetVersionedKanikoImage(imageRepo, dockerfile string, version int) string {\n\treturn strings.ToLower(imageRepo + kanikoPrefix + dockerfile + strconv.Itoa(version))\n}\n\n// FindDockerFiles will look for test docker files in the directory dir\n// and match the files against dockerfilesPattern.\n// If the file is one we are intentionally\n// skipping, it will not be included in the returned list.\nfunc FindDockerFiles(dir, dockerfilesPattern string) ([]string, error) {\n\tpattern := filepath.Join(dir, dockerfilesPattern)\n\tfmt.Printf(\"finding docker images with pattern %v\\n\", pattern)\n\tallDockerfiles, err := filepath.Glob(pattern)\n\tif err != nil {\n\t\treturn []string{}, fmt.Errorf(\"Failed to find docker files with pattern %s: %w\", dockerfilesPattern, err)\n\t}\n\n\tvar dockerfiles []string\n\tfor _, dockerfile := range allDockerfiles {\n\t\t// Remove the leading directory from the path\n\t\tdockerfile = dockerfile[len(\"dockerfiles/\"):]\n\t\tdockerfiles = append(dockerfiles, dockerfile)\n\n\t}\n\treturn dockerfiles, err\n}\n\n// DockerFileBuilder knows how to build docker files using both Kaniko and Docker and\n// keeps track of which files have been built.\ntype DockerFileBuilder struct {\n\t// Holds all available docker files and whether or not they've been built\n\tfilesBuilt              map[string]struct{}\n\tDockerfilesToIgnore     map[string]struct{}\n\tTestCacheDockerfiles    map[string]struct{}\n\tTestOCICacheDockerfiles map[string]struct{}\n}\n\ntype logger func(string, ...interface{})\n\n// NewDockerFileBuilder will create a DockerFileBuilder initialized with dockerfiles, which\n// it will assume are all as yet unbuilt.\nfunc NewDockerFileBuilder() *DockerFileBuilder {\n\td := DockerFileBuilder{\n\t\tfilesBuilt: map[string]struct{}{},\n\t}\n\td.DockerfilesToIgnore = map[string]struct{}{\n\t\t\"Dockerfile_test_add_404\": {},\n\t\t// TODO: remove test_user_run from this when https://github.com/GoogleContainerTools/container-diff/issues/237 is fixed\n\t\t\"Dockerfile_test_user_run\": {},\n\t\t// TODO: All the below tests are fialing with errro\n\t\t// You don't have the needed permissions to perform this operation, and you may have invalid credentials.\n\t\t// To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication\n\t\t\"Dockerfile_test_onbuild\":    {},\n\t\t\"Dockerfile_test_extraction\": {},\n\t\t\"Dockerfile_test_hardlink\":   {},\n\t}\n\td.TestCacheDockerfiles = map[string]struct{}{\n\t\t\"Dockerfile_test_cache\":         {},\n\t\t\"Dockerfile_test_cache_install\": {},\n\t\t\"Dockerfile_test_cache_perm\":    {},\n\t\t\"Dockerfile_test_cache_copy\":    {},\n\t}\n\td.TestOCICacheDockerfiles = map[string]struct{}{\n\t\t\"Dockerfile_test_cache_oci\":         {},\n\t\t\"Dockerfile_test_cache_install_oci\": {},\n\t\t\"Dockerfile_test_cache_perm_oci\":    {},\n\t\t\"Dockerfile_test_cache_copy_oci\":    {},\n\t}\n\treturn &d\n}\n\nfunc addServiceAccountFlags(flags []string, serviceAccount string) []string {\n\tif len(serviceAccount) > 0 {\n\t\tflags = append(flags, \"-e\",\n\t\t\t\"GOOGLE_APPLICATION_CREDENTIALS=/secret/\"+filepath.Base(serviceAccount),\n\t\t\t\"-v\", filepath.Dir(serviceAccount)+\":/secret/\")\n\t} else {\n\t\tgcloudConfig := os.Getenv(\"HOME\") + \"/.config/gcloud\"\n\t\tif util.FilepathExists(gcloudConfig) {\n\t\t\tflags = append(flags, \"-v\", gcloudConfig+\":/root/.config/gcloud\")\n\t\t}\n\n\t\tdockerConfig := os.Getenv(\"HOME\") + \"/.docker/config.json\"\n\t\tif util.FilepathExists(dockerConfig) {\n\t\t\tflags = append(flags, \"-v\", dockerConfig+\":/root/.docker/config.json\", \"-e\", \"DOCKER_CONFIG=/root/.docker\")\n\t\t}\n\t}\n\treturn flags\n}\n\nfunc (d *DockerFileBuilder) BuildDockerImage(t *testing.T, imageRepo, dockerfilesPath, dockerfile, contextDir string) error {\n\tt.Logf(\"Building image for Dockerfile %s\\n\", dockerfile)\n\n\tvar buildArgs []string\n\tbuildArgFlag := \"--build-arg\"\n\tfor _, arg := range argsMap[dockerfile] {\n\t\tbuildArgs = append(buildArgs, buildArgFlag, arg)\n\t}\n\n\t// build docker image\n\tadditionalFlags := append(buildArgs, additionalDockerFlagsMap[dockerfile]...)\n\tdockerImage := strings.ToLower(imageRepo + dockerPrefix + dockerfile)\n\n\tdockerArgs := []string{\n\t\t\"build\",\n\t\t\"--no-cache\",\n\t\t\"-t\", dockerImage,\n\t}\n\n\tif dockerfilesPath != \"\" {\n\t\tdockerArgs = append(dockerArgs, \"-f\", path.Join(dockerfilesPath, dockerfile))\n\t}\n\n\tdockerArgs = append(dockerArgs, contextDir)\n\tdockerArgs = append(dockerArgs, additionalFlags...)\n\n\tdockerCmd := exec.Command(\"docker\", dockerArgs...)\n\tif env, ok := envsMap[dockerfile]; ok {\n\t\tdockerCmd.Env = append(dockerCmd.Env, env...)\n\t}\n\n\tout, err := RunCommandWithoutTest(dockerCmd)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"Failed to build image %s with docker command \\\"%s\\\": %w %s\", dockerImage, dockerCmd.Args, err, string(out))\n\t}\n\tt.Logf(\"Build image for Dockerfile %s as %s. docker build output: %s \\n\", dockerfile, dockerImage, out)\n\treturn nil\n}\n\n// BuildImage will build dockerfile (located at dockerfilesPath) using both kaniko and docker.\n// The resulting image will be tagged with imageRepo. If the dockerfile will be built with\n// context (i.e. it is in `buildContextTests`) the context will be pulled from gcsBucket.\nfunc (d *DockerFileBuilder) BuildImage(t *testing.T, config *integrationTestConfig, dockerfilesPath, dockerfile string) error {\n\t_, ex, _, _ := runtime.Caller(0)\n\tcwd := filepath.Dir(ex)\n\n\treturn d.BuildImageWithContext(t, config, dockerfilesPath, dockerfile, cwd)\n}\n\nfunc (d *DockerFileBuilder) BuildImageWithContext(t *testing.T, config *integrationTestConfig, dockerfilesPath, dockerfile, contextDir string) error {\n\tif _, present := d.filesBuilt[dockerfile]; present {\n\t\treturn nil\n\t}\n\tgcsBucket, gcsClient, serviceAccount, imageRepo := config.gcsBucket, config.gcsClient, config.serviceAccount, config.imageRepo\n\n\tvar buildArgs []string\n\tbuildArgFlag := \"--build-arg\"\n\tfor _, arg := range argsMap[dockerfile] {\n\t\tbuildArgs = append(buildArgs, buildArgFlag, arg)\n\t}\n\n\ttimer := timing.Start(dockerfile + \"_docker\")\n\tif err := d.BuildDockerImage(t, imageRepo, dockerfilesPath, dockerfile, contextDir); err != nil {\n\t\treturn err\n\t}\n\n\ttiming.DefaultRun.Stop(timer)\n\n\tcontextFlag := \"-c\"\n\tcontextPath := buildContextPath\n\tfor _, d := range bucketContextTests {\n\t\tif d == dockerfile {\n\t\t\tcontextFlag = \"-b\"\n\t\t\tcontextPath = gcsBucket\n\t\t}\n\t}\n\n\tadditionalKanikoFlags := additionalKanikoFlagsMap[dockerfile]\n\tadditionalKanikoFlags = append(additionalKanikoFlags, contextFlag, contextPath)\n\tfor _, d := range reproducibleTests {\n\t\tif d == dockerfile {\n\t\t\tadditionalKanikoFlags = append(additionalKanikoFlags, \"--reproducible\")\n\t\t\tbreak\n\t\t}\n\t}\n\n\tkanikoImage := GetKanikoImage(imageRepo, dockerfile)\n\ttimer = timing.Start(dockerfile + \"_kaniko\")\n\tif _, err := buildKanikoImage(t.Logf, dockerfilesPath, dockerfile, buildArgs, additionalKanikoFlags, kanikoImage,\n\t\tcontextDir, gcsBucket, gcsClient, serviceAccount, true); err != nil {\n\t\treturn err\n\t}\n\ttiming.DefaultRun.Stop(timer)\n\n\td.filesBuilt[dockerfile] = struct{}{}\n\n\treturn nil\n}\n\nfunc populateVolumeCache() error {\n\t_, ex, _, _ := runtime.Caller(0)\n\tcwd := filepath.Dir(ex)\n\twarmerCmd := exec.Command(\"docker\",\n\t\tappend([]string{\n\t\t\t\"run\", \"--net=host\",\n\t\t\t\"-d\",\n\t\t\t\"-v\", os.Getenv(\"HOME\") + \"/.config/gcloud:/root/.config/gcloud\",\n\t\t\t\"-v\", cwd + \":/workspace\",\n\t\t\tWarmerImage,\n\t\t\t\"-c\", cacheDir,\n\t\t\t\"-i\", baseImageToCache,\n\t\t},\n\t\t)...,\n\t)\n\n\tif _, err := RunCommandWithoutTest(warmerCmd); err != nil {\n\t\treturn fmt.Errorf(\"Failed to warm kaniko cache: %w\", err)\n\t}\n\n\treturn nil\n}\n\n// buildCachedImage builds the image for testing caching via kaniko where version is the nth time this image has been built\nfunc (d *DockerFileBuilder) buildCachedImage(config *integrationTestConfig, cacheRepo, dockerfilesPath, dockerfile string, version int, args []string) error {\n\timageRepo, serviceAccount := config.imageRepo, config.serviceAccount\n\t_, ex, _, _ := runtime.Caller(0)\n\tcwd := filepath.Dir(ex)\n\n\tcacheFlag := \"--cache=true\"\n\n\tbenchmarkEnv := \"BENCHMARK_FILE=false\"\n\tif b, err := strconv.ParseBool(os.Getenv(\"BENCHMARK\")); err == nil && b {\n\t\tos.Mkdir(\"benchmarks\", 0o755)\n\t\tbenchmarkEnv = \"BENCHMARK_FILE=/workspace/benchmarks/\" + dockerfile\n\t}\n\tkanikoImage := GetVersionedKanikoImage(imageRepo, dockerfile, version)\n\n\tdockerRunFlags := []string{\n\t\t\"run\", \"--net=host\",\n\t\t\"-v\", cwd + \":/workspace\",\n\t\t\"-e\", benchmarkEnv,\n\t}\n\tdockerRunFlags = addServiceAccountFlags(dockerRunFlags, serviceAccount)\n\tdockerRunFlags = append(dockerRunFlags, ExecutorImage,\n\t\t\"-f\", path.Join(buildContextPath, dockerfilesPath, dockerfile),\n\t\t\"-d\", kanikoImage,\n\t\t\"-c\", buildContextPath,\n\t\tcacheFlag,\n\t\t\"--cache-repo\", cacheRepo,\n\t\t\"--cache-dir\", cacheDir)\n\tfor _, v := range args {\n\t\tdockerRunFlags = append(dockerRunFlags, v)\n\t}\n\tkanikoCmd := exec.Command(\"docker\", dockerRunFlags...)\n\n\t_, err := RunCommandWithoutTest(kanikoCmd)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"Failed to build cached image %s with kaniko command \\\"%s\\\": %w\", kanikoImage, kanikoCmd.Args, err)\n\t}\n\treturn nil\n}\n\n// buildRelativePathsImage builds the images for testing passing relatives paths to Kaniko\nfunc (d *DockerFileBuilder) buildRelativePathsImage(imageRepo, dockerfile, serviceAccount, buildContextPath string) error {\n\t_, ex, _, _ := runtime.Caller(0)\n\tcwd := filepath.Dir(ex)\n\n\tdockerImage := GetDockerImage(imageRepo, \"test_relative_\"+dockerfile)\n\tkanikoImage := GetKanikoImage(imageRepo, \"test_relative_\"+dockerfile)\n\n\tdockerCmd := exec.Command(\"docker\",\n\t\tappend([]string{\n\t\t\t\"build\",\n\t\t\t\"-t\", dockerImage,\n\t\t\t\"-f\", dockerfile,\n\t\t\t\"./context\",\n\t\t},\n\t\t)...,\n\t)\n\n\ttimer := timing.Start(dockerfile + \"_docker\")\n\tout, err := RunCommandWithoutTest(dockerCmd)\n\ttiming.DefaultRun.Stop(timer)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"Failed to build image %s with docker command \\\"%s\\\": %w %s\", dockerImage, dockerCmd.Args, err, string(out))\n\t}\n\n\tdockerRunFlags := []string{\"run\", \"--net=host\", \"-v\", cwd + \":/workspace\"}\n\tdockerRunFlags = addServiceAccountFlags(dockerRunFlags, serviceAccount)\n\tdockerRunFlags = append(dockerRunFlags, ExecutorImage,\n\t\t\"-f\", dockerfile,\n\t\t\"-d\", kanikoImage,\n\t\t\"-c\", buildContextPath)\n\n\tkanikoCmd := exec.Command(\"docker\", dockerRunFlags...)\n\n\ttimer = timing.Start(dockerfile + \"_kaniko_relative_paths\")\n\tout, err = RunCommandWithoutTest(kanikoCmd)\n\ttiming.DefaultRun.Stop(timer)\n\n\tif err != nil {\n\t\treturn fmt.Errorf(\n\t\t\t\"Failed to build relative path image %s with kaniko command \\\"%s\\\": %w\\n%s\",\n\t\t\tkanikoImage, kanikoCmd.Args, err, string(out))\n\t}\n\n\treturn nil\n}\n\nfunc buildKanikoImage(\n\tlogf logger,\n\tdockerfilesPath string,\n\tdockerfile string,\n\tbuildArgs []string,\n\tkanikoArgs []string,\n\tkanikoImage string,\n\tcontextDir string,\n\tgcsBucket string,\n\tgcsClient *storage.Client,\n\tserviceAccount string,\n\tshdUpload bool,\n) (string, error) {\n\tbenchmarkEnv := \"BENCHMARK_FILE=false\"\n\tbenchmarkDir, err := os.MkdirTemp(\"\", \"\")\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif b, err := strconv.ParseBool(os.Getenv(\"BENCHMARK\")); err == nil && b {\n\t\tbenchmarkEnv = \"BENCHMARK_FILE=/kaniko/benchmarks/\" + dockerfile\n\t\tif shdUpload {\n\t\t\tbenchmarkFile := path.Join(benchmarkDir, dockerfile)\n\t\t\tfileName := fmt.Sprintf(\"run_%s_%s\", time.Now().Format(\"2006-01-02-15:04\"), dockerfile)\n\t\t\tdst := path.Join(\"benchmarks\", fileName)\n\t\t\tfile, err := os.Open(benchmarkFile)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t\tdefer bucket.Upload(context.Background(), gcsBucket, dst, file, gcsClient)\n\t\t}\n\t}\n\n\t// build kaniko image\n\tadditionalFlags := append(buildArgs, kanikoArgs...)\n\tlogf(\"Going to build image with kaniko: %s, flags: %s \\n\", kanikoImage, additionalFlags)\n\n\tdockerRunFlags := []string{\n\t\t\"run\", \"--net=host\",\n\t\t\"-e\", benchmarkEnv,\n\t\t\"-v\", contextDir + \":/workspace\",\n\t\t\"-v\", benchmarkDir + \":/kaniko/benchmarks\",\n\t}\n\n\tif env, ok := envsMap[dockerfile]; ok {\n\t\tfor _, envVariable := range env {\n\t\t\tdockerRunFlags = append(dockerRunFlags, \"-e\", envVariable)\n\t\t}\n\t}\n\n\tdockerRunFlags = addServiceAccountFlags(dockerRunFlags, serviceAccount)\n\n\tkanikoDockerfilePath := path.Join(buildContextPath, dockerfilesPath, dockerfile)\n\tif dockerfilesPath == \"\" {\n\t\tkanikoDockerfilePath = path.Join(buildContextPath, \"Dockerfile\")\n\t}\n\n\tdockerRunFlags = append(dockerRunFlags, ExecutorImage,\n\t\t\"-f\", kanikoDockerfilePath,\n\t\t\"-d\", kanikoImage,\n\t\t\"--force\", // TODO: detection of whether kaniko is being run inside a container might be broken?\n\t)\n\tdockerRunFlags = append(dockerRunFlags, additionalFlags...)\n\n\tkanikoCmd := exec.Command(\"docker\", dockerRunFlags...)\n\n\tout, err := RunCommandWithoutTest(kanikoCmd)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"Failed to build image %s with kaniko command \\\"%s\\\": %w\\n%s\", kanikoImage, kanikoCmd.Args, err, string(out))\n\t}\n\tif outputCheck := outputChecks[dockerfile]; outputCheck != nil {\n\t\tif err := outputCheck(dockerfile, out); err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"Output check failed for image %s with kaniko command : %w\\n%s\", kanikoImage, err, string(out))\n\t\t}\n\t}\n\treturn benchmarkDir, nil\n}\n"
  },
  {
    "path": "integration/integration_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage integration\n\nimport (\n\t\"archive/tar\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"math\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/google/go-containerregistry/pkg/name\"\n\t\"github.com/google/go-containerregistry/pkg/v1/daemon\"\n\t\"github.com/google/go-containerregistry/pkg/v1/remote\"\n\t\"github.com/pkg/errors\"\n\t\"google.golang.org/api/option\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/timing\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util/bucket\"\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n)\n\nvar (\n\tconfig         *integrationTestConfig\n\timageBuilder   *DockerFileBuilder\n\tallDockerfiles []string\n)\n\nconst (\n\tdaemonPrefix       = \"daemon://\"\n\tintegrationPath    = \"integration\"\n\tdockerfilesPath    = \"dockerfiles\"\n\temptyContainerDiff = `[\n     {\n       \"Image1\": \"%s\",\n       \"Image2\": \"%s\",\n       \"DiffType\": \"File\",\n       \"Diff\": {\n\t \t\"Adds\": null,\n\t \t\"Dels\": null,\n\t \t\"Mods\": null\n       }\n     },\n     {\n       \"Image1\": \"%s\",\n       \"Image2\": \"%s\",\n       \"DiffType\": \"Metadata\",\n       \"Diff\": {\n\t \t\"Adds\": [],\n\t \t\"Dels\": []\n       }\n     }\n   ]`\n)\n\nfunc getDockerMajorVersion() int {\n\tout, err := exec.Command(\"docker\", \"version\", \"--format\", \"{{.Server.Version}}\").Output()\n\tif err != nil {\n\t\tlog.Fatal(\"Error getting docker version of server:\", err)\n\t}\n\tversionArr := strings.Split(string(out), \".\")\n\n\tver, err := strconv.Atoi(versionArr[0])\n\tif err != nil {\n\t\tlog.Fatal(\"Error getting docker version of server during parsing version string:\", err)\n\t}\n\treturn ver\n}\n\nfunc launchTests(m *testing.M) (int, error) {\n\tif config.isGcrRepository() {\n\t\tcontextFilePath, err := CreateIntegrationTarball()\n\t\tif err != nil {\n\t\t\treturn 1, errors.Wrap(err, \"Failed to create tarball of integration files for build context\")\n\t\t}\n\n\t\tbucketName, item, err := bucket.GetNameAndFilepathFromURI(config.gcsBucket)\n\t\tif err != nil {\n\t\t\treturn 1, errors.Wrap(err, \"failed to get bucket name from uri\")\n\t\t}\n\t\tcontextFile, err := os.Open(contextFilePath)\n\t\tif err != nil {\n\t\t\treturn 1, fmt.Errorf(\"failed to read file at path %v: %w\", contextFilePath, err)\n\t\t}\n\t\terr = bucket.Upload(context.Background(), bucketName, item, contextFile, config.gcsClient)\n\t\tif err != nil {\n\t\t\treturn 1, errors.Wrap(err, \"Failed to upload build context\")\n\t\t}\n\n\t\tif err = os.Remove(contextFilePath); err != nil {\n\t\t\treturn 1, errors.Wrap(err, fmt.Sprintf(\"Failed to remove tarball at %s\", contextFilePath))\n\t\t}\n\n\t\tdeleteFunc := func() {\n\t\t\tbucket.Delete(context.Background(), bucketName, item, config.gcsClient)\n\t\t}\n\t\tRunOnInterrupt(deleteFunc)\n\t\tdefer deleteFunc()\n\t}\n\tif err := buildRequiredImages(); err != nil {\n\t\treturn 1, errors.Wrap(err, \"Error while building images\")\n\t}\n\n\timageBuilder = NewDockerFileBuilder()\n\n\treturn m.Run(), nil\n}\n\nfunc TestMain(m *testing.M) {\n\tvar err error\n\tif !meetsRequirements() {\n\t\tfmt.Println(\"Missing required tools\")\n\t\tos.Exit(1)\n\t}\n\n\tconfig = initIntegrationTestConfig()\n\tif allDockerfiles, err = FindDockerFiles(dockerfilesPath, config.dockerfilesPattern); err != nil {\n\t\tfmt.Println(\"Coudn't create map of dockerfiles\", err)\n\t\tos.Exit(1)\n\t}\n\n\texitCode, err := launchTests(m)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t}\n\tos.Exit(exitCode)\n}\n\nfunc buildRequiredImages() error {\n\tsetupCommands := []struct {\n\t\tname    string\n\t\tcommand []string\n\t}{{\n\t\tname:    \"Building kaniko image\",\n\t\tcommand: []string{\"docker\", \"build\", \"-t\", ExecutorImage, \"-f\", \"../deploy/Dockerfile\", \"--target\", \"kaniko-executor\", \"..\"},\n\t}, {\n\t\tname:    \"Building cache warmer image\",\n\t\tcommand: []string{\"docker\", \"build\", \"-t\", WarmerImage, \"-f\", \"../deploy/Dockerfile\", \"--target\", \"kaniko-warmer\", \"..\"},\n\t}, {\n\t\tname:    \"Building onbuild base image\",\n\t\tcommand: []string{\"docker\", \"build\", \"-t\", config.onbuildBaseImage, \"-f\", fmt.Sprintf(\"%s/Dockerfile_onbuild_base\", dockerfilesPath), \".\"},\n\t}, {\n\t\tname:    \"Pushing onbuild base image\",\n\t\tcommand: []string{\"docker\", \"push\", config.onbuildBaseImage},\n\t}, {\n\t\tname:    \"Building hardlink base image\",\n\t\tcommand: []string{\"docker\", \"build\", \"-t\", config.hardlinkBaseImage, \"-f\", fmt.Sprintf(\"%s/Dockerfile_hardlink_base\", dockerfilesPath), \".\"},\n\t}, {\n\t\tname:    \"Pushing hardlink base image\",\n\t\tcommand: []string{\"docker\", \"push\", config.hardlinkBaseImage},\n\t}}\n\n\tfor _, setupCmd := range setupCommands {\n\t\tfmt.Println(setupCmd.name)\n\t\tcmd := exec.Command(setupCmd.command[0], setupCmd.command[1:]...)\n\t\tcmd.Env = append(os.Environ(), \"DOCKER_BUILDKIT=1\") // Build with buildkit enabled.\n\t\tif out, err := RunCommandWithoutTest(cmd); err != nil {\n\t\t\treturn errors.Wrap(err, fmt.Sprintf(\"%s failed: %s\", setupCmd.name, string(out)))\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc TestRun(t *testing.T) {\n\tfor _, dockerfile := range allDockerfiles {\n\t\tt.Run(\"test_\"+dockerfile, func(t *testing.T) {\n\t\t\tdockerfile := dockerfile\n\t\t\tt.Parallel()\n\t\t\tif _, ok := imageBuilder.DockerfilesToIgnore[dockerfile]; ok {\n\t\t\t\tt.SkipNow()\n\t\t\t}\n\t\t\tif _, ok := imageBuilder.TestCacheDockerfiles[dockerfile]; ok {\n\t\t\t\tt.SkipNow()\n\t\t\t}\n\n\t\t\tbuildImage(t, dockerfile, imageBuilder)\n\n\t\t\tdockerImage := GetDockerImage(config.imageRepo, dockerfile)\n\t\t\tkanikoImage := GetKanikoImage(config.imageRepo, dockerfile)\n\n\t\t\tdiff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, \"--no-cache\")\n\n\t\t\texpected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage)\n\t\t\tcheckContainerDiffOutput(t, diff, expected)\n\t\t})\n\t}\n\n\terr := logBenchmarks(\"benchmark\")\n\tif err != nil {\n\t\tt.Logf(\"Failed to create benchmark file: %v\", err)\n\t}\n}\n\nfunc getBranchCommitAndURL() (branch, commit, url string) {\n\trepo := os.Getenv(\"GITHUB_REPOSITORY\")\n\tcommit = os.Getenv(\"GITHUB_SHA\")\n\tif _, isPR := os.LookupEnv(\"GITHUB_HEAD_REF\"); isPR {\n\t\tbranch = \"main\"\n\t} else {\n\t\tbranch = os.Getenv(\"GITHUB_REF\")\n\t\tlog.Printf(\"GITHUB_HEAD_REF is unset (not a PR); using GITHUB_REF=%q\", branch)\n\t\tbranch = strings.TrimPrefix(branch, \"refs/heads/\")\n\t}\n\tif repo == \"\" {\n\t\trepo = \"GoogleContainerTools/kaniko\"\n\t}\n\tif branch == \"\" {\n\t\tbranch = \"main\"\n\t}\n\tlog.Printf(\"repo=%q / commit=%q / branch=%q\", repo, commit, branch)\n\turl = \"github.com/\" + repo\n\treturn\n}\n\nfunc getGitRepo(explicit bool) string {\n\tbranch, commit, url := getBranchCommitAndURL()\n\tif explicit && commit != \"\" {\n\t\treturn url + \"#\" + commit\n\t}\n\treturn url + \"#refs/heads/\" + branch\n}\n\nfunc testGitBuildcontextHelper(t *testing.T, repo string) {\n\tt.Log(\"testGitBuildcontextHelper repo\", repo)\n\tdockerfile := fmt.Sprintf(\"%s/%s/Dockerfile_test_run_2\", integrationPath, dockerfilesPath)\n\n\t// Build with docker\n\tdockerImage := GetDockerImage(config.imageRepo, \"Dockerfile_test_git\")\n\tdockerCmd := exec.Command(\"docker\",\n\t\tappend([]string{\n\t\t\t\"build\",\n\t\t\t\"-t\", dockerImage,\n\t\t\t\"-f\", dockerfile,\n\t\t\trepo,\n\t\t})...)\n\tout, err := RunCommandWithoutTest(dockerCmd)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to build image %s with docker command %q: %s %s\", dockerImage, dockerCmd.Args, err, string(out))\n\t}\n\n\t// Build with kaniko\n\tkanikoImage := GetKanikoImage(config.imageRepo, \"Dockerfile_test_git\")\n\tdockerRunFlags := []string{\"run\", \"--net=host\"}\n\tdockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount)\n\tdockerRunFlags = append(dockerRunFlags, ExecutorImage,\n\t\t\"-f\", dockerfile,\n\t\t\"-d\", kanikoImage,\n\t\t\"-c\", fmt.Sprintf(\"git://%s\", repo))\n\n\tkanikoCmd := exec.Command(\"docker\", dockerRunFlags...)\n\n\tout, err = RunCommandWithoutTest(kanikoCmd)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to build image %s with kaniko command %q: %v %s\", dockerImage, kanikoCmd.Args, err, string(out))\n\t}\n\n\tdiff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, \"--no-cache\")\n\n\texpected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage)\n\tcheckContainerDiffOutput(t, diff, expected)\n}\n\n// TestGitBuildcontext explicitly names the main branch\n// Example:\n//\n//\tgit://github.com/myuser/repo#refs/heads/main\nfunc TestGitBuildcontext(t *testing.T) {\n\trepo := getGitRepo(false)\n\ttestGitBuildcontextHelper(t, repo)\n}\n\n// TestGitBuildcontextNoRef builds without any commit / branch reference\n// Example:\n//\n//\tgit://github.com/myuser/repo\nfunc TestGitBuildcontextNoRef(t *testing.T) {\n\tt.Skip(\"Docker's behavior is to assume a 'master' branch, which the Kaniko repo doesn't have\")\n\t_, _, url := getBranchCommitAndURL()\n\ttestGitBuildcontextHelper(t, url)\n}\n\n// TestGitBuildcontextExplicitCommit uses an explicit commit hash instead of named reference\n// Example:\n//\n//\tgit://github.com/myuser/repo#b873088c4a7b60bb7e216289c58da945d0d771b6\nfunc TestGitBuildcontextExplicitCommit(t *testing.T) {\n\trepo := getGitRepo(true)\n\ttestGitBuildcontextHelper(t, repo)\n}\n\nfunc TestGitBuildcontextSubPath(t *testing.T) {\n\trepo := getGitRepo(false)\n\tdockerfile := \"Dockerfile_test_run_2\"\n\n\t// Build with docker\n\tdockerImage := GetDockerImage(config.imageRepo, \"Dockerfile_test_git\")\n\tdockerCmd := exec.Command(\"docker\",\n\t\tappend([]string{\n\t\t\t\"build\",\n\t\t\t\"-t\", dockerImage,\n\t\t\t\"-f\", filepath.Join(integrationPath, dockerfilesPath, dockerfile),\n\t\t\trepo,\n\t\t})...)\n\tout, err := RunCommandWithoutTest(dockerCmd)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to build image %s with docker command %q: %s %s\", dockerImage, dockerCmd.Args, err, string(out))\n\t}\n\n\t// Build with kaniko\n\tkanikoImage := GetKanikoImage(config.imageRepo, \"Dockerfile_test_git\")\n\tdockerRunFlags := []string{\"run\", \"--net=host\"}\n\tdockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount)\n\tdockerRunFlags = append(\n\t\tdockerRunFlags,\n\t\tExecutorImage,\n\t\t\"-f\", dockerfile,\n\t\t\"-d\", kanikoImage,\n\t\t\"-c\", fmt.Sprintf(\"git://%s\", repo),\n\t\t\"--context-sub-path\", filepath.Join(integrationPath, dockerfilesPath),\n\t)\n\n\tkanikoCmd := exec.Command(\"docker\", dockerRunFlags...)\n\n\tout, err = RunCommandWithoutTest(kanikoCmd)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to build image %s with kaniko command %q: %v %s\", dockerImage, kanikoCmd.Args, err, string(out))\n\t}\n\n\tdiff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, \"--no-cache\")\n\n\texpected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage)\n\tcheckContainerDiffOutput(t, diff, expected)\n}\n\nfunc TestBuildViaRegistryMirrors(t *testing.T) {\n\trepo := getGitRepo(false)\n\tdockerfile := fmt.Sprintf(\"%s/%s/Dockerfile_registry_mirror\", integrationPath, dockerfilesPath)\n\n\t// Build with docker\n\tdockerImage := GetDockerImage(config.imageRepo, \"Dockerfile_registry_mirror\")\n\tdockerCmd := exec.Command(\"docker\",\n\t\tappend([]string{\n\t\t\t\"build\",\n\t\t\t\"-t\", dockerImage,\n\t\t\t\"-f\", dockerfile,\n\t\t\trepo,\n\t\t})...)\n\tout, err := RunCommandWithoutTest(dockerCmd)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to build image %s with docker command %q: %s %s\", dockerImage, dockerCmd.Args, err, string(out))\n\t}\n\n\t// Build with kaniko\n\tkanikoImage := GetKanikoImage(config.imageRepo, \"Dockerfile_registry_mirror\")\n\tdockerRunFlags := []string{\"run\", \"--net=host\"}\n\tdockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount)\n\tdockerRunFlags = append(dockerRunFlags, ExecutorImage,\n\t\t\"-f\", dockerfile,\n\t\t\"-d\", kanikoImage,\n\t\t\"--registry-mirror\", \"doesnotexist.example.com\",\n\t\t\"--registry-mirror\", \"us-mirror.gcr.io\",\n\t\t\"-c\", fmt.Sprintf(\"git://%s\", repo))\n\n\tkanikoCmd := exec.Command(\"docker\", dockerRunFlags...)\n\n\tout, err = RunCommandWithoutTest(kanikoCmd)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to build image %s with kaniko command %q: %v %s\", dockerImage, kanikoCmd.Args, err, string(out))\n\t}\n\n\tdiff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, \"--no-cache\")\n\n\texpected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage)\n\tcheckContainerDiffOutput(t, diff, expected)\n}\n\nfunc TestBuildViaRegistryMap(t *testing.T) {\n\trepo := getGitRepo(false)\n\tdockerfile := fmt.Sprintf(\"%s/%s/Dockerfile_registry_mirror\", integrationPath, dockerfilesPath)\n\n\t// Build with docker\n\tdockerImage := GetDockerImage(config.imageRepo, \"Dockerfile_registry_mirror\")\n\tdockerCmd := exec.Command(\"docker\",\n\t\tappend([]string{\n\t\t\t\"build\",\n\t\t\t\"-t\", dockerImage,\n\t\t\t\"-f\", dockerfile,\n\t\t\trepo,\n\t\t})...)\n\tout, err := RunCommandWithoutTest(dockerCmd)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to build image %s with docker command %q: %s %s\", dockerImage, dockerCmd.Args, err, string(out))\n\t}\n\n\t// Build with kaniko\n\tkanikoImage := GetKanikoImage(config.imageRepo, \"Dockerfile_registry_mirror\")\n\tdockerRunFlags := []string{\"run\", \"--net=host\"}\n\tdockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount)\n\tdockerRunFlags = append(dockerRunFlags, ExecutorImage,\n\t\t\"-f\", dockerfile,\n\t\t\"-d\", kanikoImage,\n\t\t\"--registry-map\", \"index.docker.io=doesnotexist.example.com\",\n\t\t\"--registry-map\", \"index.docker.io=us-mirror.gcr.io\",\n\t\t\"-c\", fmt.Sprintf(\"git://%s\", repo))\n\n\tkanikoCmd := exec.Command(\"docker\", dockerRunFlags...)\n\n\tout, err = RunCommandWithoutTest(kanikoCmd)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to build image %s with kaniko command %q: %v %s\", dockerImage, kanikoCmd.Args, err, string(out))\n\t}\n\n\tdiff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, \"--no-cache\")\n\n\texpected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage)\n\tcheckContainerDiffOutput(t, diff, expected)\n}\n\nfunc TestBuildSkipFallback(t *testing.T) {\n\trepo := getGitRepo(false)\n\tdockerfile := fmt.Sprintf(\"%s/%s/Dockerfile_registry_mirror\", integrationPath, dockerfilesPath)\n\n\t// Build with kaniko\n\tkanikoImage := GetKanikoImage(config.imageRepo, \"Dockerfile_registry_mirror\")\n\tdockerRunFlags := []string{\"run\", \"--net=host\"}\n\tdockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount)\n\tdockerRunFlags = append(dockerRunFlags, ExecutorImage,\n\t\t\"-f\", dockerfile,\n\t\t\"-d\", kanikoImage,\n\t\t\"--registry-mirror\", \"doesnotexist.example.com\",\n\t\t\"--skip-default-registry-fallback\",\n\t\t\"-c\", fmt.Sprintf(\"git://%s\", repo))\n\n\tkanikoCmd := exec.Command(\"docker\", dockerRunFlags...)\n\n\t_, err := RunCommandWithoutTest(kanikoCmd)\n\tif err == nil {\n\t\tt.Errorf(\"Build should fail after using skip-default-registry-fallback and registry-mirror fail to pull\")\n\t}\n}\n\n// TestKanikoDir tests that a build that sets --kaniko-dir produces the same output as the equivalent docker build.\nfunc TestKanikoDir(t *testing.T) {\n\trepo := getGitRepo(false)\n\tdockerfile := fmt.Sprintf(\"%s/%s/Dockerfile_registry_mirror\", integrationPath, dockerfilesPath)\n\n\t// Build with docker\n\tdockerImage := GetDockerImage(config.imageRepo, \"Dockerfile_registry_mirror\")\n\tdockerCmd := exec.Command(\"docker\",\n\t\tappend([]string{\n\t\t\t\"build\",\n\t\t\t\"-t\", dockerImage,\n\t\t\t\"-f\", dockerfile,\n\t\t\trepo,\n\t\t})...)\n\tout, err := RunCommandWithoutTest(dockerCmd)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to build image %s with docker command %q: %s %s\", dockerImage, dockerCmd.Args, err, string(out))\n\t}\n\n\t// Build with kaniko\n\tkanikoImage := GetKanikoImage(config.imageRepo, \"Dockerfile_registry_mirror\")\n\tdockerRunFlags := []string{\"run\", \"--net=host\"}\n\tdockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount)\n\tdockerRunFlags = append(dockerRunFlags, ExecutorImage,\n\t\t\"-f\", dockerfile,\n\t\t\"-d\", kanikoImage,\n\t\t\"--kaniko-dir\", \"/not-kaniko\",\n\t\t\"-c\", fmt.Sprintf(\"git://%s\", repo))\n\n\tkanikoCmd := exec.Command(\"docker\", dockerRunFlags...)\n\n\tout, err = RunCommandWithoutTest(kanikoCmd)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to build image %s with kaniko command %q: %v %s\", dockerImage, kanikoCmd.Args, err, string(out))\n\t}\n\n\tdiff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, \"--no-cache\")\n\n\texpected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage)\n\tcheckContainerDiffOutput(t, diff, expected)\n}\n\nfunc TestBuildWithLabels(t *testing.T) {\n\trepo := getGitRepo(false)\n\tdockerfile := fmt.Sprintf(\"%s/%s/Dockerfile_test_label\", integrationPath, dockerfilesPath)\n\n\ttestLabel := \"mylabel=myvalue\"\n\n\t// Build with docker\n\tdockerImage := GetDockerImage(config.imageRepo, \"Dockerfile_test_label:mylabel\")\n\tdockerCmd := exec.Command(\"docker\",\n\t\tappend([]string{\n\t\t\t\"build\",\n\t\t\t\"-t\", dockerImage,\n\t\t\t\"-f\", dockerfile,\n\t\t\t\"--label\", testLabel,\n\t\t\trepo,\n\t\t})...)\n\tout, err := RunCommandWithoutTest(dockerCmd)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to build image %s with docker command %q: %s %s\", dockerImage, dockerCmd.Args, err, string(out))\n\t}\n\n\t// Build with kaniko\n\tkanikoImage := GetKanikoImage(config.imageRepo, \"Dockerfile_test_label:mylabel\")\n\tdockerRunFlags := []string{\"run\", \"--net=host\"}\n\tdockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount)\n\tdockerRunFlags = append(dockerRunFlags, ExecutorImage,\n\t\t\"-f\", dockerfile,\n\t\t\"-d\", kanikoImage,\n\t\t\"--label\", testLabel,\n\t\t\"-c\", fmt.Sprintf(\"git://%s\", repo),\n\t)\n\n\tkanikoCmd := exec.Command(\"docker\", dockerRunFlags...)\n\n\tout, err = RunCommandWithoutTest(kanikoCmd)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to build image %s with kaniko command %q: %v %s\", dockerImage, kanikoCmd.Args, err, string(out))\n\t}\n\n\tdiff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, \"--no-cache\")\n\n\texpected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage)\n\tcheckContainerDiffOutput(t, diff, expected)\n}\n\nfunc TestBuildWithHTTPError(t *testing.T) {\n\trepo := getGitRepo(false)\n\tdockerfile := fmt.Sprintf(\"%s/%s/Dockerfile_test_add_404\", integrationPath, dockerfilesPath)\n\n\t// Build with docker\n\tdockerImage := GetDockerImage(config.imageRepo, \"Dockerfile_test_add_404\")\n\tdockerCmd := exec.Command(\"docker\",\n\t\tappend([]string{\n\t\t\t\"build\",\n\t\t\t\"-t\", dockerImage,\n\t\t\t\"-f\", dockerfile,\n\t\t\trepo,\n\t\t})...)\n\tout, err := RunCommandWithoutTest(dockerCmd)\n\tif err == nil {\n\t\tt.Errorf(\"an error was expected, got %s\", string(out))\n\t}\n\n\t// Build with kaniko\n\tkanikoImage := GetKanikoImage(config.imageRepo, \"Dockerfile_test_add_404\")\n\tdockerRunFlags := []string{\"run\", \"--net=host\"}\n\tdockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount)\n\tdockerRunFlags = append(dockerRunFlags, ExecutorImage,\n\t\t\"-f\", dockerfile,\n\t\t\"-d\", kanikoImage,\n\t\t\"-c\", fmt.Sprintf(\"git://%s\", repo),\n\t)\n\n\tkanikoCmd := exec.Command(\"docker\", dockerRunFlags...)\n\n\tout, err = RunCommandWithoutTest(kanikoCmd)\n\tif err == nil {\n\t\tt.Errorf(\"an error was expected, got %s\", string(out))\n\t}\n}\n\nfunc TestLayers(t *testing.T) {\n\toffset := map[string]int{\n\t\t\"Dockerfile_test_add\":     12,\n\t\t\"Dockerfile_test_scratch\": 3,\n\t}\n\n\tif os.Getenv(\"CI\") == \"true\" {\n\t\t// TODO: tejaldesai fix this!\n\t\t// This files build locally with difference 0, on CI docker\n\t\t// produces a different amount of layers (?).\n\t\toffset[\"Dockerfile_test_copy_same_file_many_times\"] = 47\n\t\toffset[\"Dockerfile_test_meta_arg\"] = 1\n\t\toffset[\"Dockerfile_test_copyadd_chmod\"] = 6\n\t}\n\n\tfor _, dockerfile := range allDockerfiles {\n\t\tt.Run(\"test_layer_\"+dockerfile, func(t *testing.T) {\n\t\t\tdockerfileTest := dockerfile\n\n\t\t\tt.Parallel()\n\t\t\tif _, ok := imageBuilder.DockerfilesToIgnore[dockerfileTest]; ok {\n\t\t\t\tt.SkipNow()\n\t\t\t}\n\n\t\t\tbuildImage(t, dockerfileTest, imageBuilder)\n\n\t\t\t// Pull the kaniko image\n\t\t\tdockerImage := GetDockerImage(config.imageRepo, dockerfileTest)\n\t\t\tkanikoImage := GetKanikoImage(config.imageRepo, dockerfileTest)\n\t\t\tpullCmd := exec.Command(\"docker\", \"pull\", kanikoImage)\n\t\t\tRunCommand(pullCmd, t)\n\t\t\tcheckLayers(t, dockerImage, kanikoImage, offset[dockerfileTest])\n\t\t})\n\t}\n\n\terr := logBenchmarks(\"benchmark_layers\")\n\tif err != nil {\n\t\tt.Logf(\"Failed to create benchmark file: %v\", err)\n\t}\n}\n\nfunc TestReplaceFolderWithFileOrLink(t *testing.T) {\n\tdockerfiles := []string{\"TestReplaceFolderWithFile\", \"TestReplaceFolderWithLink\"}\n\tfor _, dockerfile := range dockerfiles {\n\t\tt.Run(dockerfile, func(t *testing.T) {\n\t\t\tbuildImage(t, dockerfile, imageBuilder)\n\t\t\tkanikoImage := GetKanikoImage(config.imageRepo, dockerfile)\n\n\t\t\tkanikoFiles, err := getLastLayerFiles(kanikoImage)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tfmt.Println(kanikoFiles)\n\n\t\t\tfor _, file := range kanikoFiles {\n\t\t\t\tif strings.HasPrefix(file, \"a/.wh.\") {\n\t\t\t\t\tt.Errorf(\"Last layer should not add whiteout files to deleted directory but found %s\", file)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc buildImage(t *testing.T, dockerfile string, imageBuilder *DockerFileBuilder) {\n\tt.Logf(\"Building image '%v'...\", dockerfile)\n\n\tif err := imageBuilder.BuildImage(t, config, dockerfilesPath, dockerfile); err != nil {\n\t\tt.Errorf(\"Error building image: %s\", err)\n\t\tt.FailNow()\n\t}\n\treturn\n}\n\n// Build each image with kaniko twice, and then make sure they're exactly the same\nfunc TestCache(t *testing.T) {\n\tpopulateVolumeCache()\n\n\t// Build dockerfiles with registry cache\n\tfor dockerfile := range imageBuilder.TestCacheDockerfiles {\n\t\tt.Run(\"test_cache_\"+dockerfile, func(t *testing.T) {\n\t\t\tdockerfile := dockerfile\n\t\t\tcache := filepath.Join(config.imageRepo, \"cache\", fmt.Sprintf(\"%v\", time.Now().UnixNano()))\n\t\t\tt.Parallel()\n\t\t\tverifyBuildWith(t, cache, dockerfile)\n\t\t})\n\t}\n\n\t// Build dockerfiles with layout cache\n\tfor dockerfile := range imageBuilder.TestOCICacheDockerfiles {\n\t\tt.Run(\"test_oci_cache_\"+dockerfile, func(t *testing.T) {\n\t\t\tdockerfile := dockerfile\n\t\t\tcache := filepath.Join(\"oci:\", cacheDir, \"cached\", fmt.Sprintf(\"%v\", time.Now().UnixNano()))\n\t\t\tt.Parallel()\n\t\t\tverifyBuildWith(t, cache, dockerfile)\n\t\t})\n\t}\n\n\tif err := logBenchmarks(\"benchmark_cache\"); err != nil {\n\t\tt.Logf(\"Failed to create benchmark file: %v\", err)\n\t}\n}\n\n// Attempt to warm an image two times : first time should populate the cache, second time should find the image in the cache.\nfunc TestWarmerTwice(t *testing.T) {\n\t_, ex, _, _ := runtime.Caller(0)\n\tcwd := filepath.Dir(ex) + \"/tmpCache\"\n\n\t// Start a sleeping warmer container\n\tdockerRunFlags := []string{\"run\", \"--net=host\"}\n\tdockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount)\n\tdockerRunFlags = append(dockerRunFlags,\n\t\t\"--memory=16m\",\n\t\t\"-v\", cwd+\":/cache\",\n\t\tWarmerImage,\n\t\t\"--cache-dir=/cache\",\n\t\t\"-i\", \"debian:trixie-slim\")\n\n\twarmCmd := exec.Command(\"docker\", dockerRunFlags...)\n\tout, err := RunCommandWithoutTest(warmCmd)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to perform first warming: %s\", err)\n\t}\n\tt.Logf(\"First warm output: %s\", out)\n\n\twarmCmd = exec.Command(\"docker\", dockerRunFlags...)\n\tout, err = RunCommandWithoutTest(warmCmd)\n\tif err != nil {\n\t\tt.Fatalf(\"Unable to perform second warming: %s\", err)\n\t}\n\tt.Logf(\"Second warm output: %s\", out)\n}\n\nfunc verifyBuildWith(t *testing.T, cache, dockerfile string) {\n\targs := []string{}\n\tif strings.HasPrefix(dockerfile, \"Dockerfile_test_cache_copy\") {\n\t\targs = append(args, \"--cache-copy-layers=true\")\n\t}\n\n\t// Build the initial image which will cache layers\n\tif err := imageBuilder.buildCachedImage(config, cache, dockerfilesPath, dockerfile, 0, args); err != nil {\n\t\tt.Fatalf(\"error building cached image for the first time: %v\", err)\n\t}\n\t// Build the second image which should pull from the cache\n\tif err := imageBuilder.buildCachedImage(config, cache, dockerfilesPath, dockerfile, 1, args); err != nil {\n\t\tt.Fatalf(\"error building cached image for the second time: %v\", err)\n\t}\n\t// Make sure both images are the same\n\tkanikoVersion0 := GetVersionedKanikoImage(config.imageRepo, dockerfile, 0)\n\tkanikoVersion1 := GetVersionedKanikoImage(config.imageRepo, dockerfile, 1)\n\n\tdiff := containerDiff(t, kanikoVersion0, kanikoVersion1)\n\n\texpected := fmt.Sprintf(emptyContainerDiff, kanikoVersion0, kanikoVersion1, kanikoVersion0, kanikoVersion1)\n\tcheckContainerDiffOutput(t, diff, expected)\n}\n\nfunc TestRelativePaths(t *testing.T) {\n\tdockerfile := \"Dockerfile_relative_copy\"\n\n\tt.Run(\"test_relative_\"+dockerfile, func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\tdockerfile = filepath.Join(\"./dockerfiles\", dockerfile)\n\n\t\tcontextPath := \"./context\"\n\n\t\terr := imageBuilder.buildRelativePathsImage(\n\t\t\tconfig.imageRepo,\n\t\t\tdockerfile,\n\t\t\tconfig.serviceAccount,\n\t\t\tcontextPath,\n\t\t)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tdockerImage := GetDockerImage(config.imageRepo, \"test_relative_\"+dockerfile)\n\t\tkanikoImage := GetKanikoImage(config.imageRepo, \"test_relative_\"+dockerfile)\n\n\t\tdiff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, \"--no-cache\")\n\n\t\texpected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage)\n\t\tcheckContainerDiffOutput(t, diff, expected)\n\t})\n}\n\nfunc TestExitCodePropagation(t *testing.T) {\n\tcurrentDir, err := os.Getwd()\n\tif err != nil {\n\t\tt.Fatal(\"Could not get working dir\")\n\t}\n\n\tcontext := fmt.Sprintf(\"%s/testdata/exit-code-propagation\", currentDir)\n\tdockerfile := fmt.Sprintf(\"%s/Dockerfile_exit_code_propagation\", context)\n\n\tt.Run(\"test error code propagation\", func(t *testing.T) {\n\t\t// building the image with docker should fail with exit code 42\n\t\tdockerImage := GetDockerImage(config.imageRepo, \"Dockerfile_exit_code_propagation\")\n\t\tdockerFlags := []string{\n\t\t\t\"build\",\n\t\t\t\"-t\", dockerImage,\n\t\t\t\"-f\", dockerfile,\n\t\t}\n\t\tdockerCmd := exec.Command(\"docker\", append(dockerFlags, context)...)\n\n\t\tout, kanikoErr := RunCommandWithoutTest(dockerCmd)\n\t\tif kanikoErr == nil {\n\t\t\tt.Fatalf(\"docker build did not produce an error:\\n%s\", out)\n\t\t}\n\t\tvar dockerCmdExitErr *exec.ExitError\n\t\tvar dockerExitCode int\n\n\t\tif errors.As(kanikoErr, &dockerCmdExitErr) {\n\t\t\tdockerExitCode = dockerCmdExitErr.ExitCode()\n\t\t\ttestutil.CheckDeepEqual(t, 42, dockerExitCode)\n\t\t\tif t.Failed() {\n\t\t\t\tt.Fatalf(\"Output was:\\n%s\", out)\n\t\t\t}\n\t\t} else {\n\t\t\tt.Fatalf(\"did not produce the expected error:\\n%s\", out)\n\t\t}\n\n\t\t// try to build the same image with kaniko the error code should match with the one from the plain docker build\n\t\tcontextVolume := fmt.Sprintf(\"%s:/workspace\", context)\n\n\t\tdockerFlags = []string{\n\t\t\t\"run\",\n\t\t\t\"-v\", contextVolume,\n\t\t}\n\t\tdockerFlags = addServiceAccountFlags(dockerFlags, \"\")\n\t\tdockerFlags = append(dockerFlags, ExecutorImage,\n\t\t\t\"-c\", \"dir:///workspace/\",\n\t\t\t\"-f\", \"./Dockerfile_exit_code_propagation\",\n\t\t\t\"--no-push\",\n\t\t\t\"--force\", // TODO: detection of whether kaniko is being run inside a container might be broken?\n\t\t)\n\n\t\tdockerCmdWithKaniko := exec.Command(\"docker\", dockerFlags...)\n\n\t\tout, kanikoErr = RunCommandWithoutTest(dockerCmdWithKaniko)\n\t\tif kanikoErr == nil {\n\t\t\tt.Fatalf(\"the kaniko build did not produce the expected error:\\n%s\", out)\n\t\t}\n\n\t\tvar kanikoExitErr *exec.ExitError\n\t\tif errors.As(kanikoErr, &kanikoExitErr) {\n\t\t\ttestutil.CheckDeepEqual(t, dockerExitCode, kanikoExitErr.ExitCode())\n\t\t\tif t.Failed() {\n\t\t\t\tt.Fatalf(\"Output was:\\n%s\", out)\n\t\t\t}\n\t\t} else {\n\t\t\tt.Fatalf(\"did not produce the expected error:\\n%s\", out)\n\t\t}\n\t})\n}\n\ntype fileDiff struct {\n\tName string `json:\"Name\"`\n\tSize int    `json:\"Size\"`\n}\n\ntype fileDiffResult struct {\n\tAdds []fileDiff `json:\"Adds\"`\n\tDels []fileDiff `json:\"Dels\"`\n}\n\ntype metaDiffResult struct {\n\tAdds []string `json:\"Adds\"`\n\tDels []string `json:\"Dels\"`\n}\n\ntype diffOutput struct {\n\tImage1   string\n\tImage2   string\n\tDiffType string\n\tDiff     interface{}\n}\n\nfunc (diff *diffOutput) UnmarshalJSON(data []byte) error {\n\ttype Alias diffOutput\n\taux := &struct{ *Alias }{Alias: (*Alias)(diff)}\n\tvar rawJSON json.RawMessage\n\taux.Diff = &rawJSON\n\terr := json.Unmarshal(data, &aux)\n\tif err != nil {\n\t\treturn err\n\t}\n\tswitch diff.DiffType {\n\tcase \"File\":\n\t\tvar dst fileDiffResult\n\t\terr = json.Unmarshal(rawJSON, &dst)\n\t\tdiff.Diff = &dst\n\tcase \"Metadata\":\n\t\tvar dst metaDiffResult\n\t\terr = json.Unmarshal(rawJSON, &dst)\n\t\tdiff.Diff = &dst\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn err\n}\n\nvar allowedDiffPaths = []string{\"/sys\"}\n\nfunc checkContainerDiffOutput(t *testing.T, diff []byte, expected string) {\n\t// Let's compare the json objects themselves instead of strings to avoid\n\t// issues with spaces and indents\n\tt.Helper()\n\n\tdiffInt := []diffOutput{}\n\texpectedInt := []diffOutput{}\n\n\terr := json.Unmarshal(diff, &diffInt)\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\n\terr = json.Unmarshal([]byte(expected), &expectedInt)\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\n\t// Some differences (ignored paths, etc.) are known and expected.\n\tfdr := diffInt[0].Diff.(*fileDiffResult)\n\tfdr.Adds = filterFileDiff(fdr.Adds)\n\tfdr.Dels = filterFileDiff(fdr.Dels)\n\t// Remove some of the meta diffs that shouldn't be checked\n\tmdr := diffInt[1].Diff.(*metaDiffResult)\n\tmdr.Adds = filterMetaDiff(mdr.Adds)\n\tmdr.Dels = filterMetaDiff(mdr.Dels)\n\n\ttestutil.CheckErrorAndDeepEqual(t, false, nil, expectedInt, diffInt)\n}\n\nfunc filterMetaDiff(metaDiff []string) []string {\n\t// TODO remove this once we agree testing shouldn't run on docker 18.xx\n\t// currently docker 18.xx will build an image with Metadata set\n\t// ArgsEscaped: true, however Docker 19.xx will build an image and have\n\t// ArgsEscaped: false\n\tif config.dockerMajorVersion == 19 {\n\t\treturn metaDiff\n\t}\n\tnewDiffs := []string{}\n\tfor _, meta := range metaDiff {\n\t\tif !strings.HasPrefix(meta, \"ArgsEscaped\") {\n\t\t\tnewDiffs = append(newDiffs, meta)\n\t\t}\n\t}\n\treturn newDiffs\n}\n\nfunc filterFileDiff(f []fileDiff) []fileDiff {\n\tvar newDiffs []fileDiff\n\tfor _, diff := range f {\n\t\tisIgnored := false\n\t\tfor _, p := range allowedDiffPaths {\n\t\t\tif util.HasFilepathPrefix(diff.Name, p, false) {\n\t\t\t\tisIgnored = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !isIgnored {\n\t\t\tnewDiffs = append(newDiffs, diff)\n\t\t}\n\t}\n\treturn newDiffs\n}\n\nfunc checkLayers(t *testing.T, image1, image2 string, offset int) {\n\tt.Helper()\n\timg1, err := getImageDetails(image1)\n\tif err != nil {\n\t\tt.Fatalf(\"Couldn't get details from image reference for (%s): %s\", image1, err)\n\t}\n\n\timg2, err := getImageDetails(image2)\n\tif err != nil {\n\t\tt.Fatalf(\"Couldn't get details from image reference for (%s): %s\", image2, err)\n\t}\n\n\tactualOffset := int(math.Abs(float64(img1.numLayers - img2.numLayers)))\n\tif actualOffset != offset {\n\t\tt.Fatalf(\"Difference in number of layers in each image is %d but should be %d. Image 1: %s, Image 2: %s\", actualOffset, offset, img1, img2)\n\t}\n}\n\nfunc getImageDetails(image string) (*imageDetails, error) {\n\tref, err := name.ParseReference(image, name.WeakValidation)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Couldn't parse referance to image %s: %w\", image, err)\n\t}\n\timgRef, err := daemon.Image(ref)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Couldn't get reference to image %s from daemon: %w\", image, err)\n\t}\n\tlayers, err := imgRef.Layers()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Error getting layers for image %s: %w\", image, err)\n\t}\n\tdigest, err := imgRef.Digest()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Error getting digest for image %s: %w\", image, err)\n\t}\n\treturn &imageDetails{\n\t\tname:      image,\n\t\tnumLayers: len(layers),\n\t\tdigest:    digest.Hex,\n\t}, nil\n}\n\nfunc getLastLayerFiles(image string) ([]string, error) {\n\tref, err := name.ParseReference(image, name.WeakValidation)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Couldn't parse referance to image %s: %w\", image, err)\n\t}\n\n\timgRef, err := remote.Image(ref)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Couldn't get reference to image %s from daemon: %w\", image, err)\n\t}\n\tlayers, err := imgRef.Layers()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Error getting layers for image %s: %w\", image, err)\n\t}\n\treadCloser, err := layers[len(layers)-1].Uncompressed()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\ttr := tar.NewReader(readCloser)\n\tvar files []string\n\tfor {\n\t\thdr, err := tr.Next()\n\t\tif errors.Is(err, io.EOF) {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfiles = append(files, hdr.Name)\n\t}\n\treturn files, nil\n}\n\nfunc logBenchmarks(benchmark string) error {\n\tif b, err := strconv.ParseBool(os.Getenv(\"BENCHMARK\")); err == nil && b {\n\t\tf, err := os.Create(benchmark)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tf.WriteString(timing.Summary())\n\t\tdefer f.Close()\n\t}\n\treturn nil\n}\n\ntype imageDetails struct {\n\tname      string\n\tnumLayers int\n\tdigest    string\n}\n\nfunc (i imageDetails) String() string {\n\treturn fmt.Sprintf(\"Image: [%s] Digest: [%s] Number of Layers: [%d]\", i.name, i.digest, i.numLayers)\n}\n\nfunc initIntegrationTestConfig() *integrationTestConfig {\n\tvar c integrationTestConfig\n\n\tvar gcsEndpoint string\n\tvar disableGcsAuth bool\n\tflag.StringVar(&c.gcsBucket, \"bucket\", \"gs://kaniko-test-bucket\", \"The gcs bucket argument to uploaded the tar-ed contents of the `integration` dir to.\")\n\tflag.StringVar(&c.imageRepo, \"repo\", \"gcr.io/kaniko-test\", \"The (docker) image repo to build and push images to during the test. `gcloud` must be authenticated with this repo or serviceAccount must be set.\")\n\tflag.StringVar(&c.serviceAccount, \"serviceAccount\", \"\", \"The path to the service account push images to GCR and upload/download files to GCS.\")\n\tflag.StringVar(&gcsEndpoint, \"gcs-endpoint\", \"\", \"Custom endpoint for GCS. Used for local integration tests\")\n\tflag.BoolVar(&disableGcsAuth, \"disable-gcs-auth\", false, \"Disable GCS Authentication. Used for local integration tests\")\n\t// adds the possibility to run a single dockerfile. This is useful since running all images can exhaust the dockerhub pull limit\n\tflag.StringVar(&c.dockerfilesPattern, \"dockerfiles-pattern\", \"Dockerfile_test*\", \"The pattern to match dockerfiles with\")\n\tflag.Parse()\n\n\tif len(c.serviceAccount) > 0 {\n\t\tabsPath, err := filepath.Abs(\"../\" + c.serviceAccount)\n\t\tif err != nil {\n\t\t\tlog.Fatalf(\"Error getting absolute path for service account: %s\\n\", c.serviceAccount)\n\t\t}\n\t\tif _, err := os.Stat(absPath); os.IsNotExist(err) {\n\t\t\tlog.Fatalf(\"Service account does not exist: %s\\n\", absPath)\n\t\t}\n\t\tc.serviceAccount = absPath\n\t\tos.Setenv(\"GOOGLE_APPLICATION_CREDENTIALS\", absPath)\n\t}\n\n\tif c.imageRepo == \"\" {\n\t\tlog.Fatal(\"You must provide a image repository\")\n\t}\n\n\tif c.isGcrRepository() && c.gcsBucket == \"\" {\n\t\tlog.Fatalf(\"You must provide a gcs bucket when using a Google Container Registry (\\\"%s\\\" was provided)\", c.imageRepo)\n\t}\n\tif !strings.HasSuffix(c.imageRepo, \"/\") {\n\t\tc.imageRepo = c.imageRepo + \"/\"\n\t}\n\n\tif c.gcsBucket != \"\" {\n\t\tvar opts []option.ClientOption\n\t\tif gcsEndpoint != \"\" {\n\t\t\topts = append(opts, option.WithEndpoint(gcsEndpoint))\n\t\t}\n\t\tif disableGcsAuth {\n\t\t\topts = append(opts, option.WithoutAuthentication())\n\t\t}\n\n\t\tgcsClient, err := bucket.NewClient(context.Background(), opts...)\n\t\tif err != nil {\n\t\t\tlog.Fatalf(\"Could not create a new Google Storage Client: %s\", err)\n\t\t}\n\t\tc.gcsClient = gcsClient\n\t}\n\n\tc.dockerMajorVersion = getDockerMajorVersion()\n\tc.onbuildBaseImage = c.imageRepo + \"onbuild-base:latest\"\n\tc.hardlinkBaseImage = c.imageRepo + \"hardlink-base:latest\"\n\treturn &c\n}\n\nfunc meetsRequirements() bool {\n\trequiredTools := []string{\"container-diff\"}\n\thasRequirements := true\n\tfor _, tool := range requiredTools {\n\t\t_, err := exec.LookPath(tool)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"You must have %s installed and on your PATH\\n\", tool)\n\t\t\thasRequirements = false\n\t\t}\n\t}\n\treturn hasRequirements\n}\n\n// containerDiff compares the container images image1 and image2.\nfunc containerDiff(t *testing.T, image1, image2 string, flags ...string) []byte {\n\t// workaround for container-diff OCI issue https://github.com/GoogleContainerTools/container-diff/issues/389\n\tif !strings.HasPrefix(image1, daemonPrefix) {\n\t\tdockerPullCmd := exec.Command(\"docker\", \"pull\", image1)\n\t\tout := RunCommand(dockerPullCmd, t)\n\t\tt.Logf(\"docker pull cmd output for image1 = %s\", string(out))\n\t\timage1 = daemonPrefix + image1\n\t}\n\n\tif !strings.HasPrefix(image2, daemonPrefix) {\n\t\tdockerPullCmd := exec.Command(\"docker\", \"pull\", image2)\n\t\tout := RunCommand(dockerPullCmd, t)\n\t\tt.Logf(\"docker pull cmd output for image2 = %s\", string(out))\n\t\timage2 = daemonPrefix + image2\n\t}\n\n\tflags = append([]string{\"diff\"}, flags...)\n\tflags = append(flags, image1, image2,\n\t\t\"-q\", \"--type=file\", \"--type=metadata\", \"--json\")\n\n\tcontainerdiffCmd := exec.Command(\"container-diff\", flags...)\n\tdiff := RunCommand(containerdiffCmd, t)\n\tt.Logf(\"diff = %s\", string(diff))\n\n\treturn diff\n}\n"
  },
  {
    "path": "integration/integration_with_context_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage integration\n\nimport (\n\t\"fmt\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n)\n\nfunc TestWithContext(t *testing.T) {\n\tcwd, err := os.Getwd()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tdir := filepath.Join(cwd, \"dockerfiles-with-context\")\n\tentries, err := os.ReadDir(dir)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\ttestDirs := make([]fs.FileInfo, 0, len(entries))\n\n\tfor _, entry := range entries {\n\t\tinfo, err := entry.Info()\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestDirs = append(testDirs, info)\n\t}\n\n\tbuilder := NewDockerFileBuilder()\n\n\tfor _, tdInfo := range testDirs {\n\t\tname := tdInfo.Name()\n\t\ttestDir := filepath.Join(dir, name)\n\n\t\tt.Run(\"test_with_context_\"+name, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tif err := builder.BuildImageWithContext(\n\t\t\t\tt, config, \"\", name, testDir,\n\t\t\t); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tdockerImage := GetDockerImage(config.imageRepo, name)\n\t\t\tkanikoImage := GetKanikoImage(config.imageRepo, name)\n\n\t\t\tdiff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, \"--no-cache\")\n\n\t\t\texpected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage)\n\t\t\tcheckContainerDiffOutput(t, diff, expected)\n\n\t\t})\n\t}\n\n\tif err := logBenchmarks(\"benchmark\"); err != nil {\n\t\tt.Logf(\"Failed to create benchmark file: %v\", err)\n\t}\n}\n"
  },
  {
    "path": "integration/integration_with_stdin_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage integration\n\nimport (\n\t\"compress/gzip\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"sync\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n)\n\nfunc TestBuildWithStdin(t *testing.T) {\n\t_, ex, _, _ := runtime.Caller(0)\n\tcwd := filepath.Dir(ex)\n\n\ttestDir := \"test_dir\"\n\ttestDirLongPath := filepath.Join(cwd, testDir)\n\n\tif err := os.MkdirAll(testDirLongPath, 0750); err != nil {\n\t\tt.Errorf(\"Failed to create dir_where_to_extract: %v\", err)\n\t}\n\n\tdockerfile := \"Dockerfile_test_stdin\"\n\n\tfiles := map[string]string{\n\t\tdockerfile: \"FROM debian:10.13\\nRUN echo \\\"hey\\\"\",\n\t}\n\n\tif err := testutil.SetupFiles(testDir, files); err != nil {\n\t\tt.Errorf(\"Failed to setup files %v on %s: %v\", files, testDir, err)\n\t}\n\n\tif err := os.Chdir(testDir); err != nil {\n\t\tt.Fatalf(\"Failed to Chdir on %s: %v\", testDir, err)\n\t}\n\n\ttarPath := fmt.Sprintf(\"%s.tar.gz\", dockerfile)\n\n\tvar wg sync.WaitGroup\n\twg.Add(1)\n\t// Create Tar Gz File with dockerfile inside\n\tgo func(wg *sync.WaitGroup) {\n\t\tdefer wg.Done()\n\t\ttarFile, err := os.Create(tarPath)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Failed to create %s: %v\", tarPath, err)\n\t\t}\n\t\tdefer tarFile.Close()\n\n\t\tgw := gzip.NewWriter(tarFile)\n\t\tdefer gw.Close()\n\n\t\ttw := util.NewTar(gw)\n\t\tdefer tw.Close()\n\n\t\tif err := tw.AddFileToTar(dockerfile); err != nil {\n\t\t\tt.Errorf(\"Failed to add %s to %s: %v\", dockerfile, tarPath, err)\n\t\t}\n\t}(&wg)\n\n\t// Waiting for the Tar Gz file creation to be done before moving on\n\twg.Wait()\n\n\t// Build with docker\n\n\tdockerImage := GetDockerImage(config.imageRepo, dockerfile)\n\tdockerCmd := exec.Command(\"docker\",\n\t\tappend([]string{\"build\",\n\t\t\t\"-t\", dockerImage,\n\t\t\t\"-f\", dockerfile,\n\t\t\t\".\"})...)\n\n\t_, err := RunCommandWithoutTest(dockerCmd)\n\tif err != nil {\n\t\tt.Fatalf(\"can't run %s: %v\", dockerCmd.String(), err)\n\t}\n\n\t// Build with kaniko using Stdin\n\tkanikoImageStdin := GetKanikoImage(config.imageRepo, dockerfile)\n\ttarCmd := exec.Command(\"tar\", \"-cf\", \"-\", dockerfile)\n\tgzCmd := exec.Command(\"gzip\", \"-9\")\n\n\tdockerRunFlags := []string{\"run\", \"--interactive\", \"--net=host\", \"-v\", cwd + \":/workspace\"}\n\tdockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount)\n\tdockerRunFlags = append(dockerRunFlags,\n\t\tExecutorImage,\n\t\t\"-f\", dockerfile,\n\t\t\"-c\", \"tar://stdin\",\n\t\t\"-d\", kanikoImageStdin)\n\n\tkanikoCmdStdin := exec.Command(\"docker\", dockerRunFlags...)\n\n\tgzCmd.Stdin, err = tarCmd.StdoutPipe()\n\tif err != nil {\n\t\tt.Fatalf(\"can't set gzCmd stdin: %v\", err)\n\t}\n\tkanikoCmdStdin.Stdin, err = gzCmd.StdoutPipe()\n\tif err != nil {\n\t\tt.Fatalf(\"can't set kanikoCmd stdin: %v\", err)\n\t}\n\n\tif err := kanikoCmdStdin.Start(); err != nil {\n\t\tt.Fatalf(\"can't start %s: %v\", kanikoCmdStdin.String(), err)\n\t}\n\n\tif err := gzCmd.Start(); err != nil {\n\t\tt.Fatalf(\"can't start %s: %v\", gzCmd.String(), err)\n\t}\n\n\tif err := tarCmd.Run(); err != nil {\n\t\tt.Fatalf(\"can't start %s: %v\", tarCmd.String(), err)\n\t}\n\n\tif err := gzCmd.Wait(); err != nil {\n\t\tt.Fatalf(\"can't wait %s: %v\", gzCmd.String(), err)\n\t}\n\n\tif err := kanikoCmdStdin.Wait(); err != nil {\n\t\tt.Fatalf(\"can't wait %s: %v\", kanikoCmdStdin.String(), err)\n\t}\n\n\tdiff := containerDiff(t, daemonPrefix+dockerImage, kanikoImageStdin, \"--no-cache\")\n\n\texpected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImageStdin, dockerImage, kanikoImageStdin)\n\tcheckContainerDiffOutput(t, diff, expected)\n\n\tif err := os.RemoveAll(testDirLongPath); err != nil {\n\t\tt.Errorf(\"Failed to remove %s: %v\", testDirLongPath, err)\n\t}\n}\n"
  },
  {
    "path": "integration/k8s-job.yaml",
    "content": "apiVersion: batch/v1\nkind: Job\nmetadata:\n  name: kaniko-test-{{.Name}}\nspec:\n  template:\n    spec:\n      hostNetwork: true\n      containers:\n      - name: kaniko\n        image: localhost:5000/executor:latest\n        workingDir: /workspace\n        args: [ \"--context=dir:///workspace\",\n                \"--destination={{.KanikoImage}}\"]\n        volumeMounts:\n        - name: context\n          mountPath: /workspace\n      restartPolicy: Never\n      volumes:\n      - name: context\n        hostPath:\n          path: {{.Context}}\n  backoffLimit: 1\n"
  },
  {
    "path": "integration/k8s_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage integration\n\nimport (\n\t\"fmt\"\n\t\"io/fs\"\n\t\"log\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"testing\"\n\t\"text/template\"\n)\n\ntype K8sConfig struct {\n\tKanikoImage string\n\tContext     string\n\tName        string\n}\n\nfunc TestK8s(t *testing.T) {\n\tcwd, err := os.Getwd()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tdir := filepath.Join(cwd, \"dockerfiles-with-context\")\n\n\tentries, err := os.ReadDir(dir)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\ttestDirs := make([]fs.FileInfo, 0, len(entries))\n\n\tfor _, entry := range entries {\n\t\tinfo, err := entry.Info()\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestDirs = append(testDirs, info)\n\t}\n\n\tbuilder := NewDockerFileBuilder()\n\n\tfor _, tdInfo := range testDirs {\n\t\tname := tdInfo.Name()\n\t\ttestDir := filepath.Join(dir, name)\n\n\t\tt.Run(\"test_k8s_with_context_\"+name, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\tif err := builder.BuildDockerImage(\n\t\t\t\tt, config.imageRepo, \"\", name, testDir,\n\t\t\t); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tdockerImage := GetDockerImage(config.imageRepo, name)\n\t\t\tkanikoImage := GetKanikoImage(config.imageRepo, name)\n\n\t\t\ttmpfile, err := os.CreateTemp(\"\", \"k8s-job-*.yaml\")\n\t\t\tif err != nil {\n\t\t\t\tlog.Fatal(err)\n\t\t\t}\n\t\t\tdefer os.Remove(tmpfile.Name()) // clean up\n\t\t\ttmpl := template.Must(template.ParseFiles(\"k8s-job.yaml\"))\n\t\t\tjob := K8sConfig{KanikoImage: kanikoImage, Context: testDir, Name: name}\n\t\t\tif err := tmpl.Execute(tmpfile, job); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tt.Logf(\"Testing K8s based Kaniko building of dockerfile %s and push to %s \\n\",\n\t\t\t\ttestDir, kanikoImage)\n\t\t\tcontent, err := os.ReadFile(tmpfile.Name())\n\t\t\tif err != nil {\n\t\t\t\tlog.Fatal(err)\n\t\t\t}\n\t\t\tt.Logf(\"K8s template %s:\\n%s\\n\", tmpfile.Name(), content)\n\n\t\t\tkubeCmd := exec.Command(\"kubectl\", \"apply\", \"-f\", tmpfile.Name())\n\t\t\tRunCommand(kubeCmd, t)\n\n\t\t\tt.Logf(\"Waiting for K8s kaniko build job to finish: %s\\n\",\n\t\t\t\t\"job/kaniko-test-\"+job.Name)\n\n\t\t\tkubeWaitCmd := exec.Command(\"kubectl\", \"wait\", \"--for=condition=complete\", \"--timeout=2m\",\n\t\t\t\t\"job/kaniko-test-\"+job.Name)\n\t\t\tif out, errR := RunCommandWithoutTest(kubeWaitCmd); errR != nil {\n\t\t\t\tt.Log(kubeWaitCmd.Args)\n\t\t\t\tt.Log(string(out))\n\t\t\t\tdescCmd := exec.Command(\"kubectl\", \"describe\", \"job/kaniko-test-\"+job.Name)\n\t\t\t\toutD, errD := RunCommandWithoutTest(descCmd)\n\t\t\t\tif errD != nil {\n\t\t\t\t\tt.Error(errD)\n\t\t\t\t} else {\n\t\t\t\t\tt.Log(string(outD))\n\t\t\t\t}\n\n\t\t\t\tdescCmd = exec.Command(\"kubectl\", \"describe\", \"pods\", \"--selector\", \"job-name=kaniko-test-\"+job.Name)\n\t\t\t\toutD, errD = RunCommandWithoutTest(descCmd)\n\t\t\t\tif errD != nil {\n\t\t\t\t\tt.Error(errD)\n\t\t\t\t} else {\n\t\t\t\t\tt.Log(string(outD))\n\t\t\t\t}\n\n\t\t\t\tlogsCmd := exec.Command(\"kubectl\", \"logs\", \"--all-containers\", \"job/kaniko-test-\"+job.Name)\n\t\t\t\toutL, errL := RunCommandWithoutTest(logsCmd)\n\t\t\t\tif errL != nil {\n\t\t\t\t\tt.Error(errL)\n\t\t\t\t} else {\n\t\t\t\t\tt.Log(string(outL))\n\t\t\t\t}\n\n\t\t\t\tt.Fatal(errR)\n\t\t\t}\n\n\t\t\tdiff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, \"--no-cache\")\n\n\t\t\texpected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage)\n\t\t\tcheckContainerDiffOutput(t, diff, expected)\n\t\t})\n\t}\n\n\tif err := logBenchmarks(\"benchmark\"); err != nil {\n\t\tt.Logf(\"Failed to create benchmark file: %v\", err)\n\t}\n}\n"
  },
  {
    "path": "integration/tar.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage integration\n\nimport (\n\t\"compress/gzip\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n)\n\n// CreateIntegrationTarball will take the contents of the integration directory and write\n// them to a tarball in a temmporary dir. It will return the path to the tarball.\nfunc CreateIntegrationTarball() (string, error) {\n\tlog.Println(\"Creating tarball of integration test files to use as build context\")\n\tdir, err := os.Getwd()\n\tif err != nil {\n\t\treturn \"nil\", fmt.Errorf(\"Failed find path to integration dir: %w\", err)\n\t}\n\ttempDir, err := os.MkdirTemp(\"\", \"\")\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"Failed to create temporary directory to hold tarball: %w\", err)\n\t}\n\tcontextFilePath := fmt.Sprintf(\"%s/context_%d.tar.gz\", tempDir, time.Now().UnixNano())\n\n\tfile, err := os.OpenFile(contextFilePath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tgzipWriter := gzip.NewWriter(file)\n\tdefer gzipWriter.Close()\n\n\terr = util.CreateTarballOfDirectory(dir, file)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"creating tarball of integration dir: %w\", err)\n\t}\n\n\treturn contextFilePath, nil\n}\n"
  },
  {
    "path": "integration/testdata/Dockerfile.trivial",
    "content": "FROM ubuntu\nRUN echo Hello"
  },
  {
    "path": "integration/testdata/build.yaml",
    "content": "schemaVersion: \"1.0.0\"\ncommandTests:\n- name: Trivial build\n  command: [\"/kaniko/executor\", \"--no-push\", \"--dockerfile\", \"./Dockerfile.trivial\"]\n  exitCode: 0\n"
  },
  {
    "path": "integration/testdata/exec.yaml",
    "content": "schemaVersion: \"1.0.0\"\ncommandTests:\n- name: check fixed name\n  command: [\"/kaniko/executor\"]\n  expectedError: ['Usage:']\n  exitCode: 1\n- name: check PATH\n  command: [\"executor\"]\n  expectedError: ['Usage:']\n  exitCode: 1\n"
  },
  {
    "path": "integration/testdata/exit-code-propagation/Dockerfile_exit_code_propagation",
    "content": "FROM alpine:latest\n\nRUN exit 42\n\nCMD [\"sleep\", \"1\"]\n"
  },
  {
    "path": "integration/testdata/files.yaml",
    "content": "schemaVersion: \"1.0.0\"\nfileExistenceTests:\n# Basic FS sanity checks.\n- name: root\n  path: '/'\n  shouldExist: true\n- name: certs\n  path: '/kaniko/ssl/certs/ca-certificates.crt'\n  shouldExist: true\n- name: certs\n  path: '/etc/nsswitch.conf'\n  shouldExist: true\n"
  },
  {
    "path": "integration/testdata/testfiles.yaml",
    "content": "schemaVersion: \"1.0.0\"\nfileExistenceTests:\n# Basic FS sanity checks.\n- name: trivial testdata Dockerfile\n  path: '/workspace/Dockerfile.trivial'\n  shouldExist: true\n"
  },
  {
    "path": "logo/README.md",
    "content": "Thank you @ggcarlosr for this awesome logo!"
  },
  {
    "path": "pkg/buildcontext/azureblob.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage buildcontext\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob\"\n\tkConfig \"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/constants\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n)\n\n// AzureBlob struct for Azure Blob Storage processing\ntype AzureBlob struct {\n\tcontext string\n}\n\n// Download context file from given azure blob storage url and unpack it to BuildContextDir\nfunc (b *AzureBlob) UnpackTarFromBuildContext() (string, error) {\n\n\t// Get Azure_STORAGE_ACCESS_KEY from environment variables\n\taccountKey := os.Getenv(\"AZURE_STORAGE_ACCESS_KEY\")\n\tif len(accountKey) == 0 {\n\t\treturn \"\", errors.New(\"AZURE_STORAGE_ACCESS_KEY environment variable is not set\")\n\t}\n\n\t// Get storage accountName for Azure Blob Storage\n\tparts, err := azblob.ParseURL(b.context)\n\tif err != nil {\n\t\treturn parts.Host, err\n\t}\n\taccountName := strings.Split(parts.Host, \".\")[0]\n\n\t// Generate credential with accountName and accountKey\n\tcredential, err := azblob.NewSharedKeyCredential(accountName, accountKey)\n\tif err != nil {\n\t\treturn parts.Host, err\n\t}\n\n\t// Create directory and target file for downloading the context file\n\tdirectory := kConfig.BuildContextDir\n\ttarPath := filepath.Join(directory, constants.ContextTar)\n\tfile, err := util.CreateTargetTarfile(tarPath)\n\tif err != nil {\n\t\treturn tarPath, err\n\t}\n\n\t// Downloading context file from Azure Blob Storage\n\tclient, err := azblob.NewClientWithSharedKeyCredential(b.context, credential, nil)\n\tif err != nil {\n\t\treturn parts.Host, err\n\t}\n\tctx := context.Background()\n\n\tif _, err := client.DownloadFile(ctx, parts.ContainerName, parts.BlobName, file, nil); err != nil {\n\t\treturn parts.Host, err\n\t}\n\n\tif err := util.UnpackCompressedTar(tarPath, directory); err != nil {\n\t\treturn tarPath, err\n\t}\n\t// Remove the tar so it doesn't interfere with subsequent commands\n\treturn directory, os.Remove(tarPath)\n}\n"
  },
  {
    "path": "pkg/buildcontext/buildcontext.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage buildcontext\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/constants\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n)\n\nconst (\n\tTarBuildContextPrefix = \"tar://\"\n)\n\ntype BuildOptions struct {\n\tGitBranch            string\n\tGitSingleBranch      bool\n\tGitRecurseSubmodules bool\n\tInsecureSkipTLS      bool\n}\n\n// BuildContext unifies calls to download and unpack the build context.\ntype BuildContext interface {\n\t// Unpacks a build context and returns the directory where it resides\n\tUnpackTarFromBuildContext() (string, error)\n}\n\n// GetBuildContext parses srcContext for the prefix and returns related buildcontext\n// parser\nfunc GetBuildContext(srcContext string, opts BuildOptions) (BuildContext, error) {\n\tsplit := strings.SplitAfter(srcContext, \"://\")\n\tif len(split) > 1 {\n\t\tprefix := split[0]\n\t\tcontext := split[1]\n\n\t\tswitch prefix {\n\t\tcase constants.GCSBuildContextPrefix:\n\t\t\treturn &GCS{context: srcContext}, nil\n\t\tcase constants.S3BuildContextPrefix:\n\t\t\treturn &S3{context: srcContext}, nil\n\t\tcase constants.LocalDirBuildContextPrefix:\n\t\t\treturn &Dir{context: context}, nil\n\t\tcase constants.GitBuildContextPrefix:\n\t\t\treturn &Git{context: context, opts: opts}, nil\n\t\tcase constants.HTTPSBuildContextPrefix:\n\t\t\tif util.ValidAzureBlobStorageHost(srcContext) {\n\t\t\t\treturn &AzureBlob{context: srcContext}, nil\n\t\t\t}\n\t\t\treturn &HTTPSTar{context: srcContext}, nil\n\t\tcase TarBuildContextPrefix:\n\t\t\treturn &Tar{context: context}, nil\n\t\t}\n\t}\n\treturn nil, errors.New(\"unknown build context prefix provided, please use one of the following: gs://, dir://, tar://, s3://, git://, https://\")\n}\n"
  },
  {
    "path": "pkg/buildcontext/dir.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage buildcontext\n\n// Dir unifies calls to download and unpack the build context.\ntype Dir struct {\n\tcontext string\n}\n\n// UnpackTarFromBuildContext just provides a directory with already extracted content\nfunc (f *Dir) UnpackTarFromBuildContext() (string, error) {\n\treturn f.context, nil\n}\n"
  },
  {
    "path": "pkg/buildcontext/gcs.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage buildcontext\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\n\tkConfig \"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/constants\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util/bucket\"\n\t\"github.com/sirupsen/logrus\"\n\t\"golang.org/x/net/context\"\n)\n\n// GCS struct for Google Cloud Storage processing\ntype GCS struct {\n\tcontext string\n}\n\nfunc (g *GCS) UnpackTarFromBuildContext() (string, error) {\n\tbucketName, filepath, err := bucket.GetNameAndFilepathFromURI(g.context)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"getting bucketname and filepath from context: %w\", err)\n\t}\n\treturn kConfig.BuildContextDir, unpackTarFromGCSBucket(bucketName, filepath, kConfig.BuildContextDir)\n}\n\nfunc UploadToBucket(r io.Reader, dest string) error {\n\tctx := context.Background()\n\tbucketName, filepath, err := bucket.GetNameAndFilepathFromURI(dest)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"getting bucketname and filepath from dest: %w\", err)\n\t}\n\tclient, err := bucket.NewClient(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn bucket.Upload(ctx, bucketName, filepath, r, client)\n}\n\n// unpackTarFromGCSBucket unpacks the context.tar.gz file in the given bucket to the given directory\nfunc unpackTarFromGCSBucket(bucketName, item, directory string) error {\n\t// Get the tar from the bucket\n\ttarPath, err := getTarFromBucket(bucketName, item, directory)\n\tif err != nil {\n\t\treturn err\n\t}\n\tlogrus.Debug(\"Unpacking source context tar...\")\n\tif err := util.UnpackCompressedTar(tarPath, directory); err != nil {\n\t\treturn err\n\t}\n\t// Remove the tar so it doesn't interfere with subsequent commands\n\tlogrus.Debugf(\"Deleting %s\", tarPath)\n\treturn os.Remove(tarPath)\n}\n\n// getTarFromBucket gets context.tar.gz from the GCS bucket and saves it to the filesystem\n// It returns the path to the tar file\nfunc getTarFromBucket(bucketName, filepathInBucket, directory string) (string, error) {\n\tctx := context.Background()\n\tclient, err := bucket.NewClient(ctx)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\t// Get the tarfile context.tar.gz from the GCS bucket, and save it to a tar object\n\treader, err := bucket.ReadCloser(ctx, bucketName, filepathInBucket, client)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tdefer reader.Close()\n\ttarPath := filepath.Join(directory, constants.ContextTar)\n\tif err := util.CreateFile(tarPath, reader, 0600, 0, 0); err != nil {\n\t\treturn \"\", err\n\t}\n\tlogrus.Debugf(\"Copied tarball %s from GCS bucket %s to %s\", constants.ContextTar, bucketName, tarPath)\n\treturn tarPath, nil\n}\n"
  },
  {
    "path": "pkg/buildcontext/git.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage buildcontext\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\n\tkConfig \"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/go-git/go-billy/v5/osfs\"\n\t\"github.com/go-git/go-git/v5\"\n\t\"github.com/go-git/go-git/v5/config\"\n\t\"github.com/go-git/go-git/v5/plumbing\"\n\t\"github.com/go-git/go-git/v5/plumbing/cache\"\n\t\"github.com/go-git/go-git/v5/plumbing/transport\"\n\t\"github.com/go-git/go-git/v5/plumbing/transport/http\"\n\t\"github.com/go-git/go-git/v5/storage/filesystem\"\n\t\"github.com/sirupsen/logrus\"\n)\n\nconst (\n\tgitPullMethodEnvKey = \"GIT_PULL_METHOD\"\n\tgitPullMethodHTTPS  = \"https\"\n\tgitPullMethodHTTP   = \"http\"\n\n\tgitAuthUsernameEnvKey = \"GIT_USERNAME\"\n\tgitAuthPasswordEnvKey = \"GIT_PASSWORD\"\n\tgitAuthTokenEnvKey    = \"GIT_TOKEN\"\n)\n\nvar (\n\tsupportedGitPullMethods = map[string]bool{gitPullMethodHTTPS: true, gitPullMethodHTTP: true}\n)\n\n// Git unifies calls to download and unpack the build context.\ntype Git struct {\n\tcontext string\n\topts    BuildOptions\n}\n\n// UnpackTarFromBuildContext will provide the directory where Git Repository is Cloned\nfunc (g *Git) UnpackTarFromBuildContext() (string, error) {\n\tdirectory := kConfig.BuildContextDir\n\tparts := strings.Split(g.context, \"#\")\n\turl := getGitPullMethod() + \"://\" + parts[0]\n\toptions := git.CloneOptions{\n\t\tURL:               url,\n\t\tAuth:              getGitAuth(),\n\t\tProgress:          os.Stdout,\n\t\tSingleBranch:      g.opts.GitSingleBranch,\n\t\tRecurseSubmodules: getRecurseSubmodules(g.opts.GitRecurseSubmodules),\n\t\tInsecureSkipTLS:   g.opts.InsecureSkipTLS,\n\t}\n\tvar fetchRef string\n\tvar checkoutRef string\n\tif len(parts) > 1 {\n\t\tif plumbing.IsHash(parts[1]) || !strings.HasPrefix(parts[1], \"refs/pull/\") {\n\t\t\t// Handle any non-branch refs separately. First, clone the repo HEAD, and\n\t\t\t// then fetch and check out the fetchRef.\n\t\t\tfetchRef = parts[1]\n\t\t\tif plumbing.IsHash(parts[1]) {\n\t\t\t\tcheckoutRef = fetchRef\n\t\t\t} else {\n\t\t\t\t// The ReferenceName still needs to be present in the options passed\n\t\t\t\t// to the clone operation for non-hash references of private repositories.\n\t\t\t\toptions.ReferenceName = plumbing.ReferenceName(fetchRef)\n\t\t\t}\n\t\t} else {\n\t\t\t// Branches will be cloned directly.\n\t\t\toptions.ReferenceName = plumbing.ReferenceName(parts[1])\n\t\t}\n\t}\n\n\tif branch := g.opts.GitBranch; branch != \"\" {\n\t\tref, err := getGitReferenceName(directory, url, branch)\n\t\tif err != nil {\n\t\t\treturn directory, err\n\t\t}\n\t\toptions.ReferenceName = ref\n\t}\n\n\tlogrus.Debugf(\"Getting source from reference %s\", options.ReferenceName)\n\tr, err := git.PlainClone(directory, false, &options)\n\tif err != nil {\n\t\treturn directory, err\n\t}\n\n\tif fetchRef != \"\" {\n\t\terr = r.Fetch(&git.FetchOptions{\n\t\t\tRemoteName: \"origin\",\n\t\t\tAuth:       getGitAuth(),\n\t\t\tRefSpecs:   []config.RefSpec{config.RefSpec(fetchRef + \":\" + fetchRef)},\n\t\t})\n\t\tif err != nil && !errors.Is(err, git.NoErrAlreadyUpToDate) {\n\t\t\treturn directory, err\n\t\t}\n\t}\n\n\tif len(parts) > 2 {\n\t\tcheckoutRef = parts[2]\n\t}\n\tif checkoutRef != \"\" {\n\t\t// ... retrieving the commit being pointed by HEAD\n\t\t_, err := r.Head()\n\t\tif err != nil {\n\t\t\treturn directory, err\n\t\t}\n\n\t\tw, err := r.Worktree()\n\t\tif err != nil {\n\t\t\treturn directory, err\n\t\t}\n\n\t\t// ... checking out to desired commit\n\t\terr = w.Checkout(&git.CheckoutOptions{\n\t\t\tHash: plumbing.NewHash(checkoutRef),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn directory, err\n\t\t}\n\t}\n\treturn directory, nil\n}\n\nfunc getGitReferenceName(directory string, url string, branch string) (plumbing.ReferenceName, error) {\n\tvar remote = git.NewRemote(\n\t\tfilesystem.NewStorage(\n\t\t\tosfs.New(directory),\n\t\t\tcache.NewObjectLRUDefault(),\n\t\t),\n\t\t&config.RemoteConfig{\n\t\t\tURLs: []string{url},\n\t\t},\n\t)\n\n\trefs, err := remote.List(&git.ListOptions{\n\t\tAuth: getGitAuth(),\n\t})\n\tif err != nil {\n\t\treturn plumbing.HEAD, err\n\t}\n\n\tif ref := plumbing.NewBranchReferenceName(branch); gitRefExists(ref, refs) {\n\t\treturn ref, nil\n\t}\n\n\tif ref := plumbing.NewTagReferenceName(branch); gitRefExists(ref, refs) {\n\t\treturn ref, nil\n\t}\n\n\treturn plumbing.HEAD, fmt.Errorf(\"invalid branch: %s\", branch)\n}\n\nfunc gitRefExists(ref plumbing.ReferenceName, refs []*plumbing.Reference) bool {\n\tfor _, ref2 := range refs {\n\t\tif ref.String() == ref2.Name().String() {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc getRecurseSubmodules(v bool) git.SubmoduleRescursivity {\n\tif v {\n\t\treturn git.DefaultSubmoduleRecursionDepth\n\t}\n\treturn git.NoRecurseSubmodules\n}\n\nfunc getGitAuth() transport.AuthMethod {\n\tusername := os.Getenv(gitAuthUsernameEnvKey)\n\tpassword := os.Getenv(gitAuthPasswordEnvKey)\n\ttoken := os.Getenv(gitAuthTokenEnvKey)\n\tif token != \"\" {\n\t\tusername = token\n\t\tpassword = \"\"\n\t}\n\tif username != \"\" || password != \"\" {\n\t\treturn &http.BasicAuth{\n\t\t\tUsername: username,\n\t\t\tPassword: password,\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc getGitPullMethod() string {\n\tgitPullMethod := os.Getenv(gitPullMethodEnvKey)\n\tif ok := supportedGitPullMethods[gitPullMethod]; !ok {\n\t\tgitPullMethod = gitPullMethodHTTPS\n\t}\n\treturn gitPullMethod\n}\n"
  },
  {
    "path": "pkg/buildcontext/git_test.go",
    "content": "/*\nCopyright 2020 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage buildcontext\n\nimport (\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\t\"github.com/go-git/go-git/v5/plumbing/transport\"\n\t\"github.com/go-git/go-git/v5/plumbing/transport/http\"\n)\n\nfunc TestGetGitPullMethod(t *testing.T) {\n\ttests := []struct {\n\t\ttestName string\n\t\tsetEnv   func() (expectedValue string)\n\t}{\n\t\t{\n\t\t\ttestName: \"noEnv\",\n\t\t\tsetEnv: func() (expectedValue string) {\n\t\t\t\texpectedValue = gitPullMethodHTTPS\n\t\t\t\treturn\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttestName: \"emptyEnv\",\n\t\t\tsetEnv: func() (expectedValue string) {\n\t\t\t\t_ = os.Setenv(gitPullMethodEnvKey, \"\")\n\t\t\t\texpectedValue = gitPullMethodHTTPS\n\t\t\t\treturn\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttestName: \"httpEnv\",\n\t\t\tsetEnv: func() (expectedValue string) {\n\t\t\t\terr := os.Setenv(gitPullMethodEnvKey, gitPullMethodHTTP)\n\t\t\t\tif nil != err {\n\t\t\t\t\texpectedValue = gitPullMethodHTTPS\n\t\t\t\t} else {\n\t\t\t\t\texpectedValue = gitPullMethodHTTP\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttestName: \"httpsEnv\",\n\t\t\tsetEnv: func() (expectedValue string) {\n\t\t\t\t_ = os.Setenv(gitPullMethodEnvKey, gitPullMethodHTTPS)\n\t\t\t\texpectedValue = gitPullMethodHTTPS\n\t\t\t\treturn\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttestName: \"unknownEnv\",\n\t\t\tsetEnv: func() (expectedValue string) {\n\t\t\t\t_ = os.Setenv(gitPullMethodEnvKey, \"unknown\")\n\t\t\t\texpectedValue = gitPullMethodHTTPS\n\t\t\t\treturn\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.testName, func(t *testing.T) {\n\t\t\texpectedValue := tt.setEnv()\n\t\t\ttestutil.CheckDeepEqual(t, expectedValue, getGitPullMethod())\n\t\t})\n\t}\n}\n\nfunc TestGetGitAuth(t *testing.T) {\n\ttests := []struct {\n\t\ttestName string\n\t\tsetEnv   func() (expectedValue transport.AuthMethod)\n\t}{\n\t\t{\n\t\t\ttestName: \"noEnv\",\n\t\t\tsetEnv: func() (expectedValue transport.AuthMethod) {\n\t\t\t\texpectedValue = nil\n\t\t\t\treturn\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttestName: \"emptyUsernameEnv\",\n\t\t\tsetEnv: func() (expectedValue transport.AuthMethod) {\n\t\t\t\t_ = os.Setenv(gitAuthUsernameEnvKey, \"\")\n\t\t\t\texpectedValue = nil\n\t\t\t\treturn\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttestName: \"emptyPasswordEnv\",\n\t\t\tsetEnv: func() (expectedValue transport.AuthMethod) {\n\t\t\t\t_ = os.Setenv(gitAuthPasswordEnvKey, \"\")\n\t\t\t\texpectedValue = nil\n\t\t\t\treturn\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttestName: \"emptyEnv\",\n\t\t\tsetEnv: func() (expectedValue transport.AuthMethod) {\n\t\t\t\t_ = os.Setenv(gitAuthUsernameEnvKey, \"\")\n\t\t\t\t_ = os.Setenv(gitAuthPasswordEnvKey, \"\")\n\t\t\t\texpectedValue = nil\n\t\t\t\treturn\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttestName: \"withUsername\",\n\t\t\tsetEnv: func() (expectedValue transport.AuthMethod) {\n\t\t\t\tusername := \"foo\"\n\t\t\t\t_ = os.Setenv(gitAuthUsernameEnvKey, username)\n\t\t\t\texpectedValue = &http.BasicAuth{Username: username}\n\t\t\t\treturn\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttestName: \"withPassword\",\n\t\t\tsetEnv: func() (expectedValue transport.AuthMethod) {\n\t\t\t\tpass := \"super-secret-password-1234\"\n\t\t\t\t_ = os.Setenv(gitAuthPasswordEnvKey, pass)\n\t\t\t\texpectedValue = &http.BasicAuth{Password: pass}\n\t\t\t\treturn\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttestName: \"withUsernamePassword\",\n\t\t\tsetEnv: func() (expectedValue transport.AuthMethod) {\n\t\t\t\tusername := \"foo\"\n\t\t\t\tpass := \"super-secret-password-1234\"\n\t\t\t\t_ = os.Setenv(gitAuthUsernameEnvKey, username)\n\t\t\t\t_ = os.Setenv(gitAuthPasswordEnvKey, pass)\n\t\t\t\texpectedValue = &http.BasicAuth{Username: username, Password: pass}\n\t\t\t\treturn\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttestName: \"withToken\",\n\t\t\tsetEnv: func() (expectedValue transport.AuthMethod) {\n\t\t\t\ttoken := \"some-other-token\"\n\t\t\t\t_ = os.Setenv(gitAuthTokenEnvKey, token)\n\t\t\t\texpectedValue = &http.BasicAuth{Username: token}\n\t\t\t\treturn\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttestName: \"withTokenUsernamePassword\",\n\t\t\tsetEnv: func() (expectedValue transport.AuthMethod) {\n\t\t\t\tusername := \"foo-user\"\n\t\t\t\ttoken := \"some-token-45678\"\n\t\t\t\tpass := \"some-password-12345\"\n\t\t\t\t_ = os.Setenv(gitAuthUsernameEnvKey, username)\n\t\t\t\t_ = os.Setenv(gitAuthPasswordEnvKey, pass)\n\t\t\t\t_ = os.Setenv(gitAuthTokenEnvKey, token)\n\t\t\t\texpectedValue = &http.BasicAuth{Username: token}\n\t\t\t\treturn\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.testName, func(t *testing.T) {\n\t\t\t// Make sure to unset environment vars to get a clean test each time\n\t\t\tdefer clearTestAuthEnv()\n\n\t\t\texpectedValue := tt.setEnv()\n\t\t\ttestutil.CheckDeepEqual(t, expectedValue, getGitAuth())\n\t\t})\n\t}\n\n}\n\nfunc clearTestAuthEnv() {\n\t_ = os.Unsetenv(gitAuthUsernameEnvKey)\n\t_ = os.Unsetenv(gitAuthPasswordEnvKey)\n}\n"
  },
  {
    "path": "pkg/buildcontext/https.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage buildcontext\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\n\tkConfig \"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/constants\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/sirupsen/logrus\"\n)\n\n// HTTPSTar struct for https tar.gz files processing\ntype HTTPSTar struct {\n\tcontext string\n}\n\n// UnpackTarFromBuildContext downloads context file from https server\nfunc (h *HTTPSTar) UnpackTarFromBuildContext() (directory string, err error) {\n\n\tlogrus.Info(\"Retrieving https tar file\")\n\n\t// Create directory and target file for downloading the context file\n\tdirectory = kConfig.BuildContextDir\n\ttarPath := filepath.Join(directory, constants.ContextTar)\n\tfile, err := util.CreateTargetTarfile(tarPath)\n\tif err != nil {\n\t\treturn\n\t}\n\n\t// Download tar file from remote https server\n\t// and save it into the target tar file\n\tresp, err := http.Get(h.context) //nolint:noctx\n\tif err != nil {\n\t\treturn\n\t}\n\tdefer func() {\n\t\tif closeErr := resp.Body.Close(); err == nil && closeErr != nil {\n\t\t\terr = closeErr\n\t\t}\n\t}()\n\n\tif resp.StatusCode != http.StatusOK {\n\t\treturn directory, fmt.Errorf(\"HTTPSTar bad status from server: %s\", resp.Status)\n\t}\n\n\tif _, err = io.Copy(file, resp.Body); err != nil {\n\t\treturn tarPath, err\n\t}\n\n\tlogrus.Info(\"Retrieved https tar file\")\n\n\tif err = util.UnpackCompressedTar(tarPath, directory); err != nil {\n\t\treturn\n\t}\n\n\tlogrus.Info(\"Extracted https tar file\")\n\n\t// Remove the tar so it doesn't interfere with subsequent commands\n\treturn directory, os.Remove(tarPath)\n}\n"
  },
  {
    "path": "pkg/buildcontext/https_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage buildcontext\n\nimport (\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"testing\"\n)\n\nfunc TestBuildWithHttpsTar(t *testing.T) {\n\n\ttests := []struct {\n\t\tname          string\n\t\tserverHandler http.HandlerFunc\n\t}{\n\t\t{\n\t\t\tname: \"test http bad status\",\n\t\t\tserverHandler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\t\t\tw.WriteHeader(http.StatusBadRequest)\n\t\t\t\t_, err := w.Write([]byte(\"corrupted message\"))\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"Error sending response: %v\", err)\n\t\t\t\t}\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"test http bad data\",\n\t\t\tserverHandler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\t\t\tw.WriteHeader(http.StatusOK)\n\t\t\t\t_, err := w.Write([]byte(\"corrupted message\"))\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"Error sending response: %v\", err)\n\t\t\t\t}\n\t\t\t}),\n\t\t},\n\t}\n\n\tfor _, tcase := range tests {\n\t\tt.Run(tcase.name, func(t *testing.T) {\n\t\t\tserver := httptest.NewServer(tcase.serverHandler)\n\t\t\tdefer server.Close()\n\n\t\t\tcontext := &HTTPSTar{\n\t\t\t\tcontext: server.URL + \"/data.tar.gz\",\n\t\t\t}\n\n\t\t\t_, err := context.UnpackTarFromBuildContext()\n\t\t\tif err == nil {\n\t\t\t\tt.Fatalf(\"Error expected but not returned: %s\", err)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/buildcontext/s3.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage buildcontext\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\tkConfig \"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/constants\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util/bucket\"\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/config\"\n\ts3manager \"github.com/aws/aws-sdk-go-v2/feature/s3/manager\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3\"\n)\n\n// S3 unifies calls to download and unpack the build context.\ntype S3 struct {\n\tcontext string\n}\n\n// UnpackTarFromBuildContext download and untar a file from s3\nfunc (s *S3) UnpackTarFromBuildContext() (string, error) {\n\tbucket, item, err := bucket.GetNameAndFilepathFromURI(s.context)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"getting bucketname and filepath from context: %w\", err)\n\t}\n\n\tendpoint := os.Getenv(constants.S3EndpointEnv)\n\tforcePath := false\n\tif strings.ToLower(os.Getenv(constants.S3ForcePathStyle)) == \"true\" {\n\t\tforcePath = true\n\t}\n\n\tcustomResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {\n\t\tif endpoint != \"\" {\n\t\t\treturn aws.Endpoint{\n\t\t\t\tURL: endpoint,\n\t\t\t}, nil\n\t\t}\n\t\treturn aws.Endpoint{}, &aws.EndpointNotFoundError{}\n\t})\n\n\tcfg, err := config.LoadDefaultConfig(context.TODO(), config.WithEndpointResolverWithOptions(customResolver))\n\tif err != nil {\n\t\treturn bucket, err\n\t}\n\tclient := s3.NewFromConfig(cfg, func(options *s3.Options) {\n\t\tif endpoint != \"\" {\n\t\t\toptions.UsePathStyle = forcePath\n\t\t}\n\t})\n\tdownloader := s3manager.NewDownloader(client)\n\tdirectory := kConfig.BuildContextDir\n\ttarPath := filepath.Join(directory, constants.ContextTar)\n\tif err := os.MkdirAll(directory, 0750); err != nil {\n\t\treturn directory, err\n\t}\n\tfile, err := os.Create(tarPath)\n\tif err != nil {\n\t\treturn directory, err\n\t}\n\t_, err = downloader.Download(context.TODO(), file,\n\t\t&s3.GetObjectInput{\n\t\t\tBucket: aws.String(bucket),\n\t\t\tKey:    aws.String(item),\n\t\t})\n\tif err != nil {\n\t\treturn directory, err\n\t}\n\n\treturn directory, util.UnpackCompressedTar(tarPath, directory)\n}\n"
  },
  {
    "path": "pkg/buildcontext/tar.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage buildcontext\n\nimport (\n\t\"compress/gzip\"\n\t\"fmt\"\n\t\"os\"\n\n\tkConfig \"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n)\n\n// Tar unifies calls to download and unpack the build context.\ntype Tar struct {\n\tcontext string\n}\n\n// UnpackTarFromBuildContext unpack the compressed tar file\nfunc (t *Tar) UnpackTarFromBuildContext() (string, error) {\n\tdirectory := kConfig.BuildContextDir\n\tif err := os.MkdirAll(directory, 0750); err != nil {\n\t\treturn \"\", errors.Wrap(err, \"unpacking tar from build context\")\n\t}\n\tif t.context == \"stdin\" {\n\t\tfi, _ := os.Stdin.Stat()\n\t\tif (fi.Mode() & os.ModeCharDevice) != 0 {\n\t\t\treturn \"\", fmt.Errorf(\"no data found.. don't forget to add the '--interactive, -i' flag\")\n\t\t}\n\t\tlogrus.Infof(\"To simulate EOF and exit, press 'Ctrl+D'\")\n\t\t// if launched through docker in interactive mode and without piped data\n\t\t// process will be stuck here until EOF is sent\n\t\tgzr, err := gzip.NewReader(os.Stdin)\n\t\tif err != nil {\n\t\t\treturn directory, err\n\t\t}\n\t\tdefer gzr.Close()\n\t\t_, err = util.UnTar(gzr, directory)\n\n\t\treturn directory, err\n\n\t}\n\n\treturn directory, util.UnpackCompressedTar(t.context, directory)\n}\n"
  },
  {
    "path": "pkg/buildcontext/tar_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage buildcontext\n\nimport (\n\t\"bytes\"\n\t\"compress/gzip\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"sync\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n)\n\nfunc TestBuildWithLocalTar(t *testing.T) {\n\t_, ex, _, _ := runtime.Caller(0)\n\tcwd := filepath.Dir(ex)\n\n\ttestDir := \"test_dir\"\n\ttestDirLongPath := filepath.Join(cwd, testDir)\n\tdirUnpack := filepath.Join(testDirLongPath, \"dir_where_to_unpack\")\n\n\tif err := os.MkdirAll(dirUnpack, 0750); err != nil {\n\t\tt.Errorf(\"Failed to create dir_where_to_extract: %v\", err)\n\t}\n\n\tvalidDockerfile := \"Dockerfile_valid\"\n\tinvalidDockerfile := \"Dockerfile_invalid\"\n\tnonExistingDockerfile := \"Dockerfile_non_existing\"\n\n\tfiles := map[string]string{\n\t\tvalidDockerfile:   \"FROM debian:10.13\\nRUN echo \\\"valid\\\"\",\n\t\tinvalidDockerfile: \"FROM debian:10.13\\nRUN echo \\\"invalid\\\"\",\n\t}\n\n\tif err := testutil.SetupFiles(testDir, files); err != nil {\n\t\tt.Errorf(\"Failed to setup files %v on %s: %v\", files, testDir, err)\n\t}\n\n\tif err := os.Chdir(testDir); err != nil {\n\t\tt.Fatalf(\"Failed to Chdir on %s: %v\", testDir, err)\n\t}\n\n\tvalidTarPath := fmt.Sprintf(\"%s.tar.gz\", validDockerfile)\n\tinvalidTarPath := fmt.Sprintf(\"%s.tar.gz\", invalidDockerfile)\n\tnonExistingTarPath := fmt.Sprintf(\"%s.tar.gz\", nonExistingDockerfile)\n\n\tvar wg sync.WaitGroup\n\twg.Add(1)\n\t// Create Tar Gz File with dockerfile inside\n\tgo func(wg *sync.WaitGroup) {\n\t\tdefer wg.Done()\n\t\tvalidTarFile, err := os.Create(validTarPath)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Failed to create %s: %v\", validTarPath, err)\n\t\t}\n\t\tdefer validTarFile.Close()\n\n\t\tinvalidTarFile, err := os.Create(invalidTarPath)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Failed to create %s: %v\", invalidTarPath, err)\n\t\t}\n\t\tdefer invalidTarFile.Close()\n\n\t\tgw := gzip.NewWriter(validTarFile)\n\t\tdefer gw.Close()\n\n\t\ttw := util.NewTar(gw)\n\t\tdefer tw.Close()\n\n\t\tif err := tw.AddFileToTar(validDockerfile); err != nil {\n\t\t\tt.Errorf(\"Failed to add %s to %s: %v\", validDockerfile, validTarPath, err)\n\t\t}\n\t}(&wg)\n\n\t// Waiting for the Tar Gz file creation to be done before moving on\n\twg.Wait()\n\n\ttests := []struct {\n\t\tdockerfile       string\n\t\tsrcContext       string\n\t\tunpackShouldErr  bool\n\t\tsrcShaShouldErr  bool\n\t\tdestShaShouldErr bool\n\t}{\n\t\t{\n\t\t\tdockerfile:       validDockerfile,\n\t\t\tsrcContext:       filepath.Join(testDir, validTarPath),\n\t\t\tunpackShouldErr:  false,\n\t\t\tsrcShaShouldErr:  false,\n\t\t\tdestShaShouldErr: false,\n\t\t},\n\t\t{\n\t\t\tdockerfile:       invalidDockerfile,\n\t\t\tsrcContext:       filepath.Join(testDir, invalidTarPath),\n\t\t\tunpackShouldErr:  true,\n\t\t\tsrcShaShouldErr:  false,\n\t\t\tdestShaShouldErr: true,\n\t\t},\n\t\t{\n\t\t\tdockerfile:       nonExistingDockerfile,\n\t\t\tsrcContext:       filepath.Join(testDir, nonExistingTarPath),\n\t\t\tunpackShouldErr:  true,\n\t\t\tsrcShaShouldErr:  true,\n\t\t\tdestShaShouldErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.dockerfile, func(t *testing.T) {\n\t\t\terr := util.UnpackCompressedTar(filepath.Join(cwd, tt.srcContext), dirUnpack)\n\t\t\ttestutil.CheckError(t, tt.unpackShouldErr, err)\n\t\t\tsrcSHA, err := getSHAFromFilePath(tt.dockerfile)\n\t\t\ttestutil.CheckError(t, tt.srcShaShouldErr, err)\n\t\t\tdestSHA, err := getSHAFromFilePath(filepath.Join(dirUnpack, tt.dockerfile))\n\t\t\ttestutil.CheckError(t, tt.destShaShouldErr, err)\n\t\t\tif err == nil {\n\t\t\t\ttestutil.CheckDeepEqual(t, srcSHA, destSHA)\n\t\t\t}\n\t\t})\n\t}\n\n\tif err := os.RemoveAll(testDirLongPath); err != nil {\n\t\tt.Errorf(\"Failed to remove %s: %v\", testDirLongPath, err)\n\t}\n}\n\nfunc getSHAFromFilePath(f string) (string, error) {\n\tdata, err := os.ReadFile(f)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tsha, err := util.SHA256(bytes.NewReader(data))\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn sha, nil\n}\n"
  },
  {
    "path": "pkg/cache/cache.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage cache\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/creds\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/google/go-containerregistry/pkg/name\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/google/go-containerregistry/pkg/v1/layout\"\n\t\"github.com/google/go-containerregistry/pkg/v1/remote\"\n\t\"github.com/google/go-containerregistry/pkg/v1/tarball\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n)\n\n// LayerCache is the layer cache\ntype LayerCache interface {\n\tRetrieveLayer(string) (v1.Image, error)\n}\n\n// RegistryCache is the registry cache\ntype RegistryCache struct {\n\tOpts *config.KanikoOptions\n}\n\n// RetrieveLayer retrieves a layer from the cache given the cache key ck.\nfunc (rc *RegistryCache) RetrieveLayer(ck string) (v1.Image, error) {\n\tcache, err := Destination(rc.Opts, ck)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"getting cache destination\")\n\t}\n\tlogrus.Infof(\"Checking for cached layer %s...\", cache)\n\n\tcacheRef, err := name.NewTag(cache, name.WeakValidation)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, fmt.Sprintf(\"getting reference for %s\", cache))\n\t}\n\n\tregistryName := cacheRef.Repository.Registry.Name()\n\tif rc.Opts.Insecure || rc.Opts.InsecureRegistries.Contains(registryName) {\n\t\tnewReg, err := name.NewRegistry(registryName, name.WeakValidation, name.Insecure)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcacheRef.Repository.Registry = newReg\n\t}\n\n\ttr, err := util.MakeTransport(rc.Opts.RegistryOptions, registryName)\n\tif err != nil {\n\t\treturn nil, errors.Wrapf(err, \"making transport for registry %q\", registryName)\n\t}\n\n\timg, err := remote.Image(cacheRef, remote.WithTransport(tr), remote.WithAuthFromKeychain(creds.GetKeychain()))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif err = verifyImage(img, rc.Opts.CacheTTL, cache); err != nil {\n\t\treturn nil, err\n\t}\n\treturn img, nil\n}\n\nfunc verifyImage(img v1.Image, cacheTTL time.Duration, cache string) error {\n\tcf, err := img.ConfigFile()\n\tif err != nil {\n\t\treturn errors.Wrap(err, fmt.Sprintf(\"retrieving config file for %s\", cache))\n\t}\n\n\texpiry := cf.Created.Add(cacheTTL)\n\t// Layer is stale, rebuild it.\n\tif expiry.Before(time.Now()) {\n\t\tlogrus.Infof(\"Cache entry expired: %s\", cache)\n\t\treturn fmt.Errorf(\"Cache entry expired: %s\", cache)\n\t}\n\n\t// Force the manifest to be populated\n\tif _, err := img.RawManifest(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// LayoutCache is the OCI image layout cache\ntype LayoutCache struct {\n\tOpts *config.KanikoOptions\n}\n\nfunc (lc *LayoutCache) RetrieveLayer(ck string) (v1.Image, error) {\n\tcache, err := Destination(lc.Opts, ck)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"getting cache destination\")\n\t}\n\tlogrus.Infof(\"Checking for cached layer %s...\", cache)\n\n\tvar img v1.Image\n\tif img, err = locateImage(strings.TrimPrefix(cache, \"oci:\")); err != nil {\n\t\treturn nil, errors.Wrap(err, \"locating cache image\")\n\t}\n\n\tif err = verifyImage(img, lc.Opts.CacheTTL, cache); err != nil {\n\t\treturn nil, err\n\t}\n\treturn img, nil\n}\n\nfunc locateImage(path string) (v1.Image, error) {\n\tvar img v1.Image\n\tlayoutPath, err := layout.FromPath(path)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, fmt.Sprintf(\"constructing layout path from %s\", path))\n\t}\n\tindex, err := layoutPath.ImageIndex()\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, fmt.Sprintf(\"retrieving index file for %s\", layoutPath))\n\t}\n\tmanifest, err := index.IndexManifest()\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, fmt.Sprintf(\"retrieving manifest file for %s\", layoutPath))\n\t}\n\tfor _, m := range manifest.Manifests {\n\t\t// assume there is only one image\n\t\timg, err = layoutPath.Image(m.Digest)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrap(err, fmt.Sprintf(\"initializing image with digest %s\", m.Digest.String()))\n\t\t}\n\t}\n\tif img == nil {\n\t\treturn nil, fmt.Errorf(\"path contains no images\")\n\t}\n\treturn img, nil\n}\n\n// Destination returns the repo where the layer should be stored\n// If no cache is specified, one is inferred from the destination provided\nfunc Destination(opts *config.KanikoOptions, cacheKey string) (string, error) {\n\tcache := opts.CacheRepo\n\tif cache == \"\" {\n\t\tdestination := opts.Destinations[0]\n\t\tdestRef, err := name.NewTag(destination, name.WeakValidation)\n\t\tif err != nil {\n\t\t\treturn \"\", errors.Wrap(err, \"getting tag for destination\")\n\t\t}\n\t\treturn fmt.Sprintf(\"%s/cache:%s\", destRef.Context(), cacheKey), nil\n\t}\n\treturn fmt.Sprintf(\"%s:%s\", cache, cacheKey), nil\n}\n\n// LocalSource retrieves a source image from a local cache given cacheKey\nfunc LocalSource(opts *config.CacheOptions, cacheKey string) (v1.Image, error) {\n\tcache := opts.CacheDir\n\tif cache == \"\" {\n\t\treturn nil, nil\n\t}\n\n\tpath := path.Join(cache, cacheKey)\n\n\tfi, err := os.Stat(path)\n\tif err != nil {\n\t\tmsg := fmt.Sprintf(\"No file found for cache key %v %v\", cacheKey, err)\n\t\tlogrus.Debug(msg)\n\t\treturn nil, NotFoundErr{msg: msg}\n\t}\n\n\t// A stale cache is a bad cache\n\texpiry := fi.ModTime().Add(opts.CacheTTL)\n\tif expiry.Before(time.Now()) {\n\t\tmsg := fmt.Sprintf(\"Cached image is too old: %v\", fi.ModTime())\n\t\tlogrus.Debug(msg)\n\t\treturn nil, ExpiredErr{msg: msg}\n\t}\n\n\tlogrus.Infof(\"Found %s in local cache\", cacheKey)\n\treturn cachedImageFromPath(path)\n}\n\n// cachedImage represents a v1.Tarball that is cached locally in a CAS.\n// Computing the digest for a v1.Tarball is very expensive. If the tarball\n// is named with the digest we can store this and return it directly rather\n// than recompute it.\ntype cachedImage struct {\n\tdigest string\n\tv1.Image\n\tmfst *v1.Manifest\n}\n\nfunc (c *cachedImage) Digest() (v1.Hash, error) {\n\treturn v1.NewHash(c.digest)\n}\n\nfunc (c *cachedImage) Manifest() (*v1.Manifest, error) {\n\tif c.mfst == nil {\n\t\treturn c.Image.Manifest()\n\t}\n\treturn c.mfst, nil\n}\n\nfunc mfstFromPath(p string) (*v1.Manifest, error) {\n\tf, err := os.Open(p)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer f.Close()\n\treturn v1.ParseManifest(f)\n}\n\nfunc cachedImageFromPath(p string) (v1.Image, error) {\n\timgTar, err := tarball.ImageFromPath(p, nil)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"getting image from path\")\n\t}\n\n\t// Manifests may be present next to the tar, named with a \".json\" suffix\n\tmfstPath := p + \".json\"\n\n\tvar mfst *v1.Manifest\n\tif _, err := os.Stat(mfstPath); err != nil {\n\t\tlogrus.Debugf(\"Manifest does not exist at file: %s\", mfstPath)\n\t} else {\n\t\tmfst, err = mfstFromPath(mfstPath)\n\t\tif err != nil {\n\t\t\tlogrus.Debugf(\"Error parsing manifest from file: %s\", mfstPath)\n\t\t} else {\n\t\t\tlogrus.Infof(\"Found manifest at %s\", mfstPath)\n\t\t}\n\t}\n\n\treturn &cachedImage{\n\t\tdigest: filepath.Base(p),\n\t\tImage:  imgTar,\n\t\tmfst:   mfst,\n\t}, nil\n}\n"
  },
  {
    "path": "pkg/cache/doc_test.go",
    "content": "/*\nCopyright 2019 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage cache\n\nimport (\n\t\"bytes\"\n\t\"log\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/image/remote\"\n)\n\nfunc ExampleWarmer_Warm() {\n\ttarBuf := new(bytes.Buffer)\n\tmanifestBuf := new(bytes.Buffer)\n\tw := &Warmer{\n\t\tRemote:         remote.RetrieveRemoteImage,\n\t\tLocal:          LocalSource,\n\t\tTarWriter:      tarBuf,\n\t\tManifestWriter: manifestBuf,\n\t}\n\n\toptions := &config.WarmerOptions{}\n\n\tdigest, err := w.Warm(\"ubuntu:latest\", options)\n\tif err != nil {\n\t\tif !IsAlreadyCached(err) {\n\t\t\tlog.Fatal(err)\n\t\t}\n\t}\n\n\tlog.Printf(\"digest %v tar len %d\\nmanifest:\\n%s\\n\", digest, tarBuf.Len(), manifestBuf.String())\n}\n"
  },
  {
    "path": "pkg/cache/errors.go",
    "content": "/*\nCopyright 2019 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage cache\n\nimport \"errors\"\n\n// IsAlreadyCached returns true if the supplied error is of the type AlreadyCachedErr\n// otherwise it returns false.\nfunc IsAlreadyCached(err error) bool {\n\tvar e AlreadyCachedErr\n\treturn errors.As(err, &e)\n}\n\n// AlreadyCachedErr is returned when the Docker image requested for caching is already\n// present in the cache.\ntype AlreadyCachedErr struct {\n\tmsg string\n}\n\nfunc (a AlreadyCachedErr) Error() string {\n\treturn a.msg\n}\n\n// IsNotFound returns true if the supplied error is of the type NotFoundErr\n// otherwise it returns false.\nfunc IsNotFound(err error) bool {\n\tvar e NotFoundErr\n\treturn errors.As(err, &e)\n}\n\n// NotFoundErr is returned when the requested Docker image is not present in the cache.\ntype NotFoundErr struct {\n\tmsg string\n}\n\nfunc (e NotFoundErr) Error() string {\n\treturn e.msg\n}\n\n// IsExpired returns true if the supplied error is of the type ExpiredErr\n// otherwise it returns false.\nfunc IsExpired(err error) bool {\n\tvar e ExpiredErr\n\treturn errors.As(err, &e)\n}\n\n// ExpiredErr is returned when the requested Docker image is present in the cache, but is\n// expired according to the supplied TTL.\ntype ExpiredErr struct {\n\tmsg string\n}\n\nfunc (e ExpiredErr) Error() string {\n\treturn e.msg\n}\n"
  },
  {
    "path": "pkg/cache/warm.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage cache\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"os\"\n\t\"path\"\n\t\"regexp\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/image/remote\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/google/go-containerregistry/pkg/name\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/google/go-containerregistry/pkg/v1/tarball\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n)\n\n// WarmCache populates the cache\nfunc WarmCache(opts *config.WarmerOptions) error {\n\tvar dockerfileImages []string\n\tcacheDir := opts.CacheDir\n\timages := opts.Images\n\n\t// if opts.image is empty,we need to parse dockerfilepath to get images list\n\tif opts.DockerfilePath != \"\" {\n\t\tvar err error\n\t\tif dockerfileImages, err = ParseDockerfile(opts); err != nil {\n\t\t\treturn errors.Wrap(err, \"failed to parse Dockerfile\")\n\t\t}\n\t}\n\n\t// TODO: Implement deduplication logic later.\n\timages = append(images, dockerfileImages...)\n\n\tlogrus.Debugf(\"%s\\n\", cacheDir)\n\tlogrus.Debugf(\"%s\\n\", images)\n\n\terrs := 0\n\tfor _, img := range images {\n\t\terr := warmToFile(cacheDir, img, opts)\n\t\tif err != nil {\n\t\t\tlogrus.Warnf(\"Error while trying to warm image: %v %v\", img, err)\n\t\t\terrs++\n\t\t}\n\t}\n\n\tif len(images) == errs {\n\t\treturn errors.New(\"Failed to warm any of the given images\")\n\t}\n\n\treturn nil\n}\n\n// Download image in temporary files then move files to final destination\nfunc warmToFile(cacheDir, img string, opts *config.WarmerOptions) error {\n\tf, err := os.CreateTemp(cacheDir, \"warmingImage.*\")\n\tif err != nil {\n\t\treturn err\n\t}\n\t// defer called in reverse order\n\tdefer os.Remove(f.Name())\n\tdefer f.Close()\n\n\tmtfsFile, err := os.CreateTemp(cacheDir, \"warmingManifest.*\")\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer os.Remove(mtfsFile.Name())\n\tdefer mtfsFile.Close()\n\n\tcw := &Warmer{\n\t\tRemote:         remote.RetrieveRemoteImage,\n\t\tLocal:          LocalSource,\n\t\tTarWriter:      f,\n\t\tManifestWriter: mtfsFile,\n\t}\n\n\tdigest, err := cw.Warm(img, opts)\n\tif err != nil {\n\t\tif IsAlreadyCached(err) {\n\t\t\tlogrus.Infof(\"Image already in cache: %v\", img)\n\t\t\treturn nil\n\t\t}\n\t\tlogrus.Warnf(\"Error while trying to warm image: %v %v\", img, err)\n\t\treturn err\n\t}\n\n\tfinalCachePath := path.Join(cacheDir, digest.String())\n\tfinalMfstPath := finalCachePath + \".json\"\n\n\terr = os.Rename(f.Name(), finalCachePath)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = os.Rename(mtfsFile.Name(), finalMfstPath)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"Failed to rename manifest file\")\n\t}\n\n\tlogrus.Debugf(\"Wrote %s to cache\", img)\n\treturn nil\n}\n\n// FetchRemoteImage retrieves a Docker image manifest from a remote source.\n// github.com/GoogleContainerTools/kaniko/image/remote.RetrieveRemoteImage can be used as\n// this type.\ntype FetchRemoteImage func(image string, opts config.RegistryOptions, customPlatform string) (v1.Image, error)\n\n// FetchLocalSource retrieves a Docker image manifest from a local source.\n// github.com/GoogleContainerTools/kaniko/cache.LocalSource can be used as\n// this type.\ntype FetchLocalSource func(*config.CacheOptions, string) (v1.Image, error)\n\n// Warmer is used to prepopulate the cache with a Docker image\ntype Warmer struct {\n\tRemote         FetchRemoteImage\n\tLocal          FetchLocalSource\n\tTarWriter      io.Writer\n\tManifestWriter io.Writer\n}\n\n// Warm retrieves a Docker image and populates the supplied buffer with the image content and manifest\n// or returns an AlreadyCachedErr if the image is present in the cache.\nfunc (w *Warmer) Warm(image string, opts *config.WarmerOptions) (v1.Hash, error) {\n\tcacheRef, err := name.ParseReference(image, name.WeakValidation)\n\tif err != nil {\n\t\treturn v1.Hash{}, errors.Wrapf(err, \"Failed to verify image name: %s\", image)\n\t}\n\n\timg, err := w.Remote(image, opts.RegistryOptions, opts.CustomPlatform)\n\tif err != nil || img == nil {\n\t\treturn v1.Hash{}, errors.Wrapf(err, \"Failed to retrieve image: %s\", image)\n\t}\n\n\tdigest, err := img.Digest()\n\tif err != nil {\n\t\treturn v1.Hash{}, errors.Wrapf(err, \"Failed to retrieve digest: %s\", image)\n\t}\n\n\tif !opts.Force {\n\t\t_, err := w.Local(&opts.CacheOptions, digest.String())\n\t\tif err == nil || IsExpired(err) {\n\t\t\treturn v1.Hash{}, AlreadyCachedErr{}\n\t\t}\n\t}\n\n\terr = tarball.Write(cacheRef, img, w.TarWriter)\n\tif err != nil {\n\t\treturn v1.Hash{}, errors.Wrapf(err, \"Failed to write %s to tar buffer\", image)\n\t}\n\n\tmfst, err := img.RawManifest()\n\tif err != nil {\n\t\treturn v1.Hash{}, errors.Wrapf(err, \"Failed to retrieve manifest for %s\", image)\n\t}\n\n\tif _, err := w.ManifestWriter.Write(mfst); err != nil {\n\t\treturn v1.Hash{}, errors.Wrapf(err, \"Failed to save manifest to buffer for %s\", image)\n\t}\n\n\treturn digest, nil\n}\n\nfunc ParseDockerfile(opts *config.WarmerOptions) ([]string, error) {\n\tvar err error\n\tvar d []uint8\n\tvar baseNames []string\n\tmatch, _ := regexp.MatchString(\"^https?://\", opts.DockerfilePath)\n\tif match {\n\t\tresponse, e := http.Get(opts.DockerfilePath) //nolint:noctx\n\t\tif e != nil {\n\t\t\treturn nil, e\n\t\t}\n\t\td, err = io.ReadAll(response.Body)\n\t} else {\n\t\td, err = os.ReadFile(opts.DockerfilePath)\n\t}\n\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, fmt.Sprintf(\"reading dockerfile at path %s\", opts.DockerfilePath))\n\t}\n\n\tstages, _, err := dockerfile.Parse(d)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"parsing dockerfile\")\n\t}\n\n\tfor i, s := range stages {\n\t\tresolvedBaseName, err := util.ResolveEnvironmentReplacement(s.BaseName, opts.BuildArgs, false)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrap(err, fmt.Sprintf(\"resolving base name %s\", s.BaseName))\n\t\t}\n\t\tif s.BaseName != resolvedBaseName {\n\t\t\tstages[i].BaseName = resolvedBaseName\n\t\t}\n\t\tbaseNames = append(baseNames, resolvedBaseName)\n\t}\n\treturn baseNames, nil\n\n}\n"
  },
  {
    "path": "pkg/cache/warm_test.go",
    "content": "/*\nCopyright 2019 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage cache\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/fakes\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n)\n\nconst (\n\timage = \"foo:latest\"\n)\n\nfunc Test_Warmer_Warm_not_in_cache(t *testing.T) {\n\ttarBuf := new(bytes.Buffer)\n\tmanifestBuf := new(bytes.Buffer)\n\n\tcw := &Warmer{\n\t\tRemote: func(_ string, _ config.RegistryOptions, _ string) (v1.Image, error) {\n\t\t\treturn fakes.FakeImage{}, nil\n\t\t},\n\t\tLocal: func(_ *config.CacheOptions, _ string) (v1.Image, error) {\n\t\t\treturn nil, NotFoundErr{}\n\t\t},\n\t\tTarWriter:      tarBuf,\n\t\tManifestWriter: manifestBuf,\n\t}\n\n\topts := &config.WarmerOptions{}\n\n\t_, err := cw.Warm(image, opts)\n\tif err != nil {\n\t\tt.Errorf(\"expected error to be nil but was %v\", err)\n\t\tt.FailNow()\n\t}\n\n\tif len(tarBuf.Bytes()) == 0 {\n\t\tt.Error(\"expected image to be written but buffer was empty\")\n\t}\n}\n\nfunc Test_Warmer_Warm_in_cache_not_expired(t *testing.T) {\n\ttarBuf := new(bytes.Buffer)\n\tmanifestBuf := new(bytes.Buffer)\n\n\tcw := &Warmer{\n\t\tRemote: func(_ string, _ config.RegistryOptions, _ string) (v1.Image, error) {\n\t\t\treturn fakes.FakeImage{}, nil\n\t\t},\n\t\tLocal: func(_ *config.CacheOptions, _ string) (v1.Image, error) {\n\t\t\treturn fakes.FakeImage{}, nil\n\t\t},\n\t\tTarWriter:      tarBuf,\n\t\tManifestWriter: manifestBuf,\n\t}\n\n\topts := &config.WarmerOptions{}\n\n\t_, err := cw.Warm(image, opts)\n\tif !IsAlreadyCached(err) {\n\t\tt.Errorf(\"expected error to be already cached err but was %v\", err)\n\t\tt.FailNow()\n\t}\n\n\tif len(tarBuf.Bytes()) != 0 {\n\t\tt.Errorf(\"expected nothing to be written\")\n\t}\n}\n\nfunc Test_Warmer_Warm_in_cache_expired(t *testing.T) {\n\ttarBuf := new(bytes.Buffer)\n\tmanifestBuf := new(bytes.Buffer)\n\n\tcw := &Warmer{\n\t\tRemote: func(_ string, _ config.RegistryOptions, _ string) (v1.Image, error) {\n\t\t\treturn fakes.FakeImage{}, nil\n\t\t},\n\t\tLocal: func(_ *config.CacheOptions, _ string) (v1.Image, error) {\n\t\t\treturn fakes.FakeImage{}, ExpiredErr{}\n\t\t},\n\t\tTarWriter:      tarBuf,\n\t\tManifestWriter: manifestBuf,\n\t}\n\n\topts := &config.WarmerOptions{}\n\n\t_, err := cw.Warm(image, opts)\n\tif !IsAlreadyCached(err) {\n\t\tt.Errorf(\"expected error to be already cached err but was %v\", err)\n\t\tt.FailNow()\n\t}\n\n\tif len(tarBuf.Bytes()) != 0 {\n\t\tt.Errorf(\"expected nothing to be written\")\n\t}\n}\n\nfunc TestParseDockerfile_SingleStageDockerfile(t *testing.T) {\n\tdockerfile := `FROM alpine:latest\nLABEL maintainer=\"alexezio\"\n`\n\ttmpfile, err := os.CreateTemp(\"\", \"example\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer os.Remove(tmpfile.Name())\n\n\tif _, err := tmpfile.Write([]byte(dockerfile)); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif err := tmpfile.Close(); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\topts := &config.WarmerOptions{DockerfilePath: tmpfile.Name()}\n\tbaseNames, err := ParseDockerfile(opts)\n\tif err != nil {\n\t\tt.Fatalf(\"expected no error, got %v\", err)\n\t}\n\tif len(baseNames) != 1 {\n\t\tt.Fatalf(\"expected 1 base name, got %d\", len(baseNames))\n\t}\n\tif baseNames[0] != \"alpine:latest\" {\n\t\tt.Fatalf(\"expected 'alpine:latest', got '%s'\", baseNames[0])\n\t}\n}\n\nfunc TestParseDockerfile_MultiStageDockerfile(t *testing.T) {\n\tdockerfile := `FROM golang:1.20 as BUILDER\nLABEL maintainer=\"alexezio\"\n\nFROM alpine:latest as RUNNER\nLABEL maintainer=\"alexezio\"\n`\n\ttmpfile, err := os.CreateTemp(\"\", \"example\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer os.Remove(tmpfile.Name())\n\n\tif _, err := tmpfile.Write([]byte(dockerfile)); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif err := tmpfile.Close(); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\topts := &config.WarmerOptions{DockerfilePath: tmpfile.Name()}\n\tbaseNames, err := ParseDockerfile(opts)\n\tif err != nil {\n\t\tt.Fatalf(\"expected no error, got %v\", err)\n\t}\n\tif len(baseNames) != 2 {\n\t\tt.Fatalf(\"expected 2 base name, got %d\", len(baseNames))\n\t}\n\tif baseNames[0] != \"golang:1.20\" {\n\t\tt.Fatalf(\"expected 'golang:1.20', got '%s'\", baseNames[0])\n\t}\n\n\tif baseNames[1] != \"alpine:latest\" {\n\t\tt.Fatalf(\"expected 'alpine:latest', got '%s'\", baseNames[0])\n\t}\n}\n\nfunc TestParseDockerfile_ArgsDockerfile(t *testing.T) {\n\tdockerfile := `ARG version=latest\nFROM golang:${version}\n`\n\ttmpfile, err := os.CreateTemp(\"\", \"example\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer os.Remove(tmpfile.Name())\n\n\tif _, err := tmpfile.Write([]byte(dockerfile)); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif err := tmpfile.Close(); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\topts := &config.WarmerOptions{DockerfilePath: tmpfile.Name(), BuildArgs: []string{\"version=1.20\"}}\n\tbaseNames, err := ParseDockerfile(opts)\n\tif err != nil {\n\t\tt.Fatalf(\"expected no error, got %v\", err)\n\t}\n\tif len(baseNames) != 1 {\n\t\tt.Fatalf(\"expected 1 base name, got %d\", len(baseNames))\n\t}\n\tif baseNames[0] != \"golang:1.20\" {\n\t\tt.Fatalf(\"expected 'golang:1.20', got '%s'\", baseNames[0])\n\t}\n}\n\nfunc TestParseDockerfile_MissingsDockerfile(t *testing.T) {\n\topts := &config.WarmerOptions{DockerfilePath: \"dummy-nowhere\"}\n\tbaseNames, err := ParseDockerfile(opts)\n\tif err == nil {\n\t\tt.Fatal(\"expected an error, got nil\")\n\t}\n\tif len(baseNames) != 0 {\n\t\tt.Fatalf(\"expected no base names, got %d\", len(baseNames))\n\t}\n}\n\nfunc TestParseDockerfile_InvalidsDockerfile(t *testing.T) {\n\tdockerfile := \"This is a invalid dockerfile\"\n\ttmpfile, err := os.CreateTemp(\"\", \"example\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer os.Remove(tmpfile.Name())\n\n\tif _, err := tmpfile.Write([]byte(dockerfile)); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif err := tmpfile.Close(); err != nil {\n\t\tt.Fatal(err)\n\t}\n\topts := &config.WarmerOptions{DockerfilePath: tmpfile.Name()}\n\tbaseNames, err := ParseDockerfile(opts)\n\tif err == nil {\n\t\tt.Fatal(\"expected an error, got nil\")\n\t}\n\n\tif len(baseNames) != 0 {\n\t\tt.Fatalf(\"expected no base names, got %d\", len(baseNames))\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/add.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"io/fs\"\n\t\"path/filepath\"\n\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n\t\"github.com/pkg/errors\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/sirupsen/logrus\"\n)\n\ntype AddCommand struct {\n\tBaseCommand\n\tcmd           *instructions.AddCommand\n\tfileContext   util.FileContext\n\tsnapshotFiles []string\n}\n\n// ExecuteCommand executes the ADD command\n// Special stuff about ADD:\n//  1. If <src> is a remote file URL:\n//     - destination will have permissions of 0600\n//     - If remote file has HTTP Last-Modified header, we set the mtime of the file to that timestamp\n//     - If dest doesn't end with a slash, the filepath is inferred to be <dest>/<filename>\n//  2. If <src> is a local tar archive:\n//     - it is unpacked at the dest, as 'tar -x' would\nfunc (a *AddCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\treplacementEnvs := buildArgs.ReplacementEnvs(config.Env)\n\n\tchmod, useDefaultChmod, err := util.GetChmod(a.cmd.Chmod, replacementEnvs)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"getting permissions from chmod\")\n\t}\n\tif useDefaultChmod {\n\t\tchmod = fs.FileMode(0o600)\n\t}\n\n\tuid, gid, err := util.GetUserGroup(a.cmd.Chown, replacementEnvs)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"getting user group from chown\")\n\t}\n\n\tsrcs, dest, err := util.ResolveEnvAndWildcards(a.cmd.SourcesAndDest, a.fileContext, replacementEnvs)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar unresolvedSrcs []string\n\t// If any of the sources are local tar archives:\n\t// \t1. Unpack them to the specified destination\n\t// If any of the sources is a remote file URL:\n\t//\t1. Download and copy it to the specified dest\n\t// Else, add to the list of unresolved sources\n\tfor _, src := range srcs {\n\t\tfullPath := filepath.Join(a.fileContext.Root, src)\n\t\tif util.IsSrcRemoteFileURL(src) {\n\t\t\turlDest, err := util.URLDestinationFilepath(src, dest, config.WorkingDir, replacementEnvs)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tlogrus.Infof(\"Adding remote URL %s to %s\", src, urlDest)\n\t\t\tif err := util.DownloadFileToDest(src, urlDest, uid, gid, chmod); err != nil {\n\t\t\t\treturn errors.Wrap(err, \"downloading remote source file\")\n\t\t\t}\n\t\t\ta.snapshotFiles = append(a.snapshotFiles, urlDest)\n\t\t} else if util.IsFileLocalTarArchive(fullPath) {\n\t\t\ttarDest, err := util.DestinationFilepath(\"\", dest, config.WorkingDir)\n\t\t\tif err != nil {\n\t\t\t\treturn errors.Wrap(err, \"determining dest for tar\")\n\t\t\t}\n\t\t\tlogrus.Infof(\"Unpacking local tar archive %s to %s\", src, tarDest)\n\t\t\textractedFiles, err := util.UnpackLocalTarArchive(fullPath, tarDest)\n\t\t\tif err != nil {\n\t\t\t\treturn errors.Wrap(err, \"unpacking local tar\")\n\t\t\t}\n\t\t\tlogrus.Debugf(\"Added %v from local tar archive %s\", extractedFiles, src)\n\t\t\ta.snapshotFiles = append(a.snapshotFiles, extractedFiles...)\n\t\t} else {\n\t\t\tunresolvedSrcs = append(unresolvedSrcs, src)\n\t\t}\n\t}\n\t// With the remaining \"normal\" sources, create and execute a standard copy command\n\tif len(unresolvedSrcs) == 0 {\n\t\treturn nil\n\t}\n\n\tcopyCmd := CopyCommand{\n\t\tcmd: &instructions.CopyCommand{\n\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: unresolvedSrcs, DestPath: dest},\n\t\t\tChown:          a.cmd.Chown,\n\t\t\tChmod:          a.cmd.Chmod,\n\t\t},\n\t\tfileContext: a.fileContext,\n\t}\n\n\tif err := copyCmd.ExecuteCommand(config, buildArgs); err != nil {\n\t\treturn errors.Wrap(err, \"executing copy command\")\n\t}\n\ta.snapshotFiles = append(a.snapshotFiles, copyCmd.snapshotFiles...)\n\treturn nil\n}\n\n// FilesToSnapshot should return an empty array if still nil; no files were changed\nfunc (a *AddCommand) FilesToSnapshot() []string {\n\treturn a.snapshotFiles\n}\n\n// String returns some information about the command for the image config\nfunc (a *AddCommand) String() string {\n\treturn a.cmd.String()\n}\n\nfunc (a *AddCommand) FilesUsedFromContext(config *v1.Config, buildArgs *dockerfile.BuildArgs) ([]string, error) {\n\treplacementEnvs := buildArgs.ReplacementEnvs(config.Env)\n\n\tsrcs, _, err := util.ResolveEnvAndWildcards(a.cmd.SourcesAndDest, a.fileContext, replacementEnvs)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfiles := []string{}\n\tfor _, src := range srcs {\n\t\tif util.IsSrcRemoteFileURL(src) {\n\t\t\tcontinue\n\t\t}\n\t\tif util.IsFileLocalTarArchive(src) {\n\t\t\tcontinue\n\t\t}\n\t\tfullPath := filepath.Join(a.fileContext.Root, src)\n\t\tfiles = append(files, fullPath)\n\t}\n\n\tlogrus.Infof(\"Using files from context: %v\", files)\n\treturn files, nil\n}\n\nfunc (a *AddCommand) MetadataOnly() bool {\n\treturn false\n}\n\nfunc (a *AddCommand) RequiresUnpackedFS() bool {\n\treturn true\n}\n"
  },
  {
    "path": "pkg/commands/add_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"compress/gzip\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sort\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\ntype TarList struct {\n\ttarName    string\n\tdirectory  string\n\tcompressed bool\n}\n\nfunc createFile(tempDir string) error {\n\tfileName := filepath.Join(tempDir, \"text.txt\")\n\tfile, err := os.Create(fileName)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer file.Close()\n\n\terr = os.WriteFile(fileName, []byte(\"This is a test!\\n\"), 0644)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc createTar(tempDir string, toCreate TarList) error {\n\tif toCreate.compressed {\n\t\tfile, err := os.OpenFile(filepath.Join(tempDir, toCreate.tarName), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tgzipWriter := gzip.NewWriter(file)\n\t\tdefer gzipWriter.Close()\n\n\t\terr = util.CreateTarballOfDirectory(filepath.Join(tempDir, toCreate.directory), gzipWriter)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t}\n\n\ttarFile, err := os.Create(filepath.Join(tempDir, toCreate.tarName))\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = util.CreateTarballOfDirectory(filepath.Join(tempDir, toCreate.directory), tarFile)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc setupAddTest(t *testing.T) string {\n\ttempDir := t.TempDir()\n\n\terr := createFile(tempDir)\n\tif err != nil {\n\t\tt.Errorf(\"couldn't create the file %v\", err)\n\t}\n\n\tvar tarFiles = []TarList{\n\t\t{\n\t\t\ttarName:    \"a.tar\",\n\t\t\tdirectory:  \"a\",\n\t\t\tcompressed: false,\n\t\t},\n\t\t{\n\t\t\ttarName:    \"b.tar.gz\",\n\t\t\tdirectory:  \"b\",\n\t\t\tcompressed: true,\n\t\t},\n\t}\n\n\t// Create directories with files and then create tar\n\tfor _, toCreate := range tarFiles {\n\n\t\terr = os.Mkdir(filepath.Join(tempDir, toCreate.directory), 0755)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"couldn't create directory %v\", err)\n\t\t}\n\n\t\terr = createFile(filepath.Join(tempDir, toCreate.directory))\n\t\tif err != nil {\n\t\t\tt.Errorf(\"couldn't create file inside directory %v\", err)\n\t\t}\n\t\terr = createTar(tempDir, toCreate)\n\n\t\tif err != nil {\n\t\t\tt.Errorf(\"couldn't create the tar %v\", err)\n\t\t}\n\t}\n\n\treturn tempDir\n}\n\nfunc Test_AddCommand(t *testing.T) {\n\ttempDir := setupAddTest(t)\n\n\tfileContext := util.FileContext{Root: tempDir}\n\tcfg := &v1.Config{\n\t\tCmd:        nil,\n\t\tEnv:        []string{},\n\t\tWorkingDir: tempDir,\n\t}\n\tbuildArgs := dockerfile.NewBuildArgs([]string{})\n\n\tvar addTests = []struct {\n\t\tname           string\n\t\tsourcesAndDest []string\n\t\texpectedDest   []string\n\t}{\n\t\t{\n\t\t\tname:           \"add files into tempAddExecuteTest/\",\n\t\t\tsourcesAndDest: []string{\"text.txt\", \"a.tar\", \"b.tar.gz\", \"tempAddExecuteTest/\"},\n\t\t\texpectedDest: []string{\n\t\t\t\t\"text.txt\",\n\t\t\t\tfilepath.Join(tempDir, \"a/\"),\n\t\t\t\tfilepath.Join(tempDir, \"a/text.txt\"),\n\t\t\t\tfilepath.Join(tempDir, \"b/\"),\n\t\t\t\tfilepath.Join(tempDir, \"b/text.txt\"),\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, testCase := range addTests {\n\t\tt.Run(testCase.name, func(t *testing.T) {\n\t\t\tc := AddCommand{\n\t\t\t\tcmd: &instructions.AddCommand{\n\t\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: testCase.sourcesAndDest[0 : len(testCase.sourcesAndDest)-1],\n\t\t\t\t\t\tDestPath: testCase.sourcesAndDest[len(testCase.sourcesAndDest)-1]},\n\t\t\t\t},\n\t\t\t\tfileContext: fileContext,\n\t\t\t}\n\t\t\tc.ExecuteCommand(cfg, buildArgs)\n\n\t\t\texpected := []string{}\n\t\t\tresultDir := filepath.Join(tempDir, \"tempAddExecuteTest/\")\n\t\t\tfor _, file := range testCase.expectedDest {\n\t\t\t\texpected = append(expected, filepath.Join(resultDir, file))\n\t\t\t}\n\t\t\tsort.Strings(expected)\n\t\t\tsort.Strings(c.snapshotFiles)\n\t\t\ttestutil.CheckDeepEqual(t, expected, c.snapshotFiles)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/arg.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\ntype ArgCommand struct {\n\tBaseCommand\n\tcmd *instructions.ArgCommand\n}\n\n// ExecuteCommand only needs to add this ARG key/value as seen\nfunc (r *ArgCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\tfor _, arg := range r.cmd.Args {\n\t\tkey, val, err := ParseArg(arg.Key, arg.Value, config.Env, buildArgs)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tbuildArgs.AddArg(key, val)\n\t}\n\treturn nil\n}\n\nfunc ParseArg(key string, val *string, env []string, ba *dockerfile.BuildArgs) (string, *string, error) {\n\treplacementEnvs := ba.ReplacementEnvs(env)\n\tresolvedKey, err := util.ResolveEnvironmentReplacement(key, replacementEnvs, false)\n\tif err != nil {\n\t\treturn \"\", nil, err\n\t}\n\tvar resolvedValue *string\n\tif val != nil {\n\t\tvalue, err := util.ResolveEnvironmentReplacement(*val, replacementEnvs, false)\n\t\tif err != nil {\n\t\t\treturn \"\", nil, err\n\t\t}\n\t\tresolvedValue = &value\n\t} else {\n\t\tif value, ok := ba.GetAllAllowed()[resolvedKey]; ok {\n\t\t\tresolvedValue = &value\n\t\t} else if value, ok := ba.GetAllMeta()[resolvedKey]; ok {\n\t\t\tresolvedValue = &value\n\t\t}\n\t}\n\treturn resolvedKey, resolvedValue, nil\n}\n\n// String returns some information about the command for the image config history\nfunc (r *ArgCommand) String() string {\n\treturn r.cmd.String()\n}\n"
  },
  {
    "path": "pkg/commands/base_command.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n)\n\ntype BaseCommand struct {\n}\n\nfunc (b *BaseCommand) IsArgsEnvsRequiredInCache() bool {\n\treturn false\n}\n\nfunc (b *BaseCommand) CacheCommand(v1.Image) DockerCommand {\n\treturn nil\n}\n\nfunc (b *BaseCommand) FilesToSnapshot() []string {\n\treturn []string{}\n}\n\nfunc (b *BaseCommand) ProvidesFilesToSnapshot() bool {\n\treturn true\n}\n\nfunc (b *BaseCommand) FilesUsedFromContext(_ *v1.Config, _ *dockerfile.BuildArgs) ([]string, error) {\n\treturn []string{}, nil\n}\n\nfunc (b *BaseCommand) MetadataOnly() bool {\n\treturn true\n}\n\nfunc (b *BaseCommand) RequiresUnpackedFS() bool {\n\treturn false\n}\n\nfunc (b *BaseCommand) ShouldCacheOutput() bool {\n\treturn false\n}\n\nfunc (b *BaseCommand) ShouldDetectDeletedFiles() bool {\n\treturn false\n}\n"
  },
  {
    "path": "pkg/commands/cache.go",
    "content": "/*\nCopyright 2020 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport v1 \"github.com/google/go-containerregistry/pkg/v1\"\n\ntype Cached interface {\n\tLayer() v1.Layer\n}\n\ntype caching struct {\n\tlayer v1.Layer\n}\n\nfunc (c caching) Layer() v1.Layer {\n\treturn c.layer\n}\n"
  },
  {
    "path": "pkg/commands/cache_test.go",
    "content": "/*\nCopyright 2020 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"testing\"\n)\n\nfunc Test_caching(t *testing.T) {\n\tc := caching{layer: fakeLayer{}}\n\n\tactual := c.Layer().(fakeLayer)\n\texpected := fakeLayer{}\n\tactualLen, expectedLen := len(actual.TarContent), len(expected.TarContent)\n\tif actualLen != expectedLen {\n\t\tt.Errorf(\"expected layer tar content to be %v but was %v\", expectedLen, actualLen)\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/cmd.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"strings\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\ntype CmdCommand struct {\n\tBaseCommand\n\tcmd *instructions.CmdCommand\n}\n\n// ExecuteCommand executes the CMD command\n// Argument handling is the same as RUN.\nfunc (c *CmdCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\tvar newCommand []string\n\tif c.cmd.PrependShell {\n\t\t// This is the default shell on Linux\n\t\tvar shell []string\n\t\tif len(config.Shell) > 0 {\n\t\t\tshell = config.Shell\n\t\t} else {\n\t\t\tshell = append(shell, \"/bin/sh\", \"-c\")\n\t\t}\n\n\t\tnewCommand = append(shell, strings.Join(c.cmd.CmdLine, \" \"))\n\t} else {\n\t\tnewCommand = c.cmd.CmdLine\n\t}\n\n\tconfig.Cmd = newCommand\n\t// ArgsEscaped is only used in windows environments\n\tconfig.ArgsEscaped = false\n\treturn nil\n}\n\n// String returns some information about the command for the image config history\nfunc (c *CmdCommand) String() string {\n\treturn c.cmd.String()\n}\n"
  },
  {
    "path": "pkg/commands/cmd_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\nvar cmdTests = []struct {\n\tprependShell bool\n\tcmdLine      []string\n\texpectedCmd  []string\n}{\n\t{\n\t\tprependShell: true,\n\t\tcmdLine:      []string{\"echo\", \"cmd1\"},\n\t\texpectedCmd:  []string{\"/bin/sh\", \"-c\", \"echo cmd1\"},\n\t},\n\t{\n\t\tprependShell: false,\n\t\tcmdLine:      []string{\"echo\", \"cmd2\"},\n\t\texpectedCmd:  []string{\"echo\", \"cmd2\"},\n\t},\n}\n\nfunc TestExecuteCmd(t *testing.T) {\n\n\tcfg := &v1.Config{\n\t\tCmd: nil,\n\t}\n\n\tfor _, test := range cmdTests {\n\t\tcmd := CmdCommand{\n\t\t\tcmd: &instructions.CmdCommand{\n\t\t\t\tShellDependantCmdLine: instructions.ShellDependantCmdLine{\n\t\t\t\t\tPrependShell: test.prependShell,\n\t\t\t\t\tCmdLine:      test.cmdLine,\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t\terr := cmd.ExecuteCommand(cfg, nil)\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, err, test.expectedCmd, cfg.Cmd)\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/commands.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n)\n\ntype CurrentCacheKey func() (string, error)\n\ntype DockerCommand interface {\n\t// ExecuteCommand is responsible for:\n\t// \t1. Making required changes to the filesystem (ex. copying files for ADD/COPY or setting ENV variables)\n\t//  2. Updating metadata fields in the config\n\t// It should not change the config history.\n\tExecuteCommand(*v1.Config, *dockerfile.BuildArgs) error\n\t// Returns a string representation of the command\n\tString() string\n\t// A list of files to snapshot, empty for metadata commands or nil if we don't know\n\tFilesToSnapshot() []string\n\n\t// ProvidesFileToSnapshot is true for all metadata commands and commands which know\n\t// list of files changed. False for Run command.\n\tProvidesFilesToSnapshot() bool\n\n\t// Return a cache-aware implementation of this command, if it exists.\n\tCacheCommand(v1.Image) DockerCommand\n\n\t// Return true if this command depends on the build context.\n\tFilesUsedFromContext(*v1.Config, *dockerfile.BuildArgs) ([]string, error)\n\n\tMetadataOnly() bool\n\n\tRequiresUnpackedFS() bool\n\n\t// Whether the output layer of this command should be cached in and\n\t// retrieved from the layer cache.\n\tShouldCacheOutput() bool\n\n\t// ShouldDetectDeletedFiles returns true if the command could delete files.\n\tShouldDetectDeletedFiles() bool\n\n\t// True if need add ARGs and EVNs to composite cache string with resolved command\n\t// need only for RUN instruction\n\tIsArgsEnvsRequiredInCache() bool\n}\n\nfunc GetCommand(cmd instructions.Command, fileContext util.FileContext, useNewRun bool, cacheCopy bool, cacheRun bool) (DockerCommand, error) {\n\tswitch c := cmd.(type) {\n\tcase *instructions.RunCommand:\n\t\tif useNewRun {\n\t\t\treturn &RunMarkerCommand{cmd: c, shdCache: cacheRun}, nil\n\t\t}\n\t\treturn &RunCommand{cmd: c, shdCache: cacheRun}, nil\n\tcase *instructions.CopyCommand:\n\t\treturn &CopyCommand{cmd: c, fileContext: fileContext, shdCache: cacheCopy}, nil\n\tcase *instructions.ExposeCommand:\n\t\treturn &ExposeCommand{cmd: c}, nil\n\tcase *instructions.EnvCommand:\n\t\treturn &EnvCommand{cmd: c}, nil\n\tcase *instructions.WorkdirCommand:\n\t\treturn &WorkdirCommand{cmd: c}, nil\n\tcase *instructions.AddCommand:\n\t\treturn &AddCommand{cmd: c, fileContext: fileContext}, nil\n\tcase *instructions.CmdCommand:\n\t\treturn &CmdCommand{cmd: c}, nil\n\tcase *instructions.EntrypointCommand:\n\t\treturn &EntrypointCommand{cmd: c}, nil\n\tcase *instructions.LabelCommand:\n\t\treturn &LabelCommand{cmd: c}, nil\n\tcase *instructions.UserCommand:\n\t\treturn &UserCommand{cmd: c}, nil\n\tcase *instructions.OnbuildCommand:\n\t\treturn &OnBuildCommand{cmd: c}, nil\n\tcase *instructions.VolumeCommand:\n\t\treturn &VolumeCommand{cmd: c}, nil\n\tcase *instructions.StopSignalCommand:\n\t\treturn &StopSignalCommand{cmd: c}, nil\n\tcase *instructions.ArgCommand:\n\t\treturn &ArgCommand{cmd: c}, nil\n\tcase *instructions.ShellCommand:\n\t\treturn &ShellCommand{cmd: c}, nil\n\tcase *instructions.HealthCheckCommand:\n\t\treturn &HealthCheckCommand{cmd: c}, nil\n\tcase *instructions.MaintainerCommand:\n\t\tlogrus.Warnf(\"%s is deprecated, skipping\", cmd.Name())\n\t\treturn nil, nil\n\t}\n\treturn nil, errors.Errorf(\"%s is not a supported command\", cmd.Name())\n}\n"
  },
  {
    "path": "pkg/commands/copy.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\tkConfig \"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n)\n\n// for testing\nvar (\n\tgetUserGroup = util.GetUserGroup\n)\n\ntype CopyCommand struct {\n\tBaseCommand\n\tcmd           *instructions.CopyCommand\n\tfileContext   util.FileContext\n\tsnapshotFiles []string\n\tshdCache      bool\n}\n\nfunc (c *CopyCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\t// Resolve from\n\tif c.cmd.From != \"\" {\n\t\tc.fileContext = util.FileContext{Root: filepath.Join(kConfig.KanikoDir, c.cmd.From)}\n\t}\n\n\treplacementEnvs := buildArgs.ReplacementEnvs(config.Env)\n\tuid, gid, err := getUserGroup(c.cmd.Chown, replacementEnvs)\n\tlogrus.Debugf(\"found uid %v and gid %v for chown string %v\", uid, gid, c.cmd.Chown)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"getting user group from chown\")\n\t}\n\n\t// sources from the Copy command are resolved with wildcards {*?[}\n\tsrcs, dest, err := util.ResolveEnvAndWildcards(c.cmd.SourcesAndDest, c.fileContext, replacementEnvs)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"resolving src\")\n\t}\n\n\tchmod, useDefaultChmod, err := util.GetChmod(c.cmd.Chmod, replacementEnvs)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"getting permissions from chmod\")\n\t}\n\n\t// For each source, iterate through and copy it over\n\tfor _, src := range srcs {\n\t\tfullPath := filepath.Join(c.fileContext.Root, src)\n\n\t\tfi, err := os.Lstat(fullPath)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"could not copy source\")\n\t\t}\n\t\tif fi.IsDir() && !strings.HasSuffix(fullPath, string(os.PathSeparator)) {\n\t\t\tfullPath += \"/\"\n\t\t}\n\t\tcwd := config.WorkingDir\n\t\tif cwd == \"\" {\n\t\t\tcwd = kConfig.RootDir\n\t\t}\n\n\t\tdestPath, err := util.DestinationFilepath(fullPath, dest, cwd)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"find destination path\")\n\t\t}\n\n\t\t// If the destination dir is a symlink we need to resolve the path and use\n\t\t// that instead of the symlink path\n\t\tdestPath, err = resolveIfSymlink(destPath)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"resolving dest symlink\")\n\t\t}\n\n\t\tif fi.IsDir() {\n\t\t\tcopiedFiles, err := util.CopyDir(fullPath, destPath, c.fileContext, uid, gid, chmod, useDefaultChmod)\n\t\t\tif err != nil {\n\t\t\t\treturn errors.Wrap(err, \"copying dir\")\n\t\t\t}\n\t\t\tc.snapshotFiles = append(c.snapshotFiles, copiedFiles...)\n\t\t} else if util.IsSymlink(fi) {\n\t\t\t// If file is a symlink, we want to copy the target file to destPath\n\t\t\texclude, err := util.CopySymlink(fullPath, destPath, c.fileContext)\n\t\t\tif err != nil {\n\t\t\t\treturn errors.Wrap(err, \"copying symlink\")\n\t\t\t}\n\t\t\tif exclude {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tc.snapshotFiles = append(c.snapshotFiles, destPath)\n\t\t} else {\n\t\t\t// ... Else, we want to copy over a file\n\t\t\texclude, err := util.CopyFile(fullPath, destPath, c.fileContext, uid, gid, chmod, useDefaultChmod)\n\t\t\tif err != nil {\n\t\t\t\treturn errors.Wrap(err, \"copying file\")\n\t\t\t}\n\t\t\tif exclude {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tc.snapshotFiles = append(c.snapshotFiles, destPath)\n\t\t}\n\t}\n\treturn nil\n}\n\n// FilesToSnapshot should return an empty array if still nil; no files were changed\nfunc (c *CopyCommand) FilesToSnapshot() []string {\n\treturn c.snapshotFiles\n}\n\n// String returns some information about the command for the image config\nfunc (c *CopyCommand) String() string {\n\treturn c.cmd.String()\n}\n\nfunc (c *CopyCommand) FilesUsedFromContext(config *v1.Config, buildArgs *dockerfile.BuildArgs) ([]string, error) {\n\treturn copyCmdFilesUsedFromContext(config, buildArgs, c.cmd, c.fileContext)\n}\n\nfunc (c *CopyCommand) MetadataOnly() bool {\n\treturn false\n}\n\nfunc (c *CopyCommand) RequiresUnpackedFS() bool {\n\treturn true\n}\n\nfunc (c *CopyCommand) From() string {\n\treturn c.cmd.From\n}\n\nfunc (c *CopyCommand) ShouldCacheOutput() bool {\n\treturn c.shdCache\n}\n\n// CacheCommand returns true since this command should be cached\nfunc (c *CopyCommand) CacheCommand(img v1.Image) DockerCommand {\n\treturn &CachingCopyCommand{\n\t\timg:         img,\n\t\tcmd:         c.cmd,\n\t\tfileContext: c.fileContext,\n\t\textractFn:   util.ExtractFile,\n\t}\n}\n\ntype CachingCopyCommand struct {\n\tBaseCommand\n\tcaching\n\timg            v1.Image\n\textractedFiles []string\n\tcmd            *instructions.CopyCommand\n\tfileContext    util.FileContext\n\textractFn      util.ExtractFunction\n}\n\nfunc (cr *CachingCopyCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\tlogrus.Infof(\"Found cached layer, extracting to filesystem\")\n\tvar err error\n\n\tif cr.img == nil {\n\t\treturn errors.New(fmt.Sprintf(\"cached command image is nil %v\", cr.String()))\n\t}\n\n\tlayers, err := cr.img.Layers()\n\tif err != nil {\n\t\treturn errors.Wrapf(err, \"retrieve image layers\")\n\t}\n\n\tif len(layers) != 1 {\n\t\treturn errors.New(fmt.Sprintf(\"expected %d layers but got %d\", 1, len(layers)))\n\t}\n\n\tcr.layer = layers[0]\n\tcr.extractedFiles, err = util.GetFSFromLayers(kConfig.RootDir, layers, util.ExtractFunc(cr.extractFn), util.IncludeWhiteout())\n\n\tlogrus.Debugf(\"ExtractedFiles: %s\", cr.extractedFiles)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"extracting fs from image\")\n\t}\n\n\treturn nil\n}\n\nfunc (cr *CachingCopyCommand) FilesUsedFromContext(config *v1.Config, buildArgs *dockerfile.BuildArgs) ([]string, error) {\n\treturn copyCmdFilesUsedFromContext(config, buildArgs, cr.cmd, cr.fileContext)\n}\n\nfunc (cr *CachingCopyCommand) FilesToSnapshot() []string {\n\tf := cr.extractedFiles\n\tlogrus.Debugf(\"%d files extracted by caching copy command\", len(f))\n\tlogrus.Tracef(\"Extracted files: %s\", f)\n\n\treturn f\n}\n\nfunc (cr *CachingCopyCommand) MetadataOnly() bool {\n\treturn false\n}\n\nfunc (cr *CachingCopyCommand) String() string {\n\tif cr.cmd == nil {\n\t\treturn \"nil command\"\n\t}\n\treturn cr.cmd.String()\n}\n\nfunc (cr *CachingCopyCommand) From() string {\n\treturn cr.cmd.From\n}\n\nfunc resolveIfSymlink(destPath string) (string, error) {\n\tif !filepath.IsAbs(destPath) {\n\t\treturn \"\", errors.New(\"dest path must be abs\")\n\t}\n\n\tvar nonexistentPaths []string\n\n\tnewPath := destPath\n\tfor newPath != \"/\" {\n\t\t_, err := os.Lstat(newPath)\n\t\tif err != nil {\n\t\t\tif os.IsNotExist(err) {\n\t\t\t\tdir, file := filepath.Split(newPath)\n\t\t\t\tnewPath = filepath.Clean(dir)\n\t\t\t\tnonexistentPaths = append(nonexistentPaths, file)\n\t\t\t\tcontinue\n\t\t\t} else {\n\t\t\t\treturn \"\", errors.Wrap(err, \"failed to lstat\")\n\t\t\t}\n\t\t}\n\n\t\tnewPath, err = filepath.EvalSymlinks(newPath)\n\t\tif err != nil {\n\t\t\treturn \"\", errors.Wrap(err, \"failed to eval symlinks\")\n\t\t}\n\t\tbreak\n\t}\n\n\tfor i := len(nonexistentPaths) - 1; i >= 0; i-- {\n\t\tnewPath = filepath.Join(newPath, nonexistentPaths[i])\n\t}\n\n\tif destPath != newPath {\n\t\tlogrus.Tracef(\"Updating destination path from %v to %v due to symlink\", destPath, newPath)\n\t}\n\n\treturn filepath.Clean(newPath), nil\n}\n\nfunc copyCmdFilesUsedFromContext(\n\tconfig *v1.Config, buildArgs *dockerfile.BuildArgs, cmd *instructions.CopyCommand,\n\tfileContext util.FileContext,\n) ([]string, error) {\n\tif cmd.From != \"\" {\n\t\tfileContext = util.FileContext{Root: filepath.Join(kConfig.KanikoDir, cmd.From)}\n\t}\n\n\treplacementEnvs := buildArgs.ReplacementEnvs(config.Env)\n\n\tsrcs, _, err := util.ResolveEnvAndWildcards(\n\t\tcmd.SourcesAndDest, fileContext, replacementEnvs,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfiles := []string{}\n\tfor _, src := range srcs {\n\t\tfullPath := filepath.Join(fileContext.Root, src)\n\t\tfiles = append(files, fullPath)\n\t}\n\n\tlogrus.Debugf(\"Using files from context: %v\", files)\n\n\treturn files, nil\n}\n\n// AbstractCopyCommand can either be a CopyCommand or a CachingCopyCommand.\ntype AbstractCopyCommand interface {\n\tFrom() string\n}\n\n// CastAbstractCopyCommand tries to convert a command to an AbstractCopyCommand.\nfunc CastAbstractCopyCommand(cmd interface{}) (AbstractCopyCommand, bool) {\n\tswitch v := cmd.(type) {\n\tcase *CopyCommand:\n\t\treturn v, true\n\tcase *CachingCopyCommand:\n\t\treturn v, true\n\t}\n\n\treturn nil, false\n}\n"
  },
  {
    "path": "pkg/commands/copy_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"archive/tar\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"syscall\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n)\n\nvar copyTests = []struct {\n\tname           string\n\tsourcesAndDest []string\n\texpectedDest   []string\n}{\n\t{\n\t\tname:           \"copy foo into tempCopyExecuteTest/\",\n\t\tsourcesAndDest: []string{\"foo\", \"tempCopyExecuteTest/\"},\n\t\texpectedDest:   []string{\"foo\"},\n\t},\n\t{\n\t\tname:           \"copy foo into tempCopyExecuteTest\",\n\t\tsourcesAndDest: []string{\"foo\", \"tempCopyExecuteTest\"},\n\t\texpectedDest:   []string{\"tempCopyExecuteTest\"},\n\t},\n\t{\n\t\tname:           \"copy f* into tempCopyExecuteTest\",\n\t\tsourcesAndDest: []string{\"foo*\", \"tempCopyExecuteTest\"},\n\t\texpectedDest:   []string{\"tempCopyExecuteTest\"},\n\t},\n\t{\n\t\tname:           \"copy fo? into tempCopyExecuteTest\",\n\t\tsourcesAndDest: []string{\"fo?\", \"tempCopyExecuteTest\"},\n\t\texpectedDest:   []string{\"tempCopyExecuteTest\"},\n\t},\n\t{\n\t\tname:           \"copy f[o][osp] into tempCopyExecuteTest\",\n\t\tsourcesAndDest: []string{\"f[o][osp]\", \"tempCopyExecuteTest\"},\n\t\texpectedDest:   []string{\"tempCopyExecuteTest\"},\n\t},\n\t{\n\t\tname:           \"Copy into several to-be-created directories\",\n\t\tsourcesAndDest: []string{\"f[o][osp]\", \"tempCopyExecuteTest/foo/bar\"},\n\t\texpectedDest:   []string{\"bar\"},\n\t},\n}\n\nfunc setupTestTemp(t *testing.T) string {\n\ttempDir := t.TempDir()\n\tlogrus.Debugf(\"Tempdir: %s\", tempDir)\n\n\tsrcPath, err := filepath.Abs(\"../../integration/context\")\n\tif err != nil {\n\t\tlogrus.Fatalf(\"Error getting abs path %s\", srcPath)\n\t}\n\tcperr := filepath.Walk(srcPath,\n\t\tfunc(path string, info os.FileInfo, err error) error {\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif path != srcPath {\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\ttempPath := strings.TrimPrefix(path, srcPath)\n\t\t\t\tfileInfo, err := os.Stat(path)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif fileInfo.IsDir() {\n\t\t\t\t\tos.MkdirAll(tempDir+\"/\"+tempPath, 0777)\n\t\t\t\t} else {\n\t\t\t\t\tout, err := os.Create(tempDir + \"/\" + tempPath)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tdefer out.Close()\n\n\t\t\t\t\tin, err := os.Open(path)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tdefer in.Close()\n\n\t\t\t\t\t_, err = io.Copy(out, in)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t})\n\tif cperr != nil {\n\t\tlogrus.Fatalf(\"Error populating temp dir %s\", cperr)\n\t}\n\n\treturn tempDir\n}\n\nfunc readDirectory(dirName string) ([]fs.FileInfo, error) {\n\tentries, err := os.ReadDir(dirName)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\ttestDir := make([]fs.FileInfo, 0, len(entries))\n\n\tfor _, entry := range entries {\n\t\tinfo, err := entry.Info()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ttestDir = append(testDir, info)\n\t}\n\treturn testDir, err\n}\n\nfunc Test_CachingCopyCommand_ExecuteCommand(t *testing.T) {\n\ttempDir := setupTestTemp(t)\n\n\ttarContent, err := prepareTarFixture(t, []string{\"foo.txt\"})\n\tif err != nil {\n\t\tt.Errorf(\"couldn't prepare tar fixture %v\", err)\n\t}\n\n\tconfig := &v1.Config{}\n\tbuildArgs := &dockerfile.BuildArgs{}\n\n\ttype testCase struct {\n\t\tdescription    string\n\t\texpectLayer    bool\n\t\texpectErr      bool\n\t\tcount          *int\n\t\texpectedCount  int\n\t\tcommand        *CachingCopyCommand\n\t\textractedFiles []string\n\t\tcontextFiles   []string\n\t}\n\ttestCases := []testCase{\n\t\tfunc() testCase {\n\t\t\terr = os.WriteFile(filepath.Join(tempDir, \"foo.txt\"), []byte(\"meow\"), 0644)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"couldn't write tempfile %v\", err)\n\t\t\t\tt.FailNow()\n\t\t\t}\n\n\t\t\tc := &CachingCopyCommand{\n\t\t\t\timg: fakeImage{\n\t\t\t\t\tImageLayers: []v1.Layer{\n\t\t\t\t\t\tfakeLayer{TarContent: tarContent},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tfileContext: util.FileContext{Root: tempDir},\n\t\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{\"foo.txt\"}, DestPath: \"\"}},\n\t\t\t}\n\t\t\tcount := 0\n\t\t\ttc := testCase{\n\t\t\t\tdescription:    \"with valid image and valid layer\",\n\t\t\t\tcount:          &count,\n\t\t\t\texpectedCount:  1,\n\t\t\t\texpectLayer:    true,\n\t\t\t\textractedFiles: []string{\"/foo.txt\"},\n\t\t\t\tcontextFiles:   []string{\"foo.txt\"},\n\t\t\t}\n\t\t\tc.extractFn = func(_ string, _ *tar.Header, _ string, _ io.Reader) error {\n\t\t\t\t*tc.count++\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\ttc.command = c\n\t\t\treturn tc\n\t\t}(),\n\t\tfunc() testCase {\n\t\t\tc := &CachingCopyCommand{}\n\t\t\ttc := testCase{\n\t\t\t\tdescription: \"with no image\",\n\t\t\t\texpectErr:   true,\n\t\t\t}\n\t\t\tc.extractFn = func(_ string, _ *tar.Header, _ string, _ io.Reader) error {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\ttc.command = c\n\t\t\treturn tc\n\t\t}(),\n\t\tfunc() testCase {\n\t\t\tc := &CachingCopyCommand{\n\t\t\t\timg: fakeImage{},\n\t\t\t}\n\t\t\tc.extractFn = func(_ string, _ *tar.Header, _ string, _ io.Reader) error {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn testCase{\n\t\t\t\tdescription: \"with image containing no layers\",\n\t\t\t\texpectErr:   true,\n\t\t\t\tcommand:     c,\n\t\t\t}\n\t\t}(),\n\t\tfunc() testCase {\n\t\t\tc := &CachingCopyCommand{\n\t\t\t\timg: fakeImage{\n\t\t\t\t\tImageLayers: []v1.Layer{\n\t\t\t\t\t\tfakeLayer{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t\tc.extractFn = func(_ string, _ *tar.Header, _ string, _ io.Reader) error {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\ttc := testCase{\n\t\t\t\tdescription: \"with image one layer which has no tar content\",\n\t\t\t\texpectErr:   false, // this one probably should fail but doesn't because of how ExecuteCommand and util.GetFSFromLayers are implemented - cvgw- 2019-11-25\n\t\t\t\texpectLayer: true,\n\t\t\t}\n\t\t\ttc.command = c\n\t\t\treturn tc\n\t\t}(),\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tc := tc.command\n\t\t\terr := c.ExecuteCommand(config, buildArgs)\n\t\t\tif !tc.expectErr && err != nil {\n\t\t\t\tt.Errorf(\"Expected err to be nil but was %v\", err)\n\t\t\t} else if tc.expectErr && err == nil {\n\t\t\t\tt.Error(\"Expected err but was nil\")\n\t\t\t}\n\n\t\t\tif tc.count != nil {\n\t\t\t\tif *tc.count != tc.expectedCount {\n\t\t\t\t\tt.Errorf(\"Expected extractFn to be called %v times but was called %v times\", tc.expectedCount, *tc.count)\n\t\t\t\t}\n\t\t\t\tfor _, file := range tc.extractedFiles {\n\t\t\t\t\tmatch := false\n\t\t\t\t\tcFiles := c.FilesToSnapshot()\n\t\t\t\t\tfor _, cFile := range cFiles {\n\t\t\t\t\t\tif file == cFile {\n\t\t\t\t\t\t\tmatch = true\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif !match {\n\t\t\t\t\t\tt.Errorf(\"Expected extracted files to include %v but did not %v\", file, cFiles)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcmdFiles, err := c.FilesUsedFromContext(\n\t\t\t\t\tconfig, buildArgs,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Errorf(\"failed to get files used from context from command %v\", err)\n\t\t\t\t}\n\n\t\t\t\tif len(cmdFiles) != len(tc.contextFiles) {\n\t\t\t\t\tt.Errorf(\"expected files used from context to equal %v but was %v\", tc.contextFiles, cmdFiles)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif c.layer == nil && tc.expectLayer {\n\t\t\t\tt.Error(\"expected the command to have a layer set but instead was nil\")\n\t\t\t} else if c.layer != nil && !tc.expectLayer {\n\t\t\t\tt.Error(\"expected the command to have no layer set but instead found a layer\")\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCopyExecuteCmd(t *testing.T) {\n\ttempDir := setupTestTemp(t)\n\n\tcfg := &v1.Config{\n\t\tCmd:        nil,\n\t\tEnv:        []string{},\n\t\tWorkingDir: tempDir,\n\t}\n\tfileContext := util.FileContext{Root: tempDir}\n\n\tfor _, test := range copyTests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tdirList := []string{}\n\n\t\t\tcmd := CopyCommand{\n\t\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: test.sourcesAndDest[0 : len(test.sourcesAndDest)-1],\n\t\t\t\t\t\tDestPath: test.sourcesAndDest[len(test.sourcesAndDest)-1]},\n\t\t\t\t},\n\t\t\t\tfileContext: fileContext,\n\t\t\t}\n\n\t\t\tbuildArgs := copySetUpBuildArgs()\n\t\t\tdest := cfg.WorkingDir + \"/\" + test.sourcesAndDest[len(test.sourcesAndDest)-1]\n\n\t\t\terr := cmd.ExecuteCommand(cfg, buildArgs)\n\t\t\tif err != nil {\n\t\t\t\tt.Error()\n\t\t\t}\n\n\t\t\tfi, err := os.Open(dest)\n\t\t\tif err != nil {\n\t\t\t\tt.Error()\n\t\t\t}\n\t\t\tdefer fi.Close()\n\t\t\tfstat, err := fi.Stat()\n\t\t\tif err != nil {\n\t\t\t\tt.Error()\n\t\t\t}\n\t\t\tif fstat == nil {\n\t\t\t\tt.Error()\n\t\t\t\treturn // Unrecoverable, will segfault in the next line\n\t\t\t}\n\t\t\tif fstat.IsDir() {\n\t\t\t\tfiles, err := readDirectory(dest)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Error()\n\t\t\t\t}\n\t\t\t\tfor _, file := range files {\n\t\t\t\t\tlogrus.Debugf(\"File: %v\", file.Name())\n\t\t\t\t\tdirList = append(dirList, file.Name())\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdirList = append(dirList, filepath.Base(dest))\n\t\t\t}\n\n\t\t\ttestutil.CheckErrorAndDeepEqual(t, false, err, test.expectedDest, dirList)\n\t\t\tos.RemoveAll(dest)\n\t\t})\n\t}\n}\n\nfunc copySetUpBuildArgs() *dockerfile.BuildArgs {\n\tbuildArgs := dockerfile.NewBuildArgs([]string{\n\t\t\"buildArg1=foo\",\n\t\t\"buildArg2=foo2\",\n\t})\n\tbuildArgs.AddArg(\"buildArg1\", nil)\n\td := \"default\"\n\tbuildArgs.AddArg(\"buildArg2\", &d)\n\treturn buildArgs\n}\n\nfunc Test_resolveIfSymlink(t *testing.T) {\n\ttype testCase struct {\n\t\tdestPath     string\n\t\texpectedPath string\n\t\terr          error\n\t}\n\n\ttmpDir := t.TempDir()\n\n\tbaseDir, err := os.MkdirTemp(tmpDir, \"not-linked\")\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\n\tpath, err := os.CreateTemp(baseDir, \"foo.txt\")\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\n\tthepath, err := filepath.Abs(filepath.Dir(path.Name()))\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\tcases := []testCase{\n\t\t{destPath: thepath, expectedPath: thepath, err: nil},\n\t\t{destPath: \"/\", expectedPath: \"/\", err: nil},\n\t}\n\tbaseDir = tmpDir\n\tsymLink := filepath.Join(baseDir, \"symlink\")\n\tif err := os.Symlink(filepath.Base(thepath), symLink); err != nil {\n\t\tt.Error(err)\n\t}\n\tcases = append(cases,\n\t\ttestCase{filepath.Join(symLink, \"foo.txt\"), filepath.Join(thepath, \"foo.txt\"), nil},\n\t\ttestCase{filepath.Join(symLink, \"inner\", \"foo.txt\"), filepath.Join(thepath, \"inner\", \"foo.txt\"), nil},\n\t)\n\n\tabsSymlink := filepath.Join(tmpDir, \"abs-symlink\")\n\tif err := os.Symlink(thepath, absSymlink); err != nil {\n\t\tt.Error(err)\n\t}\n\tcases = append(cases,\n\t\ttestCase{filepath.Join(absSymlink, \"foo.txt\"), filepath.Join(thepath, \"foo.txt\"), nil},\n\t\ttestCase{filepath.Join(absSymlink, \"inner\", \"foo.txt\"), filepath.Join(thepath, \"inner\", \"foo.txt\"), nil},\n\t)\n\n\tfor i, c := range cases {\n\t\tt.Run(fmt.Sprintf(\"%d\", i), func(t *testing.T) {\n\t\t\tres, e := resolveIfSymlink(c.destPath)\n\t\t\tif !errors.Is(e, c.err) {\n\t\t\t\tt.Errorf(\"%s: expected %v but got %v\", c.destPath, c.err, e)\n\t\t\t}\n\n\t\t\tif res != c.expectedPath {\n\t\t\t\tt.Errorf(\"%s: expected %v but got %v\", c.destPath, c.expectedPath, res)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_CopyEnvAndWildcards(t *testing.T) {\n\tsetupDirs := func(t *testing.T) (string, string) {\n\t\ttestDir := t.TempDir()\n\n\t\tdir := filepath.Join(testDir, \"bar\")\n\n\t\tif err := os.MkdirAll(dir, 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tfile := filepath.Join(dir, \"bam.txt\")\n\n\t\tif err := os.WriteFile(file, []byte(\"meow\"), 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttargetPath := filepath.Join(dir, \"dam.txt\")\n\t\tif err := os.WriteFile(targetPath, []byte(\"woof\"), 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif err := os.Symlink(\"dam.txt\", filepath.Join(dir, \"sym.link\")); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\treturn testDir, filepath.Base(dir)\n\t}\n\n\tt.Run(\"copy sources into a dir defined in env variable\", func(t *testing.T) {\n\t\ttestDir, srcDir := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\t\texpected, err := readDirectory(filepath.Join(testDir, srcDir))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\ttargetPath := filepath.Join(testDir, \"target\") + \"/\"\n\n\t\tcmd := CopyCommand{\n\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{srcDir + \"/*\"}, DestPath: \"$TARGET_PATH\"},\n\t\t\t},\n\t\t\tfileContext: util.FileContext{Root: testDir},\n\t\t}\n\n\t\tcfg := &v1.Config{\n\t\t\tCmd:        nil,\n\t\t\tEnv:        []string{\"TARGET_PATH=\" + targetPath},\n\t\t\tWorkingDir: testDir,\n\t\t}\n\n\t\terr = cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{}))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckNoError(t, err)\n\n\t\tactual, err := readDirectory(targetPath)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tfor i, f := range actual {\n\t\t\ttestutil.CheckDeepEqual(t, expected[i].Name(), f.Name())\n\t\t\ttestutil.CheckDeepEqual(t, expected[i].Mode(), f.Mode())\n\t\t}\n\n\t})\n\n\tt.Run(\"copy sources into a dir defined in env variable with no file found\", func(t *testing.T) {\n\t\ttestDir, srcDir := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\n\t\ttargetPath := filepath.Join(testDir, \"target\") + \"/\"\n\n\t\tcmd := CopyCommand{\n\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\t//should only dam and bam be copied\n\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{srcDir + \"/tam[s]\"}, DestPath: \"$TARGET_PATH\"},\n\t\t\t},\n\t\t\tfileContext: util.FileContext{Root: testDir},\n\t\t}\n\n\t\tcfg := &v1.Config{\n\t\t\tCmd:        nil,\n\t\t\tEnv:        []string{\"TARGET_PATH=\" + targetPath},\n\t\t\tWorkingDir: testDir,\n\t\t}\n\n\t\terr := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{}))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckNoError(t, err)\n\n\t\tactual, err := readDirectory(targetPath)\n\n\t\t//check it should error out since no files are copied and targetPath is not created\n\t\tif err == nil {\n\t\t\tt.Fatal(\"expected error no dirrectory but got nil\")\n\t\t}\n\n\t\t//actual should empty since no files are copied\n\t\ttestutil.CheckDeepEqual(t, 0, len(actual))\n\t})\n}\n\nfunc TestCopyCommand_ExecuteCommand_Extended(t *testing.T) {\n\tsetupDirs := func(t *testing.T) (string, string) {\n\t\ttestDir := t.TempDir()\n\n\t\tdir := filepath.Join(testDir, \"bar\")\n\n\t\tif err := os.MkdirAll(dir, 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tfile := filepath.Join(dir, \"bam.txt\")\n\n\t\tif err := os.WriteFile(file, []byte(\"meow\"), 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttargetPath := filepath.Join(dir, \"dam.txt\")\n\t\tif err := os.WriteFile(targetPath, []byte(\"woof\"), 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif err := os.Symlink(\"dam.txt\", filepath.Join(dir, \"sym.link\")); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\treturn testDir, filepath.Base(dir)\n\t}\n\n\tt.Run(\"copy dir to another dir\", func(t *testing.T) {\n\t\ttestDir, srcDir := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\t\texpected, err := readDirectory(filepath.Join(testDir, srcDir))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tcmd := CopyCommand{\n\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{srcDir}, DestPath: \"dest\"},\n\t\t\t},\n\t\t\tfileContext: util.FileContext{Root: testDir},\n\t\t}\n\n\t\tcfg := &v1.Config{\n\t\t\tCmd:        nil,\n\t\t\tEnv:        []string{},\n\t\t\tWorkingDir: testDir,\n\t\t}\n\n\t\terr = cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{}))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckNoError(t, err)\n\t\t// Check if \"dest\" dir exists with contents of srcDir\n\t\tactual, err := readDirectory(filepath.Join(testDir, \"dest\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tfor i, f := range actual {\n\t\t\ttestutil.CheckDeepEqual(t, expected[i].Name(), f.Name())\n\t\t\ttestutil.CheckDeepEqual(t, expected[i].Mode(), f.Mode())\n\t\t}\n\t})\n\n\tt.Run(\"copy dir to another dir - with ignored files\", func(t *testing.T) {\n\t\ttestDir, srcDir := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\t\tignoredFile := \"bam.txt\"\n\t\tsrcFiles, err := readDirectory(filepath.Join(testDir, srcDir))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\texpected := map[string]fs.FileInfo{}\n\t\tfor _, sf := range srcFiles {\n\t\t\tif sf.Name() == ignoredFile {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\texpected[sf.Name()] = sf\n\t\t}\n\n\t\tcmd := CopyCommand{\n\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{srcDir}, DestPath: \"dest\"},\n\t\t\t},\n\t\t\tfileContext: util.FileContext{\n\t\t\t\tRoot:          testDir,\n\t\t\t\tExcludedFiles: []string{filepath.Join(srcDir, ignoredFile)}},\n\t\t}\n\n\t\tcfg := &v1.Config{\n\t\t\tCmd:        nil,\n\t\t\tEnv:        []string{},\n\t\t\tWorkingDir: testDir,\n\t\t}\n\n\t\terr = cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{}))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckNoError(t, err)\n\t\t// Check if \"dest\" dir exists with contents of srcDir\n\t\tactual, err := readDirectory(filepath.Join(testDir, \"dest\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tif len(actual) != len(expected) {\n\t\t\tt.Errorf(\"%v files are expected to be copied, but got %v\", len(expected), len(actual))\n\t\t}\n\t\tfor _, f := range actual {\n\t\t\tif f.Name() == ignoredFile {\n\t\t\t\tt.Errorf(\"file %v is expected to be ignored, but copied\", f.Name())\n\t\t\t}\n\t\t\ttestutil.CheckDeepEqual(t, expected[f.Name()].Name(), f.Name())\n\t\t\ttestutil.CheckDeepEqual(t, expected[f.Name()].Mode(), f.Mode())\n\t\t}\n\t})\n\n\tt.Run(\"copy file to a dir\", func(t *testing.T) {\n\t\ttestDir, srcDir := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\t\tcmd := CopyCommand{\n\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{filepath.Join(srcDir, \"bam.txt\")}, DestPath: \"dest/\"},\n\t\t\t},\n\t\t\tfileContext: util.FileContext{Root: testDir},\n\t\t}\n\n\t\tcfg := &v1.Config{\n\t\t\tCmd:        nil,\n\t\t\tEnv:        []string{},\n\t\t\tWorkingDir: testDir,\n\t\t}\n\n\t\terr := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{}))\n\t\ttestutil.CheckNoError(t, err)\n\t\t// Check if \"dest\" dir exists with file bam.txt\n\t\tfiles, err := readDirectory(filepath.Join(testDir, \"dest\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckDeepEqual(t, 1, len(files))\n\t\ttestutil.CheckDeepEqual(t, files[0].Name(), \"bam.txt\")\n\t})\n\n\tt.Run(\"copy file to a filepath\", func(t *testing.T) {\n\t\ttestDir, srcDir := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\t\tcmd := CopyCommand{\n\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{filepath.Join(srcDir, \"bam.txt\")}, DestPath: \"dest\"},\n\t\t\t},\n\t\t\tfileContext: util.FileContext{Root: testDir},\n\t\t}\n\n\t\tcfg := &v1.Config{\n\t\t\tCmd:        nil,\n\t\t\tEnv:        []string{},\n\t\t\tWorkingDir: testDir,\n\t\t}\n\n\t\terr := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{}))\n\t\ttestutil.CheckNoError(t, err)\n\t\t// Check if bam.txt is copied to dest file\n\t\tif _, err := os.Lstat(filepath.Join(testDir, \"dest\")); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t})\n\tt.Run(\"copy file to a dir without trailing /\", func(t *testing.T) {\n\t\ttestDir, srcDir := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\n\t\tdestDir := filepath.Join(testDir, \"dest\")\n\t\tif err := os.MkdirAll(destDir, 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tcmd := CopyCommand{\n\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{filepath.Join(srcDir, \"bam.txt\")}, DestPath: \"dest\"},\n\t\t\t},\n\t\t\tfileContext: util.FileContext{Root: testDir},\n\t\t}\n\n\t\tcfg := &v1.Config{\n\t\t\tCmd:        nil,\n\t\t\tEnv:        []string{},\n\t\t\tWorkingDir: testDir,\n\t\t}\n\n\t\terr := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{}))\n\t\ttestutil.CheckNoError(t, err)\n\t\t// Check if \"dest\" dir exists with file bam.txt\n\t\tfiles, err := readDirectory(filepath.Join(testDir, \"dest\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckDeepEqual(t, 1, len(files))\n\t\ttestutil.CheckDeepEqual(t, files[0].Name(), \"bam.txt\")\n\n\t})\n\n\tt.Run(\"copy symlink file to a dir\", func(t *testing.T) {\n\t\ttestDir, srcDir := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\n\t\tcmd := CopyCommand{\n\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{filepath.Join(srcDir, \"sym.link\")}, DestPath: \"dest/\"},\n\t\t\t},\n\t\t\tfileContext: util.FileContext{Root: testDir},\n\t\t}\n\n\t\tcfg := &v1.Config{\n\t\t\tCmd:        nil,\n\t\t\tEnv:        []string{},\n\t\t\tWorkingDir: testDir,\n\t\t}\n\n\t\terr := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{}))\n\t\ttestutil.CheckNoError(t, err)\n\t\t// Check if \"dest\" dir exists with link sym.link\n\t\tfiles, err := readDirectory(filepath.Join(testDir, \"dest\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\t// bam.txt and sym.link should be present\n\t\ttestutil.CheckDeepEqual(t, 1, len(files))\n\t\ttestutil.CheckDeepEqual(t, files[0].Name(), \"sym.link\")\n\t\ttestutil.CheckDeepEqual(t, true, files[0].Mode()&os.ModeSymlink != 0)\n\t\tlinkName, err := os.Readlink(filepath.Join(testDir, \"dest\", \"sym.link\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckDeepEqual(t, linkName, \"dam.txt\")\n\t})\n\n\tt.Run(\"copy deadlink symlink file to a dir\", func(t *testing.T) {\n\t\ttestDir, srcDir := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\t\tdoesNotExists := filepath.Join(testDir, \"dead.txt\")\n\t\tif err := os.WriteFile(doesNotExists, []byte(\"remove me\"), 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif err := os.Symlink(\"../dead.txt\", filepath.Join(testDir, srcDir, \"dead.link\")); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif err := os.Remove(doesNotExists); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tcmd := CopyCommand{\n\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{filepath.Join(srcDir, \"dead.link\")}, DestPath: \"dest/\"},\n\t\t\t},\n\t\t\tfileContext: util.FileContext{Root: testDir},\n\t\t}\n\n\t\tcfg := &v1.Config{\n\t\t\tCmd:        nil,\n\t\t\tEnv:        []string{},\n\t\t\tWorkingDir: testDir,\n\t\t}\n\n\t\terr := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{}))\n\t\ttestutil.CheckNoError(t, err)\n\t\t// Check if \"dest\" dir exists with link dead.link\n\t\tfiles, err := readDirectory(filepath.Join(testDir, \"dest\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckDeepEqual(t, 1, len(files))\n\t\ttestutil.CheckDeepEqual(t, files[0].Name(), \"dead.link\")\n\t\ttestutil.CheckDeepEqual(t, true, files[0].Mode()&os.ModeSymlink != 0)\n\t\tlinkName, err := os.Readlink(filepath.Join(testDir, \"dest\", \"dead.link\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckDeepEqual(t, linkName, \"../dead.txt\")\n\t})\n\n\tt.Run(\"copy src symlink dir to a dir\", func(t *testing.T) {\n\t\ttestDir, srcDir := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\t\texpected, err := os.ReadDir(filepath.Join(testDir, srcDir))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tanother := filepath.Join(testDir, \"another\")\n\t\tos.Symlink(filepath.Join(testDir, srcDir), another)\n\n\t\tcmd := CopyCommand{\n\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{\"another\"}, DestPath: \"dest\"},\n\t\t\t},\n\t\t\tfileContext: util.FileContext{Root: testDir},\n\t\t}\n\n\t\tcfg := &v1.Config{\n\t\t\tCmd:        nil,\n\t\t\tEnv:        []string{},\n\t\t\tWorkingDir: testDir,\n\t\t}\n\n\t\terr = cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{}))\n\t\ttestutil.CheckNoError(t, err)\n\t\t// Check if \"dest\" dir exists with contents of srcDir\n\t\tactual, err := os.ReadDir(filepath.Join(testDir, \"dest\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tfor i, f := range actual {\n\t\t\ttestutil.CheckDeepEqual(t, expected[i].Name(), f.Name())\n\t\t\ttestutil.CheckDeepEqual(t, expected[i].Type(), f.Type())\n\t\t}\n\t})\n\n\tt.Run(\"copy dir with a symlink to a file outside of current src dir\", func(t *testing.T) {\n\t\ttestDir, srcDir := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\t\texpected, err := readDirectory(filepath.Join(testDir, srcDir))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tanotherSrc := filepath.Join(testDir, \"anotherSrc\")\n\t\tif err := os.MkdirAll(anotherSrc, 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttargetPath := filepath.Join(anotherSrc, \"target.txt\")\n\t\tif err := os.WriteFile(targetPath, []byte(\"woof\"), 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif err := os.Symlink(targetPath, filepath.Join(testDir, srcDir, \"zSym.link\")); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tcmd := CopyCommand{\n\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{srcDir}, DestPath: \"dest\"},\n\t\t\t},\n\t\t\tfileContext: util.FileContext{Root: testDir},\n\t\t}\n\n\t\tcfg := &v1.Config{\n\t\t\tCmd:        nil,\n\t\t\tEnv:        []string{},\n\t\t\tWorkingDir: testDir,\n\t\t}\n\n\t\terr = cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{}))\n\t\ttestutil.CheckNoError(t, err)\n\t\t// Check if \"dest\" dir exists contents of srcDir and an extra zSym.link created\n\t\t// in this test\n\t\tactual, err := readDirectory(filepath.Join(testDir, \"dest\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckDeepEqual(t, 4, len(actual))\n\t\tfor i, f := range expected {\n\t\t\ttestutil.CheckDeepEqual(t, f.Name(), actual[i].Name())\n\t\t\ttestutil.CheckDeepEqual(t, f.Mode(), actual[i].Mode())\n\t\t}\n\t\tlinkName, err := os.Readlink(filepath.Join(testDir, \"dest\", \"zSym.link\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckDeepEqual(t, linkName, targetPath)\n\t})\n\n\tt.Run(\"copy src symlink dir to a dir\", func(t *testing.T) {\n\t\ttestDir, srcDir := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\t\texpected, err := os.ReadDir(filepath.Join(testDir, srcDir))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tanother := filepath.Join(testDir, \"another\")\n\t\tos.Symlink(filepath.Join(testDir, srcDir), another)\n\n\t\tcmd := CopyCommand{\n\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{\"another\"}, DestPath: \"dest\"},\n\t\t\t},\n\t\t\tfileContext: util.FileContext{Root: testDir},\n\t\t}\n\n\t\tcfg := &v1.Config{\n\t\t\tCmd:        nil,\n\t\t\tEnv:        []string{},\n\t\t\tWorkingDir: testDir,\n\t\t}\n\n\t\terr = cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{}))\n\t\ttestutil.CheckNoError(t, err)\n\t\t// Check if \"dest\" dir exists with bam.txt and \"dest\" dir is a symlink\n\t\tactual, err := os.ReadDir(filepath.Join(testDir, \"dest\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tfor i, f := range actual {\n\t\t\ttestutil.CheckDeepEqual(t, expected[i].Name(), f.Name())\n\t\t\ttestutil.CheckDeepEqual(t, expected[i].Type(), f.Type())\n\t\t}\n\t})\n\n\tt.Run(\"copy src dir to a dest dir which is a symlink\", func(t *testing.T) {\n\t\ttestDir, srcDir := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\t\texpected, err := readDirectory(filepath.Join(testDir, srcDir))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tdest := filepath.Join(testDir, \"dest\")\n\t\tif err := os.MkdirAll(dest, 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tlinkedDest := filepath.Join(testDir, \"linkDest\")\n\t\tif err := os.Symlink(dest, linkedDest); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tcmd := CopyCommand{\n\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{srcDir}, DestPath: linkedDest},\n\t\t\t},\n\t\t\tfileContext: util.FileContext{Root: testDir},\n\t\t}\n\n\t\tcfg := &v1.Config{\n\t\t\tCmd:        nil,\n\t\t\tEnv:        []string{},\n\t\t\tWorkingDir: testDir,\n\t\t}\n\n\t\terr = cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{}))\n\t\ttestutil.CheckNoError(t, err)\n\t\t// Check if \"linkdest\" dir exists with contents of srcDir\n\t\tactual, err := readDirectory(filepath.Join(testDir, \"linkDest\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tfor i, f := range expected {\n\t\t\ttestutil.CheckDeepEqual(t, f.Name(), actual[i].Name())\n\t\t\ttestutil.CheckDeepEqual(t, f.Mode(), actual[i].Mode())\n\t\t}\n\t\t// Check if linkDest -> dest\n\t\tlinkName, err := os.Readlink(filepath.Join(testDir, \"linkDest\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckDeepEqual(t, linkName, dest)\n\t})\n\n\tt.Run(\"copy src file to a dest dir which is a symlink\", func(t *testing.T) {\n\t\ttestDir, srcDir := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\n\t\tdest := filepath.Join(testDir, \"dest\")\n\t\tif err := os.MkdirAll(dest, 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tlinkedDest := filepath.Join(testDir, \"linkDest\")\n\t\tif err := os.Symlink(dest, linkedDest); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tcmd := CopyCommand{\n\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{fmt.Sprintf(\"%s/bam.txt\", srcDir)}, DestPath: linkedDest},\n\t\t\t},\n\t\t\tfileContext: util.FileContext{Root: testDir},\n\t\t}\n\n\t\tcfg := &v1.Config{\n\t\t\tCmd:        nil,\n\t\t\tEnv:        []string{},\n\t\t\tWorkingDir: testDir,\n\t\t}\n\n\t\terr := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{}))\n\t\ttestutil.CheckNoError(t, err)\n\t\t// Check if \"linkDest\" link is same.\n\t\tactual, err := readDirectory(filepath.Join(testDir, \"dest\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckDeepEqual(t, \"bam.txt\", actual[0].Name())\n\t\tc, err := os.ReadFile(filepath.Join(testDir, \"dest\", \"bam.txt\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckDeepEqual(t, \"meow\", string(c))\n\t\t// Check if linkDest -> dest\n\t\tlinkName, err := os.Readlink(filepath.Join(testDir, \"linkDest\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckDeepEqual(t, linkName, dest)\n\t})\n\n\tt.Run(\"copy src file to a dest dir with chown\", func(t *testing.T) {\n\t\ttestDir, srcDir := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\n\t\toriginal := getUserGroup\n\t\tdefer func() { getUserGroup = original }()\n\n\t\tuid := os.Getuid()\n\t\tgid := os.Getgid()\n\n\t\tgetUserGroup = func(userStr string, _ []string) (int64, int64, error) {\n\t\t\treturn int64(uid), int64(gid), nil\n\t\t}\n\n\t\tcmd := CopyCommand{\n\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{fmt.Sprintf(\"%s/bam.txt\", srcDir)}, DestPath: testDir},\n\t\t\t\tChown:          \"alice:group\",\n\t\t\t},\n\t\t\tfileContext: util.FileContext{Root: testDir},\n\t\t}\n\n\t\tcfg := &v1.Config{\n\t\t\tCmd:        nil,\n\t\t\tEnv:        []string{},\n\t\t\tWorkingDir: testDir,\n\t\t}\n\n\t\terr := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{}))\n\t\ttestutil.CheckNoError(t, err)\n\n\t\tactual, err := readDirectory(filepath.Join(testDir))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\ttestutil.CheckDeepEqual(t, \"bam.txt\", actual[0].Name())\n\n\t\tif stat, ok := actual[0].Sys().(*syscall.Stat_t); ok {\n\t\t\tif int(stat.Uid) != uid {\n\t\t\t\tt.Errorf(\"uid don't match, got %d, expected %d\", stat.Uid, uid)\n\t\t\t}\n\t\t\tif int(stat.Gid) != gid {\n\t\t\t\tt.Errorf(\"gid don't match, got %d, expected %d\", stat.Gid, gid)\n\t\t\t}\n\t\t}\n\t})\n\n\tt.Run(\"copy src file to a dest dir with chown and random user\", func(t *testing.T) {\n\t\ttestDir, srcDir := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\n\t\toriginal := getUserGroup\n\t\tdefer func() { getUserGroup = original }()\n\n\t\tgetUserGroup = func(userStr string, _ []string) (int64, int64, error) {\n\t\t\treturn 12345, 12345, nil\n\t\t}\n\n\t\tcmd := CopyCommand{\n\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{fmt.Sprintf(\"%s/bam.txt\", srcDir)}, DestPath: testDir},\n\t\t\t\tChown:          \"missing:missing\",\n\t\t\t},\n\t\t\tfileContext: util.FileContext{Root: testDir},\n\t\t}\n\n\t\tcfg := &v1.Config{\n\t\t\tCmd:        nil,\n\t\t\tEnv:        []string{},\n\t\t\tWorkingDir: testDir,\n\t\t}\n\n\t\terr := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{}))\n\t\tif !errors.Is(err, os.ErrPermission) {\n\t\t\ttestutil.CheckNoError(t, err)\n\t\t}\n\t})\n\n\tt.Run(\"copy src dir with relative symlinks in a dir\", func(t *testing.T) {\n\t\ttestDir, srcDir := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\n\t\t// Make another dir inside bar with a relative symlink\n\t\tdir := filepath.Join(testDir, srcDir, \"another\")\n\t\tif err := os.MkdirAll(dir, 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tos.Symlink(\"../bam.txt\", filepath.Join(dir, \"bam_relative.txt\"))\n\n\t\tdest := filepath.Join(testDir, \"copy\")\n\t\tcmd := CopyCommand{\n\t\t\tcmd: &instructions.CopyCommand{\n\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{srcDir}, DestPath: dest},\n\t\t\t},\n\t\t\tfileContext: util.FileContext{Root: testDir},\n\t\t}\n\n\t\tcfg := &v1.Config{\n\t\t\tCmd:        nil,\n\t\t\tEnv:        []string{},\n\t\t\tWorkingDir: testDir,\n\t\t}\n\t\terr := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{}))\n\t\ttestutil.CheckNoError(t, err)\n\t\tactual, err := os.ReadDir(filepath.Join(dest, \"another\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckDeepEqual(t, \"bam_relative.txt\", actual[0].Name())\n\t\tlinkName, err := os.Readlink(filepath.Join(dest, \"another\", \"bam_relative.txt\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckDeepEqual(t, \"../bam.txt\", linkName)\n\t})\n}\n"
  },
  {
    "path": "pkg/commands/entrypoint.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"strings\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\ntype EntrypointCommand struct {\n\tBaseCommand\n\tcmd *instructions.EntrypointCommand\n}\n\n// ExecuteCommand handles command processing similar to CMD and RUN,\nfunc (e *EntrypointCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\tvar newCommand []string\n\tif e.cmd.PrependShell {\n\t\t// This is the default shell on Linux\n\t\tvar shell []string\n\t\tif len(config.Shell) > 0 {\n\t\t\tshell = config.Shell\n\t\t} else {\n\t\t\tshell = append(shell, \"/bin/sh\", \"-c\")\n\t\t}\n\n\t\tnewCommand = append(shell, strings.Join(e.cmd.CmdLine, \" \"))\n\t} else {\n\t\tnewCommand = e.cmd.CmdLine\n\t}\n\n\tconfig.Entrypoint = newCommand\n\treturn nil\n}\n\n// String returns some information about the command for the image config history\nfunc (e *EntrypointCommand) String() string {\n\treturn e.cmd.String()\n}\n"
  },
  {
    "path": "pkg/commands/entrypoint_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\nvar entrypointTests = []struct {\n\tprependShell bool\n\tcmdLine      []string\n\texpectedCmd  []string\n}{\n\t{\n\t\tprependShell: true,\n\t\tcmdLine:      []string{\"echo\", \"cmd1\"},\n\t\texpectedCmd:  []string{\"/bin/sh\", \"-c\", \"echo cmd1\"},\n\t},\n\t{\n\t\tprependShell: false,\n\t\tcmdLine:      []string{\"echo\", \"cmd2\"},\n\t\texpectedCmd:  []string{\"echo\", \"cmd2\"},\n\t},\n}\n\nfunc TestEntrypointExecuteCmd(t *testing.T) {\n\n\tcfg := &v1.Config{\n\t\tCmd: nil,\n\t}\n\n\tfor _, test := range entrypointTests {\n\t\tcmd := EntrypointCommand{\n\t\t\tcmd: &instructions.EntrypointCommand{\n\t\t\t\tShellDependantCmdLine: instructions.ShellDependantCmdLine{\n\t\t\t\t\tPrependShell: test.prependShell,\n\t\t\t\t\tCmdLine:      test.cmdLine,\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t\terr := cmd.ExecuteCommand(cfg, nil)\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, err, test.expectedCmd, cfg.Entrypoint)\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/env.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\ntype EnvCommand struct {\n\tBaseCommand\n\tcmd *instructions.EnvCommand\n}\n\nfunc (e *EnvCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\tnewEnvs := e.cmd.Env\n\treplacementEnvs := buildArgs.ReplacementEnvs(config.Env)\n\treturn util.UpdateConfigEnv(newEnvs, config, replacementEnvs)\n}\n\n// String returns some information about the command for the image config history\nfunc (e *EnvCommand) String() string {\n\treturn e.cmd.String()\n}\n"
  },
  {
    "path": "pkg/commands/env_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\nfunc Test_EnvExecute(t *testing.T) {\n\tcfg := &v1.Config{\n\t\tEnv: []string{\n\t\t\t\"path=/usr/\",\n\t\t\t\"home=/root\",\n\t\t},\n\t}\n\n\tenvCmd := &EnvCommand{\n\t\tcmd: &instructions.EnvCommand{\n\t\t\tEnv: []instructions.KeyValuePair{\n\t\t\t\t{\n\t\t\t\t\tKey:   \"path\",\n\t\t\t\t\tValue: \"/some/path\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tKey:   \"HOME\",\n\t\t\t\t\tValue: \"$home\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tKey:   \"$path\",\n\t\t\t\t\tValue: \"$home/\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tKey:   \"$buildArg1\",\n\t\t\t\t\tValue: \"$buildArg2\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\texpectedEnvs := []string{\n\t\t\"path=/some/path\",\n\t\t\"home=/root\",\n\t\t\"HOME=/root\",\n\t\t\"/usr/=/root/\",\n\t\t\"foo=foo2\",\n\t}\n\tbuildArgs := setUpBuildArgs()\n\terr := envCmd.ExecuteCommand(cfg, buildArgs)\n\ttestutil.CheckErrorAndDeepEqual(t, false, err, expectedEnvs, cfg.Env)\n}\n\nfunc setUpBuildArgs() *dockerfile.BuildArgs {\n\tbuildArgs := dockerfile.NewBuildArgs([]string{\n\t\t\"buildArg1=foo\",\n\t\t\"buildArg2=foo2\",\n\t})\n\tbuildArgs.AddArg(\"buildArg1\", nil)\n\td := \"default\"\n\tbuildArgs.AddArg(\"buildArg2\", &d)\n\treturn buildArgs\n}\n"
  },
  {
    "path": "pkg/commands/expose.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n\t\"github.com/sirupsen/logrus\"\n)\n\ntype ExposeCommand struct {\n\tBaseCommand\n\tcmd *instructions.ExposeCommand\n}\n\nfunc (r *ExposeCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\tlogrus.Info(\"Cmd: EXPOSE\")\n\t// Grab the currently exposed ports\n\texistingPorts := config.ExposedPorts\n\tif existingPorts == nil {\n\t\texistingPorts = make(map[string]struct{})\n\t}\n\treplacementEnvs := buildArgs.ReplacementEnvs(config.Env)\n\t// Add any new ones in\n\tfor _, p := range r.cmd.Ports {\n\t\t// Resolve any environment variables\n\t\tp, err := util.ResolveEnvironmentReplacement(p, replacementEnvs, false)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Add the default protocol if one isn't specified\n\t\tif !strings.Contains(p, \"/\") {\n\t\t\tp = p + \"/tcp\"\n\t\t}\n\t\tprotocol := strings.Split(p, \"/\")[1]\n\t\tif !validProtocol(protocol) {\n\t\t\treturn fmt.Errorf(\"invalid protocol: %s\", protocol)\n\t\t}\n\t\tlogrus.Infof(\"Adding exposed port: %s\", p)\n\t\texistingPorts[p] = struct{}{}\n\t}\n\tconfig.ExposedPorts = existingPorts\n\treturn nil\n}\n\nfunc validProtocol(protocol string) bool {\n\tvalidProtocols := [2]string{\"tcp\", \"udp\"}\n\tfor _, p := range validProtocols {\n\t\tif protocol == p {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (r *ExposeCommand) String() string {\n\treturn r.cmd.String()\n}\n"
  },
  {
    "path": "pkg/commands/expose_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\nfunc TestUpdateExposedPorts(t *testing.T) {\n\tcfg := &v1.Config{\n\t\tExposedPorts: map[string]struct{}{\n\t\t\t\"8080/tcp\": {},\n\t\t},\n\t\tEnv: []string{\n\t\t\t\"port=udp\",\n\t\t\t\"num=8085\",\n\t\t},\n\t}\n\n\tports := []string{\n\t\t\"8080\",\n\t\t\"8081/tcp\",\n\t\t\"8082\",\n\t\t\"8083/udp\",\n\t\t\"8084/$port\",\n\t\t\"$num\",\n\t\t\"$num/$port\",\n\t}\n\n\texposeCmd := &ExposeCommand{\n\t\tcmd: &instructions.ExposeCommand{\n\t\t\tPorts: ports,\n\t\t},\n\t}\n\n\texpectedPorts := map[string]struct{}{\n\t\t\"8080/tcp\": {},\n\t\t\"8081/tcp\": {},\n\t\t\"8082/tcp\": {},\n\t\t\"8083/udp\": {},\n\t\t\"8084/udp\": {},\n\t\t\"8085/tcp\": {},\n\t\t\"8085/udp\": {},\n\t}\n\tbuildArgs := dockerfile.NewBuildArgs([]string{})\n\terr := exposeCmd.ExecuteCommand(cfg, buildArgs)\n\ttestutil.CheckErrorAndDeepEqual(t, false, err, expectedPorts, cfg.ExposedPorts)\n}\n\nfunc TestInvalidProtocol(t *testing.T) {\n\tcfg := &v1.Config{\n\t\tExposedPorts: map[string]struct{}{},\n\t}\n\n\tports := []string{\n\t\t\"80/garbage\",\n\t}\n\n\texposeCmd := &ExposeCommand{\n\t\tcmd: &instructions.ExposeCommand{\n\t\t\tPorts: ports,\n\t\t},\n\t}\n\tbuildArgs := dockerfile.NewBuildArgs([]string{})\n\terr := exposeCmd.ExecuteCommand(cfg, buildArgs)\n\ttestutil.CheckErrorAndDeepEqual(t, true, err, nil, nil)\n}\n"
  },
  {
    "path": "pkg/commands/fake_commands.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// used for testing in the commands package\npackage commands\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/google/go-containerregistry/pkg/v1/types\"\n)\n\ntype fakeLayer struct {\n\tTarContent []byte\n}\n\nfunc (f fakeLayer) Digest() (v1.Hash, error) {\n\treturn v1.Hash{}, nil\n}\nfunc (f fakeLayer) DiffID() (v1.Hash, error) {\n\treturn v1.Hash{}, nil\n}\nfunc (f fakeLayer) Compressed() (io.ReadCloser, error) {\n\treturn nil, nil\n}\nfunc (f fakeLayer) Uncompressed() (io.ReadCloser, error) {\n\treturn io.NopCloser(bytes.NewReader(f.TarContent)), nil\n}\nfunc (f fakeLayer) Size() (int64, error) {\n\treturn 0, nil\n}\nfunc (f fakeLayer) MediaType() (types.MediaType, error) {\n\treturn \"\", nil\n}\n\ntype fakeImage struct {\n\tImageLayers []v1.Layer\n}\n\nfunc (f fakeImage) Layers() ([]v1.Layer, error) {\n\treturn f.ImageLayers, nil\n}\nfunc (f fakeImage) MediaType() (types.MediaType, error) {\n\treturn \"\", nil\n}\nfunc (f fakeImage) Size() (int64, error) {\n\treturn 0, nil\n}\nfunc (f fakeImage) ConfigName() (v1.Hash, error) {\n\treturn v1.Hash{}, nil\n}\nfunc (f fakeImage) ConfigFile() (*v1.ConfigFile, error) {\n\treturn &v1.ConfigFile{}, nil\n}\nfunc (f fakeImage) RawConfigFile() ([]byte, error) {\n\treturn []byte{}, nil\n}\nfunc (f fakeImage) Digest() (v1.Hash, error) {\n\treturn v1.Hash{}, nil\n}\nfunc (f fakeImage) Manifest() (*v1.Manifest, error) {\n\treturn &v1.Manifest{}, nil\n}\nfunc (f fakeImage) RawManifest() ([]byte, error) {\n\treturn []byte{}, nil\n}\nfunc (f fakeImage) LayerByDigest(v1.Hash) (v1.Layer, error) {\n\treturn fakeLayer{}, nil\n}\nfunc (f fakeImage) LayerByDiffID(v1.Hash) (v1.Layer, error) {\n\treturn fakeLayer{}, nil\n}\n"
  },
  {
    "path": "pkg/commands/healthcheck.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\t\"github.com/docker/docker/api/types/container\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\nfunc convertDockerHealthConfigToContainerRegistryFormat(dockerHealthcheck container.HealthConfig) v1.HealthConfig {\n\treturn v1.HealthConfig{\n\t\tTest:        dockerHealthcheck.Test,\n\t\tInterval:    dockerHealthcheck.Interval,\n\t\tTimeout:     dockerHealthcheck.Timeout,\n\t\tStartPeriod: dockerHealthcheck.StartPeriod,\n\t\tRetries:     dockerHealthcheck.Retries,\n\t}\n}\n\ntype HealthCheckCommand struct {\n\tBaseCommand\n\tcmd *instructions.HealthCheckCommand\n}\n\n// ExecuteCommand handles command processing similar to CMD and RUN,\nfunc (h *HealthCheckCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\tcheck := convertDockerHealthConfigToContainerRegistryFormat(*h.cmd.Health)\n\tconfig.Healthcheck = &check\n\n\treturn nil\n}\n\n// String returns some information about the command for the image config history\nfunc (h *HealthCheckCommand) String() string {\n\treturn h.cmd.String()\n}\n"
  },
  {
    "path": "pkg/commands/label.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n\t\"github.com/sirupsen/logrus\"\n)\n\ntype LabelCommand struct {\n\tBaseCommand\n\tcmd *instructions.LabelCommand\n}\n\nfunc (r *LabelCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\treturn updateLabels(r.cmd.Labels, config, buildArgs)\n}\n\nfunc updateLabels(labels []instructions.KeyValuePair, config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\texistingLabels := config.Labels\n\tif existingLabels == nil {\n\t\texistingLabels = make(map[string]string)\n\t}\n\t// Let's unescape values before setting the label\n\treplacementEnvs := buildArgs.ReplacementEnvs(config.Env)\n\tfor index, kvp := range labels {\n\t\tkey, err := util.ResolveEnvironmentReplacement(kvp.Key, replacementEnvs, false)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tunescaped, err := util.ResolveEnvironmentReplacement(kvp.Value, replacementEnvs, false)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tlabels[index] = instructions.KeyValuePair{\n\t\t\tKey:   key,\n\t\t\tValue: unescaped,\n\t\t}\n\t}\n\tfor _, kvp := range labels {\n\t\tlogrus.Infof(\"Applying label %s=%s\", kvp.Key, kvp.Value)\n\t\texistingLabels[kvp.Key] = kvp.Value\n\t}\n\n\tconfig.Labels = existingLabels\n\treturn nil\n\n}\n\n// String returns some information about the command for the image config history\nfunc (r *LabelCommand) String() string {\n\treturn r.cmd.String()\n}\n"
  },
  {
    "path": "pkg/commands/label_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\nfunc TestUpdateLabels(t *testing.T) {\n\tcfg := &v1.Config{\n\t\tLabels: map[string]string{\n\t\t\t\"foo\": \"bar\",\n\t\t},\n\t}\n\n\tlabels := []instructions.KeyValuePair{\n\t\t{\n\t\t\tKey:   \"foo\",\n\t\t\tValue: \"override\",\n\t\t},\n\t\t{\n\t\t\tKey:   \"bar\",\n\t\t\tValue: \"baz\",\n\t\t},\n\t\t{\n\t\t\tKey:   \"multiword\",\n\t\t\tValue: \"lots\\\\ of\\\\ words\",\n\t\t},\n\t\t{\n\t\t\tKey:   \"backslashes\",\n\t\t\tValue: \"lots\\\\\\\\ of\\\\\\\\ words\",\n\t\t},\n\t\t{\n\t\t\tKey:   \"$label\",\n\t\t\tValue: \"foo\",\n\t\t},\n\t}\n\n\targuments := []string{\n\t\t\"label=build_arg_label\",\n\t}\n\n\tbuildArgs := dockerfile.NewBuildArgs(arguments)\n\tbuildArgs.AddArg(\"label\", nil)\n\texpectedLabels := map[string]string{\n\t\t\"foo\":             \"override\",\n\t\t\"bar\":             \"baz\",\n\t\t\"multiword\":       \"lots of words\",\n\t\t\"backslashes\":     \"lots\\\\ of\\\\ words\",\n\t\t\"build_arg_label\": \"foo\",\n\t}\n\tupdateLabels(labels, cfg, buildArgs)\n\ttestutil.CheckErrorAndDeepEqual(t, false, nil, expectedLabels, cfg.Labels)\n}\n"
  },
  {
    "path": "pkg/commands/onbuild.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n\t\"github.com/sirupsen/logrus\"\n)\n\ntype OnBuildCommand struct {\n\tBaseCommand\n\tcmd *instructions.OnbuildCommand\n}\n\n// ExecuteCommand adds the specified expression in Onbuild to the config\nfunc (o *OnBuildCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\tlogrus.Info(\"Cmd: ONBUILD\")\n\tlogrus.Infof(\"Args: %s\", o.cmd.Expression)\n\tif config.OnBuild == nil {\n\t\tconfig.OnBuild = []string{o.cmd.Expression}\n\t} else {\n\t\tconfig.OnBuild = append(config.OnBuild, o.cmd.Expression)\n\t}\n\treturn nil\n}\n\n// String returns some information about the command for the image config history\nfunc (o *OnBuildCommand) String() string {\n\treturn o.cmd.String()\n}\n"
  },
  {
    "path": "pkg/commands/onbuild_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\nvar onbuildTests = []struct {\n\texpression    string\n\tonbuildArray  []string\n\texpectedArray []string\n}{\n\t{\n\t\texpression:   \"RUN echo \\\\\\\"hi\\\\\\\" > $dir\",\n\t\tonbuildArray: nil,\n\t\texpectedArray: []string{\n\t\t\t\"RUN echo \\\\\\\"hi\\\\\\\" > $dir\",\n\t\t},\n\t},\n\t{\n\t\texpression: \"COPY foo foo\",\n\t\tonbuildArray: []string{\n\t\t\t\"RUN echo \\\"hi\\\" > /some/dir\",\n\t\t},\n\t\texpectedArray: []string{\n\t\t\t\"RUN echo \\\"hi\\\" > /some/dir\",\n\t\t\t\"COPY foo foo\",\n\t\t},\n\t},\n}\n\nfunc TestExecuteOnbuild(t *testing.T) {\n\tfor _, test := range onbuildTests {\n\t\tcfg := &v1.Config{\n\t\t\tEnv: []string{\n\t\t\t\t\"dir=/some/dir\",\n\t\t\t},\n\t\t\tOnBuild: test.onbuildArray,\n\t\t}\n\n\t\tonbuildCmd := &OnBuildCommand{\n\t\t\tcmd: &instructions.OnbuildCommand{\n\t\t\t\tExpression: test.expression,\n\t\t\t},\n\t\t}\n\t\tbuildArgs := dockerfile.NewBuildArgs([]string{})\n\t\terr := onbuildCmd.ExecuteCommand(cfg, buildArgs)\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, err, test.expectedArray, cfg.OnBuild)\n\t}\n\n}\n"
  },
  {
    "path": "pkg/commands/run.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"strings\"\n\t\"syscall\"\n\n\tkConfig \"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/constants\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n)\n\ntype RunCommand struct {\n\tBaseCommand\n\tcmd      *instructions.RunCommand\n\tshdCache bool\n}\n\n// for testing\nvar (\n\tuserLookup = util.LookupUser\n)\n\nfunc (r *RunCommand) IsArgsEnvsRequiredInCache() bool {\n\treturn true\n}\n\nfunc (r *RunCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\treturn runCommandInExec(config, buildArgs, r.cmd)\n}\n\nfunc runCommandInExec(config *v1.Config, buildArgs *dockerfile.BuildArgs, cmdRun *instructions.RunCommand) error {\n\tvar newCommand []string\n\tif cmdRun.PrependShell {\n\t\t// This is the default shell on Linux\n\t\tvar shell []string\n\t\tif len(config.Shell) > 0 {\n\t\t\tshell = config.Shell\n\t\t} else {\n\t\t\tshell = append(shell, \"/bin/sh\", \"-c\")\n\t\t}\n\n\t\tnewCommand = append(shell, strings.Join(cmdRun.CmdLine, \" \"))\n\t} else {\n\t\tnewCommand = cmdRun.CmdLine\n\t\t// Find and set absolute path of executable by setting PATH temporary\n\t\treplacementEnvs := buildArgs.ReplacementEnvs(config.Env)\n\t\tfor _, v := range replacementEnvs {\n\t\t\tentry := strings.SplitN(v, \"=\", 2)\n\t\t\tif entry[0] != \"PATH\" {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\toldPath := os.Getenv(\"PATH\")\n\t\t\tdefer os.Setenv(\"PATH\", oldPath)\n\t\t\tos.Setenv(\"PATH\", entry[1])\n\t\t\tpath, err := exec.LookPath(newCommand[0])\n\t\t\tif err == nil {\n\t\t\t\tnewCommand[0] = path\n\t\t\t}\n\t\t}\n\t}\n\n\tlogrus.Infof(\"Cmd: %s\", newCommand[0])\n\tlogrus.Infof(\"Args: %s\", newCommand[1:])\n\n\tcmd := exec.Command(newCommand[0], newCommand[1:]...)\n\n\tcmd.Dir = setWorkDirIfExists(config.WorkingDir)\n\tcmd.Stdout = os.Stdout\n\tcmd.Stderr = os.Stderr\n\treplacementEnvs := buildArgs.ReplacementEnvs(config.Env)\n\tcmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}\n\n\tu := config.User\n\tuserAndGroup := strings.Split(u, \":\")\n\tuserStr, err := util.ResolveEnvironmentReplacement(userAndGroup[0], replacementEnvs, false)\n\tif err != nil {\n\t\treturn errors.Wrapf(err, \"resolving user %s\", userAndGroup[0])\n\t}\n\n\t// If specified, run the command as a specific user\n\tif userStr != \"\" {\n\t\tcmd.SysProcAttr.Credential, err = util.SyscallCredentials(userStr)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"credentials\")\n\t\t}\n\t}\n\n\tenv, err := addDefaultHOME(userStr, replacementEnvs)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"adding default HOME variable\")\n\t}\n\n\tcmd.Env = env\n\n\tlogrus.Infof(\"Running: %s\", cmd.Args)\n\tif err := cmd.Start(); err != nil {\n\t\treturn errors.Wrap(err, \"starting command\")\n\t}\n\n\tpgid, err := syscall.Getpgid(cmd.Process.Pid)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"getting group id for process\")\n\t}\n\tif err := cmd.Wait(); err != nil {\n\t\treturn errors.Wrap(err, \"waiting for process to exit\")\n\t}\n\n\t//it's not an error if there are no grandchildren\n\tif err := syscall.Kill(-pgid, syscall.SIGKILL); err != nil && err.Error() != \"no such process\" {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// addDefaultHOME adds the default value for HOME if it isn't already set\nfunc addDefaultHOME(u string, envs []string) ([]string, error) {\n\tfor _, env := range envs {\n\t\tsplit := strings.SplitN(env, \"=\", 2)\n\t\tif split[0] == constants.HOME {\n\t\t\treturn envs, nil\n\t\t}\n\t}\n\n\t// If user isn't set, set default value of HOME\n\tif u == \"\" || u == constants.RootUser {\n\t\treturn append(envs, fmt.Sprintf(\"%s=%s\", constants.HOME, constants.DefaultHOMEValue)), nil\n\t}\n\n\t// If user is set to username, set value of HOME to /home/${user}\n\t// Otherwise the user is set to uid and HOME is /\n\tuserObj, err := userLookup(u)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"lookup user %v: %w\", u, err)\n\t}\n\n\treturn append(envs, fmt.Sprintf(\"%s=%s\", constants.HOME, userObj.HomeDir)), nil\n}\n\n// String returns some information about the command for the image config\nfunc (r *RunCommand) String() string {\n\treturn r.cmd.String()\n}\n\nfunc (r *RunCommand) FilesToSnapshot() []string {\n\treturn nil\n}\n\nfunc (r *RunCommand) ProvidesFilesToSnapshot() bool {\n\treturn false\n}\n\n// CacheCommand returns true since this command should be cached\nfunc (r *RunCommand) CacheCommand(img v1.Image) DockerCommand {\n\n\treturn &CachingRunCommand{\n\t\timg:       img,\n\t\tcmd:       r.cmd,\n\t\textractFn: util.ExtractFile,\n\t}\n}\n\nfunc (r *RunCommand) MetadataOnly() bool {\n\treturn false\n}\n\nfunc (r *RunCommand) RequiresUnpackedFS() bool {\n\treturn true\n}\n\nfunc (r *RunCommand) ShouldCacheOutput() bool {\n\treturn r.shdCache\n}\n\ntype CachingRunCommand struct {\n\tBaseCommand\n\tcaching\n\timg            v1.Image\n\textractedFiles []string\n\tcmd            *instructions.RunCommand\n\textractFn      util.ExtractFunction\n}\n\nfunc (cr *CachingRunCommand) IsArgsEnvsRequiredInCache() bool {\n\treturn true\n}\n\nfunc (cr *CachingRunCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\tlogrus.Infof(\"Found cached layer, extracting to filesystem\")\n\tvar err error\n\n\tif cr.img == nil {\n\t\treturn errors.New(fmt.Sprintf(\"command image is nil %v\", cr.String()))\n\t}\n\n\tlayers, err := cr.img.Layers()\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"retrieving image layers\")\n\t}\n\n\tif len(layers) != 1 {\n\t\treturn errors.New(fmt.Sprintf(\"expected %d layers but got %d\", 1, len(layers)))\n\t}\n\n\tcr.layer = layers[0]\n\n\tcr.extractedFiles, err = util.GetFSFromLayers(\n\t\tkConfig.RootDir,\n\t\tlayers,\n\t\tutil.ExtractFunc(cr.extractFn),\n\t\tutil.IncludeWhiteout(),\n\t)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"extracting fs from image\")\n\t}\n\n\treturn nil\n}\n\nfunc (cr *CachingRunCommand) FilesToSnapshot() []string {\n\tf := cr.extractedFiles\n\tlogrus.Debugf(\"%d files extracted by caching run command\", len(f))\n\tlogrus.Tracef(\"Extracted files: %s\", f)\n\n\treturn f\n}\n\nfunc (cr *CachingRunCommand) String() string {\n\tif cr.cmd == nil {\n\t\treturn \"nil command\"\n\t}\n\treturn cr.cmd.String()\n}\n\nfunc (cr *CachingRunCommand) MetadataOnly() bool {\n\treturn false\n}\n\n// todo: this should create the workdir if it doesn't exist, atleast this is what docker does\nfunc setWorkDirIfExists(workdir string) string {\n\tif _, err := os.Lstat(workdir); err == nil {\n\t\treturn workdir\n\t}\n\treturn \"\"\n}\n"
  },
  {
    "path": "pkg/commands/run_marker.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"os\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n\t\"github.com/sirupsen/logrus\"\n)\n\ntype RunMarkerCommand struct {\n\tBaseCommand\n\tcmd      *instructions.RunCommand\n\tFiles    []string\n\tshdCache bool\n}\n\nfunc (r *RunMarkerCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\t// run command `touch filemarker`\n\tlogrus.Debugf(\"Using new RunMarker command\")\n\tprevFilesMap, _ := util.GetFSInfoMap(\"/\", map[string]os.FileInfo{})\n\tif err := runCommandInExec(config, buildArgs, r.cmd); err != nil {\n\t\treturn err\n\t}\n\t_, r.Files = util.GetFSInfoMap(\"/\", prevFilesMap)\n\n\tlogrus.Debugf(\"Files changed %s\", r.Files)\n\treturn nil\n}\n\n// String returns some information about the command for the image config\nfunc (r *RunMarkerCommand) String() string {\n\treturn r.cmd.String()\n}\n\nfunc (r *RunMarkerCommand) FilesToSnapshot() []string {\n\treturn r.Files\n}\n\nfunc (r *RunMarkerCommand) ProvidesFilesToSnapshot() bool {\n\treturn true\n}\n\nfunc (r *RunMarkerCommand) IsArgsEnvsRequiredInCache() bool {\n\treturn true\n}\n\n// CacheCommand returns true since this command should be cached\nfunc (r *RunMarkerCommand) CacheCommand(img v1.Image) DockerCommand {\n\n\treturn &CachingRunCommand{\n\t\timg:       img,\n\t\tcmd:       r.cmd,\n\t\textractFn: util.ExtractFile,\n\t}\n}\n\nfunc (r *RunMarkerCommand) MetadataOnly() bool {\n\treturn false\n}\n\nfunc (r *RunMarkerCommand) RequiresUnpackedFS() bool {\n\treturn true\n}\n\nfunc (r *RunMarkerCommand) ShouldCacheOutput() bool {\n\treturn r.shdCache\n}\n\nfunc (r *RunMarkerCommand) ShouldDetectDeletedFiles() bool {\n\treturn true\n}\n"
  },
  {
    "path": "pkg/commands/run_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"archive/tar\"\n\t\"bytes\"\n\t\"io\"\n\t\"log\"\n\t\"os\"\n\t\"os/user\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n)\n\nfunc Test_addDefaultHOME(t *testing.T) {\n\ttests := []struct {\n\t\tname        string\n\t\tuser        string\n\t\tmockUser    *user.User\n\t\tlookupError error\n\t\tinitial     []string\n\t\texpected    []string\n\t}{\n\t\t{\n\t\t\tname: \"HOME already set\",\n\t\t\tuser: \"\",\n\t\t\tinitial: []string{\n\t\t\t\t\"HOME=/something\",\n\t\t\t\t\"PATH=/something/else\",\n\t\t\t},\n\t\t\texpected: []string{\n\t\t\t\t\"HOME=/something\",\n\t\t\t\t\"PATH=/something/else\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"HOME not set and user not set\",\n\t\t\tuser: \"\",\n\t\t\tinitial: []string{\n\t\t\t\t\"PATH=/something/else\",\n\t\t\t},\n\t\t\texpected: []string{\n\t\t\t\t\"PATH=/something/else\",\n\t\t\t\t\"HOME=/root\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"HOME not set and user and homedir for the user set\",\n\t\t\tuser: \"www-add\",\n\t\t\tmockUser: &user.User{\n\t\t\t\tUsername: \"www-add\",\n\t\t\t\tHomeDir:  \"/home/some-other\",\n\t\t\t},\n\t\t\tinitial: []string{\n\t\t\t\t\"PATH=/something/else\",\n\t\t\t},\n\t\t\texpected: []string{\n\t\t\t\t\"PATH=/something/else\",\n\t\t\t\t\"HOME=/home/some-other\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"USER is set using the UID\",\n\t\t\tuser: \"1000\",\n\t\t\tmockUser: &user.User{\n\t\t\t\tUsername: \"1000\",\n\t\t\t\tHomeDir:  \"/\",\n\t\t\t},\n\t\t\tinitial: []string{\n\t\t\t\t\"PATH=/something/else\",\n\t\t\t},\n\t\t\texpected: []string{\n\t\t\t\t\"PATH=/something/else\",\n\t\t\t\t\"HOME=/\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"HOME not set and user is set to root\",\n\t\t\tuser: \"root\",\n\t\t\tmockUser: &user.User{\n\t\t\t\tUsername: \"root\",\n\t\t\t},\n\t\t\tinitial: []string{\n\t\t\t\t\"PATH=/something/else\",\n\t\t\t},\n\t\t\texpected: []string{\n\t\t\t\t\"PATH=/something/else\",\n\t\t\t\t\"HOME=/root\",\n\t\t\t},\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\toriginal := userLookup\n\t\t\tuserLookup = func(username string) (*user.User, error) { return test.mockUser, test.lookupError }\n\t\t\tdefer func() {\n\t\t\t\tuserLookup = original\n\t\t\t}()\n\t\t\tactual, err := addDefaultHOME(test.user, test.initial)\n\t\t\ttestutil.CheckErrorAndDeepEqual(t, false, err, test.expected, actual)\n\t\t})\n\t}\n}\n\nfunc prepareTarFixture(t *testing.T, fileNames []string) ([]byte, error) {\n\tdir := t.TempDir()\n\n\tcontent := `\nMeow meow meow meow\nmeow meow meow meow\n`\n\tfor _, name := range fileNames {\n\t\tif err := os.WriteFile(filepath.Join(dir, name), []byte(content), 0777); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\twriter := bytes.NewBuffer([]byte{})\n\ttw := tar.NewWriter(writer)\n\tdefer tw.Close()\n\tfilepath.Walk(dir, func(path string, info os.FileInfo, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif info.IsDir() {\n\t\t\treturn nil\n\t\t}\n\n\t\thdr, err := tar.FileInfoHeader(info, \"\")\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := tw.WriteHeader(hdr); err != nil {\n\t\t\tlog.Fatal(err)\n\t\t}\n\t\tbody, err := os.ReadFile(path)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif _, err := tw.Write(body); err != nil {\n\t\t\tlog.Fatal(err)\n\t\t}\n\n\t\treturn nil\n\t})\n\n\treturn writer.Bytes(), nil\n}\n\nfunc Test_CachingRunCommand_ExecuteCommand(t *testing.T) {\n\ttarContent, err := prepareTarFixture(t, []string{\"foo.txt\"})\n\tif err != nil {\n\t\tt.Errorf(\"couldn't prepare tar fixture %v\", err)\n\t}\n\n\tconfig := &v1.Config{}\n\tbuildArgs := &dockerfile.BuildArgs{}\n\n\ttype testCase struct {\n\t\tdesctiption    string\n\t\texpectLayer    bool\n\t\texpectErr      bool\n\t\tcount          *int\n\t\texpectedCount  int\n\t\tcommand        *CachingRunCommand\n\t\textractedFiles []string\n\t\tcontextFiles   []string\n\t}\n\ttestCases := []testCase{\n\t\tfunc() testCase {\n\t\t\tc := &CachingRunCommand{\n\t\t\t\timg: fakeImage{\n\t\t\t\t\tImageLayers: []v1.Layer{\n\t\t\t\t\t\tfakeLayer{TarContent: tarContent},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t\tcount := 0\n\t\t\ttc := testCase{\n\t\t\t\tdesctiption:    \"with valid image and valid layer\",\n\t\t\t\tcount:          &count,\n\t\t\t\texpectedCount:  1,\n\t\t\t\texpectLayer:    true,\n\t\t\t\textractedFiles: []string{\"/foo.txt\"},\n\t\t\t\tcontextFiles:   []string{\"foo.txt\"},\n\t\t\t}\n\t\t\tc.extractFn = func(_ string, _ *tar.Header, _ string, _ io.Reader) error {\n\t\t\t\t*tc.count++\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\ttc.command = c\n\t\t\treturn tc\n\t\t}(),\n\t\tfunc() testCase {\n\t\t\tc := &CachingRunCommand{}\n\t\t\ttc := testCase{\n\t\t\t\tdesctiption: \"with no image\",\n\t\t\t\texpectErr:   true,\n\t\t\t}\n\t\t\tc.extractFn = func(_ string, _ *tar.Header, _ string, _ io.Reader) error {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\ttc.command = c\n\t\t\treturn tc\n\t\t}(),\n\t\tfunc() testCase {\n\t\t\tc := &CachingRunCommand{\n\t\t\t\timg: fakeImage{},\n\t\t\t}\n\n\t\t\tc.extractFn = func(_ string, _ *tar.Header, _ string, _ io.Reader) error {\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\treturn testCase{\n\t\t\t\tdesctiption: \"with image containing no layers\",\n\t\t\t\texpectErr:   true,\n\t\t\t\tcommand:     c,\n\t\t\t}\n\t\t}(),\n\t\tfunc() testCase {\n\t\t\tc := &CachingRunCommand{\n\t\t\t\timg: fakeImage{\n\t\t\t\t\tImageLayers: []v1.Layer{\n\t\t\t\t\t\tfakeLayer{},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t\tc.extractFn = func(_ string, _ *tar.Header, _ string, _ io.Reader) error {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\ttc := testCase{\n\t\t\t\tdesctiption: \"with image one layer which has no tar content\",\n\t\t\t\texpectErr:   false, // this one probably should fail but doesn't because of how ExecuteCommand and util.GetFSFromLayers are implemented - cvgw- 2019-11-25\n\t\t\t\texpectLayer: true,\n\t\t\t}\n\t\t\ttc.command = c\n\t\t\treturn tc\n\t\t}(),\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.desctiption, func(t *testing.T) {\n\t\t\tc := tc.command\n\t\t\terr := c.ExecuteCommand(config, buildArgs)\n\t\t\tif !tc.expectErr && err != nil {\n\t\t\t\tt.Errorf(\"Expected err to be nil but was %v\", err)\n\t\t\t} else if tc.expectErr && err == nil {\n\t\t\t\tt.Error(\"Expected err but was nil\")\n\t\t\t}\n\n\t\t\tif tc.count != nil {\n\t\t\t\tif *tc.count != tc.expectedCount {\n\t\t\t\t\tt.Errorf(\"Expected extractFn to be called %v times but was called %v times\", 1, *tc.count)\n\t\t\t\t}\n\t\t\t\tfor _, file := range tc.extractedFiles {\n\t\t\t\t\tmatch := false\n\t\t\t\t\tcmdFiles := c.extractedFiles\n\t\t\t\t\tfor _, f := range cmdFiles {\n\t\t\t\t\t\tif file == f {\n\t\t\t\t\t\t\tmatch = true\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif !match {\n\t\t\t\t\t\tt.Errorf(\"Expected extracted files to include %v but did not %v\", file, cmdFiles)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// CachingRunCommand does not override BaseCommand\n\t\t\t\t// FilesUseFromContext so this will always return an empty slice and no error\n\t\t\t\t// This seems like it might be a bug as it results in RunCommands and CachingRunCommands generating different cache keys - cvgw - 2019-11-27\n\t\t\t\tcmdFiles, err := c.FilesUsedFromContext(\n\t\t\t\t\tconfig, buildArgs,\n\t\t\t\t)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Errorf(\"failed to get files used from context from command\")\n\t\t\t\t}\n\n\t\t\t\tif len(cmdFiles) != 0 {\n\t\t\t\t\tt.Errorf(\"expected files used from context to be empty but was not\")\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif c.layer == nil && tc.expectLayer {\n\t\t\t\tt.Error(\"expected the command to have a layer set but instead was nil\")\n\t\t\t} else if c.layer != nil && !tc.expectLayer {\n\t\t\t\tt.Error(\"expected the command to have no layer set but instead found a layer\")\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSetWorkDirIfExists(t *testing.T) {\n\ttestDir := t.TempDir()\n\ttestutil.CheckDeepEqual(t, testDir, setWorkDirIfExists(testDir))\n\ttestutil.CheckDeepEqual(t, \"\", setWorkDirIfExists(\"doesnot-exists\"))\n}\n"
  },
  {
    "path": "pkg/commands/shell.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\ntype ShellCommand struct {\n\tBaseCommand\n\tcmd *instructions.ShellCommand\n}\n\n// ExecuteCommand handles command processing similar to CMD and RUN,\nfunc (s *ShellCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\tconfig.Shell = s.cmd.Shell\n\treturn nil\n}\n\n// String returns some information about the command for the image config history\nfunc (s *ShellCommand) String() string {\n\treturn s.cmd.String()\n}\n"
  },
  {
    "path": "pkg/commands/shell_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\nvar shellTests = []struct {\n\tcmdLine       []string\n\texpectedShell []string\n}{\n\t{\n\t\tcmdLine:       []string{\"/bin/bash\", \"-c\"},\n\t\texpectedShell: []string{\"/bin/bash\", \"-c\"},\n\t},\n\t{\n\t\tcmdLine:       []string{\"/bin/bash\"},\n\t\texpectedShell: []string{\"/bin/bash\"},\n\t},\n}\n\nfunc TestShellExecuteCmd(t *testing.T) {\n\n\tcfg := &v1.Config{\n\t\tShell: nil,\n\t}\n\n\tfor _, test := range shellTests {\n\t\tcmd := ShellCommand{\n\t\t\tcmd: &instructions.ShellCommand{\n\t\t\t\tShell: test.cmdLine,\n\t\t\t},\n\t\t}\n\t\terr := cmd.ExecuteCommand(cfg, nil)\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, err, test.expectedShell, cfg.Shell)\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/stopsignal.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n\t\"github.com/moby/sys/signal\"\n\t\"github.com/sirupsen/logrus\"\n)\n\ntype StopSignalCommand struct {\n\tBaseCommand\n\tcmd *instructions.StopSignalCommand\n}\n\n// ExecuteCommand handles command processing similar to CMD and RUN,\nfunc (s *StopSignalCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\tlogrus.Info(\"Cmd: STOPSIGNAL\")\n\n\t// resolve possible environment variables\n\treplacementEnvs := buildArgs.ReplacementEnvs(config.Env)\n\tresolvedEnvs, err := util.ResolveEnvironmentReplacementList([]string{s.cmd.Signal}, replacementEnvs, false)\n\tif err != nil {\n\t\treturn err\n\t}\n\tstopsignal := resolvedEnvs[0]\n\n\t// validate stopsignal\n\t_, err = signal.ParseSignal(stopsignal)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tlogrus.Infof(\"Replacing StopSignal in config with %v\", stopsignal)\n\tconfig.StopSignal = stopsignal\n\treturn nil\n}\n\n// String returns some information about the command for the image config history\nfunc (s *StopSignalCommand) String() string {\n\treturn s.cmd.String()\n}\n"
  },
  {
    "path": "pkg/commands/stopsignal_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\nvar stopsignalTests = []struct {\n\tsignal         string\n\texpectedSignal string\n}{\n\t{\n\t\tsignal:         \"SIGKILL\",\n\t\texpectedSignal: \"SIGKILL\",\n\t},\n\t{\n\t\tsignal:         \"${STOPSIG}\",\n\t\texpectedSignal: \"SIGKILL\",\n\t},\n\t{\n\t\tsignal:         \"1\",\n\t\texpectedSignal: \"1\",\n\t},\n}\n\nfunc TestStopsignalExecuteCmd(t *testing.T) {\n\n\tcfg := &v1.Config{\n\t\tStopSignal: \"\",\n\t\tEnv:        []string{\"STOPSIG=SIGKILL\"},\n\t}\n\n\tfor _, test := range stopsignalTests {\n\t\tcmd := StopSignalCommand{\n\t\t\tcmd: &instructions.StopSignalCommand{\n\t\t\t\tSignal: test.signal,\n\t\t\t},\n\t\t}\n\t\tb := dockerfile.NewBuildArgs([]string{})\n\t\terr := cmd.ExecuteCommand(cfg, b)\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, err, test.expectedSignal, cfg.StopSignal)\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/user.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n)\n\ntype UserCommand struct {\n\tBaseCommand\n\tcmd *instructions.UserCommand\n}\n\nfunc (r *UserCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\tlogrus.Info(\"Cmd: USER\")\n\tu := r.cmd.User\n\tuserAndGroup := strings.Split(u, \":\")\n\treplacementEnvs := buildArgs.ReplacementEnvs(config.Env)\n\tuserStr, err := util.ResolveEnvironmentReplacement(userAndGroup[0], replacementEnvs, false)\n\tif err != nil {\n\t\treturn errors.Wrap(err, fmt.Sprintf(\"resolving user %s\", userAndGroup[0]))\n\t}\n\n\tif len(userAndGroup) > 1 {\n\t\tgroupStr, err := util.ResolveEnvironmentReplacement(userAndGroup[1], replacementEnvs, false)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, fmt.Sprintf(\"resolving group %s\", userAndGroup[1]))\n\t\t}\n\t\tuserStr = userStr + \":\" + groupStr\n\t}\n\n\tconfig.User = userStr\n\treturn nil\n}\n\nfunc (r *UserCommand) String() string {\n\treturn r.cmd.String()\n}\n"
  },
  {
    "path": "pkg/commands/user_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"os/user\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\nvar userTests = []struct {\n\tuser        string\n\tuserObj     *user.User\n\texpectedUID string\n\texpectedGID string\n}{\n\t{\n\t\tuser:        \"root\",\n\t\tuserObj:     &user.User{Uid: \"root\", Gid: \"root\"},\n\t\texpectedUID: \"root\",\n\t},\n\t{\n\t\tuser:        \"root-add\",\n\t\tuserObj:     &user.User{Uid: \"root-add\", Gid: \"root\"},\n\t\texpectedUID: \"root-add\",\n\t},\n\t{\n\t\tuser:        \"0\",\n\t\tuserObj:     &user.User{Uid: \"0\", Gid: \"0\"},\n\t\texpectedUID: \"0\",\n\t},\n\t{\n\t\tuser:        \"fakeUser\",\n\t\tuserObj:     &user.User{Uid: \"fakeUser\", Gid: \"fakeUser\"},\n\t\texpectedUID: \"fakeUser\",\n\t},\n\t{\n\t\tuser:        \"root\",\n\t\tuserObj:     &user.User{Uid: \"root\", Gid: \"some\"},\n\t\texpectedUID: \"root\",\n\t},\n\t{\n\t\tuser:        \"0\",\n\t\tuserObj:     &user.User{Uid: \"0\"},\n\t\texpectedUID: \"0\",\n\t},\n\t{\n\t\tuser:        \"root\",\n\t\tuserObj:     &user.User{Uid: \"root\"},\n\t\texpectedUID: \"root\",\n\t\texpectedGID: \"f0\",\n\t},\n\t{\n\t\tuser:        \"0\",\n\t\tuserObj:     &user.User{Uid: \"0\"},\n\t\texpectedUID: \"0\",\n\t},\n\t{\n\t\tuser:        \"$envuser\",\n\t\tuserObj:     &user.User{Uid: \"root\", Gid: \"root\"},\n\t\texpectedUID: \"root\",\n\t},\n\t{\n\t\tuser:        \"root\",\n\t\tuserObj:     &user.User{Uid: \"root\"},\n\t\texpectedUID: \"root\",\n\t},\n\t{\n\t\tuser:        \"some\",\n\t\tuserObj:     &user.User{Uid: \"some\"},\n\t\texpectedUID: \"some\",\n\t},\n\t{\n\t\tuser:        \"some\",\n\t\texpectedUID: \"some\",\n\t},\n}\n\nfunc TestUpdateUser(t *testing.T) {\n\tfor _, test := range userTests {\n\t\tcfg := &v1.Config{\n\t\t\tEnv: []string{\n\t\t\t\t\"envuser=root\",\n\t\t\t\t\"envgroup=grp\",\n\t\t\t},\n\t\t}\n\t\tcmd := UserCommand{\n\t\t\tcmd: &instructions.UserCommand{\n\t\t\t\tUser: test.user,\n\t\t\t},\n\t\t}\n\t\tbuildArgs := dockerfile.NewBuildArgs([]string{})\n\t\terr := cmd.ExecuteCommand(cfg, buildArgs)\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, err, test.expectedUID, cfg.User)\n\t}\n}\n"
  },
  {
    "path": "pkg/commands/volume.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n\t\"github.com/sirupsen/logrus\"\n)\n\ntype VolumeCommand struct {\n\tBaseCommand\n\tcmd *instructions.VolumeCommand\n}\n\nfunc (v *VolumeCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\tlogrus.Info(\"Cmd: VOLUME\")\n\tvolumes := v.cmd.Volumes\n\treplacementEnvs := buildArgs.ReplacementEnvs(config.Env)\n\tresolvedVolumes, err := util.ResolveEnvironmentReplacementList(volumes, replacementEnvs, true)\n\tif err != nil {\n\t\treturn err\n\t}\n\texistingVolumes := config.Volumes\n\tif existingVolumes == nil {\n\t\texistingVolumes = map[string]struct{}{}\n\t}\n\tfor _, volume := range resolvedVolumes {\n\t\tvar x struct{}\n\t\texistingVolumes[volume] = x\n\t\tutil.AddVolumePathToIgnoreList(volume)\n\n\t\t// Only create and snapshot the dir if it didn't exist already\n\t\tif _, err := os.Stat(volume); os.IsNotExist(err) {\n\t\t\tlogrus.Infof(\"Creating directory %s\", volume)\n\t\t\tif err := os.MkdirAll(volume, 0755); err != nil {\n\t\t\t\treturn fmt.Errorf(\"could not create directory for volume %s: %w\", volume, err)\n\t\t\t}\n\t\t}\n\t}\n\tconfig.Volumes = existingVolumes\n\n\treturn nil\n}\n\nfunc (v *VolumeCommand) FilesToSnapshot() []string {\n\treturn []string{}\n}\n\nfunc (v *VolumeCommand) String() string {\n\treturn v.cmd.String()\n}\n"
  },
  {
    "path": "pkg/commands/volume_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\nfunc TestUpdateVolume(t *testing.T) {\n\tcfg := &v1.Config{\n\t\tEnv: []string{\n\t\t\t\"VOLUME=/etc\",\n\t\t},\n\t\tVolumes: map[string]struct{}{},\n\t}\n\n\tvolumes := []string{\n\t\t\"/tmp\",\n\t\t\"/var/lib\",\n\t\t\"$VOLUME\",\n\t}\n\n\tvolumeCmd := &VolumeCommand{\n\t\tcmd: &instructions.VolumeCommand{\n\t\t\tVolumes: volumes,\n\t\t},\n\t}\n\n\texpectedVolumes := map[string]struct{}{\n\t\t\"/tmp\":     {},\n\t\t\"/var/lib\": {},\n\t\t\"/etc\":     {},\n\t}\n\tbuildArgs := dockerfile.NewBuildArgs([]string{})\n\terr := volumeCmd.ExecuteCommand(cfg, buildArgs)\n\ttestutil.CheckErrorAndDeepEqual(t, false, err, expectedVolumes, cfg.Volumes)\n}\n"
  },
  {
    "path": "pkg/commands/workdir.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\t\"github.com/pkg/errors\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n\t\"github.com/sirupsen/logrus\"\n)\n\ntype WorkdirCommand struct {\n\tBaseCommand\n\tcmd           *instructions.WorkdirCommand\n\tsnapshotFiles []string\n}\n\n// For testing\nvar mkdirAllWithPermissions = util.MkdirAllWithPermissions\n\nfunc (w *WorkdirCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {\n\tlogrus.Info(\"Cmd: workdir\")\n\tworkdirPath := w.cmd.Path\n\treplacementEnvs := buildArgs.ReplacementEnvs(config.Env)\n\tresolvedWorkingDir, err := util.ResolveEnvironmentReplacement(workdirPath, replacementEnvs, true)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif filepath.IsAbs(resolvedWorkingDir) {\n\t\tconfig.WorkingDir = resolvedWorkingDir\n\t} else {\n\t\tif config.WorkingDir != \"\" {\n\t\t\tconfig.WorkingDir = filepath.Join(config.WorkingDir, resolvedWorkingDir)\n\t\t} else {\n\t\t\tconfig.WorkingDir = filepath.Join(\"/\", resolvedWorkingDir)\n\t\t}\n\t}\n\tlogrus.Infof(\"Changed working directory to %s\", config.WorkingDir)\n\n\t// Only create and snapshot the dir if it didn't exist already\n\tw.snapshotFiles = []string{}\n\tif _, err := os.Stat(config.WorkingDir); os.IsNotExist(err) {\n\t\tuid, gid := int64(-1), int64(-1)\n\n\t\tif config.User != \"\" {\n\t\t\tlogrus.Debugf(\"Fetching uid and gid for USER '%s'\", config.User)\n\t\t\tuid, gid, err = util.GetUserGroup(config.User, replacementEnvs)\n\t\t\tif err != nil {\n\t\t\t\treturn errors.Wrapf(err, \"identifying uid and gid for user %s\", config.User)\n\t\t\t}\n\t\t}\n\n\t\tlogrus.Infof(\"Creating directory %s with uid %d and gid %d\", config.WorkingDir, uid, gid)\n\t\tw.snapshotFiles = append(w.snapshotFiles, config.WorkingDir)\n\t\tif err := mkdirAllWithPermissions(config.WorkingDir, 0755, uid, gid); err != nil {\n\t\t\treturn errors.Wrapf(err, \"creating workdir %s\", config.WorkingDir)\n\t\t}\n\t}\n\treturn nil\n}\n\n// FilesToSnapshot returns the workingdir, which should have been created if it didn't already exist\nfunc (w *WorkdirCommand) FilesToSnapshot() []string {\n\treturn w.snapshotFiles\n}\n\n// String returns some information about the command for the image config history\nfunc (w *WorkdirCommand) String() string {\n\treturn w.cmd.String()\n}\n\nfunc (w *WorkdirCommand) MetadataOnly() bool {\n\treturn false\n}\n"
  },
  {
    "path": "pkg/commands/workdir_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage commands\n\nimport (\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\n// Each test here changes the same WorkingDir field in the config\n// So, some of the tests build off of each other\n// This is needed to make sure WorkingDir handles paths correctly\n// For example, if WORKDIR specifies a non-absolute path, it should be appended to the current WORKDIR\nvar workdirTests = []struct {\n\tpath          string\n\texpectedPath  string\n\tsnapshotFiles []string\n}{\n\t{\n\t\tpath:          \"a\",\n\t\texpectedPath:  \"/a\",\n\t\tsnapshotFiles: []string{\"/a\"},\n\t},\n\t{\n\t\tpath:          \"/a\",\n\t\texpectedPath:  \"/a\",\n\t\tsnapshotFiles: []string{\"/a\"},\n\t},\n\t{\n\t\tpath:          \"b\",\n\t\texpectedPath:  \"/a/b\",\n\t\tsnapshotFiles: []string{\"/a/b\"},\n\t},\n\t{\n\t\tpath:          \"c\",\n\t\texpectedPath:  \"/a/b/c\",\n\t\tsnapshotFiles: []string{\"/a/b/c\"},\n\t},\n\t{\n\t\tpath:          \"/d\",\n\t\texpectedPath:  \"/d\",\n\t\tsnapshotFiles: []string{\"/d\"},\n\t},\n\t{\n\t\tpath:          \"$path\",\n\t\texpectedPath:  \"/d/usr\",\n\t\tsnapshotFiles: []string{\"/d/usr\"},\n\t},\n\t{\n\t\tpath:          \"$home\",\n\t\texpectedPath:  \"/root\",\n\t\tsnapshotFiles: []string{},\n\t},\n\t{\n\t\tpath:          \"/foo/$path/$home\",\n\t\texpectedPath:  \"/foo/usr/root\",\n\t\tsnapshotFiles: []string{\"/foo/usr/root\"},\n\t},\n\t{\n\t\tpath:          \"/tmp\",\n\t\texpectedPath:  \"/tmp\",\n\t\tsnapshotFiles: []string{},\n\t},\n}\n\n// For testing\nfunc mockDir(path string, mode os.FileMode, uid, gid int64) error {\n\treturn nil\n}\nfunc TestWorkdirCommand(t *testing.T) {\n\n\t// Mock out mkdir for testing.\n\toldMkdir := mkdirAllWithPermissions\n\tmkdirAllWithPermissions = mockDir\n\n\tdefer func() {\n\t\tmkdirAllWithPermissions = oldMkdir\n\t}()\n\n\tcfg := &v1.Config{\n\t\tWorkingDir: \"\",\n\t\tEnv: []string{\n\t\t\t\"path=usr/\",\n\t\t\t\"home=/root\",\n\t\t},\n\t}\n\n\tfor _, test := range workdirTests {\n\t\tcmd := WorkdirCommand{\n\t\t\tcmd: &instructions.WorkdirCommand{\n\t\t\t\tPath: test.path,\n\t\t\t},\n\t\t\tsnapshotFiles: nil,\n\t\t}\n\t\tbuildArgs := dockerfile.NewBuildArgs([]string{})\n\t\tcmd.ExecuteCommand(cfg, buildArgs)\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, nil, test.expectedPath, cfg.WorkingDir)\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, nil, test.snapshotFiles, cmd.snapshotFiles)\n\t}\n}\n"
  },
  {
    "path": "pkg/config/args.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage config\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/sirupsen/logrus\"\n)\n\n// This type is used to supported passing in multiple flags\ntype multiArg []string\n\n// Now, for our new type, implement the two methods of\n// the flag.Value interface...\n// The first method is String() string\nfunc (b *multiArg) String() string {\n\treturn strings.Join(*b, \",\")\n}\n\n// The second method is Set(value string) error\nfunc (b *multiArg) Set(value string) error {\n\tlogrus.Debugf(\"Appending to multi args %s\", value)\n\t*b = append(*b, value)\n\treturn nil\n}\n\n// The third is Type() string\nfunc (b *multiArg) Type() string {\n\treturn \"multi-arg type\"\n}\n\nfunc (b *multiArg) Contains(v string) bool {\n\tfor _, s := range *b {\n\t\tif s == v {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// This type is used to supported passing in multiple key=value flags\ntype keyValueArg map[string]string\n\n// Now, for our new type, implement the two methods of\n// the flag.Value interface...\n// The first method is String() string\nfunc (a *keyValueArg) String() string {\n\tvar result []string\n\tfor key := range *a {\n\t\tresult = append(result, fmt.Sprintf(\"%s=%s\", key, (*a)[key]))\n\t}\n\treturn strings.Join(result, \",\")\n}\n\n// The second method is Set(value string) error\nfunc (a *keyValueArg) Set(value string) error {\n\tvalueSplit := strings.SplitN(value, \"=\", 2)\n\tif len(valueSplit) < 2 {\n\t\treturn fmt.Errorf(\"invalid argument value. expect key=value, got %s\", value)\n\t}\n\t(*a)[valueSplit[0]] = valueSplit[1]\n\treturn nil\n}\n\n// The third is Type() string\nfunc (a *keyValueArg) Type() string {\n\treturn \"key-value-arg type\"\n}\n\ntype multiKeyMultiValueArg map[string][]string\n\nfunc (c *multiKeyMultiValueArg) parseKV(value string) error {\n\tvalueSplit := strings.SplitN(value, \"=\", 2)\n\tif len(valueSplit) < 2 {\n\t\treturn fmt.Errorf(\"invalid argument value. expect key=value, got %s\", value)\n\t}\n\t(*c)[valueSplit[0]] = append((*c)[valueSplit[0]], valueSplit[1])\n\treturn nil\n}\n\nfunc (c *multiKeyMultiValueArg) String() string {\n\tvar result []string\n\tfor key := range *c {\n\t\tfor _, val := range (*c)[key] {\n\t\t\tresult = append(result, fmt.Sprintf(\"%s=%s\", key, val))\n\t\t}\n\t}\n\treturn strings.Join(result, \";\")\n\n}\n\nfunc (c *multiKeyMultiValueArg) Set(value string) error {\n\tif value == \"\" {\n\t\treturn nil\n\t}\n\tif strings.Contains(value, \";\") {\n\t\tkvpairs := strings.Split(value, \";\")\n\t\tfor _, kv := range kvpairs {\n\t\t\terr := c.parseKV(kv)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\treturn c.parseKV(value)\n}\n\nfunc (c *multiKeyMultiValueArg) Type() string {\n\treturn \"key-multi-value-arg type\"\n}\n"
  },
  {
    "path": "pkg/config/args_test.go",
    "content": "/*\nCopyright 2020 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage config\n\nimport \"testing\"\n\nfunc TestMultiArg_Set_shouldAppendValue(t *testing.T) {\n\tvar arg multiArg\n\targ.Set(\"value1\")\n\tif len(arg) != 1 || arg[0] != \"value1\" {\n\t\tt.Error(\"Fist value was not appended\")\n\t}\n\targ.Set(\"value2\")\n\tif len(arg) != 2 || arg[1] != \"value2\" {\n\t\tt.Error(\"Second value was not appended\")\n\t}\n}\n\nfunc Test_KeyValueArg_Set_shouldSplitArgument(t *testing.T) {\n\targ := make(keyValueArg)\n\targ.Set(\"key=value\")\n\tif arg[\"key\"] != \"value\" {\n\t\tt.Error(\"Invalid split. key=value should be split to key=>value\")\n\t}\n}\n\nfunc Test_KeyValueArg_Set_shouldAcceptEqualAsValue(t *testing.T) {\n\targ := make(keyValueArg)\n\targ.Set(\"key=value=something\")\n\tif arg[\"key\"] != \"value=something\" {\n\t\tt.Error(\"Invalid split. key=value=something should be split to key=>value=something\")\n\t}\n}\n\nfunc Test_multiKeyMultiValueArg_Set_shouldSplitArgumentLikeKVA(t *testing.T) {\n\targ := make(multiKeyMultiValueArg)\n\targ.Set(\"key=value\")\n\tif arg[\"key\"][0] != \"value\" {\n\t\tt.Error(\"Invalid split. key=value should be split to key=>value\")\n\t}\n}\n\nfunc Test_multiKeyMultiValueArg_Set_ShouldAppendIfRepeated(t *testing.T) {\n\targ := make(multiKeyMultiValueArg)\n\targ.Set(\"key=v1\")\n\targ.Set(\"key=v2\")\n\tif arg[\"key\"][0] != \"v1\" || arg[\"key\"][1] != \"v2\" {\n\t\tt.Error(\"Invalid repeat behavior. Repeated keys should append values\")\n\t}\n}\n\nfunc Test_multiKeyMultiValueArg_Set_Composed(t *testing.T) {\n\targ := make(multiKeyMultiValueArg)\n\targ.Set(\"key1=value1;key2=value2\")\n\tif arg[\"key1\"][0] != \"value1\" || arg[\"key2\"][0] != \"value2\" {\n\t\tt.Error(\"Invalid composed value parsing. key=value;key2=value2 should generate 2 keys\")\n\t}\n}\n\nfunc Test_multiKeyMultiValueArg_Set_WithEmptyValueShouldWork(t *testing.T) {\n\targ := make(multiKeyMultiValueArg)\n\terr := arg.Set(\"\")\n\tif len(arg) != 0 || err != nil {\n\t\tt.Error(\"multiKeyMultiValueArg must handle empty value\")\n\t}\n}\n"
  },
  {
    "path": "pkg/config/init.go",
    "content": "/*\nCopyright 2020 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage config\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/constants\"\n)\n\nvar RootDir string\n\n// KanikoDir is the path to the Kaniko directory\nvar KanikoDir = func() string {\n\tif kd, ok := os.LookupEnv(\"KANIKO_DIR\"); ok {\n\t\treturn kd\n\t}\n\treturn constants.DefaultKanikoPath\n}()\n\n// DockerfilePath is the path the Dockerfile is copied to\nvar DockerfilePath = fmt.Sprintf(\"%s/Dockerfile\", KanikoDir)\n\n// BuildContextDir is the directory a build context will be unpacked into,\n// for example, a tarball from a GCS bucket will be unpacked here\nvar BuildContextDir = fmt.Sprintf(\"%s/buildcontext/\", KanikoDir)\n\n// KanikoIntermediateStagesDir is where we will store intermediate stages\n// as tarballs in case they are needed later on\nvar KanikoIntermediateStagesDir = fmt.Sprintf(\"%s/stages/\", KanikoDir)\n\nvar MountInfoPath string\n\nfunc init() {\n\tRootDir = constants.RootDir\n\tMountInfoPath = constants.MountInfoPath\n}\n"
  },
  {
    "path": "pkg/config/options.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage config\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n)\n\n// CacheOptions are base image cache options that are set by command line arguments\ntype CacheOptions struct {\n\tCacheDir string\n\tCacheTTL time.Duration\n}\n\n// RegistryOptions are all the options related to the registries, set by command line arguments.\ntype RegistryOptions struct {\n\tRegistryMaps                 multiKeyMultiValueArg\n\tRegistryMirrors              multiArg\n\tInsecureRegistries           multiArg\n\tSkipTLSVerifyRegistries      multiArg\n\tRegistriesCertificates       keyValueArg\n\tRegistriesClientCertificates keyValueArg\n\tSkipDefaultRegistryFallback  bool\n\tInsecure                     bool\n\tSkipTLSVerify                bool\n\tInsecurePull                 bool\n\tSkipTLSVerifyPull            bool\n\tPushIgnoreImmutableTagErrors bool\n\tPushRetry                    int\n\tImageDownloadRetry           int\n}\n\n// KanikoOptions are options that are set by command line arguments\ntype KanikoOptions struct {\n\tRegistryOptions\n\tCacheOptions\n\tDestinations             multiArg\n\tBuildArgs                multiArg\n\tLabels                   multiArg\n\tGit                      KanikoGitOptions\n\tIgnorePaths              multiArg\n\tDockerfilePath           string\n\tSrcContext               string\n\tSnapshotMode             string\n\tSnapshotModeDeprecated   string\n\tCustomPlatform           string\n\tCustomPlatformDeprecated string\n\tBucket                   string\n\tTarPath                  string\n\tTarPathDeprecated        string\n\tKanikoDir                string\n\tTarget                   string\n\tCacheRepo                string\n\tDigestFile               string\n\tImageNameDigestFile      string\n\tImageNameTagDigestFile   string\n\tOCILayoutPath            string\n\tCompression              Compression\n\tCompressionLevel         int\n\tImageFSExtractRetry      int\n\tSingleSnapshot           bool\n\tReproducible             bool\n\tNoPush                   bool\n\tNoPushCache              bool\n\tCache                    bool\n\tCleanup                  bool\n\tCompressedCaching        bool\n\tIgnoreVarRun             bool\n\tSkipUnusedStages         bool\n\tRunV2                    bool\n\tCacheCopyLayers          bool\n\tCacheRunLayers           bool\n\tForceBuildMetadata       bool\n\tInitialFSUnpacked        bool\n\tSkipPushPermissionCheck  bool\n}\n\ntype KanikoGitOptions struct {\n\tBranch            string\n\tSingleBranch      bool\n\tRecurseSubmodules bool\n\tInsecureSkipTLS   bool\n}\n\nvar ErrInvalidGitFlag = errors.New(\"invalid git flag, must be in the key=value format\")\n\nfunc (k *KanikoGitOptions) Type() string {\n\treturn \"gitoptions\"\n}\n\nfunc (k *KanikoGitOptions) String() string {\n\treturn fmt.Sprintf(\"branch=%s,single-branch=%t,recurse-submodules=%t\", k.Branch, k.SingleBranch, k.RecurseSubmodules)\n}\n\nfunc (k *KanikoGitOptions) Set(s string) error {\n\tvar parts = strings.SplitN(s, \"=\", 2)\n\tif len(parts) != 2 {\n\t\treturn fmt.Errorf(\"%w: %s\", ErrInvalidGitFlag, s)\n\t}\n\tswitch parts[0] {\n\tcase \"branch\":\n\t\tk.Branch = parts[1]\n\tcase \"single-branch\":\n\t\tv, err := strconv.ParseBool(parts[1])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tk.SingleBranch = v\n\tcase \"recurse-submodules\":\n\t\tv, err := strconv.ParseBool(parts[1])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tk.RecurseSubmodules = v\n\tcase \"insecure-skip-tls\":\n\t\tv, err := strconv.ParseBool(parts[1])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tk.InsecureSkipTLS = v\n\t}\n\treturn nil\n}\n\n// Compression is an enumeration of the supported compression algorithms\ntype Compression string\n\n// The collection of known MediaType values.\nconst (\n\tGZip Compression = \"gzip\"\n\tZStd Compression = \"zstd\"\n)\n\nfunc (c *Compression) String() string {\n\treturn string(*c)\n}\n\nfunc (c *Compression) Set(v string) error {\n\tswitch v {\n\tcase \"gzip\", \"zstd\":\n\t\t*c = Compression(v)\n\t\treturn nil\n\tdefault:\n\t\treturn errors.New(`must be either \"gzip\" or \"zstd\"`)\n\t}\n}\n\nfunc (c *Compression) Type() string {\n\treturn \"compression\"\n}\n\n// WarmerOptions are options that are set by command line arguments to the cache warmer.\ntype WarmerOptions struct {\n\tCacheOptions\n\tRegistryOptions\n\tCustomPlatform string\n\tImages         multiArg\n\tForce          bool\n\tDockerfilePath string\n\tBuildArgs      multiArg\n}\n"
  },
  {
    "path": "pkg/config/options_test.go",
    "content": "/*\nCopyright 2020 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage config\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n)\n\nfunc TestKanikoGitOptions(t *testing.T) {\n\tt.Run(\"invalid pair\", func(t *testing.T) {\n\t\tvar g = &KanikoGitOptions{}\n\t\ttestutil.CheckError(t, true, g.Set(\"branch\"))\n\t})\n\n\tt.Run(\"sets values\", func(t *testing.T) {\n\t\tvar g = &KanikoGitOptions{}\n\t\ttestutil.CheckNoError(t, g.Set(\"branch=foo\"))\n\t\ttestutil.CheckNoError(t, g.Set(\"recurse-submodules=true\"))\n\t\ttestutil.CheckNoError(t, g.Set(\"single-branch=true\"))\n\t\ttestutil.CheckNoError(t, g.Set(\"insecure-skip-tls=false\"))\n\t\ttestutil.CheckDeepEqual(t, KanikoGitOptions{\n\t\t\tBranch:            \"foo\",\n\t\t\tSingleBranch:      true,\n\t\t\tRecurseSubmodules: true,\n\t\t\tInsecureSkipTLS:   false,\n\t\t}, *g)\n\t})\n\n\tt.Run(\"sets bools other than true\", func(t *testing.T) {\n\t\tvar g = KanikoGitOptions{}\n\t\ttestutil.CheckError(t, true, g.Set(\"recurse-submodules=\"))\n\t\ttestutil.CheckError(t, true, g.Set(\"single-branch=zaza\"))\n\t\ttestutil.CheckNoError(t, g.Set(\"recurse-submodules=false\"))\n\t\ttestutil.CheckDeepEqual(t, KanikoGitOptions{\n\t\t\tSingleBranch:      false,\n\t\t\tRecurseSubmodules: false,\n\t\t}, g)\n\t})\n}\n"
  },
  {
    "path": "pkg/config/stage.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage config\n\nimport (\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\n// KanikoStage wraps a stage of the Dockerfile and provides extra information\ntype KanikoStage struct {\n\tinstructions.Stage\n\tBaseImageIndex         int\n\tFinal                  bool\n\tBaseImageStoredLocally bool\n\tSaveStage              bool\n\tMetaArgs               []instructions.ArgCommand\n\tIndex                  int\n}\n"
  },
  {
    "path": "pkg/constants/constants.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage constants\n\nconst (\n\t// RootDir is the path to the root directory\n\tRootDir = \"/\"\n\n\tMountInfoPath = \"/proc/self/mountinfo\"\n\n\tDefaultKanikoPath = \"/kaniko\"\n\n\tAuthor = \"kaniko\"\n\n\t// ContextTar is the default name of the tar uploaded to GCS buckets\n\tContextTar = \"context.tar.gz\"\n\n\t// Various snapshot modes:\n\tSnapshotModeTime = \"time\"\n\tSnapshotModeFull = \"full\"\n\tSnapshotModeRedo = \"redo\"\n\n\t// NoBaseImage is the scratch image\n\tNoBaseImage = \"scratch\"\n\n\tGCSBuildContextPrefix      = \"gs://\"\n\tS3BuildContextPrefix       = \"s3://\"\n\tLocalDirBuildContextPrefix = \"dir://\"\n\tGitBuildContextPrefix      = \"git://\"\n\tHTTPSBuildContextPrefix    = \"https://\"\n\n\tHOME = \"HOME\"\n\t// DefaultHOMEValue is the default value Docker sets for $HOME\n\tDefaultHOMEValue = \"/root\"\n\tRootUser         = \"root\"\n\n\t// Docker command names\n\tCmd        = \"CMD\"\n\tEntrypoint = \"ENTRYPOINT\"\n\n\t// Name of the .dockerignore file\n\tDockerignore = \".dockerignore\"\n\n\t// S3 Custom endpoint ENV name\n\tS3EndpointEnv    = \"S3_ENDPOINT\"\n\tS3ForcePathStyle = \"S3_FORCE_PATH_STYLE\"\n)\n\n// ScratchEnvVars are the default environment variables needed for a scratch image.\nvar ScratchEnvVars = []string{\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"}\n\n// AzureBlobStorageHostRegEx is ReqEX for Valid azure blob storage host suffix in url for AzureCloud, AzureChinaCloud, AzureGermanCloud and AzureUSGovernment\nvar AzureBlobStorageHostRegEx = []string{\n\t\"https://(.+?)\\\\.blob\\\\.core\\\\.windows\\\\.net/(.+)\",\n\t\"https://(.+?)\\\\.blob\\\\.core\\\\.chinacloudapi\\\\.cn/(.+)\",\n\t\"https://(.+?)\\\\.blob\\\\.core\\\\.cloudapi\\\\.de/(.+)\",\n\t\"https://(.+?)\\\\.blob\\\\.core\\\\.usgovcloudapi\\\\.net/(.+)\",\n}\n"
  },
  {
    "path": "pkg/creds/creds.go",
    "content": "/*\nCopyright 2022 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage creds\n\nimport (\n\t\"io\"\n\n\tecr \"github.com/awslabs/amazon-ecr-credential-helper/ecr-login\"\n\t\"github.com/chrismellard/docker-credential-acr-env/pkg/credhelper\"\n\tgitlab \"github.com/ePirat/docker-credential-gitlabci/pkg/credhelper\"\n\t\"github.com/google/go-containerregistry/pkg/authn\"\n\t\"github.com/google/go-containerregistry/pkg/v1/google\"\n)\n\n// GetKeychain returns a keychain for accessing container registries.\nfunc GetKeychain() authn.Keychain {\n\treturn authn.NewMultiKeychain(\n\t\tauthn.DefaultKeychain,\n\t\tgoogle.Keychain,\n\t\tauthn.NewKeychainFromHelper(ecr.NewECRHelper(ecr.WithLogger(io.Discard))),\n\t\tauthn.NewKeychainFromHelper(credhelper.NewACRCredentialsHelper()),\n\t\tauthn.NewKeychainFromHelper(gitlab.NewGitLabCredentialsHelper()),\n\t)\n}\n"
  },
  {
    "path": "pkg/dockerfile/buildargs.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage dockerfile\n\nimport (\n\t\"strings\"\n\n\td \"github.com/docker/docker/builder/dockerfile\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\ntype BuildArgs struct {\n\td.BuildArgs\n}\n\nfunc NewBuildArgs(args []string) *BuildArgs {\n\targsFromOptions := make(map[string]*string)\n\tfor _, a := range args {\n\t\ts := strings.SplitN(a, \"=\", 2)\n\t\tif len(s) == 1 {\n\t\t\targsFromOptions[s[0]] = nil\n\t\t} else {\n\t\t\targsFromOptions[s[0]] = &s[1]\n\t\t}\n\t}\n\treturn &BuildArgs{\n\t\tBuildArgs: *d.NewBuildArgs(argsFromOptions),\n\t}\n}\n\nfunc (b *BuildArgs) Clone() *BuildArgs {\n\tclone := b.BuildArgs.Clone()\n\treturn &BuildArgs{\n\t\tBuildArgs: *clone,\n\t}\n}\n\n// ReplacementEnvs returns a list of filtered environment variables\nfunc (b *BuildArgs) ReplacementEnvs(envs []string) []string {\n\t// Ensure that we operate on a new array and do not modify the underlying array\n\tresultEnv := make([]string, len(envs))\n\tcopy(resultEnv, envs)\n\tfiltered := b.FilterAllowed(envs)\n\t// Disable makezero linter, since the previous make is paired with a same sized copy\n\treturn append(resultEnv, filtered...) //nolint:makezero\n}\n\n// AddMetaArgs adds the supplied args map to b's allowedMetaArgs\nfunc (b *BuildArgs) AddMetaArgs(metaArgs []instructions.ArgCommand) {\n\tfor _, marg := range metaArgs {\n\t\tfor _, arg := range marg.Args {\n\t\t\tv := arg.Value\n\t\t\tb.AddMetaArg(arg.Key, v)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/dockerfile/dockerfile.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage dockerfile\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"os\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/sirupsen/logrus\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/linter\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/parser\"\n\t\"github.com/pkg/errors\"\n)\n\nfunc ParseStages(opts *config.KanikoOptions) ([]instructions.Stage, []instructions.ArgCommand, error) {\n\tvar err error\n\tvar d []uint8\n\tmatch, _ := regexp.MatchString(\"^https?://\", opts.DockerfilePath)\n\tif match {\n\t\tresponse, e := http.Get(opts.DockerfilePath) //nolint:noctx\n\t\tif e != nil {\n\t\t\treturn nil, nil, e\n\t\t}\n\t\td, err = io.ReadAll(response.Body)\n\t} else {\n\t\td, err = os.ReadFile(opts.DockerfilePath)\n\t}\n\n\tif err != nil {\n\t\treturn nil, nil, errors.Wrap(err, fmt.Sprintf(\"reading dockerfile at path %s\", opts.DockerfilePath))\n\t}\n\n\tstages, metaArgs, err := Parse(d)\n\tif err != nil {\n\t\treturn nil, nil, errors.Wrap(err, \"parsing dockerfile\")\n\t}\n\n\tmetaArgs, err = expandNestedArgs(metaArgs, opts.BuildArgs)\n\tif err != nil {\n\t\treturn nil, nil, errors.Wrap(err, \"expanding meta ARGs\")\n\t}\n\n\treturn stages, metaArgs, nil\n}\n\n// baseImageIndex returns the index of the stage the current stage is built off\n// returns -1 if the current stage isn't built off a previous stage\nfunc baseImageIndex(currentStage int, stages []instructions.Stage) int {\n\tcurrentStageBaseName := strings.ToLower(stages[currentStage].BaseName)\n\n\tfor i, stage := range stages {\n\t\tif i >= currentStage {\n\t\t\tbreak\n\t\t}\n\t\tif stage.Name == currentStageBaseName {\n\t\t\treturn i\n\t\t}\n\t}\n\n\treturn -1\n}\n\n// Parse parses the contents of a Dockerfile and returns a list of commands\nfunc Parse(b []byte) ([]instructions.Stage, []instructions.ArgCommand, error) {\n\tp, err := parser.Parse(bytes.NewReader(b))\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tstages, metaArgs, err := instructions.Parse(p.AST, &linter.Linter{})\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tmetaArgs, err = stripEnclosingQuotes(metaArgs)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\treturn stages, metaArgs, nil\n}\n\n// expandNestedArgs tries to resolve nested ARG value against the previously defined ARGs\nfunc expandNestedArgs(metaArgs []instructions.ArgCommand, buildArgs []string) ([]instructions.ArgCommand, error) {\n\tvar prevArgs []string\n\tfor i, marg := range metaArgs {\n\t\tfor j, arg := range marg.Args {\n\t\t\tv := arg.Value\n\t\t\tif v != nil {\n\t\t\t\tval, err := util.ResolveEnvironmentReplacement(*v, append(prevArgs, buildArgs...), false)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tprevArgs = append(prevArgs, arg.Key+\"=\"+val)\n\t\t\t\targ.Value = &val\n\t\t\t\tmetaArgs[i].Args[j] = arg\n\t\t\t}\n\t\t}\n\t}\n\treturn metaArgs, nil\n}\n\n// stripEnclosingQuotes removes quotes enclosing the value of each instructions.ArgCommand in a slice\n// if the quotes are escaped it leaves them\nfunc stripEnclosingQuotes(metaArgs []instructions.ArgCommand) ([]instructions.ArgCommand, error) {\n\tfor i, marg := range metaArgs {\n\t\tfor j, arg := range marg.Args {\n\t\t\tv := arg.Value\n\t\t\tif v != nil {\n\t\t\t\tval, err := extractValFromQuotes(*v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\targ.Value = &val\n\t\t\t\tmetaArgs[i].Args[j] = arg\n\t\t\t}\n\t\t}\n\t}\n\treturn metaArgs, nil\n}\n\nfunc extractValFromQuotes(val string) (string, error) {\n\tbackSlash := byte('\\\\')\n\tif len(val) < 2 {\n\t\treturn val, nil\n\t}\n\n\tvar leader string\n\tvar tail string\n\n\tswitch char := val[0]; char {\n\tcase '\\'', '\"':\n\t\tleader = string([]byte{char})\n\tcase backSlash:\n\t\tswitch char := val[1]; char {\n\t\tcase '\\'', '\"':\n\t\t\tleader = string([]byte{backSlash, char})\n\t\t}\n\t}\n\n\t// If the length of leader is greater than one then it must be an escaped\n\t// character.\n\tif len(leader) < 2 {\n\t\tswitch char := val[len(val)-1]; char {\n\t\tcase '\\'', '\"':\n\t\t\ttail = string([]byte{char})\n\t\t}\n\t} else {\n\t\tswitch char := val[len(val)-2:]; char {\n\t\tcase `\\'`, `\\\"`:\n\t\t\ttail = char\n\t\t}\n\t}\n\n\tif leader != tail {\n\t\tlogrus.Infof(\"Leader %s tail %s\", leader, tail)\n\t\treturn \"\", errors.New(\"quotes wrapping arg values must be matched\")\n\t}\n\n\tif leader == \"\" {\n\t\treturn val, nil\n\t}\n\n\tif len(leader) == 2 {\n\t\treturn val, nil\n\t}\n\n\treturn val[1 : len(val)-1], nil\n}\n\n// targetStage returns the index of the target stage kaniko is trying to build\nfunc targetStage(stages []instructions.Stage, target string) (int, error) {\n\tif target == \"\" {\n\t\treturn len(stages) - 1, nil\n\t}\n\tfor i, stage := range stages {\n\t\tif strings.EqualFold(stage.Name, target) {\n\t\t\treturn i, nil\n\t\t}\n\t}\n\treturn -1, fmt.Errorf(\"%s is not a valid target build stage\", target)\n}\n\n// ParseCommands parses an array of commands into an array of instructions.Command; used for onbuild\nfunc ParseCommands(cmdArray []string) ([]instructions.Command, error) {\n\tvar cmds []instructions.Command\n\tcmdString := strings.Join(cmdArray, \"\\n\")\n\tast, err := parser.Parse(strings.NewReader(cmdString))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfor _, child := range ast.AST.Children {\n\t\tcmd, err := instructions.ParseCommand(child)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcmds = append(cmds, cmd)\n\t}\n\treturn cmds, nil\n}\n\n// SaveStage returns true if the current stage will be needed later in the Dockerfile\nfunc saveStage(index int, stages []instructions.Stage) bool {\n\tcurrentStageName := stages[index].Name\n\n\tfor stageIndex, stage := range stages {\n\t\tif stageIndex <= index {\n\t\t\tcontinue\n\t\t}\n\n\t\tif strings.ToLower(stage.BaseName) == currentStageName {\n\t\t\tif stage.BaseName != \"\" {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false\n}\n\n// ResolveCrossStageCommands resolves any calls to previous stages with names to indices\n// Ex. --from=secondStage should be --from=1 for easier processing later on\n// As third party library lowers stage name in FROM instruction, this function resolves stage case insensitively.\nfunc ResolveCrossStageCommands(cmds []instructions.Command, stageNameToIdx map[string]string) {\n\tfor _, cmd := range cmds {\n\t\tswitch c := cmd.(type) {\n\t\tcase *instructions.CopyCommand:\n\t\t\tif c.From != \"\" {\n\t\t\t\tif val, ok := stageNameToIdx[strings.ToLower(c.From)]; ok {\n\t\t\t\t\tc.From = val\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// resolveStagesArgs resolves all the args from list of stages\nfunc resolveStagesArgs(stages []instructions.Stage, args []string) error {\n\tfor i, s := range stages {\n\t\tresolvedBaseName, err := util.ResolveEnvironmentReplacement(s.BaseName, args, false)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, fmt.Sprintf(\"resolving base name %s\", s.BaseName))\n\t\t}\n\t\tif s.BaseName != resolvedBaseName {\n\t\t\tstages[i].BaseName = resolvedBaseName\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc MakeKanikoStages(opts *config.KanikoOptions, stages []instructions.Stage, metaArgs []instructions.ArgCommand) ([]config.KanikoStage, error) {\n\ttargetStage, err := targetStage(stages, opts.Target)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"Error finding target stage\")\n\t}\n\targs := unifyArgs(metaArgs, opts.BuildArgs)\n\tif err := resolveStagesArgs(stages, args); err != nil {\n\t\treturn nil, errors.Wrap(err, \"resolving args\")\n\t}\n\tif opts.SkipUnusedStages {\n\t\tstages = skipUnusedStages(stages, &targetStage, opts.Target)\n\t}\n\tvar kanikoStages []config.KanikoStage\n\tfor index, stage := range stages {\n\t\tif len(stage.Name) > 0 {\n\t\t\tlogrus.Infof(\"Resolved base name %s to %s\", stage.BaseName, stage.Name)\n\t\t}\n\t\tbaseImageIndex := baseImageIndex(index, stages)\n\t\tkanikoStages = append(kanikoStages, config.KanikoStage{\n\t\t\tStage:                  stage,\n\t\t\tBaseImageIndex:         baseImageIndex,\n\t\t\tBaseImageStoredLocally: (baseImageIndex != -1),\n\t\t\tSaveStage:              saveStage(index, stages),\n\t\t\tFinal:                  index == targetStage,\n\t\t\tMetaArgs:               metaArgs,\n\t\t\tIndex:                  index,\n\t\t})\n\t\tif index == targetStage {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn kanikoStages, nil\n}\n\nfunc GetOnBuildInstructions(config *v1.Config, stageNameToIdx map[string]string) ([]instructions.Command, error) {\n\tif config.OnBuild == nil || len(config.OnBuild) == 0 {\n\t\treturn nil, nil\n\t}\n\n\tcmds, err := ParseCommands(config.OnBuild)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Iterate over commands and replace references to other stages with their index\n\tResolveCrossStageCommands(cmds, stageNameToIdx)\n\treturn cmds, nil\n}\n\n// unifyArgs returns the unified args between metaArgs and --build-arg\n// by default --build-arg overrides metaArgs except when --build-arg is empty\nfunc unifyArgs(metaArgs []instructions.ArgCommand, buildArgs []string) []string {\n\targsMap := make(map[string]string)\n\tfor _, marg := range metaArgs {\n\t\tfor _, arg := range marg.Args {\n\t\t\tif arg.Value != nil {\n\t\t\t\targsMap[arg.Key] = *arg.Value\n\t\t\t}\n\t\t}\n\t}\n\tsplitter := \"=\"\n\tfor _, a := range buildArgs {\n\t\ts := strings.Split(a, splitter)\n\t\tif len(s) > 1 && s[1] != \"\" {\n\t\t\targsMap[s[0]] = s[1]\n\t\t}\n\t}\n\tvar args []string\n\tfor k, v := range argsMap {\n\t\targs = append(args, fmt.Sprintf(\"%s=%s\", k, v))\n\t}\n\treturn args\n}\n\n// skipUnusedStages returns the list of used stages without the unnecessaries ones\nfunc skipUnusedStages(stages []instructions.Stage, lastStageIndex *int, target string) []instructions.Stage {\n\tstagesDependencies := make(map[string]bool)\n\tvar onlyUsedStages []instructions.Stage\n\tidx := *lastStageIndex\n\n\tlastStageBaseName := stages[idx].BaseName\n\n\tfor i := idx; i >= 0; i-- {\n\t\ts := stages[i]\n\t\tif (s.Name != \"\" && stagesDependencies[s.Name]) || s.Name == lastStageBaseName || i == idx {\n\t\t\tfor _, c := range s.Commands {\n\t\t\t\tswitch cmd := c.(type) {\n\t\t\t\tcase *instructions.CopyCommand:\n\t\t\t\t\tstageName := cmd.From\n\t\t\t\t\tif copyFromIndex, err := strconv.Atoi(stageName); err == nil {\n\t\t\t\t\t\tstageName = stages[copyFromIndex].Name\n\t\t\t\t\t}\n\t\t\t\t\tif !stagesDependencies[stageName] {\n\t\t\t\t\t\tstagesDependencies[stageName] = true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif i != idx {\n\t\t\t\tstagesDependencies[s.BaseName] = true\n\t\t\t}\n\t\t}\n\t}\n\tdependenciesLen := len(stagesDependencies)\n\tif target == \"\" && dependenciesLen == 0 {\n\t\treturn stages\n\t} else if dependenciesLen > 0 {\n\t\tfor i := 0; i < idx; i++ {\n\t\t\tif stages[i].Name == \"\" {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ts := stages[i]\n\t\t\tif stagesDependencies[s.Name] || s.Name == lastStageBaseName {\n\t\t\t\tonlyUsedStages = append(onlyUsedStages, s)\n\t\t\t}\n\t\t}\n\t}\n\tonlyUsedStages = append(onlyUsedStages, stages[idx])\n\tif idx > len(onlyUsedStages)-1 {\n\t\t*lastStageIndex = len(onlyUsedStages) - 1\n\t}\n\n\treturn onlyUsedStages\n}\n"
  },
  {
    "path": "pkg/dockerfile/dockerfile_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage dockerfile\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\nfunc Test_ParseStages_ArgValueWithQuotes(t *testing.T) {\n\tdockerfile := `\n\tARG IMAGE=\"ubuntu:16.04\"\n\tARG FOO=bar\n\tARG HELLO=\"Hello\"\n\tARG WORLD=\"World\"\n\tARG NESTED=\"$HELLO $WORLD\"\n\tFROM ${IMAGE}\n\tRUN echo hi > /hi\n\n\tFROM scratch AS second\n\tCOPY --from=0 /hi /hi2\n\n\tFROM scratch\n\tCOPY --from=second /hi2 /hi3\n\t`\n\ttmpfile, err := os.CreateTemp(\"\", \"Dockerfile.test\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tdefer os.Remove(tmpfile.Name())\n\n\tif _, err := tmpfile.Write([]byte(dockerfile)); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif err := tmpfile.Close(); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tstages, metaArgs, err := ParseStages(&config.KanikoOptions{DockerfilePath: tmpfile.Name()})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tif len(stages) == 0 {\n\t\tt.Fatal(\"length of stages expected to be greater than zero, but was zero\")\n\t}\n\n\tif len(metaArgs) != 5 {\n\t\tt.Fatalf(\"length of stage meta args expected to be 5, but was %d\", len(metaArgs))\n\t}\n\n\tfor i, expectedVal := range []string{\"ubuntu:16.04\", \"bar\", \"Hello\", \"World\", \"Hello World\"} {\n\t\tif metaArgs[i].Args[0].ValueString() != expectedVal {\n\t\t\tt.Fatalf(\"expected metaArg %d val to be %s but was %s\", i, expectedVal, metaArgs[i].Args[0].ValueString())\n\t\t}\n\t}\n}\n\nfunc Test_stripEnclosingQuotes(t *testing.T) {\n\ttype testCase struct {\n\t\tname     string\n\t\tinArgs   []instructions.ArgCommand\n\t\texpected []string\n\t\tsuccess  bool\n\t}\n\n\tnewArgCommand := func(key, val string) instructions.ArgCommand {\n\t\treturn instructions.ArgCommand{\n\t\t\tArgs: []instructions.KeyValuePairOptional{{Key: key, Value: &val}},\n\t\t}\n\t}\n\n\tcases := []testCase{{\n\t\tname:     \"value with no enclosing quotes\",\n\t\tinArgs:   []instructions.ArgCommand{newArgCommand(\"MEOW\", \"Purr\")},\n\t\texpected: []string{\"Purr\"},\n\t\tsuccess:  true,\n\t}, {\n\t\tname:   \"value with unmatched leading double quote\",\n\t\tinArgs: []instructions.ArgCommand{newArgCommand(\"MEOW\", \"\\\"Purr\")},\n\t}, {\n\t\tname:   \"value with unmatched trailing double quote\",\n\t\tinArgs: []instructions.ArgCommand{newArgCommand(\"MEOW\", \"Purr\\\"\")},\n\t}, {\n\t\tname:     \"value with enclosing double quotes\",\n\t\tinArgs:   []instructions.ArgCommand{newArgCommand(\"MEOW\", \"\\\"mrow\\\"\")},\n\t\texpected: []string{\"mrow\"},\n\t\tsuccess:  true,\n\t}, {\n\t\tname:   \"value with unmatched leading single quote\",\n\t\tinArgs: []instructions.ArgCommand{newArgCommand(\"MEOW\", \"'Purr\")},\n\t}, {\n\t\tname:   \"value with unmatched trailing single quote\",\n\t\tinArgs: []instructions.ArgCommand{newArgCommand(\"MEOW\", \"Purr'\")},\n\t}, {\n\t\tname:     \"value with enclosing single quotes\",\n\t\tinArgs:   []instructions.ArgCommand{newArgCommand(\"MEOW\", \"'mrow'\")},\n\t\texpected: []string{\"mrow\"},\n\t\tsuccess:  true,\n\t}, {\n\t\tname:     \"blank value with enclosing double quotes\",\n\t\tinArgs:   []instructions.ArgCommand{newArgCommand(\"MEOW\", `\"\"`)},\n\t\texpected: []string{\"\"},\n\t\tsuccess:  true,\n\t}, {\n\t\tname:     \"blank value with enclosing single quotes\",\n\t\tinArgs:   []instructions.ArgCommand{newArgCommand(\"MEOW\", \"''\")},\n\t\texpected: []string{\"\"},\n\t\tsuccess:  true,\n\t}, {\n\t\tname:     \"value with escaped, enclosing double quotes\",\n\t\tinArgs:   []instructions.ArgCommand{newArgCommand(\"MEOW\", `\\\"Purr\\\"`)},\n\t\texpected: []string{`\\\"Purr\\\"`},\n\t\tsuccess:  true,\n\t}, {\n\t\tname:     \"value with escaped, enclosing single quotes\",\n\t\tinArgs:   []instructions.ArgCommand{newArgCommand(\"MEOW\", `\\'Purr\\'`)},\n\t\texpected: []string{`\\'Purr\\'`},\n\t\tsuccess:  true,\n\t}, {\n\t\tname: \"multiple values enclosed with single quotes\",\n\t\tinArgs: []instructions.ArgCommand{\n\t\t\tnewArgCommand(\"MEOW\", `'Purr'`),\n\t\t\tnewArgCommand(\"MEW\", `'Mrow'`),\n\t\t},\n\t\texpected: []string{\"Purr\", \"Mrow\"},\n\t\tsuccess:  true,\n\t}, {\n\t\tname: \"multiple values, one blank, one a single int\",\n\t\tinArgs: []instructions.ArgCommand{\n\t\t\tnewArgCommand(\"MEOW\", `\"\"`),\n\t\t\tnewArgCommand(\"MEW\", `1`),\n\t\t},\n\t\texpected: []string{\"\", \"1\"},\n\t\tsuccess:  true,\n\t}, {\n\t\tname:    \"no values\",\n\t\tsuccess: true,\n\t}}\n\n\tfor _, test := range cases {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tinArgs := test.inArgs\n\t\t\texpected := test.expected\n\t\t\tsuccess := test.success\n\n\t\t\tout, err := stripEnclosingQuotes(inArgs)\n\t\t\tif success && err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tif !success && err == nil {\n\t\t\t\tt.Fatal(\"expected an error but none received\")\n\t\t\t}\n\n\t\t\tif len(expected) != len(out) {\n\t\t\t\tt.Fatalf(\"Expected %d args but got %d\", len(expected), len(out))\n\t\t\t}\n\n\t\t\tfor i := range out {\n\t\t\t\tif expected[i] != out[i].Args[0].ValueString() {\n\t\t\t\t\tt.Errorf(\n\t\t\t\t\t\t\"Expected arg at index %d to equal %v but instead equaled %v\",\n\t\t\t\t\t\ti,\n\t\t\t\t\t\texpected[i],\n\t\t\t\t\t\tout[i].Args[0].ValueString())\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_GetOnBuildInstructions(t *testing.T) {\n\ttype testCase struct {\n\t\tname        string\n\t\tcfg         *v1.Config\n\t\tstageToIdx  map[string]string\n\t\texpCommands []instructions.Command\n\t}\n\n\ttests := []testCase{\n\t\t{name: \"no on-build on config\",\n\t\t\tcfg:         &v1.Config{},\n\t\t\tstageToIdx:  map[string]string{\"builder\": \"0\"},\n\t\t\texpCommands: nil,\n\t\t},\n\t\t{name: \"onBuild on config, nothing to resolve\",\n\t\t\tcfg:         &v1.Config{OnBuild: []string{\"WORKDIR /app\"}},\n\t\t\tstageToIdx:  map[string]string{\"builder\": \"0\", \"temp\": \"1\"},\n\t\t\texpCommands: []instructions.Command{&instructions.WorkdirCommand{Path: \"/app\"}},\n\t\t},\n\t\t{name: \"onBuild on config, resolve multiple stages\",\n\t\t\tcfg:        &v1.Config{OnBuild: []string{\"COPY --from=builder a.txt b.txt\", \"COPY --from=temp /app /app\"}},\n\t\t\tstageToIdx: map[string]string{\"builder\": \"0\", \"temp\": \"1\"},\n\t\t\texpCommands: []instructions.Command{\n\t\t\t\t&instructions.CopyCommand{\n\t\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{\"a.txt\"}, DestPath: \"b.txt\"},\n\t\t\t\t\tFrom:           \"0\",\n\t\t\t\t},\n\t\t\t\t&instructions.CopyCommand{\n\t\t\t\t\tSourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{\"/app\"}, DestPath: \"/app\"},\n\t\t\t\t\tFrom:           \"1\",\n\t\t\t\t},\n\t\t\t}},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tcmds, err := GetOnBuildInstructions(test.cfg, test.stageToIdx)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to parse config for on-build instructions\")\n\t\t\t}\n\t\t\tif len(cmds) != len(test.expCommands) {\n\t\t\t\tt.Fatalf(\"Expected %d commands, got %d\", len(test.expCommands), len(cmds))\n\t\t\t}\n\n\t\t\tfor i, cmd := range cmds {\n\t\t\t\tif reflect.TypeOf(cmd) != reflect.TypeOf(test.expCommands[i]) {\n\t\t\t\t\tt.Fatalf(\"Got command %s, expected %s\", cmd, test.expCommands[i])\n\t\t\t\t}\n\t\t\t\tswitch c := cmd.(type) {\n\t\t\t\tcase *instructions.CopyCommand:\n\t\t\t\t\t{\n\t\t\t\t\t\texp := test.expCommands[i].(*instructions.CopyCommand)\n\t\t\t\t\t\ttestutil.CheckDeepEqual(t, exp.From, c.From)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_targetStage(t *testing.T) {\n\tdockerfile := `\n\tFROM scratch\n\tRUN echo hi > /hi\n\n\tFROM scratch AS second\n\tCOPY --from=0 /hi /hi2\n\n\tFROM scratch AS UPPER_CASE\n\tCOPY --from=0 /hi /hi2\n\n\tFROM scratch\n\tCOPY --from=second /hi2 /hi3\n\t`\n\tstages, _, err := Parse([]byte(dockerfile))\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\ttests := []struct {\n\t\tname        string\n\t\ttarget      string\n\t\ttargetIndex int\n\t\tshouldErr   bool\n\t}{\n\t\t{\n\t\t\tname:        \"test valid target\",\n\t\t\ttarget:      \"second\",\n\t\t\ttargetIndex: 1,\n\t\t\tshouldErr:   false,\n\t\t},\n\t\t{\n\t\t\tname:        \"test valid upper case target\",\n\t\t\ttarget:      \"UPPER_CASE\",\n\t\t\ttargetIndex: 2,\n\t\t\tshouldErr:   false,\n\t\t},\n\t\t{\n\t\t\tname:        \"test no target\",\n\t\t\ttarget:      \"\",\n\t\t\ttargetIndex: 3,\n\t\t\tshouldErr:   false,\n\t\t},\n\t\t{\n\t\t\tname:        \"test invalid target\",\n\t\t\ttarget:      \"invalid\",\n\t\t\ttargetIndex: -1,\n\t\t\tshouldErr:   true,\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\ttarget, err := targetStage(stages, test.target)\n\t\t\ttestutil.CheckError(t, test.shouldErr, err)\n\t\t\tif !test.shouldErr {\n\t\t\t\tif target != test.targetIndex {\n\t\t\t\t\tt.Errorf(\"got incorrect target, expected %d got %d\", test.targetIndex, target)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_SaveStage(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tindex    int\n\t\texpected bool\n\t}{\n\t\t{\n\t\t\tname:     \"reference stage in later copy command\",\n\t\t\tindex:    0,\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\tname:     \"reference stage in later from command\",\n\t\t\tindex:    1,\n\t\t\texpected: true,\n\t\t},\n\t\t{\n\t\t\tname:     \"don't reference stage later\",\n\t\t\tindex:    2,\n\t\t\texpected: false,\n\t\t},\n\t\t{\n\t\t\tname:     \"reference current stage in next stage\",\n\t\t\tindex:    4,\n\t\t\texpected: true,\n\t\t},\n\t\t{\n\t\t\tname:     \"from prebuilt stage, and reference current stage in next stage\",\n\t\t\tindex:    5,\n\t\t\texpected: true,\n\t\t},\n\t\t{\n\t\t\tname:     \"final stage\",\n\t\t\tindex:    6,\n\t\t\texpected: false,\n\t\t},\n\t}\n\tstages, _, err := Parse([]byte(testutil.Dockerfile))\n\tif err != nil {\n\t\tt.Fatalf(\"couldn't retrieve stages from Dockerfile: %v\", err)\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tactual := saveStage(test.index, stages)\n\t\t\ttestutil.CheckErrorAndDeepEqual(t, false, nil, test.expected, actual)\n\t\t})\n\t}\n}\n\nfunc Test_baseImageIndex(t *testing.T) {\n\ttests := []struct {\n\t\tname         string\n\t\tcurrentStage int\n\t\texpected     int\n\t}{\n\t\t{\n\t\t\tname:         \"stage that is built off of a previous stage\",\n\t\t\tcurrentStage: 2,\n\t\t\texpected:     1,\n\t\t},\n\t\t{\n\t\t\tname:         \"another stage that is built off of a previous stage\",\n\t\t\tcurrentStage: 5,\n\t\t\texpected:     4,\n\t\t},\n\t\t{\n\t\t\tname:         \"stage that isn't built off of a previous stage\",\n\t\t\tcurrentStage: 4,\n\t\t\texpected:     -1,\n\t\t},\n\t}\n\n\tstages, _, err := Parse([]byte(testutil.Dockerfile))\n\tif err != nil {\n\t\tt.Fatalf(\"couldn't retrieve stages from Dockerfile: %v\", err)\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tactual := baseImageIndex(test.currentStage, stages)\n\t\t\tif actual != test.expected {\n\t\t\t\tt.Fatalf(\"unexpected result, expected %d got %d\", test.expected, actual)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_ResolveStagesArgs(t *testing.T) {\n\tdockerfile := `\n\tARG IMAGE=\"ubuntu:16.04\"\n\tARG LAST_STAGE_VARIANT\n\tFROM ${IMAGE} as base\n\tRUN echo hi > /hi\n\tFROM base AS base-dev\n\tRUN echo dev >> /hi\n\tFROM base AS base-prod\n\tRUN echo prod >> /hi\n\tFROM base-${LAST_STAGE_VARIANT}\n\tRUN cat /hi\n\t`\n\n\tbuildArgLastVariants := []string{\"dev\", \"prod\"}\n\tbuildArgImages := []string{\"alpine:3.11\", \"\"}\n\tvar expectedImage string\n\n\tfor _, buildArgLastVariant := range buildArgLastVariants {\n\t\tfor _, buildArgImage := range buildArgImages {\n\t\t\tif buildArgImage != \"\" {\n\t\t\t\texpectedImage = buildArgImage\n\t\t\t} else {\n\t\t\t\texpectedImage = \"ubuntu:16.04\"\n\t\t\t}\n\t\t\tbuildArgs := []string{fmt.Sprintf(\"IMAGE=%s\", buildArgImage), fmt.Sprintf(\"LAST_STAGE_VARIANT=%s\", buildArgLastVariant)}\n\n\t\t\tstages, metaArgs, err := Parse([]byte(dockerfile))\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tstagesLen := len(stages)\n\t\t\targs := unifyArgs(metaArgs, buildArgs)\n\t\t\tif err := resolveStagesArgs(stages, args); err != nil {\n\t\t\t\tt.Fatalf(\"fail to resolves args %v: %v\", buildArgs, err)\n\t\t\t}\n\t\t\ttests := []struct {\n\t\t\t\tname               string\n\t\t\t\tactualSourceCode   string\n\t\t\t\tactualBaseName     string\n\t\t\t\texpectedSourceCode string\n\t\t\t\texpectedBaseName   string\n\t\t\t}{\n\t\t\t\t{\n\t\t\t\t\tname:               \"Test_BuildArg_From_First_Stage\",\n\t\t\t\t\tactualSourceCode:   stages[0].SourceCode,\n\t\t\t\t\tactualBaseName:     stages[0].BaseName,\n\t\t\t\t\texpectedSourceCode: \"FROM ${IMAGE} as base\",\n\t\t\t\t\texpectedBaseName:   expectedImage,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname:               \"Test_BuildArg_From_Last_Stage\",\n\t\t\t\t\tactualSourceCode:   stages[stagesLen-1].SourceCode,\n\t\t\t\t\tactualBaseName:     stages[stagesLen-1].BaseName,\n\t\t\t\t\texpectedSourceCode: \"FROM base-${LAST_STAGE_VARIANT}\",\n\t\t\t\t\texpectedBaseName:   fmt.Sprintf(\"base-%s\", buildArgLastVariant),\n\t\t\t\t},\n\t\t\t}\n\t\t\tfor _, test := range tests {\n\t\t\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\t\t\ttestutil.CheckDeepEqual(t, test.expectedSourceCode, test.actualSourceCode)\n\t\t\t\t\ttestutil.CheckDeepEqual(t, test.expectedBaseName, test.actualBaseName)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc Test_SkipingUnusedStages(t *testing.T) {\n\ttests := []struct {\n\t\tdescription                   string\n\t\tdockerfile                    string\n\t\ttargets                       []string\n\t\texpectedSourceCodes           map[string][]string\n\t\texpectedTargetIndexBeforeSkip map[string]int\n\t\texpectedTargetIndexAfterSkip  map[string]int\n\t}{\n\t\t{\n\t\t\tdescription: \"dockerfile_without_copyFrom\",\n\t\t\tdockerfile: `\n\t\t\tFROM alpine:3.11 AS base-dev\n\t\t\tRUN echo dev > /hi\n\t\t\tFROM alpine:3.11 AS base-prod\n\t\t\tRUN echo prod > /hi\n\t\t\tFROM base-dev as final-stage\n\t\t\tRUN cat /hi\n\t\t\t`,\n\t\t\ttargets: []string{\"base-dev\", \"base-prod\", \"\"},\n\t\t\texpectedSourceCodes: map[string][]string{\n\t\t\t\t\"base-dev\":  {\"FROM alpine:3.11 AS base-dev\"},\n\t\t\t\t\"base-prod\": {\"FROM alpine:3.11 AS base-prod\"},\n\t\t\t\t\"\":          {\"FROM alpine:3.11 AS base-dev\", \"FROM base-dev as final-stage\"},\n\t\t\t},\n\t\t\texpectedTargetIndexBeforeSkip: map[string]int{\n\t\t\t\t\"base-dev\":  0,\n\t\t\t\t\"base-prod\": 1,\n\t\t\t\t\"\":          2,\n\t\t\t},\n\t\t\texpectedTargetIndexAfterSkip: map[string]int{\n\t\t\t\t\"base-dev\":  0,\n\t\t\t\t\"base-prod\": 0,\n\t\t\t\t\"\":          1,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"dockerfile_with_copyFrom\",\n\t\t\tdockerfile: `\n\t\t\tFROM alpine:3.11 AS base-dev\n\t\t\tRUN echo dev > /hi\n\t\t\tFROM alpine:3.11 AS base-prod\n\t\t\tRUN echo prod > /hi\n\t\t\tFROM alpine:3.11\n\t\t\tCOPY --from=base-prod /hi /finalhi\n\t\t\tRUN cat /finalhi\n\t\t\t`,\n\t\t\ttargets: []string{\"base-dev\", \"base-prod\", \"\"},\n\t\t\texpectedSourceCodes: map[string][]string{\n\t\t\t\t\"base-dev\":  {\"FROM alpine:3.11 AS base-dev\"},\n\t\t\t\t\"base-prod\": {\"FROM alpine:3.11 AS base-prod\"},\n\t\t\t\t\"\":          {\"FROM alpine:3.11 AS base-prod\", \"FROM alpine:3.11\"},\n\t\t\t},\n\t\t\texpectedTargetIndexBeforeSkip: map[string]int{\n\t\t\t\t\"base-dev\":  0,\n\t\t\t\t\"base-prod\": 1,\n\t\t\t\t\"\":          2,\n\t\t\t},\n\t\t\texpectedTargetIndexAfterSkip: map[string]int{\n\t\t\t\t\"base-dev\":  0,\n\t\t\t\t\"base-prod\": 0,\n\t\t\t\t\"\":          1,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"dockerfile_with_two_copyFrom\",\n\t\t\tdockerfile: `\n\t\t\tFROM alpine:3.11 AS base-dev\n\t\t\tRUN echo dev > /hi\n\t\t\tFROM alpine:3.11 AS base-prod\n\t\t\tRUN echo prod > /hi\n\t\t\tFROM alpine:3.11\n\t\t\tCOPY --from=base-dev /hi /finalhidev\n\t\t\tCOPY --from=base-prod /hi /finalhiprod\n\t\t\tRUN cat /finalhidev\n\t\t\tRUN cat /finalhiprod\n\t\t\t`,\n\t\t\ttargets: []string{\"base-dev\", \"base-prod\", \"\"},\n\t\t\texpectedSourceCodes: map[string][]string{\n\t\t\t\t\"base-dev\":  {\"FROM alpine:3.11 AS base-dev\"},\n\t\t\t\t\"base-prod\": {\"FROM alpine:3.11 AS base-prod\"},\n\t\t\t\t\"\":          {\"FROM alpine:3.11 AS base-dev\", \"FROM alpine:3.11 AS base-prod\", \"FROM alpine:3.11\"},\n\t\t\t},\n\t\t\texpectedTargetIndexBeforeSkip: map[string]int{\n\t\t\t\t\"base-dev\":  0,\n\t\t\t\t\"base-prod\": 1,\n\t\t\t\t\"\":          2,\n\t\t\t},\n\t\t\texpectedTargetIndexAfterSkip: map[string]int{\n\t\t\t\t\"base-dev\":  0,\n\t\t\t\t\"base-prod\": 0,\n\t\t\t\t\"\":          2,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"dockerfile_with_two_copyFrom_and_arg\",\n\t\t\tdockerfile: `\n\t\t\tFROM debian:10.13 as base\n\t\t\tCOPY . .\n\t\t\tFROM scratch as second\n\t\t\tENV foopath context/foo\n\t\t\tCOPY --from=0 $foopath context/b* /foo/\n\t\t\tFROM second as third\n\t\t\tCOPY --from=base /context/foo /new/foo\n\t\t\tFROM base as fourth\n\t\t\t# Make sure that we snapshot intermediate images correctly\n\t\t\tRUN date > /date\n\t\t\tENV foo bar\n\t\t\t# This base image contains symlinks with relative paths to ignored directories\n\t\t\t# We need to test they're extracted correctly\n\t\t\tFROM fedora@sha256:c4cc32b09c6ae3f1353e7e33a8dda93dc41676b923d6d89afa996b421cc5aa48\n\t\t\tFROM fourth\n\t\t\tARG file=/foo2\n\t\t\tCOPY --from=second /foo ${file}\n\t\t\tCOPY --from=debian:10.13 /etc/os-release /new\n\t\t\t`,\n\t\t\ttargets: []string{\"base\", \"\"},\n\t\t\texpectedSourceCodes: map[string][]string{\n\t\t\t\t\"base\":   {\"FROM debian:10.13 as base\"},\n\t\t\t\t\"second\": {\"FROM debian:10.13 as base\", \"FROM scratch as second\"},\n\t\t\t\t\"\":       {\"FROM debian:10.13 as base\", \"FROM scratch as second\", \"FROM base as fourth\", \"FROM fourth\"},\n\t\t\t},\n\t\t\texpectedTargetIndexBeforeSkip: map[string]int{\n\t\t\t\t\"base\":   0,\n\t\t\t\t\"second\": 1,\n\t\t\t\t\"\":       5,\n\t\t\t},\n\t\t\texpectedTargetIndexAfterSkip: map[string]int{\n\t\t\t\t\"base\":   0,\n\t\t\t\t\"second\": 1,\n\t\t\t\t\"\":       3,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"dockerfile_without_final_dependencies\",\n\t\t\tdockerfile: `\n\t\t\tFROM alpine:3.11\n\t\t\tFROM debian:10.13 as base\n\t\t\tRUN echo foo > /foo\n\t\t\tFROM debian:10.13 as fizz\n\t\t\tRUN echo fizz >> /fizz\n\t\t\tCOPY --from=base /foo /fizz\n\t\t\tFROM alpine:3.11 as buzz\n\t\t\tRUN echo buzz > /buzz\n\t\t\tFROM alpine:3.11 as final\n\t\t\tRUN echo bar > /bar\n\t\t\t`,\n\t\t\ttargets: []string{\"final\", \"buzz\", \"fizz\", \"\"},\n\t\t\texpectedSourceCodes: map[string][]string{\n\t\t\t\t\"final\": {\"FROM alpine:3.11 as final\"},\n\t\t\t\t\"buzz\":  {\"FROM alpine:3.11 as buzz\"},\n\t\t\t\t\"fizz\":  {\"FROM debian:10.13 as base\", \"FROM debian:10.13 as fizz\"},\n\t\t\t\t\"\":      {\"FROM alpine:3.11\", \"FROM debian:10.13 as base\", \"FROM debian:10.13 as fizz\", \"FROM alpine:3.11 as buzz\", \"FROM alpine:3.11 as final\"},\n\t\t\t},\n\t\t\texpectedTargetIndexBeforeSkip: map[string]int{\n\t\t\t\t\"final\": 4,\n\t\t\t\t\"buzz\":  3,\n\t\t\t\t\"fizz\":  2,\n\t\t\t\t\"\":      4,\n\t\t\t},\n\t\t\texpectedTargetIndexAfterSkip: map[string]int{\n\t\t\t\t\"final\": 0,\n\t\t\t\t\"buzz\":  0,\n\t\t\t\t\"fizz\":  1,\n\t\t\t\t\"\":      4,\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tstages, _, err := Parse([]byte(test.dockerfile))\n\t\ttestutil.CheckError(t, false, err)\n\t\tactualSourceCodes := make(map[string][]string)\n\t\tfor _, target := range test.targets {\n\t\t\ttargetIndex, err := targetStage(stages, target)\n\t\t\ttestutil.CheckError(t, false, err)\n\t\t\ttargetIndexBeforeSkip := targetIndex\n\t\t\tonlyUsedStages := skipUnusedStages(stages, &targetIndex, target)\n\t\t\tfor _, s := range onlyUsedStages {\n\t\t\t\tactualSourceCodes[target] = append(actualSourceCodes[target], s.SourceCode)\n\t\t\t}\n\t\t\tt.Run(test.description, func(t *testing.T) {\n\t\t\t\ttestutil.CheckDeepEqual(t, test.expectedSourceCodes[target], actualSourceCodes[target])\n\t\t\t\ttestutil.CheckDeepEqual(t, test.expectedTargetIndexBeforeSkip[target], targetIndexBeforeSkip)\n\t\t\t\ttestutil.CheckDeepEqual(t, test.expectedTargetIndexAfterSkip[target], targetIndex)\n\t\t\t})\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/executor/build.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage executor\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/google/go-containerregistry/pkg/name\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/google/go-containerregistry/pkg/v1/empty\"\n\t\"github.com/google/go-containerregistry/pkg/v1/mutate\"\n\t\"github.com/google/go-containerregistry/pkg/v1/tarball\"\n\t\"github.com/google/go-containerregistry/pkg/v1/types\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n\t\"golang.org/x/sync/errgroup\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/cache\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/commands\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/constants\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\timage_util \"github.com/GoogleContainerTools/kaniko/pkg/image\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/image/remote\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/snapshot\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/timing\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/google/go-containerregistry/pkg/v1/partial\"\n)\n\n// This is the size of an empty tar in Go\nconst emptyTarSize = 1024\n\n// for testing\nvar (\n\tinitializeConfig = initConfig\n\tgetFSFromImage   = util.GetFSFromImage\n)\n\ntype cachePusher func(*config.KanikoOptions, string, string, string) error\ntype snapShotter interface {\n\tInit() error\n\tTakeSnapshotFS() (string, error)\n\tTakeSnapshot([]string, bool, bool) (string, error)\n}\n\n// stageBuilder contains all fields necessary to build one stage of a Dockerfile\ntype stageBuilder struct {\n\tstage            config.KanikoStage\n\timage            v1.Image\n\tcf               *v1.ConfigFile\n\tbaseImageDigest  string\n\tfinalCacheKey    string\n\topts             *config.KanikoOptions\n\tfileContext      util.FileContext\n\tcmds             []commands.DockerCommand\n\targs             *dockerfile.BuildArgs\n\tcrossStageDeps   map[int][]string\n\tdigestToCacheKey map[string]string\n\tstageIdxToDigest map[string]string\n\tsnapshotter      snapShotter\n\tlayerCache       cache.LayerCache\n\tpushLayerToCache cachePusher\n}\n\n// newStageBuilder returns a new type stageBuilder which contains all the information required to build the stage\nfunc newStageBuilder(args *dockerfile.BuildArgs, opts *config.KanikoOptions, stage config.KanikoStage, crossStageDeps map[int][]string, dcm map[string]string, sid map[string]string, stageNameToIdx map[string]string, fileContext util.FileContext) (*stageBuilder, error) {\n\tsourceImage, err := image_util.RetrieveSourceImage(stage, opts)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\timageConfig, err := initializeConfig(sourceImage, opts)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif err := resolveOnBuild(&stage, &imageConfig.Config, stageNameToIdx); err != nil {\n\t\treturn nil, err\n\t}\n\n\terr = util.InitIgnoreList()\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to initialize ignore list\")\n\t}\n\n\thasher, err := getHasher(opts.SnapshotMode)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tl := snapshot.NewLayeredMap(hasher)\n\tsnapshotter := snapshot.NewSnapshotter(l, config.RootDir)\n\n\tdigest, err := sourceImage.Digest()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ts := &stageBuilder{\n\t\tstage:            stage,\n\t\timage:            sourceImage,\n\t\tcf:               imageConfig,\n\t\tsnapshotter:      snapshotter,\n\t\tbaseImageDigest:  digest.String(),\n\t\topts:             opts,\n\t\tfileContext:      fileContext,\n\t\tcrossStageDeps:   crossStageDeps,\n\t\tdigestToCacheKey: dcm,\n\t\tstageIdxToDigest: sid,\n\t\tlayerCache:       newLayerCache(opts),\n\t\tpushLayerToCache: pushLayerToCache,\n\t}\n\n\tfor _, cmd := range s.stage.Commands {\n\t\tcommand, err := commands.GetCommand(cmd, fileContext, opts.RunV2, opts.CacheCopyLayers, opts.CacheRunLayers)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif command == nil {\n\t\t\tcontinue\n\t\t}\n\t\ts.cmds = append(s.cmds, command)\n\t}\n\n\tif args != nil {\n\t\ts.args = args.Clone()\n\t} else {\n\t\ts.args = dockerfile.NewBuildArgs(s.opts.BuildArgs)\n\t}\n\ts.args.AddMetaArgs(s.stage.MetaArgs)\n\treturn s, nil\n}\n\nfunc initConfig(img partial.WithConfigFile, opts *config.KanikoOptions) (*v1.ConfigFile, error) {\n\timageConfig, err := img.ConfigFile()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif imageConfig.Config.Env == nil {\n\t\timageConfig.Config.Env = constants.ScratchEnvVars\n\t}\n\n\tif opts == nil {\n\t\treturn imageConfig, nil\n\t}\n\n\tif l := len(opts.Labels); l > 0 {\n\t\tif imageConfig.Config.Labels == nil {\n\t\t\timageConfig.Config.Labels = make(map[string]string)\n\t\t}\n\t\tfor _, label := range opts.Labels {\n\t\t\tparts := strings.SplitN(label, \"=\", 2)\n\t\t\tif len(parts) != 2 {\n\t\t\t\treturn nil, fmt.Errorf(\"labels must be of the form key=value, got %s\", label)\n\t\t\t}\n\n\t\t\timageConfig.Config.Labels[parts[0]] = parts[1]\n\t\t}\n\t}\n\n\treturn imageConfig, nil\n}\n\nfunc newLayerCache(opts *config.KanikoOptions) cache.LayerCache {\n\tif isOCILayout(opts.CacheRepo) {\n\t\treturn &cache.LayoutCache{\n\t\t\tOpts: opts,\n\t\t}\n\t}\n\treturn &cache.RegistryCache{\n\t\tOpts: opts,\n\t}\n}\n\nfunc isOCILayout(path string) bool {\n\treturn strings.HasPrefix(path, \"oci:\")\n}\n\nfunc (s *stageBuilder) populateCompositeKey(command commands.DockerCommand, files []string, compositeKey CompositeCache, args *dockerfile.BuildArgs, env []string) (CompositeCache, error) {\n\t// First replace all the environment variables or args in the command\n\treplacementEnvs := args.ReplacementEnvs(env)\n\t// The sort order of `replacementEnvs` is basically undefined, sort it\n\t// so we can ensure a stable cache key.\n\tsort.Strings(replacementEnvs)\n\t// Use the special argument \"|#\" at the start of the args array. This will\n\t// avoid conflicts with any RUN command since commands can not\n\t// start with | (vertical bar). The \"#\" (number of build envs) is there to\n\t// help ensure proper cache matches.\n\n\tif command.IsArgsEnvsRequiredInCache() {\n\t\tif len(replacementEnvs) > 0 {\n\t\t\tcompositeKey.AddKey(fmt.Sprintf(\"|%d\", len(replacementEnvs)))\n\t\t\tcompositeKey.AddKey(replacementEnvs...)\n\t\t}\n\t}\n\n\t// Add the next command to the cache key.\n\tcompositeKey.AddKey(command.String())\n\n\tfor _, f := range files {\n\t\tif err := compositeKey.AddPath(f, s.fileContext); err != nil {\n\t\t\treturn compositeKey, err\n\t\t}\n\t}\n\treturn compositeKey, nil\n}\n\nfunc (s *stageBuilder) optimize(compositeKey CompositeCache, cfg v1.Config) error {\n\tif !s.opts.Cache {\n\t\treturn nil\n\t}\n\tvar buildArgs = s.args.Clone()\n\t// Restore build args back to their original values\n\tdefer func() {\n\t\ts.args = buildArgs\n\t}()\n\n\tstopCache := false\n\t// Possibly replace commands with their cached implementations.\n\t// We walk through all the commands, running any commands that only operate on metadata.\n\t// We throw the metadata away after, but we need it to properly track command dependencies\n\t// for things like COPY ${FOO} or RUN commands that use environment variables.\n\tfor i, command := range s.cmds {\n\t\tif command == nil {\n\t\t\tcontinue\n\t\t}\n\t\tfiles, err := command.FilesUsedFromContext(&cfg, s.args)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"failed to get files used from context\")\n\t\t}\n\n\t\tcompositeKey, err = s.populateCompositeKey(command, files, compositeKey, s.args, cfg.Env)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tlogrus.Debugf(\"Optimize: composite key for command %v %v\", command.String(), compositeKey)\n\t\tck, err := compositeKey.Hash()\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"failed to hash composite key\")\n\t\t}\n\n\t\tlogrus.Debugf(\"Optimize: cache key for command %v %v\", command.String(), ck)\n\t\ts.finalCacheKey = ck\n\n\t\tif command.ShouldCacheOutput() && !stopCache {\n\t\t\timg, err := s.layerCache.RetrieveLayer(ck)\n\n\t\t\tif err != nil {\n\t\t\t\tlogrus.Debugf(\"Failed to retrieve layer: %s\", err)\n\t\t\t\tlogrus.Infof(\"No cached layer found for cmd %s\", command.String())\n\t\t\t\tlogrus.Debugf(\"Key missing was: %s\", compositeKey.Key())\n\t\t\t\tstopCache = true\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif cacheCmd := command.CacheCommand(img); cacheCmd != nil {\n\t\t\t\tlogrus.Infof(\"Using caching version of cmd: %s\", command.String())\n\t\t\t\ts.cmds[i] = cacheCmd\n\t\t\t}\n\t\t}\n\n\t\t// Mutate the config for any commands that require it.\n\t\tif command.MetadataOnly() {\n\t\t\tif err := command.ExecuteCommand(&cfg, s.args); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (s *stageBuilder) build() error {\n\t// Set the initial cache key to be the base image digest, the build args and the SrcContext.\n\tvar compositeKey *CompositeCache\n\tif cacheKey, ok := s.digestToCacheKey[s.baseImageDigest]; ok {\n\t\tcompositeKey = NewCompositeCache(cacheKey)\n\t} else {\n\t\tcompositeKey = NewCompositeCache(s.baseImageDigest)\n\t}\n\n\t// Apply optimizations to the instructions.\n\tif err := s.optimize(*compositeKey, s.cf.Config); err != nil {\n\t\treturn errors.Wrap(err, \"failed to optimize instructions\")\n\t}\n\n\t// Unpack file system to root if we need to.\n\tshouldUnpack := false\n\tfor _, cmd := range s.cmds {\n\t\tif cmd.RequiresUnpackedFS() {\n\t\t\tlogrus.Infof(\"Unpacking rootfs as cmd %s requires it.\", cmd.String())\n\t\t\tshouldUnpack = true\n\t\t\tbreak\n\t\t}\n\t}\n\tif len(s.crossStageDeps[s.stage.Index]) > 0 {\n\t\tshouldUnpack = true\n\t}\n\tif s.stage.Index == 0 && s.opts.InitialFSUnpacked {\n\t\tshouldUnpack = false\n\t}\n\n\tif shouldUnpack {\n\t\tt := timing.Start(\"FS Unpacking\")\n\n\t\tretryFunc := func() error {\n\t\t\t_, err := getFSFromImage(config.RootDir, s.image, util.ExtractFile)\n\t\t\treturn err\n\t\t}\n\n\t\tif err := util.Retry(retryFunc, s.opts.ImageFSExtractRetry, 1000); err != nil {\n\t\t\treturn errors.Wrap(err, \"failed to get filesystem from image\")\n\t\t}\n\n\t\ttiming.DefaultRun.Stop(t)\n\t} else {\n\t\tlogrus.Info(\"Skipping unpacking as no commands require it.\")\n\t}\n\n\tinitSnapshotTaken := false\n\tif s.opts.SingleSnapshot {\n\t\tif err := s.initSnapshotWithTimings(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tinitSnapshotTaken = true\n\t}\n\n\tcacheGroup := errgroup.Group{}\n\tfor index, command := range s.cmds {\n\t\tif command == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tt := timing.Start(\"Command: \" + command.String())\n\n\t\t// If the command uses files from the context, add them.\n\t\tfiles, err := command.FilesUsedFromContext(&s.cf.Config, s.args)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"failed to get files used from context\")\n\t\t}\n\n\t\tif s.opts.Cache {\n\t\t\t*compositeKey, err = s.populateCompositeKey(command, files, *compositeKey, s.args, s.cf.Config.Env)\n\t\t\tif err != nil && s.opts.Cache {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tlogrus.Info(command.String())\n\n\t\tisCacheCommand := func() bool {\n\t\t\tswitch command.(type) {\n\t\t\tcase commands.Cached:\n\t\t\t\treturn true\n\t\t\tdefault:\n\t\t\t\treturn false\n\t\t\t}\n\t\t}()\n\t\tif !initSnapshotTaken && !isCacheCommand && !command.ProvidesFilesToSnapshot() {\n\t\t\t// Take initial snapshot if command does not expect to return\n\t\t\t// a list of files.\n\t\t\tif err := s.initSnapshotWithTimings(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tinitSnapshotTaken = true\n\t\t}\n\n\t\tif err := command.ExecuteCommand(&s.cf.Config, s.args); err != nil {\n\t\t\treturn errors.Wrap(err, \"failed to execute command\")\n\t\t}\n\t\tfiles = command.FilesToSnapshot()\n\t\ttiming.DefaultRun.Stop(t)\n\n\t\tif !s.shouldTakeSnapshot(index, command.MetadataOnly()) && !s.opts.ForceBuildMetadata {\n\t\t\tlogrus.Debugf(\"Build: skipping snapshot for [%v]\", command.String())\n\t\t\tcontinue\n\t\t}\n\t\tif isCacheCommand {\n\t\t\tv := command.(commands.Cached)\n\t\t\tlayer := v.Layer()\n\t\t\tif err := s.saveLayerToImage(layer, command.String()); err != nil {\n\t\t\t\treturn errors.Wrap(err, \"failed to save layer\")\n\t\t\t}\n\t\t} else {\n\t\t\ttarPath, err := s.takeSnapshot(files, command.ShouldDetectDeletedFiles())\n\t\t\tif err != nil {\n\t\t\t\treturn errors.Wrap(err, \"failed to take snapshot\")\n\t\t\t}\n\n\t\t\tif s.opts.Cache {\n\t\t\t\tlogrus.Debugf(\"Build: composite key for command %v %v\", command.String(), compositeKey)\n\t\t\t\tck, err := compositeKey.Hash()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn errors.Wrap(err, \"failed to hash composite key\")\n\t\t\t\t}\n\n\t\t\t\tlogrus.Debugf(\"Build: cache key for command %v %v\", command.String(), ck)\n\n\t\t\t\t// Push layer to cache (in parallel) now along with new config file\n\t\t\t\tif command.ShouldCacheOutput() && !s.opts.NoPushCache {\n\t\t\t\t\tcacheGroup.Go(func() error {\n\t\t\t\t\t\treturn s.pushLayerToCache(s.opts, ck, tarPath, command.String())\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\tif err := s.saveSnapshotToImage(command.String(), tarPath); err != nil {\n\t\t\t\treturn errors.Wrap(err, \"failed to save snapshot to image\")\n\t\t\t}\n\t\t}\n\t}\n\n\tif err := cacheGroup.Wait(); err != nil {\n\t\tlogrus.Warnf(\"Error uploading layer to cache: %s\", err)\n\t}\n\n\treturn nil\n}\n\nfunc (s *stageBuilder) takeSnapshot(files []string, shdDelete bool) (string, error) {\n\tvar snapshot string\n\tvar err error\n\n\tt := timing.Start(\"Snapshotting FS\")\n\tif files == nil || s.opts.SingleSnapshot {\n\t\tsnapshot, err = s.snapshotter.TakeSnapshotFS()\n\t} else {\n\t\t// Volumes are very weird. They get snapshotted in the next command.\n\t\tfiles = append(files, util.Volumes()...)\n\t\tsnapshot, err = s.snapshotter.TakeSnapshot(files, shdDelete, s.opts.ForceBuildMetadata)\n\t}\n\ttiming.DefaultRun.Stop(t)\n\treturn snapshot, err\n}\n\nfunc (s *stageBuilder) shouldTakeSnapshot(index int, isMetadatCmd bool) bool {\n\tisLastCommand := index == len(s.cmds)-1\n\n\t// We only snapshot the very end with single snapshot mode on.\n\tif s.opts.SingleSnapshot {\n\t\treturn isLastCommand\n\t}\n\n\t// Always take snapshots if we're using the cache.\n\tif s.opts.Cache {\n\t\treturn true\n\t}\n\n\t// if command is a metadata command, do not snapshot.\n\treturn !isMetadatCmd\n}\n\nfunc (s *stageBuilder) saveSnapshotToImage(createdBy string, tarPath string) error {\n\tlayer, err := s.saveSnapshotToLayer(tarPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif layer == nil {\n\t\treturn nil\n\t}\n\n\treturn s.saveLayerToImage(layer, createdBy)\n}\n\nfunc (s *stageBuilder) saveSnapshotToLayer(tarPath string) (v1.Layer, error) {\n\tif tarPath == \"\" {\n\t\treturn nil, nil\n\t}\n\tfi, err := os.Stat(tarPath)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"tar file path does not exist\")\n\t}\n\tif fi.Size() <= emptyTarSize && !s.opts.ForceBuildMetadata {\n\t\tlogrus.Info(\"No files were changed, appending empty layer to config. No layer added to image.\")\n\t\treturn nil, nil\n\t}\n\n\tlayerOpts := s.getLayerOptionFromOpts()\n\timageMediaType, err := s.image.MediaType()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// Only appending MediaType for OCI images as the default is docker\n\tif extractMediaTypeVendor(imageMediaType) == types.OCIVendorPrefix {\n\t\tif s.opts.Compression == config.ZStd {\n\t\t\tlayerOpts = append(layerOpts, tarball.WithCompression(\"zstd\"), tarball.WithMediaType(types.OCILayerZStd))\n\t\t} else {\n\t\t\tlayerOpts = append(layerOpts, tarball.WithMediaType(types.OCILayer))\n\t\t}\n\t}\n\n\tlayer, err := tarball.LayerFromFile(tarPath, layerOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn layer, nil\n}\n\nfunc (s *stageBuilder) getLayerOptionFromOpts() []tarball.LayerOption {\n\tvar layerOpts []tarball.LayerOption\n\n\tif s.opts.CompressedCaching {\n\t\tlayerOpts = append(layerOpts, tarball.WithCompressedCaching)\n\t}\n\n\tif s.opts.CompressionLevel > 0 {\n\t\tlayerOpts = append(layerOpts, tarball.WithCompressionLevel(s.opts.CompressionLevel))\n\t}\n\treturn layerOpts\n}\n\nfunc extractMediaTypeVendor(mt types.MediaType) string {\n\tif strings.Contains(string(mt), types.OCIVendorPrefix) {\n\t\treturn types.OCIVendorPrefix\n\t}\n\treturn types.DockerVendorPrefix\n}\n\n// https://github.com/opencontainers/image-spec/blob/main/media-types.md#compatibility-matrix\nfunc convertMediaType(mt types.MediaType) types.MediaType {\n\tswitch mt {\n\tcase types.DockerManifestSchema1, types.DockerManifestSchema2:\n\t\treturn types.OCIManifestSchema1\n\tcase types.DockerManifestList:\n\t\treturn types.OCIImageIndex\n\tcase types.DockerLayer:\n\t\treturn types.OCILayer\n\tcase types.DockerConfigJSON:\n\t\treturn types.OCIConfigJSON\n\tcase types.DockerForeignLayer:\n\t\treturn types.OCIUncompressedRestrictedLayer\n\tcase types.DockerUncompressedLayer:\n\t\treturn types.OCIUncompressedLayer\n\tcase types.OCIImageIndex:\n\t\treturn types.DockerManifestList\n\tcase types.OCIManifestSchema1:\n\t\treturn types.DockerManifestSchema2\n\tcase types.OCIConfigJSON:\n\t\treturn types.DockerConfigJSON\n\tcase types.OCILayer, types.OCILayerZStd:\n\t\treturn types.DockerLayer\n\tcase types.OCIRestrictedLayer:\n\t\treturn types.DockerForeignLayer\n\tcase types.OCIUncompressedLayer:\n\t\treturn types.DockerUncompressedLayer\n\tcase types.OCIContentDescriptor, types.OCIUncompressedRestrictedLayer, types.DockerManifestSchema1Signed, types.DockerPluginConfig:\n\t\treturn \"\"\n\tdefault:\n\t\treturn \"\"\n\t}\n}\n\nfunc (s *stageBuilder) convertLayerMediaType(layer v1.Layer) (v1.Layer, error) {\n\tlayerMediaType, err := layer.MediaType()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\timageMediaType, err := s.image.MediaType()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif extractMediaTypeVendor(layerMediaType) != extractMediaTypeVendor(imageMediaType) {\n\t\tlayerOpts := s.getLayerOptionFromOpts()\n\t\ttargetMediaType := convertMediaType(layerMediaType)\n\n\t\tif extractMediaTypeVendor(imageMediaType) == types.OCIVendorPrefix {\n\t\t\tif s.opts.Compression == config.ZStd {\n\t\t\t\ttargetMediaType = types.OCILayerZStd\n\t\t\t\tlayerOpts = append(layerOpts, tarball.WithCompression(\"zstd\"))\n\t\t\t}\n\t\t}\n\n\t\tlayerOpts = append(layerOpts, tarball.WithMediaType(targetMediaType))\n\n\t\tif targetMediaType != \"\" {\n\t\t\treturn tarball.LayerFromOpener(layer.Uncompressed, layerOpts...)\n\t\t}\n\t\treturn nil, fmt.Errorf(\n\t\t\t\"layer with media type %v cannot be converted to a media type that matches %v\",\n\t\t\tlayerMediaType,\n\t\t\timageMediaType,\n\t\t)\n\t}\n\treturn layer, nil\n}\n\nfunc (s *stageBuilder) saveLayerToImage(layer v1.Layer, createdBy string) error {\n\tvar err error\n\tlayer, err = s.convertLayerMediaType(layer)\n\tif err != nil {\n\t\treturn err\n\t}\n\ts.image, err = mutate.Append(s.image,\n\t\tmutate.Addendum{\n\t\t\tLayer: layer,\n\t\t\tHistory: v1.History{\n\t\t\t\tAuthor:    constants.Author,\n\t\t\t\tCreatedBy: createdBy,\n\t\t\t},\n\t\t},\n\t)\n\treturn err\n}\n\nfunc CalculateDependencies(stages []config.KanikoStage, opts *config.KanikoOptions, stageNameToIdx map[string]string) (map[int][]string, error) {\n\timages := []v1.Image{}\n\tdepGraph := map[int][]string{}\n\tfor _, s := range stages {\n\t\tba := dockerfile.NewBuildArgs(opts.BuildArgs)\n\t\tba.AddMetaArgs(s.MetaArgs)\n\t\tvar image v1.Image\n\t\tvar err error\n\t\tif s.BaseImageStoredLocally {\n\t\t\timage = images[s.BaseImageIndex]\n\t\t} else if s.Name == constants.NoBaseImage {\n\t\t\timage = empty.Image\n\t\t} else {\n\t\t\timage, err = image_util.RetrieveSourceImage(s, opts)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\tcfg, err := initializeConfig(image, opts)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tcmds, err := dockerfile.GetOnBuildInstructions(&cfg.Config, stageNameToIdx)\n\t\tcmds = append(cmds, s.Commands...)\n\n\t\tfor _, c := range cmds {\n\t\t\tswitch cmd := c.(type) {\n\t\t\tcase *instructions.CopyCommand:\n\t\t\t\tif cmd.From != \"\" {\n\t\t\t\t\ti, err := strconv.Atoi(cmd.From)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tresolved, err := util.ResolveEnvironmentReplacementList(cmd.SourcesAndDest.SourcePaths, ba.ReplacementEnvs(cfg.Config.Env), true)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\tdepGraph[i] = append(depGraph[i], resolved...)\n\t\t\t\t}\n\t\t\tcase *instructions.EnvCommand:\n\t\t\t\tif err := util.UpdateConfigEnv(cmd.Env, &cfg.Config, ba.ReplacementEnvs(cfg.Config.Env)); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\timage, err = mutate.Config(image, cfg.Config)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\tcase *instructions.ArgCommand:\n\t\t\t\tfor _, arg := range cmd.Args {\n\t\t\t\t\tk, v, err := commands.ParseArg(arg.Key, arg.Value, cfg.Config.Env, ba)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\tba.AddArg(k, v)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\timages = append(images, image)\n\t}\n\treturn depGraph, nil\n}\n\n// DoBuild executes building the Dockerfile\nfunc DoBuild(opts *config.KanikoOptions) (v1.Image, error) {\n\tt := timing.Start(\"Total Build Time\")\n\tdigestToCacheKey := make(map[string]string)\n\tstageIdxToDigest := make(map[string]string)\n\n\tstages, metaArgs, err := dockerfile.ParseStages(opts)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tkanikoStages, err := dockerfile.MakeKanikoStages(opts, stages, metaArgs)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tstageNameToIdx := ResolveCrossStageInstructions(kanikoStages)\n\n\tfileContext, err := util.NewFileContextFromDockerfile(opts.DockerfilePath, opts.SrcContext)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Some stages may refer to other random images, not previous stages\n\tif err := fetchExtraStages(kanikoStages, opts); err != nil {\n\t\treturn nil, err\n\t}\n\tcrossStageDependencies, err := CalculateDependencies(kanikoStages, opts, stageNameToIdx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlogrus.Infof(\"Built cross stage deps: %v\", crossStageDependencies)\n\n\tvar args *dockerfile.BuildArgs\n\n\tfor index, stage := range kanikoStages {\n\t\tsb, err := newStageBuilder(\n\t\t\targs, opts, stage,\n\t\t\tcrossStageDependencies,\n\t\t\tdigestToCacheKey,\n\t\t\tstageIdxToDigest,\n\t\t\tstageNameToIdx,\n\t\t\tfileContext)\n\n\t\tlogrus.Infof(\"Building stage '%v' [idx: '%v', base-idx: '%v']\",\n\t\t\tstage.BaseName, stage.Index, stage.BaseImageIndex)\n\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\targs = sb.args\n\t\tif err := sb.build(); err != nil {\n\t\t\treturn nil, errors.Wrap(err, \"error building stage\")\n\t\t}\n\n\t\treviewConfig(stage, &sb.cf.Config)\n\n\t\tsourceImage, err := mutate.Config(sb.image, sb.cf.Config)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tconfigFile, err := sourceImage.ConfigFile()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif opts.CustomPlatform == \"\" {\n\t\t\tconfigFile.OS = runtime.GOOS\n\t\t\tconfigFile.Architecture = runtime.GOARCH\n\t\t} else {\n\t\t\tconfigFile.OS = strings.Split(opts.CustomPlatform, \"/\")[0]\n\t\t\tconfigFile.Architecture = strings.Split(opts.CustomPlatform, \"/\")[1]\n\t\t}\n\t\tsourceImage, err = mutate.ConfigFile(sourceImage, configFile)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\td, err := sourceImage.Digest()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tstageIdxToDigest[fmt.Sprintf(\"%d\", sb.stage.Index)] = d.String()\n\t\tlogrus.Debugf(\"Mapping stage idx %v to digest %v\", sb.stage.Index, d.String())\n\n\t\tdigestToCacheKey[d.String()] = sb.finalCacheKey\n\t\tlogrus.Debugf(\"Mapping digest %v to cachekey %v\", d.String(), sb.finalCacheKey)\n\n\t\tif stage.Final {\n\t\t\tsourceImage, err = mutate.CreatedAt(sourceImage, v1.Time{Time: time.Now()})\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif opts.Reproducible {\n\t\t\t\tsourceImage, err = mutate.Canonical(sourceImage)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t}\n\t\t\tif opts.Cleanup {\n\t\t\t\tif err = util.DeleteFilesystem(); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t}\n\t\t\ttiming.DefaultRun.Stop(t)\n\t\t\treturn sourceImage, nil\n\t\t}\n\t\tif stage.SaveStage {\n\t\t\tif err := saveStageAsTarball(strconv.Itoa(index), sourceImage); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\n\t\tfilesToSave, err := filesToSave(crossStageDependencies[index])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tdstDir := filepath.Join(config.KanikoDir, strconv.Itoa(index))\n\t\tif err := os.MkdirAll(dstDir, 0644); err != nil {\n\t\t\treturn nil, errors.Wrap(err,\n\t\t\t\tfmt.Sprintf(\"to create workspace for stage %s\",\n\t\t\t\t\tstageIdxToDigest[strconv.Itoa(index)],\n\t\t\t\t))\n\t\t}\n\t\tfor _, p := range filesToSave {\n\t\t\tlogrus.Infof(\"Saving file %s for later use\", p)\n\t\t\tif err := util.CopyFileOrSymlink(p, dstDir, config.RootDir); err != nil {\n\t\t\t\treturn nil, errors.Wrap(err, \"could not save file\")\n\t\t\t}\n\t\t}\n\n\t\t// Delete the filesystem\n\t\tif err := util.DeleteFilesystem(); err != nil {\n\t\t\treturn nil, errors.Wrap(err, fmt.Sprintf(\"deleting file system after stage %d\", index))\n\t\t}\n\t}\n\n\treturn nil, err\n}\n\n// filesToSave returns all the files matching the given pattern in deps.\n// If a file is a symlink, it also returns the target file.\nfunc filesToSave(deps []string) ([]string, error) {\n\tsrcFiles := []string{}\n\tfor _, src := range deps {\n\t\tsrcs, err := filepath.Glob(filepath.Join(config.RootDir, src))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfor _, f := range srcs {\n\t\t\tif link, err := util.EvalSymLink(f); err == nil {\n\t\t\t\tlink, err = filepath.Rel(config.RootDir, link)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, errors.Wrap(err, fmt.Sprintf(\"could not find relative path to %s\", config.RootDir))\n\t\t\t\t}\n\t\t\t\tsrcFiles = append(srcFiles, link)\n\t\t\t}\n\t\t\tf, err = filepath.Rel(config.RootDir, f)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, errors.Wrap(err, fmt.Sprintf(\"could not find relative path to %s\", config.RootDir))\n\t\t\t}\n\t\t\tsrcFiles = append(srcFiles, f)\n\t\t}\n\t}\n\t// remove duplicates\n\tdeduped := deduplicatePaths(srcFiles)\n\n\treturn deduped, nil\n}\n\n// deduplicatePaths returns a deduplicated slice of shortest paths\n// For example {\"usr/lib\", \"usr/lib/ssl\"} will return only {\"usr/lib\"}\nfunc deduplicatePaths(paths []string) []string {\n\ttype node struct {\n\t\tchildren map[string]*node\n\t\tvalue    bool\n\t}\n\n\troot := &node{children: make(map[string]*node)}\n\n\t// Create a tree marking all present paths\n\tfor _, f := range paths {\n\t\tparts := strings.Split(f, \"/\")\n\t\tcurrent := root\n\t\tfor i := 0; i < len(parts)-1; i++ {\n\t\t\tpart := parts[i]\n\t\t\tif _, ok := current.children[part]; !ok {\n\t\t\t\tcurrent.children[part] = &node{children: make(map[string]*node)}\n\t\t\t}\n\t\t\tcurrent = current.children[part]\n\t\t}\n\t\tcurrent.children[parts[len(parts)-1]] = &node{children: make(map[string]*node), value: true}\n\t}\n\n\t// Collect all paths\n\tdeduped := []string{}\n\tvar traverse func(*node, string)\n\ttraverse = func(n *node, path string) {\n\t\tif n.value {\n\t\t\tdeduped = append(deduped, strings.TrimPrefix(path, \"/\"))\n\t\t\treturn\n\t\t}\n\t\tfor k, v := range n.children {\n\t\t\ttraverse(v, path+\"/\"+k)\n\t\t}\n\t}\n\n\ttraverse(root, \"\")\n\n\treturn deduped\n}\n\nfunc fetchExtraStages(stages []config.KanikoStage, opts *config.KanikoOptions) error {\n\tt := timing.Start(\"Fetching Extra Stages\")\n\tdefer timing.DefaultRun.Stop(t)\n\n\tvar names []string\n\n\tfor stageIndex, s := range stages {\n\t\tfor _, cmd := range s.Commands {\n\t\t\tc, ok := cmd.(*instructions.CopyCommand)\n\t\t\tif !ok || c.From == \"\" {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// FROMs at this point are guaranteed to be either an integer referring to a previous stage,\n\t\t\t// the name of a previous stage, or a name of a remote image.\n\n\t\t\t// If it is an integer stage index, validate that it is actually a previous index\n\t\t\tif fromIndex, err := strconv.Atoi(c.From); err == nil && stageIndex > fromIndex && fromIndex >= 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Check if the name is the alias of a previous stage\n\t\t\tif fromPreviousStage(c, names) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// This must be an image name, fetch it.\n\t\t\tlogrus.Debugf(\"Found extra base image stage %s\", c.From)\n\t\t\tsourceImage, err := remote.RetrieveRemoteImage(c.From, opts.RegistryOptions, opts.CustomPlatform)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif err := saveStageAsTarball(c.From, sourceImage); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif err := extractImageToDependencyDir(c.From, sourceImage); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\t// Store the name of the current stage in the list with names, if applicable.\n\t\tif s.Name != \"\" {\n\t\t\tnames = append(names, s.Name)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc fromPreviousStage(copyCommand *instructions.CopyCommand, previousStageNames []string) bool {\n\tfor _, previousStageName := range previousStageNames {\n\t\tif previousStageName == copyCommand.From {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc extractImageToDependencyDir(name string, image v1.Image) error {\n\tt := timing.Start(\"Extracting Image to Dependency Dir\")\n\tdefer timing.DefaultRun.Stop(t)\n\tdependencyDir := filepath.Join(config.KanikoDir, name)\n\tif err := os.MkdirAll(dependencyDir, 0755); err != nil {\n\t\treturn err\n\t}\n\tlogrus.Debugf(\"Trying to extract to %s\", dependencyDir)\n\t_, err := util.GetFSFromImage(dependencyDir, image, util.ExtractFile)\n\treturn err\n}\n\nfunc saveStageAsTarball(path string, image v1.Image) error {\n\tt := timing.Start(\"Saving stage as tarball\")\n\tdefer timing.DefaultRun.Stop(t)\n\tdestRef, err := name.NewTag(\"temp/tag\", name.WeakValidation)\n\tif err != nil {\n\t\treturn err\n\t}\n\ttarPath := filepath.Join(config.KanikoIntermediateStagesDir, path)\n\tlogrus.Infof(\"Storing source image from stage %s at path %s\", path, tarPath)\n\tif err := os.MkdirAll(filepath.Dir(tarPath), 0750); err != nil {\n\t\treturn err\n\t}\n\treturn tarball.WriteToFile(tarPath, destRef, image)\n}\n\nfunc getHasher(snapshotMode string) (func(string) (string, error), error) {\n\tswitch snapshotMode {\n\tcase constants.SnapshotModeTime:\n\t\tlogrus.Info(\"Only file modification time will be considered when snapshotting\")\n\t\treturn util.MtimeHasher(), nil\n\tcase constants.SnapshotModeFull:\n\t\treturn util.Hasher(), nil\n\tcase constants.SnapshotModeRedo:\n\t\treturn util.RedoHasher(), nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"%s is not a valid snapshot mode\", snapshotMode)\n\t}\n}\n\nfunc resolveOnBuild(stage *config.KanikoStage, config *v1.Config, stageNameToIdx map[string]string) error {\n\tcmds, err := dockerfile.GetOnBuildInstructions(config, stageNameToIdx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Append to the beginning of the commands in the stage\n\tstage.Commands = append(cmds, stage.Commands...)\n\tlogrus.Infof(\"Executing %v build triggers\", len(cmds))\n\n\t// Blank out the Onbuild command list for this image\n\tconfig.OnBuild = nil\n\treturn nil\n}\n\n// reviewConfig makes sure the value of CMD is correct after building the stage\n// If ENTRYPOINT was set in this stage but CMD wasn't, then CMD should be cleared out\n// See Issue #346 for more info\nfunc reviewConfig(stage config.KanikoStage, config *v1.Config) {\n\tentrypoint := false\n\tcmd := false\n\n\tfor _, c := range stage.Commands {\n\t\tif c.Name() == constants.Cmd {\n\t\t\tcmd = true\n\t\t}\n\t\tif c.Name() == constants.Entrypoint {\n\t\t\tentrypoint = true\n\t\t}\n\t}\n\tif entrypoint && !cmd {\n\t\tconfig.Cmd = nil\n\t}\n}\n\n// iterates over a list of KanikoStage and resolves instructions referring to earlier stages\n// returns a mapping of stage name to stage id, f.e - [\"first\": \"0\", \"second\": \"1\", \"target\": \"2\"]\nfunc ResolveCrossStageInstructions(stages []config.KanikoStage) map[string]string {\n\tnameToIndex := make(map[string]string)\n\tfor i, stage := range stages {\n\t\tindex := strconv.Itoa(i)\n\t\tif stage.Name != \"\" {\n\t\t\tnameToIndex[stage.Name] = index\n\t\t}\n\t\tdockerfile.ResolveCrossStageCommands(stage.Commands, nameToIndex)\n\t}\n\n\tlogrus.Debugf(\"Built stage name to index map: %v\", nameToIndex)\n\treturn nameToIndex\n}\n\nfunc (s stageBuilder) initSnapshotWithTimings() error {\n\tt := timing.Start(\"Initial FS snapshot\")\n\tif err := s.snapshotter.Init(); err != nil {\n\t\treturn err\n\t}\n\ttiming.DefaultRun.Stop(t)\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/executor/build_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage executor\n\nimport (\n\t\"archive/tar\"\n\t\"bytes\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strconv\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/cache\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/commands\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\t\"github.com/containerd/containerd/platforms\"\n\t\"github.com/google/go-cmp/cmp\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/google/go-containerregistry/pkg/v1/empty\"\n\t\"github.com/google/go-containerregistry/pkg/v1/mutate\"\n\t\"github.com/google/go-containerregistry/pkg/v1/partial\"\n\t\"github.com/google/go-containerregistry/pkg/v1/types\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\nfunc Test_reviewConfig(t *testing.T) {\n\ttests := []struct {\n\t\tname               string\n\t\tdockerfile         string\n\t\toriginalCmd        []string\n\t\toriginalEntrypoint []string\n\t\texpectedCmd        []string\n\t}{\n\t\t{\n\t\t\tname: \"entrypoint and cmd declared\",\n\t\t\tdockerfile: `\n\t\t\tFROM scratch\n\t\t\tCMD [\"mycmd\"]\n\t\t\tENTRYPOINT [\"myentrypoint\"]`,\n\t\t\toriginalEntrypoint: []string{\"myentrypoint\"},\n\t\t\toriginalCmd:        []string{\"mycmd\"},\n\t\t\texpectedCmd:        []string{\"mycmd\"},\n\t\t},\n\t\t{\n\t\t\tname: \"only entrypoint declared\",\n\t\t\tdockerfile: `\n\t\t\tFROM scratch\n\t\t\tENTRYPOINT [\"myentrypoint\"]`,\n\t\t\toriginalEntrypoint: []string{\"myentrypoint\"},\n\t\t\toriginalCmd:        []string{\"mycmd\"},\n\t\t\texpectedCmd:        nil,\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tconfig := &v1.Config{\n\t\t\t\tCmd:        test.originalCmd,\n\t\t\t\tEntrypoint: test.originalEntrypoint,\n\t\t\t}\n\t\t\treviewConfig(stage(t, test.dockerfile), config)\n\t\t\ttestutil.CheckErrorAndDeepEqual(t, false, nil, test.expectedCmd, config.Cmd)\n\t\t})\n\t}\n}\n\nfunc stage(t *testing.T, d string) config.KanikoStage {\n\tstages, _, err := dockerfile.Parse([]byte(d))\n\tif err != nil {\n\t\tt.Fatalf(\"error parsing dockerfile: %v\", err)\n\t}\n\treturn config.KanikoStage{\n\t\tStage: stages[0],\n\t}\n}\n\nfunc Test_stageBuilder_shouldTakeSnapshot(t *testing.T) {\n\tcmds := []commands.DockerCommand{\n\t\t&MockDockerCommand{command: \"command1\"},\n\t\t&MockDockerCommand{command: \"command2\"},\n\t\t&MockDockerCommand{command: \"command3\"},\n\t}\n\n\ttype fields struct {\n\t\tstage config.KanikoStage\n\t\topts  *config.KanikoOptions\n\t\tcmds  []commands.DockerCommand\n\t}\n\ttype args struct {\n\t\tindex        int\n\t\tmetadataOnly bool\n\t}\n\ttests := []struct {\n\t\tname   string\n\t\tfields fields\n\t\targs   args\n\t\twant   bool\n\t}{\n\t\t{\n\t\t\tname: \"final stage not last command\",\n\t\t\tfields: fields{\n\t\t\t\tstage: config.KanikoStage{\n\t\t\t\t\tFinal: true,\n\t\t\t\t},\n\t\t\t\tcmds: cmds,\n\t\t\t},\n\t\t\targs: args{\n\t\t\t\tindex: 1,\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"not final stage last command\",\n\t\t\tfields: fields{\n\t\t\t\tstage: config.KanikoStage{\n\t\t\t\t\tFinal: false,\n\t\t\t\t},\n\t\t\t\tcmds: cmds,\n\t\t\t},\n\t\t\targs: args{\n\t\t\t\tindex: len(cmds) - 1,\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"not final stage not last command\",\n\t\t\tfields: fields{\n\t\t\t\tstage: config.KanikoStage{\n\t\t\t\t\tFinal: false,\n\t\t\t\t},\n\t\t\t\tcmds: cmds,\n\t\t\t},\n\t\t\targs: args{\n\t\t\t\tindex: 0,\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"not final stage not last command but empty list of files\",\n\t\t\tfields: fields{\n\t\t\t\tstage: config.KanikoStage{},\n\t\t\t},\n\t\t\targs: args{\n\t\t\t\tindex:        0,\n\t\t\t\tmetadataOnly: true,\n\t\t\t},\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"not final stage not last command no files provided\",\n\t\t\tfields: fields{\n\t\t\t\tstage: config.KanikoStage{\n\t\t\t\t\tFinal: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\targs: args{\n\t\t\t\tindex:        0,\n\t\t\t\tmetadataOnly: false,\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"caching enabled intermediate container\",\n\t\t\tfields: fields{\n\t\t\t\tstage: config.KanikoStage{\n\t\t\t\t\tFinal: false,\n\t\t\t\t},\n\t\t\t\topts: &config.KanikoOptions{Cache: true},\n\t\t\t\tcmds: cmds,\n\t\t\t},\n\t\t\targs: args{\n\t\t\t\tindex: 0,\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\n\t\t\tif tt.fields.opts == nil {\n\t\t\t\ttt.fields.opts = &config.KanikoOptions{}\n\t\t\t}\n\t\t\ts := &stageBuilder{\n\t\t\t\tstage: tt.fields.stage,\n\t\t\t\topts:  tt.fields.opts,\n\t\t\t\tcmds:  tt.fields.cmds,\n\t\t\t}\n\t\t\tif got := s.shouldTakeSnapshot(tt.args.index, tt.args.metadataOnly); got != tt.want {\n\t\t\t\tt.Errorf(\"stageBuilder.shouldTakeSnapshot() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCalculateDependencies(t *testing.T) {\n\ttype args struct {\n\t\tdockerfile     string\n\t\tmockInitConfig func(partial.WithConfigFile, *config.KanikoOptions) (*v1.ConfigFile, error)\n\t}\n\ttests := []struct {\n\t\tname string\n\t\targs args\n\t\twant map[int][]string\n\t}{\n\t\t{\n\t\t\tname: \"no deps\",\n\t\t\targs: args{\n\t\t\t\tdockerfile: `\nFROM debian as stage1\nRUN foo\nFROM stage1\nRUN bar\n`,\n\t\t\t},\n\t\t\twant: map[int][]string{},\n\t\t},\n\t\t{\n\t\t\tname: \"args\",\n\t\t\targs: args{\n\t\t\t\tdockerfile: `\nARG myFile=foo\nFROM debian as stage1\nRUN foo\nFROM stage1\nARG myFile\nCOPY --from=stage1 /tmp/$myFile.txt .\nRUN bar\n`,\n\t\t\t},\n\t\t\twant: map[int][]string{\n\t\t\t\t0: {\"/tmp/foo.txt\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"simple deps\",\n\t\t\targs: args{\n\t\t\t\tdockerfile: `\nFROM debian as stage1\nFROM alpine\nCOPY --from=stage1 /foo /bar\n`,\n\t\t\t},\n\t\t\twant: map[int][]string{\n\t\t\t\t0: {\"/foo\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"two sets deps\",\n\t\t\targs: args{\n\t\t\t\tdockerfile: `\nFROM debian as stage1\nFROM ubuntu as stage2\nRUN foo\nCOPY --from=stage1 /foo /bar\nFROM alpine\nCOPY --from=stage2 /bar /bat\n`,\n\t\t\t},\n\t\t\twant: map[int][]string{\n\t\t\t\t0: {\"/foo\"},\n\t\t\t\t1: {\"/bar\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"double deps\",\n\t\t\targs: args{\n\t\t\t\tdockerfile: `\nFROM debian as stage1\nFROM ubuntu as stage2\nRUN foo\nCOPY --from=stage1 /foo /bar\nFROM alpine\nCOPY --from=stage1 /baz /bat\n`,\n\t\t\t},\n\t\t\twant: map[int][]string{\n\t\t\t\t0: {\"/foo\", \"/baz\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"envs in deps\",\n\t\t\targs: args{\n\t\t\t\tdockerfile: `\nFROM debian as stage1\nFROM ubuntu as stage2\nRUN foo\nENV key1 val1\nENV key2 val2\nCOPY --from=stage1 /foo/$key1 /foo/$key2 /bar\nFROM alpine\nCOPY --from=stage2 /bar /bat\n`,\n\t\t\t},\n\t\t\twant: map[int][]string{\n\t\t\t\t0: {\"/foo/val1\", \"/foo/val2\"},\n\t\t\t\t1: {\"/bar\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"envs from base image in deps\",\n\t\t\targs: args{\n\t\t\t\tdockerfile: `\nFROM debian as stage1\nENV key1 baseval1\nFROM stage1 as stage2\nRUN foo\nENV key2 val2\nCOPY --from=stage1 /foo/$key1 /foo/$key2 /bar\nFROM alpine\nCOPY --from=stage2 /bar /bat\n`,\n\t\t\t},\n\t\t\twant: map[int][]string{\n\t\t\t\t0: {\"/foo/baseval1\", \"/foo/val2\"},\n\t\t\t\t1: {\"/bar\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"one image has onbuild config\",\n\t\t\targs: args{\n\t\t\t\tmockInitConfig: func(img partial.WithConfigFile, opts *config.KanikoOptions) (*v1.ConfigFile, error) {\n\t\t\t\t\tcfg, err := img.ConfigFile()\n\t\t\t\t\t// if image is \"alpine\" then add ONBUILD to its config\n\t\t\t\t\tif cfg != nil && cfg.Architecture != \"\" {\n\t\t\t\t\t\tcfg.Config.OnBuild = []string{\"COPY --from=builder /app /app\"}\n\t\t\t\t\t}\n\t\t\t\t\treturn cfg, err\n\t\t\t\t},\n\t\t\t\tdockerfile: `\nFROM scratch as builder\nRUN foo\nFROM alpine as second\n# This image has an ONBUILD command so it will be executed\nCOPY --from=builder /foo /bar\nFROM scratch as target\nCOPY --from=second /bar /bat\n`,\n\t\t\t},\n\t\t\twant: map[int][]string{\n\t\t\t\t0: {\"/app\", \"/foo\"},\n\t\t\t\t1: {\"/bar\"},\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif tt.args.mockInitConfig != nil {\n\t\t\t\toriginal := initializeConfig\n\t\t\t\tdefer func() { initializeConfig = original }()\n\t\t\t\tinitializeConfig = tt.args.mockInitConfig\n\t\t\t}\n\n\t\t\tf, _ := os.CreateTemp(\"\", \"\")\n\t\t\tos.WriteFile(f.Name(), []byte(tt.args.dockerfile), 0755)\n\t\t\topts := &config.KanikoOptions{\n\t\t\t\tDockerfilePath: f.Name(),\n\t\t\t\tCustomPlatform: platforms.Format(platforms.Normalize(platforms.DefaultSpec())),\n\t\t\t}\n\t\t\ttestStages, metaArgs, err := dockerfile.ParseStages(opts)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Failed to parse test dockerfile to stages: %s\", err)\n\t\t\t}\n\n\t\t\tkanikoStages, err := dockerfile.MakeKanikoStages(opts, testStages, metaArgs)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Failed to parse stages to Kaniko Stages: %s\", err)\n\t\t\t}\n\t\t\tstageNameToIdx := ResolveCrossStageInstructions(kanikoStages)\n\n\t\t\tgot, err := CalculateDependencies(kanikoStages, opts, stageNameToIdx)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"got error: %s,\", err)\n\t\t\t}\n\n\t\t\tif !reflect.DeepEqual(got, tt.want) {\n\t\t\t\tdiff := cmp.Diff(got, tt.want)\n\t\t\t\tt.Errorf(\"CalculateDependencies() = %v, want %v, diff %v\", got, tt.want, diff)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_filesToSave(t *testing.T) {\n\ttests := []struct {\n\t\tname  string\n\t\targs  []string\n\t\twant  []string\n\t\tfiles []string\n\t}{\n\t\t{\n\t\t\tname:  \"simple\",\n\t\t\targs:  []string{\"foo\"},\n\t\t\tfiles: []string{\"foo\"},\n\t\t\twant:  []string{\"foo\"},\n\t\t},\n\t\t{\n\t\t\tname:  \"glob\",\n\t\t\targs:  []string{\"foo*\"},\n\t\t\tfiles: []string{\"foo\", \"foo2\", \"fooooo\", \"bar\"},\n\t\t\twant:  []string{\"foo\", \"foo2\", \"fooooo\"},\n\t\t},\n\t\t{\n\t\t\tname:  \"complex glob\",\n\t\t\targs:  []string{\"foo*\", \"bar?\"},\n\t\t\tfiles: []string{\"foo\", \"foo2\", \"fooooo\", \"bar\", \"bar1\", \"bar2\", \"bar33\"},\n\t\t\twant:  []string{\"foo\", \"foo2\", \"fooooo\", \"bar1\", \"bar2\"},\n\t\t},\n\t\t{\n\t\t\tname:  \"dir\",\n\t\t\targs:  []string{\"foo\"},\n\t\t\tfiles: []string{\"foo/bar\", \"foo/baz\", \"foo/bat/baz\"},\n\t\t\twant:  []string{\"foo\"},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttmpDir := t.TempDir()\n\t\t\toriginal := config.RootDir\n\t\t\tconfig.RootDir = tmpDir\n\t\t\tdefer func() {\n\t\t\t\tconfig.RootDir = original\n\t\t\t}()\n\n\t\t\tfor _, f := range tt.files {\n\t\t\t\tp := filepath.Join(tmpDir, f)\n\t\t\t\tdir := filepath.Dir(p)\n\t\t\t\tif dir != \".\" {\n\t\t\t\t\tif err := os.MkdirAll(dir, 0755); err != nil {\n\t\t\t\t\t\tt.Errorf(\"error making dir: %s\", err)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfp, err := os.Create(p)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Errorf(\"error making file: %s\", err)\n\t\t\t\t}\n\t\t\t\tfp.Close()\n\t\t\t}\n\n\t\t\tgot, err := filesToSave(tt.args)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"got err: %s\", err)\n\t\t\t}\n\t\t\tsort.Strings(tt.want)\n\t\t\tsort.Strings(got)\n\t\t\tif !reflect.DeepEqual(got, tt.want) {\n\t\t\t\tt.Errorf(\"filesToSave() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestDeduplicatePaths(t *testing.T) {\n\ttests := []struct {\n\t\tname  string\n\t\tinput []string\n\t\twant  []string\n\t}{\n\t\t{\n\t\t\tname:  \"no duplicates\",\n\t\t\tinput: []string{\"file1.txt\", \"file2.txt\", \"usr/lib\"},\n\t\t\twant:  []string{\"file1.txt\", \"file2.txt\", \"usr/lib\"},\n\t\t},\n\t\t{\n\t\t\tname:  \"duplicates\",\n\t\t\tinput: []string{\"file1.txt\", \"file2.txt\", \"file2.txt\", \"usr/lib\"},\n\t\t\twant:  []string{\"file1.txt\", \"file2.txt\", \"usr/lib\"},\n\t\t},\n\t\t{\n\t\t\tname:  \"duplicates with paths\",\n\t\t\tinput: []string{\"file1.txt\", \"file2.txt\", \"file2.txt\", \"usr/lib\", \"usr/lib/ssl\"},\n\t\t\twant:  []string{\"file1.txt\", \"file2.txt\", \"usr/lib\"},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgot := deduplicatePaths(tt.input)\n\t\t\tsort.Strings(tt.want)\n\t\t\tsort.Strings(got)\n\t\t\tif !reflect.DeepEqual(got, tt.want) {\n\t\t\t\tt.Errorf(\"TestDeduplicatePaths() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestInitializeConfig(t *testing.T) {\n\ttests := []struct {\n\t\tdescription string\n\t\tcfg         v1.ConfigFile\n\t\texpected    v1.Config\n\t}{\n\t\t{\n\t\t\tdescription: \"env is not set in the image\",\n\t\t\tcfg: v1.ConfigFile{\n\t\t\t\tConfig: v1.Config{\n\t\t\t\t\tImage: \"test\",\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: v1.Config{\n\t\t\t\tImage: \"test\",\n\t\t\t\tEnv: []string{\n\t\t\t\t\t\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"env is set in the image\",\n\t\t\tcfg: v1.ConfigFile{\n\t\t\t\tConfig: v1.Config{\n\t\t\t\t\tEnv: []string{\n\t\t\t\t\t\t\"PATH=/usr/local/something\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\texpected: v1.Config{\n\t\t\t\tEnv: []string{\n\t\t\t\t\t\"PATH=/usr/local/something\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdescription: \"image is empty\",\n\t\t\texpected: v1.Config{\n\t\t\t\tEnv: []string{\n\t\t\t\t\t\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\timg, err := mutate.ConfigFile(empty.Image, &tt.cfg)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"error seen when running test %s\", err)\n\t\t\tt.Fail()\n\t\t}\n\t\tactual, _ := initializeConfig(img, nil)\n\t\ttestutil.CheckDeepEqual(t, tt.expected, actual.Config)\n\t}\n}\n\nfunc Test_newLayerCache_defaultCache(t *testing.T) {\n\tt.Run(\"default layer cache is registry cache\", func(t *testing.T) {\n\t\tlayerCache := newLayerCache(&config.KanikoOptions{CacheRepo: \"some-cache-repo\"})\n\t\tfoundCache, ok := layerCache.(*cache.RegistryCache)\n\t\tif !ok {\n\t\t\tt.Error(\"expected layer cache to be a registry cache\")\n\t\t}\n\t\tif foundCache.Opts.CacheRepo != \"some-cache-repo\" {\n\t\t\tt.Errorf(\n\t\t\t\t\"expected cache repo to be 'some-cache-repo'; got %q\", foundCache.Opts.CacheRepo,\n\t\t\t)\n\t\t}\n\t})\n}\n\nfunc Test_newLayerCache_layoutCache(t *testing.T) {\n\tt.Run(\"when cache repo has 'oci:' prefix layer cache is layout cache\", func(t *testing.T) {\n\t\tlayerCache := newLayerCache(&config.KanikoOptions{CacheRepo: \"oci:/some-cache-repo\"})\n\t\tfoundCache, ok := layerCache.(*cache.LayoutCache)\n\t\tif !ok {\n\t\t\tt.Error(\"expected layer cache to be a layout cache\")\n\t\t}\n\t\tif foundCache.Opts.CacheRepo != \"oci:/some-cache-repo\" {\n\t\t\tt.Errorf(\n\t\t\t\t\"expected cache repo to be 'oci:/some-cache-repo'; got %q\", foundCache.Opts.CacheRepo,\n\t\t\t)\n\t\t}\n\t})\n}\n\nfunc Test_stageBuilder_optimize(t *testing.T) {\n\ttestCases := []struct {\n\t\topts     *config.KanikoOptions\n\t\tretrieve bool\n\t\tname     string\n\t}{\n\t\t{\n\t\t\tname: \"cache enabled and layer not present in cache\",\n\t\t\topts: &config.KanikoOptions{Cache: true},\n\t\t},\n\t\t{\n\t\t\tname:     \"cache enabled and layer present in cache\",\n\t\t\topts:     &config.KanikoOptions{Cache: true},\n\t\t\tretrieve: true,\n\t\t},\n\t\t{\n\t\t\tname: \"cache disabled and layer not present in cache\",\n\t\t\topts: &config.KanikoOptions{Cache: false},\n\t\t},\n\t\t{\n\t\t\tname:     \"cache disabled and layer present in cache\",\n\t\t\topts:     &config.KanikoOptions{Cache: false},\n\t\t\tretrieve: true,\n\t\t},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tcf := &v1.ConfigFile{}\n\t\t\tsnap := &fakeSnapShotter{}\n\t\t\tlc := &fakeLayerCache{retrieve: tc.retrieve}\n\t\t\tsb := &stageBuilder{opts: tc.opts, cf: cf, snapshotter: snap, layerCache: lc,\n\t\t\t\targs: dockerfile.NewBuildArgs([]string{})}\n\t\t\tck := CompositeCache{}\n\t\t\tfile, err := os.CreateTemp(\"\", \"foo\")\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t}\n\t\t\tcommand := MockDockerCommand{\n\t\t\t\tcontextFiles: []string{file.Name()},\n\t\t\t\tcacheCommand: MockCachedDockerCommand{},\n\t\t\t}\n\t\t\tsb.cmds = []commands.DockerCommand{command}\n\t\t\terr = sb.optimize(ck, cf.Config)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Expected error to be nil but was %v\", err)\n\t\t\t}\n\n\t\t})\n\t}\n}\n\ntype stageContext struct {\n\tcommand fmt.Stringer\n\targs    *dockerfile.BuildArgs\n\tenv     []string\n}\n\nfunc newStageContext(command string, args map[string]string, env []string) stageContext {\n\tdockerArgs := dockerfile.NewBuildArgs([]string{})\n\tfor k, v := range args {\n\t\tdockerArgs.AddArg(k, &v)\n\t}\n\treturn stageContext{MockDockerCommand{command: command}, dockerArgs, env}\n}\n\nfunc Test_stageBuilder_populateCompositeKey(t *testing.T) {\n\ttype testcase struct {\n\t\tdescription string\n\t\tcmd1        stageContext\n\t\tcmd2        stageContext\n\t\tshdEqual    bool\n\t}\n\ttestCases := []testcase{\n\t\t{\n\t\t\tdescription: \"cache key for same command [RUN] with same build args\",\n\t\t\tcmd1: newStageContext(\n\t\t\t\t\"RUN echo $ARG > test\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{},\n\t\t\t),\n\t\t\tcmd2: newStageContext(\n\t\t\t\t\"RUN echo $ARG > test\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{},\n\t\t\t),\n\t\t\tshdEqual: true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"cache key for same command [RUN] with same env and args\",\n\t\t\tcmd1: newStageContext(\n\t\t\t\t\"RUN echo $ENV > test\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{\"ENV=same\"},\n\t\t\t),\n\t\t\tcmd2: newStageContext(\n\t\t\t\t\"RUN echo $ENV > test\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{\"ENV=same\"},\n\t\t\t),\n\t\t\tshdEqual: true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"cache key for same command [RUN] with same env but different args\",\n\t\t\tcmd1: newStageContext(\n\t\t\t\t\"RUN echo $ENV > test\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{\"ENV=same\"},\n\t\t\t),\n\t\t\tcmd2: newStageContext(\n\t\t\t\t\"RUN echo $ENV > test\",\n\t\t\t\tmap[string]string{\"ARG\": \"bar\"},\n\t\t\t\t[]string{\"ENV=same\"},\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tdescription: \"cache key for same command [RUN], different buildargs, args not used in command\",\n\t\t\tcmd1: newStageContext(\n\t\t\t\t\"RUN echo const > test\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{\"ENV=foo1\"},\n\t\t\t),\n\t\t\tcmd2: newStageContext(\n\t\t\t\t\"RUN echo const > test\",\n\t\t\t\tmap[string]string{\"ARG\": \"bar\"},\n\t\t\t\t[]string{\"ENV=bar1\"},\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tdescription: \"cache key for same command [RUN], different buildargs, args used in script\",\n\t\t\t// test.sh\n\t\t\t// #!/bin/sh\n\t\t\t// echo ${ARG}\n\t\t\tcmd1: newStageContext(\n\t\t\t\t\"RUN ./test.sh\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{\"ENV=foo1\"},\n\t\t\t),\n\t\t\tcmd2: newStageContext(\n\t\t\t\t\"RUN ./test.sh\",\n\t\t\t\tmap[string]string{\"ARG\": \"bar\"},\n\t\t\t\t[]string{\"ENV=bar1\"},\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tdescription: \"cache key for same command [RUN] with a build arg values\",\n\t\t\tcmd1: newStageContext(\n\t\t\t\t\"RUN echo $ARG > test\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{},\n\t\t\t),\n\t\t\tcmd2: newStageContext(\n\t\t\t\t\"RUN echo $ARG > test\",\n\t\t\t\tmap[string]string{\"ARG\": \"bar\"},\n\t\t\t\t[]string{},\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tdescription: \"cache key for same command [RUN] with different env values\",\n\t\t\tcmd1: newStageContext(\n\t\t\t\t\"RUN echo $ENV > test\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{\"ENV=1\"},\n\t\t\t),\n\t\t\tcmd2: newStageContext(\n\t\t\t\t\"RUN echo $ENV > test\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{\"ENV=2\"},\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tdescription: \"cache key for different command [RUN] same context\",\n\t\t\tcmd1: newStageContext(\n\t\t\t\t\"RUN echo other > test\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{\"ENV=1\"},\n\t\t\t),\n\t\t\tcmd2: newStageContext(\n\t\t\t\t\"RUN echo another > test\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{\"ENV=1\"},\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tdescription: \"cache key for command [RUN] with same env values [check that variable no interpolate in RUN command]\",\n\t\t\tcmd1: newStageContext(\n\t\t\t\t\"RUN echo $ENV > test\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{\"ENV=1\"},\n\t\t\t),\n\t\t\tcmd2: newStageContext(\n\t\t\t\t\"RUN echo 1 > test\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{\"ENV=1\"},\n\t\t\t),\n\t\t\tshdEqual: false,\n\t\t},\n\t\t{\n\t\t\tdescription: \"cache key for command [RUN] with different env values [check that variable no interpolate in RUN command]\",\n\t\t\tcmd1: newStageContext(\n\t\t\t\t\"RUN echo ${APP_VERSION%.*} ${APP_VERSION%-*} > test\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{\"ENV=1\"},\n\t\t\t),\n\t\t\tcmd2: newStageContext(\n\t\t\t\t\"RUN echo ${APP_VERSION%.*} ${APP_VERSION%-*} > test\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{\"ENV=2\"},\n\t\t\t),\n\t\t\tshdEqual: false,\n\t\t},\n\t\tfunc() testcase {\n\t\t\tdir, files := tempDirAndFile(t)\n\t\t\tfile := files[0]\n\t\t\tfilePath := filepath.Join(dir, file)\n\t\t\treturn testcase{\n\t\t\t\tdescription: \"cache key for same command [COPY] with same args\",\n\t\t\t\tcmd1: newStageContext(\n\t\t\t\t\tfmt.Sprintf(\"COPY %s /meow\", filePath),\n\t\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t\t[]string{\"ENV=1\"},\n\t\t\t\t),\n\t\t\t\tcmd2: newStageContext(\n\t\t\t\t\tfmt.Sprintf(\"COPY %s /meow\", filePath),\n\t\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t\t[]string{\"ENV=1\"},\n\t\t\t\t),\n\t\t\t\tshdEqual: true,\n\t\t\t}\n\t\t}(),\n\t\tfunc() testcase {\n\t\t\tdir, files := tempDirAndFile(t)\n\t\t\tfile := files[0]\n\t\t\tfilePath := filepath.Join(dir, file)\n\t\t\treturn testcase{\n\t\t\t\tdescription: \"cache key for same command [COPY] with different args\",\n\t\t\t\tcmd1: newStageContext(\n\t\t\t\t\tfmt.Sprintf(\"COPY %s /meow\", filePath),\n\t\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t\t[]string{\"ENV=1\"},\n\t\t\t\t),\n\t\t\t\tcmd2: newStageContext(\n\t\t\t\t\tfmt.Sprintf(\"COPY %s /meow\", filePath),\n\t\t\t\t\tmap[string]string{\"ARG\": \"bar\"},\n\t\t\t\t\t[]string{\"ENV=2\"},\n\t\t\t\t),\n\t\t\t\tshdEqual: true,\n\t\t\t}\n\t\t}(),\n\t\t{\n\t\t\tdescription: \"cache key for same command [WORKDIR] with same args\",\n\t\t\tcmd1: newStageContext(\n\t\t\t\t\"WORKDIR /\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{\"ENV=1\"},\n\t\t\t),\n\t\t\tcmd2: newStageContext(\n\t\t\t\t\"WORKDIR /\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{\"ENV=1\"},\n\t\t\t),\n\t\t\tshdEqual: true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"cache key for same command [WORKDIR] with different args\",\n\t\t\tcmd1: newStageContext(\n\t\t\t\t\"WORKDIR /\",\n\t\t\t\tmap[string]string{\"ARG\": \"foo\"},\n\t\t\t\t[]string{\"ENV=1\"},\n\t\t\t),\n\t\t\tcmd2: newStageContext(\n\t\t\t\t\"WORKDIR /\",\n\t\t\t\tmap[string]string{\"ARG\": \"bar\"},\n\t\t\t\t[]string{\"ENV=2\"},\n\t\t\t),\n\t\t\tshdEqual: true,\n\t\t},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tsb := &stageBuilder{fileContext: util.FileContext{Root: \"workspace\"}}\n\t\t\tck := CompositeCache{}\n\n\t\t\tinstructions1, err := dockerfile.ParseCommands([]string{tc.cmd1.command.String()})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tfc1 := util.FileContext{Root: \"workspace\"}\n\t\t\tdockerCommand1, err := commands.GetCommand(instructions1[0], fc1, false, true, true)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tinstructions, err := dockerfile.ParseCommands([]string{tc.cmd2.command.String()})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tfc2 := util.FileContext{Root: \"workspace\"}\n\t\t\tdockerCommand2, err := commands.GetCommand(instructions[0], fc2, false, true, true)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tck1, err := sb.populateCompositeKey(dockerCommand1, []string{}, ck, tc.cmd1.args, tc.cmd1.env)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Expected error to be nil but was %v\", err)\n\t\t\t}\n\t\t\tck2, err := sb.populateCompositeKey(dockerCommand2, []string{}, ck, tc.cmd2.args, tc.cmd2.env)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Expected error to be nil but was %v\", err)\n\t\t\t}\n\t\t\tkey1, key2 := hashCompositeKeys(t, ck1, ck2)\n\t\t\tif b := key1 == key2; b != tc.shdEqual {\n\t\t\t\tt.Errorf(\"expected keys to be equal as %t but found %t\", tc.shdEqual, !tc.shdEqual)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_stageBuilder_build(t *testing.T) {\n\ttype testcase struct {\n\t\tdescription        string\n\t\topts               *config.KanikoOptions\n\t\targs               map[string]string\n\t\tlayerCache         *fakeLayerCache\n\t\texpectedCacheKeys  []string\n\t\tpushedCacheKeys    []string\n\t\tcommands           []commands.DockerCommand\n\t\tfileName           string\n\t\trootDir            string\n\t\timage              v1.Image\n\t\tconfig             *v1.ConfigFile\n\t\tstage              config.KanikoStage\n\t\tcrossStageDeps     map[int][]string\n\t\tmockGetFSFromImage func(root string, img v1.Image, extract util.ExtractFunction) ([]string, error)\n\t\tshouldInitSnapshot bool\n\t}\n\n\ttestCases := []testcase{\n\t\tfunc() testcase {\n\t\t\tdir, files := tempDirAndFile(t)\n\t\t\tfile := files[0]\n\t\t\tfilePath := filepath.Join(dir, file)\n\t\t\tch := NewCompositeCache(\"\", \"meow\")\n\n\t\t\tch.AddPath(filePath, util.FileContext{})\n\t\t\thash, err := ch.Hash()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"couldn't create hash %v\", err)\n\t\t\t}\n\t\t\tcommand := MockDockerCommand{\n\t\t\t\tcommand:      \"meow\",\n\t\t\t\tcontextFiles: []string{filePath},\n\t\t\t\tcacheCommand: MockCachedDockerCommand{\n\t\t\t\t\tcontextFiles: []string{filePath},\n\t\t\t\t},\n\t\t\t}\n\n\t\t\tdestDir := t.TempDir()\n\t\t\treturn testcase{\n\t\t\t\tdescription:       \"fake command cache enabled but key not in cache\",\n\t\t\t\tconfig:            &v1.ConfigFile{Config: v1.Config{WorkingDir: destDir}},\n\t\t\t\topts:              &config.KanikoOptions{Cache: true},\n\t\t\t\texpectedCacheKeys: []string{hash},\n\t\t\t\tpushedCacheKeys:   []string{hash},\n\t\t\t\tcommands:          []commands.DockerCommand{command},\n\t\t\t\trootDir:           dir,\n\t\t\t}\n\t\t}(),\n\t\tfunc() testcase {\n\t\t\tdir, files := tempDirAndFile(t)\n\t\t\tfile := files[0]\n\t\t\tfilePath := filepath.Join(dir, file)\n\t\t\tch := NewCompositeCache(\"\", \"meow\")\n\n\t\t\tch.AddPath(filePath, util.FileContext{})\n\t\t\thash, err := ch.Hash()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"couldn't create hash %v\", err)\n\t\t\t}\n\t\t\tcommand := MockDockerCommand{\n\t\t\t\tcommand:      \"meow\",\n\t\t\t\tcontextFiles: []string{filePath},\n\t\t\t\tcacheCommand: MockCachedDockerCommand{\n\t\t\t\t\tcontextFiles: []string{filePath},\n\t\t\t\t},\n\t\t\t}\n\n\t\t\tdestDir := t.TempDir()\n\t\t\treturn testcase{\n\t\t\t\tdescription: \"fake command cache enabled and key in cache\",\n\t\t\t\topts:        &config.KanikoOptions{Cache: true},\n\t\t\t\tconfig:      &v1.ConfigFile{Config: v1.Config{WorkingDir: destDir}},\n\t\t\t\tlayerCache: &fakeLayerCache{\n\t\t\t\t\tretrieve: true,\n\t\t\t\t},\n\t\t\t\texpectedCacheKeys: []string{hash},\n\t\t\t\tpushedCacheKeys:   []string{},\n\t\t\t\tcommands:          []commands.DockerCommand{command},\n\t\t\t\trootDir:           dir,\n\t\t\t}\n\t\t}(),\n\t\tfunc() testcase {\n\t\t\tdir, files := tempDirAndFile(t)\n\t\t\tfile := files[0]\n\t\t\tfilePath := filepath.Join(dir, file)\n\t\t\tch := NewCompositeCache(\"\", \"meow\")\n\n\t\t\tch.AddPath(filePath, util.FileContext{})\n\t\t\thash, err := ch.Hash()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"couldn't create hash %v\", err)\n\t\t\t}\n\t\t\tcommand := MockDockerCommand{\n\t\t\t\tcommand:      \"meow\",\n\t\t\t\tcontextFiles: []string{filePath},\n\t\t\t\tcacheCommand: MockCachedDockerCommand{\n\t\t\t\t\tcontextFiles: []string{filePath},\n\t\t\t\t},\n\t\t\t}\n\n\t\t\tdestDir := t.TempDir()\n\t\t\treturn testcase{\n\t\t\t\tdescription: \"fake command cache enabled with tar compression disabled and key in cache\",\n\t\t\t\topts:        &config.KanikoOptions{Cache: true, CompressedCaching: false},\n\t\t\t\tconfig:      &v1.ConfigFile{Config: v1.Config{WorkingDir: destDir}},\n\t\t\t\tlayerCache: &fakeLayerCache{\n\t\t\t\t\tretrieve: true,\n\t\t\t\t},\n\t\t\t\texpectedCacheKeys: []string{hash},\n\t\t\t\tpushedCacheKeys:   []string{},\n\t\t\t\tcommands:          []commands.DockerCommand{command},\n\t\t\t\trootDir:           dir,\n\t\t\t}\n\t\t}(),\n\t\t{\n\t\t\tdescription: \"use new run\",\n\t\t\topts:        &config.KanikoOptions{RunV2: true},\n\t\t},\n\t\t{\n\t\t\tdescription:        \"single snapshot\",\n\t\t\topts:               &config.KanikoOptions{SingleSnapshot: true},\n\t\t\tshouldInitSnapshot: true,\n\t\t},\n\t\t{\n\t\t\tdescription: \"fake command cache disabled and key not in cache\",\n\t\t\topts:        &config.KanikoOptions{Cache: false},\n\t\t},\n\t\t{\n\t\t\tdescription: \"fake command cache disabled and key in cache\",\n\t\t\topts:        &config.KanikoOptions{Cache: false},\n\t\t\tlayerCache: &fakeLayerCache{\n\t\t\t\tretrieve: true,\n\t\t\t},\n\t\t},\n\t\tfunc() testcase {\n\t\t\tdir, filenames := tempDirAndFile(t)\n\t\t\tfilename := filenames[0]\n\t\t\tfilepath := filepath.Join(dir, filename)\n\n\t\t\ttarContent := generateTar(t, dir, filename)\n\n\t\t\tch := NewCompositeCache(\"\", fmt.Sprintf(\"COPY %s foo.txt\", filename))\n\t\t\tch.AddPath(filepath, util.FileContext{})\n\n\t\t\thash, err := ch.Hash()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"couldn't create hash %v\", err)\n\t\t\t}\n\t\t\tcopyCommandCacheKey := hash\n\t\t\tdockerFile := fmt.Sprintf(`\n\t\tFROM ubuntu:16.04\n\t\tCOPY %s foo.txt\n\t\t`, filename)\n\t\t\tf, _ := os.CreateTemp(\"\", \"\")\n\t\t\tos.WriteFile(f.Name(), []byte(dockerFile), 0755)\n\t\t\topts := &config.KanikoOptions{\n\t\t\t\tDockerfilePath:  f.Name(),\n\t\t\t\tCache:           true,\n\t\t\t\tCacheCopyLayers: true,\n\t\t\t}\n\t\t\ttestStages, metaArgs, err := dockerfile.ParseStages(opts)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Failed to parse test dockerfile to stages: %s\", err)\n\t\t\t}\n\n\t\t\tkanikoStages, err := dockerfile.MakeKanikoStages(opts, testStages, metaArgs)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Failed to parse stages to Kaniko Stages: %s\", err)\n\t\t\t}\n\t\t\t_ = ResolveCrossStageInstructions(kanikoStages)\n\t\t\tstage := kanikoStages[0]\n\n\t\t\tcmds := stage.Commands\n\n\t\t\treturn testcase{\n\t\t\t\tdescription: \"copy command cache enabled and key in cache\",\n\t\t\t\topts:        opts,\n\t\t\t\timage: fakeImage{\n\t\t\t\t\tImageLayers: []v1.Layer{\n\t\t\t\t\t\tfakeLayer{\n\t\t\t\t\t\t\tTarContent: tarContent,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tlayerCache: &fakeLayerCache{\n\t\t\t\t\tretrieve: true,\n\t\t\t\t\timg: fakeImage{\n\t\t\t\t\t\tImageLayers: []v1.Layer{\n\t\t\t\t\t\t\tfakeLayer{\n\t\t\t\t\t\t\t\tTarContent: tarContent,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trootDir:           dir,\n\t\t\t\texpectedCacheKeys: []string{copyCommandCacheKey},\n\t\t\t\t// CachingCopyCommand is not pushed to the cache\n\t\t\t\tpushedCacheKeys: []string{},\n\t\t\t\tcommands:        getCommands(util.FileContext{Root: dir}, cmds, true, false),\n\t\t\t\tfileName:        filename,\n\t\t\t}\n\t\t}(),\n\t\tfunc() testcase {\n\t\t\tdir, filenames := tempDirAndFile(t)\n\t\t\tfilename := filenames[0]\n\t\t\ttarContent := []byte{}\n\t\t\tdestDir := t.TempDir()\n\t\t\tfilePath := filepath.Join(dir, filename)\n\t\t\tch := NewCompositeCache(\"\", fmt.Sprintf(\"COPY %s foo.txt\", filename))\n\t\t\tch.AddPath(filePath, util.FileContext{})\n\n\t\t\thash, err := ch.Hash()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"couldn't create hash %v\", err)\n\t\t\t}\n\t\t\tdockerFile := fmt.Sprintf(`\nFROM ubuntu:16.04\nCOPY %s foo.txt\n`, filename)\n\t\t\tf, _ := os.CreateTemp(\"\", \"\")\n\t\t\tos.WriteFile(f.Name(), []byte(dockerFile), 0755)\n\t\t\topts := &config.KanikoOptions{\n\t\t\t\tDockerfilePath:  f.Name(),\n\t\t\t\tCache:           true,\n\t\t\t\tCacheCopyLayers: true,\n\t\t\t}\n\n\t\t\ttestStages, metaArgs, err := dockerfile.ParseStages(opts)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Failed to parse test dockerfile to stages: %s\", err)\n\t\t\t}\n\n\t\t\tkanikoStages, err := dockerfile.MakeKanikoStages(opts, testStages, metaArgs)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Failed to parse stages to Kaniko Stages: %s\", err)\n\t\t\t}\n\t\t\t_ = ResolveCrossStageInstructions(kanikoStages)\n\t\t\tstage := kanikoStages[0]\n\n\t\t\tcmds := stage.Commands\n\t\t\treturn testcase{\n\t\t\t\tdescription: \"copy command cache enabled and key is not in cache\",\n\t\t\t\topts:        opts,\n\t\t\t\tconfig:      &v1.ConfigFile{Config: v1.Config{WorkingDir: destDir}},\n\t\t\t\tlayerCache:  &fakeLayerCache{},\n\t\t\t\timage: fakeImage{\n\t\t\t\t\tImageLayers: []v1.Layer{\n\t\t\t\t\t\tfakeLayer{\n\t\t\t\t\t\t\tTarContent: tarContent,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trootDir:           dir,\n\t\t\t\texpectedCacheKeys: []string{hash},\n\t\t\t\tpushedCacheKeys:   []string{hash},\n\t\t\t\tcommands:          getCommands(util.FileContext{Root: dir}, cmds, true, false),\n\t\t\t\tfileName:          filename,\n\t\t\t}\n\t\t}(),\n\t\tfunc() testcase {\n\t\t\tdir, filenames := tempDirAndFile(t)\n\t\t\tfilename := filenames[0]\n\t\t\ttarContent := generateTar(t, filename)\n\n\t\t\tdestDir := t.TempDir()\n\t\t\tfilePath := filepath.Join(dir, filename)\n\n\t\t\tch := NewCompositeCache(\"\", \"RUN foobar\")\n\n\t\t\thash1, err := ch.Hash()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"couldn't create hash %v\", err)\n\t\t\t}\n\n\t\t\tch.AddKey(fmt.Sprintf(\"COPY %s bar.txt\", filename))\n\t\t\tch.AddPath(filePath, util.FileContext{})\n\n\t\t\thash2, err := ch.Hash()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"couldn't create hash %v\", err)\n\t\t\t}\n\t\t\tch = NewCompositeCache(\"\", fmt.Sprintf(\"COPY %s foo.txt\", filename))\n\t\t\tch.AddKey(fmt.Sprintf(\"COPY %s bar.txt\", filename))\n\t\t\tch.AddPath(filePath, util.FileContext{})\n\n\t\t\timage := fakeImage{\n\t\t\t\tImageLayers: []v1.Layer{\n\t\t\t\t\tfakeLayer{\n\t\t\t\t\t\tTarContent: tarContent,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\n\t\t\tdockerFile := fmt.Sprintf(`\nFROM ubuntu:16.04\nRUN foobar\nCOPY %s bar.txt\n`, filename)\n\t\t\tf, _ := os.CreateTemp(\"\", \"\")\n\t\t\tos.WriteFile(f.Name(), []byte(dockerFile), 0755)\n\t\t\topts := &config.KanikoOptions{\n\t\t\t\tDockerfilePath: f.Name(),\n\t\t\t}\n\n\t\t\ttestStages, metaArgs, err := dockerfile.ParseStages(opts)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Failed to parse test dockerfile to stages: %s\", err)\n\t\t\t}\n\n\t\t\tkanikoStages, err := dockerfile.MakeKanikoStages(opts, testStages, metaArgs)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Failed to parse stages to Kaniko Stages: %s\", err)\n\t\t\t}\n\t\t\t_ = ResolveCrossStageInstructions(kanikoStages)\n\t\t\tstage := kanikoStages[0]\n\n\t\t\tcmds := stage.Commands\n\t\t\treturn testcase{\n\t\t\t\tdescription: \"cached run command followed by uncached copy command results in consistent read and write hashes\",\n\t\t\t\topts:        &config.KanikoOptions{Cache: true, CacheCopyLayers: true, CacheRunLayers: true},\n\t\t\t\trootDir:     dir,\n\t\t\t\tconfig:      &v1.ConfigFile{Config: v1.Config{WorkingDir: destDir}},\n\t\t\t\tlayerCache: &fakeLayerCache{\n\t\t\t\t\tkeySequence: []string{hash1},\n\t\t\t\t\timg:         image,\n\t\t\t\t},\n\t\t\t\timage: image,\n\t\t\t\t// hash1 is the read cachekey for the first layer\n\t\t\t\texpectedCacheKeys: []string{hash1, hash2},\n\t\t\t\tpushedCacheKeys:   []string{hash2},\n\t\t\t\tcommands:          getCommands(util.FileContext{Root: dir}, cmds, true, true),\n\t\t\t}\n\t\t}(),\n\t\tfunc() testcase {\n\t\t\tdir, filenames := tempDirAndFile(t)\n\t\t\tfilename := filenames[0]\n\t\t\ttarContent := generateTar(t, filename)\n\n\t\t\tdestDir := t.TempDir()\n\n\t\t\tfilePath := filepath.Join(dir, filename)\n\n\t\t\tch := NewCompositeCache(\"\", fmt.Sprintf(\"COPY %s bar.txt\", filename))\n\t\t\tch.AddPath(filePath, util.FileContext{})\n\n\t\t\t// copy hash\n\t\t\t_, err := ch.Hash()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"couldn't create hash %v\", err)\n\t\t\t}\n\n\t\t\tch.AddKey(\"RUN foobar\")\n\n\t\t\t// run hash\n\t\t\trunHash, err := ch.Hash()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"couldn't create hash %v\", err)\n\t\t\t}\n\n\t\t\timage := fakeImage{\n\t\t\t\tImageLayers: []v1.Layer{\n\t\t\t\t\tfakeLayer{\n\t\t\t\t\t\tTarContent: tarContent,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\n\t\t\tdockerFile := fmt.Sprintf(`\nFROM ubuntu:16.04\nCOPY %s bar.txt\nRUN foobar\n`, filename)\n\t\t\tf, _ := os.CreateTemp(\"\", \"\")\n\t\t\tos.WriteFile(f.Name(), []byte(dockerFile), 0755)\n\t\t\topts := &config.KanikoOptions{\n\t\t\t\tDockerfilePath: f.Name(),\n\t\t\t}\n\n\t\t\ttestStages, metaArgs, err := dockerfile.ParseStages(opts)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Failed to parse test dockerfile to stages: %s\", err)\n\t\t\t}\n\n\t\t\tkanikoStages, err := dockerfile.MakeKanikoStages(opts, testStages, metaArgs)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Failed to parse stages to Kaniko Stages: %s\", err)\n\t\t\t}\n\t\t\t_ = ResolveCrossStageInstructions(kanikoStages)\n\t\t\tstage := kanikoStages[0]\n\n\t\t\tcmds := stage.Commands\n\t\t\treturn testcase{\n\t\t\t\tdescription: \"copy command followed by cached run command results in consistent read and write hashes\",\n\t\t\t\topts:        &config.KanikoOptions{Cache: true, CacheRunLayers: true},\n\t\t\t\trootDir:     dir,\n\t\t\t\tconfig:      &v1.ConfigFile{Config: v1.Config{WorkingDir: destDir}},\n\t\t\t\tlayerCache: &fakeLayerCache{\n\t\t\t\t\tkeySequence: []string{runHash},\n\t\t\t\t\timg:         image,\n\t\t\t\t},\n\t\t\t\timage:             image,\n\t\t\t\texpectedCacheKeys: []string{runHash},\n\t\t\t\tpushedCacheKeys:   []string{},\n\t\t\t\tcommands:          getCommands(util.FileContext{Root: dir}, cmds, false, true),\n\t\t\t}\n\t\t}(),\n\t\tfunc() testcase {\n\t\t\tdir, _ := tempDirAndFile(t)\n\t\t\tch := NewCompositeCache(\"\")\n\t\t\tch.AddKey(\"|1\")\n\t\t\tch.AddKey(\"test=value\")\n\t\t\tch.AddKey(\"RUN foobar\")\n\t\t\thash, err := ch.Hash()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"couldn't create hash %v\", err)\n\t\t\t}\n\n\t\t\tcommand := MockDockerCommand{\n\t\t\t\tcommand:      \"RUN foobar\",\n\t\t\t\tcontextFiles: []string{},\n\t\t\t\tcacheCommand: MockCachedDockerCommand{\n\t\t\t\t\tcontextFiles: []string{},\n\t\t\t\t},\n\t\t\t\targToCompositeCache: true,\n\t\t\t}\n\n\t\t\treturn testcase{\n\t\t\t\tdescription: \"cached run command with no build arg value used uses cached layer and does not push anything\",\n\t\t\t\tconfig:      &v1.ConfigFile{Config: v1.Config{WorkingDir: dir}},\n\t\t\t\topts:        &config.KanikoOptions{Cache: true},\n\t\t\t\targs: map[string]string{\n\t\t\t\t\t\"test\": \"value\",\n\t\t\t\t},\n\t\t\t\texpectedCacheKeys: []string{hash},\n\t\t\t\tcommands:          []commands.DockerCommand{command},\n\t\t\t\t// layer key needs to be read.\n\t\t\t\tlayerCache: &fakeLayerCache{\n\t\t\t\t\timg:         &fakeImage{ImageLayers: []v1.Layer{fakeLayer{}}},\n\t\t\t\t\tkeySequence: []string{hash},\n\t\t\t\t},\n\t\t\t\trootDir: dir,\n\t\t\t}\n\t\t}(),\n\t\tfunc() testcase {\n\t\t\tdir, _ := tempDirAndFile(t)\n\n\t\t\tch := NewCompositeCache(\"\")\n\t\t\tch.AddKey(\"|1\")\n\t\t\tch.AddKey(\"arg=value\")\n\t\t\tch.AddKey(\"RUN $arg\")\n\t\t\thash, err := ch.Hash()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"couldn't create hash %v\", err)\n\t\t\t}\n\n\t\t\tcommand := MockDockerCommand{\n\t\t\t\tcommand:      \"RUN $arg\",\n\t\t\t\tcontextFiles: []string{},\n\t\t\t\tcacheCommand: MockCachedDockerCommand{\n\t\t\t\t\tcontextFiles: []string{},\n\t\t\t\t},\n\t\t\t\targToCompositeCache: true,\n\t\t\t}\n\n\t\t\treturn testcase{\n\t\t\t\tdescription: \"cached run command with same build arg does not push layer\",\n\t\t\t\tconfig:      &v1.ConfigFile{Config: v1.Config{WorkingDir: dir}},\n\t\t\t\topts:        &config.KanikoOptions{Cache: true},\n\t\t\t\targs: map[string]string{\n\t\t\t\t\t\"arg\": \"value\",\n\t\t\t\t},\n\t\t\t\t// layer key that exists\n\t\t\t\tlayerCache: &fakeLayerCache{\n\t\t\t\t\timg:         &fakeImage{ImageLayers: []v1.Layer{fakeLayer{}}},\n\t\t\t\t\tkeySequence: []string{hash},\n\t\t\t\t},\n\t\t\t\texpectedCacheKeys: []string{hash},\n\t\t\t\tcommands:          []commands.DockerCommand{command},\n\t\t\t\trootDir:           dir,\n\t\t\t}\n\t\t}(),\n\t\tfunc() testcase {\n\t\t\tdir, _ := tempDirAndFile(t)\n\n\t\t\tch1 := NewCompositeCache(\"\")\n\t\t\tch1.AddKey(\"RUN value\")\n\t\t\thash1, err := ch1.Hash()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"couldn't create hash %v\", err)\n\t\t\t}\n\n\t\t\tch2 := NewCompositeCache(\"\")\n\t\t\tch2.AddKey(\"|1\")\n\t\t\tch2.AddKey(\"arg=anotherValue\")\n\t\t\tch2.AddKey(\"RUN $arg\")\n\t\t\thash2, err := ch2.Hash()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"couldn't create hash %v\", err)\n\t\t\t}\n\t\t\tcommand := MockDockerCommand{\n\t\t\t\tcommand:      \"RUN $arg\",\n\t\t\t\tcontextFiles: []string{},\n\t\t\t\tcacheCommand: MockCachedDockerCommand{\n\t\t\t\t\tcontextFiles: []string{},\n\t\t\t\t},\n\t\t\t\targToCompositeCache: true,\n\t\t\t}\n\n\t\t\treturn testcase{\n\t\t\t\tdescription: \"cached run command with another build arg pushes layer\",\n\t\t\t\tconfig:      &v1.ConfigFile{Config: v1.Config{WorkingDir: dir}},\n\t\t\t\topts:        &config.KanikoOptions{Cache: true},\n\t\t\t\targs: map[string]string{\n\t\t\t\t\t\"arg\": \"anotherValue\",\n\t\t\t\t},\n\t\t\t\t// layer for arg=value already exists\n\t\t\t\tlayerCache: &fakeLayerCache{\n\t\t\t\t\timg:         &fakeImage{ImageLayers: []v1.Layer{fakeLayer{}}},\n\t\t\t\t\tkeySequence: []string{hash1},\n\t\t\t\t},\n\t\t\t\texpectedCacheKeys: []string{hash2},\n\t\t\t\tpushedCacheKeys:   []string{hash2},\n\t\t\t\tcommands:          []commands.DockerCommand{command},\n\t\t\t\trootDir:           dir,\n\t\t\t}\n\t\t}(),\n\t\t{\n\t\t\tdescription:    \"fs unpacked\",\n\t\t\topts:           &config.KanikoOptions{InitialFSUnpacked: true},\n\t\t\tstage:          config.KanikoStage{Index: 0},\n\t\t\tcrossStageDeps: map[int][]string{0: {\"some-dep\"}},\n\t\t\tmockGetFSFromImage: func(root string, img v1.Image, extract util.ExtractFunction) ([]string, error) {\n\t\t\t\treturn nil, fmt.Errorf(\"getFSFromImage shouldn't be called if fs is already unpacked\")\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tvar fileName string\n\t\t\tif tc.commands == nil {\n\t\t\t\tfile, err := os.CreateTemp(\"\", \"foo\")\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Error(err)\n\t\t\t\t}\n\t\t\t\tcommand := MockDockerCommand{\n\t\t\t\t\tcontextFiles: []string{file.Name()},\n\t\t\t\t\tcacheCommand: MockCachedDockerCommand{\n\t\t\t\t\t\tcontextFiles: []string{file.Name()},\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\ttc.commands = []commands.DockerCommand{command}\n\t\t\t\tfileName = file.Name()\n\t\t\t} else {\n\t\t\t\tfileName = tc.fileName\n\t\t\t}\n\n\t\t\tcf := tc.config\n\t\t\tif cf == nil {\n\t\t\t\tcf = &v1.ConfigFile{\n\t\t\t\t\tConfig: v1.Config{\n\t\t\t\t\t\tEnv: make([]string, 0),\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsnap := &fakeSnapShotter{file: fileName}\n\t\t\tlc := tc.layerCache\n\t\t\tif lc == nil {\n\t\t\t\tlc = &fakeLayerCache{}\n\t\t\t}\n\t\t\tkeys := []string{}\n\t\t\tsb := &stageBuilder{\n\t\t\t\targs:        dockerfile.NewBuildArgs([]string{}), //required or code will panic\n\t\t\t\timage:       tc.image,\n\t\t\t\topts:        tc.opts,\n\t\t\t\tcf:          cf,\n\t\t\t\tsnapshotter: snap,\n\t\t\t\tlayerCache:  lc,\n\t\t\t\tpushLayerToCache: func(_ *config.KanikoOptions, cacheKey, _, _ string) error {\n\t\t\t\t\tkeys = append(keys, cacheKey)\n\t\t\t\t\treturn nil\n\t\t\t\t},\n\t\t\t}\n\t\t\tsb.cmds = tc.commands\n\t\t\tfor key, value := range tc.args {\n\t\t\t\tsb.args.AddArg(key, &value)\n\t\t\t}\n\t\t\ttmp := config.RootDir\n\t\t\tif tc.rootDir != \"\" {\n\t\t\t\tconfig.RootDir = tc.rootDir\n\t\t\t}\n\t\t\tsb.stage = tc.stage\n\t\t\tsb.crossStageDeps = tc.crossStageDeps\n\t\t\tif tc.mockGetFSFromImage != nil {\n\t\t\t\toriginal := getFSFromImage\n\t\t\t\tdefer func() { getFSFromImage = original }()\n\t\t\t\tgetFSFromImage = tc.mockGetFSFromImage\n\t\t\t}\n\t\t\terr := sb.build()\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Expected error to be nil but was %v\", err)\n\t\t\t}\n\t\t\tif tc.shouldInitSnapshot && !snap.initialized {\n\t\t\t\tt.Errorf(\"Snapshotter was not initialized but should have been\")\n\t\t\t} else if !tc.shouldInitSnapshot && snap.initialized {\n\t\t\t\tt.Errorf(\"Snapshotter was initialized but should not have been\")\n\t\t\t}\n\t\t\tassertCacheKeys(t, tc.expectedCacheKeys, lc.receivedKeys, \"receive\")\n\t\t\tassertCacheKeys(t, tc.pushedCacheKeys, keys, \"push\")\n\n\t\t\tconfig.RootDir = tmp\n\n\t\t})\n\t}\n}\n\nfunc assertCacheKeys(t *testing.T, expectedCacheKeys, actualCacheKeys []string, description string) {\n\tif len(expectedCacheKeys) != len(actualCacheKeys) {\n\t\tt.Errorf(\"expected to %v %v keys but was %v\", description, len(expectedCacheKeys), len(actualCacheKeys))\n\t}\n\n\tsort.Slice(expectedCacheKeys, func(x, y int) bool {\n\t\treturn expectedCacheKeys[x] > expectedCacheKeys[y]\n\t})\n\tsort.Slice(actualCacheKeys, func(x, y int) bool {\n\t\treturn actualCacheKeys[x] > actualCacheKeys[y]\n\t})\n\n\tif len(expectedCacheKeys) != len(actualCacheKeys) {\n\t\tt.Errorf(\"expected %v to equal %v\", actualCacheKeys, expectedCacheKeys)\n\t}\n\n\tfor i, key := range expectedCacheKeys {\n\t\tif key != actualCacheKeys[i] {\n\t\t\tt.Errorf(\"expected to %v keys %d to be %v but was %v %v\", description, i, key, actualCacheKeys[i], actualCacheKeys)\n\t\t}\n\t}\n}\n\nfunc getCommands(fileContext util.FileContext, cmds []instructions.Command, cacheCopy, cacheRun bool) []commands.DockerCommand {\n\toutCommands := make([]commands.DockerCommand, 0)\n\tfor _, c := range cmds {\n\t\tcmd, err := commands.GetCommand(\n\t\t\tc,\n\t\t\tfileContext,\n\t\t\tfalse,\n\t\t\tcacheCopy,\n\t\t\tcacheRun,\n\t\t)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\toutCommands = append(outCommands, cmd)\n\t}\n\treturn outCommands\n}\n\nfunc tempDirAndFile(t *testing.T) (string, []string) {\n\tfilenames := []string{\"bar.txt\"}\n\n\tdir := t.TempDir()\n\tfor _, filename := range filenames {\n\t\tfilepath := filepath.Join(dir, filename)\n\t\terr := os.WriteFile(filepath, []byte(`meow`), 0777)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"could not create temp file %v\", err)\n\t\t}\n\t}\n\n\treturn dir, filenames\n}\n\nfunc generateTar(t *testing.T, dir string, fileNames ...string) []byte {\n\tbuf := bytes.NewBuffer([]byte{})\n\twriter := tar.NewWriter(buf)\n\tdefer writer.Close()\n\n\tfor _, filename := range fileNames {\n\t\tfilePath := filepath.Join(dir, filename)\n\t\tinfo, err := os.Stat(filePath)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"could not get file info for temp file %v\", err)\n\t\t}\n\t\thdr, err := tar.FileInfoHeader(info, filename)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"could not get tar header for temp file %v\", err)\n\t\t}\n\n\t\tif err := writer.WriteHeader(hdr); err != nil {\n\t\t\tt.Errorf(\"could not write tar header %v\", err)\n\t\t}\n\n\t\tcontent, err := os.ReadFile(filePath)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"could not read tempfile %v\", err)\n\t\t}\n\n\t\tif _, err := writer.Write(content); err != nil {\n\t\t\tt.Errorf(\"could not write file contents to tar\")\n\t\t}\n\t}\n\treturn buf.Bytes()\n}\n\nfunc hashCompositeKeys(t *testing.T, ck1 CompositeCache, ck2 CompositeCache) (string, string) {\n\tkey1, err := ck1.Hash()\n\tif err != nil {\n\t\tt.Errorf(\"could not hash composite key due to %s\", err)\n\t}\n\tkey2, err := ck2.Hash()\n\tif err != nil {\n\t\tt.Errorf(\"could not hash composite key due to %s\", err)\n\t}\n\treturn key1, key2\n}\n\nfunc Test_stageBuild_populateCompositeKeyForCopyCommand(t *testing.T) {\n\t// See https://github.com/GoogleContainerTools/kaniko/issues/589\n\n\tfor _, tc := range []struct {\n\t\tdescription      string\n\t\tcommand          string\n\t\texpectedCacheKey string\n\t}{\n\t\t{\n\t\t\tdescription: \"multi-stage copy command\",\n\t\t\t// dont use digest from previoust stage for COPY\n\t\t\tcommand:          \"COPY --from=0 foo.txt bar.txt\",\n\t\t\texpectedCacheKey: \"COPY --from=0 foo.txt bar.txt\",\n\t\t},\n\t\t{\n\t\t\tdescription:      \"copy command\",\n\t\t\tcommand:          \"COPY foo.txt bar.txt\",\n\t\t\texpectedCacheKey: \"COPY foo.txt bar.txt\",\n\t\t},\n\t} {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tinstructions, err := dockerfile.ParseCommands([]string{tc.command})\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tfc := util.FileContext{Root: \"workspace\"}\n\t\t\tcopyCommand, err := commands.GetCommand(instructions[0], fc, false, true, true)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tfor _, useCacheCommand := range []bool{false, true} {\n\t\t\t\tt.Run(fmt.Sprintf(\"CacheCommand=%t\", useCacheCommand), func(t *testing.T) {\n\t\t\t\t\tvar cmd commands.DockerCommand = copyCommand\n\t\t\t\t\tif useCacheCommand {\n\t\t\t\t\t\tcmd = copyCommand.(*commands.CopyCommand).CacheCommand(nil)\n\t\t\t\t\t}\n\n\t\t\t\t\tsb := &stageBuilder{\n\t\t\t\t\t\tfileContext: fc,\n\t\t\t\t\t\tstageIdxToDigest: map[string]string{\n\t\t\t\t\t\t\t\"0\": \"some-digest\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdigestToCacheKey: map[string]string{\n\t\t\t\t\t\t\t\"some-digest\": \"some-cache-key\",\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\n\t\t\t\t\tck := CompositeCache{}\n\t\t\t\t\tck, err = sb.populateCompositeKey(\n\t\t\t\t\t\tcmd,\n\t\t\t\t\t\t[]string{},\n\t\t\t\t\t\tck,\n\t\t\t\t\t\tdockerfile.NewBuildArgs([]string{}),\n\t\t\t\t\t\t[]string{},\n\t\t\t\t\t)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tt.Fatal(err)\n\t\t\t\t\t}\n\n\t\t\t\t\tactualCacheKey := ck.Key()\n\t\t\t\t\tif tc.expectedCacheKey != actualCacheKey {\n\t\t\t\t\t\tt.Errorf(\n\t\t\t\t\t\t\t\"Expected cache key to be %s, was %s\",\n\t\t\t\t\t\t\ttc.expectedCacheKey,\n\t\t\t\t\t\t\tactualCacheKey,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_ResolveCrossStageInstructions(t *testing.T) {\n\tdf := `\n\tFROM scratch\n\tRUN echo hi > /hi\n\n\tFROM scratch AS second\n\tCOPY --from=0 /hi /hi2\n\n\tFROM scratch AS tHiRd\n\tCOPY --from=second /hi2 /hi3\n\tCOPY --from=1 /hi2 /hi3\n\n\tFROM scratch\n\tCOPY --from=thIrD /hi3 /hi4\n\tCOPY --from=third /hi3 /hi4\n\tCOPY --from=2 /hi3 /hi4\n\t`\n\tstages, metaArgs, err := dockerfile.Parse([]byte(df))\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\topts := &config.KanikoOptions{}\n\tkanikoStages, err := dockerfile.MakeKanikoStages(opts, stages, metaArgs)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tstageToIdx := ResolveCrossStageInstructions(kanikoStages)\n\tfor index, stage := range stages {\n\t\tif index == 0 {\n\t\t\tcontinue\n\t\t}\n\t\texpectedStage := strconv.Itoa(index - 1)\n\t\tfor _, command := range stage.Commands {\n\t\t\tcopyCmd := command.(*instructions.CopyCommand)\n\t\t\tif copyCmd.From != expectedStage {\n\t\t\t\tt.Fatalf(\"unexpected copy command: %s resolved to stage %s, expected %s\", copyCmd.String(), copyCmd.From, expectedStage)\n\t\t\t}\n\t\t}\n\n\t\texpectedMap := map[string]string{\"second\": \"1\", \"third\": \"2\"}\n\t\ttestutil.CheckDeepEqual(t, expectedMap, stageToIdx)\n\t}\n}\n\nfunc Test_stageBuilder_saveSnapshotToLayer(t *testing.T) {\n\tdir, files := tempDirAndFile(t)\n\ttype fields struct {\n\t\tstage            config.KanikoStage\n\t\timage            v1.Image\n\t\tcf               *v1.ConfigFile\n\t\tbaseImageDigest  string\n\t\tfinalCacheKey    string\n\t\topts             *config.KanikoOptions\n\t\tfileContext      util.FileContext\n\t\tcmds             []commands.DockerCommand\n\t\targs             *dockerfile.BuildArgs\n\t\tcrossStageDeps   map[int][]string\n\t\tdigestToCacheKey map[string]string\n\t\tstageIdxToDigest map[string]string\n\t\tsnapshotter      snapShotter\n\t\tlayerCache       cache.LayerCache\n\t\tpushLayerToCache cachePusher\n\t}\n\ttype args struct {\n\t\ttarPath string\n\t}\n\ttests := []struct {\n\t\tname              string\n\t\tfields            fields\n\t\targs              args\n\t\texpectedMediaType types.MediaType\n\t\texpectedDiff      v1.Hash\n\t\texpectedDigest    v1.Hash\n\t\twantErr           bool\n\t}{\n\t\t{\n\t\t\tname: \"oci image\",\n\t\t\tfields: fields{\n\t\t\t\timage: ociFakeImage{},\n\t\t\t\topts: &config.KanikoOptions{\n\t\t\t\t\tForceBuildMetadata: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\targs: args{\n\t\t\t\ttarPath: filepath.Join(dir, files[0]),\n\t\t\t},\n\t\t\texpectedMediaType: types.OCILayer,\n\t\t\texpectedDiff: v1.Hash{\n\t\t\t\tAlgorithm: \"sha256\",\n\t\t\t\tHex:       \"404cdd7bc109c432f8cc2443b45bcfe95980f5107215c645236e577929ac3e52\",\n\t\t\t},\n\t\t\texpectedDigest: v1.Hash{\n\t\t\t\tAlgorithm: \"sha256\",\n\t\t\t\tHex:       \"1dc5887a31ec6b388646be46c5f0b2036f92f4cbba50d12163a8be4074565a91\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"docker image\",\n\t\t\tfields: fields{\n\t\t\t\timage: fakeImage{},\n\t\t\t\topts: &config.KanikoOptions{\n\t\t\t\t\tForceBuildMetadata: true,\n\t\t\t\t},\n\t\t\t},\n\t\t\targs: args{\n\t\t\t\ttarPath: filepath.Join(dir, files[0]),\n\t\t\t},\n\t\t\texpectedMediaType: types.DockerLayer,\n\t\t\texpectedDiff: v1.Hash{\n\t\t\t\tAlgorithm: \"sha256\",\n\t\t\t\tHex:       \"404cdd7bc109c432f8cc2443b45bcfe95980f5107215c645236e577929ac3e52\",\n\t\t\t},\n\t\t\texpectedDigest: v1.Hash{\n\t\t\t\tAlgorithm: \"sha256\",\n\t\t\t\tHex:       \"1dc5887a31ec6b388646be46c5f0b2036f92f4cbba50d12163a8be4074565a91\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"oci image, zstd compression\",\n\t\t\tfields: fields{\n\t\t\t\timage: ociFakeImage{},\n\t\t\t\topts: &config.KanikoOptions{\n\t\t\t\t\tForceBuildMetadata: true,\n\t\t\t\t\tCompression:        config.ZStd,\n\t\t\t\t},\n\t\t\t},\n\t\t\targs: args{\n\t\t\t\ttarPath: filepath.Join(dir, files[0]),\n\t\t\t},\n\t\t\texpectedMediaType: types.OCILayerZStd,\n\t\t\texpectedDiff: v1.Hash{\n\t\t\t\tAlgorithm: \"sha256\",\n\t\t\t\tHex:       \"404cdd7bc109c432f8cc2443b45bcfe95980f5107215c645236e577929ac3e52\",\n\t\t\t},\n\t\t\texpectedDigest: v1.Hash{\n\t\t\t\tAlgorithm: \"sha256\",\n\t\t\t\tHex:       \"28369c11d9b68c9877781eaf4d8faffb4d0ada1900a1fb83ad452e58a072b45b\",\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ts := &stageBuilder{\n\t\t\t\tstage:            tt.fields.stage,\n\t\t\t\timage:            tt.fields.image,\n\t\t\t\tcf:               tt.fields.cf,\n\t\t\t\tbaseImageDigest:  tt.fields.baseImageDigest,\n\t\t\t\tfinalCacheKey:    tt.fields.finalCacheKey,\n\t\t\t\topts:             tt.fields.opts,\n\t\t\t\tfileContext:      tt.fields.fileContext,\n\t\t\t\tcmds:             tt.fields.cmds,\n\t\t\t\targs:             tt.fields.args,\n\t\t\t\tcrossStageDeps:   tt.fields.crossStageDeps,\n\t\t\t\tdigestToCacheKey: tt.fields.digestToCacheKey,\n\t\t\t\tstageIdxToDigest: tt.fields.stageIdxToDigest,\n\t\t\t\tsnapshotter:      tt.fields.snapshotter,\n\t\t\t\tlayerCache:       tt.fields.layerCache,\n\t\t\t\tpushLayerToCache: tt.fields.pushLayerToCache,\n\t\t\t}\n\t\t\tgot, err := s.saveSnapshotToLayer(tt.args.tarPath)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"stageBuilder.saveSnapshotToLayer() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif mt, _ := got.MediaType(); mt != tt.expectedMediaType {\n\t\t\t\tt.Errorf(\"expected mediatype %s, got %s\", tt.expectedMediaType, mt)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif diff, _ := got.DiffID(); diff != tt.expectedDiff {\n\t\t\t\tt.Errorf(\"expected diff %s, got %s\", tt.expectedDiff, diff)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif digest, _ := got.Digest(); digest != tt.expectedDigest {\n\t\t\t\tt.Errorf(\"expected digest %s, got %s\", tt.expectedDigest, digest)\n\t\t\t\treturn\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_stageBuilder_convertLayerMediaType(t *testing.T) {\n\ttype fields struct {\n\t\tstage            config.KanikoStage\n\t\timage            v1.Image\n\t\tcf               *v1.ConfigFile\n\t\tbaseImageDigest  string\n\t\tfinalCacheKey    string\n\t\topts             *config.KanikoOptions\n\t\tfileContext      util.FileContext\n\t\tcmds             []commands.DockerCommand\n\t\targs             *dockerfile.BuildArgs\n\t\tcrossStageDeps   map[int][]string\n\t\tdigestToCacheKey map[string]string\n\t\tstageIdxToDigest map[string]string\n\t\tsnapshotter      snapShotter\n\t\tlayerCache       cache.LayerCache\n\t\tpushLayerToCache cachePusher\n\t}\n\ttype args struct {\n\t\tlayer v1.Layer\n\t}\n\ttests := []struct {\n\t\tname              string\n\t\tfields            fields\n\t\targs              args\n\t\texpectedMediaType types.MediaType\n\t\twantErr           bool\n\t}{\n\t\t{\n\t\t\tname: \"docker image w/ docker layer\",\n\t\t\tfields: fields{\n\t\t\t\timage: fakeImage{},\n\t\t\t},\n\t\t\targs: args{\n\t\t\t\tlayer: fakeLayer{\n\t\t\t\t\tmediaType: types.DockerLayer,\n\t\t\t\t},\n\t\t\t},\n\t\t\texpectedMediaType: types.DockerLayer,\n\t\t},\n\t\t{\n\t\t\tname: \"oci image w/ oci layer\",\n\t\t\tfields: fields{\n\t\t\t\timage: ociFakeImage{},\n\t\t\t},\n\t\t\targs: args{\n\t\t\t\tlayer: fakeLayer{\n\t\t\t\t\tmediaType: types.OCILayer,\n\t\t\t\t},\n\t\t\t},\n\t\t\texpectedMediaType: types.OCILayer,\n\t\t},\n\t\t{\n\t\t\tname: \"oci image w/ convertable docker layer\",\n\t\t\tfields: fields{\n\t\t\t\timage: ociFakeImage{},\n\t\t\t\topts:  &config.KanikoOptions{},\n\t\t\t},\n\t\t\targs: args{\n\t\t\t\tlayer: fakeLayer{\n\t\t\t\t\tmediaType: types.DockerLayer,\n\t\t\t\t},\n\t\t\t},\n\t\t\texpectedMediaType: types.OCILayer,\n\t\t},\n\t\t{\n\t\t\tname: \"oci image w/ convertable docker layer and zstd compression\",\n\t\t\tfields: fields{\n\t\t\t\timage: ociFakeImage{},\n\t\t\t\topts: &config.KanikoOptions{\n\t\t\t\t\tCompression: config.ZStd,\n\t\t\t\t},\n\t\t\t},\n\t\t\targs: args{\n\t\t\t\tlayer: fakeLayer{\n\t\t\t\t\tmediaType: types.DockerLayer,\n\t\t\t\t},\n\t\t\t},\n\t\t\texpectedMediaType: types.OCILayerZStd,\n\t\t},\n\t\t{\n\t\t\tname: \"docker image and oci zstd layer\",\n\t\t\tfields: fields{\n\t\t\t\timage: dockerFakeImage{},\n\t\t\t\topts:  &config.KanikoOptions{},\n\t\t\t},\n\t\t\targs: args{\n\t\t\t\tlayer: fakeLayer{\n\t\t\t\t\tmediaType: types.OCILayerZStd,\n\t\t\t\t},\n\t\t\t},\n\t\t\texpectedMediaType: types.DockerLayer,\n\t\t},\n\t\t{\n\t\t\tname: \"docker image w/ uncovertable oci image\",\n\t\t\tfields: fields{\n\t\t\t\timage: dockerFakeImage{},\n\t\t\t\topts:  &config.KanikoOptions{},\n\t\t\t},\n\t\t\targs: args{\n\t\t\t\tlayer: fakeLayer{\n\t\t\t\t\tmediaType: types.OCIUncompressedRestrictedLayer,\n\t\t\t\t},\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ts := &stageBuilder{\n\t\t\t\tstage:            tt.fields.stage,\n\t\t\t\timage:            tt.fields.image,\n\t\t\t\tcf:               tt.fields.cf,\n\t\t\t\tbaseImageDigest:  tt.fields.baseImageDigest,\n\t\t\t\tfinalCacheKey:    tt.fields.finalCacheKey,\n\t\t\t\topts:             tt.fields.opts,\n\t\t\t\tfileContext:      tt.fields.fileContext,\n\t\t\t\tcmds:             tt.fields.cmds,\n\t\t\t\targs:             tt.fields.args,\n\t\t\t\tcrossStageDeps:   tt.fields.crossStageDeps,\n\t\t\t\tdigestToCacheKey: tt.fields.digestToCacheKey,\n\t\t\t\tstageIdxToDigest: tt.fields.stageIdxToDigest,\n\t\t\t\tsnapshotter:      tt.fields.snapshotter,\n\t\t\t\tlayerCache:       tt.fields.layerCache,\n\t\t\t\tpushLayerToCache: tt.fields.pushLayerToCache,\n\t\t\t}\n\t\t\tgot, err := s.convertLayerMediaType(tt.args.layer)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"stageBuilder.convertLayerMediaType() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif err == nil {\n\t\t\t\tmt, _ := got.MediaType()\n\t\t\t\tif mt != tt.expectedMediaType {\n\t\t\t\t\tt.Errorf(\"stageBuilder.convertLayerMediaType() = %v, want %v\", mt, tt.expectedMediaType)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/executor/composite_cache.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage executor\n\nimport (\n\t\"crypto/sha256\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/pkg/errors\"\n)\n\n// NewCompositeCache returns an initialized composite cache object.\nfunc NewCompositeCache(initial ...string) *CompositeCache {\n\tc := CompositeCache{\n\t\tkeys: initial,\n\t}\n\treturn &c\n}\n\n// CompositeCache is a type that generates a cache key from a series of keys.\ntype CompositeCache struct {\n\tkeys []string\n}\n\n// AddKey adds the specified key to the sequence.\nfunc (s *CompositeCache) AddKey(k ...string) {\n\ts.keys = append(s.keys, k...)\n}\n\n// Key returns the human readable composite key as a string.\nfunc (s *CompositeCache) Key() string {\n\treturn strings.Join(s.keys, \"-\")\n}\n\n// Hash returns the composite key in a string SHA256 format.\nfunc (s *CompositeCache) Hash() (string, error) {\n\treturn util.SHA256(strings.NewReader(s.Key()))\n}\n\nfunc (s *CompositeCache) AddPath(p string, context util.FileContext) error {\n\tsha := sha256.New()\n\tfi, err := os.Lstat(p)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"could not add path\")\n\t}\n\n\tif fi.Mode().IsDir() {\n\t\tempty, k, err := hashDir(p, context)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Only add the hash of this directory to the key\n\t\t// if there is any ignored content.\n\t\tif !empty || !context.ExcludesFile(p) {\n\t\t\ts.keys = append(s.keys, k)\n\t\t}\n\t\treturn nil\n\t}\n\n\tif context.ExcludesFile(p) {\n\t\treturn nil\n\t}\n\tfh, err := util.CacheHasher()(p)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif _, err := sha.Write([]byte(fh)); err != nil {\n\t\treturn err\n\t}\n\n\ts.keys = append(s.keys, fmt.Sprintf(\"%x\", sha.Sum(nil)))\n\treturn nil\n}\n\n// HashDir returns a hash of the directory.\nfunc hashDir(p string, context util.FileContext) (bool, string, error) {\n\tsha := sha256.New()\n\tempty := true\n\tif err := filepath.Walk(p, func(path string, fi os.FileInfo, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\texclude := context.ExcludesFile(path)\n\t\tif exclude {\n\t\t\treturn nil\n\t\t}\n\n\t\tfileHash, err := util.CacheHasher()(path)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif _, err := sha.Write([]byte(fileHash)); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tempty = false\n\t\treturn nil\n\t}); err != nil {\n\t\treturn false, \"\", err\n\t}\n\n\treturn empty, fmt.Sprintf(\"%x\", sha.Sum(nil)), nil\n}\n"
  },
  {
    "path": "pkg/executor/composite_cache_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage executor\n\nimport (\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n)\n\nfunc Test_NewCompositeCache(t *testing.T) {\n\tr := NewCompositeCache()\n\tif reflect.TypeOf(r).String() != \"*executor.CompositeCache\" {\n\t\tt.Errorf(\"expected return to be *executor.CompositeCache but was %v\", reflect.TypeOf(r).String())\n\t}\n}\n\nfunc Test_CompositeCache_AddKey(t *testing.T) {\n\tkeys := []string{\n\t\t\"meow\",\n\t\t\"purr\",\n\t}\n\tr := NewCompositeCache()\n\tr.AddKey(keys...)\n\tif len(r.keys) != 2 {\n\t\tt.Errorf(\"expected keys to have length 2 but was %v\", len(r.keys))\n\t}\n}\n\nfunc Test_CompositeCache_Key(t *testing.T) {\n\tr := NewCompositeCache(\"meow\", \"purr\")\n\tk := r.Key()\n\tif k != \"meow-purr\" {\n\t\tt.Errorf(\"expected result to equal meow-purr but was %v\", k)\n\t}\n}\n\nfunc Test_CompositeCache_Hash(t *testing.T) {\n\tr := NewCompositeCache(\"meow\", \"purr\")\n\th, err := r.Hash()\n\tif err != nil {\n\t\tt.Errorf(\"expected error to be nil but was %v\", err)\n\t}\n\n\texpectedHash := \"b4fd5a11af812a11a79d794007c842794cc668c8e7ebaba6d1e6d021b8e06c71\"\n\tif h != expectedHash {\n\t\tt.Errorf(\"expected result to equal %v but was %v\", expectedHash, h)\n\t}\n}\n\nfunc Test_CompositeCache_AddPath_dir(t *testing.T) {\n\ttmpDir := t.TempDir()\n\n\tcontent := `meow meow meow`\n\tif err := os.WriteFile(filepath.Join(tmpDir, \"foo.txt\"), []byte(content), 0777); err != nil {\n\t\tt.Errorf(\"got error writing temp file %v\", err)\n\t}\n\n\tfn := func() string {\n\t\tr := NewCompositeCache()\n\t\tif err := r.AddPath(tmpDir, util.FileContext{}); err != nil {\n\t\t\tt.Errorf(\"expected error to be nil but was %v\", err)\n\t\t}\n\n\t\tif len(r.keys) != 1 {\n\t\t\tt.Errorf(\"expected len of keys to be 1 but was %v\", len(r.keys))\n\t\t}\n\t\thash, err := r.Hash()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"couldnt generate hash from test cache\")\n\t\t}\n\t\treturn hash\n\t}\n\n\thash1 := fn()\n\thash2 := fn()\n\tif hash1 != hash2 {\n\t\tt.Errorf(\"expected hash %v to equal hash %v\", hash1, hash2)\n\t}\n}\nfunc Test_CompositeCache_AddPath_file(t *testing.T) {\n\ttmpfile, err := os.CreateTemp(\"/tmp\", \"foo.txt\")\n\tif err != nil {\n\t\tt.Errorf(\"got error setting up test %v\", err)\n\t}\n\tdefer os.Remove(tmpfile.Name()) // clean up\n\n\tcontent := `meow meow meow`\n\tif _, err := tmpfile.Write([]byte(content)); err != nil {\n\t\tt.Errorf(\"got error writing temp file %v\", err)\n\t}\n\tif err := tmpfile.Close(); err != nil {\n\t\tt.Errorf(\"got error closing temp file %v\", err)\n\t}\n\n\tp := tmpfile.Name()\n\tfn := func() string {\n\t\tr := NewCompositeCache()\n\t\tif err := r.AddPath(p, util.FileContext{}); err != nil {\n\t\t\tt.Errorf(\"expected error to be nil but was %v\", err)\n\t\t}\n\n\t\tif len(r.keys) != 1 {\n\t\t\tt.Errorf(\"expected len of keys to be 1 but was %v\", len(r.keys))\n\t\t}\n\t\thash, err := r.Hash()\n\t\tif err != nil {\n\t\t\tt.Errorf(\"couldnt generate hash from test cache\")\n\t\t}\n\t\treturn hash\n\t}\n\n\thash1 := fn()\n\thash2 := fn()\n\tif hash1 != hash2 {\n\t\tt.Errorf(\"expected hash %v to equal hash %v\", hash1, hash2)\n\t}\n}\n\nfunc createFilesystemStructure(root string, directories, files []string) error {\n\tfor _, d := range directories {\n\t\tdirPath := path.Join(root, d)\n\t\tif err := os.MkdirAll(dirPath, 0755); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tfor _, fileName := range files {\n\t\tfilePath := path.Join(root, fileName)\n\t\terr := os.WriteFile(filePath, []byte(fileName), 0644)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc setIgnoreContext(t *testing.T, content string) (util.FileContext, error) {\n\tvar fileContext util.FileContext\n\tdockerIgnoreDir := t.TempDir()\n\terr := os.WriteFile(dockerIgnoreDir+\".dockerignore\", []byte(content), 0644)\n\tif err != nil {\n\t\treturn fileContext, err\n\t}\n\treturn util.NewFileContextFromDockerfile(dockerIgnoreDir, \"\")\n}\n\nfunc hashDirectory(dirpath string, fileContext util.FileContext) (string, error) {\n\tcache1 := NewCompositeCache()\n\terr := cache1.AddPath(dirpath, fileContext)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\thash, err := cache1.Hash()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn hash, nil\n}\n\nfunc Test_CompositeKey_AddPath_Works(t *testing.T) {\n\ttests := []struct {\n\t\tname        string\n\t\tdirectories []string\n\t\tfiles       []string\n\t}{\n\t\t{\n\t\t\tname:        \"empty\",\n\t\t\tdirectories: []string{},\n\t\t\tfiles:       []string{},\n\t\t},\n\t\t{\n\t\t\tname:        \"dirs\",\n\t\t\tdirectories: []string{\"foo\", \"bar\", \"foobar\", \"f/o/o\"},\n\t\t\tfiles:       []string{},\n\t\t},\n\t\t{\n\t\t\tname:        \"files\",\n\t\t\tdirectories: []string{},\n\t\t\tfiles:       []string{\"foo\", \"bar\", \"foobar\"},\n\t\t},\n\t\t{\n\t\t\tname:        \"all\",\n\t\t\tdirectories: []string{\"foo\", \"bar\"},\n\t\t\tfiles:       []string{\"foo/bar\", \"bar/baz\", \"foobar\"},\n\t\t},\n\t}\n\n\tfileContext := util.FileContext{}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\ttestDir1 := t.TempDir()\n\t\t\terr := createFilesystemStructure(testDir1, test.directories, test.files)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Error creating filesytem structure: %s\", err)\n\t\t\t}\n\n\t\t\ttestDir2 := t.TempDir()\n\t\t\terr = createFilesystemStructure(testDir2, test.directories, test.files)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Error creating filesytem structure: %s\", err)\n\t\t\t}\n\n\t\t\thash1, err := hashDirectory(testDir1, fileContext)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to calculate hash: %s\", err)\n\t\t\t}\n\t\t\thash2, err := hashDirectory(testDir2, fileContext)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to calculate hash: %s\", err)\n\t\t\t}\n\n\t\t\tif hash1 != hash2 {\n\t\t\t\tt.Errorf(\"Expected equal hashes, got: %s and %s\", hash1, hash2)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_CompositeKey_AddPath_WithExtraFile_Works(t *testing.T) {\n\ttests := []struct {\n\t\tname        string\n\t\tdirectories []string\n\t\tfiles       []string\n\t\textraFile   string\n\t}{\n\t\t{\n\t\t\tname:        \"empty\",\n\t\t\tdirectories: []string{},\n\t\t\tfiles:       []string{},\n\t\t\textraFile:   \"file\",\n\t\t},\n\t\t{\n\t\t\tname:        \"dirs\",\n\t\t\tdirectories: []string{\"foo\", \"bar\", \"foobar\", \"f/o/o\"},\n\t\t\tfiles:       []string{},\n\t\t\textraFile:   \"f/o/o/extra\",\n\t\t},\n\t\t{\n\t\t\tname:        \"files\",\n\t\t\tdirectories: []string{},\n\t\t\tfiles:       []string{\"foo\", \"bar\", \"foobar\"},\n\t\t\textraFile:   \"foo.extra\",\n\t\t},\n\t\t{\n\t\t\tname:        \"all\",\n\t\t\tdirectories: []string{\"foo\", \"bar\"},\n\t\t\tfiles:       []string{\"foo/bar\", \"bar/baz\", \"foobar\"},\n\t\t\textraFile:   \"bar/extra\",\n\t\t},\n\t}\n\n\tfileContext := util.FileContext{}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\ttestDir1 := t.TempDir()\n\t\t\terr := createFilesystemStructure(testDir1, test.directories, test.files)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Error creating filesytem structure: %s\", err)\n\t\t\t}\n\n\t\t\ttestDir2 := t.TempDir()\n\t\t\terr = createFilesystemStructure(testDir2, test.directories, test.files)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Error creating filesytem structure: %s\", err)\n\t\t\t}\n\t\t\textraPath := path.Join(testDir2, test.extraFile)\n\t\t\terr = os.WriteFile(extraPath, []byte(test.extraFile), 0644)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Error creating filesytem structure: %s\", err)\n\t\t\t}\n\n\t\t\thash1, err := hashDirectory(testDir1, fileContext)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to calculate hash: %s\", err)\n\t\t\t}\n\t\t\thash2, err := hashDirectory(testDir2, fileContext)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to calculate hash: %s\", err)\n\t\t\t}\n\n\t\t\tif hash1 == hash2 {\n\t\t\t\tt.Errorf(\"Expected different hashes, got: %s and %s\", hash1, hash2)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_CompositeKey_AddPath_WithExtraDir_Works(t *testing.T) {\n\ttests := []struct {\n\t\tname        string\n\t\tdirectories []string\n\t\tfiles       []string\n\t\textraDir    string\n\t}{\n\t\t{\n\t\t\tname:        \"empty\",\n\t\t\tdirectories: []string{},\n\t\t\tfiles:       []string{},\n\t\t\textraDir:    \"extra\",\n\t\t},\n\t\t{\n\t\t\tname:        \"dirs\",\n\t\t\tdirectories: []string{\"foo\", \"bar\", \"foobar\", \"f/o/o\"},\n\t\t\tfiles:       []string{},\n\t\t\textraDir:    \"f/o/o/extra\",\n\t\t},\n\t\t{\n\t\t\tname:        \"files\",\n\t\t\tdirectories: []string{},\n\t\t\tfiles:       []string{\"foo\", \"bar\", \"foobar\"},\n\t\t\textraDir:    \"foo.extra\",\n\t\t},\n\t\t{\n\t\t\tname:        \"all\",\n\t\t\tdirectories: []string{\"foo\", \"bar\"},\n\t\t\tfiles:       []string{\"foo/bar\", \"bar/baz\", \"foobar\"},\n\t\t\textraDir:    \"bar/extra\",\n\t\t},\n\t}\n\n\tfileContext := util.FileContext{}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\ttestDir1 := t.TempDir()\n\t\t\terr := createFilesystemStructure(testDir1, test.directories, test.files)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Error creating filesytem structure: %s\", err)\n\t\t\t}\n\n\t\t\ttestDir2 := t.TempDir()\n\t\t\terr = createFilesystemStructure(testDir2, test.directories, test.files)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Error creating filesytem structure: %s\", err)\n\t\t\t}\n\t\t\textraPath := path.Join(testDir2, test.extraDir)\n\t\t\terr = os.MkdirAll(extraPath, 0644)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Error creating filesytem structure: %s\", err)\n\t\t\t}\n\n\t\t\thash1, err := hashDirectory(testDir1, fileContext)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to calculate hash: %s\", err)\n\t\t\t}\n\t\t\thash2, err := hashDirectory(testDir2, fileContext)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to calculate hash: %s\", err)\n\t\t\t}\n\n\t\t\tif hash1 == hash2 {\n\t\t\t\tt.Errorf(\"Expected different hashes, got: %s and %s\", hash1, hash2)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_CompositeKey_AddPath_WithExtraFilIgnored_Works(t *testing.T) {\n\ttests := []struct {\n\t\tname        string\n\t\tdirectories []string\n\t\tfiles       []string\n\t\textraFile   string\n\t}{\n\t\t{\n\t\t\tname:        \"empty\",\n\t\t\tdirectories: []string{},\n\t\t\tfiles:       []string{},\n\t\t\textraFile:   \"extra\",\n\t\t},\n\t\t{\n\t\t\tname:        \"dirs\",\n\t\t\tdirectories: []string{\"foo\", \"bar\", \"foobar\", \"f/o/o\"},\n\t\t\tfiles:       []string{},\n\t\t\textraFile:   \"f/o/o/extra\",\n\t\t},\n\t\t{\n\t\t\tname:        \"files\",\n\t\t\tdirectories: []string{},\n\t\t\tfiles:       []string{\"foo\", \"bar\", \"foobar\"},\n\t\t\textraFile:   \"extra\",\n\t\t},\n\t\t{\n\t\t\tname:        \"all\",\n\t\t\tdirectories: []string{\"foo\", \"bar\"},\n\t\t\tfiles:       []string{\"foo/bar\", \"bar/baz\", \"foobar\"},\n\t\t\textraFile:   \"bar/extra\",\n\t\t},\n\t}\n\n\tfileContext, err := setIgnoreContext(t, \"**/extra\")\n\tif err != nil {\n\t\tt.Fatalf(\"Error setting exlusion context: %s\", err)\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\ttestDir1 := t.TempDir()\n\t\t\terr = createFilesystemStructure(testDir1, test.directories, test.files)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Error creating filesytem structure: %s\", err)\n\t\t\t}\n\n\t\t\ttestDir2 := t.TempDir()\n\t\t\terr = createFilesystemStructure(testDir2, test.directories, test.files)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Error creating filesytem structure: %s\", err)\n\t\t\t}\n\t\t\textraPath := path.Join(testDir2, test.extraFile)\n\t\t\terr = os.WriteFile(extraPath, []byte(test.extraFile), 0644)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Error creating filesytem structure: %s\", err)\n\t\t\t}\n\n\t\t\thash1, err := hashDirectory(testDir1, fileContext)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to calculate hash: %s\", err)\n\t\t\t}\n\t\t\thash2, err := hashDirectory(testDir2, fileContext)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to calculate hash: %s\", err)\n\t\t\t}\n\n\t\t\tif hash1 != hash2 {\n\t\t\t\tt.Errorf(\"Expected equal hashes, got: %s and %s\", hash1, hash2)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_CompositeKey_AddPath_WithExtraDirIgnored_Works(t *testing.T) {\n\ttests := []struct {\n\t\tname        string\n\t\tdirectories []string\n\t\tfiles       []string\n\t\textraDir    string\n\t}{\n\t\t{\n\t\t\tname:        \"empty\",\n\t\t\tdirectories: []string{},\n\t\t\tfiles:       []string{},\n\t\t\textraDir:    \"extra\",\n\t\t},\n\t\t{\n\t\t\tname:        \"dirs\",\n\t\t\tdirectories: []string{\"foo\", \"bar\", \"foobar\", \"f/o/o\"},\n\t\t\tfiles:       []string{},\n\t\t\textraDir:    \"f/o/o/extra\",\n\t\t},\n\t\t{\n\t\t\tname:        \"files\",\n\t\t\tdirectories: []string{},\n\t\t\tfiles:       []string{\"foo\", \"bar\", \"foobar\"},\n\t\t\textraDir:    \"extra\",\n\t\t},\n\t\t{\n\t\t\tname:        \"all\",\n\t\t\tdirectories: []string{\"foo\", \"bar\"},\n\t\t\tfiles:       []string{\"foo/bar\", \"bar/baz\", \"foobar\"},\n\t\t\textraDir:    \"bar/extra\",\n\t\t},\n\t}\n\n\tfileContext, err := setIgnoreContext(t, \"**/extra\")\n\tif err != nil {\n\t\tt.Fatalf(\"Error setting exlusion context: %s\", err)\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\ttestDir1 := t.TempDir()\n\t\t\terr := createFilesystemStructure(testDir1, test.directories, test.files)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Error creating filesytem structure: %s\", err)\n\t\t\t}\n\n\t\t\ttestDir2 := t.TempDir()\n\t\t\terr = createFilesystemStructure(testDir2, test.directories, test.files)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Error creating filesytem structure: %s\", err)\n\t\t\t}\n\t\t\textraPath := path.Join(testDir2, test.extraDir)\n\t\t\terr = os.MkdirAll(extraPath, 0644)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Error creating filesytem structure: %s\", err)\n\t\t\t}\n\n\t\t\thash1, err := hashDirectory(testDir1, fileContext)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to calculate hash: %s\", err)\n\t\t\t}\n\t\t\thash2, err := hashDirectory(testDir2, fileContext)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to calculate hash: %s\", err)\n\t\t\t}\n\n\t\t\tif hash1 != hash2 {\n\t\t\t\tt.Errorf(\"Expected equal hashes, got: %s and %s\", hash1, hash2)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/executor/copy_multistage_test.go",
    "content": "/*\nCopyright 2020 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage executor\n\nimport (\n\t\"fmt\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/constants\"\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n)\n\nfunc readDirectory(dirName string) ([]fs.FileInfo, error) {\n\tentries, err := os.ReadDir(dirName)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\ttestDir := make([]fs.FileInfo, 0, len(entries))\n\n\tfor _, entry := range entries {\n\t\tinfo, err := entry.Info()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ttestDir = append(testDir, info)\n\t}\n\treturn testDir, err\n}\n\nfunc TestCopyCommand_Multistage(t *testing.T) {\n\tt.Run(\"copy a file across multistage\", func(t *testing.T) {\n\t\ttestDir, fn := setupMultistageTests(t)\n\t\tdefer fn()\n\t\tdockerFile := `\nFROM scratch as first\nCOPY foo/bam.txt copied/\nENV test test\n\nFrom scratch as second\nCOPY --from=first copied/bam.txt output/bam.txt`\n\t\tos.WriteFile(filepath.Join(testDir, \"workspace\", \"Dockerfile\"), []byte(dockerFile), 0755)\n\t\topts := &config.KanikoOptions{\n\t\t\tDockerfilePath: filepath.Join(testDir, \"workspace\", \"Dockerfile\"),\n\t\t\tSrcContext:     filepath.Join(testDir, \"workspace\"),\n\t\t\tSnapshotMode:   constants.SnapshotModeFull,\n\t\t}\n\t\t_, err := DoBuild(opts)\n\t\ttestutil.CheckNoError(t, err)\n\t\t// Check Image has one layer bam.txt\n\t\tfiles, err := readDirectory(filepath.Join(testDir, \"output\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckDeepEqual(t, 1, len(files))\n\t\ttestutil.CheckDeepEqual(t, files[0].Name(), \"bam.txt\")\n\n\t})\n\n\tt.Run(\"copy a file across multistage into a directory\", func(t *testing.T) {\n\t\ttestDir, fn := setupMultistageTests(t)\n\t\tdefer fn()\n\t\tdockerFile := `\nFROM scratch as first\nCOPY foo/bam.txt copied/\nENV test test\n\nFrom scratch as second\nCOPY --from=first copied/bam.txt output/`\n\t\tos.WriteFile(filepath.Join(testDir, \"workspace\", \"Dockerfile\"), []byte(dockerFile), 0755)\n\t\topts := &config.KanikoOptions{\n\t\t\tDockerfilePath: filepath.Join(testDir, \"workspace\", \"Dockerfile\"),\n\t\t\tSrcContext:     filepath.Join(testDir, \"workspace\"),\n\t\t\tSnapshotMode:   constants.SnapshotModeFull,\n\t\t}\n\t\t_, err := DoBuild(opts)\n\t\ttestutil.CheckNoError(t, err)\n\t\tfiles, err := readDirectory(filepath.Join(testDir, \"output\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckDeepEqual(t, 1, len(files))\n\t\ttestutil.CheckDeepEqual(t, files[0].Name(), \"bam.txt\")\n\t})\n\n\tt.Run(\"copy directory across multistage into a directory\", func(t *testing.T) {\n\t\ttestDir, fn := setupMultistageTests(t)\n\t\tdefer fn()\n\t\tdockerFile := `\nFROM scratch as first\nCOPY foo copied\nENV test test\n\nFrom scratch as second\nCOPY --from=first copied another`\n\t\tos.WriteFile(filepath.Join(testDir, \"workspace\", \"Dockerfile\"), []byte(dockerFile), 0755)\n\t\topts := &config.KanikoOptions{\n\t\t\tDockerfilePath: filepath.Join(testDir, \"workspace\", \"Dockerfile\"),\n\t\t\tSrcContext:     filepath.Join(testDir, \"workspace\"),\n\t\t\tSnapshotMode:   constants.SnapshotModeFull,\n\t\t}\n\t\t_, err := DoBuild(opts)\n\t\ttestutil.CheckNoError(t, err)\n\t\t// Check Image has one layer bam.txt\n\t\tfiles, err := readDirectory(filepath.Join(testDir, \"another\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckDeepEqual(t, 2, len(files))\n\t\ttestutil.CheckDeepEqual(t, files[0].Name(), \"bam.link\")\n\t\ttestutil.CheckDeepEqual(t, files[1].Name(), \"bam.txt\")\n\t\t// TODO fix this\n\t\t// path := filepath.Join(testDir, \"output/another\", \"bam.link\")\n\t\t//linkName, err := os.Readlink(path)\n\t\t//if err != nil {\n\t\t//\tt.Fatal(err)\n\t\t//}\n\t\t//testutil.CheckDeepEqual(t, linkName, \"bam.txt\")\n\t})\n\n\tt.Run(\"copy root across multistage\", func(t *testing.T) {\n\t\ttestDir, fn := setupMultistageTests(t)\n\t\tdefer fn()\n\t\tdockerFile := `\nFROM scratch as first\nCOPY foo copied\nENV test test\n\nFrom scratch as second\nCOPY --from=first / output/`\n\t\tos.WriteFile(filepath.Join(testDir, \"workspace\", \"Dockerfile\"), []byte(dockerFile), 0755)\n\t\topts := &config.KanikoOptions{\n\t\t\tDockerfilePath: filepath.Join(testDir, \"workspace\", \"Dockerfile\"),\n\t\t\tSrcContext:     filepath.Join(testDir, \"workspace\"),\n\t\t\tSnapshotMode:   constants.SnapshotModeFull,\n\t\t}\n\t\t_, err := DoBuild(opts)\n\t\ttestutil.CheckNoError(t, err)\n\n\t\tfilesUnderRoot, err := os.ReadDir(filepath.Join(testDir, \"output/\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckDeepEqual(t, 3, len(filesUnderRoot))\n\n\t\tfiles, err := os.ReadDir(filepath.Join(testDir, \"output/workspace/foo\"))\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ttestutil.CheckDeepEqual(t, 2, len(files))\n\t\ttestutil.CheckDeepEqual(t, \"bam.link\", files[0].Name())\n\t\ttestutil.CheckDeepEqual(t, \"bam.txt\", files[1].Name())\n\t})\n\n}\n\nfunc setupMultistageTests(t *testing.T) (string, func()) {\n\ttestDir := t.TempDir()\n\n\t// Create workspace with files, dirs, and symlinks\n\t// workspace tree:\n\t// /root\n\t//    /kaniko\n\t//    /workspace\n\t//     - /foo\n\t//          - bam.txt\n\t//          - bam.link -> bam.txt\n\t//     - /bin\n\t//          - exec.link -> ../exec\n\t//      exec\n\n\t// Make directory for stage or else the executor will create with permissions 0664\n\t// and we will run into issue https://github.com/golang/go/issues/22323\n\tif err := os.MkdirAll(filepath.Join(testDir, \"kaniko/0\"), 0755); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tworkspace := filepath.Join(testDir, \"workspace\")\n\t// Make foo\n\tif err := os.MkdirAll(filepath.Join(workspace, \"foo\"), 0755); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tfile := filepath.Join(workspace, \"foo\", \"bam.txt\")\n\tif err := os.WriteFile(file, []byte(\"meow\"), 0755); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tos.Symlink(\"bam.txt\", filepath.Join(workspace, \"foo\", \"bam.link\"))\n\n\t// Make a file with contents link\n\tfile = filepath.Join(workspace, \"exec\")\n\tif err := os.WriteFile(file, []byte(\"woof\"), 0755); err != nil {\n\t\tt.Fatal(err)\n\t}\n\t// Make bin\n\tif err := os.MkdirAll(filepath.Join(workspace, \"bin\"), 0755); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tos.Symlink(\"../exec\", filepath.Join(workspace, \"bin\", \"exec.link\"))\n\n\t// set up config\n\tconfig.RootDir = testDir\n\tconfig.KanikoDir = fmt.Sprintf(\"%s/%s\", testDir, \"kaniko\")\n\t// Write path to ignore list\n\tif err := os.MkdirAll(filepath.Join(testDir, \"proc\"), 0755); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tmFile := filepath.Join(testDir, \"proc/mountinfo\")\n\tmountInfo := fmt.Sprintf(\n\t\t`36 35 98:0 /kaniko %s/kaniko rw,noatime master:1 - ext3 /dev/root rw,errors=continue\n36 35 98:0 /proc %s/proc rw,noatime master:1 - ext3 /dev/root rw,errors=continue\n`, testDir, testDir)\n\tif err := os.WriteFile(mFile, []byte(mountInfo), 0644); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tconfig.MountInfoPath = mFile\n\treturn testDir, func() {\n\t\tconfig.RootDir = constants.RootDir\n\t\tconfig.MountInfoPath = constants.MountInfoPath\n\t}\n}\n"
  },
  {
    "path": "pkg/executor/fakes.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// for use in tests\npackage executor\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"io\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/commands\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/dockerfile\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/google/go-containerregistry/pkg/v1/types\"\n)\n\ntype fakeSnapShotter struct {\n\tfile        string\n\ttarPath     string\n\tinitialized bool\n}\n\nfunc (f *fakeSnapShotter) Init() error {\n\tf.initialized = true\n\treturn nil\n}\nfunc (f *fakeSnapShotter) TakeSnapshotFS() (string, error) {\n\treturn f.tarPath, nil\n}\nfunc (f *fakeSnapShotter) TakeSnapshot(_ []string, _, _ bool) (string, error) {\n\treturn f.tarPath, nil\n}\n\ntype MockDockerCommand struct {\n\tcommand             string\n\tcontextFiles        []string\n\tcacheCommand        commands.DockerCommand\n\targToCompositeCache bool\n}\n\nfunc (m MockDockerCommand) ExecuteCommand(c *v1.Config, args *dockerfile.BuildArgs) error { return nil }\nfunc (m MockDockerCommand) String() string {\n\treturn m.command\n}\nfunc (m MockDockerCommand) FilesToSnapshot() []string {\n\treturn []string{\"meow-snapshot-no-cache\"}\n}\nfunc (m MockDockerCommand) ProvidesFilesToSnapshot() bool {\n\treturn true\n}\nfunc (m MockDockerCommand) CacheCommand(image v1.Image) commands.DockerCommand {\n\treturn m.cacheCommand\n}\nfunc (m MockDockerCommand) FilesUsedFromContext(c *v1.Config, args *dockerfile.BuildArgs) ([]string, error) {\n\treturn m.contextFiles, nil\n}\nfunc (m MockDockerCommand) MetadataOnly() bool {\n\treturn false\n}\nfunc (m MockDockerCommand) RequiresUnpackedFS() bool {\n\treturn false\n}\nfunc (m MockDockerCommand) ShouldCacheOutput() bool {\n\treturn true\n}\nfunc (m MockDockerCommand) ShouldDetectDeletedFiles() bool {\n\treturn false\n}\nfunc (m MockDockerCommand) IsArgsEnvsRequiredInCache() bool {\n\treturn m.argToCompositeCache\n}\n\ntype MockCachedDockerCommand struct {\n\tcontextFiles        []string\n\targToCompositeCache bool\n}\n\nfunc (m MockCachedDockerCommand) ExecuteCommand(c *v1.Config, args *dockerfile.BuildArgs) error {\n\treturn nil\n}\nfunc (m MockCachedDockerCommand) String() string {\n\treturn \"meow\"\n}\nfunc (m MockCachedDockerCommand) FilesToSnapshot() []string {\n\treturn []string{\"meow-snapshot\"}\n}\nfunc (m MockCachedDockerCommand) ProvidesFilesToSnapshot() bool {\n\treturn true\n}\nfunc (m MockCachedDockerCommand) CacheCommand(image v1.Image) commands.DockerCommand {\n\treturn nil\n}\nfunc (m MockCachedDockerCommand) ShouldDetectDeletedFiles() bool {\n\treturn false\n}\nfunc (m MockCachedDockerCommand) FilesUsedFromContext(c *v1.Config, args *dockerfile.BuildArgs) ([]string, error) {\n\treturn m.contextFiles, nil\n}\nfunc (m MockCachedDockerCommand) MetadataOnly() bool {\n\treturn false\n}\nfunc (m MockCachedDockerCommand) RequiresUnpackedFS() bool {\n\treturn false\n}\nfunc (m MockCachedDockerCommand) ShouldCacheOutput() bool {\n\treturn false\n}\nfunc (m MockCachedDockerCommand) IsArgsEnvsRequiredInCache() bool {\n\treturn m.argToCompositeCache\n}\n\ntype fakeLayerCache struct {\n\tretrieve     bool\n\treceivedKeys []string\n\timg          v1.Image\n\tkeySequence  []string\n}\n\nfunc (f *fakeLayerCache) RetrieveLayer(key string) (v1.Image, error) {\n\tf.receivedKeys = append(f.receivedKeys, key)\n\tif len(f.keySequence) > 0 {\n\t\tif f.keySequence[0] == key {\n\t\t\tf.keySequence = f.keySequence[1:]\n\t\t\treturn f.img, nil\n\t\t}\n\t\treturn f.img, errors.New(\"could not find layer\")\n\t}\n\n\tif !f.retrieve {\n\t\treturn nil, errors.New(\"could not find layer\")\n\t}\n\treturn f.img, nil\n}\n\ntype fakeLayer struct {\n\tTarContent []byte\n\tmediaType  types.MediaType\n}\n\nfunc (f fakeLayer) Digest() (v1.Hash, error) {\n\treturn v1.Hash{}, nil\n}\nfunc (f fakeLayer) DiffID() (v1.Hash, error) {\n\treturn v1.Hash{}, nil\n}\nfunc (f fakeLayer) Compressed() (io.ReadCloser, error) {\n\treturn nil, nil\n}\nfunc (f fakeLayer) Uncompressed() (io.ReadCloser, error) {\n\treturn io.NopCloser(bytes.NewReader(f.TarContent)), nil\n}\nfunc (f fakeLayer) Size() (int64, error) {\n\treturn 0, nil\n}\nfunc (f fakeLayer) MediaType() (types.MediaType, error) {\n\treturn f.mediaType, nil\n}\n\ntype fakeImage struct {\n\tImageLayers []v1.Layer\n}\n\nfunc (f fakeImage) Layers() ([]v1.Layer, error) {\n\treturn f.ImageLayers, nil\n}\nfunc (f fakeImage) MediaType() (types.MediaType, error) {\n\treturn \"\", nil\n}\nfunc (f fakeImage) Size() (int64, error) {\n\treturn 0, nil\n}\nfunc (f fakeImage) ConfigName() (v1.Hash, error) {\n\treturn v1.Hash{}, nil\n}\nfunc (f fakeImage) ConfigFile() (*v1.ConfigFile, error) {\n\treturn &v1.ConfigFile{}, nil\n}\nfunc (f fakeImage) RawConfigFile() ([]byte, error) {\n\treturn []byte{}, nil\n}\nfunc (f fakeImage) Digest() (v1.Hash, error) {\n\treturn v1.Hash{}, nil\n}\nfunc (f fakeImage) Manifest() (*v1.Manifest, error) {\n\treturn &v1.Manifest{}, nil\n}\nfunc (f fakeImage) RawManifest() ([]byte, error) {\n\treturn []byte{}, nil\n}\nfunc (f fakeImage) LayerByDigest(v1.Hash) (v1.Layer, error) {\n\treturn fakeLayer{}, nil\n}\nfunc (f fakeImage) LayerByDiffID(v1.Hash) (v1.Layer, error) {\n\treturn fakeLayer{}, nil\n}\n\ntype ociFakeImage struct {\n\t*fakeImage\n}\n\nfunc (f ociFakeImage) MediaType() (types.MediaType, error) {\n\treturn types.OCIManifestSchema1, nil\n}\n\ntype dockerFakeImage struct {\n\t*fakeImage\n}\n\nfunc (f dockerFakeImage) MediaType() (types.MediaType, error) {\n\treturn types.DockerManifestSchema2, nil\n}\n"
  },
  {
    "path": "pkg/executor/push.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage executor\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/cache\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/constants\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/creds\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/timing\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/version\"\n\t\"github.com/google/go-containerregistry/pkg/name\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/google/go-containerregistry/pkg/v1/empty\"\n\t\"github.com/google/go-containerregistry/pkg/v1/layout\"\n\t\"github.com/google/go-containerregistry/pkg/v1/mutate\"\n\t\"github.com/google/go-containerregistry/pkg/v1/remote\"\n\t\"github.com/google/go-containerregistry/pkg/v1/remote/transport\"\n\t\"github.com/google/go-containerregistry/pkg/v1/tarball\"\n\t\"github.com/google/go-containerregistry/pkg/v1/types\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n\t\"github.com/spf13/afero\"\n)\n\ntype withUserAgent struct {\n\tt http.RoundTripper\n}\n\n// for testing\nvar (\n\tnewRetry          = transport.NewRetry\n\tDummyDestinations = []string{DummyDestination}\n)\n\nconst (\n\tUpstreamClientUaKey = \"UPSTREAM_CLIENT_TYPE\"\n\tDummyDestination    = \"docker.io/unset-repo/unset-image-name\"\n)\n\nvar (\n\t// known tag immutability errors\n\terrTagImmutable = []string{\n\t\t// https://cloud.google.com/artifact-registry/docs/docker/troubleshoot#push\n\t\t\"The repository has enabled tag immutability\",\n\t\t// https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-tag-mutability.html\n\t\t\"cannot be overwritten because the repository is immutable\",\n\t}\n)\n\nfunc (w *withUserAgent) RoundTrip(r *http.Request) (*http.Response, error) {\n\tua := []string{fmt.Sprintf(\"kaniko/%s\", version.Version())}\n\tif upstream := os.Getenv(UpstreamClientUaKey); upstream != \"\" {\n\t\tua = append(ua, upstream)\n\t}\n\tr.Header.Set(\"User-Agent\", strings.Join(ua, \",\"))\n\treturn w.t.RoundTrip(r)\n}\n\n// for testing\nvar (\n\tnewOsFs                   = afero.NewOsFs()\n\tcheckRemotePushPermission = remote.CheckPushPermission\n)\n\n// CheckPushPermissions checks that the configured credentials can be used to\n// push to every specified destination.\nfunc CheckPushPermissions(opts *config.KanikoOptions) error {\n\ttargets := opts.Destinations\n\t// When no push and no push cache are set, we don't need to check permissions\n\tif opts.SkipPushPermissionCheck {\n\t\ttargets = []string{}\n\t} else if opts.NoPush && opts.NoPushCache {\n\t\ttargets = []string{}\n\t} else if opts.NoPush && !opts.NoPushCache {\n\t\t// When no push is set, we want to check permissions for the cache repo\n\t\t// instead of the destinations\n\t\tif isOCILayout(opts.CacheRepo) {\n\t\t\ttargets = []string{} // no need to check push permissions if we're just writing to disk\n\t\t} else {\n\t\t\ttargets = []string{opts.CacheRepo}\n\t\t}\n\t}\n\n\tchecked := map[string]bool{}\n\tfor _, destination := range targets {\n\t\tdestRef, err := name.NewTag(destination, name.WeakValidation)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"getting tag for destination\")\n\t\t}\n\t\tif checked[destRef.Context().String()] {\n\t\t\tcontinue\n\t\t}\n\n\t\tregistryName := destRef.Repository.Registry.Name()\n\t\tif opts.Insecure || opts.InsecureRegistries.Contains(registryName) {\n\t\t\tnewReg, err := name.NewRegistry(registryName, name.WeakValidation, name.Insecure)\n\t\t\tif err != nil {\n\t\t\t\treturn errors.Wrap(err, \"getting new insecure registry\")\n\t\t\t}\n\t\t\tdestRef.Repository.Registry = newReg\n\t\t}\n\t\trt, err := util.MakeTransport(opts.RegistryOptions, registryName)\n\t\tif err != nil {\n\t\t\treturn errors.Wrapf(err, \"making transport for registry %q\", registryName)\n\t\t}\n\t\ttr := newRetry(rt)\n\t\tif err := checkRemotePushPermission(destRef, creds.GetKeychain(), tr); err != nil {\n\t\t\treturn errors.Wrapf(err, \"checking push permission for %q\", destRef)\n\t\t}\n\t\tchecked[destRef.Context().String()] = true\n\t}\n\treturn nil\n}\n\nfunc getDigest(image v1.Image) ([]byte, error) {\n\tdigest, err := image.Digest()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn []byte(digest.String()), nil\n}\n\nfunc writeDigestFile(path string, digestByteArray []byte) error {\n\tif strings.HasPrefix(path, \"https://\") {\n\t\t// Do a HTTP PUT to the URL; this could be a pre-signed URL to S3 or GCS or Azure\n\t\treq, err := http.NewRequest(\"PUT\", path, bytes.NewReader(digestByteArray)) //nolint:noctx\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treq.Header.Set(\"Content-Type\", \"text/plain\")\n\t\t_, err = http.DefaultClient.Do(req)\n\t\treturn err\n\t}\n\n\tparentDir := filepath.Dir(path)\n\tif _, err := os.Stat(parentDir); os.IsNotExist(err) {\n\t\tif err := os.MkdirAll(parentDir, 0700); err != nil {\n\t\t\tlogrus.Debugf(\"Error creating %s, %s\", parentDir, err)\n\t\t\treturn err\n\t\t}\n\t\tlogrus.Tracef(\"Created directory %v\", parentDir)\n\t}\n\treturn os.WriteFile(path, digestByteArray, 0644)\n}\n\n// DoPush is responsible for pushing image to the destinations specified in opts.\n// A dummy destination would be set when --no-push is set to true and --tar-path\n// is not empty with empty --destinations.\nfunc DoPush(image v1.Image, opts *config.KanikoOptions) error {\n\tt := timing.Start(\"Total Push Time\")\n\tvar digestByteArray []byte\n\tvar builder strings.Builder\n\n\tif !opts.NoPush && len(opts.Destinations) == 0 {\n\t\treturn errors.New(\"must provide at least one destination to push\")\n\t}\n\n\tif opts.DigestFile != \"\" || opts.ImageNameDigestFile != \"\" || opts.ImageNameTagDigestFile != \"\" {\n\t\tvar err error\n\t\tdigestByteArray, err = getDigest(image)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"error fetching digest\")\n\t\t}\n\t}\n\n\tif opts.DigestFile != \"\" {\n\t\terr := writeDigestFile(opts.DigestFile, digestByteArray)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"writing digest to file failed\")\n\t\t}\n\t}\n\n\tif opts.OCILayoutPath != \"\" {\n\t\tpath, err := layout.Write(opts.OCILayoutPath, empty.Index)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"writing empty layout\")\n\t\t}\n\t\tif err := path.AppendImage(image); err != nil {\n\t\t\treturn errors.Wrap(err, \"appending image\")\n\t\t}\n\t}\n\n\tif opts.NoPush && len(opts.Destinations) == 0 {\n\t\tif opts.TarPath != \"\" {\n\t\t\tsetDummyDestinations(opts)\n\t\t}\n\t}\n\n\tdestRefs := []name.Tag{}\n\tfor _, destination := range opts.Destinations {\n\t\tdestRef, err := name.NewTag(destination, name.WeakValidation)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"getting tag for destination\")\n\t\t}\n\t\tif opts.ImageNameDigestFile != \"\" || opts.ImageNameTagDigestFile != \"\" {\n\t\t\ttag := \"\"\n\t\t\tif opts.ImageNameTagDigestFile != \"\" && destRef.TagStr() != \"\" {\n\t\t\t\ttag = \":\" + destRef.TagStr()\n\t\t\t}\n\t\t\timageName := []byte(destRef.Repository.Name() + tag + \"@\")\n\t\t\tbuilder.Write(append(imageName, digestByteArray...))\n\t\t\tbuilder.WriteString(\"\\n\")\n\t\t}\n\t\tdestRefs = append(destRefs, destRef)\n\t}\n\n\tif opts.ImageNameDigestFile != \"\" {\n\t\terr := writeDigestFile(opts.ImageNameDigestFile, []byte(builder.String()))\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"writing image name with digest to file failed\")\n\t\t}\n\t}\n\n\tif opts.ImageNameTagDigestFile != \"\" {\n\t\terr := writeDigestFile(opts.ImageNameTagDigestFile, []byte(builder.String()))\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"writing image name with image tag and digest to file failed\")\n\t\t}\n\t}\n\n\tif opts.TarPath != \"\" {\n\t\ttagToImage := map[name.Tag]v1.Image{}\n\n\t\tfor _, destRef := range destRefs {\n\t\t\ttagToImage[destRef] = image\n\t\t}\n\t\terr := tarball.MultiWriteToFile(opts.TarPath, tagToImage)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"writing tarball to file failed\")\n\t\t}\n\t}\n\n\tif opts.NoPush {\n\t\tlogrus.Info(\"Skipping push to container registry due to --no-push flag\")\n\t\treturn nil\n\t}\n\n\t// continue pushing unless an error occurs\n\tfor _, destRef := range destRefs {\n\t\tregistryName := destRef.Repository.Registry.Name()\n\t\tif opts.Insecure || opts.InsecureRegistries.Contains(registryName) {\n\t\t\tnewReg, err := name.NewRegistry(registryName, name.WeakValidation, name.Insecure)\n\t\t\tif err != nil {\n\t\t\t\treturn errors.Wrap(err, \"getting new insecure registry\")\n\t\t\t}\n\t\t\tdestRef.Repository.Registry = newReg\n\t\t}\n\n\t\tpushAuth, err := creds.GetKeychain().Resolve(destRef.Context().Registry)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"resolving pushAuth\")\n\t\t}\n\n\t\tlocalRt, err := util.MakeTransport(opts.RegistryOptions, registryName)\n\t\tif err != nil {\n\t\t\treturn errors.Wrapf(err, \"making transport for registry %q\", registryName)\n\t\t}\n\t\ttr := newRetry(localRt)\n\t\trt := &withUserAgent{t: tr}\n\n\t\tlogrus.Infof(\"Pushing image to %s\", destRef.String())\n\n\t\tretryFunc := func() error {\n\t\t\tdig, err := image.Digest()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tdigest := destRef.Context().Digest(dig.String())\n\t\t\tif err := remote.Write(destRef, image, remote.WithAuth(pushAuth), remote.WithTransport(rt)); err != nil {\n\t\t\t\tif !opts.PushIgnoreImmutableTagErrors {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\n\t\t\t\t// check for known \"tag immutable\" errors\n\t\t\t\terrStr := err.Error()\n\t\t\t\tfor _, candidate := range errTagImmutable {\n\t\t\t\t\tif strings.Contains(errStr, candidate) {\n\t\t\t\t\t\tlogrus.Infof(\"Immutable tag error ignored for %s\", digest)\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tlogrus.Infof(\"Pushed %s\", digest)\n\t\t\treturn nil\n\t\t}\n\n\t\tif err := util.Retry(retryFunc, opts.PushRetry, 1000); err != nil {\n\t\t\treturn errors.Wrap(err, fmt.Sprintf(\"failed to push to destination %s\", destRef))\n\t\t}\n\t}\n\ttiming.DefaultRun.Stop(t)\n\treturn writeImageOutputs(image, destRefs)\n}\n\nfunc writeImageOutputs(image v1.Image, destRefs []name.Tag) error {\n\tdir := os.Getenv(\"BUILDER_OUTPUT\")\n\tif dir == \"\" {\n\t\treturn nil\n\t}\n\tf, err := newOsFs.Create(filepath.Join(dir, \"images\"))\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer f.Close()\n\n\td, err := image.Digest()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\ttype imageOutput struct {\n\t\tName   string `json:\"name\"`\n\t\tDigest string `json:\"digest\"`\n\t}\n\tfor _, r := range destRefs {\n\t\tif err := json.NewEncoder(f).Encode(imageOutput{\n\t\t\tName:   r.String(),\n\t\t\tDigest: d.String(),\n\t\t}); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// pushLayerToCache pushes layer (tagged with cacheKey) to opts.CacheRepo\n// if opts.CacheRepo doesn't exist, infer the cache from the given destination\nfunc pushLayerToCache(opts *config.KanikoOptions, cacheKey string, tarPath string, createdBy string) error {\n\tvar layerOpts []tarball.LayerOption\n\tif opts.CompressedCaching == true {\n\t\tlayerOpts = append(layerOpts, tarball.WithCompressedCaching)\n\t}\n\n\tif opts.CompressionLevel > 0 {\n\t\tlayerOpts = append(layerOpts, tarball.WithCompressionLevel(opts.CompressionLevel))\n\t}\n\n\tswitch opts.Compression {\n\tcase config.ZStd:\n\t\tlayerOpts = append(layerOpts, tarball.WithCompression(\"zstd\"), tarball.WithMediaType(types.OCILayerZStd))\n\n\tcase config.GZip:\n\t\t// layer already gzipped by default\n\t}\n\n\tlayer, err := tarball.LayerFromFile(tarPath, layerOpts...)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tcache, err := cache.Destination(opts, cacheKey)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"getting cache destination\")\n\t}\n\tlogrus.Infof(\"Pushing layer %s to cache now\", cache)\n\tempty := empty.Image\n\tempty, err = mutate.CreatedAt(empty, v1.Time{Time: time.Now()})\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"setting empty image created time\")\n\t}\n\n\tempty, err = mutate.Append(empty,\n\t\tmutate.Addendum{\n\t\t\tLayer: layer,\n\t\t\tHistory: v1.History{\n\t\t\t\tAuthor:    constants.Author,\n\t\t\t\tCreatedBy: createdBy,\n\t\t\t},\n\t\t},\n\t)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"appending layer onto empty image\")\n\t}\n\tcacheOpts := *opts\n\tcacheOpts.TarPath = \"\"              // tarPath doesn't make sense for Docker layers\n\tcacheOpts.NoPush = opts.NoPushCache // we do not want to push cache if --no-push-cache is set.\n\tcacheOpts.Destinations = []string{cache}\n\tcacheOpts.InsecureRegistries = opts.InsecureRegistries\n\tcacheOpts.SkipTLSVerifyRegistries = opts.SkipTLSVerifyRegistries\n\tif isOCILayout(cache) {\n\t\tcacheOpts.OCILayoutPath = strings.TrimPrefix(cache, \"oci:\")\n\t\tcacheOpts.NoPush = true\n\t}\n\treturn DoPush(empty, &cacheOpts)\n}\n\n// setDummyDestinations sets the dummy destinations required to generate new\n// tag names for tarPath in DoPush.\nfunc setDummyDestinations(opts *config.KanikoOptions) {\n\topts.Destinations = DummyDestinations\n}\n"
  },
  {
    "path": "pkg/executor/push_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage executor\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\t\"github.com/google/go-containerregistry/pkg/authn\"\n\t\"github.com/google/go-containerregistry/pkg/name\"\n\t\"github.com/google/go-containerregistry/pkg/v1/layout\"\n\t\"github.com/google/go-containerregistry/pkg/v1/random\"\n\t\"github.com/google/go-containerregistry/pkg/v1/validate\"\n\t\"github.com/spf13/afero\"\n)\n\nfunc mustTag(t *testing.T, s string) name.Tag {\n\ttag, err := name.NewTag(s, name.StrictValidation)\n\tif err != nil {\n\t\tt.Fatalf(\"NewTag: %v\", err)\n\t}\n\treturn tag\n}\n\nfunc TestWriteImageOutputs(t *testing.T) {\n\timg, err := random.Image(1024, 3)\n\tif err != nil {\n\t\tt.Fatalf(\"random.Image: %v\", err)\n\t}\n\td, err := img.Digest()\n\tif err != nil {\n\t\tt.Fatalf(\"Digest: %v\", err)\n\t}\n\n\tfor _, c := range []struct {\n\t\tdesc, env string\n\t\ttags      []name.Tag\n\t\twant      string\n\t}{{\n\t\tdesc: \"env unset, no output\",\n\t\tenv:  \"\",\n\t}, {\n\t\tdesc: \"env set, one tag\",\n\t\tenv:  \"/foo\",\n\t\ttags: []name.Tag{mustTag(t, \"gcr.io/foo/bar:latest\")},\n\t\twant: fmt.Sprintf(`{\"name\":\"gcr.io/foo/bar:latest\",\"digest\":%q}\n`, d),\n\t}, {\n\t\tdesc: \"env set, two tags\",\n\t\tenv:  \"/foo\",\n\t\ttags: []name.Tag{\n\t\t\tmustTag(t, \"gcr.io/foo/bar:latest\"),\n\t\t\tmustTag(t, \"gcr.io/baz/qux:latest\"),\n\t\t},\n\t\twant: fmt.Sprintf(`{\"name\":\"gcr.io/foo/bar:latest\",\"digest\":%q}\n{\"name\":\"gcr.io/baz/qux:latest\",\"digest\":%q}\n`, d, d),\n\t}} {\n\t\tt.Run(c.desc, func(t *testing.T) {\n\t\t\tnewOsFs = afero.NewMemMapFs()\n\t\t\tif c.want == \"\" {\n\t\t\t\tnewOsFs = afero.NewReadOnlyFs(newOsFs) // No files should be written.\n\t\t\t}\n\n\t\t\tos.Setenv(\"BUILDER_OUTPUT\", c.env)\n\t\t\tif err := writeImageOutputs(img, c.tags); err != nil {\n\t\t\t\tt.Fatalf(\"writeImageOutputs: %v\", err)\n\t\t\t}\n\n\t\t\tif c.want == \"\" {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tb, err := afero.ReadFile(newOsFs, filepath.Join(c.env, \"images\"))\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"ReadFile: %v\", err)\n\t\t\t}\n\n\t\t\tif got := string(b); got != c.want {\n\t\t\t\tt.Fatalf(\" got: %s\\nwant: %s\", got, c.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestHeaderAdded(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tupstream string\n\t\texpected string\n\t}{{\n\t\tname:     \"upstream env variable set\",\n\t\tupstream: \"skaffold-v0.25.45\",\n\t\texpected: \"kaniko/unset,skaffold-v0.25.45\",\n\t}, {\n\t\tname:     \"upstream env variable not set\",\n\t\texpected: \"kaniko/unset\",\n\t},\n\t}\n\tfor _, test := range tests {\n\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\trt := &withUserAgent{t: &mockRoundTripper{}}\n\t\t\tif test.upstream != \"\" {\n\t\t\t\tos.Setenv(\"UPSTREAM_CLIENT_TYPE\", test.upstream)\n\t\t\t\tdefer func() { os.Unsetenv(\"UPSTREAM_CLIENT_TYPE\") }()\n\t\t\t}\n\t\t\treq, err := http.NewRequest(\"GET\", \"dummy\", nil) //nolint:noctx\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"culd not create a req due to %s\", err)\n\t\t\t}\n\t\t\tresp, err := rt.RoundTrip(req)\n\t\t\ttestutil.CheckError(t, false, err)\n\t\t\tdefer resp.Body.Close()\n\t\t\tbody, err := io.ReadAll(resp.Body)\n\t\t\ttestutil.CheckErrorAndDeepEqual(t, false, err, test.expected, string(body))\n\t\t})\n\t}\n\n}\n\ntype mockRoundTripper struct {\n}\n\nfunc (m *mockRoundTripper) RoundTrip(r *http.Request) (*http.Response, error) {\n\tua := r.UserAgent()\n\treturn &http.Response{Body: io.NopCloser(bytes.NewBufferString(ua))}, nil\n}\n\nfunc TestOCILayoutPath(t *testing.T) {\n\ttmpDir := t.TempDir()\n\n\timage, err := random.Image(1024, 4)\n\tif err != nil {\n\t\tt.Fatalf(\"could not create image: %s\", err)\n\t}\n\n\tdigest, err := image.Digest()\n\tif err != nil {\n\t\tt.Fatalf(\"could not get image digest: %s\", err)\n\t}\n\n\twant, err := image.Manifest()\n\tif err != nil {\n\t\tt.Fatalf(\"could not get image manifest: %s\", err)\n\t}\n\n\topts := config.KanikoOptions{\n\t\tNoPush:        true,\n\t\tOCILayoutPath: tmpDir,\n\t}\n\n\tif err := DoPush(image, &opts); err != nil {\n\t\tt.Fatalf(\"could not push image: %s\", err)\n\t}\n\n\tlayoutIndex, err := layout.ImageIndexFromPath(tmpDir)\n\tif err != nil {\n\t\tt.Fatalf(\"could not get index from layout: %s\", err)\n\t}\n\ttestutil.CheckError(t, false, validate.Index(layoutIndex))\n\n\tlayoutImage, err := layoutIndex.Image(digest)\n\tif err != nil {\n\t\tt.Fatalf(\"could not get image from layout: %s\", err)\n\t}\n\n\tgot, err := layoutImage.Manifest()\n\ttestutil.CheckErrorAndDeepEqual(t, false, err, want, got)\n}\n\nfunc TestImageNameDigestFile(t *testing.T) {\n\timage, err := random.Image(1024, 4)\n\tif err != nil {\n\t\tt.Fatalf(\"could not create image: %s\", err)\n\t}\n\n\tdigest, err := image.Digest()\n\tif err != nil {\n\t\tt.Fatalf(\"could not get image digest: %s\", err)\n\t}\n\n\topts := config.KanikoOptions{\n\t\tNoPush:              true,\n\t\tDestinations:        []string{\"gcr.io/foo/bar:latest\", \"bob/image\"},\n\t\tImageNameDigestFile: \"tmpFile\",\n\t}\n\n\tdefer os.Remove(\"tmpFile\")\n\n\tif err := DoPush(image, &opts); err != nil {\n\t\tt.Fatalf(\"could not push image: %s\", err)\n\t}\n\n\twant := []byte(\"gcr.io/foo/bar@\" + digest.String() + \"\\nindex.docker.io/bob/image@\" + digest.String() + \"\\n\")\n\n\tgot, err := os.ReadFile(\"tmpFile\")\n\n\ttestutil.CheckErrorAndDeepEqual(t, false, err, want, got)\n\n}\n\nfunc TestDoPushWithOpts(t *testing.T) {\n\ttarPath := \"image.tar\"\n\n\tfor _, tc := range []struct {\n\t\tname        string\n\t\topts        config.KanikoOptions\n\t\texpectedErr bool\n\t}{\n\t\t{\n\t\t\tname: \"no push with tarPath without destinations\",\n\t\t\topts: config.KanikoOptions{\n\t\t\t\tNoPush:  true,\n\t\t\t\tTarPath: tarPath,\n\t\t\t},\n\t\t\texpectedErr: false,\n\t\t}, {\n\t\t\tname: \"no push with tarPath with destinations\",\n\t\t\topts: config.KanikoOptions{\n\t\t\t\tNoPush:       true,\n\t\t\t\tTarPath:      tarPath,\n\t\t\t\tDestinations: []string{\"image\"},\n\t\t\t},\n\t\t\texpectedErr: false,\n\t\t}, {\n\t\t\tname: \"no push with tarPath with destinations empty\",\n\t\t\topts: config.KanikoOptions{\n\t\t\t\tNoPush:       true,\n\t\t\t\tTarPath:      tarPath,\n\t\t\t\tDestinations: []string{},\n\t\t\t},\n\t\t\texpectedErr: false,\n\t\t}, {\n\t\t\tname: \"tarPath with destinations empty\",\n\t\t\topts: config.KanikoOptions{\n\t\t\t\tNoPush:       false,\n\t\t\t\tTarPath:      tarPath,\n\t\t\t\tDestinations: []string{},\n\t\t\t},\n\t\t\texpectedErr: true,\n\t\t}} {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\timage, err := random.Image(1024, 4)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"could not create image: %s\", err)\n\t\t\t}\n\t\t\tdefer os.Remove(\"image.tar\")\n\n\t\t\terr = DoPush(image, &tc.opts)\n\t\t\tif err != nil {\n\t\t\t\tif !tc.expectedErr {\n\t\t\t\t\tt.Errorf(\"unexpected error with opts: could not push image: %s\", err)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif tc.expectedErr {\n\t\t\t\t\tt.Error(\"expected error with opts not found\")\n\t\t\t\t}\n\t\t\t}\n\n\t\t})\n\t}\n}\n\nfunc TestImageNameTagDigestFile(t *testing.T) {\n\timage, err := random.Image(1024, 4)\n\tif err != nil {\n\t\tt.Fatalf(\"could not create image: %s\", err)\n\t}\n\n\tdigest, err := image.Digest()\n\tif err != nil {\n\t\tt.Fatalf(\"could not get image digest: %s\", err)\n\t}\n\n\topts := config.KanikoOptions{\n\t\tNoPush:                 true,\n\t\tDestinations:           []string{\"gcr.io/foo/bar:123\", \"bob/image\"},\n\t\tImageNameTagDigestFile: \"tmpFile\",\n\t}\n\n\tdefer os.Remove(\"tmpFile\")\n\n\tif err := DoPush(image, &opts); err != nil {\n\t\tt.Fatalf(\"could not push image: %s\", err)\n\t}\n\n\twant := []byte(\"gcr.io/foo/bar:123@\" + digest.String() + \"\\nindex.docker.io/bob/image:latest@\" + digest.String() + \"\\n\")\n\n\tgot, err := os.ReadFile(\"tmpFile\")\n\n\ttestutil.CheckErrorAndDeepEqual(t, false, err, want, got)\n}\n\nvar checkPushPermsCallCount = 0\n\nfunc resetCalledCount() {\n\tcheckPushPermsCallCount = 0\n}\n\nfunc fakeCheckPushPermission(ref name.Reference, kc authn.Keychain, t http.RoundTripper) error {\n\tcheckPushPermsCallCount++\n\treturn nil\n}\n\nfunc TestCheckPushPermissions(t *testing.T) {\n\ttests := []struct {\n\t\tdescription                     string\n\t\tcacheRepo                       string\n\t\tcheckPushPermsExpectedCallCount int\n\t\tdestinations                    []string\n\t\texistingConfig                  bool\n\t\tnoPush                          bool\n\t\tnoPushCache                     bool\n\t}{\n\t\t{description: \"a gcr image without config\", destinations: []string{\"gcr.io/test-image\"}, checkPushPermsExpectedCallCount: 1},\n\t\t{description: \"a gcr image with config\", destinations: []string{\"gcr.io/test-image\"}, existingConfig: true, checkPushPermsExpectedCallCount: 1},\n\t\t{description: \"a pkg.dev image without config\", destinations: []string{\"us-docker.pkg.dev/test-image\"}, checkPushPermsExpectedCallCount: 1},\n\t\t{description: \"a pkg.dev image with config\", destinations: []string{\"us-docker.pkg.dev/test-image\"}, existingConfig: true, checkPushPermsExpectedCallCount: 1},\n\t\t{description: \"localhost registry without config\", destinations: []string{\"localhost:5000/test-image\"}, checkPushPermsExpectedCallCount: 1},\n\t\t{description: \"localhost registry with config\", destinations: []string{\"localhost:5000/test-image\"}, existingConfig: true, checkPushPermsExpectedCallCount: 1},\n\t\t{description: \"any other registry\", destinations: []string{\"notgcr.io/test-image\"}, checkPushPermsExpectedCallCount: 1},\n\t\t{\n\t\t\tdescription: \"multiple destinations pushed to different registry\",\n\t\t\tdestinations: []string{\n\t\t\t\t\"us-central1-docker.pkg.dev/prj/test-image\",\n\t\t\t\t\"us-west-docker.pkg.dev/prj/test-image\",\n\t\t\t},\n\t\t\tcheckPushPermsExpectedCallCount: 2,\n\t\t},\n\t\t{\n\t\t\tdescription: \"same image names with different tags\",\n\t\t\tdestinations: []string{\n\t\t\t\t\"us-central1-docker.pkg.dev/prj/test-image:tag1\",\n\t\t\t\t\"us-central1-docker.pkg.dev/prj/test-image:tag2\",\n\t\t\t},\n\t\t\tcheckPushPermsExpectedCallCount: 1,\n\t\t},\n\t\t{\n\t\t\tdescription: \"same destination image multiple times\",\n\t\t\tdestinations: []string{\n\t\t\t\t\"us-central1-docker.pkg.dev/prj/test-image\",\n\t\t\t\t\"us-central1-docker.pkg.dev/prj/test-image\",\n\t\t\t},\n\t\t\tcheckPushPermsExpectedCallCount: 1,\n\t\t},\n\t\t{\n\t\t\tdescription:                     \"no push and no push cache\",\n\t\t\tdestinations:                    []string{\"us-central1-docker.pkg.dev/prj/test-image\"},\n\t\t\tcheckPushPermsExpectedCallCount: 0,\n\t\t\tnoPush:                          true,\n\t\t\tnoPushCache:                     true,\n\t\t},\n\t\t{\n\t\t\tdescription:                     \"no push and push cache\",\n\t\t\tdestinations:                    []string{\"us-central1-docker.pkg.dev/prj/test-image\"},\n\t\t\tcacheRepo:                       \"us-central1-docker.pkg.dev/prj/cache-image\",\n\t\t\tcheckPushPermsExpectedCallCount: 1,\n\t\t\tnoPush:                          true,\n\t\t},\n\t\t{\n\t\t\tdescription:                     \"no push and cache repo is OCI image layout\",\n\t\t\tdestinations:                    []string{\"us-central1-docker.pkg.dev/prj/test-image\"},\n\t\t\tcacheRepo:                       \"oci:/some-layout-path\",\n\t\t\tcheckPushPermsExpectedCallCount: 0,\n\t\t\tnoPush:                          true,\n\t\t},\n\t}\n\n\tcheckRemotePushPermission = fakeCheckPushPermission\n\tfor _, test := range tests {\n\t\tt.Run(test.description, func(t *testing.T) {\n\t\t\tresetCalledCount()\n\t\t\tnewOsFs = afero.NewMemMapFs()\n\t\t\topts := config.KanikoOptions{\n\t\t\t\tCacheRepo:    test.cacheRepo,\n\t\t\t\tDestinations: test.destinations,\n\t\t\t\tNoPush:       test.noPush,\n\t\t\t\tNoPushCache:  test.noPushCache,\n\t\t\t}\n\t\t\tif test.existingConfig {\n\t\t\t\tafero.WriteFile(newOsFs, util.DockerConfLocation(), []byte(\"\"), os.FileMode(0644))\n\t\t\t\tdefer newOsFs.Remove(util.DockerConfLocation())\n\t\t\t}\n\t\t\tCheckPushPermissions(&opts)\n\t\t\tif checkPushPermsCallCount != test.checkPushPermsExpectedCallCount {\n\t\t\t\tt.Errorf(\"expected check push permissions call count to be %d but it was %d\", test.checkPushPermsExpectedCallCount, checkPushPermsCallCount)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSkipPushPermission(t *testing.T) {\n\ttests := []struct {\n\t\tdescription                     string\n\t\tcacheRepo                       string\n\t\tcheckPushPermsExpectedCallCount int\n\t\tdestinations                    []string\n\t\texistingConfig                  bool\n\t\tnoPush                          bool\n\t\tnoPushCache                     bool\n\t\tskipPushPermission              bool\n\t}{\n\t\t{description: \"skip push permission enabled\", destinations: []string{\"test.io/skip\"}, checkPushPermsExpectedCallCount: 0, skipPushPermission: true},\n\t\t{description: \"skip push permission disabled\", destinations: []string{\"test.io/push\"}, checkPushPermsExpectedCallCount: 1, skipPushPermission: false},\n\t}\n\n\tcheckRemotePushPermission = fakeCheckPushPermission\n\tfor _, test := range tests {\n\t\tt.Run(test.description, func(t *testing.T) {\n\t\t\tresetCalledCount()\n\t\t\tnewOsFs = afero.NewMemMapFs()\n\t\t\topts := config.KanikoOptions{\n\t\t\t\tCacheRepo:               test.cacheRepo,\n\t\t\t\tDestinations:            test.destinations,\n\t\t\t\tNoPush:                  test.noPush,\n\t\t\t\tNoPushCache:             test.noPushCache,\n\t\t\t\tSkipPushPermissionCheck: test.skipPushPermission,\n\t\t\t}\n\t\t\tif test.existingConfig {\n\t\t\t\tafero.WriteFile(newOsFs, util.DockerConfLocation(), []byte(\"\"), os.FileMode(0644))\n\t\t\t\tdefer newOsFs.Remove(util.DockerConfLocation())\n\t\t\t}\n\t\t\tCheckPushPermissions(&opts)\n\t\t\tif checkPushPermsCallCount != test.checkPushPermsExpectedCallCount {\n\t\t\t\tt.Errorf(\"expected check push permissions call count to be %d but it was %d\", test.checkPushPermsExpectedCallCount, checkPushPermsCallCount)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestHelperProcess(t *testing.T) {\n\tif os.Getenv(\"GO_WANT_HELPER_PROCESS\") != \"1\" {\n\t\treturn\n\t}\n\tfmt.Fprintf(os.Stdout, \"fake result\")\n\tos.Exit(0)\n}\n\nfunc TestWriteDigestFile(t *testing.T) {\n\ttmpDir := t.TempDir()\n\n\tt.Run(\"parent directory does not exist\", func(t *testing.T) {\n\t\terr := writeDigestFile(tmpDir+\"/test/df\", []byte(\"test\"))\n\t\tif err != nil {\n\t\t\tt.Errorf(\"expected file to be written successfully, but got error: %v\", err)\n\t\t}\n\t})\n\n\tt.Run(\"parent directory exists\", func(t *testing.T) {\n\t\terr := writeDigestFile(tmpDir+\"/df\", []byte(\"test\"))\n\t\tif err != nil {\n\t\t\tt.Errorf(\"expected file to be written successfully, but got error: %v\", err)\n\t\t}\n\t})\n\n\tt.Run(\"https PUT OK\", func(t *testing.T) {\n\t\tvar uploadedContent []byte\n\n\t\t// Start a test server that checks the PUT request.\n\t\tserver := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\t\tif r.Method != http.MethodPut {\n\t\t\t\tw.WriteHeader(http.StatusMethodNotAllowed)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tuploadedContent, _ = io.ReadAll(r.Body)\n\t\t\tw.WriteHeader(http.StatusNoContent)\n\t\t}))\n\t\tdefer server.Close()\n\n\t\t// Temporarily replace the default client with the test server client to avoid TLS verification errors.\n\t\toldClient := http.DefaultClient\n\t\tdefer func() { http.DefaultClient = oldClient }()\n\t\thttp.DefaultClient = server.Client()\n\n\t\terr := writeDigestFile(server.URL+\"/df?sig=1234\", []byte(\"test\"))\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"expected file to be written successfully, but got error: %v\", err)\n\t\t}\n\t\tif string(uploadedContent) != \"test\" {\n\t\t\tt.Errorf(\"expected uploaded content to be 'test', but got '%s'\", uploadedContent)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "pkg/fakes/image.go",
    "content": "/*\nCopyright 2019 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage fakes\n\nimport (\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/google/go-containerregistry/pkg/v1/types\"\n)\n\ntype FakeImage struct {\n\tHash v1.Hash\n}\n\nfunc (f FakeImage) Layers() ([]v1.Layer, error) {\n\treturn nil, nil\n}\nfunc (f FakeImage) MediaType() (types.MediaType, error) {\n\treturn \"\", nil\n}\nfunc (f FakeImage) Size() (int64, error) {\n\treturn 0, nil\n}\nfunc (f FakeImage) ConfigName() (v1.Hash, error) {\n\treturn v1.Hash{}, nil\n}\nfunc (f FakeImage) ConfigFile() (*v1.ConfigFile, error) {\n\treturn &v1.ConfigFile{}, nil\n}\nfunc (f FakeImage) RawConfigFile() ([]byte, error) {\n\treturn []byte{}, nil\n}\nfunc (f FakeImage) Digest() (v1.Hash, error) {\n\treturn f.Hash, nil\n}\nfunc (f FakeImage) Manifest() (*v1.Manifest, error) {\n\treturn &v1.Manifest{}, nil\n}\nfunc (f FakeImage) RawManifest() ([]byte, error) {\n\treturn []byte{}, nil\n}\nfunc (f FakeImage) LayerByDigest(v1.Hash) (v1.Layer, error) {\n\treturn nil, nil\n}\nfunc (f FakeImage) LayerByDiffID(v1.Hash) (v1.Layer, error) {\n\treturn nil, nil\n}\n"
  },
  {
    "path": "pkg/filesystem/resolve.go",
    "content": "/*\nCopyright 2020 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage filesystem\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n)\n\n// ResolvePaths takes a slice of file paths and a list of skipped file paths. It resolve each\n// file path according to a set of rules and then returns a slice of resolved paths or error.\n// File paths are resolved according to the following rules:\n// * If path is in ignorelist, skip it.\n// * If path is a symlink, resolve it's ancestor link and add it to the output set.\n// * If path is a symlink, resolve it's target. If the target is not ignored add it to the\n// output set.\n// * Add all ancestors of each path to the output set.\nfunc ResolvePaths(paths []string, wl []util.IgnoreListEntry) (pathsToAdd []string, err error) {\n\tlogrus.Tracef(\"Resolving paths %s\", paths)\n\n\tfileSet := make(map[string]bool)\n\n\tfor _, f := range paths {\n\t\t// If the given path is part of the ignorelist ignore it\n\t\tif util.IsInProvidedIgnoreList(f, wl) {\n\t\t\tlogrus.Debugf(\"Path %s is in list to ignore, ignoring it\", f)\n\t\t\tcontinue\n\t\t}\n\n\t\tlink, e := resolveSymlinkAncestor(f)\n\t\tif e != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tif f != link {\n\t\t\tlogrus.Tracef(\"Updated link %s to %s\", f, link)\n\t\t}\n\n\t\tif !fileSet[link] {\n\t\t\tpathsToAdd = append(pathsToAdd, link)\n\t\t}\n\t\tfileSet[link] = true\n\n\t\tvar evaled string\n\n\t\t// If the path is a symlink we need to also consider the target of that\n\t\t// link\n\t\tevaled, e = filepath.EvalSymlinks(f)\n\t\tif e != nil {\n\t\t\tif !os.IsNotExist(e) {\n\t\t\t\tlogrus.Errorf(\"Couldn't eval %s with link %s\", f, link)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlogrus.Tracef(\"Symlink path %s, target does not exist\", f)\n\t\t\tcontinue\n\t\t}\n\t\tif f != evaled {\n\t\t\tlogrus.Tracef(\"Resolved symlink %s to %s\", f, evaled)\n\t\t}\n\n\t\t// If the given path is a symlink and the target is part of the ignorelist\n\t\t// ignore the target\n\t\tif util.CheckCleanedPathAgainstProvidedIgnoreList(evaled, wl) {\n\t\t\tlogrus.Debugf(\"Path %s is ignored, ignoring it\", evaled)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !fileSet[evaled] {\n\t\t\tpathsToAdd = append(pathsToAdd, evaled)\n\t\t}\n\t\tfileSet[evaled] = true\n\t}\n\n\t// Also add parent directories to keep the permission of them correctly.\n\tpathsToAdd = filesWithParentDirs(pathsToAdd)\n\treturn\n}\n\n// filesWithParentDirs returns every ancestor path for each provided file path.\n// I.E. /foo/bar/baz/boom.txt => [/, /foo, /foo/bar, /foo/bar/baz, /foo/bar/baz/boom.txt]\nfunc filesWithParentDirs(files []string) []string {\n\tfilesSet := map[string]bool{}\n\n\tfor _, file := range files {\n\t\tfile = filepath.Clean(file)\n\t\tfilesSet[file] = true\n\n\t\tfor _, dir := range util.ParentDirectories(file) {\n\t\t\tdir = filepath.Clean(dir)\n\t\t\tfilesSet[dir] = true\n\t\t}\n\t}\n\n\tnewFiles := []string{}\n\tfor file := range filesSet {\n\t\tnewFiles = append(newFiles, file)\n\t}\n\n\treturn newFiles\n}\n\n// resolveSymlinkAncestor returns the ancestor link of the provided symlink path or returns the\n// path if it is not a link. The ancestor link is the filenode whose type is a Symlink.\n// E.G /baz/boom/bar.txt links to /usr/bin/bar.txt but /baz/boom/bar.txt itself is not a link.\n// Instead /bar/boom is actually a link to /usr/bin. In this case resolveSymlinkAncestor would\n// return /bar/boom.\nfunc resolveSymlinkAncestor(path string) (string, error) {\n\tif !filepath.IsAbs(path) {\n\t\treturn \"\", errors.New(\"dest path must be abs\")\n\t}\n\n\tlast := \"\"\n\tnewPath := filepath.Clean(path)\n\nloop:\n\tfor newPath != config.RootDir {\n\t\tfi, err := os.Lstat(newPath)\n\t\tif err != nil {\n\t\t\treturn \"\", errors.Wrap(err, \"resolvePaths: failed to lstat\")\n\t\t}\n\n\t\tif util.IsSymlink(fi) {\n\t\t\tlast = filepath.Base(newPath)\n\t\t\tnewPath = filepath.Dir(newPath)\n\t\t} else {\n\t\t\t// Even if the filenode pointed to by newPath is a regular file,\n\t\t\t// one of its ancestors could be a symlink. We call filepath.EvalSymlinks\n\t\t\t// to test whether there are any links in the path. If the output of\n\t\t\t// EvalSymlinks is different than the input we know one of the nodes in the\n\t\t\t// path is a link.\n\t\t\ttarget, err := filepath.EvalSymlinks(newPath)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t\tif target != newPath {\n\t\t\t\tlast = filepath.Base(newPath)\n\t\t\t\tnewPath = filepath.Dir(newPath)\n\t\t\t} else {\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t}\n\t}\n\tnewPath = filepath.Join(newPath, last)\n\treturn filepath.Clean(newPath), nil\n}\n"
  },
  {
    "path": "pkg/filesystem/resolve_test.go",
    "content": "/*\nCopyright 2020 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage filesystem\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"sort\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n)\n\nfunc Test_ResolvePaths(t *testing.T) {\n\tvalidateResults := func(\n\t\tt *testing.T,\n\t\tactualFiles,\n\t\texpectedFiles []string,\n\t\terr error,\n\t) {\n\t\tif err != nil {\n\t\t\tt.Errorf(\"expected err to be nil but was %s\", err)\n\t\t}\n\n\t\t// Sort so that comparison is against consistent order\n\t\tsort.Strings(actualFiles)\n\t\tsort.Strings(expectedFiles)\n\n\t\tif !reflect.DeepEqual(actualFiles, expectedFiles) {\n\t\t\tt.Errorf(\"expected files to equal %s but was %s\",\n\t\t\t\texpectedFiles, actualFiles,\n\t\t\t)\n\t\t}\n\t}\n\n\tt.Run(\"list of files\", func(t *testing.T) {\n\t\tdir := t.TempDir()\n\n\t\tfiles := []string{\n\t\t\t\"/foo/bar.txt\",\n\t\t\t\"/baz/boom.txt\",\n\t\t}\n\n\t\tt.Run(\"all are symlinks\", func(t *testing.T) {\n\t\t\tfor _, f := range files {\n\t\t\t\tfLink := filepath.Join(dir, \"link\", f)\n\t\t\t\tfTarget := filepath.Join(dir, \"target\", f)\n\n\t\t\t\tif err := os.MkdirAll(filepath.Dir(fTarget), 0777); err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\tif err := os.WriteFile(fTarget, []byte{}, 0777); err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\tif err := os.MkdirAll(filepath.Dir(fLink), 0777); err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\tif err := os.Symlink(fTarget, fLink); err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tt.Run(\"none are ignored\", func(t *testing.T) {\n\t\t\t\twl := []util.IgnoreListEntry{}\n\n\t\t\t\tinputFiles := []string{}\n\t\t\t\texpectedFiles := []string{}\n\n\t\t\t\tfor _, f := range files {\n\t\t\t\t\tlink := filepath.Join(dir, \"link\", f)\n\t\t\t\t\texpectedFiles = append(expectedFiles, link)\n\t\t\t\t\tinputFiles = append(inputFiles, link)\n\n\t\t\t\t\ttarget := filepath.Join(dir, \"target\", f)\n\t\t\t\t\texpectedFiles = append(expectedFiles, target)\n\t\t\t\t}\n\n\t\t\t\texpectedFiles = filesWithParentDirs(expectedFiles)\n\n\t\t\t\tfiles, err := ResolvePaths(inputFiles, wl)\n\n\t\t\t\tvalidateResults(t, files, expectedFiles, err)\n\t\t\t})\n\n\t\t\tt.Run(\"some are ignored\", func(t *testing.T) {\n\t\t\t\twl := []util.IgnoreListEntry{\n\t\t\t\t\t{\n\t\t\t\t\t\tPath: filepath.Join(dir, \"link\", \"baz\"),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tPath: filepath.Join(dir, \"target\", \"foo\"),\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\texpectedFiles := []string{}\n\t\t\t\tinputFiles := []string{}\n\n\t\t\t\tfor _, f := range files {\n\t\t\t\t\tlink := filepath.Join(dir, \"link\", f)\n\t\t\t\t\tinputFiles = append(inputFiles, link)\n\n\t\t\t\t\tif util.IsInProvidedIgnoreList(link, wl) {\n\t\t\t\t\t\tt.Logf(\"skipping %s\", link)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\texpectedFiles = append(expectedFiles, link)\n\n\t\t\t\t\ttarget := filepath.Join(dir, \"target\", f)\n\n\t\t\t\t\tif util.IsInProvidedIgnoreList(target, wl) {\n\t\t\t\t\t\tt.Logf(\"skipping %s\", target)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\texpectedFiles = append(expectedFiles, target)\n\t\t\t\t}\n\n\t\t\t\tlink := filepath.Join(dir, \"link\", \"zoom/\")\n\n\t\t\t\ttarget := filepath.Join(dir, \"target\", \"zaam/\")\n\t\t\t\tif err := os.MkdirAll(target, 0777); err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\tif err := os.WriteFile(filepath.Join(target, \"meow.txt\"), []byte{}, 0777); err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\tif err := os.Symlink(target, link); err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\n\t\t\t\tfile := filepath.Join(link, \"meow.txt\")\n\t\t\t\tinputFiles = append(inputFiles, file)\n\n\t\t\t\texpectedFiles = append(expectedFiles, link)\n\n\t\t\t\ttargetFile := filepath.Join(target, \"meow.txt\")\n\t\t\t\texpectedFiles = append(expectedFiles, targetFile)\n\n\t\t\t\texpectedFiles = filesWithParentDirs(expectedFiles)\n\n\t\t\t\tfiles, err := ResolvePaths(inputFiles, wl)\n\n\t\t\t\tvalidateResults(t, files, expectedFiles, err)\n\t\t\t})\n\t\t})\n\t})\n\n\tt.Run(\"empty set of files\", func(t *testing.T) {\n\t\tinputFiles := []string{}\n\t\texpectedFiles := []string{}\n\n\t\twl := []util.IgnoreListEntry{}\n\n\t\tfiles, err := ResolvePaths(inputFiles, wl)\n\n\t\tvalidateResults(t, files, expectedFiles, err)\n\t})\n}\n\nfunc Test_resolveSymlinkAncestor(t *testing.T) {\n\tsetupDirs := func(t *testing.T) (string, string) {\n\t\ttestDir := t.TempDir()\n\n\t\ttargetDir := filepath.Join(testDir, \"bar\", \"baz\")\n\n\t\tif err := os.MkdirAll(targetDir, 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\ttargetPath := filepath.Join(targetDir, \"bam.txt\")\n\n\t\tif err := os.WriteFile(targetPath, []byte(\"meow\"), 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\treturn testDir, targetPath\n\t}\n\n\tt.Run(\"path is a symlink\", func(t *testing.T) {\n\t\ttestDir, targetPath := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\n\t\tlinkDir := filepath.Join(testDir, \"foo\", \"buzz\")\n\n\t\tif err := os.MkdirAll(linkDir, 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tlinkPath := filepath.Join(linkDir, \"zoom.txt\")\n\n\t\tif err := os.Symlink(targetPath, linkPath); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\texpected := linkPath\n\n\t\tactual, err := resolveSymlinkAncestor(linkPath)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"expected err to be nil but was %s\", err)\n\t\t}\n\n\t\tif actual != expected {\n\t\t\tt.Errorf(\"expected result to be %s not %s\", expected, actual)\n\t\t}\n\t})\n\n\tt.Run(\"dir ends with / is not a symlink\", func(t *testing.T) {\n\t\ttestDir, _ := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\n\t\tlinkDir := filepath.Join(testDir, \"var\", \"www\")\n\t\tif err := os.MkdirAll(linkDir, 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\texpected := linkDir\n\n\t\tactual, err := resolveSymlinkAncestor(fmt.Sprintf(\"%s/\", linkDir))\n\t\tif err != nil {\n\t\t\tt.Errorf(\"expected err to be nil but was %s\", err)\n\t\t}\n\n\t\tif actual != expected {\n\t\t\tt.Errorf(\"expected result to be %s not %s\", expected, actual)\n\t\t}\n\t})\n\n\tt.Run(\"path is a dead symlink\", func(t *testing.T) {\n\t\ttestDir, targetPath := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\n\t\tlinkDir := filepath.Join(testDir, \"foo\", \"buzz\")\n\n\t\tif err := os.MkdirAll(linkDir, 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tlinkPath := filepath.Join(linkDir, \"zoom.txt\")\n\n\t\tif err := os.Symlink(targetPath, linkPath); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tif err := os.Remove(targetPath); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\texpected := linkPath\n\n\t\tactual, err := resolveSymlinkAncestor(linkPath)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"expected err to be nil but was %s\", err)\n\t\t}\n\n\t\tif actual != expected {\n\t\t\tt.Errorf(\"expected result to be %s not %s\", expected, actual)\n\t\t}\n\t})\n\n\tt.Run(\"path is not a symlink\", func(t *testing.T) {\n\t\ttestDir, targetPath := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\n\t\texpected := targetPath\n\n\t\tactual, err := resolveSymlinkAncestor(targetPath)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"expected err to be nil but was %s\", err)\n\t\t}\n\n\t\tif actual != expected {\n\t\t\tt.Errorf(\"expected result to be %s not %s\", expected, actual)\n\t\t}\n\t})\n\n\tt.Run(\"parent of path is a symlink\", func(t *testing.T) {\n\t\ttestDir, targetPath := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\n\t\ttargetDir := filepath.Dir(targetPath)\n\n\t\tlinkDir := filepath.Join(testDir, \"foo\")\n\n\t\tif err := os.MkdirAll(linkDir, 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tlinkDir = filepath.Join(linkDir, \"gaz\")\n\n\t\tif err := os.Symlink(targetDir, linkDir); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tlinkPath := filepath.Join(linkDir, filepath.Base(targetPath))\n\n\t\texpected := linkDir\n\n\t\tactual, err := resolveSymlinkAncestor(linkPath)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"expected err to be nil but was %s\", err)\n\t\t}\n\n\t\tif actual != expected {\n\t\t\tt.Errorf(\"expected result to be %s not %s\", expected, actual)\n\t\t}\n\t})\n\n\tt.Run(\"parent of path is a dead symlink\", func(t *testing.T) {\n\t\ttestDir, targetPath := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\n\t\ttargetDir := filepath.Dir(targetPath)\n\n\t\tlinkDir := filepath.Join(testDir, \"foo\")\n\n\t\tif err := os.MkdirAll(linkDir, 0777); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tlinkDir = filepath.Join(linkDir, \"gaz\")\n\n\t\tif err := os.Symlink(targetDir, linkDir); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tif err := os.RemoveAll(targetDir); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tlinkPath := filepath.Join(linkDir, filepath.Base(targetPath))\n\n\t\t_, err := resolveSymlinkAncestor(linkPath)\n\t\tif err == nil {\n\t\t\tt.Error(\"expected err to not be nil\")\n\t\t}\n\t})\n\n\tt.Run(\"great grandparent of path is a symlink\", func(t *testing.T) {\n\t\ttestDir, targetPath := setupDirs(t)\n\t\tdefer os.RemoveAll(testDir)\n\n\t\ttargetDir := filepath.Dir(targetPath)\n\n\t\tlinkDir := filepath.Join(testDir, \"foo\")\n\n\t\tif err := os.Symlink(filepath.Dir(targetDir), linkDir); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tlinkPath := filepath.Join(\n\t\t\tlinkDir,\n\t\t\tfilepath.Join(\n\t\t\t\tfilepath.Base(targetDir),\n\t\t\t\tfilepath.Base(targetPath),\n\t\t\t),\n\t\t)\n\n\t\texpected := linkDir\n\n\t\tactual, err := resolveSymlinkAncestor(linkPath)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"expected err to be nil but was %s\", err)\n\t\t}\n\n\t\tif actual != expected {\n\t\t\tt.Errorf(\"expected result to be %s not %s\", expected, actual)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "pkg/image/image_util.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage image\n\nimport (\n\t\"fmt\"\n\t\"path/filepath\"\n\t\"strconv\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/cache\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/constants\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/image/remote\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/timing\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\n\t\"github.com/google/go-containerregistry/pkg/name\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/google/go-containerregistry/pkg/v1/empty\"\n\t\"github.com/google/go-containerregistry/pkg/v1/tarball\"\n\n\t\"github.com/sirupsen/logrus\"\n)\n\nvar (\n\t// RetrieveRemoteImage downloads an image from a remote location\n\tRetrieveRemoteImage = remote.RetrieveRemoteImage\n\tretrieveTarImage    = tarballImage\n)\n\n// RetrieveSourceImage returns the base image of the stage at index\nfunc RetrieveSourceImage(stage config.KanikoStage, opts *config.KanikoOptions) (v1.Image, error) {\n\tt := timing.Start(\"Retrieving Source Image\")\n\tdefer timing.DefaultRun.Stop(t)\n\tvar buildArgs []string\n\n\tfor _, marg := range stage.MetaArgs {\n\t\tfor _, arg := range marg.Args {\n\t\t\tbuildArgs = append(buildArgs, fmt.Sprintf(\"%s=%s\", arg.Key, arg.ValueString()))\n\t\t}\n\t}\n\tbuildArgs = append(buildArgs, opts.BuildArgs...)\n\tcurrentBaseName, err := util.ResolveEnvironmentReplacement(stage.BaseName, buildArgs, false)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// First, check if the base image is a scratch image\n\tif currentBaseName == constants.NoBaseImage {\n\t\tlogrus.Info(\"No base image, nothing to extract\")\n\t\treturn empty.Image, nil\n\t}\n\t// Next, check if the base image of the current stage is built from a previous stage\n\t// If so, retrieve the image from the stored tarball\n\tif stage.BaseImageStoredLocally {\n\t\treturn retrieveTarImage(stage.BaseImageIndex)\n\t}\n\n\t// Finally, check if local caching is enabled\n\t// If so, look in the local cache before trying the remote registry\n\tif opts.Cache && opts.CacheDir != \"\" {\n\t\tcachedImage, err := cachedImage(opts, currentBaseName)\n\t\tif err != nil {\n\t\t\tswitch {\n\t\t\tcase cache.IsNotFound(err):\n\t\t\t\tlogrus.Debugf(\"Image %v not found in cache\", currentBaseName)\n\t\t\tcase cache.IsExpired(err):\n\t\t\t\tlogrus.Debugf(\"Image %v found in cache but was expired\", currentBaseName)\n\t\t\tdefault:\n\t\t\t\tlogrus.Errorf(\"Error while retrieving image from cache: %v %v\", currentBaseName, err)\n\t\t\t}\n\t\t} else if cachedImage != nil {\n\t\t\treturn cachedImage, nil\n\t\t}\n\t}\n\n\t// Otherwise, initialize image as usual\n\treturn RetrieveRemoteImage(currentBaseName, opts.RegistryOptions, opts.CustomPlatform)\n}\n\nfunc tarballImage(index int) (v1.Image, error) {\n\ttarPath := filepath.Join(config.KanikoIntermediateStagesDir, strconv.Itoa(index))\n\tlogrus.Infof(\"Base image from previous stage %d found, using saved tar at path %s\", index, tarPath)\n\treturn tarball.ImageFromPath(tarPath, nil)\n}\n\nfunc cachedImage(opts *config.KanikoOptions, image string) (v1.Image, error) {\n\tref, err := name.ParseReference(image, name.WeakValidation)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar cacheKey string\n\tif d, ok := ref.(name.Digest); ok {\n\t\tcacheKey = d.DigestStr()\n\t} else {\n\t\timage, err := remote.RetrieveRemoteImage(image, opts.RegistryOptions, opts.CustomPlatform)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\td, err := image.Digest()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcacheKey = d.String()\n\t}\n\treturn cache.LocalSource(&opts.CacheOptions, cacheKey)\n}\n"
  },
  {
    "path": "pkg/image/image_util_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage image\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/google/go-containerregistry/pkg/v1/empty\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/linter\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/parser\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n)\n\nvar (\n\tdockerfile = `\n\tFROM gcr.io/distroless/base:latest as base\n\tCOPY . .\n\n\tFROM scratch as second\n\tENV foopath context/foo\n\tCOPY --from=0 $foopath context/b* /foo/\n\n\tFROM base\n\tARG file\n\tCOPY --from=second /foo $file`\n)\n\nfunc Test_StandardImage(t *testing.T) {\n\tstages, err := parse(dockerfile)\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\toriginal := RetrieveRemoteImage\n\tdefer func() {\n\t\tRetrieveRemoteImage = original\n\t}()\n\tmock := func(image string, opts config.RegistryOptions, _ string) (v1.Image, error) {\n\t\treturn nil, nil\n\t}\n\tRetrieveRemoteImage = mock\n\tactual, err := RetrieveSourceImage(config.KanikoStage{\n\t\tStage: stages[0],\n\t}, &config.KanikoOptions{})\n\ttestutil.CheckErrorAndDeepEqual(t, false, err, nil, actual)\n}\n\nfunc Test_ScratchImage(t *testing.T) {\n\tstages, err := parse(dockerfile)\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\tactual, err := RetrieveSourceImage(config.KanikoStage{\n\t\tStage: stages[1],\n\t}, &config.KanikoOptions{})\n\texpected := empty.Image\n\ttestutil.CheckErrorAndDeepEqual(t, false, err, expected, actual)\n}\n\nfunc Test_TarImage(t *testing.T) {\n\tstages, err := parse(dockerfile)\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\toriginal := retrieveTarImage\n\tdefer func() {\n\t\tretrieveTarImage = original\n\t}()\n\tmock := func(index int) (v1.Image, error) {\n\t\treturn nil, nil\n\t}\n\tretrieveTarImage = mock\n\tactual, err := RetrieveSourceImage(config.KanikoStage{\n\t\tBaseImageStoredLocally: true,\n\t\tBaseImageIndex:         0,\n\t\tStage:                  stages[2],\n\t}, &config.KanikoOptions{})\n\ttestutil.CheckErrorAndDeepEqual(t, false, err, nil, actual)\n}\n\nfunc Test_ScratchImageFromMirror(t *testing.T) {\n\tstages, err := parse(dockerfile)\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\tactual, err := RetrieveSourceImage(config.KanikoStage{\n\t\tStage: stages[1],\n\t}, &config.KanikoOptions{\n\t\tRegistryOptions: config.RegistryOptions{\n\t\t\tRegistryMirrors: []string{\"mirror.gcr.io\"},\n\t\t},\n\t})\n\texpected := empty.Image\n\ttestutil.CheckErrorAndDeepEqual(t, false, err, expected, actual)\n}\n\n// parse parses the contents of a Dockerfile and returns a list of commands\nfunc parse(s string) ([]instructions.Stage, error) {\n\tp, err := parser.Parse(bytes.NewReader([]byte(s)))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tstages, _, err := instructions.Parse(p.AST, &linter.Linter{})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn stages, err\n}\n"
  },
  {
    "path": "pkg/image/remote/remote.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage remote\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/creds\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\n\t\"github.com/google/go-containerregistry/pkg/name\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/google/go-containerregistry/pkg/v1/remote\"\n\n\t\"github.com/sirupsen/logrus\"\n)\n\nvar (\n\tmanifestCache   = make(map[string]v1.Image)\n\tremoteImageFunc = remote.Image\n)\n\n// RetrieveRemoteImage retrieves the manifest for the specified image from the specified registry\nfunc RetrieveRemoteImage(image string, opts config.RegistryOptions, customPlatform string) (v1.Image, error) {\n\tlogrus.Infof(\"Retrieving image manifest %s\", image)\n\n\tcachedRemoteImage := manifestCache[image]\n\tif cachedRemoteImage != nil {\n\t\tlogrus.Infof(\"Returning cached image manifest\")\n\t\treturn cachedRemoteImage, nil\n\t}\n\n\tref, err := name.ParseReference(image, name.WeakValidation)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif newRegURLs, found := opts.RegistryMaps[ref.Context().RegistryStr()]; found {\n\t\tfor _, registryMapping := range newRegURLs {\n\n\t\t\tregToMapTo, repositoryPrefix := parseRegistryMapping(registryMapping)\n\n\t\t\tinsecurePull := opts.InsecurePull || opts.InsecureRegistries.Contains(regToMapTo)\n\n\t\t\tremappedRepository, err := remapRepository(ref.Context(), regToMapTo, repositoryPrefix, insecurePull)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tremappedRef := setNewRepository(ref, remappedRepository)\n\n\t\t\tlogrus.Infof(\"Retrieving image %s from mapped registry %s\", remappedRef, regToMapTo)\n\t\t\tretryFunc := func() (v1.Image, error) {\n\t\t\t\treturn remoteImageFunc(remappedRef, remoteOptions(regToMapTo, opts, customPlatform)...)\n\t\t\t}\n\n\t\t\tvar remoteImage v1.Image\n\t\t\tif remoteImage, err = util.RetryWithResult(retryFunc, opts.ImageDownloadRetry, 1000); err != nil {\n\t\t\t\tlogrus.Warnf(\"Failed to retrieve image %s from remapped registry %s: %s. Will try with the next registry, or fallback to the original registry.\", remappedRef, regToMapTo, err)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tmanifestCache[image] = remoteImage\n\n\t\t\treturn remoteImage, nil\n\t\t}\n\n\t\tif len(newRegURLs) > 0 && opts.SkipDefaultRegistryFallback {\n\t\t\treturn nil, fmt.Errorf(\"image not found on any configured mapped registries for %s\", ref)\n\t\t}\n\t}\n\n\tregistryName := ref.Context().RegistryStr()\n\tif opts.InsecurePull || opts.InsecureRegistries.Contains(registryName) {\n\t\tnewReg, err := name.NewRegistry(registryName, name.WeakValidation, name.Insecure)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tref = setNewRegistry(ref, newReg)\n\t}\n\n\tlogrus.Infof(\"Retrieving image %s from registry %s\", ref, registryName)\n\n\tretryFunc := func() (v1.Image, error) {\n\t\treturn remoteImageFunc(ref, remoteOptions(registryName, opts, customPlatform)...)\n\t}\n\n\tvar remoteImage v1.Image\n\tif remoteImage, err = util.RetryWithResult(retryFunc, opts.ImageDownloadRetry, 1000); remoteImage != nil {\n\t\tmanifestCache[image] = remoteImage\n\t}\n\n\treturn remoteImage, err\n}\n\n// remapRepository adds the {repositoryPrefix}/ to the original repo, and normalizes with an additional library/ if necessary\nfunc remapRepository(repo name.Repository, regToMapTo string, repositoryPrefix string, insecurePull bool) (name.Repository, error) {\n\tif insecurePull {\n\t\treturn name.NewRepository(repositoryPrefix+repo.RepositoryStr(), name.WithDefaultRegistry(regToMapTo), name.WeakValidation, name.Insecure)\n\t} else {\n\t\treturn name.NewRepository(repositoryPrefix+repo.RepositoryStr(), name.WithDefaultRegistry(regToMapTo), name.WeakValidation)\n\t}\n}\n\nfunc setNewRepository(ref name.Reference, newRepo name.Repository) name.Reference {\n\tswitch r := ref.(type) {\n\tcase name.Tag:\n\t\tr.Repository = newRepo\n\t\treturn r\n\tcase name.Digest:\n\t\tr.Repository = newRepo\n\t\treturn r\n\tdefault:\n\t\treturn ref\n\t}\n}\n\nfunc setNewRegistry(ref name.Reference, newReg name.Registry) name.Reference {\n\tswitch r := ref.(type) {\n\tcase name.Tag:\n\t\tr.Repository.Registry = newReg\n\t\treturn r\n\tcase name.Digest:\n\t\tr.Repository.Registry = newReg\n\t\treturn r\n\tdefault:\n\t\treturn ref\n\t}\n}\n\nfunc remoteOptions(registryName string, opts config.RegistryOptions, customPlatform string) []remote.Option {\n\ttr, err := util.MakeTransport(opts, registryName)\n\n\t// The MakeTransport function will only return errors if there was a problem\n\t// with registry certificates (Verification or mTLS)\n\tif err != nil {\n\t\tlogrus.Fatalf(\"Unable to setup transport for registry %q: %v\", customPlatform, err)\n\t}\n\n\t// The platform value has previously been validated.\n\tplatform, err := v1.ParsePlatform(customPlatform)\n\tif err != nil {\n\t\tlogrus.Fatalf(\"Invalid platform %q: %v\", customPlatform, err)\n\t}\n\n\treturn []remote.Option{remote.WithTransport(tr), remote.WithAuthFromKeychain(creds.GetKeychain()), remote.WithPlatform(*platform)}\n}\n\n// Parse the registry mapping\n// example: regMapping = \"registry.example.com/subdir1/subdir2\" will return registry.example.com and subdir1/subdir2/\nfunc parseRegistryMapping(regMapping string) (string, string) {\n\t// Split the registry mapping by first slash\n\tregURL, repositoryPrefix, _ := strings.Cut(regMapping, \"/\")\n\n\t// Normalize with a trailing slash if not empty\n\tif repositoryPrefix != \"\" && !strings.HasSuffix(repositoryPrefix, \"/\") {\n\t\trepositoryPrefix = repositoryPrefix + \"/\"\n\t}\n\n\treturn regURL, repositoryPrefix\n}\n"
  },
  {
    "path": "pkg/image/remote/remote_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage remote\n\nimport (\n\t\"errors\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/google/go-containerregistry/pkg/name\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/google/go-containerregistry/pkg/v1/remote\"\n\t\"github.com/google/go-containerregistry/pkg/v1/types\"\n)\n\nconst image string = \"debian\"\n\n// mockImage mocks the v1.Image interface\ntype mockImage struct {\n}\n\nfunc (m *mockImage) ConfigFile() (*v1.ConfigFile, error) {\n\treturn nil, nil\n}\n\nfunc (m *mockImage) ConfigName() (v1.Hash, error) {\n\treturn v1.Hash{}, nil\n}\n\nfunc (m *mockImage) Descriptor() (*v1.Descriptor, error) {\n\treturn nil, nil\n}\n\nfunc (m *mockImage) Digest() (v1.Hash, error) {\n\treturn v1.Hash{}, nil\n}\n\nfunc (m *mockImage) LayerByDigest(v1.Hash) (v1.Layer, error) {\n\treturn nil, nil\n}\n\nfunc (m *mockImage) LayerByDiffID(v1.Hash) (v1.Layer, error) {\n\treturn nil, nil\n}\n\nfunc (m *mockImage) Layers() ([]v1.Layer, error) {\n\treturn nil, nil\n}\n\nfunc (m *mockImage) Manifest() (*v1.Manifest, error) {\n\treturn nil, nil\n}\n\nfunc (m *mockImage) MediaType() (types.MediaType, error) {\n\treturn \"application/vnd.oci.descriptor.v1+json\", nil\n}\n\nfunc (m *mockImage) RawManifest() ([]byte, error) {\n\treturn nil, nil\n}\n\nfunc (m *mockImage) RawConfigFile() ([]byte, error) {\n\treturn nil, nil\n}\n\nfunc (m *mockImage) Size() (int64, error) {\n\treturn 0, nil\n}\n\nfunc Test_remapRepository(t *testing.T) {\n\ttests := []struct {\n\t\tname                string\n\t\trepository          string\n\t\tnewRegistry         string\n\t\tnewRepositoryPrefix string\n\t\texpectedRepository  string\n\t}{\n\t\t{\n\t\t\tname:                \"Test case 1\",\n\t\t\trepository:          \"debian\",\n\t\t\tnewRegistry:         \"newreg.io\",\n\t\t\tnewRepositoryPrefix: \"\",\n\t\t\texpectedRepository:  \"newreg.io/library/debian\",\n\t\t},\n\t\t{\n\t\t\tname:                \"Test case 2\",\n\t\t\trepository:          \"docker.io/debian\",\n\t\t\tnewRegistry:         \"newreg.io\",\n\t\t\tnewRepositoryPrefix: \"\",\n\t\t\texpectedRepository:  \"newreg.io/library/debian\",\n\t\t},\n\t\t{\n\t\t\tname:                \"Test case 3\",\n\t\t\trepository:          \"index.docker.io/debian\",\n\t\t\tnewRegistry:         \"newreg.io\",\n\t\t\tnewRepositoryPrefix: \"\",\n\t\t\texpectedRepository:  \"newreg.io/library/debian\",\n\t\t},\n\t\t{\n\t\t\tname:                \"Test case 4\",\n\t\t\trepository:          \"oldreg.io/debian\",\n\t\t\tnewRegistry:         \"newreg.io\",\n\t\t\tnewRepositoryPrefix: \"\",\n\t\t\texpectedRepository:  \"newreg.io/debian\",\n\t\t},\n\t\t{\n\t\t\tname:                \"Test case 5\",\n\t\t\trepository:          \"debian\",\n\t\t\tnewRegistry:         \"newreg.io\",\n\t\t\tnewRepositoryPrefix: \"subdir1/subdir2/\",\n\t\t\texpectedRepository:  \"newreg.io/subdir1/subdir2/library/debian\",\n\t\t},\n\t\t{\n\t\t\tname:                \"Test case 6\",\n\t\t\trepository:          \"library/debian\",\n\t\t\tnewRegistry:         \"newreg.io\",\n\t\t\tnewRepositoryPrefix: \"\",\n\t\t\texpectedRepository:  \"newreg.io/library/debian\",\n\t\t},\n\t\t{\n\t\t\tname:                \"Test case 7\",\n\t\t\trepository:          \"library/debian\",\n\t\t\tnewRegistry:         \"newreg.io\",\n\t\t\tnewRepositoryPrefix: \"subdir1/subdir2/\",\n\t\t\texpectedRepository:  \"newreg.io/subdir1/subdir2/library/debian\",\n\t\t},\n\t\t{\n\t\t\tname:                \"Test case 8\",\n\t\t\trepository:          \"namespace/debian\",\n\t\t\tnewRegistry:         \"newreg.io\",\n\t\t\tnewRepositoryPrefix: \"\",\n\t\t\texpectedRepository:  \"newreg.io/namespace/debian\",\n\t\t},\n\t\t{\n\t\t\tname:                \"Test case 9\",\n\t\t\trepository:          \"namespace/debian\",\n\t\t\tnewRegistry:         \"newreg.io\",\n\t\t\tnewRepositoryPrefix: \"subdir1/subdir2/\",\n\t\t\texpectedRepository:  \"newreg.io/subdir1/subdir2/namespace/debian\",\n\t\t},\n\t\t// Add more test cases here\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\trepo, err := name.NewRepository(tt.repository)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\trepo2, err := remapRepository(repo, tt.newRegistry, tt.newRepositoryPrefix, false)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tif repo2.Name() != tt.expectedRepository {\n\t\t\t\tt.Errorf(\"%s should have been normalized to %s, got %s\", repo.Name(), tt.expectedRepository, repo2.Name())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_RetrieveRemoteImage_manifestCache(t *testing.T) {\n\tnonExistingImageName := \"this_is_a_non_existing_image_reference\"\n\n\tif _, err := RetrieveRemoteImage(nonExistingImageName, config.RegistryOptions{}, \"\"); err == nil {\n\t\tt.Fatal(\"Expected call to fail because there is no manifest for this image.\")\n\t}\n\n\tmanifestCache[nonExistingImageName] = &mockImage{}\n\n\tif image, err := RetrieveRemoteImage(nonExistingImageName, config.RegistryOptions{}, \"\"); image == nil || err != nil {\n\t\tt.Fatal(\"Expected call to succeed because there is a manifest for this image in the cache.\")\n\t}\n}\n\nfunc Test_RetrieveRemoteImage_skipFallback(t *testing.T) {\n\tregistryMirror := \"some-registry\"\n\n\topts := config.RegistryOptions{\n\t\tRegistryMaps:                map[string][]string{name.DefaultRegistry: {registryMirror}},\n\t\tSkipDefaultRegistryFallback: false,\n\t}\n\n\tremoteImageFunc = func(ref name.Reference, options ...remote.Option) (v1.Image, error) {\n\t\tif ref.Context().Registry.Name() == registryMirror {\n\t\t\treturn nil, errors.New(\"no image found\")\n\t\t}\n\n\t\treturn &mockImage{}, nil\n\t}\n\n\tif _, err := RetrieveRemoteImage(image, opts, \"\"); err != nil {\n\t\tt.Fatalf(\"Expected call to succeed because fallback to default registry\")\n\t}\n\n\topts.SkipDefaultRegistryFallback = true\n\t//clean cached image\n\tmanifestCache = make(map[string]v1.Image)\n\n\tif _, err := RetrieveRemoteImage(image, opts, \"\"); err == nil {\n\t\tt.Fatal(\"Expected call to fail because fallback to default registry is skipped\")\n\t}\n}\n\nfunc Test_RetryRetrieveRemoteImageSucceeds(t *testing.T) {\n\topts := config.RegistryOptions{\n\t\tImageDownloadRetry: 2,\n\t}\n\tattempts := 0\n\tremoteImageFunc = func(ref name.Reference, options ...remote.Option) (v1.Image, error) {\n\t\tif attempts < 2 {\n\t\t\tattempts++\n\t\t\treturn nil, errors.New(\"no image found\")\n\t\t}\n\t\treturn &mockImage{}, nil\n\t}\n\n\t// Clean cached image\n\tmanifestCache = make(map[string]v1.Image)\n\n\tif _, err := RetrieveRemoteImage(image, opts, \"\"); err != nil {\n\t\tt.Fatal(\"Expected call to succeed because of retry\")\n\t}\n}\n\nfunc Test_NoRetryRetrieveRemoteImageFails(t *testing.T) {\n\topts := config.RegistryOptions{\n\t\tImageDownloadRetry: 0,\n\t}\n\tattempts := 0\n\tremoteImageFunc = func(ref name.Reference, options ...remote.Option) (v1.Image, error) {\n\t\tif attempts < 1 {\n\t\t\tattempts++\n\t\t\treturn nil, errors.New(\"no image found\")\n\t\t}\n\t\treturn &mockImage{}, nil\n\t}\n\n\t// Clean cached image\n\tmanifestCache = make(map[string]v1.Image)\n\n\tif _, err := RetrieveRemoteImage(image, opts, \"\"); err == nil {\n\t\tt.Fatal(\"Expected call to fail because there is no retry\")\n\t}\n}\n\nfunc Test_ParseRegistryMapping(t *testing.T) {\n\ttests := []struct {\n\t\tname                     string\n\t\tregistryMapping          string\n\t\texpectedRegistry         string\n\t\texpectedRepositoryPrefix string\n\t}{\n\t\t{\n\t\t\tname:                     \"Test case 1\",\n\t\t\tregistryMapping:          \"registry.example.com/subdir\",\n\t\t\texpectedRegistry:         \"registry.example.com\",\n\t\t\texpectedRepositoryPrefix: \"subdir/\",\n\t\t},\n\t\t{\n\t\t\tname:                     \"Test case 2\",\n\t\t\tregistryMapping:          \"registry.example.com/subdir/\",\n\t\t\texpectedRegistry:         \"registry.example.com\",\n\t\t\texpectedRepositoryPrefix: \"subdir/\",\n\t\t},\n\t\t{\n\t\t\tname:                     \"Test case 3\",\n\t\t\tregistryMapping:          \"registry.example.com/subdir1/subdir2\",\n\t\t\texpectedRegistry:         \"registry.example.com\",\n\t\t\texpectedRepositoryPrefix: \"subdir1/subdir2/\",\n\t\t},\n\t\t{\n\t\t\tname:                     \"Test case 4\",\n\t\t\tregistryMapping:          \"registry.example.com\",\n\t\t\texpectedRegistry:         \"registry.example.com\",\n\t\t\texpectedRepositoryPrefix: \"\",\n\t\t},\n\t\t{\n\t\t\tname:                     \"Test case 5\",\n\t\t\tregistryMapping:          \"registry.example.com/\",\n\t\t\texpectedRegistry:         \"registry.example.com\",\n\t\t\texpectedRepositoryPrefix: \"\",\n\t\t},\n\t\t// Add more test cases here\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tregistry, repositoryPrefix := parseRegistryMapping(tt.registryMapping)\n\t\t\tif registry != tt.expectedRegistry {\n\t\t\t\tt.Errorf(\"Expected registry: %s, but got: %s\", tt.expectedRegistry, registry)\n\t\t\t}\n\t\t\tif repositoryPrefix != tt.expectedRepositoryPrefix {\n\t\t\t\tt.Errorf(\"Expected repoPrefix: %s, but got: %s\", tt.expectedRepositoryPrefix, repositoryPrefix)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/logging/logging.go",
    "content": "/*\nCopyright 2020 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage logging\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n)\n\nconst (\n\t// Default log level\n\tDefaultLevel = \"info\"\n\t// Default timestamp in logs\n\tDefaultLogTimestamp = false\n\n\t// Text format\n\tFormatText = \"text\"\n\t// Colored text format\n\tFormatColor = \"color\"\n\t// JSON format\n\tFormatJSON = \"json\"\n)\n\n// Configure sets the logrus logging level and formatter\nfunc Configure(level, format string, logTimestamp bool) error {\n\tlvl, err := logrus.ParseLevel(level)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"parsing log level\")\n\t}\n\tlogrus.SetLevel(lvl)\n\n\tvar formatter logrus.Formatter\n\tswitch format {\n\tcase FormatText:\n\t\tformatter = &logrus.TextFormatter{\n\t\t\tDisableColors: true,\n\t\t\tFullTimestamp: logTimestamp,\n\t\t}\n\tcase FormatColor:\n\t\tformatter = &logrus.TextFormatter{\n\t\t\tForceColors:   true,\n\t\t\tFullTimestamp: logTimestamp,\n\t\t}\n\tcase FormatJSON:\n\t\tformatter = &logrus.JSONFormatter{}\n\tdefault:\n\t\treturn fmt.Errorf(\"not a valid log format: %q. Please specify one of (text, color, json)\", format)\n\t}\n\tlogrus.SetFormatter(formatter)\n\n\treturn nil\n}\n"
  },
  {
    "path": "pkg/mocks/go-containerregistry/mockv1/mocks.go",
    "content": "/*\nCopyright 2020 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// Code generated by MockGen. DO NOT EDIT.\n// Source: github.com/google/go-containerregistry/pkg/v1 (interfaces: Layer)\n\n// Package mockv1 is a generated GoMock package.\npackage mockv1\n\nimport (\n\tio \"io\"\n\treflect \"reflect\"\n\n\tgomock \"github.com/golang/mock/gomock\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\ttypes \"github.com/google/go-containerregistry/pkg/v1/types\"\n)\n\n// MockLayer is a mock of Layer interface\ntype MockLayer struct {\n\tctrl     *gomock.Controller\n\trecorder *MockLayerMockRecorder\n}\n\n// MockLayerMockRecorder is the mock recorder for MockLayer\ntype MockLayerMockRecorder struct {\n\tmock *MockLayer\n}\n\n// NewMockLayer creates a new mock instance\nfunc NewMockLayer(ctrl *gomock.Controller) *MockLayer {\n\tmock := &MockLayer{ctrl: ctrl}\n\tmock.recorder = &MockLayerMockRecorder{mock}\n\treturn mock\n}\n\n// EXPECT returns an object that allows the caller to indicate expected use\nfunc (m *MockLayer) EXPECT() *MockLayerMockRecorder {\n\treturn m.recorder\n}\n\n// Compressed mocks base method\nfunc (m *MockLayer) Compressed() (io.ReadCloser, error) {\n\tm.ctrl.T.Helper()\n\tret := m.ctrl.Call(m, \"Compressed\")\n\tret0, _ := ret[0].(io.ReadCloser)\n\tret1, _ := ret[1].(error)\n\treturn ret0, ret1\n}\n\n// Compressed indicates an expected call of Compressed\nfunc (mr *MockLayerMockRecorder) Compressed() *gomock.Call {\n\tmr.mock.ctrl.T.Helper()\n\treturn mr.mock.ctrl.RecordCallWithMethodType(mr.mock, \"Compressed\", reflect.TypeOf((*MockLayer)(nil).Compressed))\n}\n\n// DiffID mocks base method\nfunc (m *MockLayer) DiffID() (v1.Hash, error) {\n\tm.ctrl.T.Helper()\n\tret := m.ctrl.Call(m, \"DiffID\")\n\tret0, _ := ret[0].(v1.Hash)\n\tret1, _ := ret[1].(error)\n\treturn ret0, ret1\n}\n\n// DiffID indicates an expected call of DiffID\nfunc (mr *MockLayerMockRecorder) DiffID() *gomock.Call {\n\tmr.mock.ctrl.T.Helper()\n\treturn mr.mock.ctrl.RecordCallWithMethodType(mr.mock, \"DiffID\", reflect.TypeOf((*MockLayer)(nil).DiffID))\n}\n\n// Digest mocks base method\nfunc (m *MockLayer) Digest() (v1.Hash, error) {\n\tm.ctrl.T.Helper()\n\tret := m.ctrl.Call(m, \"Digest\")\n\tret0, _ := ret[0].(v1.Hash)\n\tret1, _ := ret[1].(error)\n\treturn ret0, ret1\n}\n\n// Digest indicates an expected call of Digest\nfunc (mr *MockLayerMockRecorder) Digest() *gomock.Call {\n\tmr.mock.ctrl.T.Helper()\n\treturn mr.mock.ctrl.RecordCallWithMethodType(mr.mock, \"Digest\", reflect.TypeOf((*MockLayer)(nil).Digest))\n}\n\n// MediaType mocks base method\nfunc (m *MockLayer) MediaType() (types.MediaType, error) {\n\tm.ctrl.T.Helper()\n\tret := m.ctrl.Call(m, \"MediaType\")\n\tret0, _ := ret[0].(types.MediaType)\n\tret1, _ := ret[1].(error)\n\treturn ret0, ret1\n}\n\n// MediaType indicates an expected call of MediaType\nfunc (mr *MockLayerMockRecorder) MediaType() *gomock.Call {\n\tmr.mock.ctrl.T.Helper()\n\treturn mr.mock.ctrl.RecordCallWithMethodType(mr.mock, \"MediaType\", reflect.TypeOf((*MockLayer)(nil).MediaType))\n}\n\n// Size mocks base method\nfunc (m *MockLayer) Size() (int64, error) {\n\tm.ctrl.T.Helper()\n\tret := m.ctrl.Call(m, \"Size\")\n\tret0, _ := ret[0].(int64)\n\tret1, _ := ret[1].(error)\n\treturn ret0, ret1\n}\n\n// Size indicates an expected call of Size\nfunc (mr *MockLayerMockRecorder) Size() *gomock.Call {\n\tmr.mock.ctrl.T.Helper()\n\treturn mr.mock.ctrl.RecordCallWithMethodType(mr.mock, \"Size\", reflect.TypeOf((*MockLayer)(nil).Size))\n}\n\n// Uncompressed mocks base method\nfunc (m *MockLayer) Uncompressed() (io.ReadCloser, error) {\n\tm.ctrl.T.Helper()\n\tret := m.ctrl.Call(m, \"Uncompressed\")\n\tret0, _ := ret[0].(io.ReadCloser)\n\tret1, _ := ret[1].(error)\n\treturn ret0, ret1\n}\n\n// Uncompressed indicates an expected call of Uncompressed\nfunc (mr *MockLayerMockRecorder) Uncompressed() *gomock.Call {\n\tmr.mock.ctrl.T.Helper()\n\treturn mr.mock.ctrl.RecordCallWithMethodType(mr.mock, \"Uncompressed\", reflect.TypeOf((*MockLayer)(nil).Uncompressed))\n}\n"
  },
  {
    "path": "pkg/snapshot/layered_map.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage snapshot\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/timing\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n)\n\ntype LayeredMap struct {\n\tadds    []map[string]string   // All layers with added files.\n\tdeletes []map[string]struct{} // All layers with deleted files.\n\n\tcurrentImage        map[string]string // All files and hashes in the current image (up to the last layer).\n\tisCurrentImageValid bool              // If the currentImage is not out-of-date.\n\n\tlayerHashCache map[string]string\n\thasher         func(string) (string, error)\n}\n\n// NewLayeredMap creates a new layered map which keeps track of adds and deletes.\nfunc NewLayeredMap(h func(string) (string, error)) *LayeredMap {\n\tl := LayeredMap{\n\t\thasher: h,\n\t}\n\n\tl.currentImage = map[string]string{}\n\tl.layerHashCache = map[string]string{}\n\treturn &l\n}\n\n// Snapshot creates a new layer.\nfunc (l *LayeredMap) Snapshot() {\n\n\t// Save current state of image\n\tl.updateCurrentImage()\n\n\tl.adds = append(l.adds, map[string]string{})\n\tl.deletes = append(l.deletes, map[string]struct{}{})\n\tl.layerHashCache = map[string]string{} // Erase the hash cache for this new layer.\n}\n\n// Key returns a hash for added and delted files.\nfunc (l *LayeredMap) Key() (string, error) {\n\n\tvar adds map[string]string\n\tvar deletes map[string]struct{}\n\n\tif len(l.adds) != 0 {\n\t\tadds = l.adds[len(l.adds)-1]\n\t\tdeletes = l.deletes[len(l.deletes)-1]\n\t}\n\n\tc := bytes.NewBuffer([]byte{})\n\tenc := json.NewEncoder(c)\n\terr := enc.Encode(adds)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\terr = enc.Encode(deletes)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn util.SHA256(c)\n}\n\n// getCurrentImage returns the current image by merging the latest\n// adds and deletes on to the current image (if its not yet valid.)\nfunc (l *LayeredMap) getCurrentImage() map[string]string {\n\tif l.isCurrentImageValid || len(l.adds) == 0 {\n\t\t// No layers yet or current image is valid.\n\t\treturn l.currentImage\n\t}\n\n\tcurrent := map[string]string{}\n\n\t// Copy current image paths/hashes.\n\tfor p, h := range l.currentImage {\n\t\tcurrent[p] = h\n\t}\n\n\t// Add the last layer on top.\n\taddedFiles := l.adds[len(l.adds)-1]\n\tdeletedFiles := l.deletes[len(l.deletes)-1]\n\n\tfor add, hash := range addedFiles {\n\t\tcurrent[add] = hash\n\t}\n\n\tfor del := range deletedFiles {\n\t\tdelete(current, del)\n\t}\n\n\treturn current\n}\n\n// updateCurrentImage update the internal current image by merging the\n// top adds and deletes onto the current image.\nfunc (l *LayeredMap) updateCurrentImage() {\n\tif l.isCurrentImageValid {\n\t\treturn\n\t}\n\n\tl.currentImage = l.getCurrentImage()\n\tl.isCurrentImageValid = true\n}\n\n// get returns the current hash in the current image `l.currentImage`.\nfunc (l *LayeredMap) get(s string) (string, bool) {\n\th, ok := l.currentImage[s]\n\treturn h, ok\n}\n\n// GetCurrentPaths returns all existing paths in the actual current image\n// cached by FlattenLayers.\nfunc (l *LayeredMap) GetCurrentPaths() map[string]struct{} {\n\tcurrent := l.getCurrentImage()\n\n\tpaths := map[string]struct{}{}\n\tfor f := range current {\n\t\tpaths[f] = struct{}{}\n\t}\n\treturn paths\n}\n\n// AddDelete will delete the specific files in the current layer.\nfunc (l *LayeredMap) AddDelete(s string) error {\n\tl.isCurrentImageValid = false\n\n\tl.deletes[len(l.deletes)-1][s] = struct{}{}\n\treturn nil\n}\n\n// Add will add the specified file s to the current layer.\nfunc (l *LayeredMap) Add(s string) error {\n\tl.isCurrentImageValid = false\n\n\t// Use hash function and add to layers\n\tnewV, err := func(s string) (string, error) {\n\t\tif v, ok := l.layerHashCache[s]; ok {\n\t\t\treturn v, nil\n\t\t}\n\t\treturn l.hasher(s)\n\t}(s)\n\n\tif err != nil {\n\t\treturn fmt.Errorf(\"Error creating hash for %s: %w\", s, err)\n\t}\n\n\tl.adds[len(l.adds)-1][s] = newV\n\treturn nil\n}\n\n// CheckFileChange checks whether a given file (needs to exist) changed\n// from the current layered map by its hashing function.\n// If the file does not exist, an error is returned.\n// Returns true if the file is changed.\nfunc (l *LayeredMap) CheckFileChange(s string) (bool, error) {\n\tt := timing.Start(\"Hashing files\")\n\tdefer timing.DefaultRun.Stop(t)\n\n\tnewV, err := l.hasher(s)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// Save hash to not recompute it when\n\t// adding the file.\n\tl.layerHashCache[s] = newV\n\n\toldV, ok := l.get(s)\n\tif ok && newV == oldV {\n\t\t// File hash did not change => Unchanged.\n\t\treturn false, nil\n\t}\n\n\t// File does not exist in current image,\n\t// or it did change => Changed.\n\treturn true, nil\n}\n"
  },
  {
    "path": "pkg/snapshot/layered_map_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage snapshot\n\nimport (\n\t\"testing\"\n)\n\nfunc Test_CacheKey(t *testing.T) {\n\ttests := []struct {\n\t\tname  string\n\t\tmap1  map[string]string\n\t\tmap2  map[string]string\n\t\tequal bool\n\t}{\n\t\t{\n\t\t\tname: \"maps are the same\",\n\t\t\tmap1: map[string]string{\n\t\t\t\t\"a\": \"apple\",\n\t\t\t\t\"b\": \"bat\",\n\t\t\t\t\"c\": \"cat\",\n\t\t\t\t\"d\": \"dog\",\n\t\t\t\t\"e\": \"egg\",\n\t\t\t},\n\t\t\tmap2: map[string]string{\n\t\t\t\t\"c\": \"cat\",\n\t\t\t\t\"d\": \"dog\",\n\t\t\t\t\"b\": \"bat\",\n\t\t\t\t\"a\": \"apple\",\n\t\t\t\t\"e\": \"egg\",\n\t\t\t},\n\t\t\tequal: true,\n\t\t},\n\t\t{\n\t\t\tname: \"maps are different\",\n\t\t\tmap1: map[string]string{\n\t\t\t\t\"a\": \"apple\",\n\t\t\t\t\"b\": \"bat\",\n\t\t\t\t\"c\": \"cat\",\n\t\t\t},\n\t\t\tmap2: map[string]string{\n\t\t\t\t\"c\": \"\",\n\t\t\t\t\"b\": \"bat\",\n\t\t\t\t\"a\": \"apple\",\n\t\t\t},\n\t\t\tequal: false,\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tlm1 := LayeredMap{adds: []map[string]string{test.map1}, deletes: []map[string]struct{}{nil, nil}}\n\t\t\tlm2 := LayeredMap{adds: []map[string]string{test.map2}, deletes: []map[string]struct{}{nil, nil}}\n\t\t\tk1, err := lm1.Key()\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"error getting key for map 1: %v\", err)\n\t\t\t}\n\t\t\tk2, err := lm2.Key()\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"error getting key for map 2: %v\", err)\n\t\t\t}\n\t\t\tif test.equal != (k1 == k2) {\n\t\t\t\tt.Fatalf(\"unexpected result: \\nExpected\\n%s\\nActual\\n%s\\n\", k1, k2)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_FlattenPaths(t *testing.T) {\n\tlayers := []map[string]string{\n\t\t{\n\t\t\t\"a\": \"2\",\n\t\t\t\"b\": \"3\",\n\t\t},\n\t\t{\n\t\t\t\"b\": \"5\",\n\t\t\t\"c\": \"6\",\n\t\t},\n\t\t{\n\t\t\t\"a\": \"8\",\n\t\t},\n\t}\n\n\twhiteouts := []map[string]struct{}{\n\t\t{\n\t\t\t\"a\": {}, // delete a\n\t\t},\n\t\t{\n\t\t\t\"b\": {}, // delete b\n\t\t},\n\t\t{\n\t\t\t\"c\": {}, // delete c\n\t\t},\n\t}\n\n\tlm := LayeredMap{\n\t\tadds:    []map[string]string{layers[0]},\n\t\tdeletes: []map[string]struct{}{whiteouts[0]}}\n\n\tpaths := lm.GetCurrentPaths()\n\n\tassertPath := func(f string, exists bool) {\n\t\t_, ok := paths[f]\n\t\tif exists && !ok {\n\t\t\tt.Fatalf(\"expected path '%s' to be present.\", f)\n\t\t} else if !exists && ok {\n\t\t\tt.Fatalf(\"expected path '%s' not to be present.\", f)\n\t\t}\n\t}\n\n\tassertPath(\"a\", false)\n\tassertPath(\"b\", true)\n\n\tlm = LayeredMap{\n\t\tadds:    []map[string]string{layers[0], layers[1]},\n\t\tdeletes: []map[string]struct{}{whiteouts[0], whiteouts[1]}}\n\tpaths = lm.GetCurrentPaths()\n\n\tassertPath(\"a\", false)\n\tassertPath(\"b\", false)\n\tassertPath(\"c\", true)\n\n\tlm = LayeredMap{\n\t\tadds:    []map[string]string{layers[0], layers[1], layers[2]},\n\t\tdeletes: []map[string]struct{}{whiteouts[0], whiteouts[1], whiteouts[2]}}\n\tpaths = lm.GetCurrentPaths()\n\n\tassertPath(\"a\", true)\n\tassertPath(\"b\", false)\n\tassertPath(\"c\", false)\n}\n"
  },
  {
    "path": "pkg/snapshot/snapshot.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage snapshot\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"sort\"\n\t\"syscall\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/filesystem\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/timing\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\n\t\"github.com/sirupsen/logrus\"\n\t\"golang.org/x/sys/unix\"\n)\n\n// For testing\nvar snapshotPathPrefix = \"\"\n\n// Snapshotter holds the root directory from which to take snapshots, and a list of snapshots taken\ntype Snapshotter struct {\n\tl          *LayeredMap\n\tdirectory  string\n\tignorelist []util.IgnoreListEntry\n}\n\n// NewSnapshotter creates a new snapshotter rooted at d\nfunc NewSnapshotter(l *LayeredMap, d string) *Snapshotter {\n\treturn &Snapshotter{l: l, directory: d, ignorelist: util.IgnoreList()}\n}\n\n// Init initializes a new snapshotter\nfunc (s *Snapshotter) Init() error {\n\tlogrus.Info(\"Initializing snapshotter ...\")\n\t_, _, err := s.scanFullFilesystem()\n\treturn err\n}\n\n// Key returns a string based on the current state of the file system\nfunc (s *Snapshotter) Key() (string, error) {\n\treturn s.l.Key()\n}\n\n// TakeSnapshot takes a snapshot of the specified files, avoiding directories in the ignorelist, and creates\n// a tarball of the changed files. Return contents of the tarball, and whether or not any files were changed\nfunc (s *Snapshotter) TakeSnapshot(files []string, shdCheckDelete bool, forceBuildMetadata bool) (string, error) {\n\tf, err := os.CreateTemp(config.KanikoDir, \"\")\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tdefer f.Close()\n\n\ts.l.Snapshot()\n\tif len(files) == 0 && !forceBuildMetadata {\n\t\tlogrus.Info(\"No files changed in this command, skipping snapshotting.\")\n\t\treturn \"\", nil\n\t}\n\n\tfilesToAdd, err := filesystem.ResolvePaths(files, s.ignorelist)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tlogrus.Info(\"Taking snapshot of files...\")\n\n\tsort.Strings(filesToAdd)\n\tlogrus.Debugf(\"Adding to layer: %v\", filesToAdd)\n\n\t// Add files to current layer.\n\tfor _, file := range filesToAdd {\n\t\tif err := s.l.Add(file); err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"Unable to add file %s to layered map: %w\", file, err)\n\t\t}\n\t}\n\n\t// Get whiteout paths\n\tvar filesToWhiteout []string\n\tif shdCheckDelete {\n\t\t_, deletedFiles := util.WalkFS(s.directory, s.l.GetCurrentPaths(), func(s string) (bool, error) {\n\t\t\treturn true, nil\n\t\t})\n\n\t\tlogrus.Debugf(\"Deleting in layer: %v\", deletedFiles)\n\t\t// Whiteout files in current layer.\n\t\tfor file := range deletedFiles {\n\t\t\tif err := s.l.AddDelete(file); err != nil {\n\t\t\t\treturn \"\", fmt.Errorf(\"Unable to whiteout file %s in layered map: %w\", file, err)\n\t\t\t}\n\t\t}\n\n\t\tfilesToWhiteout = removeObsoleteWhiteouts(deletedFiles)\n\t\tsort.Strings(filesToWhiteout)\n\t}\n\n\tt := util.NewTar(f)\n\tdefer t.Close()\n\tif err := writeToTar(t, filesToAdd, filesToWhiteout); err != nil {\n\t\treturn \"\", err\n\t}\n\treturn f.Name(), nil\n}\n\n// TakeSnapshotFS takes a snapshot of the filesystem, avoiding directories in the ignorelist, and creates\n// a tarball of the changed files.\nfunc (s *Snapshotter) TakeSnapshotFS() (string, error) {\n\tf, err := os.CreateTemp(s.getSnashotPathPrefix(), \"\")\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tdefer f.Close()\n\tt := util.NewTar(f)\n\tdefer t.Close()\n\n\tfilesToAdd, filesToWhiteOut, err := s.scanFullFilesystem()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tif err := writeToTar(t, filesToAdd, filesToWhiteOut); err != nil {\n\t\treturn \"\", err\n\t}\n\treturn f.Name(), nil\n}\n\nfunc (s *Snapshotter) getSnashotPathPrefix() string {\n\tif snapshotPathPrefix == \"\" {\n\t\treturn config.KanikoDir\n\t}\n\treturn snapshotPathPrefix\n}\n\nfunc (s *Snapshotter) scanFullFilesystem() ([]string, []string, error) {\n\tlogrus.Info(\"Taking snapshot of full filesystem...\")\n\n\t// Some of the operations that follow (e.g. hashing) depend on the file system being synced,\n\t// for example the hashing function that determines if files are equal uses the mtime of the files,\n\t// which can lag if sync is not called. Unfortunately there can still be lag if too much data needs\n\t// to be flushed or the disk does its own caching/buffering.\n\tif runtime.GOOS == \"linux\" {\n\t\tdir, err := os.Open(s.directory)\n\t\tif err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\t\tdefer dir.Close()\n\t\t_, _, errno := syscall.Syscall(unix.SYS_SYNCFS, dir.Fd(), 0, 0)\n\t\tif errno != 0 {\n\t\t\treturn nil, nil, errno\n\t\t}\n\t} else {\n\t\t// fallback to full page cache sync\n\t\tsyscall.Sync()\n\t}\n\n\ts.l.Snapshot()\n\n\tlogrus.Debugf(\"Current image filesystem: %v\", s.l.currentImage)\n\n\tchangedPaths, deletedPaths := util.WalkFS(s.directory, s.l.GetCurrentPaths(), s.l.CheckFileChange)\n\ttimer := timing.Start(\"Resolving Paths\")\n\n\tfilesToAdd := []string{}\n\tresolvedFiles, err := filesystem.ResolvePaths(changedPaths, s.ignorelist)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tfor _, path := range resolvedFiles {\n\t\tif util.CheckIgnoreList(path) {\n\t\t\tlogrus.Debugf(\"Not adding %s to layer, as it's ignored\", path)\n\t\t\tcontinue\n\t\t}\n\t\tfilesToAdd = append(filesToAdd, path)\n\t}\n\n\tlogrus.Debugf(\"Adding to layer: %v\", filesToAdd)\n\tlogrus.Debugf(\"Deleting in layer: %v\", deletedPaths)\n\n\t// Add files to the layered map\n\tfor _, file := range filesToAdd {\n\t\tif err := s.l.Add(file); err != nil {\n\t\t\treturn nil, nil, fmt.Errorf(\"Unable to add file %s to layered map: %w\", file, err)\n\t\t}\n\t}\n\tfor file := range deletedPaths {\n\t\tif err := s.l.AddDelete(file); err != nil {\n\t\t\treturn nil, nil, fmt.Errorf(\"Unable to whiteout file %s in layered map: %w\", file, err)\n\t\t}\n\t}\n\n\tfilesToWhiteout := removeObsoleteWhiteouts(deletedPaths)\n\ttiming.DefaultRun.Stop(timer)\n\n\tsort.Strings(filesToAdd)\n\tsort.Strings(filesToWhiteout)\n\n\treturn filesToAdd, filesToWhiteout, nil\n}\n\n// removeObsoleteWhiteouts filters deleted files according to their parents delete status.\nfunc removeObsoleteWhiteouts(deletedFiles map[string]struct{}) (filesToWhiteout []string) {\n\n\tfor path := range deletedFiles {\n\t\t// Only add the whiteout if the directory for the file still exists.\n\t\tdir := filepath.Dir(path)\n\t\tif _, ok := deletedFiles[dir]; !ok {\n\t\t\tlogrus.Tracef(\"Adding whiteout for %s\", path)\n\t\t\tfilesToWhiteout = append(filesToWhiteout, path)\n\t\t}\n\t}\n\n\treturn filesToWhiteout\n}\n\nfunc writeToTar(t util.Tar, files, whiteouts []string) error {\n\ttimer := timing.Start(\"Writing tar file\")\n\tdefer timing.DefaultRun.Stop(timer)\n\n\t// Now create the tar.\n\taddedPaths := make(map[string]bool)\n\n\tfor _, path := range whiteouts {\n\t\tskipWhiteout, err := parentPathIncludesNonDirectory(path)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif skipWhiteout {\n\t\t\tcontinue\n\t\t}\n\n\t\tif err := addParentDirectories(t, addedPaths, path); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := t.Whiteout(path); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tfor _, path := range files {\n\t\tif err := addParentDirectories(t, addedPaths, path); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif _, pathAdded := addedPaths[path]; pathAdded {\n\t\t\tcontinue\n\t\t}\n\t\tif err := t.AddFileToTar(path); err != nil {\n\t\t\treturn err\n\t\t}\n\t\taddedPaths[path] = true\n\t}\n\treturn nil\n}\n\n// Returns true if a parent of the given path has been replaced with anything other than a directory\nfunc parentPathIncludesNonDirectory(path string) (bool, error) {\n\tfor _, parentPath := range util.ParentDirectories(path) {\n\t\tlstat, err := os.Lstat(parentPath)\n\t\tif err != nil {\n\t\t\treturn false, err\n\t\t}\n\n\t\tif !lstat.IsDir() {\n\t\t\treturn true, nil\n\t\t}\n\t}\n\treturn false, nil\n}\n\nfunc addParentDirectories(t util.Tar, addedPaths map[string]bool, path string) error {\n\tfor _, parentPath := range util.ParentDirectories(path) {\n\t\tif _, pathAdded := addedPaths[parentPath]; pathAdded {\n\t\t\tcontinue\n\t\t}\n\t\tif err := t.AddFileToTar(parentPath); err != nil {\n\t\t\treturn err\n\t\t}\n\t\taddedPaths[parentPath] = true\n\t}\n\treturn nil\n}\n\n// filesWithLinks returns the symlink and the target path if its exists.\nfunc filesWithLinks(path string) ([]string, error) {\n\tlink, err := util.GetSymLink(path)\n\tif errors.Is(err, util.ErrNotSymLink) {\n\t\treturn []string{path}, nil\n\t} else if err != nil {\n\t\treturn nil, err\n\t}\n\t// Add symlink if it exists in the FS\n\tif !filepath.IsAbs(link) {\n\t\tlink = filepath.Join(filepath.Dir(path), link)\n\t}\n\tif _, err := os.Stat(link); err != nil {\n\t\treturn []string{path}, nil //nolint:nilerr\n\t}\n\treturn []string{path, link}, nil\n}\n"
  },
  {
    "path": "pkg/snapshot/snapshot_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage snapshot\n\nimport (\n\t\"archive/tar\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sort\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/util\"\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\t\"github.com/pkg/errors\"\n)\n\nfunc TestSnapshotFSFileChange(t *testing.T) {\n\ttestDir, snapshotter, cleanup, err := setUpTest(t)\n\ttestDirWithoutLeadingSlash := strings.TrimLeft(testDir, \"/\")\n\tdefer cleanup()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\t// Make some changes to the filesystem\n\tnewFiles := map[string]string{\n\t\t\"foo\":     \"newbaz1\",\n\t\t\"bar/bat\": \"baz\",\n\t}\n\tif err := testutil.SetupFiles(testDir, newFiles); err != nil {\n\t\tt.Fatalf(\"Error setting up fs: %s\", err)\n\t}\n\t// Take another snapshot\n\ttarPath, err := snapshotter.TakeSnapshotFS()\n\tif err != nil {\n\t\tt.Fatalf(\"Error taking snapshot of fs: %s\", err)\n\t}\n\n\tf, err := os.Open(tarPath)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\t// Check contents of the snapshot, make sure contents is equivalent to snapshotFiles\n\ttr := tar.NewReader(f)\n\tfooPath := filepath.Join(testDirWithoutLeadingSlash, \"foo\")\n\tbatPath := filepath.Join(testDirWithoutLeadingSlash, \"bar/bat\")\n\tsnapshotFiles := map[string]string{\n\t\tfooPath: \"newbaz1\",\n\t\tbatPath: \"baz\",\n\t}\n\tfor _, path := range util.ParentDirectoriesWithoutLeadingSlash(batPath) {\n\t\tif path == \"/\" {\n\t\t\tsnapshotFiles[\"/\"] = \"\"\n\t\t\tcontinue\n\t\t}\n\t\tsnapshotFiles[path+\"/\"] = \"\"\n\t}\n\n\tactualFiles := []string{}\n\tfor {\n\t\thdr, err := tr.Next()\n\t\tif errors.Is(err, io.EOF) {\n\t\t\tbreak\n\t\t}\n\n\t\tactualFiles = append(actualFiles, hdr.Name)\n\n\t\tif _, isFile := snapshotFiles[hdr.Name]; !isFile {\n\t\t\tt.Fatalf(\"File %s unexpectedly in tar\", hdr.Name)\n\t\t}\n\t\tif hdr.Typeflag == tar.TypeDir {\n\t\t\tcontinue\n\t\t}\n\t\tcontents, _ := io.ReadAll(tr)\n\t\tif string(contents) != snapshotFiles[hdr.Name] {\n\t\t\tt.Fatalf(\"Contents of %s incorrect, expected: %s, actual: %s\", hdr.Name, snapshotFiles[hdr.Name], string(contents))\n\t\t}\n\t}\n\tif len(actualFiles) != len(snapshotFiles) {\n\t\tt.Fatalf(\"Incorrect number of files were added, expected: %d, actual: %d\", len(snapshotFiles), len(actualFiles))\n\t}\n}\n\nfunc TestSnapshotFSIsReproducible(t *testing.T) {\n\ttestDir, snapshotter, cleanup, err := setUpTest(t)\n\tdefer cleanup()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\t// Make some changes to the filesystem\n\tnewFiles := map[string]string{\n\t\t\"foo\":     \"newbaz1\",\n\t\t\"bar/bat\": \"baz\",\n\t}\n\tif err := testutil.SetupFiles(testDir, newFiles); err != nil {\n\t\tt.Fatalf(\"Error setting up fs: %s\", err)\n\t}\n\t// Take another snapshot\n\ttarPath, err := snapshotter.TakeSnapshotFS()\n\tif err != nil {\n\t\tt.Fatalf(\"Error taking snapshot of fs: %s\", err)\n\t}\n\n\t// Check contents of the snapshot, make sure contents are sorted by name\n\tfilesInTar, err := listFilesInTar(tarPath)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif !sort.StringsAreSorted(filesInTar) {\n\t\tt.Fatalf(\"Expected the file in the tar archive were sorted, actual list was not sorted: %v\", filesInTar)\n\t}\n}\n\nfunc TestSnapshotFSChangePermissions(t *testing.T) {\n\ttestDir, snapshotter, cleanup, err := setUpTest(t)\n\ttestDirWithoutLeadingSlash := strings.TrimLeft(testDir, \"/\")\n\tdefer cleanup()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\t// Change permissions on a file\n\tbatPath := filepath.Join(testDir, \"bar/bat\")\n\tbatPathWithoutLeadingSlash := filepath.Join(testDirWithoutLeadingSlash, \"bar/bat\")\n\tif err := os.Chmod(batPath, 0600); err != nil {\n\t\tt.Fatalf(\"Error changing permissions on %s: %v\", batPath, err)\n\t}\n\t// Take another snapshot\n\ttarPath, err := snapshotter.TakeSnapshotFS()\n\tif err != nil {\n\t\tt.Fatalf(\"Error taking snapshot of fs: %s\", err)\n\t}\n\tf, err := os.Open(tarPath)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\t// Check contents of the snapshot, make sure contents is equivalent to snapshotFiles\n\ttr := tar.NewReader(f)\n\tsnapshotFiles := map[string]string{\n\t\tbatPathWithoutLeadingSlash: \"baz2\",\n\t}\n\tfor _, path := range util.ParentDirectoriesWithoutLeadingSlash(batPathWithoutLeadingSlash) {\n\t\tif path == \"/\" {\n\t\t\tsnapshotFiles[\"/\"] = \"\"\n\t\t\tcontinue\n\t\t}\n\t\tsnapshotFiles[path+\"/\"] = \"\"\n\t}\n\n\tfoundFiles := []string{}\n\tfor {\n\t\thdr, err := tr.Next()\n\t\tif errors.Is(err, io.EOF) {\n\t\t\tbreak\n\t\t}\n\t\tfoundFiles = append(foundFiles, hdr.Name)\n\t\tif _, isFile := snapshotFiles[hdr.Name]; !isFile {\n\t\t\tt.Fatalf(\"File %s unexpectedly in tar\", hdr.Name)\n\t\t}\n\t\tif hdr.Typeflag == tar.TypeDir {\n\t\t\tcontinue\n\t\t}\n\t\tcontents, _ := io.ReadAll(tr)\n\t\tif string(contents) != snapshotFiles[hdr.Name] {\n\t\t\tt.Fatalf(\"Contents of %s incorrect, expected: %s, actual: %s\", hdr.Name, snapshotFiles[hdr.Name], string(contents))\n\t\t}\n\t}\n\tif len(foundFiles) != len(snapshotFiles) {\n\t\tt.Logf(\"expected\\n%v\\not equal\\n%v\", foundFiles, snapshotFiles)\n\t\tt.Fatalf(\"Incorrect number of files were added, expected: %d, got: %d\",\n\t\t\tlen(snapshotFiles),\n\t\t\tlen(foundFiles))\n\t}\n}\n\nfunc TestSnapshotFSReplaceDirWithLink(t *testing.T) {\n\ttestDir, snapshotter, cleanup, err := setUpTest(t)\n\tdefer cleanup()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// replace non-empty directory \"bar\" with link to file \"foo\"\n\tbar := filepath.Join(testDir, \"bar\")\n\terr = os.RemoveAll(bar)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tfoo := filepath.Join(testDir, \"foo\")\n\terr = os.Symlink(foo, bar)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\ttarPath, err := snapshotter.TakeSnapshotFS()\n\tif err != nil {\n\t\tt.Fatalf(\"Error taking snapshot of fs: %s\", err)\n\t}\n\n\tactualFiles, err := listFilesInTar(tarPath)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Expect \"bar\", which used to be a non-empty directory but now is a symlink. We don't want whiteout files for\n\t// the deleted files in bar, because without a parent directory for them the tar cannot be extracted.\n\ttestDirWithoutLeadingSlash := strings.TrimLeft(testDir, \"/\")\n\texpectedFiles := []string{\n\t\tfilepath.Join(testDirWithoutLeadingSlash, \"bar\"),\n\t\tfilepath.Join(testDirWithoutLeadingSlash, \"foo\"),\n\t}\n\tfor _, path := range util.ParentDirectoriesWithoutLeadingSlash(filepath.Join(testDir, \"foo\")) {\n\t\texpectedFiles = append(expectedFiles, strings.TrimRight(path, \"/\")+\"/\")\n\t}\n\n\tsort.Strings(expectedFiles)\n\tsort.Strings(actualFiles)\n\ttestutil.CheckErrorAndDeepEqual(t, false, nil, expectedFiles, actualFiles)\n}\n\nfunc TestSnapshotFiles(t *testing.T) {\n\ttestDir, snapshotter, cleanup, err := setUpTest(t)\n\ttestDirWithoutLeadingSlash := strings.TrimLeft(testDir, \"/\")\n\tdefer cleanup()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\t// Make some changes to the filesystem\n\tnewFiles := map[string]string{\n\t\t\"foo\": \"newbaz1\",\n\t}\n\tif err := testutil.SetupFiles(testDir, newFiles); err != nil {\n\t\tt.Fatalf(\"Error setting up fs: %s\", err)\n\t}\n\tfilesToSnapshot := []string{\n\t\tfilepath.Join(testDir, \"foo\"),\n\t}\n\ttarPath, err := snapshotter.TakeSnapshot(filesToSnapshot, false, false)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer os.Remove(tarPath)\n\n\texpectedFiles := []string{\n\t\tfilepath.Join(testDirWithoutLeadingSlash, \"foo\"),\n\t}\n\tfor _, path := range util.ParentDirectoriesWithoutLeadingSlash(filepath.Join(testDir, \"foo\")) {\n\t\texpectedFiles = append(expectedFiles, strings.TrimRight(path, \"/\")+\"/\")\n\t}\n\n\t// Check contents of the snapshot, make sure contents is equivalent to snapshotFiles\n\tactualFiles, err := listFilesInTar(tarPath)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tsort.Strings(expectedFiles)\n\tsort.Strings(actualFiles)\n\ttestutil.CheckErrorAndDeepEqual(t, false, nil, expectedFiles, actualFiles)\n}\n\nfunc TestEmptySnapshotFS(t *testing.T) {\n\t_, snapshotter, cleanup, err := setUpTest(t)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer cleanup()\n\n\t// Take snapshot with no changes\n\ttarPath, err := snapshotter.TakeSnapshotFS()\n\tif err != nil {\n\t\tt.Fatalf(\"Error taking snapshot of fs: %s\", err)\n\t}\n\n\tf, err := os.Open(tarPath)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\ttr := tar.NewReader(f)\n\n\tif _, err := tr.Next(); !errors.Is(err, io.EOF) {\n\t\tt.Fatal(\"no files expected in tar, found files.\")\n\t}\n}\n\nfunc TestFileWithLinks(t *testing.T) {\n\n\tlink := \"baz/link\"\n\ttcs := []struct {\n\t\tname           string\n\t\tpath           string\n\t\tlinkFileTarget string\n\t\texpected       []string\n\t\tshouldErr      bool\n\t}{\n\t\t{\n\t\t\tname:           \"given path is a symlink that points to a valid target\",\n\t\t\tpath:           link,\n\t\t\tlinkFileTarget: \"file\",\n\t\t\texpected:       []string{link, \"baz/file\"},\n\t\t},\n\t\t{\n\t\t\tname:           \"given path is a symlink points to non existing path\",\n\t\t\tpath:           link,\n\t\t\tlinkFileTarget: \"does-not-exists\",\n\t\t\texpected:       []string{link},\n\t\t},\n\t\t{\n\t\t\tname:           \"given path is a regular file\",\n\t\t\tpath:           \"kaniko/file\",\n\t\t\tlinkFileTarget: \"file\",\n\t\t\texpected:       []string{\"kaniko/file\"},\n\t\t},\n\t}\n\n\tfor _, tt := range tcs {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttestDir, err := setUpTestDir(t)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif err := setupSymlink(testDir, link, tt.linkFileTarget); err != nil {\n\t\t\t\tt.Fatalf(\"could not set up symlink due to %s\", err)\n\t\t\t}\n\t\t\tactual, err := filesWithLinks(filepath.Join(testDir, tt.path))\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"unexpected error %s\", err)\n\t\t\t}\n\t\t\tsortAndCompareFilepaths(t, testDir, tt.expected, actual)\n\t\t})\n\t}\n}\n\nfunc TestSnapshotPreservesFileOrder(t *testing.T) {\n\tnewFiles := map[string]string{\n\t\t\"foo\":     \"newbaz1\",\n\t\t\"bar/bat\": \"baz\",\n\t\t\"bar/qux\": \"quuz\",\n\t\t\"qux\":     \"quuz\",\n\t\t\"corge\":   \"grault\",\n\t\t\"garply\":  \"waldo\",\n\t\t\"fred\":    \"plugh\",\n\t\t\"xyzzy\":   \"thud\",\n\t}\n\n\tnewFileNames := []string{}\n\n\tfor fileName := range newFiles {\n\t\tnewFileNames = append(newFileNames, fileName)\n\t}\n\n\tfilesInTars := [][]string{}\n\n\tfor i := 0; i <= 2; i++ {\n\t\ttestDir, snapshotter, cleanup, err := setUpTest(t)\n\t\ttestDirWithoutLeadingSlash := strings.TrimLeft(testDir, \"/\")\n\t\tdefer cleanup()\n\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\t// Make some changes to the filesystem\n\t\tif err := testutil.SetupFiles(testDir, newFiles); err != nil {\n\t\t\tt.Fatalf(\"Error setting up fs: %s\", err)\n\t\t}\n\n\t\tfilesToSnapshot := []string{}\n\t\tfor _, file := range newFileNames {\n\t\t\tfilesToSnapshot = append(filesToSnapshot, filepath.Join(testDir, file))\n\t\t}\n\n\t\t// Take a snapshot\n\t\ttarPath, err := snapshotter.TakeSnapshot(filesToSnapshot, false, false)\n\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error taking snapshot of fs: %s\", err)\n\t\t}\n\n\t\tfilesInTar, err := listFilesInTar(tarPath)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tfilesInTars = append(filesInTars, []string{})\n\t\tfor _, fn := range filesInTar {\n\t\t\tfilesInTars[i] = append(filesInTars[i], strings.TrimPrefix(fn, testDirWithoutLeadingSlash))\n\t\t}\n\t}\n\n\t// Check contents of all snapshots, make sure files appear in consistent order\n\tfor i := 1; i < len(filesInTars); i++ {\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, nil, filesInTars[0], filesInTars[i])\n\t}\n}\n\nfunc TestSnapshotWithForceBuildMetadataSet(t *testing.T) {\n\t_, snapshotter, cleanup, err := setUpTest(t)\n\tdefer cleanup()\n\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tfilesToSnapshot := []string{}\n\n\t// snapshot should be taken regardless, if forceBuildMetadata flag is set\n\tfilename, err := snapshotter.TakeSnapshot(filesToSnapshot, false, true)\n\tif err != nil {\n\t\tt.Fatalf(\"Error taking snapshot of fs: %s\", err)\n\t}\n\tif filename == \"\" {\n\t\tt.Fatalf(\"Filename returned from snapshot is empty.\")\n\t}\n}\n\nfunc TestSnapshotWithForceBuildMetadataIsNotSet(t *testing.T) {\n\t_, snapshotter, cleanup, err := setUpTest(t)\n\tdefer cleanup()\n\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tfilesToSnapshot := []string{}\n\n\t// snapshot should not be taken\n\tfilename, err := snapshotter.TakeSnapshot(filesToSnapshot, false, false)\n\tif err != nil {\n\t\tt.Fatalf(\"Error taking snapshot of fs: %s\", err)\n\t}\n\tif filename != \"\" {\n\t\tt.Fatalf(\"Filename returned is expected to be empty.\")\n\t}\n}\n\nfunc TestSnapshotIncludesParentDirBeforeWhiteoutFile(t *testing.T) {\n\ttestDir, snapshotter, cleanup, err := setUpTest(t)\n\tdefer cleanup()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Take a snapshot\n\tfilesToSnapshot := []string{filepath.Join(testDir, \"kaniko/file\", \"bar/bat\")}\n\t_, err = snapshotter.TakeSnapshot(filesToSnapshot, false, false)\n\tif err != nil {\n\t\tt.Fatalf(\"Error taking snapshot of fs: %s\", err)\n\t}\n\n\t// Add a file\n\tnewFiles := map[string]string{\n\t\t\"kaniko/new-file\": \"baz\",\n\t}\n\tif err := testutil.SetupFiles(testDir, newFiles); err != nil {\n\t\tt.Fatalf(\"Error setting up fs: %s\", err)\n\t}\n\tfilesToSnapshot = append(filesToSnapshot, filepath.Join(testDir, \"kaniko/new-file\"))\n\n\t// Delete files\n\tfilesToDelete := []string{\"kaniko/file\", \"bar\"}\n\tfor _, fn := range filesToDelete {\n\t\terr = os.RemoveAll(filepath.Join(testDir, fn))\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error deleting file: %s\", err)\n\t\t}\n\t}\n\n\t// Take a snapshot again\n\ttarPath, err := snapshotter.TakeSnapshot(filesToSnapshot, true, false)\n\tif err != nil {\n\t\tt.Fatalf(\"Error taking snapshot of fs: %s\", err)\n\t}\n\n\tactualFiles, err := listFilesInTar(tarPath)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\ttestDirWithoutLeadingSlash := strings.TrimLeft(testDir, \"/\")\n\texpectedFiles := []string{\n\t\tfilepath.Join(testDirWithoutLeadingSlash, \"kaniko/.wh.file\"),\n\t\tfilepath.Join(testDirWithoutLeadingSlash, \"kaniko/new-file\"),\n\t\tfilepath.Join(testDirWithoutLeadingSlash, \".wh.bar\"),\n\t\t\"/\",\n\t}\n\tfor parentDir := filepath.Dir(expectedFiles[0]); parentDir != \".\"; parentDir = filepath.Dir(parentDir) {\n\t\texpectedFiles = append(expectedFiles, parentDir+\"/\")\n\t}\n\n\t// Sorting does the right thing in this case. The expected order for a directory is:\n\t// Parent dirs first, then whiteout files in the directory, then other files in that directory\n\tsort.Strings(expectedFiles)\n\n\ttestutil.CheckErrorAndDeepEqual(t, false, nil, expectedFiles, actualFiles)\n}\n\nfunc TestSnapshotPreservesWhiteoutOrder(t *testing.T) {\n\tnewFiles := map[string]string{\n\t\t\"foo\":     \"newbaz1\",\n\t\t\"bar/bat\": \"baz\",\n\t\t\"bar/qux\": \"quuz\",\n\t\t\"qux\":     \"quuz\",\n\t\t\"corge\":   \"grault\",\n\t\t\"garply\":  \"waldo\",\n\t\t\"fred\":    \"plugh\",\n\t\t\"xyzzy\":   \"thud\",\n\t}\n\n\tnewFileNames := []string{}\n\n\tfor fileName := range newFiles {\n\t\tnewFileNames = append(newFileNames, fileName)\n\t}\n\n\tfilesInTars := [][]string{}\n\n\tfor i := 0; i <= 2; i++ {\n\t\ttestDir, snapshotter, cleanup, err := setUpTest(t)\n\t\ttestDirWithoutLeadingSlash := strings.TrimLeft(testDir, \"/\")\n\t\tdefer cleanup()\n\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\t// Make some changes to the filesystem\n\t\tif err := testutil.SetupFiles(testDir, newFiles); err != nil {\n\t\t\tt.Fatalf(\"Error setting up fs: %s\", err)\n\t\t}\n\n\t\tfilesToSnapshot := []string{}\n\t\tfor _, file := range newFileNames {\n\t\t\tfilesToSnapshot = append(filesToSnapshot, filepath.Join(testDir, file))\n\t\t}\n\n\t\t// Take a snapshot\n\t\t_, err = snapshotter.TakeSnapshot(filesToSnapshot, false, false)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error taking snapshot of fs: %s\", err)\n\t\t}\n\n\t\t// Delete all files\n\t\tfor p := range newFiles {\n\t\t\terr := os.Remove(filepath.Join(testDir, p))\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Error deleting file: %s\", err)\n\t\t\t}\n\t\t}\n\n\t\t// Take a snapshot again\n\t\ttarPath, err := snapshotter.TakeSnapshot(filesToSnapshot, true, false)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Error taking snapshot of fs: %s\", err)\n\t\t}\n\n\t\tfilesInTar, err := listFilesInTar(tarPath)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tfilesInTars = append(filesInTars, []string{})\n\t\tfor _, fn := range filesInTar {\n\t\t\tfilesInTars[i] = append(filesInTars[i], strings.TrimPrefix(fn, testDirWithoutLeadingSlash))\n\t\t}\n\t}\n\n\t// Check contents of all snapshots, make sure files appear in consistent order\n\tfor i := 1; i < len(filesInTars); i++ {\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, nil, filesInTars[0], filesInTars[i])\n\t}\n}\n\nfunc TestSnapshotOmitsUnameGname(t *testing.T) {\n\t_, snapshotter, cleanup, err := setUpTest(t)\n\n\tdefer cleanup()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\ttarPath, err := snapshotter.TakeSnapshotFS()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tf, err := os.Open(tarPath)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\ttr := tar.NewReader(f)\n\tfor {\n\t\thdr, err := tr.Next()\n\t\tif errors.Is(err, io.EOF) {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tif hdr.Uname != \"\" || hdr.Gname != \"\" {\n\t\t\tt.Fatalf(\"Expected Uname/Gname for %s to be empty: Uname = '%s', Gname = '%s'\", hdr.Name, hdr.Uname, hdr.Gname)\n\t\t}\n\t}\n\n}\n\nfunc setupSymlink(dir string, link string, target string) error {\n\treturn os.Symlink(target, filepath.Join(dir, link))\n}\n\nfunc sortAndCompareFilepaths(t *testing.T, testDir string, expected []string, actual []string) {\n\texpectedFullPaths := make([]string, len(expected))\n\tfor i, file := range expected {\n\t\texpectedFullPaths[i] = filepath.Join(testDir, file)\n\t}\n\tsort.Strings(expectedFullPaths)\n\tsort.Strings(actual)\n\ttestutil.CheckDeepEqual(t, expectedFullPaths, actual)\n}\n\nfunc setUpTestDir(t *testing.T) (string, error) {\n\ttestDir := t.TempDir()\n\tfiles := map[string]string{\n\t\t\"foo\":         \"baz1\",\n\t\t\"bar/bat\":     \"baz2\",\n\t\t\"kaniko/file\": \"file\",\n\t\t\"baz/file\":    \"testfile\",\n\t}\n\t// Set up initial files\n\tif err := testutil.SetupFiles(testDir, files); err != nil {\n\t\treturn \"\", errors.Wrap(err, \"setting up file system\")\n\t}\n\n\treturn testDir, nil\n}\n\nfunc setUpTest(t *testing.T) (string, *Snapshotter, func(), error) {\n\ttestDir, err := setUpTestDir(t)\n\tif err != nil {\n\t\treturn \"\", nil, nil, err\n\t}\n\n\tsnapshotPath := t.TempDir()\n\tsnapshotPathPrefix = snapshotPath\n\n\t// Take the initial snapshot\n\tl := NewLayeredMap(util.Hasher())\n\tsnapshotter := NewSnapshotter(l, testDir)\n\tif err := snapshotter.Init(); err != nil {\n\t\treturn \"\", nil, nil, errors.Wrap(err, \"initializing snapshotter\")\n\t}\n\n\toriginal := config.KanikoDir\n\tconfig.KanikoDir = testDir\n\tcleanup := func() {\n\t\tconfig.KanikoDir = original\n\t}\n\n\treturn testDir, snapshotter, cleanup, nil\n}\n\nfunc listFilesInTar(path string) ([]string, error) {\n\tf, err := os.Open(path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ttr := tar.NewReader(f)\n\tvar files []string\n\tfor {\n\t\thdr, err := tr.Next()\n\t\tif errors.Is(err, io.EOF) {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfiles = append(files, hdr.Name)\n\t}\n\treturn files, nil\n}\n"
  },
  {
    "path": "pkg/timing/timing.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage timing\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"sync\"\n\t\"text/template\"\n\t\"time\"\n)\n\n// For testing\nvar currentTimeFunc = time.Now\n\n// DefaultRun is the default \"singleton\" TimedRun instance.\nvar DefaultRun = NewTimedRun()\n\n// TimedRun provides a running store of how long is spent in each category.\ntype TimedRun struct {\n\tcl         sync.Mutex\n\tcategories map[string]time.Duration // protected by cl\n}\n\n// Stop stops the specified timer and increments the time spent in that category.\nfunc (tr *TimedRun) Stop(t *Timer) {\n\tstop := currentTimeFunc()\n\ttr.cl.Lock()\n\tdefer tr.cl.Unlock()\n\tif _, ok := tr.categories[t.category]; !ok {\n\t\ttr.categories[t.category] = 0\n\t}\n\ttr.categories[t.category] += stop.Sub(t.startTime)\n}\n\n// Start starts a new Timer and returns it.\nfunc Start(category string) *Timer {\n\tt := Timer{\n\t\tcategory:  category,\n\t\tstartTime: currentTimeFunc(),\n\t}\n\treturn &t\n}\n\n// NewTimedRun returns an initialized TimedRun instance.\nfunc NewTimedRun() *TimedRun {\n\ttr := TimedRun{\n\t\tcategories: map[string]time.Duration{},\n\t}\n\treturn &tr\n}\n\n// Timer represents a running timer.\ntype Timer struct {\n\tcategory  string\n\tstartTime time.Time\n}\n\n// DefaultFormat is a default format string used by Summary.\nvar DefaultFormat = template.Must(template.New(\"\").Parse(\"{{range $c, $t := .}}{{$c}}: {{$t}}\\n{{end}}\"))\n\n// Summary outputs a summary of the DefaultTimedRun.\nfunc Summary() string {\n\treturn DefaultRun.Summary()\n}\n\nfunc JSON() (string, error) {\n\treturn DefaultRun.JSON()\n}\n\n// Summary outputs a summary of the specified TimedRun.\nfunc (tr *TimedRun) Summary() string {\n\tb := bytes.Buffer{}\n\n\ttr.cl.Lock()\n\tdefer tr.cl.Unlock()\n\tDefaultFormat.Execute(&b, tr.categories)\n\treturn b.String()\n}\n\nfunc (tr *TimedRun) JSON() (string, error) {\n\tb, err := json.Marshal(tr.categories)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn string(b), nil\n}\n"
  },
  {
    "path": "pkg/timing/timing_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage timing\n\nimport (\n\t\"testing\"\n\t\"time\"\n)\n\nfunc patchTime(timeFunc func() time.Time) func() {\n\told := currentTimeFunc\n\tcurrentTimeFunc = timeFunc\n\treturn func() {\n\t\tcurrentTimeFunc = old\n\t}\n}\n\nfunc mockTimeFunc(t time.Time) func() time.Time {\n\treturn func() time.Time {\n\t\treturn t\n\t}\n}\n\nfunc TestTimedRun_StartStop(t *testing.T) {\n\ttype args struct {\n\t\tcategories map[string]time.Duration\n\t\tcategory   string\n\t\twaitTime   time.Duration\n\t}\n\ttests := []struct {\n\t\tname string\n\t\targs args\n\t\twant time.Duration\n\t}{\n\t\t{\n\t\t\tname: \"new category\",\n\t\t\targs: args{\n\t\t\t\tcategories: map[string]time.Duration{},\n\t\t\t\tcategory:   \"foo\",\n\t\t\t\twaitTime:   3 * time.Second,\n\t\t\t},\n\t\t\twant: 3 * time.Second,\n\t\t},\n\t\t{\n\t\t\tname: \"existing category\",\n\t\t\targs: args{\n\t\t\t\tcategories: map[string]time.Duration{\n\t\t\t\t\t\"foo\": 4 * time.Second,\n\t\t\t\t},\n\t\t\t\tcategory: \"foo\",\n\t\t\t\twaitTime: 2 * time.Second,\n\t\t\t},\n\t\t\twant: 6 * time.Second,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttr := &TimedRun{\n\t\t\t\tcategories: tt.args.categories,\n\t\t\t}\n\n\t\t\ttimer := Timer{\n\t\t\t\tcategory:  tt.args.category,\n\t\t\t\tstartTime: time.Time{},\n\t\t\t}\n\n\t\t\tdefer patchTime(mockTimeFunc(timer.startTime.Add(tt.args.waitTime)))()\n\t\t\ttr.Stop(&timer)\n\t\t\tif got := tr.categories[tt.args.category]; got != tt.want {\n\t\t\t\tt.Errorf(\"Expected %d, got %d\", tt.want, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestTimedRun_Summary(t *testing.T) {\n\ttype fields struct {\n\t\tcategories map[string]time.Duration\n\t}\n\ttests := []struct {\n\t\tname   string\n\t\tfields fields\n\t\twant   string\n\t}{\n\t\t{\n\t\t\tname: \"single key\",\n\t\t\tfields: fields{\n\t\t\t\tcategories: map[string]time.Duration{\n\t\t\t\t\t\"foo\": 3 * time.Second,\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: \"foo: 3s\\n\",\n\t\t},\n\t\t{\n\t\t\tname: \"two keys\",\n\t\t\tfields: fields{\n\t\t\t\tcategories: map[string]time.Duration{\n\t\t\t\t\t\"foo\": 3 * time.Second,\n\t\t\t\t\t\"bar\": 1 * time.Second,\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: \"bar: 1s\\nfoo: 3s\\n\",\n\t\t},\n\t\t{\n\t\t\tname: \"units\",\n\t\t\tfields: fields{\n\t\t\t\tcategories: map[string]time.Duration{\n\t\t\t\t\t\"foo\": 3 * time.Second,\n\t\t\t\t\t\"bar\": 1 * time.Millisecond,\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: \"bar: 1ms\\nfoo: 3s\\n\",\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttr := &TimedRun{\n\t\t\t\tcategories: tt.fields.categories,\n\t\t\t}\n\t\t\tif got := tr.Summary(); got != tt.want {\n\t\t\t\tt.Errorf(\"TimedRun.Summary() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/util/.editorconfig",
    "content": "root = true\n\n[*]\n"
  },
  {
    "path": "pkg/util/azureblob_util.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage util\n\nimport (\n\t\"regexp\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/constants\"\n)\n\n// Validate if the host url provided is with correct suffix for AzureCloud, AzureChinaCloud, AzureGermanCloud and AzureUSGovernment\n// RegEX for supported suffix defined in constants.AzureBlobStorageHostRegEx\nfunc ValidAzureBlobStorageHost(context string) bool {\n\tfor _, re := range constants.AzureBlobStorageHostRegEx {\n\t\tvalidBlobURL := regexp.MustCompile(re)\n\t\tif validBlobURL.MatchString(context) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n"
  },
  {
    "path": "pkg/util/azureblob_util_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage util\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n)\n\nfunc Test_ValidAzureBlobStorageHost(t *testing.T) {\n\ttests := []struct {\n\t\tname           string\n\t\tcontext        string\n\t\texpectedResult bool\n\t}{\n\t\t{\n\t\t\tname:           \"AzureCloud\",\n\t\t\tcontext:        \"https://myaccount.blob.core.windows.net/fairingcontext/context.tar.gz\",\n\t\t\texpectedResult: true,\n\t\t},\n\t\t{\n\t\t\tname:           \"AzureChinaCloud\",\n\t\t\tcontext:        \"https://myaccount.blob.core.chinacloudapi.cn/fairingcontext/context.tar.gz\",\n\t\t\texpectedResult: true,\n\t\t},\n\t\t{\n\t\t\tname:           \"AzureGermanCloud\",\n\t\t\tcontext:        \"https://myaccount.blob.core.cloudapi.de/fairingcontext/context.tar.gz\",\n\t\t\texpectedResult: true,\n\t\t},\n\t\t{\n\t\t\tname:           \"AzureUSGovernment\",\n\t\t\tcontext:        \"https://myaccount.blob.core.usgovcloudapi.net/fairingcontext/context.tar.gz\",\n\t\t\texpectedResult: true,\n\t\t},\n\t\t{\n\t\t\tname:           \"Invalid Azure Blob Storage Hostname\",\n\t\t\tcontext:        \"https://myaccount.anything.core.windows.net/fairingcontext/context.tar.gz\",\n\t\t\texpectedResult: false,\n\t\t},\n\t\t{\n\t\t\tname:           \"URL Missing Accountname\",\n\t\t\tcontext:        \"https://blob.core.windows.net/fairingcontext/context.tar.gz\",\n\t\t\texpectedResult: false,\n\t\t},\n\t\t{\n\t\t\tname:           \"URL Missing Containername\",\n\t\t\tcontext:        \"https://myaccount.blob.core.windows.net/\",\n\t\t\texpectedResult: false,\n\t\t},\n\t\t{\n\t\t\tname:           \"URL with folder structure\",\n\t\t\tcontext:        \"https://myaccount.blob.core.windows.net/fairingcontext/path/to/context.tar.gz\",\n\t\t\texpectedResult: true,\n\t\t},\n\t\t{\n\t\t\tname:           \"URL with $root container\",\n\t\t\tcontext:        \"https://myaccount.blob.core.windows.net/$root/context.tar.gz\",\n\t\t\texpectedResult: true,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tresult := ValidAzureBlobStorageHost(test.context)\n\t\t\ttestutil.CheckDeepEqual(t, test.expectedResult, result)\n\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/util/bucket/bucket_util.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage bucket\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/url\"\n\t\"strings\"\n\n\t\"cloud.google.com/go/storage\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/constants\"\n\t\"google.golang.org/api/option\"\n)\n\n// Upload uploads everything from Reader to the bucket under path\nfunc Upload(ctx context.Context, bucketName string, path string, r io.Reader, client *storage.Client) error {\n\tbucket := client.Bucket(bucketName)\n\tw := bucket.Object(path).NewWriter(ctx)\n\tif _, err := io.Copy(w, r); err != nil {\n\t\treturn err\n\t}\n\tif err := w.Close(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Delete will remove the content at path. path should be the full path\n// to a file in GCS.\nfunc Delete(ctx context.Context, bucketName string, path string, client *storage.Client) error {\n\terr := client.Bucket(bucketName).Object(path).Delete(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to delete file at %s in gcs bucket %v: %w\", path, bucketName, err)\n\t}\n\treturn err\n}\n\n// ReadCloser will create io.ReadCloser for the specified bucket and path\nfunc ReadCloser(ctx context.Context, bucketName string, path string, client *storage.Client) (io.ReadCloser, error) {\n\tbucket := client.Bucket(bucketName)\n\tr, err := bucket.Object(path).NewReader(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn r, nil\n}\n\n// NewClient returns a new google storage client\nfunc NewClient(ctx context.Context, opts ...option.ClientOption) (*storage.Client, error) {\n\tclient, err := storage.NewClient(ctx, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn client, err\n}\n\n// GetNameAndFilepathFromURI returns the bucketname and the path to the item inside.\n// Will error if provided URI is not a valid URL.\n// If the filepath is empty, returns the contextTar filename\nfunc GetNameAndFilepathFromURI(bucketURI string) (bucketName string, path string, err error) {\n\turl, err := url.Parse(bucketURI)\n\tif err != nil {\n\t\treturn \"\", \"\", err\n\t}\n\tbucketName = url.Host\n\t// remove leading slash\n\tfilePath := strings.TrimPrefix(url.Path, \"/\")\n\tif filePath == \"\" {\n\t\tfilePath = constants.ContextTar\n\t}\n\treturn bucketName, filePath, nil\n}\n"
  },
  {
    "path": "pkg/util/bucket/bucket_util_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage bucket\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/constants\"\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n)\n\nfunc Test_GetBucketAndItem(t *testing.T) {\n\ttests := []struct {\n\t\tname           string\n\t\tcontext        string\n\t\texpectedBucket string\n\t\texpectedItem   string\n\t\texpectedErr    bool\n\t}{\n\t\t{\n\t\t\tname:           \"three slashes\",\n\t\t\tcontext:        \"gs://test1/test2/test3\",\n\t\t\texpectedBucket: \"test1\",\n\t\t\texpectedItem:   \"test2/test3\",\n\t\t},\n\t\t{\n\t\t\tname:           \"two slashes\",\n\t\t\tcontext:        \"gs://test1/test2\",\n\t\t\texpectedBucket: \"test1\",\n\t\t\texpectedItem:   \"test2\",\n\t\t},\n\t\t{\n\t\t\tname:           \"one slash\",\n\t\t\tcontext:        \"gs://test1/\",\n\t\t\texpectedBucket: \"test1\",\n\t\t\texpectedItem:   constants.ContextTar,\n\t\t},\n\t\t{\n\t\t\tname:           \"zero slash\",\n\t\t\tcontext:        \"gs://test1\",\n\t\t\texpectedBucket: \"test1\",\n\t\t\texpectedItem:   constants.ContextTar,\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tgotBucket, gotItem, err := GetNameAndFilepathFromURI(test.context)\n\t\t\ttestutil.CheckError(t, test.expectedErr, err)\n\t\t\ttestutil.CheckDeepEqual(t, test.expectedBucket, gotBucket)\n\t\t\ttestutil.CheckDeepEqual(t, test.expectedItem, gotItem)\n\t\t})\n\t}\n\n}\n"
  },
  {
    "path": "pkg/util/command_util.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage util\n\nimport (\n\t\"fmt\"\n\t\"io/fs\"\n\t\"net/url\"\n\t\"os\"\n\t\"os/user\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/parser\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/shell\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n)\n\n// for testing\nvar (\n\tgetUIDAndGIDFunc = getUIDAndGID\n)\n\nconst (\n\tpathSeparator = \"/\"\n)\n\n// ResolveEnvironmentReplacementList resolves a list of values by calling resolveEnvironmentReplacement\nfunc ResolveEnvironmentReplacementList(values, envs []string, isFilepath bool) ([]string, error) {\n\tvar resolvedValues []string\n\tfor _, value := range values {\n\t\tresolved, err := ResolveEnvironmentReplacement(value, envs, isFilepath)\n\t\tlogrus.Debugf(\"Resolved %s to %s\", value, resolved)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tresolvedValues = append(resolvedValues, resolved)\n\t}\n\treturn resolvedValues, nil\n}\n\n// ResolveEnvironmentReplacement resolves replacing env variables in some text from envs\n// It takes in a string representation of the command, the value to be resolved, and a list of envs (config.Env)\n// Ex: value = $foo/newdir, envs = [foo=/foodir], then this should return /foodir/newdir\n// The dockerfile/shell package handles processing env values\n// It handles escape characters and supports expansion from the config.Env array\n// Shlex handles some of the following use cases (these and more are tested in integration tests)\n// \"\"a'b'c\"\" -> \"a'b'c\"\n// \"Rex\\ The\\ Dog \\\" -> \"Rex The Dog\"\n// \"a\\\"b\" -> \"a\"b\"\nfunc ResolveEnvironmentReplacement(value string, envs []string, isFilepath bool) (string, error) {\n\tshlex := shell.NewLex(parser.DefaultEscapeToken)\n\tfp, _, err := shlex.ProcessWord(value, shell.EnvsFromSlice(envs))\n\t// Check after replacement if value is a remote URL\n\tif !isFilepath || IsSrcRemoteFileURL(fp) {\n\t\treturn fp, err\n\t}\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tisDir := strings.HasSuffix(fp, pathSeparator)\n\tfp = filepath.Clean(fp)\n\tif isDir && !strings.HasSuffix(fp, pathSeparator) {\n\t\tfp = fp + pathSeparator\n\t}\n\treturn fp, nil\n}\n\nfunc ResolveEnvAndWildcards(sd instructions.SourcesAndDest, fileContext FileContext, envs []string) ([]string, string, error) {\n\t// First, resolve any environment replacement\n\tresolvedEnvs, err := ResolveEnvironmentReplacementList(sd.SourcePaths, envs, true)\n\tif err != nil {\n\t\treturn nil, \"\", errors.Wrap(err, \"failed to resolve environment\")\n\t}\n\tif len(resolvedEnvs) == 0 {\n\t\treturn nil, \"\", errors.New(\"resolved envs is empty\")\n\t}\n\tdests, err := ResolveEnvironmentReplacementList([]string{sd.DestPath}, envs, true)\n\tif err != nil {\n\t\treturn nil, \"\", errors.Wrap(err, \"failed to resolve environment for dest path\")\n\t}\n\tdest := dests[0]\n\tsd.DestPath = dest\n\t// Resolve wildcards and get a list of resolved sources\n\tsrcs, err := ResolveSources(resolvedEnvs, fileContext.Root)\n\tif err != nil {\n\t\treturn nil, \"\", errors.Wrap(err, \"failed to resolve sources\")\n\t}\n\terr = IsSrcsValid(sd, srcs, fileContext)\n\treturn srcs, dest, err\n}\n\n// ContainsWildcards returns true if any entry in paths contains wildcards\nfunc ContainsWildcards(paths []string) bool {\n\tfor _, path := range paths {\n\t\tif strings.ContainsAny(path, \"*?[\") {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// ResolveSources resolves the given sources if the sources contains wildcards\n// It returns a list of resolved sources\nfunc ResolveSources(srcs []string, root string) ([]string, error) {\n\t// If sources contain wildcards, we first need to resolve them to actual paths\n\tif !ContainsWildcards(srcs) {\n\t\treturn srcs, nil\n\t}\n\tlogrus.Infof(\"Resolving srcs %v...\", srcs)\n\tfiles, err := RelativeFiles(\"\", root)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"resolving sources\")\n\t}\n\tresolved, err := matchSources(srcs, files)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"matching sources\")\n\t}\n\tlogrus.Debugf(\"Resolved sources to %v\", resolved)\n\treturn resolved, nil\n}\n\n// matchSources returns a list of sources that match wildcards\nfunc matchSources(srcs, files []string) ([]string, error) {\n\tvar matchedSources []string\n\tfor _, src := range srcs {\n\t\tif IsSrcRemoteFileURL(src) {\n\t\t\tmatchedSources = append(matchedSources, src)\n\t\t\tcontinue\n\t\t}\n\t\tsrc = filepath.Clean(src)\n\t\tfor _, file := range files {\n\t\t\tif filepath.IsAbs(src) {\n\t\t\t\tfile = filepath.Join(config.RootDir, file)\n\t\t\t}\n\t\t\tmatched, err := filepath.Match(src, file)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif matched || src == file {\n\t\t\t\tmatchedSources = append(matchedSources, file)\n\t\t\t}\n\t\t}\n\t}\n\treturn matchedSources, nil\n}\n\nfunc IsDestDir(path string) bool {\n\t// try to stat the path\n\tfileInfo, err := os.Stat(path)\n\tif err != nil {\n\t\t// fall back to string-based determination\n\t\treturn strings.HasSuffix(path, pathSeparator) || path == \".\"\n\t}\n\t// if it's a real path, check the fs response\n\treturn fileInfo.IsDir()\n}\n\n// DestinationFilepath returns the destination filepath from the build context to the image filesystem\n// If source is a file:\n//\n//\tIf dest is a dir, copy it to /dest/relpath\n//\tIf dest is a file, copy directly to dest\n//\n// If source is a dir:\n//\n//\tAssume dest is also a dir, and copy to dest/\n//\n// If dest is not an absolute filepath, add /cwd to the beginning\nfunc DestinationFilepath(src, dest, cwd string) (string, error) {\n\t_, srcFileName := filepath.Split(src)\n\tnewDest := dest\n\n\tif !filepath.IsAbs(newDest) {\n\t\tnewDest = filepath.Join(cwd, newDest)\n\t\t// join call clean on all results.\n\t\tif strings.HasSuffix(dest, pathSeparator) || strings.HasSuffix(dest, \".\") {\n\t\t\tnewDest += pathSeparator\n\t\t}\n\t}\n\tif IsDestDir(newDest) {\n\t\tnewDest = filepath.Join(newDest, srcFileName)\n\t}\n\n\tif len(srcFileName) <= 0 && !strings.HasSuffix(newDest, pathSeparator) {\n\t\tnewDest += pathSeparator\n\t}\n\n\treturn newDest, nil\n}\n\n// URLDestinationFilepath gives the destination a file from a remote URL should be saved to\nfunc URLDestinationFilepath(rawurl, dest, cwd string, envs []string) (string, error) {\n\tif !IsDestDir(dest) {\n\t\tif !filepath.IsAbs(dest) {\n\t\t\treturn filepath.Join(cwd, dest), nil\n\t\t}\n\t\treturn dest, nil\n\t}\n\n\turlBase, err := ResolveEnvironmentReplacement(rawurl, envs, true)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\turlBase, err = extractFilename(urlBase)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tdestPath := filepath.Join(dest, urlBase)\n\n\tif !filepath.IsAbs(dest) {\n\t\tdestPath = filepath.Join(cwd, destPath)\n\t}\n\treturn destPath, nil\n}\n\nfunc IsSrcsValid(srcsAndDest instructions.SourcesAndDest, resolvedSources []string, fileContext FileContext) error {\n\tsrcs := srcsAndDest.SourcePaths\n\tdest := srcsAndDest.DestPath\n\n\tif !ContainsWildcards(srcs) {\n\t\ttotalSrcs := 0\n\t\tfor _, src := range srcs {\n\t\t\tif fileContext.ExcludesFile(src) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ttotalSrcs++\n\t\t}\n\t\tif totalSrcs > 1 && !IsDestDir(dest) {\n\t\t\treturn errors.New(\"when specifying multiple sources in a COPY command, destination must be a directory and end in '/'\")\n\t\t}\n\t}\n\n\t// If there is only one source and it's a directory, docker assumes the dest is a directory\n\tif len(resolvedSources) == 1 {\n\t\tif IsSrcRemoteFileURL(resolvedSources[0]) {\n\t\t\treturn nil\n\t\t}\n\t\tpath := filepath.Join(fileContext.Root, resolvedSources[0])\n\t\tfi, err := os.Lstat(path)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, fmt.Sprintf(\"failed to get fileinfo for %v\", path))\n\t\t}\n\t\tif fi.IsDir() {\n\t\t\treturn nil\n\t\t}\n\t}\n\n\ttotalFiles := 0\n\tfor _, src := range resolvedSources {\n\t\tif IsSrcRemoteFileURL(src) {\n\t\t\ttotalFiles++\n\t\t\tcontinue\n\t\t}\n\t\tsrc = filepath.Clean(src)\n\t\tfiles, err := RelativeFiles(src, fileContext.Root)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"failed to get relative files\")\n\t\t}\n\t\tfor _, file := range files {\n\t\t\tif fileContext.ExcludesFile(file) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ttotalFiles++\n\t\t}\n\t}\n\t// ignore the case where whildcards and there are no files to copy\n\tif totalFiles == 0 {\n\t\t// using log warning instead of return errors.New(\"copy failed: no source files specified\")\n\t\tlogrus.Warn(\"No files to copy\")\n\t}\n\t// If there are wildcards, and the destination is a file, there must be exactly one file to copy over,\n\t// Otherwise, return an error\n\tif !IsDestDir(dest) && totalFiles > 1 {\n\t\treturn errors.New(\"when specifying multiple sources in a COPY command, destination must be a directory and end in '/'\")\n\t}\n\treturn nil\n}\n\nfunc IsSrcRemoteFileURL(rawurl string) bool {\n\tu, err := url.ParseRequestURI(rawurl)\n\treturn err == nil && u.Scheme != \"\" && u.Host != \"\"\n}\n\nfunc UpdateConfigEnv(envVars []instructions.KeyValuePair, config *v1.Config, replacementEnvs []string) error {\n\tnewEnvs := make([]instructions.KeyValuePair, len(envVars))\n\tfor index, pair := range envVars {\n\t\texpandedKey, err := ResolveEnvironmentReplacement(pair.Key, replacementEnvs, false)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\texpandedValue, err := ResolveEnvironmentReplacement(pair.Value, replacementEnvs, false)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tnewEnvs[index] = instructions.KeyValuePair{\n\t\t\tKey:   expandedKey,\n\t\t\tValue: expandedValue,\n\t\t}\n\t}\n\n\t// First, convert config.Env array to []instruction.KeyValuePair\n\tvar kvps []instructions.KeyValuePair\n\tfor _, env := range config.Env {\n\t\tentry := strings.SplitN(env, \"=\", 2)\n\t\tkvps = append(kvps, instructions.KeyValuePair{\n\t\t\tKey:   entry[0],\n\t\t\tValue: entry[1],\n\t\t})\n\t}\n\t// Iterate through new environment variables, and replace existing keys\n\t// We can't use a map because we need to preserve the order of the environment variables\nLoop:\n\tfor _, newEnv := range newEnvs {\n\t\tfor index, kvp := range kvps {\n\t\t\t// If key exists, replace the KeyValuePair...\n\t\t\tif kvp.Key == newEnv.Key {\n\t\t\t\tlogrus.Debugf(\"Replacing environment variable %v with %v in config\", kvp, newEnv)\n\t\t\t\tkvps[index] = newEnv\n\t\t\t\tcontinue Loop\n\t\t\t}\n\t\t}\n\t\t// ... Else, append it as a new env variable\n\t\tkvps = append(kvps, newEnv)\n\t}\n\t// Convert back to array and set in config\n\tenvArray := []string{}\n\tfor _, kvp := range kvps {\n\t\tentry := kvp.Key + \"=\" + kvp.Value\n\t\tenvArray = append(envArray, entry)\n\t}\n\tconfig.Env = envArray\n\treturn nil\n}\n\nfunc GetUserGroup(chownStr string, env []string) (int64, int64, error) {\n\tif chownStr == \"\" {\n\t\treturn DoNotChangeUID, DoNotChangeGID, nil\n\t}\n\n\tchown, err := ResolveEnvironmentReplacement(chownStr, env, false)\n\tif err != nil {\n\t\treturn -1, -1, err\n\t}\n\n\tuid32, gid32, err := getUIDAndGIDFromString(chown)\n\tif err != nil {\n\t\treturn -1, -1, err\n\t}\n\n\treturn int64(uid32), int64(gid32), nil\n}\n\nfunc GetChmod(chmodStr string, env []string) (chmod fs.FileMode, useDefault bool, err error) {\n\tif chmodStr == \"\" {\n\t\treturn fs.FileMode(0o600), true, nil\n\t}\n\n\tchmodStr, err = ResolveEnvironmentReplacement(chmodStr, env, false)\n\tif err != nil {\n\t\treturn 0, false, err\n\t}\n\n\tmode, err := strconv.ParseUint(chmodStr, 8, 32)\n\tif err != nil {\n\t\treturn 0, false, errors.Wrap(err, \"parsing value from chmod\")\n\t}\n\tchmod = fs.FileMode(mode)\n\treturn\n}\n\n// Extract user and group id from a string formatted 'user:group'.\n// UserID and GroupID don't need to be present on the system.\nfunc getUIDAndGIDFromString(userGroupString string) (uint32, uint32, error) {\n\tuserAndGroup := strings.Split(userGroupString, \":\")\n\tuserStr := userAndGroup[0]\n\tvar groupStr string\n\tif len(userAndGroup) > 1 {\n\t\tgroupStr = userAndGroup[1]\n\t}\n\treturn getUIDAndGIDFunc(userStr, groupStr)\n}\n\nfunc getUIDAndGID(userStr string, groupStr string) (uint32, uint32, error) {\n\tuser, err := LookupUser(userStr)\n\tif err != nil {\n\t\treturn 0, 0, err\n\t}\n\tuid32, err := getUID(user.Uid)\n\tif err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\tif groupStr != \"\" {\n\t\tgid32, err := getGIDFromName(groupStr)\n\t\tif err != nil {\n\t\t\tif errors.Is(err, fallbackToUIDError) {\n\t\t\t\treturn uid32, uid32, nil\n\t\t\t}\n\t\t\treturn 0, 0, err\n\t\t}\n\t\treturn uid32, gid32, nil\n\t}\n\n\treturn uid32, uid32, nil\n}\n\n// getGID tries to parse the gid\nfunc getGID(groupStr string) (uint32, error) {\n\tgid, err := strconv.ParseUint(groupStr, 10, 32)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn uint32(gid), nil\n}\n\n// getGIDFromName tries to parse the groupStr into an existing group.\nfunc getGIDFromName(groupStr string) (uint32, error) {\n\tgroup, err := user.LookupGroup(groupStr)\n\tif err != nil {\n\t\t// unknown group error could relate to a non existing group\n\t\tvar groupErr user.UnknownGroupError\n\t\tif errors.As(err, &groupErr) {\n\t\t\treturn getGID(groupStr)\n\t\t}\n\t\tgroup, err = user.LookupGroupId(groupStr)\n\t\tif err != nil {\n\t\t\treturn getGID(groupStr)\n\t\t}\n\t}\n\treturn getGID(group.Gid)\n}\n\nvar fallbackToUIDError = new(fallbackToUIDErrorType)\n\ntype fallbackToUIDErrorType struct{}\n\nfunc (e fallbackToUIDErrorType) Error() string {\n\treturn \"fallback to uid\"\n}\n\n// LookupUser will try to lookup the userStr inside the passwd file.\n// If the user does not exists, the function will fallback to parsing the userStr as an uid.\nfunc LookupUser(userStr string) (*user.User, error) {\n\tuserObj, err := user.Lookup(userStr)\n\tif err != nil {\n\t\tunknownUserErr := new(user.UnknownUserError)\n\t\t// only return if it's not an unknown user error or the passwd file does not exist\n\t\tif !errors.As(err, unknownUserErr) && !os.IsNotExist(err) {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Lookup by id\n\t\tuserObj, err = user.LookupId(userStr)\n\t\tif err != nil {\n\t\t\tuid, err := getUID(userStr)\n\t\t\tif err != nil {\n\t\t\t\t// at this point, the user does not exist and the userStr is not a valid number.\n\t\t\t\treturn nil, fmt.Errorf(\"user %v is not a uid and does not exist on the system\", userStr)\n\t\t\t}\n\t\t\tuserObj = &user.User{\n\t\t\t\tUid:     fmt.Sprint(uid),\n\t\t\t\tHomeDir: \"/\",\n\t\t\t}\n\t\t}\n\t}\n\treturn userObj, nil\n}\n\nfunc getUID(userStr string) (uint32, error) {\n\t// checkif userStr is a valid id\n\tuid, err := strconv.ParseUint(userStr, 10, 32)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn uint32(uid), nil\n}\n\n// ExtractFilename extracts the filename from a URL without its query url\nfunc extractFilename(rawURL string) (string, error) {\n\tparsedURL, err := url.Parse(rawURL)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tfilename := filepath.Base(parsedURL.Path)\n\treturn filename, nil\n}\n"
  },
  {
    "path": "pkg/util/command_util_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage util\n\nimport (\n\t\"fmt\"\n\t\"io/fs\"\n\t\"os/user\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strconv\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/instructions\"\n)\n\nvar testURL = \"https://github.com/GoogleContainerTools/runtimes-common/blob/master/LICENSE\"\n\nvar testEnvReplacement = []struct {\n\tpath         string\n\tenvs         []string\n\tisFilepath   bool\n\texpectedPath string\n}{\n\t{\n\t\tpath: \"/simple/path\",\n\t\tenvs: []string{\n\t\t\t\"simple=/path/\",\n\t\t},\n\t\tisFilepath:   true,\n\t\texpectedPath: \"/simple/path\",\n\t},\n\t{\n\t\tpath: \"/simple/path/\",\n\t\tenvs: []string{\n\t\t\t\"simple=/path/\",\n\t\t},\n\t\tisFilepath:   true,\n\t\texpectedPath: \"/simple/path/\",\n\t},\n\t{\n\t\tpath: \"$simple\",\n\t\tenvs: []string{\n\t\t\t\"simple=/path/\",\n\t\t},\n\t\tisFilepath:   true,\n\t\texpectedPath: \"/path/\",\n\t},\n\t{\n\t\tpath: \"${a}/b\",\n\t\tenvs: []string{\n\t\t\t\"a=/path/\",\n\t\t\t\"b=/path2/\",\n\t\t},\n\t\tisFilepath:   true,\n\t\texpectedPath: \"/path/b\",\n\t},\n\t{\n\t\tpath: \"/$a/b\",\n\t\tenvs: []string{\n\t\t\t\"a=/path/\",\n\t\t\t\"b=/path2/\",\n\t\t},\n\t\tisFilepath:   true,\n\t\texpectedPath: \"/path/b\",\n\t},\n\t{\n\t\tpath: \"/$a/b/\",\n\t\tenvs: []string{\n\t\t\t\"a=/path/\",\n\t\t\t\"b=/path2/\",\n\t\t},\n\t\tisFilepath:   true,\n\t\texpectedPath: \"/path/b/\",\n\t},\n\t{\n\t\tpath: \"\\\\$foo\",\n\t\tenvs: []string{\n\t\t\t\"foo=/path/\",\n\t\t},\n\t\tisFilepath:   true,\n\t\texpectedPath: \"$foo\",\n\t},\n\t{\n\t\tpath: \"8080/$protocol\",\n\t\tenvs: []string{\n\t\t\t\"protocol=udp\",\n\t\t},\n\t\texpectedPath: \"8080/udp\",\n\t},\n\t{\n\t\tpath: \"8080/$protocol\",\n\t\tenvs: []string{\n\t\t\t\"protocol=udp\",\n\t\t},\n\t\texpectedPath: \"8080/udp\",\n\t},\n\t{\n\t\tpath: \"$url\",\n\t\tenvs: []string{\n\t\t\t\"url=http://example.com\",\n\t\t},\n\t\tisFilepath:   true,\n\t\texpectedPath: \"http://example.com\",\n\t},\n\t{\n\t\tpath: \"$url\",\n\t\tenvs: []string{\n\t\t\t\"url=http://example.com\",\n\t\t},\n\t\tisFilepath:   false,\n\t\texpectedPath: \"http://example.com\",\n\t},\n}\n\nfunc Test_EnvReplacement(t *testing.T) {\n\tfor _, test := range testEnvReplacement {\n\t\tactualPath, err := ResolveEnvironmentReplacement(test.path, test.envs, test.isFilepath)\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, err, test.expectedPath, actualPath)\n\n\t}\n}\n\nvar buildContextPath = \"../../integration/\"\n\nvar destinationFilepathTests = []struct {\n\tsrc              string\n\tdest             string\n\tcwd              string\n\texpectedFilepath string\n}{\n\t{\n\t\tsrc:              \"context/foo\",\n\t\tdest:             \"/foo\",\n\t\tcwd:              \"/\",\n\t\texpectedFilepath: \"/foo\",\n\t},\n\t{\n\t\tsrc:              \"context/foo\",\n\t\tdest:             \"/foodir/\",\n\t\tcwd:              \"/\",\n\t\texpectedFilepath: \"/foodir/foo\",\n\t},\n\t{\n\t\tsrc:              \"context/foo\",\n\t\tcwd:              \"/\",\n\t\tdest:             \"foo\",\n\t\texpectedFilepath: \"/foo\",\n\t},\n\t{\n\t\tsrc:              \"context/bar/\",\n\t\tcwd:              \"/\",\n\t\tdest:             \"pkg/\",\n\t\texpectedFilepath: \"/pkg/\",\n\t},\n\t{\n\t\tsrc:              \"context/bar/\",\n\t\tcwd:              \"/newdir\",\n\t\tdest:             \"pkg/\",\n\t\texpectedFilepath: \"/newdir/pkg/\",\n\t},\n\t{\n\t\tsrc:              \"./context/empty\",\n\t\tcwd:              \"/\",\n\t\tdest:             \"/empty\",\n\t\texpectedFilepath: \"/empty\",\n\t},\n\t{\n\t\tsrc:              \"./context/empty\",\n\t\tcwd:              \"/dir\",\n\t\tdest:             \"/empty\",\n\t\texpectedFilepath: \"/empty\",\n\t},\n\t{\n\t\tsrc:              \"./\",\n\t\tcwd:              \"/\",\n\t\tdest:             \"/dir\",\n\t\texpectedFilepath: \"/dir/\",\n\t},\n\t{\n\t\tsrc:              \"context/foo\",\n\t\tcwd:              \"/test\",\n\t\tdest:             \".\",\n\t\texpectedFilepath: \"/test/foo\",\n\t},\n}\n\nfunc Test_DestinationFilepath(t *testing.T) {\n\tfor _, test := range destinationFilepathTests {\n\t\tactualFilepath, err := DestinationFilepath(test.src, test.dest, test.cwd)\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, err, test.expectedFilepath, actualFilepath)\n\t}\n}\n\nvar urlDestFilepathTests = []struct {\n\turl          string\n\tcwd          string\n\tdest         string\n\texpectedDest string\n\tenvs         []string\n}{\n\t{\n\t\turl:          \"https://something/something\",\n\t\tcwd:          \"/test\",\n\t\tdest:         \".\",\n\t\texpectedDest: \"/test/something\",\n\t},\n\t{\n\t\turl:          \"https://something/something\",\n\t\tcwd:          \"/cwd\",\n\t\tdest:         \"/test\",\n\t\texpectedDest: \"/test\",\n\t},\n\t{\n\t\turl:          \"https://something/something.tar?foo=bar\",\n\t\tcwd:          \"/cwd\",\n\t\tdest:         \"/dir/\",\n\t\texpectedDest: \"/dir/something.tar\",\n\t},\n\t{\n\t\turl:          \"https://something/something\",\n\t\tcwd:          \"/test\",\n\t\tdest:         \"/dest/\",\n\t\texpectedDest: \"/dest/something\",\n\t},\n\t{\n\t\turl:          \"https://something/$foo.tar.gz\",\n\t\tcwd:          \"/test\",\n\t\tdest:         \"/foo/\",\n\t\texpectedDest: \"/foo/bar.tar.gz\",\n\t\tenvs:         []string{\"foo=bar\"},\n\t},\n}\n\nfunc Test_UrlDestFilepath(t *testing.T) {\n\tfor _, test := range urlDestFilepathTests {\n\t\tactualDest, err := URLDestinationFilepath(test.url, test.dest, test.cwd, test.envs)\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, err, test.expectedDest, actualDest)\n\t}\n}\n\nvar matchSourcesTests = []struct {\n\tsrcs          []string\n\tfiles         []string\n\texpectedFiles []string\n}{\n\t{\n\t\tsrcs: []string{\n\t\t\t\"pkg/*\",\n\t\t\t\"/root/dir?\",\n\t\t\ttestURL,\n\t\t},\n\t\tfiles: []string{\n\t\t\t\"pkg/a\",\n\t\t\t\"pkg/b\",\n\t\t\t\"/pkg/d\",\n\t\t\t\"pkg/b/d/\",\n\t\t\t\"dir/\",\n\t\t\t\"root/dir1\",\n\t\t},\n\t\texpectedFiles: []string{\n\t\t\t\"/root/dir1\",\n\t\t\t\"pkg/a\",\n\t\t\t\"pkg/b\",\n\t\t\ttestURL,\n\t\t},\n\t},\n}\n\nfunc Test_MatchSources(t *testing.T) {\n\tfor _, test := range matchSourcesTests {\n\t\tactualFiles, err := matchSources(test.srcs, test.files)\n\t\tsort.Strings(actualFiles)\n\t\tsort.Strings(test.expectedFiles)\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, err, test.expectedFiles, actualFiles)\n\t}\n}\n\nvar updateConfigEnvTests = []struct {\n\tname            string\n\tenvVars         []instructions.KeyValuePair\n\tconfig          *v1.Config\n\treplacementEnvs []string\n\texpectedEnv     []string\n}{\n\t{\n\t\tname: \"test env config update\",\n\t\tenvVars: []instructions.KeyValuePair{\n\t\t\t{\n\t\t\t\tKey:   \"key\",\n\t\t\t\tValue: \"var\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tKey:   \"foo\",\n\t\t\t\tValue: \"baz\",\n\t\t\t},\n\t\t},\n\t\tconfig:          &v1.Config{},\n\t\treplacementEnvs: []string{},\n\t\texpectedEnv:     []string{\"key=var\", \"foo=baz\"},\n\t}, {\n\t\tname: \"test env config update with replacmenets\",\n\t\tenvVars: []instructions.KeyValuePair{\n\t\t\t{\n\t\t\t\tKey:   \"key\",\n\t\t\t\tValue: \"/var/run\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tKey:   \"env\",\n\t\t\t\tValue: \"$var\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tKey:   \"foo\",\n\t\t\t\tValue: \"$argarg\",\n\t\t\t},\n\t\t},\n\t\tconfig:          &v1.Config{},\n\t\treplacementEnvs: []string{\"var=/test/with'chars'/\", \"not=used\", \"argarg=\\\"a\\\"b\\\"\"},\n\t\texpectedEnv:     []string{\"key=/var/run\", \"env=/test/with'chars'/\", \"foo=\\\"a\\\"b\\\"\"},\n\t}, {\n\t\tname: \"test env config update replacing existing variable\",\n\t\tenvVars: []instructions.KeyValuePair{\n\t\t\t{\n\t\t\t\tKey:   \"alice\",\n\t\t\t\tValue: \"nice\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tKey:   \"bob\",\n\t\t\t\tValue: \"cool\",\n\t\t\t},\n\t\t},\n\t\tconfig:          &v1.Config{Env: []string{\"bob=used\", \"more=test\"}},\n\t\treplacementEnvs: []string{},\n\t\texpectedEnv:     []string{\"bob=cool\", \"more=test\", \"alice=nice\"},\n\t},\n}\n\nfunc Test_UpdateConfigEnvTests(t *testing.T) {\n\tfor _, test := range updateConfigEnvTests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tif err := UpdateConfigEnv(test.envVars, test.config, test.replacementEnvs); err != nil {\n\t\t\t\tt.Fatalf(\"error updating config with env vars: %s\", err)\n\t\t\t}\n\t\t\ttestutil.CheckDeepEqual(t, test.expectedEnv, test.config.Env)\n\t\t})\n\t}\n}\n\nvar isSrcValidTests = []struct {\n\tname            string\n\tsrcsAndDest     []string\n\tresolvedSources []string\n\tshouldErr       bool\n}{\n\t{\n\t\tname: \"dest isn't directory\",\n\t\tsrcsAndDest: []string{\n\t\t\t\"context/foo\",\n\t\t\t\"context/bar\",\n\t\t\t\"dest\",\n\t\t},\n\t\tresolvedSources: []string{\n\t\t\t\"context/foo\",\n\t\t\t\"context/bar\",\n\t\t},\n\t\tshouldErr: true,\n\t},\n\t{\n\t\tname: \"dest is directory\",\n\t\tsrcsAndDest: []string{\n\t\t\t\"context/foo\",\n\t\t\t\"context/bar\",\n\t\t\t\"dest/\",\n\t\t},\n\t\tresolvedSources: []string{\n\t\t\t\"context/foo\",\n\t\t\t\"context/bar\",\n\t\t},\n\t\tshouldErr: false,\n\t},\n\t{\n\t\tname: \"copy file to file\",\n\t\tsrcsAndDest: []string{\n\t\t\t\"context/bar/bam\",\n\t\t\t\"dest\",\n\t\t},\n\t\tresolvedSources: []string{\n\t\t\t\"context/bar/bam\",\n\t\t},\n\t\tshouldErr: false,\n\t},\n\t{\n\t\tname: \"copy files with wildcards to dir\",\n\t\tsrcsAndDest: []string{\n\t\t\t\"context/foo\",\n\t\t\t\"context/b*\",\n\t\t\t\"dest/\",\n\t\t},\n\t\tresolvedSources: []string{\n\t\t\t\"context/foo\",\n\t\t\t\"context/bar\",\n\t\t},\n\t\tshouldErr: false,\n\t},\n\t{\n\t\tname: \"copy multilple files with wildcards to file\",\n\t\tsrcsAndDest: []string{\n\t\t\t\"context/foo\",\n\t\t\t\"context/b*\",\n\t\t\t\"dest\",\n\t\t},\n\t\tresolvedSources: []string{\n\t\t\t\"context/foo\",\n\t\t\t\"context/bar\",\n\t\t},\n\t\tshouldErr: true,\n\t},\n\t{\n\t\tname: \"copy two files to file, one of which doesn't exist\",\n\t\tsrcsAndDest: []string{\n\t\t\t\"context/foo\",\n\t\t\t\"context/doesntexist*\",\n\t\t\t\"dest\",\n\t\t},\n\t\tresolvedSources: []string{\n\t\t\t\"context/foo\",\n\t\t},\n\t\tshouldErr: false,\n\t},\n\t{\n\t\tname: \"copy dir to dest not specified as dir\",\n\t\tsrcsAndDest: []string{\n\t\t\t\"context/\",\n\t\t\t\"dest\",\n\t\t},\n\t\tresolvedSources: []string{\n\t\t\t\"context/\",\n\t\t},\n\t\tshouldErr: false,\n\t},\n\t{\n\t\tname: \"copy url to file\",\n\t\tsrcsAndDest: []string{\n\t\t\ttestURL,\n\t\t\t\"dest\",\n\t\t},\n\t\tresolvedSources: []string{\n\t\t\ttestURL,\n\t\t},\n\t\tshouldErr: false,\n\t},\n\t{\n\t\tname: \"copy two srcs, one excluded, to file\",\n\t\tsrcsAndDest: []string{\n\t\t\t\"ignore/foo\",\n\t\t\t\"ignore/bar\",\n\t\t\t\"dest\",\n\t\t},\n\t\tresolvedSources: []string{\n\t\t\t\"ignore/foo\",\n\t\t\t\"ignore/bar\",\n\t\t},\n\t\tshouldErr: false,\n\t},\n\t{\n\t\tname: \"copy two srcs, both excluded, to file\",\n\t\tsrcsAndDest: []string{\n\t\t\t\"ignore/baz\",\n\t\t\t\"ignore/bar\",\n\t\t\t\"dest\",\n\t\t},\n\t\tresolvedSources: []string{\n\t\t\t\"ignore/baz\",\n\t\t\t\"ignore/bar\",\n\t\t},\n\t\tshouldErr: false,\n\t},\n\t{\n\t\tname: \"copy two srcs, wildcard and no file match, to file\",\n\t\tsrcsAndDest: []string{\n\t\t\t\"ignore/ba[s]\",\n\t\t\t\"dest\",\n\t\t},\n\t\tresolvedSources: []string{},\n\t\tshouldErr:       false,\n\t},\n}\n\nfunc Test_IsSrcsValid(t *testing.T) {\n\tfor _, test := range isSrcValidTests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tfileContext, err := NewFileContextFromDockerfile(\"\", buildContextPath)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"error creating file context: %v\", err)\n\t\t\t}\n\t\t\terr = IsSrcsValid(instructions.SourcesAndDest{SourcePaths: test.srcsAndDest[0 : len(test.srcsAndDest)-1], DestPath: test.srcsAndDest[len(test.srcsAndDest)-1]}, test.resolvedSources, fileContext)\n\t\t\ttestutil.CheckError(t, test.shouldErr, err)\n\t\t})\n\t}\n}\n\nvar testResolveSources = []struct {\n\tsrcsAndDest  []string\n\texpectedList []string\n}{\n\t{\n\t\tsrcsAndDest: []string{\n\t\t\t\"context/foo\",\n\t\t\t\"context/b*\",\n\t\t\ttestURL,\n\t\t},\n\t\texpectedList: []string{\n\t\t\t\"context/foo\",\n\t\t\t\"context/bar\",\n\t\t\ttestURL,\n\t\t},\n\t},\n}\n\nfunc Test_ResolveSources(t *testing.T) {\n\tfor _, test := range testResolveSources {\n\t\tactualList, err := ResolveSources(test.srcsAndDest, buildContextPath)\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, err, test.expectedList, actualList)\n\t}\n}\n\nfunc TestGetUserGroup(t *testing.T) {\n\ttests := []struct {\n\t\tdescription  string\n\t\tchown        string\n\t\tenv          []string\n\t\tmockIDGetter func(userStr string, groupStr string) (uint32, uint32, error)\n\t\t// needed, in case uid is a valid number, but group is a name\n\t\tmockGroupIDGetter func(groupStr string) (*user.Group, error)\n\t\texpectedU         int64\n\t\texpectedG         int64\n\t\tshdErr            bool\n\t}{\n\t\t{\n\t\t\tdescription: \"non empty chown\",\n\t\t\tchown:       \"some:some\",\n\t\t\tenv:         []string{},\n\t\t\tmockIDGetter: func(string, string) (uint32, uint32, error) {\n\t\t\t\treturn 100, 1000, nil\n\t\t\t},\n\t\t\texpectedU: 100,\n\t\t\texpectedG: 1000,\n\t\t},\n\t\t{\n\t\t\tdescription: \"non empty chown with env replacement\",\n\t\t\tchown:       \"some:$foo\",\n\t\t\tenv:         []string{\"foo=key\"},\n\t\t\tmockIDGetter: func(userStr string, groupStr string) (uint32, uint32, error) {\n\t\t\t\tif userStr == \"some\" && groupStr == \"key\" {\n\t\t\t\t\treturn 10, 100, nil\n\t\t\t\t}\n\t\t\t\treturn 0, 0, fmt.Errorf(\"did not resolve environment variable\")\n\t\t\t},\n\t\t\texpectedU: 10,\n\t\t\texpectedG: 100,\n\t\t},\n\t\t{\n\t\t\tdescription: \"empty chown string\",\n\t\t\tmockIDGetter: func(string, string) (uint32, uint32, error) {\n\t\t\t\treturn 0, 0, fmt.Errorf(\"should not be called\")\n\t\t\t},\n\t\t\texpectedU: -1,\n\t\t\texpectedG: -1,\n\t\t},\n\t}\n\tfor _, tc := range tests {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\toriginalIDGetter := getUIDAndGIDFunc\n\t\t\tdefer func() {\n\t\t\t\tgetUIDAndGIDFunc = originalIDGetter\n\t\t\t}()\n\t\t\tgetUIDAndGIDFunc = tc.mockIDGetter\n\t\t\tuid, gid, err := GetUserGroup(tc.chown, tc.env)\n\t\t\ttestutil.CheckErrorAndDeepEqual(t, tc.shdErr, err, uid, tc.expectedU)\n\t\t\ttestutil.CheckErrorAndDeepEqual(t, tc.shdErr, err, gid, tc.expectedG)\n\t\t})\n\t}\n}\n\nfunc TestGetChmod(t *testing.T) {\n\ttests := []struct {\n\t\tdescription string\n\t\tchmod       string\n\t\tenv         []string\n\t\texpected    fs.FileMode\n\t\tshdErr      bool\n\t}{\n\t\t{\n\t\t\tdescription: \"non empty chmod\",\n\t\t\tchmod:       \"0755\",\n\t\t\tenv:         []string{},\n\t\t\texpected:    fs.FileMode(0o755),\n\t\t},\n\t\t{\n\t\t\tdescription: \"non empty chmod with env replacement\",\n\t\t\tchmod:       \"$foo\",\n\t\t\tenv:         []string{\"foo=0750\"},\n\t\t\texpected:    fs.FileMode(0o750),\n\t\t},\n\t\t{\n\t\t\tdescription: \"empty chmod string\",\n\t\t\texpected:    fs.FileMode(0o600),\n\t\t},\n\t}\n\tfor _, tc := range tests {\n\t\tt.Run(tc.description, func(t *testing.T) {\n\t\t\tdefaultChmod := fs.FileMode(0o600)\n\t\t\tchmod, useDefault, err := GetChmod(tc.chmod, tc.env)\n\t\t\tif useDefault {\n\t\t\t\tchmod = defaultChmod\n\t\t\t}\n\t\t\ttestutil.CheckErrorAndDeepEqual(t, tc.shdErr, err, tc.expected, chmod)\n\t\t})\n\t}\n}\n\nfunc TestResolveEnvironmentReplacementList(t *testing.T) {\n\ttype args struct {\n\t\tvalues     []string\n\t\tenvs       []string\n\t\tisFilepath bool\n\t}\n\ttests := []struct {\n\t\tname    string\n\t\targs    args\n\t\twant    []string\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname: \"url\",\n\t\t\targs: args{\n\t\t\t\tvalues: []string{\n\t\t\t\t\t\"https://google.com/$foo\", \"$bar\", \"$url\",\n\t\t\t\t},\n\t\t\t\tenvs: []string{\n\t\t\t\t\t\"foo=baz\",\n\t\t\t\t\t\"bar=bat\",\n\t\t\t\t\t\"url=https://google.com\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []string{\"https://google.com/baz\", \"bat\", \"https://google.com\"},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed\",\n\t\t\targs: args{\n\t\t\t\tvalues: []string{\n\t\t\t\t\t\"$foo\", \"$bar$baz\", \"baz\",\n\t\t\t\t},\n\t\t\t\tenvs: []string{\n\t\t\t\t\t\"foo=FOO\",\n\t\t\t\t\t\"bar=BAR\",\n\t\t\t\t\t\"baz=BAZ\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: []string{\"FOO\", \"BARBAZ\", \"baz\"},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgot, err := ResolveEnvironmentReplacementList(tt.args.values, tt.args.envs, tt.args.isFilepath)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"ResolveEnvironmentReplacementList() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif !reflect.DeepEqual(got, tt.want) {\n\t\t\t\tt.Errorf(\"ResolveEnvironmentReplacementList() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_GetUIDAndGIDFromString(t *testing.T) {\n\tcurrentUser := testutil.GetCurrentUser(t)\n\n\ttype args struct {\n\t\tuserGroupStr string\n\t}\n\n\ttype expected struct {\n\t\tuserID  uint32\n\t\tgroupID uint32\n\t}\n\n\tcurrentUserUID, _ := strconv.ParseUint(currentUser.Uid, 10, 32)\n\tcurrentUserGID, _ := strconv.ParseUint(currentUser.Gid, 10, 32)\n\texpectedCurrentUser := expected{\n\t\tuserID:  uint32(currentUserUID),\n\t\tgroupID: uint32(currentUserGID),\n\t}\n\n\ttestCases := []struct {\n\t\ttestname string\n\t\targs     args\n\t\texpected expected\n\t\twantErr  bool\n\t}{\n\t\t{\n\t\t\ttestname: \"current user uid and gid\",\n\t\t\targs: args{\n\t\t\t\tuserGroupStr: fmt.Sprintf(\"%d:%d\", currentUserUID, currentUserGID),\n\t\t\t},\n\t\t\texpected: expectedCurrentUser,\n\t\t},\n\t\t{\n\t\t\ttestname: \"current user username and gid\",\n\t\t\targs: args{\n\t\t\t\tuserGroupStr: fmt.Sprintf(\"%s:%d\", currentUser.Username, currentUserGID),\n\t\t\t},\n\t\t\texpected: expectedCurrentUser,\n\t\t},\n\t\t{\n\t\t\ttestname: \"current user username and primary group\",\n\t\t\targs: args{\n\t\t\t\tuserGroupStr: fmt.Sprintf(\"%s:%s\", currentUser.Username, currentUser.PrimaryGroup),\n\t\t\t},\n\t\t\texpected: expectedCurrentUser,\n\t\t},\n\t\t{\n\t\t\ttestname: \"current user uid and primary group\",\n\t\t\targs: args{\n\t\t\t\tuserGroupStr: fmt.Sprintf(\"%d:%s\", currentUserUID, currentUser.PrimaryGroup),\n\t\t\t},\n\t\t\texpected: expectedCurrentUser,\n\t\t},\n\t\t{\n\t\t\ttestname: \"non-existing valid uid and gid\",\n\t\t\targs: args{\n\t\t\t\tuserGroupStr: fmt.Sprintf(\"%d:%d\", 1001, 50000),\n\t\t\t},\n\t\t\texpected: expected{\n\t\t\t\tuserID:  1001,\n\t\t\t\tgroupID: 50000,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttestname: \"uid and existing group\",\n\t\t\targs: args{\n\t\t\t\tuserGroupStr: fmt.Sprintf(\"%d:%s\", 1001, currentUser.PrimaryGroup),\n\t\t\t},\n\t\t\texpected: expected{\n\t\t\t\tuserID:  1001,\n\t\t\t\tgroupID: expectedCurrentUser.groupID,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttestname: \"uid and non existing group-name\",\n\t\t\targs: args{\n\t\t\t\tuserGroupStr: fmt.Sprintf(\"%d:%s\", 1001, \"hello-world-group\"),\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\ttestname: \"name and non existing gid\",\n\t\t\targs: args{\n\t\t\t\tuserGroupStr: fmt.Sprintf(\"%s:%d\", currentUser.Username, 50000),\n\t\t\t},\n\t\t\texpected: expected{\n\t\t\t\tuserID:  expectedCurrentUser.userID,\n\t\t\t\tgroupID: 50000,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttestname: \"only uid\",\n\t\t\targs: args{\n\t\t\t\tuserGroupStr: fmt.Sprintf(\"%d\", currentUserUID),\n\t\t\t},\n\t\t\texpected: expected{\n\t\t\t\tuserID:  expectedCurrentUser.userID,\n\t\t\t\tgroupID: expectedCurrentUser.userID,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttestname: \"non-existing user without group\",\n\t\t\targs: args{\n\t\t\t\tuserGroupStr: \"helloworlduser\",\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t}\n\tfor _, tt := range testCases {\n\t\tuid, gid, err := getUIDAndGIDFromString(tt.args.userGroupStr)\n\t\ttestutil.CheckError(t, tt.wantErr, err)\n\t\tif uid != tt.expected.userID || gid != tt.expected.groupID {\n\t\t\tt.Errorf(\"%v failed. Could not correctly decode %s to uid/gid %d:%d. Result: %d:%d\",\n\t\t\t\ttt.testname,\n\t\t\t\ttt.args.userGroupStr,\n\t\t\t\ttt.expected.userID, tt.expected.groupID,\n\t\t\t\tuid, gid)\n\t\t}\n\t}\n}\n\nfunc TestLookupUser(t *testing.T) {\n\tcurrentUser := testutil.GetCurrentUser(t)\n\n\ttype args struct {\n\t\tuserStr string\n\t}\n\ttests := []struct {\n\t\ttestname string\n\t\targs     args\n\t\texpected *user.User\n\t\twantErr  bool\n\t}{\n\t\t{\n\t\t\ttestname: \"non-existing user\",\n\t\t\targs: args{\n\t\t\t\tuserStr: \"foobazbar\",\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\ttestname: \"uid\",\n\t\t\targs: args{\n\t\t\t\tuserStr: \"30000\",\n\t\t\t},\n\t\t\texpected: &user.User{\n\t\t\t\tUid:     \"30000\",\n\t\t\t\tHomeDir: \"/\",\n\t\t\t},\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\ttestname: \"current user\",\n\t\t\targs: args{\n\t\t\t\tuserStr: currentUser.Username,\n\t\t\t},\n\t\t\texpected: currentUser.User,\n\t\t\twantErr:  false,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.testname, func(t *testing.T) {\n\t\t\tgot, err := LookupUser(tt.args.userStr)\n\t\t\ttestutil.CheckErrorAndDeepEqual(t, tt.wantErr, err, tt.expected, got)\n\t\t})\n\t}\n}\n\nfunc TestIsSrcRemoteFileURL(t *testing.T) {\n\ttype args struct {\n\t\trawurl string\n\t}\n\ttests := []struct {\n\t\tname string\n\t\targs args\n\t\twant bool\n\t}{\n\t\t{\n\t\t\tname: \"valid https url\",\n\t\t\targs: args{rawurl: \"https://google.com?foo=bar\"},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"valid http url\",\n\t\t\targs: args{rawurl: \"http://example.com/foobar.tar.gz\"},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid url\",\n\t\t\targs: args{rawurl: \"http:/not-a-url.com\"},\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid url filepath\",\n\t\t\targs: args{rawurl: \"/is/a/filepath\"},\n\t\t\twant: false,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(\n\t\t\ttt.name, func(t *testing.T) {\n\t\t\t\tif got := IsSrcRemoteFileURL(tt.args.rawurl); got != tt.want {\n\t\t\t\t\tt.Errorf(\"IsSrcRemoteFileURL() = %v, want %v\", got, tt.want)\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t}\n}\n"
  },
  {
    "path": "pkg/util/fs_util.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage util\n\nimport (\n\t\"archive/tar\"\n\t\"bufio\"\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/fs\"\n\t\"math\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/timing\"\n\t\"github.com/docker/docker/pkg/archive\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/karrick/godirwalk\"\n\t\"github.com/moby/buildkit/frontend/dockerfile/dockerignore\"\n\t\"github.com/moby/patternmatcher\"\n\totiai10Cpy \"github.com/otiai10/copy\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n)\n\nconst (\n\tDoNotChangeUID = -1\n\tDoNotChangeGID = -1\n)\n\nconst (\n\tsnapshotTimeout = \"SNAPSHOT_TIMEOUT_DURATION\"\n\tdefaultTimeout  = \"90m\"\n)\n\ntype IgnoreListEntry struct {\n\tPath            string\n\tPrefixMatchOnly bool\n}\n\nvar defaultIgnoreList = []IgnoreListEntry{\n\t{\n\t\tPath:            filepath.Clean(config.KanikoDir),\n\t\tPrefixMatchOnly: false,\n\t},\n\t{\n\t\t// similarly, we ignore /etc/mtab, since there is no way to know if the file was mounted or came\n\t\t// from the base image\n\t\tPath:            \"/etc/mtab\",\n\t\tPrefixMatchOnly: false,\n\t},\n\t{\n\t\t// we ingore /tmp/apt-key-gpghome, since the apt keys are added temporarily in this directory.\n\t\t// from the base image\n\t\tPath:            \"/tmp/apt-key-gpghome\",\n\t\tPrefixMatchOnly: true,\n\t},\n}\n\nvar ignorelist = append([]IgnoreListEntry{}, defaultIgnoreList...)\n\nvar volumes = []string{}\n\n// skipKanikoDir opts to skip the '/kaniko' dir for otiai10.copy which should be ignored in root\nvar skipKanikoDir = otiai10Cpy.Options{\n\tSkip: func(info os.FileInfo, src, dest string) (bool, error) {\n\t\treturn strings.HasSuffix(src, \"/kaniko\"), nil\n\t},\n}\n\ntype FileContext struct {\n\tRoot          string\n\tExcludedFiles []string\n}\n\ntype ExtractFunction func(string, *tar.Header, string, io.Reader) error\n\ntype FSConfig struct {\n\tincludeWhiteout bool\n\textractFunc     ExtractFunction\n}\n\ntype FSOpt func(*FSConfig)\n\nfunc IgnoreList() []IgnoreListEntry {\n\treturn ignorelist\n}\n\nfunc AddToIgnoreList(entry IgnoreListEntry) {\n\tignorelist = append(ignorelist, IgnoreListEntry{\n\t\tPath:            filepath.Clean(entry.Path),\n\t\tPrefixMatchOnly: entry.PrefixMatchOnly,\n\t})\n}\n\nfunc AddToDefaultIgnoreList(entry IgnoreListEntry) {\n\tdefaultIgnoreList = append(defaultIgnoreList, IgnoreListEntry{\n\t\tPath:            filepath.Clean(entry.Path),\n\t\tPrefixMatchOnly: entry.PrefixMatchOnly,\n\t})\n}\n\nfunc IncludeWhiteout() FSOpt {\n\treturn func(opts *FSConfig) {\n\t\topts.includeWhiteout = true\n\t}\n}\n\nfunc ExtractFunc(extractFunc ExtractFunction) FSOpt {\n\treturn func(opts *FSConfig) {\n\t\topts.extractFunc = extractFunc\n\t}\n}\n\n// GetFSFromImage extracts the layers of img to root\n// It returns a list of all files extracted\nfunc GetFSFromImage(root string, img v1.Image, extract ExtractFunction) ([]string, error) {\n\tif img == nil {\n\t\treturn nil, errors.New(\"image cannot be nil\")\n\t}\n\n\tlayers, err := img.Layers()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn GetFSFromLayers(root, layers, ExtractFunc(extract))\n}\n\nfunc GetFSFromLayers(root string, layers []v1.Layer, opts ...FSOpt) ([]string, error) {\n\tvolumes = []string{}\n\tcfg := new(FSConfig)\n\tif err := InitIgnoreList(); err != nil {\n\t\treturn nil, errors.Wrap(err, \"initializing filesystem ignore list\")\n\t}\n\tlogrus.Debugf(\"Ignore list: %v\", ignorelist)\n\n\tfor _, opt := range opts {\n\t\topt(cfg)\n\t}\n\n\tif cfg.extractFunc == nil {\n\t\treturn nil, errors.New(\"must supply an extract function\")\n\t}\n\n\textractedFiles := []string{}\n\tfor i, l := range layers {\n\t\tif mediaType, err := l.MediaType(); err == nil {\n\t\t\tlogrus.Tracef(\"Extracting layer %d of media type %s\", i, mediaType)\n\t\t} else {\n\t\t\tlogrus.Tracef(\"Extracting layer %d\", i)\n\t\t}\n\n\t\tr, err := l.Uncompressed()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tdefer r.Close()\n\n\t\ttr := tar.NewReader(r)\n\t\tfor {\n\t\t\thdr, err := tr.Next()\n\t\t\tif errors.Is(err, io.EOF) {\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\treturn nil, errors.Wrap(err, fmt.Sprintf(\"error reading tar %d\", i))\n\t\t\t}\n\n\t\t\tcleanedName := filepath.Clean(hdr.Name)\n\t\t\tpath := filepath.Join(root, cleanedName)\n\t\t\tbase := filepath.Base(path)\n\t\t\tdir := filepath.Dir(path)\n\n\t\t\tif strings.HasPrefix(base, archive.WhiteoutPrefix) {\n\t\t\t\tlogrus.Tracef(\"Whiting out %s\", path)\n\n\t\t\t\tname := strings.TrimPrefix(base, archive.WhiteoutPrefix)\n\t\t\t\tpath := filepath.Join(dir, name)\n\n\t\t\t\tif CheckCleanedPathAgainstIgnoreList(path) {\n\t\t\t\t\tlogrus.Tracef(\"Not deleting %s, as it's ignored\", path)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif childDirInIgnoreList(path) {\n\t\t\t\t\tlogrus.Tracef(\"Not deleting %s, as it contains a ignored path\", path)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tif err := os.RemoveAll(path); err != nil {\n\t\t\t\t\treturn nil, errors.Wrapf(err, \"removing whiteout %s\", hdr.Name)\n\t\t\t\t}\n\n\t\t\t\tif !cfg.includeWhiteout {\n\t\t\t\t\tlogrus.Trace(\"Not including whiteout files\")\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif err := cfg.extractFunc(root, hdr, cleanedName, tr); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\textractedFiles = append(extractedFiles, filepath.Join(root, cleanedName))\n\t\t}\n\t}\n\treturn extractedFiles, nil\n}\n\n// DeleteFilesystem deletes the extracted image file system\nfunc DeleteFilesystem() error {\n\tlogrus.Info(\"Deleting filesystem...\")\n\treturn filepath.Walk(config.RootDir, func(path string, info os.FileInfo, err error) error {\n\t\tif err != nil {\n\t\t\t// ignore errors when deleting.\n\t\t\treturn nil //nolint:nilerr\n\t\t}\n\n\t\tif CheckCleanedPathAgainstIgnoreList(path) {\n\t\t\tif !isExist(path) {\n\t\t\t\tlogrus.Debugf(\"Path %s ignored, but not exists\", path)\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif info.IsDir() {\n\t\t\t\treturn filepath.SkipDir\n\t\t\t}\n\t\t\tlogrus.Debugf(\"Not deleting %s, as it's ignored\", path)\n\t\t\treturn nil\n\t\t}\n\t\tif childDirInIgnoreList(path) {\n\t\t\tlogrus.Debugf(\"Not deleting %s, as it contains a ignored path\", path)\n\t\t\treturn nil\n\t\t}\n\t\tif path == config.RootDir {\n\t\t\treturn nil\n\t\t}\n\t\treturn os.RemoveAll(path)\n\t})\n}\n\n// isExists returns true if path exists\nfunc isExist(path string) bool {\n\tif _, err := os.Stat(path); err == nil {\n\t\treturn true\n\t}\n\treturn false\n}\n\n// childDirInIgnoreList returns true if there is a child file or directory of the path in the ignorelist\nfunc childDirInIgnoreList(path string) bool {\n\tfor _, d := range ignorelist {\n\t\tif HasFilepathPrefix(d.Path, path, d.PrefixMatchOnly) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// UnTar returns a list of files that have been extracted from the tar archive at r to the path at dest\nfunc UnTar(r io.Reader, dest string) ([]string, error) {\n\tvar extractedFiles []string\n\ttr := tar.NewReader(r)\n\tfor {\n\t\thdr, err := tr.Next()\n\t\tif errors.Is(err, io.EOF) {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcleanedName := filepath.Clean(hdr.Name)\n\t\tif err := ExtractFile(dest, hdr, cleanedName, tr); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\textractedFiles = append(extractedFiles, filepath.Join(dest, cleanedName))\n\t}\n\treturn extractedFiles, nil\n}\n\nfunc ExtractFile(dest string, hdr *tar.Header, cleanedName string, tr io.Reader) error {\n\tpath := filepath.Join(dest, cleanedName)\n\tbase := filepath.Base(path)\n\tdir := filepath.Dir(path)\n\tmode := hdr.FileInfo().Mode()\n\tuid := hdr.Uid\n\tgid := hdr.Gid\n\n\tabs, err := filepath.Abs(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif CheckCleanedPathAgainstIgnoreList(abs) && !checkIgnoreListRoot(dest) {\n\t\tlogrus.Debugf(\"Not adding %s because it is ignored\", path)\n\t\treturn nil\n\t}\n\tswitch hdr.Typeflag {\n\tcase tar.TypeReg:\n\t\tlogrus.Tracef(\"Creating file %s\", path)\n\n\t\t// It's possible a file is in the tar before its directory,\n\t\t// or a file was copied over a directory prior to now\n\t\tfi, err := os.Stat(dir)\n\t\tif os.IsNotExist(err) || !fi.IsDir() {\n\t\t\tlogrus.Debugf(\"Base %s for file %s does not exist. Creating.\", base, path)\n\n\t\t\tif err := os.MkdirAll(dir, 0o755); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\t// Check if something already exists at path (symlinks etc.)\n\t\t// If so, delete it\n\t\tif FilepathExists(path) {\n\t\t\tif err := os.RemoveAll(path); err != nil {\n\t\t\t\treturn errors.Wrapf(err, \"error removing %s to make way for new file.\", path)\n\t\t\t}\n\t\t}\n\n\t\tcurrFile, err := os.Create(path)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif _, err = io.Copy(currFile, tr); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err = setFilePermissions(path, mode, uid, gid); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err = writeSecurityXattrToTarFile(path, hdr); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err = setFileTimes(path, hdr.AccessTime, hdr.ModTime); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tcurrFile.Close()\n\tcase tar.TypeDir:\n\t\tlogrus.Tracef(\"Creating dir %s\", path)\n\t\tif err := MkdirAllWithPermissions(path, mode, int64(uid), int64(gid)); err != nil {\n\t\t\treturn err\n\t\t}\n\n\tcase tar.TypeLink:\n\t\tlogrus.Tracef(\"Link from %s to %s\", hdr.Linkname, path)\n\t\tabs, err := filepath.Abs(hdr.Linkname)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif CheckCleanedPathAgainstIgnoreList(abs) {\n\t\t\tlogrus.Tracef(\"Skipping link from %s to %s because %s is ignored\", hdr.Linkname, path, hdr.Linkname)\n\t\t\treturn nil\n\t\t}\n\t\t// The base directory for a link may not exist before it is created.\n\t\tif err := os.MkdirAll(dir, 0o755); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Check if something already exists at path\n\t\t// If so, delete it\n\t\tif FilepathExists(path) {\n\t\t\tif err := os.RemoveAll(path); err != nil {\n\t\t\t\treturn errors.Wrapf(err, \"error removing %s to make way for new link\", hdr.Name)\n\t\t\t}\n\t\t}\n\t\tlink := filepath.Clean(filepath.Join(dest, hdr.Linkname))\n\t\tif err := os.Link(link, path); err != nil {\n\t\t\treturn err\n\t\t}\n\n\tcase tar.TypeSymlink:\n\t\tlogrus.Tracef(\"Symlink from %s to %s\", hdr.Linkname, path)\n\t\t// The base directory for a symlink may not exist before it is created.\n\t\tif err := os.MkdirAll(dir, 0o755); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Check if something already exists at path\n\t\t// If so, delete it\n\t\tif FilepathExists(path) {\n\t\t\tif err := os.RemoveAll(path); err != nil {\n\t\t\t\treturn errors.Wrapf(err, \"error removing %s to make way for new symlink\", hdr.Name)\n\t\t\t}\n\t\t}\n\t\tif err := os.Symlink(hdr.Linkname, path); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc IsInProvidedIgnoreList(path string, wl []IgnoreListEntry) bool {\n\tpath = filepath.Clean(path)\n\tfor _, entry := range wl {\n\t\tif !entry.PrefixMatchOnly && path == entry.Path {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\nfunc IsInIgnoreList(path string) bool {\n\treturn IsInProvidedIgnoreList(path, ignorelist)\n}\n\nfunc CheckCleanedPathAgainstProvidedIgnoreList(path string, wl []IgnoreListEntry) bool {\n\tfor _, wl := range ignorelist {\n\t\tif hasCleanedFilepathPrefix(path, wl.Path, wl.PrefixMatchOnly) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\nfunc CheckIgnoreList(path string) bool {\n\treturn CheckCleanedPathAgainstIgnoreList(filepath.Clean(path))\n}\n\nfunc CheckCleanedPathAgainstIgnoreList(path string) bool {\n\treturn CheckCleanedPathAgainstProvidedIgnoreList(path, ignorelist)\n}\n\nfunc checkIgnoreListRoot(root string) bool {\n\tif root == config.RootDir {\n\t\treturn false\n\t}\n\treturn CheckIgnoreList(root)\n}\n\n// Get ignorelist from roots of mounted files\n// Each line of /proc/self/mountinfo is in the form:\n// 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue\n// (1)(2)(3)   (4)   (5)      (6)      (7)   (8) (9)   (10)         (11)\n// Where (5) is the mount point relative to the process's root\n// From: https://www.kernel.org/doc/Documentation/filesystems/proc.txt\nfunc DetectFilesystemIgnoreList(path string) error {\n\tlogrus.Trace(\"Detecting filesystem ignore list\")\n\tf, err := os.Open(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer f.Close()\n\treader := bufio.NewReader(f)\n\tfor {\n\t\tline, err := reader.ReadString('\\n')\n\t\tlogrus.Tracef(\"Read the following line from %s: %s\", path, line)\n\t\tif err != nil && !errors.Is(err, io.EOF) {\n\t\t\treturn err\n\t\t}\n\t\tlineArr := strings.Split(line, \" \")\n\t\tif len(lineArr) < 5 {\n\t\t\tif err == io.EOF {\n\t\t\t\tlogrus.Tracef(\"Reached end of file %s\", path)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif lineArr[4] != config.RootDir {\n\t\t\tlogrus.Tracef(\"Adding ignore list entry %s from line: %s\", lineArr[4], line)\n\t\t\tAddToIgnoreList(IgnoreListEntry{\n\t\t\t\tPath:            lineArr[4],\n\t\t\t\tPrefixMatchOnly: false,\n\t\t\t})\n\t\t}\n\t\tif err == io.EOF {\n\t\t\tlogrus.Tracef(\"Reached end of file %s\", path)\n\t\t\tbreak\n\t\t}\n\t}\n\treturn nil\n}\n\n// RelativeFiles returns a list of all files at the filepath relative to root\nfunc RelativeFiles(fp string, root string) ([]string, error) {\n\tvar files []string\n\tfullPath := filepath.Join(root, fp)\n\tcleanedRoot := filepath.Clean(root)\n\tlogrus.Debugf(\"Getting files and contents at root %s for %s\", root, fullPath)\n\terr := filepath.Walk(fullPath, func(path string, info os.FileInfo, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif CheckCleanedPathAgainstIgnoreList(path) && !hasCleanedFilepathPrefix(filepath.Clean(path), cleanedRoot, false) {\n\t\t\treturn nil\n\t\t}\n\t\trelPath, err := filepath.Rel(root, path)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfiles = append(files, relPath)\n\t\treturn nil\n\t})\n\treturn files, err\n}\n\n// ParentDirectories returns a list of paths to all parent directories\n// Ex. /some/temp/dir -> [/, /some, /some/temp, /some/temp/dir]\nfunc ParentDirectories(path string) []string {\n\tdir := filepath.Clean(path)\n\tvar paths []string\n\tfor {\n\t\tif dir == filepath.Clean(config.RootDir) || dir == \"\" || dir == \".\" {\n\t\t\tbreak\n\t\t}\n\t\tdir, _ = filepath.Split(dir)\n\t\tdir = filepath.Clean(dir)\n\t\tpaths = append([]string{dir}, paths...)\n\t}\n\tif len(paths) == 0 {\n\t\tpaths = []string{config.RootDir}\n\t}\n\treturn paths\n}\n\n// ParentDirectoriesWithoutLeadingSlash returns a list of paths to all parent directories\n// all subdirectories do not contain a leading /\n// Ex. /some/temp/dir -> [/, some, some/temp, some/temp/dir]\nfunc ParentDirectoriesWithoutLeadingSlash(path string) []string {\n\tpath = filepath.Clean(path)\n\tdirs := strings.Split(path, \"/\")\n\tdirPath := \"\"\n\tpaths := []string{config.RootDir}\n\tfor index, dir := range dirs {\n\t\tif dir == \"\" || index == (len(dirs)-1) {\n\t\t\tcontinue\n\t\t}\n\t\tdirPath = filepath.Join(dirPath, dir)\n\t\tpaths = append(paths, dirPath)\n\t}\n\treturn paths\n}\n\n// FilepathExists returns true if the path exists\nfunc FilepathExists(path string) bool {\n\t_, err := os.Lstat(path)\n\treturn !os.IsNotExist(err)\n}\n\n// resetFileOwnershipIfNotMatching function changes ownership of the file at path to newUID and newGID.\n// If the ownership already matches, chown is not executed.\nfunc resetFileOwnershipIfNotMatching(path string, newUID, newGID uint32) error {\n\tfsInfo, err := os.Lstat(path)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"getting stat of present file\")\n\t}\n\tstat, ok := fsInfo.Sys().(*syscall.Stat_t)\n\tif !ok {\n\t\treturn fmt.Errorf(\"can't convert fs.FileInfo of %v to linux syscall.Stat_t\", path)\n\t}\n\tif stat.Uid != newUID && stat.Gid != newGID {\n\t\terr = os.Chown(path, int(newUID), int(newGID))\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"reseting file ownership to root\")\n\t\t}\n\t}\n\treturn nil\n}\n\n// CreateFile creates a file at path and copies over contents from the reader\nfunc CreateFile(path string, reader io.Reader, perm os.FileMode, uid uint32, gid uint32) error {\n\t// Create directory path if it doesn't exist\n\tif err := createParentDirectory(path, int(uid), int(gid)); err != nil {\n\t\treturn errors.Wrap(err, \"creating parent dir\")\n\t}\n\n\t// if the file is already created with ownership other than root, reset the ownership\n\tif FilepathExists(path) {\n\t\tlogrus.Debugf(\"file at %v already exists, resetting file ownership to root\", path)\n\t\terr := resetFileOwnershipIfNotMatching(path, 0, 0)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"reseting file ownership\")\n\t\t}\n\t}\n\n\tdest, err := os.Create(path)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"creating file\")\n\t}\n\tdefer dest.Close()\n\tif _, err := io.Copy(dest, reader); err != nil {\n\t\treturn errors.Wrap(err, \"copying file\")\n\t}\n\treturn setFilePermissions(path, perm, int(uid), int(gid))\n}\n\n// AddVolumePath adds the given path to the volume ignorelist.\nfunc AddVolumePathToIgnoreList(path string) {\n\tlogrus.Infof(\"Adding volume %s to ignorelist\", path)\n\tAddToIgnoreList(IgnoreListEntry{\n\t\tPath:            path,\n\t\tPrefixMatchOnly: true,\n\t})\n\tvolumes = append(volumes, path)\n}\n\n// DownloadFileToDest downloads the file at rawurl to the given dest for the ADD command\n// From add command docs:\n//  1. If <src> is a remote file URL:\n//     - destination will have permissions of 0600 by default if not specified with chmod\n//     - If remote file has HTTP Last-Modified header, we set the mtime of the file to that timestamp\nfunc DownloadFileToDest(rawurl, dest string, uid, gid int64, chmod fs.FileMode) error {\n\tresp, err := http.Get(rawurl) //nolint:noctx\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer resp.Body.Close()\n\n\tif resp.StatusCode >= 400 {\n\t\treturn fmt.Errorf(\"invalid response status %d\", resp.StatusCode)\n\t}\n\n\tif err := CreateFile(dest, resp.Body, chmod, uint32(uid), uint32(gid)); err != nil {\n\t\treturn err\n\t}\n\tmTime := time.Time{}\n\tlastMod := resp.Header.Get(\"Last-Modified\")\n\tif lastMod != \"\" {\n\t\tif parsedMTime, err := http.ParseTime(lastMod); err == nil {\n\t\t\tmTime = parsedMTime\n\t\t}\n\t}\n\treturn os.Chtimes(dest, mTime, mTime)\n}\n\n// DetermineTargetFileOwnership returns the user provided uid/gid combination.\n// If they are set to -1, the uid/gid from the original file is used.\nfunc DetermineTargetFileOwnership(fi os.FileInfo, uid, gid int64) (int64, int64) {\n\tif uid <= DoNotChangeUID {\n\t\tuid = int64(fi.Sys().(*syscall.Stat_t).Uid)\n\t}\n\tif gid <= DoNotChangeGID {\n\t\tgid = int64(fi.Sys().(*syscall.Stat_t).Gid)\n\t}\n\treturn uid, gid\n}\n\n// CopyDir copies the file or directory at src to dest\n// It returns a list of files it copied over\nfunc CopyDir(src, dest string, context FileContext, uid, gid int64, chmod fs.FileMode, useDefaultChmod bool) ([]string, error) {\n\tfiles, err := RelativeFiles(\"\", src)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"copying dir\")\n\t}\n\tvar copiedFiles []string\n\tfor _, file := range files {\n\t\tfullPath := filepath.Join(src, file)\n\t\tif context.ExcludesFile(fullPath) {\n\t\t\tlogrus.Debugf(\"%s found in .dockerignore, ignoring\", src)\n\t\t\tcontinue\n\t\t}\n\t\tfi, err := os.Lstat(fullPath)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrap(err, \"copying dir\")\n\t\t}\n\t\tdestPath := filepath.Join(dest, file)\n\t\tif fi.IsDir() {\n\t\t\tlogrus.Tracef(\"Creating directory %s\", destPath)\n\n\t\t\tmode := chmod\n\t\t\tif useDefaultChmod {\n\t\t\t\tmode = fi.Mode()\n\t\t\t}\n\t\t\tuid, gid := DetermineTargetFileOwnership(fi, uid, gid)\n\t\t\tif err := MkdirAllWithPermissions(destPath, mode, uid, gid); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t} else if IsSymlink(fi) {\n\t\t\t// If file is a symlink, we want to create the same relative symlink\n\t\t\tif _, err := CopySymlink(fullPath, destPath, context); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t} else {\n\t\t\t// ... Else, we want to copy over a file\n\t\t\tmode := chmod\n\t\t\tif useDefaultChmod {\n\t\t\t\tmode = fs.FileMode(0o600)\n\t\t\t}\n\n\t\t\tif _, err := CopyFile(fullPath, destPath, context, uid, gid, mode, useDefaultChmod); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\tcopiedFiles = append(copiedFiles, destPath)\n\t}\n\treturn copiedFiles, nil\n}\n\n// CopySymlink copies the symlink at src to dest.\nfunc CopySymlink(src, dest string, context FileContext) (bool, error) {\n\tif context.ExcludesFile(src) {\n\t\tlogrus.Debugf(\"%s found in .dockerignore, ignoring\", src)\n\t\treturn true, nil\n\t}\n\tif FilepathExists(dest) {\n\t\tif err := os.RemoveAll(dest); err != nil {\n\t\t\treturn false, err\n\t\t}\n\t}\n\tif err := createParentDirectory(dest, DoNotChangeUID, DoNotChangeGID); err != nil {\n\t\treturn false, err\n\t}\n\tlink, err := os.Readlink(src)\n\tif err != nil {\n\t\tlogrus.Debugf(\"Could not read link for %s\", src)\n\t}\n\treturn false, os.Symlink(link, dest)\n}\n\n// CopyFile copies the file at src to dest\nfunc CopyFile(src, dest string, context FileContext, uid, gid int64, chmod fs.FileMode, useDefaultChmod bool) (bool, error) {\n\tif context.ExcludesFile(src) {\n\t\tlogrus.Debugf(\"%s found in .dockerignore, ignoring\", src)\n\t\treturn true, nil\n\t}\n\tif src == dest {\n\t\t// This is a no-op. Move on, but don't list it as ignored.\n\t\t// We have to make sure we do this so we don't overwrite our own file.\n\t\t// See iusse #904 for an example.\n\t\treturn false, nil\n\t}\n\tfi, err := os.Stat(src)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tlogrus.Debugf(\"Copying file %s to %s\", src, dest)\n\tsrcFile, err := os.Open(src)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tdefer srcFile.Close()\n\tuid, gid = DetermineTargetFileOwnership(fi, uid, gid)\n\n\tmode := chmod\n\tif useDefaultChmod {\n\t\tmode = fi.Mode()\n\t}\n\treturn false, CreateFile(dest, srcFile, mode, uint32(uid), uint32(gid))\n}\n\nfunc NewFileContextFromDockerfile(dockerfilePath, buildcontext string) (FileContext, error) {\n\tfileContext := FileContext{Root: buildcontext}\n\texcludedFiles, err := getExcludedFiles(dockerfilePath, buildcontext)\n\tif err != nil {\n\t\treturn fileContext, err\n\t}\n\tfileContext.ExcludedFiles = excludedFiles\n\treturn fileContext, nil\n}\n\n// getExcludedFiles returns a list of files to exclude from the .dockerignore\nfunc getExcludedFiles(dockerfilePath, buildcontext string) ([]string, error) {\n\tpath := dockerfilePath + \".dockerignore\"\n\tif !FilepathExists(path) {\n\t\tpath = filepath.Join(buildcontext, \".dockerignore\")\n\t}\n\tif !FilepathExists(path) {\n\t\treturn nil, nil\n\t}\n\tlogrus.Infof(\"Using dockerignore file: %v\", path)\n\tcontents, err := os.ReadFile(path)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"parsing .dockerignore\")\n\t}\n\treader := bytes.NewBuffer(contents)\n\treturn dockerignore.ReadAll(reader)\n}\n\n// ExcludesFile returns true if the file context specified this file should be ignored.\n// Usually this is specified via .dockerignore\nfunc (c FileContext) ExcludesFile(path string) bool {\n\tif HasFilepathPrefix(path, c.Root, false) {\n\t\tvar err error\n\t\tpath, err = filepath.Rel(c.Root, path)\n\t\tif err != nil {\n\t\t\tlogrus.Errorf(\"Unable to get relative path, including %s in build: %v\", path, err)\n\t\t\treturn false\n\t\t}\n\t}\n\tmatch, err := patternmatcher.Matches(path, c.ExcludedFiles)\n\tif err != nil {\n\t\tlogrus.Errorf(\"Error matching, including %s in build: %v\", path, err)\n\t\treturn false\n\t}\n\treturn match\n}\n\n// HasFilepathPrefix checks if the given file path begins with prefix\nfunc HasFilepathPrefix(path, prefix string, prefixMatchOnly bool) bool {\n\treturn hasCleanedFilepathPrefix(filepath.Clean(path), filepath.Clean(prefix), prefixMatchOnly)\n}\n\nfunc hasCleanedFilepathPrefix(path, prefix string, prefixMatchOnly bool) bool {\n\tprefixArray := strings.Split(prefix, \"/\")\n\tpathArray := strings.SplitN(path, \"/\", len(prefixArray)+1)\n\tif len(pathArray) < len(prefixArray) {\n\t\treturn false\n\t}\n\tif prefixMatchOnly && len(pathArray) == len(prefixArray) {\n\t\treturn false\n\t}\n\n\tfor index := range prefixArray {\n\t\tm, err := filepath.Match(prefixArray[index], pathArray[index])\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\t\tif !m {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nfunc Volumes() []string {\n\treturn volumes\n}\n\nfunc MkdirAllWithPermissions(path string, mode os.FileMode, uid, gid int64) error {\n\t// Check if a file already exists on the path, if yes then delete it\n\tinfo, err := os.Stat(path)\n\tif err == nil && !info.IsDir() {\n\t\tlogrus.Tracef(\"Removing file because it needs to be a directory %s\", path)\n\t\tif err := os.Remove(path); err != nil {\n\t\t\treturn errors.Wrapf(err, \"error removing %s to make way for new directory.\", path)\n\t\t}\n\t}\n\tif err != nil && !os.IsNotExist(err) {\n\t\treturn errors.Wrapf(err, \"error calling stat on %s.\", path)\n\t}\n\n\tif err := os.MkdirAll(path, mode); err != nil {\n\t\treturn err\n\t}\n\tif uid > math.MaxUint32 || gid > math.MaxUint32 {\n\t\t// due to https://github.com/golang/go/issues/8537\n\t\treturn errors.New(\n\t\t\tfmt.Sprintf(\n\t\t\t\t\"Numeric User-ID or Group-ID greater than %v are not properly supported.\",\n\t\t\t\tuint64(math.MaxUint32),\n\t\t\t),\n\t\t)\n\t}\n\tif err := os.Chown(path, int(uid), int(gid)); err != nil {\n\t\treturn err\n\t}\n\t// In some cases, MkdirAll doesn't change the permissions, so run Chmod\n\t// Must chmod after chown because chown resets the file mode.\n\treturn os.Chmod(path, mode)\n}\n\nfunc setFilePermissions(path string, mode os.FileMode, uid, gid int) error {\n\tif err := os.Chown(path, uid, gid); err != nil {\n\t\treturn err\n\t}\n\t// manually set permissions on file, since the default umask (022) will interfere\n\t// Must chmod after chown because chown resets the file mode.\n\treturn os.Chmod(path, mode)\n}\n\nfunc setFileTimes(path string, aTime, mTime time.Time) error {\n\t// The zero value of time.Time is not a valid argument to os.Chtimes as it cannot be\n\t// converted into a valid argument to the syscall that os.Chtimes uses. If mTime or\n\t// aTime are zero we convert them to the zero value for Unix Epoch.\n\tif mTime.IsZero() {\n\t\tlogrus.Tracef(\"Mod time for %s is zero, converting to zero for epoch\", path)\n\t\tmTime = time.Unix(0, 0)\n\t}\n\n\tif aTime.IsZero() {\n\t\tlogrus.Tracef(\"Access time for %s is zero, converting to zero for epoch\", path)\n\t\taTime = time.Unix(0, 0)\n\t}\n\n\t// We set AccessTime because its a required arg but we only care about\n\t// ModTime. The file will get accessed again so AccessTime will change.\n\tif err := os.Chtimes(path, aTime, mTime); err != nil {\n\t\treturn errors.Wrapf(\n\t\t\terr,\n\t\t\t\"couldn't modify times: atime %v mtime %v\",\n\t\t\taTime,\n\t\t\tmTime,\n\t\t)\n\t}\n\n\treturn nil\n}\n\n// CreateTargetTarfile creates target tar file for downloading the context file.\n// Make directory if directory does not exist\nfunc CreateTargetTarfile(tarpath string) (*os.File, error) {\n\tbaseDir := filepath.Dir(tarpath)\n\tif _, err := os.Lstat(baseDir); os.IsNotExist(err) {\n\t\tlogrus.Debugf(\"BaseDir %s for file %s does not exist. Creating.\", baseDir, tarpath)\n\t\tif err := os.MkdirAll(baseDir, 0o755); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn os.Create(tarpath)\n}\n\n// Returns true if a file is a symlink\nfunc IsSymlink(fi os.FileInfo) bool {\n\treturn fi.Mode()&os.ModeSymlink != 0\n}\n\nvar ErrNotSymLink = fmt.Errorf(\"not a symlink\")\n\nfunc GetSymLink(path string) (string, error) {\n\tif err := getSymlink(path); err != nil {\n\t\treturn \"\", err\n\t}\n\treturn os.Readlink(path)\n}\n\nfunc EvalSymLink(path string) (string, error) {\n\tif err := getSymlink(path); err != nil {\n\t\treturn \"\", err\n\t}\n\treturn filepath.EvalSymlinks(path)\n}\n\nfunc getSymlink(path string) error {\n\tfi, err := os.Lstat(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !IsSymlink(fi) {\n\t\treturn ErrNotSymLink\n\t}\n\treturn nil\n}\n\n// For cross stage dependencies kaniko must persist the referenced path so that it can be used in\n// the dependent stage. For symlinks we copy the target path because copying the symlink would\n// result in a dead link\nfunc CopyFileOrSymlink(src string, destDir string, root string) error {\n\tdestFile := filepath.Join(destDir, src)\n\tsrc = filepath.Join(root, src)\n\tfi, err := os.Lstat(src)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"getting file info\")\n\t}\n\tif IsSymlink(fi) {\n\t\tlink, err := os.Readlink(src)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"copying file or symlink\")\n\t\t}\n\t\tif err := createParentDirectory(destFile, DoNotChangeUID, DoNotChangeGID); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn os.Symlink(link, destFile)\n\t}\n\tif err := otiai10Cpy.Copy(src, destFile, skipKanikoDir); err != nil {\n\t\treturn errors.Wrap(err, \"copying file\")\n\t}\n\tif err := CopyOwnership(src, destDir, root); err != nil {\n\t\treturn errors.Wrap(err, \"copying ownership\")\n\t}\n\tif err := os.Chmod(destFile, fi.Mode()); err != nil {\n\t\treturn errors.Wrap(err, \"copying file mode\")\n\t}\n\treturn nil\n}\n\n// CopyOwnership copies the file or directory ownership recursively at src to dest\nfunc CopyOwnership(src string, destDir string, root string) error {\n\treturn filepath.Walk(src, func(path string, info os.FileInfo, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif IsSymlink(info) {\n\t\t\treturn nil\n\t\t}\n\t\trelPath, err := filepath.Rel(root, path)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdestPath := filepath.Join(destDir, relPath)\n\n\t\tif CheckCleanedPathAgainstIgnoreList(src) && CheckCleanedPathAgainstIgnoreList(destPath) {\n\t\t\tif !isExist(destPath) {\n\t\t\t\tlogrus.Debugf(\"Path %s ignored, but not exists\", destPath)\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif info.IsDir() {\n\t\t\t\treturn filepath.SkipDir\n\t\t\t}\n\t\t\tlogrus.Debugf(\"Not copying ownership for %s, as it's ignored\", destPath)\n\t\t\treturn nil\n\t\t}\n\t\tif CheckIgnoreList(destDir) && CheckCleanedPathAgainstIgnoreList(path) {\n\t\t\tif !isExist(path) {\n\t\t\t\tlogrus.Debugf(\"Path %s ignored, but not exists\", path)\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif info.IsDir() {\n\t\t\t\treturn filepath.SkipDir\n\t\t\t}\n\t\t\tlogrus.Debugf(\"Not copying ownership for %s, as it's ignored\", path)\n\t\t\treturn nil\n\t\t}\n\n\t\tinfo, err = os.Stat(path)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"reading ownership\")\n\t\t}\n\t\tstat := info.Sys().(*syscall.Stat_t)\n\t\treturn os.Chown(destPath, int(stat.Uid), int(stat.Gid))\n\t})\n}\n\nfunc createParentDirectory(path string, uid int, gid int) error {\n\tbaseDir := filepath.Dir(path)\n\tif info, err := os.Lstat(baseDir); os.IsNotExist(err) {\n\t\tlogrus.Tracef(\"BaseDir %s for file %s does not exist. Creating.\", baseDir, path)\n\n\t\tdir := baseDir\n\t\tdirs := []string{baseDir}\n\t\tfor {\n\t\t\tif dir == \"/\" || dir == \".\" || dir == \"\" {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdir = filepath.Dir(dir)\n\t\t\tdirs = append(dirs, dir)\n\t\t}\n\n\t\tfor i := len(dirs) - 1; i >= 0; i-- {\n\t\t\tdir := dirs[i]\n\n\t\t\tif _, err := os.Lstat(dir); os.IsNotExist(err) {\n\t\t\t\tos.Mkdir(dir, 0o755)\n\t\t\t\tif uid != DoNotChangeUID {\n\t\t\t\t\tif gid != DoNotChangeGID {\n\t\t\t\t\t\tos.Chown(dir, uid, gid)\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn errors.New(fmt.Sprintf(\"UID=%d but GID=-1, i.e. it is not set for %s\", uid, dir))\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif gid != DoNotChangeGID {\n\t\t\t\t\t\treturn errors.New(fmt.Sprintf(\"GID=%d but UID=-1, i.e. it is not set for %s\", gid, dir))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t} else if IsSymlink(info) {\n\t\tlogrus.Infof(\"Destination cannot be a symlink %v\", baseDir)\n\t\treturn errors.New(\"destination cannot be a symlink\")\n\t}\n\treturn nil\n}\n\n// InitIgnoreList will initialize the ignore list using:\n// - defaultIgnoreList\n// - mounted paths via DetectFilesystemIgnoreList()\nfunc InitIgnoreList() error {\n\tlogrus.Trace(\"Initializing ignore list\")\n\tignorelist = append([]IgnoreListEntry{}, defaultIgnoreList...)\n\n\tif err := DetectFilesystemIgnoreList(config.MountInfoPath); err != nil {\n\t\treturn errors.Wrap(err, \"checking filesystem mount paths for ignore list\")\n\t}\n\n\treturn nil\n}\n\ntype walkFSResult struct {\n\tfilesAdded    []string\n\texistingPaths map[string]struct{}\n}\n\n// WalkFS given a directory dir and list of existing files existingPaths,\n// returns a list of changed files determined by `changeFunc` and a list\n// of deleted files. Input existingPaths is changed inside this function and\n// returned as deleted files map.\n// It timesout after 90 mins which can be configured via setting an environment variable\n// SNAPSHOT_TIMEOUT in the kaniko pod definition.\nfunc WalkFS(\n\tdir string,\n\texistingPaths map[string]struct{},\n\tchangeFunc func(string) (bool, error),\n) ([]string, map[string]struct{}) {\n\ttimeOutStr := os.Getenv(snapshotTimeout)\n\tif timeOutStr == \"\" {\n\t\tlogrus.Tracef(\"Environment '%s' not set. Using default snapshot timeout '%s'\", snapshotTimeout, defaultTimeout)\n\t\ttimeOutStr = defaultTimeout\n\t}\n\ttimeOut, err := time.ParseDuration(timeOutStr)\n\tif err != nil {\n\t\tlogrus.Fatalf(\"Could not parse duration '%s'\", timeOutStr)\n\t}\n\ttimer := timing.Start(\"Walking filesystem with timeout\")\n\n\tch := make(chan walkFSResult, 1)\n\n\tgo func() {\n\t\tch <- gowalkDir(dir, existingPaths, changeFunc)\n\t}()\n\n\t// Listen on our channel AND a timeout channel - which ever happens first.\n\tselect {\n\tcase res := <-ch:\n\t\ttiming.DefaultRun.Stop(timer)\n\t\treturn res.filesAdded, res.existingPaths\n\tcase <-time.After(timeOut):\n\t\ttiming.DefaultRun.Stop(timer)\n\t\tlogrus.Fatalf(\"Timed out snapshotting FS in %s\", timeOutStr)\n\t\treturn nil, nil\n\t}\n}\n\nfunc gowalkDir(dir string, existingPaths map[string]struct{}, changeFunc func(string) (bool, error)) walkFSResult {\n\tfoundPaths := make([]string, 0)\n\tdeletedFiles := existingPaths // Make a reference.\n\n\tcallback := func(path string, ent *godirwalk.Dirent) error {\n\t\tlogrus.Tracef(\"Analyzing path '%s'\", path)\n\n\t\tif IsInIgnoreList(path) {\n\t\t\tif IsDestDir(path) {\n\t\t\t\tlogrus.Tracef(\"Skipping paths under '%s', as it is an ignored directory\", path)\n\t\t\t\treturn filepath.SkipDir\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\n\t\t// File is existing on disk, remove it from deleted files.\n\t\tdelete(deletedFiles, path)\n\n\t\tif isChanged, err := changeFunc(path); err != nil {\n\t\t\treturn err\n\t\t} else if isChanged {\n\t\t\tfoundPaths = append(foundPaths, path)\n\t\t}\n\n\t\treturn nil\n\t}\n\n\tgodirwalk.Walk(dir,\n\t\t&godirwalk.Options{\n\t\t\tCallback: callback,\n\t\t\tUnsorted: true,\n\t\t})\n\n\treturn walkFSResult{foundPaths, deletedFiles}\n}\n\n// GetFSInfoMap given a directory gets a map of FileInfo for all files\nfunc GetFSInfoMap(dir string, existing map[string]os.FileInfo) (map[string]os.FileInfo, []string) {\n\tfileMap := map[string]os.FileInfo{}\n\tfoundPaths := []string{}\n\ttimer := timing.Start(\"Walking filesystem with Stat\")\n\tgodirwalk.Walk(dir, &godirwalk.Options{\n\t\tCallback: func(path string, ent *godirwalk.Dirent) error {\n\t\t\tif CheckCleanedPathAgainstIgnoreList(path) {\n\t\t\t\tif IsDestDir(path) {\n\t\t\t\t\tlogrus.Tracef(\"Skipping paths under %s, as it is a ignored directory\", path)\n\t\t\t\t\treturn filepath.SkipDir\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif fi, err := os.Lstat(path); err == nil {\n\t\t\t\tif fiPrevious, ok := existing[path]; ok {\n\t\t\t\t\t// check if file changed\n\t\t\t\t\tif !isSame(fiPrevious, fi) {\n\t\t\t\t\t\tfileMap[path] = fi\n\t\t\t\t\t\tfoundPaths = append(foundPaths, path)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// new path\n\t\t\t\t\tfileMap[path] = fi\n\t\t\t\t\tfoundPaths = append(foundPaths, path)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t},\n\t\tUnsorted: true,\n\t},\n\t)\n\ttiming.DefaultRun.Stop(timer)\n\treturn fileMap, foundPaths\n}\n\nfunc isSame(fi1, fi2 os.FileInfo) bool {\n\treturn fi1.Mode() == fi2.Mode() &&\n\t\t// file modification time\n\t\tfi1.ModTime() == fi2.ModTime() &&\n\t\t// file size\n\t\tfi1.Size() == fi2.Size() &&\n\t\t// file user id\n\t\tuint64(fi1.Sys().(*syscall.Stat_t).Uid) == uint64(fi2.Sys().(*syscall.Stat_t).Uid) &&\n\t\t// file group id is\n\t\tuint64(fi1.Sys().(*syscall.Stat_t).Gid) == uint64(fi2.Sys().(*syscall.Stat_t).Gid)\n}\n"
  },
  {
    "path": "pkg/util/fs_util_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage util\n\nimport (\n\t\"archive/tar\"\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/constants\"\n\t\"github.com/GoogleContainerTools/kaniko/pkg/mocks/go-containerregistry/mockv1\"\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n\t\"github.com/golang/mock/gomock\"\n\tv1 \"github.com/google/go-containerregistry/pkg/v1\"\n\t\"github.com/google/go-containerregistry/pkg/v1/types\"\n)\n\nfunc Test_DetectFilesystemSkiplist(t *testing.T) {\n\ttestDir := t.TempDir()\n\tfileContents := `\n\t228 122 0:90 / / rw,relatime - aufs none rw,si=f8e2406af90782bc,dio,dirperm1\n\t229 228 0:98 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw\n\t230 228 0:99 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755\n\t231 230 0:100 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666\n\t232 228 0:101 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs ro`\n\n\tpath := filepath.Join(testDir, \"mountinfo\")\n\tif err := os.MkdirAll(filepath.Dir(path), 0o750); err != nil {\n\t\tt.Fatalf(\"Error creating tempdir: %s\", err)\n\t}\n\tif err := os.WriteFile(path, []byte(fileContents), 0o644); err != nil {\n\t\tt.Fatalf(\"Error writing file contents to %s: %s\", path, err)\n\t}\n\n\terr := DetectFilesystemIgnoreList(path)\n\texpectedSkiplist := []IgnoreListEntry{\n\t\t{\"/kaniko\", false},\n\t\t{\"/proc\", false},\n\t\t{\"/dev\", false},\n\t\t{\"/dev/pts\", false},\n\t\t{\"/sys\", false},\n\t\t{\"/etc/mtab\", false},\n\t\t{\"/tmp/apt-key-gpghome\", true},\n\t}\n\tactualSkiplist := ignorelist\n\tsort.Slice(actualSkiplist, func(i, j int) bool {\n\t\treturn actualSkiplist[i].Path < actualSkiplist[j].Path\n\t})\n\tsort.Slice(expectedSkiplist, func(i, j int) bool {\n\t\treturn expectedSkiplist[i].Path < expectedSkiplist[j].Path\n\t})\n\ttestutil.CheckErrorAndDeepEqual(t, false, err, expectedSkiplist, actualSkiplist)\n}\n\nfunc Test_AddToIgnoreList(t *testing.T) {\n\tt.Cleanup(func() {\n\t\tignorelist = append([]IgnoreListEntry{}, defaultIgnoreList...)\n\t})\n\n\tAddToIgnoreList(IgnoreListEntry{\n\t\tPath:            \"/tmp\",\n\t\tPrefixMatchOnly: false,\n\t})\n\n\tif !CheckIgnoreList(\"/tmp\") {\n\t\tt.Errorf(\"CheckIgnoreList() = %v, want %v\", false, true)\n\t}\n}\n\nvar tests = []struct {\n\tfiles         map[string]string\n\tdirectory     string\n\texpectedFiles []string\n}{\n\t{\n\t\tfiles: map[string]string{\n\t\t\t\"/workspace/foo/a\": \"baz1\",\n\t\t\t\"/workspace/foo/b\": \"baz2\",\n\t\t\t\"/kaniko/file\":     \"file\",\n\t\t},\n\t\tdirectory: \"/workspace/foo/\",\n\t\texpectedFiles: []string{\n\t\t\t\"workspace/foo/a\",\n\t\t\t\"workspace/foo/b\",\n\t\t\t\"workspace/foo\",\n\t\t},\n\t},\n\t{\n\t\tfiles: map[string]string{\n\t\t\t\"/workspace/foo/a\": \"baz1\",\n\t\t},\n\t\tdirectory: \"/workspace/foo/a\",\n\t\texpectedFiles: []string{\n\t\t\t\"workspace/foo/a\",\n\t\t},\n\t},\n\t{\n\t\tfiles: map[string]string{\n\t\t\t\"/workspace/foo/a\": \"baz1\",\n\t\t\t\"/workspace/foo/b\": \"baz2\",\n\t\t\t\"/workspace/baz\":   \"hey\",\n\t\t\t\"/kaniko/file\":     \"file\",\n\t\t},\n\t\tdirectory: \"/workspace\",\n\t\texpectedFiles: []string{\n\t\t\t\"workspace/foo/a\",\n\t\t\t\"workspace/foo/b\",\n\t\t\t\"workspace/baz\",\n\t\t\t\"workspace\",\n\t\t\t\"workspace/foo\",\n\t\t},\n\t},\n\t{\n\t\tfiles: map[string]string{\n\t\t\t\"/workspace/foo/a\": \"baz1\",\n\t\t\t\"/workspace/foo/b\": \"baz2\",\n\t\t},\n\t\tdirectory: \"\",\n\t\texpectedFiles: []string{\n\t\t\t\"workspace/foo/a\",\n\t\t\t\"workspace/foo/b\",\n\t\t\t\"workspace\",\n\t\t\t\"workspace/foo\",\n\t\t\t\".\",\n\t\t},\n\t},\n}\n\nfunc Test_RelativeFiles(t *testing.T) {\n\tfor _, test := range tests {\n\t\ttestDir := t.TempDir()\n\t\tif err := testutil.SetupFiles(testDir, test.files); err != nil {\n\t\t\tt.Fatalf(\"err setting up files: %v\", err)\n\t\t}\n\t\tactualFiles, err := RelativeFiles(test.directory, testDir)\n\t\tsort.Strings(actualFiles)\n\t\tsort.Strings(test.expectedFiles)\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, err, test.expectedFiles, actualFiles)\n\t}\n}\n\nfunc Test_ParentDirectories(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tpath     string\n\t\trootDir  string\n\t\texpected []string\n\t}{\n\t\t{\n\t\t\tname:    \"regular path\",\n\t\t\tpath:    \"/path/to/dir\",\n\t\t\trootDir: \"/\",\n\t\t\texpected: []string{\n\t\t\t\t\"/\",\n\t\t\t\t\"/path\",\n\t\t\t\t\"/path/to\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:    \"current directory\",\n\t\t\tpath:    \".\",\n\t\t\trootDir: \"/\",\n\t\t\texpected: []string{\n\t\t\t\t\"/\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:    \"non / root directory\",\n\t\t\tpath:    \"/tmp/kaniko/test/another/dir\",\n\t\t\trootDir: \"/tmp/kaniko/\",\n\t\t\texpected: []string{\n\t\t\t\t\"/tmp/kaniko\",\n\t\t\t\t\"/tmp/kaniko/test\",\n\t\t\t\t\"/tmp/kaniko/test/another\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:    \"non / root director same path\",\n\t\t\tpath:    \"/tmp/123\",\n\t\t\trootDir: \"/tmp/123\",\n\t\t\texpected: []string{\n\t\t\t\t\"/tmp/123\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:    \"non / root directory path\",\n\t\t\tpath:    \"/tmp/120162240/kaniko\",\n\t\t\trootDir: \"/tmp/120162240\",\n\t\t\texpected: []string{\n\t\t\t\t\"/tmp/120162240\",\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\toriginal := config.RootDir\n\t\t\tdefer func() { config.RootDir = original }()\n\t\t\tconfig.RootDir = tt.rootDir\n\t\t\tactual := ParentDirectories(tt.path)\n\n\t\t\ttestutil.CheckErrorAndDeepEqual(t, false, nil, tt.expected, actual)\n\t\t})\n\t}\n}\n\nfunc Test_ParentDirectoriesWithoutLeadingSlash(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tpath     string\n\t\texpected []string\n\t}{\n\t\t{\n\t\t\tname: \"regular path\",\n\t\t\tpath: \"/path/to/dir\",\n\t\t\texpected: []string{\n\t\t\t\t\"/\",\n\t\t\t\t\"path\",\n\t\t\t\t\"path/to\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"current directory\",\n\t\t\tpath: \".\",\n\t\t\texpected: []string{\n\t\t\t\t\"/\",\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tactual := ParentDirectoriesWithoutLeadingSlash(tt.path)\n\t\t\ttestutil.CheckErrorAndDeepEqual(t, false, nil, tt.expected, actual)\n\t\t})\n\t}\n}\n\nfunc Test_CheckIgnoreList(t *testing.T) {\n\ttype args struct {\n\t\tpath       string\n\t\tignorelist []IgnoreListEntry\n\t}\n\ttests := []struct {\n\t\tname string\n\t\targs args\n\t\twant bool\n\t}{\n\t\t{\n\t\t\tname: \"file ignored\",\n\t\t\targs: args{\n\t\t\t\tpath:       \"/foo\",\n\t\t\t\tignorelist: []IgnoreListEntry{{\"/foo\", false}},\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"directory ignored\",\n\t\t\targs: args{\n\t\t\t\tpath:       \"/foo/bar\",\n\t\t\t\tignorelist: []IgnoreListEntry{{\"/foo\", false}},\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"grandparent ignored\",\n\t\t\targs: args{\n\t\t\t\tpath:       \"/foo/bar/baz\",\n\t\t\t\tignorelist: []IgnoreListEntry{{\"/foo\", false}},\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"sibling ignored\",\n\t\t\targs: args{\n\t\t\t\tpath:       \"/foo/bar/baz\",\n\t\t\t\tignorelist: []IgnoreListEntry{{\"/foo/bat\", false}},\n\t\t\t},\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"prefix match only \",\n\t\t\targs: args{\n\t\t\t\tpath:       \"/tmp/apt-key-gpghome.xft/gpg.key\",\n\t\t\t\tignorelist: []IgnoreListEntry{{\"/tmp/apt-key-gpghome.*\", true}},\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\toriginal := ignorelist\n\t\t\tdefer func() {\n\t\t\t\tignorelist = original\n\t\t\t}()\n\t\t\tignorelist = tt.args.ignorelist\n\t\t\tgot := CheckIgnoreList(tt.args.path)\n\t\t\tif got != tt.want {\n\t\t\t\tt.Errorf(\"CheckIgnoreList() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestHasFilepathPrefix(t *testing.T) {\n\ttype args struct {\n\t\tpath            string\n\t\tprefix          string\n\t\tprefixMatchOnly bool\n\t}\n\ttests := []struct {\n\t\tname string\n\t\targs args\n\t\twant bool\n\t}{\n\t\t{\n\t\t\tname: \"parent\",\n\t\t\targs: args{\n\t\t\t\tpath:            \"/foo/bar\",\n\t\t\t\tprefix:          \"/foo\",\n\t\t\t\tprefixMatchOnly: false,\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"nested parent\",\n\t\t\targs: args{\n\t\t\t\tpath:            \"/foo/bar/baz\",\n\t\t\t\tprefix:          \"/foo/bar\",\n\t\t\t\tprefixMatchOnly: false,\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"sibling\",\n\t\t\targs: args{\n\t\t\t\tpath:            \"/foo/bar\",\n\t\t\t\tprefix:          \"/bar\",\n\t\t\t\tprefixMatchOnly: false,\n\t\t\t},\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"nested sibling\",\n\t\t\targs: args{\n\t\t\t\tpath:            \"/foo/bar/baz\",\n\t\t\t\tprefix:          \"/foo/bar\",\n\t\t\t\tprefixMatchOnly: false,\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"name prefix\",\n\t\t\targs: args{\n\t\t\t\tpath:            \"/foo2/bar\",\n\t\t\t\tprefix:          \"/foo\",\n\t\t\t\tprefixMatchOnly: false,\n\t\t\t},\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"prefix match only (volume)\",\n\t\t\targs: args{\n\t\t\t\tpath:            \"/foo\",\n\t\t\t\tprefix:          \"/foo\",\n\t\t\t\tprefixMatchOnly: true,\n\t\t\t},\n\t\t\twant: false,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif got := HasFilepathPrefix(tt.args.path, tt.args.prefix, tt.args.prefixMatchOnly); got != tt.want {\n\t\t\t\tt.Errorf(\"HasFilepathPrefix() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc BenchmarkHasFilepathPrefix(b *testing.B) {\n\ttests := []struct {\n\t\tpath            string\n\t\tprefix          string\n\t\tprefixMatchOnly bool\n\t}{\n\t\t{\n\t\t\tpath:            \"/foo/bar\",\n\t\t\tprefix:          \"/foo\",\n\t\t\tprefixMatchOnly: true,\n\t\t},\n\t\t{\n\t\t\tpath:            \"/foo/bar/baz\",\n\t\t\tprefix:          \"/foo\",\n\t\t\tprefixMatchOnly: true,\n\t\t},\n\t\t{\n\t\t\tpath:            \"/foo/bar/baz/foo\",\n\t\t\tprefix:          \"/foo\",\n\t\t\tprefixMatchOnly: true,\n\t\t},\n\t\t{\n\t\t\tpath:            \"/foo/bar/baz/foo/foobar\",\n\t\t\tprefix:          \"/foo\",\n\t\t\tprefixMatchOnly: true,\n\t\t},\n\t\t{\n\t\t\tpath:            \"/foo/bar\",\n\t\t\tprefix:          \"/foo/bar\",\n\t\t\tprefixMatchOnly: true,\n\t\t},\n\t\t{\n\t\t\tpath:            \"/foo/bar/baz\",\n\t\t\tprefix:          \"/foo/bar\",\n\t\t\tprefixMatchOnly: true,\n\t\t},\n\t\t{\n\t\t\tpath:            \"/foo/bar/baz/foo\",\n\t\t\tprefix:          \"/foo/bar\",\n\t\t\tprefixMatchOnly: true,\n\t\t},\n\t\t{\n\t\t\tpath:            \"/foo/bar/baz/foo/foobar\",\n\t\t\tprefix:          \"/foo/bar\",\n\t\t\tprefixMatchOnly: true,\n\t\t},\n\t\t{\n\t\t\tpath:            \"/foo/bar\",\n\t\t\tprefix:          \"/foo/bar/baz\",\n\t\t\tprefixMatchOnly: true,\n\t\t},\n\t\t{\n\t\t\tpath:            \"/foo/bar/baz\",\n\t\t\tprefix:          \"/foo/bar/baz\",\n\t\t\tprefixMatchOnly: true,\n\t\t},\n\t\t{\n\t\t\tpath:            \"/foo/bar/baz/foo\",\n\t\t\tprefix:          \"/foo/bar/baz\",\n\t\t\tprefixMatchOnly: true,\n\t\t},\n\t\t{\n\t\t\tpath:            \"/foo/bar/baz/foo/foobar\",\n\t\t\tprefix:          \"/foo/bar/baz\",\n\t\t\tprefixMatchOnly: true,\n\t\t},\n\t}\n\tfor _, ts := range tests {\n\t\tname := fmt.Sprint(\"PathDepth=\", strings.Count(ts.path, \"/\"), \",PrefixDepth=\", strings.Count(ts.prefix, \"/\"))\n\t\tb.Run(name, func(b *testing.B) {\n\t\t\tb.ReportAllocs()\n\t\t\tfor i := 0; i < b.N; i++ {\n\t\t\t\tHasFilepathPrefix(ts.path, ts.prefix, ts.prefixMatchOnly)\n\t\t\t}\n\t\t})\n\t}\n}\n\ntype checker func(root string, t *testing.T)\n\nfunc fileExists(p string) checker {\n\treturn func(root string, t *testing.T) {\n\t\t_, err := os.Stat(filepath.Join(root, p))\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"File %s does not exist\", filepath.Join(root, p))\n\t\t}\n\t}\n}\n\nfunc fileMatches(p string, c []byte) checker {\n\treturn func(root string, t *testing.T) {\n\t\tactual, err := os.ReadFile(filepath.Join(root, p))\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"error reading file: %s\", p)\n\t\t}\n\t\tif !reflect.DeepEqual(actual, c) {\n\t\t\tt.Errorf(\"file contents do not match. %v!=%v\", actual, c)\n\t\t}\n\t}\n}\n\nfunc timesMatch(p string, fTime time.Time) checker {\n\treturn func(root string, t *testing.T) {\n\t\tfi, err := os.Stat(filepath.Join(root, p))\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"error statting file %s\", p)\n\t\t}\n\n\t\tif fi.ModTime().UTC() != fTime.UTC() {\n\t\t\tt.Errorf(\"Expected modtime to equal %v but was %v\", fTime, fi.ModTime())\n\t\t}\n\t}\n}\n\nfunc permissionsMatch(p string, perms os.FileMode) checker {\n\treturn func(root string, t *testing.T) {\n\t\tfi, err := os.Stat(filepath.Join(root, p))\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"error statting file %s\", p)\n\t\t}\n\t\tif fi.Mode() != perms {\n\t\t\tt.Errorf(\"Permissions do not match. %s != %s\", fi.Mode(), perms)\n\t\t}\n\t}\n}\n\nfunc linkPointsTo(src, dst string) checker {\n\treturn func(root string, t *testing.T) {\n\t\tlink := filepath.Join(root, src)\n\t\tgot, err := os.Readlink(link)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"error reading link %s: %s\", link, err)\n\t\t}\n\t\tif got != dst {\n\t\t\tt.Errorf(\"link destination does not match: %s != %s\", got, dst)\n\t\t}\n\t}\n}\n\nfunc filesAreHardlinks(first, second string) checker {\n\treturn func(root string, t *testing.T) {\n\t\tfi1, err := os.Stat(filepath.Join(root, first))\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"error getting file %s\", first)\n\t\t}\n\t\tfi2, err := os.Stat(filepath.Join(root, second))\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"error getting file %s\", second)\n\t\t}\n\t\tstat1 := getSyscallStatT(fi1)\n\t\tstat2 := getSyscallStatT(fi2)\n\t\tif stat1.Ino != stat2.Ino {\n\t\t\tt.Errorf(\"%s and %s aren't hardlinks as they dont' have the same inode\", first, second)\n\t\t}\n\t}\n}\n\nfunc fileHeader(name string, contents string, mode int64, fTime time.Time) *tar.Header {\n\treturn &tar.Header{\n\t\tName:       name,\n\t\tSize:       int64(len(contents)),\n\t\tMode:       mode,\n\t\tTypeflag:   tar.TypeReg,\n\t\tUid:        os.Getuid(),\n\t\tGid:        os.Getgid(),\n\t\tAccessTime: fTime,\n\t\tModTime:    fTime,\n\t}\n}\n\nfunc linkHeader(name, linkname string) *tar.Header {\n\treturn &tar.Header{\n\t\tName:     name,\n\t\tSize:     0,\n\t\tTypeflag: tar.TypeSymlink,\n\t\tLinkname: linkname,\n\t}\n}\n\nfunc hardlinkHeader(name, linkname string) *tar.Header {\n\treturn &tar.Header{\n\t\tName:     name,\n\t\tSize:     0,\n\t\tTypeflag: tar.TypeLink,\n\t\tLinkname: linkname,\n\t}\n}\n\nfunc dirHeader(name string, mode int64) *tar.Header {\n\treturn &tar.Header{\n\t\tName:     name,\n\t\tSize:     0,\n\t\tTypeflag: tar.TypeDir,\n\t\tMode:     mode,\n\t\tUid:      os.Getuid(),\n\t\tGid:      os.Getgid(),\n\t}\n}\n\nfunc createUncompressedTar(fileContents map[string]string, tarFileName, testDir string) error {\n\tif err := testutil.SetupFiles(testDir, fileContents); err != nil {\n\t\treturn err\n\t}\n\ttarFile, err := os.Create(filepath.Join(testDir, tarFileName))\n\tif err != nil {\n\t\treturn err\n\t}\n\tt := NewTar(tarFile)\n\tdefer t.Close()\n\tfor file := range fileContents {\n\t\tfilePath := filepath.Join(testDir, file)\n\t\tif err := t.AddFileToTar(filePath); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc Test_UnTar(t *testing.T) {\n\ttcs := []struct {\n\t\tname             string\n\t\tsetupTarContents map[string]string\n\t\ttarFileName      string\n\t\tdestination      string\n\t\texpectedFileList []string\n\t\terrorExpected    bool\n\t}{\n\t\t{\n\t\t\tname: \"multfile tar\",\n\t\t\tsetupTarContents: map[string]string{\n\t\t\t\t\"foo/file1\": \"hello World\",\n\t\t\t\t\"bar/file1\": \"hello World\",\n\t\t\t\t\"bar/file2\": \"hello World\",\n\t\t\t\t\"file1\":     \"hello World\",\n\t\t\t},\n\t\t\ttarFileName:      \"test.tar\",\n\t\t\tdestination:      \"/\",\n\t\t\texpectedFileList: []string{\"foo/file1\", \"bar/file1\", \"bar/file2\", \"file1\"},\n\t\t\terrorExpected:    false,\n\t\t},\n\t\t{\n\t\t\tname:             \"empty tar\",\n\t\t\tsetupTarContents: map[string]string{},\n\t\t\ttarFileName:      \"test.tar\",\n\t\t\tdestination:      \"/\",\n\t\t\texpectedFileList: nil,\n\t\t\terrorExpected:    false,\n\t\t},\n\t}\n\tfor _, tc := range tcs {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\ttestDir := t.TempDir()\n\t\t\tif err := createUncompressedTar(tc.setupTarContents, tc.tarFileName, testDir); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tfile, err := os.Open(filepath.Join(testDir, tc.tarFileName))\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tfileList, err := UnTar(file, tc.destination)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\t// update expectedFileList to take into factor temp directory\n\t\t\tfor i, file := range tc.expectedFileList {\n\t\t\t\ttc.expectedFileList[i] = filepath.Join(testDir, file)\n\t\t\t}\n\t\t\t// sort both slices to ensure objects are in the same order for deep equals\n\t\t\tsort.Strings(tc.expectedFileList)\n\t\t\tsort.Strings(fileList)\n\t\t\ttestutil.CheckErrorAndDeepEqual(t, tc.errorExpected, err, tc.expectedFileList, fileList)\n\t\t})\n\t}\n}\n\nfunc TestExtractFile(t *testing.T) {\n\ttype tc struct {\n\t\tname     string\n\t\thdrs     []*tar.Header\n\t\ttmpdir   string\n\t\tcontents []byte\n\t\tcheckers []checker\n\t}\n\n\tdefaultTestTime, err := time.Parse(time.RFC3339, \"1912-06-23T00:00:00Z\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\ttcs := []tc{\n\t\t{\n\t\t\tname:     \"normal file\",\n\t\t\tcontents: []byte(\"helloworld\"),\n\t\t\thdrs:     []*tar.Header{fileHeader(\"./bar\", \"helloworld\", 0o644, defaultTestTime)},\n\t\t\tcheckers: []checker{\n\t\t\t\tfileExists(\"/bar\"),\n\t\t\t\tfileMatches(\"/bar\", []byte(\"helloworld\")),\n\t\t\t\tpermissionsMatch(\"/bar\", 0o644),\n\t\t\t\ttimesMatch(\"/bar\", defaultTestTime),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:     \"normal file, directory does not exist\",\n\t\t\tcontents: []byte(\"helloworld\"),\n\t\t\thdrs:     []*tar.Header{fileHeader(\"./foo/bar\", \"helloworld\", 0o644, defaultTestTime)},\n\t\t\tcheckers: []checker{\n\t\t\t\tfileExists(\"/foo/bar\"),\n\t\t\t\tfileMatches(\"/foo/bar\", []byte(\"helloworld\")),\n\t\t\t\tpermissionsMatch(\"/foo/bar\", 0o644),\n\t\t\t\tpermissionsMatch(\"/foo\", 0o755|os.ModeDir),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:     \"normal file, directory is created after\",\n\t\t\tcontents: []byte(\"helloworld\"),\n\t\t\thdrs: []*tar.Header{\n\t\t\t\tfileHeader(\"./foo/bar\", \"helloworld\", 0o644, defaultTestTime),\n\t\t\t\tdirHeader(\"./foo\", 0o722),\n\t\t\t},\n\t\t\tcheckers: []checker{\n\t\t\t\tfileExists(\"/foo/bar\"),\n\t\t\t\tfileMatches(\"/foo/bar\", []byte(\"helloworld\")),\n\t\t\t\tpermissionsMatch(\"/foo/bar\", 0o644),\n\t\t\t\tpermissionsMatch(\"/foo\", 0o722|os.ModeDir),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"symlink\",\n\t\t\thdrs: []*tar.Header{linkHeader(\"./bar\", \"bar/bat\")},\n\t\t\tcheckers: []checker{\n\t\t\t\tlinkPointsTo(\"/bar\", \"bar/bat\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"symlink relative path\",\n\t\t\thdrs: []*tar.Header{linkHeader(\"./bar\", \"./foo/bar/baz\")},\n\t\t\tcheckers: []checker{\n\t\t\t\tlinkPointsTo(\"/bar\", \"./foo/bar/baz\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"symlink parent does not exist\",\n\t\t\thdrs: []*tar.Header{linkHeader(\"./foo/bar/baz\", \"../../bat\")},\n\t\t\tcheckers: []checker{\n\t\t\t\tlinkPointsTo(\"/foo/bar/baz\", \"../../bat\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"symlink parent does not exist 2\",\n\t\t\thdrs: []*tar.Header{linkHeader(\"./foo/bar/baz\", \"../../bat\")},\n\t\t\tcheckers: []checker{\n\t\t\t\tlinkPointsTo(\"/foo/bar/baz\", \"../../bat\"),\n\t\t\t\tpermissionsMatch(\"/foo\", 0o755|os.ModeDir),\n\t\t\t\tpermissionsMatch(\"/foo/bar\", 0o755|os.ModeDir),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:   \"hardlink\",\n\t\t\ttmpdir: \"/tmp/hardlink\",\n\t\t\thdrs: []*tar.Header{\n\t\t\t\tfileHeader(\"/bin/gzip\", \"gzip-binary\", 0o751, defaultTestTime),\n\t\t\t\thardlinkHeader(\"/bin/uncompress\", \"/bin/gzip\"),\n\t\t\t},\n\t\t\tcheckers: []checker{\n\t\t\t\tfileExists(\"/bin/gzip\"),\n\t\t\t\tfilesAreHardlinks(\"/bin/uncompress\", \"/bin/gzip\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:     \"file with setuid bit\",\n\t\t\tcontents: []byte(\"helloworld\"),\n\t\t\thdrs:     []*tar.Header{fileHeader(\"./bar\", \"helloworld\", 0o4644, defaultTestTime)},\n\t\t\tcheckers: []checker{\n\t\t\t\tfileExists(\"/bar\"),\n\t\t\t\tfileMatches(\"/bar\", []byte(\"helloworld\")),\n\t\t\t\tpermissionsMatch(\"/bar\", 0o644|os.ModeSetuid),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname:     \"dir with sticky bit\",\n\t\t\tcontents: []byte(\"helloworld\"),\n\t\t\thdrs: []*tar.Header{\n\t\t\t\tdirHeader(\"./foo\", 0o1755),\n\t\t\t\tfileHeader(\"./foo/bar\", \"helloworld\", 0o644, defaultTestTime),\n\t\t\t},\n\t\t\tcheckers: []checker{\n\t\t\t\tfileExists(\"/foo/bar\"),\n\t\t\t\tfileMatches(\"/foo/bar\", []byte(\"helloworld\")),\n\t\t\t\tpermissionsMatch(\"/foo/bar\", 0o644),\n\t\t\t\tpermissionsMatch(\"/foo\", 0o755|os.ModeDir|os.ModeSticky),\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range tcs {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\ttc := tc\n\t\t\tt.Parallel()\n\t\t\tr := \"\"\n\n\t\t\tif tc.tmpdir != \"\" {\n\t\t\t\tr = tc.tmpdir\n\t\t\t} else {\n\t\t\t\tr = t.TempDir()\n\t\t\t}\n\t\t\tdefer os.RemoveAll(r)\n\n\t\t\tfor _, hdr := range tc.hdrs {\n\t\t\t\tif err := ExtractFile(r, hdr, filepath.Clean(hdr.Name), bytes.NewReader(tc.contents)); err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor _, checker := range tc.checkers {\n\t\t\t\tchecker(r, t)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCopySymlink(t *testing.T) {\n\ttype tc struct {\n\t\tname       string\n\t\tlinkTarget string\n\t\tdest       string\n\t\tbeforeLink func(r string) error\n\t}\n\n\ttcs := []tc{{\n\t\tname:       \"absolute symlink\",\n\t\tlinkTarget: \"/abs/dest\",\n\t}, {\n\t\tname:       \"relative symlink\",\n\t\tlinkTarget: \"rel\",\n\t}, {\n\t\tname:       \"symlink copy overwrites existing file\",\n\t\tlinkTarget: \"/abs/dest\",\n\t\tdest:       \"overwrite_me\",\n\t\tbeforeLink: func(r string) error {\n\t\t\treturn os.WriteFile(filepath.Join(r, \"overwrite_me\"), nil, 0o644)\n\t\t},\n\t}}\n\n\tfor _, tc := range tcs {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\ttc := tc\n\t\t\tt.Parallel()\n\t\t\tr := t.TempDir()\n\t\t\tos.MkdirAll(filepath.Join(r, filepath.Dir(tc.linkTarget)), 0o777)\n\t\t\ttc.linkTarget = filepath.Join(r, tc.linkTarget)\n\t\t\tos.WriteFile(tc.linkTarget, nil, 0o644)\n\n\t\t\tif tc.beforeLink != nil {\n\t\t\t\tif err := tc.beforeLink(r); err != nil {\n\t\t\t\t\tt.Fatal(err)\n\t\t\t\t}\n\t\t\t}\n\t\t\tlink := filepath.Join(r, \"link\")\n\t\t\tdest := filepath.Join(r, \"copy\")\n\t\t\tif tc.dest != \"\" {\n\t\t\t\tdest = filepath.Join(r, tc.dest)\n\t\t\t}\n\t\t\tif err := os.Symlink(tc.linkTarget, link); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif _, err := CopySymlink(link, dest, FileContext{}); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t\tif _, err := os.Lstat(dest); err != nil {\n\t\t\t\tt.Fatalf(\"error reading link %s: %s\", link, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_childDirInSkiplist(t *testing.T) {\n\ttype args struct {\n\t\tpath       string\n\t\tignorelist []IgnoreListEntry\n\t}\n\ttests := []struct {\n\t\tname string\n\t\targs args\n\t\twant bool\n\t}{\n\t\t{\n\t\t\tname: \"not in ignorelist\",\n\t\t\targs: args{\n\t\t\t\tpath: \"/foo\",\n\t\t\t},\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"child in ignorelist\",\n\t\t\targs: args{\n\t\t\t\tpath: \"/foo\",\n\t\t\t\tignorelist: []IgnoreListEntry{\n\t\t\t\t\t{\n\t\t\t\t\t\tPath: \"/foo/bar\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: true,\n\t\t},\n\t}\n\toldIgnoreList := ignorelist\n\tdefer func() {\n\t\tignorelist = oldIgnoreList\n\t}()\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tignorelist = tt.args.ignorelist\n\t\t\tif got := childDirInIgnoreList(tt.args.path); got != tt.want {\n\t\t\t\tt.Errorf(\"childDirInIgnoreList() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_correctDockerignoreFileIsUsed(t *testing.T) {\n\ttype args struct {\n\t\tdockerfilepath string\n\t\tbuildcontext   string\n\t\texcluded       []string\n\t\tincluded       []string\n\t}\n\ttests := []struct {\n\t\tname string\n\t\targs args\n\t}{\n\t\t{\n\t\t\tname: \"relative dockerfile used\",\n\t\t\targs: args{\n\t\t\t\tdockerfilepath: \"../../integration/dockerfiles/Dockerfile_dockerignore_relative\",\n\t\t\t\tbuildcontext:   \"../../integration/\",\n\t\t\t\texcluded:       []string{\"ignore_relative/bar\"},\n\t\t\t\tincluded:       []string{\"ignore_relative/foo\", \"ignore/bar\"},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"context dockerfile is used\",\n\t\t\targs: args{\n\t\t\t\tdockerfilepath: \"../../integration/dockerfiles/Dockerfile_test_dockerignore\",\n\t\t\t\tbuildcontext:   \"../../integration/\",\n\t\t\t\texcluded:       []string{\"ignore/bar\"},\n\t\t\t\tincluded:       []string{\"ignore/foo\", \"ignore_relative/bar\"},\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tfileContext, err := NewFileContextFromDockerfile(tt.args.dockerfilepath, tt.args.buildcontext)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\tfor _, excl := range tt.args.excluded {\n\t\t\tt.Run(tt.name+\" to exclude \"+excl, func(t *testing.T) {\n\t\t\t\tif !fileContext.ExcludesFile(excl) {\n\t\t\t\t\tt.Errorf(\"'%v' not excluded\", excl)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tfor _, incl := range tt.args.included {\n\t\t\tt.Run(tt.name+\" to include \"+incl, func(t *testing.T) {\n\t\t\t\tif fileContext.ExcludesFile(incl) {\n\t\t\t\t\tt.Errorf(\"'%v' not included\", incl)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n}\n\nfunc Test_CopyFile_skips_self(t *testing.T) {\n\tt.Parallel()\n\ttempDir := t.TempDir()\n\n\ttempFile := filepath.Join(tempDir, \"foo\")\n\texpected := \"bar\"\n\n\tif err := os.WriteFile(\n\t\ttempFile,\n\t\t[]byte(expected),\n\t\t0o755,\n\t); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tignored, err := CopyFile(tempFile, tempFile, FileContext{}, DoNotChangeUID, DoNotChangeGID, fs.FileMode(0o600), true)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tif ignored {\n\t\tt.Fatal(\"expected file to NOT be ignored\")\n\t}\n\n\t// Ensure file has expected contents\n\tactualData, err := os.ReadFile(tempFile)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tif actual := string(actualData); actual != expected {\n\t\tt.Fatalf(\"expected file contents to be %q, but got %q\", expected, actual)\n\t}\n}\n\nfunc fakeExtract(_ string, _ *tar.Header, _ string, _ io.Reader) error {\n\treturn nil\n}\n\nfunc Test_GetFSFromLayers_with_whiteouts_include_whiteout_enabled(t *testing.T) {\n\tresetMountInfoFile := provideEmptyMountinfoFile()\n\tdefer resetMountInfoFile()\n\n\tctrl := gomock.NewController(t)\n\n\troot := t.TempDir()\n\t// Write a whiteout path\n\td1 := []byte(\"Hello World\\n\")\n\tif err := os.WriteFile(filepath.Join(root, \"foobar\"), d1, 0o644); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\topts := []FSOpt{\n\t\t// I'd rather use the real func (util.ExtractFile)\n\t\t// but you have to be root to chown\n\t\tExtractFunc(fakeExtract),\n\t\tIncludeWhiteout(),\n\t}\n\n\texpectErr := false\n\n\tf := func(expectedFiles []string, tw *tar.Writer) {\n\t\tfor _, f := range expectedFiles {\n\t\t\tf := strings.TrimPrefix(strings.TrimPrefix(f, root), \"/\")\n\n\t\t\thdr := &tar.Header{\n\t\t\t\tName: f,\n\t\t\t\tMode: 0o644,\n\t\t\t\tSize: int64(len(\"Hello World\\n\")),\n\t\t\t}\n\n\t\t\tif err := tw.WriteHeader(hdr); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tif _, err := tw.Write([]byte(\"Hello World\\n\")); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t}\n\n\t\tif err := tw.Close(); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}\n\n\texpectedFiles := []string{\n\t\tfilepath.Join(root, \"foobar\"),\n\t}\n\n\tbuf := new(bytes.Buffer)\n\ttw := tar.NewWriter(buf)\n\n\tf(expectedFiles, tw)\n\n\tmockLayer := mockv1.NewMockLayer(ctrl)\n\tmockLayer.EXPECT().MediaType().Return(types.OCILayer, nil)\n\n\trc := io.NopCloser(buf)\n\tmockLayer.EXPECT().Uncompressed().Return(rc, nil)\n\n\tsecondLayerFiles := []string{\n\t\tfilepath.Join(root, \".wh.foobar\"),\n\t}\n\n\tbuf = new(bytes.Buffer)\n\ttw = tar.NewWriter(buf)\n\n\tf(secondLayerFiles, tw)\n\n\tmockLayer2 := mockv1.NewMockLayer(ctrl)\n\tmockLayer2.EXPECT().MediaType().Return(types.OCILayer, nil)\n\n\trc = io.NopCloser(buf)\n\tmockLayer2.EXPECT().Uncompressed().Return(rc, nil)\n\n\tlayers := []v1.Layer{\n\t\tmockLayer,\n\t\tmockLayer2,\n\t}\n\n\texpectedFiles = append(expectedFiles, secondLayerFiles...)\n\n\tactualFiles, err := GetFSFromLayers(root, layers, opts...)\n\n\tassertGetFSFromLayers(\n\t\tt,\n\t\tactualFiles,\n\t\texpectedFiles,\n\t\terr,\n\t\texpectErr,\n\t)\n\t// Make sure whiteout files are removed form the root.\n\t_, err = os.Lstat(filepath.Join(root, \"foobar\"))\n\tif err == nil || !os.IsNotExist(err) {\n\t\tt.Errorf(\"expected whiteout foobar file to be deleted. However found it.\")\n\t}\n}\n\nfunc provideEmptyMountinfoFile() func() {\n\t// Provide empty mountinfo file to prevent /tmp from ending up in ignore list on\n\t// distributions with /tmp mountpoint. Otherwise, tests expecting operations in /tmp\n\t// can fail.\n\tconfig.MountInfoPath = \"/dev/null\"\n\treturn func() {\n\t\tconfig.MountInfoPath = constants.MountInfoPath\n\t}\n}\n\nfunc Test_GetFSFromLayers_with_whiteouts_include_whiteout_disabled(t *testing.T) {\n\tresetMountInfoFile := provideEmptyMountinfoFile()\n\tdefer resetMountInfoFile()\n\n\tctrl := gomock.NewController(t)\n\n\troot := t.TempDir()\n\t// Write a whiteout path\n\td1 := []byte(\"Hello World\\n\")\n\tif err := os.WriteFile(filepath.Join(root, \"foobar\"), d1, 0o644); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\topts := []FSOpt{\n\t\t// I'd rather use the real func (util.ExtractFile)\n\t\t// but you have to be root to chown\n\t\tExtractFunc(fakeExtract),\n\t}\n\n\texpectErr := false\n\n\tf := func(expectedFiles []string, tw *tar.Writer) {\n\t\tfor _, f := range expectedFiles {\n\t\t\tf := strings.TrimPrefix(strings.TrimPrefix(f, root), \"/\")\n\n\t\t\thdr := &tar.Header{\n\t\t\t\tName: f,\n\t\t\t\tMode: 0o644,\n\t\t\t\tSize: int64(len(\"Hello world\\n\")),\n\t\t\t}\n\n\t\t\tif err := tw.WriteHeader(hdr); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tif _, err := tw.Write([]byte(\"Hello world\\n\")); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t}\n\n\t\tif err := tw.Close(); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}\n\n\texpectedFiles := []string{\n\t\tfilepath.Join(root, \"foobar\"),\n\t}\n\n\tbuf := new(bytes.Buffer)\n\ttw := tar.NewWriter(buf)\n\n\tf(expectedFiles, tw)\n\n\tmockLayer := mockv1.NewMockLayer(ctrl)\n\tmockLayer.EXPECT().MediaType().Return(types.OCILayer, nil)\n\tlayerFiles := []string{\n\t\tfilepath.Join(root, \"foobar\"),\n\t}\n\tbuf = new(bytes.Buffer)\n\ttw = tar.NewWriter(buf)\n\n\tf(layerFiles, tw)\n\n\trc := io.NopCloser(buf)\n\tmockLayer.EXPECT().Uncompressed().Return(rc, nil)\n\n\tsecondLayerFiles := []string{\n\t\tfilepath.Join(root, \".wh.foobar\"),\n\t}\n\n\tbuf = new(bytes.Buffer)\n\ttw = tar.NewWriter(buf)\n\n\tf(secondLayerFiles, tw)\n\n\tmockLayer2 := mockv1.NewMockLayer(ctrl)\n\tmockLayer2.EXPECT().MediaType().Return(types.OCILayer, nil)\n\n\trc = io.NopCloser(buf)\n\tmockLayer2.EXPECT().Uncompressed().Return(rc, nil)\n\n\tlayers := []v1.Layer{\n\t\tmockLayer,\n\t\tmockLayer2,\n\t}\n\n\tactualFiles, err := GetFSFromLayers(root, layers, opts...)\n\n\tassertGetFSFromLayers(\n\t\tt,\n\t\tactualFiles,\n\t\texpectedFiles,\n\t\terr,\n\t\texpectErr,\n\t)\n\t// Make sure whiteout files are removed form the root.\n\t_, err = os.Lstat(filepath.Join(root, \"foobar\"))\n\tif err == nil || !os.IsNotExist(err) {\n\t\tt.Errorf(\"expected whiteout foobar file to be deleted. However found it.\")\n\t}\n}\n\nfunc Test_GetFSFromLayers_ignorelist(t *testing.T) {\n\tresetMountInfoFile := provideEmptyMountinfoFile()\n\tdefer resetMountInfoFile()\n\n\tctrl := gomock.NewController(t)\n\n\troot := t.TempDir()\n\t// Write a whiteout path\n\tfileContents := []byte(\"Hello World\\n\")\n\tif err := os.Mkdir(filepath.Join(root, \"testdir\"), 0o775); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\topts := []FSOpt{\n\t\t// I'd rather use the real func (util.ExtractFile)\n\t\t// but you have to be root to chown\n\t\tExtractFunc(fakeExtract),\n\t\tIncludeWhiteout(),\n\t}\n\n\tf := func(expectedFiles []string, tw *tar.Writer) {\n\t\tfor _, f := range expectedFiles {\n\t\t\tf := strings.TrimPrefix(strings.TrimPrefix(f, root), \"/\")\n\n\t\t\thdr := &tar.Header{\n\t\t\t\tName: f,\n\t\t\t\tMode: 0o644,\n\t\t\t\tSize: int64(len(string(fileContents))),\n\t\t\t}\n\n\t\t\tif err := tw.WriteHeader(hdr); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\n\t\t\tif _, err := tw.Write(fileContents); err != nil {\n\t\t\t\tt.Fatal(err)\n\t\t\t}\n\t\t}\n\n\t\tif err := tw.Close(); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}\n\n\t// first, testdir is not in ignorelist, so it should be deleted\n\texpectedFiles := []string{\n\t\tfilepath.Join(root, \".wh.testdir\"),\n\t\tfilepath.Join(root, \"testdir\", \"file\"),\n\t\tfilepath.Join(root, \"other-file\"),\n\t}\n\n\tbuf := new(bytes.Buffer)\n\ttw := tar.NewWriter(buf)\n\n\tf(expectedFiles, tw)\n\n\tmockLayer := mockv1.NewMockLayer(ctrl)\n\tmockLayer.EXPECT().MediaType().Return(types.OCILayer, nil)\n\tlayerFiles := []string{\n\t\tfilepath.Join(root, \".wh.testdir\"),\n\t\tfilepath.Join(root, \"testdir\", \"file\"),\n\t\tfilepath.Join(root, \"other-file\"),\n\t}\n\tbuf = new(bytes.Buffer)\n\ttw = tar.NewWriter(buf)\n\n\tf(layerFiles, tw)\n\n\trc := io.NopCloser(buf)\n\tmockLayer.EXPECT().Uncompressed().Return(rc, nil)\n\n\tlayers := []v1.Layer{\n\t\tmockLayer,\n\t}\n\n\tactualFiles, err := GetFSFromLayers(root, layers, opts...)\n\tassertGetFSFromLayers(\n\t\tt,\n\t\tactualFiles,\n\t\texpectedFiles,\n\t\terr,\n\t\tfalse,\n\t)\n\n\t// Make sure whiteout files are removed form the root.\n\t_, err = os.Lstat(filepath.Join(root, \"testdir\"))\n\tif err == nil || !os.IsNotExist(err) {\n\t\tt.Errorf(\"expected testdir to be deleted. However found it.\")\n\t}\n\n\t// second, testdir is in ignorelist, so it should not be deleted\n\toriginal := append([]IgnoreListEntry{}, defaultIgnoreList...)\n\tdefer func() {\n\t\tdefaultIgnoreList = original\n\t}()\n\tdefaultIgnoreList = append(defaultIgnoreList, IgnoreListEntry{\n\t\tPath: filepath.Join(root, \"testdir\"),\n\t})\n\tif err := os.Mkdir(filepath.Join(root, \"testdir\"), 0o775); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\texpectedFiles = []string{\n\t\tfilepath.Join(root, \"other-file\"),\n\t}\n\n\tbuf = new(bytes.Buffer)\n\ttw = tar.NewWriter(buf)\n\n\tf(expectedFiles, tw)\n\n\tmockLayer = mockv1.NewMockLayer(ctrl)\n\tmockLayer.EXPECT().MediaType().Return(types.OCILayer, nil)\n\tlayerFiles = []string{\n\t\tfilepath.Join(root, \".wh.testdir\"),\n\t\tfilepath.Join(root, \"other-file\"),\n\t}\n\tbuf = new(bytes.Buffer)\n\ttw = tar.NewWriter(buf)\n\n\tf(layerFiles, tw)\n\n\trc = io.NopCloser(buf)\n\tmockLayer.EXPECT().Uncompressed().Return(rc, nil)\n\n\tlayers = []v1.Layer{\n\t\tmockLayer,\n\t}\n\n\tactualFiles, err = GetFSFromLayers(root, layers, opts...)\n\tassertGetFSFromLayers(\n\t\tt,\n\t\tactualFiles,\n\t\texpectedFiles,\n\t\terr,\n\t\tfalse,\n\t)\n\n\t// Make sure testdir still exists.\n\t_, err = os.Lstat(filepath.Join(root, \"testdir\"))\n\tif err != nil {\n\t\tt.Errorf(\"expected testdir to exist, but could not Lstat it: %v\", err)\n\t}\n}\n\nfunc Test_GetFSFromLayers(t *testing.T) {\n\tctrl := gomock.NewController(t)\n\n\troot := t.TempDir()\n\n\topts := []FSOpt{\n\t\t// I'd rather use the real func (util.ExtractFile)\n\t\t// but you have to be root to chown\n\t\tExtractFunc(fakeExtract),\n\t}\n\n\texpectErr := false\n\texpectedFiles := []string{\n\t\tfilepath.Join(root, \"foobar\"),\n\t}\n\n\tbuf := new(bytes.Buffer)\n\ttw := tar.NewWriter(buf)\n\n\tfor _, f := range expectedFiles {\n\t\tf := strings.TrimPrefix(strings.TrimPrefix(f, root), \"/\")\n\n\t\thdr := &tar.Header{\n\t\t\tName: f,\n\t\t\tMode: 0o644,\n\t\t\tSize: int64(len(\"Hello world\\n\")),\n\t\t}\n\n\t\tif err := tw.WriteHeader(hdr); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\n\t\tif _, err := tw.Write([]byte(\"Hello world\\n\")); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}\n\n\tif err := tw.Close(); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tmockLayer := mockv1.NewMockLayer(ctrl)\n\tmockLayer.EXPECT().MediaType().Return(types.OCILayer, nil)\n\n\trc := io.NopCloser(buf)\n\tmockLayer.EXPECT().Uncompressed().Return(rc, nil)\n\n\tlayers := []v1.Layer{\n\t\tmockLayer,\n\t}\n\n\tactualFiles, err := GetFSFromLayers(root, layers, opts...)\n\n\tassertGetFSFromLayers(\n\t\tt,\n\t\tactualFiles,\n\t\texpectedFiles,\n\t\terr,\n\t\texpectErr,\n\t)\n}\n\nfunc assertGetFSFromLayers(\n\tt *testing.T,\n\tactualFiles []string,\n\texpectedFiles []string,\n\terr error,\n\texpectErr bool, //nolint:unparam\n) {\n\tt.Helper()\n\tif !expectErr && err != nil {\n\t\tt.Error(err)\n\t\tt.FailNow()\n\t} else if expectErr && err == nil {\n\t\tt.Error(\"expected err to not be nil\")\n\t\tt.FailNow()\n\t}\n\n\tif len(actualFiles) != len(expectedFiles) {\n\t\tt.Errorf(\"expected %s to equal %s\", actualFiles, expectedFiles)\n\t\tt.FailNow()\n\t}\n\n\tfor i := range expectedFiles {\n\t\tif actualFiles[i] != expectedFiles[i] {\n\t\t\tt.Errorf(\"expected %s to equal %s\", actualFiles[i], expectedFiles[i])\n\t\t}\n\t}\n}\n\nfunc TestInitIgnoreList(t *testing.T) {\n\tmountInfo := `36 35 98:0 /kaniko /test/kaniko rw,noatime master:1 - ext3 /dev/root rw,errors=continue\n36 35 98:0 /proc /test/proc rw,noatime master:1 - ext3 /dev/root rw,errors=continue\n`\n\tmFile, err := os.CreateTemp(\"\", \"mountinfo\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer mFile.Close()\n\tif _, err := mFile.WriteString(mountInfo); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tconfig.MountInfoPath = mFile.Name()\n\tdefer func() {\n\t\tconfig.MountInfoPath = constants.MountInfoPath\n\t}()\n\n\texpected := []IgnoreListEntry{\n\t\t{\n\t\t\tPath:            \"/kaniko\",\n\t\t\tPrefixMatchOnly: false,\n\t\t},\n\t\t{\n\t\t\tPath:            \"/test/kaniko\",\n\t\t\tPrefixMatchOnly: false,\n\t\t},\n\t\t{\n\t\t\tPath:            \"/test/proc\",\n\t\t\tPrefixMatchOnly: false,\n\t\t},\n\t\t{\n\t\t\tPath:            \"/etc/mtab\",\n\t\t\tPrefixMatchOnly: false,\n\t\t},\n\t\t{\n\t\t\tPath:            \"/tmp/apt-key-gpghome\",\n\t\t\tPrefixMatchOnly: true,\n\t\t},\n\t}\n\n\toriginal := append([]IgnoreListEntry{}, ignorelist...)\n\tdefer func() { ignorelist = original }()\n\n\terr = InitIgnoreList()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tsort.Slice(expected, func(i, j int) bool {\n\t\treturn expected[i].Path < expected[j].Path\n\t})\n\tsort.Slice(ignorelist, func(i, j int) bool {\n\t\treturn ignorelist[i].Path < ignorelist[j].Path\n\t})\n\ttestutil.CheckDeepEqual(t, expected, ignorelist)\n}\n\nfunc Test_setFileTimes(t *testing.T) {\n\ttestDir := t.TempDir()\n\n\tp := filepath.Join(testDir, \"foo.txt\")\n\n\tif err := os.WriteFile(p, []byte(\"meow\"), 0o777); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\ttype testcase struct {\n\t\tdesc  string\n\t\tpath  string\n\t\taTime time.Time\n\t\tmTime time.Time\n\t}\n\n\ttestCases := []testcase{\n\t\t{\n\t\t\tdesc: \"zero for mod and access\",\n\t\t\tpath: p,\n\t\t},\n\t\t{\n\t\t\tdesc:  \"zero for mod\",\n\t\t\tpath:  p,\n\t\t\taTime: time.Now(),\n\t\t},\n\t\t{\n\t\t\tdesc:  \"zero for access\",\n\t\t\tpath:  p,\n\t\t\tmTime: time.Now(),\n\t\t},\n\t\t{\n\t\t\tdesc:  \"both non-zero\",\n\t\t\tpath:  p,\n\t\t\tmTime: time.Now(),\n\t\t\taTime: time.Now(),\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.desc, func(t *testing.T) {\n\t\t\terr := setFileTimes(tc.path, tc.aTime, tc.mTime)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"expected err to be nil not %s\", err)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/util/gcr_util.go",
    "content": "/*\nCopyright 2021 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage util\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n)\n\n// DockerConfLocation returns the file system location of the Docker\n// configuration file under the directory set in the DOCKER_CONFIG environment\n// variable.  If that variable is not set, it returns the OS-equivalent of\n// \"/kaniko/.docker/config.json\".\nfunc DockerConfLocation() string {\n\tconfigFile := \"config.json\"\n\tif dockerConfig := os.Getenv(\"DOCKER_CONFIG\"); dockerConfig != \"\" {\n\t\tfile, err := os.Stat(dockerConfig)\n\t\tif err == nil {\n\t\t\tif file.IsDir() {\n\t\t\t\treturn filepath.Join(dockerConfig, configFile)\n\t\t\t}\n\t\t} else {\n\t\t\tif os.IsNotExist(err) {\n\t\t\t\treturn string(os.PathSeparator) + filepath.Join(\"kaniko\", \".docker\", configFile)\n\t\t\t}\n\t\t}\n\t\treturn filepath.Clean(dockerConfig)\n\t}\n\treturn string(os.PathSeparator) + filepath.Join(\"kaniko\", \".docker\", configFile)\n}\n"
  },
  {
    "path": "pkg/util/gcr_util_test.go",
    "content": "/*\nCopyright 2021 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage util\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n)\n\nconst (\n\tDefaultKanikoDockerConfigJSON = \"/kaniko/.docker/config.json\"\n\tDockerConfigEnvKey            = \"DOCKER_CONFIG\"\n)\n\nfunc TestDockerConfLocationWithInvalidFileLocation(t *testing.T) {\n\toriginalDockerConfig := os.Getenv(DockerConfigEnvKey)\n\tif err := os.Unsetenv(DockerConfigEnvKey); err != nil {\n\t\tt.Fatalf(\"Failed to unset DOCKER_CONFIG: %v\", err)\n\t}\n\ttmpDir := t.TempDir()\n\trandom := \"fdgdsfrdfgdf-fdfsf-24dsgfd\" //replace with a really random string\n\tfile := filepath.Join(tmpDir, random)  // an random file name, shouldn't exist\n\tif err := os.Setenv(DockerConfigEnvKey, file); err != nil {\n\t\tt.Fatalf(\"Failed to unset DOCKER_CONFIG: %v\", err)\n\t}\n\tunset := DockerConfLocation()\n\t// as file doesn't point to a real file,  DockerConfLocation() should return the default kaniko path for config.json\n\tunsetExpected := DefaultKanikoDockerConfigJSON\n\tif unset != unsetExpected {\n\t\tt.Errorf(\"Unexpected default Docker configuration file location: expected:'%s' got:'%s'\", unsetExpected, unset)\n\t}\n\trestoreOriginalDockerConfigEnv(t, originalDockerConfig)\n}\n\nfunc TestDockerConfLocation(t *testing.T) {\n\toriginalDockerConfig := os.Getenv(DockerConfigEnvKey)\n\n\tif err := os.Unsetenv(DockerConfigEnvKey); err != nil {\n\t\tt.Fatalf(\"Failed to unset DOCKER_CONFIG: %v\", err)\n\t}\n\tunset := DockerConfLocation()\n\tunsetExpected := DefaultKanikoDockerConfigJSON // will fail on Windows\n\tif unset != unsetExpected {\n\t\tt.Errorf(\"Unexpected default Docker configuration file location: expected:'%s' got:'%s'\", unsetExpected, unset)\n\t}\n\ttmpDir := t.TempDir()\n\n\tdir := filepath.Join(tmpDir, \"/kaniko/.docker\")\n\tos.MkdirAll(dir, os.ModePerm)\n\tif err := os.Setenv(DockerConfigEnvKey, dir); err != nil {\n\t\tt.Fatalf(\"Failed to set DOCKER_CONFIG: %v\", err)\n\t}\n\tkanikoDefault := DockerConfLocation()\n\tkanikoDefaultExpected := filepath.Join(tmpDir, DefaultKanikoDockerConfigJSON) // will fail on Windows\n\tif kanikoDefault != kanikoDefaultExpected {\n\t\tt.Errorf(\"Unexpected kaniko default Docker conf file location: expected:'%s' got:'%s'\", kanikoDefaultExpected, kanikoDefault)\n\t}\n\n\tdifferentPath := t.TempDir()\n\tif err := os.Setenv(DockerConfigEnvKey, differentPath); err != nil {\n\t\tt.Fatalf(\"Failed to set DOCKER_CONFIG: %v\", err)\n\t}\n\tset := DockerConfLocation()\n\tsetExpected := filepath.Join(differentPath, \"config.json\") // will fail on Windows ?\n\tif set != setExpected {\n\t\tt.Errorf(\"Unexpected DOCKER_CONF-based file location: expected:'%s' got:'%s'\", setExpected, set)\n\t}\n\trestoreOriginalDockerConfigEnv(t, originalDockerConfig)\n}\n\nfunc restoreOriginalDockerConfigEnv(t *testing.T, originalDockerConfig string) {\n\tif originalDockerConfig != \"\" {\n\t\tif err := os.Setenv(DockerConfigEnvKey, originalDockerConfig); err != nil {\n\t\t\tt.Fatalf(\"Failed to set DOCKER_CONFIG back to original value '%s': %v\", originalDockerConfig, err)\n\t\t}\n\t} else {\n\t\tif err := os.Unsetenv(DockerConfigEnvKey); err != nil {\n\t\t\tt.Fatalf(\"Failed to unset DOCKER_CONFIG after testing: %v\", err)\n\t\t}\n\t}\n}\n\nfunc TestDockerConfLocationWithFileLocation(t *testing.T) {\n\toriginalDockerConfig := os.Getenv(DockerConfigEnvKey)\n\tif err := os.Unsetenv(DockerConfigEnvKey); err != nil {\n\t\tt.Fatalf(\"Failed to unset DOCKER_CONFIG: %v\", err)\n\t}\n\tfile, err := os.CreateTemp(\"\", \"docker.conf\")\n\tif err != nil {\n\t\tt.Fatalf(\"could not create temp file: %s\", err)\n\t}\n\tdefer os.Remove(file.Name())\n\tif err := os.Setenv(DockerConfigEnvKey, file.Name()); err != nil {\n\t\tt.Fatalf(\"Failed to unset DOCKER_CONFIG: %v\", err)\n\t}\n\tunset := DockerConfLocation()\n\tunsetExpected := file.Name()\n\tif unset != unsetExpected {\n\t\tt.Errorf(\"Unexpected default Docker configuration file location: expected:'%s' got:'%s'\", unsetExpected, unset)\n\t}\n\trestoreOriginalDockerConfigEnv(t, originalDockerConfig)\n}\n"
  },
  {
    "path": "pkg/util/groupids_cgo.go",
    "content": "//go:build (linux || darwin) && cgo\n// +build linux darwin\n// +build cgo\n\n/*\nCopyright 2020 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage util\n\nimport (\n\t\"os/user\"\n)\n\n// groupIDs returns all of the group ID's a user is a member of\nfunc groupIDs(u *user.User) ([]string, error) {\n\t// user can have no gid if it's a non existing user\n\tif u.Gid == \"\" {\n\t\treturn []string{}, nil\n\t}\n\treturn u.GroupIds()\n}\n"
  },
  {
    "path": "pkg/util/groupids_fallback.go",
    "content": "//go:build (linux || darwin) && !cgo\n// +build linux darwin\n// +build !cgo\n\n/*\nCopyright 2020 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage util\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"io\"\n\t\"os\"\n\t\"os/user\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n)\n\nvar groupFile = \"/etc/group\"\n\ntype group struct {\n\tid      string   // group ID\n\tname    string   // group name\n\tmembers []string // secondary group ids\n}\n\n// groupIDs returns all of the group ID's a user is a member of\nfunc groupIDs(u *user.User) ([]string, error) {\n\tlogrus.Infof(\"Performing slow lookup of group ids for %s\", u.Username)\n\n\t// user can have no gid if it's a non existing user\n\tif u.Gid == \"\" {\n\t\treturn []string{}, nil\n\t}\n\n\tf, err := os.Open(groupFile)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"open\")\n\t}\n\tdefer f.Close()\n\n\tgids := []string{u.Gid}\n\n\tfor _, g := range localGroups(f) {\n\t\tfor _, m := range g.members {\n\t\t\tif m == u.Username {\n\t\t\t\tgids = append(gids, g.id)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn gids, nil\n}\n\n// localGroups parses a reader in /etc/group form, returning parsed group data\n// based on src/os/user/lookup_unix.go - but extended to include secondary groups\nfunc localGroups(r io.Reader) []*group {\n\tvar groups []*group\n\n\tbs := bufio.NewScanner(r)\n\tfor bs.Scan() {\n\t\tline := bs.Bytes()\n\n\t\t// There's no spec for /etc/passwd or /etc/group, but we try to follow\n\t\t// the same rules as the glibc parser, which allows comments and blank\n\t\t// space at the beginning of a line.\n\t\tline = bytes.TrimSpace(line)\n\t\tif len(line) == 0 || line[0] == '#' {\n\t\t\tcontinue\n\t\t}\n\n\t\t// wheel:*:0:root,anotherGrp\n\t\tparts := strings.SplitN(string(line), \":\", 4)\n\t\tif _, err := strconv.Atoi(parts[2]); err != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tgroups = append(groups, &group{name: parts[0], id: parts[2], members: strings.Split(parts[3], \",\")})\n\t}\n\treturn groups\n}\n"
  },
  {
    "path": "pkg/util/proc/proc.go",
    "content": "/*\nCopyright 2022 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// Ported from https://github.com/genuinetools/bpfd/blob/a4bfa5e3e9d1bfdbc56268a36a0714911ae9b6bf/proc/proc.go\n\npackage proc\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"regexp\"\n\t\"strings\"\n)\n\n// ContainerRuntime is the type for the various container runtime strings.\ntype ContainerRuntime string\n\nconst (\n\t// RuntimeDocker is the string for the docker runtime.\n\tRuntimeDocker ContainerRuntime = \"docker\"\n\t// RuntimeRkt is the string for the rkt runtime.\n\tRuntimeRkt ContainerRuntime = \"rkt\"\n\t// RuntimeNspawn is the string for the systemd-nspawn runtime.\n\tRuntimeNspawn ContainerRuntime = \"systemd-nspawn\"\n\t// RuntimeLXC is the string for the lxc runtime.\n\tRuntimeLXC ContainerRuntime = \"lxc\"\n\t// RuntimeLXCLibvirt is the string for the lxc-libvirt runtime.\n\tRuntimeLXCLibvirt ContainerRuntime = \"lxc-libvirt\"\n\t// RuntimeOpenVZ is the string for the openvz runtime.\n\tRuntimeOpenVZ ContainerRuntime = \"openvz\"\n\t// RuntimeKubernetes is the string for the kubernetes runtime.\n\tRuntimeKubernetes ContainerRuntime = \"kube\"\n\t// RuntimeGarden is the string for the garden runtime.\n\tRuntimeGarden ContainerRuntime = \"garden\"\n\t// RuntimePodman is the string for the podman runtime.\n\tRuntimePodman ContainerRuntime = \"podman\"\n\t// RuntimeGVisor is the string for the gVisor (runsc) runtime.\n\tRuntimeGVisor ContainerRuntime = \"gvisor\"\n\t// RuntimeFirejail is the string for the firejail runtime.\n\tRuntimeFirejail ContainerRuntime = \"firejail\"\n\t// RuntimeWSL is the string for the Windows Subsystem for Linux runtime.\n\tRuntimeWSL ContainerRuntime = \"wsl\"\n\t// RuntimeNotFound is the string for when no container runtime is found.\n\tRuntimeNotFound ContainerRuntime = \"not-found\"\n)\n\nvar (\n\t// ContainerRuntimes contains all the container runtimes.\n\tContainerRuntimes = []ContainerRuntime{\n\t\tRuntimeDocker,\n\t\tRuntimeRkt,\n\t\tRuntimeNspawn,\n\t\tRuntimeLXC,\n\t\tRuntimeLXCLibvirt,\n\t\tRuntimeOpenVZ,\n\t\tRuntimeKubernetes,\n\t\tRuntimeGarden,\n\t\tRuntimePodman,\n\t\tRuntimeGVisor,\n\t\tRuntimeFirejail,\n\t\tRuntimeWSL,\n\t}\n)\n\n// GetContainerRuntime returns the container runtime the process is running in.\n// If pid is less than one, it returns the runtime for \"self\".\nfunc GetContainerRuntime(tgid, pid int) ContainerRuntime {\n\tfile := \"/proc/self/cgroup\"\n\tif pid > 0 {\n\t\tif tgid > 0 {\n\t\t\tfile = fmt.Sprintf(\"/proc/%d/task/%d/cgroup\", tgid, pid)\n\t\t} else {\n\t\t\tfile = fmt.Sprintf(\"/proc/%d/cgroup\", pid)\n\t\t}\n\t}\n\n\t// read the cgroups file\n\ta := readFileString(file)\n\truntime := getContainerRuntime(a)\n\tif runtime != RuntimeNotFound {\n\t\treturn runtime\n\t}\n\n\t// /proc/vz exists in container and outside of the container, /proc/bc only outside of the container.\n\tif osFileExists(\"/proc/vz\") && !osFileExists(\"/proc/bc\") {\n\t\treturn RuntimeOpenVZ\n\t}\n\n\t// /__runsc_containers__ directory is present in gVisor containers.\n\tif osFileExists(\"/__runsc_containers__\") {\n\t\treturn RuntimeGVisor\n\t}\n\n\t// firejail runs with `firejail` as pid 1.\n\t// As firejail binary cannot be run with argv[0] != \"firejail\"\n\t// it's okay to rely on cmdline.\n\ta = readFileString(\"/proc/1/cmdline\")\n\truntime = getContainerRuntime(a)\n\tif runtime != RuntimeNotFound {\n\t\treturn runtime\n\t}\n\n\t// WSL has /proc/version_signature starting with \"Microsoft\".\n\ta = readFileString(\"/proc/version_signature\")\n\tif strings.HasPrefix(a, \"Microsoft\") {\n\t\treturn RuntimeWSL\n\t}\n\n\ta = os.Getenv(\"container\")\n\truntime = getContainerRuntime(a)\n\tif runtime != RuntimeNotFound {\n\t\treturn runtime\n\t}\n\n\t// PID 1 might have dropped this information into a file in /run.\n\t// Read from /run/systemd/container since it is better than accessing /proc/1/environ,\n\t// which needs CAP_SYS_PTRACE\n\ta = readFileString(\"/run/systemd/container\")\n\truntime = getContainerRuntime(a)\n\tif runtime != RuntimeNotFound {\n\t\treturn runtime\n\t}\n\n\t// Check for container specific files\n\truntime = detectContainerFiles()\n\tif runtime != RuntimeNotFound {\n\t\treturn runtime\n\t}\n\n\t// Docker was not detected at this point.\n\t// An overlay mount on \"/\" may indicate we're under containerd or other runtime.\n\ta = readFileString(\"/proc/mounts\")\n\tif m, _ := regexp.MatchString(\"^[^ ]+ / overlay\", a); m {\n\t\treturn RuntimeKubernetes\n\t}\n\n\treturn RuntimeNotFound\n}\n\n// Related implementation: https://github.com/systemd/systemd/blob/6604fb0207ee10e8dc05d67f6fe45de0b193b5c4/src/basic/virt.c#L523-L549\nfunc detectContainerFiles() ContainerRuntime {\n\tfiles := []struct {\n\t\truntime  ContainerRuntime\n\t\tlocation string\n\t}{\n\t\t// https://github.com/containers/podman/issues/6192\n\t\t// https://github.com/containers/podman/issues/3586#issuecomment-661918679\n\t\t{RuntimePodman, \"/run/.containerenv\"},\n\t\t// https://github.com/moby/moby/issues/18355\n\t\t{RuntimeDocker, \"/.dockerenv\"},\n\t\t// Detect the presence of a serviceaccount secret mounted in the default location\n\t\t{RuntimeKubernetes, \"/var/run/secrets/kubernetes.io/serviceaccount\"},\n\t}\n\n\tfor i := range files {\n\t\tif osFileExists(files[i].location) {\n\t\t\treturn files[i].runtime\n\t\t}\n\t}\n\n\treturn RuntimeNotFound\n}\n\nfunc getContainerRuntime(input string) ContainerRuntime {\n\tif len(strings.TrimSpace(input)) < 1 {\n\t\treturn RuntimeNotFound\n\t}\n\n\tfor _, runtime := range ContainerRuntimes {\n\t\tif strings.Contains(input, string(runtime)) {\n\t\t\treturn runtime\n\t\t}\n\t}\n\n\treturn RuntimeNotFound\n}\n\nfunc osFileExists(file string) bool {\n\tif _, err := os.Stat(file); !os.IsNotExist(err) {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc readFile(file string) []byte {\n\tif !osFileExists(file) {\n\t\treturn nil\n\t}\n\n\tb, _ := os.ReadFile(file)\n\treturn b\n}\n\nfunc readFileString(file string) string {\n\tb := readFile(file)\n\tif b == nil {\n\t\treturn \"\"\n\t}\n\treturn strings.TrimSpace(string(b))\n}\n"
  },
  {
    "path": "pkg/util/proc/proc_test.go",
    "content": "/*\nCopyright 2022 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage proc\n\nimport (\n\t\"testing\"\n)\n\nfunc TestGetContainerRuntime(t *testing.T) {\n\ttestcases := map[string]struct {\n\t\texpectedRuntime ContainerRuntime\n\t\tinput           string\n\t}{\n\t\t\"empty\": {\n\t\t\texpectedRuntime: RuntimeNotFound,\n\t\t},\n\t\t\"typical docker\": {\n\t\t\texpectedRuntime: RuntimeDocker,\n\t\t\tinput: `11:pids:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac\n10:devices:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac\n9:freezer:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac\n8:net_cls,net_prio:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac\n7:perf_event:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac\n6:cpuset:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac\n5:memory:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac\n4:blkio:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac\n3:cpu,cpuacct:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac\n2:hugetlb:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac\n1:name=systemd:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac\n0::/system.slice/containerd.service`,\n\t\t},\n\t\t\"uncontainerized process\": {\n\t\t\texpectedRuntime: RuntimeNotFound,\n\t\t\tinput: `11:pids:/system.slice/ssh.service\n10:devices:/system.slice/ssh.service\n9:freezer:/\n8:net_cls,net_prio:/\n7:perf_event:/\n6:cpuset:/\n5:memory:/system.slice/ssh.service\n4:blkio:/system.slice/ssh.service\n3:cpu,cpuacct:/system.slice/ssh.service\n2:hugetlb:/\n1:name=systemd:/system.slice/ssh.service\n0::/system.slice/ssh.service`,\n\t\t},\n\t\t\"kubernetes\": {\n\t\t\texpectedRuntime: RuntimeKubernetes,\n\t\t\tinput: `12:perf_event:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47\n11:freezer:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47\n10:pids:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47\n9:net_cls,net_prio:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47\n8:memory:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47\n7:cpuset:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47\n6:devices:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47\n5:blkio:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47\n4:rdma:/\n3:hugetlb:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47\n2:cpu,cpuacct:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47\n1:name=systemd:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47`,\n\t\t},\n\t\t\"lxc\": {\n\t\t\texpectedRuntime: RuntimeLXC, // this is usually in $container for lxc\n\t\t\tinput: `10:cpuset:/lxc/debian2\n9:pids:/lxc/debian2\n8:devices:/lxc/debian2\n7:net_cls,net_prio:/lxc/debian2\n6:freezer:/lxc/debian2\n5:blkio:/lxc/debian2\n4:memory:/lxc/debian2\n3:cpu,cpuacct:/lxc/debian2\n2:perf_event:/lxc/debian2\n1:name=systemd:/lxc/debian2`,\n\t\t},\n\t\t\"nspawn\": {\n\t\t\texpectedRuntime: RuntimeNotFound, // since this variable is in $container\n\t\t\tinput: `10:cpuset:/\n9:pids:/machine.slice/machine-nspawntest.scope\n8:devices:/machine.slice/machine-nspawntest.scope\n7:net_cls,net_prio:/\n6:freezer:/user/root/0\n5:blkio:/machine.slice/machine-nspawntest.scope\n4:memory:/machine.slice/machine-nspawntest.scope\n3:cpu,cpuacct:/machine.slice/machine-nspawntest.scope\n2:perf_event:/\n1:name=systemd:/machine.slice/machine-nspawntest.scope`,\n\t\t},\n\t\t\"rkt\": {\n\t\t\texpectedRuntime: RuntimeRkt,\n\t\t\tinput: `10:cpuset:/\n9:pids:/machine.slice/machine-rkt\\x2dbfb7d57e\\x2d80ff\\x2d4ef8\\x2db602\\x2d9b907b3f3a38.scope/system.slice/debian.service\n8:devices:/machine.slice/machine-rkt\\x2dbfb7d57e\\x2d80ff\\x2d4ef8\\x2db602\\x2d9b907b3f3a38.scope/system.slice/debian.service\n7:net_cls,net_prio:/\n6:freezer:/user/root/0\n5:blkio:/machine.slice/machine-rkt\\x2dbfb7d57e\\x2d80ff\\x2d4ef8\\x2db602\\x2d9b907b3f3a38.scope/system.slice\n4:memory:/machine.slice/machine-rkt\\x2dbfb7d57e\\x2d80ff\\x2d4ef8\\x2db602\\x2d9b907b3f3a38.scope/system.slice\n3:cpu,cpuacct:/machine.slice/machine-rkt\\x2dbfb7d57e\\x2d80ff\\x2d4ef8\\x2db602\\x2d9b907b3f3a38.scope/system.slice\n2:perf_event:/\n1:name=systemd:/machine.slice/machine-rkt\\x2dbfb7d57e\\x2d80ff\\x2d4ef8\\x2db602\\x2d9b907b3f3a38.scope/system.slice/debian.service`,\n\t\t},\n\t\t\"rkt host\": {\n\t\t\texpectedRuntime: RuntimeRkt,\n\t\t\tinput: `10:cpuset:/\n9:pids:/machine.slice/machine-rkt\\x2dbfb7d57e\\x2d80ff\\x2d4ef8\\x2db602\\x2d9b907b3f3a38.scope/system.slice/debian.service\n8:devices:/machine.slice/machine-rkt\\x2dbfb7d57e\\x2d80ff\\x2d4ef8\\x2db602\\x2d9b907b3f3a38.scope/system.slice/debian.service\n7:net_cls,net_prio:/\n6:freezer:/user/root/0\n5:blkio:/machine.slice/machine-rkt\\x2dbfb7d57e\\x2d80ff\\x2d4ef8\\x2db602\\x2d9b907b3f3a38.scope/system.slice\n4:memory:/machine.slice/machine-rkt\\x2dbfb7d57e\\x2d80ff\\x2d4ef8\\x2db602\\x2d9b907b3f3a38.scope/system.slice\n3:cpu,cpuacct:/machine.slice/machine-rkt\\x2dbfb7d57e\\x2d80ff\\x2d4ef8\\x2db602\\x2d9b907b3f3a38.scope/system.slice\n2:perf_event:/\n1:name=systemd:/machine.slice/machine-rkt\\x2dbfb7d57e\\x2d80ff\\x2d4ef8\\x2db602\\x2d9b907b3f3a38.scope/system.slice/debian.service`,\n\t\t},\n\t}\n\n\tfor key, tc := range testcases {\n\t\truntime := getContainerRuntime(tc.input)\n\t\tif runtime != tc.expectedRuntime {\n\t\t\tt.Errorf(\"[%s]: expected runtime %q, got %q\", key, tc.expectedRuntime, runtime)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/util/syscall_credentials.go",
    "content": "/*\nCopyright 2020 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage util\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\t\"syscall\"\n\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n)\n\nfunc SyscallCredentials(userStr string) (*syscall.Credential, error) {\n\tuid, gid, err := getUIDAndGIDFromString(userStr)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"get uid/gid\")\n\t}\n\n\tu, err := LookupUser(fmt.Sprint(uid))\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"lookup\")\n\t}\n\tlogrus.Infof(\"Util.Lookup returned: %+v\", u)\n\n\t// initiliaze empty\n\tgroups := []uint32{}\n\n\tgidStr, err := groupIDs(u)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"group ids for user\")\n\t}\n\n\tfor _, g := range gidStr {\n\t\ti, err := strconv.ParseUint(g, 10, 32)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrap(err, \"parseuint\")\n\t\t}\n\n\t\tgroups = append(groups, uint32(i))\n\t}\n\n\tif !(len(strings.Split(userStr, \":\")) > 1) {\n\t\tif u.Gid != \"\" {\n\t\t\tgid, _ = getGID(u.Gid)\n\t\t}\n\t}\n\n\treturn &syscall.Credential{\n\t\tUid:    uid,\n\t\tGid:    gid,\n\t\tGroups: groups,\n\t}, nil\n}\n"
  },
  {
    "path": "pkg/util/syscall_credentials_test.go",
    "content": "/*\nCopyright 2020 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage util\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"syscall\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n)\n\nfunc TestSyscallCredentials(t *testing.T) {\n\tcurrentUser := testutil.GetCurrentUser(t)\n\tuid, _ := strconv.ParseUint(currentUser.Uid, 10, 32)\n\tcurrentUserUID32 := uint32(uid)\n\tgid, _ := strconv.ParseUint(currentUser.Gid, 10, 32)\n\tcurrentUserGID32 := uint32(gid)\n\n\tcurrentUserGroupIDsU32 := []uint32{}\n\tcurrentUserGroupIDs, _ := currentUser.GroupIds()\n\tfor _, id := range currentUserGroupIDs {\n\t\tid32, _ := strconv.ParseUint(id, 10, 32)\n\t\tcurrentUserGroupIDsU32 = append(currentUserGroupIDsU32, uint32(id32))\n\t}\n\n\ttype args struct {\n\t\tuserStr string\n\t}\n\ttests := []struct {\n\t\tname    string\n\t\targs    args\n\t\twant    *syscall.Credential\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname: \"non-existing user without group\",\n\t\t\targs: args{\n\t\t\t\tuserStr: \"helloworld-user\",\n\t\t\t},\n\t\t\twantErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"non-existing uid without group\",\n\t\t\targs: args{\n\t\t\t\tuserStr: \"50000\",\n\t\t\t},\n\t\t\twant: &syscall.Credential{\n\t\t\t\tUid: 50000,\n\t\t\t\t// because fallback is enabled\n\t\t\t\tGid:    50000,\n\t\t\t\tGroups: []uint32{},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"non-existing uid with existing gid\",\n\t\t\targs: args{\n\t\t\t\tuserStr: fmt.Sprintf(\"50000:%d\", currentUserGID32),\n\t\t\t},\n\t\t\twant: &syscall.Credential{\n\t\t\t\tUid:    50000,\n\t\t\t\tGid:    currentUserGID32,\n\t\t\t\tGroups: []uint32{},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"existing username with non-existing gid\",\n\t\t\targs: args{\n\t\t\t\tuserStr: fmt.Sprintf(\"%s:50000\", currentUser.Username),\n\t\t\t},\n\t\t\twant: &syscall.Credential{\n\t\t\t\tUid:    currentUserUID32,\n\t\t\t\tGid:    50000,\n\t\t\t\tGroups: currentUserGroupIDsU32,\n\t\t\t},\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgot, err := SyscallCredentials(tt.args.userStr)\n\t\t\ttestutil.CheckErrorAndDeepEqual(t, tt.wantErr, err, tt.want, got)\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "pkg/util/tar_util.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage util\n\nimport (\n\t\"archive/tar\"\n\t\"compress/bzip2\"\n\t\"compress/gzip\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"syscall\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/docker/docker/pkg/archive\"\n\t\"github.com/docker/docker/pkg/system\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n)\n\n// Tar knows how to write files to a tar file.\ntype Tar struct {\n\thardlinks map[uint64]string\n\tw         *tar.Writer\n}\n\n// NewTar will create an instance of Tar that can write files to the writer at f.\nfunc NewTar(f io.Writer) Tar {\n\tw := tar.NewWriter(f)\n\treturn Tar{\n\t\tw:         w,\n\t\thardlinks: map[uint64]string{},\n\t}\n}\n\nfunc CreateTarballOfDirectory(pathToDir string, f io.Writer) error {\n\tif !filepath.IsAbs(pathToDir) {\n\t\treturn errors.New(\"pathToDir is not absolute\")\n\t}\n\ttarWriter := NewTar(f)\n\tdefer tarWriter.Close()\n\n\twalkFn := func(path string, d fs.DirEntry, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif !filepath.IsAbs(path) {\n\t\t\treturn fmt.Errorf(\"path %v is not absolute, cant read file\", path)\n\t\t}\n\t\treturn tarWriter.AddFileToTar(path)\n\t}\n\n\treturn filepath.WalkDir(pathToDir, walkFn)\n}\n\n// Close will close any open streams used by Tar.\nfunc (t *Tar) Close() {\n\tt.w.Close()\n}\n\n// AddFileToTar adds the file at path p to the tar\nfunc (t *Tar) AddFileToTar(p string) error {\n\ti, err := os.Lstat(p)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"Failed to get file info for %s: %w\", p, err)\n\t}\n\tlinkDst := \"\"\n\tif i.Mode()&os.ModeSymlink != 0 {\n\t\tvar err error\n\t\tlinkDst, err = os.Readlink(p)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif i.Mode()&os.ModeSocket != 0 {\n\t\tlogrus.Infof(\"Ignoring socket %s, not adding to tar\", i.Name())\n\t\treturn nil\n\t}\n\thdr, err := tar.FileInfoHeader(i, linkDst)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = readSecurityXattrToTarHeader(p, hdr)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif p == config.RootDir {\n\t\t// allow entry for / to preserve permission changes etc. (currently ignored anyway by Docker runtime)\n\t\thdr.Name = \"/\"\n\t} else {\n\t\t// Docker uses no leading / in the tarball\n\t\thdr.Name = strings.TrimPrefix(p, config.RootDir)\n\t\thdr.Name = strings.TrimLeft(hdr.Name, \"/\")\n\t}\n\tif hdr.Typeflag == tar.TypeDir && !strings.HasSuffix(hdr.Name, \"/\") {\n\t\thdr.Name = hdr.Name + \"/\"\n\t}\n\t// rootfs may not have been extracted when using cache, preventing uname/gname from resolving\n\t// this makes this layer unnecessarily differ from a cached layer which does contain this information\n\thdr.Uname = \"\"\n\thdr.Gname = \"\"\n\t// use PAX format to preserve accurate mtime (match Docker behavior)\n\thdr.Format = tar.FormatPAX\n\n\thardlink, linkDst := t.checkHardlink(p, i)\n\tif hardlink {\n\t\thdr.Linkname = linkDst\n\t\thdr.Typeflag = tar.TypeLink\n\t\thdr.Size = 0\n\t}\n\tif err := t.w.WriteHeader(hdr); err != nil {\n\t\treturn err\n\t}\n\tif !(i.Mode().IsRegular()) || hardlink {\n\t\treturn nil\n\t}\n\tr, err := os.Open(p)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer r.Close()\n\tif _, err := io.Copy(t.w, r); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nconst (\n\tsecurityCapabilityXattr = \"security.capability\"\n)\n\n// writeSecurityXattrToTarFile writes security.capability\n// xattrs from a tar header to filesystem\nfunc writeSecurityXattrToTarFile(path string, hdr *tar.Header) error {\n\tif hdr.Xattrs == nil {\n\t\treturn nil\n\t}\n\tif capability, ok := hdr.Xattrs[securityCapabilityXattr]; ok {\n\t\terr := system.Lsetxattr(path, securityCapabilityXattr, []byte(capability), 0)\n\t\tif err != nil && !errors.Is(err, syscall.EOPNOTSUPP) && !errors.Is(err, system.ErrNotSupportedPlatform) {\n\t\t\treturn errors.Wrapf(err, \"failed to write %q attribute to %q\", securityCapabilityXattr, path)\n\t\t}\n\t}\n\treturn nil\n}\n\n// readSecurityXattrToTarHeader reads security.capability\n// xattrs from filesystem to a tar header\nfunc readSecurityXattrToTarHeader(path string, hdr *tar.Header) error {\n\tif hdr.Xattrs == nil {\n\t\thdr.Xattrs = make(map[string]string)\n\t}\n\tcapability, err := system.Lgetxattr(path, securityCapabilityXattr)\n\tif err != nil && !errors.Is(err, syscall.EOPNOTSUPP) && !errors.Is(err, system.ErrNotSupportedPlatform) {\n\t\treturn errors.Wrapf(err, \"failed to read %q attribute from %q\", securityCapabilityXattr, path)\n\t}\n\tif capability != nil {\n\t\thdr.Xattrs[securityCapabilityXattr] = string(capability)\n\t}\n\treturn nil\n}\n\nfunc (t *Tar) Whiteout(p string) error {\n\tdir := filepath.Dir(p)\n\tname := archive.WhiteoutPrefix + filepath.Base(p)\n\n\tth := &tar.Header{\n\t\t// Docker uses no leading / in the tarball\n\t\tName: strings.TrimLeft(filepath.Join(dir, name), \"/\"),\n\t\tSize: 0,\n\t}\n\tif err := t.w.WriteHeader(th); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// Returns true if path is hardlink, and the link destination\nfunc (t *Tar) checkHardlink(p string, i os.FileInfo) (bool, string) {\n\thardlink := false\n\tlinkDst := \"\"\n\tstat := getSyscallStatT(i)\n\tif stat != nil {\n\t\tnlinks := stat.Nlink\n\t\tif nlinks > 1 {\n\t\t\tinode := stat.Ino\n\t\t\tif original, exists := t.hardlinks[inode]; exists && original != p {\n\t\t\t\thardlink = true\n\t\t\t\tlogrus.Debugf(\"%s inode exists in hardlinks map, linking to %s\", p, original)\n\t\t\t\tlinkDst = original\n\t\t\t} else {\n\t\t\t\tt.hardlinks[inode] = p\n\t\t\t}\n\t\t}\n\t}\n\treturn hardlink, linkDst\n}\n\nfunc getSyscallStatT(i os.FileInfo) *syscall.Stat_t {\n\tif sys := i.Sys(); sys != nil {\n\t\tif stat, ok := sys.(*syscall.Stat_t); ok {\n\t\t\treturn stat\n\t\t}\n\t}\n\treturn nil\n}\n\n// UnpackLocalTarArchive unpacks the tar archive at path to the directory dest\n// Returns the files extracted from the tar archive\nfunc UnpackLocalTarArchive(path, dest string) ([]string, error) {\n\t// First, we need to check if the path is a local tar archive\n\tif compressed, compressionLevel := fileIsCompressedTar(path); compressed {\n\t\tfile, err := os.Open(path)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tdefer file.Close()\n\t\tif compressionLevel == archive.Gzip {\n\t\t\tgzr, err := gzip.NewReader(file)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tdefer gzr.Close()\n\t\t\treturn UnTar(gzr, dest)\n\t\t} else if compressionLevel == archive.Bzip2 {\n\t\t\tbzr := bzip2.NewReader(file)\n\t\t\treturn UnTar(bzr, dest)\n\t\t}\n\t}\n\tif fileIsUncompressedTar(path) {\n\t\tfile, err := os.Open(path)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tdefer file.Close()\n\t\treturn UnTar(file, dest)\n\t}\n\treturn nil, errors.New(\"path does not lead to local tar archive\")\n}\n\n// IsFileLocalTarArchive returns true if the file is a local tar archive\nfunc IsFileLocalTarArchive(src string) bool {\n\tcompressed, _ := fileIsCompressedTar(src)\n\tuncompressed := fileIsUncompressedTar(src)\n\treturn compressed || uncompressed\n}\n\nfunc fileIsCompressedTar(src string) (bool, archive.Compression) {\n\tr, err := os.Open(src)\n\tif err != nil {\n\t\treturn false, -1\n\t}\n\tdefer r.Close()\n\tbuf, err := io.ReadAll(r)\n\tif err != nil {\n\t\treturn false, -1\n\t}\n\tcompressionLevel := archive.DetectCompression(buf)\n\treturn (compressionLevel > 0), compressionLevel\n}\n\nfunc fileIsUncompressedTar(src string) bool {\n\tr, err := os.Open(src)\n\tif err != nil {\n\t\treturn false\n\t}\n\tdefer r.Close()\n\tfi, err := os.Lstat(src)\n\tif err != nil {\n\t\treturn false\n\t}\n\tif fi.Size() == 0 {\n\t\treturn false\n\t}\n\ttr := tar.NewReader(r)\n\tif tr == nil {\n\t\treturn false\n\t}\n\t_, err = tr.Next()\n\treturn err == nil\n}\n\n// UnpackCompressedTar unpacks the compressed tar at path to dir\nfunc UnpackCompressedTar(path, dir string) error {\n\tfile, err := os.Open(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer file.Close()\n\tgzr, err := gzip.NewReader(file)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer gzr.Close()\n\t_, err = UnTar(gzr, dir)\n\treturn err\n}\n"
  },
  {
    "path": "pkg/util/tar_util_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage util\n\nimport (\n\t\"archive/tar\"\n\t\"bytes\"\n\t\"compress/gzip\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n)\n\nvar regularFiles = []string{\"file\", \"file.tar\", \"file.tar.gz\"}\nvar uncompressedTars = []string{\"uncompressed\", \"uncompressed.tar\"}\nvar compressedTars = []string{\"compressed\", \"compressed.tar.gz\"}\n\nfunc Test_IsLocalTarArchive(t *testing.T) {\n\ttestDir := t.TempDir()\n\tif err := setUpFilesAndTars(testDir); err != nil {\n\t\tt.Fatal(err)\n\t}\n\t// Test we get the correct result for regular files\n\tfor _, regularFile := range regularFiles {\n\t\tisTarArchive := IsFileLocalTarArchive(filepath.Join(testDir, regularFile))\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, nil, false, isTarArchive)\n\t}\n\t// Test we get the correct result for uncompressed tars\n\tfor _, uncompressedTar := range uncompressedTars {\n\t\tisTarArchive := IsFileLocalTarArchive(filepath.Join(testDir, uncompressedTar))\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, nil, true, isTarArchive)\n\t}\n\t// Test we get the correct result for compressed tars\n\tfor _, compressedTar := range compressedTars {\n\t\tisTarArchive := IsFileLocalTarArchive(filepath.Join(testDir, compressedTar))\n\t\ttestutil.CheckErrorAndDeepEqual(t, false, nil, true, isTarArchive)\n\t}\n}\n\nfunc Test_AddFileToTar(t *testing.T) {\n\ttestDir := t.TempDir()\n\n\tpath := filepath.Join(testDir, regularFiles[0])\n\tif err := os.WriteFile(path, []byte(\"hello\"), os.ModePerm); err != nil {\n\t\tt.Fatal(err)\n\t}\n\t// use a pre-determined time with non-zero microseconds to avoid flakiness\n\tmtime := time.UnixMicro(1635533172891395)\n\tif err := os.Chtimes(path, mtime, mtime); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tbuf := new(bytes.Buffer)\n\ttarw := NewTar(buf)\n\tif err := tarw.AddFileToTar(path); err != nil {\n\t\tt.Fatal(err)\n\t}\n\ttarw.Close()\n\n\t// Check that the mtime is correct (#1808)\n\ttarReader := tar.NewReader(buf)\n\thdr, err := tarReader.Next()\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\ttestutil.CheckDeepEqual(t, mtime, hdr.ModTime)\n}\n\nfunc setUpFilesAndTars(testDir string) error {\n\tregularFilesAndContents := map[string]string{\n\t\tregularFiles[0]: \"\",\n\t\tregularFiles[1]: \"something\",\n\t\tregularFiles[2]: \"here\",\n\t}\n\tif err := testutil.SetupFiles(testDir, regularFilesAndContents); err != nil {\n\t\treturn err\n\t}\n\n\tfor _, uncompressedTar := range uncompressedTars {\n\t\ttarFile, err := os.Create(filepath.Join(testDir, uncompressedTar))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := createTar(testDir, tarFile); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tfor _, compressedTar := range compressedTars {\n\t\ttarFile, err := os.Create(filepath.Join(testDir, compressedTar))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tgzr := gzip.NewWriter(tarFile)\n\t\tif err := createTar(testDir, gzr); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc createTar(testdir string, writer io.Writer) error {\n\tt := NewTar(writer)\n\tdefer t.Close()\n\tfor _, regFile := range regularFiles {\n\t\tfilePath := filepath.Join(testdir, regFile)\n\t\tif err := t.AddFileToTar(filePath); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc Test_CreateTarballOfDirectory(t *testing.T) {\n\ttmpDir := t.TempDir()\n\twantErr := false\n\tcreateFilesInTempDir(t, tmpDir)\n\tf := &bytes.Buffer{}\n\terr := CreateTarballOfDirectory(tmpDir, f)\n\ttestutil.CheckError(t, wantErr, err)\n\n\textracedFilesDir := filepath.Join(tmpDir, \"extracted\")\n\terr = os.Mkdir(extracedFilesDir, 0755)\n\tif err != nil {\n\t\tt.Error(err)\n\t\treturn\n\t}\n\tfiles, err := UnTar(f, extracedFilesDir)\n\ttestutil.CheckError(t, wantErr, err)\n\tfor _, filePath := range files {\n\t\tfileInfo, err := os.Lstat(filePath)\n\t\ttestutil.CheckError(t, wantErr, err)\n\t\tif fileInfo.IsDir() {\n\t\t\t// skip directory\n\t\t\tcontinue\n\t\t}\n\t\tfile, err := os.Open(filePath)\n\t\ttestutil.CheckError(t, wantErr, err)\n\t\tbody, err := io.ReadAll(file)\n\t\ttestutil.CheckError(t, wantErr, err)\n\t\tindex := filepath.Base(filePath)\n\t\ttestutil.CheckDeepEqual(t, string(body), fmt.Sprintf(\"hello from %s\\n\", index))\n\t}\n}\n\nfunc createFilesInTempDir(t *testing.T, tmpDir string) {\n\tfor i := 0; i < 2; i++ {\n\t\tfName := filepath.Join(tmpDir, fmt.Sprint(i))\n\t\tcontent := fmt.Sprintf(\"hello from %d\\n\", i)\n\t\tif err := os.WriteFile(fName, []byte(content), 0666); err != nil {\n\t\t\tt.Error(err)\n\t\t\treturn\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "pkg/util/transport_util.go",
    "content": "/*\nCopyright 2020 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage util\n\nimport (\n\t\"crypto/tls\"\n\t\"crypto/x509\"\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\n\t\"net/http\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n\t\"github.com/sirupsen/logrus\"\n)\n\ntype CertPool interface {\n\tvalue() *x509.CertPool\n\tappend(path string) error\n}\n\ntype X509CertPool struct {\n\tinner x509.CertPool\n}\n\nfunc (p *X509CertPool) value() *x509.CertPool {\n\treturn &p.inner\n}\n\nfunc (p *X509CertPool) append(path string) error {\n\tpem, err := os.ReadFile(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\tp.inner.AppendCertsFromPEM(pem)\n\treturn nil\n}\n\nvar systemCertLoader CertPool\n\ntype KeyPairLoader interface {\n\tload(string, string) (tls.Certificate, error)\n}\n\ntype X509KeyPairLoader struct {\n}\n\nfunc (p *X509KeyPairLoader) load(certFile, keyFile string) (tls.Certificate, error) {\n\treturn tls.LoadX509KeyPair(certFile, keyFile)\n}\n\nvar systemKeyPairLoader KeyPairLoader\n\nfunc init() {\n\tsystemCertPool, err := x509.SystemCertPool()\n\tif err != nil {\n\t\tlogrus.Warn(\"Failed to load system cert pool. Loading empty one instead.\")\n\t\tsystemCertPool = x509.NewCertPool()\n\t}\n\tsystemCertLoader = &X509CertPool{\n\t\tinner: *systemCertPool,\n\t}\n\n\tsystemKeyPairLoader = &X509KeyPairLoader{}\n}\n\nfunc MakeTransport(opts config.RegistryOptions, registryName string) (http.RoundTripper, error) {\n\t// Create a transport to set our user-agent.\n\tvar tr http.RoundTripper = http.DefaultTransport.(*http.Transport).Clone()\n\tif opts.SkipTLSVerify || opts.SkipTLSVerifyRegistries.Contains(registryName) {\n\t\ttr.(*http.Transport).TLSClientConfig = &tls.Config{\n\t\t\tInsecureSkipVerify: true,\n\t\t}\n\t} else if certificatePath := opts.RegistriesCertificates[registryName]; certificatePath != \"\" {\n\t\tif err := systemCertLoader.append(certificatePath); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to load certificate %s for %s: %w\", certificatePath, registryName, err)\n\t\t}\n\t\ttr.(*http.Transport).TLSClientConfig = &tls.Config{\n\t\t\tRootCAs: systemCertLoader.value(),\n\t\t}\n\t}\n\n\tif clientCertificatePath := opts.RegistriesClientCertificates[registryName]; clientCertificatePath != \"\" {\n\t\tcertFiles := strings.Split(clientCertificatePath, \",\")\n\t\tif len(certFiles) != 2 {\n\t\t\treturn nil, fmt.Errorf(\"failed to load client certificate/key '%s=%s', expected format: %s=/path/to/cert,/path/to/key\", registryName, clientCertificatePath, registryName)\n\t\t}\n\t\tcert, err := systemKeyPairLoader.load(certFiles[0], certFiles[1])\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to load client certificate/key '%s' for %s: %w\", clientCertificatePath, registryName, err)\n\t\t}\n\t\ttr.(*http.Transport).TLSClientConfig.Certificates = []tls.Certificate{cert}\n\t}\n\n\treturn tr, nil\n}\n"
  },
  {
    "path": "pkg/util/transport_util_test.go",
    "content": "/*\nCopyright 2020 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage util\n\nimport (\n\t\"crypto/tls\"\n\t\"crypto/x509\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/pkg/config\"\n)\n\ntype mockedCertPool struct {\n\tcertificatesPath []string\n}\n\nfunc (m *mockedCertPool) value() *x509.CertPool {\n\treturn &x509.CertPool{}\n}\n\nfunc (m *mockedCertPool) append(path string) error {\n\tm.certificatesPath = append(m.certificatesPath, path)\n\treturn nil\n}\n\ntype mockedKeyPairLoader struct {\n}\n\nfunc (p *mockedKeyPairLoader) load(certFile, keyFile string) (tls.Certificate, error) {\n\tfoo := tls.Certificate{}\n\treturn foo, nil\n}\n\nfunc Test_makeTransport(t *testing.T) {\n\tregistryName := \"my.registry.name\"\n\n\ttests := []struct {\n\t\tname  string\n\t\topts  config.RegistryOptions\n\t\tcheck func(*tls.Config, *mockedCertPool, error)\n\t}{\n\t\t{\n\t\t\tname: \"SkipTLSVerify set\",\n\t\t\topts: config.RegistryOptions{SkipTLSVerify: true},\n\t\t\tcheck: func(config *tls.Config, pool *mockedCertPool, err error) {\n\t\t\t\tif !config.InsecureSkipVerify {\n\t\t\t\t\tt.Errorf(\"makeTransport().TLSClientConfig.InsecureSkipVerify not set while SkipTLSVerify set\")\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"SkipTLSVerifyRegistries set with expected registry\",\n\t\t\topts: config.RegistryOptions{SkipTLSVerifyRegistries: []string{registryName}},\n\t\t\tcheck: func(config *tls.Config, pool *mockedCertPool, err error) {\n\t\t\t\tif !config.InsecureSkipVerify {\n\t\t\t\t\tt.Errorf(\"makeTransport().TLSClientConfig.InsecureSkipVerify not set while SkipTLSVerifyRegistries set with registry name\")\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"SkipTLSVerifyRegistries set with other registry\",\n\t\t\topts: config.RegistryOptions{SkipTLSVerifyRegistries: []string{fmt.Sprintf(\"other.%s\", registryName)}},\n\t\t\tcheck: func(config *tls.Config, pool *mockedCertPool, err error) {\n\t\t\t\tif config.InsecureSkipVerify {\n\t\t\t\t\tt.Errorf(\"makeTransport().TLSClientConfig.InsecureSkipVerify set while SkipTLSVerifyRegistries not set with registry name\")\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"RegistriesCertificates set for registry\",\n\t\t\topts: config.RegistryOptions{RegistriesCertificates: map[string]string{registryName: \"/path/to/the/certificate.cert\"}},\n\t\t\tcheck: func(config *tls.Config, pool *mockedCertPool, err error) {\n\t\t\t\tif len(pool.certificatesPath) != 1 || pool.certificatesPath[0] != \"/path/to/the/certificate.cert\" {\n\t\t\t\t\tt.Errorf(\"makeTransport().RegistriesCertificates certificate not appended to system certificates\")\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"RegistriesCertificates set for another registry\",\n\t\t\topts: config.RegistryOptions{RegistriesCertificates: map[string]string{fmt.Sprintf(\"other.%s=\", registryName): \"/path/to/the/certificate.cert\"}},\n\t\t\tcheck: func(config *tls.Config, pool *mockedCertPool, err error) {\n\t\t\t\tif len(pool.certificatesPath) != 0 {\n\t\t\t\t\tt.Errorf(\"makeTransport().RegistriesCertificates certificate appended to system certificates while added for other registry\")\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"RegistriesClientCertificates set for registry\",\n\t\t\topts: config.RegistryOptions{RegistriesClientCertificates: map[string]string{registryName: \"/path/to/client/certificate.cert,/path/to/client/key.key\"}},\n\t\t\tcheck: func(config *tls.Config, pool *mockedCertPool, err error) {\n\t\t\t\tif len(config.Certificates) != 1 {\n\t\t\t\t\tt.Errorf(\"makeTransport().RegistriesClientCertificates not loaded for desired registry\")\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"RegistriesClientCertificates set for another registry\",\n\t\t\topts: config.RegistryOptions{RegistriesClientCertificates: map[string]string{fmt.Sprintf(\"other.%s\", registryName): \"/path/to/client/certificate.cert,/path/to/key.key,/path/to/extra.crt\"}},\n\t\t\tcheck: func(config *tls.Config, pool *mockedCertPool, err error) {\n\t\t\t\tif len(config.Certificates) != 0 {\n\t\t\t\t\tt.Errorf(\"makeTransport().RegistriesClientCertificates certificate loaded for other registry\")\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"RegistriesClientCertificates incorrect cert format\",\n\t\t\topts: config.RegistryOptions{RegistriesClientCertificates: map[string]string{registryName: \"/path/to/client/certificate.cert\"}},\n\t\t\tcheck: func(config *tls.Config, pool *mockedCertPool, err error) {\n\t\t\t\tif config != nil {\n\t\t\t\t\tt.Errorf(\"makeTransport().RegistriesClientCertificates was incorrectly loaded without both client/key (config was not nil)\")\n\t\t\t\t}\n\t\t\t\texpectedError := \"failed to load client certificate/key 'my.registry.name=/path/to/client/certificate.cert', expected format: my.registry.name=/path/to/cert,/path/to/key\"\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"makeTransport().RegistriesClientCertificates was incorrectly loaded without both client/key (expected error, got nil)\")\n\t\t\t\t} else if err.Error() != expectedError {\n\t\t\t\t\tt.Errorf(\"makeTransport().RegistriesClientCertificates was incorrectly loaded without both client/key (expected: %s, got: %s)\", expectedError, err.Error())\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"RegistriesClientCertificates incorrect cert format extra\",\n\t\t\topts: config.RegistryOptions{RegistriesClientCertificates: map[string]string{registryName: \"/path/to/client/certificate.cert,/path/to/key.key,/path/to/extra.crt\"}},\n\t\t\tcheck: func(config *tls.Config, pool *mockedCertPool, err error) {\n\t\t\t\tif config != nil {\n\t\t\t\t\tt.Errorf(\"makeTransport().RegistriesClientCertificates was incorrectly loaded with extra paths in comma split (config was not nil)\")\n\t\t\t\t}\n\t\t\t\texpectedError := \"failed to load client certificate/key 'my.registry.name=/path/to/client/certificate.cert,/path/to/key.key,/path/to/extra.crt', expected format: my.registry.name=/path/to/cert,/path/to/key\"\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"makeTransport().RegistriesClientCertificates was incorrectly loaded loaded with extra paths in comma split (expected error, got nil)\")\n\t\t\t\t} else if err.Error() != expectedError {\n\t\t\t\t\tt.Errorf(\"makeTransport().RegistriesClientCertificates was incorrectly loaded loaded with extra paths in comma split (expected: %s, got: %s)\", expectedError, err.Error())\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t}\n\tsavedSystemCertLoader := systemCertLoader\n\tsavedSystemKeyPairLoader := systemKeyPairLoader\n\tdefer func() {\n\t\tsystemCertLoader = savedSystemCertLoader\n\t\tsystemKeyPairLoader = savedSystemKeyPairLoader\n\t}()\n\tfor _, tt := range tests {\n\t\tvar certificatesPath []string\n\t\tcertPool := &mockedCertPool{\n\t\t\tcertificatesPath: certificatesPath,\n\t\t}\n\t\tsystemCertLoader = certPool\n\t\tsystemKeyPairLoader = &mockedKeyPairLoader{}\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\ttr, err := MakeTransport(tt.opts, registryName)\n\t\t\tvar tlsConfig *tls.Config\n\t\t\tif err == nil {\n\t\t\t\ttlsConfig = tr.(*http.Transport).TLSClientConfig\n\t\t\t}\n\t\t\ttt.check(tlsConfig, certPool, err)\n\t\t})\n\n\t}\n}\n"
  },
  {
    "path": "pkg/util/util.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage util\n\nimport (\n\t\"crypto/md5\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\t\"os\"\n\t\"strconv\"\n\t\"sync\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"github.com/minio/highwayhash\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/sirupsen/logrus\"\n\t\"golang.org/x/sys/unix\"\n)\n\n// Hasher returns a hash function, used in snapshotting to determine if a file has changed\nfunc Hasher() func(string) (string, error) {\n\tpool := sync.Pool{\n\t\tNew: func() interface{} {\n\t\t\tb := make([]byte, highwayhash.Size*10*1024)\n\t\t\treturn &b\n\t\t},\n\t}\n\tkey := make([]byte, highwayhash.Size)\n\thasher := func(p string) (string, error) {\n\t\th, _ := highwayhash.New(key)\n\t\tfi, err := os.Lstat(p)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\th.Write([]byte(fi.Mode().String()))\n\t\th.Write([]byte(fi.ModTime().String()))\n\n\t\th.Write([]byte(strconv.FormatUint(uint64(fi.Sys().(*syscall.Stat_t).Uid), 36)))\n\t\th.Write([]byte(\",\"))\n\t\th.Write([]byte(strconv.FormatUint(uint64(fi.Sys().(*syscall.Stat_t).Gid), 36)))\n\n\t\tif fi.Mode().IsRegular() {\n\t\t\tcapability, _ := Lgetxattr(p, \"security.capability\")\n\t\t\tif capability != nil {\n\t\t\t\th.Write(capability)\n\t\t\t}\n\t\t\tf, err := os.Open(p)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t\tdefer f.Close()\n\t\t\tbuf := pool.Get().(*[]byte)\n\t\t\tdefer pool.Put(buf)\n\t\t\tif _, err := io.CopyBuffer(h, f, *buf); err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t} else if fi.Mode()&os.ModeSymlink == os.ModeSymlink {\n\t\t\tlinkPath, err := os.Readlink(p)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t\th.Write([]byte(linkPath))\n\t\t}\n\n\t\treturn hex.EncodeToString(h.Sum(nil)), nil\n\t}\n\treturn hasher\n}\n\n// CacheHasher takes into account everything the regular hasher does except for mtime\nfunc CacheHasher() func(string) (string, error) {\n\thasher := func(p string) (string, error) {\n\t\th := md5.New()\n\t\tfi, err := os.Lstat(p)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\th.Write([]byte(fi.Mode().String()))\n\n\t\th.Write([]byte(strconv.FormatUint(uint64(fi.Sys().(*syscall.Stat_t).Uid), 36)))\n\t\th.Write([]byte(\",\"))\n\t\th.Write([]byte(strconv.FormatUint(uint64(fi.Sys().(*syscall.Stat_t).Gid), 36)))\n\n\t\tif fi.Mode().IsRegular() {\n\t\t\tf, err := os.Open(p)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t\tdefer f.Close()\n\t\t\tif _, err := io.Copy(h, f); err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t} else if fi.Mode()&os.ModeSymlink == os.ModeSymlink {\n\t\t\tlinkPath, err := os.Readlink(p)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t\th.Write([]byte(linkPath))\n\t\t}\n\n\t\treturn hex.EncodeToString(h.Sum(nil)), nil\n\t}\n\treturn hasher\n}\n\n// MtimeHasher returns a hash function, which only looks at mtime to determine if a file has changed.\n// Note that the mtime can lag, so it's possible that a file will have changed but the mtime may look the same.\nfunc MtimeHasher() func(string) (string, error) {\n\thasher := func(p string) (string, error) {\n\t\th := md5.New()\n\t\tfi, err := os.Lstat(p)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\th.Write([]byte(fi.ModTime().String()))\n\t\treturn hex.EncodeToString(h.Sum(nil)), nil\n\t}\n\treturn hasher\n}\n\n// RedoHasher returns a hash function, which looks at mtime, size, filemode, owner uid and gid\n// Note that the mtime can lag, so it's possible that a file will have changed but the mtime may look the same.\nfunc RedoHasher() func(string) (string, error) {\n\thasher := func(p string) (string, error) {\n\t\th := md5.New()\n\t\tfi, err := os.Lstat(p)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\n\t\tlogrus.Debugf(\"Hash components for file: %s, mode: %s, mtime: %s, size: %s, user-id: %s, group-id: %s\",\n\t\t\tp, []byte(fi.Mode().String()), []byte(fi.ModTime().String()),\n\t\t\t[]byte(strconv.FormatInt(fi.Size(), 16)), []byte(strconv.FormatUint(uint64(fi.Sys().(*syscall.Stat_t).Uid), 36)),\n\t\t\t[]byte(strconv.FormatUint(uint64(fi.Sys().(*syscall.Stat_t).Gid), 36)))\n\n\t\th.Write([]byte(fi.Mode().String()))\n\t\th.Write([]byte(fi.ModTime().String()))\n\t\th.Write([]byte(strconv.FormatInt(fi.Size(), 16)))\n\t\th.Write([]byte(strconv.FormatUint(uint64(fi.Sys().(*syscall.Stat_t).Uid), 36)))\n\t\th.Write([]byte(\",\"))\n\t\th.Write([]byte(strconv.FormatUint(uint64(fi.Sys().(*syscall.Stat_t).Gid), 36)))\n\n\t\treturn hex.EncodeToString(h.Sum(nil)), nil\n\t}\n\treturn hasher\n}\n\n// SHA256 returns the shasum of the contents of r\nfunc SHA256(r io.Reader) (string, error) {\n\thasher := sha256.New()\n\t_, err := io.Copy(hasher, r)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn hex.EncodeToString(hasher.Sum(make([]byte, 0, hasher.Size()))), nil\n}\n\n// GetInputFrom returns Reader content\nfunc GetInputFrom(r io.Reader) ([]byte, error) {\n\toutput, err := io.ReadAll(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn output, nil\n}\n\ntype retryFunc func() error\n\n// Retry retries an operation\nfunc Retry(operation retryFunc, retryCount int, initialDelayMilliseconds int) error {\n\terr := operation()\n\tfor i := 0; err != nil && i < retryCount; i++ {\n\t\tsleepDuration := time.Millisecond * time.Duration(int(math.Pow(2, float64(i)))*initialDelayMilliseconds)\n\t\tlogrus.Warnf(\"Retrying operation after %s due to %v\", sleepDuration, err)\n\t\ttime.Sleep(sleepDuration)\n\t\terr = operation()\n\t}\n\n\treturn err\n}\n\n// Retry retries an operation with a return value\nfunc RetryWithResult[T any](operation func() (T, error), retryCount int, initialDelayMilliseconds int) (result T, err error) {\n\tresult, err = operation()\n\tif err == nil {\n\t\treturn result, nil\n\t}\n\tfor i := 0; i < retryCount; i++ {\n\t\tsleepDuration := time.Millisecond * time.Duration(int(math.Pow(2, float64(i)))*initialDelayMilliseconds)\n\t\tlogrus.Warnf(\"Retrying operation after %s due to %v\", sleepDuration, err)\n\t\ttime.Sleep(sleepDuration)\n\n\t\tresult, err = operation()\n\t\tif err == nil {\n\t\t\treturn result, nil\n\t\t}\n\t}\n\n\treturn result, fmt.Errorf(\"unable to complete operation after %d attempts, last error: %w\", retryCount, err)\n}\n\nfunc Lgetxattr(path string, attr string) ([]byte, error) {\n\t// Start with a 128 length byte array\n\tdest := make([]byte, 128)\n\tsz, errno := unix.Lgetxattr(path, attr, dest)\n\n\tfor errors.Is(errno, unix.ERANGE) {\n\t\t// Buffer too small, use zero-sized buffer to get the actual size\n\t\tsz, errno = unix.Lgetxattr(path, attr, []byte{})\n\t\tif errno != nil {\n\t\t\treturn nil, errno\n\t\t}\n\t\tdest = make([]byte, sz)\n\t\tsz, errno = unix.Lgetxattr(path, attr, dest)\n\t}\n\n\tswitch {\n\tcase errors.Is(errno, unix.ENODATA):\n\t\treturn nil, nil\n\tcase errno != nil:\n\t\treturn nil, errno\n\t}\n\n\treturn dest[:sz], nil\n}\n"
  },
  {
    "path": "pkg/util/util_test.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage util\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/GoogleContainerTools/kaniko/testutil\"\n)\n\nfunc TestGetInputFrom(t *testing.T) {\n\tvalidInput := []byte(\"Valid\\n\")\n\tvalidReader := bufio.NewReader(bytes.NewReader((validInput)))\n\tvalidValue, err := GetInputFrom(validReader)\n\ttestutil.CheckErrorAndDeepEqual(t, false, err, validInput, validValue)\n}\n\nfunc makeRetryFunc(numFailures int) retryFunc {\n\ti := -1\n\n\treturn func() error {\n\t\ti++\n\t\tif i < numFailures {\n\t\t\treturn fmt.Errorf(\"Failing with i=%v\", i)\n\t\t}\n\t\treturn nil\n\t}\n}\n\nfunc TestRetry(t *testing.T) {\n\t// test with a function that does not return an error\n\tif err := Retry(makeRetryFunc(0), 0, 10); err != nil {\n\t\tt.Fatalf(\"Not expecting error: %v\", err)\n\t}\n\tif err := Retry(makeRetryFunc(0), 3, 10); err != nil {\n\t\tt.Fatalf(\"Not expecting error: %v\", err)\n\t}\n\n\t// test with a function that returns an error twice\n\tif err := Retry(makeRetryFunc(2), 0, 10); err == nil {\n\t\tt.Fatal(\"Expecting error\", err)\n\t}\n\tif err := Retry(makeRetryFunc(2), 1, 10); err == nil {\n\t\tt.Fatal(\"Expecting error\", err)\n\t}\n\tif err := Retry(makeRetryFunc(2), 2, 10); err != nil {\n\t\tt.Fatalf(\"Not expecting error: %v\", err)\n\t}\n}\n\nfunc makeRetryFuncWithResult(numFailures int) func() (int, error) {\n\ti := -1\n\n\treturn func() (int, error) {\n\t\ti++\n\t\tif i < numFailures {\n\t\t\treturn i, fmt.Errorf(\"Failing with i=%v\", i)\n\t\t}\n\t\treturn i, nil\n\t}\n}\n\nfunc TestRetryWithResult(t *testing.T) {\n\t// test with a function that does not return an error\n\tresult, err := RetryWithResult(makeRetryFuncWithResult(0), 0, 10)\n\tif err != nil || result != 0 {\n\t\tt.Fatalf(\"Got result %d and error: %v\", result, err)\n\t}\n\tresult, err = RetryWithResult(makeRetryFuncWithResult(0), 3, 10)\n\tif err != nil || result != 0 {\n\t\tt.Fatalf(\"Got result %d and error: %v\", result, err)\n\t}\n\n\t// test with a function that returns an error twice\n\tresult, err = RetryWithResult(makeRetryFuncWithResult(2), 0, 10)\n\tif err == nil || result != 0 {\n\t\tt.Fatalf(\"Got result %d and error: %v\", result, err)\n\t}\n\tresult, err = RetryWithResult(makeRetryFuncWithResult(2), 1, 10)\n\tif err == nil || result != 1 {\n\t\tt.Fatalf(\"Got result %d and error: %v\", result, err)\n\t}\n\tresult, err = RetryWithResult(makeRetryFuncWithResult(2), 2, 10)\n\tif err != nil || result != 2 {\n\t\tt.Fatalf(\"Got result %d and error: %v\", result, err)\n\t}\n}\n"
  },
  {
    "path": "pkg/version/version.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage version\n\n// Set with LDFLAGS\nvar version = \"unset\"\n\nfunc Version() string {\n\treturn version\n}\n"
  },
  {
    "path": "run_in_docker.sh",
    "content": "#!/bin/bash\n\n# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -e\n\nif [ $# -lt 3 ]; then\n    echo \"Usage: run_in_docker.sh <path to Dockerfile> <context directory> <image tag> <cache>\"\n    exit 1\nfi\n\ndockerfile=$1\ncontext=$2\ndestination=$3\n\ncache=\"false\"\nif [[ ! -z \"$4\" ]]; then\n    cache=$4\nfi\n\nif [[ $destination == *\"gcr\"* ]]; then\n    if [[ ! -e $HOME/.config/gcloud/application_default_credentials.json ]]; then\n        echo \"Application Default Credentials do not exist. Run [gcloud auth application-default login] to configure them\"\n        exit 1\n    fi\n    docker run \\\n        -v \"$HOME\"/.config/gcloud:/root/.config/gcloud \\\n        -v \"$context\":/workspace \\\n        gcr.io/kaniko-project/executor:latest \\\n        --dockerfile \"${dockerfile}\" --destination \"${destination}\" --context dir:///workspace/ \\\n        --cache=\"${cache}\"\nelse\n    docker run \\\n        -v \"$context\":/workspace \\\n        gcr.io/kaniko-project/executor:latest \\\n        --dockerfile \"${dockerfile}\" --destination \"${destination}\" --context dir:///workspace/ \\\n        --cache=\"${cache}\"\nfi\n"
  },
  {
    "path": "scripts/boxed_warm_in_docker.sh",
    "content": "#!/bin/bash\n\n# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Test the warmer in boxed memory conditions.\n# Attempt to run the warmer inside a container limited to 16MB of RAM. Use gcr.io/kaniko-project/warmer:latest image.\"\n# Example: ./boxed_warm_in_docker.sh --image debian:trixie-slim\n# \nset -e\n\nrc=0\ndocker run \\\n\t--memory=16m --memory-swappiness=0 \\\n        gcr.io/kaniko-project/warmer:latest \\\n\t\"$@\" || rc=$?\n\t\n>&2 echo \"RC=$rc\"\nexit $rc\n\n"
  },
  {
    "path": "scripts/integration-test.sh",
    "content": "#!/bin/bash\n# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -e\n\nfunction start_local_registry {\n  docker start registry || docker run --name registry -d -p 5000:5000 registry:2\n}\n\n# TODO: to get this working, we need a way to override the gcs endpoint of kaniko at runtime\n# If this is done, integration test main includes flags --gcs-endpoint and --disable-gcs-auth\n# to mock the gcs endpoints and upload files to the fake-gcs-server\nfunction start_fake_gcs_server {\n  docker start fake-gcs-server || docker run -d -p 4443:4443 --name fake-gcs-server fsouza/fake-gcs-server -scheme http\n}\n\nIMAGE_REPO=\"${IMAGE_REPO:-gcr.io/kaniko-test}\"\n\ndocker version\n\necho \"Running integration tests...\"\nmake out/executor\nmake out/warmer\n\nFLAGS=(\n  \"--timeout=50m\"\n)\n\nif [[ -n $DOCKERFILE_PATTERN ]]; then\n  FLAGS+=(\"--dockerfiles-pattern=$DOCKERFILE_PATTERN\")\nfi\n\nif [[ -n $LOCAL ]]; then\n  echo \"running in local mode, mocking registry and gcs bucket...\"\n  start_local_registry\n  \n  IMAGE_REPO=\"localhost:5000/kaniko-test\"\n  GCS_BUCKET=\"\"\nfi\n\nFLAGS+=(\n  \"--bucket=${GCS_BUCKET}\"\n  \"--repo=${IMAGE_REPO}\"\n)\n\ngo test ./integration/... \"${FLAGS[@]}\" \"$@\" \n"
  },
  {
    "path": "scripts/k3s-setup.sh",
    "content": "# Copyright 2023 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nset -ex\n\nexport INSTALL_K3S_EXEC=\"--write-kubeconfig-mode=0644\"\n# Sometimes there is a residual kubeconfig, export and set this explicitly\nmkdir -p $HOME/.kube\nexport K3S_KUBECONFIG_OUTPUT=\"$HOME/.kube/config\"\nexport KUBECONFIG=\"$HOME/.kube/config\"\ncurl -sfL https://get.k3s.io | sh -\nexport SCRIPT_PATH=\"$(realpath $(dirname $0))\"\ntimeout 5m bash -c 'until kubectl cluster-info 2>/dev/null | grep \"CoreDNS\" >/dev/null; do sleep 1; done'\n# Install local registry and have it listen on localhost:5000\nsudo cp $SCRIPT_PATH/local-registry-helm.yaml /var/lib/rancher/k3s/server/manifests/\n# Wait until install of the registry completes\ntimeout 5m bash -c 'until kubectl get -n kube-system pod 2>/dev/null | grep local-registry | grep Completed >/dev/null; do sleep 1; done'\n# Wait until registry becomes available on localhost:5000\ntimeout 5m bash -c 'until nc -z localhost 5000; do sleep 1; done'\n\necho \"K3s is running and registry is available on localhost:5000\"\n"
  },
  {
    "path": "scripts/local-registry-helm.yaml",
    "content": "apiVersion: helm.cattle.io/v1\nkind: HelmChart\nmetadata:\n  name: local-registry\n  namespace: kube-system\nspec:\n  chart: https://github.com/twuni/docker-registry.helm/archive/refs/tags/v2.2.2.tar.gz\n  set:\n    # Expose the registry server on localhost\n    service.type: \"LoadBalancer\"\n"
  },
  {
    "path": "scripts/misc-integration-test.sh",
    "content": "#!/bin/bash\n# Copyright 2020 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# This script runs all integration tests except for\n# TestRun and TestLayers\nset -e\n\nTESTS=$(./scripts/integration-test.sh -list=Test -mod=vendor)\n\nTESTS=$(echo $TESTS | tr ' ' '\\n' | grep 'Test'| grep -v 'TestRun' | grep -v 'TestLayers' | grep -v 'TestK8s' | grep -v 'TestSnapshotBenchmark')\n\nRUN_ARG=''\ncount=0\nfor i in $TESTS; do\n  if [ \"$count\" -gt \"0\" ]; then\n    RUN_ARG=\"$RUN_ARG|$i\"\n  else\n    RUN_ARG=\"$RUN_ARG$i\"\n  fi\n  count=$((count+1))\ndone\n\necho $RUN_ARG\n"
  },
  {
    "path": "scripts/test.sh",
    "content": "#!/bin/bash\n\n# Copyright 2018 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nDIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"\n\n#set -e\n\nRED='\\033[0;31m'\nGREEN='\\033[0;32m'\nRESET='\\033[0m'\n\necho \"Running go tests...\"\ngo test -cover -coverprofile=out/coverage.out -v -timeout 120s `go list ./... | grep -v vendor | grep -v integration` | sed ''/PASS/s//$(printf \"${GREEN}PASS${RESET}\")/'' | sed ''/FAIL/s//$(printf \"${RED}FAIL${RESET}\")/''\nGO_TEST_EXIT_CODE=${PIPESTATUS[0]}\nif [[ $GO_TEST_EXIT_CODE -ne 0 ]]; then\n    exit $GO_TEST_EXIT_CODE\nfi\n\necho \"Running validation scripts...\"\nscripts=(\n    \"$DIR/../hack/boilerplate.sh\"\n    \"$DIR/../hack/gofmt.sh\"\n)\nfail=0\nfor s in \"${scripts[@]}\"\ndo\n    echo \"RUN ${s}\"\n    if \"${s}\"; then\n        echo -e \"${GREEN}PASSED${RESET} ${s}\"\n    else\n        echo -e \"${RED}FAILED${RESET} ${s}\"\n        fail=1\n    fi\ndone\nexit $fail\n"
  },
  {
    "path": "testutil/constants.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage testutil\n\nconst (\n\t// Dockerfile is used for unit testing\n\tDockerfile = `\n\tFROM scratch\n\tRUN echo hi > /hi\n\t\n\tFROM scratch AS second\n\tCOPY --from=0 /hi /hi2\n\n\tFROM second\n\tRUN xxx\n\t\n\tFROM scratch\n\tCOPY --from=second /hi2 /hi3\n\n\tFROM ubuntu:16.04 AS base\n\tENV DEBIAN_FRONTEND noninteractive\n\tENV LC_ALL C.UTF-8\n\n\tFROM base AS development\n\tENV PS1 \" 🐳 \\[\\033[1;36m\\]\\W\\[\\033[0;35m\\] # \\[\\033[0m\\]\"\n\n\tFROM development AS test\n\tENV ORG_ENV UnitTest\n\n\tFROM base AS production\n\tCOPY . /code\n\t`\n)\n"
  },
  {
    "path": "testutil/util.go",
    "content": "/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage testutil\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"os/user\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n)\n\n// SetupFiles creates files at path\nfunc SetupFiles(path string, files map[string]string) error {\n\tfor p, c := range files {\n\t\tpath := filepath.Join(path, p)\n\t\tif err := os.MkdirAll(filepath.Dir(path), 0750); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := os.WriteFile(path, []byte(c), 0644); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\ntype CurrentUser struct {\n\t*user.User\n\n\tPrimaryGroup string\n}\n\nfunc GetCurrentUser(t *testing.T) CurrentUser {\n\tcurrentUser, err := user.Current()\n\tif err != nil {\n\t\tt.Fatalf(\"Cannot get current user: %s\", err)\n\t}\n\tgroups, err := currentUser.GroupIds()\n\tif err != nil || len(groups) == 0 {\n\t\tt.Fatalf(\"Cannot get groups for current user: %s\", err)\n\t}\n\tprimaryGroupObj, err := user.LookupGroupId(groups[0])\n\tif err != nil {\n\t\tt.Fatalf(\"Could not lookup name of group %s: %s\", groups[0], err)\n\t}\n\tprimaryGroup := primaryGroupObj.Name\n\n\treturn CurrentUser{\n\t\tUser:         currentUser,\n\t\tPrimaryGroup: primaryGroup,\n\t}\n}\n\nfunc CheckDeepEqual(t *testing.T, expected, actual interface{}) {\n\tt.Helper()\n\tif diff := cmp.Diff(actual, expected); diff != \"\" {\n\t\tt.Errorf(\"%T differ (-got, +want): %s\", expected, diff)\n\t\treturn\n\t}\n}\n\nfunc CheckErrorAndDeepEqual(t *testing.T, shouldErr bool, err error, expected, actual interface{}) {\n\tt.Helper()\n\tif err := checkErr(shouldErr, err); err != nil {\n\t\tt.Error(err)\n\t\treturn\n\t}\n\tif !reflect.DeepEqual(expected, actual) {\n\t\tdiff := cmp.Diff(actual, expected)\n\t\tt.Errorf(\"%T differ (-got, +want): %s\", expected, diff)\n\t\treturn\n\t}\n}\n\nfunc CheckError(t *testing.T, shouldErr bool, err error) {\n\tif err := checkErr(shouldErr, err); err != nil {\n\t\tt.Error(err)\n\t}\n}\n\nfunc CheckNoError(t *testing.T, err error) {\n\tif err != nil {\n\t\tt.Errorf(\"%+v\", err)\n\t}\n}\n\nfunc checkErr(shouldErr bool, err error) error {\n\tif err == nil && shouldErr {\n\t\treturn fmt.Errorf(\"Expected error, but returned none\")\n\t}\n\tif err != nil && !shouldErr {\n\t\treturn fmt.Errorf(\"Unexpected error: %w\", err)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "tools/tools.go",
    "content": "//go:build tools\n// +build tools\n\n/*\nCopyright 2018 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\npackage tools\n\n// dependencies https://github.com/golang/go/issues/48332\n// These are placeholder imports the make go mod include these tools in its dependency graph.\nimport (\n\t_ \"github.com/GoogleCloudPlatform/docker-credential-gcr/v2\"\n\t_ \"github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cli/docker-credential-ecr-login\"\n\t_ \"github.com/chrismellard/docker-credential-acr-env\"\n)\n"
  },
  {
    "path": "vendor/cel.dev/expr/.bazelversion",
    "content": "7.3.2\n# Keep this pinned version in parity with cel-go\n"
  },
  {
    "path": "vendor/cel.dev/expr/.gitattributes",
    "content": "*.pb.go linguist-generated=true\n*.pb.go -diff -merge\n"
  },
  {
    "path": "vendor/cel.dev/expr/.gitignore",
    "content": "bazel-*\nMODULE.bazel.lock\n"
  },
  {
    "path": "vendor/cel.dev/expr/CODE_OF_CONDUCT.md",
    "content": "# Contributor Code of Conduct\n## Version 0.1.1 (adapted from 0.3b-angular)\n\nAs contributors and maintainers of the Common Expression Language\n(CEL) project, we pledge to respect everyone who contributes by\nposting issues, updating documentation, submitting pull requests,\nproviding feedback in comments, and any other activities.\n\nCommunication through any of CEL's channels (GitHub, Gitter, IRC,\nmailing lists, Google+, Twitter, etc.) must be constructive and never\nresort to personal attacks, trolling, public or private harassment,\ninsults, or other unprofessional conduct.\n\nWe promise to extend courtesy and respect to everyone involved in this\nproject regardless of gender, gender identity, sexual orientation,\ndisability, age, race, ethnicity, religion, or level of experience. We\nexpect anyone contributing to the project to do the same.\n\nIf any member of the community violates this code of conduct, the\nmaintainers of the CEL project may take action, removing issues,\ncomments, and PRs or blocking accounts as deemed appropriate.\n\nIf you are subject to or witness unacceptable behavior, or have any\nother concerns, please email us at\n[cel-conduct@google.com](mailto:cel-conduct@google.com).\n"
  },
  {
    "path": "vendor/cel.dev/expr/CONTRIBUTING.md",
    "content": "# How to Contribute\n\nWe'd love to accept your patches and contributions to this project. There are a\nfew guidelines you need to follow.\n\n## Contributor License Agreement\n\nContributions to this project must be accompanied by a Contributor License\nAgreement. You (or your employer) retain the copyright to your contribution,\nthis simply gives us permission to use and redistribute your contributions as\npart of the project. Head over to <https://cla.developers.google.com/> to see\nyour current agreements on file or to sign a new one.\n\nYou generally only need to submit a CLA once, so if you've already submitted one\n(even if it was for a different project), you probably don't need to do it\nagain.\n\n## Code reviews\n\nAll submissions, including submissions by project members, require review. We\nuse GitHub pull requests for this purpose. Consult\n[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more\ninformation on using pull requests.\n\n## What to expect from maintainers\n\nExpect maintainers to respond to new issues or pull requests within a week.\nFor outstanding and ongoing issues and particularly for long-running\npull requests, expect the maintainers to review within a week of a\ncontributor asking for a new review. There is no commitment to resolution --\nmerging or closing a pull request, or fixing or closing an issue -- because some\nissues will require more discussion than others.\n"
  },
  {
    "path": "vendor/cel.dev/expr/GOVERNANCE.md",
    "content": "# Project Governance\n\nThis document defines the governance process for the CEL language. CEL is\nGoogle-developed, but openly governed. Major contributors to the CEL\nspecification and its corresponding implementations constitute the CEL\nLanguage Council. New members may be added by a unanimous vote of the\nCouncil.\n\nThe MAINTAINERS.md file lists the members of the CEL Language Council, and\nunofficially indicates the \"areas of expertise\" of each member with respect\nto the publicly available CEL repos.\n\n## Code Changes\n\nCode changes must follow the standard pull request (PR) model documented in the\nCONTRIBUTING.md for each CEL repo. All fixes and features must be reviewed by a\nmaintainer. The maintainer reserves the right to request that any feature\nrequest (FR) or PR be reviewed by the language council.\n\n## Syntax and Semantic Changes\n\nSyntactic and semantic changes must be reviewed by the CEL Language Council.\nMaintainers may also request language council review at their discretion.\n\nThe review process is as follows:\n\n- Create a Feature Request in the CEL-Spec repo. The feature description will\n  serve as an abstract for the detailed design document.\n- Co-develop a design document with the Language Council.\n- Once the proposer gives the design document approval, the document will be\n  linked to the FR in the CEL-Spec repo and opened for comments to members of\n  the cel-lang-discuss@googlegroups.com.\n- The Language Council will review the design doc at the next council meeting\n  (once every three weeks) and the council decision included in the document.\n\nIf the proposal is approved, the spec will be updated by a maintainer (if\napplicable) and a rationale will be included in the CEL-Spec wiki to ensure\nfuture developers may follow CEL's growth and direction over time.\n\nApproved proposals may be implemented by the proposer or by the maintainers as\nthe parties see fit. At the discretion of the maintainer, changes from the\napproved design are permitted during implementation if they improve the user\nexperience and clarity of the feature.\n"
  },
  {
    "path": "vendor/cel.dev/expr/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/cel.dev/expr/MAINTAINERS.md",
    "content": "# CEL Language Council\n\n| Name            | Company      | Area of Expertise |\n|-----------------|--------------|-------------------|\n| Alfred Fuller   | Facebook     | cel-cpp, cel-spec |\n| Jim Larson      | Google       | cel-go, cel-spec  |\n| Matthais Blume  | Google       | cel-spec          |\n| Tristan Swadell | Google       | cel-go, cel-spec  |\n\n## Emeritus\n\n* Sanjay Ghemawat (Google)\n* Wolfgang Grieskamp (Facebook)\n"
  },
  {
    "path": "vendor/cel.dev/expr/MODULE.bazel",
    "content": "module(\n    name = \"cel-spec\",\n)\n\nbazel_dep(\n    name = \"bazel_skylib\",\n    version = \"1.7.1\",\n)\nbazel_dep(\n    name = \"gazelle\",\n    version = \"0.39.1\",\n    repo_name = \"bazel_gazelle\",\n)\nbazel_dep(\n    name = \"googleapis\",\n    version = \"0.0.0-20241220-5e258e33.bcr.1\",\n    repo_name = \"com_google_googleapis\",\n)\nbazel_dep(\n    name = \"googleapis-cc\",\n    version = \"1.0.0\",\n)\nbazel_dep(\n    name = \"googleapis-java\",\n    version = \"1.0.0\",\n)\nbazel_dep(\n    name = \"googleapis-go\",\n    version = \"1.0.0\",\n)\nbazel_dep(\n    name = \"protobuf\",\n    version = \"27.0\",\n    repo_name = \"com_google_protobuf\",\n)\nbazel_dep(\n    name = \"rules_cc\",\n    version = \"0.0.17\",\n)\nbazel_dep(\n    name = \"rules_go\",\n    version = \"0.53.0\",\n    repo_name = \"io_bazel_rules_go\",\n)\nbazel_dep(\n    name = \"rules_java\",\n    version = \"7.6.5\",\n)\nbazel_dep(\n    name = \"rules_proto\",\n    version = \"7.0.2\",\n)\nbazel_dep(\n    name = \"rules_python\",\n    version = \"0.35.0\",\n)\n\n### PYTHON ###\npython = use_extension(\"@rules_python//python/extensions:python.bzl\", \"python\")\npython.toolchain(\n    ignore_root_user_error = True,\n    python_version = \"3.11\",\n)\n\ngo_sdk = use_extension(\"@io_bazel_rules_go//go:extensions.bzl\", \"go_sdk\")\ngo_sdk.download(version = \"1.22.0\")\n\ngo_deps = use_extension(\"@bazel_gazelle//:extensions.bzl\", \"go_deps\")\ngo_deps.from_file(go_mod = \"//:go.mod\")\nuse_repo(\n    go_deps,\n    \"org_golang_google_genproto_googleapis_rpc\",\n    \"org_golang_google_protobuf\",\n)\n"
  },
  {
    "path": "vendor/cel.dev/expr/README.md",
    "content": "# Common Expression Language\n\nThe Common Expression Language (CEL) implements common semantics for expression\nevaluation, enabling different applications to more easily interoperate.\n\nKey Applications\n\n*   Security policy: organizations have complex infrastructure and need common\n    tooling to reason about the system as a whole\n*   Protocols: expressions are a useful data type and require interoperability\n    across programming languages and platforms.\n\n\nGuiding philosophy:\n\n1.  Keep it small & fast.\n    *   CEL evaluates in linear time, is mutation free, and not Turing-complete.\n        This limitation is a feature of the language design, which allows the\n        implementation to evaluate orders of magnitude faster than equivalently\n        sandboxed JavaScript.\n2.  Make it extensible.\n    *   CEL is designed to be embedded in applications, and allows for\n        extensibility via its context which allows for functions and data to be\n        provided by the software that embeds it.\n3.  Developer-friendly.\n    *   The language is approachable to developers. The initial spec was based\n        on the experience of developing Firebase Rules and usability testing\n        many prior iterations.\n    *   The library itself and accompanying toolings should be easy to adopt by\n        teams that seek to integrate CEL into their platforms.\n\nThe required components of a system that supports CEL are:\n\n*   The textual representation of an expression as written by a developer. It is\n    of similar syntax to expressions in C/C++/Java/JavaScript\n*   A representation of the program's abstract syntax tree (AST).\n*   A compiler library that converts the textual representation to the binary\n    representation. This can be done ahead of time (in the control plane) or\n    just before evaluation (in the data plane).\n*   A context containing one or more typed variables, often protobuf messages.\n    Most use-cases will use `attribute_context.proto`\n*   An evaluator library that takes the binary format in the context and\n    produces a result, usually a Boolean.\n\nFor use cases which require persistence or cross-process communcation, it is\nhighly recommended to serialize the type-checked expression as a protocol\nbuffer. The CEL team will maintains canonical protocol buffers for ASTs and\nwill keep these versions identical and wire-compatible in perpetuity:\n\n*  [CEL canonical](https://github.com/google/cel-spec/tree/master/proto/cel/expr)\n*  [CEL v1alpha1](https://github.com/googleapis/googleapis/tree/master/google/api/expr/v1alpha1)\n\n\nExample of boolean conditions and object construction:\n\n``` c\n// Condition\naccount.balance >= transaction.withdrawal\n    || (account.overdraftProtection\n    && account.overdraftLimit >= transaction.withdrawal  - account.balance)\n\n// Object construction\ncommon.GeoPoint{ latitude: 10.0, longitude: -5.5 }\n```\n\nFor more detail, see:\n\n*   [Introduction](doc/intro.md)\n*   [Language Definition](doc/langdef.md)\n\nReleased under the [Apache License](LICENSE).\n"
  },
  {
    "path": "vendor/cel.dev/expr/WORKSPACE",
    "content": "load(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\n\nhttp_archive(\n    name = \"io_bazel_rules_go\",\n    sha256 = \"099a9fb96a376ccbbb7d291ed4ecbdfd42f6bc822ab77ae6f1b5cb9e914e94fa\",\n    urls = [\n        \"https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.35.0/rules_go-v0.35.0.zip\",\n        \"https://github.com/bazelbuild/rules_go/releases/download/v0.35.0/rules_go-v0.35.0.zip\",\n    ],\n)\n\nhttp_archive(\n    name = \"bazel_gazelle\",\n    sha256 = \"ecba0f04f96b4960a5b250c8e8eeec42281035970aa8852dda73098274d14a1d\",\n    urls = [\n        \"https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.29.0/bazel-gazelle-v0.29.0.tar.gz\",\n        \"https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.29.0/bazel-gazelle-v0.29.0.tar.gz\",\n    ],\n)\n\nhttp_archive(\n    name = \"rules_proto\",\n    sha256 = \"e017528fd1c91c5a33f15493e3a398181a9e821a804eb7ff5acdd1d2d6c2b18d\",\n    strip_prefix = \"rules_proto-4.0.0-3.20.0\",\n    urls = [\n        \"https://github.com/bazelbuild/rules_proto/archive/refs/tags/4.0.0-3.20.0.tar.gz\",\n    ],\n)\n\n# googleapis as of 09/16/2024\nhttp_archive(\n    name = \"com_google_googleapis\",\n    strip_prefix = \"googleapis-4082d5e51e8481f6ccc384cacd896f4e78f19dee\",\n    sha256 = \"57319889d47578b3c89bf1b3f34888d796a8913d63b32d750a4cd12ed303c4e8\",\n    urls = [\n        \"https://github.com/googleapis/googleapis/archive/4082d5e51e8481f6ccc384cacd896f4e78f19dee.tar.gz\",\n    ],\n)\n\n# protobuf\nhttp_archive(\n    name = \"com_google_protobuf\",\n    sha256 = \"8242327e5df8c80ba49e4165250b8f79a76bd11765facefaaecfca7747dc8da2\",\n    strip_prefix = \"protobuf-3.21.5\",\n    urls = [\"https://github.com/protocolbuffers/protobuf/archive/v3.21.5.zip\"],\n)\n\n# googletest\nhttp_archive(\n     name = \"com_google_googletest\",\n     urls = [\"https://github.com/google/googletest/archive/master.zip\"],\n     strip_prefix = \"googletest-master\",\n)\n\n# gflags\nhttp_archive(\n    name = \"com_github_gflags_gflags\",\n    sha256 = \"6e16c8bc91b1310a44f3965e616383dbda48f83e8c1eaa2370a215057b00cabe\",\n    strip_prefix = \"gflags-77592648e3f3be87d6c7123eb81cbad75f9aef5a\",\n    urls = [\n        \"https://mirror.bazel.build/github.com/gflags/gflags/archive/77592648e3f3be87d6c7123eb81cbad75f9aef5a.tar.gz\",\n        \"https://github.com/gflags/gflags/archive/77592648e3f3be87d6c7123eb81cbad75f9aef5a.tar.gz\",\n    ],\n)\n\n# glog\nhttp_archive(\n    name = \"com_google_glog\",\n    sha256 = \"1ee310e5d0a19b9d584a855000434bb724aa744745d5b8ab1855c85bff8a8e21\",\n    strip_prefix = \"glog-028d37889a1e80e8a07da1b8945ac706259e5fd8\",\n    urls = [\n        \"https://mirror.bazel.build/github.com/google/glog/archive/028d37889a1e80e8a07da1b8945ac706259e5fd8.tar.gz\",\n        \"https://github.com/google/glog/archive/028d37889a1e80e8a07da1b8945ac706259e5fd8.tar.gz\",\n    ],\n)\n\n# absl\nhttp_archive(\n    name = \"com_google_absl\",\n    strip_prefix = \"abseil-cpp-master\",\n    urls = [\"https://github.com/abseil/abseil-cpp/archive/master.zip\"],\n)\n\nload(\"@io_bazel_rules_go//go:deps.bzl\", \"go_rules_dependencies\", \"go_register_toolchains\")\nload(\"@bazel_gazelle//:deps.bzl\", \"gazelle_dependencies\", \"go_repository\")\nload(\"@com_google_googleapis//:repository_rules.bzl\", \"switched_rules_by_language\")\nload(\"@rules_proto//proto:repositories.bzl\", \"rules_proto_dependencies\", \"rules_proto_toolchains\")\nload(\"@com_google_protobuf//:protobuf_deps.bzl\", \"protobuf_deps\")\n\nswitched_rules_by_language(\n    name = \"com_google_googleapis_imports\",\n    cc = True,\n)\n\n# Do *not* call *_dependencies(), etc, yet.  See comment at the end.\n\n# Generated Google APIs protos for Golang\n# Generated Google APIs protos for Golang 08/26/2024\ngo_repository(\n    name = \"org_golang_google_genproto_googleapis_api\",\n    build_file_proto_mode = \"disable_global\",\n    importpath = \"google.golang.org/genproto/googleapis/api\",\n    sum = \"h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=\",\n    version = \"v0.0.0-20240826202546-f6391c0de4c7\",\n)\n\n# Generated Google APIs protos for Golang 08/26/2024\ngo_repository(\n    name = \"org_golang_google_genproto_googleapis_rpc\",\n    build_file_proto_mode = \"disable_global\",\n    importpath = \"google.golang.org/genproto/googleapis/rpc\",\n    sum = \"h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=\",\n    version = \"v0.0.0-20240826202546-f6391c0de4c7\",\n)\n\n# gRPC deps\ngo_repository(\n    name = \"org_golang_google_grpc\",\n    build_file_proto_mode = \"disable_global\",\n    importpath = \"google.golang.org/grpc\",\n    tag = \"v1.49.0\",\n)\n\ngo_repository(\n    name = \"org_golang_x_net\",\n    importpath = \"golang.org/x/net\",\n    sum = \"h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=\",\n    version = \"v0.0.0-20190311183353-d8887717615a\",\n)\n\ngo_repository(\n    name = \"org_golang_x_text\",\n    importpath = \"golang.org/x/text\",\n    sum = \"h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=\",\n    version = \"v0.3.2\",\n)\n\n# Run the dependencies at the end.  These will silently try to import some\n# of the above repositories but at different versions, so ours must come first.\ngo_rules_dependencies()\ngo_register_toolchains(version = \"1.19.1\")\ngazelle_dependencies()\nrules_proto_dependencies()\nrules_proto_toolchains()\nprotobuf_deps()\n"
  },
  {
    "path": "vendor/cel.dev/expr/WORKSPACE.bzlmod",
    "content": ""
  },
  {
    "path": "vendor/cel.dev/expr/checked.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v3.21.5\n// source: cel/expr/checked.proto\n\npackage expr\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n\tstructpb \"google.golang.org/protobuf/types/known/structpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Type_PrimitiveType int32\n\nconst (\n\tType_PRIMITIVE_TYPE_UNSPECIFIED Type_PrimitiveType = 0\n\tType_BOOL                       Type_PrimitiveType = 1\n\tType_INT64                      Type_PrimitiveType = 2\n\tType_UINT64                     Type_PrimitiveType = 3\n\tType_DOUBLE                     Type_PrimitiveType = 4\n\tType_STRING                     Type_PrimitiveType = 5\n\tType_BYTES                      Type_PrimitiveType = 6\n)\n\n// Enum value maps for Type_PrimitiveType.\nvar (\n\tType_PrimitiveType_name = map[int32]string{\n\t\t0: \"PRIMITIVE_TYPE_UNSPECIFIED\",\n\t\t1: \"BOOL\",\n\t\t2: \"INT64\",\n\t\t3: \"UINT64\",\n\t\t4: \"DOUBLE\",\n\t\t5: \"STRING\",\n\t\t6: \"BYTES\",\n\t}\n\tType_PrimitiveType_value = map[string]int32{\n\t\t\"PRIMITIVE_TYPE_UNSPECIFIED\": 0,\n\t\t\"BOOL\":                       1,\n\t\t\"INT64\":                      2,\n\t\t\"UINT64\":                     3,\n\t\t\"DOUBLE\":                     4,\n\t\t\"STRING\":                     5,\n\t\t\"BYTES\":                      6,\n\t}\n)\n\nfunc (x Type_PrimitiveType) Enum() *Type_PrimitiveType {\n\tp := new(Type_PrimitiveType)\n\t*p = x\n\treturn p\n}\n\nfunc (x Type_PrimitiveType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (Type_PrimitiveType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_cel_expr_checked_proto_enumTypes[0].Descriptor()\n}\n\nfunc (Type_PrimitiveType) Type() protoreflect.EnumType {\n\treturn &file_cel_expr_checked_proto_enumTypes[0]\n}\n\nfunc (x Type_PrimitiveType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use Type_PrimitiveType.Descriptor instead.\nfunc (Type_PrimitiveType) EnumDescriptor() ([]byte, []int) {\n\treturn file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 0}\n}\n\ntype Type_WellKnownType int32\n\nconst (\n\tType_WELL_KNOWN_TYPE_UNSPECIFIED Type_WellKnownType = 0\n\tType_ANY                         Type_WellKnownType = 1\n\tType_TIMESTAMP                   Type_WellKnownType = 2\n\tType_DURATION                    Type_WellKnownType = 3\n)\n\n// Enum value maps for Type_WellKnownType.\nvar (\n\tType_WellKnownType_name = map[int32]string{\n\t\t0: \"WELL_KNOWN_TYPE_UNSPECIFIED\",\n\t\t1: \"ANY\",\n\t\t2: \"TIMESTAMP\",\n\t\t3: \"DURATION\",\n\t}\n\tType_WellKnownType_value = map[string]int32{\n\t\t\"WELL_KNOWN_TYPE_UNSPECIFIED\": 0,\n\t\t\"ANY\":                         1,\n\t\t\"TIMESTAMP\":                   2,\n\t\t\"DURATION\":                    3,\n\t}\n)\n\nfunc (x Type_WellKnownType) Enum() *Type_WellKnownType {\n\tp := new(Type_WellKnownType)\n\t*p = x\n\treturn p\n}\n\nfunc (x Type_WellKnownType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (Type_WellKnownType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_cel_expr_checked_proto_enumTypes[1].Descriptor()\n}\n\nfunc (Type_WellKnownType) Type() protoreflect.EnumType {\n\treturn &file_cel_expr_checked_proto_enumTypes[1]\n}\n\nfunc (x Type_WellKnownType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use Type_WellKnownType.Descriptor instead.\nfunc (Type_WellKnownType) EnumDescriptor() ([]byte, []int) {\n\treturn file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 1}\n}\n\ntype CheckedExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tReferenceMap map[int64]*Reference `protobuf:\"bytes,2,rep,name=reference_map,json=referenceMap,proto3\" json:\"reference_map,omitempty\" protobuf_key:\"varint,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tTypeMap      map[int64]*Type      `protobuf:\"bytes,3,rep,name=type_map,json=typeMap,proto3\" json:\"type_map,omitempty\" protobuf_key:\"varint,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tSourceInfo   *SourceInfo          `protobuf:\"bytes,5,opt,name=source_info,json=sourceInfo,proto3\" json:\"source_info,omitempty\"`\n\tExprVersion  string               `protobuf:\"bytes,6,opt,name=expr_version,json=exprVersion,proto3\" json:\"expr_version,omitempty\"`\n\tExpr         *Expr                `protobuf:\"bytes,4,opt,name=expr,proto3\" json:\"expr,omitempty\"`\n}\n\nfunc (x *CheckedExpr) Reset() {\n\t*x = CheckedExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_checked_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *CheckedExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CheckedExpr) ProtoMessage() {}\n\nfunc (x *CheckedExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_checked_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CheckedExpr.ProtoReflect.Descriptor instead.\nfunc (*CheckedExpr) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_checked_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CheckedExpr) GetReferenceMap() map[int64]*Reference {\n\tif x != nil {\n\t\treturn x.ReferenceMap\n\t}\n\treturn nil\n}\n\nfunc (x *CheckedExpr) GetTypeMap() map[int64]*Type {\n\tif x != nil {\n\t\treturn x.TypeMap\n\t}\n\treturn nil\n}\n\nfunc (x *CheckedExpr) GetSourceInfo() *SourceInfo {\n\tif x != nil {\n\t\treturn x.SourceInfo\n\t}\n\treturn nil\n}\n\nfunc (x *CheckedExpr) GetExprVersion() string {\n\tif x != nil {\n\t\treturn x.ExprVersion\n\t}\n\treturn \"\"\n}\n\nfunc (x *CheckedExpr) GetExpr() *Expr {\n\tif x != nil {\n\t\treturn x.Expr\n\t}\n\treturn nil\n}\n\ntype Type struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to TypeKind:\n\t//\n\t//\t*Type_Dyn\n\t//\t*Type_Null\n\t//\t*Type_Primitive\n\t//\t*Type_Wrapper\n\t//\t*Type_WellKnown\n\t//\t*Type_ListType_\n\t//\t*Type_MapType_\n\t//\t*Type_Function\n\t//\t*Type_MessageType\n\t//\t*Type_TypeParam\n\t//\t*Type_Type\n\t//\t*Type_Error\n\t//\t*Type_AbstractType_\n\tTypeKind isType_TypeKind `protobuf_oneof:\"type_kind\"`\n}\n\nfunc (x *Type) Reset() {\n\t*x = Type{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_checked_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Type) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Type) ProtoMessage() {}\n\nfunc (x *Type) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_checked_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Type.ProtoReflect.Descriptor instead.\nfunc (*Type) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_checked_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (m *Type) GetTypeKind() isType_TypeKind {\n\tif m != nil {\n\t\treturn m.TypeKind\n\t}\n\treturn nil\n}\n\nfunc (x *Type) GetDyn() *emptypb.Empty {\n\tif x, ok := x.GetTypeKind().(*Type_Dyn); ok {\n\t\treturn x.Dyn\n\t}\n\treturn nil\n}\n\nfunc (x *Type) GetNull() structpb.NullValue {\n\tif x, ok := x.GetTypeKind().(*Type_Null); ok {\n\t\treturn x.Null\n\t}\n\treturn structpb.NullValue(0)\n}\n\nfunc (x *Type) GetPrimitive() Type_PrimitiveType {\n\tif x, ok := x.GetTypeKind().(*Type_Primitive); ok {\n\t\treturn x.Primitive\n\t}\n\treturn Type_PRIMITIVE_TYPE_UNSPECIFIED\n}\n\nfunc (x *Type) GetWrapper() Type_PrimitiveType {\n\tif x, ok := x.GetTypeKind().(*Type_Wrapper); ok {\n\t\treturn x.Wrapper\n\t}\n\treturn Type_PRIMITIVE_TYPE_UNSPECIFIED\n}\n\nfunc (x *Type) GetWellKnown() Type_WellKnownType {\n\tif x, ok := x.GetTypeKind().(*Type_WellKnown); ok {\n\t\treturn x.WellKnown\n\t}\n\treturn Type_WELL_KNOWN_TYPE_UNSPECIFIED\n}\n\nfunc (x *Type) GetListType() *Type_ListType {\n\tif x, ok := x.GetTypeKind().(*Type_ListType_); ok {\n\t\treturn x.ListType\n\t}\n\treturn nil\n}\n\nfunc (x *Type) GetMapType() *Type_MapType {\n\tif x, ok := x.GetTypeKind().(*Type_MapType_); ok {\n\t\treturn x.MapType\n\t}\n\treturn nil\n}\n\nfunc (x *Type) GetFunction() *Type_FunctionType {\n\tif x, ok := x.GetTypeKind().(*Type_Function); ok {\n\t\treturn x.Function\n\t}\n\treturn nil\n}\n\nfunc (x *Type) GetMessageType() string {\n\tif x, ok := x.GetTypeKind().(*Type_MessageType); ok {\n\t\treturn x.MessageType\n\t}\n\treturn \"\"\n}\n\nfunc (x *Type) GetTypeParam() string {\n\tif x, ok := x.GetTypeKind().(*Type_TypeParam); ok {\n\t\treturn x.TypeParam\n\t}\n\treturn \"\"\n}\n\nfunc (x *Type) GetType() *Type {\n\tif x, ok := x.GetTypeKind().(*Type_Type); ok {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *Type) GetError() *emptypb.Empty {\n\tif x, ok := x.GetTypeKind().(*Type_Error); ok {\n\t\treturn x.Error\n\t}\n\treturn nil\n}\n\nfunc (x *Type) GetAbstractType() *Type_AbstractType {\n\tif x, ok := x.GetTypeKind().(*Type_AbstractType_); ok {\n\t\treturn x.AbstractType\n\t}\n\treturn nil\n}\n\ntype isType_TypeKind interface {\n\tisType_TypeKind()\n}\n\ntype Type_Dyn struct {\n\tDyn *emptypb.Empty `protobuf:\"bytes,1,opt,name=dyn,proto3,oneof\"`\n}\n\ntype Type_Null struct {\n\tNull structpb.NullValue `protobuf:\"varint,2,opt,name=null,proto3,enum=google.protobuf.NullValue,oneof\"`\n}\n\ntype Type_Primitive struct {\n\tPrimitive Type_PrimitiveType `protobuf:\"varint,3,opt,name=primitive,proto3,enum=cel.expr.Type_PrimitiveType,oneof\"`\n}\n\ntype Type_Wrapper struct {\n\tWrapper Type_PrimitiveType `protobuf:\"varint,4,opt,name=wrapper,proto3,enum=cel.expr.Type_PrimitiveType,oneof\"`\n}\n\ntype Type_WellKnown struct {\n\tWellKnown Type_WellKnownType `protobuf:\"varint,5,opt,name=well_known,json=wellKnown,proto3,enum=cel.expr.Type_WellKnownType,oneof\"`\n}\n\ntype Type_ListType_ struct {\n\tListType *Type_ListType `protobuf:\"bytes,6,opt,name=list_type,json=listType,proto3,oneof\"`\n}\n\ntype Type_MapType_ struct {\n\tMapType *Type_MapType `protobuf:\"bytes,7,opt,name=map_type,json=mapType,proto3,oneof\"`\n}\n\ntype Type_Function struct {\n\tFunction *Type_FunctionType `protobuf:\"bytes,8,opt,name=function,proto3,oneof\"`\n}\n\ntype Type_MessageType struct {\n\tMessageType string `protobuf:\"bytes,9,opt,name=message_type,json=messageType,proto3,oneof\"`\n}\n\ntype Type_TypeParam struct {\n\tTypeParam string `protobuf:\"bytes,10,opt,name=type_param,json=typeParam,proto3,oneof\"`\n}\n\ntype Type_Type struct {\n\tType *Type `protobuf:\"bytes,11,opt,name=type,proto3,oneof\"`\n}\n\ntype Type_Error struct {\n\tError *emptypb.Empty `protobuf:\"bytes,12,opt,name=error,proto3,oneof\"`\n}\n\ntype Type_AbstractType_ struct {\n\tAbstractType *Type_AbstractType `protobuf:\"bytes,14,opt,name=abstract_type,json=abstractType,proto3,oneof\"`\n}\n\nfunc (*Type_Dyn) isType_TypeKind() {}\n\nfunc (*Type_Null) isType_TypeKind() {}\n\nfunc (*Type_Primitive) isType_TypeKind() {}\n\nfunc (*Type_Wrapper) isType_TypeKind() {}\n\nfunc (*Type_WellKnown) isType_TypeKind() {}\n\nfunc (*Type_ListType_) isType_TypeKind() {}\n\nfunc (*Type_MapType_) isType_TypeKind() {}\n\nfunc (*Type_Function) isType_TypeKind() {}\n\nfunc (*Type_MessageType) isType_TypeKind() {}\n\nfunc (*Type_TypeParam) isType_TypeKind() {}\n\nfunc (*Type_Type) isType_TypeKind() {}\n\nfunc (*Type_Error) isType_TypeKind() {}\n\nfunc (*Type_AbstractType_) isType_TypeKind() {}\n\ntype Decl struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// Types that are assignable to DeclKind:\n\t//\n\t//\t*Decl_Ident\n\t//\t*Decl_Function\n\tDeclKind isDecl_DeclKind `protobuf_oneof:\"decl_kind\"`\n}\n\nfunc (x *Decl) Reset() {\n\t*x = Decl{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_checked_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Decl) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Decl) ProtoMessage() {}\n\nfunc (x *Decl) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_checked_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Decl.ProtoReflect.Descriptor instead.\nfunc (*Decl) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_checked_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Decl) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (m *Decl) GetDeclKind() isDecl_DeclKind {\n\tif m != nil {\n\t\treturn m.DeclKind\n\t}\n\treturn nil\n}\n\nfunc (x *Decl) GetIdent() *Decl_IdentDecl {\n\tif x, ok := x.GetDeclKind().(*Decl_Ident); ok {\n\t\treturn x.Ident\n\t}\n\treturn nil\n}\n\nfunc (x *Decl) GetFunction() *Decl_FunctionDecl {\n\tif x, ok := x.GetDeclKind().(*Decl_Function); ok {\n\t\treturn x.Function\n\t}\n\treturn nil\n}\n\ntype isDecl_DeclKind interface {\n\tisDecl_DeclKind()\n}\n\ntype Decl_Ident struct {\n\tIdent *Decl_IdentDecl `protobuf:\"bytes,2,opt,name=ident,proto3,oneof\"`\n}\n\ntype Decl_Function struct {\n\tFunction *Decl_FunctionDecl `protobuf:\"bytes,3,opt,name=function,proto3,oneof\"`\n}\n\nfunc (*Decl_Ident) isDecl_DeclKind() {}\n\nfunc (*Decl_Function) isDecl_DeclKind() {}\n\ntype Reference struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName       string    `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tOverloadId []string  `protobuf:\"bytes,3,rep,name=overload_id,json=overloadId,proto3\" json:\"overload_id,omitempty\"`\n\tValue      *Constant `protobuf:\"bytes,4,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *Reference) Reset() {\n\t*x = Reference{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_checked_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Reference) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Reference) ProtoMessage() {}\n\nfunc (x *Reference) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_checked_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Reference.ProtoReflect.Descriptor instead.\nfunc (*Reference) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_checked_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *Reference) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Reference) GetOverloadId() []string {\n\tif x != nil {\n\t\treturn x.OverloadId\n\t}\n\treturn nil\n}\n\nfunc (x *Reference) GetValue() *Constant {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\ntype Type_ListType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tElemType *Type `protobuf:\"bytes,1,opt,name=elem_type,json=elemType,proto3\" json:\"elem_type,omitempty\"`\n}\n\nfunc (x *Type_ListType) Reset() {\n\t*x = Type_ListType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_checked_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Type_ListType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Type_ListType) ProtoMessage() {}\n\nfunc (x *Type_ListType) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_checked_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Type_ListType.ProtoReflect.Descriptor instead.\nfunc (*Type_ListType) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 0}\n}\n\nfunc (x *Type_ListType) GetElemType() *Type {\n\tif x != nil {\n\t\treturn x.ElemType\n\t}\n\treturn nil\n}\n\ntype Type_MapType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tKeyType   *Type `protobuf:\"bytes,1,opt,name=key_type,json=keyType,proto3\" json:\"key_type,omitempty\"`\n\tValueType *Type `protobuf:\"bytes,2,opt,name=value_type,json=valueType,proto3\" json:\"value_type,omitempty\"`\n}\n\nfunc (x *Type_MapType) Reset() {\n\t*x = Type_MapType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_checked_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Type_MapType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Type_MapType) ProtoMessage() {}\n\nfunc (x *Type_MapType) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_checked_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Type_MapType.ProtoReflect.Descriptor instead.\nfunc (*Type_MapType) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 1}\n}\n\nfunc (x *Type_MapType) GetKeyType() *Type {\n\tif x != nil {\n\t\treturn x.KeyType\n\t}\n\treturn nil\n}\n\nfunc (x *Type_MapType) GetValueType() *Type {\n\tif x != nil {\n\t\treturn x.ValueType\n\t}\n\treturn nil\n}\n\ntype Type_FunctionType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tResultType *Type   `protobuf:\"bytes,1,opt,name=result_type,json=resultType,proto3\" json:\"result_type,omitempty\"`\n\tArgTypes   []*Type `protobuf:\"bytes,2,rep,name=arg_types,json=argTypes,proto3\" json:\"arg_types,omitempty\"`\n}\n\nfunc (x *Type_FunctionType) Reset() {\n\t*x = Type_FunctionType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_checked_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Type_FunctionType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Type_FunctionType) ProtoMessage() {}\n\nfunc (x *Type_FunctionType) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_checked_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Type_FunctionType.ProtoReflect.Descriptor instead.\nfunc (*Type_FunctionType) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 2}\n}\n\nfunc (x *Type_FunctionType) GetResultType() *Type {\n\tif x != nil {\n\t\treturn x.ResultType\n\t}\n\treturn nil\n}\n\nfunc (x *Type_FunctionType) GetArgTypes() []*Type {\n\tif x != nil {\n\t\treturn x.ArgTypes\n\t}\n\treturn nil\n}\n\ntype Type_AbstractType struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName           string  `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\tParameterTypes []*Type `protobuf:\"bytes,2,rep,name=parameter_types,json=parameterTypes,proto3\" json:\"parameter_types,omitempty\"`\n}\n\nfunc (x *Type_AbstractType) Reset() {\n\t*x = Type_AbstractType{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_checked_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Type_AbstractType) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Type_AbstractType) ProtoMessage() {}\n\nfunc (x *Type_AbstractType) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_checked_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Type_AbstractType.ProtoReflect.Descriptor instead.\nfunc (*Type_AbstractType) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 3}\n}\n\nfunc (x *Type_AbstractType) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Type_AbstractType) GetParameterTypes() []*Type {\n\tif x != nil {\n\t\treturn x.ParameterTypes\n\t}\n\treturn nil\n}\n\ntype Decl_IdentDecl struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tType  *Type     `protobuf:\"bytes,1,opt,name=type,proto3\" json:\"type,omitempty\"`\n\tValue *Constant `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n\tDoc   string    `protobuf:\"bytes,3,opt,name=doc,proto3\" json:\"doc,omitempty\"`\n}\n\nfunc (x *Decl_IdentDecl) Reset() {\n\t*x = Decl_IdentDecl{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_checked_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Decl_IdentDecl) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Decl_IdentDecl) ProtoMessage() {}\n\nfunc (x *Decl_IdentDecl) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_checked_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Decl_IdentDecl.ProtoReflect.Descriptor instead.\nfunc (*Decl_IdentDecl) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_checked_proto_rawDescGZIP(), []int{2, 0}\n}\n\nfunc (x *Decl_IdentDecl) GetType() *Type {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn nil\n}\n\nfunc (x *Decl_IdentDecl) GetValue() *Constant {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\nfunc (x *Decl_IdentDecl) GetDoc() string {\n\tif x != nil {\n\t\treturn x.Doc\n\t}\n\treturn \"\"\n}\n\ntype Decl_FunctionDecl struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOverloads []*Decl_FunctionDecl_Overload `protobuf:\"bytes,1,rep,name=overloads,proto3\" json:\"overloads,omitempty\"`\n}\n\nfunc (x *Decl_FunctionDecl) Reset() {\n\t*x = Decl_FunctionDecl{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_checked_proto_msgTypes[11]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Decl_FunctionDecl) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Decl_FunctionDecl) ProtoMessage() {}\n\nfunc (x *Decl_FunctionDecl) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_checked_proto_msgTypes[11]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Decl_FunctionDecl.ProtoReflect.Descriptor instead.\nfunc (*Decl_FunctionDecl) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_checked_proto_rawDescGZIP(), []int{2, 1}\n}\n\nfunc (x *Decl_FunctionDecl) GetOverloads() []*Decl_FunctionDecl_Overload {\n\tif x != nil {\n\t\treturn x.Overloads\n\t}\n\treturn nil\n}\n\ntype Decl_FunctionDecl_Overload struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOverloadId         string   `protobuf:\"bytes,1,opt,name=overload_id,json=overloadId,proto3\" json:\"overload_id,omitempty\"`\n\tParams             []*Type  `protobuf:\"bytes,2,rep,name=params,proto3\" json:\"params,omitempty\"`\n\tTypeParams         []string `protobuf:\"bytes,3,rep,name=type_params,json=typeParams,proto3\" json:\"type_params,omitempty\"`\n\tResultType         *Type    `protobuf:\"bytes,4,opt,name=result_type,json=resultType,proto3\" json:\"result_type,omitempty\"`\n\tIsInstanceFunction bool     `protobuf:\"varint,5,opt,name=is_instance_function,json=isInstanceFunction,proto3\" json:\"is_instance_function,omitempty\"`\n\tDoc                string   `protobuf:\"bytes,6,opt,name=doc,proto3\" json:\"doc,omitempty\"`\n}\n\nfunc (x *Decl_FunctionDecl_Overload) Reset() {\n\t*x = Decl_FunctionDecl_Overload{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_checked_proto_msgTypes[12]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Decl_FunctionDecl_Overload) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Decl_FunctionDecl_Overload) ProtoMessage() {}\n\nfunc (x *Decl_FunctionDecl_Overload) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_checked_proto_msgTypes[12]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Decl_FunctionDecl_Overload.ProtoReflect.Descriptor instead.\nfunc (*Decl_FunctionDecl_Overload) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_checked_proto_rawDescGZIP(), []int{2, 1, 0}\n}\n\nfunc (x *Decl_FunctionDecl_Overload) GetOverloadId() string {\n\tif x != nil {\n\t\treturn x.OverloadId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Decl_FunctionDecl_Overload) GetParams() []*Type {\n\tif x != nil {\n\t\treturn x.Params\n\t}\n\treturn nil\n}\n\nfunc (x *Decl_FunctionDecl_Overload) GetTypeParams() []string {\n\tif x != nil {\n\t\treturn x.TypeParams\n\t}\n\treturn nil\n}\n\nfunc (x *Decl_FunctionDecl_Overload) GetResultType() *Type {\n\tif x != nil {\n\t\treturn x.ResultType\n\t}\n\treturn nil\n}\n\nfunc (x *Decl_FunctionDecl_Overload) GetIsInstanceFunction() bool {\n\tif x != nil {\n\t\treturn x.IsInstanceFunction\n\t}\n\treturn false\n}\n\nfunc (x *Decl_FunctionDecl_Overload) GetDoc() string {\n\tif x != nil {\n\t\treturn x.Doc\n\t}\n\treturn \"\"\n}\n\nvar File_cel_expr_checked_proto protoreflect.FileDescriptor\n\nvar file_cel_expr_checked_proto_rawDesc = []byte{\n\t0x0a, 0x16, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b,\n\t0x65, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78,\n\t0x70, 0x72, 0x1a, 0x15, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x73, 0x79, 0x6e,\n\t0x74, 0x61, 0x78, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x22, 0xba, 0x03, 0x0a, 0x0b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64,\n\t0x45, 0x78, 0x70, 0x72, 0x12, 0x4c, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,\n\t0x65, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x65,\n\t0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x78,\n\t0x70, 0x72, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x45,\n\t0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x4d,\n\t0x61, 0x70, 0x12, 0x3d, 0x0a, 0x08, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x03,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e,\n\t0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65,\n\t0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x74, 0x79, 0x70, 0x65, 0x4d, 0x61,\n\t0x70, 0x12, 0x35, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f,\n\t0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70,\n\t0x72, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x73, 0x6f,\n\t0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x78, 0x70, 0x72,\n\t0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,\n\t0x65, 0x78, 0x70, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x04, 0x65,\n\t0x78, 0x70, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e,\n\t0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x65, 0x78, 0x70, 0x72, 0x1a,\n\t0x54, 0x0a, 0x11, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x45,\n\t0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72,\n\t0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4a, 0x0a, 0x0c, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x61, 0x70,\n\t0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x03, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70,\n\t0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,\n\t0x01, 0x22, 0xe6, 0x09, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x64, 0x79,\n\t0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x48,\n\t0x00, 0x52, 0x03, 0x64, 0x79, 0x6e, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65,\n\t0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x3c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6d,\n\t0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x65,\n\t0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x50, 0x72, 0x69, 0x6d,\n\t0x69, 0x74, 0x69, 0x76, 0x65, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x09, 0x70, 0x72, 0x69,\n\t0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65,\n\t0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78,\n\t0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76,\n\t0x65, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x07, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,\n\t0x12, 0x3d, 0x0a, 0x0a, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x18, 0x05,\n\t0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e,\n\t0x54, 0x79, 0x70, 0x65, 0x2e, 0x57, 0x65, 0x6c, 0x6c, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x54, 0x79,\n\t0x70, 0x65, 0x48, 0x00, 0x52, 0x09, 0x77, 0x65, 0x6c, 0x6c, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x12,\n\t0x36, 0x0a, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79,\n\t0x70, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x6c,\n\t0x69, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x5f, 0x74,\n\t0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x65, 0x6c, 0x2e,\n\t0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70,\n\t0x65, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x08,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b,\n\t0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x46,\n\t0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x66,\n\t0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61,\n\t0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,\n\t0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0a,\n\t0x74, 0x79, 0x70, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09,\n\t0x48, 0x00, 0x52, 0x09, 0x74, 0x79, 0x70, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x24, 0x0a,\n\t0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65,\n\t0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x04, 0x74,\n\t0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72,\n\t0x72, 0x6f, 0x72, 0x12, 0x42, 0x0a, 0x0d, 0x61, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f,\n\t0x74, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x6c,\n\t0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x41, 0x62, 0x73, 0x74, 0x72,\n\t0x61, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x62, 0x73, 0x74, 0x72,\n\t0x61, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x37, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x54,\n\t0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x09, 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70,\n\t0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x65, 0x6c, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65,\n\t0x1a, 0x63, 0x0a, 0x07, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x08, 0x6b,\n\t0x65, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e,\n\t0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x6b,\n\t0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2d, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f,\n\t0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c,\n\t0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x6c, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,\n\t0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f,\n\t0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c,\n\t0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x75,\n\t0x6c, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79,\n\t0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e,\n\t0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x61, 0x72, 0x67, 0x54, 0x79,\n\t0x70, 0x65, 0x73, 0x1a, 0x5b, 0x0a, 0x0c, 0x41, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54,\n\t0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x61, 0x6d,\n\t0x65, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65,\n\t0x52, 0x0e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x73,\n\t0x22, 0x73, 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x54, 0x79, 0x70,\n\t0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x49, 0x4d, 0x49, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x54,\n\t0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10,\n\t0x00, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x49,\n\t0x4e, 0x54, 0x36, 0x34, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34,\n\t0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x04, 0x12, 0x0a,\n\t0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x59,\n\t0x54, 0x45, 0x53, 0x10, 0x06, 0x22, 0x56, 0x0a, 0x0d, 0x57, 0x65, 0x6c, 0x6c, 0x4b, 0x6e, 0x6f,\n\t0x77, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x57, 0x45, 0x4c, 0x4c, 0x5f, 0x4b,\n\t0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43,\n\t0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01,\n\t0x12, 0x0d, 0x0a, 0x09, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x10, 0x02, 0x12,\n\t0x0c, 0x0a, 0x08, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x42, 0x0b, 0x0a,\n\t0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xc2, 0x04, 0x0a, 0x04, 0x44,\n\t0x65, 0x63, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x69, 0x64, 0x65, 0x6e, 0x74,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70,\n\t0x72, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x63, 0x6c,\n\t0x48, 0x00, 0x52, 0x05, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x08, 0x66, 0x75, 0x6e,\n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65,\n\t0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x2e, 0x46, 0x75, 0x6e, 0x63,\n\t0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x63, 0x6c, 0x48, 0x00, 0x52, 0x08, 0x66, 0x75, 0x6e, 0x63,\n\t0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x6b, 0x0a, 0x09, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x63,\n\t0x6c, 0x12, 0x22, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52,\n\t0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e,\n\t0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12,\n\t0x10, 0x0a, 0x03, 0x64, 0x6f, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x6f,\n\t0x63, 0x1a, 0xbe, 0x02, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65,\n\t0x63, 0x6c, 0x12, 0x42, 0x0a, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18,\n\t0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72,\n\t0x2e, 0x44, 0x65, 0x63, 0x6c, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65,\n\t0x63, 0x6c, 0x2e, 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x09, 0x6f, 0x76, 0x65,\n\t0x72, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x1a, 0xe9, 0x01, 0x0a, 0x08, 0x4f, 0x76, 0x65, 0x72, 0x6c,\n\t0x6f, 0x61, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x5f,\n\t0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f,\n\t0x61, 0x64, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e,\n\t0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1f, 0x0a, 0x0b,\n\t0x74, 0x79, 0x70, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,\n\t0x09, 0x52, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2f, 0x0a,\n\t0x0b, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79,\n\t0x70, 0x65, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x30,\n\t0x0a, 0x14, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x75,\n\t0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73,\n\t0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,\n\t0x12, 0x10, 0x0a, 0x03, 0x64, 0x6f, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64,\n\t0x6f, 0x63, 0x42, 0x0b, 0x0a, 0x09, 0x64, 0x65, 0x63, 0x6c, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x22,\n\t0x6a, 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18,\n\t0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x49,\n\t0x64, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x12, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x73,\n\t0x74, 0x61, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2c, 0x0a, 0x0c, 0x64,\n\t0x65, 0x76, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x42, 0x09, 0x44, 0x65, 0x63,\n\t0x6c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x0c, 0x63, 0x65, 0x6c, 0x2e, 0x64, 0x65,\n\t0x76, 0x2f, 0x65, 0x78, 0x70, 0x72, 0xf8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_cel_expr_checked_proto_rawDescOnce sync.Once\n\tfile_cel_expr_checked_proto_rawDescData = file_cel_expr_checked_proto_rawDesc\n)\n\nfunc file_cel_expr_checked_proto_rawDescGZIP() []byte {\n\tfile_cel_expr_checked_proto_rawDescOnce.Do(func() {\n\t\tfile_cel_expr_checked_proto_rawDescData = protoimpl.X.CompressGZIP(file_cel_expr_checked_proto_rawDescData)\n\t})\n\treturn file_cel_expr_checked_proto_rawDescData\n}\n\nvar file_cel_expr_checked_proto_enumTypes = make([]protoimpl.EnumInfo, 2)\nvar file_cel_expr_checked_proto_msgTypes = make([]protoimpl.MessageInfo, 13)\nvar file_cel_expr_checked_proto_goTypes = []interface{}{\n\t(Type_PrimitiveType)(0),            // 0: cel.expr.Type.PrimitiveType\n\t(Type_WellKnownType)(0),            // 1: cel.expr.Type.WellKnownType\n\t(*CheckedExpr)(nil),                // 2: cel.expr.CheckedExpr\n\t(*Type)(nil),                       // 3: cel.expr.Type\n\t(*Decl)(nil),                       // 4: cel.expr.Decl\n\t(*Reference)(nil),                  // 5: cel.expr.Reference\n\tnil,                                // 6: cel.expr.CheckedExpr.ReferenceMapEntry\n\tnil,                                // 7: cel.expr.CheckedExpr.TypeMapEntry\n\t(*Type_ListType)(nil),              // 8: cel.expr.Type.ListType\n\t(*Type_MapType)(nil),               // 9: cel.expr.Type.MapType\n\t(*Type_FunctionType)(nil),          // 10: cel.expr.Type.FunctionType\n\t(*Type_AbstractType)(nil),          // 11: cel.expr.Type.AbstractType\n\t(*Decl_IdentDecl)(nil),             // 12: cel.expr.Decl.IdentDecl\n\t(*Decl_FunctionDecl)(nil),          // 13: cel.expr.Decl.FunctionDecl\n\t(*Decl_FunctionDecl_Overload)(nil), // 14: cel.expr.Decl.FunctionDecl.Overload\n\t(*SourceInfo)(nil),                 // 15: cel.expr.SourceInfo\n\t(*Expr)(nil),                       // 16: cel.expr.Expr\n\t(*emptypb.Empty)(nil),              // 17: google.protobuf.Empty\n\t(structpb.NullValue)(0),            // 18: google.protobuf.NullValue\n\t(*Constant)(nil),                   // 19: cel.expr.Constant\n}\nvar file_cel_expr_checked_proto_depIdxs = []int32{\n\t6,  // 0: cel.expr.CheckedExpr.reference_map:type_name -> cel.expr.CheckedExpr.ReferenceMapEntry\n\t7,  // 1: cel.expr.CheckedExpr.type_map:type_name -> cel.expr.CheckedExpr.TypeMapEntry\n\t15, // 2: cel.expr.CheckedExpr.source_info:type_name -> cel.expr.SourceInfo\n\t16, // 3: cel.expr.CheckedExpr.expr:type_name -> cel.expr.Expr\n\t17, // 4: cel.expr.Type.dyn:type_name -> google.protobuf.Empty\n\t18, // 5: cel.expr.Type.null:type_name -> google.protobuf.NullValue\n\t0,  // 6: cel.expr.Type.primitive:type_name -> cel.expr.Type.PrimitiveType\n\t0,  // 7: cel.expr.Type.wrapper:type_name -> cel.expr.Type.PrimitiveType\n\t1,  // 8: cel.expr.Type.well_known:type_name -> cel.expr.Type.WellKnownType\n\t8,  // 9: cel.expr.Type.list_type:type_name -> cel.expr.Type.ListType\n\t9,  // 10: cel.expr.Type.map_type:type_name -> cel.expr.Type.MapType\n\t10, // 11: cel.expr.Type.function:type_name -> cel.expr.Type.FunctionType\n\t3,  // 12: cel.expr.Type.type:type_name -> cel.expr.Type\n\t17, // 13: cel.expr.Type.error:type_name -> google.protobuf.Empty\n\t11, // 14: cel.expr.Type.abstract_type:type_name -> cel.expr.Type.AbstractType\n\t12, // 15: cel.expr.Decl.ident:type_name -> cel.expr.Decl.IdentDecl\n\t13, // 16: cel.expr.Decl.function:type_name -> cel.expr.Decl.FunctionDecl\n\t19, // 17: cel.expr.Reference.value:type_name -> cel.expr.Constant\n\t5,  // 18: cel.expr.CheckedExpr.ReferenceMapEntry.value:type_name -> cel.expr.Reference\n\t3,  // 19: cel.expr.CheckedExpr.TypeMapEntry.value:type_name -> cel.expr.Type\n\t3,  // 20: cel.expr.Type.ListType.elem_type:type_name -> cel.expr.Type\n\t3,  // 21: cel.expr.Type.MapType.key_type:type_name -> cel.expr.Type\n\t3,  // 22: cel.expr.Type.MapType.value_type:type_name -> cel.expr.Type\n\t3,  // 23: cel.expr.Type.FunctionType.result_type:type_name -> cel.expr.Type\n\t3,  // 24: cel.expr.Type.FunctionType.arg_types:type_name -> cel.expr.Type\n\t3,  // 25: cel.expr.Type.AbstractType.parameter_types:type_name -> cel.expr.Type\n\t3,  // 26: cel.expr.Decl.IdentDecl.type:type_name -> cel.expr.Type\n\t19, // 27: cel.expr.Decl.IdentDecl.value:type_name -> cel.expr.Constant\n\t14, // 28: cel.expr.Decl.FunctionDecl.overloads:type_name -> cel.expr.Decl.FunctionDecl.Overload\n\t3,  // 29: cel.expr.Decl.FunctionDecl.Overload.params:type_name -> cel.expr.Type\n\t3,  // 30: cel.expr.Decl.FunctionDecl.Overload.result_type:type_name -> cel.expr.Type\n\t31, // [31:31] is the sub-list for method output_type\n\t31, // [31:31] is the sub-list for method input_type\n\t31, // [31:31] is the sub-list for extension type_name\n\t31, // [31:31] is the sub-list for extension extendee\n\t0,  // [0:31] is the sub-list for field type_name\n}\n\nfunc init() { file_cel_expr_checked_proto_init() }\nfunc file_cel_expr_checked_proto_init() {\n\tif File_cel_expr_checked_proto != nil {\n\t\treturn\n\t}\n\tfile_cel_expr_syntax_proto_init()\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cel_expr_checked_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*CheckedExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_checked_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Type); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_checked_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Decl); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_checked_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Reference); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_checked_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Type_ListType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_checked_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Type_MapType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_checked_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Type_FunctionType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_checked_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Type_AbstractType); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_checked_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Decl_IdentDecl); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_checked_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Decl_FunctionDecl); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_checked_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Decl_FunctionDecl_Overload); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_cel_expr_checked_proto_msgTypes[1].OneofWrappers = []interface{}{\n\t\t(*Type_Dyn)(nil),\n\t\t(*Type_Null)(nil),\n\t\t(*Type_Primitive)(nil),\n\t\t(*Type_Wrapper)(nil),\n\t\t(*Type_WellKnown)(nil),\n\t\t(*Type_ListType_)(nil),\n\t\t(*Type_MapType_)(nil),\n\t\t(*Type_Function)(nil),\n\t\t(*Type_MessageType)(nil),\n\t\t(*Type_TypeParam)(nil),\n\t\t(*Type_Type)(nil),\n\t\t(*Type_Error)(nil),\n\t\t(*Type_AbstractType_)(nil),\n\t}\n\tfile_cel_expr_checked_proto_msgTypes[2].OneofWrappers = []interface{}{\n\t\t(*Decl_Ident)(nil),\n\t\t(*Decl_Function)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cel_expr_checked_proto_rawDesc,\n\t\t\tNumEnums:      2,\n\t\t\tNumMessages:   13,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_cel_expr_checked_proto_goTypes,\n\t\tDependencyIndexes: file_cel_expr_checked_proto_depIdxs,\n\t\tEnumInfos:         file_cel_expr_checked_proto_enumTypes,\n\t\tMessageInfos:      file_cel_expr_checked_proto_msgTypes,\n\t}.Build()\n\tFile_cel_expr_checked_proto = out.File\n\tfile_cel_expr_checked_proto_rawDesc = nil\n\tfile_cel_expr_checked_proto_goTypes = nil\n\tfile_cel_expr_checked_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cel.dev/expr/cloudbuild.yaml",
    "content": "steps:\n- name: 'gcr.io/cloud-builders/bazel:7.3.2'\n  entrypoint: bazel\n  args: ['build', '...']\n  id: bazel-build\n  waitFor: ['-']\ntimeout: 15m\noptions:\n  machineType: 'N1_HIGHCPU_32'\n"
  },
  {
    "path": "vendor/cel.dev/expr/eval.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.36.3\n// \tprotoc        v5.27.1\n// source: cel/expr/eval.proto\n\npackage expr\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tanypb \"google.golang.org/protobuf/types/known/anypb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype EvalState struct {\n\tstate         protoimpl.MessageState `protogen:\"open.v1\"`\n\tValues        []*ExprValue           `protobuf:\"bytes,1,rep,name=values,proto3\" json:\"values,omitempty\"`\n\tResults       []*EvalState_Result    `protobuf:\"bytes,3,rep,name=results,proto3\" json:\"results,omitempty\"`\n\tunknownFields protoimpl.UnknownFields\n\tsizeCache     protoimpl.SizeCache\n}\n\nfunc (x *EvalState) Reset() {\n\t*x = EvalState{}\n\tmi := &file_cel_expr_eval_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *EvalState) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EvalState) ProtoMessage() {}\n\nfunc (x *EvalState) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_eval_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EvalState.ProtoReflect.Descriptor instead.\nfunc (*EvalState) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_eval_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *EvalState) GetValues() []*ExprValue {\n\tif x != nil {\n\t\treturn x.Values\n\t}\n\treturn nil\n}\n\nfunc (x *EvalState) GetResults() []*EvalState_Result {\n\tif x != nil {\n\t\treturn x.Results\n\t}\n\treturn nil\n}\n\ntype ExprValue struct {\n\tstate protoimpl.MessageState `protogen:\"open.v1\"`\n\t// Types that are valid to be assigned to Kind:\n\t//\n\t//\t*ExprValue_Value\n\t//\t*ExprValue_Error\n\t//\t*ExprValue_Unknown\n\tKind          isExprValue_Kind `protobuf_oneof:\"kind\"`\n\tunknownFields protoimpl.UnknownFields\n\tsizeCache     protoimpl.SizeCache\n}\n\nfunc (x *ExprValue) Reset() {\n\t*x = ExprValue{}\n\tmi := &file_cel_expr_eval_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ExprValue) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ExprValue) ProtoMessage() {}\n\nfunc (x *ExprValue) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_eval_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ExprValue.ProtoReflect.Descriptor instead.\nfunc (*ExprValue) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_eval_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *ExprValue) GetKind() isExprValue_Kind {\n\tif x != nil {\n\t\treturn x.Kind\n\t}\n\treturn nil\n}\n\nfunc (x *ExprValue) GetValue() *Value {\n\tif x != nil {\n\t\tif x, ok := x.Kind.(*ExprValue_Value); ok {\n\t\t\treturn x.Value\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (x *ExprValue) GetError() *ErrorSet {\n\tif x != nil {\n\t\tif x, ok := x.Kind.(*ExprValue_Error); ok {\n\t\t\treturn x.Error\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (x *ExprValue) GetUnknown() *UnknownSet {\n\tif x != nil {\n\t\tif x, ok := x.Kind.(*ExprValue_Unknown); ok {\n\t\t\treturn x.Unknown\n\t\t}\n\t}\n\treturn nil\n}\n\ntype isExprValue_Kind interface {\n\tisExprValue_Kind()\n}\n\ntype ExprValue_Value struct {\n\tValue *Value `protobuf:\"bytes,1,opt,name=value,proto3,oneof\"`\n}\n\ntype ExprValue_Error struct {\n\tError *ErrorSet `protobuf:\"bytes,2,opt,name=error,proto3,oneof\"`\n}\n\ntype ExprValue_Unknown struct {\n\tUnknown *UnknownSet `protobuf:\"bytes,3,opt,name=unknown,proto3,oneof\"`\n}\n\nfunc (*ExprValue_Value) isExprValue_Kind() {}\n\nfunc (*ExprValue_Error) isExprValue_Kind() {}\n\nfunc (*ExprValue_Unknown) isExprValue_Kind() {}\n\ntype ErrorSet struct {\n\tstate         protoimpl.MessageState `protogen:\"open.v1\"`\n\tErrors        []*Status              `protobuf:\"bytes,1,rep,name=errors,proto3\" json:\"errors,omitempty\"`\n\tunknownFields protoimpl.UnknownFields\n\tsizeCache     protoimpl.SizeCache\n}\n\nfunc (x *ErrorSet) Reset() {\n\t*x = ErrorSet{}\n\tmi := &file_cel_expr_eval_proto_msgTypes[2]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ErrorSet) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ErrorSet) ProtoMessage() {}\n\nfunc (x *ErrorSet) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_eval_proto_msgTypes[2]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ErrorSet.ProtoReflect.Descriptor instead.\nfunc (*ErrorSet) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_eval_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ErrorSet) GetErrors() []*Status {\n\tif x != nil {\n\t\treturn x.Errors\n\t}\n\treturn nil\n}\n\ntype Status struct {\n\tstate         protoimpl.MessageState `protogen:\"open.v1\"`\n\tCode          int32                  `protobuf:\"varint,1,opt,name=code,proto3\" json:\"code,omitempty\"`\n\tMessage       string                 `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n\tDetails       []*anypb.Any           `protobuf:\"bytes,3,rep,name=details,proto3\" json:\"details,omitempty\"`\n\tunknownFields protoimpl.UnknownFields\n\tsizeCache     protoimpl.SizeCache\n}\n\nfunc (x *Status) Reset() {\n\t*x = Status{}\n\tmi := &file_cel_expr_eval_proto_msgTypes[3]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Status) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Status) ProtoMessage() {}\n\nfunc (x *Status) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_eval_proto_msgTypes[3]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Status.ProtoReflect.Descriptor instead.\nfunc (*Status) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_eval_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *Status) GetCode() int32 {\n\tif x != nil {\n\t\treturn x.Code\n\t}\n\treturn 0\n}\n\nfunc (x *Status) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\nfunc (x *Status) GetDetails() []*anypb.Any {\n\tif x != nil {\n\t\treturn x.Details\n\t}\n\treturn nil\n}\n\ntype UnknownSet struct {\n\tstate         protoimpl.MessageState `protogen:\"open.v1\"`\n\tExprs         []int64                `protobuf:\"varint,1,rep,packed,name=exprs,proto3\" json:\"exprs,omitempty\"`\n\tunknownFields protoimpl.UnknownFields\n\tsizeCache     protoimpl.SizeCache\n}\n\nfunc (x *UnknownSet) Reset() {\n\t*x = UnknownSet{}\n\tmi := &file_cel_expr_eval_proto_msgTypes[4]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UnknownSet) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UnknownSet) ProtoMessage() {}\n\nfunc (x *UnknownSet) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_eval_proto_msgTypes[4]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UnknownSet.ProtoReflect.Descriptor instead.\nfunc (*UnknownSet) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_eval_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *UnknownSet) GetExprs() []int64 {\n\tif x != nil {\n\t\treturn x.Exprs\n\t}\n\treturn nil\n}\n\ntype EvalState_Result struct {\n\tstate         protoimpl.MessageState `protogen:\"open.v1\"`\n\tExpr          int64                  `protobuf:\"varint,1,opt,name=expr,proto3\" json:\"expr,omitempty\"`\n\tValue         int64                  `protobuf:\"varint,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n\tunknownFields protoimpl.UnknownFields\n\tsizeCache     protoimpl.SizeCache\n}\n\nfunc (x *EvalState_Result) Reset() {\n\t*x = EvalState_Result{}\n\tmi := &file_cel_expr_eval_proto_msgTypes[5]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *EvalState_Result) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EvalState_Result) ProtoMessage() {}\n\nfunc (x *EvalState_Result) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_eval_proto_msgTypes[5]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EvalState_Result.ProtoReflect.Descriptor instead.\nfunc (*EvalState_Result) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_eval_proto_rawDescGZIP(), []int{0, 0}\n}\n\nfunc (x *EvalState_Result) GetExpr() int64 {\n\tif x != nil {\n\t\treturn x.Expr\n\t}\n\treturn 0\n}\n\nfunc (x *EvalState_Result) GetValue() int64 {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn 0\n}\n\nvar File_cel_expr_eval_proto protoreflect.FileDescriptor\n\nvar file_cel_expr_eval_proto_rawDesc = []byte{\n\t0x0a, 0x13, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x65, 0x76, 0x61, 0x6c, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x1a,\n\t0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x14, 0x63, 0x65, 0x6c, 0x2f,\n\t0x65, 0x78, 0x70, 0x72, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x22, 0xa2, 0x01, 0x0a, 0x09, 0x45, 0x76, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2b,\n\t0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13,\n\t0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x72,\n\t0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63,\n\t0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74,\n\t0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,\n\t0x73, 0x1a, 0x32, 0x0a, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65,\n\t0x78, 0x70, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x65, 0x78, 0x70, 0x72, 0x12,\n\t0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05,\n\t0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x09, 0x45, 0x78, 0x70, 0x72, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x12, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2a, 0x0a, 0x05,\n\t0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x65,\n\t0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x48,\n\t0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x75, 0x6e, 0x6b, 0x6e,\n\t0x6f, 0x77, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x65, 0x6c, 0x2e,\n\t0x65, 0x78, 0x70, 0x72, 0x2e, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x74, 0x48,\n\t0x00, 0x52, 0x07, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69,\n\t0x6e, 0x64, 0x22, 0x34, 0x0a, 0x08, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x12, 0x28,\n\t0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10,\n\t0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,\n\t0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x66, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74,\n\t0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05,\n\t0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,\n\t0x12, 0x2e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,\n\t0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73,\n\t0x22, 0x22, 0x0a, 0x0a, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x14,\n\t0x0a, 0x05, 0x65, 0x78, 0x70, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x05, 0x65,\n\t0x78, 0x70, 0x72, 0x73, 0x42, 0x2c, 0x0a, 0x0c, 0x64, 0x65, 0x76, 0x2e, 0x63, 0x65, 0x6c, 0x2e,\n\t0x65, 0x78, 0x70, 0x72, 0x42, 0x09, 0x45, 0x76, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50,\n\t0x01, 0x5a, 0x0c, 0x63, 0x65, 0x6c, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x65, 0x78, 0x70, 0x72, 0xf8,\n\t0x01, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cel_expr_eval_proto_rawDescOnce sync.Once\n\tfile_cel_expr_eval_proto_rawDescData = file_cel_expr_eval_proto_rawDesc\n)\n\nfunc file_cel_expr_eval_proto_rawDescGZIP() []byte {\n\tfile_cel_expr_eval_proto_rawDescOnce.Do(func() {\n\t\tfile_cel_expr_eval_proto_rawDescData = protoimpl.X.CompressGZIP(file_cel_expr_eval_proto_rawDescData)\n\t})\n\treturn file_cel_expr_eval_proto_rawDescData\n}\n\nvar file_cel_expr_eval_proto_msgTypes = make([]protoimpl.MessageInfo, 6)\nvar file_cel_expr_eval_proto_goTypes = []any{\n\t(*EvalState)(nil),        // 0: cel.expr.EvalState\n\t(*ExprValue)(nil),        // 1: cel.expr.ExprValue\n\t(*ErrorSet)(nil),         // 2: cel.expr.ErrorSet\n\t(*Status)(nil),           // 3: cel.expr.Status\n\t(*UnknownSet)(nil),       // 4: cel.expr.UnknownSet\n\t(*EvalState_Result)(nil), // 5: cel.expr.EvalState.Result\n\t(*Value)(nil),            // 6: cel.expr.Value\n\t(*anypb.Any)(nil),        // 7: google.protobuf.Any\n}\nvar file_cel_expr_eval_proto_depIdxs = []int32{\n\t1, // 0: cel.expr.EvalState.values:type_name -> cel.expr.ExprValue\n\t5, // 1: cel.expr.EvalState.results:type_name -> cel.expr.EvalState.Result\n\t6, // 2: cel.expr.ExprValue.value:type_name -> cel.expr.Value\n\t2, // 3: cel.expr.ExprValue.error:type_name -> cel.expr.ErrorSet\n\t4, // 4: cel.expr.ExprValue.unknown:type_name -> cel.expr.UnknownSet\n\t3, // 5: cel.expr.ErrorSet.errors:type_name -> cel.expr.Status\n\t7, // 6: cel.expr.Status.details:type_name -> google.protobuf.Any\n\t7, // [7:7] is the sub-list for method output_type\n\t7, // [7:7] is the sub-list for method input_type\n\t7, // [7:7] is the sub-list for extension type_name\n\t7, // [7:7] is the sub-list for extension extendee\n\t0, // [0:7] is the sub-list for field type_name\n}\n\nfunc init() { file_cel_expr_eval_proto_init() }\nfunc file_cel_expr_eval_proto_init() {\n\tif File_cel_expr_eval_proto != nil {\n\t\treturn\n\t}\n\tfile_cel_expr_value_proto_init()\n\tfile_cel_expr_eval_proto_msgTypes[1].OneofWrappers = []any{\n\t\t(*ExprValue_Value)(nil),\n\t\t(*ExprValue_Error)(nil),\n\t\t(*ExprValue_Unknown)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cel_expr_eval_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   6,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_cel_expr_eval_proto_goTypes,\n\t\tDependencyIndexes: file_cel_expr_eval_proto_depIdxs,\n\t\tMessageInfos:      file_cel_expr_eval_proto_msgTypes,\n\t}.Build()\n\tFile_cel_expr_eval_proto = out.File\n\tfile_cel_expr_eval_proto_rawDesc = nil\n\tfile_cel_expr_eval_proto_goTypes = nil\n\tfile_cel_expr_eval_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cel.dev/expr/explain.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v3.21.5\n// source: cel/expr/explain.proto\n\npackage expr\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// Deprecated: Do not use.\ntype Explain struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tValues    []*Value            `protobuf:\"bytes,1,rep,name=values,proto3\" json:\"values,omitempty\"`\n\tExprSteps []*Explain_ExprStep `protobuf:\"bytes,2,rep,name=expr_steps,json=exprSteps,proto3\" json:\"expr_steps,omitempty\"`\n}\n\nfunc (x *Explain) Reset() {\n\t*x = Explain{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_explain_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Explain) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Explain) ProtoMessage() {}\n\nfunc (x *Explain) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_explain_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Explain.ProtoReflect.Descriptor instead.\nfunc (*Explain) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_explain_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Explain) GetValues() []*Value {\n\tif x != nil {\n\t\treturn x.Values\n\t}\n\treturn nil\n}\n\nfunc (x *Explain) GetExprSteps() []*Explain_ExprStep {\n\tif x != nil {\n\t\treturn x.ExprSteps\n\t}\n\treturn nil\n}\n\ntype Explain_ExprStep struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId         int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tValueIndex int32 `protobuf:\"varint,2,opt,name=value_index,json=valueIndex,proto3\" json:\"value_index,omitempty\"`\n}\n\nfunc (x *Explain_ExprStep) Reset() {\n\t*x = Explain_ExprStep{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_explain_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Explain_ExprStep) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Explain_ExprStep) ProtoMessage() {}\n\nfunc (x *Explain_ExprStep) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_explain_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Explain_ExprStep.ProtoReflect.Descriptor instead.\nfunc (*Explain_ExprStep) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_explain_proto_rawDescGZIP(), []int{0, 0}\n}\n\nfunc (x *Explain_ExprStep) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (x *Explain_ExprStep) GetValueIndex() int32 {\n\tif x != nil {\n\t\treturn x.ValueIndex\n\t}\n\treturn 0\n}\n\nvar File_cel_expr_explain_proto protoreflect.FileDescriptor\n\nvar file_cel_expr_explain_proto_rawDesc = []byte{\n\t0x0a, 0x16, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x65, 0x78, 0x70, 0x6c, 0x61,\n\t0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78,\n\t0x70, 0x72, 0x1a, 0x14, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x76, 0x61, 0x6c,\n\t0x75, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xae, 0x01, 0x0a, 0x07, 0x45, 0x78, 0x70,\n\t0x6c, 0x61, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x39, 0x0a,\n\t0x0a, 0x65, 0x78, 0x70, 0x72, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,\n\t0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70,\n\t0x6c, 0x61, 0x69, 0x6e, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x53, 0x74, 0x65, 0x70, 0x52, 0x09, 0x65,\n\t0x78, 0x70, 0x72, 0x53, 0x74, 0x65, 0x70, 0x73, 0x1a, 0x3b, 0x0a, 0x08, 0x45, 0x78, 0x70, 0x72,\n\t0x53, 0x74, 0x65, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,\n\t0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x69, 0x6e,\n\t0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x49, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x02, 0x18, 0x01, 0x42, 0x2f, 0x0a, 0x0c, 0x64, 0x65, 0x76,\n\t0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x42, 0x0c, 0x45, 0x78, 0x70, 0x6c, 0x61,\n\t0x69, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x0c, 0x63, 0x65, 0x6c, 0x2e, 0x64,\n\t0x65, 0x76, 0x2f, 0x65, 0x78, 0x70, 0x72, 0xf8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x33,\n}\n\nvar (\n\tfile_cel_expr_explain_proto_rawDescOnce sync.Once\n\tfile_cel_expr_explain_proto_rawDescData = file_cel_expr_explain_proto_rawDesc\n)\n\nfunc file_cel_expr_explain_proto_rawDescGZIP() []byte {\n\tfile_cel_expr_explain_proto_rawDescOnce.Do(func() {\n\t\tfile_cel_expr_explain_proto_rawDescData = protoimpl.X.CompressGZIP(file_cel_expr_explain_proto_rawDescData)\n\t})\n\treturn file_cel_expr_explain_proto_rawDescData\n}\n\nvar file_cel_expr_explain_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_cel_expr_explain_proto_goTypes = []interface{}{\n\t(*Explain)(nil),          // 0: cel.expr.Explain\n\t(*Explain_ExprStep)(nil), // 1: cel.expr.Explain.ExprStep\n\t(*Value)(nil),            // 2: cel.expr.Value\n}\nvar file_cel_expr_explain_proto_depIdxs = []int32{\n\t2, // 0: cel.expr.Explain.values:type_name -> cel.expr.Value\n\t1, // 1: cel.expr.Explain.expr_steps:type_name -> cel.expr.Explain.ExprStep\n\t2, // [2:2] is the sub-list for method output_type\n\t2, // [2:2] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_cel_expr_explain_proto_init() }\nfunc file_cel_expr_explain_proto_init() {\n\tif File_cel_expr_explain_proto != nil {\n\t\treturn\n\t}\n\tfile_cel_expr_value_proto_init()\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cel_expr_explain_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Explain); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_explain_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Explain_ExprStep); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cel_expr_explain_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_cel_expr_explain_proto_goTypes,\n\t\tDependencyIndexes: file_cel_expr_explain_proto_depIdxs,\n\t\tMessageInfos:      file_cel_expr_explain_proto_msgTypes,\n\t}.Build()\n\tFile_cel_expr_explain_proto = out.File\n\tfile_cel_expr_explain_proto_rawDesc = nil\n\tfile_cel_expr_explain_proto_goTypes = nil\n\tfile_cel_expr_explain_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cel.dev/expr/regen_go_proto.sh",
    "content": "#!/bin/sh\nbazel build //proto/cel/expr/conformance/...\nfiles=($(bazel aquery 'kind(proto, //proto/cel/expr/conformance/...)' | grep Outputs | grep \"[.]pb[.]go\" | sed 's/Outputs: \\[//' | sed 's/\\]//' | tr \",\" \"\\n\"))\nfor src in ${files[@]};\ndo\n  dst=$(echo $src | sed 's/\\(.*\\/cel.dev\\/expr\\/\\(.*\\)\\)/\\2/')\n  echo \"copying $dst\"\n  $(cp $src $dst)\ndone\n"
  },
  {
    "path": "vendor/cel.dev/expr/regen_go_proto_canonical_protos.sh",
    "content": "#!/usr/bin/env bash\nbazel build //proto/cel/expr:all\n\nrm -vf ./*.pb.go\n\nfiles=( $(bazel cquery //proto/cel/expr:expr_go_proto --output=starlark --starlark:expr=\"'\\n'.join([f.path for f in target.output_groups.go_generated_srcs.to_list()])\") )\nfor src in \"${files[@]}\";\ndo\n  cp -v \"${src}\" ./\ndone\n"
  },
  {
    "path": "vendor/cel.dev/expr/syntax.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v3.21.5\n// source: cel/expr/syntax.proto\n\npackage expr\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdurationpb \"google.golang.org/protobuf/types/known/durationpb\"\n\tstructpb \"google.golang.org/protobuf/types/known/structpb\"\n\ttimestamppb \"google.golang.org/protobuf/types/known/timestamppb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype SourceInfo_Extension_Component int32\n\nconst (\n\tSourceInfo_Extension_COMPONENT_UNSPECIFIED  SourceInfo_Extension_Component = 0\n\tSourceInfo_Extension_COMPONENT_PARSER       SourceInfo_Extension_Component = 1\n\tSourceInfo_Extension_COMPONENT_TYPE_CHECKER SourceInfo_Extension_Component = 2\n\tSourceInfo_Extension_COMPONENT_RUNTIME      SourceInfo_Extension_Component = 3\n)\n\n// Enum value maps for SourceInfo_Extension_Component.\nvar (\n\tSourceInfo_Extension_Component_name = map[int32]string{\n\t\t0: \"COMPONENT_UNSPECIFIED\",\n\t\t1: \"COMPONENT_PARSER\",\n\t\t2: \"COMPONENT_TYPE_CHECKER\",\n\t\t3: \"COMPONENT_RUNTIME\",\n\t}\n\tSourceInfo_Extension_Component_value = map[string]int32{\n\t\t\"COMPONENT_UNSPECIFIED\":  0,\n\t\t\"COMPONENT_PARSER\":       1,\n\t\t\"COMPONENT_TYPE_CHECKER\": 2,\n\t\t\"COMPONENT_RUNTIME\":      3,\n\t}\n)\n\nfunc (x SourceInfo_Extension_Component) Enum() *SourceInfo_Extension_Component {\n\tp := new(SourceInfo_Extension_Component)\n\t*p = x\n\treturn p\n}\n\nfunc (x SourceInfo_Extension_Component) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (SourceInfo_Extension_Component) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_cel_expr_syntax_proto_enumTypes[0].Descriptor()\n}\n\nfunc (SourceInfo_Extension_Component) Type() protoreflect.EnumType {\n\treturn &file_cel_expr_syntax_proto_enumTypes[0]\n}\n\nfunc (x SourceInfo_Extension_Component) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use SourceInfo_Extension_Component.Descriptor instead.\nfunc (SourceInfo_Extension_Component) EnumDescriptor() ([]byte, []int) {\n\treturn file_cel_expr_syntax_proto_rawDescGZIP(), []int{3, 2, 0}\n}\n\ntype ParsedExpr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tExpr       *Expr       `protobuf:\"bytes,2,opt,name=expr,proto3\" json:\"expr,omitempty\"`\n\tSourceInfo *SourceInfo `protobuf:\"bytes,3,opt,name=source_info,json=sourceInfo,proto3\" json:\"source_info,omitempty\"`\n}\n\nfunc (x *ParsedExpr) Reset() {\n\t*x = ParsedExpr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_syntax_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ParsedExpr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ParsedExpr) ProtoMessage() {}\n\nfunc (x *ParsedExpr) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_syntax_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ParsedExpr.ProtoReflect.Descriptor instead.\nfunc (*ParsedExpr) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_syntax_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ParsedExpr) GetExpr() *Expr {\n\tif x != nil {\n\t\treturn x.Expr\n\t}\n\treturn nil\n}\n\nfunc (x *ParsedExpr) GetSourceInfo() *SourceInfo {\n\tif x != nil {\n\t\treturn x.SourceInfo\n\t}\n\treturn nil\n}\n\ntype Expr struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId int64 `protobuf:\"varint,2,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// Types that are assignable to ExprKind:\n\t//\n\t//\t*Expr_ConstExpr\n\t//\t*Expr_IdentExpr\n\t//\t*Expr_SelectExpr\n\t//\t*Expr_CallExpr\n\t//\t*Expr_ListExpr\n\t//\t*Expr_StructExpr\n\t//\t*Expr_ComprehensionExpr\n\tExprKind isExpr_ExprKind `protobuf_oneof:\"expr_kind\"`\n}\n\nfunc (x *Expr) Reset() {\n\t*x = Expr{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_syntax_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Expr) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Expr) ProtoMessage() {}\n\nfunc (x *Expr) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_syntax_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Expr.ProtoReflect.Descriptor instead.\nfunc (*Expr) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_syntax_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Expr) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (m *Expr) GetExprKind() isExpr_ExprKind {\n\tif m != nil {\n\t\treturn m.ExprKind\n\t}\n\treturn nil\n}\n\nfunc (x *Expr) GetConstExpr() *Constant {\n\tif x, ok := x.GetExprKind().(*Expr_ConstExpr); ok {\n\t\treturn x.ConstExpr\n\t}\n\treturn nil\n}\n\nfunc (x *Expr) GetIdentExpr() *Expr_Ident {\n\tif x, ok := x.GetExprKind().(*Expr_IdentExpr); ok {\n\t\treturn x.IdentExpr\n\t}\n\treturn nil\n}\n\nfunc (x *Expr) GetSelectExpr() *Expr_Select {\n\tif x, ok := x.GetExprKind().(*Expr_SelectExpr); ok {\n\t\treturn x.SelectExpr\n\t}\n\treturn nil\n}\n\nfunc (x *Expr) GetCallExpr() *Expr_Call {\n\tif x, ok := x.GetExprKind().(*Expr_CallExpr); ok {\n\t\treturn x.CallExpr\n\t}\n\treturn nil\n}\n\nfunc (x *Expr) GetListExpr() *Expr_CreateList {\n\tif x, ok := x.GetExprKind().(*Expr_ListExpr); ok {\n\t\treturn x.ListExpr\n\t}\n\treturn nil\n}\n\nfunc (x *Expr) GetStructExpr() *Expr_CreateStruct {\n\tif x, ok := x.GetExprKind().(*Expr_StructExpr); ok {\n\t\treturn x.StructExpr\n\t}\n\treturn nil\n}\n\nfunc (x *Expr) GetComprehensionExpr() *Expr_Comprehension {\n\tif x, ok := x.GetExprKind().(*Expr_ComprehensionExpr); ok {\n\t\treturn x.ComprehensionExpr\n\t}\n\treturn nil\n}\n\ntype isExpr_ExprKind interface {\n\tisExpr_ExprKind()\n}\n\ntype Expr_ConstExpr struct {\n\tConstExpr *Constant `protobuf:\"bytes,3,opt,name=const_expr,json=constExpr,proto3,oneof\"`\n}\n\ntype Expr_IdentExpr struct {\n\tIdentExpr *Expr_Ident `protobuf:\"bytes,4,opt,name=ident_expr,json=identExpr,proto3,oneof\"`\n}\n\ntype Expr_SelectExpr struct {\n\tSelectExpr *Expr_Select `protobuf:\"bytes,5,opt,name=select_expr,json=selectExpr,proto3,oneof\"`\n}\n\ntype Expr_CallExpr struct {\n\tCallExpr *Expr_Call `protobuf:\"bytes,6,opt,name=call_expr,json=callExpr,proto3,oneof\"`\n}\n\ntype Expr_ListExpr struct {\n\tListExpr *Expr_CreateList `protobuf:\"bytes,7,opt,name=list_expr,json=listExpr,proto3,oneof\"`\n}\n\ntype Expr_StructExpr struct {\n\tStructExpr *Expr_CreateStruct `protobuf:\"bytes,8,opt,name=struct_expr,json=structExpr,proto3,oneof\"`\n}\n\ntype Expr_ComprehensionExpr struct {\n\tComprehensionExpr *Expr_Comprehension `protobuf:\"bytes,9,opt,name=comprehension_expr,json=comprehensionExpr,proto3,oneof\"`\n}\n\nfunc (*Expr_ConstExpr) isExpr_ExprKind() {}\n\nfunc (*Expr_IdentExpr) isExpr_ExprKind() {}\n\nfunc (*Expr_SelectExpr) isExpr_ExprKind() {}\n\nfunc (*Expr_CallExpr) isExpr_ExprKind() {}\n\nfunc (*Expr_ListExpr) isExpr_ExprKind() {}\n\nfunc (*Expr_StructExpr) isExpr_ExprKind() {}\n\nfunc (*Expr_ComprehensionExpr) isExpr_ExprKind() {}\n\ntype Constant struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to ConstantKind:\n\t//\n\t//\t*Constant_NullValue\n\t//\t*Constant_BoolValue\n\t//\t*Constant_Int64Value\n\t//\t*Constant_Uint64Value\n\t//\t*Constant_DoubleValue\n\t//\t*Constant_StringValue\n\t//\t*Constant_BytesValue\n\t//\t*Constant_DurationValue\n\t//\t*Constant_TimestampValue\n\tConstantKind isConstant_ConstantKind `protobuf_oneof:\"constant_kind\"`\n}\n\nfunc (x *Constant) Reset() {\n\t*x = Constant{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_syntax_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Constant) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Constant) ProtoMessage() {}\n\nfunc (x *Constant) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_syntax_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Constant.ProtoReflect.Descriptor instead.\nfunc (*Constant) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_syntax_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (m *Constant) GetConstantKind() isConstant_ConstantKind {\n\tif m != nil {\n\t\treturn m.ConstantKind\n\t}\n\treturn nil\n}\n\nfunc (x *Constant) GetNullValue() structpb.NullValue {\n\tif x, ok := x.GetConstantKind().(*Constant_NullValue); ok {\n\t\treturn x.NullValue\n\t}\n\treturn structpb.NullValue(0)\n}\n\nfunc (x *Constant) GetBoolValue() bool {\n\tif x, ok := x.GetConstantKind().(*Constant_BoolValue); ok {\n\t\treturn x.BoolValue\n\t}\n\treturn false\n}\n\nfunc (x *Constant) GetInt64Value() int64 {\n\tif x, ok := x.GetConstantKind().(*Constant_Int64Value); ok {\n\t\treturn x.Int64Value\n\t}\n\treturn 0\n}\n\nfunc (x *Constant) GetUint64Value() uint64 {\n\tif x, ok := x.GetConstantKind().(*Constant_Uint64Value); ok {\n\t\treturn x.Uint64Value\n\t}\n\treturn 0\n}\n\nfunc (x *Constant) GetDoubleValue() float64 {\n\tif x, ok := x.GetConstantKind().(*Constant_DoubleValue); ok {\n\t\treturn x.DoubleValue\n\t}\n\treturn 0\n}\n\nfunc (x *Constant) GetStringValue() string {\n\tif x, ok := x.GetConstantKind().(*Constant_StringValue); ok {\n\t\treturn x.StringValue\n\t}\n\treturn \"\"\n}\n\nfunc (x *Constant) GetBytesValue() []byte {\n\tif x, ok := x.GetConstantKind().(*Constant_BytesValue); ok {\n\t\treturn x.BytesValue\n\t}\n\treturn nil\n}\n\n// Deprecated: Do not use.\nfunc (x *Constant) GetDurationValue() *durationpb.Duration {\n\tif x, ok := x.GetConstantKind().(*Constant_DurationValue); ok {\n\t\treturn x.DurationValue\n\t}\n\treturn nil\n}\n\n// Deprecated: Do not use.\nfunc (x *Constant) GetTimestampValue() *timestamppb.Timestamp {\n\tif x, ok := x.GetConstantKind().(*Constant_TimestampValue); ok {\n\t\treturn x.TimestampValue\n\t}\n\treturn nil\n}\n\ntype isConstant_ConstantKind interface {\n\tisConstant_ConstantKind()\n}\n\ntype Constant_NullValue struct {\n\tNullValue structpb.NullValue `protobuf:\"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof\"`\n}\n\ntype Constant_BoolValue struct {\n\tBoolValue bool `protobuf:\"varint,2,opt,name=bool_value,json=boolValue,proto3,oneof\"`\n}\n\ntype Constant_Int64Value struct {\n\tInt64Value int64 `protobuf:\"varint,3,opt,name=int64_value,json=int64Value,proto3,oneof\"`\n}\n\ntype Constant_Uint64Value struct {\n\tUint64Value uint64 `protobuf:\"varint,4,opt,name=uint64_value,json=uint64Value,proto3,oneof\"`\n}\n\ntype Constant_DoubleValue struct {\n\tDoubleValue float64 `protobuf:\"fixed64,5,opt,name=double_value,json=doubleValue,proto3,oneof\"`\n}\n\ntype Constant_StringValue struct {\n\tStringValue string `protobuf:\"bytes,6,opt,name=string_value,json=stringValue,proto3,oneof\"`\n}\n\ntype Constant_BytesValue struct {\n\tBytesValue []byte `protobuf:\"bytes,7,opt,name=bytes_value,json=bytesValue,proto3,oneof\"`\n}\n\ntype Constant_DurationValue struct {\n\t// Deprecated: Do not use.\n\tDurationValue *durationpb.Duration `protobuf:\"bytes,8,opt,name=duration_value,json=durationValue,proto3,oneof\"`\n}\n\ntype Constant_TimestampValue struct {\n\t// Deprecated: Do not use.\n\tTimestampValue *timestamppb.Timestamp `protobuf:\"bytes,9,opt,name=timestamp_value,json=timestampValue,proto3,oneof\"`\n}\n\nfunc (*Constant_NullValue) isConstant_ConstantKind() {}\n\nfunc (*Constant_BoolValue) isConstant_ConstantKind() {}\n\nfunc (*Constant_Int64Value) isConstant_ConstantKind() {}\n\nfunc (*Constant_Uint64Value) isConstant_ConstantKind() {}\n\nfunc (*Constant_DoubleValue) isConstant_ConstantKind() {}\n\nfunc (*Constant_StringValue) isConstant_ConstantKind() {}\n\nfunc (*Constant_BytesValue) isConstant_ConstantKind() {}\n\nfunc (*Constant_DurationValue) isConstant_ConstantKind() {}\n\nfunc (*Constant_TimestampValue) isConstant_ConstantKind() {}\n\ntype SourceInfo struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tSyntaxVersion string                  `protobuf:\"bytes,1,opt,name=syntax_version,json=syntaxVersion,proto3\" json:\"syntax_version,omitempty\"`\n\tLocation      string                  `protobuf:\"bytes,2,opt,name=location,proto3\" json:\"location,omitempty\"`\n\tLineOffsets   []int32                 `protobuf:\"varint,3,rep,packed,name=line_offsets,json=lineOffsets,proto3\" json:\"line_offsets,omitempty\"`\n\tPositions     map[int64]int32         `protobuf:\"bytes,4,rep,name=positions,proto3\" json:\"positions,omitempty\" protobuf_key:\"varint,1,opt,name=key,proto3\" protobuf_val:\"varint,2,opt,name=value,proto3\"`\n\tMacroCalls    map[int64]*Expr         `protobuf:\"bytes,5,rep,name=macro_calls,json=macroCalls,proto3\" json:\"macro_calls,omitempty\" protobuf_key:\"varint,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\tExtensions    []*SourceInfo_Extension `protobuf:\"bytes,6,rep,name=extensions,proto3\" json:\"extensions,omitempty\"`\n}\n\nfunc (x *SourceInfo) Reset() {\n\t*x = SourceInfo{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_syntax_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SourceInfo) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SourceInfo) ProtoMessage() {}\n\nfunc (x *SourceInfo) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_syntax_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SourceInfo.ProtoReflect.Descriptor instead.\nfunc (*SourceInfo) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_syntax_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *SourceInfo) GetSyntaxVersion() string {\n\tif x != nil {\n\t\treturn x.SyntaxVersion\n\t}\n\treturn \"\"\n}\n\nfunc (x *SourceInfo) GetLocation() string {\n\tif x != nil {\n\t\treturn x.Location\n\t}\n\treturn \"\"\n}\n\nfunc (x *SourceInfo) GetLineOffsets() []int32 {\n\tif x != nil {\n\t\treturn x.LineOffsets\n\t}\n\treturn nil\n}\n\nfunc (x *SourceInfo) GetPositions() map[int64]int32 {\n\tif x != nil {\n\t\treturn x.Positions\n\t}\n\treturn nil\n}\n\nfunc (x *SourceInfo) GetMacroCalls() map[int64]*Expr {\n\tif x != nil {\n\t\treturn x.MacroCalls\n\t}\n\treturn nil\n}\n\nfunc (x *SourceInfo) GetExtensions() []*SourceInfo_Extension {\n\tif x != nil {\n\t\treturn x.Extensions\n\t}\n\treturn nil\n}\n\ntype Expr_Ident struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *Expr_Ident) Reset() {\n\t*x = Expr_Ident{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_syntax_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Expr_Ident) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Expr_Ident) ProtoMessage() {}\n\nfunc (x *Expr_Ident) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_syntax_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Expr_Ident.ProtoReflect.Descriptor instead.\nfunc (*Expr_Ident) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 0}\n}\n\nfunc (x *Expr_Ident) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\ntype Expr_Select struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tOperand  *Expr  `protobuf:\"bytes,1,opt,name=operand,proto3\" json:\"operand,omitempty\"`\n\tField    string `protobuf:\"bytes,2,opt,name=field,proto3\" json:\"field,omitempty\"`\n\tTestOnly bool   `protobuf:\"varint,3,opt,name=test_only,json=testOnly,proto3\" json:\"test_only,omitempty\"`\n}\n\nfunc (x *Expr_Select) Reset() {\n\t*x = Expr_Select{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_syntax_proto_msgTypes[5]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Expr_Select) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Expr_Select) ProtoMessage() {}\n\nfunc (x *Expr_Select) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_syntax_proto_msgTypes[5]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Expr_Select.ProtoReflect.Descriptor instead.\nfunc (*Expr_Select) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 1}\n}\n\nfunc (x *Expr_Select) GetOperand() *Expr {\n\tif x != nil {\n\t\treturn x.Operand\n\t}\n\treturn nil\n}\n\nfunc (x *Expr_Select) GetField() string {\n\tif x != nil {\n\t\treturn x.Field\n\t}\n\treturn \"\"\n}\n\nfunc (x *Expr_Select) GetTestOnly() bool {\n\tif x != nil {\n\t\treturn x.TestOnly\n\t}\n\treturn false\n}\n\ntype Expr_Call struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tTarget   *Expr   `protobuf:\"bytes,1,opt,name=target,proto3\" json:\"target,omitempty\"`\n\tFunction string  `protobuf:\"bytes,2,opt,name=function,proto3\" json:\"function,omitempty\"`\n\tArgs     []*Expr `protobuf:\"bytes,3,rep,name=args,proto3\" json:\"args,omitempty\"`\n}\n\nfunc (x *Expr_Call) Reset() {\n\t*x = Expr_Call{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_syntax_proto_msgTypes[6]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Expr_Call) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Expr_Call) ProtoMessage() {}\n\nfunc (x *Expr_Call) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_syntax_proto_msgTypes[6]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Expr_Call.ProtoReflect.Descriptor instead.\nfunc (*Expr_Call) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 2}\n}\n\nfunc (x *Expr_Call) GetTarget() *Expr {\n\tif x != nil {\n\t\treturn x.Target\n\t}\n\treturn nil\n}\n\nfunc (x *Expr_Call) GetFunction() string {\n\tif x != nil {\n\t\treturn x.Function\n\t}\n\treturn \"\"\n}\n\nfunc (x *Expr_Call) GetArgs() []*Expr {\n\tif x != nil {\n\t\treturn x.Args\n\t}\n\treturn nil\n}\n\ntype Expr_CreateList struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tElements        []*Expr `protobuf:\"bytes,1,rep,name=elements,proto3\" json:\"elements,omitempty\"`\n\tOptionalIndices []int32 `protobuf:\"varint,2,rep,packed,name=optional_indices,json=optionalIndices,proto3\" json:\"optional_indices,omitempty\"`\n}\n\nfunc (x *Expr_CreateList) Reset() {\n\t*x = Expr_CreateList{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_syntax_proto_msgTypes[7]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Expr_CreateList) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Expr_CreateList) ProtoMessage() {}\n\nfunc (x *Expr_CreateList) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_syntax_proto_msgTypes[7]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Expr_CreateList.ProtoReflect.Descriptor instead.\nfunc (*Expr_CreateList) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 3}\n}\n\nfunc (x *Expr_CreateList) GetElements() []*Expr {\n\tif x != nil {\n\t\treturn x.Elements\n\t}\n\treturn nil\n}\n\nfunc (x *Expr_CreateList) GetOptionalIndices() []int32 {\n\tif x != nil {\n\t\treturn x.OptionalIndices\n\t}\n\treturn nil\n}\n\ntype Expr_CreateStruct struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMessageName string                     `protobuf:\"bytes,1,opt,name=message_name,json=messageName,proto3\" json:\"message_name,omitempty\"`\n\tEntries     []*Expr_CreateStruct_Entry `protobuf:\"bytes,2,rep,name=entries,proto3\" json:\"entries,omitempty\"`\n}\n\nfunc (x *Expr_CreateStruct) Reset() {\n\t*x = Expr_CreateStruct{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_syntax_proto_msgTypes[8]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Expr_CreateStruct) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Expr_CreateStruct) ProtoMessage() {}\n\nfunc (x *Expr_CreateStruct) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_syntax_proto_msgTypes[8]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Expr_CreateStruct.ProtoReflect.Descriptor instead.\nfunc (*Expr_CreateStruct) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 4}\n}\n\nfunc (x *Expr_CreateStruct) GetMessageName() string {\n\tif x != nil {\n\t\treturn x.MessageName\n\t}\n\treturn \"\"\n}\n\nfunc (x *Expr_CreateStruct) GetEntries() []*Expr_CreateStruct_Entry {\n\tif x != nil {\n\t\treturn x.Entries\n\t}\n\treturn nil\n}\n\ntype Expr_Comprehension struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tIterVar       string `protobuf:\"bytes,1,opt,name=iter_var,json=iterVar,proto3\" json:\"iter_var,omitempty\"`\n\tIterRange     *Expr  `protobuf:\"bytes,2,opt,name=iter_range,json=iterRange,proto3\" json:\"iter_range,omitempty\"`\n\tAccuVar       string `protobuf:\"bytes,3,opt,name=accu_var,json=accuVar,proto3\" json:\"accu_var,omitempty\"`\n\tAccuInit      *Expr  `protobuf:\"bytes,4,opt,name=accu_init,json=accuInit,proto3\" json:\"accu_init,omitempty\"`\n\tLoopCondition *Expr  `protobuf:\"bytes,5,opt,name=loop_condition,json=loopCondition,proto3\" json:\"loop_condition,omitempty\"`\n\tLoopStep      *Expr  `protobuf:\"bytes,6,opt,name=loop_step,json=loopStep,proto3\" json:\"loop_step,omitempty\"`\n\tResult        *Expr  `protobuf:\"bytes,7,opt,name=result,proto3\" json:\"result,omitempty\"`\n}\n\nfunc (x *Expr_Comprehension) Reset() {\n\t*x = Expr_Comprehension{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_syntax_proto_msgTypes[9]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Expr_Comprehension) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Expr_Comprehension) ProtoMessage() {}\n\nfunc (x *Expr_Comprehension) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_syntax_proto_msgTypes[9]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Expr_Comprehension.ProtoReflect.Descriptor instead.\nfunc (*Expr_Comprehension) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 5}\n}\n\nfunc (x *Expr_Comprehension) GetIterVar() string {\n\tif x != nil {\n\t\treturn x.IterVar\n\t}\n\treturn \"\"\n}\n\nfunc (x *Expr_Comprehension) GetIterRange() *Expr {\n\tif x != nil {\n\t\treturn x.IterRange\n\t}\n\treturn nil\n}\n\nfunc (x *Expr_Comprehension) GetAccuVar() string {\n\tif x != nil {\n\t\treturn x.AccuVar\n\t}\n\treturn \"\"\n}\n\nfunc (x *Expr_Comprehension) GetAccuInit() *Expr {\n\tif x != nil {\n\t\treturn x.AccuInit\n\t}\n\treturn nil\n}\n\nfunc (x *Expr_Comprehension) GetLoopCondition() *Expr {\n\tif x != nil {\n\t\treturn x.LoopCondition\n\t}\n\treturn nil\n}\n\nfunc (x *Expr_Comprehension) GetLoopStep() *Expr {\n\tif x != nil {\n\t\treturn x.LoopStep\n\t}\n\treturn nil\n}\n\nfunc (x *Expr_Comprehension) GetResult() *Expr {\n\tif x != nil {\n\t\treturn x.Result\n\t}\n\treturn nil\n}\n\ntype Expr_CreateStruct_Entry struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId int64 `protobuf:\"varint,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// Types that are assignable to KeyKind:\n\t//\n\t//\t*Expr_CreateStruct_Entry_FieldKey\n\t//\t*Expr_CreateStruct_Entry_MapKey\n\tKeyKind       isExpr_CreateStruct_Entry_KeyKind `protobuf_oneof:\"key_kind\"`\n\tValue         *Expr                             `protobuf:\"bytes,4,opt,name=value,proto3\" json:\"value,omitempty\"`\n\tOptionalEntry bool                              `protobuf:\"varint,5,opt,name=optional_entry,json=optionalEntry,proto3\" json:\"optional_entry,omitempty\"`\n}\n\nfunc (x *Expr_CreateStruct_Entry) Reset() {\n\t*x = Expr_CreateStruct_Entry{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_syntax_proto_msgTypes[10]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Expr_CreateStruct_Entry) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Expr_CreateStruct_Entry) ProtoMessage() {}\n\nfunc (x *Expr_CreateStruct_Entry) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_syntax_proto_msgTypes[10]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Expr_CreateStruct_Entry.ProtoReflect.Descriptor instead.\nfunc (*Expr_CreateStruct_Entry) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 4, 0}\n}\n\nfunc (x *Expr_CreateStruct_Entry) GetId() int64 {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn 0\n}\n\nfunc (m *Expr_CreateStruct_Entry) GetKeyKind() isExpr_CreateStruct_Entry_KeyKind {\n\tif m != nil {\n\t\treturn m.KeyKind\n\t}\n\treturn nil\n}\n\nfunc (x *Expr_CreateStruct_Entry) GetFieldKey() string {\n\tif x, ok := x.GetKeyKind().(*Expr_CreateStruct_Entry_FieldKey); ok {\n\t\treturn x.FieldKey\n\t}\n\treturn \"\"\n}\n\nfunc (x *Expr_CreateStruct_Entry) GetMapKey() *Expr {\n\tif x, ok := x.GetKeyKind().(*Expr_CreateStruct_Entry_MapKey); ok {\n\t\treturn x.MapKey\n\t}\n\treturn nil\n}\n\nfunc (x *Expr_CreateStruct_Entry) GetValue() *Expr {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\nfunc (x *Expr_CreateStruct_Entry) GetOptionalEntry() bool {\n\tif x != nil {\n\t\treturn x.OptionalEntry\n\t}\n\treturn false\n}\n\ntype isExpr_CreateStruct_Entry_KeyKind interface {\n\tisExpr_CreateStruct_Entry_KeyKind()\n}\n\ntype Expr_CreateStruct_Entry_FieldKey struct {\n\tFieldKey string `protobuf:\"bytes,2,opt,name=field_key,json=fieldKey,proto3,oneof\"`\n}\n\ntype Expr_CreateStruct_Entry_MapKey struct {\n\tMapKey *Expr `protobuf:\"bytes,3,opt,name=map_key,json=mapKey,proto3,oneof\"`\n}\n\nfunc (*Expr_CreateStruct_Entry_FieldKey) isExpr_CreateStruct_Entry_KeyKind() {}\n\nfunc (*Expr_CreateStruct_Entry_MapKey) isExpr_CreateStruct_Entry_KeyKind() {}\n\ntype SourceInfo_Extension struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tId                 string                           `protobuf:\"bytes,1,opt,name=id,proto3\" json:\"id,omitempty\"`\n\tAffectedComponents []SourceInfo_Extension_Component `protobuf:\"varint,2,rep,packed,name=affected_components,json=affectedComponents,proto3,enum=cel.expr.SourceInfo_Extension_Component\" json:\"affected_components,omitempty\"`\n\tVersion            *SourceInfo_Extension_Version    `protobuf:\"bytes,3,opt,name=version,proto3\" json:\"version,omitempty\"`\n}\n\nfunc (x *SourceInfo_Extension) Reset() {\n\t*x = SourceInfo_Extension{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_syntax_proto_msgTypes[13]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SourceInfo_Extension) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SourceInfo_Extension) ProtoMessage() {}\n\nfunc (x *SourceInfo_Extension) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_syntax_proto_msgTypes[13]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SourceInfo_Extension.ProtoReflect.Descriptor instead.\nfunc (*SourceInfo_Extension) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_syntax_proto_rawDescGZIP(), []int{3, 2}\n}\n\nfunc (x *SourceInfo_Extension) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *SourceInfo_Extension) GetAffectedComponents() []SourceInfo_Extension_Component {\n\tif x != nil {\n\t\treturn x.AffectedComponents\n\t}\n\treturn nil\n}\n\nfunc (x *SourceInfo_Extension) GetVersion() *SourceInfo_Extension_Version {\n\tif x != nil {\n\t\treturn x.Version\n\t}\n\treturn nil\n}\n\ntype SourceInfo_Extension_Version struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tMajor int64 `protobuf:\"varint,1,opt,name=major,proto3\" json:\"major,omitempty\"`\n\tMinor int64 `protobuf:\"varint,2,opt,name=minor,proto3\" json:\"minor,omitempty\"`\n}\n\nfunc (x *SourceInfo_Extension_Version) Reset() {\n\t*x = SourceInfo_Extension_Version{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_syntax_proto_msgTypes[14]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *SourceInfo_Extension_Version) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SourceInfo_Extension_Version) ProtoMessage() {}\n\nfunc (x *SourceInfo_Extension_Version) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_syntax_proto_msgTypes[14]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SourceInfo_Extension_Version.ProtoReflect.Descriptor instead.\nfunc (*SourceInfo_Extension_Version) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_syntax_proto_rawDescGZIP(), []int{3, 2, 0}\n}\n\nfunc (x *SourceInfo_Extension_Version) GetMajor() int64 {\n\tif x != nil {\n\t\treturn x.Major\n\t}\n\treturn 0\n}\n\nfunc (x *SourceInfo_Extension_Version) GetMinor() int64 {\n\tif x != nil {\n\t\treturn x.Minor\n\t}\n\treturn 0\n}\n\nvar File_cel_expr_syntax_proto protoreflect.FileDescriptor\n\nvar file_cel_expr_syntax_proto_rawDesc = []byte{\n\t0x0a, 0x15, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x73, 0x79, 0x6e, 0x74, 0x61,\n\t0x78, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70,\n\t0x72, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x22, 0x67, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x45, 0x78, 0x70, 0x72, 0x12, 0x22,\n\t0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63,\n\t0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x65, 0x78,\n\t0x70, 0x72, 0x12, 0x35, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66,\n\t0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78,\n\t0x70, 0x72, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x73,\n\t0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xfd, 0x0a, 0x0a, 0x04, 0x45, 0x78,\n\t0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02,\n\t0x69, 0x64, 0x12, 0x33, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70,\n\t0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6f,\n\t0x6e, 0x73, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74,\n\t0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x65,\n\t0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x49, 0x64, 0x65, 0x6e,\n\t0x74, 0x48, 0x00, 0x52, 0x09, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x38,\n\t0x0a, 0x0b, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45,\n\t0x78, 0x70, 0x72, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x65,\n\t0x6c, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x32, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c,\n\t0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x65,\n\t0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x61, 0x6c, 0x6c,\n\t0x48, 0x00, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x12, 0x38, 0x0a, 0x09,\n\t0x6c, 0x69, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x19, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x2e,\n\t0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, 0x6c, 0x69,\n\t0x73, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x3e, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74,\n\t0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65,\n\t0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61,\n\t0x74, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x72, 0x75,\n\t0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x4d, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65,\n\t0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x09, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78,\n\t0x70, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,\n\t0x48, 0x00, 0x52, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f,\n\t0x6e, 0x45, 0x78, 0x70, 0x72, 0x1a, 0x1b, 0x0a, 0x05, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x12, 0x12,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x1a, 0x65, 0x0a, 0x06, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x28, 0x0a, 0x07,\n\t0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e,\n\t0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x6f,\n\t0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1b, 0x0a, 0x09,\n\t0x74, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52,\n\t0x08, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x6e, 0x6c, 0x79, 0x1a, 0x6e, 0x0a, 0x04, 0x43, 0x61, 0x6c,\n\t0x6c, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70,\n\t0x72, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6e,\n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6e,\n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45,\n\t0x78, 0x70, 0x72, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x1a, 0x63, 0x0a, 0x0a, 0x43, 0x72, 0x65,\n\t0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x08, 0x65, 0x6c, 0x65, 0x6d, 0x65,\n\t0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e,\n\t0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x08, 0x65, 0x6c, 0x65, 0x6d, 0x65,\n\t0x6e, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f,\n\t0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0f, 0x6f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x1a, 0xab,\n\t0x02, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12,\n\t0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4e, 0x61,\n\t0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45,\n\t0x78, 0x70, 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74,\n\t0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x1a,\n\t0xba, 0x01, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x66, 0x69, 0x65,\n\t0x6c, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08,\n\t0x66, 0x69, 0x65, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x07, 0x6d, 0x61, 0x70, 0x5f,\n\t0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e,\n\t0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x61, 0x70,\n\t0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78,\n\t0x70, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x08, 0x52, 0x0d, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79,\n\t0x42, 0x0a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x1a, 0xad, 0x02, 0x0a,\n\t0x0d, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19,\n\t0x0a, 0x08, 0x69, 0x74, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x07, 0x69, 0x74, 0x65, 0x72, 0x56, 0x61, 0x72, 0x12, 0x2d, 0x0a, 0x0a, 0x69, 0x74, 0x65,\n\t0x72, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e,\n\t0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x09, 0x69,\n\t0x74, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x75,\n\t0x5f, 0x76, 0x61, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x75,\n\t0x56, 0x61, 0x72, 0x12, 0x2b, 0x0a, 0x09, 0x61, 0x63, 0x63, 0x75, 0x5f, 0x69, 0x6e, 0x69, 0x74,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70,\n\t0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x08, 0x61, 0x63, 0x63, 0x75, 0x49, 0x6e, 0x69, 0x74,\n\t0x12, 0x35, 0x0a, 0x0e, 0x6c, 0x6f, 0x6f, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69,\n\t0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65,\n\t0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x0d, 0x6c, 0x6f, 0x6f, 0x70, 0x43, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x09, 0x6c, 0x6f, 0x6f, 0x70, 0x5f,\n\t0x73, 0x74, 0x65, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c,\n\t0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x08, 0x6c, 0x6f, 0x6f, 0x70,\n\t0x53, 0x74, 0x65, 0x70, 0x12, 0x26, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x07,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e,\n\t0x45, 0x78, 0x70, 0x72, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x42, 0x0b, 0x0a, 0x09,\n\t0x65, 0x78, 0x70, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xc1, 0x03, 0x0a, 0x08, 0x43, 0x6f,\n\t0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c,\n\t0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56,\n\t0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x74,\n\t0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36,\n\t0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52,\n\t0x0b, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c,\n\t0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01,\n\t0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75,\n\t0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e,\n\t0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f,\n\t0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0a, 0x62,\n\t0x79, 0x74, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x46, 0x0a, 0x0e, 0x64, 0x75, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x02, 0x18, 0x01,\n\t0x48, 0x00, 0x52, 0x0d, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75,\n\t0x65, 0x12, 0x49, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d,\n\t0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x0e, 0x74, 0x69,\n\t0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0f, 0x0a, 0x0d,\n\t0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xac, 0x06,\n\t0x0a, 0x0a, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x25, 0x0a, 0x0e,\n\t0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73,\n\t0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,\n\t0x21, 0x0a, 0x0c, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x18,\n\t0x03, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65,\n\t0x74, 0x73, 0x12, 0x41, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,\n\t0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72,\n\t0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x6f, 0x73, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x70, 0x6f, 0x73, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x45, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x63,\n\t0x61, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x6c,\n\t0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f,\n\t0x2e, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,\n\t0x52, 0x0a, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x12, 0x3e, 0x0a, 0x0a,\n\t0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x53, 0x6f, 0x75, 0x72,\n\t0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,\n\t0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3c, 0x0a, 0x0e,\n\t0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,\n\t0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6b, 0x65, 0x79,\n\t0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4d, 0x0a, 0x0f, 0x4d, 0x61,\n\t0x63, 0x72, 0x6f, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a,\n\t0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,\n\t0x24, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e,\n\t0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x05,\n\t0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xe0, 0x02, 0x0a, 0x09, 0x45, 0x78,\n\t0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x59, 0x0a, 0x13, 0x61, 0x66, 0x66, 0x65, 0x63,\n\t0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02,\n\t0x20, 0x03, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e,\n\t0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e,\n\t0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x12,\n\t0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e,\n\t0x74, 0x73, 0x12, 0x40, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x53,\n\t0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72,\n\t0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x35, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,\n\t0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05,\n\t0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x22, 0x6f, 0x0a, 0x09, 0x43,\n\t0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x4f, 0x4d, 0x50,\n\t0x4f, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,\n\t0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x4e, 0x45, 0x4e, 0x54,\n\t0x5f, 0x50, 0x41, 0x52, 0x53, 0x45, 0x52, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x4d,\n\t0x50, 0x4f, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43,\n\t0x4b, 0x45, 0x52, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x4e, 0x45,\n\t0x4e, 0x54, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x03, 0x42, 0x2e, 0x0a, 0x0c,\n\t0x64, 0x65, 0x76, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x42, 0x0b, 0x53, 0x79,\n\t0x6e, 0x74, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x0c, 0x63, 0x65, 0x6c,\n\t0x2e, 0x64, 0x65, 0x76, 0x2f, 0x65, 0x78, 0x70, 0x72, 0xf8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_cel_expr_syntax_proto_rawDescOnce sync.Once\n\tfile_cel_expr_syntax_proto_rawDescData = file_cel_expr_syntax_proto_rawDesc\n)\n\nfunc file_cel_expr_syntax_proto_rawDescGZIP() []byte {\n\tfile_cel_expr_syntax_proto_rawDescOnce.Do(func() {\n\t\tfile_cel_expr_syntax_proto_rawDescData = protoimpl.X.CompressGZIP(file_cel_expr_syntax_proto_rawDescData)\n\t})\n\treturn file_cel_expr_syntax_proto_rawDescData\n}\n\nvar file_cel_expr_syntax_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_cel_expr_syntax_proto_msgTypes = make([]protoimpl.MessageInfo, 15)\nvar file_cel_expr_syntax_proto_goTypes = []interface{}{\n\t(SourceInfo_Extension_Component)(0),  // 0: cel.expr.SourceInfo.Extension.Component\n\t(*ParsedExpr)(nil),                   // 1: cel.expr.ParsedExpr\n\t(*Expr)(nil),                         // 2: cel.expr.Expr\n\t(*Constant)(nil),                     // 3: cel.expr.Constant\n\t(*SourceInfo)(nil),                   // 4: cel.expr.SourceInfo\n\t(*Expr_Ident)(nil),                   // 5: cel.expr.Expr.Ident\n\t(*Expr_Select)(nil),                  // 6: cel.expr.Expr.Select\n\t(*Expr_Call)(nil),                    // 7: cel.expr.Expr.Call\n\t(*Expr_CreateList)(nil),              // 8: cel.expr.Expr.CreateList\n\t(*Expr_CreateStruct)(nil),            // 9: cel.expr.Expr.CreateStruct\n\t(*Expr_Comprehension)(nil),           // 10: cel.expr.Expr.Comprehension\n\t(*Expr_CreateStruct_Entry)(nil),      // 11: cel.expr.Expr.CreateStruct.Entry\n\tnil,                                  // 12: cel.expr.SourceInfo.PositionsEntry\n\tnil,                                  // 13: cel.expr.SourceInfo.MacroCallsEntry\n\t(*SourceInfo_Extension)(nil),         // 14: cel.expr.SourceInfo.Extension\n\t(*SourceInfo_Extension_Version)(nil), // 15: cel.expr.SourceInfo.Extension.Version\n\t(structpb.NullValue)(0),              // 16: google.protobuf.NullValue\n\t(*durationpb.Duration)(nil),          // 17: google.protobuf.Duration\n\t(*timestamppb.Timestamp)(nil),        // 18: google.protobuf.Timestamp\n}\nvar file_cel_expr_syntax_proto_depIdxs = []int32{\n\t2,  // 0: cel.expr.ParsedExpr.expr:type_name -> cel.expr.Expr\n\t4,  // 1: cel.expr.ParsedExpr.source_info:type_name -> cel.expr.SourceInfo\n\t3,  // 2: cel.expr.Expr.const_expr:type_name -> cel.expr.Constant\n\t5,  // 3: cel.expr.Expr.ident_expr:type_name -> cel.expr.Expr.Ident\n\t6,  // 4: cel.expr.Expr.select_expr:type_name -> cel.expr.Expr.Select\n\t7,  // 5: cel.expr.Expr.call_expr:type_name -> cel.expr.Expr.Call\n\t8,  // 6: cel.expr.Expr.list_expr:type_name -> cel.expr.Expr.CreateList\n\t9,  // 7: cel.expr.Expr.struct_expr:type_name -> cel.expr.Expr.CreateStruct\n\t10, // 8: cel.expr.Expr.comprehension_expr:type_name -> cel.expr.Expr.Comprehension\n\t16, // 9: cel.expr.Constant.null_value:type_name -> google.protobuf.NullValue\n\t17, // 10: cel.expr.Constant.duration_value:type_name -> google.protobuf.Duration\n\t18, // 11: cel.expr.Constant.timestamp_value:type_name -> google.protobuf.Timestamp\n\t12, // 12: cel.expr.SourceInfo.positions:type_name -> cel.expr.SourceInfo.PositionsEntry\n\t13, // 13: cel.expr.SourceInfo.macro_calls:type_name -> cel.expr.SourceInfo.MacroCallsEntry\n\t14, // 14: cel.expr.SourceInfo.extensions:type_name -> cel.expr.SourceInfo.Extension\n\t2,  // 15: cel.expr.Expr.Select.operand:type_name -> cel.expr.Expr\n\t2,  // 16: cel.expr.Expr.Call.target:type_name -> cel.expr.Expr\n\t2,  // 17: cel.expr.Expr.Call.args:type_name -> cel.expr.Expr\n\t2,  // 18: cel.expr.Expr.CreateList.elements:type_name -> cel.expr.Expr\n\t11, // 19: cel.expr.Expr.CreateStruct.entries:type_name -> cel.expr.Expr.CreateStruct.Entry\n\t2,  // 20: cel.expr.Expr.Comprehension.iter_range:type_name -> cel.expr.Expr\n\t2,  // 21: cel.expr.Expr.Comprehension.accu_init:type_name -> cel.expr.Expr\n\t2,  // 22: cel.expr.Expr.Comprehension.loop_condition:type_name -> cel.expr.Expr\n\t2,  // 23: cel.expr.Expr.Comprehension.loop_step:type_name -> cel.expr.Expr\n\t2,  // 24: cel.expr.Expr.Comprehension.result:type_name -> cel.expr.Expr\n\t2,  // 25: cel.expr.Expr.CreateStruct.Entry.map_key:type_name -> cel.expr.Expr\n\t2,  // 26: cel.expr.Expr.CreateStruct.Entry.value:type_name -> cel.expr.Expr\n\t2,  // 27: cel.expr.SourceInfo.MacroCallsEntry.value:type_name -> cel.expr.Expr\n\t0,  // 28: cel.expr.SourceInfo.Extension.affected_components:type_name -> cel.expr.SourceInfo.Extension.Component\n\t15, // 29: cel.expr.SourceInfo.Extension.version:type_name -> cel.expr.SourceInfo.Extension.Version\n\t30, // [30:30] is the sub-list for method output_type\n\t30, // [30:30] is the sub-list for method input_type\n\t30, // [30:30] is the sub-list for extension type_name\n\t30, // [30:30] is the sub-list for extension extendee\n\t0,  // [0:30] is the sub-list for field type_name\n}\n\nfunc init() { file_cel_expr_syntax_proto_init() }\nfunc file_cel_expr_syntax_proto_init() {\n\tif File_cel_expr_syntax_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cel_expr_syntax_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ParsedExpr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_syntax_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Expr); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_syntax_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Constant); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_syntax_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SourceInfo); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_syntax_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Expr_Ident); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_syntax_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Expr_Select); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_syntax_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Expr_Call); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_syntax_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Expr_CreateList); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_syntax_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Expr_CreateStruct); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_syntax_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Expr_Comprehension); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_syntax_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Expr_CreateStruct_Entry); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_syntax_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SourceInfo_Extension); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_syntax_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*SourceInfo_Extension_Version); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_cel_expr_syntax_proto_msgTypes[1].OneofWrappers = []interface{}{\n\t\t(*Expr_ConstExpr)(nil),\n\t\t(*Expr_IdentExpr)(nil),\n\t\t(*Expr_SelectExpr)(nil),\n\t\t(*Expr_CallExpr)(nil),\n\t\t(*Expr_ListExpr)(nil),\n\t\t(*Expr_StructExpr)(nil),\n\t\t(*Expr_ComprehensionExpr)(nil),\n\t}\n\tfile_cel_expr_syntax_proto_msgTypes[2].OneofWrappers = []interface{}{\n\t\t(*Constant_NullValue)(nil),\n\t\t(*Constant_BoolValue)(nil),\n\t\t(*Constant_Int64Value)(nil),\n\t\t(*Constant_Uint64Value)(nil),\n\t\t(*Constant_DoubleValue)(nil),\n\t\t(*Constant_StringValue)(nil),\n\t\t(*Constant_BytesValue)(nil),\n\t\t(*Constant_DurationValue)(nil),\n\t\t(*Constant_TimestampValue)(nil),\n\t}\n\tfile_cel_expr_syntax_proto_msgTypes[10].OneofWrappers = []interface{}{\n\t\t(*Expr_CreateStruct_Entry_FieldKey)(nil),\n\t\t(*Expr_CreateStruct_Entry_MapKey)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cel_expr_syntax_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   15,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_cel_expr_syntax_proto_goTypes,\n\t\tDependencyIndexes: file_cel_expr_syntax_proto_depIdxs,\n\t\tEnumInfos:         file_cel_expr_syntax_proto_enumTypes,\n\t\tMessageInfos:      file_cel_expr_syntax_proto_msgTypes,\n\t}.Build()\n\tFile_cel_expr_syntax_proto = out.File\n\tfile_cel_expr_syntax_proto_rawDesc = nil\n\tfile_cel_expr_syntax_proto_goTypes = nil\n\tfile_cel_expr_syntax_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cel.dev/expr/value.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.1\n// \tprotoc        v3.21.5\n// source: cel/expr/value.proto\n\npackage expr\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tanypb \"google.golang.org/protobuf/types/known/anypb\"\n\tstructpb \"google.golang.org/protobuf/types/known/structpb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Value struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Types that are assignable to Kind:\n\t//\n\t//\t*Value_NullValue\n\t//\t*Value_BoolValue\n\t//\t*Value_Int64Value\n\t//\t*Value_Uint64Value\n\t//\t*Value_DoubleValue\n\t//\t*Value_StringValue\n\t//\t*Value_BytesValue\n\t//\t*Value_EnumValue\n\t//\t*Value_ObjectValue\n\t//\t*Value_MapValue\n\t//\t*Value_ListValue\n\t//\t*Value_TypeValue\n\tKind isValue_Kind `protobuf_oneof:\"kind\"`\n}\n\nfunc (x *Value) Reset() {\n\t*x = Value{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_value_proto_msgTypes[0]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *Value) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Value) ProtoMessage() {}\n\nfunc (x *Value) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_value_proto_msgTypes[0]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Value.ProtoReflect.Descriptor instead.\nfunc (*Value) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_value_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (m *Value) GetKind() isValue_Kind {\n\tif m != nil {\n\t\treturn m.Kind\n\t}\n\treturn nil\n}\n\nfunc (x *Value) GetNullValue() structpb.NullValue {\n\tif x, ok := x.GetKind().(*Value_NullValue); ok {\n\t\treturn x.NullValue\n\t}\n\treturn structpb.NullValue(0)\n}\n\nfunc (x *Value) GetBoolValue() bool {\n\tif x, ok := x.GetKind().(*Value_BoolValue); ok {\n\t\treturn x.BoolValue\n\t}\n\treturn false\n}\n\nfunc (x *Value) GetInt64Value() int64 {\n\tif x, ok := x.GetKind().(*Value_Int64Value); ok {\n\t\treturn x.Int64Value\n\t}\n\treturn 0\n}\n\nfunc (x *Value) GetUint64Value() uint64 {\n\tif x, ok := x.GetKind().(*Value_Uint64Value); ok {\n\t\treturn x.Uint64Value\n\t}\n\treturn 0\n}\n\nfunc (x *Value) GetDoubleValue() float64 {\n\tif x, ok := x.GetKind().(*Value_DoubleValue); ok {\n\t\treturn x.DoubleValue\n\t}\n\treturn 0\n}\n\nfunc (x *Value) GetStringValue() string {\n\tif x, ok := x.GetKind().(*Value_StringValue); ok {\n\t\treturn x.StringValue\n\t}\n\treturn \"\"\n}\n\nfunc (x *Value) GetBytesValue() []byte {\n\tif x, ok := x.GetKind().(*Value_BytesValue); ok {\n\t\treturn x.BytesValue\n\t}\n\treturn nil\n}\n\nfunc (x *Value) GetEnumValue() *EnumValue {\n\tif x, ok := x.GetKind().(*Value_EnumValue); ok {\n\t\treturn x.EnumValue\n\t}\n\treturn nil\n}\n\nfunc (x *Value) GetObjectValue() *anypb.Any {\n\tif x, ok := x.GetKind().(*Value_ObjectValue); ok {\n\t\treturn x.ObjectValue\n\t}\n\treturn nil\n}\n\nfunc (x *Value) GetMapValue() *MapValue {\n\tif x, ok := x.GetKind().(*Value_MapValue); ok {\n\t\treturn x.MapValue\n\t}\n\treturn nil\n}\n\nfunc (x *Value) GetListValue() *ListValue {\n\tif x, ok := x.GetKind().(*Value_ListValue); ok {\n\t\treturn x.ListValue\n\t}\n\treturn nil\n}\n\nfunc (x *Value) GetTypeValue() string {\n\tif x, ok := x.GetKind().(*Value_TypeValue); ok {\n\t\treturn x.TypeValue\n\t}\n\treturn \"\"\n}\n\ntype isValue_Kind interface {\n\tisValue_Kind()\n}\n\ntype Value_NullValue struct {\n\tNullValue structpb.NullValue `protobuf:\"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof\"`\n}\n\ntype Value_BoolValue struct {\n\tBoolValue bool `protobuf:\"varint,2,opt,name=bool_value,json=boolValue,proto3,oneof\"`\n}\n\ntype Value_Int64Value struct {\n\tInt64Value int64 `protobuf:\"varint,3,opt,name=int64_value,json=int64Value,proto3,oneof\"`\n}\n\ntype Value_Uint64Value struct {\n\tUint64Value uint64 `protobuf:\"varint,4,opt,name=uint64_value,json=uint64Value,proto3,oneof\"`\n}\n\ntype Value_DoubleValue struct {\n\tDoubleValue float64 `protobuf:\"fixed64,5,opt,name=double_value,json=doubleValue,proto3,oneof\"`\n}\n\ntype Value_StringValue struct {\n\tStringValue string `protobuf:\"bytes,6,opt,name=string_value,json=stringValue,proto3,oneof\"`\n}\n\ntype Value_BytesValue struct {\n\tBytesValue []byte `protobuf:\"bytes,7,opt,name=bytes_value,json=bytesValue,proto3,oneof\"`\n}\n\ntype Value_EnumValue struct {\n\tEnumValue *EnumValue `protobuf:\"bytes,9,opt,name=enum_value,json=enumValue,proto3,oneof\"`\n}\n\ntype Value_ObjectValue struct {\n\tObjectValue *anypb.Any `protobuf:\"bytes,10,opt,name=object_value,json=objectValue,proto3,oneof\"`\n}\n\ntype Value_MapValue struct {\n\tMapValue *MapValue `protobuf:\"bytes,11,opt,name=map_value,json=mapValue,proto3,oneof\"`\n}\n\ntype Value_ListValue struct {\n\tListValue *ListValue `protobuf:\"bytes,12,opt,name=list_value,json=listValue,proto3,oneof\"`\n}\n\ntype Value_TypeValue struct {\n\tTypeValue string `protobuf:\"bytes,15,opt,name=type_value,json=typeValue,proto3,oneof\"`\n}\n\nfunc (*Value_NullValue) isValue_Kind() {}\n\nfunc (*Value_BoolValue) isValue_Kind() {}\n\nfunc (*Value_Int64Value) isValue_Kind() {}\n\nfunc (*Value_Uint64Value) isValue_Kind() {}\n\nfunc (*Value_DoubleValue) isValue_Kind() {}\n\nfunc (*Value_StringValue) isValue_Kind() {}\n\nfunc (*Value_BytesValue) isValue_Kind() {}\n\nfunc (*Value_EnumValue) isValue_Kind() {}\n\nfunc (*Value_ObjectValue) isValue_Kind() {}\n\nfunc (*Value_MapValue) isValue_Kind() {}\n\nfunc (*Value_ListValue) isValue_Kind() {}\n\nfunc (*Value_TypeValue) isValue_Kind() {}\n\ntype EnumValue struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tType  string `protobuf:\"bytes,1,opt,name=type,proto3\" json:\"type,omitempty\"`\n\tValue int32  `protobuf:\"varint,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *EnumValue) Reset() {\n\t*x = EnumValue{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_value_proto_msgTypes[1]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *EnumValue) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*EnumValue) ProtoMessage() {}\n\nfunc (x *EnumValue) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_value_proto_msgTypes[1]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use EnumValue.ProtoReflect.Descriptor instead.\nfunc (*EnumValue) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_value_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *EnumValue) GetType() string {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn \"\"\n}\n\nfunc (x *EnumValue) GetValue() int32 {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn 0\n}\n\ntype ListValue struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tValues []*Value `protobuf:\"bytes,1,rep,name=values,proto3\" json:\"values,omitempty\"`\n}\n\nfunc (x *ListValue) Reset() {\n\t*x = ListValue{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_value_proto_msgTypes[2]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *ListValue) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListValue) ProtoMessage() {}\n\nfunc (x *ListValue) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_value_proto_msgTypes[2]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListValue.ProtoReflect.Descriptor instead.\nfunc (*ListValue) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_value_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListValue) GetValues() []*Value {\n\tif x != nil {\n\t\treturn x.Values\n\t}\n\treturn nil\n}\n\ntype MapValue struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tEntries []*MapValue_Entry `protobuf:\"bytes,1,rep,name=entries,proto3\" json:\"entries,omitempty\"`\n}\n\nfunc (x *MapValue) Reset() {\n\t*x = MapValue{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_value_proto_msgTypes[3]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MapValue) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MapValue) ProtoMessage() {}\n\nfunc (x *MapValue) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_value_proto_msgTypes[3]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MapValue.ProtoReflect.Descriptor instead.\nfunc (*MapValue) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_value_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *MapValue) GetEntries() []*MapValue_Entry {\n\tif x != nil {\n\t\treturn x.Entries\n\t}\n\treturn nil\n}\n\ntype MapValue_Entry struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tKey   *Value `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\tValue *Value `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *MapValue_Entry) Reset() {\n\t*x = MapValue_Entry{}\n\tif protoimpl.UnsafeEnabled {\n\t\tmi := &file_cel_expr_value_proto_msgTypes[4]\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tms.StoreMessageInfo(mi)\n\t}\n}\n\nfunc (x *MapValue_Entry) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MapValue_Entry) ProtoMessage() {}\n\nfunc (x *MapValue_Entry) ProtoReflect() protoreflect.Message {\n\tmi := &file_cel_expr_value_proto_msgTypes[4]\n\tif protoimpl.UnsafeEnabled && x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MapValue_Entry.ProtoReflect.Descriptor instead.\nfunc (*MapValue_Entry) Descriptor() ([]byte, []int) {\n\treturn file_cel_expr_value_proto_rawDescGZIP(), []int{3, 0}\n}\n\nfunc (x *MapValue_Entry) GetKey() *Value {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn nil\n}\n\nfunc (x *MapValue_Entry) GetValue() *Value {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\nvar File_cel_expr_value_proto protoreflect.FileDescriptor\n\nvar file_cel_expr_value_proto_rawDesc = []byte{\n\t0x0a, 0x14, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72,\n\t0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72,\n\t0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9d, 0x04, 0x0a, 0x05, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65,\n\t0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75,\n\t0x65, 0x12, 0x21, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56,\n\t0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x0b, 0x75, 0x69,\n\t0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x64, 0x6f, 0x75,\n\t0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x48,\n\t0x00, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23,\n\t0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x76, 0x61, 0x6c,\n\t0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65,\n\t0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x65, 0x6c,\n\t0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48,\n\t0x00, 0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x39, 0x0a, 0x0c,\n\t0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0a, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x48, 0x00, 0x52, 0x0b, 0x6f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x6d, 0x61, 0x70, 0x5f, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x65, 0x6c,\n\t0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x4d, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00,\n\t0x52, 0x08, 0x6d, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x6c, 0x69,\n\t0x73, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,\n\t0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65,\n\t0x12, 0x1f, 0x0a, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0f,\n\t0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x74, 0x79, 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75,\n\t0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x6e, 0x75,\n\t0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,\n\t0x22, 0x34, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x27, 0x0a,\n\t0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e,\n\t0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06,\n\t0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x08, 0x4d, 0x61, 0x70, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e,\n\t0x4d, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07,\n\t0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x1a, 0x51, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79,\n\t0x12, 0x21, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e,\n\t0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03,\n\t0x6b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2d, 0x0a, 0x0c, 0x64, 0x65,\n\t0x76, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x42, 0x0a, 0x56, 0x61, 0x6c, 0x75,\n\t0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x0c, 0x63, 0x65, 0x6c, 0x2e, 0x64, 0x65,\n\t0x76, 0x2f, 0x65, 0x78, 0x70, 0x72, 0xf8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_cel_expr_value_proto_rawDescOnce sync.Once\n\tfile_cel_expr_value_proto_rawDescData = file_cel_expr_value_proto_rawDesc\n)\n\nfunc file_cel_expr_value_proto_rawDescGZIP() []byte {\n\tfile_cel_expr_value_proto_rawDescOnce.Do(func() {\n\t\tfile_cel_expr_value_proto_rawDescData = protoimpl.X.CompressGZIP(file_cel_expr_value_proto_rawDescData)\n\t})\n\treturn file_cel_expr_value_proto_rawDescData\n}\n\nvar file_cel_expr_value_proto_msgTypes = make([]protoimpl.MessageInfo, 5)\nvar file_cel_expr_value_proto_goTypes = []interface{}{\n\t(*Value)(nil),           // 0: cel.expr.Value\n\t(*EnumValue)(nil),       // 1: cel.expr.EnumValue\n\t(*ListValue)(nil),       // 2: cel.expr.ListValue\n\t(*MapValue)(nil),        // 3: cel.expr.MapValue\n\t(*MapValue_Entry)(nil),  // 4: cel.expr.MapValue.Entry\n\t(structpb.NullValue)(0), // 5: google.protobuf.NullValue\n\t(*anypb.Any)(nil),       // 6: google.protobuf.Any\n}\nvar file_cel_expr_value_proto_depIdxs = []int32{\n\t5, // 0: cel.expr.Value.null_value:type_name -> google.protobuf.NullValue\n\t1, // 1: cel.expr.Value.enum_value:type_name -> cel.expr.EnumValue\n\t6, // 2: cel.expr.Value.object_value:type_name -> google.protobuf.Any\n\t3, // 3: cel.expr.Value.map_value:type_name -> cel.expr.MapValue\n\t2, // 4: cel.expr.Value.list_value:type_name -> cel.expr.ListValue\n\t0, // 5: cel.expr.ListValue.values:type_name -> cel.expr.Value\n\t4, // 6: cel.expr.MapValue.entries:type_name -> cel.expr.MapValue.Entry\n\t0, // 7: cel.expr.MapValue.Entry.key:type_name -> cel.expr.Value\n\t0, // 8: cel.expr.MapValue.Entry.value:type_name -> cel.expr.Value\n\t9, // [9:9] is the sub-list for method output_type\n\t9, // [9:9] is the sub-list for method input_type\n\t9, // [9:9] is the sub-list for extension type_name\n\t9, // [9:9] is the sub-list for extension extendee\n\t0, // [0:9] is the sub-list for field type_name\n}\n\nfunc init() { file_cel_expr_value_proto_init() }\nfunc file_cel_expr_value_proto_init() {\n\tif File_cel_expr_value_proto != nil {\n\t\treturn\n\t}\n\tif !protoimpl.UnsafeEnabled {\n\t\tfile_cel_expr_value_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*Value); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_value_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*EnumValue); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_value_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*ListValue); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_value_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MapValue); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tfile_cel_expr_value_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {\n\t\t\tswitch v := v.(*MapValue_Entry); i {\n\t\t\tcase 0:\n\t\t\t\treturn &v.state\n\t\t\tcase 1:\n\t\t\t\treturn &v.sizeCache\n\t\t\tcase 2:\n\t\t\t\treturn &v.unknownFields\n\t\t\tdefault:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\tfile_cel_expr_value_proto_msgTypes[0].OneofWrappers = []interface{}{\n\t\t(*Value_NullValue)(nil),\n\t\t(*Value_BoolValue)(nil),\n\t\t(*Value_Int64Value)(nil),\n\t\t(*Value_Uint64Value)(nil),\n\t\t(*Value_DoubleValue)(nil),\n\t\t(*Value_StringValue)(nil),\n\t\t(*Value_BytesValue)(nil),\n\t\t(*Value_EnumValue)(nil),\n\t\t(*Value_ObjectValue)(nil),\n\t\t(*Value_MapValue)(nil),\n\t\t(*Value_ListValue)(nil),\n\t\t(*Value_TypeValue)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_cel_expr_value_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   5,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_cel_expr_value_proto_goTypes,\n\t\tDependencyIndexes: file_cel_expr_value_proto_depIdxs,\n\t\tMessageInfos:      file_cel_expr_value_proto_msgTypes,\n\t}.Build()\n\tFile_cel_expr_value_proto = out.File\n\tfile_cel_expr_value_proto_rawDesc = nil\n\tfile_cel_expr_value_proto_goTypes = nil\n\tfile_cel_expr_value_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/CHANGES.md",
    "content": "# Changelog\n\n## [0.16.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.16.0...auth/v0.16.1) (2025-04-23)\n\n\n### Bug Fixes\n\n* **auth:** Clone detectopts before assigning TokenBindingType ([#11881](https://github.com/googleapis/google-cloud-go/issues/11881)) ([2167b02](https://github.com/googleapis/google-cloud-go/commit/2167b020fdc43b517c2b6ecca264a10e357ea035))\n\n## [0.16.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.15.0...auth/v0.16.0) (2025-04-14)\n\n\n### Features\n\n* **auth/credentials:** Return X.509 certificate chain as subject token ([#11948](https://github.com/googleapis/google-cloud-go/issues/11948)) ([d445a3f](https://github.com/googleapis/google-cloud-go/commit/d445a3f66272ffd5c39c4939af9bebad4582631c)), refs [#11757](https://github.com/googleapis/google-cloud-go/issues/11757)\n* **auth:** Configure DirectPath bound credentials from AllowedHardBoundTokens ([#11665](https://github.com/googleapis/google-cloud-go/issues/11665)) ([0fc40bc](https://github.com/googleapis/google-cloud-go/commit/0fc40bcf4e4673704df0973e9fa65957395d7bb4))\n\n\n### Bug Fixes\n\n* **auth:** Allow non-default SA credentials for DP ([#11828](https://github.com/googleapis/google-cloud-go/issues/11828)) ([3a996b4](https://github.com/googleapis/google-cloud-go/commit/3a996b4129e6d0a34dfda6671f535d5aefb26a82))\n* **auth:** Restore calling DialContext ([#11930](https://github.com/googleapis/google-cloud-go/issues/11930)) ([9ec9a29](https://github.com/googleapis/google-cloud-go/commit/9ec9a29494e93197edbaf45aba28984801e9770a)), refs [#11118](https://github.com/googleapis/google-cloud-go/issues/11118)\n\n## [0.15.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.14.1...auth/v0.15.0) (2025-02-19)\n\n\n### Features\n\n* **auth:** Add hard-bound token request to compute token provider. ([#11588](https://github.com/googleapis/google-cloud-go/issues/11588)) ([0e608bb](https://github.com/googleapis/google-cloud-go/commit/0e608bb5ac3d694c8ad36ca4340071d3a2c78699))\n\n## [0.14.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.14.0...auth/v0.14.1) (2025-01-24)\n\n\n### Documentation\n\n* **auth:** Add warning about externally-provided credentials ([#11462](https://github.com/googleapis/google-cloud-go/issues/11462)) ([49fb6ff](https://github.com/googleapis/google-cloud-go/commit/49fb6ff4d754895f82c9c4d502fc7547d3b5a941))\n\n## [0.14.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.13.0...auth/v0.14.0) (2025-01-08)\n\n\n### Features\n\n* **auth:** Add universe domain support to idtoken ([#11059](https://github.com/googleapis/google-cloud-go/issues/11059)) ([72add7e](https://github.com/googleapis/google-cloud-go/commit/72add7e9f8f455af695e8ef79212a4bd3122fb3a))\n\n\n### Bug Fixes\n\n* **auth/oauth2adapt:** Update golang.org/x/net to v0.33.0 ([e9b0b69](https://github.com/googleapis/google-cloud-go/commit/e9b0b69644ea5b276cacff0a707e8a5e87efafc9))\n* **auth:** Fix copy of delegates in impersonate.NewIDTokenCredentials ([#11386](https://github.com/googleapis/google-cloud-go/issues/11386)) ([ff7ef8e](https://github.com/googleapis/google-cloud-go/commit/ff7ef8e7ade7171bce3e4f30ff10a2e9f6c27ca0)), refs [#11379](https://github.com/googleapis/google-cloud-go/issues/11379)\n* **auth:** Update golang.org/x/net to v0.33.0 ([e9b0b69](https://github.com/googleapis/google-cloud-go/commit/e9b0b69644ea5b276cacff0a707e8a5e87efafc9))\n\n## [0.13.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.12.1...auth/v0.13.0) (2024-12-13)\n\n\n### Features\n\n* **auth:** Add logging support ([#11079](https://github.com/googleapis/google-cloud-go/issues/11079)) ([c80e31d](https://github.com/googleapis/google-cloud-go/commit/c80e31df5ecb33a810be3dfb9d9e27ac531aa91d))\n* **auth:** Pass logger from auth layer to metadata package ([#11288](https://github.com/googleapis/google-cloud-go/issues/11288)) ([b552efd](https://github.com/googleapis/google-cloud-go/commit/b552efd6ab34e5dfded18438e0fbfd925805614f))\n\n\n### Bug Fixes\n\n* **auth:** Check compute cred type before non-default flag for DP ([#11255](https://github.com/googleapis/google-cloud-go/issues/11255)) ([4347ca1](https://github.com/googleapis/google-cloud-go/commit/4347ca141892be8ae813399b4b437662a103bc90))\n\n## [0.12.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.12.0...auth/v0.12.1) (2024-12-10)\n\n\n### Bug Fixes\n\n* **auth:** Correct typo in link ([#11160](https://github.com/googleapis/google-cloud-go/issues/11160)) ([af6fb46](https://github.com/googleapis/google-cloud-go/commit/af6fb46d7cd694ddbe8c9d63bc4cdcd62b9fb2c1))\n\n## [0.12.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.11.0...auth/v0.12.0) (2024-12-04)\n\n\n### Features\n\n* **auth:** Add support for providing custom certificate URL ([#11006](https://github.com/googleapis/google-cloud-go/issues/11006)) ([ebf3657](https://github.com/googleapis/google-cloud-go/commit/ebf36579724afb375d3974cf1da38f703e3b7dbc)), refs [#11005](https://github.com/googleapis/google-cloud-go/issues/11005)\n\n\n### Bug Fixes\n\n* **auth:** Ensure endpoints are present in Validator ([#11209](https://github.com/googleapis/google-cloud-go/issues/11209)) ([106cd53](https://github.com/googleapis/google-cloud-go/commit/106cd53309facaef1b8ea78376179f523f6912b9)), refs [#11006](https://github.com/googleapis/google-cloud-go/issues/11006) [#11190](https://github.com/googleapis/google-cloud-go/issues/11190) [#11189](https://github.com/googleapis/google-cloud-go/issues/11189) [#11188](https://github.com/googleapis/google-cloud-go/issues/11188)\n\n## [0.11.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.10.2...auth/v0.11.0) (2024-11-21)\n\n\n### Features\n\n* **auth:** Add universe domain support to mTLS ([#11159](https://github.com/googleapis/google-cloud-go/issues/11159)) ([117748b](https://github.com/googleapis/google-cloud-go/commit/117748ba1cfd4ae62a6a4feb7e30951cb2bc9344))\n\n## [0.10.2](https://github.com/googleapis/google-cloud-go/compare/auth/v0.10.1...auth/v0.10.2) (2024-11-12)\n\n\n### Bug Fixes\n\n* **auth:** Restore use of grpc.Dial ([#11118](https://github.com/googleapis/google-cloud-go/issues/11118)) ([2456b94](https://github.com/googleapis/google-cloud-go/commit/2456b943b7b8aaabd4d8bfb7572c0f477ae0db45)), refs [#7556](https://github.com/googleapis/google-cloud-go/issues/7556)\n\n## [0.10.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.10.0...auth/v0.10.1) (2024-11-06)\n\n\n### Bug Fixes\n\n* **auth:** Restore Application Default Credentials support to idtoken ([#11083](https://github.com/googleapis/google-cloud-go/issues/11083)) ([8771f2e](https://github.com/googleapis/google-cloud-go/commit/8771f2ea9807ab822083808e0678392edff3b4f2))\n* **auth:** Skip impersonate universe domain check if empty ([#11086](https://github.com/googleapis/google-cloud-go/issues/11086)) ([87159c1](https://github.com/googleapis/google-cloud-go/commit/87159c1059d4a18d1367ce62746a838a94964ab6))\n\n## [0.10.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.9...auth/v0.10.0) (2024-10-30)\n\n\n### Features\n\n* **auth:** Add universe domain support to credentials/impersonate ([#10953](https://github.com/googleapis/google-cloud-go/issues/10953)) ([e06cb64](https://github.com/googleapis/google-cloud-go/commit/e06cb6499f7eda3aef08ab18ff197016f667684b))\n\n## [0.9.9](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.8...auth/v0.9.9) (2024-10-22)\n\n\n### Bug Fixes\n\n* **auth:** Fallback cert lookups for missing files ([#11013](https://github.com/googleapis/google-cloud-go/issues/11013)) ([bd76695](https://github.com/googleapis/google-cloud-go/commit/bd766957ec238b7c40ddbabb369e612dc9b07313)), refs [#10844](https://github.com/googleapis/google-cloud-go/issues/10844)\n* **auth:** Replace MDS endpoint universe_domain with universe-domain ([#11000](https://github.com/googleapis/google-cloud-go/issues/11000)) ([6a1586f](https://github.com/googleapis/google-cloud-go/commit/6a1586f2ce9974684affaea84e7b629313b4d114))\n\n## [0.9.8](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.7...auth/v0.9.8) (2024-10-09)\n\n\n### Bug Fixes\n\n* **auth:** Restore OpenTelemetry handling in transports ([#10968](https://github.com/googleapis/google-cloud-go/issues/10968)) ([08c6d04](https://github.com/googleapis/google-cloud-go/commit/08c6d04901c1a20e219b2d86df41dbaa6d7d7b55)), refs [#10962](https://github.com/googleapis/google-cloud-go/issues/10962)\n* **auth:** Try talk to plaintext S2A if credentials can not be found for mTLS-S2A ([#10941](https://github.com/googleapis/google-cloud-go/issues/10941)) ([0f0bf2d](https://github.com/googleapis/google-cloud-go/commit/0f0bf2d18c97dd8b65bcf0099f0802b5631c6287))\n\n## [0.9.7](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.6...auth/v0.9.7) (2024-10-01)\n\n\n### Bug Fixes\n\n* **auth:** Restore support for non-default service accounts for DirectPath ([#10937](https://github.com/googleapis/google-cloud-go/issues/10937)) ([a38650e](https://github.com/googleapis/google-cloud-go/commit/a38650edbf420223077498cafa537aec74b37aad)), refs [#10907](https://github.com/googleapis/google-cloud-go/issues/10907)\n\n## [0.9.6](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.5...auth/v0.9.6) (2024-09-30)\n\n\n### Bug Fixes\n\n* **auth:** Make aws credentials provider retrieve fresh credentials ([#10920](https://github.com/googleapis/google-cloud-go/issues/10920)) ([250fbf8](https://github.com/googleapis/google-cloud-go/commit/250fbf87d858d865e399a241b7e537c4ff0c3dd8))\n\n## [0.9.5](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.4...auth/v0.9.5) (2024-09-25)\n\n\n### Bug Fixes\n\n* **auth:** Restore support for GOOGLE_CLOUD_UNIVERSE_DOMAIN env ([#10915](https://github.com/googleapis/google-cloud-go/issues/10915)) ([94caaaa](https://github.com/googleapis/google-cloud-go/commit/94caaaa061362d0e00ef6214afcc8a0a3e7ebfb2))\n* **auth:** Skip directpath credentials overwrite when it's not on GCE ([#10833](https://github.com/googleapis/google-cloud-go/issues/10833)) ([7e5e8d1](https://github.com/googleapis/google-cloud-go/commit/7e5e8d10b761b0a6e43e19a028528db361bc07b1))\n* **auth:** Use new context for non-blocking token refresh ([#10919](https://github.com/googleapis/google-cloud-go/issues/10919)) ([cf7102d](https://github.com/googleapis/google-cloud-go/commit/cf7102d33a21be1e5a9d47a49456b3a57c43b350))\n\n## [0.9.4](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.3...auth/v0.9.4) (2024-09-11)\n\n\n### Bug Fixes\n\n* **auth:** Enable self-signed JWT for non-GDU universe domain ([#10831](https://github.com/googleapis/google-cloud-go/issues/10831)) ([f9869f7](https://github.com/googleapis/google-cloud-go/commit/f9869f7903cfd34d1b97c25d0dc5669d2c5138e6))\n\n## [0.9.3](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.2...auth/v0.9.3) (2024-09-03)\n\n\n### Bug Fixes\n\n* **auth:** Choose quota project envvar over file when both present ([#10807](https://github.com/googleapis/google-cloud-go/issues/10807)) ([2d8dd77](https://github.com/googleapis/google-cloud-go/commit/2d8dd7700eff92d4b95027be55e26e1e7aa79181)), refs [#10804](https://github.com/googleapis/google-cloud-go/issues/10804)\n\n## [0.9.2](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.1...auth/v0.9.2) (2024-08-30)\n\n\n### Bug Fixes\n\n* **auth:** Handle non-Transport DefaultTransport ([#10733](https://github.com/googleapis/google-cloud-go/issues/10733)) ([98d91dc](https://github.com/googleapis/google-cloud-go/commit/98d91dc8316b247498fab41ab35e57a0446fe556)), refs [#10742](https://github.com/googleapis/google-cloud-go/issues/10742)\n* **auth:** Make sure quota option takes precedence over env/file ([#10797](https://github.com/googleapis/google-cloud-go/issues/10797)) ([f1b050d](https://github.com/googleapis/google-cloud-go/commit/f1b050d56d804b245cab048c2980d32b0eaceb4e)), refs [#10795](https://github.com/googleapis/google-cloud-go/issues/10795)\n\n\n### Documentation\n\n* **auth:** Fix Go doc comment link ([#10751](https://github.com/googleapis/google-cloud-go/issues/10751)) ([015acfa](https://github.com/googleapis/google-cloud-go/commit/015acfab4d172650928bb1119bc2cd6307b9a437))\n\n## [0.9.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.0...auth/v0.9.1) (2024-08-22)\n\n\n### Bug Fixes\n\n* **auth:** Setting expireEarly to default when the value is 0 ([#10732](https://github.com/googleapis/google-cloud-go/issues/10732)) ([5e67869](https://github.com/googleapis/google-cloud-go/commit/5e67869a31e9e8ecb4eeebd2cfa11a761c3b1948))\n\n## [0.9.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.8.1...auth/v0.9.0) (2024-08-16)\n\n\n### Features\n\n* **auth:** Auth library can talk to S2A over mTLS ([#10634](https://github.com/googleapis/google-cloud-go/issues/10634)) ([5250a13](https://github.com/googleapis/google-cloud-go/commit/5250a13ec95b8d4eefbe0158f82857ff2189cb45))\n\n## [0.8.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.8.0...auth/v0.8.1) (2024-08-13)\n\n\n### Bug Fixes\n\n* **auth:** Make default client creation more lenient ([#10669](https://github.com/googleapis/google-cloud-go/issues/10669)) ([1afb9ee](https://github.com/googleapis/google-cloud-go/commit/1afb9ee1ee9de9810722800018133304a0ca34d1)), refs [#10638](https://github.com/googleapis/google-cloud-go/issues/10638)\n\n## [0.8.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.7.3...auth/v0.8.0) (2024-08-07)\n\n\n### Features\n\n* **auth:** Adds support for X509 workload identity federation ([#10373](https://github.com/googleapis/google-cloud-go/issues/10373)) ([5d07505](https://github.com/googleapis/google-cloud-go/commit/5d075056cbe27bb1da4072a26070c41f8999eb9b))\n\n## [0.7.3](https://github.com/googleapis/google-cloud-go/compare/auth/v0.7.2...auth/v0.7.3) (2024-08-01)\n\n\n### Bug Fixes\n\n* **auth/oauth2adapt:** Update dependencies ([257c40b](https://github.com/googleapis/google-cloud-go/commit/257c40bd6d7e59730017cf32bda8823d7a232758))\n* **auth:** Disable automatic universe domain check for MDS ([#10620](https://github.com/googleapis/google-cloud-go/issues/10620)) ([7cea5ed](https://github.com/googleapis/google-cloud-go/commit/7cea5edd5a0c1e6bca558696f5607879141910e8))\n* **auth:** Update dependencies ([257c40b](https://github.com/googleapis/google-cloud-go/commit/257c40bd6d7e59730017cf32bda8823d7a232758))\n\n## [0.7.2](https://github.com/googleapis/google-cloud-go/compare/auth/v0.7.1...auth/v0.7.2) (2024-07-22)\n\n\n### Bug Fixes\n\n* **auth:** Use default client for universe metadata lookup ([#10551](https://github.com/googleapis/google-cloud-go/issues/10551)) ([d9046fd](https://github.com/googleapis/google-cloud-go/commit/d9046fdd1435d1ce48f374806c1def4cb5ac6cd3)), refs [#10544](https://github.com/googleapis/google-cloud-go/issues/10544)\n\n## [0.7.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.7.0...auth/v0.7.1) (2024-07-10)\n\n\n### Bug Fixes\n\n* **auth:** Bump google.golang.org/grpc@v1.64.1 ([8ecc4e9](https://github.com/googleapis/google-cloud-go/commit/8ecc4e9622e5bbe9b90384d5848ab816027226c5))\n\n## [0.7.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.6.1...auth/v0.7.0) (2024-07-09)\n\n\n### Features\n\n* **auth:** Add workload X509 cert provider as a default cert provider ([#10479](https://github.com/googleapis/google-cloud-go/issues/10479)) ([c51ee6c](https://github.com/googleapis/google-cloud-go/commit/c51ee6cf65ce05b4d501083e49d468c75ac1ea63))\n\n\n### Bug Fixes\n\n* **auth/oauth2adapt:** Bump google.golang.org/api@v0.187.0 ([8fa9e39](https://github.com/googleapis/google-cloud-go/commit/8fa9e398e512fd8533fd49060371e61b5725a85b))\n* **auth:** Bump google.golang.org/api@v0.187.0 ([8fa9e39](https://github.com/googleapis/google-cloud-go/commit/8fa9e398e512fd8533fd49060371e61b5725a85b))\n* **auth:** Check len of slices, not non-nil ([#10483](https://github.com/googleapis/google-cloud-go/issues/10483)) ([0a966a1](https://github.com/googleapis/google-cloud-go/commit/0a966a183e5f0e811977216d736d875b7233e942))\n\n## [0.6.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.6.0...auth/v0.6.1) (2024-07-01)\n\n\n### Bug Fixes\n\n* **auth:** Support gRPC API keys ([#10460](https://github.com/googleapis/google-cloud-go/issues/10460)) ([daa6646](https://github.com/googleapis/google-cloud-go/commit/daa6646d2af5d7fb5b30489f4934c7db89868c7c))\n* **auth:** Update http and grpc transports to support token exchange over mTLS ([#10397](https://github.com/googleapis/google-cloud-go/issues/10397)) ([c6dfdcf](https://github.com/googleapis/google-cloud-go/commit/c6dfdcf893c3f971eba15026c12db0a960ae81f2))\n\n## [0.6.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.5.2...auth/v0.6.0) (2024-06-25)\n\n\n### Features\n\n* **auth:** Add non-blocking token refresh for compute MDS ([#10263](https://github.com/googleapis/google-cloud-go/issues/10263)) ([9ac350d](https://github.com/googleapis/google-cloud-go/commit/9ac350da11a49b8e2174d3fc5b1a5070fec78b4e))\n\n\n### Bug Fixes\n\n* **auth:** Return error if envvar detected file returns an error ([#10431](https://github.com/googleapis/google-cloud-go/issues/10431)) ([e52b9a7](https://github.com/googleapis/google-cloud-go/commit/e52b9a7c45468827f5d220ab00965191faeb9d05))\n\n## [0.5.2](https://github.com/googleapis/google-cloud-go/compare/auth/v0.5.1...auth/v0.5.2) (2024-06-24)\n\n\n### Bug Fixes\n\n* **auth:** Fetch initial token when CachedTokenProviderOptions.DisableAutoRefresh is true ([#10415](https://github.com/googleapis/google-cloud-go/issues/10415)) ([3266763](https://github.com/googleapis/google-cloud-go/commit/32667635ca2efad05cd8c087c004ca07d7406913)), refs [#10414](https://github.com/googleapis/google-cloud-go/issues/10414)\n\n## [0.5.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.5.0...auth/v0.5.1) (2024-05-31)\n\n\n### Bug Fixes\n\n* **auth:** Pass through client to 2LO and 3LO flows ([#10290](https://github.com/googleapis/google-cloud-go/issues/10290)) ([685784e](https://github.com/googleapis/google-cloud-go/commit/685784ea84358c15e9214bdecb307d37aa3b6d2f))\n\n## [0.5.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.4.2...auth/v0.5.0) (2024-05-28)\n\n\n### Features\n\n* **auth:** Adds X509 workload certificate provider ([#10233](https://github.com/googleapis/google-cloud-go/issues/10233)) ([17a9db7](https://github.com/googleapis/google-cloud-go/commit/17a9db73af35e3d1a7a25ac4fd1377a103de6150))\n\n## [0.4.2](https://github.com/googleapis/google-cloud-go/compare/auth/v0.4.1...auth/v0.4.2) (2024-05-16)\n\n\n### Bug Fixes\n\n* **auth:** Enable client certificates by default only for GDU ([#10151](https://github.com/googleapis/google-cloud-go/issues/10151)) ([7c52978](https://github.com/googleapis/google-cloud-go/commit/7c529786275a39b7e00525f7d5e7be0d963e9e15))\n* **auth:** Handle non-Transport DefaultTransport ([#10162](https://github.com/googleapis/google-cloud-go/issues/10162)) ([fa3bfdb](https://github.com/googleapis/google-cloud-go/commit/fa3bfdb23aaa45b34394a8b61e753b3587506782)), refs [#10159](https://github.com/googleapis/google-cloud-go/issues/10159)\n* **auth:** Have refresh time match docs ([#10147](https://github.com/googleapis/google-cloud-go/issues/10147)) ([bcb5568](https://github.com/googleapis/google-cloud-go/commit/bcb5568c07a54dd3d2e869d15f502b0741a609e8))\n* **auth:** Update compute token fetching error with named prefix ([#10180](https://github.com/googleapis/google-cloud-go/issues/10180)) ([4573504](https://github.com/googleapis/google-cloud-go/commit/4573504828d2928bebedc875d87650ba227829ea))\n\n## [0.4.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.4.0...auth/v0.4.1) (2024-05-09)\n\n\n### Bug Fixes\n\n* **auth:** Don't try to detect default creds it opt configured ([#10143](https://github.com/googleapis/google-cloud-go/issues/10143)) ([804632e](https://github.com/googleapis/google-cloud-go/commit/804632e7c5b0b85ff522f7951114485e256eb5bc))\n\n## [0.4.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.3.0...auth/v0.4.0) (2024-05-07)\n\n\n### Features\n\n* **auth:** Enable client certificates by default ([#10102](https://github.com/googleapis/google-cloud-go/issues/10102)) ([9013e52](https://github.com/googleapis/google-cloud-go/commit/9013e5200a6ec0f178ed91acb255481ffb073a2c))\n\n\n### Bug Fixes\n\n* **auth:** Get s2a logic up to date ([#10093](https://github.com/googleapis/google-cloud-go/issues/10093)) ([4fe9ae4](https://github.com/googleapis/google-cloud-go/commit/4fe9ae4b7101af2a5221d6d6b2e77b479305bb06))\n\n## [0.3.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.2.2...auth/v0.3.0) (2024-04-23)\n\n\n### Features\n\n* **auth/httptransport:** Add ability to customize transport ([#10023](https://github.com/googleapis/google-cloud-go/issues/10023)) ([72c7f6b](https://github.com/googleapis/google-cloud-go/commit/72c7f6bbec3136cc7a62788fc7186bc33ef6c3b3)), refs [#9812](https://github.com/googleapis/google-cloud-go/issues/9812) [#9814](https://github.com/googleapis/google-cloud-go/issues/9814)\n\n\n### Bug Fixes\n\n* **auth/credentials:** Error on bad file name if explicitly set ([#10018](https://github.com/googleapis/google-cloud-go/issues/10018)) ([55beaa9](https://github.com/googleapis/google-cloud-go/commit/55beaa993aaf052d8be39766afc6777c3c2a0bdd)), refs [#9809](https://github.com/googleapis/google-cloud-go/issues/9809)\n\n## [0.2.2](https://github.com/googleapis/google-cloud-go/compare/auth/v0.2.1...auth/v0.2.2) (2024-04-19)\n\n\n### Bug Fixes\n\n* **auth:** Add internal opt to skip validation on transports ([#9999](https://github.com/googleapis/google-cloud-go/issues/9999)) ([9e20ef8](https://github.com/googleapis/google-cloud-go/commit/9e20ef89f6287d6bd03b8697d5898dc43b4a77cf)), refs [#9823](https://github.com/googleapis/google-cloud-go/issues/9823)\n* **auth:** Set secure flag for gRPC conn pools ([#10002](https://github.com/googleapis/google-cloud-go/issues/10002)) ([14e3956](https://github.com/googleapis/google-cloud-go/commit/14e3956dfd736399731b5ee8d9b178ae085cf7ba)), refs [#9833](https://github.com/googleapis/google-cloud-go/issues/9833)\n\n## [0.2.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.2.0...auth/v0.2.1) (2024-04-18)\n\n\n### Bug Fixes\n\n* **auth:** Default gRPC token type to Bearer if not set ([#9800](https://github.com/googleapis/google-cloud-go/issues/9800)) ([5284066](https://github.com/googleapis/google-cloud-go/commit/5284066670b6fe65d79089cfe0199c9660f87fc7))\n\n## [0.2.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.1.1...auth/v0.2.0) (2024-04-15)\n\n### Breaking Changes\n\nIn the below mentioned commits there were a few large breaking changes since the\nlast release of the module.\n\n1. The `Credentials` type has been moved to the root of the module as it is\n   becoming the core abstraction for the whole module.\n2. Because of the above mentioned change many functions that previously\n   returned a `TokenProvider` now return `Credentials`. Similarly, these\n   functions have been renamed to be more specific.\n3. Most places that used to take an optional `TokenProvider` now accept\n   `Credentials`. You can make a `Credentials` from a `TokenProvider` using the\n   constructor found in the `auth` package.\n4. The `detect` package has been renamed to `credentials`. With this change some\n   function signatures were also updated for better readability.\n5. Derivative auth flows like `impersonate` and `downscope` have been moved to\n   be under the new `credentials` package.\n\nAlthough these changes are disruptive we think that they are for the best of the\nlong-term health of the module. We do not expect any more large breaking changes\nlike these in future revisions, even before 1.0.0. This version will be the\nfirst version of the auth library that our client libraries start to use and\ndepend on.\n\n### Features\n\n* **auth/credentials/externalaccount:** Add default TokenURL ([#9700](https://github.com/googleapis/google-cloud-go/issues/9700)) ([81830e6](https://github.com/googleapis/google-cloud-go/commit/81830e6848ceefd055aa4d08f933d1154455a0f6))\n* **auth:** Add downscope.Options.UniverseDomain ([#9634](https://github.com/googleapis/google-cloud-go/issues/9634)) ([52cf7d7](https://github.com/googleapis/google-cloud-go/commit/52cf7d780853594291c4e34302d618299d1f5a1d))\n* **auth:** Add universe domain to grpctransport and httptransport ([#9663](https://github.com/googleapis/google-cloud-go/issues/9663)) ([67d353b](https://github.com/googleapis/google-cloud-go/commit/67d353beefe3b607c08c891876fbd95ab89e5fe3)), refs [#9670](https://github.com/googleapis/google-cloud-go/issues/9670)\n* **auth:** Add UniverseDomain to DetectOptions ([#9536](https://github.com/googleapis/google-cloud-go/issues/9536)) ([3618d3f](https://github.com/googleapis/google-cloud-go/commit/3618d3f7061615c0e189f376c75abc201203b501))\n* **auth:** Make package externalaccount public ([#9633](https://github.com/googleapis/google-cloud-go/issues/9633)) ([a0978d8](https://github.com/googleapis/google-cloud-go/commit/a0978d8e96968399940ebd7d092539772bf9caac))\n* **auth:** Move credentials to base auth package ([#9590](https://github.com/googleapis/google-cloud-go/issues/9590)) ([1a04baf](https://github.com/googleapis/google-cloud-go/commit/1a04bafa83c27342b9308d785645e1e5423ea10d))\n* **auth:** Refactor public sigs to use Credentials ([#9603](https://github.com/googleapis/google-cloud-go/issues/9603)) ([69cb240](https://github.com/googleapis/google-cloud-go/commit/69cb240c530b1f7173a9af2555c19e9a1beb56c5))\n\n\n### Bug Fixes\n\n* **auth/oauth2adapt:** Update protobuf dep to v1.33.0 ([30b038d](https://github.com/googleapis/google-cloud-go/commit/30b038d8cac0b8cd5dd4761c87f3f298760dd33a))\n* **auth:** Fix uint32 conversion ([9221c7f](https://github.com/googleapis/google-cloud-go/commit/9221c7fa12cef9d5fb7ddc92f41f1d6204971c7b))\n* **auth:** Port sts expires fix ([#9618](https://github.com/googleapis/google-cloud-go/issues/9618)) ([7bec97b](https://github.com/googleapis/google-cloud-go/commit/7bec97b2f51ed3ac4f9b88bf100d301da3f5d1bd))\n* **auth:** Read universe_domain from all credentials files ([#9632](https://github.com/googleapis/google-cloud-go/issues/9632)) ([16efbb5](https://github.com/googleapis/google-cloud-go/commit/16efbb52e39ea4a319e5ee1e95c0e0305b6d9824))\n* **auth:** Remove content-type header from idms get requests ([#9508](https://github.com/googleapis/google-cloud-go/issues/9508)) ([8589f41](https://github.com/googleapis/google-cloud-go/commit/8589f41599d265d7c3d46a3d86c9fab2329cbdd9))\n* **auth:** Update protobuf dep to v1.33.0 ([30b038d](https://github.com/googleapis/google-cloud-go/commit/30b038d8cac0b8cd5dd4761c87f3f298760dd33a))\n\n## [0.1.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.1.0...auth/v0.1.1) (2024-03-10)\n\n\n### Bug Fixes\n\n* **auth/impersonate:** Properly send default detect params ([#9529](https://github.com/googleapis/google-cloud-go/issues/9529)) ([5b6b8be](https://github.com/googleapis/google-cloud-go/commit/5b6b8bef577f82707e51f5cc5d258d5bdf90218f)), refs [#9136](https://github.com/googleapis/google-cloud-go/issues/9136)\n* **auth:** Update grpc-go to v1.56.3 ([343cea8](https://github.com/googleapis/google-cloud-go/commit/343cea8c43b1e31ae21ad50ad31d3b0b60143f8c))\n* **auth:** Update grpc-go to v1.59.0 ([81a97b0](https://github.com/googleapis/google-cloud-go/commit/81a97b06cb28b25432e4ece595c55a9857e960b7))\n\n## 0.1.0 (2023-10-18)\n\n\n### Features\n\n* **auth:** Add base auth package ([#8465](https://github.com/googleapis/google-cloud-go/issues/8465)) ([6a45f26](https://github.com/googleapis/google-cloud-go/commit/6a45f26b809b64edae21f312c18d4205f96b180e))\n* **auth:** Add cert support to httptransport ([#8569](https://github.com/googleapis/google-cloud-go/issues/8569)) ([37e3435](https://github.com/googleapis/google-cloud-go/commit/37e3435f8e98595eafab481bdfcb31a4c56fa993))\n* **auth:** Add Credentials.UniverseDomain() ([#8654](https://github.com/googleapis/google-cloud-go/issues/8654)) ([af0aa1e](https://github.com/googleapis/google-cloud-go/commit/af0aa1ed8015bc8fe0dd87a7549ae029107cbdb8))\n* **auth:** Add detect package ([#8491](https://github.com/googleapis/google-cloud-go/issues/8491)) ([d977419](https://github.com/googleapis/google-cloud-go/commit/d977419a3269f6acc193df77a2136a6eb4b4add7))\n* **auth:** Add downscope package ([#8532](https://github.com/googleapis/google-cloud-go/issues/8532)) ([dda9bff](https://github.com/googleapis/google-cloud-go/commit/dda9bff8ec70e6d104901b4105d13dcaa4e2404c))\n* **auth:** Add grpctransport package ([#8625](https://github.com/googleapis/google-cloud-go/issues/8625)) ([69a8347](https://github.com/googleapis/google-cloud-go/commit/69a83470bdcc7ed10c6c36d1abc3b7cfdb8a0ee5))\n* **auth:** Add httptransport package ([#8567](https://github.com/googleapis/google-cloud-go/issues/8567)) ([6898597](https://github.com/googleapis/google-cloud-go/commit/6898597d2ea95d630fcd00fd15c58c75ea843bff))\n* **auth:** Add idtoken package ([#8580](https://github.com/googleapis/google-cloud-go/issues/8580)) ([a79e693](https://github.com/googleapis/google-cloud-go/commit/a79e693e97e4e3e1c6742099af3dbc58866d88fe))\n* **auth:** Add impersonate package ([#8578](https://github.com/googleapis/google-cloud-go/issues/8578)) ([e29ba0c](https://github.com/googleapis/google-cloud-go/commit/e29ba0cb7bd3888ab9e808087027dc5a32474c04))\n* **auth:** Add support for external accounts in detect ([#8508](https://github.com/googleapis/google-cloud-go/issues/8508)) ([62210d5](https://github.com/googleapis/google-cloud-go/commit/62210d5d3e56e8e9f35db8e6ac0defec19582507))\n* **auth:** Port external account changes ([#8697](https://github.com/googleapis/google-cloud-go/issues/8697)) ([5823db5](https://github.com/googleapis/google-cloud-go/commit/5823db5d633069999b58b9131a7f9cd77e82c899))\n\n\n### Bug Fixes\n\n* **auth/oauth2adapt:** Update golang.org/x/net to v0.17.0 ([174da47](https://github.com/googleapis/google-cloud-go/commit/174da47254fefb12921bbfc65b7829a453af6f5d))\n* **auth:** Update golang.org/x/net to v0.17.0 ([174da47](https://github.com/googleapis/google-cloud-go/commit/174da47254fefb12921bbfc65b7829a453af6f5d))\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/README.md",
    "content": "# Google Auth Library for Go\n\n[![Go Reference](https://pkg.go.dev/badge/cloud.google.com/go/auth.svg)](https://pkg.go.dev/cloud.google.com/go/auth)\n\n## Install\n\n``` bash\ngo get cloud.google.com/go/auth@latest\n```\n\n## Usage\n\nThe most common way this library is used is transitively, by default, from any\nof our Go client libraries.\n\n### Notable use-cases\n\n- To create a credential directly please see examples in the\n  [credentials](https://pkg.go.dev/cloud.google.com/go/auth/credentials)\n  package.\n- To create a authenticated HTTP client please see examples in the\n  [httptransport](https://pkg.go.dev/cloud.google.com/go/auth/httptransport)\n  package.\n- To create a authenticated gRPC connection please see examples in the\n  [grpctransport](https://pkg.go.dev/cloud.google.com/go/auth/grpctransport)\n  package.\n- To create an ID token please see examples in the\n  [idtoken](https://pkg.go.dev/cloud.google.com/go/auth/credentials/idtoken)\n  package.\n\n## Contributing\n\nContributions are welcome. Please, see the\n[CONTRIBUTING](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/main/CONTRIBUTING.md)\ndocument for details.\n\nPlease note that this project is released with a Contributor Code of Conduct.\nBy participating in this project you agree to abide by its terms.\nSee [Contributor Code of Conduct](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/main/CONTRIBUTING.md#contributor-code-of-conduct)\nfor more information.\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/auth.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package auth provides utilities for managing Google Cloud credentials,\n// including functionality for creating, caching, and refreshing OAuth2 tokens.\n// It offers customizable options for different OAuth2 flows, such as 2-legged\n// (2LO) and 3-legged (3LO) OAuth, along with support for PKCE and automatic\n// token management.\npackage auth\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"cloud.google.com/go/auth/internal\"\n\t\"cloud.google.com/go/auth/internal/jwt\"\n\t\"github.com/googleapis/gax-go/v2/internallog\"\n)\n\nconst (\n\t// Parameter keys for AuthCodeURL method to support PKCE.\n\tcodeChallengeKey       = \"code_challenge\"\n\tcodeChallengeMethodKey = \"code_challenge_method\"\n\n\t// Parameter key for Exchange method to support PKCE.\n\tcodeVerifierKey = \"code_verifier\"\n\n\t// 3 minutes and 45 seconds before expiration. The shortest MDS cache is 4 minutes,\n\t// so we give it 15 seconds to refresh it's cache before attempting to refresh a token.\n\tdefaultExpiryDelta = 225 * time.Second\n\n\tuniverseDomainDefault = \"googleapis.com\"\n)\n\n// tokenState represents different states for a [Token].\ntype tokenState int\n\nconst (\n\t// fresh indicates that the [Token] is valid. It is not expired or close to\n\t// expired, or the token has no expiry.\n\tfresh tokenState = iota\n\t// stale indicates that the [Token] is close to expired, and should be\n\t// refreshed. The token can be used normally.\n\tstale\n\t// invalid indicates that the [Token] is expired or invalid. The token\n\t// cannot be used for a normal operation.\n\tinvalid\n)\n\nvar (\n\tdefaultGrantType = \"urn:ietf:params:oauth:grant-type:jwt-bearer\"\n\tdefaultHeader    = &jwt.Header{Algorithm: jwt.HeaderAlgRSA256, Type: jwt.HeaderType}\n\n\t// for testing\n\ttimeNow = time.Now\n)\n\n// TokenProvider specifies an interface for anything that can return a token.\ntype TokenProvider interface {\n\t// Token returns a Token or an error.\n\t// The Token returned must be safe to use\n\t// concurrently.\n\t// The returned Token must not be modified.\n\t// The context provided must be sent along to any requests that are made in\n\t// the implementing code.\n\tToken(context.Context) (*Token, error)\n}\n\n// Token holds the credential token used to authorized requests. All fields are\n// considered read-only.\ntype Token struct {\n\t// Value is the token used to authorize requests. It is usually an access\n\t// token but may be other types of tokens such as ID tokens in some flows.\n\tValue string\n\t// Type is the type of token Value is. If uninitialized, it should be\n\t// assumed to be a \"Bearer\" token.\n\tType string\n\t// Expiry is the time the token is set to expire.\n\tExpiry time.Time\n\t// Metadata  may include, but is not limited to, the body of the token\n\t// response returned by the server.\n\tMetadata map[string]interface{} // TODO(codyoss): maybe make a method to flatten metadata to avoid []string for url.Values\n}\n\n// IsValid reports that a [Token] is non-nil, has a [Token.Value], and has not\n// expired. A token is considered expired if [Token.Expiry] has passed or will\n// pass in the next 225 seconds.\nfunc (t *Token) IsValid() bool {\n\treturn t.isValidWithEarlyExpiry(defaultExpiryDelta)\n}\n\n// MetadataString is a convenience method for accessing string values in the\n// token's metadata. Returns an empty string if the metadata is nil or the value\n// for the given key cannot be cast to a string.\nfunc (t *Token) MetadataString(k string) string {\n\tif t.Metadata == nil {\n\t\treturn \"\"\n\t}\n\ts, ok := t.Metadata[k].(string)\n\tif !ok {\n\t\treturn \"\"\n\t}\n\treturn s\n}\n\nfunc (t *Token) isValidWithEarlyExpiry(earlyExpiry time.Duration) bool {\n\tif t.isEmpty() {\n\t\treturn false\n\t}\n\tif t.Expiry.IsZero() {\n\t\treturn true\n\t}\n\treturn !t.Expiry.Round(0).Add(-earlyExpiry).Before(timeNow())\n}\n\nfunc (t *Token) isEmpty() bool {\n\treturn t == nil || t.Value == \"\"\n}\n\n// Credentials holds Google credentials, including\n// [Application Default Credentials].\n//\n// [Application Default Credentials]: https://developers.google.com/accounts/docs/application-default-credentials\ntype Credentials struct {\n\tjson           []byte\n\tprojectID      CredentialsPropertyProvider\n\tquotaProjectID CredentialsPropertyProvider\n\t// universeDomain is the default service domain for a given Cloud universe.\n\tuniverseDomain CredentialsPropertyProvider\n\n\tTokenProvider\n}\n\n// JSON returns the bytes associated with the the file used to source\n// credentials if one was used.\nfunc (c *Credentials) JSON() []byte {\n\treturn c.json\n}\n\n// ProjectID returns the associated project ID from the underlying file or\n// environment.\nfunc (c *Credentials) ProjectID(ctx context.Context) (string, error) {\n\tif c.projectID == nil {\n\t\treturn internal.GetProjectID(c.json, \"\"), nil\n\t}\n\tv, err := c.projectID.GetProperty(ctx)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn internal.GetProjectID(c.json, v), nil\n}\n\n// QuotaProjectID returns the associated quota project ID from the underlying\n// file or environment.\nfunc (c *Credentials) QuotaProjectID(ctx context.Context) (string, error) {\n\tif c.quotaProjectID == nil {\n\t\treturn internal.GetQuotaProject(c.json, \"\"), nil\n\t}\n\tv, err := c.quotaProjectID.GetProperty(ctx)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn internal.GetQuotaProject(c.json, v), nil\n}\n\n// UniverseDomain returns the default service domain for a given Cloud universe.\n// The default value is \"googleapis.com\".\nfunc (c *Credentials) UniverseDomain(ctx context.Context) (string, error) {\n\tif c.universeDomain == nil {\n\t\treturn universeDomainDefault, nil\n\t}\n\tv, err := c.universeDomain.GetProperty(ctx)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif v == \"\" {\n\t\treturn universeDomainDefault, nil\n\t}\n\treturn v, err\n}\n\n// CredentialsPropertyProvider provides an implementation to fetch a property\n// value for [Credentials].\ntype CredentialsPropertyProvider interface {\n\tGetProperty(context.Context) (string, error)\n}\n\n// CredentialsPropertyFunc is a type adapter to allow the use of ordinary\n// functions as a [CredentialsPropertyProvider].\ntype CredentialsPropertyFunc func(context.Context) (string, error)\n\n// GetProperty loads the properly value provided the given context.\nfunc (p CredentialsPropertyFunc) GetProperty(ctx context.Context) (string, error) {\n\treturn p(ctx)\n}\n\n// CredentialsOptions are used to configure [Credentials].\ntype CredentialsOptions struct {\n\t// TokenProvider is a means of sourcing a token for the credentials. Required.\n\tTokenProvider TokenProvider\n\t// JSON is the raw contents of the credentials file if sourced from a file.\n\tJSON []byte\n\t// ProjectIDProvider resolves the project ID associated with the\n\t// credentials.\n\tProjectIDProvider CredentialsPropertyProvider\n\t// QuotaProjectIDProvider resolves the quota project ID associated with the\n\t// credentials.\n\tQuotaProjectIDProvider CredentialsPropertyProvider\n\t// UniverseDomainProvider resolves the universe domain with the credentials.\n\tUniverseDomainProvider CredentialsPropertyProvider\n}\n\n// NewCredentials returns new [Credentials] from the provided options.\nfunc NewCredentials(opts *CredentialsOptions) *Credentials {\n\tcreds := &Credentials{\n\t\tTokenProvider:  opts.TokenProvider,\n\t\tjson:           opts.JSON,\n\t\tprojectID:      opts.ProjectIDProvider,\n\t\tquotaProjectID: opts.QuotaProjectIDProvider,\n\t\tuniverseDomain: opts.UniverseDomainProvider,\n\t}\n\n\treturn creds\n}\n\n// CachedTokenProviderOptions provides options for configuring a cached\n// [TokenProvider].\ntype CachedTokenProviderOptions struct {\n\t// DisableAutoRefresh makes the TokenProvider always return the same token,\n\t// even if it is expired. The default is false. Optional.\n\tDisableAutoRefresh bool\n\t// ExpireEarly configures the amount of time before a token expires, that it\n\t// should be refreshed. If unset, the default value is 3 minutes and 45\n\t// seconds. Optional.\n\tExpireEarly time.Duration\n\t// DisableAsyncRefresh configures a synchronous workflow that refreshes\n\t// tokens in a blocking manner. The default is false. Optional.\n\tDisableAsyncRefresh bool\n}\n\nfunc (ctpo *CachedTokenProviderOptions) autoRefresh() bool {\n\tif ctpo == nil {\n\t\treturn true\n\t}\n\treturn !ctpo.DisableAutoRefresh\n}\n\nfunc (ctpo *CachedTokenProviderOptions) expireEarly() time.Duration {\n\tif ctpo == nil || ctpo.ExpireEarly == 0 {\n\t\treturn defaultExpiryDelta\n\t}\n\treturn ctpo.ExpireEarly\n}\n\nfunc (ctpo *CachedTokenProviderOptions) blockingRefresh() bool {\n\tif ctpo == nil {\n\t\treturn false\n\t}\n\treturn ctpo.DisableAsyncRefresh\n}\n\n// NewCachedTokenProvider wraps a [TokenProvider] to cache the tokens returned\n// by the underlying provider. By default it will refresh tokens asynchronously\n// a few minutes before they expire.\nfunc NewCachedTokenProvider(tp TokenProvider, opts *CachedTokenProviderOptions) TokenProvider {\n\tif ctp, ok := tp.(*cachedTokenProvider); ok {\n\t\treturn ctp\n\t}\n\treturn &cachedTokenProvider{\n\t\ttp:              tp,\n\t\tautoRefresh:     opts.autoRefresh(),\n\t\texpireEarly:     opts.expireEarly(),\n\t\tblockingRefresh: opts.blockingRefresh(),\n\t}\n}\n\ntype cachedTokenProvider struct {\n\ttp              TokenProvider\n\tautoRefresh     bool\n\texpireEarly     time.Duration\n\tblockingRefresh bool\n\n\tmu          sync.Mutex\n\tcachedToken *Token\n\t// isRefreshRunning ensures that the non-blocking refresh will only be\n\t// attempted once, even if multiple callers enter the Token method.\n\tisRefreshRunning bool\n\t// isRefreshErr ensures that the non-blocking refresh will only be attempted\n\t// once per refresh window if an error is encountered.\n\tisRefreshErr bool\n}\n\nfunc (c *cachedTokenProvider) Token(ctx context.Context) (*Token, error) {\n\tif c.blockingRefresh {\n\t\treturn c.tokenBlocking(ctx)\n\t}\n\treturn c.tokenNonBlocking(ctx)\n}\n\nfunc (c *cachedTokenProvider) tokenNonBlocking(ctx context.Context) (*Token, error) {\n\tswitch c.tokenState() {\n\tcase fresh:\n\t\tc.mu.Lock()\n\t\tdefer c.mu.Unlock()\n\t\treturn c.cachedToken, nil\n\tcase stale:\n\t\t// Call tokenAsync with a new Context because the user-provided context\n\t\t// may have a short timeout incompatible with async token refresh.\n\t\tc.tokenAsync(context.Background())\n\t\t// Return the stale token immediately to not block customer requests to Cloud services.\n\t\tc.mu.Lock()\n\t\tdefer c.mu.Unlock()\n\t\treturn c.cachedToken, nil\n\tdefault: // invalid\n\t\treturn c.tokenBlocking(ctx)\n\t}\n}\n\n// tokenState reports the token's validity.\nfunc (c *cachedTokenProvider) tokenState() tokenState {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\tt := c.cachedToken\n\tnow := timeNow()\n\tif t == nil || t.Value == \"\" {\n\t\treturn invalid\n\t} else if t.Expiry.IsZero() {\n\t\treturn fresh\n\t} else if now.After(t.Expiry.Round(0)) {\n\t\treturn invalid\n\t} else if now.After(t.Expiry.Round(0).Add(-c.expireEarly)) {\n\t\treturn stale\n\t}\n\treturn fresh\n}\n\n// tokenAsync uses a bool to ensure that only one non-blocking token refresh\n// happens at a time, even if multiple callers have entered this function\n// concurrently. This avoids creating an arbitrary number of concurrent\n// goroutines. Retries should be attempted and managed within the Token method.\n// If the refresh attempt fails, no further attempts are made until the refresh\n// window expires and the token enters the invalid state, at which point the\n// blocking call to Token should likely return the same error on the main goroutine.\nfunc (c *cachedTokenProvider) tokenAsync(ctx context.Context) {\n\tfn := func() {\n\t\tc.mu.Lock()\n\t\tc.isRefreshRunning = true\n\t\tc.mu.Unlock()\n\t\tt, err := c.tp.Token(ctx)\n\t\tc.mu.Lock()\n\t\tdefer c.mu.Unlock()\n\t\tc.isRefreshRunning = false\n\t\tif err != nil {\n\t\t\t// Discard errors from the non-blocking refresh, but prevent further\n\t\t\t// attempts.\n\t\t\tc.isRefreshErr = true\n\t\t\treturn\n\t\t}\n\t\tc.cachedToken = t\n\t}\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\tif !c.isRefreshRunning && !c.isRefreshErr {\n\t\tgo fn()\n\t}\n}\n\nfunc (c *cachedTokenProvider) tokenBlocking(ctx context.Context) (*Token, error) {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\tc.isRefreshErr = false\n\tif c.cachedToken.IsValid() || (!c.autoRefresh && !c.cachedToken.isEmpty()) {\n\t\treturn c.cachedToken, nil\n\t}\n\tt, err := c.tp.Token(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tc.cachedToken = t\n\treturn t, nil\n}\n\n// Error is a error associated with retrieving a [Token]. It can hold useful\n// additional details for debugging.\ntype Error struct {\n\t// Response is the HTTP response associated with error. The body will always\n\t// be already closed and consumed.\n\tResponse *http.Response\n\t// Body is the HTTP response body.\n\tBody []byte\n\t// Err is the underlying wrapped error.\n\tErr error\n\n\t// code returned in the token response\n\tcode string\n\t// description returned in the token response\n\tdescription string\n\t// uri returned in the token response\n\turi string\n}\n\nfunc (e *Error) Error() string {\n\tif e.code != \"\" {\n\t\ts := fmt.Sprintf(\"auth: %q\", e.code)\n\t\tif e.description != \"\" {\n\t\t\ts += fmt.Sprintf(\" %q\", e.description)\n\t\t}\n\t\tif e.uri != \"\" {\n\t\t\ts += fmt.Sprintf(\" %q\", e.uri)\n\t\t}\n\t\treturn s\n\t}\n\treturn fmt.Sprintf(\"auth: cannot fetch token: %v\\nResponse: %s\", e.Response.StatusCode, e.Body)\n}\n\n// Temporary returns true if the error is considered temporary and may be able\n// to be retried.\nfunc (e *Error) Temporary() bool {\n\tif e.Response == nil {\n\t\treturn false\n\t}\n\tsc := e.Response.StatusCode\n\treturn sc == http.StatusInternalServerError || sc == http.StatusServiceUnavailable || sc == http.StatusRequestTimeout || sc == http.StatusTooManyRequests\n}\n\nfunc (e *Error) Unwrap() error {\n\treturn e.Err\n}\n\n// Style describes how the token endpoint wants to receive the ClientID and\n// ClientSecret.\ntype Style int\n\nconst (\n\t// StyleUnknown means the value has not been initiated. Sending this in\n\t// a request will cause the token exchange to fail.\n\tStyleUnknown Style = iota\n\t// StyleInParams sends client info in the body of a POST request.\n\tStyleInParams\n\t// StyleInHeader sends client info using Basic Authorization header.\n\tStyleInHeader\n)\n\n// Options2LO is the configuration settings for doing a 2-legged JWT OAuth2 flow.\ntype Options2LO struct {\n\t// Email is the OAuth2 client ID. This value is set as the \"iss\" in the\n\t// JWT.\n\tEmail string\n\t// PrivateKey contains the contents of an RSA private key or the\n\t// contents of a PEM file that contains a private key. It is used to sign\n\t// the JWT created.\n\tPrivateKey []byte\n\t// TokenURL is th URL the JWT is sent to. Required.\n\tTokenURL string\n\t// PrivateKeyID is the ID of the key used to sign the JWT. It is used as the\n\t// \"kid\" in the JWT header. Optional.\n\tPrivateKeyID string\n\t// Subject is the used for to impersonate a user. It is used as the \"sub\" in\n\t// the JWT.m Optional.\n\tSubject string\n\t// Scopes specifies requested permissions for the token. Optional.\n\tScopes []string\n\t// Expires specifies the lifetime of the token. Optional.\n\tExpires time.Duration\n\t// Audience specifies the \"aud\" in the JWT. Optional.\n\tAudience string\n\t// PrivateClaims allows specifying any custom claims for the JWT. Optional.\n\tPrivateClaims map[string]interface{}\n\n\t// Client is the client to be used to make the underlying token requests.\n\t// Optional.\n\tClient *http.Client\n\t// UseIDToken requests that the token returned be an ID token if one is\n\t// returned from the server. Optional.\n\tUseIDToken bool\n\t// Logger is used for debug logging. If provided, logging will be enabled\n\t// at the loggers configured level. By default logging is disabled unless\n\t// enabled by setting GOOGLE_SDK_GO_LOGGING_LEVEL in which case a default\n\t// logger will be used. Optional.\n\tLogger *slog.Logger\n}\n\nfunc (o *Options2LO) client() *http.Client {\n\tif o.Client != nil {\n\t\treturn o.Client\n\t}\n\treturn internal.DefaultClient()\n}\n\nfunc (o *Options2LO) validate() error {\n\tif o == nil {\n\t\treturn errors.New(\"auth: options must be provided\")\n\t}\n\tif o.Email == \"\" {\n\t\treturn errors.New(\"auth: email must be provided\")\n\t}\n\tif len(o.PrivateKey) == 0 {\n\t\treturn errors.New(\"auth: private key must be provided\")\n\t}\n\tif o.TokenURL == \"\" {\n\t\treturn errors.New(\"auth: token URL must be provided\")\n\t}\n\treturn nil\n}\n\n// New2LOTokenProvider returns a [TokenProvider] from the provided options.\nfunc New2LOTokenProvider(opts *Options2LO) (TokenProvider, error) {\n\tif err := opts.validate(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn tokenProvider2LO{opts: opts, Client: opts.client(), logger: internallog.New(opts.Logger)}, nil\n}\n\ntype tokenProvider2LO struct {\n\topts   *Options2LO\n\tClient *http.Client\n\tlogger *slog.Logger\n}\n\nfunc (tp tokenProvider2LO) Token(ctx context.Context) (*Token, error) {\n\tpk, err := internal.ParseKey(tp.opts.PrivateKey)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tclaimSet := &jwt.Claims{\n\t\tIss:              tp.opts.Email,\n\t\tScope:            strings.Join(tp.opts.Scopes, \" \"),\n\t\tAud:              tp.opts.TokenURL,\n\t\tAdditionalClaims: tp.opts.PrivateClaims,\n\t\tSub:              tp.opts.Subject,\n\t}\n\tif t := tp.opts.Expires; t > 0 {\n\t\tclaimSet.Exp = time.Now().Add(t).Unix()\n\t}\n\tif aud := tp.opts.Audience; aud != \"\" {\n\t\tclaimSet.Aud = aud\n\t}\n\th := *defaultHeader\n\th.KeyID = tp.opts.PrivateKeyID\n\tpayload, err := jwt.EncodeJWS(&h, claimSet, pk)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tv := url.Values{}\n\tv.Set(\"grant_type\", defaultGrantType)\n\tv.Set(\"assertion\", payload)\n\treq, err := http.NewRequestWithContext(ctx, \"POST\", tp.opts.TokenURL, strings.NewReader(v.Encode()))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treq.Header.Set(\"Content-Type\", \"application/x-www-form-urlencoded\")\n\ttp.logger.DebugContext(ctx, \"2LO token request\", \"request\", internallog.HTTPRequest(req, []byte(v.Encode())))\n\tresp, body, err := internal.DoRequest(tp.Client, req)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"auth: cannot fetch token: %w\", err)\n\t}\n\ttp.logger.DebugContext(ctx, \"2LO token response\", \"response\", internallog.HTTPResponse(resp, body))\n\tif c := resp.StatusCode; c < http.StatusOK || c >= http.StatusMultipleChoices {\n\t\treturn nil, &Error{\n\t\t\tResponse: resp,\n\t\t\tBody:     body,\n\t\t}\n\t}\n\t// tokenRes is the JSON response body.\n\tvar tokenRes struct {\n\t\tAccessToken string `json:\"access_token\"`\n\t\tTokenType   string `json:\"token_type\"`\n\t\tIDToken     string `json:\"id_token\"`\n\t\tExpiresIn   int64  `json:\"expires_in\"`\n\t}\n\tif err := json.Unmarshal(body, &tokenRes); err != nil {\n\t\treturn nil, fmt.Errorf(\"auth: cannot fetch token: %w\", err)\n\t}\n\ttoken := &Token{\n\t\tValue: tokenRes.AccessToken,\n\t\tType:  tokenRes.TokenType,\n\t}\n\ttoken.Metadata = make(map[string]interface{})\n\tjson.Unmarshal(body, &token.Metadata) // no error checks for optional fields\n\n\tif secs := tokenRes.ExpiresIn; secs > 0 {\n\t\ttoken.Expiry = time.Now().Add(time.Duration(secs) * time.Second)\n\t}\n\tif v := tokenRes.IDToken; v != \"\" {\n\t\t// decode returned id token to get expiry\n\t\tclaimSet, err := jwt.DecodeJWS(v)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"auth: error decoding JWT token: %w\", err)\n\t\t}\n\t\ttoken.Expiry = time.Unix(claimSet.Exp, 0)\n\t}\n\tif tp.opts.UseIDToken {\n\t\tif tokenRes.IDToken == \"\" {\n\t\t\treturn nil, fmt.Errorf(\"auth: response doesn't have JWT token\")\n\t\t}\n\t\ttoken.Value = tokenRes.IDToken\n\t}\n\treturn token, nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/credentials/compute.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage credentials\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/url\"\n\t\"strings\"\n\t\"time\"\n\n\t\"cloud.google.com/go/auth\"\n\t\"cloud.google.com/go/compute/metadata\"\n)\n\nvar (\n\tcomputeTokenMetadata = map[string]interface{}{\n\t\t\"auth.google.tokenSource\":    \"compute-metadata\",\n\t\t\"auth.google.serviceAccount\": \"default\",\n\t}\n\tcomputeTokenURI = \"instance/service-accounts/default/token\"\n)\n\n// computeTokenProvider creates a [cloud.google.com/go/auth.TokenProvider] that\n// uses the metadata service to retrieve tokens.\nfunc computeTokenProvider(opts *DetectOptions, client *metadata.Client) auth.TokenProvider {\n\treturn auth.NewCachedTokenProvider(&computeProvider{\n\t\tscopes:           opts.Scopes,\n\t\tclient:           client,\n\t\ttokenBindingType: opts.TokenBindingType,\n\t}, &auth.CachedTokenProviderOptions{\n\t\tExpireEarly:         opts.EarlyTokenRefresh,\n\t\tDisableAsyncRefresh: opts.DisableAsyncRefresh,\n\t})\n}\n\n// computeProvider fetches tokens from the google cloud metadata service.\ntype computeProvider struct {\n\tscopes           []string\n\tclient           *metadata.Client\n\ttokenBindingType TokenBindingType\n}\n\ntype metadataTokenResp struct {\n\tAccessToken  string `json:\"access_token\"`\n\tExpiresInSec int    `json:\"expires_in\"`\n\tTokenType    string `json:\"token_type\"`\n}\n\nfunc (cs *computeProvider) Token(ctx context.Context) (*auth.Token, error) {\n\ttokenURI, err := url.Parse(computeTokenURI)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\thasScopes := len(cs.scopes) > 0\n\tif hasScopes || cs.tokenBindingType != NoBinding {\n\t\tv := url.Values{}\n\t\tif hasScopes {\n\t\t\tv.Set(\"scopes\", strings.Join(cs.scopes, \",\"))\n\t\t}\n\t\tswitch cs.tokenBindingType {\n\t\tcase MTLSHardBinding:\n\t\t\tv.Set(\"transport\", \"mtls\")\n\t\t\tv.Set(\"binding-enforcement\", \"on\")\n\t\tcase ALTSHardBinding:\n\t\t\tv.Set(\"transport\", \"alts\")\n\t\t}\n\t\ttokenURI.RawQuery = v.Encode()\n\t}\n\ttokenJSON, err := cs.client.GetWithContext(ctx, tokenURI.String())\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"credentials: cannot fetch token: %w\", err)\n\t}\n\tvar res metadataTokenResp\n\tif err := json.NewDecoder(strings.NewReader(tokenJSON)).Decode(&res); err != nil {\n\t\treturn nil, fmt.Errorf(\"credentials: invalid token JSON from metadata: %w\", err)\n\t}\n\tif res.ExpiresInSec == 0 || res.AccessToken == \"\" {\n\t\treturn nil, errors.New(\"credentials: incomplete token received from metadata\")\n\t}\n\treturn &auth.Token{\n\t\tValue:    res.AccessToken,\n\t\tType:     res.TokenType,\n\t\tExpiry:   time.Now().Add(time.Duration(res.ExpiresInSec) * time.Second),\n\t\tMetadata: computeTokenMetadata,\n\t}, nil\n\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/credentials/detect.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage credentials\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"os\"\n\t\"time\"\n\n\t\"cloud.google.com/go/auth\"\n\t\"cloud.google.com/go/auth/internal\"\n\t\"cloud.google.com/go/auth/internal/credsfile\"\n\t\"cloud.google.com/go/compute/metadata\"\n\t\"github.com/googleapis/gax-go/v2/internallog\"\n)\n\nconst (\n\t// jwtTokenURL is Google's OAuth 2.0 token URL to use with the JWT(2LO) flow.\n\tjwtTokenURL = \"https://oauth2.googleapis.com/token\"\n\n\t// Google's OAuth 2.0 default endpoints.\n\tgoogleAuthURL  = \"https://accounts.google.com/o/oauth2/auth\"\n\tgoogleTokenURL = \"https://oauth2.googleapis.com/token\"\n\n\t// GoogleMTLSTokenURL is Google's default OAuth2.0 mTLS endpoint.\n\tGoogleMTLSTokenURL = \"https://oauth2.mtls.googleapis.com/token\"\n\n\t// Help on default credentials\n\tadcSetupURL = \"https://cloud.google.com/docs/authentication/external/set-up-adc\"\n)\n\nvar (\n\t// for testing\n\tallowOnGCECheck = true\n)\n\n// TokenBindingType specifies the type of binding used when requesting a token\n// whether to request a hard-bound token using mTLS or an instance identity\n// bound token using ALTS.\ntype TokenBindingType int\n\nconst (\n\t// NoBinding specifies that requested tokens are not required to have a\n\t// binding. This is the default option.\n\tNoBinding TokenBindingType = iota\n\t// MTLSHardBinding specifies that a hard-bound token should be requested\n\t// using an mTLS with S2A channel.\n\tMTLSHardBinding\n\t// ALTSHardBinding specifies that an instance identity bound token should\n\t// be requested using an ALTS channel.\n\tALTSHardBinding\n)\n\n// OnGCE reports whether this process is running in Google Cloud.\nfunc OnGCE() bool {\n\t// TODO(codyoss): once all libs use this auth lib move metadata check here\n\treturn allowOnGCECheck && metadata.OnGCE()\n}\n\n// DetectDefault searches for \"Application Default Credentials\" and returns\n// a credential based on the [DetectOptions] provided.\n//\n// It looks for credentials in the following places, preferring the first\n// location found:\n//\n//   - A JSON file whose path is specified by the GOOGLE_APPLICATION_CREDENTIALS\n//     environment variable. For workload identity federation, refer to\n//     https://cloud.google.com/iam/docs/how-to#using-workload-identity-federation\n//     on how to generate the JSON configuration file for on-prem/non-Google\n//     cloud platforms.\n//   - A JSON file in a location known to the gcloud command-line tool. On\n//     Windows, this is %APPDATA%/gcloud/application_default_credentials.json. On\n//     other systems, $HOME/.config/gcloud/application_default_credentials.json.\n//   - On Google Compute Engine, Google App Engine standard second generation\n//     runtimes, and Google App Engine flexible environment, it fetches\n//     credentials from the metadata server.\nfunc DetectDefault(opts *DetectOptions) (*auth.Credentials, error) {\n\tif err := opts.validate(); err != nil {\n\t\treturn nil, err\n\t}\n\tif len(opts.CredentialsJSON) > 0 {\n\t\treturn readCredentialsFileJSON(opts.CredentialsJSON, opts)\n\t}\n\tif opts.CredentialsFile != \"\" {\n\t\treturn readCredentialsFile(opts.CredentialsFile, opts)\n\t}\n\tif filename := os.Getenv(credsfile.GoogleAppCredsEnvVar); filename != \"\" {\n\t\tcreds, err := readCredentialsFile(filename, opts)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn creds, nil\n\t}\n\n\tfileName := credsfile.GetWellKnownFileName()\n\tif b, err := os.ReadFile(fileName); err == nil {\n\t\treturn readCredentialsFileJSON(b, opts)\n\t}\n\n\tif OnGCE() {\n\t\tmetadataClient := metadata.NewWithOptions(&metadata.Options{\n\t\t\tLogger: opts.logger(),\n\t\t})\n\t\treturn auth.NewCredentials(&auth.CredentialsOptions{\n\t\t\tTokenProvider: computeTokenProvider(opts, metadataClient),\n\t\t\tProjectIDProvider: auth.CredentialsPropertyFunc(func(ctx context.Context) (string, error) {\n\t\t\t\treturn metadataClient.ProjectIDWithContext(ctx)\n\t\t\t}),\n\t\t\tUniverseDomainProvider: &internal.ComputeUniverseDomainProvider{\n\t\t\t\tMetadataClient: metadataClient,\n\t\t\t},\n\t\t}), nil\n\t}\n\n\treturn nil, fmt.Errorf(\"credentials: could not find default credentials. See %v for more information\", adcSetupURL)\n}\n\n// DetectOptions provides configuration for [DetectDefault].\ntype DetectOptions struct {\n\t// Scopes that credentials tokens should have. Example:\n\t// https://www.googleapis.com/auth/cloud-platform. Required if Audience is\n\t// not provided.\n\tScopes []string\n\t// TokenBindingType specifies the type of binding used when requesting a\n\t// token whether to request a hard-bound token using mTLS or an instance\n\t// identity bound token using ALTS. Optional.\n\tTokenBindingType TokenBindingType\n\t// Audience that credentials tokens should have. Only applicable for 2LO\n\t// flows with service accounts. If specified, scopes should not be provided.\n\tAudience string\n\t// Subject is the user email used for [domain wide delegation](https://developers.google.com/identity/protocols/oauth2/service-account#delegatingauthority).\n\t// Optional.\n\tSubject string\n\t// EarlyTokenRefresh configures how early before a token expires that it\n\t// should be refreshed. Once the token’s time until expiration has entered\n\t// this refresh window the token is considered valid but stale. If unset,\n\t// the default value is 3 minutes and 45 seconds. Optional.\n\tEarlyTokenRefresh time.Duration\n\t// DisableAsyncRefresh configures a synchronous workflow that refreshes\n\t// stale tokens while blocking. The default is false. Optional.\n\tDisableAsyncRefresh bool\n\t// AuthHandlerOptions configures an authorization handler and other options\n\t// for 3LO flows. It is required, and only used, for client credential\n\t// flows.\n\tAuthHandlerOptions *auth.AuthorizationHandlerOptions\n\t// TokenURL allows to set the token endpoint for user credential flows. If\n\t// unset the default value is: https://oauth2.googleapis.com/token.\n\t// Optional.\n\tTokenURL string\n\t// STSAudience is the audience sent to when retrieving an STS token.\n\t// Currently this only used for GDCH auth flow, for which it is required.\n\tSTSAudience string\n\t// CredentialsFile overrides detection logic and sources a credential file\n\t// from the provided filepath. If provided, CredentialsJSON must not be.\n\t// Optional.\n\t//\n\t// Important: If you accept a credential configuration (credential\n\t// JSON/File/Stream) from an external source for authentication to Google\n\t// Cloud Platform, you must validate it before providing it to any Google\n\t// API or library. Providing an unvalidated credential configuration to\n\t// Google APIs can compromise the security of your systems and data. For\n\t// more information, refer to [Validate credential configurations from\n\t// external sources](https://cloud.google.com/docs/authentication/external/externally-sourced-credentials).\n\tCredentialsFile string\n\t// CredentialsJSON overrides detection logic and uses the JSON bytes as the\n\t// source for the credential. If provided, CredentialsFile must not be.\n\t// Optional.\n\t//\n\t// Important: If you accept a credential configuration (credential\n\t// JSON/File/Stream) from an external source for authentication to Google\n\t// Cloud Platform, you must validate it before providing it to any Google\n\t// API or library. Providing an unvalidated credential configuration to\n\t// Google APIs can compromise the security of your systems and data. For\n\t// more information, refer to [Validate credential configurations from\n\t// external sources](https://cloud.google.com/docs/authentication/external/externally-sourced-credentials).\n\tCredentialsJSON []byte\n\t// UseSelfSignedJWT directs service account based credentials to create a\n\t// self-signed JWT with the private key found in the file, skipping any\n\t// network requests that would normally be made. Optional.\n\tUseSelfSignedJWT bool\n\t// Client configures the underlying client used to make network requests\n\t// when fetching tokens. Optional.\n\tClient *http.Client\n\t// UniverseDomain is the default service domain for a given Cloud universe.\n\t// The default value is \"googleapis.com\". This option is ignored for\n\t// authentication flows that do not support universe domain. Optional.\n\tUniverseDomain string\n\t// Logger is used for debug logging. If provided, logging will be enabled\n\t// at the loggers configured level. By default logging is disabled unless\n\t// enabled by setting GOOGLE_SDK_GO_LOGGING_LEVEL in which case a default\n\t// logger will be used. Optional.\n\tLogger *slog.Logger\n}\n\nfunc (o *DetectOptions) validate() error {\n\tif o == nil {\n\t\treturn errors.New(\"credentials: options must be provided\")\n\t}\n\tif len(o.Scopes) > 0 && o.Audience != \"\" {\n\t\treturn errors.New(\"credentials: both scopes and audience were provided\")\n\t}\n\tif len(o.CredentialsJSON) > 0 && o.CredentialsFile != \"\" {\n\t\treturn errors.New(\"credentials: both credentials file and JSON were provided\")\n\t}\n\treturn nil\n}\n\nfunc (o *DetectOptions) tokenURL() string {\n\tif o.TokenURL != \"\" {\n\t\treturn o.TokenURL\n\t}\n\treturn googleTokenURL\n}\n\nfunc (o *DetectOptions) scopes() []string {\n\tscopes := make([]string, len(o.Scopes))\n\tcopy(scopes, o.Scopes)\n\treturn scopes\n}\n\nfunc (o *DetectOptions) client() *http.Client {\n\tif o.Client != nil {\n\t\treturn o.Client\n\t}\n\treturn internal.DefaultClient()\n}\n\nfunc (o *DetectOptions) logger() *slog.Logger {\n\treturn internallog.New(o.Logger)\n}\n\nfunc readCredentialsFile(filename string, opts *DetectOptions) (*auth.Credentials, error) {\n\tb, err := os.ReadFile(filename)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn readCredentialsFileJSON(b, opts)\n}\n\nfunc readCredentialsFileJSON(b []byte, opts *DetectOptions) (*auth.Credentials, error) {\n\t// attempt to parse jsonData as a Google Developers Console client_credentials.json.\n\tconfig := clientCredConfigFromJSON(b, opts)\n\tif config != nil {\n\t\tif config.AuthHandlerOpts == nil {\n\t\t\treturn nil, errors.New(\"credentials: auth handler must be specified for this credential filetype\")\n\t\t}\n\t\ttp, err := auth.New3LOTokenProvider(config)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn auth.NewCredentials(&auth.CredentialsOptions{\n\t\t\tTokenProvider: tp,\n\t\t\tJSON:          b,\n\t\t}), nil\n\t}\n\treturn fileCredentials(b, opts)\n}\n\nfunc clientCredConfigFromJSON(b []byte, opts *DetectOptions) *auth.Options3LO {\n\tvar creds credsfile.ClientCredentialsFile\n\tvar c *credsfile.Config3LO\n\tif err := json.Unmarshal(b, &creds); err != nil {\n\t\treturn nil\n\t}\n\tswitch {\n\tcase creds.Web != nil:\n\t\tc = creds.Web\n\tcase creds.Installed != nil:\n\t\tc = creds.Installed\n\tdefault:\n\t\treturn nil\n\t}\n\tif len(c.RedirectURIs) < 1 {\n\t\treturn nil\n\t}\n\tvar handleOpts *auth.AuthorizationHandlerOptions\n\tif opts.AuthHandlerOptions != nil {\n\t\thandleOpts = &auth.AuthorizationHandlerOptions{\n\t\t\tHandler:  opts.AuthHandlerOptions.Handler,\n\t\t\tState:    opts.AuthHandlerOptions.State,\n\t\t\tPKCEOpts: opts.AuthHandlerOptions.PKCEOpts,\n\t\t}\n\t}\n\treturn &auth.Options3LO{\n\t\tClientID:         c.ClientID,\n\t\tClientSecret:     c.ClientSecret,\n\t\tRedirectURL:      c.RedirectURIs[0],\n\t\tScopes:           opts.scopes(),\n\t\tAuthURL:          c.AuthURI,\n\t\tTokenURL:         c.TokenURI,\n\t\tClient:           opts.client(),\n\t\tLogger:           opts.logger(),\n\t\tEarlyTokenExpiry: opts.EarlyTokenRefresh,\n\t\tAuthHandlerOpts:  handleOpts,\n\t\t// TODO(codyoss): refactor this out. We need to add in auto-detection\n\t\t// for this use case.\n\t\tAuthStyle: auth.StyleInParams,\n\t}\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/credentials/doc.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package credentials provides support for making OAuth2 authorized and\n// authenticated HTTP requests to Google APIs. It supports the Web server flow,\n// client-side credentials, service accounts, Google Compute Engine service\n// accounts, Google App Engine service accounts and workload identity federation\n// from non-Google cloud platforms.\n//\n// A brief overview of the package follows. For more information, please read\n// https://developers.google.com/accounts/docs/OAuth2\n// and\n// https://developers.google.com/accounts/docs/application-default-credentials.\n// For more information on using workload identity federation, refer to\n// https://cloud.google.com/iam/docs/how-to#using-workload-identity-federation.\n//\n// # Credentials\n//\n// The [cloud.google.com/go/auth.Credentials] type represents Google\n// credentials, including Application Default Credentials.\n//\n// Use [DetectDefault] to obtain Application Default Credentials.\n//\n// Application Default Credentials support workload identity federation to\n// access Google Cloud resources from non-Google Cloud platforms including Amazon\n// Web Services (AWS), Microsoft Azure or any identity provider that supports\n// OpenID Connect (OIDC). Workload identity federation is recommended for\n// non-Google Cloud environments as it avoids the need to download, manage, and\n// store service account private keys locally.\n//\n// # Workforce Identity Federation\n//\n// For more information on this feature see [cloud.google.com/go/auth/credentials/externalaccount].\npackage credentials\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/credentials/filetypes.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage credentials\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"cloud.google.com/go/auth\"\n\t\"cloud.google.com/go/auth/credentials/internal/externalaccount\"\n\t\"cloud.google.com/go/auth/credentials/internal/externalaccountuser\"\n\t\"cloud.google.com/go/auth/credentials/internal/gdch\"\n\t\"cloud.google.com/go/auth/credentials/internal/impersonate\"\n\tinternalauth \"cloud.google.com/go/auth/internal\"\n\t\"cloud.google.com/go/auth/internal/credsfile\"\n)\n\nfunc fileCredentials(b []byte, opts *DetectOptions) (*auth.Credentials, error) {\n\tfileType, err := credsfile.ParseFileType(b)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar projectID, universeDomain string\n\tvar tp auth.TokenProvider\n\tswitch fileType {\n\tcase credsfile.ServiceAccountKey:\n\t\tf, err := credsfile.ParseServiceAccount(b)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ttp, err = handleServiceAccount(f, opts)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tprojectID = f.ProjectID\n\t\tuniverseDomain = resolveUniverseDomain(opts.UniverseDomain, f.UniverseDomain)\n\tcase credsfile.UserCredentialsKey:\n\t\tf, err := credsfile.ParseUserCredentials(b)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ttp, err = handleUserCredential(f, opts)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tuniverseDomain = f.UniverseDomain\n\tcase credsfile.ExternalAccountKey:\n\t\tf, err := credsfile.ParseExternalAccount(b)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ttp, err = handleExternalAccount(f, opts)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tuniverseDomain = resolveUniverseDomain(opts.UniverseDomain, f.UniverseDomain)\n\tcase credsfile.ExternalAccountAuthorizedUserKey:\n\t\tf, err := credsfile.ParseExternalAccountAuthorizedUser(b)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ttp, err = handleExternalAccountAuthorizedUser(f, opts)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tuniverseDomain = f.UniverseDomain\n\tcase credsfile.ImpersonatedServiceAccountKey:\n\t\tf, err := credsfile.ParseImpersonatedServiceAccount(b)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ttp, err = handleImpersonatedServiceAccount(f, opts)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tuniverseDomain = resolveUniverseDomain(opts.UniverseDomain, f.UniverseDomain)\n\tcase credsfile.GDCHServiceAccountKey:\n\t\tf, err := credsfile.ParseGDCHServiceAccount(b)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ttp, err = handleGDCHServiceAccount(f, opts)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tprojectID = f.Project\n\t\tuniverseDomain = f.UniverseDomain\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"credentials: unsupported filetype %q\", fileType)\n\t}\n\treturn auth.NewCredentials(&auth.CredentialsOptions{\n\t\tTokenProvider: auth.NewCachedTokenProvider(tp, &auth.CachedTokenProviderOptions{\n\t\t\tExpireEarly: opts.EarlyTokenRefresh,\n\t\t}),\n\t\tJSON:              b,\n\t\tProjectIDProvider: internalauth.StaticCredentialsProperty(projectID),\n\t\t// TODO(codyoss): only set quota project here if there was a user override\n\t\tUniverseDomainProvider: internalauth.StaticCredentialsProperty(universeDomain),\n\t}), nil\n}\n\n// resolveUniverseDomain returns optsUniverseDomain if non-empty, in order to\n// support configuring universe-specific credentials in code. Auth flows\n// unsupported for universe domain should not use this func, but should instead\n// simply set the file universe domain on the credentials.\nfunc resolveUniverseDomain(optsUniverseDomain, fileUniverseDomain string) string {\n\tif optsUniverseDomain != \"\" {\n\t\treturn optsUniverseDomain\n\t}\n\treturn fileUniverseDomain\n}\n\nfunc handleServiceAccount(f *credsfile.ServiceAccountFile, opts *DetectOptions) (auth.TokenProvider, error) {\n\tud := resolveUniverseDomain(opts.UniverseDomain, f.UniverseDomain)\n\tif opts.UseSelfSignedJWT {\n\t\treturn configureSelfSignedJWT(f, opts)\n\t} else if ud != \"\" && ud != internalauth.DefaultUniverseDomain {\n\t\t// For non-GDU universe domains, token exchange is impossible and services\n\t\t// must support self-signed JWTs.\n\t\topts.UseSelfSignedJWT = true\n\t\treturn configureSelfSignedJWT(f, opts)\n\t}\n\topts2LO := &auth.Options2LO{\n\t\tEmail:        f.ClientEmail,\n\t\tPrivateKey:   []byte(f.PrivateKey),\n\t\tPrivateKeyID: f.PrivateKeyID,\n\t\tScopes:       opts.scopes(),\n\t\tTokenURL:     f.TokenURL,\n\t\tSubject:      opts.Subject,\n\t\tClient:       opts.client(),\n\t\tLogger:       opts.logger(),\n\t}\n\tif opts2LO.TokenURL == \"\" {\n\t\topts2LO.TokenURL = jwtTokenURL\n\t}\n\treturn auth.New2LOTokenProvider(opts2LO)\n}\n\nfunc handleUserCredential(f *credsfile.UserCredentialsFile, opts *DetectOptions) (auth.TokenProvider, error) {\n\topts3LO := &auth.Options3LO{\n\t\tClientID:         f.ClientID,\n\t\tClientSecret:     f.ClientSecret,\n\t\tScopes:           opts.scopes(),\n\t\tAuthURL:          googleAuthURL,\n\t\tTokenURL:         opts.tokenURL(),\n\t\tAuthStyle:        auth.StyleInParams,\n\t\tEarlyTokenExpiry: opts.EarlyTokenRefresh,\n\t\tRefreshToken:     f.RefreshToken,\n\t\tClient:           opts.client(),\n\t\tLogger:           opts.logger(),\n\t}\n\treturn auth.New3LOTokenProvider(opts3LO)\n}\n\nfunc handleExternalAccount(f *credsfile.ExternalAccountFile, opts *DetectOptions) (auth.TokenProvider, error) {\n\texternalOpts := &externalaccount.Options{\n\t\tAudience:                       f.Audience,\n\t\tSubjectTokenType:               f.SubjectTokenType,\n\t\tTokenURL:                       f.TokenURL,\n\t\tTokenInfoURL:                   f.TokenInfoURL,\n\t\tServiceAccountImpersonationURL: f.ServiceAccountImpersonationURL,\n\t\tClientSecret:                   f.ClientSecret,\n\t\tClientID:                       f.ClientID,\n\t\tCredentialSource:               f.CredentialSource,\n\t\tQuotaProjectID:                 f.QuotaProjectID,\n\t\tScopes:                         opts.scopes(),\n\t\tWorkforcePoolUserProject:       f.WorkforcePoolUserProject,\n\t\tClient:                         opts.client(),\n\t\tLogger:                         opts.logger(),\n\t\tIsDefaultClient:                opts.Client == nil,\n\t}\n\tif f.ServiceAccountImpersonation != nil {\n\t\texternalOpts.ServiceAccountImpersonationLifetimeSeconds = f.ServiceAccountImpersonation.TokenLifetimeSeconds\n\t}\n\treturn externalaccount.NewTokenProvider(externalOpts)\n}\n\nfunc handleExternalAccountAuthorizedUser(f *credsfile.ExternalAccountAuthorizedUserFile, opts *DetectOptions) (auth.TokenProvider, error) {\n\texternalOpts := &externalaccountuser.Options{\n\t\tAudience:     f.Audience,\n\t\tRefreshToken: f.RefreshToken,\n\t\tTokenURL:     f.TokenURL,\n\t\tTokenInfoURL: f.TokenInfoURL,\n\t\tClientID:     f.ClientID,\n\t\tClientSecret: f.ClientSecret,\n\t\tScopes:       opts.scopes(),\n\t\tClient:       opts.client(),\n\t\tLogger:       opts.logger(),\n\t}\n\treturn externalaccountuser.NewTokenProvider(externalOpts)\n}\n\nfunc handleImpersonatedServiceAccount(f *credsfile.ImpersonatedServiceAccountFile, opts *DetectOptions) (auth.TokenProvider, error) {\n\tif f.ServiceAccountImpersonationURL == \"\" || f.CredSource == nil {\n\t\treturn nil, errors.New(\"missing 'source_credentials' field or 'service_account_impersonation_url' in credentials\")\n\t}\n\n\ttp, err := fileCredentials(f.CredSource, opts)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn impersonate.NewTokenProvider(&impersonate.Options{\n\t\tURL:       f.ServiceAccountImpersonationURL,\n\t\tScopes:    opts.scopes(),\n\t\tTp:        tp,\n\t\tDelegates: f.Delegates,\n\t\tClient:    opts.client(),\n\t\tLogger:    opts.logger(),\n\t})\n}\n\nfunc handleGDCHServiceAccount(f *credsfile.GDCHServiceAccountFile, opts *DetectOptions) (auth.TokenProvider, error) {\n\treturn gdch.NewTokenProvider(f, &gdch.Options{\n\t\tSTSAudience: opts.STSAudience,\n\t\tClient:      opts.client(),\n\t\tLogger:      opts.logger(),\n\t})\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/aws_provider.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage externalaccount\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/hmac\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\n\t\"cloud.google.com/go/auth/internal\"\n\t\"github.com/googleapis/gax-go/v2/internallog\"\n)\n\nvar (\n\t// getenv aliases os.Getenv for testing\n\tgetenv = os.Getenv\n)\n\nconst (\n\t// AWS Signature Version 4 signing algorithm identifier.\n\tawsAlgorithm = \"AWS4-HMAC-SHA256\"\n\n\t// The termination string for the AWS credential scope value as defined in\n\t// https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n\tawsRequestType = \"aws4_request\"\n\n\t// The AWS authorization header name for the security session token if available.\n\tawsSecurityTokenHeader = \"x-amz-security-token\"\n\n\t// The name of the header containing the session token for metadata endpoint calls\n\tawsIMDSv2SessionTokenHeader = \"X-aws-ec2-metadata-token\"\n\n\tawsIMDSv2SessionTTLHeader = \"X-aws-ec2-metadata-token-ttl-seconds\"\n\n\tawsIMDSv2SessionTTL = \"300\"\n\n\t// The AWS authorization header name for the auto-generated date.\n\tawsDateHeader = \"x-amz-date\"\n\n\tdefaultRegionalCredentialVerificationURL = \"https://sts.{region}.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15\"\n\n\t// Supported AWS configuration environment variables.\n\tawsAccessKeyIDEnvVar     = \"AWS_ACCESS_KEY_ID\"\n\tawsDefaultRegionEnvVar   = \"AWS_DEFAULT_REGION\"\n\tawsRegionEnvVar          = \"AWS_REGION\"\n\tawsSecretAccessKeyEnvVar = \"AWS_SECRET_ACCESS_KEY\"\n\tawsSessionTokenEnvVar    = \"AWS_SESSION_TOKEN\"\n\n\tawsTimeFormatLong  = \"20060102T150405Z\"\n\tawsTimeFormatShort = \"20060102\"\n\tawsProviderType    = \"aws\"\n)\n\ntype awsSubjectProvider struct {\n\tEnvironmentID               string\n\tRegionURL                   string\n\tRegionalCredVerificationURL string\n\tCredVerificationURL         string\n\tIMDSv2SessionTokenURL       string\n\tTargetResource              string\n\trequestSigner               *awsRequestSigner\n\tregion                      string\n\tsecurityCredentialsProvider AwsSecurityCredentialsProvider\n\treqOpts                     *RequestOptions\n\n\tClient *http.Client\n\tlogger *slog.Logger\n}\n\nfunc (sp *awsSubjectProvider) subjectToken(ctx context.Context) (string, error) {\n\t// Set Defaults\n\tif sp.RegionalCredVerificationURL == \"\" {\n\t\tsp.RegionalCredVerificationURL = defaultRegionalCredentialVerificationURL\n\t}\n\theaders := make(map[string]string)\n\tif sp.shouldUseMetadataServer() {\n\t\tawsSessionToken, err := sp.getAWSSessionToken(ctx)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\n\t\tif awsSessionToken != \"\" {\n\t\t\theaders[awsIMDSv2SessionTokenHeader] = awsSessionToken\n\t\t}\n\t}\n\n\tawsSecurityCredentials, err := sp.getSecurityCredentials(ctx, headers)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif sp.region, err = sp.getRegion(ctx, headers); err != nil {\n\t\treturn \"\", err\n\t}\n\tsp.requestSigner = &awsRequestSigner{\n\t\tRegionName:             sp.region,\n\t\tAwsSecurityCredentials: awsSecurityCredentials,\n\t}\n\n\t// Generate the signed request to AWS STS GetCallerIdentity API.\n\t// Use the required regional endpoint. Otherwise, the request will fail.\n\treq, err := http.NewRequestWithContext(ctx, \"POST\", strings.Replace(sp.RegionalCredVerificationURL, \"{region}\", sp.region, 1), nil)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\t// The full, canonical resource name of the workload identity pool\n\t// provider, with or without the HTTPS prefix.\n\t// Including this header as part of the signature is recommended to\n\t// ensure data integrity.\n\tif sp.TargetResource != \"\" {\n\t\treq.Header.Set(\"x-goog-cloud-target-resource\", sp.TargetResource)\n\t}\n\tsp.requestSigner.signRequest(req)\n\n\t/*\n\t   The GCP STS endpoint expects the headers to be formatted as:\n\t   # [\n\t   #   {key: 'x-amz-date', value: '...'},\n\t   #   {key: 'Authorization', value: '...'},\n\t   #   ...\n\t   # ]\n\t   # And then serialized as:\n\t   # quote(json.dumps({\n\t   #   url: '...',\n\t   #   method: 'POST',\n\t   #   headers: [{key: 'x-amz-date', value: '...'}, ...]\n\t   # }))\n\t*/\n\n\tawsSignedReq := awsRequest{\n\t\tURL:    req.URL.String(),\n\t\tMethod: \"POST\",\n\t}\n\tfor headerKey, headerList := range req.Header {\n\t\tfor _, headerValue := range headerList {\n\t\t\tawsSignedReq.Headers = append(awsSignedReq.Headers, awsRequestHeader{\n\t\t\t\tKey:   headerKey,\n\t\t\t\tValue: headerValue,\n\t\t\t})\n\t\t}\n\t}\n\tsort.Slice(awsSignedReq.Headers, func(i, j int) bool {\n\t\theaderCompare := strings.Compare(awsSignedReq.Headers[i].Key, awsSignedReq.Headers[j].Key)\n\t\tif headerCompare == 0 {\n\t\t\treturn strings.Compare(awsSignedReq.Headers[i].Value, awsSignedReq.Headers[j].Value) < 0\n\t\t}\n\t\treturn headerCompare < 0\n\t})\n\n\tresult, err := json.Marshal(awsSignedReq)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn url.QueryEscape(string(result)), nil\n}\n\nfunc (sp *awsSubjectProvider) providerType() string {\n\tif sp.securityCredentialsProvider != nil {\n\t\treturn programmaticProviderType\n\t}\n\treturn awsProviderType\n}\n\nfunc (sp *awsSubjectProvider) getAWSSessionToken(ctx context.Context) (string, error) {\n\tif sp.IMDSv2SessionTokenURL == \"\" {\n\t\treturn \"\", nil\n\t}\n\treq, err := http.NewRequestWithContext(ctx, \"PUT\", sp.IMDSv2SessionTokenURL, nil)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treq.Header.Set(awsIMDSv2SessionTTLHeader, awsIMDSv2SessionTTL)\n\n\tsp.logger.DebugContext(ctx, \"aws session token request\", \"request\", internallog.HTTPRequest(req, nil))\n\tresp, body, err := internal.DoRequest(sp.Client, req)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tsp.logger.DebugContext(ctx, \"aws session token response\", \"response\", internallog.HTTPResponse(resp, body))\n\tif resp.StatusCode != http.StatusOK {\n\t\treturn \"\", fmt.Errorf(\"credentials: unable to retrieve AWS session token: %s\", body)\n\t}\n\treturn string(body), nil\n}\n\nfunc (sp *awsSubjectProvider) getRegion(ctx context.Context, headers map[string]string) (string, error) {\n\tif sp.securityCredentialsProvider != nil {\n\t\treturn sp.securityCredentialsProvider.AwsRegion(ctx, sp.reqOpts)\n\t}\n\tif canRetrieveRegionFromEnvironment() {\n\t\tif envAwsRegion := getenv(awsRegionEnvVar); envAwsRegion != \"\" {\n\t\t\treturn envAwsRegion, nil\n\t\t}\n\t\treturn getenv(awsDefaultRegionEnvVar), nil\n\t}\n\n\tif sp.RegionURL == \"\" {\n\t\treturn \"\", errors.New(\"credentials: unable to determine AWS region\")\n\t}\n\n\treq, err := http.NewRequestWithContext(ctx, \"GET\", sp.RegionURL, nil)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tfor name, value := range headers {\n\t\treq.Header.Add(name, value)\n\t}\n\tsp.logger.DebugContext(ctx, \"aws region request\", \"request\", internallog.HTTPRequest(req, nil))\n\tresp, body, err := internal.DoRequest(sp.Client, req)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tsp.logger.DebugContext(ctx, \"aws region response\", \"response\", internallog.HTTPResponse(resp, body))\n\tif resp.StatusCode != http.StatusOK {\n\t\treturn \"\", fmt.Errorf(\"credentials: unable to retrieve AWS region - %s\", body)\n\t}\n\n\t// This endpoint will return the region in format: us-east-2b.\n\t// Only the us-east-2 part should be used.\n\tbodyLen := len(body)\n\tif bodyLen == 0 {\n\t\treturn \"\", nil\n\t}\n\treturn string(body[:bodyLen-1]), nil\n}\n\nfunc (sp *awsSubjectProvider) getSecurityCredentials(ctx context.Context, headers map[string]string) (result *AwsSecurityCredentials, err error) {\n\tif sp.securityCredentialsProvider != nil {\n\t\treturn sp.securityCredentialsProvider.AwsSecurityCredentials(ctx, sp.reqOpts)\n\t}\n\tif canRetrieveSecurityCredentialFromEnvironment() {\n\t\treturn &AwsSecurityCredentials{\n\t\t\tAccessKeyID:     getenv(awsAccessKeyIDEnvVar),\n\t\t\tSecretAccessKey: getenv(awsSecretAccessKeyEnvVar),\n\t\t\tSessionToken:    getenv(awsSessionTokenEnvVar),\n\t\t}, nil\n\t}\n\n\troleName, err := sp.getMetadataRoleName(ctx, headers)\n\tif err != nil {\n\t\treturn\n\t}\n\tcredentials, err := sp.getMetadataSecurityCredentials(ctx, roleName, headers)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif credentials.AccessKeyID == \"\" {\n\t\treturn result, errors.New(\"credentials: missing AccessKeyId credential\")\n\t}\n\tif credentials.SecretAccessKey == \"\" {\n\t\treturn result, errors.New(\"credentials: missing SecretAccessKey credential\")\n\t}\n\n\treturn credentials, nil\n}\n\nfunc (sp *awsSubjectProvider) getMetadataSecurityCredentials(ctx context.Context, roleName string, headers map[string]string) (*AwsSecurityCredentials, error) {\n\tvar result *AwsSecurityCredentials\n\n\treq, err := http.NewRequestWithContext(ctx, \"GET\", fmt.Sprintf(\"%s/%s\", sp.CredVerificationURL, roleName), nil)\n\tif err != nil {\n\t\treturn result, err\n\t}\n\tfor name, value := range headers {\n\t\treq.Header.Add(name, value)\n\t}\n\tsp.logger.DebugContext(ctx, \"aws security credential request\", \"request\", internallog.HTTPRequest(req, nil))\n\tresp, body, err := internal.DoRequest(sp.Client, req)\n\tif err != nil {\n\t\treturn result, err\n\t}\n\tsp.logger.DebugContext(ctx, \"aws security credential response\", \"response\", internallog.HTTPResponse(resp, body))\n\tif resp.StatusCode != http.StatusOK {\n\t\treturn result, fmt.Errorf(\"credentials: unable to retrieve AWS security credentials - %s\", body)\n\t}\n\tif err := json.Unmarshal(body, &result); err != nil {\n\t\treturn nil, err\n\t}\n\treturn result, nil\n}\n\nfunc (sp *awsSubjectProvider) getMetadataRoleName(ctx context.Context, headers map[string]string) (string, error) {\n\tif sp.CredVerificationURL == \"\" {\n\t\treturn \"\", errors.New(\"credentials: unable to determine the AWS metadata server security credentials endpoint\")\n\t}\n\treq, err := http.NewRequestWithContext(ctx, \"GET\", sp.CredVerificationURL, nil)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tfor name, value := range headers {\n\t\treq.Header.Add(name, value)\n\t}\n\n\tsp.logger.DebugContext(ctx, \"aws metadata role request\", \"request\", internallog.HTTPRequest(req, nil))\n\tresp, body, err := internal.DoRequest(sp.Client, req)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tsp.logger.DebugContext(ctx, \"aws metadata role response\", \"response\", internallog.HTTPResponse(resp, body))\n\tif resp.StatusCode != http.StatusOK {\n\t\treturn \"\", fmt.Errorf(\"credentials: unable to retrieve AWS role name - %s\", body)\n\t}\n\treturn string(body), nil\n}\n\n// awsRequestSigner is a utility class to sign http requests using a AWS V4 signature.\ntype awsRequestSigner struct {\n\tRegionName             string\n\tAwsSecurityCredentials *AwsSecurityCredentials\n}\n\n// signRequest adds the appropriate headers to an http.Request\n// or returns an error if something prevented this.\nfunc (rs *awsRequestSigner) signRequest(req *http.Request) error {\n\t// req is assumed non-nil\n\tsignedRequest := cloneRequest(req)\n\ttimestamp := Now()\n\tsignedRequest.Header.Set(\"host\", requestHost(req))\n\tif rs.AwsSecurityCredentials.SessionToken != \"\" {\n\t\tsignedRequest.Header.Set(awsSecurityTokenHeader, rs.AwsSecurityCredentials.SessionToken)\n\t}\n\tif signedRequest.Header.Get(\"date\") == \"\" {\n\t\tsignedRequest.Header.Set(awsDateHeader, timestamp.Format(awsTimeFormatLong))\n\t}\n\tauthorizationCode, err := rs.generateAuthentication(signedRequest, timestamp)\n\tif err != nil {\n\t\treturn err\n\t}\n\tsignedRequest.Header.Set(\"Authorization\", authorizationCode)\n\treq.Header = signedRequest.Header\n\treturn nil\n}\n\nfunc (rs *awsRequestSigner) generateAuthentication(req *http.Request, timestamp time.Time) (string, error) {\n\tcanonicalHeaderColumns, canonicalHeaderData := canonicalHeaders(req)\n\tdateStamp := timestamp.Format(awsTimeFormatShort)\n\tserviceName := \"\"\n\n\tif splitHost := strings.Split(requestHost(req), \".\"); len(splitHost) > 0 {\n\t\tserviceName = splitHost[0]\n\t}\n\tcredentialScope := strings.Join([]string{dateStamp, rs.RegionName, serviceName, awsRequestType}, \"/\")\n\trequestString, err := canonicalRequest(req, canonicalHeaderColumns, canonicalHeaderData)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\trequestHash, err := getSha256([]byte(requestString))\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tstringToSign := strings.Join([]string{awsAlgorithm, timestamp.Format(awsTimeFormatLong), credentialScope, requestHash}, \"\\n\")\n\tsigningKey := []byte(\"AWS4\" + rs.AwsSecurityCredentials.SecretAccessKey)\n\tfor _, signingInput := range []string{\n\t\tdateStamp, rs.RegionName, serviceName, awsRequestType, stringToSign,\n\t} {\n\t\tsigningKey, err = getHmacSha256(signingKey, []byte(signingInput))\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t}\n\n\treturn fmt.Sprintf(\"%s Credential=%s/%s, SignedHeaders=%s, Signature=%s\", awsAlgorithm, rs.AwsSecurityCredentials.AccessKeyID, credentialScope, canonicalHeaderColumns, hex.EncodeToString(signingKey)), nil\n}\n\nfunc getSha256(input []byte) (string, error) {\n\thash := sha256.New()\n\tif _, err := hash.Write(input); err != nil {\n\t\treturn \"\", err\n\t}\n\treturn hex.EncodeToString(hash.Sum(nil)), nil\n}\n\nfunc getHmacSha256(key, input []byte) ([]byte, error) {\n\thash := hmac.New(sha256.New, key)\n\tif _, err := hash.Write(input); err != nil {\n\t\treturn nil, err\n\t}\n\treturn hash.Sum(nil), nil\n}\n\nfunc cloneRequest(r *http.Request) *http.Request {\n\tr2 := new(http.Request)\n\t*r2 = *r\n\tif r.Header != nil {\n\t\tr2.Header = make(http.Header, len(r.Header))\n\n\t\t// Find total number of values.\n\t\theaderCount := 0\n\t\tfor _, headerValues := range r.Header {\n\t\t\theaderCount += len(headerValues)\n\t\t}\n\t\tcopiedHeaders := make([]string, headerCount) // shared backing array for headers' values\n\n\t\tfor headerKey, headerValues := range r.Header {\n\t\t\theaderCount = copy(copiedHeaders, headerValues)\n\t\t\tr2.Header[headerKey] = copiedHeaders[:headerCount:headerCount]\n\t\t\tcopiedHeaders = copiedHeaders[headerCount:]\n\t\t}\n\t}\n\treturn r2\n}\n\nfunc canonicalPath(req *http.Request) string {\n\tresult := req.URL.EscapedPath()\n\tif result == \"\" {\n\t\treturn \"/\"\n\t}\n\treturn path.Clean(result)\n}\n\nfunc canonicalQuery(req *http.Request) string {\n\tqueryValues := req.URL.Query()\n\tfor queryKey := range queryValues {\n\t\tsort.Strings(queryValues[queryKey])\n\t}\n\treturn queryValues.Encode()\n}\n\nfunc canonicalHeaders(req *http.Request) (string, string) {\n\t// Header keys need to be sorted alphabetically.\n\tvar headers []string\n\tlowerCaseHeaders := make(http.Header)\n\tfor k, v := range req.Header {\n\t\tk := strings.ToLower(k)\n\t\tif _, ok := lowerCaseHeaders[k]; ok {\n\t\t\t// include additional values\n\t\t\tlowerCaseHeaders[k] = append(lowerCaseHeaders[k], v...)\n\t\t} else {\n\t\t\theaders = append(headers, k)\n\t\t\tlowerCaseHeaders[k] = v\n\t\t}\n\t}\n\tsort.Strings(headers)\n\n\tvar fullHeaders bytes.Buffer\n\tfor _, header := range headers {\n\t\theaderValue := strings.Join(lowerCaseHeaders[header], \",\")\n\t\tfullHeaders.WriteString(header)\n\t\tfullHeaders.WriteRune(':')\n\t\tfullHeaders.WriteString(headerValue)\n\t\tfullHeaders.WriteRune('\\n')\n\t}\n\n\treturn strings.Join(headers, \";\"), fullHeaders.String()\n}\n\nfunc requestDataHash(req *http.Request) (string, error) {\n\tvar requestData []byte\n\tif req.Body != nil {\n\t\trequestBody, err := req.GetBody()\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tdefer requestBody.Close()\n\n\t\trequestData, err = internal.ReadAll(requestBody)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t}\n\n\treturn getSha256(requestData)\n}\n\nfunc requestHost(req *http.Request) string {\n\tif req.Host != \"\" {\n\t\treturn req.Host\n\t}\n\treturn req.URL.Host\n}\n\nfunc canonicalRequest(req *http.Request, canonicalHeaderColumns, canonicalHeaderData string) (string, error) {\n\tdataHash, err := requestDataHash(req)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn fmt.Sprintf(\"%s\\n%s\\n%s\\n%s\\n%s\\n%s\", req.Method, canonicalPath(req), canonicalQuery(req), canonicalHeaderData, canonicalHeaderColumns, dataHash), nil\n}\n\ntype awsRequestHeader struct {\n\tKey   string `json:\"key\"`\n\tValue string `json:\"value\"`\n}\n\ntype awsRequest struct {\n\tURL     string             `json:\"url\"`\n\tMethod  string             `json:\"method\"`\n\tHeaders []awsRequestHeader `json:\"headers\"`\n}\n\n// The AWS region can be provided through AWS_REGION or AWS_DEFAULT_REGION. Only one is\n// required.\nfunc canRetrieveRegionFromEnvironment() bool {\n\treturn getenv(awsRegionEnvVar) != \"\" || getenv(awsDefaultRegionEnvVar) != \"\"\n}\n\n// Check if both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY are available.\nfunc canRetrieveSecurityCredentialFromEnvironment() bool {\n\treturn getenv(awsAccessKeyIDEnvVar) != \"\" && getenv(awsSecretAccessKeyEnvVar) != \"\"\n}\n\nfunc (sp *awsSubjectProvider) shouldUseMetadataServer() bool {\n\treturn sp.securityCredentialsProvider == nil && (!canRetrieveRegionFromEnvironment() || !canRetrieveSecurityCredentialFromEnvironment())\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/executable_provider.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage externalaccount\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"os\"\n\t\"os/exec\"\n\t\"regexp\"\n\t\"strings\"\n\t\"time\"\n\n\t\"cloud.google.com/go/auth/internal\"\n)\n\nconst (\n\texecutableSupportedMaxVersion = 1\n\texecutableDefaultTimeout      = 30 * time.Second\n\texecutableSource              = \"response\"\n\texecutableProviderType        = \"executable\"\n\toutputFileSource              = \"output file\"\n\n\tallowExecutablesEnvVar = \"GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES\"\n\n\tjwtTokenType   = \"urn:ietf:params:oauth:token-type:jwt\"\n\tidTokenType    = \"urn:ietf:params:oauth:token-type:id_token\"\n\tsaml2TokenType = \"urn:ietf:params:oauth:token-type:saml2\"\n)\n\nvar (\n\tserviceAccountImpersonationRE = regexp.MustCompile(`https://iamcredentials..+/v1/projects/-/serviceAccounts/(.*@.*):generateAccessToken`)\n)\n\ntype nonCacheableError struct {\n\tmessage string\n}\n\nfunc (nce nonCacheableError) Error() string {\n\treturn nce.message\n}\n\n// environment is a contract for testing\ntype environment interface {\n\texistingEnv() []string\n\tgetenv(string) string\n\trun(ctx context.Context, command string, env []string) ([]byte, error)\n\tnow() time.Time\n}\n\ntype runtimeEnvironment struct{}\n\nfunc (r runtimeEnvironment) existingEnv() []string {\n\treturn os.Environ()\n}\nfunc (r runtimeEnvironment) getenv(key string) string {\n\treturn os.Getenv(key)\n}\nfunc (r runtimeEnvironment) now() time.Time {\n\treturn time.Now().UTC()\n}\n\nfunc (r runtimeEnvironment) run(ctx context.Context, command string, env []string) ([]byte, error) {\n\tsplitCommand := strings.Fields(command)\n\tcmd := exec.CommandContext(ctx, splitCommand[0], splitCommand[1:]...)\n\tcmd.Env = env\n\n\tvar stdout, stderr bytes.Buffer\n\tcmd.Stdout = &stdout\n\tcmd.Stderr = &stderr\n\n\tif err := cmd.Run(); err != nil {\n\t\tif ctx.Err() == context.DeadlineExceeded {\n\t\t\treturn nil, context.DeadlineExceeded\n\t\t}\n\t\tif exitError, ok := err.(*exec.ExitError); ok {\n\t\t\treturn nil, exitCodeError(exitError)\n\t\t}\n\t\treturn nil, executableError(err)\n\t}\n\n\tbytesStdout := bytes.TrimSpace(stdout.Bytes())\n\tif len(bytesStdout) > 0 {\n\t\treturn bytesStdout, nil\n\t}\n\treturn bytes.TrimSpace(stderr.Bytes()), nil\n}\n\ntype executableSubjectProvider struct {\n\tCommand    string\n\tTimeout    time.Duration\n\tOutputFile string\n\tclient     *http.Client\n\topts       *Options\n\tenv        environment\n}\n\ntype executableResponse struct {\n\tVersion        int    `json:\"version,omitempty\"`\n\tSuccess        *bool  `json:\"success,omitempty\"`\n\tTokenType      string `json:\"token_type,omitempty\"`\n\tExpirationTime int64  `json:\"expiration_time,omitempty\"`\n\tIDToken        string `json:\"id_token,omitempty\"`\n\tSamlResponse   string `json:\"saml_response,omitempty\"`\n\tCode           string `json:\"code,omitempty\"`\n\tMessage        string `json:\"message,omitempty\"`\n}\n\nfunc (sp *executableSubjectProvider) parseSubjectTokenFromSource(response []byte, source string, now int64) (string, error) {\n\tvar result executableResponse\n\tif err := json.Unmarshal(response, &result); err != nil {\n\t\treturn \"\", jsonParsingError(source, string(response))\n\t}\n\t// Validate\n\tif result.Version == 0 {\n\t\treturn \"\", missingFieldError(source, \"version\")\n\t}\n\tif result.Success == nil {\n\t\treturn \"\", missingFieldError(source, \"success\")\n\t}\n\tif !*result.Success {\n\t\tif result.Code == \"\" || result.Message == \"\" {\n\t\t\treturn \"\", malformedFailureError()\n\t\t}\n\t\treturn \"\", userDefinedError(result.Code, result.Message)\n\t}\n\tif result.Version > executableSupportedMaxVersion || result.Version < 0 {\n\t\treturn \"\", unsupportedVersionError(source, result.Version)\n\t}\n\tif result.ExpirationTime == 0 && sp.OutputFile != \"\" {\n\t\treturn \"\", missingFieldError(source, \"expiration_time\")\n\t}\n\tif result.TokenType == \"\" {\n\t\treturn \"\", missingFieldError(source, \"token_type\")\n\t}\n\tif result.ExpirationTime != 0 && result.ExpirationTime < now {\n\t\treturn \"\", tokenExpiredError()\n\t}\n\n\tswitch result.TokenType {\n\tcase jwtTokenType, idTokenType:\n\t\tif result.IDToken == \"\" {\n\t\t\treturn \"\", missingFieldError(source, \"id_token\")\n\t\t}\n\t\treturn result.IDToken, nil\n\tcase saml2TokenType:\n\t\tif result.SamlResponse == \"\" {\n\t\t\treturn \"\", missingFieldError(source, \"saml_response\")\n\t\t}\n\t\treturn result.SamlResponse, nil\n\tdefault:\n\t\treturn \"\", tokenTypeError(source)\n\t}\n}\n\nfunc (sp *executableSubjectProvider) subjectToken(ctx context.Context) (string, error) {\n\tif token, err := sp.getTokenFromOutputFile(); token != \"\" || err != nil {\n\t\treturn token, err\n\t}\n\treturn sp.getTokenFromExecutableCommand(ctx)\n}\n\nfunc (sp *executableSubjectProvider) providerType() string {\n\treturn executableProviderType\n}\n\nfunc (sp *executableSubjectProvider) getTokenFromOutputFile() (token string, err error) {\n\tif sp.OutputFile == \"\" {\n\t\t// This ExecutableCredentialSource doesn't use an OutputFile.\n\t\treturn \"\", nil\n\t}\n\n\tfile, err := os.Open(sp.OutputFile)\n\tif err != nil {\n\t\t// No OutputFile found. Hasn't been created yet, so skip it.\n\t\treturn \"\", nil\n\t}\n\tdefer file.Close()\n\n\tdata, err := internal.ReadAll(file)\n\tif err != nil || len(data) == 0 {\n\t\t// Cachefile exists, but no data found. Get new credential.\n\t\treturn \"\", nil\n\t}\n\n\ttoken, err = sp.parseSubjectTokenFromSource(data, outputFileSource, sp.env.now().Unix())\n\tif err != nil {\n\t\tif _, ok := err.(nonCacheableError); ok {\n\t\t\t// If the cached token is expired we need a new token,\n\t\t\t// and if the cache contains a failure, we need to try again.\n\t\t\treturn \"\", nil\n\t\t}\n\n\t\t// There was an error in the cached token, and the developer should be aware of it.\n\t\treturn \"\", err\n\t}\n\t// Token parsing succeeded.  Use found token.\n\treturn token, nil\n}\n\nfunc (sp *executableSubjectProvider) executableEnvironment() []string {\n\tresult := sp.env.existingEnv()\n\tresult = append(result, fmt.Sprintf(\"GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE=%v\", sp.opts.Audience))\n\tresult = append(result, fmt.Sprintf(\"GOOGLE_EXTERNAL_ACCOUNT_TOKEN_TYPE=%v\", sp.opts.SubjectTokenType))\n\tresult = append(result, \"GOOGLE_EXTERNAL_ACCOUNT_INTERACTIVE=0\")\n\tif sp.opts.ServiceAccountImpersonationURL != \"\" {\n\t\tmatches := serviceAccountImpersonationRE.FindStringSubmatch(sp.opts.ServiceAccountImpersonationURL)\n\t\tif matches != nil {\n\t\t\tresult = append(result, fmt.Sprintf(\"GOOGLE_EXTERNAL_ACCOUNT_IMPERSONATED_EMAIL=%v\", matches[1]))\n\t\t}\n\t}\n\tif sp.OutputFile != \"\" {\n\t\tresult = append(result, fmt.Sprintf(\"GOOGLE_EXTERNAL_ACCOUNT_OUTPUT_FILE=%v\", sp.OutputFile))\n\t}\n\treturn result\n}\n\nfunc (sp *executableSubjectProvider) getTokenFromExecutableCommand(ctx context.Context) (string, error) {\n\t// For security reasons, we need our consumers to set this environment variable to allow executables to be run.\n\tif sp.env.getenv(allowExecutablesEnvVar) != \"1\" {\n\t\treturn \"\", errors.New(\"credentials: executables need to be explicitly allowed (set GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES to '1') to run\")\n\t}\n\n\tctx, cancel := context.WithDeadline(ctx, sp.env.now().Add(sp.Timeout))\n\tdefer cancel()\n\n\toutput, err := sp.env.run(ctx, sp.Command, sp.executableEnvironment())\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn sp.parseSubjectTokenFromSource(output, executableSource, sp.env.now().Unix())\n}\n\nfunc missingFieldError(source, field string) error {\n\treturn fmt.Errorf(\"credentials: %q missing %q field\", source, field)\n}\n\nfunc jsonParsingError(source, data string) error {\n\treturn fmt.Errorf(\"credentials: unable to parse %q: %v\", source, data)\n}\n\nfunc malformedFailureError() error {\n\treturn nonCacheableError{\"credentials: response must include `error` and `message` fields when unsuccessful\"}\n}\n\nfunc userDefinedError(code, message string) error {\n\treturn nonCacheableError{fmt.Sprintf(\"credentials: response contains unsuccessful response: (%v) %v\", code, message)}\n}\n\nfunc unsupportedVersionError(source string, version int) error {\n\treturn fmt.Errorf(\"credentials: %v contains unsupported version: %v\", source, version)\n}\n\nfunc tokenExpiredError() error {\n\treturn nonCacheableError{\"credentials: the token returned by the executable is expired\"}\n}\n\nfunc tokenTypeError(source string) error {\n\treturn fmt.Errorf(\"credentials: %v contains unsupported token type\", source)\n}\n\nfunc exitCodeError(err *exec.ExitError) error {\n\treturn fmt.Errorf(\"credentials: executable command failed with exit code %v: %w\", err.ExitCode(), err)\n}\n\nfunc executableError(err error) error {\n\treturn fmt.Errorf(\"credentials: executable command failed: %w\", err)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/externalaccount.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage externalaccount\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"cloud.google.com/go/auth\"\n\t\"cloud.google.com/go/auth/credentials/internal/impersonate\"\n\t\"cloud.google.com/go/auth/credentials/internal/stsexchange\"\n\t\"cloud.google.com/go/auth/internal/credsfile\"\n\t\"github.com/googleapis/gax-go/v2/internallog\"\n)\n\nconst (\n\ttimeoutMinimum = 5 * time.Second\n\ttimeoutMaximum = 120 * time.Second\n\n\tuniverseDomainPlaceholder = \"UNIVERSE_DOMAIN\"\n\tdefaultTokenURL           = \"https://sts.UNIVERSE_DOMAIN/v1/token\"\n\tdefaultUniverseDomain     = \"googleapis.com\"\n)\n\nvar (\n\t// Now aliases time.Now for testing\n\tNow = func() time.Time {\n\t\treturn time.Now().UTC()\n\t}\n\tvalidWorkforceAudiencePattern *regexp.Regexp = regexp.MustCompile(`//iam\\.googleapis\\.com/locations/[^/]+/workforcePools/`)\n)\n\n// Options stores the configuration for fetching tokens with external credentials.\ntype Options struct {\n\t// Audience is the Secure Token Service (STS) audience which contains the resource name for the workload\n\t// identity pool or the workforce pool and the provider identifier in that pool.\n\tAudience string\n\t// SubjectTokenType is the STS token type based on the Oauth2.0 token exchange spec\n\t// e.g. `urn:ietf:params:oauth:token-type:jwt`.\n\tSubjectTokenType string\n\t// TokenURL is the STS token exchange endpoint.\n\tTokenURL string\n\t// TokenInfoURL is the token_info endpoint used to retrieve the account related information (\n\t// user attributes like account identifier, eg. email, username, uid, etc). This is\n\t// needed for gCloud session account identification.\n\tTokenInfoURL string\n\t// ServiceAccountImpersonationURL is the URL for the service account impersonation request. This is only\n\t// required for workload identity pools when APIs to be accessed have not integrated with UberMint.\n\tServiceAccountImpersonationURL string\n\t// ServiceAccountImpersonationLifetimeSeconds is the number of seconds the service account impersonation\n\t// token will be valid for.\n\tServiceAccountImpersonationLifetimeSeconds int\n\t// ClientSecret is currently only required if token_info endpoint also\n\t// needs to be called with the generated GCP access token. When provided, STS will be\n\t// called with additional basic authentication using client_id as username and client_secret as password.\n\tClientSecret string\n\t// ClientID is only required in conjunction with ClientSecret, as described above.\n\tClientID string\n\t// CredentialSource contains the necessary information to retrieve the token itself, as well\n\t// as some environmental information.\n\tCredentialSource *credsfile.CredentialSource\n\t// QuotaProjectID is injected by gCloud. If the value is non-empty, the Auth libraries\n\t// will set the x-goog-user-project which overrides the project associated with the credentials.\n\tQuotaProjectID string\n\t// Scopes contains the desired scopes for the returned access token.\n\tScopes []string\n\t// WorkforcePoolUserProject should be set when it is a workforce pool and\n\t// not a workload identity pool. The underlying principal must still have\n\t// serviceusage.services.use IAM permission to use the project for\n\t// billing/quota. Optional.\n\tWorkforcePoolUserProject string\n\t// UniverseDomain is the default service domain for a given Cloud universe.\n\t// This value will be used in the default STS token URL. The default value\n\t// is \"googleapis.com\". It will not be used if TokenURL is set. Optional.\n\tUniverseDomain string\n\t// SubjectTokenProvider is an optional token provider for OIDC/SAML\n\t// credentials. One of SubjectTokenProvider, AWSSecurityCredentialProvider\n\t// or CredentialSource must be provided. Optional.\n\tSubjectTokenProvider SubjectTokenProvider\n\t// AwsSecurityCredentialsProvider is an AWS Security Credential provider\n\t// for AWS credentials. One of SubjectTokenProvider,\n\t// AWSSecurityCredentialProvider or CredentialSource must be provided. Optional.\n\tAwsSecurityCredentialsProvider AwsSecurityCredentialsProvider\n\t// Client for token request.\n\tClient *http.Client\n\t// IsDefaultClient marks whether the client passed in is a default client that can be overriden.\n\t// This is important for X509 credentials which should create a new client if the default was used\n\t// but should respect a client explicitly passed in by the user.\n\tIsDefaultClient bool\n\t// Logger is used for debug logging. If provided, logging will be enabled\n\t// at the loggers configured level. By default logging is disabled unless\n\t// enabled by setting GOOGLE_SDK_GO_LOGGING_LEVEL in which case a default\n\t// logger will be used. Optional.\n\tLogger *slog.Logger\n}\n\n// SubjectTokenProvider can be used to supply a subject token to exchange for a\n// GCP access token.\ntype SubjectTokenProvider interface {\n\t// SubjectToken should return a valid subject token or an error.\n\t// The external account token provider does not cache the returned subject\n\t// token, so caching logic should be implemented in the provider to prevent\n\t// multiple requests for the same subject token.\n\tSubjectToken(ctx context.Context, opts *RequestOptions) (string, error)\n}\n\n// RequestOptions contains information about the requested subject token or AWS\n// security credentials from the Google external account credential.\ntype RequestOptions struct {\n\t// Audience is the requested audience for the external account credential.\n\tAudience string\n\t// Subject token type is the requested subject token type for the external\n\t// account credential. Expected values include:\n\t// “urn:ietf:params:oauth:token-type:jwt”\n\t// “urn:ietf:params:oauth:token-type:id-token”\n\t// “urn:ietf:params:oauth:token-type:saml2”\n\t// “urn:ietf:params:aws:token-type:aws4_request”\n\tSubjectTokenType string\n}\n\n// AwsSecurityCredentialsProvider can be used to supply AwsSecurityCredentials\n// and an AWS Region to exchange for a GCP access token.\ntype AwsSecurityCredentialsProvider interface {\n\t// AwsRegion should return the AWS region or an error.\n\tAwsRegion(ctx context.Context, opts *RequestOptions) (string, error)\n\t// GetAwsSecurityCredentials should return a valid set of\n\t// AwsSecurityCredentials or an error. The external account token provider\n\t// does not cache the returned security credentials, so caching logic should\n\t// be implemented in the provider to prevent multiple requests for the\n\t// same security credentials.\n\tAwsSecurityCredentials(ctx context.Context, opts *RequestOptions) (*AwsSecurityCredentials, error)\n}\n\n// AwsSecurityCredentials models AWS security credentials.\ntype AwsSecurityCredentials struct {\n\t// AccessKeyId is the AWS Access Key ID - Required.\n\tAccessKeyID string `json:\"AccessKeyID\"`\n\t// SecretAccessKey is the AWS Secret Access Key - Required.\n\tSecretAccessKey string `json:\"SecretAccessKey\"`\n\t// SessionToken is the AWS Session token. This should be provided for\n\t// temporary AWS security credentials - Optional.\n\tSessionToken string `json:\"Token\"`\n}\n\nfunc (o *Options) validate() error {\n\tif o.Audience == \"\" {\n\t\treturn fmt.Errorf(\"externalaccount: Audience must be set\")\n\t}\n\tif o.SubjectTokenType == \"\" {\n\t\treturn fmt.Errorf(\"externalaccount: Subject token type must be set\")\n\t}\n\tif o.WorkforcePoolUserProject != \"\" {\n\t\tif valid := validWorkforceAudiencePattern.MatchString(o.Audience); !valid {\n\t\t\treturn fmt.Errorf(\"externalaccount: workforce_pool_user_project should not be set for non-workforce pool credentials\")\n\t\t}\n\t}\n\tcount := 0\n\tif o.CredentialSource != nil {\n\t\tcount++\n\t}\n\tif o.SubjectTokenProvider != nil {\n\t\tcount++\n\t}\n\tif o.AwsSecurityCredentialsProvider != nil {\n\t\tcount++\n\t}\n\tif count == 0 {\n\t\treturn fmt.Errorf(\"externalaccount: one of CredentialSource, SubjectTokenProvider, or AwsSecurityCredentialsProvider must be set\")\n\t}\n\tif count > 1 {\n\t\treturn fmt.Errorf(\"externalaccount: only one of CredentialSource, SubjectTokenProvider, or AwsSecurityCredentialsProvider must be set\")\n\t}\n\treturn nil\n}\n\n// client returns the http client that should be used for the token exchange. If a non-default client\n// is provided, then the client configured in the options will always be returned. If a default client\n// is provided and the options are configured for X509 credentials, a new client will be created.\nfunc (o *Options) client() (*http.Client, error) {\n\t// If a client was provided and no override certificate config location was provided, use the provided client.\n\tif o.CredentialSource == nil || o.CredentialSource.Certificate == nil || (!o.IsDefaultClient && o.CredentialSource.Certificate.CertificateConfigLocation == \"\") {\n\t\treturn o.Client, nil\n\t}\n\n\t// If a new client should be created, validate and use the certificate source to create a new mTLS client.\n\tcert := o.CredentialSource.Certificate\n\tif !cert.UseDefaultCertificateConfig && cert.CertificateConfigLocation == \"\" {\n\t\treturn nil, errors.New(\"credentials: \\\"certificate\\\" object must either specify a certificate_config_location or use_default_certificate_config should be true\")\n\t}\n\tif cert.UseDefaultCertificateConfig && cert.CertificateConfigLocation != \"\" {\n\t\treturn nil, errors.New(\"credentials: \\\"certificate\\\" object cannot specify both a certificate_config_location and use_default_certificate_config=true\")\n\t}\n\treturn createX509Client(cert.CertificateConfigLocation)\n}\n\n// resolveTokenURL sets the default STS token endpoint with the configured\n// universe domain.\nfunc (o *Options) resolveTokenURL() {\n\tif o.TokenURL != \"\" {\n\t\treturn\n\t} else if o.UniverseDomain != \"\" {\n\t\to.TokenURL = strings.Replace(defaultTokenURL, universeDomainPlaceholder, o.UniverseDomain, 1)\n\t} else {\n\t\to.TokenURL = strings.Replace(defaultTokenURL, universeDomainPlaceholder, defaultUniverseDomain, 1)\n\t}\n}\n\n// NewTokenProvider returns a [cloud.google.com/go/auth.TokenProvider]\n// configured with the provided options.\nfunc NewTokenProvider(opts *Options) (auth.TokenProvider, error) {\n\tif err := opts.validate(); err != nil {\n\t\treturn nil, err\n\t}\n\topts.resolveTokenURL()\n\tlogger := internallog.New(opts.Logger)\n\tstp, err := newSubjectTokenProvider(opts)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tclient, err := opts.client()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\ttp := &tokenProvider{\n\t\tclient: client,\n\t\topts:   opts,\n\t\tstp:    stp,\n\t\tlogger: logger,\n\t}\n\n\tif opts.ServiceAccountImpersonationURL == \"\" {\n\t\treturn auth.NewCachedTokenProvider(tp, nil), nil\n\t}\n\n\tscopes := make([]string, len(opts.Scopes))\n\tcopy(scopes, opts.Scopes)\n\t// needed for impersonation\n\ttp.opts.Scopes = []string{\"https://www.googleapis.com/auth/cloud-platform\"}\n\timp, err := impersonate.NewTokenProvider(&impersonate.Options{\n\t\tClient:               client,\n\t\tURL:                  opts.ServiceAccountImpersonationURL,\n\t\tScopes:               scopes,\n\t\tTp:                   auth.NewCachedTokenProvider(tp, nil),\n\t\tTokenLifetimeSeconds: opts.ServiceAccountImpersonationLifetimeSeconds,\n\t\tLogger:               logger,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn auth.NewCachedTokenProvider(imp, nil), nil\n}\n\ntype subjectTokenProvider interface {\n\tsubjectToken(ctx context.Context) (string, error)\n\tproviderType() string\n}\n\n// tokenProvider is the provider that handles external credentials. It is used to retrieve Tokens.\ntype tokenProvider struct {\n\tclient *http.Client\n\tlogger *slog.Logger\n\topts   *Options\n\tstp    subjectTokenProvider\n}\n\nfunc (tp *tokenProvider) Token(ctx context.Context) (*auth.Token, error) {\n\tsubjectToken, err := tp.stp.subjectToken(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tstsRequest := &stsexchange.TokenRequest{\n\t\tGrantType:          stsexchange.GrantType,\n\t\tAudience:           tp.opts.Audience,\n\t\tScope:              tp.opts.Scopes,\n\t\tRequestedTokenType: stsexchange.TokenType,\n\t\tSubjectToken:       subjectToken,\n\t\tSubjectTokenType:   tp.opts.SubjectTokenType,\n\t}\n\theader := make(http.Header)\n\theader.Set(\"Content-Type\", \"application/x-www-form-urlencoded\")\n\theader.Add(\"x-goog-api-client\", getGoogHeaderValue(tp.opts, tp.stp))\n\tclientAuth := stsexchange.ClientAuthentication{\n\t\tAuthStyle:    auth.StyleInHeader,\n\t\tClientID:     tp.opts.ClientID,\n\t\tClientSecret: tp.opts.ClientSecret,\n\t}\n\tvar options map[string]interface{}\n\t// Do not pass workforce_pool_user_project when client authentication is used.\n\t// The client ID is sufficient for determining the user project.\n\tif tp.opts.WorkforcePoolUserProject != \"\" && tp.opts.ClientID == \"\" {\n\t\toptions = map[string]interface{}{\n\t\t\t\"userProject\": tp.opts.WorkforcePoolUserProject,\n\t\t}\n\t}\n\tstsResp, err := stsexchange.ExchangeToken(ctx, &stsexchange.Options{\n\t\tClient:         tp.client,\n\t\tEndpoint:       tp.opts.TokenURL,\n\t\tRequest:        stsRequest,\n\t\tAuthentication: clientAuth,\n\t\tHeaders:        header,\n\t\tExtraOpts:      options,\n\t\tLogger:         tp.logger,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\ttok := &auth.Token{\n\t\tValue: stsResp.AccessToken,\n\t\tType:  stsResp.TokenType,\n\t}\n\t// The RFC8693 doesn't define the explicit 0 of \"expires_in\" field behavior.\n\tif stsResp.ExpiresIn <= 0 {\n\t\treturn nil, fmt.Errorf(\"credentials: got invalid expiry from security token service\")\n\t}\n\ttok.Expiry = Now().Add(time.Duration(stsResp.ExpiresIn) * time.Second)\n\treturn tok, nil\n}\n\n// newSubjectTokenProvider determines the type of credsfile.CredentialSource needed to create a\n// subjectTokenProvider\nfunc newSubjectTokenProvider(o *Options) (subjectTokenProvider, error) {\n\tlogger := internallog.New(o.Logger)\n\treqOpts := &RequestOptions{Audience: o.Audience, SubjectTokenType: o.SubjectTokenType}\n\tif o.AwsSecurityCredentialsProvider != nil {\n\t\treturn &awsSubjectProvider{\n\t\t\tsecurityCredentialsProvider: o.AwsSecurityCredentialsProvider,\n\t\t\tTargetResource:              o.Audience,\n\t\t\treqOpts:                     reqOpts,\n\t\t\tlogger:                      logger,\n\t\t}, nil\n\t} else if o.SubjectTokenProvider != nil {\n\t\treturn &programmaticProvider{stp: o.SubjectTokenProvider, opts: reqOpts}, nil\n\t} else if len(o.CredentialSource.EnvironmentID) > 3 && o.CredentialSource.EnvironmentID[:3] == \"aws\" {\n\t\tif awsVersion, err := strconv.Atoi(o.CredentialSource.EnvironmentID[3:]); err == nil {\n\t\t\tif awsVersion != 1 {\n\t\t\t\treturn nil, fmt.Errorf(\"credentials: aws version '%d' is not supported in the current build\", awsVersion)\n\t\t\t}\n\n\t\t\tawsProvider := &awsSubjectProvider{\n\t\t\t\tEnvironmentID:               o.CredentialSource.EnvironmentID,\n\t\t\t\tRegionURL:                   o.CredentialSource.RegionURL,\n\t\t\t\tRegionalCredVerificationURL: o.CredentialSource.RegionalCredVerificationURL,\n\t\t\t\tCredVerificationURL:         o.CredentialSource.URL,\n\t\t\t\tTargetResource:              o.Audience,\n\t\t\t\tClient:                      o.Client,\n\t\t\t\tlogger:                      logger,\n\t\t\t}\n\t\t\tif o.CredentialSource.IMDSv2SessionTokenURL != \"\" {\n\t\t\t\tawsProvider.IMDSv2SessionTokenURL = o.CredentialSource.IMDSv2SessionTokenURL\n\t\t\t}\n\n\t\t\treturn awsProvider, nil\n\t\t}\n\t} else if o.CredentialSource.File != \"\" {\n\t\treturn &fileSubjectProvider{File: o.CredentialSource.File, Format: o.CredentialSource.Format}, nil\n\t} else if o.CredentialSource.URL != \"\" {\n\t\treturn &urlSubjectProvider{\n\t\t\tURL:     o.CredentialSource.URL,\n\t\t\tHeaders: o.CredentialSource.Headers,\n\t\t\tFormat:  o.CredentialSource.Format,\n\t\t\tClient:  o.Client,\n\t\t\tLogger:  logger,\n\t\t}, nil\n\t} else if o.CredentialSource.Executable != nil {\n\t\tec := o.CredentialSource.Executable\n\t\tif ec.Command == \"\" {\n\t\t\treturn nil, errors.New(\"credentials: missing `command` field — executable command must be provided\")\n\t\t}\n\n\t\texecProvider := &executableSubjectProvider{}\n\t\texecProvider.Command = ec.Command\n\t\tif ec.TimeoutMillis == 0 {\n\t\t\texecProvider.Timeout = executableDefaultTimeout\n\t\t} else {\n\t\t\texecProvider.Timeout = time.Duration(ec.TimeoutMillis) * time.Millisecond\n\t\t\tif execProvider.Timeout < timeoutMinimum || execProvider.Timeout > timeoutMaximum {\n\t\t\t\treturn nil, fmt.Errorf(\"credentials: invalid `timeout_millis` field — executable timeout must be between %v and %v seconds\", timeoutMinimum.Seconds(), timeoutMaximum.Seconds())\n\t\t\t}\n\t\t}\n\t\texecProvider.OutputFile = ec.OutputFile\n\t\texecProvider.client = o.Client\n\t\texecProvider.opts = o\n\t\texecProvider.env = runtimeEnvironment{}\n\t\treturn execProvider, nil\n\t} else if o.CredentialSource.Certificate != nil {\n\t\tcert := o.CredentialSource.Certificate\n\t\tif !cert.UseDefaultCertificateConfig && cert.CertificateConfigLocation == \"\" {\n\t\t\treturn nil, errors.New(\"credentials: \\\"certificate\\\" object must either specify a certificate_config_location or use_default_certificate_config should be true\")\n\t\t}\n\t\tif cert.UseDefaultCertificateConfig && cert.CertificateConfigLocation != \"\" {\n\t\t\treturn nil, errors.New(\"credentials: \\\"certificate\\\" object cannot specify both a certificate_config_location and use_default_certificate_config=true\")\n\t\t}\n\t\treturn &x509Provider{\n\t\t\tTrustChainPath: o.CredentialSource.Certificate.TrustChainPath,\n\t\t\tConfigFilePath: o.CredentialSource.Certificate.CertificateConfigLocation,\n\t\t}, nil\n\t}\n\treturn nil, errors.New(\"credentials: unable to parse credential source\")\n}\n\nfunc getGoogHeaderValue(conf *Options, p subjectTokenProvider) string {\n\treturn fmt.Sprintf(\"gl-go/%s auth/%s google-byoid-sdk source/%s sa-impersonation/%t config-lifetime/%t\",\n\t\tgoVersion(),\n\t\t\"unknown\",\n\t\tp.providerType(),\n\t\tconf.ServiceAccountImpersonationURL != \"\",\n\t\tconf.ServiceAccountImpersonationLifetimeSeconds != 0)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/file_provider.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage externalaccount\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"cloud.google.com/go/auth/internal\"\n\t\"cloud.google.com/go/auth/internal/credsfile\"\n)\n\nconst (\n\tfileProviderType = \"file\"\n)\n\ntype fileSubjectProvider struct {\n\tFile   string\n\tFormat *credsfile.Format\n}\n\nfunc (sp *fileSubjectProvider) subjectToken(context.Context) (string, error) {\n\ttokenFile, err := os.Open(sp.File)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"credentials: failed to open credential file %q: %w\", sp.File, err)\n\t}\n\tdefer tokenFile.Close()\n\ttokenBytes, err := internal.ReadAll(tokenFile)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"credentials: failed to read credential file: %w\", err)\n\t}\n\ttokenBytes = bytes.TrimSpace(tokenBytes)\n\n\tif sp.Format == nil {\n\t\treturn string(tokenBytes), nil\n\t}\n\tswitch sp.Format.Type {\n\tcase fileTypeJSON:\n\t\tjsonData := make(map[string]interface{})\n\t\terr = json.Unmarshal(tokenBytes, &jsonData)\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"credentials: failed to unmarshal subject token file: %w\", err)\n\t\t}\n\t\tval, ok := jsonData[sp.Format.SubjectTokenFieldName]\n\t\tif !ok {\n\t\t\treturn \"\", errors.New(\"credentials: provided subject_token_field_name not found in credentials\")\n\t\t}\n\t\ttoken, ok := val.(string)\n\t\tif !ok {\n\t\t\treturn \"\", errors.New(\"credentials: improperly formatted subject token\")\n\t\t}\n\t\treturn token, nil\n\tcase fileTypeText:\n\t\treturn string(tokenBytes), nil\n\tdefault:\n\t\treturn \"\", errors.New(\"credentials: invalid credential_source file format type: \" + sp.Format.Type)\n\t}\n}\n\nfunc (sp *fileSubjectProvider) providerType() string {\n\treturn fileProviderType\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/info.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage externalaccount\n\nimport (\n\t\"runtime\"\n\t\"strings\"\n\t\"unicode\"\n)\n\nvar (\n\t// version is a package internal global variable for testing purposes.\n\tversion = runtime.Version\n)\n\n// versionUnknown is only used when the runtime version cannot be determined.\nconst versionUnknown = \"UNKNOWN\"\n\n// goVersion returns a Go runtime version derived from the runtime environment\n// that is modified to be suitable for reporting in a header, meaning it has no\n// whitespace. If it is unable to determine the Go runtime version, it returns\n// versionUnknown.\nfunc goVersion() string {\n\tconst develPrefix = \"devel +\"\n\n\ts := version()\n\tif strings.HasPrefix(s, develPrefix) {\n\t\ts = s[len(develPrefix):]\n\t\tif p := strings.IndexFunc(s, unicode.IsSpace); p >= 0 {\n\t\t\ts = s[:p]\n\t\t}\n\t\treturn s\n\t} else if p := strings.IndexFunc(s, unicode.IsSpace); p >= 0 {\n\t\ts = s[:p]\n\t}\n\n\tnotSemverRune := func(r rune) bool {\n\t\treturn !strings.ContainsRune(\"0123456789.\", r)\n\t}\n\n\tif strings.HasPrefix(s, \"go1\") {\n\t\ts = s[2:]\n\t\tvar prerelease string\n\t\tif p := strings.IndexFunc(s, notSemverRune); p >= 0 {\n\t\t\ts, prerelease = s[:p], s[p:]\n\t\t}\n\t\tif strings.HasSuffix(s, \".\") {\n\t\t\ts += \"0\"\n\t\t} else if strings.Count(s, \".\") < 2 {\n\t\t\ts += \".0\"\n\t\t}\n\t\tif prerelease != \"\" {\n\t\t\t// Some release candidates already have a dash in them.\n\t\t\tif !strings.HasPrefix(prerelease, \"-\") {\n\t\t\t\tprerelease = \"-\" + prerelease\n\t\t\t}\n\t\t\ts += prerelease\n\t\t}\n\t\treturn s\n\t}\n\treturn versionUnknown\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/programmatic_provider.go",
    "content": "// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage externalaccount\n\nimport \"context\"\n\ntype programmaticProvider struct {\n\topts *RequestOptions\n\tstp  SubjectTokenProvider\n}\n\nfunc (pp *programmaticProvider) providerType() string {\n\treturn programmaticProviderType\n}\n\nfunc (pp *programmaticProvider) subjectToken(ctx context.Context) (string, error) {\n\treturn pp.stp.SubjectToken(ctx, pp.opts)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/url_provider.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage externalaccount\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net/http\"\n\n\t\"cloud.google.com/go/auth/internal\"\n\t\"cloud.google.com/go/auth/internal/credsfile\"\n\t\"github.com/googleapis/gax-go/v2/internallog\"\n)\n\nconst (\n\tfileTypeText             = \"text\"\n\tfileTypeJSON             = \"json\"\n\turlProviderType          = \"url\"\n\tprogrammaticProviderType = \"programmatic\"\n\tx509ProviderType         = \"x509\"\n)\n\ntype urlSubjectProvider struct {\n\tURL     string\n\tHeaders map[string]string\n\tFormat  *credsfile.Format\n\tClient  *http.Client\n\tLogger  *slog.Logger\n}\n\nfunc (sp *urlSubjectProvider) subjectToken(ctx context.Context) (string, error) {\n\treq, err := http.NewRequestWithContext(ctx, \"GET\", sp.URL, nil)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"credentials: HTTP request for URL-sourced credential failed: %w\", err)\n\t}\n\n\tfor key, val := range sp.Headers {\n\t\treq.Header.Add(key, val)\n\t}\n\tsp.Logger.DebugContext(ctx, \"url subject token request\", \"request\", internallog.HTTPRequest(req, nil))\n\tresp, body, err := internal.DoRequest(sp.Client, req)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"credentials: invalid response when retrieving subject token: %w\", err)\n\t}\n\tsp.Logger.DebugContext(ctx, \"url subject token response\", \"response\", internallog.HTTPResponse(resp, body))\n\tif c := resp.StatusCode; c < http.StatusOK || c >= http.StatusMultipleChoices {\n\t\treturn \"\", fmt.Errorf(\"credentials: status code %d: %s\", c, body)\n\t}\n\n\tif sp.Format == nil {\n\t\treturn string(body), nil\n\t}\n\tswitch sp.Format.Type {\n\tcase \"json\":\n\t\tjsonData := make(map[string]interface{})\n\t\terr = json.Unmarshal(body, &jsonData)\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"credentials: failed to unmarshal subject token file: %w\", err)\n\t\t}\n\t\tval, ok := jsonData[sp.Format.SubjectTokenFieldName]\n\t\tif !ok {\n\t\t\treturn \"\", errors.New(\"credentials: provided subject_token_field_name not found in credentials\")\n\t\t}\n\t\ttoken, ok := val.(string)\n\t\tif !ok {\n\t\t\treturn \"\", errors.New(\"credentials: improperly formatted subject token\")\n\t\t}\n\t\treturn token, nil\n\tcase fileTypeText:\n\t\treturn string(body), nil\n\tdefault:\n\t\treturn \"\", errors.New(\"credentials: invalid credential_source file format type: \" + sp.Format.Type)\n\t}\n}\n\nfunc (sp *urlSubjectProvider) providerType() string {\n\treturn urlProviderType\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/x509_provider.go",
    "content": "// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage externalaccount\n\nimport (\n\t\"context\"\n\t\"crypto/tls\"\n\t\"crypto/x509\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"encoding/pem\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io/fs\"\n\t\"net/http\"\n\t\"os\"\n\t\"strings\"\n\t\"time\"\n\n\t\"cloud.google.com/go/auth/internal/transport/cert\"\n)\n\n// x509Provider implements the subjectTokenProvider type for x509 workload\n// identity credentials. This provider retrieves and formats a JSON array\n// containing the leaf certificate and trust chain (if provided) as\n// base64-encoded strings. This JSON array serves as the subject token for\n// mTLS authentication.\ntype x509Provider struct {\n\t// TrustChainPath is the path to the file containing the trust chain certificates.\n\t// The file should contain one or more PEM-encoded certificates.\n\tTrustChainPath string\n\t// ConfigFilePath is the path to the configuration file containing the path\n\t// to the leaf certificate file.\n\tConfigFilePath string\n}\n\nconst pemCertificateHeader = \"-----BEGIN CERTIFICATE-----\"\n\nfunc (xp *x509Provider) providerType() string {\n\treturn x509ProviderType\n}\n\n// loadLeafCertificate loads and parses the leaf certificate from the specified\n// configuration file. It retrieves the certificate path from the config file,\n// reads the certificate file, and parses the certificate data.\nfunc loadLeafCertificate(configFilePath string) (*x509.Certificate, error) {\n\t// Get the path to the certificate file from the configuration file.\n\tpath, err := cert.GetCertificatePath(configFilePath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get certificate path from config file: %w\", err)\n\t}\n\tleafCertBytes, err := os.ReadFile(path)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to read leaf certificate file: %w\", err)\n\t}\n\t// Parse the certificate bytes.\n\treturn parseCertificate(leafCertBytes)\n}\n\n// encodeCert encodes a x509.Certificate to a base64 string.\nfunc encodeCert(cert *x509.Certificate) string {\n\t// cert.Raw contains the raw DER-encoded certificate. Encode the raw certificate bytes to base64.\n\treturn base64.StdEncoding.EncodeToString(cert.Raw)\n}\n\n// parseCertificate parses a PEM-encoded certificate from the given byte slice.\nfunc parseCertificate(certData []byte) (*x509.Certificate, error) {\n\tif len(certData) == 0 {\n\t\treturn nil, errors.New(\"invalid certificate data: empty input\")\n\t}\n\t// Decode the PEM-encoded data.\n\tblock, _ := pem.Decode(certData)\n\tif block == nil {\n\t\treturn nil, errors.New(\"invalid PEM-encoded certificate data: no PEM block found\")\n\t}\n\tif block.Type != \"CERTIFICATE\" {\n\t\treturn nil, fmt.Errorf(\"invalid PEM-encoded certificate data: expected CERTIFICATE block type, got %s\", block.Type)\n\t}\n\t// Parse the DER-encoded certificate.\n\tcertificate, err := x509.ParseCertificate(block.Bytes)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to parse certificate: %w\", err)\n\t}\n\treturn certificate, nil\n}\n\n// readTrustChain reads a file of PEM-encoded X.509 certificates and returns a slice of parsed certificates.\n// It splits the file content into PEM certificate blocks and parses each one.\nfunc readTrustChain(trustChainPath string) ([]*x509.Certificate, error) {\n\tcertificateTrustChain := []*x509.Certificate{}\n\n\t// If no trust chain path is provided, return an empty slice.\n\tif trustChainPath == \"\" {\n\t\treturn certificateTrustChain, nil\n\t}\n\n\t// Read the trust chain file.\n\ttrustChainData, err := os.ReadFile(trustChainPath)\n\tif err != nil {\n\t\tif errors.Is(err, fs.ErrNotExist) {\n\t\t\treturn nil, fmt.Errorf(\"trust chain file not found: %w\", err)\n\t\t}\n\t\treturn nil, fmt.Errorf(\"failed to read trust chain file: %w\", err)\n\t}\n\n\t// Split the file content into PEM certificate blocks.\n\tcertBlocks := strings.Split(string(trustChainData), pemCertificateHeader)\n\n\t// Iterate over each certificate block.\n\tfor _, certBlock := range certBlocks {\n\t\t// Trim whitespace from the block.\n\t\tcertBlock = strings.TrimSpace(certBlock)\n\n\t\tif certBlock != \"\" {\n\t\t\t// Add the PEM header to the block.\n\t\t\tcertData := pemCertificateHeader + \"\\n\" + certBlock\n\n\t\t\t// Parse the certificate data.\n\t\t\tcert, err := parseCertificate([]byte(certData))\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"error parsing certificate from trust chain file: %w\", err)\n\t\t\t}\n\n\t\t\t// Append the certificate to the trust chain.\n\t\t\tcertificateTrustChain = append(certificateTrustChain, cert)\n\t\t}\n\t}\n\n\treturn certificateTrustChain, nil\n}\n\n// subjectToken retrieves the X.509 subject token. It loads the leaf\n// certificate and, if a trust chain path is configured, the trust chain\n// certificates. It then constructs a JSON array containing the base64-encoded\n// leaf certificate and each base64-encoded certificate in the trust chain.\n// The leaf certificate must be at the top of the trust chain file. This JSON\n// array is used as the subject token for mTLS authentication.\nfunc (xp *x509Provider) subjectToken(context.Context) (string, error) {\n\t// Load the leaf certificate.\n\tleafCert, err := loadLeafCertificate(xp.ConfigFilePath)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to load leaf certificate: %w\", err)\n\t}\n\n\t// Read the trust chain.\n\ttrustChain, err := readTrustChain(xp.TrustChainPath)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to read trust chain: %w\", err)\n\t}\n\n\t// Initialize the certificate chain with the leaf certificate.\n\tcertChain := []string{encodeCert(leafCert)}\n\n\t// If there is a trust chain, add certificates to the certificate chain.\n\tif len(trustChain) > 0 {\n\t\tfirstCert := encodeCert(trustChain[0])\n\n\t\t// If the first certificate in the trust chain is not the same as the leaf certificate, add it to the chain.\n\t\tif firstCert != certChain[0] {\n\t\t\tcertChain = append(certChain, firstCert)\n\t\t}\n\n\t\t// Iterate over the remaining certificates in the trust chain.\n\t\tfor i := 1; i < len(trustChain); i++ {\n\t\t\tencoded := encodeCert(trustChain[i])\n\n\t\t\t// Return an error if the current certificate is the same as the leaf certificate.\n\t\t\tif encoded == certChain[0] {\n\t\t\t\treturn \"\", errors.New(\"the leaf certificate must be at the top of the trust chain file\")\n\t\t\t}\n\n\t\t\t// Add the current certificate to the chain.\n\t\t\tcertChain = append(certChain, encoded)\n\t\t}\n\t}\n\n\t// Convert the certificate chain to a JSON array of base64-encoded strings.\n\tjsonChain, err := json.Marshal(certChain)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to format certificate data: %w\", err)\n\t}\n\n\t// Return the JSON-formatted certificate chain.\n\treturn string(jsonChain), nil\n\n}\n\n// createX509Client creates a new client that is configured with mTLS, using the\n// certificate configuration specified in the credential source.\nfunc createX509Client(certificateConfigLocation string) (*http.Client, error) {\n\tcertProvider, err := cert.NewWorkloadX509CertProvider(certificateConfigLocation)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ttrans := http.DefaultTransport.(*http.Transport).Clone()\n\n\ttrans.TLSClientConfig = &tls.Config{\n\t\tGetClientCertificate: certProvider,\n\t}\n\n\t// Create a client with default settings plus the X509 workload cert and key.\n\tclient := &http.Client{\n\t\tTransport: trans,\n\t\tTimeout:   30 * time.Second,\n\t}\n\n\treturn client, nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/credentials/internal/externalaccountuser/externalaccountuser.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage externalaccountuser\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"cloud.google.com/go/auth\"\n\t\"cloud.google.com/go/auth/credentials/internal/stsexchange\"\n\t\"cloud.google.com/go/auth/internal\"\n\t\"github.com/googleapis/gax-go/v2/internallog\"\n)\n\n// Options stores the configuration for fetching tokens with external authorized\n// user credentials.\ntype Options struct {\n\t// Audience is the Secure Token Service (STS) audience which contains the\n\t// resource name for the workforce pool and the provider identifier in that\n\t// pool.\n\tAudience string\n\t// RefreshToken is the OAuth 2.0 refresh token.\n\tRefreshToken string\n\t// TokenURL is the STS token exchange endpoint for refresh.\n\tTokenURL string\n\t// TokenInfoURL is the STS endpoint URL for token introspection. Optional.\n\tTokenInfoURL string\n\t// ClientID is only required in conjunction with ClientSecret, as described\n\t// below.\n\tClientID string\n\t// ClientSecret is currently only required if token_info endpoint also needs\n\t// to be called with the generated a cloud access token. When provided, STS\n\t// will be called with additional basic authentication using client_id as\n\t// username and client_secret as password.\n\tClientSecret string\n\t// Scopes contains the desired scopes for the returned access token.\n\tScopes []string\n\n\t// Client for token request.\n\tClient *http.Client\n\t// Logger for logging.\n\tLogger *slog.Logger\n}\n\nfunc (c *Options) validate() bool {\n\treturn c.ClientID != \"\" && c.ClientSecret != \"\" && c.RefreshToken != \"\" && c.TokenURL != \"\"\n}\n\n// NewTokenProvider returns a [cloud.google.com/go/auth.TokenProvider]\n// configured with the provided options.\nfunc NewTokenProvider(opts *Options) (auth.TokenProvider, error) {\n\tif !opts.validate() {\n\t\treturn nil, errors.New(\"credentials: invalid external_account_authorized_user configuration\")\n\t}\n\n\ttp := &tokenProvider{\n\t\to: opts,\n\t}\n\treturn auth.NewCachedTokenProvider(tp, nil), nil\n}\n\ntype tokenProvider struct {\n\to *Options\n}\n\nfunc (tp *tokenProvider) Token(ctx context.Context) (*auth.Token, error) {\n\topts := tp.o\n\n\tclientAuth := stsexchange.ClientAuthentication{\n\t\tAuthStyle:    auth.StyleInHeader,\n\t\tClientID:     opts.ClientID,\n\t\tClientSecret: opts.ClientSecret,\n\t}\n\theaders := make(http.Header)\n\theaders.Set(\"Content-Type\", \"application/x-www-form-urlencoded\")\n\tstsResponse, err := stsexchange.RefreshAccessToken(ctx, &stsexchange.Options{\n\t\tClient:         opts.Client,\n\t\tEndpoint:       opts.TokenURL,\n\t\tRefreshToken:   opts.RefreshToken,\n\t\tAuthentication: clientAuth,\n\t\tHeaders:        headers,\n\t\tLogger:         internallog.New(tp.o.Logger),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif stsResponse.ExpiresIn < 0 {\n\t\treturn nil, errors.New(\"credentials: invalid expiry from security token service\")\n\t}\n\n\t// guarded by the wrapping with CachedTokenProvider\n\tif stsResponse.RefreshToken != \"\" {\n\t\topts.RefreshToken = stsResponse.RefreshToken\n\t}\n\treturn &auth.Token{\n\t\tValue:  stsResponse.AccessToken,\n\t\tExpiry: time.Now().UTC().Add(time.Duration(stsResponse.ExpiresIn) * time.Second),\n\t\tType:   internal.TokenTypeBearer,\n\t}, nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/credentials/internal/gdch/gdch.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage gdch\n\nimport (\n\t\"context\"\n\t\"crypto\"\n\t\"crypto/tls\"\n\t\"crypto/x509\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"strings\"\n\t\"time\"\n\n\t\"cloud.google.com/go/auth\"\n\t\"cloud.google.com/go/auth/internal\"\n\t\"cloud.google.com/go/auth/internal/credsfile\"\n\t\"cloud.google.com/go/auth/internal/jwt\"\n\t\"github.com/googleapis/gax-go/v2/internallog\"\n)\n\nconst (\n\t// GrantType is the grant type for the token request.\n\tGrantType        = \"urn:ietf:params:oauth:token-type:token-exchange\"\n\trequestTokenType = \"urn:ietf:params:oauth:token-type:access_token\"\n\tsubjectTokenType = \"urn:k8s:params:oauth:token-type:serviceaccount\"\n)\n\nvar (\n\tgdchSupportFormatVersions map[string]bool = map[string]bool{\n\t\t\"1\": true,\n\t}\n)\n\n// Options for [NewTokenProvider].\ntype Options struct {\n\tSTSAudience string\n\tClient      *http.Client\n\tLogger      *slog.Logger\n}\n\n// NewTokenProvider returns a [cloud.google.com/go/auth.TokenProvider] from a\n// GDCH cred file.\nfunc NewTokenProvider(f *credsfile.GDCHServiceAccountFile, o *Options) (auth.TokenProvider, error) {\n\tif !gdchSupportFormatVersions[f.FormatVersion] {\n\t\treturn nil, fmt.Errorf(\"credentials: unsupported gdch_service_account format %q\", f.FormatVersion)\n\t}\n\tif o.STSAudience == \"\" {\n\t\treturn nil, errors.New(\"credentials: STSAudience must be set for the GDCH auth flows\")\n\t}\n\tsigner, err := internal.ParseKey([]byte(f.PrivateKey))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcertPool, err := loadCertPool(f.CertPath)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\ttp := gdchProvider{\n\t\tserviceIdentity: fmt.Sprintf(\"system:serviceaccount:%s:%s\", f.Project, f.Name),\n\t\ttokenURL:        f.TokenURL,\n\t\taud:             o.STSAudience,\n\t\tsigner:          signer,\n\t\tpkID:            f.PrivateKeyID,\n\t\tcertPool:        certPool,\n\t\tclient:          o.Client,\n\t\tlogger:          internallog.New(o.Logger),\n\t}\n\treturn tp, nil\n}\n\nfunc loadCertPool(path string) (*x509.CertPool, error) {\n\tpool := x509.NewCertPool()\n\tpem, err := os.ReadFile(path)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"credentials: failed to read certificate: %w\", err)\n\t}\n\tpool.AppendCertsFromPEM(pem)\n\treturn pool, nil\n}\n\ntype gdchProvider struct {\n\tserviceIdentity string\n\ttokenURL        string\n\taud             string\n\tsigner          crypto.Signer\n\tpkID            string\n\tcertPool        *x509.CertPool\n\n\tclient *http.Client\n\tlogger *slog.Logger\n}\n\nfunc (g gdchProvider) Token(ctx context.Context) (*auth.Token, error) {\n\taddCertToTransport(g.client, g.certPool)\n\tiat := time.Now()\n\texp := iat.Add(time.Hour)\n\tclaims := jwt.Claims{\n\t\tIss: g.serviceIdentity,\n\t\tSub: g.serviceIdentity,\n\t\tAud: g.tokenURL,\n\t\tIat: iat.Unix(),\n\t\tExp: exp.Unix(),\n\t}\n\th := jwt.Header{\n\t\tAlgorithm: jwt.HeaderAlgRSA256,\n\t\tType:      jwt.HeaderType,\n\t\tKeyID:     string(g.pkID),\n\t}\n\tpayload, err := jwt.EncodeJWS(&h, &claims, g.signer)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tv := url.Values{}\n\tv.Set(\"grant_type\", GrantType)\n\tv.Set(\"audience\", g.aud)\n\tv.Set(\"requested_token_type\", requestTokenType)\n\tv.Set(\"subject_token\", payload)\n\tv.Set(\"subject_token_type\", subjectTokenType)\n\n\treq, err := http.NewRequestWithContext(ctx, \"POST\", g.tokenURL, strings.NewReader(v.Encode()))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treq.Header.Set(\"Content-Type\", \"application/x-www-form-urlencoded\")\n\tg.logger.DebugContext(ctx, \"gdch token request\", \"request\", internallog.HTTPRequest(req, []byte(v.Encode())))\n\tresp, body, err := internal.DoRequest(g.client, req)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"credentials: cannot fetch token: %w\", err)\n\t}\n\tg.logger.DebugContext(ctx, \"gdch token response\", \"response\", internallog.HTTPResponse(resp, body))\n\tif c := resp.StatusCode; c < http.StatusOK || c > http.StatusMultipleChoices {\n\t\treturn nil, &auth.Error{\n\t\t\tResponse: resp,\n\t\t\tBody:     body,\n\t\t}\n\t}\n\n\tvar tokenRes struct {\n\t\tAccessToken string `json:\"access_token\"`\n\t\tTokenType   string `json:\"token_type\"`\n\t\tExpiresIn   int64  `json:\"expires_in\"` // relative seconds from now\n\t}\n\tif err := json.Unmarshal(body, &tokenRes); err != nil {\n\t\treturn nil, fmt.Errorf(\"credentials: cannot fetch token: %w\", err)\n\t}\n\ttoken := &auth.Token{\n\t\tValue: tokenRes.AccessToken,\n\t\tType:  tokenRes.TokenType,\n\t}\n\traw := make(map[string]interface{})\n\tjson.Unmarshal(body, &raw) // no error checks for optional fields\n\ttoken.Metadata = raw\n\n\tif secs := tokenRes.ExpiresIn; secs > 0 {\n\t\ttoken.Expiry = time.Now().Add(time.Duration(secs) * time.Second)\n\t}\n\treturn token, nil\n}\n\n// addCertToTransport makes a best effort attempt at adding in the cert info to\n// the client. It tries to keep all configured transport settings if the\n// underlying transport is an http.Transport. Or else it overwrites the\n// transport with defaults adding in the certs.\nfunc addCertToTransport(hc *http.Client, certPool *x509.CertPool) {\n\ttrans, ok := hc.Transport.(*http.Transport)\n\tif !ok {\n\t\ttrans = http.DefaultTransport.(*http.Transport).Clone()\n\t}\n\ttrans.TLSClientConfig = &tls.Config{\n\t\tRootCAs: certPool,\n\t}\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/credentials/internal/impersonate/idtoken.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage impersonate\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"strings\"\n\t\"time\"\n\n\t\"cloud.google.com/go/auth\"\n\t\"cloud.google.com/go/auth/internal\"\n\t\"github.com/googleapis/gax-go/v2/internallog\"\n)\n\nvar (\n\tuniverseDomainPlaceholder            = \"UNIVERSE_DOMAIN\"\n\tiamCredentialsUniverseDomainEndpoint = \"https://iamcredentials.UNIVERSE_DOMAIN\"\n)\n\n// IDTokenIAMOptions provides configuration for [IDTokenIAMOptions.Token].\ntype IDTokenIAMOptions struct {\n\t// Client is required.\n\tClient *http.Client\n\t// Logger is required.\n\tLogger              *slog.Logger\n\tUniverseDomain      auth.CredentialsPropertyProvider\n\tServiceAccountEmail string\n\tGenerateIDTokenRequest\n}\n\n// GenerateIDTokenRequest holds the request to the IAM generateIdToken RPC.\ntype GenerateIDTokenRequest struct {\n\tAudience     string `json:\"audience\"`\n\tIncludeEmail bool   `json:\"includeEmail\"`\n\t// Delegates are the ordered, fully-qualified resource name for service\n\t// accounts in a delegation chain. Each service account must be granted\n\t// roles/iam.serviceAccountTokenCreator on the next service account in the\n\t// chain. The delegates must have the following format:\n\t// projects/-/serviceAccounts/{ACCOUNT_EMAIL_OR_UNIQUEID}. The - wildcard\n\t// character is required; replacing it with a project ID is invalid.\n\t// Optional.\n\tDelegates []string `json:\"delegates,omitempty\"`\n}\n\n// GenerateIDTokenResponse holds the response from the IAM generateIdToken RPC.\ntype GenerateIDTokenResponse struct {\n\tToken string `json:\"token\"`\n}\n\n// Token call IAM generateIdToken with the configuration provided in [IDTokenIAMOptions].\nfunc (o IDTokenIAMOptions) Token(ctx context.Context) (*auth.Token, error) {\n\tuniverseDomain, err := o.UniverseDomain.GetProperty(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tendpoint := strings.Replace(iamCredentialsUniverseDomainEndpoint, universeDomainPlaceholder, universeDomain, 1)\n\turl := fmt.Sprintf(\"%s/v1/%s:generateIdToken\", endpoint, internal.FormatIAMServiceAccountResource(o.ServiceAccountEmail))\n\n\tbodyBytes, err := json.Marshal(o.GenerateIDTokenRequest)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"impersonate: unable to marshal request: %w\", err)\n\t}\n\n\treq, err := http.NewRequestWithContext(ctx, \"POST\", url, bytes.NewReader(bodyBytes))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"impersonate: unable to create request: %w\", err)\n\t}\n\treq.Header.Set(\"Content-Type\", \"application/json\")\n\to.Logger.DebugContext(ctx, \"impersonated idtoken request\", \"request\", internallog.HTTPRequest(req, bodyBytes))\n\tresp, body, err := internal.DoRequest(o.Client, req)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"impersonate: unable to generate ID token: %w\", err)\n\t}\n\to.Logger.DebugContext(ctx, \"impersonated idtoken response\", \"response\", internallog.HTTPResponse(resp, body))\n\tif c := resp.StatusCode; c < 200 || c > 299 {\n\t\treturn nil, fmt.Errorf(\"impersonate: status code %d: %s\", c, body)\n\t}\n\n\tvar tokenResp GenerateIDTokenResponse\n\tif err := json.Unmarshal(body, &tokenResp); err != nil {\n\t\treturn nil, fmt.Errorf(\"impersonate: unable to parse response: %w\", err)\n\t}\n\treturn &auth.Token{\n\t\tValue: tokenResp.Token,\n\t\t// Generated ID tokens are good for one hour.\n\t\tExpiry: time.Now().Add(1 * time.Hour),\n\t}, nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/credentials/internal/impersonate/impersonate.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage impersonate\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"cloud.google.com/go/auth\"\n\t\"cloud.google.com/go/auth/internal\"\n\t\"github.com/googleapis/gax-go/v2/internallog\"\n)\n\nconst (\n\tdefaultTokenLifetime = \"3600s\"\n\tauthHeaderKey        = \"Authorization\"\n)\n\n// generateAccesstokenReq is used for service account impersonation\ntype generateAccessTokenReq struct {\n\tDelegates []string `json:\"delegates,omitempty\"`\n\tLifetime  string   `json:\"lifetime,omitempty\"`\n\tScope     []string `json:\"scope,omitempty\"`\n}\n\ntype impersonateTokenResponse struct {\n\tAccessToken string `json:\"accessToken\"`\n\tExpireTime  string `json:\"expireTime\"`\n}\n\n// NewTokenProvider uses a source credential, stored in Ts, to request an access token to the provided URL.\n// Scopes can be defined when the access token is requested.\nfunc NewTokenProvider(opts *Options) (auth.TokenProvider, error) {\n\tif err := opts.validate(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn opts, nil\n}\n\n// Options for [NewTokenProvider].\ntype Options struct {\n\t// Tp is the source credential used to generate a token on the\n\t// impersonated service account. Required.\n\tTp auth.TokenProvider\n\n\t// URL is the endpoint to call to generate a token\n\t// on behalf of the service account. Required.\n\tURL string\n\t// Scopes that the impersonated credential should have. Required.\n\tScopes []string\n\t// Delegates are the service account email addresses in a delegation chain.\n\t// Each service account must be granted roles/iam.serviceAccountTokenCreator\n\t// on the next service account in the chain. Optional.\n\tDelegates []string\n\t// TokenLifetimeSeconds is the number of seconds the impersonation token will\n\t// be valid for. Defaults to 1 hour if unset. Optional.\n\tTokenLifetimeSeconds int\n\t// Client configures the underlying client used to make network requests\n\t// when fetching tokens. Required.\n\tClient *http.Client\n\t// Logger is used for debug logging. If provided, logging will be enabled\n\t// at the loggers configured level. By default logging is disabled unless\n\t// enabled by setting GOOGLE_SDK_GO_LOGGING_LEVEL in which case a default\n\t// logger will be used. Optional.\n\tLogger *slog.Logger\n}\n\nfunc (o *Options) validate() error {\n\tif o.Tp == nil {\n\t\treturn errors.New(\"credentials: missing required 'source_credentials' field in impersonated credentials\")\n\t}\n\tif o.URL == \"\" {\n\t\treturn errors.New(\"credentials: missing required 'service_account_impersonation_url' field in impersonated credentials\")\n\t}\n\treturn nil\n}\n\n// Token performs the exchange to get a temporary service account token to allow access to GCP.\nfunc (o *Options) Token(ctx context.Context) (*auth.Token, error) {\n\tlogger := internallog.New(o.Logger)\n\tlifetime := defaultTokenLifetime\n\tif o.TokenLifetimeSeconds != 0 {\n\t\tlifetime = fmt.Sprintf(\"%ds\", o.TokenLifetimeSeconds)\n\t}\n\treqBody := generateAccessTokenReq{\n\t\tLifetime:  lifetime,\n\t\tScope:     o.Scopes,\n\t\tDelegates: o.Delegates,\n\t}\n\tb, err := json.Marshal(reqBody)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"credentials: unable to marshal request: %w\", err)\n\t}\n\treq, err := http.NewRequestWithContext(ctx, \"POST\", o.URL, bytes.NewReader(b))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"credentials: unable to create impersonation request: %w\", err)\n\t}\n\treq.Header.Set(\"Content-Type\", \"application/json\")\n\tif err := setAuthHeader(ctx, o.Tp, req); err != nil {\n\t\treturn nil, err\n\t}\n\tlogger.DebugContext(ctx, \"impersonated token request\", \"request\", internallog.HTTPRequest(req, b))\n\tresp, body, err := internal.DoRequest(o.Client, req)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"credentials: unable to generate access token: %w\", err)\n\t}\n\tlogger.DebugContext(ctx, \"impersonated token response\", \"response\", internallog.HTTPResponse(resp, body))\n\tif c := resp.StatusCode; c < http.StatusOK || c >= http.StatusMultipleChoices {\n\t\treturn nil, fmt.Errorf(\"credentials: status code %d: %s\", c, body)\n\t}\n\n\tvar accessTokenResp impersonateTokenResponse\n\tif err := json.Unmarshal(body, &accessTokenResp); err != nil {\n\t\treturn nil, fmt.Errorf(\"credentials: unable to parse response: %w\", err)\n\t}\n\texpiry, err := time.Parse(time.RFC3339, accessTokenResp.ExpireTime)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"credentials: unable to parse expiry: %w\", err)\n\t}\n\treturn &auth.Token{\n\t\tValue:  accessTokenResp.AccessToken,\n\t\tExpiry: expiry,\n\t\tType:   internal.TokenTypeBearer,\n\t}, nil\n}\n\nfunc setAuthHeader(ctx context.Context, tp auth.TokenProvider, r *http.Request) error {\n\tt, err := tp.Token(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\ttyp := t.Type\n\tif typ == \"\" {\n\t\ttyp = internal.TokenTypeBearer\n\t}\n\tr.Header.Set(authHeaderKey, typ+\" \"+t.Value)\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/credentials/internal/stsexchange/sts_exchange.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage stsexchange\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"cloud.google.com/go/auth\"\n\t\"cloud.google.com/go/auth/internal\"\n\t\"github.com/googleapis/gax-go/v2/internallog\"\n)\n\nconst (\n\t// GrantType for a sts exchange.\n\tGrantType = \"urn:ietf:params:oauth:grant-type:token-exchange\"\n\t// TokenType for a sts exchange.\n\tTokenType = \"urn:ietf:params:oauth:token-type:access_token\"\n\n\tjwtTokenType = \"urn:ietf:params:oauth:token-type:jwt\"\n)\n\n// Options stores the configuration for making an sts exchange request.\ntype Options struct {\n\tClient         *http.Client\n\tLogger         *slog.Logger\n\tEndpoint       string\n\tRequest        *TokenRequest\n\tAuthentication ClientAuthentication\n\tHeaders        http.Header\n\t// ExtraOpts are optional fields marshalled into the `options` field of the\n\t// request body.\n\tExtraOpts    map[string]interface{}\n\tRefreshToken string\n}\n\n// RefreshAccessToken performs the token exchange using a refresh token flow.\nfunc RefreshAccessToken(ctx context.Context, opts *Options) (*TokenResponse, error) {\n\tdata := url.Values{}\n\tdata.Set(\"grant_type\", \"refresh_token\")\n\tdata.Set(\"refresh_token\", opts.RefreshToken)\n\treturn doRequest(ctx, opts, data)\n}\n\n// ExchangeToken performs an oauth2 token exchange with the provided endpoint.\nfunc ExchangeToken(ctx context.Context, opts *Options) (*TokenResponse, error) {\n\tdata := url.Values{}\n\tdata.Set(\"audience\", opts.Request.Audience)\n\tdata.Set(\"grant_type\", GrantType)\n\tdata.Set(\"requested_token_type\", TokenType)\n\tdata.Set(\"subject_token_type\", opts.Request.SubjectTokenType)\n\tdata.Set(\"subject_token\", opts.Request.SubjectToken)\n\tdata.Set(\"scope\", strings.Join(opts.Request.Scope, \" \"))\n\tif opts.ExtraOpts != nil {\n\t\topts, err := json.Marshal(opts.ExtraOpts)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"credentials: failed to marshal additional options: %w\", err)\n\t\t}\n\t\tdata.Set(\"options\", string(opts))\n\t}\n\treturn doRequest(ctx, opts, data)\n}\n\nfunc doRequest(ctx context.Context, opts *Options, data url.Values) (*TokenResponse, error) {\n\topts.Authentication.InjectAuthentication(data, opts.Headers)\n\tencodedData := data.Encode()\n\tlogger := internallog.New(opts.Logger)\n\n\treq, err := http.NewRequestWithContext(ctx, \"POST\", opts.Endpoint, strings.NewReader(encodedData))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"credentials: failed to properly build http request: %w\", err)\n\n\t}\n\tfor key, list := range opts.Headers {\n\t\tfor _, val := range list {\n\t\t\treq.Header.Add(key, val)\n\t\t}\n\t}\n\treq.Header.Set(\"Content-Length\", strconv.Itoa(len(encodedData)))\n\n\tlogger.DebugContext(ctx, \"sts token request\", \"request\", internallog.HTTPRequest(req, []byte(encodedData)))\n\tresp, body, err := internal.DoRequest(opts.Client, req)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"credentials: invalid response from Secure Token Server: %w\", err)\n\t}\n\tlogger.DebugContext(ctx, \"sts token response\", \"response\", internallog.HTTPResponse(resp, body))\n\tif c := resp.StatusCode; c < http.StatusOK || c > http.StatusMultipleChoices {\n\t\treturn nil, fmt.Errorf(\"credentials: status code %d: %s\", c, body)\n\t}\n\tvar stsResp TokenResponse\n\tif err := json.Unmarshal(body, &stsResp); err != nil {\n\t\treturn nil, fmt.Errorf(\"credentials: failed to unmarshal response body from Secure Token Server: %w\", err)\n\t}\n\n\treturn &stsResp, nil\n}\n\n// TokenRequest contains fields necessary to make an oauth2 token\n// exchange.\ntype TokenRequest struct {\n\tActingParty struct {\n\t\tActorToken     string\n\t\tActorTokenType string\n\t}\n\tGrantType          string\n\tResource           string\n\tAudience           string\n\tScope              []string\n\tRequestedTokenType string\n\tSubjectToken       string\n\tSubjectTokenType   string\n}\n\n// TokenResponse is used to decode the remote server response during\n// an oauth2 token exchange.\ntype TokenResponse struct {\n\tAccessToken     string `json:\"access_token\"`\n\tIssuedTokenType string `json:\"issued_token_type\"`\n\tTokenType       string `json:\"token_type\"`\n\tExpiresIn       int    `json:\"expires_in\"`\n\tScope           string `json:\"scope\"`\n\tRefreshToken    string `json:\"refresh_token\"`\n}\n\n// ClientAuthentication represents an OAuth client ID and secret and the\n// mechanism for passing these credentials as stated in rfc6749#2.3.1.\ntype ClientAuthentication struct {\n\tAuthStyle    auth.Style\n\tClientID     string\n\tClientSecret string\n}\n\n// InjectAuthentication is used to add authentication to a Secure Token Service\n// exchange request.  It modifies either the passed url.Values or http.Header\n// depending on the desired authentication format.\nfunc (c *ClientAuthentication) InjectAuthentication(values url.Values, headers http.Header) {\n\tif c.ClientID == \"\" || c.ClientSecret == \"\" || values == nil || headers == nil {\n\t\treturn\n\t}\n\tswitch c.AuthStyle {\n\tcase auth.StyleInHeader:\n\t\tplainHeader := c.ClientID + \":\" + c.ClientSecret\n\t\theaders.Set(\"Authorization\", \"Basic \"+base64.StdEncoding.EncodeToString([]byte(plainHeader)))\n\tdefault:\n\t\tvalues.Set(\"client_id\", c.ClientID)\n\t\tvalues.Set(\"client_secret\", c.ClientSecret)\n\t}\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/credentials/selfsignedjwt.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage credentials\n\nimport (\n\t\"context\"\n\t\"crypto\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"strings\"\n\t\"time\"\n\n\t\"cloud.google.com/go/auth\"\n\t\"cloud.google.com/go/auth/internal\"\n\t\"cloud.google.com/go/auth/internal/credsfile\"\n\t\"cloud.google.com/go/auth/internal/jwt\"\n)\n\nvar (\n\t// for testing\n\tnow func() time.Time = time.Now\n)\n\n// configureSelfSignedJWT uses the private key in the service account to create\n// a JWT without making a network call.\nfunc configureSelfSignedJWT(f *credsfile.ServiceAccountFile, opts *DetectOptions) (auth.TokenProvider, error) {\n\tif len(opts.scopes()) == 0 && opts.Audience == \"\" {\n\t\treturn nil, errors.New(\"credentials: both scopes and audience are empty\")\n\t}\n\tsigner, err := internal.ParseKey([]byte(f.PrivateKey))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"credentials: could not parse key: %w\", err)\n\t}\n\treturn &selfSignedTokenProvider{\n\t\temail:    f.ClientEmail,\n\t\taudience: opts.Audience,\n\t\tscopes:   opts.scopes(),\n\t\tsigner:   signer,\n\t\tpkID:     f.PrivateKeyID,\n\t\tlogger:   opts.logger(),\n\t}, nil\n}\n\ntype selfSignedTokenProvider struct {\n\temail    string\n\taudience string\n\tscopes   []string\n\tsigner   crypto.Signer\n\tpkID     string\n\tlogger   *slog.Logger\n}\n\nfunc (tp *selfSignedTokenProvider) Token(context.Context) (*auth.Token, error) {\n\tiat := now()\n\texp := iat.Add(time.Hour)\n\tscope := strings.Join(tp.scopes, \" \")\n\tc := &jwt.Claims{\n\t\tIss:   tp.email,\n\t\tSub:   tp.email,\n\t\tAud:   tp.audience,\n\t\tScope: scope,\n\t\tIat:   iat.Unix(),\n\t\tExp:   exp.Unix(),\n\t}\n\th := &jwt.Header{\n\t\tAlgorithm: jwt.HeaderAlgRSA256,\n\t\tType:      jwt.HeaderType,\n\t\tKeyID:     string(tp.pkID),\n\t}\n\ttok, err := jwt.EncodeJWS(h, c, tp.signer)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"credentials: could not encode JWT: %w\", err)\n\t}\n\ttp.logger.Debug(\"created self-signed JWT\", \"token\", tok)\n\treturn &auth.Token{Value: tok, Type: internal.TokenTypeBearer, Expiry: exp}, nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/grpctransport/dial_socketopt.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n//go:build linux\n// +build linux\n\npackage grpctransport\n\nimport (\n\t\"context\"\n\t\"net\"\n\t\"syscall\"\n\n\t\"google.golang.org/grpc\"\n)\n\nconst (\n\t// defaultTCPUserTimeout is the default TCP_USER_TIMEOUT socket option. By\n\t// default is 20 seconds.\n\ttcpUserTimeoutMilliseconds = 20000\n\n\t// Copied from golang.org/x/sys/unix.TCP_USER_TIMEOUT.\n\ttcpUserTimeoutOp = 0x12\n)\n\nfunc init() {\n\t// timeoutDialerOption is a grpc.DialOption that contains dialer with\n\t// socket option TCP_USER_TIMEOUT. This dialer requires go versions 1.11+.\n\ttimeoutDialerOption = grpc.WithContextDialer(dialTCPUserTimeout)\n}\n\nfunc dialTCPUserTimeout(ctx context.Context, addr string) (net.Conn, error) {\n\tcontrol := func(network, address string, c syscall.RawConn) error {\n\t\tvar syscallErr error\n\t\tcontrolErr := c.Control(func(fd uintptr) {\n\t\t\tsyscallErr = syscall.SetsockoptInt(\n\t\t\t\tint(fd), syscall.IPPROTO_TCP, tcpUserTimeoutOp, tcpUserTimeoutMilliseconds)\n\t\t})\n\t\tif syscallErr != nil {\n\t\t\treturn syscallErr\n\t\t}\n\t\tif controlErr != nil {\n\t\t\treturn controlErr\n\t\t}\n\t\treturn nil\n\t}\n\td := &net.Dialer{\n\t\tControl: control,\n\t}\n\treturn d.DialContext(ctx, \"tcp\", addr)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/grpctransport/directpath.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage grpctransport\n\nimport (\n\t\"context\"\n\t\"net\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"cloud.google.com/go/auth\"\n\t\"cloud.google.com/go/auth/credentials\"\n\t\"cloud.google.com/go/auth/internal/compute\"\n\t\"google.golang.org/grpc\"\n\tgrpcgoogle \"google.golang.org/grpc/credentials/google\"\n)\n\nfunc isDirectPathEnabled(endpoint string, opts *Options) bool {\n\tif opts.InternalOptions != nil && !opts.InternalOptions.EnableDirectPath {\n\t\treturn false\n\t}\n\tif !checkDirectPathEndPoint(endpoint) {\n\t\treturn false\n\t}\n\tif b, _ := strconv.ParseBool(os.Getenv(disableDirectPathEnvVar)); b {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc checkDirectPathEndPoint(endpoint string) bool {\n\t// Only [dns:///]host[:port] is supported, not other schemes (e.g., \"tcp://\" or \"unix://\").\n\t// Also don't try direct path if the user has chosen an alternate name resolver\n\t// (i.e., via \":///\" prefix).\n\tif strings.Contains(endpoint, \"://\") && !strings.HasPrefix(endpoint, \"dns:///\") {\n\t\treturn false\n\t}\n\n\tif endpoint == \"\" {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\nfunc isTokenProviderComputeEngine(tp auth.TokenProvider) bool {\n\tif tp == nil {\n\t\treturn false\n\t}\n\ttok, err := tp.Token(context.Background())\n\tif err != nil {\n\t\treturn false\n\t}\n\tif tok == nil {\n\t\treturn false\n\t}\n\tif tok.MetadataString(\"auth.google.tokenSource\") != \"compute-metadata\" {\n\t\treturn false\n\t}\n\tif tok.MetadataString(\"auth.google.serviceAccount\") != \"default\" {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc isTokenProviderDirectPathCompatible(tp auth.TokenProvider, o *Options) bool {\n\tif tp == nil {\n\t\treturn false\n\t}\n\tif o.InternalOptions != nil && o.InternalOptions.EnableNonDefaultSAForDirectPath {\n\t\treturn true\n\t}\n\treturn isTokenProviderComputeEngine(tp)\n}\n\nfunc isDirectPathXdsUsed(o *Options) bool {\n\t// Method 1: Enable DirectPath xDS by env;\n\tif b, _ := strconv.ParseBool(os.Getenv(enableDirectPathXdsEnvVar)); b {\n\t\treturn true\n\t}\n\t// Method 2: Enable DirectPath xDS by option;\n\tif o.InternalOptions != nil && o.InternalOptions.EnableDirectPathXds {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc isDirectPathBoundTokenEnabled(opts *InternalOptions) bool {\n\tfor _, ev := range opts.AllowHardBoundTokens {\n\t\tif ev == \"ALTS\" {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// configureDirectPath returns some dial options and an endpoint to use if the\n// configuration allows the use of direct path. If it does not the provided\n// grpcOpts and endpoint are returned.\nfunc configureDirectPath(grpcOpts []grpc.DialOption, opts *Options, endpoint string, creds *auth.Credentials) ([]grpc.DialOption, string, error) {\n\tif isDirectPathEnabled(endpoint, opts) && compute.OnComputeEngine() && isTokenProviderDirectPathCompatible(creds, opts) {\n\t\t// Overwrite all of the previously specific DialOptions, DirectPath uses its own set of credentials and certificates.\n\t\tdefaultCredetialsOptions := grpcgoogle.DefaultCredentialsOptions{PerRPCCreds: &grpcCredentialsProvider{creds: creds}}\n\t\tif isDirectPathBoundTokenEnabled(opts.InternalOptions) && isTokenProviderComputeEngine(creds) {\n\t\t\toptsClone := opts.resolveDetectOptions()\n\t\t\toptsClone.TokenBindingType = credentials.ALTSHardBinding\n\t\t\taltsCreds, err := credentials.DetectDefault(optsClone)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, \"\", err\n\t\t\t}\n\t\t\tdefaultCredetialsOptions.ALTSPerRPCCreds = &grpcCredentialsProvider{creds: altsCreds}\n\t\t}\n\t\tgrpcOpts = []grpc.DialOption{\n\t\t\tgrpc.WithCredentialsBundle(grpcgoogle.NewDefaultCredentialsWithOptions(defaultCredetialsOptions))}\n\t\tif timeoutDialerOption != nil {\n\t\t\tgrpcOpts = append(grpcOpts, timeoutDialerOption)\n\t\t}\n\t\t// Check if google-c2p resolver is enabled for DirectPath\n\t\tif isDirectPathXdsUsed(opts) {\n\t\t\t// google-c2p resolver target must not have a port number\n\t\t\tif addr, _, err := net.SplitHostPort(endpoint); err == nil {\n\t\t\t\tendpoint = \"google-c2p:///\" + addr\n\t\t\t} else {\n\t\t\t\tendpoint = \"google-c2p:///\" + endpoint\n\t\t\t}\n\t\t} else {\n\t\t\tif !strings.HasPrefix(endpoint, \"dns:///\") {\n\t\t\t\tendpoint = \"dns:///\" + endpoint\n\t\t\t}\n\t\t\tgrpcOpts = append(grpcOpts,\n\t\t\t\t// For now all DirectPath go clients will be using the following lb config, but in future\n\t\t\t\t// when different services need different configs, then we should change this to a\n\t\t\t\t// per-service config.\n\t\t\t\tgrpc.WithDisableServiceConfig(),\n\t\t\t\tgrpc.WithDefaultServiceConfig(`{\"loadBalancingConfig\":[{\"grpclb\":{\"childPolicy\":[{\"pick_first\":{}}]}}]}`))\n\t\t}\n\t\t// TODO: add support for system parameters (quota project, request reason) via chained interceptor.\n\t}\n\treturn grpcOpts, endpoint, nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/grpctransport/grpctransport.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package grpctransport provides functionality for managing gRPC client\n// connections to Google Cloud services.\npackage grpctransport\n\nimport (\n\t\"context\"\n\t\"crypto/tls\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"os\"\n\t\"sync\"\n\n\t\"cloud.google.com/go/auth\"\n\t\"cloud.google.com/go/auth/credentials\"\n\t\"cloud.google.com/go/auth/internal\"\n\t\"cloud.google.com/go/auth/internal/transport\"\n\t\"github.com/googleapis/gax-go/v2/internallog\"\n\t\"go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc\"\n\t\"google.golang.org/grpc\"\n\tgrpccreds \"google.golang.org/grpc/credentials\"\n\tgrpcinsecure \"google.golang.org/grpc/credentials/insecure\"\n\t\"google.golang.org/grpc/stats\"\n)\n\nconst (\n\t// Check env to disable DirectPath traffic.\n\tdisableDirectPathEnvVar = \"GOOGLE_CLOUD_DISABLE_DIRECT_PATH\"\n\n\t// Check env to decide if using google-c2p resolver for DirectPath traffic.\n\tenableDirectPathXdsEnvVar = \"GOOGLE_CLOUD_ENABLE_DIRECT_PATH_XDS\"\n\n\tquotaProjectHeaderKey = \"X-goog-user-project\"\n)\n\nvar (\n\t// Set at init time by dial_socketopt.go. If nil, socketopt is not supported.\n\ttimeoutDialerOption grpc.DialOption\n)\n\n// otelStatsHandler is a singleton otelgrpc.clientHandler to be used across\n// all dial connections to avoid the memory leak documented in\n// https://github.com/open-telemetry/opentelemetry-go-contrib/issues/4226\n//\n// TODO: When this module depends on a version of otelgrpc containing the fix,\n// replace this singleton with inline usage for simplicity.\n// The fix should be in https://github.com/open-telemetry/opentelemetry-go/pull/5797.\nvar (\n\tinitOtelStatsHandlerOnce sync.Once\n\totelStatsHandler         stats.Handler\n)\n\n// otelGRPCStatsHandler returns singleton otelStatsHandler for reuse across all\n// dial connections.\nfunc otelGRPCStatsHandler() stats.Handler {\n\tinitOtelStatsHandlerOnce.Do(func() {\n\t\totelStatsHandler = otelgrpc.NewClientHandler()\n\t})\n\treturn otelStatsHandler\n}\n\n// ClientCertProvider is a function that returns a TLS client certificate to be\n// used when opening TLS connections. It follows the same semantics as\n// [crypto/tls.Config.GetClientCertificate].\ntype ClientCertProvider = func(*tls.CertificateRequestInfo) (*tls.Certificate, error)\n\n// Options used to configure a [GRPCClientConnPool] from [Dial].\ntype Options struct {\n\t// DisableTelemetry disables default telemetry (OpenTelemetry). An example\n\t// reason to do so would be to bind custom telemetry that overrides the\n\t// defaults.\n\tDisableTelemetry bool\n\t// DisableAuthentication specifies that no authentication should be used. It\n\t// is suitable only for testing and for accessing public resources, like\n\t// public Google Cloud Storage buckets.\n\tDisableAuthentication bool\n\t// Endpoint overrides the default endpoint to be used for a service.\n\tEndpoint string\n\t// Metadata is extra gRPC metadata that will be appended to every outgoing\n\t// request.\n\tMetadata map[string]string\n\t// GRPCDialOpts are dial options that will be passed to `grpc.Dial` when\n\t// establishing a`grpc.Conn``\n\tGRPCDialOpts []grpc.DialOption\n\t// PoolSize is specifies how many connections to balance between when making\n\t// requests. If unset or less than 1, the value defaults to 1.\n\tPoolSize int\n\t// Credentials used to add Authorization metadata to all requests. If set\n\t// DetectOpts are ignored.\n\tCredentials *auth.Credentials\n\t// ClientCertProvider is a function that returns a TLS client certificate to\n\t// be used when opening TLS connections. It follows the same semantics as\n\t// crypto/tls.Config.GetClientCertificate.\n\tClientCertProvider ClientCertProvider\n\t// DetectOpts configures settings for detect Application Default\n\t// Credentials.\n\tDetectOpts *credentials.DetectOptions\n\t// UniverseDomain is the default service domain for a given Cloud universe.\n\t// The default value is \"googleapis.com\". This is the universe domain\n\t// configured for the client, which will be compared to the universe domain\n\t// that is separately configured for the credentials.\n\tUniverseDomain string\n\t// APIKey specifies an API key to be used as the basis for authentication.\n\t// If set DetectOpts are ignored.\n\tAPIKey string\n\t// Logger is used for debug logging. If provided, logging will be enabled\n\t// at the loggers configured level. By default logging is disabled unless\n\t// enabled by setting GOOGLE_SDK_GO_LOGGING_LEVEL in which case a default\n\t// logger will be used. Optional.\n\tLogger *slog.Logger\n\n\t// InternalOptions are NOT meant to be set directly by consumers of this\n\t// package, they should only be set by generated client code.\n\tInternalOptions *InternalOptions\n}\n\n// client returns the client a user set for the detect options or nil if one was\n// not set.\nfunc (o *Options) client() *http.Client {\n\tif o.DetectOpts != nil && o.DetectOpts.Client != nil {\n\t\treturn o.DetectOpts.Client\n\t}\n\treturn nil\n}\n\nfunc (o *Options) logger() *slog.Logger {\n\treturn internallog.New(o.Logger)\n}\n\nfunc (o *Options) validate() error {\n\tif o == nil {\n\t\treturn errors.New(\"grpctransport: opts required to be non-nil\")\n\t}\n\tif o.InternalOptions != nil && o.InternalOptions.SkipValidation {\n\t\treturn nil\n\t}\n\thasCreds := o.APIKey != \"\" ||\n\t\to.Credentials != nil ||\n\t\t(o.DetectOpts != nil && len(o.DetectOpts.CredentialsJSON) > 0) ||\n\t\t(o.DetectOpts != nil && o.DetectOpts.CredentialsFile != \"\")\n\tif o.DisableAuthentication && hasCreds {\n\t\treturn errors.New(\"grpctransport: DisableAuthentication is incompatible with options that set or detect credentials\")\n\t}\n\treturn nil\n}\n\nfunc (o *Options) resolveDetectOptions() *credentials.DetectOptions {\n\tio := o.InternalOptions\n\t// soft-clone these so we are not updating a ref the user holds and may reuse\n\tdo := transport.CloneDetectOptions(o.DetectOpts)\n\n\t// If scoped JWTs are enabled user provided an aud, allow self-signed JWT.\n\tif (io != nil && io.EnableJWTWithScope) || do.Audience != \"\" {\n\t\tdo.UseSelfSignedJWT = true\n\t}\n\t// Only default scopes if user did not also set an audience.\n\tif len(do.Scopes) == 0 && do.Audience == \"\" && io != nil && len(io.DefaultScopes) > 0 {\n\t\tdo.Scopes = make([]string, len(io.DefaultScopes))\n\t\tcopy(do.Scopes, io.DefaultScopes)\n\t}\n\tif len(do.Scopes) == 0 && do.Audience == \"\" && io != nil {\n\t\tdo.Audience = o.InternalOptions.DefaultAudience\n\t}\n\tif o.ClientCertProvider != nil {\n\t\ttlsConfig := &tls.Config{\n\t\t\tGetClientCertificate: o.ClientCertProvider,\n\t\t}\n\t\tdo.Client = transport.DefaultHTTPClientWithTLS(tlsConfig)\n\t\tdo.TokenURL = credentials.GoogleMTLSTokenURL\n\t}\n\tif do.Logger == nil {\n\t\tdo.Logger = o.logger()\n\t}\n\treturn do\n}\n\n// InternalOptions are only meant to be set by generated client code. These are\n// not meant to be set directly by consumers of this package. Configuration in\n// this type is considered EXPERIMENTAL and may be removed at any time in the\n// future without warning.\ntype InternalOptions struct {\n\t// EnableNonDefaultSAForDirectPath overrides the default requirement for\n\t// using the default service account for DirectPath.\n\tEnableNonDefaultSAForDirectPath bool\n\t// EnableDirectPath overrides the default attempt to use DirectPath.\n\tEnableDirectPath bool\n\t// EnableDirectPathXds overrides the default DirectPath type. It is only\n\t// valid when DirectPath is enabled.\n\tEnableDirectPathXds bool\n\t// EnableJWTWithScope specifies if scope can be used with self-signed JWT.\n\tEnableJWTWithScope bool\n\t// AllowHardBoundTokens allows libraries to request a hard-bound token.\n\t// Obtaining hard-bound tokens requires the connection to be established\n\t// using either ALTS or mTLS with S2A.\n\tAllowHardBoundTokens []string\n\t// DefaultAudience specifies a default audience to be used as the audience\n\t// field (\"aud\") for the JWT token authentication.\n\tDefaultAudience string\n\t// DefaultEndpointTemplate combined with UniverseDomain specifies\n\t// the default endpoint.\n\tDefaultEndpointTemplate string\n\t// DefaultMTLSEndpoint specifies the default mTLS endpoint.\n\tDefaultMTLSEndpoint string\n\t// DefaultScopes specifies the default OAuth2 scopes to be used for a\n\t// service.\n\tDefaultScopes []string\n\t// SkipValidation bypasses validation on Options. It should only be used\n\t// internally for clients that needs more control over their transport.\n\tSkipValidation bool\n}\n\n// Dial returns a GRPCClientConnPool that can be used to communicate with a\n// Google cloud service, configured with the provided [Options]. It\n// automatically appends Authorization metadata to all outgoing requests.\nfunc Dial(ctx context.Context, secure bool, opts *Options) (GRPCClientConnPool, error) {\n\tif err := opts.validate(); err != nil {\n\t\treturn nil, err\n\t}\n\tif opts.PoolSize <= 1 {\n\t\tconn, err := dial(ctx, secure, opts)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn &singleConnPool{conn}, nil\n\t}\n\tpool := &roundRobinConnPool{}\n\tfor i := 0; i < opts.PoolSize; i++ {\n\t\tconn, err := dial(ctx, secure, opts)\n\t\tif err != nil {\n\t\t\t// ignore close error, if any\n\t\t\tdefer pool.Close()\n\t\t\treturn nil, err\n\t\t}\n\t\tpool.conns = append(pool.conns, conn)\n\t}\n\treturn pool, nil\n}\n\n// return a GRPCClientConnPool if pool == 1 or else a pool of of them if >1\nfunc dial(ctx context.Context, secure bool, opts *Options) (*grpc.ClientConn, error) {\n\ttOpts := &transport.Options{\n\t\tEndpoint:           opts.Endpoint,\n\t\tClientCertProvider: opts.ClientCertProvider,\n\t\tClient:             opts.client(),\n\t\tUniverseDomain:     opts.UniverseDomain,\n\t\tLogger:             opts.logger(),\n\t}\n\tif io := opts.InternalOptions; io != nil {\n\t\ttOpts.DefaultEndpointTemplate = io.DefaultEndpointTemplate\n\t\ttOpts.DefaultMTLSEndpoint = io.DefaultMTLSEndpoint\n\t\ttOpts.EnableDirectPath = io.EnableDirectPath\n\t\ttOpts.EnableDirectPathXds = io.EnableDirectPathXds\n\t}\n\ttransportCreds, err := transport.GetGRPCTransportCredsAndEndpoint(tOpts)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif !secure {\n\t\ttransportCreds.TransportCredentials = grpcinsecure.NewCredentials()\n\t}\n\n\t// Initialize gRPC dial options with transport-level security options.\n\tgrpcOpts := []grpc.DialOption{\n\t\tgrpc.WithTransportCredentials(transportCreds),\n\t}\n\n\t// Ensure the token exchange HTTP transport uses the same ClientCertProvider as the GRPC API transport.\n\topts.ClientCertProvider, err = transport.GetClientCertificateProvider(tOpts)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif opts.APIKey != \"\" {\n\t\tgrpcOpts = append(grpcOpts,\n\t\t\tgrpc.WithPerRPCCredentials(&grpcKeyProvider{\n\t\t\t\tapiKey:   opts.APIKey,\n\t\t\t\tmetadata: opts.Metadata,\n\t\t\t\tsecure:   secure,\n\t\t\t}),\n\t\t)\n\t} else if !opts.DisableAuthentication {\n\t\tmetadata := opts.Metadata\n\n\t\tvar creds *auth.Credentials\n\t\tif opts.Credentials != nil {\n\t\t\tcreds = opts.Credentials\n\t\t} else {\n\t\t\t// This condition is only met for non-DirectPath clients because\n\t\t\t// TransportTypeMTLSS2A is used only when InternalOptions.EnableDirectPath\n\t\t\t// is false.\n\t\t\toptsClone := opts.resolveDetectOptions()\n\t\t\tif transportCreds.TransportType == transport.TransportTypeMTLSS2A {\n\t\t\t\t// Check that the client allows requesting hard-bound token for the transport type mTLS using S2A.\n\t\t\t\tfor _, ev := range opts.InternalOptions.AllowHardBoundTokens {\n\t\t\t\t\tif ev == \"MTLS_S2A\" {\n\t\t\t\t\t\toptsClone.TokenBindingType = credentials.MTLSHardBinding\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar err error\n\t\t\tcreds, err = credentials.DetectDefault(optsClone)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\n\t\tqp, err := creds.QuotaProjectID(ctx)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif qp != \"\" {\n\t\t\tif metadata == nil {\n\t\t\t\tmetadata = make(map[string]string, 1)\n\t\t\t}\n\t\t\t// Don't overwrite user specified quota\n\t\t\tif _, ok := metadata[quotaProjectHeaderKey]; !ok {\n\t\t\t\tmetadata[quotaProjectHeaderKey] = qp\n\t\t\t}\n\t\t}\n\t\tgrpcOpts = append(grpcOpts,\n\t\t\tgrpc.WithPerRPCCredentials(&grpcCredentialsProvider{\n\t\t\t\tcreds:                creds,\n\t\t\t\tmetadata:             metadata,\n\t\t\t\tclientUniverseDomain: opts.UniverseDomain,\n\t\t\t}),\n\t\t)\n\t\t// Attempt Direct Path\n\t\tgrpcOpts, transportCreds.Endpoint, err = configureDirectPath(grpcOpts, opts, transportCreds.Endpoint, creds)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\t// Add tracing, but before the other options, so that clients can override the\n\t// gRPC stats handler.\n\t// This assumes that gRPC options are processed in order, left to right.\n\tgrpcOpts = addOpenTelemetryStatsHandler(grpcOpts, opts)\n\tgrpcOpts = append(grpcOpts, opts.GRPCDialOpts...)\n\n\treturn grpc.DialContext(ctx, transportCreds.Endpoint, grpcOpts...)\n}\n\n// grpcKeyProvider satisfies https://pkg.go.dev/google.golang.org/grpc/credentials#PerRPCCredentials.\ntype grpcKeyProvider struct {\n\tapiKey   string\n\tmetadata map[string]string\n\tsecure   bool\n}\n\nfunc (g *grpcKeyProvider) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {\n\tmetadata := make(map[string]string, len(g.metadata)+1)\n\tmetadata[\"X-goog-api-key\"] = g.apiKey\n\tfor k, v := range g.metadata {\n\t\tmetadata[k] = v\n\t}\n\treturn metadata, nil\n}\n\nfunc (g *grpcKeyProvider) RequireTransportSecurity() bool {\n\treturn g.secure\n}\n\n// grpcCredentialsProvider satisfies https://pkg.go.dev/google.golang.org/grpc/credentials#PerRPCCredentials.\ntype grpcCredentialsProvider struct {\n\tcreds *auth.Credentials\n\n\tsecure bool\n\n\t// Additional metadata attached as headers.\n\tmetadata             map[string]string\n\tclientUniverseDomain string\n}\n\n// getClientUniverseDomain returns the default service domain for a given Cloud\n// universe, with the following precedence:\n//\n// 1. A non-empty option.WithUniverseDomain or similar client option.\n// 2. A non-empty environment variable GOOGLE_CLOUD_UNIVERSE_DOMAIN.\n// 3. The default value \"googleapis.com\".\n//\n// This is the universe domain configured for the client, which will be compared\n// to the universe domain that is separately configured for the credentials.\nfunc (c *grpcCredentialsProvider) getClientUniverseDomain() string {\n\tif c.clientUniverseDomain != \"\" {\n\t\treturn c.clientUniverseDomain\n\t}\n\tif envUD := os.Getenv(internal.UniverseDomainEnvVar); envUD != \"\" {\n\t\treturn envUD\n\t}\n\treturn internal.DefaultUniverseDomain\n}\n\nfunc (c *grpcCredentialsProvider) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {\n\ttoken, err := c.creds.Token(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif token.MetadataString(\"auth.google.tokenSource\") != \"compute-metadata\" {\n\t\tcredentialsUniverseDomain, err := c.creds.UniverseDomain(ctx)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := transport.ValidateUniverseDomain(c.getClientUniverseDomain(), credentialsUniverseDomain); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\tif c.secure {\n\t\tri, _ := grpccreds.RequestInfoFromContext(ctx)\n\t\tif err = grpccreds.CheckSecurityLevel(ri.AuthInfo, grpccreds.PrivacyAndIntegrity); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"unable to transfer credentials PerRPCCredentials: %v\", err)\n\t\t}\n\t}\n\tmetadata := make(map[string]string, len(c.metadata)+1)\n\tsetAuthMetadata(token, metadata)\n\tfor k, v := range c.metadata {\n\t\tmetadata[k] = v\n\t}\n\treturn metadata, nil\n}\n\n// setAuthMetadata uses the provided token to set the Authorization metadata.\n// If the token.Type is empty, the type is assumed to be Bearer.\nfunc setAuthMetadata(token *auth.Token, m map[string]string) {\n\ttyp := token.Type\n\tif typ == \"\" {\n\t\ttyp = internal.TokenTypeBearer\n\t}\n\tm[\"authorization\"] = typ + \" \" + token.Value\n}\n\nfunc (c *grpcCredentialsProvider) RequireTransportSecurity() bool {\n\treturn c.secure\n}\n\nfunc addOpenTelemetryStatsHandler(dialOpts []grpc.DialOption, opts *Options) []grpc.DialOption {\n\tif opts.DisableTelemetry {\n\t\treturn dialOpts\n\t}\n\treturn append(dialOpts, grpc.WithStatsHandler(otelGRPCStatsHandler()))\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/grpctransport/pool.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage grpctransport\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"sync/atomic\"\n\n\t\"google.golang.org/grpc\"\n)\n\n// GRPCClientConnPool is an interface that satisfies\n// [google.golang.org/grpc.ClientConnInterface] and has some utility functions\n// that are needed for connection lifecycle when using in a client library. It\n// may be a pool or a single connection. This interface is not intended to, and\n// can't be, implemented by others.\ntype GRPCClientConnPool interface {\n\t// Connection returns a [google.golang.org/grpc.ClientConn] from the pool.\n\t//\n\t// ClientConn aren't returned to the pool and should not be closed directly.\n\tConnection() *grpc.ClientConn\n\n\t// Len returns the number of connections in the pool. It will always return\n\t// the same value.\n\tLen() int\n\n\t// Close closes every ClientConn in the pool. The error returned by Close\n\t// may be a single error or multiple errors.\n\tClose() error\n\n\tgrpc.ClientConnInterface\n\n\t// private ensure others outside this package can't implement this type\n\tprivate()\n}\n\n// singleConnPool is a special case for a single connection.\ntype singleConnPool struct {\n\t*grpc.ClientConn\n}\n\nfunc (p *singleConnPool) Connection() *grpc.ClientConn { return p.ClientConn }\nfunc (p *singleConnPool) Len() int                     { return 1 }\nfunc (p *singleConnPool) private()                     {}\n\ntype roundRobinConnPool struct {\n\tconns []*grpc.ClientConn\n\n\tidx uint32 // access via sync/atomic\n}\n\nfunc (p *roundRobinConnPool) Len() int {\n\treturn len(p.conns)\n}\n\nfunc (p *roundRobinConnPool) Connection() *grpc.ClientConn {\n\ti := atomic.AddUint32(&p.idx, 1)\n\treturn p.conns[i%uint32(len(p.conns))]\n}\n\nfunc (p *roundRobinConnPool) Close() error {\n\tvar errs multiError\n\tfor _, conn := range p.conns {\n\t\tif err := conn.Close(); err != nil {\n\t\t\terrs = append(errs, err)\n\t\t}\n\t}\n\tif len(errs) == 0 {\n\t\treturn nil\n\t}\n\treturn errs\n}\n\nfunc (p *roundRobinConnPool) Invoke(ctx context.Context, method string, args interface{}, reply interface{}, opts ...grpc.CallOption) error {\n\treturn p.Connection().Invoke(ctx, method, args, reply, opts...)\n}\n\nfunc (p *roundRobinConnPool) NewStream(ctx context.Context, desc *grpc.StreamDesc, method string, opts ...grpc.CallOption) (grpc.ClientStream, error) {\n\treturn p.Connection().NewStream(ctx, desc, method, opts...)\n}\n\nfunc (p *roundRobinConnPool) private() {}\n\n// multiError represents errors from multiple conns in the group.\ntype multiError []error\n\nfunc (m multiError) Error() string {\n\ts, n := \"\", 0\n\tfor _, e := range m {\n\t\tif e != nil {\n\t\t\tif n == 0 {\n\t\t\t\ts = e.Error()\n\t\t\t}\n\t\t\tn++\n\t\t}\n\t}\n\tswitch n {\n\tcase 0:\n\t\treturn \"(0 errors)\"\n\tcase 1:\n\t\treturn s\n\tcase 2:\n\t\treturn s + \" (and 1 other error)\"\n\t}\n\treturn fmt.Sprintf(\"%s (and %d other errors)\", s, n-1)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/httptransport/httptransport.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package httptransport provides functionality for managing HTTP client\n// connections to Google Cloud services.\npackage httptransport\n\nimport (\n\t\"crypto/tls\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net/http\"\n\n\t\"cloud.google.com/go/auth\"\n\tdetect \"cloud.google.com/go/auth/credentials\"\n\t\"cloud.google.com/go/auth/internal\"\n\t\"cloud.google.com/go/auth/internal/transport\"\n\t\"github.com/googleapis/gax-go/v2/internallog\"\n)\n\n// ClientCertProvider is a function that returns a TLS client certificate to be\n// used when opening TLS connections. It follows the same semantics as\n// [crypto/tls.Config.GetClientCertificate].\ntype ClientCertProvider = func(*tls.CertificateRequestInfo) (*tls.Certificate, error)\n\n// Options used to configure a [net/http.Client] from [NewClient].\ntype Options struct {\n\t// DisableTelemetry disables default telemetry (OpenTelemetry). An example\n\t// reason to do so would be to bind custom telemetry that overrides the\n\t// defaults.\n\tDisableTelemetry bool\n\t// DisableAuthentication specifies that no authentication should be used. It\n\t// is suitable only for testing and for accessing public resources, like\n\t// public Google Cloud Storage buckets.\n\tDisableAuthentication bool\n\t// Headers are extra HTTP headers that will be appended to every outgoing\n\t// request.\n\tHeaders http.Header\n\t// BaseRoundTripper overrides the base transport used for serving requests.\n\t// If specified ClientCertProvider is ignored.\n\tBaseRoundTripper http.RoundTripper\n\t// Endpoint overrides the default endpoint to be used for a service.\n\tEndpoint string\n\t// APIKey specifies an API key to be used as the basis for authentication.\n\t// If set DetectOpts are ignored.\n\tAPIKey string\n\t// Credentials used to add Authorization header to all requests. If set\n\t// DetectOpts are ignored.\n\tCredentials *auth.Credentials\n\t// ClientCertProvider is a function that returns a TLS client certificate to\n\t// be used when opening TLS connections. It follows the same semantics as\n\t// crypto/tls.Config.GetClientCertificate.\n\tClientCertProvider ClientCertProvider\n\t// DetectOpts configures settings for detect Application Default\n\t// Credentials.\n\tDetectOpts *detect.DetectOptions\n\t// UniverseDomain is the default service domain for a given Cloud universe.\n\t// The default value is \"googleapis.com\". This is the universe domain\n\t// configured for the client, which will be compared to the universe domain\n\t// that is separately configured for the credentials.\n\tUniverseDomain string\n\t// Logger is used for debug logging. If provided, logging will be enabled\n\t// at the loggers configured level. By default logging is disabled unless\n\t// enabled by setting GOOGLE_SDK_GO_LOGGING_LEVEL in which case a default\n\t// logger will be used. Optional.\n\tLogger *slog.Logger\n\n\t// InternalOptions are NOT meant to be set directly by consumers of this\n\t// package, they should only be set by generated client code.\n\tInternalOptions *InternalOptions\n}\n\nfunc (o *Options) validate() error {\n\tif o == nil {\n\t\treturn errors.New(\"httptransport: opts required to be non-nil\")\n\t}\n\tif o.InternalOptions != nil && o.InternalOptions.SkipValidation {\n\t\treturn nil\n\t}\n\thasCreds := o.APIKey != \"\" ||\n\t\to.Credentials != nil ||\n\t\t(o.DetectOpts != nil && len(o.DetectOpts.CredentialsJSON) > 0) ||\n\t\t(o.DetectOpts != nil && o.DetectOpts.CredentialsFile != \"\")\n\tif o.DisableAuthentication && hasCreds {\n\t\treturn errors.New(\"httptransport: DisableAuthentication is incompatible with options that set or detect credentials\")\n\t}\n\treturn nil\n}\n\n// client returns the client a user set for the detect options or nil if one was\n// not set.\nfunc (o *Options) client() *http.Client {\n\tif o.DetectOpts != nil && o.DetectOpts.Client != nil {\n\t\treturn o.DetectOpts.Client\n\t}\n\treturn nil\n}\n\nfunc (o *Options) logger() *slog.Logger {\n\treturn internallog.New(o.Logger)\n}\n\nfunc (o *Options) resolveDetectOptions() *detect.DetectOptions {\n\tio := o.InternalOptions\n\t// soft-clone these so we are not updating a ref the user holds and may reuse\n\tdo := transport.CloneDetectOptions(o.DetectOpts)\n\n\t// If scoped JWTs are enabled user provided an aud, allow self-signed JWT.\n\tif (io != nil && io.EnableJWTWithScope) || do.Audience != \"\" {\n\t\tdo.UseSelfSignedJWT = true\n\t}\n\t// Only default scopes if user did not also set an audience.\n\tif len(do.Scopes) == 0 && do.Audience == \"\" && io != nil && len(io.DefaultScopes) > 0 {\n\t\tdo.Scopes = make([]string, len(io.DefaultScopes))\n\t\tcopy(do.Scopes, io.DefaultScopes)\n\t}\n\tif len(do.Scopes) == 0 && do.Audience == \"\" && io != nil {\n\t\tdo.Audience = o.InternalOptions.DefaultAudience\n\t}\n\tif o.ClientCertProvider != nil {\n\t\ttlsConfig := &tls.Config{\n\t\t\tGetClientCertificate: o.ClientCertProvider,\n\t\t}\n\t\tdo.Client = transport.DefaultHTTPClientWithTLS(tlsConfig)\n\t\tdo.TokenURL = detect.GoogleMTLSTokenURL\n\t}\n\tif do.Logger == nil {\n\t\tdo.Logger = o.logger()\n\t}\n\treturn do\n}\n\n// InternalOptions are only meant to be set by generated client code. These are\n// not meant to be set directly by consumers of this package. Configuration in\n// this type is considered EXPERIMENTAL and may be removed at any time in the\n// future without warning.\ntype InternalOptions struct {\n\t// EnableJWTWithScope specifies if scope can be used with self-signed JWT.\n\tEnableJWTWithScope bool\n\t// DefaultAudience specifies a default audience to be used as the audience\n\t// field (\"aud\") for the JWT token authentication.\n\tDefaultAudience string\n\t// DefaultEndpointTemplate combined with UniverseDomain specifies the\n\t// default endpoint.\n\tDefaultEndpointTemplate string\n\t// DefaultMTLSEndpoint specifies the default mTLS endpoint.\n\tDefaultMTLSEndpoint string\n\t// DefaultScopes specifies the default OAuth2 scopes to be used for a\n\t// service.\n\tDefaultScopes []string\n\t// SkipValidation bypasses validation on Options. It should only be used\n\t// internally for clients that need more control over their transport.\n\tSkipValidation bool\n\t// SkipUniverseDomainValidation skips the verification that the universe\n\t// domain configured for the client matches the universe domain configured\n\t// for the credentials. It should only be used internally for clients that\n\t// need more control over their transport. The default is false.\n\tSkipUniverseDomainValidation bool\n}\n\n// AddAuthorizationMiddleware adds a middleware to the provided client's\n// transport that sets the Authorization header with the value produced by the\n// provided [cloud.google.com/go/auth.Credentials]. An error is returned only\n// if client or creds is nil.\n//\n// This function does not support setting a universe domain value on the client.\nfunc AddAuthorizationMiddleware(client *http.Client, creds *auth.Credentials) error {\n\tif client == nil || creds == nil {\n\t\treturn fmt.Errorf(\"httptransport: client and tp must not be nil\")\n\t}\n\tbase := client.Transport\n\tif base == nil {\n\t\tif dt, ok := http.DefaultTransport.(*http.Transport); ok {\n\t\t\tbase = dt.Clone()\n\t\t} else {\n\t\t\t// Directly reuse the DefaultTransport if the application has\n\t\t\t// replaced it with an implementation of RoundTripper other than\n\t\t\t// http.Transport.\n\t\t\tbase = http.DefaultTransport\n\t\t}\n\t}\n\tclient.Transport = &authTransport{\n\t\tcreds: creds,\n\t\tbase:  base,\n\t}\n\treturn nil\n}\n\n// NewClient returns a [net/http.Client] that can be used to communicate with a\n// Google cloud service, configured with the provided [Options]. It\n// automatically appends Authorization headers to all outgoing requests.\nfunc NewClient(opts *Options) (*http.Client, error) {\n\tif err := opts.validate(); err != nil {\n\t\treturn nil, err\n\t}\n\n\ttOpts := &transport.Options{\n\t\tEndpoint:           opts.Endpoint,\n\t\tClientCertProvider: opts.ClientCertProvider,\n\t\tClient:             opts.client(),\n\t\tUniverseDomain:     opts.UniverseDomain,\n\t\tLogger:             opts.logger(),\n\t}\n\tif io := opts.InternalOptions; io != nil {\n\t\ttOpts.DefaultEndpointTemplate = io.DefaultEndpointTemplate\n\t\ttOpts.DefaultMTLSEndpoint = io.DefaultMTLSEndpoint\n\t}\n\tclientCertProvider, dialTLSContext, err := transport.GetHTTPTransportConfig(tOpts)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tbaseRoundTripper := opts.BaseRoundTripper\n\tif baseRoundTripper == nil {\n\t\tbaseRoundTripper = defaultBaseTransport(clientCertProvider, dialTLSContext)\n\t}\n\t// Ensure the token exchange transport uses the same ClientCertProvider as the API transport.\n\topts.ClientCertProvider = clientCertProvider\n\ttrans, err := newTransport(baseRoundTripper, opts)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &http.Client{\n\t\tTransport: trans,\n\t}, nil\n}\n\n// SetAuthHeader uses the provided token to set the Authorization header on a\n// request. If the token.Type is empty, the type is assumed to be Bearer.\nfunc SetAuthHeader(token *auth.Token, req *http.Request) {\n\ttyp := token.Type\n\tif typ == \"\" {\n\t\ttyp = internal.TokenTypeBearer\n\t}\n\treq.Header.Set(\"Authorization\", typ+\" \"+token.Value)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/httptransport/transport.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage httptransport\n\nimport (\n\t\"context\"\n\t\"crypto/tls\"\n\t\"net\"\n\t\"net/http\"\n\t\"os\"\n\t\"time\"\n\n\t\"cloud.google.com/go/auth\"\n\t\"cloud.google.com/go/auth/credentials\"\n\t\"cloud.google.com/go/auth/internal\"\n\t\"cloud.google.com/go/auth/internal/transport\"\n\t\"cloud.google.com/go/auth/internal/transport/cert\"\n\t\"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\"\n\t\"golang.org/x/net/http2\"\n)\n\nconst (\n\tquotaProjectHeaderKey = \"X-goog-user-project\"\n)\n\nfunc newTransport(base http.RoundTripper, opts *Options) (http.RoundTripper, error) {\n\tvar headers = opts.Headers\n\tht := &headerTransport{\n\t\tbase:    base,\n\t\theaders: headers,\n\t}\n\tvar trans http.RoundTripper = ht\n\ttrans = addOpenTelemetryTransport(trans, opts)\n\tswitch {\n\tcase opts.DisableAuthentication:\n\t\t// Do nothing.\n\tcase opts.APIKey != \"\":\n\t\tqp := internal.GetQuotaProject(nil, opts.Headers.Get(quotaProjectHeaderKey))\n\t\tif qp != \"\" {\n\t\t\tif headers == nil {\n\t\t\t\theaders = make(map[string][]string, 1)\n\t\t\t}\n\t\t\theaders.Set(quotaProjectHeaderKey, qp)\n\t\t}\n\t\ttrans = &apiKeyTransport{\n\t\t\tTransport: trans,\n\t\t\tKey:       opts.APIKey,\n\t\t}\n\tdefault:\n\t\tvar creds *auth.Credentials\n\t\tif opts.Credentials != nil {\n\t\t\tcreds = opts.Credentials\n\t\t} else {\n\t\t\tvar err error\n\t\t\tcreds, err = credentials.DetectDefault(opts.resolveDetectOptions())\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\tqp, err := creds.QuotaProjectID(context.Background())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif qp != \"\" {\n\t\t\tif headers == nil {\n\t\t\t\theaders = make(map[string][]string, 1)\n\t\t\t}\n\t\t\t// Don't overwrite user specified quota\n\t\t\tif v := headers.Get(quotaProjectHeaderKey); v == \"\" {\n\t\t\t\theaders.Set(quotaProjectHeaderKey, qp)\n\t\t\t}\n\t\t}\n\t\tvar skipUD bool\n\t\tif iOpts := opts.InternalOptions; iOpts != nil {\n\t\t\tskipUD = iOpts.SkipUniverseDomainValidation\n\t\t}\n\t\tcreds.TokenProvider = auth.NewCachedTokenProvider(creds.TokenProvider, nil)\n\t\ttrans = &authTransport{\n\t\t\tbase:                         trans,\n\t\t\tcreds:                        creds,\n\t\t\tclientUniverseDomain:         opts.UniverseDomain,\n\t\t\tskipUniverseDomainValidation: skipUD,\n\t\t}\n\t}\n\treturn trans, nil\n}\n\n// defaultBaseTransport returns the base HTTP transport.\n// On App Engine, this is urlfetch.Transport.\n// Otherwise, use a default transport, taking most defaults from\n// http.DefaultTransport.\n// If TLSCertificate is available, set TLSClientConfig as well.\nfunc defaultBaseTransport(clientCertSource cert.Provider, dialTLSContext func(context.Context, string, string) (net.Conn, error)) http.RoundTripper {\n\tdefaultTransport, ok := http.DefaultTransport.(*http.Transport)\n\tif !ok {\n\t\tdefaultTransport = transport.BaseTransport()\n\t}\n\ttrans := defaultTransport.Clone()\n\ttrans.MaxIdleConnsPerHost = 100\n\n\tif clientCertSource != nil {\n\t\ttrans.TLSClientConfig = &tls.Config{\n\t\t\tGetClientCertificate: clientCertSource,\n\t\t}\n\t}\n\tif dialTLSContext != nil {\n\t\t// If DialTLSContext is set, TLSClientConfig wil be ignored\n\t\ttrans.DialTLSContext = dialTLSContext\n\t}\n\n\t// Configures the ReadIdleTimeout HTTP/2 option for the\n\t// transport. This allows broken idle connections to be pruned more quickly,\n\t// preventing the client from attempting to re-use connections that will no\n\t// longer work.\n\thttp2Trans, err := http2.ConfigureTransports(trans)\n\tif err == nil {\n\t\thttp2Trans.ReadIdleTimeout = time.Second * 31\n\t}\n\n\treturn trans\n}\n\ntype apiKeyTransport struct {\n\t// Key is the API Key to set on requests.\n\tKey string\n\t// Transport is the underlying HTTP transport.\n\t// If nil, http.DefaultTransport is used.\n\tTransport http.RoundTripper\n}\n\nfunc (t *apiKeyTransport) RoundTrip(req *http.Request) (*http.Response, error) {\n\tnewReq := *req\n\targs := newReq.URL.Query()\n\targs.Set(\"key\", t.Key)\n\tnewReq.URL.RawQuery = args.Encode()\n\treturn t.Transport.RoundTrip(&newReq)\n}\n\ntype headerTransport struct {\n\theaders http.Header\n\tbase    http.RoundTripper\n}\n\nfunc (t *headerTransport) RoundTrip(req *http.Request) (*http.Response, error) {\n\trt := t.base\n\tnewReq := *req\n\tnewReq.Header = make(http.Header)\n\tfor k, vv := range req.Header {\n\t\tnewReq.Header[k] = vv\n\t}\n\n\tfor k, v := range t.headers {\n\t\tnewReq.Header[k] = v\n\t}\n\n\treturn rt.RoundTrip(&newReq)\n}\n\nfunc addOpenTelemetryTransport(trans http.RoundTripper, opts *Options) http.RoundTripper {\n\tif opts.DisableTelemetry {\n\t\treturn trans\n\t}\n\treturn otelhttp.NewTransport(trans)\n}\n\ntype authTransport struct {\n\tcreds                        *auth.Credentials\n\tbase                         http.RoundTripper\n\tclientUniverseDomain         string\n\tskipUniverseDomainValidation bool\n}\n\n// getClientUniverseDomain returns the default service domain for a given Cloud\n// universe, with the following precedence:\n//\n// 1. A non-empty option.WithUniverseDomain or similar client option.\n// 2. A non-empty environment variable GOOGLE_CLOUD_UNIVERSE_DOMAIN.\n// 3. The default value \"googleapis.com\".\n//\n// This is the universe domain configured for the client, which will be compared\n// to the universe domain that is separately configured for the credentials.\nfunc (t *authTransport) getClientUniverseDomain() string {\n\tif t.clientUniverseDomain != \"\" {\n\t\treturn t.clientUniverseDomain\n\t}\n\tif envUD := os.Getenv(internal.UniverseDomainEnvVar); envUD != \"\" {\n\t\treturn envUD\n\t}\n\treturn internal.DefaultUniverseDomain\n}\n\n// RoundTrip authorizes and authenticates the request with an\n// access token from Transport's Source. Per the RoundTripper contract we must\n// not modify the initial request, so we clone it, and we must close the body\n// on any errors that happens during our token logic.\nfunc (t *authTransport) RoundTrip(req *http.Request) (*http.Response, error) {\n\treqBodyClosed := false\n\tif req.Body != nil {\n\t\tdefer func() {\n\t\t\tif !reqBodyClosed {\n\t\t\t\treq.Body.Close()\n\t\t\t}\n\t\t}()\n\t}\n\ttoken, err := t.creds.Token(req.Context())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif !t.skipUniverseDomainValidation && token.MetadataString(\"auth.google.tokenSource\") != \"compute-metadata\" {\n\t\tcredentialsUniverseDomain, err := t.creds.UniverseDomain(req.Context())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := transport.ValidateUniverseDomain(t.getClientUniverseDomain(), credentialsUniverseDomain); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treq2 := req.Clone(req.Context())\n\tSetAuthHeader(token, req2)\n\treqBodyClosed = true\n\treturn t.base.RoundTrip(req2)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/internal/compute/compute.go",
    "content": "// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage compute\n\nimport (\n\t\"log\"\n\t\"runtime\"\n\t\"strings\"\n\t\"sync\"\n)\n\nvar (\n\tvmOnGCEOnce sync.Once\n\tvmOnGCE     bool\n)\n\n// OnComputeEngine returns whether the client is running on GCE.\n//\n// This is a copy of the gRPC internal googlecloud.OnGCE() func at:\n// https://github.com/grpc/grpc-go/blob/master/internal/googlecloud/googlecloud.go\n// The functionality is similar to the metadata.OnGCE() func at:\n// https://github.com/googleapis/google-cloud-go/blob/main/compute/metadata/metadata.go\n// The difference is that OnComputeEngine() does not perform HTTP or DNS check on the metadata server.\n// In particular, OnComputeEngine() will return false on Serverless.\nfunc OnComputeEngine() bool {\n\tvmOnGCEOnce.Do(func() {\n\t\tmf, err := manufacturer()\n\t\tif err != nil {\n\t\t\tlog.Printf(\"Failed to read manufacturer, vmOnGCE=false: %v\", err)\n\t\t\treturn\n\t\t}\n\t\tvmOnGCE = isRunningOnGCE(mf, runtime.GOOS)\n\t})\n\treturn vmOnGCE\n}\n\n// isRunningOnGCE checks whether the local system, without doing a network request, is\n// running on GCP.\nfunc isRunningOnGCE(manufacturer []byte, goos string) bool {\n\tname := string(manufacturer)\n\tswitch goos {\n\tcase \"linux\":\n\t\tname = strings.TrimSpace(name)\n\t\treturn name == \"Google\" || name == \"Google Compute Engine\"\n\tcase \"windows\":\n\t\tname = strings.Replace(name, \" \", \"\", -1)\n\t\tname = strings.Replace(name, \"\\n\", \"\", -1)\n\t\tname = strings.Replace(name, \"\\r\", \"\", -1)\n\t\treturn name == \"Google\"\n\tdefault:\n\t\treturn false\n\t}\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/internal/compute/manufacturer.go",
    "content": "//go:build !(linux || windows)\n// +build !linux,!windows\n\n// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage compute\n\nfunc manufacturer() ([]byte, error) {\n\treturn nil, nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/internal/compute/manufacturer_linux.go",
    "content": "// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage compute\n\nimport \"os\"\n\nconst linuxProductNameFile = \"/sys/class/dmi/id/product_name\"\n\nfunc manufacturer() ([]byte, error) {\n\treturn os.ReadFile(linuxProductNameFile)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/internal/compute/manufacturer_windows.go",
    "content": "// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage compute\n\nimport (\n\t\"errors\"\n\t\"os/exec\"\n\t\"regexp\"\n\t\"strings\"\n)\n\nconst (\n\twindowsCheckCommand      = \"powershell.exe\"\n\twindowsCheckCommandArgs  = \"Get-WmiObject -Class Win32_BIOS\"\n\tpowershellOutputFilter   = \"Manufacturer\"\n\twindowsManufacturerRegex = \":(.*)\"\n)\n\nfunc manufacturer() ([]byte, error) {\n\tcmd := exec.Command(windowsCheckCommand, windowsCheckCommandArgs)\n\tout, err := cmd.Output()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfor _, line := range strings.Split(strings.TrimSuffix(string(out), \"\\n\"), \"\\n\") {\n\t\tif strings.HasPrefix(line, powershellOutputFilter) {\n\t\t\tre := regexp.MustCompile(windowsManufacturerRegex)\n\t\t\tname := re.FindString(line)\n\t\t\tname = strings.TrimLeft(name, \":\")\n\t\t\treturn []byte(name), nil\n\t\t}\n\t}\n\treturn nil, errors.New(\"cannot determine the machine's manufacturer\")\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/internal/credsfile/credsfile.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package credsfile is meant to hide implementation details from the pubic\n// surface of the detect package. It should not import any other packages in\n// this module. It is located under the main internal package so other\n// sub-packages can use these parsed types as well.\npackage credsfile\n\nimport (\n\t\"os\"\n\t\"os/user\"\n\t\"path/filepath\"\n\t\"runtime\"\n)\n\nconst (\n\t// GoogleAppCredsEnvVar is the environment variable for setting the\n\t// application default credentials.\n\tGoogleAppCredsEnvVar = \"GOOGLE_APPLICATION_CREDENTIALS\"\n\tuserCredsFilename    = \"application_default_credentials.json\"\n)\n\n// CredentialType represents different credential filetypes Google credentials\n// can be.\ntype CredentialType int\n\nconst (\n\t// UnknownCredType is an unidentified file type.\n\tUnknownCredType CredentialType = iota\n\t// UserCredentialsKey represents a user creds file type.\n\tUserCredentialsKey\n\t// ServiceAccountKey represents a service account file type.\n\tServiceAccountKey\n\t// ImpersonatedServiceAccountKey represents a impersonated service account\n\t// file type.\n\tImpersonatedServiceAccountKey\n\t// ExternalAccountKey represents a external account file type.\n\tExternalAccountKey\n\t// GDCHServiceAccountKey represents a GDCH file type.\n\tGDCHServiceAccountKey\n\t// ExternalAccountAuthorizedUserKey represents a external account authorized\n\t// user file type.\n\tExternalAccountAuthorizedUserKey\n)\n\n// parseCredentialType returns the associated filetype based on the parsed\n// typeString provided.\nfunc parseCredentialType(typeString string) CredentialType {\n\tswitch typeString {\n\tcase \"service_account\":\n\t\treturn ServiceAccountKey\n\tcase \"authorized_user\":\n\t\treturn UserCredentialsKey\n\tcase \"impersonated_service_account\":\n\t\treturn ImpersonatedServiceAccountKey\n\tcase \"external_account\":\n\t\treturn ExternalAccountKey\n\tcase \"external_account_authorized_user\":\n\t\treturn ExternalAccountAuthorizedUserKey\n\tcase \"gdch_service_account\":\n\t\treturn GDCHServiceAccountKey\n\tdefault:\n\t\treturn UnknownCredType\n\t}\n}\n\n// GetFileNameFromEnv returns the override if provided or detects a filename\n// from the environment.\nfunc GetFileNameFromEnv(override string) string {\n\tif override != \"\" {\n\t\treturn override\n\t}\n\treturn os.Getenv(GoogleAppCredsEnvVar)\n}\n\n// GetWellKnownFileName tries to locate the filepath for the user credential\n// file based on the environment.\nfunc GetWellKnownFileName() string {\n\tif runtime.GOOS == \"windows\" {\n\t\treturn filepath.Join(os.Getenv(\"APPDATA\"), \"gcloud\", userCredsFilename)\n\t}\n\treturn filepath.Join(guessUnixHomeDir(), \".config\", \"gcloud\", userCredsFilename)\n}\n\n// guessUnixHomeDir default to checking for HOME, but not all unix systems have\n// this set, do have a fallback.\nfunc guessUnixHomeDir() string {\n\tif v := os.Getenv(\"HOME\"); v != \"\" {\n\t\treturn v\n\t}\n\tif u, err := user.Current(); err == nil {\n\t\treturn u.HomeDir\n\t}\n\treturn \"\"\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/internal/credsfile/filetype.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage credsfile\n\nimport (\n\t\"encoding/json\"\n)\n\n// Config3LO is the internals of a client creds file.\ntype Config3LO struct {\n\tClientID     string   `json:\"client_id\"`\n\tClientSecret string   `json:\"client_secret\"`\n\tRedirectURIs []string `json:\"redirect_uris\"`\n\tAuthURI      string   `json:\"auth_uri\"`\n\tTokenURI     string   `json:\"token_uri\"`\n}\n\n// ClientCredentialsFile representation.\ntype ClientCredentialsFile struct {\n\tWeb            *Config3LO `json:\"web\"`\n\tInstalled      *Config3LO `json:\"installed\"`\n\tUniverseDomain string     `json:\"universe_domain\"`\n}\n\n// ServiceAccountFile representation.\ntype ServiceAccountFile struct {\n\tType           string `json:\"type\"`\n\tProjectID      string `json:\"project_id\"`\n\tPrivateKeyID   string `json:\"private_key_id\"`\n\tPrivateKey     string `json:\"private_key\"`\n\tClientEmail    string `json:\"client_email\"`\n\tClientID       string `json:\"client_id\"`\n\tAuthURL        string `json:\"auth_uri\"`\n\tTokenURL       string `json:\"token_uri\"`\n\tUniverseDomain string `json:\"universe_domain\"`\n}\n\n// UserCredentialsFile representation.\ntype UserCredentialsFile struct {\n\tType           string `json:\"type\"`\n\tClientID       string `json:\"client_id\"`\n\tClientSecret   string `json:\"client_secret\"`\n\tQuotaProjectID string `json:\"quota_project_id\"`\n\tRefreshToken   string `json:\"refresh_token\"`\n\tUniverseDomain string `json:\"universe_domain\"`\n}\n\n// ExternalAccountFile representation.\ntype ExternalAccountFile struct {\n\tType                           string                           `json:\"type\"`\n\tClientID                       string                           `json:\"client_id\"`\n\tClientSecret                   string                           `json:\"client_secret\"`\n\tAudience                       string                           `json:\"audience\"`\n\tSubjectTokenType               string                           `json:\"subject_token_type\"`\n\tServiceAccountImpersonationURL string                           `json:\"service_account_impersonation_url\"`\n\tTokenURL                       string                           `json:\"token_url\"`\n\tCredentialSource               *CredentialSource                `json:\"credential_source,omitempty\"`\n\tTokenInfoURL                   string                           `json:\"token_info_url\"`\n\tServiceAccountImpersonation    *ServiceAccountImpersonationInfo `json:\"service_account_impersonation,omitempty\"`\n\tQuotaProjectID                 string                           `json:\"quota_project_id\"`\n\tWorkforcePoolUserProject       string                           `json:\"workforce_pool_user_project\"`\n\tUniverseDomain                 string                           `json:\"universe_domain\"`\n}\n\n// ExternalAccountAuthorizedUserFile representation.\ntype ExternalAccountAuthorizedUserFile struct {\n\tType           string `json:\"type\"`\n\tAudience       string `json:\"audience\"`\n\tClientID       string `json:\"client_id\"`\n\tClientSecret   string `json:\"client_secret\"`\n\tRefreshToken   string `json:\"refresh_token\"`\n\tTokenURL       string `json:\"token_url\"`\n\tTokenInfoURL   string `json:\"token_info_url\"`\n\tRevokeURL      string `json:\"revoke_url\"`\n\tQuotaProjectID string `json:\"quota_project_id\"`\n\tUniverseDomain string `json:\"universe_domain\"`\n}\n\n// CredentialSource stores the information necessary to retrieve the credentials for the STS exchange.\n//\n// One field amongst File, URL, Certificate, and Executable should be filled, depending on the kind of credential in question.\n// The EnvironmentID should start with AWS if being used for an AWS credential.\ntype CredentialSource struct {\n\tFile                        string             `json:\"file\"`\n\tURL                         string             `json:\"url\"`\n\tHeaders                     map[string]string  `json:\"headers\"`\n\tExecutable                  *ExecutableConfig  `json:\"executable,omitempty\"`\n\tCertificate                 *CertificateConfig `json:\"certificate\"`\n\tEnvironmentID               string             `json:\"environment_id\"` // TODO: Make type for this\n\tRegionURL                   string             `json:\"region_url\"`\n\tRegionalCredVerificationURL string             `json:\"regional_cred_verification_url\"`\n\tCredVerificationURL         string             `json:\"cred_verification_url\"`\n\tIMDSv2SessionTokenURL       string             `json:\"imdsv2_session_token_url\"`\n\tFormat                      *Format            `json:\"format,omitempty\"`\n}\n\n// Format describes the format of a [CredentialSource].\ntype Format struct {\n\t// Type is either \"text\" or \"json\". When not provided \"text\" type is assumed.\n\tType string `json:\"type\"`\n\t// SubjectTokenFieldName is only required for JSON format. This would be \"access_token\" for azure.\n\tSubjectTokenFieldName string `json:\"subject_token_field_name\"`\n}\n\n// ExecutableConfig represents the command to run for an executable\n// [CredentialSource].\ntype ExecutableConfig struct {\n\tCommand       string `json:\"command\"`\n\tTimeoutMillis int    `json:\"timeout_millis\"`\n\tOutputFile    string `json:\"output_file\"`\n}\n\n// CertificateConfig represents the options used to set up X509 based workload\n// [CredentialSource]\ntype CertificateConfig struct {\n\tUseDefaultCertificateConfig bool   `json:\"use_default_certificate_config\"`\n\tCertificateConfigLocation   string `json:\"certificate_config_location\"`\n\tTrustChainPath              string `json:\"trust_chain_path\"`\n}\n\n// ServiceAccountImpersonationInfo has impersonation configuration.\ntype ServiceAccountImpersonationInfo struct {\n\tTokenLifetimeSeconds int `json:\"token_lifetime_seconds\"`\n}\n\n// ImpersonatedServiceAccountFile representation.\ntype ImpersonatedServiceAccountFile struct {\n\tType                           string          `json:\"type\"`\n\tServiceAccountImpersonationURL string          `json:\"service_account_impersonation_url\"`\n\tDelegates                      []string        `json:\"delegates\"`\n\tCredSource                     json.RawMessage `json:\"source_credentials\"`\n\tUniverseDomain                 string          `json:\"universe_domain\"`\n}\n\n// GDCHServiceAccountFile represents the Google Distributed Cloud Hosted (GDCH) service identity file.\ntype GDCHServiceAccountFile struct {\n\tType           string `json:\"type\"`\n\tFormatVersion  string `json:\"format_version\"`\n\tProject        string `json:\"project\"`\n\tName           string `json:\"name\"`\n\tCertPath       string `json:\"ca_cert_path\"`\n\tPrivateKeyID   string `json:\"private_key_id\"`\n\tPrivateKey     string `json:\"private_key\"`\n\tTokenURL       string `json:\"token_uri\"`\n\tUniverseDomain string `json:\"universe_domain\"`\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/internal/credsfile/parse.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage credsfile\n\nimport (\n\t\"encoding/json\"\n)\n\n// ParseServiceAccount parses bytes into a [ServiceAccountFile].\nfunc ParseServiceAccount(b []byte) (*ServiceAccountFile, error) {\n\tvar f *ServiceAccountFile\n\tif err := json.Unmarshal(b, &f); err != nil {\n\t\treturn nil, err\n\t}\n\treturn f, nil\n}\n\n// ParseClientCredentials parses bytes into a\n// [credsfile.ClientCredentialsFile].\nfunc ParseClientCredentials(b []byte) (*ClientCredentialsFile, error) {\n\tvar f *ClientCredentialsFile\n\tif err := json.Unmarshal(b, &f); err != nil {\n\t\treturn nil, err\n\t}\n\treturn f, nil\n}\n\n// ParseUserCredentials parses bytes into a [UserCredentialsFile].\nfunc ParseUserCredentials(b []byte) (*UserCredentialsFile, error) {\n\tvar f *UserCredentialsFile\n\tif err := json.Unmarshal(b, &f); err != nil {\n\t\treturn nil, err\n\t}\n\treturn f, nil\n}\n\n// ParseExternalAccount parses bytes into a [ExternalAccountFile].\nfunc ParseExternalAccount(b []byte) (*ExternalAccountFile, error) {\n\tvar f *ExternalAccountFile\n\tif err := json.Unmarshal(b, &f); err != nil {\n\t\treturn nil, err\n\t}\n\treturn f, nil\n}\n\n// ParseExternalAccountAuthorizedUser parses bytes into a\n// [ExternalAccountAuthorizedUserFile].\nfunc ParseExternalAccountAuthorizedUser(b []byte) (*ExternalAccountAuthorizedUserFile, error) {\n\tvar f *ExternalAccountAuthorizedUserFile\n\tif err := json.Unmarshal(b, &f); err != nil {\n\t\treturn nil, err\n\t}\n\treturn f, nil\n}\n\n// ParseImpersonatedServiceAccount parses bytes into a\n// [ImpersonatedServiceAccountFile].\nfunc ParseImpersonatedServiceAccount(b []byte) (*ImpersonatedServiceAccountFile, error) {\n\tvar f *ImpersonatedServiceAccountFile\n\tif err := json.Unmarshal(b, &f); err != nil {\n\t\treturn nil, err\n\t}\n\treturn f, nil\n}\n\n// ParseGDCHServiceAccount parses bytes into a [GDCHServiceAccountFile].\nfunc ParseGDCHServiceAccount(b []byte) (*GDCHServiceAccountFile, error) {\n\tvar f *GDCHServiceAccountFile\n\tif err := json.Unmarshal(b, &f); err != nil {\n\t\treturn nil, err\n\t}\n\treturn f, nil\n}\n\ntype fileTypeChecker struct {\n\tType string `json:\"type\"`\n}\n\n// ParseFileType determines the [CredentialType] based on bytes provided.\nfunc ParseFileType(b []byte) (CredentialType, error) {\n\tvar f fileTypeChecker\n\tif err := json.Unmarshal(b, &f); err != nil {\n\t\treturn 0, err\n\t}\n\treturn parseCredentialType(f.Type), nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/internal/internal.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage internal\n\nimport (\n\t\"context\"\n\t\"crypto\"\n\t\"crypto/x509\"\n\t\"encoding/json\"\n\t\"encoding/pem\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"os\"\n\t\"sync\"\n\t\"time\"\n\n\t\"cloud.google.com/go/compute/metadata\"\n)\n\nconst (\n\t// TokenTypeBearer is the auth header prefix for bearer tokens.\n\tTokenTypeBearer = \"Bearer\"\n\n\t// QuotaProjectEnvVar is the environment variable for setting the quota\n\t// project.\n\tQuotaProjectEnvVar = \"GOOGLE_CLOUD_QUOTA_PROJECT\"\n\t// UniverseDomainEnvVar is the environment variable for setting the default\n\t// service domain for a given Cloud universe.\n\tUniverseDomainEnvVar = \"GOOGLE_CLOUD_UNIVERSE_DOMAIN\"\n\tprojectEnvVar        = \"GOOGLE_CLOUD_PROJECT\"\n\tmaxBodySize          = 1 << 20\n\n\t// DefaultUniverseDomain is the default value for universe domain.\n\t// Universe domain is the default service domain for a given Cloud universe.\n\tDefaultUniverseDomain = \"googleapis.com\"\n)\n\ntype clonableTransport interface {\n\tClone() *http.Transport\n}\n\n// DefaultClient returns an [http.Client] with some defaults set. If\n// the current [http.DefaultTransport] is a [clonableTransport], as\n// is the case for an [*http.Transport], the clone will be used.\n// Otherwise the [http.DefaultTransport] is used directly.\nfunc DefaultClient() *http.Client {\n\tif transport, ok := http.DefaultTransport.(clonableTransport); ok {\n\t\treturn &http.Client{\n\t\t\tTransport: transport.Clone(),\n\t\t\tTimeout:   30 * time.Second,\n\t\t}\n\t}\n\n\treturn &http.Client{\n\t\tTransport: http.DefaultTransport,\n\t\tTimeout:   30 * time.Second,\n\t}\n}\n\n// ParseKey converts the binary contents of a private key file\n// to an crypto.Signer. It detects whether the private key is in a\n// PEM container or not. If so, it extracts the the private key\n// from PEM container before conversion. It only supports PEM\n// containers with no passphrase.\nfunc ParseKey(key []byte) (crypto.Signer, error) {\n\tblock, _ := pem.Decode(key)\n\tif block != nil {\n\t\tkey = block.Bytes\n\t}\n\tvar parsedKey crypto.PrivateKey\n\tvar err error\n\tparsedKey, err = x509.ParsePKCS8PrivateKey(key)\n\tif err != nil {\n\t\tparsedKey, err = x509.ParsePKCS1PrivateKey(key)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"private key should be a PEM or plain PKCS1 or PKCS8: %w\", err)\n\t\t}\n\t}\n\tparsed, ok := parsedKey.(crypto.Signer)\n\tif !ok {\n\t\treturn nil, errors.New(\"private key is not a signer\")\n\t}\n\treturn parsed, nil\n}\n\n// GetQuotaProject retrieves quota project with precedence being: override,\n// environment variable, creds json file.\nfunc GetQuotaProject(b []byte, override string) string {\n\tif override != \"\" {\n\t\treturn override\n\t}\n\tif env := os.Getenv(QuotaProjectEnvVar); env != \"\" {\n\t\treturn env\n\t}\n\tif b == nil {\n\t\treturn \"\"\n\t}\n\tvar v struct {\n\t\tQuotaProject string `json:\"quota_project_id\"`\n\t}\n\tif err := json.Unmarshal(b, &v); err != nil {\n\t\treturn \"\"\n\t}\n\treturn v.QuotaProject\n}\n\n// GetProjectID retrieves project with precedence being: override,\n// environment variable, creds json file.\nfunc GetProjectID(b []byte, override string) string {\n\tif override != \"\" {\n\t\treturn override\n\t}\n\tif env := os.Getenv(projectEnvVar); env != \"\" {\n\t\treturn env\n\t}\n\tif b == nil {\n\t\treturn \"\"\n\t}\n\tvar v struct {\n\t\tProjectID string `json:\"project_id\"` // standard service account key\n\t\tProject   string `json:\"project\"`    // gdch key\n\t}\n\tif err := json.Unmarshal(b, &v); err != nil {\n\t\treturn \"\"\n\t}\n\tif v.ProjectID != \"\" {\n\t\treturn v.ProjectID\n\t}\n\treturn v.Project\n}\n\n// DoRequest executes the provided req with the client. It reads the response\n// body, closes it, and returns it.\nfunc DoRequest(client *http.Client, req *http.Request) (*http.Response, []byte, error) {\n\tresp, err := client.Do(req)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tdefer resp.Body.Close()\n\tbody, err := ReadAll(io.LimitReader(resp.Body, maxBodySize))\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\treturn resp, body, nil\n}\n\n// ReadAll consumes the whole reader and safely reads the content of its body\n// with some overflow protection.\nfunc ReadAll(r io.Reader) ([]byte, error) {\n\treturn io.ReadAll(io.LimitReader(r, maxBodySize))\n}\n\n// StaticCredentialsProperty is a helper for creating static credentials\n// properties.\nfunc StaticCredentialsProperty(s string) StaticProperty {\n\treturn StaticProperty(s)\n}\n\n// StaticProperty always returns that value of the underlying string.\ntype StaticProperty string\n\n// GetProperty loads the properly value provided the given context.\nfunc (p StaticProperty) GetProperty(context.Context) (string, error) {\n\treturn string(p), nil\n}\n\n// ComputeUniverseDomainProvider fetches the credentials universe domain from\n// the google cloud metadata service.\ntype ComputeUniverseDomainProvider struct {\n\tMetadataClient     *metadata.Client\n\tuniverseDomainOnce sync.Once\n\tuniverseDomain     string\n\tuniverseDomainErr  error\n}\n\n// GetProperty fetches the credentials universe domain from the google cloud\n// metadata service.\nfunc (c *ComputeUniverseDomainProvider) GetProperty(ctx context.Context) (string, error) {\n\tc.universeDomainOnce.Do(func() {\n\t\tc.universeDomain, c.universeDomainErr = getMetadataUniverseDomain(ctx, c.MetadataClient)\n\t})\n\tif c.universeDomainErr != nil {\n\t\treturn \"\", c.universeDomainErr\n\t}\n\treturn c.universeDomain, nil\n}\n\n// httpGetMetadataUniverseDomain is a package var for unit test substitution.\nvar httpGetMetadataUniverseDomain = func(ctx context.Context, client *metadata.Client) (string, error) {\n\tctx, cancel := context.WithTimeout(ctx, 1*time.Second)\n\tdefer cancel()\n\treturn client.GetWithContext(ctx, \"universe/universe-domain\")\n}\n\nfunc getMetadataUniverseDomain(ctx context.Context, client *metadata.Client) (string, error) {\n\tuniverseDomain, err := httpGetMetadataUniverseDomain(ctx, client)\n\tif err == nil {\n\t\treturn universeDomain, nil\n\t}\n\tif _, ok := err.(metadata.NotDefinedError); ok {\n\t\t// http.StatusNotFound (404)\n\t\treturn DefaultUniverseDomain, nil\n\t}\n\treturn \"\", err\n}\n\n// FormatIAMServiceAccountResource sets a service account name in an IAM resource\n// name.\nfunc FormatIAMServiceAccountResource(name string) string {\n\treturn fmt.Sprintf(\"projects/-/serviceAccounts/%s\", name)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/internal/jwt/jwt.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage jwt\n\nimport (\n\t\"bytes\"\n\t\"crypto\"\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"crypto/sha256\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n)\n\nconst (\n\t// HeaderAlgRSA256 is the RS256 [Header.Algorithm].\n\tHeaderAlgRSA256 = \"RS256\"\n\t// HeaderAlgES256 is the ES256 [Header.Algorithm].\n\tHeaderAlgES256 = \"ES256\"\n\t// HeaderType is the standard [Header.Type].\n\tHeaderType = \"JWT\"\n)\n\n// Header represents a JWT header.\ntype Header struct {\n\tAlgorithm string `json:\"alg\"`\n\tType      string `json:\"typ\"`\n\tKeyID     string `json:\"kid\"`\n}\n\nfunc (h *Header) encode() (string, error) {\n\tb, err := json.Marshal(h)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn base64.RawURLEncoding.EncodeToString(b), nil\n}\n\n// Claims represents the claims set of a JWT.\ntype Claims struct {\n\t// Iss is the issuer JWT claim.\n\tIss string `json:\"iss\"`\n\t// Scope is the scope JWT claim.\n\tScope string `json:\"scope,omitempty\"`\n\t// Exp is the expiry JWT claim. If unset, default is in one hour from now.\n\tExp int64 `json:\"exp\"`\n\t// Iat is the subject issued at claim. If unset, default is now.\n\tIat int64 `json:\"iat\"`\n\t// Aud is the audience JWT claim. Optional.\n\tAud string `json:\"aud\"`\n\t// Sub is the subject JWT claim. Optional.\n\tSub string `json:\"sub,omitempty\"`\n\t// AdditionalClaims contains any additional non-standard JWT claims. Optional.\n\tAdditionalClaims map[string]interface{} `json:\"-\"`\n}\n\nfunc (c *Claims) encode() (string, error) {\n\t// Compensate for skew\n\tnow := time.Now().Add(-10 * time.Second)\n\tif c.Iat == 0 {\n\t\tc.Iat = now.Unix()\n\t}\n\tif c.Exp == 0 {\n\t\tc.Exp = now.Add(time.Hour).Unix()\n\t}\n\tif c.Exp < c.Iat {\n\t\treturn \"\", fmt.Errorf(\"jwt: invalid Exp = %d; must be later than Iat = %d\", c.Exp, c.Iat)\n\t}\n\n\tb, err := json.Marshal(c)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tif len(c.AdditionalClaims) == 0 {\n\t\treturn base64.RawURLEncoding.EncodeToString(b), nil\n\t}\n\n\t// Marshal private claim set and then append it to b.\n\tprv, err := json.Marshal(c.AdditionalClaims)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"invalid map of additional claims %v: %w\", c.AdditionalClaims, err)\n\t}\n\n\t// Concatenate public and private claim JSON objects.\n\tif !bytes.HasSuffix(b, []byte{'}'}) {\n\t\treturn \"\", fmt.Errorf(\"invalid JSON %s\", b)\n\t}\n\tif !bytes.HasPrefix(prv, []byte{'{'}) {\n\t\treturn \"\", fmt.Errorf(\"invalid JSON %s\", prv)\n\t}\n\tb[len(b)-1] = ','         // Replace closing curly brace with a comma.\n\tb = append(b, prv[1:]...) // Append private claims.\n\treturn base64.RawURLEncoding.EncodeToString(b), nil\n}\n\n// EncodeJWS encodes the data using the provided key as a JSON web signature.\nfunc EncodeJWS(header *Header, c *Claims, signer crypto.Signer) (string, error) {\n\thead, err := header.encode()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tclaims, err := c.encode()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tss := fmt.Sprintf(\"%s.%s\", head, claims)\n\th := sha256.New()\n\th.Write([]byte(ss))\n\tsig, err := signer.Sign(rand.Reader, h.Sum(nil), crypto.SHA256)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn fmt.Sprintf(\"%s.%s\", ss, base64.RawURLEncoding.EncodeToString(sig)), nil\n}\n\n// DecodeJWS decodes a claim set from a JWS payload.\nfunc DecodeJWS(payload string) (*Claims, error) {\n\t// decode returned id token to get expiry\n\ts := strings.Split(payload, \".\")\n\tif len(s) < 2 {\n\t\treturn nil, errors.New(\"invalid token received\")\n\t}\n\tdecoded, err := base64.RawURLEncoding.DecodeString(s[1])\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tc := &Claims{}\n\tif err := json.NewDecoder(bytes.NewBuffer(decoded)).Decode(c); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := json.NewDecoder(bytes.NewBuffer(decoded)).Decode(&c.AdditionalClaims); err != nil {\n\t\treturn nil, err\n\t}\n\treturn c, err\n}\n\n// VerifyJWS tests whether the provided JWT token's signature was produced by\n// the private key associated with the provided public key.\nfunc VerifyJWS(token string, key *rsa.PublicKey) error {\n\tparts := strings.Split(token, \".\")\n\tif len(parts) != 3 {\n\t\treturn errors.New(\"jwt: invalid token received, token must have 3 parts\")\n\t}\n\n\tsignedContent := parts[0] + \".\" + parts[1]\n\tsignatureString, err := base64.RawURLEncoding.DecodeString(parts[2])\n\tif err != nil {\n\t\treturn err\n\t}\n\n\th := sha256.New()\n\th.Write([]byte(signedContent))\n\treturn rsa.VerifyPKCS1v15(key, crypto.SHA256, h.Sum(nil), signatureString)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/internal/transport/cba.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage transport\n\nimport (\n\t\"context\"\n\t\"crypto/tls\"\n\t\"crypto/x509\"\n\t\"errors\"\n\t\"log\"\n\t\"log/slog\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"cloud.google.com/go/auth/internal\"\n\t\"cloud.google.com/go/auth/internal/transport/cert\"\n\t\"github.com/google/s2a-go\"\n\t\"github.com/google/s2a-go/fallback\"\n\t\"google.golang.org/grpc/credentials\"\n)\n\nconst (\n\tmTLSModeAlways = \"always\"\n\tmTLSModeNever  = \"never\"\n\tmTLSModeAuto   = \"auto\"\n\n\t// Experimental: if true, the code will try MTLS with S2A as the default for transport security. Default value is false.\n\tgoogleAPIUseS2AEnv     = \"EXPERIMENTAL_GOOGLE_API_USE_S2A\"\n\tgoogleAPIUseCertSource = \"GOOGLE_API_USE_CLIENT_CERTIFICATE\"\n\tgoogleAPIUseMTLS       = \"GOOGLE_API_USE_MTLS_ENDPOINT\"\n\tgoogleAPIUseMTLSOld    = \"GOOGLE_API_USE_MTLS\"\n\n\tuniverseDomainPlaceholder = \"UNIVERSE_DOMAIN\"\n\n\tmtlsMDSRoot = \"/run/google-mds-mtls/root.crt\"\n\tmtlsMDSKey  = \"/run/google-mds-mtls/client.key\"\n)\n\n// Type represents the type of transport used.\ntype Type int\n\nconst (\n\t// TransportTypeUnknown represents an unknown transport type and is the default option.\n\tTransportTypeUnknown Type = iota\n\t// TransportTypeMTLSS2A represents the mTLS transport type using S2A.\n\tTransportTypeMTLSS2A\n)\n\n// Options is a struct that is duplicated information from the individual\n// transport packages in order to avoid cyclic deps. It correlates 1:1 with\n// fields on httptransport.Options and grpctransport.Options.\ntype Options struct {\n\tEndpoint                string\n\tDefaultEndpointTemplate string\n\tDefaultMTLSEndpoint     string\n\tClientCertProvider      cert.Provider\n\tClient                  *http.Client\n\tUniverseDomain          string\n\tEnableDirectPath        bool\n\tEnableDirectPathXds     bool\n\tLogger                  *slog.Logger\n}\n\n// getUniverseDomain returns the default service domain for a given Cloud\n// universe.\nfunc (o *Options) getUniverseDomain() string {\n\tif o.UniverseDomain == \"\" {\n\t\treturn internal.DefaultUniverseDomain\n\t}\n\treturn o.UniverseDomain\n}\n\n// isUniverseDomainGDU returns true if the universe domain is the default Google\n// universe.\nfunc (o *Options) isUniverseDomainGDU() bool {\n\treturn o.getUniverseDomain() == internal.DefaultUniverseDomain\n}\n\n// defaultEndpoint returns the DefaultEndpointTemplate merged with the\n// universe domain if the DefaultEndpointTemplate is set, otherwise returns an\n// empty string.\nfunc (o *Options) defaultEndpoint() string {\n\tif o.DefaultEndpointTemplate == \"\" {\n\t\treturn \"\"\n\t}\n\treturn strings.Replace(o.DefaultEndpointTemplate, universeDomainPlaceholder, o.getUniverseDomain(), 1)\n}\n\n// defaultMTLSEndpoint returns the DefaultMTLSEndpointTemplate merged with the\n// universe domain if the DefaultMTLSEndpointTemplate is set, otherwise returns an\n// empty string.\nfunc (o *Options) defaultMTLSEndpoint() string {\n\tif o.DefaultMTLSEndpoint == \"\" {\n\t\treturn \"\"\n\t}\n\treturn strings.Replace(o.DefaultMTLSEndpoint, universeDomainPlaceholder, o.getUniverseDomain(), 1)\n}\n\n// mergedEndpoint merges a user-provided Endpoint of format host[:port] with the\n// default endpoint.\nfunc (o *Options) mergedEndpoint() (string, error) {\n\tdefaultEndpoint := o.defaultEndpoint()\n\tu, err := url.Parse(fixScheme(defaultEndpoint))\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn strings.Replace(defaultEndpoint, u.Host, o.Endpoint, 1), nil\n}\n\nfunc fixScheme(baseURL string) string {\n\tif !strings.Contains(baseURL, \"://\") {\n\t\tbaseURL = \"https://\" + baseURL\n\t}\n\treturn baseURL\n}\n\n// GRPCTransportCredentials embeds interface TransportCredentials with additional data.\ntype GRPCTransportCredentials struct {\n\tcredentials.TransportCredentials\n\tEndpoint      string\n\tTransportType Type\n}\n\n// GetGRPCTransportCredsAndEndpoint returns an instance of\n// [google.golang.org/grpc/credentials.TransportCredentials], and the\n// corresponding endpoint and transport type to use for GRPC client.\nfunc GetGRPCTransportCredsAndEndpoint(opts *Options) (*GRPCTransportCredentials, error) {\n\tconfig, err := getTransportConfig(opts)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tdefaultTransportCreds := credentials.NewTLS(&tls.Config{\n\t\tGetClientCertificate: config.clientCertSource,\n\t})\n\n\tvar s2aAddr string\n\tvar transportCredsForS2A credentials.TransportCredentials\n\n\tif config.mtlsS2AAddress != \"\" {\n\t\ts2aAddr = config.mtlsS2AAddress\n\t\ttransportCredsForS2A, err = loadMTLSMDSTransportCreds(mtlsMDSRoot, mtlsMDSKey)\n\t\tif err != nil {\n\t\t\tlog.Printf(\"Loading MTLS MDS credentials failed: %v\", err)\n\t\t\tif config.s2aAddress != \"\" {\n\t\t\t\ts2aAddr = config.s2aAddress\n\t\t\t} else {\n\t\t\t\treturn &GRPCTransportCredentials{defaultTransportCreds, config.endpoint, TransportTypeUnknown}, nil\n\t\t\t}\n\t\t}\n\t} else if config.s2aAddress != \"\" {\n\t\ts2aAddr = config.s2aAddress\n\t} else {\n\t\treturn &GRPCTransportCredentials{defaultTransportCreds, config.endpoint, TransportTypeUnknown}, nil\n\t}\n\n\tvar fallbackOpts *s2a.FallbackOptions\n\t// In case of S2A failure, fall back to the endpoint that would've been used without S2A.\n\tif fallbackHandshake, err := fallback.DefaultFallbackClientHandshakeFunc(config.endpoint); err == nil {\n\t\tfallbackOpts = &s2a.FallbackOptions{\n\t\t\tFallbackClientHandshakeFunc: fallbackHandshake,\n\t\t}\n\t}\n\n\ts2aTransportCreds, err := s2a.NewClientCreds(&s2a.ClientOptions{\n\t\tS2AAddress:     s2aAddr,\n\t\tTransportCreds: transportCredsForS2A,\n\t\tFallbackOpts:   fallbackOpts,\n\t})\n\tif err != nil {\n\t\t// Use default if we cannot initialize S2A client transport credentials.\n\t\treturn &GRPCTransportCredentials{defaultTransportCreds, config.endpoint, TransportTypeUnknown}, nil\n\t}\n\treturn &GRPCTransportCredentials{s2aTransportCreds, config.s2aMTLSEndpoint, TransportTypeMTLSS2A}, nil\n}\n\n// GetHTTPTransportConfig returns a client certificate source and a function for\n// dialing MTLS with S2A.\nfunc GetHTTPTransportConfig(opts *Options) (cert.Provider, func(context.Context, string, string) (net.Conn, error), error) {\n\tconfig, err := getTransportConfig(opts)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tvar s2aAddr string\n\tvar transportCredsForS2A credentials.TransportCredentials\n\n\tif config.mtlsS2AAddress != \"\" {\n\t\ts2aAddr = config.mtlsS2AAddress\n\t\ttransportCredsForS2A, err = loadMTLSMDSTransportCreds(mtlsMDSRoot, mtlsMDSKey)\n\t\tif err != nil {\n\t\t\tlog.Printf(\"Loading MTLS MDS credentials failed: %v\", err)\n\t\t\tif config.s2aAddress != \"\" {\n\t\t\t\ts2aAddr = config.s2aAddress\n\t\t\t} else {\n\t\t\t\treturn config.clientCertSource, nil, nil\n\t\t\t}\n\t\t}\n\t} else if config.s2aAddress != \"\" {\n\t\ts2aAddr = config.s2aAddress\n\t} else {\n\t\treturn config.clientCertSource, nil, nil\n\t}\n\n\tvar fallbackOpts *s2a.FallbackOptions\n\t// In case of S2A failure, fall back to the endpoint that would've been used without S2A.\n\tif fallbackURL, err := url.Parse(config.endpoint); err == nil {\n\t\tif fallbackDialer, fallbackServerAddr, err := fallback.DefaultFallbackDialerAndAddress(fallbackURL.Hostname()); err == nil {\n\t\t\tfallbackOpts = &s2a.FallbackOptions{\n\t\t\t\tFallbackDialer: &s2a.FallbackDialer{\n\t\t\t\t\tDialer:     fallbackDialer,\n\t\t\t\t\tServerAddr: fallbackServerAddr,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t}\n\n\tdialTLSContextFunc := s2a.NewS2ADialTLSContextFunc(&s2a.ClientOptions{\n\t\tS2AAddress:     s2aAddr,\n\t\tTransportCreds: transportCredsForS2A,\n\t\tFallbackOpts:   fallbackOpts,\n\t})\n\treturn nil, dialTLSContextFunc, nil\n}\n\nfunc loadMTLSMDSTransportCreds(mtlsMDSRootFile, mtlsMDSKeyFile string) (credentials.TransportCredentials, error) {\n\trootPEM, err := os.ReadFile(mtlsMDSRootFile)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcaCertPool := x509.NewCertPool()\n\tok := caCertPool.AppendCertsFromPEM(rootPEM)\n\tif !ok {\n\t\treturn nil, errors.New(\"failed to load MTLS MDS root certificate\")\n\t}\n\t// The mTLS MDS credentials are formatted as the concatenation of a PEM-encoded certificate chain\n\t// followed by a PEM-encoded private key. For this reason, the concatenation is passed in to the\n\t// tls.X509KeyPair function as both the certificate chain and private key arguments.\n\tcert, err := tls.LoadX509KeyPair(mtlsMDSKeyFile, mtlsMDSKeyFile)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ttlsConfig := tls.Config{\n\t\tRootCAs:      caCertPool,\n\t\tCertificates: []tls.Certificate{cert},\n\t\tMinVersion:   tls.VersionTLS13,\n\t}\n\treturn credentials.NewTLS(&tlsConfig), nil\n}\n\nfunc getTransportConfig(opts *Options) (*transportConfig, error) {\n\tclientCertSource, err := GetClientCertificateProvider(opts)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tendpoint, err := getEndpoint(opts, clientCertSource)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefaultTransportConfig := transportConfig{\n\t\tclientCertSource: clientCertSource,\n\t\tendpoint:         endpoint,\n\t}\n\n\tif !shouldUseS2A(clientCertSource, opts) {\n\t\treturn &defaultTransportConfig, nil\n\t}\n\n\ts2aAddress := GetS2AAddress(opts.Logger)\n\tmtlsS2AAddress := GetMTLSS2AAddress(opts.Logger)\n\tif s2aAddress == \"\" && mtlsS2AAddress == \"\" {\n\t\treturn &defaultTransportConfig, nil\n\t}\n\treturn &transportConfig{\n\t\tclientCertSource: clientCertSource,\n\t\tendpoint:         endpoint,\n\t\ts2aAddress:       s2aAddress,\n\t\tmtlsS2AAddress:   mtlsS2AAddress,\n\t\ts2aMTLSEndpoint:  opts.defaultMTLSEndpoint(),\n\t}, nil\n}\n\n// GetClientCertificateProvider returns a default client certificate source, if\n// not provided by the user.\n//\n// A nil default source can be returned if the source does not exist. Any exceptions\n// encountered while initializing the default source will be reported as client\n// error (ex. corrupt metadata file).\nfunc GetClientCertificateProvider(opts *Options) (cert.Provider, error) {\n\tif !isClientCertificateEnabled(opts) {\n\t\treturn nil, nil\n\t} else if opts.ClientCertProvider != nil {\n\t\treturn opts.ClientCertProvider, nil\n\t}\n\treturn cert.DefaultProvider()\n\n}\n\n// isClientCertificateEnabled returns true by default for all GDU universe domain, unless explicitly overridden by env var\nfunc isClientCertificateEnabled(opts *Options) bool {\n\tif value, ok := os.LookupEnv(googleAPIUseCertSource); ok {\n\t\t// error as false is OK\n\t\tb, _ := strconv.ParseBool(value)\n\t\treturn b\n\t}\n\treturn opts.isUniverseDomainGDU()\n}\n\ntype transportConfig struct {\n\t// The client certificate source.\n\tclientCertSource cert.Provider\n\t// The corresponding endpoint to use based on client certificate source.\n\tendpoint string\n\t// The plaintext S2A address if it can be used, otherwise an empty string.\n\ts2aAddress string\n\t// The MTLS S2A address if it can be used, otherwise an empty string.\n\tmtlsS2AAddress string\n\t// The MTLS endpoint to use with S2A.\n\ts2aMTLSEndpoint string\n}\n\n// getEndpoint returns the endpoint for the service, taking into account the\n// user-provided endpoint override \"settings.Endpoint\".\n//\n// If no endpoint override is specified, we will either return the default\n// endpoint or the default mTLS endpoint if a client certificate is available.\n//\n// You can override the default endpoint choice (mTLS vs. regular) by setting\n// the GOOGLE_API_USE_MTLS_ENDPOINT environment variable.\n//\n// If the endpoint override is an address (host:port) rather than full base\n// URL (ex. https://...), then the user-provided address will be merged into\n// the default endpoint. For example, WithEndpoint(\"myhost:8000\") and\n// DefaultEndpointTemplate(\"https://UNIVERSE_DOMAIN/bar/baz\") will return\n// \"https://myhost:8080/bar/baz\". Note that this does not apply to the mTLS\n// endpoint.\nfunc getEndpoint(opts *Options, clientCertSource cert.Provider) (string, error) {\n\tif opts.Endpoint == \"\" {\n\t\tmtlsMode := getMTLSMode()\n\t\tif mtlsMode == mTLSModeAlways || (clientCertSource != nil && mtlsMode == mTLSModeAuto) {\n\t\t\treturn opts.defaultMTLSEndpoint(), nil\n\t\t}\n\t\treturn opts.defaultEndpoint(), nil\n\t}\n\tif strings.Contains(opts.Endpoint, \"://\") {\n\t\t// User passed in a full URL path, use it verbatim.\n\t\treturn opts.Endpoint, nil\n\t}\n\tif opts.defaultEndpoint() == \"\" {\n\t\t// If DefaultEndpointTemplate is not configured,\n\t\t// use the user provided endpoint verbatim. This allows a naked\n\t\t// \"host[:port]\" URL to be used with GRPC Direct Path.\n\t\treturn opts.Endpoint, nil\n\t}\n\n\t// Assume user-provided endpoint is host[:port], merge it with the default endpoint.\n\treturn opts.mergedEndpoint()\n}\n\nfunc getMTLSMode() string {\n\tmode := os.Getenv(googleAPIUseMTLS)\n\tif mode == \"\" {\n\t\tmode = os.Getenv(googleAPIUseMTLSOld) // Deprecated.\n\t}\n\tif mode == \"\" {\n\t\treturn mTLSModeAuto\n\t}\n\treturn strings.ToLower(mode)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/internal/transport/cert/default_cert.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cert\n\nimport (\n\t\"crypto/tls\"\n\t\"errors\"\n\t\"sync\"\n)\n\n// defaultCertData holds all the variables pertaining to\n// the default certificate provider created by [DefaultProvider].\n//\n// A singleton model is used to allow the provider to be reused\n// by the transport layer. As mentioned in [DefaultProvider] (provider nil, nil)\n// may be returned to indicate a default provider could not be found, which\n// will skip extra tls config in the transport layer .\ntype defaultCertData struct {\n\tonce     sync.Once\n\tprovider Provider\n\terr      error\n}\n\nvar (\n\tdefaultCert defaultCertData\n)\n\n// Provider is a function that can be passed into crypto/tls.Config.GetClientCertificate.\ntype Provider func(*tls.CertificateRequestInfo) (*tls.Certificate, error)\n\n// errSourceUnavailable is a sentinel error to indicate certificate source is unavailable.\nvar errSourceUnavailable = errors.New(\"certificate source is unavailable\")\n\n// DefaultProvider returns a certificate source using the preferred EnterpriseCertificateProxySource.\n// If EnterpriseCertificateProxySource is not available, fall back to the legacy SecureConnectSource.\n//\n// If neither source is available (due to missing configurations), a nil Source and a nil Error are\n// returned to indicate that a default certificate source is unavailable.\nfunc DefaultProvider() (Provider, error) {\n\tdefaultCert.once.Do(func() {\n\t\tdefaultCert.provider, defaultCert.err = NewWorkloadX509CertProvider(\"\")\n\t\tif errors.Is(defaultCert.err, errSourceUnavailable) {\n\t\t\tdefaultCert.provider, defaultCert.err = NewEnterpriseCertificateProxyProvider(\"\")\n\t\t\tif errors.Is(defaultCert.err, errSourceUnavailable) {\n\t\t\t\tdefaultCert.provider, defaultCert.err = NewSecureConnectProvider(\"\")\n\t\t\t\tif errors.Is(defaultCert.err, errSourceUnavailable) {\n\t\t\t\t\tdefaultCert.provider, defaultCert.err = nil, nil\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n\treturn defaultCert.provider, defaultCert.err\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/internal/transport/cert/enterprise_cert.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cert\n\nimport (\n\t\"crypto/tls\"\n\n\t\"github.com/googleapis/enterprise-certificate-proxy/client\"\n)\n\ntype ecpSource struct {\n\tkey *client.Key\n}\n\n// NewEnterpriseCertificateProxyProvider creates a certificate source\n// using the Enterprise Certificate Proxy client, which delegates\n// certifcate related operations to an OS-specific \"signer binary\"\n// that communicates with the native keystore (ex. keychain on MacOS).\n//\n// The configFilePath points to a config file containing relevant parameters\n// such as the certificate issuer and the location of the signer binary.\n// If configFilePath is empty, the client will attempt to load the config from\n// a well-known gcloud location.\nfunc NewEnterpriseCertificateProxyProvider(configFilePath string) (Provider, error) {\n\tkey, err := client.Cred(configFilePath)\n\tif err != nil {\n\t\t// TODO(codyoss): once this is fixed upstream can handle this error a\n\t\t// little better here. But be safe for now and assume unavailable.\n\t\treturn nil, errSourceUnavailable\n\t}\n\n\treturn (&ecpSource{\n\t\tkey: key,\n\t}).getClientCertificate, nil\n}\n\nfunc (s *ecpSource) getClientCertificate(info *tls.CertificateRequestInfo) (*tls.Certificate, error) {\n\tvar cert tls.Certificate\n\tcert.PrivateKey = s.key\n\tcert.Certificate = s.key.CertificateChain()\n\treturn &cert, nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/internal/transport/cert/secureconnect_cert.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cert\n\nimport (\n\t\"crypto/tls\"\n\t\"crypto/x509\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"os/user\"\n\t\"path/filepath\"\n\t\"sync\"\n\t\"time\"\n)\n\nconst (\n\tmetadataPath = \".secureConnect\"\n\tmetadataFile = \"context_aware_metadata.json\"\n)\n\ntype secureConnectSource struct {\n\tmetadata secureConnectMetadata\n\n\t// Cache the cert to avoid executing helper command repeatedly.\n\tcachedCertMutex sync.Mutex\n\tcachedCert      *tls.Certificate\n}\n\ntype secureConnectMetadata struct {\n\tCmd []string `json:\"cert_provider_command\"`\n}\n\n// NewSecureConnectProvider creates a certificate source using\n// the Secure Connect Helper and its associated metadata file.\n//\n// The configFilePath points to the location of the context aware metadata file.\n// If configFilePath is empty, use the default context aware metadata location.\nfunc NewSecureConnectProvider(configFilePath string) (Provider, error) {\n\tif configFilePath == \"\" {\n\t\tuser, err := user.Current()\n\t\tif err != nil {\n\t\t\t// Error locating the default config means Secure Connect is not supported.\n\t\t\treturn nil, errSourceUnavailable\n\t\t}\n\t\tconfigFilePath = filepath.Join(user.HomeDir, metadataPath, metadataFile)\n\t}\n\n\tfile, err := os.ReadFile(configFilePath)\n\tif err != nil {\n\t\t// Config file missing means Secure Connect is not supported.\n\t\t// There are non-os.ErrNotExist errors that may be returned.\n\t\t// (e.g. if the home directory is /dev/null, *nix systems will\n\t\t// return ENOTDIR instead of ENOENT)\n\t\treturn nil, errSourceUnavailable\n\t}\n\n\tvar metadata secureConnectMetadata\n\tif err := json.Unmarshal(file, &metadata); err != nil {\n\t\treturn nil, fmt.Errorf(\"cert: could not parse JSON in %q: %w\", configFilePath, err)\n\t}\n\tif err := validateMetadata(metadata); err != nil {\n\t\treturn nil, fmt.Errorf(\"cert: invalid config in %q: %w\", configFilePath, err)\n\t}\n\treturn (&secureConnectSource{\n\t\tmetadata: metadata,\n\t}).getClientCertificate, nil\n}\n\nfunc validateMetadata(metadata secureConnectMetadata) error {\n\tif len(metadata.Cmd) == 0 {\n\t\treturn errors.New(\"empty cert_provider_command\")\n\t}\n\treturn nil\n}\n\nfunc (s *secureConnectSource) getClientCertificate(info *tls.CertificateRequestInfo) (*tls.Certificate, error) {\n\ts.cachedCertMutex.Lock()\n\tdefer s.cachedCertMutex.Unlock()\n\tif s.cachedCert != nil && !isCertificateExpired(s.cachedCert) {\n\t\treturn s.cachedCert, nil\n\t}\n\t// Expand OS environment variables in the cert provider command such as \"$HOME\".\n\tfor i := 0; i < len(s.metadata.Cmd); i++ {\n\t\ts.metadata.Cmd[i] = os.ExpandEnv(s.metadata.Cmd[i])\n\t}\n\tcommand := s.metadata.Cmd\n\tdata, err := exec.Command(command[0], command[1:]...).Output()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcert, err := tls.X509KeyPair(data, data)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ts.cachedCert = &cert\n\treturn &cert, nil\n}\n\n// isCertificateExpired returns true if the given cert is expired or invalid.\nfunc isCertificateExpired(cert *tls.Certificate) bool {\n\tif len(cert.Certificate) == 0 {\n\t\treturn true\n\t}\n\tparsed, err := x509.ParseCertificate(cert.Certificate[0])\n\tif err != nil {\n\t\treturn true\n\t}\n\treturn time.Now().After(parsed.NotAfter)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/internal/transport/cert/workload_cert.go",
    "content": "// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage cert\n\nimport (\n\t\"crypto/tls\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/googleapis/enterprise-certificate-proxy/client/util\"\n)\n\ntype certConfigs struct {\n\tWorkload *workloadSource `json:\"workload\"`\n}\n\ntype workloadSource struct {\n\tCertPath string `json:\"cert_path\"`\n\tKeyPath  string `json:\"key_path\"`\n}\n\ntype certificateConfig struct {\n\tCertConfigs certConfigs `json:\"cert_configs\"`\n}\n\n// getconfigFilePath determines the path to the certificate configuration file.\n// It first checks for the presence of an environment variable that specifies\n// the file path. If the environment variable is not set, it falls back to\n// a default configuration file path.\nfunc getconfigFilePath() string {\n\tenvFilePath := util.GetConfigFilePathFromEnv()\n\tif envFilePath != \"\" {\n\t\treturn envFilePath\n\t}\n\treturn util.GetDefaultConfigFilePath()\n\n}\n\n// GetCertificatePath retrieves the certificate file path from the provided\n// configuration file. If the configFilePath is empty, it attempts to load\n// the configuration from a well-known gcloud location.\n// This function is exposed to allow other packages, such as the\n// externalaccount package, to retrieve the certificate path without needing\n// to load the entire certificate configuration.\nfunc GetCertificatePath(configFilePath string) (string, error) {\n\tif configFilePath == \"\" {\n\t\tconfigFilePath = getconfigFilePath()\n\t}\n\tcertFile, _, err := getCertAndKeyFiles(configFilePath)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn certFile, nil\n}\n\n// NewWorkloadX509CertProvider creates a certificate source\n// that reads a certificate and private key file from the local file system.\n// This is intended to be used for workload identity federation.\n//\n// The configFilePath points to a config file containing relevant parameters\n// such as the certificate and key file paths.\n// If configFilePath is empty, the client will attempt to load the config from\n// a well-known gcloud location.\nfunc NewWorkloadX509CertProvider(configFilePath string) (Provider, error) {\n\tif configFilePath == \"\" {\n\t\tconfigFilePath = getconfigFilePath()\n\t}\n\tcertFile, keyFile, err := getCertAndKeyFiles(configFilePath)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tsource := &workloadSource{\n\t\tCertPath: certFile,\n\t\tKeyPath:  keyFile,\n\t}\n\treturn source.getClientCertificate, nil\n}\n\n// getClientCertificate attempts to load the certificate and key from the files specified in the\n// certificate config.\nfunc (s *workloadSource) getClientCertificate(info *tls.CertificateRequestInfo) (*tls.Certificate, error) {\n\tcert, err := tls.LoadX509KeyPair(s.CertPath, s.KeyPath)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &cert, nil\n}\n\n// getCertAndKeyFiles attempts to read the provided config file and return the certificate and private\n// key file paths.\nfunc getCertAndKeyFiles(configFilePath string) (string, string, error) {\n\tjsonFile, err := os.Open(configFilePath)\n\tif err != nil {\n\t\treturn \"\", \"\", errSourceUnavailable\n\t}\n\n\tbyteValue, err := io.ReadAll(jsonFile)\n\tif err != nil {\n\t\treturn \"\", \"\", err\n\t}\n\n\tvar config certificateConfig\n\tif err := json.Unmarshal(byteValue, &config); err != nil {\n\t\treturn \"\", \"\", err\n\t}\n\n\tif config.CertConfigs.Workload == nil {\n\t\treturn \"\", \"\", errSourceUnavailable\n\t}\n\n\tcertFile := config.CertConfigs.Workload.CertPath\n\tkeyFile := config.CertConfigs.Workload.KeyPath\n\n\tif certFile == \"\" {\n\t\treturn \"\", \"\", errors.New(\"certificate configuration is missing the certificate file location\")\n\t}\n\n\tif keyFile == \"\" {\n\t\treturn \"\", \"\", errors.New(\"certificate configuration is missing the key file location\")\n\t}\n\n\treturn certFile, keyFile, nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/internal/transport/s2a.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage transport\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"log\"\n\t\"log/slog\"\n\t\"os\"\n\t\"strconv\"\n\t\"sync\"\n\n\t\"cloud.google.com/go/auth/internal/transport/cert\"\n\t\"cloud.google.com/go/compute/metadata\"\n)\n\nconst (\n\tconfigEndpointSuffix = \"instance/platform-security/auto-mtls-configuration\"\n)\n\nvar (\n\tmtlsConfiguration *mtlsConfig\n\n\tmtlsOnce sync.Once\n)\n\n// GetS2AAddress returns the S2A address to be reached via plaintext connection.\n// Returns empty string if not set or invalid.\nfunc GetS2AAddress(logger *slog.Logger) string {\n\tgetMetadataMTLSAutoConfig(logger)\n\tif !mtlsConfiguration.valid() {\n\t\treturn \"\"\n\t}\n\treturn mtlsConfiguration.S2A.PlaintextAddress\n}\n\n// GetMTLSS2AAddress returns the S2A address to be reached via MTLS connection.\n// Returns empty string if not set or invalid.\nfunc GetMTLSS2AAddress(logger *slog.Logger) string {\n\tgetMetadataMTLSAutoConfig(logger)\n\tif !mtlsConfiguration.valid() {\n\t\treturn \"\"\n\t}\n\treturn mtlsConfiguration.S2A.MTLSAddress\n}\n\n// mtlsConfig contains the configuration for establishing MTLS connections with Google APIs.\ntype mtlsConfig struct {\n\tS2A *s2aAddresses `json:\"s2a\"`\n}\n\nfunc (c *mtlsConfig) valid() bool {\n\treturn c != nil && c.S2A != nil\n}\n\n// s2aAddresses contains the plaintext and/or MTLS S2A addresses.\ntype s2aAddresses struct {\n\t// PlaintextAddress is the plaintext address to reach S2A\n\tPlaintextAddress string `json:\"plaintext_address\"`\n\t// MTLSAddress is the MTLS address to reach S2A\n\tMTLSAddress string `json:\"mtls_address\"`\n}\n\nfunc getMetadataMTLSAutoConfig(logger *slog.Logger) {\n\tvar err error\n\tmtlsOnce.Do(func() {\n\t\tmtlsConfiguration, err = queryConfig(logger)\n\t\tif err != nil {\n\t\t\tlog.Printf(\"Getting MTLS config failed: %v\", err)\n\t\t}\n\t})\n}\n\nvar httpGetMetadataMTLSConfig = func(logger *slog.Logger) (string, error) {\n\tmetadataClient := metadata.NewWithOptions(&metadata.Options{\n\t\tLogger: logger,\n\t})\n\treturn metadataClient.GetWithContext(context.Background(), configEndpointSuffix)\n}\n\nfunc queryConfig(logger *slog.Logger) (*mtlsConfig, error) {\n\tresp, err := httpGetMetadataMTLSConfig(logger)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"querying MTLS config from MDS endpoint failed: %w\", err)\n\t}\n\tvar config mtlsConfig\n\terr = json.Unmarshal([]byte(resp), &config)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"unmarshalling MTLS config from MDS endpoint failed: %w\", err)\n\t}\n\tif config.S2A == nil {\n\t\treturn nil, fmt.Errorf(\"returned MTLS config from MDS endpoint is invalid: %v\", config)\n\t}\n\treturn &config, nil\n}\n\nfunc shouldUseS2A(clientCertSource cert.Provider, opts *Options) bool {\n\t// If client cert is found, use that over S2A.\n\tif clientCertSource != nil {\n\t\treturn false\n\t}\n\t// If EXPERIMENTAL_GOOGLE_API_USE_S2A is not set to true, skip S2A.\n\tif !isGoogleS2AEnabled() {\n\t\treturn false\n\t}\n\t// If DefaultMTLSEndpoint is not set or has endpoint override, skip S2A.\n\tif opts.DefaultMTLSEndpoint == \"\" || opts.Endpoint != \"\" {\n\t\treturn false\n\t}\n\t// If custom HTTP client is provided, skip S2A.\n\tif opts.Client != nil {\n\t\treturn false\n\t}\n\t// If directPath is enabled, skip S2A.\n\treturn !opts.EnableDirectPath && !opts.EnableDirectPathXds\n}\n\nfunc isGoogleS2AEnabled() bool {\n\tb, err := strconv.ParseBool(os.Getenv(googleAPIUseS2AEnv))\n\tif err != nil {\n\t\treturn false\n\t}\n\treturn b\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/internal/transport/transport.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package transport provided internal helpers for the two transport packages\n// (grpctransport and httptransport).\npackage transport\n\nimport (\n\t\"crypto/tls\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"cloud.google.com/go/auth/credentials\"\n)\n\n// CloneDetectOptions clones a user set detect option into some new memory that\n// we can internally manipulate before sending onto the detect package.\nfunc CloneDetectOptions(oldDo *credentials.DetectOptions) *credentials.DetectOptions {\n\tif oldDo == nil {\n\t\t// it is valid for users not to set this, but we will need to to default\n\t\t// some options for them in this case so return some initialized memory\n\t\t// to work with.\n\t\treturn &credentials.DetectOptions{}\n\t}\n\tnewDo := &credentials.DetectOptions{\n\t\t// Simple types\n\t\tTokenBindingType:  oldDo.TokenBindingType,\n\t\tAudience:          oldDo.Audience,\n\t\tSubject:           oldDo.Subject,\n\t\tEarlyTokenRefresh: oldDo.EarlyTokenRefresh,\n\t\tTokenURL:          oldDo.TokenURL,\n\t\tSTSAudience:       oldDo.STSAudience,\n\t\tCredentialsFile:   oldDo.CredentialsFile,\n\t\tUseSelfSignedJWT:  oldDo.UseSelfSignedJWT,\n\t\tUniverseDomain:    oldDo.UniverseDomain,\n\n\t\t// These fields are pointer types that we just want to use exactly as\n\t\t// the user set, copy the ref\n\t\tClient:             oldDo.Client,\n\t\tLogger:             oldDo.Logger,\n\t\tAuthHandlerOptions: oldDo.AuthHandlerOptions,\n\t}\n\n\t// Smartly size this memory and copy below.\n\tif len(oldDo.CredentialsJSON) > 0 {\n\t\tnewDo.CredentialsJSON = make([]byte, len(oldDo.CredentialsJSON))\n\t\tcopy(newDo.CredentialsJSON, oldDo.CredentialsJSON)\n\t}\n\tif len(oldDo.Scopes) > 0 {\n\t\tnewDo.Scopes = make([]string, len(oldDo.Scopes))\n\t\tcopy(newDo.Scopes, oldDo.Scopes)\n\t}\n\n\treturn newDo\n}\n\n// ValidateUniverseDomain verifies that the universe domain configured for the\n// client matches the universe domain configured for the credentials.\nfunc ValidateUniverseDomain(clientUniverseDomain, credentialsUniverseDomain string) error {\n\tif clientUniverseDomain != credentialsUniverseDomain {\n\t\treturn fmt.Errorf(\n\t\t\t\"the configured universe domain (%q) does not match the universe \"+\n\t\t\t\t\"domain found in the credentials (%q). If you haven't configured \"+\n\t\t\t\t\"the universe domain explicitly, \\\"googleapis.com\\\" is the default\",\n\t\t\tclientUniverseDomain,\n\t\t\tcredentialsUniverseDomain)\n\t}\n\treturn nil\n}\n\n// DefaultHTTPClientWithTLS constructs an HTTPClient using the provided tlsConfig, to support mTLS.\nfunc DefaultHTTPClientWithTLS(tlsConfig *tls.Config) *http.Client {\n\ttrans := BaseTransport()\n\ttrans.TLSClientConfig = tlsConfig\n\treturn &http.Client{Transport: trans}\n}\n\n// BaseTransport returns a default [http.Transport] which can be used if\n// [http.DefaultTransport] has been overwritten.\nfunc BaseTransport() *http.Transport {\n\treturn &http.Transport{\n\t\tProxy: http.ProxyFromEnvironment,\n\t\tDialContext: (&net.Dialer{\n\t\t\tTimeout:   30 * time.Second,\n\t\t\tKeepAlive: 30 * time.Second,\n\t\t\tDualStack: true,\n\t\t}).DialContext,\n\t\tMaxIdleConns:          100,\n\t\tMaxIdleConnsPerHost:   100,\n\t\tIdleConnTimeout:       90 * time.Second,\n\t\tTLSHandshakeTimeout:   10 * time.Second,\n\t\tExpectContinueTimeout: 1 * time.Second,\n\t}\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/oauth2adapt/CHANGES.md",
    "content": "# Changelog\n\n## [0.2.8](https://github.com/googleapis/google-cloud-go/compare/auth/oauth2adapt/v0.2.7...auth/oauth2adapt/v0.2.8) (2025-03-17)\n\n\n### Bug Fixes\n\n* **auth/oauth2adapt:** Update golang.org/x/net to 0.37.0 ([1144978](https://github.com/googleapis/google-cloud-go/commit/11449782c7fb4896bf8b8b9cde8e7441c84fb2fd))\n\n## [0.2.7](https://github.com/googleapis/google-cloud-go/compare/auth/oauth2adapt/v0.2.6...auth/oauth2adapt/v0.2.7) (2025-01-09)\n\n\n### Bug Fixes\n\n* **auth/oauth2adapt:** Update golang.org/x/net to v0.33.0 ([e9b0b69](https://github.com/googleapis/google-cloud-go/commit/e9b0b69644ea5b276cacff0a707e8a5e87efafc9))\n\n## [0.2.6](https://github.com/googleapis/google-cloud-go/compare/auth/oauth2adapt/v0.2.5...auth/oauth2adapt/v0.2.6) (2024-11-21)\n\n\n### Bug Fixes\n\n* **auth/oauth2adapt:** Copy map in tokenSourceAdapter.Token ([#11164](https://github.com/googleapis/google-cloud-go/issues/11164)) ([8cb0cbc](https://github.com/googleapis/google-cloud-go/commit/8cb0cbccdc32886dfb3af49fee04012937d114d2)), refs [#11161](https://github.com/googleapis/google-cloud-go/issues/11161)\n\n## [0.2.5](https://github.com/googleapis/google-cloud-go/compare/auth/oauth2adapt/v0.2.4...auth/oauth2adapt/v0.2.5) (2024-10-30)\n\n\n### Bug Fixes\n\n* **auth/oauth2adapt:** Convert token metadata where possible ([#11062](https://github.com/googleapis/google-cloud-go/issues/11062)) ([34bf1c1](https://github.com/googleapis/google-cloud-go/commit/34bf1c164465d66745c0cfdf7cd10a8e2da92e52))\n\n## [0.2.4](https://github.com/googleapis/google-cloud-go/compare/auth/oauth2adapt/v0.2.3...auth/oauth2adapt/v0.2.4) (2024-08-08)\n\n\n### Bug Fixes\n\n* **auth/oauth2adapt:** Update dependencies ([257c40b](https://github.com/googleapis/google-cloud-go/commit/257c40bd6d7e59730017cf32bda8823d7a232758))\n\n## [0.2.3](https://github.com/googleapis/google-cloud-go/compare/auth/oauth2adapt/v0.2.2...auth/oauth2adapt/v0.2.3) (2024-07-10)\n\n\n### Bug Fixes\n\n* **auth/oauth2adapt:** Bump google.golang.org/api@v0.187.0 ([8fa9e39](https://github.com/googleapis/google-cloud-go/commit/8fa9e398e512fd8533fd49060371e61b5725a85b))\n\n## [0.2.2](https://github.com/googleapis/google-cloud-go/compare/auth/oauth2adapt/v0.2.1...auth/oauth2adapt/v0.2.2) (2024-04-23)\n\n\n### Bug Fixes\n\n* **auth/oauth2adapt:** Bump x/net to v0.24.0 ([ba31ed5](https://github.com/googleapis/google-cloud-go/commit/ba31ed5fda2c9664f2e1cf972469295e63deb5b4))\n\n## [0.2.1](https://github.com/googleapis/google-cloud-go/compare/auth/oauth2adapt/v0.2.0...auth/oauth2adapt/v0.2.1) (2024-04-18)\n\n\n### Bug Fixes\n\n* **auth/oauth2adapt:** Adapt Token Types to be translated ([#9801](https://github.com/googleapis/google-cloud-go/issues/9801)) ([70f4115](https://github.com/googleapis/google-cloud-go/commit/70f411555ebbf2b71e6d425cc8d2030644c6b438)), refs [#9800](https://github.com/googleapis/google-cloud-go/issues/9800)\n\n## [0.2.0](https://github.com/googleapis/google-cloud-go/compare/auth/oauth2adapt/v0.1.0...auth/oauth2adapt/v0.2.0) (2024-04-16)\n\n\n### Features\n\n* **auth/oauth2adapt:** Add helpers for working with credentials types ([#9694](https://github.com/googleapis/google-cloud-go/issues/9694)) ([cf33b55](https://github.com/googleapis/google-cloud-go/commit/cf33b5514423a2ac5c2a323a1cd99aac34fd4233))\n\n\n### Bug Fixes\n\n* **auth/oauth2adapt:** Update protobuf dep to v1.33.0 ([30b038d](https://github.com/googleapis/google-cloud-go/commit/30b038d8cac0b8cd5dd4761c87f3f298760dd33a))\n\n## 0.1.0 (2023-10-19)\n\n\n### Features\n\n* **auth/oauth2adapt:** Adds a new module to translate types ([#8595](https://github.com/googleapis/google-cloud-go/issues/8595)) ([6933c5a](https://github.com/googleapis/google-cloud-go/commit/6933c5a0c1fc8e58cbfff8bbca439d671b94672f))\n* **auth/oauth2adapt:** Fixup deps for release ([#8747](https://github.com/googleapis/google-cloud-go/issues/8747)) ([749d243](https://github.com/googleapis/google-cloud-go/commit/749d243862b025a6487a4d2d339219889b4cfe70))\n\n\n### Bug Fixes\n\n* **auth/oauth2adapt:** Update golang.org/x/net to v0.17.0 ([174da47](https://github.com/googleapis/google-cloud-go/commit/174da47254fefb12921bbfc65b7829a453af6f5d))\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/oauth2adapt/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/oauth2adapt/oauth2adapt.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package oauth2adapt helps converts types used in [cloud.google.com/go/auth]\n// and [golang.org/x/oauth2].\npackage oauth2adapt\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\n\t\"cloud.google.com/go/auth\"\n\t\"golang.org/x/oauth2\"\n\t\"golang.org/x/oauth2/google\"\n)\n\nconst (\n\toauth2TokenSourceKey    = \"oauth2.google.tokenSource\"\n\toauth2ServiceAccountKey = \"oauth2.google.serviceAccount\"\n\tauthTokenSourceKey      = \"auth.google.tokenSource\"\n\tauthServiceAccountKey   = \"auth.google.serviceAccount\"\n)\n\n// TokenProviderFromTokenSource converts any [golang.org/x/oauth2.TokenSource]\n// into a [cloud.google.com/go/auth.TokenProvider].\nfunc TokenProviderFromTokenSource(ts oauth2.TokenSource) auth.TokenProvider {\n\treturn &tokenProviderAdapter{ts: ts}\n}\n\ntype tokenProviderAdapter struct {\n\tts oauth2.TokenSource\n}\n\n// Token fulfills the [cloud.google.com/go/auth.TokenProvider] interface. It\n// is a light wrapper around the underlying TokenSource.\nfunc (tp *tokenProviderAdapter) Token(context.Context) (*auth.Token, error) {\n\ttok, err := tp.ts.Token()\n\tif err != nil {\n\t\tvar err2 *oauth2.RetrieveError\n\t\tif ok := errors.As(err, &err2); ok {\n\t\t\treturn nil, AuthErrorFromRetrieveError(err2)\n\t\t}\n\t\treturn nil, err\n\t}\n\t// Preserve compute token metadata, for both types of tokens.\n\tmetadata := map[string]interface{}{}\n\tif val, ok := tok.Extra(oauth2TokenSourceKey).(string); ok {\n\t\tmetadata[authTokenSourceKey] = val\n\t\tmetadata[oauth2TokenSourceKey] = val\n\t}\n\tif val, ok := tok.Extra(oauth2ServiceAccountKey).(string); ok {\n\t\tmetadata[authServiceAccountKey] = val\n\t\tmetadata[oauth2ServiceAccountKey] = val\n\t}\n\treturn &auth.Token{\n\t\tValue:    tok.AccessToken,\n\t\tType:     tok.Type(),\n\t\tExpiry:   tok.Expiry,\n\t\tMetadata: metadata,\n\t}, nil\n}\n\n// TokenSourceFromTokenProvider converts any\n// [cloud.google.com/go/auth.TokenProvider] into a\n// [golang.org/x/oauth2.TokenSource].\nfunc TokenSourceFromTokenProvider(tp auth.TokenProvider) oauth2.TokenSource {\n\treturn &tokenSourceAdapter{tp: tp}\n}\n\ntype tokenSourceAdapter struct {\n\ttp auth.TokenProvider\n}\n\n// Token fulfills the [golang.org/x/oauth2.TokenSource] interface. It\n// is a light wrapper around the underlying TokenProvider.\nfunc (ts *tokenSourceAdapter) Token() (*oauth2.Token, error) {\n\ttok, err := ts.tp.Token(context.Background())\n\tif err != nil {\n\t\tvar err2 *auth.Error\n\t\tif ok := errors.As(err, &err2); ok {\n\t\t\treturn nil, AddRetrieveErrorToAuthError(err2)\n\t\t}\n\t\treturn nil, err\n\t}\n\ttok2 := &oauth2.Token{\n\t\tAccessToken: tok.Value,\n\t\tTokenType:   tok.Type,\n\t\tExpiry:      tok.Expiry,\n\t}\n\t// Preserve token metadata.\n\tm := tok.Metadata\n\tif m != nil {\n\t\t// Copy map to avoid concurrent map writes error (#11161).\n\t\tmetadata := make(map[string]interface{}, len(m)+2)\n\t\tfor k, v := range m {\n\t\t\tmetadata[k] = v\n\t\t}\n\t\t// Append compute token metadata in converted form.\n\t\tif val, ok := metadata[authTokenSourceKey].(string); ok && val != \"\" {\n\t\t\tmetadata[oauth2TokenSourceKey] = val\n\t\t}\n\t\tif val, ok := metadata[authServiceAccountKey].(string); ok && val != \"\" {\n\t\t\tmetadata[oauth2ServiceAccountKey] = val\n\t\t}\n\t\ttok2 = tok2.WithExtra(metadata)\n\t}\n\treturn tok2, nil\n}\n\n// AuthCredentialsFromOauth2Credentials converts a [golang.org/x/oauth2/google.Credentials]\n// to a [cloud.google.com/go/auth.Credentials].\nfunc AuthCredentialsFromOauth2Credentials(creds *google.Credentials) *auth.Credentials {\n\tif creds == nil {\n\t\treturn nil\n\t}\n\treturn auth.NewCredentials(&auth.CredentialsOptions{\n\t\tTokenProvider: TokenProviderFromTokenSource(creds.TokenSource),\n\t\tJSON:          creds.JSON,\n\t\tProjectIDProvider: auth.CredentialsPropertyFunc(func(ctx context.Context) (string, error) {\n\t\t\treturn creds.ProjectID, nil\n\t\t}),\n\t\tUniverseDomainProvider: auth.CredentialsPropertyFunc(func(ctx context.Context) (string, error) {\n\t\t\treturn creds.GetUniverseDomain()\n\t\t}),\n\t})\n}\n\n// Oauth2CredentialsFromAuthCredentials converts a [cloud.google.com/go/auth.Credentials]\n// to a [golang.org/x/oauth2/google.Credentials].\nfunc Oauth2CredentialsFromAuthCredentials(creds *auth.Credentials) *google.Credentials {\n\tif creds == nil {\n\t\treturn nil\n\t}\n\t// Throw away errors as old credentials are not request aware. Also, no\n\t// network requests are currently happening for this use case.\n\tprojectID, _ := creds.ProjectID(context.Background())\n\n\treturn &google.Credentials{\n\t\tTokenSource: TokenSourceFromTokenProvider(creds.TokenProvider),\n\t\tProjectID:   projectID,\n\t\tJSON:        creds.JSON(),\n\t\tUniverseDomainProvider: func() (string, error) {\n\t\t\treturn creds.UniverseDomain(context.Background())\n\t\t},\n\t}\n}\n\ntype oauth2Error struct {\n\tErrorCode        string `json:\"error\"`\n\tErrorDescription string `json:\"error_description\"`\n\tErrorURI         string `json:\"error_uri\"`\n}\n\n// AddRetrieveErrorToAuthError returns the same error provided and adds a\n// [golang.org/x/oauth2.RetrieveError] to the error chain by setting the `Err` field on the\n// [cloud.google.com/go/auth.Error].\nfunc AddRetrieveErrorToAuthError(err *auth.Error) *auth.Error {\n\tif err == nil {\n\t\treturn nil\n\t}\n\te := &oauth2.RetrieveError{\n\t\tResponse: err.Response,\n\t\tBody:     err.Body,\n\t}\n\terr.Err = e\n\tif len(err.Body) > 0 {\n\t\tvar oErr oauth2Error\n\t\t// ignore the error as it only fills in extra details\n\t\tjson.Unmarshal(err.Body, &oErr)\n\t\te.ErrorCode = oErr.ErrorCode\n\t\te.ErrorDescription = oErr.ErrorDescription\n\t\te.ErrorURI = oErr.ErrorURI\n\t}\n\treturn err\n}\n\n// AuthErrorFromRetrieveError returns an [cloud.google.com/go/auth.Error] that\n// wraps the provided [golang.org/x/oauth2.RetrieveError].\nfunc AuthErrorFromRetrieveError(err *oauth2.RetrieveError) *auth.Error {\n\tif err == nil {\n\t\treturn nil\n\t}\n\treturn &auth.Error{\n\t\tResponse: err.Response,\n\t\tBody:     err.Body,\n\t\tErr:      err,\n\t}\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/auth/threelegged.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage auth\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"mime\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"cloud.google.com/go/auth/internal\"\n\t\"github.com/googleapis/gax-go/v2/internallog\"\n)\n\n// AuthorizationHandler is a 3-legged-OAuth helper that prompts the user for\n// OAuth consent at the specified auth code URL and returns an auth code and\n// state upon approval.\ntype AuthorizationHandler func(authCodeURL string) (code string, state string, err error)\n\n// Options3LO are the options for doing a 3-legged OAuth2 flow.\ntype Options3LO struct {\n\t// ClientID is the application's ID.\n\tClientID string\n\t// ClientSecret is the application's secret. Not required if AuthHandlerOpts\n\t// is set.\n\tClientSecret string\n\t// AuthURL is the URL for authenticating.\n\tAuthURL string\n\t// TokenURL is the URL for retrieving a token.\n\tTokenURL string\n\t// AuthStyle is used to describe how to client info in the token request.\n\tAuthStyle Style\n\t// RefreshToken is the token used to refresh the credential. Not required\n\t// if AuthHandlerOpts is set.\n\tRefreshToken string\n\t// RedirectURL is the URL to redirect users to. Optional.\n\tRedirectURL string\n\t// Scopes specifies requested permissions for the Token. Optional.\n\tScopes []string\n\n\t// URLParams are the set of values to apply to the token exchange. Optional.\n\tURLParams url.Values\n\t// Client is the client to be used to make the underlying token requests.\n\t// Optional.\n\tClient *http.Client\n\t// EarlyTokenExpiry is the time before the token expires that it should be\n\t// refreshed. If not set the default value is 3 minutes and 45 seconds.\n\t// Optional.\n\tEarlyTokenExpiry time.Duration\n\n\t// AuthHandlerOpts provides a set of options for doing a\n\t// 3-legged OAuth2 flow with a custom [AuthorizationHandler]. Optional.\n\tAuthHandlerOpts *AuthorizationHandlerOptions\n\t// Logger is used for debug logging. If provided, logging will be enabled\n\t// at the loggers configured level. By default logging is disabled unless\n\t// enabled by setting GOOGLE_SDK_GO_LOGGING_LEVEL in which case a default\n\t// logger will be used. Optional.\n\tLogger *slog.Logger\n}\n\nfunc (o *Options3LO) validate() error {\n\tif o == nil {\n\t\treturn errors.New(\"auth: options must be provided\")\n\t}\n\tif o.ClientID == \"\" {\n\t\treturn errors.New(\"auth: client ID must be provided\")\n\t}\n\tif o.AuthHandlerOpts == nil && o.ClientSecret == \"\" {\n\t\treturn errors.New(\"auth: client secret must be provided\")\n\t}\n\tif o.AuthURL == \"\" {\n\t\treturn errors.New(\"auth: auth URL must be provided\")\n\t}\n\tif o.TokenURL == \"\" {\n\t\treturn errors.New(\"auth: token URL must be provided\")\n\t}\n\tif o.AuthStyle == StyleUnknown {\n\t\treturn errors.New(\"auth: auth style must be provided\")\n\t}\n\tif o.AuthHandlerOpts == nil && o.RefreshToken == \"\" {\n\t\treturn errors.New(\"auth: refresh token must be provided\")\n\t}\n\treturn nil\n}\n\nfunc (o *Options3LO) logger() *slog.Logger {\n\treturn internallog.New(o.Logger)\n}\n\n// PKCEOptions holds parameters to support PKCE.\ntype PKCEOptions struct {\n\t// Challenge is the un-padded, base64-url-encoded string of the encrypted code verifier.\n\tChallenge string // The un-padded, base64-url-encoded string of the encrypted code verifier.\n\t// ChallengeMethod is the encryption method (ex. S256).\n\tChallengeMethod string\n\t// Verifier is the original, non-encrypted secret.\n\tVerifier string // The original, non-encrypted secret.\n}\n\ntype tokenJSON struct {\n\tAccessToken  string `json:\"access_token\"`\n\tTokenType    string `json:\"token_type\"`\n\tRefreshToken string `json:\"refresh_token\"`\n\tExpiresIn    int    `json:\"expires_in\"`\n\t// error fields\n\tErrorCode        string `json:\"error\"`\n\tErrorDescription string `json:\"error_description\"`\n\tErrorURI         string `json:\"error_uri\"`\n}\n\nfunc (e *tokenJSON) expiry() (t time.Time) {\n\tif v := e.ExpiresIn; v != 0 {\n\t\treturn time.Now().Add(time.Duration(v) * time.Second)\n\t}\n\treturn\n}\n\nfunc (o *Options3LO) client() *http.Client {\n\tif o.Client != nil {\n\t\treturn o.Client\n\t}\n\treturn internal.DefaultClient()\n}\n\n// authCodeURL returns a URL that points to a OAuth2 consent page.\nfunc (o *Options3LO) authCodeURL(state string, values url.Values) string {\n\tvar buf bytes.Buffer\n\tbuf.WriteString(o.AuthURL)\n\tv := url.Values{\n\t\t\"response_type\": {\"code\"},\n\t\t\"client_id\":     {o.ClientID},\n\t}\n\tif o.RedirectURL != \"\" {\n\t\tv.Set(\"redirect_uri\", o.RedirectURL)\n\t}\n\tif len(o.Scopes) > 0 {\n\t\tv.Set(\"scope\", strings.Join(o.Scopes, \" \"))\n\t}\n\tif state != \"\" {\n\t\tv.Set(\"state\", state)\n\t}\n\tif o.AuthHandlerOpts != nil {\n\t\tif o.AuthHandlerOpts.PKCEOpts != nil &&\n\t\t\to.AuthHandlerOpts.PKCEOpts.Challenge != \"\" {\n\t\t\tv.Set(codeChallengeKey, o.AuthHandlerOpts.PKCEOpts.Challenge)\n\t\t}\n\t\tif o.AuthHandlerOpts.PKCEOpts != nil &&\n\t\t\to.AuthHandlerOpts.PKCEOpts.ChallengeMethod != \"\" {\n\t\t\tv.Set(codeChallengeMethodKey, o.AuthHandlerOpts.PKCEOpts.ChallengeMethod)\n\t\t}\n\t}\n\tfor k := range values {\n\t\tv.Set(k, v.Get(k))\n\t}\n\tif strings.Contains(o.AuthURL, \"?\") {\n\t\tbuf.WriteByte('&')\n\t} else {\n\t\tbuf.WriteByte('?')\n\t}\n\tbuf.WriteString(v.Encode())\n\treturn buf.String()\n}\n\n// New3LOTokenProvider returns a [TokenProvider] based on the 3-legged OAuth2\n// configuration. The TokenProvider is caches and auto-refreshes tokens by\n// default.\nfunc New3LOTokenProvider(opts *Options3LO) (TokenProvider, error) {\n\tif err := opts.validate(); err != nil {\n\t\treturn nil, err\n\t}\n\tif opts.AuthHandlerOpts != nil {\n\t\treturn new3LOTokenProviderWithAuthHandler(opts), nil\n\t}\n\treturn NewCachedTokenProvider(&tokenProvider3LO{opts: opts, refreshToken: opts.RefreshToken, client: opts.client()}, &CachedTokenProviderOptions{\n\t\tExpireEarly: opts.EarlyTokenExpiry,\n\t}), nil\n}\n\n// AuthorizationHandlerOptions provides a set of options to specify for doing a\n// 3-legged OAuth2 flow with a custom [AuthorizationHandler].\ntype AuthorizationHandlerOptions struct {\n\t// AuthorizationHandler specifies the handler used to for the authorization\n\t// part of the flow.\n\tHandler AuthorizationHandler\n\t// State is used verify that the \"state\" is identical in the request and\n\t// response before exchanging the auth code for OAuth2 token.\n\tState string\n\t// PKCEOpts allows setting configurations for PKCE. Optional.\n\tPKCEOpts *PKCEOptions\n}\n\nfunc new3LOTokenProviderWithAuthHandler(opts *Options3LO) TokenProvider {\n\treturn NewCachedTokenProvider(&tokenProviderWithHandler{opts: opts, state: opts.AuthHandlerOpts.State}, &CachedTokenProviderOptions{\n\t\tExpireEarly: opts.EarlyTokenExpiry,\n\t})\n}\n\n// exchange handles the final exchange portion of the 3lo flow. Returns a Token,\n// refreshToken, and error.\nfunc (o *Options3LO) exchange(ctx context.Context, code string) (*Token, string, error) {\n\t// Build request\n\tv := url.Values{\n\t\t\"grant_type\": {\"authorization_code\"},\n\t\t\"code\":       {code},\n\t}\n\tif o.RedirectURL != \"\" {\n\t\tv.Set(\"redirect_uri\", o.RedirectURL)\n\t}\n\tif o.AuthHandlerOpts != nil &&\n\t\to.AuthHandlerOpts.PKCEOpts != nil &&\n\t\to.AuthHandlerOpts.PKCEOpts.Verifier != \"\" {\n\t\tv.Set(codeVerifierKey, o.AuthHandlerOpts.PKCEOpts.Verifier)\n\t}\n\tfor k := range o.URLParams {\n\t\tv.Set(k, o.URLParams.Get(k))\n\t}\n\treturn fetchToken(ctx, o, v)\n}\n\n// This struct is not safe for concurrent access alone, but the way it is used\n// in this package by wrapping it with a cachedTokenProvider makes it so.\ntype tokenProvider3LO struct {\n\topts         *Options3LO\n\tclient       *http.Client\n\trefreshToken string\n}\n\nfunc (tp *tokenProvider3LO) Token(ctx context.Context) (*Token, error) {\n\tif tp.refreshToken == \"\" {\n\t\treturn nil, errors.New(\"auth: token expired and refresh token is not set\")\n\t}\n\tv := url.Values{\n\t\t\"grant_type\":    {\"refresh_token\"},\n\t\t\"refresh_token\": {tp.refreshToken},\n\t}\n\tfor k := range tp.opts.URLParams {\n\t\tv.Set(k, tp.opts.URLParams.Get(k))\n\t}\n\n\ttk, rt, err := fetchToken(ctx, tp.opts, v)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif tp.refreshToken != rt && rt != \"\" {\n\t\ttp.refreshToken = rt\n\t}\n\treturn tk, err\n}\n\ntype tokenProviderWithHandler struct {\n\topts  *Options3LO\n\tstate string\n}\n\nfunc (tp tokenProviderWithHandler) Token(ctx context.Context) (*Token, error) {\n\turl := tp.opts.authCodeURL(tp.state, nil)\n\tcode, state, err := tp.opts.AuthHandlerOpts.Handler(url)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif state != tp.state {\n\t\treturn nil, errors.New(\"auth: state mismatch in 3-legged-OAuth flow\")\n\t}\n\ttok, _, err := tp.opts.exchange(ctx, code)\n\treturn tok, err\n}\n\n// fetchToken returns a Token, refresh token, and/or an error.\nfunc fetchToken(ctx context.Context, o *Options3LO, v url.Values) (*Token, string, error) {\n\tvar refreshToken string\n\tif o.AuthStyle == StyleInParams {\n\t\tif o.ClientID != \"\" {\n\t\t\tv.Set(\"client_id\", o.ClientID)\n\t\t}\n\t\tif o.ClientSecret != \"\" {\n\t\t\tv.Set(\"client_secret\", o.ClientSecret)\n\t\t}\n\t}\n\treq, err := http.NewRequestWithContext(ctx, \"POST\", o.TokenURL, strings.NewReader(v.Encode()))\n\tif err != nil {\n\t\treturn nil, refreshToken, err\n\t}\n\treq.Header.Set(\"Content-Type\", \"application/x-www-form-urlencoded\")\n\tif o.AuthStyle == StyleInHeader {\n\t\treq.SetBasicAuth(url.QueryEscape(o.ClientID), url.QueryEscape(o.ClientSecret))\n\t}\n\tlogger := o.logger()\n\n\tlogger.DebugContext(ctx, \"3LO token request\", \"request\", internallog.HTTPRequest(req, []byte(v.Encode())))\n\t// Make request\n\tresp, body, err := internal.DoRequest(o.client(), req)\n\tif err != nil {\n\t\treturn nil, refreshToken, err\n\t}\n\tlogger.DebugContext(ctx, \"3LO token response\", \"response\", internallog.HTTPResponse(resp, body))\n\tfailureStatus := resp.StatusCode < 200 || resp.StatusCode > 299\n\ttokError := &Error{\n\t\tResponse: resp,\n\t\tBody:     body,\n\t}\n\n\tvar token *Token\n\t// errors ignored because of default switch on content\n\tcontent, _, _ := mime.ParseMediaType(resp.Header.Get(\"Content-Type\"))\n\tswitch content {\n\tcase \"application/x-www-form-urlencoded\", \"text/plain\":\n\t\t// some endpoints return a query string\n\t\tvals, err := url.ParseQuery(string(body))\n\t\tif err != nil {\n\t\t\tif failureStatus {\n\t\t\t\treturn nil, refreshToken, tokError\n\t\t\t}\n\t\t\treturn nil, refreshToken, fmt.Errorf(\"auth: cannot parse response: %w\", err)\n\t\t}\n\t\ttokError.code = vals.Get(\"error\")\n\t\ttokError.description = vals.Get(\"error_description\")\n\t\ttokError.uri = vals.Get(\"error_uri\")\n\t\ttoken = &Token{\n\t\t\tValue:    vals.Get(\"access_token\"),\n\t\t\tType:     vals.Get(\"token_type\"),\n\t\t\tMetadata: make(map[string]interface{}, len(vals)),\n\t\t}\n\t\tfor k, v := range vals {\n\t\t\ttoken.Metadata[k] = v\n\t\t}\n\t\trefreshToken = vals.Get(\"refresh_token\")\n\t\te := vals.Get(\"expires_in\")\n\t\texpires, _ := strconv.Atoi(e)\n\t\tif expires != 0 {\n\t\t\ttoken.Expiry = time.Now().Add(time.Duration(expires) * time.Second)\n\t\t}\n\tdefault:\n\t\tvar tj tokenJSON\n\t\tif err = json.Unmarshal(body, &tj); err != nil {\n\t\t\tif failureStatus {\n\t\t\t\treturn nil, refreshToken, tokError\n\t\t\t}\n\t\t\treturn nil, refreshToken, fmt.Errorf(\"auth: cannot parse json: %w\", err)\n\t\t}\n\t\ttokError.code = tj.ErrorCode\n\t\ttokError.description = tj.ErrorDescription\n\t\ttokError.uri = tj.ErrorURI\n\t\ttoken = &Token{\n\t\t\tValue:    tj.AccessToken,\n\t\t\tType:     tj.TokenType,\n\t\t\tExpiry:   tj.expiry(),\n\t\t\tMetadata: make(map[string]interface{}),\n\t\t}\n\t\tjson.Unmarshal(body, &token.Metadata) // optional field, skip err check\n\t\trefreshToken = tj.RefreshToken\n\t}\n\t// according to spec, servers should respond status 400 in error case\n\t// https://www.rfc-editor.org/rfc/rfc6749#section-5.2\n\t// but some unorthodox servers respond 200 in error case\n\tif failureStatus || tokError.code != \"\" {\n\t\treturn nil, refreshToken, tokError\n\t}\n\tif token.Value == \"\" {\n\t\treturn nil, refreshToken, errors.New(\"auth: server response missing access_token\")\n\t}\n\treturn token, refreshToken, nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/compute/metadata/CHANGES.md",
    "content": "# Changes\n\n## [0.7.0](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.6.0...compute/metadata/v0.7.0) (2025-05-13)\n\n\n### Features\n\n* **compute/metadata:** Allow canceling GCE detection ([#11786](https://github.com/googleapis/google-cloud-go/issues/11786)) ([78100fe](https://github.com/googleapis/google-cloud-go/commit/78100fe7e28cd30f1e10b47191ac3c9839663b64))\n\n## [0.6.0](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.5.2...compute/metadata/v0.6.0) (2024-12-13)\n\n\n### Features\n\n* **compute/metadata:** Add debug logging ([#11078](https://github.com/googleapis/google-cloud-go/issues/11078)) ([a816814](https://github.com/googleapis/google-cloud-go/commit/a81681463906e4473570a2f426eb0dc2de64e53f))\n\n## [0.5.2](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.5.1...compute/metadata/v0.5.2) (2024-09-20)\n\n\n### Bug Fixes\n\n* **compute/metadata:** Close Response Body for failed request ([#10891](https://github.com/googleapis/google-cloud-go/issues/10891)) ([e91d45e](https://github.com/googleapis/google-cloud-go/commit/e91d45e4757a9e354114509ba9800085d9e0ff1f))\n\n## [0.5.1](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.5.0...compute/metadata/v0.5.1) (2024-09-12)\n\n\n### Bug Fixes\n\n* **compute/metadata:** Check error chain for retryable error ([#10840](https://github.com/googleapis/google-cloud-go/issues/10840)) ([2bdedef](https://github.com/googleapis/google-cloud-go/commit/2bdedeff621b223d63cebc4355fcf83bc68412cd))\n\n## [0.5.0](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.4.0...compute/metadata/v0.5.0) (2024-07-10)\n\n\n### Features\n\n* **compute/metadata:** Add sys check for windows OnGCE ([#10521](https://github.com/googleapis/google-cloud-go/issues/10521)) ([3b9a830](https://github.com/googleapis/google-cloud-go/commit/3b9a83063960d2a2ac20beb47cc15818a68bd302))\n\n## [0.4.0](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.3.0...compute/metadata/v0.4.0) (2024-07-01)\n\n\n### Features\n\n* **compute/metadata:** Add context for all functions/methods ([#10370](https://github.com/googleapis/google-cloud-go/issues/10370)) ([66b8efe](https://github.com/googleapis/google-cloud-go/commit/66b8efe7ad877e052b2987bb4475477e38c67bb3))\n\n\n### Documentation\n\n* **compute/metadata:** Update OnGCE description ([#10408](https://github.com/googleapis/google-cloud-go/issues/10408)) ([6a46dca](https://github.com/googleapis/google-cloud-go/commit/6a46dca4eae4f88ec6f88822e01e5bf8aeca787f))\n\n## [0.3.0](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.2.3...compute/metadata/v0.3.0) (2024-04-15)\n\n\n### Features\n\n* **compute/metadata:** Add context aware functions  ([#9733](https://github.com/googleapis/google-cloud-go/issues/9733)) ([e4eb5b4](https://github.com/googleapis/google-cloud-go/commit/e4eb5b46ee2aec9d2fc18300bfd66015e25a0510))\n\n## [0.2.3](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.2.2...compute/metadata/v0.2.3) (2022-12-15)\n\n\n### Bug Fixes\n\n* **compute/metadata:** Switch DNS lookup to an absolute lookup ([119b410](https://github.com/googleapis/google-cloud-go/commit/119b41060c7895e45e48aee5621ad35607c4d021)), refs [#7165](https://github.com/googleapis/google-cloud-go/issues/7165)\n\n## [0.2.2](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.2.1...compute/metadata/v0.2.2) (2022-12-01)\n\n\n### Bug Fixes\n\n* **compute/metadata:** Set IdleConnTimeout for http.Client ([#7084](https://github.com/googleapis/google-cloud-go/issues/7084)) ([766516a](https://github.com/googleapis/google-cloud-go/commit/766516aaf3816bfb3159efeea65aa3d1d205a3e2)), refs [#5430](https://github.com/googleapis/google-cloud-go/issues/5430)\n\n## [0.1.0] (2022-10-26)\n\nInitial release of metadata being it's own module.\n"
  },
  {
    "path": "vendor/cloud.google.com/go/compute/metadata/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/cloud.google.com/go/compute/metadata/README.md",
    "content": "# Compute API\n\n[![Go Reference](https://pkg.go.dev/badge/cloud.google.com/go/compute.svg)](https://pkg.go.dev/cloud.google.com/go/compute/metadata)\n\nThis is a utility library for communicating with Google Cloud metadata service\non Google Cloud.\n\n## Install\n\n```bash\ngo get cloud.google.com/go/compute/metadata\n```\n\n## Go Version Support\n\nSee the [Go Versions Supported](https://github.com/googleapis/google-cloud-go#go-versions-supported)\nsection in the root directory's README.\n\n## Contributing\n\nContributions are welcome. Please, see the [CONTRIBUTING](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/main/CONTRIBUTING.md)\ndocument for details.\n\nPlease note that this project is released with a Contributor Code of Conduct.\nBy participating in this project you agree to abide by its terms. See\n[Contributor Code of Conduct](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/main/CONTRIBUTING.md#contributor-code-of-conduct)\nfor more information.\n"
  },
  {
    "path": "vendor/cloud.google.com/go/compute/metadata/log.go",
    "content": "// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage metadata\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"strings\"\n)\n\n// Code below this point is copied from github.com/googleapis/gax-go/v2/internallog\n// to avoid the dependency. The compute/metadata module is used by too many\n// non-client library modules that can't justify the dependency.\n\n// The handler returned if logging is not enabled.\ntype noOpHandler struct{}\n\nfunc (h noOpHandler) Enabled(_ context.Context, _ slog.Level) bool {\n\treturn false\n}\n\nfunc (h noOpHandler) Handle(_ context.Context, _ slog.Record) error {\n\treturn nil\n}\n\nfunc (h noOpHandler) WithAttrs(_ []slog.Attr) slog.Handler {\n\treturn h\n}\n\nfunc (h noOpHandler) WithGroup(_ string) slog.Handler {\n\treturn h\n}\n\n// httpRequest returns a lazily evaluated [slog.LogValuer] for a\n// [http.Request] and the associated body.\nfunc httpRequest(req *http.Request, body []byte) slog.LogValuer {\n\treturn &request{\n\t\treq:     req,\n\t\tpayload: body,\n\t}\n}\n\ntype request struct {\n\treq     *http.Request\n\tpayload []byte\n}\n\nfunc (r *request) LogValue() slog.Value {\n\tif r == nil || r.req == nil {\n\t\treturn slog.Value{}\n\t}\n\tvar groupValueAttrs []slog.Attr\n\tgroupValueAttrs = append(groupValueAttrs, slog.String(\"method\", r.req.Method))\n\tgroupValueAttrs = append(groupValueAttrs, slog.String(\"url\", r.req.URL.String()))\n\n\tvar headerAttr []slog.Attr\n\tfor k, val := range r.req.Header {\n\t\theaderAttr = append(headerAttr, slog.String(k, strings.Join(val, \",\")))\n\t}\n\tif len(headerAttr) > 0 {\n\t\tgroupValueAttrs = append(groupValueAttrs, slog.Any(\"headers\", headerAttr))\n\t}\n\n\tif len(r.payload) > 0 {\n\t\tif attr, ok := processPayload(r.payload); ok {\n\t\t\tgroupValueAttrs = append(groupValueAttrs, attr)\n\t\t}\n\t}\n\treturn slog.GroupValue(groupValueAttrs...)\n}\n\n// httpResponse returns a lazily evaluated [slog.LogValuer] for a\n// [http.Response] and the associated body.\nfunc httpResponse(resp *http.Response, body []byte) slog.LogValuer {\n\treturn &response{\n\t\tresp:    resp,\n\t\tpayload: body,\n\t}\n}\n\ntype response struct {\n\tresp    *http.Response\n\tpayload []byte\n}\n\nfunc (r *response) LogValue() slog.Value {\n\tif r == nil {\n\t\treturn slog.Value{}\n\t}\n\tvar groupValueAttrs []slog.Attr\n\tgroupValueAttrs = append(groupValueAttrs, slog.String(\"status\", fmt.Sprint(r.resp.StatusCode)))\n\n\tvar headerAttr []slog.Attr\n\tfor k, val := range r.resp.Header {\n\t\theaderAttr = append(headerAttr, slog.String(k, strings.Join(val, \",\")))\n\t}\n\tif len(headerAttr) > 0 {\n\t\tgroupValueAttrs = append(groupValueAttrs, slog.Any(\"headers\", headerAttr))\n\t}\n\n\tif len(r.payload) > 0 {\n\t\tif attr, ok := processPayload(r.payload); ok {\n\t\t\tgroupValueAttrs = append(groupValueAttrs, attr)\n\t\t}\n\t}\n\treturn slog.GroupValue(groupValueAttrs...)\n}\n\nfunc processPayload(payload []byte) (slog.Attr, bool) {\n\tpeekChar := payload[0]\n\tif peekChar == '{' {\n\t\t// JSON object\n\t\tvar m map[string]any\n\t\tif err := json.Unmarshal(payload, &m); err == nil {\n\t\t\treturn slog.Any(\"payload\", m), true\n\t\t}\n\t} else if peekChar == '[' {\n\t\t// JSON array\n\t\tvar m []any\n\t\tif err := json.Unmarshal(payload, &m); err == nil {\n\t\t\treturn slog.Any(\"payload\", m), true\n\t\t}\n\t} else {\n\t\t// Everything else\n\t\tbuf := &bytes.Buffer{}\n\t\tif err := json.Compact(buf, payload); err != nil {\n\t\t\t// Write raw payload incase of error\n\t\t\tbuf.Write(payload)\n\t\t}\n\t\treturn slog.String(\"payload\", buf.String()), true\n\t}\n\treturn slog.Attr{}, false\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/compute/metadata/metadata.go",
    "content": "// Copyright 2014 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package metadata provides access to Google Compute Engine (GCE)\n// metadata and API service accounts.\n//\n// This package is a wrapper around the GCE metadata service,\n// as documented at https://cloud.google.com/compute/docs/metadata/overview.\npackage metadata // import \"cloud.google.com/go/compute/metadata\"\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n)\n\nconst (\n\t// metadataIP is the documented metadata server IP address.\n\tmetadataIP = \"169.254.169.254\"\n\n\t// metadataHostEnv is the environment variable specifying the\n\t// GCE metadata hostname.  If empty, the default value of\n\t// metadataIP (\"169.254.169.254\") is used instead.\n\t// This is variable name is not defined by any spec, as far as\n\t// I know; it was made up for the Go package.\n\tmetadataHostEnv = \"GCE_METADATA_HOST\"\n\n\tuserAgent = \"gcloud-golang/0.1\"\n)\n\ntype cachedValue struct {\n\tk    string\n\ttrim bool\n\tmu   sync.Mutex\n\tv    string\n}\n\nvar (\n\tprojID  = &cachedValue{k: \"project/project-id\", trim: true}\n\tprojNum = &cachedValue{k: \"project/numeric-project-id\", trim: true}\n\tinstID  = &cachedValue{k: \"instance/id\", trim: true}\n)\n\nvar defaultClient = &Client{\n\thc:     newDefaultHTTPClient(),\n\tlogger: slog.New(noOpHandler{}),\n}\n\nfunc newDefaultHTTPClient() *http.Client {\n\treturn &http.Client{\n\t\tTransport: &http.Transport{\n\t\t\tDial: (&net.Dialer{\n\t\t\t\tTimeout:   2 * time.Second,\n\t\t\t\tKeepAlive: 30 * time.Second,\n\t\t\t}).Dial,\n\t\t\tIdleConnTimeout: 60 * time.Second,\n\t\t},\n\t\tTimeout: 5 * time.Second,\n\t}\n}\n\n// NotDefinedError is returned when requested metadata is not defined.\n//\n// The underlying string is the suffix after \"/computeMetadata/v1/\".\n//\n// This error is not returned if the value is defined to be the empty\n// string.\ntype NotDefinedError string\n\nfunc (suffix NotDefinedError) Error() string {\n\treturn fmt.Sprintf(\"metadata: GCE metadata %q not defined\", string(suffix))\n}\n\nfunc (c *cachedValue) get(ctx context.Context, cl *Client) (v string, err error) {\n\tdefer c.mu.Unlock()\n\tc.mu.Lock()\n\tif c.v != \"\" {\n\t\treturn c.v, nil\n\t}\n\tif c.trim {\n\t\tv, err = cl.getTrimmed(ctx, c.k)\n\t} else {\n\t\tv, err = cl.GetWithContext(ctx, c.k)\n\t}\n\tif err == nil {\n\t\tc.v = v\n\t}\n\treturn\n}\n\nvar (\n\tonGCEOnce sync.Once\n\tonGCE     bool\n)\n\n// OnGCE reports whether this process is running on Google Compute Platforms.\n// NOTE: True returned from `OnGCE` does not guarantee that the metadata server\n// is accessible from this process and have all the metadata defined.\nfunc OnGCE() bool {\n\treturn OnGCEWithContext(context.Background())\n}\n\n// OnGCEWithContext reports whether this process is running on Google Compute Platforms.\n// This function's return value is memoized for better performance.\n// NOTE: True returned from `OnGCEWithContext` does not guarantee that the metadata server\n// is accessible from this process and have all the metadata defined.\nfunc OnGCEWithContext(ctx context.Context) bool {\n\tonGCEOnce.Do(func() {\n\t\tonGCE = defaultClient.OnGCEWithContext(ctx)\n\t})\n\treturn onGCE\n}\n\n// Subscribe calls Client.SubscribeWithContext on the default client.\n//\n// Deprecated: Please use the context aware variant [SubscribeWithContext].\nfunc Subscribe(suffix string, fn func(v string, ok bool) error) error {\n\treturn defaultClient.SubscribeWithContext(context.Background(), suffix, func(ctx context.Context, v string, ok bool) error { return fn(v, ok) })\n}\n\n// SubscribeWithContext calls Client.SubscribeWithContext on the default client.\nfunc SubscribeWithContext(ctx context.Context, suffix string, fn func(ctx context.Context, v string, ok bool) error) error {\n\treturn defaultClient.SubscribeWithContext(ctx, suffix, fn)\n}\n\n// Get calls Client.GetWithContext on the default client.\n//\n// Deprecated: Please use the context aware variant [GetWithContext].\nfunc Get(suffix string) (string, error) {\n\treturn defaultClient.GetWithContext(context.Background(), suffix)\n}\n\n// GetWithContext calls Client.GetWithContext on the default client.\nfunc GetWithContext(ctx context.Context, suffix string) (string, error) {\n\treturn defaultClient.GetWithContext(ctx, suffix)\n}\n\n// ProjectID returns the current instance's project ID string.\n//\n// Deprecated: Please use the context aware variant [ProjectIDWithContext].\nfunc ProjectID() (string, error) {\n\treturn defaultClient.ProjectIDWithContext(context.Background())\n}\n\n// ProjectIDWithContext returns the current instance's project ID string.\nfunc ProjectIDWithContext(ctx context.Context) (string, error) {\n\treturn defaultClient.ProjectIDWithContext(ctx)\n}\n\n// NumericProjectID returns the current instance's numeric project ID.\n//\n// Deprecated: Please use the context aware variant [NumericProjectIDWithContext].\nfunc NumericProjectID() (string, error) {\n\treturn defaultClient.NumericProjectIDWithContext(context.Background())\n}\n\n// NumericProjectIDWithContext returns the current instance's numeric project ID.\nfunc NumericProjectIDWithContext(ctx context.Context) (string, error) {\n\treturn defaultClient.NumericProjectIDWithContext(ctx)\n}\n\n// InternalIP returns the instance's primary internal IP address.\n//\n// Deprecated: Please use the context aware variant [InternalIPWithContext].\nfunc InternalIP() (string, error) {\n\treturn defaultClient.InternalIPWithContext(context.Background())\n}\n\n// InternalIPWithContext returns the instance's primary internal IP address.\nfunc InternalIPWithContext(ctx context.Context) (string, error) {\n\treturn defaultClient.InternalIPWithContext(ctx)\n}\n\n// ExternalIP returns the instance's primary external (public) IP address.\n//\n// Deprecated: Please use the context aware variant [ExternalIPWithContext].\nfunc ExternalIP() (string, error) {\n\treturn defaultClient.ExternalIPWithContext(context.Background())\n}\n\n// ExternalIPWithContext returns the instance's primary external (public) IP address.\nfunc ExternalIPWithContext(ctx context.Context) (string, error) {\n\treturn defaultClient.ExternalIPWithContext(ctx)\n}\n\n// Email calls Client.EmailWithContext on the default client.\n//\n// Deprecated: Please use the context aware variant [EmailWithContext].\nfunc Email(serviceAccount string) (string, error) {\n\treturn defaultClient.EmailWithContext(context.Background(), serviceAccount)\n}\n\n// EmailWithContext calls Client.EmailWithContext on the default client.\nfunc EmailWithContext(ctx context.Context, serviceAccount string) (string, error) {\n\treturn defaultClient.EmailWithContext(ctx, serviceAccount)\n}\n\n// Hostname returns the instance's hostname. This will be of the form\n// \"<instanceID>.c.<projID>.internal\".\n//\n// Deprecated: Please use the context aware variant [HostnameWithContext].\nfunc Hostname() (string, error) {\n\treturn defaultClient.HostnameWithContext(context.Background())\n}\n\n// HostnameWithContext returns the instance's hostname. This will be of the form\n// \"<instanceID>.c.<projID>.internal\".\nfunc HostnameWithContext(ctx context.Context) (string, error) {\n\treturn defaultClient.HostnameWithContext(ctx)\n}\n\n// InstanceTags returns the list of user-defined instance tags,\n// assigned when initially creating a GCE instance.\n//\n// Deprecated: Please use the context aware variant [InstanceTagsWithContext].\nfunc InstanceTags() ([]string, error) {\n\treturn defaultClient.InstanceTagsWithContext(context.Background())\n}\n\n// InstanceTagsWithContext returns the list of user-defined instance tags,\n// assigned when initially creating a GCE instance.\nfunc InstanceTagsWithContext(ctx context.Context) ([]string, error) {\n\treturn defaultClient.InstanceTagsWithContext(ctx)\n}\n\n// InstanceID returns the current VM's numeric instance ID.\n//\n// Deprecated: Please use the context aware variant [InstanceIDWithContext].\nfunc InstanceID() (string, error) {\n\treturn defaultClient.InstanceIDWithContext(context.Background())\n}\n\n// InstanceIDWithContext returns the current VM's numeric instance ID.\nfunc InstanceIDWithContext(ctx context.Context) (string, error) {\n\treturn defaultClient.InstanceIDWithContext(ctx)\n}\n\n// InstanceName returns the current VM's instance ID string.\n//\n// Deprecated: Please use the context aware variant [InstanceNameWithContext].\nfunc InstanceName() (string, error) {\n\treturn defaultClient.InstanceNameWithContext(context.Background())\n}\n\n// InstanceNameWithContext returns the current VM's instance ID string.\nfunc InstanceNameWithContext(ctx context.Context) (string, error) {\n\treturn defaultClient.InstanceNameWithContext(ctx)\n}\n\n// Zone returns the current VM's zone, such as \"us-central1-b\".\n//\n// Deprecated: Please use the context aware variant [ZoneWithContext].\nfunc Zone() (string, error) {\n\treturn defaultClient.ZoneWithContext(context.Background())\n}\n\n// ZoneWithContext returns the current VM's zone, such as \"us-central1-b\".\nfunc ZoneWithContext(ctx context.Context) (string, error) {\n\treturn defaultClient.ZoneWithContext(ctx)\n}\n\n// InstanceAttributes calls Client.InstanceAttributesWithContext on the default client.\n//\n// Deprecated: Please use the context aware variant [InstanceAttributesWithContext.\nfunc InstanceAttributes() ([]string, error) {\n\treturn defaultClient.InstanceAttributesWithContext(context.Background())\n}\n\n// InstanceAttributesWithContext calls Client.ProjectAttributesWithContext on the default client.\nfunc InstanceAttributesWithContext(ctx context.Context) ([]string, error) {\n\treturn defaultClient.InstanceAttributesWithContext(ctx)\n}\n\n// ProjectAttributes calls Client.ProjectAttributesWithContext on the default client.\n//\n// Deprecated: Please use the context aware variant [ProjectAttributesWithContext].\nfunc ProjectAttributes() ([]string, error) {\n\treturn defaultClient.ProjectAttributesWithContext(context.Background())\n}\n\n// ProjectAttributesWithContext calls Client.ProjectAttributesWithContext on the default client.\nfunc ProjectAttributesWithContext(ctx context.Context) ([]string, error) {\n\treturn defaultClient.ProjectAttributesWithContext(ctx)\n}\n\n// InstanceAttributeValue calls Client.InstanceAttributeValueWithContext on the default client.\n//\n// Deprecated: Please use the context aware variant [InstanceAttributeValueWithContext].\nfunc InstanceAttributeValue(attr string) (string, error) {\n\treturn defaultClient.InstanceAttributeValueWithContext(context.Background(), attr)\n}\n\n// InstanceAttributeValueWithContext calls Client.InstanceAttributeValueWithContext on the default client.\nfunc InstanceAttributeValueWithContext(ctx context.Context, attr string) (string, error) {\n\treturn defaultClient.InstanceAttributeValueWithContext(ctx, attr)\n}\n\n// ProjectAttributeValue calls Client.ProjectAttributeValueWithContext on the default client.\n//\n// Deprecated: Please use the context aware variant [ProjectAttributeValueWithContext].\nfunc ProjectAttributeValue(attr string) (string, error) {\n\treturn defaultClient.ProjectAttributeValueWithContext(context.Background(), attr)\n}\n\n// ProjectAttributeValueWithContext calls Client.ProjectAttributeValueWithContext on the default client.\nfunc ProjectAttributeValueWithContext(ctx context.Context, attr string) (string, error) {\n\treturn defaultClient.ProjectAttributeValueWithContext(ctx, attr)\n}\n\n// Scopes calls Client.ScopesWithContext on the default client.\n//\n// Deprecated: Please use the context aware variant [ScopesWithContext].\nfunc Scopes(serviceAccount string) ([]string, error) {\n\treturn defaultClient.ScopesWithContext(context.Background(), serviceAccount)\n}\n\n// ScopesWithContext calls Client.ScopesWithContext on the default client.\nfunc ScopesWithContext(ctx context.Context, serviceAccount string) ([]string, error) {\n\treturn defaultClient.ScopesWithContext(ctx, serviceAccount)\n}\n\nfunc strsContains(ss []string, s string) bool {\n\tfor _, v := range ss {\n\t\tif v == s {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// A Client provides metadata.\ntype Client struct {\n\thc     *http.Client\n\tlogger *slog.Logger\n}\n\n// Options for configuring a [Client].\ntype Options struct {\n\t// Client is the HTTP client used to make requests. Optional.\n\tClient *http.Client\n\t// Logger is used to log information about HTTP request and responses.\n\t// If not provided, nothing will be logged. Optional.\n\tLogger *slog.Logger\n}\n\n// NewClient returns a Client that can be used to fetch metadata.\n// Returns the client that uses the specified http.Client for HTTP requests.\n// If nil is specified, returns the default client.\nfunc NewClient(c *http.Client) *Client {\n\treturn NewWithOptions(&Options{\n\t\tClient: c,\n\t})\n}\n\n// NewWithOptions returns a Client that is configured with the provided Options.\nfunc NewWithOptions(opts *Options) *Client {\n\tif opts == nil {\n\t\treturn defaultClient\n\t}\n\tclient := opts.Client\n\tif client == nil {\n\t\tclient = newDefaultHTTPClient()\n\t}\n\tlogger := opts.Logger\n\tif logger == nil {\n\t\tlogger = slog.New(noOpHandler{})\n\t}\n\treturn &Client{hc: client, logger: logger}\n}\n\n// NOTE: metadataRequestStrategy is assigned to a variable for test stubbing purposes.\nvar metadataRequestStrategy = func(ctx context.Context, httpClient *http.Client, resc chan bool) {\n\treq, _ := http.NewRequest(\"GET\", \"http://\"+metadataIP, nil)\n\treq.Header.Set(\"User-Agent\", userAgent)\n\tres, err := httpClient.Do(req.WithContext(ctx))\n\tif err != nil {\n\t\tresc <- false\n\t\treturn\n\t}\n\tdefer res.Body.Close()\n\tresc <- res.Header.Get(\"Metadata-Flavor\") == \"Google\"\n}\n\n// NOTE: dnsRequestStrategy is assigned to a variable for test stubbing purposes.\nvar dnsRequestStrategy = func(ctx context.Context, resc chan bool) {\n\tresolver := &net.Resolver{}\n\taddrs, err := resolver.LookupHost(ctx, \"metadata.google.internal.\")\n\tif err != nil || len(addrs) == 0 {\n\t\tresc <- false\n\t\treturn\n\t}\n\tresc <- strsContains(addrs, metadataIP)\n}\n\n// OnGCEWithContext reports whether this process is running on Google Compute Platforms.\n// NOTE: True returned from `OnGCEWithContext` does not guarantee that the metadata server\n// is accessible from this process and have all the metadata defined.\nfunc (c *Client) OnGCEWithContext(ctx context.Context) bool {\n\t// The user explicitly said they're on GCE, so trust them.\n\tif os.Getenv(metadataHostEnv) != \"\" {\n\t\treturn true\n\t}\n\n\tctx, cancel := context.WithCancel(ctx)\n\tdefer cancel()\n\n\tresc := make(chan bool, 2)\n\n\t// Try two strategies in parallel.\n\t// See https://github.com/googleapis/google-cloud-go/issues/194\n\tgo metadataRequestStrategy(ctx, c.hc, resc)\n\tgo dnsRequestStrategy(ctx, resc)\n\n\ttryHarder := systemInfoSuggestsGCE()\n\tif tryHarder {\n\t\tres := <-resc\n\t\tif res {\n\t\t\t// The first strategy succeeded, so let's use it.\n\t\t\treturn true\n\t\t}\n\n\t\t// Wait for either the DNS or metadata server probe to\n\t\t// contradict the other one and say we are running on\n\t\t// GCE. Give it a lot of time to do so, since the system\n\t\t// info already suggests we're running on a GCE BIOS.\n\t\t// Ensure cancellations from the calling context are respected.\n\t\twaitContext, cancelWait := context.WithTimeout(ctx, 5*time.Second)\n\t\tdefer cancelWait()\n\t\tselect {\n\t\tcase res = <-resc:\n\t\t\treturn res\n\t\tcase <-waitContext.Done():\n\t\t\t// Too slow. Who knows what this system is.\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// There's no hint from the system info that we're running on\n\t// GCE, so use the first probe's result as truth, whether it's\n\t// true or false. The goal here is to optimize for speed for\n\t// users who are NOT running on GCE. We can't assume that\n\t// either a DNS lookup or an HTTP request to a blackholed IP\n\t// address is fast. Worst case this should return when the\n\t// metaClient's Transport.ResponseHeaderTimeout or\n\t// Transport.Dial.Timeout fires (in two seconds).\n\treturn <-resc\n}\n\n// getETag returns a value from the metadata service as well as the associated ETag.\n// This func is otherwise equivalent to Get.\nfunc (c *Client) getETag(ctx context.Context, suffix string) (value, etag string, err error) {\n\t// Using a fixed IP makes it very difficult to spoof the metadata service in\n\t// a container, which is an important use-case for local testing of cloud\n\t// deployments. To enable spoofing of the metadata service, the environment\n\t// variable GCE_METADATA_HOST is first inspected to decide where metadata\n\t// requests shall go.\n\thost := os.Getenv(metadataHostEnv)\n\tif host == \"\" {\n\t\t// Using 169.254.169.254 instead of \"metadata\" here because Go\n\t\t// binaries built with the \"netgo\" tag and without cgo won't\n\t\t// know the search suffix for \"metadata\" is\n\t\t// \".google.internal\", and this IP address is documented as\n\t\t// being stable anyway.\n\t\thost = metadataIP\n\t}\n\tsuffix = strings.TrimLeft(suffix, \"/\")\n\tu := \"http://\" + host + \"/computeMetadata/v1/\" + suffix\n\treq, err := http.NewRequestWithContext(ctx, \"GET\", u, nil)\n\tif err != nil {\n\t\treturn \"\", \"\", err\n\t}\n\treq.Header.Set(\"Metadata-Flavor\", \"Google\")\n\treq.Header.Set(\"User-Agent\", userAgent)\n\tvar res *http.Response\n\tvar reqErr error\n\tvar body []byte\n\tretryer := newRetryer()\n\tfor {\n\t\tc.logger.DebugContext(ctx, \"metadata request\", \"request\", httpRequest(req, nil))\n\t\tres, reqErr = c.hc.Do(req)\n\t\tvar code int\n\t\tif res != nil {\n\t\t\tcode = res.StatusCode\n\t\t\tbody, err = io.ReadAll(res.Body)\n\t\t\tif err != nil {\n\t\t\t\tres.Body.Close()\n\t\t\t\treturn \"\", \"\", err\n\t\t\t}\n\t\t\tc.logger.DebugContext(ctx, \"metadata response\", \"response\", httpResponse(res, body))\n\t\t\tres.Body.Close()\n\t\t}\n\t\tif delay, shouldRetry := retryer.Retry(code, reqErr); shouldRetry {\n\t\t\tif res != nil && res.Body != nil {\n\t\t\t\tres.Body.Close()\n\t\t\t}\n\t\t\tif err := sleep(ctx, delay); err != nil {\n\t\t\t\treturn \"\", \"\", err\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tbreak\n\t}\n\tif reqErr != nil {\n\t\treturn \"\", \"\", reqErr\n\t}\n\tif res.StatusCode == http.StatusNotFound {\n\t\treturn \"\", \"\", NotDefinedError(suffix)\n\t}\n\tif res.StatusCode != 200 {\n\t\treturn \"\", \"\", &Error{Code: res.StatusCode, Message: string(body)}\n\t}\n\treturn string(body), res.Header.Get(\"Etag\"), nil\n}\n\n// Get returns a value from the metadata service.\n// The suffix is appended to \"http://${GCE_METADATA_HOST}/computeMetadata/v1/\".\n//\n// If the GCE_METADATA_HOST environment variable is not defined, a default of\n// 169.254.169.254 will be used instead.\n//\n// If the requested metadata is not defined, the returned error will\n// be of type NotDefinedError.\n//\n// Deprecated: Please use the context aware variant [Client.GetWithContext].\nfunc (c *Client) Get(suffix string) (string, error) {\n\treturn c.GetWithContext(context.Background(), suffix)\n}\n\n// GetWithContext returns a value from the metadata service.\n// The suffix is appended to \"http://${GCE_METADATA_HOST}/computeMetadata/v1/\".\n//\n// If the GCE_METADATA_HOST environment variable is not defined, a default of\n// 169.254.169.254 will be used instead.\n//\n// If the requested metadata is not defined, the returned error will\n// be of type NotDefinedError.\n//\n// NOTE: Without an extra deadline in the context this call can take in the\n// worst case, with internal backoff retries, up to 15 seconds (e.g. when server\n// is responding slowly). Pass context with additional timeouts when needed.\nfunc (c *Client) GetWithContext(ctx context.Context, suffix string) (string, error) {\n\tval, _, err := c.getETag(ctx, suffix)\n\treturn val, err\n}\n\nfunc (c *Client) getTrimmed(ctx context.Context, suffix string) (s string, err error) {\n\ts, err = c.GetWithContext(ctx, suffix)\n\ts = strings.TrimSpace(s)\n\treturn\n}\n\nfunc (c *Client) lines(ctx context.Context, suffix string) ([]string, error) {\n\tj, err := c.GetWithContext(ctx, suffix)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ts := strings.Split(strings.TrimSpace(j), \"\\n\")\n\tfor i := range s {\n\t\ts[i] = strings.TrimSpace(s[i])\n\t}\n\treturn s, nil\n}\n\n// ProjectID returns the current instance's project ID string.\n//\n// Deprecated: Please use the context aware variant [Client.ProjectIDWithContext].\nfunc (c *Client) ProjectID() (string, error) { return c.ProjectIDWithContext(context.Background()) }\n\n// ProjectIDWithContext returns the current instance's project ID string.\nfunc (c *Client) ProjectIDWithContext(ctx context.Context) (string, error) { return projID.get(ctx, c) }\n\n// NumericProjectID returns the current instance's numeric project ID.\n//\n// Deprecated: Please use the context aware variant [Client.NumericProjectIDWithContext].\nfunc (c *Client) NumericProjectID() (string, error) {\n\treturn c.NumericProjectIDWithContext(context.Background())\n}\n\n// NumericProjectIDWithContext returns the current instance's numeric project ID.\nfunc (c *Client) NumericProjectIDWithContext(ctx context.Context) (string, error) {\n\treturn projNum.get(ctx, c)\n}\n\n// InstanceID returns the current VM's numeric instance ID.\n//\n// Deprecated: Please use the context aware variant [Client.InstanceIDWithContext].\nfunc (c *Client) InstanceID() (string, error) {\n\treturn c.InstanceIDWithContext(context.Background())\n}\n\n// InstanceIDWithContext returns the current VM's numeric instance ID.\nfunc (c *Client) InstanceIDWithContext(ctx context.Context) (string, error) {\n\treturn instID.get(ctx, c)\n}\n\n// InternalIP returns the instance's primary internal IP address.\n//\n// Deprecated: Please use the context aware variant [Client.InternalIPWithContext].\nfunc (c *Client) InternalIP() (string, error) {\n\treturn c.InternalIPWithContext(context.Background())\n}\n\n// InternalIPWithContext returns the instance's primary internal IP address.\nfunc (c *Client) InternalIPWithContext(ctx context.Context) (string, error) {\n\treturn c.getTrimmed(ctx, \"instance/network-interfaces/0/ip\")\n}\n\n// Email returns the email address associated with the service account.\n//\n// Deprecated: Please use the context aware variant [Client.EmailWithContext].\nfunc (c *Client) Email(serviceAccount string) (string, error) {\n\treturn c.EmailWithContext(context.Background(), serviceAccount)\n}\n\n// EmailWithContext returns the email address associated with the service account.\n// The serviceAccount parameter default value (empty string or \"default\" value)\n// will use the instance's main account.\nfunc (c *Client) EmailWithContext(ctx context.Context, serviceAccount string) (string, error) {\n\tif serviceAccount == \"\" {\n\t\tserviceAccount = \"default\"\n\t}\n\treturn c.getTrimmed(ctx, \"instance/service-accounts/\"+serviceAccount+\"/email\")\n}\n\n// ExternalIP returns the instance's primary external (public) IP address.\n//\n// Deprecated: Please use the context aware variant [Client.ExternalIPWithContext].\nfunc (c *Client) ExternalIP() (string, error) {\n\treturn c.ExternalIPWithContext(context.Background())\n}\n\n// ExternalIPWithContext returns the instance's primary external (public) IP address.\nfunc (c *Client) ExternalIPWithContext(ctx context.Context) (string, error) {\n\treturn c.getTrimmed(ctx, \"instance/network-interfaces/0/access-configs/0/external-ip\")\n}\n\n// Hostname returns the instance's hostname. This will be of the form\n// \"<instanceID>.c.<projID>.internal\".\n//\n// Deprecated: Please use the context aware variant [Client.HostnameWithContext].\nfunc (c *Client) Hostname() (string, error) {\n\treturn c.HostnameWithContext(context.Background())\n}\n\n// HostnameWithContext returns the instance's hostname. This will be of the form\n// \"<instanceID>.c.<projID>.internal\".\nfunc (c *Client) HostnameWithContext(ctx context.Context) (string, error) {\n\treturn c.getTrimmed(ctx, \"instance/hostname\")\n}\n\n// InstanceTags returns the list of user-defined instance tags.\n//\n// Deprecated: Please use the context aware variant [Client.InstanceTagsWithContext].\nfunc (c *Client) InstanceTags() ([]string, error) {\n\treturn c.InstanceTagsWithContext(context.Background())\n}\n\n// InstanceTagsWithContext returns the list of user-defined instance tags,\n// assigned when initially creating a GCE instance.\nfunc (c *Client) InstanceTagsWithContext(ctx context.Context) ([]string, error) {\n\tvar s []string\n\tj, err := c.GetWithContext(ctx, \"instance/tags\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif err := json.NewDecoder(strings.NewReader(j)).Decode(&s); err != nil {\n\t\treturn nil, err\n\t}\n\treturn s, nil\n}\n\n// InstanceName returns the current VM's instance ID string.\n//\n// Deprecated: Please use the context aware variant [Client.InstanceNameWithContext].\nfunc (c *Client) InstanceName() (string, error) {\n\treturn c.InstanceNameWithContext(context.Background())\n}\n\n// InstanceNameWithContext returns the current VM's instance ID string.\nfunc (c *Client) InstanceNameWithContext(ctx context.Context) (string, error) {\n\treturn c.getTrimmed(ctx, \"instance/name\")\n}\n\n// Zone returns the current VM's zone, such as \"us-central1-b\".\n//\n// Deprecated: Please use the context aware variant [Client.ZoneWithContext].\nfunc (c *Client) Zone() (string, error) {\n\treturn c.ZoneWithContext(context.Background())\n}\n\n// ZoneWithContext returns the current VM's zone, such as \"us-central1-b\".\nfunc (c *Client) ZoneWithContext(ctx context.Context) (string, error) {\n\tzone, err := c.getTrimmed(ctx, \"instance/zone\")\n\t// zone is of the form \"projects/<projNum>/zones/<zoneName>\".\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn zone[strings.LastIndex(zone, \"/\")+1:], nil\n}\n\n// InstanceAttributes returns the list of user-defined attributes,\n// assigned when initially creating a GCE VM instance. The value of an\n// attribute can be obtained with InstanceAttributeValue.\n//\n// Deprecated: Please use the context aware variant [Client.InstanceAttributesWithContext].\nfunc (c *Client) InstanceAttributes() ([]string, error) {\n\treturn c.InstanceAttributesWithContext(context.Background())\n}\n\n// InstanceAttributesWithContext returns the list of user-defined attributes,\n// assigned when initially creating a GCE VM instance. The value of an\n// attribute can be obtained with InstanceAttributeValue.\nfunc (c *Client) InstanceAttributesWithContext(ctx context.Context) ([]string, error) {\n\treturn c.lines(ctx, \"instance/attributes/\")\n}\n\n// ProjectAttributes returns the list of user-defined attributes\n// applying to the project as a whole, not just this VM.  The value of\n// an attribute can be obtained with ProjectAttributeValue.\n//\n// Deprecated: Please use the context aware variant [Client.ProjectAttributesWithContext].\nfunc (c *Client) ProjectAttributes() ([]string, error) {\n\treturn c.ProjectAttributesWithContext(context.Background())\n}\n\n// ProjectAttributesWithContext returns the list of user-defined attributes\n// applying to the project as a whole, not just this VM.  The value of\n// an attribute can be obtained with ProjectAttributeValue.\nfunc (c *Client) ProjectAttributesWithContext(ctx context.Context) ([]string, error) {\n\treturn c.lines(ctx, \"project/attributes/\")\n}\n\n// InstanceAttributeValue returns the value of the provided VM\n// instance attribute.\n//\n// If the requested attribute is not defined, the returned error will\n// be of type NotDefinedError.\n//\n// InstanceAttributeValue may return (\"\", nil) if the attribute was\n// defined to be the empty string.\n//\n// Deprecated: Please use the context aware variant [Client.InstanceAttributeValueWithContext].\nfunc (c *Client) InstanceAttributeValue(attr string) (string, error) {\n\treturn c.InstanceAttributeValueWithContext(context.Background(), attr)\n}\n\n// InstanceAttributeValueWithContext returns the value of the provided VM\n// instance attribute.\n//\n// If the requested attribute is not defined, the returned error will\n// be of type NotDefinedError.\n//\n// InstanceAttributeValue may return (\"\", nil) if the attribute was\n// defined to be the empty string.\nfunc (c *Client) InstanceAttributeValueWithContext(ctx context.Context, attr string) (string, error) {\n\treturn c.GetWithContext(ctx, \"instance/attributes/\"+attr)\n}\n\n// ProjectAttributeValue returns the value of the provided\n// project attribute.\n//\n// If the requested attribute is not defined, the returned error will\n// be of type NotDefinedError.\n//\n// ProjectAttributeValue may return (\"\", nil) if the attribute was\n// defined to be the empty string.\n//\n// Deprecated: Please use the context aware variant [Client.ProjectAttributeValueWithContext].\nfunc (c *Client) ProjectAttributeValue(attr string) (string, error) {\n\treturn c.ProjectAttributeValueWithContext(context.Background(), attr)\n}\n\n// ProjectAttributeValueWithContext returns the value of the provided\n// project attribute.\n//\n// If the requested attribute is not defined, the returned error will\n// be of type NotDefinedError.\n//\n// ProjectAttributeValue may return (\"\", nil) if the attribute was\n// defined to be the empty string.\nfunc (c *Client) ProjectAttributeValueWithContext(ctx context.Context, attr string) (string, error) {\n\treturn c.GetWithContext(ctx, \"project/attributes/\"+attr)\n}\n\n// Scopes returns the service account scopes for the given account.\n// The account may be empty or the string \"default\" to use the instance's\n// main account.\n//\n// Deprecated: Please use the context aware variant [Client.ScopesWithContext].\nfunc (c *Client) Scopes(serviceAccount string) ([]string, error) {\n\treturn c.ScopesWithContext(context.Background(), serviceAccount)\n}\n\n// ScopesWithContext returns the service account scopes for the given account.\n// The account may be empty or the string \"default\" to use the instance's\n// main account.\nfunc (c *Client) ScopesWithContext(ctx context.Context, serviceAccount string) ([]string, error) {\n\tif serviceAccount == \"\" {\n\t\tserviceAccount = \"default\"\n\t}\n\treturn c.lines(ctx, \"instance/service-accounts/\"+serviceAccount+\"/scopes\")\n}\n\n// Subscribe subscribes to a value from the metadata service.\n// The suffix is appended to \"http://${GCE_METADATA_HOST}/computeMetadata/v1/\".\n// The suffix may contain query parameters.\n//\n// Deprecated: Please use the context aware variant [Client.SubscribeWithContext].\nfunc (c *Client) Subscribe(suffix string, fn func(v string, ok bool) error) error {\n\treturn c.SubscribeWithContext(context.Background(), suffix, func(ctx context.Context, v string, ok bool) error { return fn(v, ok) })\n}\n\n// SubscribeWithContext subscribes to a value from the metadata service.\n// The suffix is appended to \"http://${GCE_METADATA_HOST}/computeMetadata/v1/\".\n// The suffix may contain query parameters.\n//\n// SubscribeWithContext calls fn with the latest metadata value indicated by the\n// provided suffix. If the metadata value is deleted, fn is called with the\n// empty string and ok false. Subscribe blocks until fn returns a non-nil error\n// or the value is deleted. Subscribe returns the error value returned from the\n// last call to fn, which may be nil when ok == false.\nfunc (c *Client) SubscribeWithContext(ctx context.Context, suffix string, fn func(ctx context.Context, v string, ok bool) error) error {\n\tconst failedSubscribeSleep = time.Second * 5\n\n\t// First check to see if the metadata value exists at all.\n\tval, lastETag, err := c.getETag(ctx, suffix)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := fn(ctx, val, true); err != nil {\n\t\treturn err\n\t}\n\n\tok := true\n\tif strings.ContainsRune(suffix, '?') {\n\t\tsuffix += \"&wait_for_change=true&last_etag=\"\n\t} else {\n\t\tsuffix += \"?wait_for_change=true&last_etag=\"\n\t}\n\tfor {\n\t\tval, etag, err := c.getETag(ctx, suffix+url.QueryEscape(lastETag))\n\t\tif err != nil {\n\t\t\tif _, deleted := err.(NotDefinedError); !deleted {\n\t\t\t\ttime.Sleep(failedSubscribeSleep)\n\t\t\t\tcontinue // Retry on other errors.\n\t\t\t}\n\t\t\tok = false\n\t\t}\n\t\tlastETag = etag\n\n\t\tif err := fn(ctx, val, ok); err != nil || !ok {\n\t\t\treturn err\n\t\t}\n\t}\n}\n\n// Error contains an error response from the server.\ntype Error struct {\n\t// Code is the HTTP response status code.\n\tCode int\n\t// Message is the server response message.\n\tMessage string\n}\n\nfunc (e *Error) Error() string {\n\treturn fmt.Sprintf(\"compute: Received %d `%s`\", e.Code, e.Message)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/compute/metadata/retry.go",
    "content": "// Copyright 2021 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage metadata\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"math/rand\"\n\t\"net/http\"\n\t\"time\"\n)\n\nconst (\n\tmaxRetryAttempts = 5\n)\n\nvar (\n\tsyscallRetryable = func(error) bool { return false }\n)\n\n// defaultBackoff is basically equivalent to gax.Backoff without the need for\n// the dependency.\ntype defaultBackoff struct {\n\tmax time.Duration\n\tmul float64\n\tcur time.Duration\n}\n\nfunc (b *defaultBackoff) Pause() time.Duration {\n\td := time.Duration(1 + rand.Int63n(int64(b.cur)))\n\tb.cur = time.Duration(float64(b.cur) * b.mul)\n\tif b.cur > b.max {\n\t\tb.cur = b.max\n\t}\n\treturn d\n}\n\n// sleep is the equivalent of gax.Sleep without the need for the dependency.\nfunc sleep(ctx context.Context, d time.Duration) error {\n\tt := time.NewTimer(d)\n\tselect {\n\tcase <-ctx.Done():\n\t\tt.Stop()\n\t\treturn ctx.Err()\n\tcase <-t.C:\n\t\treturn nil\n\t}\n}\n\nfunc newRetryer() *metadataRetryer {\n\treturn &metadataRetryer{bo: &defaultBackoff{\n\t\tcur: 100 * time.Millisecond,\n\t\tmax: 30 * time.Second,\n\t\tmul: 2,\n\t}}\n}\n\ntype backoff interface {\n\tPause() time.Duration\n}\n\ntype metadataRetryer struct {\n\tbo       backoff\n\tattempts int\n}\n\nfunc (r *metadataRetryer) Retry(status int, err error) (time.Duration, bool) {\n\tif status == http.StatusOK {\n\t\treturn 0, false\n\t}\n\tretryOk := shouldRetry(status, err)\n\tif !retryOk {\n\t\treturn 0, false\n\t}\n\tif r.attempts == maxRetryAttempts {\n\t\treturn 0, false\n\t}\n\tr.attempts++\n\treturn r.bo.Pause(), true\n}\n\nfunc shouldRetry(status int, err error) bool {\n\tif 500 <= status && status <= 599 {\n\t\treturn true\n\t}\n\tif err == io.ErrUnexpectedEOF {\n\t\treturn true\n\t}\n\t// Transient network errors should be retried.\n\tif syscallRetryable(err) {\n\t\treturn true\n\t}\n\tif err, ok := err.(interface{ Temporary() bool }); ok {\n\t\tif err.Temporary() {\n\t\t\treturn true\n\t\t}\n\t}\n\tif err, ok := err.(interface{ Unwrap() error }); ok {\n\t\treturn shouldRetry(status, err.Unwrap())\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/compute/metadata/retry_linux.go",
    "content": "// Copyright 2021 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n//go:build linux\n// +build linux\n\npackage metadata\n\nimport (\n\t\"errors\"\n\t\"syscall\"\n)\n\nfunc init() {\n\t// Initialize syscallRetryable to return true on transient socket-level\n\t// errors. These errors are specific to Linux.\n\tsyscallRetryable = func(err error) bool {\n\t\treturn errors.Is(err, syscall.ECONNRESET) || errors.Is(err, syscall.ECONNREFUSED)\n\t}\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/compute/metadata/syscheck.go",
    "content": "// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n//go:build !windows && !linux\n\npackage metadata\n\n// systemInfoSuggestsGCE reports whether the local system (without\n// doing network requests) suggests that we're running on GCE. If this\n// returns true, testOnGCE tries a bit harder to reach its metadata\n// server.\n//\n// NOTE: systemInfoSuggestsGCE is assigned to a varible for test stubbing purposes.\nvar systemInfoSuggestsGCE = func() bool {\n\t// We don't currently have checks for other GOOS\n\treturn false\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/compute/metadata/syscheck_linux.go",
    "content": "// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n//go:build linux\n\npackage metadata\n\nimport (\n\t\"os\"\n\t\"strings\"\n)\n\n// NOTE: systemInfoSuggestsGCE is assigned to a varible for test stubbing purposes.\nvar systemInfoSuggestsGCE = func() bool {\n\tb, _ := os.ReadFile(\"/sys/class/dmi/id/product_name\")\n\n\tname := strings.TrimSpace(string(b))\n\treturn name == \"Google\" || name == \"Google Compute Engine\"\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/compute/metadata/syscheck_windows.go",
    "content": "// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n//go:build windows\n\npackage metadata\n\nimport (\n\t\"strings\"\n\n\t\"golang.org/x/sys/windows/registry\"\n)\n\n// NOTE: systemInfoSuggestsGCE is assigned to a varible for test stubbing purposes.\nvar systemInfoSuggestsGCE = func() bool {\n\tk, err := registry.OpenKey(registry.LOCAL_MACHINE, `SYSTEM\\HardwareConfig\\Current`, registry.QUERY_VALUE)\n\tif err != nil {\n\t\treturn false\n\t}\n\tdefer k.Close()\n\n\ts, _, err := k.GetStringValue(\"SystemProductName\")\n\tif err != nil {\n\t\treturn false\n\t}\n\ts = strings.TrimSpace(s)\n\treturn strings.HasPrefix(s, \"Google\")\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/iam/CHANGES.md",
    "content": "# Changes\n\n\n## [1.5.2](https://github.com/googleapis/google-cloud-go/compare/iam/v1.5.1...iam/v1.5.2) (2025-04-15)\n\n\n### Bug Fixes\n\n* **iam:** Update google.golang.org/api to 0.229.0 ([3319672](https://github.com/googleapis/google-cloud-go/commit/3319672f3dba84a7150772ccb5433e02dab7e201))\n\n## [1.5.1](https://github.com/googleapis/google-cloud-go/compare/iam/v1.5.0...iam/v1.5.1) (2025-04-15)\n\n\n### Documentation\n\n* **iam:** Formatting update for ListPolicyBindingsRequest ([dfdf404](https://github.com/googleapis/google-cloud-go/commit/dfdf404138728724aa6305c5c465ecc6fe5b1264))\n* **iam:** Minor doc update for ListPrincipalAccessBoundaryPoliciesResponse ([20f762c](https://github.com/googleapis/google-cloud-go/commit/20f762c528726a3f038d3e1f37e8a4952118badf))\n* **iam:** Minor doc update for ListPrincipalAccessBoundaryPoliciesResponse ([20f762c](https://github.com/googleapis/google-cloud-go/commit/20f762c528726a3f038d3e1f37e8a4952118badf))\n\n## [1.5.0](https://github.com/googleapis/google-cloud-go/compare/iam/v1.4.2...iam/v1.5.0) (2025-03-31)\n\n\n### Features\n\n* **iam:** New client(s) ([#11933](https://github.com/googleapis/google-cloud-go/issues/11933)) ([d5cb2e5](https://github.com/googleapis/google-cloud-go/commit/d5cb2e58334c6963cc46885f565fe3b19c52cb63))\n\n## [1.4.2](https://github.com/googleapis/google-cloud-go/compare/iam/v1.4.1...iam/v1.4.2) (2025-03-13)\n\n\n### Bug Fixes\n\n* **iam:** Update golang.org/x/net to 0.37.0 ([1144978](https://github.com/googleapis/google-cloud-go/commit/11449782c7fb4896bf8b8b9cde8e7441c84fb2fd))\n\n## [1.4.1](https://github.com/googleapis/google-cloud-go/compare/iam/v1.4.0...iam/v1.4.1) (2025-03-06)\n\n\n### Bug Fixes\n\n* **iam:** Fix out-of-sync version.go ([28f0030](https://github.com/googleapis/google-cloud-go/commit/28f00304ebb13abfd0da2f45b9b79de093cca1ec))\n\n## [1.4.0](https://github.com/googleapis/google-cloud-go/compare/iam/v1.3.1...iam/v1.4.0) (2025-02-12)\n\n\n### Features\n\n* **iam/admin:** Regenerate client ([#11570](https://github.com/googleapis/google-cloud-go/issues/11570)) ([eab87d7](https://github.com/googleapis/google-cloud-go/commit/eab87d73bea884c636ec88f03b9aa90102a2833f)), refs [#8219](https://github.com/googleapis/google-cloud-go/issues/8219)\n\n## [1.3.1](https://github.com/googleapis/google-cloud-go/compare/iam/v1.3.0...iam/v1.3.1) (2025-01-02)\n\n\n### Bug Fixes\n\n* **iam:** Update golang.org/x/net to v0.33.0 ([e9b0b69](https://github.com/googleapis/google-cloud-go/commit/e9b0b69644ea5b276cacff0a707e8a5e87efafc9))\n\n## [1.3.0](https://github.com/googleapis/google-cloud-go/compare/iam/v1.2.2...iam/v1.3.0) (2024-12-04)\n\n\n### Features\n\n* **iam:** Add ResourcePolicyMember to google/iam/v1 ([8dedb87](https://github.com/googleapis/google-cloud-go/commit/8dedb878c070cc1e92d62bb9b32358425e3ceffb))\n\n## [1.2.2](https://github.com/googleapis/google-cloud-go/compare/iam/v1.2.1...iam/v1.2.2) (2024-10-23)\n\n\n### Bug Fixes\n\n* **iam:** Update google.golang.org/api to v0.203.0 ([8bb87d5](https://github.com/googleapis/google-cloud-go/commit/8bb87d56af1cba736e0fe243979723e747e5e11e))\n* **iam:** WARNING: On approximately Dec 1, 2024, an update to Protobuf will change service registration function signatures to use an interface instead of a concrete type in generated .pb.go files. This change is expected to affect very few if any users of this client library. For more information, see https://togithub.com/googleapis/google-cloud-go/issues/11020. ([8bb87d5](https://github.com/googleapis/google-cloud-go/commit/8bb87d56af1cba736e0fe243979723e747e5e11e))\n\n## [1.2.1](https://github.com/googleapis/google-cloud-go/compare/iam/v1.2.0...iam/v1.2.1) (2024-09-12)\n\n\n### Bug Fixes\n\n* **iam:** Bump dependencies ([2ddeb15](https://github.com/googleapis/google-cloud-go/commit/2ddeb1544a53188a7592046b98913982f1b0cf04))\n\n## [1.2.0](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.13...iam/v1.2.0) (2024-08-20)\n\n\n### Features\n\n* **iam:** Add support for Go 1.23 iterators ([84461c0](https://github.com/googleapis/google-cloud-go/commit/84461c0ba464ec2f951987ba60030e37c8a8fc18))\n\n## [1.1.13](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.12...iam/v1.1.13) (2024-08-08)\n\n\n### Bug Fixes\n\n* **iam:** Update google.golang.org/api to v0.191.0 ([5b32644](https://github.com/googleapis/google-cloud-go/commit/5b32644eb82eb6bd6021f80b4fad471c60fb9d73))\n\n## [1.1.12](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.11...iam/v1.1.12) (2024-07-24)\n\n\n### Bug Fixes\n\n* **iam:** Update dependencies ([257c40b](https://github.com/googleapis/google-cloud-go/commit/257c40bd6d7e59730017cf32bda8823d7a232758))\n\n## [1.1.11](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.10...iam/v1.1.11) (2024-07-10)\n\n\n### Bug Fixes\n\n* **iam:** Bump google.golang.org/grpc@v1.64.1 ([8ecc4e9](https://github.com/googleapis/google-cloud-go/commit/8ecc4e9622e5bbe9b90384d5848ab816027226c5))\n\n## [1.1.10](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.9...iam/v1.1.10) (2024-07-01)\n\n\n### Bug Fixes\n\n* **iam:** Bump google.golang.org/api@v0.187.0 ([8fa9e39](https://github.com/googleapis/google-cloud-go/commit/8fa9e398e512fd8533fd49060371e61b5725a85b))\n\n## [1.1.9](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.8...iam/v1.1.9) (2024-06-26)\n\n\n### Bug Fixes\n\n* **iam:** Enable new auth lib ([b95805f](https://github.com/googleapis/google-cloud-go/commit/b95805f4c87d3e8d10ea23bd7a2d68d7a4157568))\n\n## [1.1.8](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.7...iam/v1.1.8) (2024-05-01)\n\n\n### Bug Fixes\n\n* **iam:** Bump x/net to v0.24.0 ([ba31ed5](https://github.com/googleapis/google-cloud-go/commit/ba31ed5fda2c9664f2e1cf972469295e63deb5b4))\n\n## [1.1.7](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.6...iam/v1.1.7) (2024-03-14)\n\n\n### Bug Fixes\n\n* **iam:** Update protobuf dep to v1.33.0 ([30b038d](https://github.com/googleapis/google-cloud-go/commit/30b038d8cac0b8cd5dd4761c87f3f298760dd33a))\n\n## [1.1.6](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.5...iam/v1.1.6) (2024-01-30)\n\n\n### Bug Fixes\n\n* **iam:** Enable universe domain resolution options ([fd1d569](https://github.com/googleapis/google-cloud-go/commit/fd1d56930fa8a747be35a224611f4797b8aeb698))\n\n## [1.1.5](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.4...iam/v1.1.5) (2023-11-01)\n\n\n### Bug Fixes\n\n* **iam:** Bump google.golang.org/api to v0.149.0 ([8d2ab9f](https://github.com/googleapis/google-cloud-go/commit/8d2ab9f320a86c1c0fab90513fc05861561d0880))\n\n## [1.1.4](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.3...iam/v1.1.4) (2023-10-26)\n\n\n### Bug Fixes\n\n* **iam:** Update grpc-go to v1.59.0 ([81a97b0](https://github.com/googleapis/google-cloud-go/commit/81a97b06cb28b25432e4ece595c55a9857e960b7))\n\n## [1.1.3](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.2...iam/v1.1.3) (2023-10-12)\n\n\n### Bug Fixes\n\n* **iam:** Update golang.org/x/net to v0.17.0 ([174da47](https://github.com/googleapis/google-cloud-go/commit/174da47254fefb12921bbfc65b7829a453af6f5d))\n\n## [1.1.2](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.1...iam/v1.1.2) (2023-08-08)\n\n\n### Documentation\n\n* **iam:** Minor formatting ([b4349cc](https://github.com/googleapis/google-cloud-go/commit/b4349cc507870ff8629bbc07de578b63bb889626))\n\n## [1.1.1](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.0...iam/v1.1.1) (2023-06-20)\n\n\n### Bug Fixes\n\n* **iam:** REST query UpdateMask bug ([df52820](https://github.com/googleapis/google-cloud-go/commit/df52820b0e7721954809a8aa8700b93c5662dc9b))\n\n## [1.1.0](https://github.com/googleapis/google-cloud-go/compare/iam/v1.0.1...iam/v1.1.0) (2023-05-30)\n\n\n### Features\n\n* **iam:** Update all direct dependencies ([b340d03](https://github.com/googleapis/google-cloud-go/commit/b340d030f2b52a4ce48846ce63984b28583abde6))\n\n## [1.0.1](https://github.com/googleapis/google-cloud-go/compare/iam/v1.0.0...iam/v1.0.1) (2023-05-08)\n\n\n### Bug Fixes\n\n* **iam:** Update grpc to v1.55.0 ([1147ce0](https://github.com/googleapis/google-cloud-go/commit/1147ce02a990276ca4f8ab7a1ab65c14da4450ef))\n\n## [1.0.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.13.0...iam/v1.0.0) (2023-04-04)\n\n\n### Features\n\n* **iam:** Promote to GA ([#7627](https://github.com/googleapis/google-cloud-go/issues/7627)) ([b351906](https://github.com/googleapis/google-cloud-go/commit/b351906a10e17a02d7f7e2551bc1585fd9dc3742))\n\n## [0.13.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.12.0...iam/v0.13.0) (2023-03-15)\n\n\n### Features\n\n* **iam:** Update iam and longrunning deps ([91a1f78](https://github.com/googleapis/google-cloud-go/commit/91a1f784a109da70f63b96414bba8a9b4254cddd))\n\n## [0.12.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.11.0...iam/v0.12.0) (2023-02-17)\n\n\n### Features\n\n* **iam:** Migrate to new stubs ([a61ddcd](https://github.com/googleapis/google-cloud-go/commit/a61ddcd3041c7af4a15109dc4431f9b327c497fb))\n\n## [0.11.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.10.0...iam/v0.11.0) (2023-02-16)\n\n\n### Features\n\n* **iam:** Start generating proto stubs ([970d763](https://github.com/googleapis/google-cloud-go/commit/970d763531b54b2bc75d7ff26a20b6e05150cab8))\n\n## [0.10.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.9.0...iam/v0.10.0) (2023-01-04)\n\n\n### Features\n\n* **iam:** Add REST client ([06a54a1](https://github.com/googleapis/google-cloud-go/commit/06a54a16a5866cce966547c51e203b9e09a25bc0))\n\n## [0.9.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.8.0...iam/v0.9.0) (2022-12-15)\n\n\n### Features\n\n* **iam:** Rewrite iam sigs and update proto import ([#7137](https://github.com/googleapis/google-cloud-go/issues/7137)) ([ad67fa3](https://github.com/googleapis/google-cloud-go/commit/ad67fa36c263c161226f7fecbab5221592374dca))\n\n## [0.8.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.7.0...iam/v0.8.0) (2022-12-05)\n\n\n### Features\n\n* **iam:** Start generating and refresh some libraries ([#7089](https://github.com/googleapis/google-cloud-go/issues/7089)) ([a9045ff](https://github.com/googleapis/google-cloud-go/commit/a9045ff191a711089c37f1d94a63522d9939ce38))\n\n## [0.7.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.6.0...iam/v0.7.0) (2022-11-03)\n\n\n### Features\n\n* **iam:** rewrite signatures in terms of new location ([3c4b2b3](https://github.com/googleapis/google-cloud-go/commit/3c4b2b34565795537aac1661e6af2442437e34ad))\n\n## [0.6.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.5.0...iam/v0.6.0) (2022-10-25)\n\n\n### Features\n\n* **iam:** start generating stubs dir ([de2d180](https://github.com/googleapis/google-cloud-go/commit/de2d18066dc613b72f6f8db93ca60146dabcfdcc))\n\n## [0.5.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.4.0...iam/v0.5.0) (2022-09-28)\n\n\n### Features\n\n* **iam:** remove ListApplicablePolicies ([52dddd1](https://github.com/googleapis/google-cloud-go/commit/52dddd1ed89fbe77e1859311c3b993a77a82bfc7))\n\n## [0.4.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.3.0...iam/v0.4.0) (2022-09-06)\n\n\n### Features\n\n* **iam:** start generating apiv2 ([#6605](https://github.com/googleapis/google-cloud-go/issues/6605)) ([a6004e7](https://github.com/googleapis/google-cloud-go/commit/a6004e762f782869cd85688937475744f7b17e50))\n\n## [0.3.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.2.0...iam/v0.3.0) (2022-02-23)\n\n\n### Features\n\n* **iam:** set versionClient to module version ([55f0d92](https://github.com/googleapis/google-cloud-go/commit/55f0d92bf112f14b024b4ab0076c9875a17423c9))\n\n## [0.2.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.1.1...iam/v0.2.0) (2022-02-14)\n\n\n### Features\n\n* **iam:** add file for tracking version ([17b36ea](https://github.com/googleapis/google-cloud-go/commit/17b36ead42a96b1a01105122074e65164357519e))\n\n### [0.1.1](https://www.github.com/googleapis/google-cloud-go/compare/iam/v0.1.0...iam/v0.1.1) (2022-01-14)\n\n\n### Bug Fixes\n\n* **iam:** run formatter ([#5277](https://www.github.com/googleapis/google-cloud-go/issues/5277)) ([8682e4e](https://www.github.com/googleapis/google-cloud-go/commit/8682e4ed57a4428a659fbc225f56c91767e2a4a9))\n\n## v0.1.0\n\nThis is the first tag to carve out iam as its own module. See\n[Add a module to a multi-module repository](https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository).\n"
  },
  {
    "path": "vendor/cloud.google.com/go/iam/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/cloud.google.com/go/iam/README.md",
    "content": "# IAM API\n\n[![Go Reference](https://pkg.go.dev/badge/cloud.google.com/go/iam.svg)](https://pkg.go.dev/cloud.google.com/go/iam)\n\nGo Client Library for IAM API.\n\n## Install\n\n```bash\ngo get cloud.google.com/go/iam\n```\n\n## Stability\n\nThe stability of this module is indicated by SemVer.\n\nHowever, a `v1+` module may have breaking changes in two scenarios:\n\n* Packages with `alpha` or `beta` in the import path\n* The GoDoc has an explicit stability disclaimer (for example, for an experimental feature).\n\n## Go Version Support\n\nSee the [Go Versions Supported](https://github.com/googleapis/google-cloud-go#go-versions-supported)\nsection in the root directory's README.\n\n## Authorization\n\nSee the [Authorization](https://github.com/googleapis/google-cloud-go#authorization)\nsection in the root directory's README.\n\n## Contributing\n\nContributions are welcome. Please, see the [CONTRIBUTING](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/main/CONTRIBUTING.md)\ndocument for details.\n\nPlease note that this project is released with a Contributor Code of Conduct.\nBy participating in this project you agree to abide by its terms. See\n[Contributor Code of Conduct](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/main/CONTRIBUTING.md#contributor-code-of-conduct)\nfor more information.\n"
  },
  {
    "path": "vendor/cloud.google.com/go/iam/apiv1/iampb/iam_policy.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/iam/v1/iam_policy.proto\n\npackage iampb\n\nimport (\n\tcontext \"context\"\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tfieldmaskpb \"google.golang.org/protobuf/types/known/fieldmaskpb\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// Request message for `SetIamPolicy` method.\ntype SetIamPolicyRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// REQUIRED: The resource for which the policy is being specified.\n\t// See the operation documentation for the appropriate value for this field.\n\tResource string `protobuf:\"bytes,1,opt,name=resource,proto3\" json:\"resource,omitempty\"`\n\t// REQUIRED: The complete policy to be applied to the `resource`. The size of\n\t// the policy is limited to a few 10s of KB. An empty policy is a\n\t// valid policy but certain Cloud Platform services (such as Projects)\n\t// might reject them.\n\tPolicy *Policy `protobuf:\"bytes,2,opt,name=policy,proto3\" json:\"policy,omitempty\"`\n\t// OPTIONAL: A FieldMask specifying which fields of the policy to modify. Only\n\t// the fields in the mask will be modified. If no mask is provided, the\n\t// following default mask is used:\n\t//\n\t// `paths: \"bindings, etag\"`\n\tUpdateMask *fieldmaskpb.FieldMask `protobuf:\"bytes,3,opt,name=update_mask,json=updateMask,proto3\" json:\"update_mask,omitempty\"`\n}\n\nfunc (x *SetIamPolicyRequest) Reset() {\n\t*x = SetIamPolicyRequest{}\n\tmi := &file_google_iam_v1_iam_policy_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *SetIamPolicyRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SetIamPolicyRequest) ProtoMessage() {}\n\nfunc (x *SetIamPolicyRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_iam_v1_iam_policy_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SetIamPolicyRequest.ProtoReflect.Descriptor instead.\nfunc (*SetIamPolicyRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_iam_v1_iam_policy_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *SetIamPolicyRequest) GetResource() string {\n\tif x != nil {\n\t\treturn x.Resource\n\t}\n\treturn \"\"\n}\n\nfunc (x *SetIamPolicyRequest) GetPolicy() *Policy {\n\tif x != nil {\n\t\treturn x.Policy\n\t}\n\treturn nil\n}\n\nfunc (x *SetIamPolicyRequest) GetUpdateMask() *fieldmaskpb.FieldMask {\n\tif x != nil {\n\t\treturn x.UpdateMask\n\t}\n\treturn nil\n}\n\n// Request message for `GetIamPolicy` method.\ntype GetIamPolicyRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// REQUIRED: The resource for which the policy is being requested.\n\t// See the operation documentation for the appropriate value for this field.\n\tResource string `protobuf:\"bytes,1,opt,name=resource,proto3\" json:\"resource,omitempty\"`\n\t// OPTIONAL: A `GetPolicyOptions` object for specifying options to\n\t// `GetIamPolicy`.\n\tOptions *GetPolicyOptions `protobuf:\"bytes,2,opt,name=options,proto3\" json:\"options,omitempty\"`\n}\n\nfunc (x *GetIamPolicyRequest) Reset() {\n\t*x = GetIamPolicyRequest{}\n\tmi := &file_google_iam_v1_iam_policy_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *GetIamPolicyRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetIamPolicyRequest) ProtoMessage() {}\n\nfunc (x *GetIamPolicyRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_iam_v1_iam_policy_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetIamPolicyRequest.ProtoReflect.Descriptor instead.\nfunc (*GetIamPolicyRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_iam_v1_iam_policy_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetIamPolicyRequest) GetResource() string {\n\tif x != nil {\n\t\treturn x.Resource\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetIamPolicyRequest) GetOptions() *GetPolicyOptions {\n\tif x != nil {\n\t\treturn x.Options\n\t}\n\treturn nil\n}\n\n// Request message for `TestIamPermissions` method.\ntype TestIamPermissionsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// REQUIRED: The resource for which the policy detail is being requested.\n\t// See the operation documentation for the appropriate value for this field.\n\tResource string `protobuf:\"bytes,1,opt,name=resource,proto3\" json:\"resource,omitempty\"`\n\t// The set of permissions to check for the `resource`. Permissions with\n\t// wildcards (such as '*' or 'storage.*') are not allowed. For more\n\t// information see\n\t// [IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).\n\tPermissions []string `protobuf:\"bytes,2,rep,name=permissions,proto3\" json:\"permissions,omitempty\"`\n}\n\nfunc (x *TestIamPermissionsRequest) Reset() {\n\t*x = TestIamPermissionsRequest{}\n\tmi := &file_google_iam_v1_iam_policy_proto_msgTypes[2]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *TestIamPermissionsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*TestIamPermissionsRequest) ProtoMessage() {}\n\nfunc (x *TestIamPermissionsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_iam_v1_iam_policy_proto_msgTypes[2]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use TestIamPermissionsRequest.ProtoReflect.Descriptor instead.\nfunc (*TestIamPermissionsRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_iam_v1_iam_policy_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *TestIamPermissionsRequest) GetResource() string {\n\tif x != nil {\n\t\treturn x.Resource\n\t}\n\treturn \"\"\n}\n\nfunc (x *TestIamPermissionsRequest) GetPermissions() []string {\n\tif x != nil {\n\t\treturn x.Permissions\n\t}\n\treturn nil\n}\n\n// Response message for `TestIamPermissions` method.\ntype TestIamPermissionsResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// A subset of `TestPermissionsRequest.permissions` that the caller is\n\t// allowed.\n\tPermissions []string `protobuf:\"bytes,1,rep,name=permissions,proto3\" json:\"permissions,omitempty\"`\n}\n\nfunc (x *TestIamPermissionsResponse) Reset() {\n\t*x = TestIamPermissionsResponse{}\n\tmi := &file_google_iam_v1_iam_policy_proto_msgTypes[3]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *TestIamPermissionsResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*TestIamPermissionsResponse) ProtoMessage() {}\n\nfunc (x *TestIamPermissionsResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_iam_v1_iam_policy_proto_msgTypes[3]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use TestIamPermissionsResponse.ProtoReflect.Descriptor instead.\nfunc (*TestIamPermissionsResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_iam_v1_iam_policy_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *TestIamPermissionsResponse) GetPermissions() []string {\n\tif x != nil {\n\t\treturn x.Permissions\n\t}\n\treturn nil\n}\n\nvar File_google_iam_v1_iam_policy_proto protoreflect.FileDescriptor\n\nvar file_google_iam_v1_iam_policy_proto_rawDesc = []byte{\n\t0x0a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f,\n\t0x69, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x12, 0x0d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x1a,\n\t0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f,\n\t0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61,\n\t0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f,\n\t0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,\n\t0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76,\n\t0x31, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x1a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x70,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65,\n\t0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xad, 0x01,\n\t0x0a, 0x13, 0x53, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,\n\t0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x03, 0x0a,\n\t0x01, 0x2a, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x06,\n\t0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c,\n\t0x69, 0x63, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73,\n\t0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x77, 0x0a,\n\t0x13, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x03, 0x0a, 0x01,\n\t0x2a, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x6f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x69, 0x0a, 0x19, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61,\n\t0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x03, 0x0a, 0x01, 0x2a,\n\t0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x65,\n\t0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42,\n\t0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,\n\t0x73, 0x22, 0x3e, 0x0a, 0x1a, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d,\n\t0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,\n\t0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,\n\t0x73, 0x32, 0xb4, 0x03, 0x0a, 0x09, 0x49, 0x41, 0x4d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12,\n\t0x74, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12,\n\t0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e,\n\t0x53, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d,\n\t0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93,\n\t0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f,\n\t0x75, 0x72, 0x63, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x3a, 0x73, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x74, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69,\n\t0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69,\n\t0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31,\n\t0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x3a, 0x67,\n\t0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x9a, 0x01, 0x0a, 0x12,\n\t0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f,\n\t0x6e, 0x73, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e,\n\t0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73,\n\t0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73,\n\t0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52,\n\t0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a,\n\t0x01, 0x2a, 0x22, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,\n\t0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x3a, 0x74, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72,\n\t0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1e, 0xca, 0x41, 0x1b, 0x69, 0x61, 0x6d,\n\t0x2d, 0x6d, 0x65, 0x74, 0x61, 0x2d, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x42, 0x7c, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x49,\n\t0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a,\n\t0x29, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x69,\n\t0x61, 0x6d, 0x70, 0x62, 0x3b, 0x69, 0x61, 0x6d, 0x70, 0x62, 0xaa, 0x02, 0x13, 0x47, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x49, 0x61, 0x6d, 0x2e, 0x56, 0x31,\n\t0xca, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c,\n\t0x49, 0x61, 0x6d, 0x5c, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_iam_v1_iam_policy_proto_rawDescOnce sync.Once\n\tfile_google_iam_v1_iam_policy_proto_rawDescData = file_google_iam_v1_iam_policy_proto_rawDesc\n)\n\nfunc file_google_iam_v1_iam_policy_proto_rawDescGZIP() []byte {\n\tfile_google_iam_v1_iam_policy_proto_rawDescOnce.Do(func() {\n\t\tfile_google_iam_v1_iam_policy_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_iam_v1_iam_policy_proto_rawDescData)\n\t})\n\treturn file_google_iam_v1_iam_policy_proto_rawDescData\n}\n\nvar file_google_iam_v1_iam_policy_proto_msgTypes = make([]protoimpl.MessageInfo, 4)\nvar file_google_iam_v1_iam_policy_proto_goTypes = []any{\n\t(*SetIamPolicyRequest)(nil),        // 0: google.iam.v1.SetIamPolicyRequest\n\t(*GetIamPolicyRequest)(nil),        // 1: google.iam.v1.GetIamPolicyRequest\n\t(*TestIamPermissionsRequest)(nil),  // 2: google.iam.v1.TestIamPermissionsRequest\n\t(*TestIamPermissionsResponse)(nil), // 3: google.iam.v1.TestIamPermissionsResponse\n\t(*Policy)(nil),                     // 4: google.iam.v1.Policy\n\t(*fieldmaskpb.FieldMask)(nil),      // 5: google.protobuf.FieldMask\n\t(*GetPolicyOptions)(nil),           // 6: google.iam.v1.GetPolicyOptions\n}\nvar file_google_iam_v1_iam_policy_proto_depIdxs = []int32{\n\t4, // 0: google.iam.v1.SetIamPolicyRequest.policy:type_name -> google.iam.v1.Policy\n\t5, // 1: google.iam.v1.SetIamPolicyRequest.update_mask:type_name -> google.protobuf.FieldMask\n\t6, // 2: google.iam.v1.GetIamPolicyRequest.options:type_name -> google.iam.v1.GetPolicyOptions\n\t0, // 3: google.iam.v1.IAMPolicy.SetIamPolicy:input_type -> google.iam.v1.SetIamPolicyRequest\n\t1, // 4: google.iam.v1.IAMPolicy.GetIamPolicy:input_type -> google.iam.v1.GetIamPolicyRequest\n\t2, // 5: google.iam.v1.IAMPolicy.TestIamPermissions:input_type -> google.iam.v1.TestIamPermissionsRequest\n\t4, // 6: google.iam.v1.IAMPolicy.SetIamPolicy:output_type -> google.iam.v1.Policy\n\t4, // 7: google.iam.v1.IAMPolicy.GetIamPolicy:output_type -> google.iam.v1.Policy\n\t3, // 8: google.iam.v1.IAMPolicy.TestIamPermissions:output_type -> google.iam.v1.TestIamPermissionsResponse\n\t6, // [6:9] is the sub-list for method output_type\n\t3, // [3:6] is the sub-list for method input_type\n\t3, // [3:3] is the sub-list for extension type_name\n\t3, // [3:3] is the sub-list for extension extendee\n\t0, // [0:3] is the sub-list for field type_name\n}\n\nfunc init() { file_google_iam_v1_iam_policy_proto_init() }\nfunc file_google_iam_v1_iam_policy_proto_init() {\n\tif File_google_iam_v1_iam_policy_proto != nil {\n\t\treturn\n\t}\n\tfile_google_iam_v1_options_proto_init()\n\tfile_google_iam_v1_policy_proto_init()\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_iam_v1_iam_policy_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   4,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_google_iam_v1_iam_policy_proto_goTypes,\n\t\tDependencyIndexes: file_google_iam_v1_iam_policy_proto_depIdxs,\n\t\tMessageInfos:      file_google_iam_v1_iam_policy_proto_msgTypes,\n\t}.Build()\n\tFile_google_iam_v1_iam_policy_proto = out.File\n\tfile_google_iam_v1_iam_policy_proto_rawDesc = nil\n\tfile_google_iam_v1_iam_policy_proto_goTypes = nil\n\tfile_google_iam_v1_iam_policy_proto_depIdxs = nil\n}\n\n// Reference imports to suppress errors if they are not otherwise used.\nvar _ context.Context\nvar _ grpc.ClientConnInterface\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\nconst _ = grpc.SupportPackageIsVersion6\n\n// IAMPolicyClient is the client API for IAMPolicy service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.\ntype IAMPolicyClient interface {\n\t// Sets the access control policy on the specified resource. Replaces any\n\t// existing policy.\n\t//\n\t// Can return `NOT_FOUND`, `INVALID_ARGUMENT`, and `PERMISSION_DENIED` errors.\n\tSetIamPolicy(ctx context.Context, in *SetIamPolicyRequest, opts ...grpc.CallOption) (*Policy, error)\n\t// Gets the access control policy for a resource.\n\t// Returns an empty policy if the resource exists and does not have a policy\n\t// set.\n\tGetIamPolicy(ctx context.Context, in *GetIamPolicyRequest, opts ...grpc.CallOption) (*Policy, error)\n\t// Returns permissions that a caller has on the specified resource.\n\t// If the resource does not exist, this will return an empty set of\n\t// permissions, not a `NOT_FOUND` error.\n\t//\n\t// Note: This operation is designed to be used for building permission-aware\n\t// UIs and command-line tools, not for authorization checking. This operation\n\t// may \"fail open\" without warning.\n\tTestIamPermissions(ctx context.Context, in *TestIamPermissionsRequest, opts ...grpc.CallOption) (*TestIamPermissionsResponse, error)\n}\n\ntype iAMPolicyClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewIAMPolicyClient(cc grpc.ClientConnInterface) IAMPolicyClient {\n\treturn &iAMPolicyClient{cc}\n}\n\nfunc (c *iAMPolicyClient) SetIamPolicy(ctx context.Context, in *SetIamPolicyRequest, opts ...grpc.CallOption) (*Policy, error) {\n\tout := new(Policy)\n\terr := c.cc.Invoke(ctx, \"/google.iam.v1.IAMPolicy/SetIamPolicy\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *iAMPolicyClient) GetIamPolicy(ctx context.Context, in *GetIamPolicyRequest, opts ...grpc.CallOption) (*Policy, error) {\n\tout := new(Policy)\n\terr := c.cc.Invoke(ctx, \"/google.iam.v1.IAMPolicy/GetIamPolicy\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *iAMPolicyClient) TestIamPermissions(ctx context.Context, in *TestIamPermissionsRequest, opts ...grpc.CallOption) (*TestIamPermissionsResponse, error) {\n\tout := new(TestIamPermissionsResponse)\n\terr := c.cc.Invoke(ctx, \"/google.iam.v1.IAMPolicy/TestIamPermissions\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// IAMPolicyServer is the server API for IAMPolicy service.\ntype IAMPolicyServer interface {\n\t// Sets the access control policy on the specified resource. Replaces any\n\t// existing policy.\n\t//\n\t// Can return `NOT_FOUND`, `INVALID_ARGUMENT`, and `PERMISSION_DENIED` errors.\n\tSetIamPolicy(context.Context, *SetIamPolicyRequest) (*Policy, error)\n\t// Gets the access control policy for a resource.\n\t// Returns an empty policy if the resource exists and does not have a policy\n\t// set.\n\tGetIamPolicy(context.Context, *GetIamPolicyRequest) (*Policy, error)\n\t// Returns permissions that a caller has on the specified resource.\n\t// If the resource does not exist, this will return an empty set of\n\t// permissions, not a `NOT_FOUND` error.\n\t//\n\t// Note: This operation is designed to be used for building permission-aware\n\t// UIs and command-line tools, not for authorization checking. This operation\n\t// may \"fail open\" without warning.\n\tTestIamPermissions(context.Context, *TestIamPermissionsRequest) (*TestIamPermissionsResponse, error)\n}\n\n// UnimplementedIAMPolicyServer can be embedded to have forward compatible implementations.\ntype UnimplementedIAMPolicyServer struct {\n}\n\nfunc (*UnimplementedIAMPolicyServer) SetIamPolicy(context.Context, *SetIamPolicyRequest) (*Policy, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method SetIamPolicy not implemented\")\n}\nfunc (*UnimplementedIAMPolicyServer) GetIamPolicy(context.Context, *GetIamPolicyRequest) (*Policy, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetIamPolicy not implemented\")\n}\nfunc (*UnimplementedIAMPolicyServer) TestIamPermissions(context.Context, *TestIamPermissionsRequest) (*TestIamPermissionsResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method TestIamPermissions not implemented\")\n}\n\nfunc RegisterIAMPolicyServer(s *grpc.Server, srv IAMPolicyServer) {\n\ts.RegisterService(&_IAMPolicy_serviceDesc, srv)\n}\n\nfunc _IAMPolicy_SetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(SetIamPolicyRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(IAMPolicyServer).SetIamPolicy(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.iam.v1.IAMPolicy/SetIamPolicy\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(IAMPolicyServer).SetIamPolicy(ctx, req.(*SetIamPolicyRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _IAMPolicy_GetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetIamPolicyRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(IAMPolicyServer).GetIamPolicy(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.iam.v1.IAMPolicy/GetIamPolicy\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(IAMPolicyServer).GetIamPolicy(ctx, req.(*GetIamPolicyRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _IAMPolicy_TestIamPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(TestIamPermissionsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(IAMPolicyServer).TestIamPermissions(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.iam.v1.IAMPolicy/TestIamPermissions\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(IAMPolicyServer).TestIamPermissions(ctx, req.(*TestIamPermissionsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nvar _IAMPolicy_serviceDesc = grpc.ServiceDesc{\n\tServiceName: \"google.iam.v1.IAMPolicy\",\n\tHandlerType: (*IAMPolicyServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"SetIamPolicy\",\n\t\t\tHandler:    _IAMPolicy_SetIamPolicy_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetIamPolicy\",\n\t\t\tHandler:    _IAMPolicy_GetIamPolicy_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"TestIamPermissions\",\n\t\t\tHandler:    _IAMPolicy_TestIamPermissions_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"google/iam/v1/iam_policy.proto\",\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/iam/apiv1/iampb/options.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/iam/v1/options.proto\n\npackage iampb\n\nimport (\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// Encapsulates settings provided to GetIamPolicy.\ntype GetPolicyOptions struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Optional. The maximum policy version that will be used to format the\n\t// policy.\n\t//\n\t// Valid values are 0, 1, and 3. Requests specifying an invalid value will be\n\t// rejected.\n\t//\n\t// Requests for policies with any conditional role bindings must specify\n\t// version 3. Policies with no conditional role bindings may specify any valid\n\t// value or leave the field unset.\n\t//\n\t// The policy in the response might use the policy version that you specified,\n\t// or it might use a lower policy version. For example, if you specify version\n\t// 3, but the policy has no conditional role bindings, the response uses\n\t// version 1.\n\t//\n\t// To learn which resources support conditions in their IAM policies, see the\n\t// [IAM\n\t// documentation](https://cloud.google.com/iam/help/conditions/resource-policies).\n\tRequestedPolicyVersion int32 `protobuf:\"varint,1,opt,name=requested_policy_version,json=requestedPolicyVersion,proto3\" json:\"requested_policy_version,omitempty\"`\n}\n\nfunc (x *GetPolicyOptions) Reset() {\n\t*x = GetPolicyOptions{}\n\tmi := &file_google_iam_v1_options_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *GetPolicyOptions) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetPolicyOptions) ProtoMessage() {}\n\nfunc (x *GetPolicyOptions) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_iam_v1_options_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetPolicyOptions.ProtoReflect.Descriptor instead.\nfunc (*GetPolicyOptions) Descriptor() ([]byte, []int) {\n\treturn file_google_iam_v1_options_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *GetPolicyOptions) GetRequestedPolicyVersion() int32 {\n\tif x != nil {\n\t\treturn x.RequestedPolicyVersion\n\t}\n\treturn 0\n}\n\nvar File_google_iam_v1_options_proto protoreflect.FileDescriptor\n\nvar file_google_iam_v1_options_proto_rawDesc = []byte{\n\t0x0a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f,\n\t0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x22, 0x4c, 0x0a, 0x10,\n\t0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x12, 0x38, 0x0a, 0x18, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f,\n\t0x6c, 0x69, 0x63, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x16, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x6c,\n\t0x69, 0x63, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x7d, 0x0a, 0x11, 0x63, 0x6f,\n\t0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x42,\n\t0x0c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a,\n\t0x29, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x69,\n\t0x61, 0x6d, 0x70, 0x62, 0x3b, 0x69, 0x61, 0x6d, 0x70, 0x62, 0xf8, 0x01, 0x01, 0xaa, 0x02, 0x13,\n\t0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x49, 0x61, 0x6d,\n\t0x2e, 0x56, 0x31, 0xca, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f,\n\t0x75, 0x64, 0x5c, 0x49, 0x61, 0x6d, 0x5c, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_google_iam_v1_options_proto_rawDescOnce sync.Once\n\tfile_google_iam_v1_options_proto_rawDescData = file_google_iam_v1_options_proto_rawDesc\n)\n\nfunc file_google_iam_v1_options_proto_rawDescGZIP() []byte {\n\tfile_google_iam_v1_options_proto_rawDescOnce.Do(func() {\n\t\tfile_google_iam_v1_options_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_iam_v1_options_proto_rawDescData)\n\t})\n\treturn file_google_iam_v1_options_proto_rawDescData\n}\n\nvar file_google_iam_v1_options_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_google_iam_v1_options_proto_goTypes = []any{\n\t(*GetPolicyOptions)(nil), // 0: google.iam.v1.GetPolicyOptions\n}\nvar file_google_iam_v1_options_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_google_iam_v1_options_proto_init() }\nfunc file_google_iam_v1_options_proto_init() {\n\tif File_google_iam_v1_options_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_iam_v1_options_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_google_iam_v1_options_proto_goTypes,\n\t\tDependencyIndexes: file_google_iam_v1_options_proto_depIdxs,\n\t\tMessageInfos:      file_google_iam_v1_options_proto_msgTypes,\n\t}.Build()\n\tFile_google_iam_v1_options_proto = out.File\n\tfile_google_iam_v1_options_proto_rawDesc = nil\n\tfile_google_iam_v1_options_proto_goTypes = nil\n\tfile_google_iam_v1_options_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/iam/apiv1/iampb/policy.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/iam/v1/policy.proto\n\npackage iampb\n\nimport (\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\texpr \"google.golang.org/genproto/googleapis/type/expr\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// The list of valid permission types for which logging can be configured.\n// Admin writes are always logged, and are not configurable.\ntype AuditLogConfig_LogType int32\n\nconst (\n\t// Default case. Should never be this.\n\tAuditLogConfig_LOG_TYPE_UNSPECIFIED AuditLogConfig_LogType = 0\n\t// Admin reads. Example: CloudIAM getIamPolicy\n\tAuditLogConfig_ADMIN_READ AuditLogConfig_LogType = 1\n\t// Data writes. Example: CloudSQL Users create\n\tAuditLogConfig_DATA_WRITE AuditLogConfig_LogType = 2\n\t// Data reads. Example: CloudSQL Users list\n\tAuditLogConfig_DATA_READ AuditLogConfig_LogType = 3\n)\n\n// Enum value maps for AuditLogConfig_LogType.\nvar (\n\tAuditLogConfig_LogType_name = map[int32]string{\n\t\t0: \"LOG_TYPE_UNSPECIFIED\",\n\t\t1: \"ADMIN_READ\",\n\t\t2: \"DATA_WRITE\",\n\t\t3: \"DATA_READ\",\n\t}\n\tAuditLogConfig_LogType_value = map[string]int32{\n\t\t\"LOG_TYPE_UNSPECIFIED\": 0,\n\t\t\"ADMIN_READ\":           1,\n\t\t\"DATA_WRITE\":           2,\n\t\t\"DATA_READ\":            3,\n\t}\n)\n\nfunc (x AuditLogConfig_LogType) Enum() *AuditLogConfig_LogType {\n\tp := new(AuditLogConfig_LogType)\n\t*p = x\n\treturn p\n}\n\nfunc (x AuditLogConfig_LogType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (AuditLogConfig_LogType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_iam_v1_policy_proto_enumTypes[0].Descriptor()\n}\n\nfunc (AuditLogConfig_LogType) Type() protoreflect.EnumType {\n\treturn &file_google_iam_v1_policy_proto_enumTypes[0]\n}\n\nfunc (x AuditLogConfig_LogType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use AuditLogConfig_LogType.Descriptor instead.\nfunc (AuditLogConfig_LogType) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_iam_v1_policy_proto_rawDescGZIP(), []int{3, 0}\n}\n\n// The type of action performed on a Binding in a policy.\ntype BindingDelta_Action int32\n\nconst (\n\t// Unspecified.\n\tBindingDelta_ACTION_UNSPECIFIED BindingDelta_Action = 0\n\t// Addition of a Binding.\n\tBindingDelta_ADD BindingDelta_Action = 1\n\t// Removal of a Binding.\n\tBindingDelta_REMOVE BindingDelta_Action = 2\n)\n\n// Enum value maps for BindingDelta_Action.\nvar (\n\tBindingDelta_Action_name = map[int32]string{\n\t\t0: \"ACTION_UNSPECIFIED\",\n\t\t1: \"ADD\",\n\t\t2: \"REMOVE\",\n\t}\n\tBindingDelta_Action_value = map[string]int32{\n\t\t\"ACTION_UNSPECIFIED\": 0,\n\t\t\"ADD\":                1,\n\t\t\"REMOVE\":             2,\n\t}\n)\n\nfunc (x BindingDelta_Action) Enum() *BindingDelta_Action {\n\tp := new(BindingDelta_Action)\n\t*p = x\n\treturn p\n}\n\nfunc (x BindingDelta_Action) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (BindingDelta_Action) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_iam_v1_policy_proto_enumTypes[1].Descriptor()\n}\n\nfunc (BindingDelta_Action) Type() protoreflect.EnumType {\n\treturn &file_google_iam_v1_policy_proto_enumTypes[1]\n}\n\nfunc (x BindingDelta_Action) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use BindingDelta_Action.Descriptor instead.\nfunc (BindingDelta_Action) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_iam_v1_policy_proto_rawDescGZIP(), []int{5, 0}\n}\n\n// The type of action performed on an audit configuration in a policy.\ntype AuditConfigDelta_Action int32\n\nconst (\n\t// Unspecified.\n\tAuditConfigDelta_ACTION_UNSPECIFIED AuditConfigDelta_Action = 0\n\t// Addition of an audit configuration.\n\tAuditConfigDelta_ADD AuditConfigDelta_Action = 1\n\t// Removal of an audit configuration.\n\tAuditConfigDelta_REMOVE AuditConfigDelta_Action = 2\n)\n\n// Enum value maps for AuditConfigDelta_Action.\nvar (\n\tAuditConfigDelta_Action_name = map[int32]string{\n\t\t0: \"ACTION_UNSPECIFIED\",\n\t\t1: \"ADD\",\n\t\t2: \"REMOVE\",\n\t}\n\tAuditConfigDelta_Action_value = map[string]int32{\n\t\t\"ACTION_UNSPECIFIED\": 0,\n\t\t\"ADD\":                1,\n\t\t\"REMOVE\":             2,\n\t}\n)\n\nfunc (x AuditConfigDelta_Action) Enum() *AuditConfigDelta_Action {\n\tp := new(AuditConfigDelta_Action)\n\t*p = x\n\treturn p\n}\n\nfunc (x AuditConfigDelta_Action) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (AuditConfigDelta_Action) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_iam_v1_policy_proto_enumTypes[2].Descriptor()\n}\n\nfunc (AuditConfigDelta_Action) Type() protoreflect.EnumType {\n\treturn &file_google_iam_v1_policy_proto_enumTypes[2]\n}\n\nfunc (x AuditConfigDelta_Action) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use AuditConfigDelta_Action.Descriptor instead.\nfunc (AuditConfigDelta_Action) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_iam_v1_policy_proto_rawDescGZIP(), []int{6, 0}\n}\n\n// An Identity and Access Management (IAM) policy, which specifies access\n// controls for Google Cloud resources.\n//\n// A `Policy` is a collection of `bindings`. A `binding` binds one or more\n// `members`, or principals, to a single `role`. Principals can be user\n// accounts, service accounts, Google groups, and domains (such as G Suite). A\n// `role` is a named list of permissions; each `role` can be an IAM predefined\n// role or a user-created custom role.\n//\n// For some types of Google Cloud resources, a `binding` can also specify a\n// `condition`, which is a logical expression that allows access to a resource\n// only if the expression evaluates to `true`. A condition can add constraints\n// based on attributes of the request, the resource, or both. To learn which\n// resources support conditions in their IAM policies, see the\n// [IAM\n// documentation](https://cloud.google.com/iam/help/conditions/resource-policies).\n//\n// **JSON example:**\n//\n// ```\n//\n//\t{\n//\t  \"bindings\": [\n//\t    {\n//\t      \"role\": \"roles/resourcemanager.organizationAdmin\",\n//\t      \"members\": [\n//\t        \"user:mike@example.com\",\n//\t        \"group:admins@example.com\",\n//\t        \"domain:google.com\",\n//\t        \"serviceAccount:my-project-id@appspot.gserviceaccount.com\"\n//\t      ]\n//\t    },\n//\t    {\n//\t      \"role\": \"roles/resourcemanager.organizationViewer\",\n//\t      \"members\": [\n//\t        \"user:eve@example.com\"\n//\t      ],\n//\t      \"condition\": {\n//\t        \"title\": \"expirable access\",\n//\t        \"description\": \"Does not grant access after Sep 2020\",\n//\t        \"expression\": \"request.time <\n//\t        timestamp('2020-10-01T00:00:00.000Z')\",\n//\t      }\n//\t    }\n//\t  ],\n//\t  \"etag\": \"BwWWja0YfJA=\",\n//\t  \"version\": 3\n//\t}\n//\n// ```\n//\n// **YAML example:**\n//\n// ```\n//\n//\tbindings:\n//\t- members:\n//\t  - user:mike@example.com\n//\t  - group:admins@example.com\n//\t  - domain:google.com\n//\t  - serviceAccount:my-project-id@appspot.gserviceaccount.com\n//\t  role: roles/resourcemanager.organizationAdmin\n//\t- members:\n//\t  - user:eve@example.com\n//\t  role: roles/resourcemanager.organizationViewer\n//\t  condition:\n//\t    title: expirable access\n//\t    description: Does not grant access after Sep 2020\n//\t    expression: request.time < timestamp('2020-10-01T00:00:00.000Z')\n//\tetag: BwWWja0YfJA=\n//\tversion: 3\n//\n// ```\n//\n// For a description of IAM and its features, see the\n// [IAM documentation](https://cloud.google.com/iam/docs/).\ntype Policy struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Specifies the format of the policy.\n\t//\n\t// Valid values are `0`, `1`, and `3`. Requests that specify an invalid value\n\t// are rejected.\n\t//\n\t// Any operation that affects conditional role bindings must specify version\n\t// `3`. This requirement applies to the following operations:\n\t//\n\t//   - Getting a policy that includes a conditional role binding\n\t//   - Adding a conditional role binding to a policy\n\t//   - Changing a conditional role binding in a policy\n\t//   - Removing any role binding, with or without a condition, from a policy\n\t//     that includes conditions\n\t//\n\t// **Important:** If you use IAM Conditions, you must include the `etag` field\n\t// whenever you call `setIamPolicy`. If you omit this field, then IAM allows\n\t// you to overwrite a version `3` policy with a version `1` policy, and all of\n\t// the conditions in the version `3` policy are lost.\n\t//\n\t// If a policy does not include any conditions, operations on that policy may\n\t// specify any valid version or leave the field unset.\n\t//\n\t// To learn which resources support conditions in their IAM policies, see the\n\t// [IAM\n\t// documentation](https://cloud.google.com/iam/help/conditions/resource-policies).\n\tVersion int32 `protobuf:\"varint,1,opt,name=version,proto3\" json:\"version,omitempty\"`\n\t// Associates a list of `members`, or principals, with a `role`. Optionally,\n\t// may specify a `condition` that determines how and when the `bindings` are\n\t// applied. Each of the `bindings` must contain at least one principal.\n\t//\n\t// The `bindings` in a `Policy` can refer to up to 1,500 principals; up to 250\n\t// of these principals can be Google groups. Each occurrence of a principal\n\t// counts towards these limits. For example, if the `bindings` grant 50\n\t// different roles to `user:alice@example.com`, and not to any other\n\t// principal, then you can add another 1,450 principals to the `bindings` in\n\t// the `Policy`.\n\tBindings []*Binding `protobuf:\"bytes,4,rep,name=bindings,proto3\" json:\"bindings,omitempty\"`\n\t// Specifies cloud audit logging configuration for this policy.\n\tAuditConfigs []*AuditConfig `protobuf:\"bytes,6,rep,name=audit_configs,json=auditConfigs,proto3\" json:\"audit_configs,omitempty\"`\n\t// `etag` is used for optimistic concurrency control as a way to help\n\t// prevent simultaneous updates of a policy from overwriting each other.\n\t// It is strongly suggested that systems make use of the `etag` in the\n\t// read-modify-write cycle to perform policy updates in order to avoid race\n\t// conditions: An `etag` is returned in the response to `getIamPolicy`, and\n\t// systems are expected to put that etag in the request to `setIamPolicy` to\n\t// ensure that their change will be applied to the same version of the policy.\n\t//\n\t// **Important:** If you use IAM Conditions, you must include the `etag` field\n\t// whenever you call `setIamPolicy`. If you omit this field, then IAM allows\n\t// you to overwrite a version `3` policy with a version `1` policy, and all of\n\t// the conditions in the version `3` policy are lost.\n\tEtag []byte `protobuf:\"bytes,3,opt,name=etag,proto3\" json:\"etag,omitempty\"`\n}\n\nfunc (x *Policy) Reset() {\n\t*x = Policy{}\n\tmi := &file_google_iam_v1_policy_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Policy) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Policy) ProtoMessage() {}\n\nfunc (x *Policy) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_iam_v1_policy_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Policy.ProtoReflect.Descriptor instead.\nfunc (*Policy) Descriptor() ([]byte, []int) {\n\treturn file_google_iam_v1_policy_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Policy) GetVersion() int32 {\n\tif x != nil {\n\t\treturn x.Version\n\t}\n\treturn 0\n}\n\nfunc (x *Policy) GetBindings() []*Binding {\n\tif x != nil {\n\t\treturn x.Bindings\n\t}\n\treturn nil\n}\n\nfunc (x *Policy) GetAuditConfigs() []*AuditConfig {\n\tif x != nil {\n\t\treturn x.AuditConfigs\n\t}\n\treturn nil\n}\n\nfunc (x *Policy) GetEtag() []byte {\n\tif x != nil {\n\t\treturn x.Etag\n\t}\n\treturn nil\n}\n\n// Associates `members`, or principals, with a `role`.\ntype Binding struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Role that is assigned to the list of `members`, or principals.\n\t// For example, `roles/viewer`, `roles/editor`, or `roles/owner`.\n\tRole string `protobuf:\"bytes,1,opt,name=role,proto3\" json:\"role,omitempty\"`\n\t// Specifies the principals requesting access for a Google Cloud resource.\n\t// `members` can have the following values:\n\t//\n\t//   - `allUsers`: A special identifier that represents anyone who is\n\t//     on the internet; with or without a Google account.\n\t//\n\t//   - `allAuthenticatedUsers`: A special identifier that represents anyone\n\t//     who is authenticated with a Google account or a service account.\n\t//\n\t//   - `user:{emailid}`: An email address that represents a specific Google\n\t//     account. For example, `alice@example.com` .\n\t//\n\t//   - `serviceAccount:{emailid}`: An email address that represents a service\n\t//     account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\t//\n\t//   - `group:{emailid}`: An email address that represents a Google group.\n\t//     For example, `admins@example.com`.\n\t//\n\t//   - `deleted:user:{emailid}?uid={uniqueid}`: An email address (plus unique\n\t//     identifier) representing a user that has been recently deleted. For\n\t//     example, `alice@example.com?uid=123456789012345678901`. If the user is\n\t//     recovered, this value reverts to `user:{emailid}` and the recovered user\n\t//     retains the role in the binding.\n\t//\n\t//   - `deleted:serviceAccount:{emailid}?uid={uniqueid}`: An email address (plus\n\t//     unique identifier) representing a service account that has been recently\n\t//     deleted. For example,\n\t//     `my-other-app@appspot.gserviceaccount.com?uid=123456789012345678901`.\n\t//     If the service account is undeleted, this value reverts to\n\t//     `serviceAccount:{emailid}` and the undeleted service account retains the\n\t//     role in the binding.\n\t//\n\t//   - `deleted:group:{emailid}?uid={uniqueid}`: An email address (plus unique\n\t//     identifier) representing a Google group that has been recently\n\t//     deleted. For example, `admins@example.com?uid=123456789012345678901`. If\n\t//     the group is recovered, this value reverts to `group:{emailid}` and the\n\t//     recovered group retains the role in the binding.\n\t//\n\t//   - `domain:{domain}`: The G Suite domain (primary) that represents all the\n\t//     users of that domain. For example, `google.com` or `example.com`.\n\tMembers []string `protobuf:\"bytes,2,rep,name=members,proto3\" json:\"members,omitempty\"`\n\t// The condition that is associated with this binding.\n\t//\n\t// If the condition evaluates to `true`, then this binding applies to the\n\t// current request.\n\t//\n\t// If the condition evaluates to `false`, then this binding does not apply to\n\t// the current request. However, a different role binding might grant the same\n\t// role to one or more of the principals in this binding.\n\t//\n\t// To learn which resources support conditions in their IAM policies, see the\n\t// [IAM\n\t// documentation](https://cloud.google.com/iam/help/conditions/resource-policies).\n\tCondition *expr.Expr `protobuf:\"bytes,3,opt,name=condition,proto3\" json:\"condition,omitempty\"`\n}\n\nfunc (x *Binding) Reset() {\n\t*x = Binding{}\n\tmi := &file_google_iam_v1_policy_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Binding) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Binding) ProtoMessage() {}\n\nfunc (x *Binding) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_iam_v1_policy_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Binding.ProtoReflect.Descriptor instead.\nfunc (*Binding) Descriptor() ([]byte, []int) {\n\treturn file_google_iam_v1_policy_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *Binding) GetRole() string {\n\tif x != nil {\n\t\treturn x.Role\n\t}\n\treturn \"\"\n}\n\nfunc (x *Binding) GetMembers() []string {\n\tif x != nil {\n\t\treturn x.Members\n\t}\n\treturn nil\n}\n\nfunc (x *Binding) GetCondition() *expr.Expr {\n\tif x != nil {\n\t\treturn x.Condition\n\t}\n\treturn nil\n}\n\n// Specifies the audit configuration for a service.\n// The configuration determines which permission types are logged, and what\n// identities, if any, are exempted from logging.\n// An AuditConfig must have one or more AuditLogConfigs.\n//\n// If there are AuditConfigs for both `allServices` and a specific service,\n// the union of the two AuditConfigs is used for that service: the log_types\n// specified in each AuditConfig are enabled, and the exempted_members in each\n// AuditLogConfig are exempted.\n//\n// Example Policy with multiple AuditConfigs:\n//\n//\t{\n//\t  \"audit_configs\": [\n//\t    {\n//\t      \"service\": \"allServices\",\n//\t      \"audit_log_configs\": [\n//\t        {\n//\t          \"log_type\": \"DATA_READ\",\n//\t          \"exempted_members\": [\n//\t            \"user:jose@example.com\"\n//\t          ]\n//\t        },\n//\t        {\n//\t          \"log_type\": \"DATA_WRITE\"\n//\t        },\n//\t        {\n//\t          \"log_type\": \"ADMIN_READ\"\n//\t        }\n//\t      ]\n//\t    },\n//\t    {\n//\t      \"service\": \"sampleservice.googleapis.com\",\n//\t      \"audit_log_configs\": [\n//\t        {\n//\t          \"log_type\": \"DATA_READ\"\n//\t        },\n//\t        {\n//\t          \"log_type\": \"DATA_WRITE\",\n//\t          \"exempted_members\": [\n//\t            \"user:aliya@example.com\"\n//\t          ]\n//\t        }\n//\t      ]\n//\t    }\n//\t  ]\n//\t}\n//\n// For sampleservice, this policy enables DATA_READ, DATA_WRITE and ADMIN_READ\n// logging. It also exempts `jose@example.com` from DATA_READ logging, and\n// `aliya@example.com` from DATA_WRITE logging.\ntype AuditConfig struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Specifies a service that will be enabled for audit logging.\n\t// For example, `storage.googleapis.com`, `cloudsql.googleapis.com`.\n\t// `allServices` is a special value that covers all services.\n\tService string `protobuf:\"bytes,1,opt,name=service,proto3\" json:\"service,omitempty\"`\n\t// The configuration for logging of each type of permission.\n\tAuditLogConfigs []*AuditLogConfig `protobuf:\"bytes,3,rep,name=audit_log_configs,json=auditLogConfigs,proto3\" json:\"audit_log_configs,omitempty\"`\n}\n\nfunc (x *AuditConfig) Reset() {\n\t*x = AuditConfig{}\n\tmi := &file_google_iam_v1_policy_proto_msgTypes[2]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AuditConfig) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AuditConfig) ProtoMessage() {}\n\nfunc (x *AuditConfig) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_iam_v1_policy_proto_msgTypes[2]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AuditConfig.ProtoReflect.Descriptor instead.\nfunc (*AuditConfig) Descriptor() ([]byte, []int) {\n\treturn file_google_iam_v1_policy_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *AuditConfig) GetService() string {\n\tif x != nil {\n\t\treturn x.Service\n\t}\n\treturn \"\"\n}\n\nfunc (x *AuditConfig) GetAuditLogConfigs() []*AuditLogConfig {\n\tif x != nil {\n\t\treturn x.AuditLogConfigs\n\t}\n\treturn nil\n}\n\n// Provides the configuration for logging a type of permissions.\n// Example:\n//\n//\t{\n//\t  \"audit_log_configs\": [\n//\t    {\n//\t      \"log_type\": \"DATA_READ\",\n//\t      \"exempted_members\": [\n//\t        \"user:jose@example.com\"\n//\t      ]\n//\t    },\n//\t    {\n//\t      \"log_type\": \"DATA_WRITE\"\n//\t    }\n//\t  ]\n//\t}\n//\n// This enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting\n// jose@example.com from DATA_READ logging.\ntype AuditLogConfig struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The log type that this config enables.\n\tLogType AuditLogConfig_LogType `protobuf:\"varint,1,opt,name=log_type,json=logType,proto3,enum=google.iam.v1.AuditLogConfig_LogType\" json:\"log_type,omitempty\"`\n\t// Specifies the identities that do not cause logging for this type of\n\t// permission.\n\t// Follows the same format of\n\t// [Binding.members][google.iam.v1.Binding.members].\n\tExemptedMembers []string `protobuf:\"bytes,2,rep,name=exempted_members,json=exemptedMembers,proto3\" json:\"exempted_members,omitempty\"`\n}\n\nfunc (x *AuditLogConfig) Reset() {\n\t*x = AuditLogConfig{}\n\tmi := &file_google_iam_v1_policy_proto_msgTypes[3]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AuditLogConfig) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AuditLogConfig) ProtoMessage() {}\n\nfunc (x *AuditLogConfig) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_iam_v1_policy_proto_msgTypes[3]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AuditLogConfig.ProtoReflect.Descriptor instead.\nfunc (*AuditLogConfig) Descriptor() ([]byte, []int) {\n\treturn file_google_iam_v1_policy_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *AuditLogConfig) GetLogType() AuditLogConfig_LogType {\n\tif x != nil {\n\t\treturn x.LogType\n\t}\n\treturn AuditLogConfig_LOG_TYPE_UNSPECIFIED\n}\n\nfunc (x *AuditLogConfig) GetExemptedMembers() []string {\n\tif x != nil {\n\t\treturn x.ExemptedMembers\n\t}\n\treturn nil\n}\n\n// The difference delta between two policies.\ntype PolicyDelta struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The delta for Bindings between two policies.\n\tBindingDeltas []*BindingDelta `protobuf:\"bytes,1,rep,name=binding_deltas,json=bindingDeltas,proto3\" json:\"binding_deltas,omitempty\"`\n\t// The delta for AuditConfigs between two policies.\n\tAuditConfigDeltas []*AuditConfigDelta `protobuf:\"bytes,2,rep,name=audit_config_deltas,json=auditConfigDeltas,proto3\" json:\"audit_config_deltas,omitempty\"`\n}\n\nfunc (x *PolicyDelta) Reset() {\n\t*x = PolicyDelta{}\n\tmi := &file_google_iam_v1_policy_proto_msgTypes[4]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *PolicyDelta) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*PolicyDelta) ProtoMessage() {}\n\nfunc (x *PolicyDelta) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_iam_v1_policy_proto_msgTypes[4]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use PolicyDelta.ProtoReflect.Descriptor instead.\nfunc (*PolicyDelta) Descriptor() ([]byte, []int) {\n\treturn file_google_iam_v1_policy_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *PolicyDelta) GetBindingDeltas() []*BindingDelta {\n\tif x != nil {\n\t\treturn x.BindingDeltas\n\t}\n\treturn nil\n}\n\nfunc (x *PolicyDelta) GetAuditConfigDeltas() []*AuditConfigDelta {\n\tif x != nil {\n\t\treturn x.AuditConfigDeltas\n\t}\n\treturn nil\n}\n\n// One delta entry for Binding. Each individual change (only one member in each\n// entry) to a binding will be a separate entry.\ntype BindingDelta struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The action that was performed on a Binding.\n\t// Required\n\tAction BindingDelta_Action `protobuf:\"varint,1,opt,name=action,proto3,enum=google.iam.v1.BindingDelta_Action\" json:\"action,omitempty\"`\n\t// Role that is assigned to `members`.\n\t// For example, `roles/viewer`, `roles/editor`, or `roles/owner`.\n\t// Required\n\tRole string `protobuf:\"bytes,2,opt,name=role,proto3\" json:\"role,omitempty\"`\n\t// A single identity requesting access for a Google Cloud resource.\n\t// Follows the same format of Binding.members.\n\t// Required\n\tMember string `protobuf:\"bytes,3,opt,name=member,proto3\" json:\"member,omitempty\"`\n\t// The condition that is associated with this binding.\n\tCondition *expr.Expr `protobuf:\"bytes,4,opt,name=condition,proto3\" json:\"condition,omitempty\"`\n}\n\nfunc (x *BindingDelta) Reset() {\n\t*x = BindingDelta{}\n\tmi := &file_google_iam_v1_policy_proto_msgTypes[5]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *BindingDelta) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BindingDelta) ProtoMessage() {}\n\nfunc (x *BindingDelta) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_iam_v1_policy_proto_msgTypes[5]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BindingDelta.ProtoReflect.Descriptor instead.\nfunc (*BindingDelta) Descriptor() ([]byte, []int) {\n\treturn file_google_iam_v1_policy_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *BindingDelta) GetAction() BindingDelta_Action {\n\tif x != nil {\n\t\treturn x.Action\n\t}\n\treturn BindingDelta_ACTION_UNSPECIFIED\n}\n\nfunc (x *BindingDelta) GetRole() string {\n\tif x != nil {\n\t\treturn x.Role\n\t}\n\treturn \"\"\n}\n\nfunc (x *BindingDelta) GetMember() string {\n\tif x != nil {\n\t\treturn x.Member\n\t}\n\treturn \"\"\n}\n\nfunc (x *BindingDelta) GetCondition() *expr.Expr {\n\tif x != nil {\n\t\treturn x.Condition\n\t}\n\treturn nil\n}\n\n// One delta entry for AuditConfig. Each individual change (only one\n// exempted_member in each entry) to a AuditConfig will be a separate entry.\ntype AuditConfigDelta struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The action that was performed on an audit configuration in a policy.\n\t// Required\n\tAction AuditConfigDelta_Action `protobuf:\"varint,1,opt,name=action,proto3,enum=google.iam.v1.AuditConfigDelta_Action\" json:\"action,omitempty\"`\n\t// Specifies a service that was configured for Cloud Audit Logging.\n\t// For example, `storage.googleapis.com`, `cloudsql.googleapis.com`.\n\t// `allServices` is a special value that covers all services.\n\t// Required\n\tService string `protobuf:\"bytes,2,opt,name=service,proto3\" json:\"service,omitempty\"`\n\t// A single identity that is exempted from \"data access\" audit\n\t// logging for the `service` specified above.\n\t// Follows the same format of Binding.members.\n\tExemptedMember string `protobuf:\"bytes,3,opt,name=exempted_member,json=exemptedMember,proto3\" json:\"exempted_member,omitempty\"`\n\t// Specifies the log_type that was be enabled. ADMIN_ACTIVITY is always\n\t// enabled, and cannot be configured.\n\t// Required\n\tLogType string `protobuf:\"bytes,4,opt,name=log_type,json=logType,proto3\" json:\"log_type,omitempty\"`\n}\n\nfunc (x *AuditConfigDelta) Reset() {\n\t*x = AuditConfigDelta{}\n\tmi := &file_google_iam_v1_policy_proto_msgTypes[6]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AuditConfigDelta) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AuditConfigDelta) ProtoMessage() {}\n\nfunc (x *AuditConfigDelta) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_iam_v1_policy_proto_msgTypes[6]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AuditConfigDelta.ProtoReflect.Descriptor instead.\nfunc (*AuditConfigDelta) Descriptor() ([]byte, []int) {\n\treturn file_google_iam_v1_policy_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *AuditConfigDelta) GetAction() AuditConfigDelta_Action {\n\tif x != nil {\n\t\treturn x.Action\n\t}\n\treturn AuditConfigDelta_ACTION_UNSPECIFIED\n}\n\nfunc (x *AuditConfigDelta) GetService() string {\n\tif x != nil {\n\t\treturn x.Service\n\t}\n\treturn \"\"\n}\n\nfunc (x *AuditConfigDelta) GetExemptedMember() string {\n\tif x != nil {\n\t\treturn x.ExemptedMember\n\t}\n\treturn \"\"\n}\n\nfunc (x *AuditConfigDelta) GetLogType() string {\n\tif x != nil {\n\t\treturn x.LogType\n\t}\n\treturn \"\"\n}\n\nvar File_google_iam_v1_policy_proto protoreflect.FileDescriptor\n\nvar file_google_iam_v1_policy_proto_rawDesc = []byte{\n\t0x0a, 0x1a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f,\n\t0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x1a, 0x16, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x22, 0xab, 0x01, 0x0a, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x18,\n\t0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x08, 0x62, 0x69, 0x6e, 0x64,\n\t0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x6e, 0x64, 0x69,\n\t0x6e, 0x67, 0x52, 0x08, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3f, 0x0a, 0x0d,\n\t0x61, 0x75, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x06, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d,\n\t0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52,\n\t0x0c, 0x61, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x12, 0x0a,\n\t0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x65, 0x74, 0x61,\n\t0x67, 0x22, 0x68, 0x0a, 0x07, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04,\n\t0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65,\n\t0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,\n\t0x09, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x45, 0x78, 0x70, 0x72,\n\t0x52, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x72, 0x0a, 0x0b, 0x41,\n\t0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x11, 0x61, 0x75, 0x64, 0x69, 0x74, 0x5f, 0x6c, 0x6f,\n\t0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e,\n\t0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0f,\n\t0x61, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22,\n\t0xd1, 0x01, 0x0a, 0x0e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x43, 0x6f, 0x6e, 0x66,\n\t0x69, 0x67, 0x12, 0x40, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61,\n\t0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x43, 0x6f, 0x6e,\n\t0x66, 0x69, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x6c, 0x6f, 0x67,\n\t0x54, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x74, 0x65, 0x64,\n\t0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f,\n\t0x65, 0x78, 0x65, 0x6d, 0x70, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22,\n\t0x52, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x4f,\n\t0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,\n\t0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x52, 0x45,\n\t0x41, 0x44, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x57, 0x52, 0x49,\n\t0x54, 0x45, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x45, 0x41,\n\t0x44, 0x10, 0x03, 0x22, 0xa2, 0x01, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x65,\n\t0x6c, 0x74, 0x61, 0x12, 0x42, 0x0a, 0x0e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64,\n\t0x65, 0x6c, 0x74, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x6e, 0x64,\n\t0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x52, 0x0d, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e,\n\t0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x73, 0x12, 0x4f, 0x0a, 0x13, 0x61, 0x75, 0x64, 0x69, 0x74,\n\t0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x73, 0x18, 0x02,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61,\n\t0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,\n\t0x44, 0x65, 0x6c, 0x74, 0x61, 0x52, 0x11, 0x61, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66,\n\t0x69, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x73, 0x22, 0xde, 0x01, 0x0a, 0x0c, 0x42, 0x69, 0x6e,\n\t0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x3a, 0x0a, 0x06, 0x61, 0x63, 0x74,\n\t0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e,\n\t0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61,\n\t0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d,\n\t0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65,\n\t0x72, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79,\n\t0x70, 0x65, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69,\n\t0x6f, 0x6e, 0x22, 0x35, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x12,\n\t0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,\n\t0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x44, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a,\n\t0x06, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x02, 0x22, 0xe7, 0x01, 0x0a, 0x10, 0x41, 0x75,\n\t0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x3e,\n\t0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x41,\n\t0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x2e,\n\t0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18,\n\t0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x65, 0x6d,\n\t0x70, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0e, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65,\n\t0x72, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x22, 0x35, 0x0a, 0x06,\n\t0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e,\n\t0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07,\n\t0x0a, 0x03, 0x41, 0x44, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x4d, 0x4f, 0x56,\n\t0x45, 0x10, 0x02, 0x42, 0x7c, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x29, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x69, 0x61, 0x6d,\n\t0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x69, 0x61, 0x6d, 0x70, 0x62, 0x3b, 0x69, 0x61, 0x6d,\n\t0x70, 0x62, 0xf8, 0x01, 0x01, 0xaa, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43,\n\t0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x49, 0x61, 0x6d, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x13, 0x47, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x49, 0x61, 0x6d, 0x5c, 0x56,\n\t0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_iam_v1_policy_proto_rawDescOnce sync.Once\n\tfile_google_iam_v1_policy_proto_rawDescData = file_google_iam_v1_policy_proto_rawDesc\n)\n\nfunc file_google_iam_v1_policy_proto_rawDescGZIP() []byte {\n\tfile_google_iam_v1_policy_proto_rawDescOnce.Do(func() {\n\t\tfile_google_iam_v1_policy_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_iam_v1_policy_proto_rawDescData)\n\t})\n\treturn file_google_iam_v1_policy_proto_rawDescData\n}\n\nvar file_google_iam_v1_policy_proto_enumTypes = make([]protoimpl.EnumInfo, 3)\nvar file_google_iam_v1_policy_proto_msgTypes = make([]protoimpl.MessageInfo, 7)\nvar file_google_iam_v1_policy_proto_goTypes = []any{\n\t(AuditLogConfig_LogType)(0),  // 0: google.iam.v1.AuditLogConfig.LogType\n\t(BindingDelta_Action)(0),     // 1: google.iam.v1.BindingDelta.Action\n\t(AuditConfigDelta_Action)(0), // 2: google.iam.v1.AuditConfigDelta.Action\n\t(*Policy)(nil),               // 3: google.iam.v1.Policy\n\t(*Binding)(nil),              // 4: google.iam.v1.Binding\n\t(*AuditConfig)(nil),          // 5: google.iam.v1.AuditConfig\n\t(*AuditLogConfig)(nil),       // 6: google.iam.v1.AuditLogConfig\n\t(*PolicyDelta)(nil),          // 7: google.iam.v1.PolicyDelta\n\t(*BindingDelta)(nil),         // 8: google.iam.v1.BindingDelta\n\t(*AuditConfigDelta)(nil),     // 9: google.iam.v1.AuditConfigDelta\n\t(*expr.Expr)(nil),            // 10: google.type.Expr\n}\nvar file_google_iam_v1_policy_proto_depIdxs = []int32{\n\t4,  // 0: google.iam.v1.Policy.bindings:type_name -> google.iam.v1.Binding\n\t5,  // 1: google.iam.v1.Policy.audit_configs:type_name -> google.iam.v1.AuditConfig\n\t10, // 2: google.iam.v1.Binding.condition:type_name -> google.type.Expr\n\t6,  // 3: google.iam.v1.AuditConfig.audit_log_configs:type_name -> google.iam.v1.AuditLogConfig\n\t0,  // 4: google.iam.v1.AuditLogConfig.log_type:type_name -> google.iam.v1.AuditLogConfig.LogType\n\t8,  // 5: google.iam.v1.PolicyDelta.binding_deltas:type_name -> google.iam.v1.BindingDelta\n\t9,  // 6: google.iam.v1.PolicyDelta.audit_config_deltas:type_name -> google.iam.v1.AuditConfigDelta\n\t1,  // 7: google.iam.v1.BindingDelta.action:type_name -> google.iam.v1.BindingDelta.Action\n\t10, // 8: google.iam.v1.BindingDelta.condition:type_name -> google.type.Expr\n\t2,  // 9: google.iam.v1.AuditConfigDelta.action:type_name -> google.iam.v1.AuditConfigDelta.Action\n\t10, // [10:10] is the sub-list for method output_type\n\t10, // [10:10] is the sub-list for method input_type\n\t10, // [10:10] is the sub-list for extension type_name\n\t10, // [10:10] is the sub-list for extension extendee\n\t0,  // [0:10] is the sub-list for field type_name\n}\n\nfunc init() { file_google_iam_v1_policy_proto_init() }\nfunc file_google_iam_v1_policy_proto_init() {\n\tif File_google_iam_v1_policy_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_iam_v1_policy_proto_rawDesc,\n\t\t\tNumEnums:      3,\n\t\t\tNumMessages:   7,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_google_iam_v1_policy_proto_goTypes,\n\t\tDependencyIndexes: file_google_iam_v1_policy_proto_depIdxs,\n\t\tEnumInfos:         file_google_iam_v1_policy_proto_enumTypes,\n\t\tMessageInfos:      file_google_iam_v1_policy_proto_msgTypes,\n\t}.Build()\n\tFile_google_iam_v1_policy_proto = out.File\n\tfile_google_iam_v1_policy_proto_rawDesc = nil\n\tfile_google_iam_v1_policy_proto_goTypes = nil\n\tfile_google_iam_v1_policy_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/iam/apiv1/iampb/resource_policy_member.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/iam/v1/resource_policy_member.proto\n\npackage iampb\n\nimport (\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// Output-only policy member strings of a Google Cloud resource's built-in\n// identity.\ntype ResourcePolicyMember struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// IAM policy binding member referring to a Google Cloud resource by\n\t// user-assigned name (https://google.aip.dev/122). If a resource is deleted\n\t// and recreated with the same name, the binding will be applicable to the new\n\t// resource.\n\t//\n\t// Example:\n\t// `principal://parametermanager.googleapis.com/projects/12345/name/locations/us-central1-a/parameters/my-parameter`\n\tIamPolicyNamePrincipal string `protobuf:\"bytes,1,opt,name=iam_policy_name_principal,json=iamPolicyNamePrincipal,proto3\" json:\"iam_policy_name_principal,omitempty\"`\n\t// IAM policy binding member referring to a Google Cloud resource by\n\t// system-assigned unique identifier (https://google.aip.dev/148#uid). If a\n\t// resource is deleted and recreated with the same name, the binding will not\n\t// be applicable to the new resource\n\t//\n\t// Example:\n\t// `principal://parametermanager.googleapis.com/projects/12345/uid/locations/us-central1-a/parameters/a918fed5`\n\tIamPolicyUidPrincipal string `protobuf:\"bytes,2,opt,name=iam_policy_uid_principal,json=iamPolicyUidPrincipal,proto3\" json:\"iam_policy_uid_principal,omitempty\"`\n}\n\nfunc (x *ResourcePolicyMember) Reset() {\n\t*x = ResourcePolicyMember{}\n\tmi := &file_google_iam_v1_resource_policy_member_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ResourcePolicyMember) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ResourcePolicyMember) ProtoMessage() {}\n\nfunc (x *ResourcePolicyMember) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_iam_v1_resource_policy_member_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ResourcePolicyMember.ProtoReflect.Descriptor instead.\nfunc (*ResourcePolicyMember) Descriptor() ([]byte, []int) {\n\treturn file_google_iam_v1_resource_policy_member_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ResourcePolicyMember) GetIamPolicyNamePrincipal() string {\n\tif x != nil {\n\t\treturn x.IamPolicyNamePrincipal\n\t}\n\treturn \"\"\n}\n\nfunc (x *ResourcePolicyMember) GetIamPolicyUidPrincipal() string {\n\tif x != nil {\n\t\treturn x.IamPolicyUidPrincipal\n\t}\n\treturn \"\"\n}\n\nvar File_google_iam_v1_resource_policy_member_proto protoreflect.FileDescriptor\n\nvar file_google_iam_v1_resource_policy_member_proto_rawDesc = []byte{\n\t0x0a, 0x2a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f,\n\t0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f,\n\t0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65,\n\t0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x94, 0x01, 0x0a,\n\t0x14, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d,\n\t0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x19, 0x69, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x6c,\n\t0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70,\n\t0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x16, 0x69,\n\t0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x69, 0x6e,\n\t0x63, 0x69, 0x70, 0x61, 0x6c, 0x12, 0x3c, 0x0a, 0x18, 0x69, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x6c,\n\t0x69, 0x63, 0x79, 0x5f, 0x75, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61,\n\t0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x15, 0x69, 0x61,\n\t0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x55, 0x69, 0x64, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69,\n\t0x70, 0x61, 0x6c, 0x42, 0x87, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x42, 0x19, 0x52, 0x65, 0x73, 0x6f, 0x75,\n\t0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x50,\n\t0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x29, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x69, 0x61, 0x6d, 0x2f,\n\t0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x69, 0x61, 0x6d, 0x70, 0x62, 0x3b, 0x69, 0x61, 0x6d, 0x70,\n\t0x62, 0xaa, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64,\n\t0x2e, 0x49, 0x61, 0x6d, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x49, 0x61, 0x6d, 0x5c, 0x56, 0x31, 0x62, 0x06, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_iam_v1_resource_policy_member_proto_rawDescOnce sync.Once\n\tfile_google_iam_v1_resource_policy_member_proto_rawDescData = file_google_iam_v1_resource_policy_member_proto_rawDesc\n)\n\nfunc file_google_iam_v1_resource_policy_member_proto_rawDescGZIP() []byte {\n\tfile_google_iam_v1_resource_policy_member_proto_rawDescOnce.Do(func() {\n\t\tfile_google_iam_v1_resource_policy_member_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_iam_v1_resource_policy_member_proto_rawDescData)\n\t})\n\treturn file_google_iam_v1_resource_policy_member_proto_rawDescData\n}\n\nvar file_google_iam_v1_resource_policy_member_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_google_iam_v1_resource_policy_member_proto_goTypes = []any{\n\t(*ResourcePolicyMember)(nil), // 0: google.iam.v1.ResourcePolicyMember\n}\nvar file_google_iam_v1_resource_policy_member_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_google_iam_v1_resource_policy_member_proto_init() }\nfunc file_google_iam_v1_resource_policy_member_proto_init() {\n\tif File_google_iam_v1_resource_policy_member_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_iam_v1_resource_policy_member_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_google_iam_v1_resource_policy_member_proto_goTypes,\n\t\tDependencyIndexes: file_google_iam_v1_resource_policy_member_proto_depIdxs,\n\t\tMessageInfos:      file_google_iam_v1_resource_policy_member_proto_msgTypes,\n\t}.Build()\n\tFile_google_iam_v1_resource_policy_member_proto = out.File\n\tfile_google_iam_v1_resource_policy_member_proto_rawDesc = nil\n\tfile_google_iam_v1_resource_policy_member_proto_goTypes = nil\n\tfile_google_iam_v1_resource_policy_member_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/iam/iam.go",
    "content": "// Copyright 2016 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package iam supports the resource-specific operations of Google Cloud\n// IAM (Identity and Access Management) for the Google Cloud Libraries.\n// See https://cloud.google.com/iam for more about IAM.\n//\n// Users of the Google Cloud Libraries will typically not use this package\n// directly. Instead they will begin with some resource that supports IAM, like\n// a pubsub topic, and call its IAM method to get a Handle for that resource.\npackage iam\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\tpb \"cloud.google.com/go/iam/apiv1/iampb\"\n\tgax \"github.com/googleapis/gax-go/v2\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/grpc/metadata\"\n)\n\n// client abstracts the IAMPolicy API to allow multiple implementations.\ntype client interface {\n\tGet(ctx context.Context, resource string) (*pb.Policy, error)\n\tSet(ctx context.Context, resource string, p *pb.Policy) error\n\tTest(ctx context.Context, resource string, perms []string) ([]string, error)\n\tGetWithVersion(ctx context.Context, resource string, requestedPolicyVersion int32) (*pb.Policy, error)\n}\n\n// grpcClient implements client for the standard gRPC-based IAMPolicy service.\ntype grpcClient struct {\n\tc pb.IAMPolicyClient\n}\n\nvar withRetry = gax.WithRetry(func() gax.Retryer {\n\treturn gax.OnCodes([]codes.Code{\n\t\tcodes.DeadlineExceeded,\n\t\tcodes.Unavailable,\n\t}, gax.Backoff{\n\t\tInitial:    100 * time.Millisecond,\n\t\tMax:        60 * time.Second,\n\t\tMultiplier: 1.3,\n\t})\n})\n\nfunc (g *grpcClient) Get(ctx context.Context, resource string) (*pb.Policy, error) {\n\treturn g.GetWithVersion(ctx, resource, 1)\n}\n\nfunc (g *grpcClient) GetWithVersion(ctx context.Context, resource string, requestedPolicyVersion int32) (*pb.Policy, error) {\n\tvar proto *pb.Policy\n\tmd := metadata.Pairs(\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"resource\", resource))\n\tctx = insertMetadata(ctx, md)\n\n\terr := gax.Invoke(ctx, func(ctx context.Context, _ gax.CallSettings) error {\n\t\tvar err error\n\t\tproto, err = g.c.GetIamPolicy(ctx, &pb.GetIamPolicyRequest{\n\t\t\tResource: resource,\n\t\t\tOptions: &pb.GetPolicyOptions{\n\t\t\t\tRequestedPolicyVersion: requestedPolicyVersion,\n\t\t\t},\n\t\t})\n\t\treturn err\n\t}, withRetry)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn proto, nil\n}\n\nfunc (g *grpcClient) Set(ctx context.Context, resource string, p *pb.Policy) error {\n\tmd := metadata.Pairs(\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"resource\", resource))\n\tctx = insertMetadata(ctx, md)\n\n\treturn gax.Invoke(ctx, func(ctx context.Context, _ gax.CallSettings) error {\n\t\t_, err := g.c.SetIamPolicy(ctx, &pb.SetIamPolicyRequest{\n\t\t\tResource: resource,\n\t\t\tPolicy:   p,\n\t\t})\n\t\treturn err\n\t}, withRetry)\n}\n\nfunc (g *grpcClient) Test(ctx context.Context, resource string, perms []string) ([]string, error) {\n\tvar res *pb.TestIamPermissionsResponse\n\tmd := metadata.Pairs(\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"resource\", resource))\n\tctx = insertMetadata(ctx, md)\n\n\terr := gax.Invoke(ctx, func(ctx context.Context, _ gax.CallSettings) error {\n\t\tvar err error\n\t\tres, err = g.c.TestIamPermissions(ctx, &pb.TestIamPermissionsRequest{\n\t\t\tResource:    resource,\n\t\t\tPermissions: perms,\n\t\t})\n\t\treturn err\n\t}, withRetry)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn res.Permissions, nil\n}\n\n// A Handle provides IAM operations for a resource.\ntype Handle struct {\n\tc        client\n\tresource string\n}\n\n// A Handle3 provides IAM operations for a resource. It is similar to a Handle, but provides access to newer IAM features (e.g., conditions).\ntype Handle3 struct {\n\tc        client\n\tresource string\n\tversion  int32\n}\n\n// InternalNewHandle is for use by the Google Cloud Libraries only.\n//\n// InternalNewHandle returns a Handle for resource.\n// The conn parameter refers to a server that must support the IAMPolicy service.\nfunc InternalNewHandle(conn grpc.ClientConnInterface, resource string) *Handle {\n\treturn InternalNewHandleGRPCClient(pb.NewIAMPolicyClient(conn), resource)\n}\n\n// InternalNewHandleGRPCClient is for use by the Google Cloud Libraries only.\n//\n// InternalNewHandleClient returns a Handle for resource using the given\n// grpc service that implements IAM as a mixin\nfunc InternalNewHandleGRPCClient(c pb.IAMPolicyClient, resource string) *Handle {\n\treturn InternalNewHandleClient(&grpcClient{c: c}, resource)\n}\n\n// InternalNewHandleClient is for use by the Google Cloud Libraries only.\n//\n// InternalNewHandleClient returns a Handle for resource using the given\n// client implementation.\nfunc InternalNewHandleClient(c client, resource string) *Handle {\n\treturn &Handle{\n\t\tc:        c,\n\t\tresource: resource,\n\t}\n}\n\n// V3 returns a Handle3, which is like Handle except it sets\n// requestedPolicyVersion to 3 when retrieving a policy and policy.version to 3\n// when storing a policy.\nfunc (h *Handle) V3() *Handle3 {\n\treturn &Handle3{\n\t\tc:        h.c,\n\t\tresource: h.resource,\n\t\tversion:  3,\n\t}\n}\n\n// Policy retrieves the IAM policy for the resource.\nfunc (h *Handle) Policy(ctx context.Context) (*Policy, error) {\n\tproto, err := h.c.Get(ctx, h.resource)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &Policy{InternalProto: proto}, nil\n}\n\n// SetPolicy replaces the resource's current policy with the supplied Policy.\n//\n// If policy was created from a prior call to Get, then the modification will\n// only succeed if the policy has not changed since the Get.\nfunc (h *Handle) SetPolicy(ctx context.Context, policy *Policy) error {\n\treturn h.c.Set(ctx, h.resource, policy.InternalProto)\n}\n\n// TestPermissions returns the subset of permissions that the caller has on the resource.\nfunc (h *Handle) TestPermissions(ctx context.Context, permissions []string) ([]string, error) {\n\treturn h.c.Test(ctx, h.resource, permissions)\n}\n\n// A RoleName is a name representing a collection of permissions.\ntype RoleName string\n\n// Common role names.\nconst (\n\tOwner  RoleName = \"roles/owner\"\n\tEditor RoleName = \"roles/editor\"\n\tViewer RoleName = \"roles/viewer\"\n)\n\nconst (\n\t// AllUsers is a special member that denotes all users, even unauthenticated ones.\n\tAllUsers = \"allUsers\"\n\n\t// AllAuthenticatedUsers is a special member that denotes all authenticated users.\n\tAllAuthenticatedUsers = \"allAuthenticatedUsers\"\n)\n\n// A Policy is a list of Bindings representing roles\n// granted to members.\n//\n// The zero Policy is a valid policy with no bindings.\ntype Policy struct {\n\t// TODO(jba): when type aliases are available, put Policy into an internal package\n\t// and provide an exported alias here.\n\n\t// This field is exported for use by the Google Cloud Libraries only.\n\t// It may become unexported in a future release.\n\tInternalProto *pb.Policy\n}\n\n// Members returns the list of members with the supplied role.\n// The return value should not be modified. Use Add and Remove\n// to modify the members of a role.\nfunc (p *Policy) Members(r RoleName) []string {\n\tb := p.binding(r)\n\tif b == nil {\n\t\treturn nil\n\t}\n\treturn b.Members\n}\n\n// HasRole reports whether member has role r.\nfunc (p *Policy) HasRole(member string, r RoleName) bool {\n\treturn memberIndex(member, p.binding(r)) >= 0\n}\n\n// Add adds member member to role r if it is not already present.\n// A new binding is created if there is no binding for the role.\nfunc (p *Policy) Add(member string, r RoleName) {\n\tb := p.binding(r)\n\tif b == nil {\n\t\tif p.InternalProto == nil {\n\t\t\tp.InternalProto = &pb.Policy{}\n\t\t}\n\t\tp.InternalProto.Bindings = append(p.InternalProto.Bindings, &pb.Binding{\n\t\t\tRole:    string(r),\n\t\t\tMembers: []string{member},\n\t\t})\n\t\treturn\n\t}\n\tif memberIndex(member, b) < 0 {\n\t\tb.Members = append(b.Members, member)\n\t\treturn\n\t}\n}\n\n// Remove removes member from role r if it is present.\nfunc (p *Policy) Remove(member string, r RoleName) {\n\tbi := p.bindingIndex(r)\n\tif bi < 0 {\n\t\treturn\n\t}\n\tbindings := p.InternalProto.Bindings\n\tb := bindings[bi]\n\tmi := memberIndex(member, b)\n\tif mi < 0 {\n\t\treturn\n\t}\n\t// Order doesn't matter for bindings or members, so to remove, move the last item\n\t// into the removed spot and shrink the slice.\n\tif len(b.Members) == 1 {\n\t\t// Remove binding.\n\t\tlast := len(bindings) - 1\n\t\tbindings[bi] = bindings[last]\n\t\tbindings[last] = nil\n\t\tp.InternalProto.Bindings = bindings[:last]\n\t\treturn\n\t}\n\t// Remove member.\n\t// TODO(jba): worry about multiple copies of m?\n\tlast := len(b.Members) - 1\n\tb.Members[mi] = b.Members[last]\n\tb.Members[last] = \"\"\n\tb.Members = b.Members[:last]\n}\n\n// Roles returns the names of all the roles that appear in the Policy.\nfunc (p *Policy) Roles() []RoleName {\n\tif p.InternalProto == nil {\n\t\treturn nil\n\t}\n\tvar rns []RoleName\n\tfor _, b := range p.InternalProto.Bindings {\n\t\trns = append(rns, RoleName(b.Role))\n\t}\n\treturn rns\n}\n\n// binding returns the Binding for the suppied role, or nil if there isn't one.\nfunc (p *Policy) binding(r RoleName) *pb.Binding {\n\ti := p.bindingIndex(r)\n\tif i < 0 {\n\t\treturn nil\n\t}\n\treturn p.InternalProto.Bindings[i]\n}\n\nfunc (p *Policy) bindingIndex(r RoleName) int {\n\tif p.InternalProto == nil {\n\t\treturn -1\n\t}\n\tfor i, b := range p.InternalProto.Bindings {\n\t\tif b.Role == string(r) {\n\t\t\treturn i\n\t\t}\n\t}\n\treturn -1\n}\n\n// memberIndex returns the index of m in b's Members, or -1 if not found.\nfunc memberIndex(m string, b *pb.Binding) int {\n\tif b == nil {\n\t\treturn -1\n\t}\n\tfor i, mm := range b.Members {\n\t\tif mm == m {\n\t\t\treturn i\n\t\t}\n\t}\n\treturn -1\n}\n\n// insertMetadata inserts metadata into the given context\nfunc insertMetadata(ctx context.Context, mds ...metadata.MD) context.Context {\n\tout, _ := metadata.FromOutgoingContext(ctx)\n\tout = out.Copy()\n\tfor _, md := range mds {\n\t\tfor k, v := range md {\n\t\t\tout[k] = append(out[k], v...)\n\t\t}\n\t}\n\treturn metadata.NewOutgoingContext(ctx, out)\n}\n\n// A Policy3 is a list of Bindings representing roles granted to members.\n//\n// The zero Policy3 is a valid policy with no bindings.\n//\n// It is similar to a Policy, except a Policy3 provides direct access to the\n// list of Bindings.\n//\n// The policy version is always set to 3.\ntype Policy3 struct {\n\tetag     []byte\n\tBindings []*pb.Binding\n}\n\n// Policy retrieves the IAM policy for the resource.\n//\n// requestedPolicyVersion is always set to 3.\nfunc (h *Handle3) Policy(ctx context.Context) (*Policy3, error) {\n\tproto, err := h.c.GetWithVersion(ctx, h.resource, h.version)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &Policy3{\n\t\tBindings: proto.Bindings,\n\t\tetag:     proto.Etag,\n\t}, nil\n}\n\n// SetPolicy replaces the resource's current policy with the supplied Policy.\n//\n// If policy was created from a prior call to Get, then the modification will\n// only succeed if the policy has not changed since the Get.\nfunc (h *Handle3) SetPolicy(ctx context.Context, policy *Policy3) error {\n\treturn h.c.Set(ctx, h.resource, &pb.Policy{\n\t\tBindings: policy.Bindings,\n\t\tEtag:     policy.etag,\n\t\tVersion:  h.version,\n\t})\n}\n\n// TestPermissions returns the subset of permissions that the caller has on the resource.\nfunc (h *Handle3) TestPermissions(ctx context.Context, permissions []string) ([]string, error) {\n\treturn h.c.Test(ctx, h.resource, permissions)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/internal/.repo-metadata-full.json",
    "content": "{\n  \"cloud.google.com/go/accessapproval/apiv1\": {\n    \"api_shortname\": \"accessapproval\",\n    \"distribution_name\": \"cloud.google.com/go/accessapproval/apiv1\",\n    \"description\": \"Access Approval API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/accessapproval/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/accesscontextmanager/apiv1\": {\n    \"api_shortname\": \"accesscontextmanager\",\n    \"distribution_name\": \"cloud.google.com/go/accesscontextmanager/apiv1\",\n    \"description\": \"Access Context Manager API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/accesscontextmanager/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/advisorynotifications/apiv1\": {\n    \"api_shortname\": \"advisorynotifications\",\n    \"distribution_name\": \"cloud.google.com/go/advisorynotifications/apiv1\",\n    \"description\": \"Advisory Notifications API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/advisorynotifications/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/ai/generativelanguage/apiv1\": {\n    \"api_shortname\": \"generativelanguage\",\n    \"distribution_name\": \"cloud.google.com/go/ai/generativelanguage/apiv1\",\n    \"description\": \"Generative Language API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/ai/latest/generativelanguage/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/ai/generativelanguage/apiv1alpha\": {\n    \"api_shortname\": \"generativelanguage\",\n    \"distribution_name\": \"cloud.google.com/go/ai/generativelanguage/apiv1alpha\",\n    \"description\": \"Generative Language API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/ai/latest/generativelanguage/apiv1alpha\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/ai/generativelanguage/apiv1beta\": {\n    \"api_shortname\": \"generativelanguage\",\n    \"distribution_name\": \"cloud.google.com/go/ai/generativelanguage/apiv1beta\",\n    \"description\": \"Generative Language API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/ai/latest/generativelanguage/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/ai/generativelanguage/apiv1beta2\": {\n    \"api_shortname\": \"generativelanguage\",\n    \"distribution_name\": \"cloud.google.com/go/ai/generativelanguage/apiv1beta2\",\n    \"description\": \"Generative Language API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/ai/latest/generativelanguage/apiv1beta2\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/aiplatform/apiv1\": {\n    \"api_shortname\": \"aiplatform\",\n    \"distribution_name\": \"cloud.google.com/go/aiplatform/apiv1\",\n    \"description\": \"Vertex AI API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/aiplatform/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/aiplatform/apiv1beta1\": {\n    \"api_shortname\": \"aiplatform\",\n    \"distribution_name\": \"cloud.google.com/go/aiplatform/apiv1beta1\",\n    \"description\": \"Vertex AI API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/aiplatform/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/alloydb/apiv1\": {\n    \"api_shortname\": \"alloydb\",\n    \"distribution_name\": \"cloud.google.com/go/alloydb/apiv1\",\n    \"description\": \"AlloyDB API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/alloydb/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/alloydb/apiv1alpha\": {\n    \"api_shortname\": \"alloydb\",\n    \"distribution_name\": \"cloud.google.com/go/alloydb/apiv1alpha\",\n    \"description\": \"AlloyDB API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/alloydb/latest/apiv1alpha\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/alloydb/apiv1beta\": {\n    \"api_shortname\": \"alloydb\",\n    \"distribution_name\": \"cloud.google.com/go/alloydb/apiv1beta\",\n    \"description\": \"AlloyDB API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/alloydb/latest/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/alloydb/connectors/apiv1\": {\n    \"api_shortname\": \"connectors\",\n    \"distribution_name\": \"cloud.google.com/go/alloydb/connectors/apiv1\",\n    \"description\": \"AlloyDB connectors\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/alloydb/latest/connectors/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/alloydb/connectors/apiv1alpha\": {\n    \"api_shortname\": \"connectors\",\n    \"distribution_name\": \"cloud.google.com/go/alloydb/connectors/apiv1alpha\",\n    \"description\": \"AlloyDB connectors\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/alloydb/latest/connectors/apiv1alpha\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/alloydb/connectors/apiv1beta\": {\n    \"api_shortname\": \"connectors\",\n    \"distribution_name\": \"cloud.google.com/go/alloydb/connectors/apiv1beta\",\n    \"description\": \"AlloyDB connectors\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/alloydb/latest/connectors/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/analytics/admin/apiv1alpha\": {\n    \"api_shortname\": \"analyticsadmin\",\n    \"distribution_name\": \"cloud.google.com/go/analytics/admin/apiv1alpha\",\n    \"description\": \"Google Analytics Admin API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/analytics/latest/admin/apiv1alpha\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/apigateway/apiv1\": {\n    \"api_shortname\": \"apigateway\",\n    \"distribution_name\": \"cloud.google.com/go/apigateway/apiv1\",\n    \"description\": \"API Gateway API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/apigateway/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/apigeeconnect/apiv1\": {\n    \"api_shortname\": \"apigeeconnect\",\n    \"distribution_name\": \"cloud.google.com/go/apigeeconnect/apiv1\",\n    \"description\": \"Apigee Connect API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/apigeeconnect/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/apigeeregistry/apiv1\": {\n    \"api_shortname\": \"apigeeregistry\",\n    \"distribution_name\": \"cloud.google.com/go/apigeeregistry/apiv1\",\n    \"description\": \"Apigee Registry API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/apigeeregistry/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/apihub/apiv1\": {\n    \"api_shortname\": \"apihub\",\n    \"distribution_name\": \"cloud.google.com/go/apihub/apiv1\",\n    \"description\": \"API hub API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/apihub/latest/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/apikeys/apiv2\": {\n    \"api_shortname\": \"apikeys\",\n    \"distribution_name\": \"cloud.google.com/go/apikeys/apiv2\",\n    \"description\": \"API Keys API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/apikeys/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/appengine/apiv1\": {\n    \"api_shortname\": \"appengine\",\n    \"distribution_name\": \"cloud.google.com/go/appengine/apiv1\",\n    \"description\": \"App Engine Admin API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/appengine/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/apphub/apiv1\": {\n    \"api_shortname\": \"apphub\",\n    \"distribution_name\": \"cloud.google.com/go/apphub/apiv1\",\n    \"description\": \"App Hub API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/apphub/latest/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/apps/events/subscriptions/apiv1\": {\n    \"api_shortname\": \"workspaceevents\",\n    \"distribution_name\": \"cloud.google.com/go/apps/events/subscriptions/apiv1\",\n    \"description\": \"Google Workspace Events API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/apps/latest/events/subscriptions/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/apps/meet/apiv2\": {\n    \"api_shortname\": \"meet\",\n    \"distribution_name\": \"cloud.google.com/go/apps/meet/apiv2\",\n    \"description\": \"Google Meet API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/apps/latest/meet/apiv2\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/apps/meet/apiv2beta\": {\n    \"api_shortname\": \"meet\",\n    \"distribution_name\": \"cloud.google.com/go/apps/meet/apiv2beta\",\n    \"description\": \"Google Meet API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/apps/latest/meet/apiv2beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/area120/tables/apiv1alpha1\": {\n    \"api_shortname\": \"area120tables\",\n    \"distribution_name\": \"cloud.google.com/go/area120/tables/apiv1alpha1\",\n    \"description\": \"Area120 Tables API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/area120/latest/tables/apiv1alpha1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/artifactregistry/apiv1\": {\n    \"api_shortname\": \"artifactregistry\",\n    \"distribution_name\": \"cloud.google.com/go/artifactregistry/apiv1\",\n    \"description\": \"Artifact Registry API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/artifactregistry/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/artifactregistry/apiv1beta2\": {\n    \"api_shortname\": \"artifactregistry\",\n    \"distribution_name\": \"cloud.google.com/go/artifactregistry/apiv1beta2\",\n    \"description\": \"Artifact Registry API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/artifactregistry/latest/apiv1beta2\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/asset/apiv1\": {\n    \"api_shortname\": \"cloudasset\",\n    \"distribution_name\": \"cloud.google.com/go/asset/apiv1\",\n    \"description\": \"Cloud Asset API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/asset/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/asset/apiv1p2beta1\": {\n    \"api_shortname\": \"cloudasset\",\n    \"distribution_name\": \"cloud.google.com/go/asset/apiv1p2beta1\",\n    \"description\": \"Cloud Asset API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/asset/latest/apiv1p2beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/asset/apiv1p5beta1\": {\n    \"api_shortname\": \"cloudasset\",\n    \"distribution_name\": \"cloud.google.com/go/asset/apiv1p5beta1\",\n    \"description\": \"Cloud Asset API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/asset/latest/apiv1p5beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/assuredworkloads/apiv1\": {\n    \"api_shortname\": \"assuredworkloads\",\n    \"distribution_name\": \"cloud.google.com/go/assuredworkloads/apiv1\",\n    \"description\": \"Assured Workloads API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/assuredworkloads/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/assuredworkloads/apiv1beta1\": {\n    \"api_shortname\": \"assuredworkloads\",\n    \"distribution_name\": \"cloud.google.com/go/assuredworkloads/apiv1beta1\",\n    \"description\": \"Assured Workloads API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/assuredworkloads/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/automl/apiv1\": {\n    \"api_shortname\": \"automl\",\n    \"distribution_name\": \"cloud.google.com/go/automl/apiv1\",\n    \"description\": \"Cloud AutoML API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/automl/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/automl/apiv1beta1\": {\n    \"api_shortname\": \"automl\",\n    \"distribution_name\": \"cloud.google.com/go/automl/apiv1beta1\",\n    \"description\": \"Cloud AutoML API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/automl/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/backupdr/apiv1\": {\n    \"api_shortname\": \"backupdr\",\n    \"distribution_name\": \"cloud.google.com/go/backupdr/apiv1\",\n    \"description\": \"Backup and DR Service API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/backupdr/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/baremetalsolution/apiv2\": {\n    \"api_shortname\": \"baremetalsolution\",\n    \"distribution_name\": \"cloud.google.com/go/baremetalsolution/apiv2\",\n    \"description\": \"Bare Metal Solution API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/baremetalsolution/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/batch/apiv1\": {\n    \"api_shortname\": \"batch\",\n    \"distribution_name\": \"cloud.google.com/go/batch/apiv1\",\n    \"description\": \"Batch API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/batch/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/beyondcorp/appconnections/apiv1\": {\n    \"api_shortname\": \"beyondcorp\",\n    \"distribution_name\": \"cloud.google.com/go/beyondcorp/appconnections/apiv1\",\n    \"description\": \"BeyondCorp API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/beyondcorp/latest/appconnections/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/beyondcorp/appconnectors/apiv1\": {\n    \"api_shortname\": \"beyondcorp\",\n    \"distribution_name\": \"cloud.google.com/go/beyondcorp/appconnectors/apiv1\",\n    \"description\": \"BeyondCorp API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/beyondcorp/latest/appconnectors/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/beyondcorp/appgateways/apiv1\": {\n    \"api_shortname\": \"beyondcorp\",\n    \"distribution_name\": \"cloud.google.com/go/beyondcorp/appgateways/apiv1\",\n    \"description\": \"BeyondCorp API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/beyondcorp/latest/appgateways/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/beyondcorp/clientconnectorservices/apiv1\": {\n    \"api_shortname\": \"beyondcorp\",\n    \"distribution_name\": \"cloud.google.com/go/beyondcorp/clientconnectorservices/apiv1\",\n    \"description\": \"BeyondCorp API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/beyondcorp/latest/clientconnectorservices/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/beyondcorp/clientgateways/apiv1\": {\n    \"api_shortname\": \"beyondcorp\",\n    \"distribution_name\": \"cloud.google.com/go/beyondcorp/clientgateways/apiv1\",\n    \"description\": \"BeyondCorp API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/beyondcorp/latest/clientgateways/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigquery\": {\n    \"api_shortname\": \"bigquery\",\n    \"distribution_name\": \"cloud.google.com/go/bigquery\",\n    \"description\": \"BigQuery\",\n    \"language\": \"go\",\n    \"client_library_type\": \"manual\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_MANUAL\"\n  },\n  \"cloud.google.com/go/bigquery/analyticshub/apiv1\": {\n    \"api_shortname\": \"analyticshub\",\n    \"distribution_name\": \"cloud.google.com/go/bigquery/analyticshub/apiv1\",\n    \"description\": \"Analytics Hub API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/analyticshub/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigquery/biglake/apiv1\": {\n    \"api_shortname\": \"biglake\",\n    \"distribution_name\": \"cloud.google.com/go/bigquery/biglake/apiv1\",\n    \"description\": \"BigLake API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/biglake/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigquery/biglake/apiv1alpha1\": {\n    \"api_shortname\": \"biglake\",\n    \"distribution_name\": \"cloud.google.com/go/bigquery/biglake/apiv1alpha1\",\n    \"description\": \"BigLake API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/biglake/apiv1alpha1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigquery/connection/apiv1\": {\n    \"api_shortname\": \"bigqueryconnection\",\n    \"distribution_name\": \"cloud.google.com/go/bigquery/connection/apiv1\",\n    \"description\": \"BigQuery Connection API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/connection/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigquery/connection/apiv1beta1\": {\n    \"api_shortname\": \"bigqueryconnection\",\n    \"distribution_name\": \"cloud.google.com/go/bigquery/connection/apiv1beta1\",\n    \"description\": \"BigQuery Connection API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/connection/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigquery/dataexchange/apiv1beta1\": {\n    \"api_shortname\": \"analyticshub\",\n    \"distribution_name\": \"cloud.google.com/go/bigquery/dataexchange/apiv1beta1\",\n    \"description\": \"Analytics Hub API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/dataexchange/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigquery/datapolicies/apiv1\": {\n    \"api_shortname\": \"bigquerydatapolicy\",\n    \"distribution_name\": \"cloud.google.com/go/bigquery/datapolicies/apiv1\",\n    \"description\": \"BigQuery Data Policy API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/datapolicies/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigquery/datapolicies/apiv1beta1\": {\n    \"api_shortname\": \"bigquerydatapolicy\",\n    \"distribution_name\": \"cloud.google.com/go/bigquery/datapolicies/apiv1beta1\",\n    \"description\": \"BigQuery Data Policy API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/datapolicies/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigquery/datatransfer/apiv1\": {\n    \"api_shortname\": \"bigquerydatatransfer\",\n    \"distribution_name\": \"cloud.google.com/go/bigquery/datatransfer/apiv1\",\n    \"description\": \"BigQuery Data Transfer API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/datatransfer/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigquery/migration/apiv2\": {\n    \"api_shortname\": \"bigquerymigration\",\n    \"distribution_name\": \"cloud.google.com/go/bigquery/migration/apiv2\",\n    \"description\": \"BigQuery Migration API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/migration/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigquery/migration/apiv2alpha\": {\n    \"api_shortname\": \"bigquerymigration\",\n    \"distribution_name\": \"cloud.google.com/go/bigquery/migration/apiv2alpha\",\n    \"description\": \"BigQuery Migration API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/migration/apiv2alpha\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigquery/reservation/apiv1\": {\n    \"api_shortname\": \"bigqueryreservation\",\n    \"distribution_name\": \"cloud.google.com/go/bigquery/reservation/apiv1\",\n    \"description\": \"BigQuery Reservation API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/reservation/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigquery/storage/apiv1\": {\n    \"api_shortname\": \"bigquerystorage\",\n    \"distribution_name\": \"cloud.google.com/go/bigquery/storage/apiv1\",\n    \"description\": \"BigQuery Storage API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/storage/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigquery/storage/apiv1alpha\": {\n    \"api_shortname\": \"bigquerystorage\",\n    \"distribution_name\": \"cloud.google.com/go/bigquery/storage/apiv1alpha\",\n    \"description\": \"BigQuery Storage API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/storage/apiv1alpha\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigquery/storage/apiv1beta\": {\n    \"api_shortname\": \"bigquerystorage\",\n    \"distribution_name\": \"cloud.google.com/go/bigquery/storage/apiv1beta\",\n    \"description\": \"BigQuery Storage API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/storage/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigquery/storage/apiv1beta1\": {\n    \"api_shortname\": \"bigquerystorage\",\n    \"distribution_name\": \"cloud.google.com/go/bigquery/storage/apiv1beta1\",\n    \"description\": \"BigQuery Storage API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/storage/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigquery/storage/apiv1beta2\": {\n    \"api_shortname\": \"bigquerystorage\",\n    \"distribution_name\": \"cloud.google.com/go/bigquery/storage/apiv1beta2\",\n    \"description\": \"BigQuery Storage API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/storage/apiv1beta2\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigtable\": {\n    \"api_shortname\": \"bigtable\",\n    \"distribution_name\": \"cloud.google.com/go/bigtable\",\n    \"description\": \"Cloud BigTable\",\n    \"language\": \"go\",\n    \"client_library_type\": \"manual\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigtable/latest\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_MANUAL\"\n  },\n  \"cloud.google.com/go/bigtable/admin/apiv2\": {\n    \"api_shortname\": \"bigtableadmin\",\n    \"distribution_name\": \"cloud.google.com/go/bigtable/admin/apiv2\",\n    \"description\": \"Cloud Bigtable Admin API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigtable/latest/admin/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/bigtable/apiv2\": {\n    \"api_shortname\": \"bigtable\",\n    \"distribution_name\": \"cloud.google.com/go/bigtable/apiv2\",\n    \"description\": \"Cloud Bigtable API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigtable/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/billing/apiv1\": {\n    \"api_shortname\": \"cloudbilling\",\n    \"distribution_name\": \"cloud.google.com/go/billing/apiv1\",\n    \"description\": \"Cloud Billing API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/billing/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/billing/budgets/apiv1\": {\n    \"api_shortname\": \"billingbudgets\",\n    \"distribution_name\": \"cloud.google.com/go/billing/budgets/apiv1\",\n    \"description\": \"Cloud Billing Budget API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/billing/latest/budgets/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/billing/budgets/apiv1beta1\": {\n    \"api_shortname\": \"billingbudgets\",\n    \"distribution_name\": \"cloud.google.com/go/billing/budgets/apiv1beta1\",\n    \"description\": \"Cloud Billing Budget API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/billing/latest/budgets/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/binaryauthorization/apiv1\": {\n    \"api_shortname\": \"binaryauthorization\",\n    \"distribution_name\": \"cloud.google.com/go/binaryauthorization/apiv1\",\n    \"description\": \"Binary Authorization API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/binaryauthorization/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/binaryauthorization/apiv1beta1\": {\n    \"api_shortname\": \"binaryauthorization\",\n    \"distribution_name\": \"cloud.google.com/go/binaryauthorization/apiv1beta1\",\n    \"description\": \"Binary Authorization API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/binaryauthorization/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/certificatemanager/apiv1\": {\n    \"api_shortname\": \"certificatemanager\",\n    \"distribution_name\": \"cloud.google.com/go/certificatemanager/apiv1\",\n    \"description\": \"Certificate Manager API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/certificatemanager/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/channel/apiv1\": {\n    \"api_shortname\": \"cloudchannel\",\n    \"distribution_name\": \"cloud.google.com/go/channel/apiv1\",\n    \"description\": \"Cloud Channel API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/channel/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/chat/apiv1\": {\n    \"api_shortname\": \"chat\",\n    \"distribution_name\": \"cloud.google.com/go/chat/apiv1\",\n    \"description\": \"Google Chat API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/chat/latest/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/chronicle/apiv1\": {\n    \"api_shortname\": \"chronicle\",\n    \"distribution_name\": \"cloud.google.com/go/chronicle/apiv1\",\n    \"description\": \"Chronicle API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/chronicle/latest/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/cloudbuild/apiv1/v2\": {\n    \"api_shortname\": \"cloudbuild\",\n    \"distribution_name\": \"cloud.google.com/go/cloudbuild/apiv1/v2\",\n    \"description\": \"Cloud Build API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudbuild/latest/apiv1/v2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/cloudbuild/apiv2\": {\n    \"api_shortname\": \"cloudbuild\",\n    \"distribution_name\": \"cloud.google.com/go/cloudbuild/apiv2\",\n    \"description\": \"Cloud Build API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudbuild/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/cloudcontrolspartner/apiv1\": {\n    \"api_shortname\": \"cloudcontrolspartner\",\n    \"distribution_name\": \"cloud.google.com/go/cloudcontrolspartner/apiv1\",\n    \"description\": \"Cloud Controls Partner API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudcontrolspartner/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/cloudcontrolspartner/apiv1beta\": {\n    \"api_shortname\": \"cloudcontrolspartner\",\n    \"distribution_name\": \"cloud.google.com/go/cloudcontrolspartner/apiv1beta\",\n    \"description\": \"Cloud Controls Partner API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudcontrolspartner/latest/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/clouddms/apiv1\": {\n    \"api_shortname\": \"datamigration\",\n    \"distribution_name\": \"cloud.google.com/go/clouddms/apiv1\",\n    \"description\": \"Database Migration API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/clouddms/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/cloudprofiler/apiv2\": {\n    \"api_shortname\": \"cloudprofiler\",\n    \"distribution_name\": \"cloud.google.com/go/cloudprofiler/apiv2\",\n    \"description\": \"Cloud Profiler API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudprofiler/latest/apiv2\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/cloudquotas/apiv1\": {\n    \"api_shortname\": \"cloudquotas\",\n    \"distribution_name\": \"cloud.google.com/go/cloudquotas/apiv1\",\n    \"description\": \"Cloud Quotas API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudquotas/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/cloudquotas/apiv1beta\": {\n    \"api_shortname\": \"cloudquotas\",\n    \"distribution_name\": \"cloud.google.com/go/cloudquotas/apiv1beta\",\n    \"description\": \"Cloud Quotas API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudquotas/latest/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/cloudtasks/apiv2\": {\n    \"api_shortname\": \"cloudtasks\",\n    \"distribution_name\": \"cloud.google.com/go/cloudtasks/apiv2\",\n    \"description\": \"Cloud Tasks API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudtasks/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/cloudtasks/apiv2beta2\": {\n    \"api_shortname\": \"cloudtasks\",\n    \"distribution_name\": \"cloud.google.com/go/cloudtasks/apiv2beta2\",\n    \"description\": \"Cloud Tasks API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudtasks/latest/apiv2beta2\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/cloudtasks/apiv2beta3\": {\n    \"api_shortname\": \"cloudtasks\",\n    \"distribution_name\": \"cloud.google.com/go/cloudtasks/apiv2beta3\",\n    \"description\": \"Cloud Tasks API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudtasks/latest/apiv2beta3\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/commerce/consumer/procurement/apiv1\": {\n    \"api_shortname\": \"cloudcommerceconsumerprocurement\",\n    \"distribution_name\": \"cloud.google.com/go/commerce/consumer/procurement/apiv1\",\n    \"description\": \"Cloud Commerce Consumer Procurement API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/commerce/latest/consumer/procurement/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/compute/apiv1\": {\n    \"api_shortname\": \"compute\",\n    \"distribution_name\": \"cloud.google.com/go/compute/apiv1\",\n    \"description\": \"Google Compute Engine API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/compute/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/compute/metadata\": {\n    \"api_shortname\": \"compute-metadata\",\n    \"distribution_name\": \"cloud.google.com/go/compute/metadata\",\n    \"description\": \"Service Metadata API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"manual\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/compute/latest/metadata\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"CORE\"\n  },\n  \"cloud.google.com/go/confidentialcomputing/apiv1\": {\n    \"api_shortname\": \"confidentialcomputing\",\n    \"distribution_name\": \"cloud.google.com/go/confidentialcomputing/apiv1\",\n    \"description\": \"Confidential Computing API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/confidentialcomputing/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/confidentialcomputing/apiv1alpha1\": {\n    \"api_shortname\": \"confidentialcomputing\",\n    \"distribution_name\": \"cloud.google.com/go/confidentialcomputing/apiv1alpha1\",\n    \"description\": \"Confidential Computing API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/confidentialcomputing/latest/apiv1alpha1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/config/apiv1\": {\n    \"api_shortname\": \"config\",\n    \"distribution_name\": \"cloud.google.com/go/config/apiv1\",\n    \"description\": \"Infrastructure Manager API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/config/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/contactcenterinsights/apiv1\": {\n    \"api_shortname\": \"contactcenterinsights\",\n    \"distribution_name\": \"cloud.google.com/go/contactcenterinsights/apiv1\",\n    \"description\": \"Contact Center AI Insights API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/contactcenterinsights/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/container/apiv1\": {\n    \"api_shortname\": \"container\",\n    \"distribution_name\": \"cloud.google.com/go/container/apiv1\",\n    \"description\": \"Kubernetes Engine API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/container/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/containeranalysis/apiv1beta1\": {\n    \"api_shortname\": \"containeranalysis\",\n    \"distribution_name\": \"cloud.google.com/go/containeranalysis/apiv1beta1\",\n    \"description\": \"Container Analysis API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/containeranalysis/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/datacatalog/apiv1\": {\n    \"api_shortname\": \"datacatalog\",\n    \"distribution_name\": \"cloud.google.com/go/datacatalog/apiv1\",\n    \"description\": \"Google Cloud Data Catalog API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/datacatalog/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/datacatalog/apiv1beta1\": {\n    \"api_shortname\": \"datacatalog\",\n    \"distribution_name\": \"cloud.google.com/go/datacatalog/apiv1beta1\",\n    \"description\": \"Google Cloud Data Catalog API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/datacatalog/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/datacatalog/lineage/apiv1\": {\n    \"api_shortname\": \"datalineage\",\n    \"distribution_name\": \"cloud.google.com/go/datacatalog/lineage/apiv1\",\n    \"description\": \"Data Lineage API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/datacatalog/latest/lineage/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/dataflow/apiv1beta3\": {\n    \"api_shortname\": \"dataflow\",\n    \"distribution_name\": \"cloud.google.com/go/dataflow/apiv1beta3\",\n    \"description\": \"Dataflow API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/dataflow/latest/apiv1beta3\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/dataform/apiv1beta1\": {\n    \"api_shortname\": \"dataform\",\n    \"distribution_name\": \"cloud.google.com/go/dataform/apiv1beta1\",\n    \"description\": \"Dataform API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/dataform/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/datafusion/apiv1\": {\n    \"api_shortname\": \"datafusion\",\n    \"distribution_name\": \"cloud.google.com/go/datafusion/apiv1\",\n    \"description\": \"Cloud Data Fusion API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/datafusion/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/datalabeling/apiv1beta1\": {\n    \"api_shortname\": \"datalabeling\",\n    \"distribution_name\": \"cloud.google.com/go/datalabeling/apiv1beta1\",\n    \"description\": \"Data Labeling API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/datalabeling/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/dataplex/apiv1\": {\n    \"api_shortname\": \"dataplex\",\n    \"distribution_name\": \"cloud.google.com/go/dataplex/apiv1\",\n    \"description\": \"Cloud Dataplex API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/dataplex/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/dataproc/v2/apiv1\": {\n    \"api_shortname\": \"dataproc\",\n    \"distribution_name\": \"cloud.google.com/go/dataproc/v2/apiv1\",\n    \"description\": \"Cloud Dataproc API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/dataproc/v2/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/dataqna/apiv1alpha\": {\n    \"api_shortname\": \"dataqna\",\n    \"distribution_name\": \"cloud.google.com/go/dataqna/apiv1alpha\",\n    \"description\": \"Data QnA API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/dataqna/latest/apiv1alpha\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/datastore\": {\n    \"api_shortname\": \"datastore\",\n    \"distribution_name\": \"cloud.google.com/go/datastore\",\n    \"description\": \"Cloud Datastore\",\n    \"language\": \"go\",\n    \"client_library_type\": \"manual\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/datastore/latest\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_MANUAL\"\n  },\n  \"cloud.google.com/go/datastore/admin/apiv1\": {\n    \"api_shortname\": \"datastore\",\n    \"distribution_name\": \"cloud.google.com/go/datastore/admin/apiv1\",\n    \"description\": \"Cloud Datastore API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/datastore/latest/admin/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/datastore/apiv1\": {\n    \"api_shortname\": \"datastore\",\n    \"distribution_name\": \"cloud.google.com/go/datastore/apiv1\",\n    \"description\": \"Cloud Datastore API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/datastore/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/datastream/apiv1\": {\n    \"api_shortname\": \"datastream\",\n    \"distribution_name\": \"cloud.google.com/go/datastream/apiv1\",\n    \"description\": \"Datastream API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/datastream/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/datastream/apiv1alpha1\": {\n    \"api_shortname\": \"datastream\",\n    \"distribution_name\": \"cloud.google.com/go/datastream/apiv1alpha1\",\n    \"description\": \"Datastream API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/datastream/latest/apiv1alpha1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/deploy/apiv1\": {\n    \"api_shortname\": \"clouddeploy\",\n    \"distribution_name\": \"cloud.google.com/go/deploy/apiv1\",\n    \"description\": \"Cloud Deploy API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/deploy/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/developerconnect/apiv1\": {\n    \"api_shortname\": \"developerconnect\",\n    \"distribution_name\": \"cloud.google.com/go/developerconnect/apiv1\",\n    \"description\": \"Developer Connect API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/developerconnect/latest/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/devicestreaming/apiv1\": {\n    \"api_shortname\": \"devicestreaming\",\n    \"distribution_name\": \"cloud.google.com/go/devicestreaming/apiv1\",\n    \"description\": \"Device Streaming API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/devicestreaming/latest/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/dialogflow/apiv2\": {\n    \"api_shortname\": \"dialogflow\",\n    \"distribution_name\": \"cloud.google.com/go/dialogflow/apiv2\",\n    \"description\": \"Dialogflow API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/dialogflow/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/dialogflow/apiv2beta1\": {\n    \"api_shortname\": \"dialogflow\",\n    \"distribution_name\": \"cloud.google.com/go/dialogflow/apiv2beta1\",\n    \"description\": \"Dialogflow API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/dialogflow/latest/apiv2beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/dialogflow/cx/apiv3\": {\n    \"api_shortname\": \"dialogflow\",\n    \"distribution_name\": \"cloud.google.com/go/dialogflow/cx/apiv3\",\n    \"description\": \"Dialogflow API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/dialogflow/latest/cx/apiv3\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/dialogflow/cx/apiv3beta1\": {\n    \"api_shortname\": \"dialogflow\",\n    \"distribution_name\": \"cloud.google.com/go/dialogflow/cx/apiv3beta1\",\n    \"description\": \"Dialogflow API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/dialogflow/latest/cx/apiv3beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/discoveryengine/apiv1\": {\n    \"api_shortname\": \"discoveryengine\",\n    \"distribution_name\": \"cloud.google.com/go/discoveryengine/apiv1\",\n    \"description\": \"Discovery Engine API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/discoveryengine/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/discoveryengine/apiv1alpha\": {\n    \"api_shortname\": \"discoveryengine\",\n    \"distribution_name\": \"cloud.google.com/go/discoveryengine/apiv1alpha\",\n    \"description\": \"Discovery Engine API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/discoveryengine/latest/apiv1alpha\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/discoveryengine/apiv1beta\": {\n    \"api_shortname\": \"discoveryengine\",\n    \"distribution_name\": \"cloud.google.com/go/discoveryengine/apiv1beta\",\n    \"description\": \"Discovery Engine API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/discoveryengine/latest/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/dlp/apiv2\": {\n    \"api_shortname\": \"dlp\",\n    \"distribution_name\": \"cloud.google.com/go/dlp/apiv2\",\n    \"description\": \"Sensitive Data Protection (DLP)\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/dlp/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/documentai/apiv1\": {\n    \"api_shortname\": \"documentai\",\n    \"distribution_name\": \"cloud.google.com/go/documentai/apiv1\",\n    \"description\": \"Cloud Document AI API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/documentai/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/documentai/apiv1beta3\": {\n    \"api_shortname\": \"documentai\",\n    \"distribution_name\": \"cloud.google.com/go/documentai/apiv1beta3\",\n    \"description\": \"Cloud Document AI API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/documentai/latest/apiv1beta3\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/domains/apiv1beta1\": {\n    \"api_shortname\": \"domains\",\n    \"distribution_name\": \"cloud.google.com/go/domains/apiv1beta1\",\n    \"description\": \"Cloud Domains API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/domains/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/edgecontainer/apiv1\": {\n    \"api_shortname\": \"edgecontainer\",\n    \"distribution_name\": \"cloud.google.com/go/edgecontainer/apiv1\",\n    \"description\": \"Distributed Cloud Edge Container API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/edgecontainer/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/edgenetwork/apiv1\": {\n    \"api_shortname\": \"edgenetwork\",\n    \"distribution_name\": \"cloud.google.com/go/edgenetwork/apiv1\",\n    \"description\": \"Distributed Cloud Edge Network API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/edgenetwork/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/errorreporting\": {\n    \"api_shortname\": \"clouderrorreporting\",\n    \"distribution_name\": \"cloud.google.com/go/errorreporting\",\n    \"description\": \"Cloud Error Reporting API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"manual\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/errorreporting/latest\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_MANUAL\"\n  },\n  \"cloud.google.com/go/errorreporting/apiv1beta1\": {\n    \"api_shortname\": \"clouderrorreporting\",\n    \"distribution_name\": \"cloud.google.com/go/errorreporting/apiv1beta1\",\n    \"description\": \"Error Reporting API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/latest/errorreporting/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/essentialcontacts/apiv1\": {\n    \"api_shortname\": \"essentialcontacts\",\n    \"distribution_name\": \"cloud.google.com/go/essentialcontacts/apiv1\",\n    \"description\": \"Essential Contacts API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/essentialcontacts/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/eventarc/apiv1\": {\n    \"api_shortname\": \"eventarc\",\n    \"distribution_name\": \"cloud.google.com/go/eventarc/apiv1\",\n    \"description\": \"Eventarc API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/eventarc/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/eventarc/publishing/apiv1\": {\n    \"api_shortname\": \"eventarcpublishing\",\n    \"distribution_name\": \"cloud.google.com/go/eventarc/publishing/apiv1\",\n    \"description\": \"Eventarc Publishing API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/eventarc/latest/publishing/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/filestore/apiv1\": {\n    \"api_shortname\": \"file\",\n    \"distribution_name\": \"cloud.google.com/go/filestore/apiv1\",\n    \"description\": \"Cloud Filestore API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/filestore/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/financialservices/apiv1\": {\n    \"api_shortname\": \"financialservices\",\n    \"distribution_name\": \"cloud.google.com/go/financialservices/apiv1\",\n    \"description\": \"Financial Services API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/financialservices/latest/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/firestore\": {\n    \"api_shortname\": \"firestore\",\n    \"distribution_name\": \"cloud.google.com/go/firestore\",\n    \"description\": \"Cloud Firestore API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"manual\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/firestore/latest\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_MANUAL\"\n  },\n  \"cloud.google.com/go/firestore/apiv1\": {\n    \"api_shortname\": \"firestore\",\n    \"distribution_name\": \"cloud.google.com/go/firestore/apiv1\",\n    \"description\": \"Cloud Firestore API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/firestore/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/firestore/apiv1/admin\": {\n    \"api_shortname\": \"firestore\",\n    \"distribution_name\": \"cloud.google.com/go/firestore/apiv1/admin\",\n    \"description\": \"Cloud Firestore API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/firestore/latest/apiv1/admin\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/functions/apiv1\": {\n    \"api_shortname\": \"cloudfunctions\",\n    \"distribution_name\": \"cloud.google.com/go/functions/apiv1\",\n    \"description\": \"Cloud Functions API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/functions/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/functions/apiv2\": {\n    \"api_shortname\": \"cloudfunctions\",\n    \"distribution_name\": \"cloud.google.com/go/functions/apiv2\",\n    \"description\": \"Cloud Functions API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/functions/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/functions/apiv2beta\": {\n    \"api_shortname\": \"cloudfunctions\",\n    \"distribution_name\": \"cloud.google.com/go/functions/apiv2beta\",\n    \"description\": \"Cloud Functions API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/functions/latest/apiv2beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/functions/metadata\": {\n    \"api_shortname\": \"firestore-metadata\",\n    \"distribution_name\": \"cloud.google.com/go/functions/metadata\",\n    \"description\": \"Cloud Functions\",\n    \"language\": \"go\",\n    \"client_library_type\": \"manual\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/functions/latest/metadata\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"CORE\"\n  },\n  \"cloud.google.com/go/gkebackup/apiv1\": {\n    \"api_shortname\": \"gkebackup\",\n    \"distribution_name\": \"cloud.google.com/go/gkebackup/apiv1\",\n    \"description\": \"Backup for GKE API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/gkebackup/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/gkeconnect/gateway/apiv1\": {\n    \"api_shortname\": \"connectgateway\",\n    \"distribution_name\": \"cloud.google.com/go/gkeconnect/gateway/apiv1\",\n    \"description\": \"Connect Gateway API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/gkeconnect/latest/gateway/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/gkeconnect/gateway/apiv1beta1\": {\n    \"api_shortname\": \"connectgateway\",\n    \"distribution_name\": \"cloud.google.com/go/gkeconnect/gateway/apiv1beta1\",\n    \"description\": \"Connect Gateway API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/gkeconnect/latest/gateway/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/gkehub/apiv1beta1\": {\n    \"api_shortname\": \"gkehub\",\n    \"distribution_name\": \"cloud.google.com/go/gkehub/apiv1beta1\",\n    \"description\": \"GKE Hub API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/gkehub/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/gkemulticloud/apiv1\": {\n    \"api_shortname\": \"gkemulticloud\",\n    \"distribution_name\": \"cloud.google.com/go/gkemulticloud/apiv1\",\n    \"description\": \"GKE Multi-Cloud API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/gkemulticloud/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/gsuiteaddons/apiv1\": {\n    \"api_shortname\": \"gsuiteaddons\",\n    \"distribution_name\": \"cloud.google.com/go/gsuiteaddons/apiv1\",\n    \"description\": \"Google Workspace add-ons API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/gsuiteaddons/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/iam\": {\n    \"api_shortname\": \"iam\",\n    \"distribution_name\": \"cloud.google.com/go/iam\",\n    \"description\": \"Cloud IAM\",\n    \"language\": \"go\",\n    \"client_library_type\": \"manual\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/iam/latest\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"CORE\"\n  },\n  \"cloud.google.com/go/iam/apiv1\": {\n    \"api_shortname\": \"iam-meta-api\",\n    \"distribution_name\": \"cloud.google.com/go/iam/apiv1\",\n    \"description\": \"IAM Meta API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/iam/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/iam/apiv2\": {\n    \"api_shortname\": \"iam\",\n    \"distribution_name\": \"cloud.google.com/go/iam/apiv2\",\n    \"description\": \"Identity and Access Management (IAM) API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/iam/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/iam/apiv3\": {\n    \"api_shortname\": \"iam\",\n    \"distribution_name\": \"cloud.google.com/go/iam/apiv3\",\n    \"description\": \"Identity and Access Management (IAM) API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/iam/latest/apiv3\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/iam/apiv3beta\": {\n    \"api_shortname\": \"iam\",\n    \"distribution_name\": \"cloud.google.com/go/iam/apiv3beta\",\n    \"description\": \"Identity and Access Management (IAM) API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/iam/latest/apiv3beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/iam/credentials/apiv1\": {\n    \"api_shortname\": \"iamcredentials\",\n    \"distribution_name\": \"cloud.google.com/go/iam/credentials/apiv1\",\n    \"description\": \"IAM Service Account Credentials API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/iam/latest/credentials/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/iap/apiv1\": {\n    \"api_shortname\": \"iap\",\n    \"distribution_name\": \"cloud.google.com/go/iap/apiv1\",\n    \"description\": \"Cloud Identity-Aware Proxy API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/iap/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/identitytoolkit/apiv2\": {\n    \"api_shortname\": \"identitytoolkit\",\n    \"distribution_name\": \"cloud.google.com/go/identitytoolkit/apiv2\",\n    \"description\": \"Identity Toolkit API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/identitytoolkit/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/ids/apiv1\": {\n    \"api_shortname\": \"ids\",\n    \"distribution_name\": \"cloud.google.com/go/ids/apiv1\",\n    \"description\": \"Cloud IDS API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/ids/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/iot/apiv1\": {\n    \"api_shortname\": \"cloudiot\",\n    \"distribution_name\": \"cloud.google.com/go/iot/apiv1\",\n    \"description\": \"Cloud IoT API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/iot/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/kms/apiv1\": {\n    \"api_shortname\": \"cloudkms\",\n    \"distribution_name\": \"cloud.google.com/go/kms/apiv1\",\n    \"description\": \"Cloud Key Management Service (KMS) API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/kms/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/kms/inventory/apiv1\": {\n    \"api_shortname\": \"kmsinventory\",\n    \"distribution_name\": \"cloud.google.com/go/kms/inventory/apiv1\",\n    \"description\": \"KMS Inventory API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/kms/latest/inventory/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/language/apiv1\": {\n    \"api_shortname\": \"language\",\n    \"distribution_name\": \"cloud.google.com/go/language/apiv1\",\n    \"description\": \"Cloud Natural Language API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/language/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/language/apiv1beta2\": {\n    \"api_shortname\": \"language\",\n    \"distribution_name\": \"cloud.google.com/go/language/apiv1beta2\",\n    \"description\": \"Cloud Natural Language API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/language/latest/apiv1beta2\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/language/apiv2\": {\n    \"api_shortname\": \"language\",\n    \"distribution_name\": \"cloud.google.com/go/language/apiv2\",\n    \"description\": \"Cloud Natural Language API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/language/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/lifesciences/apiv2beta\": {\n    \"api_shortname\": \"lifesciences\",\n    \"distribution_name\": \"cloud.google.com/go/lifesciences/apiv2beta\",\n    \"description\": \"Cloud Life Sciences API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/lifesciences/latest/apiv2beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/logging\": {\n    \"api_shortname\": \"logging\",\n    \"distribution_name\": \"cloud.google.com/go/logging\",\n    \"description\": \"Cloud Logging API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"manual\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/logging/latest\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_MANUAL\"\n  },\n  \"cloud.google.com/go/logging/apiv2\": {\n    \"api_shortname\": \"logging\",\n    \"distribution_name\": \"cloud.google.com/go/logging/apiv2\",\n    \"description\": \"Cloud Logging API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/logging/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/longrunning/autogen\": {\n    \"api_shortname\": \"longrunning\",\n    \"distribution_name\": \"cloud.google.com/go/longrunning/autogen\",\n    \"description\": \"Long Running Operations API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/longrunning/latest/autogen\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/lustre/apiv1\": {\n    \"api_shortname\": \"lustre\",\n    \"distribution_name\": \"cloud.google.com/go/lustre/apiv1\",\n    \"description\": \"Google Cloud Managed Lustre API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/lustre/latest/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/managedidentities/apiv1\": {\n    \"api_shortname\": \"managedidentities\",\n    \"distribution_name\": \"cloud.google.com/go/managedidentities/apiv1\",\n    \"description\": \"Managed Service for Microsoft Active Directory API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/managedidentities/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/managedkafka/apiv1\": {\n    \"api_shortname\": \"managedkafka\",\n    \"distribution_name\": \"cloud.google.com/go/managedkafka/apiv1\",\n    \"description\": \"Managed Service for Apache Kafka API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/managedkafka/latest/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/maps/addressvalidation/apiv1\": {\n    \"api_shortname\": \"addressvalidation\",\n    \"distribution_name\": \"cloud.google.com/go/maps/addressvalidation/apiv1\",\n    \"description\": \"Address Validation API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/maps/latest/addressvalidation/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/maps/areainsights/apiv1\": {\n    \"api_shortname\": \"areainsights\",\n    \"distribution_name\": \"cloud.google.com/go/maps/areainsights/apiv1\",\n    \"description\": \"Places Aggregate API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/maps/latest/areainsights/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/maps/fleetengine/apiv1\": {\n    \"api_shortname\": \"fleetengine\",\n    \"distribution_name\": \"cloud.google.com/go/maps/fleetengine/apiv1\",\n    \"description\": \"Local Rides and Deliveries API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/maps/latest/fleetengine/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/maps/fleetengine/delivery/apiv1\": {\n    \"api_shortname\": \"fleetengine\",\n    \"distribution_name\": \"cloud.google.com/go/maps/fleetengine/delivery/apiv1\",\n    \"description\": \"Last Mile Fleet Solution Delivery API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/maps/latest/fleetengine/delivery/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/maps/places/apiv1\": {\n    \"api_shortname\": \"places\",\n    \"distribution_name\": \"cloud.google.com/go/maps/places/apiv1\",\n    \"description\": \"Places API (New)\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/maps/latest/places/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/maps/routeoptimization/apiv1\": {\n    \"api_shortname\": \"routeoptimization\",\n    \"distribution_name\": \"cloud.google.com/go/maps/routeoptimization/apiv1\",\n    \"description\": \"Route Optimization API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/maps/latest/routeoptimization/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/maps/routing/apiv2\": {\n    \"api_shortname\": \"routes\",\n    \"distribution_name\": \"cloud.google.com/go/maps/routing/apiv2\",\n    \"description\": \"Routes API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/maps/latest/routing/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/maps/solar/apiv1\": {\n    \"api_shortname\": \"solar\",\n    \"distribution_name\": \"cloud.google.com/go/maps/solar/apiv1\",\n    \"description\": \"Solar API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/maps/latest/solar/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/mediatranslation/apiv1beta1\": {\n    \"api_shortname\": \"mediatranslation\",\n    \"distribution_name\": \"cloud.google.com/go/mediatranslation/apiv1beta1\",\n    \"description\": \"Media Translation API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/mediatranslation/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/memcache/apiv1\": {\n    \"api_shortname\": \"memcache\",\n    \"distribution_name\": \"cloud.google.com/go/memcache/apiv1\",\n    \"description\": \"Cloud Memorystore for Memcached API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/memcache/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/memcache/apiv1beta2\": {\n    \"api_shortname\": \"memcache\",\n    \"distribution_name\": \"cloud.google.com/go/memcache/apiv1beta2\",\n    \"description\": \"Cloud Memorystore for Memcached API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/memcache/latest/apiv1beta2\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/memorystore/apiv1\": {\n    \"api_shortname\": \"memorystore\",\n    \"distribution_name\": \"cloud.google.com/go/memorystore/apiv1\",\n    \"description\": \"Memorystore API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/memorystore/latest/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/memorystore/apiv1beta\": {\n    \"api_shortname\": \"memorystore\",\n    \"distribution_name\": \"cloud.google.com/go/memorystore/apiv1beta\",\n    \"description\": \"Memorystore API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/memorystore/latest/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/metastore/apiv1\": {\n    \"api_shortname\": \"metastore\",\n    \"distribution_name\": \"cloud.google.com/go/metastore/apiv1\",\n    \"description\": \"Dataproc Metastore API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/metastore/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/metastore/apiv1alpha\": {\n    \"api_shortname\": \"metastore\",\n    \"distribution_name\": \"cloud.google.com/go/metastore/apiv1alpha\",\n    \"description\": \"Dataproc Metastore API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/metastore/latest/apiv1alpha\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/metastore/apiv1beta\": {\n    \"api_shortname\": \"metastore\",\n    \"distribution_name\": \"cloud.google.com/go/metastore/apiv1beta\",\n    \"description\": \"Dataproc Metastore API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/metastore/latest/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/migrationcenter/apiv1\": {\n    \"api_shortname\": \"migrationcenter\",\n    \"distribution_name\": \"cloud.google.com/go/migrationcenter/apiv1\",\n    \"description\": \"Migration Center API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/migrationcenter/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/modelarmor/apiv1\": {\n    \"api_shortname\": \"modelarmor\",\n    \"distribution_name\": \"cloud.google.com/go/modelarmor/apiv1\",\n    \"description\": \"Model Armor API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/modelarmor/latest/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/monitoring/apiv3/v2\": {\n    \"api_shortname\": \"monitoring\",\n    \"distribution_name\": \"cloud.google.com/go/monitoring/apiv3/v2\",\n    \"description\": \"Cloud Monitoring API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/monitoring/latest/apiv3/v2\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/monitoring/dashboard/apiv1\": {\n    \"api_shortname\": \"monitoring\",\n    \"distribution_name\": \"cloud.google.com/go/monitoring/dashboard/apiv1\",\n    \"description\": \"Cloud Monitoring API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/monitoring/latest/dashboard/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/monitoring/metricsscope/apiv1\": {\n    \"api_shortname\": \"monitoring\",\n    \"distribution_name\": \"cloud.google.com/go/monitoring/metricsscope/apiv1\",\n    \"description\": \"Cloud Monitoring API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/monitoring/latest/metricsscope/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/netapp/apiv1\": {\n    \"api_shortname\": \"netapp\",\n    \"distribution_name\": \"cloud.google.com/go/netapp/apiv1\",\n    \"description\": \"NetApp API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/netapp/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/networkconnectivity/apiv1\": {\n    \"api_shortname\": \"networkconnectivity\",\n    \"distribution_name\": \"cloud.google.com/go/networkconnectivity/apiv1\",\n    \"description\": \"Network Connectivity API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/networkconnectivity/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/networkconnectivity/apiv1alpha1\": {\n    \"api_shortname\": \"networkconnectivity\",\n    \"distribution_name\": \"cloud.google.com/go/networkconnectivity/apiv1alpha1\",\n    \"description\": \"Network Connectivity API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/networkconnectivity/latest/apiv1alpha1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/networkmanagement/apiv1\": {\n    \"api_shortname\": \"networkmanagement\",\n    \"distribution_name\": \"cloud.google.com/go/networkmanagement/apiv1\",\n    \"description\": \"Network Management API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/networkmanagement/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/networksecurity/apiv1beta1\": {\n    \"api_shortname\": \"networksecurity\",\n    \"distribution_name\": \"cloud.google.com/go/networksecurity/apiv1beta1\",\n    \"description\": \"Network Security API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/networksecurity/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/networkservices/apiv1\": {\n    \"api_shortname\": \"networkservices\",\n    \"distribution_name\": \"cloud.google.com/go/networkservices/apiv1\",\n    \"description\": \"Network Services API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/networkservices/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/notebooks/apiv1\": {\n    \"api_shortname\": \"notebooks\",\n    \"distribution_name\": \"cloud.google.com/go/notebooks/apiv1\",\n    \"description\": \"Notebooks API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/notebooks/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/notebooks/apiv1beta1\": {\n    \"api_shortname\": \"notebooks\",\n    \"distribution_name\": \"cloud.google.com/go/notebooks/apiv1beta1\",\n    \"description\": \"Notebooks API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/notebooks/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/notebooks/apiv2\": {\n    \"api_shortname\": \"notebooks\",\n    \"distribution_name\": \"cloud.google.com/go/notebooks/apiv2\",\n    \"description\": \"Notebooks API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/notebooks/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/optimization/apiv1\": {\n    \"api_shortname\": \"cloudoptimization\",\n    \"distribution_name\": \"cloud.google.com/go/optimization/apiv1\",\n    \"description\": \"Cloud Optimization API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/optimization/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/oracledatabase/apiv1\": {\n    \"api_shortname\": \"oracledatabase\",\n    \"distribution_name\": \"cloud.google.com/go/oracledatabase/apiv1\",\n    \"description\": \"Oracle Database@Google Cloud API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/oracledatabase/latest/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/orchestration/airflow/service/apiv1\": {\n    \"api_shortname\": \"composer\",\n    \"distribution_name\": \"cloud.google.com/go/orchestration/airflow/service/apiv1\",\n    \"description\": \"Cloud Composer API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/orchestration/latest/airflow/service/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/orgpolicy/apiv2\": {\n    \"api_shortname\": \"orgpolicy\",\n    \"distribution_name\": \"cloud.google.com/go/orgpolicy/apiv2\",\n    \"description\": \"Organization Policy API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/orgpolicy/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/osconfig/agentendpoint/apiv1\": {\n    \"api_shortname\": \"osconfig\",\n    \"distribution_name\": \"cloud.google.com/go/osconfig/agentendpoint/apiv1\",\n    \"description\": \"OS Config API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/osconfig/latest/agentendpoint/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/osconfig/agentendpoint/apiv1beta\": {\n    \"api_shortname\": \"osconfig\",\n    \"distribution_name\": \"cloud.google.com/go/osconfig/agentendpoint/apiv1beta\",\n    \"description\": \"OS Config API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/osconfig/latest/agentendpoint/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/osconfig/apiv1\": {\n    \"api_shortname\": \"osconfig\",\n    \"distribution_name\": \"cloud.google.com/go/osconfig/apiv1\",\n    \"description\": \"OS Config API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/osconfig/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/osconfig/apiv1alpha\": {\n    \"api_shortname\": \"osconfig\",\n    \"distribution_name\": \"cloud.google.com/go/osconfig/apiv1alpha\",\n    \"description\": \"OS Config API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/osconfig/latest/apiv1alpha\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/osconfig/apiv1beta\": {\n    \"api_shortname\": \"osconfig\",\n    \"distribution_name\": \"cloud.google.com/go/osconfig/apiv1beta\",\n    \"description\": \"OS Config API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/osconfig/latest/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/oslogin/apiv1\": {\n    \"api_shortname\": \"oslogin\",\n    \"distribution_name\": \"cloud.google.com/go/oslogin/apiv1\",\n    \"description\": \"Cloud OS Login API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/oslogin/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/oslogin/apiv1beta\": {\n    \"api_shortname\": \"oslogin\",\n    \"distribution_name\": \"cloud.google.com/go/oslogin/apiv1beta\",\n    \"description\": \"Cloud OS Login API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/oslogin/latest/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/parallelstore/apiv1\": {\n    \"api_shortname\": \"parallelstore\",\n    \"distribution_name\": \"cloud.google.com/go/parallelstore/apiv1\",\n    \"description\": \"Parallelstore API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/parallelstore/latest/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/parallelstore/apiv1beta\": {\n    \"api_shortname\": \"parallelstore\",\n    \"distribution_name\": \"cloud.google.com/go/parallelstore/apiv1beta\",\n    \"description\": \"Parallelstore API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/parallelstore/latest/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/parametermanager/apiv1\": {\n    \"api_shortname\": \"parametermanager\",\n    \"distribution_name\": \"cloud.google.com/go/parametermanager/apiv1\",\n    \"description\": \"Parameter Manager API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/parametermanager/latest/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/phishingprotection/apiv1beta1\": {\n    \"api_shortname\": \"phishingprotection\",\n    \"distribution_name\": \"cloud.google.com/go/phishingprotection/apiv1beta1\",\n    \"description\": \"Phishing Protection API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/phishingprotection/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/policysimulator/apiv1\": {\n    \"api_shortname\": \"policysimulator\",\n    \"distribution_name\": \"cloud.google.com/go/policysimulator/apiv1\",\n    \"description\": \"Policy Simulator API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/policysimulator/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/policytroubleshooter/apiv1\": {\n    \"api_shortname\": \"policytroubleshooter\",\n    \"distribution_name\": \"cloud.google.com/go/policytroubleshooter/apiv1\",\n    \"description\": \"Policy Troubleshooter API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/policytroubleshooter/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/policytroubleshooter/iam/apiv3\": {\n    \"api_shortname\": \"policytroubleshooter\",\n    \"distribution_name\": \"cloud.google.com/go/policytroubleshooter/iam/apiv3\",\n    \"description\": \"Policy Troubleshooter API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/policytroubleshooter/latest/iam/apiv3\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/privatecatalog/apiv1beta1\": {\n    \"api_shortname\": \"cloudprivatecatalog\",\n    \"distribution_name\": \"cloud.google.com/go/privatecatalog/apiv1beta1\",\n    \"description\": \"Cloud Private Catalog API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/privatecatalog/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/privilegedaccessmanager/apiv1\": {\n    \"api_shortname\": \"privilegedaccessmanager\",\n    \"distribution_name\": \"cloud.google.com/go/privilegedaccessmanager/apiv1\",\n    \"description\": \"Privileged Access Manager API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/privilegedaccessmanager/latest/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/profiler\": {\n    \"api_shortname\": \"cloudprofiler\",\n    \"distribution_name\": \"cloud.google.com/go/profiler\",\n    \"description\": \"Cloud Profiler\",\n    \"language\": \"go\",\n    \"client_library_type\": \"manual\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/profiler/latest\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"AGENT\"\n  },\n  \"cloud.google.com/go/pubsub\": {\n    \"api_shortname\": \"pubsub\",\n    \"distribution_name\": \"cloud.google.com/go/pubsub\",\n    \"description\": \"Cloud PubSub\",\n    \"language\": \"go\",\n    \"client_library_type\": \"manual\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/pubsub/latest\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_MANUAL\"\n  },\n  \"cloud.google.com/go/pubsub/v2/apiv1\": {\n    \"api_shortname\": \"pubsub\",\n    \"distribution_name\": \"cloud.google.com/go/pubsub/v2/apiv1\",\n    \"description\": \"Cloud Pub/Sub API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/pubsub/latest/v2/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/pubsublite\": {\n    \"api_shortname\": \"pubsublite\",\n    \"distribution_name\": \"cloud.google.com/go/pubsublite\",\n    \"description\": \"Cloud PubSub Lite\",\n    \"language\": \"go\",\n    \"client_library_type\": \"manual\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/pubsublite/latest\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_MANUAL\"\n  },\n  \"cloud.google.com/go/pubsublite/apiv1\": {\n    \"api_shortname\": \"pubsublite\",\n    \"distribution_name\": \"cloud.google.com/go/pubsublite/apiv1\",\n    \"description\": \"Pub/Sub Lite API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/pubsublite/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/rapidmigrationassessment/apiv1\": {\n    \"api_shortname\": \"rapidmigrationassessment\",\n    \"distribution_name\": \"cloud.google.com/go/rapidmigrationassessment/apiv1\",\n    \"description\": \"Rapid Migration Assessment API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/rapidmigrationassessment/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/recaptchaenterprise/v2/apiv1\": {\n    \"api_shortname\": \"recaptchaenterprise\",\n    \"distribution_name\": \"cloud.google.com/go/recaptchaenterprise/v2/apiv1\",\n    \"description\": \"reCAPTCHA Enterprise API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/recaptchaenterprise/v2/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/recaptchaenterprise/v2/apiv1beta1\": {\n    \"api_shortname\": \"recaptchaenterprise\",\n    \"distribution_name\": \"cloud.google.com/go/recaptchaenterprise/v2/apiv1beta1\",\n    \"description\": \"reCAPTCHA Enterprise API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/recaptchaenterprise/v2/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/recommendationengine/apiv1beta1\": {\n    \"api_shortname\": \"recommendationengine\",\n    \"distribution_name\": \"cloud.google.com/go/recommendationengine/apiv1beta1\",\n    \"description\": \"Recommendations AI\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/recommendationengine/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/recommender/apiv1\": {\n    \"api_shortname\": \"recommender\",\n    \"distribution_name\": \"cloud.google.com/go/recommender/apiv1\",\n    \"description\": \"Recommender API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/recommender/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/recommender/apiv1beta1\": {\n    \"api_shortname\": \"recommender\",\n    \"distribution_name\": \"cloud.google.com/go/recommender/apiv1beta1\",\n    \"description\": \"Recommender API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/recommender/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/redis/apiv1\": {\n    \"api_shortname\": \"redis\",\n    \"distribution_name\": \"cloud.google.com/go/redis/apiv1\",\n    \"description\": \"Google Cloud Memorystore for Redis API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/redis/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/redis/apiv1beta1\": {\n    \"api_shortname\": \"redis\",\n    \"distribution_name\": \"cloud.google.com/go/redis/apiv1beta1\",\n    \"description\": \"Google Cloud Memorystore for Redis API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/redis/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/redis/cluster/apiv1\": {\n    \"api_shortname\": \"redis\",\n    \"distribution_name\": \"cloud.google.com/go/redis/cluster/apiv1\",\n    \"description\": \"Google Cloud Memorystore for Redis API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/redis/latest/cluster/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/resourcemanager/apiv2\": {\n    \"api_shortname\": \"cloudresourcemanager\",\n    \"distribution_name\": \"cloud.google.com/go/resourcemanager/apiv2\",\n    \"description\": \"Cloud Resource Manager API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/resourcemanager/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/resourcemanager/apiv3\": {\n    \"api_shortname\": \"cloudresourcemanager\",\n    \"distribution_name\": \"cloud.google.com/go/resourcemanager/apiv3\",\n    \"description\": \"Cloud Resource Manager API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/resourcemanager/latest/apiv3\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/retail/apiv2\": {\n    \"api_shortname\": \"retail\",\n    \"distribution_name\": \"cloud.google.com/go/retail/apiv2\",\n    \"description\": \"Vertex AI Search for commerce API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/retail/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/retail/apiv2alpha\": {\n    \"api_shortname\": \"retail\",\n    \"distribution_name\": \"cloud.google.com/go/retail/apiv2alpha\",\n    \"description\": \"Vertex AI Search for commerce API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/retail/latest/apiv2alpha\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/retail/apiv2beta\": {\n    \"api_shortname\": \"retail\",\n    \"distribution_name\": \"cloud.google.com/go/retail/apiv2beta\",\n    \"description\": \"Vertex AI Search for commerce API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/retail/latest/apiv2beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/rpcreplay\": {\n    \"api_shortname\": \"rpcreplay\",\n    \"distribution_name\": \"cloud.google.com/go/rpcreplay\",\n    \"description\": \"RPC Replay\",\n    \"language\": \"go\",\n    \"client_library_type\": \"manual\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/latest/rpcreplay\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"OTHER\"\n  },\n  \"cloud.google.com/go/run/apiv2\": {\n    \"api_shortname\": \"run\",\n    \"distribution_name\": \"cloud.google.com/go/run/apiv2\",\n    \"description\": \"Cloud Run Admin API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/run/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/scheduler/apiv1\": {\n    \"api_shortname\": \"cloudscheduler\",\n    \"distribution_name\": \"cloud.google.com/go/scheduler/apiv1\",\n    \"description\": \"Cloud Scheduler API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/scheduler/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/scheduler/apiv1beta1\": {\n    \"api_shortname\": \"cloudscheduler\",\n    \"distribution_name\": \"cloud.google.com/go/scheduler/apiv1beta1\",\n    \"description\": \"Cloud Scheduler API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/scheduler/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/secretmanager/apiv1\": {\n    \"api_shortname\": \"secretmanager\",\n    \"distribution_name\": \"cloud.google.com/go/secretmanager/apiv1\",\n    \"description\": \"Secret Manager API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/secretmanager/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/secretmanager/apiv1beta2\": {\n    \"api_shortname\": \"secretmanager\",\n    \"distribution_name\": \"cloud.google.com/go/secretmanager/apiv1beta2\",\n    \"description\": \"Secret Manager API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/secretmanager/latest/apiv1beta2\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/securesourcemanager/apiv1\": {\n    \"api_shortname\": \"securesourcemanager\",\n    \"distribution_name\": \"cloud.google.com/go/securesourcemanager/apiv1\",\n    \"description\": \"Secure Source Manager API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/securesourcemanager/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/security/privateca/apiv1\": {\n    \"api_shortname\": \"privateca\",\n    \"distribution_name\": \"cloud.google.com/go/security/privateca/apiv1\",\n    \"description\": \"Certificate Authority API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/security/latest/privateca/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/security/publicca/apiv1\": {\n    \"api_shortname\": \"publicca\",\n    \"distribution_name\": \"cloud.google.com/go/security/publicca/apiv1\",\n    \"description\": \"Public Certificate Authority API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/security/latest/publicca/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/security/publicca/apiv1beta1\": {\n    \"api_shortname\": \"publicca\",\n    \"distribution_name\": \"cloud.google.com/go/security/publicca/apiv1beta1\",\n    \"description\": \"Public Certificate Authority API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/security/latest/publicca/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/securitycenter/apiv1\": {\n    \"api_shortname\": \"securitycenter\",\n    \"distribution_name\": \"cloud.google.com/go/securitycenter/apiv1\",\n    \"description\": \"Security Command Center API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/securitycenter/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/securitycenter/apiv1beta1\": {\n    \"api_shortname\": \"securitycenter\",\n    \"distribution_name\": \"cloud.google.com/go/securitycenter/apiv1beta1\",\n    \"description\": \"Security Command Center API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/securitycenter/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/securitycenter/apiv1p1beta1\": {\n    \"api_shortname\": \"securitycenter\",\n    \"distribution_name\": \"cloud.google.com/go/securitycenter/apiv1p1beta1\",\n    \"description\": \"Security Command Center API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/securitycenter/latest/apiv1p1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/securitycenter/apiv2\": {\n    \"api_shortname\": \"securitycenter\",\n    \"distribution_name\": \"cloud.google.com/go/securitycenter/apiv2\",\n    \"description\": \"Security Command Center API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/securitycenter/latest/apiv2\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/securitycenter/settings/apiv1beta1\": {\n    \"api_shortname\": \"securitycenter\",\n    \"distribution_name\": \"cloud.google.com/go/securitycenter/settings/apiv1beta1\",\n    \"description\": \"Cloud Security Command Center API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/securitycenter/latest/settings/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/securitycentermanagement/apiv1\": {\n    \"api_shortname\": \"securitycentermanagement\",\n    \"distribution_name\": \"cloud.google.com/go/securitycentermanagement/apiv1\",\n    \"description\": \"Security Command Center Management API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/securitycentermanagement/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/securityposture/apiv1\": {\n    \"api_shortname\": \"securityposture\",\n    \"distribution_name\": \"cloud.google.com/go/securityposture/apiv1\",\n    \"description\": \"Security Posture API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/securityposture/latest/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/servicecontrol/apiv1\": {\n    \"api_shortname\": \"servicecontrol\",\n    \"distribution_name\": \"cloud.google.com/go/servicecontrol/apiv1\",\n    \"description\": \"Service Control API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/servicecontrol/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/servicedirectory/apiv1\": {\n    \"api_shortname\": \"servicedirectory\",\n    \"distribution_name\": \"cloud.google.com/go/servicedirectory/apiv1\",\n    \"description\": \"Service Directory API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/servicedirectory/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/servicedirectory/apiv1beta1\": {\n    \"api_shortname\": \"servicedirectory\",\n    \"distribution_name\": \"cloud.google.com/go/servicedirectory/apiv1beta1\",\n    \"description\": \"Service Directory API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/servicedirectory/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/servicehealth/apiv1\": {\n    \"api_shortname\": \"servicehealth\",\n    \"distribution_name\": \"cloud.google.com/go/servicehealth/apiv1\",\n    \"description\": \"Service Health API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/servicehealth/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/servicemanagement/apiv1\": {\n    \"api_shortname\": \"servicemanagement\",\n    \"distribution_name\": \"cloud.google.com/go/servicemanagement/apiv1\",\n    \"description\": \"Service Management API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/servicemanagement/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/serviceusage/apiv1\": {\n    \"api_shortname\": \"serviceusage\",\n    \"distribution_name\": \"cloud.google.com/go/serviceusage/apiv1\",\n    \"description\": \"Service Usage API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/serviceusage/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/shell/apiv1\": {\n    \"api_shortname\": \"cloudshell\",\n    \"distribution_name\": \"cloud.google.com/go/shell/apiv1\",\n    \"description\": \"Cloud Shell API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/shell/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/shopping/css/apiv1\": {\n    \"api_shortname\": \"css\",\n    \"distribution_name\": \"cloud.google.com/go/shopping/css/apiv1\",\n    \"description\": \"CSS API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/css/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/shopping/merchant/accounts/apiv1beta\": {\n    \"api_shortname\": \"merchantapi\",\n    \"distribution_name\": \"cloud.google.com/go/shopping/merchant/accounts/apiv1beta\",\n    \"description\": \"Merchant API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/accounts/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/shopping/merchant/conversions/apiv1beta\": {\n    \"api_shortname\": \"merchantapi\",\n    \"distribution_name\": \"cloud.google.com/go/shopping/merchant/conversions/apiv1beta\",\n    \"description\": \"Merchant API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/conversions/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/shopping/merchant/datasources/apiv1beta\": {\n    \"api_shortname\": \"merchantapi\",\n    \"distribution_name\": \"cloud.google.com/go/shopping/merchant/datasources/apiv1beta\",\n    \"description\": \"Merchant API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/datasources/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/shopping/merchant/inventories/apiv1beta\": {\n    \"api_shortname\": \"merchantapi\",\n    \"distribution_name\": \"cloud.google.com/go/shopping/merchant/inventories/apiv1beta\",\n    \"description\": \"Merchant API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/inventories/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/shopping/merchant/issueresolution/apiv1beta\": {\n    \"api_shortname\": \"merchantapi\",\n    \"distribution_name\": \"cloud.google.com/go/shopping/merchant/issueresolution/apiv1beta\",\n    \"description\": \"Merchant API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/issueresolution/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/shopping/merchant/lfp/apiv1beta\": {\n    \"api_shortname\": \"merchantapi\",\n    \"distribution_name\": \"cloud.google.com/go/shopping/merchant/lfp/apiv1beta\",\n    \"description\": \"Merchant API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/lfp/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/shopping/merchant/notifications/apiv1beta\": {\n    \"api_shortname\": \"merchantapi\",\n    \"distribution_name\": \"cloud.google.com/go/shopping/merchant/notifications/apiv1beta\",\n    \"description\": \"Merchant API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/notifications/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/shopping/merchant/ordertracking/apiv1beta\": {\n    \"api_shortname\": \"merchantapi\",\n    \"distribution_name\": \"cloud.google.com/go/shopping/merchant/ordertracking/apiv1beta\",\n    \"description\": \"Merchant API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/ordertracking/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/shopping/merchant/products/apiv1beta\": {\n    \"api_shortname\": \"merchantapi\",\n    \"distribution_name\": \"cloud.google.com/go/shopping/merchant/products/apiv1beta\",\n    \"description\": \"Merchant API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/products/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/shopping/merchant/promotions/apiv1beta\": {\n    \"api_shortname\": \"merchantapi\",\n    \"distribution_name\": \"cloud.google.com/go/shopping/merchant/promotions/apiv1beta\",\n    \"description\": \"Merchant API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/promotions/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/shopping/merchant/quota/apiv1beta\": {\n    \"api_shortname\": \"merchantapi\",\n    \"distribution_name\": \"cloud.google.com/go/shopping/merchant/quota/apiv1beta\",\n    \"description\": \"Merchant API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/quota/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/shopping/merchant/reports/apiv1beta\": {\n    \"api_shortname\": \"merchantapi\",\n    \"distribution_name\": \"cloud.google.com/go/shopping/merchant/reports/apiv1beta\",\n    \"description\": \"Merchant API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/reports/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/shopping/merchant/reviews/apiv1beta\": {\n    \"api_shortname\": \"merchantapi\",\n    \"distribution_name\": \"cloud.google.com/go/shopping/merchant/reviews/apiv1beta\",\n    \"description\": \"Merchant API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/reviews/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/spanner\": {\n    \"api_shortname\": \"spanner\",\n    \"distribution_name\": \"cloud.google.com/go/spanner\",\n    \"description\": \"Cloud Spanner\",\n    \"language\": \"go\",\n    \"client_library_type\": \"manual\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/spanner/latest\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_MANUAL\"\n  },\n  \"cloud.google.com/go/spanner/adapter/apiv1\": {\n    \"api_shortname\": \"spanner\",\n    \"distribution_name\": \"cloud.google.com/go/spanner/adapter/apiv1\",\n    \"description\": \"Cloud Spanner API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/spanner/latest/adapter/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/spanner/admin/database/apiv1\": {\n    \"api_shortname\": \"spanner\",\n    \"distribution_name\": \"cloud.google.com/go/spanner/admin/database/apiv1\",\n    \"description\": \"Cloud Spanner API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/spanner/latest/admin/database/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/spanner/admin/instance/apiv1\": {\n    \"api_shortname\": \"spanner\",\n    \"distribution_name\": \"cloud.google.com/go/spanner/admin/instance/apiv1\",\n    \"description\": \"Cloud Spanner Instance Admin API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/spanner/latest/admin/instance/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/spanner/apiv1\": {\n    \"api_shortname\": \"spanner\",\n    \"distribution_name\": \"cloud.google.com/go/spanner/apiv1\",\n    \"description\": \"Cloud Spanner API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/spanner/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/spanner/executor/apiv1\": {\n    \"api_shortname\": \"spanner-cloud-executor\",\n    \"distribution_name\": \"cloud.google.com/go/spanner/executor/apiv1\",\n    \"description\": \"Cloud Spanner Executor test API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/spanner/latest/executor/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/speech/apiv1\": {\n    \"api_shortname\": \"speech\",\n    \"distribution_name\": \"cloud.google.com/go/speech/apiv1\",\n    \"description\": \"Cloud Speech-to-Text API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/speech/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/speech/apiv1p1beta1\": {\n    \"api_shortname\": \"speech\",\n    \"distribution_name\": \"cloud.google.com/go/speech/apiv1p1beta1\",\n    \"description\": \"Cloud Speech-to-Text API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/speech/latest/apiv1p1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/speech/apiv2\": {\n    \"api_shortname\": \"speech\",\n    \"distribution_name\": \"cloud.google.com/go/speech/apiv2\",\n    \"description\": \"Cloud Speech-to-Text API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/speech/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/storage\": {\n    \"api_shortname\": \"storage\",\n    \"distribution_name\": \"cloud.google.com/go/storage\",\n    \"description\": \"Cloud Storage (GCS)\",\n    \"language\": \"go\",\n    \"client_library_type\": \"manual\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/storage/latest\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_MANUAL\"\n  },\n  \"cloud.google.com/go/storage/control/apiv2\": {\n    \"api_shortname\": \"storage\",\n    \"distribution_name\": \"cloud.google.com/go/storage/control/apiv2\",\n    \"description\": \"Storage Control API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/storage/latest/control/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/storage/internal/apiv2\": {\n    \"api_shortname\": \"storage\",\n    \"distribution_name\": \"cloud.google.com/go/storage/internal/apiv2\",\n    \"description\": \"Cloud Storage API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/storage/latest/internal/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/storagebatchoperations/apiv1\": {\n    \"api_shortname\": \"storagebatchoperations\",\n    \"distribution_name\": \"cloud.google.com/go/storagebatchoperations/apiv1\",\n    \"description\": \"Storage Batch Operations API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/storagebatchoperations/latest/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/storageinsights/apiv1\": {\n    \"api_shortname\": \"storageinsights\",\n    \"distribution_name\": \"cloud.google.com/go/storageinsights/apiv1\",\n    \"description\": \"Storage Insights API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/storageinsights/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/storagetransfer/apiv1\": {\n    \"api_shortname\": \"storagetransfer\",\n    \"distribution_name\": \"cloud.google.com/go/storagetransfer/apiv1\",\n    \"description\": \"Storage Transfer API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/storagetransfer/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/streetview/publish/apiv1\": {\n    \"api_shortname\": \"streetviewpublish\",\n    \"distribution_name\": \"cloud.google.com/go/streetview/publish/apiv1\",\n    \"description\": \"Street View Publish API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/streetview/latest/publish/apiv1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/support/apiv2\": {\n    \"api_shortname\": \"cloudsupport\",\n    \"distribution_name\": \"cloud.google.com/go/support/apiv2\",\n    \"description\": \"Google Cloud Support API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/support/latest/apiv2\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/talent/apiv4\": {\n    \"api_shortname\": \"jobs\",\n    \"distribution_name\": \"cloud.google.com/go/talent/apiv4\",\n    \"description\": \"Cloud Talent Solution API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/talent/latest/apiv4\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/talent/apiv4beta1\": {\n    \"api_shortname\": \"jobs\",\n    \"distribution_name\": \"cloud.google.com/go/talent/apiv4beta1\",\n    \"description\": \"Cloud Talent Solution API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/talent/latest/apiv4beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/telcoautomation/apiv1\": {\n    \"api_shortname\": \"telcoautomation\",\n    \"distribution_name\": \"cloud.google.com/go/telcoautomation/apiv1\",\n    \"description\": \"Telco Automation API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/telcoautomation/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/texttospeech/apiv1\": {\n    \"api_shortname\": \"texttospeech\",\n    \"distribution_name\": \"cloud.google.com/go/texttospeech/apiv1\",\n    \"description\": \"Cloud Text-to-Speech API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/texttospeech/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/tpu/apiv1\": {\n    \"api_shortname\": \"tpu\",\n    \"distribution_name\": \"cloud.google.com/go/tpu/apiv1\",\n    \"description\": \"Cloud TPU API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/tpu/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/trace/apiv1\": {\n    \"api_shortname\": \"cloudtrace\",\n    \"distribution_name\": \"cloud.google.com/go/trace/apiv1\",\n    \"description\": \"Stackdriver Trace API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/trace/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/trace/apiv2\": {\n    \"api_shortname\": \"cloudtrace\",\n    \"distribution_name\": \"cloud.google.com/go/trace/apiv2\",\n    \"description\": \"Stackdriver Trace API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/trace/latest/apiv2\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/translate/apiv3\": {\n    \"api_shortname\": \"translate\",\n    \"distribution_name\": \"cloud.google.com/go/translate/apiv3\",\n    \"description\": \"Cloud Translation API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/translate/latest/apiv3\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/video/livestream/apiv1\": {\n    \"api_shortname\": \"livestream\",\n    \"distribution_name\": \"cloud.google.com/go/video/livestream/apiv1\",\n    \"description\": \"Live Stream API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/video/latest/livestream/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/video/stitcher/apiv1\": {\n    \"api_shortname\": \"videostitcher\",\n    \"distribution_name\": \"cloud.google.com/go/video/stitcher/apiv1\",\n    \"description\": \"Video Stitcher API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/video/latest/stitcher/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/video/transcoder/apiv1\": {\n    \"api_shortname\": \"transcoder\",\n    \"distribution_name\": \"cloud.google.com/go/video/transcoder/apiv1\",\n    \"description\": \"Transcoder API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/video/latest/transcoder/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/videointelligence/apiv1\": {\n    \"api_shortname\": \"videointelligence\",\n    \"distribution_name\": \"cloud.google.com/go/videointelligence/apiv1\",\n    \"description\": \"Cloud Video Intelligence API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/videointelligence/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/videointelligence/apiv1beta2\": {\n    \"api_shortname\": \"videointelligence\",\n    \"distribution_name\": \"cloud.google.com/go/videointelligence/apiv1beta2\",\n    \"description\": \"Google Cloud Video Intelligence API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/videointelligence/latest/apiv1beta2\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/videointelligence/apiv1p3beta1\": {\n    \"api_shortname\": \"videointelligence\",\n    \"distribution_name\": \"cloud.google.com/go/videointelligence/apiv1p3beta1\",\n    \"description\": \"Cloud Video Intelligence API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/videointelligence/latest/apiv1p3beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/vision/v2/apiv1\": {\n    \"api_shortname\": \"vision\",\n    \"distribution_name\": \"cloud.google.com/go/vision/v2/apiv1\",\n    \"description\": \"Cloud Vision API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/vision/v2/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/vision/v2/apiv1p1beta1\": {\n    \"api_shortname\": \"vision\",\n    \"distribution_name\": \"cloud.google.com/go/vision/v2/apiv1p1beta1\",\n    \"description\": \"Cloud Vision API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/vision/v2/latest/apiv1p1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/visionai/apiv1\": {\n    \"api_shortname\": \"visionai\",\n    \"distribution_name\": \"cloud.google.com/go/visionai/apiv1\",\n    \"description\": \"Vision AI API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/visionai/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/vmmigration/apiv1\": {\n    \"api_shortname\": \"vmmigration\",\n    \"distribution_name\": \"cloud.google.com/go/vmmigration/apiv1\",\n    \"description\": \"VM Migration API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/vmmigration/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/vmwareengine/apiv1\": {\n    \"api_shortname\": \"vmwareengine\",\n    \"distribution_name\": \"cloud.google.com/go/vmwareengine/apiv1\",\n    \"description\": \"VMware Engine API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/vmwareengine/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/vpcaccess/apiv1\": {\n    \"api_shortname\": \"vpcaccess\",\n    \"distribution_name\": \"cloud.google.com/go/vpcaccess/apiv1\",\n    \"description\": \"Serverless VPC Access API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/vpcaccess/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/webrisk/apiv1\": {\n    \"api_shortname\": \"webrisk\",\n    \"distribution_name\": \"cloud.google.com/go/webrisk/apiv1\",\n    \"description\": \"Web Risk API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/webrisk/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/webrisk/apiv1beta1\": {\n    \"api_shortname\": \"webrisk\",\n    \"distribution_name\": \"cloud.google.com/go/webrisk/apiv1beta1\",\n    \"description\": \"Web Risk API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/webrisk/latest/apiv1beta1\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/websecurityscanner/apiv1\": {\n    \"api_shortname\": \"websecurityscanner\",\n    \"distribution_name\": \"cloud.google.com/go/websecurityscanner/apiv1\",\n    \"description\": \"Web Security Scanner API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/websecurityscanner/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/workflows/apiv1\": {\n    \"api_shortname\": \"workflows\",\n    \"distribution_name\": \"cloud.google.com/go/workflows/apiv1\",\n    \"description\": \"Workflows API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/workflows/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/workflows/apiv1beta\": {\n    \"api_shortname\": \"workflows\",\n    \"distribution_name\": \"cloud.google.com/go/workflows/apiv1beta\",\n    \"description\": \"Workflows API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/workflows/latest/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/workflows/executions/apiv1\": {\n    \"api_shortname\": \"workflowexecutions\",\n    \"distribution_name\": \"cloud.google.com/go/workflows/executions/apiv1\",\n    \"description\": \"Workflow Executions API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/workflows/latest/executions/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/workflows/executions/apiv1beta\": {\n    \"api_shortname\": \"workflowexecutions\",\n    \"distribution_name\": \"cloud.google.com/go/workflows/executions/apiv1beta\",\n    \"description\": \"Workflow Executions API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/workflows/latest/executions/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/workstations/apiv1\": {\n    \"api_shortname\": \"workstations\",\n    \"distribution_name\": \"cloud.google.com/go/workstations/apiv1\",\n    \"description\": \"Cloud Workstations API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/workstations/latest/apiv1\",\n    \"release_level\": \"stable\",\n    \"library_type\": \"GAPIC_AUTO\"\n  },\n  \"cloud.google.com/go/workstations/apiv1beta\": {\n    \"api_shortname\": \"workstations\",\n    \"distribution_name\": \"cloud.google.com/go/workstations/apiv1beta\",\n    \"description\": \"Cloud Workstations API\",\n    \"language\": \"go\",\n    \"client_library_type\": \"generated\",\n    \"client_documentation\": \"https://cloud.google.com/go/docs/reference/cloud.google.com/go/workstations/latest/apiv1beta\",\n    \"release_level\": \"preview\",\n    \"library_type\": \"GAPIC_AUTO\"\n  }\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/internal/README.md",
    "content": "# Internal\n\nThis directory contains internal code for cloud.google.com/go packages.\n\n## .repo-metadata-full.json\n\n`.repo-metadata-full.json` contains metadata about the packages in this repo. It\nis generated by `internal/gapicgen/generator`. It's processed by external tools\nto build lists of all of the packages.\n\nDon't make breaking changes to the format without consulting with the external\ntools.\n\nOne day, we may want to create individual `.repo-metadata.json` files next to\neach package, which is the pattern followed by some other languages. External\ntools would then talk to pkg.go.dev or some other service to get the overall\nlist of packages and use the `.repo-metadata.json` files to get the additional\nmetadata required. For now, `.repo-metadata-full.json` includes everything.\n\n### Updating OwlBot SHA\n\nYou may want to manually update the which version of the post-processor will be\nused -- to do this you need to update the SHA in the OwlBot lock file.\n\nSee the [postprocessor/README](postprocessor/README.md) for detailed\ninstructions.\n\n*Note*: OwlBot will eventually open a pull request to update this value if it\ndiscovers a new version of the container.\n"
  },
  {
    "path": "vendor/cloud.google.com/go/internal/annotate.go",
    "content": "// Copyright 2017 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage internal\n\nimport (\n\t\"fmt\"\n\n\t\"google.golang.org/api/googleapi\"\n\t\"google.golang.org/grpc/status\"\n)\n\n// Annotate prepends msg to the error message in err, attempting\n// to preserve other information in err, like an error code.\n//\n// Annotate panics if err is nil.\n//\n// Annotate knows about these error types:\n// - \"google.golang.org/grpc/status\".Status\n// - \"google.golang.org/api/googleapi\".Error\n// If the error is not one of these types, Annotate behaves\n// like\n//\n//\tfmt.Errorf(\"%s: %v\", msg, err)\nfunc Annotate(err error, msg string) error {\n\tif err == nil {\n\t\tpanic(\"Annotate called with nil\")\n\t}\n\tif s, ok := status.FromError(err); ok {\n\t\tp := s.Proto()\n\t\tp.Message = msg + \": \" + p.Message\n\t\treturn status.ErrorProto(p)\n\t}\n\tif g, ok := err.(*googleapi.Error); ok {\n\t\tg.Message = msg + \": \" + g.Message\n\t\treturn g\n\t}\n\treturn fmt.Errorf(\"%s: %v\", msg, err)\n}\n\n// Annotatef uses format and args to format a string, then calls Annotate.\nfunc Annotatef(err error, format string, args ...interface{}) error {\n\treturn Annotate(err, fmt.Sprintf(format, args...))\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/internal/gen_info.sh",
    "content": "#!/bin/sh\n\n# Script to generate info.go files with methods for all clients.\n\nif [[ $# != 2 ]]; then\n  echo >&2 \"usage: $0 DIR PACKAGE\"\n  exit 1\nfi\n\noutfile=info.go\n\ncd $1\n\ncat <<'EOF' > $outfile\n// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// SetGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Also passes any\n// provided key-value pairs. Intended for use by Google-written clients.\n//\n// Internal use only.\n\nEOF\n\necho -e >> $outfile \"package $2\\n\"\n\n\nawk '/^func \\(c \\*[A-Z].*\\) setGoogleClientInfo/ {\n  printf(\"func (c %s SetGoogleClientInfo(keyval ...string) {\\n\", $3);\n\tprintf(\"  c.setGoogleClientInfo(keyval...)\\n\");\n  printf(\"}\\n\\n\");\n}' *_client.go >> $outfile\n\ngofmt -w $outfile\n"
  },
  {
    "path": "vendor/cloud.google.com/go/internal/optional/optional.go",
    "content": "// Copyright 2016 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package optional provides versions of primitive types that can\n// be nil. These are useful in methods that update some of an API object's\n// fields.\npackage optional\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n)\n\ntype (\n\t// Bool is either a bool or nil.\n\tBool interface{}\n\n\t// String is either a string or nil.\n\tString interface{}\n\n\t// Int is either an int or nil.\n\tInt interface{}\n\n\t// Uint is either a uint or nil.\n\tUint interface{}\n\n\t// Float64 is either a float64 or nil.\n\tFloat64 interface{}\n\n\t// Duration is either a time.Duration or nil.\n\tDuration interface{}\n)\n\n// ToBool returns its argument as a bool.\n// It panics if its argument is nil or not a bool.\nfunc ToBool(v Bool) bool {\n\tx, ok := v.(bool)\n\tif !ok {\n\t\tdoPanic(\"Bool\", v)\n\t}\n\treturn x\n}\n\n// ToString returns its argument as a string.\n// It panics if its argument is nil or not a string.\nfunc ToString(v String) string {\n\tx, ok := v.(string)\n\tif !ok {\n\t\tdoPanic(\"String\", v)\n\t}\n\treturn x\n}\n\n// ToInt returns its argument as an int.\n// It panics if its argument is nil or not an int.\nfunc ToInt(v Int) int {\n\tx, ok := v.(int)\n\tif !ok {\n\t\tdoPanic(\"Int\", v)\n\t}\n\treturn x\n}\n\n// ToUint returns its argument as a uint.\n// It panics if its argument is nil or not a uint.\nfunc ToUint(v Uint) uint {\n\tx, ok := v.(uint)\n\tif !ok {\n\t\tdoPanic(\"Uint\", v)\n\t}\n\treturn x\n}\n\n// ToFloat64 returns its argument as a float64.\n// It panics if its argument is nil or not a float64.\nfunc ToFloat64(v Float64) float64 {\n\tx, ok := v.(float64)\n\tif !ok {\n\t\tdoPanic(\"Float64\", v)\n\t}\n\treturn x\n}\n\n// ToDuration returns its argument as a time.Duration.\n// It panics if its argument is nil or not a time.Duration.\nfunc ToDuration(v Duration) time.Duration {\n\tx, ok := v.(time.Duration)\n\tif !ok {\n\t\tdoPanic(\"Duration\", v)\n\t}\n\treturn x\n}\n\nfunc doPanic(capType string, v interface{}) {\n\tpanic(fmt.Sprintf(\"optional.%s value should be %s, got %T\", capType, strings.ToLower(capType), v))\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/internal/retry.go",
    "content": "// Copyright 2016 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage internal\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\tgax \"github.com/googleapis/gax-go/v2\"\n)\n\n// Retry calls the supplied function f repeatedly according to the provided\n// backoff parameters. It returns when one of the following occurs:\n// When f's first return value is true, Retry immediately returns with f's second\n// return value.\n// When the provided context is done, Retry returns with an error that\n// includes both ctx.Error() and the last error returned by f.\nfunc Retry(ctx context.Context, bo gax.Backoff, f func() (stop bool, err error)) error {\n\treturn retry(ctx, bo, f, gax.Sleep)\n}\n\nfunc retry(ctx context.Context, bo gax.Backoff, f func() (stop bool, err error),\n\tsleep func(context.Context, time.Duration) error) error {\n\tvar lastErr error\n\tfor {\n\t\tstop, err := f()\n\t\tif stop {\n\t\t\treturn err\n\t\t}\n\t\t// Remember the last \"real\" error from f.\n\t\tif err != nil && err != context.Canceled && err != context.DeadlineExceeded {\n\t\t\tlastErr = err\n\t\t}\n\t\tp := bo.Pause()\n\t\tif ctxErr := sleep(ctx, p); ctxErr != nil {\n\t\t\tif lastErr != nil {\n\t\t\t\treturn wrappedCallErr{ctxErr: ctxErr, wrappedErr: lastErr}\n\t\t\t}\n\t\t\treturn ctxErr\n\t\t}\n\t}\n}\n\n// Use this error type to return an error which allows introspection of both\n// the context error and the error from the service.\ntype wrappedCallErr struct {\n\tctxErr     error\n\twrappedErr error\n}\n\nfunc (e wrappedCallErr) Error() string {\n\treturn fmt.Sprintf(\"retry failed with %v; last error: %v\", e.ctxErr, e.wrappedErr)\n}\n\nfunc (e wrappedCallErr) Unwrap() error {\n\treturn e.wrappedErr\n}\n\n// Is allows errors.Is to match the error from the call as well as context\n// sentinel errors.\nfunc (e wrappedCallErr) Is(err error) bool {\n\treturn e.ctxErr == err || e.wrappedErr == err\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/internal/trace/trace.go",
    "content": "// Copyright 2018 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage trace\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/codes\"\n\t\"go.opentelemetry.io/otel/trace\"\n\t\"google.golang.org/api/googleapi\"\n\t\"google.golang.org/grpc/status\"\n)\n\nconst (\n\tOpenTelemetryTracerName = \"cloud.google.com/go\"\n)\n\n// StartSpan adds an OpenTelemetry span to the trace with the given name.\n//\n// The default experimental tracing support for OpenCensus is now deprecated in\n// the Google Cloud client libraries for Go.\nfunc StartSpan(ctx context.Context, name string) context.Context {\n\tctx, _ = otel.GetTracerProvider().Tracer(OpenTelemetryTracerName).Start(ctx, name)\n\treturn ctx\n}\n\n// EndSpan ends an OpenTelemetry span with the given error.\n//\n// The default experimental tracing support for OpenCensus is now deprecated in\n// the Google Cloud client libraries for Go.\nfunc EndSpan(ctx context.Context, err error) {\n\tspan := trace.SpanFromContext(ctx)\n\tif err != nil {\n\t\tspan.SetStatus(codes.Error, toOpenTelemetryStatusDescription(err))\n\t\tspan.RecordError(err)\n\t}\n\tspan.End()\n}\n\n// toOpenTelemetryStatus converts an error to an equivalent OpenTelemetry status description.\nfunc toOpenTelemetryStatusDescription(err error) string {\n\tvar err2 *googleapi.Error\n\tif ok := errors.As(err, &err2); ok {\n\t\treturn err2.Message\n\t} else if s, ok := status.FromError(err); ok {\n\t\treturn s.Message()\n\t} else {\n\t\treturn err.Error()\n\t}\n}\n\n// TracePrintf retrieves the current OpenTelemetry span from context, then calls\n// Span.AddEvent. The expected span must be an OpenTelemetry span. The default\n// experimental tracing support for OpenCensus is now deprecated in the Google\n// Cloud client libraries for Go.\nfunc TracePrintf(ctx context.Context, attrMap map[string]interface{}, format string, args ...interface{}) {\n\tattrs := otAttrs(attrMap)\n\ttrace.SpanFromContext(ctx).AddEvent(fmt.Sprintf(format, args...), trace.WithAttributes(attrs...))\n}\n\n// otAttrs converts a generic map to OpenTelemetry attributes.\nfunc otAttrs(attrMap map[string]interface{}) []attribute.KeyValue {\n\tvar attrs []attribute.KeyValue\n\tfor k, v := range attrMap {\n\t\tvar a attribute.KeyValue\n\t\tswitch v := v.(type) {\n\t\tcase string:\n\t\t\ta = attribute.Key(k).String(v)\n\t\tcase bool:\n\t\t\ta = attribute.Key(k).Bool(v)\n\t\tcase int:\n\t\t\ta = attribute.Key(k).Int(v)\n\t\tcase int64:\n\t\t\ta = attribute.Key(k).Int64(v)\n\t\tdefault:\n\t\t\ta = attribute.Key(k).String(fmt.Sprintf(\"%#v\", v))\n\t\t}\n\t\tattrs = append(attrs, a)\n\t}\n\treturn attrs\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/internal/version/update_version.sh",
    "content": "#!/bin/bash\n# Copyright 2019 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\ntoday=$(date +%Y%m%d)\n\nsed -i -r -e 's/const Repo = \"([0-9]{8})\"/const Repo = \"'$today'\"/' $GOFILE\n\n"
  },
  {
    "path": "vendor/cloud.google.com/go/internal/version/version.go",
    "content": "// Copyright 2016 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n//go:generate ./update_version.sh\n\n// Package version contains version information for Google Cloud Client\n// Libraries for Go, as reported in request headers.\npackage version\n\nimport (\n\t\"runtime\"\n\t\"strings\"\n\t\"unicode\"\n)\n\n// Repo is the current version of the client libraries in this\n// repo. It should be a date in YYYYMMDD format.\nconst Repo = \"20201104\"\n\n// Go returns the Go runtime version. The returned string\n// has no whitespace.\nfunc Go() string {\n\treturn goVersion\n}\n\nvar goVersion = goVer(runtime.Version())\n\nconst develPrefix = \"devel +\"\n\nfunc goVer(s string) string {\n\tif strings.HasPrefix(s, develPrefix) {\n\t\ts = s[len(develPrefix):]\n\t\tif p := strings.IndexFunc(s, unicode.IsSpace); p >= 0 {\n\t\t\ts = s[:p]\n\t\t}\n\t\treturn s\n\t}\n\n\tif strings.HasPrefix(s, \"go1\") {\n\t\ts = s[2:]\n\t\tvar prerelease string\n\t\tif p := strings.IndexFunc(s, notSemverRune); p >= 0 {\n\t\t\ts, prerelease = s[:p], s[p:]\n\t\t}\n\t\tif strings.HasSuffix(s, \".\") {\n\t\t\ts += \"0\"\n\t\t} else if strings.Count(s, \".\") < 2 {\n\t\t\ts += \".0\"\n\t\t}\n\t\tif prerelease != \"\" {\n\t\t\ts += \"-\" + prerelease\n\t\t}\n\t\treturn s\n\t}\n\treturn \"\"\n}\n\nfunc notSemverRune(r rune) bool {\n\treturn !strings.ContainsRune(\"0123456789.\", r)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/alert_policy_client.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go_gapic. DO NOT EDIT.\n\npackage monitoring\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"math\"\n\t\"net/url\"\n\t\"time\"\n\n\tmonitoringpb \"cloud.google.com/go/monitoring/apiv3/v2/monitoringpb\"\n\tgax \"github.com/googleapis/gax-go/v2\"\n\t\"google.golang.org/api/iterator\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/api/option/internaloption\"\n\tgtransport \"google.golang.org/api/transport/grpc\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\nvar newAlertPolicyClientHook clientHook\n\n// AlertPolicyCallOptions contains the retry settings for each method of AlertPolicyClient.\ntype AlertPolicyCallOptions struct {\n\tListAlertPolicies []gax.CallOption\n\tGetAlertPolicy    []gax.CallOption\n\tCreateAlertPolicy []gax.CallOption\n\tDeleteAlertPolicy []gax.CallOption\n\tUpdateAlertPolicy []gax.CallOption\n}\n\nfunc defaultAlertPolicyGRPCClientOptions() []option.ClientOption {\n\treturn []option.ClientOption{\n\t\tinternaloption.WithDefaultEndpoint(\"monitoring.googleapis.com:443\"),\n\t\tinternaloption.WithDefaultEndpointTemplate(\"monitoring.UNIVERSE_DOMAIN:443\"),\n\t\tinternaloption.WithDefaultMTLSEndpoint(\"monitoring.mtls.googleapis.com:443\"),\n\t\tinternaloption.WithDefaultUniverseDomain(\"googleapis.com\"),\n\t\tinternaloption.WithDefaultAudience(\"https://monitoring.googleapis.com/\"),\n\t\tinternaloption.WithDefaultScopes(DefaultAuthScopes()...),\n\t\tinternaloption.EnableJwtWithScope(),\n\t\tinternaloption.EnableNewAuthLibrary(),\n\t\toption.WithGRPCDialOption(grpc.WithDefaultCallOptions(\n\t\t\tgrpc.MaxCallRecvMsgSize(math.MaxInt32))),\n\t}\n}\n\nfunc defaultAlertPolicyCallOptions() *AlertPolicyCallOptions {\n\treturn &AlertPolicyCallOptions{\n\t\tListAlertPolicies: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tGetAlertPolicy: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tCreateAlertPolicy: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t},\n\t\tDeleteAlertPolicy: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tUpdateAlertPolicy: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t},\n\t}\n}\n\n// internalAlertPolicyClient is an interface that defines the methods available from Cloud Monitoring API.\ntype internalAlertPolicyClient interface {\n\tClose() error\n\tsetGoogleClientInfo(...string)\n\tConnection() *grpc.ClientConn\n\tListAlertPolicies(context.Context, *monitoringpb.ListAlertPoliciesRequest, ...gax.CallOption) *AlertPolicyIterator\n\tGetAlertPolicy(context.Context, *monitoringpb.GetAlertPolicyRequest, ...gax.CallOption) (*monitoringpb.AlertPolicy, error)\n\tCreateAlertPolicy(context.Context, *monitoringpb.CreateAlertPolicyRequest, ...gax.CallOption) (*monitoringpb.AlertPolicy, error)\n\tDeleteAlertPolicy(context.Context, *monitoringpb.DeleteAlertPolicyRequest, ...gax.CallOption) error\n\tUpdateAlertPolicy(context.Context, *monitoringpb.UpdateAlertPolicyRequest, ...gax.CallOption) (*monitoringpb.AlertPolicy, error)\n}\n\n// AlertPolicyClient is a client for interacting with Cloud Monitoring API.\n// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.\n//\n// The AlertPolicyService API is used to manage (list, create, delete,\n// edit) alert policies in Cloud Monitoring. An alerting policy is\n// a description of the conditions under which some aspect of your\n// system is considered to be “unhealthy” and the ways to notify\n// people or services about this state. In addition to using this API, alert\n// policies can also be managed through\n// Cloud Monitoring (at https://cloud.google.com/monitoring/docs/),\n// which can be reached by clicking the “Monitoring” tab in\n// Cloud console (at https://console.cloud.google.com/).\ntype AlertPolicyClient struct {\n\t// The internal transport-dependent client.\n\tinternalClient internalAlertPolicyClient\n\n\t// The call options for this service.\n\tCallOptions *AlertPolicyCallOptions\n}\n\n// Wrapper methods routed to the internal client.\n\n// Close closes the connection to the API service. The user should invoke this when\n// the client is no longer required.\nfunc (c *AlertPolicyClient) Close() error {\n\treturn c.internalClient.Close()\n}\n\n// setGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Intended for\n// use by Google-written clients.\nfunc (c *AlertPolicyClient) setGoogleClientInfo(keyval ...string) {\n\tc.internalClient.setGoogleClientInfo(keyval...)\n}\n\n// Connection returns a connection to the API service.\n//\n// Deprecated: Connections are now pooled so this method does not always\n// return the same resource.\nfunc (c *AlertPolicyClient) Connection() *grpc.ClientConn {\n\treturn c.internalClient.Connection()\n}\n\n// ListAlertPolicies lists the existing alerting policies for the workspace.\nfunc (c *AlertPolicyClient) ListAlertPolicies(ctx context.Context, req *monitoringpb.ListAlertPoliciesRequest, opts ...gax.CallOption) *AlertPolicyIterator {\n\treturn c.internalClient.ListAlertPolicies(ctx, req, opts...)\n}\n\n// GetAlertPolicy gets a single alerting policy.\nfunc (c *AlertPolicyClient) GetAlertPolicy(ctx context.Context, req *monitoringpb.GetAlertPolicyRequest, opts ...gax.CallOption) (*monitoringpb.AlertPolicy, error) {\n\treturn c.internalClient.GetAlertPolicy(ctx, req, opts...)\n}\n\n// CreateAlertPolicy creates a new alerting policy.\n//\n// Design your application to single-thread API calls that modify the state of\n// alerting policies in a single project. This includes calls to\n// CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy.\nfunc (c *AlertPolicyClient) CreateAlertPolicy(ctx context.Context, req *monitoringpb.CreateAlertPolicyRequest, opts ...gax.CallOption) (*monitoringpb.AlertPolicy, error) {\n\treturn c.internalClient.CreateAlertPolicy(ctx, req, opts...)\n}\n\n// DeleteAlertPolicy deletes an alerting policy.\n//\n// Design your application to single-thread API calls that modify the state of\n// alerting policies in a single project. This includes calls to\n// CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy.\nfunc (c *AlertPolicyClient) DeleteAlertPolicy(ctx context.Context, req *monitoringpb.DeleteAlertPolicyRequest, opts ...gax.CallOption) error {\n\treturn c.internalClient.DeleteAlertPolicy(ctx, req, opts...)\n}\n\n// UpdateAlertPolicy updates an alerting policy. You can either replace the entire policy with\n// a new one or replace only certain fields in the current alerting policy by\n// specifying the fields to be updated via updateMask. Returns the\n// updated alerting policy.\n//\n// Design your application to single-thread API calls that modify the state of\n// alerting policies in a single project. This includes calls to\n// CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy.\nfunc (c *AlertPolicyClient) UpdateAlertPolicy(ctx context.Context, req *monitoringpb.UpdateAlertPolicyRequest, opts ...gax.CallOption) (*monitoringpb.AlertPolicy, error) {\n\treturn c.internalClient.UpdateAlertPolicy(ctx, req, opts...)\n}\n\n// alertPolicyGRPCClient is a client for interacting with Cloud Monitoring API over gRPC transport.\n//\n// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.\ntype alertPolicyGRPCClient struct {\n\t// Connection pool of gRPC connections to the service.\n\tconnPool gtransport.ConnPool\n\n\t// Points back to the CallOptions field of the containing AlertPolicyClient\n\tCallOptions **AlertPolicyCallOptions\n\n\t// The gRPC API client.\n\talertPolicyClient monitoringpb.AlertPolicyServiceClient\n\n\t// The x-goog-* metadata to be sent with each request.\n\txGoogHeaders []string\n\n\tlogger *slog.Logger\n}\n\n// NewAlertPolicyClient creates a new alert policy service client based on gRPC.\n// The returned client must be Closed when it is done being used to clean up its underlying connections.\n//\n// The AlertPolicyService API is used to manage (list, create, delete,\n// edit) alert policies in Cloud Monitoring. An alerting policy is\n// a description of the conditions under which some aspect of your\n// system is considered to be “unhealthy” and the ways to notify\n// people or services about this state. In addition to using this API, alert\n// policies can also be managed through\n// Cloud Monitoring (at https://cloud.google.com/monitoring/docs/),\n// which can be reached by clicking the “Monitoring” tab in\n// Cloud console (at https://console.cloud.google.com/).\nfunc NewAlertPolicyClient(ctx context.Context, opts ...option.ClientOption) (*AlertPolicyClient, error) {\n\tclientOpts := defaultAlertPolicyGRPCClientOptions()\n\tif newAlertPolicyClientHook != nil {\n\t\thookOpts, err := newAlertPolicyClientHook(ctx, clientHookParams{})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tclientOpts = append(clientOpts, hookOpts...)\n\t}\n\n\tconnPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tclient := AlertPolicyClient{CallOptions: defaultAlertPolicyCallOptions()}\n\n\tc := &alertPolicyGRPCClient{\n\t\tconnPool:          connPool,\n\t\talertPolicyClient: monitoringpb.NewAlertPolicyServiceClient(connPool),\n\t\tCallOptions:       &client.CallOptions,\n\t\tlogger:            internaloption.GetLogger(opts),\n\t}\n\tc.setGoogleClientInfo()\n\n\tclient.internalClient = c\n\n\treturn &client, nil\n}\n\n// Connection returns a connection to the API service.\n//\n// Deprecated: Connections are now pooled so this method does not always\n// return the same resource.\nfunc (c *alertPolicyGRPCClient) Connection() *grpc.ClientConn {\n\treturn c.connPool.Conn()\n}\n\n// setGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Intended for\n// use by Google-written clients.\nfunc (c *alertPolicyGRPCClient) setGoogleClientInfo(keyval ...string) {\n\tkv := append([]string{\"gl-go\", gax.GoVersion}, keyval...)\n\tkv = append(kv, \"gapic\", getVersionClient(), \"gax\", gax.Version, \"grpc\", grpc.Version)\n\tc.xGoogHeaders = []string{\n\t\t\"x-goog-api-client\", gax.XGoogHeader(kv...),\n\t}\n}\n\n// Close closes the connection to the API service. The user should invoke this when\n// the client is no longer required.\nfunc (c *alertPolicyGRPCClient) Close() error {\n\treturn c.connPool.Close()\n}\n\nfunc (c *alertPolicyGRPCClient) ListAlertPolicies(ctx context.Context, req *monitoringpb.ListAlertPoliciesRequest, opts ...gax.CallOption) *AlertPolicyIterator {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).ListAlertPolicies[0:len((*c.CallOptions).ListAlertPolicies):len((*c.CallOptions).ListAlertPolicies)], opts...)\n\tit := &AlertPolicyIterator{}\n\treq = proto.Clone(req).(*monitoringpb.ListAlertPoliciesRequest)\n\tit.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.AlertPolicy, string, error) {\n\t\tresp := &monitoringpb.ListAlertPoliciesResponse{}\n\t\tif pageToken != \"\" {\n\t\t\treq.PageToken = pageToken\n\t\t}\n\t\tif pageSize > math.MaxInt32 {\n\t\t\treq.PageSize = math.MaxInt32\n\t\t} else if pageSize != 0 {\n\t\t\treq.PageSize = int32(pageSize)\n\t\t}\n\t\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\t\tvar err error\n\t\t\tresp, err = executeRPC(ctx, c.alertPolicyClient.ListAlertPolicies, req, settings.GRPC, c.logger, \"ListAlertPolicies\")\n\t\t\treturn err\n\t\t}, opts...)\n\t\tif err != nil {\n\t\t\treturn nil, \"\", err\n\t\t}\n\n\t\tit.Response = resp\n\t\treturn resp.GetAlertPolicies(), resp.GetNextPageToken(), nil\n\t}\n\tfetch := func(pageSize int, pageToken string) (string, error) {\n\t\titems, nextPageToken, err := it.InternalFetch(pageSize, pageToken)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tit.items = append(it.items, items...)\n\t\treturn nextPageToken, nil\n\t}\n\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)\n\tit.pageInfo.MaxSize = int(req.GetPageSize())\n\tit.pageInfo.Token = req.GetPageToken()\n\n\treturn it\n}\n\nfunc (c *alertPolicyGRPCClient) GetAlertPolicy(ctx context.Context, req *monitoringpb.GetAlertPolicyRequest, opts ...gax.CallOption) (*monitoringpb.AlertPolicy, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).GetAlertPolicy[0:len((*c.CallOptions).GetAlertPolicy):len((*c.CallOptions).GetAlertPolicy)], opts...)\n\tvar resp *monitoringpb.AlertPolicy\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.alertPolicyClient.GetAlertPolicy, req, settings.GRPC, c.logger, \"GetAlertPolicy\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *alertPolicyGRPCClient) CreateAlertPolicy(ctx context.Context, req *monitoringpb.CreateAlertPolicyRequest, opts ...gax.CallOption) (*monitoringpb.AlertPolicy, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).CreateAlertPolicy[0:len((*c.CallOptions).CreateAlertPolicy):len((*c.CallOptions).CreateAlertPolicy)], opts...)\n\tvar resp *monitoringpb.AlertPolicy\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.alertPolicyClient.CreateAlertPolicy, req, settings.GRPC, c.logger, \"CreateAlertPolicy\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *alertPolicyGRPCClient) DeleteAlertPolicy(ctx context.Context, req *monitoringpb.DeleteAlertPolicyRequest, opts ...gax.CallOption) error {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).DeleteAlertPolicy[0:len((*c.CallOptions).DeleteAlertPolicy):len((*c.CallOptions).DeleteAlertPolicy)], opts...)\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\t_, err = executeRPC(ctx, c.alertPolicyClient.DeleteAlertPolicy, req, settings.GRPC, c.logger, \"DeleteAlertPolicy\")\n\t\treturn err\n\t}, opts...)\n\treturn err\n}\n\nfunc (c *alertPolicyGRPCClient) UpdateAlertPolicy(ctx context.Context, req *monitoringpb.UpdateAlertPolicyRequest, opts ...gax.CallOption) (*monitoringpb.AlertPolicy, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"alert_policy.name\", url.QueryEscape(req.GetAlertPolicy().GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).UpdateAlertPolicy[0:len((*c.CallOptions).UpdateAlertPolicy):len((*c.CallOptions).UpdateAlertPolicy)], opts...)\n\tvar resp *monitoringpb.AlertPolicy\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.alertPolicyClient.UpdateAlertPolicy, req, settings.GRPC, c.logger, \"UpdateAlertPolicy\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/auxiliary.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go_gapic. DO NOT EDIT.\n\npackage monitoring\n\nimport (\n\tmonitoringpb \"cloud.google.com/go/monitoring/apiv3/v2/monitoringpb\"\n\t\"google.golang.org/api/iterator\"\n\tmetricpb \"google.golang.org/genproto/googleapis/api/metric\"\n\tmonitoredrespb \"google.golang.org/genproto/googleapis/api/monitoredres\"\n)\n\n// AlertPolicyIterator manages a stream of *monitoringpb.AlertPolicy.\ntype AlertPolicyIterator struct {\n\titems    []*monitoringpb.AlertPolicy\n\tpageInfo *iterator.PageInfo\n\tnextFunc func() error\n\n\t// Response is the raw response for the current page.\n\t// It must be cast to the RPC response type.\n\t// Calling Next() or InternalFetch() updates this value.\n\tResponse interface{}\n\n\t// InternalFetch is for use by the Google Cloud Libraries only.\n\t// It is not part of the stable interface of this package.\n\t//\n\t// InternalFetch returns results from a single call to the underlying RPC.\n\t// The number of results is no greater than pageSize.\n\t// If there are no more results, nextPageToken is empty and err is nil.\n\tInternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.AlertPolicy, nextPageToken string, err error)\n}\n\n// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details.\nfunc (it *AlertPolicyIterator) PageInfo() *iterator.PageInfo {\n\treturn it.pageInfo\n}\n\n// Next returns the next result. Its second return value is iterator.Done if there are no more\n// results. Once Next returns Done, all subsequent calls will return Done.\nfunc (it *AlertPolicyIterator) Next() (*monitoringpb.AlertPolicy, error) {\n\tvar item *monitoringpb.AlertPolicy\n\tif err := it.nextFunc(); err != nil {\n\t\treturn item, err\n\t}\n\titem = it.items[0]\n\tit.items = it.items[1:]\n\treturn item, nil\n}\n\nfunc (it *AlertPolicyIterator) bufLen() int {\n\treturn len(it.items)\n}\n\nfunc (it *AlertPolicyIterator) takeBuf() interface{} {\n\tb := it.items\n\tit.items = nil\n\treturn b\n}\n\n// GroupIterator manages a stream of *monitoringpb.Group.\ntype GroupIterator struct {\n\titems    []*monitoringpb.Group\n\tpageInfo *iterator.PageInfo\n\tnextFunc func() error\n\n\t// Response is the raw response for the current page.\n\t// It must be cast to the RPC response type.\n\t// Calling Next() or InternalFetch() updates this value.\n\tResponse interface{}\n\n\t// InternalFetch is for use by the Google Cloud Libraries only.\n\t// It is not part of the stable interface of this package.\n\t//\n\t// InternalFetch returns results from a single call to the underlying RPC.\n\t// The number of results is no greater than pageSize.\n\t// If there are no more results, nextPageToken is empty and err is nil.\n\tInternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.Group, nextPageToken string, err error)\n}\n\n// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details.\nfunc (it *GroupIterator) PageInfo() *iterator.PageInfo {\n\treturn it.pageInfo\n}\n\n// Next returns the next result. Its second return value is iterator.Done if there are no more\n// results. Once Next returns Done, all subsequent calls will return Done.\nfunc (it *GroupIterator) Next() (*monitoringpb.Group, error) {\n\tvar item *monitoringpb.Group\n\tif err := it.nextFunc(); err != nil {\n\t\treturn item, err\n\t}\n\titem = it.items[0]\n\tit.items = it.items[1:]\n\treturn item, nil\n}\n\nfunc (it *GroupIterator) bufLen() int {\n\treturn len(it.items)\n}\n\nfunc (it *GroupIterator) takeBuf() interface{} {\n\tb := it.items\n\tit.items = nil\n\treturn b\n}\n\n// MetricDescriptorIterator manages a stream of *metricpb.MetricDescriptor.\ntype MetricDescriptorIterator struct {\n\titems    []*metricpb.MetricDescriptor\n\tpageInfo *iterator.PageInfo\n\tnextFunc func() error\n\n\t// Response is the raw response for the current page.\n\t// It must be cast to the RPC response type.\n\t// Calling Next() or InternalFetch() updates this value.\n\tResponse interface{}\n\n\t// InternalFetch is for use by the Google Cloud Libraries only.\n\t// It is not part of the stable interface of this package.\n\t//\n\t// InternalFetch returns results from a single call to the underlying RPC.\n\t// The number of results is no greater than pageSize.\n\t// If there are no more results, nextPageToken is empty and err is nil.\n\tInternalFetch func(pageSize int, pageToken string) (results []*metricpb.MetricDescriptor, nextPageToken string, err error)\n}\n\n// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details.\nfunc (it *MetricDescriptorIterator) PageInfo() *iterator.PageInfo {\n\treturn it.pageInfo\n}\n\n// Next returns the next result. Its second return value is iterator.Done if there are no more\n// results. Once Next returns Done, all subsequent calls will return Done.\nfunc (it *MetricDescriptorIterator) Next() (*metricpb.MetricDescriptor, error) {\n\tvar item *metricpb.MetricDescriptor\n\tif err := it.nextFunc(); err != nil {\n\t\treturn item, err\n\t}\n\titem = it.items[0]\n\tit.items = it.items[1:]\n\treturn item, nil\n}\n\nfunc (it *MetricDescriptorIterator) bufLen() int {\n\treturn len(it.items)\n}\n\nfunc (it *MetricDescriptorIterator) takeBuf() interface{} {\n\tb := it.items\n\tit.items = nil\n\treturn b\n}\n\n// MonitoredResourceDescriptorIterator manages a stream of *monitoredrespb.MonitoredResourceDescriptor.\ntype MonitoredResourceDescriptorIterator struct {\n\titems    []*monitoredrespb.MonitoredResourceDescriptor\n\tpageInfo *iterator.PageInfo\n\tnextFunc func() error\n\n\t// Response is the raw response for the current page.\n\t// It must be cast to the RPC response type.\n\t// Calling Next() or InternalFetch() updates this value.\n\tResponse interface{}\n\n\t// InternalFetch is for use by the Google Cloud Libraries only.\n\t// It is not part of the stable interface of this package.\n\t//\n\t// InternalFetch returns results from a single call to the underlying RPC.\n\t// The number of results is no greater than pageSize.\n\t// If there are no more results, nextPageToken is empty and err is nil.\n\tInternalFetch func(pageSize int, pageToken string) (results []*monitoredrespb.MonitoredResourceDescriptor, nextPageToken string, err error)\n}\n\n// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details.\nfunc (it *MonitoredResourceDescriptorIterator) PageInfo() *iterator.PageInfo {\n\treturn it.pageInfo\n}\n\n// Next returns the next result. Its second return value is iterator.Done if there are no more\n// results. Once Next returns Done, all subsequent calls will return Done.\nfunc (it *MonitoredResourceDescriptorIterator) Next() (*monitoredrespb.MonitoredResourceDescriptor, error) {\n\tvar item *monitoredrespb.MonitoredResourceDescriptor\n\tif err := it.nextFunc(); err != nil {\n\t\treturn item, err\n\t}\n\titem = it.items[0]\n\tit.items = it.items[1:]\n\treturn item, nil\n}\n\nfunc (it *MonitoredResourceDescriptorIterator) bufLen() int {\n\treturn len(it.items)\n}\n\nfunc (it *MonitoredResourceDescriptorIterator) takeBuf() interface{} {\n\tb := it.items\n\tit.items = nil\n\treturn b\n}\n\n// MonitoredResourceIterator manages a stream of *monitoredrespb.MonitoredResource.\ntype MonitoredResourceIterator struct {\n\titems    []*monitoredrespb.MonitoredResource\n\tpageInfo *iterator.PageInfo\n\tnextFunc func() error\n\n\t// Response is the raw response for the current page.\n\t// It must be cast to the RPC response type.\n\t// Calling Next() or InternalFetch() updates this value.\n\tResponse interface{}\n\n\t// InternalFetch is for use by the Google Cloud Libraries only.\n\t// It is not part of the stable interface of this package.\n\t//\n\t// InternalFetch returns results from a single call to the underlying RPC.\n\t// The number of results is no greater than pageSize.\n\t// If there are no more results, nextPageToken is empty and err is nil.\n\tInternalFetch func(pageSize int, pageToken string) (results []*monitoredrespb.MonitoredResource, nextPageToken string, err error)\n}\n\n// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details.\nfunc (it *MonitoredResourceIterator) PageInfo() *iterator.PageInfo {\n\treturn it.pageInfo\n}\n\n// Next returns the next result. Its second return value is iterator.Done if there are no more\n// results. Once Next returns Done, all subsequent calls will return Done.\nfunc (it *MonitoredResourceIterator) Next() (*monitoredrespb.MonitoredResource, error) {\n\tvar item *monitoredrespb.MonitoredResource\n\tif err := it.nextFunc(); err != nil {\n\t\treturn item, err\n\t}\n\titem = it.items[0]\n\tit.items = it.items[1:]\n\treturn item, nil\n}\n\nfunc (it *MonitoredResourceIterator) bufLen() int {\n\treturn len(it.items)\n}\n\nfunc (it *MonitoredResourceIterator) takeBuf() interface{} {\n\tb := it.items\n\tit.items = nil\n\treturn b\n}\n\n// NotificationChannelDescriptorIterator manages a stream of *monitoringpb.NotificationChannelDescriptor.\ntype NotificationChannelDescriptorIterator struct {\n\titems    []*monitoringpb.NotificationChannelDescriptor\n\tpageInfo *iterator.PageInfo\n\tnextFunc func() error\n\n\t// Response is the raw response for the current page.\n\t// It must be cast to the RPC response type.\n\t// Calling Next() or InternalFetch() updates this value.\n\tResponse interface{}\n\n\t// InternalFetch is for use by the Google Cloud Libraries only.\n\t// It is not part of the stable interface of this package.\n\t//\n\t// InternalFetch returns results from a single call to the underlying RPC.\n\t// The number of results is no greater than pageSize.\n\t// If there are no more results, nextPageToken is empty and err is nil.\n\tInternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.NotificationChannelDescriptor, nextPageToken string, err error)\n}\n\n// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details.\nfunc (it *NotificationChannelDescriptorIterator) PageInfo() *iterator.PageInfo {\n\treturn it.pageInfo\n}\n\n// Next returns the next result. Its second return value is iterator.Done if there are no more\n// results. Once Next returns Done, all subsequent calls will return Done.\nfunc (it *NotificationChannelDescriptorIterator) Next() (*monitoringpb.NotificationChannelDescriptor, error) {\n\tvar item *monitoringpb.NotificationChannelDescriptor\n\tif err := it.nextFunc(); err != nil {\n\t\treturn item, err\n\t}\n\titem = it.items[0]\n\tit.items = it.items[1:]\n\treturn item, nil\n}\n\nfunc (it *NotificationChannelDescriptorIterator) bufLen() int {\n\treturn len(it.items)\n}\n\nfunc (it *NotificationChannelDescriptorIterator) takeBuf() interface{} {\n\tb := it.items\n\tit.items = nil\n\treturn b\n}\n\n// NotificationChannelIterator manages a stream of *monitoringpb.NotificationChannel.\ntype NotificationChannelIterator struct {\n\titems    []*monitoringpb.NotificationChannel\n\tpageInfo *iterator.PageInfo\n\tnextFunc func() error\n\n\t// Response is the raw response for the current page.\n\t// It must be cast to the RPC response type.\n\t// Calling Next() or InternalFetch() updates this value.\n\tResponse interface{}\n\n\t// InternalFetch is for use by the Google Cloud Libraries only.\n\t// It is not part of the stable interface of this package.\n\t//\n\t// InternalFetch returns results from a single call to the underlying RPC.\n\t// The number of results is no greater than pageSize.\n\t// If there are no more results, nextPageToken is empty and err is nil.\n\tInternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.NotificationChannel, nextPageToken string, err error)\n}\n\n// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details.\nfunc (it *NotificationChannelIterator) PageInfo() *iterator.PageInfo {\n\treturn it.pageInfo\n}\n\n// Next returns the next result. Its second return value is iterator.Done if there are no more\n// results. Once Next returns Done, all subsequent calls will return Done.\nfunc (it *NotificationChannelIterator) Next() (*monitoringpb.NotificationChannel, error) {\n\tvar item *monitoringpb.NotificationChannel\n\tif err := it.nextFunc(); err != nil {\n\t\treturn item, err\n\t}\n\titem = it.items[0]\n\tit.items = it.items[1:]\n\treturn item, nil\n}\n\nfunc (it *NotificationChannelIterator) bufLen() int {\n\treturn len(it.items)\n}\n\nfunc (it *NotificationChannelIterator) takeBuf() interface{} {\n\tb := it.items\n\tit.items = nil\n\treturn b\n}\n\n// ServiceIterator manages a stream of *monitoringpb.Service.\ntype ServiceIterator struct {\n\titems    []*monitoringpb.Service\n\tpageInfo *iterator.PageInfo\n\tnextFunc func() error\n\n\t// Response is the raw response for the current page.\n\t// It must be cast to the RPC response type.\n\t// Calling Next() or InternalFetch() updates this value.\n\tResponse interface{}\n\n\t// InternalFetch is for use by the Google Cloud Libraries only.\n\t// It is not part of the stable interface of this package.\n\t//\n\t// InternalFetch returns results from a single call to the underlying RPC.\n\t// The number of results is no greater than pageSize.\n\t// If there are no more results, nextPageToken is empty and err is nil.\n\tInternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.Service, nextPageToken string, err error)\n}\n\n// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details.\nfunc (it *ServiceIterator) PageInfo() *iterator.PageInfo {\n\treturn it.pageInfo\n}\n\n// Next returns the next result. Its second return value is iterator.Done if there are no more\n// results. Once Next returns Done, all subsequent calls will return Done.\nfunc (it *ServiceIterator) Next() (*monitoringpb.Service, error) {\n\tvar item *monitoringpb.Service\n\tif err := it.nextFunc(); err != nil {\n\t\treturn item, err\n\t}\n\titem = it.items[0]\n\tit.items = it.items[1:]\n\treturn item, nil\n}\n\nfunc (it *ServiceIterator) bufLen() int {\n\treturn len(it.items)\n}\n\nfunc (it *ServiceIterator) takeBuf() interface{} {\n\tb := it.items\n\tit.items = nil\n\treturn b\n}\n\n// ServiceLevelObjectiveIterator manages a stream of *monitoringpb.ServiceLevelObjective.\ntype ServiceLevelObjectiveIterator struct {\n\titems    []*monitoringpb.ServiceLevelObjective\n\tpageInfo *iterator.PageInfo\n\tnextFunc func() error\n\n\t// Response is the raw response for the current page.\n\t// It must be cast to the RPC response type.\n\t// Calling Next() or InternalFetch() updates this value.\n\tResponse interface{}\n\n\t// InternalFetch is for use by the Google Cloud Libraries only.\n\t// It is not part of the stable interface of this package.\n\t//\n\t// InternalFetch returns results from a single call to the underlying RPC.\n\t// The number of results is no greater than pageSize.\n\t// If there are no more results, nextPageToken is empty and err is nil.\n\tInternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.ServiceLevelObjective, nextPageToken string, err error)\n}\n\n// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details.\nfunc (it *ServiceLevelObjectiveIterator) PageInfo() *iterator.PageInfo {\n\treturn it.pageInfo\n}\n\n// Next returns the next result. Its second return value is iterator.Done if there are no more\n// results. Once Next returns Done, all subsequent calls will return Done.\nfunc (it *ServiceLevelObjectiveIterator) Next() (*monitoringpb.ServiceLevelObjective, error) {\n\tvar item *monitoringpb.ServiceLevelObjective\n\tif err := it.nextFunc(); err != nil {\n\t\treturn item, err\n\t}\n\titem = it.items[0]\n\tit.items = it.items[1:]\n\treturn item, nil\n}\n\nfunc (it *ServiceLevelObjectiveIterator) bufLen() int {\n\treturn len(it.items)\n}\n\nfunc (it *ServiceLevelObjectiveIterator) takeBuf() interface{} {\n\tb := it.items\n\tit.items = nil\n\treturn b\n}\n\n// SnoozeIterator manages a stream of *monitoringpb.Snooze.\ntype SnoozeIterator struct {\n\titems    []*monitoringpb.Snooze\n\tpageInfo *iterator.PageInfo\n\tnextFunc func() error\n\n\t// Response is the raw response for the current page.\n\t// It must be cast to the RPC response type.\n\t// Calling Next() or InternalFetch() updates this value.\n\tResponse interface{}\n\n\t// InternalFetch is for use by the Google Cloud Libraries only.\n\t// It is not part of the stable interface of this package.\n\t//\n\t// InternalFetch returns results from a single call to the underlying RPC.\n\t// The number of results is no greater than pageSize.\n\t// If there are no more results, nextPageToken is empty and err is nil.\n\tInternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.Snooze, nextPageToken string, err error)\n}\n\n// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details.\nfunc (it *SnoozeIterator) PageInfo() *iterator.PageInfo {\n\treturn it.pageInfo\n}\n\n// Next returns the next result. Its second return value is iterator.Done if there are no more\n// results. Once Next returns Done, all subsequent calls will return Done.\nfunc (it *SnoozeIterator) Next() (*monitoringpb.Snooze, error) {\n\tvar item *monitoringpb.Snooze\n\tif err := it.nextFunc(); err != nil {\n\t\treturn item, err\n\t}\n\titem = it.items[0]\n\tit.items = it.items[1:]\n\treturn item, nil\n}\n\nfunc (it *SnoozeIterator) bufLen() int {\n\treturn len(it.items)\n}\n\nfunc (it *SnoozeIterator) takeBuf() interface{} {\n\tb := it.items\n\tit.items = nil\n\treturn b\n}\n\n// TimeSeriesDataIterator manages a stream of *monitoringpb.TimeSeriesData.\ntype TimeSeriesDataIterator struct {\n\titems    []*monitoringpb.TimeSeriesData\n\tpageInfo *iterator.PageInfo\n\tnextFunc func() error\n\n\t// Response is the raw response for the current page.\n\t// It must be cast to the RPC response type.\n\t// Calling Next() or InternalFetch() updates this value.\n\tResponse interface{}\n\n\t// InternalFetch is for use by the Google Cloud Libraries only.\n\t// It is not part of the stable interface of this package.\n\t//\n\t// InternalFetch returns results from a single call to the underlying RPC.\n\t// The number of results is no greater than pageSize.\n\t// If there are no more results, nextPageToken is empty and err is nil.\n\tInternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.TimeSeriesData, nextPageToken string, err error)\n}\n\n// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details.\nfunc (it *TimeSeriesDataIterator) PageInfo() *iterator.PageInfo {\n\treturn it.pageInfo\n}\n\n// Next returns the next result. Its second return value is iterator.Done if there are no more\n// results. Once Next returns Done, all subsequent calls will return Done.\nfunc (it *TimeSeriesDataIterator) Next() (*monitoringpb.TimeSeriesData, error) {\n\tvar item *monitoringpb.TimeSeriesData\n\tif err := it.nextFunc(); err != nil {\n\t\treturn item, err\n\t}\n\titem = it.items[0]\n\tit.items = it.items[1:]\n\treturn item, nil\n}\n\nfunc (it *TimeSeriesDataIterator) bufLen() int {\n\treturn len(it.items)\n}\n\nfunc (it *TimeSeriesDataIterator) takeBuf() interface{} {\n\tb := it.items\n\tit.items = nil\n\treturn b\n}\n\n// TimeSeriesIterator manages a stream of *monitoringpb.TimeSeries.\ntype TimeSeriesIterator struct {\n\titems    []*monitoringpb.TimeSeries\n\tpageInfo *iterator.PageInfo\n\tnextFunc func() error\n\n\t// Response is the raw response for the current page.\n\t// It must be cast to the RPC response type.\n\t// Calling Next() or InternalFetch() updates this value.\n\tResponse interface{}\n\n\t// InternalFetch is for use by the Google Cloud Libraries only.\n\t// It is not part of the stable interface of this package.\n\t//\n\t// InternalFetch returns results from a single call to the underlying RPC.\n\t// The number of results is no greater than pageSize.\n\t// If there are no more results, nextPageToken is empty and err is nil.\n\tInternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.TimeSeries, nextPageToken string, err error)\n}\n\n// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details.\nfunc (it *TimeSeriesIterator) PageInfo() *iterator.PageInfo {\n\treturn it.pageInfo\n}\n\n// Next returns the next result. Its second return value is iterator.Done if there are no more\n// results. Once Next returns Done, all subsequent calls will return Done.\nfunc (it *TimeSeriesIterator) Next() (*monitoringpb.TimeSeries, error) {\n\tvar item *monitoringpb.TimeSeries\n\tif err := it.nextFunc(); err != nil {\n\t\treturn item, err\n\t}\n\titem = it.items[0]\n\tit.items = it.items[1:]\n\treturn item, nil\n}\n\nfunc (it *TimeSeriesIterator) bufLen() int {\n\treturn len(it.items)\n}\n\nfunc (it *TimeSeriesIterator) takeBuf() interface{} {\n\tb := it.items\n\tit.items = nil\n\treturn b\n}\n\n// UptimeCheckConfigIterator manages a stream of *monitoringpb.UptimeCheckConfig.\ntype UptimeCheckConfigIterator struct {\n\titems    []*monitoringpb.UptimeCheckConfig\n\tpageInfo *iterator.PageInfo\n\tnextFunc func() error\n\n\t// Response is the raw response for the current page.\n\t// It must be cast to the RPC response type.\n\t// Calling Next() or InternalFetch() updates this value.\n\tResponse interface{}\n\n\t// InternalFetch is for use by the Google Cloud Libraries only.\n\t// It is not part of the stable interface of this package.\n\t//\n\t// InternalFetch returns results from a single call to the underlying RPC.\n\t// The number of results is no greater than pageSize.\n\t// If there are no more results, nextPageToken is empty and err is nil.\n\tInternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.UptimeCheckConfig, nextPageToken string, err error)\n}\n\n// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details.\nfunc (it *UptimeCheckConfigIterator) PageInfo() *iterator.PageInfo {\n\treturn it.pageInfo\n}\n\n// Next returns the next result. Its second return value is iterator.Done if there are no more\n// results. Once Next returns Done, all subsequent calls will return Done.\nfunc (it *UptimeCheckConfigIterator) Next() (*monitoringpb.UptimeCheckConfig, error) {\n\tvar item *monitoringpb.UptimeCheckConfig\n\tif err := it.nextFunc(); err != nil {\n\t\treturn item, err\n\t}\n\titem = it.items[0]\n\tit.items = it.items[1:]\n\treturn item, nil\n}\n\nfunc (it *UptimeCheckConfigIterator) bufLen() int {\n\treturn len(it.items)\n}\n\nfunc (it *UptimeCheckConfigIterator) takeBuf() interface{} {\n\tb := it.items\n\tit.items = nil\n\treturn b\n}\n\n// UptimeCheckIpIterator manages a stream of *monitoringpb.UptimeCheckIp.\ntype UptimeCheckIpIterator struct {\n\titems    []*monitoringpb.UptimeCheckIp\n\tpageInfo *iterator.PageInfo\n\tnextFunc func() error\n\n\t// Response is the raw response for the current page.\n\t// It must be cast to the RPC response type.\n\t// Calling Next() or InternalFetch() updates this value.\n\tResponse interface{}\n\n\t// InternalFetch is for use by the Google Cloud Libraries only.\n\t// It is not part of the stable interface of this package.\n\t//\n\t// InternalFetch returns results from a single call to the underlying RPC.\n\t// The number of results is no greater than pageSize.\n\t// If there are no more results, nextPageToken is empty and err is nil.\n\tInternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.UptimeCheckIp, nextPageToken string, err error)\n}\n\n// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details.\nfunc (it *UptimeCheckIpIterator) PageInfo() *iterator.PageInfo {\n\treturn it.pageInfo\n}\n\n// Next returns the next result. Its second return value is iterator.Done if there are no more\n// results. Once Next returns Done, all subsequent calls will return Done.\nfunc (it *UptimeCheckIpIterator) Next() (*monitoringpb.UptimeCheckIp, error) {\n\tvar item *monitoringpb.UptimeCheckIp\n\tif err := it.nextFunc(); err != nil {\n\t\treturn item, err\n\t}\n\titem = it.items[0]\n\tit.items = it.items[1:]\n\treturn item, nil\n}\n\nfunc (it *UptimeCheckIpIterator) bufLen() int {\n\treturn len(it.items)\n}\n\nfunc (it *UptimeCheckIpIterator) takeBuf() interface{} {\n\tb := it.items\n\tit.items = nil\n\treturn b\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/auxiliary_go123.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go_gapic. DO NOT EDIT.\n\n//go:build go1.23\n\npackage monitoring\n\nimport (\n\t\"iter\"\n\n\tmonitoringpb \"cloud.google.com/go/monitoring/apiv3/v2/monitoringpb\"\n\t\"github.com/googleapis/gax-go/v2/iterator\"\n\tmetricpb \"google.golang.org/genproto/googleapis/api/metric\"\n\tmonitoredrespb \"google.golang.org/genproto/googleapis/api/monitoredres\"\n)\n\n// All returns an iterator. If an error is returned by the iterator, the\n// iterator will stop after that iteration.\nfunc (it *AlertPolicyIterator) All() iter.Seq2[*monitoringpb.AlertPolicy, error] {\n\treturn iterator.RangeAdapter(it.Next)\n}\n\n// All returns an iterator. If an error is returned by the iterator, the\n// iterator will stop after that iteration.\nfunc (it *GroupIterator) All() iter.Seq2[*monitoringpb.Group, error] {\n\treturn iterator.RangeAdapter(it.Next)\n}\n\n// All returns an iterator. If an error is returned by the iterator, the\n// iterator will stop after that iteration.\nfunc (it *MetricDescriptorIterator) All() iter.Seq2[*metricpb.MetricDescriptor, error] {\n\treturn iterator.RangeAdapter(it.Next)\n}\n\n// All returns an iterator. If an error is returned by the iterator, the\n// iterator will stop after that iteration.\nfunc (it *MonitoredResourceDescriptorIterator) All() iter.Seq2[*monitoredrespb.MonitoredResourceDescriptor, error] {\n\treturn iterator.RangeAdapter(it.Next)\n}\n\n// All returns an iterator. If an error is returned by the iterator, the\n// iterator will stop after that iteration.\nfunc (it *MonitoredResourceIterator) All() iter.Seq2[*monitoredrespb.MonitoredResource, error] {\n\treturn iterator.RangeAdapter(it.Next)\n}\n\n// All returns an iterator. If an error is returned by the iterator, the\n// iterator will stop after that iteration.\nfunc (it *NotificationChannelDescriptorIterator) All() iter.Seq2[*monitoringpb.NotificationChannelDescriptor, error] {\n\treturn iterator.RangeAdapter(it.Next)\n}\n\n// All returns an iterator. If an error is returned by the iterator, the\n// iterator will stop after that iteration.\nfunc (it *NotificationChannelIterator) All() iter.Seq2[*monitoringpb.NotificationChannel, error] {\n\treturn iterator.RangeAdapter(it.Next)\n}\n\n// All returns an iterator. If an error is returned by the iterator, the\n// iterator will stop after that iteration.\nfunc (it *ServiceIterator) All() iter.Seq2[*monitoringpb.Service, error] {\n\treturn iterator.RangeAdapter(it.Next)\n}\n\n// All returns an iterator. If an error is returned by the iterator, the\n// iterator will stop after that iteration.\nfunc (it *ServiceLevelObjectiveIterator) All() iter.Seq2[*monitoringpb.ServiceLevelObjective, error] {\n\treturn iterator.RangeAdapter(it.Next)\n}\n\n// All returns an iterator. If an error is returned by the iterator, the\n// iterator will stop after that iteration.\nfunc (it *SnoozeIterator) All() iter.Seq2[*monitoringpb.Snooze, error] {\n\treturn iterator.RangeAdapter(it.Next)\n}\n\n// All returns an iterator. If an error is returned by the iterator, the\n// iterator will stop after that iteration.\nfunc (it *TimeSeriesDataIterator) All() iter.Seq2[*monitoringpb.TimeSeriesData, error] {\n\treturn iterator.RangeAdapter(it.Next)\n}\n\n// All returns an iterator. If an error is returned by the iterator, the\n// iterator will stop after that iteration.\nfunc (it *TimeSeriesIterator) All() iter.Seq2[*monitoringpb.TimeSeries, error] {\n\treturn iterator.RangeAdapter(it.Next)\n}\n\n// All returns an iterator. If an error is returned by the iterator, the\n// iterator will stop after that iteration.\nfunc (it *UptimeCheckConfigIterator) All() iter.Seq2[*monitoringpb.UptimeCheckConfig, error] {\n\treturn iterator.RangeAdapter(it.Next)\n}\n\n// All returns an iterator. If an error is returned by the iterator, the\n// iterator will stop after that iteration.\nfunc (it *UptimeCheckIpIterator) All() iter.Seq2[*monitoringpb.UptimeCheckIp, error] {\n\treturn iterator.RangeAdapter(it.Next)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/doc.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go_gapic. DO NOT EDIT.\n\n// Package monitoring is an auto-generated package for the\n// Cloud Monitoring API.\n//\n// Manages your Cloud Monitoring data and configurations.\n//\n//\tNOTE: This package is in beta. It is not stable, and may be subject to changes.\n//\n// # General documentation\n//\n// For information that is relevant for all client libraries please reference\n// https://pkg.go.dev/cloud.google.com/go#pkg-overview. Some information on this\n// page includes:\n//\n//   - [Authentication and Authorization]\n//   - [Timeouts and Cancellation]\n//   - [Testing against Client Libraries]\n//   - [Debugging Client Libraries]\n//   - [Inspecting errors]\n//\n// # Example usage\n//\n// To get started with this package, create a client.\n//\n//\t// go get cloud.google.com/go/monitoring/apiv3/v2@latest\n//\tctx := context.Background()\n//\t// This snippet has been automatically generated and should be regarded as a code template only.\n//\t// It will require modifications to work:\n//\t// - It may require correct/in-range values for request initialization.\n//\t// - It may require specifying regional endpoints when creating the service client as shown in:\n//\t//   https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options\n//\tc, err := monitoring.NewAlertPolicyClient(ctx)\n//\tif err != nil {\n//\t\t// TODO: Handle error.\n//\t}\n//\tdefer c.Close()\n//\n// The client will use your default application credentials. Clients should be reused instead of created as needed.\n// The methods of Client are safe for concurrent use by multiple goroutines.\n// The returned client must be Closed when it is done being used.\n//\n// # Using the Client\n//\n// The following is an example of making an API call with the newly created client, mentioned above.\n//\n//\treq := &monitoringpb.CreateAlertPolicyRequest{\n//\t\t// TODO: Fill request struct fields.\n//\t\t// See https://pkg.go.dev/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb#CreateAlertPolicyRequest.\n//\t}\n//\tresp, err := c.CreateAlertPolicy(ctx, req)\n//\tif err != nil {\n//\t\t// TODO: Handle error.\n//\t}\n//\t// TODO: Use resp.\n//\t_ = resp\n//\n// # Use of Context\n//\n// The ctx passed to NewAlertPolicyClient is used for authentication requests and\n// for creating the underlying connection, but is not used for subsequent calls.\n// Individual methods on the client use the ctx given to them.\n//\n// To close the open connection, use the Close() method.\n//\n// [Authentication and Authorization]: https://pkg.go.dev/cloud.google.com/go#hdr-Authentication_and_Authorization\n// [Timeouts and Cancellation]: https://pkg.go.dev/cloud.google.com/go#hdr-Timeouts_and_Cancellation\n// [Testing against Client Libraries]: https://pkg.go.dev/cloud.google.com/go#hdr-Testing\n// [Debugging Client Libraries]: https://pkg.go.dev/cloud.google.com/go#hdr-Debugging\n// [Inspecting errors]: https://pkg.go.dev/cloud.google.com/go#hdr-Inspecting_errors\npackage monitoring // import \"cloud.google.com/go/monitoring/apiv3/v2\"\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/gapic_metadata.json",
    "content": "{\n  \"schema\": \"1.0\",\n  \"comment\": \"This file maps proto services/RPCs to the corresponding library clients/methods.\",\n  \"language\": \"go\",\n  \"protoPackage\": \"google.monitoring.v3\",\n  \"libraryPackage\": \"cloud.google.com/go/monitoring/apiv3/v2\",\n  \"services\": {\n    \"AlertPolicyService\": {\n      \"clients\": {\n        \"grpc\": {\n          \"libraryClient\": \"AlertPolicyClient\",\n          \"rpcs\": {\n            \"CreateAlertPolicy\": {\n              \"methods\": [\n                \"CreateAlertPolicy\"\n              ]\n            },\n            \"DeleteAlertPolicy\": {\n              \"methods\": [\n                \"DeleteAlertPolicy\"\n              ]\n            },\n            \"GetAlertPolicy\": {\n              \"methods\": [\n                \"GetAlertPolicy\"\n              ]\n            },\n            \"ListAlertPolicies\": {\n              \"methods\": [\n                \"ListAlertPolicies\"\n              ]\n            },\n            \"UpdateAlertPolicy\": {\n              \"methods\": [\n                \"UpdateAlertPolicy\"\n              ]\n            }\n          }\n        }\n      }\n    },\n    \"GroupService\": {\n      \"clients\": {\n        \"grpc\": {\n          \"libraryClient\": \"GroupClient\",\n          \"rpcs\": {\n            \"CreateGroup\": {\n              \"methods\": [\n                \"CreateGroup\"\n              ]\n            },\n            \"DeleteGroup\": {\n              \"methods\": [\n                \"DeleteGroup\"\n              ]\n            },\n            \"GetGroup\": {\n              \"methods\": [\n                \"GetGroup\"\n              ]\n            },\n            \"ListGroupMembers\": {\n              \"methods\": [\n                \"ListGroupMembers\"\n              ]\n            },\n            \"ListGroups\": {\n              \"methods\": [\n                \"ListGroups\"\n              ]\n            },\n            \"UpdateGroup\": {\n              \"methods\": [\n                \"UpdateGroup\"\n              ]\n            }\n          }\n        }\n      }\n    },\n    \"MetricService\": {\n      \"clients\": {\n        \"grpc\": {\n          \"libraryClient\": \"MetricClient\",\n          \"rpcs\": {\n            \"CreateMetricDescriptor\": {\n              \"methods\": [\n                \"CreateMetricDescriptor\"\n              ]\n            },\n            \"CreateServiceTimeSeries\": {\n              \"methods\": [\n                \"CreateServiceTimeSeries\"\n              ]\n            },\n            \"CreateTimeSeries\": {\n              \"methods\": [\n                \"CreateTimeSeries\"\n              ]\n            },\n            \"DeleteMetricDescriptor\": {\n              \"methods\": [\n                \"DeleteMetricDescriptor\"\n              ]\n            },\n            \"GetMetricDescriptor\": {\n              \"methods\": [\n                \"GetMetricDescriptor\"\n              ]\n            },\n            \"GetMonitoredResourceDescriptor\": {\n              \"methods\": [\n                \"GetMonitoredResourceDescriptor\"\n              ]\n            },\n            \"ListMetricDescriptors\": {\n              \"methods\": [\n                \"ListMetricDescriptors\"\n              ]\n            },\n            \"ListMonitoredResourceDescriptors\": {\n              \"methods\": [\n                \"ListMonitoredResourceDescriptors\"\n              ]\n            },\n            \"ListTimeSeries\": {\n              \"methods\": [\n                \"ListTimeSeries\"\n              ]\n            }\n          }\n        }\n      }\n    },\n    \"NotificationChannelService\": {\n      \"clients\": {\n        \"grpc\": {\n          \"libraryClient\": \"NotificationChannelClient\",\n          \"rpcs\": {\n            \"CreateNotificationChannel\": {\n              \"methods\": [\n                \"CreateNotificationChannel\"\n              ]\n            },\n            \"DeleteNotificationChannel\": {\n              \"methods\": [\n                \"DeleteNotificationChannel\"\n              ]\n            },\n            \"GetNotificationChannel\": {\n              \"methods\": [\n                \"GetNotificationChannel\"\n              ]\n            },\n            \"GetNotificationChannelDescriptor\": {\n              \"methods\": [\n                \"GetNotificationChannelDescriptor\"\n              ]\n            },\n            \"GetNotificationChannelVerificationCode\": {\n              \"methods\": [\n                \"GetNotificationChannelVerificationCode\"\n              ]\n            },\n            \"ListNotificationChannelDescriptors\": {\n              \"methods\": [\n                \"ListNotificationChannelDescriptors\"\n              ]\n            },\n            \"ListNotificationChannels\": {\n              \"methods\": [\n                \"ListNotificationChannels\"\n              ]\n            },\n            \"SendNotificationChannelVerificationCode\": {\n              \"methods\": [\n                \"SendNotificationChannelVerificationCode\"\n              ]\n            },\n            \"UpdateNotificationChannel\": {\n              \"methods\": [\n                \"UpdateNotificationChannel\"\n              ]\n            },\n            \"VerifyNotificationChannel\": {\n              \"methods\": [\n                \"VerifyNotificationChannel\"\n              ]\n            }\n          }\n        }\n      }\n    },\n    \"QueryService\": {\n      \"clients\": {\n        \"grpc\": {\n          \"libraryClient\": \"QueryClient\",\n          \"rpcs\": {\n            \"QueryTimeSeries\": {\n              \"methods\": [\n                \"QueryTimeSeries\"\n              ]\n            }\n          }\n        }\n      }\n    },\n    \"ServiceMonitoringService\": {\n      \"clients\": {\n        \"grpc\": {\n          \"libraryClient\": \"ServiceMonitoringClient\",\n          \"rpcs\": {\n            \"CreateService\": {\n              \"methods\": [\n                \"CreateService\"\n              ]\n            },\n            \"CreateServiceLevelObjective\": {\n              \"methods\": [\n                \"CreateServiceLevelObjective\"\n              ]\n            },\n            \"DeleteService\": {\n              \"methods\": [\n                \"DeleteService\"\n              ]\n            },\n            \"DeleteServiceLevelObjective\": {\n              \"methods\": [\n                \"DeleteServiceLevelObjective\"\n              ]\n            },\n            \"GetService\": {\n              \"methods\": [\n                \"GetService\"\n              ]\n            },\n            \"GetServiceLevelObjective\": {\n              \"methods\": [\n                \"GetServiceLevelObjective\"\n              ]\n            },\n            \"ListServiceLevelObjectives\": {\n              \"methods\": [\n                \"ListServiceLevelObjectives\"\n              ]\n            },\n            \"ListServices\": {\n              \"methods\": [\n                \"ListServices\"\n              ]\n            },\n            \"UpdateService\": {\n              \"methods\": [\n                \"UpdateService\"\n              ]\n            },\n            \"UpdateServiceLevelObjective\": {\n              \"methods\": [\n                \"UpdateServiceLevelObjective\"\n              ]\n            }\n          }\n        }\n      }\n    },\n    \"SnoozeService\": {\n      \"clients\": {\n        \"grpc\": {\n          \"libraryClient\": \"SnoozeClient\",\n          \"rpcs\": {\n            \"CreateSnooze\": {\n              \"methods\": [\n                \"CreateSnooze\"\n              ]\n            },\n            \"GetSnooze\": {\n              \"methods\": [\n                \"GetSnooze\"\n              ]\n            },\n            \"ListSnoozes\": {\n              \"methods\": [\n                \"ListSnoozes\"\n              ]\n            },\n            \"UpdateSnooze\": {\n              \"methods\": [\n                \"UpdateSnooze\"\n              ]\n            }\n          }\n        }\n      }\n    },\n    \"UptimeCheckService\": {\n      \"clients\": {\n        \"grpc\": {\n          \"libraryClient\": \"UptimeCheckClient\",\n          \"rpcs\": {\n            \"CreateUptimeCheckConfig\": {\n              \"methods\": [\n                \"CreateUptimeCheckConfig\"\n              ]\n            },\n            \"DeleteUptimeCheckConfig\": {\n              \"methods\": [\n                \"DeleteUptimeCheckConfig\"\n              ]\n            },\n            \"GetUptimeCheckConfig\": {\n              \"methods\": [\n                \"GetUptimeCheckConfig\"\n              ]\n            },\n            \"ListUptimeCheckConfigs\": {\n              \"methods\": [\n                \"ListUptimeCheckConfigs\"\n              ]\n            },\n            \"ListUptimeCheckIps\": {\n              \"methods\": [\n                \"ListUptimeCheckIps\"\n              ]\n            },\n            \"UpdateUptimeCheckConfig\": {\n              \"methods\": [\n                \"UpdateUptimeCheckConfig\"\n              ]\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/group_client.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go_gapic. DO NOT EDIT.\n\npackage monitoring\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"math\"\n\t\"net/url\"\n\t\"time\"\n\n\tmonitoringpb \"cloud.google.com/go/monitoring/apiv3/v2/monitoringpb\"\n\tgax \"github.com/googleapis/gax-go/v2\"\n\t\"google.golang.org/api/iterator\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/api/option/internaloption\"\n\tgtransport \"google.golang.org/api/transport/grpc\"\n\tmonitoredrespb \"google.golang.org/genproto/googleapis/api/monitoredres\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\nvar newGroupClientHook clientHook\n\n// GroupCallOptions contains the retry settings for each method of GroupClient.\ntype GroupCallOptions struct {\n\tListGroups       []gax.CallOption\n\tGetGroup         []gax.CallOption\n\tCreateGroup      []gax.CallOption\n\tUpdateGroup      []gax.CallOption\n\tDeleteGroup      []gax.CallOption\n\tListGroupMembers []gax.CallOption\n}\n\nfunc defaultGroupGRPCClientOptions() []option.ClientOption {\n\treturn []option.ClientOption{\n\t\tinternaloption.WithDefaultEndpoint(\"monitoring.googleapis.com:443\"),\n\t\tinternaloption.WithDefaultEndpointTemplate(\"monitoring.UNIVERSE_DOMAIN:443\"),\n\t\tinternaloption.WithDefaultMTLSEndpoint(\"monitoring.mtls.googleapis.com:443\"),\n\t\tinternaloption.WithDefaultUniverseDomain(\"googleapis.com\"),\n\t\tinternaloption.WithDefaultAudience(\"https://monitoring.googleapis.com/\"),\n\t\tinternaloption.WithDefaultScopes(DefaultAuthScopes()...),\n\t\tinternaloption.EnableJwtWithScope(),\n\t\tinternaloption.EnableNewAuthLibrary(),\n\t\toption.WithGRPCDialOption(grpc.WithDefaultCallOptions(\n\t\t\tgrpc.MaxCallRecvMsgSize(math.MaxInt32))),\n\t}\n}\n\nfunc defaultGroupCallOptions() *GroupCallOptions {\n\treturn &GroupCallOptions{\n\t\tListGroups: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tGetGroup: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tCreateGroup: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t},\n\t\tUpdateGroup: []gax.CallOption{\n\t\t\tgax.WithTimeout(180000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tDeleteGroup: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tListGroupMembers: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t}\n}\n\n// internalGroupClient is an interface that defines the methods available from Cloud Monitoring API.\ntype internalGroupClient interface {\n\tClose() error\n\tsetGoogleClientInfo(...string)\n\tConnection() *grpc.ClientConn\n\tListGroups(context.Context, *monitoringpb.ListGroupsRequest, ...gax.CallOption) *GroupIterator\n\tGetGroup(context.Context, *monitoringpb.GetGroupRequest, ...gax.CallOption) (*monitoringpb.Group, error)\n\tCreateGroup(context.Context, *monitoringpb.CreateGroupRequest, ...gax.CallOption) (*monitoringpb.Group, error)\n\tUpdateGroup(context.Context, *monitoringpb.UpdateGroupRequest, ...gax.CallOption) (*monitoringpb.Group, error)\n\tDeleteGroup(context.Context, *monitoringpb.DeleteGroupRequest, ...gax.CallOption) error\n\tListGroupMembers(context.Context, *monitoringpb.ListGroupMembersRequest, ...gax.CallOption) *MonitoredResourceIterator\n}\n\n// GroupClient is a client for interacting with Cloud Monitoring API.\n// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.\n//\n// The Group API lets you inspect and manage your\n// groups (at #google.monitoring.v3.Group).\n//\n// A group is a named filter that is used to identify\n// a collection of monitored resources. Groups are typically used to\n// mirror the physical and/or logical topology of the environment.\n// Because group membership is computed dynamically, monitored\n// resources that are started in the future are automatically placed\n// in matching groups. By using a group to name monitored resources in,\n// for example, an alert policy, the target of that alert policy is\n// updated automatically as monitored resources are added and removed\n// from the infrastructure.\ntype GroupClient struct {\n\t// The internal transport-dependent client.\n\tinternalClient internalGroupClient\n\n\t// The call options for this service.\n\tCallOptions *GroupCallOptions\n}\n\n// Wrapper methods routed to the internal client.\n\n// Close closes the connection to the API service. The user should invoke this when\n// the client is no longer required.\nfunc (c *GroupClient) Close() error {\n\treturn c.internalClient.Close()\n}\n\n// setGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Intended for\n// use by Google-written clients.\nfunc (c *GroupClient) setGoogleClientInfo(keyval ...string) {\n\tc.internalClient.setGoogleClientInfo(keyval...)\n}\n\n// Connection returns a connection to the API service.\n//\n// Deprecated: Connections are now pooled so this method does not always\n// return the same resource.\nfunc (c *GroupClient) Connection() *grpc.ClientConn {\n\treturn c.internalClient.Connection()\n}\n\n// ListGroups lists the existing groups.\nfunc (c *GroupClient) ListGroups(ctx context.Context, req *monitoringpb.ListGroupsRequest, opts ...gax.CallOption) *GroupIterator {\n\treturn c.internalClient.ListGroups(ctx, req, opts...)\n}\n\n// GetGroup gets a single group.\nfunc (c *GroupClient) GetGroup(ctx context.Context, req *monitoringpb.GetGroupRequest, opts ...gax.CallOption) (*monitoringpb.Group, error) {\n\treturn c.internalClient.GetGroup(ctx, req, opts...)\n}\n\n// CreateGroup creates a new group.\nfunc (c *GroupClient) CreateGroup(ctx context.Context, req *monitoringpb.CreateGroupRequest, opts ...gax.CallOption) (*monitoringpb.Group, error) {\n\treturn c.internalClient.CreateGroup(ctx, req, opts...)\n}\n\n// UpdateGroup updates an existing group.\n// You can change any group attributes except name.\nfunc (c *GroupClient) UpdateGroup(ctx context.Context, req *monitoringpb.UpdateGroupRequest, opts ...gax.CallOption) (*monitoringpb.Group, error) {\n\treturn c.internalClient.UpdateGroup(ctx, req, opts...)\n}\n\n// DeleteGroup deletes an existing group.\nfunc (c *GroupClient) DeleteGroup(ctx context.Context, req *monitoringpb.DeleteGroupRequest, opts ...gax.CallOption) error {\n\treturn c.internalClient.DeleteGroup(ctx, req, opts...)\n}\n\n// ListGroupMembers lists the monitored resources that are members of a group.\nfunc (c *GroupClient) ListGroupMembers(ctx context.Context, req *monitoringpb.ListGroupMembersRequest, opts ...gax.CallOption) *MonitoredResourceIterator {\n\treturn c.internalClient.ListGroupMembers(ctx, req, opts...)\n}\n\n// groupGRPCClient is a client for interacting with Cloud Monitoring API over gRPC transport.\n//\n// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.\ntype groupGRPCClient struct {\n\t// Connection pool of gRPC connections to the service.\n\tconnPool gtransport.ConnPool\n\n\t// Points back to the CallOptions field of the containing GroupClient\n\tCallOptions **GroupCallOptions\n\n\t// The gRPC API client.\n\tgroupClient monitoringpb.GroupServiceClient\n\n\t// The x-goog-* metadata to be sent with each request.\n\txGoogHeaders []string\n\n\tlogger *slog.Logger\n}\n\n// NewGroupClient creates a new group service client based on gRPC.\n// The returned client must be Closed when it is done being used to clean up its underlying connections.\n//\n// The Group API lets you inspect and manage your\n// groups (at #google.monitoring.v3.Group).\n//\n// A group is a named filter that is used to identify\n// a collection of monitored resources. Groups are typically used to\n// mirror the physical and/or logical topology of the environment.\n// Because group membership is computed dynamically, monitored\n// resources that are started in the future are automatically placed\n// in matching groups. By using a group to name monitored resources in,\n// for example, an alert policy, the target of that alert policy is\n// updated automatically as monitored resources are added and removed\n// from the infrastructure.\nfunc NewGroupClient(ctx context.Context, opts ...option.ClientOption) (*GroupClient, error) {\n\tclientOpts := defaultGroupGRPCClientOptions()\n\tif newGroupClientHook != nil {\n\t\thookOpts, err := newGroupClientHook(ctx, clientHookParams{})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tclientOpts = append(clientOpts, hookOpts...)\n\t}\n\n\tconnPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tclient := GroupClient{CallOptions: defaultGroupCallOptions()}\n\n\tc := &groupGRPCClient{\n\t\tconnPool:    connPool,\n\t\tgroupClient: monitoringpb.NewGroupServiceClient(connPool),\n\t\tCallOptions: &client.CallOptions,\n\t\tlogger:      internaloption.GetLogger(opts),\n\t}\n\tc.setGoogleClientInfo()\n\n\tclient.internalClient = c\n\n\treturn &client, nil\n}\n\n// Connection returns a connection to the API service.\n//\n// Deprecated: Connections are now pooled so this method does not always\n// return the same resource.\nfunc (c *groupGRPCClient) Connection() *grpc.ClientConn {\n\treturn c.connPool.Conn()\n}\n\n// setGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Intended for\n// use by Google-written clients.\nfunc (c *groupGRPCClient) setGoogleClientInfo(keyval ...string) {\n\tkv := append([]string{\"gl-go\", gax.GoVersion}, keyval...)\n\tkv = append(kv, \"gapic\", getVersionClient(), \"gax\", gax.Version, \"grpc\", grpc.Version)\n\tc.xGoogHeaders = []string{\n\t\t\"x-goog-api-client\", gax.XGoogHeader(kv...),\n\t}\n}\n\n// Close closes the connection to the API service. The user should invoke this when\n// the client is no longer required.\nfunc (c *groupGRPCClient) Close() error {\n\treturn c.connPool.Close()\n}\n\nfunc (c *groupGRPCClient) ListGroups(ctx context.Context, req *monitoringpb.ListGroupsRequest, opts ...gax.CallOption) *GroupIterator {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).ListGroups[0:len((*c.CallOptions).ListGroups):len((*c.CallOptions).ListGroups)], opts...)\n\tit := &GroupIterator{}\n\treq = proto.Clone(req).(*monitoringpb.ListGroupsRequest)\n\tit.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.Group, string, error) {\n\t\tresp := &monitoringpb.ListGroupsResponse{}\n\t\tif pageToken != \"\" {\n\t\t\treq.PageToken = pageToken\n\t\t}\n\t\tif pageSize > math.MaxInt32 {\n\t\t\treq.PageSize = math.MaxInt32\n\t\t} else if pageSize != 0 {\n\t\t\treq.PageSize = int32(pageSize)\n\t\t}\n\t\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\t\tvar err error\n\t\t\tresp, err = executeRPC(ctx, c.groupClient.ListGroups, req, settings.GRPC, c.logger, \"ListGroups\")\n\t\t\treturn err\n\t\t}, opts...)\n\t\tif err != nil {\n\t\t\treturn nil, \"\", err\n\t\t}\n\n\t\tit.Response = resp\n\t\treturn resp.GetGroup(), resp.GetNextPageToken(), nil\n\t}\n\tfetch := func(pageSize int, pageToken string) (string, error) {\n\t\titems, nextPageToken, err := it.InternalFetch(pageSize, pageToken)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tit.items = append(it.items, items...)\n\t\treturn nextPageToken, nil\n\t}\n\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)\n\tit.pageInfo.MaxSize = int(req.GetPageSize())\n\tit.pageInfo.Token = req.GetPageToken()\n\n\treturn it\n}\n\nfunc (c *groupGRPCClient) GetGroup(ctx context.Context, req *monitoringpb.GetGroupRequest, opts ...gax.CallOption) (*monitoringpb.Group, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).GetGroup[0:len((*c.CallOptions).GetGroup):len((*c.CallOptions).GetGroup)], opts...)\n\tvar resp *monitoringpb.Group\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.groupClient.GetGroup, req, settings.GRPC, c.logger, \"GetGroup\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *groupGRPCClient) CreateGroup(ctx context.Context, req *monitoringpb.CreateGroupRequest, opts ...gax.CallOption) (*monitoringpb.Group, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).CreateGroup[0:len((*c.CallOptions).CreateGroup):len((*c.CallOptions).CreateGroup)], opts...)\n\tvar resp *monitoringpb.Group\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.groupClient.CreateGroup, req, settings.GRPC, c.logger, \"CreateGroup\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *groupGRPCClient) UpdateGroup(ctx context.Context, req *monitoringpb.UpdateGroupRequest, opts ...gax.CallOption) (*monitoringpb.Group, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"group.name\", url.QueryEscape(req.GetGroup().GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).UpdateGroup[0:len((*c.CallOptions).UpdateGroup):len((*c.CallOptions).UpdateGroup)], opts...)\n\tvar resp *monitoringpb.Group\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.groupClient.UpdateGroup, req, settings.GRPC, c.logger, \"UpdateGroup\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *groupGRPCClient) DeleteGroup(ctx context.Context, req *monitoringpb.DeleteGroupRequest, opts ...gax.CallOption) error {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).DeleteGroup[0:len((*c.CallOptions).DeleteGroup):len((*c.CallOptions).DeleteGroup)], opts...)\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\t_, err = executeRPC(ctx, c.groupClient.DeleteGroup, req, settings.GRPC, c.logger, \"DeleteGroup\")\n\t\treturn err\n\t}, opts...)\n\treturn err\n}\n\nfunc (c *groupGRPCClient) ListGroupMembers(ctx context.Context, req *monitoringpb.ListGroupMembersRequest, opts ...gax.CallOption) *MonitoredResourceIterator {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).ListGroupMembers[0:len((*c.CallOptions).ListGroupMembers):len((*c.CallOptions).ListGroupMembers)], opts...)\n\tit := &MonitoredResourceIterator{}\n\treq = proto.Clone(req).(*monitoringpb.ListGroupMembersRequest)\n\tit.InternalFetch = func(pageSize int, pageToken string) ([]*monitoredrespb.MonitoredResource, string, error) {\n\t\tresp := &monitoringpb.ListGroupMembersResponse{}\n\t\tif pageToken != \"\" {\n\t\t\treq.PageToken = pageToken\n\t\t}\n\t\tif pageSize > math.MaxInt32 {\n\t\t\treq.PageSize = math.MaxInt32\n\t\t} else if pageSize != 0 {\n\t\t\treq.PageSize = int32(pageSize)\n\t\t}\n\t\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\t\tvar err error\n\t\t\tresp, err = executeRPC(ctx, c.groupClient.ListGroupMembers, req, settings.GRPC, c.logger, \"ListGroupMembers\")\n\t\t\treturn err\n\t\t}, opts...)\n\t\tif err != nil {\n\t\t\treturn nil, \"\", err\n\t\t}\n\n\t\tit.Response = resp\n\t\treturn resp.GetMembers(), resp.GetNextPageToken(), nil\n\t}\n\tfetch := func(pageSize int, pageToken string) (string, error) {\n\t\titems, nextPageToken, err := it.InternalFetch(pageSize, pageToken)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tit.items = append(it.items, items...)\n\t\treturn nextPageToken, nil\n\t}\n\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)\n\tit.pageInfo.MaxSize = int(req.GetPageSize())\n\tit.pageInfo.Token = req.GetPageToken()\n\n\treturn it\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/helpers.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go_gapic. DO NOT EDIT.\n\npackage monitoring\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\n\t\"github.com/googleapis/gax-go/v2/internallog/grpclog\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\nconst serviceName = \"monitoring.googleapis.com\"\n\n// For more information on implementing a client constructor hook, see\n// https://github.com/googleapis/google-cloud-go/wiki/Customizing-constructors.\ntype clientHookParams struct{}\ntype clientHook func(context.Context, clientHookParams) ([]option.ClientOption, error)\n\nvar versionClient string\n\nfunc getVersionClient() string {\n\tif versionClient == \"\" {\n\t\treturn \"UNKNOWN\"\n\t}\n\treturn versionClient\n}\n\n// DefaultAuthScopes reports the default set of authentication scopes to use with this package.\nfunc DefaultAuthScopes() []string {\n\treturn []string{\n\t\t\"https://www.googleapis.com/auth/cloud-platform\",\n\t\t\"https://www.googleapis.com/auth/monitoring\",\n\t\t\"https://www.googleapis.com/auth/monitoring.read\",\n\t\t\"https://www.googleapis.com/auth/monitoring.write\",\n\t}\n}\n\nfunc executeRPC[I proto.Message, O proto.Message](ctx context.Context, fn func(context.Context, I, ...grpc.CallOption) (O, error), req I, opts []grpc.CallOption, logger *slog.Logger, rpc string) (O, error) {\n\tvar zero O\n\tlogger.DebugContext(ctx, \"api request\", \"serviceName\", serviceName, \"rpcName\", rpc, \"request\", grpclog.ProtoMessageRequest(ctx, req))\n\tresp, err := fn(ctx, req, opts...)\n\tif err != nil {\n\t\treturn zero, err\n\t}\n\tlogger.DebugContext(ctx, \"api response\", \"serviceName\", serviceName, \"rpcName\", rpc, \"response\", grpclog.ProtoMessageResponse(resp))\n\treturn resp, err\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/metric_client.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go_gapic. DO NOT EDIT.\n\npackage monitoring\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"math\"\n\t\"net/url\"\n\t\"time\"\n\n\tmonitoringpb \"cloud.google.com/go/monitoring/apiv3/v2/monitoringpb\"\n\tgax \"github.com/googleapis/gax-go/v2\"\n\t\"google.golang.org/api/iterator\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/api/option/internaloption\"\n\tgtransport \"google.golang.org/api/transport/grpc\"\n\tmetricpb \"google.golang.org/genproto/googleapis/api/metric\"\n\tmonitoredrespb \"google.golang.org/genproto/googleapis/api/monitoredres\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\nvar newMetricClientHook clientHook\n\n// MetricCallOptions contains the retry settings for each method of MetricClient.\ntype MetricCallOptions struct {\n\tListMonitoredResourceDescriptors []gax.CallOption\n\tGetMonitoredResourceDescriptor   []gax.CallOption\n\tListMetricDescriptors            []gax.CallOption\n\tGetMetricDescriptor              []gax.CallOption\n\tCreateMetricDescriptor           []gax.CallOption\n\tDeleteMetricDescriptor           []gax.CallOption\n\tListTimeSeries                   []gax.CallOption\n\tCreateTimeSeries                 []gax.CallOption\n\tCreateServiceTimeSeries          []gax.CallOption\n}\n\nfunc defaultMetricGRPCClientOptions() []option.ClientOption {\n\treturn []option.ClientOption{\n\t\tinternaloption.WithDefaultEndpoint(\"monitoring.googleapis.com:443\"),\n\t\tinternaloption.WithDefaultEndpointTemplate(\"monitoring.UNIVERSE_DOMAIN:443\"),\n\t\tinternaloption.WithDefaultMTLSEndpoint(\"monitoring.mtls.googleapis.com:443\"),\n\t\tinternaloption.WithDefaultUniverseDomain(\"googleapis.com\"),\n\t\tinternaloption.WithDefaultAudience(\"https://monitoring.googleapis.com/\"),\n\t\tinternaloption.WithDefaultScopes(DefaultAuthScopes()...),\n\t\tinternaloption.EnableJwtWithScope(),\n\t\tinternaloption.EnableNewAuthLibrary(),\n\t\toption.WithGRPCDialOption(grpc.WithDefaultCallOptions(\n\t\t\tgrpc.MaxCallRecvMsgSize(math.MaxInt32))),\n\t}\n}\n\nfunc defaultMetricCallOptions() *MetricCallOptions {\n\treturn &MetricCallOptions{\n\t\tListMonitoredResourceDescriptors: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tGetMonitoredResourceDescriptor: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tListMetricDescriptors: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tGetMetricDescriptor: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tCreateMetricDescriptor: []gax.CallOption{\n\t\t\tgax.WithTimeout(12000 * time.Millisecond),\n\t\t},\n\t\tDeleteMetricDescriptor: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tListTimeSeries: []gax.CallOption{\n\t\t\tgax.WithTimeout(90000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tCreateTimeSeries: []gax.CallOption{\n\t\t\tgax.WithTimeout(12000 * time.Millisecond),\n\t\t},\n\t\tCreateServiceTimeSeries: []gax.CallOption{},\n\t}\n}\n\n// internalMetricClient is an interface that defines the methods available from Cloud Monitoring API.\ntype internalMetricClient interface {\n\tClose() error\n\tsetGoogleClientInfo(...string)\n\tConnection() *grpc.ClientConn\n\tListMonitoredResourceDescriptors(context.Context, *monitoringpb.ListMonitoredResourceDescriptorsRequest, ...gax.CallOption) *MonitoredResourceDescriptorIterator\n\tGetMonitoredResourceDescriptor(context.Context, *monitoringpb.GetMonitoredResourceDescriptorRequest, ...gax.CallOption) (*monitoredrespb.MonitoredResourceDescriptor, error)\n\tListMetricDescriptors(context.Context, *monitoringpb.ListMetricDescriptorsRequest, ...gax.CallOption) *MetricDescriptorIterator\n\tGetMetricDescriptor(context.Context, *monitoringpb.GetMetricDescriptorRequest, ...gax.CallOption) (*metricpb.MetricDescriptor, error)\n\tCreateMetricDescriptor(context.Context, *monitoringpb.CreateMetricDescriptorRequest, ...gax.CallOption) (*metricpb.MetricDescriptor, error)\n\tDeleteMetricDescriptor(context.Context, *monitoringpb.DeleteMetricDescriptorRequest, ...gax.CallOption) error\n\tListTimeSeries(context.Context, *monitoringpb.ListTimeSeriesRequest, ...gax.CallOption) *TimeSeriesIterator\n\tCreateTimeSeries(context.Context, *monitoringpb.CreateTimeSeriesRequest, ...gax.CallOption) error\n\tCreateServiceTimeSeries(context.Context, *monitoringpb.CreateTimeSeriesRequest, ...gax.CallOption) error\n}\n\n// MetricClient is a client for interacting with Cloud Monitoring API.\n// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.\n//\n// Manages metric descriptors, monitored resource descriptors, and\n// time series data.\ntype MetricClient struct {\n\t// The internal transport-dependent client.\n\tinternalClient internalMetricClient\n\n\t// The call options for this service.\n\tCallOptions *MetricCallOptions\n}\n\n// Wrapper methods routed to the internal client.\n\n// Close closes the connection to the API service. The user should invoke this when\n// the client is no longer required.\nfunc (c *MetricClient) Close() error {\n\treturn c.internalClient.Close()\n}\n\n// setGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Intended for\n// use by Google-written clients.\nfunc (c *MetricClient) setGoogleClientInfo(keyval ...string) {\n\tc.internalClient.setGoogleClientInfo(keyval...)\n}\n\n// Connection returns a connection to the API service.\n//\n// Deprecated: Connections are now pooled so this method does not always\n// return the same resource.\nfunc (c *MetricClient) Connection() *grpc.ClientConn {\n\treturn c.internalClient.Connection()\n}\n\n// ListMonitoredResourceDescriptors lists monitored resource descriptors that match a filter.\nfunc (c *MetricClient) ListMonitoredResourceDescriptors(ctx context.Context, req *monitoringpb.ListMonitoredResourceDescriptorsRequest, opts ...gax.CallOption) *MonitoredResourceDescriptorIterator {\n\treturn c.internalClient.ListMonitoredResourceDescriptors(ctx, req, opts...)\n}\n\n// GetMonitoredResourceDescriptor gets a single monitored resource descriptor.\nfunc (c *MetricClient) GetMonitoredResourceDescriptor(ctx context.Context, req *monitoringpb.GetMonitoredResourceDescriptorRequest, opts ...gax.CallOption) (*monitoredrespb.MonitoredResourceDescriptor, error) {\n\treturn c.internalClient.GetMonitoredResourceDescriptor(ctx, req, opts...)\n}\n\n// ListMetricDescriptors lists metric descriptors that match a filter.\nfunc (c *MetricClient) ListMetricDescriptors(ctx context.Context, req *monitoringpb.ListMetricDescriptorsRequest, opts ...gax.CallOption) *MetricDescriptorIterator {\n\treturn c.internalClient.ListMetricDescriptors(ctx, req, opts...)\n}\n\n// GetMetricDescriptor gets a single metric descriptor.\nfunc (c *MetricClient) GetMetricDescriptor(ctx context.Context, req *monitoringpb.GetMetricDescriptorRequest, opts ...gax.CallOption) (*metricpb.MetricDescriptor, error) {\n\treturn c.internalClient.GetMetricDescriptor(ctx, req, opts...)\n}\n\n// CreateMetricDescriptor creates a new metric descriptor.\n// The creation is executed asynchronously.\n// User-created metric descriptors define\n// custom metrics (at https://cloud.google.com/monitoring/custom-metrics).\n// The metric descriptor is updated if it already exists,\n// except that metric labels are never removed.\nfunc (c *MetricClient) CreateMetricDescriptor(ctx context.Context, req *monitoringpb.CreateMetricDescriptorRequest, opts ...gax.CallOption) (*metricpb.MetricDescriptor, error) {\n\treturn c.internalClient.CreateMetricDescriptor(ctx, req, opts...)\n}\n\n// DeleteMetricDescriptor deletes a metric descriptor. Only user-created\n// custom metrics (at https://cloud.google.com/monitoring/custom-metrics) can be\n// deleted.\nfunc (c *MetricClient) DeleteMetricDescriptor(ctx context.Context, req *monitoringpb.DeleteMetricDescriptorRequest, opts ...gax.CallOption) error {\n\treturn c.internalClient.DeleteMetricDescriptor(ctx, req, opts...)\n}\n\n// ListTimeSeries lists time series that match a filter.\nfunc (c *MetricClient) ListTimeSeries(ctx context.Context, req *monitoringpb.ListTimeSeriesRequest, opts ...gax.CallOption) *TimeSeriesIterator {\n\treturn c.internalClient.ListTimeSeries(ctx, req, opts...)\n}\n\n// CreateTimeSeries creates or adds data to one or more time series.\n// The response is empty if all time series in the request were written.\n// If any time series could not be written, a corresponding failure message is\n// included in the error response.\n// This method does not support\n// resource locations constraint of an organization\n// policy (at https://cloud.google.com/resource-manager/docs/organization-policy/defining-locations#setting_the_organization_policy).\nfunc (c *MetricClient) CreateTimeSeries(ctx context.Context, req *monitoringpb.CreateTimeSeriesRequest, opts ...gax.CallOption) error {\n\treturn c.internalClient.CreateTimeSeries(ctx, req, opts...)\n}\n\n// CreateServiceTimeSeries creates or adds data to one or more service time series. A service time\n// series is a time series for a metric from a Google Cloud service. The\n// response is empty if all time series in the request were written. If any\n// time series could not be written, a corresponding failure message is\n// included in the error response. This endpoint rejects writes to\n// user-defined metrics.\n// This method is only for use by Google Cloud services. Use\n// projects.timeSeries.create\n// instead.\nfunc (c *MetricClient) CreateServiceTimeSeries(ctx context.Context, req *monitoringpb.CreateTimeSeriesRequest, opts ...gax.CallOption) error {\n\treturn c.internalClient.CreateServiceTimeSeries(ctx, req, opts...)\n}\n\n// metricGRPCClient is a client for interacting with Cloud Monitoring API over gRPC transport.\n//\n// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.\ntype metricGRPCClient struct {\n\t// Connection pool of gRPC connections to the service.\n\tconnPool gtransport.ConnPool\n\n\t// Points back to the CallOptions field of the containing MetricClient\n\tCallOptions **MetricCallOptions\n\n\t// The gRPC API client.\n\tmetricClient monitoringpb.MetricServiceClient\n\n\t// The x-goog-* metadata to be sent with each request.\n\txGoogHeaders []string\n\n\tlogger *slog.Logger\n}\n\n// NewMetricClient creates a new metric service client based on gRPC.\n// The returned client must be Closed when it is done being used to clean up its underlying connections.\n//\n// Manages metric descriptors, monitored resource descriptors, and\n// time series data.\nfunc NewMetricClient(ctx context.Context, opts ...option.ClientOption) (*MetricClient, error) {\n\tclientOpts := defaultMetricGRPCClientOptions()\n\tif newMetricClientHook != nil {\n\t\thookOpts, err := newMetricClientHook(ctx, clientHookParams{})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tclientOpts = append(clientOpts, hookOpts...)\n\t}\n\n\tconnPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tclient := MetricClient{CallOptions: defaultMetricCallOptions()}\n\n\tc := &metricGRPCClient{\n\t\tconnPool:     connPool,\n\t\tmetricClient: monitoringpb.NewMetricServiceClient(connPool),\n\t\tCallOptions:  &client.CallOptions,\n\t\tlogger:       internaloption.GetLogger(opts),\n\t}\n\tc.setGoogleClientInfo()\n\n\tclient.internalClient = c\n\n\treturn &client, nil\n}\n\n// Connection returns a connection to the API service.\n//\n// Deprecated: Connections are now pooled so this method does not always\n// return the same resource.\nfunc (c *metricGRPCClient) Connection() *grpc.ClientConn {\n\treturn c.connPool.Conn()\n}\n\n// setGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Intended for\n// use by Google-written clients.\nfunc (c *metricGRPCClient) setGoogleClientInfo(keyval ...string) {\n\tkv := append([]string{\"gl-go\", gax.GoVersion}, keyval...)\n\tkv = append(kv, \"gapic\", getVersionClient(), \"gax\", gax.Version, \"grpc\", grpc.Version)\n\tc.xGoogHeaders = []string{\n\t\t\"x-goog-api-client\", gax.XGoogHeader(kv...),\n\t}\n}\n\n// Close closes the connection to the API service. The user should invoke this when\n// the client is no longer required.\nfunc (c *metricGRPCClient) Close() error {\n\treturn c.connPool.Close()\n}\n\nfunc (c *metricGRPCClient) ListMonitoredResourceDescriptors(ctx context.Context, req *monitoringpb.ListMonitoredResourceDescriptorsRequest, opts ...gax.CallOption) *MonitoredResourceDescriptorIterator {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).ListMonitoredResourceDescriptors[0:len((*c.CallOptions).ListMonitoredResourceDescriptors):len((*c.CallOptions).ListMonitoredResourceDescriptors)], opts...)\n\tit := &MonitoredResourceDescriptorIterator{}\n\treq = proto.Clone(req).(*monitoringpb.ListMonitoredResourceDescriptorsRequest)\n\tit.InternalFetch = func(pageSize int, pageToken string) ([]*monitoredrespb.MonitoredResourceDescriptor, string, error) {\n\t\tresp := &monitoringpb.ListMonitoredResourceDescriptorsResponse{}\n\t\tif pageToken != \"\" {\n\t\t\treq.PageToken = pageToken\n\t\t}\n\t\tif pageSize > math.MaxInt32 {\n\t\t\treq.PageSize = math.MaxInt32\n\t\t} else if pageSize != 0 {\n\t\t\treq.PageSize = int32(pageSize)\n\t\t}\n\t\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\t\tvar err error\n\t\t\tresp, err = executeRPC(ctx, c.metricClient.ListMonitoredResourceDescriptors, req, settings.GRPC, c.logger, \"ListMonitoredResourceDescriptors\")\n\t\t\treturn err\n\t\t}, opts...)\n\t\tif err != nil {\n\t\t\treturn nil, \"\", err\n\t\t}\n\n\t\tit.Response = resp\n\t\treturn resp.GetResourceDescriptors(), resp.GetNextPageToken(), nil\n\t}\n\tfetch := func(pageSize int, pageToken string) (string, error) {\n\t\titems, nextPageToken, err := it.InternalFetch(pageSize, pageToken)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tit.items = append(it.items, items...)\n\t\treturn nextPageToken, nil\n\t}\n\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)\n\tit.pageInfo.MaxSize = int(req.GetPageSize())\n\tit.pageInfo.Token = req.GetPageToken()\n\n\treturn it\n}\n\nfunc (c *metricGRPCClient) GetMonitoredResourceDescriptor(ctx context.Context, req *monitoringpb.GetMonitoredResourceDescriptorRequest, opts ...gax.CallOption) (*monitoredrespb.MonitoredResourceDescriptor, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).GetMonitoredResourceDescriptor[0:len((*c.CallOptions).GetMonitoredResourceDescriptor):len((*c.CallOptions).GetMonitoredResourceDescriptor)], opts...)\n\tvar resp *monitoredrespb.MonitoredResourceDescriptor\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.metricClient.GetMonitoredResourceDescriptor, req, settings.GRPC, c.logger, \"GetMonitoredResourceDescriptor\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *metricGRPCClient) ListMetricDescriptors(ctx context.Context, req *monitoringpb.ListMetricDescriptorsRequest, opts ...gax.CallOption) *MetricDescriptorIterator {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).ListMetricDescriptors[0:len((*c.CallOptions).ListMetricDescriptors):len((*c.CallOptions).ListMetricDescriptors)], opts...)\n\tit := &MetricDescriptorIterator{}\n\treq = proto.Clone(req).(*monitoringpb.ListMetricDescriptorsRequest)\n\tit.InternalFetch = func(pageSize int, pageToken string) ([]*metricpb.MetricDescriptor, string, error) {\n\t\tresp := &monitoringpb.ListMetricDescriptorsResponse{}\n\t\tif pageToken != \"\" {\n\t\t\treq.PageToken = pageToken\n\t\t}\n\t\tif pageSize > math.MaxInt32 {\n\t\t\treq.PageSize = math.MaxInt32\n\t\t} else if pageSize != 0 {\n\t\t\treq.PageSize = int32(pageSize)\n\t\t}\n\t\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\t\tvar err error\n\t\t\tresp, err = executeRPC(ctx, c.metricClient.ListMetricDescriptors, req, settings.GRPC, c.logger, \"ListMetricDescriptors\")\n\t\t\treturn err\n\t\t}, opts...)\n\t\tif err != nil {\n\t\t\treturn nil, \"\", err\n\t\t}\n\n\t\tit.Response = resp\n\t\treturn resp.GetMetricDescriptors(), resp.GetNextPageToken(), nil\n\t}\n\tfetch := func(pageSize int, pageToken string) (string, error) {\n\t\titems, nextPageToken, err := it.InternalFetch(pageSize, pageToken)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tit.items = append(it.items, items...)\n\t\treturn nextPageToken, nil\n\t}\n\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)\n\tit.pageInfo.MaxSize = int(req.GetPageSize())\n\tit.pageInfo.Token = req.GetPageToken()\n\n\treturn it\n}\n\nfunc (c *metricGRPCClient) GetMetricDescriptor(ctx context.Context, req *monitoringpb.GetMetricDescriptorRequest, opts ...gax.CallOption) (*metricpb.MetricDescriptor, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).GetMetricDescriptor[0:len((*c.CallOptions).GetMetricDescriptor):len((*c.CallOptions).GetMetricDescriptor)], opts...)\n\tvar resp *metricpb.MetricDescriptor\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.metricClient.GetMetricDescriptor, req, settings.GRPC, c.logger, \"GetMetricDescriptor\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *metricGRPCClient) CreateMetricDescriptor(ctx context.Context, req *monitoringpb.CreateMetricDescriptorRequest, opts ...gax.CallOption) (*metricpb.MetricDescriptor, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).CreateMetricDescriptor[0:len((*c.CallOptions).CreateMetricDescriptor):len((*c.CallOptions).CreateMetricDescriptor)], opts...)\n\tvar resp *metricpb.MetricDescriptor\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.metricClient.CreateMetricDescriptor, req, settings.GRPC, c.logger, \"CreateMetricDescriptor\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *metricGRPCClient) DeleteMetricDescriptor(ctx context.Context, req *monitoringpb.DeleteMetricDescriptorRequest, opts ...gax.CallOption) error {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).DeleteMetricDescriptor[0:len((*c.CallOptions).DeleteMetricDescriptor):len((*c.CallOptions).DeleteMetricDescriptor)], opts...)\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\t_, err = executeRPC(ctx, c.metricClient.DeleteMetricDescriptor, req, settings.GRPC, c.logger, \"DeleteMetricDescriptor\")\n\t\treturn err\n\t}, opts...)\n\treturn err\n}\n\nfunc (c *metricGRPCClient) ListTimeSeries(ctx context.Context, req *monitoringpb.ListTimeSeriesRequest, opts ...gax.CallOption) *TimeSeriesIterator {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).ListTimeSeries[0:len((*c.CallOptions).ListTimeSeries):len((*c.CallOptions).ListTimeSeries)], opts...)\n\tit := &TimeSeriesIterator{}\n\treq = proto.Clone(req).(*monitoringpb.ListTimeSeriesRequest)\n\tit.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.TimeSeries, string, error) {\n\t\tresp := &monitoringpb.ListTimeSeriesResponse{}\n\t\tif pageToken != \"\" {\n\t\t\treq.PageToken = pageToken\n\t\t}\n\t\tif pageSize > math.MaxInt32 {\n\t\t\treq.PageSize = math.MaxInt32\n\t\t} else if pageSize != 0 {\n\t\t\treq.PageSize = int32(pageSize)\n\t\t}\n\t\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\t\tvar err error\n\t\t\tresp, err = executeRPC(ctx, c.metricClient.ListTimeSeries, req, settings.GRPC, c.logger, \"ListTimeSeries\")\n\t\t\treturn err\n\t\t}, opts...)\n\t\tif err != nil {\n\t\t\treturn nil, \"\", err\n\t\t}\n\n\t\tit.Response = resp\n\t\treturn resp.GetTimeSeries(), resp.GetNextPageToken(), nil\n\t}\n\tfetch := func(pageSize int, pageToken string) (string, error) {\n\t\titems, nextPageToken, err := it.InternalFetch(pageSize, pageToken)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tit.items = append(it.items, items...)\n\t\treturn nextPageToken, nil\n\t}\n\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)\n\tit.pageInfo.MaxSize = int(req.GetPageSize())\n\tit.pageInfo.Token = req.GetPageToken()\n\n\treturn it\n}\n\nfunc (c *metricGRPCClient) CreateTimeSeries(ctx context.Context, req *monitoringpb.CreateTimeSeriesRequest, opts ...gax.CallOption) error {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).CreateTimeSeries[0:len((*c.CallOptions).CreateTimeSeries):len((*c.CallOptions).CreateTimeSeries)], opts...)\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\t_, err = executeRPC(ctx, c.metricClient.CreateTimeSeries, req, settings.GRPC, c.logger, \"CreateTimeSeries\")\n\t\treturn err\n\t}, opts...)\n\treturn err\n}\n\nfunc (c *metricGRPCClient) CreateServiceTimeSeries(ctx context.Context, req *monitoringpb.CreateTimeSeriesRequest, opts ...gax.CallOption) error {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).CreateServiceTimeSeries[0:len((*c.CallOptions).CreateServiceTimeSeries):len((*c.CallOptions).CreateServiceTimeSeries)], opts...)\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\t_, err = executeRPC(ctx, c.metricClient.CreateServiceTimeSeries, req, settings.GRPC, c.logger, \"CreateServiceTimeSeries\")\n\t\treturn err\n\t}, opts...)\n\treturn err\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/alert.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/alert.proto\n\npackage monitoringpb\n\nimport (\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tstatus \"google.golang.org/genproto/googleapis/rpc/status\"\n\ttimeofday \"google.golang.org/genproto/googleapis/type/timeofday\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdurationpb \"google.golang.org/protobuf/types/known/durationpb\"\n\twrapperspb \"google.golang.org/protobuf/types/known/wrapperspb\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// Operators for combining conditions.\ntype AlertPolicy_ConditionCombinerType int32\n\nconst (\n\t// An unspecified combiner.\n\tAlertPolicy_COMBINE_UNSPECIFIED AlertPolicy_ConditionCombinerType = 0\n\t// Combine conditions using the logical `AND` operator. An\n\t// incident is created only if all the conditions are met\n\t// simultaneously. This combiner is satisfied if all conditions are\n\t// met, even if they are met on completely different resources.\n\tAlertPolicy_AND AlertPolicy_ConditionCombinerType = 1\n\t// Combine conditions using the logical `OR` operator. An incident\n\t// is created if any of the listed conditions is met.\n\tAlertPolicy_OR AlertPolicy_ConditionCombinerType = 2\n\t// Combine conditions using logical `AND` operator, but unlike the regular\n\t// `AND` option, an incident is created only if all conditions are met\n\t// simultaneously on at least one resource.\n\tAlertPolicy_AND_WITH_MATCHING_RESOURCE AlertPolicy_ConditionCombinerType = 3\n)\n\n// Enum value maps for AlertPolicy_ConditionCombinerType.\nvar (\n\tAlertPolicy_ConditionCombinerType_name = map[int32]string{\n\t\t0: \"COMBINE_UNSPECIFIED\",\n\t\t1: \"AND\",\n\t\t2: \"OR\",\n\t\t3: \"AND_WITH_MATCHING_RESOURCE\",\n\t}\n\tAlertPolicy_ConditionCombinerType_value = map[string]int32{\n\t\t\"COMBINE_UNSPECIFIED\":        0,\n\t\t\"AND\":                        1,\n\t\t\"OR\":                         2,\n\t\t\"AND_WITH_MATCHING_RESOURCE\": 3,\n\t}\n)\n\nfunc (x AlertPolicy_ConditionCombinerType) Enum() *AlertPolicy_ConditionCombinerType {\n\tp := new(AlertPolicy_ConditionCombinerType)\n\t*p = x\n\treturn p\n}\n\nfunc (x AlertPolicy_ConditionCombinerType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (AlertPolicy_ConditionCombinerType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_alert_proto_enumTypes[0].Descriptor()\n}\n\nfunc (AlertPolicy_ConditionCombinerType) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_alert_proto_enumTypes[0]\n}\n\nfunc (x AlertPolicy_ConditionCombinerType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use AlertPolicy_ConditionCombinerType.Descriptor instead.\nfunc (AlertPolicy_ConditionCombinerType) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 0}\n}\n\n// An enumeration of possible severity level for an alerting policy.\ntype AlertPolicy_Severity int32\n\nconst (\n\t// No severity is specified. This is the default value.\n\tAlertPolicy_SEVERITY_UNSPECIFIED AlertPolicy_Severity = 0\n\t// This is the highest severity level. Use this if the problem could\n\t// cause significant damage or downtime.\n\tAlertPolicy_CRITICAL AlertPolicy_Severity = 1\n\t// This is the medium severity level. Use this if the problem could\n\t// cause minor damage or downtime.\n\tAlertPolicy_ERROR AlertPolicy_Severity = 2\n\t// This is the lowest severity level. Use this if the problem is not causing\n\t// any damage or downtime, but could potentially lead to a problem in the\n\t// future.\n\tAlertPolicy_WARNING AlertPolicy_Severity = 3\n)\n\n// Enum value maps for AlertPolicy_Severity.\nvar (\n\tAlertPolicy_Severity_name = map[int32]string{\n\t\t0: \"SEVERITY_UNSPECIFIED\",\n\t\t1: \"CRITICAL\",\n\t\t2: \"ERROR\",\n\t\t3: \"WARNING\",\n\t}\n\tAlertPolicy_Severity_value = map[string]int32{\n\t\t\"SEVERITY_UNSPECIFIED\": 0,\n\t\t\"CRITICAL\":             1,\n\t\t\"ERROR\":                2,\n\t\t\"WARNING\":              3,\n\t}\n)\n\nfunc (x AlertPolicy_Severity) Enum() *AlertPolicy_Severity {\n\tp := new(AlertPolicy_Severity)\n\t*p = x\n\treturn p\n}\n\nfunc (x AlertPolicy_Severity) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (AlertPolicy_Severity) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_alert_proto_enumTypes[1].Descriptor()\n}\n\nfunc (AlertPolicy_Severity) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_alert_proto_enumTypes[1]\n}\n\nfunc (x AlertPolicy_Severity) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use AlertPolicy_Severity.Descriptor instead.\nfunc (AlertPolicy_Severity) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1}\n}\n\n// A condition control that determines how metric-threshold conditions\n// are evaluated when data stops arriving.\n// This control doesn't affect metric-absence policies.\ntype AlertPolicy_Condition_EvaluationMissingData int32\n\nconst (\n\t// An unspecified evaluation missing data option.  Equivalent to\n\t// EVALUATION_MISSING_DATA_NO_OP.\n\tAlertPolicy_Condition_EVALUATION_MISSING_DATA_UNSPECIFIED AlertPolicy_Condition_EvaluationMissingData = 0\n\t// If there is no data to evaluate the condition, then evaluate the\n\t// condition as false.\n\tAlertPolicy_Condition_EVALUATION_MISSING_DATA_INACTIVE AlertPolicy_Condition_EvaluationMissingData = 1\n\t// If there is no data to evaluate the condition, then evaluate the\n\t// condition as true.\n\tAlertPolicy_Condition_EVALUATION_MISSING_DATA_ACTIVE AlertPolicy_Condition_EvaluationMissingData = 2\n\t// Do not evaluate the condition to any value if there is no data.\n\tAlertPolicy_Condition_EVALUATION_MISSING_DATA_NO_OP AlertPolicy_Condition_EvaluationMissingData = 3\n)\n\n// Enum value maps for AlertPolicy_Condition_EvaluationMissingData.\nvar (\n\tAlertPolicy_Condition_EvaluationMissingData_name = map[int32]string{\n\t\t0: \"EVALUATION_MISSING_DATA_UNSPECIFIED\",\n\t\t1: \"EVALUATION_MISSING_DATA_INACTIVE\",\n\t\t2: \"EVALUATION_MISSING_DATA_ACTIVE\",\n\t\t3: \"EVALUATION_MISSING_DATA_NO_OP\",\n\t}\n\tAlertPolicy_Condition_EvaluationMissingData_value = map[string]int32{\n\t\t\"EVALUATION_MISSING_DATA_UNSPECIFIED\": 0,\n\t\t\"EVALUATION_MISSING_DATA_INACTIVE\":    1,\n\t\t\"EVALUATION_MISSING_DATA_ACTIVE\":      2,\n\t\t\"EVALUATION_MISSING_DATA_NO_OP\":       3,\n\t}\n)\n\nfunc (x AlertPolicy_Condition_EvaluationMissingData) Enum() *AlertPolicy_Condition_EvaluationMissingData {\n\tp := new(AlertPolicy_Condition_EvaluationMissingData)\n\t*p = x\n\treturn p\n}\n\nfunc (x AlertPolicy_Condition_EvaluationMissingData) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (AlertPolicy_Condition_EvaluationMissingData) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_alert_proto_enumTypes[2].Descriptor()\n}\n\nfunc (AlertPolicy_Condition_EvaluationMissingData) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_alert_proto_enumTypes[2]\n}\n\nfunc (x AlertPolicy_Condition_EvaluationMissingData) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use AlertPolicy_Condition_EvaluationMissingData.Descriptor instead.\nfunc (AlertPolicy_Condition_EvaluationMissingData) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 0}\n}\n\n// Control when notifications will be sent out.\ntype AlertPolicy_AlertStrategy_NotificationPrompt int32\n\nconst (\n\t// No strategy specified. Treated as error.\n\tAlertPolicy_AlertStrategy_NOTIFICATION_PROMPT_UNSPECIFIED AlertPolicy_AlertStrategy_NotificationPrompt = 0\n\t// Notify when an incident is opened.\n\tAlertPolicy_AlertStrategy_OPENED AlertPolicy_AlertStrategy_NotificationPrompt = 1\n\t// Notify when an incident is closed.\n\tAlertPolicy_AlertStrategy_CLOSED AlertPolicy_AlertStrategy_NotificationPrompt = 3\n)\n\n// Enum value maps for AlertPolicy_AlertStrategy_NotificationPrompt.\nvar (\n\tAlertPolicy_AlertStrategy_NotificationPrompt_name = map[int32]string{\n\t\t0: \"NOTIFICATION_PROMPT_UNSPECIFIED\",\n\t\t1: \"OPENED\",\n\t\t3: \"CLOSED\",\n\t}\n\tAlertPolicy_AlertStrategy_NotificationPrompt_value = map[string]int32{\n\t\t\"NOTIFICATION_PROMPT_UNSPECIFIED\": 0,\n\t\t\"OPENED\":                          1,\n\t\t\"CLOSED\":                          3,\n\t}\n)\n\nfunc (x AlertPolicy_AlertStrategy_NotificationPrompt) Enum() *AlertPolicy_AlertStrategy_NotificationPrompt {\n\tp := new(AlertPolicy_AlertStrategy_NotificationPrompt)\n\t*p = x\n\treturn p\n}\n\nfunc (x AlertPolicy_AlertStrategy_NotificationPrompt) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (AlertPolicy_AlertStrategy_NotificationPrompt) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_alert_proto_enumTypes[3].Descriptor()\n}\n\nfunc (AlertPolicy_AlertStrategy_NotificationPrompt) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_alert_proto_enumTypes[3]\n}\n\nfunc (x AlertPolicy_AlertStrategy_NotificationPrompt) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use AlertPolicy_AlertStrategy_NotificationPrompt.Descriptor instead.\nfunc (AlertPolicy_AlertStrategy_NotificationPrompt) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 2, 0}\n}\n\n// A description of the conditions under which some aspect of your system is\n// considered to be \"unhealthy\" and the ways to notify people or services about\n// this state. For an overview of alerting policies, see\n// [Introduction to Alerting](https://cloud.google.com/monitoring/alerts/).\ntype AlertPolicy struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Identifier. Required if the policy exists. The resource name for this\n\t// policy. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/alertPolicies/[ALERT_POLICY_ID]\n\t//\n\t// `[ALERT_POLICY_ID]` is assigned by Cloud Monitoring when the policy\n\t// is created. When calling the\n\t// [alertPolicies.create][google.monitoring.v3.AlertPolicyService.CreateAlertPolicy]\n\t// method, do not include the `name` field in the alerting policy passed as\n\t// part of the request.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// A short name or phrase used to identify the policy in dashboards,\n\t// notifications, and incidents. To avoid confusion, don't use the same\n\t// display name for multiple policies in the same project. The name is\n\t// limited to 512 Unicode characters.\n\t//\n\t// The convention for the display_name of a PrometheusQueryLanguageCondition\n\t// is \"{rule group name}/{alert name}\", where the {rule group name} and\n\t// {alert name} should be taken from the corresponding Prometheus\n\t// configuration file. This convention is not enforced.\n\t// In any case the display_name is not a unique key of the AlertPolicy.\n\tDisplayName string `protobuf:\"bytes,2,opt,name=display_name,json=displayName,proto3\" json:\"display_name,omitempty\"`\n\t// Documentation that is included with notifications and incidents related to\n\t// this policy. Best practice is for the documentation to include information\n\t// to help responders understand, mitigate, escalate, and correct the\n\t// underlying problems detected by the alerting policy. Notification channels\n\t// that have limited capacity might not show this documentation.\n\tDocumentation *AlertPolicy_Documentation `protobuf:\"bytes,13,opt,name=documentation,proto3\" json:\"documentation,omitempty\"`\n\t// User-supplied key/value data to be used for organizing and\n\t// identifying the `AlertPolicy` objects.\n\t//\n\t// The field can contain up to 64 entries. Each key and value is limited to\n\t// 63 Unicode characters or 128 bytes, whichever is smaller. Labels and\n\t// values can contain only lowercase letters, numerals, underscores, and\n\t// dashes. Keys must begin with a letter.\n\t//\n\t// Note that Prometheus {alert name} is a\n\t// [valid Prometheus label\n\t// names](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels),\n\t// whereas Prometheus {rule group} is an unrestricted UTF-8 string.\n\t// This means that they cannot be stored as-is in user labels, because\n\t// they may contain characters that are not allowed in user-label values.\n\tUserLabels map[string]string `protobuf:\"bytes,16,rep,name=user_labels,json=userLabels,proto3\" json:\"user_labels,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\t// A list of conditions for the policy. The conditions are combined by AND or\n\t// OR according to the `combiner` field. If the combined conditions evaluate\n\t// to true, then an incident is created. A policy can have from one to six\n\t// conditions.\n\t// If `condition_time_series_query_language` is present, it must be the only\n\t// `condition`.\n\t// If `condition_monitoring_query_language` is present, it must be the only\n\t// `condition`.\n\tConditions []*AlertPolicy_Condition `protobuf:\"bytes,12,rep,name=conditions,proto3\" json:\"conditions,omitempty\"`\n\t// How to combine the results of multiple conditions to determine if an\n\t// incident should be opened.\n\t// If `condition_time_series_query_language` is present, this must be\n\t// `COMBINE_UNSPECIFIED`.\n\tCombiner AlertPolicy_ConditionCombinerType `protobuf:\"varint,6,opt,name=combiner,proto3,enum=google.monitoring.v3.AlertPolicy_ConditionCombinerType\" json:\"combiner,omitempty\"`\n\t// Whether or not the policy is enabled. On write, the default interpretation\n\t// if unset is that the policy is enabled. On read, clients should not make\n\t// any assumption about the state if it has not been populated. The\n\t// field should always be populated on List and Get operations, unless\n\t// a field projection has been specified that strips it out.\n\tEnabled *wrapperspb.BoolValue `protobuf:\"bytes,17,opt,name=enabled,proto3\" json:\"enabled,omitempty\"`\n\t// Read-only description of how the alerting policy is invalid. This field is\n\t// only set when the alerting policy is invalid. An invalid alerting policy\n\t// will not generate incidents.\n\tValidity *status.Status `protobuf:\"bytes,18,opt,name=validity,proto3\" json:\"validity,omitempty\"`\n\t// Identifies the notification channels to which notifications should be sent\n\t// when incidents are opened or closed or when new violations occur on\n\t// an already opened incident. Each element of this array corresponds to\n\t// the `name` field in each of the\n\t// [`NotificationChannel`][google.monitoring.v3.NotificationChannel]\n\t// objects that are returned from the [`ListNotificationChannels`]\n\t// [google.monitoring.v3.NotificationChannelService.ListNotificationChannels]\n\t// method. The format of the entries in this field is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/notificationChannels/[CHANNEL_ID]\n\tNotificationChannels []string `protobuf:\"bytes,14,rep,name=notification_channels,json=notificationChannels,proto3\" json:\"notification_channels,omitempty\"`\n\t// A read-only record of the creation of the alerting policy. If provided\n\t// in a call to create or update, this field will be ignored.\n\tCreationRecord *MutationRecord `protobuf:\"bytes,10,opt,name=creation_record,json=creationRecord,proto3\" json:\"creation_record,omitempty\"`\n\t// A read-only record of the most recent change to the alerting policy. If\n\t// provided in a call to create or update, this field will be ignored.\n\tMutationRecord *MutationRecord `protobuf:\"bytes,11,opt,name=mutation_record,json=mutationRecord,proto3\" json:\"mutation_record,omitempty\"`\n\t// Control over how this alerting policy's notification channels are notified.\n\tAlertStrategy *AlertPolicy_AlertStrategy `protobuf:\"bytes,21,opt,name=alert_strategy,json=alertStrategy,proto3\" json:\"alert_strategy,omitempty\"`\n\t// Optional. The severity of an alerting policy indicates how important\n\t// incidents generated by that policy are. The severity level will be\n\t// displayed on the Incident detail page and in notifications.\n\tSeverity AlertPolicy_Severity `protobuf:\"varint,22,opt,name=severity,proto3,enum=google.monitoring.v3.AlertPolicy_Severity\" json:\"severity,omitempty\"`\n}\n\nfunc (x *AlertPolicy) Reset() {\n\t*x = AlertPolicy{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy) ProtoMessage() {}\n\nfunc (x *AlertPolicy) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *AlertPolicy) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *AlertPolicy) GetDisplayName() string {\n\tif x != nil {\n\t\treturn x.DisplayName\n\t}\n\treturn \"\"\n}\n\nfunc (x *AlertPolicy) GetDocumentation() *AlertPolicy_Documentation {\n\tif x != nil {\n\t\treturn x.Documentation\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy) GetUserLabels() map[string]string {\n\tif x != nil {\n\t\treturn x.UserLabels\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy) GetConditions() []*AlertPolicy_Condition {\n\tif x != nil {\n\t\treturn x.Conditions\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy) GetCombiner() AlertPolicy_ConditionCombinerType {\n\tif x != nil {\n\t\treturn x.Combiner\n\t}\n\treturn AlertPolicy_COMBINE_UNSPECIFIED\n}\n\nfunc (x *AlertPolicy) GetEnabled() *wrapperspb.BoolValue {\n\tif x != nil {\n\t\treturn x.Enabled\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy) GetValidity() *status.Status {\n\tif x != nil {\n\t\treturn x.Validity\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy) GetNotificationChannels() []string {\n\tif x != nil {\n\t\treturn x.NotificationChannels\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy) GetCreationRecord() *MutationRecord {\n\tif x != nil {\n\t\treturn x.CreationRecord\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy) GetMutationRecord() *MutationRecord {\n\tif x != nil {\n\t\treturn x.MutationRecord\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy) GetAlertStrategy() *AlertPolicy_AlertStrategy {\n\tif x != nil {\n\t\treturn x.AlertStrategy\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy) GetSeverity() AlertPolicy_Severity {\n\tif x != nil {\n\t\treturn x.Severity\n\t}\n\treturn AlertPolicy_SEVERITY_UNSPECIFIED\n}\n\n// Documentation that is included in the notifications and incidents\n// pertaining to this policy.\ntype AlertPolicy_Documentation struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The body of the documentation, interpreted according to `mime_type`.\n\t// The content may not exceed 8,192 Unicode characters and may not exceed\n\t// more than 10,240 bytes when encoded in UTF-8 format, whichever is\n\t// smaller. This text can be [templatized by using\n\t// variables](https://cloud.google.com/monitoring/alerts/doc-variables#doc-vars).\n\tContent string `protobuf:\"bytes,1,opt,name=content,proto3\" json:\"content,omitempty\"`\n\t// The format of the `content` field. Presently, only the value\n\t// `\"text/markdown\"` is supported. See\n\t// [Markdown](https://en.wikipedia.org/wiki/Markdown) for more information.\n\tMimeType string `protobuf:\"bytes,2,opt,name=mime_type,json=mimeType,proto3\" json:\"mime_type,omitempty\"`\n\t// Optional. The subject line of the notification. The subject line may not\n\t// exceed 10,240 bytes. In notifications generated by this policy, the\n\t// contents of the subject line after variable expansion will be truncated\n\t// to 255 bytes or shorter at the latest UTF-8 character boundary. The\n\t// 255-byte limit is recommended by [this\n\t// thread](https://stackoverflow.com/questions/1592291/what-is-the-email-subject-length-limit).\n\t// It is both the limit imposed by some third-party ticketing products and\n\t// it is common to define textual fields in databases as VARCHAR(255).\n\t//\n\t// The contents of the subject line can be [templatized by using\n\t// variables](https://cloud.google.com/monitoring/alerts/doc-variables#doc-vars).\n\t// If this field is missing or empty, a default subject line will be\n\t// generated.\n\tSubject string `protobuf:\"bytes,3,opt,name=subject,proto3\" json:\"subject,omitempty\"`\n\t// Optional. Links to content such as playbooks, repositories, and other\n\t// resources. This field can contain up to 3 entries.\n\tLinks []*AlertPolicy_Documentation_Link `protobuf:\"bytes,4,rep,name=links,proto3\" json:\"links,omitempty\"`\n}\n\nfunc (x *AlertPolicy_Documentation) Reset() {\n\t*x = AlertPolicy_Documentation{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_Documentation) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_Documentation) ProtoMessage() {}\n\nfunc (x *AlertPolicy_Documentation) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_Documentation.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_Documentation) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 0}\n}\n\nfunc (x *AlertPolicy_Documentation) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *AlertPolicy_Documentation) GetMimeType() string {\n\tif x != nil {\n\t\treturn x.MimeType\n\t}\n\treturn \"\"\n}\n\nfunc (x *AlertPolicy_Documentation) GetSubject() string {\n\tif x != nil {\n\t\treturn x.Subject\n\t}\n\treturn \"\"\n}\n\nfunc (x *AlertPolicy_Documentation) GetLinks() []*AlertPolicy_Documentation_Link {\n\tif x != nil {\n\t\treturn x.Links\n\t}\n\treturn nil\n}\n\n// A condition is a true/false test that determines when an alerting policy\n// should open an incident. If a condition evaluates to true, it signifies\n// that something is wrong.\ntype AlertPolicy_Condition struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required if the condition exists. The unique resource name for this\n\t// condition. Its format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/alertPolicies/[POLICY_ID]/conditions/[CONDITION_ID]\n\t//\n\t// `[CONDITION_ID]` is assigned by Cloud Monitoring when the\n\t// condition is created as part of a new or updated alerting policy.\n\t//\n\t// When calling the\n\t// [alertPolicies.create][google.monitoring.v3.AlertPolicyService.CreateAlertPolicy]\n\t// method, do not include the `name` field in the conditions of the\n\t// requested alerting policy. Cloud Monitoring creates the\n\t// condition identifiers and includes them in the new policy.\n\t//\n\t// When calling the\n\t// [alertPolicies.update][google.monitoring.v3.AlertPolicyService.UpdateAlertPolicy]\n\t// method to update a policy, including a condition `name` causes the\n\t// existing condition to be updated. Conditions without names are added to\n\t// the updated policy. Existing conditions are deleted if they are not\n\t// updated.\n\t//\n\t// Best practice is to preserve `[CONDITION_ID]` if you make only small\n\t// changes, such as those to condition thresholds, durations, or trigger\n\t// values.  Otherwise, treat the change as a new condition and let the\n\t// existing condition be deleted.\n\tName string `protobuf:\"bytes,12,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// A short name or phrase used to identify the condition in dashboards,\n\t// notifications, and incidents. To avoid confusion, don't use the same\n\t// display name for multiple conditions in the same policy.\n\tDisplayName string `protobuf:\"bytes,6,opt,name=display_name,json=displayName,proto3\" json:\"display_name,omitempty\"`\n\t// Only one of the following condition types will be specified.\n\t//\n\t// Types that are assignable to Condition:\n\t//\n\t//\t*AlertPolicy_Condition_ConditionThreshold\n\t//\t*AlertPolicy_Condition_ConditionAbsent\n\t//\t*AlertPolicy_Condition_ConditionMatchedLog\n\t//\t*AlertPolicy_Condition_ConditionMonitoringQueryLanguage\n\t//\t*AlertPolicy_Condition_ConditionPrometheusQueryLanguage\n\t//\t*AlertPolicy_Condition_ConditionSql\n\tCondition isAlertPolicy_Condition_Condition `protobuf_oneof:\"condition\"`\n}\n\nfunc (x *AlertPolicy_Condition) Reset() {\n\t*x = AlertPolicy_Condition{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[2]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_Condition) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_Condition) ProtoMessage() {}\n\nfunc (x *AlertPolicy_Condition) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[2]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_Condition.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_Condition) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1}\n}\n\nfunc (x *AlertPolicy_Condition) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *AlertPolicy_Condition) GetDisplayName() string {\n\tif x != nil {\n\t\treturn x.DisplayName\n\t}\n\treturn \"\"\n}\n\nfunc (m *AlertPolicy_Condition) GetCondition() isAlertPolicy_Condition_Condition {\n\tif m != nil {\n\t\treturn m.Condition\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition) GetConditionThreshold() *AlertPolicy_Condition_MetricThreshold {\n\tif x, ok := x.GetCondition().(*AlertPolicy_Condition_ConditionThreshold); ok {\n\t\treturn x.ConditionThreshold\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition) GetConditionAbsent() *AlertPolicy_Condition_MetricAbsence {\n\tif x, ok := x.GetCondition().(*AlertPolicy_Condition_ConditionAbsent); ok {\n\t\treturn x.ConditionAbsent\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition) GetConditionMatchedLog() *AlertPolicy_Condition_LogMatch {\n\tif x, ok := x.GetCondition().(*AlertPolicy_Condition_ConditionMatchedLog); ok {\n\t\treturn x.ConditionMatchedLog\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition) GetConditionMonitoringQueryLanguage() *AlertPolicy_Condition_MonitoringQueryLanguageCondition {\n\tif x, ok := x.GetCondition().(*AlertPolicy_Condition_ConditionMonitoringQueryLanguage); ok {\n\t\treturn x.ConditionMonitoringQueryLanguage\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition) GetConditionPrometheusQueryLanguage() *AlertPolicy_Condition_PrometheusQueryLanguageCondition {\n\tif x, ok := x.GetCondition().(*AlertPolicy_Condition_ConditionPrometheusQueryLanguage); ok {\n\t\treturn x.ConditionPrometheusQueryLanguage\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition) GetConditionSql() *AlertPolicy_Condition_SqlCondition {\n\tif x, ok := x.GetCondition().(*AlertPolicy_Condition_ConditionSql); ok {\n\t\treturn x.ConditionSql\n\t}\n\treturn nil\n}\n\ntype isAlertPolicy_Condition_Condition interface {\n\tisAlertPolicy_Condition_Condition()\n}\n\ntype AlertPolicy_Condition_ConditionThreshold struct {\n\t// A condition that compares a time series against a threshold.\n\tConditionThreshold *AlertPolicy_Condition_MetricThreshold `protobuf:\"bytes,1,opt,name=condition_threshold,json=conditionThreshold,proto3,oneof\"`\n}\n\ntype AlertPolicy_Condition_ConditionAbsent struct {\n\t// A condition that checks that a time series continues to\n\t// receive new data points.\n\tConditionAbsent *AlertPolicy_Condition_MetricAbsence `protobuf:\"bytes,2,opt,name=condition_absent,json=conditionAbsent,proto3,oneof\"`\n}\n\ntype AlertPolicy_Condition_ConditionMatchedLog struct {\n\t// A condition that checks for log messages matching given constraints. If\n\t// set, no other conditions can be present.\n\tConditionMatchedLog *AlertPolicy_Condition_LogMatch `protobuf:\"bytes,20,opt,name=condition_matched_log,json=conditionMatchedLog,proto3,oneof\"`\n}\n\ntype AlertPolicy_Condition_ConditionMonitoringQueryLanguage struct {\n\t// A condition that uses the Monitoring Query Language to define\n\t// alerts.\n\tConditionMonitoringQueryLanguage *AlertPolicy_Condition_MonitoringQueryLanguageCondition `protobuf:\"bytes,19,opt,name=condition_monitoring_query_language,json=conditionMonitoringQueryLanguage,proto3,oneof\"`\n}\n\ntype AlertPolicy_Condition_ConditionPrometheusQueryLanguage struct {\n\t// A condition that uses the Prometheus query language to define alerts.\n\tConditionPrometheusQueryLanguage *AlertPolicy_Condition_PrometheusQueryLanguageCondition `protobuf:\"bytes,21,opt,name=condition_prometheus_query_language,json=conditionPrometheusQueryLanguage,proto3,oneof\"`\n}\n\ntype AlertPolicy_Condition_ConditionSql struct {\n\t// A condition that periodically evaluates a SQL query result.\n\tConditionSql *AlertPolicy_Condition_SqlCondition `protobuf:\"bytes,22,opt,name=condition_sql,json=conditionSql,proto3,oneof\"`\n}\n\nfunc (*AlertPolicy_Condition_ConditionThreshold) isAlertPolicy_Condition_Condition() {}\n\nfunc (*AlertPolicy_Condition_ConditionAbsent) isAlertPolicy_Condition_Condition() {}\n\nfunc (*AlertPolicy_Condition_ConditionMatchedLog) isAlertPolicy_Condition_Condition() {}\n\nfunc (*AlertPolicy_Condition_ConditionMonitoringQueryLanguage) isAlertPolicy_Condition_Condition() {}\n\nfunc (*AlertPolicy_Condition_ConditionPrometheusQueryLanguage) isAlertPolicy_Condition_Condition() {}\n\nfunc (*AlertPolicy_Condition_ConditionSql) isAlertPolicy_Condition_Condition() {}\n\n// Control over how the notification channels in `notification_channels`\n// are notified when this alert fires.\ntype AlertPolicy_AlertStrategy struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required for log-based alerting policies, i.e. policies with a `LogMatch`\n\t// condition.\n\t//\n\t// This limit is not implemented for alerting policies that do not have\n\t// a LogMatch condition.\n\tNotificationRateLimit *AlertPolicy_AlertStrategy_NotificationRateLimit `protobuf:\"bytes,1,opt,name=notification_rate_limit,json=notificationRateLimit,proto3\" json:\"notification_rate_limit,omitempty\"`\n\t// For log-based alert policies, the notification prompts is always\n\t// [OPENED]. For non log-based alert policies, the notification prompts can\n\t// be [OPENED] or [OPENED, CLOSED].\n\tNotificationPrompts []AlertPolicy_AlertStrategy_NotificationPrompt `protobuf:\"varint,2,rep,packed,name=notification_prompts,json=notificationPrompts,proto3,enum=google.monitoring.v3.AlertPolicy_AlertStrategy_NotificationPrompt\" json:\"notification_prompts,omitempty\"`\n\t// If an alerting policy that was active has no data for this long, any open\n\t// incidents will close\n\tAutoClose *durationpb.Duration `protobuf:\"bytes,3,opt,name=auto_close,json=autoClose,proto3\" json:\"auto_close,omitempty\"`\n\t// Control how notifications will be sent out, on a per-channel basis.\n\tNotificationChannelStrategy []*AlertPolicy_AlertStrategy_NotificationChannelStrategy `protobuf:\"bytes,4,rep,name=notification_channel_strategy,json=notificationChannelStrategy,proto3\" json:\"notification_channel_strategy,omitempty\"`\n}\n\nfunc (x *AlertPolicy_AlertStrategy) Reset() {\n\t*x = AlertPolicy_AlertStrategy{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[3]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_AlertStrategy) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_AlertStrategy) ProtoMessage() {}\n\nfunc (x *AlertPolicy_AlertStrategy) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[3]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_AlertStrategy.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_AlertStrategy) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 2}\n}\n\nfunc (x *AlertPolicy_AlertStrategy) GetNotificationRateLimit() *AlertPolicy_AlertStrategy_NotificationRateLimit {\n\tif x != nil {\n\t\treturn x.NotificationRateLimit\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_AlertStrategy) GetNotificationPrompts() []AlertPolicy_AlertStrategy_NotificationPrompt {\n\tif x != nil {\n\t\treturn x.NotificationPrompts\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_AlertStrategy) GetAutoClose() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.AutoClose\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_AlertStrategy) GetNotificationChannelStrategy() []*AlertPolicy_AlertStrategy_NotificationChannelStrategy {\n\tif x != nil {\n\t\treturn x.NotificationChannelStrategy\n\t}\n\treturn nil\n}\n\n// Links to content such as playbooks, repositories, and other resources.\ntype AlertPolicy_Documentation_Link struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// A short display name for the link. The display name must not be empty\n\t// or exceed 63 characters. Example: \"playbook\".\n\tDisplayName string `protobuf:\"bytes,1,opt,name=display_name,json=displayName,proto3\" json:\"display_name,omitempty\"`\n\t// The url of a webpage.\n\t// A url can be templatized by using variables\n\t// in the path or the query parameters. The total length of a URL should\n\t// not exceed 2083 characters before and after variable expansion.\n\t// Example: \"https://my_domain.com/playbook?name=${resource.name}\"\n\tUrl string `protobuf:\"bytes,2,opt,name=url,proto3\" json:\"url,omitempty\"`\n}\n\nfunc (x *AlertPolicy_Documentation_Link) Reset() {\n\t*x = AlertPolicy_Documentation_Link{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[5]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_Documentation_Link) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_Documentation_Link) ProtoMessage() {}\n\nfunc (x *AlertPolicy_Documentation_Link) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[5]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_Documentation_Link.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_Documentation_Link) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 0, 0}\n}\n\nfunc (x *AlertPolicy_Documentation_Link) GetDisplayName() string {\n\tif x != nil {\n\t\treturn x.DisplayName\n\t}\n\treturn \"\"\n}\n\nfunc (x *AlertPolicy_Documentation_Link) GetUrl() string {\n\tif x != nil {\n\t\treturn x.Url\n\t}\n\treturn \"\"\n}\n\n// Specifies how many time series must fail a predicate to trigger a\n// condition. If not specified, then a `{count: 1}` trigger is used.\ntype AlertPolicy_Condition_Trigger struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// A type of trigger.\n\t//\n\t// Types that are assignable to Type:\n\t//\n\t//\t*AlertPolicy_Condition_Trigger_Count\n\t//\t*AlertPolicy_Condition_Trigger_Percent\n\tType isAlertPolicy_Condition_Trigger_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *AlertPolicy_Condition_Trigger) Reset() {\n\t*x = AlertPolicy_Condition_Trigger{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[6]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_Condition_Trigger) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_Condition_Trigger) ProtoMessage() {}\n\nfunc (x *AlertPolicy_Condition_Trigger) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[6]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_Condition_Trigger.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_Condition_Trigger) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 0}\n}\n\nfunc (m *AlertPolicy_Condition_Trigger) GetType() isAlertPolicy_Condition_Trigger_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition_Trigger) GetCount() int32 {\n\tif x, ok := x.GetType().(*AlertPolicy_Condition_Trigger_Count); ok {\n\t\treturn x.Count\n\t}\n\treturn 0\n}\n\nfunc (x *AlertPolicy_Condition_Trigger) GetPercent() float64 {\n\tif x, ok := x.GetType().(*AlertPolicy_Condition_Trigger_Percent); ok {\n\t\treturn x.Percent\n\t}\n\treturn 0\n}\n\ntype isAlertPolicy_Condition_Trigger_Type interface {\n\tisAlertPolicy_Condition_Trigger_Type()\n}\n\ntype AlertPolicy_Condition_Trigger_Count struct {\n\t// The absolute number of time series that must fail\n\t// the predicate for the condition to be triggered.\n\tCount int32 `protobuf:\"varint,1,opt,name=count,proto3,oneof\"`\n}\n\ntype AlertPolicy_Condition_Trigger_Percent struct {\n\t// The percentage of time series that must fail the\n\t// predicate for the condition to be triggered.\n\tPercent float64 `protobuf:\"fixed64,2,opt,name=percent,proto3,oneof\"`\n}\n\nfunc (*AlertPolicy_Condition_Trigger_Count) isAlertPolicy_Condition_Trigger_Type() {}\n\nfunc (*AlertPolicy_Condition_Trigger_Percent) isAlertPolicy_Condition_Trigger_Type() {}\n\n// A condition type that compares a collection of time series\n// against a threshold.\ntype AlertPolicy_Condition_MetricThreshold struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. A\n\t// [filter](https://cloud.google.com/monitoring/api/v3/filters) that\n\t// identifies which time series should be compared with the threshold.\n\t//\n\t// The filter is similar to the one that is specified in the\n\t// [`ListTimeSeries`\n\t// request](https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.timeSeries/list)\n\t// (that call is useful to verify the time series that will be retrieved /\n\t// processed). The filter must specify the metric type and the resource\n\t// type. Optionally, it can specify resource labels and metric labels.\n\t// This field must not exceed 2048 Unicode characters in length.\n\tFilter string `protobuf:\"bytes,2,opt,name=filter,proto3\" json:\"filter,omitempty\"`\n\t// Specifies the alignment of data points in individual time series as\n\t// well as how to combine the retrieved time series together (such as\n\t// when aggregating multiple streams on each resource to a single\n\t// stream for each resource or when aggregating streams across all\n\t// members of a group of resources). Multiple aggregations\n\t// are applied in the order specified.\n\t//\n\t// This field is similar to the one in the [`ListTimeSeries`\n\t// request](https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.timeSeries/list).\n\t// It is advisable to use the `ListTimeSeries` method when debugging this\n\t// field.\n\tAggregations []*Aggregation `protobuf:\"bytes,8,rep,name=aggregations,proto3\" json:\"aggregations,omitempty\"`\n\t// A [filter](https://cloud.google.com/monitoring/api/v3/filters) that\n\t// identifies a time series that should be used as the denominator of a\n\t// ratio that will be compared with the threshold. If a\n\t// `denominator_filter` is specified, the time series specified by the\n\t// `filter` field will be used as the numerator.\n\t//\n\t// The filter must specify the metric type and optionally may contain\n\t// restrictions on resource type, resource labels, and metric labels.\n\t// This field may not exceed 2048 Unicode characters in length.\n\tDenominatorFilter string `protobuf:\"bytes,9,opt,name=denominator_filter,json=denominatorFilter,proto3\" json:\"denominator_filter,omitempty\"`\n\t// Specifies the alignment of data points in individual time series\n\t// selected by `denominatorFilter` as\n\t// well as how to combine the retrieved time series together (such as\n\t// when aggregating multiple streams on each resource to a single\n\t// stream for each resource or when aggregating streams across all\n\t// members of a group of resources).\n\t//\n\t// When computing ratios, the `aggregations` and\n\t// `denominator_aggregations` fields must use the same alignment period\n\t// and produce time series that have the same periodicity and labels.\n\tDenominatorAggregations []*Aggregation `protobuf:\"bytes,10,rep,name=denominator_aggregations,json=denominatorAggregations,proto3\" json:\"denominator_aggregations,omitempty\"`\n\t// When this field is present, the `MetricThreshold` condition forecasts\n\t// whether the time series is predicted to violate the threshold within\n\t// the `forecast_horizon`. When this field is not set, the\n\t// `MetricThreshold` tests the current value of the timeseries against the\n\t// threshold.\n\tForecastOptions *AlertPolicy_Condition_MetricThreshold_ForecastOptions `protobuf:\"bytes,12,opt,name=forecast_options,json=forecastOptions,proto3\" json:\"forecast_options,omitempty\"`\n\t// The comparison to apply between the time series (indicated by `filter`\n\t// and `aggregation`) and the threshold (indicated by `threshold_value`).\n\t// The comparison is applied on each time series, with the time series\n\t// on the left-hand side and the threshold on the right-hand side.\n\t//\n\t// Only `COMPARISON_LT` and `COMPARISON_GT` are supported currently.\n\tComparison ComparisonType `protobuf:\"varint,4,opt,name=comparison,proto3,enum=google.monitoring.v3.ComparisonType\" json:\"comparison,omitempty\"`\n\t// A value against which to compare the time series.\n\tThresholdValue float64 `protobuf:\"fixed64,5,opt,name=threshold_value,json=thresholdValue,proto3\" json:\"threshold_value,omitempty\"`\n\t// The amount of time that a time series must violate the\n\t// threshold to be considered failing. Currently, only values\n\t// that are a multiple of a minute--e.g., 0, 60, 120, or 300\n\t// seconds--are supported. If an invalid value is given, an\n\t// error will be returned. When choosing a duration, it is useful to\n\t// keep in mind the frequency of the underlying time series data\n\t// (which may also be affected by any alignments specified in the\n\t// `aggregations` field); a good duration is long enough so that a single\n\t// outlier does not generate spurious alerts, but short enough that\n\t// unhealthy states are detected and alerted on quickly.\n\tDuration *durationpb.Duration `protobuf:\"bytes,6,opt,name=duration,proto3\" json:\"duration,omitempty\"`\n\t// The number/percent of time series for which the comparison must hold\n\t// in order for the condition to trigger. If unspecified, then the\n\t// condition will trigger if the comparison is true for any of the\n\t// time series that have been identified by `filter` and `aggregations`,\n\t// or by the ratio, if `denominator_filter` and `denominator_aggregations`\n\t// are specified.\n\tTrigger *AlertPolicy_Condition_Trigger `protobuf:\"bytes,7,opt,name=trigger,proto3\" json:\"trigger,omitempty\"`\n\t// A condition control that determines how metric-threshold conditions\n\t// are evaluated when data stops arriving. To use this control, the value\n\t// of the `duration` field must be greater than or equal to 60 seconds.\n\tEvaluationMissingData AlertPolicy_Condition_EvaluationMissingData `protobuf:\"varint,11,opt,name=evaluation_missing_data,json=evaluationMissingData,proto3,enum=google.monitoring.v3.AlertPolicy_Condition_EvaluationMissingData\" json:\"evaluation_missing_data,omitempty\"`\n}\n\nfunc (x *AlertPolicy_Condition_MetricThreshold) Reset() {\n\t*x = AlertPolicy_Condition_MetricThreshold{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[7]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_Condition_MetricThreshold) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_Condition_MetricThreshold) ProtoMessage() {}\n\nfunc (x *AlertPolicy_Condition_MetricThreshold) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[7]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_Condition_MetricThreshold.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_Condition_MetricThreshold) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 1}\n}\n\nfunc (x *AlertPolicy_Condition_MetricThreshold) GetFilter() string {\n\tif x != nil {\n\t\treturn x.Filter\n\t}\n\treturn \"\"\n}\n\nfunc (x *AlertPolicy_Condition_MetricThreshold) GetAggregations() []*Aggregation {\n\tif x != nil {\n\t\treturn x.Aggregations\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition_MetricThreshold) GetDenominatorFilter() string {\n\tif x != nil {\n\t\treturn x.DenominatorFilter\n\t}\n\treturn \"\"\n}\n\nfunc (x *AlertPolicy_Condition_MetricThreshold) GetDenominatorAggregations() []*Aggregation {\n\tif x != nil {\n\t\treturn x.DenominatorAggregations\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition_MetricThreshold) GetForecastOptions() *AlertPolicy_Condition_MetricThreshold_ForecastOptions {\n\tif x != nil {\n\t\treturn x.ForecastOptions\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition_MetricThreshold) GetComparison() ComparisonType {\n\tif x != nil {\n\t\treturn x.Comparison\n\t}\n\treturn ComparisonType_COMPARISON_UNSPECIFIED\n}\n\nfunc (x *AlertPolicy_Condition_MetricThreshold) GetThresholdValue() float64 {\n\tif x != nil {\n\t\treturn x.ThresholdValue\n\t}\n\treturn 0\n}\n\nfunc (x *AlertPolicy_Condition_MetricThreshold) GetDuration() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Duration\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition_MetricThreshold) GetTrigger() *AlertPolicy_Condition_Trigger {\n\tif x != nil {\n\t\treturn x.Trigger\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition_MetricThreshold) GetEvaluationMissingData() AlertPolicy_Condition_EvaluationMissingData {\n\tif x != nil {\n\t\treturn x.EvaluationMissingData\n\t}\n\treturn AlertPolicy_Condition_EVALUATION_MISSING_DATA_UNSPECIFIED\n}\n\n// A condition type that checks that monitored resources\n// are reporting data. The configuration defines a metric and\n// a set of monitored resources. The predicate is considered in violation\n// when a time series for the specified metric of a monitored\n// resource does not include any data in the specified `duration`.\ntype AlertPolicy_Condition_MetricAbsence struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. A\n\t// [filter](https://cloud.google.com/monitoring/api/v3/filters) that\n\t// identifies which time series should be compared with the threshold.\n\t//\n\t// The filter is similar to the one that is specified in the\n\t// [`ListTimeSeries`\n\t// request](https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.timeSeries/list)\n\t// (that call is useful to verify the time series that will be retrieved /\n\t// processed). The filter must specify the metric type and the resource\n\t// type. Optionally, it can specify resource labels and metric labels.\n\t// This field must not exceed 2048 Unicode characters in length.\n\tFilter string `protobuf:\"bytes,1,opt,name=filter,proto3\" json:\"filter,omitempty\"`\n\t// Specifies the alignment of data points in individual time series as\n\t// well as how to combine the retrieved time series together (such as\n\t// when aggregating multiple streams on each resource to a single\n\t// stream for each resource or when aggregating streams across all\n\t// members of a group of resources). Multiple aggregations\n\t// are applied in the order specified.\n\t//\n\t// This field is similar to the one in the [`ListTimeSeries`\n\t// request](https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.timeSeries/list).\n\t// It is advisable to use the `ListTimeSeries` method when debugging this\n\t// field.\n\tAggregations []*Aggregation `protobuf:\"bytes,5,rep,name=aggregations,proto3\" json:\"aggregations,omitempty\"`\n\t// The amount of time that a time series must fail to report new\n\t// data to be considered failing. The minimum value of this field\n\t// is 120 seconds. Larger values that are a multiple of a\n\t// minute--for example, 240 or 300 seconds--are supported.\n\t// If an invalid value is given, an\n\t// error will be returned. The `Duration.nanos` field is\n\t// ignored.\n\tDuration *durationpb.Duration `protobuf:\"bytes,2,opt,name=duration,proto3\" json:\"duration,omitempty\"`\n\t// The number/percent of time series for which the comparison must hold\n\t// in order for the condition to trigger. If unspecified, then the\n\t// condition will trigger if the comparison is true for any of the\n\t// time series that have been identified by `filter` and `aggregations`.\n\tTrigger *AlertPolicy_Condition_Trigger `protobuf:\"bytes,3,opt,name=trigger,proto3\" json:\"trigger,omitempty\"`\n}\n\nfunc (x *AlertPolicy_Condition_MetricAbsence) Reset() {\n\t*x = AlertPolicy_Condition_MetricAbsence{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[8]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_Condition_MetricAbsence) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_Condition_MetricAbsence) ProtoMessage() {}\n\nfunc (x *AlertPolicy_Condition_MetricAbsence) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[8]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_Condition_MetricAbsence.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_Condition_MetricAbsence) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 2}\n}\n\nfunc (x *AlertPolicy_Condition_MetricAbsence) GetFilter() string {\n\tif x != nil {\n\t\treturn x.Filter\n\t}\n\treturn \"\"\n}\n\nfunc (x *AlertPolicy_Condition_MetricAbsence) GetAggregations() []*Aggregation {\n\tif x != nil {\n\t\treturn x.Aggregations\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition_MetricAbsence) GetDuration() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Duration\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition_MetricAbsence) GetTrigger() *AlertPolicy_Condition_Trigger {\n\tif x != nil {\n\t\treturn x.Trigger\n\t}\n\treturn nil\n}\n\n// A condition type that checks whether a log message in the [scoping\n// project](https://cloud.google.com/monitoring/api/v3#project_name)\n// satisfies the given filter. Logs from other projects in the metrics\n// scope are not evaluated.\ntype AlertPolicy_Condition_LogMatch struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. A logs-based filter. See [Advanced Logs\n\t// Queries](https://cloud.google.com/logging/docs/view/advanced-queries)\n\t// for how this filter should be constructed.\n\tFilter string `protobuf:\"bytes,1,opt,name=filter,proto3\" json:\"filter,omitempty\"`\n\t// Optional. A map from a label key to an extractor expression, which is\n\t// used to extract the value for this label key. Each entry in this map is\n\t// a specification for how data should be extracted from log entries that\n\t// match `filter`. Each combination of extracted values is treated as a\n\t// separate rule for the purposes of triggering notifications. Label keys\n\t// and corresponding values can be used in notifications generated by this\n\t// condition.\n\t//\n\t// Please see [the documentation on logs-based metric\n\t// `valueExtractor`s](https://cloud.google.com/logging/docs/reference/v2/rest/v2/projects.metrics#LogMetric.FIELDS.value_extractor)\n\t// for syntax and examples.\n\tLabelExtractors map[string]string `protobuf:\"bytes,2,rep,name=label_extractors,json=labelExtractors,proto3\" json:\"label_extractors,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n}\n\nfunc (x *AlertPolicy_Condition_LogMatch) Reset() {\n\t*x = AlertPolicy_Condition_LogMatch{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[9]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_Condition_LogMatch) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_Condition_LogMatch) ProtoMessage() {}\n\nfunc (x *AlertPolicy_Condition_LogMatch) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[9]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_Condition_LogMatch.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_Condition_LogMatch) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 3}\n}\n\nfunc (x *AlertPolicy_Condition_LogMatch) GetFilter() string {\n\tif x != nil {\n\t\treturn x.Filter\n\t}\n\treturn \"\"\n}\n\nfunc (x *AlertPolicy_Condition_LogMatch) GetLabelExtractors() map[string]string {\n\tif x != nil {\n\t\treturn x.LabelExtractors\n\t}\n\treturn nil\n}\n\n// A condition type that allows alerting policies to be defined using\n// [Monitoring Query Language](https://cloud.google.com/monitoring/mql).\ntype AlertPolicy_Condition_MonitoringQueryLanguageCondition struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// [Monitoring Query Language](https://cloud.google.com/monitoring/mql)\n\t// query that outputs a boolean stream.\n\tQuery string `protobuf:\"bytes,1,opt,name=query,proto3\" json:\"query,omitempty\"`\n\t// The amount of time that a time series must violate the\n\t// threshold to be considered failing. Currently, only values\n\t// that are a multiple of a minute--e.g., 0, 60, 120, or 300\n\t// seconds--are supported. If an invalid value is given, an\n\t// error will be returned. When choosing a duration, it is useful to\n\t// keep in mind the frequency of the underlying time series data\n\t// (which may also be affected by any alignments specified in the\n\t// `aggregations` field); a good duration is long enough so that a single\n\t// outlier does not generate spurious alerts, but short enough that\n\t// unhealthy states are detected and alerted on quickly.\n\tDuration *durationpb.Duration `protobuf:\"bytes,2,opt,name=duration,proto3\" json:\"duration,omitempty\"`\n\t// The number/percent of time series for which the comparison must hold\n\t// in order for the condition to trigger. If unspecified, then the\n\t// condition will trigger if the comparison is true for any of the\n\t// time series that have been identified by `filter` and `aggregations`,\n\t// or by the ratio, if `denominator_filter` and `denominator_aggregations`\n\t// are specified.\n\tTrigger *AlertPolicy_Condition_Trigger `protobuf:\"bytes,3,opt,name=trigger,proto3\" json:\"trigger,omitempty\"`\n\t// A condition control that determines how metric-threshold conditions\n\t// are evaluated when data stops arriving.\n\tEvaluationMissingData AlertPolicy_Condition_EvaluationMissingData `protobuf:\"varint,4,opt,name=evaluation_missing_data,json=evaluationMissingData,proto3,enum=google.monitoring.v3.AlertPolicy_Condition_EvaluationMissingData\" json:\"evaluation_missing_data,omitempty\"`\n}\n\nfunc (x *AlertPolicy_Condition_MonitoringQueryLanguageCondition) Reset() {\n\t*x = AlertPolicy_Condition_MonitoringQueryLanguageCondition{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[10]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_Condition_MonitoringQueryLanguageCondition) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_Condition_MonitoringQueryLanguageCondition) ProtoMessage() {}\n\nfunc (x *AlertPolicy_Condition_MonitoringQueryLanguageCondition) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[10]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_Condition_MonitoringQueryLanguageCondition.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_Condition_MonitoringQueryLanguageCondition) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 4}\n}\n\nfunc (x *AlertPolicy_Condition_MonitoringQueryLanguageCondition) GetQuery() string {\n\tif x != nil {\n\t\treturn x.Query\n\t}\n\treturn \"\"\n}\n\nfunc (x *AlertPolicy_Condition_MonitoringQueryLanguageCondition) GetDuration() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Duration\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition_MonitoringQueryLanguageCondition) GetTrigger() *AlertPolicy_Condition_Trigger {\n\tif x != nil {\n\t\treturn x.Trigger\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition_MonitoringQueryLanguageCondition) GetEvaluationMissingData() AlertPolicy_Condition_EvaluationMissingData {\n\tif x != nil {\n\t\treturn x.EvaluationMissingData\n\t}\n\treturn AlertPolicy_Condition_EVALUATION_MISSING_DATA_UNSPECIFIED\n}\n\n// A condition type that allows alerting policies to be defined using\n// [Prometheus Query Language\n// (PromQL)](https://prometheus.io/docs/prometheus/latest/querying/basics/).\n//\n// The PrometheusQueryLanguageCondition message contains information\n// from a Prometheus alerting rule and its associated rule group.\n//\n// A Prometheus alerting rule is described\n// [here](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/).\n// The semantics of a Prometheus alerting rule is described\n// [here](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/#rule).\n//\n// A Prometheus rule group is described\n// [here](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/).\n// The semantics of a Prometheus rule group is described\n// [here](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/#rule_group).\n//\n// Because Cloud Alerting has no representation of a Prometheus rule\n// group resource, we must embed the information of the parent rule\n// group inside each of the conditions that refer to it. We must also\n// update the contents of all Prometheus alerts in case the information\n// of their rule group changes.\n//\n// The PrometheusQueryLanguageCondition protocol buffer combines the\n// information of the corresponding rule group and alerting rule.\n// The structure of the PrometheusQueryLanguageCondition protocol buffer\n// does NOT mimic the structure of the Prometheus rule group and alerting\n// rule YAML declarations. The PrometheusQueryLanguageCondition protocol\n// buffer may change in the future to support future rule group and/or\n// alerting rule features. There are no new such features at the present\n// time (2023-06-26).\ntype AlertPolicy_Condition_PrometheusQueryLanguageCondition struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The PromQL expression to evaluate. Every evaluation cycle\n\t// this expression is evaluated at the current time, and all resultant\n\t// time series become pending/firing alerts. This field must not be empty.\n\tQuery string `protobuf:\"bytes,1,opt,name=query,proto3\" json:\"query,omitempty\"`\n\t// Optional. Alerts are considered firing once their PromQL expression was\n\t// evaluated to be \"true\" for this long.\n\t// Alerts whose PromQL expression was not evaluated to be \"true\" for\n\t// long enough are considered pending.\n\t// Must be a non-negative duration or missing.\n\t// This field is optional. Its default value is zero.\n\tDuration *durationpb.Duration `protobuf:\"bytes,2,opt,name=duration,proto3\" json:\"duration,omitempty\"`\n\t// Optional. How often this rule should be evaluated.\n\t// Must be a positive multiple of 30 seconds or missing.\n\t// This field is optional. Its default value is 30 seconds.\n\t// If this PrometheusQueryLanguageCondition was generated from a\n\t// Prometheus alerting rule, then this value should be taken from the\n\t// enclosing rule group.\n\tEvaluationInterval *durationpb.Duration `protobuf:\"bytes,3,opt,name=evaluation_interval,json=evaluationInterval,proto3\" json:\"evaluation_interval,omitempty\"`\n\t// Optional. Labels to add to or overwrite in the PromQL query result.\n\t// Label names [must be\n\t// valid](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels).\n\t// Label values can be [templatized by using\n\t// variables](https://cloud.google.com/monitoring/alerts/doc-variables#doc-vars).\n\t// The only available variable names are the names of the labels in the\n\t// PromQL result, including \"__name__\" and \"value\". \"labels\" may be empty.\n\tLabels map[string]string `protobuf:\"bytes,4,rep,name=labels,proto3\" json:\"labels,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\t// Optional. The rule group name of this alert in the corresponding\n\t// Prometheus configuration file.\n\t//\n\t// Some external tools may require this field to be populated correctly\n\t// in order to refer to the original Prometheus configuration file.\n\t// The rule group name and the alert name are necessary to update the\n\t// relevant AlertPolicies in case the definition of the rule group changes\n\t// in the future.\n\t//\n\t// This field is optional. If this field is not empty, then it must\n\t// contain a valid UTF-8 string.\n\t// This field may not exceed 2048 Unicode characters in length.\n\tRuleGroup string `protobuf:\"bytes,5,opt,name=rule_group,json=ruleGroup,proto3\" json:\"rule_group,omitempty\"`\n\t// Optional. The alerting rule name of this alert in the corresponding\n\t// Prometheus configuration file.\n\t//\n\t// Some external tools may require this field to be populated correctly\n\t// in order to refer to the original Prometheus configuration file.\n\t// The rule group name and the alert name are necessary to update the\n\t// relevant AlertPolicies in case the definition of the rule group changes\n\t// in the future.\n\t//\n\t// This field is optional. If this field is not empty, then it must be a\n\t// [valid Prometheus label\n\t// name](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels).\n\t// This field may not exceed 2048 Unicode characters in length.\n\tAlertRule string `protobuf:\"bytes,6,opt,name=alert_rule,json=alertRule,proto3\" json:\"alert_rule,omitempty\"`\n\t// Optional. Whether to disable metric existence validation for this\n\t// condition.\n\t//\n\t// This allows alerting policies to be defined on metrics that do not yet\n\t// exist, improving advanced customer workflows such as configuring\n\t// alerting policies using Terraform.\n\t//\n\t// Users with the `monitoring.alertPolicyViewer` role are able to see the\n\t// name of the non-existent metric in the alerting policy condition.\n\tDisableMetricValidation bool `protobuf:\"varint,7,opt,name=disable_metric_validation,json=disableMetricValidation,proto3\" json:\"disable_metric_validation,omitempty\"`\n}\n\nfunc (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) Reset() {\n\t*x = AlertPolicy_Condition_PrometheusQueryLanguageCondition{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[11]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_Condition_PrometheusQueryLanguageCondition) ProtoMessage() {}\n\nfunc (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[11]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_Condition_PrometheusQueryLanguageCondition.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_Condition_PrometheusQueryLanguageCondition) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 5}\n}\n\nfunc (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) GetQuery() string {\n\tif x != nil {\n\t\treturn x.Query\n\t}\n\treturn \"\"\n}\n\nfunc (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) GetDuration() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Duration\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) GetEvaluationInterval() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.EvaluationInterval\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) GetLabels() map[string]string {\n\tif x != nil {\n\t\treturn x.Labels\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) GetRuleGroup() string {\n\tif x != nil {\n\t\treturn x.RuleGroup\n\t}\n\treturn \"\"\n}\n\nfunc (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) GetAlertRule() string {\n\tif x != nil {\n\t\treturn x.AlertRule\n\t}\n\treturn \"\"\n}\n\nfunc (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) GetDisableMetricValidation() bool {\n\tif x != nil {\n\t\treturn x.DisableMetricValidation\n\t}\n\treturn false\n}\n\n// A condition that allows alerting policies to be defined using GoogleSQL.\n// SQL conditions examine a sliding window of logs using GoogleSQL.\n// Alert policies with SQL conditions may incur additional billing.\ntype AlertPolicy_Condition_SqlCondition struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The Log Analytics SQL query to run, as a string.  The query\n\t// must conform to the required shape. Specifically, the query must not\n\t// try to filter the input by time.  A filter will automatically be\n\t// applied to filter the input so that the query receives all rows\n\t// received since the last time the query was run.\n\t//\n\t// For example, the following query extracts all log entries containing an\n\t// HTTP request:\n\t//\n\t//\tSELECT\n\t//\t  timestamp, log_name, severity, http_request, resource, labels\n\t//\tFROM\n\t//\t  my-project.global._Default._AllLogs\n\t//\tWHERE\n\t//\t  http_request IS NOT NULL\n\tQuery string `protobuf:\"bytes,1,opt,name=query,proto3\" json:\"query,omitempty\"`\n\t// The schedule indicates how often the query should be run.\n\t//\n\t// Types that are assignable to Schedule:\n\t//\n\t//\t*AlertPolicy_Condition_SqlCondition_Minutes_\n\t//\t*AlertPolicy_Condition_SqlCondition_Hourly_\n\t//\t*AlertPolicy_Condition_SqlCondition_Daily_\n\tSchedule isAlertPolicy_Condition_SqlCondition_Schedule `protobuf_oneof:\"schedule\"`\n\t// The test to be run against the SQL result set.\n\t//\n\t// Types that are assignable to Evaluate:\n\t//\n\t//\t*AlertPolicy_Condition_SqlCondition_RowCountTest_\n\t//\t*AlertPolicy_Condition_SqlCondition_BooleanTest_\n\tEvaluate isAlertPolicy_Condition_SqlCondition_Evaluate `protobuf_oneof:\"evaluate\"`\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition) Reset() {\n\t*x = AlertPolicy_Condition_SqlCondition{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[12]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_Condition_SqlCondition) ProtoMessage() {}\n\nfunc (x *AlertPolicy_Condition_SqlCondition) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[12]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_Condition_SqlCondition.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_Condition_SqlCondition) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 6}\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition) GetQuery() string {\n\tif x != nil {\n\t\treturn x.Query\n\t}\n\treturn \"\"\n}\n\nfunc (m *AlertPolicy_Condition_SqlCondition) GetSchedule() isAlertPolicy_Condition_SqlCondition_Schedule {\n\tif m != nil {\n\t\treturn m.Schedule\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition) GetMinutes() *AlertPolicy_Condition_SqlCondition_Minutes {\n\tif x, ok := x.GetSchedule().(*AlertPolicy_Condition_SqlCondition_Minutes_); ok {\n\t\treturn x.Minutes\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition) GetHourly() *AlertPolicy_Condition_SqlCondition_Hourly {\n\tif x, ok := x.GetSchedule().(*AlertPolicy_Condition_SqlCondition_Hourly_); ok {\n\t\treturn x.Hourly\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition) GetDaily() *AlertPolicy_Condition_SqlCondition_Daily {\n\tif x, ok := x.GetSchedule().(*AlertPolicy_Condition_SqlCondition_Daily_); ok {\n\t\treturn x.Daily\n\t}\n\treturn nil\n}\n\nfunc (m *AlertPolicy_Condition_SqlCondition) GetEvaluate() isAlertPolicy_Condition_SqlCondition_Evaluate {\n\tif m != nil {\n\t\treturn m.Evaluate\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition) GetRowCountTest() *AlertPolicy_Condition_SqlCondition_RowCountTest {\n\tif x, ok := x.GetEvaluate().(*AlertPolicy_Condition_SqlCondition_RowCountTest_); ok {\n\t\treturn x.RowCountTest\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition) GetBooleanTest() *AlertPolicy_Condition_SqlCondition_BooleanTest {\n\tif x, ok := x.GetEvaluate().(*AlertPolicy_Condition_SqlCondition_BooleanTest_); ok {\n\t\treturn x.BooleanTest\n\t}\n\treturn nil\n}\n\ntype isAlertPolicy_Condition_SqlCondition_Schedule interface {\n\tisAlertPolicy_Condition_SqlCondition_Schedule()\n}\n\ntype AlertPolicy_Condition_SqlCondition_Minutes_ struct {\n\t// Schedule the query to execute every so many minutes.\n\tMinutes *AlertPolicy_Condition_SqlCondition_Minutes `protobuf:\"bytes,2,opt,name=minutes,proto3,oneof\"`\n}\n\ntype AlertPolicy_Condition_SqlCondition_Hourly_ struct {\n\t// Schedule the query to execute every so many hours.\n\tHourly *AlertPolicy_Condition_SqlCondition_Hourly `protobuf:\"bytes,3,opt,name=hourly,proto3,oneof\"`\n}\n\ntype AlertPolicy_Condition_SqlCondition_Daily_ struct {\n\t// Schedule the query to execute every so many days.\n\tDaily *AlertPolicy_Condition_SqlCondition_Daily `protobuf:\"bytes,4,opt,name=daily,proto3,oneof\"`\n}\n\nfunc (*AlertPolicy_Condition_SqlCondition_Minutes_) isAlertPolicy_Condition_SqlCondition_Schedule() {}\n\nfunc (*AlertPolicy_Condition_SqlCondition_Hourly_) isAlertPolicy_Condition_SqlCondition_Schedule() {}\n\nfunc (*AlertPolicy_Condition_SqlCondition_Daily_) isAlertPolicy_Condition_SqlCondition_Schedule() {}\n\ntype isAlertPolicy_Condition_SqlCondition_Evaluate interface {\n\tisAlertPolicy_Condition_SqlCondition_Evaluate()\n}\n\ntype AlertPolicy_Condition_SqlCondition_RowCountTest_ struct {\n\t// Test the row count against a threshold.\n\tRowCountTest *AlertPolicy_Condition_SqlCondition_RowCountTest `protobuf:\"bytes,5,opt,name=row_count_test,json=rowCountTest,proto3,oneof\"`\n}\n\ntype AlertPolicy_Condition_SqlCondition_BooleanTest_ struct {\n\t// Test the boolean value in the indicated column.\n\tBooleanTest *AlertPolicy_Condition_SqlCondition_BooleanTest `protobuf:\"bytes,6,opt,name=boolean_test,json=booleanTest,proto3,oneof\"`\n}\n\nfunc (*AlertPolicy_Condition_SqlCondition_RowCountTest_) isAlertPolicy_Condition_SqlCondition_Evaluate() {\n}\n\nfunc (*AlertPolicy_Condition_SqlCondition_BooleanTest_) isAlertPolicy_Condition_SqlCondition_Evaluate() {\n}\n\n// Options used when forecasting the time series and testing\n// the predicted value against the threshold.\ntype AlertPolicy_Condition_MetricThreshold_ForecastOptions struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The length of time into the future to forecast whether a\n\t// time series will violate the threshold. If the predicted value is\n\t// found to violate the threshold, and the violation is observed in all\n\t// forecasts made for the configured `duration`, then the time series is\n\t// considered to be failing.\n\t// The forecast horizon can range from 1 hour to 60 hours.\n\tForecastHorizon *durationpb.Duration `protobuf:\"bytes,1,opt,name=forecast_horizon,json=forecastHorizon,proto3\" json:\"forecast_horizon,omitempty\"`\n}\n\nfunc (x *AlertPolicy_Condition_MetricThreshold_ForecastOptions) Reset() {\n\t*x = AlertPolicy_Condition_MetricThreshold_ForecastOptions{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[13]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_Condition_MetricThreshold_ForecastOptions) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_Condition_MetricThreshold_ForecastOptions) ProtoMessage() {}\n\nfunc (x *AlertPolicy_Condition_MetricThreshold_ForecastOptions) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[13]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_Condition_MetricThreshold_ForecastOptions.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_Condition_MetricThreshold_ForecastOptions) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 1, 0}\n}\n\nfunc (x *AlertPolicy_Condition_MetricThreshold_ForecastOptions) GetForecastHorizon() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.ForecastHorizon\n\t}\n\treturn nil\n}\n\n// Used to schedule the query to run every so many minutes.\ntype AlertPolicy_Condition_SqlCondition_Minutes struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Number of minutes between runs. The interval must be\n\t// greater than or equal to 5 minutes and less than or equal to 1440\n\t// minutes.\n\tPeriodicity int32 `protobuf:\"varint,1,opt,name=periodicity,proto3\" json:\"periodicity,omitempty\"`\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_Minutes) Reset() {\n\t*x = AlertPolicy_Condition_SqlCondition_Minutes{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[16]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_Minutes) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_Condition_SqlCondition_Minutes) ProtoMessage() {}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_Minutes) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[16]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_Condition_SqlCondition_Minutes.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_Condition_SqlCondition_Minutes) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 6, 0}\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_Minutes) GetPeriodicity() int32 {\n\tif x != nil {\n\t\treturn x.Periodicity\n\t}\n\treturn 0\n}\n\n// Used to schedule the query to run every so many hours.\ntype AlertPolicy_Condition_SqlCondition_Hourly struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The number of hours between runs. Must be greater than or\n\t// equal to 1 hour and less than or equal to 48 hours.\n\tPeriodicity int32 `protobuf:\"varint,1,opt,name=periodicity,proto3\" json:\"periodicity,omitempty\"`\n\t// Optional. The number of minutes after the hour (in UTC) to run the\n\t// query. Must be greater than or equal to 0 minutes and less than or\n\t// equal to 59 minutes.  If left unspecified, then an arbitrary offset\n\t// is used.\n\tMinuteOffset *int32 `protobuf:\"varint,2,opt,name=minute_offset,json=minuteOffset,proto3,oneof\" json:\"minute_offset,omitempty\"`\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_Hourly) Reset() {\n\t*x = AlertPolicy_Condition_SqlCondition_Hourly{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[17]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_Hourly) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_Condition_SqlCondition_Hourly) ProtoMessage() {}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_Hourly) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[17]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_Condition_SqlCondition_Hourly.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_Condition_SqlCondition_Hourly) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 6, 1}\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_Hourly) GetPeriodicity() int32 {\n\tif x != nil {\n\t\treturn x.Periodicity\n\t}\n\treturn 0\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_Hourly) GetMinuteOffset() int32 {\n\tif x != nil && x.MinuteOffset != nil {\n\t\treturn *x.MinuteOffset\n\t}\n\treturn 0\n}\n\n// Used to schedule the query to run every so many days.\ntype AlertPolicy_Condition_SqlCondition_Daily struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The number of days between runs. Must be greater than or\n\t// equal to 1 day and less than or equal to 31 days.\n\tPeriodicity int32 `protobuf:\"varint,1,opt,name=periodicity,proto3\" json:\"periodicity,omitempty\"`\n\t// Optional. The time of day (in UTC) at which the query should run. If\n\t// left unspecified, the server picks an arbitrary time of day and runs\n\t// the query at the same time each day.\n\tExecutionTime *timeofday.TimeOfDay `protobuf:\"bytes,2,opt,name=execution_time,json=executionTime,proto3\" json:\"execution_time,omitempty\"`\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_Daily) Reset() {\n\t*x = AlertPolicy_Condition_SqlCondition_Daily{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[18]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_Daily) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_Condition_SqlCondition_Daily) ProtoMessage() {}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_Daily) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[18]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_Condition_SqlCondition_Daily.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_Condition_SqlCondition_Daily) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 6, 2}\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_Daily) GetPeriodicity() int32 {\n\tif x != nil {\n\t\treturn x.Periodicity\n\t}\n\treturn 0\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_Daily) GetExecutionTime() *timeofday.TimeOfDay {\n\tif x != nil {\n\t\treturn x.ExecutionTime\n\t}\n\treturn nil\n}\n\n// A test that checks if the number of rows in the result set\n// violates some threshold.\ntype AlertPolicy_Condition_SqlCondition_RowCountTest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The comparison to apply between the number of rows returned\n\t// by the query and the threshold.\n\tComparison ComparisonType `protobuf:\"varint,1,opt,name=comparison,proto3,enum=google.monitoring.v3.ComparisonType\" json:\"comparison,omitempty\"`\n\t// Required. The value against which to compare the row count.\n\tThreshold int64 `protobuf:\"varint,2,opt,name=threshold,proto3\" json:\"threshold,omitempty\"`\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_RowCountTest) Reset() {\n\t*x = AlertPolicy_Condition_SqlCondition_RowCountTest{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[19]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_RowCountTest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_Condition_SqlCondition_RowCountTest) ProtoMessage() {}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_RowCountTest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[19]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_Condition_SqlCondition_RowCountTest.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_Condition_SqlCondition_RowCountTest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 6, 3}\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_RowCountTest) GetComparison() ComparisonType {\n\tif x != nil {\n\t\treturn x.Comparison\n\t}\n\treturn ComparisonType_COMPARISON_UNSPECIFIED\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_RowCountTest) GetThreshold() int64 {\n\tif x != nil {\n\t\treturn x.Threshold\n\t}\n\treturn 0\n}\n\n// A test that uses an alerting result in a boolean column produced by\n// the SQL query.\ntype AlertPolicy_Condition_SqlCondition_BooleanTest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The name of the column containing the boolean value. If the\n\t// value in a row is NULL, that row is ignored.\n\tColumn string `protobuf:\"bytes,1,opt,name=column,proto3\" json:\"column,omitempty\"`\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_BooleanTest) Reset() {\n\t*x = AlertPolicy_Condition_SqlCondition_BooleanTest{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[20]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_BooleanTest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_Condition_SqlCondition_BooleanTest) ProtoMessage() {}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_BooleanTest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[20]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_Condition_SqlCondition_BooleanTest.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_Condition_SqlCondition_BooleanTest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 6, 4}\n}\n\nfunc (x *AlertPolicy_Condition_SqlCondition_BooleanTest) GetColumn() string {\n\tif x != nil {\n\t\treturn x.Column\n\t}\n\treturn \"\"\n}\n\n// Control over the rate of notifications sent to this alerting policy's\n// notification channels.\ntype AlertPolicy_AlertStrategy_NotificationRateLimit struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Not more than one notification per `period`.\n\tPeriod *durationpb.Duration `protobuf:\"bytes,1,opt,name=period,proto3\" json:\"period,omitempty\"`\n}\n\nfunc (x *AlertPolicy_AlertStrategy_NotificationRateLimit) Reset() {\n\t*x = AlertPolicy_AlertStrategy_NotificationRateLimit{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[21]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_AlertStrategy_NotificationRateLimit) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_AlertStrategy_NotificationRateLimit) ProtoMessage() {}\n\nfunc (x *AlertPolicy_AlertStrategy_NotificationRateLimit) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[21]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_AlertStrategy_NotificationRateLimit.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_AlertStrategy_NotificationRateLimit) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 2, 0}\n}\n\nfunc (x *AlertPolicy_AlertStrategy_NotificationRateLimit) GetPeriod() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Period\n\t}\n\treturn nil\n}\n\n// Control over how the notification channels in `notification_channels`\n// are notified when this alert fires, on a per-channel basis.\ntype AlertPolicy_AlertStrategy_NotificationChannelStrategy struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The full REST resource name for the notification channels that these\n\t// settings apply to. Each of these correspond to the name field in one\n\t// of the NotificationChannel objects referenced in the\n\t// notification_channels field of this AlertPolicy.\n\t// The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/notificationChannels/[CHANNEL_ID]\n\tNotificationChannelNames []string `protobuf:\"bytes,1,rep,name=notification_channel_names,json=notificationChannelNames,proto3\" json:\"notification_channel_names,omitempty\"`\n\t// The frequency at which to send reminder notifications for open\n\t// incidents.\n\tRenotifyInterval *durationpb.Duration `protobuf:\"bytes,2,opt,name=renotify_interval,json=renotifyInterval,proto3\" json:\"renotify_interval,omitempty\"`\n}\n\nfunc (x *AlertPolicy_AlertStrategy_NotificationChannelStrategy) Reset() {\n\t*x = AlertPolicy_AlertStrategy_NotificationChannelStrategy{}\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[22]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AlertPolicy_AlertStrategy_NotificationChannelStrategy) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AlertPolicy_AlertStrategy_NotificationChannelStrategy) ProtoMessage() {}\n\nfunc (x *AlertPolicy_AlertStrategy_NotificationChannelStrategy) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_proto_msgTypes[22]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AlertPolicy_AlertStrategy_NotificationChannelStrategy.ProtoReflect.Descriptor instead.\nfunc (*AlertPolicy_AlertStrategy_NotificationChannelStrategy) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 2, 1}\n}\n\nfunc (x *AlertPolicy_AlertStrategy_NotificationChannelStrategy) GetNotificationChannelNames() []string {\n\tif x != nil {\n\t\treturn x.NotificationChannelNames\n\t}\n\treturn nil\n}\n\nfunc (x *AlertPolicy_AlertStrategy_NotificationChannelStrategy) GetRenotifyInterval() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.RenotifyInterval\n\t}\n\treturn nil\n}\n\nvar File_google_monitoring_v3_alert_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_alert_proto_rawDesc = []byte{\n\t0x0a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76,\n\t0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6d, 0x75,\n\t0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f,\n\t0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x66,\n\t0x64, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe5, 0x35, 0x0a, 0x0b, 0x41, 0x6c,\n\t0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61,\n\t0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x55, 0x0a, 0x0d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,\n\t0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e,\n\t0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x64,\n\t0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x52, 0x0a, 0x0b,\n\t0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28,\n\t0x0b, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f,\n\t0x6c, 0x69, 0x63, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45,\n\t0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73,\n\t0x12, 0x4b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72,\n\t0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f,\n\t0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x53, 0x0a,\n\t0x08, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32,\n\t0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69,\n\t0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x62,\n\t0x69, 0x6e, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e,\n\t0x65, 0x72, 0x12, 0x34, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x11, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,\n\t0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x08, 0x76, 0x61, 0x6c, 0x69,\n\t0x64, 0x69, 0x74, 0x79, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x08,\n\t0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x12, 0x33, 0x0a, 0x15, 0x6e, 0x6f, 0x74, 0x69,\n\t0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,\n\t0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x4d, 0x0a,\n\t0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64,\n\t0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x75,\n\t0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0e, 0x63, 0x72,\n\t0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x4d, 0x0a, 0x0f,\n\t0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18,\n\t0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x75, 0x74,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0e, 0x6d, 0x75, 0x74,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x56, 0x0a, 0x0e, 0x61,\n\t0x6c, 0x65, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x15, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x53, 0x74, 0x72, 0x61,\n\t0x74, 0x65, 0x67, 0x79, 0x52, 0x0d, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74,\n\t0x65, 0x67, 0x79, 0x12, 0x4b, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18,\n\t0x16, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65,\n\t0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74,\n\t0x79, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79,\n\t0x1a, 0xf3, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09,\n\t0x6d, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x08, 0x6d, 0x69, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x73, 0x75, 0x62,\n\t0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,\n\t0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x4f, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x6b,\n\t0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41,\n\t0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d,\n\t0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x42, 0x03, 0xe0,\n\t0x41, 0x01, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x1a, 0x3b, 0x0a, 0x04, 0x4c, 0x69, 0x6e,\n\t0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d,\n\t0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79,\n\t0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x1a, 0xa5, 0x23, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70,\n\t0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,\n\t0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x6e, 0x0a, 0x13, 0x63,\n\t0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f,\n\t0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e,\n\t0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65,\n\t0x73, 0x68, 0x6f, 0x6c, 0x64, 0x48, 0x00, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69,\n\t0x6f, 0x6e, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x66, 0x0a, 0x10, 0x63,\n\t0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x62, 0x73, 0x65, 0x6e, 0x74, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65,\n\t0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x41, 0x62, 0x73, 0x65, 0x6e, 0x63, 0x65,\n\t0x48, 0x00, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x62, 0x73,\n\t0x65, 0x6e, 0x74, 0x12, 0x6a, 0x0a, 0x15, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x6c, 0x6f, 0x67, 0x18, 0x14, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x48, 0x00, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x64,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x12,\n\t0x9d, 0x01, 0x0a, 0x23, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c,\n\t0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61,\n\t0x67, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x20, 0x63,\n\t0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12,\n\t0x9d, 0x01, 0x0a, 0x23, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72,\n\t0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c,\n\t0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x65,\n\t0x74, 0x68, 0x65, 0x75, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61,\n\t0x67, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x20, 0x63,\n\t0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65,\n\t0x75, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12,\n\t0x5f, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x71, 0x6c,\n\t0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c,\n\t0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,\n\t0x48, 0x00, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x71, 0x6c,\n\t0x1a, 0x45, 0x0a, 0x07, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x05, 0x63,\n\t0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x05, 0x63, 0x6f,\n\t0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42,\n\t0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, 0xc8, 0x06, 0x0a, 0x0f, 0x4d, 0x65, 0x74, 0x72,\n\t0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x66,\n\t0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02,\n\t0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0c, 0x61, 0x67, 0x67, 0x72,\n\t0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x52, 0x0c, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12,\n\t0x2d, 0x0a, 0x12, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x66,\n\t0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x6e,\n\t0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x5c,\n\t0x0a, 0x18, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67,\n\t0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x52, 0x17, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72,\n\t0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x76, 0x0a, 0x10,\n\t0x66, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c,\n\t0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68,\n\t0x6f, 0x6c, 0x64, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x66, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x12, 0x44, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73,\n\t0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e,\n\t0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a,\n\t0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x68,\n\t0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x01, 0x52, 0x0e, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x56, 0x61,\n\t0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,\n\t0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x07, 0x74, 0x72,\n\t0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43,\n\t0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72,\n\t0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x79, 0x0a, 0x17, 0x65, 0x76, 0x61,\n\t0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f,\n\t0x64, 0x61, 0x74, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x41, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x52, 0x15, 0x65,\n\t0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67,\n\t0x44, 0x61, 0x74, 0x61, 0x1a, 0x5c, 0x0a, 0x0f, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74,\n\t0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x6f, 0x72, 0x65, 0x63,\n\t0x61, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41,\n\t0x02, 0x52, 0x0f, 0x66, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x48, 0x6f, 0x72, 0x69, 0x7a,\n\t0x6f, 0x6e, 0x1a, 0xf9, 0x01, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x41, 0x62, 0x73,\n\t0x65, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65,\n\t0x72, 0x12, 0x45, 0x0a, 0x0c, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41,\n\t0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x67, 0x67, 0x72,\n\t0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,\n\t0x4d, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c,\n\t0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x72,\n\t0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x1a, 0xe1,\n\t0x01, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x1b, 0x0a, 0x06, 0x66,\n\t0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02,\n\t0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x74, 0x0a, 0x10, 0x6c, 0x61, 0x62, 0x65,\n\t0x6c, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x49, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e,\n\t0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x45, 0x78,\n\t0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c,\n\t0x61, 0x62, 0x65, 0x6c, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x42,\n\t0x0a, 0x14, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72,\n\t0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,\n\t0x38, 0x01, 0x1a, 0xb9, 0x02, 0x0a, 0x20, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x43, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x35, 0x0a,\n\t0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65,\n\t0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67,\n\t0x67, 0x65, 0x72, 0x12, 0x79, 0x0a, 0x17, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x5f, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x0e, 0x32, 0x41, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72,\n\t0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x73, 0x73,\n\t0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x52, 0x15, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x85,\n\t0x04, 0x0a, 0x20, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x51, 0x75, 0x65,\n\t0x72, 0x79, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x3a,\n\t0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x01,\n\t0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x13, 0x65, 0x76,\n\t0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61,\n\t0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x12, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x75, 0x0a, 0x06, 0x6c,\n\t0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x58, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43,\n\t0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68,\n\t0x65, 0x75, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65,\n\t0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73,\n\t0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65,\n\t0x6c, 0x73, 0x12, 0x22, 0x0a, 0x0a, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70,\n\t0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x72, 0x75, 0x6c,\n\t0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x22, 0x0a, 0x0a, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f,\n\t0x72, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,\n\t0x09, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x3f, 0x0a, 0x19, 0x64, 0x69,\n\t0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x76, 0x61, 0x6c,\n\t0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0,\n\t0x41, 0x01, 0x52, 0x17, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69,\n\t0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x39, 0x0a, 0x0b, 0x4c,\n\t0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,\n\t0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05,\n\t0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c,\n\t0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xee, 0x07, 0x0a, 0x0c, 0x53, 0x71, 0x6c, 0x43, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x71, 0x75, 0x65,\n\t0x72, 0x79, 0x12, 0x5c, 0x0a, 0x07, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x69,\n\t0x6e, 0x75, 0x74, 0x65, 0x73, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73,\n\t0x12, 0x59, 0x0a, 0x06, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x3f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c,\n\t0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x71,\n\t0x6c, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x48, 0x6f, 0x75, 0x72, 0x6c,\n\t0x79, 0x48, 0x00, 0x52, 0x06, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x12, 0x56, 0x0a, 0x05, 0x64,\n\t0x61, 0x69, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x64, 0x69,\n\t0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x48, 0x00, 0x52, 0x05, 0x64, 0x61,\n\t0x69, 0x6c, 0x79, 0x12, 0x6d, 0x0a, 0x0e, 0x72, 0x6f, 0x77, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74,\n\t0x5f, 0x74, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43,\n\t0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x64,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x6f, 0x77, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x65,\n\t0x73, 0x74, 0x48, 0x01, 0x52, 0x0c, 0x72, 0x6f, 0x77, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x65,\n\t0x73, 0x74, 0x12, 0x69, 0x0a, 0x0c, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x5f, 0x74, 0x65,\n\t0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e,\n\t0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x48, 0x01,\n\t0x52, 0x0b, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x0a,\n\t0x07, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x69,\n\t0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0,\n\t0x41, 0x02, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x1a,\n\t0x70, 0x0a, 0x06, 0x48, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x65, 0x72,\n\t0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03,\n\t0xe0, 0x41, 0x02, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79,\n\t0x12, 0x2d, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65,\n\t0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x00, 0x52, 0x0c,\n\t0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x42,\n\t0x10, 0x0a, 0x0e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65,\n\t0x74, 0x1a, 0x72, 0x0a, 0x05, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x65,\n\t0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42,\n\t0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74,\n\t0x79, 0x12, 0x42, 0x0a, 0x0e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74,\n\t0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x4f, 0x66, 0x44, 0x61,\n\t0x79, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f,\n\t0x6e, 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x7c, 0x0a, 0x0c, 0x52, 0x6f, 0x77, 0x43, 0x6f, 0x75, 0x6e,\n\t0x74, 0x54, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69,\n\t0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33,\n\t0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42,\n\t0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e,\n\t0x12, 0x21, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68,\n\t0x6f, 0x6c, 0x64, 0x1a, 0x2a, 0x0a, 0x0b, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x54, 0x65,\n\t0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x42,\n\t0x0a, 0x0a, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x65,\n\t0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x22, 0xad, 0x01, 0x0a, 0x15, 0x45, 0x76, 0x61, 0x6c,\n\t0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74,\n\t0x61, 0x12, 0x27, 0x0a, 0x23, 0x45, 0x56, 0x41, 0x4c, 0x55, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f,\n\t0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x55, 0x4e, 0x53,\n\t0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x24, 0x0a, 0x20, 0x45, 0x56,\n\t0x41, 0x4c, 0x55, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47,\n\t0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01,\n\t0x12, 0x22, 0x0a, 0x1e, 0x45, 0x56, 0x41, 0x4c, 0x55, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d,\n\t0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x41, 0x43, 0x54, 0x49,\n\t0x56, 0x45, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x45, 0x56, 0x41, 0x4c, 0x55, 0x41, 0x54, 0x49,\n\t0x4f, 0x4e, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f,\n\t0x4e, 0x4f, 0x5f, 0x4f, 0x50, 0x10, 0x03, 0x3a, 0x97, 0x02, 0xea, 0x41, 0x93, 0x02, 0x0a, 0x2e,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46,\n\t0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,\n\t0x74, 0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73,\n\t0x2f, 0x7b, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x7d, 0x2f,\n\t0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x64,\n\t0x69, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x50, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69,\n\t0x65, 0x73, 0x2f, 0x7b, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x44, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72,\n\t0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f,\n\t0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x01,\n\t0x2a, 0x42, 0x0b, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x96,\n\t0x06, 0x0a, 0x0d, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79,\n\t0x12, 0x7d, 0x0a, 0x17, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x45, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f,\n\t0x6c, 0x69, 0x63, 0x79, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65,\n\t0x67, 0x79, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,\n\t0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x15, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69,\n\t0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12,\n\t0x75, 0x0a, 0x14, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,\n\t0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x42, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x4e,\n\t0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6d, 0x70,\n\t0x74, 0x52, 0x13, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50,\n\t0x72, 0x6f, 0x6d, 0x70, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x63,\n\t0x6c, 0x6f, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x43, 0x6c, 0x6f, 0x73, 0x65,\n\t0x12, 0x8f, 0x01, 0x0a, 0x1d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65,\n\t0x67, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e,\n\t0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x41, 0x6c, 0x65, 0x72,\n\t0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69,\n\t0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x72,\n\t0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x1b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65,\n\t0x67, 0x79, 0x1a, 0x4a, 0x0a, 0x15, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x31, 0x0a, 0x06, 0x70,\n\t0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x1a, 0xa3,\n\t0x01, 0x0a, 0x1b, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43,\n\t0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x3c,\n\t0x0a, 0x1a, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63,\n\t0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03,\n\t0x28, 0x09, 0x52, 0x18, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x11,\n\t0x72, 0x65, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61,\n\t0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x10, 0x72, 0x65, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x74, 0x65,\n\t0x72, 0x76, 0x61, 0x6c, 0x22, 0x51, 0x0a, 0x12, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x12, 0x23, 0x0a, 0x1f, 0x4e, 0x4f,\n\t0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x4d, 0x50,\n\t0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,\n\t0x0a, 0x0a, 0x06, 0x4f, 0x50, 0x45, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43,\n\t0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x03, 0x1a, 0x3d, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x4c,\n\t0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,\n\t0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05,\n\t0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c,\n\t0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x61, 0x0a, 0x15, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74,\n\t0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12,\n\t0x17, 0x0a, 0x13, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,\n\t0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x44, 0x10,\n\t0x01, 0x12, 0x06, 0x0a, 0x02, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x4e, 0x44,\n\t0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x49, 0x4e, 0x47, 0x5f, 0x52,\n\t0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x03, 0x22, 0x4a, 0x0a, 0x08, 0x53, 0x65, 0x76,\n\t0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54,\n\t0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,\n\t0x0c, 0x0a, 0x08, 0x43, 0x52, 0x49, 0x54, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x09, 0x0a,\n\t0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e,\n\t0x49, 0x4e, 0x47, 0x10, 0x03, 0x3a, 0xc9, 0x01, 0xea, 0x41, 0xc5, 0x01, 0x0a, 0x25, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,\n\t0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c,\n\t0x69, 0x63, 0x79, 0x12, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70,\n\t0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c,\n\t0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c,\n\t0x69, 0x63, 0x79, 0x7d, 0x12, 0x39, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73,\n\t0x2f, 0x7b, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x7d, 0x12,\n\t0x2d, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72,\n\t0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f,\n\t0x7b, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x7d, 0x12, 0x01,\n\t0x2a, 0x42, 0xc5, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x0a,\n\t0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c,\n\t0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67,\n\t0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69,\n\t0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa,\n\t0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_google_monitoring_v3_alert_proto_rawDescOnce sync.Once\n\tfile_google_monitoring_v3_alert_proto_rawDescData = file_google_monitoring_v3_alert_proto_rawDesc\n)\n\nfunc file_google_monitoring_v3_alert_proto_rawDescGZIP() []byte {\n\tfile_google_monitoring_v3_alert_proto_rawDescOnce.Do(func() {\n\t\tfile_google_monitoring_v3_alert_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_alert_proto_rawDescData)\n\t})\n\treturn file_google_monitoring_v3_alert_proto_rawDescData\n}\n\nvar file_google_monitoring_v3_alert_proto_enumTypes = make([]protoimpl.EnumInfo, 4)\nvar file_google_monitoring_v3_alert_proto_msgTypes = make([]protoimpl.MessageInfo, 23)\nvar file_google_monitoring_v3_alert_proto_goTypes = []any{\n\t(AlertPolicy_ConditionCombinerType)(0),                         // 0: google.monitoring.v3.AlertPolicy.ConditionCombinerType\n\t(AlertPolicy_Severity)(0),                                      // 1: google.monitoring.v3.AlertPolicy.Severity\n\t(AlertPolicy_Condition_EvaluationMissingData)(0),               // 2: google.monitoring.v3.AlertPolicy.Condition.EvaluationMissingData\n\t(AlertPolicy_AlertStrategy_NotificationPrompt)(0),              // 3: google.monitoring.v3.AlertPolicy.AlertStrategy.NotificationPrompt\n\t(*AlertPolicy)(nil),                                            // 4: google.monitoring.v3.AlertPolicy\n\t(*AlertPolicy_Documentation)(nil),                              // 5: google.monitoring.v3.AlertPolicy.Documentation\n\t(*AlertPolicy_Condition)(nil),                                  // 6: google.monitoring.v3.AlertPolicy.Condition\n\t(*AlertPolicy_AlertStrategy)(nil),                              // 7: google.monitoring.v3.AlertPolicy.AlertStrategy\n\tnil,                                                            // 8: google.monitoring.v3.AlertPolicy.UserLabelsEntry\n\t(*AlertPolicy_Documentation_Link)(nil),                         // 9: google.monitoring.v3.AlertPolicy.Documentation.Link\n\t(*AlertPolicy_Condition_Trigger)(nil),                          // 10: google.monitoring.v3.AlertPolicy.Condition.Trigger\n\t(*AlertPolicy_Condition_MetricThreshold)(nil),                  // 11: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold\n\t(*AlertPolicy_Condition_MetricAbsence)(nil),                    // 12: google.monitoring.v3.AlertPolicy.Condition.MetricAbsence\n\t(*AlertPolicy_Condition_LogMatch)(nil),                         // 13: google.monitoring.v3.AlertPolicy.Condition.LogMatch\n\t(*AlertPolicy_Condition_MonitoringQueryLanguageCondition)(nil), // 14: google.monitoring.v3.AlertPolicy.Condition.MonitoringQueryLanguageCondition\n\t(*AlertPolicy_Condition_PrometheusQueryLanguageCondition)(nil), // 15: google.monitoring.v3.AlertPolicy.Condition.PrometheusQueryLanguageCondition\n\t(*AlertPolicy_Condition_SqlCondition)(nil),                     // 16: google.monitoring.v3.AlertPolicy.Condition.SqlCondition\n\t(*AlertPolicy_Condition_MetricThreshold_ForecastOptions)(nil),  // 17: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.ForecastOptions\n\tnil, // 18: google.monitoring.v3.AlertPolicy.Condition.LogMatch.LabelExtractorsEntry\n\tnil, // 19: google.monitoring.v3.AlertPolicy.Condition.PrometheusQueryLanguageCondition.LabelsEntry\n\t(*AlertPolicy_Condition_SqlCondition_Minutes)(nil),            // 20: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.Minutes\n\t(*AlertPolicy_Condition_SqlCondition_Hourly)(nil),             // 21: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.Hourly\n\t(*AlertPolicy_Condition_SqlCondition_Daily)(nil),              // 22: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.Daily\n\t(*AlertPolicy_Condition_SqlCondition_RowCountTest)(nil),       // 23: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.RowCountTest\n\t(*AlertPolicy_Condition_SqlCondition_BooleanTest)(nil),        // 24: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.BooleanTest\n\t(*AlertPolicy_AlertStrategy_NotificationRateLimit)(nil),       // 25: google.monitoring.v3.AlertPolicy.AlertStrategy.NotificationRateLimit\n\t(*AlertPolicy_AlertStrategy_NotificationChannelStrategy)(nil), // 26: google.monitoring.v3.AlertPolicy.AlertStrategy.NotificationChannelStrategy\n\t(*wrapperspb.BoolValue)(nil),                                  // 27: google.protobuf.BoolValue\n\t(*status.Status)(nil),                                         // 28: google.rpc.Status\n\t(*MutationRecord)(nil),                                        // 29: google.monitoring.v3.MutationRecord\n\t(*durationpb.Duration)(nil),                                   // 30: google.protobuf.Duration\n\t(*Aggregation)(nil),                                           // 31: google.monitoring.v3.Aggregation\n\t(ComparisonType)(0),                                           // 32: google.monitoring.v3.ComparisonType\n\t(*timeofday.TimeOfDay)(nil),                                   // 33: google.type.TimeOfDay\n}\nvar file_google_monitoring_v3_alert_proto_depIdxs = []int32{\n\t5,  // 0: google.monitoring.v3.AlertPolicy.documentation:type_name -> google.monitoring.v3.AlertPolicy.Documentation\n\t8,  // 1: google.monitoring.v3.AlertPolicy.user_labels:type_name -> google.monitoring.v3.AlertPolicy.UserLabelsEntry\n\t6,  // 2: google.monitoring.v3.AlertPolicy.conditions:type_name -> google.monitoring.v3.AlertPolicy.Condition\n\t0,  // 3: google.monitoring.v3.AlertPolicy.combiner:type_name -> google.monitoring.v3.AlertPolicy.ConditionCombinerType\n\t27, // 4: google.monitoring.v3.AlertPolicy.enabled:type_name -> google.protobuf.BoolValue\n\t28, // 5: google.monitoring.v3.AlertPolicy.validity:type_name -> google.rpc.Status\n\t29, // 6: google.monitoring.v3.AlertPolicy.creation_record:type_name -> google.monitoring.v3.MutationRecord\n\t29, // 7: google.monitoring.v3.AlertPolicy.mutation_record:type_name -> google.monitoring.v3.MutationRecord\n\t7,  // 8: google.monitoring.v3.AlertPolicy.alert_strategy:type_name -> google.monitoring.v3.AlertPolicy.AlertStrategy\n\t1,  // 9: google.monitoring.v3.AlertPolicy.severity:type_name -> google.monitoring.v3.AlertPolicy.Severity\n\t9,  // 10: google.monitoring.v3.AlertPolicy.Documentation.links:type_name -> google.monitoring.v3.AlertPolicy.Documentation.Link\n\t11, // 11: google.monitoring.v3.AlertPolicy.Condition.condition_threshold:type_name -> google.monitoring.v3.AlertPolicy.Condition.MetricThreshold\n\t12, // 12: google.monitoring.v3.AlertPolicy.Condition.condition_absent:type_name -> google.monitoring.v3.AlertPolicy.Condition.MetricAbsence\n\t13, // 13: google.monitoring.v3.AlertPolicy.Condition.condition_matched_log:type_name -> google.monitoring.v3.AlertPolicy.Condition.LogMatch\n\t14, // 14: google.monitoring.v3.AlertPolicy.Condition.condition_monitoring_query_language:type_name -> google.monitoring.v3.AlertPolicy.Condition.MonitoringQueryLanguageCondition\n\t15, // 15: google.monitoring.v3.AlertPolicy.Condition.condition_prometheus_query_language:type_name -> google.monitoring.v3.AlertPolicy.Condition.PrometheusQueryLanguageCondition\n\t16, // 16: google.monitoring.v3.AlertPolicy.Condition.condition_sql:type_name -> google.monitoring.v3.AlertPolicy.Condition.SqlCondition\n\t25, // 17: google.monitoring.v3.AlertPolicy.AlertStrategy.notification_rate_limit:type_name -> google.monitoring.v3.AlertPolicy.AlertStrategy.NotificationRateLimit\n\t3,  // 18: google.monitoring.v3.AlertPolicy.AlertStrategy.notification_prompts:type_name -> google.monitoring.v3.AlertPolicy.AlertStrategy.NotificationPrompt\n\t30, // 19: google.monitoring.v3.AlertPolicy.AlertStrategy.auto_close:type_name -> google.protobuf.Duration\n\t26, // 20: google.monitoring.v3.AlertPolicy.AlertStrategy.notification_channel_strategy:type_name -> google.monitoring.v3.AlertPolicy.AlertStrategy.NotificationChannelStrategy\n\t31, // 21: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.aggregations:type_name -> google.monitoring.v3.Aggregation\n\t31, // 22: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.denominator_aggregations:type_name -> google.monitoring.v3.Aggregation\n\t17, // 23: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.forecast_options:type_name -> google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.ForecastOptions\n\t32, // 24: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.comparison:type_name -> google.monitoring.v3.ComparisonType\n\t30, // 25: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.duration:type_name -> google.protobuf.Duration\n\t10, // 26: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.trigger:type_name -> google.monitoring.v3.AlertPolicy.Condition.Trigger\n\t2,  // 27: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.evaluation_missing_data:type_name -> google.monitoring.v3.AlertPolicy.Condition.EvaluationMissingData\n\t31, // 28: google.monitoring.v3.AlertPolicy.Condition.MetricAbsence.aggregations:type_name -> google.monitoring.v3.Aggregation\n\t30, // 29: google.monitoring.v3.AlertPolicy.Condition.MetricAbsence.duration:type_name -> google.protobuf.Duration\n\t10, // 30: google.monitoring.v3.AlertPolicy.Condition.MetricAbsence.trigger:type_name -> google.monitoring.v3.AlertPolicy.Condition.Trigger\n\t18, // 31: google.monitoring.v3.AlertPolicy.Condition.LogMatch.label_extractors:type_name -> google.monitoring.v3.AlertPolicy.Condition.LogMatch.LabelExtractorsEntry\n\t30, // 32: google.monitoring.v3.AlertPolicy.Condition.MonitoringQueryLanguageCondition.duration:type_name -> google.protobuf.Duration\n\t10, // 33: google.monitoring.v3.AlertPolicy.Condition.MonitoringQueryLanguageCondition.trigger:type_name -> google.monitoring.v3.AlertPolicy.Condition.Trigger\n\t2,  // 34: google.monitoring.v3.AlertPolicy.Condition.MonitoringQueryLanguageCondition.evaluation_missing_data:type_name -> google.monitoring.v3.AlertPolicy.Condition.EvaluationMissingData\n\t30, // 35: google.monitoring.v3.AlertPolicy.Condition.PrometheusQueryLanguageCondition.duration:type_name -> google.protobuf.Duration\n\t30, // 36: google.monitoring.v3.AlertPolicy.Condition.PrometheusQueryLanguageCondition.evaluation_interval:type_name -> google.protobuf.Duration\n\t19, // 37: google.monitoring.v3.AlertPolicy.Condition.PrometheusQueryLanguageCondition.labels:type_name -> google.monitoring.v3.AlertPolicy.Condition.PrometheusQueryLanguageCondition.LabelsEntry\n\t20, // 38: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.minutes:type_name -> google.monitoring.v3.AlertPolicy.Condition.SqlCondition.Minutes\n\t21, // 39: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.hourly:type_name -> google.monitoring.v3.AlertPolicy.Condition.SqlCondition.Hourly\n\t22, // 40: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.daily:type_name -> google.monitoring.v3.AlertPolicy.Condition.SqlCondition.Daily\n\t23, // 41: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.row_count_test:type_name -> google.monitoring.v3.AlertPolicy.Condition.SqlCondition.RowCountTest\n\t24, // 42: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.boolean_test:type_name -> google.monitoring.v3.AlertPolicy.Condition.SqlCondition.BooleanTest\n\t30, // 43: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.ForecastOptions.forecast_horizon:type_name -> google.protobuf.Duration\n\t33, // 44: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.Daily.execution_time:type_name -> google.type.TimeOfDay\n\t32, // 45: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.RowCountTest.comparison:type_name -> google.monitoring.v3.ComparisonType\n\t30, // 46: google.monitoring.v3.AlertPolicy.AlertStrategy.NotificationRateLimit.period:type_name -> google.protobuf.Duration\n\t30, // 47: google.monitoring.v3.AlertPolicy.AlertStrategy.NotificationChannelStrategy.renotify_interval:type_name -> google.protobuf.Duration\n\t48, // [48:48] is the sub-list for method output_type\n\t48, // [48:48] is the sub-list for method input_type\n\t48, // [48:48] is the sub-list for extension type_name\n\t48, // [48:48] is the sub-list for extension extendee\n\t0,  // [0:48] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_alert_proto_init() }\nfunc file_google_monitoring_v3_alert_proto_init() {\n\tif File_google_monitoring_v3_alert_proto != nil {\n\t\treturn\n\t}\n\tfile_google_monitoring_v3_common_proto_init()\n\tfile_google_monitoring_v3_mutation_record_proto_init()\n\tfile_google_monitoring_v3_alert_proto_msgTypes[2].OneofWrappers = []any{\n\t\t(*AlertPolicy_Condition_ConditionThreshold)(nil),\n\t\t(*AlertPolicy_Condition_ConditionAbsent)(nil),\n\t\t(*AlertPolicy_Condition_ConditionMatchedLog)(nil),\n\t\t(*AlertPolicy_Condition_ConditionMonitoringQueryLanguage)(nil),\n\t\t(*AlertPolicy_Condition_ConditionPrometheusQueryLanguage)(nil),\n\t\t(*AlertPolicy_Condition_ConditionSql)(nil),\n\t}\n\tfile_google_monitoring_v3_alert_proto_msgTypes[6].OneofWrappers = []any{\n\t\t(*AlertPolicy_Condition_Trigger_Count)(nil),\n\t\t(*AlertPolicy_Condition_Trigger_Percent)(nil),\n\t}\n\tfile_google_monitoring_v3_alert_proto_msgTypes[12].OneofWrappers = []any{\n\t\t(*AlertPolicy_Condition_SqlCondition_Minutes_)(nil),\n\t\t(*AlertPolicy_Condition_SqlCondition_Hourly_)(nil),\n\t\t(*AlertPolicy_Condition_SqlCondition_Daily_)(nil),\n\t\t(*AlertPolicy_Condition_SqlCondition_RowCountTest_)(nil),\n\t\t(*AlertPolicy_Condition_SqlCondition_BooleanTest_)(nil),\n\t}\n\tfile_google_monitoring_v3_alert_proto_msgTypes[17].OneofWrappers = []any{}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_alert_proto_rawDesc,\n\t\t\tNumEnums:      4,\n\t\t\tNumMessages:   23,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_alert_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_alert_proto_depIdxs,\n\t\tEnumInfos:         file_google_monitoring_v3_alert_proto_enumTypes,\n\t\tMessageInfos:      file_google_monitoring_v3_alert_proto_msgTypes,\n\t}.Build()\n\tFile_google_monitoring_v3_alert_proto = out.File\n\tfile_google_monitoring_v3_alert_proto_rawDesc = nil\n\tfile_google_monitoring_v3_alert_proto_goTypes = nil\n\tfile_google_monitoring_v3_alert_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/alert_service.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/alert_service.proto\n\npackage monitoringpb\n\nimport (\n\tcontext \"context\"\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n\tfieldmaskpb \"google.golang.org/protobuf/types/known/fieldmaskpb\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// The protocol for the `CreateAlertPolicy` request.\ntype CreateAlertPolicyRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The\n\t// [project](https://cloud.google.com/monitoring/api/v3#project_name) in which\n\t// to create the alerting policy. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\t//\n\t// Note that this field names the parent container in which the alerting\n\t// policy will be written, not the name of the created policy. |name| must be\n\t// a host project of a Metrics Scope, otherwise INVALID_ARGUMENT error will\n\t// return. The alerting policy that is returned will have a name that contains\n\t// a normalized representation of this name as a prefix but adds a suffix of\n\t// the form `/alertPolicies/[ALERT_POLICY_ID]`, identifying the policy in the\n\t// container.\n\tName string `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// Required. The requested alerting policy. You should omit the `name` field\n\t// in this policy. The name will be returned in the new policy, including a\n\t// new `[ALERT_POLICY_ID]` value.\n\tAlertPolicy *AlertPolicy `protobuf:\"bytes,2,opt,name=alert_policy,json=alertPolicy,proto3\" json:\"alert_policy,omitempty\"`\n}\n\nfunc (x *CreateAlertPolicyRequest) Reset() {\n\t*x = CreateAlertPolicyRequest{}\n\tmi := &file_google_monitoring_v3_alert_service_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *CreateAlertPolicyRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateAlertPolicyRequest) ProtoMessage() {}\n\nfunc (x *CreateAlertPolicyRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_service_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateAlertPolicyRequest.ProtoReflect.Descriptor instead.\nfunc (*CreateAlertPolicyRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_service_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CreateAlertPolicyRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateAlertPolicyRequest) GetAlertPolicy() *AlertPolicy {\n\tif x != nil {\n\t\treturn x.AlertPolicy\n\t}\n\treturn nil\n}\n\n// The protocol for the `GetAlertPolicy` request.\ntype GetAlertPolicyRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The alerting policy to retrieve. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/alertPolicies/[ALERT_POLICY_ID]\n\tName string `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *GetAlertPolicyRequest) Reset() {\n\t*x = GetAlertPolicyRequest{}\n\tmi := &file_google_monitoring_v3_alert_service_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *GetAlertPolicyRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetAlertPolicyRequest) ProtoMessage() {}\n\nfunc (x *GetAlertPolicyRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_service_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetAlertPolicyRequest.ProtoReflect.Descriptor instead.\nfunc (*GetAlertPolicyRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_service_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetAlertPolicyRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\n// The protocol for the `ListAlertPolicies` request.\ntype ListAlertPoliciesRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The\n\t// [project](https://cloud.google.com/monitoring/api/v3#project_name) whose\n\t// alert policies are to be listed. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\t//\n\t// Note that this field names the parent container in which the alerting\n\t// policies to be listed are stored. To retrieve a single alerting policy\n\t// by name, use the\n\t// [GetAlertPolicy][google.monitoring.v3.AlertPolicyService.GetAlertPolicy]\n\t// operation, instead.\n\tName string `protobuf:\"bytes,4,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// Optional. If provided, this field specifies the criteria that must be met\n\t// by alert policies to be included in the response.\n\t//\n\t// For more details, see [sorting and\n\t// filtering](https://cloud.google.com/monitoring/api/v3/sorting-and-filtering).\n\tFilter string `protobuf:\"bytes,5,opt,name=filter,proto3\" json:\"filter,omitempty\"`\n\t// Optional. A comma-separated list of fields by which to sort the result.\n\t// Supports the same set of field references as the `filter` field. Entries\n\t// can be prefixed with a minus sign to sort by the field in descending order.\n\t//\n\t// For more details, see [sorting and\n\t// filtering](https://cloud.google.com/monitoring/api/v3/sorting-and-filtering).\n\tOrderBy string `protobuf:\"bytes,6,opt,name=order_by,json=orderBy,proto3\" json:\"order_by,omitempty\"`\n\t// Optional. The maximum number of results to return in a single response.\n\tPageSize int32 `protobuf:\"varint,2,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\t// Optional. If this field is not empty then it must contain the\n\t// `nextPageToken` value returned by a previous call to this method.  Using\n\t// this field causes the method to return more results from the previous\n\t// method call.\n\tPageToken string `protobuf:\"bytes,3,opt,name=page_token,json=pageToken,proto3\" json:\"page_token,omitempty\"`\n}\n\nfunc (x *ListAlertPoliciesRequest) Reset() {\n\t*x = ListAlertPoliciesRequest{}\n\tmi := &file_google_monitoring_v3_alert_service_proto_msgTypes[2]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListAlertPoliciesRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListAlertPoliciesRequest) ProtoMessage() {}\n\nfunc (x *ListAlertPoliciesRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_service_proto_msgTypes[2]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListAlertPoliciesRequest.ProtoReflect.Descriptor instead.\nfunc (*ListAlertPoliciesRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_service_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListAlertPoliciesRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListAlertPoliciesRequest) GetFilter() string {\n\tif x != nil {\n\t\treturn x.Filter\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListAlertPoliciesRequest) GetOrderBy() string {\n\tif x != nil {\n\t\treturn x.OrderBy\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListAlertPoliciesRequest) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListAlertPoliciesRequest) GetPageToken() string {\n\tif x != nil {\n\t\treturn x.PageToken\n\t}\n\treturn \"\"\n}\n\n// The protocol for the `ListAlertPolicies` response.\ntype ListAlertPoliciesResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The returned alert policies.\n\tAlertPolicies []*AlertPolicy `protobuf:\"bytes,3,rep,name=alert_policies,json=alertPolicies,proto3\" json:\"alert_policies,omitempty\"`\n\t// If there might be more results than were returned, then this field is set\n\t// to a non-empty value. To see the additional results,\n\t// use that value as `page_token` in the next call to this method.\n\tNextPageToken string `protobuf:\"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3\" json:\"next_page_token,omitempty\"`\n\t// The total number of alert policies in all pages. This number is only an\n\t// estimate, and may change in subsequent pages. https://aip.dev/158\n\tTotalSize int32 `protobuf:\"varint,4,opt,name=total_size,json=totalSize,proto3\" json:\"total_size,omitempty\"`\n}\n\nfunc (x *ListAlertPoliciesResponse) Reset() {\n\t*x = ListAlertPoliciesResponse{}\n\tmi := &file_google_monitoring_v3_alert_service_proto_msgTypes[3]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListAlertPoliciesResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListAlertPoliciesResponse) ProtoMessage() {}\n\nfunc (x *ListAlertPoliciesResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_service_proto_msgTypes[3]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListAlertPoliciesResponse.ProtoReflect.Descriptor instead.\nfunc (*ListAlertPoliciesResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_service_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *ListAlertPoliciesResponse) GetAlertPolicies() []*AlertPolicy {\n\tif x != nil {\n\t\treturn x.AlertPolicies\n\t}\n\treturn nil\n}\n\nfunc (x *ListAlertPoliciesResponse) GetNextPageToken() string {\n\tif x != nil {\n\t\treturn x.NextPageToken\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListAlertPoliciesResponse) GetTotalSize() int32 {\n\tif x != nil {\n\t\treturn x.TotalSize\n\t}\n\treturn 0\n}\n\n// The protocol for the `UpdateAlertPolicy` request.\ntype UpdateAlertPolicyRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Optional. A list of alerting policy field names. If this field is not\n\t// empty, each listed field in the existing alerting policy is set to the\n\t// value of the corresponding field in the supplied policy (`alert_policy`),\n\t// or to the field's default value if the field is not in the supplied\n\t// alerting policy.  Fields not listed retain their previous value.\n\t//\n\t// Examples of valid field masks include `display_name`, `documentation`,\n\t// `documentation.content`, `documentation.mime_type`, `user_labels`,\n\t// `user_label.nameofkey`, `enabled`, `conditions`, `combiner`, etc.\n\t//\n\t// If this field is empty, then the supplied alerting policy replaces the\n\t// existing policy. It is the same as deleting the existing policy and\n\t// adding the supplied policy, except for the following:\n\t//\n\t//   - The new policy will have the same `[ALERT_POLICY_ID]` as the former\n\t//     policy. This gives you continuity with the former policy in your\n\t//     notifications and incidents.\n\t//   - Conditions in the new policy will keep their former `[CONDITION_ID]` if\n\t//     the supplied condition includes the `name` field with that\n\t//     `[CONDITION_ID]`. If the supplied condition omits the `name` field,\n\t//     then a new `[CONDITION_ID]` is created.\n\tUpdateMask *fieldmaskpb.FieldMask `protobuf:\"bytes,2,opt,name=update_mask,json=updateMask,proto3\" json:\"update_mask,omitempty\"`\n\t// Required. The updated alerting policy or the updated values for the\n\t// fields listed in `update_mask`.\n\t// If `update_mask` is not empty, any fields in this policy that are\n\t// not in `update_mask` are ignored.\n\tAlertPolicy *AlertPolicy `protobuf:\"bytes,3,opt,name=alert_policy,json=alertPolicy,proto3\" json:\"alert_policy,omitempty\"`\n}\n\nfunc (x *UpdateAlertPolicyRequest) Reset() {\n\t*x = UpdateAlertPolicyRequest{}\n\tmi := &file_google_monitoring_v3_alert_service_proto_msgTypes[4]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UpdateAlertPolicyRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateAlertPolicyRequest) ProtoMessage() {}\n\nfunc (x *UpdateAlertPolicyRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_service_proto_msgTypes[4]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateAlertPolicyRequest.ProtoReflect.Descriptor instead.\nfunc (*UpdateAlertPolicyRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_service_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *UpdateAlertPolicyRequest) GetUpdateMask() *fieldmaskpb.FieldMask {\n\tif x != nil {\n\t\treturn x.UpdateMask\n\t}\n\treturn nil\n}\n\nfunc (x *UpdateAlertPolicyRequest) GetAlertPolicy() *AlertPolicy {\n\tif x != nil {\n\t\treturn x.AlertPolicy\n\t}\n\treturn nil\n}\n\n// The protocol for the `DeleteAlertPolicy` request.\ntype DeleteAlertPolicyRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The alerting policy to delete. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/alertPolicies/[ALERT_POLICY_ID]\n\t//\n\t// For more information, see [AlertPolicy][google.monitoring.v3.AlertPolicy].\n\tName string `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *DeleteAlertPolicyRequest) Reset() {\n\t*x = DeleteAlertPolicyRequest{}\n\tmi := &file_google_monitoring_v3_alert_service_proto_msgTypes[5]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *DeleteAlertPolicyRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DeleteAlertPolicyRequest) ProtoMessage() {}\n\nfunc (x *DeleteAlertPolicyRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_alert_service_proto_msgTypes[5]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DeleteAlertPolicyRequest.ProtoReflect.Descriptor instead.\nfunc (*DeleteAlertPolicyRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_alert_service_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *DeleteAlertPolicyRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nvar File_google_monitoring_v3_alert_service_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_alert_service_proto_rawDesc = []byte{\n\t0x0a, 0x28, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x73, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33,\n\t0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e,\n\t0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e,\n\t0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,\n\t0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69,\n\t0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa8, 0x01, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41,\n\t0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x2d, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x27, 0x12, 0x25, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f,\n\t0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x03, 0xe0,\n\t0x41, 0x02, 0x52, 0x0b, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22,\n\t0x5a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63,\n\t0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2d, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x27, 0x0a, 0x25,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xe0, 0x01, 0x0a, 0x18,\n\t0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65,\n\t0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2d, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x27, 0x12, 0x25,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x66,\n\t0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01,\n\t0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65,\n\t0x72, 0x5f, 0x62, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,\n\t0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65,\n\t0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01,\n\t0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61,\n\t0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,\n\t0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xac,\n\t0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69,\n\t0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0e,\n\t0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x03,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72,\n\t0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0d, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f,\n\t0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70,\n\t0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d,\n\t0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xa7, 0x01,\n\t0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c,\n\t0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70,\n\t0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x01,\n\t0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x49, 0x0a, 0x0c,\n\t0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50,\n\t0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x61, 0x6c, 0x65, 0x72,\n\t0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x5d, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74,\n\t0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x2d, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x27, 0x0a, 0x25, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x9e, 0x08, 0x0a, 0x12, 0x41, 0x6c, 0x65, 0x72, 0x74,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xa8, 0x01,\n\t0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63,\n\t0x69, 0x65, 0x73, 0x12, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41,\n\t0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41,\n\t0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4,\n\t0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70,\n\t0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74,\n\t0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2b, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63,\n\t0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e,\n\t0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x34, 0xda, 0x41, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x12, 0x25, 0x2f, 0x76, 0x33, 0x2f,\n\t0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a,\n\t0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x2a,\n\t0x7d, 0x12, 0xb5, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72,\n\t0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43,\n\t0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41,\n\t0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x4d, 0xda, 0x41, 0x11, 0x6e,\n\t0x61, 0x6d, 0x65, 0x2c, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x3a, 0x0c, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f,\n\t0x6c, 0x69, 0x63, 0x79, 0x22, 0x23, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d,\n\t0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72,\n\t0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x11, 0x44, 0x65,\n\t0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12,\n\t0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x65,\n\t0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,\n\t0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x34, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x2a, 0x25, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d,\n\t0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x61, 0x6c, 0x65,\n\t0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xcb, 0x01,\n\t0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c,\n\t0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74,\n\t0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x63, 0xda, 0x41, 0x18, 0x75, 0x70, 0x64, 0x61, 0x74,\n\t0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2c, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c,\n\t0x69, 0x63, 0x79, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x42, 0x3a, 0x0c, 0x61, 0x6c, 0x65, 0x72, 0x74,\n\t0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x32, 0x32, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x61, 0x6c,\n\t0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d,\n\t0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x1a, 0xa9, 0x01, 0xca, 0x41,\n\t0x19, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x89, 0x01, 0x68, 0x74,\n\t0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c,\n\t0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74,\n\t0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,\n\t0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f,\n\t0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x42, 0xcc, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x76, 0x33, 0x42, 0x11, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69,\n\t0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f,\n\t0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a,\n\t0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_monitoring_v3_alert_service_proto_rawDescOnce sync.Once\n\tfile_google_monitoring_v3_alert_service_proto_rawDescData = file_google_monitoring_v3_alert_service_proto_rawDesc\n)\n\nfunc file_google_monitoring_v3_alert_service_proto_rawDescGZIP() []byte {\n\tfile_google_monitoring_v3_alert_service_proto_rawDescOnce.Do(func() {\n\t\tfile_google_monitoring_v3_alert_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_alert_service_proto_rawDescData)\n\t})\n\treturn file_google_monitoring_v3_alert_service_proto_rawDescData\n}\n\nvar file_google_monitoring_v3_alert_service_proto_msgTypes = make([]protoimpl.MessageInfo, 6)\nvar file_google_monitoring_v3_alert_service_proto_goTypes = []any{\n\t(*CreateAlertPolicyRequest)(nil),  // 0: google.monitoring.v3.CreateAlertPolicyRequest\n\t(*GetAlertPolicyRequest)(nil),     // 1: google.monitoring.v3.GetAlertPolicyRequest\n\t(*ListAlertPoliciesRequest)(nil),  // 2: google.monitoring.v3.ListAlertPoliciesRequest\n\t(*ListAlertPoliciesResponse)(nil), // 3: google.monitoring.v3.ListAlertPoliciesResponse\n\t(*UpdateAlertPolicyRequest)(nil),  // 4: google.monitoring.v3.UpdateAlertPolicyRequest\n\t(*DeleteAlertPolicyRequest)(nil),  // 5: google.monitoring.v3.DeleteAlertPolicyRequest\n\t(*AlertPolicy)(nil),               // 6: google.monitoring.v3.AlertPolicy\n\t(*fieldmaskpb.FieldMask)(nil),     // 7: google.protobuf.FieldMask\n\t(*emptypb.Empty)(nil),             // 8: google.protobuf.Empty\n}\nvar file_google_monitoring_v3_alert_service_proto_depIdxs = []int32{\n\t6, // 0: google.monitoring.v3.CreateAlertPolicyRequest.alert_policy:type_name -> google.monitoring.v3.AlertPolicy\n\t6, // 1: google.monitoring.v3.ListAlertPoliciesResponse.alert_policies:type_name -> google.monitoring.v3.AlertPolicy\n\t7, // 2: google.monitoring.v3.UpdateAlertPolicyRequest.update_mask:type_name -> google.protobuf.FieldMask\n\t6, // 3: google.monitoring.v3.UpdateAlertPolicyRequest.alert_policy:type_name -> google.monitoring.v3.AlertPolicy\n\t2, // 4: google.monitoring.v3.AlertPolicyService.ListAlertPolicies:input_type -> google.monitoring.v3.ListAlertPoliciesRequest\n\t1, // 5: google.monitoring.v3.AlertPolicyService.GetAlertPolicy:input_type -> google.monitoring.v3.GetAlertPolicyRequest\n\t0, // 6: google.monitoring.v3.AlertPolicyService.CreateAlertPolicy:input_type -> google.monitoring.v3.CreateAlertPolicyRequest\n\t5, // 7: google.monitoring.v3.AlertPolicyService.DeleteAlertPolicy:input_type -> google.monitoring.v3.DeleteAlertPolicyRequest\n\t4, // 8: google.monitoring.v3.AlertPolicyService.UpdateAlertPolicy:input_type -> google.monitoring.v3.UpdateAlertPolicyRequest\n\t3, // 9: google.monitoring.v3.AlertPolicyService.ListAlertPolicies:output_type -> google.monitoring.v3.ListAlertPoliciesResponse\n\t6, // 10: google.monitoring.v3.AlertPolicyService.GetAlertPolicy:output_type -> google.monitoring.v3.AlertPolicy\n\t6, // 11: google.monitoring.v3.AlertPolicyService.CreateAlertPolicy:output_type -> google.monitoring.v3.AlertPolicy\n\t8, // 12: google.monitoring.v3.AlertPolicyService.DeleteAlertPolicy:output_type -> google.protobuf.Empty\n\t6, // 13: google.monitoring.v3.AlertPolicyService.UpdateAlertPolicy:output_type -> google.monitoring.v3.AlertPolicy\n\t9, // [9:14] is the sub-list for method output_type\n\t4, // [4:9] is the sub-list for method input_type\n\t4, // [4:4] is the sub-list for extension type_name\n\t4, // [4:4] is the sub-list for extension extendee\n\t0, // [0:4] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_alert_service_proto_init() }\nfunc file_google_monitoring_v3_alert_service_proto_init() {\n\tif File_google_monitoring_v3_alert_service_proto != nil {\n\t\treturn\n\t}\n\tfile_google_monitoring_v3_alert_proto_init()\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_alert_service_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   6,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_alert_service_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_alert_service_proto_depIdxs,\n\t\tMessageInfos:      file_google_monitoring_v3_alert_service_proto_msgTypes,\n\t}.Build()\n\tFile_google_monitoring_v3_alert_service_proto = out.File\n\tfile_google_monitoring_v3_alert_service_proto_rawDesc = nil\n\tfile_google_monitoring_v3_alert_service_proto_goTypes = nil\n\tfile_google_monitoring_v3_alert_service_proto_depIdxs = nil\n}\n\n// Reference imports to suppress errors if they are not otherwise used.\nvar _ context.Context\nvar _ grpc.ClientConnInterface\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\nconst _ = grpc.SupportPackageIsVersion6\n\n// AlertPolicyServiceClient is the client API for AlertPolicyService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.\ntype AlertPolicyServiceClient interface {\n\t// Lists the existing alerting policies for the workspace.\n\tListAlertPolicies(ctx context.Context, in *ListAlertPoliciesRequest, opts ...grpc.CallOption) (*ListAlertPoliciesResponse, error)\n\t// Gets a single alerting policy.\n\tGetAlertPolicy(ctx context.Context, in *GetAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error)\n\t// Creates a new alerting policy.\n\t//\n\t// Design your application to single-thread API calls that modify the state of\n\t// alerting policies in a single project. This includes calls to\n\t// CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy.\n\tCreateAlertPolicy(ctx context.Context, in *CreateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error)\n\t// Deletes an alerting policy.\n\t//\n\t// Design your application to single-thread API calls that modify the state of\n\t// alerting policies in a single project. This includes calls to\n\t// CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy.\n\tDeleteAlertPolicy(ctx context.Context, in *DeleteAlertPolicyRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\t// Updates an alerting policy. You can either replace the entire policy with\n\t// a new one or replace only certain fields in the current alerting policy by\n\t// specifying the fields to be updated via `updateMask`. Returns the\n\t// updated alerting policy.\n\t//\n\t// Design your application to single-thread API calls that modify the state of\n\t// alerting policies in a single project. This includes calls to\n\t// CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy.\n\tUpdateAlertPolicy(ctx context.Context, in *UpdateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error)\n}\n\ntype alertPolicyServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewAlertPolicyServiceClient(cc grpc.ClientConnInterface) AlertPolicyServiceClient {\n\treturn &alertPolicyServiceClient{cc}\n}\n\nfunc (c *alertPolicyServiceClient) ListAlertPolicies(ctx context.Context, in *ListAlertPoliciesRequest, opts ...grpc.CallOption) (*ListAlertPoliciesResponse, error) {\n\tout := new(ListAlertPoliciesResponse)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.AlertPolicyService/ListAlertPolicies\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *alertPolicyServiceClient) GetAlertPolicy(ctx context.Context, in *GetAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) {\n\tout := new(AlertPolicy)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.AlertPolicyService/GetAlertPolicy\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *alertPolicyServiceClient) CreateAlertPolicy(ctx context.Context, in *CreateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) {\n\tout := new(AlertPolicy)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.AlertPolicyService/CreateAlertPolicy\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *alertPolicyServiceClient) DeleteAlertPolicy(ctx context.Context, in *DeleteAlertPolicyRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.AlertPolicyService/DeleteAlertPolicy\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *alertPolicyServiceClient) UpdateAlertPolicy(ctx context.Context, in *UpdateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) {\n\tout := new(AlertPolicy)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.AlertPolicyService/UpdateAlertPolicy\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// AlertPolicyServiceServer is the server API for AlertPolicyService service.\ntype AlertPolicyServiceServer interface {\n\t// Lists the existing alerting policies for the workspace.\n\tListAlertPolicies(context.Context, *ListAlertPoliciesRequest) (*ListAlertPoliciesResponse, error)\n\t// Gets a single alerting policy.\n\tGetAlertPolicy(context.Context, *GetAlertPolicyRequest) (*AlertPolicy, error)\n\t// Creates a new alerting policy.\n\t//\n\t// Design your application to single-thread API calls that modify the state of\n\t// alerting policies in a single project. This includes calls to\n\t// CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy.\n\tCreateAlertPolicy(context.Context, *CreateAlertPolicyRequest) (*AlertPolicy, error)\n\t// Deletes an alerting policy.\n\t//\n\t// Design your application to single-thread API calls that modify the state of\n\t// alerting policies in a single project. This includes calls to\n\t// CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy.\n\tDeleteAlertPolicy(context.Context, *DeleteAlertPolicyRequest) (*emptypb.Empty, error)\n\t// Updates an alerting policy. You can either replace the entire policy with\n\t// a new one or replace only certain fields in the current alerting policy by\n\t// specifying the fields to be updated via `updateMask`. Returns the\n\t// updated alerting policy.\n\t//\n\t// Design your application to single-thread API calls that modify the state of\n\t// alerting policies in a single project. This includes calls to\n\t// CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy.\n\tUpdateAlertPolicy(context.Context, *UpdateAlertPolicyRequest) (*AlertPolicy, error)\n}\n\n// UnimplementedAlertPolicyServiceServer can be embedded to have forward compatible implementations.\ntype UnimplementedAlertPolicyServiceServer struct {\n}\n\nfunc (*UnimplementedAlertPolicyServiceServer) ListAlertPolicies(context.Context, *ListAlertPoliciesRequest) (*ListAlertPoliciesResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListAlertPolicies not implemented\")\n}\nfunc (*UnimplementedAlertPolicyServiceServer) GetAlertPolicy(context.Context, *GetAlertPolicyRequest) (*AlertPolicy, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetAlertPolicy not implemented\")\n}\nfunc (*UnimplementedAlertPolicyServiceServer) CreateAlertPolicy(context.Context, *CreateAlertPolicyRequest) (*AlertPolicy, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateAlertPolicy not implemented\")\n}\nfunc (*UnimplementedAlertPolicyServiceServer) DeleteAlertPolicy(context.Context, *DeleteAlertPolicyRequest) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeleteAlertPolicy not implemented\")\n}\nfunc (*UnimplementedAlertPolicyServiceServer) UpdateAlertPolicy(context.Context, *UpdateAlertPolicyRequest) (*AlertPolicy, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateAlertPolicy not implemented\")\n}\n\nfunc RegisterAlertPolicyServiceServer(s *grpc.Server, srv AlertPolicyServiceServer) {\n\ts.RegisterService(&_AlertPolicyService_serviceDesc, srv)\n}\n\nfunc _AlertPolicyService_ListAlertPolicies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListAlertPoliciesRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(AlertPolicyServiceServer).ListAlertPolicies(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.AlertPolicyService/ListAlertPolicies\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(AlertPolicyServiceServer).ListAlertPolicies(ctx, req.(*ListAlertPoliciesRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _AlertPolicyService_GetAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetAlertPolicyRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(AlertPolicyServiceServer).GetAlertPolicy(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.AlertPolicyService/GetAlertPolicy\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(AlertPolicyServiceServer).GetAlertPolicy(ctx, req.(*GetAlertPolicyRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _AlertPolicyService_CreateAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateAlertPolicyRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(AlertPolicyServiceServer).CreateAlertPolicy(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.AlertPolicyService/CreateAlertPolicy\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(AlertPolicyServiceServer).CreateAlertPolicy(ctx, req.(*CreateAlertPolicyRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _AlertPolicyService_DeleteAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(DeleteAlertPolicyRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(AlertPolicyServiceServer).DeleteAlertPolicy(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.AlertPolicyService/DeleteAlertPolicy\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(AlertPolicyServiceServer).DeleteAlertPolicy(ctx, req.(*DeleteAlertPolicyRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _AlertPolicyService_UpdateAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateAlertPolicyRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(AlertPolicyServiceServer).UpdateAlertPolicy(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.AlertPolicyService/UpdateAlertPolicy\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(AlertPolicyServiceServer).UpdateAlertPolicy(ctx, req.(*UpdateAlertPolicyRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nvar _AlertPolicyService_serviceDesc = grpc.ServiceDesc{\n\tServiceName: \"google.monitoring.v3.AlertPolicyService\",\n\tHandlerType: (*AlertPolicyServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"ListAlertPolicies\",\n\t\t\tHandler:    _AlertPolicyService_ListAlertPolicies_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetAlertPolicy\",\n\t\t\tHandler:    _AlertPolicyService_GetAlertPolicy_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateAlertPolicy\",\n\t\t\tHandler:    _AlertPolicyService_CreateAlertPolicy_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteAlertPolicy\",\n\t\t\tHandler:    _AlertPolicyService_DeleteAlertPolicy_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateAlertPolicy\",\n\t\t\tHandler:    _AlertPolicyService_UpdateAlertPolicy_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"google/monitoring/v3/alert_service.proto\",\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/common.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/common.proto\n\npackage monitoringpb\n\nimport (\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\tdistribution \"google.golang.org/genproto/googleapis/api/distribution\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdurationpb \"google.golang.org/protobuf/types/known/durationpb\"\n\ttimestamppb \"google.golang.org/protobuf/types/known/timestamppb\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// Specifies an ordering relationship on two arguments, called `left` and\n// `right`.\ntype ComparisonType int32\n\nconst (\n\t// No ordering relationship is specified.\n\tComparisonType_COMPARISON_UNSPECIFIED ComparisonType = 0\n\t// True if the left argument is greater than the right argument.\n\tComparisonType_COMPARISON_GT ComparisonType = 1\n\t// True if the left argument is greater than or equal to the right argument.\n\tComparisonType_COMPARISON_GE ComparisonType = 2\n\t// True if the left argument is less than the right argument.\n\tComparisonType_COMPARISON_LT ComparisonType = 3\n\t// True if the left argument is less than or equal to the right argument.\n\tComparisonType_COMPARISON_LE ComparisonType = 4\n\t// True if the left argument is equal to the right argument.\n\tComparisonType_COMPARISON_EQ ComparisonType = 5\n\t// True if the left argument is not equal to the right argument.\n\tComparisonType_COMPARISON_NE ComparisonType = 6\n)\n\n// Enum value maps for ComparisonType.\nvar (\n\tComparisonType_name = map[int32]string{\n\t\t0: \"COMPARISON_UNSPECIFIED\",\n\t\t1: \"COMPARISON_GT\",\n\t\t2: \"COMPARISON_GE\",\n\t\t3: \"COMPARISON_LT\",\n\t\t4: \"COMPARISON_LE\",\n\t\t5: \"COMPARISON_EQ\",\n\t\t6: \"COMPARISON_NE\",\n\t}\n\tComparisonType_value = map[string]int32{\n\t\t\"COMPARISON_UNSPECIFIED\": 0,\n\t\t\"COMPARISON_GT\":          1,\n\t\t\"COMPARISON_GE\":          2,\n\t\t\"COMPARISON_LT\":          3,\n\t\t\"COMPARISON_LE\":          4,\n\t\t\"COMPARISON_EQ\":          5,\n\t\t\"COMPARISON_NE\":          6,\n\t}\n)\n\nfunc (x ComparisonType) Enum() *ComparisonType {\n\tp := new(ComparisonType)\n\t*p = x\n\treturn p\n}\n\nfunc (x ComparisonType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ComparisonType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_common_proto_enumTypes[0].Descriptor()\n}\n\nfunc (ComparisonType) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_common_proto_enumTypes[0]\n}\n\nfunc (x ComparisonType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ComparisonType.Descriptor instead.\nfunc (ComparisonType) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{0}\n}\n\n// The tier of service for a Metrics Scope. Please see the\n// [service tiers\n// documentation](https://cloud.google.com/monitoring/workspaces/tiers) for more\n// details.\n//\n// Deprecated: Marked as deprecated in google/monitoring/v3/common.proto.\ntype ServiceTier int32\n\nconst (\n\t// An invalid sentinel value, used to indicate that a tier has not\n\t// been provided explicitly.\n\tServiceTier_SERVICE_TIER_UNSPECIFIED ServiceTier = 0\n\t// The Cloud Monitoring Basic tier, a free tier of service that provides basic\n\t// features, a moderate allotment of logs, and access to built-in metrics.\n\t// A number of features are not available in this tier. For more details,\n\t// see [the service tiers\n\t// documentation](https://cloud.google.com/monitoring/workspaces/tiers).\n\tServiceTier_SERVICE_TIER_BASIC ServiceTier = 1\n\t// The Cloud Monitoring Premium tier, a higher, more expensive tier of service\n\t// that provides access to all Cloud Monitoring features, lets you use Cloud\n\t// Monitoring with AWS accounts, and has a larger allotments for logs and\n\t// metrics. For more details, see [the service tiers\n\t// documentation](https://cloud.google.com/monitoring/workspaces/tiers).\n\tServiceTier_SERVICE_TIER_PREMIUM ServiceTier = 2\n)\n\n// Enum value maps for ServiceTier.\nvar (\n\tServiceTier_name = map[int32]string{\n\t\t0: \"SERVICE_TIER_UNSPECIFIED\",\n\t\t1: \"SERVICE_TIER_BASIC\",\n\t\t2: \"SERVICE_TIER_PREMIUM\",\n\t}\n\tServiceTier_value = map[string]int32{\n\t\t\"SERVICE_TIER_UNSPECIFIED\": 0,\n\t\t\"SERVICE_TIER_BASIC\":       1,\n\t\t\"SERVICE_TIER_PREMIUM\":     2,\n\t}\n)\n\nfunc (x ServiceTier) Enum() *ServiceTier {\n\tp := new(ServiceTier)\n\t*p = x\n\treturn p\n}\n\nfunc (x ServiceTier) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ServiceTier) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_common_proto_enumTypes[1].Descriptor()\n}\n\nfunc (ServiceTier) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_common_proto_enumTypes[1]\n}\n\nfunc (x ServiceTier) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ServiceTier.Descriptor instead.\nfunc (ServiceTier) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{1}\n}\n\n// The `Aligner` specifies the operation that will be applied to the data\n// points in each alignment period in a time series. Except for\n// `ALIGN_NONE`, which specifies that no operation be applied, each alignment\n// operation replaces the set of data values in each alignment period with\n// a single value: the result of applying the operation to the data values.\n// An aligned time series has a single data value at the end of each\n// `alignment_period`.\n//\n// An alignment operation can change the data type of the values, too. For\n// example, if you apply a counting operation to boolean values, the data\n// `value_type` in the original time series is `BOOLEAN`, but the `value_type`\n// in the aligned result is `INT64`.\ntype Aggregation_Aligner int32\n\nconst (\n\t// No alignment. Raw data is returned. Not valid if cross-series reduction\n\t// is requested. The `value_type` of the result is the same as the\n\t// `value_type` of the input.\n\tAggregation_ALIGN_NONE Aggregation_Aligner = 0\n\t// Align and convert to\n\t// [DELTA][google.api.MetricDescriptor.MetricKind.DELTA].\n\t// The output is `delta = y1 - y0`.\n\t//\n\t// This alignment is valid for\n\t// [CUMULATIVE][google.api.MetricDescriptor.MetricKind.CUMULATIVE] and\n\t// `DELTA` metrics. If the selected alignment period results in periods\n\t// with no data, then the aligned value for such a period is created by\n\t// interpolation. The `value_type`  of the aligned result is the same as\n\t// the `value_type` of the input.\n\tAggregation_ALIGN_DELTA Aggregation_Aligner = 1\n\t// Align and convert to a rate. The result is computed as\n\t// `rate = (y1 - y0)/(t1 - t0)`, or \"delta over time\".\n\t// Think of this aligner as providing the slope of the line that passes\n\t// through the value at the start and at the end of the `alignment_period`.\n\t//\n\t// This aligner is valid for `CUMULATIVE`\n\t// and `DELTA` metrics with numeric values. If the selected alignment\n\t// period results in periods with no data, then the aligned value for\n\t// such a period is created by interpolation. The output is a `GAUGE`\n\t// metric with `value_type` `DOUBLE`.\n\t//\n\t// If, by \"rate\", you mean \"percentage change\", see the\n\t// `ALIGN_PERCENT_CHANGE` aligner instead.\n\tAggregation_ALIGN_RATE Aggregation_Aligner = 2\n\t// Align by interpolating between adjacent points around the alignment\n\t// period boundary. This aligner is valid for `GAUGE` metrics with\n\t// numeric values. The `value_type` of the aligned result is the same as the\n\t// `value_type` of the input.\n\tAggregation_ALIGN_INTERPOLATE Aggregation_Aligner = 3\n\t// Align by moving the most recent data point before the end of the\n\t// alignment period to the boundary at the end of the alignment\n\t// period. This aligner is valid for `GAUGE` metrics. The `value_type` of\n\t// the aligned result is the same as the `value_type` of the input.\n\tAggregation_ALIGN_NEXT_OLDER Aggregation_Aligner = 4\n\t// Align the time series by returning the minimum value in each alignment\n\t// period. This aligner is valid for `GAUGE` and `DELTA` metrics with\n\t// numeric values. The `value_type` of the aligned result is the same as\n\t// the `value_type` of the input.\n\tAggregation_ALIGN_MIN Aggregation_Aligner = 10\n\t// Align the time series by returning the maximum value in each alignment\n\t// period. This aligner is valid for `GAUGE` and `DELTA` metrics with\n\t// numeric values. The `value_type` of the aligned result is the same as\n\t// the `value_type` of the input.\n\tAggregation_ALIGN_MAX Aggregation_Aligner = 11\n\t// Align the time series by returning the mean value in each alignment\n\t// period. This aligner is valid for `GAUGE` and `DELTA` metrics with\n\t// numeric values. The `value_type` of the aligned result is `DOUBLE`.\n\tAggregation_ALIGN_MEAN Aggregation_Aligner = 12\n\t// Align the time series by returning the number of values in each alignment\n\t// period. This aligner is valid for `GAUGE` and `DELTA` metrics with\n\t// numeric or Boolean values. The `value_type` of the aligned result is\n\t// `INT64`.\n\tAggregation_ALIGN_COUNT Aggregation_Aligner = 13\n\t// Align the time series by returning the sum of the values in each\n\t// alignment period. This aligner is valid for `GAUGE` and `DELTA`\n\t// metrics with numeric and distribution values. The `value_type` of the\n\t// aligned result is the same as the `value_type` of the input.\n\tAggregation_ALIGN_SUM Aggregation_Aligner = 14\n\t// Align the time series by returning the standard deviation of the values\n\t// in each alignment period. This aligner is valid for `GAUGE` and\n\t// `DELTA` metrics with numeric values. The `value_type` of the output is\n\t// `DOUBLE`.\n\tAggregation_ALIGN_STDDEV Aggregation_Aligner = 15\n\t// Align the time series by returning the number of `True` values in\n\t// each alignment period. This aligner is valid for `GAUGE` metrics with\n\t// Boolean values. The `value_type` of the output is `INT64`.\n\tAggregation_ALIGN_COUNT_TRUE Aggregation_Aligner = 16\n\t// Align the time series by returning the number of `False` values in\n\t// each alignment period. This aligner is valid for `GAUGE` metrics with\n\t// Boolean values. The `value_type` of the output is `INT64`.\n\tAggregation_ALIGN_COUNT_FALSE Aggregation_Aligner = 24\n\t// Align the time series by returning the ratio of the number of `True`\n\t// values to the total number of values in each alignment period. This\n\t// aligner is valid for `GAUGE` metrics with Boolean values. The output\n\t// value is in the range [0.0, 1.0] and has `value_type` `DOUBLE`.\n\tAggregation_ALIGN_FRACTION_TRUE Aggregation_Aligner = 17\n\t// Align the time series by using [percentile\n\t// aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting\n\t// data point in each alignment period is the 99th percentile of all data\n\t// points in the period. This aligner is valid for `GAUGE` and `DELTA`\n\t// metrics with distribution values. The output is a `GAUGE` metric with\n\t// `value_type` `DOUBLE`.\n\tAggregation_ALIGN_PERCENTILE_99 Aggregation_Aligner = 18\n\t// Align the time series by using [percentile\n\t// aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting\n\t// data point in each alignment period is the 95th percentile of all data\n\t// points in the period. This aligner is valid for `GAUGE` and `DELTA`\n\t// metrics with distribution values. The output is a `GAUGE` metric with\n\t// `value_type` `DOUBLE`.\n\tAggregation_ALIGN_PERCENTILE_95 Aggregation_Aligner = 19\n\t// Align the time series by using [percentile\n\t// aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting\n\t// data point in each alignment period is the 50th percentile of all data\n\t// points in the period. This aligner is valid for `GAUGE` and `DELTA`\n\t// metrics with distribution values. The output is a `GAUGE` metric with\n\t// `value_type` `DOUBLE`.\n\tAggregation_ALIGN_PERCENTILE_50 Aggregation_Aligner = 20\n\t// Align the time series by using [percentile\n\t// aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting\n\t// data point in each alignment period is the 5th percentile of all data\n\t// points in the period. This aligner is valid for `GAUGE` and `DELTA`\n\t// metrics with distribution values. The output is a `GAUGE` metric with\n\t// `value_type` `DOUBLE`.\n\tAggregation_ALIGN_PERCENTILE_05 Aggregation_Aligner = 21\n\t// Align and convert to a percentage change. This aligner is valid for\n\t// `GAUGE` and `DELTA` metrics with numeric values. This alignment returns\n\t// `((current - previous)/previous) * 100`, where the value of `previous` is\n\t// determined based on the `alignment_period`.\n\t//\n\t// If the values of `current` and `previous` are both 0, then the returned\n\t// value is 0. If only `previous` is 0, the returned value is infinity.\n\t//\n\t// A 10-minute moving mean is computed at each point of the alignment period\n\t// prior to the above calculation to smooth the metric and prevent false\n\t// positives from very short-lived spikes. The moving mean is only\n\t// applicable for data whose values are `>= 0`. Any values `< 0` are\n\t// treated as a missing datapoint, and are ignored. While `DELTA`\n\t// metrics are accepted by this alignment, special care should be taken that\n\t// the values for the metric will always be positive. The output is a\n\t// `GAUGE` metric with `value_type` `DOUBLE`.\n\tAggregation_ALIGN_PERCENT_CHANGE Aggregation_Aligner = 23\n)\n\n// Enum value maps for Aggregation_Aligner.\nvar (\n\tAggregation_Aligner_name = map[int32]string{\n\t\t0:  \"ALIGN_NONE\",\n\t\t1:  \"ALIGN_DELTA\",\n\t\t2:  \"ALIGN_RATE\",\n\t\t3:  \"ALIGN_INTERPOLATE\",\n\t\t4:  \"ALIGN_NEXT_OLDER\",\n\t\t10: \"ALIGN_MIN\",\n\t\t11: \"ALIGN_MAX\",\n\t\t12: \"ALIGN_MEAN\",\n\t\t13: \"ALIGN_COUNT\",\n\t\t14: \"ALIGN_SUM\",\n\t\t15: \"ALIGN_STDDEV\",\n\t\t16: \"ALIGN_COUNT_TRUE\",\n\t\t24: \"ALIGN_COUNT_FALSE\",\n\t\t17: \"ALIGN_FRACTION_TRUE\",\n\t\t18: \"ALIGN_PERCENTILE_99\",\n\t\t19: \"ALIGN_PERCENTILE_95\",\n\t\t20: \"ALIGN_PERCENTILE_50\",\n\t\t21: \"ALIGN_PERCENTILE_05\",\n\t\t23: \"ALIGN_PERCENT_CHANGE\",\n\t}\n\tAggregation_Aligner_value = map[string]int32{\n\t\t\"ALIGN_NONE\":           0,\n\t\t\"ALIGN_DELTA\":          1,\n\t\t\"ALIGN_RATE\":           2,\n\t\t\"ALIGN_INTERPOLATE\":    3,\n\t\t\"ALIGN_NEXT_OLDER\":     4,\n\t\t\"ALIGN_MIN\":            10,\n\t\t\"ALIGN_MAX\":            11,\n\t\t\"ALIGN_MEAN\":           12,\n\t\t\"ALIGN_COUNT\":          13,\n\t\t\"ALIGN_SUM\":            14,\n\t\t\"ALIGN_STDDEV\":         15,\n\t\t\"ALIGN_COUNT_TRUE\":     16,\n\t\t\"ALIGN_COUNT_FALSE\":    24,\n\t\t\"ALIGN_FRACTION_TRUE\":  17,\n\t\t\"ALIGN_PERCENTILE_99\":  18,\n\t\t\"ALIGN_PERCENTILE_95\":  19,\n\t\t\"ALIGN_PERCENTILE_50\":  20,\n\t\t\"ALIGN_PERCENTILE_05\":  21,\n\t\t\"ALIGN_PERCENT_CHANGE\": 23,\n\t}\n)\n\nfunc (x Aggregation_Aligner) Enum() *Aggregation_Aligner {\n\tp := new(Aggregation_Aligner)\n\t*p = x\n\treturn p\n}\n\nfunc (x Aggregation_Aligner) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (Aggregation_Aligner) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_common_proto_enumTypes[2].Descriptor()\n}\n\nfunc (Aggregation_Aligner) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_common_proto_enumTypes[2]\n}\n\nfunc (x Aggregation_Aligner) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use Aggregation_Aligner.Descriptor instead.\nfunc (Aggregation_Aligner) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{2, 0}\n}\n\n// A Reducer operation describes how to aggregate data points from multiple\n// time series into a single time series, where the value of each data point\n// in the resulting series is a function of all the already aligned values in\n// the input time series.\ntype Aggregation_Reducer int32\n\nconst (\n\t// No cross-time series reduction. The output of the `Aligner` is\n\t// returned.\n\tAggregation_REDUCE_NONE Aggregation_Reducer = 0\n\t// Reduce by computing the mean value across time series for each\n\t// alignment period. This reducer is valid for\n\t// [DELTA][google.api.MetricDescriptor.MetricKind.DELTA] and\n\t// [GAUGE][google.api.MetricDescriptor.MetricKind.GAUGE] metrics with\n\t// numeric or distribution values. The `value_type` of the output is\n\t// [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].\n\tAggregation_REDUCE_MEAN Aggregation_Reducer = 1\n\t// Reduce by computing the minimum value across time series for each\n\t// alignment period. This reducer is valid for `DELTA` and `GAUGE` metrics\n\t// with numeric values. The `value_type` of the output is the same as the\n\t// `value_type` of the input.\n\tAggregation_REDUCE_MIN Aggregation_Reducer = 2\n\t// Reduce by computing the maximum value across time series for each\n\t// alignment period. This reducer is valid for `DELTA` and `GAUGE` metrics\n\t// with numeric values. The `value_type` of the output is the same as the\n\t// `value_type` of the input.\n\tAggregation_REDUCE_MAX Aggregation_Reducer = 3\n\t// Reduce by computing the sum across time series for each\n\t// alignment period. This reducer is valid for `DELTA` and `GAUGE` metrics\n\t// with numeric and distribution values. The `value_type` of the output is\n\t// the same as the `value_type` of the input.\n\tAggregation_REDUCE_SUM Aggregation_Reducer = 4\n\t// Reduce by computing the standard deviation across time series\n\t// for each alignment period. This reducer is valid for `DELTA` and\n\t// `GAUGE` metrics with numeric or distribution values. The `value_type`\n\t// of the output is `DOUBLE`.\n\tAggregation_REDUCE_STDDEV Aggregation_Reducer = 5\n\t// Reduce by computing the number of data points across time series\n\t// for each alignment period. This reducer is valid for `DELTA` and\n\t// `GAUGE` metrics of numeric, Boolean, distribution, and string\n\t// `value_type`. The `value_type` of the output is `INT64`.\n\tAggregation_REDUCE_COUNT Aggregation_Reducer = 6\n\t// Reduce by computing the number of `True`-valued data points across time\n\t// series for each alignment period. This reducer is valid for `DELTA` and\n\t// `GAUGE` metrics of Boolean `value_type`. The `value_type` of the output\n\t// is `INT64`.\n\tAggregation_REDUCE_COUNT_TRUE Aggregation_Reducer = 7\n\t// Reduce by computing the number of `False`-valued data points across time\n\t// series for each alignment period. This reducer is valid for `DELTA` and\n\t// `GAUGE` metrics of Boolean `value_type`. The `value_type` of the output\n\t// is `INT64`.\n\tAggregation_REDUCE_COUNT_FALSE Aggregation_Reducer = 15\n\t// Reduce by computing the ratio of the number of `True`-valued data points\n\t// to the total number of data points for each alignment period. This\n\t// reducer is valid for `DELTA` and `GAUGE` metrics of Boolean `value_type`.\n\t// The output value is in the range [0.0, 1.0] and has `value_type`\n\t// `DOUBLE`.\n\tAggregation_REDUCE_FRACTION_TRUE Aggregation_Reducer = 8\n\t// Reduce by computing the [99th\n\t// percentile](https://en.wikipedia.org/wiki/Percentile) of data points\n\t// across time series for each alignment period. This reducer is valid for\n\t// `GAUGE` and `DELTA` metrics of numeric and distribution type. The value\n\t// of the output is `DOUBLE`.\n\tAggregation_REDUCE_PERCENTILE_99 Aggregation_Reducer = 9\n\t// Reduce by computing the [95th\n\t// percentile](https://en.wikipedia.org/wiki/Percentile) of data points\n\t// across time series for each alignment period. This reducer is valid for\n\t// `GAUGE` and `DELTA` metrics of numeric and distribution type. The value\n\t// of the output is `DOUBLE`.\n\tAggregation_REDUCE_PERCENTILE_95 Aggregation_Reducer = 10\n\t// Reduce by computing the [50th\n\t// percentile](https://en.wikipedia.org/wiki/Percentile) of data points\n\t// across time series for each alignment period. This reducer is valid for\n\t// `GAUGE` and `DELTA` metrics of numeric and distribution type. The value\n\t// of the output is `DOUBLE`.\n\tAggregation_REDUCE_PERCENTILE_50 Aggregation_Reducer = 11\n\t// Reduce by computing the [5th\n\t// percentile](https://en.wikipedia.org/wiki/Percentile) of data points\n\t// across time series for each alignment period. This reducer is valid for\n\t// `GAUGE` and `DELTA` metrics of numeric and distribution type. The value\n\t// of the output is `DOUBLE`.\n\tAggregation_REDUCE_PERCENTILE_05 Aggregation_Reducer = 12\n)\n\n// Enum value maps for Aggregation_Reducer.\nvar (\n\tAggregation_Reducer_name = map[int32]string{\n\t\t0:  \"REDUCE_NONE\",\n\t\t1:  \"REDUCE_MEAN\",\n\t\t2:  \"REDUCE_MIN\",\n\t\t3:  \"REDUCE_MAX\",\n\t\t4:  \"REDUCE_SUM\",\n\t\t5:  \"REDUCE_STDDEV\",\n\t\t6:  \"REDUCE_COUNT\",\n\t\t7:  \"REDUCE_COUNT_TRUE\",\n\t\t15: \"REDUCE_COUNT_FALSE\",\n\t\t8:  \"REDUCE_FRACTION_TRUE\",\n\t\t9:  \"REDUCE_PERCENTILE_99\",\n\t\t10: \"REDUCE_PERCENTILE_95\",\n\t\t11: \"REDUCE_PERCENTILE_50\",\n\t\t12: \"REDUCE_PERCENTILE_05\",\n\t}\n\tAggregation_Reducer_value = map[string]int32{\n\t\t\"REDUCE_NONE\":          0,\n\t\t\"REDUCE_MEAN\":          1,\n\t\t\"REDUCE_MIN\":           2,\n\t\t\"REDUCE_MAX\":           3,\n\t\t\"REDUCE_SUM\":           4,\n\t\t\"REDUCE_STDDEV\":        5,\n\t\t\"REDUCE_COUNT\":         6,\n\t\t\"REDUCE_COUNT_TRUE\":    7,\n\t\t\"REDUCE_COUNT_FALSE\":   15,\n\t\t\"REDUCE_FRACTION_TRUE\": 8,\n\t\t\"REDUCE_PERCENTILE_99\": 9,\n\t\t\"REDUCE_PERCENTILE_95\": 10,\n\t\t\"REDUCE_PERCENTILE_50\": 11,\n\t\t\"REDUCE_PERCENTILE_05\": 12,\n\t}\n)\n\nfunc (x Aggregation_Reducer) Enum() *Aggregation_Reducer {\n\tp := new(Aggregation_Reducer)\n\t*p = x\n\treturn p\n}\n\nfunc (x Aggregation_Reducer) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (Aggregation_Reducer) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_common_proto_enumTypes[3].Descriptor()\n}\n\nfunc (Aggregation_Reducer) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_common_proto_enumTypes[3]\n}\n\nfunc (x Aggregation_Reducer) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use Aggregation_Reducer.Descriptor instead.\nfunc (Aggregation_Reducer) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{2, 1}\n}\n\n// A single strongly-typed value.\ntype TypedValue struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The typed value field.\n\t//\n\t// Types that are assignable to Value:\n\t//\n\t//\t*TypedValue_BoolValue\n\t//\t*TypedValue_Int64Value\n\t//\t*TypedValue_DoubleValue\n\t//\t*TypedValue_StringValue\n\t//\t*TypedValue_DistributionValue\n\tValue isTypedValue_Value `protobuf_oneof:\"value\"`\n}\n\nfunc (x *TypedValue) Reset() {\n\t*x = TypedValue{}\n\tmi := &file_google_monitoring_v3_common_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *TypedValue) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*TypedValue) ProtoMessage() {}\n\nfunc (x *TypedValue) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_common_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use TypedValue.ProtoReflect.Descriptor instead.\nfunc (*TypedValue) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (m *TypedValue) GetValue() isTypedValue_Value {\n\tif m != nil {\n\t\treturn m.Value\n\t}\n\treturn nil\n}\n\nfunc (x *TypedValue) GetBoolValue() bool {\n\tif x, ok := x.GetValue().(*TypedValue_BoolValue); ok {\n\t\treturn x.BoolValue\n\t}\n\treturn false\n}\n\nfunc (x *TypedValue) GetInt64Value() int64 {\n\tif x, ok := x.GetValue().(*TypedValue_Int64Value); ok {\n\t\treturn x.Int64Value\n\t}\n\treturn 0\n}\n\nfunc (x *TypedValue) GetDoubleValue() float64 {\n\tif x, ok := x.GetValue().(*TypedValue_DoubleValue); ok {\n\t\treturn x.DoubleValue\n\t}\n\treturn 0\n}\n\nfunc (x *TypedValue) GetStringValue() string {\n\tif x, ok := x.GetValue().(*TypedValue_StringValue); ok {\n\t\treturn x.StringValue\n\t}\n\treturn \"\"\n}\n\nfunc (x *TypedValue) GetDistributionValue() *distribution.Distribution {\n\tif x, ok := x.GetValue().(*TypedValue_DistributionValue); ok {\n\t\treturn x.DistributionValue\n\t}\n\treturn nil\n}\n\ntype isTypedValue_Value interface {\n\tisTypedValue_Value()\n}\n\ntype TypedValue_BoolValue struct {\n\t// A Boolean value: `true` or `false`.\n\tBoolValue bool `protobuf:\"varint,1,opt,name=bool_value,json=boolValue,proto3,oneof\"`\n}\n\ntype TypedValue_Int64Value struct {\n\t// A 64-bit integer. Its range is approximately &plusmn;9.2x10<sup>18</sup>.\n\tInt64Value int64 `protobuf:\"varint,2,opt,name=int64_value,json=int64Value,proto3,oneof\"`\n}\n\ntype TypedValue_DoubleValue struct {\n\t// A 64-bit double-precision floating-point number. Its magnitude\n\t// is approximately &plusmn;10<sup>&plusmn;300</sup> and it has 16\n\t// significant digits of precision.\n\tDoubleValue float64 `protobuf:\"fixed64,3,opt,name=double_value,json=doubleValue,proto3,oneof\"`\n}\n\ntype TypedValue_StringValue struct {\n\t// A variable-length string value.\n\tStringValue string `protobuf:\"bytes,4,opt,name=string_value,json=stringValue,proto3,oneof\"`\n}\n\ntype TypedValue_DistributionValue struct {\n\t// A distribution value.\n\tDistributionValue *distribution.Distribution `protobuf:\"bytes,5,opt,name=distribution_value,json=distributionValue,proto3,oneof\"`\n}\n\nfunc (*TypedValue_BoolValue) isTypedValue_Value() {}\n\nfunc (*TypedValue_Int64Value) isTypedValue_Value() {}\n\nfunc (*TypedValue_DoubleValue) isTypedValue_Value() {}\n\nfunc (*TypedValue_StringValue) isTypedValue_Value() {}\n\nfunc (*TypedValue_DistributionValue) isTypedValue_Value() {}\n\n// Describes a time interval:\n//\n//   - Reads: A half-open time interval. It includes the end time but\n//     excludes the start time: `(startTime, endTime]`. The start time\n//     must be specified, must be earlier than the end time, and should be\n//     no older than the data retention period for the metric.\n//   - Writes: A closed time interval. It extends from the start time to the end\n//     time,\n//     and includes both: `[startTime, endTime]`. Valid time intervals\n//     depend on the\n//     [`MetricKind`](https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors#MetricKind)\n//     of the metric value. The end time must not be earlier than the start\n//     time, and the end time must not be more than 25 hours in the past or more\n//     than five minutes in the future.\n//   - For `GAUGE` metrics, the `startTime` value is technically optional; if\n//     no value is specified, the start time defaults to the value of the\n//     end time, and the interval represents a single point in time. If both\n//     start and end times are specified, they must be identical. Such an\n//     interval is valid only for `GAUGE` metrics, which are point-in-time\n//     measurements. The end time of a new interval must be at least a\n//     millisecond after the end time of the previous interval.\n//   - For `DELTA` metrics, the start time and end time must specify a\n//     non-zero interval, with subsequent points specifying contiguous and\n//     non-overlapping intervals. For `DELTA` metrics, the start time of\n//     the next interval must be at least a millisecond after the end time\n//     of the previous interval.\n//   - For `CUMULATIVE` metrics, the start time and end time must specify a\n//     non-zero interval, with subsequent points specifying the same\n//     start time and increasing end times, until an event resets the\n//     cumulative value to zero and sets a new start time for the following\n//     points. The new start time must be at least a millisecond after the\n//     end time of the previous interval.\n//   - The start time of a new interval must be at least a millisecond after\n//     the\n//     end time of the previous interval because intervals are closed. If the\n//     start time of a new interval is the same as the end time of the\n//     previous interval, then data written at the new start time could\n//     overwrite data written at the previous end time.\ntype TimeInterval struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The end of the time interval.\n\tEndTime *timestamppb.Timestamp `protobuf:\"bytes,2,opt,name=end_time,json=endTime,proto3\" json:\"end_time,omitempty\"`\n\t// Optional. The beginning of the time interval.  The default value\n\t// for the start time is the end time. The start time must not be\n\t// later than the end time.\n\tStartTime *timestamppb.Timestamp `protobuf:\"bytes,1,opt,name=start_time,json=startTime,proto3\" json:\"start_time,omitempty\"`\n}\n\nfunc (x *TimeInterval) Reset() {\n\t*x = TimeInterval{}\n\tmi := &file_google_monitoring_v3_common_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *TimeInterval) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*TimeInterval) ProtoMessage() {}\n\nfunc (x *TimeInterval) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_common_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use TimeInterval.ProtoReflect.Descriptor instead.\nfunc (*TimeInterval) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *TimeInterval) GetEndTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.EndTime\n\t}\n\treturn nil\n}\n\nfunc (x *TimeInterval) GetStartTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.StartTime\n\t}\n\treturn nil\n}\n\n// Describes how to combine multiple time series to provide a different view of\n// the data.  Aggregation of time series is done in two steps. First, each time\n// series in the set is _aligned_ to the same time interval boundaries, then the\n// set of time series is optionally _reduced_ in number.\n//\n// Alignment consists of applying the `per_series_aligner` operation\n// to each time series after its data has been divided into regular\n// `alignment_period` time intervals. This process takes _all_ of the data\n// points in an alignment period, applies a mathematical transformation such as\n// averaging, minimum, maximum, delta, etc., and converts them into a single\n// data point per period.\n//\n// Reduction is when the aligned and transformed time series can optionally be\n// combined, reducing the number of time series through similar mathematical\n// transformations. Reduction involves applying a `cross_series_reducer` to\n// all the time series, optionally sorting the time series into subsets with\n// `group_by_fields`, and applying the reducer to each subset.\n//\n// The raw time series data can contain a huge amount of information from\n// multiple sources. Alignment and reduction transforms this mass of data into\n// a more manageable and representative collection of data, for example \"the\n// 95% latency across the average of all tasks in a cluster\". This\n// representative data can be more easily graphed and comprehended, and the\n// individual time series data is still available for later drilldown. For more\n// details, see [Filtering and\n// aggregation](https://cloud.google.com/monitoring/api/v3/aggregation).\ntype Aggregation struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The `alignment_period` specifies a time interval, in seconds, that is used\n\t// to divide the data in all the\n\t// [time series][google.monitoring.v3.TimeSeries] into consistent blocks of\n\t// time. This will be done before the per-series aligner can be applied to\n\t// the data.\n\t//\n\t// The value must be at least 60 seconds. If a per-series\n\t// aligner other than `ALIGN_NONE` is specified, this field is required or an\n\t// error is returned. If no per-series aligner is specified, or the aligner\n\t// `ALIGN_NONE` is specified, then this field is ignored.\n\t//\n\t// The maximum value of the `alignment_period` is 104 weeks (2 years) for\n\t// charts, and 90,000 seconds (25 hours) for alerting policies.\n\tAlignmentPeriod *durationpb.Duration `protobuf:\"bytes,1,opt,name=alignment_period,json=alignmentPeriod,proto3\" json:\"alignment_period,omitempty\"`\n\t// An `Aligner` describes how to bring the data points in a single\n\t// time series into temporal alignment. Except for `ALIGN_NONE`, all\n\t// alignments cause all the data points in an `alignment_period` to be\n\t// mathematically grouped together, resulting in a single data point for\n\t// each `alignment_period` with end timestamp at the end of the period.\n\t//\n\t// Not all alignment operations may be applied to all time series. The valid\n\t// choices depend on the `metric_kind` and `value_type` of the original time\n\t// series. Alignment can change the `metric_kind` or the `value_type` of\n\t// the time series.\n\t//\n\t// Time series data must be aligned in order to perform cross-time\n\t// series reduction. If `cross_series_reducer` is specified, then\n\t// `per_series_aligner` must be specified and not equal to `ALIGN_NONE`\n\t// and `alignment_period` must be specified; otherwise, an error is\n\t// returned.\n\tPerSeriesAligner Aggregation_Aligner `protobuf:\"varint,2,opt,name=per_series_aligner,json=perSeriesAligner,proto3,enum=google.monitoring.v3.Aggregation_Aligner\" json:\"per_series_aligner,omitempty\"`\n\t// The reduction operation to be used to combine time series into a single\n\t// time series, where the value of each data point in the resulting series is\n\t// a function of all the already aligned values in the input time series.\n\t//\n\t// Not all reducer operations can be applied to all time series. The valid\n\t// choices depend on the `metric_kind` and the `value_type` of the original\n\t// time series. Reduction can yield a time series with a different\n\t// `metric_kind` or `value_type` than the input time series.\n\t//\n\t// Time series data must first be aligned (see `per_series_aligner`) in order\n\t// to perform cross-time series reduction. If `cross_series_reducer` is\n\t// specified, then `per_series_aligner` must be specified, and must not be\n\t// `ALIGN_NONE`. An `alignment_period` must also be specified; otherwise, an\n\t// error is returned.\n\tCrossSeriesReducer Aggregation_Reducer `protobuf:\"varint,4,opt,name=cross_series_reducer,json=crossSeriesReducer,proto3,enum=google.monitoring.v3.Aggregation_Reducer\" json:\"cross_series_reducer,omitempty\"`\n\t// The set of fields to preserve when `cross_series_reducer` is\n\t// specified. The `group_by_fields` determine how the time series are\n\t// partitioned into subsets prior to applying the aggregation\n\t// operation. Each subset contains time series that have the same\n\t// value for each of the grouping fields. Each individual time\n\t// series is a member of exactly one subset. The\n\t// `cross_series_reducer` is applied to each subset of time series.\n\t// It is not possible to reduce across different resource types, so\n\t// this field implicitly contains `resource.type`.  Fields not\n\t// specified in `group_by_fields` are aggregated away.  If\n\t// `group_by_fields` is not specified and all the time series have\n\t// the same resource type, then the time series are aggregated into\n\t// a single output time series. If `cross_series_reducer` is not\n\t// defined, this field is ignored.\n\tGroupByFields []string `protobuf:\"bytes,5,rep,name=group_by_fields,json=groupByFields,proto3\" json:\"group_by_fields,omitempty\"`\n}\n\nfunc (x *Aggregation) Reset() {\n\t*x = Aggregation{}\n\tmi := &file_google_monitoring_v3_common_proto_msgTypes[2]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Aggregation) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Aggregation) ProtoMessage() {}\n\nfunc (x *Aggregation) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_common_proto_msgTypes[2]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Aggregation.ProtoReflect.Descriptor instead.\nfunc (*Aggregation) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *Aggregation) GetAlignmentPeriod() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.AlignmentPeriod\n\t}\n\treturn nil\n}\n\nfunc (x *Aggregation) GetPerSeriesAligner() Aggregation_Aligner {\n\tif x != nil {\n\t\treturn x.PerSeriesAligner\n\t}\n\treturn Aggregation_ALIGN_NONE\n}\n\nfunc (x *Aggregation) GetCrossSeriesReducer() Aggregation_Reducer {\n\tif x != nil {\n\t\treturn x.CrossSeriesReducer\n\t}\n\treturn Aggregation_REDUCE_NONE\n}\n\nfunc (x *Aggregation) GetGroupByFields() []string {\n\tif x != nil {\n\t\treturn x.GroupByFields\n\t}\n\treturn nil\n}\n\nvar File_google_monitoring_v3_common_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_common_proto_rawDesc = []byte{\n\t0x0a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1d, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,\n\t0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xee, 0x01, 0x0a, 0x0a, 0x54, 0x79,\n\t0x70, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c,\n\t0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09,\n\t0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x69, 0x6e, 0x74,\n\t0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00,\n\t0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c,\n\t0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75,\n\t0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e,\n\t0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x49, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69,\n\t0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e,\n\t0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x11,\n\t0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75,\n\t0x65, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x0c, 0x54,\n\t0x69, 0x6d, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x35, 0x0a, 0x08, 0x65,\n\t0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69,\n\t0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,\n\t0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xf3, 0x07,\n\t0x0a, 0x0b, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a,\n\t0x10, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x0f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x65, 0x72,\n\t0x69, 0x6f, 0x64, 0x12, 0x57, 0x0a, 0x12, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65,\n\t0x73, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32,\n\t0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x2e, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x10, 0x70, 0x65, 0x72, 0x53,\n\t0x65, 0x72, 0x69, 0x65, 0x73, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x5b, 0x0a, 0x14,\n\t0x63, 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x64,\n\t0x75, 0x63, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65,\n\t0x64, 0x75, 0x63, 0x65, 0x72, 0x52, 0x12, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x53, 0x65, 0x72, 0x69,\n\t0x65, 0x73, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x67, 0x72, 0x6f,\n\t0x75, 0x70, 0x5f, 0x62, 0x79, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03,\n\t0x28, 0x09, 0x52, 0x0d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64,\n\t0x73, 0x22, 0x8b, 0x03, 0x0a, 0x07, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x0e, 0x0a,\n\t0x0a, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a,\n\t0x0b, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x54, 0x41, 0x10, 0x01, 0x12, 0x0e,\n\t0x0a, 0x0a, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x15,\n\t0x0a, 0x11, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x50, 0x4f, 0x4c,\n\t0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x4e,\n\t0x45, 0x58, 0x54, 0x5f, 0x4f, 0x4c, 0x44, 0x45, 0x52, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x41,\n\t0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x4d, 0x49, 0x4e, 0x10, 0x0a, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x4c,\n\t0x49, 0x47, 0x4e, 0x5f, 0x4d, 0x41, 0x58, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x4c, 0x49,\n\t0x47, 0x4e, 0x5f, 0x4d, 0x45, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x4c, 0x49,\n\t0x47, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x4c,\n\t0x49, 0x47, 0x4e, 0x5f, 0x53, 0x55, 0x4d, 0x10, 0x0e, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x4c, 0x49,\n\t0x47, 0x4e, 0x5f, 0x53, 0x54, 0x44, 0x44, 0x45, 0x56, 0x10, 0x0f, 0x12, 0x14, 0x0a, 0x10, 0x41,\n\t0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x52, 0x55, 0x45, 0x10,\n\t0x10, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54,\n\t0x5f, 0x46, 0x41, 0x4c, 0x53, 0x45, 0x10, 0x18, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x4c, 0x49, 0x47,\n\t0x4e, 0x5f, 0x46, 0x52, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x55, 0x45, 0x10,\n\t0x11, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45,\n\t0x4e, 0x54, 0x49, 0x4c, 0x45, 0x5f, 0x39, 0x39, 0x10, 0x12, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x4c,\n\t0x49, 0x47, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45, 0x5f, 0x39,\n\t0x35, 0x10, 0x13, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x50, 0x45, 0x52,\n\t0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45, 0x5f, 0x35, 0x30, 0x10, 0x14, 0x12, 0x17, 0x0a, 0x13,\n\t0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45,\n\t0x5f, 0x30, 0x35, 0x10, 0x15, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x50,\n\t0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x17, 0x22,\n\t0xb1, 0x02, 0x0a, 0x07, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x72, 0x12, 0x0f, 0x0a, 0x0b, 0x52,\n\t0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b,\n\t0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4d, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a,\n\t0x0a, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4d, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0e, 0x0a,\n\t0x0a, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4d, 0x41, 0x58, 0x10, 0x03, 0x12, 0x0e, 0x0a,\n\t0x0a, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x53, 0x55, 0x4d, 0x10, 0x04, 0x12, 0x11, 0x0a,\n\t0x0d, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x44, 0x44, 0x45, 0x56, 0x10, 0x05,\n\t0x12, 0x10, 0x0a, 0x0c, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54,\n\t0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x55,\n\t0x4e, 0x54, 0x5f, 0x54, 0x52, 0x55, 0x45, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x44,\n\t0x55, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x41, 0x4c, 0x53, 0x45, 0x10,\n\t0x0f, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x46, 0x52, 0x41, 0x43,\n\t0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x55, 0x45, 0x10, 0x08, 0x12, 0x18, 0x0a, 0x14, 0x52,\n\t0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45,\n\t0x5f, 0x39, 0x39, 0x10, 0x09, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f,\n\t0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45, 0x5f, 0x39, 0x35, 0x10, 0x0a, 0x12,\n\t0x18, 0x0a, 0x14, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e,\n\t0x54, 0x49, 0x4c, 0x45, 0x5f, 0x35, 0x30, 0x10, 0x0b, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x44,\n\t0x55, 0x43, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45, 0x5f, 0x30,\n\t0x35, 0x10, 0x0c, 0x2a, 0x9e, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73,\n\t0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52,\n\t0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44,\n\t0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e,\n\t0x5f, 0x47, 0x54, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49,\n\t0x53, 0x4f, 0x4e, 0x5f, 0x47, 0x45, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x50,\n\t0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x43,\n\t0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x4c, 0x45, 0x10, 0x04, 0x12, 0x11,\n\t0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x45, 0x51, 0x10,\n\t0x05, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f,\n\t0x4e, 0x45, 0x10, 0x06, 0x2a, 0x61, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54,\n\t0x69, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54,\n\t0x49, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10,\n\t0x00, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x49, 0x45,\n\t0x52, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x52,\n\t0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x49, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x45, 0x4d, 0x49, 0x55,\n\t0x4d, 0x10, 0x02, 0x1a, 0x02, 0x18, 0x01, 0x42, 0xcd, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x76, 0x33, 0x42, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74,\n\t0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xa2, 0x02, 0x04, 0x47, 0x4d, 0x4f, 0x4e, 0xaa, 0x02, 0x1a,\n\t0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_monitoring_v3_common_proto_rawDescOnce sync.Once\n\tfile_google_monitoring_v3_common_proto_rawDescData = file_google_monitoring_v3_common_proto_rawDesc\n)\n\nfunc file_google_monitoring_v3_common_proto_rawDescGZIP() []byte {\n\tfile_google_monitoring_v3_common_proto_rawDescOnce.Do(func() {\n\t\tfile_google_monitoring_v3_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_common_proto_rawDescData)\n\t})\n\treturn file_google_monitoring_v3_common_proto_rawDescData\n}\n\nvar file_google_monitoring_v3_common_proto_enumTypes = make([]protoimpl.EnumInfo, 4)\nvar file_google_monitoring_v3_common_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_google_monitoring_v3_common_proto_goTypes = []any{\n\t(ComparisonType)(0),               // 0: google.monitoring.v3.ComparisonType\n\t(ServiceTier)(0),                  // 1: google.monitoring.v3.ServiceTier\n\t(Aggregation_Aligner)(0),          // 2: google.monitoring.v3.Aggregation.Aligner\n\t(Aggregation_Reducer)(0),          // 3: google.monitoring.v3.Aggregation.Reducer\n\t(*TypedValue)(nil),                // 4: google.monitoring.v3.TypedValue\n\t(*TimeInterval)(nil),              // 5: google.monitoring.v3.TimeInterval\n\t(*Aggregation)(nil),               // 6: google.monitoring.v3.Aggregation\n\t(*distribution.Distribution)(nil), // 7: google.api.Distribution\n\t(*timestamppb.Timestamp)(nil),     // 8: google.protobuf.Timestamp\n\t(*durationpb.Duration)(nil),       // 9: google.protobuf.Duration\n}\nvar file_google_monitoring_v3_common_proto_depIdxs = []int32{\n\t7, // 0: google.monitoring.v3.TypedValue.distribution_value:type_name -> google.api.Distribution\n\t8, // 1: google.monitoring.v3.TimeInterval.end_time:type_name -> google.protobuf.Timestamp\n\t8, // 2: google.monitoring.v3.TimeInterval.start_time:type_name -> google.protobuf.Timestamp\n\t9, // 3: google.monitoring.v3.Aggregation.alignment_period:type_name -> google.protobuf.Duration\n\t2, // 4: google.monitoring.v3.Aggregation.per_series_aligner:type_name -> google.monitoring.v3.Aggregation.Aligner\n\t3, // 5: google.monitoring.v3.Aggregation.cross_series_reducer:type_name -> google.monitoring.v3.Aggregation.Reducer\n\t6, // [6:6] is the sub-list for method output_type\n\t6, // [6:6] is the sub-list for method input_type\n\t6, // [6:6] is the sub-list for extension type_name\n\t6, // [6:6] is the sub-list for extension extendee\n\t0, // [0:6] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_common_proto_init() }\nfunc file_google_monitoring_v3_common_proto_init() {\n\tif File_google_monitoring_v3_common_proto != nil {\n\t\treturn\n\t}\n\tfile_google_monitoring_v3_common_proto_msgTypes[0].OneofWrappers = []any{\n\t\t(*TypedValue_BoolValue)(nil),\n\t\t(*TypedValue_Int64Value)(nil),\n\t\t(*TypedValue_DoubleValue)(nil),\n\t\t(*TypedValue_StringValue)(nil),\n\t\t(*TypedValue_DistributionValue)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_common_proto_rawDesc,\n\t\t\tNumEnums:      4,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_common_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_common_proto_depIdxs,\n\t\tEnumInfos:         file_google_monitoring_v3_common_proto_enumTypes,\n\t\tMessageInfos:      file_google_monitoring_v3_common_proto_msgTypes,\n\t}.Build()\n\tFile_google_monitoring_v3_common_proto = out.File\n\tfile_google_monitoring_v3_common_proto_rawDesc = nil\n\tfile_google_monitoring_v3_common_proto_goTypes = nil\n\tfile_google_monitoring_v3_common_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/dropped_labels.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/dropped_labels.proto\n\npackage monitoringpb\n\nimport (\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// A set of (label, value) pairs that were removed from a Distribution\n// time series during aggregation and then added as an attachment to a\n// Distribution.Exemplar.\n//\n// The full label set for the exemplars is constructed by using the dropped\n// pairs in combination with the label values that remain on the aggregated\n// Distribution time series. The constructed full label set can be used to\n// identify the specific entity, such as the instance or job, which might be\n// contributing to a long-tail. However, with dropped labels, the storage\n// requirements are reduced because only the aggregated distribution values for\n// a large group of time series are stored.\n//\n// Note that there are no guarantees on ordering of the labels from\n// exemplar-to-exemplar and from distribution-to-distribution in the same\n// stream, and there may be duplicates.  It is up to clients to resolve any\n// ambiguities.\ntype DroppedLabels struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Map from label to its value, for all labels dropped in any aggregation.\n\tLabel map[string]string `protobuf:\"bytes,1,rep,name=label,proto3\" json:\"label,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n}\n\nfunc (x *DroppedLabels) Reset() {\n\t*x = DroppedLabels{}\n\tmi := &file_google_monitoring_v3_dropped_labels_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *DroppedLabels) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DroppedLabels) ProtoMessage() {}\n\nfunc (x *DroppedLabels) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_dropped_labels_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DroppedLabels.ProtoReflect.Descriptor instead.\nfunc (*DroppedLabels) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_dropped_labels_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *DroppedLabels) GetLabel() map[string]string {\n\tif x != nil {\n\t\treturn x.Label\n\t}\n\treturn nil\n}\n\nvar File_google_monitoring_v3_dropped_labels_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_dropped_labels_proto_rawDesc = []byte{\n\t0x0a, 0x29, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6c,\n\t0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x22, 0x8f, 0x01, 0x0a, 0x0d, 0x44, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x4c, 0x61, 0x62,\n\t0x65, 0x6c, 0x73, 0x12, 0x44, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x72, 0x6f, 0x70, 0x70, 0x65,\n\t0x64, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x45, 0x6e, 0x74,\n\t0x72, 0x79, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x1a, 0x38, 0x0a, 0x0a, 0x4c, 0x61, 0x62,\n\t0x65, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c,\n\t0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a,\n\t0x02, 0x38, 0x01, 0x42, 0xcd, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33,\n\t0x42, 0x12, 0x44, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x50,\n\t0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c,\n\t0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c,\n\t0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a,\n\t0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_monitoring_v3_dropped_labels_proto_rawDescOnce sync.Once\n\tfile_google_monitoring_v3_dropped_labels_proto_rawDescData = file_google_monitoring_v3_dropped_labels_proto_rawDesc\n)\n\nfunc file_google_monitoring_v3_dropped_labels_proto_rawDescGZIP() []byte {\n\tfile_google_monitoring_v3_dropped_labels_proto_rawDescOnce.Do(func() {\n\t\tfile_google_monitoring_v3_dropped_labels_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_dropped_labels_proto_rawDescData)\n\t})\n\treturn file_google_monitoring_v3_dropped_labels_proto_rawDescData\n}\n\nvar file_google_monitoring_v3_dropped_labels_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_google_monitoring_v3_dropped_labels_proto_goTypes = []any{\n\t(*DroppedLabels)(nil), // 0: google.monitoring.v3.DroppedLabels\n\tnil,                   // 1: google.monitoring.v3.DroppedLabels.LabelEntry\n}\nvar file_google_monitoring_v3_dropped_labels_proto_depIdxs = []int32{\n\t1, // 0: google.monitoring.v3.DroppedLabels.label:type_name -> google.monitoring.v3.DroppedLabels.LabelEntry\n\t1, // [1:1] is the sub-list for method output_type\n\t1, // [1:1] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_dropped_labels_proto_init() }\nfunc file_google_monitoring_v3_dropped_labels_proto_init() {\n\tif File_google_monitoring_v3_dropped_labels_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_dropped_labels_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_dropped_labels_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_dropped_labels_proto_depIdxs,\n\t\tMessageInfos:      file_google_monitoring_v3_dropped_labels_proto_msgTypes,\n\t}.Build()\n\tFile_google_monitoring_v3_dropped_labels_proto = out.File\n\tfile_google_monitoring_v3_dropped_labels_proto_rawDesc = nil\n\tfile_google_monitoring_v3_dropped_labels_proto_goTypes = nil\n\tfile_google_monitoring_v3_dropped_labels_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/group.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/group.proto\n\npackage monitoringpb\n\nimport (\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// The description of a dynamic collection of monitored resources. Each group\n// has a filter that is matched against monitored resources and their associated\n// metadata. If a group's filter matches an available monitored resource, then\n// that resource is a member of that group.  Groups can contain any number of\n// monitored resources, and each monitored resource can be a member of any\n// number of groups.\n//\n// Groups can be nested in parent-child hierarchies. The `parentName` field\n// identifies an optional parent for each group.  If a group has a parent, then\n// the only monitored resources available to be matched by the group's filter\n// are the resources contained in the parent group.  In other words, a group\n// contains the monitored resources that match its filter and the filters of all\n// the group's ancestors.  A group without a parent can contain any monitored\n// resource.\n//\n// For example, consider an infrastructure running a set of instances with two\n// user-defined tags: `\"environment\"` and `\"role\"`. A parent group has a filter,\n// `environment=\"production\"`.  A child of that parent group has a filter,\n// `role=\"transcoder\"`.  The parent group contains all instances in the\n// production environment, regardless of their roles.  The child group contains\n// instances that have the transcoder role *and* are in the production\n// environment.\n//\n// The monitored resources contained in a group can change at any moment,\n// depending on what resources exist and what filters are associated with the\n// group and its ancestors.\ntype Group struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Output only. The name of this group. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID]\n\t//\n\t// When creating a group, this field is ignored and a new name is created\n\t// consisting of the project specified in the call to `CreateGroup`\n\t// and a unique `[GROUP_ID]` that is generated automatically.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// A user-assigned name for this group, used only for display purposes.\n\tDisplayName string `protobuf:\"bytes,2,opt,name=display_name,json=displayName,proto3\" json:\"display_name,omitempty\"`\n\t// The name of the group's parent, if it has one. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID]\n\t//\n\t// For groups with no parent, `parent_name` is the empty string, `\"\"`.\n\tParentName string `protobuf:\"bytes,3,opt,name=parent_name,json=parentName,proto3\" json:\"parent_name,omitempty\"`\n\t// The filter used to determine which monitored resources belong to this\n\t// group.\n\tFilter string `protobuf:\"bytes,5,opt,name=filter,proto3\" json:\"filter,omitempty\"`\n\t// If true, the members of this group are considered to be a cluster.\n\t// The system can perform additional analysis on groups that are clusters.\n\tIsCluster bool `protobuf:\"varint,6,opt,name=is_cluster,json=isCluster,proto3\" json:\"is_cluster,omitempty\"`\n}\n\nfunc (x *Group) Reset() {\n\t*x = Group{}\n\tmi := &file_google_monitoring_v3_group_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Group) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Group) ProtoMessage() {}\n\nfunc (x *Group) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_group_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Group.ProtoReflect.Descriptor instead.\nfunc (*Group) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_group_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Group) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Group) GetDisplayName() string {\n\tif x != nil {\n\t\treturn x.DisplayName\n\t}\n\treturn \"\"\n}\n\nfunc (x *Group) GetParentName() string {\n\tif x != nil {\n\t\treturn x.ParentName\n\t}\n\treturn \"\"\n}\n\nfunc (x *Group) GetFilter() string {\n\tif x != nil {\n\t\treturn x.Filter\n\t}\n\treturn \"\"\n}\n\nfunc (x *Group) GetIsCluster() bool {\n\tif x != nil {\n\t\treturn x.IsCluster\n\t}\n\treturn false\n}\n\nvar File_google_monitoring_v3_group_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_group_proto_rawDesc = []byte{\n\t0x0a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x22, 0xb2, 0x02, 0x0a, 0x05, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79,\n\t0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e,\n\t0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1d, 0x0a,\n\t0x0a, 0x69, 0x73, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x08, 0x52, 0x09, 0x69, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x99, 0x01, 0xea,\n\t0x41, 0x95, 0x01, 0x0a, 0x1f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47,\n\t0x72, 0x6f, 0x75, 0x70, 0x12, 0x21, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b,\n\t0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f,\n\t0x7b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x7d, 0x12, 0x2b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x67, 0x72,\n\t0x6f, 0x75, 0x70, 0x7d, 0x12, 0x1f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66,\n\t0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x67,\n\t0x72, 0x6f, 0x75, 0x70, 0x7d, 0x12, 0x01, 0x2a, 0x42, 0xc5, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x0a, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x72, 0x6f, 0x74,\n\t0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f,\n\t0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33,\n\t0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64,\n\t0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_monitoring_v3_group_proto_rawDescOnce sync.Once\n\tfile_google_monitoring_v3_group_proto_rawDescData = file_google_monitoring_v3_group_proto_rawDesc\n)\n\nfunc file_google_monitoring_v3_group_proto_rawDescGZIP() []byte {\n\tfile_google_monitoring_v3_group_proto_rawDescOnce.Do(func() {\n\t\tfile_google_monitoring_v3_group_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_group_proto_rawDescData)\n\t})\n\treturn file_google_monitoring_v3_group_proto_rawDescData\n}\n\nvar file_google_monitoring_v3_group_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_google_monitoring_v3_group_proto_goTypes = []any{\n\t(*Group)(nil), // 0: google.monitoring.v3.Group\n}\nvar file_google_monitoring_v3_group_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_group_proto_init() }\nfunc file_google_monitoring_v3_group_proto_init() {\n\tif File_google_monitoring_v3_group_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_group_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_group_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_group_proto_depIdxs,\n\t\tMessageInfos:      file_google_monitoring_v3_group_proto_msgTypes,\n\t}.Build()\n\tFile_google_monitoring_v3_group_proto = out.File\n\tfile_google_monitoring_v3_group_proto_rawDesc = nil\n\tfile_google_monitoring_v3_group_proto_goTypes = nil\n\tfile_google_monitoring_v3_group_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/group_service.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/group_service.proto\n\npackage monitoringpb\n\nimport (\n\tcontext \"context\"\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tmonitoredres \"google.golang.org/genproto/googleapis/api/monitoredres\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// The `ListGroup` request.\ntype ListGroupsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The\n\t// [project](https://cloud.google.com/monitoring/api/v3#project_name) whose\n\t// groups are to be listed. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\tName string `protobuf:\"bytes,7,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// An optional filter consisting of a single group name.  The filters limit\n\t// the groups returned based on their parent-child relationship with the\n\t// specified group. If no filter is specified, all groups are returned.\n\t//\n\t// Types that are assignable to Filter:\n\t//\n\t//\t*ListGroupsRequest_ChildrenOfGroup\n\t//\t*ListGroupsRequest_AncestorsOfGroup\n\t//\t*ListGroupsRequest_DescendantsOfGroup\n\tFilter isListGroupsRequest_Filter `protobuf_oneof:\"filter\"`\n\t// A positive number that is the maximum number of results to return.\n\tPageSize int32 `protobuf:\"varint,5,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\t// If this field is not empty then it must contain the `next_page_token` value\n\t// returned by a previous call to this method.  Using this field causes the\n\t// method to return additional results from the previous method call.\n\tPageToken string `protobuf:\"bytes,6,opt,name=page_token,json=pageToken,proto3\" json:\"page_token,omitempty\"`\n}\n\nfunc (x *ListGroupsRequest) Reset() {\n\t*x = ListGroupsRequest{}\n\tmi := &file_google_monitoring_v3_group_service_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListGroupsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListGroupsRequest) ProtoMessage() {}\n\nfunc (x *ListGroupsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_group_service_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListGroupsRequest.ProtoReflect.Descriptor instead.\nfunc (*ListGroupsRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_group_service_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ListGroupsRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (m *ListGroupsRequest) GetFilter() isListGroupsRequest_Filter {\n\tif m != nil {\n\t\treturn m.Filter\n\t}\n\treturn nil\n}\n\nfunc (x *ListGroupsRequest) GetChildrenOfGroup() string {\n\tif x, ok := x.GetFilter().(*ListGroupsRequest_ChildrenOfGroup); ok {\n\t\treturn x.ChildrenOfGroup\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListGroupsRequest) GetAncestorsOfGroup() string {\n\tif x, ok := x.GetFilter().(*ListGroupsRequest_AncestorsOfGroup); ok {\n\t\treturn x.AncestorsOfGroup\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListGroupsRequest) GetDescendantsOfGroup() string {\n\tif x, ok := x.GetFilter().(*ListGroupsRequest_DescendantsOfGroup); ok {\n\t\treturn x.DescendantsOfGroup\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListGroupsRequest) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListGroupsRequest) GetPageToken() string {\n\tif x != nil {\n\t\treturn x.PageToken\n\t}\n\treturn \"\"\n}\n\ntype isListGroupsRequest_Filter interface {\n\tisListGroupsRequest_Filter()\n}\n\ntype ListGroupsRequest_ChildrenOfGroup struct {\n\t// A group name. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID]\n\t//\n\t// Returns groups whose `parent_name` field contains the group\n\t// name.  If no groups have this parent, the results are empty.\n\tChildrenOfGroup string `protobuf:\"bytes,2,opt,name=children_of_group,json=childrenOfGroup,proto3,oneof\"`\n}\n\ntype ListGroupsRequest_AncestorsOfGroup struct {\n\t// A group name. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID]\n\t//\n\t// Returns groups that are ancestors of the specified group.\n\t// The groups are returned in order, starting with the immediate parent and\n\t// ending with the most distant ancestor.  If the specified group has no\n\t// immediate parent, the results are empty.\n\tAncestorsOfGroup string `protobuf:\"bytes,3,opt,name=ancestors_of_group,json=ancestorsOfGroup,proto3,oneof\"`\n}\n\ntype ListGroupsRequest_DescendantsOfGroup struct {\n\t// A group name. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID]\n\t//\n\t// Returns the descendants of the specified group.  This is a superset of\n\t// the results returned by the `children_of_group` filter, and includes\n\t// children-of-children, and so forth.\n\tDescendantsOfGroup string `protobuf:\"bytes,4,opt,name=descendants_of_group,json=descendantsOfGroup,proto3,oneof\"`\n}\n\nfunc (*ListGroupsRequest_ChildrenOfGroup) isListGroupsRequest_Filter() {}\n\nfunc (*ListGroupsRequest_AncestorsOfGroup) isListGroupsRequest_Filter() {}\n\nfunc (*ListGroupsRequest_DescendantsOfGroup) isListGroupsRequest_Filter() {}\n\n// The `ListGroups` response.\ntype ListGroupsResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The groups that match the specified filters.\n\tGroup []*Group `protobuf:\"bytes,1,rep,name=group,proto3\" json:\"group,omitempty\"`\n\t// If there are more results than have been returned, then this field is set\n\t// to a non-empty value.  To see the additional results,\n\t// use that value as `page_token` in the next call to this method.\n\tNextPageToken string `protobuf:\"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3\" json:\"next_page_token,omitempty\"`\n}\n\nfunc (x *ListGroupsResponse) Reset() {\n\t*x = ListGroupsResponse{}\n\tmi := &file_google_monitoring_v3_group_service_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListGroupsResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListGroupsResponse) ProtoMessage() {}\n\nfunc (x *ListGroupsResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_group_service_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListGroupsResponse.ProtoReflect.Descriptor instead.\nfunc (*ListGroupsResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_group_service_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *ListGroupsResponse) GetGroup() []*Group {\n\tif x != nil {\n\t\treturn x.Group\n\t}\n\treturn nil\n}\n\nfunc (x *ListGroupsResponse) GetNextPageToken() string {\n\tif x != nil {\n\t\treturn x.NextPageToken\n\t}\n\treturn \"\"\n}\n\n// The `GetGroup` request.\ntype GetGroupRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The group to retrieve. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID]\n\tName string `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *GetGroupRequest) Reset() {\n\t*x = GetGroupRequest{}\n\tmi := &file_google_monitoring_v3_group_service_proto_msgTypes[2]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *GetGroupRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetGroupRequest) ProtoMessage() {}\n\nfunc (x *GetGroupRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_group_service_proto_msgTypes[2]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetGroupRequest.ProtoReflect.Descriptor instead.\nfunc (*GetGroupRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_group_service_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *GetGroupRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\n// The `CreateGroup` request.\ntype CreateGroupRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The\n\t// [project](https://cloud.google.com/monitoring/api/v3#project_name) in which\n\t// to create the group. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\tName string `protobuf:\"bytes,4,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// Required. A group definition. It is an error to define the `name` field\n\t// because the system assigns the name.\n\tGroup *Group `protobuf:\"bytes,2,opt,name=group,proto3\" json:\"group,omitempty\"`\n\t// If true, validate this request but do not create the group.\n\tValidateOnly bool `protobuf:\"varint,3,opt,name=validate_only,json=validateOnly,proto3\" json:\"validate_only,omitempty\"`\n}\n\nfunc (x *CreateGroupRequest) Reset() {\n\t*x = CreateGroupRequest{}\n\tmi := &file_google_monitoring_v3_group_service_proto_msgTypes[3]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *CreateGroupRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateGroupRequest) ProtoMessage() {}\n\nfunc (x *CreateGroupRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_group_service_proto_msgTypes[3]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateGroupRequest.ProtoReflect.Descriptor instead.\nfunc (*CreateGroupRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_group_service_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *CreateGroupRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateGroupRequest) GetGroup() *Group {\n\tif x != nil {\n\t\treturn x.Group\n\t}\n\treturn nil\n}\n\nfunc (x *CreateGroupRequest) GetValidateOnly() bool {\n\tif x != nil {\n\t\treturn x.ValidateOnly\n\t}\n\treturn false\n}\n\n// The `UpdateGroup` request.\ntype UpdateGroupRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The new definition of the group.  All fields of the existing\n\t// group, excepting `name`, are replaced with the corresponding fields of this\n\t// group.\n\tGroup *Group `protobuf:\"bytes,2,opt,name=group,proto3\" json:\"group,omitempty\"`\n\t// If true, validate this request but do not update the existing group.\n\tValidateOnly bool `protobuf:\"varint,3,opt,name=validate_only,json=validateOnly,proto3\" json:\"validate_only,omitempty\"`\n}\n\nfunc (x *UpdateGroupRequest) Reset() {\n\t*x = UpdateGroupRequest{}\n\tmi := &file_google_monitoring_v3_group_service_proto_msgTypes[4]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UpdateGroupRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateGroupRequest) ProtoMessage() {}\n\nfunc (x *UpdateGroupRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_group_service_proto_msgTypes[4]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateGroupRequest.ProtoReflect.Descriptor instead.\nfunc (*UpdateGroupRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_group_service_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *UpdateGroupRequest) GetGroup() *Group {\n\tif x != nil {\n\t\treturn x.Group\n\t}\n\treturn nil\n}\n\nfunc (x *UpdateGroupRequest) GetValidateOnly() bool {\n\tif x != nil {\n\t\treturn x.ValidateOnly\n\t}\n\treturn false\n}\n\n// The `DeleteGroup` request. The default behavior is to be able to delete a\n// single group without any descendants.\ntype DeleteGroupRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The group to delete. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID]\n\tName string `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// If this field is true, then the request means to delete a group with all\n\t// its descendants. Otherwise, the request means to delete a group only when\n\t// it has no descendants. The default value is false.\n\tRecursive bool `protobuf:\"varint,4,opt,name=recursive,proto3\" json:\"recursive,omitempty\"`\n}\n\nfunc (x *DeleteGroupRequest) Reset() {\n\t*x = DeleteGroupRequest{}\n\tmi := &file_google_monitoring_v3_group_service_proto_msgTypes[5]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *DeleteGroupRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DeleteGroupRequest) ProtoMessage() {}\n\nfunc (x *DeleteGroupRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_group_service_proto_msgTypes[5]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DeleteGroupRequest.ProtoReflect.Descriptor instead.\nfunc (*DeleteGroupRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_group_service_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *DeleteGroupRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *DeleteGroupRequest) GetRecursive() bool {\n\tif x != nil {\n\t\treturn x.Recursive\n\t}\n\treturn false\n}\n\n// The `ListGroupMembers` request.\ntype ListGroupMembersRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The group whose members are listed. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID]\n\tName string `protobuf:\"bytes,7,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// A positive number that is the maximum number of results to return.\n\tPageSize int32 `protobuf:\"varint,3,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\t// If this field is not empty then it must contain the `next_page_token` value\n\t// returned by a previous call to this method.  Using this field causes the\n\t// method to return additional results from the previous method call.\n\tPageToken string `protobuf:\"bytes,4,opt,name=page_token,json=pageToken,proto3\" json:\"page_token,omitempty\"`\n\t// An optional [list\n\t// filter](https://cloud.google.com/monitoring/api/learn_more#filtering)\n\t// describing the members to be returned.  The filter may reference the type,\n\t// labels, and metadata of monitored resources that comprise the group. For\n\t// example, to return only resources representing Compute Engine VM instances,\n\t// use this filter:\n\t//\n\t//\t`resource.type = \"gce_instance\"`\n\tFilter string `protobuf:\"bytes,5,opt,name=filter,proto3\" json:\"filter,omitempty\"`\n\t// An optional time interval for which results should be returned. Only\n\t// members that were part of the group during the specified interval are\n\t// included in the response.  If no interval is provided then the group\n\t// membership over the last minute is returned.\n\tInterval *TimeInterval `protobuf:\"bytes,6,opt,name=interval,proto3\" json:\"interval,omitempty\"`\n}\n\nfunc (x *ListGroupMembersRequest) Reset() {\n\t*x = ListGroupMembersRequest{}\n\tmi := &file_google_monitoring_v3_group_service_proto_msgTypes[6]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListGroupMembersRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListGroupMembersRequest) ProtoMessage() {}\n\nfunc (x *ListGroupMembersRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_group_service_proto_msgTypes[6]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListGroupMembersRequest.ProtoReflect.Descriptor instead.\nfunc (*ListGroupMembersRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_group_service_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *ListGroupMembersRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListGroupMembersRequest) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListGroupMembersRequest) GetPageToken() string {\n\tif x != nil {\n\t\treturn x.PageToken\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListGroupMembersRequest) GetFilter() string {\n\tif x != nil {\n\t\treturn x.Filter\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListGroupMembersRequest) GetInterval() *TimeInterval {\n\tif x != nil {\n\t\treturn x.Interval\n\t}\n\treturn nil\n}\n\n// The `ListGroupMembers` response.\ntype ListGroupMembersResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// A set of monitored resources in the group.\n\tMembers []*monitoredres.MonitoredResource `protobuf:\"bytes,1,rep,name=members,proto3\" json:\"members,omitempty\"`\n\t// If there are more results than have been returned, then this field is\n\t// set to a non-empty value.  To see the additional results, use that value as\n\t// `page_token` in the next call to this method.\n\tNextPageToken string `protobuf:\"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3\" json:\"next_page_token,omitempty\"`\n\t// The total number of elements matching this request.\n\tTotalSize int32 `protobuf:\"varint,3,opt,name=total_size,json=totalSize,proto3\" json:\"total_size,omitempty\"`\n}\n\nfunc (x *ListGroupMembersResponse) Reset() {\n\t*x = ListGroupMembersResponse{}\n\tmi := &file_google_monitoring_v3_group_service_proto_msgTypes[7]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListGroupMembersResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListGroupMembersResponse) ProtoMessage() {}\n\nfunc (x *ListGroupMembersResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_group_service_proto_msgTypes[7]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListGroupMembersResponse.ProtoReflect.Descriptor instead.\nfunc (*ListGroupMembersResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_group_service_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ListGroupMembersResponse) GetMembers() []*monitoredres.MonitoredResource {\n\tif x != nil {\n\t\treturn x.Members\n\t}\n\treturn nil\n}\n\nfunc (x *ListGroupMembersResponse) GetNextPageToken() string {\n\tif x != nil {\n\t\treturn x.NextPageToken\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListGroupMembersResponse) GetTotalSize() int32 {\n\tif x != nil {\n\t\treturn x.TotalSize\n\t}\n\treturn 0\n}\n\nvar File_google_monitoring_v3_group_service_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_group_service_proto_rawDesc = []byte{\n\t0x0a, 0x28, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33,\n\t0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e,\n\t0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e,\n\t0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,\n\t0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69,\n\t0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x5f, 0x72,\n\t0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,\n\t0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x63,\n\t0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76,\n\t0x33, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65,\n\t0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9a, 0x03, 0x0a, 0x11, 0x4c,\n\t0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x12, 0x3b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27,\n\t0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x12, 0x1f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x52, 0x0a,\n\t0x11, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x5f, 0x6f, 0x66, 0x5f, 0x67, 0x72, 0x6f,\n\t0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00,\n\t0x52, 0x0f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x4f, 0x66, 0x47, 0x72, 0x6f, 0x75,\n\t0x70, 0x12, 0x54, 0x0a, 0x12, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x73, 0x5f, 0x6f,\n\t0x66, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0xfa,\n\t0x41, 0x21, 0x0a, 0x1f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x72,\n\t0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x10, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x73,\n\t0x4f, 0x66, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x58, 0x0a, 0x14, 0x64, 0x65, 0x73, 0x63, 0x65,\n\t0x6e, 0x64, 0x61, 0x6e, 0x74, 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69,\n\t0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x64,\n\t0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x74, 0x73, 0x4f, 0x66, 0x47, 0x72, 0x6f, 0x75,\n\t0x70, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d,\n\t0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x08, 0x0a,\n\t0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x6f, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x47,\n\t0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a,\n\t0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x2e, 0x76, 0x33, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70,\n\t0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f,\n\t0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50,\n\t0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x4e, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x47,\n\t0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41,\n\t0x21, 0x0a, 0x1f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x72, 0x6f,\n\t0x75, 0x70, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xae, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65,\n\t0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,\n\t0x3b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0,\n\t0x41, 0x02, 0xfa, 0x41, 0x21, 0x12, 0x1f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x05,\n\t0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x67,\n\t0x72, 0x6f, 0x75, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65,\n\t0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x76, 0x61, 0x6c,\n\t0x69, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x71, 0x0a, 0x12, 0x55, 0x70, 0x64,\n\t0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,\n\t0x36, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x02,\n\t0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64,\n\t0x61, 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c,\n\t0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x6f, 0x0a, 0x12,\n\t0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x12, 0x3b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,\n\t0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x22, 0xea, 0x01,\n\t0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65,\n\t0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x0a,\n\t0x1f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x72, 0x6f, 0x75, 0x70,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73,\n\t0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53,\n\t0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65,\n\t0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b,\n\t0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x08, 0x69, 0x6e,\n\t0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c,\n\t0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x9a, 0x01, 0x0a, 0x18, 0x4c,\n\t0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52,\n\t0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65,\n\t0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52,\n\t0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73,\n\t0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f,\n\t0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50,\n\t0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61,\n\t0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f,\n\t0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x32, 0x98, 0x08, 0x0a, 0x0c, 0x47, 0x72, 0x6f, 0x75,\n\t0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8c, 0x01, 0x0a, 0x0a, 0x4c, 0x69, 0x73,\n\t0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c,\n\t0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x1a, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75,\n\t0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0xda, 0x41, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x76, 0x33, 0x2f, 0x7b,\n\t0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d,\n\t0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x7d, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x47, 0x72,\n\t0x6f, 0x75, 0x70, 0x12, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72,\n\t0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2d, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d,\n\t0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x67, 0x72, 0x6f,\n\t0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x8e, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74,\n\t0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x72,\n\t0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x38, 0xda,\n\t0x41, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x82, 0xd3, 0xe4, 0x93,\n\t0x02, 0x25, 0x3a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x1c, 0x2f, 0x76, 0x33, 0x2f, 0x7b,\n\t0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d,\n\t0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61,\n\t0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55,\n\t0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x3b,\n\t0xda, 0x41, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x05,\n\t0x67, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0x24, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x67, 0x72, 0x6f, 0x75,\n\t0x70, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f,\n\t0x2a, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x7e, 0x0a, 0x0b, 0x44,\n\t0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2d, 0xda, 0x41,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x2a, 0x1e, 0x2f, 0x76, 0x33,\n\t0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f,\n\t0x2a, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xa8, 0x01, 0x0a, 0x10,\n\t0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73,\n\t0x12, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75,\n\t0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,\n\t0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70,\n\t0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,\n\t0x35, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x12, 0x26,\n\t0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,\n\t0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d,\n\t0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x1a, 0xa9, 0x01, 0xca, 0x41, 0x19, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69,\n\t0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x89, 0x01, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f,\n\t0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70,\n\t0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f,\n\t0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75,\n\t0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65,\n\t0x61, 0x64, 0x42, 0xcc, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42,\n\t0x11, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f,\n\t0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c,\n\t0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56,\n\t0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75,\n\t0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56,\n\t0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_monitoring_v3_group_service_proto_rawDescOnce sync.Once\n\tfile_google_monitoring_v3_group_service_proto_rawDescData = file_google_monitoring_v3_group_service_proto_rawDesc\n)\n\nfunc file_google_monitoring_v3_group_service_proto_rawDescGZIP() []byte {\n\tfile_google_monitoring_v3_group_service_proto_rawDescOnce.Do(func() {\n\t\tfile_google_monitoring_v3_group_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_group_service_proto_rawDescData)\n\t})\n\treturn file_google_monitoring_v3_group_service_proto_rawDescData\n}\n\nvar file_google_monitoring_v3_group_service_proto_msgTypes = make([]protoimpl.MessageInfo, 8)\nvar file_google_monitoring_v3_group_service_proto_goTypes = []any{\n\t(*ListGroupsRequest)(nil),              // 0: google.monitoring.v3.ListGroupsRequest\n\t(*ListGroupsResponse)(nil),             // 1: google.monitoring.v3.ListGroupsResponse\n\t(*GetGroupRequest)(nil),                // 2: google.monitoring.v3.GetGroupRequest\n\t(*CreateGroupRequest)(nil),             // 3: google.monitoring.v3.CreateGroupRequest\n\t(*UpdateGroupRequest)(nil),             // 4: google.monitoring.v3.UpdateGroupRequest\n\t(*DeleteGroupRequest)(nil),             // 5: google.monitoring.v3.DeleteGroupRequest\n\t(*ListGroupMembersRequest)(nil),        // 6: google.monitoring.v3.ListGroupMembersRequest\n\t(*ListGroupMembersResponse)(nil),       // 7: google.monitoring.v3.ListGroupMembersResponse\n\t(*Group)(nil),                          // 8: google.monitoring.v3.Group\n\t(*TimeInterval)(nil),                   // 9: google.monitoring.v3.TimeInterval\n\t(*monitoredres.MonitoredResource)(nil), // 10: google.api.MonitoredResource\n\t(*emptypb.Empty)(nil),                  // 11: google.protobuf.Empty\n}\nvar file_google_monitoring_v3_group_service_proto_depIdxs = []int32{\n\t8,  // 0: google.monitoring.v3.ListGroupsResponse.group:type_name -> google.monitoring.v3.Group\n\t8,  // 1: google.monitoring.v3.CreateGroupRequest.group:type_name -> google.monitoring.v3.Group\n\t8,  // 2: google.monitoring.v3.UpdateGroupRequest.group:type_name -> google.monitoring.v3.Group\n\t9,  // 3: google.monitoring.v3.ListGroupMembersRequest.interval:type_name -> google.monitoring.v3.TimeInterval\n\t10, // 4: google.monitoring.v3.ListGroupMembersResponse.members:type_name -> google.api.MonitoredResource\n\t0,  // 5: google.monitoring.v3.GroupService.ListGroups:input_type -> google.monitoring.v3.ListGroupsRequest\n\t2,  // 6: google.monitoring.v3.GroupService.GetGroup:input_type -> google.monitoring.v3.GetGroupRequest\n\t3,  // 7: google.monitoring.v3.GroupService.CreateGroup:input_type -> google.monitoring.v3.CreateGroupRequest\n\t4,  // 8: google.monitoring.v3.GroupService.UpdateGroup:input_type -> google.monitoring.v3.UpdateGroupRequest\n\t5,  // 9: google.monitoring.v3.GroupService.DeleteGroup:input_type -> google.monitoring.v3.DeleteGroupRequest\n\t6,  // 10: google.monitoring.v3.GroupService.ListGroupMembers:input_type -> google.monitoring.v3.ListGroupMembersRequest\n\t1,  // 11: google.monitoring.v3.GroupService.ListGroups:output_type -> google.monitoring.v3.ListGroupsResponse\n\t8,  // 12: google.monitoring.v3.GroupService.GetGroup:output_type -> google.monitoring.v3.Group\n\t8,  // 13: google.monitoring.v3.GroupService.CreateGroup:output_type -> google.monitoring.v3.Group\n\t8,  // 14: google.monitoring.v3.GroupService.UpdateGroup:output_type -> google.monitoring.v3.Group\n\t11, // 15: google.monitoring.v3.GroupService.DeleteGroup:output_type -> google.protobuf.Empty\n\t7,  // 16: google.monitoring.v3.GroupService.ListGroupMembers:output_type -> google.monitoring.v3.ListGroupMembersResponse\n\t11, // [11:17] is the sub-list for method output_type\n\t5,  // [5:11] is the sub-list for method input_type\n\t5,  // [5:5] is the sub-list for extension type_name\n\t5,  // [5:5] is the sub-list for extension extendee\n\t0,  // [0:5] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_group_service_proto_init() }\nfunc file_google_monitoring_v3_group_service_proto_init() {\n\tif File_google_monitoring_v3_group_service_proto != nil {\n\t\treturn\n\t}\n\tfile_google_monitoring_v3_common_proto_init()\n\tfile_google_monitoring_v3_group_proto_init()\n\tfile_google_monitoring_v3_group_service_proto_msgTypes[0].OneofWrappers = []any{\n\t\t(*ListGroupsRequest_ChildrenOfGroup)(nil),\n\t\t(*ListGroupsRequest_AncestorsOfGroup)(nil),\n\t\t(*ListGroupsRequest_DescendantsOfGroup)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_group_service_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   8,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_group_service_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_group_service_proto_depIdxs,\n\t\tMessageInfos:      file_google_monitoring_v3_group_service_proto_msgTypes,\n\t}.Build()\n\tFile_google_monitoring_v3_group_service_proto = out.File\n\tfile_google_monitoring_v3_group_service_proto_rawDesc = nil\n\tfile_google_monitoring_v3_group_service_proto_goTypes = nil\n\tfile_google_monitoring_v3_group_service_proto_depIdxs = nil\n}\n\n// Reference imports to suppress errors if they are not otherwise used.\nvar _ context.Context\nvar _ grpc.ClientConnInterface\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\nconst _ = grpc.SupportPackageIsVersion6\n\n// GroupServiceClient is the client API for GroupService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.\ntype GroupServiceClient interface {\n\t// Lists the existing groups.\n\tListGroups(ctx context.Context, in *ListGroupsRequest, opts ...grpc.CallOption) (*ListGroupsResponse, error)\n\t// Gets a single group.\n\tGetGroup(ctx context.Context, in *GetGroupRequest, opts ...grpc.CallOption) (*Group, error)\n\t// Creates a new group.\n\tCreateGroup(ctx context.Context, in *CreateGroupRequest, opts ...grpc.CallOption) (*Group, error)\n\t// Updates an existing group.\n\t// You can change any group attributes except `name`.\n\tUpdateGroup(ctx context.Context, in *UpdateGroupRequest, opts ...grpc.CallOption) (*Group, error)\n\t// Deletes an existing group.\n\tDeleteGroup(ctx context.Context, in *DeleteGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\t// Lists the monitored resources that are members of a group.\n\tListGroupMembers(ctx context.Context, in *ListGroupMembersRequest, opts ...grpc.CallOption) (*ListGroupMembersResponse, error)\n}\n\ntype groupServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewGroupServiceClient(cc grpc.ClientConnInterface) GroupServiceClient {\n\treturn &groupServiceClient{cc}\n}\n\nfunc (c *groupServiceClient) ListGroups(ctx context.Context, in *ListGroupsRequest, opts ...grpc.CallOption) (*ListGroupsResponse, error) {\n\tout := new(ListGroupsResponse)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.GroupService/ListGroups\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *groupServiceClient) GetGroup(ctx context.Context, in *GetGroupRequest, opts ...grpc.CallOption) (*Group, error) {\n\tout := new(Group)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.GroupService/GetGroup\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *groupServiceClient) CreateGroup(ctx context.Context, in *CreateGroupRequest, opts ...grpc.CallOption) (*Group, error) {\n\tout := new(Group)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.GroupService/CreateGroup\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *groupServiceClient) UpdateGroup(ctx context.Context, in *UpdateGroupRequest, opts ...grpc.CallOption) (*Group, error) {\n\tout := new(Group)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.GroupService/UpdateGroup\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *groupServiceClient) DeleteGroup(ctx context.Context, in *DeleteGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.GroupService/DeleteGroup\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *groupServiceClient) ListGroupMembers(ctx context.Context, in *ListGroupMembersRequest, opts ...grpc.CallOption) (*ListGroupMembersResponse, error) {\n\tout := new(ListGroupMembersResponse)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.GroupService/ListGroupMembers\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// GroupServiceServer is the server API for GroupService service.\ntype GroupServiceServer interface {\n\t// Lists the existing groups.\n\tListGroups(context.Context, *ListGroupsRequest) (*ListGroupsResponse, error)\n\t// Gets a single group.\n\tGetGroup(context.Context, *GetGroupRequest) (*Group, error)\n\t// Creates a new group.\n\tCreateGroup(context.Context, *CreateGroupRequest) (*Group, error)\n\t// Updates an existing group.\n\t// You can change any group attributes except `name`.\n\tUpdateGroup(context.Context, *UpdateGroupRequest) (*Group, error)\n\t// Deletes an existing group.\n\tDeleteGroup(context.Context, *DeleteGroupRequest) (*emptypb.Empty, error)\n\t// Lists the monitored resources that are members of a group.\n\tListGroupMembers(context.Context, *ListGroupMembersRequest) (*ListGroupMembersResponse, error)\n}\n\n// UnimplementedGroupServiceServer can be embedded to have forward compatible implementations.\ntype UnimplementedGroupServiceServer struct {\n}\n\nfunc (*UnimplementedGroupServiceServer) ListGroups(context.Context, *ListGroupsRequest) (*ListGroupsResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListGroups not implemented\")\n}\nfunc (*UnimplementedGroupServiceServer) GetGroup(context.Context, *GetGroupRequest) (*Group, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetGroup not implemented\")\n}\nfunc (*UnimplementedGroupServiceServer) CreateGroup(context.Context, *CreateGroupRequest) (*Group, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateGroup not implemented\")\n}\nfunc (*UnimplementedGroupServiceServer) UpdateGroup(context.Context, *UpdateGroupRequest) (*Group, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateGroup not implemented\")\n}\nfunc (*UnimplementedGroupServiceServer) DeleteGroup(context.Context, *DeleteGroupRequest) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeleteGroup not implemented\")\n}\nfunc (*UnimplementedGroupServiceServer) ListGroupMembers(context.Context, *ListGroupMembersRequest) (*ListGroupMembersResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListGroupMembers not implemented\")\n}\n\nfunc RegisterGroupServiceServer(s *grpc.Server, srv GroupServiceServer) {\n\ts.RegisterService(&_GroupService_serviceDesc, srv)\n}\n\nfunc _GroupService_ListGroups_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListGroupsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GroupServiceServer).ListGroups(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.GroupService/ListGroups\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GroupServiceServer).ListGroups(ctx, req.(*ListGroupsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _GroupService_GetGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetGroupRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GroupServiceServer).GetGroup(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.GroupService/GetGroup\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GroupServiceServer).GetGroup(ctx, req.(*GetGroupRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _GroupService_CreateGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateGroupRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GroupServiceServer).CreateGroup(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.GroupService/CreateGroup\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GroupServiceServer).CreateGroup(ctx, req.(*CreateGroupRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _GroupService_UpdateGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateGroupRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GroupServiceServer).UpdateGroup(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.GroupService/UpdateGroup\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GroupServiceServer).UpdateGroup(ctx, req.(*UpdateGroupRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _GroupService_DeleteGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(DeleteGroupRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GroupServiceServer).DeleteGroup(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.GroupService/DeleteGroup\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GroupServiceServer).DeleteGroup(ctx, req.(*DeleteGroupRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _GroupService_ListGroupMembers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListGroupMembersRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(GroupServiceServer).ListGroupMembers(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.GroupService/ListGroupMembers\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(GroupServiceServer).ListGroupMembers(ctx, req.(*ListGroupMembersRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nvar _GroupService_serviceDesc = grpc.ServiceDesc{\n\tServiceName: \"google.monitoring.v3.GroupService\",\n\tHandlerType: (*GroupServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"ListGroups\",\n\t\t\tHandler:    _GroupService_ListGroups_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetGroup\",\n\t\t\tHandler:    _GroupService_GetGroup_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateGroup\",\n\t\t\tHandler:    _GroupService_CreateGroup_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateGroup\",\n\t\t\tHandler:    _GroupService_UpdateGroup_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteGroup\",\n\t\t\tHandler:    _GroupService_DeleteGroup_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListGroupMembers\",\n\t\t\tHandler:    _GroupService_ListGroupMembers_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"google/monitoring/v3/group_service.proto\",\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/metric.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/metric.proto\n\npackage monitoringpb\n\nimport (\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\tlabel \"google.golang.org/genproto/googleapis/api/label\"\n\tmetric \"google.golang.org/genproto/googleapis/api/metric\"\n\tmonitoredres \"google.golang.org/genproto/googleapis/api/monitoredres\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// A single data point in a time series.\ntype Point struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The time interval to which the data point applies.  For `GAUGE` metrics,\n\t// the start time is optional, but if it is supplied, it must equal the\n\t// end time.  For `DELTA` metrics, the start\n\t// and end time should specify a non-zero interval, with subsequent points\n\t// specifying contiguous and non-overlapping intervals.  For `CUMULATIVE`\n\t// metrics, the start and end time should specify a non-zero interval, with\n\t// subsequent points specifying the same start time and increasing end times,\n\t// until an event resets the cumulative value to zero and sets a new start\n\t// time for the following points.\n\tInterval *TimeInterval `protobuf:\"bytes,1,opt,name=interval,proto3\" json:\"interval,omitempty\"`\n\t// The value of the data point.\n\tValue *TypedValue `protobuf:\"bytes,2,opt,name=value,proto3\" json:\"value,omitempty\"`\n}\n\nfunc (x *Point) Reset() {\n\t*x = Point{}\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Point) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Point) ProtoMessage() {}\n\nfunc (x *Point) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Point.ProtoReflect.Descriptor instead.\nfunc (*Point) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Point) GetInterval() *TimeInterval {\n\tif x != nil {\n\t\treturn x.Interval\n\t}\n\treturn nil\n}\n\nfunc (x *Point) GetValue() *TypedValue {\n\tif x != nil {\n\t\treturn x.Value\n\t}\n\treturn nil\n}\n\n// A collection of data points that describes the time-varying values\n// of a metric. A time series is identified by a combination of a\n// fully-specified monitored resource and a fully-specified metric.\n// This type is used for both listing and creating time series.\ntype TimeSeries struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The associated metric. A fully-specified metric used to identify the time\n\t// series.\n\tMetric *metric.Metric `protobuf:\"bytes,1,opt,name=metric,proto3\" json:\"metric,omitempty\"`\n\t// The associated monitored resource.  Custom metrics can use only certain\n\t// monitored resource types in their time series data. For more information,\n\t// see [Monitored resources for custom\n\t// metrics](https://cloud.google.com/monitoring/custom-metrics/creating-metrics#custom-metric-resources).\n\tResource *monitoredres.MonitoredResource `protobuf:\"bytes,2,opt,name=resource,proto3\" json:\"resource,omitempty\"`\n\t// Output only. The associated monitored resource metadata. When reading a\n\t// time series, this field will include metadata labels that are explicitly\n\t// named in the reduction. When creating a time series, this field is ignored.\n\tMetadata *monitoredres.MonitoredResourceMetadata `protobuf:\"bytes,7,opt,name=metadata,proto3\" json:\"metadata,omitempty\"`\n\t// The metric kind of the time series. When listing time series, this metric\n\t// kind might be different from the metric kind of the associated metric if\n\t// this time series is an alignment or reduction of other time series.\n\t//\n\t// When creating a time series, this field is optional. If present, it must be\n\t// the same as the metric kind of the associated metric. If the associated\n\t// metric's descriptor must be auto-created, then this field specifies the\n\t// metric kind of the new descriptor and must be either `GAUGE` (the default)\n\t// or `CUMULATIVE`.\n\tMetricKind metric.MetricDescriptor_MetricKind `protobuf:\"varint,3,opt,name=metric_kind,json=metricKind,proto3,enum=google.api.MetricDescriptor_MetricKind\" json:\"metric_kind,omitempty\"`\n\t// The value type of the time series. When listing time series, this value\n\t// type might be different from the value type of the associated metric if\n\t// this time series is an alignment or reduction of other time series.\n\t//\n\t// When creating a time series, this field is optional. If present, it must be\n\t// the same as the type of the data in the `points` field.\n\tValueType metric.MetricDescriptor_ValueType `protobuf:\"varint,4,opt,name=value_type,json=valueType,proto3,enum=google.api.MetricDescriptor_ValueType\" json:\"value_type,omitempty\"`\n\t// The data points of this time series. When listing time series, points are\n\t// returned in reverse time order.\n\t//\n\t// When creating a time series, this field must contain exactly one point and\n\t// the point's type must be the same as the value type of the associated\n\t// metric. If the associated metric's descriptor must be auto-created, then\n\t// the value type of the descriptor is determined by the point's type, which\n\t// must be `BOOL`, `INT64`, `DOUBLE`, or `DISTRIBUTION`.\n\tPoints []*Point `protobuf:\"bytes,5,rep,name=points,proto3\" json:\"points,omitempty\"`\n\t// The units in which the metric value is reported. It is only applicable\n\t// if the `value_type` is `INT64`, `DOUBLE`, or `DISTRIBUTION`. The `unit`\n\t// defines the representation of the stored metric values. This field can only\n\t// be changed through CreateTimeSeries when it is empty.\n\tUnit string `protobuf:\"bytes,8,opt,name=unit,proto3\" json:\"unit,omitempty\"`\n\t// Input only. A detailed description of the time series that will be\n\t// associated with the\n\t// [google.api.MetricDescriptor][google.api.MetricDescriptor] for the metric.\n\t// Once set, this field cannot be changed through CreateTimeSeries.\n\tDescription string `protobuf:\"bytes,9,opt,name=description,proto3\" json:\"description,omitempty\"`\n}\n\nfunc (x *TimeSeries) Reset() {\n\t*x = TimeSeries{}\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *TimeSeries) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*TimeSeries) ProtoMessage() {}\n\nfunc (x *TimeSeries) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use TimeSeries.ProtoReflect.Descriptor instead.\nfunc (*TimeSeries) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *TimeSeries) GetMetric() *metric.Metric {\n\tif x != nil {\n\t\treturn x.Metric\n\t}\n\treturn nil\n}\n\nfunc (x *TimeSeries) GetResource() *monitoredres.MonitoredResource {\n\tif x != nil {\n\t\treturn x.Resource\n\t}\n\treturn nil\n}\n\nfunc (x *TimeSeries) GetMetadata() *monitoredres.MonitoredResourceMetadata {\n\tif x != nil {\n\t\treturn x.Metadata\n\t}\n\treturn nil\n}\n\nfunc (x *TimeSeries) GetMetricKind() metric.MetricDescriptor_MetricKind {\n\tif x != nil {\n\t\treturn x.MetricKind\n\t}\n\treturn metric.MetricDescriptor_MetricKind(0)\n}\n\nfunc (x *TimeSeries) GetValueType() metric.MetricDescriptor_ValueType {\n\tif x != nil {\n\t\treturn x.ValueType\n\t}\n\treturn metric.MetricDescriptor_ValueType(0)\n}\n\nfunc (x *TimeSeries) GetPoints() []*Point {\n\tif x != nil {\n\t\treturn x.Points\n\t}\n\treturn nil\n}\n\nfunc (x *TimeSeries) GetUnit() string {\n\tif x != nil {\n\t\treturn x.Unit\n\t}\n\treturn \"\"\n}\n\nfunc (x *TimeSeries) GetDescription() string {\n\tif x != nil {\n\t\treturn x.Description\n\t}\n\treturn \"\"\n}\n\n// A descriptor for the labels and points in a time series.\ntype TimeSeriesDescriptor struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Descriptors for the labels.\n\tLabelDescriptors []*label.LabelDescriptor `protobuf:\"bytes,1,rep,name=label_descriptors,json=labelDescriptors,proto3\" json:\"label_descriptors,omitempty\"`\n\t// Descriptors for the point data value columns.\n\tPointDescriptors []*TimeSeriesDescriptor_ValueDescriptor `protobuf:\"bytes,5,rep,name=point_descriptors,json=pointDescriptors,proto3\" json:\"point_descriptors,omitempty\"`\n}\n\nfunc (x *TimeSeriesDescriptor) Reset() {\n\t*x = TimeSeriesDescriptor{}\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[2]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *TimeSeriesDescriptor) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*TimeSeriesDescriptor) ProtoMessage() {}\n\nfunc (x *TimeSeriesDescriptor) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[2]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use TimeSeriesDescriptor.ProtoReflect.Descriptor instead.\nfunc (*TimeSeriesDescriptor) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *TimeSeriesDescriptor) GetLabelDescriptors() []*label.LabelDescriptor {\n\tif x != nil {\n\t\treturn x.LabelDescriptors\n\t}\n\treturn nil\n}\n\nfunc (x *TimeSeriesDescriptor) GetPointDescriptors() []*TimeSeriesDescriptor_ValueDescriptor {\n\tif x != nil {\n\t\treturn x.PointDescriptors\n\t}\n\treturn nil\n}\n\n// Represents the values of a time series associated with a\n// TimeSeriesDescriptor.\ntype TimeSeriesData struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The values of the labels in the time series identifier, given in the same\n\t// order as the `label_descriptors` field of the TimeSeriesDescriptor\n\t// associated with this object. Each value must have a value of the type\n\t// given in the corresponding entry of `label_descriptors`.\n\tLabelValues []*LabelValue `protobuf:\"bytes,1,rep,name=label_values,json=labelValues,proto3\" json:\"label_values,omitempty\"`\n\t// The points in the time series.\n\tPointData []*TimeSeriesData_PointData `protobuf:\"bytes,2,rep,name=point_data,json=pointData,proto3\" json:\"point_data,omitempty\"`\n}\n\nfunc (x *TimeSeriesData) Reset() {\n\t*x = TimeSeriesData{}\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[3]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *TimeSeriesData) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*TimeSeriesData) ProtoMessage() {}\n\nfunc (x *TimeSeriesData) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[3]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use TimeSeriesData.ProtoReflect.Descriptor instead.\nfunc (*TimeSeriesData) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *TimeSeriesData) GetLabelValues() []*LabelValue {\n\tif x != nil {\n\t\treturn x.LabelValues\n\t}\n\treturn nil\n}\n\nfunc (x *TimeSeriesData) GetPointData() []*TimeSeriesData_PointData {\n\tif x != nil {\n\t\treturn x.PointData\n\t}\n\treturn nil\n}\n\n// A label value.\ntype LabelValue struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The label value can be a bool, int64, or string.\n\t//\n\t// Types that are assignable to Value:\n\t//\n\t//\t*LabelValue_BoolValue\n\t//\t*LabelValue_Int64Value\n\t//\t*LabelValue_StringValue\n\tValue isLabelValue_Value `protobuf_oneof:\"value\"`\n}\n\nfunc (x *LabelValue) Reset() {\n\t*x = LabelValue{}\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[4]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *LabelValue) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LabelValue) ProtoMessage() {}\n\nfunc (x *LabelValue) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[4]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LabelValue.ProtoReflect.Descriptor instead.\nfunc (*LabelValue) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (m *LabelValue) GetValue() isLabelValue_Value {\n\tif m != nil {\n\t\treturn m.Value\n\t}\n\treturn nil\n}\n\nfunc (x *LabelValue) GetBoolValue() bool {\n\tif x, ok := x.GetValue().(*LabelValue_BoolValue); ok {\n\t\treturn x.BoolValue\n\t}\n\treturn false\n}\n\nfunc (x *LabelValue) GetInt64Value() int64 {\n\tif x, ok := x.GetValue().(*LabelValue_Int64Value); ok {\n\t\treturn x.Int64Value\n\t}\n\treturn 0\n}\n\nfunc (x *LabelValue) GetStringValue() string {\n\tif x, ok := x.GetValue().(*LabelValue_StringValue); ok {\n\t\treturn x.StringValue\n\t}\n\treturn \"\"\n}\n\ntype isLabelValue_Value interface {\n\tisLabelValue_Value()\n}\n\ntype LabelValue_BoolValue struct {\n\t// A bool label value.\n\tBoolValue bool `protobuf:\"varint,1,opt,name=bool_value,json=boolValue,proto3,oneof\"`\n}\n\ntype LabelValue_Int64Value struct {\n\t// An int64 label value.\n\tInt64Value int64 `protobuf:\"varint,2,opt,name=int64_value,json=int64Value,proto3,oneof\"`\n}\n\ntype LabelValue_StringValue struct {\n\t// A string label value.\n\tStringValue string `protobuf:\"bytes,3,opt,name=string_value,json=stringValue,proto3,oneof\"`\n}\n\nfunc (*LabelValue_BoolValue) isLabelValue_Value() {}\n\nfunc (*LabelValue_Int64Value) isLabelValue_Value() {}\n\nfunc (*LabelValue_StringValue) isLabelValue_Value() {}\n\n// An error associated with a query in the time series query language format.\ntype QueryError struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The location of the time series query language text that this error applies\n\t// to.\n\tLocator *TextLocator `protobuf:\"bytes,1,opt,name=locator,proto3\" json:\"locator,omitempty\"`\n\t// The error message.\n\tMessage string `protobuf:\"bytes,2,opt,name=message,proto3\" json:\"message,omitempty\"`\n}\n\nfunc (x *QueryError) Reset() {\n\t*x = QueryError{}\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[5]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *QueryError) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*QueryError) ProtoMessage() {}\n\nfunc (x *QueryError) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[5]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use QueryError.ProtoReflect.Descriptor instead.\nfunc (*QueryError) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *QueryError) GetLocator() *TextLocator {\n\tif x != nil {\n\t\treturn x.Locator\n\t}\n\treturn nil\n}\n\nfunc (x *QueryError) GetMessage() string {\n\tif x != nil {\n\t\treturn x.Message\n\t}\n\treturn \"\"\n}\n\n// A locator for text. Indicates a particular part of the text of a request or\n// of an object referenced in the request.\n//\n// For example, suppose the request field `text` contains:\n//\n//\ttext: \"The quick brown fox jumps over the lazy dog.\"\n//\n// Then the locator:\n//\n//\tsource: \"text\"\n//\tstart_position {\n//\t  line: 1\n//\t  column: 17\n//\t}\n//\tend_position {\n//\t  line: 1\n//\t  column: 19\n//\t}\n//\n// refers to the part of the text: \"fox\".\ntype TextLocator struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The source of the text. The source may be a field in the request, in which\n\t// case its format is the format of the\n\t// google.rpc.BadRequest.FieldViolation.field field in\n\t// https://cloud.google.com/apis/design/errors#error_details. It may also be\n\t// be a source other than the request field (e.g. a macro definition\n\t// referenced in the text of the query), in which case this is the name of\n\t// the source (e.g. the macro name).\n\tSource string `protobuf:\"bytes,1,opt,name=source,proto3\" json:\"source,omitempty\"`\n\t// The position of the first byte within the text.\n\tStartPosition *TextLocator_Position `protobuf:\"bytes,2,opt,name=start_position,json=startPosition,proto3\" json:\"start_position,omitempty\"`\n\t// The position of the last byte within the text.\n\tEndPosition *TextLocator_Position `protobuf:\"bytes,3,opt,name=end_position,json=endPosition,proto3\" json:\"end_position,omitempty\"`\n\t// If `source`, `start_position`, and `end_position` describe a call on\n\t// some object (e.g. a macro in the time series query language text) and a\n\t// location is to be designated in that object's text, `nested_locator`\n\t// identifies the location within that object.\n\tNestedLocator *TextLocator `protobuf:\"bytes,4,opt,name=nested_locator,json=nestedLocator,proto3\" json:\"nested_locator,omitempty\"`\n\t// When `nested_locator` is set, this field gives the reason for the nesting.\n\t// Usually, the reason is a macro invocation. In that case, the macro name\n\t// (including the leading '@') signals the location of the macro call\n\t// in the text and a macro argument name (including the leading '$') signals\n\t// the location of the macro argument inside the macro body that got\n\t// substituted away.\n\tNestingReason string `protobuf:\"bytes,5,opt,name=nesting_reason,json=nestingReason,proto3\" json:\"nesting_reason,omitempty\"`\n}\n\nfunc (x *TextLocator) Reset() {\n\t*x = TextLocator{}\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[6]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *TextLocator) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*TextLocator) ProtoMessage() {}\n\nfunc (x *TextLocator) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[6]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use TextLocator.ProtoReflect.Descriptor instead.\nfunc (*TextLocator) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *TextLocator) GetSource() string {\n\tif x != nil {\n\t\treturn x.Source\n\t}\n\treturn \"\"\n}\n\nfunc (x *TextLocator) GetStartPosition() *TextLocator_Position {\n\tif x != nil {\n\t\treturn x.StartPosition\n\t}\n\treturn nil\n}\n\nfunc (x *TextLocator) GetEndPosition() *TextLocator_Position {\n\tif x != nil {\n\t\treturn x.EndPosition\n\t}\n\treturn nil\n}\n\nfunc (x *TextLocator) GetNestedLocator() *TextLocator {\n\tif x != nil {\n\t\treturn x.NestedLocator\n\t}\n\treturn nil\n}\n\nfunc (x *TextLocator) GetNestingReason() string {\n\tif x != nil {\n\t\treturn x.NestingReason\n\t}\n\treturn \"\"\n}\n\n// A descriptor for the value columns in a data point.\ntype TimeSeriesDescriptor_ValueDescriptor struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The value key.\n\tKey string `protobuf:\"bytes,1,opt,name=key,proto3\" json:\"key,omitempty\"`\n\t// The value type.\n\tValueType metric.MetricDescriptor_ValueType `protobuf:\"varint,2,opt,name=value_type,json=valueType,proto3,enum=google.api.MetricDescriptor_ValueType\" json:\"value_type,omitempty\"`\n\t// The value stream kind.\n\tMetricKind metric.MetricDescriptor_MetricKind `protobuf:\"varint,3,opt,name=metric_kind,json=metricKind,proto3,enum=google.api.MetricDescriptor_MetricKind\" json:\"metric_kind,omitempty\"`\n\t// The unit in which `time_series` point values are reported. `unit`\n\t// follows the UCUM format for units as seen in\n\t// https://unitsofmeasure.org/ucum.html.\n\t// `unit` is only valid if `value_type` is INTEGER, DOUBLE, DISTRIBUTION.\n\tUnit string `protobuf:\"bytes,4,opt,name=unit,proto3\" json:\"unit,omitempty\"`\n}\n\nfunc (x *TimeSeriesDescriptor_ValueDescriptor) Reset() {\n\t*x = TimeSeriesDescriptor_ValueDescriptor{}\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[7]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *TimeSeriesDescriptor_ValueDescriptor) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*TimeSeriesDescriptor_ValueDescriptor) ProtoMessage() {}\n\nfunc (x *TimeSeriesDescriptor_ValueDescriptor) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[7]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use TimeSeriesDescriptor_ValueDescriptor.ProtoReflect.Descriptor instead.\nfunc (*TimeSeriesDescriptor_ValueDescriptor) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{2, 0}\n}\n\nfunc (x *TimeSeriesDescriptor_ValueDescriptor) GetKey() string {\n\tif x != nil {\n\t\treturn x.Key\n\t}\n\treturn \"\"\n}\n\nfunc (x *TimeSeriesDescriptor_ValueDescriptor) GetValueType() metric.MetricDescriptor_ValueType {\n\tif x != nil {\n\t\treturn x.ValueType\n\t}\n\treturn metric.MetricDescriptor_ValueType(0)\n}\n\nfunc (x *TimeSeriesDescriptor_ValueDescriptor) GetMetricKind() metric.MetricDescriptor_MetricKind {\n\tif x != nil {\n\t\treturn x.MetricKind\n\t}\n\treturn metric.MetricDescriptor_MetricKind(0)\n}\n\nfunc (x *TimeSeriesDescriptor_ValueDescriptor) GetUnit() string {\n\tif x != nil {\n\t\treturn x.Unit\n\t}\n\treturn \"\"\n}\n\n// A point's value columns and time interval. Each point has one or more\n// point values corresponding to the entries in `point_descriptors` field in\n// the TimeSeriesDescriptor associated with this object.\ntype TimeSeriesData_PointData struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The values that make up the point.\n\tValues []*TypedValue `protobuf:\"bytes,1,rep,name=values,proto3\" json:\"values,omitempty\"`\n\t// The time interval associated with the point.\n\tTimeInterval *TimeInterval `protobuf:\"bytes,2,opt,name=time_interval,json=timeInterval,proto3\" json:\"time_interval,omitempty\"`\n}\n\nfunc (x *TimeSeriesData_PointData) Reset() {\n\t*x = TimeSeriesData_PointData{}\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[8]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *TimeSeriesData_PointData) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*TimeSeriesData_PointData) ProtoMessage() {}\n\nfunc (x *TimeSeriesData_PointData) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[8]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use TimeSeriesData_PointData.ProtoReflect.Descriptor instead.\nfunc (*TimeSeriesData_PointData) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{3, 0}\n}\n\nfunc (x *TimeSeriesData_PointData) GetValues() []*TypedValue {\n\tif x != nil {\n\t\treturn x.Values\n\t}\n\treturn nil\n}\n\nfunc (x *TimeSeriesData_PointData) GetTimeInterval() *TimeInterval {\n\tif x != nil {\n\t\treturn x.TimeInterval\n\t}\n\treturn nil\n}\n\n// The position of a byte within the text.\ntype TextLocator_Position struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The line, starting with 1, where the byte is positioned.\n\tLine int32 `protobuf:\"varint,1,opt,name=line,proto3\" json:\"line,omitempty\"`\n\t// The column within the line, starting with 1, where the byte is\n\t// positioned. This is a byte index even though the text is UTF-8.\n\tColumn int32 `protobuf:\"varint,2,opt,name=column,proto3\" json:\"column,omitempty\"`\n}\n\nfunc (x *TextLocator_Position) Reset() {\n\t*x = TextLocator_Position{}\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[9]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *TextLocator_Position) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*TextLocator_Position) ProtoMessage() {}\n\nfunc (x *TextLocator_Position) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_proto_msgTypes[9]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use TextLocator_Position.ProtoReflect.Descriptor instead.\nfunc (*TextLocator_Position) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{6, 0}\n}\n\nfunc (x *TextLocator_Position) GetLine() int32 {\n\tif x != nil {\n\t\treturn x.Line\n\t}\n\treturn 0\n}\n\nfunc (x *TextLocator_Position) GetColumn() int32 {\n\tif x != nil {\n\t\treturn x.Column\n\t}\n\treturn 0\n}\n\nvar File_google_monitoring_v3_metric_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_metric_proto_rawDesc = []byte{\n\t0x0a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x16, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65,\n\t0x74, 0x72, 0x69, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64,\n\t0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x22, 0x7f, 0x0a, 0x05, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x69,\n\t0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61,\n\t0x6c, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x36, 0x0a, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x22, 0xb2, 0x03, 0x0a, 0x0a, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69,\n\t0x65, 0x73, 0x12, 0x2a, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e,\n\t0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x39,\n\t0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52,\n\t0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x6d, 0x65, 0x74,\n\t0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,\n\t0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x48, 0x0a, 0x0b,\n\t0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0e, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d,\n\t0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e,\n\t0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6d, 0x65, 0x74, 0x72,\n\t0x69, 0x63, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f,\n\t0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65,\n\t0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79,\n\t0x70, 0x65, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a,\n\t0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e,\n\t0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73,\n\t0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x94, 0x03, 0x0a, 0x14, 0x54, 0x69, 0x6d,\n\t0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f,\n\t0x72, 0x12, 0x48, 0x0a, 0x11, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72,\n\t0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x44,\n\t0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x10, 0x6c, 0x61, 0x62, 0x65, 0x6c,\n\t0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x67, 0x0a, 0x11, 0x70,\n\t0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73,\n\t0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69,\n\t0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,\n\t0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,\n\t0x6f, 0x72, 0x52, 0x10, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,\n\t0x74, 0x6f, 0x72, 0x73, 0x1a, 0xc8, 0x01, 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65,\n\t0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x45, 0x0a, 0x0a, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x72,\n\t0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c,\n\t0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79, 0x70,\n\t0x65, 0x12, 0x48, 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6b, 0x69, 0x6e, 0x64,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69,\n\t0x70, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4b, 0x69, 0x6e, 0x64, 0x52,\n\t0x0a, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75,\n\t0x6e, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x22,\n\t0xb5, 0x02, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x44, 0x61,\n\t0x74, 0x61, 0x12, 0x43, 0x0a, 0x0c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75,\n\t0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e,\n\t0x4c, 0x61, 0x62, 0x65, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x6c, 0x61, 0x62, 0x65,\n\t0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x4d, 0x0a, 0x0a, 0x70, 0x6f, 0x69, 0x6e, 0x74,\n\t0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x44, 0x61, 0x74,\n\t0x61, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x09, 0x70, 0x6f, 0x69,\n\t0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x8e, 0x01, 0x0a, 0x09, 0x50, 0x6f, 0x69, 0x6e, 0x74,\n\t0x44, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65,\n\t0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x47,\n\t0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d,\n\t0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x49,\n\t0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x7e, 0x0a, 0x0a, 0x4c, 0x61, 0x62, 0x65, 0x6c,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f,\n\t0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f,\n\t0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x69,\n\t0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72,\n\t0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48,\n\t0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07,\n\t0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x63, 0x0a, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79,\n\t0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x3b, 0x0a, 0x07, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x65,\n\t0x78, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x07, 0x6c, 0x6f, 0x63, 0x61, 0x74,\n\t0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xf0, 0x02, 0x0a,\n\t0x0b, 0x54, 0x65, 0x78, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06,\n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f,\n\t0x75, 0x72, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f,\n\t0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x2e, 0x76, 0x33, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x2e,\n\t0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50,\n\t0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x0c, 0x65, 0x6e, 0x64, 0x5f, 0x70,\n\t0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,\n\t0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x65, 0x6e, 0x64, 0x50, 0x6f,\n\t0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x0e, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64,\n\t0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f,\n\t0x72, 0x52, 0x0d, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72,\n\t0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x61, 0x73,\n\t0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e,\n\t0x67, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x1a, 0x36, 0x0a, 0x08, 0x50, 0x6f, 0x73, 0x69, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x05, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d,\n\t0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x42,\n\t0xc6, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x0b, 0x4d, 0x65,\n\t0x74, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f,\n\t0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f,\n\t0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76,\n\t0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70,\n\t0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02,\n\t0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_monitoring_v3_metric_proto_rawDescOnce sync.Once\n\tfile_google_monitoring_v3_metric_proto_rawDescData = file_google_monitoring_v3_metric_proto_rawDesc\n)\n\nfunc file_google_monitoring_v3_metric_proto_rawDescGZIP() []byte {\n\tfile_google_monitoring_v3_metric_proto_rawDescOnce.Do(func() {\n\t\tfile_google_monitoring_v3_metric_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_metric_proto_rawDescData)\n\t})\n\treturn file_google_monitoring_v3_metric_proto_rawDescData\n}\n\nvar file_google_monitoring_v3_metric_proto_msgTypes = make([]protoimpl.MessageInfo, 10)\nvar file_google_monitoring_v3_metric_proto_goTypes = []any{\n\t(*Point)(nil),                                  // 0: google.monitoring.v3.Point\n\t(*TimeSeries)(nil),                             // 1: google.monitoring.v3.TimeSeries\n\t(*TimeSeriesDescriptor)(nil),                   // 2: google.monitoring.v3.TimeSeriesDescriptor\n\t(*TimeSeriesData)(nil),                         // 3: google.monitoring.v3.TimeSeriesData\n\t(*LabelValue)(nil),                             // 4: google.monitoring.v3.LabelValue\n\t(*QueryError)(nil),                             // 5: google.monitoring.v3.QueryError\n\t(*TextLocator)(nil),                            // 6: google.monitoring.v3.TextLocator\n\t(*TimeSeriesDescriptor_ValueDescriptor)(nil),   // 7: google.monitoring.v3.TimeSeriesDescriptor.ValueDescriptor\n\t(*TimeSeriesData_PointData)(nil),               // 8: google.monitoring.v3.TimeSeriesData.PointData\n\t(*TextLocator_Position)(nil),                   // 9: google.monitoring.v3.TextLocator.Position\n\t(*TimeInterval)(nil),                           // 10: google.monitoring.v3.TimeInterval\n\t(*TypedValue)(nil),                             // 11: google.monitoring.v3.TypedValue\n\t(*metric.Metric)(nil),                          // 12: google.api.Metric\n\t(*monitoredres.MonitoredResource)(nil),         // 13: google.api.MonitoredResource\n\t(*monitoredres.MonitoredResourceMetadata)(nil), // 14: google.api.MonitoredResourceMetadata\n\t(metric.MetricDescriptor_MetricKind)(0),        // 15: google.api.MetricDescriptor.MetricKind\n\t(metric.MetricDescriptor_ValueType)(0),         // 16: google.api.MetricDescriptor.ValueType\n\t(*label.LabelDescriptor)(nil),                  // 17: google.api.LabelDescriptor\n}\nvar file_google_monitoring_v3_metric_proto_depIdxs = []int32{\n\t10, // 0: google.monitoring.v3.Point.interval:type_name -> google.monitoring.v3.TimeInterval\n\t11, // 1: google.monitoring.v3.Point.value:type_name -> google.monitoring.v3.TypedValue\n\t12, // 2: google.monitoring.v3.TimeSeries.metric:type_name -> google.api.Metric\n\t13, // 3: google.monitoring.v3.TimeSeries.resource:type_name -> google.api.MonitoredResource\n\t14, // 4: google.monitoring.v3.TimeSeries.metadata:type_name -> google.api.MonitoredResourceMetadata\n\t15, // 5: google.monitoring.v3.TimeSeries.metric_kind:type_name -> google.api.MetricDescriptor.MetricKind\n\t16, // 6: google.monitoring.v3.TimeSeries.value_type:type_name -> google.api.MetricDescriptor.ValueType\n\t0,  // 7: google.monitoring.v3.TimeSeries.points:type_name -> google.monitoring.v3.Point\n\t17, // 8: google.monitoring.v3.TimeSeriesDescriptor.label_descriptors:type_name -> google.api.LabelDescriptor\n\t7,  // 9: google.monitoring.v3.TimeSeriesDescriptor.point_descriptors:type_name -> google.monitoring.v3.TimeSeriesDescriptor.ValueDescriptor\n\t4,  // 10: google.monitoring.v3.TimeSeriesData.label_values:type_name -> google.monitoring.v3.LabelValue\n\t8,  // 11: google.monitoring.v3.TimeSeriesData.point_data:type_name -> google.monitoring.v3.TimeSeriesData.PointData\n\t6,  // 12: google.monitoring.v3.QueryError.locator:type_name -> google.monitoring.v3.TextLocator\n\t9,  // 13: google.monitoring.v3.TextLocator.start_position:type_name -> google.monitoring.v3.TextLocator.Position\n\t9,  // 14: google.monitoring.v3.TextLocator.end_position:type_name -> google.monitoring.v3.TextLocator.Position\n\t6,  // 15: google.monitoring.v3.TextLocator.nested_locator:type_name -> google.monitoring.v3.TextLocator\n\t16, // 16: google.monitoring.v3.TimeSeriesDescriptor.ValueDescriptor.value_type:type_name -> google.api.MetricDescriptor.ValueType\n\t15, // 17: google.monitoring.v3.TimeSeriesDescriptor.ValueDescriptor.metric_kind:type_name -> google.api.MetricDescriptor.MetricKind\n\t11, // 18: google.monitoring.v3.TimeSeriesData.PointData.values:type_name -> google.monitoring.v3.TypedValue\n\t10, // 19: google.monitoring.v3.TimeSeriesData.PointData.time_interval:type_name -> google.monitoring.v3.TimeInterval\n\t20, // [20:20] is the sub-list for method output_type\n\t20, // [20:20] is the sub-list for method input_type\n\t20, // [20:20] is the sub-list for extension type_name\n\t20, // [20:20] is the sub-list for extension extendee\n\t0,  // [0:20] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_metric_proto_init() }\nfunc file_google_monitoring_v3_metric_proto_init() {\n\tif File_google_monitoring_v3_metric_proto != nil {\n\t\treturn\n\t}\n\tfile_google_monitoring_v3_common_proto_init()\n\tfile_google_monitoring_v3_metric_proto_msgTypes[4].OneofWrappers = []any{\n\t\t(*LabelValue_BoolValue)(nil),\n\t\t(*LabelValue_Int64Value)(nil),\n\t\t(*LabelValue_StringValue)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_metric_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   10,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_metric_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_metric_proto_depIdxs,\n\t\tMessageInfos:      file_google_monitoring_v3_metric_proto_msgTypes,\n\t}.Build()\n\tFile_google_monitoring_v3_metric_proto = out.File\n\tfile_google_monitoring_v3_metric_proto_rawDesc = nil\n\tfile_google_monitoring_v3_metric_proto_goTypes = nil\n\tfile_google_monitoring_v3_metric_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/metric_service.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/metric_service.proto\n\npackage monitoringpb\n\nimport (\n\tcontext \"context\"\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tmetric \"google.golang.org/genproto/googleapis/api/metric\"\n\tmonitoredres \"google.golang.org/genproto/googleapis/api/monitoredres\"\n\tstatus \"google.golang.org/genproto/googleapis/rpc/status\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus1 \"google.golang.org/grpc/status\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// Controls which fields are returned by `ListTimeSeries*`.\ntype ListTimeSeriesRequest_TimeSeriesView int32\n\nconst (\n\t// Returns the identity of the metric(s), the time series,\n\t// and the time series data.\n\tListTimeSeriesRequest_FULL ListTimeSeriesRequest_TimeSeriesView = 0\n\t// Returns the identity of the metric and the time series resource,\n\t// but not the time series data.\n\tListTimeSeriesRequest_HEADERS ListTimeSeriesRequest_TimeSeriesView = 1\n)\n\n// Enum value maps for ListTimeSeriesRequest_TimeSeriesView.\nvar (\n\tListTimeSeriesRequest_TimeSeriesView_name = map[int32]string{\n\t\t0: \"FULL\",\n\t\t1: \"HEADERS\",\n\t}\n\tListTimeSeriesRequest_TimeSeriesView_value = map[string]int32{\n\t\t\"FULL\":    0,\n\t\t\"HEADERS\": 1,\n\t}\n)\n\nfunc (x ListTimeSeriesRequest_TimeSeriesView) Enum() *ListTimeSeriesRequest_TimeSeriesView {\n\tp := new(ListTimeSeriesRequest_TimeSeriesView)\n\t*p = x\n\treturn p\n}\n\nfunc (x ListTimeSeriesRequest_TimeSeriesView) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ListTimeSeriesRequest_TimeSeriesView) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_metric_service_proto_enumTypes[0].Descriptor()\n}\n\nfunc (ListTimeSeriesRequest_TimeSeriesView) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_metric_service_proto_enumTypes[0]\n}\n\nfunc (x ListTimeSeriesRequest_TimeSeriesView) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ListTimeSeriesRequest_TimeSeriesView.Descriptor instead.\nfunc (ListTimeSeriesRequest_TimeSeriesView) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{8, 0}\n}\n\n// The `ListMonitoredResourceDescriptors` request.\ntype ListMonitoredResourceDescriptorsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The\n\t// [project](https://cloud.google.com/monitoring/api/v3#project_name) on which\n\t// to execute the request. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\tName string `protobuf:\"bytes,5,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// An optional [filter](https://cloud.google.com/monitoring/api/v3/filters)\n\t// describing the descriptors to be returned.  The filter can reference the\n\t// descriptor's type and labels. For example, the following filter returns\n\t// only Google Compute Engine descriptors that have an `id` label:\n\t//\n\t//\tresource.type = starts_with(\"gce_\") AND resource.label:id\n\tFilter string `protobuf:\"bytes,2,opt,name=filter,proto3\" json:\"filter,omitempty\"`\n\t// A positive number that is the maximum number of results to return.\n\tPageSize int32 `protobuf:\"varint,3,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\t// If this field is not empty then it must contain the `nextPageToken` value\n\t// returned by a previous call to this method.  Using this field causes the\n\t// method to return additional results from the previous method call.\n\tPageToken string `protobuf:\"bytes,4,opt,name=page_token,json=pageToken,proto3\" json:\"page_token,omitempty\"`\n}\n\nfunc (x *ListMonitoredResourceDescriptorsRequest) Reset() {\n\t*x = ListMonitoredResourceDescriptorsRequest{}\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListMonitoredResourceDescriptorsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListMonitoredResourceDescriptorsRequest) ProtoMessage() {}\n\nfunc (x *ListMonitoredResourceDescriptorsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListMonitoredResourceDescriptorsRequest.ProtoReflect.Descriptor instead.\nfunc (*ListMonitoredResourceDescriptorsRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ListMonitoredResourceDescriptorsRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListMonitoredResourceDescriptorsRequest) GetFilter() string {\n\tif x != nil {\n\t\treturn x.Filter\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListMonitoredResourceDescriptorsRequest) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListMonitoredResourceDescriptorsRequest) GetPageToken() string {\n\tif x != nil {\n\t\treturn x.PageToken\n\t}\n\treturn \"\"\n}\n\n// The `ListMonitoredResourceDescriptors` response.\ntype ListMonitoredResourceDescriptorsResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The monitored resource descriptors that are available to this project\n\t// and that match `filter`, if present.\n\tResourceDescriptors []*monitoredres.MonitoredResourceDescriptor `protobuf:\"bytes,1,rep,name=resource_descriptors,json=resourceDescriptors,proto3\" json:\"resource_descriptors,omitempty\"`\n\t// If there are more results than have been returned, then this field is set\n\t// to a non-empty value.  To see the additional results,\n\t// use that value as `page_token` in the next call to this method.\n\tNextPageToken string `protobuf:\"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3\" json:\"next_page_token,omitempty\"`\n}\n\nfunc (x *ListMonitoredResourceDescriptorsResponse) Reset() {\n\t*x = ListMonitoredResourceDescriptorsResponse{}\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListMonitoredResourceDescriptorsResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListMonitoredResourceDescriptorsResponse) ProtoMessage() {}\n\nfunc (x *ListMonitoredResourceDescriptorsResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListMonitoredResourceDescriptorsResponse.ProtoReflect.Descriptor instead.\nfunc (*ListMonitoredResourceDescriptorsResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *ListMonitoredResourceDescriptorsResponse) GetResourceDescriptors() []*monitoredres.MonitoredResourceDescriptor {\n\tif x != nil {\n\t\treturn x.ResourceDescriptors\n\t}\n\treturn nil\n}\n\nfunc (x *ListMonitoredResourceDescriptorsResponse) GetNextPageToken() string {\n\tif x != nil {\n\t\treturn x.NextPageToken\n\t}\n\treturn \"\"\n}\n\n// The `GetMonitoredResourceDescriptor` request.\ntype GetMonitoredResourceDescriptorRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The monitored resource descriptor to get.  The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/monitoredResourceDescriptors/[RESOURCE_TYPE]\n\t//\n\t// The `[RESOURCE_TYPE]` is a predefined type, such as\n\t// `cloudsql_database`.\n\tName string `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *GetMonitoredResourceDescriptorRequest) Reset() {\n\t*x = GetMonitoredResourceDescriptorRequest{}\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[2]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *GetMonitoredResourceDescriptorRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetMonitoredResourceDescriptorRequest) ProtoMessage() {}\n\nfunc (x *GetMonitoredResourceDescriptorRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[2]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetMonitoredResourceDescriptorRequest.ProtoReflect.Descriptor instead.\nfunc (*GetMonitoredResourceDescriptorRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *GetMonitoredResourceDescriptorRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\n// The `ListMetricDescriptors` request.\ntype ListMetricDescriptorsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The\n\t// [project](https://cloud.google.com/monitoring/api/v3#project_name) on which\n\t// to execute the request. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\tName string `protobuf:\"bytes,5,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// Optional. If this field is empty, all custom and\n\t// system-defined metric descriptors are returned.\n\t// Otherwise, the [filter](https://cloud.google.com/monitoring/api/v3/filters)\n\t// specifies which metric descriptors are to be\n\t// returned. For example, the following filter matches all\n\t// [custom metrics](https://cloud.google.com/monitoring/custom-metrics):\n\t//\n\t//\tmetric.type = starts_with(\"custom.googleapis.com/\")\n\tFilter string `protobuf:\"bytes,2,opt,name=filter,proto3\" json:\"filter,omitempty\"`\n\t// Optional. A positive number that is the maximum number of results to\n\t// return. The default and maximum value is 10,000. If a page_size <= 0 or >\n\t// 10,000 is submitted, will instead return a maximum of 10,000 results.\n\tPageSize int32 `protobuf:\"varint,3,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\t// Optional. If this field is not empty then it must contain the\n\t// `nextPageToken` value returned by a previous call to this method.  Using\n\t// this field causes the method to return additional results from the previous\n\t// method call.\n\tPageToken string `protobuf:\"bytes,4,opt,name=page_token,json=pageToken,proto3\" json:\"page_token,omitempty\"`\n\t// Optional. If true, only metrics and monitored resource types that have\n\t// recent data (within roughly 25 hours) will be included in the response.\n\t//   - If a metric descriptor enumerates monitored resource types, only the\n\t//     monitored resource types for which the metric type has recent data will\n\t//     be included in the returned metric descriptor, and if none of them have\n\t//     recent data, the metric descriptor will not be returned.\n\t//   - If a metric descriptor does not enumerate the compatible monitored\n\t//     resource types, it will be returned only if the metric type has recent\n\t//     data for some monitored resource type. The returned descriptor will not\n\t//     enumerate any monitored resource types.\n\tActiveOnly bool `protobuf:\"varint,6,opt,name=active_only,json=activeOnly,proto3\" json:\"active_only,omitempty\"`\n}\n\nfunc (x *ListMetricDescriptorsRequest) Reset() {\n\t*x = ListMetricDescriptorsRequest{}\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[3]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListMetricDescriptorsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListMetricDescriptorsRequest) ProtoMessage() {}\n\nfunc (x *ListMetricDescriptorsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[3]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListMetricDescriptorsRequest.ProtoReflect.Descriptor instead.\nfunc (*ListMetricDescriptorsRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *ListMetricDescriptorsRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListMetricDescriptorsRequest) GetFilter() string {\n\tif x != nil {\n\t\treturn x.Filter\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListMetricDescriptorsRequest) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListMetricDescriptorsRequest) GetPageToken() string {\n\tif x != nil {\n\t\treturn x.PageToken\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListMetricDescriptorsRequest) GetActiveOnly() bool {\n\tif x != nil {\n\t\treturn x.ActiveOnly\n\t}\n\treturn false\n}\n\n// The `ListMetricDescriptors` response.\ntype ListMetricDescriptorsResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The metric descriptors that are available to the project\n\t// and that match the value of `filter`, if present.\n\tMetricDescriptors []*metric.MetricDescriptor `protobuf:\"bytes,1,rep,name=metric_descriptors,json=metricDescriptors,proto3\" json:\"metric_descriptors,omitempty\"`\n\t// If there are more results than have been returned, then this field is set\n\t// to a non-empty value.  To see the additional results,\n\t// use that value as `page_token` in the next call to this method.\n\tNextPageToken string `protobuf:\"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3\" json:\"next_page_token,omitempty\"`\n}\n\nfunc (x *ListMetricDescriptorsResponse) Reset() {\n\t*x = ListMetricDescriptorsResponse{}\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[4]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListMetricDescriptorsResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListMetricDescriptorsResponse) ProtoMessage() {}\n\nfunc (x *ListMetricDescriptorsResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[4]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListMetricDescriptorsResponse.ProtoReflect.Descriptor instead.\nfunc (*ListMetricDescriptorsResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *ListMetricDescriptorsResponse) GetMetricDescriptors() []*metric.MetricDescriptor {\n\tif x != nil {\n\t\treturn x.MetricDescriptors\n\t}\n\treturn nil\n}\n\nfunc (x *ListMetricDescriptorsResponse) GetNextPageToken() string {\n\tif x != nil {\n\t\treturn x.NextPageToken\n\t}\n\treturn \"\"\n}\n\n// The `GetMetricDescriptor` request.\ntype GetMetricDescriptorRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The metric descriptor on which to execute the request. The format\n\t// is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/metricDescriptors/[METRIC_ID]\n\t//\n\t// An example value of `[METRIC_ID]` is\n\t// `\"compute.googleapis.com/instance/disk/read_bytes_count\"`.\n\tName string `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *GetMetricDescriptorRequest) Reset() {\n\t*x = GetMetricDescriptorRequest{}\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[5]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *GetMetricDescriptorRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetMetricDescriptorRequest) ProtoMessage() {}\n\nfunc (x *GetMetricDescriptorRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[5]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetMetricDescriptorRequest.ProtoReflect.Descriptor instead.\nfunc (*GetMetricDescriptorRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *GetMetricDescriptorRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\n// The `CreateMetricDescriptor` request.\ntype CreateMetricDescriptorRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The\n\t// [project](https://cloud.google.com/monitoring/api/v3#project_name) on which\n\t// to execute the request. The format is:\n\t// 4\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\tName string `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// Required. The new [custom\n\t// metric](https://cloud.google.com/monitoring/custom-metrics) descriptor.\n\tMetricDescriptor *metric.MetricDescriptor `protobuf:\"bytes,2,opt,name=metric_descriptor,json=metricDescriptor,proto3\" json:\"metric_descriptor,omitempty\"`\n}\n\nfunc (x *CreateMetricDescriptorRequest) Reset() {\n\t*x = CreateMetricDescriptorRequest{}\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[6]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *CreateMetricDescriptorRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateMetricDescriptorRequest) ProtoMessage() {}\n\nfunc (x *CreateMetricDescriptorRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[6]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateMetricDescriptorRequest.ProtoReflect.Descriptor instead.\nfunc (*CreateMetricDescriptorRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *CreateMetricDescriptorRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateMetricDescriptorRequest) GetMetricDescriptor() *metric.MetricDescriptor {\n\tif x != nil {\n\t\treturn x.MetricDescriptor\n\t}\n\treturn nil\n}\n\n// The `DeleteMetricDescriptor` request.\ntype DeleteMetricDescriptorRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The metric descriptor on which to execute the request. The format\n\t// is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/metricDescriptors/[METRIC_ID]\n\t//\n\t// An example of `[METRIC_ID]` is:\n\t// `\"custom.googleapis.com/my_test_metric\"`.\n\tName string `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *DeleteMetricDescriptorRequest) Reset() {\n\t*x = DeleteMetricDescriptorRequest{}\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[7]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *DeleteMetricDescriptorRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DeleteMetricDescriptorRequest) ProtoMessage() {}\n\nfunc (x *DeleteMetricDescriptorRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[7]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DeleteMetricDescriptorRequest.ProtoReflect.Descriptor instead.\nfunc (*DeleteMetricDescriptorRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *DeleteMetricDescriptorRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\n// The `ListTimeSeries` request.\ntype ListTimeSeriesRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The\n\t// [project](https://cloud.google.com/monitoring/api/v3#project_name),\n\t// organization or folder on which to execute the request. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\t//\torganizations/[ORGANIZATION_ID]\n\t//\tfolders/[FOLDER_ID]\n\tName string `protobuf:\"bytes,10,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// Required. A [monitoring\n\t// filter](https://cloud.google.com/monitoring/api/v3/filters) that specifies\n\t// which time series should be returned.  The filter must specify a single\n\t// metric type, and can additionally specify metric labels and other\n\t// information. For example:\n\t//\n\t//\tmetric.type = \"compute.googleapis.com/instance/cpu/usage_time\" AND\n\t//\t    metric.labels.instance_name = \"my-instance-name\"\n\tFilter string `protobuf:\"bytes,2,opt,name=filter,proto3\" json:\"filter,omitempty\"`\n\t// Required. The time interval for which results should be returned. Only time\n\t// series that contain data points in the specified interval are included in\n\t// the response.\n\tInterval *TimeInterval `protobuf:\"bytes,4,opt,name=interval,proto3\" json:\"interval,omitempty\"`\n\t// Specifies the alignment of data points in individual time series as\n\t// well as how to combine the retrieved time series across specified labels.\n\t//\n\t// By default (if no `aggregation` is explicitly specified), the raw time\n\t// series data is returned.\n\tAggregation *Aggregation `protobuf:\"bytes,5,opt,name=aggregation,proto3\" json:\"aggregation,omitempty\"`\n\t// Apply a second aggregation after `aggregation` is applied. May only be\n\t// specified if `aggregation` is specified.\n\tSecondaryAggregation *Aggregation `protobuf:\"bytes,11,opt,name=secondary_aggregation,json=secondaryAggregation,proto3\" json:\"secondary_aggregation,omitempty\"`\n\t// Unsupported: must be left blank. The points in each time series are\n\t// currently returned in reverse time order (most recent to oldest).\n\tOrderBy string `protobuf:\"bytes,6,opt,name=order_by,json=orderBy,proto3\" json:\"order_by,omitempty\"`\n\t// Required. Specifies which information is returned about the time series.\n\tView ListTimeSeriesRequest_TimeSeriesView `protobuf:\"varint,7,opt,name=view,proto3,enum=google.monitoring.v3.ListTimeSeriesRequest_TimeSeriesView\" json:\"view,omitempty\"`\n\t// A positive number that is the maximum number of results to return. If\n\t// `page_size` is empty or more than 100,000 results, the effective\n\t// `page_size` is 100,000 results. If `view` is set to `FULL`, this is the\n\t// maximum number of `Points` returned. If `view` is set to `HEADERS`, this is\n\t// the maximum number of `TimeSeries` returned.\n\tPageSize int32 `protobuf:\"varint,8,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\t// If this field is not empty then it must contain the `nextPageToken` value\n\t// returned by a previous call to this method.  Using this field causes the\n\t// method to return additional results from the previous method call.\n\tPageToken string `protobuf:\"bytes,9,opt,name=page_token,json=pageToken,proto3\" json:\"page_token,omitempty\"`\n}\n\nfunc (x *ListTimeSeriesRequest) Reset() {\n\t*x = ListTimeSeriesRequest{}\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[8]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListTimeSeriesRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListTimeSeriesRequest) ProtoMessage() {}\n\nfunc (x *ListTimeSeriesRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[8]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListTimeSeriesRequest.ProtoReflect.Descriptor instead.\nfunc (*ListTimeSeriesRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *ListTimeSeriesRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListTimeSeriesRequest) GetFilter() string {\n\tif x != nil {\n\t\treturn x.Filter\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListTimeSeriesRequest) GetInterval() *TimeInterval {\n\tif x != nil {\n\t\treturn x.Interval\n\t}\n\treturn nil\n}\n\nfunc (x *ListTimeSeriesRequest) GetAggregation() *Aggregation {\n\tif x != nil {\n\t\treturn x.Aggregation\n\t}\n\treturn nil\n}\n\nfunc (x *ListTimeSeriesRequest) GetSecondaryAggregation() *Aggregation {\n\tif x != nil {\n\t\treturn x.SecondaryAggregation\n\t}\n\treturn nil\n}\n\nfunc (x *ListTimeSeriesRequest) GetOrderBy() string {\n\tif x != nil {\n\t\treturn x.OrderBy\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListTimeSeriesRequest) GetView() ListTimeSeriesRequest_TimeSeriesView {\n\tif x != nil {\n\t\treturn x.View\n\t}\n\treturn ListTimeSeriesRequest_FULL\n}\n\nfunc (x *ListTimeSeriesRequest) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListTimeSeriesRequest) GetPageToken() string {\n\tif x != nil {\n\t\treturn x.PageToken\n\t}\n\treturn \"\"\n}\n\n// The `ListTimeSeries` response.\ntype ListTimeSeriesResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// One or more time series that match the filter included in the request.\n\tTimeSeries []*TimeSeries `protobuf:\"bytes,1,rep,name=time_series,json=timeSeries,proto3\" json:\"time_series,omitempty\"`\n\t// If there are more results than have been returned, then this field is set\n\t// to a non-empty value.  To see the additional results,\n\t// use that value as `page_token` in the next call to this method.\n\tNextPageToken string `protobuf:\"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3\" json:\"next_page_token,omitempty\"`\n\t// Query execution errors that may have caused the time series data returned\n\t// to be incomplete.\n\tExecutionErrors []*status.Status `protobuf:\"bytes,3,rep,name=execution_errors,json=executionErrors,proto3\" json:\"execution_errors,omitempty\"`\n\t// The unit in which all `time_series` point values are reported. `unit`\n\t// follows the UCUM format for units as seen in\n\t// https://unitsofmeasure.org/ucum.html.\n\t// If different `time_series` have different units (for example, because they\n\t// come from different metric types, or a unit is absent), then `unit` will be\n\t// \"{not_a_unit}\".\n\tUnit string `protobuf:\"bytes,5,opt,name=unit,proto3\" json:\"unit,omitempty\"`\n}\n\nfunc (x *ListTimeSeriesResponse) Reset() {\n\t*x = ListTimeSeriesResponse{}\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[9]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListTimeSeriesResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListTimeSeriesResponse) ProtoMessage() {}\n\nfunc (x *ListTimeSeriesResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[9]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListTimeSeriesResponse.ProtoReflect.Descriptor instead.\nfunc (*ListTimeSeriesResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *ListTimeSeriesResponse) GetTimeSeries() []*TimeSeries {\n\tif x != nil {\n\t\treturn x.TimeSeries\n\t}\n\treturn nil\n}\n\nfunc (x *ListTimeSeriesResponse) GetNextPageToken() string {\n\tif x != nil {\n\t\treturn x.NextPageToken\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListTimeSeriesResponse) GetExecutionErrors() []*status.Status {\n\tif x != nil {\n\t\treturn x.ExecutionErrors\n\t}\n\treturn nil\n}\n\nfunc (x *ListTimeSeriesResponse) GetUnit() string {\n\tif x != nil {\n\t\treturn x.Unit\n\t}\n\treturn \"\"\n}\n\n// The `CreateTimeSeries` request.\ntype CreateTimeSeriesRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The\n\t// [project](https://cloud.google.com/monitoring/api/v3#project_name) on which\n\t// to execute the request. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\tName string `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// Required. The new data to be added to a list of time series.\n\t// Adds at most one data point to each of several time series.  The new data\n\t// point must be more recent than any other point in its time series.  Each\n\t// `TimeSeries` value must fully specify a unique time series by supplying\n\t// all label values for the metric and the monitored resource.\n\t//\n\t// The maximum number of `TimeSeries` objects per `Create` request is 200.\n\tTimeSeries []*TimeSeries `protobuf:\"bytes,2,rep,name=time_series,json=timeSeries,proto3\" json:\"time_series,omitempty\"`\n}\n\nfunc (x *CreateTimeSeriesRequest) Reset() {\n\t*x = CreateTimeSeriesRequest{}\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[10]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *CreateTimeSeriesRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateTimeSeriesRequest) ProtoMessage() {}\n\nfunc (x *CreateTimeSeriesRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[10]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateTimeSeriesRequest.ProtoReflect.Descriptor instead.\nfunc (*CreateTimeSeriesRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *CreateTimeSeriesRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateTimeSeriesRequest) GetTimeSeries() []*TimeSeries {\n\tif x != nil {\n\t\treturn x.TimeSeries\n\t}\n\treturn nil\n}\n\n// DEPRECATED. Used to hold per-time-series error status.\ntype CreateTimeSeriesError struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// DEPRECATED. Time series ID that resulted in the `status` error.\n\t//\n\t// Deprecated: Marked as deprecated in google/monitoring/v3/metric_service.proto.\n\tTimeSeries *TimeSeries `protobuf:\"bytes,1,opt,name=time_series,json=timeSeries,proto3\" json:\"time_series,omitempty\"`\n\t// DEPRECATED. The status of the requested write operation for `time_series`.\n\t//\n\t// Deprecated: Marked as deprecated in google/monitoring/v3/metric_service.proto.\n\tStatus *status.Status `protobuf:\"bytes,2,opt,name=status,proto3\" json:\"status,omitempty\"`\n}\n\nfunc (x *CreateTimeSeriesError) Reset() {\n\t*x = CreateTimeSeriesError{}\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[11]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *CreateTimeSeriesError) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateTimeSeriesError) ProtoMessage() {}\n\nfunc (x *CreateTimeSeriesError) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[11]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateTimeSeriesError.ProtoReflect.Descriptor instead.\nfunc (*CreateTimeSeriesError) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{11}\n}\n\n// Deprecated: Marked as deprecated in google/monitoring/v3/metric_service.proto.\nfunc (x *CreateTimeSeriesError) GetTimeSeries() *TimeSeries {\n\tif x != nil {\n\t\treturn x.TimeSeries\n\t}\n\treturn nil\n}\n\n// Deprecated: Marked as deprecated in google/monitoring/v3/metric_service.proto.\nfunc (x *CreateTimeSeriesError) GetStatus() *status.Status {\n\tif x != nil {\n\t\treturn x.Status\n\t}\n\treturn nil\n}\n\n// Summary of the result of a failed request to write data to a time series.\ntype CreateTimeSeriesSummary struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The number of points in the request.\n\tTotalPointCount int32 `protobuf:\"varint,1,opt,name=total_point_count,json=totalPointCount,proto3\" json:\"total_point_count,omitempty\"`\n\t// The number of points that were successfully written.\n\tSuccessPointCount int32 `protobuf:\"varint,2,opt,name=success_point_count,json=successPointCount,proto3\" json:\"success_point_count,omitempty\"`\n\t// The number of points that failed to be written. Order is not guaranteed.\n\tErrors []*CreateTimeSeriesSummary_Error `protobuf:\"bytes,3,rep,name=errors,proto3\" json:\"errors,omitempty\"`\n}\n\nfunc (x *CreateTimeSeriesSummary) Reset() {\n\t*x = CreateTimeSeriesSummary{}\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[12]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *CreateTimeSeriesSummary) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateTimeSeriesSummary) ProtoMessage() {}\n\nfunc (x *CreateTimeSeriesSummary) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[12]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateTimeSeriesSummary.ProtoReflect.Descriptor instead.\nfunc (*CreateTimeSeriesSummary) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *CreateTimeSeriesSummary) GetTotalPointCount() int32 {\n\tif x != nil {\n\t\treturn x.TotalPointCount\n\t}\n\treturn 0\n}\n\nfunc (x *CreateTimeSeriesSummary) GetSuccessPointCount() int32 {\n\tif x != nil {\n\t\treturn x.SuccessPointCount\n\t}\n\treturn 0\n}\n\nfunc (x *CreateTimeSeriesSummary) GetErrors() []*CreateTimeSeriesSummary_Error {\n\tif x != nil {\n\t\treturn x.Errors\n\t}\n\treturn nil\n}\n\n// The `QueryTimeSeries` request. For information about the status of\n// Monitoring Query Language (MQL), see the [MQL deprecation\n// notice](https://cloud.google.com/stackdriver/docs/deprecations/mql).\n//\n// Deprecated: Marked as deprecated in google/monitoring/v3/metric_service.proto.\ntype QueryTimeSeriesRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The\n\t// [project](https://cloud.google.com/monitoring/api/v3#project_name) on which\n\t// to execute the request. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// Required. The query in the [Monitoring Query\n\t// Language](https://cloud.google.com/monitoring/mql/reference) format.\n\t// The default time zone is in UTC.\n\tQuery string `protobuf:\"bytes,7,opt,name=query,proto3\" json:\"query,omitempty\"`\n\t// A positive number that is the maximum number of time_series_data to return.\n\tPageSize int32 `protobuf:\"varint,9,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\t// If this field is not empty then it must contain the `nextPageToken` value\n\t// returned by a previous call to this method.  Using this field causes the\n\t// method to return additional results from the previous method call.\n\tPageToken string `protobuf:\"bytes,10,opt,name=page_token,json=pageToken,proto3\" json:\"page_token,omitempty\"`\n}\n\nfunc (x *QueryTimeSeriesRequest) Reset() {\n\t*x = QueryTimeSeriesRequest{}\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[13]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *QueryTimeSeriesRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*QueryTimeSeriesRequest) ProtoMessage() {}\n\nfunc (x *QueryTimeSeriesRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[13]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use QueryTimeSeriesRequest.ProtoReflect.Descriptor instead.\nfunc (*QueryTimeSeriesRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *QueryTimeSeriesRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *QueryTimeSeriesRequest) GetQuery() string {\n\tif x != nil {\n\t\treturn x.Query\n\t}\n\treturn \"\"\n}\n\nfunc (x *QueryTimeSeriesRequest) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *QueryTimeSeriesRequest) GetPageToken() string {\n\tif x != nil {\n\t\treturn x.PageToken\n\t}\n\treturn \"\"\n}\n\n// The `QueryTimeSeries` response. For information about the status of\n// Monitoring Query Language (MQL), see the [MQL deprecation\n// notice](https://cloud.google.com/stackdriver/docs/deprecations/mql).\n//\n// Deprecated: Marked as deprecated in google/monitoring/v3/metric_service.proto.\ntype QueryTimeSeriesResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The descriptor for the time series data.\n\tTimeSeriesDescriptor *TimeSeriesDescriptor `protobuf:\"bytes,8,opt,name=time_series_descriptor,json=timeSeriesDescriptor,proto3\" json:\"time_series_descriptor,omitempty\"`\n\t// The time series data.\n\tTimeSeriesData []*TimeSeriesData `protobuf:\"bytes,9,rep,name=time_series_data,json=timeSeriesData,proto3\" json:\"time_series_data,omitempty\"`\n\t// If there are more results than have been returned, then this field is set\n\t// to a non-empty value.  To see the additional results, use that value as\n\t// `page_token` in the next call to this method.\n\tNextPageToken string `protobuf:\"bytes,10,opt,name=next_page_token,json=nextPageToken,proto3\" json:\"next_page_token,omitempty\"`\n\t// Query execution errors that may have caused the time series data returned\n\t// to be incomplete. The available data will be available in the\n\t// response.\n\tPartialErrors []*status.Status `protobuf:\"bytes,11,rep,name=partial_errors,json=partialErrors,proto3\" json:\"partial_errors,omitempty\"`\n}\n\nfunc (x *QueryTimeSeriesResponse) Reset() {\n\t*x = QueryTimeSeriesResponse{}\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[14]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *QueryTimeSeriesResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*QueryTimeSeriesResponse) ProtoMessage() {}\n\nfunc (x *QueryTimeSeriesResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[14]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use QueryTimeSeriesResponse.ProtoReflect.Descriptor instead.\nfunc (*QueryTimeSeriesResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *QueryTimeSeriesResponse) GetTimeSeriesDescriptor() *TimeSeriesDescriptor {\n\tif x != nil {\n\t\treturn x.TimeSeriesDescriptor\n\t}\n\treturn nil\n}\n\nfunc (x *QueryTimeSeriesResponse) GetTimeSeriesData() []*TimeSeriesData {\n\tif x != nil {\n\t\treturn x.TimeSeriesData\n\t}\n\treturn nil\n}\n\nfunc (x *QueryTimeSeriesResponse) GetNextPageToken() string {\n\tif x != nil {\n\t\treturn x.NextPageToken\n\t}\n\treturn \"\"\n}\n\nfunc (x *QueryTimeSeriesResponse) GetPartialErrors() []*status.Status {\n\tif x != nil {\n\t\treturn x.PartialErrors\n\t}\n\treturn nil\n}\n\n// This is an error detail intended to be used with INVALID_ARGUMENT errors.\ntype QueryErrorList struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Errors in parsing the time series query language text. The number of errors\n\t// in the response may be limited.\n\tErrors []*QueryError `protobuf:\"bytes,1,rep,name=errors,proto3\" json:\"errors,omitempty\"`\n\t// A summary of all the errors.\n\tErrorSummary string `protobuf:\"bytes,2,opt,name=error_summary,json=errorSummary,proto3\" json:\"error_summary,omitempty\"`\n}\n\nfunc (x *QueryErrorList) Reset() {\n\t*x = QueryErrorList{}\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[15]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *QueryErrorList) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*QueryErrorList) ProtoMessage() {}\n\nfunc (x *QueryErrorList) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[15]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use QueryErrorList.ProtoReflect.Descriptor instead.\nfunc (*QueryErrorList) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{15}\n}\n\nfunc (x *QueryErrorList) GetErrors() []*QueryError {\n\tif x != nil {\n\t\treturn x.Errors\n\t}\n\treturn nil\n}\n\nfunc (x *QueryErrorList) GetErrorSummary() string {\n\tif x != nil {\n\t\treturn x.ErrorSummary\n\t}\n\treturn \"\"\n}\n\n// Detailed information about an error category.\ntype CreateTimeSeriesSummary_Error struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The status of the requested write operation.\n\tStatus *status.Status `protobuf:\"bytes,1,opt,name=status,proto3\" json:\"status,omitempty\"`\n\t// The number of points that couldn't be written because of `status`.\n\tPointCount int32 `protobuf:\"varint,2,opt,name=point_count,json=pointCount,proto3\" json:\"point_count,omitempty\"`\n}\n\nfunc (x *CreateTimeSeriesSummary_Error) Reset() {\n\t*x = CreateTimeSeriesSummary_Error{}\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[16]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *CreateTimeSeriesSummary_Error) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateTimeSeriesSummary_Error) ProtoMessage() {}\n\nfunc (x *CreateTimeSeriesSummary_Error) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_metric_service_proto_msgTypes[16]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateTimeSeriesSummary_Error.ProtoReflect.Descriptor instead.\nfunc (*CreateTimeSeriesSummary_Error) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{12, 0}\n}\n\nfunc (x *CreateTimeSeriesSummary_Error) GetStatus() *status.Status {\n\tif x != nil {\n\t\treturn x.Status\n\t}\n\treturn nil\n}\n\nfunc (x *CreateTimeSeriesSummary_Error) GetPointCount() int32 {\n\tif x != nil {\n\t\treturn x.PointCount\n\t}\n\treturn 0\n}\n\nvar File_google_monitoring_v3_metric_service_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_metric_service_proto_rawDesc = []byte{\n\t0x0a, 0x29, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e,\n\t0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65,\n\t0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76,\n\t0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,\n\t0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6d, 0x65, 0x74, 0x72,\n\t0x69, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70,\n\t0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd0,\n\t0x01, 0x0a, 0x27, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64,\n\t0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,\n\t0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3d, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x37,\n\t0x12, 0x35, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73,\n\t0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a,\n\t0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66,\n\t0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69,\n\t0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69,\n\t0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65,\n\t0x6e, 0x22, 0xae, 0x01, 0x0a, 0x28, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72,\n\t0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a,\n\t0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72,\n\t0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72,\n\t0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x13, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44,\n\t0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65,\n\t0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b,\n\t0x65, 0x6e, 0x22, 0x7a, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69,\n\t0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3d, 0xe0, 0x41, 0x02, 0xfa, 0x41,\n\t0x37, 0x0a, 0x35, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65,\n\t0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xef,\n\t0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73,\n\t0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,\n\t0x46, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x32, 0xe0,\n\t0x41, 0x02, 0xfa, 0x41, 0x2c, 0x12, 0x2a, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f,\n\t0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65,\n\t0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x66, 0x69,\n\t0x6c, 0x74, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a,\n\t0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, 0x61,\n\t0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74,\n\t0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,\n\t0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x24, 0x0a, 0x0b, 0x61, 0x63,\n\t0x74, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x42,\n\t0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4f, 0x6e, 0x6c, 0x79,\n\t0x22, 0x94, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44,\n\t0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x12, 0x4b, 0x0a, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x64, 0x65, 0x73,\n\t0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x72,\n\t0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x11, 0x6d, 0x65,\n\t0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12,\n\t0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b,\n\t0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61,\n\t0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x64, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4d, 0x65,\n\t0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x32, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2c, 0x0a, 0x2a, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70,\n\t0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73,\n\t0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01,\n\t0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65,\n\t0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,\n\t0x46, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x32, 0xe0,\n\t0x41, 0x02, 0xfa, 0x41, 0x2c, 0x12, 0x2a, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f,\n\t0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69,\n\t0x63, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e,\n\t0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72,\n\t0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x10, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73,\n\t0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x22, 0x67, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74,\n\t0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f,\n\t0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x32, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2c, 0x0a, 0x2a,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63,\n\t0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x22, 0xad, 0x04, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72,\n\t0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2c, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x26,\n\t0x12, 0x24, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x69, 0x6d, 0x65,\n\t0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x06,\n\t0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41,\n\t0x02, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x08, 0x69, 0x6e, 0x74,\n\t0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42,\n\t0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x43,\n\t0x0a, 0x0b, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65,\n\t0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x56, 0x0a, 0x15, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79,\n\t0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x14, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79,\n\t0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f,\n\t0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x53, 0x0a, 0x04, 0x76, 0x69, 0x65, 0x77, 0x18, 0x07,\n\t0x20, 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74,\n\t0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x56, 0x69, 0x65, 0x77,\n\t0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x76, 0x69, 0x65, 0x77, 0x12, 0x1b, 0x0a, 0x09, 0x70,\n\t0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08,\n\t0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65,\n\t0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61,\n\t0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x27, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x53,\n\t0x65, 0x72, 0x69, 0x65, 0x73, 0x56, 0x69, 0x65, 0x77, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c,\n\t0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x53, 0x10, 0x01,\n\t0x22, 0xd6, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72,\n\t0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0b, 0x74,\n\t0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69,\n\t0x65, 0x73, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26,\n\t0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65,\n\t0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67,\n\t0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x3d, 0x0a, 0x10, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74,\n\t0x61, 0x74, 0x75, 0x73, 0x52, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45,\n\t0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x72,\n\t0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x33, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2d, 0x0a, 0x2b, 0x63, 0x6c, 0x6f,\n\t0x75, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65,\n\t0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x46,\n\t0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53,\n\t0x65, 0x72, 0x69, 0x65, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65,\n\t0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0x8e, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74,\n\t0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x45, 0x72, 0x72, 0x6f, 0x72,\n\t0x12, 0x45, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d,\n\t0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x74, 0x69, 0x6d,\n\t0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,\n\t0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x02, 0x18, 0x01, 0x52,\n\t0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x98, 0x02, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61,\n\t0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x6d,\n\t0x61, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x69,\n\t0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f,\n\t0x74, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12,\n\t0x2e, 0x0a, 0x13, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74,\n\t0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x73, 0x75,\n\t0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12,\n\t0x4b, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d,\n\t0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x2e, 0x45,\n\t0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x1a, 0x54, 0x0a, 0x05,\n\t0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72,\n\t0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,\n\t0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x75,\n\t0x6e, 0x74, 0x22, 0x8c, 0x01, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65,\n\t0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18,\n\t0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72,\n\t0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x09,\n\t0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d,\n\t0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x02, 0x18,\n\t0x01, 0x22, 0xb2, 0x02, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x53,\n\t0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a,\n\t0x16, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x73,\n\t0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x44,\n\t0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x14, 0x74, 0x69, 0x6d, 0x65, 0x53,\n\t0x65, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12,\n\t0x4e, 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64,\n\t0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33,\n\t0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52,\n\t0x0e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12,\n\t0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b,\n\t0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61,\n\t0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69,\n\t0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61,\n\t0x74, 0x75, 0x73, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f,\n\t0x72, 0x73, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x6f, 0x0a, 0x0e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45,\n\t0x72, 0x72, 0x6f, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f,\n\t0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e,\n\t0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f,\n\t0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x73, 0x75, 0x6d, 0x6d,\n\t0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72,\n\t0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x32, 0xbc, 0x0f, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x72,\n\t0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xe4, 0x01, 0x0a, 0x20, 0x4c, 0x69,\n\t0x73, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75,\n\t0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x3d,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72,\n\t0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69,\n\t0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0xda,\n\t0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32, 0x2f, 0x76,\n\t0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73,\n\t0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73,\n\t0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73,\n\t0x12, 0xcc, 0x01, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65,\n\t0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,\n\t0x74, 0x6f, 0x72, 0x12, 0x3b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44,\n\t0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x1a, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44,\n\t0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x22, 0x44, 0xda, 0x41, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e,\n\t0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,\n\t0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x2a, 0x2a, 0x7d, 0x12,\n\t0xb8, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65,\n\t0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33,\n\t0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72,\n\t0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44,\n\t0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x22, 0x36, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02,\n\t0x29, 0x12, 0x27, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f,\n\t0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44,\n\t0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x13, 0x47,\n\t0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,\n\t0x6f, 0x72, 0x12, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74,\n\t0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70,\n\t0x69, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,\n\t0x6f, 0x72, 0x22, 0x39, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02,\n\t0x2c, 0x12, 0x2a, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f,\n\t0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65,\n\t0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x2a, 0x2a, 0x7d, 0x12, 0xc8, 0x01,\n\t0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65,\n\t0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e,\n\t0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63,\n\t0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69,\n\t0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x22, 0x5b, 0xda, 0x41, 0x16,\n\t0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x64, 0x65, 0x73, 0x63,\n\t0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x3a, 0x11, 0x6d, 0x65,\n\t0x74, 0x72, 0x69, 0x63, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x22,\n\t0x27, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65,\n\t0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73,\n\t0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x16, 0x44, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,\n\t0x74, 0x6f, 0x72, 0x12, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74,\n\t0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f,\n\t0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,\n\t0x22, 0x39, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x2a,\n\t0x2a, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65,\n\t0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63,\n\t0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x2a, 0x2a, 0x7d, 0x12, 0xfe, 0x01, 0x0a, 0x0e,\n\t0x4c, 0x69, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2b,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65,\n\t0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65,\n\t0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x90, 0x01, 0xda, 0x41, 0x19, 0x6e,\n\t0x61, 0x6d, 0x65, 0x2c, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2c, 0x69, 0x6e, 0x74, 0x65, 0x72,\n\t0x76, 0x61, 0x6c, 0x2c, 0x76, 0x69, 0x65, 0x77, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x6e, 0x5a, 0x27,\n\t0x12, 0x25, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6f, 0x72, 0x67, 0x61,\n\t0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x74, 0x69, 0x6d,\n\t0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5a, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x33, 0x2f, 0x7b,\n\t0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x2f,\n\t0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x20, 0x2f, 0x76, 0x33, 0x2f,\n\t0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a,\n\t0x7d, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x99, 0x01, 0x0a,\n\t0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65,\n\t0x73, 0x12, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54,\n\t0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3e, 0xda, 0x41, 0x10, 0x6e, 0x61, 0x6d,\n\t0x65, 0x2c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x82, 0xd3, 0xe4,\n\t0x93, 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x22, 0x20, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d,\n\t0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x74, 0x69,\n\t0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0xae, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65,\n\t0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65,\n\t0x72, 0x69, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61,\n\t0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x4c, 0xda, 0x41, 0x10,\n\t0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73,\n\t0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x3a, 0x01, 0x2a, 0x22, 0x2e, 0x2f, 0x76, 0x33, 0x2f, 0x7b,\n\t0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d,\n\t0x2f, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x3a, 0x63, 0x72, 0x65, 0x61,\n\t0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0xda, 0x01, 0xca, 0x41, 0x19, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0xba, 0x01, 0x68, 0x74, 0x74, 0x70,\n\t0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70,\n\t0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75,\n\t0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73,\n\t0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69,\n\t0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77,\n\t0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x2e, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77,\n\t0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x89, 0x08, 0xea, 0x41, 0xf0, 0x01, 0x0a, 0x2a, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44,\n\t0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x3b, 0x70, 0x72, 0x6f, 0x6a, 0x65,\n\t0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6d, 0x65,\n\t0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f,\n\t0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,\n\t0x6f, 0x72, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x45, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72,\n\t0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x64,\n\t0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x39, 0x66,\n\t0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f,\n\t0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72,\n\t0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,\n\t0x70, 0x74, 0x6f, 0x72, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x01, 0x2a, 0x20, 0x01, 0xea, 0x41, 0xb7,\n\t0x02, 0x0a, 0x35, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65,\n\t0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x4f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,\n\t0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65,\n\t0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65,\n\t0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x7d, 0x12, 0x59, 0x6f, 0x72, 0x67, 0x61, 0x6e,\n\t0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69,\n\t0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65,\n\t0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,\n\t0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x5f,\n\t0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,\n\t0x74, 0x6f, 0x72, 0x7d, 0x12, 0x4d, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66,\n\t0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64,\n\t0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,\n\t0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x5f, 0x72,\n\t0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,\n\t0x6f, 0x72, 0x7d, 0x12, 0x01, 0x2a, 0x20, 0x01, 0xea, 0x41, 0x51, 0x0a, 0x23, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70,\n\t0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65,\n\t0x12, 0x12, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a,\n\t0x65, 0x63, 0x74, 0x7d, 0x12, 0x16, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73,\n\t0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0xea, 0x41, 0xb5, 0x01,\n\t0x0a, 0x24, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x69, 0x6d, 0x65,\n\t0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73,\n\t0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x53,\n\t0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69,\n\t0x65, 0x73, 0x7d, 0x12, 0x35, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x7d, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x69,\n\t0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x7d, 0x12, 0x29, 0x66, 0x6f, 0x6c, 0x64,\n\t0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x74, 0x69, 0x6d,\n\t0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65,\n\t0x72, 0x69, 0x65, 0x73, 0x7d, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42,\n\t0x12, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72,\n\t0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43,\n\t0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c,\n\t0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f,\n\t0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a,\n\t0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_monitoring_v3_metric_service_proto_rawDescOnce sync.Once\n\tfile_google_monitoring_v3_metric_service_proto_rawDescData = file_google_monitoring_v3_metric_service_proto_rawDesc\n)\n\nfunc file_google_monitoring_v3_metric_service_proto_rawDescGZIP() []byte {\n\tfile_google_monitoring_v3_metric_service_proto_rawDescOnce.Do(func() {\n\t\tfile_google_monitoring_v3_metric_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_metric_service_proto_rawDescData)\n\t})\n\treturn file_google_monitoring_v3_metric_service_proto_rawDescData\n}\n\nvar file_google_monitoring_v3_metric_service_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_google_monitoring_v3_metric_service_proto_msgTypes = make([]protoimpl.MessageInfo, 17)\nvar file_google_monitoring_v3_metric_service_proto_goTypes = []any{\n\t(ListTimeSeriesRequest_TimeSeriesView)(0),        // 0: google.monitoring.v3.ListTimeSeriesRequest.TimeSeriesView\n\t(*ListMonitoredResourceDescriptorsRequest)(nil),  // 1: google.monitoring.v3.ListMonitoredResourceDescriptorsRequest\n\t(*ListMonitoredResourceDescriptorsResponse)(nil), // 2: google.monitoring.v3.ListMonitoredResourceDescriptorsResponse\n\t(*GetMonitoredResourceDescriptorRequest)(nil),    // 3: google.monitoring.v3.GetMonitoredResourceDescriptorRequest\n\t(*ListMetricDescriptorsRequest)(nil),             // 4: google.monitoring.v3.ListMetricDescriptorsRequest\n\t(*ListMetricDescriptorsResponse)(nil),            // 5: google.monitoring.v3.ListMetricDescriptorsResponse\n\t(*GetMetricDescriptorRequest)(nil),               // 6: google.monitoring.v3.GetMetricDescriptorRequest\n\t(*CreateMetricDescriptorRequest)(nil),            // 7: google.monitoring.v3.CreateMetricDescriptorRequest\n\t(*DeleteMetricDescriptorRequest)(nil),            // 8: google.monitoring.v3.DeleteMetricDescriptorRequest\n\t(*ListTimeSeriesRequest)(nil),                    // 9: google.monitoring.v3.ListTimeSeriesRequest\n\t(*ListTimeSeriesResponse)(nil),                   // 10: google.monitoring.v3.ListTimeSeriesResponse\n\t(*CreateTimeSeriesRequest)(nil),                  // 11: google.monitoring.v3.CreateTimeSeriesRequest\n\t(*CreateTimeSeriesError)(nil),                    // 12: google.monitoring.v3.CreateTimeSeriesError\n\t(*CreateTimeSeriesSummary)(nil),                  // 13: google.monitoring.v3.CreateTimeSeriesSummary\n\t(*QueryTimeSeriesRequest)(nil),                   // 14: google.monitoring.v3.QueryTimeSeriesRequest\n\t(*QueryTimeSeriesResponse)(nil),                  // 15: google.monitoring.v3.QueryTimeSeriesResponse\n\t(*QueryErrorList)(nil),                           // 16: google.monitoring.v3.QueryErrorList\n\t(*CreateTimeSeriesSummary_Error)(nil),            // 17: google.monitoring.v3.CreateTimeSeriesSummary.Error\n\t(*monitoredres.MonitoredResourceDescriptor)(nil), // 18: google.api.MonitoredResourceDescriptor\n\t(*metric.MetricDescriptor)(nil),                  // 19: google.api.MetricDescriptor\n\t(*TimeInterval)(nil),                             // 20: google.monitoring.v3.TimeInterval\n\t(*Aggregation)(nil),                              // 21: google.monitoring.v3.Aggregation\n\t(*TimeSeries)(nil),                               // 22: google.monitoring.v3.TimeSeries\n\t(*status.Status)(nil),                            // 23: google.rpc.Status\n\t(*TimeSeriesDescriptor)(nil),                     // 24: google.monitoring.v3.TimeSeriesDescriptor\n\t(*TimeSeriesData)(nil),                           // 25: google.monitoring.v3.TimeSeriesData\n\t(*QueryError)(nil),                               // 26: google.monitoring.v3.QueryError\n\t(*emptypb.Empty)(nil),                            // 27: google.protobuf.Empty\n}\nvar file_google_monitoring_v3_metric_service_proto_depIdxs = []int32{\n\t18, // 0: google.monitoring.v3.ListMonitoredResourceDescriptorsResponse.resource_descriptors:type_name -> google.api.MonitoredResourceDescriptor\n\t19, // 1: google.monitoring.v3.ListMetricDescriptorsResponse.metric_descriptors:type_name -> google.api.MetricDescriptor\n\t19, // 2: google.monitoring.v3.CreateMetricDescriptorRequest.metric_descriptor:type_name -> google.api.MetricDescriptor\n\t20, // 3: google.monitoring.v3.ListTimeSeriesRequest.interval:type_name -> google.monitoring.v3.TimeInterval\n\t21, // 4: google.monitoring.v3.ListTimeSeriesRequest.aggregation:type_name -> google.monitoring.v3.Aggregation\n\t21, // 5: google.monitoring.v3.ListTimeSeriesRequest.secondary_aggregation:type_name -> google.monitoring.v3.Aggregation\n\t0,  // 6: google.monitoring.v3.ListTimeSeriesRequest.view:type_name -> google.monitoring.v3.ListTimeSeriesRequest.TimeSeriesView\n\t22, // 7: google.monitoring.v3.ListTimeSeriesResponse.time_series:type_name -> google.monitoring.v3.TimeSeries\n\t23, // 8: google.monitoring.v3.ListTimeSeriesResponse.execution_errors:type_name -> google.rpc.Status\n\t22, // 9: google.monitoring.v3.CreateTimeSeriesRequest.time_series:type_name -> google.monitoring.v3.TimeSeries\n\t22, // 10: google.monitoring.v3.CreateTimeSeriesError.time_series:type_name -> google.monitoring.v3.TimeSeries\n\t23, // 11: google.monitoring.v3.CreateTimeSeriesError.status:type_name -> google.rpc.Status\n\t17, // 12: google.monitoring.v3.CreateTimeSeriesSummary.errors:type_name -> google.monitoring.v3.CreateTimeSeriesSummary.Error\n\t24, // 13: google.monitoring.v3.QueryTimeSeriesResponse.time_series_descriptor:type_name -> google.monitoring.v3.TimeSeriesDescriptor\n\t25, // 14: google.monitoring.v3.QueryTimeSeriesResponse.time_series_data:type_name -> google.monitoring.v3.TimeSeriesData\n\t23, // 15: google.monitoring.v3.QueryTimeSeriesResponse.partial_errors:type_name -> google.rpc.Status\n\t26, // 16: google.monitoring.v3.QueryErrorList.errors:type_name -> google.monitoring.v3.QueryError\n\t23, // 17: google.monitoring.v3.CreateTimeSeriesSummary.Error.status:type_name -> google.rpc.Status\n\t1,  // 18: google.monitoring.v3.MetricService.ListMonitoredResourceDescriptors:input_type -> google.monitoring.v3.ListMonitoredResourceDescriptorsRequest\n\t3,  // 19: google.monitoring.v3.MetricService.GetMonitoredResourceDescriptor:input_type -> google.monitoring.v3.GetMonitoredResourceDescriptorRequest\n\t4,  // 20: google.monitoring.v3.MetricService.ListMetricDescriptors:input_type -> google.monitoring.v3.ListMetricDescriptorsRequest\n\t6,  // 21: google.monitoring.v3.MetricService.GetMetricDescriptor:input_type -> google.monitoring.v3.GetMetricDescriptorRequest\n\t7,  // 22: google.monitoring.v3.MetricService.CreateMetricDescriptor:input_type -> google.monitoring.v3.CreateMetricDescriptorRequest\n\t8,  // 23: google.monitoring.v3.MetricService.DeleteMetricDescriptor:input_type -> google.monitoring.v3.DeleteMetricDescriptorRequest\n\t9,  // 24: google.monitoring.v3.MetricService.ListTimeSeries:input_type -> google.monitoring.v3.ListTimeSeriesRequest\n\t11, // 25: google.monitoring.v3.MetricService.CreateTimeSeries:input_type -> google.monitoring.v3.CreateTimeSeriesRequest\n\t11, // 26: google.monitoring.v3.MetricService.CreateServiceTimeSeries:input_type -> google.monitoring.v3.CreateTimeSeriesRequest\n\t2,  // 27: google.monitoring.v3.MetricService.ListMonitoredResourceDescriptors:output_type -> google.monitoring.v3.ListMonitoredResourceDescriptorsResponse\n\t18, // 28: google.monitoring.v3.MetricService.GetMonitoredResourceDescriptor:output_type -> google.api.MonitoredResourceDescriptor\n\t5,  // 29: google.monitoring.v3.MetricService.ListMetricDescriptors:output_type -> google.monitoring.v3.ListMetricDescriptorsResponse\n\t19, // 30: google.monitoring.v3.MetricService.GetMetricDescriptor:output_type -> google.api.MetricDescriptor\n\t19, // 31: google.monitoring.v3.MetricService.CreateMetricDescriptor:output_type -> google.api.MetricDescriptor\n\t27, // 32: google.monitoring.v3.MetricService.DeleteMetricDescriptor:output_type -> google.protobuf.Empty\n\t10, // 33: google.monitoring.v3.MetricService.ListTimeSeries:output_type -> google.monitoring.v3.ListTimeSeriesResponse\n\t27, // 34: google.monitoring.v3.MetricService.CreateTimeSeries:output_type -> google.protobuf.Empty\n\t27, // 35: google.monitoring.v3.MetricService.CreateServiceTimeSeries:output_type -> google.protobuf.Empty\n\t27, // [27:36] is the sub-list for method output_type\n\t18, // [18:27] is the sub-list for method input_type\n\t18, // [18:18] is the sub-list for extension type_name\n\t18, // [18:18] is the sub-list for extension extendee\n\t0,  // [0:18] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_metric_service_proto_init() }\nfunc file_google_monitoring_v3_metric_service_proto_init() {\n\tif File_google_monitoring_v3_metric_service_proto != nil {\n\t\treturn\n\t}\n\tfile_google_monitoring_v3_common_proto_init()\n\tfile_google_monitoring_v3_metric_proto_init()\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_metric_service_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   17,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_metric_service_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_metric_service_proto_depIdxs,\n\t\tEnumInfos:         file_google_monitoring_v3_metric_service_proto_enumTypes,\n\t\tMessageInfos:      file_google_monitoring_v3_metric_service_proto_msgTypes,\n\t}.Build()\n\tFile_google_monitoring_v3_metric_service_proto = out.File\n\tfile_google_monitoring_v3_metric_service_proto_rawDesc = nil\n\tfile_google_monitoring_v3_metric_service_proto_goTypes = nil\n\tfile_google_monitoring_v3_metric_service_proto_depIdxs = nil\n}\n\n// Reference imports to suppress errors if they are not otherwise used.\nvar _ context.Context\nvar _ grpc.ClientConnInterface\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\nconst _ = grpc.SupportPackageIsVersion6\n\n// MetricServiceClient is the client API for MetricService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.\ntype MetricServiceClient interface {\n\t// Lists monitored resource descriptors that match a filter.\n\tListMonitoredResourceDescriptors(ctx context.Context, in *ListMonitoredResourceDescriptorsRequest, opts ...grpc.CallOption) (*ListMonitoredResourceDescriptorsResponse, error)\n\t// Gets a single monitored resource descriptor.\n\tGetMonitoredResourceDescriptor(ctx context.Context, in *GetMonitoredResourceDescriptorRequest, opts ...grpc.CallOption) (*monitoredres.MonitoredResourceDescriptor, error)\n\t// Lists metric descriptors that match a filter.\n\tListMetricDescriptors(ctx context.Context, in *ListMetricDescriptorsRequest, opts ...grpc.CallOption) (*ListMetricDescriptorsResponse, error)\n\t// Gets a single metric descriptor.\n\tGetMetricDescriptor(ctx context.Context, in *GetMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error)\n\t// Creates a new metric descriptor.\n\t// The creation is executed asynchronously.\n\t// User-created metric descriptors define\n\t// [custom metrics](https://cloud.google.com/monitoring/custom-metrics).\n\t// The metric descriptor is updated if it already exists,\n\t// except that metric labels are never removed.\n\tCreateMetricDescriptor(ctx context.Context, in *CreateMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error)\n\t// Deletes a metric descriptor. Only user-created\n\t// [custom metrics](https://cloud.google.com/monitoring/custom-metrics) can be\n\t// deleted.\n\tDeleteMetricDescriptor(ctx context.Context, in *DeleteMetricDescriptorRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\t// Lists time series that match a filter.\n\tListTimeSeries(ctx context.Context, in *ListTimeSeriesRequest, opts ...grpc.CallOption) (*ListTimeSeriesResponse, error)\n\t// Creates or adds data to one or more time series.\n\t// The response is empty if all time series in the request were written.\n\t// If any time series could not be written, a corresponding failure message is\n\t// included in the error response.\n\t// This method does not support\n\t// [resource locations constraint of an organization\n\t// policy](https://cloud.google.com/resource-manager/docs/organization-policy/defining-locations#setting_the_organization_policy).\n\tCreateTimeSeries(ctx context.Context, in *CreateTimeSeriesRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\t// Creates or adds data to one or more service time series. A service time\n\t// series is a time series for a metric from a Google Cloud service. The\n\t// response is empty if all time series in the request were written. If any\n\t// time series could not be written, a corresponding failure message is\n\t// included in the error response. This endpoint rejects writes to\n\t// user-defined metrics.\n\t// This method is only for use by Google Cloud services. Use\n\t// [projects.timeSeries.create][google.monitoring.v3.MetricService.CreateTimeSeries]\n\t// instead.\n\tCreateServiceTimeSeries(ctx context.Context, in *CreateTimeSeriesRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n}\n\ntype metricServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewMetricServiceClient(cc grpc.ClientConnInterface) MetricServiceClient {\n\treturn &metricServiceClient{cc}\n}\n\nfunc (c *metricServiceClient) ListMonitoredResourceDescriptors(ctx context.Context, in *ListMonitoredResourceDescriptorsRequest, opts ...grpc.CallOption) (*ListMonitoredResourceDescriptorsResponse, error) {\n\tout := new(ListMonitoredResourceDescriptorsResponse)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.MetricService/ListMonitoredResourceDescriptors\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *metricServiceClient) GetMonitoredResourceDescriptor(ctx context.Context, in *GetMonitoredResourceDescriptorRequest, opts ...grpc.CallOption) (*monitoredres.MonitoredResourceDescriptor, error) {\n\tout := new(monitoredres.MonitoredResourceDescriptor)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.MetricService/GetMonitoredResourceDescriptor\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *metricServiceClient) ListMetricDescriptors(ctx context.Context, in *ListMetricDescriptorsRequest, opts ...grpc.CallOption) (*ListMetricDescriptorsResponse, error) {\n\tout := new(ListMetricDescriptorsResponse)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.MetricService/ListMetricDescriptors\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *metricServiceClient) GetMetricDescriptor(ctx context.Context, in *GetMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error) {\n\tout := new(metric.MetricDescriptor)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.MetricService/GetMetricDescriptor\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *metricServiceClient) CreateMetricDescriptor(ctx context.Context, in *CreateMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error) {\n\tout := new(metric.MetricDescriptor)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.MetricService/CreateMetricDescriptor\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *metricServiceClient) DeleteMetricDescriptor(ctx context.Context, in *DeleteMetricDescriptorRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.MetricService/DeleteMetricDescriptor\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *metricServiceClient) ListTimeSeries(ctx context.Context, in *ListTimeSeriesRequest, opts ...grpc.CallOption) (*ListTimeSeriesResponse, error) {\n\tout := new(ListTimeSeriesResponse)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.MetricService/ListTimeSeries\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *metricServiceClient) CreateTimeSeries(ctx context.Context, in *CreateTimeSeriesRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.MetricService/CreateTimeSeries\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *metricServiceClient) CreateServiceTimeSeries(ctx context.Context, in *CreateTimeSeriesRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.MetricService/CreateServiceTimeSeries\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// MetricServiceServer is the server API for MetricService service.\ntype MetricServiceServer interface {\n\t// Lists monitored resource descriptors that match a filter.\n\tListMonitoredResourceDescriptors(context.Context, *ListMonitoredResourceDescriptorsRequest) (*ListMonitoredResourceDescriptorsResponse, error)\n\t// Gets a single monitored resource descriptor.\n\tGetMonitoredResourceDescriptor(context.Context, *GetMonitoredResourceDescriptorRequest) (*monitoredres.MonitoredResourceDescriptor, error)\n\t// Lists metric descriptors that match a filter.\n\tListMetricDescriptors(context.Context, *ListMetricDescriptorsRequest) (*ListMetricDescriptorsResponse, error)\n\t// Gets a single metric descriptor.\n\tGetMetricDescriptor(context.Context, *GetMetricDescriptorRequest) (*metric.MetricDescriptor, error)\n\t// Creates a new metric descriptor.\n\t// The creation is executed asynchronously.\n\t// User-created metric descriptors define\n\t// [custom metrics](https://cloud.google.com/monitoring/custom-metrics).\n\t// The metric descriptor is updated if it already exists,\n\t// except that metric labels are never removed.\n\tCreateMetricDescriptor(context.Context, *CreateMetricDescriptorRequest) (*metric.MetricDescriptor, error)\n\t// Deletes a metric descriptor. Only user-created\n\t// [custom metrics](https://cloud.google.com/monitoring/custom-metrics) can be\n\t// deleted.\n\tDeleteMetricDescriptor(context.Context, *DeleteMetricDescriptorRequest) (*emptypb.Empty, error)\n\t// Lists time series that match a filter.\n\tListTimeSeries(context.Context, *ListTimeSeriesRequest) (*ListTimeSeriesResponse, error)\n\t// Creates or adds data to one or more time series.\n\t// The response is empty if all time series in the request were written.\n\t// If any time series could not be written, a corresponding failure message is\n\t// included in the error response.\n\t// This method does not support\n\t// [resource locations constraint of an organization\n\t// policy](https://cloud.google.com/resource-manager/docs/organization-policy/defining-locations#setting_the_organization_policy).\n\tCreateTimeSeries(context.Context, *CreateTimeSeriesRequest) (*emptypb.Empty, error)\n\t// Creates or adds data to one or more service time series. A service time\n\t// series is a time series for a metric from a Google Cloud service. The\n\t// response is empty if all time series in the request were written. If any\n\t// time series could not be written, a corresponding failure message is\n\t// included in the error response. This endpoint rejects writes to\n\t// user-defined metrics.\n\t// This method is only for use by Google Cloud services. Use\n\t// [projects.timeSeries.create][google.monitoring.v3.MetricService.CreateTimeSeries]\n\t// instead.\n\tCreateServiceTimeSeries(context.Context, *CreateTimeSeriesRequest) (*emptypb.Empty, error)\n}\n\n// UnimplementedMetricServiceServer can be embedded to have forward compatible implementations.\ntype UnimplementedMetricServiceServer struct {\n}\n\nfunc (*UnimplementedMetricServiceServer) ListMonitoredResourceDescriptors(context.Context, *ListMonitoredResourceDescriptorsRequest) (*ListMonitoredResourceDescriptorsResponse, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method ListMonitoredResourceDescriptors not implemented\")\n}\nfunc (*UnimplementedMetricServiceServer) GetMonitoredResourceDescriptor(context.Context, *GetMonitoredResourceDescriptorRequest) (*monitoredres.MonitoredResourceDescriptor, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method GetMonitoredResourceDescriptor not implemented\")\n}\nfunc (*UnimplementedMetricServiceServer) ListMetricDescriptors(context.Context, *ListMetricDescriptorsRequest) (*ListMetricDescriptorsResponse, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method ListMetricDescriptors not implemented\")\n}\nfunc (*UnimplementedMetricServiceServer) GetMetricDescriptor(context.Context, *GetMetricDescriptorRequest) (*metric.MetricDescriptor, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method GetMetricDescriptor not implemented\")\n}\nfunc (*UnimplementedMetricServiceServer) CreateMetricDescriptor(context.Context, *CreateMetricDescriptorRequest) (*metric.MetricDescriptor, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method CreateMetricDescriptor not implemented\")\n}\nfunc (*UnimplementedMetricServiceServer) DeleteMetricDescriptor(context.Context, *DeleteMetricDescriptorRequest) (*emptypb.Empty, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method DeleteMetricDescriptor not implemented\")\n}\nfunc (*UnimplementedMetricServiceServer) ListTimeSeries(context.Context, *ListTimeSeriesRequest) (*ListTimeSeriesResponse, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method ListTimeSeries not implemented\")\n}\nfunc (*UnimplementedMetricServiceServer) CreateTimeSeries(context.Context, *CreateTimeSeriesRequest) (*emptypb.Empty, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method CreateTimeSeries not implemented\")\n}\nfunc (*UnimplementedMetricServiceServer) CreateServiceTimeSeries(context.Context, *CreateTimeSeriesRequest) (*emptypb.Empty, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method CreateServiceTimeSeries not implemented\")\n}\n\nfunc RegisterMetricServiceServer(s *grpc.Server, srv MetricServiceServer) {\n\ts.RegisterService(&_MetricService_serviceDesc, srv)\n}\n\nfunc _MetricService_ListMonitoredResourceDescriptors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListMonitoredResourceDescriptorsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(MetricServiceServer).ListMonitoredResourceDescriptors(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.MetricService/ListMonitoredResourceDescriptors\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(MetricServiceServer).ListMonitoredResourceDescriptors(ctx, req.(*ListMonitoredResourceDescriptorsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _MetricService_GetMonitoredResourceDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetMonitoredResourceDescriptorRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(MetricServiceServer).GetMonitoredResourceDescriptor(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.MetricService/GetMonitoredResourceDescriptor\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(MetricServiceServer).GetMonitoredResourceDescriptor(ctx, req.(*GetMonitoredResourceDescriptorRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _MetricService_ListMetricDescriptors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListMetricDescriptorsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(MetricServiceServer).ListMetricDescriptors(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.MetricService/ListMetricDescriptors\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(MetricServiceServer).ListMetricDescriptors(ctx, req.(*ListMetricDescriptorsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _MetricService_GetMetricDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetMetricDescriptorRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(MetricServiceServer).GetMetricDescriptor(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.MetricService/GetMetricDescriptor\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(MetricServiceServer).GetMetricDescriptor(ctx, req.(*GetMetricDescriptorRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _MetricService_CreateMetricDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateMetricDescriptorRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(MetricServiceServer).CreateMetricDescriptor(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.MetricService/CreateMetricDescriptor\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(MetricServiceServer).CreateMetricDescriptor(ctx, req.(*CreateMetricDescriptorRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _MetricService_DeleteMetricDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(DeleteMetricDescriptorRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(MetricServiceServer).DeleteMetricDescriptor(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.MetricService/DeleteMetricDescriptor\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(MetricServiceServer).DeleteMetricDescriptor(ctx, req.(*DeleteMetricDescriptorRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _MetricService_ListTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListTimeSeriesRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(MetricServiceServer).ListTimeSeries(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.MetricService/ListTimeSeries\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(MetricServiceServer).ListTimeSeries(ctx, req.(*ListTimeSeriesRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _MetricService_CreateTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateTimeSeriesRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(MetricServiceServer).CreateTimeSeries(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.MetricService/CreateTimeSeries\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(MetricServiceServer).CreateTimeSeries(ctx, req.(*CreateTimeSeriesRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _MetricService_CreateServiceTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateTimeSeriesRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(MetricServiceServer).CreateServiceTimeSeries(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.MetricService/CreateServiceTimeSeries\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(MetricServiceServer).CreateServiceTimeSeries(ctx, req.(*CreateTimeSeriesRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nvar _MetricService_serviceDesc = grpc.ServiceDesc{\n\tServiceName: \"google.monitoring.v3.MetricService\",\n\tHandlerType: (*MetricServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"ListMonitoredResourceDescriptors\",\n\t\t\tHandler:    _MetricService_ListMonitoredResourceDescriptors_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetMonitoredResourceDescriptor\",\n\t\t\tHandler:    _MetricService_GetMonitoredResourceDescriptor_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListMetricDescriptors\",\n\t\t\tHandler:    _MetricService_ListMetricDescriptors_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetMetricDescriptor\",\n\t\t\tHandler:    _MetricService_GetMetricDescriptor_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateMetricDescriptor\",\n\t\t\tHandler:    _MetricService_CreateMetricDescriptor_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteMetricDescriptor\",\n\t\t\tHandler:    _MetricService_DeleteMetricDescriptor_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListTimeSeries\",\n\t\t\tHandler:    _MetricService_ListTimeSeries_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateTimeSeries\",\n\t\t\tHandler:    _MetricService_CreateTimeSeries_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateServiceTimeSeries\",\n\t\t\tHandler:    _MetricService_CreateServiceTimeSeries_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"google/monitoring/v3/metric_service.proto\",\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/mutation_record.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/mutation_record.proto\n\npackage monitoringpb\n\nimport (\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\ttimestamppb \"google.golang.org/protobuf/types/known/timestamppb\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// Describes a change made to a configuration.\ntype MutationRecord struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// When the change occurred.\n\tMutateTime *timestamppb.Timestamp `protobuf:\"bytes,1,opt,name=mutate_time,json=mutateTime,proto3\" json:\"mutate_time,omitempty\"`\n\t// The email address of the user making the change.\n\tMutatedBy string `protobuf:\"bytes,2,opt,name=mutated_by,json=mutatedBy,proto3\" json:\"mutated_by,omitempty\"`\n}\n\nfunc (x *MutationRecord) Reset() {\n\t*x = MutationRecord{}\n\tmi := &file_google_monitoring_v3_mutation_record_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *MutationRecord) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MutationRecord) ProtoMessage() {}\n\nfunc (x *MutationRecord) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_mutation_record_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MutationRecord.ProtoReflect.Descriptor instead.\nfunc (*MutationRecord) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_mutation_record_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *MutationRecord) GetMutateTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.MutateTime\n\t}\n\treturn nil\n}\n\nfunc (x *MutationRecord) GetMutatedBy() string {\n\tif x != nil {\n\t\treturn x.MutatedBy\n\t}\n\treturn \"\"\n}\n\nvar File_google_monitoring_v3_mutation_record_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_mutation_record_proto_rawDesc = []byte{\n\t0x0a, 0x2a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,\n\t0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x22, 0x6c, 0x0a, 0x0e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,\n\t0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x3b, 0x0a, 0x0b, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x65, 0x5f,\n\t0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d,\n\t0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x65, 0x54, 0x69,\n\t0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x65, 0x64, 0x42,\n\t0x79, 0x42, 0xce, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x13,\n\t0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x50, 0x72,\n\t0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43,\n\t0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c,\n\t0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f,\n\t0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a,\n\t0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_monitoring_v3_mutation_record_proto_rawDescOnce sync.Once\n\tfile_google_monitoring_v3_mutation_record_proto_rawDescData = file_google_monitoring_v3_mutation_record_proto_rawDesc\n)\n\nfunc file_google_monitoring_v3_mutation_record_proto_rawDescGZIP() []byte {\n\tfile_google_monitoring_v3_mutation_record_proto_rawDescOnce.Do(func() {\n\t\tfile_google_monitoring_v3_mutation_record_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_mutation_record_proto_rawDescData)\n\t})\n\treturn file_google_monitoring_v3_mutation_record_proto_rawDescData\n}\n\nvar file_google_monitoring_v3_mutation_record_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_google_monitoring_v3_mutation_record_proto_goTypes = []any{\n\t(*MutationRecord)(nil),        // 0: google.monitoring.v3.MutationRecord\n\t(*timestamppb.Timestamp)(nil), // 1: google.protobuf.Timestamp\n}\nvar file_google_monitoring_v3_mutation_record_proto_depIdxs = []int32{\n\t1, // 0: google.monitoring.v3.MutationRecord.mutate_time:type_name -> google.protobuf.Timestamp\n\t1, // [1:1] is the sub-list for method output_type\n\t1, // [1:1] is the sub-list for method input_type\n\t1, // [1:1] is the sub-list for extension type_name\n\t1, // [1:1] is the sub-list for extension extendee\n\t0, // [0:1] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_mutation_record_proto_init() }\nfunc file_google_monitoring_v3_mutation_record_proto_init() {\n\tif File_google_monitoring_v3_mutation_record_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_mutation_record_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_mutation_record_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_mutation_record_proto_depIdxs,\n\t\tMessageInfos:      file_google_monitoring_v3_mutation_record_proto_msgTypes,\n\t}.Build()\n\tFile_google_monitoring_v3_mutation_record_proto = out.File\n\tfile_google_monitoring_v3_mutation_record_proto_rawDesc = nil\n\tfile_google_monitoring_v3_mutation_record_proto_goTypes = nil\n\tfile_google_monitoring_v3_mutation_record_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/notification.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/notification.proto\n\npackage monitoringpb\n\nimport (\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\tapi \"google.golang.org/genproto/googleapis/api\"\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tlabel \"google.golang.org/genproto/googleapis/api/label\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\twrapperspb \"google.golang.org/protobuf/types/known/wrapperspb\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// Indicates whether the channel has been verified or not. It is illegal\n// to specify this field in a\n// [`CreateNotificationChannel`][google.monitoring.v3.NotificationChannelService.CreateNotificationChannel]\n// or an\n// [`UpdateNotificationChannel`][google.monitoring.v3.NotificationChannelService.UpdateNotificationChannel]\n// operation.\ntype NotificationChannel_VerificationStatus int32\n\nconst (\n\t// Sentinel value used to indicate that the state is unknown, omitted, or\n\t// is not applicable (as in the case of channels that neither support\n\t// nor require verification in order to function).\n\tNotificationChannel_VERIFICATION_STATUS_UNSPECIFIED NotificationChannel_VerificationStatus = 0\n\t// The channel has yet to be verified and requires verification to function.\n\t// Note that this state also applies to the case where the verification\n\t// process has been initiated by sending a verification code but where\n\t// the verification code has not been submitted to complete the process.\n\tNotificationChannel_UNVERIFIED NotificationChannel_VerificationStatus = 1\n\t// It has been proven that notifications can be received on this\n\t// notification channel and that someone on the project has access\n\t// to messages that are delivered to that channel.\n\tNotificationChannel_VERIFIED NotificationChannel_VerificationStatus = 2\n)\n\n// Enum value maps for NotificationChannel_VerificationStatus.\nvar (\n\tNotificationChannel_VerificationStatus_name = map[int32]string{\n\t\t0: \"VERIFICATION_STATUS_UNSPECIFIED\",\n\t\t1: \"UNVERIFIED\",\n\t\t2: \"VERIFIED\",\n\t}\n\tNotificationChannel_VerificationStatus_value = map[string]int32{\n\t\t\"VERIFICATION_STATUS_UNSPECIFIED\": 0,\n\t\t\"UNVERIFIED\":                      1,\n\t\t\"VERIFIED\":                        2,\n\t}\n)\n\nfunc (x NotificationChannel_VerificationStatus) Enum() *NotificationChannel_VerificationStatus {\n\tp := new(NotificationChannel_VerificationStatus)\n\t*p = x\n\treturn p\n}\n\nfunc (x NotificationChannel_VerificationStatus) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (NotificationChannel_VerificationStatus) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_notification_proto_enumTypes[0].Descriptor()\n}\n\nfunc (NotificationChannel_VerificationStatus) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_notification_proto_enumTypes[0]\n}\n\nfunc (x NotificationChannel_VerificationStatus) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use NotificationChannel_VerificationStatus.Descriptor instead.\nfunc (NotificationChannel_VerificationStatus) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_notification_proto_rawDescGZIP(), []int{1, 0}\n}\n\n// A description of a notification channel. The descriptor includes\n// the properties of the channel and the set of labels or fields that\n// must be specified to configure channels of a given type.\ntype NotificationChannelDescriptor struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The full REST resource name for this descriptor. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/notificationChannelDescriptors/[TYPE]\n\t//\n\t// In the above, `[TYPE]` is the value of the `type` field.\n\tName string `protobuf:\"bytes,6,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// The type of notification channel, such as \"email\" and \"sms\". To view the\n\t// full list of channels, see\n\t// [Channel\n\t// descriptors](https://cloud.google.com/monitoring/alerts/using-channels-api#ncd).\n\t// Notification channel types are globally unique.\n\tType string `protobuf:\"bytes,1,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// A human-readable name for the notification channel type.  This\n\t// form of the name is suitable for a user interface.\n\tDisplayName string `protobuf:\"bytes,2,opt,name=display_name,json=displayName,proto3\" json:\"display_name,omitempty\"`\n\t// A human-readable description of the notification channel\n\t// type. The description may include a description of the properties\n\t// of the channel and pointers to external documentation.\n\tDescription string `protobuf:\"bytes,3,opt,name=description,proto3\" json:\"description,omitempty\"`\n\t// The set of labels that must be defined to identify a particular\n\t// channel of the corresponding type. Each label includes a\n\t// description for how that field should be populated.\n\tLabels []*label.LabelDescriptor `protobuf:\"bytes,4,rep,name=labels,proto3\" json:\"labels,omitempty\"`\n\t// The tiers that support this notification channel; the project service tier\n\t// must be one of the supported_tiers.\n\t//\n\t// Deprecated: Marked as deprecated in google/monitoring/v3/notification.proto.\n\tSupportedTiers []ServiceTier `protobuf:\"varint,5,rep,packed,name=supported_tiers,json=supportedTiers,proto3,enum=google.monitoring.v3.ServiceTier\" json:\"supported_tiers,omitempty\"`\n\t// The product launch stage for channels of this type.\n\tLaunchStage api.LaunchStage `protobuf:\"varint,7,opt,name=launch_stage,json=launchStage,proto3,enum=google.api.LaunchStage\" json:\"launch_stage,omitempty\"`\n}\n\nfunc (x *NotificationChannelDescriptor) Reset() {\n\t*x = NotificationChannelDescriptor{}\n\tmi := &file_google_monitoring_v3_notification_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *NotificationChannelDescriptor) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*NotificationChannelDescriptor) ProtoMessage() {}\n\nfunc (x *NotificationChannelDescriptor) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_notification_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use NotificationChannelDescriptor.ProtoReflect.Descriptor instead.\nfunc (*NotificationChannelDescriptor) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_notification_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *NotificationChannelDescriptor) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *NotificationChannelDescriptor) GetType() string {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn \"\"\n}\n\nfunc (x *NotificationChannelDescriptor) GetDisplayName() string {\n\tif x != nil {\n\t\treturn x.DisplayName\n\t}\n\treturn \"\"\n}\n\nfunc (x *NotificationChannelDescriptor) GetDescription() string {\n\tif x != nil {\n\t\treturn x.Description\n\t}\n\treturn \"\"\n}\n\nfunc (x *NotificationChannelDescriptor) GetLabels() []*label.LabelDescriptor {\n\tif x != nil {\n\t\treturn x.Labels\n\t}\n\treturn nil\n}\n\n// Deprecated: Marked as deprecated in google/monitoring/v3/notification.proto.\nfunc (x *NotificationChannelDescriptor) GetSupportedTiers() []ServiceTier {\n\tif x != nil {\n\t\treturn x.SupportedTiers\n\t}\n\treturn nil\n}\n\nfunc (x *NotificationChannelDescriptor) GetLaunchStage() api.LaunchStage {\n\tif x != nil {\n\t\treturn x.LaunchStage\n\t}\n\treturn api.LaunchStage(0)\n}\n\n// A `NotificationChannel` is a medium through which an alert is\n// delivered when a policy violation is detected. Examples of channels\n// include email, SMS, and third-party messaging applications. Fields\n// containing sensitive information like authentication tokens or\n// contact info are only partially populated on retrieval.\ntype NotificationChannel struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The type of the notification channel. This field matches the\n\t// value of the\n\t// [NotificationChannelDescriptor.type][google.monitoring.v3.NotificationChannelDescriptor.type]\n\t// field.\n\tType string `protobuf:\"bytes,1,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// Identifier. The full REST resource name for this channel. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/notificationChannels/[CHANNEL_ID]\n\t//\n\t// The `[CHANNEL_ID]` is automatically assigned by the server on creation.\n\tName string `protobuf:\"bytes,6,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// An optional human-readable name for this notification channel. It is\n\t// recommended that you specify a non-empty and unique name in order to\n\t// make it easier to identify the channels in your project, though this is\n\t// not enforced. The display name is limited to 512 Unicode characters.\n\tDisplayName string `protobuf:\"bytes,3,opt,name=display_name,json=displayName,proto3\" json:\"display_name,omitempty\"`\n\t// An optional human-readable description of this notification channel. This\n\t// description may provide additional details, beyond the display\n\t// name, for the channel. This may not exceed 1024 Unicode characters.\n\tDescription string `protobuf:\"bytes,4,opt,name=description,proto3\" json:\"description,omitempty\"`\n\t// Configuration fields that define the channel and its behavior. The\n\t// permissible and required labels are specified in the\n\t// [NotificationChannelDescriptor.labels][google.monitoring.v3.NotificationChannelDescriptor.labels]\n\t// of the `NotificationChannelDescriptor` corresponding to the `type` field.\n\tLabels map[string]string `protobuf:\"bytes,5,rep,name=labels,proto3\" json:\"labels,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\t// User-supplied key/value data that does not need to conform to\n\t// the corresponding `NotificationChannelDescriptor`'s schema, unlike\n\t// the `labels` field. This field is intended to be used for organizing\n\t// and identifying the `NotificationChannel` objects.\n\t//\n\t// The field can contain up to 64 entries. Each key and value is limited to\n\t// 63 Unicode characters or 128 bytes, whichever is smaller. Labels and\n\t// values can contain only lowercase letters, numerals, underscores, and\n\t// dashes. Keys must begin with a letter.\n\tUserLabels map[string]string `protobuf:\"bytes,8,rep,name=user_labels,json=userLabels,proto3\" json:\"user_labels,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\t// Indicates whether this channel has been verified or not. On a\n\t// [`ListNotificationChannels`][google.monitoring.v3.NotificationChannelService.ListNotificationChannels]\n\t// or\n\t// [`GetNotificationChannel`][google.monitoring.v3.NotificationChannelService.GetNotificationChannel]\n\t// operation, this field is expected to be populated.\n\t//\n\t// If the value is `UNVERIFIED`, then it indicates that the channel is\n\t// non-functioning (it both requires verification and lacks verification);\n\t// otherwise, it is assumed that the channel works.\n\t//\n\t// If the channel is neither `VERIFIED` nor `UNVERIFIED`, it implies that\n\t// the channel is of a type that does not require verification or that\n\t// this specific channel has been exempted from verification because it was\n\t// created prior to verification being required for channels of this type.\n\t//\n\t// This field cannot be modified using a standard\n\t// [`UpdateNotificationChannel`][google.monitoring.v3.NotificationChannelService.UpdateNotificationChannel]\n\t// operation. To change the value of this field, you must call\n\t// [`VerifyNotificationChannel`][google.monitoring.v3.NotificationChannelService.VerifyNotificationChannel].\n\tVerificationStatus NotificationChannel_VerificationStatus `protobuf:\"varint,9,opt,name=verification_status,json=verificationStatus,proto3,enum=google.monitoring.v3.NotificationChannel_VerificationStatus\" json:\"verification_status,omitempty\"`\n\t// Whether notifications are forwarded to the described channel. This makes\n\t// it possible to disable delivery of notifications to a particular channel\n\t// without removing the channel from all alerting policies that reference\n\t// the channel. This is a more convenient approach when the change is\n\t// temporary and you want to receive notifications from the same set\n\t// of alerting policies on the channel at some point in the future.\n\tEnabled *wrapperspb.BoolValue `protobuf:\"bytes,11,opt,name=enabled,proto3\" json:\"enabled,omitempty\"`\n\t// Record of the creation of this channel.\n\tCreationRecord *MutationRecord `protobuf:\"bytes,12,opt,name=creation_record,json=creationRecord,proto3\" json:\"creation_record,omitempty\"`\n\t// Records of the modification of this channel.\n\tMutationRecords []*MutationRecord `protobuf:\"bytes,13,rep,name=mutation_records,json=mutationRecords,proto3\" json:\"mutation_records,omitempty\"`\n}\n\nfunc (x *NotificationChannel) Reset() {\n\t*x = NotificationChannel{}\n\tmi := &file_google_monitoring_v3_notification_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *NotificationChannel) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*NotificationChannel) ProtoMessage() {}\n\nfunc (x *NotificationChannel) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_notification_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use NotificationChannel.ProtoReflect.Descriptor instead.\nfunc (*NotificationChannel) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_notification_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *NotificationChannel) GetType() string {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn \"\"\n}\n\nfunc (x *NotificationChannel) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *NotificationChannel) GetDisplayName() string {\n\tif x != nil {\n\t\treturn x.DisplayName\n\t}\n\treturn \"\"\n}\n\nfunc (x *NotificationChannel) GetDescription() string {\n\tif x != nil {\n\t\treturn x.Description\n\t}\n\treturn \"\"\n}\n\nfunc (x *NotificationChannel) GetLabels() map[string]string {\n\tif x != nil {\n\t\treturn x.Labels\n\t}\n\treturn nil\n}\n\nfunc (x *NotificationChannel) GetUserLabels() map[string]string {\n\tif x != nil {\n\t\treturn x.UserLabels\n\t}\n\treturn nil\n}\n\nfunc (x *NotificationChannel) GetVerificationStatus() NotificationChannel_VerificationStatus {\n\tif x != nil {\n\t\treturn x.VerificationStatus\n\t}\n\treturn NotificationChannel_VERIFICATION_STATUS_UNSPECIFIED\n}\n\nfunc (x *NotificationChannel) GetEnabled() *wrapperspb.BoolValue {\n\tif x != nil {\n\t\treturn x.Enabled\n\t}\n\treturn nil\n}\n\nfunc (x *NotificationChannel) GetCreationRecord() *MutationRecord {\n\tif x != nil {\n\t\treturn x.CreationRecord\n\t}\n\treturn nil\n}\n\nfunc (x *NotificationChannel) GetMutationRecords() []*MutationRecord {\n\tif x != nil {\n\t\treturn x.MutationRecords\n\t}\n\treturn nil\n}\n\nvar File_google_monitoring_v3_notification_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_notification_proto_rawDesc = []byte{\n\t0x0a, 0x27, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a,\n\t0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c,\n\t0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x1a, 0x16, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6c, 0x61, 0x62,\n\t0x65, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x61, 0x67,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,\n\t0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6d, 0x75, 0x74, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x22, 0xf0, 0x04, 0x0a, 0x1d, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,\n\t0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64,\n\t0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20,\n\t0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x12, 0x33, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x61,\n\t0x62, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6c,\n\t0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x4e, 0x0a, 0x0f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74,\n\t0x65, 0x64, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x21,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x69, 0x65,\n\t0x72, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64,\n\t0x54, 0x69, 0x65, 0x72, 0x73, 0x12, 0x3a, 0x0a, 0x0c, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x5f,\n\t0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53,\n\t0x74, 0x61, 0x67, 0x65, 0x52, 0x0b, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x74, 0x61, 0x67,\n\t0x65, 0x3a, 0xa0, 0x02, 0xea, 0x41, 0x9c, 0x02, 0x0a, 0x37, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f,\n\t0x72, 0x12, 0x46, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f,\n\t0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,\n\t0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x64, 0x65,\n\t0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x7d, 0x12, 0x50, 0x6f, 0x72, 0x67, 0x61, 0x6e,\n\t0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69,\n\t0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72,\n\t0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f,\n\t0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x7d, 0x12, 0x44, 0x66, 0x6f, 0x6c,\n\t0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x6e, 0x6f,\n\t0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65,\n\t0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x68,\n\t0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72,\n\t0x7d, 0x12, 0x01, 0x2a, 0x22, 0xcb, 0x08, 0x0a, 0x13, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x04,\n\t0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65,\n\t0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,\n\t0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73,\n\t0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b,\n\t0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4d,\n\t0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73,\n\t0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x5a, 0x0a,\n\t0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69,\n\t0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x55, 0x73,\n\t0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x75,\n\t0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x6d, 0x0a, 0x13, 0x76, 0x65, 0x72,\n\t0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,\n\t0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f,\n\t0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65,\n\t0x6c, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74,\n\t0x61, 0x74, 0x75, 0x73, 0x52, 0x12, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62,\n\t0x6c, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c,\n\t0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x4d,\n\t0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72,\n\t0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4d,\n\t0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0e, 0x63,\n\t0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x4f, 0x0a,\n\t0x10, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64,\n\t0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4d,\n\t0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0f, 0x6d,\n\t0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x1a, 0x39,\n\t0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a,\n\t0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,\n\t0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,\n\t0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x55, 0x73, 0x65,\n\t0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,\n\t0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14,\n\t0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x57, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69,\n\t0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23,\n\t0x0a, 0x1f, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53,\n\t0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,\n\t0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x55, 0x4e, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45,\n\t0x44, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10,\n\t0x02, 0x3a, 0xfe, 0x01, 0xea, 0x41, 0xfa, 0x01, 0x0a, 0x2d, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x3e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,\n\t0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6e, 0x6f, 0x74, 0x69,\n\t0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73,\n\t0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63,\n\t0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x7d, 0x12, 0x48, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69,\n\t0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,\n\t0x7d, 0x12, 0x3c, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64,\n\t0x65, 0x72, 0x7d, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69,\n\t0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x7d, 0x12,\n\t0x01, 0x2a, 0x42, 0xcc, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42,\n\t0x11, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f,\n\t0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c,\n\t0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56,\n\t0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75,\n\t0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56,\n\t0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_monitoring_v3_notification_proto_rawDescOnce sync.Once\n\tfile_google_monitoring_v3_notification_proto_rawDescData = file_google_monitoring_v3_notification_proto_rawDesc\n)\n\nfunc file_google_monitoring_v3_notification_proto_rawDescGZIP() []byte {\n\tfile_google_monitoring_v3_notification_proto_rawDescOnce.Do(func() {\n\t\tfile_google_monitoring_v3_notification_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_notification_proto_rawDescData)\n\t})\n\treturn file_google_monitoring_v3_notification_proto_rawDescData\n}\n\nvar file_google_monitoring_v3_notification_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_google_monitoring_v3_notification_proto_msgTypes = make([]protoimpl.MessageInfo, 4)\nvar file_google_monitoring_v3_notification_proto_goTypes = []any{\n\t(NotificationChannel_VerificationStatus)(0), // 0: google.monitoring.v3.NotificationChannel.VerificationStatus\n\t(*NotificationChannelDescriptor)(nil),       // 1: google.monitoring.v3.NotificationChannelDescriptor\n\t(*NotificationChannel)(nil),                 // 2: google.monitoring.v3.NotificationChannel\n\tnil,                                         // 3: google.monitoring.v3.NotificationChannel.LabelsEntry\n\tnil,                                         // 4: google.monitoring.v3.NotificationChannel.UserLabelsEntry\n\t(*label.LabelDescriptor)(nil),               // 5: google.api.LabelDescriptor\n\t(ServiceTier)(0),                            // 6: google.monitoring.v3.ServiceTier\n\t(api.LaunchStage)(0),                        // 7: google.api.LaunchStage\n\t(*wrapperspb.BoolValue)(nil),                // 8: google.protobuf.BoolValue\n\t(*MutationRecord)(nil),                      // 9: google.monitoring.v3.MutationRecord\n}\nvar file_google_monitoring_v3_notification_proto_depIdxs = []int32{\n\t5, // 0: google.monitoring.v3.NotificationChannelDescriptor.labels:type_name -> google.api.LabelDescriptor\n\t6, // 1: google.monitoring.v3.NotificationChannelDescriptor.supported_tiers:type_name -> google.monitoring.v3.ServiceTier\n\t7, // 2: google.monitoring.v3.NotificationChannelDescriptor.launch_stage:type_name -> google.api.LaunchStage\n\t3, // 3: google.monitoring.v3.NotificationChannel.labels:type_name -> google.monitoring.v3.NotificationChannel.LabelsEntry\n\t4, // 4: google.monitoring.v3.NotificationChannel.user_labels:type_name -> google.monitoring.v3.NotificationChannel.UserLabelsEntry\n\t0, // 5: google.monitoring.v3.NotificationChannel.verification_status:type_name -> google.monitoring.v3.NotificationChannel.VerificationStatus\n\t8, // 6: google.monitoring.v3.NotificationChannel.enabled:type_name -> google.protobuf.BoolValue\n\t9, // 7: google.monitoring.v3.NotificationChannel.creation_record:type_name -> google.monitoring.v3.MutationRecord\n\t9, // 8: google.monitoring.v3.NotificationChannel.mutation_records:type_name -> google.monitoring.v3.MutationRecord\n\t9, // [9:9] is the sub-list for method output_type\n\t9, // [9:9] is the sub-list for method input_type\n\t9, // [9:9] is the sub-list for extension type_name\n\t9, // [9:9] is the sub-list for extension extendee\n\t0, // [0:9] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_notification_proto_init() }\nfunc file_google_monitoring_v3_notification_proto_init() {\n\tif File_google_monitoring_v3_notification_proto != nil {\n\t\treturn\n\t}\n\tfile_google_monitoring_v3_common_proto_init()\n\tfile_google_monitoring_v3_mutation_record_proto_init()\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_notification_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   4,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_notification_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_notification_proto_depIdxs,\n\t\tEnumInfos:         file_google_monitoring_v3_notification_proto_enumTypes,\n\t\tMessageInfos:      file_google_monitoring_v3_notification_proto_msgTypes,\n\t}.Build()\n\tFile_google_monitoring_v3_notification_proto = out.File\n\tfile_google_monitoring_v3_notification_proto_rawDesc = nil\n\tfile_google_monitoring_v3_notification_proto_goTypes = nil\n\tfile_google_monitoring_v3_notification_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/notification_service.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/notification_service.proto\n\npackage monitoringpb\n\nimport (\n\tcontext \"context\"\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n\tfieldmaskpb \"google.golang.org/protobuf/types/known/fieldmaskpb\"\n\ttimestamppb \"google.golang.org/protobuf/types/known/timestamppb\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// The `ListNotificationChannelDescriptors` request.\ntype ListNotificationChannelDescriptorsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The REST resource name of the parent from which to retrieve\n\t// the notification channel descriptors. The expected syntax is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\t//\n\t// Note that this\n\t// [names](https://cloud.google.com/monitoring/api/v3#project_name) the parent\n\t// container in which to look for the descriptors; to retrieve a single\n\t// descriptor by name, use the\n\t// [GetNotificationChannelDescriptor][google.monitoring.v3.NotificationChannelService.GetNotificationChannelDescriptor]\n\t// operation, instead.\n\tName string `protobuf:\"bytes,4,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// The maximum number of results to return in a single response. If\n\t// not set to a positive number, a reasonable value will be chosen by the\n\t// service.\n\tPageSize int32 `protobuf:\"varint,2,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\t// If non-empty, `page_token` must contain a value returned as the\n\t// `next_page_token` in a previous response to request the next set\n\t// of results.\n\tPageToken string `protobuf:\"bytes,3,opt,name=page_token,json=pageToken,proto3\" json:\"page_token,omitempty\"`\n}\n\nfunc (x *ListNotificationChannelDescriptorsRequest) Reset() {\n\t*x = ListNotificationChannelDescriptorsRequest{}\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListNotificationChannelDescriptorsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListNotificationChannelDescriptorsRequest) ProtoMessage() {}\n\nfunc (x *ListNotificationChannelDescriptorsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListNotificationChannelDescriptorsRequest.ProtoReflect.Descriptor instead.\nfunc (*ListNotificationChannelDescriptorsRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ListNotificationChannelDescriptorsRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListNotificationChannelDescriptorsRequest) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListNotificationChannelDescriptorsRequest) GetPageToken() string {\n\tif x != nil {\n\t\treturn x.PageToken\n\t}\n\treturn \"\"\n}\n\n// The `ListNotificationChannelDescriptors` response.\ntype ListNotificationChannelDescriptorsResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The monitored resource descriptors supported for the specified\n\t// project, optionally filtered.\n\tChannelDescriptors []*NotificationChannelDescriptor `protobuf:\"bytes,1,rep,name=channel_descriptors,json=channelDescriptors,proto3\" json:\"channel_descriptors,omitempty\"`\n\t// If not empty, indicates that there may be more results that match\n\t// the request. Use the value in the `page_token` field in a\n\t// subsequent request to fetch the next set of results. If empty,\n\t// all results have been returned.\n\tNextPageToken string `protobuf:\"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3\" json:\"next_page_token,omitempty\"`\n}\n\nfunc (x *ListNotificationChannelDescriptorsResponse) Reset() {\n\t*x = ListNotificationChannelDescriptorsResponse{}\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListNotificationChannelDescriptorsResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListNotificationChannelDescriptorsResponse) ProtoMessage() {}\n\nfunc (x *ListNotificationChannelDescriptorsResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListNotificationChannelDescriptorsResponse.ProtoReflect.Descriptor instead.\nfunc (*ListNotificationChannelDescriptorsResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *ListNotificationChannelDescriptorsResponse) GetChannelDescriptors() []*NotificationChannelDescriptor {\n\tif x != nil {\n\t\treturn x.ChannelDescriptors\n\t}\n\treturn nil\n}\n\nfunc (x *ListNotificationChannelDescriptorsResponse) GetNextPageToken() string {\n\tif x != nil {\n\t\treturn x.NextPageToken\n\t}\n\treturn \"\"\n}\n\n// The `GetNotificationChannelDescriptor` response.\ntype GetNotificationChannelDescriptorRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The channel type for which to execute the request. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/notificationChannelDescriptors/[CHANNEL_TYPE]\n\tName string `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *GetNotificationChannelDescriptorRequest) Reset() {\n\t*x = GetNotificationChannelDescriptorRequest{}\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[2]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *GetNotificationChannelDescriptorRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetNotificationChannelDescriptorRequest) ProtoMessage() {}\n\nfunc (x *GetNotificationChannelDescriptorRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[2]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetNotificationChannelDescriptorRequest.ProtoReflect.Descriptor instead.\nfunc (*GetNotificationChannelDescriptorRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *GetNotificationChannelDescriptorRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\n// The `CreateNotificationChannel` request.\ntype CreateNotificationChannelRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The\n\t// [project](https://cloud.google.com/monitoring/api/v3#project_name) on which\n\t// to execute the request. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\t//\n\t// This names the container into which the channel will be\n\t// written, this does not name the newly created channel. The resulting\n\t// channel's name will have a normalized version of this field as a prefix,\n\t// but will add `/notificationChannels/[CHANNEL_ID]` to identify the channel.\n\tName string `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// Required. The definition of the `NotificationChannel` to create.\n\tNotificationChannel *NotificationChannel `protobuf:\"bytes,2,opt,name=notification_channel,json=notificationChannel,proto3\" json:\"notification_channel,omitempty\"`\n}\n\nfunc (x *CreateNotificationChannelRequest) Reset() {\n\t*x = CreateNotificationChannelRequest{}\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[3]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *CreateNotificationChannelRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateNotificationChannelRequest) ProtoMessage() {}\n\nfunc (x *CreateNotificationChannelRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[3]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateNotificationChannelRequest.ProtoReflect.Descriptor instead.\nfunc (*CreateNotificationChannelRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *CreateNotificationChannelRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateNotificationChannelRequest) GetNotificationChannel() *NotificationChannel {\n\tif x != nil {\n\t\treturn x.NotificationChannel\n\t}\n\treturn nil\n}\n\n// The `ListNotificationChannels` request.\ntype ListNotificationChannelsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The\n\t// [project](https://cloud.google.com/monitoring/api/v3#project_name) on which\n\t// to execute the request. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\t//\n\t// This names the container\n\t// in which to look for the notification channels; it does not name a\n\t// specific channel. To query a specific channel by REST resource name, use\n\t// the\n\t// [`GetNotificationChannel`][google.monitoring.v3.NotificationChannelService.GetNotificationChannel]\n\t// operation.\n\tName string `protobuf:\"bytes,5,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// Optional. If provided, this field specifies the criteria that must be met\n\t// by notification channels to be included in the response.\n\t//\n\t// For more details, see [sorting and\n\t// filtering](https://cloud.google.com/monitoring/api/v3/sorting-and-filtering).\n\tFilter string `protobuf:\"bytes,6,opt,name=filter,proto3\" json:\"filter,omitempty\"`\n\t// Optional. A comma-separated list of fields by which to sort the result.\n\t// Supports the same set of fields as in `filter`. Entries can be prefixed\n\t// with a minus sign to sort in descending rather than ascending order.\n\t//\n\t// For more details, see [sorting and\n\t// filtering](https://cloud.google.com/monitoring/api/v3/sorting-and-filtering).\n\tOrderBy string `protobuf:\"bytes,7,opt,name=order_by,json=orderBy,proto3\" json:\"order_by,omitempty\"`\n\t// Optional. The maximum number of results to return in a single response. If\n\t// not set to a positive number, a reasonable value will be chosen by the\n\t// service.\n\tPageSize int32 `protobuf:\"varint,3,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\t// Optional. If non-empty, `page_token` must contain a value returned as the\n\t// `next_page_token` in a previous response to request the next set\n\t// of results.\n\tPageToken string `protobuf:\"bytes,4,opt,name=page_token,json=pageToken,proto3\" json:\"page_token,omitempty\"`\n}\n\nfunc (x *ListNotificationChannelsRequest) Reset() {\n\t*x = ListNotificationChannelsRequest{}\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[4]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListNotificationChannelsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListNotificationChannelsRequest) ProtoMessage() {}\n\nfunc (x *ListNotificationChannelsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[4]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListNotificationChannelsRequest.ProtoReflect.Descriptor instead.\nfunc (*ListNotificationChannelsRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *ListNotificationChannelsRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListNotificationChannelsRequest) GetFilter() string {\n\tif x != nil {\n\t\treturn x.Filter\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListNotificationChannelsRequest) GetOrderBy() string {\n\tif x != nil {\n\t\treturn x.OrderBy\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListNotificationChannelsRequest) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListNotificationChannelsRequest) GetPageToken() string {\n\tif x != nil {\n\t\treturn x.PageToken\n\t}\n\treturn \"\"\n}\n\n// The `ListNotificationChannels` response.\ntype ListNotificationChannelsResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The notification channels defined for the specified project.\n\tNotificationChannels []*NotificationChannel `protobuf:\"bytes,3,rep,name=notification_channels,json=notificationChannels,proto3\" json:\"notification_channels,omitempty\"`\n\t// If not empty, indicates that there may be more results that match\n\t// the request. Use the value in the `page_token` field in a\n\t// subsequent request to fetch the next set of results. If empty,\n\t// all results have been returned.\n\tNextPageToken string `protobuf:\"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3\" json:\"next_page_token,omitempty\"`\n\t// The total number of notification channels in all pages. This number is only\n\t// an estimate, and may change in subsequent pages. https://aip.dev/158\n\tTotalSize int32 `protobuf:\"varint,4,opt,name=total_size,json=totalSize,proto3\" json:\"total_size,omitempty\"`\n}\n\nfunc (x *ListNotificationChannelsResponse) Reset() {\n\t*x = ListNotificationChannelsResponse{}\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[5]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListNotificationChannelsResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListNotificationChannelsResponse) ProtoMessage() {}\n\nfunc (x *ListNotificationChannelsResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[5]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListNotificationChannelsResponse.ProtoReflect.Descriptor instead.\nfunc (*ListNotificationChannelsResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *ListNotificationChannelsResponse) GetNotificationChannels() []*NotificationChannel {\n\tif x != nil {\n\t\treturn x.NotificationChannels\n\t}\n\treturn nil\n}\n\nfunc (x *ListNotificationChannelsResponse) GetNextPageToken() string {\n\tif x != nil {\n\t\treturn x.NextPageToken\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListNotificationChannelsResponse) GetTotalSize() int32 {\n\tif x != nil {\n\t\treturn x.TotalSize\n\t}\n\treturn 0\n}\n\n// The `GetNotificationChannel` request.\ntype GetNotificationChannelRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The channel for which to execute the request. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/notificationChannels/[CHANNEL_ID]\n\tName string `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *GetNotificationChannelRequest) Reset() {\n\t*x = GetNotificationChannelRequest{}\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[6]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *GetNotificationChannelRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetNotificationChannelRequest) ProtoMessage() {}\n\nfunc (x *GetNotificationChannelRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[6]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetNotificationChannelRequest.ProtoReflect.Descriptor instead.\nfunc (*GetNotificationChannelRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *GetNotificationChannelRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\n// The `UpdateNotificationChannel` request.\ntype UpdateNotificationChannelRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Optional. The fields to update.\n\tUpdateMask *fieldmaskpb.FieldMask `protobuf:\"bytes,2,opt,name=update_mask,json=updateMask,proto3\" json:\"update_mask,omitempty\"`\n\t// Required. A description of the changes to be applied to the specified\n\t// notification channel. The description must provide a definition for\n\t// fields to be updated; the names of these fields should also be\n\t// included in the `update_mask`.\n\tNotificationChannel *NotificationChannel `protobuf:\"bytes,3,opt,name=notification_channel,json=notificationChannel,proto3\" json:\"notification_channel,omitempty\"`\n}\n\nfunc (x *UpdateNotificationChannelRequest) Reset() {\n\t*x = UpdateNotificationChannelRequest{}\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[7]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UpdateNotificationChannelRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateNotificationChannelRequest) ProtoMessage() {}\n\nfunc (x *UpdateNotificationChannelRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[7]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateNotificationChannelRequest.ProtoReflect.Descriptor instead.\nfunc (*UpdateNotificationChannelRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *UpdateNotificationChannelRequest) GetUpdateMask() *fieldmaskpb.FieldMask {\n\tif x != nil {\n\t\treturn x.UpdateMask\n\t}\n\treturn nil\n}\n\nfunc (x *UpdateNotificationChannelRequest) GetNotificationChannel() *NotificationChannel {\n\tif x != nil {\n\t\treturn x.NotificationChannel\n\t}\n\treturn nil\n}\n\n// The `DeleteNotificationChannel` request.\ntype DeleteNotificationChannelRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The channel for which to execute the request. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/notificationChannels/[CHANNEL_ID]\n\tName string `protobuf:\"bytes,3,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// If true, the notification channel will be deleted regardless of its\n\t// use in alert policies (the policies will be updated to remove the\n\t// channel). If false, this operation will fail if the notification channel\n\t// is referenced by existing alerting policies.\n\tForce bool `protobuf:\"varint,5,opt,name=force,proto3\" json:\"force,omitempty\"`\n}\n\nfunc (x *DeleteNotificationChannelRequest) Reset() {\n\t*x = DeleteNotificationChannelRequest{}\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[8]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *DeleteNotificationChannelRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DeleteNotificationChannelRequest) ProtoMessage() {}\n\nfunc (x *DeleteNotificationChannelRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[8]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DeleteNotificationChannelRequest.ProtoReflect.Descriptor instead.\nfunc (*DeleteNotificationChannelRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *DeleteNotificationChannelRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *DeleteNotificationChannelRequest) GetForce() bool {\n\tif x != nil {\n\t\treturn x.Force\n\t}\n\treturn false\n}\n\n// The `SendNotificationChannelVerificationCode` request.\ntype SendNotificationChannelVerificationCodeRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The notification channel to which to send a verification code.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *SendNotificationChannelVerificationCodeRequest) Reset() {\n\t*x = SendNotificationChannelVerificationCodeRequest{}\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[9]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *SendNotificationChannelVerificationCodeRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SendNotificationChannelVerificationCodeRequest) ProtoMessage() {}\n\nfunc (x *SendNotificationChannelVerificationCodeRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[9]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SendNotificationChannelVerificationCodeRequest.ProtoReflect.Descriptor instead.\nfunc (*SendNotificationChannelVerificationCodeRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *SendNotificationChannelVerificationCodeRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\n// The `GetNotificationChannelVerificationCode` request.\ntype GetNotificationChannelVerificationCodeRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The notification channel for which a verification code is to be\n\t// generated and retrieved. This must name a channel that is already verified;\n\t// if the specified channel is not verified, the request will fail.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// The desired expiration time. If specified, the API will guarantee that\n\t// the returned code will not be valid after the specified timestamp;\n\t// however, the API cannot guarantee that the returned code will be\n\t// valid for at least as long as the requested time (the API puts an upper\n\t// bound on the amount of time for which a code may be valid). If omitted,\n\t// a default expiration will be used, which may be less than the max\n\t// permissible expiration (so specifying an expiration may extend the\n\t// code's lifetime over omitting an expiration, even though the API does\n\t// impose an upper limit on the maximum expiration that is permitted).\n\tExpireTime *timestamppb.Timestamp `protobuf:\"bytes,2,opt,name=expire_time,json=expireTime,proto3\" json:\"expire_time,omitempty\"`\n}\n\nfunc (x *GetNotificationChannelVerificationCodeRequest) Reset() {\n\t*x = GetNotificationChannelVerificationCodeRequest{}\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[10]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *GetNotificationChannelVerificationCodeRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetNotificationChannelVerificationCodeRequest) ProtoMessage() {}\n\nfunc (x *GetNotificationChannelVerificationCodeRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[10]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetNotificationChannelVerificationCodeRequest.ProtoReflect.Descriptor instead.\nfunc (*GetNotificationChannelVerificationCodeRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *GetNotificationChannelVerificationCodeRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetNotificationChannelVerificationCodeRequest) GetExpireTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.ExpireTime\n\t}\n\treturn nil\n}\n\n// The `GetNotificationChannelVerificationCode` request.\ntype GetNotificationChannelVerificationCodeResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The verification code, which may be used to verify other channels\n\t// that have an equivalent identity (i.e. other channels of the same\n\t// type with the same fingerprint such as other email channels with\n\t// the same email address or other sms channels with the same number).\n\tCode string `protobuf:\"bytes,1,opt,name=code,proto3\" json:\"code,omitempty\"`\n\t// The expiration time associated with the code that was returned. If\n\t// an expiration was provided in the request, this is the minimum of the\n\t// requested expiration in the request and the max permitted expiration.\n\tExpireTime *timestamppb.Timestamp `protobuf:\"bytes,2,opt,name=expire_time,json=expireTime,proto3\" json:\"expire_time,omitempty\"`\n}\n\nfunc (x *GetNotificationChannelVerificationCodeResponse) Reset() {\n\t*x = GetNotificationChannelVerificationCodeResponse{}\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[11]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *GetNotificationChannelVerificationCodeResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetNotificationChannelVerificationCodeResponse) ProtoMessage() {}\n\nfunc (x *GetNotificationChannelVerificationCodeResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[11]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetNotificationChannelVerificationCodeResponse.ProtoReflect.Descriptor instead.\nfunc (*GetNotificationChannelVerificationCodeResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *GetNotificationChannelVerificationCodeResponse) GetCode() string {\n\tif x != nil {\n\t\treturn x.Code\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetNotificationChannelVerificationCodeResponse) GetExpireTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.ExpireTime\n\t}\n\treturn nil\n}\n\n// The `VerifyNotificationChannel` request.\ntype VerifyNotificationChannelRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The notification channel to verify.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// Required. The verification code that was delivered to the channel as\n\t// a result of invoking the `SendNotificationChannelVerificationCode` API\n\t// method or that was retrieved from a verified channel via\n\t// `GetNotificationChannelVerificationCode`. For example, one might have\n\t// \"G-123456\" or \"TKNZGhhd2EyN3I1MnRnMjRv\" (in general, one is only\n\t// guaranteed that the code is valid UTF-8; one should not\n\t// make any assumptions regarding the structure or format of the code).\n\tCode string `protobuf:\"bytes,2,opt,name=code,proto3\" json:\"code,omitempty\"`\n}\n\nfunc (x *VerifyNotificationChannelRequest) Reset() {\n\t*x = VerifyNotificationChannelRequest{}\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[12]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *VerifyNotificationChannelRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*VerifyNotificationChannelRequest) ProtoMessage() {}\n\nfunc (x *VerifyNotificationChannelRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_notification_service_proto_msgTypes[12]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use VerifyNotificationChannelRequest.ProtoReflect.Descriptor instead.\nfunc (*VerifyNotificationChannelRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *VerifyNotificationChannelRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *VerifyNotificationChannelRequest) GetCode() string {\n\tif x != nil {\n\t\treturn x.Code\n\t}\n\treturn \"\"\n}\n\nvar File_google_monitoring_v3_notification_service_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_notification_service_proto_rawDesc = []byte{\n\t0x0a, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,\n\t0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70,\n\t0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64,\n\t0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f,\n\t0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33,\n\t0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x22, 0xbc, 0x01, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69,\n\t0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44,\n\t0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x53, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x3f, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x39, 0x12, 0x37, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43,\n\t0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73,\n\t0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53,\n\t0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65,\n\t0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b,\n\t0x65, 0x6e, 0x22, 0xba, 0x01, 0x0a, 0x2a, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66,\n\t0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65,\n\t0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,\n\t0x65, 0x12, 0x64, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x64, 0x65, 0x73,\n\t0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,\n\t0x74, 0x6f, 0x72, 0x52, 0x12, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63,\n\t0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f,\n\t0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22,\n\t0x7e, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,\n\t0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3f, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x39,\n\t0x0a, 0x37, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74, 0x69,\n\t0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44,\n\t0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22,\n\t0xd0, 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69,\n\t0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x35, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2f, 0x12, 0x2d, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69,\n\t0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x61, 0x0a, 0x14, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,\n\t0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x13, 0x6e,\n\t0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e,\n\t0x65, 0x6c, 0x22, 0xef, 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66,\n\t0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05,\n\t0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2f, 0x12, 0x2d, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,\n\t0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1e,\n\t0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09,\n\t0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x20,\n\t0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65,\n\t0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54,\n\t0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xc9, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74,\n\t0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,\n\t0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x15, 0x6e, 0x6f, 0x74,\n\t0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65,\n\t0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e,\n\t0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e,\n\t0x6e, 0x65, 0x6c, 0x52, 0x14, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78,\n\t0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65,\n\t0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65,\n\t0x22, 0x6a, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x49, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x35, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2f, 0x0a, 0x2d, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43,\n\t0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a,\n\t0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61,\n\t0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d,\n\t0x61, 0x73, 0x6b, 0x12, 0x61, 0x0a, 0x14, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x42, 0x03, 0xe0, 0x41,\n\t0x02, 0x52, 0x13, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43,\n\t0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x83, 0x01, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74,\n\t0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61,\n\t0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xe0, 0x41, 0x02, 0xfa, 0x41,\n\t0x2f, 0x0a, 0x2d, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74,\n\t0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x7b, 0x0a, 0x2e,\n\t0x53, 0x65, 0x6e, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49,\n\t0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xe0, 0x41,\n\t0x02, 0xfa, 0x41, 0x2f, 0x0a, 0x2d, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e,\n\t0x6e, 0x65, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x2d, 0x47, 0x65,\n\t0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61,\n\t0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xe0, 0x41, 0x02, 0xfa, 0x41,\n\t0x2f, 0x0a, 0x2d, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74,\n\t0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65,\n\t0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69,\n\t0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54,\n\t0x69, 0x6d, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66,\n\t0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x65,\n\t0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65,\n\t0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x65, 0x78,\n\t0x70, 0x69, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x78, 0x70,\n\t0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x86, 0x01, 0x0a, 0x20, 0x56, 0x65, 0x72, 0x69,\n\t0x66, 0x79, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68,\n\t0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xe0, 0x41, 0x02, 0xfa,\n\t0x41, 0x2f, 0x0a, 0x2d, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f,\n\t0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65,\n\t0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65,\n\t0x32, 0xea, 0x12, 0x0a, 0x1a, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,\n\t0xec, 0x01, 0x0a, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72,\n\t0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x3f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69,\n\t0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68,\n\t0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c,\n\t0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43,\n\t0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72,\n\t0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0xda, 0x41, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x12, 0x34, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e,\n\t0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f,\n\t0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e,\n\t0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0xdd,\n\t0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,\n\t0x74, 0x6f, 0x72, 0x12, 0x3d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f,\n\t0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65,\n\t0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69,\n\t0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73,\n\t0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x22, 0x45, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x12, 0x36, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d,\n\t0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6e, 0x6f, 0x74,\n\t0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,\n\t0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xc4,\n\t0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x35, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f,\n\t0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65,\n\t0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0xda, 0x41, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x76, 0x33, 0x2f, 0x7b,\n\t0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d,\n\t0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61,\n\t0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0xb5, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74,\n\t0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,\n\t0x12, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66,\n\t0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74,\n\t0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,\n\t0x22, 0x3b, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12,\n\t0x2c, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65,\n\t0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xe4, 0x01,\n\t0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x36, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66,\n\t0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x64,\n\t0xda, 0x41, 0x19, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x82, 0xd3, 0xe4, 0x93,\n\t0x02, 0x42, 0x3a, 0x14, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x2a, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e,\n\t0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f,\n\t0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e,\n\t0x6e, 0x65, 0x6c, 0x73, 0x12, 0x83, 0x02, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e,\n\t0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e,\n\t0x65, 0x6c, 0x12, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,\n\t0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e,\n\t0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68,\n\t0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x82, 0x01, 0xda, 0x41, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74,\n\t0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2c, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x82, 0xd3, 0xe4, 0x93, 0x02,\n\t0x59, 0x3a, 0x14, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,\n\t0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x32, 0x41, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x6f,\n\t0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e,\n\t0x65, 0x6c, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73,\n\t0x2f, 0x2a, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43,\n\t0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xae, 0x01, 0x0a, 0x19, 0x44,\n\t0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e,\n\t0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,\n\t0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x41, 0xda, 0x41, 0x0a, 0x6e, 0x61, 0x6d,\n\t0x65, 0x2c, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x2a, 0x2c, 0x2f,\n\t0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,\n\t0x73, 0x2f, 0x2a, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xdc, 0x01, 0x0a, 0x27,\n\t0x53, 0x65, 0x6e, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x44, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53,\n\t0x65, 0x6e, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43,\n\t0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x53, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3,\n\t0xe4, 0x93, 0x02, 0x46, 0x3a, 0x01, 0x2a, 0x22, 0x41, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61,\n\t0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6e, 0x6f,\n\t0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65,\n\t0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69,\n\t0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x87, 0x02, 0x0a, 0x26, 0x47,\n\t0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68,\n\t0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x43, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74,\n\t0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e,\n\t0x6e, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43,\n\t0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x44, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x22, 0x52, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x3a,\n\t0x01, 0x2a, 0x22, 0x40, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72,\n\t0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x2a, 0x7d,\n\t0x3a, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x43, 0x6f, 0x64, 0x65, 0x12, 0xca, 0x01, 0x0a, 0x19, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x4e,\n\t0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e,\n\t0x65, 0x6c, 0x12, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79,\n\t0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e,\n\t0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68,\n\t0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x4a, 0xda, 0x41, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x63,\n\t0x6f, 0x64, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x3a, 0x01, 0x2a, 0x22, 0x33, 0x2f, 0x76,\n\t0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73,\n\t0x2f, 0x2a, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43,\n\t0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x76, 0x65, 0x72, 0x69, 0x66,\n\t0x79, 0x1a, 0xa9, 0x01, 0xca, 0x41, 0x19, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d,\n\t0xd2, 0x41, 0x89, 0x01, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61,\n\t0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f,\n\t0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75,\n\t0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x68, 0x74,\n\t0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x42, 0xd3, 0x01,\n\t0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x18, 0x4e, 0x6f, 0x74, 0x69,\n\t0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50,\n\t0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c,\n\t0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c,\n\t0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a,\n\t0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_monitoring_v3_notification_service_proto_rawDescOnce sync.Once\n\tfile_google_monitoring_v3_notification_service_proto_rawDescData = file_google_monitoring_v3_notification_service_proto_rawDesc\n)\n\nfunc file_google_monitoring_v3_notification_service_proto_rawDescGZIP() []byte {\n\tfile_google_monitoring_v3_notification_service_proto_rawDescOnce.Do(func() {\n\t\tfile_google_monitoring_v3_notification_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_notification_service_proto_rawDescData)\n\t})\n\treturn file_google_monitoring_v3_notification_service_proto_rawDescData\n}\n\nvar file_google_monitoring_v3_notification_service_proto_msgTypes = make([]protoimpl.MessageInfo, 13)\nvar file_google_monitoring_v3_notification_service_proto_goTypes = []any{\n\t(*ListNotificationChannelDescriptorsRequest)(nil),      // 0: google.monitoring.v3.ListNotificationChannelDescriptorsRequest\n\t(*ListNotificationChannelDescriptorsResponse)(nil),     // 1: google.monitoring.v3.ListNotificationChannelDescriptorsResponse\n\t(*GetNotificationChannelDescriptorRequest)(nil),        // 2: google.monitoring.v3.GetNotificationChannelDescriptorRequest\n\t(*CreateNotificationChannelRequest)(nil),               // 3: google.monitoring.v3.CreateNotificationChannelRequest\n\t(*ListNotificationChannelsRequest)(nil),                // 4: google.monitoring.v3.ListNotificationChannelsRequest\n\t(*ListNotificationChannelsResponse)(nil),               // 5: google.monitoring.v3.ListNotificationChannelsResponse\n\t(*GetNotificationChannelRequest)(nil),                  // 6: google.monitoring.v3.GetNotificationChannelRequest\n\t(*UpdateNotificationChannelRequest)(nil),               // 7: google.monitoring.v3.UpdateNotificationChannelRequest\n\t(*DeleteNotificationChannelRequest)(nil),               // 8: google.monitoring.v3.DeleteNotificationChannelRequest\n\t(*SendNotificationChannelVerificationCodeRequest)(nil), // 9: google.monitoring.v3.SendNotificationChannelVerificationCodeRequest\n\t(*GetNotificationChannelVerificationCodeRequest)(nil),  // 10: google.monitoring.v3.GetNotificationChannelVerificationCodeRequest\n\t(*GetNotificationChannelVerificationCodeResponse)(nil), // 11: google.monitoring.v3.GetNotificationChannelVerificationCodeResponse\n\t(*VerifyNotificationChannelRequest)(nil),               // 12: google.monitoring.v3.VerifyNotificationChannelRequest\n\t(*NotificationChannelDescriptor)(nil),                  // 13: google.monitoring.v3.NotificationChannelDescriptor\n\t(*NotificationChannel)(nil),                            // 14: google.monitoring.v3.NotificationChannel\n\t(*fieldmaskpb.FieldMask)(nil),                          // 15: google.protobuf.FieldMask\n\t(*timestamppb.Timestamp)(nil),                          // 16: google.protobuf.Timestamp\n\t(*emptypb.Empty)(nil),                                  // 17: google.protobuf.Empty\n}\nvar file_google_monitoring_v3_notification_service_proto_depIdxs = []int32{\n\t13, // 0: google.monitoring.v3.ListNotificationChannelDescriptorsResponse.channel_descriptors:type_name -> google.monitoring.v3.NotificationChannelDescriptor\n\t14, // 1: google.monitoring.v3.CreateNotificationChannelRequest.notification_channel:type_name -> google.monitoring.v3.NotificationChannel\n\t14, // 2: google.monitoring.v3.ListNotificationChannelsResponse.notification_channels:type_name -> google.monitoring.v3.NotificationChannel\n\t15, // 3: google.monitoring.v3.UpdateNotificationChannelRequest.update_mask:type_name -> google.protobuf.FieldMask\n\t14, // 4: google.monitoring.v3.UpdateNotificationChannelRequest.notification_channel:type_name -> google.monitoring.v3.NotificationChannel\n\t16, // 5: google.monitoring.v3.GetNotificationChannelVerificationCodeRequest.expire_time:type_name -> google.protobuf.Timestamp\n\t16, // 6: google.monitoring.v3.GetNotificationChannelVerificationCodeResponse.expire_time:type_name -> google.protobuf.Timestamp\n\t0,  // 7: google.monitoring.v3.NotificationChannelService.ListNotificationChannelDescriptors:input_type -> google.monitoring.v3.ListNotificationChannelDescriptorsRequest\n\t2,  // 8: google.monitoring.v3.NotificationChannelService.GetNotificationChannelDescriptor:input_type -> google.monitoring.v3.GetNotificationChannelDescriptorRequest\n\t4,  // 9: google.monitoring.v3.NotificationChannelService.ListNotificationChannels:input_type -> google.monitoring.v3.ListNotificationChannelsRequest\n\t6,  // 10: google.monitoring.v3.NotificationChannelService.GetNotificationChannel:input_type -> google.monitoring.v3.GetNotificationChannelRequest\n\t3,  // 11: google.monitoring.v3.NotificationChannelService.CreateNotificationChannel:input_type -> google.monitoring.v3.CreateNotificationChannelRequest\n\t7,  // 12: google.monitoring.v3.NotificationChannelService.UpdateNotificationChannel:input_type -> google.monitoring.v3.UpdateNotificationChannelRequest\n\t8,  // 13: google.monitoring.v3.NotificationChannelService.DeleteNotificationChannel:input_type -> google.monitoring.v3.DeleteNotificationChannelRequest\n\t9,  // 14: google.monitoring.v3.NotificationChannelService.SendNotificationChannelVerificationCode:input_type -> google.monitoring.v3.SendNotificationChannelVerificationCodeRequest\n\t10, // 15: google.monitoring.v3.NotificationChannelService.GetNotificationChannelVerificationCode:input_type -> google.monitoring.v3.GetNotificationChannelVerificationCodeRequest\n\t12, // 16: google.monitoring.v3.NotificationChannelService.VerifyNotificationChannel:input_type -> google.monitoring.v3.VerifyNotificationChannelRequest\n\t1,  // 17: google.monitoring.v3.NotificationChannelService.ListNotificationChannelDescriptors:output_type -> google.monitoring.v3.ListNotificationChannelDescriptorsResponse\n\t13, // 18: google.monitoring.v3.NotificationChannelService.GetNotificationChannelDescriptor:output_type -> google.monitoring.v3.NotificationChannelDescriptor\n\t5,  // 19: google.monitoring.v3.NotificationChannelService.ListNotificationChannels:output_type -> google.monitoring.v3.ListNotificationChannelsResponse\n\t14, // 20: google.monitoring.v3.NotificationChannelService.GetNotificationChannel:output_type -> google.monitoring.v3.NotificationChannel\n\t14, // 21: google.monitoring.v3.NotificationChannelService.CreateNotificationChannel:output_type -> google.monitoring.v3.NotificationChannel\n\t14, // 22: google.monitoring.v3.NotificationChannelService.UpdateNotificationChannel:output_type -> google.monitoring.v3.NotificationChannel\n\t17, // 23: google.monitoring.v3.NotificationChannelService.DeleteNotificationChannel:output_type -> google.protobuf.Empty\n\t17, // 24: google.monitoring.v3.NotificationChannelService.SendNotificationChannelVerificationCode:output_type -> google.protobuf.Empty\n\t11, // 25: google.monitoring.v3.NotificationChannelService.GetNotificationChannelVerificationCode:output_type -> google.monitoring.v3.GetNotificationChannelVerificationCodeResponse\n\t14, // 26: google.monitoring.v3.NotificationChannelService.VerifyNotificationChannel:output_type -> google.monitoring.v3.NotificationChannel\n\t17, // [17:27] is the sub-list for method output_type\n\t7,  // [7:17] is the sub-list for method input_type\n\t7,  // [7:7] is the sub-list for extension type_name\n\t7,  // [7:7] is the sub-list for extension extendee\n\t0,  // [0:7] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_notification_service_proto_init() }\nfunc file_google_monitoring_v3_notification_service_proto_init() {\n\tif File_google_monitoring_v3_notification_service_proto != nil {\n\t\treturn\n\t}\n\tfile_google_monitoring_v3_notification_proto_init()\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_notification_service_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   13,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_notification_service_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_notification_service_proto_depIdxs,\n\t\tMessageInfos:      file_google_monitoring_v3_notification_service_proto_msgTypes,\n\t}.Build()\n\tFile_google_monitoring_v3_notification_service_proto = out.File\n\tfile_google_monitoring_v3_notification_service_proto_rawDesc = nil\n\tfile_google_monitoring_v3_notification_service_proto_goTypes = nil\n\tfile_google_monitoring_v3_notification_service_proto_depIdxs = nil\n}\n\n// Reference imports to suppress errors if they are not otherwise used.\nvar _ context.Context\nvar _ grpc.ClientConnInterface\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\nconst _ = grpc.SupportPackageIsVersion6\n\n// NotificationChannelServiceClient is the client API for NotificationChannelService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.\ntype NotificationChannelServiceClient interface {\n\t// Lists the descriptors for supported channel types. The use of descriptors\n\t// makes it possible for new channel types to be dynamically added.\n\tListNotificationChannelDescriptors(ctx context.Context, in *ListNotificationChannelDescriptorsRequest, opts ...grpc.CallOption) (*ListNotificationChannelDescriptorsResponse, error)\n\t// Gets a single channel descriptor. The descriptor indicates which fields\n\t// are expected / permitted for a notification channel of the given type.\n\tGetNotificationChannelDescriptor(ctx context.Context, in *GetNotificationChannelDescriptorRequest, opts ...grpc.CallOption) (*NotificationChannelDescriptor, error)\n\t// Lists the notification channels that have been created for the project.\n\t// To list the types of notification channels that are supported, use\n\t// the `ListNotificationChannelDescriptors` method.\n\tListNotificationChannels(ctx context.Context, in *ListNotificationChannelsRequest, opts ...grpc.CallOption) (*ListNotificationChannelsResponse, error)\n\t// Gets a single notification channel. The channel includes the relevant\n\t// configuration details with which the channel was created. However, the\n\t// response may truncate or omit passwords, API keys, or other private key\n\t// matter and thus the response may not be 100% identical to the information\n\t// that was supplied in the call to the create method.\n\tGetNotificationChannel(ctx context.Context, in *GetNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error)\n\t// Creates a new notification channel, representing a single notification\n\t// endpoint such as an email address, SMS number, or PagerDuty service.\n\t//\n\t// Design your application to single-thread API calls that modify the state of\n\t// notification channels in a single project. This includes calls to\n\t// CreateNotificationChannel, DeleteNotificationChannel and\n\t// UpdateNotificationChannel.\n\tCreateNotificationChannel(ctx context.Context, in *CreateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error)\n\t// Updates a notification channel. Fields not specified in the field mask\n\t// remain unchanged.\n\t//\n\t// Design your application to single-thread API calls that modify the state of\n\t// notification channels in a single project. This includes calls to\n\t// CreateNotificationChannel, DeleteNotificationChannel and\n\t// UpdateNotificationChannel.\n\tUpdateNotificationChannel(ctx context.Context, in *UpdateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error)\n\t// Deletes a notification channel.\n\t//\n\t// Design your application to single-thread API calls that modify the state of\n\t// notification channels in a single project. This includes calls to\n\t// CreateNotificationChannel, DeleteNotificationChannel and\n\t// UpdateNotificationChannel.\n\tDeleteNotificationChannel(ctx context.Context, in *DeleteNotificationChannelRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\t// Causes a verification code to be delivered to the channel. The code\n\t// can then be supplied in `VerifyNotificationChannel` to verify the channel.\n\tSendNotificationChannelVerificationCode(ctx context.Context, in *SendNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\t// Requests a verification code for an already verified channel that can then\n\t// be used in a call to VerifyNotificationChannel() on a different channel\n\t// with an equivalent identity in the same or in a different project. This\n\t// makes it possible to copy a channel between projects without requiring\n\t// manual reverification of the channel. If the channel is not in the\n\t// verified state, this method will fail (in other words, this may only be\n\t// used if the SendNotificationChannelVerificationCode and\n\t// VerifyNotificationChannel paths have already been used to put the given\n\t// channel into the verified state).\n\t//\n\t// There is no guarantee that the verification codes returned by this method\n\t// will be of a similar structure or form as the ones that are delivered\n\t// to the channel via SendNotificationChannelVerificationCode; while\n\t// VerifyNotificationChannel() will recognize both the codes delivered via\n\t// SendNotificationChannelVerificationCode() and returned from\n\t// GetNotificationChannelVerificationCode(), it is typically the case that\n\t// the verification codes delivered via\n\t// SendNotificationChannelVerificationCode() will be shorter and also\n\t// have a shorter expiration (e.g. codes such as \"G-123456\") whereas\n\t// GetVerificationCode() will typically return a much longer, websafe base\n\t// 64 encoded string that has a longer expiration time.\n\tGetNotificationChannelVerificationCode(ctx context.Context, in *GetNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*GetNotificationChannelVerificationCodeResponse, error)\n\t// Verifies a `NotificationChannel` by proving receipt of the code\n\t// delivered to the channel as a result of calling\n\t// `SendNotificationChannelVerificationCode`.\n\tVerifyNotificationChannel(ctx context.Context, in *VerifyNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error)\n}\n\ntype notificationChannelServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewNotificationChannelServiceClient(cc grpc.ClientConnInterface) NotificationChannelServiceClient {\n\treturn &notificationChannelServiceClient{cc}\n}\n\nfunc (c *notificationChannelServiceClient) ListNotificationChannelDescriptors(ctx context.Context, in *ListNotificationChannelDescriptorsRequest, opts ...grpc.CallOption) (*ListNotificationChannelDescriptorsResponse, error) {\n\tout := new(ListNotificationChannelDescriptorsResponse)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.NotificationChannelService/ListNotificationChannelDescriptors\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *notificationChannelServiceClient) GetNotificationChannelDescriptor(ctx context.Context, in *GetNotificationChannelDescriptorRequest, opts ...grpc.CallOption) (*NotificationChannelDescriptor, error) {\n\tout := new(NotificationChannelDescriptor)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.NotificationChannelService/GetNotificationChannelDescriptor\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *notificationChannelServiceClient) ListNotificationChannels(ctx context.Context, in *ListNotificationChannelsRequest, opts ...grpc.CallOption) (*ListNotificationChannelsResponse, error) {\n\tout := new(ListNotificationChannelsResponse)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.NotificationChannelService/ListNotificationChannels\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *notificationChannelServiceClient) GetNotificationChannel(ctx context.Context, in *GetNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) {\n\tout := new(NotificationChannel)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.NotificationChannelService/GetNotificationChannel\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *notificationChannelServiceClient) CreateNotificationChannel(ctx context.Context, in *CreateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) {\n\tout := new(NotificationChannel)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.NotificationChannelService/CreateNotificationChannel\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *notificationChannelServiceClient) UpdateNotificationChannel(ctx context.Context, in *UpdateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) {\n\tout := new(NotificationChannel)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.NotificationChannelService/UpdateNotificationChannel\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *notificationChannelServiceClient) DeleteNotificationChannel(ctx context.Context, in *DeleteNotificationChannelRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.NotificationChannelService/DeleteNotificationChannel\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *notificationChannelServiceClient) SendNotificationChannelVerificationCode(ctx context.Context, in *SendNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.NotificationChannelService/SendNotificationChannelVerificationCode\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *notificationChannelServiceClient) GetNotificationChannelVerificationCode(ctx context.Context, in *GetNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*GetNotificationChannelVerificationCodeResponse, error) {\n\tout := new(GetNotificationChannelVerificationCodeResponse)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.NotificationChannelService/GetNotificationChannelVerificationCode\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *notificationChannelServiceClient) VerifyNotificationChannel(ctx context.Context, in *VerifyNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) {\n\tout := new(NotificationChannel)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.NotificationChannelService/VerifyNotificationChannel\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// NotificationChannelServiceServer is the server API for NotificationChannelService service.\ntype NotificationChannelServiceServer interface {\n\t// Lists the descriptors for supported channel types. The use of descriptors\n\t// makes it possible for new channel types to be dynamically added.\n\tListNotificationChannelDescriptors(context.Context, *ListNotificationChannelDescriptorsRequest) (*ListNotificationChannelDescriptorsResponse, error)\n\t// Gets a single channel descriptor. The descriptor indicates which fields\n\t// are expected / permitted for a notification channel of the given type.\n\tGetNotificationChannelDescriptor(context.Context, *GetNotificationChannelDescriptorRequest) (*NotificationChannelDescriptor, error)\n\t// Lists the notification channels that have been created for the project.\n\t// To list the types of notification channels that are supported, use\n\t// the `ListNotificationChannelDescriptors` method.\n\tListNotificationChannels(context.Context, *ListNotificationChannelsRequest) (*ListNotificationChannelsResponse, error)\n\t// Gets a single notification channel. The channel includes the relevant\n\t// configuration details with which the channel was created. However, the\n\t// response may truncate or omit passwords, API keys, or other private key\n\t// matter and thus the response may not be 100% identical to the information\n\t// that was supplied in the call to the create method.\n\tGetNotificationChannel(context.Context, *GetNotificationChannelRequest) (*NotificationChannel, error)\n\t// Creates a new notification channel, representing a single notification\n\t// endpoint such as an email address, SMS number, or PagerDuty service.\n\t//\n\t// Design your application to single-thread API calls that modify the state of\n\t// notification channels in a single project. This includes calls to\n\t// CreateNotificationChannel, DeleteNotificationChannel and\n\t// UpdateNotificationChannel.\n\tCreateNotificationChannel(context.Context, *CreateNotificationChannelRequest) (*NotificationChannel, error)\n\t// Updates a notification channel. Fields not specified in the field mask\n\t// remain unchanged.\n\t//\n\t// Design your application to single-thread API calls that modify the state of\n\t// notification channels in a single project. This includes calls to\n\t// CreateNotificationChannel, DeleteNotificationChannel and\n\t// UpdateNotificationChannel.\n\tUpdateNotificationChannel(context.Context, *UpdateNotificationChannelRequest) (*NotificationChannel, error)\n\t// Deletes a notification channel.\n\t//\n\t// Design your application to single-thread API calls that modify the state of\n\t// notification channels in a single project. This includes calls to\n\t// CreateNotificationChannel, DeleteNotificationChannel and\n\t// UpdateNotificationChannel.\n\tDeleteNotificationChannel(context.Context, *DeleteNotificationChannelRequest) (*emptypb.Empty, error)\n\t// Causes a verification code to be delivered to the channel. The code\n\t// can then be supplied in `VerifyNotificationChannel` to verify the channel.\n\tSendNotificationChannelVerificationCode(context.Context, *SendNotificationChannelVerificationCodeRequest) (*emptypb.Empty, error)\n\t// Requests a verification code for an already verified channel that can then\n\t// be used in a call to VerifyNotificationChannel() on a different channel\n\t// with an equivalent identity in the same or in a different project. This\n\t// makes it possible to copy a channel between projects without requiring\n\t// manual reverification of the channel. If the channel is not in the\n\t// verified state, this method will fail (in other words, this may only be\n\t// used if the SendNotificationChannelVerificationCode and\n\t// VerifyNotificationChannel paths have already been used to put the given\n\t// channel into the verified state).\n\t//\n\t// There is no guarantee that the verification codes returned by this method\n\t// will be of a similar structure or form as the ones that are delivered\n\t// to the channel via SendNotificationChannelVerificationCode; while\n\t// VerifyNotificationChannel() will recognize both the codes delivered via\n\t// SendNotificationChannelVerificationCode() and returned from\n\t// GetNotificationChannelVerificationCode(), it is typically the case that\n\t// the verification codes delivered via\n\t// SendNotificationChannelVerificationCode() will be shorter and also\n\t// have a shorter expiration (e.g. codes such as \"G-123456\") whereas\n\t// GetVerificationCode() will typically return a much longer, websafe base\n\t// 64 encoded string that has a longer expiration time.\n\tGetNotificationChannelVerificationCode(context.Context, *GetNotificationChannelVerificationCodeRequest) (*GetNotificationChannelVerificationCodeResponse, error)\n\t// Verifies a `NotificationChannel` by proving receipt of the code\n\t// delivered to the channel as a result of calling\n\t// `SendNotificationChannelVerificationCode`.\n\tVerifyNotificationChannel(context.Context, *VerifyNotificationChannelRequest) (*NotificationChannel, error)\n}\n\n// UnimplementedNotificationChannelServiceServer can be embedded to have forward compatible implementations.\ntype UnimplementedNotificationChannelServiceServer struct {\n}\n\nfunc (*UnimplementedNotificationChannelServiceServer) ListNotificationChannelDescriptors(context.Context, *ListNotificationChannelDescriptorsRequest) (*ListNotificationChannelDescriptorsResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListNotificationChannelDescriptors not implemented\")\n}\nfunc (*UnimplementedNotificationChannelServiceServer) GetNotificationChannelDescriptor(context.Context, *GetNotificationChannelDescriptorRequest) (*NotificationChannelDescriptor, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetNotificationChannelDescriptor not implemented\")\n}\nfunc (*UnimplementedNotificationChannelServiceServer) ListNotificationChannels(context.Context, *ListNotificationChannelsRequest) (*ListNotificationChannelsResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListNotificationChannels not implemented\")\n}\nfunc (*UnimplementedNotificationChannelServiceServer) GetNotificationChannel(context.Context, *GetNotificationChannelRequest) (*NotificationChannel, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetNotificationChannel not implemented\")\n}\nfunc (*UnimplementedNotificationChannelServiceServer) CreateNotificationChannel(context.Context, *CreateNotificationChannelRequest) (*NotificationChannel, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateNotificationChannel not implemented\")\n}\nfunc (*UnimplementedNotificationChannelServiceServer) UpdateNotificationChannel(context.Context, *UpdateNotificationChannelRequest) (*NotificationChannel, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateNotificationChannel not implemented\")\n}\nfunc (*UnimplementedNotificationChannelServiceServer) DeleteNotificationChannel(context.Context, *DeleteNotificationChannelRequest) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeleteNotificationChannel not implemented\")\n}\nfunc (*UnimplementedNotificationChannelServiceServer) SendNotificationChannelVerificationCode(context.Context, *SendNotificationChannelVerificationCodeRequest) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method SendNotificationChannelVerificationCode not implemented\")\n}\nfunc (*UnimplementedNotificationChannelServiceServer) GetNotificationChannelVerificationCode(context.Context, *GetNotificationChannelVerificationCodeRequest) (*GetNotificationChannelVerificationCodeResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetNotificationChannelVerificationCode not implemented\")\n}\nfunc (*UnimplementedNotificationChannelServiceServer) VerifyNotificationChannel(context.Context, *VerifyNotificationChannelRequest) (*NotificationChannel, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method VerifyNotificationChannel not implemented\")\n}\n\nfunc RegisterNotificationChannelServiceServer(s *grpc.Server, srv NotificationChannelServiceServer) {\n\ts.RegisterService(&_NotificationChannelService_serviceDesc, srv)\n}\n\nfunc _NotificationChannelService_ListNotificationChannelDescriptors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListNotificationChannelDescriptorsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(NotificationChannelServiceServer).ListNotificationChannelDescriptors(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.NotificationChannelService/ListNotificationChannelDescriptors\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(NotificationChannelServiceServer).ListNotificationChannelDescriptors(ctx, req.(*ListNotificationChannelDescriptorsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _NotificationChannelService_GetNotificationChannelDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetNotificationChannelDescriptorRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(NotificationChannelServiceServer).GetNotificationChannelDescriptor(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.NotificationChannelService/GetNotificationChannelDescriptor\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(NotificationChannelServiceServer).GetNotificationChannelDescriptor(ctx, req.(*GetNotificationChannelDescriptorRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _NotificationChannelService_ListNotificationChannels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListNotificationChannelsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(NotificationChannelServiceServer).ListNotificationChannels(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.NotificationChannelService/ListNotificationChannels\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(NotificationChannelServiceServer).ListNotificationChannels(ctx, req.(*ListNotificationChannelsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _NotificationChannelService_GetNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetNotificationChannelRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(NotificationChannelServiceServer).GetNotificationChannel(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.NotificationChannelService/GetNotificationChannel\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(NotificationChannelServiceServer).GetNotificationChannel(ctx, req.(*GetNotificationChannelRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _NotificationChannelService_CreateNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateNotificationChannelRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(NotificationChannelServiceServer).CreateNotificationChannel(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.NotificationChannelService/CreateNotificationChannel\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(NotificationChannelServiceServer).CreateNotificationChannel(ctx, req.(*CreateNotificationChannelRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _NotificationChannelService_UpdateNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateNotificationChannelRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(NotificationChannelServiceServer).UpdateNotificationChannel(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.NotificationChannelService/UpdateNotificationChannel\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(NotificationChannelServiceServer).UpdateNotificationChannel(ctx, req.(*UpdateNotificationChannelRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _NotificationChannelService_DeleteNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(DeleteNotificationChannelRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(NotificationChannelServiceServer).DeleteNotificationChannel(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.NotificationChannelService/DeleteNotificationChannel\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(NotificationChannelServiceServer).DeleteNotificationChannel(ctx, req.(*DeleteNotificationChannelRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _NotificationChannelService_SendNotificationChannelVerificationCode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(SendNotificationChannelVerificationCodeRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(NotificationChannelServiceServer).SendNotificationChannelVerificationCode(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.NotificationChannelService/SendNotificationChannelVerificationCode\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(NotificationChannelServiceServer).SendNotificationChannelVerificationCode(ctx, req.(*SendNotificationChannelVerificationCodeRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _NotificationChannelService_GetNotificationChannelVerificationCode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetNotificationChannelVerificationCodeRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(NotificationChannelServiceServer).GetNotificationChannelVerificationCode(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.NotificationChannelService/GetNotificationChannelVerificationCode\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(NotificationChannelServiceServer).GetNotificationChannelVerificationCode(ctx, req.(*GetNotificationChannelVerificationCodeRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _NotificationChannelService_VerifyNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(VerifyNotificationChannelRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(NotificationChannelServiceServer).VerifyNotificationChannel(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.NotificationChannelService/VerifyNotificationChannel\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(NotificationChannelServiceServer).VerifyNotificationChannel(ctx, req.(*VerifyNotificationChannelRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nvar _NotificationChannelService_serviceDesc = grpc.ServiceDesc{\n\tServiceName: \"google.monitoring.v3.NotificationChannelService\",\n\tHandlerType: (*NotificationChannelServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"ListNotificationChannelDescriptors\",\n\t\t\tHandler:    _NotificationChannelService_ListNotificationChannelDescriptors_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetNotificationChannelDescriptor\",\n\t\t\tHandler:    _NotificationChannelService_GetNotificationChannelDescriptor_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListNotificationChannels\",\n\t\t\tHandler:    _NotificationChannelService_ListNotificationChannels_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetNotificationChannel\",\n\t\t\tHandler:    _NotificationChannelService_GetNotificationChannel_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateNotificationChannel\",\n\t\t\tHandler:    _NotificationChannelService_CreateNotificationChannel_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateNotificationChannel\",\n\t\t\tHandler:    _NotificationChannelService_UpdateNotificationChannel_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteNotificationChannel\",\n\t\t\tHandler:    _NotificationChannelService_DeleteNotificationChannel_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"SendNotificationChannelVerificationCode\",\n\t\t\tHandler:    _NotificationChannelService_SendNotificationChannelVerificationCode_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetNotificationChannelVerificationCode\",\n\t\t\tHandler:    _NotificationChannelService_GetNotificationChannelVerificationCode_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"VerifyNotificationChannel\",\n\t\t\tHandler:    _NotificationChannelService_VerifyNotificationChannel_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"google/monitoring/v3/notification_service.proto\",\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/query_service.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/query_service.proto\n\npackage monitoringpb\n\nimport (\n\tcontext \"context\"\n\treflect \"reflect\"\n\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\nvar File_google_monitoring_v3_query_service_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_query_service_proto_rawDesc = []byte{\n\t0x0a, 0x28, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33,\n\t0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e,\n\t0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e,\n\t0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x29, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6d, 0x65,\n\t0x74, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x32, 0xe1, 0x02, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0xa4, 0x01, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d,\n\t0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x51,\n\t0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x51, 0x75, 0x65,\n\t0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, 0x22,\n\t0x26, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65,\n\t0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65,\n\t0x73, 0x3a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x88, 0x02, 0x01, 0x1a, 0xa9, 0x01, 0xca, 0x41, 0x19,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x89, 0x01, 0x68, 0x74, 0x74,\n\t0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,\n\t0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f,\n\t0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70,\n\t0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70,\n\t0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77,\n\t0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x42, 0xcc, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x2e, 0x76, 0x33, 0x42, 0x11, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76,\n\t0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a,\n\t0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar file_google_monitoring_v3_query_service_proto_goTypes = []any{\n\t(*QueryTimeSeriesRequest)(nil),  // 0: google.monitoring.v3.QueryTimeSeriesRequest\n\t(*QueryTimeSeriesResponse)(nil), // 1: google.monitoring.v3.QueryTimeSeriesResponse\n}\nvar file_google_monitoring_v3_query_service_proto_depIdxs = []int32{\n\t0, // 0: google.monitoring.v3.QueryService.QueryTimeSeries:input_type -> google.monitoring.v3.QueryTimeSeriesRequest\n\t1, // 1: google.monitoring.v3.QueryService.QueryTimeSeries:output_type -> google.monitoring.v3.QueryTimeSeriesResponse\n\t1, // [1:2] is the sub-list for method output_type\n\t0, // [0:1] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_query_service_proto_init() }\nfunc file_google_monitoring_v3_query_service_proto_init() {\n\tif File_google_monitoring_v3_query_service_proto != nil {\n\t\treturn\n\t}\n\tfile_google_monitoring_v3_metric_service_proto_init()\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_query_service_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   0,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_query_service_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_query_service_proto_depIdxs,\n\t}.Build()\n\tFile_google_monitoring_v3_query_service_proto = out.File\n\tfile_google_monitoring_v3_query_service_proto_rawDesc = nil\n\tfile_google_monitoring_v3_query_service_proto_goTypes = nil\n\tfile_google_monitoring_v3_query_service_proto_depIdxs = nil\n}\n\n// Reference imports to suppress errors if they are not otherwise used.\nvar _ context.Context\nvar _ grpc.ClientConnInterface\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\nconst _ = grpc.SupportPackageIsVersion6\n\n// QueryServiceClient is the client API for QueryService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.\ntype QueryServiceClient interface {\n\t// Deprecated: Do not use.\n\t// Queries time series by using Monitoring Query Language (MQL). We recommend\n\t// using PromQL instead of MQL. For more information about the status of MQL,\n\t// see the [MQL deprecation\n\t// notice](https://cloud.google.com/stackdriver/docs/deprecations/mql).\n\tQueryTimeSeries(ctx context.Context, in *QueryTimeSeriesRequest, opts ...grpc.CallOption) (*QueryTimeSeriesResponse, error)\n}\n\ntype queryServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewQueryServiceClient(cc grpc.ClientConnInterface) QueryServiceClient {\n\treturn &queryServiceClient{cc}\n}\n\n// Deprecated: Do not use.\nfunc (c *queryServiceClient) QueryTimeSeries(ctx context.Context, in *QueryTimeSeriesRequest, opts ...grpc.CallOption) (*QueryTimeSeriesResponse, error) {\n\tout := new(QueryTimeSeriesResponse)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.QueryService/QueryTimeSeries\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// QueryServiceServer is the server API for QueryService service.\ntype QueryServiceServer interface {\n\t// Deprecated: Do not use.\n\t// Queries time series by using Monitoring Query Language (MQL). We recommend\n\t// using PromQL instead of MQL. For more information about the status of MQL,\n\t// see the [MQL deprecation\n\t// notice](https://cloud.google.com/stackdriver/docs/deprecations/mql).\n\tQueryTimeSeries(context.Context, *QueryTimeSeriesRequest) (*QueryTimeSeriesResponse, error)\n}\n\n// UnimplementedQueryServiceServer can be embedded to have forward compatible implementations.\ntype UnimplementedQueryServiceServer struct {\n}\n\nfunc (*UnimplementedQueryServiceServer) QueryTimeSeries(context.Context, *QueryTimeSeriesRequest) (*QueryTimeSeriesResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method QueryTimeSeries not implemented\")\n}\n\nfunc RegisterQueryServiceServer(s *grpc.Server, srv QueryServiceServer) {\n\ts.RegisterService(&_QueryService_serviceDesc, srv)\n}\n\nfunc _QueryService_QueryTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(QueryTimeSeriesRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(QueryServiceServer).QueryTimeSeries(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.QueryService/QueryTimeSeries\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(QueryServiceServer).QueryTimeSeries(ctx, req.(*QueryTimeSeriesRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nvar _QueryService_serviceDesc = grpc.ServiceDesc{\n\tServiceName: \"google.monitoring.v3.QueryService\",\n\tHandlerType: (*QueryServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"QueryTimeSeries\",\n\t\t\tHandler:    _QueryService_QueryTimeSeries_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"google/monitoring/v3/query_service.proto\",\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/service.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/service.proto\n\npackage monitoringpb\n\nimport (\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tcalendarperiod \"google.golang.org/genproto/googleapis/type/calendarperiod\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdurationpb \"google.golang.org/protobuf/types/known/durationpb\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// `ServiceLevelObjective.View` determines what form of\n// `ServiceLevelObjective` is returned from `GetServiceLevelObjective`,\n// `ListServiceLevelObjectives`, and `ListServiceLevelObjectiveVersions` RPCs.\ntype ServiceLevelObjective_View int32\n\nconst (\n\t// Same as FULL.\n\tServiceLevelObjective_VIEW_UNSPECIFIED ServiceLevelObjective_View = 0\n\t// Return the embedded `ServiceLevelIndicator` in the form in which it was\n\t// defined. If it was defined using a `BasicSli`, return that `BasicSli`.\n\tServiceLevelObjective_FULL ServiceLevelObjective_View = 2\n\t// For `ServiceLevelIndicator`s using `BasicSli` articulation, instead\n\t// return the `ServiceLevelIndicator` with its mode of computation fully\n\t// spelled out as a `RequestBasedSli`. For `ServiceLevelIndicator`s using\n\t// `RequestBasedSli` or `WindowsBasedSli`, return the\n\t// `ServiceLevelIndicator` as it was provided.\n\tServiceLevelObjective_EXPLICIT ServiceLevelObjective_View = 1\n)\n\n// Enum value maps for ServiceLevelObjective_View.\nvar (\n\tServiceLevelObjective_View_name = map[int32]string{\n\t\t0: \"VIEW_UNSPECIFIED\",\n\t\t2: \"FULL\",\n\t\t1: \"EXPLICIT\",\n\t}\n\tServiceLevelObjective_View_value = map[string]int32{\n\t\t\"VIEW_UNSPECIFIED\": 0,\n\t\t\"FULL\":             2,\n\t\t\"EXPLICIT\":         1,\n\t}\n)\n\nfunc (x ServiceLevelObjective_View) Enum() *ServiceLevelObjective_View {\n\tp := new(ServiceLevelObjective_View)\n\t*p = x\n\treturn p\n}\n\nfunc (x ServiceLevelObjective_View) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ServiceLevelObjective_View) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_service_proto_enumTypes[0].Descriptor()\n}\n\nfunc (ServiceLevelObjective_View) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_service_proto_enumTypes[0]\n}\n\nfunc (x ServiceLevelObjective_View) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ServiceLevelObjective_View.Descriptor instead.\nfunc (ServiceLevelObjective_View) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{1, 0}\n}\n\n// A `Service` is a discrete, autonomous, and network-accessible unit, designed\n// to solve an individual concern\n// ([Wikipedia](https://en.wikipedia.org/wiki/Service-orientation)). In\n// Cloud Monitoring, a `Service` acts as the root resource under which\n// operational aspects of the service are accessible.\ntype Service struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Identifier. Resource name for this Service. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/services/[SERVICE_ID]\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// Name used for UI elements listing this Service.\n\tDisplayName string `protobuf:\"bytes,2,opt,name=display_name,json=displayName,proto3\" json:\"display_name,omitempty\"`\n\t// REQUIRED. Service-identifying atoms specifying the underlying service.\n\t//\n\t// Types that are assignable to Identifier:\n\t//\n\t//\t*Service_Custom_\n\t//\t*Service_AppEngine_\n\t//\t*Service_CloudEndpoints_\n\t//\t*Service_ClusterIstio_\n\t//\t*Service_MeshIstio_\n\t//\t*Service_IstioCanonicalService_\n\t//\t*Service_CloudRun_\n\t//\t*Service_GkeNamespace_\n\t//\t*Service_GkeWorkload_\n\t//\t*Service_GkeService_\n\tIdentifier isService_Identifier `protobuf_oneof:\"identifier\"`\n\t// Message that contains the service type and service labels of this service\n\t// if it is a basic service.\n\t// Documentation and examples\n\t// [here](https://cloud.google.com/stackdriver/docs/solutions/slo-monitoring/api/api-structures#basic-svc-w-basic-sli).\n\tBasicService *Service_BasicService `protobuf:\"bytes,19,opt,name=basic_service,json=basicService,proto3\" json:\"basic_service,omitempty\"`\n\t// Configuration for how to query telemetry on a Service.\n\tTelemetry *Service_Telemetry `protobuf:\"bytes,13,opt,name=telemetry,proto3\" json:\"telemetry,omitempty\"`\n\t// Labels which have been used to annotate the service. Label keys must start\n\t// with a letter. Label keys and values may contain lowercase letters,\n\t// numbers, underscores, and dashes. Label keys and values have a maximum\n\t// length of 63 characters, and must be less than 128 bytes in size. Up to 64\n\t// label entries may be stored. For labels which do not have a semantic value,\n\t// the empty string may be supplied for the label value.\n\tUserLabels map[string]string `protobuf:\"bytes,14,rep,name=user_labels,json=userLabels,proto3\" json:\"user_labels,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n}\n\nfunc (x *Service) Reset() {\n\t*x = Service{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Service) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service) ProtoMessage() {}\n\nfunc (x *Service) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service.ProtoReflect.Descriptor instead.\nfunc (*Service) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Service) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service) GetDisplayName() string {\n\tif x != nil {\n\t\treturn x.DisplayName\n\t}\n\treturn \"\"\n}\n\nfunc (m *Service) GetIdentifier() isService_Identifier {\n\tif m != nil {\n\t\treturn m.Identifier\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetCustom() *Service_Custom {\n\tif x, ok := x.GetIdentifier().(*Service_Custom_); ok {\n\t\treturn x.Custom\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetAppEngine() *Service_AppEngine {\n\tif x, ok := x.GetIdentifier().(*Service_AppEngine_); ok {\n\t\treturn x.AppEngine\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetCloudEndpoints() *Service_CloudEndpoints {\n\tif x, ok := x.GetIdentifier().(*Service_CloudEndpoints_); ok {\n\t\treturn x.CloudEndpoints\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetClusterIstio() *Service_ClusterIstio {\n\tif x, ok := x.GetIdentifier().(*Service_ClusterIstio_); ok {\n\t\treturn x.ClusterIstio\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetMeshIstio() *Service_MeshIstio {\n\tif x, ok := x.GetIdentifier().(*Service_MeshIstio_); ok {\n\t\treturn x.MeshIstio\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetIstioCanonicalService() *Service_IstioCanonicalService {\n\tif x, ok := x.GetIdentifier().(*Service_IstioCanonicalService_); ok {\n\t\treturn x.IstioCanonicalService\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetCloudRun() *Service_CloudRun {\n\tif x, ok := x.GetIdentifier().(*Service_CloudRun_); ok {\n\t\treturn x.CloudRun\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetGkeNamespace() *Service_GkeNamespace {\n\tif x, ok := x.GetIdentifier().(*Service_GkeNamespace_); ok {\n\t\treturn x.GkeNamespace\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetGkeWorkload() *Service_GkeWorkload {\n\tif x, ok := x.GetIdentifier().(*Service_GkeWorkload_); ok {\n\t\treturn x.GkeWorkload\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetGkeService() *Service_GkeService {\n\tif x, ok := x.GetIdentifier().(*Service_GkeService_); ok {\n\t\treturn x.GkeService\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetBasicService() *Service_BasicService {\n\tif x != nil {\n\t\treturn x.BasicService\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetTelemetry() *Service_Telemetry {\n\tif x != nil {\n\t\treturn x.Telemetry\n\t}\n\treturn nil\n}\n\nfunc (x *Service) GetUserLabels() map[string]string {\n\tif x != nil {\n\t\treturn x.UserLabels\n\t}\n\treturn nil\n}\n\ntype isService_Identifier interface {\n\tisService_Identifier()\n}\n\ntype Service_Custom_ struct {\n\t// Custom service type.\n\tCustom *Service_Custom `protobuf:\"bytes,6,opt,name=custom,proto3,oneof\"`\n}\n\ntype Service_AppEngine_ struct {\n\t// Type used for App Engine services.\n\tAppEngine *Service_AppEngine `protobuf:\"bytes,7,opt,name=app_engine,json=appEngine,proto3,oneof\"`\n}\n\ntype Service_CloudEndpoints_ struct {\n\t// Type used for Cloud Endpoints services.\n\tCloudEndpoints *Service_CloudEndpoints `protobuf:\"bytes,8,opt,name=cloud_endpoints,json=cloudEndpoints,proto3,oneof\"`\n}\n\ntype Service_ClusterIstio_ struct {\n\t// Type used for Istio services that live in a Kubernetes cluster.\n\tClusterIstio *Service_ClusterIstio `protobuf:\"bytes,9,opt,name=cluster_istio,json=clusterIstio,proto3,oneof\"`\n}\n\ntype Service_MeshIstio_ struct {\n\t// Type used for Istio services scoped to an Istio mesh.\n\tMeshIstio *Service_MeshIstio `protobuf:\"bytes,10,opt,name=mesh_istio,json=meshIstio,proto3,oneof\"`\n}\n\ntype Service_IstioCanonicalService_ struct {\n\t// Type used for canonical services scoped to an Istio mesh.\n\t// Metrics for Istio are\n\t// [documented here](https://istio.io/latest/docs/reference/config/metrics/)\n\tIstioCanonicalService *Service_IstioCanonicalService `protobuf:\"bytes,11,opt,name=istio_canonical_service,json=istioCanonicalService,proto3,oneof\"`\n}\n\ntype Service_CloudRun_ struct {\n\t// Type used for Cloud Run services.\n\tCloudRun *Service_CloudRun `protobuf:\"bytes,12,opt,name=cloud_run,json=cloudRun,proto3,oneof\"`\n}\n\ntype Service_GkeNamespace_ struct {\n\t// Type used for GKE Namespaces.\n\tGkeNamespace *Service_GkeNamespace `protobuf:\"bytes,15,opt,name=gke_namespace,json=gkeNamespace,proto3,oneof\"`\n}\n\ntype Service_GkeWorkload_ struct {\n\t// Type used for GKE Workloads.\n\tGkeWorkload *Service_GkeWorkload `protobuf:\"bytes,16,opt,name=gke_workload,json=gkeWorkload,proto3,oneof\"`\n}\n\ntype Service_GkeService_ struct {\n\t// Type used for GKE Services (the Kubernetes concept of a service).\n\tGkeService *Service_GkeService `protobuf:\"bytes,17,opt,name=gke_service,json=gkeService,proto3,oneof\"`\n}\n\nfunc (*Service_Custom_) isService_Identifier() {}\n\nfunc (*Service_AppEngine_) isService_Identifier() {}\n\nfunc (*Service_CloudEndpoints_) isService_Identifier() {}\n\nfunc (*Service_ClusterIstio_) isService_Identifier() {}\n\nfunc (*Service_MeshIstio_) isService_Identifier() {}\n\nfunc (*Service_IstioCanonicalService_) isService_Identifier() {}\n\nfunc (*Service_CloudRun_) isService_Identifier() {}\n\nfunc (*Service_GkeNamespace_) isService_Identifier() {}\n\nfunc (*Service_GkeWorkload_) isService_Identifier() {}\n\nfunc (*Service_GkeService_) isService_Identifier() {}\n\n// A Service-Level Objective (SLO) describes a level of desired good service. It\n// consists of a service-level indicator (SLI), a performance goal, and a period\n// over which the objective is to be evaluated against that goal. The SLO can\n// use SLIs defined in a number of different manners. Typical SLOs might include\n// \"99% of requests in each rolling week have latency below 200 milliseconds\" or\n// \"99.5% of requests in each calendar month return successfully.\"\ntype ServiceLevelObjective struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Identifier. Resource name for this `ServiceLevelObjective`. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/services/[SERVICE_ID]/serviceLevelObjectives/[SLO_NAME]\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// Name used for UI elements listing this SLO.\n\tDisplayName string `protobuf:\"bytes,11,opt,name=display_name,json=displayName,proto3\" json:\"display_name,omitempty\"`\n\t// The definition of good service, used to measure and calculate the quality\n\t// of the `Service`'s performance with respect to a single aspect of service\n\t// quality.\n\tServiceLevelIndicator *ServiceLevelIndicator `protobuf:\"bytes,3,opt,name=service_level_indicator,json=serviceLevelIndicator,proto3\" json:\"service_level_indicator,omitempty\"`\n\t// The fraction of service that must be good in order for this objective to be\n\t// met. `0 < goal <= 0.9999`.\n\tGoal float64 `protobuf:\"fixed64,4,opt,name=goal,proto3\" json:\"goal,omitempty\"`\n\t// The time period over which the objective will be evaluated.\n\t//\n\t// Types that are assignable to Period:\n\t//\n\t//\t*ServiceLevelObjective_RollingPeriod\n\t//\t*ServiceLevelObjective_CalendarPeriod\n\tPeriod isServiceLevelObjective_Period `protobuf_oneof:\"period\"`\n\t// Labels which have been used to annotate the service-level objective. Label\n\t// keys must start with a letter. Label keys and values may contain lowercase\n\t// letters, numbers, underscores, and dashes. Label keys and values have a\n\t// maximum length of 63 characters, and must be less than 128 bytes in size.\n\t// Up to 64 label entries may be stored. For labels which do not have a\n\t// semantic value, the empty string may be supplied for the label value.\n\tUserLabels map[string]string `protobuf:\"bytes,12,rep,name=user_labels,json=userLabels,proto3\" json:\"user_labels,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n}\n\nfunc (x *ServiceLevelObjective) Reset() {\n\t*x = ServiceLevelObjective{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ServiceLevelObjective) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceLevelObjective) ProtoMessage() {}\n\nfunc (x *ServiceLevelObjective) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceLevelObjective.ProtoReflect.Descriptor instead.\nfunc (*ServiceLevelObjective) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *ServiceLevelObjective) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceLevelObjective) GetDisplayName() string {\n\tif x != nil {\n\t\treturn x.DisplayName\n\t}\n\treturn \"\"\n}\n\nfunc (x *ServiceLevelObjective) GetServiceLevelIndicator() *ServiceLevelIndicator {\n\tif x != nil {\n\t\treturn x.ServiceLevelIndicator\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceLevelObjective) GetGoal() float64 {\n\tif x != nil {\n\t\treturn x.Goal\n\t}\n\treturn 0\n}\n\nfunc (m *ServiceLevelObjective) GetPeriod() isServiceLevelObjective_Period {\n\tif m != nil {\n\t\treturn m.Period\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceLevelObjective) GetRollingPeriod() *durationpb.Duration {\n\tif x, ok := x.GetPeriod().(*ServiceLevelObjective_RollingPeriod); ok {\n\t\treturn x.RollingPeriod\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceLevelObjective) GetCalendarPeriod() calendarperiod.CalendarPeriod {\n\tif x, ok := x.GetPeriod().(*ServiceLevelObjective_CalendarPeriod); ok {\n\t\treturn x.CalendarPeriod\n\t}\n\treturn calendarperiod.CalendarPeriod(0)\n}\n\nfunc (x *ServiceLevelObjective) GetUserLabels() map[string]string {\n\tif x != nil {\n\t\treturn x.UserLabels\n\t}\n\treturn nil\n}\n\ntype isServiceLevelObjective_Period interface {\n\tisServiceLevelObjective_Period()\n}\n\ntype ServiceLevelObjective_RollingPeriod struct {\n\t// A rolling time period, semantically \"in the past `<rolling_period>`\".\n\t// Must be an integer multiple of 1 day no larger than 30 days.\n\tRollingPeriod *durationpb.Duration `protobuf:\"bytes,5,opt,name=rolling_period,json=rollingPeriod,proto3,oneof\"`\n}\n\ntype ServiceLevelObjective_CalendarPeriod struct {\n\t// A calendar period, semantically \"since the start of the current\n\t// `<calendar_period>`\". At this time, only `DAY`, `WEEK`, `FORTNIGHT`, and\n\t// `MONTH` are supported.\n\tCalendarPeriod calendarperiod.CalendarPeriod `protobuf:\"varint,6,opt,name=calendar_period,json=calendarPeriod,proto3,enum=google.type.CalendarPeriod,oneof\"`\n}\n\nfunc (*ServiceLevelObjective_RollingPeriod) isServiceLevelObjective_Period() {}\n\nfunc (*ServiceLevelObjective_CalendarPeriod) isServiceLevelObjective_Period() {}\n\n// A Service-Level Indicator (SLI) describes the \"performance\" of a service. For\n// some services, the SLI is well-defined. In such cases, the SLI can be\n// described easily by referencing the well-known SLI and providing the needed\n// parameters. Alternatively, a \"custom\" SLI can be defined with a query to the\n// underlying metric store. An SLI is defined to be `good_service /\n// total_service` over any queried time interval. The value of performance\n// always falls into the range `0 <= performance <= 1`. A custom SLI describes\n// how to compute this ratio, whether this is by dividing values from a pair of\n// time series, cutting a `Distribution` into good and bad counts, or counting\n// time windows in which the service complies with a criterion. For separation\n// of concerns, a single Service-Level Indicator measures performance for only\n// one aspect of service quality, such as fraction of successful queries or\n// fast-enough queries.\ntype ServiceLevelIndicator struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Service level indicators can be grouped by whether the \"unit\" of service\n\t// being measured is based on counts of good requests or on counts of good\n\t// time windows\n\t//\n\t// Types that are assignable to Type:\n\t//\n\t//\t*ServiceLevelIndicator_BasicSli\n\t//\t*ServiceLevelIndicator_RequestBased\n\t//\t*ServiceLevelIndicator_WindowsBased\n\tType isServiceLevelIndicator_Type `protobuf_oneof:\"type\"`\n}\n\nfunc (x *ServiceLevelIndicator) Reset() {\n\t*x = ServiceLevelIndicator{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[2]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ServiceLevelIndicator) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceLevelIndicator) ProtoMessage() {}\n\nfunc (x *ServiceLevelIndicator) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[2]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceLevelIndicator.ProtoReflect.Descriptor instead.\nfunc (*ServiceLevelIndicator) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (m *ServiceLevelIndicator) GetType() isServiceLevelIndicator_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceLevelIndicator) GetBasicSli() *BasicSli {\n\tif x, ok := x.GetType().(*ServiceLevelIndicator_BasicSli); ok {\n\t\treturn x.BasicSli\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceLevelIndicator) GetRequestBased() *RequestBasedSli {\n\tif x, ok := x.GetType().(*ServiceLevelIndicator_RequestBased); ok {\n\t\treturn x.RequestBased\n\t}\n\treturn nil\n}\n\nfunc (x *ServiceLevelIndicator) GetWindowsBased() *WindowsBasedSli {\n\tif x, ok := x.GetType().(*ServiceLevelIndicator_WindowsBased); ok {\n\t\treturn x.WindowsBased\n\t}\n\treturn nil\n}\n\ntype isServiceLevelIndicator_Type interface {\n\tisServiceLevelIndicator_Type()\n}\n\ntype ServiceLevelIndicator_BasicSli struct {\n\t// Basic SLI on a well-known service type.\n\tBasicSli *BasicSli `protobuf:\"bytes,4,opt,name=basic_sli,json=basicSli,proto3,oneof\"`\n}\n\ntype ServiceLevelIndicator_RequestBased struct {\n\t// Request-based SLIs\n\tRequestBased *RequestBasedSli `protobuf:\"bytes,1,opt,name=request_based,json=requestBased,proto3,oneof\"`\n}\n\ntype ServiceLevelIndicator_WindowsBased struct {\n\t// Windows-based SLIs\n\tWindowsBased *WindowsBasedSli `protobuf:\"bytes,2,opt,name=windows_based,json=windowsBased,proto3,oneof\"`\n}\n\nfunc (*ServiceLevelIndicator_BasicSli) isServiceLevelIndicator_Type() {}\n\nfunc (*ServiceLevelIndicator_RequestBased) isServiceLevelIndicator_Type() {}\n\nfunc (*ServiceLevelIndicator_WindowsBased) isServiceLevelIndicator_Type() {}\n\n// An SLI measuring performance on a well-known service type. Performance will\n// be computed on the basis of pre-defined metrics. The type of the\n// `service_resource` determines the metrics to use and the\n// `service_resource.labels` and `metric_labels` are used to construct a\n// monitoring filter to filter that metric down to just the data relevant to\n// this service.\ntype BasicSli struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// OPTIONAL: The set of RPCs to which this SLI is relevant. Telemetry from\n\t// other methods will not be used to calculate performance for this SLI. If\n\t// omitted, this SLI applies to all the Service's methods. For service types\n\t// that don't support breaking down by method, setting this field will result\n\t// in an error.\n\tMethod []string `protobuf:\"bytes,7,rep,name=method,proto3\" json:\"method,omitempty\"`\n\t// OPTIONAL: The set of locations to which this SLI is relevant. Telemetry\n\t// from other locations will not be used to calculate performance for this\n\t// SLI. If omitted, this SLI applies to all locations in which the Service has\n\t// activity. For service types that don't support breaking down by location,\n\t// setting this field will result in an error.\n\tLocation []string `protobuf:\"bytes,8,rep,name=location,proto3\" json:\"location,omitempty\"`\n\t// OPTIONAL: The set of API versions to which this SLI is relevant. Telemetry\n\t// from other API versions will not be used to calculate performance for this\n\t// SLI. If omitted, this SLI applies to all API versions. For service types\n\t// that don't support breaking down by version, setting this field will result\n\t// in an error.\n\tVersion []string `protobuf:\"bytes,9,rep,name=version,proto3\" json:\"version,omitempty\"`\n\t// This SLI can be evaluated on the basis of availability or latency.\n\t//\n\t// Types that are assignable to SliCriteria:\n\t//\n\t//\t*BasicSli_Availability\n\t//\t*BasicSli_Latency\n\tSliCriteria isBasicSli_SliCriteria `protobuf_oneof:\"sli_criteria\"`\n}\n\nfunc (x *BasicSli) Reset() {\n\t*x = BasicSli{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[3]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *BasicSli) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BasicSli) ProtoMessage() {}\n\nfunc (x *BasicSli) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[3]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BasicSli.ProtoReflect.Descriptor instead.\nfunc (*BasicSli) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *BasicSli) GetMethod() []string {\n\tif x != nil {\n\t\treturn x.Method\n\t}\n\treturn nil\n}\n\nfunc (x *BasicSli) GetLocation() []string {\n\tif x != nil {\n\t\treturn x.Location\n\t}\n\treturn nil\n}\n\nfunc (x *BasicSli) GetVersion() []string {\n\tif x != nil {\n\t\treturn x.Version\n\t}\n\treturn nil\n}\n\nfunc (m *BasicSli) GetSliCriteria() isBasicSli_SliCriteria {\n\tif m != nil {\n\t\treturn m.SliCriteria\n\t}\n\treturn nil\n}\n\nfunc (x *BasicSli) GetAvailability() *BasicSli_AvailabilityCriteria {\n\tif x, ok := x.GetSliCriteria().(*BasicSli_Availability); ok {\n\t\treturn x.Availability\n\t}\n\treturn nil\n}\n\nfunc (x *BasicSli) GetLatency() *BasicSli_LatencyCriteria {\n\tif x, ok := x.GetSliCriteria().(*BasicSli_Latency); ok {\n\t\treturn x.Latency\n\t}\n\treturn nil\n}\n\ntype isBasicSli_SliCriteria interface {\n\tisBasicSli_SliCriteria()\n}\n\ntype BasicSli_Availability struct {\n\t// Good service is defined to be the count of requests made to this service\n\t// that return successfully.\n\tAvailability *BasicSli_AvailabilityCriteria `protobuf:\"bytes,2,opt,name=availability,proto3,oneof\"`\n}\n\ntype BasicSli_Latency struct {\n\t// Good service is defined to be the count of requests made to this service\n\t// that are fast enough with respect to `latency.threshold`.\n\tLatency *BasicSli_LatencyCriteria `protobuf:\"bytes,3,opt,name=latency,proto3,oneof\"`\n}\n\nfunc (*BasicSli_Availability) isBasicSli_SliCriteria() {}\n\nfunc (*BasicSli_Latency) isBasicSli_SliCriteria() {}\n\n// Range of numerical values within `min` and `max`.\ntype Range struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Range minimum.\n\tMin float64 `protobuf:\"fixed64,1,opt,name=min,proto3\" json:\"min,omitempty\"`\n\t// Range maximum.\n\tMax float64 `protobuf:\"fixed64,2,opt,name=max,proto3\" json:\"max,omitempty\"`\n}\n\nfunc (x *Range) Reset() {\n\t*x = Range{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[4]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Range) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Range) ProtoMessage() {}\n\nfunc (x *Range) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[4]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Range.ProtoReflect.Descriptor instead.\nfunc (*Range) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *Range) GetMin() float64 {\n\tif x != nil {\n\t\treturn x.Min\n\t}\n\treturn 0\n}\n\nfunc (x *Range) GetMax() float64 {\n\tif x != nil {\n\t\treturn x.Max\n\t}\n\treturn 0\n}\n\n// Service Level Indicators for which atomic units of service are counted\n// directly.\ntype RequestBasedSli struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The means to compute a ratio of `good_service` to `total_service`.\n\t//\n\t// Types that are assignable to Method:\n\t//\n\t//\t*RequestBasedSli_GoodTotalRatio\n\t//\t*RequestBasedSli_DistributionCut\n\tMethod isRequestBasedSli_Method `protobuf_oneof:\"method\"`\n}\n\nfunc (x *RequestBasedSli) Reset() {\n\t*x = RequestBasedSli{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[5]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *RequestBasedSli) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RequestBasedSli) ProtoMessage() {}\n\nfunc (x *RequestBasedSli) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[5]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RequestBasedSli.ProtoReflect.Descriptor instead.\nfunc (*RequestBasedSli) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (m *RequestBasedSli) GetMethod() isRequestBasedSli_Method {\n\tif m != nil {\n\t\treturn m.Method\n\t}\n\treturn nil\n}\n\nfunc (x *RequestBasedSli) GetGoodTotalRatio() *TimeSeriesRatio {\n\tif x, ok := x.GetMethod().(*RequestBasedSli_GoodTotalRatio); ok {\n\t\treturn x.GoodTotalRatio\n\t}\n\treturn nil\n}\n\nfunc (x *RequestBasedSli) GetDistributionCut() *DistributionCut {\n\tif x, ok := x.GetMethod().(*RequestBasedSli_DistributionCut); ok {\n\t\treturn x.DistributionCut\n\t}\n\treturn nil\n}\n\ntype isRequestBasedSli_Method interface {\n\tisRequestBasedSli_Method()\n}\n\ntype RequestBasedSli_GoodTotalRatio struct {\n\t// `good_total_ratio` is used when the ratio of `good_service` to\n\t// `total_service` is computed from two `TimeSeries`.\n\tGoodTotalRatio *TimeSeriesRatio `protobuf:\"bytes,1,opt,name=good_total_ratio,json=goodTotalRatio,proto3,oneof\"`\n}\n\ntype RequestBasedSli_DistributionCut struct {\n\t// `distribution_cut` is used when `good_service` is a count of values\n\t// aggregated in a `Distribution` that fall into a good range. The\n\t// `total_service` is the total count of all values aggregated in the\n\t// `Distribution`.\n\tDistributionCut *DistributionCut `protobuf:\"bytes,3,opt,name=distribution_cut,json=distributionCut,proto3,oneof\"`\n}\n\nfunc (*RequestBasedSli_GoodTotalRatio) isRequestBasedSli_Method() {}\n\nfunc (*RequestBasedSli_DistributionCut) isRequestBasedSli_Method() {}\n\n// A `TimeSeriesRatio` specifies two `TimeSeries` to use for computing the\n// `good_service / total_service` ratio. The specified `TimeSeries` must have\n// `ValueType = DOUBLE` or `ValueType = INT64` and must have `MetricKind =\n// DELTA` or `MetricKind = CUMULATIVE`. The `TimeSeriesRatio` must specify\n// exactly two of good, bad, and total, and the relationship `good_service +\n// bad_service = total_service` will be assumed.\ntype TimeSeriesRatio struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// A [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters)\n\t// specifying a `TimeSeries` quantifying good service provided. Must have\n\t// `ValueType = DOUBLE` or `ValueType = INT64` and must have `MetricKind =\n\t// DELTA` or `MetricKind = CUMULATIVE`.\n\tGoodServiceFilter string `protobuf:\"bytes,4,opt,name=good_service_filter,json=goodServiceFilter,proto3\" json:\"good_service_filter,omitempty\"`\n\t// A [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters)\n\t// specifying a `TimeSeries` quantifying bad service, either demanded service\n\t// that was not provided or demanded service that was of inadequate quality.\n\t// Must have `ValueType = DOUBLE` or `ValueType = INT64` and must have\n\t// `MetricKind = DELTA` or `MetricKind = CUMULATIVE`.\n\tBadServiceFilter string `protobuf:\"bytes,5,opt,name=bad_service_filter,json=badServiceFilter,proto3\" json:\"bad_service_filter,omitempty\"`\n\t// A [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters)\n\t// specifying a `TimeSeries` quantifying total demanded service. Must have\n\t// `ValueType = DOUBLE` or `ValueType = INT64` and must have `MetricKind =\n\t// DELTA` or `MetricKind = CUMULATIVE`.\n\tTotalServiceFilter string `protobuf:\"bytes,6,opt,name=total_service_filter,json=totalServiceFilter,proto3\" json:\"total_service_filter,omitempty\"`\n}\n\nfunc (x *TimeSeriesRatio) Reset() {\n\t*x = TimeSeriesRatio{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[6]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *TimeSeriesRatio) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*TimeSeriesRatio) ProtoMessage() {}\n\nfunc (x *TimeSeriesRatio) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[6]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use TimeSeriesRatio.ProtoReflect.Descriptor instead.\nfunc (*TimeSeriesRatio) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *TimeSeriesRatio) GetGoodServiceFilter() string {\n\tif x != nil {\n\t\treturn x.GoodServiceFilter\n\t}\n\treturn \"\"\n}\n\nfunc (x *TimeSeriesRatio) GetBadServiceFilter() string {\n\tif x != nil {\n\t\treturn x.BadServiceFilter\n\t}\n\treturn \"\"\n}\n\nfunc (x *TimeSeriesRatio) GetTotalServiceFilter() string {\n\tif x != nil {\n\t\treturn x.TotalServiceFilter\n\t}\n\treturn \"\"\n}\n\n// A `DistributionCut` defines a `TimeSeries` and thresholds used for measuring\n// good service and total service. The `TimeSeries` must have `ValueType =\n// DISTRIBUTION` and `MetricKind = DELTA` or `MetricKind = CUMULATIVE`. The\n// computed `good_service` will be the estimated count of values in the\n// `Distribution` that fall within the specified `min` and `max`.\ntype DistributionCut struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// A [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters)\n\t// specifying a `TimeSeries` aggregating values. Must have `ValueType =\n\t// DISTRIBUTION` and `MetricKind = DELTA` or `MetricKind = CUMULATIVE`.\n\tDistributionFilter string `protobuf:\"bytes,4,opt,name=distribution_filter,json=distributionFilter,proto3\" json:\"distribution_filter,omitempty\"`\n\t// Range of values considered \"good.\" For a one-sided range, set one bound to\n\t// an infinite value.\n\tRange *Range `protobuf:\"bytes,5,opt,name=range,proto3\" json:\"range,omitempty\"`\n}\n\nfunc (x *DistributionCut) Reset() {\n\t*x = DistributionCut{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[7]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *DistributionCut) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DistributionCut) ProtoMessage() {}\n\nfunc (x *DistributionCut) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[7]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DistributionCut.ProtoReflect.Descriptor instead.\nfunc (*DistributionCut) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *DistributionCut) GetDistributionFilter() string {\n\tif x != nil {\n\t\treturn x.DistributionFilter\n\t}\n\treturn \"\"\n}\n\nfunc (x *DistributionCut) GetRange() *Range {\n\tif x != nil {\n\t\treturn x.Range\n\t}\n\treturn nil\n}\n\n// A `WindowsBasedSli` defines `good_service` as the count of time windows for\n// which the provided service was of good quality. Criteria for determining\n// if service was good are embedded in the `window_criterion`.\ntype WindowsBasedSli struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The criterion to use for evaluating window goodness.\n\t//\n\t// Types that are assignable to WindowCriterion:\n\t//\n\t//\t*WindowsBasedSli_GoodBadMetricFilter\n\t//\t*WindowsBasedSli_GoodTotalRatioThreshold\n\t//\t*WindowsBasedSli_MetricMeanInRange\n\t//\t*WindowsBasedSli_MetricSumInRange\n\tWindowCriterion isWindowsBasedSli_WindowCriterion `protobuf_oneof:\"window_criterion\"`\n\t// Duration over which window quality is evaluated. Must be an integer\n\t// fraction of a day and at least `60s`.\n\tWindowPeriod *durationpb.Duration `protobuf:\"bytes,4,opt,name=window_period,json=windowPeriod,proto3\" json:\"window_period,omitempty\"`\n}\n\nfunc (x *WindowsBasedSli) Reset() {\n\t*x = WindowsBasedSli{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[8]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *WindowsBasedSli) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*WindowsBasedSli) ProtoMessage() {}\n\nfunc (x *WindowsBasedSli) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[8]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use WindowsBasedSli.ProtoReflect.Descriptor instead.\nfunc (*WindowsBasedSli) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (m *WindowsBasedSli) GetWindowCriterion() isWindowsBasedSli_WindowCriterion {\n\tif m != nil {\n\t\treturn m.WindowCriterion\n\t}\n\treturn nil\n}\n\nfunc (x *WindowsBasedSli) GetGoodBadMetricFilter() string {\n\tif x, ok := x.GetWindowCriterion().(*WindowsBasedSli_GoodBadMetricFilter); ok {\n\t\treturn x.GoodBadMetricFilter\n\t}\n\treturn \"\"\n}\n\nfunc (x *WindowsBasedSli) GetGoodTotalRatioThreshold() *WindowsBasedSli_PerformanceThreshold {\n\tif x, ok := x.GetWindowCriterion().(*WindowsBasedSli_GoodTotalRatioThreshold); ok {\n\t\treturn x.GoodTotalRatioThreshold\n\t}\n\treturn nil\n}\n\nfunc (x *WindowsBasedSli) GetMetricMeanInRange() *WindowsBasedSli_MetricRange {\n\tif x, ok := x.GetWindowCriterion().(*WindowsBasedSli_MetricMeanInRange); ok {\n\t\treturn x.MetricMeanInRange\n\t}\n\treturn nil\n}\n\nfunc (x *WindowsBasedSli) GetMetricSumInRange() *WindowsBasedSli_MetricRange {\n\tif x, ok := x.GetWindowCriterion().(*WindowsBasedSli_MetricSumInRange); ok {\n\t\treturn x.MetricSumInRange\n\t}\n\treturn nil\n}\n\nfunc (x *WindowsBasedSli) GetWindowPeriod() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.WindowPeriod\n\t}\n\treturn nil\n}\n\ntype isWindowsBasedSli_WindowCriterion interface {\n\tisWindowsBasedSli_WindowCriterion()\n}\n\ntype WindowsBasedSli_GoodBadMetricFilter struct {\n\t// A [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters)\n\t// specifying a `TimeSeries` with `ValueType = BOOL`. The window is good if\n\t// any `true` values appear in the window.\n\tGoodBadMetricFilter string `protobuf:\"bytes,5,opt,name=good_bad_metric_filter,json=goodBadMetricFilter,proto3,oneof\"`\n}\n\ntype WindowsBasedSli_GoodTotalRatioThreshold struct {\n\t// A window is good if its `performance` is high enough.\n\tGoodTotalRatioThreshold *WindowsBasedSli_PerformanceThreshold `protobuf:\"bytes,2,opt,name=good_total_ratio_threshold,json=goodTotalRatioThreshold,proto3,oneof\"`\n}\n\ntype WindowsBasedSli_MetricMeanInRange struct {\n\t// A window is good if the metric's value is in a good range, averaged\n\t// across returned streams.\n\tMetricMeanInRange *WindowsBasedSli_MetricRange `protobuf:\"bytes,6,opt,name=metric_mean_in_range,json=metricMeanInRange,proto3,oneof\"`\n}\n\ntype WindowsBasedSli_MetricSumInRange struct {\n\t// A window is good if the metric's value is in a good range, summed across\n\t// returned streams.\n\tMetricSumInRange *WindowsBasedSli_MetricRange `protobuf:\"bytes,7,opt,name=metric_sum_in_range,json=metricSumInRange,proto3,oneof\"`\n}\n\nfunc (*WindowsBasedSli_GoodBadMetricFilter) isWindowsBasedSli_WindowCriterion() {}\n\nfunc (*WindowsBasedSli_GoodTotalRatioThreshold) isWindowsBasedSli_WindowCriterion() {}\n\nfunc (*WindowsBasedSli_MetricMeanInRange) isWindowsBasedSli_WindowCriterion() {}\n\nfunc (*WindowsBasedSli_MetricSumInRange) isWindowsBasedSli_WindowCriterion() {}\n\n// Use a custom service to designate a service that you want to monitor\n// when none of the other service types (like App Engine, Cloud Run, or\n// a GKE type) matches your intended service.\ntype Service_Custom struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *Service_Custom) Reset() {\n\t*x = Service_Custom{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[9]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Service_Custom) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_Custom) ProtoMessage() {}\n\nfunc (x *Service_Custom) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[9]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_Custom.ProtoReflect.Descriptor instead.\nfunc (*Service_Custom) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 0}\n}\n\n// App Engine service. Learn more at https://cloud.google.com/appengine.\ntype Service_AppEngine struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The ID of the App Engine module underlying this service. Corresponds to\n\t// the `module_id` resource label in the [`gae_app` monitored\n\t// resource](https://cloud.google.com/monitoring/api/resources#tag_gae_app).\n\tModuleId string `protobuf:\"bytes,1,opt,name=module_id,json=moduleId,proto3\" json:\"module_id,omitempty\"`\n}\n\nfunc (x *Service_AppEngine) Reset() {\n\t*x = Service_AppEngine{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[10]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Service_AppEngine) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_AppEngine) ProtoMessage() {}\n\nfunc (x *Service_AppEngine) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[10]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_AppEngine.ProtoReflect.Descriptor instead.\nfunc (*Service_AppEngine) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 1}\n}\n\nfunc (x *Service_AppEngine) GetModuleId() string {\n\tif x != nil {\n\t\treturn x.ModuleId\n\t}\n\treturn \"\"\n}\n\n// Cloud Endpoints service. Learn more at https://cloud.google.com/endpoints.\ntype Service_CloudEndpoints struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The name of the Cloud Endpoints service underlying this service.\n\t// Corresponds to the `service` resource label in the [`api` monitored\n\t// resource](https://cloud.google.com/monitoring/api/resources#tag_api).\n\tService string `protobuf:\"bytes,1,opt,name=service,proto3\" json:\"service,omitempty\"`\n}\n\nfunc (x *Service_CloudEndpoints) Reset() {\n\t*x = Service_CloudEndpoints{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[11]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Service_CloudEndpoints) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_CloudEndpoints) ProtoMessage() {}\n\nfunc (x *Service_CloudEndpoints) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[11]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_CloudEndpoints.ProtoReflect.Descriptor instead.\nfunc (*Service_CloudEndpoints) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 2}\n}\n\nfunc (x *Service_CloudEndpoints) GetService() string {\n\tif x != nil {\n\t\treturn x.Service\n\t}\n\treturn \"\"\n}\n\n// Istio service scoped to a single Kubernetes cluster. Learn more at\n// https://istio.io. Clusters running OSS Istio will have their services\n// ingested as this type.\ntype Service_ClusterIstio struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The location of the Kubernetes cluster in which this Istio service is\n\t// defined. Corresponds to the `location` resource label in `k8s_cluster`\n\t// resources.\n\tLocation string `protobuf:\"bytes,1,opt,name=location,proto3\" json:\"location,omitempty\"`\n\t// The name of the Kubernetes cluster in which this Istio service is\n\t// defined. Corresponds to the `cluster_name` resource label in\n\t// `k8s_cluster` resources.\n\tClusterName string `protobuf:\"bytes,2,opt,name=cluster_name,json=clusterName,proto3\" json:\"cluster_name,omitempty\"`\n\t// The namespace of the Istio service underlying this service. Corresponds\n\t// to the `destination_service_namespace` metric label in Istio metrics.\n\tServiceNamespace string `protobuf:\"bytes,3,opt,name=service_namespace,json=serviceNamespace,proto3\" json:\"service_namespace,omitempty\"`\n\t// The name of the Istio service underlying this service. Corresponds to the\n\t// `destination_service_name` metric label in Istio metrics.\n\tServiceName string `protobuf:\"bytes,4,opt,name=service_name,json=serviceName,proto3\" json:\"service_name,omitempty\"`\n}\n\nfunc (x *Service_ClusterIstio) Reset() {\n\t*x = Service_ClusterIstio{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[12]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Service_ClusterIstio) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_ClusterIstio) ProtoMessage() {}\n\nfunc (x *Service_ClusterIstio) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[12]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_ClusterIstio.ProtoReflect.Descriptor instead.\nfunc (*Service_ClusterIstio) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 3}\n}\n\nfunc (x *Service_ClusterIstio) GetLocation() string {\n\tif x != nil {\n\t\treturn x.Location\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_ClusterIstio) GetClusterName() string {\n\tif x != nil {\n\t\treturn x.ClusterName\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_ClusterIstio) GetServiceNamespace() string {\n\tif x != nil {\n\t\treturn x.ServiceNamespace\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_ClusterIstio) GetServiceName() string {\n\tif x != nil {\n\t\treturn x.ServiceName\n\t}\n\treturn \"\"\n}\n\n// Istio service scoped to an Istio mesh. Anthos clusters running ASM < 1.6.8\n// will have their services ingested as this type.\ntype Service_MeshIstio struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Identifier for the mesh in which this Istio service is defined.\n\t// Corresponds to the `mesh_uid` metric label in Istio metrics.\n\tMeshUid string `protobuf:\"bytes,1,opt,name=mesh_uid,json=meshUid,proto3\" json:\"mesh_uid,omitempty\"`\n\t// The namespace of the Istio service underlying this service. Corresponds\n\t// to the `destination_service_namespace` metric label in Istio metrics.\n\tServiceNamespace string `protobuf:\"bytes,3,opt,name=service_namespace,json=serviceNamespace,proto3\" json:\"service_namespace,omitempty\"`\n\t// The name of the Istio service underlying this service. Corresponds to the\n\t// `destination_service_name` metric label in Istio metrics.\n\tServiceName string `protobuf:\"bytes,4,opt,name=service_name,json=serviceName,proto3\" json:\"service_name,omitempty\"`\n}\n\nfunc (x *Service_MeshIstio) Reset() {\n\t*x = Service_MeshIstio{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[13]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Service_MeshIstio) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_MeshIstio) ProtoMessage() {}\n\nfunc (x *Service_MeshIstio) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[13]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_MeshIstio.ProtoReflect.Descriptor instead.\nfunc (*Service_MeshIstio) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 4}\n}\n\nfunc (x *Service_MeshIstio) GetMeshUid() string {\n\tif x != nil {\n\t\treturn x.MeshUid\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_MeshIstio) GetServiceNamespace() string {\n\tif x != nil {\n\t\treturn x.ServiceNamespace\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_MeshIstio) GetServiceName() string {\n\tif x != nil {\n\t\treturn x.ServiceName\n\t}\n\treturn \"\"\n}\n\n// Canonical service scoped to an Istio mesh. Anthos clusters running ASM >=\n// 1.6.8 will have their services ingested as this type.\ntype Service_IstioCanonicalService struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Identifier for the Istio mesh in which this canonical service is defined.\n\t// Corresponds to the `mesh_uid` metric label in\n\t// [Istio metrics](https://cloud.google.com/monitoring/api/metrics_istio).\n\tMeshUid string `protobuf:\"bytes,1,opt,name=mesh_uid,json=meshUid,proto3\" json:\"mesh_uid,omitempty\"`\n\t// The namespace of the canonical service underlying this service.\n\t// Corresponds to the `destination_canonical_service_namespace` metric\n\t// label in [Istio\n\t// metrics](https://cloud.google.com/monitoring/api/metrics_istio).\n\tCanonicalServiceNamespace string `protobuf:\"bytes,3,opt,name=canonical_service_namespace,json=canonicalServiceNamespace,proto3\" json:\"canonical_service_namespace,omitempty\"`\n\t// The name of the canonical service underlying this service.\n\t// Corresponds to the `destination_canonical_service_name` metric label in\n\t// label in [Istio\n\t// metrics](https://cloud.google.com/monitoring/api/metrics_istio).\n\tCanonicalService string `protobuf:\"bytes,4,opt,name=canonical_service,json=canonicalService,proto3\" json:\"canonical_service,omitempty\"`\n}\n\nfunc (x *Service_IstioCanonicalService) Reset() {\n\t*x = Service_IstioCanonicalService{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[14]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Service_IstioCanonicalService) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_IstioCanonicalService) ProtoMessage() {}\n\nfunc (x *Service_IstioCanonicalService) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[14]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_IstioCanonicalService.ProtoReflect.Descriptor instead.\nfunc (*Service_IstioCanonicalService) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 5}\n}\n\nfunc (x *Service_IstioCanonicalService) GetMeshUid() string {\n\tif x != nil {\n\t\treturn x.MeshUid\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_IstioCanonicalService) GetCanonicalServiceNamespace() string {\n\tif x != nil {\n\t\treturn x.CanonicalServiceNamespace\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_IstioCanonicalService) GetCanonicalService() string {\n\tif x != nil {\n\t\treturn x.CanonicalService\n\t}\n\treturn \"\"\n}\n\n// Cloud Run service. Learn more at https://cloud.google.com/run.\ntype Service_CloudRun struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The name of the Cloud Run service. Corresponds to the `service_name`\n\t// resource label in the [`cloud_run_revision` monitored\n\t// resource](https://cloud.google.com/monitoring/api/resources#tag_cloud_run_revision).\n\tServiceName string `protobuf:\"bytes,1,opt,name=service_name,json=serviceName,proto3\" json:\"service_name,omitempty\"`\n\t// The location the service is run. Corresponds to the `location`\n\t// resource label in the [`cloud_run_revision` monitored\n\t// resource](https://cloud.google.com/monitoring/api/resources#tag_cloud_run_revision).\n\tLocation string `protobuf:\"bytes,2,opt,name=location,proto3\" json:\"location,omitempty\"`\n}\n\nfunc (x *Service_CloudRun) Reset() {\n\t*x = Service_CloudRun{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[15]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Service_CloudRun) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_CloudRun) ProtoMessage() {}\n\nfunc (x *Service_CloudRun) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[15]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_CloudRun.ProtoReflect.Descriptor instead.\nfunc (*Service_CloudRun) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 6}\n}\n\nfunc (x *Service_CloudRun) GetServiceName() string {\n\tif x != nil {\n\t\treturn x.ServiceName\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_CloudRun) GetLocation() string {\n\tif x != nil {\n\t\treturn x.Location\n\t}\n\treturn \"\"\n}\n\n// GKE Namespace. The field names correspond to the resource metadata labels\n// on monitored resources that fall under a namespace (for example,\n// `k8s_container` or `k8s_pod`).\ntype Service_GkeNamespace struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Output only. The project this resource lives in. For legacy services\n\t// migrated from the `Custom` type, this may be a distinct project from the\n\t// one parenting the service itself.\n\tProjectId string `protobuf:\"bytes,1,opt,name=project_id,json=projectId,proto3\" json:\"project_id,omitempty\"`\n\t// The location of the parent cluster. This may be a zone or region.\n\tLocation string `protobuf:\"bytes,2,opt,name=location,proto3\" json:\"location,omitempty\"`\n\t// The name of the parent cluster.\n\tClusterName string `protobuf:\"bytes,3,opt,name=cluster_name,json=clusterName,proto3\" json:\"cluster_name,omitempty\"`\n\t// The name of this namespace.\n\tNamespaceName string `protobuf:\"bytes,4,opt,name=namespace_name,json=namespaceName,proto3\" json:\"namespace_name,omitempty\"`\n}\n\nfunc (x *Service_GkeNamespace) Reset() {\n\t*x = Service_GkeNamespace{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[16]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Service_GkeNamespace) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_GkeNamespace) ProtoMessage() {}\n\nfunc (x *Service_GkeNamespace) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[16]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_GkeNamespace.ProtoReflect.Descriptor instead.\nfunc (*Service_GkeNamespace) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 7}\n}\n\nfunc (x *Service_GkeNamespace) GetProjectId() string {\n\tif x != nil {\n\t\treturn x.ProjectId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_GkeNamespace) GetLocation() string {\n\tif x != nil {\n\t\treturn x.Location\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_GkeNamespace) GetClusterName() string {\n\tif x != nil {\n\t\treturn x.ClusterName\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_GkeNamespace) GetNamespaceName() string {\n\tif x != nil {\n\t\treturn x.NamespaceName\n\t}\n\treturn \"\"\n}\n\n// A GKE Workload (Deployment, StatefulSet, etc). The field names correspond\n// to the metadata labels on monitored resources that fall under a workload\n// (for example, `k8s_container` or `k8s_pod`).\ntype Service_GkeWorkload struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Output only. The project this resource lives in. For legacy services\n\t// migrated from the `Custom` type, this may be a distinct project from the\n\t// one parenting the service itself.\n\tProjectId string `protobuf:\"bytes,1,opt,name=project_id,json=projectId,proto3\" json:\"project_id,omitempty\"`\n\t// The location of the parent cluster. This may be a zone or region.\n\tLocation string `protobuf:\"bytes,2,opt,name=location,proto3\" json:\"location,omitempty\"`\n\t// The name of the parent cluster.\n\tClusterName string `protobuf:\"bytes,3,opt,name=cluster_name,json=clusterName,proto3\" json:\"cluster_name,omitempty\"`\n\t// The name of the parent namespace.\n\tNamespaceName string `protobuf:\"bytes,4,opt,name=namespace_name,json=namespaceName,proto3\" json:\"namespace_name,omitempty\"`\n\t// The type of this workload (for example, \"Deployment\" or \"DaemonSet\")\n\tTopLevelControllerType string `protobuf:\"bytes,5,opt,name=top_level_controller_type,json=topLevelControllerType,proto3\" json:\"top_level_controller_type,omitempty\"`\n\t// The name of this workload.\n\tTopLevelControllerName string `protobuf:\"bytes,6,opt,name=top_level_controller_name,json=topLevelControllerName,proto3\" json:\"top_level_controller_name,omitempty\"`\n}\n\nfunc (x *Service_GkeWorkload) Reset() {\n\t*x = Service_GkeWorkload{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[17]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Service_GkeWorkload) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_GkeWorkload) ProtoMessage() {}\n\nfunc (x *Service_GkeWorkload) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[17]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_GkeWorkload.ProtoReflect.Descriptor instead.\nfunc (*Service_GkeWorkload) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 8}\n}\n\nfunc (x *Service_GkeWorkload) GetProjectId() string {\n\tif x != nil {\n\t\treturn x.ProjectId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_GkeWorkload) GetLocation() string {\n\tif x != nil {\n\t\treturn x.Location\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_GkeWorkload) GetClusterName() string {\n\tif x != nil {\n\t\treturn x.ClusterName\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_GkeWorkload) GetNamespaceName() string {\n\tif x != nil {\n\t\treturn x.NamespaceName\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_GkeWorkload) GetTopLevelControllerType() string {\n\tif x != nil {\n\t\treturn x.TopLevelControllerType\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_GkeWorkload) GetTopLevelControllerName() string {\n\tif x != nil {\n\t\treturn x.TopLevelControllerName\n\t}\n\treturn \"\"\n}\n\n// GKE Service. The \"service\" here represents a\n// [Kubernetes service\n// object](https://kubernetes.io/docs/concepts/services-networking/service).\n// The field names correspond to the resource labels on [`k8s_service`\n// monitored\n// resources](https://cloud.google.com/monitoring/api/resources#tag_k8s_service).\ntype Service_GkeService struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Output only. The project this resource lives in. For legacy services\n\t// migrated from the `Custom` type, this may be a distinct project from the\n\t// one parenting the service itself.\n\tProjectId string `protobuf:\"bytes,1,opt,name=project_id,json=projectId,proto3\" json:\"project_id,omitempty\"`\n\t// The location of the parent cluster. This may be a zone or region.\n\tLocation string `protobuf:\"bytes,2,opt,name=location,proto3\" json:\"location,omitempty\"`\n\t// The name of the parent cluster.\n\tClusterName string `protobuf:\"bytes,3,opt,name=cluster_name,json=clusterName,proto3\" json:\"cluster_name,omitempty\"`\n\t// The name of the parent namespace.\n\tNamespaceName string `protobuf:\"bytes,4,opt,name=namespace_name,json=namespaceName,proto3\" json:\"namespace_name,omitempty\"`\n\t// The name of this service.\n\tServiceName string `protobuf:\"bytes,5,opt,name=service_name,json=serviceName,proto3\" json:\"service_name,omitempty\"`\n}\n\nfunc (x *Service_GkeService) Reset() {\n\t*x = Service_GkeService{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[18]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Service_GkeService) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_GkeService) ProtoMessage() {}\n\nfunc (x *Service_GkeService) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[18]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_GkeService.ProtoReflect.Descriptor instead.\nfunc (*Service_GkeService) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 9}\n}\n\nfunc (x *Service_GkeService) GetProjectId() string {\n\tif x != nil {\n\t\treturn x.ProjectId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_GkeService) GetLocation() string {\n\tif x != nil {\n\t\treturn x.Location\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_GkeService) GetClusterName() string {\n\tif x != nil {\n\t\treturn x.ClusterName\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_GkeService) GetNamespaceName() string {\n\tif x != nil {\n\t\treturn x.NamespaceName\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_GkeService) GetServiceName() string {\n\tif x != nil {\n\t\treturn x.ServiceName\n\t}\n\treturn \"\"\n}\n\n// A well-known service type, defined by its service type and service labels.\n// Documentation and examples\n// [here](https://cloud.google.com/stackdriver/docs/solutions/slo-monitoring/api/api-structures#basic-svc-w-basic-sli).\ntype Service_BasicService struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The type of service that this basic service defines, e.g.\n\t// APP_ENGINE service type.\n\t// Documentation and valid values\n\t// [here](https://cloud.google.com/stackdriver/docs/solutions/slo-monitoring/api/api-structures#basic-svc-w-basic-sli).\n\tServiceType string `protobuf:\"bytes,1,opt,name=service_type,json=serviceType,proto3\" json:\"service_type,omitempty\"`\n\t// Labels that specify the resource that emits the monitoring data which\n\t// is used for SLO reporting of this `Service`.\n\t// Documentation and valid values for given service types\n\t// [here](https://cloud.google.com/stackdriver/docs/solutions/slo-monitoring/api/api-structures#basic-svc-w-basic-sli).\n\tServiceLabels map[string]string `protobuf:\"bytes,2,rep,name=service_labels,json=serviceLabels,proto3\" json:\"service_labels,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n}\n\nfunc (x *Service_BasicService) Reset() {\n\t*x = Service_BasicService{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[19]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Service_BasicService) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_BasicService) ProtoMessage() {}\n\nfunc (x *Service_BasicService) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[19]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_BasicService.ProtoReflect.Descriptor instead.\nfunc (*Service_BasicService) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 10}\n}\n\nfunc (x *Service_BasicService) GetServiceType() string {\n\tif x != nil {\n\t\treturn x.ServiceType\n\t}\n\treturn \"\"\n}\n\nfunc (x *Service_BasicService) GetServiceLabels() map[string]string {\n\tif x != nil {\n\t\treturn x.ServiceLabels\n\t}\n\treturn nil\n}\n\n// Configuration for how to query telemetry on a Service.\ntype Service_Telemetry struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The full name of the resource that defines this service. Formatted as\n\t// described in https://cloud.google.com/apis/design/resource_names.\n\tResourceName string `protobuf:\"bytes,1,opt,name=resource_name,json=resourceName,proto3\" json:\"resource_name,omitempty\"`\n}\n\nfunc (x *Service_Telemetry) Reset() {\n\t*x = Service_Telemetry{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[20]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Service_Telemetry) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Service_Telemetry) ProtoMessage() {}\n\nfunc (x *Service_Telemetry) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[20]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Service_Telemetry.ProtoReflect.Descriptor instead.\nfunc (*Service_Telemetry) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 11}\n}\n\nfunc (x *Service_Telemetry) GetResourceName() string {\n\tif x != nil {\n\t\treturn x.ResourceName\n\t}\n\treturn \"\"\n}\n\n// Future parameters for the availability SLI.\ntype BasicSli_AvailabilityCriteria struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *BasicSli_AvailabilityCriteria) Reset() {\n\t*x = BasicSli_AvailabilityCriteria{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[24]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *BasicSli_AvailabilityCriteria) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BasicSli_AvailabilityCriteria) ProtoMessage() {}\n\nfunc (x *BasicSli_AvailabilityCriteria) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[24]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BasicSli_AvailabilityCriteria.ProtoReflect.Descriptor instead.\nfunc (*BasicSli_AvailabilityCriteria) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{3, 0}\n}\n\n// Parameters for a latency threshold SLI.\ntype BasicSli_LatencyCriteria struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Good service is defined to be the count of requests made to this service\n\t// that return in no more than `threshold`.\n\tThreshold *durationpb.Duration `protobuf:\"bytes,3,opt,name=threshold,proto3\" json:\"threshold,omitempty\"`\n}\n\nfunc (x *BasicSli_LatencyCriteria) Reset() {\n\t*x = BasicSli_LatencyCriteria{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[25]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *BasicSli_LatencyCriteria) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BasicSli_LatencyCriteria) ProtoMessage() {}\n\nfunc (x *BasicSli_LatencyCriteria) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[25]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BasicSli_LatencyCriteria.ProtoReflect.Descriptor instead.\nfunc (*BasicSli_LatencyCriteria) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{3, 1}\n}\n\nfunc (x *BasicSli_LatencyCriteria) GetThreshold() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Threshold\n\t}\n\treturn nil\n}\n\n// A `PerformanceThreshold` is used when each window is good when that window\n// has a sufficiently high `performance`.\ntype WindowsBasedSli_PerformanceThreshold struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The means, either a request-based SLI or a basic SLI, by which to compute\n\t// performance over a window.\n\t//\n\t// Types that are assignable to Type:\n\t//\n\t//\t*WindowsBasedSli_PerformanceThreshold_Performance\n\t//\t*WindowsBasedSli_PerformanceThreshold_BasicSliPerformance\n\tType isWindowsBasedSli_PerformanceThreshold_Type `protobuf_oneof:\"type\"`\n\t// If window `performance >= threshold`, the window is counted as good.\n\tThreshold float64 `protobuf:\"fixed64,2,opt,name=threshold,proto3\" json:\"threshold,omitempty\"`\n}\n\nfunc (x *WindowsBasedSli_PerformanceThreshold) Reset() {\n\t*x = WindowsBasedSli_PerformanceThreshold{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[26]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *WindowsBasedSli_PerformanceThreshold) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*WindowsBasedSli_PerformanceThreshold) ProtoMessage() {}\n\nfunc (x *WindowsBasedSli_PerformanceThreshold) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[26]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use WindowsBasedSli_PerformanceThreshold.ProtoReflect.Descriptor instead.\nfunc (*WindowsBasedSli_PerformanceThreshold) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{8, 0}\n}\n\nfunc (m *WindowsBasedSli_PerformanceThreshold) GetType() isWindowsBasedSli_PerformanceThreshold_Type {\n\tif m != nil {\n\t\treturn m.Type\n\t}\n\treturn nil\n}\n\nfunc (x *WindowsBasedSli_PerformanceThreshold) GetPerformance() *RequestBasedSli {\n\tif x, ok := x.GetType().(*WindowsBasedSli_PerformanceThreshold_Performance); ok {\n\t\treturn x.Performance\n\t}\n\treturn nil\n}\n\nfunc (x *WindowsBasedSli_PerformanceThreshold) GetBasicSliPerformance() *BasicSli {\n\tif x, ok := x.GetType().(*WindowsBasedSli_PerformanceThreshold_BasicSliPerformance); ok {\n\t\treturn x.BasicSliPerformance\n\t}\n\treturn nil\n}\n\nfunc (x *WindowsBasedSli_PerformanceThreshold) GetThreshold() float64 {\n\tif x != nil {\n\t\treturn x.Threshold\n\t}\n\treturn 0\n}\n\ntype isWindowsBasedSli_PerformanceThreshold_Type interface {\n\tisWindowsBasedSli_PerformanceThreshold_Type()\n}\n\ntype WindowsBasedSli_PerformanceThreshold_Performance struct {\n\t// `RequestBasedSli` to evaluate to judge window quality.\n\tPerformance *RequestBasedSli `protobuf:\"bytes,1,opt,name=performance,proto3,oneof\"`\n}\n\ntype WindowsBasedSli_PerformanceThreshold_BasicSliPerformance struct {\n\t// `BasicSli` to evaluate to judge window quality.\n\tBasicSliPerformance *BasicSli `protobuf:\"bytes,3,opt,name=basic_sli_performance,json=basicSliPerformance,proto3,oneof\"`\n}\n\nfunc (*WindowsBasedSli_PerformanceThreshold_Performance) isWindowsBasedSli_PerformanceThreshold_Type() {\n}\n\nfunc (*WindowsBasedSli_PerformanceThreshold_BasicSliPerformance) isWindowsBasedSli_PerformanceThreshold_Type() {\n}\n\n// A `MetricRange` is used when each window is good when the value x of a\n// single `TimeSeries` satisfies `range.min <= x <= range.max`. The provided\n// `TimeSeries` must have `ValueType = INT64` or `ValueType = DOUBLE` and\n// `MetricKind = GAUGE`.\ntype WindowsBasedSli_MetricRange struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// A [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters)\n\t// specifying the `TimeSeries` to use for evaluating window quality.\n\tTimeSeries string `protobuf:\"bytes,1,opt,name=time_series,json=timeSeries,proto3\" json:\"time_series,omitempty\"`\n\t// Range of values considered \"good.\" For a one-sided range, set one bound\n\t// to an infinite value.\n\tRange *Range `protobuf:\"bytes,4,opt,name=range,proto3\" json:\"range,omitempty\"`\n}\n\nfunc (x *WindowsBasedSli_MetricRange) Reset() {\n\t*x = WindowsBasedSli_MetricRange{}\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[27]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *WindowsBasedSli_MetricRange) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*WindowsBasedSli_MetricRange) ProtoMessage() {}\n\nfunc (x *WindowsBasedSli_MetricRange) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_proto_msgTypes[27]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use WindowsBasedSli_MetricRange.ProtoReflect.Descriptor instead.\nfunc (*WindowsBasedSli_MetricRange) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{8, 1}\n}\n\nfunc (x *WindowsBasedSli_MetricRange) GetTimeSeries() string {\n\tif x != nil {\n\t\treturn x.TimeSeries\n\t}\n\treturn \"\"\n}\n\nfunc (x *WindowsBasedSli_MetricRange) GetRange() *Range {\n\tif x != nil {\n\t\treturn x.Range\n\t}\n\treturn nil\n}\n\nvar File_google_monitoring_v3_service_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_service_proto_rawDesc = []byte{\n\t0x0a, 0x22, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68,\n\t0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74,\n\t0x79, 0x70, 0x65, 0x2f, 0x63, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, 0x5f, 0x70, 0x65, 0x72,\n\t0x69, 0x6f, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa4, 0x16, 0x0a, 0x07, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21,\n\t0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d,\n\t0x65, 0x12, 0x3e, 0x0a, 0x06, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x00, 0x52, 0x06, 0x63, 0x75, 0x73, 0x74, 0x6f,\n\t0x6d, 0x12, 0x48, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x18,\n\t0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x48, 0x00,\n\t0x52, 0x09, 0x61, 0x70, 0x70, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x12, 0x57, 0x0a, 0x0f, 0x63,\n\t0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x08,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e,\n\t0x74, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f,\n\t0x69, 0x6e, 0x74, 0x73, 0x12, 0x51, 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f,\n\t0x69, 0x73, 0x74, 0x69, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74,\n\t0x65, 0x72, 0x49, 0x73, 0x74, 0x69, 0x6f, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74,\n\t0x65, 0x72, 0x49, 0x73, 0x74, 0x69, 0x6f, 0x12, 0x48, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x68, 0x5f,\n\t0x69, 0x73, 0x74, 0x69, 0x6f, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x49,\n\t0x73, 0x74, 0x69, 0x6f, 0x48, 0x00, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x68, 0x49, 0x73, 0x74, 0x69,\n\t0x6f, 0x12, 0x6d, 0x0a, 0x17, 0x69, 0x73, 0x74, 0x69, 0x6f, 0x5f, 0x63, 0x61, 0x6e, 0x6f, 0x6e,\n\t0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x2e, 0x49, 0x73, 0x74, 0x69, 0x6f, 0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c,\n\t0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x15, 0x69, 0x73, 0x74, 0x69, 0x6f,\n\t0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x12, 0x45, 0x0a, 0x09, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x0c, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69,\n\t0x63, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x75, 0x6e, 0x48, 0x00, 0x52, 0x08, 0x63,\n\t0x6c, 0x6f, 0x75, 0x64, 0x52, 0x75, 0x6e, 0x12, 0x51, 0x0a, 0x0d, 0x67, 0x6b, 0x65, 0x5f, 0x6e,\n\t0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x47, 0x6b,\n\t0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x67, 0x6b,\n\t0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x4e, 0x0a, 0x0c, 0x67, 0x6b,\n\t0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,\n\t0x47, 0x6b, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x67,\n\t0x6b, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x4b, 0x0a, 0x0b, 0x67, 0x6b,\n\t0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x47,\n\t0x6b, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x67, 0x6b, 0x65,\n\t0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x0d, 0x62, 0x61, 0x73, 0x69, 0x63,\n\t0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x42, 0x61,\n\t0x73, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0c, 0x62, 0x61, 0x73, 0x69,\n\t0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x45, 0x0a, 0x09, 0x74, 0x65, 0x6c, 0x65,\n\t0x6d, 0x65, 0x74, 0x72, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x65, 0x6c, 0x65, 0x6d,\n\t0x65, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x12,\n\t0x4e, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0e,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e,\n\t0x74, 0x72, 0x79, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a,\n\t0x08, 0x0a, 0x06, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x1a, 0x28, 0x0a, 0x09, 0x41, 0x70, 0x70,\n\t0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65,\n\t0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x75, 0x6c,\n\t0x65, 0x49, 0x64, 0x1a, 0x2a, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x6e, 0x64, 0x70,\n\t0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a,\n\t0x9d, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x73, 0x74, 0x69, 0x6f,\n\t0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c,\n\t0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12,\n\t0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73,\n\t0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c,\n\t0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a,\n\t0x76, 0x0a, 0x09, 0x4d, 0x65, 0x73, 0x68, 0x49, 0x73, 0x74, 0x69, 0x6f, 0x12, 0x19, 0x0a, 0x08,\n\t0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,\n\t0x6d, 0x65, 0x73, 0x68, 0x55, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69,\n\t0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73,\n\t0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x73, 0x74, 0x69,\n\t0x6f, 0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x68, 0x55, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x1b,\n\t0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x19, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x11,\n\t0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63,\n\t0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x49, 0x0a, 0x08, 0x43, 0x6c, 0x6f,\n\t0x75, 0x64, 0x52, 0x75, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x98, 0x01, 0x0a, 0x0c, 0x47, 0x6b, 0x65, 0x4e, 0x61, 0x6d, 0x65,\n\t0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,\n\t0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09,\n\t0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,\n\t0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75,\n\t0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x61, 0x6d, 0x65,\n\t0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a,\n\t0x8d, 0x02, 0x0a, 0x0b, 0x47, 0x6b, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12,\n\t0x22, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,\n\t0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,\n\t0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61,\n\t0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x61, 0x6d, 0x65,\n\t0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x19, 0x74, 0x6f, 0x70,\n\t0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65,\n\t0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x74, 0x6f,\n\t0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72,\n\t0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x19, 0x74, 0x6f, 0x70, 0x5f, 0x6c, 0x65, 0x76, 0x65,\n\t0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d,\n\t0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x74, 0x6f, 0x70, 0x4c, 0x65, 0x76, 0x65,\n\t0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x1a,\n\t0xb9, 0x01, 0x0a, 0x0a, 0x47, 0x6b, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x22,\n\t0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,\n\t0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21,\n\t0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d,\n\t0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73,\n\t0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,\n\t0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0xd9, 0x01, 0x0a, 0x0c,\n\t0x42, 0x61, 0x73, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c,\n\t0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12,\n\t0x64, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c,\n\t0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c,\n\t0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c,\n\t0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x40, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b,\n\t0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a,\n\t0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61,\n\t0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x30, 0x0a, 0x09, 0x54, 0x65, 0x6c, 0x65, 0x6d,\n\t0x65, 0x74, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,\n\t0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73,\n\t0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x3d, 0x0a, 0x0f, 0x55, 0x73, 0x65,\n\t0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,\n\t0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14,\n\t0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0xa7, 0x01, 0xea, 0x41, 0xa3, 0x01, 0x0a,\n\t0x21, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69,\n\t0x63, 0x65, 0x12, 0x25, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72,\n\t0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f,\n\t0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x7d, 0x12, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e,\n\t0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69,\n\t0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73,\n\t0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x7d, 0x12, 0x23, 0x66, 0x6f, 0x6c, 0x64,\n\t0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x73, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x7d, 0x12,\n\t0x01, 0x2a, 0x42, 0x0c, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72,\n\t0x22, 0x82, 0x07, 0x0a, 0x15, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65,\n\t0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c,\n\t0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x63, 0x0a, 0x17, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f,\n\t0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x69, 0x63,\n\t0x61, 0x74, 0x6f, 0x72, 0x52, 0x15, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76,\n\t0x65, 0x6c, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x67,\n\t0x6f, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x12,\n\t0x42, 0x0a, 0x0e, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f,\n\t0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0d, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72,\n\t0x69, 0x6f, 0x64, 0x12, 0x46, 0x0a, 0x0f, 0x63, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, 0x5f,\n\t0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x43, 0x61, 0x6c, 0x65, 0x6e,\n\t0x64, 0x61, 0x72, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x61, 0x6c,\n\t0x65, 0x6e, 0x64, 0x61, 0x72, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x5c, 0x0a, 0x0b, 0x75,\n\t0x73, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x3b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c,\n\t0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x55, 0x73,\n\t0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x75,\n\t0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x55, 0x73, 0x65,\n\t0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,\n\t0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14,\n\t0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x34, 0x0a, 0x04, 0x56, 0x69, 0x65, 0x77,\n\t0x12, 0x14, 0x0a, 0x10, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49,\n\t0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x02,\n\t0x12, 0x0c, 0x0a, 0x08, 0x45, 0x58, 0x50, 0x4c, 0x49, 0x43, 0x49, 0x54, 0x10, 0x01, 0x3a, 0xca,\n\t0x02, 0xea, 0x41, 0xc6, 0x02, 0x0a, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x56, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73,\n\t0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69,\n\t0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x7d, 0x2f, 0x73, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,\n\t0x69, 0x76, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x7d, 0x12, 0x60,\n\t0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f,\n\t0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x73, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x7d, 0x2f,\n\t0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f,\n\t0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x7d,\n\t0x12, 0x54, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65,\n\t0x72, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76,\n\t0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x69, 0x76, 0x65, 0x7d, 0x12, 0x01, 0x2a, 0x20, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x70,\n\t0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0xfa, 0x01, 0x0a, 0x15, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12,\n\t0x3d, 0x0a, 0x09, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x73, 0x6c, 0x69, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x53,\n\t0x6c, 0x69, 0x48, 0x00, 0x52, 0x08, 0x62, 0x61, 0x73, 0x69, 0x63, 0x53, 0x6c, 0x69, 0x12, 0x4c,\n\t0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x42, 0x61, 0x73, 0x65, 0x64, 0x53, 0x6c, 0x69, 0x48, 0x00, 0x52, 0x0c,\n\t0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x61, 0x73, 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x0d,\n\t0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f,\n\t0x77, 0x73, 0x42, 0x61, 0x73, 0x65, 0x64, 0x53, 0x6c, 0x69, 0x48, 0x00, 0x52, 0x0c, 0x77, 0x69,\n\t0x6e, 0x64, 0x6f, 0x77, 0x73, 0x42, 0x61, 0x73, 0x65, 0x64, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79,\n\t0x70, 0x65, 0x22, 0xf3, 0x02, 0x0a, 0x08, 0x42, 0x61, 0x73, 0x69, 0x63, 0x53, 0x6c, 0x69, 0x12,\n\t0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52,\n\t0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09,\n\t0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a,\n\t0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63,\n\t0x53, 0x6c, 0x69, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,\n\t0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x76, 0x61, 0x69,\n\t0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x4a, 0x0a, 0x07, 0x6c, 0x61, 0x74, 0x65,\n\t0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33,\n\t0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x53, 0x6c, 0x69, 0x2e, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63,\n\t0x79, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x48, 0x00, 0x52, 0x07, 0x6c, 0x61, 0x74,\n\t0x65, 0x6e, 0x63, 0x79, 0x1a, 0x16, 0x0a, 0x14, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69,\n\t0x6c, 0x69, 0x74, 0x79, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x1a, 0x4a, 0x0a, 0x0f,\n\t0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x12,\n\t0x37, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x74,\n\t0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x73, 0x6c, 0x69, 0x5f,\n\t0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x22, 0x2b, 0x0a, 0x05, 0x52, 0x61, 0x6e, 0x67,\n\t0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03,\n\t0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01,\n\t0x52, 0x03, 0x6d, 0x61, 0x78, 0x22, 0xc2, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x42, 0x61, 0x73, 0x65, 0x64, 0x53, 0x6c, 0x69, 0x12, 0x51, 0x0a, 0x10, 0x67, 0x6f, 0x6f,\n\t0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53,\n\t0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x48, 0x00, 0x52, 0x0e, 0x67, 0x6f,\n\t0x6f, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x52, 0x0a, 0x10,\n\t0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x75, 0x74,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x69,\n\t0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x75, 0x74, 0x48, 0x00, 0x52,\n\t0x0f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x75, 0x74,\n\t0x42, 0x08, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0xa1, 0x01, 0x0a, 0x0f, 0x54,\n\t0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x2e,\n\t0x0a, 0x13, 0x67, 0x6f, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x66,\n\t0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x67, 0x6f, 0x6f,\n\t0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x2c,\n\t0x0a, 0x12, 0x62, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x69,\n\t0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x62, 0x61, 0x64, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x14,\n\t0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x69,\n\t0x6c, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61,\n\t0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x75,\n\t0x0a, 0x0f, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x75,\n\t0x74, 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f,\n\t0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12,\n\t0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74,\n\t0x65, 0x72, 0x12, 0x31, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x05,\n\t0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xa4, 0x06, 0x0a, 0x0f, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77,\n\t0x73, 0x42, 0x61, 0x73, 0x65, 0x64, 0x53, 0x6c, 0x69, 0x12, 0x35, 0x0a, 0x16, 0x67, 0x6f, 0x6f,\n\t0x64, 0x5f, 0x62, 0x61, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x66, 0x69, 0x6c,\n\t0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x13, 0x67, 0x6f, 0x6f,\n\t0x64, 0x42, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72,\n\t0x12, 0x79, 0x0a, 0x1a, 0x67, 0x6f, 0x6f, 0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x57, 0x69, 0x6e, 0x64,\n\t0x6f, 0x77, 0x73, 0x42, 0x61, 0x73, 0x65, 0x64, 0x53, 0x6c, 0x69, 0x2e, 0x50, 0x65, 0x72, 0x66,\n\t0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64,\n\t0x48, 0x00, 0x52, 0x17, 0x67, 0x6f, 0x6f, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x61, 0x74,\n\t0x69, 0x6f, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x64, 0x0a, 0x14, 0x6d,\n\t0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x61, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x72, 0x61,\n\t0x6e, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33,\n\t0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x42, 0x61, 0x73, 0x65, 0x64, 0x53, 0x6c, 0x69,\n\t0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x11,\n\t0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4d, 0x65, 0x61, 0x6e, 0x49, 0x6e, 0x52, 0x61, 0x6e, 0x67,\n\t0x65, 0x12, 0x62, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x75, 0x6d, 0x5f,\n\t0x69, 0x6e, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x42, 0x61, 0x73,\n\t0x65, 0x64, 0x53, 0x6c, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x61, 0x6e, 0x67,\n\t0x65, 0x48, 0x00, 0x52, 0x10, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x49, 0x6e,\n\t0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f,\n\t0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44,\n\t0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x50,\n\t0x65, 0x72, 0x69, 0x6f, 0x64, 0x1a, 0xdd, 0x01, 0x0a, 0x14, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72,\n\t0x6d, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x49,\n\t0x0a, 0x0b, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x42, 0x61, 0x73, 0x65, 0x64, 0x53, 0x6c, 0x69, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x65,\n\t0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x54, 0x0a, 0x15, 0x62, 0x61, 0x73,\n\t0x69, 0x63, 0x5f, 0x73, 0x6c, 0x69, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e,\n\t0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e,\n\t0x42, 0x61, 0x73, 0x69, 0x63, 0x53, 0x6c, 0x69, 0x48, 0x00, 0x52, 0x13, 0x62, 0x61, 0x73, 0x69,\n\t0x63, 0x53, 0x6c, 0x69, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x12,\n\t0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x06, 0x0a,\n\t0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, 0x61, 0x0a, 0x0b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52,\n\t0x61, 0x6e, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72,\n\t0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x53,\n\t0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x61, 0x6e, 0x67,\n\t0x65, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x77, 0x69, 0x6e, 0x64,\n\t0x6f, 0x77, 0x5f, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x6e, 0x42, 0xd1, 0x01, 0x0a,\n\t0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x16, 0x53, 0x65, 0x72, 0x76, 0x69,\n\t0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74,\n\t0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f,\n\t0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33,\n\t0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64,\n\t0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33,\n\t0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_monitoring_v3_service_proto_rawDescOnce sync.Once\n\tfile_google_monitoring_v3_service_proto_rawDescData = file_google_monitoring_v3_service_proto_rawDesc\n)\n\nfunc file_google_monitoring_v3_service_proto_rawDescGZIP() []byte {\n\tfile_google_monitoring_v3_service_proto_rawDescOnce.Do(func() {\n\t\tfile_google_monitoring_v3_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_service_proto_rawDescData)\n\t})\n\treturn file_google_monitoring_v3_service_proto_rawDescData\n}\n\nvar file_google_monitoring_v3_service_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_google_monitoring_v3_service_proto_msgTypes = make([]protoimpl.MessageInfo, 28)\nvar file_google_monitoring_v3_service_proto_goTypes = []any{\n\t(ServiceLevelObjective_View)(0),              // 0: google.monitoring.v3.ServiceLevelObjective.View\n\t(*Service)(nil),                              // 1: google.monitoring.v3.Service\n\t(*ServiceLevelObjective)(nil),                // 2: google.monitoring.v3.ServiceLevelObjective\n\t(*ServiceLevelIndicator)(nil),                // 3: google.monitoring.v3.ServiceLevelIndicator\n\t(*BasicSli)(nil),                             // 4: google.monitoring.v3.BasicSli\n\t(*Range)(nil),                                // 5: google.monitoring.v3.Range\n\t(*RequestBasedSli)(nil),                      // 6: google.monitoring.v3.RequestBasedSli\n\t(*TimeSeriesRatio)(nil),                      // 7: google.monitoring.v3.TimeSeriesRatio\n\t(*DistributionCut)(nil),                      // 8: google.monitoring.v3.DistributionCut\n\t(*WindowsBasedSli)(nil),                      // 9: google.monitoring.v3.WindowsBasedSli\n\t(*Service_Custom)(nil),                       // 10: google.monitoring.v3.Service.Custom\n\t(*Service_AppEngine)(nil),                    // 11: google.monitoring.v3.Service.AppEngine\n\t(*Service_CloudEndpoints)(nil),               // 12: google.monitoring.v3.Service.CloudEndpoints\n\t(*Service_ClusterIstio)(nil),                 // 13: google.monitoring.v3.Service.ClusterIstio\n\t(*Service_MeshIstio)(nil),                    // 14: google.monitoring.v3.Service.MeshIstio\n\t(*Service_IstioCanonicalService)(nil),        // 15: google.monitoring.v3.Service.IstioCanonicalService\n\t(*Service_CloudRun)(nil),                     // 16: google.monitoring.v3.Service.CloudRun\n\t(*Service_GkeNamespace)(nil),                 // 17: google.monitoring.v3.Service.GkeNamespace\n\t(*Service_GkeWorkload)(nil),                  // 18: google.monitoring.v3.Service.GkeWorkload\n\t(*Service_GkeService)(nil),                   // 19: google.monitoring.v3.Service.GkeService\n\t(*Service_BasicService)(nil),                 // 20: google.monitoring.v3.Service.BasicService\n\t(*Service_Telemetry)(nil),                    // 21: google.monitoring.v3.Service.Telemetry\n\tnil,                                          // 22: google.monitoring.v3.Service.UserLabelsEntry\n\tnil,                                          // 23: google.monitoring.v3.Service.BasicService.ServiceLabelsEntry\n\tnil,                                          // 24: google.monitoring.v3.ServiceLevelObjective.UserLabelsEntry\n\t(*BasicSli_AvailabilityCriteria)(nil),        // 25: google.monitoring.v3.BasicSli.AvailabilityCriteria\n\t(*BasicSli_LatencyCriteria)(nil),             // 26: google.monitoring.v3.BasicSli.LatencyCriteria\n\t(*WindowsBasedSli_PerformanceThreshold)(nil), // 27: google.monitoring.v3.WindowsBasedSli.PerformanceThreshold\n\t(*WindowsBasedSli_MetricRange)(nil),          // 28: google.monitoring.v3.WindowsBasedSli.MetricRange\n\t(*durationpb.Duration)(nil),                  // 29: google.protobuf.Duration\n\t(calendarperiod.CalendarPeriod)(0),           // 30: google.type.CalendarPeriod\n}\nvar file_google_monitoring_v3_service_proto_depIdxs = []int32{\n\t10, // 0: google.monitoring.v3.Service.custom:type_name -> google.monitoring.v3.Service.Custom\n\t11, // 1: google.monitoring.v3.Service.app_engine:type_name -> google.monitoring.v3.Service.AppEngine\n\t12, // 2: google.monitoring.v3.Service.cloud_endpoints:type_name -> google.monitoring.v3.Service.CloudEndpoints\n\t13, // 3: google.monitoring.v3.Service.cluster_istio:type_name -> google.monitoring.v3.Service.ClusterIstio\n\t14, // 4: google.monitoring.v3.Service.mesh_istio:type_name -> google.monitoring.v3.Service.MeshIstio\n\t15, // 5: google.monitoring.v3.Service.istio_canonical_service:type_name -> google.monitoring.v3.Service.IstioCanonicalService\n\t16, // 6: google.monitoring.v3.Service.cloud_run:type_name -> google.monitoring.v3.Service.CloudRun\n\t17, // 7: google.monitoring.v3.Service.gke_namespace:type_name -> google.monitoring.v3.Service.GkeNamespace\n\t18, // 8: google.monitoring.v3.Service.gke_workload:type_name -> google.monitoring.v3.Service.GkeWorkload\n\t19, // 9: google.monitoring.v3.Service.gke_service:type_name -> google.monitoring.v3.Service.GkeService\n\t20, // 10: google.monitoring.v3.Service.basic_service:type_name -> google.monitoring.v3.Service.BasicService\n\t21, // 11: google.monitoring.v3.Service.telemetry:type_name -> google.monitoring.v3.Service.Telemetry\n\t22, // 12: google.monitoring.v3.Service.user_labels:type_name -> google.monitoring.v3.Service.UserLabelsEntry\n\t3,  // 13: google.monitoring.v3.ServiceLevelObjective.service_level_indicator:type_name -> google.monitoring.v3.ServiceLevelIndicator\n\t29, // 14: google.monitoring.v3.ServiceLevelObjective.rolling_period:type_name -> google.protobuf.Duration\n\t30, // 15: google.monitoring.v3.ServiceLevelObjective.calendar_period:type_name -> google.type.CalendarPeriod\n\t24, // 16: google.monitoring.v3.ServiceLevelObjective.user_labels:type_name -> google.monitoring.v3.ServiceLevelObjective.UserLabelsEntry\n\t4,  // 17: google.monitoring.v3.ServiceLevelIndicator.basic_sli:type_name -> google.monitoring.v3.BasicSli\n\t6,  // 18: google.monitoring.v3.ServiceLevelIndicator.request_based:type_name -> google.monitoring.v3.RequestBasedSli\n\t9,  // 19: google.monitoring.v3.ServiceLevelIndicator.windows_based:type_name -> google.monitoring.v3.WindowsBasedSli\n\t25, // 20: google.monitoring.v3.BasicSli.availability:type_name -> google.monitoring.v3.BasicSli.AvailabilityCriteria\n\t26, // 21: google.monitoring.v3.BasicSli.latency:type_name -> google.monitoring.v3.BasicSli.LatencyCriteria\n\t7,  // 22: google.monitoring.v3.RequestBasedSli.good_total_ratio:type_name -> google.monitoring.v3.TimeSeriesRatio\n\t8,  // 23: google.monitoring.v3.RequestBasedSli.distribution_cut:type_name -> google.monitoring.v3.DistributionCut\n\t5,  // 24: google.monitoring.v3.DistributionCut.range:type_name -> google.monitoring.v3.Range\n\t27, // 25: google.monitoring.v3.WindowsBasedSli.good_total_ratio_threshold:type_name -> google.monitoring.v3.WindowsBasedSli.PerformanceThreshold\n\t28, // 26: google.monitoring.v3.WindowsBasedSli.metric_mean_in_range:type_name -> google.monitoring.v3.WindowsBasedSli.MetricRange\n\t28, // 27: google.monitoring.v3.WindowsBasedSli.metric_sum_in_range:type_name -> google.monitoring.v3.WindowsBasedSli.MetricRange\n\t29, // 28: google.monitoring.v3.WindowsBasedSli.window_period:type_name -> google.protobuf.Duration\n\t23, // 29: google.monitoring.v3.Service.BasicService.service_labels:type_name -> google.monitoring.v3.Service.BasicService.ServiceLabelsEntry\n\t29, // 30: google.monitoring.v3.BasicSli.LatencyCriteria.threshold:type_name -> google.protobuf.Duration\n\t6,  // 31: google.monitoring.v3.WindowsBasedSli.PerformanceThreshold.performance:type_name -> google.monitoring.v3.RequestBasedSli\n\t4,  // 32: google.monitoring.v3.WindowsBasedSli.PerformanceThreshold.basic_sli_performance:type_name -> google.monitoring.v3.BasicSli\n\t5,  // 33: google.monitoring.v3.WindowsBasedSli.MetricRange.range:type_name -> google.monitoring.v3.Range\n\t34, // [34:34] is the sub-list for method output_type\n\t34, // [34:34] is the sub-list for method input_type\n\t34, // [34:34] is the sub-list for extension type_name\n\t34, // [34:34] is the sub-list for extension extendee\n\t0,  // [0:34] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_service_proto_init() }\nfunc file_google_monitoring_v3_service_proto_init() {\n\tif File_google_monitoring_v3_service_proto != nil {\n\t\treturn\n\t}\n\tfile_google_monitoring_v3_service_proto_msgTypes[0].OneofWrappers = []any{\n\t\t(*Service_Custom_)(nil),\n\t\t(*Service_AppEngine_)(nil),\n\t\t(*Service_CloudEndpoints_)(nil),\n\t\t(*Service_ClusterIstio_)(nil),\n\t\t(*Service_MeshIstio_)(nil),\n\t\t(*Service_IstioCanonicalService_)(nil),\n\t\t(*Service_CloudRun_)(nil),\n\t\t(*Service_GkeNamespace_)(nil),\n\t\t(*Service_GkeWorkload_)(nil),\n\t\t(*Service_GkeService_)(nil),\n\t}\n\tfile_google_monitoring_v3_service_proto_msgTypes[1].OneofWrappers = []any{\n\t\t(*ServiceLevelObjective_RollingPeriod)(nil),\n\t\t(*ServiceLevelObjective_CalendarPeriod)(nil),\n\t}\n\tfile_google_monitoring_v3_service_proto_msgTypes[2].OneofWrappers = []any{\n\t\t(*ServiceLevelIndicator_BasicSli)(nil),\n\t\t(*ServiceLevelIndicator_RequestBased)(nil),\n\t\t(*ServiceLevelIndicator_WindowsBased)(nil),\n\t}\n\tfile_google_monitoring_v3_service_proto_msgTypes[3].OneofWrappers = []any{\n\t\t(*BasicSli_Availability)(nil),\n\t\t(*BasicSli_Latency)(nil),\n\t}\n\tfile_google_monitoring_v3_service_proto_msgTypes[5].OneofWrappers = []any{\n\t\t(*RequestBasedSli_GoodTotalRatio)(nil),\n\t\t(*RequestBasedSli_DistributionCut)(nil),\n\t}\n\tfile_google_monitoring_v3_service_proto_msgTypes[8].OneofWrappers = []any{\n\t\t(*WindowsBasedSli_GoodBadMetricFilter)(nil),\n\t\t(*WindowsBasedSli_GoodTotalRatioThreshold)(nil),\n\t\t(*WindowsBasedSli_MetricMeanInRange)(nil),\n\t\t(*WindowsBasedSli_MetricSumInRange)(nil),\n\t}\n\tfile_google_monitoring_v3_service_proto_msgTypes[26].OneofWrappers = []any{\n\t\t(*WindowsBasedSli_PerformanceThreshold_Performance)(nil),\n\t\t(*WindowsBasedSli_PerformanceThreshold_BasicSliPerformance)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_service_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   28,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_service_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_service_proto_depIdxs,\n\t\tEnumInfos:         file_google_monitoring_v3_service_proto_enumTypes,\n\t\tMessageInfos:      file_google_monitoring_v3_service_proto_msgTypes,\n\t}.Build()\n\tFile_google_monitoring_v3_service_proto = out.File\n\tfile_google_monitoring_v3_service_proto_rawDesc = nil\n\tfile_google_monitoring_v3_service_proto_goTypes = nil\n\tfile_google_monitoring_v3_service_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/service_service.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/service_service.proto\n\npackage monitoringpb\n\nimport (\n\tcontext \"context\"\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n\tfieldmaskpb \"google.golang.org/protobuf/types/known/fieldmaskpb\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// The `CreateService` request.\ntype CreateServiceRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Resource\n\t// [name](https://cloud.google.com/monitoring/api/v3#project_name) of the\n\t// parent Metrics Scope. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\tParent string `protobuf:\"bytes,1,opt,name=parent,proto3\" json:\"parent,omitempty\"`\n\t// Optional. The Service id to use for this Service. If omitted, an id will be\n\t// generated instead. Must match the pattern `[a-z0-9\\-]+`\n\tServiceId string `protobuf:\"bytes,3,opt,name=service_id,json=serviceId,proto3\" json:\"service_id,omitempty\"`\n\t// Required. The `Service` to create.\n\tService *Service `protobuf:\"bytes,2,opt,name=service,proto3\" json:\"service,omitempty\"`\n}\n\nfunc (x *CreateServiceRequest) Reset() {\n\t*x = CreateServiceRequest{}\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *CreateServiceRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateServiceRequest) ProtoMessage() {}\n\nfunc (x *CreateServiceRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateServiceRequest.ProtoReflect.Descriptor instead.\nfunc (*CreateServiceRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CreateServiceRequest) GetParent() string {\n\tif x != nil {\n\t\treturn x.Parent\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateServiceRequest) GetServiceId() string {\n\tif x != nil {\n\t\treturn x.ServiceId\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateServiceRequest) GetService() *Service {\n\tif x != nil {\n\t\treturn x.Service\n\t}\n\treturn nil\n}\n\n// The `GetService` request.\ntype GetServiceRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Resource name of the `Service`. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/services/[SERVICE_ID]\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *GetServiceRequest) Reset() {\n\t*x = GetServiceRequest{}\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *GetServiceRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetServiceRequest) ProtoMessage() {}\n\nfunc (x *GetServiceRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetServiceRequest.ProtoReflect.Descriptor instead.\nfunc (*GetServiceRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetServiceRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\n// The `ListServices` request.\ntype ListServicesRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Resource name of the parent containing the listed services,\n\t// either a [project](https://cloud.google.com/monitoring/api/v3#project_name)\n\t// or a Monitoring Metrics Scope. The formats are:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\t//\tworkspaces/[HOST_PROJECT_ID_OR_NUMBER]\n\tParent string `protobuf:\"bytes,1,opt,name=parent,proto3\" json:\"parent,omitempty\"`\n\t// A filter specifying what `Service`s to return. The filter supports\n\t// filtering on a particular service-identifier type or one of its attributes.\n\t//\n\t// To filter on a particular service-identifier type, the `identifier_case`\n\t// refers to which option in the `identifier` field is populated. For example,\n\t// the filter `identifier_case = \"CUSTOM\"` would match all services with a\n\t// value for the `custom` field. Valid options include \"CUSTOM\", \"APP_ENGINE\",\n\t// \"MESH_ISTIO\", and the other options listed at\n\t// https://cloud.google.com/monitoring/api/ref_v3/rest/v3/services#Service\n\t//\n\t// To filter on an attribute of a service-identifier type, apply the filter\n\t// name by using the snake case of the service-identifier type and the\n\t// attribute of that service-identifier type, and join the two with a period.\n\t// For example, to filter by the `meshUid` field of the `MeshIstio`\n\t// service-identifier type, you must filter on `mesh_istio.mesh_uid =\n\t// \"123\"` to match all services with mesh UID \"123\". Service-identifier types\n\t// and their attributes are described at\n\t// https://cloud.google.com/monitoring/api/ref_v3/rest/v3/services#Service\n\tFilter string `protobuf:\"bytes,2,opt,name=filter,proto3\" json:\"filter,omitempty\"`\n\t// A non-negative number that is the maximum number of results to return.\n\t// When 0, use default page size.\n\tPageSize int32 `protobuf:\"varint,3,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\t// If this field is not empty then it must contain the `nextPageToken` value\n\t// returned by a previous call to this method.  Using this field causes the\n\t// method to return additional results from the previous method call.\n\tPageToken string `protobuf:\"bytes,4,opt,name=page_token,json=pageToken,proto3\" json:\"page_token,omitempty\"`\n}\n\nfunc (x *ListServicesRequest) Reset() {\n\t*x = ListServicesRequest{}\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[2]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListServicesRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListServicesRequest) ProtoMessage() {}\n\nfunc (x *ListServicesRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[2]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListServicesRequest.ProtoReflect.Descriptor instead.\nfunc (*ListServicesRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListServicesRequest) GetParent() string {\n\tif x != nil {\n\t\treturn x.Parent\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListServicesRequest) GetFilter() string {\n\tif x != nil {\n\t\treturn x.Filter\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListServicesRequest) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListServicesRequest) GetPageToken() string {\n\tif x != nil {\n\t\treturn x.PageToken\n\t}\n\treturn \"\"\n}\n\n// The `ListServices` response.\ntype ListServicesResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The `Service`s matching the specified filter.\n\tServices []*Service `protobuf:\"bytes,1,rep,name=services,proto3\" json:\"services,omitempty\"`\n\t// If there are more results than have been returned, then this field is set\n\t// to a non-empty value.  To see the additional results,\n\t// use that value as `page_token` in the next call to this method.\n\tNextPageToken string `protobuf:\"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3\" json:\"next_page_token,omitempty\"`\n}\n\nfunc (x *ListServicesResponse) Reset() {\n\t*x = ListServicesResponse{}\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[3]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListServicesResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListServicesResponse) ProtoMessage() {}\n\nfunc (x *ListServicesResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[3]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListServicesResponse.ProtoReflect.Descriptor instead.\nfunc (*ListServicesResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *ListServicesResponse) GetServices() []*Service {\n\tif x != nil {\n\t\treturn x.Services\n\t}\n\treturn nil\n}\n\nfunc (x *ListServicesResponse) GetNextPageToken() string {\n\tif x != nil {\n\t\treturn x.NextPageToken\n\t}\n\treturn \"\"\n}\n\n// The `UpdateService` request.\ntype UpdateServiceRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The `Service` to draw updates from.\n\t// The given `name` specifies the resource to update.\n\tService *Service `protobuf:\"bytes,1,opt,name=service,proto3\" json:\"service,omitempty\"`\n\t// A set of field paths defining which fields to use for the update.\n\tUpdateMask *fieldmaskpb.FieldMask `protobuf:\"bytes,2,opt,name=update_mask,json=updateMask,proto3\" json:\"update_mask,omitempty\"`\n}\n\nfunc (x *UpdateServiceRequest) Reset() {\n\t*x = UpdateServiceRequest{}\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[4]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UpdateServiceRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateServiceRequest) ProtoMessage() {}\n\nfunc (x *UpdateServiceRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[4]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateServiceRequest.ProtoReflect.Descriptor instead.\nfunc (*UpdateServiceRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *UpdateServiceRequest) GetService() *Service {\n\tif x != nil {\n\t\treturn x.Service\n\t}\n\treturn nil\n}\n\nfunc (x *UpdateServiceRequest) GetUpdateMask() *fieldmaskpb.FieldMask {\n\tif x != nil {\n\t\treturn x.UpdateMask\n\t}\n\treturn nil\n}\n\n// The `DeleteService` request.\ntype DeleteServiceRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Resource name of the `Service` to delete. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/services/[SERVICE_ID]\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *DeleteServiceRequest) Reset() {\n\t*x = DeleteServiceRequest{}\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[5]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *DeleteServiceRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DeleteServiceRequest) ProtoMessage() {}\n\nfunc (x *DeleteServiceRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[5]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DeleteServiceRequest.ProtoReflect.Descriptor instead.\nfunc (*DeleteServiceRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *DeleteServiceRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\n// The `CreateServiceLevelObjective` request.\ntype CreateServiceLevelObjectiveRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Resource name of the parent `Service`. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/services/[SERVICE_ID]\n\tParent string `protobuf:\"bytes,1,opt,name=parent,proto3\" json:\"parent,omitempty\"`\n\t// Optional. The ServiceLevelObjective id to use for this\n\t// ServiceLevelObjective. If omitted, an id will be generated instead. Must\n\t// match the pattern `^[a-zA-Z0-9-_:.]+$`\n\tServiceLevelObjectiveId string `protobuf:\"bytes,3,opt,name=service_level_objective_id,json=serviceLevelObjectiveId,proto3\" json:\"service_level_objective_id,omitempty\"`\n\t// Required. The `ServiceLevelObjective` to create.\n\t// The provided `name` will be respected if no `ServiceLevelObjective` exists\n\t// with this name.\n\tServiceLevelObjective *ServiceLevelObjective `protobuf:\"bytes,2,opt,name=service_level_objective,json=serviceLevelObjective,proto3\" json:\"service_level_objective,omitempty\"`\n}\n\nfunc (x *CreateServiceLevelObjectiveRequest) Reset() {\n\t*x = CreateServiceLevelObjectiveRequest{}\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[6]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *CreateServiceLevelObjectiveRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateServiceLevelObjectiveRequest) ProtoMessage() {}\n\nfunc (x *CreateServiceLevelObjectiveRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[6]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateServiceLevelObjectiveRequest.ProtoReflect.Descriptor instead.\nfunc (*CreateServiceLevelObjectiveRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *CreateServiceLevelObjectiveRequest) GetParent() string {\n\tif x != nil {\n\t\treturn x.Parent\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateServiceLevelObjectiveRequest) GetServiceLevelObjectiveId() string {\n\tif x != nil {\n\t\treturn x.ServiceLevelObjectiveId\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateServiceLevelObjectiveRequest) GetServiceLevelObjective() *ServiceLevelObjective {\n\tif x != nil {\n\t\treturn x.ServiceLevelObjective\n\t}\n\treturn nil\n}\n\n// The `GetServiceLevelObjective` request.\ntype GetServiceLevelObjectiveRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Resource name of the `ServiceLevelObjective` to get. The format\n\t// is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/services/[SERVICE_ID]/serviceLevelObjectives/[SLO_NAME]\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// View of the `ServiceLevelObjective` to return. If `DEFAULT`, return the\n\t// `ServiceLevelObjective` as originally defined. If `EXPLICIT` and the\n\t// `ServiceLevelObjective` is defined in terms of a `BasicSli`, replace the\n\t// `BasicSli` with a `RequestBasedSli` spelling out how the SLI is computed.\n\tView ServiceLevelObjective_View `protobuf:\"varint,2,opt,name=view,proto3,enum=google.monitoring.v3.ServiceLevelObjective_View\" json:\"view,omitempty\"`\n}\n\nfunc (x *GetServiceLevelObjectiveRequest) Reset() {\n\t*x = GetServiceLevelObjectiveRequest{}\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[7]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *GetServiceLevelObjectiveRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetServiceLevelObjectiveRequest) ProtoMessage() {}\n\nfunc (x *GetServiceLevelObjectiveRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[7]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetServiceLevelObjectiveRequest.ProtoReflect.Descriptor instead.\nfunc (*GetServiceLevelObjectiveRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *GetServiceLevelObjectiveRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetServiceLevelObjectiveRequest) GetView() ServiceLevelObjective_View {\n\tif x != nil {\n\t\treturn x.View\n\t}\n\treturn ServiceLevelObjective_VIEW_UNSPECIFIED\n}\n\n// The `ListServiceLevelObjectives` request.\ntype ListServiceLevelObjectivesRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Resource name of the parent containing the listed SLOs, either a\n\t// project or a Monitoring Metrics Scope. The formats are:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/services/[SERVICE_ID]\n\t//\tworkspaces/[HOST_PROJECT_ID_OR_NUMBER]/services/-\n\tParent string `protobuf:\"bytes,1,opt,name=parent,proto3\" json:\"parent,omitempty\"`\n\t// A filter specifying what `ServiceLevelObjective`s to return.\n\tFilter string `protobuf:\"bytes,2,opt,name=filter,proto3\" json:\"filter,omitempty\"`\n\t// A non-negative number that is the maximum number of results to return.\n\t// When 0, use default page size.\n\tPageSize int32 `protobuf:\"varint,3,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\t// If this field is not empty then it must contain the `nextPageToken` value\n\t// returned by a previous call to this method.  Using this field causes the\n\t// method to return additional results from the previous method call.\n\tPageToken string `protobuf:\"bytes,4,opt,name=page_token,json=pageToken,proto3\" json:\"page_token,omitempty\"`\n\t// View of the `ServiceLevelObjective`s to return. If `DEFAULT`, return each\n\t// `ServiceLevelObjective` as originally defined. If `EXPLICIT` and the\n\t// `ServiceLevelObjective` is defined in terms of a `BasicSli`, replace the\n\t// `BasicSli` with a `RequestBasedSli` spelling out how the SLI is computed.\n\tView ServiceLevelObjective_View `protobuf:\"varint,5,opt,name=view,proto3,enum=google.monitoring.v3.ServiceLevelObjective_View\" json:\"view,omitempty\"`\n}\n\nfunc (x *ListServiceLevelObjectivesRequest) Reset() {\n\t*x = ListServiceLevelObjectivesRequest{}\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[8]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListServiceLevelObjectivesRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListServiceLevelObjectivesRequest) ProtoMessage() {}\n\nfunc (x *ListServiceLevelObjectivesRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[8]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListServiceLevelObjectivesRequest.ProtoReflect.Descriptor instead.\nfunc (*ListServiceLevelObjectivesRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *ListServiceLevelObjectivesRequest) GetParent() string {\n\tif x != nil {\n\t\treturn x.Parent\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListServiceLevelObjectivesRequest) GetFilter() string {\n\tif x != nil {\n\t\treturn x.Filter\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListServiceLevelObjectivesRequest) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListServiceLevelObjectivesRequest) GetPageToken() string {\n\tif x != nil {\n\t\treturn x.PageToken\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListServiceLevelObjectivesRequest) GetView() ServiceLevelObjective_View {\n\tif x != nil {\n\t\treturn x.View\n\t}\n\treturn ServiceLevelObjective_VIEW_UNSPECIFIED\n}\n\n// The `ListServiceLevelObjectives` response.\ntype ListServiceLevelObjectivesResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The `ServiceLevelObjective`s matching the specified filter.\n\tServiceLevelObjectives []*ServiceLevelObjective `protobuf:\"bytes,1,rep,name=service_level_objectives,json=serviceLevelObjectives,proto3\" json:\"service_level_objectives,omitempty\"`\n\t// If there are more results than have been returned, then this field is set\n\t// to a non-empty value.  To see the additional results,\n\t// use that value as `page_token` in the next call to this method.\n\tNextPageToken string `protobuf:\"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3\" json:\"next_page_token,omitempty\"`\n}\n\nfunc (x *ListServiceLevelObjectivesResponse) Reset() {\n\t*x = ListServiceLevelObjectivesResponse{}\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[9]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListServiceLevelObjectivesResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListServiceLevelObjectivesResponse) ProtoMessage() {}\n\nfunc (x *ListServiceLevelObjectivesResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[9]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListServiceLevelObjectivesResponse.ProtoReflect.Descriptor instead.\nfunc (*ListServiceLevelObjectivesResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *ListServiceLevelObjectivesResponse) GetServiceLevelObjectives() []*ServiceLevelObjective {\n\tif x != nil {\n\t\treturn x.ServiceLevelObjectives\n\t}\n\treturn nil\n}\n\nfunc (x *ListServiceLevelObjectivesResponse) GetNextPageToken() string {\n\tif x != nil {\n\t\treturn x.NextPageToken\n\t}\n\treturn \"\"\n}\n\n// The `UpdateServiceLevelObjective` request.\ntype UpdateServiceLevelObjectiveRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The `ServiceLevelObjective` to draw updates from.\n\t// The given `name` specifies the resource to update.\n\tServiceLevelObjective *ServiceLevelObjective `protobuf:\"bytes,1,opt,name=service_level_objective,json=serviceLevelObjective,proto3\" json:\"service_level_objective,omitempty\"`\n\t// A set of field paths defining which fields to use for the update.\n\tUpdateMask *fieldmaskpb.FieldMask `protobuf:\"bytes,2,opt,name=update_mask,json=updateMask,proto3\" json:\"update_mask,omitempty\"`\n}\n\nfunc (x *UpdateServiceLevelObjectiveRequest) Reset() {\n\t*x = UpdateServiceLevelObjectiveRequest{}\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[10]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UpdateServiceLevelObjectiveRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateServiceLevelObjectiveRequest) ProtoMessage() {}\n\nfunc (x *UpdateServiceLevelObjectiveRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[10]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateServiceLevelObjectiveRequest.ProtoReflect.Descriptor instead.\nfunc (*UpdateServiceLevelObjectiveRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *UpdateServiceLevelObjectiveRequest) GetServiceLevelObjective() *ServiceLevelObjective {\n\tif x != nil {\n\t\treturn x.ServiceLevelObjective\n\t}\n\treturn nil\n}\n\nfunc (x *UpdateServiceLevelObjectiveRequest) GetUpdateMask() *fieldmaskpb.FieldMask {\n\tif x != nil {\n\t\treturn x.UpdateMask\n\t}\n\treturn nil\n}\n\n// The `DeleteServiceLevelObjective` request.\ntype DeleteServiceLevelObjectiveRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Resource name of the `ServiceLevelObjective` to delete. The\n\t// format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/services/[SERVICE_ID]/serviceLevelObjectives/[SLO_NAME]\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *DeleteServiceLevelObjectiveRequest) Reset() {\n\t*x = DeleteServiceLevelObjectiveRequest{}\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[11]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *DeleteServiceLevelObjectiveRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DeleteServiceLevelObjectiveRequest) ProtoMessage() {}\n\nfunc (x *DeleteServiceLevelObjectiveRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_service_service_proto_msgTypes[11]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DeleteServiceLevelObjectiveRequest.ProtoReflect.Descriptor instead.\nfunc (*DeleteServiceLevelObjectiveRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{11}\n}\n\nfunc (x *DeleteServiceLevelObjectiveRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nvar File_google_monitoring_v3_service_service_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_service_service_proto_rawDesc = []byte{\n\t0x0a, 0x2a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61,\n\t0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69,\n\t0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61,\n\t0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x22, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61,\n\t0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x43, 0x72, 0x65,\n\t0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x41, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x29, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x23, 0x12, 0x21, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x06, 0x70, 0x61,\n\t0x72, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f,\n\t0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x22, 0x52, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,\n\t0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xac, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a,\n\t0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0,\n\t0x41, 0x02, 0xfa, 0x41, 0x23, 0x12, 0x21, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74,\n\t0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65,\n\t0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67,\n\t0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f,\n\t0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54,\n\t0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x79, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x08,\n\t0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x73,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f,\n\t0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22,\n\t0x91, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33,\n\t0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x73,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,\n\t0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d,\n\t0x61, 0x73, 0x6b, 0x22, 0x55, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x02, 0xfa, 0x41,\n\t0x23, 0x0a, 0x21, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x8e, 0x02, 0x0a, 0x22, 0x43,\n\t0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65,\n\t0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x41, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x29, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x06, 0x70, 0x61,\n\t0x72, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f,\n\t0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f,\n\t0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x49,\n\t0x64, 0x12, 0x68, 0x0a, 0x17, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76,\n\t0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x42,\n\t0x03, 0xe0, 0x41, 0x02, 0x52, 0x15, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76,\n\t0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0xb4, 0x01, 0x0a, 0x1f,\n\t0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,\n\t0x4b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x37, 0xe0,\n\t0x41, 0x02, 0xfa, 0x41, 0x31, 0x0a, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x04,\n\t0x76, 0x69, 0x65, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62,\n\t0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x52, 0x04, 0x76, 0x69,\n\t0x65, 0x77, 0x22, 0x80, 0x02, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69,\n\t0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65,\n\t0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65,\n\t0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x23,\n\t0x0a, 0x21, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66,\n\t0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c,\n\t0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65,\n\t0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12,\n\t0x44, 0x0a, 0x04, 0x76, 0x69, 0x65, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65,\n\t0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x52,\n\t0x04, 0x76, 0x69, 0x65, 0x77, 0x22, 0xb3, 0x01, 0x0a, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,\n\t0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x18,\n\t0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62,\n\t0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76,\n\t0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x16, 0x73, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69,\n\t0x76, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65,\n\t0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65,\n\t0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xcb, 0x01, 0x0a, 0x22,\n\t0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76,\n\t0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x12, 0x68, 0x0a, 0x17, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69,\n\t0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65,\n\t0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x15, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65,\n\t0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x3b, 0x0a, 0x0b,\n\t0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75,\n\t0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x71, 0x0a, 0x22, 0x44, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,\n\t0x4b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x37, 0xe0,\n\t0x41, 0x02, 0xfa, 0x41, 0x31, 0x0a, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0xea, 0x0f, 0x0a,\n\t0x18, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x0d, 0x43, 0x72,\n\t0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2a, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x3b, 0xda, 0x41, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e,\n\t0x74, 0x2c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a,\n\t0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x19, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x70,\n\t0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x2a, 0x2f, 0x2a, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69,\n\t0x63, 0x65, 0x73, 0x12, 0x7e, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x28, 0xda, 0x41, 0x04, 0x6e, 0x61,\n\t0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e,\n\t0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73,\n\t0x2f, 0x2a, 0x7d, 0x12, 0x91, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74,\n\t0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,\n\t0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69,\n\t0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0xda, 0x41, 0x06,\n\t0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x76,\n\t0x33, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x2a, 0x2f, 0x2a, 0x7d, 0x2f, 0x73,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x98, 0x01, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61,\n\t0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33,\n\t0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x22, 0x3c, 0xda, 0x41, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x32,\n\t0x21, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x6e, 0x61,\n\t0x6d, 0x65, 0x3d, 0x2a, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f,\n\t0x2a, 0x7d, 0x12, 0x7d, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74,\n\t0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,\n\t0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x28, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x2a, 0x19, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d,\n\t0x65, 0x3d, 0x2a, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x2a,\n\t0x7d, 0x12, 0xfa, 0x01, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76,\n\t0x65, 0x12, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63,\n\t0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x74, 0xda, 0x41, 0x1e, 0x70, 0x61, 0x72,\n\t0x65, 0x6e, 0x74, 0x2c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65,\n\t0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02,\n\t0x4d, 0x3a, 0x17, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c,\n\t0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x32, 0x2f, 0x76, 0x33, 0x2f,\n\t0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x2a, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c,\n\t0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x12, 0xc1,\n\t0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76,\n\t0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x35, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76,\n\t0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22,\n\t0x41, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32,\n\t0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2f, 0x2a, 0x2f, 0x73, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2f,\n\t0x2a, 0x7d, 0x12, 0xd4, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69,\n\t0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65,\n\t0x73, 0x12, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72,\n\t0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69,\n\t0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76,\n\t0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x82,\n\t0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65,\n\t0x6e, 0x74, 0x3d, 0x2a, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f,\n\t0x2a, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x12, 0x8c, 0x02, 0x0a, 0x1b, 0x55, 0x70,\n\t0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c,\n\t0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33,\n\t0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65,\n\t0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69,\n\t0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65,\n\t0x22, 0x85, 0x01, 0xda, 0x41, 0x17, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x82, 0xd3, 0xe4,\n\t0x93, 0x02, 0x65, 0x3a, 0x17, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76,\n\t0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x32, 0x4a, 0x2f, 0x76,\n\t0x33, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c,\n\t0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d,\n\t0x2a, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x73,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63,\n\t0x74, 0x69, 0x76, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xb2, 0x01, 0x0a, 0x1b, 0x44, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e,\n\t0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76,\n\t0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x41, 0xda, 0x41, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x2a, 0x32, 0x2f, 0x76, 0x33, 0x2f, 0x7b,\n\t0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c,\n\t0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x1a, 0xa9, 0x01,\n\t0xca, 0x41, 0x19, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x89, 0x01,\n\t0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68,\n\t0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a,\n\t0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x42, 0xd8, 0x01, 0x0a, 0x18, 0x63, 0x6f,\n\t0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x1d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,\n\t0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32,\n\t0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43,\n\t0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_monitoring_v3_service_service_proto_rawDescOnce sync.Once\n\tfile_google_monitoring_v3_service_service_proto_rawDescData = file_google_monitoring_v3_service_service_proto_rawDesc\n)\n\nfunc file_google_monitoring_v3_service_service_proto_rawDescGZIP() []byte {\n\tfile_google_monitoring_v3_service_service_proto_rawDescOnce.Do(func() {\n\t\tfile_google_monitoring_v3_service_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_service_service_proto_rawDescData)\n\t})\n\treturn file_google_monitoring_v3_service_service_proto_rawDescData\n}\n\nvar file_google_monitoring_v3_service_service_proto_msgTypes = make([]protoimpl.MessageInfo, 12)\nvar file_google_monitoring_v3_service_service_proto_goTypes = []any{\n\t(*CreateServiceRequest)(nil),               // 0: google.monitoring.v3.CreateServiceRequest\n\t(*GetServiceRequest)(nil),                  // 1: google.monitoring.v3.GetServiceRequest\n\t(*ListServicesRequest)(nil),                // 2: google.monitoring.v3.ListServicesRequest\n\t(*ListServicesResponse)(nil),               // 3: google.monitoring.v3.ListServicesResponse\n\t(*UpdateServiceRequest)(nil),               // 4: google.monitoring.v3.UpdateServiceRequest\n\t(*DeleteServiceRequest)(nil),               // 5: google.monitoring.v3.DeleteServiceRequest\n\t(*CreateServiceLevelObjectiveRequest)(nil), // 6: google.monitoring.v3.CreateServiceLevelObjectiveRequest\n\t(*GetServiceLevelObjectiveRequest)(nil),    // 7: google.monitoring.v3.GetServiceLevelObjectiveRequest\n\t(*ListServiceLevelObjectivesRequest)(nil),  // 8: google.monitoring.v3.ListServiceLevelObjectivesRequest\n\t(*ListServiceLevelObjectivesResponse)(nil), // 9: google.monitoring.v3.ListServiceLevelObjectivesResponse\n\t(*UpdateServiceLevelObjectiveRequest)(nil), // 10: google.monitoring.v3.UpdateServiceLevelObjectiveRequest\n\t(*DeleteServiceLevelObjectiveRequest)(nil), // 11: google.monitoring.v3.DeleteServiceLevelObjectiveRequest\n\t(*Service)(nil),                            // 12: google.monitoring.v3.Service\n\t(*fieldmaskpb.FieldMask)(nil),              // 13: google.protobuf.FieldMask\n\t(*ServiceLevelObjective)(nil),              // 14: google.monitoring.v3.ServiceLevelObjective\n\t(ServiceLevelObjective_View)(0),            // 15: google.monitoring.v3.ServiceLevelObjective.View\n\t(*emptypb.Empty)(nil),                      // 16: google.protobuf.Empty\n}\nvar file_google_monitoring_v3_service_service_proto_depIdxs = []int32{\n\t12, // 0: google.monitoring.v3.CreateServiceRequest.service:type_name -> google.monitoring.v3.Service\n\t12, // 1: google.monitoring.v3.ListServicesResponse.services:type_name -> google.monitoring.v3.Service\n\t12, // 2: google.monitoring.v3.UpdateServiceRequest.service:type_name -> google.monitoring.v3.Service\n\t13, // 3: google.monitoring.v3.UpdateServiceRequest.update_mask:type_name -> google.protobuf.FieldMask\n\t14, // 4: google.monitoring.v3.CreateServiceLevelObjectiveRequest.service_level_objective:type_name -> google.monitoring.v3.ServiceLevelObjective\n\t15, // 5: google.monitoring.v3.GetServiceLevelObjectiveRequest.view:type_name -> google.monitoring.v3.ServiceLevelObjective.View\n\t15, // 6: google.monitoring.v3.ListServiceLevelObjectivesRequest.view:type_name -> google.monitoring.v3.ServiceLevelObjective.View\n\t14, // 7: google.monitoring.v3.ListServiceLevelObjectivesResponse.service_level_objectives:type_name -> google.monitoring.v3.ServiceLevelObjective\n\t14, // 8: google.monitoring.v3.UpdateServiceLevelObjectiveRequest.service_level_objective:type_name -> google.monitoring.v3.ServiceLevelObjective\n\t13, // 9: google.monitoring.v3.UpdateServiceLevelObjectiveRequest.update_mask:type_name -> google.protobuf.FieldMask\n\t0,  // 10: google.monitoring.v3.ServiceMonitoringService.CreateService:input_type -> google.monitoring.v3.CreateServiceRequest\n\t1,  // 11: google.monitoring.v3.ServiceMonitoringService.GetService:input_type -> google.monitoring.v3.GetServiceRequest\n\t2,  // 12: google.monitoring.v3.ServiceMonitoringService.ListServices:input_type -> google.monitoring.v3.ListServicesRequest\n\t4,  // 13: google.monitoring.v3.ServiceMonitoringService.UpdateService:input_type -> google.monitoring.v3.UpdateServiceRequest\n\t5,  // 14: google.monitoring.v3.ServiceMonitoringService.DeleteService:input_type -> google.monitoring.v3.DeleteServiceRequest\n\t6,  // 15: google.monitoring.v3.ServiceMonitoringService.CreateServiceLevelObjective:input_type -> google.monitoring.v3.CreateServiceLevelObjectiveRequest\n\t7,  // 16: google.monitoring.v3.ServiceMonitoringService.GetServiceLevelObjective:input_type -> google.monitoring.v3.GetServiceLevelObjectiveRequest\n\t8,  // 17: google.monitoring.v3.ServiceMonitoringService.ListServiceLevelObjectives:input_type -> google.monitoring.v3.ListServiceLevelObjectivesRequest\n\t10, // 18: google.monitoring.v3.ServiceMonitoringService.UpdateServiceLevelObjective:input_type -> google.monitoring.v3.UpdateServiceLevelObjectiveRequest\n\t11, // 19: google.monitoring.v3.ServiceMonitoringService.DeleteServiceLevelObjective:input_type -> google.monitoring.v3.DeleteServiceLevelObjectiveRequest\n\t12, // 20: google.monitoring.v3.ServiceMonitoringService.CreateService:output_type -> google.monitoring.v3.Service\n\t12, // 21: google.monitoring.v3.ServiceMonitoringService.GetService:output_type -> google.monitoring.v3.Service\n\t3,  // 22: google.monitoring.v3.ServiceMonitoringService.ListServices:output_type -> google.monitoring.v3.ListServicesResponse\n\t12, // 23: google.monitoring.v3.ServiceMonitoringService.UpdateService:output_type -> google.monitoring.v3.Service\n\t16, // 24: google.monitoring.v3.ServiceMonitoringService.DeleteService:output_type -> google.protobuf.Empty\n\t14, // 25: google.monitoring.v3.ServiceMonitoringService.CreateServiceLevelObjective:output_type -> google.monitoring.v3.ServiceLevelObjective\n\t14, // 26: google.monitoring.v3.ServiceMonitoringService.GetServiceLevelObjective:output_type -> google.monitoring.v3.ServiceLevelObjective\n\t9,  // 27: google.monitoring.v3.ServiceMonitoringService.ListServiceLevelObjectives:output_type -> google.monitoring.v3.ListServiceLevelObjectivesResponse\n\t14, // 28: google.monitoring.v3.ServiceMonitoringService.UpdateServiceLevelObjective:output_type -> google.monitoring.v3.ServiceLevelObjective\n\t16, // 29: google.monitoring.v3.ServiceMonitoringService.DeleteServiceLevelObjective:output_type -> google.protobuf.Empty\n\t20, // [20:30] is the sub-list for method output_type\n\t10, // [10:20] is the sub-list for method input_type\n\t10, // [10:10] is the sub-list for extension type_name\n\t10, // [10:10] is the sub-list for extension extendee\n\t0,  // [0:10] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_service_service_proto_init() }\nfunc file_google_monitoring_v3_service_service_proto_init() {\n\tif File_google_monitoring_v3_service_service_proto != nil {\n\t\treturn\n\t}\n\tfile_google_monitoring_v3_service_proto_init()\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_service_service_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   12,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_service_service_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_service_service_proto_depIdxs,\n\t\tMessageInfos:      file_google_monitoring_v3_service_service_proto_msgTypes,\n\t}.Build()\n\tFile_google_monitoring_v3_service_service_proto = out.File\n\tfile_google_monitoring_v3_service_service_proto_rawDesc = nil\n\tfile_google_monitoring_v3_service_service_proto_goTypes = nil\n\tfile_google_monitoring_v3_service_service_proto_depIdxs = nil\n}\n\n// Reference imports to suppress errors if they are not otherwise used.\nvar _ context.Context\nvar _ grpc.ClientConnInterface\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\nconst _ = grpc.SupportPackageIsVersion6\n\n// ServiceMonitoringServiceClient is the client API for ServiceMonitoringService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.\ntype ServiceMonitoringServiceClient interface {\n\t// Create a `Service`.\n\tCreateService(ctx context.Context, in *CreateServiceRequest, opts ...grpc.CallOption) (*Service, error)\n\t// Get the named `Service`.\n\tGetService(ctx context.Context, in *GetServiceRequest, opts ...grpc.CallOption) (*Service, error)\n\t// List `Service`s for this Metrics Scope.\n\tListServices(ctx context.Context, in *ListServicesRequest, opts ...grpc.CallOption) (*ListServicesResponse, error)\n\t// Update this `Service`.\n\tUpdateService(ctx context.Context, in *UpdateServiceRequest, opts ...grpc.CallOption) (*Service, error)\n\t// Soft delete this `Service`.\n\tDeleteService(ctx context.Context, in *DeleteServiceRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\t// Create a `ServiceLevelObjective` for the given `Service`.\n\tCreateServiceLevelObjective(ctx context.Context, in *CreateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error)\n\t// Get a `ServiceLevelObjective` by name.\n\tGetServiceLevelObjective(ctx context.Context, in *GetServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error)\n\t// List the `ServiceLevelObjective`s for the given `Service`.\n\tListServiceLevelObjectives(ctx context.Context, in *ListServiceLevelObjectivesRequest, opts ...grpc.CallOption) (*ListServiceLevelObjectivesResponse, error)\n\t// Update the given `ServiceLevelObjective`.\n\tUpdateServiceLevelObjective(ctx context.Context, in *UpdateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error)\n\t// Delete the given `ServiceLevelObjective`.\n\tDeleteServiceLevelObjective(ctx context.Context, in *DeleteServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n}\n\ntype serviceMonitoringServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewServiceMonitoringServiceClient(cc grpc.ClientConnInterface) ServiceMonitoringServiceClient {\n\treturn &serviceMonitoringServiceClient{cc}\n}\n\nfunc (c *serviceMonitoringServiceClient) CreateService(ctx context.Context, in *CreateServiceRequest, opts ...grpc.CallOption) (*Service, error) {\n\tout := new(Service)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.ServiceMonitoringService/CreateService\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *serviceMonitoringServiceClient) GetService(ctx context.Context, in *GetServiceRequest, opts ...grpc.CallOption) (*Service, error) {\n\tout := new(Service)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.ServiceMonitoringService/GetService\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *serviceMonitoringServiceClient) ListServices(ctx context.Context, in *ListServicesRequest, opts ...grpc.CallOption) (*ListServicesResponse, error) {\n\tout := new(ListServicesResponse)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.ServiceMonitoringService/ListServices\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *serviceMonitoringServiceClient) UpdateService(ctx context.Context, in *UpdateServiceRequest, opts ...grpc.CallOption) (*Service, error) {\n\tout := new(Service)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.ServiceMonitoringService/UpdateService\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *serviceMonitoringServiceClient) DeleteService(ctx context.Context, in *DeleteServiceRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.ServiceMonitoringService/DeleteService\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *serviceMonitoringServiceClient) CreateServiceLevelObjective(ctx context.Context, in *CreateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) {\n\tout := new(ServiceLevelObjective)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.ServiceMonitoringService/CreateServiceLevelObjective\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *serviceMonitoringServiceClient) GetServiceLevelObjective(ctx context.Context, in *GetServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) {\n\tout := new(ServiceLevelObjective)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.ServiceMonitoringService/GetServiceLevelObjective\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *serviceMonitoringServiceClient) ListServiceLevelObjectives(ctx context.Context, in *ListServiceLevelObjectivesRequest, opts ...grpc.CallOption) (*ListServiceLevelObjectivesResponse, error) {\n\tout := new(ListServiceLevelObjectivesResponse)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.ServiceMonitoringService/ListServiceLevelObjectives\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *serviceMonitoringServiceClient) UpdateServiceLevelObjective(ctx context.Context, in *UpdateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) {\n\tout := new(ServiceLevelObjective)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.ServiceMonitoringService/UpdateServiceLevelObjective\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *serviceMonitoringServiceClient) DeleteServiceLevelObjective(ctx context.Context, in *DeleteServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.ServiceMonitoringService/DeleteServiceLevelObjective\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// ServiceMonitoringServiceServer is the server API for ServiceMonitoringService service.\ntype ServiceMonitoringServiceServer interface {\n\t// Create a `Service`.\n\tCreateService(context.Context, *CreateServiceRequest) (*Service, error)\n\t// Get the named `Service`.\n\tGetService(context.Context, *GetServiceRequest) (*Service, error)\n\t// List `Service`s for this Metrics Scope.\n\tListServices(context.Context, *ListServicesRequest) (*ListServicesResponse, error)\n\t// Update this `Service`.\n\tUpdateService(context.Context, *UpdateServiceRequest) (*Service, error)\n\t// Soft delete this `Service`.\n\tDeleteService(context.Context, *DeleteServiceRequest) (*emptypb.Empty, error)\n\t// Create a `ServiceLevelObjective` for the given `Service`.\n\tCreateServiceLevelObjective(context.Context, *CreateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error)\n\t// Get a `ServiceLevelObjective` by name.\n\tGetServiceLevelObjective(context.Context, *GetServiceLevelObjectiveRequest) (*ServiceLevelObjective, error)\n\t// List the `ServiceLevelObjective`s for the given `Service`.\n\tListServiceLevelObjectives(context.Context, *ListServiceLevelObjectivesRequest) (*ListServiceLevelObjectivesResponse, error)\n\t// Update the given `ServiceLevelObjective`.\n\tUpdateServiceLevelObjective(context.Context, *UpdateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error)\n\t// Delete the given `ServiceLevelObjective`.\n\tDeleteServiceLevelObjective(context.Context, *DeleteServiceLevelObjectiveRequest) (*emptypb.Empty, error)\n}\n\n// UnimplementedServiceMonitoringServiceServer can be embedded to have forward compatible implementations.\ntype UnimplementedServiceMonitoringServiceServer struct {\n}\n\nfunc (*UnimplementedServiceMonitoringServiceServer) CreateService(context.Context, *CreateServiceRequest) (*Service, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateService not implemented\")\n}\nfunc (*UnimplementedServiceMonitoringServiceServer) GetService(context.Context, *GetServiceRequest) (*Service, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetService not implemented\")\n}\nfunc (*UnimplementedServiceMonitoringServiceServer) ListServices(context.Context, *ListServicesRequest) (*ListServicesResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListServices not implemented\")\n}\nfunc (*UnimplementedServiceMonitoringServiceServer) UpdateService(context.Context, *UpdateServiceRequest) (*Service, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateService not implemented\")\n}\nfunc (*UnimplementedServiceMonitoringServiceServer) DeleteService(context.Context, *DeleteServiceRequest) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeleteService not implemented\")\n}\nfunc (*UnimplementedServiceMonitoringServiceServer) CreateServiceLevelObjective(context.Context, *CreateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateServiceLevelObjective not implemented\")\n}\nfunc (*UnimplementedServiceMonitoringServiceServer) GetServiceLevelObjective(context.Context, *GetServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetServiceLevelObjective not implemented\")\n}\nfunc (*UnimplementedServiceMonitoringServiceServer) ListServiceLevelObjectives(context.Context, *ListServiceLevelObjectivesRequest) (*ListServiceLevelObjectivesResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListServiceLevelObjectives not implemented\")\n}\nfunc (*UnimplementedServiceMonitoringServiceServer) UpdateServiceLevelObjective(context.Context, *UpdateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateServiceLevelObjective not implemented\")\n}\nfunc (*UnimplementedServiceMonitoringServiceServer) DeleteServiceLevelObjective(context.Context, *DeleteServiceLevelObjectiveRequest) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeleteServiceLevelObjective not implemented\")\n}\n\nfunc RegisterServiceMonitoringServiceServer(s *grpc.Server, srv ServiceMonitoringServiceServer) {\n\ts.RegisterService(&_ServiceMonitoringService_serviceDesc, srv)\n}\n\nfunc _ServiceMonitoringService_CreateService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateServiceRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ServiceMonitoringServiceServer).CreateService(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.ServiceMonitoringService/CreateService\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ServiceMonitoringServiceServer).CreateService(ctx, req.(*CreateServiceRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _ServiceMonitoringService_GetService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetServiceRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ServiceMonitoringServiceServer).GetService(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.ServiceMonitoringService/GetService\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ServiceMonitoringServiceServer).GetService(ctx, req.(*GetServiceRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _ServiceMonitoringService_ListServices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListServicesRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ServiceMonitoringServiceServer).ListServices(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.ServiceMonitoringService/ListServices\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ServiceMonitoringServiceServer).ListServices(ctx, req.(*ListServicesRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _ServiceMonitoringService_UpdateService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateServiceRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ServiceMonitoringServiceServer).UpdateService(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.ServiceMonitoringService/UpdateService\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ServiceMonitoringServiceServer).UpdateService(ctx, req.(*UpdateServiceRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _ServiceMonitoringService_DeleteService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(DeleteServiceRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ServiceMonitoringServiceServer).DeleteService(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.ServiceMonitoringService/DeleteService\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ServiceMonitoringServiceServer).DeleteService(ctx, req.(*DeleteServiceRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _ServiceMonitoringService_CreateServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateServiceLevelObjectiveRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ServiceMonitoringServiceServer).CreateServiceLevelObjective(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.ServiceMonitoringService/CreateServiceLevelObjective\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ServiceMonitoringServiceServer).CreateServiceLevelObjective(ctx, req.(*CreateServiceLevelObjectiveRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _ServiceMonitoringService_GetServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetServiceLevelObjectiveRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ServiceMonitoringServiceServer).GetServiceLevelObjective(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.ServiceMonitoringService/GetServiceLevelObjective\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ServiceMonitoringServiceServer).GetServiceLevelObjective(ctx, req.(*GetServiceLevelObjectiveRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _ServiceMonitoringService_ListServiceLevelObjectives_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListServiceLevelObjectivesRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ServiceMonitoringServiceServer).ListServiceLevelObjectives(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.ServiceMonitoringService/ListServiceLevelObjectives\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ServiceMonitoringServiceServer).ListServiceLevelObjectives(ctx, req.(*ListServiceLevelObjectivesRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _ServiceMonitoringService_UpdateServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateServiceLevelObjectiveRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ServiceMonitoringServiceServer).UpdateServiceLevelObjective(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.ServiceMonitoringService/UpdateServiceLevelObjective\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ServiceMonitoringServiceServer).UpdateServiceLevelObjective(ctx, req.(*UpdateServiceLevelObjectiveRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _ServiceMonitoringService_DeleteServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(DeleteServiceLevelObjectiveRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(ServiceMonitoringServiceServer).DeleteServiceLevelObjective(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.ServiceMonitoringService/DeleteServiceLevelObjective\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(ServiceMonitoringServiceServer).DeleteServiceLevelObjective(ctx, req.(*DeleteServiceLevelObjectiveRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nvar _ServiceMonitoringService_serviceDesc = grpc.ServiceDesc{\n\tServiceName: \"google.monitoring.v3.ServiceMonitoringService\",\n\tHandlerType: (*ServiceMonitoringServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"CreateService\",\n\t\t\tHandler:    _ServiceMonitoringService_CreateService_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetService\",\n\t\t\tHandler:    _ServiceMonitoringService_GetService_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListServices\",\n\t\t\tHandler:    _ServiceMonitoringService_ListServices_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateService\",\n\t\t\tHandler:    _ServiceMonitoringService_UpdateService_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteService\",\n\t\t\tHandler:    _ServiceMonitoringService_DeleteService_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateServiceLevelObjective\",\n\t\t\tHandler:    _ServiceMonitoringService_CreateServiceLevelObjective_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetServiceLevelObjective\",\n\t\t\tHandler:    _ServiceMonitoringService_GetServiceLevelObjective_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListServiceLevelObjectives\",\n\t\t\tHandler:    _ServiceMonitoringService_ListServiceLevelObjectives_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateServiceLevelObjective\",\n\t\t\tHandler:    _ServiceMonitoringService_UpdateServiceLevelObjective_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteServiceLevelObjective\",\n\t\t\tHandler:    _ServiceMonitoringService_DeleteServiceLevelObjective_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"google/monitoring/v3/service_service.proto\",\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/snooze.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/snooze.proto\n\npackage monitoringpb\n\nimport (\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// A `Snooze` will prevent any alerts from being opened, and close any that\n// are already open. The `Snooze` will work on alerts that match the\n// criteria defined in the `Snooze`. The `Snooze` will be active from\n// `interval.start_time` through `interval.end_time`.\ntype Snooze struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Identifier. The name of the `Snooze`. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/snoozes/[SNOOZE_ID]\n\t//\n\t// The ID of the `Snooze` will be generated by the system.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// Required. This defines the criteria for applying the `Snooze`. See\n\t// `Criteria` for more information.\n\tCriteria *Snooze_Criteria `protobuf:\"bytes,3,opt,name=criteria,proto3\" json:\"criteria,omitempty\"`\n\t// Required. The `Snooze` will be active from `interval.start_time` through\n\t// `interval.end_time`.\n\t// `interval.start_time` cannot be in the past. There is a 15 second clock\n\t// skew to account for the time it takes for a request to reach the API from\n\t// the UI.\n\tInterval *TimeInterval `protobuf:\"bytes,4,opt,name=interval,proto3\" json:\"interval,omitempty\"`\n\t// Required. A display name for the `Snooze`. This can be, at most, 512\n\t// unicode characters.\n\tDisplayName string `protobuf:\"bytes,5,opt,name=display_name,json=displayName,proto3\" json:\"display_name,omitempty\"`\n}\n\nfunc (x *Snooze) Reset() {\n\t*x = Snooze{}\n\tmi := &file_google_monitoring_v3_snooze_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Snooze) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Snooze) ProtoMessage() {}\n\nfunc (x *Snooze) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_snooze_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Snooze.ProtoReflect.Descriptor instead.\nfunc (*Snooze) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_snooze_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Snooze) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Snooze) GetCriteria() *Snooze_Criteria {\n\tif x != nil {\n\t\treturn x.Criteria\n\t}\n\treturn nil\n}\n\nfunc (x *Snooze) GetInterval() *TimeInterval {\n\tif x != nil {\n\t\treturn x.Interval\n\t}\n\treturn nil\n}\n\nfunc (x *Snooze) GetDisplayName() string {\n\tif x != nil {\n\t\treturn x.DisplayName\n\t}\n\treturn \"\"\n}\n\n// Criteria specific to the `AlertPolicy`s that this `Snooze` applies to. The\n// `Snooze` will suppress alerts that come from one of the `AlertPolicy`s\n// whose names are supplied.\ntype Snooze_Criteria struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The specific `AlertPolicy` names for the alert that should be snoozed.\n\t// The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/alertPolicies/[POLICY_ID]\n\t//\n\t// There is a limit of 16 policies per snooze. This limit is checked during\n\t// snooze creation.\n\t// Exactly 1 alert policy is required if `filter` is specified at the same\n\t// time.\n\tPolicies []string `protobuf:\"bytes,1,rep,name=policies,proto3\" json:\"policies,omitempty\"`\n\t// Optional. The filter string to match on Alert fields when silencing the\n\t// alerts. It follows the standard https://google.aip.dev/160 syntax.\n\t// A filter string used to apply the snooze to specific incidents\n\t// that have matching filter values.\n\t// Filters can be defined for snoozes that apply to one alerting\n\t// policy.\n\t// Filters must be a string formatted as one or more resource labels with\n\t// specific label values. If multiple resource labels are used, then they\n\t// must be connected with an AND operator. For example, the following filter\n\t// applies the snooze to incidents that have an instance ID of\n\t// `1234567890` and a zone of `us-central1-a`:\n\t//\n\t//\tresource.labels.instance_id=\"1234567890\" AND\n\t//\tresource.labels.zone=\"us-central1-a\"\n\tFilter string `protobuf:\"bytes,2,opt,name=filter,proto3\" json:\"filter,omitempty\"`\n}\n\nfunc (x *Snooze_Criteria) Reset() {\n\t*x = Snooze_Criteria{}\n\tmi := &file_google_monitoring_v3_snooze_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Snooze_Criteria) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Snooze_Criteria) ProtoMessage() {}\n\nfunc (x *Snooze_Criteria) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_snooze_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Snooze_Criteria.ProtoReflect.Descriptor instead.\nfunc (*Snooze_Criteria) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_snooze_proto_rawDescGZIP(), []int{0, 0}\n}\n\nfunc (x *Snooze_Criteria) GetPolicies() []string {\n\tif x != nil {\n\t\treturn x.Policies\n\t}\n\treturn nil\n}\n\nfunc (x *Snooze_Criteria) GetFilter() string {\n\tif x != nil {\n\t\treturn x.Filter\n\t}\n\treturn \"\"\n}\n\nvar File_google_monitoring_v3_snooze_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_snooze_proto_rawDesc = []byte{\n\t0x0a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61,\n\t0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6f, 0x6d, 0x6d,\n\t0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8e, 0x03, 0x0a, 0x06, 0x53, 0x6e, 0x6f,\n\t0x6f, 0x7a, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x08,\n\t0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x2e, 0x43, 0x72, 0x69,\n\t0x74, 0x65, 0x72, 0x69, 0x61, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74,\n\t0x65, 0x72, 0x69, 0x61, 0x12, 0x43, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69,\n\t0x6d, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52,\n\t0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x26, 0x0a, 0x0c, 0x64, 0x69, 0x73,\n\t0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d,\n\t0x65, 0x1a, 0x6a, 0x0a, 0x08, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x12, 0x46, 0x0a,\n\t0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42,\n\t0x2a, 0xfa, 0x41, 0x27, 0x0a, 0x25, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,\n\t0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c,\n\t0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x3a, 0x4a, 0xea,\n\t0x41, 0x47, 0x0a, 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x6e,\n\t0x6f, 0x6f, 0x7a, 0x65, 0x12, 0x23, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b,\n\t0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73,\n\t0x2f, 0x7b, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x7d, 0x42, 0xc6, 0x01, 0x0a, 0x18, 0x63, 0x6f,\n\t0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x0b, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x50, 0x72,\n\t0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43,\n\t0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c,\n\t0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f,\n\t0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a,\n\t0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_monitoring_v3_snooze_proto_rawDescOnce sync.Once\n\tfile_google_monitoring_v3_snooze_proto_rawDescData = file_google_monitoring_v3_snooze_proto_rawDesc\n)\n\nfunc file_google_monitoring_v3_snooze_proto_rawDescGZIP() []byte {\n\tfile_google_monitoring_v3_snooze_proto_rawDescOnce.Do(func() {\n\t\tfile_google_monitoring_v3_snooze_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_snooze_proto_rawDescData)\n\t})\n\treturn file_google_monitoring_v3_snooze_proto_rawDescData\n}\n\nvar file_google_monitoring_v3_snooze_proto_msgTypes = make([]protoimpl.MessageInfo, 2)\nvar file_google_monitoring_v3_snooze_proto_goTypes = []any{\n\t(*Snooze)(nil),          // 0: google.monitoring.v3.Snooze\n\t(*Snooze_Criteria)(nil), // 1: google.monitoring.v3.Snooze.Criteria\n\t(*TimeInterval)(nil),    // 2: google.monitoring.v3.TimeInterval\n}\nvar file_google_monitoring_v3_snooze_proto_depIdxs = []int32{\n\t1, // 0: google.monitoring.v3.Snooze.criteria:type_name -> google.monitoring.v3.Snooze.Criteria\n\t2, // 1: google.monitoring.v3.Snooze.interval:type_name -> google.monitoring.v3.TimeInterval\n\t2, // [2:2] is the sub-list for method output_type\n\t2, // [2:2] is the sub-list for method input_type\n\t2, // [2:2] is the sub-list for extension type_name\n\t2, // [2:2] is the sub-list for extension extendee\n\t0, // [0:2] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_snooze_proto_init() }\nfunc file_google_monitoring_v3_snooze_proto_init() {\n\tif File_google_monitoring_v3_snooze_proto != nil {\n\t\treturn\n\t}\n\tfile_google_monitoring_v3_common_proto_init()\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_snooze_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   2,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_snooze_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_snooze_proto_depIdxs,\n\t\tMessageInfos:      file_google_monitoring_v3_snooze_proto_msgTypes,\n\t}.Build()\n\tFile_google_monitoring_v3_snooze_proto = out.File\n\tfile_google_monitoring_v3_snooze_proto_rawDesc = nil\n\tfile_google_monitoring_v3_snooze_proto_goTypes = nil\n\tfile_google_monitoring_v3_snooze_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/snooze_service.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/snooze_service.proto\n\npackage monitoringpb\n\nimport (\n\tcontext \"context\"\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tfieldmaskpb \"google.golang.org/protobuf/types/known/fieldmaskpb\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// The message definition for creating a `Snooze`. Users must provide the body\n// of the `Snooze` to be created but must omit the `Snooze` field, `name`.\ntype CreateSnoozeRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The\n\t// [project](https://cloud.google.com/monitoring/api/v3#project_name) in which\n\t// a `Snooze` should be created. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\tParent string `protobuf:\"bytes,1,opt,name=parent,proto3\" json:\"parent,omitempty\"`\n\t// Required. The `Snooze` to create. Omit the `name` field, as it will be\n\t// filled in by the API.\n\tSnooze *Snooze `protobuf:\"bytes,2,opt,name=snooze,proto3\" json:\"snooze,omitempty\"`\n}\n\nfunc (x *CreateSnoozeRequest) Reset() {\n\t*x = CreateSnoozeRequest{}\n\tmi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *CreateSnoozeRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateSnoozeRequest) ProtoMessage() {}\n\nfunc (x *CreateSnoozeRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateSnoozeRequest.ProtoReflect.Descriptor instead.\nfunc (*CreateSnoozeRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_snooze_service_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *CreateSnoozeRequest) GetParent() string {\n\tif x != nil {\n\t\treturn x.Parent\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateSnoozeRequest) GetSnooze() *Snooze {\n\tif x != nil {\n\t\treturn x.Snooze\n\t}\n\treturn nil\n}\n\n// The message definition for listing `Snooze`s associated with the given\n// `parent`, satisfying the optional `filter`.\ntype ListSnoozesRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The\n\t// [project](https://cloud.google.com/monitoring/api/v3#project_name) whose\n\t// `Snooze`s should be listed. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\tParent string `protobuf:\"bytes,1,opt,name=parent,proto3\" json:\"parent,omitempty\"`\n\t// Optional. Optional filter to restrict results to the given criteria. The\n\t// following fields are supported.\n\t//\n\t//   - `interval.start_time`\n\t//   - `interval.end_time`\n\t//\n\t// For example:\n\t//\n\t//\tinterval.start_time > \"2022-03-11T00:00:00-08:00\" AND\n\t//\t    interval.end_time < \"2022-03-12T00:00:00-08:00\"\n\tFilter string `protobuf:\"bytes,2,opt,name=filter,proto3\" json:\"filter,omitempty\"`\n\t// Optional. The maximum number of results to return for a single query. The\n\t// server may further constrain the maximum number of results returned in a\n\t// single page. The value should be in the range [1, 1000]. If the value given\n\t// is outside this range, the server will decide the number of results to be\n\t// returned.\n\tPageSize int32 `protobuf:\"varint,4,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\t// Optional. The `next_page_token` from a previous call to\n\t// `ListSnoozesRequest` to get the next page of results.\n\tPageToken string `protobuf:\"bytes,5,opt,name=page_token,json=pageToken,proto3\" json:\"page_token,omitempty\"`\n}\n\nfunc (x *ListSnoozesRequest) Reset() {\n\t*x = ListSnoozesRequest{}\n\tmi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListSnoozesRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListSnoozesRequest) ProtoMessage() {}\n\nfunc (x *ListSnoozesRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListSnoozesRequest.ProtoReflect.Descriptor instead.\nfunc (*ListSnoozesRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_snooze_service_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *ListSnoozesRequest) GetParent() string {\n\tif x != nil {\n\t\treturn x.Parent\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListSnoozesRequest) GetFilter() string {\n\tif x != nil {\n\t\treturn x.Filter\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListSnoozesRequest) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListSnoozesRequest) GetPageToken() string {\n\tif x != nil {\n\t\treturn x.PageToken\n\t}\n\treturn \"\"\n}\n\n// The results of a successful `ListSnoozes` call, containing the matching\n// `Snooze`s.\ntype ListSnoozesResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// `Snooze`s matching this list call.\n\tSnoozes []*Snooze `protobuf:\"bytes,1,rep,name=snoozes,proto3\" json:\"snoozes,omitempty\"`\n\t// Page token for repeated calls to `ListSnoozes`, to fetch additional pages\n\t// of results. If this is empty or missing, there are no more pages.\n\tNextPageToken string `protobuf:\"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3\" json:\"next_page_token,omitempty\"`\n}\n\nfunc (x *ListSnoozesResponse) Reset() {\n\t*x = ListSnoozesResponse{}\n\tmi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[2]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListSnoozesResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListSnoozesResponse) ProtoMessage() {}\n\nfunc (x *ListSnoozesResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[2]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListSnoozesResponse.ProtoReflect.Descriptor instead.\nfunc (*ListSnoozesResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_snooze_service_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *ListSnoozesResponse) GetSnoozes() []*Snooze {\n\tif x != nil {\n\t\treturn x.Snoozes\n\t}\n\treturn nil\n}\n\nfunc (x *ListSnoozesResponse) GetNextPageToken() string {\n\tif x != nil {\n\t\treturn x.NextPageToken\n\t}\n\treturn \"\"\n}\n\n// The message definition for retrieving a `Snooze`. Users must specify the\n// field, `name`, which identifies the `Snooze`.\ntype GetSnoozeRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The ID of the `Snooze` to retrieve. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/snoozes/[SNOOZE_ID]\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *GetSnoozeRequest) Reset() {\n\t*x = GetSnoozeRequest{}\n\tmi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[3]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *GetSnoozeRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetSnoozeRequest) ProtoMessage() {}\n\nfunc (x *GetSnoozeRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[3]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetSnoozeRequest.ProtoReflect.Descriptor instead.\nfunc (*GetSnoozeRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_snooze_service_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *GetSnoozeRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\n// The message definition for updating a `Snooze`. The field, `snooze.name`\n// identifies the `Snooze` to be updated. The remainder of `snooze` gives the\n// content the `Snooze` in question will be assigned.\n//\n// What fields can be updated depends on the start time and end time of the\n// `Snooze`.\n//\n//   - end time is in the past: These `Snooze`s are considered\n//     read-only and cannot be updated.\n//   - start time is in the past and end time is in the future: `display_name`\n//     and `interval.end_time` can be updated.\n//   - start time is in the future: `display_name`, `interval.start_time` and\n//     `interval.end_time` can be updated.\ntype UpdateSnoozeRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The `Snooze` to update. Must have the name field present.\n\tSnooze *Snooze `protobuf:\"bytes,1,opt,name=snooze,proto3\" json:\"snooze,omitempty\"`\n\t// Required. The fields to update.\n\t//\n\t// For each field listed in `update_mask`:\n\t//\n\t//   - If the `Snooze` object supplied in the `UpdateSnoozeRequest` has a\n\t//     value for that field, the value of the field in the existing `Snooze`\n\t//     will be set to the value of the field in the supplied `Snooze`.\n\t//   - If the field does not have a value in the supplied `Snooze`, the field\n\t//     in the existing `Snooze` is set to its default value.\n\t//\n\t// Fields not listed retain their existing value.\n\t//\n\t// The following are the field names that are accepted in `update_mask`:\n\t//\n\t//   - `display_name`\n\t//   - `interval.start_time`\n\t//   - `interval.end_time`\n\t//\n\t// That said, the start time and end time of the `Snooze` determines which\n\t// fields can legally be updated. Before attempting an update, users should\n\t// consult the documentation for `UpdateSnoozeRequest`, which talks about\n\t// which fields can be updated.\n\tUpdateMask *fieldmaskpb.FieldMask `protobuf:\"bytes,2,opt,name=update_mask,json=updateMask,proto3\" json:\"update_mask,omitempty\"`\n}\n\nfunc (x *UpdateSnoozeRequest) Reset() {\n\t*x = UpdateSnoozeRequest{}\n\tmi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[4]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UpdateSnoozeRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateSnoozeRequest) ProtoMessage() {}\n\nfunc (x *UpdateSnoozeRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[4]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateSnoozeRequest.ProtoReflect.Descriptor instead.\nfunc (*UpdateSnoozeRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_snooze_service_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *UpdateSnoozeRequest) GetSnooze() *Snooze {\n\tif x != nil {\n\t\treturn x.Snooze\n\t}\n\treturn nil\n}\n\nfunc (x *UpdateSnoozeRequest) GetUpdateMask() *fieldmaskpb.FieldMask {\n\tif x != nil {\n\t\treturn x.UpdateMask\n\t}\n\treturn nil\n}\n\nvar File_google_monitoring_v3_snooze_service_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_snooze_service_proto_rawDesc = []byte{\n\t0x0a, 0x29, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x5f, 0x73, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e,\n\t0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65,\n\t0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76,\n\t0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x6e, 0x6f, 0x6f, 0x7a,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d,\n\t0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x92, 0x01, 0x0a, 0x13, 0x43, 0x72,\n\t0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x40, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x22, 0x12, 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72,\n\t0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6e, 0x6f, 0x6f, 0x7a,\n\t0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x22, 0xb9,\n\t0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x22, 0x12, 0x20, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x52,\n\t0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65,\n\t0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x66, 0x69,\n\t0x6c, 0x74, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a,\n\t0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, 0x61,\n\t0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74,\n\t0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,\n\t0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x75, 0x0a, 0x13, 0x4c, 0x69,\n\t0x73, 0x74, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,\n\t0x65, 0x12, 0x36, 0x0a, 0x07, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03,\n\t0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65,\n\t0x52, 0x07, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78,\n\t0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65,\n\t0x6e, 0x22, 0x50, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x22, 0x0a, 0x20, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70,\n\t0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e,\n\t0x6f, 0x6f, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x73,\n\t0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06,\n\t0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,\n\t0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x75, 0x70,\n\t0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x32, 0x98, 0x06, 0x0a, 0x0d, 0x53, 0x6e, 0x6f,\n\t0x6f, 0x7a, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x98, 0x01, 0x0a, 0x0c, 0x43,\n\t0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x12, 0x29, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6e,\n\t0x6f, 0x6f, 0x7a, 0x65, 0x22, 0x3f, 0xda, 0x41, 0x0d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c,\n\t0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x06, 0x73, 0x6e,\n\t0x6f, 0x6f, 0x7a, 0x65, 0x22, 0x1f, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e,\n\t0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x73, 0x6e,\n\t0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e,\n\t0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73,\n\t0x74, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,\n\t0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x6f, 0x6f, 0x7a,\n\t0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0xda, 0x41, 0x06, 0x70,\n\t0x61, 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x33,\n\t0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,\n\t0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x12, 0x81, 0x01, 0x0a,\n\t0x09, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65,\n\t0x22, 0x2e, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12,\n\t0x1f, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65,\n\t0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x2f, 0x2a, 0x7d,\n\t0x12, 0xa4, 0x01, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x6f, 0x6f, 0x7a,\n\t0x65, 0x12, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53,\n\t0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x22, 0x4b, 0xda, 0x41, 0x12, 0x73,\n\t0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73,\n\t0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x3a, 0x06, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x32,\n\t0x26, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x2e, 0x6e, 0x61, 0x6d,\n\t0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x6e, 0x6f,\n\t0x6f, 0x7a, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x1a, 0xa9, 0x01, 0xca, 0x41, 0x19, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70,\n\t0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x89, 0x01, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a,\n\t0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d,\n\t0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f,\n\t0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61,\n\t0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72,\n\t0x65, 0x61, 0x64, 0x42, 0xcd, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33,\n\t0x42, 0x12, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50,\n\t0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c,\n\t0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c,\n\t0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a,\n\t0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_monitoring_v3_snooze_service_proto_rawDescOnce sync.Once\n\tfile_google_monitoring_v3_snooze_service_proto_rawDescData = file_google_monitoring_v3_snooze_service_proto_rawDesc\n)\n\nfunc file_google_monitoring_v3_snooze_service_proto_rawDescGZIP() []byte {\n\tfile_google_monitoring_v3_snooze_service_proto_rawDescOnce.Do(func() {\n\t\tfile_google_monitoring_v3_snooze_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_snooze_service_proto_rawDescData)\n\t})\n\treturn file_google_monitoring_v3_snooze_service_proto_rawDescData\n}\n\nvar file_google_monitoring_v3_snooze_service_proto_msgTypes = make([]protoimpl.MessageInfo, 5)\nvar file_google_monitoring_v3_snooze_service_proto_goTypes = []any{\n\t(*CreateSnoozeRequest)(nil),   // 0: google.monitoring.v3.CreateSnoozeRequest\n\t(*ListSnoozesRequest)(nil),    // 1: google.monitoring.v3.ListSnoozesRequest\n\t(*ListSnoozesResponse)(nil),   // 2: google.monitoring.v3.ListSnoozesResponse\n\t(*GetSnoozeRequest)(nil),      // 3: google.monitoring.v3.GetSnoozeRequest\n\t(*UpdateSnoozeRequest)(nil),   // 4: google.monitoring.v3.UpdateSnoozeRequest\n\t(*Snooze)(nil),                // 5: google.monitoring.v3.Snooze\n\t(*fieldmaskpb.FieldMask)(nil), // 6: google.protobuf.FieldMask\n}\nvar file_google_monitoring_v3_snooze_service_proto_depIdxs = []int32{\n\t5, // 0: google.monitoring.v3.CreateSnoozeRequest.snooze:type_name -> google.monitoring.v3.Snooze\n\t5, // 1: google.monitoring.v3.ListSnoozesResponse.snoozes:type_name -> google.monitoring.v3.Snooze\n\t5, // 2: google.monitoring.v3.UpdateSnoozeRequest.snooze:type_name -> google.monitoring.v3.Snooze\n\t6, // 3: google.monitoring.v3.UpdateSnoozeRequest.update_mask:type_name -> google.protobuf.FieldMask\n\t0, // 4: google.monitoring.v3.SnoozeService.CreateSnooze:input_type -> google.monitoring.v3.CreateSnoozeRequest\n\t1, // 5: google.monitoring.v3.SnoozeService.ListSnoozes:input_type -> google.monitoring.v3.ListSnoozesRequest\n\t3, // 6: google.monitoring.v3.SnoozeService.GetSnooze:input_type -> google.monitoring.v3.GetSnoozeRequest\n\t4, // 7: google.monitoring.v3.SnoozeService.UpdateSnooze:input_type -> google.monitoring.v3.UpdateSnoozeRequest\n\t5, // 8: google.monitoring.v3.SnoozeService.CreateSnooze:output_type -> google.monitoring.v3.Snooze\n\t2, // 9: google.monitoring.v3.SnoozeService.ListSnoozes:output_type -> google.monitoring.v3.ListSnoozesResponse\n\t5, // 10: google.monitoring.v3.SnoozeService.GetSnooze:output_type -> google.monitoring.v3.Snooze\n\t5, // 11: google.monitoring.v3.SnoozeService.UpdateSnooze:output_type -> google.monitoring.v3.Snooze\n\t8, // [8:12] is the sub-list for method output_type\n\t4, // [4:8] is the sub-list for method input_type\n\t4, // [4:4] is the sub-list for extension type_name\n\t4, // [4:4] is the sub-list for extension extendee\n\t0, // [0:4] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_snooze_service_proto_init() }\nfunc file_google_monitoring_v3_snooze_service_proto_init() {\n\tif File_google_monitoring_v3_snooze_service_proto != nil {\n\t\treturn\n\t}\n\tfile_google_monitoring_v3_snooze_proto_init()\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_snooze_service_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   5,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_snooze_service_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_snooze_service_proto_depIdxs,\n\t\tMessageInfos:      file_google_monitoring_v3_snooze_service_proto_msgTypes,\n\t}.Build()\n\tFile_google_monitoring_v3_snooze_service_proto = out.File\n\tfile_google_monitoring_v3_snooze_service_proto_rawDesc = nil\n\tfile_google_monitoring_v3_snooze_service_proto_goTypes = nil\n\tfile_google_monitoring_v3_snooze_service_proto_depIdxs = nil\n}\n\n// Reference imports to suppress errors if they are not otherwise used.\nvar _ context.Context\nvar _ grpc.ClientConnInterface\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\nconst _ = grpc.SupportPackageIsVersion6\n\n// SnoozeServiceClient is the client API for SnoozeService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.\ntype SnoozeServiceClient interface {\n\t// Creates a `Snooze` that will prevent alerts, which match the provided\n\t// criteria, from being opened. The `Snooze` applies for a specific time\n\t// interval.\n\tCreateSnooze(ctx context.Context, in *CreateSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error)\n\t// Lists the `Snooze`s associated with a project. Can optionally pass in\n\t// `filter`, which specifies predicates to match `Snooze`s.\n\tListSnoozes(ctx context.Context, in *ListSnoozesRequest, opts ...grpc.CallOption) (*ListSnoozesResponse, error)\n\t// Retrieves a `Snooze` by `name`.\n\tGetSnooze(ctx context.Context, in *GetSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error)\n\t// Updates a `Snooze`, identified by its `name`, with the parameters in the\n\t// given `Snooze` object.\n\tUpdateSnooze(ctx context.Context, in *UpdateSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error)\n}\n\ntype snoozeServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewSnoozeServiceClient(cc grpc.ClientConnInterface) SnoozeServiceClient {\n\treturn &snoozeServiceClient{cc}\n}\n\nfunc (c *snoozeServiceClient) CreateSnooze(ctx context.Context, in *CreateSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) {\n\tout := new(Snooze)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.SnoozeService/CreateSnooze\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *snoozeServiceClient) ListSnoozes(ctx context.Context, in *ListSnoozesRequest, opts ...grpc.CallOption) (*ListSnoozesResponse, error) {\n\tout := new(ListSnoozesResponse)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.SnoozeService/ListSnoozes\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *snoozeServiceClient) GetSnooze(ctx context.Context, in *GetSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) {\n\tout := new(Snooze)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.SnoozeService/GetSnooze\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *snoozeServiceClient) UpdateSnooze(ctx context.Context, in *UpdateSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) {\n\tout := new(Snooze)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.SnoozeService/UpdateSnooze\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// SnoozeServiceServer is the server API for SnoozeService service.\ntype SnoozeServiceServer interface {\n\t// Creates a `Snooze` that will prevent alerts, which match the provided\n\t// criteria, from being opened. The `Snooze` applies for a specific time\n\t// interval.\n\tCreateSnooze(context.Context, *CreateSnoozeRequest) (*Snooze, error)\n\t// Lists the `Snooze`s associated with a project. Can optionally pass in\n\t// `filter`, which specifies predicates to match `Snooze`s.\n\tListSnoozes(context.Context, *ListSnoozesRequest) (*ListSnoozesResponse, error)\n\t// Retrieves a `Snooze` by `name`.\n\tGetSnooze(context.Context, *GetSnoozeRequest) (*Snooze, error)\n\t// Updates a `Snooze`, identified by its `name`, with the parameters in the\n\t// given `Snooze` object.\n\tUpdateSnooze(context.Context, *UpdateSnoozeRequest) (*Snooze, error)\n}\n\n// UnimplementedSnoozeServiceServer can be embedded to have forward compatible implementations.\ntype UnimplementedSnoozeServiceServer struct {\n}\n\nfunc (*UnimplementedSnoozeServiceServer) CreateSnooze(context.Context, *CreateSnoozeRequest) (*Snooze, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateSnooze not implemented\")\n}\nfunc (*UnimplementedSnoozeServiceServer) ListSnoozes(context.Context, *ListSnoozesRequest) (*ListSnoozesResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListSnoozes not implemented\")\n}\nfunc (*UnimplementedSnoozeServiceServer) GetSnooze(context.Context, *GetSnoozeRequest) (*Snooze, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetSnooze not implemented\")\n}\nfunc (*UnimplementedSnoozeServiceServer) UpdateSnooze(context.Context, *UpdateSnoozeRequest) (*Snooze, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateSnooze not implemented\")\n}\n\nfunc RegisterSnoozeServiceServer(s *grpc.Server, srv SnoozeServiceServer) {\n\ts.RegisterService(&_SnoozeService_serviceDesc, srv)\n}\n\nfunc _SnoozeService_CreateSnooze_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateSnoozeRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(SnoozeServiceServer).CreateSnooze(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.SnoozeService/CreateSnooze\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(SnoozeServiceServer).CreateSnooze(ctx, req.(*CreateSnoozeRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _SnoozeService_ListSnoozes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListSnoozesRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(SnoozeServiceServer).ListSnoozes(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.SnoozeService/ListSnoozes\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(SnoozeServiceServer).ListSnoozes(ctx, req.(*ListSnoozesRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _SnoozeService_GetSnooze_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetSnoozeRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(SnoozeServiceServer).GetSnooze(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.SnoozeService/GetSnooze\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(SnoozeServiceServer).GetSnooze(ctx, req.(*GetSnoozeRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _SnoozeService_UpdateSnooze_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateSnoozeRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(SnoozeServiceServer).UpdateSnooze(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.SnoozeService/UpdateSnooze\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(SnoozeServiceServer).UpdateSnooze(ctx, req.(*UpdateSnoozeRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nvar _SnoozeService_serviceDesc = grpc.ServiceDesc{\n\tServiceName: \"google.monitoring.v3.SnoozeService\",\n\tHandlerType: (*SnoozeServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"CreateSnooze\",\n\t\t\tHandler:    _SnoozeService_CreateSnooze_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListSnoozes\",\n\t\t\tHandler:    _SnoozeService_ListSnoozes_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetSnooze\",\n\t\t\tHandler:    _SnoozeService_GetSnooze_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateSnooze\",\n\t\t\tHandler:    _SnoozeService_UpdateSnooze_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"google/monitoring/v3/snooze_service.proto\",\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/span_context.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/span_context.proto\n\npackage monitoringpb\n\nimport (\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// The context of a span. This is attached to an\n// [Exemplar][google.api.Distribution.Exemplar]\n// in [Distribution][google.api.Distribution] values during aggregation.\n//\n// It contains the name of a span with format:\n//\n//\tprojects/[PROJECT_ID_OR_NUMBER]/traces/[TRACE_ID]/spans/[SPAN_ID]\ntype SpanContext struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The resource name of the span. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/traces/[TRACE_ID]/spans/[SPAN_ID]\n\t//\n\t// `[TRACE_ID]` is a unique identifier for a trace within a project;\n\t// it is a 32-character hexadecimal encoding of a 16-byte array.\n\t//\n\t// `[SPAN_ID]` is a unique identifier for a span within a trace; it\n\t// is a 16-character hexadecimal encoding of an 8-byte array.\n\tSpanName string `protobuf:\"bytes,1,opt,name=span_name,json=spanName,proto3\" json:\"span_name,omitempty\"`\n}\n\nfunc (x *SpanContext) Reset() {\n\t*x = SpanContext{}\n\tmi := &file_google_monitoring_v3_span_context_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *SpanContext) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SpanContext) ProtoMessage() {}\n\nfunc (x *SpanContext) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_span_context_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SpanContext.ProtoReflect.Descriptor instead.\nfunc (*SpanContext) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_span_context_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *SpanContext) GetSpanName() string {\n\tif x != nil {\n\t\treturn x.SpanName\n\t}\n\treturn \"\"\n}\n\nvar File_google_monitoring_v3_span_context_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_span_context_proto_rawDesc = []byte{\n\t0x0a, 0x27, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74,\n\t0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x22,\n\t0x2a, 0x0a, 0x0b, 0x53, 0x70, 0x61, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1b,\n\t0x0a, 0x09, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x08, 0x73, 0x70, 0x61, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0xcb, 0x01, 0x0a, 0x18,\n\t0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x10, 0x53, 0x70, 0x61, 0x6e, 0x43, 0x6f,\n\t0x6e, 0x74, 0x65, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c,\n\t0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67,\n\t0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69,\n\t0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa,\n\t0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x33,\n}\n\nvar (\n\tfile_google_monitoring_v3_span_context_proto_rawDescOnce sync.Once\n\tfile_google_monitoring_v3_span_context_proto_rawDescData = file_google_monitoring_v3_span_context_proto_rawDesc\n)\n\nfunc file_google_monitoring_v3_span_context_proto_rawDescGZIP() []byte {\n\tfile_google_monitoring_v3_span_context_proto_rawDescOnce.Do(func() {\n\t\tfile_google_monitoring_v3_span_context_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_span_context_proto_rawDescData)\n\t})\n\treturn file_google_monitoring_v3_span_context_proto_rawDescData\n}\n\nvar file_google_monitoring_v3_span_context_proto_msgTypes = make([]protoimpl.MessageInfo, 1)\nvar file_google_monitoring_v3_span_context_proto_goTypes = []any{\n\t(*SpanContext)(nil), // 0: google.monitoring.v3.SpanContext\n}\nvar file_google_monitoring_v3_span_context_proto_depIdxs = []int32{\n\t0, // [0:0] is the sub-list for method output_type\n\t0, // [0:0] is the sub-list for method input_type\n\t0, // [0:0] is the sub-list for extension type_name\n\t0, // [0:0] is the sub-list for extension extendee\n\t0, // [0:0] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_span_context_proto_init() }\nfunc file_google_monitoring_v3_span_context_proto_init() {\n\tif File_google_monitoring_v3_span_context_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_span_context_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   1,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_span_context_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_span_context_proto_depIdxs,\n\t\tMessageInfos:      file_google_monitoring_v3_span_context_proto_msgTypes,\n\t}.Build()\n\tFile_google_monitoring_v3_span_context_proto = out.File\n\tfile_google_monitoring_v3_span_context_proto_rawDesc = nil\n\tfile_google_monitoring_v3_span_context_proto_goTypes = nil\n\tfile_google_monitoring_v3_span_context_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/uptime.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/uptime.proto\n\npackage monitoringpb\n\nimport (\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tmonitoredres \"google.golang.org/genproto/googleapis/api/monitoredres\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdurationpb \"google.golang.org/protobuf/types/known/durationpb\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// The regions from which an Uptime check can be run.\ntype UptimeCheckRegion int32\n\nconst (\n\t// Default value if no region is specified. Will result in Uptime checks\n\t// running from all regions.\n\tUptimeCheckRegion_REGION_UNSPECIFIED UptimeCheckRegion = 0\n\t// Allows checks to run from locations within the United States of America.\n\tUptimeCheckRegion_USA UptimeCheckRegion = 1\n\t// Allows checks to run from locations within the continent of Europe.\n\tUptimeCheckRegion_EUROPE UptimeCheckRegion = 2\n\t// Allows checks to run from locations within the continent of South\n\t// America.\n\tUptimeCheckRegion_SOUTH_AMERICA UptimeCheckRegion = 3\n\t// Allows checks to run from locations within the Asia Pacific area (ex:\n\t// Singapore).\n\tUptimeCheckRegion_ASIA_PACIFIC UptimeCheckRegion = 4\n\t// Allows checks to run from locations within the western United States of\n\t// America\n\tUptimeCheckRegion_USA_OREGON UptimeCheckRegion = 5\n\t// Allows checks to run from locations within the central United States of\n\t// America\n\tUptimeCheckRegion_USA_IOWA UptimeCheckRegion = 6\n\t// Allows checks to run from locations within the eastern United States of\n\t// America\n\tUptimeCheckRegion_USA_VIRGINIA UptimeCheckRegion = 7\n)\n\n// Enum value maps for UptimeCheckRegion.\nvar (\n\tUptimeCheckRegion_name = map[int32]string{\n\t\t0: \"REGION_UNSPECIFIED\",\n\t\t1: \"USA\",\n\t\t2: \"EUROPE\",\n\t\t3: \"SOUTH_AMERICA\",\n\t\t4: \"ASIA_PACIFIC\",\n\t\t5: \"USA_OREGON\",\n\t\t6: \"USA_IOWA\",\n\t\t7: \"USA_VIRGINIA\",\n\t}\n\tUptimeCheckRegion_value = map[string]int32{\n\t\t\"REGION_UNSPECIFIED\": 0,\n\t\t\"USA\":                1,\n\t\t\"EUROPE\":             2,\n\t\t\"SOUTH_AMERICA\":      3,\n\t\t\"ASIA_PACIFIC\":       4,\n\t\t\"USA_OREGON\":         5,\n\t\t\"USA_IOWA\":           6,\n\t\t\"USA_VIRGINIA\":       7,\n\t}\n)\n\nfunc (x UptimeCheckRegion) Enum() *UptimeCheckRegion {\n\tp := new(UptimeCheckRegion)\n\t*p = x\n\treturn p\n}\n\nfunc (x UptimeCheckRegion) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (UptimeCheckRegion) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_uptime_proto_enumTypes[0].Descriptor()\n}\n\nfunc (UptimeCheckRegion) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_uptime_proto_enumTypes[0]\n}\n\nfunc (x UptimeCheckRegion) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use UptimeCheckRegion.Descriptor instead.\nfunc (UptimeCheckRegion) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{0}\n}\n\n// The supported resource types that can be used as values of\n// `group_resource.resource_type`.\n// `INSTANCE` includes `gce_instance` and `aws_ec2_instance` resource types.\n// The resource types `gae_app` and `uptime_url` are not valid here because\n// group checks on App Engine modules and URLs are not allowed.\ntype GroupResourceType int32\n\nconst (\n\t// Default value (not valid).\n\tGroupResourceType_RESOURCE_TYPE_UNSPECIFIED GroupResourceType = 0\n\t// A group of instances from Google Cloud Platform (GCP) or\n\t// Amazon Web Services (AWS).\n\tGroupResourceType_INSTANCE GroupResourceType = 1\n\t// A group of Amazon ELB load balancers.\n\tGroupResourceType_AWS_ELB_LOAD_BALANCER GroupResourceType = 2\n)\n\n// Enum value maps for GroupResourceType.\nvar (\n\tGroupResourceType_name = map[int32]string{\n\t\t0: \"RESOURCE_TYPE_UNSPECIFIED\",\n\t\t1: \"INSTANCE\",\n\t\t2: \"AWS_ELB_LOAD_BALANCER\",\n\t}\n\tGroupResourceType_value = map[string]int32{\n\t\t\"RESOURCE_TYPE_UNSPECIFIED\": 0,\n\t\t\"INSTANCE\":                  1,\n\t\t\"AWS_ELB_LOAD_BALANCER\":     2,\n\t}\n)\n\nfunc (x GroupResourceType) Enum() *GroupResourceType {\n\tp := new(GroupResourceType)\n\t*p = x\n\treturn p\n}\n\nfunc (x GroupResourceType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (GroupResourceType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_uptime_proto_enumTypes[1].Descriptor()\n}\n\nfunc (GroupResourceType) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_uptime_proto_enumTypes[1]\n}\n\nfunc (x GroupResourceType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use GroupResourceType.Descriptor instead.\nfunc (GroupResourceType) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{1}\n}\n\n// Operational states for an internal checker.\ntype InternalChecker_State int32\n\nconst (\n\t// An internal checker should never be in the unspecified state.\n\tInternalChecker_UNSPECIFIED InternalChecker_State = 0\n\t// The checker is being created, provisioned, and configured. A checker in\n\t// this state can be returned by `ListInternalCheckers` or\n\t// `GetInternalChecker`, as well as by examining the [long running\n\t// Operation](https://cloud.google.com/apis/design/design_patterns#long_running_operations)\n\t// that created it.\n\tInternalChecker_CREATING InternalChecker_State = 1\n\t// The checker is running and available for use. A checker in this state\n\t// can be returned by `ListInternalCheckers` or `GetInternalChecker` as\n\t// well as by examining the [long running\n\t// Operation](https://cloud.google.com/apis/design/design_patterns#long_running_operations)\n\t// that created it.\n\t// If a checker is being torn down, it is neither visible nor usable, so\n\t// there is no \"deleting\" or \"down\" state.\n\tInternalChecker_RUNNING InternalChecker_State = 2\n)\n\n// Enum value maps for InternalChecker_State.\nvar (\n\tInternalChecker_State_name = map[int32]string{\n\t\t0: \"UNSPECIFIED\",\n\t\t1: \"CREATING\",\n\t\t2: \"RUNNING\",\n\t}\n\tInternalChecker_State_value = map[string]int32{\n\t\t\"UNSPECIFIED\": 0,\n\t\t\"CREATING\":    1,\n\t\t\"RUNNING\":     2,\n\t}\n)\n\nfunc (x InternalChecker_State) Enum() *InternalChecker_State {\n\tp := new(InternalChecker_State)\n\t*p = x\n\treturn p\n}\n\nfunc (x InternalChecker_State) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (InternalChecker_State) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_uptime_proto_enumTypes[2].Descriptor()\n}\n\nfunc (InternalChecker_State) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_uptime_proto_enumTypes[2]\n}\n\nfunc (x InternalChecker_State) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use InternalChecker_State.Descriptor instead.\nfunc (InternalChecker_State) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{0, 0}\n}\n\n// What kind of checkers are available to be used by the check.\ntype UptimeCheckConfig_CheckerType int32\n\nconst (\n\t// The default checker type. Currently converted to `STATIC_IP_CHECKERS`\n\t// on creation, the default conversion behavior may change in the future.\n\tUptimeCheckConfig_CHECKER_TYPE_UNSPECIFIED UptimeCheckConfig_CheckerType = 0\n\t// `STATIC_IP_CHECKERS` are used for uptime checks that perform egress\n\t// across the public internet. `STATIC_IP_CHECKERS` use the static IP\n\t// addresses returned by `ListUptimeCheckIps`.\n\tUptimeCheckConfig_STATIC_IP_CHECKERS UptimeCheckConfig_CheckerType = 1\n\t// `VPC_CHECKERS` are used for uptime checks that perform egress using\n\t// Service Directory and private network access. When using `VPC_CHECKERS`,\n\t// the monitored resource type must be `servicedirectory_service`.\n\tUptimeCheckConfig_VPC_CHECKERS UptimeCheckConfig_CheckerType = 3\n)\n\n// Enum value maps for UptimeCheckConfig_CheckerType.\nvar (\n\tUptimeCheckConfig_CheckerType_name = map[int32]string{\n\t\t0: \"CHECKER_TYPE_UNSPECIFIED\",\n\t\t1: \"STATIC_IP_CHECKERS\",\n\t\t3: \"VPC_CHECKERS\",\n\t}\n\tUptimeCheckConfig_CheckerType_value = map[string]int32{\n\t\t\"CHECKER_TYPE_UNSPECIFIED\": 0,\n\t\t\"STATIC_IP_CHECKERS\":       1,\n\t\t\"VPC_CHECKERS\":             3,\n\t}\n)\n\nfunc (x UptimeCheckConfig_CheckerType) Enum() *UptimeCheckConfig_CheckerType {\n\tp := new(UptimeCheckConfig_CheckerType)\n\t*p = x\n\treturn p\n}\n\nfunc (x UptimeCheckConfig_CheckerType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (UptimeCheckConfig_CheckerType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_uptime_proto_enumTypes[3].Descriptor()\n}\n\nfunc (UptimeCheckConfig_CheckerType) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_uptime_proto_enumTypes[3]\n}\n\nfunc (x UptimeCheckConfig_CheckerType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use UptimeCheckConfig_CheckerType.Descriptor instead.\nfunc (UptimeCheckConfig_CheckerType) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 0}\n}\n\n// The HTTP request method options.\ntype UptimeCheckConfig_HttpCheck_RequestMethod int32\n\nconst (\n\t// No request method specified.\n\tUptimeCheckConfig_HttpCheck_METHOD_UNSPECIFIED UptimeCheckConfig_HttpCheck_RequestMethod = 0\n\t// GET request.\n\tUptimeCheckConfig_HttpCheck_GET UptimeCheckConfig_HttpCheck_RequestMethod = 1\n\t// POST request.\n\tUptimeCheckConfig_HttpCheck_POST UptimeCheckConfig_HttpCheck_RequestMethod = 2\n)\n\n// Enum value maps for UptimeCheckConfig_HttpCheck_RequestMethod.\nvar (\n\tUptimeCheckConfig_HttpCheck_RequestMethod_name = map[int32]string{\n\t\t0: \"METHOD_UNSPECIFIED\",\n\t\t1: \"GET\",\n\t\t2: \"POST\",\n\t}\n\tUptimeCheckConfig_HttpCheck_RequestMethod_value = map[string]int32{\n\t\t\"METHOD_UNSPECIFIED\": 0,\n\t\t\"GET\":                1,\n\t\t\"POST\":               2,\n\t}\n)\n\nfunc (x UptimeCheckConfig_HttpCheck_RequestMethod) Enum() *UptimeCheckConfig_HttpCheck_RequestMethod {\n\tp := new(UptimeCheckConfig_HttpCheck_RequestMethod)\n\t*p = x\n\treturn p\n}\n\nfunc (x UptimeCheckConfig_HttpCheck_RequestMethod) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (UptimeCheckConfig_HttpCheck_RequestMethod) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_uptime_proto_enumTypes[4].Descriptor()\n}\n\nfunc (UptimeCheckConfig_HttpCheck_RequestMethod) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_uptime_proto_enumTypes[4]\n}\n\nfunc (x UptimeCheckConfig_HttpCheck_RequestMethod) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use UptimeCheckConfig_HttpCheck_RequestMethod.Descriptor instead.\nfunc (UptimeCheckConfig_HttpCheck_RequestMethod) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 2, 0}\n}\n\n// Header options corresponding to the content type of a HTTP request body.\ntype UptimeCheckConfig_HttpCheck_ContentType int32\n\nconst (\n\t// No content type specified.\n\tUptimeCheckConfig_HttpCheck_TYPE_UNSPECIFIED UptimeCheckConfig_HttpCheck_ContentType = 0\n\t// `body` is in URL-encoded form. Equivalent to setting the `Content-Type`\n\t// to `application/x-www-form-urlencoded` in the HTTP request.\n\tUptimeCheckConfig_HttpCheck_URL_ENCODED UptimeCheckConfig_HttpCheck_ContentType = 1\n\t// `body` is in `custom_content_type` form. Equivalent to setting the\n\t// `Content-Type` to the contents of `custom_content_type` in the HTTP\n\t// request.\n\tUptimeCheckConfig_HttpCheck_USER_PROVIDED UptimeCheckConfig_HttpCheck_ContentType = 2\n)\n\n// Enum value maps for UptimeCheckConfig_HttpCheck_ContentType.\nvar (\n\tUptimeCheckConfig_HttpCheck_ContentType_name = map[int32]string{\n\t\t0: \"TYPE_UNSPECIFIED\",\n\t\t1: \"URL_ENCODED\",\n\t\t2: \"USER_PROVIDED\",\n\t}\n\tUptimeCheckConfig_HttpCheck_ContentType_value = map[string]int32{\n\t\t\"TYPE_UNSPECIFIED\": 0,\n\t\t\"URL_ENCODED\":      1,\n\t\t\"USER_PROVIDED\":    2,\n\t}\n)\n\nfunc (x UptimeCheckConfig_HttpCheck_ContentType) Enum() *UptimeCheckConfig_HttpCheck_ContentType {\n\tp := new(UptimeCheckConfig_HttpCheck_ContentType)\n\t*p = x\n\treturn p\n}\n\nfunc (x UptimeCheckConfig_HttpCheck_ContentType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (UptimeCheckConfig_HttpCheck_ContentType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_uptime_proto_enumTypes[5].Descriptor()\n}\n\nfunc (UptimeCheckConfig_HttpCheck_ContentType) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_uptime_proto_enumTypes[5]\n}\n\nfunc (x UptimeCheckConfig_HttpCheck_ContentType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use UptimeCheckConfig_HttpCheck_ContentType.Descriptor instead.\nfunc (UptimeCheckConfig_HttpCheck_ContentType) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 2, 1}\n}\n\n// An HTTP status code class.\ntype UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass int32\n\nconst (\n\t// Default value that matches no status codes.\n\tUptimeCheckConfig_HttpCheck_ResponseStatusCode_STATUS_CLASS_UNSPECIFIED UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass = 0\n\t// The class of status codes between 100 and 199.\n\tUptimeCheckConfig_HttpCheck_ResponseStatusCode_STATUS_CLASS_1XX UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass = 100\n\t// The class of status codes between 200 and 299.\n\tUptimeCheckConfig_HttpCheck_ResponseStatusCode_STATUS_CLASS_2XX UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass = 200\n\t// The class of status codes between 300 and 399.\n\tUptimeCheckConfig_HttpCheck_ResponseStatusCode_STATUS_CLASS_3XX UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass = 300\n\t// The class of status codes between 400 and 499.\n\tUptimeCheckConfig_HttpCheck_ResponseStatusCode_STATUS_CLASS_4XX UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass = 400\n\t// The class of status codes between 500 and 599.\n\tUptimeCheckConfig_HttpCheck_ResponseStatusCode_STATUS_CLASS_5XX UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass = 500\n\t// The class of all status codes.\n\tUptimeCheckConfig_HttpCheck_ResponseStatusCode_STATUS_CLASS_ANY UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass = 1000\n)\n\n// Enum value maps for UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass.\nvar (\n\tUptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass_name = map[int32]string{\n\t\t0:    \"STATUS_CLASS_UNSPECIFIED\",\n\t\t100:  \"STATUS_CLASS_1XX\",\n\t\t200:  \"STATUS_CLASS_2XX\",\n\t\t300:  \"STATUS_CLASS_3XX\",\n\t\t400:  \"STATUS_CLASS_4XX\",\n\t\t500:  \"STATUS_CLASS_5XX\",\n\t\t1000: \"STATUS_CLASS_ANY\",\n\t}\n\tUptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass_value = map[string]int32{\n\t\t\"STATUS_CLASS_UNSPECIFIED\": 0,\n\t\t\"STATUS_CLASS_1XX\":         100,\n\t\t\"STATUS_CLASS_2XX\":         200,\n\t\t\"STATUS_CLASS_3XX\":         300,\n\t\t\"STATUS_CLASS_4XX\":         400,\n\t\t\"STATUS_CLASS_5XX\":         500,\n\t\t\"STATUS_CLASS_ANY\":         1000,\n\t}\n)\n\nfunc (x UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass) Enum() *UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass {\n\tp := new(UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass)\n\t*p = x\n\treturn p\n}\n\nfunc (x UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_uptime_proto_enumTypes[6].Descriptor()\n}\n\nfunc (UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_uptime_proto_enumTypes[6]\n}\n\nfunc (x UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass.Descriptor instead.\nfunc (UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 2, 1, 0}\n}\n\n// Type of authentication.\ntype UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType int32\n\nconst (\n\t// Default value, will result in OIDC Authentication.\n\tUptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_SERVICE_AGENT_AUTHENTICATION_TYPE_UNSPECIFIED UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType = 0\n\t// OIDC Authentication\n\tUptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_OIDC_TOKEN UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType = 1\n)\n\n// Enum value maps for UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType.\nvar (\n\tUptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType_name = map[int32]string{\n\t\t0: \"SERVICE_AGENT_AUTHENTICATION_TYPE_UNSPECIFIED\",\n\t\t1: \"OIDC_TOKEN\",\n\t}\n\tUptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType_value = map[string]int32{\n\t\t\"SERVICE_AGENT_AUTHENTICATION_TYPE_UNSPECIFIED\": 0,\n\t\t\"OIDC_TOKEN\": 1,\n\t}\n)\n\nfunc (x UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType) Enum() *UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType {\n\tp := new(UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType)\n\t*p = x\n\treturn p\n}\n\nfunc (x UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_uptime_proto_enumTypes[7].Descriptor()\n}\n\nfunc (UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_uptime_proto_enumTypes[7]\n}\n\nfunc (x UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType.Descriptor instead.\nfunc (UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 2, 2, 0}\n}\n\n// Options to perform content matching.\ntype UptimeCheckConfig_ContentMatcher_ContentMatcherOption int32\n\nconst (\n\t// No content matcher type specified (maintained for backward\n\t// compatibility, but deprecated for future use).\n\t// Treated as `CONTAINS_STRING`.\n\tUptimeCheckConfig_ContentMatcher_CONTENT_MATCHER_OPTION_UNSPECIFIED UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 0\n\t// Selects substring matching. The match succeeds if the output contains\n\t// the `content` string.  This is the default value for checks without\n\t// a `matcher` option, or where the value of `matcher` is\n\t// `CONTENT_MATCHER_OPTION_UNSPECIFIED`.\n\tUptimeCheckConfig_ContentMatcher_CONTAINS_STRING UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 1\n\t// Selects negation of substring matching. The match succeeds if the\n\t// output does _NOT_ contain the `content` string.\n\tUptimeCheckConfig_ContentMatcher_NOT_CONTAINS_STRING UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 2\n\t// Selects regular-expression matching. The match succeeds if the output\n\t// matches the regular expression specified in the `content` string.\n\t// Regex matching is only supported for HTTP/HTTPS checks.\n\tUptimeCheckConfig_ContentMatcher_MATCHES_REGEX UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 3\n\t// Selects negation of regular-expression matching. The match succeeds if\n\t// the output does _NOT_ match the regular expression specified in the\n\t// `content` string. Regex matching is only supported for HTTP/HTTPS\n\t// checks.\n\tUptimeCheckConfig_ContentMatcher_NOT_MATCHES_REGEX UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 4\n\t// Selects JSONPath matching. See `JsonPathMatcher` for details on when\n\t// the match succeeds. JSONPath matching is only supported for HTTP/HTTPS\n\t// checks.\n\tUptimeCheckConfig_ContentMatcher_MATCHES_JSON_PATH UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 5\n\t// Selects JSONPath matching. See `JsonPathMatcher` for details on when\n\t// the match succeeds. Succeeds when output does _NOT_ match as specified.\n\t// JSONPath is only supported for HTTP/HTTPS checks.\n\tUptimeCheckConfig_ContentMatcher_NOT_MATCHES_JSON_PATH UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 6\n)\n\n// Enum value maps for UptimeCheckConfig_ContentMatcher_ContentMatcherOption.\nvar (\n\tUptimeCheckConfig_ContentMatcher_ContentMatcherOption_name = map[int32]string{\n\t\t0: \"CONTENT_MATCHER_OPTION_UNSPECIFIED\",\n\t\t1: \"CONTAINS_STRING\",\n\t\t2: \"NOT_CONTAINS_STRING\",\n\t\t3: \"MATCHES_REGEX\",\n\t\t4: \"NOT_MATCHES_REGEX\",\n\t\t5: \"MATCHES_JSON_PATH\",\n\t\t6: \"NOT_MATCHES_JSON_PATH\",\n\t}\n\tUptimeCheckConfig_ContentMatcher_ContentMatcherOption_value = map[string]int32{\n\t\t\"CONTENT_MATCHER_OPTION_UNSPECIFIED\": 0,\n\t\t\"CONTAINS_STRING\":                    1,\n\t\t\"NOT_CONTAINS_STRING\":                2,\n\t\t\"MATCHES_REGEX\":                      3,\n\t\t\"NOT_MATCHES_REGEX\":                  4,\n\t\t\"MATCHES_JSON_PATH\":                  5,\n\t\t\"NOT_MATCHES_JSON_PATH\":              6,\n\t}\n)\n\nfunc (x UptimeCheckConfig_ContentMatcher_ContentMatcherOption) Enum() *UptimeCheckConfig_ContentMatcher_ContentMatcherOption {\n\tp := new(UptimeCheckConfig_ContentMatcher_ContentMatcherOption)\n\t*p = x\n\treturn p\n}\n\nfunc (x UptimeCheckConfig_ContentMatcher_ContentMatcherOption) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (UptimeCheckConfig_ContentMatcher_ContentMatcherOption) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_uptime_proto_enumTypes[8].Descriptor()\n}\n\nfunc (UptimeCheckConfig_ContentMatcher_ContentMatcherOption) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_uptime_proto_enumTypes[8]\n}\n\nfunc (x UptimeCheckConfig_ContentMatcher_ContentMatcherOption) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use UptimeCheckConfig_ContentMatcher_ContentMatcherOption.Descriptor instead.\nfunc (UptimeCheckConfig_ContentMatcher_ContentMatcherOption) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 4, 0}\n}\n\n// Options to perform JSONPath content matching.\ntype UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption int32\n\nconst (\n\t// No JSONPath matcher type specified (not valid).\n\tUptimeCheckConfig_ContentMatcher_JsonPathMatcher_JSON_PATH_MATCHER_OPTION_UNSPECIFIED UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption = 0\n\t// Selects 'exact string' matching. The match succeeds if the content at\n\t// the `json_path` within the output is exactly the same as the\n\t// `content` string.\n\tUptimeCheckConfig_ContentMatcher_JsonPathMatcher_EXACT_MATCH UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption = 1\n\t// Selects regular-expression matching. The match succeeds if the\n\t// content at the `json_path` within the output matches the regular\n\t// expression specified in the `content` string.\n\tUptimeCheckConfig_ContentMatcher_JsonPathMatcher_REGEX_MATCH UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption = 2\n)\n\n// Enum value maps for UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption.\nvar (\n\tUptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption_name = map[int32]string{\n\t\t0: \"JSON_PATH_MATCHER_OPTION_UNSPECIFIED\",\n\t\t1: \"EXACT_MATCH\",\n\t\t2: \"REGEX_MATCH\",\n\t}\n\tUptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption_value = map[string]int32{\n\t\t\"JSON_PATH_MATCHER_OPTION_UNSPECIFIED\": 0,\n\t\t\"EXACT_MATCH\":                          1,\n\t\t\"REGEX_MATCH\":                          2,\n\t}\n)\n\nfunc (x UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption) Enum() *UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption {\n\tp := new(UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption)\n\t*p = x\n\treturn p\n}\n\nfunc (x UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_monitoring_v3_uptime_proto_enumTypes[9].Descriptor()\n}\n\nfunc (UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption) Type() protoreflect.EnumType {\n\treturn &file_google_monitoring_v3_uptime_proto_enumTypes[9]\n}\n\nfunc (x UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption.Descriptor instead.\nfunc (UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 4, 0, 0}\n}\n\n// An internal checker allows Uptime checks to run on private/internal GCP\n// resources.\n//\n// Deprecated: Marked as deprecated in google/monitoring/v3/uptime.proto.\ntype InternalChecker struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// A unique resource name for this InternalChecker. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/internalCheckers/[INTERNAL_CHECKER_ID]\n\t//\n\t// `[PROJECT_ID_OR_NUMBER]` is the Cloud Monitoring Metrics Scope project for\n\t// the Uptime check config associated with the internal checker.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// The checker's human-readable name. The display name\n\t// should be unique within a Cloud Monitoring Metrics Scope in order to make\n\t// it easier to identify; however, uniqueness is not enforced.\n\tDisplayName string `protobuf:\"bytes,2,opt,name=display_name,json=displayName,proto3\" json:\"display_name,omitempty\"`\n\t// The [GCP VPC network](https://cloud.google.com/vpc/docs/vpc) where the\n\t// internal resource lives (ex: \"default\").\n\tNetwork string `protobuf:\"bytes,3,opt,name=network,proto3\" json:\"network,omitempty\"`\n\t// The GCP zone the Uptime check should egress from. Only respected for\n\t// internal Uptime checks, where internal_network is specified.\n\tGcpZone string `protobuf:\"bytes,4,opt,name=gcp_zone,json=gcpZone,proto3\" json:\"gcp_zone,omitempty\"`\n\t// The GCP project ID where the internal checker lives. Not necessary\n\t// the same as the Metrics Scope project.\n\tPeerProjectId string `protobuf:\"bytes,6,opt,name=peer_project_id,json=peerProjectId,proto3\" json:\"peer_project_id,omitempty\"`\n\t// The current operational state of the internal checker.\n\tState InternalChecker_State `protobuf:\"varint,7,opt,name=state,proto3,enum=google.monitoring.v3.InternalChecker_State\" json:\"state,omitempty\"`\n}\n\nfunc (x *InternalChecker) Reset() {\n\t*x = InternalChecker{}\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *InternalChecker) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*InternalChecker) ProtoMessage() {}\n\nfunc (x *InternalChecker) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use InternalChecker.ProtoReflect.Descriptor instead.\nfunc (*InternalChecker) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *InternalChecker) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *InternalChecker) GetDisplayName() string {\n\tif x != nil {\n\t\treturn x.DisplayName\n\t}\n\treturn \"\"\n}\n\nfunc (x *InternalChecker) GetNetwork() string {\n\tif x != nil {\n\t\treturn x.Network\n\t}\n\treturn \"\"\n}\n\nfunc (x *InternalChecker) GetGcpZone() string {\n\tif x != nil {\n\t\treturn x.GcpZone\n\t}\n\treturn \"\"\n}\n\nfunc (x *InternalChecker) GetPeerProjectId() string {\n\tif x != nil {\n\t\treturn x.PeerProjectId\n\t}\n\treturn \"\"\n}\n\nfunc (x *InternalChecker) GetState() InternalChecker_State {\n\tif x != nil {\n\t\treturn x.State\n\t}\n\treturn InternalChecker_UNSPECIFIED\n}\n\n// Describes a Synthetic Monitor to be invoked by Uptime.\ntype SyntheticMonitorTarget struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Specifies a Synthetic Monitor's execution stack.\n\t//\n\t// Types that are assignable to Target:\n\t//\n\t//\t*SyntheticMonitorTarget_CloudFunctionV2\n\tTarget isSyntheticMonitorTarget_Target `protobuf_oneof:\"target\"`\n}\n\nfunc (x *SyntheticMonitorTarget) Reset() {\n\t*x = SyntheticMonitorTarget{}\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *SyntheticMonitorTarget) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SyntheticMonitorTarget) ProtoMessage() {}\n\nfunc (x *SyntheticMonitorTarget) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SyntheticMonitorTarget.ProtoReflect.Descriptor instead.\nfunc (*SyntheticMonitorTarget) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (m *SyntheticMonitorTarget) GetTarget() isSyntheticMonitorTarget_Target {\n\tif m != nil {\n\t\treturn m.Target\n\t}\n\treturn nil\n}\n\nfunc (x *SyntheticMonitorTarget) GetCloudFunctionV2() *SyntheticMonitorTarget_CloudFunctionV2Target {\n\tif x, ok := x.GetTarget().(*SyntheticMonitorTarget_CloudFunctionV2); ok {\n\t\treturn x.CloudFunctionV2\n\t}\n\treturn nil\n}\n\ntype isSyntheticMonitorTarget_Target interface {\n\tisSyntheticMonitorTarget_Target()\n}\n\ntype SyntheticMonitorTarget_CloudFunctionV2 struct {\n\t// Target a Synthetic Monitor GCFv2 instance.\n\tCloudFunctionV2 *SyntheticMonitorTarget_CloudFunctionV2Target `protobuf:\"bytes,1,opt,name=cloud_function_v2,json=cloudFunctionV2,proto3,oneof\"`\n}\n\nfunc (*SyntheticMonitorTarget_CloudFunctionV2) isSyntheticMonitorTarget_Target() {}\n\n// This message configures which resources and services to monitor for\n// availability.\ntype UptimeCheckConfig struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Identifier. A unique resource name for this Uptime check configuration. The\n\t// format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/uptimeCheckConfigs/[UPTIME_CHECK_ID]\n\t//\n\t// `[PROJECT_ID_OR_NUMBER]` is the Workspace host project associated with the\n\t// Uptime check.\n\t//\n\t// This field should be omitted when creating the Uptime check configuration;\n\t// on create, the resource name is assigned by the server and included in the\n\t// response.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// A human-friendly name for the Uptime check configuration. The display name\n\t// should be unique within a Cloud Monitoring Workspace in order to make it\n\t// easier to identify; however, uniqueness is not enforced. Required.\n\tDisplayName string `protobuf:\"bytes,2,opt,name=display_name,json=displayName,proto3\" json:\"display_name,omitempty\"`\n\t// The resource the check is checking. Required.\n\t//\n\t// Types that are assignable to Resource:\n\t//\n\t//\t*UptimeCheckConfig_MonitoredResource\n\t//\t*UptimeCheckConfig_ResourceGroup_\n\t//\t*UptimeCheckConfig_SyntheticMonitor\n\tResource isUptimeCheckConfig_Resource `protobuf_oneof:\"resource\"`\n\t// The type of Uptime check request.\n\t//\n\t// Types that are assignable to CheckRequestType:\n\t//\n\t//\t*UptimeCheckConfig_HttpCheck_\n\t//\t*UptimeCheckConfig_TcpCheck_\n\tCheckRequestType isUptimeCheckConfig_CheckRequestType `protobuf_oneof:\"check_request_type\"`\n\t// How often, in seconds, the Uptime check is performed.\n\t// Currently, the only supported values are `60s` (1 minute), `300s`\n\t// (5 minutes), `600s` (10 minutes), and `900s` (15 minutes). Optional,\n\t// defaults to `60s`.\n\tPeriod *durationpb.Duration `protobuf:\"bytes,7,opt,name=period,proto3\" json:\"period,omitempty\"`\n\t// The maximum amount of time to wait for the request to complete (must be\n\t// between 1 and 60 seconds). Required.\n\tTimeout *durationpb.Duration `protobuf:\"bytes,8,opt,name=timeout,proto3\" json:\"timeout,omitempty\"`\n\t// The content that is expected to appear in the data returned by the target\n\t// server against which the check is run.  Currently, only the first entry\n\t// in the `content_matchers` list is supported, and additional entries will\n\t// be ignored. This field is optional and should only be specified if a\n\t// content match is required as part of the/ Uptime check.\n\tContentMatchers []*UptimeCheckConfig_ContentMatcher `protobuf:\"bytes,9,rep,name=content_matchers,json=contentMatchers,proto3\" json:\"content_matchers,omitempty\"`\n\t// The type of checkers to use to execute the Uptime check.\n\tCheckerType UptimeCheckConfig_CheckerType `protobuf:\"varint,17,opt,name=checker_type,json=checkerType,proto3,enum=google.monitoring.v3.UptimeCheckConfig_CheckerType\" json:\"checker_type,omitempty\"`\n\t// The list of regions from which the check will be run.\n\t// Some regions contain one location, and others contain more than one.\n\t// If this field is specified, enough regions must be provided to include a\n\t// minimum of 3 locations.  Not specifying this field will result in Uptime\n\t// checks running from all available regions.\n\tSelectedRegions []UptimeCheckRegion `protobuf:\"varint,10,rep,packed,name=selected_regions,json=selectedRegions,proto3,enum=google.monitoring.v3.UptimeCheckRegion\" json:\"selected_regions,omitempty\"`\n\t// If this is `true`, then checks are made only from the 'internal_checkers'.\n\t// If it is `false`, then checks are made only from the 'selected_regions'.\n\t// It is an error to provide 'selected_regions' when is_internal is `true`,\n\t// or to provide 'internal_checkers' when is_internal is `false`.\n\t//\n\t// Deprecated: Marked as deprecated in google/monitoring/v3/uptime.proto.\n\tIsInternal bool `protobuf:\"varint,15,opt,name=is_internal,json=isInternal,proto3\" json:\"is_internal,omitempty\"`\n\t// The internal checkers that this check will egress from. If `is_internal` is\n\t// `true` and this list is empty, the check will egress from all the\n\t// InternalCheckers configured for the project that owns this\n\t// `UptimeCheckConfig`.\n\t//\n\t// Deprecated: Marked as deprecated in google/monitoring/v3/uptime.proto.\n\tInternalCheckers []*InternalChecker `protobuf:\"bytes,14,rep,name=internal_checkers,json=internalCheckers,proto3\" json:\"internal_checkers,omitempty\"`\n\t// User-supplied key/value data to be used for organizing and\n\t// identifying the `UptimeCheckConfig` objects.\n\t//\n\t// The field can contain up to 64 entries. Each key and value is limited to\n\t// 63 Unicode characters or 128 bytes, whichever is smaller. Labels and\n\t// values can contain only lowercase letters, numerals, underscores, and\n\t// dashes. Keys must begin with a letter.\n\tUserLabels map[string]string `protobuf:\"bytes,20,rep,name=user_labels,json=userLabels,proto3\" json:\"user_labels,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n}\n\nfunc (x *UptimeCheckConfig) Reset() {\n\t*x = UptimeCheckConfig{}\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[2]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UptimeCheckConfig) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UptimeCheckConfig) ProtoMessage() {}\n\nfunc (x *UptimeCheckConfig) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[2]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UptimeCheckConfig.ProtoReflect.Descriptor instead.\nfunc (*UptimeCheckConfig) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *UptimeCheckConfig) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *UptimeCheckConfig) GetDisplayName() string {\n\tif x != nil {\n\t\treturn x.DisplayName\n\t}\n\treturn \"\"\n}\n\nfunc (m *UptimeCheckConfig) GetResource() isUptimeCheckConfig_Resource {\n\tif m != nil {\n\t\treturn m.Resource\n\t}\n\treturn nil\n}\n\nfunc (x *UptimeCheckConfig) GetMonitoredResource() *monitoredres.MonitoredResource {\n\tif x, ok := x.GetResource().(*UptimeCheckConfig_MonitoredResource); ok {\n\t\treturn x.MonitoredResource\n\t}\n\treturn nil\n}\n\nfunc (x *UptimeCheckConfig) GetResourceGroup() *UptimeCheckConfig_ResourceGroup {\n\tif x, ok := x.GetResource().(*UptimeCheckConfig_ResourceGroup_); ok {\n\t\treturn x.ResourceGroup\n\t}\n\treturn nil\n}\n\nfunc (x *UptimeCheckConfig) GetSyntheticMonitor() *SyntheticMonitorTarget {\n\tif x, ok := x.GetResource().(*UptimeCheckConfig_SyntheticMonitor); ok {\n\t\treturn x.SyntheticMonitor\n\t}\n\treturn nil\n}\n\nfunc (m *UptimeCheckConfig) GetCheckRequestType() isUptimeCheckConfig_CheckRequestType {\n\tif m != nil {\n\t\treturn m.CheckRequestType\n\t}\n\treturn nil\n}\n\nfunc (x *UptimeCheckConfig) GetHttpCheck() *UptimeCheckConfig_HttpCheck {\n\tif x, ok := x.GetCheckRequestType().(*UptimeCheckConfig_HttpCheck_); ok {\n\t\treturn x.HttpCheck\n\t}\n\treturn nil\n}\n\nfunc (x *UptimeCheckConfig) GetTcpCheck() *UptimeCheckConfig_TcpCheck {\n\tif x, ok := x.GetCheckRequestType().(*UptimeCheckConfig_TcpCheck_); ok {\n\t\treturn x.TcpCheck\n\t}\n\treturn nil\n}\n\nfunc (x *UptimeCheckConfig) GetPeriod() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Period\n\t}\n\treturn nil\n}\n\nfunc (x *UptimeCheckConfig) GetTimeout() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.Timeout\n\t}\n\treturn nil\n}\n\nfunc (x *UptimeCheckConfig) GetContentMatchers() []*UptimeCheckConfig_ContentMatcher {\n\tif x != nil {\n\t\treturn x.ContentMatchers\n\t}\n\treturn nil\n}\n\nfunc (x *UptimeCheckConfig) GetCheckerType() UptimeCheckConfig_CheckerType {\n\tif x != nil {\n\t\treturn x.CheckerType\n\t}\n\treturn UptimeCheckConfig_CHECKER_TYPE_UNSPECIFIED\n}\n\nfunc (x *UptimeCheckConfig) GetSelectedRegions() []UptimeCheckRegion {\n\tif x != nil {\n\t\treturn x.SelectedRegions\n\t}\n\treturn nil\n}\n\n// Deprecated: Marked as deprecated in google/monitoring/v3/uptime.proto.\nfunc (x *UptimeCheckConfig) GetIsInternal() bool {\n\tif x != nil {\n\t\treturn x.IsInternal\n\t}\n\treturn false\n}\n\n// Deprecated: Marked as deprecated in google/monitoring/v3/uptime.proto.\nfunc (x *UptimeCheckConfig) GetInternalCheckers() []*InternalChecker {\n\tif x != nil {\n\t\treturn x.InternalCheckers\n\t}\n\treturn nil\n}\n\nfunc (x *UptimeCheckConfig) GetUserLabels() map[string]string {\n\tif x != nil {\n\t\treturn x.UserLabels\n\t}\n\treturn nil\n}\n\ntype isUptimeCheckConfig_Resource interface {\n\tisUptimeCheckConfig_Resource()\n}\n\ntype UptimeCheckConfig_MonitoredResource struct {\n\t// The [monitored\n\t// resource](https://cloud.google.com/monitoring/api/resources) associated\n\t// with the configuration.\n\t// The following monitored resource types are valid for this field:\n\t//\n\t//\t`uptime_url`,\n\t//\t`gce_instance`,\n\t//\t`gae_app`,\n\t//\t`aws_ec2_instance`,\n\t//\t`aws_elb_load_balancer`\n\t//\t`k8s_service`\n\t//\t`servicedirectory_service`\n\t//\t`cloud_run_revision`\n\tMonitoredResource *monitoredres.MonitoredResource `protobuf:\"bytes,3,opt,name=monitored_resource,json=monitoredResource,proto3,oneof\"`\n}\n\ntype UptimeCheckConfig_ResourceGroup_ struct {\n\t// The group resource associated with the configuration.\n\tResourceGroup *UptimeCheckConfig_ResourceGroup `protobuf:\"bytes,4,opt,name=resource_group,json=resourceGroup,proto3,oneof\"`\n}\n\ntype UptimeCheckConfig_SyntheticMonitor struct {\n\t// Specifies a Synthetic Monitor to invoke.\n\tSyntheticMonitor *SyntheticMonitorTarget `protobuf:\"bytes,21,opt,name=synthetic_monitor,json=syntheticMonitor,proto3,oneof\"`\n}\n\nfunc (*UptimeCheckConfig_MonitoredResource) isUptimeCheckConfig_Resource() {}\n\nfunc (*UptimeCheckConfig_ResourceGroup_) isUptimeCheckConfig_Resource() {}\n\nfunc (*UptimeCheckConfig_SyntheticMonitor) isUptimeCheckConfig_Resource() {}\n\ntype isUptimeCheckConfig_CheckRequestType interface {\n\tisUptimeCheckConfig_CheckRequestType()\n}\n\ntype UptimeCheckConfig_HttpCheck_ struct {\n\t// Contains information needed to make an HTTP or HTTPS check.\n\tHttpCheck *UptimeCheckConfig_HttpCheck `protobuf:\"bytes,5,opt,name=http_check,json=httpCheck,proto3,oneof\"`\n}\n\ntype UptimeCheckConfig_TcpCheck_ struct {\n\t// Contains information needed to make a TCP check.\n\tTcpCheck *UptimeCheckConfig_TcpCheck `protobuf:\"bytes,6,opt,name=tcp_check,json=tcpCheck,proto3,oneof\"`\n}\n\nfunc (*UptimeCheckConfig_HttpCheck_) isUptimeCheckConfig_CheckRequestType() {}\n\nfunc (*UptimeCheckConfig_TcpCheck_) isUptimeCheckConfig_CheckRequestType() {}\n\n// Contains the region, location, and list of IP\n// addresses where checkers in the location run from.\ntype UptimeCheckIp struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// A broad region category in which the IP address is located.\n\tRegion UptimeCheckRegion `protobuf:\"varint,1,opt,name=region,proto3,enum=google.monitoring.v3.UptimeCheckRegion\" json:\"region,omitempty\"`\n\t// A more specific location within the region that typically encodes\n\t// a particular city/town/metro (and its containing state/province or country)\n\t// within the broader umbrella region category.\n\tLocation string `protobuf:\"bytes,2,opt,name=location,proto3\" json:\"location,omitempty\"`\n\t// The IP address from which the Uptime check originates. This is a fully\n\t// specified IP address (not an IP address range). Most IP addresses, as of\n\t// this publication, are in IPv4 format; however, one should not rely on the\n\t// IP addresses being in IPv4 format indefinitely, and should support\n\t// interpreting this field in either IPv4 or IPv6 format.\n\tIpAddress string `protobuf:\"bytes,3,opt,name=ip_address,json=ipAddress,proto3\" json:\"ip_address,omitempty\"`\n}\n\nfunc (x *UptimeCheckIp) Reset() {\n\t*x = UptimeCheckIp{}\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[3]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UptimeCheckIp) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UptimeCheckIp) ProtoMessage() {}\n\nfunc (x *UptimeCheckIp) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[3]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UptimeCheckIp.ProtoReflect.Descriptor instead.\nfunc (*UptimeCheckIp) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *UptimeCheckIp) GetRegion() UptimeCheckRegion {\n\tif x != nil {\n\t\treturn x.Region\n\t}\n\treturn UptimeCheckRegion_REGION_UNSPECIFIED\n}\n\nfunc (x *UptimeCheckIp) GetLocation() string {\n\tif x != nil {\n\t\treturn x.Location\n\t}\n\treturn \"\"\n}\n\nfunc (x *UptimeCheckIp) GetIpAddress() string {\n\tif x != nil {\n\t\treturn x.IpAddress\n\t}\n\treturn \"\"\n}\n\n// A Synthetic Monitor deployed to a Cloud Functions V2 instance.\ntype SyntheticMonitorTarget_CloudFunctionV2Target struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Fully qualified GCFv2 resource name\n\t// i.e. `projects/{project}/locations/{location}/functions/{function}`\n\t// Required.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// Output only. The `cloud_run_revision` Monitored Resource associated with\n\t// the GCFv2. The Synthetic Monitor execution results (metrics, logs, and\n\t// spans) are reported against this Monitored Resource. This field is output\n\t// only.\n\tCloudRunRevision *monitoredres.MonitoredResource `protobuf:\"bytes,2,opt,name=cloud_run_revision,json=cloudRunRevision,proto3\" json:\"cloud_run_revision,omitempty\"`\n}\n\nfunc (x *SyntheticMonitorTarget_CloudFunctionV2Target) Reset() {\n\t*x = SyntheticMonitorTarget_CloudFunctionV2Target{}\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[4]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *SyntheticMonitorTarget_CloudFunctionV2Target) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*SyntheticMonitorTarget_CloudFunctionV2Target) ProtoMessage() {}\n\nfunc (x *SyntheticMonitorTarget_CloudFunctionV2Target) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[4]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use SyntheticMonitorTarget_CloudFunctionV2Target.ProtoReflect.Descriptor instead.\nfunc (*SyntheticMonitorTarget_CloudFunctionV2Target) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{1, 0}\n}\n\nfunc (x *SyntheticMonitorTarget_CloudFunctionV2Target) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *SyntheticMonitorTarget_CloudFunctionV2Target) GetCloudRunRevision() *monitoredres.MonitoredResource {\n\tif x != nil {\n\t\treturn x.CloudRunRevision\n\t}\n\treturn nil\n}\n\n// The resource submessage for group checks. It can be used instead of a\n// monitored resource, when multiple resources are being monitored.\ntype UptimeCheckConfig_ResourceGroup struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The group of resources being monitored. Should be only the `[GROUP_ID]`,\n\t// and not the full-path\n\t// `projects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID]`.\n\tGroupId string `protobuf:\"bytes,1,opt,name=group_id,json=groupId,proto3\" json:\"group_id,omitempty\"`\n\t// The resource type of the group members.\n\tResourceType GroupResourceType `protobuf:\"varint,2,opt,name=resource_type,json=resourceType,proto3,enum=google.monitoring.v3.GroupResourceType\" json:\"resource_type,omitempty\"`\n}\n\nfunc (x *UptimeCheckConfig_ResourceGroup) Reset() {\n\t*x = UptimeCheckConfig_ResourceGroup{}\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[5]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UptimeCheckConfig_ResourceGroup) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UptimeCheckConfig_ResourceGroup) ProtoMessage() {}\n\nfunc (x *UptimeCheckConfig_ResourceGroup) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[5]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UptimeCheckConfig_ResourceGroup.ProtoReflect.Descriptor instead.\nfunc (*UptimeCheckConfig_ResourceGroup) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 0}\n}\n\nfunc (x *UptimeCheckConfig_ResourceGroup) GetGroupId() string {\n\tif x != nil {\n\t\treturn x.GroupId\n\t}\n\treturn \"\"\n}\n\nfunc (x *UptimeCheckConfig_ResourceGroup) GetResourceType() GroupResourceType {\n\tif x != nil {\n\t\treturn x.ResourceType\n\t}\n\treturn GroupResourceType_RESOURCE_TYPE_UNSPECIFIED\n}\n\n// Information involved in sending ICMP pings alongside public HTTP/TCP\n// checks. For HTTP, the pings are performed for each part of the redirect\n// chain.\ntype UptimeCheckConfig_PingConfig struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Number of ICMP pings. A maximum of 3 ICMP pings is currently supported.\n\tPingsCount int32 `protobuf:\"varint,1,opt,name=pings_count,json=pingsCount,proto3\" json:\"pings_count,omitempty\"`\n}\n\nfunc (x *UptimeCheckConfig_PingConfig) Reset() {\n\t*x = UptimeCheckConfig_PingConfig{}\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[6]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UptimeCheckConfig_PingConfig) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UptimeCheckConfig_PingConfig) ProtoMessage() {}\n\nfunc (x *UptimeCheckConfig_PingConfig) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[6]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UptimeCheckConfig_PingConfig.ProtoReflect.Descriptor instead.\nfunc (*UptimeCheckConfig_PingConfig) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 1}\n}\n\nfunc (x *UptimeCheckConfig_PingConfig) GetPingsCount() int32 {\n\tif x != nil {\n\t\treturn x.PingsCount\n\t}\n\treturn 0\n}\n\n// Information involved in an HTTP/HTTPS Uptime check request.\ntype UptimeCheckConfig_HttpCheck struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The HTTP request method to use for the check. If set to\n\t// `METHOD_UNSPECIFIED` then `request_method` defaults to `GET`.\n\tRequestMethod UptimeCheckConfig_HttpCheck_RequestMethod `protobuf:\"varint,8,opt,name=request_method,json=requestMethod,proto3,enum=google.monitoring.v3.UptimeCheckConfig_HttpCheck_RequestMethod\" json:\"request_method,omitempty\"`\n\t// If `true`, use HTTPS instead of HTTP to run the check.\n\tUseSsl bool `protobuf:\"varint,1,opt,name=use_ssl,json=useSsl,proto3\" json:\"use_ssl,omitempty\"`\n\t// Optional (defaults to \"/\"). The path to the page against which to run\n\t// the check. Will be combined with the `host` (specified within the\n\t// `monitored_resource`) and `port` to construct the full URL. If the\n\t// provided path does not begin with \"/\", a \"/\" will be prepended\n\t// automatically.\n\tPath string `protobuf:\"bytes,2,opt,name=path,proto3\" json:\"path,omitempty\"`\n\t// Optional (defaults to 80 when `use_ssl` is `false`, and 443 when\n\t// `use_ssl` is `true`). The TCP port on the HTTP server against which to\n\t// run the check. Will be combined with host (specified within the\n\t// `monitored_resource`) and `path` to construct the full URL.\n\tPort int32 `protobuf:\"varint,3,opt,name=port,proto3\" json:\"port,omitempty\"`\n\t// The authentication information. Optional when creating an HTTP check;\n\t// defaults to empty.\n\t// Do not set both `auth_method` and `auth_info`.\n\tAuthInfo *UptimeCheckConfig_HttpCheck_BasicAuthentication `protobuf:\"bytes,4,opt,name=auth_info,json=authInfo,proto3\" json:\"auth_info,omitempty\"`\n\t// Boolean specifying whether to encrypt the header information.\n\t// Encryption should be specified for any headers related to authentication\n\t// that you do not wish to be seen when retrieving the configuration. The\n\t// server will be responsible for encrypting the headers.\n\t// On Get/List calls, if `mask_headers` is set to `true` then the headers\n\t// will be obscured with `******.`\n\tMaskHeaders bool `protobuf:\"varint,5,opt,name=mask_headers,json=maskHeaders,proto3\" json:\"mask_headers,omitempty\"`\n\t// The list of headers to send as part of the Uptime check request.\n\t// If two headers have the same key and different values, they should\n\t// be entered as a single header, with the value being a comma-separated\n\t// list of all the desired values as described at\n\t// https://www.w3.org/Protocols/rfc2616/rfc2616.txt (page 31).\n\t// Entering two separate headers with the same key in a Create call will\n\t// cause the first to be overwritten by the second.\n\t// The maximum number of headers allowed is 100.\n\tHeaders map[string]string `protobuf:\"bytes,6,rep,name=headers,proto3\" json:\"headers,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\t// The content type header to use for the check. The following\n\t// configurations result in errors:\n\t// 1. Content type is specified in both the `headers` field and the\n\t// `content_type` field.\n\t// 2. Request method is `GET` and `content_type` is not `TYPE_UNSPECIFIED`\n\t// 3. Request method is `POST` and `content_type` is `TYPE_UNSPECIFIED`.\n\t// 4. Request method is `POST` and a \"Content-Type\" header is provided via\n\t// `headers` field. The `content_type` field should be used instead.\n\tContentType UptimeCheckConfig_HttpCheck_ContentType `protobuf:\"varint,9,opt,name=content_type,json=contentType,proto3,enum=google.monitoring.v3.UptimeCheckConfig_HttpCheck_ContentType\" json:\"content_type,omitempty\"`\n\t// A user provided content type header to use for the check. The invalid\n\t// configurations outlined in the `content_type` field apply to\n\t// `custom_content_type`, as well as the following:\n\t// 1. `content_type` is `URL_ENCODED` and `custom_content_type` is set.\n\t// 2. `content_type` is `USER_PROVIDED` and `custom_content_type` is not\n\t// set.\n\tCustomContentType string `protobuf:\"bytes,13,opt,name=custom_content_type,json=customContentType,proto3\" json:\"custom_content_type,omitempty\"`\n\t// Boolean specifying whether to include SSL certificate validation as a\n\t// part of the Uptime check. Only applies to checks where\n\t// `monitored_resource` is set to `uptime_url`. If `use_ssl` is `false`,\n\t// setting `validate_ssl` to `true` has no effect.\n\tValidateSsl bool `protobuf:\"varint,7,opt,name=validate_ssl,json=validateSsl,proto3\" json:\"validate_ssl,omitempty\"`\n\t// The request body associated with the HTTP POST request. If `content_type`\n\t// is `URL_ENCODED`, the body passed in must be URL-encoded. Users can\n\t// provide a `Content-Length` header via the `headers` field or the API will\n\t// do so. If the `request_method` is `GET` and `body` is not empty, the API\n\t// will return an error. The maximum byte size is 1 megabyte.\n\t//\n\t// Note: If client libraries aren't used (which performs the conversion\n\t// automatically) base64 encode your `body` data since the field is of\n\t// `bytes` type.\n\tBody []byte `protobuf:\"bytes,10,opt,name=body,proto3\" json:\"body,omitempty\"`\n\t// If present, the check will only pass if the HTTP response status code is\n\t// in this set of status codes. If empty, the HTTP status code will only\n\t// pass if the HTTP status code is 200-299.\n\tAcceptedResponseStatusCodes []*UptimeCheckConfig_HttpCheck_ResponseStatusCode `protobuf:\"bytes,11,rep,name=accepted_response_status_codes,json=acceptedResponseStatusCodes,proto3\" json:\"accepted_response_status_codes,omitempty\"`\n\t// Contains information needed to add pings to an HTTP check.\n\tPingConfig *UptimeCheckConfig_PingConfig `protobuf:\"bytes,12,opt,name=ping_config,json=pingConfig,proto3\" json:\"ping_config,omitempty\"`\n\t// This field is optional and should be set only by users interested in\n\t// an authenticated uptime check.\n\t// Do not set both `auth_method` and `auth_info`.\n\t//\n\t// Types that are assignable to AuthMethod:\n\t//\n\t//\t*UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_\n\tAuthMethod isUptimeCheckConfig_HttpCheck_AuthMethod `protobuf_oneof:\"auth_method\"`\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck) Reset() {\n\t*x = UptimeCheckConfig_HttpCheck{}\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[7]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UptimeCheckConfig_HttpCheck) ProtoMessage() {}\n\nfunc (x *UptimeCheckConfig_HttpCheck) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[7]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UptimeCheckConfig_HttpCheck.ProtoReflect.Descriptor instead.\nfunc (*UptimeCheckConfig_HttpCheck) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 2}\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck) GetRequestMethod() UptimeCheckConfig_HttpCheck_RequestMethod {\n\tif x != nil {\n\t\treturn x.RequestMethod\n\t}\n\treturn UptimeCheckConfig_HttpCheck_METHOD_UNSPECIFIED\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck) GetUseSsl() bool {\n\tif x != nil {\n\t\treturn x.UseSsl\n\t}\n\treturn false\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck) GetPath() string {\n\tif x != nil {\n\t\treturn x.Path\n\t}\n\treturn \"\"\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck) GetPort() int32 {\n\tif x != nil {\n\t\treturn x.Port\n\t}\n\treturn 0\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck) GetAuthInfo() *UptimeCheckConfig_HttpCheck_BasicAuthentication {\n\tif x != nil {\n\t\treturn x.AuthInfo\n\t}\n\treturn nil\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck) GetMaskHeaders() bool {\n\tif x != nil {\n\t\treturn x.MaskHeaders\n\t}\n\treturn false\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck) GetHeaders() map[string]string {\n\tif x != nil {\n\t\treturn x.Headers\n\t}\n\treturn nil\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck) GetContentType() UptimeCheckConfig_HttpCheck_ContentType {\n\tif x != nil {\n\t\treturn x.ContentType\n\t}\n\treturn UptimeCheckConfig_HttpCheck_TYPE_UNSPECIFIED\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck) GetCustomContentType() string {\n\tif x != nil {\n\t\treturn x.CustomContentType\n\t}\n\treturn \"\"\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck) GetValidateSsl() bool {\n\tif x != nil {\n\t\treturn x.ValidateSsl\n\t}\n\treturn false\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck) GetBody() []byte {\n\tif x != nil {\n\t\treturn x.Body\n\t}\n\treturn nil\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck) GetAcceptedResponseStatusCodes() []*UptimeCheckConfig_HttpCheck_ResponseStatusCode {\n\tif x != nil {\n\t\treturn x.AcceptedResponseStatusCodes\n\t}\n\treturn nil\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck) GetPingConfig() *UptimeCheckConfig_PingConfig {\n\tif x != nil {\n\t\treturn x.PingConfig\n\t}\n\treturn nil\n}\n\nfunc (m *UptimeCheckConfig_HttpCheck) GetAuthMethod() isUptimeCheckConfig_HttpCheck_AuthMethod {\n\tif m != nil {\n\t\treturn m.AuthMethod\n\t}\n\treturn nil\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck) GetServiceAgentAuthentication() *UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication {\n\tif x, ok := x.GetAuthMethod().(*UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_); ok {\n\t\treturn x.ServiceAgentAuthentication\n\t}\n\treturn nil\n}\n\ntype isUptimeCheckConfig_HttpCheck_AuthMethod interface {\n\tisUptimeCheckConfig_HttpCheck_AuthMethod()\n}\n\ntype UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ struct {\n\t// If specified, Uptime will generate and attach an OIDC JWT token for the\n\t// Monitoring service agent service account as an `Authorization` header\n\t// in the HTTP request when probing.\n\tServiceAgentAuthentication *UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication `protobuf:\"bytes,14,opt,name=service_agent_authentication,json=serviceAgentAuthentication,proto3,oneof\"`\n}\n\nfunc (*UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_) isUptimeCheckConfig_HttpCheck_AuthMethod() {\n}\n\n// Information required for a TCP Uptime check request.\ntype UptimeCheckConfig_TcpCheck struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The TCP port on the server against which to run the check. Will be\n\t// combined with host (specified within the `monitored_resource`) to\n\t// construct the full URL. Required.\n\tPort int32 `protobuf:\"varint,1,opt,name=port,proto3\" json:\"port,omitempty\"`\n\t// Contains information needed to add pings to a TCP check.\n\tPingConfig *UptimeCheckConfig_PingConfig `protobuf:\"bytes,2,opt,name=ping_config,json=pingConfig,proto3\" json:\"ping_config,omitempty\"`\n}\n\nfunc (x *UptimeCheckConfig_TcpCheck) Reset() {\n\t*x = UptimeCheckConfig_TcpCheck{}\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[8]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UptimeCheckConfig_TcpCheck) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UptimeCheckConfig_TcpCheck) ProtoMessage() {}\n\nfunc (x *UptimeCheckConfig_TcpCheck) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[8]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UptimeCheckConfig_TcpCheck.ProtoReflect.Descriptor instead.\nfunc (*UptimeCheckConfig_TcpCheck) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 3}\n}\n\nfunc (x *UptimeCheckConfig_TcpCheck) GetPort() int32 {\n\tif x != nil {\n\t\treturn x.Port\n\t}\n\treturn 0\n}\n\nfunc (x *UptimeCheckConfig_TcpCheck) GetPingConfig() *UptimeCheckConfig_PingConfig {\n\tif x != nil {\n\t\treturn x.PingConfig\n\t}\n\treturn nil\n}\n\n// Optional. Used to perform content matching. This allows matching based on\n// substrings and regular expressions, together with their negations. Only the\n// first 4&nbsp;MB of an HTTP or HTTPS check's response (and the first\n// 1&nbsp;MB of a TCP check's response) are examined for purposes of content\n// matching.\ntype UptimeCheckConfig_ContentMatcher struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// String, regex or JSON content to match. Maximum 1024 bytes. An empty\n\t// `content` string indicates no content matching is to be performed.\n\tContent string `protobuf:\"bytes,1,opt,name=content,proto3\" json:\"content,omitempty\"`\n\t// The type of content matcher that will be applied to the server output,\n\t// compared to the `content` string when the check is run.\n\tMatcher UptimeCheckConfig_ContentMatcher_ContentMatcherOption `protobuf:\"varint,2,opt,name=matcher,proto3,enum=google.monitoring.v3.UptimeCheckConfig_ContentMatcher_ContentMatcherOption\" json:\"matcher,omitempty\"`\n\t// Certain `ContentMatcherOption` types require additional information.\n\t// `MATCHES_JSON_PATH` or `NOT_MATCHES_JSON_PATH` require a\n\t// `JsonPathMatcher`; not used for other options.\n\t//\n\t// Types that are assignable to AdditionalMatcherInfo:\n\t//\n\t//\t*UptimeCheckConfig_ContentMatcher_JsonPathMatcher_\n\tAdditionalMatcherInfo isUptimeCheckConfig_ContentMatcher_AdditionalMatcherInfo `protobuf_oneof:\"additional_matcher_info\"`\n}\n\nfunc (x *UptimeCheckConfig_ContentMatcher) Reset() {\n\t*x = UptimeCheckConfig_ContentMatcher{}\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[9]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UptimeCheckConfig_ContentMatcher) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UptimeCheckConfig_ContentMatcher) ProtoMessage() {}\n\nfunc (x *UptimeCheckConfig_ContentMatcher) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[9]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UptimeCheckConfig_ContentMatcher.ProtoReflect.Descriptor instead.\nfunc (*UptimeCheckConfig_ContentMatcher) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 4}\n}\n\nfunc (x *UptimeCheckConfig_ContentMatcher) GetContent() string {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn \"\"\n}\n\nfunc (x *UptimeCheckConfig_ContentMatcher) GetMatcher() UptimeCheckConfig_ContentMatcher_ContentMatcherOption {\n\tif x != nil {\n\t\treturn x.Matcher\n\t}\n\treturn UptimeCheckConfig_ContentMatcher_CONTENT_MATCHER_OPTION_UNSPECIFIED\n}\n\nfunc (m *UptimeCheckConfig_ContentMatcher) GetAdditionalMatcherInfo() isUptimeCheckConfig_ContentMatcher_AdditionalMatcherInfo {\n\tif m != nil {\n\t\treturn m.AdditionalMatcherInfo\n\t}\n\treturn nil\n}\n\nfunc (x *UptimeCheckConfig_ContentMatcher) GetJsonPathMatcher() *UptimeCheckConfig_ContentMatcher_JsonPathMatcher {\n\tif x, ok := x.GetAdditionalMatcherInfo().(*UptimeCheckConfig_ContentMatcher_JsonPathMatcher_); ok {\n\t\treturn x.JsonPathMatcher\n\t}\n\treturn nil\n}\n\ntype isUptimeCheckConfig_ContentMatcher_AdditionalMatcherInfo interface {\n\tisUptimeCheckConfig_ContentMatcher_AdditionalMatcherInfo()\n}\n\ntype UptimeCheckConfig_ContentMatcher_JsonPathMatcher_ struct {\n\t// Matcher information for `MATCHES_JSON_PATH` and `NOT_MATCHES_JSON_PATH`\n\tJsonPathMatcher *UptimeCheckConfig_ContentMatcher_JsonPathMatcher `protobuf:\"bytes,3,opt,name=json_path_matcher,json=jsonPathMatcher,proto3,oneof\"`\n}\n\nfunc (*UptimeCheckConfig_ContentMatcher_JsonPathMatcher_) isUptimeCheckConfig_ContentMatcher_AdditionalMatcherInfo() {\n}\n\n// The authentication parameters to provide to the specified resource or\n// URL that requires a username and password. Currently, only\n// [Basic HTTP authentication](https://tools.ietf.org/html/rfc7617) is\n// supported in Uptime checks.\ntype UptimeCheckConfig_HttpCheck_BasicAuthentication struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The username to use when authenticating with the HTTP server.\n\tUsername string `protobuf:\"bytes,1,opt,name=username,proto3\" json:\"username,omitempty\"`\n\t// The password to use when authenticating with the HTTP server.\n\tPassword string `protobuf:\"bytes,2,opt,name=password,proto3\" json:\"password,omitempty\"`\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck_BasicAuthentication) Reset() {\n\t*x = UptimeCheckConfig_HttpCheck_BasicAuthentication{}\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[11]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck_BasicAuthentication) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UptimeCheckConfig_HttpCheck_BasicAuthentication) ProtoMessage() {}\n\nfunc (x *UptimeCheckConfig_HttpCheck_BasicAuthentication) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[11]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UptimeCheckConfig_HttpCheck_BasicAuthentication.ProtoReflect.Descriptor instead.\nfunc (*UptimeCheckConfig_HttpCheck_BasicAuthentication) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 2, 0}\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck_BasicAuthentication) GetUsername() string {\n\tif x != nil {\n\t\treturn x.Username\n\t}\n\treturn \"\"\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck_BasicAuthentication) GetPassword() string {\n\tif x != nil {\n\t\treturn x.Password\n\t}\n\treturn \"\"\n}\n\n// A status to accept. Either a status code class like \"2xx\", or an integer\n// status code like \"200\".\ntype UptimeCheckConfig_HttpCheck_ResponseStatusCode struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Either a specific value or a class of status codes.\n\t//\n\t// Types that are assignable to StatusCode:\n\t//\n\t//\t*UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusValue\n\t//\t*UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass_\n\tStatusCode isUptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusCode `protobuf_oneof:\"status_code\"`\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck_ResponseStatusCode) Reset() {\n\t*x = UptimeCheckConfig_HttpCheck_ResponseStatusCode{}\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[12]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck_ResponseStatusCode) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UptimeCheckConfig_HttpCheck_ResponseStatusCode) ProtoMessage() {}\n\nfunc (x *UptimeCheckConfig_HttpCheck_ResponseStatusCode) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[12]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UptimeCheckConfig_HttpCheck_ResponseStatusCode.ProtoReflect.Descriptor instead.\nfunc (*UptimeCheckConfig_HttpCheck_ResponseStatusCode) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 2, 1}\n}\n\nfunc (m *UptimeCheckConfig_HttpCheck_ResponseStatusCode) GetStatusCode() isUptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusCode {\n\tif m != nil {\n\t\treturn m.StatusCode\n\t}\n\treturn nil\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck_ResponseStatusCode) GetStatusValue() int32 {\n\tif x, ok := x.GetStatusCode().(*UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusValue); ok {\n\t\treturn x.StatusValue\n\t}\n\treturn 0\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck_ResponseStatusCode) GetStatusClass() UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass {\n\tif x, ok := x.GetStatusCode().(*UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass_); ok {\n\t\treturn x.StatusClass\n\t}\n\treturn UptimeCheckConfig_HttpCheck_ResponseStatusCode_STATUS_CLASS_UNSPECIFIED\n}\n\ntype isUptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusCode interface {\n\tisUptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusCode()\n}\n\ntype UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusValue struct {\n\t// A status code to accept.\n\tStatusValue int32 `protobuf:\"varint,1,opt,name=status_value,json=statusValue,proto3,oneof\"`\n}\n\ntype UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass_ struct {\n\t// A class of status codes to accept.\n\tStatusClass UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass `protobuf:\"varint,2,opt,name=status_class,json=statusClass,proto3,enum=google.monitoring.v3.UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass,oneof\"`\n}\n\nfunc (*UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusValue) isUptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusCode() {\n}\n\nfunc (*UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass_) isUptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusCode() {\n}\n\n// Contains information needed for generating either an\n// [OpenID Connect\n// token](https://developers.google.com/identity/protocols/OpenIDConnect) or\n// [OAuth token](https://developers.google.com/identity/protocols/oauth2).\n// The token will be generated for the Monitoring service agent service\n// account.\ntype UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Type of authentication.\n\tType UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType `protobuf:\"varint,1,opt,name=type,proto3,enum=google.monitoring.v3.UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType\" json:\"type,omitempty\"`\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication) Reset() {\n\t*x = UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication{}\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[13]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication) ProtoMessage() {}\n\nfunc (x *UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[13]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication.ProtoReflect.Descriptor instead.\nfunc (*UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 2, 2}\n}\n\nfunc (x *UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication) GetType() UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_SERVICE_AGENT_AUTHENTICATION_TYPE_UNSPECIFIED\n}\n\n// Information needed to perform a JSONPath content match.\n// Used for `ContentMatcherOption::MATCHES_JSON_PATH` and\n// `ContentMatcherOption::NOT_MATCHES_JSON_PATH`.\ntype UptimeCheckConfig_ContentMatcher_JsonPathMatcher struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// JSONPath within the response output pointing to the expected\n\t// `ContentMatcher::content` to match against.\n\tJsonPath string `protobuf:\"bytes,1,opt,name=json_path,json=jsonPath,proto3\" json:\"json_path,omitempty\"`\n\t// The type of JSONPath match that will be applied to the JSON output\n\t// (`ContentMatcher.content`)\n\tJsonMatcher UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption `protobuf:\"varint,2,opt,name=json_matcher,json=jsonMatcher,proto3,enum=google.monitoring.v3.UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption\" json:\"json_matcher,omitempty\"`\n}\n\nfunc (x *UptimeCheckConfig_ContentMatcher_JsonPathMatcher) Reset() {\n\t*x = UptimeCheckConfig_ContentMatcher_JsonPathMatcher{}\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[15]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UptimeCheckConfig_ContentMatcher_JsonPathMatcher) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UptimeCheckConfig_ContentMatcher_JsonPathMatcher) ProtoMessage() {}\n\nfunc (x *UptimeCheckConfig_ContentMatcher_JsonPathMatcher) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_proto_msgTypes[15]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UptimeCheckConfig_ContentMatcher_JsonPathMatcher.ProtoReflect.Descriptor instead.\nfunc (*UptimeCheckConfig_ContentMatcher_JsonPathMatcher) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 4, 0}\n}\n\nfunc (x *UptimeCheckConfig_ContentMatcher_JsonPathMatcher) GetJsonPath() string {\n\tif x != nil {\n\t\treturn x.JsonPath\n\t}\n\treturn \"\"\n}\n\nfunc (x *UptimeCheckConfig_ContentMatcher_JsonPathMatcher) GetJsonMatcher() UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption {\n\tif x != nil {\n\t\treturn x.JsonMatcher\n\t}\n\treturn UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JSON_PATH_MATCHER_OPTION_UNSPECIFIED\n}\n\nvar File_google_monitoring_v3_uptime_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_uptime_proto_rawDesc = []byte{\n\t0x0a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61,\n\t0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x69, 0x6e, 0x66,\n\t0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,\n\t0x61, 0x70, 0x69, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65,\n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x49, 0x6e, 0x74, 0x65,\n\t0x72, 0x6e, 0x61, 0x6c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,\n\t0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61,\n\t0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x19, 0x0a, 0x08,\n\t0x67, 0x63, 0x70, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,\n\t0x67, 0x63, 0x70, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x65, 0x65, 0x72, 0x5f,\n\t0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x0d, 0x70, 0x65, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12,\n\t0x41, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x68,\n\t0x65, 0x63, 0x6b, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61,\n\t0x74, 0x65, 0x22, 0x33, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x55,\n\t0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08,\n\t0x43, 0x52, 0x45, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55,\n\t0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x3a, 0x02, 0x18, 0x01, 0x22, 0xc4, 0x02, 0x0a, 0x16,\n\t0x53, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x70, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f,\n\t0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x32, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x42, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74,\n\t0x69, 0x63, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e,\n\t0x43, 0x6c, 0x6f, 0x75, 0x64, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x54,\n\t0x61, 0x72, 0x67, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x46, 0x75,\n\t0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x1a, 0xad, 0x01, 0x0a, 0x15, 0x43, 0x6c, 0x6f,\n\t0x75, 0x64, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x54, 0x61, 0x72, 0x67,\n\t0x65, 0x74, 0x12, 0x42, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,\n\t0x42, 0x2e, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x28, 0x0a, 0x26, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x66,\n\t0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,\n\t0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x50, 0x0a, 0x12, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f,\n\t0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e,\n\t0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,\n\t0x65, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x10, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x75, 0x6e,\n\t0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67,\n\t0x65, 0x74, 0x22, 0x94, 0x23, 0x0a, 0x11, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65,\n\t0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d,\n\t0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79,\n\t0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x12, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65,\n\t0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48,\n\t0x00, 0x52, 0x11, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f,\n\t0x75, 0x72, 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,\n\t0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43,\n\t0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72,\n\t0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47,\n\t0x72, 0x6f, 0x75, 0x70, 0x12, 0x5b, 0x0a, 0x11, 0x73, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69,\n\t0x63, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63,\n\t0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x48, 0x00, 0x52,\n\t0x10, 0x73, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x12, 0x52, 0x0a, 0x0a, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74,\n\t0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48,\n\t0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x48, 0x01, 0x52, 0x09, 0x68, 0x74, 0x74, 0x70,\n\t0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x4f, 0x0a, 0x09, 0x74, 0x63, 0x70, 0x5f, 0x63, 0x68, 0x65,\n\t0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e,\n\t0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69,\n\t0x67, 0x2e, 0x54, 0x63, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x48, 0x01, 0x52, 0x08, 0x74, 0x63,\n\t0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64,\n\t0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x52, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d,\n\t0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x61,\n\t0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65,\n\t0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e,\n\t0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69,\n\t0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72,\n\t0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72,\n\t0x73, 0x12, 0x56, 0x0a, 0x0c, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70,\n\t0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55,\n\t0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,\n\t0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x63, 0x68,\n\t0x65, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x52, 0x0a, 0x10, 0x73, 0x65, 0x6c,\n\t0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20,\n\t0x03, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d,\n\t0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x73, 0x65,\n\t0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a,\n\t0x0b, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x0f, 0x20, 0x01,\n\t0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x69, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e,\n\t0x61, 0x6c, 0x12, 0x56, 0x0a, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63,\n\t0x68, 0x65, 0x63, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2e, 0x76, 0x33, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x68, 0x65,\n\t0x63, 0x6b, 0x65, 0x72, 0x42, 0x02, 0x18, 0x01, 0x52, 0x10, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e,\n\t0x61, 0x6c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x0b, 0x75, 0x73,\n\t0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65,\n\t0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62,\n\t0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x61,\n\t0x62, 0x65, 0x6c, 0x73, 0x1a, 0x78, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,\n\t0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69,\n\t0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64,\n\t0x12, 0x4c, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47,\n\t0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65,\n\t0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x2d,\n\t0x0a, 0x0a, 0x50, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1f, 0x0a, 0x0b,\n\t0x70, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x05, 0x52, 0x0a, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0xef, 0x0e,\n\t0x0a, 0x09, 0x48, 0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x66, 0x0a, 0x0e, 0x72,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x08, 0x20,\n\t0x01, 0x28, 0x0e, 0x32, 0x3f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d,\n\t0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x74, 0x74,\n\t0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65,\n\t0x74, 0x68, 0x6f, 0x64, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74,\n\t0x68, 0x6f, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x5f, 0x73, 0x73, 0x6c, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x75, 0x73, 0x65, 0x53, 0x73, 0x6c, 0x12, 0x12, 0x0a, 0x04,\n\t0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68,\n\t0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04,\n\t0x70, 0x6f, 0x72, 0x74, 0x12, 0x62, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x69, 0x6e, 0x66,\n\t0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55,\n\t0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,\n\t0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63,\n\t0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08,\n\t0x61, 0x75, 0x74, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x73, 0x6b,\n\t0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b,\n\t0x6d, 0x61, 0x73, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x07, 0x68,\n\t0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43,\n\t0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e,\n\t0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65,\n\t0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x60, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3d, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f,\n\t0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x43,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f,\n\t0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0d,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x61, 0x6c, 0x69, 0x64,\n\t0x61, 0x74, 0x65, 0x5f, 0x73, 0x73, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x76,\n\t0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x73, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f,\n\t0x64, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x89,\n\t0x01, 0x0a, 0x1e, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65,\n\t0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55,\n\t0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,\n\t0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x1b, 0x61,\n\t0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53,\n\t0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x53, 0x0a, 0x0b, 0x70, 0x69,\n\t0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65,\n\t0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e,\n\t0x66, 0x69, 0x67, 0x52, 0x0a, 0x70, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12,\n\t0x90, 0x01, 0x0a, 0x1c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x67, 0x65, 0x6e,\n\t0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70,\n\t0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,\n\t0x48, 0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,\n\t0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x1a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41,\n\t0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x1a, 0x4d, 0x0a, 0x13, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x65,\n\t0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65,\n\t0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65,\n\t0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,\n\t0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,\n\t0x64, 0x1a, 0xf6, 0x02, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74,\n\t0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74,\n\t0x75, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00,\n\t0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x75, 0x0a,\n\t0x0c, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x0e, 0x32, 0x50, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d,\n\t0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x74, 0x74,\n\t0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53,\n\t0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,\n\t0x43, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43,\n\t0x6c, 0x61, 0x73, 0x73, 0x22, 0xb4, 0x01, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43,\n\t0x6c, 0x61, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43,\n\t0x4c, 0x41, 0x53, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44,\n\t0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4c, 0x41,\n\t0x53, 0x53, 0x5f, 0x31, 0x58, 0x58, 0x10, 0x64, 0x12, 0x15, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54,\n\t0x55, 0x53, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x32, 0x58, 0x58, 0x10, 0xc8, 0x01, 0x12,\n\t0x15, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f,\n\t0x33, 0x58, 0x58, 0x10, 0xac, 0x02, 0x12, 0x15, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53,\n\t0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x34, 0x58, 0x58, 0x10, 0x90, 0x03, 0x12, 0x15, 0x0a,\n\t0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x35, 0x58,\n\t0x58, 0x10, 0xf4, 0x03, 0x12, 0x15, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43,\n\t0x4c, 0x41, 0x53, 0x53, 0x5f, 0x41, 0x4e, 0x59, 0x10, 0xe8, 0x07, 0x42, 0x0d, 0x0a, 0x0b, 0x73,\n\t0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x1a, 0x82, 0x02, 0x0a, 0x1a, 0x53,\n\t0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x65,\n\t0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x7f, 0x0a, 0x04, 0x74, 0x79, 0x70,\n\t0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x6b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55,\n\t0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,\n\t0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69,\n\t0x63, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x67, 0x65,\n\t0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x63, 0x0a, 0x1e, 0x53, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e,\n\t0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x31, 0x0a, 0x2d,\n\t0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x55,\n\t0x54, 0x48, 0x45, 0x4e, 0x54, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50,\n\t0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,\n\t0x0e, 0x0a, 0x0a, 0x4f, 0x49, 0x44, 0x43, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x01, 0x1a,\n\t0x3a, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,\n\t0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65,\n\t0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x16, 0x0a, 0x12,\n\t0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,\n\t0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x45, 0x54, 0x10, 0x01, 0x12, 0x08, 0x0a,\n\t0x04, 0x50, 0x4f, 0x53, 0x54, 0x10, 0x02, 0x22, 0x47, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55,\n\t0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b,\n\t0x55, 0x52, 0x4c, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x45, 0x44, 0x10, 0x01, 0x12, 0x11, 0x0a,\n\t0x0d, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x44, 0x10, 0x02,\n\t0x42, 0x0d, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x1a,\n\t0x73, 0x0a, 0x08, 0x54, 0x63, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x70,\n\t0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12,\n\t0x53, 0x0a, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69,\n\t0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x50, 0x69,\n\t0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x70, 0x69, 0x6e, 0x67, 0x43, 0x6f,\n\t0x6e, 0x66, 0x69, 0x67, 0x1a, 0x84, 0x06, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x74, 0x12, 0x65, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0e, 0x32, 0x4b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65,\n\t0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x74,\n\t0x65, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52,\n\t0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x74, 0x0a, 0x11, 0x6a, 0x73, 0x6f, 0x6e,\n\t0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d,\n\t0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x4a, 0x73, 0x6f, 0x6e,\n\t0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x6a,\n\t0x73, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x1a, 0x94,\n\t0x02, 0x0a, 0x0f, 0x4a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68,\n\t0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x12,\n\t0x7f, 0x0a, 0x0c, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x5c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74,\n\t0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43,\n\t0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x4a, 0x73,\n\t0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x4a, 0x73,\n\t0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x6a, 0x73, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72,\n\t0x22, 0x63, 0x0a, 0x15, 0x4a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63,\n\t0x68, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x24, 0x4a, 0x53, 0x4f,\n\t0x4e, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x45, 0x52, 0x5f, 0x4f,\n\t0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,\n\t0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x58, 0x41, 0x43, 0x54, 0x5f, 0x4d, 0x41, 0x54,\n\t0x43, 0x48, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x47, 0x45, 0x58, 0x5f, 0x4d, 0x41,\n\t0x54, 0x43, 0x48, 0x10, 0x02, 0x22, 0xc8, 0x01, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e,\n\t0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26,\n\t0x0a, 0x22, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x45,\n\t0x52, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49,\n\t0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49,\n\t0x4e, 0x53, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4e,\n\t0x4f, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x53, 0x5f, 0x53, 0x54, 0x52, 0x49,\n\t0x4e, 0x47, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x45, 0x53, 0x5f,\n\t0x52, 0x45, 0x47, 0x45, 0x58, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x4e, 0x4f, 0x54, 0x5f, 0x4d,\n\t0x41, 0x54, 0x43, 0x48, 0x45, 0x53, 0x5f, 0x52, 0x45, 0x47, 0x45, 0x58, 0x10, 0x04, 0x12, 0x15,\n\t0x0a, 0x11, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x45, 0x53, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x5f, 0x50,\n\t0x41, 0x54, 0x48, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, 0x4e, 0x4f, 0x54, 0x5f, 0x4d, 0x41, 0x54,\n\t0x43, 0x48, 0x45, 0x53, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x10, 0x06,\n\t0x42, 0x19, 0x0a, 0x17, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6d,\n\t0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x1a, 0x3d, 0x0a, 0x0f, 0x55,\n\t0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,\n\t0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,\n\t0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x55, 0x0a, 0x0b, 0x43, 0x68,\n\t0x65, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x48, 0x45,\n\t0x43, 0x4b, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43,\n\t0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x49,\n\t0x43, 0x5f, 0x49, 0x50, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x45, 0x52, 0x53, 0x10, 0x01, 0x12,\n\t0x10, 0x0a, 0x0c, 0x56, 0x50, 0x43, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x45, 0x52, 0x53, 0x10,\n\t0x03, 0x3a, 0xf3, 0x01, 0xea, 0x41, 0xef, 0x01, 0x0a, 0x2b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,\n\t0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x2f, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43,\n\t0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f,\n\t0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65,\n\t0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2f, 0x7b, 0x75, 0x70,\n\t0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69,\n\t0x67, 0x7d, 0x12, 0x45, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d,\n\t0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66,\n\t0x69, 0x67, 0x73, 0x2f, 0x7b, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63,\n\t0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x7d, 0x12, 0x39, 0x66, 0x6f, 0x6c, 0x64, 0x65,\n\t0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x75, 0x70, 0x74, 0x69,\n\t0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2f, 0x7b,\n\t0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e,\n\t0x66, 0x69, 0x67, 0x7d, 0x12, 0x01, 0x2a, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75,\n\t0x72, 0x63, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x8b, 0x01, 0x0a, 0x0d, 0x55, 0x70,\n\t0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x70, 0x12, 0x3f, 0x0a, 0x06, 0x72,\n\t0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65,\n\t0x67, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08,\n\t0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,\n\t0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x70, 0x5f, 0x61,\n\t0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x70,\n\t0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2a, 0x95, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x74, 0x69,\n\t0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a,\n\t0x12, 0x52, 0x45, 0x47, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46,\n\t0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x53, 0x41, 0x10, 0x01, 0x12, 0x0a,\n\t0x0a, 0x06, 0x45, 0x55, 0x52, 0x4f, 0x50, 0x45, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x4f,\n\t0x55, 0x54, 0x48, 0x5f, 0x41, 0x4d, 0x45, 0x52, 0x49, 0x43, 0x41, 0x10, 0x03, 0x12, 0x10, 0x0a,\n\t0x0c, 0x41, 0x53, 0x49, 0x41, 0x5f, 0x50, 0x41, 0x43, 0x49, 0x46, 0x49, 0x43, 0x10, 0x04, 0x12,\n\t0x0e, 0x0a, 0x0a, 0x55, 0x53, 0x41, 0x5f, 0x4f, 0x52, 0x45, 0x47, 0x4f, 0x4e, 0x10, 0x05, 0x12,\n\t0x0c, 0x0a, 0x08, 0x55, 0x53, 0x41, 0x5f, 0x49, 0x4f, 0x57, 0x41, 0x10, 0x06, 0x12, 0x10, 0x0a,\n\t0x0c, 0x55, 0x53, 0x41, 0x5f, 0x56, 0x49, 0x52, 0x47, 0x49, 0x4e, 0x49, 0x41, 0x10, 0x07, 0x2a,\n\t0x5b, 0x0a, 0x11, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,\n\t0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45,\n\t0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,\n\t0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x10,\n\t0x01, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x57, 0x53, 0x5f, 0x45, 0x4c, 0x42, 0x5f, 0x4c, 0x4f, 0x41,\n\t0x44, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x52, 0x10, 0x02, 0x42, 0xaf, 0x02, 0xea,\n\t0x41, 0x66, 0x0a, 0x26, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x70, 0x72, 0x6f, 0x6a,\n\t0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6c,\n\t0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x7d, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x66,\n\t0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x76, 0x33, 0x42, 0x0b, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50,\n\t0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,\n\t0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c,\n\t0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56,\n\t0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64,\n\t0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02,\n\t0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a,\n\t0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_monitoring_v3_uptime_proto_rawDescOnce sync.Once\n\tfile_google_monitoring_v3_uptime_proto_rawDescData = file_google_monitoring_v3_uptime_proto_rawDesc\n)\n\nfunc file_google_monitoring_v3_uptime_proto_rawDescGZIP() []byte {\n\tfile_google_monitoring_v3_uptime_proto_rawDescOnce.Do(func() {\n\t\tfile_google_monitoring_v3_uptime_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_uptime_proto_rawDescData)\n\t})\n\treturn file_google_monitoring_v3_uptime_proto_rawDescData\n}\n\nvar file_google_monitoring_v3_uptime_proto_enumTypes = make([]protoimpl.EnumInfo, 10)\nvar file_google_monitoring_v3_uptime_proto_msgTypes = make([]protoimpl.MessageInfo, 16)\nvar file_google_monitoring_v3_uptime_proto_goTypes = []any{\n\t(UptimeCheckRegion)(0),                                          // 0: google.monitoring.v3.UptimeCheckRegion\n\t(GroupResourceType)(0),                                          // 1: google.monitoring.v3.GroupResourceType\n\t(InternalChecker_State)(0),                                      // 2: google.monitoring.v3.InternalChecker.State\n\t(UptimeCheckConfig_CheckerType)(0),                              // 3: google.monitoring.v3.UptimeCheckConfig.CheckerType\n\t(UptimeCheckConfig_HttpCheck_RequestMethod)(0),                  // 4: google.monitoring.v3.UptimeCheckConfig.HttpCheck.RequestMethod\n\t(UptimeCheckConfig_HttpCheck_ContentType)(0),                    // 5: google.monitoring.v3.UptimeCheckConfig.HttpCheck.ContentType\n\t(UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass)(0), // 6: google.monitoring.v3.UptimeCheckConfig.HttpCheck.ResponseStatusCode.StatusClass\n\t(UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType)(0), // 7: google.monitoring.v3.UptimeCheckConfig.HttpCheck.ServiceAgentAuthentication.ServiceAgentAuthenticationType\n\t(UptimeCheckConfig_ContentMatcher_ContentMatcherOption)(0),                                 // 8: google.monitoring.v3.UptimeCheckConfig.ContentMatcher.ContentMatcherOption\n\t(UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption)(0),                // 9: google.monitoring.v3.UptimeCheckConfig.ContentMatcher.JsonPathMatcher.JsonPathMatcherOption\n\t(*InternalChecker)(nil),                                        // 10: google.monitoring.v3.InternalChecker\n\t(*SyntheticMonitorTarget)(nil),                                 // 11: google.monitoring.v3.SyntheticMonitorTarget\n\t(*UptimeCheckConfig)(nil),                                      // 12: google.monitoring.v3.UptimeCheckConfig\n\t(*UptimeCheckIp)(nil),                                          // 13: google.monitoring.v3.UptimeCheckIp\n\t(*SyntheticMonitorTarget_CloudFunctionV2Target)(nil),           // 14: google.monitoring.v3.SyntheticMonitorTarget.CloudFunctionV2Target\n\t(*UptimeCheckConfig_ResourceGroup)(nil),                        // 15: google.monitoring.v3.UptimeCheckConfig.ResourceGroup\n\t(*UptimeCheckConfig_PingConfig)(nil),                           // 16: google.monitoring.v3.UptimeCheckConfig.PingConfig\n\t(*UptimeCheckConfig_HttpCheck)(nil),                            // 17: google.monitoring.v3.UptimeCheckConfig.HttpCheck\n\t(*UptimeCheckConfig_TcpCheck)(nil),                             // 18: google.monitoring.v3.UptimeCheckConfig.TcpCheck\n\t(*UptimeCheckConfig_ContentMatcher)(nil),                       // 19: google.monitoring.v3.UptimeCheckConfig.ContentMatcher\n\tnil,                                                            // 20: google.monitoring.v3.UptimeCheckConfig.UserLabelsEntry\n\t(*UptimeCheckConfig_HttpCheck_BasicAuthentication)(nil),        // 21: google.monitoring.v3.UptimeCheckConfig.HttpCheck.BasicAuthentication\n\t(*UptimeCheckConfig_HttpCheck_ResponseStatusCode)(nil),         // 22: google.monitoring.v3.UptimeCheckConfig.HttpCheck.ResponseStatusCode\n\t(*UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication)(nil), // 23: google.monitoring.v3.UptimeCheckConfig.HttpCheck.ServiceAgentAuthentication\n\tnil, // 24: google.monitoring.v3.UptimeCheckConfig.HttpCheck.HeadersEntry\n\t(*UptimeCheckConfig_ContentMatcher_JsonPathMatcher)(nil), // 25: google.monitoring.v3.UptimeCheckConfig.ContentMatcher.JsonPathMatcher\n\t(*monitoredres.MonitoredResource)(nil),                   // 26: google.api.MonitoredResource\n\t(*durationpb.Duration)(nil),                              // 27: google.protobuf.Duration\n}\nvar file_google_monitoring_v3_uptime_proto_depIdxs = []int32{\n\t2,  // 0: google.monitoring.v3.InternalChecker.state:type_name -> google.monitoring.v3.InternalChecker.State\n\t14, // 1: google.monitoring.v3.SyntheticMonitorTarget.cloud_function_v2:type_name -> google.monitoring.v3.SyntheticMonitorTarget.CloudFunctionV2Target\n\t26, // 2: google.monitoring.v3.UptimeCheckConfig.monitored_resource:type_name -> google.api.MonitoredResource\n\t15, // 3: google.monitoring.v3.UptimeCheckConfig.resource_group:type_name -> google.monitoring.v3.UptimeCheckConfig.ResourceGroup\n\t11, // 4: google.monitoring.v3.UptimeCheckConfig.synthetic_monitor:type_name -> google.monitoring.v3.SyntheticMonitorTarget\n\t17, // 5: google.monitoring.v3.UptimeCheckConfig.http_check:type_name -> google.monitoring.v3.UptimeCheckConfig.HttpCheck\n\t18, // 6: google.monitoring.v3.UptimeCheckConfig.tcp_check:type_name -> google.monitoring.v3.UptimeCheckConfig.TcpCheck\n\t27, // 7: google.monitoring.v3.UptimeCheckConfig.period:type_name -> google.protobuf.Duration\n\t27, // 8: google.monitoring.v3.UptimeCheckConfig.timeout:type_name -> google.protobuf.Duration\n\t19, // 9: google.monitoring.v3.UptimeCheckConfig.content_matchers:type_name -> google.monitoring.v3.UptimeCheckConfig.ContentMatcher\n\t3,  // 10: google.monitoring.v3.UptimeCheckConfig.checker_type:type_name -> google.monitoring.v3.UptimeCheckConfig.CheckerType\n\t0,  // 11: google.monitoring.v3.UptimeCheckConfig.selected_regions:type_name -> google.monitoring.v3.UptimeCheckRegion\n\t10, // 12: google.monitoring.v3.UptimeCheckConfig.internal_checkers:type_name -> google.monitoring.v3.InternalChecker\n\t20, // 13: google.monitoring.v3.UptimeCheckConfig.user_labels:type_name -> google.monitoring.v3.UptimeCheckConfig.UserLabelsEntry\n\t0,  // 14: google.monitoring.v3.UptimeCheckIp.region:type_name -> google.monitoring.v3.UptimeCheckRegion\n\t26, // 15: google.monitoring.v3.SyntheticMonitorTarget.CloudFunctionV2Target.cloud_run_revision:type_name -> google.api.MonitoredResource\n\t1,  // 16: google.monitoring.v3.UptimeCheckConfig.ResourceGroup.resource_type:type_name -> google.monitoring.v3.GroupResourceType\n\t4,  // 17: google.monitoring.v3.UptimeCheckConfig.HttpCheck.request_method:type_name -> google.monitoring.v3.UptimeCheckConfig.HttpCheck.RequestMethod\n\t21, // 18: google.monitoring.v3.UptimeCheckConfig.HttpCheck.auth_info:type_name -> google.monitoring.v3.UptimeCheckConfig.HttpCheck.BasicAuthentication\n\t24, // 19: google.monitoring.v3.UptimeCheckConfig.HttpCheck.headers:type_name -> google.monitoring.v3.UptimeCheckConfig.HttpCheck.HeadersEntry\n\t5,  // 20: google.monitoring.v3.UptimeCheckConfig.HttpCheck.content_type:type_name -> google.monitoring.v3.UptimeCheckConfig.HttpCheck.ContentType\n\t22, // 21: google.monitoring.v3.UptimeCheckConfig.HttpCheck.accepted_response_status_codes:type_name -> google.monitoring.v3.UptimeCheckConfig.HttpCheck.ResponseStatusCode\n\t16, // 22: google.monitoring.v3.UptimeCheckConfig.HttpCheck.ping_config:type_name -> google.monitoring.v3.UptimeCheckConfig.PingConfig\n\t23, // 23: google.monitoring.v3.UptimeCheckConfig.HttpCheck.service_agent_authentication:type_name -> google.monitoring.v3.UptimeCheckConfig.HttpCheck.ServiceAgentAuthentication\n\t16, // 24: google.monitoring.v3.UptimeCheckConfig.TcpCheck.ping_config:type_name -> google.monitoring.v3.UptimeCheckConfig.PingConfig\n\t8,  // 25: google.monitoring.v3.UptimeCheckConfig.ContentMatcher.matcher:type_name -> google.monitoring.v3.UptimeCheckConfig.ContentMatcher.ContentMatcherOption\n\t25, // 26: google.monitoring.v3.UptimeCheckConfig.ContentMatcher.json_path_matcher:type_name -> google.monitoring.v3.UptimeCheckConfig.ContentMatcher.JsonPathMatcher\n\t6,  // 27: google.monitoring.v3.UptimeCheckConfig.HttpCheck.ResponseStatusCode.status_class:type_name -> google.monitoring.v3.UptimeCheckConfig.HttpCheck.ResponseStatusCode.StatusClass\n\t7,  // 28: google.monitoring.v3.UptimeCheckConfig.HttpCheck.ServiceAgentAuthentication.type:type_name -> google.monitoring.v3.UptimeCheckConfig.HttpCheck.ServiceAgentAuthentication.ServiceAgentAuthenticationType\n\t9,  // 29: google.monitoring.v3.UptimeCheckConfig.ContentMatcher.JsonPathMatcher.json_matcher:type_name -> google.monitoring.v3.UptimeCheckConfig.ContentMatcher.JsonPathMatcher.JsonPathMatcherOption\n\t30, // [30:30] is the sub-list for method output_type\n\t30, // [30:30] is the sub-list for method input_type\n\t30, // [30:30] is the sub-list for extension type_name\n\t30, // [30:30] is the sub-list for extension extendee\n\t0,  // [0:30] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_uptime_proto_init() }\nfunc file_google_monitoring_v3_uptime_proto_init() {\n\tif File_google_monitoring_v3_uptime_proto != nil {\n\t\treturn\n\t}\n\tfile_google_monitoring_v3_uptime_proto_msgTypes[1].OneofWrappers = []any{\n\t\t(*SyntheticMonitorTarget_CloudFunctionV2)(nil),\n\t}\n\tfile_google_monitoring_v3_uptime_proto_msgTypes[2].OneofWrappers = []any{\n\t\t(*UptimeCheckConfig_MonitoredResource)(nil),\n\t\t(*UptimeCheckConfig_ResourceGroup_)(nil),\n\t\t(*UptimeCheckConfig_SyntheticMonitor)(nil),\n\t\t(*UptimeCheckConfig_HttpCheck_)(nil),\n\t\t(*UptimeCheckConfig_TcpCheck_)(nil),\n\t}\n\tfile_google_monitoring_v3_uptime_proto_msgTypes[7].OneofWrappers = []any{\n\t\t(*UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_)(nil),\n\t}\n\tfile_google_monitoring_v3_uptime_proto_msgTypes[9].OneofWrappers = []any{\n\t\t(*UptimeCheckConfig_ContentMatcher_JsonPathMatcher_)(nil),\n\t}\n\tfile_google_monitoring_v3_uptime_proto_msgTypes[12].OneofWrappers = []any{\n\t\t(*UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusValue)(nil),\n\t\t(*UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass_)(nil),\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_uptime_proto_rawDesc,\n\t\t\tNumEnums:      10,\n\t\t\tNumMessages:   16,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_uptime_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_uptime_proto_depIdxs,\n\t\tEnumInfos:         file_google_monitoring_v3_uptime_proto_enumTypes,\n\t\tMessageInfos:      file_google_monitoring_v3_uptime_proto_msgTypes,\n\t}.Build()\n\tFile_google_monitoring_v3_uptime_proto = out.File\n\tfile_google_monitoring_v3_uptime_proto_rawDesc = nil\n\tfile_google_monitoring_v3_uptime_proto_goTypes = nil\n\tfile_google_monitoring_v3_uptime_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/uptime_service.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/monitoring/v3/uptime_service.proto\n\npackage monitoringpb\n\nimport (\n\tcontext \"context\"\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus \"google.golang.org/grpc/status\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n\tfieldmaskpb \"google.golang.org/protobuf/types/known/fieldmaskpb\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// The protocol for the `ListUptimeCheckConfigs` request.\ntype ListUptimeCheckConfigsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The\n\t// [project](https://cloud.google.com/monitoring/api/v3#project_name) whose\n\t// Uptime check configurations are listed. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\tParent string `protobuf:\"bytes,1,opt,name=parent,proto3\" json:\"parent,omitempty\"`\n\t// If provided, this field specifies the criteria that must be met by\n\t// uptime checks to be included in the response.\n\t//\n\t// For more details, see [Filtering\n\t// syntax](https://cloud.google.com/monitoring/api/v3/sorting-and-filtering#filter_syntax).\n\tFilter string `protobuf:\"bytes,2,opt,name=filter,proto3\" json:\"filter,omitempty\"`\n\t// The maximum number of results to return in a single response. The server\n\t// may further constrain the maximum number of results returned in a single\n\t// page. If the page_size is <=0, the server will decide the number of results\n\t// to be returned.\n\tPageSize int32 `protobuf:\"varint,3,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\t// If this field is not empty then it must contain the `nextPageToken` value\n\t// returned by a previous call to this method.  Using this field causes the\n\t// method to return more results from the previous method call.\n\tPageToken string `protobuf:\"bytes,4,opt,name=page_token,json=pageToken,proto3\" json:\"page_token,omitempty\"`\n}\n\nfunc (x *ListUptimeCheckConfigsRequest) Reset() {\n\t*x = ListUptimeCheckConfigsRequest{}\n\tmi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListUptimeCheckConfigsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListUptimeCheckConfigsRequest) ProtoMessage() {}\n\nfunc (x *ListUptimeCheckConfigsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListUptimeCheckConfigsRequest.ProtoReflect.Descriptor instead.\nfunc (*ListUptimeCheckConfigsRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_service_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *ListUptimeCheckConfigsRequest) GetParent() string {\n\tif x != nil {\n\t\treturn x.Parent\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListUptimeCheckConfigsRequest) GetFilter() string {\n\tif x != nil {\n\t\treturn x.Filter\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListUptimeCheckConfigsRequest) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListUptimeCheckConfigsRequest) GetPageToken() string {\n\tif x != nil {\n\t\treturn x.PageToken\n\t}\n\treturn \"\"\n}\n\n// The protocol for the `ListUptimeCheckConfigs` response.\ntype ListUptimeCheckConfigsResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The returned Uptime check configurations.\n\tUptimeCheckConfigs []*UptimeCheckConfig `protobuf:\"bytes,1,rep,name=uptime_check_configs,json=uptimeCheckConfigs,proto3\" json:\"uptime_check_configs,omitempty\"`\n\t// This field represents the pagination token to retrieve the next page of\n\t// results. If the value is empty, it means no further results for the\n\t// request. To retrieve the next page of results, the value of the\n\t// next_page_token is passed to the subsequent List method call (in the\n\t// request message's page_token field).\n\tNextPageToken string `protobuf:\"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3\" json:\"next_page_token,omitempty\"`\n\t// The total number of Uptime check configurations for the project,\n\t// irrespective of any pagination.\n\tTotalSize int32 `protobuf:\"varint,3,opt,name=total_size,json=totalSize,proto3\" json:\"total_size,omitempty\"`\n}\n\nfunc (x *ListUptimeCheckConfigsResponse) Reset() {\n\t*x = ListUptimeCheckConfigsResponse{}\n\tmi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListUptimeCheckConfigsResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListUptimeCheckConfigsResponse) ProtoMessage() {}\n\nfunc (x *ListUptimeCheckConfigsResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListUptimeCheckConfigsResponse.ProtoReflect.Descriptor instead.\nfunc (*ListUptimeCheckConfigsResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_service_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *ListUptimeCheckConfigsResponse) GetUptimeCheckConfigs() []*UptimeCheckConfig {\n\tif x != nil {\n\t\treturn x.UptimeCheckConfigs\n\t}\n\treturn nil\n}\n\nfunc (x *ListUptimeCheckConfigsResponse) GetNextPageToken() string {\n\tif x != nil {\n\t\treturn x.NextPageToken\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListUptimeCheckConfigsResponse) GetTotalSize() int32 {\n\tif x != nil {\n\t\treturn x.TotalSize\n\t}\n\treturn 0\n}\n\n// The protocol for the `GetUptimeCheckConfig` request.\ntype GetUptimeCheckConfigRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The Uptime check configuration to retrieve. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/uptimeCheckConfigs/[UPTIME_CHECK_ID]\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *GetUptimeCheckConfigRequest) Reset() {\n\t*x = GetUptimeCheckConfigRequest{}\n\tmi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[2]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *GetUptimeCheckConfigRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetUptimeCheckConfigRequest) ProtoMessage() {}\n\nfunc (x *GetUptimeCheckConfigRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[2]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetUptimeCheckConfigRequest.ProtoReflect.Descriptor instead.\nfunc (*GetUptimeCheckConfigRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_service_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *GetUptimeCheckConfigRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\n// The protocol for the `CreateUptimeCheckConfig` request.\ntype CreateUptimeCheckConfigRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The\n\t// [project](https://cloud.google.com/monitoring/api/v3#project_name) in which\n\t// to create the Uptime check. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]\n\tParent string `protobuf:\"bytes,1,opt,name=parent,proto3\" json:\"parent,omitempty\"`\n\t// Required. The new Uptime check configuration.\n\tUptimeCheckConfig *UptimeCheckConfig `protobuf:\"bytes,2,opt,name=uptime_check_config,json=uptimeCheckConfig,proto3\" json:\"uptime_check_config,omitempty\"`\n}\n\nfunc (x *CreateUptimeCheckConfigRequest) Reset() {\n\t*x = CreateUptimeCheckConfigRequest{}\n\tmi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[3]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *CreateUptimeCheckConfigRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateUptimeCheckConfigRequest) ProtoMessage() {}\n\nfunc (x *CreateUptimeCheckConfigRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[3]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateUptimeCheckConfigRequest.ProtoReflect.Descriptor instead.\nfunc (*CreateUptimeCheckConfigRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_service_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *CreateUptimeCheckConfigRequest) GetParent() string {\n\tif x != nil {\n\t\treturn x.Parent\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateUptimeCheckConfigRequest) GetUptimeCheckConfig() *UptimeCheckConfig {\n\tif x != nil {\n\t\treturn x.UptimeCheckConfig\n\t}\n\treturn nil\n}\n\n// The protocol for the `UpdateUptimeCheckConfig` request.\ntype UpdateUptimeCheckConfigRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Optional. If present, only the listed fields in the current Uptime check\n\t// configuration are updated with values from the new configuration. If this\n\t// field is empty, then the current configuration is completely replaced with\n\t// the new configuration.\n\tUpdateMask *fieldmaskpb.FieldMask `protobuf:\"bytes,2,opt,name=update_mask,json=updateMask,proto3\" json:\"update_mask,omitempty\"`\n\t// Required. If an `updateMask` has been specified, this field gives\n\t// the values for the set of fields mentioned in the `updateMask`. If an\n\t// `updateMask` has not been given, this Uptime check configuration replaces\n\t// the current configuration. If a field is mentioned in `updateMask` but\n\t// the corresponding field is omitted in this partial Uptime check\n\t// configuration, it has the effect of deleting/clearing the field from the\n\t// configuration on the server.\n\t//\n\t// The following fields can be updated: `display_name`,\n\t// `http_check`, `tcp_check`, `timeout`, `content_matchers`, and\n\t// `selected_regions`.\n\tUptimeCheckConfig *UptimeCheckConfig `protobuf:\"bytes,3,opt,name=uptime_check_config,json=uptimeCheckConfig,proto3\" json:\"uptime_check_config,omitempty\"`\n}\n\nfunc (x *UpdateUptimeCheckConfigRequest) Reset() {\n\t*x = UpdateUptimeCheckConfigRequest{}\n\tmi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[4]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UpdateUptimeCheckConfigRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateUptimeCheckConfigRequest) ProtoMessage() {}\n\nfunc (x *UpdateUptimeCheckConfigRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[4]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateUptimeCheckConfigRequest.ProtoReflect.Descriptor instead.\nfunc (*UpdateUptimeCheckConfigRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_service_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *UpdateUptimeCheckConfigRequest) GetUpdateMask() *fieldmaskpb.FieldMask {\n\tif x != nil {\n\t\treturn x.UpdateMask\n\t}\n\treturn nil\n}\n\nfunc (x *UpdateUptimeCheckConfigRequest) GetUptimeCheckConfig() *UptimeCheckConfig {\n\tif x != nil {\n\t\treturn x.UptimeCheckConfig\n\t}\n\treturn nil\n}\n\n// The protocol for the `DeleteUptimeCheckConfig` request.\ntype DeleteUptimeCheckConfigRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The Uptime check configuration to delete. The format is:\n\t//\n\t//\tprojects/[PROJECT_ID_OR_NUMBER]/uptimeCheckConfigs/[UPTIME_CHECK_ID]\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n}\n\nfunc (x *DeleteUptimeCheckConfigRequest) Reset() {\n\t*x = DeleteUptimeCheckConfigRequest{}\n\tmi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[5]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *DeleteUptimeCheckConfigRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DeleteUptimeCheckConfigRequest) ProtoMessage() {}\n\nfunc (x *DeleteUptimeCheckConfigRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[5]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DeleteUptimeCheckConfigRequest.ProtoReflect.Descriptor instead.\nfunc (*DeleteUptimeCheckConfigRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_service_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *DeleteUptimeCheckConfigRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\n// The protocol for the `ListUptimeCheckIps` request.\ntype ListUptimeCheckIpsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The maximum number of results to return in a single response. The server\n\t// may further constrain the maximum number of results returned in a single\n\t// page. If the page_size is <=0, the server will decide the number of results\n\t// to be returned.\n\t// NOTE: this field is not yet implemented\n\tPageSize int32 `protobuf:\"varint,2,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\t// If this field is not empty then it must contain the `nextPageToken` value\n\t// returned by a previous call to this method.  Using this field causes the\n\t// method to return more results from the previous method call.\n\t// NOTE: this field is not yet implemented\n\tPageToken string `protobuf:\"bytes,3,opt,name=page_token,json=pageToken,proto3\" json:\"page_token,omitempty\"`\n}\n\nfunc (x *ListUptimeCheckIpsRequest) Reset() {\n\t*x = ListUptimeCheckIpsRequest{}\n\tmi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[6]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListUptimeCheckIpsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListUptimeCheckIpsRequest) ProtoMessage() {}\n\nfunc (x *ListUptimeCheckIpsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[6]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListUptimeCheckIpsRequest.ProtoReflect.Descriptor instead.\nfunc (*ListUptimeCheckIpsRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_service_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *ListUptimeCheckIpsRequest) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListUptimeCheckIpsRequest) GetPageToken() string {\n\tif x != nil {\n\t\treturn x.PageToken\n\t}\n\treturn \"\"\n}\n\n// The protocol for the `ListUptimeCheckIps` response.\ntype ListUptimeCheckIpsResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The returned list of IP addresses (including region and location) that the\n\t// checkers run from.\n\tUptimeCheckIps []*UptimeCheckIp `protobuf:\"bytes,1,rep,name=uptime_check_ips,json=uptimeCheckIps,proto3\" json:\"uptime_check_ips,omitempty\"`\n\t// This field represents the pagination token to retrieve the next page of\n\t// results. If the value is empty, it means no further results for the\n\t// request. To retrieve the next page of results, the value of the\n\t// next_page_token is passed to the subsequent List method call (in the\n\t// request message's page_token field).\n\t// NOTE: this field is not yet implemented\n\tNextPageToken string `protobuf:\"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3\" json:\"next_page_token,omitempty\"`\n}\n\nfunc (x *ListUptimeCheckIpsResponse) Reset() {\n\t*x = ListUptimeCheckIpsResponse{}\n\tmi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[7]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListUptimeCheckIpsResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListUptimeCheckIpsResponse) ProtoMessage() {}\n\nfunc (x *ListUptimeCheckIpsResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[7]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListUptimeCheckIpsResponse.ProtoReflect.Descriptor instead.\nfunc (*ListUptimeCheckIpsResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_monitoring_v3_uptime_service_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ListUptimeCheckIpsResponse) GetUptimeCheckIps() []*UptimeCheckIp {\n\tif x != nil {\n\t\treturn x.UptimeCheckIps\n\t}\n\treturn nil\n}\n\nfunc (x *ListUptimeCheckIpsResponse) GetNextPageToken() string {\n\tif x != nil {\n\t\treturn x.NextPageToken\n\t}\n\treturn \"\"\n}\n\nvar File_google_monitoring_v3_uptime_service_proto protoreflect.FileDescriptor\n\nvar file_google_monitoring_v3_uptime_service_proto_rawDesc = []byte{\n\t0x0a, 0x29, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65,\n\t0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e,\n\t0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65,\n\t0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76,\n\t0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d,\n\t0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f,\n\t0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc0, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x55,\n\t0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,\n\t0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65,\n\t0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x33, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2d,\n\t0x12, 0x2b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x55, 0x70, 0x74, 0x69,\n\t0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x70,\n\t0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a,\n\t0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05,\n\t0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61,\n\t0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,\n\t0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xc2, 0x01, 0x0a, 0x1e, 0x4c, 0x69,\n\t0x73, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e,\n\t0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, 0x0a, 0x14,\n\t0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e,\n\t0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76,\n\t0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e,\n\t0x66, 0x69, 0x67, 0x52, 0x12, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b,\n\t0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f,\n\t0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12,\n\t0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20,\n\t0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x66,\n\t0x0a, 0x1b, 0x47, 0x65, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b,\n\t0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x33, 0xe0, 0x41, 0x02,\n\t0xfa, 0x41, 0x2d, 0x0a, 0x2b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x55,\n\t0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,\n\t0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xcb, 0x01, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74,\n\t0x65, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66,\n\t0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x06, 0x70, 0x61, 0x72,\n\t0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x33, 0xe0, 0x41, 0x02, 0xfa, 0x41,\n\t0x2d, 0x12, 0x2b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x55, 0x70, 0x74,\n\t0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06,\n\t0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x5c, 0x0a, 0x13, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65,\n\t0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d,\n\t0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x03, 0xe0, 0x41,\n\t0x02, 0x52, 0x11, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f,\n\t0x6e, 0x66, 0x69, 0x67, 0x22, 0xbb, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55,\n\t0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74,\n\t0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,\n\t0x4d, 0x61, 0x73, 0x6b, 0x12, 0x5c, 0x0a, 0x13, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63,\n\t0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43,\n\t0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52,\n\t0x11, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66,\n\t0x69, 0x67, 0x22, 0x69, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x70, 0x74, 0x69,\n\t0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x33, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2d, 0x0a, 0x2b, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69,\n\t0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63,\n\t0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x57, 0x0a,\n\t0x19, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b,\n\t0x49, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61,\n\t0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70,\n\t0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f,\n\t0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67,\n\t0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x55,\n\t0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x70, 0x73, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x10, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f,\n\t0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,\n\t0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65,\n\t0x63, 0x6b, 0x49, 0x70, 0x52, 0x0e, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63,\n\t0x6b, 0x49, 0x70, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67,\n\t0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e,\n\t0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x32, 0xbd, 0x0a, 0x0a,\n\t0x12, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x72, 0x76,\n\t0x69, 0x63, 0x65, 0x12, 0xc0, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x74, 0x69,\n\t0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x33,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,\n\t0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65,\n\t0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55,\n\t0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,\n\t0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0xda, 0x41, 0x06, 0x70, 0x61,\n\t0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x76, 0x33, 0x2f,\n\t0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73,\n\t0x2f, 0x2a, 0x7d, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43,\n\t0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0xad, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x55, 0x70,\n\t0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12,\n\t0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65,\n\t0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65,\n\t0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x39, 0xda, 0x41, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x76, 0x33, 0x2f,\n\t0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a,\n\t0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66,\n\t0x69, 0x67, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xde, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74,\n\t0x65, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66,\n\t0x69, 0x67, 0x12, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,\n\t0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69,\n\t0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e,\n\t0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69,\n\t0x67, 0x22, 0x64, 0xda, 0x41, 0x1a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x75, 0x70, 0x74,\n\t0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,\n\t0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x3a, 0x13, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63,\n\t0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x2a, 0x2f, 0x76, 0x33,\n\t0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,\n\t0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b,\n\t0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0xeb, 0x01, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61,\n\t0x74, 0x65, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e,\n\t0x66, 0x69, 0x67, 0x12, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74,\n\t0x65, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66,\n\t0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33,\n\t0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66,\n\t0x69, 0x67, 0x22, 0x71, 0xda, 0x41, 0x13, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68,\n\t0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x55,\n\t0x3a, 0x13, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63,\n\t0x6f, 0x6e, 0x66, 0x69, 0x67, 0x32, 0x3e, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x75, 0x70, 0x74, 0x69,\n\t0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,\n\t0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f,\n\t0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69,\n\t0x67, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xa2, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,\n\t0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69,\n\t0x67, 0x12, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55,\n\t0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,\n\t0x39, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x2a, 0x2a,\n\t0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,\n\t0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b,\n\t0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x93, 0x01, 0x0a, 0x12, 0x4c,\n\t0x69, 0x73, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x70,\n\t0x73, 0x12, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,\n\t0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x74,\n\t0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70,\n\t0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70,\n\t0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x76,\n\t0x33, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x70, 0x73,\n\t0x1a, 0xa9, 0x01, 0xca, 0x41, 0x19, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2,\n\t0x41, 0x89, 0x01, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75,\n\t0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,\n\t0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74,\n\t0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x68, 0x74, 0x74,\n\t0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,\n\t0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e,\n\t0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x42, 0xcd, 0x01, 0x0a,\n\t0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,\n\t0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x12, 0x55, 0x70, 0x74, 0x69, 0x6d,\n\t0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a,\n\t0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f,\n\t0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,\n\t0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,\n\t0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75,\n\t0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca,\n\t0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d,\n\t0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f,\n\t0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_monitoring_v3_uptime_service_proto_rawDescOnce sync.Once\n\tfile_google_monitoring_v3_uptime_service_proto_rawDescData = file_google_monitoring_v3_uptime_service_proto_rawDesc\n)\n\nfunc file_google_monitoring_v3_uptime_service_proto_rawDescGZIP() []byte {\n\tfile_google_monitoring_v3_uptime_service_proto_rawDescOnce.Do(func() {\n\t\tfile_google_monitoring_v3_uptime_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_uptime_service_proto_rawDescData)\n\t})\n\treturn file_google_monitoring_v3_uptime_service_proto_rawDescData\n}\n\nvar file_google_monitoring_v3_uptime_service_proto_msgTypes = make([]protoimpl.MessageInfo, 8)\nvar file_google_monitoring_v3_uptime_service_proto_goTypes = []any{\n\t(*ListUptimeCheckConfigsRequest)(nil),  // 0: google.monitoring.v3.ListUptimeCheckConfigsRequest\n\t(*ListUptimeCheckConfigsResponse)(nil), // 1: google.monitoring.v3.ListUptimeCheckConfigsResponse\n\t(*GetUptimeCheckConfigRequest)(nil),    // 2: google.monitoring.v3.GetUptimeCheckConfigRequest\n\t(*CreateUptimeCheckConfigRequest)(nil), // 3: google.monitoring.v3.CreateUptimeCheckConfigRequest\n\t(*UpdateUptimeCheckConfigRequest)(nil), // 4: google.monitoring.v3.UpdateUptimeCheckConfigRequest\n\t(*DeleteUptimeCheckConfigRequest)(nil), // 5: google.monitoring.v3.DeleteUptimeCheckConfigRequest\n\t(*ListUptimeCheckIpsRequest)(nil),      // 6: google.monitoring.v3.ListUptimeCheckIpsRequest\n\t(*ListUptimeCheckIpsResponse)(nil),     // 7: google.monitoring.v3.ListUptimeCheckIpsResponse\n\t(*UptimeCheckConfig)(nil),              // 8: google.monitoring.v3.UptimeCheckConfig\n\t(*fieldmaskpb.FieldMask)(nil),          // 9: google.protobuf.FieldMask\n\t(*UptimeCheckIp)(nil),                  // 10: google.monitoring.v3.UptimeCheckIp\n\t(*emptypb.Empty)(nil),                  // 11: google.protobuf.Empty\n}\nvar file_google_monitoring_v3_uptime_service_proto_depIdxs = []int32{\n\t8,  // 0: google.monitoring.v3.ListUptimeCheckConfigsResponse.uptime_check_configs:type_name -> google.monitoring.v3.UptimeCheckConfig\n\t8,  // 1: google.monitoring.v3.CreateUptimeCheckConfigRequest.uptime_check_config:type_name -> google.monitoring.v3.UptimeCheckConfig\n\t9,  // 2: google.monitoring.v3.UpdateUptimeCheckConfigRequest.update_mask:type_name -> google.protobuf.FieldMask\n\t8,  // 3: google.monitoring.v3.UpdateUptimeCheckConfigRequest.uptime_check_config:type_name -> google.monitoring.v3.UptimeCheckConfig\n\t10, // 4: google.monitoring.v3.ListUptimeCheckIpsResponse.uptime_check_ips:type_name -> google.monitoring.v3.UptimeCheckIp\n\t0,  // 5: google.monitoring.v3.UptimeCheckService.ListUptimeCheckConfigs:input_type -> google.monitoring.v3.ListUptimeCheckConfigsRequest\n\t2,  // 6: google.monitoring.v3.UptimeCheckService.GetUptimeCheckConfig:input_type -> google.monitoring.v3.GetUptimeCheckConfigRequest\n\t3,  // 7: google.monitoring.v3.UptimeCheckService.CreateUptimeCheckConfig:input_type -> google.monitoring.v3.CreateUptimeCheckConfigRequest\n\t4,  // 8: google.monitoring.v3.UptimeCheckService.UpdateUptimeCheckConfig:input_type -> google.monitoring.v3.UpdateUptimeCheckConfigRequest\n\t5,  // 9: google.monitoring.v3.UptimeCheckService.DeleteUptimeCheckConfig:input_type -> google.monitoring.v3.DeleteUptimeCheckConfigRequest\n\t6,  // 10: google.monitoring.v3.UptimeCheckService.ListUptimeCheckIps:input_type -> google.monitoring.v3.ListUptimeCheckIpsRequest\n\t1,  // 11: google.monitoring.v3.UptimeCheckService.ListUptimeCheckConfigs:output_type -> google.monitoring.v3.ListUptimeCheckConfigsResponse\n\t8,  // 12: google.monitoring.v3.UptimeCheckService.GetUptimeCheckConfig:output_type -> google.monitoring.v3.UptimeCheckConfig\n\t8,  // 13: google.monitoring.v3.UptimeCheckService.CreateUptimeCheckConfig:output_type -> google.monitoring.v3.UptimeCheckConfig\n\t8,  // 14: google.monitoring.v3.UptimeCheckService.UpdateUptimeCheckConfig:output_type -> google.monitoring.v3.UptimeCheckConfig\n\t11, // 15: google.monitoring.v3.UptimeCheckService.DeleteUptimeCheckConfig:output_type -> google.protobuf.Empty\n\t7,  // 16: google.monitoring.v3.UptimeCheckService.ListUptimeCheckIps:output_type -> google.monitoring.v3.ListUptimeCheckIpsResponse\n\t11, // [11:17] is the sub-list for method output_type\n\t5,  // [5:11] is the sub-list for method input_type\n\t5,  // [5:5] is the sub-list for extension type_name\n\t5,  // [5:5] is the sub-list for extension extendee\n\t0,  // [0:5] is the sub-list for field type_name\n}\n\nfunc init() { file_google_monitoring_v3_uptime_service_proto_init() }\nfunc file_google_monitoring_v3_uptime_service_proto_init() {\n\tif File_google_monitoring_v3_uptime_service_proto != nil {\n\t\treturn\n\t}\n\tfile_google_monitoring_v3_uptime_proto_init()\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_monitoring_v3_uptime_service_proto_rawDesc,\n\t\t\tNumEnums:      0,\n\t\t\tNumMessages:   8,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_google_monitoring_v3_uptime_service_proto_goTypes,\n\t\tDependencyIndexes: file_google_monitoring_v3_uptime_service_proto_depIdxs,\n\t\tMessageInfos:      file_google_monitoring_v3_uptime_service_proto_msgTypes,\n\t}.Build()\n\tFile_google_monitoring_v3_uptime_service_proto = out.File\n\tfile_google_monitoring_v3_uptime_service_proto_rawDesc = nil\n\tfile_google_monitoring_v3_uptime_service_proto_goTypes = nil\n\tfile_google_monitoring_v3_uptime_service_proto_depIdxs = nil\n}\n\n// Reference imports to suppress errors if they are not otherwise used.\nvar _ context.Context\nvar _ grpc.ClientConnInterface\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\nconst _ = grpc.SupportPackageIsVersion6\n\n// UptimeCheckServiceClient is the client API for UptimeCheckService service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.\ntype UptimeCheckServiceClient interface {\n\t// Lists the existing valid Uptime check configurations for the project\n\t// (leaving out any invalid configurations).\n\tListUptimeCheckConfigs(ctx context.Context, in *ListUptimeCheckConfigsRequest, opts ...grpc.CallOption) (*ListUptimeCheckConfigsResponse, error)\n\t// Gets a single Uptime check configuration.\n\tGetUptimeCheckConfig(ctx context.Context, in *GetUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error)\n\t// Creates a new Uptime check configuration.\n\tCreateUptimeCheckConfig(ctx context.Context, in *CreateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error)\n\t// Updates an Uptime check configuration. You can either replace the entire\n\t// configuration with a new one or replace only certain fields in the current\n\t// configuration by specifying the fields to be updated via `updateMask`.\n\t// Returns the updated configuration.\n\tUpdateUptimeCheckConfig(ctx context.Context, in *UpdateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error)\n\t// Deletes an Uptime check configuration. Note that this method will fail\n\t// if the Uptime check configuration is referenced by an alert policy or\n\t// other dependent configs that would be rendered invalid by the deletion.\n\tDeleteUptimeCheckConfig(ctx context.Context, in *DeleteUptimeCheckConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\t// Returns the list of IP addresses that checkers run from.\n\tListUptimeCheckIps(ctx context.Context, in *ListUptimeCheckIpsRequest, opts ...grpc.CallOption) (*ListUptimeCheckIpsResponse, error)\n}\n\ntype uptimeCheckServiceClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewUptimeCheckServiceClient(cc grpc.ClientConnInterface) UptimeCheckServiceClient {\n\treturn &uptimeCheckServiceClient{cc}\n}\n\nfunc (c *uptimeCheckServiceClient) ListUptimeCheckConfigs(ctx context.Context, in *ListUptimeCheckConfigsRequest, opts ...grpc.CallOption) (*ListUptimeCheckConfigsResponse, error) {\n\tout := new(ListUptimeCheckConfigsResponse)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.UptimeCheckService/ListUptimeCheckConfigs\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *uptimeCheckServiceClient) GetUptimeCheckConfig(ctx context.Context, in *GetUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) {\n\tout := new(UptimeCheckConfig)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.UptimeCheckService/GetUptimeCheckConfig\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *uptimeCheckServiceClient) CreateUptimeCheckConfig(ctx context.Context, in *CreateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) {\n\tout := new(UptimeCheckConfig)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.UptimeCheckService/CreateUptimeCheckConfig\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *uptimeCheckServiceClient) UpdateUptimeCheckConfig(ctx context.Context, in *UpdateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) {\n\tout := new(UptimeCheckConfig)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.UptimeCheckService/UpdateUptimeCheckConfig\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *uptimeCheckServiceClient) DeleteUptimeCheckConfig(ctx context.Context, in *DeleteUptimeCheckConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.UptimeCheckService/DeleteUptimeCheckConfig\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *uptimeCheckServiceClient) ListUptimeCheckIps(ctx context.Context, in *ListUptimeCheckIpsRequest, opts ...grpc.CallOption) (*ListUptimeCheckIpsResponse, error) {\n\tout := new(ListUptimeCheckIpsResponse)\n\terr := c.cc.Invoke(ctx, \"/google.monitoring.v3.UptimeCheckService/ListUptimeCheckIps\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// UptimeCheckServiceServer is the server API for UptimeCheckService service.\ntype UptimeCheckServiceServer interface {\n\t// Lists the existing valid Uptime check configurations for the project\n\t// (leaving out any invalid configurations).\n\tListUptimeCheckConfigs(context.Context, *ListUptimeCheckConfigsRequest) (*ListUptimeCheckConfigsResponse, error)\n\t// Gets a single Uptime check configuration.\n\tGetUptimeCheckConfig(context.Context, *GetUptimeCheckConfigRequest) (*UptimeCheckConfig, error)\n\t// Creates a new Uptime check configuration.\n\tCreateUptimeCheckConfig(context.Context, *CreateUptimeCheckConfigRequest) (*UptimeCheckConfig, error)\n\t// Updates an Uptime check configuration. You can either replace the entire\n\t// configuration with a new one or replace only certain fields in the current\n\t// configuration by specifying the fields to be updated via `updateMask`.\n\t// Returns the updated configuration.\n\tUpdateUptimeCheckConfig(context.Context, *UpdateUptimeCheckConfigRequest) (*UptimeCheckConfig, error)\n\t// Deletes an Uptime check configuration. Note that this method will fail\n\t// if the Uptime check configuration is referenced by an alert policy or\n\t// other dependent configs that would be rendered invalid by the deletion.\n\tDeleteUptimeCheckConfig(context.Context, *DeleteUptimeCheckConfigRequest) (*emptypb.Empty, error)\n\t// Returns the list of IP addresses that checkers run from.\n\tListUptimeCheckIps(context.Context, *ListUptimeCheckIpsRequest) (*ListUptimeCheckIpsResponse, error)\n}\n\n// UnimplementedUptimeCheckServiceServer can be embedded to have forward compatible implementations.\ntype UnimplementedUptimeCheckServiceServer struct {\n}\n\nfunc (*UnimplementedUptimeCheckServiceServer) ListUptimeCheckConfigs(context.Context, *ListUptimeCheckConfigsRequest) (*ListUptimeCheckConfigsResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListUptimeCheckConfigs not implemented\")\n}\nfunc (*UnimplementedUptimeCheckServiceServer) GetUptimeCheckConfig(context.Context, *GetUptimeCheckConfigRequest) (*UptimeCheckConfig, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method GetUptimeCheckConfig not implemented\")\n}\nfunc (*UnimplementedUptimeCheckServiceServer) CreateUptimeCheckConfig(context.Context, *CreateUptimeCheckConfigRequest) (*UptimeCheckConfig, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method CreateUptimeCheckConfig not implemented\")\n}\nfunc (*UnimplementedUptimeCheckServiceServer) UpdateUptimeCheckConfig(context.Context, *UpdateUptimeCheckConfigRequest) (*UptimeCheckConfig, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method UpdateUptimeCheckConfig not implemented\")\n}\nfunc (*UnimplementedUptimeCheckServiceServer) DeleteUptimeCheckConfig(context.Context, *DeleteUptimeCheckConfigRequest) (*emptypb.Empty, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method DeleteUptimeCheckConfig not implemented\")\n}\nfunc (*UnimplementedUptimeCheckServiceServer) ListUptimeCheckIps(context.Context, *ListUptimeCheckIpsRequest) (*ListUptimeCheckIpsResponse, error) {\n\treturn nil, status.Errorf(codes.Unimplemented, \"method ListUptimeCheckIps not implemented\")\n}\n\nfunc RegisterUptimeCheckServiceServer(s *grpc.Server, srv UptimeCheckServiceServer) {\n\ts.RegisterService(&_UptimeCheckService_serviceDesc, srv)\n}\n\nfunc _UptimeCheckService_ListUptimeCheckConfigs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListUptimeCheckConfigsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UptimeCheckServiceServer).ListUptimeCheckConfigs(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.UptimeCheckService/ListUptimeCheckConfigs\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UptimeCheckServiceServer).ListUptimeCheckConfigs(ctx, req.(*ListUptimeCheckConfigsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _UptimeCheckService_GetUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetUptimeCheckConfigRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UptimeCheckServiceServer).GetUptimeCheckConfig(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.UptimeCheckService/GetUptimeCheckConfig\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UptimeCheckServiceServer).GetUptimeCheckConfig(ctx, req.(*GetUptimeCheckConfigRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _UptimeCheckService_CreateUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateUptimeCheckConfigRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UptimeCheckServiceServer).CreateUptimeCheckConfig(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.UptimeCheckService/CreateUptimeCheckConfig\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UptimeCheckServiceServer).CreateUptimeCheckConfig(ctx, req.(*CreateUptimeCheckConfigRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _UptimeCheckService_UpdateUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateUptimeCheckConfigRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UptimeCheckServiceServer).UpdateUptimeCheckConfig(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.UptimeCheckService/UpdateUptimeCheckConfig\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UptimeCheckServiceServer).UpdateUptimeCheckConfig(ctx, req.(*UpdateUptimeCheckConfigRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _UptimeCheckService_DeleteUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(DeleteUptimeCheckConfigRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UptimeCheckServiceServer).DeleteUptimeCheckConfig(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.UptimeCheckService/DeleteUptimeCheckConfig\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UptimeCheckServiceServer).DeleteUptimeCheckConfig(ctx, req.(*DeleteUptimeCheckConfigRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _UptimeCheckService_ListUptimeCheckIps_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListUptimeCheckIpsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(UptimeCheckServiceServer).ListUptimeCheckIps(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.monitoring.v3.UptimeCheckService/ListUptimeCheckIps\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(UptimeCheckServiceServer).ListUptimeCheckIps(ctx, req.(*ListUptimeCheckIpsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nvar _UptimeCheckService_serviceDesc = grpc.ServiceDesc{\n\tServiceName: \"google.monitoring.v3.UptimeCheckService\",\n\tHandlerType: (*UptimeCheckServiceServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"ListUptimeCheckConfigs\",\n\t\t\tHandler:    _UptimeCheckService_ListUptimeCheckConfigs_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetUptimeCheckConfig\",\n\t\t\tHandler:    _UptimeCheckService_GetUptimeCheckConfig_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateUptimeCheckConfig\",\n\t\t\tHandler:    _UptimeCheckService_CreateUptimeCheckConfig_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateUptimeCheckConfig\",\n\t\t\tHandler:    _UptimeCheckService_UpdateUptimeCheckConfig_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteUptimeCheckConfig\",\n\t\t\tHandler:    _UptimeCheckService_DeleteUptimeCheckConfig_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListUptimeCheckIps\",\n\t\t\tHandler:    _UptimeCheckService_ListUptimeCheckIps_Handler,\n\t\t},\n\t},\n\tStreams:  []grpc.StreamDesc{},\n\tMetadata: \"google/monitoring/v3/uptime_service.proto\",\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/notification_channel_client.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go_gapic. DO NOT EDIT.\n\npackage monitoring\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"math\"\n\t\"net/url\"\n\t\"time\"\n\n\tmonitoringpb \"cloud.google.com/go/monitoring/apiv3/v2/monitoringpb\"\n\tgax \"github.com/googleapis/gax-go/v2\"\n\t\"google.golang.org/api/iterator\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/api/option/internaloption\"\n\tgtransport \"google.golang.org/api/transport/grpc\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\nvar newNotificationChannelClientHook clientHook\n\n// NotificationChannelCallOptions contains the retry settings for each method of NotificationChannelClient.\ntype NotificationChannelCallOptions struct {\n\tListNotificationChannelDescriptors      []gax.CallOption\n\tGetNotificationChannelDescriptor        []gax.CallOption\n\tListNotificationChannels                []gax.CallOption\n\tGetNotificationChannel                  []gax.CallOption\n\tCreateNotificationChannel               []gax.CallOption\n\tUpdateNotificationChannel               []gax.CallOption\n\tDeleteNotificationChannel               []gax.CallOption\n\tSendNotificationChannelVerificationCode []gax.CallOption\n\tGetNotificationChannelVerificationCode  []gax.CallOption\n\tVerifyNotificationChannel               []gax.CallOption\n}\n\nfunc defaultNotificationChannelGRPCClientOptions() []option.ClientOption {\n\treturn []option.ClientOption{\n\t\tinternaloption.WithDefaultEndpoint(\"monitoring.googleapis.com:443\"),\n\t\tinternaloption.WithDefaultEndpointTemplate(\"monitoring.UNIVERSE_DOMAIN:443\"),\n\t\tinternaloption.WithDefaultMTLSEndpoint(\"monitoring.mtls.googleapis.com:443\"),\n\t\tinternaloption.WithDefaultUniverseDomain(\"googleapis.com\"),\n\t\tinternaloption.WithDefaultAudience(\"https://monitoring.googleapis.com/\"),\n\t\tinternaloption.WithDefaultScopes(DefaultAuthScopes()...),\n\t\tinternaloption.EnableJwtWithScope(),\n\t\tinternaloption.EnableNewAuthLibrary(),\n\t\toption.WithGRPCDialOption(grpc.WithDefaultCallOptions(\n\t\t\tgrpc.MaxCallRecvMsgSize(math.MaxInt32))),\n\t}\n}\n\nfunc defaultNotificationChannelCallOptions() *NotificationChannelCallOptions {\n\treturn &NotificationChannelCallOptions{\n\t\tListNotificationChannelDescriptors: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tGetNotificationChannelDescriptor: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tListNotificationChannels: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tGetNotificationChannel: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tCreateNotificationChannel: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t},\n\t\tUpdateNotificationChannel: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t},\n\t\tDeleteNotificationChannel: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tSendNotificationChannelVerificationCode: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t},\n\t\tGetNotificationChannelVerificationCode: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tVerifyNotificationChannel: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t}\n}\n\n// internalNotificationChannelClient is an interface that defines the methods available from Cloud Monitoring API.\ntype internalNotificationChannelClient interface {\n\tClose() error\n\tsetGoogleClientInfo(...string)\n\tConnection() *grpc.ClientConn\n\tListNotificationChannelDescriptors(context.Context, *monitoringpb.ListNotificationChannelDescriptorsRequest, ...gax.CallOption) *NotificationChannelDescriptorIterator\n\tGetNotificationChannelDescriptor(context.Context, *monitoringpb.GetNotificationChannelDescriptorRequest, ...gax.CallOption) (*monitoringpb.NotificationChannelDescriptor, error)\n\tListNotificationChannels(context.Context, *monitoringpb.ListNotificationChannelsRequest, ...gax.CallOption) *NotificationChannelIterator\n\tGetNotificationChannel(context.Context, *monitoringpb.GetNotificationChannelRequest, ...gax.CallOption) (*monitoringpb.NotificationChannel, error)\n\tCreateNotificationChannel(context.Context, *monitoringpb.CreateNotificationChannelRequest, ...gax.CallOption) (*monitoringpb.NotificationChannel, error)\n\tUpdateNotificationChannel(context.Context, *monitoringpb.UpdateNotificationChannelRequest, ...gax.CallOption) (*monitoringpb.NotificationChannel, error)\n\tDeleteNotificationChannel(context.Context, *monitoringpb.DeleteNotificationChannelRequest, ...gax.CallOption) error\n\tSendNotificationChannelVerificationCode(context.Context, *monitoringpb.SendNotificationChannelVerificationCodeRequest, ...gax.CallOption) error\n\tGetNotificationChannelVerificationCode(context.Context, *monitoringpb.GetNotificationChannelVerificationCodeRequest, ...gax.CallOption) (*monitoringpb.GetNotificationChannelVerificationCodeResponse, error)\n\tVerifyNotificationChannel(context.Context, *monitoringpb.VerifyNotificationChannelRequest, ...gax.CallOption) (*monitoringpb.NotificationChannel, error)\n}\n\n// NotificationChannelClient is a client for interacting with Cloud Monitoring API.\n// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.\n//\n// The Notification Channel API provides access to configuration that\n// controls how messages related to incidents are sent.\ntype NotificationChannelClient struct {\n\t// The internal transport-dependent client.\n\tinternalClient internalNotificationChannelClient\n\n\t// The call options for this service.\n\tCallOptions *NotificationChannelCallOptions\n}\n\n// Wrapper methods routed to the internal client.\n\n// Close closes the connection to the API service. The user should invoke this when\n// the client is no longer required.\nfunc (c *NotificationChannelClient) Close() error {\n\treturn c.internalClient.Close()\n}\n\n// setGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Intended for\n// use by Google-written clients.\nfunc (c *NotificationChannelClient) setGoogleClientInfo(keyval ...string) {\n\tc.internalClient.setGoogleClientInfo(keyval...)\n}\n\n// Connection returns a connection to the API service.\n//\n// Deprecated: Connections are now pooled so this method does not always\n// return the same resource.\nfunc (c *NotificationChannelClient) Connection() *grpc.ClientConn {\n\treturn c.internalClient.Connection()\n}\n\n// ListNotificationChannelDescriptors lists the descriptors for supported channel types. The use of descriptors\n// makes it possible for new channel types to be dynamically added.\nfunc (c *NotificationChannelClient) ListNotificationChannelDescriptors(ctx context.Context, req *monitoringpb.ListNotificationChannelDescriptorsRequest, opts ...gax.CallOption) *NotificationChannelDescriptorIterator {\n\treturn c.internalClient.ListNotificationChannelDescriptors(ctx, req, opts...)\n}\n\n// GetNotificationChannelDescriptor gets a single channel descriptor. The descriptor indicates which fields\n// are expected / permitted for a notification channel of the given type.\nfunc (c *NotificationChannelClient) GetNotificationChannelDescriptor(ctx context.Context, req *monitoringpb.GetNotificationChannelDescriptorRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannelDescriptor, error) {\n\treturn c.internalClient.GetNotificationChannelDescriptor(ctx, req, opts...)\n}\n\n// ListNotificationChannels lists the notification channels that have been created for the project.\n// To list the types of notification channels that are supported, use\n// the ListNotificationChannelDescriptors method.\nfunc (c *NotificationChannelClient) ListNotificationChannels(ctx context.Context, req *monitoringpb.ListNotificationChannelsRequest, opts ...gax.CallOption) *NotificationChannelIterator {\n\treturn c.internalClient.ListNotificationChannels(ctx, req, opts...)\n}\n\n// GetNotificationChannel gets a single notification channel. The channel includes the relevant\n// configuration details with which the channel was created. However, the\n// response may truncate or omit passwords, API keys, or other private key\n// matter and thus the response may not be 100% identical to the information\n// that was supplied in the call to the create method.\nfunc (c *NotificationChannelClient) GetNotificationChannel(ctx context.Context, req *monitoringpb.GetNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) {\n\treturn c.internalClient.GetNotificationChannel(ctx, req, opts...)\n}\n\n// CreateNotificationChannel creates a new notification channel, representing a single notification\n// endpoint such as an email address, SMS number, or PagerDuty service.\n//\n// Design your application to single-thread API calls that modify the state of\n// notification channels in a single project. This includes calls to\n// CreateNotificationChannel, DeleteNotificationChannel and\n// UpdateNotificationChannel.\nfunc (c *NotificationChannelClient) CreateNotificationChannel(ctx context.Context, req *monitoringpb.CreateNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) {\n\treturn c.internalClient.CreateNotificationChannel(ctx, req, opts...)\n}\n\n// UpdateNotificationChannel updates a notification channel. Fields not specified in the field mask\n// remain unchanged.\n//\n// Design your application to single-thread API calls that modify the state of\n// notification channels in a single project. This includes calls to\n// CreateNotificationChannel, DeleteNotificationChannel and\n// UpdateNotificationChannel.\nfunc (c *NotificationChannelClient) UpdateNotificationChannel(ctx context.Context, req *monitoringpb.UpdateNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) {\n\treturn c.internalClient.UpdateNotificationChannel(ctx, req, opts...)\n}\n\n// DeleteNotificationChannel deletes a notification channel.\n//\n// Design your application to single-thread API calls that modify the state of\n// notification channels in a single project. This includes calls to\n// CreateNotificationChannel, DeleteNotificationChannel and\n// UpdateNotificationChannel.\nfunc (c *NotificationChannelClient) DeleteNotificationChannel(ctx context.Context, req *monitoringpb.DeleteNotificationChannelRequest, opts ...gax.CallOption) error {\n\treturn c.internalClient.DeleteNotificationChannel(ctx, req, opts...)\n}\n\n// SendNotificationChannelVerificationCode causes a verification code to be delivered to the channel. The code\n// can then be supplied in VerifyNotificationChannel to verify the channel.\nfunc (c *NotificationChannelClient) SendNotificationChannelVerificationCode(ctx context.Context, req *monitoringpb.SendNotificationChannelVerificationCodeRequest, opts ...gax.CallOption) error {\n\treturn c.internalClient.SendNotificationChannelVerificationCode(ctx, req, opts...)\n}\n\n// GetNotificationChannelVerificationCode requests a verification code for an already verified channel that can then\n// be used in a call to VerifyNotificationChannel() on a different channel\n// with an equivalent identity in the same or in a different project. This\n// makes it possible to copy a channel between projects without requiring\n// manual reverification of the channel. If the channel is not in the\n// verified state, this method will fail (in other words, this may only be\n// used if the SendNotificationChannelVerificationCode and\n// VerifyNotificationChannel paths have already been used to put the given\n// channel into the verified state).\n//\n// There is no guarantee that the verification codes returned by this method\n// will be of a similar structure or form as the ones that are delivered\n// to the channel via SendNotificationChannelVerificationCode; while\n// VerifyNotificationChannel() will recognize both the codes delivered via\n// SendNotificationChannelVerificationCode() and returned from\n// GetNotificationChannelVerificationCode(), it is typically the case that\n// the verification codes delivered via\n// SendNotificationChannelVerificationCode() will be shorter and also\n// have a shorter expiration (e.g. codes such as “G-123456”) whereas\n// GetVerificationCode() will typically return a much longer, websafe base\n// 64 encoded string that has a longer expiration time.\nfunc (c *NotificationChannelClient) GetNotificationChannelVerificationCode(ctx context.Context, req *monitoringpb.GetNotificationChannelVerificationCodeRequest, opts ...gax.CallOption) (*monitoringpb.GetNotificationChannelVerificationCodeResponse, error) {\n\treturn c.internalClient.GetNotificationChannelVerificationCode(ctx, req, opts...)\n}\n\n// VerifyNotificationChannel verifies a NotificationChannel by proving receipt of the code\n// delivered to the channel as a result of calling\n// SendNotificationChannelVerificationCode.\nfunc (c *NotificationChannelClient) VerifyNotificationChannel(ctx context.Context, req *monitoringpb.VerifyNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) {\n\treturn c.internalClient.VerifyNotificationChannel(ctx, req, opts...)\n}\n\n// notificationChannelGRPCClient is a client for interacting with Cloud Monitoring API over gRPC transport.\n//\n// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.\ntype notificationChannelGRPCClient struct {\n\t// Connection pool of gRPC connections to the service.\n\tconnPool gtransport.ConnPool\n\n\t// Points back to the CallOptions field of the containing NotificationChannelClient\n\tCallOptions **NotificationChannelCallOptions\n\n\t// The gRPC API client.\n\tnotificationChannelClient monitoringpb.NotificationChannelServiceClient\n\n\t// The x-goog-* metadata to be sent with each request.\n\txGoogHeaders []string\n\n\tlogger *slog.Logger\n}\n\n// NewNotificationChannelClient creates a new notification channel service client based on gRPC.\n// The returned client must be Closed when it is done being used to clean up its underlying connections.\n//\n// The Notification Channel API provides access to configuration that\n// controls how messages related to incidents are sent.\nfunc NewNotificationChannelClient(ctx context.Context, opts ...option.ClientOption) (*NotificationChannelClient, error) {\n\tclientOpts := defaultNotificationChannelGRPCClientOptions()\n\tif newNotificationChannelClientHook != nil {\n\t\thookOpts, err := newNotificationChannelClientHook(ctx, clientHookParams{})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tclientOpts = append(clientOpts, hookOpts...)\n\t}\n\n\tconnPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tclient := NotificationChannelClient{CallOptions: defaultNotificationChannelCallOptions()}\n\n\tc := &notificationChannelGRPCClient{\n\t\tconnPool:                  connPool,\n\t\tnotificationChannelClient: monitoringpb.NewNotificationChannelServiceClient(connPool),\n\t\tCallOptions:               &client.CallOptions,\n\t\tlogger:                    internaloption.GetLogger(opts),\n\t}\n\tc.setGoogleClientInfo()\n\n\tclient.internalClient = c\n\n\treturn &client, nil\n}\n\n// Connection returns a connection to the API service.\n//\n// Deprecated: Connections are now pooled so this method does not always\n// return the same resource.\nfunc (c *notificationChannelGRPCClient) Connection() *grpc.ClientConn {\n\treturn c.connPool.Conn()\n}\n\n// setGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Intended for\n// use by Google-written clients.\nfunc (c *notificationChannelGRPCClient) setGoogleClientInfo(keyval ...string) {\n\tkv := append([]string{\"gl-go\", gax.GoVersion}, keyval...)\n\tkv = append(kv, \"gapic\", getVersionClient(), \"gax\", gax.Version, \"grpc\", grpc.Version)\n\tc.xGoogHeaders = []string{\n\t\t\"x-goog-api-client\", gax.XGoogHeader(kv...),\n\t}\n}\n\n// Close closes the connection to the API service. The user should invoke this when\n// the client is no longer required.\nfunc (c *notificationChannelGRPCClient) Close() error {\n\treturn c.connPool.Close()\n}\n\nfunc (c *notificationChannelGRPCClient) ListNotificationChannelDescriptors(ctx context.Context, req *monitoringpb.ListNotificationChannelDescriptorsRequest, opts ...gax.CallOption) *NotificationChannelDescriptorIterator {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).ListNotificationChannelDescriptors[0:len((*c.CallOptions).ListNotificationChannelDescriptors):len((*c.CallOptions).ListNotificationChannelDescriptors)], opts...)\n\tit := &NotificationChannelDescriptorIterator{}\n\treq = proto.Clone(req).(*monitoringpb.ListNotificationChannelDescriptorsRequest)\n\tit.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.NotificationChannelDescriptor, string, error) {\n\t\tresp := &monitoringpb.ListNotificationChannelDescriptorsResponse{}\n\t\tif pageToken != \"\" {\n\t\t\treq.PageToken = pageToken\n\t\t}\n\t\tif pageSize > math.MaxInt32 {\n\t\t\treq.PageSize = math.MaxInt32\n\t\t} else if pageSize != 0 {\n\t\t\treq.PageSize = int32(pageSize)\n\t\t}\n\t\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\t\tvar err error\n\t\t\tresp, err = executeRPC(ctx, c.notificationChannelClient.ListNotificationChannelDescriptors, req, settings.GRPC, c.logger, \"ListNotificationChannelDescriptors\")\n\t\t\treturn err\n\t\t}, opts...)\n\t\tif err != nil {\n\t\t\treturn nil, \"\", err\n\t\t}\n\n\t\tit.Response = resp\n\t\treturn resp.GetChannelDescriptors(), resp.GetNextPageToken(), nil\n\t}\n\tfetch := func(pageSize int, pageToken string) (string, error) {\n\t\titems, nextPageToken, err := it.InternalFetch(pageSize, pageToken)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tit.items = append(it.items, items...)\n\t\treturn nextPageToken, nil\n\t}\n\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)\n\tit.pageInfo.MaxSize = int(req.GetPageSize())\n\tit.pageInfo.Token = req.GetPageToken()\n\n\treturn it\n}\n\nfunc (c *notificationChannelGRPCClient) GetNotificationChannelDescriptor(ctx context.Context, req *monitoringpb.GetNotificationChannelDescriptorRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannelDescriptor, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).GetNotificationChannelDescriptor[0:len((*c.CallOptions).GetNotificationChannelDescriptor):len((*c.CallOptions).GetNotificationChannelDescriptor)], opts...)\n\tvar resp *monitoringpb.NotificationChannelDescriptor\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.notificationChannelClient.GetNotificationChannelDescriptor, req, settings.GRPC, c.logger, \"GetNotificationChannelDescriptor\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *notificationChannelGRPCClient) ListNotificationChannels(ctx context.Context, req *monitoringpb.ListNotificationChannelsRequest, opts ...gax.CallOption) *NotificationChannelIterator {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).ListNotificationChannels[0:len((*c.CallOptions).ListNotificationChannels):len((*c.CallOptions).ListNotificationChannels)], opts...)\n\tit := &NotificationChannelIterator{}\n\treq = proto.Clone(req).(*monitoringpb.ListNotificationChannelsRequest)\n\tit.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.NotificationChannel, string, error) {\n\t\tresp := &monitoringpb.ListNotificationChannelsResponse{}\n\t\tif pageToken != \"\" {\n\t\t\treq.PageToken = pageToken\n\t\t}\n\t\tif pageSize > math.MaxInt32 {\n\t\t\treq.PageSize = math.MaxInt32\n\t\t} else if pageSize != 0 {\n\t\t\treq.PageSize = int32(pageSize)\n\t\t}\n\t\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\t\tvar err error\n\t\t\tresp, err = executeRPC(ctx, c.notificationChannelClient.ListNotificationChannels, req, settings.GRPC, c.logger, \"ListNotificationChannels\")\n\t\t\treturn err\n\t\t}, opts...)\n\t\tif err != nil {\n\t\t\treturn nil, \"\", err\n\t\t}\n\n\t\tit.Response = resp\n\t\treturn resp.GetNotificationChannels(), resp.GetNextPageToken(), nil\n\t}\n\tfetch := func(pageSize int, pageToken string) (string, error) {\n\t\titems, nextPageToken, err := it.InternalFetch(pageSize, pageToken)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tit.items = append(it.items, items...)\n\t\treturn nextPageToken, nil\n\t}\n\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)\n\tit.pageInfo.MaxSize = int(req.GetPageSize())\n\tit.pageInfo.Token = req.GetPageToken()\n\n\treturn it\n}\n\nfunc (c *notificationChannelGRPCClient) GetNotificationChannel(ctx context.Context, req *monitoringpb.GetNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).GetNotificationChannel[0:len((*c.CallOptions).GetNotificationChannel):len((*c.CallOptions).GetNotificationChannel)], opts...)\n\tvar resp *monitoringpb.NotificationChannel\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.notificationChannelClient.GetNotificationChannel, req, settings.GRPC, c.logger, \"GetNotificationChannel\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *notificationChannelGRPCClient) CreateNotificationChannel(ctx context.Context, req *monitoringpb.CreateNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).CreateNotificationChannel[0:len((*c.CallOptions).CreateNotificationChannel):len((*c.CallOptions).CreateNotificationChannel)], opts...)\n\tvar resp *monitoringpb.NotificationChannel\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.notificationChannelClient.CreateNotificationChannel, req, settings.GRPC, c.logger, \"CreateNotificationChannel\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *notificationChannelGRPCClient) UpdateNotificationChannel(ctx context.Context, req *monitoringpb.UpdateNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"notification_channel.name\", url.QueryEscape(req.GetNotificationChannel().GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).UpdateNotificationChannel[0:len((*c.CallOptions).UpdateNotificationChannel):len((*c.CallOptions).UpdateNotificationChannel)], opts...)\n\tvar resp *monitoringpb.NotificationChannel\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.notificationChannelClient.UpdateNotificationChannel, req, settings.GRPC, c.logger, \"UpdateNotificationChannel\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *notificationChannelGRPCClient) DeleteNotificationChannel(ctx context.Context, req *monitoringpb.DeleteNotificationChannelRequest, opts ...gax.CallOption) error {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).DeleteNotificationChannel[0:len((*c.CallOptions).DeleteNotificationChannel):len((*c.CallOptions).DeleteNotificationChannel)], opts...)\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\t_, err = executeRPC(ctx, c.notificationChannelClient.DeleteNotificationChannel, req, settings.GRPC, c.logger, \"DeleteNotificationChannel\")\n\t\treturn err\n\t}, opts...)\n\treturn err\n}\n\nfunc (c *notificationChannelGRPCClient) SendNotificationChannelVerificationCode(ctx context.Context, req *monitoringpb.SendNotificationChannelVerificationCodeRequest, opts ...gax.CallOption) error {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).SendNotificationChannelVerificationCode[0:len((*c.CallOptions).SendNotificationChannelVerificationCode):len((*c.CallOptions).SendNotificationChannelVerificationCode)], opts...)\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\t_, err = executeRPC(ctx, c.notificationChannelClient.SendNotificationChannelVerificationCode, req, settings.GRPC, c.logger, \"SendNotificationChannelVerificationCode\")\n\t\treturn err\n\t}, opts...)\n\treturn err\n}\n\nfunc (c *notificationChannelGRPCClient) GetNotificationChannelVerificationCode(ctx context.Context, req *monitoringpb.GetNotificationChannelVerificationCodeRequest, opts ...gax.CallOption) (*monitoringpb.GetNotificationChannelVerificationCodeResponse, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).GetNotificationChannelVerificationCode[0:len((*c.CallOptions).GetNotificationChannelVerificationCode):len((*c.CallOptions).GetNotificationChannelVerificationCode)], opts...)\n\tvar resp *monitoringpb.GetNotificationChannelVerificationCodeResponse\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.notificationChannelClient.GetNotificationChannelVerificationCode, req, settings.GRPC, c.logger, \"GetNotificationChannelVerificationCode\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *notificationChannelGRPCClient) VerifyNotificationChannel(ctx context.Context, req *monitoringpb.VerifyNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).VerifyNotificationChannel[0:len((*c.CallOptions).VerifyNotificationChannel):len((*c.CallOptions).VerifyNotificationChannel)], opts...)\n\tvar resp *monitoringpb.NotificationChannel\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.notificationChannelClient.VerifyNotificationChannel, req, settings.GRPC, c.logger, \"VerifyNotificationChannel\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/query_client.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go_gapic. DO NOT EDIT.\n\npackage monitoring\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"math\"\n\t\"net/url\"\n\n\tmonitoringpb \"cloud.google.com/go/monitoring/apiv3/v2/monitoringpb\"\n\tgax \"github.com/googleapis/gax-go/v2\"\n\t\"google.golang.org/api/iterator\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/api/option/internaloption\"\n\tgtransport \"google.golang.org/api/transport/grpc\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\nvar newQueryClientHook clientHook\n\n// QueryCallOptions contains the retry settings for each method of QueryClient.\ntype QueryCallOptions struct {\n\tQueryTimeSeries []gax.CallOption\n}\n\nfunc defaultQueryGRPCClientOptions() []option.ClientOption {\n\treturn []option.ClientOption{\n\t\tinternaloption.WithDefaultEndpoint(\"monitoring.googleapis.com:443\"),\n\t\tinternaloption.WithDefaultEndpointTemplate(\"monitoring.UNIVERSE_DOMAIN:443\"),\n\t\tinternaloption.WithDefaultMTLSEndpoint(\"monitoring.mtls.googleapis.com:443\"),\n\t\tinternaloption.WithDefaultUniverseDomain(\"googleapis.com\"),\n\t\tinternaloption.WithDefaultAudience(\"https://monitoring.googleapis.com/\"),\n\t\tinternaloption.WithDefaultScopes(DefaultAuthScopes()...),\n\t\tinternaloption.EnableJwtWithScope(),\n\t\tinternaloption.EnableNewAuthLibrary(),\n\t\toption.WithGRPCDialOption(grpc.WithDefaultCallOptions(\n\t\t\tgrpc.MaxCallRecvMsgSize(math.MaxInt32))),\n\t}\n}\n\nfunc defaultQueryCallOptions() *QueryCallOptions {\n\treturn &QueryCallOptions{\n\t\tQueryTimeSeries: []gax.CallOption{},\n\t}\n}\n\n// internalQueryClient is an interface that defines the methods available from Cloud Monitoring API.\ntype internalQueryClient interface {\n\tClose() error\n\tsetGoogleClientInfo(...string)\n\tConnection() *grpc.ClientConn\n\tQueryTimeSeries(context.Context, *monitoringpb.QueryTimeSeriesRequest, ...gax.CallOption) *TimeSeriesDataIterator\n}\n\n// QueryClient is a client for interacting with Cloud Monitoring API.\n// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.\n//\n// The QueryService API is used to manage time series data in Cloud\n// Monitoring. Time series data is a collection of data points that describes\n// the time-varying values of a metric.\ntype QueryClient struct {\n\t// The internal transport-dependent client.\n\tinternalClient internalQueryClient\n\n\t// The call options for this service.\n\tCallOptions *QueryCallOptions\n}\n\n// Wrapper methods routed to the internal client.\n\n// Close closes the connection to the API service. The user should invoke this when\n// the client is no longer required.\nfunc (c *QueryClient) Close() error {\n\treturn c.internalClient.Close()\n}\n\n// setGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Intended for\n// use by Google-written clients.\nfunc (c *QueryClient) setGoogleClientInfo(keyval ...string) {\n\tc.internalClient.setGoogleClientInfo(keyval...)\n}\n\n// Connection returns a connection to the API service.\n//\n// Deprecated: Connections are now pooled so this method does not always\n// return the same resource.\nfunc (c *QueryClient) Connection() *grpc.ClientConn {\n\treturn c.internalClient.Connection()\n}\n\n// QueryTimeSeries queries time series by using Monitoring Query Language (MQL). We recommend\n// using PromQL instead of MQL. For more information about the status of MQL,\n// see the MQL deprecation\n// notice (at https://cloud.google.com/stackdriver/docs/deprecations/mql).\n//\n// Deprecated: QueryTimeSeries may be removed in a future version.\nfunc (c *QueryClient) QueryTimeSeries(ctx context.Context, req *monitoringpb.QueryTimeSeriesRequest, opts ...gax.CallOption) *TimeSeriesDataIterator {\n\treturn c.internalClient.QueryTimeSeries(ctx, req, opts...)\n}\n\n// queryGRPCClient is a client for interacting with Cloud Monitoring API over gRPC transport.\n//\n// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.\ntype queryGRPCClient struct {\n\t// Connection pool of gRPC connections to the service.\n\tconnPool gtransport.ConnPool\n\n\t// Points back to the CallOptions field of the containing QueryClient\n\tCallOptions **QueryCallOptions\n\n\t// The gRPC API client.\n\tqueryClient monitoringpb.QueryServiceClient\n\n\t// The x-goog-* metadata to be sent with each request.\n\txGoogHeaders []string\n\n\tlogger *slog.Logger\n}\n\n// NewQueryClient creates a new query service client based on gRPC.\n// The returned client must be Closed when it is done being used to clean up its underlying connections.\n//\n// The QueryService API is used to manage time series data in Cloud\n// Monitoring. Time series data is a collection of data points that describes\n// the time-varying values of a metric.\nfunc NewQueryClient(ctx context.Context, opts ...option.ClientOption) (*QueryClient, error) {\n\tclientOpts := defaultQueryGRPCClientOptions()\n\tif newQueryClientHook != nil {\n\t\thookOpts, err := newQueryClientHook(ctx, clientHookParams{})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tclientOpts = append(clientOpts, hookOpts...)\n\t}\n\n\tconnPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tclient := QueryClient{CallOptions: defaultQueryCallOptions()}\n\n\tc := &queryGRPCClient{\n\t\tconnPool:    connPool,\n\t\tqueryClient: monitoringpb.NewQueryServiceClient(connPool),\n\t\tCallOptions: &client.CallOptions,\n\t\tlogger:      internaloption.GetLogger(opts),\n\t}\n\tc.setGoogleClientInfo()\n\n\tclient.internalClient = c\n\n\treturn &client, nil\n}\n\n// Connection returns a connection to the API service.\n//\n// Deprecated: Connections are now pooled so this method does not always\n// return the same resource.\nfunc (c *queryGRPCClient) Connection() *grpc.ClientConn {\n\treturn c.connPool.Conn()\n}\n\n// setGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Intended for\n// use by Google-written clients.\nfunc (c *queryGRPCClient) setGoogleClientInfo(keyval ...string) {\n\tkv := append([]string{\"gl-go\", gax.GoVersion}, keyval...)\n\tkv = append(kv, \"gapic\", getVersionClient(), \"gax\", gax.Version, \"grpc\", grpc.Version)\n\tc.xGoogHeaders = []string{\n\t\t\"x-goog-api-client\", gax.XGoogHeader(kv...),\n\t}\n}\n\n// Close closes the connection to the API service. The user should invoke this when\n// the client is no longer required.\nfunc (c *queryGRPCClient) Close() error {\n\treturn c.connPool.Close()\n}\n\nfunc (c *queryGRPCClient) QueryTimeSeries(ctx context.Context, req *monitoringpb.QueryTimeSeriesRequest, opts ...gax.CallOption) *TimeSeriesDataIterator {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).QueryTimeSeries[0:len((*c.CallOptions).QueryTimeSeries):len((*c.CallOptions).QueryTimeSeries)], opts...)\n\tit := &TimeSeriesDataIterator{}\n\treq = proto.Clone(req).(*monitoringpb.QueryTimeSeriesRequest)\n\tit.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.TimeSeriesData, string, error) {\n\t\tresp := &monitoringpb.QueryTimeSeriesResponse{}\n\t\tif pageToken != \"\" {\n\t\t\treq.PageToken = pageToken\n\t\t}\n\t\tif pageSize > math.MaxInt32 {\n\t\t\treq.PageSize = math.MaxInt32\n\t\t} else if pageSize != 0 {\n\t\t\treq.PageSize = int32(pageSize)\n\t\t}\n\t\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\t\tvar err error\n\t\t\tresp, err = executeRPC(ctx, c.queryClient.QueryTimeSeries, req, settings.GRPC, c.logger, \"QueryTimeSeries\")\n\t\t\treturn err\n\t\t}, opts...)\n\t\tif err != nil {\n\t\t\treturn nil, \"\", err\n\t\t}\n\n\t\tit.Response = resp\n\t\treturn resp.GetTimeSeriesData(), resp.GetNextPageToken(), nil\n\t}\n\tfetch := func(pageSize int, pageToken string) (string, error) {\n\t\titems, nextPageToken, err := it.InternalFetch(pageSize, pageToken)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tit.items = append(it.items, items...)\n\t\treturn nextPageToken, nil\n\t}\n\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)\n\tit.pageInfo.MaxSize = int(req.GetPageSize())\n\tit.pageInfo.Token = req.GetPageToken()\n\n\treturn it\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/service_monitoring_client.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go_gapic. DO NOT EDIT.\n\npackage monitoring\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"math\"\n\t\"net/url\"\n\t\"time\"\n\n\tmonitoringpb \"cloud.google.com/go/monitoring/apiv3/v2/monitoringpb\"\n\tgax \"github.com/googleapis/gax-go/v2\"\n\t\"google.golang.org/api/iterator\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/api/option/internaloption\"\n\tgtransport \"google.golang.org/api/transport/grpc\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\nvar newServiceMonitoringClientHook clientHook\n\n// ServiceMonitoringCallOptions contains the retry settings for each method of ServiceMonitoringClient.\ntype ServiceMonitoringCallOptions struct {\n\tCreateService               []gax.CallOption\n\tGetService                  []gax.CallOption\n\tListServices                []gax.CallOption\n\tUpdateService               []gax.CallOption\n\tDeleteService               []gax.CallOption\n\tCreateServiceLevelObjective []gax.CallOption\n\tGetServiceLevelObjective    []gax.CallOption\n\tListServiceLevelObjectives  []gax.CallOption\n\tUpdateServiceLevelObjective []gax.CallOption\n\tDeleteServiceLevelObjective []gax.CallOption\n}\n\nfunc defaultServiceMonitoringGRPCClientOptions() []option.ClientOption {\n\treturn []option.ClientOption{\n\t\tinternaloption.WithDefaultEndpoint(\"monitoring.googleapis.com:443\"),\n\t\tinternaloption.WithDefaultEndpointTemplate(\"monitoring.UNIVERSE_DOMAIN:443\"),\n\t\tinternaloption.WithDefaultMTLSEndpoint(\"monitoring.mtls.googleapis.com:443\"),\n\t\tinternaloption.WithDefaultUniverseDomain(\"googleapis.com\"),\n\t\tinternaloption.WithDefaultAudience(\"https://monitoring.googleapis.com/\"),\n\t\tinternaloption.WithDefaultScopes(DefaultAuthScopes()...),\n\t\tinternaloption.EnableJwtWithScope(),\n\t\tinternaloption.EnableNewAuthLibrary(),\n\t\toption.WithGRPCDialOption(grpc.WithDefaultCallOptions(\n\t\t\tgrpc.MaxCallRecvMsgSize(math.MaxInt32))),\n\t}\n}\n\nfunc defaultServiceMonitoringCallOptions() *ServiceMonitoringCallOptions {\n\treturn &ServiceMonitoringCallOptions{\n\t\tCreateService: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t},\n\t\tGetService: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tListServices: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tUpdateService: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t},\n\t\tDeleteService: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tCreateServiceLevelObjective: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t},\n\t\tGetServiceLevelObjective: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tListServiceLevelObjectives: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tUpdateServiceLevelObjective: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t},\n\t\tDeleteServiceLevelObjective: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t}\n}\n\n// internalServiceMonitoringClient is an interface that defines the methods available from Cloud Monitoring API.\ntype internalServiceMonitoringClient interface {\n\tClose() error\n\tsetGoogleClientInfo(...string)\n\tConnection() *grpc.ClientConn\n\tCreateService(context.Context, *monitoringpb.CreateServiceRequest, ...gax.CallOption) (*monitoringpb.Service, error)\n\tGetService(context.Context, *monitoringpb.GetServiceRequest, ...gax.CallOption) (*monitoringpb.Service, error)\n\tListServices(context.Context, *monitoringpb.ListServicesRequest, ...gax.CallOption) *ServiceIterator\n\tUpdateService(context.Context, *monitoringpb.UpdateServiceRequest, ...gax.CallOption) (*monitoringpb.Service, error)\n\tDeleteService(context.Context, *monitoringpb.DeleteServiceRequest, ...gax.CallOption) error\n\tCreateServiceLevelObjective(context.Context, *monitoringpb.CreateServiceLevelObjectiveRequest, ...gax.CallOption) (*monitoringpb.ServiceLevelObjective, error)\n\tGetServiceLevelObjective(context.Context, *monitoringpb.GetServiceLevelObjectiveRequest, ...gax.CallOption) (*monitoringpb.ServiceLevelObjective, error)\n\tListServiceLevelObjectives(context.Context, *monitoringpb.ListServiceLevelObjectivesRequest, ...gax.CallOption) *ServiceLevelObjectiveIterator\n\tUpdateServiceLevelObjective(context.Context, *monitoringpb.UpdateServiceLevelObjectiveRequest, ...gax.CallOption) (*monitoringpb.ServiceLevelObjective, error)\n\tDeleteServiceLevelObjective(context.Context, *monitoringpb.DeleteServiceLevelObjectiveRequest, ...gax.CallOption) error\n}\n\n// ServiceMonitoringClient is a client for interacting with Cloud Monitoring API.\n// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.\n//\n// The Cloud Monitoring Service-Oriented Monitoring API has endpoints for\n// managing and querying aspects of a Metrics Scope’s services. These include\n// the Service's monitored resources, its Service-Level Objectives, and a\n// taxonomy of categorized Health Metrics.\ntype ServiceMonitoringClient struct {\n\t// The internal transport-dependent client.\n\tinternalClient internalServiceMonitoringClient\n\n\t// The call options for this service.\n\tCallOptions *ServiceMonitoringCallOptions\n}\n\n// Wrapper methods routed to the internal client.\n\n// Close closes the connection to the API service. The user should invoke this when\n// the client is no longer required.\nfunc (c *ServiceMonitoringClient) Close() error {\n\treturn c.internalClient.Close()\n}\n\n// setGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Intended for\n// use by Google-written clients.\nfunc (c *ServiceMonitoringClient) setGoogleClientInfo(keyval ...string) {\n\tc.internalClient.setGoogleClientInfo(keyval...)\n}\n\n// Connection returns a connection to the API service.\n//\n// Deprecated: Connections are now pooled so this method does not always\n// return the same resource.\nfunc (c *ServiceMonitoringClient) Connection() *grpc.ClientConn {\n\treturn c.internalClient.Connection()\n}\n\n// CreateService create a Service.\nfunc (c *ServiceMonitoringClient) CreateService(ctx context.Context, req *monitoringpb.CreateServiceRequest, opts ...gax.CallOption) (*monitoringpb.Service, error) {\n\treturn c.internalClient.CreateService(ctx, req, opts...)\n}\n\n// GetService get the named Service.\nfunc (c *ServiceMonitoringClient) GetService(ctx context.Context, req *monitoringpb.GetServiceRequest, opts ...gax.CallOption) (*monitoringpb.Service, error) {\n\treturn c.internalClient.GetService(ctx, req, opts...)\n}\n\n// ListServices list Services for this Metrics Scope.\nfunc (c *ServiceMonitoringClient) ListServices(ctx context.Context, req *monitoringpb.ListServicesRequest, opts ...gax.CallOption) *ServiceIterator {\n\treturn c.internalClient.ListServices(ctx, req, opts...)\n}\n\n// UpdateService update this Service.\nfunc (c *ServiceMonitoringClient) UpdateService(ctx context.Context, req *monitoringpb.UpdateServiceRequest, opts ...gax.CallOption) (*monitoringpb.Service, error) {\n\treturn c.internalClient.UpdateService(ctx, req, opts...)\n}\n\n// DeleteService soft delete this Service.\nfunc (c *ServiceMonitoringClient) DeleteService(ctx context.Context, req *monitoringpb.DeleteServiceRequest, opts ...gax.CallOption) error {\n\treturn c.internalClient.DeleteService(ctx, req, opts...)\n}\n\n// CreateServiceLevelObjective create a ServiceLevelObjective for the given Service.\nfunc (c *ServiceMonitoringClient) CreateServiceLevelObjective(ctx context.Context, req *monitoringpb.CreateServiceLevelObjectiveRequest, opts ...gax.CallOption) (*monitoringpb.ServiceLevelObjective, error) {\n\treturn c.internalClient.CreateServiceLevelObjective(ctx, req, opts...)\n}\n\n// GetServiceLevelObjective get a ServiceLevelObjective by name.\nfunc (c *ServiceMonitoringClient) GetServiceLevelObjective(ctx context.Context, req *monitoringpb.GetServiceLevelObjectiveRequest, opts ...gax.CallOption) (*monitoringpb.ServiceLevelObjective, error) {\n\treturn c.internalClient.GetServiceLevelObjective(ctx, req, opts...)\n}\n\n// ListServiceLevelObjectives list the ServiceLevelObjectives for the given Service.\nfunc (c *ServiceMonitoringClient) ListServiceLevelObjectives(ctx context.Context, req *monitoringpb.ListServiceLevelObjectivesRequest, opts ...gax.CallOption) *ServiceLevelObjectiveIterator {\n\treturn c.internalClient.ListServiceLevelObjectives(ctx, req, opts...)\n}\n\n// UpdateServiceLevelObjective update the given ServiceLevelObjective.\nfunc (c *ServiceMonitoringClient) UpdateServiceLevelObjective(ctx context.Context, req *monitoringpb.UpdateServiceLevelObjectiveRequest, opts ...gax.CallOption) (*monitoringpb.ServiceLevelObjective, error) {\n\treturn c.internalClient.UpdateServiceLevelObjective(ctx, req, opts...)\n}\n\n// DeleteServiceLevelObjective delete the given ServiceLevelObjective.\nfunc (c *ServiceMonitoringClient) DeleteServiceLevelObjective(ctx context.Context, req *monitoringpb.DeleteServiceLevelObjectiveRequest, opts ...gax.CallOption) error {\n\treturn c.internalClient.DeleteServiceLevelObjective(ctx, req, opts...)\n}\n\n// serviceMonitoringGRPCClient is a client for interacting with Cloud Monitoring API over gRPC transport.\n//\n// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.\ntype serviceMonitoringGRPCClient struct {\n\t// Connection pool of gRPC connections to the service.\n\tconnPool gtransport.ConnPool\n\n\t// Points back to the CallOptions field of the containing ServiceMonitoringClient\n\tCallOptions **ServiceMonitoringCallOptions\n\n\t// The gRPC API client.\n\tserviceMonitoringClient monitoringpb.ServiceMonitoringServiceClient\n\n\t// The x-goog-* metadata to be sent with each request.\n\txGoogHeaders []string\n\n\tlogger *slog.Logger\n}\n\n// NewServiceMonitoringClient creates a new service monitoring service client based on gRPC.\n// The returned client must be Closed when it is done being used to clean up its underlying connections.\n//\n// The Cloud Monitoring Service-Oriented Monitoring API has endpoints for\n// managing and querying aspects of a Metrics Scope’s services. These include\n// the Service's monitored resources, its Service-Level Objectives, and a\n// taxonomy of categorized Health Metrics.\nfunc NewServiceMonitoringClient(ctx context.Context, opts ...option.ClientOption) (*ServiceMonitoringClient, error) {\n\tclientOpts := defaultServiceMonitoringGRPCClientOptions()\n\tif newServiceMonitoringClientHook != nil {\n\t\thookOpts, err := newServiceMonitoringClientHook(ctx, clientHookParams{})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tclientOpts = append(clientOpts, hookOpts...)\n\t}\n\n\tconnPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tclient := ServiceMonitoringClient{CallOptions: defaultServiceMonitoringCallOptions()}\n\n\tc := &serviceMonitoringGRPCClient{\n\t\tconnPool:                connPool,\n\t\tserviceMonitoringClient: monitoringpb.NewServiceMonitoringServiceClient(connPool),\n\t\tCallOptions:             &client.CallOptions,\n\t\tlogger:                  internaloption.GetLogger(opts),\n\t}\n\tc.setGoogleClientInfo()\n\n\tclient.internalClient = c\n\n\treturn &client, nil\n}\n\n// Connection returns a connection to the API service.\n//\n// Deprecated: Connections are now pooled so this method does not always\n// return the same resource.\nfunc (c *serviceMonitoringGRPCClient) Connection() *grpc.ClientConn {\n\treturn c.connPool.Conn()\n}\n\n// setGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Intended for\n// use by Google-written clients.\nfunc (c *serviceMonitoringGRPCClient) setGoogleClientInfo(keyval ...string) {\n\tkv := append([]string{\"gl-go\", gax.GoVersion}, keyval...)\n\tkv = append(kv, \"gapic\", getVersionClient(), \"gax\", gax.Version, \"grpc\", grpc.Version)\n\tc.xGoogHeaders = []string{\n\t\t\"x-goog-api-client\", gax.XGoogHeader(kv...),\n\t}\n}\n\n// Close closes the connection to the API service. The user should invoke this when\n// the client is no longer required.\nfunc (c *serviceMonitoringGRPCClient) Close() error {\n\treturn c.connPool.Close()\n}\n\nfunc (c *serviceMonitoringGRPCClient) CreateService(ctx context.Context, req *monitoringpb.CreateServiceRequest, opts ...gax.CallOption) (*monitoringpb.Service, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"parent\", url.QueryEscape(req.GetParent()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).CreateService[0:len((*c.CallOptions).CreateService):len((*c.CallOptions).CreateService)], opts...)\n\tvar resp *monitoringpb.Service\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.serviceMonitoringClient.CreateService, req, settings.GRPC, c.logger, \"CreateService\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *serviceMonitoringGRPCClient) GetService(ctx context.Context, req *monitoringpb.GetServiceRequest, opts ...gax.CallOption) (*monitoringpb.Service, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).GetService[0:len((*c.CallOptions).GetService):len((*c.CallOptions).GetService)], opts...)\n\tvar resp *monitoringpb.Service\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.serviceMonitoringClient.GetService, req, settings.GRPC, c.logger, \"GetService\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *serviceMonitoringGRPCClient) ListServices(ctx context.Context, req *monitoringpb.ListServicesRequest, opts ...gax.CallOption) *ServiceIterator {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"parent\", url.QueryEscape(req.GetParent()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).ListServices[0:len((*c.CallOptions).ListServices):len((*c.CallOptions).ListServices)], opts...)\n\tit := &ServiceIterator{}\n\treq = proto.Clone(req).(*monitoringpb.ListServicesRequest)\n\tit.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.Service, string, error) {\n\t\tresp := &monitoringpb.ListServicesResponse{}\n\t\tif pageToken != \"\" {\n\t\t\treq.PageToken = pageToken\n\t\t}\n\t\tif pageSize > math.MaxInt32 {\n\t\t\treq.PageSize = math.MaxInt32\n\t\t} else if pageSize != 0 {\n\t\t\treq.PageSize = int32(pageSize)\n\t\t}\n\t\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\t\tvar err error\n\t\t\tresp, err = executeRPC(ctx, c.serviceMonitoringClient.ListServices, req, settings.GRPC, c.logger, \"ListServices\")\n\t\t\treturn err\n\t\t}, opts...)\n\t\tif err != nil {\n\t\t\treturn nil, \"\", err\n\t\t}\n\n\t\tit.Response = resp\n\t\treturn resp.GetServices(), resp.GetNextPageToken(), nil\n\t}\n\tfetch := func(pageSize int, pageToken string) (string, error) {\n\t\titems, nextPageToken, err := it.InternalFetch(pageSize, pageToken)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tit.items = append(it.items, items...)\n\t\treturn nextPageToken, nil\n\t}\n\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)\n\tit.pageInfo.MaxSize = int(req.GetPageSize())\n\tit.pageInfo.Token = req.GetPageToken()\n\n\treturn it\n}\n\nfunc (c *serviceMonitoringGRPCClient) UpdateService(ctx context.Context, req *monitoringpb.UpdateServiceRequest, opts ...gax.CallOption) (*monitoringpb.Service, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"service.name\", url.QueryEscape(req.GetService().GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).UpdateService[0:len((*c.CallOptions).UpdateService):len((*c.CallOptions).UpdateService)], opts...)\n\tvar resp *monitoringpb.Service\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.serviceMonitoringClient.UpdateService, req, settings.GRPC, c.logger, \"UpdateService\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *serviceMonitoringGRPCClient) DeleteService(ctx context.Context, req *monitoringpb.DeleteServiceRequest, opts ...gax.CallOption) error {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).DeleteService[0:len((*c.CallOptions).DeleteService):len((*c.CallOptions).DeleteService)], opts...)\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\t_, err = executeRPC(ctx, c.serviceMonitoringClient.DeleteService, req, settings.GRPC, c.logger, \"DeleteService\")\n\t\treturn err\n\t}, opts...)\n\treturn err\n}\n\nfunc (c *serviceMonitoringGRPCClient) CreateServiceLevelObjective(ctx context.Context, req *monitoringpb.CreateServiceLevelObjectiveRequest, opts ...gax.CallOption) (*monitoringpb.ServiceLevelObjective, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"parent\", url.QueryEscape(req.GetParent()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).CreateServiceLevelObjective[0:len((*c.CallOptions).CreateServiceLevelObjective):len((*c.CallOptions).CreateServiceLevelObjective)], opts...)\n\tvar resp *monitoringpb.ServiceLevelObjective\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.serviceMonitoringClient.CreateServiceLevelObjective, req, settings.GRPC, c.logger, \"CreateServiceLevelObjective\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *serviceMonitoringGRPCClient) GetServiceLevelObjective(ctx context.Context, req *monitoringpb.GetServiceLevelObjectiveRequest, opts ...gax.CallOption) (*monitoringpb.ServiceLevelObjective, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).GetServiceLevelObjective[0:len((*c.CallOptions).GetServiceLevelObjective):len((*c.CallOptions).GetServiceLevelObjective)], opts...)\n\tvar resp *monitoringpb.ServiceLevelObjective\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.serviceMonitoringClient.GetServiceLevelObjective, req, settings.GRPC, c.logger, \"GetServiceLevelObjective\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *serviceMonitoringGRPCClient) ListServiceLevelObjectives(ctx context.Context, req *monitoringpb.ListServiceLevelObjectivesRequest, opts ...gax.CallOption) *ServiceLevelObjectiveIterator {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"parent\", url.QueryEscape(req.GetParent()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).ListServiceLevelObjectives[0:len((*c.CallOptions).ListServiceLevelObjectives):len((*c.CallOptions).ListServiceLevelObjectives)], opts...)\n\tit := &ServiceLevelObjectiveIterator{}\n\treq = proto.Clone(req).(*monitoringpb.ListServiceLevelObjectivesRequest)\n\tit.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.ServiceLevelObjective, string, error) {\n\t\tresp := &monitoringpb.ListServiceLevelObjectivesResponse{}\n\t\tif pageToken != \"\" {\n\t\t\treq.PageToken = pageToken\n\t\t}\n\t\tif pageSize > math.MaxInt32 {\n\t\t\treq.PageSize = math.MaxInt32\n\t\t} else if pageSize != 0 {\n\t\t\treq.PageSize = int32(pageSize)\n\t\t}\n\t\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\t\tvar err error\n\t\t\tresp, err = executeRPC(ctx, c.serviceMonitoringClient.ListServiceLevelObjectives, req, settings.GRPC, c.logger, \"ListServiceLevelObjectives\")\n\t\t\treturn err\n\t\t}, opts...)\n\t\tif err != nil {\n\t\t\treturn nil, \"\", err\n\t\t}\n\n\t\tit.Response = resp\n\t\treturn resp.GetServiceLevelObjectives(), resp.GetNextPageToken(), nil\n\t}\n\tfetch := func(pageSize int, pageToken string) (string, error) {\n\t\titems, nextPageToken, err := it.InternalFetch(pageSize, pageToken)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tit.items = append(it.items, items...)\n\t\treturn nextPageToken, nil\n\t}\n\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)\n\tit.pageInfo.MaxSize = int(req.GetPageSize())\n\tit.pageInfo.Token = req.GetPageToken()\n\n\treturn it\n}\n\nfunc (c *serviceMonitoringGRPCClient) UpdateServiceLevelObjective(ctx context.Context, req *monitoringpb.UpdateServiceLevelObjectiveRequest, opts ...gax.CallOption) (*monitoringpb.ServiceLevelObjective, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"service_level_objective.name\", url.QueryEscape(req.GetServiceLevelObjective().GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).UpdateServiceLevelObjective[0:len((*c.CallOptions).UpdateServiceLevelObjective):len((*c.CallOptions).UpdateServiceLevelObjective)], opts...)\n\tvar resp *monitoringpb.ServiceLevelObjective\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.serviceMonitoringClient.UpdateServiceLevelObjective, req, settings.GRPC, c.logger, \"UpdateServiceLevelObjective\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *serviceMonitoringGRPCClient) DeleteServiceLevelObjective(ctx context.Context, req *monitoringpb.DeleteServiceLevelObjectiveRequest, opts ...gax.CallOption) error {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).DeleteServiceLevelObjective[0:len((*c.CallOptions).DeleteServiceLevelObjective):len((*c.CallOptions).DeleteServiceLevelObjective)], opts...)\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\t_, err = executeRPC(ctx, c.serviceMonitoringClient.DeleteServiceLevelObjective, req, settings.GRPC, c.logger, \"DeleteServiceLevelObjective\")\n\t\treturn err\n\t}, opts...)\n\treturn err\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/snooze_client.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go_gapic. DO NOT EDIT.\n\npackage monitoring\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"math\"\n\t\"net/url\"\n\t\"time\"\n\n\tmonitoringpb \"cloud.google.com/go/monitoring/apiv3/v2/monitoringpb\"\n\tgax \"github.com/googleapis/gax-go/v2\"\n\t\"google.golang.org/api/iterator\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/api/option/internaloption\"\n\tgtransport \"google.golang.org/api/transport/grpc\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\nvar newSnoozeClientHook clientHook\n\n// SnoozeCallOptions contains the retry settings for each method of SnoozeClient.\ntype SnoozeCallOptions struct {\n\tCreateSnooze []gax.CallOption\n\tListSnoozes  []gax.CallOption\n\tGetSnooze    []gax.CallOption\n\tUpdateSnooze []gax.CallOption\n}\n\nfunc defaultSnoozeGRPCClientOptions() []option.ClientOption {\n\treturn []option.ClientOption{\n\t\tinternaloption.WithDefaultEndpoint(\"monitoring.googleapis.com:443\"),\n\t\tinternaloption.WithDefaultEndpointTemplate(\"monitoring.UNIVERSE_DOMAIN:443\"),\n\t\tinternaloption.WithDefaultMTLSEndpoint(\"monitoring.mtls.googleapis.com:443\"),\n\t\tinternaloption.WithDefaultUniverseDomain(\"googleapis.com\"),\n\t\tinternaloption.WithDefaultAudience(\"https://monitoring.googleapis.com/\"),\n\t\tinternaloption.WithDefaultScopes(DefaultAuthScopes()...),\n\t\tinternaloption.EnableJwtWithScope(),\n\t\tinternaloption.EnableNewAuthLibrary(),\n\t\toption.WithGRPCDialOption(grpc.WithDefaultCallOptions(\n\t\t\tgrpc.MaxCallRecvMsgSize(math.MaxInt32))),\n\t}\n}\n\nfunc defaultSnoozeCallOptions() *SnoozeCallOptions {\n\treturn &SnoozeCallOptions{\n\t\tCreateSnooze: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t},\n\t\tListSnoozes: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tGetSnooze: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tUpdateSnooze: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t},\n\t}\n}\n\n// internalSnoozeClient is an interface that defines the methods available from Cloud Monitoring API.\ntype internalSnoozeClient interface {\n\tClose() error\n\tsetGoogleClientInfo(...string)\n\tConnection() *grpc.ClientConn\n\tCreateSnooze(context.Context, *monitoringpb.CreateSnoozeRequest, ...gax.CallOption) (*monitoringpb.Snooze, error)\n\tListSnoozes(context.Context, *monitoringpb.ListSnoozesRequest, ...gax.CallOption) *SnoozeIterator\n\tGetSnooze(context.Context, *monitoringpb.GetSnoozeRequest, ...gax.CallOption) (*monitoringpb.Snooze, error)\n\tUpdateSnooze(context.Context, *monitoringpb.UpdateSnoozeRequest, ...gax.CallOption) (*monitoringpb.Snooze, error)\n}\n\n// SnoozeClient is a client for interacting with Cloud Monitoring API.\n// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.\n//\n// The SnoozeService API is used to temporarily prevent an alert policy from\n// generating alerts. A Snooze is a description of the criteria under which one\n// or more alert policies should not fire alerts for the specified duration.\ntype SnoozeClient struct {\n\t// The internal transport-dependent client.\n\tinternalClient internalSnoozeClient\n\n\t// The call options for this service.\n\tCallOptions *SnoozeCallOptions\n}\n\n// Wrapper methods routed to the internal client.\n\n// Close closes the connection to the API service. The user should invoke this when\n// the client is no longer required.\nfunc (c *SnoozeClient) Close() error {\n\treturn c.internalClient.Close()\n}\n\n// setGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Intended for\n// use by Google-written clients.\nfunc (c *SnoozeClient) setGoogleClientInfo(keyval ...string) {\n\tc.internalClient.setGoogleClientInfo(keyval...)\n}\n\n// Connection returns a connection to the API service.\n//\n// Deprecated: Connections are now pooled so this method does not always\n// return the same resource.\nfunc (c *SnoozeClient) Connection() *grpc.ClientConn {\n\treturn c.internalClient.Connection()\n}\n\n// CreateSnooze creates a Snooze that will prevent alerts, which match the provided\n// criteria, from being opened. The Snooze applies for a specific time\n// interval.\nfunc (c *SnoozeClient) CreateSnooze(ctx context.Context, req *monitoringpb.CreateSnoozeRequest, opts ...gax.CallOption) (*monitoringpb.Snooze, error) {\n\treturn c.internalClient.CreateSnooze(ctx, req, opts...)\n}\n\n// ListSnoozes lists the Snoozes associated with a project. Can optionally pass in\n// filter, which specifies predicates to match Snoozes.\nfunc (c *SnoozeClient) ListSnoozes(ctx context.Context, req *monitoringpb.ListSnoozesRequest, opts ...gax.CallOption) *SnoozeIterator {\n\treturn c.internalClient.ListSnoozes(ctx, req, opts...)\n}\n\n// GetSnooze retrieves a Snooze by name.\nfunc (c *SnoozeClient) GetSnooze(ctx context.Context, req *monitoringpb.GetSnoozeRequest, opts ...gax.CallOption) (*monitoringpb.Snooze, error) {\n\treturn c.internalClient.GetSnooze(ctx, req, opts...)\n}\n\n// UpdateSnooze updates a Snooze, identified by its name, with the parameters in the\n// given Snooze object.\nfunc (c *SnoozeClient) UpdateSnooze(ctx context.Context, req *monitoringpb.UpdateSnoozeRequest, opts ...gax.CallOption) (*monitoringpb.Snooze, error) {\n\treturn c.internalClient.UpdateSnooze(ctx, req, opts...)\n}\n\n// snoozeGRPCClient is a client for interacting with Cloud Monitoring API over gRPC transport.\n//\n// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.\ntype snoozeGRPCClient struct {\n\t// Connection pool of gRPC connections to the service.\n\tconnPool gtransport.ConnPool\n\n\t// Points back to the CallOptions field of the containing SnoozeClient\n\tCallOptions **SnoozeCallOptions\n\n\t// The gRPC API client.\n\tsnoozeClient monitoringpb.SnoozeServiceClient\n\n\t// The x-goog-* metadata to be sent with each request.\n\txGoogHeaders []string\n\n\tlogger *slog.Logger\n}\n\n// NewSnoozeClient creates a new snooze service client based on gRPC.\n// The returned client must be Closed when it is done being used to clean up its underlying connections.\n//\n// The SnoozeService API is used to temporarily prevent an alert policy from\n// generating alerts. A Snooze is a description of the criteria under which one\n// or more alert policies should not fire alerts for the specified duration.\nfunc NewSnoozeClient(ctx context.Context, opts ...option.ClientOption) (*SnoozeClient, error) {\n\tclientOpts := defaultSnoozeGRPCClientOptions()\n\tif newSnoozeClientHook != nil {\n\t\thookOpts, err := newSnoozeClientHook(ctx, clientHookParams{})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tclientOpts = append(clientOpts, hookOpts...)\n\t}\n\n\tconnPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tclient := SnoozeClient{CallOptions: defaultSnoozeCallOptions()}\n\n\tc := &snoozeGRPCClient{\n\t\tconnPool:     connPool,\n\t\tsnoozeClient: monitoringpb.NewSnoozeServiceClient(connPool),\n\t\tCallOptions:  &client.CallOptions,\n\t\tlogger:       internaloption.GetLogger(opts),\n\t}\n\tc.setGoogleClientInfo()\n\n\tclient.internalClient = c\n\n\treturn &client, nil\n}\n\n// Connection returns a connection to the API service.\n//\n// Deprecated: Connections are now pooled so this method does not always\n// return the same resource.\nfunc (c *snoozeGRPCClient) Connection() *grpc.ClientConn {\n\treturn c.connPool.Conn()\n}\n\n// setGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Intended for\n// use by Google-written clients.\nfunc (c *snoozeGRPCClient) setGoogleClientInfo(keyval ...string) {\n\tkv := append([]string{\"gl-go\", gax.GoVersion}, keyval...)\n\tkv = append(kv, \"gapic\", getVersionClient(), \"gax\", gax.Version, \"grpc\", grpc.Version)\n\tc.xGoogHeaders = []string{\n\t\t\"x-goog-api-client\", gax.XGoogHeader(kv...),\n\t}\n}\n\n// Close closes the connection to the API service. The user should invoke this when\n// the client is no longer required.\nfunc (c *snoozeGRPCClient) Close() error {\n\treturn c.connPool.Close()\n}\n\nfunc (c *snoozeGRPCClient) CreateSnooze(ctx context.Context, req *monitoringpb.CreateSnoozeRequest, opts ...gax.CallOption) (*monitoringpb.Snooze, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"parent\", url.QueryEscape(req.GetParent()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).CreateSnooze[0:len((*c.CallOptions).CreateSnooze):len((*c.CallOptions).CreateSnooze)], opts...)\n\tvar resp *monitoringpb.Snooze\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.snoozeClient.CreateSnooze, req, settings.GRPC, c.logger, \"CreateSnooze\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *snoozeGRPCClient) ListSnoozes(ctx context.Context, req *monitoringpb.ListSnoozesRequest, opts ...gax.CallOption) *SnoozeIterator {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"parent\", url.QueryEscape(req.GetParent()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).ListSnoozes[0:len((*c.CallOptions).ListSnoozes):len((*c.CallOptions).ListSnoozes)], opts...)\n\tit := &SnoozeIterator{}\n\treq = proto.Clone(req).(*monitoringpb.ListSnoozesRequest)\n\tit.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.Snooze, string, error) {\n\t\tresp := &monitoringpb.ListSnoozesResponse{}\n\t\tif pageToken != \"\" {\n\t\t\treq.PageToken = pageToken\n\t\t}\n\t\tif pageSize > math.MaxInt32 {\n\t\t\treq.PageSize = math.MaxInt32\n\t\t} else if pageSize != 0 {\n\t\t\treq.PageSize = int32(pageSize)\n\t\t}\n\t\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\t\tvar err error\n\t\t\tresp, err = executeRPC(ctx, c.snoozeClient.ListSnoozes, req, settings.GRPC, c.logger, \"ListSnoozes\")\n\t\t\treturn err\n\t\t}, opts...)\n\t\tif err != nil {\n\t\t\treturn nil, \"\", err\n\t\t}\n\n\t\tit.Response = resp\n\t\treturn resp.GetSnoozes(), resp.GetNextPageToken(), nil\n\t}\n\tfetch := func(pageSize int, pageToken string) (string, error) {\n\t\titems, nextPageToken, err := it.InternalFetch(pageSize, pageToken)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tit.items = append(it.items, items...)\n\t\treturn nextPageToken, nil\n\t}\n\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)\n\tit.pageInfo.MaxSize = int(req.GetPageSize())\n\tit.pageInfo.Token = req.GetPageToken()\n\n\treturn it\n}\n\nfunc (c *snoozeGRPCClient) GetSnooze(ctx context.Context, req *monitoringpb.GetSnoozeRequest, opts ...gax.CallOption) (*monitoringpb.Snooze, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).GetSnooze[0:len((*c.CallOptions).GetSnooze):len((*c.CallOptions).GetSnooze)], opts...)\n\tvar resp *monitoringpb.Snooze\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.snoozeClient.GetSnooze, req, settings.GRPC, c.logger, \"GetSnooze\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *snoozeGRPCClient) UpdateSnooze(ctx context.Context, req *monitoringpb.UpdateSnoozeRequest, opts ...gax.CallOption) (*monitoringpb.Snooze, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"snooze.name\", url.QueryEscape(req.GetSnooze().GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).UpdateSnooze[0:len((*c.CallOptions).UpdateSnooze):len((*c.CallOptions).UpdateSnooze)], opts...)\n\tvar resp *monitoringpb.Snooze\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.snoozeClient.UpdateSnooze, req, settings.GRPC, c.logger, \"UpdateSnooze\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/uptime_check_client.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go_gapic. DO NOT EDIT.\n\npackage monitoring\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"math\"\n\t\"net/url\"\n\t\"time\"\n\n\tmonitoringpb \"cloud.google.com/go/monitoring/apiv3/v2/monitoringpb\"\n\tgax \"github.com/googleapis/gax-go/v2\"\n\t\"google.golang.org/api/iterator\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/api/option/internaloption\"\n\tgtransport \"google.golang.org/api/transport/grpc\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\nvar newUptimeCheckClientHook clientHook\n\n// UptimeCheckCallOptions contains the retry settings for each method of UptimeCheckClient.\ntype UptimeCheckCallOptions struct {\n\tListUptimeCheckConfigs  []gax.CallOption\n\tGetUptimeCheckConfig    []gax.CallOption\n\tCreateUptimeCheckConfig []gax.CallOption\n\tUpdateUptimeCheckConfig []gax.CallOption\n\tDeleteUptimeCheckConfig []gax.CallOption\n\tListUptimeCheckIps      []gax.CallOption\n}\n\nfunc defaultUptimeCheckGRPCClientOptions() []option.ClientOption {\n\treturn []option.ClientOption{\n\t\tinternaloption.WithDefaultEndpoint(\"monitoring.googleapis.com:443\"),\n\t\tinternaloption.WithDefaultEndpointTemplate(\"monitoring.UNIVERSE_DOMAIN:443\"),\n\t\tinternaloption.WithDefaultMTLSEndpoint(\"monitoring.mtls.googleapis.com:443\"),\n\t\tinternaloption.WithDefaultUniverseDomain(\"googleapis.com\"),\n\t\tinternaloption.WithDefaultAudience(\"https://monitoring.googleapis.com/\"),\n\t\tinternaloption.WithDefaultScopes(DefaultAuthScopes()...),\n\t\tinternaloption.EnableJwtWithScope(),\n\t\tinternaloption.EnableNewAuthLibrary(),\n\t\toption.WithGRPCDialOption(grpc.WithDefaultCallOptions(\n\t\t\tgrpc.MaxCallRecvMsgSize(math.MaxInt32))),\n\t}\n}\n\nfunc defaultUptimeCheckCallOptions() *UptimeCheckCallOptions {\n\treturn &UptimeCheckCallOptions{\n\t\tListUptimeCheckConfigs: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tGetUptimeCheckConfig: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tCreateUptimeCheckConfig: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t},\n\t\tUpdateUptimeCheckConfig: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t},\n\t\tDeleteUptimeCheckConfig: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tListUptimeCheckIps: []gax.CallOption{\n\t\t\tgax.WithTimeout(30000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    100 * time.Millisecond,\n\t\t\t\t\tMax:        30000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 1.30,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t}\n}\n\n// internalUptimeCheckClient is an interface that defines the methods available from Cloud Monitoring API.\ntype internalUptimeCheckClient interface {\n\tClose() error\n\tsetGoogleClientInfo(...string)\n\tConnection() *grpc.ClientConn\n\tListUptimeCheckConfigs(context.Context, *monitoringpb.ListUptimeCheckConfigsRequest, ...gax.CallOption) *UptimeCheckConfigIterator\n\tGetUptimeCheckConfig(context.Context, *monitoringpb.GetUptimeCheckConfigRequest, ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error)\n\tCreateUptimeCheckConfig(context.Context, *monitoringpb.CreateUptimeCheckConfigRequest, ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error)\n\tUpdateUptimeCheckConfig(context.Context, *monitoringpb.UpdateUptimeCheckConfigRequest, ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error)\n\tDeleteUptimeCheckConfig(context.Context, *monitoringpb.DeleteUptimeCheckConfigRequest, ...gax.CallOption) error\n\tListUptimeCheckIps(context.Context, *monitoringpb.ListUptimeCheckIpsRequest, ...gax.CallOption) *UptimeCheckIpIterator\n}\n\n// UptimeCheckClient is a client for interacting with Cloud Monitoring API.\n// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.\n//\n// The UptimeCheckService API is used to manage (list, create, delete, edit)\n// Uptime check configurations in the Cloud Monitoring product. An Uptime\n// check is a piece of configuration that determines which resources and\n// services to monitor for availability. These configurations can also be\n// configured interactively by navigating to the [Cloud console]\n// (https://console.cloud.google.com (at https://console.cloud.google.com)), selecting the appropriate project,\n// clicking on “Monitoring” on the left-hand side to navigate to Cloud\n// Monitoring, and then clicking on “Uptime”.\ntype UptimeCheckClient struct {\n\t// The internal transport-dependent client.\n\tinternalClient internalUptimeCheckClient\n\n\t// The call options for this service.\n\tCallOptions *UptimeCheckCallOptions\n}\n\n// Wrapper methods routed to the internal client.\n\n// Close closes the connection to the API service. The user should invoke this when\n// the client is no longer required.\nfunc (c *UptimeCheckClient) Close() error {\n\treturn c.internalClient.Close()\n}\n\n// setGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Intended for\n// use by Google-written clients.\nfunc (c *UptimeCheckClient) setGoogleClientInfo(keyval ...string) {\n\tc.internalClient.setGoogleClientInfo(keyval...)\n}\n\n// Connection returns a connection to the API service.\n//\n// Deprecated: Connections are now pooled so this method does not always\n// return the same resource.\nfunc (c *UptimeCheckClient) Connection() *grpc.ClientConn {\n\treturn c.internalClient.Connection()\n}\n\n// ListUptimeCheckConfigs lists the existing valid Uptime check configurations for the project\n// (leaving out any invalid configurations).\nfunc (c *UptimeCheckClient) ListUptimeCheckConfigs(ctx context.Context, req *monitoringpb.ListUptimeCheckConfigsRequest, opts ...gax.CallOption) *UptimeCheckConfigIterator {\n\treturn c.internalClient.ListUptimeCheckConfigs(ctx, req, opts...)\n}\n\n// GetUptimeCheckConfig gets a single Uptime check configuration.\nfunc (c *UptimeCheckClient) GetUptimeCheckConfig(ctx context.Context, req *monitoringpb.GetUptimeCheckConfigRequest, opts ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) {\n\treturn c.internalClient.GetUptimeCheckConfig(ctx, req, opts...)\n}\n\n// CreateUptimeCheckConfig creates a new Uptime check configuration.\nfunc (c *UptimeCheckClient) CreateUptimeCheckConfig(ctx context.Context, req *monitoringpb.CreateUptimeCheckConfigRequest, opts ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) {\n\treturn c.internalClient.CreateUptimeCheckConfig(ctx, req, opts...)\n}\n\n// UpdateUptimeCheckConfig updates an Uptime check configuration. You can either replace the entire\n// configuration with a new one or replace only certain fields in the current\n// configuration by specifying the fields to be updated via updateMask.\n// Returns the updated configuration.\nfunc (c *UptimeCheckClient) UpdateUptimeCheckConfig(ctx context.Context, req *monitoringpb.UpdateUptimeCheckConfigRequest, opts ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) {\n\treturn c.internalClient.UpdateUptimeCheckConfig(ctx, req, opts...)\n}\n\n// DeleteUptimeCheckConfig deletes an Uptime check configuration. Note that this method will fail\n// if the Uptime check configuration is referenced by an alert policy or\n// other dependent configs that would be rendered invalid by the deletion.\nfunc (c *UptimeCheckClient) DeleteUptimeCheckConfig(ctx context.Context, req *monitoringpb.DeleteUptimeCheckConfigRequest, opts ...gax.CallOption) error {\n\treturn c.internalClient.DeleteUptimeCheckConfig(ctx, req, opts...)\n}\n\n// ListUptimeCheckIps returns the list of IP addresses that checkers run from.\nfunc (c *UptimeCheckClient) ListUptimeCheckIps(ctx context.Context, req *monitoringpb.ListUptimeCheckIpsRequest, opts ...gax.CallOption) *UptimeCheckIpIterator {\n\treturn c.internalClient.ListUptimeCheckIps(ctx, req, opts...)\n}\n\n// uptimeCheckGRPCClient is a client for interacting with Cloud Monitoring API over gRPC transport.\n//\n// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.\ntype uptimeCheckGRPCClient struct {\n\t// Connection pool of gRPC connections to the service.\n\tconnPool gtransport.ConnPool\n\n\t// Points back to the CallOptions field of the containing UptimeCheckClient\n\tCallOptions **UptimeCheckCallOptions\n\n\t// The gRPC API client.\n\tuptimeCheckClient monitoringpb.UptimeCheckServiceClient\n\n\t// The x-goog-* metadata to be sent with each request.\n\txGoogHeaders []string\n\n\tlogger *slog.Logger\n}\n\n// NewUptimeCheckClient creates a new uptime check service client based on gRPC.\n// The returned client must be Closed when it is done being used to clean up its underlying connections.\n//\n// The UptimeCheckService API is used to manage (list, create, delete, edit)\n// Uptime check configurations in the Cloud Monitoring product. An Uptime\n// check is a piece of configuration that determines which resources and\n// services to monitor for availability. These configurations can also be\n// configured interactively by navigating to the [Cloud console]\n// (https://console.cloud.google.com (at https://console.cloud.google.com)), selecting the appropriate project,\n// clicking on “Monitoring” on the left-hand side to navigate to Cloud\n// Monitoring, and then clicking on “Uptime”.\nfunc NewUptimeCheckClient(ctx context.Context, opts ...option.ClientOption) (*UptimeCheckClient, error) {\n\tclientOpts := defaultUptimeCheckGRPCClientOptions()\n\tif newUptimeCheckClientHook != nil {\n\t\thookOpts, err := newUptimeCheckClientHook(ctx, clientHookParams{})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tclientOpts = append(clientOpts, hookOpts...)\n\t}\n\n\tconnPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tclient := UptimeCheckClient{CallOptions: defaultUptimeCheckCallOptions()}\n\n\tc := &uptimeCheckGRPCClient{\n\t\tconnPool:          connPool,\n\t\tuptimeCheckClient: monitoringpb.NewUptimeCheckServiceClient(connPool),\n\t\tCallOptions:       &client.CallOptions,\n\t\tlogger:            internaloption.GetLogger(opts),\n\t}\n\tc.setGoogleClientInfo()\n\n\tclient.internalClient = c\n\n\treturn &client, nil\n}\n\n// Connection returns a connection to the API service.\n//\n// Deprecated: Connections are now pooled so this method does not always\n// return the same resource.\nfunc (c *uptimeCheckGRPCClient) Connection() *grpc.ClientConn {\n\treturn c.connPool.Conn()\n}\n\n// setGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Intended for\n// use by Google-written clients.\nfunc (c *uptimeCheckGRPCClient) setGoogleClientInfo(keyval ...string) {\n\tkv := append([]string{\"gl-go\", gax.GoVersion}, keyval...)\n\tkv = append(kv, \"gapic\", getVersionClient(), \"gax\", gax.Version, \"grpc\", grpc.Version)\n\tc.xGoogHeaders = []string{\n\t\t\"x-goog-api-client\", gax.XGoogHeader(kv...),\n\t}\n}\n\n// Close closes the connection to the API service. The user should invoke this when\n// the client is no longer required.\nfunc (c *uptimeCheckGRPCClient) Close() error {\n\treturn c.connPool.Close()\n}\n\nfunc (c *uptimeCheckGRPCClient) ListUptimeCheckConfigs(ctx context.Context, req *monitoringpb.ListUptimeCheckConfigsRequest, opts ...gax.CallOption) *UptimeCheckConfigIterator {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"parent\", url.QueryEscape(req.GetParent()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).ListUptimeCheckConfigs[0:len((*c.CallOptions).ListUptimeCheckConfigs):len((*c.CallOptions).ListUptimeCheckConfigs)], opts...)\n\tit := &UptimeCheckConfigIterator{}\n\treq = proto.Clone(req).(*monitoringpb.ListUptimeCheckConfigsRequest)\n\tit.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.UptimeCheckConfig, string, error) {\n\t\tresp := &monitoringpb.ListUptimeCheckConfigsResponse{}\n\t\tif pageToken != \"\" {\n\t\t\treq.PageToken = pageToken\n\t\t}\n\t\tif pageSize > math.MaxInt32 {\n\t\t\treq.PageSize = math.MaxInt32\n\t\t} else if pageSize != 0 {\n\t\t\treq.PageSize = int32(pageSize)\n\t\t}\n\t\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\t\tvar err error\n\t\t\tresp, err = executeRPC(ctx, c.uptimeCheckClient.ListUptimeCheckConfigs, req, settings.GRPC, c.logger, \"ListUptimeCheckConfigs\")\n\t\t\treturn err\n\t\t}, opts...)\n\t\tif err != nil {\n\t\t\treturn nil, \"\", err\n\t\t}\n\n\t\tit.Response = resp\n\t\treturn resp.GetUptimeCheckConfigs(), resp.GetNextPageToken(), nil\n\t}\n\tfetch := func(pageSize int, pageToken string) (string, error) {\n\t\titems, nextPageToken, err := it.InternalFetch(pageSize, pageToken)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tit.items = append(it.items, items...)\n\t\treturn nextPageToken, nil\n\t}\n\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)\n\tit.pageInfo.MaxSize = int(req.GetPageSize())\n\tit.pageInfo.Token = req.GetPageToken()\n\n\treturn it\n}\n\nfunc (c *uptimeCheckGRPCClient) GetUptimeCheckConfig(ctx context.Context, req *monitoringpb.GetUptimeCheckConfigRequest, opts ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).GetUptimeCheckConfig[0:len((*c.CallOptions).GetUptimeCheckConfig):len((*c.CallOptions).GetUptimeCheckConfig)], opts...)\n\tvar resp *monitoringpb.UptimeCheckConfig\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.uptimeCheckClient.GetUptimeCheckConfig, req, settings.GRPC, c.logger, \"GetUptimeCheckConfig\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *uptimeCheckGRPCClient) CreateUptimeCheckConfig(ctx context.Context, req *monitoringpb.CreateUptimeCheckConfigRequest, opts ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"parent\", url.QueryEscape(req.GetParent()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).CreateUptimeCheckConfig[0:len((*c.CallOptions).CreateUptimeCheckConfig):len((*c.CallOptions).CreateUptimeCheckConfig)], opts...)\n\tvar resp *monitoringpb.UptimeCheckConfig\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.uptimeCheckClient.CreateUptimeCheckConfig, req, settings.GRPC, c.logger, \"CreateUptimeCheckConfig\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *uptimeCheckGRPCClient) UpdateUptimeCheckConfig(ctx context.Context, req *monitoringpb.UpdateUptimeCheckConfigRequest, opts ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"uptime_check_config.name\", url.QueryEscape(req.GetUptimeCheckConfig().GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).UpdateUptimeCheckConfig[0:len((*c.CallOptions).UpdateUptimeCheckConfig):len((*c.CallOptions).UpdateUptimeCheckConfig)], opts...)\n\tvar resp *monitoringpb.UptimeCheckConfig\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.uptimeCheckClient.UpdateUptimeCheckConfig, req, settings.GRPC, c.logger, \"UpdateUptimeCheckConfig\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *uptimeCheckGRPCClient) DeleteUptimeCheckConfig(ctx context.Context, req *monitoringpb.DeleteUptimeCheckConfigRequest, opts ...gax.CallOption) error {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"%s=%v\", \"name\", url.QueryEscape(req.GetName()))}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).DeleteUptimeCheckConfig[0:len((*c.CallOptions).DeleteUptimeCheckConfig):len((*c.CallOptions).DeleteUptimeCheckConfig)], opts...)\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\t_, err = executeRPC(ctx, c.uptimeCheckClient.DeleteUptimeCheckConfig, req, settings.GRPC, c.logger, \"DeleteUptimeCheckConfig\")\n\t\treturn err\n\t}, opts...)\n\treturn err\n}\n\nfunc (c *uptimeCheckGRPCClient) ListUptimeCheckIps(ctx context.Context, req *monitoringpb.ListUptimeCheckIpsRequest, opts ...gax.CallOption) *UptimeCheckIpIterator {\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, c.xGoogHeaders...)\n\topts = append((*c.CallOptions).ListUptimeCheckIps[0:len((*c.CallOptions).ListUptimeCheckIps):len((*c.CallOptions).ListUptimeCheckIps)], opts...)\n\tit := &UptimeCheckIpIterator{}\n\treq = proto.Clone(req).(*monitoringpb.ListUptimeCheckIpsRequest)\n\tit.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.UptimeCheckIp, string, error) {\n\t\tresp := &monitoringpb.ListUptimeCheckIpsResponse{}\n\t\tif pageToken != \"\" {\n\t\t\treq.PageToken = pageToken\n\t\t}\n\t\tif pageSize > math.MaxInt32 {\n\t\t\treq.PageSize = math.MaxInt32\n\t\t} else if pageSize != 0 {\n\t\t\treq.PageSize = int32(pageSize)\n\t\t}\n\t\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\t\tvar err error\n\t\t\tresp, err = executeRPC(ctx, c.uptimeCheckClient.ListUptimeCheckIps, req, settings.GRPC, c.logger, \"ListUptimeCheckIps\")\n\t\t\treturn err\n\t\t}, opts...)\n\t\tif err != nil {\n\t\t\treturn nil, \"\", err\n\t\t}\n\n\t\tit.Response = resp\n\t\treturn resp.GetUptimeCheckIps(), resp.GetNextPageToken(), nil\n\t}\n\tfetch := func(pageSize int, pageToken string) (string, error) {\n\t\titems, nextPageToken, err := it.InternalFetch(pageSize, pageToken)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tit.items = append(it.items, items...)\n\t\treturn nextPageToken, nil\n\t}\n\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)\n\tit.pageInfo.MaxSize = int(req.GetPageSize())\n\tit.pageInfo.Token = req.GetPageToken()\n\n\treturn it\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/apiv3/v2/version.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by gapicgen. DO NOT EDIT.\n\npackage monitoring\n\nimport \"cloud.google.com/go/monitoring/internal\"\n\nfunc init() {\n\tversionClient = internal.Version\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/monitoring/internal/version.go",
    "content": "// Copyright 2022 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage internal\n\n// Version is the current tagged release of the library.\nconst Version = \"1.24.2\"\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/CHANGES.md",
    "content": "# Changes\n\n\n## [1.54.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.53.0...storage/v1.54.0) (2025-05-12)\n\n\n### Features\n\n* **storage:** Add experimental ZB API option ([#12214](https://github.com/googleapis/google-cloud-go/issues/12214)) ([f669982](https://github.com/googleapis/google-cloud-go/commit/f669982de2abf64759eccf5c38bd669488b9cf6a))\n\n\n### Bug Fixes\n\n* **storage:** Fix append writer hang ([#12201](https://github.com/googleapis/google-cloud-go/issues/12201)) ([7ce2a2a](https://github.com/googleapis/google-cloud-go/commit/7ce2a2ad3ae9deff28c73c1bcc2e7001770464eb))\n* **storage:** Retry unwrapped EOFs ([#12202](https://github.com/googleapis/google-cloud-go/issues/12202)) ([b2d42bd](https://github.com/googleapis/google-cloud-go/commit/b2d42bda6a398f3aa00030b6e99bbcb40f132ff7))\n\n## [1.53.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.52.0...storage/v1.53.0) (2025-05-02)\n\n\n### Features\n\n* **storage/control:** Add Anywhere cache control APIs ([83ae06c](https://github.com/googleapis/google-cloud-go/commit/83ae06c3ec7d190e38856ba4cfd8a13f08356b4d))\n\n\n### Bug Fixes\n\n* **storage:** Fix append edge cases ([#12074](https://github.com/googleapis/google-cloud-go/issues/12074)) ([0eee1f9](https://github.com/googleapis/google-cloud-go/commit/0eee1f99a7dc0d1bfc36fa43d78933cae47962ee))\n* **storage:** Fix retries for redirection errors. ([#12093](https://github.com/googleapis/google-cloud-go/issues/12093)) ([3e177e7](https://github.com/googleapis/google-cloud-go/commit/3e177e755f5bf6aa96e8712cc4adcba7eb6f04f6))\n* **storage:** Handle gRPC deadlines in tests. ([#12092](https://github.com/googleapis/google-cloud-go/issues/12092)) ([30b7cd2](https://github.com/googleapis/google-cloud-go/commit/30b7cd27771ccbd49b70ee106da36362ba8f1e87))\n* **storage:** Update offset on resumable upload retry ([#12086](https://github.com/googleapis/google-cloud-go/issues/12086)) ([6ce8fe5](https://github.com/googleapis/google-cloud-go/commit/6ce8fe5aec0ec7916eda4d1405cab5f5f65a5de8))\n* **storage:** Validate Bidi option for MRD ([#12033](https://github.com/googleapis/google-cloud-go/issues/12033)) ([d9018cf](https://github.com/googleapis/google-cloud-go/commit/d9018cf640a9ac25e2b23b75b3bcfa734379ab09))\n\n\n### Documentation\n\n* **storage/control:** Added comments for Anywhere cache messages ([83ae06c](https://github.com/googleapis/google-cloud-go/commit/83ae06c3ec7d190e38856ba4cfd8a13f08356b4d))\n\n## [1.52.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.51.0...storage/v1.52.0) (2025-04-22)\n\n\n### Features\n\n* **storage/control:** Add Anywhere cache control APIs ([#11807](https://github.com/googleapis/google-cloud-go/issues/11807)) ([12bfa98](https://github.com/googleapis/google-cloud-go/commit/12bfa984f87099dbfbd5abf3436e440e62b04bad))\n* **storage:** Add CurrentState function to determine state of stream in MRD ([#11688](https://github.com/googleapis/google-cloud-go/issues/11688)) ([14e8e13](https://github.com/googleapis/google-cloud-go/commit/14e8e132d9d5808d1ca789792e7e39f0857991da))\n* **storage:** Add OwnerEntity to bucketAttrs ([#11857](https://github.com/googleapis/google-cloud-go/issues/11857)) ([4cd4a0c](https://github.com/googleapis/google-cloud-go/commit/4cd4a0ca1f6132ea6ed9df7b27310a3238a9c3fd))\n* **storage:** Takeover appendable object ([#11977](https://github.com/googleapis/google-cloud-go/issues/11977)) ([513b937](https://github.com/googleapis/google-cloud-go/commit/513b937420b945c4a76e20711f305c6ad8a77812))\n* **storage:** Unfinalized appendable objects. ([#11647](https://github.com/googleapis/google-cloud-go/issues/11647)) ([52c0218](https://github.com/googleapis/google-cloud-go/commit/52c02183fabf43fcba3893f493140ac28a7836d1))\n\n\n### Bug Fixes\n\n* **storage:** Fix Attrs for append takeover ([#11989](https://github.com/googleapis/google-cloud-go/issues/11989)) ([6db35b1](https://github.com/googleapis/google-cloud-go/commit/6db35b10567b7f1463bfef722b0fd72257190ee7))\n* **storage:** Fix panic when Flush called early ([#11934](https://github.com/googleapis/google-cloud-go/issues/11934)) ([7d0b8a7](https://github.com/googleapis/google-cloud-go/commit/7d0b8a75ae55731ae765c01f24920f9f11038f44))\n* **storage:** Fix unfinalized write size ([#12016](https://github.com/googleapis/google-cloud-go/issues/12016)) ([6217f8f](https://github.com/googleapis/google-cloud-go/commit/6217f8fd3cd8680a7e6b7b46fc9b7bda6ee6292e))\n* **storage:** Force first message on next sendBuffer when nothing sent on current ([#11871](https://github.com/googleapis/google-cloud-go/issues/11871)) ([a1a2292](https://github.com/googleapis/google-cloud-go/commit/a1a22927d6a4399e7392787bccb9707bc9e8f149))\n* **storage:** Populate Writer.Attrs after Flush() ([#12021](https://github.com/googleapis/google-cloud-go/issues/12021)) ([8e56f74](https://github.com/googleapis/google-cloud-go/commit/8e56f745e7f2175660838f96c1a12a46841cac40))\n* **storage:** Remove check for FinalizeOnClose ([#11992](https://github.com/googleapis/google-cloud-go/issues/11992)) ([2664b8c](https://github.com/googleapis/google-cloud-go/commit/2664b8cec00a606001184cb17c074fd0e79e66b8))\n* **storage:** Wrap read response parsing errors ([#11951](https://github.com/googleapis/google-cloud-go/issues/11951)) ([d2e6583](https://github.com/googleapis/google-cloud-go/commit/d2e658387b80ec8a3e41e048a9d520b8dd13dd00))\n\n\n## [1.51.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.50.0...storage/v1.51.0) (2025-03-07)\n\n\n### Features\n\n* **storage/append:** Support appends in w1r3. ([#11483](https://github.com/googleapis/google-cloud-go/issues/11483)) ([48bb391](https://github.com/googleapis/google-cloud-go/commit/48bb39154479a2cf2d379316e0915f39d7b7a518))\n* **storage:** Benchmark with experimental MRD. ([#11501](https://github.com/googleapis/google-cloud-go/issues/11501)) ([7b49152](https://github.com/googleapis/google-cloud-go/commit/7b491520a693d258d3370a19c43c9dff6c8558c7))\n* **storage:** Implement RetryChunkDeadline for grpc writes ([#11476](https://github.com/googleapis/google-cloud-go/issues/11476)) ([03575d7](https://github.com/googleapis/google-cloud-go/commit/03575d74f5241cc714e4d3ac63635569a34f5633))\n* **storage:** Specify benchmark integrity check. ([#11465](https://github.com/googleapis/google-cloud-go/issues/11465)) ([da18845](https://github.com/googleapis/google-cloud-go/commit/da188453e0254c49a01d28788d0849a2d0e98e0c))\n* **storage:** Use ReadHandle for faster re-connect ([#11510](https://github.com/googleapis/google-cloud-go/issues/11510)) ([cac52f7](https://github.com/googleapis/google-cloud-go/commit/cac52f79a73d46774d33d76e3075c0a5b3e0b9f3))\n* **storage:** Wrap NotFound errors for buckets and objects ([#11519](https://github.com/googleapis/google-cloud-go/issues/11519)) ([0dd7d3d](https://github.com/googleapis/google-cloud-go/commit/0dd7d3d62e54c6c3bca395fcca8450ad3347a5a0))\n\n\n### Bug Fixes\n\n* **storage/append:** Report progress for appends. ([#11503](https://github.com/googleapis/google-cloud-go/issues/11503)) ([96dbb6c](https://github.com/googleapis/google-cloud-go/commit/96dbb6c12398fb3cbffab2bf61836bef2f704f66))\n* **storage:** Add a safety check for readhandle ([#11549](https://github.com/googleapis/google-cloud-go/issues/11549)) ([c9edb37](https://github.com/googleapis/google-cloud-go/commit/c9edb379ece70f065650702c9240ee540ca2f610))\n* **storage:** Add universe domain to defaultSignBytesFunc ([#11521](https://github.com/googleapis/google-cloud-go/issues/11521)) ([511608b](https://github.com/googleapis/google-cloud-go/commit/511608b8e8554aa06f9fe2e2e4f51ead0f484031))\n* **storage:** Clone the defaultRetry to avoid modifying it directly ([#11533](https://github.com/googleapis/google-cloud-go/issues/11533)) ([7f8d69d](https://github.com/googleapis/google-cloud-go/commit/7f8d69dcd6a7b1ad6c1df8d9fe8dfb5fe0947479))\n* **storage:** Fix adding multiple range on stream with same read id ([#11584](https://github.com/googleapis/google-cloud-go/issues/11584)) ([0bb3434](https://github.com/googleapis/google-cloud-go/commit/0bb3434e0e12563ff21ef72ad2e52ad7eb61d66e))\n* **storage:** Modify the callback of mrd to return length of data read instead of limit. ([#11687](https://github.com/googleapis/google-cloud-go/issues/11687)) ([9e359f0](https://github.com/googleapis/google-cloud-go/commit/9e359f0089f744c32d12bf77889d69a4db155357))\n* **storage:** Propagate ctx from invoke to grpc upload reqs ([#11475](https://github.com/googleapis/google-cloud-go/issues/11475)) ([9ad9d76](https://github.com/googleapis/google-cloud-go/commit/9ad9d7665ca2f4cfdcee75f5e683084ac49536a6))\n* **storage:** Remove duplicate routing header ([#11534](https://github.com/googleapis/google-cloud-go/issues/11534)) ([8eeb59c](https://github.com/googleapis/google-cloud-go/commit/8eeb59cbfb16d8f379f7aa4c6f11e53cebbd38a6))\n* **storage:** Return sentinel ErrObjectNotExist for copy and compose ([#11369](https://github.com/googleapis/google-cloud-go/issues/11369)) ([74d0c10](https://github.com/googleapis/google-cloud-go/commit/74d0c1096f897ca3c15646f3049ea540bed0a6a0)), refs [#10760](https://github.com/googleapis/google-cloud-go/issues/10760)\n* **storage:** Wait for XML read req to finish to avoid data races ([#11527](https://github.com/googleapis/google-cloud-go/issues/11527)) ([782e12a](https://github.com/googleapis/google-cloud-go/commit/782e12a11c1dfe6d831f5d0b9b5f4409993e4d9e))\n\n## [1.50.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.49.0...storage/v1.50.0) (2025-01-09)\n\n\n### Features\n\n* **storage/internal:** Add new appendable Object to BidiWrite API ([2e4feb9](https://github.com/googleapis/google-cloud-go/commit/2e4feb938ce9ab023c8aa6bd1dbdf36fe589213a))\n* **storage/internal:** Add new preview BidiReadObject API ([2e4feb9](https://github.com/googleapis/google-cloud-go/commit/2e4feb938ce9ab023c8aa6bd1dbdf36fe589213a))\n* **storage:** Add support for gRPC bi-directional multi-range reads. This API is in private preview and not generally and is not yet available for general use. ([#11377](https://github.com/googleapis/google-cloud-go/issues/11377)) ([b4d86a5](https://github.com/googleapis/google-cloud-go/commit/b4d86a52bd319a602115cdb710a743c71494a88b))\n* **storage:** Add support for ReadHandle, a gRPC feature that allows for accelerated resumption of streams when one is interrupted. ReadHandle requires the bi-directional read API, which is in private preview and is not yet available for general use. ([#11377](https://github.com/googleapis/google-cloud-go/issues/11377)) ([b4d86a5](https://github.com/googleapis/google-cloud-go/commit/b4d86a52bd319a602115cdb710a743c71494a88b))\n* **storage:** Support appendable semantics for writes in gRPC. This API is in preview. ([#11377](https://github.com/googleapis/google-cloud-go/issues/11377)) ([b4d86a5](https://github.com/googleapis/google-cloud-go/commit/b4d86a52bd319a602115cdb710a743c71494a88b))\n* **storage:** Refactor gRPC writer flow ([#11377](https://github.com/googleapis/google-cloud-go/issues/11377)) ([b4d86a5](https://github.com/googleapis/google-cloud-go/commit/b4d86a52bd319a602115cdb710a743c71494a88b))\n\n\n### Bug Fixes\n\n* **storage:** Add mutex around uses of mrd variables ([#11405](https://github.com/googleapis/google-cloud-go/issues/11405)) ([54bfc32](https://github.com/googleapis/google-cloud-go/commit/54bfc32db7a0ff40a493de4d466f21ad624de04e))\n* **storage:** Return the appropriate error for method not supported ([#11416](https://github.com/googleapis/google-cloud-go/issues/11416)) ([56d704e](https://github.com/googleapis/google-cloud-go/commit/56d704e3037840aeb87b22cc83f2b6088c79bcee))\n\n\n### Documentation\n\n* **storage/internal:** Add IAM information to RPC comments for reference documentation ([2e4feb9](https://github.com/googleapis/google-cloud-go/commit/2e4feb938ce9ab023c8aa6bd1dbdf36fe589213a))\n* **storage:** Add preview comment to NewMultiRangeDownloader ([#11420](https://github.com/googleapis/google-cloud-go/issues/11420)) ([4ec1d66](https://github.com/googleapis/google-cloud-go/commit/4ec1d66ee180e800606568e8693a282645ec7369))\n\n## [1.49.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.48.0...storage/v1.49.0) (2024-12-21)\n\n\n### Features\n\n* **storage/internal:** Add finalize_time field in Object metadata ([46fc993](https://github.com/googleapis/google-cloud-go/commit/46fc993a3195203a230e2831bee456baaa9f7b1c))\n* **storage/internal:** Add MoveObject RPC ([46fc993](https://github.com/googleapis/google-cloud-go/commit/46fc993a3195203a230e2831bee456baaa9f7b1c))\n* **storage:** Add ObjectHandle.Move method ([#11302](https://github.com/googleapis/google-cloud-go/issues/11302)) ([a3cb8c4](https://github.com/googleapis/google-cloud-go/commit/a3cb8c4fc48883b54d4e830ae5f5ef4f1a3b8ca3))\n* **storage:** Return file metadata on read ([#11212](https://github.com/googleapis/google-cloud-go/issues/11212)) ([d49263b](https://github.com/googleapis/google-cloud-go/commit/d49263b2ab614cad801e26b4a169eafe08d4a2a0))\n\n\n### Bug Fixes\n\n* **storage/dataflux:** Address deadlock when reading from ranges ([#11303](https://github.com/googleapis/google-cloud-go/issues/11303)) ([32cbf56](https://github.com/googleapis/google-cloud-go/commit/32cbf561590541eb0387787bf729be6ddf68e4ee))\n* **storage:** Disable allow non-default credentials flag ([#11337](https://github.com/googleapis/google-cloud-go/issues/11337)) ([145ddf4](https://github.com/googleapis/google-cloud-go/commit/145ddf4f6123d9561856d2b6adeefdfae462b3f7))\n* **storage:** Monitored resource detection ([#11197](https://github.com/googleapis/google-cloud-go/issues/11197)) ([911bcd8](https://github.com/googleapis/google-cloud-go/commit/911bcd8b1816256482bd52e85da7eaf00c315293))\n* **storage:** Update golang.org/x/net to v0.33.0 ([e9b0b69](https://github.com/googleapis/google-cloud-go/commit/e9b0b69644ea5b276cacff0a707e8a5e87efafc9))\n\n## [1.48.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.47.0...storage/v1.48.0) (2024-12-05)\n\n\n### Features\n\n* **storage/dataflux:** Run worksteal listing parallel to sequential listing ([#10966](https://github.com/googleapis/google-cloud-go/issues/10966)) ([3005f5a](https://github.com/googleapis/google-cloud-go/commit/3005f5a86c18254e569b8b1782bf014aa62f33cc))\n* **storage:** Add Writer.ChunkTransferTimeout ([#11111](https://github.com/googleapis/google-cloud-go/issues/11111)) ([fd1db20](https://github.com/googleapis/google-cloud-go/commit/fd1db203d0de898891b9920aacb141ea39228609))\n* **storage:** Allow non default service account ([#11137](https://github.com/googleapis/google-cloud-go/issues/11137)) ([19f01c3](https://github.com/googleapis/google-cloud-go/commit/19f01c3c48ed1272c8fc0af9e5f69646cb662808))\n\n\n### Bug Fixes\n\n* **storage:** Add backoff to gRPC write retries ([#11200](https://github.com/googleapis/google-cloud-go/issues/11200)) ([a7db927](https://github.com/googleapis/google-cloud-go/commit/a7db927da9cf4c6cf242a5db83e44a16d75a8291))\n* **storage:** Correct direct connectivity check ([#11152](https://github.com/googleapis/google-cloud-go/issues/11152)) ([a75c8b0](https://github.com/googleapis/google-cloud-go/commit/a75c8b0f72c38d9a85c908715c3e37eb5cffb131))\n* **storage:** Disable soft delete policy using 0 retentionDurationSeconds ([#11226](https://github.com/googleapis/google-cloud-go/issues/11226)) ([f087721](https://github.com/googleapis/google-cloud-go/commit/f087721b7b20ad28ded1d0a84756a8bbaa2bb95a))\n* **storage:** Retry SignBlob call for URL signing ([#11154](https://github.com/googleapis/google-cloud-go/issues/11154)) ([f198452](https://github.com/googleapis/google-cloud-go/commit/f198452fd2b29e779e9080ba79d7e873eb0c32ef))\n\n## [1.47.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.46.0...storage/v1.47.0) (2024-11-14)\n\n\n### Features\n\n* **storage:** Introduce dp detector based on grpc metrics ([#11100](https://github.com/googleapis/google-cloud-go/issues/11100)) ([60c2323](https://github.com/googleapis/google-cloud-go/commit/60c2323102b623e042fc508e2b1bb830a03f9577))\n\n\n### Bug Fixes\n\n* **storage:** Bump auth dep ([#11135](https://github.com/googleapis/google-cloud-go/issues/11135)) ([9620a51](https://github.com/googleapis/google-cloud-go/commit/9620a51b2c6904d8d93e124494bc297fb98553d2))\n\n## [1.46.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.45.0...storage/v1.46.0) (2024-10-31) \n\n### Features\n\n* **storage:** Add grpc metrics experimental options ([#10984](https://github.com/googleapis/google-cloud-go/issues/10984)) ([5b7397b](https://github.com/googleapis/google-cloud-go/commit/5b7397b169176f030049e1511859a883422c774e))\n\n\n### Bug Fixes\n\n* **storage:** Skip only specific transport tests. ([#11016](https://github.com/googleapis/google-cloud-go/issues/11016)) ([d40fbff](https://github.com/googleapis/google-cloud-go/commit/d40fbff9c1984aeed0224a4ac93eb95c5af17126))\n* **storage:** Update google.golang.org/api to v0.203.0 ([8bb87d5](https://github.com/googleapis/google-cloud-go/commit/8bb87d56af1cba736e0fe243979723e747e5e11e))\n* **storage:** WARNING: On approximately Dec 1, 2024, an update to Protobuf will change service registration function signatures to use an interface instead of a concrete type in generated .pb.go files. This change is expected to affect very few if any users of this client library. For more information, see https://togithub.com/googleapis/google-cloud-go/issues/11020. ([2b8ca4b](https://github.com/googleapis/google-cloud-go/commit/2b8ca4b4127ce3025c7a21cc7247510e07cc5625))\n\n\n### Miscellaneous Chores\n\n* **storage/internal:** Remove notification, service account, and hmac RPCS. These API have been migrated to Storage Control and are available via the JSON API. ([#11008](https://github.com/googleapis/google-cloud-go/issues/11008)) ([e0759f4](https://github.com/googleapis/google-cloud-go/commit/e0759f46639b4c542e5b49e4dc81340d8e123370)) \n\n## [1.45.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.44.0...storage/v1.45.0) (2024-10-17)\n\n\n### Features\n\n* **storage/internal:** Adds support for restore token ([70d82fe](https://github.com/googleapis/google-cloud-go/commit/70d82fe93f60f1075298a077ce1616f9ae7e13fe))\n* **storage:** Adding bucket-specific dynamicDelay ([#10987](https://github.com/googleapis/google-cloud-go/issues/10987)) ([a807a7e](https://github.com/googleapis/google-cloud-go/commit/a807a7e7f9fb002374407622c126102c5e61af82))\n* **storage:** Dynamic read request stall timeout ([#10958](https://github.com/googleapis/google-cloud-go/issues/10958)) ([a09f00e](https://github.com/googleapis/google-cloud-go/commit/a09f00eeecac82af98ae769bab284ee58a3a66cb))\n\n\n### Documentation\n\n* **storage:** Remove preview wording from NewGRPCClient ([#11002](https://github.com/googleapis/google-cloud-go/issues/11002)) ([40c3a5b](https://github.com/googleapis/google-cloud-go/commit/40c3a5b9c4cd4db2f1695e180419197b6a03ed7f))\n\n## [1.44.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.43.0...storage/v1.44.0) (2024-10-03)\n\n\n### Features\n\n* **storage/dataflux:** Add dataflux interface ([#10748](https://github.com/googleapis/google-cloud-go/issues/10748)) ([cb7b0a1](https://github.com/googleapis/google-cloud-go/commit/cb7b0a1b285de9d4182155a123747419232dd35f))\n* **storage/dataflux:** Add range_splitter [#10748](https://github.com/googleapis/google-cloud-go/issues/10748) ([#10899](https://github.com/googleapis/google-cloud-go/issues/10899)) ([d49da26](https://github.com/googleapis/google-cloud-go/commit/d49da26be7dc52fad37c392c2876f62b1a5625a2))\n* **storage/dataflux:** Add worksteal algorithm to fast-listing ([#10913](https://github.com/googleapis/google-cloud-go/issues/10913)) ([015b52c](https://github.com/googleapis/google-cloud-go/commit/015b52c345df75408be3edcfda96d37145794f9f))\n* **storage/internal:** Add managed folder to testIamPermissions method ([2f0aec8](https://github.com/googleapis/google-cloud-go/commit/2f0aec894179304d234be6c792d82cf4336b6d0a))\n* **storage/transfermanager:** Add option to StripPrefix on directory download ([#10894](https://github.com/googleapis/google-cloud-go/issues/10894)) ([607534c](https://github.com/googleapis/google-cloud-go/commit/607534cdd5edf2d15d3de891cf6a0b6cbaa7d545))\n* **storage/transfermanager:** Add SkipIfExists option ([#10893](https://github.com/googleapis/google-cloud-go/issues/10893)) ([7daa1bd](https://github.com/googleapis/google-cloud-go/commit/7daa1bdc78844adac80f6378b1f6f2dd415b80a8))\n* **storage/transfermanager:** Checksum full object downloads ([#10569](https://github.com/googleapis/google-cloud-go/issues/10569)) ([c366c90](https://github.com/googleapis/google-cloud-go/commit/c366c908534ef09442f1f3e8a4f74bd545a474fb))\n* **storage:** Add direct google access side-effect imports by default ([#10757](https://github.com/googleapis/google-cloud-go/issues/10757)) ([9ad8324](https://github.com/googleapis/google-cloud-go/commit/9ad83248a7049c82580bc45d9685c329811bce88))\n* **storage:** Add full object checksum to reader.Attrs ([#10538](https://github.com/googleapis/google-cloud-go/issues/10538)) ([245d2ea](https://github.com/googleapis/google-cloud-go/commit/245d2eaddb4862da7c8d1892d5d462bf390adb2b))\n* **storage:** Add support for Go 1.23 iterators ([84461c0](https://github.com/googleapis/google-cloud-go/commit/84461c0ba464ec2f951987ba60030e37c8a8fc18))\n* **storage:** Add update time in bucketAttrs ([#10710](https://github.com/googleapis/google-cloud-go/issues/10710)) ([5f06ae1](https://github.com/googleapis/google-cloud-go/commit/5f06ae1a331c46ded47c96c205b3f1be92d64d29)), refs [#9361](https://github.com/googleapis/google-cloud-go/issues/9361)\n* **storage:** GA gRPC client  ([#10859](https://github.com/googleapis/google-cloud-go/issues/10859)) ([c7a55a2](https://github.com/googleapis/google-cloud-go/commit/c7a55a26c645905317fe27505d503c338f50ee34))\n* **storage:** Introduce gRPC client-side metrics ([#10639](https://github.com/googleapis/google-cloud-go/issues/10639)) ([437bcb1](https://github.com/googleapis/google-cloud-go/commit/437bcb1e0b514959648eed36ba3963aa4fbeffc8))\n* **storage:** Support IncludeFoldersAsPrefixes for gRPC ([#10767](https://github.com/googleapis/google-cloud-go/issues/10767)) ([65bcc59](https://github.com/googleapis/google-cloud-go/commit/65bcc59a6c0753f8fbd66c8792bc69300e95ec62))\n\n\n### Bug Fixes\n\n* **storage/transfermanager:** Correct Attrs.StartOffset for sharded downloads ([#10512](https://github.com/googleapis/google-cloud-go/issues/10512)) ([01a5cbb](https://github.com/googleapis/google-cloud-go/commit/01a5cbba6d9d9f425f045b58fa16d8c85804c29c))\n* **storage:** Add retryalways policy to encryption test ([#10644](https://github.com/googleapis/google-cloud-go/issues/10644)) ([59cfd12](https://github.com/googleapis/google-cloud-go/commit/59cfd12ce5650279c99787da4a273db1e3253c76)), refs [#10567](https://github.com/googleapis/google-cloud-go/issues/10567)\n* **storage:** Add unknown host to retriable errors ([#10619](https://github.com/googleapis/google-cloud-go/issues/10619)) ([4ec0452](https://github.com/googleapis/google-cloud-go/commit/4ec0452a393341b1036ac6e1e7287843f097d978))\n* **storage:** Bump dependencies ([2ddeb15](https://github.com/googleapis/google-cloud-go/commit/2ddeb1544a53188a7592046b98913982f1b0cf04))\n* **storage:** Bump google.golang.org/grpc@v1.64.1 ([8ecc4e9](https://github.com/googleapis/google-cloud-go/commit/8ecc4e9622e5bbe9b90384d5848ab816027226c5))\n* **storage:** Check for grpc NotFound error in HMAC test ([#10645](https://github.com/googleapis/google-cloud-go/issues/10645)) ([3c8e88a](https://github.com/googleapis/google-cloud-go/commit/3c8e88a085bab3142dfff6ef9a8e49c29a5c877d))\n* **storage:** Disable grpc metrics using emulator ([#10870](https://github.com/googleapis/google-cloud-go/issues/10870)) ([35ad73d](https://github.com/googleapis/google-cloud-go/commit/35ad73d3be5485ac592e2ef1ea6c0854f1eff4a0))\n* **storage:** Retry gRPC DEADLINE_EXCEEDED errors ([#10635](https://github.com/googleapis/google-cloud-go/issues/10635)) ([0018415](https://github.com/googleapis/google-cloud-go/commit/0018415295a5fd964b923db6a4785e9eed46a2e2))\n* **storage:** Update dependencies ([257c40b](https://github.com/googleapis/google-cloud-go/commit/257c40bd6d7e59730017cf32bda8823d7a232758))\n* **storage:** Update google.golang.org/api to v0.191.0 ([5b32644](https://github.com/googleapis/google-cloud-go/commit/5b32644eb82eb6bd6021f80b4fad471c60fb9d73))\n\n\n### Performance Improvements\n\n* **storage:** GRPC zerocopy codec ([#10888](https://github.com/googleapis/google-cloud-go/issues/10888)) ([aeba28f](https://github.com/googleapis/google-cloud-go/commit/aeba28ffffcd82ac5540e45247112bdacc5c530d))\n\n\n### Documentation\n\n* **storage/internal:** Clarify possible objectAccessControl roles ([2f0aec8](https://github.com/googleapis/google-cloud-go/commit/2f0aec894179304d234be6c792d82cf4336b6d0a))\n* **storage/internal:** Update dual-region bucket link ([2f0aec8](https://github.com/googleapis/google-cloud-go/commit/2f0aec894179304d234be6c792d82cf4336b6d0a))\n\n## [1.43.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.42.0...storage/v1.43.0) (2024-07-03)\n\n\n### Features\n\n* **storage/transfermanager:** Add DownloadDirectory  ([#10430](https://github.com/googleapis/google-cloud-go/issues/10430)) ([0d0e5dd](https://github.com/googleapis/google-cloud-go/commit/0d0e5dd5214769cc2c197991c2ece1303bd600de))\n* **storage/transfermanager:** Automatically shard downloads ([#10379](https://github.com/googleapis/google-cloud-go/issues/10379)) ([05816f9](https://github.com/googleapis/google-cloud-go/commit/05816f9fafd3132c371da37f3a879bb9e8e7e604))\n\n\n### Bug Fixes\n\n* **storage/transfermanager:** WaitAndClose waits for Callbacks to finish ([#10504](https://github.com/googleapis/google-cloud-go/issues/10504)) ([0e81002](https://github.com/googleapis/google-cloud-go/commit/0e81002b3a5e560c874d814d28a35a102311d9ef)), refs [#10502](https://github.com/googleapis/google-cloud-go/issues/10502)\n* **storage:** Allow empty soft delete on Create ([#10394](https://github.com/googleapis/google-cloud-go/issues/10394)) ([d8bd2c1](https://github.com/googleapis/google-cloud-go/commit/d8bd2c1ffc4f27503a74ded438d8bfbdd7707c63)), refs [#10380](https://github.com/googleapis/google-cloud-go/issues/10380)\n* **storage:** Bump google.golang.org/api@v0.187.0 ([8fa9e39](https://github.com/googleapis/google-cloud-go/commit/8fa9e398e512fd8533fd49060371e61b5725a85b))\n* **storage:** Retry broken pipe error ([#10374](https://github.com/googleapis/google-cloud-go/issues/10374)) ([2f4daa1](https://github.com/googleapis/google-cloud-go/commit/2f4daa11acf9d3f260fa888333090359c4d9198e)), refs [#9178](https://github.com/googleapis/google-cloud-go/issues/9178)\n\n\n### Documentation\n\n* **storage/control:** Remove allowlist note from Folders RPCs ([d6c543c](https://github.com/googleapis/google-cloud-go/commit/d6c543c3969016c63e158a862fc173dff60fb8d9))\n\n## [1.42.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.41.0...storage/v1.42.0) (2024-06-10)\n\n\n### Features\n\n* **storage:** Add new package transfermanager. This package is intended for parallel uploads and downloads, and is in preview. It is not stable, and is likely to change. ([#10045](https://github.com/googleapis/google-cloud-go/issues/10045)) ([cde5cbb](https://github.com/googleapis/google-cloud-go/commit/cde5cbba3145d5a702683656a42158621234fe71))\n* **storage:** Add bucket HierarchicalNamespace ([#10315](https://github.com/googleapis/google-cloud-go/issues/10315)) ([b92406c](https://github.com/googleapis/google-cloud-go/commit/b92406ccfadfdcee379e86d6f78c901d772401a9)), refs [#10146](https://github.com/googleapis/google-cloud-go/issues/10146)\n* **storage:** Add BucketName to BucketHandle ([#10127](https://github.com/googleapis/google-cloud-go/issues/10127)) ([203cc59](https://github.com/googleapis/google-cloud-go/commit/203cc599e5e2f2f821dc75b47c5a4c9073333f05))\n\n\n### Bug Fixes\n\n* **storage:** Set invocation headers on xml reads ([#10250](https://github.com/googleapis/google-cloud-go/issues/10250)) ([c87e1ab](https://github.com/googleapis/google-cloud-go/commit/c87e1ab6f9618b8b3f4d0005ac159abd87b0daaf))\n\n\n### Documentation\n\n* **storage:** Update autoclass doc ([#10135](https://github.com/googleapis/google-cloud-go/issues/10135)) ([e4b2737](https://github.com/googleapis/google-cloud-go/commit/e4b2737ddc16d3bf8139a6def7326ac905f62acd))\n\n## [1.41.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.40.0...storage/v1.41.0) (2024-05-13)\n\n\n### Features\n\n* **storage/control:** Make Managed Folders operations public ([264a6dc](https://github.com/googleapis/google-cloud-go/commit/264a6dcddbffaec987dce1dc00f6550c263d2df7))\n* **storage:** Support for soft delete policies and restore ([#9520](https://github.com/googleapis/google-cloud-go/issues/9520)) ([985deb2](https://github.com/googleapis/google-cloud-go/commit/985deb2bdd1c79944cdd960bd3fbfa38cbfa1c91))\n\n\n### Bug Fixes\n\n* **storage/control:** An existing resource pattern value `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder=**}` to resource definition `storage.googleapis.com/ManagedFolder` is removed ([3e25053](https://github.com/googleapis/google-cloud-go/commit/3e250530567ee81ed4f51a3856c5940dbec35289))\n* **storage:** Add internaloption.WithDefaultEndpointTemplate ([3b41408](https://github.com/googleapis/google-cloud-go/commit/3b414084450a5764a0248756e95e13383a645f90))\n* **storage:** Bump x/net to v0.24.0 ([ba31ed5](https://github.com/googleapis/google-cloud-go/commit/ba31ed5fda2c9664f2e1cf972469295e63deb5b4))\n* **storage:** Disable gax retries for gRPC ([#9747](https://github.com/googleapis/google-cloud-go/issues/9747)) ([bbfc0ac](https://github.com/googleapis/google-cloud-go/commit/bbfc0acc272f21bf1f558ea23648183d5a11cda5))\n* **storage:** More strongly match regex ([#9706](https://github.com/googleapis/google-cloud-go/issues/9706)) ([3cfc8eb](https://github.com/googleapis/google-cloud-go/commit/3cfc8eb418e064d734bf3d8708162062dbbe988f)), refs [#9705](https://github.com/googleapis/google-cloud-go/issues/9705)\n* **storage:** Retry net.OpError on connection reset ([#10154](https://github.com/googleapis/google-cloud-go/issues/10154)) ([54fab10](https://github.com/googleapis/google-cloud-go/commit/54fab107f98b4f79c9df2959a05b981be0a613c1)), refs [#9478](https://github.com/googleapis/google-cloud-go/issues/9478)\n* **storage:** Wrap error when MaxAttempts is hit ([#9767](https://github.com/googleapis/google-cloud-go/issues/9767)) ([9cb262b](https://github.com/googleapis/google-cloud-go/commit/9cb262bb65a162665bfb8bed0022615131bae1f2)), refs [#9720](https://github.com/googleapis/google-cloud-go/issues/9720)\n\n\n### Documentation\n\n* **storage/control:** Update storage control documentation and add PHP for publishing ([1d757c6](https://github.com/googleapis/google-cloud-go/commit/1d757c66478963d6cbbef13fee939632c742759c))\n\n## [1.40.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.39.1...storage/v1.40.0) (2024-03-29)\n\n\n### Features\n\n* **storage:** Implement io.WriterTo in Reader ([#9659](https://github.com/googleapis/google-cloud-go/issues/9659)) ([8264a96](https://github.com/googleapis/google-cloud-go/commit/8264a962d1c21d52e8fca50af064c5535c3708d3))\n* **storage:** New storage control client ([#9631](https://github.com/googleapis/google-cloud-go/issues/9631)) ([1f4d279](https://github.com/googleapis/google-cloud-go/commit/1f4d27957743878976d6b4549cc02a5bb894d330))\n\n\n### Bug Fixes\n\n* **storage:** Retry errors from last recv on uploads ([#9616](https://github.com/googleapis/google-cloud-go/issues/9616)) ([b6574aa](https://github.com/googleapis/google-cloud-go/commit/b6574aa42ebad0532c2749b6ece879b932f95cb9))\n* **storage:** Update protobuf dep to v1.33.0 ([30b038d](https://github.com/googleapis/google-cloud-go/commit/30b038d8cac0b8cd5dd4761c87f3f298760dd33a))\n\n\n### Performance Improvements\n\n* **storage:** Remove protobuf's copy of data on unmarshalling ([#9526](https://github.com/googleapis/google-cloud-go/issues/9526)) ([81281c0](https://github.com/googleapis/google-cloud-go/commit/81281c04e503fd83301baf88cc352c77f5d476ca))\n\n## [1.39.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.39.0...storage/v1.39.1) (2024-03-11)\n\n\n### Bug Fixes\n\n* **storage:** Add object validation case and test ([#9521](https://github.com/googleapis/google-cloud-go/issues/9521)) ([386bef3](https://github.com/googleapis/google-cloud-go/commit/386bef319b4678beaa926ddfe4edef190f11b68d))\n\n## [1.39.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.38.0...storage/v1.39.0) (2024-02-29)\n\n\n### Features\n\n* **storage:** Make it possible to disable Content-Type sniffing ([#9431](https://github.com/googleapis/google-cloud-go/issues/9431)) ([0676670](https://github.com/googleapis/google-cloud-go/commit/067667058c06689b64401be11858d84441584039))\n\n## [1.38.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.37.0...storage/v1.38.0) (2024-02-12)\n\n\n### Features\n\n* **storage:** Support auto-detection of access ID for external_account creds ([#9208](https://github.com/googleapis/google-cloud-go/issues/9208)) ([b958d44](https://github.com/googleapis/google-cloud-go/commit/b958d44589f2b6b226ea3bef23829ac75a0aa6a6))\n* **storage:** Support custom hostname for VirtualHostedStyle SignedURLs ([#9348](https://github.com/googleapis/google-cloud-go/issues/9348)) ([7eec40e](https://github.com/googleapis/google-cloud-go/commit/7eec40e4cf82c53e5bf02bd2c14e0b25043da6d0))\n* **storage:** Support universe domains ([#9344](https://github.com/googleapis/google-cloud-go/issues/9344)) ([29a7498](https://github.com/googleapis/google-cloud-go/commit/29a7498b8eb0d00fdb5acd7ee8ce0e5a2a8c11ce))\n\n\n### Bug Fixes\n\n* **storage:** Fix v4 url signing for hosts that specify ports ([#9347](https://github.com/googleapis/google-cloud-go/issues/9347)) ([f127b46](https://github.com/googleapis/google-cloud-go/commit/f127b4648f861c1ba44f41a280a62652620c04c2))\n\n\n### Documentation\n\n* **storage:** Indicate that gRPC is incompatible with universe domains ([#9386](https://github.com/googleapis/google-cloud-go/issues/9386)) ([e8bd85b](https://github.com/googleapis/google-cloud-go/commit/e8bd85bbce12d5f7ab87fa49d166a6a0d84bd12d))\n\n## [1.37.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.36.0...storage/v1.37.0) (2024-01-24)\n\n\n### Features\n\n* **storage:** Add maxAttempts RetryOption ([#9215](https://github.com/googleapis/google-cloud-go/issues/9215)) ([e348cc5](https://github.com/googleapis/google-cloud-go/commit/e348cc5340e127b530e8ee4664fd995e6f038b2c))\n* **storage:** Support IncludeFoldersAsPrefixes ([#9211](https://github.com/googleapis/google-cloud-go/issues/9211)) ([98c9d71](https://github.com/googleapis/google-cloud-go/commit/98c9d7157306de5134547a67c084c248484c9a51))\n\n\n### Bug Fixes\n\n* **storage:** Migrate deprecated proto dep ([#9232](https://github.com/googleapis/google-cloud-go/issues/9232)) ([ebbb610](https://github.com/googleapis/google-cloud-go/commit/ebbb610e0f58035fd01ad7893971382d8bbd092f)), refs [#9189](https://github.com/googleapis/google-cloud-go/issues/9189)\n\n## [1.36.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.35.1...storage/v1.36.0) (2023-12-14)\n\n\n### Features\n\n* **storage:** Add object retention feature ([#9072](https://github.com/googleapis/google-cloud-go/issues/9072)) ([16ecfd1](https://github.com/googleapis/google-cloud-go/commit/16ecfd150ff1982f03d207a80a82e934d1013874))\n\n\n### Bug Fixes\n\n* **storage:** Do not inhibit the dead code elimination. ([#8543](https://github.com/googleapis/google-cloud-go/issues/8543)) ([ca2493f](https://github.com/googleapis/google-cloud-go/commit/ca2493f43c299bbaed5f7e5b70f66cc763ff9802))\n* **storage:** Set flush and get_state to false on the last write in gRPC ([#9013](https://github.com/googleapis/google-cloud-go/issues/9013)) ([c1e9fe5](https://github.com/googleapis/google-cloud-go/commit/c1e9fe5f4166a71e55814ccf126926ec0e0e7945))\n\n## [1.35.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.35.0...storage/v1.35.1) (2023-11-09)\n\n\n### Bug Fixes\n\n* **storage:** Rename aux.go to auxiliary.go fixing windows build ([ba23673](https://github.com/googleapis/google-cloud-go/commit/ba23673da7707c31292e4aa29d65b7ac1446d4a6))\n\n## [1.35.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.34.1...storage/v1.35.0) (2023-11-09)\n\n\n### Features\n\n* **storage:** Change gRPC writes to use bi-directional streams ([#8930](https://github.com/googleapis/google-cloud-go/issues/8930)) ([3e23a36](https://github.com/googleapis/google-cloud-go/commit/3e23a364b1a20c4fda7aef257e4136586ec769a4))\n\n## [1.34.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.34.0...storage/v1.34.1) (2023-11-01)\n\n\n### Bug Fixes\n\n* **storage:** Bump google.golang.org/api to v0.149.0 ([8d2ab9f](https://github.com/googleapis/google-cloud-go/commit/8d2ab9f320a86c1c0fab90513fc05861561d0880))\n\n## [1.34.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.33.0...storage/v1.34.0) (2023-10-31)\n\n\n### Features\n\n* **storage/internal:** Add match_glob field to ListObjectsRequest ([#8618](https://github.com/googleapis/google-cloud-go/issues/8618)) ([e9ae601](https://github.com/googleapis/google-cloud-go/commit/e9ae6018983ae09781740e4ff939e6e365863dbb))\n* **storage/internal:** Add terminal_storage_class fields to Autoclass message ([57fc1a6](https://github.com/googleapis/google-cloud-go/commit/57fc1a6de326456eb68ef25f7a305df6636ed386))\n* **storage/internal:** Adds the RestoreObject operation ([56ce871](https://github.com/googleapis/google-cloud-go/commit/56ce87195320634b07ae0b012efcc5f2b3813fb0))\n* **storage:** Support autoclass v2.1 ([#8721](https://github.com/googleapis/google-cloud-go/issues/8721)) ([fe1e195](https://github.com/googleapis/google-cloud-go/commit/fe1e19590a252c6adc6ca6c51a69b6e561e143b8))\n* **storage:** Support MatchGlob for gRPC ([#8670](https://github.com/googleapis/google-cloud-go/issues/8670)) ([3df0287](https://github.com/googleapis/google-cloud-go/commit/3df0287f88d5e2c4526e9e6b8dc2a4ca54f88918)), refs [#7727](https://github.com/googleapis/google-cloud-go/issues/7727)\n\n\n### Bug Fixes\n\n* **storage:** Drop stream reference after closing it for gRPC writes ([#8872](https://github.com/googleapis/google-cloud-go/issues/8872)) ([525abde](https://github.com/googleapis/google-cloud-go/commit/525abdee433864d4d456f1f1fff5599017b557ff))\n* **storage:** Update golang.org/x/net to v0.17.0 ([174da47](https://github.com/googleapis/google-cloud-go/commit/174da47254fefb12921bbfc65b7829a453af6f5d))\n* **storage:** Update grpc-go to v1.56.3 ([343cea8](https://github.com/googleapis/google-cloud-go/commit/343cea8c43b1e31ae21ad50ad31d3b0b60143f8c))\n* **storage:** Update grpc-go to v1.59.0 ([81a97b0](https://github.com/googleapis/google-cloud-go/commit/81a97b06cb28b25432e4ece595c55a9857e960b7))\n\n## [1.33.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.32.0...storage/v1.33.0) (2023-09-07)\n\n\n### Features\n\n* **storage:** Export gRPC client constructor ([#8509](https://github.com/googleapis/google-cloud-go/issues/8509)) ([1a928ae](https://github.com/googleapis/google-cloud-go/commit/1a928ae205f2325cb5206304af4d609dc3c1447a))\n\n## [1.32.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.31.0...storage/v1.32.0) (2023-08-15)\n\n\n### Features\n\n* **storage:** Add support for custom headers ([#8294](https://github.com/googleapis/google-cloud-go/issues/8294)) ([313fd4a](https://github.com/googleapis/google-cloud-go/commit/313fd4a60380d36c5ecaead3e968dbc84d044a0b))\n* **storage:** Add trace span to Writer ([#8375](https://github.com/googleapis/google-cloud-go/issues/8375)) ([f7ac85b](https://github.com/googleapis/google-cloud-go/commit/f7ac85bec2806d351529714bd7744a91a9fdefdd)), refs [#6144](https://github.com/googleapis/google-cloud-go/issues/6144)\n* **storage:** Support single-shot uploads in gRPC ([#8348](https://github.com/googleapis/google-cloud-go/issues/8348)) ([7de4a7d](https://github.com/googleapis/google-cloud-go/commit/7de4a7da31ab279a343b1592b15a126cda03e5e7)), refs [#7798](https://github.com/googleapis/google-cloud-go/issues/7798)\n* **storage:** Trace span covers life of a Reader ([#8390](https://github.com/googleapis/google-cloud-go/issues/8390)) ([8de30d7](https://github.com/googleapis/google-cloud-go/commit/8de30d752eec2fed2ea4c127482d3e213f9050e2))\n\n\n### Bug Fixes\n\n* **storage:** Fix AllObjects condition in gRPC ([#8184](https://github.com/googleapis/google-cloud-go/issues/8184)) ([2b99e4f](https://github.com/googleapis/google-cloud-go/commit/2b99e4f39be20fe21e8bc5c1ec1c0e758222c46e)), refs [#6205](https://github.com/googleapis/google-cloud-go/issues/6205)\n* **storage:** Fix gRPC generation/condition issues ([#8396](https://github.com/googleapis/google-cloud-go/issues/8396)) ([ca68ff5](https://github.com/googleapis/google-cloud-go/commit/ca68ff54b680732b59b223655070d0f6abccefee))\n* **storage:** Same method name and Trace Span name ([#8150](https://github.com/googleapis/google-cloud-go/issues/8150)) ([e277213](https://github.com/googleapis/google-cloud-go/commit/e2772133896bb94097b5d1f090f1bcafd136f2ed))\n* **storage:** Update gRPC retry codes ([#8202](https://github.com/googleapis/google-cloud-go/issues/8202)) ([afdf772](https://github.com/googleapis/google-cloud-go/commit/afdf772fc6a90b3010eee9d70ab65e22e276f53f))\n\n## [1.31.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.30.1...storage/v1.31.0) (2023-06-27)\n\n\n### Features\n\n* **storage/internal:** Add ctype=CORD for ChecksummedData.content ([ca94e27](https://github.com/googleapis/google-cloud-go/commit/ca94e2724f9e2610b46aefd0a3b5ddc06102e91b))\n* **storage:** Add support for MatchGlob ([#8097](https://github.com/googleapis/google-cloud-go/issues/8097)) ([9426a5a](https://github.com/googleapis/google-cloud-go/commit/9426a5a45d4c2fd07f84261f6d602680e79cdc48)), refs [#7727](https://github.com/googleapis/google-cloud-go/issues/7727) [#7728](https://github.com/googleapis/google-cloud-go/issues/7728)\n* **storage:** Respect WithEndpoint for SignedURLs and PostPolicy ([#8113](https://github.com/googleapis/google-cloud-go/issues/8113)) ([f918f23](https://github.com/googleapis/google-cloud-go/commit/f918f23a3cda4fbc8d709e32b914ead8b735d664))\n* **storage:** Update all direct dependencies ([b340d03](https://github.com/googleapis/google-cloud-go/commit/b340d030f2b52a4ce48846ce63984b28583abde6))\n\n\n### Bug Fixes\n\n* **storage:** Fix CreateBucket logic for gRPC ([#8165](https://github.com/googleapis/google-cloud-go/issues/8165)) ([8424e7e](https://github.com/googleapis/google-cloud-go/commit/8424e7e145a117c91006318fa924a8b2643c1c7e)), refs [#8162](https://github.com/googleapis/google-cloud-go/issues/8162)\n* **storage:** Fix reads with \"./\" in object names [XML] ([#8017](https://github.com/googleapis/google-cloud-go/issues/8017)) ([6b7b21f](https://github.com/googleapis/google-cloud-go/commit/6b7b21f8a334b6ad3a25e1f66ae1265b4d1f0995))\n* **storage:** Fix routing header for writes ([#8159](https://github.com/googleapis/google-cloud-go/issues/8159)) ([42a59f5](https://github.com/googleapis/google-cloud-go/commit/42a59f5a23ab9b4743ab032ad92304922c801d93)), refs [#8142](https://github.com/googleapis/google-cloud-go/issues/8142) [#8143](https://github.com/googleapis/google-cloud-go/issues/8143) [#8144](https://github.com/googleapis/google-cloud-go/issues/8144) [#8145](https://github.com/googleapis/google-cloud-go/issues/8145) [#8149](https://github.com/googleapis/google-cloud-go/issues/8149)\n* **storage:** REST query UpdateMask bug ([df52820](https://github.com/googleapis/google-cloud-go/commit/df52820b0e7721954809a8aa8700b93c5662dc9b))\n* **storage:** Update grpc to v1.55.0 ([1147ce0](https://github.com/googleapis/google-cloud-go/commit/1147ce02a990276ca4f8ab7a1ab65c14da4450ef))\n\n\n### Documentation\n\n* **storage/internal:** Clarifications about behavior of DeleteObject RPC ([3f1ed9c](https://github.com/googleapis/google-cloud-go/commit/3f1ed9c63fb115f47607a3ab478842fe5ba0df11))\n* **storage/internal:** Clarified the behavior of supplying bucket.name field in CreateBucket to reflect actual implementation ([ebae64d](https://github.com/googleapis/google-cloud-go/commit/ebae64d53397ec5dfe851f098754eaa1f5df7cb1))\n* **storage/internal:** Revert ChecksummedData message definition not to specify ctype=CORD, because it would be a breaking change. ([ef61e47](https://github.com/googleapis/google-cloud-go/commit/ef61e4799280a355b960da8ae240ceb2efbe71ac))\n* **storage/internal:** Update routing annotations for CancelResumableWriteRequest and QueryWriteStatusRequest ([4900851](https://github.com/googleapis/google-cloud-go/commit/49008518e168fe6f7891b907d6fc14eecdef758c))\n* **storage/internal:** Updated ChecksummedData message definition to specify ctype=CORD, and removed incorrect earlier attempt that set that annotation in the ReadObjectResponse message definition ([ef61e47](https://github.com/googleapis/google-cloud-go/commit/ef61e4799280a355b960da8ae240ceb2efbe71ac))\n* **storage:** WithXMLReads should mention XML instead of JSON API ([#7881](https://github.com/googleapis/google-cloud-go/issues/7881)) ([36f56c8](https://github.com/googleapis/google-cloud-go/commit/36f56c80c456ca74ffc03df76844ce15980ced82))\n\n## [1.30.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.30.0...storage/v1.30.1) (2023-03-21)\n\n\n### Bug Fixes\n\n* **storage:** Retract versions with Copier bug ([#7583](https://github.com/googleapis/google-cloud-go/issues/7583)) ([9c10b6f](https://github.com/googleapis/google-cloud-go/commit/9c10b6f8a54cb8447260148b5e4a9b5160281020))\n  * Versions v1.25.0-v1.27.0 are retracted due to [#6857](https://github.com/googleapis/google-cloud-go/issues/6857).\n* **storage:** SignedURL v4 allows headers with colons in value ([#7603](https://github.com/googleapis/google-cloud-go/issues/7603)) ([6b50f9b](https://github.com/googleapis/google-cloud-go/commit/6b50f9b368f5b271ade1706c342865cef46712e6))\n\n## [1.30.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.29.0...storage/v1.30.0) (2023-03-15)\n\n\n### Features\n\n* **storage/internal:** Update routing annotation for CreateBucketRequest docs: Add support for end-to-end checksumming in the gRPC WriteObject flow feat!: BREAKING CHANGE - renaming Notification to NotificationConfig ([2fef56f](https://github.com/googleapis/google-cloud-go/commit/2fef56f75a63dc4ff6e0eea56c7b26d4831c8e27))\n* **storage:** Json downloads ([#7158](https://github.com/googleapis/google-cloud-go/issues/7158)) ([574a86c](https://github.com/googleapis/google-cloud-go/commit/574a86c614445f8c3f5a54446820df774c31cd47))\n* **storage:** Update iam and longrunning deps ([91a1f78](https://github.com/googleapis/google-cloud-go/commit/91a1f784a109da70f63b96414bba8a9b4254cddd))\n\n\n### Bug Fixes\n\n* **storage:** Specify credentials with STORAGE_EMULATOR_HOST ([#7271](https://github.com/googleapis/google-cloud-go/issues/7271)) ([940ae15](https://github.com/googleapis/google-cloud-go/commit/940ae15f725ff384e345e627feb03d22e1fd8db5))\n\n## [1.29.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.28.1...storage/v1.29.0) (2023-01-19)\n\n\n### Features\n\n* **storage:** Add ComponentCount as part of ObjectAttrs ([#7230](https://github.com/googleapis/google-cloud-go/issues/7230)) ([a19bca6](https://github.com/googleapis/google-cloud-go/commit/a19bca60704b4fbb674cf51d828580aa653c8210))\n* **storage:** Add REST client ([06a54a1](https://github.com/googleapis/google-cloud-go/commit/06a54a16a5866cce966547c51e203b9e09a25bc0))\n\n\n### Documentation\n\n* **storage/internal:** Corrected typos and spellings ([7357077](https://github.com/googleapis/google-cloud-go/commit/735707796d81d7f6f32fc3415800c512fe62297e))\n\n## [1.28.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.28.0...storage/v1.28.1) (2022-12-02)\n\n\n### Bug Fixes\n\n* **storage:** downgrade some dependencies ([7540152](https://github.com/googleapis/google-cloud-go/commit/754015236d5af7c82a75da218b71a87b9ead6eb5))\n\n## [1.28.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.27.0...storage/v1.28.0) (2022-11-03)\n\n\n### Features\n\n* **storage/internal:** Add routing annotations ([ce3f945](https://github.com/googleapis/google-cloud-go/commit/ce3f9458e511eca0910992763232abbcd64698f1))\n* **storage:** Add Autoclass support ([#6828](https://github.com/googleapis/google-cloud-go/issues/6828)) ([f7c7f41](https://github.com/googleapis/google-cloud-go/commit/f7c7f41e4d7fcffe05860e1114cb20f40c869da8))\n\n\n### Bug Fixes\n\n* **storage:** Fix read-write race in Writer.Write ([#6817](https://github.com/googleapis/google-cloud-go/issues/6817)) ([4766d3e](https://github.com/googleapis/google-cloud-go/commit/4766d3e1004119b93c6bd352024b5bf3404252eb))\n* **storage:** Fix request token passing for Copier.Run ([#6863](https://github.com/googleapis/google-cloud-go/issues/6863)) ([faaab06](https://github.com/googleapis/google-cloud-go/commit/faaab066d8e509dc440bcbc87391557ecee7dbf2)), refs [#6857](https://github.com/googleapis/google-cloud-go/issues/6857)\n\n\n### Documentation\n\n* **storage:** Update broken links for SignURL and PostPolicy ([#6779](https://github.com/googleapis/google-cloud-go/issues/6779)) ([776138b](https://github.com/googleapis/google-cloud-go/commit/776138bc06a1e5fd45acbf8f9d36e9dc6ce31dd3))\n\n## [1.27.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.26.0...storage/v1.27.0) (2022-09-22)\n\n\n### Features\n\n* **storage:** Find GoogleAccessID when using impersonated creds ([#6591](https://github.com/googleapis/google-cloud-go/issues/6591)) ([a2d16a7](https://github.com/googleapis/google-cloud-go/commit/a2d16a7a778c85d13217fc67955ec5dac1da34e8))\n\n## [1.26.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.25.0...storage/v1.26.0) (2022-08-29)\n\n\n### Features\n\n* **storage:** export ShouldRetry ([#6370](https://github.com/googleapis/google-cloud-go/issues/6370)) ([0da9ab0](https://github.com/googleapis/google-cloud-go/commit/0da9ab0831540569dc04c0a23437b084b1564e15)), refs [#6362](https://github.com/googleapis/google-cloud-go/issues/6362)\n\n\n### Bug Fixes\n\n* **storage:** allow to use age=0 in OLM conditions ([#6204](https://github.com/googleapis/google-cloud-go/issues/6204)) ([c85704f](https://github.com/googleapis/google-cloud-go/commit/c85704f4284626ce728cb48f3b130f2ce2a0165e))\n\n## [1.25.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.24.0...storage/v1.25.0) (2022-08-11)\n\n\n### Features\n\n* **storage/internal:** Add routing annotations ([8a8ba85](https://github.com/googleapis/google-cloud-go/commit/8a8ba85311f85701c97fd7c10f1d88b738ce423f))\n* **storage:** refactor to use transport-agnostic interface ([#6465](https://github.com/googleapis/google-cloud-go/issues/6465)) ([d03c3e1](https://github.com/googleapis/google-cloud-go/commit/d03c3e15a79fe9afa1232d9c8bd4c484a9bb927e))\n\n## [1.24.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.23.0...storage/v1.24.0) (2022-07-20)\n\n\n### Features\n\n* **storage:** add Custom Placement Config Dual Region Support  ([#6294](https://github.com/googleapis/google-cloud-go/issues/6294)) ([5a8c607](https://github.com/googleapis/google-cloud-go/commit/5a8c607e3a9a3265887e27cb13f8943f3e3fa23d))\n\n## [1.23.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.22.1...storage/v1.23.0) (2022-06-23)\n\n\n### Features\n\n* **storage:** add support for OLM Prefix/Suffix ([#5929](https://github.com/googleapis/google-cloud-go/issues/5929)) ([ec21d10](https://github.com/googleapis/google-cloud-go/commit/ec21d10d6d1b01aa97a52560319775041707690d))\n* **storage:** support AbortIncompleteMultipartUpload LifecycleAction ([#5812](https://github.com/googleapis/google-cloud-go/issues/5812)) ([fdec929](https://github.com/googleapis/google-cloud-go/commit/fdec929b9da6e01dda0ab3c72544d44d6bd82bd4)), refs [#5795](https://github.com/googleapis/google-cloud-go/issues/5795)\n\n\n### Bug Fixes\n\n* **storage:** allow for  Age *int64 type and int64 type ([#6230](https://github.com/googleapis/google-cloud-go/issues/6230)) ([cc7acb8](https://github.com/googleapis/google-cloud-go/commit/cc7acb8bffb31828e9e96d4834a65f9728494473))\n\n### [1.22.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.22.0...storage/v1.22.1) (2022-05-19)\n\n\n### Bug Fixes\n\n* **storage:** bump genproto, remove deadcode ([#6059](https://github.com/googleapis/google-cloud-go/issues/6059)) ([bb10f9f](https://github.com/googleapis/google-cloud-go/commit/bb10f9faca57dc3b987e0fb601090887b3507f07))\n* **storage:** remove field that no longer exists ([#6061](https://github.com/googleapis/google-cloud-go/issues/6061)) ([ee150cf](https://github.com/googleapis/google-cloud-go/commit/ee150cfd194463ddfcb59898cfb0237e47777973))\n\n## [1.22.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.21.0...storage/v1.22.0) (2022-03-31)\n\n\n### Features\n\n* **storage:** allow specifying includeTrailingDelimiter ([#5617](https://github.com/googleapis/google-cloud-go/issues/5617)) ([a34503b](https://github.com/googleapis/google-cloud-go/commit/a34503bc0f0b95399285e8db66976b227e3b0072))\n* **storage:** set versionClient to module version ([55f0d92](https://github.com/googleapis/google-cloud-go/commit/55f0d92bf112f14b024b4ab0076c9875a17423c9))\n\n\n### Bug Fixes\n\n* **storage:** respect STORAGE_EMULATOR_HOST in signedURL ([#5673](https://github.com/googleapis/google-cloud-go/issues/5673)) ([1c249ae](https://github.com/googleapis/google-cloud-go/commit/1c249ae5b4980cf53fa74635943ca8bf6a96a341))\n\n## [1.21.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.20.0...storage/v1.21.0) (2022-02-17)\n\n\n### Features\n\n* **storage:** add better version metadata to calls ([#5507](https://github.com/googleapis/google-cloud-go/issues/5507)) ([13fe0bc](https://github.com/googleapis/google-cloud-go/commit/13fe0bc0d8acbffd46b59ab69b25449f1cbd6a88)), refs [#2749](https://github.com/googleapis/google-cloud-go/issues/2749)\n* **storage:** add Writer.ChunkRetryDeadline ([#5482](https://github.com/googleapis/google-cloud-go/issues/5482)) ([498a746](https://github.com/googleapis/google-cloud-go/commit/498a746769fa43958b92af8875b927879947128e))\n\n## [1.20.0](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.19.0...storage/v1.20.0) (2022-02-04)\n\n\n### Features\n\n* **storage/internal:** Update definition of RewriteObjectRequest to bring to parity with JSON API support ([#5447](https://www.github.com/googleapis/google-cloud-go/issues/5447)) ([7d175ef](https://www.github.com/googleapis/google-cloud-go/commit/7d175ef12b7b3e75585427f5dd2aab4a175e92d6))\n\n## [1.19.0](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.18.2...storage/v1.19.0) (2022-01-25)\n\n\n### Features\n\n* **storage:** add fully configurable and idempotency-aware retry strategy ([#5384](https://www.github.com/googleapis/google-cloud-go/issues/5384), [#5185](https://www.github.com/googleapis/google-cloud-go/issues/5185), [#5170](https://www.github.com/googleapis/google-cloud-go/issues/5170), [#5223](https://www.github.com/googleapis/google-cloud-go/issues/5223), [#5221](https://www.github.com/googleapis/google-cloud-go/issues/5221), [#5193](https://www.github.com/googleapis/google-cloud-go/issues/5193), [#5159](https://www.github.com/googleapis/google-cloud-go/issues/5159), [#5165](https://www.github.com/googleapis/google-cloud-go/issues/5165), [#5166](https://www.github.com/googleapis/google-cloud-go/issues/5166), [#5210](https://www.github.com/googleapis/google-cloud-go/issues/5210), [#5172](https://www.github.com/googleapis/google-cloud-go/issues/5172), [#5314](https://www.github.com/googleapis/google-cloud-go/issues/5314))\n  * This release contains changes to fully align this library's retry strategy\n    with best practices as described in the\n    Cloud Storage [docs](https://cloud.google.com/storage/docs/retry-strategy).\n  * The library will now retry only idempotent operations by default. This means\n    that for certain operations, including object upload, compose, rewrite,\n    update, and delete, requests will not be retried by default unless\n    [idempotency conditions](https://cloud.google.com/storage/docs/retry-strategy#idempotency)\n    for the request have been met.\n  * The library now has methods to configure aspects of retry policy for\n    API calls, including which errors are retried, the timing of the\n    exponential backoff, and how idempotency is taken into account.\n  * If you wish to re-enable retries for a non-idempotent request, use the\n    [RetryAlways](https://pkg.go.dev/cloud.google.com/go/storage@main#RetryAlways)\n    policy.\n  * For full details on how to configure retries, see the\n    [package docs](https://pkg.go.dev/cloud.google.com/go/storage@main#hdr-Retrying_failed_requests)\n    and the\n    [Cloud Storage docs](https://cloud.google.com/storage/docs/retry-strategy)\n* **storage:** GenerateSignedPostPolicyV4 can use existing creds to authenticate ([#5105](https://www.github.com/googleapis/google-cloud-go/issues/5105)) ([46489f4](https://www.github.com/googleapis/google-cloud-go/commit/46489f4c8a634068a3e7cf2fd5e5ca11b555c0a8))\n* **storage:** post policy can be signed with a fn that takes raw bytes ([#5079](https://www.github.com/googleapis/google-cloud-go/issues/5079)) ([25d1278](https://www.github.com/googleapis/google-cloud-go/commit/25d1278cab539fbfdd8563ed6b297e30d3fe555c))\n* **storage:** add rpo (turbo replication) support ([#5003](https://www.github.com/googleapis/google-cloud-go/issues/5003)) ([3bd5995](https://www.github.com/googleapis/google-cloud-go/commit/3bd59958e0c06d2655b67fcb5410668db3c52af0))\n\n### Bug Fixes\n\n* **storage:** fix nil check in gRPC Reader ([#5376](https://www.github.com/googleapis/google-cloud-go/issues/5376)) ([5e7d722](https://www.github.com/googleapis/google-cloud-go/commit/5e7d722d18a62b28ba98169b3bdbb49401377264))\n\n### [1.18.2](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.18.1...storage/v1.18.2) (2021-10-18)\n\n\n### Bug Fixes\n\n* **storage:** upgrade genproto ([#4993](https://www.github.com/googleapis/google-cloud-go/issues/4993)) ([5ca462d](https://www.github.com/googleapis/google-cloud-go/commit/5ca462d99fe851b7cddfd70108798e2fa959bdfd)), refs [#4991](https://www.github.com/googleapis/google-cloud-go/issues/4991)\n\n### [1.18.1](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.18.0...storage/v1.18.1) (2021-10-14)\n\n\n### Bug Fixes\n\n* **storage:** don't assume auth from a client option ([#4982](https://www.github.com/googleapis/google-cloud-go/issues/4982)) ([e17334d](https://www.github.com/googleapis/google-cloud-go/commit/e17334d1fe7645d89d14ae7148313498b984dfbb))\n\n## [1.18.0](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.17.0...storage/v1.18.0) (2021-10-11)\n\n\n### Features\n\n* **storage:** returned wrapped error for timeouts ([#4802](https://www.github.com/googleapis/google-cloud-go/issues/4802)) ([0e102a3](https://www.github.com/googleapis/google-cloud-go/commit/0e102a385dc67a06f6b444b3a93e6998428529be)), refs [#4197](https://www.github.com/googleapis/google-cloud-go/issues/4197)\n* **storage:** SignedUrl can use existing creds to authenticate ([#4604](https://www.github.com/googleapis/google-cloud-go/issues/4604)) ([b824c89](https://www.github.com/googleapis/google-cloud-go/commit/b824c897e6941270747b612f6d36a8d6ae081315))\n\n\n### Bug Fixes\n\n* **storage:** update PAP to use inherited instead of unspecified ([#4909](https://www.github.com/googleapis/google-cloud-go/issues/4909)) ([dac26b1](https://www.github.com/googleapis/google-cloud-go/commit/dac26b1af2f2972f12775341173bcc5f982438b8))\n\n## [1.17.0](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.16.1...storage/v1.17.0) (2021-09-28)\n\n\n### Features\n\n* **storage:** add projectNumber field to bucketAttrs. ([#4805](https://www.github.com/googleapis/google-cloud-go/issues/4805)) ([07343af](https://www.github.com/googleapis/google-cloud-go/commit/07343afc15085b164cc41d202d13f9d46f5c0d02))\n\n\n### Bug Fixes\n\n* **storage:** align retry idempotency (part 1) ([#4715](https://www.github.com/googleapis/google-cloud-go/issues/4715)) ([ffa903e](https://www.github.com/googleapis/google-cloud-go/commit/ffa903eeec61aa3869e5220e2f09371127b5c393))\n\n### [1.16.1](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.16.0...storage/v1.16.1) (2021-08-30)\n\n\n### Bug Fixes\n\n* **storage/internal:** Update encryption_key fields to \"bytes\" type. fix: Improve date/times and field name clarity in lifecycle conditions. ([a52baa4](https://www.github.com/googleapis/google-cloud-go/commit/a52baa456ed8513ec492c4b573c191eb61468758))\n* **storage:** accept emulator env var without scheme ([#4616](https://www.github.com/googleapis/google-cloud-go/issues/4616)) ([5f8cbb9](https://www.github.com/googleapis/google-cloud-go/commit/5f8cbb98070109e2a34409ac775ed63b94d37efd))\n* **storage:** preserve supplied endpoint's scheme ([#4609](https://www.github.com/googleapis/google-cloud-go/issues/4609)) ([ee2756f](https://www.github.com/googleapis/google-cloud-go/commit/ee2756fb0a335d591464a770c9fa4f8fe0ba2e01))\n* **storage:** remove unnecessary variable ([#4608](https://www.github.com/googleapis/google-cloud-go/issues/4608)) ([27fc784](https://www.github.com/googleapis/google-cloud-go/commit/27fc78456fb251652bdf5cdb493734a7e1e643e1))\n* **storage:** retry LockRetentionPolicy ([#4439](https://www.github.com/googleapis/google-cloud-go/issues/4439)) ([09879ea](https://www.github.com/googleapis/google-cloud-go/commit/09879ea80cb67f9bfd8fc9384b0fda335567cba9)), refs [#4437](https://www.github.com/googleapis/google-cloud-go/issues/4437)\n* **storage:** revise Reader to send XML preconditions ([#4479](https://www.github.com/googleapis/google-cloud-go/issues/4479)) ([e36b29a](https://www.github.com/googleapis/google-cloud-go/commit/e36b29a3d43bce5c1c044f7daf6e1db00b0a49e0)), refs [#4470](https://www.github.com/googleapis/google-cloud-go/issues/4470)\n\n## [1.16.0](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.15.0...storage/v1.16.0) (2021-06-28)\n\n\n### Features\n\n* **storage:** support PublicAccessPrevention ([#3608](https://www.github.com/googleapis/google-cloud-go/issues/3608)) ([99bc782](https://www.github.com/googleapis/google-cloud-go/commit/99bc782fb50a47602b45278384ef5d5b5da9263b)), refs [#3203](https://www.github.com/googleapis/google-cloud-go/issues/3203)\n\n\n### Bug Fixes\n\n* **storage:** fix Writer.ChunkSize validation ([#4255](https://www.github.com/googleapis/google-cloud-go/issues/4255)) ([69c2e9d](https://www.github.com/googleapis/google-cloud-go/commit/69c2e9dc6303e1a004d3104a8178532fa738e742)), refs [#4167](https://www.github.com/googleapis/google-cloud-go/issues/4167)\n* **storage:** try to reopen for failed Reads ([#4226](https://www.github.com/googleapis/google-cloud-go/issues/4226)) ([564102b](https://www.github.com/googleapis/google-cloud-go/commit/564102b335dbfb558bec8af883e5f898efb5dd10)), refs [#3040](https://www.github.com/googleapis/google-cloud-go/issues/3040)\n\n## [1.15.0](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.13.0...storage/v1.15.0) (2021-04-21)\n\n\n### Features\n\n* **transport** Bump dependency on google.golang.org/api to pick up HTTP/2\n  config updates (see [googleapis/google-api-go-client#882](https://github.com/googleapis/google-api-go-client/pull/882)).\n\n### Bug Fixes\n\n* **storage:** retry io.ErrUnexpectedEOF ([#3957](https://www.github.com/googleapis/google-cloud-go/issues/3957)) ([f6590cd](https://www.github.com/googleapis/google-cloud-go/commit/f6590cdc26c8479be5df48949fa59f879e0c24fc))\n\n\n## v1.14.0\n\n- Updates to various dependencies.\n\n## [1.13.0](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.12.0...v1.13.0) (2021-02-03)\n\n\n### Features\n\n* **storage:** add missing StorageClass in BucketAttrsToUpdate ([#3038](https://www.github.com/googleapis/google-cloud-go/issues/3038)) ([2fa1b72](https://www.github.com/googleapis/google-cloud-go/commit/2fa1b727f8a7b20aa62fe0990530744f6c109be0))\n* **storage:** add projection parameter for BucketHandle.Objects() ([#3549](https://www.github.com/googleapis/google-cloud-go/issues/3549)) ([9b9c3dc](https://www.github.com/googleapis/google-cloud-go/commit/9b9c3dce3ee10af5b6c4d070821bf47a861efd5b))\n\n\n### Bug Fixes\n\n* **storage:** fix endpoint selection logic ([#3172](https://www.github.com/googleapis/google-cloud-go/issues/3172)) ([99edf0d](https://www.github.com/googleapis/google-cloud-go/commit/99edf0d211a9e617f2586fbc83b6f9630da3c537))\n\n## v1.12.0\n- V4 signed URL fixes:\n  - Fix encoding of spaces in query parameters.\n  - Add fields that were missing from PostPolicyV4 policy conditions.\n- Fix Query to correctly list prefixes as well as objects when SetAttrSelection\n  is used.\n\n## v1.11.0\n- Add support for CustomTime and NoncurrentTime object lifecycle management\n  features.\n\n## v1.10.0\n- Bump dependency on google.golang.org/api to capture changes to retry logic\n  which will make retries on writes more resilient.\n- Improve documentation for Writer.ChunkSize.\n- Fix a bug in lifecycle to allow callers to clear lifecycle rules on a bucket.\n\n## v1.9.0\n- Add retry for transient network errors on most operations (with the exception\n  of writes).\n- Bump dependency for google.golang.org/api to capture a change in the default\n  HTTP transport which will improve performance for reads under heavy load.\n- Add CRC32C checksum validation option to Composer.\n\n## v1.8.0\n- Add support for V4 signed post policies.\n\n## v1.7.0\n- V4 signed URL support:\n  - Add support for bucket-bound domains and virtual hosted style URLs.\n  - Add support for query parameters in the signature.\n  - Fix text encoding to align with standards.\n- Add the object name to query parameters for write calls.\n- Fix retry behavior when reading files with Content-Encoding gzip.\n- Fix response header in reader.\n- New code examples:\n   - Error handling for `ObjectHandle` preconditions.\n   - Existence checks for buckets and objects.\n\n## v1.6.0\n\n- Updated option handling:\n  - Don't drop custom scopes (#1756)\n  - Don't drop port in provided endpoint (#1737)\n\n## v1.5.0\n\n- Honor WithEndpoint client option for reads as well as writes.\n- Add archive storage class to docs.\n- Make fixes to storage benchwrapper.\n\n## v1.4.0\n\n- When listing objects in a bucket, allow callers to specify which attributes\n  are queried. This allows for performance optimization.\n\n## v1.3.0\n\n- Use `storage.googleapis.com/storage/v1` by default for GCS requests\n  instead of `www.googleapis.com/storage/v1`.\n\n## v1.2.1\n\n- Fixed a bug where UniformBucketLevelAccess and BucketPolicyOnly were not\n  being sent in all cases.\n\n## v1.2.0\n\n- Add support for UniformBucketLevelAccess. This configures access checks\n  to use only bucket-level IAM policies.\n  See: https://godoc.org/cloud.google.com/go/storage#UniformBucketLevelAccess.\n- Fix userAgent to use correct version.\n\n## v1.1.2\n\n- Fix memory leak in BucketIterator and ObjectIterator.\n\n## v1.1.1\n\n- Send BucketPolicyOnly even when it's disabled.\n\n## v1.1.0\n\n- Performance improvements for ObjectIterator and BucketIterator.\n- Fix Bucket.ObjectIterator size calculation checks.\n- Added HMACKeyOptions to all the methods which allows for options such as\n  UserProject to be set per invocation and optionally be used.\n\n## v1.0.0\n\nThis is the first tag to carve out storage as its own module. See:\nhttps://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository.\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/README.md",
    "content": "## Cloud Storage [![Go Reference](https://pkg.go.dev/badge/cloud.google.com/go/storage.svg)](https://pkg.go.dev/cloud.google.com/go/storage)\n\n- [About Cloud Storage](https://cloud.google.com/storage/)\n- [API documentation](https://cloud.google.com/storage/docs)\n- [Go client documentation](https://cloud.google.com/go/docs/reference/cloud.google.com/go/storage/latest)\n- [Complete sample programs](https://github.com/GoogleCloudPlatform/golang-samples/tree/main/storage)\n\n### Example Usage\n\nFirst create a `storage.Client` to use throughout your application:\n\n[snip]:# (storage-1)\n```go\nclient, err := storage.NewClient(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\n```\n\n[snip]:# (storage-2)\n```go\n// Read the object1 from bucket.\nrc, err := client.Bucket(\"bucket\").Object(\"object1\").NewReader(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer rc.Close()\nbody, err := io.ReadAll(rc)\nif err != nil {\n\tlog.Fatal(err)\n}\n```\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/acl.go",
    "content": "// Copyright 2014 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"context\"\n\n\t\"cloud.google.com/go/storage/internal/apiv2/storagepb\"\n\traw \"google.golang.org/api/storage/v1\"\n)\n\n// ACLRole is the level of access to grant.\ntype ACLRole string\n\nconst (\n\tRoleOwner  ACLRole = \"OWNER\"\n\tRoleReader ACLRole = \"READER\"\n\tRoleWriter ACLRole = \"WRITER\"\n)\n\n// ACLEntity refers to a user or group.\n// They are sometimes referred to as grantees.\n//\n// It could be in the form of:\n// \"user-<userId>\", \"user-<email>\", \"group-<groupId>\", \"group-<email>\",\n// \"domain-<domain>\" and \"project-team-<projectId>\".\n//\n// Or one of the predefined constants: AllUsers, AllAuthenticatedUsers.\ntype ACLEntity string\n\nconst (\n\tAllUsers              ACLEntity = \"allUsers\"\n\tAllAuthenticatedUsers ACLEntity = \"allAuthenticatedUsers\"\n)\n\n// ACLRule represents a grant for a role to an entity (user, group or team) for a\n// Google Cloud Storage object or bucket.\ntype ACLRule struct {\n\tEntity      ACLEntity\n\tEntityID    string\n\tRole        ACLRole\n\tDomain      string\n\tEmail       string\n\tProjectTeam *ProjectTeam\n}\n\n// ProjectTeam is the project team associated with the entity, if any.\ntype ProjectTeam struct {\n\tProjectNumber string\n\tTeam          string\n}\n\n// ACLHandle provides operations on an access control list for a Google Cloud Storage bucket or object.\n// ACLHandle on an object operates on the latest generation of that object by default.\n// Selecting a specific generation of an object is not currently supported by the client.\ntype ACLHandle struct {\n\tc           *Client\n\tbucket      string\n\tobject      string\n\tisDefault   bool\n\tuserProject string // for requester-pays buckets\n\tretry       *retryConfig\n}\n\n// Delete permanently deletes the ACL entry for the given entity.\nfunc (a *ACLHandle) Delete(ctx context.Context, entity ACLEntity) (err error) {\n\tctx, _ = startSpan(ctx, \"ACL.Delete\")\n\tdefer func() { endSpan(ctx, err) }()\n\n\tif a.object != \"\" {\n\t\treturn a.objectDelete(ctx, entity)\n\t}\n\tif a.isDefault {\n\t\treturn a.bucketDefaultDelete(ctx, entity)\n\t}\n\treturn a.bucketDelete(ctx, entity)\n}\n\n// Set sets the role for the given entity.\nfunc (a *ACLHandle) Set(ctx context.Context, entity ACLEntity, role ACLRole) (err error) {\n\tctx, _ = startSpan(ctx, \"ACL.Set\")\n\tdefer func() { endSpan(ctx, err) }()\n\n\tif a.object != \"\" {\n\t\treturn a.objectSet(ctx, entity, role, false)\n\t}\n\tif a.isDefault {\n\t\treturn a.objectSet(ctx, entity, role, true)\n\t}\n\treturn a.bucketSet(ctx, entity, role)\n}\n\n// List retrieves ACL entries.\nfunc (a *ACLHandle) List(ctx context.Context) (rules []ACLRule, err error) {\n\tctx, _ = startSpan(ctx, \"ACL.List\")\n\tdefer func() { endSpan(ctx, err) }()\n\n\tif a.object != \"\" {\n\t\treturn a.objectList(ctx)\n\t}\n\tif a.isDefault {\n\t\treturn a.bucketDefaultList(ctx)\n\t}\n\treturn a.bucketList(ctx)\n}\n\nfunc (a *ACLHandle) bucketDefaultList(ctx context.Context) ([]ACLRule, error) {\n\topts := makeStorageOpts(true, a.retry, a.userProject)\n\treturn a.c.tc.ListDefaultObjectACLs(ctx, a.bucket, opts...)\n}\n\nfunc (a *ACLHandle) bucketDefaultDelete(ctx context.Context, entity ACLEntity) error {\n\topts := makeStorageOpts(false, a.retry, a.userProject)\n\treturn a.c.tc.DeleteDefaultObjectACL(ctx, a.bucket, entity, opts...)\n}\n\nfunc (a *ACLHandle) bucketList(ctx context.Context) ([]ACLRule, error) {\n\topts := makeStorageOpts(true, a.retry, a.userProject)\n\treturn a.c.tc.ListBucketACLs(ctx, a.bucket, opts...)\n}\n\nfunc (a *ACLHandle) bucketSet(ctx context.Context, entity ACLEntity, role ACLRole) error {\n\topts := makeStorageOpts(false, a.retry, a.userProject)\n\treturn a.c.tc.UpdateBucketACL(ctx, a.bucket, entity, role, opts...)\n}\n\nfunc (a *ACLHandle) bucketDelete(ctx context.Context, entity ACLEntity) error {\n\topts := makeStorageOpts(false, a.retry, a.userProject)\n\treturn a.c.tc.DeleteBucketACL(ctx, a.bucket, entity, opts...)\n}\n\nfunc (a *ACLHandle) objectList(ctx context.Context) ([]ACLRule, error) {\n\topts := makeStorageOpts(true, a.retry, a.userProject)\n\treturn a.c.tc.ListObjectACLs(ctx, a.bucket, a.object, opts...)\n}\n\nfunc (a *ACLHandle) objectSet(ctx context.Context, entity ACLEntity, role ACLRole, isBucketDefault bool) error {\n\topts := makeStorageOpts(false, a.retry, a.userProject)\n\tif isBucketDefault {\n\t\treturn a.c.tc.UpdateDefaultObjectACL(ctx, a.bucket, entity, role, opts...)\n\t}\n\treturn a.c.tc.UpdateObjectACL(ctx, a.bucket, a.object, entity, role, opts...)\n}\n\nfunc (a *ACLHandle) objectDelete(ctx context.Context, entity ACLEntity) error {\n\topts := makeStorageOpts(false, a.retry, a.userProject)\n\treturn a.c.tc.DeleteObjectACL(ctx, a.bucket, a.object, entity, opts...)\n}\n\nfunc toObjectACLRules(items []*raw.ObjectAccessControl) []ACLRule {\n\tvar rs []ACLRule\n\tfor _, item := range items {\n\t\trs = append(rs, toObjectACLRule(item))\n\t}\n\treturn rs\n}\n\nfunc toObjectACLRulesFromProto(items []*storagepb.ObjectAccessControl) []ACLRule {\n\tvar rs []ACLRule\n\tfor _, item := range items {\n\t\trs = append(rs, toObjectACLRuleFromProto(item))\n\t}\n\treturn rs\n}\n\nfunc toBucketACLRules(items []*raw.BucketAccessControl) []ACLRule {\n\tvar rs []ACLRule\n\tfor _, item := range items {\n\t\trs = append(rs, toBucketACLRule(item))\n\t}\n\treturn rs\n}\n\nfunc toBucketACLRulesFromProto(items []*storagepb.BucketAccessControl) []ACLRule {\n\tvar rs []ACLRule\n\tfor _, item := range items {\n\t\trs = append(rs, toBucketACLRuleFromProto(item))\n\t}\n\treturn rs\n}\n\nfunc toObjectACLRule(a *raw.ObjectAccessControl) ACLRule {\n\treturn ACLRule{\n\t\tEntity:      ACLEntity(a.Entity),\n\t\tEntityID:    a.EntityId,\n\t\tRole:        ACLRole(a.Role),\n\t\tDomain:      a.Domain,\n\t\tEmail:       a.Email,\n\t\tProjectTeam: toObjectProjectTeam(a.ProjectTeam),\n\t}\n}\n\nfunc toObjectACLRuleFromProto(a *storagepb.ObjectAccessControl) ACLRule {\n\treturn ACLRule{\n\t\tEntity:      ACLEntity(a.GetEntity()),\n\t\tEntityID:    a.GetEntityId(),\n\t\tRole:        ACLRole(a.GetRole()),\n\t\tDomain:      a.GetDomain(),\n\t\tEmail:       a.GetEmail(),\n\t\tProjectTeam: toProjectTeamFromProto(a.GetProjectTeam()),\n\t}\n}\n\nfunc toBucketACLRule(a *raw.BucketAccessControl) ACLRule {\n\treturn ACLRule{\n\t\tEntity:      ACLEntity(a.Entity),\n\t\tEntityID:    a.EntityId,\n\t\tRole:        ACLRole(a.Role),\n\t\tDomain:      a.Domain,\n\t\tEmail:       a.Email,\n\t\tProjectTeam: toBucketProjectTeam(a.ProjectTeam),\n\t}\n}\n\nfunc toBucketACLRuleFromProto(a *storagepb.BucketAccessControl) ACLRule {\n\treturn ACLRule{\n\t\tEntity:      ACLEntity(a.GetEntity()),\n\t\tEntityID:    a.GetEntityId(),\n\t\tRole:        ACLRole(a.GetRole()),\n\t\tDomain:      a.GetDomain(),\n\t\tEmail:       a.GetEmail(),\n\t\tProjectTeam: toProjectTeamFromProto(a.GetProjectTeam()),\n\t}\n}\n\nfunc toRawObjectACL(rules []ACLRule) []*raw.ObjectAccessControl {\n\tif len(rules) == 0 {\n\t\treturn nil\n\t}\n\tr := make([]*raw.ObjectAccessControl, 0, len(rules))\n\tfor _, rule := range rules {\n\t\tr = append(r, rule.toRawObjectAccessControl(\"\")) // bucket name unnecessary\n\t}\n\treturn r\n}\n\nfunc toProtoObjectACL(rules []ACLRule) []*storagepb.ObjectAccessControl {\n\tif len(rules) == 0 {\n\t\treturn nil\n\t}\n\tr := make([]*storagepb.ObjectAccessControl, 0, len(rules))\n\tfor _, rule := range rules {\n\t\tr = append(r, rule.toProtoObjectAccessControl(\"\")) // bucket name unnecessary\n\t}\n\treturn r\n}\n\nfunc toRawBucketACL(rules []ACLRule) []*raw.BucketAccessControl {\n\tif len(rules) == 0 {\n\t\treturn nil\n\t}\n\tr := make([]*raw.BucketAccessControl, 0, len(rules))\n\tfor _, rule := range rules {\n\t\tr = append(r, rule.toRawBucketAccessControl(\"\")) // bucket name unnecessary\n\t}\n\treturn r\n}\n\nfunc toProtoBucketACL(rules []ACLRule) []*storagepb.BucketAccessControl {\n\tif len(rules) == 0 {\n\t\treturn nil\n\t}\n\tr := make([]*storagepb.BucketAccessControl, 0, len(rules))\n\tfor _, rule := range rules {\n\t\tr = append(r, rule.toProtoBucketAccessControl())\n\t}\n\treturn r\n}\n\nfunc (r ACLRule) toRawBucketAccessControl(bucket string) *raw.BucketAccessControl {\n\treturn &raw.BucketAccessControl{\n\t\tBucket: bucket,\n\t\tEntity: string(r.Entity),\n\t\tRole:   string(r.Role),\n\t\t// The other fields are not settable.\n\t}\n}\n\nfunc (r ACLRule) toRawObjectAccessControl(bucket string) *raw.ObjectAccessControl {\n\treturn &raw.ObjectAccessControl{\n\t\tBucket: bucket,\n\t\tEntity: string(r.Entity),\n\t\tRole:   string(r.Role),\n\t\t// The other fields are not settable.\n\t}\n}\n\nfunc (r ACLRule) toProtoObjectAccessControl(bucket string) *storagepb.ObjectAccessControl {\n\treturn &storagepb.ObjectAccessControl{\n\t\tEntity: string(r.Entity),\n\t\tRole:   string(r.Role),\n\t\t// The other fields are not settable.\n\t}\n}\n\nfunc (r ACLRule) toProtoBucketAccessControl() *storagepb.BucketAccessControl {\n\treturn &storagepb.BucketAccessControl{\n\t\tEntity: string(r.Entity),\n\t\tRole:   string(r.Role),\n\t\t// The other fields are not settable.\n\t}\n}\n\nfunc toBucketProjectTeam(p *raw.BucketAccessControlProjectTeam) *ProjectTeam {\n\tif p == nil {\n\t\treturn nil\n\t}\n\treturn &ProjectTeam{\n\t\tProjectNumber: p.ProjectNumber,\n\t\tTeam:          p.Team,\n\t}\n}\n\nfunc toProjectTeamFromProto(p *storagepb.ProjectTeam) *ProjectTeam {\n\tif p == nil {\n\t\treturn nil\n\t}\n\treturn &ProjectTeam{\n\t\tProjectNumber: p.GetProjectNumber(),\n\t\tTeam:          p.GetTeam(),\n\t}\n}\n\nfunc toObjectProjectTeam(p *raw.ObjectAccessControlProjectTeam) *ProjectTeam {\n\tif p == nil {\n\t\treturn nil\n\t}\n\treturn &ProjectTeam{\n\t\tProjectNumber: p.ProjectNumber,\n\t\tTeam:          p.Team,\n\t}\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/bucket.go",
    "content": "// Copyright 2014 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\t\"time\"\n\n\t\"cloud.google.com/go/compute/metadata\"\n\t\"cloud.google.com/go/internal/optional\"\n\t\"cloud.google.com/go/storage/internal/apiv2/storagepb\"\n\t\"google.golang.org/api/googleapi\"\n\t\"google.golang.org/api/iamcredentials/v1\"\n\t\"google.golang.org/api/iterator\"\n\t\"google.golang.org/api/option\"\n\traw \"google.golang.org/api/storage/v1\"\n\tdpb \"google.golang.org/genproto/googleapis/type/date\"\n\t\"google.golang.org/protobuf/proto\"\n\t\"google.golang.org/protobuf/types/known/durationpb\"\n)\n\n// BucketHandle provides operations on a Google Cloud Storage bucket.\n// Use Client.Bucket to get a handle.\ntype BucketHandle struct {\n\tc                     *Client\n\tname                  string\n\tacl                   ACLHandle\n\tdefaultObjectACL      ACLHandle\n\tconds                 *BucketConditions\n\tuserProject           string // project for Requester Pays buckets\n\tretry                 *retryConfig\n\tenableObjectRetention *bool\n}\n\n// Bucket returns a BucketHandle, which provides operations on the named bucket.\n// This call does not perform any network operations.\n//\n// The supplied name must contain only lowercase letters, numbers, dashes,\n// underscores, and dots. The full specification for valid bucket names can be\n// found at:\n//\n//\thttps://cloud.google.com/storage/docs/bucket-naming\nfunc (c *Client) Bucket(name string) *BucketHandle {\n\tretry := c.retry.clone()\n\treturn &BucketHandle{\n\t\tc:    c,\n\t\tname: name,\n\t\tacl: ACLHandle{\n\t\t\tc:      c,\n\t\t\tbucket: name,\n\t\t\tretry:  retry,\n\t\t},\n\t\tdefaultObjectACL: ACLHandle{\n\t\t\tc:         c,\n\t\t\tbucket:    name,\n\t\t\tisDefault: true,\n\t\t\tretry:     retry,\n\t\t},\n\t\tretry: retry,\n\t}\n}\n\n// Create creates the Bucket in the project.\n// If attrs is nil the API defaults will be used.\nfunc (b *BucketHandle) Create(ctx context.Context, projectID string, attrs *BucketAttrs) (err error) {\n\tctx, _ = startSpan(ctx, \"Bucket.Create\")\n\tdefer func() { endSpan(ctx, err) }()\n\n\to := makeStorageOpts(true, b.retry, b.userProject)\n\n\tif _, err := b.c.tc.CreateBucket(ctx, projectID, b.name, attrs, b.enableObjectRetention, o...); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Delete deletes the Bucket.\nfunc (b *BucketHandle) Delete(ctx context.Context) (err error) {\n\tctx, _ = startSpan(ctx, \"Bucket.Delete\")\n\tdefer func() { endSpan(ctx, err) }()\n\n\to := makeStorageOpts(true, b.retry, b.userProject)\n\treturn b.c.tc.DeleteBucket(ctx, b.name, b.conds, o...)\n}\n\n// ACL returns an ACLHandle, which provides access to the bucket's access control list.\n// This controls who can list, create or overwrite the objects in a bucket.\n// This call does not perform any network operations.\nfunc (b *BucketHandle) ACL() *ACLHandle {\n\treturn &b.acl\n}\n\n// DefaultObjectACL returns an ACLHandle, which provides access to the bucket's default object ACLs.\n// These ACLs are applied to newly created objects in this bucket that do not have a defined ACL.\n// This call does not perform any network operations.\nfunc (b *BucketHandle) DefaultObjectACL() *ACLHandle {\n\treturn &b.defaultObjectACL\n}\n\n// BucketName returns the name of the bucket.\nfunc (b *BucketHandle) BucketName() string {\n\treturn b.name\n}\n\n// Object returns an ObjectHandle, which provides operations on the named object.\n// This call does not perform any network operations such as fetching the object or verifying its existence.\n// Use methods on ObjectHandle to perform network operations.\n//\n// name must consist entirely of valid UTF-8-encoded runes. The full specification\n// for valid object names can be found at:\n//\n//\thttps://cloud.google.com/storage/docs/naming-objects\nfunc (b *BucketHandle) Object(name string) *ObjectHandle {\n\tretry := b.retry.clone()\n\treturn &ObjectHandle{\n\t\tc:      b.c,\n\t\tbucket: b.name,\n\t\tobject: name,\n\t\tacl: ACLHandle{\n\t\t\tc:           b.c,\n\t\t\tbucket:      b.name,\n\t\t\tobject:      name,\n\t\t\tuserProject: b.userProject,\n\t\t\tretry:       retry,\n\t\t},\n\t\tgen:         -1,\n\t\tuserProject: b.userProject,\n\t\tretry:       retry,\n\t}\n}\n\n// Attrs returns the metadata for the bucket.\nfunc (b *BucketHandle) Attrs(ctx context.Context) (attrs *BucketAttrs, err error) {\n\tctx, _ = startSpan(ctx, \"Bucket.Attrs\")\n\tdefer func() { endSpan(ctx, err) }()\n\n\to := makeStorageOpts(true, b.retry, b.userProject)\n\treturn b.c.tc.GetBucket(ctx, b.name, b.conds, o...)\n}\n\n// Update updates a bucket's attributes.\nfunc (b *BucketHandle) Update(ctx context.Context, uattrs BucketAttrsToUpdate) (attrs *BucketAttrs, err error) {\n\tctx, _ = startSpan(ctx, \"Bucket.Update\")\n\tdefer func() { endSpan(ctx, err) }()\n\n\tisIdempotent := b.conds != nil && b.conds.MetagenerationMatch != 0\n\to := makeStorageOpts(isIdempotent, b.retry, b.userProject)\n\treturn b.c.tc.UpdateBucket(ctx, b.name, &uattrs, b.conds, o...)\n}\n\n// SignedURL returns a URL for the specified object. Signed URLs allow anyone\n// access to a restricted resource for a limited time without needing a Google\n// account or signing in.\n// For more information about signed URLs, see \"[Overview of access control].\"\n//\n// This method requires the Method and Expires fields in the specified\n// SignedURLOptions to be non-nil. You may need to set the GoogleAccessID and\n// PrivateKey fields in some cases. Read more on the [automatic detection of credentials]\n// for this method.\n//\n// [Overview of access control]: https://cloud.google.com/storage/docs/accesscontrol#signed_urls_query_string_authentication\n// [automatic detection of credentials]: https://pkg.go.dev/cloud.google.com/go/storage#hdr-Credential_requirements_for_signing\nfunc (b *BucketHandle) SignedURL(object string, opts *SignedURLOptions) (string, error) {\n\t// Make a copy of opts so we don't modify the pointer parameter.\n\tnewopts := opts.clone()\n\n\tif newopts.Hostname == \"\" {\n\t\t// Extract the correct host from the readhost set on the client\n\t\tnewopts.Hostname = b.c.xmlHost\n\t}\n\n\tif opts.GoogleAccessID != \"\" && (opts.SignBytes != nil || len(opts.PrivateKey) > 0) {\n\t\treturn SignedURL(b.name, object, newopts)\n\t}\n\n\tif newopts.GoogleAccessID == \"\" {\n\t\tid, err := b.detectDefaultGoogleAccessID()\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tnewopts.GoogleAccessID = id\n\t}\n\tif newopts.SignBytes == nil && len(newopts.PrivateKey) == 0 {\n\t\tif b.c.creds != nil && len(b.c.creds.JSON) > 0 {\n\t\t\tvar sa struct {\n\t\t\t\tPrivateKey string `json:\"private_key\"`\n\t\t\t}\n\t\t\terr := json.Unmarshal(b.c.creds.JSON, &sa)\n\t\t\tif err == nil && sa.PrivateKey != \"\" {\n\t\t\t\tnewopts.PrivateKey = []byte(sa.PrivateKey)\n\t\t\t}\n\t\t}\n\n\t\t// Don't error out if we can't unmarshal the private key from the client,\n\t\t// fallback to the default sign function for the service account.\n\t\tif len(newopts.PrivateKey) == 0 {\n\t\t\tnewopts.SignBytes = b.defaultSignBytesFunc(newopts.GoogleAccessID)\n\t\t}\n\t}\n\treturn SignedURL(b.name, object, newopts)\n}\n\n// GenerateSignedPostPolicyV4 generates a PostPolicyV4 value from bucket, object and opts.\n// The generated URL and fields will then allow an unauthenticated client to perform multipart uploads.\n//\n// This method requires the Expires field in the specified PostPolicyV4Options\n// to be non-nil. You may need to set the GoogleAccessID and PrivateKey fields\n// in some cases. Read more on the [automatic detection of credentials] for this method.\n//\n// [automatic detection of credentials]: https://pkg.go.dev/cloud.google.com/go/storage#hdr-Credential_requirements_for_signing\nfunc (b *BucketHandle) GenerateSignedPostPolicyV4(object string, opts *PostPolicyV4Options) (*PostPolicyV4, error) {\n\t// Make a copy of opts so we don't modify the pointer parameter.\n\tnewopts := opts.clone()\n\n\tif newopts.Hostname == \"\" {\n\t\t// Extract the correct host from the readhost set on the client\n\t\tnewopts.Hostname = b.c.xmlHost\n\t}\n\n\tif opts.GoogleAccessID != \"\" && (opts.SignRawBytes != nil || opts.SignBytes != nil || len(opts.PrivateKey) > 0) {\n\t\treturn GenerateSignedPostPolicyV4(b.name, object, newopts)\n\t}\n\n\tif newopts.GoogleAccessID == \"\" {\n\t\tid, err := b.detectDefaultGoogleAccessID()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tnewopts.GoogleAccessID = id\n\t}\n\tif newopts.SignBytes == nil && newopts.SignRawBytes == nil && len(newopts.PrivateKey) == 0 {\n\t\tif b.c.creds != nil && len(b.c.creds.JSON) > 0 {\n\t\t\tvar sa struct {\n\t\t\t\tPrivateKey string `json:\"private_key\"`\n\t\t\t}\n\t\t\terr := json.Unmarshal(b.c.creds.JSON, &sa)\n\t\t\tif err == nil && sa.PrivateKey != \"\" {\n\t\t\t\tnewopts.PrivateKey = []byte(sa.PrivateKey)\n\t\t\t}\n\t\t}\n\n\t\t// Don't error out if we can't unmarshal the private key from the client,\n\t\t// fallback to the default sign function for the service account.\n\t\tif len(newopts.PrivateKey) == 0 {\n\t\t\tnewopts.SignRawBytes = b.defaultSignBytesFunc(newopts.GoogleAccessID)\n\t\t}\n\t}\n\treturn GenerateSignedPostPolicyV4(b.name, object, newopts)\n}\n\nfunc (b *BucketHandle) detectDefaultGoogleAccessID() (string, error) {\n\treturnErr := errors.New(\"no credentials found on client and not on GCE (Google Compute Engine)\")\n\n\tif b.c.creds != nil && len(b.c.creds.JSON) > 0 {\n\t\tvar sa struct {\n\t\t\tClientEmail        string `json:\"client_email\"`\n\t\t\tSAImpersonationURL string `json:\"service_account_impersonation_url\"`\n\t\t\tCredType           string `json:\"type\"`\n\t\t}\n\n\t\terr := json.Unmarshal(b.c.creds.JSON, &sa)\n\t\tif err != nil {\n\t\t\treturnErr = err\n\t\t} else {\n\t\t\tswitch sa.CredType {\n\t\t\tcase \"impersonated_service_account\", \"external_account\":\n\t\t\t\tstart, end := strings.LastIndex(sa.SAImpersonationURL, \"/\"), strings.LastIndex(sa.SAImpersonationURL, \":\")\n\n\t\t\t\tif end <= start {\n\t\t\t\t\treturnErr = errors.New(\"error parsing external or impersonated service account credentials\")\n\t\t\t\t} else {\n\t\t\t\t\treturn sa.SAImpersonationURL[start+1 : end], nil\n\t\t\t\t}\n\t\t\tcase \"service_account\":\n\t\t\t\tif sa.ClientEmail != \"\" {\n\t\t\t\t\treturn sa.ClientEmail, nil\n\t\t\t\t}\n\t\t\t\treturnErr = errors.New(\"empty service account client email\")\n\t\t\tdefault:\n\t\t\t\treturnErr = errors.New(\"unable to parse credentials; only service_account, external_account and impersonated_service_account credentials are supported\")\n\t\t\t}\n\t\t}\n\t}\n\n\t// Don't error out if we can't unmarshal, fallback to GCE check.\n\tif metadata.OnGCE() {\n\t\temail, err := metadata.Email(\"default\")\n\t\tif err == nil && email != \"\" {\n\t\t\treturn email, nil\n\t\t} else if err != nil {\n\t\t\treturnErr = err\n\t\t} else {\n\t\t\treturnErr = errors.New(\"empty email from GCE metadata service\")\n\t\t}\n\n\t}\n\treturn \"\", fmt.Errorf(\"storage: unable to detect default GoogleAccessID: %w. Please provide the GoogleAccessID or use a supported means for autodetecting it (see https://pkg.go.dev/cloud.google.com/go/storage#hdr-Credential_requirements_for_signing)\", returnErr)\n}\n\nfunc (b *BucketHandle) defaultSignBytesFunc(email string) func([]byte) ([]byte, error) {\n\treturn func(in []byte) ([]byte, error) {\n\t\tctx := context.Background()\n\n\t\topts := []option.ClientOption{option.WithHTTPClient(b.c.hc)}\n\n\t\tif b.c.creds != nil {\n\t\t\tuniverseDomain, err := b.c.creds.GetUniverseDomain()\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\topts = append(opts, option.WithUniverseDomain(universeDomain))\n\t\t}\n\n\t\t// It's ok to recreate this service per call since we pass in the http client,\n\t\t// circumventing the cost of recreating the auth/transport layer\n\t\tsvc, err := iamcredentials.NewService(ctx, opts...)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"unable to create iamcredentials client: %w\", err)\n\t\t}\n\t\t// Do the SignBlob call with a retry for transient errors.\n\t\tvar resp *iamcredentials.SignBlobResponse\n\t\tif err := run(ctx, func(ctx context.Context) error {\n\t\t\tresp, err = svc.Projects.ServiceAccounts.SignBlob(fmt.Sprintf(\"projects/-/serviceAccounts/%s\", email), &iamcredentials.SignBlobRequest{\n\t\t\t\tPayload: base64.StdEncoding.EncodeToString(in),\n\t\t\t}).Do()\n\t\t\treturn err\n\t\t}, b.retry, true); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"unable to sign bytes: %w\", err)\n\t\t}\n\t\tout, err := base64.StdEncoding.DecodeString(resp.SignedBlob)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"unable to base64 decode response: %w\", err)\n\t\t}\n\t\treturn out, nil\n\t}\n}\n\n// BucketAttrs represents the metadata for a Google Cloud Storage bucket.\n// Read-only fields are ignored by BucketHandle.Create.\ntype BucketAttrs struct {\n\t// Name is the name of the bucket.\n\t// This field is read-only.\n\tName string\n\n\t// ACL is the list of access control rules on the bucket.\n\tACL []ACLRule\n\n\t// BucketPolicyOnly is an alias for UniformBucketLevelAccess. Use of\n\t// UniformBucketLevelAccess is recommended above the use of this field.\n\t// Setting BucketPolicyOnly.Enabled OR UniformBucketLevelAccess.Enabled to\n\t// true, will enable UniformBucketLevelAccess.\n\tBucketPolicyOnly BucketPolicyOnly\n\n\t// UniformBucketLevelAccess configures access checks to use only bucket-level IAM\n\t// policies and ignore any ACL rules for the bucket.\n\t// See https://cloud.google.com/storage/docs/uniform-bucket-level-access\n\t// for more information.\n\tUniformBucketLevelAccess UniformBucketLevelAccess\n\n\t// PublicAccessPrevention is the setting for the bucket's\n\t// PublicAccessPrevention policy, which can be used to prevent public access\n\t// of data in the bucket. See\n\t// https://cloud.google.com/storage/docs/public-access-prevention for more\n\t// information.\n\tPublicAccessPrevention PublicAccessPrevention\n\n\t// DefaultObjectACL is the list of access controls to\n\t// apply to new objects when no object ACL is provided.\n\tDefaultObjectACL []ACLRule\n\n\t// DefaultEventBasedHold is the default value for event-based hold on\n\t// newly created objects in this bucket. It defaults to false.\n\tDefaultEventBasedHold bool\n\n\t// If not empty, applies a predefined set of access controls. It should be set\n\t// only when creating a bucket.\n\t// It is always empty for BucketAttrs returned from the service.\n\t// See https://cloud.google.com/storage/docs/json_api/v1/buckets/insert\n\t// for valid values.\n\tPredefinedACL string\n\n\t// If not empty, applies a predefined set of default object access controls.\n\t// It should be set only when creating a bucket.\n\t// It is always empty for BucketAttrs returned from the service.\n\t// See https://cloud.google.com/storage/docs/json_api/v1/buckets/insert\n\t// for valid values.\n\tPredefinedDefaultObjectACL string\n\n\t// Location is the location of the bucket. It defaults to \"US\".\n\t// If specifying a dual-region, CustomPlacementConfig should be set in conjunction.\n\tLocation string\n\n\t// The bucket's custom placement configuration that holds a list of\n\t// regional locations for custom dual regions.\n\tCustomPlacementConfig *CustomPlacementConfig\n\n\t// MetaGeneration is the metadata generation of the bucket.\n\t// This field is read-only.\n\tMetaGeneration int64\n\n\t// StorageClass is the default storage class of the bucket. This defines\n\t// how objects in the bucket are stored and determines the SLA\n\t// and the cost of storage. Typical values are \"STANDARD\", \"NEARLINE\",\n\t// \"COLDLINE\" and \"ARCHIVE\". Defaults to \"STANDARD\".\n\t// See https://cloud.google.com/storage/docs/storage-classes for all\n\t// valid values.\n\tStorageClass string\n\n\t// Created is the creation time of the bucket.\n\t// This field is read-only.\n\tCreated time.Time\n\n\t// Updated is the time at which the bucket was last modified.\n\t// This field is read-only.\n\tUpdated time.Time\n\n\t// VersioningEnabled reports whether this bucket has versioning enabled.\n\tVersioningEnabled bool\n\n\t// Labels are the bucket's labels.\n\tLabels map[string]string\n\n\t// RequesterPays reports whether the bucket is a Requester Pays bucket.\n\t// Clients performing operations on Requester Pays buckets must provide\n\t// a user project (see BucketHandle.UserProject), which will be billed\n\t// for the operations.\n\tRequesterPays bool\n\n\t// Lifecycle is the lifecycle configuration for objects in the bucket.\n\tLifecycle Lifecycle\n\n\t// Retention policy enforces a minimum retention time for all objects\n\t// contained in the bucket. A RetentionPolicy of nil implies the bucket\n\t// has no minimum data retention.\n\t//\n\t// This feature is in private alpha release. It is not currently available to\n\t// most customers. It might be changed in backwards-incompatible ways and is not\n\t// subject to any SLA or deprecation policy.\n\tRetentionPolicy *RetentionPolicy\n\n\t// The bucket's Cross-Origin Resource Sharing (CORS) configuration.\n\tCORS []CORS\n\n\t// The encryption configuration used by default for newly inserted objects.\n\tEncryption *BucketEncryption\n\n\t// The logging configuration.\n\tLogging *BucketLogging\n\n\t// The website configuration.\n\tWebsite *BucketWebsite\n\n\t// Etag is the HTTP/1.1 Entity tag for the bucket.\n\t// This field is read-only.\n\tEtag string\n\n\t// LocationType describes how data is stored and replicated.\n\t// Typical values are \"multi-region\", \"region\" and \"dual-region\".\n\t// This field is read-only.\n\tLocationType string\n\n\t// The project number of the project the bucket belongs to.\n\t// This field is read-only.\n\tProjectNumber uint64\n\n\t// RPO configures the Recovery Point Objective (RPO) policy of the bucket.\n\t// Set to RPOAsyncTurbo to turn on Turbo Replication for a bucket.\n\t// See https://cloud.google.com/storage/docs/managing-turbo-replication for\n\t// more information.\n\tRPO RPO\n\n\t// Autoclass holds the bucket's autoclass configuration. If enabled,\n\t// allows for the automatic selection of the best storage class\n\t// based on object access patterns.\n\tAutoclass *Autoclass\n\n\t// ObjectRetentionMode reports whether individual objects in the bucket can\n\t// be configured with a retention policy. An empty value means that object\n\t// retention is disabled.\n\t// This field is read-only. Object retention can be enabled only by creating\n\t// a bucket with SetObjectRetention set to true on the BucketHandle. It\n\t// cannot be modified once the bucket is created.\n\t// ObjectRetention cannot be configured or reported through the gRPC API.\n\tObjectRetentionMode string\n\n\t// SoftDeletePolicy contains the bucket's soft delete policy, which defines\n\t// the period of time that soft-deleted objects will be retained, and cannot\n\t// be permanently deleted. By default, new buckets will be created with a\n\t// 7 day retention duration. In order to fully disable soft delete, you need\n\t// to set a policy with a RetentionDuration of 0.\n\tSoftDeletePolicy *SoftDeletePolicy\n\n\t// HierarchicalNamespace contains the bucket's hierarchical namespace\n\t// configuration. Hierarchical namespace enabled buckets can contain\n\t// [cloud.google.com/go/storage/control/apiv2/controlpb.Folder] resources.\n\t// It cannot be modified after bucket creation time.\n\t// UniformBucketLevelAccess must also also be enabled on the bucket.\n\tHierarchicalNamespace *HierarchicalNamespace\n\n\t// OwnerEntity contains entity information in the form \"project-owner-projectId\".\n\tOwnerEntity string\n}\n\n// BucketPolicyOnly is an alias for UniformBucketLevelAccess.\n// Use of UniformBucketLevelAccess is preferred above BucketPolicyOnly.\ntype BucketPolicyOnly struct {\n\t// Enabled specifies whether access checks use only bucket-level IAM\n\t// policies. Enabled may be disabled until the locked time.\n\tEnabled bool\n\t// LockedTime specifies the deadline for changing Enabled from true to\n\t// false.\n\tLockedTime time.Time\n}\n\n// UniformBucketLevelAccess configures access checks to use only bucket-level IAM\n// policies.\ntype UniformBucketLevelAccess struct {\n\t// Enabled specifies whether access checks use only bucket-level IAM\n\t// policies. Enabled may be disabled until the locked time.\n\tEnabled bool\n\t// LockedTime specifies the deadline for changing Enabled from true to\n\t// false.\n\tLockedTime time.Time\n}\n\n// PublicAccessPrevention configures the Public Access Prevention feature, which\n// can be used to disallow public access to any data in a bucket. See\n// https://cloud.google.com/storage/docs/public-access-prevention for more\n// information.\ntype PublicAccessPrevention int\n\nconst (\n\t// PublicAccessPreventionUnknown is a zero value, used only if this field is\n\t// not set in a call to GCS.\n\tPublicAccessPreventionUnknown PublicAccessPrevention = iota\n\n\t// PublicAccessPreventionUnspecified corresponds to a value of \"unspecified\".\n\t// Deprecated: use PublicAccessPreventionInherited\n\tPublicAccessPreventionUnspecified\n\n\t// PublicAccessPreventionEnforced corresponds to a value of \"enforced\". This\n\t// enforces Public Access Prevention on the bucket.\n\tPublicAccessPreventionEnforced\n\n\t// PublicAccessPreventionInherited corresponds to a value of \"inherited\"\n\t// and is the default for buckets.\n\tPublicAccessPreventionInherited\n\n\tpublicAccessPreventionUnknown string = \"\"\n\t// TODO: remove unspecified when change is fully completed\n\tpublicAccessPreventionUnspecified = \"unspecified\"\n\tpublicAccessPreventionEnforced    = \"enforced\"\n\tpublicAccessPreventionInherited   = \"inherited\"\n)\n\nfunc (p PublicAccessPrevention) String() string {\n\tswitch p {\n\tcase PublicAccessPreventionInherited, PublicAccessPreventionUnspecified:\n\t\treturn publicAccessPreventionInherited\n\tcase PublicAccessPreventionEnforced:\n\t\treturn publicAccessPreventionEnforced\n\tdefault:\n\t\treturn publicAccessPreventionUnknown\n\t}\n}\n\n// Lifecycle is the lifecycle configuration for objects in the bucket.\ntype Lifecycle struct {\n\tRules []LifecycleRule\n}\n\n// RetentionPolicy enforces a minimum retention time for all objects\n// contained in the bucket.\n//\n// Any attempt to overwrite or delete objects younger than the retention\n// period will result in an error. An unlocked retention policy can be\n// modified or removed from the bucket via the Update method. A\n// locked retention policy cannot be removed or shortened in duration\n// for the lifetime of the bucket.\n//\n// This feature is in private alpha release. It is not currently available to\n// most customers. It might be changed in backwards-incompatible ways and is not\n// subject to any SLA or deprecation policy.\ntype RetentionPolicy struct {\n\t// RetentionPeriod specifies the duration that objects need to be\n\t// retained. Retention duration must be greater than zero and less than\n\t// 100 years. Note that enforcement of retention periods less than a day\n\t// is not guaranteed. Such periods should only be used for testing\n\t// purposes.\n\tRetentionPeriod time.Duration\n\n\t// EffectiveTime is the time from which the policy was enforced and\n\t// effective. This field is read-only.\n\tEffectiveTime time.Time\n\n\t// IsLocked describes whether the bucket is locked. Once locked, an\n\t// object retention policy cannot be modified.\n\t// This field is read-only.\n\tIsLocked bool\n}\n\nconst (\n\t// RFC3339 timestamp with only the date segment, used for CreatedBefore,\n\t// CustomTimeBefore, and NoncurrentTimeBefore in LifecycleRule.\n\trfc3339Date = \"2006-01-02\"\n\n\t// DeleteAction is a lifecycle action that deletes a live and/or archived\n\t// objects. Takes precedence over SetStorageClass actions.\n\tDeleteAction = \"Delete\"\n\n\t// SetStorageClassAction changes the storage class of live and/or archived\n\t// objects.\n\tSetStorageClassAction = \"SetStorageClass\"\n\n\t// AbortIncompleteMPUAction is a lifecycle action that aborts an incomplete\n\t// multipart upload when the multipart upload meets the conditions specified\n\t// in the lifecycle rule. The AgeInDays condition is the only allowed\n\t// condition for this action. AgeInDays is measured from the time the\n\t// multipart upload was created.\n\tAbortIncompleteMPUAction = \"AbortIncompleteMultipartUpload\"\n)\n\n// LifecycleRule is a lifecycle configuration rule.\n//\n// When all the configured conditions are met by an object in the bucket, the\n// configured action will automatically be taken on that object.\ntype LifecycleRule struct {\n\t// Action is the action to take when all of the associated conditions are\n\t// met.\n\tAction LifecycleAction\n\n\t// Condition is the set of conditions that must be met for the associated\n\t// action to be taken.\n\tCondition LifecycleCondition\n}\n\n// LifecycleAction is a lifecycle configuration action.\ntype LifecycleAction struct {\n\t// Type is the type of action to take on matching objects.\n\t//\n\t// Acceptable values are storage.DeleteAction, storage.SetStorageClassAction,\n\t// and storage.AbortIncompleteMPUAction.\n\tType string\n\n\t// StorageClass is the storage class to set on matching objects if the Action\n\t// is \"SetStorageClass\".\n\tStorageClass string\n}\n\n// Liveness specifies whether the object is live or not.\ntype Liveness int\n\nconst (\n\t// LiveAndArchived includes both live and archived objects.\n\tLiveAndArchived Liveness = iota\n\t// Live specifies that the object is still live.\n\tLive\n\t// Archived specifies that the object is archived.\n\tArchived\n)\n\n// LifecycleCondition is a set of conditions used to match objects and take an\n// action automatically.\n//\n// All configured conditions must be met for the associated action to be taken.\ntype LifecycleCondition struct {\n\t// AllObjects is used to select all objects in a bucket by\n\t// setting AgeInDays to 0.\n\tAllObjects bool\n\n\t// AgeInDays is the age of the object in days.\n\t// If you want to set AgeInDays to `0` use AllObjects set to `true`.\n\tAgeInDays int64\n\n\t// CreatedBefore is the time the object was created.\n\t//\n\t// This condition is satisfied when an object is created before midnight of\n\t// the specified date in UTC.\n\tCreatedBefore time.Time\n\n\t// CustomTimeBefore is the CustomTime metadata field of the object. This\n\t// condition is satisfied when an object's CustomTime timestamp is before\n\t// midnight of the specified date in UTC.\n\t//\n\t// This condition can only be satisfied if CustomTime has been set.\n\tCustomTimeBefore time.Time\n\n\t// DaysSinceCustomTime is the days elapsed since the CustomTime date of the\n\t// object. This condition can only be satisfied if CustomTime has been set.\n\t// Note: Using `0` as the value will be ignored by the library and not sent to the API.\n\tDaysSinceCustomTime int64\n\n\t// DaysSinceNoncurrentTime is the days elapsed since the noncurrent timestamp\n\t// of the object. This condition is relevant only for versioned objects.\n\t// Note: Using `0` as the value will be ignored by the library and not sent to the API.\n\tDaysSinceNoncurrentTime int64\n\n\t// Liveness specifies the object's liveness. Relevant only for versioned objects\n\tLiveness Liveness\n\n\t// MatchesPrefix is the condition matching an object if any of the\n\t// matches_prefix strings are an exact prefix of the object's name.\n\tMatchesPrefix []string\n\n\t// MatchesStorageClasses is the condition matching the object's storage\n\t// class.\n\t//\n\t// Values include \"STANDARD\", \"NEARLINE\", \"COLDLINE\" and \"ARCHIVE\".\n\tMatchesStorageClasses []string\n\n\t// MatchesSuffix is the condition matching an object if any of the\n\t// matches_suffix strings are an exact suffix of the object's name.\n\tMatchesSuffix []string\n\n\t// NoncurrentTimeBefore is the noncurrent timestamp of the object. This\n\t// condition is satisfied when an object's noncurrent timestamp is before\n\t// midnight of the specified date in UTC.\n\t//\n\t// This condition is relevant only for versioned objects.\n\tNoncurrentTimeBefore time.Time\n\n\t// NumNewerVersions is the condition matching objects with a number of newer versions.\n\t//\n\t// If the value is N, this condition is satisfied when there are at least N\n\t// versions (including the live version) newer than this version of the\n\t// object.\n\t// Note: Using `0` as the value will be ignored by the library and not sent to the API.\n\tNumNewerVersions int64\n}\n\n// BucketLogging holds the bucket's logging configuration, which defines the\n// destination bucket and optional name prefix for the current bucket's\n// logs.\ntype BucketLogging struct {\n\t// The destination bucket where the current bucket's logs\n\t// should be placed.\n\tLogBucket string\n\n\t// A prefix for log object names.\n\tLogObjectPrefix string\n}\n\n// BucketWebsite holds the bucket's website configuration, controlling how the\n// service behaves when accessing bucket contents as a web site. See\n// https://cloud.google.com/storage/docs/static-website for more information.\ntype BucketWebsite struct {\n\t// If the requested object path is missing, the service will ensure the path has\n\t// a trailing '/', append this suffix, and attempt to retrieve the resulting\n\t// object. This allows the creation of index.html objects to represent directory\n\t// pages.\n\tMainPageSuffix string\n\n\t// If the requested object path is missing, and any mainPageSuffix object is\n\t// missing, if applicable, the service will return the named object from this\n\t// bucket as the content for a 404 Not Found result.\n\tNotFoundPage string\n}\n\n// CustomPlacementConfig holds the bucket's custom placement\n// configuration for Custom Dual Regions. See\n// https://cloud.google.com/storage/docs/locations#location-dr for more information.\ntype CustomPlacementConfig struct {\n\t// The list of regional locations in which data is placed.\n\t// Custom Dual Regions require exactly 2 regional locations.\n\tDataLocations []string\n}\n\n// Autoclass holds the bucket's autoclass configuration. If enabled,\n// allows for the automatic selection of the best storage class\n// based on object access patterns. See\n// https://cloud.google.com/storage/docs/using-autoclass for more information.\ntype Autoclass struct {\n\t// Enabled specifies whether the autoclass feature is enabled\n\t// on the bucket.\n\tEnabled bool\n\t// ToggleTime is the time from which Autoclass was last toggled.\n\t// If Autoclass is enabled when the bucket is created, the ToggleTime\n\t// is set to the bucket creation time. This field is read-only.\n\tToggleTime time.Time\n\t// TerminalStorageClass: The storage class that objects in the bucket\n\t// eventually transition to if they are not read for a certain length of\n\t// time. Valid values are NEARLINE and ARCHIVE.\n\t// To modify TerminalStorageClass, Enabled must be set to true.\n\tTerminalStorageClass string\n\t// TerminalStorageClassUpdateTime represents the time of the most recent\n\t// update to \"TerminalStorageClass\".\n\tTerminalStorageClassUpdateTime time.Time\n}\n\n// SoftDeletePolicy contains the bucket's soft delete policy, which defines the\n// period of time that soft-deleted objects will be retained, and cannot be\n// permanently deleted.\ntype SoftDeletePolicy struct {\n\t// EffectiveTime indicates the time from which the policy, or one with a\n\t// greater retention, was effective. This field is read-only.\n\tEffectiveTime time.Time\n\n\t// RetentionDuration is the amount of time that soft-deleted objects in the\n\t// bucket will be retained and cannot be permanently deleted.\n\tRetentionDuration time.Duration\n}\n\n// HierarchicalNamespace contains the bucket's hierarchical namespace\n// configuration. Hierarchical namespace enabled buckets can contain\n// [cloud.google.com/go/storage/control/apiv2/controlpb.Folder] resources.\ntype HierarchicalNamespace struct {\n\t// Enabled indicates whether hierarchical namespace features are enabled on\n\t// the bucket. This can only be set at bucket creation time currently.\n\tEnabled bool\n}\n\nfunc newBucket(b *raw.Bucket) (*BucketAttrs, error) {\n\tif b == nil {\n\t\treturn nil, nil\n\t}\n\trp, err := toRetentionPolicy(b.RetentionPolicy)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &BucketAttrs{\n\t\tName:                     b.Name,\n\t\tLocation:                 b.Location,\n\t\tMetaGeneration:           b.Metageneration,\n\t\tDefaultEventBasedHold:    b.DefaultEventBasedHold,\n\t\tStorageClass:             b.StorageClass,\n\t\tCreated:                  convertTime(b.TimeCreated),\n\t\tUpdated:                  convertTime(b.Updated),\n\t\tVersioningEnabled:        b.Versioning != nil && b.Versioning.Enabled,\n\t\tACL:                      toBucketACLRules(b.Acl),\n\t\tDefaultObjectACL:         toObjectACLRules(b.DefaultObjectAcl),\n\t\tLabels:                   b.Labels,\n\t\tRequesterPays:            b.Billing != nil && b.Billing.RequesterPays,\n\t\tLifecycle:                toLifecycle(b.Lifecycle),\n\t\tRetentionPolicy:          rp,\n\t\tObjectRetentionMode:      toBucketObjectRetention(b.ObjectRetention),\n\t\tCORS:                     toCORS(b.Cors),\n\t\tEncryption:               toBucketEncryption(b.Encryption),\n\t\tLogging:                  toBucketLogging(b.Logging),\n\t\tWebsite:                  toBucketWebsite(b.Website),\n\t\tBucketPolicyOnly:         toBucketPolicyOnly(b.IamConfiguration),\n\t\tUniformBucketLevelAccess: toUniformBucketLevelAccess(b.IamConfiguration),\n\t\tPublicAccessPrevention:   toPublicAccessPrevention(b.IamConfiguration),\n\t\tEtag:                     b.Etag,\n\t\tLocationType:             b.LocationType,\n\t\tProjectNumber:            b.ProjectNumber,\n\t\tRPO:                      toRPO(b),\n\t\tCustomPlacementConfig:    customPlacementFromRaw(b.CustomPlacementConfig),\n\t\tAutoclass:                toAutoclassFromRaw(b.Autoclass),\n\t\tSoftDeletePolicy:         toSoftDeletePolicyFromRaw(b.SoftDeletePolicy),\n\t\tHierarchicalNamespace:    toHierarchicalNamespaceFromRaw(b.HierarchicalNamespace),\n\t\tOwnerEntity:              ownerEntityFromRaw(b.Owner),\n\t}, nil\n}\n\nfunc newBucketFromProto(b *storagepb.Bucket) *BucketAttrs {\n\tif b == nil {\n\t\treturn nil\n\t}\n\treturn &BucketAttrs{\n\t\tName:                     parseBucketName(b.GetName()),\n\t\tLocation:                 b.GetLocation(),\n\t\tMetaGeneration:           b.GetMetageneration(),\n\t\tDefaultEventBasedHold:    b.GetDefaultEventBasedHold(),\n\t\tStorageClass:             b.GetStorageClass(),\n\t\tCreated:                  b.GetCreateTime().AsTime(),\n\t\tUpdated:                  b.GetUpdateTime().AsTime(),\n\t\tVersioningEnabled:        b.GetVersioning().GetEnabled(),\n\t\tACL:                      toBucketACLRulesFromProto(b.GetAcl()),\n\t\tDefaultObjectACL:         toObjectACLRulesFromProto(b.GetDefaultObjectAcl()),\n\t\tLabels:                   b.GetLabels(),\n\t\tRequesterPays:            b.GetBilling().GetRequesterPays(),\n\t\tLifecycle:                toLifecycleFromProto(b.GetLifecycle()),\n\t\tRetentionPolicy:          toRetentionPolicyFromProto(b.GetRetentionPolicy()),\n\t\tCORS:                     toCORSFromProto(b.GetCors()),\n\t\tEncryption:               toBucketEncryptionFromProto(b.GetEncryption()),\n\t\tLogging:                  toBucketLoggingFromProto(b.GetLogging()),\n\t\tWebsite:                  toBucketWebsiteFromProto(b.GetWebsite()),\n\t\tBucketPolicyOnly:         toBucketPolicyOnlyFromProto(b.GetIamConfig()),\n\t\tUniformBucketLevelAccess: toUniformBucketLevelAccessFromProto(b.GetIamConfig()),\n\t\tPublicAccessPrevention:   toPublicAccessPreventionFromProto(b.GetIamConfig()),\n\t\tLocationType:             b.GetLocationType(),\n\t\tRPO:                      toRPOFromProto(b),\n\t\tCustomPlacementConfig:    customPlacementFromProto(b.GetCustomPlacementConfig()),\n\t\tProjectNumber:            parseProjectNumber(b.GetProject()), // this can return 0 the project resource name is ID based\n\t\tAutoclass:                toAutoclassFromProto(b.GetAutoclass()),\n\t\tSoftDeletePolicy:         toSoftDeletePolicyFromProto(b.SoftDeletePolicy),\n\t\tHierarchicalNamespace:    toHierarchicalNamespaceFromProto(b.HierarchicalNamespace),\n\t\tOwnerEntity:              ownerEntityFromProto(b.GetOwner()),\n\t}\n}\n\n// toRawBucket copies the editable attribute from b to the raw library's Bucket type.\nfunc (b *BucketAttrs) toRawBucket() *raw.Bucket {\n\t// Copy label map.\n\tvar labels map[string]string\n\tif len(b.Labels) > 0 {\n\t\tlabels = make(map[string]string, len(b.Labels))\n\t\tfor k, v := range b.Labels {\n\t\t\tlabels[k] = v\n\t\t}\n\t}\n\t// Ignore VersioningEnabled if it is false. This is OK because\n\t// we only call this method when creating a bucket, and by default\n\t// new buckets have versioning off.\n\tvar v *raw.BucketVersioning\n\tif b.VersioningEnabled {\n\t\tv = &raw.BucketVersioning{Enabled: true}\n\t}\n\tvar bb *raw.BucketBilling\n\tif b.RequesterPays {\n\t\tbb = &raw.BucketBilling{RequesterPays: true}\n\t}\n\tvar bktIAM *raw.BucketIamConfiguration\n\tif b.UniformBucketLevelAccess.Enabled || b.BucketPolicyOnly.Enabled || b.PublicAccessPrevention != PublicAccessPreventionUnknown {\n\t\tbktIAM = &raw.BucketIamConfiguration{}\n\t\tif b.UniformBucketLevelAccess.Enabled || b.BucketPolicyOnly.Enabled {\n\t\t\tbktIAM.UniformBucketLevelAccess = &raw.BucketIamConfigurationUniformBucketLevelAccess{\n\t\t\t\tEnabled: true,\n\t\t\t}\n\t\t}\n\t\tif b.PublicAccessPrevention != PublicAccessPreventionUnknown {\n\t\t\tbktIAM.PublicAccessPrevention = b.PublicAccessPrevention.String()\n\t\t}\n\t}\n\treturn &raw.Bucket{\n\t\tName:                  b.Name,\n\t\tLocation:              b.Location,\n\t\tStorageClass:          b.StorageClass,\n\t\tAcl:                   toRawBucketACL(b.ACL),\n\t\tDefaultObjectAcl:      toRawObjectACL(b.DefaultObjectACL),\n\t\tVersioning:            v,\n\t\tLabels:                labels,\n\t\tBilling:               bb,\n\t\tLifecycle:             toRawLifecycle(b.Lifecycle),\n\t\tRetentionPolicy:       b.RetentionPolicy.toRawRetentionPolicy(),\n\t\tCors:                  toRawCORS(b.CORS),\n\t\tEncryption:            b.Encryption.toRawBucketEncryption(),\n\t\tLogging:               b.Logging.toRawBucketLogging(),\n\t\tWebsite:               b.Website.toRawBucketWebsite(),\n\t\tIamConfiguration:      bktIAM,\n\t\tRpo:                   b.RPO.String(),\n\t\tCustomPlacementConfig: b.CustomPlacementConfig.toRawCustomPlacement(),\n\t\tAutoclass:             b.Autoclass.toRawAutoclass(),\n\t\tSoftDeletePolicy:      b.SoftDeletePolicy.toRawSoftDeletePolicy(),\n\t\tHierarchicalNamespace: b.HierarchicalNamespace.toRawHierarchicalNamespace(),\n\t}\n}\n\nfunc (b *BucketAttrs) toProtoBucket() *storagepb.Bucket {\n\tif b == nil {\n\t\treturn &storagepb.Bucket{}\n\t}\n\n\t// Copy label map.\n\tvar labels map[string]string\n\tif len(b.Labels) > 0 {\n\t\tlabels = make(map[string]string, len(b.Labels))\n\t\tfor k, v := range b.Labels {\n\t\t\tlabels[k] = v\n\t\t}\n\t}\n\n\t// Ignore VersioningEnabled if it is false. This is OK because\n\t// we only call this method when creating a bucket, and by default\n\t// new buckets have versioning off.\n\tvar v *storagepb.Bucket_Versioning\n\tif b.VersioningEnabled {\n\t\tv = &storagepb.Bucket_Versioning{Enabled: true}\n\t}\n\tvar bb *storagepb.Bucket_Billing\n\tif b.RequesterPays {\n\t\tbb = &storagepb.Bucket_Billing{RequesterPays: true}\n\t}\n\tvar bktIAM *storagepb.Bucket_IamConfig\n\tif b.UniformBucketLevelAccess.Enabled || b.BucketPolicyOnly.Enabled || b.PublicAccessPrevention != PublicAccessPreventionUnknown {\n\t\tbktIAM = &storagepb.Bucket_IamConfig{}\n\t\tif b.UniformBucketLevelAccess.Enabled || b.BucketPolicyOnly.Enabled {\n\t\t\tbktIAM.UniformBucketLevelAccess = &storagepb.Bucket_IamConfig_UniformBucketLevelAccess{\n\t\t\t\tEnabled: true,\n\t\t\t}\n\t\t}\n\t\tif b.PublicAccessPrevention != PublicAccessPreventionUnknown {\n\t\t\tbktIAM.PublicAccessPrevention = b.PublicAccessPrevention.String()\n\t\t}\n\t}\n\n\treturn &storagepb.Bucket{\n\t\tName:                  b.Name,\n\t\tLocation:              b.Location,\n\t\tStorageClass:          b.StorageClass,\n\t\tAcl:                   toProtoBucketACL(b.ACL),\n\t\tDefaultObjectAcl:      toProtoObjectACL(b.DefaultObjectACL),\n\t\tVersioning:            v,\n\t\tLabels:                labels,\n\t\tBilling:               bb,\n\t\tLifecycle:             toProtoLifecycle(b.Lifecycle),\n\t\tRetentionPolicy:       b.RetentionPolicy.toProtoRetentionPolicy(),\n\t\tCors:                  toProtoCORS(b.CORS),\n\t\tEncryption:            b.Encryption.toProtoBucketEncryption(),\n\t\tLogging:               b.Logging.toProtoBucketLogging(),\n\t\tWebsite:               b.Website.toProtoBucketWebsite(),\n\t\tIamConfig:             bktIAM,\n\t\tRpo:                   b.RPO.String(),\n\t\tCustomPlacementConfig: b.CustomPlacementConfig.toProtoCustomPlacement(),\n\t\tAutoclass:             b.Autoclass.toProtoAutoclass(),\n\t\tSoftDeletePolicy:      b.SoftDeletePolicy.toProtoSoftDeletePolicy(),\n\t\tHierarchicalNamespace: b.HierarchicalNamespace.toProtoHierarchicalNamespace(),\n\t}\n}\n\nfunc (ua *BucketAttrsToUpdate) toProtoBucket() *storagepb.Bucket {\n\tif ua == nil {\n\t\treturn &storagepb.Bucket{}\n\t}\n\n\tvar v *storagepb.Bucket_Versioning\n\tif ua.VersioningEnabled != nil {\n\t\tv = &storagepb.Bucket_Versioning{Enabled: optional.ToBool(ua.VersioningEnabled)}\n\t}\n\tvar bb *storagepb.Bucket_Billing\n\tif ua.RequesterPays != nil {\n\t\tbb = &storagepb.Bucket_Billing{RequesterPays: optional.ToBool(ua.RequesterPays)}\n\t}\n\n\tvar bktIAM *storagepb.Bucket_IamConfig\n\tif ua.UniformBucketLevelAccess != nil || ua.BucketPolicyOnly != nil || ua.PublicAccessPrevention != PublicAccessPreventionUnknown {\n\t\tbktIAM = &storagepb.Bucket_IamConfig{}\n\n\t\tif ua.BucketPolicyOnly != nil {\n\t\t\tbktIAM.UniformBucketLevelAccess = &storagepb.Bucket_IamConfig_UniformBucketLevelAccess{\n\t\t\t\tEnabled: optional.ToBool(ua.BucketPolicyOnly.Enabled),\n\t\t\t}\n\t\t}\n\n\t\tif ua.UniformBucketLevelAccess != nil {\n\t\t\t// UniformBucketLevelAccess takes precedence over BucketPolicyOnly,\n\t\t\t// so Enabled will be overriden here if both are set\n\t\t\tbktIAM.UniformBucketLevelAccess = &storagepb.Bucket_IamConfig_UniformBucketLevelAccess{\n\t\t\t\tEnabled: optional.ToBool(ua.UniformBucketLevelAccess.Enabled),\n\t\t\t}\n\t\t}\n\n\t\tif ua.PublicAccessPrevention != PublicAccessPreventionUnknown {\n\t\t\tbktIAM.PublicAccessPrevention = ua.PublicAccessPrevention.String()\n\t\t}\n\t}\n\n\tvar defaultHold bool\n\tif ua.DefaultEventBasedHold != nil {\n\t\tdefaultHold = optional.ToBool(ua.DefaultEventBasedHold)\n\t}\n\tvar lifecycle Lifecycle\n\tif ua.Lifecycle != nil {\n\t\tlifecycle = *ua.Lifecycle\n\t}\n\tvar bktACL []*storagepb.BucketAccessControl\n\tif ua.acl != nil {\n\t\tbktACL = toProtoBucketACL(ua.acl)\n\t}\n\tif ua.PredefinedACL != \"\" {\n\t\t// Clear ACL or the call will fail.\n\t\tbktACL = nil\n\t}\n\tvar bktDefaultObjectACL []*storagepb.ObjectAccessControl\n\tif ua.defaultObjectACL != nil {\n\t\tbktDefaultObjectACL = toProtoObjectACL(ua.defaultObjectACL)\n\t}\n\tif ua.PredefinedDefaultObjectACL != \"\" {\n\t\t// Clear ACLs or the call will fail.\n\t\tbktDefaultObjectACL = nil\n\t}\n\n\treturn &storagepb.Bucket{\n\t\tStorageClass:          ua.StorageClass,\n\t\tAcl:                   bktACL,\n\t\tDefaultObjectAcl:      bktDefaultObjectACL,\n\t\tDefaultEventBasedHold: defaultHold,\n\t\tVersioning:            v,\n\t\tBilling:               bb,\n\t\tLifecycle:             toProtoLifecycle(lifecycle),\n\t\tRetentionPolicy:       ua.RetentionPolicy.toProtoRetentionPolicy(),\n\t\tCors:                  toProtoCORS(ua.CORS),\n\t\tEncryption:            ua.Encryption.toProtoBucketEncryption(),\n\t\tLogging:               ua.Logging.toProtoBucketLogging(),\n\t\tWebsite:               ua.Website.toProtoBucketWebsite(),\n\t\tIamConfig:             bktIAM,\n\t\tRpo:                   ua.RPO.String(),\n\t\tAutoclass:             ua.Autoclass.toProtoAutoclass(),\n\t\tSoftDeletePolicy:      ua.SoftDeletePolicy.toProtoSoftDeletePolicy(),\n\t\tLabels:                ua.setLabels,\n\t}\n}\n\n// CORS is the bucket's Cross-Origin Resource Sharing (CORS) configuration.\ntype CORS struct {\n\t// MaxAge is the value to return in the Access-Control-Max-Age\n\t// header used in preflight responses.\n\tMaxAge time.Duration\n\n\t// Methods is the list of HTTP methods on which to include CORS response\n\t// headers, (GET, OPTIONS, POST, etc) Note: \"*\" is permitted in the list\n\t// of methods, and means \"any method\".\n\tMethods []string\n\n\t// Origins is the list of Origins eligible to receive CORS response\n\t// headers. Note: \"*\" is permitted in the list of origins, and means\n\t// \"any Origin\".\n\tOrigins []string\n\n\t// ResponseHeaders is the list of HTTP headers other than the simple\n\t// response headers to give permission for the user-agent to share\n\t// across domains.\n\tResponseHeaders []string\n}\n\n// BucketEncryption is a bucket's encryption configuration.\ntype BucketEncryption struct {\n\t// A Cloud KMS key name, in the form\n\t// projects/P/locations/L/keyRings/R/cryptoKeys/K, that will be used to encrypt\n\t// objects inserted into this bucket, if no encryption method is specified.\n\t// The key's location must be the same as the bucket's.\n\tDefaultKMSKeyName string\n}\n\n// BucketAttrsToUpdate define the attributes to update during an Update call.\ntype BucketAttrsToUpdate struct {\n\t// If set, updates whether the bucket uses versioning.\n\tVersioningEnabled optional.Bool\n\n\t// If set, updates whether the bucket is a Requester Pays bucket.\n\tRequesterPays optional.Bool\n\n\t// DefaultEventBasedHold is the default value for event-based hold on\n\t// newly created objects in this bucket.\n\tDefaultEventBasedHold optional.Bool\n\n\t// BucketPolicyOnly is an alias for UniformBucketLevelAccess. Use of\n\t// UniformBucketLevelAccess is recommended above the use of this field.\n\t// Setting BucketPolicyOnly.Enabled OR UniformBucketLevelAccess.Enabled to\n\t// true, will enable UniformBucketLevelAccess. If both BucketPolicyOnly and\n\t// UniformBucketLevelAccess are set, the value of UniformBucketLevelAccess\n\t// will take precedence.\n\tBucketPolicyOnly *BucketPolicyOnly\n\n\t// UniformBucketLevelAccess configures access checks to use only bucket-level IAM\n\t// policies and ignore any ACL rules for the bucket.\n\t// See https://cloud.google.com/storage/docs/uniform-bucket-level-access\n\t// for more information.\n\tUniformBucketLevelAccess *UniformBucketLevelAccess\n\n\t// PublicAccessPrevention is the setting for the bucket's\n\t// PublicAccessPrevention policy, which can be used to prevent public access\n\t// of data in the bucket. See\n\t// https://cloud.google.com/storage/docs/public-access-prevention for more\n\t// information.\n\tPublicAccessPrevention PublicAccessPrevention\n\n\t// StorageClass is the default storage class of the bucket. This defines\n\t// how objects in the bucket are stored and determines the SLA\n\t// and the cost of storage. Typical values are \"STANDARD\", \"NEARLINE\",\n\t// \"COLDLINE\" and \"ARCHIVE\". Defaults to \"STANDARD\".\n\t// See https://cloud.google.com/storage/docs/storage-classes for all\n\t// valid values.\n\tStorageClass string\n\n\t// If set, updates the retention policy of the bucket. Using\n\t// RetentionPolicy.RetentionPeriod = 0 will delete the existing policy.\n\t//\n\t// This feature is in private alpha release. It is not currently available to\n\t// most customers. It might be changed in backwards-incompatible ways and is not\n\t// subject to any SLA or deprecation policy.\n\tRetentionPolicy *RetentionPolicy\n\n\t// If set, replaces the CORS configuration with a new configuration.\n\t// An empty (rather than nil) slice causes all CORS policies to be removed.\n\tCORS []CORS\n\n\t// If set, replaces the encryption configuration of the bucket. Using\n\t// BucketEncryption.DefaultKMSKeyName = \"\" will delete the existing\n\t// configuration.\n\tEncryption *BucketEncryption\n\n\t// If set, replaces the lifecycle configuration of the bucket.\n\tLifecycle *Lifecycle\n\n\t// If set, replaces the logging configuration of the bucket.\n\tLogging *BucketLogging\n\n\t// If set, replaces the website configuration of the bucket.\n\tWebsite *BucketWebsite\n\n\t// If not empty, applies a predefined set of access controls.\n\t// See https://cloud.google.com/storage/docs/json_api/v1/buckets/patch.\n\tPredefinedACL string\n\n\t// If not empty, applies a predefined set of default object access controls.\n\t// See https://cloud.google.com/storage/docs/json_api/v1/buckets/patch.\n\tPredefinedDefaultObjectACL string\n\n\t// RPO configures the Recovery Point Objective (RPO) policy of the bucket.\n\t// Set to RPOAsyncTurbo to turn on Turbo Replication for a bucket.\n\t// See https://cloud.google.com/storage/docs/managing-turbo-replication for\n\t// more information.\n\tRPO RPO\n\n\t// If set, updates the autoclass configuration of the bucket.\n\t// To disable autoclass on the bucket, set to an empty &Autoclass{}.\n\t// To update the configuration for Autoclass.TerminalStorageClass,\n\t// Autoclass.Enabled must also be set to true.\n\t// See https://cloud.google.com/storage/docs/using-autoclass for more information.\n\tAutoclass *Autoclass\n\n\t// If set, updates the soft delete policy of the bucket.\n\tSoftDeletePolicy *SoftDeletePolicy\n\n\t// acl is the list of access control rules on the bucket.\n\t// It is unexported and only used internally by the gRPC client.\n\t// Library users should use ACLHandle methods directly.\n\tacl []ACLRule\n\n\t// defaultObjectACL is the list of access controls to\n\t// apply to new objects when no object ACL is provided.\n\t// It is unexported and only used internally by the gRPC client.\n\t// Library users should use ACLHandle methods directly.\n\tdefaultObjectACL []ACLRule\n\n\tsetLabels    map[string]string\n\tdeleteLabels map[string]bool\n}\n\n// SetLabel causes a label to be added or modified when ua is used\n// in a call to Bucket.Update.\nfunc (ua *BucketAttrsToUpdate) SetLabel(name, value string) {\n\tif ua.setLabels == nil {\n\t\tua.setLabels = map[string]string{}\n\t}\n\tua.setLabels[name] = value\n}\n\n// DeleteLabel causes a label to be deleted when ua is used in a\n// call to Bucket.Update.\nfunc (ua *BucketAttrsToUpdate) DeleteLabel(name string) {\n\tif ua.deleteLabels == nil {\n\t\tua.deleteLabels = map[string]bool{}\n\t}\n\tua.deleteLabels[name] = true\n}\n\nfunc (ua *BucketAttrsToUpdate) toRawBucket() *raw.Bucket {\n\trb := &raw.Bucket{}\n\tif ua.CORS != nil {\n\t\trb.Cors = toRawCORS(ua.CORS)\n\t\trb.ForceSendFields = append(rb.ForceSendFields, \"Cors\")\n\t}\n\tif ua.DefaultEventBasedHold != nil {\n\t\trb.DefaultEventBasedHold = optional.ToBool(ua.DefaultEventBasedHold)\n\t\trb.ForceSendFields = append(rb.ForceSendFields, \"DefaultEventBasedHold\")\n\t}\n\tif ua.RetentionPolicy != nil {\n\t\tif ua.RetentionPolicy.RetentionPeriod == 0 {\n\t\t\trb.NullFields = append(rb.NullFields, \"RetentionPolicy\")\n\t\t\trb.RetentionPolicy = nil\n\t\t} else {\n\t\t\trb.RetentionPolicy = ua.RetentionPolicy.toRawRetentionPolicy()\n\t\t}\n\t}\n\tif ua.VersioningEnabled != nil {\n\t\trb.Versioning = &raw.BucketVersioning{\n\t\t\tEnabled:         optional.ToBool(ua.VersioningEnabled),\n\t\t\tForceSendFields: []string{\"Enabled\"},\n\t\t}\n\t}\n\tif ua.RequesterPays != nil {\n\t\trb.Billing = &raw.BucketBilling{\n\t\t\tRequesterPays:   optional.ToBool(ua.RequesterPays),\n\t\t\tForceSendFields: []string{\"RequesterPays\"},\n\t\t}\n\t}\n\tif ua.BucketPolicyOnly != nil {\n\t\trb.IamConfiguration = &raw.BucketIamConfiguration{\n\t\t\tUniformBucketLevelAccess: &raw.BucketIamConfigurationUniformBucketLevelAccess{\n\t\t\t\tEnabled:         ua.BucketPolicyOnly.Enabled,\n\t\t\t\tForceSendFields: []string{\"Enabled\"},\n\t\t\t},\n\t\t}\n\t}\n\tif ua.UniformBucketLevelAccess != nil {\n\t\trb.IamConfiguration = &raw.BucketIamConfiguration{\n\t\t\tUniformBucketLevelAccess: &raw.BucketIamConfigurationUniformBucketLevelAccess{\n\t\t\t\tEnabled:         ua.UniformBucketLevelAccess.Enabled,\n\t\t\t\tForceSendFields: []string{\"Enabled\"},\n\t\t\t},\n\t\t}\n\t}\n\tif ua.PublicAccessPrevention != PublicAccessPreventionUnknown {\n\t\tif rb.IamConfiguration == nil {\n\t\t\trb.IamConfiguration = &raw.BucketIamConfiguration{}\n\t\t}\n\t\trb.IamConfiguration.PublicAccessPrevention = ua.PublicAccessPrevention.String()\n\t}\n\tif ua.Encryption != nil {\n\t\tif ua.Encryption.DefaultKMSKeyName == \"\" {\n\t\t\trb.NullFields = append(rb.NullFields, \"Encryption\")\n\t\t\trb.Encryption = nil\n\t\t} else {\n\t\t\trb.Encryption = ua.Encryption.toRawBucketEncryption()\n\t\t}\n\t}\n\tif ua.Lifecycle != nil {\n\t\trb.Lifecycle = toRawLifecycle(*ua.Lifecycle)\n\t\trb.ForceSendFields = append(rb.ForceSendFields, \"Lifecycle\")\n\t}\n\tif ua.Logging != nil {\n\t\tif *ua.Logging == (BucketLogging{}) {\n\t\t\trb.NullFields = append(rb.NullFields, \"Logging\")\n\t\t\trb.Logging = nil\n\t\t} else {\n\t\t\trb.Logging = ua.Logging.toRawBucketLogging()\n\t\t}\n\t}\n\tif ua.Website != nil {\n\t\tif *ua.Website == (BucketWebsite{}) {\n\t\t\trb.NullFields = append(rb.NullFields, \"Website\")\n\t\t\trb.Website = nil\n\t\t} else {\n\t\t\trb.Website = ua.Website.toRawBucketWebsite()\n\t\t}\n\t}\n\tif ua.Autoclass != nil {\n\t\trb.Autoclass = &raw.BucketAutoclass{\n\t\t\tEnabled:              ua.Autoclass.Enabled,\n\t\t\tTerminalStorageClass: ua.Autoclass.TerminalStorageClass,\n\t\t\tForceSendFields:      []string{\"Enabled\"},\n\t\t}\n\t\trb.ForceSendFields = append(rb.ForceSendFields, \"Autoclass\")\n\t}\n\tif ua.SoftDeletePolicy != nil {\n\t\tif ua.SoftDeletePolicy.RetentionDuration == 0 {\n\t\t\trb.SoftDeletePolicy = &raw.BucketSoftDeletePolicy{\n\t\t\t\tRetentionDurationSeconds: 0,\n\t\t\t\tForceSendFields:          []string{\"RetentionDurationSeconds\"},\n\t\t\t}\n\t\t} else {\n\t\t\trb.SoftDeletePolicy = ua.SoftDeletePolicy.toRawSoftDeletePolicy()\n\t\t}\n\t}\n\tif ua.PredefinedACL != \"\" {\n\t\t// Clear ACL or the call will fail.\n\t\trb.Acl = nil\n\t\trb.ForceSendFields = append(rb.ForceSendFields, \"Acl\")\n\t}\n\tif ua.PredefinedDefaultObjectACL != \"\" {\n\t\t// Clear ACLs or the call will fail.\n\t\trb.DefaultObjectAcl = nil\n\t\trb.ForceSendFields = append(rb.ForceSendFields, \"DefaultObjectAcl\")\n\t}\n\n\trb.StorageClass = ua.StorageClass\n\trb.Rpo = ua.RPO.String()\n\n\tif ua.setLabels != nil || ua.deleteLabels != nil {\n\t\trb.Labels = map[string]string{}\n\t\tfor k, v := range ua.setLabels {\n\t\t\trb.Labels[k] = v\n\t\t}\n\t\tif len(rb.Labels) == 0 && len(ua.deleteLabels) > 0 {\n\t\t\trb.ForceSendFields = append(rb.ForceSendFields, \"Labels\")\n\t\t}\n\t\tfor l := range ua.deleteLabels {\n\t\t\trb.NullFields = append(rb.NullFields, \"Labels.\"+l)\n\t\t}\n\t}\n\treturn rb\n}\n\n// If returns a new BucketHandle that applies a set of preconditions.\n// Preconditions already set on the BucketHandle are ignored. The supplied\n// BucketConditions must have exactly one field set to a non-zero value;\n// otherwise an error will be returned from any operation on the BucketHandle.\n// Operations on the new handle will return an error if the preconditions are not\n// satisfied. The only valid preconditions for buckets are MetagenerationMatch\n// and MetagenerationNotMatch.\nfunc (b *BucketHandle) If(conds BucketConditions) *BucketHandle {\n\tb2 := *b\n\tb2.conds = &conds\n\treturn &b2\n}\n\n// BucketConditions constrain bucket methods to act on specific metagenerations.\n//\n// The zero value is an empty set of constraints.\ntype BucketConditions struct {\n\t// MetagenerationMatch specifies that the bucket must have the given\n\t// metageneration for the operation to occur.\n\t// If MetagenerationMatch is zero, it has no effect.\n\tMetagenerationMatch int64\n\n\t// MetagenerationNotMatch specifies that the bucket must not have the given\n\t// metageneration for the operation to occur.\n\t// If MetagenerationNotMatch is zero, it has no effect.\n\tMetagenerationNotMatch int64\n}\n\nfunc (c *BucketConditions) validate(method string) error {\n\tif *c == (BucketConditions{}) {\n\t\treturn fmt.Errorf(\"storage: %s: empty conditions\", method)\n\t}\n\tif c.MetagenerationMatch != 0 && c.MetagenerationNotMatch != 0 {\n\t\treturn fmt.Errorf(\"storage: %s: multiple conditions specified for metageneration\", method)\n\t}\n\treturn nil\n}\n\n// UserProject returns a new BucketHandle that passes the project ID as the user\n// project for all subsequent calls. Calls with a user project will be billed to that\n// project rather than to the bucket's owning project.\n//\n// A user project is required for all operations on Requester Pays buckets.\nfunc (b *BucketHandle) UserProject(projectID string) *BucketHandle {\n\tb2 := *b\n\tb2.userProject = projectID\n\tb2.acl.userProject = projectID\n\tb2.defaultObjectACL.userProject = projectID\n\treturn &b2\n}\n\n// LockRetentionPolicy locks a bucket's retention policy until a previously-configured\n// RetentionPeriod past the EffectiveTime. Note that if RetentionPeriod is set to less\n// than a day, the retention policy is treated as a development configuration and locking\n// will have no effect. The BucketHandle must have a metageneration condition that\n// matches the bucket's metageneration. See BucketHandle.If.\n//\n// This feature is in private alpha release. It is not currently available to\n// most customers. It might be changed in backwards-incompatible ways and is not\n// subject to any SLA or deprecation policy.\nfunc (b *BucketHandle) LockRetentionPolicy(ctx context.Context) error {\n\to := makeStorageOpts(true, b.retry, b.userProject)\n\treturn b.c.tc.LockBucketRetentionPolicy(ctx, b.name, b.conds, o...)\n}\n\n// SetObjectRetention returns a new BucketHandle that will enable object retention\n// on bucket creation. To enable object retention, you must use the returned\n// handle to create the bucket. This has no effect on an already existing bucket.\n// ObjectRetention is not enabled by default.\n// ObjectRetention cannot be configured through the gRPC API.\nfunc (b *BucketHandle) SetObjectRetention(enable bool) *BucketHandle {\n\tb2 := *b\n\tb2.enableObjectRetention = &enable\n\treturn &b2\n}\n\n// applyBucketConds modifies the provided call using the conditions in conds.\n// call is something that quacks like a *raw.WhateverCall.\nfunc applyBucketConds(method string, conds *BucketConditions, call interface{}) error {\n\tif conds == nil {\n\t\treturn nil\n\t}\n\tif err := conds.validate(method); err != nil {\n\t\treturn err\n\t}\n\tcval := reflect.ValueOf(call)\n\tswitch {\n\tcase conds.MetagenerationMatch != 0:\n\t\tif !setIfMetagenerationMatch(cval, conds.MetagenerationMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifMetagenerationMatch not supported\", method)\n\t\t}\n\tcase conds.MetagenerationNotMatch != 0:\n\t\tif !setIfMetagenerationNotMatch(cval, conds.MetagenerationNotMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifMetagenerationNotMatch not supported\", method)\n\t\t}\n\t}\n\treturn nil\n}\n\n// applyBucketConds modifies the provided request message using the conditions\n// in conds. msg is a protobuf Message that has fields if_metageneration_match\n// and if_metageneration_not_match.\nfunc applyBucketCondsProto(method string, conds *BucketConditions, msg proto.Message) error {\n\trmsg := msg.ProtoReflect()\n\n\tif conds == nil {\n\t\treturn nil\n\t}\n\tif err := conds.validate(method); err != nil {\n\t\treturn err\n\t}\n\n\tswitch {\n\tcase conds.MetagenerationMatch != 0:\n\t\tif !setConditionProtoField(rmsg, \"if_metageneration_match\", conds.MetagenerationMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifMetagenerationMatch not supported\", method)\n\t\t}\n\tcase conds.MetagenerationNotMatch != 0:\n\t\tif !setConditionProtoField(rmsg, \"if_metageneration_not_match\", conds.MetagenerationNotMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifMetagenerationNotMatch not supported\", method)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (rp *RetentionPolicy) toRawRetentionPolicy() *raw.BucketRetentionPolicy {\n\tif rp == nil {\n\t\treturn nil\n\t}\n\treturn &raw.BucketRetentionPolicy{\n\t\tRetentionPeriod: int64(rp.RetentionPeriod / time.Second),\n\t}\n}\n\nfunc (rp *RetentionPolicy) toProtoRetentionPolicy() *storagepb.Bucket_RetentionPolicy {\n\tif rp == nil {\n\t\treturn nil\n\t}\n\t// RetentionPeriod must be greater than 0, so if it is 0, the user left it\n\t// unset, and so we should not send it in the request i.e. nil is sent.\n\tvar dur *durationpb.Duration\n\tif rp.RetentionPeriod != 0 {\n\t\tdur = durationpb.New(rp.RetentionPeriod)\n\t}\n\treturn &storagepb.Bucket_RetentionPolicy{\n\t\tRetentionDuration: dur,\n\t}\n}\n\nfunc toRetentionPolicy(rp *raw.BucketRetentionPolicy) (*RetentionPolicy, error) {\n\tif rp == nil || rp.EffectiveTime == \"\" {\n\t\treturn nil, nil\n\t}\n\tt, err := time.Parse(time.RFC3339, rp.EffectiveTime)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &RetentionPolicy{\n\t\tRetentionPeriod: time.Duration(rp.RetentionPeriod) * time.Second,\n\t\tEffectiveTime:   t,\n\t\tIsLocked:        rp.IsLocked,\n\t}, nil\n}\n\nfunc toRetentionPolicyFromProto(rp *storagepb.Bucket_RetentionPolicy) *RetentionPolicy {\n\tif rp == nil || rp.GetEffectiveTime().AsTime().Unix() == 0 {\n\t\treturn nil\n\t}\n\treturn &RetentionPolicy{\n\t\tRetentionPeriod: rp.GetRetentionDuration().AsDuration(),\n\t\tEffectiveTime:   rp.GetEffectiveTime().AsTime(),\n\t\tIsLocked:        rp.GetIsLocked(),\n\t}\n}\n\nfunc toBucketObjectRetention(or *raw.BucketObjectRetention) string {\n\tif or == nil {\n\t\treturn \"\"\n\t}\n\treturn or.Mode\n}\n\nfunc toRawCORS(c []CORS) []*raw.BucketCors {\n\tvar out []*raw.BucketCors\n\tfor _, v := range c {\n\t\tout = append(out, &raw.BucketCors{\n\t\t\tMaxAgeSeconds:  int64(v.MaxAge / time.Second),\n\t\t\tMethod:         v.Methods,\n\t\t\tOrigin:         v.Origins,\n\t\t\tResponseHeader: v.ResponseHeaders,\n\t\t})\n\t}\n\treturn out\n}\n\nfunc toProtoCORS(c []CORS) []*storagepb.Bucket_Cors {\n\tvar out []*storagepb.Bucket_Cors\n\tfor _, v := range c {\n\t\tout = append(out, &storagepb.Bucket_Cors{\n\t\t\tMaxAgeSeconds:  int32(v.MaxAge / time.Second),\n\t\t\tMethod:         v.Methods,\n\t\t\tOrigin:         v.Origins,\n\t\t\tResponseHeader: v.ResponseHeaders,\n\t\t})\n\t}\n\treturn out\n}\n\nfunc toCORS(rc []*raw.BucketCors) []CORS {\n\tvar out []CORS\n\tfor _, v := range rc {\n\t\tout = append(out, CORS{\n\t\t\tMaxAge:          time.Duration(v.MaxAgeSeconds) * time.Second,\n\t\t\tMethods:         v.Method,\n\t\t\tOrigins:         v.Origin,\n\t\t\tResponseHeaders: v.ResponseHeader,\n\t\t})\n\t}\n\treturn out\n}\n\nfunc toCORSFromProto(rc []*storagepb.Bucket_Cors) []CORS {\n\tvar out []CORS\n\tfor _, v := range rc {\n\t\tout = append(out, CORS{\n\t\t\tMaxAge:          time.Duration(v.GetMaxAgeSeconds()) * time.Second,\n\t\t\tMethods:         v.GetMethod(),\n\t\t\tOrigins:         v.GetOrigin(),\n\t\t\tResponseHeaders: v.GetResponseHeader(),\n\t\t})\n\t}\n\treturn out\n}\n\nfunc toRawLifecycle(l Lifecycle) *raw.BucketLifecycle {\n\tvar rl raw.BucketLifecycle\n\tif len(l.Rules) == 0 {\n\t\trl.ForceSendFields = []string{\"Rule\"}\n\t}\n\tfor _, r := range l.Rules {\n\t\trr := &raw.BucketLifecycleRule{\n\t\t\tAction: &raw.BucketLifecycleRuleAction{\n\t\t\t\tType:         r.Action.Type,\n\t\t\t\tStorageClass: r.Action.StorageClass,\n\t\t\t},\n\t\t\tCondition: &raw.BucketLifecycleRuleCondition{\n\t\t\t\tDaysSinceCustomTime:     r.Condition.DaysSinceCustomTime,\n\t\t\t\tDaysSinceNoncurrentTime: r.Condition.DaysSinceNoncurrentTime,\n\t\t\t\tMatchesPrefix:           r.Condition.MatchesPrefix,\n\t\t\t\tMatchesStorageClass:     r.Condition.MatchesStorageClasses,\n\t\t\t\tMatchesSuffix:           r.Condition.MatchesSuffix,\n\t\t\t\tNumNewerVersions:        r.Condition.NumNewerVersions,\n\t\t\t},\n\t\t}\n\n\t\t// AllObjects takes precedent when both AllObjects and AgeInDays are set\n\t\t// Rationale: If you've opted into using AllObjects, it makes sense that you\n\t\t// understand the implications of how this option works with AgeInDays.\n\t\tif r.Condition.AllObjects {\n\t\t\trr.Condition.Age = googleapi.Int64(0)\n\t\t\trr.Condition.ForceSendFields = []string{\"Age\"}\n\t\t} else if r.Condition.AgeInDays > 0 {\n\t\t\trr.Condition.Age = googleapi.Int64(r.Condition.AgeInDays)\n\t\t}\n\n\t\tswitch r.Condition.Liveness {\n\t\tcase LiveAndArchived:\n\t\t\trr.Condition.IsLive = nil\n\t\tcase Live:\n\t\t\trr.Condition.IsLive = googleapi.Bool(true)\n\t\tcase Archived:\n\t\t\trr.Condition.IsLive = googleapi.Bool(false)\n\t\t}\n\n\t\tif !r.Condition.CreatedBefore.IsZero() {\n\t\t\trr.Condition.CreatedBefore = r.Condition.CreatedBefore.Format(rfc3339Date)\n\t\t}\n\t\tif !r.Condition.CustomTimeBefore.IsZero() {\n\t\t\trr.Condition.CustomTimeBefore = r.Condition.CustomTimeBefore.Format(rfc3339Date)\n\t\t}\n\t\tif !r.Condition.NoncurrentTimeBefore.IsZero() {\n\t\t\trr.Condition.NoncurrentTimeBefore = r.Condition.NoncurrentTimeBefore.Format(rfc3339Date)\n\t\t}\n\t\trl.Rule = append(rl.Rule, rr)\n\t}\n\treturn &rl\n}\n\nfunc toProtoLifecycle(l Lifecycle) *storagepb.Bucket_Lifecycle {\n\tvar rl storagepb.Bucket_Lifecycle\n\n\tfor _, r := range l.Rules {\n\t\trr := &storagepb.Bucket_Lifecycle_Rule{\n\t\t\tAction: &storagepb.Bucket_Lifecycle_Rule_Action{\n\t\t\t\tType:         r.Action.Type,\n\t\t\t\tStorageClass: r.Action.StorageClass,\n\t\t\t},\n\t\t\tCondition: &storagepb.Bucket_Lifecycle_Rule_Condition{\n\t\t\t\t// Note: The Apiary types use int64 (even though the Discovery\n\t\t\t\t// doc states \"format: int32\"), so the client types used int64,\n\t\t\t\t// but the proto uses int32 so we have a potentially lossy\n\t\t\t\t// conversion.\n\t\t\t\tDaysSinceCustomTime:     proto.Int32(int32(r.Condition.DaysSinceCustomTime)),\n\t\t\t\tDaysSinceNoncurrentTime: proto.Int32(int32(r.Condition.DaysSinceNoncurrentTime)),\n\t\t\t\tMatchesPrefix:           r.Condition.MatchesPrefix,\n\t\t\t\tMatchesStorageClass:     r.Condition.MatchesStorageClasses,\n\t\t\t\tMatchesSuffix:           r.Condition.MatchesSuffix,\n\t\t\t\tNumNewerVersions:        proto.Int32(int32(r.Condition.NumNewerVersions)),\n\t\t\t},\n\t\t}\n\n\t\t// Only set AgeDays in the proto if it is non-zero, or if the user has set\n\t\t// Condition.AllObjects.\n\t\tif r.Condition.AgeInDays != 0 {\n\t\t\trr.Condition.AgeDays = proto.Int32(int32(r.Condition.AgeInDays))\n\t\t}\n\t\tif r.Condition.AllObjects {\n\t\t\trr.Condition.AgeDays = proto.Int32(0)\n\t\t}\n\n\t\tswitch r.Condition.Liveness {\n\t\tcase LiveAndArchived:\n\t\t\trr.Condition.IsLive = nil\n\t\tcase Live:\n\t\t\trr.Condition.IsLive = proto.Bool(true)\n\t\tcase Archived:\n\t\t\trr.Condition.IsLive = proto.Bool(false)\n\t\t}\n\n\t\tif !r.Condition.CreatedBefore.IsZero() {\n\t\t\trr.Condition.CreatedBefore = timeToProtoDate(r.Condition.CreatedBefore)\n\t\t}\n\t\tif !r.Condition.CustomTimeBefore.IsZero() {\n\t\t\trr.Condition.CustomTimeBefore = timeToProtoDate(r.Condition.CustomTimeBefore)\n\t\t}\n\t\tif !r.Condition.NoncurrentTimeBefore.IsZero() {\n\t\t\trr.Condition.NoncurrentTimeBefore = timeToProtoDate(r.Condition.NoncurrentTimeBefore)\n\t\t}\n\t\trl.Rule = append(rl.Rule, rr)\n\t}\n\treturn &rl\n}\n\nfunc toLifecycle(rl *raw.BucketLifecycle) Lifecycle {\n\tvar l Lifecycle\n\tif rl == nil {\n\t\treturn l\n\t}\n\tfor _, rr := range rl.Rule {\n\t\tr := LifecycleRule{\n\t\t\tAction: LifecycleAction{\n\t\t\t\tType:         rr.Action.Type,\n\t\t\t\tStorageClass: rr.Action.StorageClass,\n\t\t\t},\n\t\t\tCondition: LifecycleCondition{\n\t\t\t\tDaysSinceCustomTime:     rr.Condition.DaysSinceCustomTime,\n\t\t\t\tDaysSinceNoncurrentTime: rr.Condition.DaysSinceNoncurrentTime,\n\t\t\t\tMatchesPrefix:           rr.Condition.MatchesPrefix,\n\t\t\t\tMatchesStorageClasses:   rr.Condition.MatchesStorageClass,\n\t\t\t\tMatchesSuffix:           rr.Condition.MatchesSuffix,\n\t\t\t\tNumNewerVersions:        rr.Condition.NumNewerVersions,\n\t\t\t},\n\t\t}\n\t\tif rr.Condition.Age != nil {\n\t\t\tr.Condition.AgeInDays = *rr.Condition.Age\n\t\t\tif *rr.Condition.Age == 0 {\n\t\t\t\tr.Condition.AllObjects = true\n\t\t\t}\n\t\t}\n\n\t\tif rr.Condition.IsLive == nil {\n\t\t\tr.Condition.Liveness = LiveAndArchived\n\t\t} else if *rr.Condition.IsLive {\n\t\t\tr.Condition.Liveness = Live\n\t\t} else {\n\t\t\tr.Condition.Liveness = Archived\n\t\t}\n\n\t\tif rr.Condition.CreatedBefore != \"\" {\n\t\t\tr.Condition.CreatedBefore, _ = time.Parse(rfc3339Date, rr.Condition.CreatedBefore)\n\t\t}\n\t\tif rr.Condition.CustomTimeBefore != \"\" {\n\t\t\tr.Condition.CustomTimeBefore, _ = time.Parse(rfc3339Date, rr.Condition.CustomTimeBefore)\n\t\t}\n\t\tif rr.Condition.NoncurrentTimeBefore != \"\" {\n\t\t\tr.Condition.NoncurrentTimeBefore, _ = time.Parse(rfc3339Date, rr.Condition.NoncurrentTimeBefore)\n\t\t}\n\t\tl.Rules = append(l.Rules, r)\n\t}\n\treturn l\n}\n\nfunc toLifecycleFromProto(rl *storagepb.Bucket_Lifecycle) Lifecycle {\n\tvar l Lifecycle\n\tif rl == nil {\n\t\treturn l\n\t}\n\tfor _, rr := range rl.GetRule() {\n\t\tr := LifecycleRule{\n\t\t\tAction: LifecycleAction{\n\t\t\t\tType:         rr.GetAction().GetType(),\n\t\t\t\tStorageClass: rr.GetAction().GetStorageClass(),\n\t\t\t},\n\t\t\tCondition: LifecycleCondition{\n\t\t\t\tAgeInDays:               int64(rr.GetCondition().GetAgeDays()),\n\t\t\t\tDaysSinceCustomTime:     int64(rr.GetCondition().GetDaysSinceCustomTime()),\n\t\t\t\tDaysSinceNoncurrentTime: int64(rr.GetCondition().GetDaysSinceNoncurrentTime()),\n\t\t\t\tMatchesPrefix:           rr.GetCondition().GetMatchesPrefix(),\n\t\t\t\tMatchesStorageClasses:   rr.GetCondition().GetMatchesStorageClass(),\n\t\t\t\tMatchesSuffix:           rr.GetCondition().GetMatchesSuffix(),\n\t\t\t\tNumNewerVersions:        int64(rr.GetCondition().GetNumNewerVersions()),\n\t\t\t},\n\t\t}\n\n\t\t// Only set Condition.AllObjects if AgeDays is zero, not if it is nil.\n\t\tif rr.GetCondition().AgeDays != nil && rr.GetCondition().GetAgeDays() == 0 {\n\t\t\tr.Condition.AllObjects = true\n\t\t}\n\n\t\tif rr.GetCondition().IsLive == nil {\n\t\t\tr.Condition.Liveness = LiveAndArchived\n\t\t} else if rr.GetCondition().GetIsLive() {\n\t\t\tr.Condition.Liveness = Live\n\t\t} else {\n\t\t\tr.Condition.Liveness = Archived\n\t\t}\n\n\t\tif rr.GetCondition().GetCreatedBefore() != nil {\n\t\t\tr.Condition.CreatedBefore = protoDateToUTCTime(rr.GetCondition().GetCreatedBefore())\n\t\t}\n\t\tif rr.GetCondition().GetCustomTimeBefore() != nil {\n\t\t\tr.Condition.CustomTimeBefore = protoDateToUTCTime(rr.GetCondition().GetCustomTimeBefore())\n\t\t}\n\t\tif rr.GetCondition().GetNoncurrentTimeBefore() != nil {\n\t\t\tr.Condition.NoncurrentTimeBefore = protoDateToUTCTime(rr.GetCondition().GetNoncurrentTimeBefore())\n\t\t}\n\t\tl.Rules = append(l.Rules, r)\n\t}\n\treturn l\n}\n\nfunc (e *BucketEncryption) toRawBucketEncryption() *raw.BucketEncryption {\n\tif e == nil {\n\t\treturn nil\n\t}\n\treturn &raw.BucketEncryption{\n\t\tDefaultKmsKeyName: e.DefaultKMSKeyName,\n\t}\n}\n\nfunc (e *BucketEncryption) toProtoBucketEncryption() *storagepb.Bucket_Encryption {\n\tif e == nil {\n\t\treturn nil\n\t}\n\treturn &storagepb.Bucket_Encryption{\n\t\tDefaultKmsKey: e.DefaultKMSKeyName,\n\t}\n}\n\nfunc toBucketEncryption(e *raw.BucketEncryption) *BucketEncryption {\n\tif e == nil {\n\t\treturn nil\n\t}\n\treturn &BucketEncryption{DefaultKMSKeyName: e.DefaultKmsKeyName}\n}\n\nfunc toBucketEncryptionFromProto(e *storagepb.Bucket_Encryption) *BucketEncryption {\n\tif e == nil {\n\t\treturn nil\n\t}\n\treturn &BucketEncryption{DefaultKMSKeyName: e.GetDefaultKmsKey()}\n}\n\nfunc (b *BucketLogging) toRawBucketLogging() *raw.BucketLogging {\n\tif b == nil {\n\t\treturn nil\n\t}\n\treturn &raw.BucketLogging{\n\t\tLogBucket:       b.LogBucket,\n\t\tLogObjectPrefix: b.LogObjectPrefix,\n\t}\n}\n\nfunc (b *BucketLogging) toProtoBucketLogging() *storagepb.Bucket_Logging {\n\tif b == nil {\n\t\treturn nil\n\t}\n\treturn &storagepb.Bucket_Logging{\n\t\tLogBucket:       bucketResourceName(globalProjectAlias, b.LogBucket),\n\t\tLogObjectPrefix: b.LogObjectPrefix,\n\t}\n}\n\nfunc toBucketLogging(b *raw.BucketLogging) *BucketLogging {\n\tif b == nil {\n\t\treturn nil\n\t}\n\treturn &BucketLogging{\n\t\tLogBucket:       b.LogBucket,\n\t\tLogObjectPrefix: b.LogObjectPrefix,\n\t}\n}\n\nfunc toBucketLoggingFromProto(b *storagepb.Bucket_Logging) *BucketLogging {\n\tif b == nil {\n\t\treturn nil\n\t}\n\tlb := parseBucketName(b.GetLogBucket())\n\treturn &BucketLogging{\n\t\tLogBucket:       lb,\n\t\tLogObjectPrefix: b.GetLogObjectPrefix(),\n\t}\n}\n\nfunc (w *BucketWebsite) toRawBucketWebsite() *raw.BucketWebsite {\n\tif w == nil {\n\t\treturn nil\n\t}\n\treturn &raw.BucketWebsite{\n\t\tMainPageSuffix: w.MainPageSuffix,\n\t\tNotFoundPage:   w.NotFoundPage,\n\t}\n}\n\nfunc (w *BucketWebsite) toProtoBucketWebsite() *storagepb.Bucket_Website {\n\tif w == nil {\n\t\treturn nil\n\t}\n\treturn &storagepb.Bucket_Website{\n\t\tMainPageSuffix: w.MainPageSuffix,\n\t\tNotFoundPage:   w.NotFoundPage,\n\t}\n}\n\nfunc toBucketWebsite(w *raw.BucketWebsite) *BucketWebsite {\n\tif w == nil {\n\t\treturn nil\n\t}\n\treturn &BucketWebsite{\n\t\tMainPageSuffix: w.MainPageSuffix,\n\t\tNotFoundPage:   w.NotFoundPage,\n\t}\n}\n\nfunc toBucketWebsiteFromProto(w *storagepb.Bucket_Website) *BucketWebsite {\n\tif w == nil {\n\t\treturn nil\n\t}\n\treturn &BucketWebsite{\n\t\tMainPageSuffix: w.GetMainPageSuffix(),\n\t\tNotFoundPage:   w.GetNotFoundPage(),\n\t}\n}\n\nfunc toBucketPolicyOnly(b *raw.BucketIamConfiguration) BucketPolicyOnly {\n\tif b == nil || b.BucketPolicyOnly == nil || !b.BucketPolicyOnly.Enabled {\n\t\treturn BucketPolicyOnly{}\n\t}\n\tlt, err := time.Parse(time.RFC3339, b.BucketPolicyOnly.LockedTime)\n\tif err != nil {\n\t\treturn BucketPolicyOnly{\n\t\t\tEnabled: true,\n\t\t}\n\t}\n\treturn BucketPolicyOnly{\n\t\tEnabled:    true,\n\t\tLockedTime: lt,\n\t}\n}\n\nfunc toBucketPolicyOnlyFromProto(b *storagepb.Bucket_IamConfig) BucketPolicyOnly {\n\tif b == nil || !b.GetUniformBucketLevelAccess().GetEnabled() {\n\t\treturn BucketPolicyOnly{}\n\t}\n\treturn BucketPolicyOnly{\n\t\tEnabled:    true,\n\t\tLockedTime: b.GetUniformBucketLevelAccess().GetLockTime().AsTime(),\n\t}\n}\n\nfunc toUniformBucketLevelAccess(b *raw.BucketIamConfiguration) UniformBucketLevelAccess {\n\tif b == nil || b.UniformBucketLevelAccess == nil || !b.UniformBucketLevelAccess.Enabled {\n\t\treturn UniformBucketLevelAccess{}\n\t}\n\tlt, err := time.Parse(time.RFC3339, b.UniformBucketLevelAccess.LockedTime)\n\tif err != nil {\n\t\treturn UniformBucketLevelAccess{\n\t\t\tEnabled: true,\n\t\t}\n\t}\n\treturn UniformBucketLevelAccess{\n\t\tEnabled:    true,\n\t\tLockedTime: lt,\n\t}\n}\n\nfunc toUniformBucketLevelAccessFromProto(b *storagepb.Bucket_IamConfig) UniformBucketLevelAccess {\n\tif b == nil || !b.GetUniformBucketLevelAccess().GetEnabled() {\n\t\treturn UniformBucketLevelAccess{}\n\t}\n\treturn UniformBucketLevelAccess{\n\t\tEnabled:    true,\n\t\tLockedTime: b.GetUniformBucketLevelAccess().GetLockTime().AsTime(),\n\t}\n}\n\nfunc toPublicAccessPrevention(b *raw.BucketIamConfiguration) PublicAccessPrevention {\n\tif b == nil {\n\t\treturn PublicAccessPreventionUnknown\n\t}\n\tswitch b.PublicAccessPrevention {\n\tcase publicAccessPreventionInherited, publicAccessPreventionUnspecified:\n\t\treturn PublicAccessPreventionInherited\n\tcase publicAccessPreventionEnforced:\n\t\treturn PublicAccessPreventionEnforced\n\tdefault:\n\t\treturn PublicAccessPreventionUnknown\n\t}\n}\n\nfunc toPublicAccessPreventionFromProto(b *storagepb.Bucket_IamConfig) PublicAccessPrevention {\n\tif b == nil {\n\t\treturn PublicAccessPreventionUnknown\n\t}\n\tswitch b.GetPublicAccessPrevention() {\n\tcase publicAccessPreventionInherited, publicAccessPreventionUnspecified:\n\t\treturn PublicAccessPreventionInherited\n\tcase publicAccessPreventionEnforced:\n\t\treturn PublicAccessPreventionEnforced\n\tdefault:\n\t\treturn PublicAccessPreventionUnknown\n\t}\n}\n\nfunc toRPO(b *raw.Bucket) RPO {\n\tif b == nil {\n\t\treturn RPOUnknown\n\t}\n\tswitch b.Rpo {\n\tcase rpoDefault:\n\t\treturn RPODefault\n\tcase rpoAsyncTurbo:\n\t\treturn RPOAsyncTurbo\n\tdefault:\n\t\treturn RPOUnknown\n\t}\n}\n\nfunc toRPOFromProto(b *storagepb.Bucket) RPO {\n\tif b == nil {\n\t\treturn RPOUnknown\n\t}\n\tswitch b.GetRpo() {\n\tcase rpoDefault:\n\t\treturn RPODefault\n\tcase rpoAsyncTurbo:\n\t\treturn RPOAsyncTurbo\n\tdefault:\n\t\treturn RPOUnknown\n\t}\n}\n\nfunc customPlacementFromRaw(c *raw.BucketCustomPlacementConfig) *CustomPlacementConfig {\n\tif c == nil {\n\t\treturn nil\n\t}\n\treturn &CustomPlacementConfig{DataLocations: c.DataLocations}\n}\n\nfunc (c *CustomPlacementConfig) toRawCustomPlacement() *raw.BucketCustomPlacementConfig {\n\tif c == nil {\n\t\treturn nil\n\t}\n\treturn &raw.BucketCustomPlacementConfig{\n\t\tDataLocations: c.DataLocations,\n\t}\n}\n\nfunc (c *CustomPlacementConfig) toProtoCustomPlacement() *storagepb.Bucket_CustomPlacementConfig {\n\tif c == nil {\n\t\treturn nil\n\t}\n\treturn &storagepb.Bucket_CustomPlacementConfig{\n\t\tDataLocations: c.DataLocations,\n\t}\n}\n\nfunc customPlacementFromProto(c *storagepb.Bucket_CustomPlacementConfig) *CustomPlacementConfig {\n\tif c == nil {\n\t\treturn nil\n\t}\n\treturn &CustomPlacementConfig{DataLocations: c.GetDataLocations()}\n}\n\nfunc (a *Autoclass) toRawAutoclass() *raw.BucketAutoclass {\n\tif a == nil {\n\t\treturn nil\n\t}\n\t// Excluding read only fields ToggleTime and TerminalStorageClassUpdateTime.\n\treturn &raw.BucketAutoclass{\n\t\tEnabled:              a.Enabled,\n\t\tTerminalStorageClass: a.TerminalStorageClass,\n\t}\n}\n\nfunc (a *Autoclass) toProtoAutoclass() *storagepb.Bucket_Autoclass {\n\tif a == nil {\n\t\treturn nil\n\t}\n\t// Excluding read only fields ToggleTime and TerminalStorageClassUpdateTime.\n\tba := &storagepb.Bucket_Autoclass{\n\t\tEnabled: a.Enabled,\n\t}\n\tif a.TerminalStorageClass != \"\" {\n\t\tba.TerminalStorageClass = &a.TerminalStorageClass\n\t}\n\treturn ba\n}\n\nfunc toAutoclassFromRaw(a *raw.BucketAutoclass) *Autoclass {\n\tif a == nil || a.ToggleTime == \"\" {\n\t\treturn nil\n\t}\n\tac := &Autoclass{\n\t\tEnabled:              a.Enabled,\n\t\tTerminalStorageClass: a.TerminalStorageClass,\n\t}\n\t// Return ToggleTime and TSCUpdateTime only if parsed with valid values.\n\tt, err := time.Parse(time.RFC3339, a.ToggleTime)\n\tif err == nil {\n\t\tac.ToggleTime = t\n\t}\n\tut, err := time.Parse(time.RFC3339, a.TerminalStorageClassUpdateTime)\n\tif err == nil {\n\t\tac.TerminalStorageClassUpdateTime = ut\n\t}\n\treturn ac\n}\n\nfunc toAutoclassFromProto(a *storagepb.Bucket_Autoclass) *Autoclass {\n\tif a == nil || a.GetToggleTime().AsTime().Unix() == 0 {\n\t\treturn nil\n\t}\n\treturn &Autoclass{\n\t\tEnabled:                        a.GetEnabled(),\n\t\tToggleTime:                     a.GetToggleTime().AsTime(),\n\t\tTerminalStorageClass:           a.GetTerminalStorageClass(),\n\t\tTerminalStorageClassUpdateTime: a.GetTerminalStorageClassUpdateTime().AsTime(),\n\t}\n}\n\nfunc (p *SoftDeletePolicy) toRawSoftDeletePolicy() *raw.BucketSoftDeletePolicy {\n\tif p == nil {\n\t\treturn nil\n\t}\n\t// Excluding read only field EffectiveTime.\n\t// ForceSendFields must be set to send a zero value for RetentionDuration and disable\n\t// soft delete.\n\treturn &raw.BucketSoftDeletePolicy{\n\t\tRetentionDurationSeconds: int64(p.RetentionDuration.Seconds()),\n\t\tForceSendFields:          []string{\"RetentionDurationSeconds\"},\n\t}\n}\n\nfunc (p *SoftDeletePolicy) toProtoSoftDeletePolicy() *storagepb.Bucket_SoftDeletePolicy {\n\tif p == nil {\n\t\treturn nil\n\t}\n\t// Excluding read only field EffectiveTime.\n\treturn &storagepb.Bucket_SoftDeletePolicy{\n\t\tRetentionDuration: durationpb.New(p.RetentionDuration),\n\t}\n}\n\nfunc toSoftDeletePolicyFromRaw(p *raw.BucketSoftDeletePolicy) *SoftDeletePolicy {\n\tif p == nil {\n\t\treturn nil\n\t}\n\n\tpolicy := &SoftDeletePolicy{\n\t\tRetentionDuration: time.Duration(p.RetentionDurationSeconds) * time.Second,\n\t}\n\n\t// Return EffectiveTime only if parsed to a valid value.\n\tif t, err := time.Parse(time.RFC3339, p.EffectiveTime); err == nil {\n\t\tpolicy.EffectiveTime = t\n\t}\n\n\treturn policy\n}\n\nfunc toSoftDeletePolicyFromProto(p *storagepb.Bucket_SoftDeletePolicy) *SoftDeletePolicy {\n\tif p == nil {\n\t\treturn nil\n\t}\n\treturn &SoftDeletePolicy{\n\t\tEffectiveTime:     p.GetEffectiveTime().AsTime(),\n\t\tRetentionDuration: p.GetRetentionDuration().AsDuration(),\n\t}\n}\n\nfunc (hns *HierarchicalNamespace) toProtoHierarchicalNamespace() *storagepb.Bucket_HierarchicalNamespace {\n\tif hns == nil {\n\t\treturn nil\n\t}\n\treturn &storagepb.Bucket_HierarchicalNamespace{\n\t\tEnabled: hns.Enabled,\n\t}\n}\n\nfunc (hns *HierarchicalNamespace) toRawHierarchicalNamespace() *raw.BucketHierarchicalNamespace {\n\tif hns == nil {\n\t\treturn nil\n\t}\n\treturn &raw.BucketHierarchicalNamespace{\n\t\tEnabled: hns.Enabled,\n\t}\n}\n\nfunc toHierarchicalNamespaceFromProto(p *storagepb.Bucket_HierarchicalNamespace) *HierarchicalNamespace {\n\tif p == nil {\n\t\treturn nil\n\t}\n\treturn &HierarchicalNamespace{\n\t\tEnabled: p.Enabled,\n\t}\n}\n\nfunc toHierarchicalNamespaceFromRaw(r *raw.BucketHierarchicalNamespace) *HierarchicalNamespace {\n\tif r == nil {\n\t\treturn nil\n\t}\n\treturn &HierarchicalNamespace{\n\t\tEnabled: r.Enabled,\n\t}\n}\n\nfunc ownerEntityFromRaw(r *raw.BucketOwner) string {\n\tif r == nil {\n\t\treturn \"\"\n\t}\n\treturn r.Entity\n}\n\nfunc ownerEntityFromProto(p *storagepb.Owner) string {\n\tif p == nil {\n\t\treturn \"\"\n\t}\n\treturn p.GetEntity()\n}\n\n// Objects returns an iterator over the objects in the bucket that match the\n// Query q. If q is nil, no filtering is done. Objects will be iterated over\n// lexicographically by name.\n//\n// Note: The returned iterator is not safe for concurrent operations without explicit synchronization.\nfunc (b *BucketHandle) Objects(ctx context.Context, q *Query) *ObjectIterator {\n\to := makeStorageOpts(true, b.retry, b.userProject)\n\treturn b.c.tc.ListObjects(ctx, b.name, q, o...)\n}\n\n// Retryer returns a bucket handle that is configured with custom retry\n// behavior as specified by the options that are passed to it. All operations\n// on the new handle will use the customized retry configuration.\n// Retry options set on a object handle will take precedence over options set on\n// the bucket handle.\n// These retry options will merge with the client's retry configuration (if set)\n// for the returned handle. Options passed into this method will take precedence\n// over retry options on the client. Note that you must explicitly pass in each\n// option you want to override.\nfunc (b *BucketHandle) Retryer(opts ...RetryOption) *BucketHandle {\n\tb2 := *b\n\tvar retry *retryConfig\n\tif b.retry != nil {\n\t\t// merge the options with the existing retry\n\t\tretry = b.retry\n\t} else {\n\t\tretry = &retryConfig{}\n\t}\n\tfor _, opt := range opts {\n\t\topt.apply(retry)\n\t}\n\tb2.retry = retry\n\tb2.acl.retry = retry\n\tb2.defaultObjectACL.retry = retry\n\treturn &b2\n}\n\n// An ObjectIterator is an iterator over ObjectAttrs.\n//\n// Note: This iterator is not safe for concurrent operations without explicit synchronization.\ntype ObjectIterator struct {\n\tctx      context.Context\n\tquery    Query\n\tpageInfo *iterator.PageInfo\n\tnextFunc func() error\n\titems    []*ObjectAttrs\n}\n\n// PageInfo supports pagination. See the google.golang.org/api/iterator package for details.\n//\n// Note: This method is not safe for concurrent operations without explicit synchronization.\nfunc (it *ObjectIterator) PageInfo() *iterator.PageInfo { return it.pageInfo }\n\n// Next returns the next result. Its second return value is iterator.Done if\n// there are no more results. Once Next returns iterator.Done, all subsequent\n// calls will return iterator.Done.\n//\n// In addition, if Next returns an error other than iterator.Done, all\n// subsequent calls will return the same error. To continue iteration, a new\n// `ObjectIterator` must be created. Since objects are ordered lexicographically\n// by name, `Query.StartOffset` can be used to create a new iterator which will\n// start at the desired place. See\n// https://pkg.go.dev/cloud.google.com/go/storage?tab=doc#hdr-Listing_objects.\n//\n// If Query.Delimiter is non-empty, some of the ObjectAttrs returned by Next will\n// have a non-empty Prefix field, and a zero value for all other fields. These\n// represent prefixes.\n//\n// Note: This method is not safe for concurrent operations without explicit synchronization.\nfunc (it *ObjectIterator) Next() (*ObjectAttrs, error) {\n\tif err := it.nextFunc(); err != nil {\n\t\treturn nil, err\n\t}\n\titem := it.items[0]\n\tit.items = it.items[1:]\n\treturn item, nil\n}\n\n// Buckets returns an iterator over the buckets in the project. You may\n// optionally set the iterator's Prefix field to restrict the list to buckets\n// whose names begin with the prefix. By default, all buckets in the project\n// are returned.\n//\n// Note: The returned iterator is not safe for concurrent operations without explicit synchronization.\nfunc (c *Client) Buckets(ctx context.Context, projectID string) *BucketIterator {\n\to := makeStorageOpts(true, c.retry, \"\")\n\treturn c.tc.ListBuckets(ctx, projectID, o...)\n}\n\n// A BucketIterator is an iterator over BucketAttrs.\n//\n// Note: This iterator is not safe for concurrent operations without explicit synchronization.\ntype BucketIterator struct {\n\t// Prefix restricts the iterator to buckets whose names begin with it.\n\tPrefix string\n\n\tctx       context.Context\n\tprojectID string\n\tbuckets   []*BucketAttrs\n\tpageInfo  *iterator.PageInfo\n\tnextFunc  func() error\n}\n\n// Next returns the next result. Its second return value is iterator.Done if\n// there are no more results. Once Next returns iterator.Done, all subsequent\n// calls will return iterator.Done.\n//\n// Note: This method is not safe for concurrent operations without explicit synchronization.\nfunc (it *BucketIterator) Next() (*BucketAttrs, error) {\n\tif err := it.nextFunc(); err != nil {\n\t\treturn nil, err\n\t}\n\tb := it.buckets[0]\n\tit.buckets = it.buckets[1:]\n\treturn b, nil\n}\n\n// PageInfo supports pagination. See the google.golang.org/api/iterator package for details.\n//\n// Note: This method is not safe for concurrent operations without explicit synchronization.\nfunc (it *BucketIterator) PageInfo() *iterator.PageInfo { return it.pageInfo }\n\n// RPO (Recovery Point Objective) configures the turbo replication feature. See\n// https://cloud.google.com/storage/docs/managing-turbo-replication for more information.\ntype RPO int\n\nconst (\n\t// RPOUnknown is a zero value. It may be returned from bucket.Attrs() if RPO\n\t// is not present in the bucket metadata, that is, the bucket is not dual-region.\n\t// This value is also used if the RPO field is not set in a call to GCS.\n\tRPOUnknown RPO = iota\n\n\t// RPODefault represents default replication. It is used to reset RPO on an\n\t// existing bucket  that has this field set to RPOAsyncTurbo. Otherwise it\n\t// is equivalent to RPOUnknown, and is always ignored. This value is valid\n\t// for dual- or multi-region buckets.\n\tRPODefault\n\n\t// RPOAsyncTurbo represents turbo replication and is used to enable Turbo\n\t// Replication on a bucket. This value is only valid for dual-region buckets.\n\tRPOAsyncTurbo\n\n\trpoUnknown    string = \"\"\n\trpoDefault           = \"DEFAULT\"\n\trpoAsyncTurbo        = \"ASYNC_TURBO\"\n)\n\nfunc (rpo RPO) String() string {\n\tswitch rpo {\n\tcase RPODefault:\n\t\treturn rpoDefault\n\tcase RPOAsyncTurbo:\n\t\treturn rpoAsyncTurbo\n\tdefault:\n\t\treturn rpoUnknown\n\t}\n}\n\n// protoDateToUTCTime returns a new Time based on the google.type.Date, in UTC.\n//\n// Hours, minutes, seconds, and nanoseconds are set to 0.\nfunc protoDateToUTCTime(d *dpb.Date) time.Time {\n\treturn protoDateToTime(d, time.UTC)\n}\n\n// protoDateToTime returns a new Time based on the google.type.Date and provided\n// *time.Location.\n//\n// Hours, minutes, seconds, and nanoseconds are set to 0.\nfunc protoDateToTime(d *dpb.Date, l *time.Location) time.Time {\n\treturn time.Date(int(d.GetYear()), time.Month(d.GetMonth()), int(d.GetDay()), 0, 0, 0, 0, l)\n}\n\n// timeToProtoDate returns a new google.type.Date based on the provided time.Time.\n// The location is ignored, as is anything more precise than the day.\nfunc timeToProtoDate(t time.Time) *dpb.Date {\n\treturn &dpb.Date{\n\t\tYear:  int32(t.Year()),\n\t\tMonth: int32(t.Month()),\n\t\tDay:   int32(t.Day()),\n\t}\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/client.go",
    "content": "// Copyright 2022 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"time\"\n\n\t\"cloud.google.com/go/iam/apiv1/iampb\"\n\tgax \"github.com/googleapis/gax-go/v2\"\n\t\"google.golang.org/api/option\"\n)\n\n// TODO(noahdietz): Move existing factory methods to this file.\n\n// storageClient is an internal-only interface designed to separate the\n// transport-specific logic of making Storage API calls from the logic of the\n// client library.\n//\n// Implementation requirements beyond implementing the interface include:\n// * factory method(s) must accept a `userProject string` param\n// * `settings` must be retained per instance\n// * `storageOption`s must be resolved in the order they are received\n// * all API errors must be wrapped in the gax-go APIError type\n// * any unimplemented interface methods must return a StorageUnimplementedErr\n//\n// TODO(noahdietz): This interface is currently not used in the production code\n// paths\ntype storageClient interface {\n\n\t// Top-level methods.\n\n\tGetServiceAccount(ctx context.Context, project string, opts ...storageOption) (string, error)\n\tCreateBucket(ctx context.Context, project, bucket string, attrs *BucketAttrs, enableObjectRetention *bool, opts ...storageOption) (*BucketAttrs, error)\n\tListBuckets(ctx context.Context, project string, opts ...storageOption) *BucketIterator\n\tClose() error\n\n\t// Bucket methods.\n\n\tDeleteBucket(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) error\n\tGetBucket(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) (*BucketAttrs, error)\n\tUpdateBucket(ctx context.Context, bucket string, uattrs *BucketAttrsToUpdate, conds *BucketConditions, opts ...storageOption) (*BucketAttrs, error)\n\tLockBucketRetentionPolicy(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) error\n\tListObjects(ctx context.Context, bucket string, q *Query, opts ...storageOption) *ObjectIterator\n\n\t// Object metadata methods.\n\n\tDeleteObject(ctx context.Context, bucket, object string, gen int64, conds *Conditions, opts ...storageOption) error\n\tGetObject(ctx context.Context, params *getObjectParams, opts ...storageOption) (*ObjectAttrs, error)\n\tUpdateObject(ctx context.Context, params *updateObjectParams, opts ...storageOption) (*ObjectAttrs, error)\n\tRestoreObject(ctx context.Context, params *restoreObjectParams, opts ...storageOption) (*ObjectAttrs, error)\n\tMoveObject(ctx context.Context, params *moveObjectParams, opts ...storageOption) (*ObjectAttrs, error)\n\n\t// Default Object ACL methods.\n\n\tDeleteDefaultObjectACL(ctx context.Context, bucket string, entity ACLEntity, opts ...storageOption) error\n\tListDefaultObjectACLs(ctx context.Context, bucket string, opts ...storageOption) ([]ACLRule, error)\n\tUpdateDefaultObjectACL(ctx context.Context, bucket string, entity ACLEntity, role ACLRole, opts ...storageOption) error\n\n\t// Bucket ACL methods.\n\n\tDeleteBucketACL(ctx context.Context, bucket string, entity ACLEntity, opts ...storageOption) error\n\tListBucketACLs(ctx context.Context, bucket string, opts ...storageOption) ([]ACLRule, error)\n\tUpdateBucketACL(ctx context.Context, bucket string, entity ACLEntity, role ACLRole, opts ...storageOption) error\n\n\t// Object ACL methods.\n\n\tDeleteObjectACL(ctx context.Context, bucket, object string, entity ACLEntity, opts ...storageOption) error\n\tListObjectACLs(ctx context.Context, bucket, object string, opts ...storageOption) ([]ACLRule, error)\n\tUpdateObjectACL(ctx context.Context, bucket, object string, entity ACLEntity, role ACLRole, opts ...storageOption) error\n\n\t// Media operations.\n\n\tComposeObject(ctx context.Context, req *composeObjectRequest, opts ...storageOption) (*ObjectAttrs, error)\n\tRewriteObject(ctx context.Context, req *rewriteObjectRequest, opts ...storageOption) (*rewriteObjectResponse, error)\n\n\tNewRangeReader(ctx context.Context, params *newRangeReaderParams, opts ...storageOption) (*Reader, error)\n\tOpenWriter(params *openWriterParams, opts ...storageOption) (*io.PipeWriter, error)\n\n\t// IAM methods.\n\n\tGetIamPolicy(ctx context.Context, resource string, version int32, opts ...storageOption) (*iampb.Policy, error)\n\tSetIamPolicy(ctx context.Context, resource string, policy *iampb.Policy, opts ...storageOption) error\n\tTestIamPermissions(ctx context.Context, resource string, permissions []string, opts ...storageOption) ([]string, error)\n\n\t// HMAC Key methods.\n\n\tGetHMACKey(ctx context.Context, project, accessID string, opts ...storageOption) (*HMACKey, error)\n\tListHMACKeys(ctx context.Context, project, serviceAccountEmail string, showDeletedKeys bool, opts ...storageOption) *HMACKeysIterator\n\tUpdateHMACKey(ctx context.Context, project, serviceAccountEmail, accessID string, attrs *HMACKeyAttrsToUpdate, opts ...storageOption) (*HMACKey, error)\n\tCreateHMACKey(ctx context.Context, project, serviceAccountEmail string, opts ...storageOption) (*HMACKey, error)\n\tDeleteHMACKey(ctx context.Context, project, accessID string, opts ...storageOption) error\n\n\t// Notification methods.\n\tListNotifications(ctx context.Context, bucket string, opts ...storageOption) (map[string]*Notification, error)\n\tCreateNotification(ctx context.Context, bucket string, n *Notification, opts ...storageOption) (*Notification, error)\n\tDeleteNotification(ctx context.Context, bucket string, id string, opts ...storageOption) error\n\n\tNewMultiRangeDownloader(ctx context.Context, params *newMultiRangeDownloaderParams, opts ...storageOption) (*MultiRangeDownloader, error)\n}\n\n// settings contains transport-agnostic configuration for API calls made via\n// the storageClient inteface. All implementations must utilize settings\n// and respect those that are applicable.\ntype settings struct {\n\t// retry is the complete retry configuration to use when evaluating if an\n\t// API call should be retried.\n\tretry *retryConfig\n\n\t// gax is a set of gax.CallOption to be conveyed to gax.Invoke.\n\t// Note: Not all storageClient interfaces will must use gax.Invoke.\n\tgax []gax.CallOption\n\n\t// idempotent indicates if the call is idempotent or not when considering\n\t// if the call should be retried or not.\n\tidempotent bool\n\n\t// clientOption is a set of option.ClientOption to be used during client\n\t// transport initialization. See https://pkg.go.dev/google.golang.org/api/option\n\t// for a list of supported options.\n\tclientOption []option.ClientOption\n\n\t// userProject is the user project that should be billed for the request.\n\tuserProject string\n\n\tmetricsContext *metricsContext\n}\n\nfunc initSettings(opts ...storageOption) *settings {\n\ts := &settings{}\n\tresolveOptions(s, opts...)\n\treturn s\n}\n\nfunc resolveOptions(s *settings, opts ...storageOption) {\n\tfor _, o := range opts {\n\t\to.Apply(s)\n\t}\n}\n\n// callSettings is a helper for resolving storage options against the settings\n// in the context of an individual call. This is to ensure that client-level\n// default settings are not mutated by two different calls getting options.\n//\n// Example: s := callSettings(c.settings, opts...)\nfunc callSettings(defaults *settings, opts ...storageOption) *settings {\n\tif defaults == nil {\n\t\treturn nil\n\t}\n\t// This does not make a deep copy of the pointer/slice fields, but all\n\t// options replace the settings fields rather than modify their values in\n\t// place.\n\tcs := *defaults\n\tresolveOptions(&cs, opts...)\n\treturn &cs\n}\n\n// makeStorageOpts is a helper for generating a set of storageOption based on\n// idempotency, retryConfig, and userProject. All top-level client operations\n// will generally have to pass these options through the interface.\nfunc makeStorageOpts(isIdempotent bool, retry *retryConfig, userProject string) []storageOption {\n\topts := []storageOption{idempotent(isIdempotent)}\n\tif retry != nil {\n\t\topts = append(opts, withRetryConfig(retry))\n\t}\n\tif userProject != \"\" {\n\t\topts = append(opts, withUserProject(userProject))\n\t}\n\treturn opts\n}\n\n// storageOption is the transport-agnostic call option for the storageClient\n// interface.\ntype storageOption interface {\n\tApply(s *settings)\n}\n\nfunc withRetryConfig(rc *retryConfig) storageOption {\n\treturn &retryOption{rc}\n}\n\ntype retryOption struct {\n\trc *retryConfig\n}\n\nfunc (o *retryOption) Apply(s *settings) { s.retry = o.rc }\n\nfunc idempotent(i bool) storageOption {\n\treturn &idempotentOption{i}\n}\n\ntype idempotentOption struct {\n\tidempotency bool\n}\n\nfunc (o *idempotentOption) Apply(s *settings) { s.idempotent = o.idempotency }\n\nfunc withClientOptions(opts ...option.ClientOption) storageOption {\n\treturn &clientOption{opts: opts}\n}\n\ntype clientOption struct {\n\topts []option.ClientOption\n}\n\nfunc (o *clientOption) Apply(s *settings) { s.clientOption = o.opts }\n\nfunc withUserProject(project string) storageOption {\n\treturn &userProjectOption{project}\n}\n\ntype userProjectOption struct {\n\tproject string\n}\n\nfunc (o *userProjectOption) Apply(s *settings) { s.userProject = o.project }\n\ntype openWriterParams struct {\n\t// Writer configuration\n\n\t// ctx is the context used by the writer routine to make all network calls\n\t// and to manage the writer routine - see `Writer.ctx`.\n\t// Required.\n\tctx context.Context\n\t// chunkSize - see `Writer.ChunkSize`.\n\t// Optional.\n\tchunkSize int\n\t// chunkRetryDeadline - see `Writer.ChunkRetryDeadline`.\n\t// Optional.\n\tchunkRetryDeadline   time.Duration\n\tchunkTransferTimeout time.Duration\n\n\t// Object/request properties\n\n\t// bucket - see `Writer.o.bucket`.\n\t// Required.\n\tbucket string\n\t// attrs - see `Writer.ObjectAttrs`.\n\t// Required.\n\tattrs *ObjectAttrs\n\t// forceEmptyContentType - Disables auto-detect of Content-Type\n\t// Optional.\n\tforceEmptyContentType bool\n\t// conds - see `Writer.o.conds`.\n\t// Optional.\n\tconds *Conditions\n\t// appendGen -- object generation to write to.\n\t// Optional; required for taking over appendable objects only\n\tappendGen int64\n\t// encryptionKey - see `Writer.o.encryptionKey`\n\t// Optional.\n\tencryptionKey []byte\n\t// sendCRC32C - see `Writer.SendCRC32C`.\n\t// Optional.\n\tsendCRC32C bool\n\t// append - Write with appendable object semantics.\n\t// Optional.\n\tappend bool\n\t// finalizeOnClose - Finalize the object when the storage.Writer is closed\n\t// successfully.\n\t// Optional.\n\tfinalizeOnClose bool\n\n\t// Writer callbacks\n\n\t// donec - see `Writer.donec`.\n\t// Required.\n\tdonec chan struct{}\n\t// setError callback for reporting errors - see `Writer.error`.\n\t// Required.\n\tsetError func(error)\n\t// progress callback for reporting upload progress - see `Writer.progress`.\n\t// Required.\n\tprogress func(int64)\n\t// setObj callback for reporting the resulting object - see `Writer.obj`.\n\t// Required.\n\tsetObj func(*ObjectAttrs)\n\t// setSize callback for updated the persisted size in Writer.obj.\n\tsetSize func(int64)\n\t// setFlush callback for providing a Flush function implementation - see `Writer.Flush`.\n\t// Required.\n\tsetFlush func(func() (int64, error))\n\t// setPipeWriter callback for reseting `Writer.pw` if needed.\n\tsetPipeWriter func(*io.PipeWriter)\n\t// setTakeoverOffset callback for returning offset to start writing from to Writer.\n\tsetTakeoverOffset func(int64)\n}\n\ntype newMultiRangeDownloaderParams struct {\n\tbucket        string\n\tconds         *Conditions\n\tencryptionKey []byte\n\tgen           int64\n\tobject        string\n\thandle        *ReadHandle\n}\n\ntype newRangeReaderParams struct {\n\tbucket         string\n\tconds          *Conditions\n\tencryptionKey  []byte\n\tgen            int64\n\tlength         int64\n\tobject         string\n\toffset         int64\n\treadCompressed bool // Use accept-encoding: gzip. Only works for HTTP currently.\n\thandle         *ReadHandle\n}\n\ntype getObjectParams struct {\n\tbucket, object string\n\tgen            int64\n\tencryptionKey  []byte\n\tconds          *Conditions\n\tsoftDeleted    bool\n}\n\ntype updateObjectParams struct {\n\tbucket, object    string\n\tuattrs            *ObjectAttrsToUpdate\n\tgen               int64\n\tencryptionKey     []byte\n\tconds             *Conditions\n\toverrideRetention *bool\n}\n\ntype restoreObjectParams struct {\n\tbucket, object string\n\tgen            int64\n\tencryptionKey  []byte\n\tconds          *Conditions\n\tcopySourceACL  bool\n}\n\ntype moveObjectParams struct {\n\tbucket, srcObject, dstObject string\n\tsrcConds                     *Conditions\n\tdstConds                     *Conditions\n\tencryptionKey                []byte\n}\n\ntype composeObjectRequest struct {\n\tdstBucket     string\n\tdstObject     destinationObject\n\tsrcs          []sourceObject\n\tpredefinedACL string\n\tsendCRC32C    bool\n}\n\ntype sourceObject struct {\n\tname          string\n\tbucket        string\n\tgen           int64\n\tconds         *Conditions\n\tencryptionKey []byte\n}\n\ntype destinationObject struct {\n\tname          string\n\tbucket        string\n\tconds         *Conditions\n\tattrs         *ObjectAttrs // attrs to set on the destination object.\n\tencryptionKey []byte\n\tkeyName       string\n}\n\ntype rewriteObjectRequest struct {\n\tsrcObject                sourceObject\n\tdstObject                destinationObject\n\tpredefinedACL            string\n\ttoken                    string\n\tmaxBytesRewrittenPerCall int64\n}\n\ntype rewriteObjectResponse struct {\n\tresource *ObjectAttrs\n\tdone     bool\n\twritten  int64\n\tsize     int64\n\ttoken    string\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/copy.go",
    "content": "// Copyright 2016 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"cloud.google.com/go/internal/trace\"\n)\n\n// CopierFrom creates a Copier that can copy src to dst.\n// You can immediately call Run on the returned Copier, or\n// you can configure it first.\n//\n// For Requester Pays buckets, the user project of dst is billed, unless it is empty,\n// in which case the user project of src is billed.\nfunc (dst *ObjectHandle) CopierFrom(src *ObjectHandle) *Copier {\n\treturn &Copier{dst: dst, src: src}\n}\n\n// A Copier copies a source object to a destination.\ntype Copier struct {\n\t// ObjectAttrs are optional attributes to set on the destination object.\n\t// Any attributes must be initialized before any calls on the Copier. Nil\n\t// or zero-valued attributes are ignored.\n\tObjectAttrs\n\n\t// RewriteToken can be set before calling Run to resume a copy\n\t// operation. After Run returns a non-nil error, RewriteToken will\n\t// have been updated to contain the value needed to resume the copy.\n\tRewriteToken string\n\n\t// ProgressFunc can be used to monitor the progress of a multi-RPC copy\n\t// operation. If ProgressFunc is not nil and copying requires multiple\n\t// calls to the underlying service (see\n\t// https://cloud.google.com/storage/docs/json_api/v1/objects/rewrite), then\n\t// ProgressFunc will be invoked after each call with the number of bytes of\n\t// content copied so far and the total size in bytes of the source object.\n\t//\n\t// ProgressFunc is intended to make upload progress available to the\n\t// application. For example, the implementation of ProgressFunc may update\n\t// a progress bar in the application's UI, or log the result of\n\t// float64(copiedBytes)/float64(totalBytes).\n\t//\n\t// ProgressFunc should return quickly without blocking.\n\tProgressFunc func(copiedBytes, totalBytes uint64)\n\n\t// The Cloud KMS key, in the form projects/P/locations/L/keyRings/R/cryptoKeys/K,\n\t// that will be used to encrypt the object. Overrides the object's KMSKeyName, if\n\t// any.\n\t//\n\t// Providing both a DestinationKMSKeyName and a customer-supplied encryption key\n\t// (via ObjectHandle.Key) on the destination object will result in an error when\n\t// Run is called.\n\tDestinationKMSKeyName string\n\n\tdst, src *ObjectHandle\n\n\t// The maximum number of bytes that will be rewritten per rewrite request.\n\t// Most callers shouldn't need to specify this parameter - it is primarily\n\t// in place to support testing. If specified the value must be an integral\n\t// multiple of 1 MiB (1048576). Also, this only applies to requests where\n\t// the source and destination span locations and/or storage classes. Finally,\n\t// this value must not change across rewrite calls else you'll get an error\n\t// that the `rewriteToken` is invalid.\n\tmaxBytesRewrittenPerCall int64\n}\n\n// Run performs the copy.\nfunc (c *Copier) Run(ctx context.Context) (attrs *ObjectAttrs, err error) {\n\tctx = trace.StartSpan(ctx, \"cloud.google.com/go/storage.Copier.Run\")\n\tdefer func() { trace.EndSpan(ctx, err) }()\n\n\tif err := c.src.validate(); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := c.dst.validate(); err != nil {\n\t\treturn nil, err\n\t}\n\tif c.DestinationKMSKeyName != \"\" && c.dst.encryptionKey != nil {\n\t\treturn nil, errors.New(\"storage: cannot use DestinationKMSKeyName with a customer-supplied encryption key\")\n\t}\n\tif c.dst.gen != defaultGen {\n\t\treturn nil, fmt.Errorf(\"storage: generation cannot be specified on copy destination, got %v\", c.dst.gen)\n\t}\n\t// Convert destination attributes to raw form, omitting the bucket.\n\t// If the bucket is included but name or content-type aren't, the service\n\t// returns a 400 with \"Required\" as the only message. Omitting the bucket\n\t// does not cause any problems.\n\treq := &rewriteObjectRequest{\n\t\tsrcObject: sourceObject{\n\t\t\tname:          c.src.object,\n\t\t\tbucket:        c.src.bucket,\n\t\t\tgen:           c.src.gen,\n\t\t\tconds:         c.src.conds,\n\t\t\tencryptionKey: c.src.encryptionKey,\n\t\t},\n\t\tdstObject: destinationObject{\n\t\t\tname:          c.dst.object,\n\t\t\tbucket:        c.dst.bucket,\n\t\t\tconds:         c.dst.conds,\n\t\t\tattrs:         &c.ObjectAttrs,\n\t\t\tencryptionKey: c.dst.encryptionKey,\n\t\t\tkeyName:       c.DestinationKMSKeyName,\n\t\t},\n\t\tpredefinedACL:            c.PredefinedACL,\n\t\ttoken:                    c.RewriteToken,\n\t\tmaxBytesRewrittenPerCall: c.maxBytesRewrittenPerCall,\n\t}\n\n\tisIdempotent := c.dst.conds != nil && (c.dst.conds.GenerationMatch != 0 || c.dst.conds.DoesNotExist)\n\tvar userProject string\n\tif c.dst.userProject != \"\" {\n\t\tuserProject = c.dst.userProject\n\t} else if c.src.userProject != \"\" {\n\t\tuserProject = c.src.userProject\n\t}\n\topts := makeStorageOpts(isIdempotent, c.dst.retry, userProject)\n\n\tfor {\n\t\tres, err := c.dst.c.tc.RewriteObject(ctx, req, opts...)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tc.RewriteToken = res.token\n\t\treq.token = res.token\n\t\tif c.ProgressFunc != nil {\n\t\t\tc.ProgressFunc(uint64(res.written), uint64(res.size))\n\t\t}\n\t\tif res.done { // Finished successfully.\n\t\t\treturn res.resource, nil\n\t\t}\n\t}\n}\n\n// ComposerFrom creates a Composer that can compose srcs into dst.\n// You can immediately call Run on the returned Composer, or you can\n// configure it first.\n//\n// The encryption key for the destination object will be used to decrypt all\n// source objects and encrypt the destination object. It is an error\n// to specify an encryption key for any of the source objects.\nfunc (dst *ObjectHandle) ComposerFrom(srcs ...*ObjectHandle) *Composer {\n\treturn &Composer{dst: dst, srcs: srcs}\n}\n\n// A Composer composes source objects into a destination object.\n//\n// For Requester Pays buckets, the user project of dst is billed.\ntype Composer struct {\n\t// ObjectAttrs are optional attributes to set on the destination object.\n\t// Any attributes must be initialized before any calls on the Composer. Nil\n\t// or zero-valued attributes are ignored.\n\tObjectAttrs\n\n\t// SendCRC specifies whether to transmit a CRC32C field. It should be set\n\t// to true in addition to setting the Composer's CRC32C field, because zero\n\t// is a valid CRC and normally a zero would not be transmitted.\n\t// If a CRC32C is sent, and the data in the destination object does not match\n\t// the checksum, the compose will be rejected.\n\tSendCRC32C bool\n\n\tdst  *ObjectHandle\n\tsrcs []*ObjectHandle\n}\n\n// Run performs the compose operation.\nfunc (c *Composer) Run(ctx context.Context) (attrs *ObjectAttrs, err error) {\n\tctx = trace.StartSpan(ctx, \"cloud.google.com/go/storage.Composer.Run\")\n\tdefer func() { trace.EndSpan(ctx, err) }()\n\n\tif err := c.dst.validate(); err != nil {\n\t\treturn nil, err\n\t}\n\tif c.dst.gen != defaultGen {\n\t\treturn nil, fmt.Errorf(\"storage: generation cannot be specified on compose destination, got %v\", c.dst.gen)\n\t}\n\tif len(c.srcs) == 0 {\n\t\treturn nil, errors.New(\"storage: at least one source object must be specified\")\n\t}\n\n\tfor _, src := range c.srcs {\n\t\tif err := src.validate(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif src.bucket != c.dst.bucket {\n\t\t\treturn nil, fmt.Errorf(\"storage: all source objects must be in bucket %q, found %q\", c.dst.bucket, src.bucket)\n\t\t}\n\t\tif src.encryptionKey != nil {\n\t\t\treturn nil, fmt.Errorf(\"storage: compose source %s.%s must not have encryption key\", src.bucket, src.object)\n\t\t}\n\t}\n\n\treq := &composeObjectRequest{\n\t\tdstBucket:     c.dst.bucket,\n\t\tpredefinedACL: c.PredefinedACL,\n\t\tsendCRC32C:    c.SendCRC32C,\n\t}\n\treq.dstObject = destinationObject{\n\t\tname:          c.dst.object,\n\t\tbucket:        c.dst.bucket,\n\t\tconds:         c.dst.conds,\n\t\tattrs:         &c.ObjectAttrs,\n\t\tencryptionKey: c.dst.encryptionKey,\n\t}\n\tfor _, src := range c.srcs {\n\t\ts := sourceObject{\n\t\t\tname:   src.object,\n\t\t\tbucket: src.bucket,\n\t\t\tgen:    src.gen,\n\t\t\tconds:  src.conds,\n\t\t}\n\t\treq.srcs = append(req.srcs, s)\n\t}\n\n\tisIdempotent := c.dst.conds != nil && (c.dst.conds.GenerationMatch != 0 || c.dst.conds.DoesNotExist)\n\topts := makeStorageOpts(isIdempotent, c.dst.retry, c.dst.userProject)\n\treturn c.dst.c.tc.ComposeObject(ctx, req, opts...)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/doc.go",
    "content": "// Copyright 2016 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/*\nPackage storage provides an easy way to work with Google Cloud Storage.\nGoogle Cloud Storage stores data in named objects, which are grouped into buckets.\n\nMore information about Google Cloud Storage is available at\nhttps://cloud.google.com/storage/docs.\n\nSee https://pkg.go.dev/cloud.google.com/go for authentication, timeouts,\nconnection pooling and similar aspects of this package.\n\n# Creating a Client\n\nTo start working with this package, create a [Client]:\n\n\tctx := context.Background()\n\tclient, err := storage.NewClient(ctx)\n\tif err != nil {\n\t    // TODO: Handle error.\n\t}\n\nThe client will use your default application credentials. Clients should be\nreused instead of created as needed. The methods of [Client] are safe for\nconcurrent use by multiple goroutines.\n\nYou may configure the client by passing in options from the [google.golang.org/api/option]\npackage. You may also use options defined in this package, such as [WithJSONReads].\n\nIf you only wish to access public data, you can create\nan unauthenticated client with\n\n\tclient, err := storage.NewClient(ctx, option.WithoutAuthentication())\n\nTo use an emulator with this library, you can set the STORAGE_EMULATOR_HOST\nenvironment variable to the address at which your emulator is running. This will\nsend requests to that address instead of to Cloud Storage. You can then create\nand use a client as usual:\n\n\t// Set STORAGE_EMULATOR_HOST environment variable.\n\terr := os.Setenv(\"STORAGE_EMULATOR_HOST\", \"localhost:9000\")\n\tif err != nil {\n\t    // TODO: Handle error.\n\t}\n\n\t// Create client as usual.\n\tclient, err := storage.NewClient(ctx)\n\tif err != nil {\n\t    // TODO: Handle error.\n\t}\n\n\t// This request is now directed to http://localhost:9000/storage/v1/b\n\t// instead of https://storage.googleapis.com/storage/v1/b\n\tif err := client.Bucket(\"my-bucket\").Create(ctx, projectID, nil); err != nil {\n\t    // TODO: Handle error.\n\t}\n\nPlease note that there is no official emulator for Cloud Storage.\n\n# Buckets\n\nA Google Cloud Storage bucket is a collection of objects. To work with a\nbucket, make a bucket handle:\n\n\tbkt := client.Bucket(bucketName)\n\nA handle is a reference to a bucket. You can have a handle even if the\nbucket doesn't exist yet. To create a bucket in Google Cloud Storage,\ncall [BucketHandle.Create]:\n\n\tif err := bkt.Create(ctx, projectID, nil); err != nil {\n\t    // TODO: Handle error.\n\t}\n\nNote that although buckets are associated with projects, bucket names are\nglobal across all projects.\n\nEach bucket has associated metadata, represented in this package by\n[BucketAttrs]. The third argument to [BucketHandle.Create] allows you to set\nthe initial [BucketAttrs] of a bucket. To retrieve a bucket's attributes, use\n[BucketHandle.Attrs]:\n\n\tattrs, err := bkt.Attrs(ctx)\n\tif err != nil {\n\t    // TODO: Handle error.\n\t}\n\tfmt.Printf(\"bucket %s, created at %s, is located in %s with storage class %s\\n\",\n\t    attrs.Name, attrs.Created, attrs.Location, attrs.StorageClass)\n\n# Objects\n\nAn object holds arbitrary data as a sequence of bytes, like a file. You\nrefer to objects using a handle, just as with buckets, but unlike buckets\nyou don't explicitly create an object. Instead, the first time you write\nto an object it will be created. You can use the standard Go [io.Reader]\nand [io.Writer] interfaces to read and write object data:\n\n\tobj := bkt.Object(\"data\")\n\t// Write something to obj.\n\t// w implements io.Writer.\n\tw := obj.NewWriter(ctx)\n\t// Write some text to obj. This will either create the object or overwrite whatever is there already.\n\tif _, err := fmt.Fprintf(w, \"This object contains text.\\n\"); err != nil {\n\t    // TODO: Handle error.\n\t}\n\t// Close, just like writing a file.\n\tif err := w.Close(); err != nil {\n\t    // TODO: Handle error.\n\t}\n\n\t// Read it back.\n\tr, err := obj.NewReader(ctx)\n\tif err != nil {\n\t    // TODO: Handle error.\n\t}\n\tdefer r.Close()\n\tif _, err := io.Copy(os.Stdout, r); err != nil {\n\t    // TODO: Handle error.\n\t}\n\t// Prints \"This object contains text.\"\n\nObjects also have attributes, which you can fetch with [ObjectHandle.Attrs]:\n\n\tobjAttrs, err := obj.Attrs(ctx)\n\tif err != nil {\n\t    // TODO: Handle error.\n\t}\n\tfmt.Printf(\"object %s has size %d and can be read using %s\\n\",\n\t    objAttrs.Name, objAttrs.Size, objAttrs.MediaLink)\n\n# Listing objects\n\nListing objects in a bucket is done with the [BucketHandle.Objects] method:\n\n\tquery := &storage.Query{Prefix: \"\"}\n\n\tvar names []string\n\tit := bkt.Objects(ctx, query)\n\tfor {\n\t    attrs, err := it.Next()\n\t    if err == iterator.Done {\n\t        break\n\t    }\n\t    if err != nil {\n\t        log.Fatal(err)\n\t    }\n\t    names = append(names, attrs.Name)\n\t}\n\nObjects are listed lexicographically by name. To filter objects\nlexicographically, [Query.StartOffset] and/or [Query.EndOffset] can be used:\n\n\tquery := &storage.Query{\n\t    Prefix: \"\",\n\t    StartOffset: \"bar/\",  // Only list objects lexicographically >= \"bar/\"\n\t    EndOffset: \"foo/\",    // Only list objects lexicographically < \"foo/\"\n\t}\n\n\t// ... as before\n\nIf only a subset of object attributes is needed when listing, specifying this\nsubset using [Query.SetAttrSelection] may speed up the listing process:\n\n\tquery := &storage.Query{Prefix: \"\"}\n\tquery.SetAttrSelection([]string{\"Name\"})\n\n\t// ... as before\n\n# ACLs\n\nBoth objects and buckets have ACLs (Access Control Lists). An ACL is a list of\nACLRules, each of which specifies the role of a user, group or project. ACLs\nare suitable for fine-grained control, but you may prefer using IAM to control\naccess at the project level (see [Cloud Storage IAM docs].\n\nTo list the ACLs of a bucket or object, obtain an [ACLHandle] and call [ACLHandle.List]:\n\n\tacls, err := obj.ACL().List(ctx)\n\tif err != nil {\n\t    // TODO: Handle error.\n\t}\n\tfor _, rule := range acls {\n\t    fmt.Printf(\"%s has role %s\\n\", rule.Entity, rule.Role)\n\t}\n\nYou can also set and delete ACLs.\n\n# Conditions\n\nEvery object has a generation and a metageneration. The generation changes\nwhenever the content changes, and the metageneration changes whenever the\nmetadata changes. [Conditions] let you check these values before an operation;\nthe operation only executes if the conditions match. You can use conditions to\nprevent race conditions in read-modify-write operations.\n\nFor example, say you've read an object's metadata into objAttrs. Now\nyou want to write to that object, but only if its contents haven't changed\nsince you read it. Here is how to express that:\n\n\tw = obj.If(storage.Conditions{GenerationMatch: objAttrs.Generation}).NewWriter(ctx)\n\t// Proceed with writing as above.\n\n# Signed URLs\n\nYou can obtain a URL that lets anyone read or write an object for a limited time.\nSigning a URL requires credentials authorized to sign a URL. To use the same\nauthentication that was used when instantiating the Storage client, use\n[BucketHandle.SignedURL].\n\n\turl, err := client.Bucket(bucketName).SignedURL(objectName, opts)\n\tif err != nil {\n\t    // TODO: Handle error.\n\t}\n\tfmt.Println(url)\n\nYou can also sign a URL without creating a client. See the documentation of\n[SignedURL] for details.\n\n\turl, err := storage.SignedURL(bucketName, \"shared-object\", opts)\n\tif err != nil {\n\t    // TODO: Handle error.\n\t}\n\tfmt.Println(url)\n\n# Post Policy V4 Signed Request\n\nA type of signed request that allows uploads through HTML forms directly to Cloud Storage with\ntemporary permission. Conditions can be applied to restrict how the HTML form is used and exercised\nby a user.\n\nFor more information, please see the [XML POST Object docs] as well\nas the documentation of [BucketHandle.GenerateSignedPostPolicyV4].\n\n\tpv4, err := client.Bucket(bucketName).GenerateSignedPostPolicyV4(objectName, opts)\n\tif err != nil {\n\t    // TODO: Handle error.\n\t}\n\tfmt.Printf(\"URL: %s\\nFields; %v\\n\", pv4.URL, pv4.Fields)\n\n# Credential requirements for signing\n\nIf the GoogleAccessID and PrivateKey option fields are not provided, they will\nbe automatically detected by [BucketHandle.SignedURL] and\n[BucketHandle.GenerateSignedPostPolicyV4] if any of the following are true:\n  - you are authenticated to the Storage Client with a service account's\n    downloaded private key, either directly in code or by setting the\n    GOOGLE_APPLICATION_CREDENTIALS environment variable (see [Other Environments]),\n  - your application is running on Google Compute Engine (GCE), or\n  - you are logged into [gcloud using application default credentials]\n    with [impersonation enabled].\n\nDetecting GoogleAccessID may not be possible if you are authenticated using a\ntoken source or using [option.WithHTTPClient]. In this case, you can provide a\nservice account email for GoogleAccessID and the client will attempt to sign\nthe URL or Post Policy using that service account.\n\nTo generate the signature, you must have:\n  - iam.serviceAccounts.signBlob permissions on the GoogleAccessID service\n    account, and\n  - the [IAM Service Account Credentials API] enabled (unless authenticating\n    with a downloaded private key).\n\n# Errors\n\nErrors returned by this client are often of the type [googleapi.Error].\nThese errors can be introspected for more information by using [errors.As]\nwith the richer [googleapi.Error] type. For example:\n\n\tvar e *googleapi.Error\n\tif ok := errors.As(err, &e); ok {\n\t\t  if e.Code == 409 { ... }\n\t}\n\n# Retrying failed requests\n\nMethods in this package may retry calls that fail with transient errors.\nRetrying continues indefinitely unless the controlling context is canceled, the\nclient is closed, or a non-transient error is received. To stop retries from\ncontinuing, use context timeouts or cancellation.\n\nThe retry strategy in this library follows best practices for Cloud Storage. By\ndefault, operations are retried only if they are idempotent, and exponential\nbackoff with jitter is employed. In addition, errors are only retried if they\nare defined as transient by the service. See the [Cloud Storage retry docs]\nfor more information.\n\nUsers can configure non-default retry behavior for a single library call (using\n[BucketHandle.Retryer] and [ObjectHandle.Retryer]) or for all calls made by a\nclient (using [Client.SetRetry]). For example:\n\n\to := client.Bucket(bucket).Object(object).Retryer(\n\t\t// Use WithBackoff to change the timing of the exponential backoff.\n\t\tstorage.WithBackoff(gax.Backoff{\n\t\t\tInitial:    2 * time.Second,\n\t\t}),\n\t\t// Use WithPolicy to configure the idempotency policy. RetryAlways will\n\t\t// retry the operation even if it is non-idempotent.\n\t\tstorage.WithPolicy(storage.RetryAlways),\n\t)\n\n\t// Use a context timeout to set an overall deadline on the call, including all\n\t// potential retries.\n\tctx, cancel := context.WithTimeout(ctx, 5*time.Second)\n\tdefer cancel()\n\n\t// Delete an object using the specified strategy and timeout.\n\tif err := o.Delete(ctx); err != nil {\n\t\t// Handle err.\n\t}\n\n# Sending Custom Headers\n\nYou can add custom headers to any API call made by this package by using\n[callctx.SetHeaders] on the context which is passed to the method. For example,\nto add a [custom audit logging] header:\n\n\tctx := context.Background()\n\tctx = callctx.SetHeaders(ctx, \"x-goog-custom-audit-<key>\", \"<value>\")\n\t// Use client as usual with the context and the additional headers will be sent.\n\tclient.Bucket(\"my-bucket\").Attrs(ctx)\n\n# gRPC API\n\nThis package includes support for the [Cloud Storage gRPC API]. This\nimplementation uses gRPC rather than the default JSON & XML APIs\nto make requests to Cloud Storage. All methods on the [Client] support\nthe gRPC API, with the exception of [GetServiceAccount], [Notification],\nand [HMACKey] methods.\n\nThe Cloud Storage gRPC API is generally available.\n\nTo create a client which will use gRPC, use the alternate constructor:\n\n\tctx := context.Background()\n\tclient, err := storage.NewGRPCClient(ctx)\n\tif err != nil {\n\t\t// TODO: Handle error.\n\t}\n\t// Use client as usual.\n\nOne major advantage of the gRPC API is that it can use [Direct Connectivity],\nenabling requests to skip some proxy steps and reducing responce latency.\nRequirements to use Direct Connectivity include:\n\n  - Your application must be running inside Google Cloud.\n  - Your Cloud Storage [bucket location] must overlap with your VM or compute\n    environment zone. For example, if your VM is in us-east1a, your bucket\n    must be located in either us-east1 (single region), nam4 (dual region),\n    or us (multi-region).\n  - Your client must use service account authentication.\n\nAdditional requirements for Direct Connectivity are documented in the\n[Cloud Storage gRPC docs].\n\nDependencies for the gRPC API may slightly increase the size of binaries for\napplications depending on this package. If you are not using gRPC, you can use\nthe build tag `disable_grpc_modules` to opt out of these dependencies and\nreduce the binary size.\n\nThe gRPC client is instrumented with Open Telemetry metrics which export to\nCloud Monitoring by default. More information is available in the\n[gRPC client-side metrics] documentation, including information about\nroles which must be enabled in order to do the export successfully. To\ndisable this export, you can use the [WithDisabledClientMetrics] client\noption.\n\n# Storage Control API\n\nCertain control plane and long-running operations for Cloud Storage (including Folder\nand Managed Folder operations) are supported via the autogenerated Storage Control\nclient, which is available as a subpackage in this module. See package docs at\n[cloud.google.com/go/storage/control/apiv2] or reference the [Storage Control API] docs.\n\n[Cloud Storage IAM docs]: https://cloud.google.com/storage/docs/access-control/iam\n[XML POST Object docs]: https://cloud.google.com/storage/docs/xml-api/post-object\n[Cloud Storage retry docs]: https://cloud.google.com/storage/docs/retry-strategy\n[Other Environments]: https://cloud.google.com/storage/docs/authentication#libauth\n[gcloud using application default credentials]: https://cloud.google.com/sdk/gcloud/reference/auth/application-default/login\n[impersonation enabled]: https://cloud.google.com/sdk/gcloud/reference#--impersonate-service-account\n[IAM Service Account Credentials API]: https://console.developers.google.com/apis/api/iamcredentials.googleapis.com/overview\n[custom audit logging]: https://cloud.google.com/storage/docs/audit-logging#add-custom-metadata\n[Storage Control API]: https://cloud.google.com/storage/docs/reference/rpc/google.storage.control.v2\n[Cloud Storage gRPC API]: https://cloud.google.com/storage/docs/enable-grpc-api\n[Direct Connectivity]: https://cloud.google.com/vpc-service-controls/docs/set-up-private-connectivity#direct-connectivity\n[bucket location]: https://cloud.google.com/storage/docs/locations\n[Cloud Storage gRPC docs]: https://cloud.google.com/storage/docs/enable-grpc-api#limitations\n[gRPC client-side metrics]: https://cloud.google.com/storage/docs/client-side-metrics\n*/\npackage storage // import \"cloud.google.com/go/storage\"\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/dynamic_delay.go",
    "content": "// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"sync\"\n\t\"time\"\n)\n\n// dynamicDelay dynamically calculates the delay at a fixed percentile, based on\n// delay samples.\n//\n// dynamicDelay is goroutine-safe.\ntype dynamicDelay struct {\n\tincreaseFactor float64\n\tdecreaseFactor float64\n\tminDelay       time.Duration\n\tmaxDelay       time.Duration\n\tvalue          time.Duration\n\n\t// Guards the value\n\tmu *sync.RWMutex\n}\n\n// validateDynamicDelayParams ensures,\n// targetPercentile is a valid fraction (between 0 and 1).\n// increaseRate is a positive number.\n// minDelay is less than maxDelay.\nfunc validateDynamicDelayParams(targetPercentile, increaseRate float64, minDelay, maxDelay time.Duration) error {\n\tif targetPercentile < 0 || targetPercentile > 1 {\n\t\treturn fmt.Errorf(\"invalid targetPercentile (%v): must be within [0, 1]\", targetPercentile)\n\t}\n\tif increaseRate <= 0 {\n\t\treturn fmt.Errorf(\"invalid increaseRate (%v): must be > 0\", increaseRate)\n\t}\n\tif minDelay >= maxDelay {\n\t\treturn fmt.Errorf(\"invalid minDelay (%v) and maxDelay (%v) combination: minDelay must be smaller than maxDelay\", minDelay, maxDelay)\n\t}\n\treturn nil\n}\n\n// NewDynamicDelay returns a dynamicDelay.\n//\n// targetPercentile is the desired percentile to be computed. For example, a\n// targetPercentile of 0.99 computes the delay at the 99th percentile. Must be\n// in the range [0, 1].\n//\n// increaseRate (must be > 0) determines how many increase calls it takes for\n// Value to double.\n//\n// initialDelay is the start value of the delay.\n//\n// decrease can never lower the delay past minDelay, increase can never raise\n// the delay past maxDelay.\nfunc newDynamicDelay(targetPercentile float64, increaseRate float64, initialDelay, minDelay, maxDelay time.Duration) *dynamicDelay {\n\tif initialDelay < minDelay {\n\t\tinitialDelay = minDelay\n\t}\n\tif initialDelay > maxDelay {\n\t\tinitialDelay = maxDelay\n\t}\n\n\t// Compute increaseFactor and decreaseFactor such that:\n\t// (increaseFactor ^ (1 - targetPercentile)) * (decreaseFactor ^ targetPercentile) = 1\n\tincreaseFactor := math.Exp(math.Log(2) / increaseRate)\n\tif increaseFactor < 1.001 {\n\t\tincreaseFactor = 1.001\n\t}\n\tdecreaseFactor := math.Exp(-math.Log(increaseFactor) * (1 - targetPercentile) / targetPercentile)\n\tif decreaseFactor > 0.9999 {\n\t\tdecreaseFactor = 0.9999\n\t}\n\n\treturn &dynamicDelay{\n\t\tincreaseFactor: increaseFactor,\n\t\tdecreaseFactor: decreaseFactor,\n\t\tminDelay:       minDelay,\n\t\tmaxDelay:       maxDelay,\n\t\tvalue:          initialDelay,\n\t\tmu:             &sync.RWMutex{},\n\t}\n}\n\nfunc (d *dynamicDelay) unsafeIncrease() {\n\tv := time.Duration(float64(d.value) * d.increaseFactor)\n\tif v > d.maxDelay {\n\t\td.value = d.maxDelay\n\t} else {\n\t\td.value = v\n\t}\n}\n\n// increase notes that the operation took longer than the delay returned by Value.\nfunc (d *dynamicDelay) increase() {\n\td.mu.Lock()\n\tdefer d.mu.Unlock()\n\n\td.unsafeIncrease()\n}\n\nfunc (d *dynamicDelay) unsafeDecrease() {\n\tv := time.Duration(float64(d.value) * d.decreaseFactor)\n\tif v < d.minDelay {\n\t\td.value = d.minDelay\n\t} else {\n\t\td.value = v\n\t}\n}\n\n// decrease notes that the operation completed before the delay returned by getValue.\nfunc (d *dynamicDelay) decrease() {\n\td.mu.Lock()\n\tdefer d.mu.Unlock()\n\n\td.unsafeDecrease()\n}\n\n// update updates the delay value depending on the specified latency.\nfunc (d *dynamicDelay) update(latency time.Duration) {\n\td.mu.Lock()\n\tdefer d.mu.Unlock()\n\n\tif latency > d.value {\n\t\td.unsafeIncrease()\n\t} else {\n\t\td.unsafeDecrease()\n\t}\n}\n\n// getValue returns the desired delay to wait before retry the operation.\nfunc (d *dynamicDelay) getValue() time.Duration {\n\td.mu.RLock()\n\tdefer d.mu.RUnlock()\n\n\treturn d.value\n}\n\n// printDelay prints the state of delay, helpful in debugging.\nfunc (d *dynamicDelay) printDelay() {\n\td.mu.RLock()\n\tdefer d.mu.RUnlock()\n\n\tfmt.Println(\"IncreaseFactor: \", d.increaseFactor)\n\tfmt.Println(\"DecreaseFactor: \", d.decreaseFactor)\n\tfmt.Println(\"MinDelay: \", d.minDelay)\n\tfmt.Println(\"MaxDelay: \", d.maxDelay)\n\tfmt.Println(\"Value: \", d.value)\n}\n\n// bucketDelayManager wraps dynamicDelay to provide bucket-specific delays.\ntype bucketDelayManager struct {\n\ttargetPercentile float64\n\tincreaseRate     float64\n\tinitialDelay     time.Duration\n\tminDelay         time.Duration\n\tmaxDelay         time.Duration\n\n\t// delays maps bucket names to their dynamic delay instance.\n\tdelays map[string]*dynamicDelay\n\n\t// mu guards delays.\n\tmu *sync.RWMutex\n}\n\n// newBucketDelayManager returns a new bucketDelayManager instance.\nfunc newBucketDelayManager(targetPercentile float64, increaseRate float64, initialDelay, minDelay, maxDelay time.Duration) (*bucketDelayManager, error) {\n\terr := validateDynamicDelayParams(targetPercentile, increaseRate, minDelay, maxDelay)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &bucketDelayManager{\n\t\ttargetPercentile: targetPercentile,\n\t\tincreaseRate:     increaseRate,\n\t\tinitialDelay:     initialDelay,\n\t\tminDelay:         minDelay,\n\t\tmaxDelay:         maxDelay,\n\t\tdelays:           make(map[string]*dynamicDelay),\n\t\tmu:               &sync.RWMutex{},\n\t}, nil\n}\n\n// getDelay retrieves the dynamicDelay instance for the given bucket name. If no delay\n// exists for the bucket, a new one is created with the configured parameters.\nfunc (b *bucketDelayManager) getDelay(bucketName string) *dynamicDelay {\n\tb.mu.RLock()\n\tdelay, ok := b.delays[bucketName]\n\tb.mu.RUnlock()\n\n\tif !ok {\n\t\tb.mu.Lock()\n\t\tdefer b.mu.Unlock()\n\n\t\t// Check again, as someone might create b/w the execution of mu.RUnlock() and mu.Lock().\n\t\tdelay, ok = b.delays[bucketName]\n\t\tif !ok {\n\t\t\t// Create a new dynamicDelay for the bucket if it doesn't exist\n\t\t\tdelay = newDynamicDelay(b.targetPercentile, b.increaseRate, b.initialDelay, b.minDelay, b.maxDelay)\n\t\t\tb.delays[bucketName] = delay\n\t\t}\n\t}\n\treturn delay\n}\n\n// increase notes that the operation took longer than the delay for the given bucket.\nfunc (b *bucketDelayManager) increase(bucketName string) {\n\tb.getDelay(bucketName).increase()\n}\n\n// decrease notes that the operation completed before the delay for the given bucket.\nfunc (b *bucketDelayManager) decrease(bucketName string) {\n\tb.getDelay(bucketName).decrease()\n}\n\n// update updates the delay value for the bucket depending on the specified latency.\nfunc (b *bucketDelayManager) update(bucketName string, latency time.Duration) {\n\tb.getDelay(bucketName).update(latency)\n}\n\n// getValue returns the desired delay to wait before retrying the operation for the given bucket.\nfunc (b *bucketDelayManager) getValue(bucketName string) time.Duration {\n\treturn b.getDelay(bucketName).getValue()\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/emulator_test.sh",
    "content": "#!/bin/bash\n# Copyright 2021 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License..\n\n# Fail on any error\nset -eo pipefail\n\n# Display commands being run\nset -x\n\n# Only run on Go 1.17+\nmin_minor_ver=17\n\nv=`go version | { read _ _ v _; echo ${v#go}; }`\ncomps=(${v//./ })\nminor_ver=${comps[1]}\n\nif [ \"$minor_ver\" -lt \"$min_minor_ver\" ]; then\n    echo minor version $minor_ver, skipping\n    exit 0\nfi\n\nexport STORAGE_EMULATOR_HOST=\"http://localhost:9000\"\nexport STORAGE_EMULATOR_HOST_GRPC=\"localhost:8888\"\n\nDEFAULT_IMAGE_NAME='gcr.io/cloud-devrel-public-resources/storage-testbench'\nDEFAULT_IMAGE_TAG='latest'\nDOCKER_IMAGE=${DEFAULT_IMAGE_NAME}:${DEFAULT_IMAGE_TAG}\nCONTAINER_NAME=storage_testbench\n\n# Note: --net=host makes the container bind directly to the Docker host’s network, \n# with no network isolation. If we were to use port-mapping instead, reset connection errors \n# would be captured differently and cause unexpected test behaviour.\n# The host networking driver works only on Linux hosts.\n# See more about using host networking: https://docs.docker.com/network/host/\nDOCKER_NETWORK=\"--net=host\"\n# Note: We do not expect the RetryConformanceTest suite to pass on darwin due to\n# differences in the network errors emitted by the system.\nif [ `go env GOOS` == 'darwin' ]; then\n    DOCKER_NETWORK=\"-p 9000:9000 -p 8888:8888\"\nfi\n\n# Get the docker image for the testbench\ndocker pull $DOCKER_IMAGE\n\n# Start the testbench\n\ndocker run --name $CONTAINER_NAME --rm -d $DOCKER_NETWORK $DOCKER_IMAGE\necho \"Running the Cloud Storage testbench: $STORAGE_EMULATOR_HOST\"\nsleep 1\n\n# Stop the testbench & cleanup environment variables\nfunction cleanup() {\n    echo \"Cleanup testbench\"\n    docker stop $CONTAINER_NAME\n    unset STORAGE_EMULATOR_HOST;\n    unset STORAGE_EMULATOR_HOST_GRPC;\n}\ntrap cleanup EXIT\n\n# Check that the server is running - retry several times to allow for start-up time\nresponse=$(curl -w \"%{http_code}\\n\" $STORAGE_EMULATOR_HOST --retry-connrefused --retry 5 -o /dev/null) \n\nif [[ $response != 200 ]]\nthen\n    echo \"Testbench server did not start correctly\"\n    exit 1\nfi\n\n# Start the gRPC server on port 8888.\necho \"Starting the gRPC server on port 8888\"\nresponse=$(curl -w \"%{http_code}\\n\" --retry 5 --retry-max-time 40 -o /dev/null \"$STORAGE_EMULATOR_HOST/start_grpc?port=8888\")\n\nif [[ $response != 200 ]]\nthen\n    echo \"Testbench gRPC server did not start correctly\"\n    exit 1\nfi\n\n# Run tests\n\ngo test -v -timeout 17m ./ ./dataflux -run=\"^Test(RetryConformance|.*Emulated)$\" -short -race 2>&1 | tee -a sponge_log.log\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/experimental/experimental.go",
    "content": "// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Package experimental is a collection of experimental features that might\n// have some rough edges to them. Housing experimental features in this package\n// results in a user accessing these APIs as `experimental.Foo`, thereby making\n// it explicit that the feature is experimental and using them in production\n// code is at their own risk.\n//\n// All APIs in this package are experimental.\npackage experimental\n\nimport (\n\t\"time\"\n\n\t\"cloud.google.com/go/storage/internal\"\n\t\"go.opentelemetry.io/otel/sdk/metric\"\n\t\"google.golang.org/api/option\"\n)\n\n// WithMetricInterval provides a [option.ClientOption] that may be passed to [storage.NewGRPCClient].\n// It sets how often to emit metrics [metric.WithInterval] when using\n// [metric.NewPeriodicReader]\n// When using Cloud Monitoring interval must be at minimum 1 [time.Minute].\nfunc WithMetricInterval(metricInterval time.Duration) option.ClientOption {\n\treturn internal.WithMetricInterval.(func(time.Duration) option.ClientOption)(metricInterval)\n}\n\n// WithMetricExporter provides a [option.ClientOption] that may be passed to [storage.NewGRPCClient].\n// Set an alternate client-side metric Exporter to emit metrics through.\n// Must implement [metric.Exporter]\nfunc WithMetricExporter(ex *metric.Exporter) option.ClientOption {\n\treturn internal.WithMetricExporter.(func(*metric.Exporter) option.ClientOption)(ex)\n}\n\n// WithReadStallTimeout provides a [option.ClientOption] that may be passed to [storage.NewClient].\n// It enables the client to retry stalled requests when starting a download from\n// Cloud Storage. If the timeout elapses with no response from the server, the request\n// is automatically retried.\n// The timeout is initially set to ReadStallTimeoutConfig.Min. The client tracks\n// latency across all read requests from the client for each bucket accessed, and can\n// adjust the timeout higher to the target percentile when latency for request to that\n// bucket is high.\n// Currently, this is supported only for downloads ([storage.NewReader] and\n// [storage.NewRangeReader] calls) and only for the XML API. Other read APIs (gRPC & JSON)\n// will be supported soon.\nfunc WithReadStallTimeout(rstc *ReadStallTimeoutConfig) option.ClientOption {\n\treturn internal.WithReadStallTimeout.(func(config *ReadStallTimeoutConfig) option.ClientOption)(rstc)\n}\n\n// ReadStallTimeoutConfig defines the timeout which is adjusted dynamically based on\n// past observed latencies.\ntype ReadStallTimeoutConfig struct {\n\t// Min is the minimum duration of the timeout. The default value is 500ms. Requests\n\t// taking shorter than this value to return response headers will never time out.\n\t// In general, you should choose a Min value that is greater than the typical value\n\t// for the target percentile.\n\tMin time.Duration\n\n\t// TargetPercentile is the percentile to target for the dynamic timeout. The default\n\t// value is 0.99. At the default percentile, at most 1% of requests will be timed out\n\t// and retried.\n\tTargetPercentile float64\n}\n\n// WithGRPCBidiReads provides an [option.ClientOption] that may be passed to\n// [cloud.google.com/go/storage.NewGRPCClient].\n// It enables the client to use bi-directional gRPC APIs for downloads rather than the\n// server streaming API. In particular, it allows users to use the\n// [cloud.google.com/go/storage.MultiRangeDownloader]\n// surface, which requires bi-directional streaming.\n//\n// The bi-directional API is in private preview; please contact your account manager if\n// interested.\nfunc WithGRPCBidiReads() option.ClientOption {\n\treturn internal.WithGRPCBidiReads.(func() option.ClientOption)()\n}\n\n// WithZonalBucketAPIs provides an [option.ClientOption] that may be passed to\n// [cloud.google.com/go/storage.NewGRPCClient].\n// It enables the client to use bi-directional gRPC APIs for downloads rather than the\n// server streaming API (same as [WithGRPCBidiReads]) as well as appendable\n// object semantics for uploads. By setting this option, both upload and download\n// paths will use zonal bucket compatible APIs by default.\n//\n// Zonal buckets and rapid storage is in private preview; please contact your\n// account manager if interested.\nfunc WithZonalBucketAPIs() option.ClientOption {\n\treturn internal.WithZonalBucketAPIs.(func() option.ClientOption)()\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/grpc_client.go",
    "content": "// Copyright 2022 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"context\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"hash/crc32\"\n\t\"io\"\n\t\"log\"\n\t\"os\"\n\t\"sync\"\n\n\t\"cloud.google.com/go/iam/apiv1/iampb\"\n\t\"cloud.google.com/go/internal/trace\"\n\tgapic \"cloud.google.com/go/storage/internal/apiv2\"\n\t\"cloud.google.com/go/storage/internal/apiv2/storagepb\"\n\t\"github.com/googleapis/gax-go/v2\"\n\t\"google.golang.org/api/iterator\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/api/option/internaloption\"\n\t\"google.golang.org/api/transport\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/grpc/encoding\"\n\t\"google.golang.org/grpc/mem\"\n\t\"google.golang.org/grpc/metadata\"\n\t\"google.golang.org/grpc/status\"\n\t\"google.golang.org/protobuf/encoding/protowire\"\n\t\"google.golang.org/protobuf/proto\"\n\tfieldmaskpb \"google.golang.org/protobuf/types/known/fieldmaskpb\"\n)\n\nconst (\n\t// defaultConnPoolSize is the default number of channels\n\t// to initialize in the GAPIC gRPC connection pool. A larger\n\t// connection pool may be necessary for jobs that require\n\t// high throughput and/or leverage many concurrent streams\n\t// if not running via DirectPath.\n\t//\n\t// This is only used for the gRPC client.\n\tdefaultConnPoolSize = 1\n\n\t// globalProjectAlias is the project ID alias used for global buckets.\n\t//\n\t// This is only used for the gRPC API.\n\tglobalProjectAlias = \"_\"\n\n\t// msgEntityNotSupported indicates ACL entites using project ID are not currently supported.\n\t//\n\t// This is only used for the gRPC API.\n\tmsgEntityNotSupported = \"The gRPC API currently does not support ACL entities using project ID, use project numbers instead\"\n)\n\n// defaultGRPCOptions returns a set of the default client options\n// for gRPC client initialization.\nfunc defaultGRPCOptions() []option.ClientOption {\n\tdefaults := []option.ClientOption{\n\t\toption.WithGRPCConnectionPool(defaultConnPoolSize),\n\t}\n\n\t// Set emulator options for gRPC if an emulator was specified. Note that in a\n\t// hybrid client, STORAGE_EMULATOR_HOST will set the host to use for HTTP and\n\t// STORAGE_EMULATOR_HOST_GRPC will set the host to use for gRPC (when using a\n\t// local emulator, HTTP and gRPC must use different ports, so this is\n\t// necessary).\n\t//\n\t// TODO: When the newHybridClient is not longer used, remove\n\t// STORAGE_EMULATOR_HOST_GRPC and use STORAGE_EMULATOR_HOST for both the\n\t// HTTP and gRPC based clients.\n\tif host := os.Getenv(\"STORAGE_EMULATOR_HOST_GRPC\"); host != \"\" {\n\t\t// Strip the scheme from the emulator host. WithEndpoint does not take a\n\t\t// scheme for gRPC.\n\t\thost = stripScheme(host)\n\n\t\tdefaults = append(defaults,\n\t\t\toption.WithEndpoint(host),\n\t\t\toption.WithGRPCDialOption(grpc.WithInsecure()),\n\t\t\toption.WithoutAuthentication(),\n\t\t\tWithDisabledClientMetrics(),\n\t\t)\n\t} else {\n\t\t// Only enable DirectPath when the emulator is not being targeted.\n\t\tdefaults = append(defaults,\n\t\t\tinternaloption.EnableDirectPath(true),\n\t\t\tinternaloption.AllowNonDefaultServiceAccount(true),\n\t\t\tinternaloption.EnableDirectPathXds())\n\t}\n\n\treturn defaults\n}\n\n// grpcStorageClient is the gRPC API implementation of the transport-agnostic\n// storageClient interface.\ntype grpcStorageClient struct {\n\traw      *gapic.Client\n\tsettings *settings\n\tconfig   *storageConfig\n}\n\nfunc enableClientMetrics(ctx context.Context, s *settings, config storageConfig) (*metricsContext, error) {\n\tvar project string\n\t// TODO: use new auth client\n\tc, err := transport.Creds(ctx, s.clientOption...)\n\tif err == nil {\n\t\tproject = c.ProjectID\n\t}\n\tmetricsContext, err := newGRPCMetricContext(ctx, metricsConfig{\n\t\tproject:      project,\n\t\tinterval:     config.metricInterval,\n\t\tmanualReader: config.manualReader},\n\t)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"gRPC Metrics: %w\", err)\n\t}\n\treturn metricsContext, nil\n}\n\n// newGRPCStorageClient initializes a new storageClient that uses the gRPC\n// Storage API.\nfunc newGRPCStorageClient(ctx context.Context, opts ...storageOption) (*grpcStorageClient, error) {\n\ts := initSettings(opts...)\n\ts.clientOption = append(defaultGRPCOptions(), s.clientOption...)\n\t// Disable all gax-level retries in favor of retry logic in the veneer client.\n\ts.gax = append(s.gax, gax.WithRetry(nil))\n\n\tconfig := newStorageConfig(s.clientOption...)\n\tif config.readAPIWasSet {\n\t\treturn nil, errors.New(\"storage: GRPC is incompatible with any option that specifies an API for reads\")\n\t}\n\n\tif !config.disableClientMetrics {\n\t\t// Do not fail client creation if enabling metrics fails.\n\t\tif metricsContext, err := enableClientMetrics(ctx, s, config); err == nil {\n\t\t\ts.metricsContext = metricsContext\n\t\t\ts.clientOption = append(s.clientOption, metricsContext.clientOpts...)\n\t\t} else {\n\t\t\tlog.Printf(\"Failed to enable client metrics: %v\", err)\n\t\t}\n\t}\n\tg, err := gapic.NewClient(ctx, s.clientOption...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &grpcStorageClient{\n\t\traw:      g,\n\t\tsettings: s,\n\t\tconfig:   &config,\n\t}, nil\n}\n\nfunc (c *grpcStorageClient) Close() error {\n\tif c.settings.metricsContext != nil {\n\t\tc.settings.metricsContext.close()\n\t}\n\treturn c.raw.Close()\n}\n\n// Top-level methods.\n\n// GetServiceAccount is not supported in the gRPC client.\nfunc (c *grpcStorageClient) GetServiceAccount(ctx context.Context, project string, opts ...storageOption) (string, error) {\n\treturn \"\", errMethodNotSupported\n}\n\nfunc (c *grpcStorageClient) CreateBucket(ctx context.Context, project, bucket string, attrs *BucketAttrs, enableObjectRetention *bool, opts ...storageOption) (*BucketAttrs, error) {\n\tif enableObjectRetention != nil {\n\t\t// TO-DO: implement ObjectRetention once available - see b/308194853\n\t\treturn nil, status.Errorf(codes.Unimplemented, \"storage: object retention is not supported in gRPC\")\n\t}\n\n\ts := callSettings(c.settings, opts...)\n\tb := attrs.toProtoBucket()\n\tb.Project = toProjectResource(project)\n\t// If there is lifecycle information but no location, explicitly set\n\t// the location. This is a GCS quirk/bug.\n\tif b.GetLocation() == \"\" && b.GetLifecycle() != nil {\n\t\tb.Location = \"US\"\n\t}\n\n\treq := &storagepb.CreateBucketRequest{\n\t\tParent:   fmt.Sprintf(\"projects/%s\", globalProjectAlias),\n\t\tBucket:   b,\n\t\tBucketId: bucket,\n\t}\n\tif attrs != nil {\n\t\treq.PredefinedAcl = attrs.PredefinedACL\n\t\treq.PredefinedDefaultObjectAcl = attrs.PredefinedDefaultObjectACL\n\t}\n\n\tvar battrs *BucketAttrs\n\terr := run(ctx, func(ctx context.Context) error {\n\t\tres, err := c.raw.CreateBucket(ctx, req, s.gax...)\n\n\t\tbattrs = newBucketFromProto(res)\n\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\n\treturn battrs, err\n}\n\nfunc (c *grpcStorageClient) ListBuckets(ctx context.Context, project string, opts ...storageOption) *BucketIterator {\n\ts := callSettings(c.settings, opts...)\n\tit := &BucketIterator{\n\t\tctx:       ctx,\n\t\tprojectID: project,\n\t}\n\n\tvar gitr *gapic.BucketIterator\n\tfetch := func(pageSize int, pageToken string) (token string, err error) {\n\n\t\tvar buckets []*storagepb.Bucket\n\t\tvar next string\n\t\terr = run(it.ctx, func(ctx context.Context) error {\n\t\t\t// Initialize GAPIC-based iterator when pageToken is empty, which\n\t\t\t// indicates that this fetch call is attempting to get the first page.\n\t\t\t//\n\t\t\t// Note: Initializing the GAPIC-based iterator lazily is necessary to\n\t\t\t// capture the BucketIterator.Prefix set by the user *after* the\n\t\t\t// BucketIterator is returned to them from the veneer.\n\t\t\tif pageToken == \"\" {\n\t\t\t\treq := &storagepb.ListBucketsRequest{\n\t\t\t\t\tParent: toProjectResource(it.projectID),\n\t\t\t\t\tPrefix: it.Prefix,\n\t\t\t\t}\n\t\t\t\tgitr = c.raw.ListBuckets(ctx, req, s.gax...)\n\t\t\t}\n\t\t\tbuckets, next, err = gitr.InternalFetch(pageSize, pageToken)\n\t\t\treturn err\n\t\t}, s.retry, s.idempotent)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\n\t\tfor _, bkt := range buckets {\n\t\t\tb := newBucketFromProto(bkt)\n\t\t\tit.buckets = append(it.buckets, b)\n\t\t}\n\n\t\treturn next, nil\n\t}\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(\n\t\tfetch,\n\t\tfunc() int { return len(it.buckets) },\n\t\tfunc() interface{} { b := it.buckets; it.buckets = nil; return b })\n\n\treturn it\n}\n\n// Bucket methods.\n\nfunc (c *grpcStorageClient) DeleteBucket(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) error {\n\ts := callSettings(c.settings, opts...)\n\treq := &storagepb.DeleteBucketRequest{\n\t\tName: bucketResourceName(globalProjectAlias, bucket),\n\t}\n\tif err := applyBucketCondsProto(\"grpcStorageClient.DeleteBucket\", conds, req); err != nil {\n\t\treturn err\n\t}\n\tif s.userProject != \"\" {\n\t\tctx = setUserProjectMetadata(ctx, s.userProject)\n\t}\n\n\treturn run(ctx, func(ctx context.Context) error {\n\t\treturn c.raw.DeleteBucket(ctx, req, s.gax...)\n\t}, s.retry, s.idempotent)\n}\n\nfunc (c *grpcStorageClient) GetBucket(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) (*BucketAttrs, error) {\n\ts := callSettings(c.settings, opts...)\n\treq := &storagepb.GetBucketRequest{\n\t\tName:     bucketResourceName(globalProjectAlias, bucket),\n\t\tReadMask: &fieldmaskpb.FieldMask{Paths: []string{\"*\"}},\n\t}\n\tif err := applyBucketCondsProto(\"grpcStorageClient.GetBucket\", conds, req); err != nil {\n\t\treturn nil, err\n\t}\n\tif s.userProject != \"\" {\n\t\tctx = setUserProjectMetadata(ctx, s.userProject)\n\t}\n\n\tvar battrs *BucketAttrs\n\terr := run(ctx, func(ctx context.Context) error {\n\t\tres, err := c.raw.GetBucket(ctx, req, s.gax...)\n\t\tbattrs = newBucketFromProto(res)\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\n\treturn battrs, formatBucketError(err)\n}\nfunc (c *grpcStorageClient) UpdateBucket(ctx context.Context, bucket string, uattrs *BucketAttrsToUpdate, conds *BucketConditions, opts ...storageOption) (*BucketAttrs, error) {\n\ts := callSettings(c.settings, opts...)\n\tb := uattrs.toProtoBucket()\n\tb.Name = bucketResourceName(globalProjectAlias, bucket)\n\treq := &storagepb.UpdateBucketRequest{\n\t\tBucket:                     b,\n\t\tPredefinedAcl:              uattrs.PredefinedACL,\n\t\tPredefinedDefaultObjectAcl: uattrs.PredefinedDefaultObjectACL,\n\t}\n\tif err := applyBucketCondsProto(\"grpcStorageClient.UpdateBucket\", conds, req); err != nil {\n\t\treturn nil, err\n\t}\n\tif s.userProject != \"\" {\n\t\tctx = setUserProjectMetadata(ctx, s.userProject)\n\t}\n\n\tvar paths []string\n\tfieldMask := &fieldmaskpb.FieldMask{\n\t\tPaths: paths,\n\t}\n\tif uattrs.CORS != nil {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"cors\")\n\t}\n\tif uattrs.DefaultEventBasedHold != nil {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"default_event_based_hold\")\n\t}\n\tif uattrs.RetentionPolicy != nil {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"retention_policy\")\n\t}\n\tif uattrs.VersioningEnabled != nil {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"versioning\")\n\t}\n\tif uattrs.RequesterPays != nil {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"billing\")\n\t}\n\tif uattrs.BucketPolicyOnly != nil || uattrs.UniformBucketLevelAccess != nil || uattrs.PublicAccessPrevention != PublicAccessPreventionUnknown {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"iam_config\")\n\t}\n\tif uattrs.Encryption != nil {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"encryption\")\n\t}\n\tif uattrs.Lifecycle != nil {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"lifecycle\")\n\t}\n\tif uattrs.Logging != nil {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"logging\")\n\t}\n\tif uattrs.Website != nil {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"website\")\n\t}\n\tif uattrs.PredefinedACL != \"\" {\n\t\t// In cases where PredefinedACL is set, Acl is cleared.\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"acl\")\n\t}\n\tif uattrs.PredefinedDefaultObjectACL != \"\" {\n\t\t// In cases where PredefinedDefaultObjectACL is set, DefaultObjectAcl is cleared.\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"default_object_acl\")\n\t}\n\t// Note: This API currently does not support entites using project ID.\n\t// Use project numbers in ACL entities. Pending b/233617896.\n\tif uattrs.acl != nil {\n\t\t// In cases where acl is set by UpdateBucketACL method.\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"acl\")\n\t}\n\tif uattrs.defaultObjectACL != nil {\n\t\t// In cases where defaultObjectACL is set by UpdateBucketACL method.\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"default_object_acl\")\n\t}\n\tif uattrs.StorageClass != \"\" {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"storage_class\")\n\t}\n\tif uattrs.RPO != RPOUnknown {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"rpo\")\n\t}\n\tif uattrs.Autoclass != nil {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"autoclass\")\n\t}\n\tif uattrs.SoftDeletePolicy != nil {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"soft_delete_policy\")\n\t}\n\n\tfor label := range uattrs.setLabels {\n\t\tfieldMask.Paths = append(fieldMask.Paths, fmt.Sprintf(\"labels.%s\", label))\n\t}\n\n\t// Delete a label by not including it in Bucket.Labels but adding the key to the update mask.\n\tfor label := range uattrs.deleteLabels {\n\t\tfieldMask.Paths = append(fieldMask.Paths, fmt.Sprintf(\"labels.%s\", label))\n\t}\n\n\treq.UpdateMask = fieldMask\n\n\tif len(fieldMask.Paths) < 1 {\n\t\t// Nothing to update. Send a get request for current attrs instead. This\n\t\t// maintains consistency with JSON bucket updates.\n\t\topts = append(opts, idempotent(true))\n\t\treturn c.GetBucket(ctx, bucket, conds, opts...)\n\t}\n\n\tvar battrs *BucketAttrs\n\terr := run(ctx, func(ctx context.Context) error {\n\t\tres, err := c.raw.UpdateBucket(ctx, req, s.gax...)\n\t\tbattrs = newBucketFromProto(res)\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\n\treturn battrs, err\n}\nfunc (c *grpcStorageClient) LockBucketRetentionPolicy(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) error {\n\ts := callSettings(c.settings, opts...)\n\treq := &storagepb.LockBucketRetentionPolicyRequest{\n\t\tBucket: bucketResourceName(globalProjectAlias, bucket),\n\t}\n\tif err := applyBucketCondsProto(\"grpcStorageClient.LockBucketRetentionPolicy\", conds, req); err != nil {\n\t\treturn err\n\t}\n\n\treturn run(ctx, func(ctx context.Context) error {\n\t\t_, err := c.raw.LockBucketRetentionPolicy(ctx, req, s.gax...)\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\n}\nfunc (c *grpcStorageClient) ListObjects(ctx context.Context, bucket string, q *Query, opts ...storageOption) *ObjectIterator {\n\ts := callSettings(c.settings, opts...)\n\tit := &ObjectIterator{\n\t\tctx: ctx,\n\t}\n\tif q != nil {\n\t\tit.query = *q\n\t}\n\treq := &storagepb.ListObjectsRequest{\n\t\tParent:                   bucketResourceName(globalProjectAlias, bucket),\n\t\tPrefix:                   it.query.Prefix,\n\t\tDelimiter:                it.query.Delimiter,\n\t\tVersions:                 it.query.Versions,\n\t\tLexicographicStart:       it.query.StartOffset,\n\t\tLexicographicEnd:         it.query.EndOffset,\n\t\tIncludeTrailingDelimiter: it.query.IncludeTrailingDelimiter,\n\t\tMatchGlob:                it.query.MatchGlob,\n\t\tReadMask:                 q.toFieldMask(), // a nil Query still results in a \"*\" FieldMask\n\t\tSoftDeleted:              it.query.SoftDeleted,\n\t\tIncludeFoldersAsPrefixes: it.query.IncludeFoldersAsPrefixes,\n\t}\n\tif s.userProject != \"\" {\n\t\tctx = setUserProjectMetadata(ctx, s.userProject)\n\t}\n\tfetch := func(pageSize int, pageToken string) (token string, err error) {\n\t\t// Add trace span around List API call within the fetch.\n\t\tctx, _ = startSpan(ctx, \"grpcStorageClient.ObjectsListCall\")\n\t\tdefer func() { endSpan(ctx, err) }()\n\t\tvar objects []*storagepb.Object\n\t\tvar gitr *gapic.ObjectIterator\n\t\terr = run(it.ctx, func(ctx context.Context) error {\n\t\t\tgitr = c.raw.ListObjects(ctx, req, s.gax...)\n\t\t\tit.ctx = ctx\n\t\t\tobjects, token, err = gitr.InternalFetch(pageSize, pageToken)\n\t\t\treturn err\n\t\t}, s.retry, s.idempotent)\n\t\tif err != nil {\n\t\t\treturn \"\", formatBucketError(err)\n\t\t}\n\n\t\tfor _, obj := range objects {\n\t\t\tb := newObjectFromProto(obj)\n\t\t\tit.items = append(it.items, b)\n\t\t}\n\n\t\t// Response is always non-nil after a successful request.\n\t\tres := gitr.Response.(*storagepb.ListObjectsResponse)\n\t\tfor _, prefix := range res.GetPrefixes() {\n\t\t\tit.items = append(it.items, &ObjectAttrs{Prefix: prefix})\n\t\t}\n\n\t\treturn token, nil\n\t}\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(\n\t\tfetch,\n\t\tfunc() int { return len(it.items) },\n\t\tfunc() interface{} { b := it.items; it.items = nil; return b })\n\n\treturn it\n}\n\n// Object metadata methods.\n\nfunc (c *grpcStorageClient) DeleteObject(ctx context.Context, bucket, object string, gen int64, conds *Conditions, opts ...storageOption) error {\n\ts := callSettings(c.settings, opts...)\n\treq := &storagepb.DeleteObjectRequest{\n\t\tBucket: bucketResourceName(globalProjectAlias, bucket),\n\t\tObject: object,\n\t}\n\tif err := applyCondsProto(\"grpcStorageClient.DeleteObject\", gen, conds, req); err != nil {\n\t\treturn err\n\t}\n\tif s.userProject != \"\" {\n\t\tctx = setUserProjectMetadata(ctx, s.userProject)\n\t}\n\terr := run(ctx, func(ctx context.Context) error {\n\t\treturn c.raw.DeleteObject(ctx, req, s.gax...)\n\t}, s.retry, s.idempotent)\n\tif s, ok := status.FromError(err); ok && s.Code() == codes.NotFound {\n\t\treturn formatObjectErr(err)\n\t}\n\treturn err\n}\n\nfunc (c *grpcStorageClient) GetObject(ctx context.Context, params *getObjectParams, opts ...storageOption) (*ObjectAttrs, error) {\n\ts := callSettings(c.settings, opts...)\n\treq := &storagepb.GetObjectRequest{\n\t\tBucket: bucketResourceName(globalProjectAlias, params.bucket),\n\t\tObject: params.object,\n\t\t// ProjectionFull by default.\n\t\tReadMask: &fieldmaskpb.FieldMask{Paths: []string{\"*\"}},\n\t}\n\tif err := applyCondsProto(\"grpcStorageClient.GetObject\", params.gen, params.conds, req); err != nil {\n\t\treturn nil, err\n\t}\n\tif s.userProject != \"\" {\n\t\tctx = setUserProjectMetadata(ctx, s.userProject)\n\t}\n\tif params.encryptionKey != nil {\n\t\treq.CommonObjectRequestParams = toProtoCommonObjectRequestParams(params.encryptionKey)\n\t}\n\tif params.softDeleted {\n\t\treq.SoftDeleted = &params.softDeleted\n\t}\n\n\tvar attrs *ObjectAttrs\n\terr := run(ctx, func(ctx context.Context) error {\n\t\tres, err := c.raw.GetObject(ctx, req, s.gax...)\n\t\tattrs = newObjectFromProto(res)\n\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\n\tif s, ok := status.FromError(err); ok && s.Code() == codes.NotFound {\n\t\treturn nil, formatObjectErr(err)\n\t}\n\n\treturn attrs, err\n}\n\nfunc (c *grpcStorageClient) UpdateObject(ctx context.Context, params *updateObjectParams, opts ...storageOption) (*ObjectAttrs, error) {\n\tuattrs := params.uattrs\n\tif params.overrideRetention != nil || uattrs.Retention != nil {\n\t\t// TO-DO: implement ObjectRetention once available - see b/308194853\n\t\treturn nil, status.Errorf(codes.Unimplemented, \"storage: object retention is not supported in gRPC\")\n\t}\n\ts := callSettings(c.settings, opts...)\n\to := uattrs.toProtoObject(bucketResourceName(globalProjectAlias, params.bucket), params.object)\n\t// For Update, generation is passed via the object message rather than a field on the request.\n\tif params.gen >= 0 {\n\t\to.Generation = params.gen\n\t}\n\treq := &storagepb.UpdateObjectRequest{\n\t\tObject:        o,\n\t\tPredefinedAcl: uattrs.PredefinedACL,\n\t}\n\tif err := applyCondsProto(\"grpcStorageClient.UpdateObject\", defaultGen, params.conds, req); err != nil {\n\t\treturn nil, err\n\t}\n\tif s.userProject != \"\" {\n\t\tctx = setUserProjectMetadata(ctx, s.userProject)\n\t}\n\tif params.encryptionKey != nil {\n\t\treq.CommonObjectRequestParams = toProtoCommonObjectRequestParams(params.encryptionKey)\n\t}\n\n\tfieldMask := &fieldmaskpb.FieldMask{Paths: nil}\n\tif uattrs.EventBasedHold != nil {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"event_based_hold\")\n\t}\n\tif uattrs.TemporaryHold != nil {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"temporary_hold\")\n\t}\n\tif uattrs.ContentType != nil {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"content_type\")\n\t}\n\tif uattrs.ContentLanguage != nil {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"content_language\")\n\t}\n\tif uattrs.ContentEncoding != nil {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"content_encoding\")\n\t}\n\tif uattrs.ContentDisposition != nil {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"content_disposition\")\n\t}\n\tif uattrs.CacheControl != nil {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"cache_control\")\n\t}\n\tif !uattrs.CustomTime.IsZero() {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"custom_time\")\n\t}\n\t// Note: This API currently does not support entites using project ID.\n\t// Use project numbers in ACL entities. Pending b/233617896.\n\tif uattrs.ACL != nil || len(uattrs.PredefinedACL) > 0 {\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"acl\")\n\t}\n\n\tif uattrs.Metadata != nil {\n\t\t// We don't support deleting a specific metadata key; metadata is deleted\n\t\t// as a whole if provided an empty map, so we do not use dot notation here\n\t\tif len(uattrs.Metadata) == 0 {\n\t\t\tfieldMask.Paths = append(fieldMask.Paths, \"metadata\")\n\t\t} else {\n\t\t\t// We can, however, use dot notation for adding keys\n\t\t\tfor key := range uattrs.Metadata {\n\t\t\t\tfieldMask.Paths = append(fieldMask.Paths, fmt.Sprintf(\"metadata.%s\", key))\n\t\t\t}\n\t\t}\n\t}\n\n\treq.UpdateMask = fieldMask\n\n\tif len(fieldMask.Paths) < 1 {\n\t\t// Nothing to update. To maintain consistency with JSON, we must still\n\t\t// update the object because metageneration and other fields are\n\t\t// updated even on an empty update.\n\t\t// gRPC will fail if the fieldmask is empty, so instead we add an\n\t\t// output-only field to the update mask. Output-only fields are (and must\n\t\t// be - see AIP 161) ignored, but allow us to send an empty update because\n\t\t// any mask that is valid for read (as this one is) must be valid for write.\n\t\tfieldMask.Paths = append(fieldMask.Paths, \"create_time\")\n\t}\n\n\tvar attrs *ObjectAttrs\n\terr := run(ctx, func(ctx context.Context) error {\n\t\tres, err := c.raw.UpdateObject(ctx, req, s.gax...)\n\t\tattrs = newObjectFromProto(res)\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\tif e, ok := status.FromError(err); ok && e.Code() == codes.NotFound {\n\t\treturn nil, formatObjectErr(err)\n\t}\n\n\treturn attrs, err\n}\n\nfunc (c *grpcStorageClient) RestoreObject(ctx context.Context, params *restoreObjectParams, opts ...storageOption) (*ObjectAttrs, error) {\n\ts := callSettings(c.settings, opts...)\n\treq := &storagepb.RestoreObjectRequest{\n\t\tBucket:        bucketResourceName(globalProjectAlias, params.bucket),\n\t\tObject:        params.object,\n\t\tCopySourceAcl: &params.copySourceACL,\n\t}\n\tif err := applyCondsProto(\"grpcStorageClient.RestoreObject\", params.gen, params.conds, req); err != nil {\n\t\treturn nil, err\n\t}\n\tif s.userProject != \"\" {\n\t\tctx = setUserProjectMetadata(ctx, s.userProject)\n\t}\n\n\tvar attrs *ObjectAttrs\n\terr := run(ctx, func(ctx context.Context) error {\n\t\tres, err := c.raw.RestoreObject(ctx, req, s.gax...)\n\t\tattrs = newObjectFromProto(res)\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\tif s, ok := status.FromError(err); ok && s.Code() == codes.NotFound {\n\t\treturn nil, formatObjectErr(err)\n\t}\n\treturn attrs, err\n}\n\nfunc (c *grpcStorageClient) MoveObject(ctx context.Context, params *moveObjectParams, opts ...storageOption) (*ObjectAttrs, error) {\n\ts := callSettings(c.settings, opts...)\n\treq := &storagepb.MoveObjectRequest{\n\t\tBucket:            bucketResourceName(globalProjectAlias, params.bucket),\n\t\tSourceObject:      params.srcObject,\n\t\tDestinationObject: params.dstObject,\n\t}\n\tif err := applyCondsProto(\"MoveObjectDestination\", defaultGen, params.dstConds, req); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := applySourceCondsProto(\"MoveObjectSource\", defaultGen, params.srcConds, req); err != nil {\n\t\treturn nil, err\n\t}\n\n\tif s.userProject != \"\" {\n\t\tctx = setUserProjectMetadata(ctx, s.userProject)\n\t}\n\n\tvar attrs *ObjectAttrs\n\terr := run(ctx, func(ctx context.Context) error {\n\t\tres, err := c.raw.MoveObject(ctx, req, s.gax...)\n\t\tattrs = newObjectFromProto(res)\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\tif s, ok := status.FromError(err); ok && s.Code() == codes.NotFound {\n\t\treturn nil, formatObjectErr(err)\n\t}\n\treturn attrs, err\n}\n\n// Default Object ACL methods.\n\nfunc (c *grpcStorageClient) DeleteDefaultObjectACL(ctx context.Context, bucket string, entity ACLEntity, opts ...storageOption) error {\n\t// There is no separate API for PATCH in gRPC.\n\t// Make a GET call first to retrieve BucketAttrs.\n\tattrs, err := c.GetBucket(ctx, bucket, nil, opts...)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// Delete the entity and copy other remaining ACL entities.\n\t// Note: This API currently does not support entites using project ID.\n\t// Use project numbers in ACL entities. Pending b/233617896.\n\t// Return error if entity is not found or a project ID is used.\n\tinvalidEntity := true\n\tvar acl []ACLRule\n\tfor _, a := range attrs.DefaultObjectACL {\n\t\tif a.Entity != entity {\n\t\t\tacl = append(acl, a)\n\t\t}\n\t\tif a.Entity == entity {\n\t\t\tinvalidEntity = false\n\t\t}\n\t}\n\tif invalidEntity {\n\t\treturn fmt.Errorf(\"storage: entity %v was not found on bucket %v, got %v. %v\", entity, bucket, attrs.DefaultObjectACL, msgEntityNotSupported)\n\t}\n\tuattrs := &BucketAttrsToUpdate{defaultObjectACL: acl}\n\t// Call UpdateBucket with a MetagenerationMatch precondition set.\n\tif _, err = c.UpdateBucket(ctx, bucket, uattrs, &BucketConditions{MetagenerationMatch: attrs.MetaGeneration}, opts...); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (c *grpcStorageClient) ListDefaultObjectACLs(ctx context.Context, bucket string, opts ...storageOption) ([]ACLRule, error) {\n\tattrs, err := c.GetBucket(ctx, bucket, nil, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn attrs.DefaultObjectACL, nil\n}\n\nfunc (c *grpcStorageClient) UpdateDefaultObjectACL(ctx context.Context, bucket string, entity ACLEntity, role ACLRole, opts ...storageOption) error {\n\t// There is no separate API for PATCH in gRPC.\n\t// Make a GET call first to retrieve BucketAttrs.\n\tattrs, err := c.GetBucket(ctx, bucket, nil, opts...)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// Note: This API currently does not support entites using project ID.\n\t// Use project numbers in ACL entities. Pending b/233617896.\n\tvar acl []ACLRule\n\taclRule := ACLRule{Entity: entity, Role: role}\n\tacl = append(attrs.DefaultObjectACL, aclRule)\n\tuattrs := &BucketAttrsToUpdate{defaultObjectACL: acl}\n\t// Call UpdateBucket with a MetagenerationMatch precondition set.\n\tif _, err = c.UpdateBucket(ctx, bucket, uattrs, &BucketConditions{MetagenerationMatch: attrs.MetaGeneration}, opts...); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Bucket ACL methods.\n\nfunc (c *grpcStorageClient) DeleteBucketACL(ctx context.Context, bucket string, entity ACLEntity, opts ...storageOption) error {\n\t// There is no separate API for PATCH in gRPC.\n\t// Make a GET call first to retrieve BucketAttrs.\n\tattrs, err := c.GetBucket(ctx, bucket, nil, opts...)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// Delete the entity and copy other remaining ACL entities.\n\t// Note: This API currently does not support entites using project ID.\n\t// Use project numbers in ACL entities. Pending b/233617896.\n\t// Return error if entity is not found or a project ID is used.\n\tinvalidEntity := true\n\tvar acl []ACLRule\n\tfor _, a := range attrs.ACL {\n\t\tif a.Entity != entity {\n\t\t\tacl = append(acl, a)\n\t\t}\n\t\tif a.Entity == entity {\n\t\t\tinvalidEntity = false\n\t\t}\n\t}\n\tif invalidEntity {\n\t\treturn fmt.Errorf(\"storage: entity %v was not found on bucket %v, got %v. %v\", entity, bucket, attrs.ACL, msgEntityNotSupported)\n\t}\n\tuattrs := &BucketAttrsToUpdate{acl: acl}\n\t// Call UpdateBucket with a MetagenerationMatch precondition set.\n\tif _, err = c.UpdateBucket(ctx, bucket, uattrs, &BucketConditions{MetagenerationMatch: attrs.MetaGeneration}, opts...); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (c *grpcStorageClient) ListBucketACLs(ctx context.Context, bucket string, opts ...storageOption) ([]ACLRule, error) {\n\tattrs, err := c.GetBucket(ctx, bucket, nil, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn attrs.ACL, nil\n}\n\nfunc (c *grpcStorageClient) UpdateBucketACL(ctx context.Context, bucket string, entity ACLEntity, role ACLRole, opts ...storageOption) error {\n\t// There is no separate API for PATCH in gRPC.\n\t// Make a GET call first to retrieve BucketAttrs.\n\tattrs, err := c.GetBucket(ctx, bucket, nil, opts...)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// Note: This API currently does not support entites using project ID.\n\t// Use project numbers in ACL entities. Pending b/233617896.\n\tvar acl []ACLRule\n\taclRule := ACLRule{Entity: entity, Role: role}\n\tacl = append(attrs.ACL, aclRule)\n\tuattrs := &BucketAttrsToUpdate{acl: acl}\n\t// Call UpdateBucket with a MetagenerationMatch precondition set.\n\tif _, err = c.UpdateBucket(ctx, bucket, uattrs, &BucketConditions{MetagenerationMatch: attrs.MetaGeneration}, opts...); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Object ACL methods.\n\nfunc (c *grpcStorageClient) DeleteObjectACL(ctx context.Context, bucket, object string, entity ACLEntity, opts ...storageOption) error {\n\t// There is no separate API for PATCH in gRPC.\n\t// Make a GET call first to retrieve ObjectAttrs.\n\tattrs, err := c.GetObject(ctx, &getObjectParams{bucket, object, defaultGen, nil, nil, false}, opts...)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// Delete the entity and copy other remaining ACL entities.\n\t// Note: This API currently does not support entites using project ID.\n\t// Use project numbers in ACL entities. Pending b/233617896.\n\t// Return error if entity is not found or a project ID is used.\n\tinvalidEntity := true\n\tvar acl []ACLRule\n\tfor _, a := range attrs.ACL {\n\t\tif a.Entity != entity {\n\t\t\tacl = append(acl, a)\n\t\t}\n\t\tif a.Entity == entity {\n\t\t\tinvalidEntity = false\n\t\t}\n\t}\n\tif invalidEntity {\n\t\treturn fmt.Errorf(\"storage: entity %v was not found on bucket %v, got %v. %v\", entity, bucket, attrs.ACL, msgEntityNotSupported)\n\t}\n\tuattrs := &ObjectAttrsToUpdate{ACL: acl}\n\t// Call UpdateObject with the specified metageneration.\n\tparams := &updateObjectParams{bucket: bucket, object: object, uattrs: uattrs, gen: defaultGen, conds: &Conditions{MetagenerationMatch: attrs.Metageneration}}\n\tif _, err = c.UpdateObject(ctx, params, opts...); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// ListObjectACLs retrieves object ACL entries. By default, it operates on the latest generation of this object.\n// Selecting a specific generation of this object is not currently supported by the client.\nfunc (c *grpcStorageClient) ListObjectACLs(ctx context.Context, bucket, object string, opts ...storageOption) ([]ACLRule, error) {\n\to, err := c.GetObject(ctx, &getObjectParams{bucket, object, defaultGen, nil, nil, false}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn o.ACL, nil\n}\n\nfunc (c *grpcStorageClient) UpdateObjectACL(ctx context.Context, bucket, object string, entity ACLEntity, role ACLRole, opts ...storageOption) error {\n\t// There is no separate API for PATCH in gRPC.\n\t// Make a GET call first to retrieve ObjectAttrs.\n\tattrs, err := c.GetObject(ctx, &getObjectParams{bucket, object, defaultGen, nil, nil, false}, opts...)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// Note: This API currently does not support entites using project ID.\n\t// Use project numbers in ACL entities. Pending b/233617896.\n\tvar acl []ACLRule\n\taclRule := ACLRule{Entity: entity, Role: role}\n\tacl = append(attrs.ACL, aclRule)\n\tuattrs := &ObjectAttrsToUpdate{ACL: acl}\n\t// Call UpdateObject with the specified metageneration.\n\tparams := &updateObjectParams{bucket: bucket, object: object, uattrs: uattrs, gen: defaultGen, conds: &Conditions{MetagenerationMatch: attrs.Metageneration}}\n\tif _, err = c.UpdateObject(ctx, params, opts...); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Media operations.\n\nfunc (c *grpcStorageClient) ComposeObject(ctx context.Context, req *composeObjectRequest, opts ...storageOption) (*ObjectAttrs, error) {\n\ts := callSettings(c.settings, opts...)\n\tif s.userProject != \"\" {\n\t\tctx = setUserProjectMetadata(ctx, s.userProject)\n\t}\n\n\tdstObjPb := req.dstObject.attrs.toProtoObject(req.dstBucket)\n\tdstObjPb.Name = req.dstObject.name\n\n\tif req.sendCRC32C {\n\t\tdstObjPb.Checksums.Crc32C = &req.dstObject.attrs.CRC32C\n\t}\n\n\tsrcs := []*storagepb.ComposeObjectRequest_SourceObject{}\n\tfor _, src := range req.srcs {\n\t\tsrcObjPb := &storagepb.ComposeObjectRequest_SourceObject{Name: src.name, ObjectPreconditions: &storagepb.ComposeObjectRequest_SourceObject_ObjectPreconditions{}}\n\t\tif src.gen >= 0 {\n\t\t\tsrcObjPb.Generation = src.gen\n\t\t}\n\t\tif err := applyCondsProto(\"ComposeObject source\", defaultGen, src.conds, srcObjPb.ObjectPreconditions); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tsrcs = append(srcs, srcObjPb)\n\t}\n\n\trawReq := &storagepb.ComposeObjectRequest{\n\t\tDestination:   dstObjPb,\n\t\tSourceObjects: srcs,\n\t}\n\tif err := applyCondsProto(\"ComposeObject destination\", defaultGen, req.dstObject.conds, rawReq); err != nil {\n\t\treturn nil, err\n\t}\n\tif req.predefinedACL != \"\" {\n\t\trawReq.DestinationPredefinedAcl = req.predefinedACL\n\t}\n\tif req.dstObject.encryptionKey != nil {\n\t\trawReq.CommonObjectRequestParams = toProtoCommonObjectRequestParams(req.dstObject.encryptionKey)\n\t}\n\n\tvar obj *storagepb.Object\n\tvar err error\n\tif err := run(ctx, func(ctx context.Context) error {\n\t\tobj, err = c.raw.ComposeObject(ctx, rawReq, s.gax...)\n\t\treturn err\n\t}, s.retry, s.idempotent); err != nil {\n\t\tif s, ok := status.FromError(err); ok && s.Code() == codes.NotFound {\n\t\t\treturn nil, formatObjectErr(err)\n\t\t}\n\t\treturn nil, err\n\t}\n\n\treturn newObjectFromProto(obj), nil\n}\nfunc (c *grpcStorageClient) RewriteObject(ctx context.Context, req *rewriteObjectRequest, opts ...storageOption) (*rewriteObjectResponse, error) {\n\ts := callSettings(c.settings, opts...)\n\tobj := req.dstObject.attrs.toProtoObject(\"\")\n\tcall := &storagepb.RewriteObjectRequest{\n\t\tSourceBucket:              bucketResourceName(globalProjectAlias, req.srcObject.bucket),\n\t\tSourceObject:              req.srcObject.name,\n\t\tRewriteToken:              req.token,\n\t\tDestinationBucket:         bucketResourceName(globalProjectAlias, req.dstObject.bucket),\n\t\tDestinationName:           req.dstObject.name,\n\t\tDestination:               obj,\n\t\tDestinationKmsKey:         req.dstObject.keyName,\n\t\tDestinationPredefinedAcl:  req.predefinedACL,\n\t\tCommonObjectRequestParams: toProtoCommonObjectRequestParams(req.dstObject.encryptionKey),\n\t}\n\n\t// The userProject, whether source or destination project, is decided by the code calling the interface.\n\tif s.userProject != \"\" {\n\t\tctx = setUserProjectMetadata(ctx, s.userProject)\n\t}\n\tif err := applyCondsProto(\"Copy destination\", defaultGen, req.dstObject.conds, call); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := applySourceCondsProto(\"Copy source\", req.srcObject.gen, req.srcObject.conds, call); err != nil {\n\t\treturn nil, err\n\t}\n\n\tif len(req.dstObject.encryptionKey) > 0 {\n\t\tcall.CommonObjectRequestParams = toProtoCommonObjectRequestParams(req.dstObject.encryptionKey)\n\t}\n\tif len(req.srcObject.encryptionKey) > 0 {\n\t\tsrcParams := toProtoCommonObjectRequestParams(req.srcObject.encryptionKey)\n\t\tcall.CopySourceEncryptionAlgorithm = srcParams.GetEncryptionAlgorithm()\n\t\tcall.CopySourceEncryptionKeyBytes = srcParams.GetEncryptionKeyBytes()\n\t\tcall.CopySourceEncryptionKeySha256Bytes = srcParams.GetEncryptionKeySha256Bytes()\n\t}\n\n\tcall.MaxBytesRewrittenPerCall = req.maxBytesRewrittenPerCall\n\n\tvar res *storagepb.RewriteResponse\n\tvar err error\n\n\tretryCall := func(ctx context.Context) error { res, err = c.raw.RewriteObject(ctx, call, s.gax...); return err }\n\n\tif err := run(ctx, retryCall, s.retry, s.idempotent); err != nil {\n\t\tif s, ok := status.FromError(err); ok && s.Code() == codes.NotFound {\n\t\t\treturn nil, formatObjectErr(err)\n\t\t}\n\t\treturn nil, err\n\t}\n\n\tr := &rewriteObjectResponse{\n\t\tdone:     res.GetDone(),\n\t\twritten:  res.GetTotalBytesRewritten(),\n\t\tsize:     res.GetObjectSize(),\n\t\ttoken:    res.GetRewriteToken(),\n\t\tresource: newObjectFromProto(res.GetResource()),\n\t}\n\n\treturn r, nil\n}\n\n// Custom codec to be used for unmarshaling BidiReadObjectResponse messages.\n// This is used to avoid a copy of object data in proto.Unmarshal.\ntype bytesCodecV2 struct {\n}\n\nvar _ encoding.CodecV2 = bytesCodecV2{}\n\n// Marshal is used to encode messages to send for bytesCodecV2. Since we are only\n// using this to send ReadObjectRequest messages we don't need to recycle buffers\n// here.\nfunc (bytesCodecV2) Marshal(v any) (mem.BufferSlice, error) {\n\tvv, ok := v.(proto.Message)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"failed to marshal, message is %T, want proto.Message\", v)\n\t}\n\tvar data mem.BufferSlice\n\tbuf, err := proto.Marshal(vv)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdata = append(data, mem.SliceBuffer(buf))\n\treturn data, nil\n}\n\n// Unmarshal is used for data received for BidiReadObjectResponse. We want to preserve\n// the mem.BufferSlice in most cases rather than copying and calling proto.Unmarshal.\nfunc (bytesCodecV2) Unmarshal(data mem.BufferSlice, v any) error {\n\tswitch v := v.(type) {\n\tcase *mem.BufferSlice:\n\t\t*v = data\n\t\t// Pick up a reference to the data so that it is not freed while decoding.\n\t\tdata.Ref()\n\t\treturn nil\n\tcase proto.Message:\n\t\tbuf := data.MaterializeToBuffer(mem.DefaultBufferPool())\n\t\treturn proto.Unmarshal(buf.ReadOnlyData(), v)\n\tdefault:\n\t\treturn fmt.Errorf(\"cannot unmarshal type %T, want proto.Message or mem.BufferSlice\", v)\n\t}\n}\n\nfunc (bytesCodecV2) Name() string {\n\treturn \"\"\n}\n\nfunc contextMetadataFromBidiReadObject(req *storagepb.BidiReadObjectRequest) []string {\n\tif len(req.GetReadObjectSpec().GetRoutingToken()) > 0 {\n\t\treturn []string{\"x-goog-request-params\", fmt.Sprintf(\"bucket=%s&routing_token=%s\", req.GetReadObjectSpec().GetBucket(), req.GetReadObjectSpec().GetRoutingToken())}\n\t}\n\treturn []string{\"x-goog-request-params\", fmt.Sprintf(\"bucket=%s\", req.GetReadObjectSpec().GetBucket())}\n}\n\nfunc (c *grpcStorageClient) NewMultiRangeDownloader(ctx context.Context, params *newMultiRangeDownloaderParams, opts ...storageOption) (mr *MultiRangeDownloader, err error) {\n\tif !c.config.grpcBidiReads {\n\t\treturn nil, errors.New(\"storage: MultiRangeDownloader requires the experimental.WithGRPCBidiReads option\")\n\t}\n\n\tctx = trace.StartSpan(ctx, \"cloud.google.com/go/storage.grpcStorageClient.NewMultiRangeDownloader\")\n\tdefer func() { trace.EndSpan(ctx, err) }()\n\ts := callSettings(c.settings, opts...)\n\n\tif s.userProject != \"\" {\n\t\tctx = setUserProjectMetadata(ctx, s.userProject)\n\t}\n\n\tb := bucketResourceName(globalProjectAlias, params.bucket)\n\tobject := params.object\n\tbidiObject := &storagepb.BidiReadObjectSpec{\n\t\tBucket:                    b,\n\t\tObject:                    object,\n\t\tCommonObjectRequestParams: toProtoCommonObjectRequestParams(params.encryptionKey),\n\t}\n\n\t// The default is a negative value, which means latest.\n\tif params.gen >= 0 {\n\t\tbidiObject.Generation = params.gen\n\t}\n\n\tif params.handle != nil && len(*params.handle) != 0 {\n\t\tbidiObject.ReadHandle = &storagepb.BidiReadHandle{\n\t\t\tHandle: *params.handle,\n\t\t}\n\t}\n\treq := &storagepb.BidiReadObjectRequest{\n\t\tReadObjectSpec: bidiObject,\n\t}\n\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, contextMetadataFromBidiReadObject(req)...)\n\n\topenStream := func(readHandle ReadHandle) (*bidiReadStreamResponse, context.CancelFunc, error) {\n\t\tif err := applyCondsProto(\"grpcStorageClient.BidiReadObject\", params.gen, params.conds, bidiObject); err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\t\tif len(readHandle) != 0 {\n\t\t\treq.GetReadObjectSpec().ReadHandle = &storagepb.BidiReadHandle{\n\t\t\t\tHandle: readHandle,\n\t\t\t}\n\t\t}\n\t\tvar stream storagepb.Storage_BidiReadObjectClient\n\t\tvar resp *storagepb.BidiReadObjectResponse\n\t\tcc, cancel := context.WithCancel(ctx)\n\t\terr = run(cc, func(ctx context.Context) error {\n\t\t\tstream, err = c.raw.BidiReadObject(ctx, s.gax...)\n\t\t\tif err != nil {\n\t\t\t\t// BidiReadObjectRedirectedError error is only returned on initial open in case of a redirect.\n\t\t\t\t// The routing token that should be used when reopening the read stream. Needs to be exported.\n\t\t\t\trpcStatus := status.Convert(err)\n\t\t\t\tdetails := rpcStatus.Details()\n\t\t\t\tfor _, detail := range details {\n\t\t\t\t\tif bidiError, ok := detail.(*storagepb.BidiReadObjectRedirectedError); ok {\n\t\t\t\t\t\tbidiObject.ReadHandle = bidiError.ReadHandle\n\t\t\t\t\t\tbidiObject.RoutingToken = bidiError.RoutingToken\n\t\t\t\t\t\treq.ReadObjectSpec = bidiObject\n\t\t\t\t\t\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, contextMetadataFromBidiReadObject(req)...)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn err\n\t\t\t}\n\t\t\t// Incase stream opened succesfully, send first message on the stream.\n\t\t\t// First message to stream should contain read_object_spec\n\t\t\terr = stream.Send(req)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tresp, err = stream.Recv()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treturn nil\n\t\t}, s.retry, s.idempotent)\n\t\tif err != nil {\n\t\t\t// Close the stream context we just created to ensure we don't leak\n\t\t\t// resources.\n\t\t\tcancel()\n\t\t\treturn nil, nil, err\n\t\t}\n\t\treturn &bidiReadStreamResponse{stream: stream, response: resp}, cancel, nil\n\t}\n\n\t// For the first time open stream without adding any range.\n\tresp, cancel, err := openStream(nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// The first message was Recv'd on stream open, use it to populate the\n\t// object metadata.\n\tmsg := resp.response\n\tobj := msg.GetMetadata()\n\t// This is the size of the entire object, even if only a range was requested.\n\tsize := obj.GetSize()\n\n\tmrd := &gRPCBidiReader{\n\t\tstream:           resp.stream,\n\t\tcancel:           cancel,\n\t\tsettings:         s,\n\t\treadHandle:       msg.GetReadHandle().GetHandle(),\n\t\treadIDGenerator:  &readIDGenerator{},\n\t\treopen:           openStream,\n\t\treadSpec:         bidiObject,\n\t\trangesToRead:     make(chan []mrdRange, 100),\n\t\tctx:              ctx,\n\t\tcloseReceiver:    make(chan bool, 10),\n\t\tcloseSender:      make(chan bool, 10),\n\t\tsenderRetry:      make(chan bool), // create unbuffered channel for closing the streamManager goroutine.\n\t\treceiverRetry:    make(chan bool), // create unbuffered channel for closing the streamReceiver goroutine.\n\t\tactiveRanges:     make(map[int64]mrdRange),\n\t\tdone:             false,\n\t\tnumActiveRanges:  0,\n\t\tstreamRecreation: false,\n\t}\n\n\t// sender receives ranges from user adds and requests these ranges from GCS.\n\tsender := func() {\n\t\tvar currentSpec []mrdRange\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-mrd.ctx.Done():\n\t\t\t\tmrd.mu.Lock()\n\t\t\t\tmrd.done = true\n\t\t\t\tmrd.mu.Unlock()\n\t\t\t\treturn\n\t\t\tcase <-mrd.senderRetry:\n\t\t\t\treturn\n\t\t\tcase <-mrd.closeSender:\n\t\t\t\tmrd.mu.Lock()\n\t\t\t\tif len(mrd.activeRanges) != 0 {\n\t\t\t\t\tfor key := range mrd.activeRanges {\n\t\t\t\t\t\tmrd.activeRanges[key].callback(mrd.activeRanges[key].offset, mrd.activeRanges[key].totalBytesWritten, fmt.Errorf(\"stream closed early\"))\n\t\t\t\t\t\tdelete(mrd.activeRanges, key)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmrd.numActiveRanges = 0\n\t\t\t\tmrd.mu.Unlock()\n\t\t\t\treturn\n\t\t\tcase currentSpec = <-mrd.rangesToRead:\n\t\t\t\tvar readRanges []*storagepb.ReadRange\n\t\t\t\tvar err error\n\t\t\t\tmrd.mu.Lock()\n\t\t\t\tfor _, v := range currentSpec {\n\t\t\t\t\tmrd.activeRanges[v.readID] = v\n\t\t\t\t\treadRanges = append(readRanges, &storagepb.ReadRange{ReadOffset: v.offset, ReadLength: v.limit, ReadId: v.readID})\n\t\t\t\t}\n\t\t\t\tmrd.mu.Unlock()\n\t\t\t\t// We can just send 100 request to gcs in one request.\n\t\t\t\t// In case of Add we will send only one range request to gcs but in case of retry we can have more than 100 ranges.\n\t\t\t\t// Hence be will divide the request in chunk of 100.\n\t\t\t\t// For example with 457 ranges on stream we will have 5 request to gcs [0:99], [100:199], [200:299], [300:399], [400:456]\n\t\t\t\trequestCount := len(readRanges) / 100\n\t\t\t\tif len(readRanges)%100 != 0 {\n\t\t\t\t\trequestCount++\n\t\t\t\t}\n\t\t\t\tfor i := 0; i < requestCount; i++ {\n\t\t\t\t\tstart := i * 100\n\t\t\t\t\tend := (i + 1) * 100\n\t\t\t\t\tif end > len(readRanges) {\n\t\t\t\t\t\tend = len(readRanges)\n\t\t\t\t\t}\n\t\t\t\t\tcurReq := readRanges[start:end]\n\t\t\t\t\terr = mrd.stream.Send(&storagepb.BidiReadObjectRequest{\n\t\t\t\t\t\tReadRanges: curReq,\n\t\t\t\t\t})\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t// cancel stream and reopen the stream again.\n\t\t\t\t\t\t// Incase again an error is thrown close the streamManager goroutine.\n\t\t\t\t\t\tmrd.retrier(err, \"manager\")\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t}\n\n\t// receives ranges responses on the stream and executes the callback.\n\treceiver := func() {\n\t\tvar resp *storagepb.BidiReadObjectResponse\n\t\tvar err error\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-mrd.ctx.Done():\n\t\t\t\tmrd.done = true\n\t\t\t\treturn\n\t\t\tcase <-mrd.receiverRetry:\n\t\t\t\treturn\n\t\t\tcase <-mrd.closeReceiver:\n\t\t\t\treturn\n\t\t\tdefault:\n\t\t\t\t// This function reads the data sent for a particular range request and has a callback\n\t\t\t\t// to indicate that output buffer is filled.\n\t\t\t\tresp, err = mrd.stream.Recv()\n\t\t\t\tif resp.GetReadHandle().GetHandle() != nil {\n\t\t\t\t\tmrd.readHandle = resp.GetReadHandle().GetHandle()\n\t\t\t\t}\n\t\t\t\tif err == io.EOF {\n\t\t\t\t\terr = nil\n\t\t\t\t}\n\t\t\t\tif err != nil {\n\t\t\t\t\t// cancel stream and reopen the stream again.\n\t\t\t\t\t// Incase again an error is thrown close the streamManager goroutine.\n\t\t\t\t\tmrd.retrier(err, \"receiver\")\n\t\t\t\t}\n\n\t\t\t\tif err == nil {\n\t\t\t\t\tmrd.mu.Lock()\n\t\t\t\t\tif len(mrd.activeRanges) == 0 && mrd.numActiveRanges == 0 {\n\t\t\t\t\t\tmrd.closeReceiver <- true\n\t\t\t\t\t\tmrd.closeSender <- true\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tmrd.mu.Unlock()\n\t\t\t\t\tarr := resp.GetObjectDataRanges()\n\t\t\t\t\tfor _, val := range arr {\n\t\t\t\t\t\tid := val.GetReadRange().GetReadId()\n\t\t\t\t\t\tmrd.mu.Lock()\n\t\t\t\t\t\t_, ok := mrd.activeRanges[id]\n\t\t\t\t\t\tif !ok {\n\t\t\t\t\t\t\t// it's ok to ignore responses for read_id not in map as user would have been notified by callback.\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_, err = mrd.activeRanges[id].writer.Write(val.GetChecksummedData().GetContent())\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\tmrd.activeRanges[id].callback(mrd.activeRanges[id].offset, mrd.activeRanges[id].totalBytesWritten, err)\n\t\t\t\t\t\t\tmrd.numActiveRanges--\n\t\t\t\t\t\t\tdelete(mrd.activeRanges, id)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmrd.activeRanges[id] = mrdRange{\n\t\t\t\t\t\t\t\treadID:              mrd.activeRanges[id].readID,\n\t\t\t\t\t\t\t\twriter:              mrd.activeRanges[id].writer,\n\t\t\t\t\t\t\t\toffset:              mrd.activeRanges[id].offset,\n\t\t\t\t\t\t\t\tlimit:               mrd.activeRanges[id].limit,\n\t\t\t\t\t\t\t\tcurrentBytesWritten: mrd.activeRanges[id].currentBytesWritten + int64(len(val.GetChecksummedData().GetContent())),\n\t\t\t\t\t\t\t\ttotalBytesWritten:   mrd.activeRanges[id].totalBytesWritten + int64(len(val.GetChecksummedData().GetContent())),\n\t\t\t\t\t\t\t\tcallback:            mrd.activeRanges[id].callback,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif val.GetRangeEnd() {\n\t\t\t\t\t\t\tmrd.activeRanges[id].callback(mrd.activeRanges[id].offset, mrd.activeRanges[id].totalBytesWritten, nil)\n\t\t\t\t\t\t\tmrd.numActiveRanges--\n\t\t\t\t\t\t\tdelete(mrd.activeRanges, id)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmrd.mu.Unlock()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tmrd.retrier = func(err error, thread string) {\n\t\tmrd.mu.Lock()\n\t\tif !mrd.streamRecreation {\n\t\t\tmrd.streamRecreation = true\n\t\t} else {\n\t\t\tmrd.mu.Unlock()\n\t\t\treturn\n\t\t}\n\t\tmrd.mu.Unlock()\n\t\t// close both the go routines to make the stream recreation syncronous.\n\t\tif thread == \"receiver\" {\n\t\t\tmrd.senderRetry <- true\n\t\t} else {\n\t\t\tmrd.receiverRetry <- true\n\t\t}\n\t\terr = mrd.retryStream(err)\n\t\tif err != nil {\n\t\t\tmrd.mu.Lock()\n\t\t\tfor key := range mrd.activeRanges {\n\t\t\t\tmrd.activeRanges[key].callback(mrd.activeRanges[key].offset, mrd.activeRanges[key].totalBytesWritten, err)\n\t\t\t\tdelete(mrd.activeRanges, key)\n\t\t\t}\n\t\t\t// In case we hit an permanent error, delete entries from map and remove active tasks.\n\t\t\tmrd.numActiveRanges = 0\n\t\t\tmrd.mu.Unlock()\n\t\t\tmrd.close()\n\t\t} else {\n\t\t\t// If stream recreation happened successfully lets again start\n\t\t\t// both the goroutine making the whole flow asynchronous again.\n\t\t\tif thread == \"receiver\" {\n\t\t\t\tgo sender()\n\t\t\t} else {\n\t\t\t\tgo receiver()\n\t\t\t}\n\t\t}\n\t\tmrd.mu.Lock()\n\t\tmrd.streamRecreation = false\n\t\tmrd.mu.Unlock()\n\t}\n\n\tmrd.mu.Lock()\n\tmrd.objectSize = size\n\tmrd.mu.Unlock()\n\n\tgo sender()\n\tgo receiver()\n\n\treturn &MultiRangeDownloader{\n\t\tAttrs: ReaderObjectAttrs{\n\t\t\tSize:            size,\n\t\t\tContentType:     obj.GetContentType(),\n\t\t\tContentEncoding: obj.GetContentEncoding(),\n\t\t\tCacheControl:    obj.GetCacheControl(),\n\t\t\tLastModified:    obj.GetUpdateTime().AsTime(),\n\t\t\tMetageneration:  obj.GetMetageneration(),\n\t\t\tGeneration:      obj.GetGeneration(),\n\t\t},\n\t\treader: mrd,\n\t}, nil\n}\n\ntype gRPCBidiReader struct {\n\tctx             context.Context\n\tstream          storagepb.Storage_BidiReadObjectClient\n\tcancel          context.CancelFunc\n\tsettings        *settings\n\treadHandle      ReadHandle\n\treadIDGenerator *readIDGenerator\n\treopen          func(ReadHandle) (*bidiReadStreamResponse, context.CancelFunc, error)\n\treadSpec        *storagepb.BidiReadObjectSpec\n\tobjectSize      int64 // always use the mutex when accessing this variable\n\tcloseReceiver   chan bool\n\tcloseSender     chan bool\n\tsenderRetry     chan bool\n\treceiverRetry   chan bool\n\t// rangesToRead are ranges that have not yet been sent or have been sent but\n\t// must be retried.\n\trangesToRead chan []mrdRange\n\t// activeRanges are ranges that are currently being sent or are waiting for\n\t// a response from GCS.\n\tactiveRanges     map[int64]mrdRange // always use the mutex when accessing the map\n\tnumActiveRanges  int64              // always use the mutex when accessing this variable\n\tdone             bool               // always use the mutex when accessing this variable, indicates whether stream is closed or not.\n\tmu               sync.Mutex         // protects all vars in gRPCBidiReader from concurrent access\n\tretrier          func(error, string)\n\tstreamRecreation bool // This helps us identify if stream recreation is in progress or not. If stream recreation gets called from two goroutine then this will stop second one.\n}\n\nfunc (mrd *gRPCBidiReader) activeRange() []mrdRange {\n\tmrd.mu.Lock()\n\tdefer mrd.mu.Unlock()\n\tvar activeRange []mrdRange\n\tfor k, v := range mrd.activeRanges {\n\t\tactiveRange = append(activeRange, mrdRange{\n\t\t\treadID:              k,\n\t\t\twriter:              v.writer,\n\t\t\toffset:              (v.offset + v.currentBytesWritten),\n\t\t\tlimit:               v.limit - v.currentBytesWritten,\n\t\t\tcallback:            v.callback,\n\t\t\tcurrentBytesWritten: 0,\n\t\t\ttotalBytesWritten:   v.totalBytesWritten,\n\t\t})\n\t\tmrd.activeRanges[k] = activeRange[len(activeRange)-1]\n\t}\n\treturn activeRange\n}\n\n// retryStream cancel's stream and reopen the stream again.\nfunc (mrd *gRPCBidiReader) retryStream(err error) error {\n\tif mrd.settings.retry.runShouldRetry(err) {\n\t\t// This will \"close\" the existing stream and immediately attempt to\n\t\t// reopen the stream, but will backoff if further attempts are necessary.\n\t\t// When Reopening the stream only failed readID will be added to stream.\n\t\treturn mrd.reopenStream(mrd.activeRange())\n\t}\n\treturn err\n}\n\n// reopenStream \"closes\" the existing stream and attempts to reopen a stream and\n// sets the Reader's stream and cancelStream properties in the process.\nfunc (mrd *gRPCBidiReader) reopenStream(failSpec []mrdRange) error {\n\t// Close existing stream and initialize new stream with updated offset.\n\tif mrd.cancel != nil {\n\t\tmrd.cancel()\n\t}\n\n\tres, cancel, err := mrd.reopen(mrd.readHandle)\n\tif err != nil {\n\t\treturn err\n\t}\n\tmrd.stream = res.stream\n\tmrd.cancel = cancel\n\tmrd.readHandle = res.response.GetReadHandle().GetHandle()\n\tif failSpec != nil {\n\t\tmrd.rangesToRead <- failSpec\n\t}\n\treturn nil\n}\n\n// Add will add current range to stream.\nfunc (mrd *gRPCBidiReader) add(output io.Writer, offset, limit int64, callback func(int64, int64, error)) {\n\tmrd.mu.Lock()\n\tobjectSize := mrd.objectSize\n\tmrd.mu.Unlock()\n\n\tif offset > objectSize {\n\t\tcallback(offset, 0, fmt.Errorf(\"storage: offset should not be larger than the size of object (%v)\", objectSize))\n\t\treturn\n\t}\n\tif limit < 0 {\n\t\tcallback(offset, 0, errors.New(\"storage: cannot add range because the limit cannot be negative\"))\n\t\treturn\n\t}\n\n\tid := mrd.readIDGenerator.Next()\n\tif !mrd.done {\n\t\tspec := mrdRange{readID: id, writer: output, offset: offset, limit: limit, currentBytesWritten: 0, totalBytesWritten: 0, callback: callback}\n\t\tmrd.mu.Lock()\n\t\tmrd.numActiveRanges++\n\t\tmrd.rangesToRead <- []mrdRange{spec}\n\t\tmrd.mu.Unlock()\n\t} else {\n\t\tcallback(offset, 0, errors.New(\"storage: cannot add range because the stream is closed\"))\n\t}\n}\n\nfunc (mrd *gRPCBidiReader) wait() {\n\tmrd.mu.Lock()\n\t// we should wait until there is active task or an entry in the map.\n\t// there can be a scenario we have nothing in map for a moment or too but still have active task.\n\t// hence in case we have permanent errors we reduce active task to 0 so that this does not block wait.\n\tkeepWaiting := len(mrd.activeRanges) != 0 || mrd.numActiveRanges != 0\n\tmrd.mu.Unlock()\n\n\tfor keepWaiting {\n\t\tmrd.mu.Lock()\n\t\tkeepWaiting = len(mrd.activeRanges) != 0 || mrd.numActiveRanges != 0\n\t\tmrd.mu.Unlock()\n\t}\n}\n\n// Close will notify stream manager goroutine that the reader has been closed, if it's still running.\nfunc (mrd *gRPCBidiReader) close() error {\n\tif mrd.cancel != nil {\n\t\tmrd.cancel()\n\t}\n\tmrd.mu.Lock()\n\tmrd.done = true\n\tmrd.numActiveRanges = 0\n\tmrd.mu.Unlock()\n\tmrd.closeReceiver <- true\n\tmrd.closeSender <- true\n\treturn nil\n}\n\nfunc (mrd *gRPCBidiReader) getHandle() []byte {\n\treturn mrd.readHandle\n}\n\nfunc (mrd *gRPCBidiReader) error() error {\n\tmrd.mu.Lock()\n\tdefer mrd.mu.Unlock()\n\tif mrd.done {\n\t\treturn errors.New(\"storage: stream is permanently closed\")\n\t}\n\treturn nil\n}\n\ntype mrdRange struct {\n\treadID              int64\n\twriter              io.Writer\n\toffset              int64\n\tlimit               int64\n\tcurrentBytesWritten int64\n\ttotalBytesWritten   int64\n\tcallback            func(int64, int64, error)\n}\n\nfunc (c *grpcStorageClient) NewRangeReader(ctx context.Context, params *newRangeReaderParams, opts ...storageOption) (r *Reader, err error) {\n\t// If bidi reads was not selected, use the legacy read object API.\n\tif !c.config.grpcBidiReads {\n\t\treturn c.NewRangeReaderReadObject(ctx, params, opts...)\n\t}\n\n\tctx = trace.StartSpan(ctx, \"cloud.google.com/go/storage.grpcStorageClient.NewRangeReader\")\n\tdefer func() { trace.EndSpan(ctx, err) }()\n\n\ts := callSettings(c.settings, opts...)\n\n\ts.gax = append(s.gax, gax.WithGRPCOptions(\n\t\tgrpc.ForceCodecV2(bytesCodecV2{}),\n\t))\n\n\tif s.userProject != \"\" {\n\t\tctx = setUserProjectMetadata(ctx, s.userProject)\n\t}\n\n\tb := bucketResourceName(globalProjectAlias, params.bucket)\n\n\t// Create a BidiReadObjectRequest.\n\tspec := &storagepb.BidiReadObjectSpec{\n\t\tBucket:                    b,\n\t\tObject:                    params.object,\n\t\tCommonObjectRequestParams: toProtoCommonObjectRequestParams(params.encryptionKey),\n\t}\n\tif err := applyCondsProto(\"gRPCReader.NewRangeReader\", params.gen, params.conds, spec); err != nil {\n\t\treturn nil, err\n\t}\n\tif params.handle != nil && len(*params.handle) != 0 {\n\t\tspec.ReadHandle = &storagepb.BidiReadHandle{\n\t\t\tHandle: *params.handle,\n\t\t}\n\t}\n\treq := &storagepb.BidiReadObjectRequest{\n\t\tReadObjectSpec: spec,\n\t}\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, contextMetadataFromBidiReadObject(req)...)\n\n\t// Define a function that initiates a Read with offset and length, assuming\n\t// we have already read seen bytes.\n\treopen := func(seen int64) (*readStreamResponse, context.CancelFunc, error) {\n\t\t// If the context has already expired, return immediately without making\n\t\t// we call.\n\t\tif err := ctx.Err(); err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\n\t\tcc, cancel := context.WithCancel(ctx)\n\n\t\t// BidiReadObject can take multiple ranges, but we just request one in this case.\n\t\treadRange := &storagepb.ReadRange{\n\t\t\tReadOffset: params.offset + seen,\n\t\t\tReadId:     1,\n\t\t}\n\n\t\t// Only set a ReadLength if length is greater than zero, because <= 0 means\n\t\t// to read it all.\n\t\tif params.length > 0 {\n\t\t\treadRange.ReadLength = params.length - seen\n\t\t}\n\n\t\treq.ReadRanges = []*storagepb.ReadRange{readRange}\n\n\t\tvar stream storagepb.Storage_BidiReadObjectClient\n\t\tvar err error\n\t\tvar decoder *readResponseDecoder\n\n\t\terr = run(cc, func(ctx context.Context) error {\n\t\t\tstream, err = c.raw.BidiReadObject(ctx, s.gax...)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif err := stream.Send(req); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\t// Oneshot reads can close the client->server side immediately.\n\t\t\tif err := stream.CloseSend(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Receive the message into databuf as a wire-encoded message so we can\n\t\t\t// use a custom decoder to avoid an extra copy at the protobuf layer.\n\t\t\tdatabufs := mem.BufferSlice{}\n\t\t\terr := stream.RecvMsg(&databufs)\n\t\t\t// These types of errors show up on the RecvMsg call, rather than the\n\t\t\t// initialization of the stream via BidiReadObject above.\n\t\t\tif s, ok := status.FromError(err); ok && s.Code() == codes.NotFound {\n\t\t\t\treturn formatObjectErr(err)\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\t// Use a custom decoder that uses protobuf unmarshalling for all\n\t\t\t// fields except the object data. Object data is handled separately\n\t\t\t// to avoid a copy.\n\t\t\tdecoder = &readResponseDecoder{\n\t\t\t\tdatabufs: databufs,\n\t\t\t}\n\t\t\terr = decoder.readFullObjectResponse()\n\t\t\treturn err\n\t\t}, s.retry, s.idempotent)\n\t\tif err != nil {\n\t\t\t// Close the stream context we just created to ensure we don't leak\n\t\t\t// resources.\n\t\t\tcancel()\n\t\t\t// Free any buffers.\n\t\t\tif decoder != nil && decoder.databufs != nil {\n\t\t\t\tdecoder.databufs.Free()\n\t\t\t}\n\t\t\treturn nil, nil, err\n\t\t}\n\n\t\treturn &readStreamResponse{\n\t\t\tstream:  stream,\n\t\t\tdecoder: decoder,\n\t\t}, cancel, nil\n\t}\n\n\tres, cancel, err := reopen(0)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// The first message was Recv'd on stream open, use it to populate the\n\t// object metadata and read handle.\n\tmsg := res.decoder.msg\n\tobj := msg.GetMetadata()\n\thandle := ReadHandle(msg.GetReadHandle().GetHandle())\n\t// This is the size of the entire object, even if only a range was requested.\n\tsize := obj.GetSize()\n\n\t// Only support checksums when reading an entire object, not a range.\n\tvar (\n\t\twantCRC  uint32\n\t\tcheckCRC bool\n\t)\n\tif checksums := obj.GetChecksums(); checksums != nil && checksums.Crc32C != nil {\n\t\tif params.offset == 0 && params.length < 0 {\n\t\t\tcheckCRC = true\n\t\t}\n\t\twantCRC = checksums.GetCrc32C()\n\t}\n\n\tstartOffset := params.offset\n\tif params.offset < 0 {\n\t\tstartOffset = size + params.offset\n\t}\n\n\t// The remaining bytes are the lesser of the requested range and all bytes\n\t// after params.offset.\n\tlength := params.length\n\tif params.length > size || params.length < 0 {\n\t\t// if params.length < 0 (or larger than object size),\n\t\t// all remaining bytes were requested.\n\t\tlength = size\n\t}\n\tremain := length - startOffset\n\n\tmetadata := obj.GetMetadata()\n\tr = &Reader{\n\t\tAttrs: ReaderObjectAttrs{\n\t\t\tSize:            size,\n\t\t\tStartOffset:     startOffset,\n\t\t\tContentType:     obj.GetContentType(),\n\t\t\tContentEncoding: obj.GetContentEncoding(),\n\t\t\tCacheControl:    obj.GetCacheControl(),\n\t\t\tLastModified:    obj.GetUpdateTime().AsTime(),\n\t\t\tMetageneration:  obj.GetMetageneration(),\n\t\t\tGeneration:      obj.GetGeneration(),\n\t\t\tCRC32C:          wantCRC,\n\t\t},\n\t\tobjectMetadata: &metadata,\n\t\treader: &gRPCReader{\n\t\t\tstream: res.stream,\n\t\t\treopen: reopen,\n\t\t\tcancel: cancel,\n\t\t\tsize:   size,\n\t\t\t// Preserve the decoder to read out object data when Read/WriteTo is called.\n\t\t\tcurrMsg:   res.decoder,\n\t\t\tsettings:  s,\n\t\t\tzeroRange: params.length == 0,\n\t\t\twantCRC:   wantCRC,\n\t\t\tcheckCRC:  checkCRC,\n\t\t},\n\t\tcheckCRC: checkCRC,\n\t\thandle:   &handle,\n\t\tremain:   remain,\n\t}\n\n\t// For a zero-length request, explicitly close the stream and set remaining\n\t// bytes to zero.\n\tif params.length == 0 {\n\t\tr.remain = 0\n\t\tr.reader.Close()\n\t}\n\n\treturn r, nil\n}\n\n// IAM methods.\n\nfunc (c *grpcStorageClient) GetIamPolicy(ctx context.Context, resource string, version int32, opts ...storageOption) (*iampb.Policy, error) {\n\t// TODO: Need a way to set UserProject, potentially in X-Goog-User-Project system parameter.\n\ts := callSettings(c.settings, opts...)\n\treq := &iampb.GetIamPolicyRequest{\n\t\tResource: bucketResourceName(globalProjectAlias, resource),\n\t\tOptions: &iampb.GetPolicyOptions{\n\t\t\tRequestedPolicyVersion: version,\n\t\t},\n\t}\n\tvar rp *iampb.Policy\n\terr := run(ctx, func(ctx context.Context) error {\n\t\tvar err error\n\t\trp, err = c.raw.GetIamPolicy(ctx, req, s.gax...)\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\n\treturn rp, err\n}\n\nfunc (c *grpcStorageClient) SetIamPolicy(ctx context.Context, resource string, policy *iampb.Policy, opts ...storageOption) error {\n\t// TODO: Need a way to set UserProject, potentially in X-Goog-User-Project system parameter.\n\ts := callSettings(c.settings, opts...)\n\n\treq := &iampb.SetIamPolicyRequest{\n\t\tResource: bucketResourceName(globalProjectAlias, resource),\n\t\tPolicy:   policy,\n\t}\n\n\treturn run(ctx, func(ctx context.Context) error {\n\t\t_, err := c.raw.SetIamPolicy(ctx, req, s.gax...)\n\t\treturn err\n\t}, s.retry, s.idempotent)\n}\n\nfunc (c *grpcStorageClient) TestIamPermissions(ctx context.Context, resource string, permissions []string, opts ...storageOption) ([]string, error) {\n\t// TODO: Need a way to set UserProject, potentially in X-Goog-User-Project system parameter.\n\ts := callSettings(c.settings, opts...)\n\treq := &iampb.TestIamPermissionsRequest{\n\t\tResource:    bucketResourceName(globalProjectAlias, resource),\n\t\tPermissions: permissions,\n\t}\n\tvar res *iampb.TestIamPermissionsResponse\n\terr := run(ctx, func(ctx context.Context) error {\n\t\tvar err error\n\t\tres, err = c.raw.TestIamPermissions(ctx, req, s.gax...)\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn res.Permissions, nil\n}\n\n// HMAC Key methods are not implemented in gRPC client.\n\nfunc (c *grpcStorageClient) GetHMACKey(ctx context.Context, project, accessID string, opts ...storageOption) (*HMACKey, error) {\n\treturn nil, errMethodNotSupported\n}\n\nfunc (c *grpcStorageClient) ListHMACKeys(ctx context.Context, project, serviceAccountEmail string, showDeletedKeys bool, opts ...storageOption) *HMACKeysIterator {\n\tit := &HMACKeysIterator{\n\t\tctx:       ctx,\n\t\tprojectID: \"\",\n\t\tretry:     nil,\n\t}\n\tfetch := func(_ int, _ string) (token string, err error) {\n\t\treturn \"\", errMethodNotSupported\n\t}\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(\n\t\tfetch,\n\t\tfunc() int { return 0 },\n\t\tfunc() interface{} { return nil },\n\t)\n\treturn it\n}\n\nfunc (c *grpcStorageClient) UpdateHMACKey(ctx context.Context, project, serviceAccountEmail, accessID string, attrs *HMACKeyAttrsToUpdate, opts ...storageOption) (*HMACKey, error) {\n\treturn nil, errMethodNotSupported\n}\n\nfunc (c *grpcStorageClient) CreateHMACKey(ctx context.Context, project, serviceAccountEmail string, opts ...storageOption) (*HMACKey, error) {\n\treturn nil, errMethodNotSupported\n}\n\nfunc (c *grpcStorageClient) DeleteHMACKey(ctx context.Context, project string, accessID string, opts ...storageOption) error {\n\treturn errMethodNotSupported\n}\n\n// Notification methods are not implemented in gRPC client.\n\nfunc (c *grpcStorageClient) ListNotifications(ctx context.Context, bucket string, opts ...storageOption) (n map[string]*Notification, err error) {\n\treturn nil, errMethodNotSupported\n}\n\nfunc (c *grpcStorageClient) CreateNotification(ctx context.Context, bucket string, n *Notification, opts ...storageOption) (ret *Notification, err error) {\n\treturn nil, errMethodNotSupported\n}\n\nfunc (c *grpcStorageClient) DeleteNotification(ctx context.Context, bucket string, id string, opts ...storageOption) (err error) {\n\treturn errMethodNotSupported\n}\n\n// setUserProjectMetadata appends a project ID to the outgoing Context metadata\n// via the x-goog-user-project system parameter defined at\n// https://cloud.google.com/apis/docs/system-parameters. This is only for\n// billing purposes, and is generally optional, except for requester-pays\n// buckets.\nfunc setUserProjectMetadata(ctx context.Context, project string) context.Context {\n\treturn metadata.AppendToOutgoingContext(ctx, \"x-goog-user-project\", project)\n}\n\ntype readStreamResponse struct {\n\tstream  storagepb.Storage_BidiReadObjectClient\n\tdecoder *readResponseDecoder\n}\n\ntype bidiReadStreamResponse struct {\n\tstream   storagepb.Storage_BidiReadObjectClient\n\tresponse *storagepb.BidiReadObjectResponse\n}\n\n// gRPCReader is used by storage.Reader if the experimental option WithGRPCBidiReads is passed.\ntype gRPCReader struct {\n\tseen, size int64\n\tzeroRange  bool\n\tstream     storagepb.Storage_BidiReadObjectClient\n\treopen     func(seen int64) (*readStreamResponse, context.CancelFunc, error)\n\tleftovers  []byte\n\tcurrMsg    *readResponseDecoder // decoder for the current message\n\tcancel     context.CancelFunc\n\tsettings   *settings\n\tcheckCRC   bool   // should we check the CRC?\n\twantCRC    uint32 // the CRC32c value the server sent in the header\n\tgotCRC     uint32 // running crc\n}\n\n// Update the running CRC with the data in the slice, if CRC checking was enabled.\nfunc (r *gRPCReader) updateCRC(b []byte) {\n\tif r.checkCRC {\n\t\tr.gotCRC = crc32.Update(r.gotCRC, crc32cTable, b)\n\t}\n}\n\n// Checks whether the CRC matches at the conclusion of a read, if CRC checking was enabled.\nfunc (r *gRPCReader) runCRCCheck() error {\n\tif r.checkCRC && r.gotCRC != r.wantCRC {\n\t\treturn fmt.Errorf(\"storage: bad CRC on read: got %d, want %d\", r.gotCRC, r.wantCRC)\n\t}\n\treturn nil\n}\n\n// Read reads bytes into the user's buffer from an open gRPC stream.\nfunc (r *gRPCReader) Read(p []byte) (int, error) {\n\t// The entire object has been read by this reader, check the checksum if\n\t// necessary and return EOF.\n\tif r.size == r.seen || r.zeroRange {\n\t\tif err := r.runCRCCheck(); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\treturn 0, io.EOF\n\t}\n\n\t// No stream to read from, either never initialized or Close was called.\n\t// Note: There is a potential concurrency issue if multiple routines are\n\t// using the same reader. One encounters an error and the stream is closed\n\t// and then reopened while the other routine attempts to read from it.\n\tif r.stream == nil {\n\t\treturn 0, fmt.Errorf(\"storage: reader has been closed\")\n\t}\n\n\tvar n int\n\n\t// If there is data remaining in the current message, return what was\n\t// available to conform to the Reader\n\t// interface: https://pkg.go.dev/io#Reader.\n\tif !r.currMsg.done {\n\t\tn = r.currMsg.readAndUpdateCRC(p, func(b []byte) {\n\t\t\tr.updateCRC(b)\n\t\t})\n\t\tr.seen += int64(n)\n\t\treturn n, nil\n\t}\n\n\t// Attempt to Recv the next message on the stream.\n\t// This will update r.currMsg with the decoder for the new message.\n\terr := r.recv()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// TODO: Determine if we need to capture incremental CRC32C for this\n\t// chunk. The Object CRC32C checksum is captured when directed to read\n\t// the entire Object. If directed to read a range, we may need to\n\t// calculate the range's checksum for verification if the checksum is\n\t// present in the response here.\n\t// TODO: Figure out if we need to support decompressive transcoding\n\t// https://cloud.google.com/storage/docs/transcoding.\n\n\tn = r.currMsg.readAndUpdateCRC(p, func(b []byte) {\n\t\tr.updateCRC(b)\n\t})\n\tr.seen += int64(n)\n\treturn n, nil\n}\n\n// WriteTo writes all the data requested by the Reader into w, implementing\n// io.WriterTo.\nfunc (r *gRPCReader) WriteTo(w io.Writer) (int64, error) {\n\t// The entire object has been read by this reader, check the checksum if\n\t// necessary and return nil.\n\tif r.size == r.seen || r.zeroRange {\n\t\tif err := r.runCRCCheck(); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\treturn 0, nil\n\t}\n\n\t// No stream to read from, either never initialized or Close was called.\n\t// Note: There is a potential concurrency issue if multiple routines are\n\t// using the same reader. One encounters an error and the stream is closed\n\t// and then reopened while the other routine attempts to read from it.\n\tif r.stream == nil {\n\t\treturn 0, fmt.Errorf(\"storage: reader has been closed\")\n\t}\n\n\t// Track bytes written during before call.\n\tvar alreadySeen = r.seen\n\n\t// Write any already received message to the stream. There will be some leftovers from the\n\t// original NewRangeReader call.\n\tif r.currMsg != nil && !r.currMsg.done {\n\t\twritten, err := r.currMsg.writeToAndUpdateCRC(w, func(b []byte) {\n\t\t\tr.updateCRC(b)\n\t\t})\n\t\tr.seen += int64(written)\n\t\tr.currMsg = nil\n\t\tif err != nil {\n\t\t\treturn r.seen - alreadySeen, err\n\t\t}\n\t}\n\n\t// Loop and receive additional messages until the entire data is written.\n\tfor {\n\t\t// Attempt to receive the next message on the stream.\n\t\t// Will terminate with io.EOF once data has all come through.\n\t\t// recv() handles stream reopening and retry logic so no need for retries here.\n\t\terr := r.recv()\n\t\tif err != nil {\n\t\t\tif err == io.EOF {\n\t\t\t\t// We are done; check the checksum if necessary and return.\n\t\t\t\terr = r.runCRCCheck()\n\t\t\t}\n\t\t\treturn r.seen - alreadySeen, err\n\t\t}\n\n\t\t// TODO: Determine if we need to capture incremental CRC32C for this\n\t\t// chunk. The Object CRC32C checksum is captured when directed to read\n\t\t// the entire Object. If directed to read a range, we may need to\n\t\t// calculate the range's checksum for verification if the checksum is\n\t\t// present in the response here.\n\t\t// TODO: Figure out if we need to support decompressive transcoding\n\t\t// https://cloud.google.com/storage/docs/transcoding.\n\t\twritten, err := r.currMsg.writeToAndUpdateCRC(w, func(b []byte) {\n\t\t\tr.updateCRC(b)\n\t\t})\n\t\tr.seen += int64(written)\n\t\tif err != nil {\n\t\t\treturn r.seen - alreadySeen, err\n\t\t}\n\t}\n\n}\n\n// Close cancels the read stream's context in order for it to be closed and\n// collected, and frees any currently in use buffers.\nfunc (r *gRPCReader) Close() error {\n\tif r.cancel != nil {\n\t\tr.cancel()\n\t}\n\tr.currMsg = nil\n\treturn nil\n}\n\n// recv attempts to Recv the next message on the stream and extract the object\n// data that it contains. In the event that a retryable error is encountered,\n// the stream will be closed, reopened, and RecvMsg again.\n// This will attempt to Recv until one of the following is true:\n//\n// * Recv is successful\n// * A non-retryable error is encountered\n// * The Reader's context is canceled\n//\n// The last error received is the one that is returned, which could be from\n// an attempt to reopen the stream.\n\nfunc (r *gRPCReader) recv() error {\n\tdatabufs := mem.BufferSlice{}\n\terr := r.stream.RecvMsg(&databufs)\n\tif err != nil && r.settings.retry.runShouldRetry(err) {\n\t\t// This will \"close\" the existing stream and immediately attempt to\n\t\t// reopen the stream, but will backoff if further attempts are necessary.\n\t\t// Reopening the stream Recvs the first message, so if retrying is\n\t\t// successful, r.currMsg will be updated to include the new data.\n\t\treturn r.reopenStream()\n\t}\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tr.currMsg = &readResponseDecoder{databufs: databufs}\n\treturn r.currMsg.readFullObjectResponse()\n}\n\n// ReadObjectResponse field and subfield numbers.\nconst (\n\t// Top level fields.\n\tmetadataField        = protowire.Number(4)\n\tobjectRangeDataField = protowire.Number(6)\n\treadHandleField      = protowire.Number(7)\n\t// Nested in ObjectRangeData\n\tchecksummedDataField = protowire.Number(1)\n\treadRangeField       = protowire.Number(2)\n\trangeEndField        = protowire.Number(3)\n\t// Nested in ObjectRangeData.ChecksummedData\n\tchecksummedDataContentField = protowire.Number(1)\n\tchecksummedDataCRC32CField  = protowire.Number(2)\n)\n\n// readResponseDecoder is a wrapper on the raw message, used to decode one message\n// without copying object data. It also has methods to write out the resulting object\n// data to the user application.\ntype readResponseDecoder struct {\n\tdatabufs mem.BufferSlice // raw bytes of the message being processed\n\t// Decoding offsets\n\toff     uint64 // offset in the messsage relative to the data as a whole\n\tcurrBuf int    // index of the current buffer being processed\n\tcurrOff uint64 // offset in the current buffer\n\t// Processed data\n\tmsg         *storagepb.BidiReadObjectResponse // processed response message with all fields other than object data populated\n\tdataOffsets bufferSliceOffsets                // offsets of the object data in the message.\n\tdone        bool                              // true if the data has been completely read.\n}\n\ntype bufferSliceOffsets struct {\n\tstartBuf, endBuf int    // indices of start and end buffers of object data in the msg\n\tstartOff, endOff uint64 // offsets within these buffers where the data starts and ends.\n\tcurrBuf          int    // index of current buffer being read out to the user application.\n\tcurrOff          uint64 // offset of read in current buffer.\n}\n\n// peek ahead 10 bytes from the current offset in the databufs. This will return a\n// slice of the current buffer if the bytes are all in one buffer, but will copy\n// the bytes into a new buffer if the distance is split across buffers. Use this\n// to allow protowire methods to be used to parse tags & fixed values.\n// The max length of a varint tag is 10 bytes, see\n// https://protobuf.dev/programming-guides/encoding/#varints . Other int types\n// are shorter.\nfunc (d *readResponseDecoder) peek() []byte {\n\tb := d.databufs[d.currBuf].ReadOnlyData()\n\t// Check if the tag will fit in the current buffer. If not, copy the next 10\n\t// bytes into a new buffer to ensure that we can read the tag correctly\n\t// without it being divided between buffers.\n\ttagBuf := b[d.currOff:]\n\tremainingInBuf := len(tagBuf)\n\t// If we have less than 10 bytes remaining and are not in the final buffer,\n\t// copy up to 10 bytes ahead from the next buffer.\n\tif remainingInBuf < binary.MaxVarintLen64 && d.currBuf != len(d.databufs)-1 {\n\t\ttagBuf = d.copyNextBytes(10)\n\t}\n\treturn tagBuf\n}\n\n// Copies up to next n bytes into a new buffer, or fewer if fewer bytes remain in the\n// buffers overall. Does not advance offsets.\nfunc (d *readResponseDecoder) copyNextBytes(n int) []byte {\n\tremaining := n\n\tif r := d.databufs.Len() - int(d.off); r < remaining {\n\t\tremaining = r\n\t}\n\tcurrBuf := d.currBuf\n\tcurrOff := d.currOff\n\tvar buf []byte\n\tfor remaining > 0 {\n\t\tb := d.databufs[currBuf].ReadOnlyData()\n\t\tremainingInCurr := len(b[currOff:])\n\t\tif remainingInCurr < remaining {\n\t\t\tbuf = append(buf, b[currOff:]...)\n\t\t\tremaining -= remainingInCurr\n\t\t\tcurrBuf++\n\t\t\tcurrOff = 0\n\t\t} else {\n\t\t\tbuf = append(buf, b[currOff:currOff+uint64(remaining)]...)\n\t\t\tremaining = 0\n\t\t}\n\t}\n\treturn buf\n}\n\n// Advance current buffer & byte offset in the decoding by n bytes. Returns an error if we\n// go past the end of the data.\nfunc (d *readResponseDecoder) advanceOffset(n uint64) error {\n\tremaining := n\n\tfor remaining > 0 {\n\t\tremainingInCurr := uint64(d.databufs[d.currBuf].Len()) - d.currOff\n\t\tif remainingInCurr <= remaining {\n\t\t\tremaining -= remainingInCurr\n\t\t\td.currBuf++\n\t\t\td.currOff = 0\n\t\t} else {\n\t\t\td.currOff += remaining\n\t\t\tremaining = 0\n\t\t}\n\t}\n\t// If we have advanced past the end of the buffers, something went wrong.\n\tif (d.currBuf == len(d.databufs) && d.currOff > 0) || d.currBuf > len(d.databufs) {\n\t\treturn errors.New(\"decoding: truncated message, cannot advance offset\")\n\t}\n\td.off += n\n\treturn nil\n\n}\n\n// This copies object data from the message into the buffer and returns the number of\n// bytes copied. The data offsets are incremented in the message. The updateCRC\n// function is called on the copied bytes.\nfunc (d *readResponseDecoder) readAndUpdateCRC(p []byte, updateCRC func([]byte)) int {\n\t// For a completely empty message, just return 0\n\tif len(d.databufs) == 0 {\n\t\treturn 0\n\t}\n\tdatabuf := d.databufs[d.dataOffsets.currBuf]\n\tstartOff := d.dataOffsets.currOff\n\tvar b []byte\n\tif d.dataOffsets.currBuf == d.dataOffsets.endBuf {\n\t\tb = databuf.ReadOnlyData()[startOff:d.dataOffsets.endOff]\n\t} else {\n\t\tb = databuf.ReadOnlyData()[startOff:]\n\t}\n\tn := copy(p, b)\n\tupdateCRC(b[:n])\n\td.dataOffsets.currOff += uint64(n)\n\n\t// We've read all the data from this message. Free the underlying buffers.\n\tif d.dataOffsets.currBuf == d.dataOffsets.endBuf && d.dataOffsets.currOff == d.dataOffsets.endOff {\n\t\td.done = true\n\t\td.databufs.Free()\n\t}\n\t// We are at the end of the current buffer\n\tif d.dataOffsets.currBuf != d.dataOffsets.endBuf && d.dataOffsets.currOff == uint64(databuf.Len()) {\n\t\td.dataOffsets.currOff = 0\n\t\td.dataOffsets.currBuf++\n\t}\n\treturn n\n}\n\nfunc (d *readResponseDecoder) writeToAndUpdateCRC(w io.Writer, updateCRC func([]byte)) (int64, error) {\n\t// For a completely empty message, just return 0\n\tif len(d.databufs) == 0 {\n\t\treturn 0, nil\n\t}\n\tvar written int64\n\tfor !d.done {\n\t\tdatabuf := d.databufs[d.dataOffsets.currBuf]\n\t\tstartOff := d.dataOffsets.currOff\n\t\tvar b []byte\n\t\tif d.dataOffsets.currBuf == d.dataOffsets.endBuf {\n\t\t\tb = databuf.ReadOnlyData()[startOff:d.dataOffsets.endOff]\n\t\t} else {\n\t\t\tb = databuf.ReadOnlyData()[startOff:]\n\t\t}\n\t\tvar n int\n\t\t// Write all remaining data from the current buffer\n\t\tn, err := w.Write(b)\n\t\twritten += int64(n)\n\t\tupdateCRC(b)\n\t\tif err != nil {\n\t\t\treturn written, err\n\t\t}\n\t\td.dataOffsets.currOff = 0\n\t\t// We've read all the data from this message.\n\t\tif d.dataOffsets.currBuf == d.dataOffsets.endBuf {\n\t\t\td.done = true\n\t\t\td.databufs.Free()\n\t\t} else {\n\t\t\td.dataOffsets.currBuf++\n\t\t}\n\t}\n\treturn written, nil\n}\n\n// Consume the next available tag in the input data and return the field number and type.\n// Advances the relevant offsets in the data.\nfunc (d *readResponseDecoder) consumeTag() (protowire.Number, protowire.Type, error) {\n\ttagBuf := d.peek()\n\n\t// Consume the next tag. This will tell us which field is next in the\n\t// buffer, its type, and how much space it takes up.\n\tfieldNum, fieldType, tagLength := protowire.ConsumeTag(tagBuf)\n\tif tagLength < 0 {\n\t\treturn 0, 0, protowire.ParseError(tagLength)\n\t}\n\t// Update the offsets and current buffer depending on the tag length.\n\tif err := d.advanceOffset(uint64(tagLength)); err != nil {\n\t\treturn 0, 0, fmt.Errorf(\"consuming tag: %w\", err)\n\t}\n\treturn fieldNum, fieldType, nil\n}\n\n// Consume a varint that represents the length of a bytes field. Return the length of\n// the data, and advance the offsets by the length of the varint.\nfunc (d *readResponseDecoder) consumeVarint() (uint64, error) {\n\ttagBuf := d.peek()\n\n\t// Consume the next tag. This will tell us which field is next in the\n\t// buffer, its type, and how much space it takes up.\n\tdataLength, tagLength := protowire.ConsumeVarint(tagBuf)\n\tif tagLength < 0 {\n\t\treturn 0, protowire.ParseError(tagLength)\n\t}\n\n\t// Update the offsets and current buffer depending on the tag length.\n\td.advanceOffset(uint64(tagLength))\n\treturn dataLength, nil\n}\n\nfunc (d *readResponseDecoder) consumeFixed32() (uint32, error) {\n\tvalueBuf := d.peek()\n\n\t// Consume the next tag. This will tell us which field is next in the\n\t// buffer, its type, and how much space it takes up.\n\tvalue, tagLength := protowire.ConsumeFixed32(valueBuf)\n\tif tagLength < 0 {\n\t\treturn 0, protowire.ParseError(tagLength)\n\t}\n\n\t// Update the offsets and current buffer depending on the tag length.\n\td.advanceOffset(uint64(tagLength))\n\treturn value, nil\n}\n\nfunc (d *readResponseDecoder) consumeFixed64() (uint64, error) {\n\tvalueBuf := d.peek()\n\n\t// Consume the next tag. This will tell us which field is next in the\n\t// buffer, its type, and how much space it takes up.\n\tvalue, tagLength := protowire.ConsumeFixed64(valueBuf)\n\tif tagLength < 0 {\n\t\treturn 0, protowire.ParseError(tagLength)\n\t}\n\n\t// Update the offsets and current buffer depending on the tag length.\n\td.advanceOffset(uint64(tagLength))\n\treturn value, nil\n}\n\n// Consume any field values up to the end offset provided and don't return anything.\n// This is used to skip any values which are not going to be used.\n// msgEndOff is indexed in terms of the overall data across all buffers.\nfunc (d *readResponseDecoder) consumeFieldValue(fieldNum protowire.Number, fieldType protowire.Type) error {\n\t// reimplement protowire.ConsumeFieldValue without the extra case for groups (which\n\t// are are complicted and not a thing in proto3).\n\tvar err error\n\tswitch fieldType {\n\tcase protowire.VarintType:\n\t\t_, err = d.consumeVarint()\n\tcase protowire.Fixed32Type:\n\t\t_, err = d.consumeFixed32()\n\tcase protowire.Fixed64Type:\n\t\t_, err = d.consumeFixed64()\n\tcase protowire.BytesType:\n\t\t_, err = d.consumeBytes()\n\tdefault:\n\t\treturn fmt.Errorf(\"unknown field type %v in field %v\", fieldType, fieldNum)\n\t}\n\tif err != nil {\n\t\treturn fmt.Errorf(\"consuming field %v of type %v: %w\", fieldNum, fieldType, err)\n\t}\n\n\treturn nil\n}\n\n// Consume a bytes field from the input. Returns offsets for the data in the buffer slices\n// and an error.\nfunc (d *readResponseDecoder) consumeBytes() (bufferSliceOffsets, error) {\n\t// m is the length of the data past the tag.\n\tm, err := d.consumeVarint()\n\tif err != nil {\n\t\treturn bufferSliceOffsets{}, fmt.Errorf(\"consuming bytes field: %w\", err)\n\t}\n\toffsets := bufferSliceOffsets{\n\t\tstartBuf: d.currBuf,\n\t\tstartOff: d.currOff,\n\t\tcurrBuf:  d.currBuf,\n\t\tcurrOff:  d.currOff,\n\t}\n\n\t// Advance offsets to lengths of bytes field and capture where we end.\n\td.advanceOffset(m)\n\toffsets.endBuf = d.currBuf\n\toffsets.endOff = d.currOff\n\treturn offsets, nil\n}\n\n// Consume a bytes field from the input and copy into a new buffer if\n// necessary (if the data is split across buffers in databuf).  This can be\n// used to leverage proto.Unmarshal for small bytes fields (i.e. anything\n// except object data).\nfunc (d *readResponseDecoder) consumeBytesCopy() ([]byte, error) {\n\t// m is the length of the bytes data.\n\tm, err := d.consumeVarint()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"consuming varint: %w\", err)\n\t}\n\t// Copy the data into a buffer and advance the offset\n\tb := d.copyNextBytes(int(m))\n\tif err := d.advanceOffset(m); err != nil {\n\t\treturn nil, fmt.Errorf(\"advancing offset: %w\", err)\n\t}\n\treturn b, nil\n}\n\n// readFullObjectResponse returns the BidiReadObjectResponse that is encoded in the\n// wire-encoded message buffer b, or an error if the message is invalid.\n// This must be used on the first recv of an object as it may contain all fields\n// of BidiReadObjectResponse, and we use or pass on those fields to the user.\n// This function is essentially identical to proto.Unmarshal, except it aliases\n// the data in the input []byte. If the proto library adds a feature to\n// Unmarshal that does that, this function can be dropped.\nfunc (d *readResponseDecoder) readFullObjectResponse() error {\n\tmsg := &storagepb.BidiReadObjectResponse{}\n\n\t// Loop over the entire message, extracting fields as we go. This does not\n\t// handle field concatenation, in which the contents of a single field\n\t// are split across multiple protobuf tags.\n\tfor d.off < uint64(d.databufs.Len()) {\n\t\tfieldNum, fieldType, err := d.consumeTag()\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"consuming next tag: %w\", err)\n\t\t}\n\n\t\t// Unmarshal the field according to its type. Only fields that are not\n\t\t// nil will be present.\n\t\tswitch {\n\t\t// This is a repeated field, so it can occur more than once. But, for now\n\t\t// we can just take the first range per message since Reader only requests\n\t\t// a single range.\n\t\t// See https://protobuf.dev/programming-guides/encoding/#optional\n\t\t// TODO: support multiple ranges once integrated with MultiRangeDownloader.\n\t\tcase fieldNum == objectRangeDataField && fieldType == protowire.BytesType:\n\t\t\t// The object data field was found. Initialize the data ranges assuming\n\t\t\t// exactly one range in the message.\n\t\t\tmsg.ObjectDataRanges = []*storagepb.ObjectRangeData{{ChecksummedData: &storagepb.ChecksummedData{}, ReadRange: &storagepb.ReadRange{}}}\n\t\t\tbytesFieldLen, err := d.consumeVarint()\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"consuming bytes: %w\", err)\n\t\t\t}\n\t\t\tvar contentEndOff = d.off + bytesFieldLen\n\t\t\tfor d.off < contentEndOff {\n\t\t\t\tgotNum, gotTyp, err := d.consumeTag()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"consuming objectRangeData tag: %w\", err)\n\t\t\t\t}\n\n\t\t\t\tswitch {\n\t\t\t\tcase gotNum == checksummedDataField && gotTyp == protowire.BytesType:\n\t\t\t\t\tchecksummedDataFieldLen, err := d.consumeVarint()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn fmt.Errorf(\"consuming bytes: %w\", err)\n\t\t\t\t\t}\n\t\t\t\t\tvar checksummedDataEndOff = d.off + checksummedDataFieldLen\n\t\t\t\t\tfor d.off < checksummedDataEndOff {\n\t\t\t\t\t\tgotNum, gotTyp, err := d.consumeTag()\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn fmt.Errorf(\"consuming checksummedData tag: %w\", err)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tswitch {\n\t\t\t\t\t\tcase gotNum == checksummedDataContentField && gotTyp == protowire.BytesType:\n\t\t\t\t\t\t\t// Get the offsets of the content bytes.\n\t\t\t\t\t\t\td.dataOffsets, err = d.consumeBytes()\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\treturn fmt.Errorf(\"invalid BidiReadObjectResponse.ChecksummedData.Content: %w\", err)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tcase gotNum == checksummedDataCRC32CField && gotTyp == protowire.Fixed32Type:\n\t\t\t\t\t\t\tv, err := d.consumeFixed32()\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\treturn fmt.Errorf(\"invalid BidiReadObjectResponse.ChecksummedData.Crc32C: %w\", err)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmsg.ObjectDataRanges[0].ChecksummedData.Crc32C = &v\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terr := d.consumeFieldValue(gotNum, gotTyp)\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\treturn fmt.Errorf(\"invalid field in BidiReadObjectResponse.ChecksummedData: %w\", err)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tcase gotNum == readRangeField && gotTyp == protowire.BytesType:\n\t\t\t\t\tbuf, err := d.consumeBytesCopy()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn fmt.Errorf(\"invalid ObjectDataRange.ReadRange: %w\", err)\n\t\t\t\t\t}\n\n\t\t\t\t\tif err := proto.Unmarshal(buf, msg.ObjectDataRanges[0].ReadRange); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\tcase gotNum == rangeEndField && gotTyp == protowire.VarintType: // proto encodes bool as int32\n\t\t\t\t\tb, err := d.consumeVarint()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn fmt.Errorf(\"invalid ObjectDataRange.RangeEnd: %w\", err)\n\t\t\t\t\t}\n\t\t\t\t\tmsg.ObjectDataRanges[0].RangeEnd = protowire.DecodeBool(b)\n\t\t\t\t}\n\n\t\t\t}\n\t\tcase fieldNum == metadataField && fieldType == protowire.BytesType:\n\t\t\tmsg.Metadata = &storagepb.Object{}\n\t\t\tbuf, err := d.consumeBytesCopy()\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"invalid BidiReadObjectResponse.Metadata: %w\", err)\n\t\t\t}\n\n\t\t\tif err := proto.Unmarshal(buf, msg.Metadata); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase fieldNum == readHandleField && fieldType == protowire.BytesType:\n\t\t\tmsg.ReadHandle = &storagepb.BidiReadHandle{}\n\t\t\tbuf, err := d.consumeBytesCopy()\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"invalid BidiReadObjectResponse.ReadHandle: %w\", err)\n\t\t\t}\n\n\t\t\tif err := proto.Unmarshal(buf, msg.ReadHandle); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\terr := d.consumeFieldValue(fieldNum, fieldType)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"invalid field in BidiReadObjectResponse: %w\", err)\n\t\t\t}\n\t\t}\n\t}\n\td.msg = msg\n\n\treturn nil\n}\n\n// reopenStream \"closes\" the existing stream and attempts to reopen a stream and\n// sets the Reader's stream and cancelStream properties in the process.\nfunc (r *gRPCReader) reopenStream() error {\n\t// Close existing stream and initialize new stream with updated offset.\n\tr.Close()\n\n\tres, cancel, err := r.reopen(r.seen)\n\tif err != nil {\n\t\treturn err\n\t}\n\tr.stream = res.stream\n\tr.currMsg = res.decoder\n\tr.cancel = cancel\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/grpc_dp.go",
    "content": "//go:build !disable_grpc_modules\n\n// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t_ \"google.golang.org/grpc/balancer/rls\"\n\t_ \"google.golang.org/grpc/xds/googledirectpath\"\n)\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/grpc_metrics.go",
    "content": "// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n\n\tmexporter \"github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric\"\n\t\"github.com/google/uuid\"\n\t\"go.opentelemetry.io/contrib/detectors/gcp\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/sdk/metric\"\n\t\"go.opentelemetry.io/otel/sdk/metric/metricdata\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/experimental/stats\"\n\t\"google.golang.org/grpc/stats/opentelemetry\"\n)\n\nconst (\n\tmonitoredResourceName = \"storage.googleapis.com/Client\"\n\tmetricPrefix          = \"storage.googleapis.com/client/\"\n)\n\n// Added to help with tests\ntype storageMonitoredResource struct {\n\tproject       string\n\tapi           string\n\tlocation      string\n\tinstance      string\n\tcloudPlatform string\n\thost          string\n\tresource      *resource.Resource\n}\n\nfunc (smr *storageMonitoredResource) exporter() (metric.Exporter, error) {\n\texporter, err := mexporter.New(\n\t\tmexporter.WithProjectID(smr.project),\n\t\tmexporter.WithMetricDescriptorTypeFormatter(metricFormatter),\n\t\tmexporter.WithCreateServiceTimeSeries(),\n\t\tmexporter.WithMonitoredResourceDescription(monitoredResourceName, []string{\"project_id\", \"location\", \"cloud_platform\", \"host_id\", \"instance_id\", \"api\"}),\n\t)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"storage: creating metrics exporter: %w\", err)\n\t}\n\treturn exporter, nil\n}\n\nfunc newStorageMonitoredResource(ctx context.Context, project, api string, opts ...resource.Option) (*storageMonitoredResource, error) {\n\tdetectedAttrs, err := resource.New(ctx, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsmr := &storageMonitoredResource{\n\t\tinstance: uuid.New().String(),\n\t\tapi:      api,\n\t\tproject:  project,\n\t}\n\ts := detectedAttrs.Set()\n\t// Attempt to use resource detector project id if project id wasn't\n\t// identified using ADC as a last resort. Otherwise metrics cannot be started.\n\tif p, present := s.Value(\"cloud.account.id\"); present && smr.project == \"\" {\n\t\tsmr.project = p.AsString()\n\t} else if !present && smr.project == \"\" {\n\t\treturn nil, errors.New(\"google cloud project is required to start client-side metrics\")\n\t}\n\tif v, ok := s.Value(\"cloud.region\"); ok {\n\t\tsmr.location = v.AsString()\n\t} else {\n\t\tsmr.location = \"global\"\n\t}\n\tif v, ok := s.Value(\"cloud.platform\"); ok {\n\t\tsmr.cloudPlatform = v.AsString()\n\t} else {\n\t\tsmr.cloudPlatform = \"unknown\"\n\t}\n\tif v, ok := s.Value(\"host.id\"); ok {\n\t\tsmr.host = v.AsString()\n\t} else if v, ok := s.Value(\"faas.id\"); ok {\n\t\tsmr.host = v.AsString()\n\t} else {\n\t\tsmr.host = \"unknown\"\n\t}\n\tsmr.resource, err = resource.New(ctx, resource.WithAttributes([]attribute.KeyValue{\n\t\t{Key: \"gcp.resource_type\", Value: attribute.StringValue(monitoredResourceName)},\n\t\t{Key: \"project_id\", Value: attribute.StringValue(smr.project)},\n\t\t{Key: \"api\", Value: attribute.StringValue(smr.api)},\n\t\t{Key: \"instance_id\", Value: attribute.StringValue(smr.instance)},\n\t\t{Key: \"location\", Value: attribute.StringValue(smr.location)},\n\t\t{Key: \"cloud_platform\", Value: attribute.StringValue(smr.cloudPlatform)},\n\t\t{Key: \"host_id\", Value: attribute.StringValue(smr.host)},\n\t}...))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn smr, nil\n}\n\ntype metricsContext struct {\n\t// client options passed to gRPC channels\n\tclientOpts []option.ClientOption\n\t// instance of metric reader used by gRPC client-side metrics\n\tprovider *metric.MeterProvider\n\t// clean func to call when closing gRPC client\n\tclose func()\n}\n\ntype metricsConfig struct {\n\tproject         string\n\tinterval        time.Duration\n\tcustomExporter  *metric.Exporter\n\tmanualReader    *metric.ManualReader // used by tests\n\tdisableExporter bool                 // used by tests disables exports\n\tresourceOpts    []resource.Option    // used by tests\n}\n\nfunc newGRPCMetricContext(ctx context.Context, cfg metricsConfig) (*metricsContext, error) {\n\tvar exporter metric.Exporter\n\tmeterOpts := []metric.Option{}\n\tif cfg.customExporter == nil {\n\t\tvar ropts []resource.Option\n\t\tif cfg.resourceOpts != nil {\n\t\t\tropts = cfg.resourceOpts\n\t\t} else {\n\t\t\tropts = []resource.Option{resource.WithDetectors(gcp.NewDetector())}\n\t\t}\n\t\tsmr, err := newStorageMonitoredResource(ctx, cfg.project, \"grpc\", ropts...)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\texporter, err = smr.exporter()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tmeterOpts = append(meterOpts, metric.WithResource(smr.resource))\n\t} else {\n\t\texporter = *cfg.customExporter\n\t}\n\tinterval := time.Minute\n\tif cfg.interval > 0 {\n\t\tinterval = cfg.interval\n\t}\n\tmeterOpts = append(meterOpts,\n\t\t// Metric views update histogram boundaries to be relevant to GCS\n\t\t// otherwise default OTel histogram boundaries are used.\n\t\tmetric.WithView(\n\t\t\tcreateHistogramView(\"grpc.client.attempt.duration\", latencyHistogramBoundaries()),\n\t\t\tcreateHistogramView(\"grpc.client.attempt.rcvd_total_compressed_message_size\", sizeHistogramBoundaries()),\n\t\t\tcreateHistogramView(\"grpc.client.attempt.sent_total_compressed_message_size\", sizeHistogramBoundaries())),\n\t)\n\tif cfg.manualReader != nil {\n\t\tmeterOpts = append(meterOpts, metric.WithReader(cfg.manualReader))\n\t}\n\tif !cfg.disableExporter {\n\t\tmeterOpts = append(meterOpts, metric.WithReader(\n\t\t\tmetric.NewPeriodicReader(&exporterLogSuppressor{Exporter: exporter}, metric.WithInterval(interval))))\n\t}\n\tprovider := metric.NewMeterProvider(meterOpts...)\n\tmo := opentelemetry.MetricsOptions{\n\t\tMeterProvider: provider,\n\t\tMetrics: stats.NewMetrics(\n\t\t\t\"grpc.client.attempt.started\",\n\t\t\t\"grpc.client.attempt.duration\",\n\t\t\t\"grpc.client.attempt.sent_total_compressed_message_size\",\n\t\t\t\"grpc.client.attempt.rcvd_total_compressed_message_size\",\n\t\t\t\"grpc.client.call.duration\",\n\t\t\t\"grpc.lb.wrr.rr_fallback\",\n\t\t\t\"grpc.lb.wrr.endpoint_weight_not_yet_usable\",\n\t\t\t\"grpc.lb.wrr.endpoint_weight_stale\",\n\t\t\t\"grpc.lb.wrr.endpoint_weights\",\n\t\t\t\"grpc.lb.rls.cache_entries\",\n\t\t\t\"grpc.lb.rls.cache_size\",\n\t\t\t\"grpc.lb.rls.default_target_picks\",\n\t\t\t\"grpc.lb.rls.target_picks\",\n\t\t\t\"grpc.lb.rls.failed_picks\",\n\t\t),\n\t\tOptionalLabels: []string{\"grpc.lb.locality\"},\n\t}\n\topts := []option.ClientOption{\n\t\toption.WithGRPCDialOption(\n\t\t\topentelemetry.DialOption(opentelemetry.Options{MetricsOptions: mo})),\n\t\toption.WithGRPCDialOption(\n\t\t\tgrpc.WithDefaultCallOptions(grpc.StaticMethodCallOption{})),\n\t}\n\treturn &metricsContext{\n\t\tclientOpts: opts,\n\t\tprovider:   provider,\n\t\tclose: func() {\n\t\t\tprovider.Shutdown(ctx)\n\t\t},\n\t}, nil\n}\n\n// Silences permission errors after initial error is emitted to prevent\n// chatty logs.\ntype exporterLogSuppressor struct {\n\tmetric.Exporter\n\temittedFailure bool\n}\n\n// Implements OTel SDK metric.Exporter interface to prevent noisy logs from\n// lack of credentials after initial failure.\n// https://pkg.go.dev/go.opentelemetry.io/otel/sdk/metric@v1.28.0#Exporter\nfunc (e *exporterLogSuppressor) Export(ctx context.Context, rm *metricdata.ResourceMetrics) error {\n\tif err := e.Exporter.Export(ctx, rm); err != nil && !e.emittedFailure {\n\t\tif strings.Contains(err.Error(), \"PermissionDenied\") {\n\t\t\te.emittedFailure = true\n\t\t\treturn fmt.Errorf(\"gRPC metrics failed due permission issue: %w\", err)\n\t\t}\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc latencyHistogramBoundaries() []float64 {\n\tboundaries := []float64{}\n\tboundary := 0.0\n\tincrement := 0.002\n\t// 2ms buckets for first 100ms, so we can have higher resolution for uploads and downloads in the 100 KiB range\n\tfor i := 0; i < 50; i++ {\n\t\tboundaries = append(boundaries, boundary)\n\t\t// increment by 2ms\n\t\tboundary += increment\n\t}\n\t// For the remaining buckets do 10 10ms, 10 20ms, and so on, up until 5 minutes\n\tfor i := 0; i < 150 && boundary < 300; i++ {\n\t\tboundaries = append(boundaries, boundary)\n\t\tif i != 0 && i%10 == 0 {\n\t\t\tincrement *= 2\n\t\t}\n\t\tboundary += increment\n\t}\n\treturn boundaries\n}\n\nfunc sizeHistogramBoundaries() []float64 {\n\tkb := 1024.0\n\tmb := 1024.0 * kb\n\tgb := 1024.0 * mb\n\tboundaries := []float64{}\n\tboundary := 0.0\n\tincrement := 128 * kb\n\t// 128 KiB increments up to 4MiB, then exponential growth\n\tfor len(boundaries) < 200 && boundary <= 16*gb {\n\t\tboundaries = append(boundaries, boundary)\n\t\tboundary += increment\n\t\tif boundary >= 4*mb {\n\t\t\tincrement *= 2\n\t\t}\n\t}\n\treturn boundaries\n}\n\nfunc createHistogramView(name string, boundaries []float64) metric.View {\n\treturn metric.NewView(metric.Instrument{\n\t\tName: name,\n\t\tKind: metric.InstrumentKindHistogram,\n\t}, metric.Stream{\n\t\tName:        name,\n\t\tAggregation: metric.AggregationExplicitBucketHistogram{Boundaries: boundaries},\n\t})\n}\n\nfunc metricFormatter(m metricdata.Metrics) string {\n\treturn metricPrefix + strings.ReplaceAll(string(m.Name), \".\", \"/\")\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/grpc_reader.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"context\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"hash/crc32\"\n\t\"io\"\n\n\t\"cloud.google.com/go/internal/trace\"\n\t\"cloud.google.com/go/storage/internal/apiv2/storagepb\"\n\t\"github.com/googleapis/gax-go/v2\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/encoding\"\n\t\"google.golang.org/grpc/mem\"\n\t\"google.golang.org/protobuf/encoding/protowire\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\n// Below is the legacy implementation of gRPC downloads using the ReadObject API.\n// It's used by gRPC if the experimental option WithGRPCBidiReads was not passed.\n// TODO: once BidiReadObject is in GA, remove this implementation.\n\n// Custom codec to be used for unmarshaling ReadObjectResponse messages.\n// This is used to avoid a copy of object data in proto.Unmarshal.\ntype bytesCodecReadObject struct {\n}\n\nvar _ encoding.CodecV2 = bytesCodecReadObject{}\n\n// Marshal is used to encode messages to send for bytesCodecReadObject. Since we are only\n// using this to send ReadObjectRequest messages we don't need to recycle buffers\n// here.\nfunc (bytesCodecReadObject) Marshal(v any) (mem.BufferSlice, error) {\n\tvv, ok := v.(proto.Message)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"failed to marshal, message is %T, want proto.Message\", v)\n\t}\n\tvar data mem.BufferSlice\n\tbuf, err := proto.Marshal(vv)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdata = append(data, mem.SliceBuffer(buf))\n\treturn data, nil\n}\n\n// Unmarshal is used for data received for ReadObjectResponse. We want to preserve\n// the mem.BufferSlice in most cases rather than copying and calling proto.Unmarshal.\nfunc (bytesCodecReadObject) Unmarshal(data mem.BufferSlice, v any) error {\n\tswitch v := v.(type) {\n\tcase *mem.BufferSlice:\n\t\t*v = data\n\t\t// Pick up a reference to the data so that it is not freed while decoding.\n\t\tdata.Ref()\n\t\treturn nil\n\tcase proto.Message:\n\t\tbuf := data.MaterializeToBuffer(mem.DefaultBufferPool())\n\t\treturn proto.Unmarshal(buf.ReadOnlyData(), v)\n\tdefault:\n\t\treturn fmt.Errorf(\"cannot unmarshal type %T, want proto.Message or mem.BufferSlice\", v)\n\t}\n}\n\nfunc (bytesCodecReadObject) Name() string {\n\treturn \"\"\n}\n\nfunc (c *grpcStorageClient) NewRangeReaderReadObject(ctx context.Context, params *newRangeReaderParams, opts ...storageOption) (r *Reader, err error) {\n\tctx = trace.StartSpan(ctx, \"cloud.google.com/go/storage.grpcStorageClient.NewRangeReaderReadObject\")\n\tdefer func() { trace.EndSpan(ctx, err) }()\n\n\ts := callSettings(c.settings, opts...)\n\n\ts.gax = append(s.gax, gax.WithGRPCOptions(\n\t\tgrpc.ForceCodecV2(bytesCodecReadObject{}),\n\t))\n\n\tif s.userProject != \"\" {\n\t\tctx = setUserProjectMetadata(ctx, s.userProject)\n\t}\n\n\tb := bucketResourceName(globalProjectAlias, params.bucket)\n\treq := &storagepb.ReadObjectRequest{\n\t\tBucket:                    b,\n\t\tObject:                    params.object,\n\t\tCommonObjectRequestParams: toProtoCommonObjectRequestParams(params.encryptionKey),\n\t}\n\t// The default is a negative value, which means latest.\n\tif params.gen >= 0 {\n\t\treq.Generation = params.gen\n\t}\n\n\t// Define a function that initiates a Read with offset and length, assuming\n\t// we have already read seen bytes.\n\treopen := func(seen int64) (*readStreamResponseReadObject, context.CancelFunc, error) {\n\t\t// If the context has already expired, return immediately without making\n\t\t// we call.\n\t\tif err := ctx.Err(); err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\n\t\tcc, cancel := context.WithCancel(ctx)\n\n\t\treq.ReadOffset = params.offset + seen\n\n\t\t// Only set a ReadLimit if length is greater than zero, because <= 0 means\n\t\t// to read it all.\n\t\tif params.length > 0 {\n\t\t\treq.ReadLimit = params.length - seen\n\t\t}\n\n\t\tif err := applyCondsProto(\"gRPCReadObjectReader.reopen\", params.gen, params.conds, req); err != nil {\n\t\t\tcancel()\n\t\t\treturn nil, nil, err\n\t\t}\n\n\t\tvar stream storagepb.Storage_ReadObjectClient\n\t\tvar err error\n\t\tvar decoder *readObjectResponseDecoder\n\n\t\terr = run(cc, func(ctx context.Context) error {\n\t\t\tstream, err = c.raw.ReadObject(ctx, req, s.gax...)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Receive the message into databuf as a wire-encoded message so we can\n\t\t\t// use a custom decoder to avoid an extra copy at the protobuf layer.\n\t\t\tdatabufs := mem.BufferSlice{}\n\t\t\terr := stream.RecvMsg(&databufs)\n\t\t\tif err != nil {\n\t\t\t\t// NotFound types of errors show up on the Recv call, rather than the\n\t\t\t\t// initialization of the stream via ReadObject above.\n\t\t\t\treturn formatObjectErr(err)\n\t\t\t}\n\t\t\t// Use a custom decoder that uses protobuf unmarshalling for all\n\t\t\t// fields except the object data. Object data is handled separately\n\t\t\t// to avoid a copy.\n\t\t\tdecoder = &readObjectResponseDecoder{\n\t\t\t\tdatabufs: databufs,\n\t\t\t}\n\t\t\terr = decoder.readFullObjectResponse()\n\t\t\treturn err\n\t\t}, s.retry, s.idempotent)\n\t\tif err != nil {\n\t\t\t// Close the stream context we just created to ensure we don't leak\n\t\t\t// resources.\n\t\t\tcancel()\n\t\t\t// Free any buffers.\n\t\t\tif decoder != nil && decoder.databufs != nil {\n\t\t\t\tdecoder.databufs.Free()\n\t\t\t}\n\t\t\treturn nil, nil, err\n\t\t}\n\n\t\treturn &readStreamResponseReadObject{stream, decoder}, cancel, nil\n\t}\n\n\tres, cancel, err := reopen(0)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// The first message was Recv'd on stream open, use it to populate the\n\t// object metadata.\n\tmsg := res.decoder.msg\n\tobj := msg.GetMetadata()\n\t// This is the size of the entire object, even if only a range was requested.\n\tsize := obj.GetSize()\n\n\t// Only support checksums when reading an entire object, not a range.\n\tvar (\n\t\twantCRC  uint32\n\t\tcheckCRC bool\n\t)\n\tif checksums := msg.GetObjectChecksums(); checksums != nil && checksums.Crc32C != nil {\n\t\tif params.offset == 0 && params.length < 0 {\n\t\t\tcheckCRC = true\n\t\t}\n\t\twantCRC = checksums.GetCrc32C()\n\t}\n\n\tmetadata := obj.GetMetadata()\n\tr = &Reader{\n\t\tAttrs: ReaderObjectAttrs{\n\t\t\tSize:            size,\n\t\t\tContentType:     obj.GetContentType(),\n\t\t\tContentEncoding: obj.GetContentEncoding(),\n\t\t\tCacheControl:    obj.GetCacheControl(),\n\t\t\tLastModified:    obj.GetUpdateTime().AsTime(),\n\t\t\tMetageneration:  obj.GetMetageneration(),\n\t\t\tGeneration:      obj.GetGeneration(),\n\t\t\tCRC32C:          wantCRC,\n\t\t},\n\t\tobjectMetadata: &metadata,\n\t\treader: &gRPCReadObjectReader{\n\t\t\tstream: res.stream,\n\t\t\treopen: reopen,\n\t\t\tcancel: cancel,\n\t\t\tsize:   size,\n\t\t\t// Preserve the decoder to read out object data when Read/WriteTo is called.\n\t\t\tcurrMsg:   res.decoder,\n\t\t\tsettings:  s,\n\t\t\tzeroRange: params.length == 0,\n\t\t\twantCRC:   wantCRC,\n\t\t\tcheckCRC:  checkCRC,\n\t\t},\n\t\tcheckCRC: checkCRC,\n\t}\n\n\tcr := msg.GetContentRange()\n\tif cr != nil {\n\t\tr.Attrs.StartOffset = cr.GetStart()\n\t\tr.remain = cr.GetEnd() - cr.GetStart()\n\t} else {\n\t\tr.remain = size\n\t}\n\n\t// For a zero-length request, explicitly close the stream and set remaining\n\t// bytes to zero.\n\tif params.length == 0 {\n\t\tr.remain = 0\n\t\tr.reader.Close()\n\t}\n\n\treturn r, nil\n}\n\ntype readStreamResponseReadObject struct {\n\tstream  storagepb.Storage_ReadObjectClient\n\tdecoder *readObjectResponseDecoder\n}\n\ntype gRPCReadObjectReader struct {\n\tseen, size int64\n\tzeroRange  bool\n\tstream     storagepb.Storage_ReadObjectClient\n\treopen     func(seen int64) (*readStreamResponseReadObject, context.CancelFunc, error)\n\tleftovers  []byte\n\tcurrMsg    *readObjectResponseDecoder // decoder for the current message\n\tcancel     context.CancelFunc\n\tsettings   *settings\n\tcheckCRC   bool   // should we check the CRC?\n\twantCRC    uint32 // the CRC32c value the server sent in the header\n\tgotCRC     uint32 // running crc\n}\n\n// Update the running CRC with the data in the slice, if CRC checking was enabled.\nfunc (r *gRPCReadObjectReader) updateCRC(b []byte) {\n\tif r.checkCRC {\n\t\tr.gotCRC = crc32.Update(r.gotCRC, crc32cTable, b)\n\t}\n}\n\n// Checks whether the CRC matches at the conclusion of a read, if CRC checking was enabled.\nfunc (r *gRPCReadObjectReader) runCRCCheck() error {\n\tif r.checkCRC && r.gotCRC != r.wantCRC {\n\t\treturn fmt.Errorf(\"storage: bad CRC on read: got %d, want %d\", r.gotCRC, r.wantCRC)\n\t}\n\treturn nil\n}\n\n// Read reads bytes into the user's buffer from an open gRPC stream.\nfunc (r *gRPCReadObjectReader) Read(p []byte) (int, error) {\n\t// The entire object has been read by this reader, check the checksum if\n\t// necessary and return EOF.\n\tif r.size == r.seen || r.zeroRange {\n\t\tif err := r.runCRCCheck(); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\treturn 0, io.EOF\n\t}\n\n\t// No stream to read from, either never initialized or Close was called.\n\t// Note: There is a potential concurrency issue if multiple routines are\n\t// using the same reader. One encounters an error and the stream is closed\n\t// and then reopened while the other routine attempts to read from it.\n\tif r.stream == nil {\n\t\treturn 0, fmt.Errorf(\"storage: reader has been closed\")\n\t}\n\n\tvar n int\n\n\t// If there is data remaining in the current message, return what was\n\t// available to conform to the Reader\n\t// interface: https://pkg.go.dev/io#Reader.\n\tif !r.currMsg.done {\n\t\tn = r.currMsg.readAndUpdateCRC(p, func(b []byte) {\n\t\t\tr.updateCRC(b)\n\t\t})\n\t\tr.seen += int64(n)\n\t\treturn n, nil\n\t}\n\n\t// Attempt to Recv the next message on the stream.\n\t// This will update r.currMsg with the decoder for the new message.\n\terr := r.recv()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// TODO: Determine if we need to capture incremental CRC32C for this\n\t// chunk. The Object CRC32C checksum is captured when directed to read\n\t// the entire Object. If directed to read a range, we may need to\n\t// calculate the range's checksum for verification if the checksum is\n\t// present in the response here.\n\t// TODO: Figure out if we need to support decompressive transcoding\n\t// https://cloud.google.com/storage/docs/transcoding.\n\n\tn = r.currMsg.readAndUpdateCRC(p, func(b []byte) {\n\t\tr.updateCRC(b)\n\t})\n\tr.seen += int64(n)\n\treturn n, nil\n}\n\n// WriteTo writes all the data requested by the Reader into w, implementing\n// io.WriterTo.\nfunc (r *gRPCReadObjectReader) WriteTo(w io.Writer) (int64, error) {\n\t// The entire object has been read by this reader, check the checksum if\n\t// necessary and return nil.\n\tif r.size == r.seen || r.zeroRange {\n\t\tif err := r.runCRCCheck(); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\treturn 0, nil\n\t}\n\n\t// No stream to read from, either never initialized or Close was called.\n\t// Note: There is a potential concurrency issue if multiple routines are\n\t// using the same reader. One encounters an error and the stream is closed\n\t// and then reopened while the other routine attempts to read from it.\n\tif r.stream == nil {\n\t\treturn 0, fmt.Errorf(\"storage: reader has been closed\")\n\t}\n\n\t// Track bytes written during before call.\n\tvar alreadySeen = r.seen\n\n\t// Write any already received message to the stream. There will be some leftovers from the\n\t// original NewRangeReaderReadObject call.\n\tif r.currMsg != nil && !r.currMsg.done {\n\t\twritten, err := r.currMsg.writeToAndUpdateCRC(w, func(b []byte) {\n\t\t\tr.updateCRC(b)\n\t\t})\n\t\tr.seen += int64(written)\n\t\tr.currMsg = nil\n\t\tif err != nil {\n\t\t\treturn r.seen - alreadySeen, err\n\t\t}\n\t}\n\n\t// Loop and receive additional messages until the entire data is written.\n\tfor {\n\t\t// Attempt to receive the next message on the stream.\n\t\t// Will terminate with io.EOF once data has all come through.\n\t\t// recv() handles stream reopening and retry logic so no need for retries here.\n\t\terr := r.recv()\n\t\tif err != nil {\n\t\t\tif err == io.EOF {\n\t\t\t\t// We are done; check the checksum if necessary and return.\n\t\t\t\terr = r.runCRCCheck()\n\t\t\t}\n\t\t\treturn r.seen - alreadySeen, err\n\t\t}\n\n\t\t// TODO: Determine if we need to capture incremental CRC32C for this\n\t\t// chunk. The Object CRC32C checksum is captured when directed to read\n\t\t// the entire Object. If directed to read a range, we may need to\n\t\t// calculate the range's checksum for verification if the checksum is\n\t\t// present in the response here.\n\t\t// TODO: Figure out if we need to support decompressive transcoding\n\t\t// https://cloud.google.com/storage/docs/transcoding.\n\t\twritten, err := r.currMsg.writeToAndUpdateCRC(w, func(b []byte) {\n\t\t\tr.updateCRC(b)\n\t\t})\n\t\tr.seen += int64(written)\n\t\tif err != nil {\n\t\t\treturn r.seen - alreadySeen, err\n\t\t}\n\t}\n\n}\n\n// Close cancels the read stream's context in order for it to be closed and\n// collected, and frees any currently in use buffers.\nfunc (r *gRPCReadObjectReader) Close() error {\n\tif r.cancel != nil {\n\t\tr.cancel()\n\t}\n\tr.stream = nil\n\tr.currMsg = nil\n\treturn nil\n}\n\n// recv attempts to Recv the next message on the stream and extract the object\n// data that it contains. In the event that a retryable error is encountered,\n// the stream will be closed, reopened, and RecvMsg again.\n// This will attempt to Recv until one of the following is true:\n//\n// * Recv is successful\n// * A non-retryable error is encountered\n// * The Reader's context is canceled\n//\n// The last error received is the one that is returned, which could be from\n// an attempt to reopen the stream.\nfunc (r *gRPCReadObjectReader) recv() error {\n\tdatabufs := mem.BufferSlice{}\n\terr := r.stream.RecvMsg(&databufs)\n\n\tif err != nil && r.settings.retry.runShouldRetry(err) {\n\t\t// This will \"close\" the existing stream and immediately attempt to\n\t\t// reopen the stream, but will backoff if further attempts are necessary.\n\t\t// Reopening the stream Recvs the first message, so if retrying is\n\t\t// successful, r.currMsg will be updated to include the new data.\n\t\treturn r.reopenStream()\n\t}\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tr.currMsg = &readObjectResponseDecoder{databufs: databufs}\n\treturn r.currMsg.readFullObjectResponse()\n}\n\n// ReadObjectResponse field and subfield numbers.\nconst (\n\tchecksummedDataFieldReadObject        = protowire.Number(1)\n\tchecksummedDataContentFieldReadObject = protowire.Number(1)\n\tchecksummedDataCRC32CFieldReadObject  = protowire.Number(2)\n\tobjectChecksumsFieldReadObject        = protowire.Number(2)\n\tcontentRangeFieldReadObject           = protowire.Number(3)\n\tmetadataFieldReadObject               = protowire.Number(4)\n)\n\n// readObjectResponseDecoder is a wrapper on the raw message, used to decode one message\n// without copying object data. It also has methods to write out the resulting object\n// data to the user application.\ntype readObjectResponseDecoder struct {\n\tdatabufs mem.BufferSlice // raw bytes of the message being processed\n\t// Decoding offsets\n\toff     uint64 // offset in the messsage relative to the data as a whole\n\tcurrBuf int    // index of the current buffer being processed\n\tcurrOff uint64 // offset in the current buffer\n\t// Processed data\n\tmsg         *storagepb.ReadObjectResponse // processed response message with all fields other than object data populated\n\tdataOffsets bufferSliceOffsetsReadObject  // offsets of the object data in the message.\n\tdone        bool                          // true if the data has been completely read.\n}\n\ntype bufferSliceOffsetsReadObject struct {\n\tstartBuf, endBuf int    // indices of start and end buffers of object data in the msg\n\tstartOff, endOff uint64 // offsets within these buffers where the data starts and ends.\n\tcurrBuf          int    // index of current buffer being read out to the user application.\n\tcurrOff          uint64 // offset of read in current buffer.\n}\n\n// peek ahead 10 bytes from the current offset in the databufs. This will return a\n// slice of the current buffer if the bytes are all in one buffer, but will copy\n// the bytes into a new buffer if the distance is split across buffers. Use this\n// to allow protowire methods to be used to parse tags & fixed values.\n// The max length of a varint tag is 10 bytes, see\n// https://protobuf.dev/programming-guides/encoding/#varints . Other int types\n// are shorter.\nfunc (d *readObjectResponseDecoder) peek() []byte {\n\tb := d.databufs[d.currBuf].ReadOnlyData()\n\t// Check if the tag will fit in the current buffer. If not, copy the next 10\n\t// bytes into a new buffer to ensure that we can read the tag correctly\n\t// without it being divided between buffers.\n\ttagBuf := b[d.currOff:]\n\tremainingInBuf := len(tagBuf)\n\t// If we have less than 10 bytes remaining and are not in the final buffer,\n\t// copy up to 10 bytes ahead from the next buffer.\n\tif remainingInBuf < binary.MaxVarintLen64 && d.currBuf != len(d.databufs)-1 {\n\t\ttagBuf = d.copyNextBytes(10)\n\t}\n\treturn tagBuf\n}\n\n// Copies up to next n bytes into a new buffer, or fewer if fewer bytes remain in the\n// buffers overall. Does not advance offsets.\nfunc (d *readObjectResponseDecoder) copyNextBytes(n int) []byte {\n\tremaining := n\n\tif r := d.databufs.Len() - int(d.off); r < remaining {\n\t\tremaining = r\n\t}\n\tcurrBuf := d.currBuf\n\tcurrOff := d.currOff\n\tvar buf []byte\n\tfor remaining > 0 {\n\t\tb := d.databufs[currBuf].ReadOnlyData()\n\t\tremainingInCurr := len(b[currOff:])\n\t\tif remainingInCurr < remaining {\n\t\t\tbuf = append(buf, b[currOff:]...)\n\t\t\tremaining -= remainingInCurr\n\t\t\tcurrBuf++\n\t\t\tcurrOff = 0\n\t\t} else {\n\t\t\tbuf = append(buf, b[currOff:currOff+uint64(remaining)]...)\n\t\t\tremaining = 0\n\t\t}\n\t}\n\treturn buf\n}\n\n// Advance current buffer & byte offset in the decoding by n bytes. Returns an error if we\n// go past the end of the data.\nfunc (d *readObjectResponseDecoder) advanceOffset(n uint64) error {\n\tremaining := n\n\tfor remaining > 0 {\n\t\tremainingInCurr := uint64(d.databufs[d.currBuf].Len()) - d.currOff\n\t\tif remainingInCurr <= remaining {\n\t\t\tremaining -= remainingInCurr\n\t\t\td.currBuf++\n\t\t\td.currOff = 0\n\t\t} else {\n\t\t\td.currOff += remaining\n\t\t\tremaining = 0\n\t\t}\n\t}\n\t// If we have advanced past the end of the buffers, something went wrong.\n\tif (d.currBuf == len(d.databufs) && d.currOff > 0) || d.currBuf > len(d.databufs) {\n\t\treturn errors.New(\"decoding: truncated message, cannot advance offset\")\n\t}\n\td.off += n\n\treturn nil\n\n}\n\n// This copies object data from the message into the buffer and returns the number of\n// bytes copied. The data offsets are incremented in the message. The updateCRC\n// function is called on the copied bytes.\nfunc (d *readObjectResponseDecoder) readAndUpdateCRC(p []byte, updateCRC func([]byte)) int {\n\t// For a completely empty message, just return 0\n\tif len(d.databufs) == 0 {\n\t\treturn 0\n\t}\n\tdatabuf := d.databufs[d.dataOffsets.currBuf]\n\tstartOff := d.dataOffsets.currOff\n\tvar b []byte\n\tif d.dataOffsets.currBuf == d.dataOffsets.endBuf {\n\t\tb = databuf.ReadOnlyData()[startOff:d.dataOffsets.endOff]\n\t} else {\n\t\tb = databuf.ReadOnlyData()[startOff:]\n\t}\n\tn := copy(p, b)\n\tupdateCRC(b[:n])\n\td.dataOffsets.currOff += uint64(n)\n\n\t// We've read all the data from this message. Free the underlying buffers.\n\tif d.dataOffsets.currBuf == d.dataOffsets.endBuf && d.dataOffsets.currOff == d.dataOffsets.endOff {\n\t\td.done = true\n\t\td.databufs.Free()\n\t}\n\t// We are at the end of the current buffer\n\tif d.dataOffsets.currBuf != d.dataOffsets.endBuf && d.dataOffsets.currOff == uint64(databuf.Len()) {\n\t\td.dataOffsets.currOff = 0\n\t\td.dataOffsets.currBuf++\n\t}\n\treturn n\n}\n\nfunc (d *readObjectResponseDecoder) writeToAndUpdateCRC(w io.Writer, updateCRC func([]byte)) (int64, error) {\n\t// For a completely empty message, just return 0\n\tif len(d.databufs) == 0 {\n\t\treturn 0, nil\n\t}\n\tvar written int64\n\tfor !d.done {\n\t\tdatabuf := d.databufs[d.dataOffsets.currBuf]\n\t\tstartOff := d.dataOffsets.currOff\n\t\tvar b []byte\n\t\tif d.dataOffsets.currBuf == d.dataOffsets.endBuf {\n\t\t\tb = databuf.ReadOnlyData()[startOff:d.dataOffsets.endOff]\n\t\t} else {\n\t\t\tb = databuf.ReadOnlyData()[startOff:]\n\t\t}\n\t\tvar n int\n\t\t// Write all remaining data from the current buffer\n\t\tn, err := w.Write(b)\n\t\twritten += int64(n)\n\t\tupdateCRC(b)\n\t\tif err != nil {\n\t\t\treturn written, err\n\t\t}\n\t\td.dataOffsets.currOff = 0\n\t\t// We've read all the data from this message.\n\t\tif d.dataOffsets.currBuf == d.dataOffsets.endBuf {\n\t\t\td.done = true\n\t\t\td.databufs.Free()\n\t\t} else {\n\t\t\td.dataOffsets.currBuf++\n\t\t}\n\t}\n\treturn written, nil\n}\n\n// Consume the next available tag in the input data and return the field number and type.\n// Advances the relevant offsets in the data.\nfunc (d *readObjectResponseDecoder) consumeTag() (protowire.Number, protowire.Type, error) {\n\ttagBuf := d.peek()\n\n\t// Consume the next tag. This will tell us which field is next in the\n\t// buffer, its type, and how much space it takes up.\n\tfieldNum, fieldType, tagLength := protowire.ConsumeTag(tagBuf)\n\tif tagLength < 0 {\n\t\treturn 0, 0, protowire.ParseError(tagLength)\n\t}\n\t// Update the offsets and current buffer depending on the tag length.\n\tif err := d.advanceOffset(uint64(tagLength)); err != nil {\n\t\treturn 0, 0, fmt.Errorf(\"consuming tag: %w\", err)\n\t}\n\treturn fieldNum, fieldType, nil\n}\n\n// Consume a varint that represents the length of a bytes field. Return the length of\n// the data, and advance the offsets by the length of the varint.\nfunc (d *readObjectResponseDecoder) consumeVarint() (uint64, error) {\n\ttagBuf := d.peek()\n\n\t// Consume the next tag. This will tell us which field is next in the\n\t// buffer, its type, and how much space it takes up.\n\tdataLength, tagLength := protowire.ConsumeVarint(tagBuf)\n\tif tagLength < 0 {\n\t\treturn 0, protowire.ParseError(tagLength)\n\t}\n\n\t// Update the offsets and current buffer depending on the tag length.\n\td.advanceOffset(uint64(tagLength))\n\treturn dataLength, nil\n}\n\nfunc (d *readObjectResponseDecoder) consumeFixed32() (uint32, error) {\n\tvalueBuf := d.peek()\n\n\t// Consume the next tag. This will tell us which field is next in the\n\t// buffer, its type, and how much space it takes up.\n\tvalue, tagLength := protowire.ConsumeFixed32(valueBuf)\n\tif tagLength < 0 {\n\t\treturn 0, protowire.ParseError(tagLength)\n\t}\n\n\t// Update the offsets and current buffer depending on the tag length.\n\td.advanceOffset(uint64(tagLength))\n\treturn value, nil\n}\n\nfunc (d *readObjectResponseDecoder) consumeFixed64() (uint64, error) {\n\tvalueBuf := d.peek()\n\n\t// Consume the next tag. This will tell us which field is next in the\n\t// buffer, its type, and how much space it takes up.\n\tvalue, tagLength := protowire.ConsumeFixed64(valueBuf)\n\tif tagLength < 0 {\n\t\treturn 0, protowire.ParseError(tagLength)\n\t}\n\n\t// Update the offsets and current buffer depending on the tag length.\n\td.advanceOffset(uint64(tagLength))\n\treturn value, nil\n}\n\n// Consume any field values up to the end offset provided and don't return anything.\n// This is used to skip any values which are not going to be used.\n// msgEndOff is indexed in terms of the overall data across all buffers.\nfunc (d *readObjectResponseDecoder) consumeFieldValue(fieldNum protowire.Number, fieldType protowire.Type) error {\n\t// reimplement protowire.ConsumeFieldValue without the extra case for groups (which\n\t// are are complicted and not a thing in proto3).\n\tvar err error\n\tswitch fieldType {\n\tcase protowire.VarintType:\n\t\t_, err = d.consumeVarint()\n\tcase protowire.Fixed32Type:\n\t\t_, err = d.consumeFixed32()\n\tcase protowire.Fixed64Type:\n\t\t_, err = d.consumeFixed64()\n\tcase protowire.BytesType:\n\t\t_, err = d.consumeBytes()\n\tdefault:\n\t\treturn fmt.Errorf(\"unknown field type %v in field %v\", fieldType, fieldNum)\n\t}\n\tif err != nil {\n\t\treturn fmt.Errorf(\"consuming field %v of type %v: %w\", fieldNum, fieldType, err)\n\t}\n\n\treturn nil\n}\n\n// Consume a bytes field from the input. Returns offsets for the data in the buffer slices\n// and an error.\nfunc (d *readObjectResponseDecoder) consumeBytes() (bufferSliceOffsetsReadObject, error) {\n\t// m is the length of the data past the tag.\n\tm, err := d.consumeVarint()\n\tif err != nil {\n\t\treturn bufferSliceOffsetsReadObject{}, fmt.Errorf(\"consuming bytes field: %w\", err)\n\t}\n\toffsets := bufferSliceOffsetsReadObject{\n\t\tstartBuf: d.currBuf,\n\t\tstartOff: d.currOff,\n\t\tcurrBuf:  d.currBuf,\n\t\tcurrOff:  d.currOff,\n\t}\n\n\t// Advance offsets to lengths of bytes field and capture where we end.\n\td.advanceOffset(m)\n\toffsets.endBuf = d.currBuf\n\toffsets.endOff = d.currOff\n\treturn offsets, nil\n}\n\n// Consume a bytes field from the input and copy into a new buffer if\n// necessary (if the data is split across buffers in databuf).  This can be\n// used to leverage proto.Unmarshal for small bytes fields (i.e. anything\n// except object data).\nfunc (d *readObjectResponseDecoder) consumeBytesCopy() ([]byte, error) {\n\t// m is the length of the bytes data.\n\tm, err := d.consumeVarint()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"consuming varint: %w\", err)\n\t}\n\t// Copy the data into a buffer and advance the offset\n\tb := d.copyNextBytes(int(m))\n\tif err := d.advanceOffset(m); err != nil {\n\t\treturn nil, fmt.Errorf(\"advancing offset: %w\", err)\n\t}\n\treturn b, nil\n}\n\n// readFullObjectResponse returns the ReadObjectResponse that is encoded in the\n// wire-encoded message buffer b, or an error if the message is invalid.\n// This must be used on the first recv of an object as it may contain all fields\n// of ReadObjectResponse, and we use or pass on those fields to the user.\n// This function is essentially identical to proto.Unmarshal, except it aliases\n// the data in the input []byte. If the proto library adds a feature to\n// Unmarshal that does that, this function can be dropped.\nfunc (d *readObjectResponseDecoder) readFullObjectResponse() error {\n\tmsg := &storagepb.ReadObjectResponse{}\n\n\t// Loop over the entire message, extracting fields as we go. This does not\n\t// handle field concatenation, in which the contents of a single field\n\t// are split across multiple protobuf tags.\n\tfor d.off < uint64(d.databufs.Len()) {\n\t\tfieldNum, fieldType, err := d.consumeTag()\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"consuming next tag: %w\", err)\n\t\t}\n\n\t\t// Unmarshal the field according to its type. Only fields that are not\n\t\t// nil will be present.\n\t\tswitch {\n\t\tcase fieldNum == checksummedDataFieldReadObject && fieldType == protowire.BytesType:\n\t\t\t// The ChecksummedData field was found. Initialize the struct.\n\t\t\tmsg.ChecksummedData = &storagepb.ChecksummedData{}\n\n\t\t\tbytesFieldLen, err := d.consumeVarint()\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"consuming bytes: %w\", err)\n\t\t\t}\n\n\t\t\tvar contentEndOff = d.off + bytesFieldLen\n\t\t\tfor d.off < contentEndOff {\n\t\t\t\tgotNum, gotTyp, err := d.consumeTag()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"consuming checksummedData tag: %w\", err)\n\t\t\t\t}\n\n\t\t\t\tswitch {\n\t\t\t\tcase gotNum == checksummedDataContentFieldReadObject && gotTyp == protowire.BytesType:\n\t\t\t\t\t// Get the offsets of the content bytes.\n\t\t\t\t\td.dataOffsets, err = d.consumeBytes()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn fmt.Errorf(\"invalid ReadObjectResponse.ChecksummedData.Content: %w\", err)\n\t\t\t\t\t}\n\t\t\t\tcase gotNum == checksummedDataCRC32CFieldReadObject && gotTyp == protowire.Fixed32Type:\n\t\t\t\t\tv, err := d.consumeFixed32()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn fmt.Errorf(\"invalid ReadObjectResponse.ChecksummedData.Crc32C: %w\", err)\n\t\t\t\t\t}\n\t\t\t\t\tmsg.ChecksummedData.Crc32C = &v\n\t\t\t\tdefault:\n\t\t\t\t\terr := d.consumeFieldValue(gotNum, gotTyp)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn fmt.Errorf(\"invalid field in ReadObjectResponse.ChecksummedData: %w\", err)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\tcase fieldNum == objectChecksumsFieldReadObject && fieldType == protowire.BytesType:\n\t\t\t// The field was found. Initialize the struct.\n\t\t\tmsg.ObjectChecksums = &storagepb.ObjectChecksums{}\n\t\t\t// Consume the bytes and copy them into a single buffer if they are split across buffers.\n\t\t\tbuf, err := d.consumeBytesCopy()\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"invalid ReadObjectResponse.ObjectChecksums: %w\", err)\n\t\t\t}\n\t\t\t// Unmarshal.\n\t\t\tif err := proto.Unmarshal(buf, msg.ObjectChecksums); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase fieldNum == contentRangeFieldReadObject && fieldType == protowire.BytesType:\n\t\t\tmsg.ContentRange = &storagepb.ContentRange{}\n\t\t\tbuf, err := d.consumeBytesCopy()\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"invalid ReadObjectResponse.ContentRange: %w\", err)\n\t\t\t}\n\t\t\tif err := proto.Unmarshal(buf, msg.ContentRange); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase fieldNum == metadataFieldReadObject && fieldType == protowire.BytesType:\n\t\t\tmsg.Metadata = &storagepb.Object{}\n\n\t\t\tbuf, err := d.consumeBytesCopy()\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"invalid ReadObjectResponse.Metadata: %w\", err)\n\t\t\t}\n\n\t\t\tif err := proto.Unmarshal(buf, msg.Metadata); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\terr := d.consumeFieldValue(fieldNum, fieldType)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"invalid field in ReadObjectResponse: %w\", err)\n\t\t\t}\n\t\t}\n\t}\n\td.msg = msg\n\treturn nil\n}\n\n// reopenStream \"closes\" the existing stream and attempts to reopen a stream and\n// sets the Reader's stream and cancelStream properties in the process.\nfunc (r *gRPCReadObjectReader) reopenStream() error {\n\t// Close existing stream and initialize new stream with updated offset.\n\tr.Close()\n\n\tres, cancel, err := r.reopen(r.seen)\n\tif err != nil {\n\t\treturn err\n\t}\n\tr.stream = res.stream\n\tr.currMsg = res.decoder\n\tr.cancel = cancel\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/grpc_reader_multi_range.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport \"sync\"\n\n// readIDGenerator generates unique read IDs for multi-range reads.\n// Call readIDGenerator.Next to get the next ID. Safe to be called concurrently.\ntype readIDGenerator struct {\n\tinitOnce sync.Once\n\tnextID   chan int64 // do not use this field directly\n}\n\nfunc (g *readIDGenerator) init() {\n\tg.nextID = make(chan int64, 1)\n\tg.nextID <- 1\n}\n\n// Next returns the Next read ID. It initializes the readIDGenerator if needed.\nfunc (g *readIDGenerator) Next() int64 {\n\tg.initOnce.Do(g.init)\n\n\tid := <-g.nextID\n\tn := id + 1\n\tg.nextID <- n\n\n\treturn id\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/grpc_writer.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/url\"\n\t\"time\"\n\n\tgapic \"cloud.google.com/go/storage/internal/apiv2\"\n\t\"cloud.google.com/go/storage/internal/apiv2/storagepb\"\n\tgax \"github.com/googleapis/gax-go/v2\"\n\t\"google.golang.org/api/googleapi\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/grpc/status\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\nconst (\n\t// defaultWriteChunkRetryDeadline is the default deadline for the upload\n\t// of a single chunk. It can be overwritten by Writer.ChunkRetryDeadline.\n\tdefaultWriteChunkRetryDeadline = 32 * time.Second\n\t// maxPerMessageWriteSize is the maximum amount of content that can be sent\n\t// per WriteObjectRequest message. A buffer reaching this amount will\n\t// precipitate a flush of the buffer. It is only used by the gRPC Writer\n\t// implementation.\n\tmaxPerMessageWriteSize int = int(storagepb.ServiceConstants_MAX_WRITE_CHUNK_BYTES)\n)\n\nfunc withBidiWriteObjectRedirectionErrorRetries(s *settings) (newr *retryConfig) {\n\toldr := s.retry\n\tnewr = oldr.clone()\n\tif newr == nil {\n\t\tnewr = &retryConfig{}\n\t}\n\tif (oldr.policy == RetryIdempotent && !s.idempotent) || oldr.policy == RetryNever {\n\t\t// We still retry redirection errors even when settings indicate not to\n\t\t// retry.\n\t\t//\n\t\t// The protocol requires us to respect redirection errors, so RetryNever has\n\t\t// to ignore them.\n\t\t//\n\t\t// Idempotency is always protected by redirection errors: they either\n\t\t// contain a handle which can be used as idempotency information, or they do\n\t\t// not contain a handle and are \"affirmative failures\" which indicate that\n\t\t// no server-side action occurred.\n\t\tnewr.policy = RetryAlways\n\t\tnewr.shouldRetry = func(err error) bool {\n\t\t\treturn errors.Is(err, bidiWriteObjectRedirectionError{})\n\t\t}\n\t\treturn newr\n\t}\n\t// If retry settings allow retries normally, fall back to that behavior.\n\tnewr.shouldRetry = func(err error) bool {\n\t\tif errors.Is(err, bidiWriteObjectRedirectionError{}) {\n\t\t\treturn true\n\t\t}\n\t\tv := oldr.runShouldRetry(err)\n\t\treturn v\n\t}\n\treturn newr\n}\n\nfunc (c *grpcStorageClient) OpenWriter(params *openWriterParams, opts ...storageOption) (*io.PipeWriter, error) {\n\tvar offset int64\n\terrorf := params.setError\n\tsetObj := params.setObj\n\tsetFlush := params.setFlush\n\tpr, pw := io.Pipe()\n\n\ts := callSettings(c.settings, opts...)\n\n\tretryDeadline := defaultWriteChunkRetryDeadline\n\tif params.chunkRetryDeadline != 0 {\n\t\tretryDeadline = params.chunkRetryDeadline\n\t}\n\tif s.retry == nil {\n\t\ts.retry = defaultRetry.clone()\n\t}\n\tif params.append {\n\t\ts.retry = withBidiWriteObjectRedirectionErrorRetries(s)\n\t}\n\ts.retry.maxRetryDuration = retryDeadline\n\n\t// Set Flush func for use by exported Writer.Flush.\n\tvar gw *gRPCWriter\n\tsetFlush(func() (int64, error) {\n\t\treturn gw.flush()\n\t})\n\tgw, err := newGRPCWriter(c, s, params, pr, pr, pw, params.setPipeWriter)\n\tif err != nil {\n\t\terrorf(err)\n\t\tpr.CloseWithError(err)\n\t\tclose(params.donec)\n\t\treturn nil, err\n\t}\n\n\tvar o *storagepb.Object\n\n\t// If we are taking over an appendable object, send the first message here\n\t// to get the append offset.\n\tif params.appendGen > 0 {\n\t\t// Create the buffer sender. This opens a stream and blocks until we\n\t\t// get a response that tells us what offset to write from.\n\t\twbs, err := gw.newGRPCAppendTakeoverWriteBufferSender(params.ctx)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"storage: creating buffer sender: %w\", err)\n\t\t}\n\t\t// Propagate append offset to caller and buffer sending logic below.\n\t\tparams.setTakeoverOffset(wbs.takeoverOffset)\n\t\toffset = wbs.takeoverOffset\n\t\tgw.streamSender = wbs\n\t\to = wbs.objResource\n\t\tsetObj(newObjectFromProto(o))\n\t}\n\n\t// This function reads the data sent to the pipe and sends sets of messages\n\t// on the gRPC client-stream as the buffer is filled.\n\tgo func() {\n\t\terr := func() error {\n\t\t\t// Unless the user told us the content type, we have to determine it from\n\t\t\t// the first read.\n\t\t\tif params.attrs.ContentType == \"\" && !params.forceEmptyContentType {\n\t\t\t\tgw.reader, gw.spec.Resource.ContentType = gax.DetermineContentType(gw.reader)\n\t\t\t}\n\n\t\t\t// Loop until there is an error or the Object has been finalized.\n\t\t\tfor {\n\t\t\t\t// Note: This blocks until either the buffer is full or EOF is read.\n\t\t\t\trecvd, doneReading, err := gw.read()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\n\t\t\t\tuploadBuff := func(ctx context.Context) error {\n\t\t\t\t\tobj, err := gw.uploadBuffer(ctx, recvd, offset, doneReading)\n\t\t\t\t\tif obj != nil {\n\t\t\t\t\t\to = obj\n\t\t\t\t\t\tsetObj(newObjectFromProto(o))\n\t\t\t\t\t}\n\t\t\t\t\treturn err\n\t\t\t\t}\n\n\t\t\t\t// Add routing headers to the context metadata for single-shot and resumable\n\t\t\t\t// writes. Append writes need to set this at a lower level to pass the routing\n\t\t\t\t// token.\n\t\t\t\tbctx := gw.ctx\n\t\t\t\tif !gw.append {\n\t\t\t\t\tbctx = bucketContext(bctx, gw.bucket)\n\t\t\t\t}\n\t\t\t\terr = run(bctx, uploadBuff, gw.settings.retry, s.idempotent)\n\t\t\t\toffset += int64(recvd)\n\t\t\t\t// If this buffer upload was triggered by a flush, reset and\n\t\t\t\t// communicate back the result.\n\t\t\t\tif gw.flushInProgress {\n\t\t\t\t\tgw.setSize(offset)\n\t\t\t\t\tgw.flushInProgress = false\n\t\t\t\t\tgw.flushComplete <- flushResult{offset: offset, err: err}\n\t\t\t\t}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\t// When we are done reading data without errors, set the object and\n\t\t\t\t// finish.\n\t\t\t\tif doneReading {\n\t\t\t\t\t// Build Object from server's response.\n\t\t\t\t\tsetObj(newObjectFromProto(o))\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t}\n\t\t}()\n\n\t\t// These calls are still valid if err is nil\n\t\terr = checkCanceled(err)\n\t\terrorf(err)\n\t\tgw.pr.CloseWithError(err)\n\t\tclose(params.donec)\n\t}()\n\n\treturn pw, nil\n}\n\nfunc newGRPCWriter(c *grpcStorageClient, s *settings, params *openWriterParams, r io.Reader, pr *io.PipeReader, pw *io.PipeWriter, setPipeWriter func(*io.PipeWriter)) (*gRPCWriter, error) {\n\tif params.attrs.Retention != nil {\n\t\t// TO-DO: remove once ObjectRetention is available - see b/308194853\n\t\treturn nil, status.Errorf(codes.Unimplemented, \"storage: object retention is not supported in gRPC\")\n\t}\n\n\tsize := googleapi.MinUploadChunkSize\n\t// A completely bufferless upload (params.chunkSize <= 0) is not possible in\n\t// gRPC because the buffer must be provided to the message. Use the minimum\n\t// size possible.\n\tif params.chunkSize > 0 {\n\t\tsize = params.chunkSize\n\t}\n\n\t// Round up chunksize to nearest 256KiB\n\tif size%googleapi.MinUploadChunkSize != 0 {\n\t\tsize += googleapi.MinUploadChunkSize - (size % googleapi.MinUploadChunkSize)\n\t}\n\n\tif s.userProject != \"\" {\n\t\tparams.ctx = setUserProjectMetadata(params.ctx, s.userProject)\n\t}\n\n\tspec := &storagepb.WriteObjectSpec{\n\t\tResource:   params.attrs.toProtoObject(params.bucket),\n\t\tAppendable: proto.Bool(params.append),\n\t}\n\tvar appendSpec *storagepb.AppendObjectSpec\n\tif params.appendGen > 0 {\n\t\tappendSpec = &storagepb.AppendObjectSpec{\n\t\t\tBucket:     bucketResourceName(globalProjectAlias, params.bucket),\n\t\t\tObject:     params.attrs.Name,\n\t\t\tGeneration: params.appendGen,\n\t\t}\n\t}\n\t// WriteObject doesn't support the generation condition, so use default.\n\tif err := applyCondsProto(\"WriteObject\", defaultGen, params.conds, spec); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &gRPCWriter{\n\t\tbuf:                   make([]byte, size),\n\t\tc:                     c,\n\t\tctx:                   params.ctx,\n\t\treader:                r,\n\t\tpw:                    pw,\n\t\tpr:                    pr,\n\t\tbucket:                params.bucket,\n\t\tattrs:                 params.attrs,\n\t\tconds:                 params.conds,\n\t\tspec:                  spec,\n\t\tappendSpec:            appendSpec,\n\t\tencryptionKey:         params.encryptionKey,\n\t\tsettings:              s,\n\t\tprogress:              params.progress,\n\t\tsetSize:               params.setSize,\n\t\tsendCRC32C:            params.sendCRC32C,\n\t\tforceOneShot:          params.chunkSize <= 0,\n\t\tforceEmptyContentType: params.forceEmptyContentType,\n\t\tappend:                params.append,\n\t\tfinalizeOnClose:       params.finalizeOnClose,\n\t\tsetPipeWriter:         setPipeWriter,\n\t\tflushComplete:         make(chan flushResult),\n\t}, nil\n}\n\n// gRPCWriter is a wrapper around the the gRPC client-stream API that manages\n// sending chunks of data provided by the user over the stream.\ntype gRPCWriter struct {\n\tc             *grpcStorageClient\n\tbuf           []byte\n\treader        io.Reader\n\tpr            *io.PipeReader // Keep track of pr and pw to update post-flush\n\tpw            *io.PipeWriter\n\tsetPipeWriter func(*io.PipeWriter) // used to set in parent storage.Writer\n\n\tctx context.Context\n\n\tbucket        string\n\tattrs         *ObjectAttrs\n\tconds         *Conditions\n\tspec          *storagepb.WriteObjectSpec\n\tappendSpec    *storagepb.AppendObjectSpec\n\tencryptionKey []byte\n\tsettings      *settings\n\tprogress      func(int64)\n\tsetSize       func(int64)\n\n\tsendCRC32C            bool\n\tforceOneShot          bool\n\tforceEmptyContentType bool\n\tappend                bool\n\tfinalizeOnClose       bool\n\n\tstreamSender    gRPCBidiWriteBufferSender\n\tflushInProgress bool             // true when the pipe is being recreated for a flush.\n\tflushComplete   chan flushResult // use to signal back to flush call that flush to server was completed.\n}\n\ntype flushResult struct {\n\terr    error\n\toffset int64\n}\n\nfunc bucketContext(ctx context.Context, bucket string) context.Context {\n\thds := []string{\"x-goog-request-params\", fmt.Sprintf(\"bucket=projects/_/buckets/%s\", url.QueryEscape(bucket))}\n\treturn gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n}\n\n// drainInboundStream calls stream.Recv() repeatedly until an error is returned.\n// It returns the last Resource received on the stream, or nil if no Resource\n// was returned. drainInboundStream always returns a non-nil error. io.EOF\n// indicates all messages were successfully read.\nfunc drainInboundStream(stream storagepb.Storage_BidiWriteObjectClient) (object *storagepb.Object, err error) {\n\tfor err == nil {\n\t\tvar resp *storagepb.BidiWriteObjectResponse\n\t\tresp, err = stream.Recv()\n\t\t// GetResource() returns nil on a nil response\n\t\tif resp.GetResource() != nil {\n\t\t\tobject = resp.GetResource()\n\t\t}\n\t}\n\treturn object, err\n}\n\nfunc bidiWriteObjectRequest(buf []byte, offset int64, flush, finishWrite bool) *storagepb.BidiWriteObjectRequest {\n\tvar data *storagepb.BidiWriteObjectRequest_ChecksummedData\n\tif buf != nil {\n\t\tdata = &storagepb.BidiWriteObjectRequest_ChecksummedData{\n\t\t\tChecksummedData: &storagepb.ChecksummedData{\n\t\t\t\tContent: buf,\n\t\t\t},\n\t\t}\n\t}\n\treq := &storagepb.BidiWriteObjectRequest{\n\t\tData:        data,\n\t\tWriteOffset: offset,\n\t\tFinishWrite: finishWrite,\n\t\tFlush:       flush,\n\t\tStateLookup: flush,\n\t}\n\treturn req\n}\n\ntype gRPCBidiWriteBufferSender interface {\n\t// sendBuffer implementations should upload buf, respecting flush and\n\t// finishWrite. Callers must guarantee that buf is not too long to fit in a\n\t// gRPC message.\n\t//\n\t// If flush is true, implementations must not return until the data in buf is\n\t// stable. If finishWrite is true, implementations must return the object on\n\t// success.\n\tsendBuffer(ctx context.Context, buf []byte, offset int64, flush, finishWrite bool) (*storagepb.Object, error)\n}\n\ntype gRPCOneshotBidiWriteBufferSender struct {\n\tfirstMessage *storagepb.BidiWriteObjectRequest\n\traw          *gapic.Client\n\tstream       storagepb.Storage_BidiWriteObjectClient\n\tsettings     *settings\n}\n\nfunc (w *gRPCWriter) newGRPCOneshotBidiWriteBufferSender() (*gRPCOneshotBidiWriteBufferSender, error) {\n\tfirstMessage := &storagepb.BidiWriteObjectRequest{\n\t\tFirstMessage: &storagepb.BidiWriteObjectRequest_WriteObjectSpec{\n\t\t\tWriteObjectSpec: w.spec,\n\t\t},\n\t\tCommonObjectRequestParams: toProtoCommonObjectRequestParams(w.encryptionKey),\n\t\t// For a non-resumable upload, checksums must be sent in this message.\n\t\t// TODO: Currently the checksums are only sent on the first message\n\t\t// of the stream, but in the future, we must also support sending it\n\t\t// on the *last* message of the stream (instead of the first).\n\t\tObjectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs),\n\t}\n\n\treturn &gRPCOneshotBidiWriteBufferSender{\n\t\tfirstMessage: firstMessage,\n\t\traw:          w.c.raw,\n\t\tsettings:     w.settings,\n\t}, nil\n}\n\nfunc (s *gRPCOneshotBidiWriteBufferSender) sendBuffer(ctx context.Context, buf []byte, offset int64, flush, finishWrite bool) (obj *storagepb.Object, err error) {\n\tvar firstMessage *storagepb.BidiWriteObjectRequest\n\tif s.stream == nil {\n\t\ts.stream, err = s.raw.BidiWriteObject(ctx, s.settings.gax...)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tfirstMessage = s.firstMessage\n\t}\n\treq := bidiWriteObjectRequest(buf, offset, flush, finishWrite)\n\tif firstMessage != nil {\n\t\tproto.Merge(req, firstMessage)\n\t}\n\n\tsendErr := s.stream.Send(req)\n\tif sendErr != nil {\n\t\tobj, err = drainInboundStream(s.stream)\n\t\ts.stream = nil\n\t\tif sendErr != io.EOF {\n\t\t\terr = sendErr\n\t\t}\n\t\treturn\n\t}\n\t// Oneshot uploads assume all flushes succeed\n\n\tif finishWrite {\n\t\ts.stream.CloseSend()\n\t\t// Oneshot uploads only read from the response stream on completion or\n\t\t// failure\n\t\tobj, err = drainInboundStream(s.stream)\n\t\ts.stream = nil\n\t\tif err == io.EOF {\n\t\t\terr = nil\n\t\t}\n\t}\n\treturn\n}\n\ntype gRPCResumableBidiWriteBufferSender struct {\n\tqueryRetry        *retryConfig\n\tupid              string\n\tprogress          func(int64)\n\traw               *gapic.Client\n\tforceFirstMessage bool\n\tstream            storagepb.Storage_BidiWriteObjectClient\n\tflushOffset       int64\n\tsettings          *settings\n}\n\nfunc (w *gRPCWriter) newGRPCResumableBidiWriteBufferSender(ctx context.Context) (*gRPCResumableBidiWriteBufferSender, error) {\n\treq := &storagepb.StartResumableWriteRequest{\n\t\tWriteObjectSpec:           w.spec,\n\t\tCommonObjectRequestParams: toProtoCommonObjectRequestParams(w.encryptionKey),\n\t\t// TODO: Currently the checksums are only sent on the request to initialize\n\t\t// the upload, but in the future, we must also support sending it\n\t\t// on the *last* message of the stream.\n\t\tObjectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs),\n\t}\n\n\tvar upid string\n\terr := run(ctx, func(ctx context.Context) error {\n\t\tupres, err := w.c.raw.StartResumableWrite(ctx, req, w.settings.gax...)\n\t\tupid = upres.GetUploadId()\n\t\treturn err\n\t}, w.settings.retry, w.settings.idempotent)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Set up an initial connection for the 0 offset, so we don't query state\n\t// unnecessarily for the first buffer. If we fail, we'll just retry in the\n\t// normal connect path.\n\tstream, err := w.c.raw.BidiWriteObject(ctx, w.settings.gax...)\n\tif err != nil {\n\t\tstream = nil\n\t}\n\n\treturn &gRPCResumableBidiWriteBufferSender{\n\t\tqueryRetry:        w.settings.retry,\n\t\tupid:              upid,\n\t\tprogress:          w.progress,\n\t\traw:               w.c.raw,\n\t\tforceFirstMessage: true,\n\t\tstream:            stream,\n\t\tsettings:          w.settings,\n\t}, nil\n}\n\n// queryProgress is a helper that queries the status of the resumable upload\n// associated with the given upload ID.\nfunc (s *gRPCResumableBidiWriteBufferSender) queryProgress(ctx context.Context) (int64, error) {\n\tvar persistedSize int64\n\terr := run(ctx, func(ctx context.Context) error {\n\t\tq, err := s.raw.QueryWriteStatus(ctx, &storagepb.QueryWriteStatusRequest{\n\t\t\tUploadId: s.upid,\n\t\t}, s.settings.gax...)\n\t\t// q.GetPersistedSize() will return 0 if q is nil.\n\t\tpersistedSize = q.GetPersistedSize()\n\t\treturn err\n\t}, s.queryRetry, true)\n\n\treturn persistedSize, err\n}\n\nfunc (s *gRPCResumableBidiWriteBufferSender) sendBuffer(ctx context.Context, buf []byte, offset int64, flush, finishWrite bool) (obj *storagepb.Object, err error) {\n\tif s.stream == nil {\n\t\t// Determine offset and reconnect\n\t\ts.flushOffset, err = s.queryProgress(ctx)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\ts.stream, err = s.raw.BidiWriteObject(ctx, s.settings.gax...)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\ts.forceFirstMessage = true\n\t}\n\n\t// clean up buf. We'll still write the message if a flush/finishWrite was\n\t// requested.\n\tif offset < s.flushOffset {\n\t\ttrim := s.flushOffset - offset\n\t\tif int64(len(buf)) <= trim {\n\t\t\ttrim = int64(len(buf))\n\t\t}\n\t\tbuf = buf[trim:]\n\t\toffset += trim\n\t}\n\tif len(buf) == 0 && !flush && !finishWrite {\n\t\t// no need to send anything\n\t\treturn nil, nil\n\t}\n\n\treq := bidiWriteObjectRequest(buf, offset, flush, finishWrite)\n\tif s.forceFirstMessage {\n\t\treq.FirstMessage = &storagepb.BidiWriteObjectRequest_UploadId{UploadId: s.upid}\n\t\ts.forceFirstMessage = false\n\t}\n\n\tsendErr := s.stream.Send(req)\n\tif sendErr != nil {\n\t\tobj, err = drainInboundStream(s.stream)\n\t\ts.stream = nil\n\t\tif err == io.EOF {\n\t\t\t// This is unexpected - we got an error on Send(), but not on Recv().\n\t\t\t// Bubble up the sendErr.\n\t\t\terr = sendErr\n\t\t}\n\t\treturn\n\t}\n\n\tif finishWrite {\n\t\ts.stream.CloseSend()\n\t\tobj, err = drainInboundStream(s.stream)\n\t\ts.stream = nil\n\t\tif err == io.EOF {\n\t\t\terr = nil\n\t\t\tif obj.GetSize() > s.flushOffset {\n\t\t\t\ts.progress(obj.GetSize())\n\t\t\t}\n\t\t}\n\t\treturn\n\t}\n\n\tif flush {\n\t\tresp, err := s.stream.Recv()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tpersistedOffset := resp.GetPersistedSize()\n\t\tif persistedOffset > s.flushOffset {\n\t\t\ts.flushOffset = persistedOffset\n\t\t\ts.progress(s.flushOffset)\n\t\t}\n\t}\n\treturn\n}\n\n// uploadBuffer uploads the buffer at the given offset using a bi-directional\n// Write stream. It will open a new stream if necessary (on the first call or\n// after resuming from failure) and chunk the buffer per maxPerMessageWriteSize.\n// The final Object is returned on success if doneReading is true.\n//\n// Returns object and any error that is not retriable.\nfunc (w *gRPCWriter) uploadBuffer(ctx context.Context, recvd int, start int64, doneReading bool) (obj *storagepb.Object, err error) {\n\tif w.streamSender == nil {\n\t\tif w.append {\n\t\t\t// Appendable object semantics\n\t\t\tw.streamSender, err = w.newGRPCAppendableObjectBufferSender()\n\t\t} else if doneReading || w.forceOneShot {\n\t\t\t// One shot semantics\n\t\t\tw.streamSender, err = w.newGRPCOneshotBidiWriteBufferSender()\n\t\t} else {\n\t\t\t// Resumable write semantics\n\t\t\tw.streamSender, err = w.newGRPCResumableBidiWriteBufferSender(ctx)\n\t\t}\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\tdata := w.buf[:recvd]\n\toffset := start\n\t// We want to go through this loop at least once, in case we have to\n\t// finishWrite with an empty buffer.\n\tfor {\n\t\t// Send as much as we can fit into a single gRPC message. Only flush once,\n\t\t// when sending the very last message.\n\t\tl := maxPerMessageWriteSize\n\t\tflush := false\n\t\tif len(data) <= l {\n\t\t\tl = len(data)\n\t\t\tflush = true\n\t\t}\n\t\tobj, err = w.streamSender.sendBuffer(ctx, data[:l], offset, flush, flush && doneReading)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tdata = data[l:]\n\t\toffset += int64(l)\n\t\tif len(data) == 0 {\n\t\t\t// Update object size to match persisted offset.\n\t\t\tif obj != nil {\n\t\t\t\tobj.Size = offset\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t}\n\treturn\n}\n\n// read copies the data in the reader to the given buffer and reports how much\n// data was read into the buffer and if there is no more data to read (EOF).\n// read returns when either 1. the buffer is full, 2. Writer.Flush was called,\n// or 3. Writer.Close was called.\nfunc (w *gRPCWriter) read() (int, bool, error) {\n\t// Set n to -1 to start the Read loop.\n\tvar n, recvd int = -1, 0\n\tvar err error\n\tfor err == nil && n != 0 {\n\t\t// The routine blocks here until data is received.\n\t\tn, err = w.reader.Read(w.buf[recvd:])\n\t\trecvd += n\n\t}\n\tvar done bool\n\tif err == io.EOF {\n\t\terr = nil\n\t\t// EOF can come from Writer.Flush or Writer.Close.\n\t\tif w.flushInProgress {\n\t\t\t// Reset pipe for additional writes after the flush.\n\t\t\tpr, pw := io.Pipe()\n\t\t\tw.reader = pr\n\t\t\tw.pw = pw\n\t\t\tw.pr = pr\n\t\t\tw.setPipeWriter(pw)\n\t\t} else {\n\t\t\tdone = true\n\t\t}\n\t}\n\treturn recvd, done, err\n}\n\n// flush flushes the current buffer regardless of whether it is full or not.\n// It's the implementation for Writer.Flush.\nfunc (w *gRPCWriter) flush() (int64, error) {\n\tif !w.append {\n\t\treturn 0, errors.New(\"Flush is supported only if Writer.Append is set to true\")\n\t}\n\n\t// Close PipeWriter to trigger EOF on read side of the stream.\n\tw.flushInProgress = true\n\tw.pw.Close()\n\n\t// Wait for flush to complete\n\tresult := <-w.flushComplete\n\treturn result.offset, result.err\n}\n\nfunc checkCanceled(err error) error {\n\tif status.Code(err) == codes.Canceled {\n\t\treturn context.Canceled\n\t}\n\n\treturn err\n}\n\ntype gRPCAppendBidiWriteBufferSender struct {\n\tbucket          string\n\troutingToken    *string\n\traw             *gapic.Client\n\tsettings        *settings\n\tstream          storagepb.Storage_BidiWriteObjectClient\n\tfirstMessage    *storagepb.BidiWriteObjectRequest\n\tobjectChecksums *storagepb.ObjectChecksums\n\n\tfinalizeOnClose bool\n\n\tforceFirstMessage bool\n\tprogress          func(int64)\n\tflushOffset       int64\n\ttakeoverOffset    int64\n\tobjResource       *storagepb.Object // Captures received obj to set w.Attrs.\n\n\t// Fields used to report responses from the receive side of the stream\n\t// recvs is closed when the current recv goroutine is complete. recvErr is set\n\t// to the result of that stream (including io.EOF to indicate success)\n\trecvs   <-chan *storagepb.BidiWriteObjectResponse\n\trecvErr error\n}\n\n// Use for a newly created appendable object.\nfunc (w *gRPCWriter) newGRPCAppendableObjectBufferSender() (*gRPCAppendBidiWriteBufferSender, error) {\n\ts := &gRPCAppendBidiWriteBufferSender{\n\t\tbucket:   w.spec.GetResource().GetBucket(),\n\t\traw:      w.c.raw,\n\t\tsettings: w.settings,\n\t\tfirstMessage: &storagepb.BidiWriteObjectRequest{\n\t\t\tFirstMessage: &storagepb.BidiWriteObjectRequest_WriteObjectSpec{\n\t\t\t\tWriteObjectSpec: w.spec,\n\t\t\t},\n\t\t\tCommonObjectRequestParams: toProtoCommonObjectRequestParams(w.encryptionKey),\n\t\t},\n\t\tobjectChecksums:   toProtoChecksums(w.sendCRC32C, w.attrs),\n\t\tfinalizeOnClose:   w.finalizeOnClose,\n\t\tforceFirstMessage: true,\n\t\tprogress:          w.progress,\n\t}\n\treturn s, nil\n}\n\n// Use for a takeover of an appendable object.\n// Unlike newGRPCAppendableObjectBufferSender, this blocks until the stream is\n// open because it needs to get the append offset from the server.\nfunc (w *gRPCWriter) newGRPCAppendTakeoverWriteBufferSender(ctx context.Context) (*gRPCAppendBidiWriteBufferSender, error) {\n\ts := &gRPCAppendBidiWriteBufferSender{\n\t\tbucket:   w.spec.GetResource().GetBucket(),\n\t\traw:      w.c.raw,\n\t\tsettings: w.settings,\n\t\tfirstMessage: &storagepb.BidiWriteObjectRequest{\n\t\t\tFirstMessage: &storagepb.BidiWriteObjectRequest_AppendObjectSpec{\n\t\t\t\tAppendObjectSpec: w.appendSpec,\n\t\t\t},\n\t\t},\n\t\tobjectChecksums:   toProtoChecksums(w.sendCRC32C, w.attrs),\n\t\tfinalizeOnClose:   w.finalizeOnClose,\n\t\tforceFirstMessage: true,\n\t\tprogress:          w.progress,\n\t}\n\tif err := s.connect(ctx); err != nil {\n\t\treturn nil, fmt.Errorf(\"storage: opening appendable write stream: %w\", err)\n\t}\n\t_, err := s.sendOnConnectedStream(nil, 0, false, false, true)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfirstResp := <-s.recvs\n\t// Check recvErr after getting the response.\n\tif s.recvErr != nil {\n\t\treturn nil, s.recvErr\n\t}\n\n\t// Object resource is returned in the first response on takeover, so capture\n\t// this now.\n\ts.objResource = firstResp.GetResource()\n\ts.takeoverOffset = firstResp.GetResource().GetSize()\n\treturn s, nil\n}\n\nfunc (s *gRPCAppendBidiWriteBufferSender) connect(ctx context.Context) (err error) {\n\terr = func() error {\n\t\t// If this is a forced first message, we've already determined it's safe to\n\t\t// send.\n\t\tif s.forceFirstMessage {\n\t\t\ts.forceFirstMessage = false\n\t\t\treturn nil\n\t\t}\n\n\t\t// It's always ok to reconnect if there is a handle. This is the common\n\t\t// case.\n\t\tif s.firstMessage.GetAppendObjectSpec().GetWriteHandle() != nil {\n\t\t\treturn nil\n\t\t}\n\t\t// Also always okay to reconnect if there is a generation.\n\t\tif s.firstMessage.GetAppendObjectSpec().GetGeneration() != 0 {\n\t\t\treturn nil\n\t\t}\n\t\t// Also always ok to reconnect if we've seen a redirect token\n\t\tif s.routingToken != nil {\n\t\t\treturn nil\n\t\t}\n\n\t\t// We can also reconnect if the first message has an if_generation_match or\n\t\t// if_metageneration_match condition. Note that negative conditions like\n\t\t// if_generation_not_match are not necessarily safe to retry.\n\t\taos := s.firstMessage.GetAppendObjectSpec()\n\t\twos := s.firstMessage.GetWriteObjectSpec()\n\n\t\tif aos != nil && aos.IfMetagenerationMatch != nil {\n\t\t\treturn nil\n\t\t}\n\n\t\tif wos != nil && wos.IfGenerationMatch != nil {\n\t\t\treturn nil\n\t\t}\n\t\tif wos != nil && wos.IfMetagenerationMatch != nil {\n\t\t\treturn nil\n\t\t}\n\n\t\t// Otherwise, it is not safe to reconnect.\n\t\treturn errors.New(\"cannot safely reconnect; no write handle or preconditions\")\n\t}()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn s.startReceiver(ctx)\n}\n\nfunc (s *gRPCAppendBidiWriteBufferSender) withRequestParams(ctx context.Context) context.Context {\n\tparam := fmt.Sprintf(\"appendable=true&bucket=%s\", s.bucket)\n\tif s.routingToken != nil {\n\t\tparam = param + fmt.Sprintf(\"&routing_token=%s\", *s.routingToken)\n\t}\n\treturn gax.InsertMetadataIntoOutgoingContext(ctx, \"x-goog-request-params\", param)\n}\n\nfunc (s *gRPCAppendBidiWriteBufferSender) startReceiver(ctx context.Context) (err error) {\n\ts.stream, err = s.raw.BidiWriteObject(s.withRequestParams(ctx), s.settings.gax...)\n\tif err != nil {\n\t\treturn\n\t}\n\n\trecvs := make(chan *storagepb.BidiWriteObjectResponse)\n\ts.recvs = recvs\n\ts.recvErr = nil\n\tgo s.receiveMessages(recvs)\n\treturn\n}\n\nfunc (s *gRPCAppendBidiWriteBufferSender) ensureFirstMessageAppendObjectSpec() {\n\tif s.firstMessage.GetWriteObjectSpec() != nil {\n\t\tw := s.firstMessage.GetWriteObjectSpec()\n\t\ts.firstMessage.FirstMessage = &storagepb.BidiWriteObjectRequest_AppendObjectSpec{\n\t\t\tAppendObjectSpec: &storagepb.AppendObjectSpec{\n\t\t\t\tBucket:                   w.GetResource().GetBucket(),\n\t\t\t\tObject:                   w.GetResource().GetName(),\n\t\t\t\tIfMetagenerationMatch:    w.IfMetagenerationMatch,\n\t\t\t\tIfMetagenerationNotMatch: w.IfMetagenerationNotMatch,\n\t\t\t},\n\t\t}\n\t}\n}\n\nfunc (s *gRPCAppendBidiWriteBufferSender) maybeUpdateFirstMessage(resp *storagepb.BidiWriteObjectResponse) {\n\t// Any affirmative response should switch us to an AppendObjectSpec.\n\ts.ensureFirstMessageAppendObjectSpec()\n\n\tif r := resp.GetResource(); r != nil {\n\t\taos := s.firstMessage.GetAppendObjectSpec()\n\t\taos.Bucket = r.GetBucket()\n\t\taos.Object = r.GetName()\n\t\taos.Generation = r.GetGeneration()\n\t}\n\n\tif h := resp.GetWriteHandle(); h != nil {\n\t\ts.firstMessage.GetAppendObjectSpec().WriteHandle = h\n\t}\n}\n\ntype bidiWriteObjectRedirectionError struct{}\n\nfunc (e bidiWriteObjectRedirectionError) Error() string {\n\treturn \"\"\n}\n\nfunc (s *gRPCAppendBidiWriteBufferSender) handleRedirectionError(e *storagepb.BidiWriteObjectRedirectedError) bool {\n\tif e.RoutingToken == nil {\n\t\t// This shouldn't happen, but we don't want to blindly retry here. Instead,\n\t\t// surface the error to the caller.\n\t\treturn false\n\t}\n\n\tif e.WriteHandle != nil {\n\t\t// If we get back a write handle, we should use it. We can only use it\n\t\t// on an append object spec.\n\t\ts.ensureFirstMessageAppendObjectSpec()\n\t\ts.firstMessage.GetAppendObjectSpec().WriteHandle = e.WriteHandle\n\t\t// Generation is meant to only come with the WriteHandle, so ignore it\n\t\t// otherwise.\n\t\tif e.Generation != nil {\n\t\t\ts.firstMessage.GetAppendObjectSpec().Generation = e.GetGeneration()\n\t\t}\n\t}\n\n\ts.routingToken = e.RoutingToken\n\treturn true\n}\n\nfunc (s *gRPCAppendBidiWriteBufferSender) receiveMessages(resps chan<- *storagepb.BidiWriteObjectResponse) {\n\tresp, err := s.stream.Recv()\n\tfor err == nil {\n\t\ts.maybeUpdateFirstMessage(resp)\n\n\t\tif resp.WriteStatus != nil {\n\t\t\t// We only get a WriteStatus if this was a solicited message (either\n\t\t\t// state_lookup: true or finish_write: true). Unsolicited messages may\n\t\t\t// arrive to update our handle if necessary. We don't want to block on\n\t\t\t// this channel write if this was an unsolicited message.\n\t\t\tresps <- resp\n\t\t}\n\n\t\tresp, err = s.stream.Recv()\n\t}\n\n\tif st, ok := status.FromError(err); ok && st.Code() == codes.Aborted {\n\t\tfor _, d := range st.Details() {\n\t\t\tif e, ok := d.(*storagepb.BidiWriteObjectRedirectedError); ok {\n\t\t\t\t// If we can handle this error, wrap it with the sentinel so it gets\n\t\t\t\t// retried.\n\t\t\t\tif ok := s.handleRedirectionError(e); ok {\n\t\t\t\t\terr = fmt.Errorf(\"%w%w\", bidiWriteObjectRedirectionError{}, err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// TODO: automatically reconnect on retriable recv errors, even if there are\n\t// no sends occurring.\n\ts.recvErr = err\n\tclose(resps)\n}\n\nfunc (s *gRPCAppendBidiWriteBufferSender) sendOnConnectedStream(buf []byte, offset int64, flush, finishWrite, sendFirstMessage bool) (obj *storagepb.Object, err error) {\n\tvar req *storagepb.BidiWriteObjectRequest\n\tfinalizeObject := finishWrite && s.finalizeOnClose\n\tif finishWrite {\n\t\t// Always flush when finishing the Write, even if not finalizing.\n\t\treq = bidiWriteObjectRequest(buf, offset, true, finalizeObject)\n\t} else {\n\t\treq = bidiWriteObjectRequest(buf, offset, flush, false)\n\t}\n\tif finalizeObject {\n\t\t// appendable objects pass checksums on the finalize message only\n\t\treq.ObjectChecksums = s.objectChecksums\n\t}\n\tif sendFirstMessage {\n\t\tproto.Merge(req, s.firstMessage)\n\t}\n\n\tif err = s.stream.Send(req); err != nil {\n\t\treturn nil, err\n\t}\n\n\tif finishWrite {\n\t\ts.stream.CloseSend()\n\t\tfor resp := range s.recvs {\n\t\t\tif resp.GetResource() != nil {\n\t\t\t\tobj = resp.GetResource()\n\t\t\t}\n\t\t\t// When closing the stream, update the object resource to reflect\n\t\t\t// the persisted size. We get a new object from the stream if\n\t\t\t// the object was finalized, but not if it's unfinalized.\n\t\t\tif s.objResource != nil && resp.GetPersistedSize() > 0 {\n\t\t\t\ts.objResource.Size = resp.GetPersistedSize()\n\t\t\t}\n\t\t}\n\t\tif s.recvErr != io.EOF {\n\t\t\treturn nil, s.recvErr\n\t\t}\n\t\tif obj.GetSize() > s.flushOffset {\n\t\t\ts.flushOffset = obj.GetSize()\n\t\t\ts.progress(s.flushOffset)\n\t\t}\n\t\treturn\n\t}\n\n\tif flush {\n\t\t// We don't necessarily expect multiple responses for a single flush, but\n\t\t// this allows the server to send multiple responses if it wants to.\n\t\tflushOffset := s.flushOffset\n\n\t\t// Await a response on the stream. Loop at least once or until the\n\t\t// persisted offset matches the flush offset.\n\t\tfor {\n\t\t\tresp, ok := <-s.recvs\n\t\t\tif !ok {\n\t\t\t\treturn nil, s.recvErr\n\t\t\t}\n\t\t\tpSize := resp.GetPersistedSize()\n\t\t\trSize := resp.GetResource().GetSize()\n\t\t\tif flushOffset < pSize {\n\t\t\t\tflushOffset = pSize\n\t\t\t}\n\t\t\tif flushOffset < rSize {\n\t\t\t\tflushOffset = rSize\n\t\t\t}\n\t\t\t// On the first flush, we expect to get an object resource back and\n\t\t\t// should return it.\n\t\t\tif resp.GetResource() != nil {\n\t\t\t\tobj = resp.GetResource()\n\t\t\t}\n\t\t\tif flushOffset <= offset+int64(len(buf)) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif s.flushOffset < flushOffset {\n\t\t\ts.flushOffset = flushOffset\n\t\t\ts.progress(s.flushOffset)\n\t\t}\n\t}\n\treturn\n}\n\nfunc (s *gRPCAppendBidiWriteBufferSender) sendBuffer(ctx context.Context, buf []byte, offset int64, flush, finishWrite bool) (obj *storagepb.Object, err error) {\n\tfor {\n\t\tsendFirstMessage := false\n\t\tif s.stream == nil {\n\t\t\tsendFirstMessage = true\n\t\t\tif err = s.connect(ctx); err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tobj, err = s.sendOnConnectedStream(buf, offset, flush, finishWrite, sendFirstMessage)\n\t\tif obj != nil {\n\t\t\ts.objResource = obj\n\t\t}\n\t\tif err == nil {\n\t\t\treturn\n\t\t}\n\n\t\t// await recv stream termination\n\t\tfor range s.recvs {\n\t\t}\n\t\tif s.recvErr != io.EOF {\n\t\t\terr = s.recvErr\n\t\t}\n\t\ts.stream = nil\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/hmac.go",
    "content": "// Copyright 2019 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"google.golang.org/api/iterator\"\n\traw \"google.golang.org/api/storage/v1\"\n)\n\n// HMACState is the state of the HMAC key.\ntype HMACState string\n\nconst (\n\t// Active is the status for an active key that can be used to sign\n\t// requests.\n\tActive HMACState = \"ACTIVE\"\n\n\t// Inactive is the status for an inactive key thus requests signed by\n\t// this key will be denied.\n\tInactive HMACState = \"INACTIVE\"\n\n\t// Deleted is the status for a key that is deleted.\n\t// Once in this state the key cannot key cannot be recovered\n\t// and does not count towards key limits. Deleted keys will be cleaned\n\t// up later.\n\tDeleted HMACState = \"DELETED\"\n)\n\n// HMACKey is the representation of a Google Cloud Storage HMAC key.\n//\n// HMAC keys are used to authenticate signed access to objects. To enable HMAC key\n// authentication, please visit https://cloud.google.com/storage/docs/migrating.\ntype HMACKey struct {\n\t// The HMAC's secret key.\n\tSecret string\n\n\t// AccessID is the ID of the HMAC key.\n\tAccessID string\n\n\t// Etag is the HTTP/1.1 Entity tag.\n\tEtag string\n\n\t// ID is the ID of the HMAC key, including the ProjectID and AccessID.\n\tID string\n\n\t// ProjectID is the ID of the project that owns the\n\t// service account to which the key authenticates.\n\tProjectID string\n\n\t// ServiceAccountEmail is the email address\n\t// of the key's associated service account.\n\tServiceAccountEmail string\n\n\t// CreatedTime is the creation time of the HMAC key.\n\tCreatedTime time.Time\n\n\t// UpdatedTime is the last modification time of the HMAC key metadata.\n\tUpdatedTime time.Time\n\n\t// State is the state of the HMAC key.\n\t// It can be one of StateActive, StateInactive or StateDeleted.\n\tState HMACState\n}\n\n// HMACKeyHandle helps provide access and management for HMAC keys.\ntype HMACKeyHandle struct {\n\tprojectID string\n\taccessID  string\n\tretry     *retryConfig\n\ttc        storageClient\n}\n\n// HMACKeyHandle creates a handle that will be used for HMACKey operations.\nfunc (c *Client) HMACKeyHandle(projectID, accessID string) *HMACKeyHandle {\n\treturn &HMACKeyHandle{\n\t\tprojectID: projectID,\n\t\taccessID:  accessID,\n\t\tretry:     c.retry,\n\t\ttc:        c.tc,\n\t}\n}\n\n// Get invokes an RPC to retrieve the HMAC key referenced by the\n// HMACKeyHandle's accessID.\n//\n// Options such as UserProjectForHMACKeys can be used to set the\n// userProject to be billed against for operations.\n// Note: gRPC is not supported.\nfunc (hkh *HMACKeyHandle) Get(ctx context.Context, opts ...HMACKeyOption) (*HMACKey, error) {\n\tdesc := new(hmacKeyDesc)\n\tfor _, opt := range opts {\n\t\topt.withHMACKeyDesc(desc)\n\t}\n\n\to := makeStorageOpts(true, hkh.retry, desc.userProjectID)\n\thk, err := hkh.tc.GetHMACKey(ctx, hkh.projectID, hkh.accessID, o...)\n\n\treturn hk, err\n}\n\n// Delete invokes an RPC to delete the key referenced by accessID, on Google Cloud Storage.\n// Only inactive HMAC keys can be deleted.\n// After deletion, a key cannot be used to authenticate requests.\n// Note: gRPC is not supported.\nfunc (hkh *HMACKeyHandle) Delete(ctx context.Context, opts ...HMACKeyOption) error {\n\tdesc := new(hmacKeyDesc)\n\tfor _, opt := range opts {\n\t\topt.withHMACKeyDesc(desc)\n\t}\n\n\to := makeStorageOpts(true, hkh.retry, desc.userProjectID)\n\treturn hkh.tc.DeleteHMACKey(ctx, hkh.projectID, hkh.accessID, o...)\n}\n\nfunc toHMACKeyFromRaw(hk *raw.HmacKey, updatedTimeCanBeNil bool) (*HMACKey, error) {\n\thkmd := hk.Metadata\n\tif hkmd == nil {\n\t\treturn nil, errors.New(\"field Metadata cannot be nil\")\n\t}\n\tcreatedTime, err := time.Parse(time.RFC3339, hkmd.TimeCreated)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"field CreatedTime: %w\", err)\n\t}\n\tupdatedTime, err := time.Parse(time.RFC3339, hkmd.Updated)\n\tif err != nil && !updatedTimeCanBeNil {\n\t\treturn nil, fmt.Errorf(\"field UpdatedTime: %w\", err)\n\t}\n\n\thmKey := &HMACKey{\n\t\tAccessID:    hkmd.AccessId,\n\t\tSecret:      hk.Secret,\n\t\tEtag:        hkmd.Etag,\n\t\tID:          hkmd.Id,\n\t\tState:       HMACState(hkmd.State),\n\t\tProjectID:   hkmd.ProjectId,\n\t\tCreatedTime: createdTime,\n\t\tUpdatedTime: updatedTime,\n\n\t\tServiceAccountEmail: hkmd.ServiceAccountEmail,\n\t}\n\n\treturn hmKey, nil\n}\n\n// CreateHMACKey invokes an RPC for Google Cloud Storage to create a new HMACKey.\n// Note: gRPC is not supported.\nfunc (c *Client) CreateHMACKey(ctx context.Context, projectID, serviceAccountEmail string, opts ...HMACKeyOption) (*HMACKey, error) {\n\tif projectID == \"\" {\n\t\treturn nil, errors.New(\"storage: expecting a non-blank projectID\")\n\t}\n\tif serviceAccountEmail == \"\" {\n\t\treturn nil, errors.New(\"storage: expecting a non-blank service account email\")\n\t}\n\n\tdesc := new(hmacKeyDesc)\n\tfor _, opt := range opts {\n\t\topt.withHMACKeyDesc(desc)\n\t}\n\n\to := makeStorageOpts(false, c.retry, desc.userProjectID)\n\thk, err := c.tc.CreateHMACKey(ctx, projectID, serviceAccountEmail, o...)\n\treturn hk, err\n}\n\n// HMACKeyAttrsToUpdate defines the attributes of an HMACKey that will be updated.\ntype HMACKeyAttrsToUpdate struct {\n\t// State is required and must be either StateActive or StateInactive.\n\tState HMACState\n\n\t// Etag is an optional field and it is the HTTP/1.1 Entity tag.\n\tEtag string\n}\n\n// Update mutates the HMACKey referred to by accessID.\n// Note: gRPC is not supported.\nfunc (h *HMACKeyHandle) Update(ctx context.Context, au HMACKeyAttrsToUpdate, opts ...HMACKeyOption) (*HMACKey, error) {\n\tif au.State != Active && au.State != Inactive {\n\t\treturn nil, fmt.Errorf(\"storage: invalid state %q for update, must be either %q or %q\", au.State, Active, Inactive)\n\t}\n\n\tdesc := new(hmacKeyDesc)\n\tfor _, opt := range opts {\n\t\topt.withHMACKeyDesc(desc)\n\t}\n\n\tisIdempotent := len(au.Etag) > 0\n\to := makeStorageOpts(isIdempotent, h.retry, desc.userProjectID)\n\thk, err := h.tc.UpdateHMACKey(ctx, h.projectID, desc.forServiceAccountEmail, h.accessID, &au, o...)\n\treturn hk, err\n}\n\n// An HMACKeysIterator is an iterator over HMACKeys.\n//\n// Note: This iterator is not safe for concurrent operations without explicit synchronization.\ntype HMACKeysIterator struct {\n\tctx       context.Context\n\traw       *raw.ProjectsHmacKeysService\n\tprojectID string\n\thmacKeys  []*HMACKey\n\tpageInfo  *iterator.PageInfo\n\tnextFunc  func() error\n\tindex     int\n\tdesc      hmacKeyDesc\n\tretry     *retryConfig\n}\n\n// ListHMACKeys returns an iterator for listing HMACKeys.\n//\n// Note: This iterator is not safe for concurrent operations without explicit synchronization.\n// Note: gRPC is not supported.\nfunc (c *Client) ListHMACKeys(ctx context.Context, projectID string, opts ...HMACKeyOption) *HMACKeysIterator {\n\tdesc := new(hmacKeyDesc)\n\tfor _, opt := range opts {\n\t\topt.withHMACKeyDesc(desc)\n\t}\n\n\to := makeStorageOpts(true, c.retry, desc.userProjectID)\n\treturn c.tc.ListHMACKeys(ctx, projectID, desc.forServiceAccountEmail, desc.showDeletedKeys, o...)\n}\n\n// Next returns the next result. Its second return value is iterator.Done if\n// there are no more results. Once Next returns iterator.Done, all subsequent\n// calls will return iterator.Done.\n//\n// Note: This iterator is not safe for concurrent operations without explicit synchronization.\nfunc (it *HMACKeysIterator) Next() (*HMACKey, error) {\n\tif err := it.nextFunc(); err != nil {\n\t\treturn nil, err\n\t}\n\n\tkey := it.hmacKeys[it.index]\n\tit.index++\n\n\treturn key, nil\n}\n\n// PageInfo supports pagination. See the google.golang.org/api/iterator package for details.\n//\n// Note: This iterator is not safe for concurrent operations without explicit synchronization.\nfunc (it *HMACKeysIterator) PageInfo() *iterator.PageInfo { return it.pageInfo }\n\nfunc (it *HMACKeysIterator) fetch(pageSize int, pageToken string) (token string, err error) {\n\t// TODO: Remove fetch method upon integration. This method is internalized into\n\t// httpStorageClient.ListHMACKeys() as it is the only caller.\n\tcall := it.raw.List(it.projectID)\n\tif pageToken != \"\" {\n\t\tcall = call.PageToken(pageToken)\n\t}\n\tif it.desc.showDeletedKeys {\n\t\tcall = call.ShowDeletedKeys(true)\n\t}\n\tif it.desc.userProjectID != \"\" {\n\t\tcall = call.UserProject(it.desc.userProjectID)\n\t}\n\tif it.desc.forServiceAccountEmail != \"\" {\n\t\tcall = call.ServiceAccountEmail(it.desc.forServiceAccountEmail)\n\t}\n\tif pageSize > 0 {\n\t\tcall = call.MaxResults(int64(pageSize))\n\t}\n\n\tvar resp *raw.HmacKeysMetadata\n\terr = run(it.ctx, func(ctx context.Context) error {\n\t\tresp, err = call.Context(ctx).Do()\n\t\treturn err\n\t}, it.retry, true)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tfor _, metadata := range resp.Items {\n\t\thk := &raw.HmacKey{\n\t\t\tMetadata: metadata,\n\t\t}\n\t\thkey, err := toHMACKeyFromRaw(hk, true)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tit.hmacKeys = append(it.hmacKeys, hkey)\n\t}\n\treturn resp.NextPageToken, nil\n}\n\ntype hmacKeyDesc struct {\n\tforServiceAccountEmail string\n\tshowDeletedKeys        bool\n\tuserProjectID          string\n}\n\n// HMACKeyOption configures the behavior of HMACKey related methods and actions.\ntype HMACKeyOption interface {\n\twithHMACKeyDesc(*hmacKeyDesc)\n}\n\ntype hmacKeyDescFunc func(*hmacKeyDesc)\n\nfunc (hkdf hmacKeyDescFunc) withHMACKeyDesc(hkd *hmacKeyDesc) {\n\thkdf(hkd)\n}\n\n// ForHMACKeyServiceAccountEmail returns HMAC Keys that are\n// associated with the email address of a service account in the project.\n//\n// Only one service account email can be used as a filter, so if multiple\n// of these options are applied, the last email to be set will be used.\nfunc ForHMACKeyServiceAccountEmail(serviceAccountEmail string) HMACKeyOption {\n\treturn hmacKeyDescFunc(func(hkd *hmacKeyDesc) {\n\t\thkd.forServiceAccountEmail = serviceAccountEmail\n\t})\n}\n\n// ShowDeletedHMACKeys will also list keys whose state is \"DELETED\".\nfunc ShowDeletedHMACKeys() HMACKeyOption {\n\treturn hmacKeyDescFunc(func(hkd *hmacKeyDesc) {\n\t\thkd.showDeletedKeys = true\n\t})\n}\n\n// UserProjectForHMACKeys will bill the request against userProjectID\n// if userProjectID is non-empty.\n//\n// Note: This is a noop right now and only provided for API compatibility.\nfunc UserProjectForHMACKeys(userProjectID string) HMACKeyOption {\n\treturn hmacKeyDescFunc(func(hkd *hmacKeyDesc) {\n\t\thkd.userProjectID = userProjectID\n\t})\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/http_client.go",
    "content": "// Copyright 2022 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"fmt\"\n\t\"hash/crc32\"\n\t\"io\"\n\t\"log\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"cloud.google.com/go/iam/apiv1/iampb\"\n\t\"cloud.google.com/go/internal/optional\"\n\t\"cloud.google.com/go/internal/trace\"\n\t\"github.com/google/uuid\"\n\t\"github.com/googleapis/gax-go/v2/callctx\"\n\t\"golang.org/x/oauth2/google\"\n\t\"google.golang.org/api/googleapi\"\n\t\"google.golang.org/api/iterator\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/api/option/internaloption\"\n\traw \"google.golang.org/api/storage/v1\"\n\t\"google.golang.org/api/transport\"\n\thtransport \"google.golang.org/api/transport/http\"\n)\n\n// httpStorageClient is the HTTP-JSON API implementation of the transport-agnostic\n// storageClient interface.\ntype httpStorageClient struct {\n\tcreds                      *google.Credentials\n\thc                         *http.Client\n\txmlHost                    string\n\traw                        *raw.Service\n\tscheme                     string\n\tsettings                   *settings\n\tconfig                     *storageConfig\n\tdynamicReadReqStallTimeout *bucketDelayManager\n}\n\n// newHTTPStorageClient initializes a new storageClient that uses the HTTP-JSON\n// Storage API.\nfunc newHTTPStorageClient(ctx context.Context, opts ...storageOption) (storageClient, error) {\n\ts := initSettings(opts...)\n\to := s.clientOption\n\tconfig := newStorageConfig(o...)\n\n\tvar creds *google.Credentials\n\t// In general, it is recommended to use raw.NewService instead of htransport.NewClient\n\t// since raw.NewService configures the correct default endpoints when initializing the\n\t// internal http client. However, in our case, \"NewRangeReader\" in reader.go needs to\n\t// access the http client directly to make requests, so we create the client manually\n\t// here so it can be re-used by both reader.go and raw.NewService. This means we need to\n\t// manually configure the default endpoint options on the http client. Furthermore, we\n\t// need to account for STORAGE_EMULATOR_HOST override when setting the default endpoints.\n\tif host := os.Getenv(\"STORAGE_EMULATOR_HOST\"); host == \"\" {\n\t\t// Prepend default options to avoid overriding options passed by the user.\n\t\to = append([]option.ClientOption{option.WithScopes(ScopeFullControl, \"https://www.googleapis.com/auth/cloud-platform\"), option.WithUserAgent(userAgent)}, o...)\n\n\t\to = append(o, internaloption.WithDefaultEndpointTemplate(\"https://storage.UNIVERSE_DOMAIN/storage/v1/\"),\n\t\t\tinternaloption.WithDefaultMTLSEndpoint(\"https://storage.mtls.googleapis.com/storage/v1/\"),\n\t\t\tinternaloption.WithDefaultUniverseDomain(\"googleapis.com\"),\n\t\t)\n\t\t// Don't error out here. The user may have passed in their own HTTP\n\t\t// client which does not auth with ADC or other common conventions.\n\t\tc, err := transport.Creds(ctx, o...)\n\t\tif err == nil {\n\t\t\tcreds = c\n\t\t\to = append(o, internaloption.WithCredentials(creds))\n\t\t}\n\t} else {\n\t\tvar hostURL *url.URL\n\n\t\tif strings.Contains(host, \"://\") {\n\t\t\th, err := url.Parse(host)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\thostURL = h\n\t\t} else {\n\t\t\t// Add scheme for user if not supplied in STORAGE_EMULATOR_HOST\n\t\t\t// URL is only parsed correctly if it has a scheme, so we build it ourselves\n\t\t\thostURL = &url.URL{Scheme: \"http\", Host: host}\n\t\t}\n\n\t\thostURL.Path = \"storage/v1/\"\n\t\tendpoint := hostURL.String()\n\n\t\t// Append the emulator host as default endpoint for the user\n\t\to = append([]option.ClientOption{option.WithoutAuthentication()}, o...)\n\n\t\to = append(o, internaloption.WithDefaultEndpointTemplate(endpoint))\n\t\to = append(o, internaloption.WithDefaultMTLSEndpoint(endpoint))\n\t}\n\ts.clientOption = o\n\n\t// htransport selects the correct endpoint among WithEndpoint (user override), WithDefaultEndpointTemplate, and WithDefaultMTLSEndpoint.\n\thc, ep, err := htransport.NewClient(ctx, s.clientOption...)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"dialing: %w\", err)\n\t}\n\t// RawService should be created with the chosen endpoint to take account of user override.\n\trawService, err := raw.NewService(ctx, option.WithEndpoint(ep), option.WithHTTPClient(hc))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"storage client: %w\", err)\n\t}\n\t// Update xmlHost and scheme with the chosen endpoint.\n\tu, err := url.Parse(ep)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"supplied endpoint %q is not valid: %w\", ep, err)\n\t}\n\n\tvar bd *bucketDelayManager\n\tif config.readStallTimeoutConfig != nil {\n\t\tdrrstConfig := config.readStallTimeoutConfig\n\t\tbd, err = newBucketDelayManager(\n\t\t\tdrrstConfig.TargetPercentile,\n\t\t\tgetDynamicReadReqIncreaseRateFromEnv(),\n\t\t\tgetDynamicReadReqInitialTimeoutSecFromEnv(drrstConfig.Min),\n\t\t\tdrrstConfig.Min,\n\t\t\tdefaultDynamicReqdReqMaxTimeout)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"creating dynamic-delay: %w\", err)\n\t\t}\n\t}\n\n\treturn &httpStorageClient{\n\t\tcreds:                      creds,\n\t\thc:                         hc,\n\t\txmlHost:                    u.Host,\n\t\traw:                        rawService,\n\t\tscheme:                     u.Scheme,\n\t\tsettings:                   s,\n\t\tconfig:                     &config,\n\t\tdynamicReadReqStallTimeout: bd,\n\t}, nil\n}\n\nfunc (c *httpStorageClient) Close() error {\n\tc.hc.CloseIdleConnections()\n\treturn nil\n}\n\n// Top-level methods.\n\nfunc (c *httpStorageClient) GetServiceAccount(ctx context.Context, project string, opts ...storageOption) (string, error) {\n\ts := callSettings(c.settings, opts...)\n\tcall := c.raw.Projects.ServiceAccount.Get(project)\n\tvar res *raw.ServiceAccount\n\terr := run(ctx, func(ctx context.Context) error {\n\t\tvar err error\n\t\tres, err = call.Context(ctx).Do()\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn res.EmailAddress, nil\n}\n\nfunc (c *httpStorageClient) CreateBucket(ctx context.Context, project, bucket string, attrs *BucketAttrs, enableObjectRetention *bool, opts ...storageOption) (*BucketAttrs, error) {\n\ts := callSettings(c.settings, opts...)\n\tvar bkt *raw.Bucket\n\tif attrs != nil {\n\t\tbkt = attrs.toRawBucket()\n\t} else {\n\t\tbkt = &raw.Bucket{}\n\t}\n\tbkt.Name = bucket\n\t// If there is lifecycle information but no location, explicitly set\n\t// the location. This is a GCS quirk/bug.\n\tif bkt.Location == \"\" && bkt.Lifecycle != nil {\n\t\tbkt.Location = \"US\"\n\t}\n\treq := c.raw.Buckets.Insert(project, bkt)\n\tif attrs != nil && attrs.PredefinedACL != \"\" {\n\t\treq.PredefinedAcl(attrs.PredefinedACL)\n\t}\n\tif attrs != nil && attrs.PredefinedDefaultObjectACL != \"\" {\n\t\treq.PredefinedDefaultObjectAcl(attrs.PredefinedDefaultObjectACL)\n\t}\n\tif enableObjectRetention != nil {\n\t\treq.EnableObjectRetention(*enableObjectRetention)\n\t}\n\tvar battrs *BucketAttrs\n\terr := run(ctx, func(ctx context.Context) error {\n\t\tb, err := req.Context(ctx).Do()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tbattrs, err = newBucket(b)\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\treturn battrs, err\n}\n\nfunc (c *httpStorageClient) ListBuckets(ctx context.Context, project string, opts ...storageOption) *BucketIterator {\n\ts := callSettings(c.settings, opts...)\n\tit := &BucketIterator{\n\t\tctx:       ctx,\n\t\tprojectID: project,\n\t}\n\n\tfetch := func(pageSize int, pageToken string) (token string, err error) {\n\t\treq := c.raw.Buckets.List(it.projectID)\n\t\treq.Projection(\"full\")\n\t\treq.Prefix(it.Prefix)\n\t\treq.PageToken(pageToken)\n\t\tif pageSize > 0 {\n\t\t\treq.MaxResults(int64(pageSize))\n\t\t}\n\t\tvar resp *raw.Buckets\n\t\terr = run(it.ctx, func(ctx context.Context) error {\n\t\t\tresp, err = req.Context(ctx).Do()\n\t\t\treturn err\n\t\t}, s.retry, s.idempotent)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tfor _, item := range resp.Items {\n\t\t\tb, err := newBucket(item)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t\tit.buckets = append(it.buckets, b)\n\t\t}\n\t\treturn resp.NextPageToken, nil\n\t}\n\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(\n\t\tfetch,\n\t\tfunc() int { return len(it.buckets) },\n\t\tfunc() interface{} { b := it.buckets; it.buckets = nil; return b })\n\n\treturn it\n}\n\n// Bucket methods.\n\nfunc (c *httpStorageClient) DeleteBucket(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) error {\n\ts := callSettings(c.settings, opts...)\n\treq := c.raw.Buckets.Delete(bucket)\n\tif err := applyBucketConds(\"httpStorageClient.DeleteBucket\", conds, req); err != nil {\n\t\treturn err\n\t}\n\tif s.userProject != \"\" {\n\t\treq.UserProject(s.userProject)\n\t}\n\n\treturn run(ctx, func(ctx context.Context) error { return req.Context(ctx).Do() }, s.retry, s.idempotent)\n}\n\nfunc (c *httpStorageClient) GetBucket(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) (*BucketAttrs, error) {\n\ts := callSettings(c.settings, opts...)\n\treq := c.raw.Buckets.Get(bucket).Projection(\"full\")\n\terr := applyBucketConds(\"httpStorageClient.GetBucket\", conds, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif s.userProject != \"\" {\n\t\treq.UserProject(s.userProject)\n\t}\n\n\tvar resp *raw.Bucket\n\terr = run(ctx, func(ctx context.Context) error {\n\t\tresp, err = req.Context(ctx).Do()\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\n\tif err != nil {\n\t\treturn nil, formatBucketError(err)\n\t}\n\treturn newBucket(resp)\n}\nfunc (c *httpStorageClient) UpdateBucket(ctx context.Context, bucket string, uattrs *BucketAttrsToUpdate, conds *BucketConditions, opts ...storageOption) (*BucketAttrs, error) {\n\ts := callSettings(c.settings, opts...)\n\trb := uattrs.toRawBucket()\n\treq := c.raw.Buckets.Patch(bucket, rb).Projection(\"full\")\n\terr := applyBucketConds(\"httpStorageClient.UpdateBucket\", conds, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif s.userProject != \"\" {\n\t\treq.UserProject(s.userProject)\n\t}\n\tif uattrs != nil && uattrs.PredefinedACL != \"\" {\n\t\treq.PredefinedAcl(uattrs.PredefinedACL)\n\t}\n\tif uattrs != nil && uattrs.PredefinedDefaultObjectACL != \"\" {\n\t\treq.PredefinedDefaultObjectAcl(uattrs.PredefinedDefaultObjectACL)\n\t}\n\n\tvar rawBucket *raw.Bucket\n\terr = run(ctx, func(ctx context.Context) error {\n\t\trawBucket, err = req.Context(ctx).Do()\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newBucket(rawBucket)\n}\n\nfunc (c *httpStorageClient) LockBucketRetentionPolicy(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) error {\n\ts := callSettings(c.settings, opts...)\n\n\tvar metageneration int64\n\tif conds != nil {\n\t\tmetageneration = conds.MetagenerationMatch\n\t}\n\treq := c.raw.Buckets.LockRetentionPolicy(bucket, metageneration)\n\n\treturn run(ctx, func(ctx context.Context) error {\n\t\t_, err := req.Context(ctx).Do()\n\t\treturn err\n\t}, s.retry, s.idempotent)\n}\nfunc (c *httpStorageClient) ListObjects(ctx context.Context, bucket string, q *Query, opts ...storageOption) *ObjectIterator {\n\ts := callSettings(c.settings, opts...)\n\tit := &ObjectIterator{\n\t\tctx: ctx,\n\t}\n\tif q != nil {\n\t\tit.query = *q\n\t}\n\tfetch := func(pageSize int, pageToken string) (string, error) {\n\t\tvar err error\n\t\t// Add trace span around List API call within the fetch.\n\t\tctx, _ = startSpan(ctx, \"httpStorageClient.ObjectsListCall\")\n\t\tdefer func() { endSpan(ctx, err) }()\n\t\treq := c.raw.Objects.List(bucket)\n\t\tif it.query.SoftDeleted {\n\t\t\treq.SoftDeleted(it.query.SoftDeleted)\n\t\t}\n\t\tprojection := it.query.Projection\n\t\tif projection == ProjectionDefault {\n\t\t\tprojection = ProjectionFull\n\t\t}\n\t\treq.Projection(projection.String())\n\t\treq.Delimiter(it.query.Delimiter)\n\t\treq.Prefix(it.query.Prefix)\n\t\treq.StartOffset(it.query.StartOffset)\n\t\treq.EndOffset(it.query.EndOffset)\n\t\treq.Versions(it.query.Versions)\n\t\treq.IncludeTrailingDelimiter(it.query.IncludeTrailingDelimiter)\n\t\treq.MatchGlob(it.query.MatchGlob)\n\t\treq.IncludeFoldersAsPrefixes(it.query.IncludeFoldersAsPrefixes)\n\t\tif selection := it.query.toFieldSelection(); selection != \"\" {\n\t\t\treq.Fields(\"nextPageToken\", googleapi.Field(selection))\n\t\t}\n\t\treq.PageToken(pageToken)\n\t\tif s.userProject != \"\" {\n\t\t\treq.UserProject(s.userProject)\n\t\t}\n\t\tif pageSize > 0 {\n\t\t\treq.MaxResults(int64(pageSize))\n\t\t}\n\t\tvar resp *raw.Objects\n\t\terr = run(it.ctx, func(ctx context.Context) error {\n\t\t\tresp, err = req.Context(ctx).Do()\n\t\t\treturn err\n\t\t}, s.retry, s.idempotent)\n\t\tif err != nil {\n\t\t\treturn \"\", formatBucketError(err)\n\t\t}\n\t\tfor _, item := range resp.Items {\n\t\t\tit.items = append(it.items, newObject(item))\n\t\t}\n\t\tfor _, prefix := range resp.Prefixes {\n\t\t\tit.items = append(it.items, &ObjectAttrs{Prefix: prefix})\n\t\t}\n\t\treturn resp.NextPageToken, nil\n\t}\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(\n\t\tfetch,\n\t\tfunc() int { return len(it.items) },\n\t\tfunc() interface{} { b := it.items; it.items = nil; return b })\n\n\treturn it\n}\n\n// Object metadata methods.\n\nfunc (c *httpStorageClient) DeleteObject(ctx context.Context, bucket, object string, gen int64, conds *Conditions, opts ...storageOption) error {\n\ts := callSettings(c.settings, opts...)\n\treq := c.raw.Objects.Delete(bucket, object).Context(ctx)\n\tif err := applyConds(\"Delete\", gen, conds, req); err != nil {\n\t\treturn err\n\t}\n\tif s.userProject != \"\" {\n\t\treq.UserProject(s.userProject)\n\t}\n\terr := run(ctx, func(ctx context.Context) error { return req.Context(ctx).Do() }, s.retry, s.idempotent)\n\treturn formatObjectErr(err)\n}\n\nfunc (c *httpStorageClient) GetObject(ctx context.Context, params *getObjectParams, opts ...storageOption) (*ObjectAttrs, error) {\n\ts := callSettings(c.settings, opts...)\n\treq := c.raw.Objects.Get(params.bucket, params.object).Projection(\"full\").Context(ctx)\n\tif err := applyConds(\"Attrs\", params.gen, params.conds, req); err != nil {\n\t\treturn nil, err\n\t}\n\tif s.userProject != \"\" {\n\t\treq.UserProject(s.userProject)\n\t}\n\tif err := setEncryptionHeaders(req.Header(), params.encryptionKey, false); err != nil {\n\t\treturn nil, err\n\t}\n\tif params.softDeleted {\n\t\treq.SoftDeleted(params.softDeleted)\n\t}\n\n\tvar obj *raw.Object\n\tvar err error\n\terr = run(ctx, func(ctx context.Context) error {\n\t\tobj, err = req.Context(ctx).Do()\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\tif err != nil {\n\t\treturn nil, formatObjectErr(err)\n\t}\n\treturn newObject(obj), nil\n}\n\nfunc (c *httpStorageClient) UpdateObject(ctx context.Context, params *updateObjectParams, opts ...storageOption) (*ObjectAttrs, error) {\n\tuattrs := params.uattrs\n\ts := callSettings(c.settings, opts...)\n\n\tvar attrs ObjectAttrs\n\t// Lists of fields to send, and set to null, in the JSON.\n\tvar forceSendFields, nullFields []string\n\tif uattrs.ContentType != nil {\n\t\tattrs.ContentType = optional.ToString(uattrs.ContentType)\n\t\t// For ContentType, sending the empty string is a no-op.\n\t\t// Instead we send a null.\n\t\tif attrs.ContentType == \"\" {\n\t\t\tnullFields = append(nullFields, \"ContentType\")\n\t\t} else {\n\t\t\tforceSendFields = append(forceSendFields, \"ContentType\")\n\t\t}\n\t}\n\tif uattrs.ContentLanguage != nil {\n\t\tattrs.ContentLanguage = optional.ToString(uattrs.ContentLanguage)\n\t\t// For ContentLanguage it's an error to send the empty string.\n\t\t// Instead we send a null.\n\t\tif attrs.ContentLanguage == \"\" {\n\t\t\tnullFields = append(nullFields, \"ContentLanguage\")\n\t\t} else {\n\t\t\tforceSendFields = append(forceSendFields, \"ContentLanguage\")\n\t\t}\n\t}\n\tif uattrs.ContentEncoding != nil {\n\t\tattrs.ContentEncoding = optional.ToString(uattrs.ContentEncoding)\n\t\tforceSendFields = append(forceSendFields, \"ContentEncoding\")\n\t}\n\tif uattrs.ContentDisposition != nil {\n\t\tattrs.ContentDisposition = optional.ToString(uattrs.ContentDisposition)\n\t\tforceSendFields = append(forceSendFields, \"ContentDisposition\")\n\t}\n\tif uattrs.CacheControl != nil {\n\t\tattrs.CacheControl = optional.ToString(uattrs.CacheControl)\n\t\tforceSendFields = append(forceSendFields, \"CacheControl\")\n\t}\n\tif uattrs.EventBasedHold != nil {\n\t\tattrs.EventBasedHold = optional.ToBool(uattrs.EventBasedHold)\n\t\tforceSendFields = append(forceSendFields, \"EventBasedHold\")\n\t}\n\tif uattrs.TemporaryHold != nil {\n\t\tattrs.TemporaryHold = optional.ToBool(uattrs.TemporaryHold)\n\t\tforceSendFields = append(forceSendFields, \"TemporaryHold\")\n\t}\n\tif !uattrs.CustomTime.IsZero() {\n\t\tattrs.CustomTime = uattrs.CustomTime\n\t\tforceSendFields = append(forceSendFields, \"CustomTime\")\n\t}\n\tif uattrs.Metadata != nil {\n\t\tattrs.Metadata = uattrs.Metadata\n\t\tif len(attrs.Metadata) == 0 {\n\t\t\t// Sending the empty map is a no-op. We send null instead.\n\t\t\tnullFields = append(nullFields, \"Metadata\")\n\t\t} else {\n\t\t\tforceSendFields = append(forceSendFields, \"Metadata\")\n\t\t}\n\t}\n\tif uattrs.ACL != nil {\n\t\tattrs.ACL = uattrs.ACL\n\t\t// It's an error to attempt to delete the ACL, so\n\t\t// we don't append to nullFields here.\n\t\tforceSendFields = append(forceSendFields, \"Acl\")\n\t}\n\tif uattrs.Retention != nil {\n\t\t// For ObjectRetention it's an error to send empty fields.\n\t\t// Instead we send a null as the user's intention is to remove.\n\t\tif uattrs.Retention.Mode == \"\" && uattrs.Retention.RetainUntil.IsZero() {\n\t\t\tnullFields = append(nullFields, \"Retention\")\n\t\t} else {\n\t\t\tattrs.Retention = uattrs.Retention\n\t\t\tforceSendFields = append(forceSendFields, \"Retention\")\n\t\t}\n\t}\n\trawObj := attrs.toRawObject(params.bucket)\n\trawObj.ForceSendFields = forceSendFields\n\trawObj.NullFields = nullFields\n\tcall := c.raw.Objects.Patch(params.bucket, params.object, rawObj).Projection(\"full\")\n\tif err := applyConds(\"Update\", params.gen, params.conds, call); err != nil {\n\t\treturn nil, err\n\t}\n\tif s.userProject != \"\" {\n\t\tcall.UserProject(s.userProject)\n\t}\n\tif uattrs.PredefinedACL != \"\" {\n\t\tcall.PredefinedAcl(uattrs.PredefinedACL)\n\t}\n\tif err := setEncryptionHeaders(call.Header(), params.encryptionKey, false); err != nil {\n\t\treturn nil, err\n\t}\n\n\tif params.overrideRetention != nil {\n\t\tcall.OverrideUnlockedRetention(*params.overrideRetention)\n\t}\n\n\tvar obj *raw.Object\n\tvar err error\n\terr = run(ctx, func(ctx context.Context) error { obj, err = call.Context(ctx).Do(); return err }, s.retry, s.idempotent)\n\tif err != nil {\n\t\treturn nil, formatObjectErr(err)\n\t}\n\treturn newObject(obj), nil\n}\n\nfunc (c *httpStorageClient) RestoreObject(ctx context.Context, params *restoreObjectParams, opts ...storageOption) (*ObjectAttrs, error) {\n\ts := callSettings(c.settings, opts...)\n\treq := c.raw.Objects.Restore(params.bucket, params.object, params.gen).Context(ctx)\n\t// Do not set the generation here since it's not an optional condition; it gets set above.\n\tif err := applyConds(\"RestoreObject\", defaultGen, params.conds, req); err != nil {\n\t\treturn nil, err\n\t}\n\tif s.userProject != \"\" {\n\t\treq.UserProject(s.userProject)\n\t}\n\tif params.copySourceACL {\n\t\treq.CopySourceAcl(params.copySourceACL)\n\t}\n\tif err := setEncryptionHeaders(req.Header(), params.encryptionKey, false); err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar obj *raw.Object\n\tvar err error\n\terr = run(ctx, func(ctx context.Context) error { obj, err = req.Context(ctx).Do(); return err }, s.retry, s.idempotent)\n\tif err != nil {\n\t\treturn nil, formatObjectErr(err)\n\t}\n\treturn newObject(obj), err\n}\n\nfunc (c *httpStorageClient) MoveObject(ctx context.Context, params *moveObjectParams, opts ...storageOption) (*ObjectAttrs, error) {\n\ts := callSettings(c.settings, opts...)\n\treq := c.raw.Objects.Move(params.bucket, params.srcObject, params.dstObject).Context(ctx)\n\tif err := applyConds(\"MoveObjectDestination\", defaultGen, params.dstConds, req); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := applySourceConds(\"MoveObjectSource\", defaultGen, params.srcConds, req); err != nil {\n\t\treturn nil, err\n\t}\n\tif s.userProject != \"\" {\n\t\treq.UserProject(s.userProject)\n\t}\n\tif err := setEncryptionHeaders(req.Header(), params.encryptionKey, false); err != nil {\n\t\treturn nil, err\n\t}\n\tvar obj *raw.Object\n\tvar err error\n\terr = run(ctx, func(ctx context.Context) error { obj, err = req.Context(ctx).Do(); return err }, s.retry, s.idempotent)\n\tif err != nil {\n\t\treturn nil, formatObjectErr(err)\n\t}\n\treturn newObject(obj), err\n}\n\n// Default Object ACL methods.\n\nfunc (c *httpStorageClient) DeleteDefaultObjectACL(ctx context.Context, bucket string, entity ACLEntity, opts ...storageOption) error {\n\ts := callSettings(c.settings, opts...)\n\treq := c.raw.DefaultObjectAccessControls.Delete(bucket, string(entity))\n\tconfigureACLCall(ctx, s.userProject, req)\n\treturn run(ctx, func(ctx context.Context) error { return req.Context(ctx).Do() }, s.retry, s.idempotent)\n}\n\nfunc (c *httpStorageClient) ListDefaultObjectACLs(ctx context.Context, bucket string, opts ...storageOption) ([]ACLRule, error) {\n\ts := callSettings(c.settings, opts...)\n\tvar acls *raw.ObjectAccessControls\n\tvar err error\n\treq := c.raw.DefaultObjectAccessControls.List(bucket)\n\tconfigureACLCall(ctx, s.userProject, req)\n\terr = run(ctx, func(ctx context.Context) error {\n\t\tacls, err = req.Context(ctx).Do()\n\t\treturn err\n\t}, s.retry, true)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn toObjectACLRules(acls.Items), nil\n}\nfunc (c *httpStorageClient) UpdateDefaultObjectACL(ctx context.Context, bucket string, entity ACLEntity, role ACLRole, opts ...storageOption) error {\n\ts := callSettings(c.settings, opts...)\n\ttype setRequest interface {\n\t\tDo(opts ...googleapi.CallOption) (*raw.ObjectAccessControl, error)\n\t\tHeader() http.Header\n\t}\n\tacl := &raw.ObjectAccessControl{\n\t\tBucket: bucket,\n\t\tEntity: string(entity),\n\t\tRole:   string(role),\n\t}\n\tvar err error\n\treq := c.raw.DefaultObjectAccessControls.Update(bucket, string(entity), acl)\n\tconfigureACLCall(ctx, s.userProject, req)\n\treturn run(ctx, func(ctx context.Context) error {\n\t\t_, err = req.Context(ctx).Do()\n\t\treturn err\n\t}, s.retry, s.idempotent)\n}\n\n// Bucket ACL methods.\n\nfunc (c *httpStorageClient) DeleteBucketACL(ctx context.Context, bucket string, entity ACLEntity, opts ...storageOption) error {\n\ts := callSettings(c.settings, opts...)\n\treq := c.raw.BucketAccessControls.Delete(bucket, string(entity))\n\tconfigureACLCall(ctx, s.userProject, req)\n\treturn run(ctx, func(ctx context.Context) error { return req.Context(ctx).Do() }, s.retry, s.idempotent)\n}\n\nfunc (c *httpStorageClient) ListBucketACLs(ctx context.Context, bucket string, opts ...storageOption) ([]ACLRule, error) {\n\ts := callSettings(c.settings, opts...)\n\tvar acls *raw.BucketAccessControls\n\tvar err error\n\treq := c.raw.BucketAccessControls.List(bucket)\n\tconfigureACLCall(ctx, s.userProject, req)\n\terr = run(ctx, func(ctx context.Context) error {\n\t\tacls, err = req.Context(ctx).Do()\n\t\treturn err\n\t}, s.retry, true)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn toBucketACLRules(acls.Items), nil\n}\n\nfunc (c *httpStorageClient) UpdateBucketACL(ctx context.Context, bucket string, entity ACLEntity, role ACLRole, opts ...storageOption) error {\n\ts := callSettings(c.settings, opts...)\n\tacl := &raw.BucketAccessControl{\n\t\tBucket: bucket,\n\t\tEntity: string(entity),\n\t\tRole:   string(role),\n\t}\n\treq := c.raw.BucketAccessControls.Update(bucket, string(entity), acl)\n\tconfigureACLCall(ctx, s.userProject, req)\n\tvar err error\n\treturn run(ctx, func(ctx context.Context) error {\n\t\t_, err = req.Context(ctx).Do()\n\t\treturn err\n\t}, s.retry, s.idempotent)\n}\n\n// configureACLCall sets the context and user project on the apiary library call.\n// This will panic if the call does not have the correct methods.\nfunc configureACLCall(ctx context.Context, userProject string, call interface{ Header() http.Header }) {\n\tvc := reflect.ValueOf(call)\n\tvc.MethodByName(\"Context\").Call([]reflect.Value{reflect.ValueOf(ctx)})\n\tif userProject != \"\" {\n\t\tvc.MethodByName(\"UserProject\").Call([]reflect.Value{reflect.ValueOf(userProject)})\n\t}\n}\n\n// Object ACL methods.\n\nfunc (c *httpStorageClient) DeleteObjectACL(ctx context.Context, bucket, object string, entity ACLEntity, opts ...storageOption) error {\n\ts := callSettings(c.settings, opts...)\n\treq := c.raw.ObjectAccessControls.Delete(bucket, object, string(entity))\n\tconfigureACLCall(ctx, s.userProject, req)\n\treturn run(ctx, func(ctx context.Context) error { return req.Context(ctx).Do() }, s.retry, s.idempotent)\n}\n\n// ListObjectACLs retrieves object ACL entries. By default, it operates on the latest generation of this object.\n// Selecting a specific generation of this object is not currently supported by the client.\nfunc (c *httpStorageClient) ListObjectACLs(ctx context.Context, bucket, object string, opts ...storageOption) ([]ACLRule, error) {\n\ts := callSettings(c.settings, opts...)\n\tvar acls *raw.ObjectAccessControls\n\tvar err error\n\treq := c.raw.ObjectAccessControls.List(bucket, object)\n\tconfigureACLCall(ctx, s.userProject, req)\n\terr = run(ctx, func(ctx context.Context) error {\n\t\tacls, err = req.Context(ctx).Do()\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn toObjectACLRules(acls.Items), nil\n}\n\nfunc (c *httpStorageClient) UpdateObjectACL(ctx context.Context, bucket, object string, entity ACLEntity, role ACLRole, opts ...storageOption) error {\n\ts := callSettings(c.settings, opts...)\n\ttype setRequest interface {\n\t\tDo(opts ...googleapi.CallOption) (*raw.ObjectAccessControl, error)\n\t\tHeader() http.Header\n\t}\n\n\tacl := &raw.ObjectAccessControl{\n\t\tBucket: bucket,\n\t\tEntity: string(entity),\n\t\tRole:   string(role),\n\t}\n\tvar err error\n\treq := c.raw.ObjectAccessControls.Update(bucket, object, string(entity), acl)\n\tconfigureACLCall(ctx, s.userProject, req)\n\treturn run(ctx, func(ctx context.Context) error {\n\t\t_, err = req.Context(ctx).Do()\n\t\treturn err\n\t}, s.retry, s.idempotent)\n}\n\n// Media operations.\n\nfunc (c *httpStorageClient) ComposeObject(ctx context.Context, req *composeObjectRequest, opts ...storageOption) (*ObjectAttrs, error) {\n\ts := callSettings(c.settings, opts...)\n\trawReq := &raw.ComposeRequest{}\n\t// Compose requires a non-empty Destination, so we always set it,\n\t// even if the caller-provided ObjectAttrs is the zero value.\n\trawReq.Destination = req.dstObject.attrs.toRawObject(req.dstBucket)\n\tif req.sendCRC32C {\n\t\trawReq.Destination.Crc32c = encodeUint32(req.dstObject.attrs.CRC32C)\n\t}\n\tfor _, src := range req.srcs {\n\t\tsrcObj := &raw.ComposeRequestSourceObjects{\n\t\t\tName: src.name,\n\t\t}\n\t\tif err := applyConds(\"ComposeFrom source\", src.gen, src.conds, composeSourceObj{srcObj}); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\trawReq.SourceObjects = append(rawReq.SourceObjects, srcObj)\n\t}\n\n\tcall := c.raw.Objects.Compose(req.dstBucket, req.dstObject.name, rawReq)\n\tif err := applyConds(\"ComposeFrom destination\", defaultGen, req.dstObject.conds, call); err != nil {\n\t\treturn nil, err\n\t}\n\tif s.userProject != \"\" {\n\t\tcall.UserProject(s.userProject)\n\t}\n\tif req.predefinedACL != \"\" {\n\t\tcall.DestinationPredefinedAcl(req.predefinedACL)\n\t}\n\tif err := setEncryptionHeaders(call.Header(), req.dstObject.encryptionKey, false); err != nil {\n\t\treturn nil, err\n\t}\n\tvar obj *raw.Object\n\n\tvar err error\n\tretryCall := func(ctx context.Context) error { obj, err = call.Context(ctx).Do(); return err }\n\n\tif err := run(ctx, retryCall, s.retry, s.idempotent); err != nil {\n\t\treturn nil, formatObjectErr(err)\n\t}\n\treturn newObject(obj), nil\n}\nfunc (c *httpStorageClient) RewriteObject(ctx context.Context, req *rewriteObjectRequest, opts ...storageOption) (*rewriteObjectResponse, error) {\n\ts := callSettings(c.settings, opts...)\n\trawObject := req.dstObject.attrs.toRawObject(\"\")\n\tcall := c.raw.Objects.Rewrite(req.srcObject.bucket, req.srcObject.name, req.dstObject.bucket, req.dstObject.name, rawObject)\n\n\tcall.Projection(\"full\")\n\tif req.token != \"\" {\n\t\tcall.RewriteToken(req.token)\n\t}\n\tif req.dstObject.keyName != \"\" {\n\t\tcall.DestinationKmsKeyName(req.dstObject.keyName)\n\t}\n\tif req.predefinedACL != \"\" {\n\t\tcall.DestinationPredefinedAcl(req.predefinedACL)\n\t}\n\tif err := applyConds(\"Copy destination\", defaultGen, req.dstObject.conds, call); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := applySourceConds(\"Copy source\", req.srcObject.gen, req.srcObject.conds, call); err != nil {\n\t\treturn nil, err\n\t}\n\tif s.userProject != \"\" {\n\t\tcall.UserProject(s.userProject)\n\t}\n\t// Set destination encryption headers.\n\tif err := setEncryptionHeaders(call.Header(), req.dstObject.encryptionKey, false); err != nil {\n\t\treturn nil, err\n\t}\n\t// Set source encryption headers.\n\tif err := setEncryptionHeaders(call.Header(), req.srcObject.encryptionKey, true); err != nil {\n\t\treturn nil, err\n\t}\n\n\tif req.maxBytesRewrittenPerCall != 0 {\n\t\tcall.MaxBytesRewrittenPerCall(req.maxBytesRewrittenPerCall)\n\t}\n\n\tvar res *raw.RewriteResponse\n\tvar err error\n\n\tretryCall := func(ctx context.Context) error { res, err = call.Context(ctx).Do(); return err }\n\n\tif err := run(ctx, retryCall, s.retry, s.idempotent); err != nil {\n\t\treturn nil, formatObjectErr(err)\n\t}\n\n\tr := &rewriteObjectResponse{\n\t\tdone:     res.Done,\n\t\twritten:  res.TotalBytesRewritten,\n\t\tsize:     res.ObjectSize,\n\t\ttoken:    res.RewriteToken,\n\t\tresource: newObject(res.Resource),\n\t}\n\n\treturn r, nil\n}\n\n// NewMultiRangeDownloader is not supported by http client.\nfunc (c *httpStorageClient) NewMultiRangeDownloader(ctx context.Context, params *newMultiRangeDownloaderParams, opts ...storageOption) (mr *MultiRangeDownloader, err error) {\n\treturn nil, errMethodNotSupported\n}\n\nfunc (c *httpStorageClient) NewRangeReader(ctx context.Context, params *newRangeReaderParams, opts ...storageOption) (r *Reader, err error) {\n\tctx = trace.StartSpan(ctx, \"cloud.google.com/go/storage.httpStorageClient.NewRangeReader\")\n\tdefer func() { trace.EndSpan(ctx, err) }()\n\n\ts := callSettings(c.settings, opts...)\n\n\tif c.config.useJSONforReads {\n\t\treturn c.newRangeReaderJSON(ctx, params, s)\n\t}\n\treturn c.newRangeReaderXML(ctx, params, s)\n}\n\nfunc (c *httpStorageClient) newRangeReaderXML(ctx context.Context, params *newRangeReaderParams, s *settings) (r *Reader, err error) {\n\trequestID := uuid.New()\n\tu := &url.URL{\n\t\tScheme:  c.scheme,\n\t\tHost:    c.xmlHost,\n\t\tPath:    fmt.Sprintf(\"/%s/%s\", params.bucket, params.object),\n\t\tRawPath: fmt.Sprintf(\"/%s/%s\", params.bucket, url.PathEscape(params.object)),\n\t}\n\tverb := \"GET\"\n\tif params.length == 0 {\n\t\tverb = \"HEAD\"\n\t}\n\treq, err := http.NewRequest(verb, u.String(), nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif s.userProject != \"\" {\n\t\treq.Header.Set(\"X-Goog-User-Project\", s.userProject)\n\t}\n\n\tif err := setRangeReaderHeaders(req.Header, params); err != nil {\n\t\treturn nil, err\n\t}\n\n\treopen := readerReopen(ctx, req.Header, params, s,\n\t\tfunc(ctx context.Context) (*http.Response, error) {\n\t\t\tsetHeadersFromCtx(ctx, req.Header)\n\n\t\t\tif c.dynamicReadReqStallTimeout == nil {\n\t\t\t\treturn c.hc.Do(req.WithContext(ctx))\n\t\t\t}\n\n\t\t\tcancelCtx, cancel := context.WithCancel(ctx)\n\t\t\tvar (\n\t\t\t\tres *http.Response\n\t\t\t\terr error\n\t\t\t)\n\n\t\t\tdone := make(chan bool)\n\t\t\tgo func() {\n\t\t\t\treqStartTime := time.Now()\n\t\t\t\tres, err = c.hc.Do(req.WithContext(cancelCtx))\n\t\t\t\tif err == nil {\n\t\t\t\t\treqLatency := time.Since(reqStartTime)\n\t\t\t\t\tc.dynamicReadReqStallTimeout.update(params.bucket, reqLatency)\n\t\t\t\t} else if errors.Is(err, context.Canceled) {\n\t\t\t\t\t// context.Canceled means operation took more than current dynamicTimeout,\n\t\t\t\t\t// hence should be increased.\n\t\t\t\t\tc.dynamicReadReqStallTimeout.increase(params.bucket)\n\t\t\t\t}\n\t\t\t\tdone <- true\n\t\t\t}()\n\n\t\t\t// Wait until stall timeout or request is successful.\n\t\t\tstallTimeout := c.dynamicReadReqStallTimeout.getValue(params.bucket)\n\t\t\ttimer := time.After(stallTimeout)\n\t\t\tselect {\n\t\t\tcase <-timer:\n\t\t\t\tlog.Printf(\"[%s] stalled read-req cancelled after %fs\", requestID, stallTimeout.Seconds())\n\t\t\t\tcancel()\n\t\t\t\t<-done\n\t\t\t\tif res != nil && res.Body != nil {\n\t\t\t\t\tres.Body.Close()\n\t\t\t\t}\n\t\t\t\treturn res, context.DeadlineExceeded\n\t\t\tcase <-done:\n\t\t\t\tcancel = nil\n\t\t\t}\n\t\t\treturn res, err\n\t\t},\n\t\tfunc() error { return setConditionsHeaders(req.Header, params.conds) },\n\t\tfunc() { req.URL.RawQuery = fmt.Sprintf(\"generation=%d\", params.gen) })\n\n\tres, err := reopen(0)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn parseReadResponse(res, params, reopen)\n}\n\nfunc (c *httpStorageClient) newRangeReaderJSON(ctx context.Context, params *newRangeReaderParams, s *settings) (r *Reader, err error) {\n\tcall := c.raw.Objects.Get(params.bucket, params.object)\n\n\tcall.Projection(\"full\")\n\n\tif s.userProject != \"\" {\n\t\tcall.UserProject(s.userProject)\n\t}\n\n\tif err := setRangeReaderHeaders(call.Header(), params); err != nil {\n\t\treturn nil, err\n\t}\n\n\treopen := readerReopen(ctx, call.Header(), params, s, func(ctx context.Context) (*http.Response, error) { return call.Context(ctx).Download() },\n\t\tfunc() error { return applyConds(\"NewReader\", params.gen, params.conds, call) },\n\t\tfunc() { call.Generation(params.gen) })\n\n\tres, err := reopen(0)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn parseReadResponse(res, params, reopen)\n}\n\nfunc (c *httpStorageClient) OpenWriter(params *openWriterParams, opts ...storageOption) (*io.PipeWriter, error) {\n\tif params.append {\n\t\treturn nil, errors.New(\"storage: append not supported on HTTP Client; use gRPC\")\n\t}\n\n\ts := callSettings(c.settings, opts...)\n\terrorf := params.setError\n\tsetObj := params.setObj\n\tprogress := params.progress\n\tattrs := params.attrs\n\tparams.setFlush(func() (int64, error) {\n\t\treturn 0, errors.New(\"Writer.Flush is only supported for gRPC-based clients\")\n\t})\n\n\tmediaOpts := []googleapi.MediaOption{\n\t\tgoogleapi.ChunkSize(params.chunkSize),\n\t}\n\tif c := attrs.ContentType; c != \"\" || params.forceEmptyContentType {\n\t\tmediaOpts = append(mediaOpts, googleapi.ContentType(c))\n\t}\n\tif params.chunkRetryDeadline != 0 {\n\t\tmediaOpts = append(mediaOpts, googleapi.ChunkRetryDeadline(params.chunkRetryDeadline))\n\t}\n\tif params.chunkTransferTimeout != 0 {\n\t\tmediaOpts = append(mediaOpts, googleapi.ChunkTransferTimeout(params.chunkTransferTimeout))\n\t}\n\n\tpr, pw := io.Pipe()\n\n\tgo func() {\n\t\tdefer close(params.donec)\n\n\t\trawObj := attrs.toRawObject(params.bucket)\n\t\tif params.sendCRC32C {\n\t\t\trawObj.Crc32c = encodeUint32(attrs.CRC32C)\n\t\t}\n\t\tif attrs.MD5 != nil {\n\t\t\trawObj.Md5Hash = base64.StdEncoding.EncodeToString(attrs.MD5)\n\t\t}\n\t\tcall := c.raw.Objects.Insert(params.bucket, rawObj).\n\t\t\tMedia(pr, mediaOpts...).\n\t\t\tProjection(\"full\").\n\t\t\tContext(params.ctx).\n\t\t\tName(params.attrs.Name)\n\t\tcall.ProgressUpdater(func(n, _ int64) { progress(n) })\n\n\t\tif attrs.KMSKeyName != \"\" {\n\t\t\tcall.KmsKeyName(attrs.KMSKeyName)\n\t\t}\n\t\tif attrs.PredefinedACL != \"\" {\n\t\t\tcall.PredefinedAcl(attrs.PredefinedACL)\n\t\t}\n\t\tif err := setEncryptionHeaders(call.Header(), params.encryptionKey, false); err != nil {\n\t\t\terrorf(err)\n\t\t\tpr.CloseWithError(err)\n\t\t\treturn\n\t\t}\n\t\tvar resp *raw.Object\n\t\terr := applyConds(\"NewWriter\", defaultGen, params.conds, call)\n\t\tif err == nil {\n\t\t\tif s.userProject != \"\" {\n\t\t\t\tcall.UserProject(s.userProject)\n\t\t\t}\n\t\t\t// TODO(tritone): Remove this code when Uploads begin to support\n\t\t\t// retry attempt header injection with \"client header\" injection.\n\t\t\tsetClientHeader(call.Header())\n\n\t\t\t// The internals that perform call.Do automatically retry both the initial\n\t\t\t// call to set up the upload as well as calls to upload individual chunks\n\t\t\t// for a resumable upload (as long as the chunk size is non-zero). Hence\n\t\t\t// there is no need to add retries here.\n\n\t\t\t// Retry only when the operation is idempotent or the retry policy is RetryAlways.\n\t\t\tvar useRetry bool\n\t\t\tif (s.retry == nil || s.retry.policy == RetryIdempotent) && s.idempotent {\n\t\t\t\tuseRetry = true\n\t\t\t} else if s.retry != nil && s.retry.policy == RetryAlways {\n\t\t\t\tuseRetry = true\n\t\t\t}\n\t\t\tif useRetry {\n\t\t\t\tif s.retry != nil {\n\t\t\t\t\tcall.WithRetry(s.retry.backoff, s.retry.shouldRetry)\n\t\t\t\t} else {\n\t\t\t\t\tcall.WithRetry(nil, nil)\n\t\t\t\t}\n\t\t\t}\n\t\t\tresp, err = call.Do()\n\t\t}\n\t\tif err != nil {\n\t\t\terrorf(err)\n\t\t\tpr.CloseWithError(err)\n\t\t\treturn\n\t\t}\n\t\tsetObj(newObject(resp))\n\t}()\n\n\treturn pw, nil\n}\n\n// IAM methods.\n\nfunc (c *httpStorageClient) GetIamPolicy(ctx context.Context, resource string, version int32, opts ...storageOption) (*iampb.Policy, error) {\n\ts := callSettings(c.settings, opts...)\n\tcall := c.raw.Buckets.GetIamPolicy(resource).OptionsRequestedPolicyVersion(int64(version))\n\tif s.userProject != \"\" {\n\t\tcall.UserProject(s.userProject)\n\t}\n\tvar rp *raw.Policy\n\terr := run(ctx, func(ctx context.Context) error {\n\t\tvar err error\n\t\trp, err = call.Context(ctx).Do()\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn iamFromStoragePolicy(rp), nil\n}\n\nfunc (c *httpStorageClient) SetIamPolicy(ctx context.Context, resource string, policy *iampb.Policy, opts ...storageOption) error {\n\ts := callSettings(c.settings, opts...)\n\n\trp := iamToStoragePolicy(policy)\n\tcall := c.raw.Buckets.SetIamPolicy(resource, rp)\n\tif s.userProject != \"\" {\n\t\tcall.UserProject(s.userProject)\n\t}\n\n\treturn run(ctx, func(ctx context.Context) error {\n\t\t_, err := call.Context(ctx).Do()\n\t\treturn err\n\t}, s.retry, s.idempotent)\n}\n\nfunc (c *httpStorageClient) TestIamPermissions(ctx context.Context, resource string, permissions []string, opts ...storageOption) ([]string, error) {\n\ts := callSettings(c.settings, opts...)\n\tcall := c.raw.Buckets.TestIamPermissions(resource, permissions)\n\tif s.userProject != \"\" {\n\t\tcall.UserProject(s.userProject)\n\t}\n\tvar res *raw.TestIamPermissionsResponse\n\terr := run(ctx, func(ctx context.Context) error {\n\t\tvar err error\n\t\tres, err = call.Context(ctx).Do()\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn res.Permissions, nil\n}\n\n// HMAC Key methods.\n\nfunc (c *httpStorageClient) GetHMACKey(ctx context.Context, project, accessID string, opts ...storageOption) (*HMACKey, error) {\n\ts := callSettings(c.settings, opts...)\n\tcall := c.raw.Projects.HmacKeys.Get(project, accessID)\n\tif s.userProject != \"\" {\n\t\tcall = call.UserProject(s.userProject)\n\t}\n\n\tvar metadata *raw.HmacKeyMetadata\n\tvar err error\n\tif err := run(ctx, func(ctx context.Context) error {\n\t\tmetadata, err = call.Context(ctx).Do()\n\t\treturn err\n\t}, s.retry, s.idempotent); err != nil {\n\t\treturn nil, err\n\t}\n\thk := &raw.HmacKey{\n\t\tMetadata: metadata,\n\t}\n\treturn toHMACKeyFromRaw(hk, false)\n}\n\nfunc (c *httpStorageClient) ListHMACKeys(ctx context.Context, project, serviceAccountEmail string, showDeletedKeys bool, opts ...storageOption) *HMACKeysIterator {\n\ts := callSettings(c.settings, opts...)\n\tit := &HMACKeysIterator{\n\t\tctx:       ctx,\n\t\traw:       c.raw.Projects.HmacKeys,\n\t\tprojectID: project,\n\t\tretry:     s.retry,\n\t}\n\tfetch := func(pageSize int, pageToken string) (token string, err error) {\n\t\tcall := c.raw.Projects.HmacKeys.List(project)\n\t\tif pageToken != \"\" {\n\t\t\tcall = call.PageToken(pageToken)\n\t\t}\n\t\tif pageSize > 0 {\n\t\t\tcall = call.MaxResults(int64(pageSize))\n\t\t}\n\t\tif showDeletedKeys {\n\t\t\tcall = call.ShowDeletedKeys(true)\n\t\t}\n\t\tif s.userProject != \"\" {\n\t\t\tcall = call.UserProject(s.userProject)\n\t\t}\n\t\tif serviceAccountEmail != \"\" {\n\t\t\tcall = call.ServiceAccountEmail(serviceAccountEmail)\n\t\t}\n\n\t\tvar resp *raw.HmacKeysMetadata\n\t\terr = run(it.ctx, func(ctx context.Context) error {\n\t\t\tresp, err = call.Context(ctx).Do()\n\t\t\treturn err\n\t\t}, s.retry, s.idempotent)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\n\t\tfor _, metadata := range resp.Items {\n\t\t\thk := &raw.HmacKey{\n\t\t\t\tMetadata: metadata,\n\t\t\t}\n\t\t\thkey, err := toHMACKeyFromRaw(hk, true)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t\tit.hmacKeys = append(it.hmacKeys, hkey)\n\t\t}\n\t\treturn resp.NextPageToken, nil\n\t}\n\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(\n\t\tfetch,\n\t\tfunc() int { return len(it.hmacKeys) - it.index },\n\t\tfunc() interface{} {\n\t\t\tprev := it.hmacKeys\n\t\t\tit.hmacKeys = it.hmacKeys[:0]\n\t\t\tit.index = 0\n\t\t\treturn prev\n\t\t})\n\treturn it\n}\n\nfunc (c *httpStorageClient) UpdateHMACKey(ctx context.Context, project, serviceAccountEmail, accessID string, attrs *HMACKeyAttrsToUpdate, opts ...storageOption) (*HMACKey, error) {\n\ts := callSettings(c.settings, opts...)\n\tcall := c.raw.Projects.HmacKeys.Update(project, accessID, &raw.HmacKeyMetadata{\n\t\tEtag:  attrs.Etag,\n\t\tState: string(attrs.State),\n\t})\n\tif s.userProject != \"\" {\n\t\tcall = call.UserProject(s.userProject)\n\t}\n\n\tvar metadata *raw.HmacKeyMetadata\n\tvar err error\n\tif err := run(ctx, func(ctx context.Context) error {\n\t\tmetadata, err = call.Context(ctx).Do()\n\t\treturn err\n\t}, s.retry, s.idempotent); err != nil {\n\t\treturn nil, err\n\t}\n\thk := &raw.HmacKey{\n\t\tMetadata: metadata,\n\t}\n\treturn toHMACKeyFromRaw(hk, false)\n}\n\nfunc (c *httpStorageClient) CreateHMACKey(ctx context.Context, project, serviceAccountEmail string, opts ...storageOption) (*HMACKey, error) {\n\ts := callSettings(c.settings, opts...)\n\tcall := c.raw.Projects.HmacKeys.Create(project, serviceAccountEmail)\n\tif s.userProject != \"\" {\n\t\tcall = call.UserProject(s.userProject)\n\t}\n\n\tvar hk *raw.HmacKey\n\tif err := run(ctx, func(ctx context.Context) error {\n\t\th, err := call.Context(ctx).Do()\n\t\thk = h\n\t\treturn err\n\t}, s.retry, s.idempotent); err != nil {\n\t\treturn nil, err\n\t}\n\treturn toHMACKeyFromRaw(hk, true)\n}\n\nfunc (c *httpStorageClient) DeleteHMACKey(ctx context.Context, project string, accessID string, opts ...storageOption) error {\n\ts := callSettings(c.settings, opts...)\n\tcall := c.raw.Projects.HmacKeys.Delete(project, accessID)\n\tif s.userProject != \"\" {\n\t\tcall = call.UserProject(s.userProject)\n\t}\n\treturn run(ctx, func(ctx context.Context) error {\n\t\treturn call.Context(ctx).Do()\n\t}, s.retry, s.idempotent)\n}\n\n// Notification methods.\n\n// ListNotifications returns all the Notifications configured for this bucket, as a map indexed by notification ID.\n//\n// Note: This API does not support pagination. However, entity limits cap the number of notifications on a single bucket,\n// so all results will be returned in the first response. See https://cloud.google.com/storage/quotas#buckets.\nfunc (c *httpStorageClient) ListNotifications(ctx context.Context, bucket string, opts ...storageOption) (n map[string]*Notification, err error) {\n\ts := callSettings(c.settings, opts...)\n\tcall := c.raw.Notifications.List(bucket)\n\tif s.userProject != \"\" {\n\t\tcall.UserProject(s.userProject)\n\t}\n\tvar res *raw.Notifications\n\terr = run(ctx, func(ctx context.Context) error {\n\t\tres, err = call.Context(ctx).Do()\n\t\treturn err\n\t}, s.retry, true)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn notificationsToMap(res.Items), nil\n}\n\nfunc (c *httpStorageClient) CreateNotification(ctx context.Context, bucket string, n *Notification, opts ...storageOption) (ret *Notification, err error) {\n\ts := callSettings(c.settings, opts...)\n\tcall := c.raw.Notifications.Insert(bucket, toRawNotification(n))\n\tif s.userProject != \"\" {\n\t\tcall.UserProject(s.userProject)\n\t}\n\tvar rn *raw.Notification\n\terr = run(ctx, func(ctx context.Context) error {\n\t\trn, err = call.Context(ctx).Do()\n\t\treturn err\n\t}, s.retry, s.idempotent)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn toNotification(rn), nil\n}\n\nfunc (c *httpStorageClient) DeleteNotification(ctx context.Context, bucket string, id string, opts ...storageOption) (err error) {\n\ts := callSettings(c.settings, opts...)\n\tcall := c.raw.Notifications.Delete(bucket, id)\n\tif s.userProject != \"\" {\n\t\tcall.UserProject(s.userProject)\n\t}\n\treturn run(ctx, func(ctx context.Context) error {\n\t\treturn call.Context(ctx).Do()\n\t}, s.retry, s.idempotent)\n}\n\ntype httpReader struct {\n\tbody     io.ReadCloser\n\tseen     int64\n\treopen   func(seen int64) (*http.Response, error)\n\tcheckCRC bool   // should we check the CRC?\n\twantCRC  uint32 // the CRC32c value the server sent in the header\n\tgotCRC   uint32 // running crc\n}\n\nfunc (r *httpReader) Read(p []byte) (int, error) {\n\tn := 0\n\tfor len(p[n:]) > 0 {\n\t\tm, err := r.body.Read(p[n:])\n\t\tn += m\n\t\tr.seen += int64(m)\n\t\tif r.checkCRC {\n\t\t\tr.gotCRC = crc32.Update(r.gotCRC, crc32cTable, p[:n])\n\t\t}\n\t\tif err == nil {\n\t\t\treturn n, nil\n\t\t}\n\t\tif err == io.EOF {\n\t\t\t// Check CRC here. It would be natural to check it in Close, but\n\t\t\t// everybody defers Close on the assumption that it doesn't return\n\t\t\t// anything worth looking at.\n\t\t\tif r.checkCRC {\n\t\t\t\tif r.gotCRC != r.wantCRC {\n\t\t\t\t\treturn n, fmt.Errorf(\"storage: bad CRC on read: got %d, want %d\",\n\t\t\t\t\t\tr.gotCRC, r.wantCRC)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn n, err\n\t\t}\n\t\t// Read failed (likely due to connection issues), but we will try to reopen\n\t\t// the pipe and continue. Send a ranged read request that takes into account\n\t\t// the number of bytes we've already seen.\n\t\tres, err := r.reopen(r.seen)\n\t\tif err != nil {\n\t\t\t// reopen already retries\n\t\t\treturn n, err\n\t\t}\n\t\tr.body.Close()\n\t\tr.body = res.Body\n\t}\n\treturn n, nil\n}\n\nfunc (r *httpReader) Close() error {\n\treturn r.body.Close()\n}\n\nfunc setRangeReaderHeaders(h http.Header, params *newRangeReaderParams) error {\n\tif params.readCompressed {\n\t\th.Set(\"Accept-Encoding\", \"gzip\")\n\t}\n\tif err := setEncryptionHeaders(h, params.encryptionKey, false); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// readerReopen initiates a Read with offset and length, assuming we\n// have already read seen bytes.\nfunc readerReopen(ctx context.Context, header http.Header, params *newRangeReaderParams, s *settings,\n\tdoDownload func(context.Context) (*http.Response, error), applyConditions func() error, setGeneration func()) func(int64) (*http.Response, error) {\n\treturn func(seen int64) (*http.Response, error) {\n\t\t// If the context has already expired, return immediately without making a\n\t\t// call.\n\t\tif err := ctx.Err(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tstart := params.offset + seen\n\t\tif params.length < 0 && start < 0 {\n\t\t\theader.Set(\"Range\", fmt.Sprintf(\"bytes=%d\", start))\n\t\t} else if params.length < 0 && start > 0 {\n\t\t\theader.Set(\"Range\", fmt.Sprintf(\"bytes=%d-\", start))\n\t\t} else if params.length > 0 {\n\t\t\t// The end character isn't affected by how many bytes we've seen.\n\t\t\theader.Set(\"Range\", fmt.Sprintf(\"bytes=%d-%d\", start, params.offset+params.length-1))\n\t\t}\n\t\t// We wait to assign conditions here because the generation number can change in between reopen() runs.\n\t\tif err := applyConditions(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t// If an object generation is specified, include generation as query string parameters.\n\t\tif params.gen >= 0 {\n\t\t\tsetGeneration()\n\t\t}\n\n\t\tvar err error\n\t\tvar res *http.Response\n\t\terr = run(ctx, func(ctx context.Context) error {\n\t\t\tres, err = doDownload(ctx)\n\t\t\tif err != nil {\n\t\t\t\treturn formatObjectErr(err)\n\t\t\t}\n\n\t\t\tif res.StatusCode == http.StatusNotFound {\n\t\t\t\t// this check is necessary only for XML\n\t\t\t\tres.Body.Close()\n\t\t\t\treturn ErrObjectNotExist\n\t\t\t}\n\t\t\tif res.StatusCode < 200 || res.StatusCode > 299 {\n\t\t\t\tbody, _ := io.ReadAll(res.Body)\n\t\t\t\tres.Body.Close()\n\t\t\t\treturn &googleapi.Error{\n\t\t\t\t\tCode:   res.StatusCode,\n\t\t\t\t\tHeader: res.Header,\n\t\t\t\t\tBody:   string(body),\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpartialContentNotSatisfied :=\n\t\t\t\t!decompressiveTranscoding(res) &&\n\t\t\t\t\tstart > 0 && params.length != 0 &&\n\t\t\t\t\tres.StatusCode != http.StatusPartialContent\n\n\t\t\tif partialContentNotSatisfied {\n\t\t\t\tres.Body.Close()\n\t\t\t\treturn errors.New(\"storage: partial request not satisfied\")\n\t\t\t}\n\n\t\t\t// With \"Content-Encoding\": \"gzip\" aka decompressive transcoding, GCS serves\n\t\t\t// back the whole file regardless of the range count passed in as per:\n\t\t\t//      https://cloud.google.com/storage/docs/transcoding#range,\n\t\t\t// thus we have to manually move the body forward by seen bytes.\n\t\t\tif decompressiveTranscoding(res) && seen > 0 {\n\t\t\t\t_, _ = io.CopyN(io.Discard, res.Body, seen)\n\t\t\t}\n\n\t\t\t// If a generation hasn't been specified, and this is the first response we get, let's record the\n\t\t\t// generation. In future requests we'll use this generation as a precondition to avoid data races.\n\t\t\tif params.gen < 0 && res.Header.Get(\"X-Goog-Generation\") != \"\" {\n\t\t\t\tgen64, err := strconv.ParseInt(res.Header.Get(\"X-Goog-Generation\"), 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tparams.gen = gen64\n\t\t\t}\n\t\t\treturn nil\n\t\t}, s.retry, s.idempotent)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn res, nil\n\t}\n}\n\nfunc parseReadResponse(res *http.Response, params *newRangeReaderParams, reopen func(int64) (*http.Response, error)) (*Reader, error) {\n\tvar err error\n\tvar (\n\t\tsize        int64 // total size of object, even if a range was requested.\n\t\tcheckCRC    bool\n\t\tcrc         uint32\n\t\tstartOffset int64 // non-zero if range request.\n\t)\n\tif res.StatusCode == http.StatusPartialContent {\n\t\tcr := strings.TrimSpace(res.Header.Get(\"Content-Range\"))\n\t\tif !strings.HasPrefix(cr, \"bytes \") || !strings.Contains(cr, \"/\") {\n\t\t\treturn nil, fmt.Errorf(\"storage: invalid Content-Range %q\", cr)\n\t\t}\n\t\t// Content range is formatted <first byte>-<last byte>/<total size>. We take\n\t\t// the total size.\n\t\tsize, err = strconv.ParseInt(cr[strings.LastIndex(cr, \"/\")+1:], 10, 64)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"storage: invalid Content-Range %q\", cr)\n\t\t}\n\n\t\tdashIndex := strings.Index(cr, \"-\")\n\t\tif dashIndex >= 0 {\n\t\t\tstartOffset, err = strconv.ParseInt(cr[len(\"bytes=\"):dashIndex], 10, 64)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"storage: invalid Content-Range %q: %w\", cr, err)\n\t\t\t}\n\t\t}\n\t} else {\n\t\tsize = res.ContentLength\n\t}\n\n\t// Check the CRC iff all of the following hold:\n\t// - We asked for content (length != 0).\n\t// - We got all the content (status != PartialContent).\n\t// - The server sent a CRC header.\n\t// - The Go http stack did not uncompress the file.\n\t// - We were not served compressed data that was uncompressed on download.\n\t// The problem with the last two cases is that the CRC will not match -- GCS\n\t// computes it on the compressed contents, but we compute it on the\n\t// uncompressed contents.\n\tcrc, checkCRC = parseCRC32c(res)\n\tif params.length == 0 || res.StatusCode == http.StatusPartialContent || res.Uncompressed || uncompressedByServer(res) {\n\t\tcheckCRC = false\n\t}\n\n\tremain := res.ContentLength\n\tbody := res.Body\n\t// If the user requested zero bytes, explicitly close and remove the request\n\t// body.\n\tif params.length == 0 {\n\t\tremain = 0\n\t\tbody.Close()\n\t\tbody = emptyBody\n\t}\n\tvar metaGen int64\n\tif res.Header.Get(\"X-Goog-Metageneration\") != \"\" {\n\t\tmetaGen, err = strconv.ParseInt(res.Header.Get(\"X-Goog-Metageneration\"), 10, 64)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tvar lm time.Time\n\tif res.Header.Get(\"Last-Modified\") != \"\" {\n\t\tlm, err = http.ParseTime(res.Header.Get(\"Last-Modified\"))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tmetadata := map[string]string{}\n\tfor key, values := range res.Header {\n\t\tif len(values) > 0 && strings.HasPrefix(key, \"X-Goog-Meta-\") {\n\t\t\tkey := key[len(\"X-Goog-Meta-\"):]\n\t\t\tmetadata[key] = values[0]\n\t\t}\n\t}\n\n\tattrs := ReaderObjectAttrs{\n\t\tSize:            size,\n\t\tContentType:     res.Header.Get(\"Content-Type\"),\n\t\tContentEncoding: res.Header.Get(\"Content-Encoding\"),\n\t\tCacheControl:    res.Header.Get(\"Cache-Control\"),\n\t\tLastModified:    lm,\n\t\tStartOffset:     startOffset,\n\t\tGeneration:      params.gen,\n\t\tMetageneration:  metaGen,\n\t\tCRC32C:          crc,\n\t\tDecompressed:    res.Uncompressed || uncompressedByServer(res),\n\t}\n\treturn &Reader{\n\t\tAttrs:          attrs,\n\t\tobjectMetadata: &metadata,\n\t\tsize:           size,\n\t\tremain:         remain,\n\t\tcheckCRC:       checkCRC,\n\t\treader: &httpReader{\n\t\t\treopen:   reopen,\n\t\t\tbody:     body,\n\t\t\twantCRC:  crc,\n\t\t\tcheckCRC: checkCRC,\n\t\t},\n\t}, nil\n}\n\n// setHeadersFromCtx sets custom headers passed in via the context on the header,\n// replacing any header with the same key (which avoids duplicating invocation headers).\n// This is only required for XML; for gRPC & JSON requests this is handled in\n// the GAPIC and Apiary layers respectively.\nfunc setHeadersFromCtx(ctx context.Context, header http.Header) {\n\tctxHeaders := callctx.HeadersFromContext(ctx)\n\tfor k, vals := range ctxHeaders {\n\t\t// Merge x-goog-api-client values into a single space-separated value.\n\t\tif strings.EqualFold(k, xGoogHeaderKey) {\n\t\t\talreadySetValues := header.Values(xGoogHeaderKey)\n\t\t\tvals = append(vals, alreadySetValues...)\n\n\t\t\tif len(vals) > 0 {\n\t\t\t\txGoogHeader := vals[0]\n\t\t\t\tfor _, v := range vals[1:] {\n\t\t\t\t\txGoogHeader = strings.Join([]string{xGoogHeader, v}, \" \")\n\t\t\t\t}\n\t\t\t\theader.Set(k, xGoogHeader)\n\t\t\t}\n\t\t} else {\n\t\t\tfor _, v := range vals {\n\t\t\t\theader.Set(k, v)\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/iam.go",
    "content": "// Copyright 2017 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"context\"\n\n\t\"cloud.google.com/go/iam\"\n\t\"cloud.google.com/go/iam/apiv1/iampb\"\n\traw \"google.golang.org/api/storage/v1\"\n\t\"google.golang.org/genproto/googleapis/type/expr\"\n)\n\n// IAM provides access to IAM access control for the bucket.\nfunc (b *BucketHandle) IAM() *iam.Handle {\n\treturn iam.InternalNewHandleClient(&iamClient{\n\t\tuserProject: b.userProject,\n\t\tretry:       b.retry,\n\t\tclient:      b.c,\n\t}, b.name)\n}\n\n// iamClient implements the iam.client interface.\ntype iamClient struct {\n\tuserProject string\n\tretry       *retryConfig\n\tclient      *Client\n}\n\nfunc (c *iamClient) Get(ctx context.Context, resource string) (p *iampb.Policy, err error) {\n\treturn c.GetWithVersion(ctx, resource, 1)\n}\n\nfunc (c *iamClient) GetWithVersion(ctx context.Context, resource string, requestedPolicyVersion int32) (p *iampb.Policy, err error) {\n\tctx, _ = startSpan(ctx, \"storage.IAM.Get\")\n\tdefer func() { endSpan(ctx, err) }()\n\n\to := makeStorageOpts(true, c.retry, c.userProject)\n\treturn c.client.tc.GetIamPolicy(ctx, resource, requestedPolicyVersion, o...)\n}\n\nfunc (c *iamClient) Set(ctx context.Context, resource string, p *iampb.Policy) (err error) {\n\tctx, _ = startSpan(ctx, \"storage.IAM.Set\")\n\tdefer func() { endSpan(ctx, err) }()\n\n\tisIdempotent := len(p.Etag) > 0\n\to := makeStorageOpts(isIdempotent, c.retry, c.userProject)\n\treturn c.client.tc.SetIamPolicy(ctx, resource, p, o...)\n}\n\nfunc (c *iamClient) Test(ctx context.Context, resource string, perms []string) (permissions []string, err error) {\n\tctx, _ = startSpan(ctx, \"storage.IAM.Test\")\n\tdefer func() { endSpan(ctx, err) }()\n\n\to := makeStorageOpts(true, c.retry, c.userProject)\n\treturn c.client.tc.TestIamPermissions(ctx, resource, perms, o...)\n}\n\nfunc iamToStoragePolicy(ip *iampb.Policy) *raw.Policy {\n\treturn &raw.Policy{\n\t\tBindings: iamToStorageBindings(ip.Bindings),\n\t\tEtag:     string(ip.Etag),\n\t\tVersion:  int64(ip.Version),\n\t}\n}\n\nfunc iamToStorageBindings(ibs []*iampb.Binding) []*raw.PolicyBindings {\n\tvar rbs []*raw.PolicyBindings\n\tfor _, ib := range ibs {\n\t\trbs = append(rbs, &raw.PolicyBindings{\n\t\t\tRole:      ib.Role,\n\t\t\tMembers:   ib.Members,\n\t\t\tCondition: iamToStorageCondition(ib.Condition),\n\t\t})\n\t}\n\treturn rbs\n}\n\nfunc iamToStorageCondition(exprpb *expr.Expr) *raw.Expr {\n\tif exprpb == nil {\n\t\treturn nil\n\t}\n\treturn &raw.Expr{\n\t\tExpression:  exprpb.Expression,\n\t\tDescription: exprpb.Description,\n\t\tLocation:    exprpb.Location,\n\t\tTitle:       exprpb.Title,\n\t}\n}\n\nfunc iamFromStoragePolicy(rp *raw.Policy) *iampb.Policy {\n\treturn &iampb.Policy{\n\t\tBindings: iamFromStorageBindings(rp.Bindings),\n\t\tEtag:     []byte(rp.Etag),\n\t}\n}\n\nfunc iamFromStorageBindings(rbs []*raw.PolicyBindings) []*iampb.Binding {\n\tvar ibs []*iampb.Binding\n\tfor _, rb := range rbs {\n\t\tibs = append(ibs, &iampb.Binding{\n\t\t\tRole:      rb.Role,\n\t\t\tMembers:   rb.Members,\n\t\t\tCondition: iamFromStorageCondition(rb.Condition),\n\t\t})\n\t}\n\treturn ibs\n}\n\nfunc iamFromStorageCondition(rawexpr *raw.Expr) *expr.Expr {\n\tif rawexpr == nil {\n\t\treturn nil\n\t}\n\treturn &expr.Expr{\n\t\tExpression:  rawexpr.Expression,\n\t\tDescription: rawexpr.Description,\n\t\tLocation:    rawexpr.Location,\n\t\tTitle:       rawexpr.Title,\n\t}\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/internal/apiv2/auxiliary.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go_gapic. DO NOT EDIT.\n\npackage storage\n\nimport (\n\tstoragepb \"cloud.google.com/go/storage/internal/apiv2/storagepb\"\n\t\"google.golang.org/api/iterator\"\n)\n\n// BucketIterator manages a stream of *storagepb.Bucket.\ntype BucketIterator struct {\n\titems    []*storagepb.Bucket\n\tpageInfo *iterator.PageInfo\n\tnextFunc func() error\n\n\t// Response is the raw response for the current page.\n\t// It must be cast to the RPC response type.\n\t// Calling Next() or InternalFetch() updates this value.\n\tResponse interface{}\n\n\t// InternalFetch is for use by the Google Cloud Libraries only.\n\t// It is not part of the stable interface of this package.\n\t//\n\t// InternalFetch returns results from a single call to the underlying RPC.\n\t// The number of results is no greater than pageSize.\n\t// If there are no more results, nextPageToken is empty and err is nil.\n\tInternalFetch func(pageSize int, pageToken string) (results []*storagepb.Bucket, nextPageToken string, err error)\n}\n\n// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details.\nfunc (it *BucketIterator) PageInfo() *iterator.PageInfo {\n\treturn it.pageInfo\n}\n\n// Next returns the next result. Its second return value is iterator.Done if there are no more\n// results. Once Next returns Done, all subsequent calls will return Done.\nfunc (it *BucketIterator) Next() (*storagepb.Bucket, error) {\n\tvar item *storagepb.Bucket\n\tif err := it.nextFunc(); err != nil {\n\t\treturn item, err\n\t}\n\titem = it.items[0]\n\tit.items = it.items[1:]\n\treturn item, nil\n}\n\nfunc (it *BucketIterator) bufLen() int {\n\treturn len(it.items)\n}\n\nfunc (it *BucketIterator) takeBuf() interface{} {\n\tb := it.items\n\tit.items = nil\n\treturn b\n}\n\n// ObjectIterator manages a stream of *storagepb.Object.\ntype ObjectIterator struct {\n\titems    []*storagepb.Object\n\tpageInfo *iterator.PageInfo\n\tnextFunc func() error\n\n\t// Response is the raw response for the current page.\n\t// It must be cast to the RPC response type.\n\t// Calling Next() or InternalFetch() updates this value.\n\tResponse interface{}\n\n\t// InternalFetch is for use by the Google Cloud Libraries only.\n\t// It is not part of the stable interface of this package.\n\t//\n\t// InternalFetch returns results from a single call to the underlying RPC.\n\t// The number of results is no greater than pageSize.\n\t// If there are no more results, nextPageToken is empty and err is nil.\n\tInternalFetch func(pageSize int, pageToken string) (results []*storagepb.Object, nextPageToken string, err error)\n}\n\n// PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details.\nfunc (it *ObjectIterator) PageInfo() *iterator.PageInfo {\n\treturn it.pageInfo\n}\n\n// Next returns the next result. Its second return value is iterator.Done if there are no more\n// results. Once Next returns Done, all subsequent calls will return Done.\nfunc (it *ObjectIterator) Next() (*storagepb.Object, error) {\n\tvar item *storagepb.Object\n\tif err := it.nextFunc(); err != nil {\n\t\treturn item, err\n\t}\n\titem = it.items[0]\n\tit.items = it.items[1:]\n\treturn item, nil\n}\n\nfunc (it *ObjectIterator) bufLen() int {\n\treturn len(it.items)\n}\n\nfunc (it *ObjectIterator) takeBuf() interface{} {\n\tb := it.items\n\tit.items = nil\n\treturn b\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/internal/apiv2/auxiliary_go123.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go_gapic. DO NOT EDIT.\n\n//go:build go1.23\n\npackage storage\n\nimport (\n\t\"iter\"\n\n\tstoragepb \"cloud.google.com/go/storage/internal/apiv2/storagepb\"\n\t\"github.com/googleapis/gax-go/v2/iterator\"\n)\n\n// All returns an iterator. If an error is returned by the iterator, the\n// iterator will stop after that iteration.\nfunc (it *BucketIterator) All() iter.Seq2[*storagepb.Bucket, error] {\n\treturn iterator.RangeAdapter(it.Next)\n}\n\n// All returns an iterator. If an error is returned by the iterator, the\n// iterator will stop after that iteration.\nfunc (it *ObjectIterator) All() iter.Seq2[*storagepb.Object, error] {\n\treturn iterator.RangeAdapter(it.Next)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/internal/apiv2/doc.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go_gapic. DO NOT EDIT.\n\n// Package storage is an auto-generated package for the\n// Cloud Storage API.\n//\n// This folder contains protocol buffer definitions for an API only\n// accessible to select customers. Customers not participating should not\n// depend on this file. Please contact Google Cloud sales if you are\n// interested. Unless told otherwise by a Google Cloud representative, do not\n// use or otherwise rely on any of the contents of this folder. If you would\n// like to use Cloud Storage, please consult our official documentation (at\n// https://cloud.google.com/storage/docs/apis) for details on our XML and\n// JSON APIs, or else consider one of our client libraries (at\n// https://cloud.google.com/storage/docs/reference/libraries).\n//\n// # General documentation\n//\n// For information that is relevant for all client libraries please reference\n// https://pkg.go.dev/cloud.google.com/go#pkg-overview. Some information on this\n// page includes:\n//\n//   - [Authentication and Authorization]\n//   - [Timeouts and Cancellation]\n//   - [Testing against Client Libraries]\n//   - [Debugging Client Libraries]\n//   - [Inspecting errors]\n//\n// # Example usage\n//\n// To get started with this package, create a client.\n//\n//\t// go get cloud.google.com/go/storage/internal/apiv2@latest\n//\tctx := context.Background()\n//\t// This snippet has been automatically generated and should be regarded as a code template only.\n//\t// It will require modifications to work:\n//\t// - It may require correct/in-range values for request initialization.\n//\t// - It may require specifying regional endpoints when creating the service client as shown in:\n//\t//   https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options\n//\tc, err := storage.NewClient(ctx)\n//\tif err != nil {\n//\t\t// TODO: Handle error.\n//\t}\n//\tdefer c.Close()\n//\n// The client will use your default application credentials. Clients should be reused instead of created as needed.\n// The methods of Client are safe for concurrent use by multiple goroutines.\n// The returned client must be Closed when it is done being used.\n//\n// # Using the Client\n//\n// The following is an example of making an API call with the newly created client, mentioned above.\n//\n//\tstream, err := c.BidiReadObject(ctx)\n//\tif err != nil {\n//\t\t// TODO: Handle error.\n//\t}\n//\tgo func() {\n//\t\treqs := []*storagepb.BidiReadObjectRequest{\n//\t\t\t// TODO: Create requests.\n//\t\t}\n//\t\tfor _, req := range reqs {\n//\t\t\tif err := stream.Send(req); err != nil {\n//\t\t\t\t// TODO: Handle error.\n//\t\t\t}\n//\t\t}\n//\t\tstream.CloseSend()\n//\t}()\n//\tfor {\n//\t\tresp, err := stream.Recv()\n//\t\tif err == io.EOF {\n//\t\t\tbreak\n//\t\t}\n//\t\tif err != nil {\n//\t\t\t// TODO: handle error.\n//\t\t}\n//\t\t// TODO: Use resp.\n//\t\t_ = resp\n//\t}\n//\n// # Use of Context\n//\n// The ctx passed to NewClient is used for authentication requests and\n// for creating the underlying connection, but is not used for subsequent calls.\n// Individual methods on the client use the ctx given to them.\n//\n// To close the open connection, use the Close() method.\n//\n// [Authentication and Authorization]: https://pkg.go.dev/cloud.google.com/go#hdr-Authentication_and_Authorization\n// [Timeouts and Cancellation]: https://pkg.go.dev/cloud.google.com/go#hdr-Timeouts_and_Cancellation\n// [Testing against Client Libraries]: https://pkg.go.dev/cloud.google.com/go#hdr-Testing\n// [Debugging Client Libraries]: https://pkg.go.dev/cloud.google.com/go#hdr-Debugging\n// [Inspecting errors]: https://pkg.go.dev/cloud.google.com/go#hdr-Inspecting_errors\npackage storage // import \"cloud.google.com/go/storage/internal/apiv2\"\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/internal/apiv2/gapic_metadata.json",
    "content": "{\n  \"schema\": \"1.0\",\n  \"comment\": \"This file maps proto services/RPCs to the corresponding library clients/methods.\",\n  \"language\": \"go\",\n  \"protoPackage\": \"google.storage.v2\",\n  \"libraryPackage\": \"cloud.google.com/go/storage/internal/apiv2\",\n  \"services\": {\n    \"Storage\": {\n      \"clients\": {\n        \"grpc\": {\n          \"libraryClient\": \"Client\",\n          \"rpcs\": {\n            \"BidiReadObject\": {\n              \"methods\": [\n                \"BidiReadObject\"\n              ]\n            },\n            \"BidiWriteObject\": {\n              \"methods\": [\n                \"BidiWriteObject\"\n              ]\n            },\n            \"CancelResumableWrite\": {\n              \"methods\": [\n                \"CancelResumableWrite\"\n              ]\n            },\n            \"ComposeObject\": {\n              \"methods\": [\n                \"ComposeObject\"\n              ]\n            },\n            \"CreateBucket\": {\n              \"methods\": [\n                \"CreateBucket\"\n              ]\n            },\n            \"DeleteBucket\": {\n              \"methods\": [\n                \"DeleteBucket\"\n              ]\n            },\n            \"DeleteObject\": {\n              \"methods\": [\n                \"DeleteObject\"\n              ]\n            },\n            \"GetBucket\": {\n              \"methods\": [\n                \"GetBucket\"\n              ]\n            },\n            \"GetIamPolicy\": {\n              \"methods\": [\n                \"GetIamPolicy\"\n              ]\n            },\n            \"GetObject\": {\n              \"methods\": [\n                \"GetObject\"\n              ]\n            },\n            \"ListBuckets\": {\n              \"methods\": [\n                \"ListBuckets\"\n              ]\n            },\n            \"ListObjects\": {\n              \"methods\": [\n                \"ListObjects\"\n              ]\n            },\n            \"LockBucketRetentionPolicy\": {\n              \"methods\": [\n                \"LockBucketRetentionPolicy\"\n              ]\n            },\n            \"MoveObject\": {\n              \"methods\": [\n                \"MoveObject\"\n              ]\n            },\n            \"QueryWriteStatus\": {\n              \"methods\": [\n                \"QueryWriteStatus\"\n              ]\n            },\n            \"ReadObject\": {\n              \"methods\": [\n                \"ReadObject\"\n              ]\n            },\n            \"RestoreObject\": {\n              \"methods\": [\n                \"RestoreObject\"\n              ]\n            },\n            \"RewriteObject\": {\n              \"methods\": [\n                \"RewriteObject\"\n              ]\n            },\n            \"SetIamPolicy\": {\n              \"methods\": [\n                \"SetIamPolicy\"\n              ]\n            },\n            \"StartResumableWrite\": {\n              \"methods\": [\n                \"StartResumableWrite\"\n              ]\n            },\n            \"TestIamPermissions\": {\n              \"methods\": [\n                \"TestIamPermissions\"\n              ]\n            },\n            \"UpdateBucket\": {\n              \"methods\": [\n                \"UpdateBucket\"\n              ]\n            },\n            \"UpdateObject\": {\n              \"methods\": [\n                \"UpdateObject\"\n              ]\n            },\n            \"WriteObject\": {\n              \"methods\": [\n                \"WriteObject\"\n              ]\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/internal/apiv2/helpers.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go_gapic. DO NOT EDIT.\n\npackage storage\n\nimport (\n\t\"context\"\n\t\"log/slog\"\n\n\t\"github.com/googleapis/gax-go/v2/internallog/grpclog\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\nconst serviceName = \"storage.googleapis.com\"\n\n// For more information on implementing a client constructor hook, see\n// https://github.com/googleapis/google-cloud-go/wiki/Customizing-constructors.\ntype clientHookParams struct{}\ntype clientHook func(context.Context, clientHookParams) ([]option.ClientOption, error)\n\nvar versionClient string\n\nfunc getVersionClient() string {\n\tif versionClient == \"\" {\n\t\treturn \"UNKNOWN\"\n\t}\n\treturn versionClient\n}\n\n// DefaultAuthScopes reports the default set of authentication scopes to use with this package.\nfunc DefaultAuthScopes() []string {\n\treturn []string{\n\t\t\"https://www.googleapis.com/auth/cloud-platform\",\n\t\t\"https://www.googleapis.com/auth/cloud-platform.read-only\",\n\t\t\"https://www.googleapis.com/auth/devstorage.full_control\",\n\t\t\"https://www.googleapis.com/auth/devstorage.read_only\",\n\t\t\"https://www.googleapis.com/auth/devstorage.read_write\",\n\t}\n}\n\nfunc executeRPC[I proto.Message, O proto.Message](ctx context.Context, fn func(context.Context, I, ...grpc.CallOption) (O, error), req I, opts []grpc.CallOption, logger *slog.Logger, rpc string) (O, error) {\n\tvar zero O\n\tlogger.DebugContext(ctx, \"api request\", \"serviceName\", serviceName, \"rpcName\", rpc, \"request\", grpclog.ProtoMessageRequest(ctx, req))\n\tresp, err := fn(ctx, req, opts...)\n\tif err != nil {\n\t\treturn zero, err\n\t}\n\tlogger.DebugContext(ctx, \"api response\", \"serviceName\", serviceName, \"rpcName\", rpc, \"response\", grpclog.ProtoMessageResponse(resp))\n\treturn resp, err\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/internal/apiv2/storage_client.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go_gapic. DO NOT EDIT.\n\npackage storage\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"math\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strings\"\n\t\"time\"\n\n\tiampb \"cloud.google.com/go/iam/apiv1/iampb\"\n\tstoragepb \"cloud.google.com/go/storage/internal/apiv2/storagepb\"\n\tgax \"github.com/googleapis/gax-go/v2\"\n\t\"google.golang.org/api/iterator\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/api/option/internaloption\"\n\tgtransport \"google.golang.org/api/transport/grpc\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\nvar newClientHook clientHook\n\n// CallOptions contains the retry settings for each method of Client.\ntype CallOptions struct {\n\tDeleteBucket              []gax.CallOption\n\tGetBucket                 []gax.CallOption\n\tCreateBucket              []gax.CallOption\n\tListBuckets               []gax.CallOption\n\tLockBucketRetentionPolicy []gax.CallOption\n\tGetIamPolicy              []gax.CallOption\n\tSetIamPolicy              []gax.CallOption\n\tTestIamPermissions        []gax.CallOption\n\tUpdateBucket              []gax.CallOption\n\tComposeObject             []gax.CallOption\n\tDeleteObject              []gax.CallOption\n\tRestoreObject             []gax.CallOption\n\tCancelResumableWrite      []gax.CallOption\n\tGetObject                 []gax.CallOption\n\tReadObject                []gax.CallOption\n\tBidiReadObject            []gax.CallOption\n\tUpdateObject              []gax.CallOption\n\tWriteObject               []gax.CallOption\n\tBidiWriteObject           []gax.CallOption\n\tListObjects               []gax.CallOption\n\tRewriteObject             []gax.CallOption\n\tStartResumableWrite       []gax.CallOption\n\tQueryWriteStatus          []gax.CallOption\n\tMoveObject                []gax.CallOption\n}\n\nfunc defaultGRPCClientOptions() []option.ClientOption {\n\treturn []option.ClientOption{\n\t\tinternaloption.WithDefaultEndpoint(\"storage.googleapis.com:443\"),\n\t\tinternaloption.WithDefaultEndpointTemplate(\"storage.UNIVERSE_DOMAIN:443\"),\n\t\tinternaloption.WithDefaultMTLSEndpoint(\"storage.mtls.googleapis.com:443\"),\n\t\tinternaloption.WithDefaultUniverseDomain(\"googleapis.com\"),\n\t\tinternaloption.WithDefaultAudience(\"https://storage.googleapis.com/\"),\n\t\tinternaloption.WithDefaultScopes(DefaultAuthScopes()...),\n\t\tinternaloption.EnableJwtWithScope(),\n\t\tinternaloption.EnableNewAuthLibrary(),\n\t\toption.WithGRPCDialOption(grpc.WithDefaultCallOptions(\n\t\t\tgrpc.MaxCallRecvMsgSize(math.MaxInt32))),\n\t}\n}\n\nfunc defaultCallOptions() *CallOptions {\n\treturn &CallOptions{\n\t\tDeleteBucket: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tGetBucket: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tCreateBucket: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tListBuckets: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tLockBucketRetentionPolicy: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tGetIamPolicy: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tSetIamPolicy: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tTestIamPermissions: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tUpdateBucket: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tComposeObject: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tDeleteObject: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tRestoreObject: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tCancelResumableWrite: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tGetObject: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tReadObject: []gax.CallOption{\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tBidiReadObject: []gax.CallOption{\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tUpdateObject: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tWriteObject: []gax.CallOption{\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tBidiWriteObject: []gax.CallOption{\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tListObjects: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tRewriteObject: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tStartResumableWrite: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tQueryWriteStatus: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t\tMoveObject: []gax.CallOption{\n\t\t\tgax.WithTimeout(60000 * time.Millisecond),\n\t\t\tgax.WithRetry(func() gax.Retryer {\n\t\t\t\treturn gax.OnCodes([]codes.Code{\n\t\t\t\t\tcodes.DeadlineExceeded,\n\t\t\t\t\tcodes.Unavailable,\n\t\t\t\t}, gax.Backoff{\n\t\t\t\t\tInitial:    1000 * time.Millisecond,\n\t\t\t\t\tMax:        60000 * time.Millisecond,\n\t\t\t\t\tMultiplier: 2.00,\n\t\t\t\t})\n\t\t\t}),\n\t\t},\n\t}\n}\n\n// internalClient is an interface that defines the methods available from Cloud Storage API.\ntype internalClient interface {\n\tClose() error\n\tsetGoogleClientInfo(...string)\n\tConnection() *grpc.ClientConn\n\tDeleteBucket(context.Context, *storagepb.DeleteBucketRequest, ...gax.CallOption) error\n\tGetBucket(context.Context, *storagepb.GetBucketRequest, ...gax.CallOption) (*storagepb.Bucket, error)\n\tCreateBucket(context.Context, *storagepb.CreateBucketRequest, ...gax.CallOption) (*storagepb.Bucket, error)\n\tListBuckets(context.Context, *storagepb.ListBucketsRequest, ...gax.CallOption) *BucketIterator\n\tLockBucketRetentionPolicy(context.Context, *storagepb.LockBucketRetentionPolicyRequest, ...gax.CallOption) (*storagepb.Bucket, error)\n\tGetIamPolicy(context.Context, *iampb.GetIamPolicyRequest, ...gax.CallOption) (*iampb.Policy, error)\n\tSetIamPolicy(context.Context, *iampb.SetIamPolicyRequest, ...gax.CallOption) (*iampb.Policy, error)\n\tTestIamPermissions(context.Context, *iampb.TestIamPermissionsRequest, ...gax.CallOption) (*iampb.TestIamPermissionsResponse, error)\n\tUpdateBucket(context.Context, *storagepb.UpdateBucketRequest, ...gax.CallOption) (*storagepb.Bucket, error)\n\tComposeObject(context.Context, *storagepb.ComposeObjectRequest, ...gax.CallOption) (*storagepb.Object, error)\n\tDeleteObject(context.Context, *storagepb.DeleteObjectRequest, ...gax.CallOption) error\n\tRestoreObject(context.Context, *storagepb.RestoreObjectRequest, ...gax.CallOption) (*storagepb.Object, error)\n\tCancelResumableWrite(context.Context, *storagepb.CancelResumableWriteRequest, ...gax.CallOption) (*storagepb.CancelResumableWriteResponse, error)\n\tGetObject(context.Context, *storagepb.GetObjectRequest, ...gax.CallOption) (*storagepb.Object, error)\n\tReadObject(context.Context, *storagepb.ReadObjectRequest, ...gax.CallOption) (storagepb.Storage_ReadObjectClient, error)\n\tBidiReadObject(context.Context, ...gax.CallOption) (storagepb.Storage_BidiReadObjectClient, error)\n\tUpdateObject(context.Context, *storagepb.UpdateObjectRequest, ...gax.CallOption) (*storagepb.Object, error)\n\tWriteObject(context.Context, ...gax.CallOption) (storagepb.Storage_WriteObjectClient, error)\n\tBidiWriteObject(context.Context, ...gax.CallOption) (storagepb.Storage_BidiWriteObjectClient, error)\n\tListObjects(context.Context, *storagepb.ListObjectsRequest, ...gax.CallOption) *ObjectIterator\n\tRewriteObject(context.Context, *storagepb.RewriteObjectRequest, ...gax.CallOption) (*storagepb.RewriteResponse, error)\n\tStartResumableWrite(context.Context, *storagepb.StartResumableWriteRequest, ...gax.CallOption) (*storagepb.StartResumableWriteResponse, error)\n\tQueryWriteStatus(context.Context, *storagepb.QueryWriteStatusRequest, ...gax.CallOption) (*storagepb.QueryWriteStatusResponse, error)\n\tMoveObject(context.Context, *storagepb.MoveObjectRequest, ...gax.CallOption) (*storagepb.Object, error)\n}\n\n// Client is a client for interacting with Cloud Storage API.\n// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.\n//\n// API Overview and Naming SyntaxThe Cloud Storage gRPC API allows applications to read and write data through\n// the abstractions of buckets and objects. For a description of these\n// abstractions please see https://cloud.google.com/storage/docs (at https://cloud.google.com/storage/docs).\n//\n// Resources are named as follows:\n//\n//\tProjects are referred to as they are defined by the Resource Manager API,\n//\tusing strings like projects/123456 or projects/my-string-id.\n//\n//\tBuckets are named using string names of the form:\n//\tprojects/{project}/buckets/{bucket}\n//\tFor globally unique buckets, _ may be substituted for the project.\n//\n//\tObjects are uniquely identified by their name along with the name of the\n//\tbucket they belong to, as separate strings in this API. For example:\n//\n//\tReadObjectRequest {\n//\t  bucket: ‘projects/_/buckets/my-bucket’\n//\t  object: ‘my-object’\n//\t  }\n//\t  Note that object names can contain / characters, which are treated as\n//\t  any other character (no special directory semantics).\ntype Client struct {\n\t// The internal transport-dependent client.\n\tinternalClient internalClient\n\n\t// The call options for this service.\n\tCallOptions *CallOptions\n}\n\n// Wrapper methods routed to the internal client.\n\n// Close closes the connection to the API service. The user should invoke this when\n// the client is no longer required.\nfunc (c *Client) Close() error {\n\treturn c.internalClient.Close()\n}\n\n// setGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Intended for\n// use by Google-written clients.\nfunc (c *Client) setGoogleClientInfo(keyval ...string) {\n\tc.internalClient.setGoogleClientInfo(keyval...)\n}\n\n// Connection returns a connection to the API service.\n//\n// Deprecated: Connections are now pooled so this method does not always\n// return the same resource.\nfunc (c *Client) Connection() *grpc.ClientConn {\n\treturn c.internalClient.Connection()\n}\n\n// DeleteBucket permanently deletes an empty bucket.\nfunc (c *Client) DeleteBucket(ctx context.Context, req *storagepb.DeleteBucketRequest, opts ...gax.CallOption) error {\n\treturn c.internalClient.DeleteBucket(ctx, req, opts...)\n}\n\n// GetBucket returns metadata for the specified bucket.\nfunc (c *Client) GetBucket(ctx context.Context, req *storagepb.GetBucketRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) {\n\treturn c.internalClient.GetBucket(ctx, req, opts...)\n}\n\n// CreateBucket creates a new bucket.\nfunc (c *Client) CreateBucket(ctx context.Context, req *storagepb.CreateBucketRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) {\n\treturn c.internalClient.CreateBucket(ctx, req, opts...)\n}\n\n// ListBuckets retrieves a list of buckets for a given project.\nfunc (c *Client) ListBuckets(ctx context.Context, req *storagepb.ListBucketsRequest, opts ...gax.CallOption) *BucketIterator {\n\treturn c.internalClient.ListBuckets(ctx, req, opts...)\n}\n\n// LockBucketRetentionPolicy locks retention policy on a bucket.\nfunc (c *Client) LockBucketRetentionPolicy(ctx context.Context, req *storagepb.LockBucketRetentionPolicyRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) {\n\treturn c.internalClient.LockBucketRetentionPolicy(ctx, req, opts...)\n}\n\n// GetIamPolicy gets the IAM policy for a specified bucket.\n// The resource field in the request should be\n// projects/_/buckets/{bucket}.\nfunc (c *Client) GetIamPolicy(ctx context.Context, req *iampb.GetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) {\n\treturn c.internalClient.GetIamPolicy(ctx, req, opts...)\n}\n\n// SetIamPolicy updates an IAM policy for the specified bucket.\n// The resource field in the request should be\n// projects/_/buckets/{bucket}.\nfunc (c *Client) SetIamPolicy(ctx context.Context, req *iampb.SetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) {\n\treturn c.internalClient.SetIamPolicy(ctx, req, opts...)\n}\n\n// TestIamPermissions tests a set of permissions on the given bucket, object, or managed folder\n// to see which, if any, are held by the caller.\n// The resource field in the request should be\n// projects/_/buckets/{bucket} for a bucket,\n// projects/_/buckets/{bucket}/objects/{object} for an object, or\n// projects/_/buckets/{bucket}/managedFolders/{managedFolder}\n// for a managed folder.\nfunc (c *Client) TestIamPermissions(ctx context.Context, req *iampb.TestIamPermissionsRequest, opts ...gax.CallOption) (*iampb.TestIamPermissionsResponse, error) {\n\treturn c.internalClient.TestIamPermissions(ctx, req, opts...)\n}\n\n// UpdateBucket updates a bucket. Equivalent to JSON API’s storage.buckets.patch method.\nfunc (c *Client) UpdateBucket(ctx context.Context, req *storagepb.UpdateBucketRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) {\n\treturn c.internalClient.UpdateBucket(ctx, req, opts...)\n}\n\n// ComposeObject concatenates a list of existing objects into a new object in the same\n// bucket.\nfunc (c *Client) ComposeObject(ctx context.Context, req *storagepb.ComposeObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) {\n\treturn c.internalClient.ComposeObject(ctx, req, opts...)\n}\n\n// DeleteObject deletes an object and its metadata. Deletions are permanent if versioning\n// is not enabled for the bucket, or if the generation parameter is used, or\n// if soft delete (at https://cloud.google.com/storage/docs/soft-delete) is not\n// enabled for the bucket.\n// When this API is used to delete an object from a bucket that has soft\n// delete policy enabled, the object becomes soft deleted, and the\n// softDeleteTime and hardDeleteTime properties are set on the object.\n// This API cannot be used to permanently delete soft-deleted objects.\n// Soft-deleted objects are permanently deleted according to their\n// hardDeleteTime.\n//\n// You can use the [RestoreObject][google.storage.v2.Storage.RestoreObject]\n// API to restore soft-deleted objects until the soft delete retention period\n// has passed.\n//\n// IAM Permissions:\n//\n// Requires storage.objects.delete\n// IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) on\n// the bucket.\nfunc (c *Client) DeleteObject(ctx context.Context, req *storagepb.DeleteObjectRequest, opts ...gax.CallOption) error {\n\treturn c.internalClient.DeleteObject(ctx, req, opts...)\n}\n\n// RestoreObject restores a soft-deleted object.\nfunc (c *Client) RestoreObject(ctx context.Context, req *storagepb.RestoreObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) {\n\treturn c.internalClient.RestoreObject(ctx, req, opts...)\n}\n\n// CancelResumableWrite cancels an in-progress resumable upload.\n//\n// Any attempts to write to the resumable upload after cancelling the upload\n// will fail.\n//\n// The behavior for currently in progress write operations is not guaranteed -\n// they could either complete before the cancellation or fail if the\n// cancellation completes first.\nfunc (c *Client) CancelResumableWrite(ctx context.Context, req *storagepb.CancelResumableWriteRequest, opts ...gax.CallOption) (*storagepb.CancelResumableWriteResponse, error) {\n\treturn c.internalClient.CancelResumableWrite(ctx, req, opts...)\n}\n\n// GetObject retrieves object metadata.\n//\n// IAM Permissions:\n//\n// Requires storage.objects.get\n// IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) on\n// the bucket. To return object ACLs, the authenticated user must also have\n// the storage.objects.getIamPolicy permission.\nfunc (c *Client) GetObject(ctx context.Context, req *storagepb.GetObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) {\n\treturn c.internalClient.GetObject(ctx, req, opts...)\n}\n\n// ReadObject retrieves object data.\n//\n// IAM Permissions:\n//\n// Requires storage.objects.get\n// IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) on\n// the bucket.\nfunc (c *Client) ReadObject(ctx context.Context, req *storagepb.ReadObjectRequest, opts ...gax.CallOption) (storagepb.Storage_ReadObjectClient, error) {\n\treturn c.internalClient.ReadObject(ctx, req, opts...)\n}\n\n// BidiReadObject reads an object’s data.\n//\n// This is a bi-directional API with the added support for reading multiple\n// ranges within one stream both within and across multiple messages.\n// If the server encountered an error for any of the inputs, the stream will\n// be closed with the relevant error code.\n// Because the API allows for multiple outstanding requests, when the stream\n// is closed the error response will contain a BidiReadObjectRangesError proto\n// in the error extension describing the error for each outstanding read_id.\n//\n// IAM Permissions:\n//\n// # Requires storage.objects.get\n//\n// IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) on\n// the bucket.\n//\n// This API is currently in preview and is not yet available for general\n// use.\nfunc (c *Client) BidiReadObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_BidiReadObjectClient, error) {\n\treturn c.internalClient.BidiReadObject(ctx, opts...)\n}\n\n// UpdateObject updates an object’s metadata.\n// Equivalent to JSON API’s storage.objects.patch.\nfunc (c *Client) UpdateObject(ctx context.Context, req *storagepb.UpdateObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) {\n\treturn c.internalClient.UpdateObject(ctx, req, opts...)\n}\n\n// WriteObject stores a new object and metadata.\n//\n// An object can be written either in a single message stream or in a\n// resumable sequence of message streams. To write using a single stream,\n// the client should include in the first message of the stream an\n// WriteObjectSpec describing the destination bucket, object, and any\n// preconditions. Additionally, the final message must set ‘finish_write’ to\n// true, or else it is an error.\n//\n// For a resumable write, the client should instead call\n// StartResumableWrite(), populating a WriteObjectSpec into that request.\n// They should then attach the returned upload_id to the first message of\n// each following call to WriteObject. If the stream is closed before\n// finishing the upload (either explicitly by the client or due to a network\n// error or an error response from the server), the client should do as\n// follows:\n//\n//\tCheck the result Status of the stream, to determine if writing can be\n//\tresumed on this stream or must be restarted from scratch (by calling\n//\tStartResumableWrite()). The resumable errors are DEADLINE_EXCEEDED,\n//\tINTERNAL, and UNAVAILABLE. For each case, the client should use binary\n//\texponential backoff before retrying.  Additionally, writes can be\n//\tresumed after RESOURCE_EXHAUSTED errors, but only after taking\n//\tappropriate measures, which may include reducing aggregate send rate\n//\tacross clients and/or requesting a quota increase for your project.\n//\n//\tIf the call to WriteObject returns ABORTED, that indicates\n//\tconcurrent attempts to update the resumable write, caused either by\n//\tmultiple racing clients or by a single client where the previous\n//\trequest was timed out on the client side but nonetheless reached the\n//\tserver. In this case the client should take steps to prevent further\n//\tconcurrent writes (e.g., increase the timeouts, stop using more than\n//\tone process to perform the upload, etc.), and then should follow the\n//\tsteps below for resuming the upload.\n//\n//\tFor resumable errors, the client should call QueryWriteStatus() and\n//\tthen continue writing from the returned persisted_size. This may be\n//\tless than the amount of data the client previously sent. Note also that\n//\tit is acceptable to send data starting at an offset earlier than the\n//\treturned persisted_size; in this case, the service will skip data at\n//\toffsets that were already persisted (without checking that it matches\n//\tthe previously written data), and write only the data starting from the\n//\tpersisted offset. Even though the data isn’t written, it may still\n//\tincur a performance cost over resuming at the correct write offset.\n//\tThis behavior can make client-side handling simpler in some cases.\n//\n//\tClients must only send data that is a multiple of 256 KiB per message,\n//\tunless the object is being finished with finish_write set to true.\n//\n// The service will not view the object as complete until the client has\n// sent a WriteObjectRequest with finish_write set to true. Sending any\n// requests on a stream after sending a request with finish_write set to\n// true will cause an error. The client should check the response it\n// receives to determine how much data the service was able to commit and\n// whether the service views the object as complete.\n//\n// Attempting to resume an already finalized object will result in an OK\n// status, with a WriteObjectResponse containing the finalized object’s\n// metadata.\n//\n// Alternatively, the BidiWriteObject operation may be used to write an\n// object with controls over flushing and the ability to fetch the ability to\n// determine the current persisted size.\n//\n// IAM Permissions:\n//\n// Requires storage.objects.create\n// IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) on\n// the bucket.\nfunc (c *Client) WriteObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_WriteObjectClient, error) {\n\treturn c.internalClient.WriteObject(ctx, opts...)\n}\n\n// BidiWriteObject stores a new object and metadata.\n//\n// This is similar to the WriteObject call with the added support for\n// manual flushing of persisted state, and the ability to determine current\n// persisted size without closing the stream.\n//\n// The client may specify one or both of the state_lookup and flush fields\n// in each BidiWriteObjectRequest. If flush is specified, the data written\n// so far will be persisted to storage. If state_lookup is specified, the\n// service will respond with a BidiWriteObjectResponse that contains the\n// persisted size. If both flush and state_lookup are specified, the flush\n// will always occur before a state_lookup, so that both may be set in the\n// same request and the returned state will be the state of the object\n// post-flush. When the stream is closed, a BidiWriteObjectResponse will\n// always be sent to the client, regardless of the value of state_lookup.\nfunc (c *Client) BidiWriteObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_BidiWriteObjectClient, error) {\n\treturn c.internalClient.BidiWriteObject(ctx, opts...)\n}\n\n// ListObjects retrieves a list of objects matching the criteria.\n//\n// IAM Permissions:\n//\n// The authenticated user requires storage.objects.list\n// IAM permission (at https://cloud.google.com/iam/docs/overview#permissions)\n// to use this method. To return object ACLs, the authenticated user must also\n// have the storage.objects.getIamPolicy permission.\nfunc (c *Client) ListObjects(ctx context.Context, req *storagepb.ListObjectsRequest, opts ...gax.CallOption) *ObjectIterator {\n\treturn c.internalClient.ListObjects(ctx, req, opts...)\n}\n\n// RewriteObject rewrites a source object to a destination object. Optionally overrides\n// metadata.\nfunc (c *Client) RewriteObject(ctx context.Context, req *storagepb.RewriteObjectRequest, opts ...gax.CallOption) (*storagepb.RewriteResponse, error) {\n\treturn c.internalClient.RewriteObject(ctx, req, opts...)\n}\n\n// StartResumableWrite starts a resumable write operation. This\n// method is part of the Resumable\n// upload (at https://cloud.google.com/storage/docs/resumable-uploads) feature.\n// This allows you to upload large objects in multiple chunks, which is more\n// resilient to network interruptions than a single upload. The validity\n// duration of the write operation, and the consequences of it becoming\n// invalid, are service-dependent.\n//\n// IAM Permissions:\n//\n// Requires storage.objects.create\n// IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) on\n// the bucket.\nfunc (c *Client) StartResumableWrite(ctx context.Context, req *storagepb.StartResumableWriteRequest, opts ...gax.CallOption) (*storagepb.StartResumableWriteResponse, error) {\n\treturn c.internalClient.StartResumableWrite(ctx, req, opts...)\n}\n\n// QueryWriteStatus determines the persisted_size of an object that is being written. This\n// method is part of the resumable\n// upload (at https://cloud.google.com/storage/docs/resumable-uploads) feature.\n// The returned value is the size of the object that has been persisted so\n// far. The value can be used as the write_offset for the next Write()\n// call.\n//\n// If the object does not exist, meaning if it was deleted, or the\n// first Write() has not yet reached the service, this method returns the\n// error NOT_FOUND.\n//\n// This method is useful for clients that buffer data and need to know which\n// data can be safely evicted. The client can call QueryWriteStatus() at any\n// time to determine how much data has been logged for this object.\n// For any sequence of QueryWriteStatus() calls for a given\n// object name, the sequence of returned persisted_size values are\n// non-decreasing.\nfunc (c *Client) QueryWriteStatus(ctx context.Context, req *storagepb.QueryWriteStatusRequest, opts ...gax.CallOption) (*storagepb.QueryWriteStatusResponse, error) {\n\treturn c.internalClient.QueryWriteStatus(ctx, req, opts...)\n}\n\n// MoveObject moves the source object to the destination object in the same bucket.\nfunc (c *Client) MoveObject(ctx context.Context, req *storagepb.MoveObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) {\n\treturn c.internalClient.MoveObject(ctx, req, opts...)\n}\n\n// gRPCClient is a client for interacting with Cloud Storage API over gRPC transport.\n//\n// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.\ntype gRPCClient struct {\n\t// Connection pool of gRPC connections to the service.\n\tconnPool gtransport.ConnPool\n\n\t// Points back to the CallOptions field of the containing Client\n\tCallOptions **CallOptions\n\n\t// The gRPC API client.\n\tclient storagepb.StorageClient\n\n\t// The x-goog-* metadata to be sent with each request.\n\txGoogHeaders []string\n\n\tlogger *slog.Logger\n}\n\n// NewClient creates a new storage client based on gRPC.\n// The returned client must be Closed when it is done being used to clean up its underlying connections.\n//\n// API Overview and Naming SyntaxThe Cloud Storage gRPC API allows applications to read and write data through\n// the abstractions of buckets and objects. For a description of these\n// abstractions please see https://cloud.google.com/storage/docs (at https://cloud.google.com/storage/docs).\n//\n// Resources are named as follows:\n//\n//\tProjects are referred to as they are defined by the Resource Manager API,\n//\tusing strings like projects/123456 or projects/my-string-id.\n//\n//\tBuckets are named using string names of the form:\n//\tprojects/{project}/buckets/{bucket}\n//\tFor globally unique buckets, _ may be substituted for the project.\n//\n//\tObjects are uniquely identified by their name along with the name of the\n//\tbucket they belong to, as separate strings in this API. For example:\n//\n//\tReadObjectRequest {\n//\t  bucket: ‘projects/_/buckets/my-bucket’\n//\t  object: ‘my-object’\n//\t  }\n//\t  Note that object names can contain / characters, which are treated as\n//\t  any other character (no special directory semantics).\nfunc NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) {\n\tclientOpts := defaultGRPCClientOptions()\n\tif newClientHook != nil {\n\t\thookOpts, err := newClientHook(ctx, clientHookParams{})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tclientOpts = append(clientOpts, hookOpts...)\n\t}\n\n\tconnPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tclient := Client{CallOptions: defaultCallOptions()}\n\n\tc := &gRPCClient{\n\t\tconnPool:    connPool,\n\t\tclient:      storagepb.NewStorageClient(connPool),\n\t\tCallOptions: &client.CallOptions,\n\t\tlogger:      internaloption.GetLogger(opts),\n\t}\n\tc.setGoogleClientInfo()\n\n\tclient.internalClient = c\n\n\treturn &client, nil\n}\n\n// Connection returns a connection to the API service.\n//\n// Deprecated: Connections are now pooled so this method does not always\n// return the same resource.\nfunc (c *gRPCClient) Connection() *grpc.ClientConn {\n\treturn c.connPool.Conn()\n}\n\n// setGoogleClientInfo sets the name and version of the application in\n// the `x-goog-api-client` header passed on each request. Intended for\n// use by Google-written clients.\nfunc (c *gRPCClient) setGoogleClientInfo(keyval ...string) {\n\tkv := append([]string{\"gl-go\", gax.GoVersion}, keyval...)\n\tkv = append(kv, \"gapic\", getVersionClient(), \"gax\", gax.Version, \"grpc\", grpc.Version)\n\tc.xGoogHeaders = []string{\n\t\t\"x-goog-api-client\", gax.XGoogHeader(kv...),\n\t}\n}\n\n// Close closes the connection to the API service. The user should invoke this when\n// the client is no longer required.\nfunc (c *gRPCClient) Close() error {\n\treturn c.connPool.Close()\n}\n\nfunc (c *gRPCClient) DeleteBucket(ctx context.Context, req *storagepb.DeleteBucketRequest, opts ...gax.CallOption) error {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<bucket>.*)\"); reg.MatchString(req.GetName()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetName())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetName())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).DeleteBucket[0:len((*c.CallOptions).DeleteBucket):len((*c.CallOptions).DeleteBucket)], opts...)\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\t_, err = executeRPC(ctx, c.client.DeleteBucket, req, settings.GRPC, c.logger, \"DeleteBucket\")\n\t\treturn err\n\t}, opts...)\n\treturn err\n}\n\nfunc (c *gRPCClient) GetBucket(ctx context.Context, req *storagepb.GetBucketRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<bucket>.*)\"); reg.MatchString(req.GetName()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetName())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetName())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).GetBucket[0:len((*c.CallOptions).GetBucket):len((*c.CallOptions).GetBucket)], opts...)\n\tvar resp *storagepb.Bucket\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.client.GetBucket, req, settings.GRPC, c.logger, \"GetBucket\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) CreateBucket(ctx context.Context, req *storagepb.CreateBucketRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<project>.*)\"); reg.MatchString(req.GetParent()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetParent())[1])) > 0 {\n\t\troutingHeadersMap[\"project\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetParent())[1])\n\t}\n\tif reg := regexp.MustCompile(\"(?P<project>.*)\"); reg.MatchString(req.GetBucket().GetProject()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetBucket().GetProject())[1])) > 0 {\n\t\troutingHeadersMap[\"project\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetBucket().GetProject())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).CreateBucket[0:len((*c.CallOptions).CreateBucket):len((*c.CallOptions).CreateBucket)], opts...)\n\tvar resp *storagepb.Bucket\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.client.CreateBucket, req, settings.GRPC, c.logger, \"CreateBucket\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) ListBuckets(ctx context.Context, req *storagepb.ListBucketsRequest, opts ...gax.CallOption) *BucketIterator {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<project>.*)\"); reg.MatchString(req.GetParent()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetParent())[1])) > 0 {\n\t\troutingHeadersMap[\"project\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetParent())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).ListBuckets[0:len((*c.CallOptions).ListBuckets):len((*c.CallOptions).ListBuckets)], opts...)\n\tit := &BucketIterator{}\n\treq = proto.Clone(req).(*storagepb.ListBucketsRequest)\n\tit.InternalFetch = func(pageSize int, pageToken string) ([]*storagepb.Bucket, string, error) {\n\t\tresp := &storagepb.ListBucketsResponse{}\n\t\tif pageToken != \"\" {\n\t\t\treq.PageToken = pageToken\n\t\t}\n\t\tif pageSize > math.MaxInt32 {\n\t\t\treq.PageSize = math.MaxInt32\n\t\t} else if pageSize != 0 {\n\t\t\treq.PageSize = int32(pageSize)\n\t\t}\n\t\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\t\tvar err error\n\t\t\tresp, err = executeRPC(ctx, c.client.ListBuckets, req, settings.GRPC, c.logger, \"ListBuckets\")\n\t\t\treturn err\n\t\t}, opts...)\n\t\tif err != nil {\n\t\t\treturn nil, \"\", err\n\t\t}\n\n\t\tit.Response = resp\n\t\treturn resp.GetBuckets(), resp.GetNextPageToken(), nil\n\t}\n\tfetch := func(pageSize int, pageToken string) (string, error) {\n\t\titems, nextPageToken, err := it.InternalFetch(pageSize, pageToken)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tit.items = append(it.items, items...)\n\t\treturn nextPageToken, nil\n\t}\n\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)\n\tit.pageInfo.MaxSize = int(req.GetPageSize())\n\tit.pageInfo.Token = req.GetPageToken()\n\n\treturn it\n}\n\nfunc (c *gRPCClient) LockBucketRetentionPolicy(ctx context.Context, req *storagepb.LockBucketRetentionPolicyRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<bucket>.*)\"); reg.MatchString(req.GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).LockBucketRetentionPolicy[0:len((*c.CallOptions).LockBucketRetentionPolicy):len((*c.CallOptions).LockBucketRetentionPolicy)], opts...)\n\tvar resp *storagepb.Bucket\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.client.LockBucketRetentionPolicy, req, settings.GRPC, c.logger, \"LockBucketRetentionPolicy\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) GetIamPolicy(ctx context.Context, req *iampb.GetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<bucket>.*)\"); reg.MatchString(req.GetResource()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).GetIamPolicy[0:len((*c.CallOptions).GetIamPolicy):len((*c.CallOptions).GetIamPolicy)], opts...)\n\tvar resp *iampb.Policy\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.client.GetIamPolicy, req, settings.GRPC, c.logger, \"GetIamPolicy\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) SetIamPolicy(ctx context.Context, req *iampb.SetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<bucket>.*)\"); reg.MatchString(req.GetResource()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).SetIamPolicy[0:len((*c.CallOptions).SetIamPolicy):len((*c.CallOptions).SetIamPolicy)], opts...)\n\tvar resp *iampb.Policy\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.client.SetIamPolicy, req, settings.GRPC, c.logger, \"SetIamPolicy\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) TestIamPermissions(ctx context.Context, req *iampb.TestIamPermissionsRequest, opts ...gax.CallOption) (*iampb.TestIamPermissionsResponse, error) {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<bucket>.*)\"); reg.MatchString(req.GetResource()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1])\n\t}\n\tif reg := regexp.MustCompile(\"(?P<bucket>projects/[^/]+/buckets/[^/]+)/objects(?:/.*)?\"); reg.MatchString(req.GetResource()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1])\n\t}\n\tif reg := regexp.MustCompile(\"(?P<bucket>projects/[^/]+/buckets/[^/]+)/managedFolders(?:/.*)?\"); reg.MatchString(req.GetResource()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).TestIamPermissions[0:len((*c.CallOptions).TestIamPermissions):len((*c.CallOptions).TestIamPermissions)], opts...)\n\tvar resp *iampb.TestIamPermissionsResponse\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.client.TestIamPermissions, req, settings.GRPC, c.logger, \"TestIamPermissions\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) UpdateBucket(ctx context.Context, req *storagepb.UpdateBucketRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<bucket>.*)\"); reg.MatchString(req.GetBucket().GetName()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetBucket().GetName())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetBucket().GetName())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).UpdateBucket[0:len((*c.CallOptions).UpdateBucket):len((*c.CallOptions).UpdateBucket)], opts...)\n\tvar resp *storagepb.Bucket\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.client.UpdateBucket, req, settings.GRPC, c.logger, \"UpdateBucket\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) ComposeObject(ctx context.Context, req *storagepb.ComposeObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<bucket>.*)\"); reg.MatchString(req.GetDestination().GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetDestination().GetBucket())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetDestination().GetBucket())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).ComposeObject[0:len((*c.CallOptions).ComposeObject):len((*c.CallOptions).ComposeObject)], opts...)\n\tvar resp *storagepb.Object\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.client.ComposeObject, req, settings.GRPC, c.logger, \"ComposeObject\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) DeleteObject(ctx context.Context, req *storagepb.DeleteObjectRequest, opts ...gax.CallOption) error {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<bucket>.*)\"); reg.MatchString(req.GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).DeleteObject[0:len((*c.CallOptions).DeleteObject):len((*c.CallOptions).DeleteObject)], opts...)\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\t_, err = executeRPC(ctx, c.client.DeleteObject, req, settings.GRPC, c.logger, \"DeleteObject\")\n\t\treturn err\n\t}, opts...)\n\treturn err\n}\n\nfunc (c *gRPCClient) RestoreObject(ctx context.Context, req *storagepb.RestoreObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<bucket>.*)\"); reg.MatchString(req.GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).RestoreObject[0:len((*c.CallOptions).RestoreObject):len((*c.CallOptions).RestoreObject)], opts...)\n\tvar resp *storagepb.Object\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.client.RestoreObject, req, settings.GRPC, c.logger, \"RestoreObject\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) CancelResumableWrite(ctx context.Context, req *storagepb.CancelResumableWriteRequest, opts ...gax.CallOption) (*storagepb.CancelResumableWriteResponse, error) {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<bucket>projects/[^/]+/buckets/[^/]+)(?:/.*)?\"); reg.MatchString(req.GetUploadId()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetUploadId())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetUploadId())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).CancelResumableWrite[0:len((*c.CallOptions).CancelResumableWrite):len((*c.CallOptions).CancelResumableWrite)], opts...)\n\tvar resp *storagepb.CancelResumableWriteResponse\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.client.CancelResumableWrite, req, settings.GRPC, c.logger, \"CancelResumableWrite\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) GetObject(ctx context.Context, req *storagepb.GetObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<bucket>.*)\"); reg.MatchString(req.GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).GetObject[0:len((*c.CallOptions).GetObject):len((*c.CallOptions).GetObject)], opts...)\n\tvar resp *storagepb.Object\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.client.GetObject, req, settings.GRPC, c.logger, \"GetObject\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) ReadObject(ctx context.Context, req *storagepb.ReadObjectRequest, opts ...gax.CallOption) (storagepb.Storage_ReadObjectClient, error) {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<bucket>.*)\"); reg.MatchString(req.GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).ReadObject[0:len((*c.CallOptions).ReadObject):len((*c.CallOptions).ReadObject)], opts...)\n\tvar resp storagepb.Storage_ReadObjectClient\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tc.logger.DebugContext(ctx, \"api streaming client request\", \"serviceName\", serviceName, \"rpcName\", \"ReadObject\")\n\t\tresp, err = c.client.ReadObject(ctx, req, settings.GRPC...)\n\t\tc.logger.DebugContext(ctx, \"api streaming client response\", \"serviceName\", serviceName, \"rpcName\", \"ReadObject\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) BidiReadObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_BidiReadObjectClient, error) {\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, c.xGoogHeaders...)\n\tvar resp storagepb.Storage_BidiReadObjectClient\n\topts = append((*c.CallOptions).BidiReadObject[0:len((*c.CallOptions).BidiReadObject):len((*c.CallOptions).BidiReadObject)], opts...)\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tc.logger.DebugContext(ctx, \"api streaming client request\", \"serviceName\", serviceName, \"rpcName\", \"BidiReadObject\")\n\t\tresp, err = c.client.BidiReadObject(ctx, settings.GRPC...)\n\t\tc.logger.DebugContext(ctx, \"api streaming client response\", \"serviceName\", serviceName, \"rpcName\", \"BidiReadObject\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) UpdateObject(ctx context.Context, req *storagepb.UpdateObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<bucket>.*)\"); reg.MatchString(req.GetObject().GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetObject().GetBucket())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetObject().GetBucket())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).UpdateObject[0:len((*c.CallOptions).UpdateObject):len((*c.CallOptions).UpdateObject)], opts...)\n\tvar resp *storagepb.Object\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.client.UpdateObject, req, settings.GRPC, c.logger, \"UpdateObject\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) WriteObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_WriteObjectClient, error) {\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, c.xGoogHeaders...)\n\tvar resp storagepb.Storage_WriteObjectClient\n\topts = append((*c.CallOptions).WriteObject[0:len((*c.CallOptions).WriteObject):len((*c.CallOptions).WriteObject)], opts...)\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tc.logger.DebugContext(ctx, \"api streaming client request\", \"serviceName\", serviceName, \"rpcName\", \"WriteObject\")\n\t\tresp, err = c.client.WriteObject(ctx, settings.GRPC...)\n\t\tc.logger.DebugContext(ctx, \"api streaming client response\", \"serviceName\", serviceName, \"rpcName\", \"WriteObject\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) BidiWriteObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_BidiWriteObjectClient, error) {\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, c.xGoogHeaders...)\n\tvar resp storagepb.Storage_BidiWriteObjectClient\n\topts = append((*c.CallOptions).BidiWriteObject[0:len((*c.CallOptions).BidiWriteObject):len((*c.CallOptions).BidiWriteObject)], opts...)\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tc.logger.DebugContext(ctx, \"api streaming client request\", \"serviceName\", serviceName, \"rpcName\", \"BidiWriteObject\")\n\t\tresp, err = c.client.BidiWriteObject(ctx, settings.GRPC...)\n\t\tc.logger.DebugContext(ctx, \"api streaming client response\", \"serviceName\", serviceName, \"rpcName\", \"BidiWriteObject\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) ListObjects(ctx context.Context, req *storagepb.ListObjectsRequest, opts ...gax.CallOption) *ObjectIterator {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<bucket>.*)\"); reg.MatchString(req.GetParent()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetParent())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetParent())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).ListObjects[0:len((*c.CallOptions).ListObjects):len((*c.CallOptions).ListObjects)], opts...)\n\tit := &ObjectIterator{}\n\treq = proto.Clone(req).(*storagepb.ListObjectsRequest)\n\tit.InternalFetch = func(pageSize int, pageToken string) ([]*storagepb.Object, string, error) {\n\t\tresp := &storagepb.ListObjectsResponse{}\n\t\tif pageToken != \"\" {\n\t\t\treq.PageToken = pageToken\n\t\t}\n\t\tif pageSize > math.MaxInt32 {\n\t\t\treq.PageSize = math.MaxInt32\n\t\t} else if pageSize != 0 {\n\t\t\treq.PageSize = int32(pageSize)\n\t\t}\n\t\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\t\tvar err error\n\t\t\tresp, err = executeRPC(ctx, c.client.ListObjects, req, settings.GRPC, c.logger, \"ListObjects\")\n\t\t\treturn err\n\t\t}, opts...)\n\t\tif err != nil {\n\t\t\treturn nil, \"\", err\n\t\t}\n\n\t\tit.Response = resp\n\t\treturn resp.GetObjects(), resp.GetNextPageToken(), nil\n\t}\n\tfetch := func(pageSize int, pageToken string) (string, error) {\n\t\titems, nextPageToken, err := it.InternalFetch(pageSize, pageToken)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tit.items = append(it.items, items...)\n\t\treturn nextPageToken, nil\n\t}\n\n\tit.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)\n\tit.pageInfo.MaxSize = int(req.GetPageSize())\n\tit.pageInfo.Token = req.GetPageToken()\n\n\treturn it\n}\n\nfunc (c *gRPCClient) RewriteObject(ctx context.Context, req *storagepb.RewriteObjectRequest, opts ...gax.CallOption) (*storagepb.RewriteResponse, error) {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(.*)\"); reg.MatchString(req.GetSourceBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetSourceBucket())[1])) > 0 {\n\t\troutingHeadersMap[\"source_bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetSourceBucket())[1])\n\t}\n\tif reg := regexp.MustCompile(\"(?P<bucket>.*)\"); reg.MatchString(req.GetDestinationBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetDestinationBucket())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetDestinationBucket())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).RewriteObject[0:len((*c.CallOptions).RewriteObject):len((*c.CallOptions).RewriteObject)], opts...)\n\tvar resp *storagepb.RewriteResponse\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.client.RewriteObject, req, settings.GRPC, c.logger, \"RewriteObject\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) StartResumableWrite(ctx context.Context, req *storagepb.StartResumableWriteRequest, opts ...gax.CallOption) (*storagepb.StartResumableWriteResponse, error) {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<bucket>.*)\"); reg.MatchString(req.GetWriteObjectSpec().GetResource().GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetWriteObjectSpec().GetResource().GetBucket())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetWriteObjectSpec().GetResource().GetBucket())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).StartResumableWrite[0:len((*c.CallOptions).StartResumableWrite):len((*c.CallOptions).StartResumableWrite)], opts...)\n\tvar resp *storagepb.StartResumableWriteResponse\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.client.StartResumableWrite, req, settings.GRPC, c.logger, \"StartResumableWrite\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) QueryWriteStatus(ctx context.Context, req *storagepb.QueryWriteStatusRequest, opts ...gax.CallOption) (*storagepb.QueryWriteStatusResponse, error) {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<bucket>projects/[^/]+/buckets/[^/]+)(?:/.*)?\"); reg.MatchString(req.GetUploadId()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetUploadId())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetUploadId())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).QueryWriteStatus[0:len((*c.CallOptions).QueryWriteStatus):len((*c.CallOptions).QueryWriteStatus)], opts...)\n\tvar resp *storagepb.QueryWriteStatusResponse\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.client.QueryWriteStatus, req, settings.GRPC, c.logger, \"QueryWriteStatus\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n\nfunc (c *gRPCClient) MoveObject(ctx context.Context, req *storagepb.MoveObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) {\n\troutingHeaders := \"\"\n\troutingHeadersMap := make(map[string]string)\n\tif reg := regexp.MustCompile(\"(?P<bucket>.*)\"); reg.MatchString(req.GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])) > 0 {\n\t\troutingHeadersMap[\"bucket\"] = url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])\n\t}\n\tfor headerName, headerValue := range routingHeadersMap {\n\t\troutingHeaders = fmt.Sprintf(\"%s%s=%s&\", routingHeaders, headerName, headerValue)\n\t}\n\troutingHeaders = strings.TrimSuffix(routingHeaders, \"&\")\n\thds := []string{\"x-goog-request-params\", routingHeaders}\n\n\thds = append(c.xGoogHeaders, hds...)\n\tctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)\n\topts = append((*c.CallOptions).MoveObject[0:len((*c.CallOptions).MoveObject):len((*c.CallOptions).MoveObject)], opts...)\n\tvar resp *storagepb.Object\n\terr := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {\n\t\tvar err error\n\t\tresp, err = executeRPC(ctx, c.client.MoveObject, req, settings.GRPC, c.logger, \"MoveObject\")\n\t\treturn err\n\t}, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/internal/apiv2/storagepb/storage.pb.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v4.25.3\n// source: google/storage/v2/storage.proto\n\npackage storagepb\n\nimport (\n\tcontext \"context\"\n\treflect \"reflect\"\n\tsync \"sync\"\n\n\tiampb \"cloud.google.com/go/iam/apiv1/iampb\"\n\t_ \"google.golang.org/genproto/googleapis/api/annotations\"\n\tstatus \"google.golang.org/genproto/googleapis/rpc/status\"\n\tdate \"google.golang.org/genproto/googleapis/type/date\"\n\tgrpc \"google.golang.org/grpc\"\n\tcodes \"google.golang.org/grpc/codes\"\n\tstatus1 \"google.golang.org/grpc/status\"\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\tdurationpb \"google.golang.org/protobuf/types/known/durationpb\"\n\temptypb \"google.golang.org/protobuf/types/known/emptypb\"\n\tfieldmaskpb \"google.golang.org/protobuf/types/known/fieldmaskpb\"\n\ttimestamppb \"google.golang.org/protobuf/types/known/timestamppb\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\n// A collection of constant values meaningful to the Storage API.\ntype ServiceConstants_Values int32\n\nconst (\n\t// Unused. Proto3 requires first enum to be 0.\n\tServiceConstants_VALUES_UNSPECIFIED ServiceConstants_Values = 0\n\t// The maximum size chunk that can will be returned in a single\n\t// ReadRequest.\n\t// 2 MiB.\n\tServiceConstants_MAX_READ_CHUNK_BYTES ServiceConstants_Values = 2097152\n\t// The maximum size chunk that can be sent in a single WriteObjectRequest.\n\t// 2 MiB.\n\tServiceConstants_MAX_WRITE_CHUNK_BYTES ServiceConstants_Values = 2097152\n\t// The maximum size of an object in MB - whether written in a single stream\n\t// or composed from multiple other objects.\n\t// 5 TiB.\n\tServiceConstants_MAX_OBJECT_SIZE_MB ServiceConstants_Values = 5242880\n\t// The maximum length field name that can be sent in a single\n\t// custom metadata field.\n\t// 1 KiB.\n\tServiceConstants_MAX_CUSTOM_METADATA_FIELD_NAME_BYTES ServiceConstants_Values = 1024\n\t// The maximum length field value that can be sent in a single\n\t// custom_metadata field.\n\t// 4 KiB.\n\tServiceConstants_MAX_CUSTOM_METADATA_FIELD_VALUE_BYTES ServiceConstants_Values = 4096\n\t// The maximum total bytes that can be populated into all field names and\n\t// values of the custom_metadata for one object.\n\t// 8 KiB.\n\tServiceConstants_MAX_CUSTOM_METADATA_TOTAL_SIZE_BYTES ServiceConstants_Values = 8192\n\t// The maximum total bytes that can be populated into all bucket metadata\n\t// fields.\n\t// 20 KiB.\n\tServiceConstants_MAX_BUCKET_METADATA_TOTAL_SIZE_BYTES ServiceConstants_Values = 20480\n\t// The maximum number of NotificationConfigs that can be registered\n\t// for a given bucket.\n\tServiceConstants_MAX_NOTIFICATION_CONFIGS_PER_BUCKET ServiceConstants_Values = 100\n\t// The maximum number of LifecycleRules that can be registered for a given\n\t// bucket.\n\tServiceConstants_MAX_LIFECYCLE_RULES_PER_BUCKET ServiceConstants_Values = 100\n\t// The maximum number of custom attributes per NotificationConfigs.\n\tServiceConstants_MAX_NOTIFICATION_CUSTOM_ATTRIBUTES ServiceConstants_Values = 5\n\t// The maximum length of a custom attribute key included in\n\t// NotificationConfig.\n\tServiceConstants_MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_KEY_LENGTH ServiceConstants_Values = 256\n\t// The maximum length of a custom attribute value included in a\n\t// NotificationConfig.\n\tServiceConstants_MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_VALUE_LENGTH ServiceConstants_Values = 1024\n\t// The maximum number of key/value entries per bucket label.\n\tServiceConstants_MAX_LABELS_ENTRIES_COUNT ServiceConstants_Values = 64\n\t// The maximum character length of the key or value in a bucket\n\t// label map.\n\tServiceConstants_MAX_LABELS_KEY_VALUE_LENGTH ServiceConstants_Values = 63\n\t// The maximum byte size of the key or value in a bucket label\n\t// map.\n\tServiceConstants_MAX_LABELS_KEY_VALUE_BYTES ServiceConstants_Values = 128\n\t// The maximum number of object IDs that can be included in a\n\t// DeleteObjectsRequest.\n\tServiceConstants_MAX_OBJECT_IDS_PER_DELETE_OBJECTS_REQUEST ServiceConstants_Values = 1000\n\t// The maximum number of days for which a token returned by the\n\t// GetListObjectsSplitPoints RPC is valid.\n\tServiceConstants_SPLIT_TOKEN_MAX_VALID_DAYS ServiceConstants_Values = 14\n)\n\n// Enum value maps for ServiceConstants_Values.\nvar (\n\tServiceConstants_Values_name = map[int32]string{\n\t\t0:       \"VALUES_UNSPECIFIED\",\n\t\t2097152: \"MAX_READ_CHUNK_BYTES\",\n\t\t// Duplicate value: 2097152: \"MAX_WRITE_CHUNK_BYTES\",\n\t\t5242880: \"MAX_OBJECT_SIZE_MB\",\n\t\t1024:    \"MAX_CUSTOM_METADATA_FIELD_NAME_BYTES\",\n\t\t4096:    \"MAX_CUSTOM_METADATA_FIELD_VALUE_BYTES\",\n\t\t8192:    \"MAX_CUSTOM_METADATA_TOTAL_SIZE_BYTES\",\n\t\t20480:   \"MAX_BUCKET_METADATA_TOTAL_SIZE_BYTES\",\n\t\t100:     \"MAX_NOTIFICATION_CONFIGS_PER_BUCKET\",\n\t\t// Duplicate value: 100: \"MAX_LIFECYCLE_RULES_PER_BUCKET\",\n\t\t5:   \"MAX_NOTIFICATION_CUSTOM_ATTRIBUTES\",\n\t\t256: \"MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_KEY_LENGTH\",\n\t\t// Duplicate value: 1024: \"MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_VALUE_LENGTH\",\n\t\t64:   \"MAX_LABELS_ENTRIES_COUNT\",\n\t\t63:   \"MAX_LABELS_KEY_VALUE_LENGTH\",\n\t\t128:  \"MAX_LABELS_KEY_VALUE_BYTES\",\n\t\t1000: \"MAX_OBJECT_IDS_PER_DELETE_OBJECTS_REQUEST\",\n\t\t14:   \"SPLIT_TOKEN_MAX_VALID_DAYS\",\n\t}\n\tServiceConstants_Values_value = map[string]int32{\n\t\t\"VALUES_UNSPECIFIED\":                             0,\n\t\t\"MAX_READ_CHUNK_BYTES\":                           2097152,\n\t\t\"MAX_WRITE_CHUNK_BYTES\":                          2097152,\n\t\t\"MAX_OBJECT_SIZE_MB\":                             5242880,\n\t\t\"MAX_CUSTOM_METADATA_FIELD_NAME_BYTES\":           1024,\n\t\t\"MAX_CUSTOM_METADATA_FIELD_VALUE_BYTES\":          4096,\n\t\t\"MAX_CUSTOM_METADATA_TOTAL_SIZE_BYTES\":           8192,\n\t\t\"MAX_BUCKET_METADATA_TOTAL_SIZE_BYTES\":           20480,\n\t\t\"MAX_NOTIFICATION_CONFIGS_PER_BUCKET\":            100,\n\t\t\"MAX_LIFECYCLE_RULES_PER_BUCKET\":                 100,\n\t\t\"MAX_NOTIFICATION_CUSTOM_ATTRIBUTES\":             5,\n\t\t\"MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_KEY_LENGTH\":   256,\n\t\t\"MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_VALUE_LENGTH\": 1024,\n\t\t\"MAX_LABELS_ENTRIES_COUNT\":                       64,\n\t\t\"MAX_LABELS_KEY_VALUE_LENGTH\":                    63,\n\t\t\"MAX_LABELS_KEY_VALUE_BYTES\":                     128,\n\t\t\"MAX_OBJECT_IDS_PER_DELETE_OBJECTS_REQUEST\":      1000,\n\t\t\"SPLIT_TOKEN_MAX_VALID_DAYS\":                     14,\n\t}\n)\n\nfunc (x ServiceConstants_Values) Enum() *ServiceConstants_Values {\n\tp := new(ServiceConstants_Values)\n\t*p = x\n\treturn p\n}\n\nfunc (x ServiceConstants_Values) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (ServiceConstants_Values) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_google_storage_v2_storage_proto_enumTypes[0].Descriptor()\n}\n\nfunc (ServiceConstants_Values) Type() protoreflect.EnumType {\n\treturn &file_google_storage_v2_storage_proto_enumTypes[0]\n}\n\nfunc (x ServiceConstants_Values) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use ServiceConstants_Values.Descriptor instead.\nfunc (ServiceConstants_Values) EnumDescriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{42, 0}\n}\n\n// Request message for DeleteBucket.\ntype DeleteBucketRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Name of a bucket to delete.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// If set, only deletes the bucket if its metageneration matches this value.\n\tIfMetagenerationMatch *int64 `protobuf:\"varint,2,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof\" json:\"if_metageneration_match,omitempty\"`\n\t// If set, only deletes the bucket if its metageneration does not match this\n\t// value.\n\tIfMetagenerationNotMatch *int64 `protobuf:\"varint,3,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof\" json:\"if_metageneration_not_match,omitempty\"`\n}\n\nfunc (x *DeleteBucketRequest) Reset() {\n\t*x = DeleteBucketRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *DeleteBucketRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DeleteBucketRequest) ProtoMessage() {}\n\nfunc (x *DeleteBucketRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DeleteBucketRequest.ProtoReflect.Descriptor instead.\nfunc (*DeleteBucketRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *DeleteBucketRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *DeleteBucketRequest) GetIfMetagenerationMatch() int64 {\n\tif x != nil && x.IfMetagenerationMatch != nil {\n\t\treturn *x.IfMetagenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *DeleteBucketRequest) GetIfMetagenerationNotMatch() int64 {\n\tif x != nil && x.IfMetagenerationNotMatch != nil {\n\t\treturn *x.IfMetagenerationNotMatch\n\t}\n\treturn 0\n}\n\n// Request message for GetBucket.\ntype GetBucketRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Name of a bucket.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// If set, and if the bucket's current metageneration does not match the\n\t// specified value, the request will return an error.\n\tIfMetagenerationMatch *int64 `protobuf:\"varint,2,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof\" json:\"if_metageneration_match,omitempty\"`\n\t// If set, and if the bucket's current metageneration matches the specified\n\t// value, the request will return an error.\n\tIfMetagenerationNotMatch *int64 `protobuf:\"varint,3,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof\" json:\"if_metageneration_not_match,omitempty\"`\n\t// Mask specifying which fields to read.\n\t// A \"*\" field may be used to indicate all fields.\n\t// If no mask is specified, will default to all fields.\n\tReadMask *fieldmaskpb.FieldMask `protobuf:\"bytes,5,opt,name=read_mask,json=readMask,proto3,oneof\" json:\"read_mask,omitempty\"`\n}\n\nfunc (x *GetBucketRequest) Reset() {\n\t*x = GetBucketRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *GetBucketRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetBucketRequest) ProtoMessage() {}\n\nfunc (x *GetBucketRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetBucketRequest.ProtoReflect.Descriptor instead.\nfunc (*GetBucketRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *GetBucketRequest) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetBucketRequest) GetIfMetagenerationMatch() int64 {\n\tif x != nil && x.IfMetagenerationMatch != nil {\n\t\treturn *x.IfMetagenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *GetBucketRequest) GetIfMetagenerationNotMatch() int64 {\n\tif x != nil && x.IfMetagenerationNotMatch != nil {\n\t\treturn *x.IfMetagenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *GetBucketRequest) GetReadMask() *fieldmaskpb.FieldMask {\n\tif x != nil {\n\t\treturn x.ReadMask\n\t}\n\treturn nil\n}\n\n// Request message for CreateBucket.\ntype CreateBucketRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The project to which this bucket will belong.\n\tParent string `protobuf:\"bytes,1,opt,name=parent,proto3\" json:\"parent,omitempty\"`\n\t// Properties of the new bucket being inserted.\n\t// The name of the bucket is specified in the `bucket_id` field. Populating\n\t// `bucket.name` field will result in an error.\n\t// The project of the bucket must be specified in the `bucket.project` field.\n\t// This field must be in `projects/{projectIdentifier}` format,\n\t// {projectIdentifier} can be the project ID or project number. The `parent`\n\t// field must be either empty or `projects/_`.\n\tBucket *Bucket `protobuf:\"bytes,2,opt,name=bucket,proto3\" json:\"bucket,omitempty\"`\n\t// Required. The ID to use for this bucket, which will become the final\n\t// component of the bucket's resource name. For example, the value `foo` might\n\t// result in a bucket with the name `projects/123456/buckets/foo`.\n\tBucketId string `protobuf:\"bytes,3,opt,name=bucket_id,json=bucketId,proto3\" json:\"bucket_id,omitempty\"`\n\t// Apply a predefined set of access controls to this bucket.\n\t// Valid values are \"authenticatedRead\", \"private\", \"projectPrivate\",\n\t// \"publicRead\", or \"publicReadWrite\".\n\tPredefinedAcl string `protobuf:\"bytes,6,opt,name=predefined_acl,json=predefinedAcl,proto3\" json:\"predefined_acl,omitempty\"`\n\t// Apply a predefined set of default object access controls to this bucket.\n\t// Valid values are \"authenticatedRead\", \"bucketOwnerFullControl\",\n\t// \"bucketOwnerRead\", \"private\", \"projectPrivate\", or \"publicRead\".\n\tPredefinedDefaultObjectAcl string `protobuf:\"bytes,7,opt,name=predefined_default_object_acl,json=predefinedDefaultObjectAcl,proto3\" json:\"predefined_default_object_acl,omitempty\"`\n}\n\nfunc (x *CreateBucketRequest) Reset() {\n\t*x = CreateBucketRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[2]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *CreateBucketRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CreateBucketRequest) ProtoMessage() {}\n\nfunc (x *CreateBucketRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[2]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CreateBucketRequest.ProtoReflect.Descriptor instead.\nfunc (*CreateBucketRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{2}\n}\n\nfunc (x *CreateBucketRequest) GetParent() string {\n\tif x != nil {\n\t\treturn x.Parent\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateBucketRequest) GetBucket() *Bucket {\n\tif x != nil {\n\t\treturn x.Bucket\n\t}\n\treturn nil\n}\n\nfunc (x *CreateBucketRequest) GetBucketId() string {\n\tif x != nil {\n\t\treturn x.BucketId\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateBucketRequest) GetPredefinedAcl() string {\n\tif x != nil {\n\t\treturn x.PredefinedAcl\n\t}\n\treturn \"\"\n}\n\nfunc (x *CreateBucketRequest) GetPredefinedDefaultObjectAcl() string {\n\tif x != nil {\n\t\treturn x.PredefinedDefaultObjectAcl\n\t}\n\treturn \"\"\n}\n\n// Request message for ListBuckets.\ntype ListBucketsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The project whose buckets we are listing.\n\tParent string `protobuf:\"bytes,1,opt,name=parent,proto3\" json:\"parent,omitempty\"`\n\t// Maximum number of buckets to return in a single response. The service will\n\t// use this parameter or 1,000 items, whichever is smaller. If \"acl\" is\n\t// present in the read_mask, the service will use this parameter of 200 items,\n\t// whichever is smaller.\n\tPageSize int32 `protobuf:\"varint,2,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\t// A previously-returned page token representing part of the larger set of\n\t// results to view.\n\tPageToken string `protobuf:\"bytes,3,opt,name=page_token,json=pageToken,proto3\" json:\"page_token,omitempty\"`\n\t// Filter results to buckets whose names begin with this prefix.\n\tPrefix string `protobuf:\"bytes,4,opt,name=prefix,proto3\" json:\"prefix,omitempty\"`\n\t// Mask specifying which fields to read from each result.\n\t// If no mask is specified, will default to all fields except items.owner,\n\t// items.acl, and items.default_object_acl.\n\t// * may be used to mean \"all fields\".\n\tReadMask *fieldmaskpb.FieldMask `protobuf:\"bytes,5,opt,name=read_mask,json=readMask,proto3,oneof\" json:\"read_mask,omitempty\"`\n}\n\nfunc (x *ListBucketsRequest) Reset() {\n\t*x = ListBucketsRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[3]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListBucketsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListBucketsRequest) ProtoMessage() {}\n\nfunc (x *ListBucketsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[3]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListBucketsRequest.ProtoReflect.Descriptor instead.\nfunc (*ListBucketsRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{3}\n}\n\nfunc (x *ListBucketsRequest) GetParent() string {\n\tif x != nil {\n\t\treturn x.Parent\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListBucketsRequest) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListBucketsRequest) GetPageToken() string {\n\tif x != nil {\n\t\treturn x.PageToken\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListBucketsRequest) GetPrefix() string {\n\tif x != nil {\n\t\treturn x.Prefix\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListBucketsRequest) GetReadMask() *fieldmaskpb.FieldMask {\n\tif x != nil {\n\t\treturn x.ReadMask\n\t}\n\treturn nil\n}\n\n// The result of a call to Buckets.ListBuckets\ntype ListBucketsResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The list of items.\n\tBuckets []*Bucket `protobuf:\"bytes,1,rep,name=buckets,proto3\" json:\"buckets,omitempty\"`\n\t// The continuation token, used to page through large result sets. Provide\n\t// this value in a subsequent request to return the next page of results.\n\tNextPageToken string `protobuf:\"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3\" json:\"next_page_token,omitempty\"`\n}\n\nfunc (x *ListBucketsResponse) Reset() {\n\t*x = ListBucketsResponse{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[4]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListBucketsResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListBucketsResponse) ProtoMessage() {}\n\nfunc (x *ListBucketsResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[4]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListBucketsResponse.ProtoReflect.Descriptor instead.\nfunc (*ListBucketsResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{4}\n}\n\nfunc (x *ListBucketsResponse) GetBuckets() []*Bucket {\n\tif x != nil {\n\t\treturn x.Buckets\n\t}\n\treturn nil\n}\n\nfunc (x *ListBucketsResponse) GetNextPageToken() string {\n\tif x != nil {\n\t\treturn x.NextPageToken\n\t}\n\treturn \"\"\n}\n\n// Request message for LockBucketRetentionPolicyRequest.\ntype LockBucketRetentionPolicyRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Name of a bucket.\n\tBucket string `protobuf:\"bytes,1,opt,name=bucket,proto3\" json:\"bucket,omitempty\"`\n\t// Required. Makes the operation conditional on whether bucket's current\n\t// metageneration matches the given value. Must be positive.\n\tIfMetagenerationMatch int64 `protobuf:\"varint,2,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3\" json:\"if_metageneration_match,omitempty\"`\n}\n\nfunc (x *LockBucketRetentionPolicyRequest) Reset() {\n\t*x = LockBucketRetentionPolicyRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[5]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *LockBucketRetentionPolicyRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*LockBucketRetentionPolicyRequest) ProtoMessage() {}\n\nfunc (x *LockBucketRetentionPolicyRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[5]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use LockBucketRetentionPolicyRequest.ProtoReflect.Descriptor instead.\nfunc (*LockBucketRetentionPolicyRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{5}\n}\n\nfunc (x *LockBucketRetentionPolicyRequest) GetBucket() string {\n\tif x != nil {\n\t\treturn x.Bucket\n\t}\n\treturn \"\"\n}\n\nfunc (x *LockBucketRetentionPolicyRequest) GetIfMetagenerationMatch() int64 {\n\tif x != nil {\n\t\treturn x.IfMetagenerationMatch\n\t}\n\treturn 0\n}\n\n// Request for UpdateBucket method.\ntype UpdateBucketRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The bucket to update.\n\t// The bucket's `name` field will be used to identify the bucket.\n\tBucket *Bucket `protobuf:\"bytes,1,opt,name=bucket,proto3\" json:\"bucket,omitempty\"`\n\t// If set, will only modify the bucket if its metageneration matches this\n\t// value.\n\tIfMetagenerationMatch *int64 `protobuf:\"varint,2,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof\" json:\"if_metageneration_match,omitempty\"`\n\t// If set, will only modify the bucket if its metageneration does not match\n\t// this value.\n\tIfMetagenerationNotMatch *int64 `protobuf:\"varint,3,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof\" json:\"if_metageneration_not_match,omitempty\"`\n\t// Apply a predefined set of access controls to this bucket.\n\t// Valid values are \"authenticatedRead\", \"private\", \"projectPrivate\",\n\t// \"publicRead\", or \"publicReadWrite\".\n\tPredefinedAcl string `protobuf:\"bytes,8,opt,name=predefined_acl,json=predefinedAcl,proto3\" json:\"predefined_acl,omitempty\"`\n\t// Apply a predefined set of default object access controls to this bucket.\n\t// Valid values are \"authenticatedRead\", \"bucketOwnerFullControl\",\n\t// \"bucketOwnerRead\", \"private\", \"projectPrivate\", or \"publicRead\".\n\tPredefinedDefaultObjectAcl string `protobuf:\"bytes,9,opt,name=predefined_default_object_acl,json=predefinedDefaultObjectAcl,proto3\" json:\"predefined_default_object_acl,omitempty\"`\n\t// Required. List of fields to be updated.\n\t//\n\t// To specify ALL fields, equivalent to the JSON API's \"update\" function,\n\t// specify a single field with the value `*`. Note: not recommended. If a new\n\t// field is introduced at a later time, an older client updating with the `*`\n\t// may accidentally reset the new field's value.\n\t//\n\t// Not specifying any fields is an error.\n\tUpdateMask *fieldmaskpb.FieldMask `protobuf:\"bytes,6,opt,name=update_mask,json=updateMask,proto3\" json:\"update_mask,omitempty\"`\n}\n\nfunc (x *UpdateBucketRequest) Reset() {\n\t*x = UpdateBucketRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[6]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UpdateBucketRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateBucketRequest) ProtoMessage() {}\n\nfunc (x *UpdateBucketRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[6]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateBucketRequest.ProtoReflect.Descriptor instead.\nfunc (*UpdateBucketRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{6}\n}\n\nfunc (x *UpdateBucketRequest) GetBucket() *Bucket {\n\tif x != nil {\n\t\treturn x.Bucket\n\t}\n\treturn nil\n}\n\nfunc (x *UpdateBucketRequest) GetIfMetagenerationMatch() int64 {\n\tif x != nil && x.IfMetagenerationMatch != nil {\n\t\treturn *x.IfMetagenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateBucketRequest) GetIfMetagenerationNotMatch() int64 {\n\tif x != nil && x.IfMetagenerationNotMatch != nil {\n\t\treturn *x.IfMetagenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateBucketRequest) GetPredefinedAcl() string {\n\tif x != nil {\n\t\treturn x.PredefinedAcl\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateBucketRequest) GetPredefinedDefaultObjectAcl() string {\n\tif x != nil {\n\t\treturn x.PredefinedDefaultObjectAcl\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateBucketRequest) GetUpdateMask() *fieldmaskpb.FieldMask {\n\tif x != nil {\n\t\treturn x.UpdateMask\n\t}\n\treturn nil\n}\n\n// Request message for ComposeObject.\ntype ComposeObjectRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Properties of the resulting object.\n\tDestination *Object `protobuf:\"bytes,1,opt,name=destination,proto3\" json:\"destination,omitempty\"`\n\t// The list of source objects that will be concatenated into a single object.\n\tSourceObjects []*ComposeObjectRequest_SourceObject `protobuf:\"bytes,2,rep,name=source_objects,json=sourceObjects,proto3\" json:\"source_objects,omitempty\"`\n\t// Apply a predefined set of access controls to the destination object.\n\t// Valid values are \"authenticatedRead\", \"bucketOwnerFullControl\",\n\t// \"bucketOwnerRead\", \"private\", \"projectPrivate\", or \"publicRead\".\n\tDestinationPredefinedAcl string `protobuf:\"bytes,9,opt,name=destination_predefined_acl,json=destinationPredefinedAcl,proto3\" json:\"destination_predefined_acl,omitempty\"`\n\t// Makes the operation conditional on whether the object's current generation\n\t// matches the given value. Setting to 0 makes the operation succeed only if\n\t// there are no live versions of the object.\n\tIfGenerationMatch *int64 `protobuf:\"varint,4,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof\" json:\"if_generation_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's current\n\t// metageneration matches the given value.\n\tIfMetagenerationMatch *int64 `protobuf:\"varint,5,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof\" json:\"if_metageneration_match,omitempty\"`\n\t// Resource name of the Cloud KMS key, of the form\n\t// `projects/my-project/locations/my-location/keyRings/my-kr/cryptoKeys/my-key`,\n\t// that will be used to encrypt the object. Overrides the object\n\t// metadata's `kms_key_name` value, if any.\n\tKmsKey string `protobuf:\"bytes,6,opt,name=kms_key,json=kmsKey,proto3\" json:\"kms_key,omitempty\"`\n\t// A set of parameters common to Storage API requests concerning an object.\n\tCommonObjectRequestParams *CommonObjectRequestParams `protobuf:\"bytes,7,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3\" json:\"common_object_request_params,omitempty\"`\n\t// The checksums of the complete object. This will be validated against the\n\t// combined checksums of the component objects.\n\tObjectChecksums *ObjectChecksums `protobuf:\"bytes,10,opt,name=object_checksums,json=objectChecksums,proto3\" json:\"object_checksums,omitempty\"`\n}\n\nfunc (x *ComposeObjectRequest) Reset() {\n\t*x = ComposeObjectRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[7]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ComposeObjectRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ComposeObjectRequest) ProtoMessage() {}\n\nfunc (x *ComposeObjectRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[7]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ComposeObjectRequest.ProtoReflect.Descriptor instead.\nfunc (*ComposeObjectRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{7}\n}\n\nfunc (x *ComposeObjectRequest) GetDestination() *Object {\n\tif x != nil {\n\t\treturn x.Destination\n\t}\n\treturn nil\n}\n\nfunc (x *ComposeObjectRequest) GetSourceObjects() []*ComposeObjectRequest_SourceObject {\n\tif x != nil {\n\t\treturn x.SourceObjects\n\t}\n\treturn nil\n}\n\nfunc (x *ComposeObjectRequest) GetDestinationPredefinedAcl() string {\n\tif x != nil {\n\t\treturn x.DestinationPredefinedAcl\n\t}\n\treturn \"\"\n}\n\nfunc (x *ComposeObjectRequest) GetIfGenerationMatch() int64 {\n\tif x != nil && x.IfGenerationMatch != nil {\n\t\treturn *x.IfGenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *ComposeObjectRequest) GetIfMetagenerationMatch() int64 {\n\tif x != nil && x.IfMetagenerationMatch != nil {\n\t\treturn *x.IfMetagenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *ComposeObjectRequest) GetKmsKey() string {\n\tif x != nil {\n\t\treturn x.KmsKey\n\t}\n\treturn \"\"\n}\n\nfunc (x *ComposeObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams {\n\tif x != nil {\n\t\treturn x.CommonObjectRequestParams\n\t}\n\treturn nil\n}\n\nfunc (x *ComposeObjectRequest) GetObjectChecksums() *ObjectChecksums {\n\tif x != nil {\n\t\treturn x.ObjectChecksums\n\t}\n\treturn nil\n}\n\n// Message for deleting an object.\n// `bucket` and `object` **must** be set.\ntype DeleteObjectRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Name of the bucket in which the object resides.\n\tBucket string `protobuf:\"bytes,1,opt,name=bucket,proto3\" json:\"bucket,omitempty\"`\n\t// Required. The name of the finalized object to delete.\n\t// Note: If you want to delete an unfinalized resumable upload please use\n\t// `CancelResumableWrite`.\n\tObject string `protobuf:\"bytes,2,opt,name=object,proto3\" json:\"object,omitempty\"`\n\t// If present, permanently deletes a specific revision of this object (as\n\t// opposed to the latest version, the default).\n\tGeneration int64 `protobuf:\"varint,4,opt,name=generation,proto3\" json:\"generation,omitempty\"`\n\t// Makes the operation conditional on whether the object's current generation\n\t// matches the given value. Setting to 0 makes the operation succeed only if\n\t// there are no live versions of the object.\n\tIfGenerationMatch *int64 `protobuf:\"varint,5,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof\" json:\"if_generation_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's live generation\n\t// does not match the given value. If no live object exists, the precondition\n\t// fails. Setting to 0 makes the operation succeed only if there is a live\n\t// version of the object.\n\tIfGenerationNotMatch *int64 `protobuf:\"varint,6,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof\" json:\"if_generation_not_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's current\n\t// metageneration matches the given value.\n\tIfMetagenerationMatch *int64 `protobuf:\"varint,7,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof\" json:\"if_metageneration_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's current\n\t// metageneration does not match the given value.\n\tIfMetagenerationNotMatch *int64 `protobuf:\"varint,8,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof\" json:\"if_metageneration_not_match,omitempty\"`\n\t// A set of parameters common to Storage API requests concerning an object.\n\tCommonObjectRequestParams *CommonObjectRequestParams `protobuf:\"bytes,10,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3\" json:\"common_object_request_params,omitempty\"`\n}\n\nfunc (x *DeleteObjectRequest) Reset() {\n\t*x = DeleteObjectRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[8]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *DeleteObjectRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*DeleteObjectRequest) ProtoMessage() {}\n\nfunc (x *DeleteObjectRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[8]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use DeleteObjectRequest.ProtoReflect.Descriptor instead.\nfunc (*DeleteObjectRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{8}\n}\n\nfunc (x *DeleteObjectRequest) GetBucket() string {\n\tif x != nil {\n\t\treturn x.Bucket\n\t}\n\treturn \"\"\n}\n\nfunc (x *DeleteObjectRequest) GetObject() string {\n\tif x != nil {\n\t\treturn x.Object\n\t}\n\treturn \"\"\n}\n\nfunc (x *DeleteObjectRequest) GetGeneration() int64 {\n\tif x != nil {\n\t\treturn x.Generation\n\t}\n\treturn 0\n}\n\nfunc (x *DeleteObjectRequest) GetIfGenerationMatch() int64 {\n\tif x != nil && x.IfGenerationMatch != nil {\n\t\treturn *x.IfGenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *DeleteObjectRequest) GetIfGenerationNotMatch() int64 {\n\tif x != nil && x.IfGenerationNotMatch != nil {\n\t\treturn *x.IfGenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *DeleteObjectRequest) GetIfMetagenerationMatch() int64 {\n\tif x != nil && x.IfMetagenerationMatch != nil {\n\t\treturn *x.IfMetagenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *DeleteObjectRequest) GetIfMetagenerationNotMatch() int64 {\n\tif x != nil && x.IfMetagenerationNotMatch != nil {\n\t\treturn *x.IfMetagenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *DeleteObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams {\n\tif x != nil {\n\t\treturn x.CommonObjectRequestParams\n\t}\n\treturn nil\n}\n\n// Message for restoring an object.\n// `bucket`, `object`, and `generation` **must** be set.\ntype RestoreObjectRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Name of the bucket in which the object resides.\n\tBucket string `protobuf:\"bytes,1,opt,name=bucket,proto3\" json:\"bucket,omitempty\"`\n\t// Required. The name of the object to restore.\n\tObject string `protobuf:\"bytes,2,opt,name=object,proto3\" json:\"object,omitempty\"`\n\t// Required. The specific revision of the object to restore.\n\tGeneration int64 `protobuf:\"varint,3,opt,name=generation,proto3\" json:\"generation,omitempty\"`\n\t// Optional. Restore token used to differentiate soft-deleted objects with the\n\t// same name and generation. Only applicable for hierarchical namespace\n\t// buckets. This parameter is optional, and is only required in the rare case\n\t// when there are multiple soft-deleted objects with the same name and\n\t// generation.\n\tRestoreToken string `protobuf:\"bytes,11,opt,name=restore_token,json=restoreToken,proto3\" json:\"restore_token,omitempty\"`\n\t// Makes the operation conditional on whether the object's current generation\n\t// matches the given value. Setting to 0 makes the operation succeed only if\n\t// there are no live versions of the object.\n\tIfGenerationMatch *int64 `protobuf:\"varint,4,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof\" json:\"if_generation_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's live generation\n\t// does not match the given value. If no live object exists, the precondition\n\t// fails. Setting to 0 makes the operation succeed only if there is a live\n\t// version of the object.\n\tIfGenerationNotMatch *int64 `protobuf:\"varint,5,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof\" json:\"if_generation_not_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's current\n\t// metageneration matches the given value.\n\tIfMetagenerationMatch *int64 `protobuf:\"varint,6,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof\" json:\"if_metageneration_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's current\n\t// metageneration does not match the given value.\n\tIfMetagenerationNotMatch *int64 `protobuf:\"varint,7,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof\" json:\"if_metageneration_not_match,omitempty\"`\n\t// If false or unset, the bucket's default object ACL will be used.\n\t// If true, copy the source object's access controls.\n\t// Return an error if bucket has UBLA enabled.\n\tCopySourceAcl *bool `protobuf:\"varint,9,opt,name=copy_source_acl,json=copySourceAcl,proto3,oneof\" json:\"copy_source_acl,omitempty\"`\n\t// A set of parameters common to Storage API requests concerning an object.\n\tCommonObjectRequestParams *CommonObjectRequestParams `protobuf:\"bytes,8,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3\" json:\"common_object_request_params,omitempty\"`\n}\n\nfunc (x *RestoreObjectRequest) Reset() {\n\t*x = RestoreObjectRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[9]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *RestoreObjectRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RestoreObjectRequest) ProtoMessage() {}\n\nfunc (x *RestoreObjectRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[9]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RestoreObjectRequest.ProtoReflect.Descriptor instead.\nfunc (*RestoreObjectRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{9}\n}\n\nfunc (x *RestoreObjectRequest) GetBucket() string {\n\tif x != nil {\n\t\treturn x.Bucket\n\t}\n\treturn \"\"\n}\n\nfunc (x *RestoreObjectRequest) GetObject() string {\n\tif x != nil {\n\t\treturn x.Object\n\t}\n\treturn \"\"\n}\n\nfunc (x *RestoreObjectRequest) GetGeneration() int64 {\n\tif x != nil {\n\t\treturn x.Generation\n\t}\n\treturn 0\n}\n\nfunc (x *RestoreObjectRequest) GetRestoreToken() string {\n\tif x != nil {\n\t\treturn x.RestoreToken\n\t}\n\treturn \"\"\n}\n\nfunc (x *RestoreObjectRequest) GetIfGenerationMatch() int64 {\n\tif x != nil && x.IfGenerationMatch != nil {\n\t\treturn *x.IfGenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *RestoreObjectRequest) GetIfGenerationNotMatch() int64 {\n\tif x != nil && x.IfGenerationNotMatch != nil {\n\t\treturn *x.IfGenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *RestoreObjectRequest) GetIfMetagenerationMatch() int64 {\n\tif x != nil && x.IfMetagenerationMatch != nil {\n\t\treturn *x.IfMetagenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *RestoreObjectRequest) GetIfMetagenerationNotMatch() int64 {\n\tif x != nil && x.IfMetagenerationNotMatch != nil {\n\t\treturn *x.IfMetagenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *RestoreObjectRequest) GetCopySourceAcl() bool {\n\tif x != nil && x.CopySourceAcl != nil {\n\t\treturn *x.CopySourceAcl\n\t}\n\treturn false\n}\n\nfunc (x *RestoreObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams {\n\tif x != nil {\n\t\treturn x.CommonObjectRequestParams\n\t}\n\treturn nil\n}\n\n// Message for canceling an in-progress resumable upload.\n// `upload_id` **must** be set.\ntype CancelResumableWriteRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The upload_id of the resumable upload to cancel. This should be\n\t// copied from the `upload_id` field of `StartResumableWriteResponse`.\n\tUploadId string `protobuf:\"bytes,1,opt,name=upload_id,json=uploadId,proto3\" json:\"upload_id,omitempty\"`\n}\n\nfunc (x *CancelResumableWriteRequest) Reset() {\n\t*x = CancelResumableWriteRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[10]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *CancelResumableWriteRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CancelResumableWriteRequest) ProtoMessage() {}\n\nfunc (x *CancelResumableWriteRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[10]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CancelResumableWriteRequest.ProtoReflect.Descriptor instead.\nfunc (*CancelResumableWriteRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{10}\n}\n\nfunc (x *CancelResumableWriteRequest) GetUploadId() string {\n\tif x != nil {\n\t\treturn x.UploadId\n\t}\n\treturn \"\"\n}\n\n// Empty response message for canceling an in-progress resumable upload, will be\n// extended as needed.\ntype CancelResumableWriteResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *CancelResumableWriteResponse) Reset() {\n\t*x = CancelResumableWriteResponse{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[11]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *CancelResumableWriteResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CancelResumableWriteResponse) ProtoMessage() {}\n\nfunc (x *CancelResumableWriteResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[11]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CancelResumableWriteResponse.ProtoReflect.Descriptor instead.\nfunc (*CancelResumableWriteResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{11}\n}\n\n// Request message for ReadObject.\ntype ReadObjectRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The name of the bucket containing the object to read.\n\tBucket string `protobuf:\"bytes,1,opt,name=bucket,proto3\" json:\"bucket,omitempty\"`\n\t// Required. The name of the object to read.\n\tObject string `protobuf:\"bytes,2,opt,name=object,proto3\" json:\"object,omitempty\"`\n\t// If present, selects a specific revision of this object (as opposed\n\t// to the latest version, the default).\n\tGeneration int64 `protobuf:\"varint,3,opt,name=generation,proto3\" json:\"generation,omitempty\"`\n\t// The offset for the first byte to return in the read, relative to the start\n\t// of the object.\n\t//\n\t// A negative `read_offset` value will be interpreted as the number of bytes\n\t// back from the end of the object to be returned. For example, if an object's\n\t// length is 15 bytes, a ReadObjectRequest with `read_offset` = -5 and\n\t// `read_limit` = 3 would return bytes 10 through 12 of the object. Requesting\n\t// a negative offset with magnitude larger than the size of the object will\n\t// return the entire object.\n\tReadOffset int64 `protobuf:\"varint,4,opt,name=read_offset,json=readOffset,proto3\" json:\"read_offset,omitempty\"`\n\t// The maximum number of `data` bytes the server is allowed to return in the\n\t// sum of all `Object` messages. A `read_limit` of zero indicates that there\n\t// is no limit, and a negative `read_limit` will cause an error.\n\t//\n\t// If the stream returns fewer bytes than allowed by the `read_limit` and no\n\t// error occurred, the stream includes all data from the `read_offset` to the\n\t// end of the resource.\n\tReadLimit int64 `protobuf:\"varint,5,opt,name=read_limit,json=readLimit,proto3\" json:\"read_limit,omitempty\"`\n\t// Makes the operation conditional on whether the object's current generation\n\t// matches the given value. Setting to 0 makes the operation succeed only if\n\t// there are no live versions of the object.\n\tIfGenerationMatch *int64 `protobuf:\"varint,6,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof\" json:\"if_generation_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's live generation\n\t// does not match the given value. If no live object exists, the precondition\n\t// fails. Setting to 0 makes the operation succeed only if there is a live\n\t// version of the object.\n\tIfGenerationNotMatch *int64 `protobuf:\"varint,7,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof\" json:\"if_generation_not_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's current\n\t// metageneration matches the given value.\n\tIfMetagenerationMatch *int64 `protobuf:\"varint,8,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof\" json:\"if_metageneration_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's current\n\t// metageneration does not match the given value.\n\tIfMetagenerationNotMatch *int64 `protobuf:\"varint,9,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof\" json:\"if_metageneration_not_match,omitempty\"`\n\t// A set of parameters common to Storage API requests concerning an object.\n\tCommonObjectRequestParams *CommonObjectRequestParams `protobuf:\"bytes,10,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3\" json:\"common_object_request_params,omitempty\"`\n\t// Mask specifying which fields to read.\n\t// The checksummed_data field and its children will always be present.\n\t// If no mask is specified, will default to all fields except metadata.owner\n\t// and metadata.acl.\n\t// * may be used to mean \"all fields\".\n\tReadMask *fieldmaskpb.FieldMask `protobuf:\"bytes,12,opt,name=read_mask,json=readMask,proto3,oneof\" json:\"read_mask,omitempty\"`\n}\n\nfunc (x *ReadObjectRequest) Reset() {\n\t*x = ReadObjectRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[12]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ReadObjectRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ReadObjectRequest) ProtoMessage() {}\n\nfunc (x *ReadObjectRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[12]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ReadObjectRequest.ProtoReflect.Descriptor instead.\nfunc (*ReadObjectRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{12}\n}\n\nfunc (x *ReadObjectRequest) GetBucket() string {\n\tif x != nil {\n\t\treturn x.Bucket\n\t}\n\treturn \"\"\n}\n\nfunc (x *ReadObjectRequest) GetObject() string {\n\tif x != nil {\n\t\treturn x.Object\n\t}\n\treturn \"\"\n}\n\nfunc (x *ReadObjectRequest) GetGeneration() int64 {\n\tif x != nil {\n\t\treturn x.Generation\n\t}\n\treturn 0\n}\n\nfunc (x *ReadObjectRequest) GetReadOffset() int64 {\n\tif x != nil {\n\t\treturn x.ReadOffset\n\t}\n\treturn 0\n}\n\nfunc (x *ReadObjectRequest) GetReadLimit() int64 {\n\tif x != nil {\n\t\treturn x.ReadLimit\n\t}\n\treturn 0\n}\n\nfunc (x *ReadObjectRequest) GetIfGenerationMatch() int64 {\n\tif x != nil && x.IfGenerationMatch != nil {\n\t\treturn *x.IfGenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *ReadObjectRequest) GetIfGenerationNotMatch() int64 {\n\tif x != nil && x.IfGenerationNotMatch != nil {\n\t\treturn *x.IfGenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *ReadObjectRequest) GetIfMetagenerationMatch() int64 {\n\tif x != nil && x.IfMetagenerationMatch != nil {\n\t\treturn *x.IfMetagenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *ReadObjectRequest) GetIfMetagenerationNotMatch() int64 {\n\tif x != nil && x.IfMetagenerationNotMatch != nil {\n\t\treturn *x.IfMetagenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *ReadObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams {\n\tif x != nil {\n\t\treturn x.CommonObjectRequestParams\n\t}\n\treturn nil\n}\n\nfunc (x *ReadObjectRequest) GetReadMask() *fieldmaskpb.FieldMask {\n\tif x != nil {\n\t\treturn x.ReadMask\n\t}\n\treturn nil\n}\n\n// Request message for GetObject.\ntype GetObjectRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Name of the bucket in which the object resides.\n\tBucket string `protobuf:\"bytes,1,opt,name=bucket,proto3\" json:\"bucket,omitempty\"`\n\t// Required. Name of the object.\n\tObject string `protobuf:\"bytes,2,opt,name=object,proto3\" json:\"object,omitempty\"`\n\t// If present, selects a specific revision of this object (as opposed to the\n\t// latest version, the default).\n\tGeneration int64 `protobuf:\"varint,3,opt,name=generation,proto3\" json:\"generation,omitempty\"`\n\t// If true, return the soft-deleted version of this object.\n\tSoftDeleted *bool `protobuf:\"varint,11,opt,name=soft_deleted,json=softDeleted,proto3,oneof\" json:\"soft_deleted,omitempty\"`\n\t// Makes the operation conditional on whether the object's current generation\n\t// matches the given value. Setting to 0 makes the operation succeed only if\n\t// there are no live versions of the object.\n\tIfGenerationMatch *int64 `protobuf:\"varint,4,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof\" json:\"if_generation_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's live generation\n\t// does not match the given value. If no live object exists, the precondition\n\t// fails. Setting to 0 makes the operation succeed only if there is a live\n\t// version of the object.\n\tIfGenerationNotMatch *int64 `protobuf:\"varint,5,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof\" json:\"if_generation_not_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's current\n\t// metageneration matches the given value.\n\tIfMetagenerationMatch *int64 `protobuf:\"varint,6,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof\" json:\"if_metageneration_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's current\n\t// metageneration does not match the given value.\n\tIfMetagenerationNotMatch *int64 `protobuf:\"varint,7,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof\" json:\"if_metageneration_not_match,omitempty\"`\n\t// A set of parameters common to Storage API requests concerning an object.\n\tCommonObjectRequestParams *CommonObjectRequestParams `protobuf:\"bytes,8,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3\" json:\"common_object_request_params,omitempty\"`\n\t// Mask specifying which fields to read.\n\t// If no mask is specified, will default to all fields except metadata.acl and\n\t// metadata.owner.\n\t// * may be used to mean \"all fields\".\n\tReadMask *fieldmaskpb.FieldMask `protobuf:\"bytes,10,opt,name=read_mask,json=readMask,proto3,oneof\" json:\"read_mask,omitempty\"`\n\t// Optional. Restore token used to differentiate soft-deleted objects with the\n\t// same name and generation. Only applicable for hierarchical namespace\n\t// buckets and if soft_deleted is set to true. This parameter is optional, and\n\t// is only required in the rare case when there are multiple soft-deleted\n\t// objects with the same name and generation.\n\tRestoreToken string `protobuf:\"bytes,12,opt,name=restore_token,json=restoreToken,proto3\" json:\"restore_token,omitempty\"`\n}\n\nfunc (x *GetObjectRequest) Reset() {\n\t*x = GetObjectRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[13]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *GetObjectRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*GetObjectRequest) ProtoMessage() {}\n\nfunc (x *GetObjectRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[13]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use GetObjectRequest.ProtoReflect.Descriptor instead.\nfunc (*GetObjectRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{13}\n}\n\nfunc (x *GetObjectRequest) GetBucket() string {\n\tif x != nil {\n\t\treturn x.Bucket\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetObjectRequest) GetObject() string {\n\tif x != nil {\n\t\treturn x.Object\n\t}\n\treturn \"\"\n}\n\nfunc (x *GetObjectRequest) GetGeneration() int64 {\n\tif x != nil {\n\t\treturn x.Generation\n\t}\n\treturn 0\n}\n\nfunc (x *GetObjectRequest) GetSoftDeleted() bool {\n\tif x != nil && x.SoftDeleted != nil {\n\t\treturn *x.SoftDeleted\n\t}\n\treturn false\n}\n\nfunc (x *GetObjectRequest) GetIfGenerationMatch() int64 {\n\tif x != nil && x.IfGenerationMatch != nil {\n\t\treturn *x.IfGenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *GetObjectRequest) GetIfGenerationNotMatch() int64 {\n\tif x != nil && x.IfGenerationNotMatch != nil {\n\t\treturn *x.IfGenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *GetObjectRequest) GetIfMetagenerationMatch() int64 {\n\tif x != nil && x.IfMetagenerationMatch != nil {\n\t\treturn *x.IfMetagenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *GetObjectRequest) GetIfMetagenerationNotMatch() int64 {\n\tif x != nil && x.IfMetagenerationNotMatch != nil {\n\t\treturn *x.IfMetagenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *GetObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams {\n\tif x != nil {\n\t\treturn x.CommonObjectRequestParams\n\t}\n\treturn nil\n}\n\nfunc (x *GetObjectRequest) GetReadMask() *fieldmaskpb.FieldMask {\n\tif x != nil {\n\t\treturn x.ReadMask\n\t}\n\treturn nil\n}\n\nfunc (x *GetObjectRequest) GetRestoreToken() string {\n\tif x != nil {\n\t\treturn x.RestoreToken\n\t}\n\treturn \"\"\n}\n\n// Response message for ReadObject.\ntype ReadObjectResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// A portion of the data for the object. The service **may** leave `data`\n\t// empty for any given `ReadResponse`. This enables the service to inform the\n\t// client that the request is still live while it is running an operation to\n\t// generate more data.\n\tChecksummedData *ChecksummedData `protobuf:\"bytes,1,opt,name=checksummed_data,json=checksummedData,proto3\" json:\"checksummed_data,omitempty\"`\n\t// The checksums of the complete object. If the object is downloaded in full,\n\t// the client should compute one of these checksums over the downloaded object\n\t// and compare it against the value provided here.\n\tObjectChecksums *ObjectChecksums `protobuf:\"bytes,2,opt,name=object_checksums,json=objectChecksums,proto3\" json:\"object_checksums,omitempty\"`\n\t// If read_offset and or read_limit was specified on the\n\t// ReadObjectRequest, ContentRange will be populated on the first\n\t// ReadObjectResponse message of the read stream.\n\tContentRange *ContentRange `protobuf:\"bytes,3,opt,name=content_range,json=contentRange,proto3\" json:\"content_range,omitempty\"`\n\t// Metadata of the object whose media is being returned.\n\t// Only populated in the first response in the stream.\n\tMetadata *Object `protobuf:\"bytes,4,opt,name=metadata,proto3\" json:\"metadata,omitempty\"`\n}\n\nfunc (x *ReadObjectResponse) Reset() {\n\t*x = ReadObjectResponse{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[14]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ReadObjectResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ReadObjectResponse) ProtoMessage() {}\n\nfunc (x *ReadObjectResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[14]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ReadObjectResponse.ProtoReflect.Descriptor instead.\nfunc (*ReadObjectResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{14}\n}\n\nfunc (x *ReadObjectResponse) GetChecksummedData() *ChecksummedData {\n\tif x != nil {\n\t\treturn x.ChecksummedData\n\t}\n\treturn nil\n}\n\nfunc (x *ReadObjectResponse) GetObjectChecksums() *ObjectChecksums {\n\tif x != nil {\n\t\treturn x.ObjectChecksums\n\t}\n\treturn nil\n}\n\nfunc (x *ReadObjectResponse) GetContentRange() *ContentRange {\n\tif x != nil {\n\t\treturn x.ContentRange\n\t}\n\treturn nil\n}\n\nfunc (x *ReadObjectResponse) GetMetadata() *Object {\n\tif x != nil {\n\t\treturn x.Metadata\n\t}\n\treturn nil\n}\n\n// Describes the object to read in a BidiReadObject request.\ntype BidiReadObjectSpec struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The name of the bucket containing the object to read.\n\tBucket string `protobuf:\"bytes,1,opt,name=bucket,proto3\" json:\"bucket,omitempty\"`\n\t// Required. The name of the object to read.\n\tObject string `protobuf:\"bytes,2,opt,name=object,proto3\" json:\"object,omitempty\"`\n\t// If present, selects a specific revision of this object (as opposed\n\t// to the latest version, the default).\n\tGeneration int64 `protobuf:\"varint,3,opt,name=generation,proto3\" json:\"generation,omitempty\"`\n\t// Makes the operation conditional on whether the object's current generation\n\t// matches the given value. Setting to 0 makes the operation succeed only if\n\t// there are no live versions of the object.\n\tIfGenerationMatch *int64 `protobuf:\"varint,4,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof\" json:\"if_generation_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's live generation\n\t// does not match the given value. If no live object exists, the precondition\n\t// fails. Setting to 0 makes the operation succeed only if there is a live\n\t// version of the object.\n\tIfGenerationNotMatch *int64 `protobuf:\"varint,5,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof\" json:\"if_generation_not_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's current\n\t// metageneration matches the given value.\n\tIfMetagenerationMatch *int64 `protobuf:\"varint,6,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof\" json:\"if_metageneration_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's current\n\t// metageneration does not match the given value.\n\tIfMetagenerationNotMatch *int64 `protobuf:\"varint,7,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof\" json:\"if_metageneration_not_match,omitempty\"`\n\t// A set of parameters common to Storage API requests concerning an object.\n\tCommonObjectRequestParams *CommonObjectRequestParams `protobuf:\"bytes,8,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3\" json:\"common_object_request_params,omitempty\"`\n\t// Mask specifying which fields to read.\n\t// The checksummed_data field and its children will always be present.\n\t// If no mask is specified, will default to all fields except metadata.owner\n\t// and metadata.acl.\n\t// * may be used to mean \"all fields\".\n\t// As per https://google.aip.dev/161, this field is deprecated.\n\t// As an alternative, grpc metadata can be used:\n\t// https://cloud.google.com/apis/docs/system-parameters#definitions\n\t//\n\t// Deprecated: Marked as deprecated in google/storage/v2/storage.proto.\n\tReadMask *fieldmaskpb.FieldMask `protobuf:\"bytes,12,opt,name=read_mask,json=readMask,proto3,oneof\" json:\"read_mask,omitempty\"`\n\t// The client can optionally set this field. The read handle is an optimized\n\t// way of creating new streams. Read handles are generated and periodically\n\t// refreshed from prior reads.\n\tReadHandle *BidiReadHandle `protobuf:\"bytes,13,opt,name=read_handle,json=readHandle,proto3,oneof\" json:\"read_handle,omitempty\"`\n\t// The routing token that influences request routing for the stream. Must be\n\t// provided if a BidiReadObjectRedirectedError is returned.\n\tRoutingToken *string `protobuf:\"bytes,14,opt,name=routing_token,json=routingToken,proto3,oneof\" json:\"routing_token,omitempty\"`\n}\n\nfunc (x *BidiReadObjectSpec) Reset() {\n\t*x = BidiReadObjectSpec{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[15]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *BidiReadObjectSpec) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BidiReadObjectSpec) ProtoMessage() {}\n\nfunc (x *BidiReadObjectSpec) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[15]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BidiReadObjectSpec.ProtoReflect.Descriptor instead.\nfunc (*BidiReadObjectSpec) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{15}\n}\n\nfunc (x *BidiReadObjectSpec) GetBucket() string {\n\tif x != nil {\n\t\treturn x.Bucket\n\t}\n\treturn \"\"\n}\n\nfunc (x *BidiReadObjectSpec) GetObject() string {\n\tif x != nil {\n\t\treturn x.Object\n\t}\n\treturn \"\"\n}\n\nfunc (x *BidiReadObjectSpec) GetGeneration() int64 {\n\tif x != nil {\n\t\treturn x.Generation\n\t}\n\treturn 0\n}\n\nfunc (x *BidiReadObjectSpec) GetIfGenerationMatch() int64 {\n\tif x != nil && x.IfGenerationMatch != nil {\n\t\treturn *x.IfGenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *BidiReadObjectSpec) GetIfGenerationNotMatch() int64 {\n\tif x != nil && x.IfGenerationNotMatch != nil {\n\t\treturn *x.IfGenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *BidiReadObjectSpec) GetIfMetagenerationMatch() int64 {\n\tif x != nil && x.IfMetagenerationMatch != nil {\n\t\treturn *x.IfMetagenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *BidiReadObjectSpec) GetIfMetagenerationNotMatch() int64 {\n\tif x != nil && x.IfMetagenerationNotMatch != nil {\n\t\treturn *x.IfMetagenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *BidiReadObjectSpec) GetCommonObjectRequestParams() *CommonObjectRequestParams {\n\tif x != nil {\n\t\treturn x.CommonObjectRequestParams\n\t}\n\treturn nil\n}\n\n// Deprecated: Marked as deprecated in google/storage/v2/storage.proto.\nfunc (x *BidiReadObjectSpec) GetReadMask() *fieldmaskpb.FieldMask {\n\tif x != nil {\n\t\treturn x.ReadMask\n\t}\n\treturn nil\n}\n\nfunc (x *BidiReadObjectSpec) GetReadHandle() *BidiReadHandle {\n\tif x != nil {\n\t\treturn x.ReadHandle\n\t}\n\treturn nil\n}\n\nfunc (x *BidiReadObjectSpec) GetRoutingToken() string {\n\tif x != nil && x.RoutingToken != nil {\n\t\treturn *x.RoutingToken\n\t}\n\treturn \"\"\n}\n\n// Request message for BidiReadObject.\ntype BidiReadObjectRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The first message of each stream should set this field. If this is not\n\t// the first message, an error will be returned. Describes the object to read.\n\tReadObjectSpec *BidiReadObjectSpec `protobuf:\"bytes,1,opt,name=read_object_spec,json=readObjectSpec,proto3\" json:\"read_object_spec,omitempty\"`\n\t// Provides a list of 0 or more (up to 100) ranges to read. If a single range\n\t// is large enough to require multiple responses, they are guaranteed to be\n\t// delivered in increasing offset order. There are no ordering guarantees\n\t// across ranges. When no ranges are provided, the response message will not\n\t// include ObjectRangeData. For full object downloads, the offset and size can\n\t// be set to 0.\n\tReadRanges []*ReadRange `protobuf:\"bytes,8,rep,name=read_ranges,json=readRanges,proto3\" json:\"read_ranges,omitempty\"`\n}\n\nfunc (x *BidiReadObjectRequest) Reset() {\n\t*x = BidiReadObjectRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[16]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *BidiReadObjectRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BidiReadObjectRequest) ProtoMessage() {}\n\nfunc (x *BidiReadObjectRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[16]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BidiReadObjectRequest.ProtoReflect.Descriptor instead.\nfunc (*BidiReadObjectRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{16}\n}\n\nfunc (x *BidiReadObjectRequest) GetReadObjectSpec() *BidiReadObjectSpec {\n\tif x != nil {\n\t\treturn x.ReadObjectSpec\n\t}\n\treturn nil\n}\n\nfunc (x *BidiReadObjectRequest) GetReadRanges() []*ReadRange {\n\tif x != nil {\n\t\treturn x.ReadRanges\n\t}\n\treturn nil\n}\n\n// Response message for BidiReadObject.\ntype BidiReadObjectResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// A portion of the object's data. The service **may** leave data\n\t// empty for any given ReadResponse. This enables the service to inform the\n\t// client that the request is still live while it is running an operation to\n\t// generate more data.\n\t// The service **may** pipeline multiple responses belonging to different read\n\t// requests. Each ObjectRangeData entry will have a read_id\n\t// set to the same value as the corresponding source read request.\n\tObjectDataRanges []*ObjectRangeData `protobuf:\"bytes,6,rep,name=object_data_ranges,json=objectDataRanges,proto3\" json:\"object_data_ranges,omitempty\"`\n\t// Metadata of the object whose media is being returned.\n\t// Only populated in the first response in the stream and not populated when\n\t// the stream is opened with a read handle.\n\tMetadata *Object `protobuf:\"bytes,4,opt,name=metadata,proto3\" json:\"metadata,omitempty\"`\n\t// This field will be periodically refreshed, however it may not be set in\n\t// every response. It allows the client to more efficiently open subsequent\n\t// bidirectional streams to the same object.\n\tReadHandle *BidiReadHandle `protobuf:\"bytes,7,opt,name=read_handle,json=readHandle,proto3\" json:\"read_handle,omitempty\"`\n}\n\nfunc (x *BidiReadObjectResponse) Reset() {\n\t*x = BidiReadObjectResponse{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[17]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *BidiReadObjectResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BidiReadObjectResponse) ProtoMessage() {}\n\nfunc (x *BidiReadObjectResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[17]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BidiReadObjectResponse.ProtoReflect.Descriptor instead.\nfunc (*BidiReadObjectResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{17}\n}\n\nfunc (x *BidiReadObjectResponse) GetObjectDataRanges() []*ObjectRangeData {\n\tif x != nil {\n\t\treturn x.ObjectDataRanges\n\t}\n\treturn nil\n}\n\nfunc (x *BidiReadObjectResponse) GetMetadata() *Object {\n\tif x != nil {\n\t\treturn x.Metadata\n\t}\n\treturn nil\n}\n\nfunc (x *BidiReadObjectResponse) GetReadHandle() *BidiReadHandle {\n\tif x != nil {\n\t\treturn x.ReadHandle\n\t}\n\treturn nil\n}\n\n// Error proto containing details for a redirected read. This error is only\n// returned on initial open in case of a redirect.\ntype BidiReadObjectRedirectedError struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The read handle for the redirected read. The client can use this for the\n\t// subsequent open.\n\tReadHandle *BidiReadHandle `protobuf:\"bytes,1,opt,name=read_handle,json=readHandle,proto3\" json:\"read_handle,omitempty\"`\n\t// The routing token that should be used when reopening the read stream.\n\tRoutingToken *string `protobuf:\"bytes,2,opt,name=routing_token,json=routingToken,proto3,oneof\" json:\"routing_token,omitempty\"`\n}\n\nfunc (x *BidiReadObjectRedirectedError) Reset() {\n\t*x = BidiReadObjectRedirectedError{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[18]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *BidiReadObjectRedirectedError) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BidiReadObjectRedirectedError) ProtoMessage() {}\n\nfunc (x *BidiReadObjectRedirectedError) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[18]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BidiReadObjectRedirectedError.ProtoReflect.Descriptor instead.\nfunc (*BidiReadObjectRedirectedError) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{18}\n}\n\nfunc (x *BidiReadObjectRedirectedError) GetReadHandle() *BidiReadHandle {\n\tif x != nil {\n\t\treturn x.ReadHandle\n\t}\n\treturn nil\n}\n\nfunc (x *BidiReadObjectRedirectedError) GetRoutingToken() string {\n\tif x != nil && x.RoutingToken != nil {\n\t\treturn *x.RoutingToken\n\t}\n\treturn \"\"\n}\n\n// Error proto containing details for a redirected write. This error is only\n// returned on initial open in case of a redirect.\ntype BidiWriteObjectRedirectedError struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The routing token that should be used when reopening the write stream.\n\tRoutingToken *string `protobuf:\"bytes,1,opt,name=routing_token,json=routingToken,proto3,oneof\" json:\"routing_token,omitempty\"`\n\t// Opaque value describing a previous write.\n\tWriteHandle *BidiWriteHandle `protobuf:\"bytes,2,opt,name=write_handle,json=writeHandle,proto3,oneof\" json:\"write_handle,omitempty\"`\n\t// The generation of the object that triggered the redirect.\n\t// Note that if this error was returned as part of an appendable object\n\t// create, this object generation is now successfully created and\n\t// append_object_spec should be used when reconnecting.\n\tGeneration *int64 `protobuf:\"varint,3,opt,name=generation,proto3,oneof\" json:\"generation,omitempty\"`\n}\n\nfunc (x *BidiWriteObjectRedirectedError) Reset() {\n\t*x = BidiWriteObjectRedirectedError{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[19]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *BidiWriteObjectRedirectedError) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BidiWriteObjectRedirectedError) ProtoMessage() {}\n\nfunc (x *BidiWriteObjectRedirectedError) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[19]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BidiWriteObjectRedirectedError.ProtoReflect.Descriptor instead.\nfunc (*BidiWriteObjectRedirectedError) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{19}\n}\n\nfunc (x *BidiWriteObjectRedirectedError) GetRoutingToken() string {\n\tif x != nil && x.RoutingToken != nil {\n\t\treturn *x.RoutingToken\n\t}\n\treturn \"\"\n}\n\nfunc (x *BidiWriteObjectRedirectedError) GetWriteHandle() *BidiWriteHandle {\n\tif x != nil {\n\t\treturn x.WriteHandle\n\t}\n\treturn nil\n}\n\nfunc (x *BidiWriteObjectRedirectedError) GetGeneration() int64 {\n\tif x != nil && x.Generation != nil {\n\t\treturn *x.Generation\n\t}\n\treturn 0\n}\n\n// Error extension proto containing details for all outstanding reads on the\n// failed stream\ntype BidiReadObjectError struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The error code for each outstanding read_range\n\tReadRangeErrors []*ReadRangeError `protobuf:\"bytes,1,rep,name=read_range_errors,json=readRangeErrors,proto3\" json:\"read_range_errors,omitempty\"`\n}\n\nfunc (x *BidiReadObjectError) Reset() {\n\t*x = BidiReadObjectError{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[20]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *BidiReadObjectError) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BidiReadObjectError) ProtoMessage() {}\n\nfunc (x *BidiReadObjectError) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[20]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BidiReadObjectError.ProtoReflect.Descriptor instead.\nfunc (*BidiReadObjectError) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{20}\n}\n\nfunc (x *BidiReadObjectError) GetReadRangeErrors() []*ReadRangeError {\n\tif x != nil {\n\t\treturn x.ReadRangeErrors\n\t}\n\treturn nil\n}\n\n// Error extension proto containing details for a single range read\ntype ReadRangeError struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The id of the corresponding read_range\n\tReadId int64 `protobuf:\"varint,1,opt,name=read_id,json=readId,proto3\" json:\"read_id,omitempty\"`\n\t// The status which should be an enum value of [google.rpc.Code].\n\tStatus *status.Status `protobuf:\"bytes,2,opt,name=status,proto3\" json:\"status,omitempty\"`\n}\n\nfunc (x *ReadRangeError) Reset() {\n\t*x = ReadRangeError{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[21]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ReadRangeError) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ReadRangeError) ProtoMessage() {}\n\nfunc (x *ReadRangeError) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[21]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ReadRangeError.ProtoReflect.Descriptor instead.\nfunc (*ReadRangeError) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{21}\n}\n\nfunc (x *ReadRangeError) GetReadId() int64 {\n\tif x != nil {\n\t\treturn x.ReadId\n\t}\n\treturn 0\n}\n\nfunc (x *ReadRangeError) GetStatus() *status.Status {\n\tif x != nil {\n\t\treturn x.Status\n\t}\n\treturn nil\n}\n\n// Describes a range of bytes to read in a BidiReadObjectRanges request.\ntype ReadRange struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The offset for the first byte to return in the read, relative to\n\t// the start of the object.\n\t//\n\t// A negative read_offset value will be interpreted as the number of bytes\n\t// back from the end of the object to be returned. For example, if an object's\n\t// length is 15 bytes, a ReadObjectRequest with read_offset = -5 and\n\t// read_length = 3 would return bytes 10 through 12 of the object. Requesting\n\t// a negative offset with magnitude larger than the size of the object will\n\t// return the entire object. A read_offset larger than the size of the object\n\t// will result in an OutOfRange error.\n\tReadOffset int64 `protobuf:\"varint,1,opt,name=read_offset,json=readOffset,proto3\" json:\"read_offset,omitempty\"`\n\t// Optional. The maximum number of data bytes the server is allowed to return\n\t// across all response messages with the same read_id. A read_length of zero\n\t// indicates to read until the resource end, and a negative read_length will\n\t// cause an error. If the stream returns fewer bytes than allowed by the\n\t// read_length and no error occurred, the stream includes all data from the\n\t// read_offset to the resource end.\n\tReadLength int64 `protobuf:\"varint,2,opt,name=read_length,json=readLength,proto3\" json:\"read_length,omitempty\"`\n\t// Required. Read identifier provided by the client. When the client issues\n\t// more than one outstanding ReadRange on the same stream, responses can be\n\t// mapped back to their corresponding requests using this value. Clients must\n\t// ensure that all outstanding requests have different read_id values. The\n\t// server may close the stream with an error if this condition is not met.\n\tReadId int64 `protobuf:\"varint,3,opt,name=read_id,json=readId,proto3\" json:\"read_id,omitempty\"`\n}\n\nfunc (x *ReadRange) Reset() {\n\t*x = ReadRange{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[22]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ReadRange) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ReadRange) ProtoMessage() {}\n\nfunc (x *ReadRange) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[22]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ReadRange.ProtoReflect.Descriptor instead.\nfunc (*ReadRange) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{22}\n}\n\nfunc (x *ReadRange) GetReadOffset() int64 {\n\tif x != nil {\n\t\treturn x.ReadOffset\n\t}\n\treturn 0\n}\n\nfunc (x *ReadRange) GetReadLength() int64 {\n\tif x != nil {\n\t\treturn x.ReadLength\n\t}\n\treturn 0\n}\n\nfunc (x *ReadRange) GetReadId() int64 {\n\tif x != nil {\n\t\treturn x.ReadId\n\t}\n\treturn 0\n}\n\n// Contains data and metadata for a range of an object.\ntype ObjectRangeData struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// A portion of the data for the object.\n\tChecksummedData *ChecksummedData `protobuf:\"bytes,1,opt,name=checksummed_data,json=checksummedData,proto3\" json:\"checksummed_data,omitempty\"`\n\t// The ReadRange describes the content being returned with read_id set to the\n\t// corresponding ReadObjectRequest in the stream. Multiple ObjectRangeData\n\t// messages may have the same read_id but increasing offsets.\n\t// ReadObjectResponse messages with the same read_id are guaranteed to be\n\t// delivered in increasing offset order.\n\tReadRange *ReadRange `protobuf:\"bytes,2,opt,name=read_range,json=readRange,proto3\" json:\"read_range,omitempty\"`\n\t// If set, indicates there are no more bytes to read for the given ReadRange.\n\tRangeEnd bool `protobuf:\"varint,3,opt,name=range_end,json=rangeEnd,proto3\" json:\"range_end,omitempty\"`\n}\n\nfunc (x *ObjectRangeData) Reset() {\n\t*x = ObjectRangeData{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[23]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ObjectRangeData) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ObjectRangeData) ProtoMessage() {}\n\nfunc (x *ObjectRangeData) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[23]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ObjectRangeData.ProtoReflect.Descriptor instead.\nfunc (*ObjectRangeData) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{23}\n}\n\nfunc (x *ObjectRangeData) GetChecksummedData() *ChecksummedData {\n\tif x != nil {\n\t\treturn x.ChecksummedData\n\t}\n\treturn nil\n}\n\nfunc (x *ObjectRangeData) GetReadRange() *ReadRange {\n\tif x != nil {\n\t\treturn x.ReadRange\n\t}\n\treturn nil\n}\n\nfunc (x *ObjectRangeData) GetRangeEnd() bool {\n\tif x != nil {\n\t\treturn x.RangeEnd\n\t}\n\treturn false\n}\n\n// BidiReadHandle contains a handle from a previous BiDiReadObject\n// invocation. The client can use this instead of BidiReadObjectSpec as an\n// optimized way of opening subsequent bidirectional streams to the same object.\ntype BidiReadHandle struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Opaque value describing a previous read.\n\tHandle []byte `protobuf:\"bytes,1,opt,name=handle,proto3\" json:\"handle,omitempty\"`\n}\n\nfunc (x *BidiReadHandle) Reset() {\n\t*x = BidiReadHandle{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[24]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *BidiReadHandle) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BidiReadHandle) ProtoMessage() {}\n\nfunc (x *BidiReadHandle) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[24]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BidiReadHandle.ProtoReflect.Descriptor instead.\nfunc (*BidiReadHandle) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{24}\n}\n\nfunc (x *BidiReadHandle) GetHandle() []byte {\n\tif x != nil {\n\t\treturn x.Handle\n\t}\n\treturn nil\n}\n\n// BidiWriteHandle contains a handle from a previous BidiWriteObject\n// invocation. The client can use this as an optimized way of opening subsequent\n// bidirectional streams to the same object.\ntype BidiWriteHandle struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Opaque value describing a previous write.\n\tHandle []byte `protobuf:\"bytes,1,opt,name=handle,proto3\" json:\"handle,omitempty\"`\n}\n\nfunc (x *BidiWriteHandle) Reset() {\n\t*x = BidiWriteHandle{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[25]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *BidiWriteHandle) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BidiWriteHandle) ProtoMessage() {}\n\nfunc (x *BidiWriteHandle) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[25]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BidiWriteHandle.ProtoReflect.Descriptor instead.\nfunc (*BidiWriteHandle) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{25}\n}\n\nfunc (x *BidiWriteHandle) GetHandle() []byte {\n\tif x != nil {\n\t\treturn x.Handle\n\t}\n\treturn nil\n}\n\n// Describes an attempt to insert an object, possibly over multiple requests.\ntype WriteObjectSpec struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Destination object, including its name and its metadata.\n\tResource *Object `protobuf:\"bytes,1,opt,name=resource,proto3\" json:\"resource,omitempty\"`\n\t// Apply a predefined set of access controls to this object.\n\t// Valid values are \"authenticatedRead\", \"bucketOwnerFullControl\",\n\t// \"bucketOwnerRead\", \"private\", \"projectPrivate\", or \"publicRead\".\n\tPredefinedAcl string `protobuf:\"bytes,7,opt,name=predefined_acl,json=predefinedAcl,proto3\" json:\"predefined_acl,omitempty\"`\n\t// Makes the operation conditional on whether the object's current\n\t// generation matches the given value. Setting to 0 makes the operation\n\t// succeed only if there are no live versions of the object.\n\tIfGenerationMatch *int64 `protobuf:\"varint,3,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof\" json:\"if_generation_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's live\n\t// generation does not match the given value. If no live object exists, the\n\t// precondition fails. Setting to 0 makes the operation succeed only if\n\t// there is a live version of the object.\n\tIfGenerationNotMatch *int64 `protobuf:\"varint,4,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof\" json:\"if_generation_not_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's current\n\t// metageneration matches the given value.\n\tIfMetagenerationMatch *int64 `protobuf:\"varint,5,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof\" json:\"if_metageneration_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's current\n\t// metageneration does not match the given value.\n\tIfMetagenerationNotMatch *int64 `protobuf:\"varint,6,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof\" json:\"if_metageneration_not_match,omitempty\"`\n\t// The expected final object size being uploaded.\n\t// If this value is set, closing the stream after writing fewer or more than\n\t// `object_size` bytes will result in an OUT_OF_RANGE error.\n\t//\n\t// This situation is considered a client error, and if such an error occurs\n\t// you must start the upload over from scratch, this time sending the correct\n\t// number of bytes.\n\tObjectSize *int64 `protobuf:\"varint,8,opt,name=object_size,json=objectSize,proto3,oneof\" json:\"object_size,omitempty\"`\n\t// If true, the object will be created in appendable mode.\n\t// This field may only be set when using BidiWriteObject.\n\tAppendable *bool `protobuf:\"varint,9,opt,name=appendable,proto3,oneof\" json:\"appendable,omitempty\"`\n}\n\nfunc (x *WriteObjectSpec) Reset() {\n\t*x = WriteObjectSpec{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[26]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *WriteObjectSpec) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*WriteObjectSpec) ProtoMessage() {}\n\nfunc (x *WriteObjectSpec) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[26]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use WriteObjectSpec.ProtoReflect.Descriptor instead.\nfunc (*WriteObjectSpec) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{26}\n}\n\nfunc (x *WriteObjectSpec) GetResource() *Object {\n\tif x != nil {\n\t\treturn x.Resource\n\t}\n\treturn nil\n}\n\nfunc (x *WriteObjectSpec) GetPredefinedAcl() string {\n\tif x != nil {\n\t\treturn x.PredefinedAcl\n\t}\n\treturn \"\"\n}\n\nfunc (x *WriteObjectSpec) GetIfGenerationMatch() int64 {\n\tif x != nil && x.IfGenerationMatch != nil {\n\t\treturn *x.IfGenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *WriteObjectSpec) GetIfGenerationNotMatch() int64 {\n\tif x != nil && x.IfGenerationNotMatch != nil {\n\t\treturn *x.IfGenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *WriteObjectSpec) GetIfMetagenerationMatch() int64 {\n\tif x != nil && x.IfMetagenerationMatch != nil {\n\t\treturn *x.IfMetagenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *WriteObjectSpec) GetIfMetagenerationNotMatch() int64 {\n\tif x != nil && x.IfMetagenerationNotMatch != nil {\n\t\treturn *x.IfMetagenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *WriteObjectSpec) GetObjectSize() int64 {\n\tif x != nil && x.ObjectSize != nil {\n\t\treturn *x.ObjectSize\n\t}\n\treturn 0\n}\n\nfunc (x *WriteObjectSpec) GetAppendable() bool {\n\tif x != nil && x.Appendable != nil {\n\t\treturn *x.Appendable\n\t}\n\treturn false\n}\n\n// Request message for WriteObject.\ntype WriteObjectRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The first message of each stream should set one of the following.\n\t//\n\t// Types that are assignable to FirstMessage:\n\t//\n\t//\t*WriteObjectRequest_UploadId\n\t//\t*WriteObjectRequest_WriteObjectSpec\n\tFirstMessage isWriteObjectRequest_FirstMessage `protobuf_oneof:\"first_message\"`\n\t// Required. The offset from the beginning of the object at which the data\n\t// should be written.\n\t//\n\t// In the first `WriteObjectRequest` of a `WriteObject()` action, it\n\t// indicates the initial offset for the `Write()` call. The value **must** be\n\t// equal to the `persisted_size` that a call to `QueryWriteStatus()` would\n\t// return (0 if this is the first write to the object).\n\t//\n\t// On subsequent calls, this value **must** be no larger than the sum of the\n\t// first `write_offset` and the sizes of all `data` chunks sent previously on\n\t// this stream.\n\t//\n\t// An incorrect value will cause an error.\n\tWriteOffset int64 `protobuf:\"varint,3,opt,name=write_offset,json=writeOffset,proto3\" json:\"write_offset,omitempty\"`\n\t// A portion of the data for the object.\n\t//\n\t// Types that are assignable to Data:\n\t//\n\t//\t*WriteObjectRequest_ChecksummedData\n\tData isWriteObjectRequest_Data `protobuf_oneof:\"data\"`\n\t// Checksums for the complete object. If the checksums computed by the service\n\t// don't match the specified checksums the call will fail. May only be\n\t// provided in the first or last request (either with first_message, or\n\t// finish_write set).\n\tObjectChecksums *ObjectChecksums `protobuf:\"bytes,6,opt,name=object_checksums,json=objectChecksums,proto3\" json:\"object_checksums,omitempty\"`\n\t// If `true`, this indicates that the write is complete. Sending any\n\t// `WriteObjectRequest`s subsequent to one in which `finish_write` is `true`\n\t// will cause an error.\n\t// For a non-resumable write (where the upload_id was not set in the first\n\t// message), it is an error not to set this field in the final message of the\n\t// stream.\n\tFinishWrite bool `protobuf:\"varint,7,opt,name=finish_write,json=finishWrite,proto3\" json:\"finish_write,omitempty\"`\n\t// A set of parameters common to Storage API requests concerning an object.\n\tCommonObjectRequestParams *CommonObjectRequestParams `protobuf:\"bytes,8,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3\" json:\"common_object_request_params,omitempty\"`\n}\n\nfunc (x *WriteObjectRequest) Reset() {\n\t*x = WriteObjectRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[27]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *WriteObjectRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*WriteObjectRequest) ProtoMessage() {}\n\nfunc (x *WriteObjectRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[27]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use WriteObjectRequest.ProtoReflect.Descriptor instead.\nfunc (*WriteObjectRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{27}\n}\n\nfunc (m *WriteObjectRequest) GetFirstMessage() isWriteObjectRequest_FirstMessage {\n\tif m != nil {\n\t\treturn m.FirstMessage\n\t}\n\treturn nil\n}\n\nfunc (x *WriteObjectRequest) GetUploadId() string {\n\tif x, ok := x.GetFirstMessage().(*WriteObjectRequest_UploadId); ok {\n\t\treturn x.UploadId\n\t}\n\treturn \"\"\n}\n\nfunc (x *WriteObjectRequest) GetWriteObjectSpec() *WriteObjectSpec {\n\tif x, ok := x.GetFirstMessage().(*WriteObjectRequest_WriteObjectSpec); ok {\n\t\treturn x.WriteObjectSpec\n\t}\n\treturn nil\n}\n\nfunc (x *WriteObjectRequest) GetWriteOffset() int64 {\n\tif x != nil {\n\t\treturn x.WriteOffset\n\t}\n\treturn 0\n}\n\nfunc (m *WriteObjectRequest) GetData() isWriteObjectRequest_Data {\n\tif m != nil {\n\t\treturn m.Data\n\t}\n\treturn nil\n}\n\nfunc (x *WriteObjectRequest) GetChecksummedData() *ChecksummedData {\n\tif x, ok := x.GetData().(*WriteObjectRequest_ChecksummedData); ok {\n\t\treturn x.ChecksummedData\n\t}\n\treturn nil\n}\n\nfunc (x *WriteObjectRequest) GetObjectChecksums() *ObjectChecksums {\n\tif x != nil {\n\t\treturn x.ObjectChecksums\n\t}\n\treturn nil\n}\n\nfunc (x *WriteObjectRequest) GetFinishWrite() bool {\n\tif x != nil {\n\t\treturn x.FinishWrite\n\t}\n\treturn false\n}\n\nfunc (x *WriteObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams {\n\tif x != nil {\n\t\treturn x.CommonObjectRequestParams\n\t}\n\treturn nil\n}\n\ntype isWriteObjectRequest_FirstMessage interface {\n\tisWriteObjectRequest_FirstMessage()\n}\n\ntype WriteObjectRequest_UploadId struct {\n\t// For resumable uploads. This should be the `upload_id` returned from a\n\t// call to `StartResumableWriteResponse`.\n\tUploadId string `protobuf:\"bytes,1,opt,name=upload_id,json=uploadId,proto3,oneof\"`\n}\n\ntype WriteObjectRequest_WriteObjectSpec struct {\n\t// For non-resumable uploads. Describes the overall upload, including the\n\t// destination bucket and object name, preconditions, etc.\n\tWriteObjectSpec *WriteObjectSpec `protobuf:\"bytes,2,opt,name=write_object_spec,json=writeObjectSpec,proto3,oneof\"`\n}\n\nfunc (*WriteObjectRequest_UploadId) isWriteObjectRequest_FirstMessage() {}\n\nfunc (*WriteObjectRequest_WriteObjectSpec) isWriteObjectRequest_FirstMessage() {}\n\ntype isWriteObjectRequest_Data interface {\n\tisWriteObjectRequest_Data()\n}\n\ntype WriteObjectRequest_ChecksummedData struct {\n\t// The data to insert. If a crc32c checksum is provided that doesn't match\n\t// the checksum computed by the service, the request will fail.\n\tChecksummedData *ChecksummedData `protobuf:\"bytes,4,opt,name=checksummed_data,json=checksummedData,proto3,oneof\"`\n}\n\nfunc (*WriteObjectRequest_ChecksummedData) isWriteObjectRequest_Data() {}\n\n// Response message for WriteObject.\ntype WriteObjectResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The response will set one of the following.\n\t//\n\t// Types that are assignable to WriteStatus:\n\t//\n\t//\t*WriteObjectResponse_PersistedSize\n\t//\t*WriteObjectResponse_Resource\n\tWriteStatus isWriteObjectResponse_WriteStatus `protobuf_oneof:\"write_status\"`\n}\n\nfunc (x *WriteObjectResponse) Reset() {\n\t*x = WriteObjectResponse{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[28]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *WriteObjectResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*WriteObjectResponse) ProtoMessage() {}\n\nfunc (x *WriteObjectResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[28]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use WriteObjectResponse.ProtoReflect.Descriptor instead.\nfunc (*WriteObjectResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{28}\n}\n\nfunc (m *WriteObjectResponse) GetWriteStatus() isWriteObjectResponse_WriteStatus {\n\tif m != nil {\n\t\treturn m.WriteStatus\n\t}\n\treturn nil\n}\n\nfunc (x *WriteObjectResponse) GetPersistedSize() int64 {\n\tif x, ok := x.GetWriteStatus().(*WriteObjectResponse_PersistedSize); ok {\n\t\treturn x.PersistedSize\n\t}\n\treturn 0\n}\n\nfunc (x *WriteObjectResponse) GetResource() *Object {\n\tif x, ok := x.GetWriteStatus().(*WriteObjectResponse_Resource); ok {\n\t\treturn x.Resource\n\t}\n\treturn nil\n}\n\ntype isWriteObjectResponse_WriteStatus interface {\n\tisWriteObjectResponse_WriteStatus()\n}\n\ntype WriteObjectResponse_PersistedSize struct {\n\t// The total number of bytes that have been processed for the given object\n\t// from all `WriteObject` calls. Only set if the upload has not finalized.\n\tPersistedSize int64 `protobuf:\"varint,1,opt,name=persisted_size,json=persistedSize,proto3,oneof\"`\n}\n\ntype WriteObjectResponse_Resource struct {\n\t// A resource containing the metadata for the uploaded object. Only set if\n\t// the upload has finalized.\n\tResource *Object `protobuf:\"bytes,2,opt,name=resource,proto3,oneof\"`\n}\n\nfunc (*WriteObjectResponse_PersistedSize) isWriteObjectResponse_WriteStatus() {}\n\nfunc (*WriteObjectResponse_Resource) isWriteObjectResponse_WriteStatus() {}\n\n// Describes an attempt to append to an object, possibly over multiple requests.\ntype AppendObjectSpec struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The name of the bucket containing the object to write.\n\tBucket string `protobuf:\"bytes,1,opt,name=bucket,proto3\" json:\"bucket,omitempty\"`\n\t// Required. The name of the object to open for writing.\n\tObject string `protobuf:\"bytes,2,opt,name=object,proto3\" json:\"object,omitempty\"`\n\t// Required. The generation number of the object to open for writing.\n\tGeneration int64 `protobuf:\"varint,3,opt,name=generation,proto3\" json:\"generation,omitempty\"`\n\t// Makes the operation conditional on whether the object's current\n\t// metageneration matches the given value.\n\tIfMetagenerationMatch *int64 `protobuf:\"varint,4,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof\" json:\"if_metageneration_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's current\n\t// metageneration does not match the given value.\n\tIfMetagenerationNotMatch *int64 `protobuf:\"varint,5,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof\" json:\"if_metageneration_not_match,omitempty\"`\n\t// An optional routing token that influences request routing for the stream.\n\t// Must be provided if a BidiWriteObjectRedirectedError is returned.\n\tRoutingToken *string `protobuf:\"bytes,6,opt,name=routing_token,json=routingToken,proto3,oneof\" json:\"routing_token,omitempty\"`\n\t// An optional write handle returned from a previous BidiWriteObjectResponse\n\t// message or a BidiWriteObjectRedirectedError error.\n\tWriteHandle *BidiWriteHandle `protobuf:\"bytes,7,opt,name=write_handle,json=writeHandle,proto3,oneof\" json:\"write_handle,omitempty\"`\n}\n\nfunc (x *AppendObjectSpec) Reset() {\n\t*x = AppendObjectSpec{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[29]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *AppendObjectSpec) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*AppendObjectSpec) ProtoMessage() {}\n\nfunc (x *AppendObjectSpec) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[29]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use AppendObjectSpec.ProtoReflect.Descriptor instead.\nfunc (*AppendObjectSpec) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{29}\n}\n\nfunc (x *AppendObjectSpec) GetBucket() string {\n\tif x != nil {\n\t\treturn x.Bucket\n\t}\n\treturn \"\"\n}\n\nfunc (x *AppendObjectSpec) GetObject() string {\n\tif x != nil {\n\t\treturn x.Object\n\t}\n\treturn \"\"\n}\n\nfunc (x *AppendObjectSpec) GetGeneration() int64 {\n\tif x != nil {\n\t\treturn x.Generation\n\t}\n\treturn 0\n}\n\nfunc (x *AppendObjectSpec) GetIfMetagenerationMatch() int64 {\n\tif x != nil && x.IfMetagenerationMatch != nil {\n\t\treturn *x.IfMetagenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *AppendObjectSpec) GetIfMetagenerationNotMatch() int64 {\n\tif x != nil && x.IfMetagenerationNotMatch != nil {\n\t\treturn *x.IfMetagenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *AppendObjectSpec) GetRoutingToken() string {\n\tif x != nil && x.RoutingToken != nil {\n\t\treturn *x.RoutingToken\n\t}\n\treturn \"\"\n}\n\nfunc (x *AppendObjectSpec) GetWriteHandle() *BidiWriteHandle {\n\tif x != nil {\n\t\treturn x.WriteHandle\n\t}\n\treturn nil\n}\n\n// Request message for BidiWriteObject.\ntype BidiWriteObjectRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The first message of each stream should set one of the following.\n\t//\n\t// Types that are assignable to FirstMessage:\n\t//\n\t//\t*BidiWriteObjectRequest_UploadId\n\t//\t*BidiWriteObjectRequest_WriteObjectSpec\n\t//\t*BidiWriteObjectRequest_AppendObjectSpec\n\tFirstMessage isBidiWriteObjectRequest_FirstMessage `protobuf_oneof:\"first_message\"`\n\t// Required. The offset from the beginning of the object at which the data\n\t// should be written.\n\t//\n\t// In the first `WriteObjectRequest` of a `WriteObject()` action, it\n\t// indicates the initial offset for the `Write()` call. The value **must** be\n\t// equal to the `persisted_size` that a call to `QueryWriteStatus()` would\n\t// return (0 if this is the first write to the object).\n\t//\n\t// On subsequent calls, this value **must** be no larger than the sum of the\n\t// first `write_offset` and the sizes of all `data` chunks sent previously on\n\t// this stream.\n\t//\n\t// An invalid value will cause an error.\n\tWriteOffset int64 `protobuf:\"varint,3,opt,name=write_offset,json=writeOffset,proto3\" json:\"write_offset,omitempty\"`\n\t// A portion of the data for the object.\n\t//\n\t// Types that are assignable to Data:\n\t//\n\t//\t*BidiWriteObjectRequest_ChecksummedData\n\tData isBidiWriteObjectRequest_Data `protobuf_oneof:\"data\"`\n\t// Checksums for the complete object. If the checksums computed by the service\n\t// don't match the specified checksums the call will fail. May only be\n\t// provided in the first request or the\n\t// last request (with finish_write set).\n\tObjectChecksums *ObjectChecksums `protobuf:\"bytes,6,opt,name=object_checksums,json=objectChecksums,proto3\" json:\"object_checksums,omitempty\"`\n\t// For each BidiWriteObjectRequest where state_lookup is `true` or the client\n\t// closes the stream, the service will send a BidiWriteObjectResponse\n\t// containing the current persisted size. The persisted size sent in responses\n\t// covers all the bytes the server has persisted thus far and can be used to\n\t// decide what data is safe for the client to drop. Note that the object's\n\t// current size reported by the BidiWriteObjectResponse may lag behind the\n\t// number of bytes written by the client. This field is ignored if\n\t// `finish_write` is set to true.\n\tStateLookup bool `protobuf:\"varint,7,opt,name=state_lookup,json=stateLookup,proto3\" json:\"state_lookup,omitempty\"`\n\t// Persists data written on the stream, up to and including the current\n\t// message, to permanent storage. This option should be used sparingly as it\n\t// may reduce performance. Ongoing writes will periodically be persisted on\n\t// the server even when `flush` is not set. This field is ignored if\n\t// `finish_write` is set to true since there's no need to checkpoint or flush\n\t// if this message completes the write.\n\tFlush bool `protobuf:\"varint,8,opt,name=flush,proto3\" json:\"flush,omitempty\"`\n\t// If `true`, this indicates that the write is complete. Sending any\n\t// `WriteObjectRequest`s subsequent to one in which `finish_write` is `true`\n\t// will cause an error.\n\t// For a non-resumable write (where the upload_id was not set in the first\n\t// message), it is an error not to set this field in the final message of the\n\t// stream.\n\tFinishWrite bool `protobuf:\"varint,9,opt,name=finish_write,json=finishWrite,proto3\" json:\"finish_write,omitempty\"`\n\t// A set of parameters common to Storage API requests concerning an object.\n\tCommonObjectRequestParams *CommonObjectRequestParams `protobuf:\"bytes,10,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3\" json:\"common_object_request_params,omitempty\"`\n}\n\nfunc (x *BidiWriteObjectRequest) Reset() {\n\t*x = BidiWriteObjectRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[30]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *BidiWriteObjectRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BidiWriteObjectRequest) ProtoMessage() {}\n\nfunc (x *BidiWriteObjectRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[30]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BidiWriteObjectRequest.ProtoReflect.Descriptor instead.\nfunc (*BidiWriteObjectRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{30}\n}\n\nfunc (m *BidiWriteObjectRequest) GetFirstMessage() isBidiWriteObjectRequest_FirstMessage {\n\tif m != nil {\n\t\treturn m.FirstMessage\n\t}\n\treturn nil\n}\n\nfunc (x *BidiWriteObjectRequest) GetUploadId() string {\n\tif x, ok := x.GetFirstMessage().(*BidiWriteObjectRequest_UploadId); ok {\n\t\treturn x.UploadId\n\t}\n\treturn \"\"\n}\n\nfunc (x *BidiWriteObjectRequest) GetWriteObjectSpec() *WriteObjectSpec {\n\tif x, ok := x.GetFirstMessage().(*BidiWriteObjectRequest_WriteObjectSpec); ok {\n\t\treturn x.WriteObjectSpec\n\t}\n\treturn nil\n}\n\nfunc (x *BidiWriteObjectRequest) GetAppendObjectSpec() *AppendObjectSpec {\n\tif x, ok := x.GetFirstMessage().(*BidiWriteObjectRequest_AppendObjectSpec); ok {\n\t\treturn x.AppendObjectSpec\n\t}\n\treturn nil\n}\n\nfunc (x *BidiWriteObjectRequest) GetWriteOffset() int64 {\n\tif x != nil {\n\t\treturn x.WriteOffset\n\t}\n\treturn 0\n}\n\nfunc (m *BidiWriteObjectRequest) GetData() isBidiWriteObjectRequest_Data {\n\tif m != nil {\n\t\treturn m.Data\n\t}\n\treturn nil\n}\n\nfunc (x *BidiWriteObjectRequest) GetChecksummedData() *ChecksummedData {\n\tif x, ok := x.GetData().(*BidiWriteObjectRequest_ChecksummedData); ok {\n\t\treturn x.ChecksummedData\n\t}\n\treturn nil\n}\n\nfunc (x *BidiWriteObjectRequest) GetObjectChecksums() *ObjectChecksums {\n\tif x != nil {\n\t\treturn x.ObjectChecksums\n\t}\n\treturn nil\n}\n\nfunc (x *BidiWriteObjectRequest) GetStateLookup() bool {\n\tif x != nil {\n\t\treturn x.StateLookup\n\t}\n\treturn false\n}\n\nfunc (x *BidiWriteObjectRequest) GetFlush() bool {\n\tif x != nil {\n\t\treturn x.Flush\n\t}\n\treturn false\n}\n\nfunc (x *BidiWriteObjectRequest) GetFinishWrite() bool {\n\tif x != nil {\n\t\treturn x.FinishWrite\n\t}\n\treturn false\n}\n\nfunc (x *BidiWriteObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams {\n\tif x != nil {\n\t\treturn x.CommonObjectRequestParams\n\t}\n\treturn nil\n}\n\ntype isBidiWriteObjectRequest_FirstMessage interface {\n\tisBidiWriteObjectRequest_FirstMessage()\n}\n\ntype BidiWriteObjectRequest_UploadId struct {\n\t// For resumable uploads. This should be the `upload_id` returned from a\n\t// call to `StartResumableWriteResponse`.\n\tUploadId string `protobuf:\"bytes,1,opt,name=upload_id,json=uploadId,proto3,oneof\"`\n}\n\ntype BidiWriteObjectRequest_WriteObjectSpec struct {\n\t// For non-resumable uploads. Describes the overall upload, including the\n\t// destination bucket and object name, preconditions, etc.\n\tWriteObjectSpec *WriteObjectSpec `protobuf:\"bytes,2,opt,name=write_object_spec,json=writeObjectSpec,proto3,oneof\"`\n}\n\ntype BidiWriteObjectRequest_AppendObjectSpec struct {\n\t// For appendable uploads. Describes the object to append to.\n\tAppendObjectSpec *AppendObjectSpec `protobuf:\"bytes,11,opt,name=append_object_spec,json=appendObjectSpec,proto3,oneof\"`\n}\n\nfunc (*BidiWriteObjectRequest_UploadId) isBidiWriteObjectRequest_FirstMessage() {}\n\nfunc (*BidiWriteObjectRequest_WriteObjectSpec) isBidiWriteObjectRequest_FirstMessage() {}\n\nfunc (*BidiWriteObjectRequest_AppendObjectSpec) isBidiWriteObjectRequest_FirstMessage() {}\n\ntype isBidiWriteObjectRequest_Data interface {\n\tisBidiWriteObjectRequest_Data()\n}\n\ntype BidiWriteObjectRequest_ChecksummedData struct {\n\t// The data to insert. If a crc32c checksum is provided that doesn't match\n\t// the checksum computed by the service, the request will fail.\n\tChecksummedData *ChecksummedData `protobuf:\"bytes,4,opt,name=checksummed_data,json=checksummedData,proto3,oneof\"`\n}\n\nfunc (*BidiWriteObjectRequest_ChecksummedData) isBidiWriteObjectRequest_Data() {}\n\n// Response message for BidiWriteObject.\ntype BidiWriteObjectResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The response will set one of the following.\n\t//\n\t// Types that are assignable to WriteStatus:\n\t//\n\t//\t*BidiWriteObjectResponse_PersistedSize\n\t//\t*BidiWriteObjectResponse_Resource\n\tWriteStatus isBidiWriteObjectResponse_WriteStatus `protobuf_oneof:\"write_status\"`\n\t// An optional write handle that will periodically be present in response\n\t// messages. Clients should save it for later use in establishing a new stream\n\t// if a connection is interrupted.\n\tWriteHandle *BidiWriteHandle `protobuf:\"bytes,3,opt,name=write_handle,json=writeHandle,proto3,oneof\" json:\"write_handle,omitempty\"`\n}\n\nfunc (x *BidiWriteObjectResponse) Reset() {\n\t*x = BidiWriteObjectResponse{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[31]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *BidiWriteObjectResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BidiWriteObjectResponse) ProtoMessage() {}\n\nfunc (x *BidiWriteObjectResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[31]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BidiWriteObjectResponse.ProtoReflect.Descriptor instead.\nfunc (*BidiWriteObjectResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{31}\n}\n\nfunc (m *BidiWriteObjectResponse) GetWriteStatus() isBidiWriteObjectResponse_WriteStatus {\n\tif m != nil {\n\t\treturn m.WriteStatus\n\t}\n\treturn nil\n}\n\nfunc (x *BidiWriteObjectResponse) GetPersistedSize() int64 {\n\tif x, ok := x.GetWriteStatus().(*BidiWriteObjectResponse_PersistedSize); ok {\n\t\treturn x.PersistedSize\n\t}\n\treturn 0\n}\n\nfunc (x *BidiWriteObjectResponse) GetResource() *Object {\n\tif x, ok := x.GetWriteStatus().(*BidiWriteObjectResponse_Resource); ok {\n\t\treturn x.Resource\n\t}\n\treturn nil\n}\n\nfunc (x *BidiWriteObjectResponse) GetWriteHandle() *BidiWriteHandle {\n\tif x != nil {\n\t\treturn x.WriteHandle\n\t}\n\treturn nil\n}\n\ntype isBidiWriteObjectResponse_WriteStatus interface {\n\tisBidiWriteObjectResponse_WriteStatus()\n}\n\ntype BidiWriteObjectResponse_PersistedSize struct {\n\t// The total number of bytes that have been processed for the given object\n\t// from all `WriteObject` calls. Only set if the upload has not finalized.\n\tPersistedSize int64 `protobuf:\"varint,1,opt,name=persisted_size,json=persistedSize,proto3,oneof\"`\n}\n\ntype BidiWriteObjectResponse_Resource struct {\n\t// A resource containing the metadata for the uploaded object. Only set if\n\t// the upload has finalized.\n\tResource *Object `protobuf:\"bytes,2,opt,name=resource,proto3,oneof\"`\n}\n\nfunc (*BidiWriteObjectResponse_PersistedSize) isBidiWriteObjectResponse_WriteStatus() {}\n\nfunc (*BidiWriteObjectResponse_Resource) isBidiWriteObjectResponse_WriteStatus() {}\n\n// Request message for ListObjects.\ntype ListObjectsRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Name of the bucket in which to look for objects.\n\tParent string `protobuf:\"bytes,1,opt,name=parent,proto3\" json:\"parent,omitempty\"`\n\t// Maximum number of `items` plus `prefixes` to return\n\t// in a single page of responses. As duplicate `prefixes` are\n\t// omitted, fewer total results may be returned than requested. The service\n\t// will use this parameter or 1,000 items, whichever is smaller.\n\tPageSize int32 `protobuf:\"varint,2,opt,name=page_size,json=pageSize,proto3\" json:\"page_size,omitempty\"`\n\t// A previously-returned page token representing part of the larger set of\n\t// results to view.\n\tPageToken string `protobuf:\"bytes,3,opt,name=page_token,json=pageToken,proto3\" json:\"page_token,omitempty\"`\n\t// If set, returns results in a directory-like mode. `items` will contain\n\t// only objects whose names, aside from the `prefix`, do not\n\t// contain `delimiter`. Objects whose names, aside from the\n\t// `prefix`, contain `delimiter` will have their name,\n\t// truncated after the `delimiter`, returned in\n\t// `prefixes`. Duplicate `prefixes` are omitted.\n\tDelimiter string `protobuf:\"bytes,4,opt,name=delimiter,proto3\" json:\"delimiter,omitempty\"`\n\t// If true, objects that end in exactly one instance of `delimiter`\n\t// will have their metadata included in `items` in addition to\n\t// `prefixes`.\n\tIncludeTrailingDelimiter bool `protobuf:\"varint,5,opt,name=include_trailing_delimiter,json=includeTrailingDelimiter,proto3\" json:\"include_trailing_delimiter,omitempty\"`\n\t// Filter results to objects whose names begin with this prefix.\n\tPrefix string `protobuf:\"bytes,6,opt,name=prefix,proto3\" json:\"prefix,omitempty\"`\n\t// If `true`, lists all versions of an object as distinct results.\n\t// For more information, see\n\t// [Object\n\t// Versioning](https://cloud.google.com/storage/docs/object-versioning).\n\tVersions bool `protobuf:\"varint,7,opt,name=versions,proto3\" json:\"versions,omitempty\"`\n\t// Mask specifying which fields to read from each result.\n\t// If no mask is specified, will default to all fields except items.acl and\n\t// items.owner.\n\t// * may be used to mean \"all fields\".\n\tReadMask *fieldmaskpb.FieldMask `protobuf:\"bytes,8,opt,name=read_mask,json=readMask,proto3,oneof\" json:\"read_mask,omitempty\"`\n\t// Optional. Filter results to objects whose names are lexicographically equal\n\t// to or after lexicographic_start. If lexicographic_end is also set, the\n\t// objects listed have names between lexicographic_start (inclusive) and\n\t// lexicographic_end (exclusive).\n\tLexicographicStart string `protobuf:\"bytes,10,opt,name=lexicographic_start,json=lexicographicStart,proto3\" json:\"lexicographic_start,omitempty\"`\n\t// Optional. Filter results to objects whose names are lexicographically\n\t// before lexicographic_end. If lexicographic_start is also set, the objects\n\t// listed have names between lexicographic_start (inclusive) and\n\t// lexicographic_end (exclusive).\n\tLexicographicEnd string `protobuf:\"bytes,11,opt,name=lexicographic_end,json=lexicographicEnd,proto3\" json:\"lexicographic_end,omitempty\"`\n\t// Optional. If true, only list all soft-deleted versions of the object.\n\t// Soft delete policy is required to set this option.\n\tSoftDeleted bool `protobuf:\"varint,12,opt,name=soft_deleted,json=softDeleted,proto3\" json:\"soft_deleted,omitempty\"`\n\t// Optional. If true, will also include folders and managed folders (besides\n\t// objects) in the returned `prefixes`. Requires `delimiter` to be set to '/'.\n\tIncludeFoldersAsPrefixes bool `protobuf:\"varint,13,opt,name=include_folders_as_prefixes,json=includeFoldersAsPrefixes,proto3\" json:\"include_folders_as_prefixes,omitempty\"`\n\t// Optional. Filter results to objects and prefixes that match this glob\n\t// pattern. See [List Objects Using\n\t// Glob](https://cloud.google.com/storage/docs/json_api/v1/objects/list#list-objects-and-prefixes-using-glob)\n\t// for the full syntax.\n\tMatchGlob string `protobuf:\"bytes,14,opt,name=match_glob,json=matchGlob,proto3\" json:\"match_glob,omitempty\"`\n}\n\nfunc (x *ListObjectsRequest) Reset() {\n\t*x = ListObjectsRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[32]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListObjectsRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListObjectsRequest) ProtoMessage() {}\n\nfunc (x *ListObjectsRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[32]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListObjectsRequest.ProtoReflect.Descriptor instead.\nfunc (*ListObjectsRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{32}\n}\n\nfunc (x *ListObjectsRequest) GetParent() string {\n\tif x != nil {\n\t\treturn x.Parent\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListObjectsRequest) GetPageSize() int32 {\n\tif x != nil {\n\t\treturn x.PageSize\n\t}\n\treturn 0\n}\n\nfunc (x *ListObjectsRequest) GetPageToken() string {\n\tif x != nil {\n\t\treturn x.PageToken\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListObjectsRequest) GetDelimiter() string {\n\tif x != nil {\n\t\treturn x.Delimiter\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListObjectsRequest) GetIncludeTrailingDelimiter() bool {\n\tif x != nil {\n\t\treturn x.IncludeTrailingDelimiter\n\t}\n\treturn false\n}\n\nfunc (x *ListObjectsRequest) GetPrefix() string {\n\tif x != nil {\n\t\treturn x.Prefix\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListObjectsRequest) GetVersions() bool {\n\tif x != nil {\n\t\treturn x.Versions\n\t}\n\treturn false\n}\n\nfunc (x *ListObjectsRequest) GetReadMask() *fieldmaskpb.FieldMask {\n\tif x != nil {\n\t\treturn x.ReadMask\n\t}\n\treturn nil\n}\n\nfunc (x *ListObjectsRequest) GetLexicographicStart() string {\n\tif x != nil {\n\t\treturn x.LexicographicStart\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListObjectsRequest) GetLexicographicEnd() string {\n\tif x != nil {\n\t\treturn x.LexicographicEnd\n\t}\n\treturn \"\"\n}\n\nfunc (x *ListObjectsRequest) GetSoftDeleted() bool {\n\tif x != nil {\n\t\treturn x.SoftDeleted\n\t}\n\treturn false\n}\n\nfunc (x *ListObjectsRequest) GetIncludeFoldersAsPrefixes() bool {\n\tif x != nil {\n\t\treturn x.IncludeFoldersAsPrefixes\n\t}\n\treturn false\n}\n\nfunc (x *ListObjectsRequest) GetMatchGlob() string {\n\tif x != nil {\n\t\treturn x.MatchGlob\n\t}\n\treturn \"\"\n}\n\n// Request object for `QueryWriteStatus`.\ntype QueryWriteStatusRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The name of the resume token for the object whose write status is\n\t// being requested.\n\tUploadId string `protobuf:\"bytes,1,opt,name=upload_id,json=uploadId,proto3\" json:\"upload_id,omitempty\"`\n\t// A set of parameters common to Storage API requests concerning an object.\n\tCommonObjectRequestParams *CommonObjectRequestParams `protobuf:\"bytes,2,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3\" json:\"common_object_request_params,omitempty\"`\n}\n\nfunc (x *QueryWriteStatusRequest) Reset() {\n\t*x = QueryWriteStatusRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[33]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *QueryWriteStatusRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*QueryWriteStatusRequest) ProtoMessage() {}\n\nfunc (x *QueryWriteStatusRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[33]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use QueryWriteStatusRequest.ProtoReflect.Descriptor instead.\nfunc (*QueryWriteStatusRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{33}\n}\n\nfunc (x *QueryWriteStatusRequest) GetUploadId() string {\n\tif x != nil {\n\t\treturn x.UploadId\n\t}\n\treturn \"\"\n}\n\nfunc (x *QueryWriteStatusRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams {\n\tif x != nil {\n\t\treturn x.CommonObjectRequestParams\n\t}\n\treturn nil\n}\n\n// Response object for `QueryWriteStatus`.\ntype QueryWriteStatusResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The response will set one of the following.\n\t//\n\t// Types that are assignable to WriteStatus:\n\t//\n\t//\t*QueryWriteStatusResponse_PersistedSize\n\t//\t*QueryWriteStatusResponse_Resource\n\tWriteStatus isQueryWriteStatusResponse_WriteStatus `protobuf_oneof:\"write_status\"`\n}\n\nfunc (x *QueryWriteStatusResponse) Reset() {\n\t*x = QueryWriteStatusResponse{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[34]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *QueryWriteStatusResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*QueryWriteStatusResponse) ProtoMessage() {}\n\nfunc (x *QueryWriteStatusResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[34]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use QueryWriteStatusResponse.ProtoReflect.Descriptor instead.\nfunc (*QueryWriteStatusResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{34}\n}\n\nfunc (m *QueryWriteStatusResponse) GetWriteStatus() isQueryWriteStatusResponse_WriteStatus {\n\tif m != nil {\n\t\treturn m.WriteStatus\n\t}\n\treturn nil\n}\n\nfunc (x *QueryWriteStatusResponse) GetPersistedSize() int64 {\n\tif x, ok := x.GetWriteStatus().(*QueryWriteStatusResponse_PersistedSize); ok {\n\t\treturn x.PersistedSize\n\t}\n\treturn 0\n}\n\nfunc (x *QueryWriteStatusResponse) GetResource() *Object {\n\tif x, ok := x.GetWriteStatus().(*QueryWriteStatusResponse_Resource); ok {\n\t\treturn x.Resource\n\t}\n\treturn nil\n}\n\ntype isQueryWriteStatusResponse_WriteStatus interface {\n\tisQueryWriteStatusResponse_WriteStatus()\n}\n\ntype QueryWriteStatusResponse_PersistedSize struct {\n\t// The total number of bytes that have been processed for the given object\n\t// from all `WriteObject` calls. This is the correct value for the\n\t// 'write_offset' field to use when resuming the `WriteObject` operation.\n\t// Only set if the upload has not finalized.\n\tPersistedSize int64 `protobuf:\"varint,1,opt,name=persisted_size,json=persistedSize,proto3,oneof\"`\n}\n\ntype QueryWriteStatusResponse_Resource struct {\n\t// A resource containing the metadata for the uploaded object. Only set if\n\t// the upload has finalized.\n\tResource *Object `protobuf:\"bytes,2,opt,name=resource,proto3,oneof\"`\n}\n\nfunc (*QueryWriteStatusResponse_PersistedSize) isQueryWriteStatusResponse_WriteStatus() {}\n\nfunc (*QueryWriteStatusResponse_Resource) isQueryWriteStatusResponse_WriteStatus() {}\n\n// Request message for RewriteObject.\n// If the source object is encrypted using a Customer-Supplied Encryption Key\n// the key information must be provided in the copy_source_encryption_algorithm,\n// copy_source_encryption_key_bytes, and copy_source_encryption_key_sha256_bytes\n// fields. If the destination object should be encrypted the keying information\n// should be provided in the encryption_algorithm, encryption_key_bytes, and\n// encryption_key_sha256_bytes fields of the\n// common_object_request_params.customer_encryption field.\ntype RewriteObjectRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Immutable. The name of the destination object.\n\t// See the\n\t// [Naming Guidelines](https://cloud.google.com/storage/docs/objects#naming).\n\t// Example: `test.txt`\n\t// The `name` field by itself does not uniquely identify a Cloud Storage\n\t// object. A Cloud Storage object is uniquely identified by the tuple of\n\t// (bucket, object, generation).\n\tDestinationName string `protobuf:\"bytes,24,opt,name=destination_name,json=destinationName,proto3\" json:\"destination_name,omitempty\"`\n\t// Required. Immutable. The name of the bucket containing the destination\n\t// object.\n\tDestinationBucket string `protobuf:\"bytes,25,opt,name=destination_bucket,json=destinationBucket,proto3\" json:\"destination_bucket,omitempty\"`\n\t// The name of the Cloud KMS key that will be used to encrypt the destination\n\t// object. The Cloud KMS key must be located in same location as the object.\n\t// If the parameter is not specified, the request uses the destination\n\t// bucket's default encryption key, if any, or else the Google-managed\n\t// encryption key.\n\tDestinationKmsKey string `protobuf:\"bytes,27,opt,name=destination_kms_key,json=destinationKmsKey,proto3\" json:\"destination_kms_key,omitempty\"`\n\t// Properties of the destination, post-rewrite object.\n\t// The `name`, `bucket` and `kms_key` fields must not be populated (these\n\t// values are specified in the `destination_name`, `destination_bucket`, and\n\t// `destination_kms_key` fields).\n\t// If `destination` is present it will be used to construct the destination\n\t// object's metadata; otherwise the destination object's metadata will be\n\t// copied from the source object.\n\tDestination *Object `protobuf:\"bytes,1,opt,name=destination,proto3\" json:\"destination,omitempty\"`\n\t// Required. Name of the bucket in which to find the source object.\n\tSourceBucket string `protobuf:\"bytes,2,opt,name=source_bucket,json=sourceBucket,proto3\" json:\"source_bucket,omitempty\"`\n\t// Required. Name of the source object.\n\tSourceObject string `protobuf:\"bytes,3,opt,name=source_object,json=sourceObject,proto3\" json:\"source_object,omitempty\"`\n\t// If present, selects a specific revision of the source object (as opposed to\n\t// the latest version, the default).\n\tSourceGeneration int64 `protobuf:\"varint,4,opt,name=source_generation,json=sourceGeneration,proto3\" json:\"source_generation,omitempty\"`\n\t// Include this field (from the previous rewrite response) on each rewrite\n\t// request after the first one, until the rewrite response 'done' flag is\n\t// true. Calls that provide a rewriteToken can omit all other request fields,\n\t// but if included those fields must match the values provided in the first\n\t// rewrite request.\n\tRewriteToken string `protobuf:\"bytes,5,opt,name=rewrite_token,json=rewriteToken,proto3\" json:\"rewrite_token,omitempty\"`\n\t// Apply a predefined set of access controls to the destination object.\n\t// Valid values are \"authenticatedRead\", \"bucketOwnerFullControl\",\n\t// \"bucketOwnerRead\", \"private\", \"projectPrivate\", or \"publicRead\".\n\tDestinationPredefinedAcl string `protobuf:\"bytes,28,opt,name=destination_predefined_acl,json=destinationPredefinedAcl,proto3\" json:\"destination_predefined_acl,omitempty\"`\n\t// Makes the operation conditional on whether the object's current generation\n\t// matches the given value. Setting to 0 makes the operation succeed only if\n\t// there are no live versions of the object.\n\tIfGenerationMatch *int64 `protobuf:\"varint,7,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof\" json:\"if_generation_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's live generation\n\t// does not match the given value. If no live object exists, the precondition\n\t// fails. Setting to 0 makes the operation succeed only if there is a live\n\t// version of the object.\n\tIfGenerationNotMatch *int64 `protobuf:\"varint,8,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof\" json:\"if_generation_not_match,omitempty\"`\n\t// Makes the operation conditional on whether the destination object's current\n\t// metageneration matches the given value.\n\tIfMetagenerationMatch *int64 `protobuf:\"varint,9,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof\" json:\"if_metageneration_match,omitempty\"`\n\t// Makes the operation conditional on whether the destination object's current\n\t// metageneration does not match the given value.\n\tIfMetagenerationNotMatch *int64 `protobuf:\"varint,10,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof\" json:\"if_metageneration_not_match,omitempty\"`\n\t// Makes the operation conditional on whether the source object's live\n\t// generation matches the given value.\n\tIfSourceGenerationMatch *int64 `protobuf:\"varint,11,opt,name=if_source_generation_match,json=ifSourceGenerationMatch,proto3,oneof\" json:\"if_source_generation_match,omitempty\"`\n\t// Makes the operation conditional on whether the source object's live\n\t// generation does not match the given value.\n\tIfSourceGenerationNotMatch *int64 `protobuf:\"varint,12,opt,name=if_source_generation_not_match,json=ifSourceGenerationNotMatch,proto3,oneof\" json:\"if_source_generation_not_match,omitempty\"`\n\t// Makes the operation conditional on whether the source object's current\n\t// metageneration matches the given value.\n\tIfSourceMetagenerationMatch *int64 `protobuf:\"varint,13,opt,name=if_source_metageneration_match,json=ifSourceMetagenerationMatch,proto3,oneof\" json:\"if_source_metageneration_match,omitempty\"`\n\t// Makes the operation conditional on whether the source object's current\n\t// metageneration does not match the given value.\n\tIfSourceMetagenerationNotMatch *int64 `protobuf:\"varint,14,opt,name=if_source_metageneration_not_match,json=ifSourceMetagenerationNotMatch,proto3,oneof\" json:\"if_source_metageneration_not_match,omitempty\"`\n\t// The maximum number of bytes that will be rewritten per rewrite request.\n\t// Most callers\n\t// shouldn't need to specify this parameter - it is primarily in place to\n\t// support testing. If specified the value must be an integral multiple of\n\t// 1 MiB (1048576). Also, this only applies to requests where the source and\n\t// destination span locations and/or storage classes. Finally, this value must\n\t// not change across rewrite calls else you'll get an error that the\n\t// `rewriteToken` is invalid.\n\tMaxBytesRewrittenPerCall int64 `protobuf:\"varint,15,opt,name=max_bytes_rewritten_per_call,json=maxBytesRewrittenPerCall,proto3\" json:\"max_bytes_rewritten_per_call,omitempty\"`\n\t// The algorithm used to encrypt the source object, if any. Used if the source\n\t// object was encrypted with a Customer-Supplied Encryption Key.\n\tCopySourceEncryptionAlgorithm string `protobuf:\"bytes,16,opt,name=copy_source_encryption_algorithm,json=copySourceEncryptionAlgorithm,proto3\" json:\"copy_source_encryption_algorithm,omitempty\"`\n\t// The raw bytes (not base64-encoded) AES-256 encryption key used to encrypt\n\t// the source object, if it was encrypted with a Customer-Supplied Encryption\n\t// Key.\n\tCopySourceEncryptionKeyBytes []byte `protobuf:\"bytes,21,opt,name=copy_source_encryption_key_bytes,json=copySourceEncryptionKeyBytes,proto3\" json:\"copy_source_encryption_key_bytes,omitempty\"`\n\t// The raw bytes (not base64-encoded) SHA256 hash of the encryption key used\n\t// to encrypt the source object, if it was encrypted with a Customer-Supplied\n\t// Encryption Key.\n\tCopySourceEncryptionKeySha256Bytes []byte `protobuf:\"bytes,22,opt,name=copy_source_encryption_key_sha256_bytes,json=copySourceEncryptionKeySha256Bytes,proto3\" json:\"copy_source_encryption_key_sha256_bytes,omitempty\"`\n\t// A set of parameters common to Storage API requests concerning an object.\n\tCommonObjectRequestParams *CommonObjectRequestParams `protobuf:\"bytes,19,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3\" json:\"common_object_request_params,omitempty\"`\n\t// The checksums of the complete object. This will be used to validate the\n\t// destination object after rewriting.\n\tObjectChecksums *ObjectChecksums `protobuf:\"bytes,29,opt,name=object_checksums,json=objectChecksums,proto3\" json:\"object_checksums,omitempty\"`\n}\n\nfunc (x *RewriteObjectRequest) Reset() {\n\t*x = RewriteObjectRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[35]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *RewriteObjectRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RewriteObjectRequest) ProtoMessage() {}\n\nfunc (x *RewriteObjectRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[35]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RewriteObjectRequest.ProtoReflect.Descriptor instead.\nfunc (*RewriteObjectRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{35}\n}\n\nfunc (x *RewriteObjectRequest) GetDestinationName() string {\n\tif x != nil {\n\t\treturn x.DestinationName\n\t}\n\treturn \"\"\n}\n\nfunc (x *RewriteObjectRequest) GetDestinationBucket() string {\n\tif x != nil {\n\t\treturn x.DestinationBucket\n\t}\n\treturn \"\"\n}\n\nfunc (x *RewriteObjectRequest) GetDestinationKmsKey() string {\n\tif x != nil {\n\t\treturn x.DestinationKmsKey\n\t}\n\treturn \"\"\n}\n\nfunc (x *RewriteObjectRequest) GetDestination() *Object {\n\tif x != nil {\n\t\treturn x.Destination\n\t}\n\treturn nil\n}\n\nfunc (x *RewriteObjectRequest) GetSourceBucket() string {\n\tif x != nil {\n\t\treturn x.SourceBucket\n\t}\n\treturn \"\"\n}\n\nfunc (x *RewriteObjectRequest) GetSourceObject() string {\n\tif x != nil {\n\t\treturn x.SourceObject\n\t}\n\treturn \"\"\n}\n\nfunc (x *RewriteObjectRequest) GetSourceGeneration() int64 {\n\tif x != nil {\n\t\treturn x.SourceGeneration\n\t}\n\treturn 0\n}\n\nfunc (x *RewriteObjectRequest) GetRewriteToken() string {\n\tif x != nil {\n\t\treturn x.RewriteToken\n\t}\n\treturn \"\"\n}\n\nfunc (x *RewriteObjectRequest) GetDestinationPredefinedAcl() string {\n\tif x != nil {\n\t\treturn x.DestinationPredefinedAcl\n\t}\n\treturn \"\"\n}\n\nfunc (x *RewriteObjectRequest) GetIfGenerationMatch() int64 {\n\tif x != nil && x.IfGenerationMatch != nil {\n\t\treturn *x.IfGenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *RewriteObjectRequest) GetIfGenerationNotMatch() int64 {\n\tif x != nil && x.IfGenerationNotMatch != nil {\n\t\treturn *x.IfGenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *RewriteObjectRequest) GetIfMetagenerationMatch() int64 {\n\tif x != nil && x.IfMetagenerationMatch != nil {\n\t\treturn *x.IfMetagenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *RewriteObjectRequest) GetIfMetagenerationNotMatch() int64 {\n\tif x != nil && x.IfMetagenerationNotMatch != nil {\n\t\treturn *x.IfMetagenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *RewriteObjectRequest) GetIfSourceGenerationMatch() int64 {\n\tif x != nil && x.IfSourceGenerationMatch != nil {\n\t\treturn *x.IfSourceGenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *RewriteObjectRequest) GetIfSourceGenerationNotMatch() int64 {\n\tif x != nil && x.IfSourceGenerationNotMatch != nil {\n\t\treturn *x.IfSourceGenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *RewriteObjectRequest) GetIfSourceMetagenerationMatch() int64 {\n\tif x != nil && x.IfSourceMetagenerationMatch != nil {\n\t\treturn *x.IfSourceMetagenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *RewriteObjectRequest) GetIfSourceMetagenerationNotMatch() int64 {\n\tif x != nil && x.IfSourceMetagenerationNotMatch != nil {\n\t\treturn *x.IfSourceMetagenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *RewriteObjectRequest) GetMaxBytesRewrittenPerCall() int64 {\n\tif x != nil {\n\t\treturn x.MaxBytesRewrittenPerCall\n\t}\n\treturn 0\n}\n\nfunc (x *RewriteObjectRequest) GetCopySourceEncryptionAlgorithm() string {\n\tif x != nil {\n\t\treturn x.CopySourceEncryptionAlgorithm\n\t}\n\treturn \"\"\n}\n\nfunc (x *RewriteObjectRequest) GetCopySourceEncryptionKeyBytes() []byte {\n\tif x != nil {\n\t\treturn x.CopySourceEncryptionKeyBytes\n\t}\n\treturn nil\n}\n\nfunc (x *RewriteObjectRequest) GetCopySourceEncryptionKeySha256Bytes() []byte {\n\tif x != nil {\n\t\treturn x.CopySourceEncryptionKeySha256Bytes\n\t}\n\treturn nil\n}\n\nfunc (x *RewriteObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams {\n\tif x != nil {\n\t\treturn x.CommonObjectRequestParams\n\t}\n\treturn nil\n}\n\nfunc (x *RewriteObjectRequest) GetObjectChecksums() *ObjectChecksums {\n\tif x != nil {\n\t\treturn x.ObjectChecksums\n\t}\n\treturn nil\n}\n\n// A rewrite response.\ntype RewriteResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The total bytes written so far, which can be used to provide a waiting user\n\t// with a progress indicator. This property is always present in the response.\n\tTotalBytesRewritten int64 `protobuf:\"varint,1,opt,name=total_bytes_rewritten,json=totalBytesRewritten,proto3\" json:\"total_bytes_rewritten,omitempty\"`\n\t// The total size of the object being copied in bytes. This property is always\n\t// present in the response.\n\tObjectSize int64 `protobuf:\"varint,2,opt,name=object_size,json=objectSize,proto3\" json:\"object_size,omitempty\"`\n\t// `true` if the copy is finished; otherwise, `false` if\n\t// the copy is in progress. This property is always present in the response.\n\tDone bool `protobuf:\"varint,3,opt,name=done,proto3\" json:\"done,omitempty\"`\n\t// A token to use in subsequent requests to continue copying data. This token\n\t// is present in the response only when there is more data to copy.\n\tRewriteToken string `protobuf:\"bytes,4,opt,name=rewrite_token,json=rewriteToken,proto3\" json:\"rewrite_token,omitempty\"`\n\t// A resource containing the metadata for the copied-to object. This property\n\t// is present in the response only when copying completes.\n\tResource *Object `protobuf:\"bytes,5,opt,name=resource,proto3\" json:\"resource,omitempty\"`\n}\n\nfunc (x *RewriteResponse) Reset() {\n\t*x = RewriteResponse{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[36]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *RewriteResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*RewriteResponse) ProtoMessage() {}\n\nfunc (x *RewriteResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[36]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use RewriteResponse.ProtoReflect.Descriptor instead.\nfunc (*RewriteResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{36}\n}\n\nfunc (x *RewriteResponse) GetTotalBytesRewritten() int64 {\n\tif x != nil {\n\t\treturn x.TotalBytesRewritten\n\t}\n\treturn 0\n}\n\nfunc (x *RewriteResponse) GetObjectSize() int64 {\n\tif x != nil {\n\t\treturn x.ObjectSize\n\t}\n\treturn 0\n}\n\nfunc (x *RewriteResponse) GetDone() bool {\n\tif x != nil {\n\t\treturn x.Done\n\t}\n\treturn false\n}\n\nfunc (x *RewriteResponse) GetRewriteToken() string {\n\tif x != nil {\n\t\treturn x.RewriteToken\n\t}\n\treturn \"\"\n}\n\nfunc (x *RewriteResponse) GetResource() *Object {\n\tif x != nil {\n\t\treturn x.Resource\n\t}\n\treturn nil\n}\n\n// Request message for MoveObject.\ntype MoveObjectRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Name of the bucket in which the object resides.\n\tBucket string `protobuf:\"bytes,1,opt,name=bucket,proto3\" json:\"bucket,omitempty\"`\n\t// Required. Name of the source object.\n\tSourceObject string `protobuf:\"bytes,2,opt,name=source_object,json=sourceObject,proto3\" json:\"source_object,omitempty\"`\n\t// Required. Name of the destination object.\n\tDestinationObject string `protobuf:\"bytes,3,opt,name=destination_object,json=destinationObject,proto3\" json:\"destination_object,omitempty\"`\n\t// Optional. Makes the operation conditional on whether the source object's\n\t// current generation matches the given value. `if_source_generation_match`\n\t// and `if_source_generation_not_match` conditions are mutually exclusive:\n\t// it's an error for both of them to be set in the request.\n\tIfSourceGenerationMatch *int64 `protobuf:\"varint,4,opt,name=if_source_generation_match,json=ifSourceGenerationMatch,proto3,oneof\" json:\"if_source_generation_match,omitempty\"`\n\t// Optional. Makes the operation conditional on whether the source object's\n\t// current generation does not match the given value.\n\t// `if_source_generation_match` and `if_source_generation_not_match`\n\t// conditions are mutually exclusive: it's an error for both of them to be set\n\t// in the request.\n\tIfSourceGenerationNotMatch *int64 `protobuf:\"varint,5,opt,name=if_source_generation_not_match,json=ifSourceGenerationNotMatch,proto3,oneof\" json:\"if_source_generation_not_match,omitempty\"`\n\t// Optional. Makes the operation conditional on whether the source object's\n\t// current metageneration matches the given value.\n\t// `if_source_metageneration_match` and `if_source_metageneration_not_match`\n\t// conditions are mutually exclusive: it's an error for both of them to be set\n\t// in the request.\n\tIfSourceMetagenerationMatch *int64 `protobuf:\"varint,6,opt,name=if_source_metageneration_match,json=ifSourceMetagenerationMatch,proto3,oneof\" json:\"if_source_metageneration_match,omitempty\"`\n\t// Optional. Makes the operation conditional on whether the source object's\n\t// current metageneration does not match the given value.\n\t// `if_source_metageneration_match` and `if_source_metageneration_not_match`\n\t// conditions are mutually exclusive: it's an error for both of them to be set\n\t// in the request.\n\tIfSourceMetagenerationNotMatch *int64 `protobuf:\"varint,7,opt,name=if_source_metageneration_not_match,json=ifSourceMetagenerationNotMatch,proto3,oneof\" json:\"if_source_metageneration_not_match,omitempty\"`\n\t// Optional. Makes the operation conditional on whether the destination\n\t// object's current generation matches the given value. Setting to 0 makes the\n\t// operation succeed only if there are no live versions of the object.\n\t// `if_generation_match` and `if_generation_not_match` conditions are mutually\n\t// exclusive: it's an error for both of them to be set in the request.\n\tIfGenerationMatch *int64 `protobuf:\"varint,8,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof\" json:\"if_generation_match,omitempty\"`\n\t// Optional. Makes the operation conditional on whether the destination\n\t// object's current generation does not match the given value. If no live\n\t// object exists, the precondition fails. Setting to 0 makes the operation\n\t// succeed only if there is a live version of the object.\n\t// `if_generation_match` and `if_generation_not_match` conditions are mutually\n\t// exclusive: it's an error for both of them to be set in the request.\n\tIfGenerationNotMatch *int64 `protobuf:\"varint,9,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof\" json:\"if_generation_not_match,omitempty\"`\n\t// Optional. Makes the operation conditional on whether the destination\n\t// object's current metageneration matches the given value.\n\t// `if_metageneration_match` and `if_metageneration_not_match` conditions are\n\t// mutually exclusive: it's an error for both of them to be set in the\n\t// request.\n\tIfMetagenerationMatch *int64 `protobuf:\"varint,10,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof\" json:\"if_metageneration_match,omitempty\"`\n\t// Optional. Makes the operation conditional on whether the destination\n\t// object's current metageneration does not match the given value.\n\t// `if_metageneration_match` and `if_metageneration_not_match` conditions are\n\t// mutually exclusive: it's an error for both of them to be set in the\n\t// request.\n\tIfMetagenerationNotMatch *int64 `protobuf:\"varint,11,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof\" json:\"if_metageneration_not_match,omitempty\"`\n}\n\nfunc (x *MoveObjectRequest) Reset() {\n\t*x = MoveObjectRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[37]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *MoveObjectRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*MoveObjectRequest) ProtoMessage() {}\n\nfunc (x *MoveObjectRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[37]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use MoveObjectRequest.ProtoReflect.Descriptor instead.\nfunc (*MoveObjectRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{37}\n}\n\nfunc (x *MoveObjectRequest) GetBucket() string {\n\tif x != nil {\n\t\treturn x.Bucket\n\t}\n\treturn \"\"\n}\n\nfunc (x *MoveObjectRequest) GetSourceObject() string {\n\tif x != nil {\n\t\treturn x.SourceObject\n\t}\n\treturn \"\"\n}\n\nfunc (x *MoveObjectRequest) GetDestinationObject() string {\n\tif x != nil {\n\t\treturn x.DestinationObject\n\t}\n\treturn \"\"\n}\n\nfunc (x *MoveObjectRequest) GetIfSourceGenerationMatch() int64 {\n\tif x != nil && x.IfSourceGenerationMatch != nil {\n\t\treturn *x.IfSourceGenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *MoveObjectRequest) GetIfSourceGenerationNotMatch() int64 {\n\tif x != nil && x.IfSourceGenerationNotMatch != nil {\n\t\treturn *x.IfSourceGenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *MoveObjectRequest) GetIfSourceMetagenerationMatch() int64 {\n\tif x != nil && x.IfSourceMetagenerationMatch != nil {\n\t\treturn *x.IfSourceMetagenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *MoveObjectRequest) GetIfSourceMetagenerationNotMatch() int64 {\n\tif x != nil && x.IfSourceMetagenerationNotMatch != nil {\n\t\treturn *x.IfSourceMetagenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *MoveObjectRequest) GetIfGenerationMatch() int64 {\n\tif x != nil && x.IfGenerationMatch != nil {\n\t\treturn *x.IfGenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *MoveObjectRequest) GetIfGenerationNotMatch() int64 {\n\tif x != nil && x.IfGenerationNotMatch != nil {\n\t\treturn *x.IfGenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *MoveObjectRequest) GetIfMetagenerationMatch() int64 {\n\tif x != nil && x.IfMetagenerationMatch != nil {\n\t\treturn *x.IfMetagenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *MoveObjectRequest) GetIfMetagenerationNotMatch() int64 {\n\tif x != nil && x.IfMetagenerationNotMatch != nil {\n\t\treturn *x.IfMetagenerationNotMatch\n\t}\n\treturn 0\n}\n\n// Request message StartResumableWrite.\ntype StartResumableWriteRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. Contains the information necessary to start a resumable write.\n\tWriteObjectSpec *WriteObjectSpec `protobuf:\"bytes,1,opt,name=write_object_spec,json=writeObjectSpec,proto3\" json:\"write_object_spec,omitempty\"`\n\t// A set of parameters common to Storage API requests related to an object.\n\tCommonObjectRequestParams *CommonObjectRequestParams `protobuf:\"bytes,3,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3\" json:\"common_object_request_params,omitempty\"`\n\t// The checksums of the complete object. This is used to validate the\n\t// uploaded object. For each upload, `object_checksums` can be provided when\n\t// initiating a resumable upload with`StartResumableWriteRequest` or when\n\t// completing a write with `WriteObjectRequest` with\n\t// `finish_write` set to `true`.\n\tObjectChecksums *ObjectChecksums `protobuf:\"bytes,5,opt,name=object_checksums,json=objectChecksums,proto3\" json:\"object_checksums,omitempty\"`\n}\n\nfunc (x *StartResumableWriteRequest) Reset() {\n\t*x = StartResumableWriteRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[38]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *StartResumableWriteRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*StartResumableWriteRequest) ProtoMessage() {}\n\nfunc (x *StartResumableWriteRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[38]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use StartResumableWriteRequest.ProtoReflect.Descriptor instead.\nfunc (*StartResumableWriteRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{38}\n}\n\nfunc (x *StartResumableWriteRequest) GetWriteObjectSpec() *WriteObjectSpec {\n\tif x != nil {\n\t\treturn x.WriteObjectSpec\n\t}\n\treturn nil\n}\n\nfunc (x *StartResumableWriteRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams {\n\tif x != nil {\n\t\treturn x.CommonObjectRequestParams\n\t}\n\treturn nil\n}\n\nfunc (x *StartResumableWriteRequest) GetObjectChecksums() *ObjectChecksums {\n\tif x != nil {\n\t\treturn x.ObjectChecksums\n\t}\n\treturn nil\n}\n\n// Response object for `StartResumableWrite`.\ntype StartResumableWriteResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// A unique identifier for the initiated resumable write operation.\n\t// As the ID grants write access, you should keep it confidential during\n\t// the upload to prevent unauthorized access and data tampering during your\n\t// upload. This ID should be included in subsequent `WriteObject` requests to\n\t// upload the object data.\n\tUploadId string `protobuf:\"bytes,1,opt,name=upload_id,json=uploadId,proto3\" json:\"upload_id,omitempty\"`\n}\n\nfunc (x *StartResumableWriteResponse) Reset() {\n\t*x = StartResumableWriteResponse{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[39]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *StartResumableWriteResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*StartResumableWriteResponse) ProtoMessage() {}\n\nfunc (x *StartResumableWriteResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[39]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use StartResumableWriteResponse.ProtoReflect.Descriptor instead.\nfunc (*StartResumableWriteResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{39}\n}\n\nfunc (x *StartResumableWriteResponse) GetUploadId() string {\n\tif x != nil {\n\t\treturn x.UploadId\n\t}\n\treturn \"\"\n}\n\n// Request message for UpdateObject.\ntype UpdateObjectRequest struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The object to update.\n\t// The object's bucket and name fields are used to identify the object to\n\t// update. If present, the object's generation field selects a specific\n\t// revision of this object whose metadata should be updated. Otherwise,\n\t// assumes the live version of the object.\n\tObject *Object `protobuf:\"bytes,1,opt,name=object,proto3\" json:\"object,omitempty\"`\n\t// Makes the operation conditional on whether the object's current generation\n\t// matches the given value. Setting to 0 makes the operation succeed only if\n\t// there are no live versions of the object.\n\tIfGenerationMatch *int64 `protobuf:\"varint,2,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof\" json:\"if_generation_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's live generation\n\t// does not match the given value. If no live object exists, the precondition\n\t// fails. Setting to 0 makes the operation succeed only if there is a live\n\t// version of the object.\n\tIfGenerationNotMatch *int64 `protobuf:\"varint,3,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof\" json:\"if_generation_not_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's current\n\t// metageneration matches the given value.\n\tIfMetagenerationMatch *int64 `protobuf:\"varint,4,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof\" json:\"if_metageneration_match,omitempty\"`\n\t// Makes the operation conditional on whether the object's current\n\t// metageneration does not match the given value.\n\tIfMetagenerationNotMatch *int64 `protobuf:\"varint,5,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof\" json:\"if_metageneration_not_match,omitempty\"`\n\t// Apply a predefined set of access controls to this object.\n\t// Valid values are \"authenticatedRead\", \"bucketOwnerFullControl\",\n\t// \"bucketOwnerRead\", \"private\", \"projectPrivate\", or \"publicRead\".\n\tPredefinedAcl string `protobuf:\"bytes,10,opt,name=predefined_acl,json=predefinedAcl,proto3\" json:\"predefined_acl,omitempty\"`\n\t// Required. List of fields to be updated.\n\t//\n\t// To specify ALL fields, equivalent to the JSON API's \"update\" function,\n\t// specify a single field with the value `*`. Note: not recommended. If a new\n\t// field is introduced at a later time, an older client updating with the `*`\n\t// may accidentally reset the new field's value.\n\t//\n\t// Not specifying any fields is an error.\n\tUpdateMask *fieldmaskpb.FieldMask `protobuf:\"bytes,7,opt,name=update_mask,json=updateMask,proto3\" json:\"update_mask,omitempty\"`\n\t// A set of parameters common to Storage API requests concerning an object.\n\tCommonObjectRequestParams *CommonObjectRequestParams `protobuf:\"bytes,8,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3\" json:\"common_object_request_params,omitempty\"`\n}\n\nfunc (x *UpdateObjectRequest) Reset() {\n\t*x = UpdateObjectRequest{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[40]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *UpdateObjectRequest) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*UpdateObjectRequest) ProtoMessage() {}\n\nfunc (x *UpdateObjectRequest) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[40]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use UpdateObjectRequest.ProtoReflect.Descriptor instead.\nfunc (*UpdateObjectRequest) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{40}\n}\n\nfunc (x *UpdateObjectRequest) GetObject() *Object {\n\tif x != nil {\n\t\treturn x.Object\n\t}\n\treturn nil\n}\n\nfunc (x *UpdateObjectRequest) GetIfGenerationMatch() int64 {\n\tif x != nil && x.IfGenerationMatch != nil {\n\t\treturn *x.IfGenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateObjectRequest) GetIfGenerationNotMatch() int64 {\n\tif x != nil && x.IfGenerationNotMatch != nil {\n\t\treturn *x.IfGenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateObjectRequest) GetIfMetagenerationMatch() int64 {\n\tif x != nil && x.IfMetagenerationMatch != nil {\n\t\treturn *x.IfMetagenerationMatch\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateObjectRequest) GetIfMetagenerationNotMatch() int64 {\n\tif x != nil && x.IfMetagenerationNotMatch != nil {\n\t\treturn *x.IfMetagenerationNotMatch\n\t}\n\treturn 0\n}\n\nfunc (x *UpdateObjectRequest) GetPredefinedAcl() string {\n\tif x != nil {\n\t\treturn x.PredefinedAcl\n\t}\n\treturn \"\"\n}\n\nfunc (x *UpdateObjectRequest) GetUpdateMask() *fieldmaskpb.FieldMask {\n\tif x != nil {\n\t\treturn x.UpdateMask\n\t}\n\treturn nil\n}\n\nfunc (x *UpdateObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams {\n\tif x != nil {\n\t\treturn x.CommonObjectRequestParams\n\t}\n\treturn nil\n}\n\n// Parameters that can be passed to any object request.\ntype CommonObjectRequestParams struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Encryption algorithm used with the Customer-Supplied Encryption Keys\n\t// feature.\n\tEncryptionAlgorithm string `protobuf:\"bytes,1,opt,name=encryption_algorithm,json=encryptionAlgorithm,proto3\" json:\"encryption_algorithm,omitempty\"`\n\t// Encryption key used with the Customer-Supplied Encryption Keys feature.\n\t// In raw bytes format (not base64-encoded).\n\tEncryptionKeyBytes []byte `protobuf:\"bytes,4,opt,name=encryption_key_bytes,json=encryptionKeyBytes,proto3\" json:\"encryption_key_bytes,omitempty\"`\n\t// SHA256 hash of encryption key used with the Customer-Supplied Encryption\n\t// Keys feature.\n\tEncryptionKeySha256Bytes []byte `protobuf:\"bytes,5,opt,name=encryption_key_sha256_bytes,json=encryptionKeySha256Bytes,proto3\" json:\"encryption_key_sha256_bytes,omitempty\"`\n}\n\nfunc (x *CommonObjectRequestParams) Reset() {\n\t*x = CommonObjectRequestParams{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[41]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *CommonObjectRequestParams) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CommonObjectRequestParams) ProtoMessage() {}\n\nfunc (x *CommonObjectRequestParams) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[41]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CommonObjectRequestParams.ProtoReflect.Descriptor instead.\nfunc (*CommonObjectRequestParams) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{41}\n}\n\nfunc (x *CommonObjectRequestParams) GetEncryptionAlgorithm() string {\n\tif x != nil {\n\t\treturn x.EncryptionAlgorithm\n\t}\n\treturn \"\"\n}\n\nfunc (x *CommonObjectRequestParams) GetEncryptionKeyBytes() []byte {\n\tif x != nil {\n\t\treturn x.EncryptionKeyBytes\n\t}\n\treturn nil\n}\n\nfunc (x *CommonObjectRequestParams) GetEncryptionKeySha256Bytes() []byte {\n\tif x != nil {\n\t\treturn x.EncryptionKeySha256Bytes\n\t}\n\treturn nil\n}\n\n// Shared constants.\ntype ServiceConstants struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n}\n\nfunc (x *ServiceConstants) Reset() {\n\t*x = ServiceConstants{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[42]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ServiceConstants) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ServiceConstants) ProtoMessage() {}\n\nfunc (x *ServiceConstants) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[42]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ServiceConstants.ProtoReflect.Descriptor instead.\nfunc (*ServiceConstants) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{42}\n}\n\n// A bucket.\ntype Bucket struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Immutable. The name of the bucket.\n\t// Format: `projects/{project}/buckets/{bucket}`\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// Output only. The user-chosen part of the bucket name. The `{bucket}`\n\t// portion of the `name` field. For globally unique buckets, this is equal to\n\t// the \"bucket name\" of other Cloud Storage APIs. Example: \"pub\".\n\tBucketId string `protobuf:\"bytes,2,opt,name=bucket_id,json=bucketId,proto3\" json:\"bucket_id,omitempty\"`\n\t// The etag of the bucket.\n\t// If included in the metadata of an UpdateBucketRequest, the operation will\n\t// only be performed if the etag matches that of the bucket.\n\tEtag string `protobuf:\"bytes,29,opt,name=etag,proto3\" json:\"etag,omitempty\"`\n\t// Immutable. The project which owns this bucket, in the format of\n\t// \"projects/{projectIdentifier}\".\n\t// {projectIdentifier} can be the project ID or project number.\n\tProject string `protobuf:\"bytes,3,opt,name=project,proto3\" json:\"project,omitempty\"`\n\t// Output only. The metadata generation of this bucket.\n\tMetageneration int64 `protobuf:\"varint,4,opt,name=metageneration,proto3\" json:\"metageneration,omitempty\"`\n\t// Immutable. The location of the bucket. Object data for objects in the\n\t// bucket resides in physical storage within this region.  Defaults to `US`.\n\t// See the\n\t// [https://developers.google.com/storage/docs/concepts-techniques#specifyinglocations\"][developer's\n\t// guide] for the authoritative list. Attempting to update this field after\n\t// the bucket is created will result in an error.\n\tLocation string `protobuf:\"bytes,5,opt,name=location,proto3\" json:\"location,omitempty\"`\n\t// Output only. The location type of the bucket (region, dual-region,\n\t// multi-region, etc).\n\tLocationType string `protobuf:\"bytes,6,opt,name=location_type,json=locationType,proto3\" json:\"location_type,omitempty\"`\n\t// The bucket's default storage class, used whenever no storageClass is\n\t// specified for a newly-created object. This defines how objects in the\n\t// bucket are stored and determines the SLA and the cost of storage.\n\t// If this value is not specified when the bucket is created, it will default\n\t// to `STANDARD`. For more information, see\n\t// https://developers.google.com/storage/docs/storage-classes.\n\tStorageClass string `protobuf:\"bytes,7,opt,name=storage_class,json=storageClass,proto3\" json:\"storage_class,omitempty\"`\n\t// The recovery point objective for cross-region replication of the bucket.\n\t// Applicable only for dual- and multi-region buckets. \"DEFAULT\" uses default\n\t// replication. \"ASYNC_TURBO\" enables turbo replication, valid for dual-region\n\t// buckets only. If rpo is not specified when the bucket is created, it\n\t// defaults to \"DEFAULT\". For more information, see\n\t// https://cloud.google.com/storage/docs/availability-durability#turbo-replication.\n\tRpo string `protobuf:\"bytes,27,opt,name=rpo,proto3\" json:\"rpo,omitempty\"`\n\t// Access controls on the bucket.\n\t// If iam_config.uniform_bucket_level_access is enabled on this bucket,\n\t// requests to set, read, or modify acl is an error.\n\tAcl []*BucketAccessControl `protobuf:\"bytes,8,rep,name=acl,proto3\" json:\"acl,omitempty\"`\n\t// Default access controls to apply to new objects when no ACL is provided.\n\t// If iam_config.uniform_bucket_level_access is enabled on this bucket,\n\t// requests to set, read, or modify acl is an error.\n\tDefaultObjectAcl []*ObjectAccessControl `protobuf:\"bytes,9,rep,name=default_object_acl,json=defaultObjectAcl,proto3\" json:\"default_object_acl,omitempty\"`\n\t// The bucket's lifecycle config. See\n\t// [https://developers.google.com/storage/docs/lifecycle]Lifecycle Management]\n\t// for more information.\n\tLifecycle *Bucket_Lifecycle `protobuf:\"bytes,10,opt,name=lifecycle,proto3\" json:\"lifecycle,omitempty\"`\n\t// Output only. The creation time of the bucket.\n\tCreateTime *timestamppb.Timestamp `protobuf:\"bytes,11,opt,name=create_time,json=createTime,proto3\" json:\"create_time,omitempty\"`\n\t// The bucket's [https://www.w3.org/TR/cors/][Cross-Origin Resource Sharing]\n\t// (CORS) config.\n\tCors []*Bucket_Cors `protobuf:\"bytes,12,rep,name=cors,proto3\" json:\"cors,omitempty\"`\n\t// Output only. The modification time of the bucket.\n\tUpdateTime *timestamppb.Timestamp `protobuf:\"bytes,13,opt,name=update_time,json=updateTime,proto3\" json:\"update_time,omitempty\"`\n\t// The default value for event-based hold on newly created objects in this\n\t// bucket.  Event-based hold is a way to retain objects indefinitely until an\n\t// event occurs, signified by the\n\t// hold's release. After being released, such objects will be subject to\n\t// bucket-level retention (if any).  One sample use case of this flag is for\n\t// banks to hold loan documents for at least 3 years after loan is paid in\n\t// full. Here, bucket-level retention is 3 years and the event is loan being\n\t// paid in full. In this example, these objects will be held intact for any\n\t// number of years until the event has occurred (event-based hold on the\n\t// object is released) and then 3 more years after that. That means retention\n\t// duration of the objects begins from the moment event-based hold\n\t// transitioned from true to false.  Objects under event-based hold cannot be\n\t// deleted, overwritten or archived until the hold is removed.\n\tDefaultEventBasedHold bool `protobuf:\"varint,14,opt,name=default_event_based_hold,json=defaultEventBasedHold,proto3\" json:\"default_event_based_hold,omitempty\"`\n\t// User-provided labels, in key/value pairs.\n\tLabels map[string]string `protobuf:\"bytes,15,rep,name=labels,proto3\" json:\"labels,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\t// The bucket's website config, controlling how the service behaves\n\t// when accessing bucket contents as a web site. See the\n\t// [https://cloud.google.com/storage/docs/static-website][Static Website\n\t// Examples] for more information.\n\tWebsite *Bucket_Website `protobuf:\"bytes,16,opt,name=website,proto3\" json:\"website,omitempty\"`\n\t// The bucket's versioning config.\n\tVersioning *Bucket_Versioning `protobuf:\"bytes,17,opt,name=versioning,proto3\" json:\"versioning,omitempty\"`\n\t// The bucket's logging config, which defines the destination bucket\n\t// and name prefix (if any) for the current bucket's logs.\n\tLogging *Bucket_Logging `protobuf:\"bytes,18,opt,name=logging,proto3\" json:\"logging,omitempty\"`\n\t// Output only. The owner of the bucket. This is always the project team's\n\t// owner group.\n\tOwner *Owner `protobuf:\"bytes,19,opt,name=owner,proto3\" json:\"owner,omitempty\"`\n\t// Encryption config for a bucket.\n\tEncryption *Bucket_Encryption `protobuf:\"bytes,20,opt,name=encryption,proto3\" json:\"encryption,omitempty\"`\n\t// The bucket's billing config.\n\tBilling *Bucket_Billing `protobuf:\"bytes,21,opt,name=billing,proto3\" json:\"billing,omitempty\"`\n\t// The bucket's retention policy. The retention policy enforces a minimum\n\t// retention time for all objects contained in the bucket, based on their\n\t// creation time. Any attempt to overwrite or delete objects younger than the\n\t// retention period will result in a PERMISSION_DENIED error.  An unlocked\n\t// retention policy can be modified or removed from the bucket via a\n\t// storage.buckets.update operation. A locked retention policy cannot be\n\t// removed or shortened in duration for the lifetime of the bucket.\n\t// Attempting to remove or decrease period of a locked retention policy will\n\t// result in a PERMISSION_DENIED error.\n\tRetentionPolicy *Bucket_RetentionPolicy `protobuf:\"bytes,22,opt,name=retention_policy,json=retentionPolicy,proto3\" json:\"retention_policy,omitempty\"`\n\t// The bucket's IAM config.\n\tIamConfig *Bucket_IamConfig `protobuf:\"bytes,23,opt,name=iam_config,json=iamConfig,proto3\" json:\"iam_config,omitempty\"`\n\t// Reserved for future use.\n\tSatisfiesPzs bool `protobuf:\"varint,25,opt,name=satisfies_pzs,json=satisfiesPzs,proto3\" json:\"satisfies_pzs,omitempty\"`\n\t// Configuration that, if present, specifies the data placement for a\n\t// [https://cloud.google.com/storage/docs/locations#location-dr][configurable\n\t// dual-region].\n\tCustomPlacementConfig *Bucket_CustomPlacementConfig `protobuf:\"bytes,26,opt,name=custom_placement_config,json=customPlacementConfig,proto3\" json:\"custom_placement_config,omitempty\"`\n\t// The bucket's Autoclass configuration. If there is no configuration, the\n\t// Autoclass feature will be disabled and have no effect on the bucket.\n\tAutoclass *Bucket_Autoclass `protobuf:\"bytes,28,opt,name=autoclass,proto3\" json:\"autoclass,omitempty\"`\n\t// Optional. The bucket's hierarchical namespace configuration. If there is no\n\t// configuration, the hierarchical namespace feature will be disabled and have\n\t// no effect on the bucket.\n\tHierarchicalNamespace *Bucket_HierarchicalNamespace `protobuf:\"bytes,32,opt,name=hierarchical_namespace,json=hierarchicalNamespace,proto3\" json:\"hierarchical_namespace,omitempty\"`\n\t// Optional. The bucket's soft delete policy. The soft delete policy prevents\n\t// soft-deleted objects from being permanently deleted.\n\tSoftDeletePolicy *Bucket_SoftDeletePolicy `protobuf:\"bytes,31,opt,name=soft_delete_policy,json=softDeletePolicy,proto3\" json:\"soft_delete_policy,omitempty\"`\n}\n\nfunc (x *Bucket) Reset() {\n\t*x = Bucket{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[43]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Bucket) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bucket) ProtoMessage() {}\n\nfunc (x *Bucket) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[43]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bucket.ProtoReflect.Descriptor instead.\nfunc (*Bucket) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43}\n}\n\nfunc (x *Bucket) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Bucket) GetBucketId() string {\n\tif x != nil {\n\t\treturn x.BucketId\n\t}\n\treturn \"\"\n}\n\nfunc (x *Bucket) GetEtag() string {\n\tif x != nil {\n\t\treturn x.Etag\n\t}\n\treturn \"\"\n}\n\nfunc (x *Bucket) GetProject() string {\n\tif x != nil {\n\t\treturn x.Project\n\t}\n\treturn \"\"\n}\n\nfunc (x *Bucket) GetMetageneration() int64 {\n\tif x != nil {\n\t\treturn x.Metageneration\n\t}\n\treturn 0\n}\n\nfunc (x *Bucket) GetLocation() string {\n\tif x != nil {\n\t\treturn x.Location\n\t}\n\treturn \"\"\n}\n\nfunc (x *Bucket) GetLocationType() string {\n\tif x != nil {\n\t\treturn x.LocationType\n\t}\n\treturn \"\"\n}\n\nfunc (x *Bucket) GetStorageClass() string {\n\tif x != nil {\n\t\treturn x.StorageClass\n\t}\n\treturn \"\"\n}\n\nfunc (x *Bucket) GetRpo() string {\n\tif x != nil {\n\t\treturn x.Rpo\n\t}\n\treturn \"\"\n}\n\nfunc (x *Bucket) GetAcl() []*BucketAccessControl {\n\tif x != nil {\n\t\treturn x.Acl\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket) GetDefaultObjectAcl() []*ObjectAccessControl {\n\tif x != nil {\n\t\treturn x.DefaultObjectAcl\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket) GetLifecycle() *Bucket_Lifecycle {\n\tif x != nil {\n\t\treturn x.Lifecycle\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket) GetCreateTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.CreateTime\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket) GetCors() []*Bucket_Cors {\n\tif x != nil {\n\t\treturn x.Cors\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket) GetUpdateTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.UpdateTime\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket) GetDefaultEventBasedHold() bool {\n\tif x != nil {\n\t\treturn x.DefaultEventBasedHold\n\t}\n\treturn false\n}\n\nfunc (x *Bucket) GetLabels() map[string]string {\n\tif x != nil {\n\t\treturn x.Labels\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket) GetWebsite() *Bucket_Website {\n\tif x != nil {\n\t\treturn x.Website\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket) GetVersioning() *Bucket_Versioning {\n\tif x != nil {\n\t\treturn x.Versioning\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket) GetLogging() *Bucket_Logging {\n\tif x != nil {\n\t\treturn x.Logging\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket) GetOwner() *Owner {\n\tif x != nil {\n\t\treturn x.Owner\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket) GetEncryption() *Bucket_Encryption {\n\tif x != nil {\n\t\treturn x.Encryption\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket) GetBilling() *Bucket_Billing {\n\tif x != nil {\n\t\treturn x.Billing\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket) GetRetentionPolicy() *Bucket_RetentionPolicy {\n\tif x != nil {\n\t\treturn x.RetentionPolicy\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket) GetIamConfig() *Bucket_IamConfig {\n\tif x != nil {\n\t\treturn x.IamConfig\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket) GetSatisfiesPzs() bool {\n\tif x != nil {\n\t\treturn x.SatisfiesPzs\n\t}\n\treturn false\n}\n\nfunc (x *Bucket) GetCustomPlacementConfig() *Bucket_CustomPlacementConfig {\n\tif x != nil {\n\t\treturn x.CustomPlacementConfig\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket) GetAutoclass() *Bucket_Autoclass {\n\tif x != nil {\n\t\treturn x.Autoclass\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket) GetHierarchicalNamespace() *Bucket_HierarchicalNamespace {\n\tif x != nil {\n\t\treturn x.HierarchicalNamespace\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket) GetSoftDeletePolicy() *Bucket_SoftDeletePolicy {\n\tif x != nil {\n\t\treturn x.SoftDeletePolicy\n\t}\n\treturn nil\n}\n\n// An access-control entry.\ntype BucketAccessControl struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The access permission for the entity.\n\tRole string `protobuf:\"bytes,1,opt,name=role,proto3\" json:\"role,omitempty\"`\n\t// The ID of the access-control entry.\n\tId string `protobuf:\"bytes,2,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// The entity holding the permission, in one of the following forms:\n\t// * `user-{userid}`\n\t// * `user-{email}`\n\t// * `group-{groupid}`\n\t// * `group-{email}`\n\t// * `domain-{domain}`\n\t// * `project-{team}-{projectnumber}`\n\t// * `project-{team}-{projectid}`\n\t// * `allUsers`\n\t// * `allAuthenticatedUsers`\n\t// Examples:\n\t// * The user `liz@example.com` would be `user-liz@example.com`.\n\t// * The group `example@googlegroups.com` would be\n\t// `group-example@googlegroups.com`\n\t// * All members of the Google Apps for Business domain `example.com` would be\n\t// `domain-example.com`\n\t// For project entities, `project-{team}-{projectnumber}` format will be\n\t// returned on response.\n\tEntity string `protobuf:\"bytes,3,opt,name=entity,proto3\" json:\"entity,omitempty\"`\n\t// Output only. The alternative entity format, if exists. For project\n\t// entities, `project-{team}-{projectid}` format will be returned on response.\n\tEntityAlt string `protobuf:\"bytes,9,opt,name=entity_alt,json=entityAlt,proto3\" json:\"entity_alt,omitempty\"`\n\t// The ID for the entity, if any.\n\tEntityId string `protobuf:\"bytes,4,opt,name=entity_id,json=entityId,proto3\" json:\"entity_id,omitempty\"`\n\t// The etag of the BucketAccessControl.\n\t// If included in the metadata of an update or delete request message, the\n\t// operation operation will only be performed if the etag matches that of the\n\t// bucket's BucketAccessControl.\n\tEtag string `protobuf:\"bytes,8,opt,name=etag,proto3\" json:\"etag,omitempty\"`\n\t// The email address associated with the entity, if any.\n\tEmail string `protobuf:\"bytes,5,opt,name=email,proto3\" json:\"email,omitempty\"`\n\t// The domain associated with the entity, if any.\n\tDomain string `protobuf:\"bytes,6,opt,name=domain,proto3\" json:\"domain,omitempty\"`\n\t// The project team associated with the entity, if any.\n\tProjectTeam *ProjectTeam `protobuf:\"bytes,7,opt,name=project_team,json=projectTeam,proto3\" json:\"project_team,omitempty\"`\n}\n\nfunc (x *BucketAccessControl) Reset() {\n\t*x = BucketAccessControl{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[44]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *BucketAccessControl) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*BucketAccessControl) ProtoMessage() {}\n\nfunc (x *BucketAccessControl) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[44]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use BucketAccessControl.ProtoReflect.Descriptor instead.\nfunc (*BucketAccessControl) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{44}\n}\n\nfunc (x *BucketAccessControl) GetRole() string {\n\tif x != nil {\n\t\treturn x.Role\n\t}\n\treturn \"\"\n}\n\nfunc (x *BucketAccessControl) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *BucketAccessControl) GetEntity() string {\n\tif x != nil {\n\t\treturn x.Entity\n\t}\n\treturn \"\"\n}\n\nfunc (x *BucketAccessControl) GetEntityAlt() string {\n\tif x != nil {\n\t\treturn x.EntityAlt\n\t}\n\treturn \"\"\n}\n\nfunc (x *BucketAccessControl) GetEntityId() string {\n\tif x != nil {\n\t\treturn x.EntityId\n\t}\n\treturn \"\"\n}\n\nfunc (x *BucketAccessControl) GetEtag() string {\n\tif x != nil {\n\t\treturn x.Etag\n\t}\n\treturn \"\"\n}\n\nfunc (x *BucketAccessControl) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *BucketAccessControl) GetDomain() string {\n\tif x != nil {\n\t\treturn x.Domain\n\t}\n\treturn \"\"\n}\n\nfunc (x *BucketAccessControl) GetProjectTeam() *ProjectTeam {\n\tif x != nil {\n\t\treturn x.ProjectTeam\n\t}\n\treturn nil\n}\n\n// Message used to convey content being read or written, along with an optional\n// checksum.\ntype ChecksummedData struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Optional. The data.\n\tContent []byte `protobuf:\"bytes,1,opt,name=content,proto3\" json:\"content,omitempty\"`\n\t// If set, the CRC32C digest of the content field.\n\tCrc32C *uint32 `protobuf:\"fixed32,2,opt,name=crc32c,proto3,oneof\" json:\"crc32c,omitempty\"`\n}\n\nfunc (x *ChecksummedData) Reset() {\n\t*x = ChecksummedData{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[45]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ChecksummedData) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ChecksummedData) ProtoMessage() {}\n\nfunc (x *ChecksummedData) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[45]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ChecksummedData.ProtoReflect.Descriptor instead.\nfunc (*ChecksummedData) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{45}\n}\n\nfunc (x *ChecksummedData) GetContent() []byte {\n\tif x != nil {\n\t\treturn x.Content\n\t}\n\treturn nil\n}\n\nfunc (x *ChecksummedData) GetCrc32C() uint32 {\n\tif x != nil && x.Crc32C != nil {\n\t\treturn *x.Crc32C\n\t}\n\treturn 0\n}\n\n// Message used for storing full (not subrange) object checksums.\ntype ObjectChecksums struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// CRC32C digest of the object data. Computed by the Cloud Storage service for\n\t// all written objects.\n\t// If set in a WriteObjectRequest, service will validate that the stored\n\t// object matches this checksum.\n\tCrc32C *uint32 `protobuf:\"fixed32,1,opt,name=crc32c,proto3,oneof\" json:\"crc32c,omitempty\"`\n\t// 128 bit MD5 hash of the object data.\n\t// For more information about using the MD5 hash, see\n\t// [https://cloud.google.com/storage/docs/hashes-etags#json-api][Hashes and\n\t// ETags: Best Practices].\n\t// Not all objects will provide an MD5 hash. For example, composite objects\n\t// provide only crc32c hashes. This value is equivalent to running `cat\n\t// object.txt | openssl md5 -binary`\n\tMd5Hash []byte `protobuf:\"bytes,2,opt,name=md5_hash,json=md5Hash,proto3\" json:\"md5_hash,omitempty\"`\n}\n\nfunc (x *ObjectChecksums) Reset() {\n\t*x = ObjectChecksums{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[46]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ObjectChecksums) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ObjectChecksums) ProtoMessage() {}\n\nfunc (x *ObjectChecksums) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[46]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ObjectChecksums.ProtoReflect.Descriptor instead.\nfunc (*ObjectChecksums) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{46}\n}\n\nfunc (x *ObjectChecksums) GetCrc32C() uint32 {\n\tif x != nil && x.Crc32C != nil {\n\t\treturn *x.Crc32C\n\t}\n\treturn 0\n}\n\nfunc (x *ObjectChecksums) GetMd5Hash() []byte {\n\tif x != nil {\n\t\treturn x.Md5Hash\n\t}\n\treturn nil\n}\n\n// Describes the Customer-Supplied Encryption Key mechanism used to store an\n// Object's data at rest.\ntype CustomerEncryption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The encryption algorithm.\n\tEncryptionAlgorithm string `protobuf:\"bytes,1,opt,name=encryption_algorithm,json=encryptionAlgorithm,proto3\" json:\"encryption_algorithm,omitempty\"`\n\t// SHA256 hash value of the encryption key.\n\t// In raw bytes format (not base64-encoded).\n\tKeySha256Bytes []byte `protobuf:\"bytes,3,opt,name=key_sha256_bytes,json=keySha256Bytes,proto3\" json:\"key_sha256_bytes,omitempty\"`\n}\n\nfunc (x *CustomerEncryption) Reset() {\n\t*x = CustomerEncryption{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[47]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *CustomerEncryption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*CustomerEncryption) ProtoMessage() {}\n\nfunc (x *CustomerEncryption) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[47]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use CustomerEncryption.ProtoReflect.Descriptor instead.\nfunc (*CustomerEncryption) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{47}\n}\n\nfunc (x *CustomerEncryption) GetEncryptionAlgorithm() string {\n\tif x != nil {\n\t\treturn x.EncryptionAlgorithm\n\t}\n\treturn \"\"\n}\n\nfunc (x *CustomerEncryption) GetKeySha256Bytes() []byte {\n\tif x != nil {\n\t\treturn x.KeySha256Bytes\n\t}\n\treturn nil\n}\n\n// An object.\ntype Object struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Immutable. The name of this object. Nearly any sequence of unicode\n\t// characters is valid. See\n\t// [Guidelines](https://cloud.google.com/storage/docs/objects#naming).\n\t// Example: `test.txt`\n\t// The `name` field by itself does not uniquely identify a Cloud Storage\n\t// object. A Cloud Storage object is uniquely identified by the tuple of\n\t// (bucket, object, generation).\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// Immutable. The name of the bucket containing this object.\n\tBucket string `protobuf:\"bytes,2,opt,name=bucket,proto3\" json:\"bucket,omitempty\"`\n\t// The etag of the object.\n\t// If included in the metadata of an update or delete request message, the\n\t// operation will only be performed if the etag matches that of the live\n\t// object.\n\tEtag string `protobuf:\"bytes,27,opt,name=etag,proto3\" json:\"etag,omitempty\"`\n\t// Immutable. The content generation of this object. Used for object\n\t// versioning.\n\tGeneration int64 `protobuf:\"varint,3,opt,name=generation,proto3\" json:\"generation,omitempty\"`\n\t// Output only. Restore token used to differentiate deleted objects with the\n\t// same name and generation. This field is output only, and only set for\n\t// deleted objects in HNS buckets.\n\tRestoreToken *string `protobuf:\"bytes,35,opt,name=restore_token,json=restoreToken,proto3,oneof\" json:\"restore_token,omitempty\"`\n\t// Output only. The version of the metadata for this generation of this\n\t// object. Used for preconditions and for detecting changes in metadata. A\n\t// metageneration number is only meaningful in the context of a particular\n\t// generation of a particular object.\n\tMetageneration int64 `protobuf:\"varint,4,opt,name=metageneration,proto3\" json:\"metageneration,omitempty\"`\n\t// Storage class of the object.\n\tStorageClass string `protobuf:\"bytes,5,opt,name=storage_class,json=storageClass,proto3\" json:\"storage_class,omitempty\"`\n\t// Output only. Content-Length of the object data in bytes, matching\n\t// [https://tools.ietf.org/html/rfc7230#section-3.3.2][RFC 7230 §3.3.2].\n\tSize int64 `protobuf:\"varint,6,opt,name=size,proto3\" json:\"size,omitempty\"`\n\t// Content-Encoding of the object data, matching\n\t// [https://tools.ietf.org/html/rfc7231#section-3.1.2.2][RFC 7231 §3.1.2.2]\n\tContentEncoding string `protobuf:\"bytes,7,opt,name=content_encoding,json=contentEncoding,proto3\" json:\"content_encoding,omitempty\"`\n\t// Content-Disposition of the object data, matching\n\t// [https://tools.ietf.org/html/rfc6266][RFC 6266].\n\tContentDisposition string `protobuf:\"bytes,8,opt,name=content_disposition,json=contentDisposition,proto3\" json:\"content_disposition,omitempty\"`\n\t// Cache-Control directive for the object data, matching\n\t// [https://tools.ietf.org/html/rfc7234#section-5.2\"][RFC 7234 §5.2].\n\t// If omitted, and the object is accessible to all anonymous users, the\n\t// default will be `public, max-age=3600`.\n\tCacheControl string `protobuf:\"bytes,9,opt,name=cache_control,json=cacheControl,proto3\" json:\"cache_control,omitempty\"`\n\t// Access controls on the object.\n\t// If iam_config.uniform_bucket_level_access is enabled on the parent\n\t// bucket, requests to set, read, or modify acl is an error.\n\tAcl []*ObjectAccessControl `protobuf:\"bytes,10,rep,name=acl,proto3\" json:\"acl,omitempty\"`\n\t// Content-Language of the object data, matching\n\t// [https://tools.ietf.org/html/rfc7231#section-3.1.3.2][RFC 7231 §3.1.3.2].\n\tContentLanguage string `protobuf:\"bytes,11,opt,name=content_language,json=contentLanguage,proto3\" json:\"content_language,omitempty\"`\n\t// Output only. If this object is noncurrent, this is the time when the object\n\t// became noncurrent.\n\tDeleteTime *timestamppb.Timestamp `protobuf:\"bytes,12,opt,name=delete_time,json=deleteTime,proto3\" json:\"delete_time,omitempty\"`\n\t// Output only. The time when the object was finalized.\n\tFinalizeTime *timestamppb.Timestamp `protobuf:\"bytes,36,opt,name=finalize_time,json=finalizeTime,proto3\" json:\"finalize_time,omitempty\"`\n\t// Content-Type of the object data, matching\n\t// [https://tools.ietf.org/html/rfc7231#section-3.1.1.5][RFC 7231 §3.1.1.5].\n\t// If an object is stored without a Content-Type, it is served as\n\t// `application/octet-stream`.\n\tContentType string `protobuf:\"bytes,13,opt,name=content_type,json=contentType,proto3\" json:\"content_type,omitempty\"`\n\t// Output only. The creation time of the object.\n\tCreateTime *timestamppb.Timestamp `protobuf:\"bytes,14,opt,name=create_time,json=createTime,proto3\" json:\"create_time,omitempty\"`\n\t// Output only. Number of underlying components that make up this object.\n\t// Components are accumulated by compose operations.\n\tComponentCount int32 `protobuf:\"varint,15,opt,name=component_count,json=componentCount,proto3\" json:\"component_count,omitempty\"`\n\t// Output only. Hashes for the data part of this object. This field is used\n\t// for output only and will be silently ignored if provided in requests. The\n\t// checksums of the complete object regardless of data range. If the object is\n\t// downloaded in full, the client should compute one of these checksums over\n\t// the downloaded object and compare it against the value provided here.\n\tChecksums *ObjectChecksums `protobuf:\"bytes,16,opt,name=checksums,proto3\" json:\"checksums,omitempty\"`\n\t// Output only. The modification time of the object metadata.\n\t// Set initially to object creation time and then updated whenever any\n\t// metadata of the object changes. This includes changes made by a requester,\n\t// such as modifying custom metadata, as well as changes made by Cloud Storage\n\t// on behalf of a requester, such as changing the storage class based on an\n\t// Object Lifecycle Configuration.\n\tUpdateTime *timestamppb.Timestamp `protobuf:\"bytes,17,opt,name=update_time,json=updateTime,proto3\" json:\"update_time,omitempty\"`\n\t// Cloud KMS Key used to encrypt this object, if the object is encrypted by\n\t// such a key.\n\tKmsKey string `protobuf:\"bytes,18,opt,name=kms_key,json=kmsKey,proto3\" json:\"kms_key,omitempty\"`\n\t// Output only. The time at which the object's storage class was last changed.\n\t// When the object is initially created, it will be set to time_created.\n\tUpdateStorageClassTime *timestamppb.Timestamp `protobuf:\"bytes,19,opt,name=update_storage_class_time,json=updateStorageClassTime,proto3\" json:\"update_storage_class_time,omitempty\"`\n\t// Whether an object is under temporary hold. While this flag is set to true,\n\t// the object is protected against deletion and overwrites.  A common use case\n\t// of this flag is regulatory investigations where objects need to be retained\n\t// while the investigation is ongoing. Note that unlike event-based hold,\n\t// temporary hold does not impact retention expiration time of an object.\n\tTemporaryHold bool `protobuf:\"varint,20,opt,name=temporary_hold,json=temporaryHold,proto3\" json:\"temporary_hold,omitempty\"`\n\t// A server-determined value that specifies the earliest time that the\n\t// object's retention period expires.\n\t// Note 1: This field is not provided for objects with an active event-based\n\t// hold, since retention expiration is unknown until the hold is removed.\n\t// Note 2: This value can be provided even when temporary hold is set (so that\n\t// the user can reason about policy without having to first unset the\n\t// temporary hold).\n\tRetentionExpireTime *timestamppb.Timestamp `protobuf:\"bytes,21,opt,name=retention_expire_time,json=retentionExpireTime,proto3\" json:\"retention_expire_time,omitempty\"`\n\t// User-provided metadata, in key/value pairs.\n\tMetadata map[string]string `protobuf:\"bytes,22,rep,name=metadata,proto3\" json:\"metadata,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\t// Whether an object is under event-based hold.\n\t// An event-based hold is a way to force the retention of an object until\n\t// after some event occurs. Once the hold is released by explicitly setting\n\t// this field to false, the object will become subject to any bucket-level\n\t// retention policy, except that the retention duration will be calculated\n\t// from the time the event based hold was lifted, rather than the time the\n\t// object was created.\n\t//\n\t// In a WriteObject request, not setting this field implies that the value\n\t// should be taken from the parent bucket's \"default_event_based_hold\" field.\n\t// In a response, this field will always be set to true or false.\n\tEventBasedHold *bool `protobuf:\"varint,23,opt,name=event_based_hold,json=eventBasedHold,proto3,oneof\" json:\"event_based_hold,omitempty\"`\n\t// Output only. The owner of the object. This will always be the uploader of\n\t// the object.\n\tOwner *Owner `protobuf:\"bytes,24,opt,name=owner,proto3\" json:\"owner,omitempty\"`\n\t// Metadata of Customer-Supplied Encryption Key, if the object is encrypted by\n\t// such a key.\n\tCustomerEncryption *CustomerEncryption `protobuf:\"bytes,25,opt,name=customer_encryption,json=customerEncryption,proto3\" json:\"customer_encryption,omitempty\"`\n\t// A user-specified timestamp set on an object.\n\tCustomTime *timestamppb.Timestamp `protobuf:\"bytes,26,opt,name=custom_time,json=customTime,proto3\" json:\"custom_time,omitempty\"`\n\t// Output only. This is the time when the object became soft-deleted.\n\t//\n\t// Soft-deleted objects are only accessible if a soft_delete_policy is\n\t// enabled. Also see hard_delete_time.\n\tSoftDeleteTime *timestamppb.Timestamp `protobuf:\"bytes,28,opt,name=soft_delete_time,json=softDeleteTime,proto3,oneof\" json:\"soft_delete_time,omitempty\"`\n\t// Output only. The time when the object will be permanently deleted.\n\t//\n\t// Only set when an object becomes soft-deleted with a soft_delete_policy.\n\t// Otherwise, the object will not be accessible.\n\tHardDeleteTime *timestamppb.Timestamp `protobuf:\"bytes,29,opt,name=hard_delete_time,json=hardDeleteTime,proto3,oneof\" json:\"hard_delete_time,omitempty\"`\n}\n\nfunc (x *Object) Reset() {\n\t*x = Object{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[48]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Object) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Object) ProtoMessage() {}\n\nfunc (x *Object) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[48]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Object.ProtoReflect.Descriptor instead.\nfunc (*Object) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{48}\n}\n\nfunc (x *Object) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *Object) GetBucket() string {\n\tif x != nil {\n\t\treturn x.Bucket\n\t}\n\treturn \"\"\n}\n\nfunc (x *Object) GetEtag() string {\n\tif x != nil {\n\t\treturn x.Etag\n\t}\n\treturn \"\"\n}\n\nfunc (x *Object) GetGeneration() int64 {\n\tif x != nil {\n\t\treturn x.Generation\n\t}\n\treturn 0\n}\n\nfunc (x *Object) GetRestoreToken() string {\n\tif x != nil && x.RestoreToken != nil {\n\t\treturn *x.RestoreToken\n\t}\n\treturn \"\"\n}\n\nfunc (x *Object) GetMetageneration() int64 {\n\tif x != nil {\n\t\treturn x.Metageneration\n\t}\n\treturn 0\n}\n\nfunc (x *Object) GetStorageClass() string {\n\tif x != nil {\n\t\treturn x.StorageClass\n\t}\n\treturn \"\"\n}\n\nfunc (x *Object) GetSize() int64 {\n\tif x != nil {\n\t\treturn x.Size\n\t}\n\treturn 0\n}\n\nfunc (x *Object) GetContentEncoding() string {\n\tif x != nil {\n\t\treturn x.ContentEncoding\n\t}\n\treturn \"\"\n}\n\nfunc (x *Object) GetContentDisposition() string {\n\tif x != nil {\n\t\treturn x.ContentDisposition\n\t}\n\treturn \"\"\n}\n\nfunc (x *Object) GetCacheControl() string {\n\tif x != nil {\n\t\treturn x.CacheControl\n\t}\n\treturn \"\"\n}\n\nfunc (x *Object) GetAcl() []*ObjectAccessControl {\n\tif x != nil {\n\t\treturn x.Acl\n\t}\n\treturn nil\n}\n\nfunc (x *Object) GetContentLanguage() string {\n\tif x != nil {\n\t\treturn x.ContentLanguage\n\t}\n\treturn \"\"\n}\n\nfunc (x *Object) GetDeleteTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.DeleteTime\n\t}\n\treturn nil\n}\n\nfunc (x *Object) GetFinalizeTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.FinalizeTime\n\t}\n\treturn nil\n}\n\nfunc (x *Object) GetContentType() string {\n\tif x != nil {\n\t\treturn x.ContentType\n\t}\n\treturn \"\"\n}\n\nfunc (x *Object) GetCreateTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.CreateTime\n\t}\n\treturn nil\n}\n\nfunc (x *Object) GetComponentCount() int32 {\n\tif x != nil {\n\t\treturn x.ComponentCount\n\t}\n\treturn 0\n}\n\nfunc (x *Object) GetChecksums() *ObjectChecksums {\n\tif x != nil {\n\t\treturn x.Checksums\n\t}\n\treturn nil\n}\n\nfunc (x *Object) GetUpdateTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.UpdateTime\n\t}\n\treturn nil\n}\n\nfunc (x *Object) GetKmsKey() string {\n\tif x != nil {\n\t\treturn x.KmsKey\n\t}\n\treturn \"\"\n}\n\nfunc (x *Object) GetUpdateStorageClassTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.UpdateStorageClassTime\n\t}\n\treturn nil\n}\n\nfunc (x *Object) GetTemporaryHold() bool {\n\tif x != nil {\n\t\treturn x.TemporaryHold\n\t}\n\treturn false\n}\n\nfunc (x *Object) GetRetentionExpireTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.RetentionExpireTime\n\t}\n\treturn nil\n}\n\nfunc (x *Object) GetMetadata() map[string]string {\n\tif x != nil {\n\t\treturn x.Metadata\n\t}\n\treturn nil\n}\n\nfunc (x *Object) GetEventBasedHold() bool {\n\tif x != nil && x.EventBasedHold != nil {\n\t\treturn *x.EventBasedHold\n\t}\n\treturn false\n}\n\nfunc (x *Object) GetOwner() *Owner {\n\tif x != nil {\n\t\treturn x.Owner\n\t}\n\treturn nil\n}\n\nfunc (x *Object) GetCustomerEncryption() *CustomerEncryption {\n\tif x != nil {\n\t\treturn x.CustomerEncryption\n\t}\n\treturn nil\n}\n\nfunc (x *Object) GetCustomTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.CustomTime\n\t}\n\treturn nil\n}\n\nfunc (x *Object) GetSoftDeleteTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.SoftDeleteTime\n\t}\n\treturn nil\n}\n\nfunc (x *Object) GetHardDeleteTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.HardDeleteTime\n\t}\n\treturn nil\n}\n\n// An access-control entry.\ntype ObjectAccessControl struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The access permission for the entity. One of the following values:\n\t// * `READER`\n\t// * `WRITER`\n\t// * `OWNER`\n\tRole string `protobuf:\"bytes,1,opt,name=role,proto3\" json:\"role,omitempty\"`\n\t// The ID of the access-control entry.\n\tId string `protobuf:\"bytes,2,opt,name=id,proto3\" json:\"id,omitempty\"`\n\t// The entity holding the permission, in one of the following forms:\n\t// * `user-{userid}`\n\t// * `user-{email}`\n\t// * `group-{groupid}`\n\t// * `group-{email}`\n\t// * `domain-{domain}`\n\t// * `project-{team}-{projectnumber}`\n\t// * `project-{team}-{projectid}`\n\t// * `allUsers`\n\t// * `allAuthenticatedUsers`\n\t// Examples:\n\t// * The user `liz@example.com` would be `user-liz@example.com`.\n\t// * The group `example@googlegroups.com` would be\n\t// `group-example@googlegroups.com`.\n\t// * All members of the Google Apps for Business domain `example.com` would be\n\t// `domain-example.com`.\n\t// For project entities, `project-{team}-{projectnumber}` format will be\n\t// returned on response.\n\tEntity string `protobuf:\"bytes,3,opt,name=entity,proto3\" json:\"entity,omitempty\"`\n\t// Output only. The alternative entity format, if exists. For project\n\t// entities, `project-{team}-{projectid}` format will be returned on response.\n\tEntityAlt string `protobuf:\"bytes,9,opt,name=entity_alt,json=entityAlt,proto3\" json:\"entity_alt,omitempty\"`\n\t// The ID for the entity, if any.\n\tEntityId string `protobuf:\"bytes,4,opt,name=entity_id,json=entityId,proto3\" json:\"entity_id,omitempty\"`\n\t// The etag of the ObjectAccessControl.\n\t// If included in the metadata of an update or delete request message, the\n\t// operation will only be performed if the etag matches that of the live\n\t// object's ObjectAccessControl.\n\tEtag string `protobuf:\"bytes,8,opt,name=etag,proto3\" json:\"etag,omitempty\"`\n\t// The email address associated with the entity, if any.\n\tEmail string `protobuf:\"bytes,5,opt,name=email,proto3\" json:\"email,omitempty\"`\n\t// The domain associated with the entity, if any.\n\tDomain string `protobuf:\"bytes,6,opt,name=domain,proto3\" json:\"domain,omitempty\"`\n\t// The project team associated with the entity, if any.\n\tProjectTeam *ProjectTeam `protobuf:\"bytes,7,opt,name=project_team,json=projectTeam,proto3\" json:\"project_team,omitempty\"`\n}\n\nfunc (x *ObjectAccessControl) Reset() {\n\t*x = ObjectAccessControl{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[49]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ObjectAccessControl) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ObjectAccessControl) ProtoMessage() {}\n\nfunc (x *ObjectAccessControl) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[49]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ObjectAccessControl.ProtoReflect.Descriptor instead.\nfunc (*ObjectAccessControl) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{49}\n}\n\nfunc (x *ObjectAccessControl) GetRole() string {\n\tif x != nil {\n\t\treturn x.Role\n\t}\n\treturn \"\"\n}\n\nfunc (x *ObjectAccessControl) GetId() string {\n\tif x != nil {\n\t\treturn x.Id\n\t}\n\treturn \"\"\n}\n\nfunc (x *ObjectAccessControl) GetEntity() string {\n\tif x != nil {\n\t\treturn x.Entity\n\t}\n\treturn \"\"\n}\n\nfunc (x *ObjectAccessControl) GetEntityAlt() string {\n\tif x != nil {\n\t\treturn x.EntityAlt\n\t}\n\treturn \"\"\n}\n\nfunc (x *ObjectAccessControl) GetEntityId() string {\n\tif x != nil {\n\t\treturn x.EntityId\n\t}\n\treturn \"\"\n}\n\nfunc (x *ObjectAccessControl) GetEtag() string {\n\tif x != nil {\n\t\treturn x.Etag\n\t}\n\treturn \"\"\n}\n\nfunc (x *ObjectAccessControl) GetEmail() string {\n\tif x != nil {\n\t\treturn x.Email\n\t}\n\treturn \"\"\n}\n\nfunc (x *ObjectAccessControl) GetDomain() string {\n\tif x != nil {\n\t\treturn x.Domain\n\t}\n\treturn \"\"\n}\n\nfunc (x *ObjectAccessControl) GetProjectTeam() *ProjectTeam {\n\tif x != nil {\n\t\treturn x.ProjectTeam\n\t}\n\treturn nil\n}\n\n// The result of a call to Objects.ListObjects\ntype ListObjectsResponse struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The list of items.\n\tObjects []*Object `protobuf:\"bytes,1,rep,name=objects,proto3\" json:\"objects,omitempty\"`\n\t// The list of prefixes of objects matching-but-not-listed up to and including\n\t// the requested delimiter.\n\tPrefixes []string `protobuf:\"bytes,2,rep,name=prefixes,proto3\" json:\"prefixes,omitempty\"`\n\t// The continuation token, used to page through large result sets. Provide\n\t// this value in a subsequent request to return the next page of results.\n\tNextPageToken string `protobuf:\"bytes,3,opt,name=next_page_token,json=nextPageToken,proto3\" json:\"next_page_token,omitempty\"`\n}\n\nfunc (x *ListObjectsResponse) Reset() {\n\t*x = ListObjectsResponse{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[50]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ListObjectsResponse) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ListObjectsResponse) ProtoMessage() {}\n\nfunc (x *ListObjectsResponse) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[50]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ListObjectsResponse.ProtoReflect.Descriptor instead.\nfunc (*ListObjectsResponse) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{50}\n}\n\nfunc (x *ListObjectsResponse) GetObjects() []*Object {\n\tif x != nil {\n\t\treturn x.Objects\n\t}\n\treturn nil\n}\n\nfunc (x *ListObjectsResponse) GetPrefixes() []string {\n\tif x != nil {\n\t\treturn x.Prefixes\n\t}\n\treturn nil\n}\n\nfunc (x *ListObjectsResponse) GetNextPageToken() string {\n\tif x != nil {\n\t\treturn x.NextPageToken\n\t}\n\treturn \"\"\n}\n\n// Represents the Viewers, Editors, or Owners of a given project.\ntype ProjectTeam struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The project number.\n\tProjectNumber string `protobuf:\"bytes,1,opt,name=project_number,json=projectNumber,proto3\" json:\"project_number,omitempty\"`\n\t// The team.\n\tTeam string `protobuf:\"bytes,2,opt,name=team,proto3\" json:\"team,omitempty\"`\n}\n\nfunc (x *ProjectTeam) Reset() {\n\t*x = ProjectTeam{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[51]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ProjectTeam) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProjectTeam) ProtoMessage() {}\n\nfunc (x *ProjectTeam) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[51]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProjectTeam.ProtoReflect.Descriptor instead.\nfunc (*ProjectTeam) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{51}\n}\n\nfunc (x *ProjectTeam) GetProjectNumber() string {\n\tif x != nil {\n\t\treturn x.ProjectNumber\n\t}\n\treturn \"\"\n}\n\nfunc (x *ProjectTeam) GetTeam() string {\n\tif x != nil {\n\t\treturn x.Team\n\t}\n\treturn \"\"\n}\n\n// The owner of a specific resource.\ntype Owner struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The entity, in the form `user-`*userId*.\n\tEntity string `protobuf:\"bytes,1,opt,name=entity,proto3\" json:\"entity,omitempty\"`\n\t// The ID for the entity.\n\tEntityId string `protobuf:\"bytes,2,opt,name=entity_id,json=entityId,proto3\" json:\"entity_id,omitempty\"`\n}\n\nfunc (x *Owner) Reset() {\n\t*x = Owner{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[52]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Owner) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Owner) ProtoMessage() {}\n\nfunc (x *Owner) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[52]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Owner.ProtoReflect.Descriptor instead.\nfunc (*Owner) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{52}\n}\n\nfunc (x *Owner) GetEntity() string {\n\tif x != nil {\n\t\treturn x.Entity\n\t}\n\treturn \"\"\n}\n\nfunc (x *Owner) GetEntityId() string {\n\tif x != nil {\n\t\treturn x.EntityId\n\t}\n\treturn \"\"\n}\n\n// Specifies a requested range of bytes to download.\ntype ContentRange struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The starting offset of the object data. This value is inclusive.\n\tStart int64 `protobuf:\"varint,1,opt,name=start,proto3\" json:\"start,omitempty\"`\n\t// The ending offset of the object data. This value is exclusive.\n\tEnd int64 `protobuf:\"varint,2,opt,name=end,proto3\" json:\"end,omitempty\"`\n\t// The complete length of the object data.\n\tCompleteLength int64 `protobuf:\"varint,3,opt,name=complete_length,json=completeLength,proto3\" json:\"complete_length,omitempty\"`\n}\n\nfunc (x *ContentRange) Reset() {\n\t*x = ContentRange{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[53]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ContentRange) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ContentRange) ProtoMessage() {}\n\nfunc (x *ContentRange) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[53]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ContentRange.ProtoReflect.Descriptor instead.\nfunc (*ContentRange) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{53}\n}\n\nfunc (x *ContentRange) GetStart() int64 {\n\tif x != nil {\n\t\treturn x.Start\n\t}\n\treturn 0\n}\n\nfunc (x *ContentRange) GetEnd() int64 {\n\tif x != nil {\n\t\treturn x.End\n\t}\n\treturn 0\n}\n\nfunc (x *ContentRange) GetCompleteLength() int64 {\n\tif x != nil {\n\t\treturn x.CompleteLength\n\t}\n\treturn 0\n}\n\n// Description of a source object for a composition request.\ntype ComposeObjectRequest_SourceObject struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Required. The source object's name. All source objects must reside in the\n\t// same bucket.\n\tName string `protobuf:\"bytes,1,opt,name=name,proto3\" json:\"name,omitempty\"`\n\t// The generation of this object to use as the source.\n\tGeneration int64 `protobuf:\"varint,2,opt,name=generation,proto3\" json:\"generation,omitempty\"`\n\t// Conditions that must be met for this operation to execute.\n\tObjectPreconditions *ComposeObjectRequest_SourceObject_ObjectPreconditions `protobuf:\"bytes,3,opt,name=object_preconditions,json=objectPreconditions,proto3\" json:\"object_preconditions,omitempty\"`\n}\n\nfunc (x *ComposeObjectRequest_SourceObject) Reset() {\n\t*x = ComposeObjectRequest_SourceObject{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[54]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ComposeObjectRequest_SourceObject) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ComposeObjectRequest_SourceObject) ProtoMessage() {}\n\nfunc (x *ComposeObjectRequest_SourceObject) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[54]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ComposeObjectRequest_SourceObject.ProtoReflect.Descriptor instead.\nfunc (*ComposeObjectRequest_SourceObject) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{7, 0}\n}\n\nfunc (x *ComposeObjectRequest_SourceObject) GetName() string {\n\tif x != nil {\n\t\treturn x.Name\n\t}\n\treturn \"\"\n}\n\nfunc (x *ComposeObjectRequest_SourceObject) GetGeneration() int64 {\n\tif x != nil {\n\t\treturn x.Generation\n\t}\n\treturn 0\n}\n\nfunc (x *ComposeObjectRequest_SourceObject) GetObjectPreconditions() *ComposeObjectRequest_SourceObject_ObjectPreconditions {\n\tif x != nil {\n\t\treturn x.ObjectPreconditions\n\t}\n\treturn nil\n}\n\n// Preconditions for a source object of a composition request.\ntype ComposeObjectRequest_SourceObject_ObjectPreconditions struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Only perform the composition if the generation of the source object\n\t// that would be used matches this value.  If this value and a generation\n\t// are both specified, they must be the same value or the call will fail.\n\tIfGenerationMatch *int64 `protobuf:\"varint,1,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof\" json:\"if_generation_match,omitempty\"`\n}\n\nfunc (x *ComposeObjectRequest_SourceObject_ObjectPreconditions) Reset() {\n\t*x = ComposeObjectRequest_SourceObject_ObjectPreconditions{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[55]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ComposeObjectRequest_SourceObject_ObjectPreconditions) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ComposeObjectRequest_SourceObject_ObjectPreconditions) ProtoMessage() {}\n\nfunc (x *ComposeObjectRequest_SourceObject_ObjectPreconditions) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[55]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ComposeObjectRequest_SourceObject_ObjectPreconditions.ProtoReflect.Descriptor instead.\nfunc (*ComposeObjectRequest_SourceObject_ObjectPreconditions) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{7, 0, 0}\n}\n\nfunc (x *ComposeObjectRequest_SourceObject_ObjectPreconditions) GetIfGenerationMatch() int64 {\n\tif x != nil && x.IfGenerationMatch != nil {\n\t\treturn *x.IfGenerationMatch\n\t}\n\treturn 0\n}\n\n// Billing properties of a bucket.\ntype Bucket_Billing struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// When set to true, Requester Pays is enabled for this bucket.\n\tRequesterPays bool `protobuf:\"varint,1,opt,name=requester_pays,json=requesterPays,proto3\" json:\"requester_pays,omitempty\"`\n}\n\nfunc (x *Bucket_Billing) Reset() {\n\t*x = Bucket_Billing{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[56]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Bucket_Billing) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bucket_Billing) ProtoMessage() {}\n\nfunc (x *Bucket_Billing) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[56]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bucket_Billing.ProtoReflect.Descriptor instead.\nfunc (*Bucket_Billing) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 0}\n}\n\nfunc (x *Bucket_Billing) GetRequesterPays() bool {\n\tif x != nil {\n\t\treturn x.RequesterPays\n\t}\n\treturn false\n}\n\n// Cross-Origin Response sharing (CORS) properties for a bucket.\n// For more on Cloud Storage and CORS, see\n// https://cloud.google.com/storage/docs/cross-origin.\n// For more on CORS in general, see https://tools.ietf.org/html/rfc6454.\ntype Bucket_Cors struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The list of Origins eligible to receive CORS response headers. See\n\t// [https://tools.ietf.org/html/rfc6454][RFC 6454] for more on origins.\n\t// Note: \"*\" is permitted in the list of origins, and means \"any Origin\".\n\tOrigin []string `protobuf:\"bytes,1,rep,name=origin,proto3\" json:\"origin,omitempty\"`\n\t// The list of HTTP methods on which to include CORS response headers,\n\t// (`GET`, `OPTIONS`, `POST`, etc) Note: \"*\" is permitted in the list of\n\t// methods, and means \"any method\".\n\tMethod []string `protobuf:\"bytes,2,rep,name=method,proto3\" json:\"method,omitempty\"`\n\t// The list of HTTP headers other than the\n\t// [https://www.w3.org/TR/cors/#simple-response-header][simple response\n\t// headers] to give permission for the user-agent to share across domains.\n\tResponseHeader []string `protobuf:\"bytes,3,rep,name=response_header,json=responseHeader,proto3\" json:\"response_header,omitempty\"`\n\t// The value, in seconds, to return in the\n\t// [https://www.w3.org/TR/cors/#access-control-max-age-response-header][Access-Control-Max-Age\n\t// header] used in preflight responses.\n\tMaxAgeSeconds int32 `protobuf:\"varint,4,opt,name=max_age_seconds,json=maxAgeSeconds,proto3\" json:\"max_age_seconds,omitempty\"`\n}\n\nfunc (x *Bucket_Cors) Reset() {\n\t*x = Bucket_Cors{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[57]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Bucket_Cors) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bucket_Cors) ProtoMessage() {}\n\nfunc (x *Bucket_Cors) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[57]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bucket_Cors.ProtoReflect.Descriptor instead.\nfunc (*Bucket_Cors) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 1}\n}\n\nfunc (x *Bucket_Cors) GetOrigin() []string {\n\tif x != nil {\n\t\treturn x.Origin\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket_Cors) GetMethod() []string {\n\tif x != nil {\n\t\treturn x.Method\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket_Cors) GetResponseHeader() []string {\n\tif x != nil {\n\t\treturn x.ResponseHeader\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket_Cors) GetMaxAgeSeconds() int32 {\n\tif x != nil {\n\t\treturn x.MaxAgeSeconds\n\t}\n\treturn 0\n}\n\n// Encryption properties of a bucket.\ntype Bucket_Encryption struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The name of the Cloud KMS key that will be used to encrypt objects\n\t// inserted into this bucket, if no encryption method is specified.\n\tDefaultKmsKey string `protobuf:\"bytes,1,opt,name=default_kms_key,json=defaultKmsKey,proto3\" json:\"default_kms_key,omitempty\"`\n}\n\nfunc (x *Bucket_Encryption) Reset() {\n\t*x = Bucket_Encryption{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[58]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Bucket_Encryption) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bucket_Encryption) ProtoMessage() {}\n\nfunc (x *Bucket_Encryption) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[58]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bucket_Encryption.ProtoReflect.Descriptor instead.\nfunc (*Bucket_Encryption) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 2}\n}\n\nfunc (x *Bucket_Encryption) GetDefaultKmsKey() string {\n\tif x != nil {\n\t\treturn x.DefaultKmsKey\n\t}\n\treturn \"\"\n}\n\n// Bucket restriction options.\ntype Bucket_IamConfig struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Bucket restriction options currently enforced on the bucket.\n\tUniformBucketLevelAccess *Bucket_IamConfig_UniformBucketLevelAccess `protobuf:\"bytes,1,opt,name=uniform_bucket_level_access,json=uniformBucketLevelAccess,proto3\" json:\"uniform_bucket_level_access,omitempty\"`\n\t// Whether IAM will enforce public access prevention. Valid values are\n\t// \"enforced\" or \"inherited\".\n\tPublicAccessPrevention string `protobuf:\"bytes,3,opt,name=public_access_prevention,json=publicAccessPrevention,proto3\" json:\"public_access_prevention,omitempty\"`\n}\n\nfunc (x *Bucket_IamConfig) Reset() {\n\t*x = Bucket_IamConfig{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[59]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Bucket_IamConfig) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bucket_IamConfig) ProtoMessage() {}\n\nfunc (x *Bucket_IamConfig) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[59]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bucket_IamConfig.ProtoReflect.Descriptor instead.\nfunc (*Bucket_IamConfig) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 3}\n}\n\nfunc (x *Bucket_IamConfig) GetUniformBucketLevelAccess() *Bucket_IamConfig_UniformBucketLevelAccess {\n\tif x != nil {\n\t\treturn x.UniformBucketLevelAccess\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket_IamConfig) GetPublicAccessPrevention() string {\n\tif x != nil {\n\t\treturn x.PublicAccessPrevention\n\t}\n\treturn \"\"\n}\n\n// Lifecycle properties of a bucket.\n// For more information, see https://cloud.google.com/storage/docs/lifecycle.\ntype Bucket_Lifecycle struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// A lifecycle management rule, which is made of an action to take and the\n\t// condition(s) under which the action will be taken.\n\tRule []*Bucket_Lifecycle_Rule `protobuf:\"bytes,1,rep,name=rule,proto3\" json:\"rule,omitempty\"`\n}\n\nfunc (x *Bucket_Lifecycle) Reset() {\n\t*x = Bucket_Lifecycle{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[60]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Bucket_Lifecycle) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bucket_Lifecycle) ProtoMessage() {}\n\nfunc (x *Bucket_Lifecycle) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[60]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bucket_Lifecycle.ProtoReflect.Descriptor instead.\nfunc (*Bucket_Lifecycle) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 4}\n}\n\nfunc (x *Bucket_Lifecycle) GetRule() []*Bucket_Lifecycle_Rule {\n\tif x != nil {\n\t\treturn x.Rule\n\t}\n\treturn nil\n}\n\n// Logging-related properties of a bucket.\ntype Bucket_Logging struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The destination bucket where the current bucket's logs should be placed,\n\t// using path format (like `projects/123456/buckets/foo`).\n\tLogBucket string `protobuf:\"bytes,1,opt,name=log_bucket,json=logBucket,proto3\" json:\"log_bucket,omitempty\"`\n\t// A prefix for log object names.\n\tLogObjectPrefix string `protobuf:\"bytes,2,opt,name=log_object_prefix,json=logObjectPrefix,proto3\" json:\"log_object_prefix,omitempty\"`\n}\n\nfunc (x *Bucket_Logging) Reset() {\n\t*x = Bucket_Logging{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[61]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Bucket_Logging) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bucket_Logging) ProtoMessage() {}\n\nfunc (x *Bucket_Logging) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[61]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bucket_Logging.ProtoReflect.Descriptor instead.\nfunc (*Bucket_Logging) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 5}\n}\n\nfunc (x *Bucket_Logging) GetLogBucket() string {\n\tif x != nil {\n\t\treturn x.LogBucket\n\t}\n\treturn \"\"\n}\n\nfunc (x *Bucket_Logging) GetLogObjectPrefix() string {\n\tif x != nil {\n\t\treturn x.LogObjectPrefix\n\t}\n\treturn \"\"\n}\n\n// Retention policy properties of a bucket.\ntype Bucket_RetentionPolicy struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Server-determined value that indicates the time from which policy was\n\t// enforced and effective.\n\tEffectiveTime *timestamppb.Timestamp `protobuf:\"bytes,1,opt,name=effective_time,json=effectiveTime,proto3\" json:\"effective_time,omitempty\"`\n\t// Once locked, an object retention policy cannot be modified.\n\tIsLocked bool `protobuf:\"varint,2,opt,name=is_locked,json=isLocked,proto3\" json:\"is_locked,omitempty\"`\n\t// The duration that objects need to be retained. Retention duration must be\n\t// greater than zero and less than 100 years. Note that enforcement of\n\t// retention periods less than a day is not guaranteed. Such periods should\n\t// only be used for testing purposes. Any `nanos` value specified will be\n\t// rounded down to the nearest second.\n\tRetentionDuration *durationpb.Duration `protobuf:\"bytes,4,opt,name=retention_duration,json=retentionDuration,proto3\" json:\"retention_duration,omitempty\"`\n}\n\nfunc (x *Bucket_RetentionPolicy) Reset() {\n\t*x = Bucket_RetentionPolicy{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[62]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Bucket_RetentionPolicy) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bucket_RetentionPolicy) ProtoMessage() {}\n\nfunc (x *Bucket_RetentionPolicy) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[62]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bucket_RetentionPolicy.ProtoReflect.Descriptor instead.\nfunc (*Bucket_RetentionPolicy) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 6}\n}\n\nfunc (x *Bucket_RetentionPolicy) GetEffectiveTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.EffectiveTime\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket_RetentionPolicy) GetIsLocked() bool {\n\tif x != nil {\n\t\treturn x.IsLocked\n\t}\n\treturn false\n}\n\nfunc (x *Bucket_RetentionPolicy) GetRetentionDuration() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.RetentionDuration\n\t}\n\treturn nil\n}\n\n// Soft delete policy properties of a bucket.\ntype Bucket_SoftDeletePolicy struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The period of time that soft-deleted objects in the bucket must be\n\t// retained and cannot be permanently deleted. The duration must be greater\n\t// than or equal to 7 days and less than 1 year.\n\tRetentionDuration *durationpb.Duration `protobuf:\"bytes,1,opt,name=retention_duration,json=retentionDuration,proto3,oneof\" json:\"retention_duration,omitempty\"`\n\t// Time from which the policy was effective. This is service-provided.\n\tEffectiveTime *timestamppb.Timestamp `protobuf:\"bytes,2,opt,name=effective_time,json=effectiveTime,proto3,oneof\" json:\"effective_time,omitempty\"`\n}\n\nfunc (x *Bucket_SoftDeletePolicy) Reset() {\n\t*x = Bucket_SoftDeletePolicy{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[63]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Bucket_SoftDeletePolicy) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bucket_SoftDeletePolicy) ProtoMessage() {}\n\nfunc (x *Bucket_SoftDeletePolicy) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[63]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bucket_SoftDeletePolicy.ProtoReflect.Descriptor instead.\nfunc (*Bucket_SoftDeletePolicy) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 7}\n}\n\nfunc (x *Bucket_SoftDeletePolicy) GetRetentionDuration() *durationpb.Duration {\n\tif x != nil {\n\t\treturn x.RetentionDuration\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket_SoftDeletePolicy) GetEffectiveTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.EffectiveTime\n\t}\n\treturn nil\n}\n\n// Properties of a bucket related to versioning.\n// For more on Cloud Storage versioning, see\n// https://cloud.google.com/storage/docs/object-versioning.\ntype Bucket_Versioning struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// While set to true, versioning is fully enabled for this bucket.\n\tEnabled bool `protobuf:\"varint,1,opt,name=enabled,proto3\" json:\"enabled,omitempty\"`\n}\n\nfunc (x *Bucket_Versioning) Reset() {\n\t*x = Bucket_Versioning{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[64]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Bucket_Versioning) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bucket_Versioning) ProtoMessage() {}\n\nfunc (x *Bucket_Versioning) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[64]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bucket_Versioning.ProtoReflect.Descriptor instead.\nfunc (*Bucket_Versioning) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 8}\n}\n\nfunc (x *Bucket_Versioning) GetEnabled() bool {\n\tif x != nil {\n\t\treturn x.Enabled\n\t}\n\treturn false\n}\n\n// Properties of a bucket related to accessing the contents as a static\n// website. For more on hosting a static website via Cloud Storage, see\n// https://cloud.google.com/storage/docs/hosting-static-website.\ntype Bucket_Website struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// If the requested object path is missing, the service will ensure the path\n\t// has a trailing '/', append this suffix, and attempt to retrieve the\n\t// resulting object. This allows the creation of `index.html`\n\t// objects to represent directory pages.\n\tMainPageSuffix string `protobuf:\"bytes,1,opt,name=main_page_suffix,json=mainPageSuffix,proto3\" json:\"main_page_suffix,omitempty\"`\n\t// If the requested object path is missing, and any\n\t// `mainPageSuffix` object is missing, if applicable, the service\n\t// will return the named object from this bucket as the content for a\n\t// [https://tools.ietf.org/html/rfc7231#section-6.5.4][404 Not Found]\n\t// result.\n\tNotFoundPage string `protobuf:\"bytes,2,opt,name=not_found_page,json=notFoundPage,proto3\" json:\"not_found_page,omitempty\"`\n}\n\nfunc (x *Bucket_Website) Reset() {\n\t*x = Bucket_Website{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[65]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Bucket_Website) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bucket_Website) ProtoMessage() {}\n\nfunc (x *Bucket_Website) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[65]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bucket_Website.ProtoReflect.Descriptor instead.\nfunc (*Bucket_Website) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 9}\n}\n\nfunc (x *Bucket_Website) GetMainPageSuffix() string {\n\tif x != nil {\n\t\treturn x.MainPageSuffix\n\t}\n\treturn \"\"\n}\n\nfunc (x *Bucket_Website) GetNotFoundPage() string {\n\tif x != nil {\n\t\treturn x.NotFoundPage\n\t}\n\treturn \"\"\n}\n\n// Configuration for Custom Dual Regions.  It should specify precisely two\n// eligible regions within the same Multiregion. More information on regions\n// may be found [https://cloud.google.com/storage/docs/locations][here].\ntype Bucket_CustomPlacementConfig struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// List of locations to use for data placement.\n\tDataLocations []string `protobuf:\"bytes,1,rep,name=data_locations,json=dataLocations,proto3\" json:\"data_locations,omitempty\"`\n}\n\nfunc (x *Bucket_CustomPlacementConfig) Reset() {\n\t*x = Bucket_CustomPlacementConfig{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[66]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Bucket_CustomPlacementConfig) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bucket_CustomPlacementConfig) ProtoMessage() {}\n\nfunc (x *Bucket_CustomPlacementConfig) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[66]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bucket_CustomPlacementConfig.ProtoReflect.Descriptor instead.\nfunc (*Bucket_CustomPlacementConfig) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 10}\n}\n\nfunc (x *Bucket_CustomPlacementConfig) GetDataLocations() []string {\n\tif x != nil {\n\t\treturn x.DataLocations\n\t}\n\treturn nil\n}\n\n// Configuration for a bucket's Autoclass feature.\ntype Bucket_Autoclass struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Enables Autoclass.\n\tEnabled bool `protobuf:\"varint,1,opt,name=enabled,proto3\" json:\"enabled,omitempty\"`\n\t// Output only. Latest instant at which the `enabled` field was set to true\n\t// after being disabled/unconfigured or set to false after being enabled. If\n\t// Autoclass is enabled when the bucket is created, the toggle_time is set\n\t// to the bucket creation time.\n\tToggleTime *timestamppb.Timestamp `protobuf:\"bytes,2,opt,name=toggle_time,json=toggleTime,proto3\" json:\"toggle_time,omitempty\"`\n\t// An object in an Autoclass bucket will eventually cool down to the\n\t// terminal storage class if there is no access to the object.\n\t// The only valid values are NEARLINE and ARCHIVE.\n\tTerminalStorageClass *string `protobuf:\"bytes,3,opt,name=terminal_storage_class,json=terminalStorageClass,proto3,oneof\" json:\"terminal_storage_class,omitempty\"`\n\t// Output only. Latest instant at which the autoclass terminal storage class\n\t// was updated.\n\tTerminalStorageClassUpdateTime *timestamppb.Timestamp `protobuf:\"bytes,4,opt,name=terminal_storage_class_update_time,json=terminalStorageClassUpdateTime,proto3,oneof\" json:\"terminal_storage_class_update_time,omitempty\"`\n}\n\nfunc (x *Bucket_Autoclass) Reset() {\n\t*x = Bucket_Autoclass{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[67]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Bucket_Autoclass) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bucket_Autoclass) ProtoMessage() {}\n\nfunc (x *Bucket_Autoclass) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[67]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bucket_Autoclass.ProtoReflect.Descriptor instead.\nfunc (*Bucket_Autoclass) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 11}\n}\n\nfunc (x *Bucket_Autoclass) GetEnabled() bool {\n\tif x != nil {\n\t\treturn x.Enabled\n\t}\n\treturn false\n}\n\nfunc (x *Bucket_Autoclass) GetToggleTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.ToggleTime\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket_Autoclass) GetTerminalStorageClass() string {\n\tif x != nil && x.TerminalStorageClass != nil {\n\t\treturn *x.TerminalStorageClass\n\t}\n\treturn \"\"\n}\n\nfunc (x *Bucket_Autoclass) GetTerminalStorageClassUpdateTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.TerminalStorageClassUpdateTime\n\t}\n\treturn nil\n}\n\n// Configuration for a bucket's hierarchical namespace feature.\ntype Bucket_HierarchicalNamespace struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Optional. Enables the hierarchical namespace feature.\n\tEnabled bool `protobuf:\"varint,1,opt,name=enabled,proto3\" json:\"enabled,omitempty\"`\n}\n\nfunc (x *Bucket_HierarchicalNamespace) Reset() {\n\t*x = Bucket_HierarchicalNamespace{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[68]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Bucket_HierarchicalNamespace) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bucket_HierarchicalNamespace) ProtoMessage() {}\n\nfunc (x *Bucket_HierarchicalNamespace) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[68]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bucket_HierarchicalNamespace.ProtoReflect.Descriptor instead.\nfunc (*Bucket_HierarchicalNamespace) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 12}\n}\n\nfunc (x *Bucket_HierarchicalNamespace) GetEnabled() bool {\n\tif x != nil {\n\t\treturn x.Enabled\n\t}\n\treturn false\n}\n\n// Settings for Uniform Bucket level access.\n// See https://cloud.google.com/storage/docs/uniform-bucket-level-access.\ntype Bucket_IamConfig_UniformBucketLevelAccess struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// If set, access checks only use bucket-level IAM policies or above.\n\tEnabled bool `protobuf:\"varint,1,opt,name=enabled,proto3\" json:\"enabled,omitempty\"`\n\t// The deadline time for changing\n\t// `iam_config.uniform_bucket_level_access.enabled` from `true` to\n\t// `false`. Mutable until the specified deadline is reached, but not\n\t// afterward.\n\tLockTime *timestamppb.Timestamp `protobuf:\"bytes,2,opt,name=lock_time,json=lockTime,proto3\" json:\"lock_time,omitempty\"`\n}\n\nfunc (x *Bucket_IamConfig_UniformBucketLevelAccess) Reset() {\n\t*x = Bucket_IamConfig_UniformBucketLevelAccess{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[70]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Bucket_IamConfig_UniformBucketLevelAccess) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bucket_IamConfig_UniformBucketLevelAccess) ProtoMessage() {}\n\nfunc (x *Bucket_IamConfig_UniformBucketLevelAccess) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[70]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bucket_IamConfig_UniformBucketLevelAccess.ProtoReflect.Descriptor instead.\nfunc (*Bucket_IamConfig_UniformBucketLevelAccess) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 3, 0}\n}\n\nfunc (x *Bucket_IamConfig_UniformBucketLevelAccess) GetEnabled() bool {\n\tif x != nil {\n\t\treturn x.Enabled\n\t}\n\treturn false\n}\n\nfunc (x *Bucket_IamConfig_UniformBucketLevelAccess) GetLockTime() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.LockTime\n\t}\n\treturn nil\n}\n\n// A lifecycle Rule, combining an action to take on an object and a\n// condition which will trigger that action.\ntype Bucket_Lifecycle_Rule struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// The action to take.\n\tAction *Bucket_Lifecycle_Rule_Action `protobuf:\"bytes,1,opt,name=action,proto3\" json:\"action,omitempty\"`\n\t// The condition(s) under which the action will be taken.\n\tCondition *Bucket_Lifecycle_Rule_Condition `protobuf:\"bytes,2,opt,name=condition,proto3\" json:\"condition,omitempty\"`\n}\n\nfunc (x *Bucket_Lifecycle_Rule) Reset() {\n\t*x = Bucket_Lifecycle_Rule{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[71]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Bucket_Lifecycle_Rule) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bucket_Lifecycle_Rule) ProtoMessage() {}\n\nfunc (x *Bucket_Lifecycle_Rule) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[71]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bucket_Lifecycle_Rule.ProtoReflect.Descriptor instead.\nfunc (*Bucket_Lifecycle_Rule) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 4, 0}\n}\n\nfunc (x *Bucket_Lifecycle_Rule) GetAction() *Bucket_Lifecycle_Rule_Action {\n\tif x != nil {\n\t\treturn x.Action\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket_Lifecycle_Rule) GetCondition() *Bucket_Lifecycle_Rule_Condition {\n\tif x != nil {\n\t\treturn x.Condition\n\t}\n\treturn nil\n}\n\n// An action to take on an object.\ntype Bucket_Lifecycle_Rule_Action struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Type of the action. Currently, only `Delete`, `SetStorageClass`, and\n\t// `AbortIncompleteMultipartUpload` are supported.\n\tType string `protobuf:\"bytes,1,opt,name=type,proto3\" json:\"type,omitempty\"`\n\t// Target storage class. Required iff the type of the action is\n\t// SetStorageClass.\n\tStorageClass string `protobuf:\"bytes,2,opt,name=storage_class,json=storageClass,proto3\" json:\"storage_class,omitempty\"`\n}\n\nfunc (x *Bucket_Lifecycle_Rule_Action) Reset() {\n\t*x = Bucket_Lifecycle_Rule_Action{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[72]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Bucket_Lifecycle_Rule_Action) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bucket_Lifecycle_Rule_Action) ProtoMessage() {}\n\nfunc (x *Bucket_Lifecycle_Rule_Action) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[72]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bucket_Lifecycle_Rule_Action.ProtoReflect.Descriptor instead.\nfunc (*Bucket_Lifecycle_Rule_Action) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 4, 0, 0}\n}\n\nfunc (x *Bucket_Lifecycle_Rule_Action) GetType() string {\n\tif x != nil {\n\t\treturn x.Type\n\t}\n\treturn \"\"\n}\n\nfunc (x *Bucket_Lifecycle_Rule_Action) GetStorageClass() string {\n\tif x != nil {\n\t\treturn x.StorageClass\n\t}\n\treturn \"\"\n}\n\n// A condition of an object which triggers some action.\ntype Bucket_Lifecycle_Rule_Condition struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Age of an object (in days). This condition is satisfied when an\n\t// object reaches the specified age.\n\t// A value of 0 indicates that all objects immediately match this\n\t// condition.\n\tAgeDays *int32 `protobuf:\"varint,1,opt,name=age_days,json=ageDays,proto3,oneof\" json:\"age_days,omitempty\"`\n\t// This condition is satisfied when an object is created before midnight\n\t// of the specified date in UTC.\n\tCreatedBefore *date.Date `protobuf:\"bytes,2,opt,name=created_before,json=createdBefore,proto3\" json:\"created_before,omitempty\"`\n\t// Relevant only for versioned objects. If the value is\n\t// `true`, this condition matches live objects; if the value\n\t// is `false`, it matches archived objects.\n\tIsLive *bool `protobuf:\"varint,3,opt,name=is_live,json=isLive,proto3,oneof\" json:\"is_live,omitempty\"`\n\t// Relevant only for versioned objects. If the value is N, this\n\t// condition is satisfied when there are at least N versions (including\n\t// the live version) newer than this version of the object.\n\tNumNewerVersions *int32 `protobuf:\"varint,4,opt,name=num_newer_versions,json=numNewerVersions,proto3,oneof\" json:\"num_newer_versions,omitempty\"`\n\t// Objects having any of the storage classes specified by this condition\n\t// will be matched. Values include `MULTI_REGIONAL`, `REGIONAL`,\n\t// `NEARLINE`, `COLDLINE`, `STANDARD`, and\n\t// `DURABLE_REDUCED_AVAILABILITY`.\n\tMatchesStorageClass []string `protobuf:\"bytes,5,rep,name=matches_storage_class,json=matchesStorageClass,proto3\" json:\"matches_storage_class,omitempty\"`\n\t// Number of days that have elapsed since the custom timestamp set on an\n\t// object.\n\t// The value of the field must be a nonnegative integer.\n\tDaysSinceCustomTime *int32 `protobuf:\"varint,7,opt,name=days_since_custom_time,json=daysSinceCustomTime,proto3,oneof\" json:\"days_since_custom_time,omitempty\"`\n\t// An object matches this condition if the custom timestamp set on the\n\t// object is before the specified date in UTC.\n\tCustomTimeBefore *date.Date `protobuf:\"bytes,8,opt,name=custom_time_before,json=customTimeBefore,proto3\" json:\"custom_time_before,omitempty\"`\n\t// This condition is relevant only for versioned objects. An object\n\t// version satisfies this condition only if these many days have been\n\t// passed since it became noncurrent. The value of the field must be a\n\t// nonnegative integer. If it's zero, the object version will become\n\t// eligible for Lifecycle action as soon as it becomes noncurrent.\n\tDaysSinceNoncurrentTime *int32 `protobuf:\"varint,9,opt,name=days_since_noncurrent_time,json=daysSinceNoncurrentTime,proto3,oneof\" json:\"days_since_noncurrent_time,omitempty\"`\n\t// This condition is relevant only for versioned objects. An object\n\t// version satisfies this condition only if it became noncurrent before\n\t// the specified date in UTC.\n\tNoncurrentTimeBefore *date.Date `protobuf:\"bytes,10,opt,name=noncurrent_time_before,json=noncurrentTimeBefore,proto3\" json:\"noncurrent_time_before,omitempty\"`\n\t// List of object name prefixes. If any prefix exactly matches the\n\t// beginning of the object name, the condition evaluates to true.\n\tMatchesPrefix []string `protobuf:\"bytes,11,rep,name=matches_prefix,json=matchesPrefix,proto3\" json:\"matches_prefix,omitempty\"`\n\t// List of object name suffixes. If any suffix exactly matches the\n\t// end of the object name, the condition evaluates to true.\n\tMatchesSuffix []string `protobuf:\"bytes,12,rep,name=matches_suffix,json=matchesSuffix,proto3\" json:\"matches_suffix,omitempty\"`\n}\n\nfunc (x *Bucket_Lifecycle_Rule_Condition) Reset() {\n\t*x = Bucket_Lifecycle_Rule_Condition{}\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[73]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Bucket_Lifecycle_Rule_Condition) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Bucket_Lifecycle_Rule_Condition) ProtoMessage() {}\n\nfunc (x *Bucket_Lifecycle_Rule_Condition) ProtoReflect() protoreflect.Message {\n\tmi := &file_google_storage_v2_storage_proto_msgTypes[73]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Bucket_Lifecycle_Rule_Condition.ProtoReflect.Descriptor instead.\nfunc (*Bucket_Lifecycle_Rule_Condition) Descriptor() ([]byte, []int) {\n\treturn file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 4, 0, 1}\n}\n\nfunc (x *Bucket_Lifecycle_Rule_Condition) GetAgeDays() int32 {\n\tif x != nil && x.AgeDays != nil {\n\t\treturn *x.AgeDays\n\t}\n\treturn 0\n}\n\nfunc (x *Bucket_Lifecycle_Rule_Condition) GetCreatedBefore() *date.Date {\n\tif x != nil {\n\t\treturn x.CreatedBefore\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket_Lifecycle_Rule_Condition) GetIsLive() bool {\n\tif x != nil && x.IsLive != nil {\n\t\treturn *x.IsLive\n\t}\n\treturn false\n}\n\nfunc (x *Bucket_Lifecycle_Rule_Condition) GetNumNewerVersions() int32 {\n\tif x != nil && x.NumNewerVersions != nil {\n\t\treturn *x.NumNewerVersions\n\t}\n\treturn 0\n}\n\nfunc (x *Bucket_Lifecycle_Rule_Condition) GetMatchesStorageClass() []string {\n\tif x != nil {\n\t\treturn x.MatchesStorageClass\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket_Lifecycle_Rule_Condition) GetDaysSinceCustomTime() int32 {\n\tif x != nil && x.DaysSinceCustomTime != nil {\n\t\treturn *x.DaysSinceCustomTime\n\t}\n\treturn 0\n}\n\nfunc (x *Bucket_Lifecycle_Rule_Condition) GetCustomTimeBefore() *date.Date {\n\tif x != nil {\n\t\treturn x.CustomTimeBefore\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket_Lifecycle_Rule_Condition) GetDaysSinceNoncurrentTime() int32 {\n\tif x != nil && x.DaysSinceNoncurrentTime != nil {\n\t\treturn *x.DaysSinceNoncurrentTime\n\t}\n\treturn 0\n}\n\nfunc (x *Bucket_Lifecycle_Rule_Condition) GetNoncurrentTimeBefore() *date.Date {\n\tif x != nil {\n\t\treturn x.NoncurrentTimeBefore\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket_Lifecycle_Rule_Condition) GetMatchesPrefix() []string {\n\tif x != nil {\n\t\treturn x.MatchesPrefix\n\t}\n\treturn nil\n}\n\nfunc (x *Bucket_Lifecycle_Rule_Condition) GetMatchesSuffix() []string {\n\tif x != nil {\n\t\treturn x.MatchesSuffix\n\t}\n\treturn nil\n}\n\nvar File_google_storage_v2_storage_proto protoreflect.FileDescriptor\n\nvar file_google_storage_v2_storage_proto_rawDesc = []byte{\n\t0x0a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,\n\t0x2f, 0x76, 0x32, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x11, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,\n\t0x65, 0x2e, 0x76, 0x32, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69,\n\t0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f,\n\t0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75,\n\t0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f,\n\t0x76, 0x31, 0x2f, 0x69, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f,\n\t0x76, 0x31, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69,\n\t0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f,\n\t0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,\n\t0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74,\n\t0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x22, 0x8d, 0x02, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65,\n\t0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d,\n\t0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70,\n\t0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01,\n\t0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63,\n\t0x68, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,\n\t0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,\n\t0x22, 0xd6, 0x02, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f,\n\t0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,\n\t0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28,\n\t0x03, 0x48, 0x00, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a,\n\t0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x03, 0x48, 0x01, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01,\n\t0x01, 0x12, 0x3c, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x05,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b,\n\t0x48, 0x02, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x88, 0x01, 0x01, 0x42,\n\t0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f,\n\t0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x0c, 0x0a, 0x0a, 0x5f,\n\t0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x22, 0x93, 0x02, 0x0a, 0x13, 0x43, 0x72,\n\t0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x12, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61,\n\t0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74,\n\t0x12, 0x31, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,\n\t0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63,\n\t0x6b, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x62, 0x75, 0x63,\n\t0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69,\n\t0x6e, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70,\n\t0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x41, 0x0a, 0x1d,\n\t0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75,\n\t0x6c, 0x74, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x1a, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x44,\n\t0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x22,\n\t0xf3, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x12, 0x1d,\n\t0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70,\n\t0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x70,\n\t0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69,\n\t0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69,\n\t0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65,\n\t0x6e, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x3c, 0x0a, 0x09, 0x72, 0x65, 0x61,\n\t0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46,\n\t0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64,\n\t0x4d, 0x61, 0x73, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x64,\n\t0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x22, 0x72, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63,\n\t0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07,\n\t0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,\n\t0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,\n\t0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74,\n\t0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74,\n\t0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x9e, 0x01, 0x0a, 0x20, 0x4c, 0x6f,\n\t0x63, 0x6b, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f,\n\t0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d,\n\t0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25,\n\t0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42,\n\t0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x3b, 0x0a,\n\t0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03,\n\t0xe0, 0x41, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xb6, 0x03, 0x0a, 0x13, 0x55,\n\t0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x12, 0x36, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,\n\t0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x03, 0xe0,\n\t0x41, 0x02, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66,\n\t0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,\n\t0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x15, 0x69,\n\t0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d,\n\t0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65,\n\t0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74,\n\t0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x18,\n\t0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0e, 0x70,\n\t0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x08, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41,\n\t0x63, 0x6c, 0x12, 0x41, 0x0a, 0x1d, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64,\n\t0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f,\n\t0x61, 0x63, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x70, 0x72, 0x65, 0x64, 0x65,\n\t0x66, 0x69, 0x6e, 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f,\n\t0x6d, 0x61, 0x73, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,\n\t0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x75, 0x70, 0x64,\n\t0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d,\n\t0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61,\n\t0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61,\n\t0x74, 0x63, 0x68, 0x22, 0xc3, 0x07, 0x0a, 0x14, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x4f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0b,\n\t0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,\n\t0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x03, 0xe0, 0x41,\n\t0x02, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5b,\n\t0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73,\n\t0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f,\n\t0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e,\n\t0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0d, 0x73, 0x6f,\n\t0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x64,\n\t0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x65,\n\t0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x18, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x64,\n\t0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b,\n\t0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48,\n\t0x01, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x07, 0x6b,\n\t0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xfa, 0x41,\n\t0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74,\n\t0x6f, 0x4b, 0x65, 0x79, 0x52, 0x06, 0x6b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x6d, 0x0a, 0x1c,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,\n\t0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73,\n\t0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x4d, 0x0a, 0x10, 0x6f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18,\n\t0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,\n\t0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,\n\t0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63,\n\t0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x1a, 0xa8, 0x02, 0x0a, 0x0c, 0x53,\n\t0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x6e,\n\t0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x12, 0x7b, 0x0a, 0x14, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x70,\n\t0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x48, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,\n\t0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x4f, 0x62,\n\t0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x6f, 0x75, 0x72,\n\t0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50,\n\t0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x13, 0x6f, 0x62,\n\t0x6a, 0x65, 0x63, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x1a, 0x62, 0x0a, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f,\n\t0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x42, 0x16, 0x0a,\n\t0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,\n\t0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a,\n\t0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xe2, 0x04, 0x0a, 0x13, 0x44, 0x65,\n\t0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61,\n\t0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,\n\t0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x0a,\n\t0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28,\n\t0x03, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a,\n\t0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d,\n\t0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66,\n\t0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88,\n\t0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b,\n\t0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48,\n\t0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69,\n\t0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03,\n\t0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12,\n\t0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,\n\t0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18,\n\t0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,\n\t0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72,\n\t0x61, 0x6d, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63,\n\t0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x16,\n\t0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74,\n\t0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e,\n\t0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xd3,\n\t0x05, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65,\n\t0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a,\n\t0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,\n\t0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06,\n\t0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74,\n\t0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x6b,\n\t0x65, 0x6e, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48,\n\t0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d,\n\t0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74,\n\t0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68,\n\t0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06,\n\t0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01,\n\t0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18,\n\t0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63,\n\t0x68, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75,\n\t0x72, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52,\n\t0x0d, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x63, 0x6c, 0x88, 0x01,\n\t0x01, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d,\n\t0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d,\n\t0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50,\n\t0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73,\n\t0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d,\n\t0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,\n\t0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,\n\t0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,\n\t0x5f, 0x61, 0x63, 0x6c, 0x22, 0x3f, 0x0a, 0x1b, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65,\n\t0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x75, 0x70, 0x6c,\n\t0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0x1e, 0x0a, 0x1c, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52,\n\t0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xec, 0x05, 0x0a, 0x11, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62,\n\t0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62,\n\t0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02,\n\t0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b,\n\t0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62,\n\t0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52,\n\t0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f,\n\t0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65,\n\t0x61, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x61, 0x64,\n\t0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x65,\n\t0x61, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06,\n\t0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17,\n\t0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f,\n\t0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52,\n\t0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74,\n\t0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d,\n\t0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61,\n\t0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d,\n\t0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74,\n\t0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d,\n\t0x61, 0x74, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66,\n\t0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f,\n\t0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d,\n\t0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,\n\t0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x19, 0x63,\n\t0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x3c, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64,\n\t0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69,\n\t0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x48, 0x04, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4d,\n\t0x61, 0x73, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a,\n\t0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69,\n\t0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65,\n\t0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74,\n\t0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f,\n\t0x6d, 0x61, 0x73, 0x6b, 0x22, 0x8e, 0x06, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63,\n\t0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41,\n\t0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74,\n\t0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0c, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x64, 0x65,\n\t0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0b, 0x73,\n\t0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a,\n\t0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d,\n\t0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x11, 0x69, 0x66,\n\t0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88,\n\t0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b,\n\t0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48,\n\t0x03, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69,\n\t0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03,\n\t0x48, 0x04, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12,\n\t0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,\n\t0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18,\n\t0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,\n\t0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72,\n\t0x61, 0x6d, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63,\n\t0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x3c,\n\t0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x48, 0x05, 0x52,\n\t0x08, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d,\n\t0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0c, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72,\n\t0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x5f,\n\t0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42,\n\t0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f,\n\t0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d,\n\t0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f,\n\t0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x64,\n\t0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x22, 0xaf, 0x02, 0x0a, 0x12, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62,\n\t0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x10,\n\t0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b,\n\t0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63,\n\t0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x10, 0x6f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,\n\t0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,\n\t0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63,\n\t0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x12, 0x44, 0x0a, 0x0d, 0x63, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,\n\t0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x6e,\n\t0x67, 0x65, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65,\n\t0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,\n\t0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x6d,\n\t0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xc6, 0x06, 0x0a, 0x12, 0x42, 0x69, 0x64, 0x69,\n\t0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3d,\n\t0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25,\n\t0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42,\n\t0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1b, 0x0a,\n\t0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0,\n\t0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66,\n\t0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63,\n\t0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12,\n\t0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03,\n\t0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69,\n\t0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15,\n\t0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d,\n\t0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f,\n\t0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52,\n\t0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x6d, 0x0a, 0x1c,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,\n\t0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73,\n\t0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65,\n\t0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x40, 0x0a, 0x09, 0x72,\n\t0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x02, 0x18, 0x01, 0x48, 0x04,\n\t0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a,\n\t0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,\n\t0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x48,\n\t0x61, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e,\n\t0x64, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e,\n\t0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52,\n\t0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01,\n\t0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d,\n\t0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,\n\t0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,\n\t0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x42, 0x0e,\n\t0x0a, 0x0c, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x42, 0x10,\n\t0x0a, 0x0e, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e,\n\t0x22, 0xa7, 0x01, 0x0a, 0x15, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4f, 0x0a, 0x10, 0x72, 0x65,\n\t0x61, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,\n\t0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61,\n\t0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x72, 0x65, 0x61,\n\t0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3d, 0x0a, 0x0b, 0x72,\n\t0x65, 0x61, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b,\n\t0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,\n\t0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0a,\n\t0x72, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0xe5, 0x01, 0x0a, 0x16, 0x42,\n\t0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73,\n\t0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x12, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f,\n\t0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28,\n\t0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,\n\t0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x61, 0x6e, 0x67,\n\t0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x61, 0x74,\n\t0x61, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64,\n\t0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62,\n\t0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x42,\n\t0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,\n\t0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64,\n\t0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64,\n\t0x6c, 0x65, 0x22, 0x9f, 0x01, 0x0a, 0x1d, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x45,\n\t0x72, 0x72, 0x6f, 0x72, 0x12, 0x42, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x68, 0x61, 0x6e,\n\t0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69,\n\t0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x0a, 0x72, 0x65,\n\t0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74,\n\t0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48,\n\t0x00, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88,\n\t0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74,\n\t0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xed, 0x01, 0x0a, 0x1e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69,\n\t0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,\n\t0x65, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69,\n\t0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00,\n\t0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01,\n\t0x01, 0x12, 0x4a, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69,\n\t0x57, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x01, 0x52, 0x0b, 0x77,\n\t0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a,\n\t0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x03, 0x48, 0x02, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88,\n\t0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74,\n\t0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x68,\n\t0x61, 0x6e, 0x64, 0x6c, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x22, 0x64, 0x0a, 0x13, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64,\n\t0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x72,\n\t0x65, 0x61, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73,\n\t0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52,\n\t0x61, 0x6e, 0x67, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x0f, 0x72, 0x65, 0x61, 0x64, 0x52,\n\t0x61, 0x6e, 0x67, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x55, 0x0a, 0x0e, 0x52, 0x65,\n\t0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x17, 0x0a, 0x07,\n\t0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x72,\n\t0x65, 0x61, 0x64, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72,\n\t0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,\n\t0x73, 0x22, 0x75, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x24,\n\t0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x66,\n\t0x66, 0x73, 0x65, 0x74, 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x65, 0x6e,\n\t0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a,\n\t0x72, 0x65, 0x61, 0x64, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x07, 0x72, 0x65,\n\t0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02,\n\t0x52, 0x06, 0x72, 0x65, 0x61, 0x64, 0x49, 0x64, 0x22, 0xba, 0x01, 0x0a, 0x0f, 0x4f, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x10,\n\t0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b,\n\t0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63,\n\t0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x0a, 0x72,\n\t0x65, 0x61, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,\n\t0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x09, 0x72,\n\t0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x61, 0x6e, 0x67,\n\t0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x61, 0x6e,\n\t0x67, 0x65, 0x45, 0x6e, 0x64, 0x22, 0x2d, 0x0a, 0x0e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61,\n\t0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c,\n\t0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x68, 0x61,\n\t0x6e, 0x64, 0x6c, 0x65, 0x22, 0x2e, 0x0a, 0x0f, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74,\n\t0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c,\n\t0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x68, 0x61,\n\t0x6e, 0x64, 0x6c, 0x65, 0x22, 0xc0, 0x04, 0x0a, 0x0f, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62,\n\t0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f,\n\t0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f,\n\t0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e,\n\t0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72,\n\t0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x33, 0x0a, 0x13, 0x69,\n\t0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74,\n\t0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01,\n\t0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28,\n\t0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17,\n\t0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52,\n\t0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f,\n\t0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e,\n\t0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03,\n\t0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a,\n\t0x0b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01,\n\t0x28, 0x03, 0x48, 0x04, 0x52, 0x0a, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x69, 0x7a, 0x65,\n\t0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c,\n\t0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x48, 0x05, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x65, 0x6e,\n\t0x64, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f,\n\t0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,\n\t0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18,\n\t0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f,\n\t0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e,\n\t0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6f, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x70, 0x70,\n\t0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x22, 0xf8, 0x03, 0x0a, 0x12, 0x57, 0x72, 0x69, 0x74,\n\t0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d,\n\t0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x48, 0x00, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x50, 0x0a,\n\t0x11, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70,\n\t0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x72, 0x69,\n\t0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x0f,\n\t0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12,\n\t0x26, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74,\n\t0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x4f, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b,\n\t0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,\n\t0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65,\n\t0x64, 0x44, 0x61, 0x74, 0x61, 0x48, 0x01, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75,\n\t0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,\n\t0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65,\n\t0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68,\n\t0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x69, 0x73,\n\t0x68, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x66,\n\t0x69, 0x6e, 0x69, 0x73, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f,\n\t0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,\n\t0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63,\n\t0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x19,\n\t0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x66, 0x69, 0x72,\n\t0x73, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61,\n\t0x74, 0x61, 0x22, 0x87, 0x01, 0x0a, 0x13, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0e, 0x70, 0x65,\n\t0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x03, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x53,\n\t0x69, 0x7a, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,\n\t0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,\n\t0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x0e, 0x0a, 0x0c,\n\t0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xe9, 0x03, 0x0a,\n\t0x10, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65,\n\t0x63, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61,\n\t0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,\n\t0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x0a,\n\t0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20,\n\t0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12,\n\t0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05,\n\t0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68,\n\t0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74,\n\t0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x72, 0x6f,\n\t0x75, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a,\n\t0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x07, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,\n\t0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74,\n\t0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x03, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65,\n\t0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66,\n\t0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,\n\t0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74,\n\t0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f,\n\t0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e,\n\t0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x72, 0x69, 0x74,\n\t0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x8a, 0x05, 0x0a, 0x16, 0x42, 0x69, 0x64,\n\t0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64,\n\t0x49, 0x64, 0x12, 0x50, 0x0a, 0x11, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,\n\t0x32, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65,\n\t0x63, 0x48, 0x00, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,\n\t0x53, 0x70, 0x65, 0x63, 0x12, 0x53, 0x0a, 0x12, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,\n\t0x65, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63,\n\t0x74, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x10, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x26, 0x0a, 0x0c, 0x77, 0x72, 0x69,\n\t0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42,\n\t0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65,\n\t0x74, 0x12, 0x4f, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64,\n\t0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,\n\t0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x48,\n\t0x01, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61,\n\t0x74, 0x61, 0x12, 0x4d, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x65,\n\t0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,\n\t0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73,\n\t0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d,\n\t0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75,\n\t0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x65, 0x4c, 0x6f,\n\t0x6f, 0x6b, 0x75, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x18, 0x08, 0x20,\n\t0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x69,\n\t0x6e, 0x69, 0x73, 0x68, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08,\n\t0x52, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x6d, 0x0a,\n\t0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0a, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,\n\t0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62,\n\t0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d,\n\t0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0f, 0x0a, 0x0d,\n\t0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x06, 0x0a,\n\t0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xe8, 0x01, 0x0a, 0x17, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72,\n\t0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,\n\t0x65, 0x12, 0x27, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x73,\n\t0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x65, 0x72,\n\t0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x72, 0x65,\n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,\n\t0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75,\n\t0x72, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x68, 0x61, 0x6e,\n\t0x64, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69,\n\t0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x01, 0x52,\n\t0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x42,\n\t0x0e, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42,\n\t0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65,\n\t0x22, 0xe3, 0x04, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e,\n\t0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a,\n\t0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,\n\t0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06,\n\t0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73,\n\t0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53,\n\t0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65,\n\t0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b,\n\t0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72,\n\t0x12, 0x3c, 0x0a, 0x1a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x69,\n\t0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x05,\n\t0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61,\n\t0x69, 0x6c, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x16,\n\t0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,\n\t0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,\n\t0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,\n\t0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18,\n\t0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73,\n\t0x6b, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x88, 0x01, 0x01,\n\t0x12, 0x34, 0x0a, 0x13, 0x6c, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69,\n\t0x63, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0,\n\t0x41, 0x01, 0x52, 0x12, 0x6c, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69,\n\t0x63, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x6c, 0x65, 0x78, 0x69, 0x63, 0x6f,\n\t0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x10, 0x6c, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x67, 0x72,\n\t0x61, 0x70, 0x68, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x12, 0x26, 0x0a, 0x0c, 0x73, 0x6f, 0x66, 0x74,\n\t0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03,\n\t0xe0, 0x41, 0x01, 0x52, 0x0b, 0x73, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64,\n\t0x12, 0x42, 0x0a, 0x1b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x66, 0x6f, 0x6c, 0x64,\n\t0x65, 0x72, 0x73, 0x5f, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x18,\n\t0x0d, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x18, 0x69, 0x6e, 0x63, 0x6c,\n\t0x75, 0x64, 0x65, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x41, 0x73, 0x50, 0x72, 0x65, 0x66,\n\t0x69, 0x78, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x67, 0x6c,\n\t0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x6d,\n\t0x61, 0x74, 0x63, 0x68, 0x47, 0x6c, 0x6f, 0x62, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61,\n\t0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79,\n\t0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18,\n\t0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f,\n\t0x61, 0x64, 0x49, 0x64, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61,\n\t0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43,\n\t0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72,\n\t0x61, 0x6d, 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x69,\n\t0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,\n\t0x12, 0x27, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69,\n\t0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x65, 0x72, 0x73,\n\t0x69, 0x73, 0x74, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x72, 0x65, 0x73,\n\t0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,\n\t0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,\n\t0x63, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74,\n\t0x75, 0x73, 0x22, 0xb5, 0x0e, 0x0a, 0x14, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62,\n\t0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x10, 0x64,\n\t0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,\n\t0x18, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0x52, 0x0f, 0x64,\n\t0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57,\n\t0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x75,\n\t0x63, 0x6b, 0x65, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xe0,\n\t0x41, 0x05, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75,\n\t0x63, 0x6b, 0x65, 0x74, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x56, 0x0a, 0x13, 0x64, 0x65, 0x73, 0x74, 0x69,\n\t0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x1b,\n\t0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64,\n\t0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63,\n\t0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x52, 0x11, 0x64, 0x65,\n\t0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x12,\n\t0x3b, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,\n\t0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52,\n\t0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x0d,\n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20,\n\t0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f,\n\t0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e,\n\t0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72,\n\t0x63, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72,\n\t0x63, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x03, 0xe0, 0x41, 0x02, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x73,\n\t0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,\n\t0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e,\n\t0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54,\n\t0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x3c, 0x0a, 0x1a, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61,\n\t0x63, 0x6c, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41,\n\t0x63, 0x6c, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48,\n\t0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d,\n\t0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74,\n\t0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68,\n\t0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x09,\n\t0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01,\n\t0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18,\n\t0x0a, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63,\n\t0x68, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x1a, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63,\n\t0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74,\n\t0x63, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x48, 0x04, 0x52, 0x17, 0x69, 0x66, 0x53, 0x6f,\n\t0x75, 0x72, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61,\n\t0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1e, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75,\n\t0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e,\n\t0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x48, 0x05,\n\t0x52, 0x1a, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12,\n\t0x48, 0x0a, 0x1e, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74,\n\t0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63,\n\t0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x48, 0x06, 0x52, 0x1b, 0x69, 0x66, 0x53, 0x6f, 0x75,\n\t0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x22, 0x69, 0x66, 0x5f,\n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18,\n\t0x0e, 0x20, 0x01, 0x28, 0x03, 0x48, 0x07, 0x52, 0x1e, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63,\n\t0x65, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e,\n\t0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x1c, 0x6d, 0x61,\n\t0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65,\n\t0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03,\n\t0x52, 0x18, 0x6d, 0x61, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74,\n\t0x74, 0x65, 0x6e, 0x50, 0x65, 0x72, 0x43, 0x61, 0x6c, 0x6c, 0x12, 0x47, 0x0a, 0x20, 0x63, 0x6f,\n\t0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x10,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65,\n\t0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69,\n\t0x74, 0x68, 0x6d, 0x12, 0x46, 0x0a, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72,\n\t0x63, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65,\n\t0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x1c, 0x63,\n\t0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x53, 0x0a, 0x27, 0x63,\n\t0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36,\n\t0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x22, 0x63, 0x6f,\n\t0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73,\n\t0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63,\n\t0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73,\n\t0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f,\n\t0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61,\n\t0x72, 0x61, 0x6d, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12,\n\t0x4d, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73,\n\t0x75, 0x6d, 0x73, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62,\n\t0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x52, 0x0f, 0x6f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x42, 0x16,\n\t0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74,\n\t0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e,\n\t0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1d,\n\t0x0a, 0x1b, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x21, 0x0a,\n\t0x1f, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,\n\t0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d,\n\t0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61,\n\t0x74, 0x63, 0x68, 0x42, 0x25, 0x0a, 0x23, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63,\n\t0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xd6, 0x01, 0x0a, 0x0f, 0x52,\n\t0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32,\n\t0x0a, 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x72, 0x65,\n\t0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x74,\n\t0x6f, 0x74, 0x61, 0x6c, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x74,\n\t0x65, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x69, 0x7a,\n\t0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53,\n\t0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x08, 0x52, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x72, 0x69,\n\t0x74, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,\n\t0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x35, 0x0a, 0x08,\n\t0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,\n\t0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75,\n\t0x72, 0x63, 0x65, 0x22, 0xec, 0x07, 0x0a, 0x11, 0x4d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63,\n\t0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41,\n\t0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74,\n\t0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72,\n\t0x63, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42,\n\t0x03, 0xe0, 0x41, 0x02, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x12, 0x32, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,\n\t0xe0, 0x41, 0x02, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x45, 0x0a, 0x1a, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75,\n\t0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d,\n\t0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48,\n\t0x00, 0x52, 0x17, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x4c, 0x0a,\n\t0x1e, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18,\n\t0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x01, 0x52, 0x1a, 0x69, 0x66,\n\t0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x4d, 0x0a, 0x1e, 0x69,\n\t0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20,\n\t0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x02, 0x52, 0x1b, 0x69, 0x66, 0x53, 0x6f,\n\t0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x22, 0x69, 0x66,\n\t0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,\n\t0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x03, 0x52, 0x1e, 0x69,\n\t0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01,\n\t0x12, 0x38, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0,\n\t0x41, 0x01, 0x48, 0x04, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x17, 0x69, 0x66,\n\t0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f,\n\t0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01,\n\t0x48, 0x05, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x17, 0x69,\n\t0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41,\n\t0x01, 0x48, 0x06, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a,\n\t0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0b, 0x20, 0x01,\n\t0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x07, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74,\n\t0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61,\n\t0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f,\n\t0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,\n\t0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75,\n\t0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e,\n\t0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x66, 0x5f,\n\t0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,\n\t0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x25, 0x0a, 0x23, 0x5f,\n\t0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74,\n\t0x63, 0x68, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69,\n\t0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74,\n\t0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65,\n\t0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74,\n\t0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65,\n\t0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74,\n\t0x63, 0x68, 0x22, 0xaf, 0x02, 0x0a, 0x1a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75,\n\t0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x12, 0x53, 0x0a, 0x11, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63,\n\t0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,\n\t0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63,\n\t0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,\n\t0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f,\n\t0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,\n\t0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d,\n\t0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50,\n\t0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x4d, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f,\n\t0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,\n\t0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73,\n\t0x75, 0x6d, 0x73, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b,\n\t0x73, 0x75, 0x6d, 0x73, 0x22, 0x3a, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73,\n\t0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64,\n\t0x22, 0x87, 0x05, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63,\n\t0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,\n\t0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,\n\t0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52,\n\t0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74,\n\t0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01,\n\t0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01,\n\t0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42,\n\t0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20,\n\t0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e,\n\t0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88,\n\t0x01, 0x01, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64,\n\t0x5f, 0x61, 0x63, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x64,\n\t0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64,\n\t0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,\n\t0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52,\n\t0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x6d, 0x0a, 0x1c, 0x63,\n\t0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,\n\t0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52,\n\t0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69,\n\t0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74,\n\t0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a,\n\t0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69,\n\t0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xbf, 0x01, 0x0a, 0x19, 0x43,\n\t0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x65, 0x6e, 0x63, 0x72,\n\t0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x30, 0x0a, 0x14, 0x65,\n\t0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x79,\n\t0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3d, 0x0a,\n\t0x1b, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f,\n\t0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01,\n\t0x28, 0x0c, 0x52, 0x18, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65,\n\t0x79, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xca, 0x05, 0x0a,\n\t0x10, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74,\n\t0x73, 0x22, 0xb5, 0x05, 0x0a, 0x06, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x12,\n\t0x56, 0x41, 0x4c, 0x55, 0x45, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,\n\t0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x14, 0x4d, 0x41, 0x58, 0x5f, 0x52, 0x45, 0x41, 0x44,\n\t0x5f, 0x43, 0x48, 0x55, 0x4e, 0x4b, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0x80, 0x80,\n\t0x01, 0x12, 0x1c, 0x0a, 0x15, 0x4d, 0x41, 0x58, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x43,\n\t0x48, 0x55, 0x4e, 0x4b, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0x80, 0x80, 0x01, 0x12,\n\t0x19, 0x0a, 0x12, 0x4d, 0x41, 0x58, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x53, 0x49,\n\t0x5a, 0x45, 0x5f, 0x4d, 0x42, 0x10, 0x80, 0x80, 0xc0, 0x02, 0x12, 0x29, 0x0a, 0x24, 0x4d, 0x41,\n\t0x58, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54,\n\t0x41, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x42, 0x59, 0x54,\n\t0x45, 0x53, 0x10, 0x80, 0x08, 0x12, 0x2a, 0x0a, 0x25, 0x4d, 0x41, 0x58, 0x5f, 0x43, 0x55, 0x53,\n\t0x54, 0x4f, 0x4d, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x46, 0x49, 0x45,\n\t0x4c, 0x44, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x80,\n\t0x20, 0x12, 0x29, 0x0a, 0x24, 0x4d, 0x41, 0x58, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f,\n\t0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x5f, 0x53,\n\t0x49, 0x5a, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0x40, 0x12, 0x2a, 0x0a, 0x24,\n\t0x4d, 0x41, 0x58, 0x5f, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44,\n\t0x41, 0x54, 0x41, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x42,\n\t0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0xa0, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x41, 0x58, 0x5f,\n\t0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e,\n\t0x46, 0x49, 0x47, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x10,\n\t0x64, 0x12, 0x22, 0x0a, 0x1e, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x49, 0x46, 0x45, 0x43, 0x59, 0x43,\n\t0x4c, 0x45, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x42, 0x55, 0x43,\n\t0x4b, 0x45, 0x54, 0x10, 0x64, 0x12, 0x26, 0x0a, 0x22, 0x4d, 0x41, 0x58, 0x5f, 0x4e, 0x4f, 0x54,\n\t0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d,\n\t0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x53, 0x10, 0x05, 0x12, 0x31, 0x0a,\n\t0x2c, 0x4d, 0x41, 0x58, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f,\n\t0x4e, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x42, 0x55,\n\t0x54, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x80, 0x02,\n\t0x12, 0x33, 0x0a, 0x2e, 0x4d, 0x41, 0x58, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41,\n\t0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x41, 0x54, 0x54, 0x52,\n\t0x49, 0x42, 0x55, 0x54, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47,\n\t0x54, 0x48, 0x10, 0x80, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x41, 0x42,\n\t0x45, 0x4c, 0x53, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x49, 0x45, 0x53, 0x5f, 0x43, 0x4f, 0x55, 0x4e,\n\t0x54, 0x10, 0x40, 0x12, 0x1f, 0x0a, 0x1b, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c,\n\t0x53, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47,\n\t0x54, 0x48, 0x10, 0x3f, 0x12, 0x1f, 0x0a, 0x1a, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x41, 0x42, 0x45,\n\t0x4c, 0x53, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x42, 0x59, 0x54,\n\t0x45, 0x53, 0x10, 0x80, 0x01, 0x12, 0x2e, 0x0a, 0x29, 0x4d, 0x41, 0x58, 0x5f, 0x4f, 0x42, 0x4a,\n\t0x45, 0x43, 0x54, 0x5f, 0x49, 0x44, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x4c, 0x45,\n\t0x54, 0x45, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45,\n\t0x53, 0x54, 0x10, 0xe8, 0x07, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x50, 0x4c, 0x49, 0x54, 0x5f, 0x54,\n\t0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x44,\n\t0x41, 0x59, 0x53, 0x10, 0x0e, 0x1a, 0x02, 0x10, 0x01, 0x22, 0x86, 0x24, 0x0a, 0x06, 0x42, 0x75,\n\t0x63, 0x6b, 0x65, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a,\n\t0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12,\n\t0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65,\n\t0x74, 0x61, 0x67, 0x12, 0x4d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03,\n\t0x20, 0x01, 0x28, 0x09, 0x42, 0x33, 0xe0, 0x41, 0x05, 0xfa, 0x41, 0x2d, 0x0a, 0x2b, 0x63, 0x6c,\n\t0x6f, 0x75, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x67,\n\t0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65,\n\t0x63, 0x74, 0x12, 0x2b, 0x0a, 0x0e, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52,\n\t0x0e, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,\n\t0x1f, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28,\n\t0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x12, 0x28, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70,\n\t0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0c, 0x6c, 0x6f,\n\t0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74,\n\t0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12,\n\t0x10, 0x0a, 0x03, 0x72, 0x70, 0x6f, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x70,\n\t0x6f, 0x12, 0x38, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,\n\t0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43,\n\t0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, 0x54, 0x0a, 0x12, 0x64,\n\t0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x61, 0x63,\n\t0x6c, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52,\n\t0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63,\n\t0x6c, 0x12, 0x41, 0x0a, 0x09, 0x6c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x18, 0x0a,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,\n\t0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e,\n\t0x4c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x52, 0x09, 0x6c, 0x69, 0x66, 0x65, 0x63,\n\t0x79, 0x63, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74,\n\t0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65,\n\t0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61,\n\t0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x63, 0x6f, 0x72, 0x73, 0x18, 0x0c,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,\n\t0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e,\n\t0x43, 0x6f, 0x72, 0x73, 0x52, 0x04, 0x63, 0x6f, 0x72, 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70,\n\t0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03,\n\t0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x18,\n\t0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61,\n\t0x73, 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15,\n\t0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x73, 0x65,\n\t0x64, 0x48, 0x6f, 0x6c, 0x64, 0x12, 0x3d, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18,\n\t0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,\n\t0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74,\n\t0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61,\n\t0x62, 0x65, 0x6c, 0x73, 0x12, 0x3b, 0x0a, 0x07, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x18,\n\t0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,\n\t0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74,\n\t0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x07, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74,\n\t0x65, 0x12, 0x44, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18,\n\t0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,\n\t0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74,\n\t0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x76, 0x65, 0x72,\n\t0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x3b, 0x0a, 0x07, 0x6c, 0x6f, 0x67, 0x67, 0x69,\n\t0x6e, 0x67, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63,\n\t0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x6c, 0x6f, 0x67,\n\t0x67, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x13, 0x20,\n\t0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,\n\t0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x42, 0x03, 0xe0,\n\t0x41, 0x03, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x0a, 0x65, 0x6e, 0x63,\n\t0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,\n\t0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12,\n\t0x3b, 0x0a, 0x07, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,\n\t0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x42, 0x69, 0x6c, 0x6c,\n\t0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x54, 0x0a, 0x10,\n\t0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79,\n\t0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65,\n\t0x74, 0x2e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63,\n\t0x79, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69,\n\t0x63, 0x79, 0x12, 0x42, 0x0a, 0x0a, 0x69, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,\n\t0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65,\n\t0x74, 0x2e, 0x49, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, 0x69, 0x61, 0x6d,\n\t0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66,\n\t0x69, 0x65, 0x73, 0x5f, 0x70, 0x7a, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x73,\n\t0x61, 0x74, 0x69, 0x73, 0x66, 0x69, 0x65, 0x73, 0x50, 0x7a, 0x73, 0x12, 0x67, 0x0a, 0x17, 0x63,\n\t0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f,\n\t0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,\n\t0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x6c,\n\t0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x15, 0x63,\n\t0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f,\n\t0x6e, 0x66, 0x69, 0x67, 0x12, 0x41, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6c, 0x61, 0x73,\n\t0x73, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b,\n\t0x65, 0x74, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x09, 0x61, 0x75,\n\t0x74, 0x6f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x6b, 0x0a, 0x16, 0x68, 0x69, 0x65, 0x72, 0x61,\n\t0x72, 0x63, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63,\n\t0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b,\n\t0x65, 0x74, 0x2e, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x4e,\n\t0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x15, 0x68,\n\t0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73,\n\t0x70, 0x61, 0x63, 0x65, 0x12, 0x5d, 0x0a, 0x12, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c,\n\t0x65, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,\n\t0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x53, 0x6f, 0x66, 0x74,\n\t0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x03, 0xe0, 0x41,\n\t0x01, 0x52, 0x10, 0x73, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c,\n\t0x69, 0x63, 0x79, 0x1a, 0x30, 0x0a, 0x07, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x25,\n\t0x0a, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x79, 0x73,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65,\n\t0x72, 0x50, 0x61, 0x79, 0x73, 0x1a, 0x87, 0x01, 0x0a, 0x04, 0x43, 0x6f, 0x72, 0x73, 0x12, 0x16,\n\t0x0a, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06,\n\t0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64,\n\t0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x27,\n\t0x0a, 0x0f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65,\n\t0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,\n\t0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x61,\n\t0x67, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05,\n\t0x52, 0x0d, 0x6d, 0x61, 0x78, 0x41, 0x67, 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x1a,\n\t0x5c, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a,\n\t0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f,\n\t0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73,\n\t0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x52, 0x0d,\n\t0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x1a, 0xb1, 0x02,\n\t0x0a, 0x09, 0x49, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x7b, 0x0a, 0x1b, 0x75,\n\t0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6c, 0x65,\n\t0x76, 0x65, 0x6c, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,\n\t0x32, 0x3c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,\n\t0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x49, 0x61, 0x6d, 0x43,\n\t0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x42, 0x75, 0x63,\n\t0x6b, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x18,\n\t0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4c, 0x65, 0x76,\n\t0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x70, 0x75, 0x62, 0x6c,\n\t0x69, 0x63, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e,\n\t0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x70, 0x75, 0x62, 0x6c,\n\t0x69, 0x63, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x69,\n\t0x6f, 0x6e, 0x1a, 0x6d, 0x0a, 0x18, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x42, 0x75, 0x63,\n\t0x6b, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x18,\n\t0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52,\n\t0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b,\n\t0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69,\n\t0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d,\n\t0x65, 0x1a, 0xdb, 0x07, 0x0a, 0x09, 0x4c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x12,\n\t0x3c, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,\n\t0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63,\n\t0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x1a, 0x8f, 0x07,\n\t0x0a, 0x04, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x47, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65,\n\t0x74, 0x2e, 0x4c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65,\n\t0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12,\n\t0x50, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,\n\t0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x69,\n\t0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x2e, 0x43, 0x6f, 0x6e,\n\t0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f,\n\t0x6e, 0x1a, 0x41, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74,\n\t0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12,\n\t0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73,\n\t0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43,\n\t0x6c, 0x61, 0x73, 0x73, 0x1a, 0xa8, 0x05, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69,\n\t0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x07, 0x61, 0x67, 0x65, 0x44, 0x61, 0x79, 0x73, 0x88,\n\t0x01, 0x01, 0x12, 0x38, 0x0a, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x65,\n\t0x66, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x63,\n\t0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x1c, 0x0a, 0x07,\n\t0x69, 0x73, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52,\n\t0x06, 0x69, 0x73, 0x4c, 0x69, 0x76, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6e, 0x75,\n\t0x6d, 0x5f, 0x6e, 0x65, 0x77, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73,\n\t0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x4e, 0x65, 0x77,\n\t0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a,\n\t0x15, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,\n\t0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x6d, 0x61,\n\t0x74, 0x63, 0x68, 0x65, 0x73, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73,\n\t0x73, 0x12, 0x38, 0x0a, 0x16, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f,\n\t0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28,\n\t0x05, 0x48, 0x03, 0x52, 0x13, 0x64, 0x61, 0x79, 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x43, 0x75,\n\t0x73, 0x74, 0x6f, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x12, 0x63,\n\t0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72,\n\t0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x10, 0x63, 0x75, 0x73, 0x74,\n\t0x6f, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x40, 0x0a, 0x1a,\n\t0x64, 0x61, 0x79, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x75,\n\t0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05,\n\t0x48, 0x04, 0x52, 0x17, 0x64, 0x61, 0x79, 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x6f, 0x6e,\n\t0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x47,\n\t0x0a, 0x16, 0x6e, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d,\n\t0x65, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x61, 0x74,\n\t0x65, 0x52, 0x14, 0x6e, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d,\n\t0x65, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x74, 0x63, 0x68,\n\t0x65, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52,\n\t0x0d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x25,\n\t0x0a, 0x0e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x5f, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78,\n\t0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x53,\n\t0x75, 0x66, 0x66, 0x69, 0x78, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x61,\n\t0x79, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x69, 0x73, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x42, 0x15,\n\t0x0a, 0x13, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x6e, 0x65, 0x77, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72,\n\t0x73, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x73,\n\t0x69, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65,\n\t0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f,\n\t0x6e, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x1a,\n\t0x54, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f,\n\t0x67, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,\n\t0x6c, 0x6f, 0x67, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x6f, 0x67,\n\t0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x6f, 0x67, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50,\n\t0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0xbb, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74,\n\t0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x41, 0x0a, 0x0e, 0x65, 0x66, 0x66,\n\t0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,\n\t0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x65,\n\t0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09,\n\t0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52,\n\t0x08, 0x69, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x12, 0x72, 0x65, 0x74,\n\t0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,\n\t0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x52, 0x11, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74,\n\t0x69, 0x6f, 0x6e, 0x1a, 0xd3, 0x01, 0x0a, 0x10, 0x53, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65,\n\t0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x74, 0x65,\n\t0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48,\n\t0x00, 0x52, 0x11, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x0e, 0x65, 0x66, 0x66, 0x65, 0x63,\n\t0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,\n\t0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x0d, 0x65,\n\t0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42,\n\t0x15, 0x0a, 0x13, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63,\n\t0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0x26, 0x0a, 0x0a, 0x56, 0x65, 0x72,\n\t0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c,\n\t0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65,\n\t0x64, 0x1a, 0x59, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x10,\n\t0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78,\n\t0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x67, 0x65,\n\t0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x74, 0x5f, 0x66, 0x6f,\n\t0x75, 0x6e, 0x64, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,\n\t0x6e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x61, 0x67, 0x65, 0x1a, 0x3e, 0x0a, 0x15,\n\t0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43,\n\t0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6c, 0x6f,\n\t0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x64,\n\t0x61, 0x74, 0x61, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0xd6, 0x02, 0x0a,\n\t0x09, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e,\n\t0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61,\n\t0x62, 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x0b, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x5f, 0x74,\n\t0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65,\n\t0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x67, 0x67,\n\t0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x16, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e,\n\t0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73,\n\t0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e,\n\t0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x88, 0x01,\n\t0x01, 0x12, 0x70, 0x0a, 0x22, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74,\n\t0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61,\n\t0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x01,\n\t0x52, 0x1e, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67,\n\t0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65,\n\t0x88, 0x01, 0x01, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c,\n\t0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x42, 0x25,\n\t0x0a, 0x23, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x72,\n\t0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,\n\t0x5f, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0x36, 0x0a, 0x15, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63,\n\t0x68, 0x69, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d,\n\t0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42,\n\t0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0x39, 0x0a,\n\t0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,\n\t0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14,\n\t0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x58, 0xea, 0x41, 0x55, 0x0a, 0x1d, 0x73,\n\t0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69,\n\t0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x23, 0x70, 0x72,\n\t0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d,\n\t0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,\n\t0x7d, 0x2a, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x32, 0x06, 0x62, 0x75, 0x63, 0x6b,\n\t0x65, 0x74, 0x22, 0x97, 0x02, 0x0a, 0x13, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63,\n\t0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f,\n\t0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x0e,\n\t0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16,\n\t0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,\n\t0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x22, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,\n\t0x5f, 0x61, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52,\n\t0x09, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x41, 0x6c, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x6e,\n\t0x74, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65,\n\t0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18,\n\t0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x65,\n\t0x6d, 0x61, 0x69, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69,\n\t0x6c, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x70, 0x72, 0x6f,\n\t0x6a, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32,\n\t0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,\n\t0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52,\n\t0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x22, 0x5a, 0x0a, 0x0f,\n\t0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12,\n\t0x1f, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c,\n\t0x42, 0x05, 0xe0, 0x41, 0x01, 0x08, 0x01, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x12, 0x1b, 0x0a, 0x06, 0x63, 0x72, 0x63, 0x33, 0x32, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x07,\n\t0x48, 0x00, 0x52, 0x06, 0x63, 0x72, 0x63, 0x33, 0x32, 0x63, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a,\n\t0x07, 0x5f, 0x63, 0x72, 0x63, 0x33, 0x32, 0x63, 0x22, 0x54, 0x0a, 0x0f, 0x4f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x63,\n\t0x72, 0x63, 0x33, 0x32, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x07, 0x48, 0x00, 0x52, 0x06, 0x63,\n\t0x72, 0x63, 0x33, 0x32, 0x63, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x64, 0x35, 0x5f,\n\t0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x64, 0x35, 0x48,\n\t0x61, 0x73, 0x68, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x72, 0x63, 0x33, 0x32, 0x63, 0x22, 0x71,\n\t0x0a, 0x12, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70,\n\t0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x14, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x01, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x13, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6c,\n\t0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x28, 0x0a, 0x10, 0x6b, 0x65, 0x79, 0x5f, 0x73,\n\t0x68, 0x61, 0x32, 0x35, 0x36, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28,\n\t0x0c, 0x52, 0x0e, 0x6b, 0x65, 0x79, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x42, 0x79, 0x74, 0x65,\n\t0x73, 0x22, 0xbd, 0x0e, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x17, 0x0a, 0x04,\n\t0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x52,\n\t0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x05, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73,\n\t0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69,\n\t0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75,\n\t0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x1b, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41,\n\t0x05, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a,\n\t0x0d, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x23,\n\t0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x73,\n\t0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0e,\n\t0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04,\n\t0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0e, 0x6d, 0x65, 0x74, 0x61, 0x67,\n\t0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f,\n\t0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x17,\n\t0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41,\n\t0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x65,\n\t0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69,\n\t0x6e, 0x67, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69,\n\t0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x12, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74,\n\t0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e,\n\t0x74, 0x72, 0x6f, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x63, 0x68,\n\t0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x38, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18,\n\t0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,\n\t0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,\n\t0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x03, 0x61,\n\t0x63, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61,\n\t0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f,\n\t0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x40, 0x0a,\n\t0x0b, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01,\n\t0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03,\n\t0xe0, 0x41, 0x03, 0x52, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12,\n\t0x44, 0x0a, 0x0d, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65,\n\t0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,\n\t0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a,\n\t0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,\n\t0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e,\n\t0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61,\n\t0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a,\n\t0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x6f,\n\t0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0f, 0x20,\n\t0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e,\n\t0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x09, 0x63, 0x68, 0x65, 0x63,\n\t0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,\n\t0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x42,\n\t0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x12,\n\t0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x11,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,\n\t0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d,\n\t0x65, 0x12, 0x3f, 0x0a, 0x07, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x12, 0x20, 0x01,\n\t0x28, 0x09, 0x42, 0x26, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d,\n\t0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x52, 0x06, 0x6b, 0x6d, 0x73, 0x4b,\n\t0x65, 0x79, 0x12, 0x5a, 0x0a, 0x19, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x6f,\n\t0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18,\n\t0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,\n\t0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,\n\t0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x16, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74,\n\t0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x25,\n\t0x0a, 0x0e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x5f, 0x68, 0x6f, 0x6c, 0x64,\n\t0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72,\n\t0x79, 0x48, 0x6f, 0x6c, 0x64, 0x12, 0x4e, 0x0a, 0x15, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69,\n\t0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x15,\n\t0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,\n\t0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,\n\t0x52, 0x13, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x69, 0x72,\n\t0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,\n\t0x61, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79,\n\t0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2d, 0x0a, 0x10, 0x65, 0x76,\n\t0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x17,\n\t0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x0e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x73,\n\t0x65, 0x64, 0x48, 0x6f, 0x6c, 0x64, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x05, 0x6f, 0x77, 0x6e,\n\t0x65, 0x72, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x77, 0x6e,\n\t0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x56,\n\t0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79,\n\t0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,\n\t0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x12, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x45, 0x6e, 0x63, 0x72,\n\t0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,\n\t0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69,\n\t0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x54,\n\t0x69, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x10, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65,\n\t0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x02,\n\t0x52, 0x0e, 0x73, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65,\n\t0x88, 0x01, 0x01, 0x12, 0x4e, 0x0a, 0x10, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x65,\n\t0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,\n\t0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x03,\n\t0x52, 0x0e, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65,\n\t0x88, 0x01, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45,\n\t0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,\n\t0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,\n\t0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01,\n\t0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x6b,\n\t0x65, 0x6e, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x73,\n\t0x65, 0x64, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x73, 0x6f, 0x66, 0x74,\n\t0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x13, 0x0a, 0x11,\n\t0x5f, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d,\n\t0x65, 0x22, 0x97, 0x02, 0x0a, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x63, 0x65,\n\t0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c,\n\t0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x0e, 0x0a,\n\t0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a,\n\t0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65,\n\t0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x22, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f,\n\t0x61, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09,\n\t0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x41, 0x6c, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x6e, 0x74,\n\t0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e,\n\t0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x08,\n\t0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d,\n\t0x61, 0x69, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c,\n\t0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a,\n\t0x65, 0x63, 0x74, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,\n\t0x76, 0x32, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x0b,\n\t0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x22, 0x8e, 0x01, 0x0a, 0x13,\n\t0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01,\n\t0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,\n\t0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52,\n\t0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x66,\n\t0x69, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x65, 0x66,\n\t0x69, 0x78, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67,\n\t0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e,\n\t0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x48, 0x0a, 0x0b,\n\t0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x25, 0x0a, 0x0e, 0x70,\n\t0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6d, 0x62,\n\t0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,\n\t0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x3c, 0x0a, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12,\n\t0x16, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,\n\t0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x6e, 0x74, 0x69, 0x74,\n\t0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69,\n\t0x74, 0x79, 0x49, 0x64, 0x22, 0x5f, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52,\n\t0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e,\n\t0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x27, 0x0a, 0x0f,\n\t0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18,\n\t0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4c,\n\t0x65, 0x6e, 0x67, 0x74, 0x68, 0x32, 0xc1, 0x1e, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67,\n\t0x65, 0x12, 0x72, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65,\n\t0x74, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,\n\t0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b,\n\t0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,\n\t0x79, 0x22, 0x22, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x15,\n\t0x12, 0x13, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65,\n\t0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x6f, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x42, 0x75, 0x63, 0x6b,\n\t0x65, 0x74, 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,\n\t0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b,\n\t0x65, 0x74, 0x22, 0x22, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x8a, 0xd3, 0xe4, 0x93, 0x02,\n\t0x15, 0x12, 0x13, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b,\n\t0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xab, 0x01, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74,\n\t0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x72, 0x65, 0x61,\n\t0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,\n\t0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,\n\t0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x58, 0xda, 0x41, 0x17, 0x70,\n\t0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x62, 0x75, 0x63,\n\t0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x12, 0x16, 0x0a, 0x06,\n\t0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x0c, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,\n\t0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x1e, 0x0a, 0x0e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x70,\n\t0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0c, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,\n\t0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x85, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63,\n\t0x6b, 0x65, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,\n\t0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63,\n\t0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,\n\t0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x22, 0x27, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x8a, 0xd3,\n\t0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x0c,\n\t0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x93, 0x01, 0x0a,\n\t0x19, 0x4c, 0x6f, 0x63, 0x6b, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e,\n\t0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x33, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4c,\n\t0x6f, 0x63, 0x6b, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69,\n\t0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,\n\t0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,\n\t0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x26, 0xda, 0x41, 0x06, 0x62,\n\t0x75, 0x63, 0x6b, 0x65, 0x74, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06, 0x62,\n\t0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a,\n\t0x2a, 0x7d, 0x12, 0x75, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69,\n\t0x63, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e,\n\t0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x2a, 0xda,\n\t0x41, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x19,\n\t0x12, 0x17, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0b, 0x7b, 0x62,\n\t0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x7c, 0x0a, 0x0c, 0x53, 0x65, 0x74,\n\t0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x49, 0x61, 0x6d,\n\t0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f,\n\t0x6c, 0x69, 0x63, 0x79, 0x22, 0x31, 0xda, 0x41, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,\n\t0x65, 0x2c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17,\n\t0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63,\n\t0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x96, 0x02, 0x0a, 0x12, 0x54, 0x65, 0x73, 0x74,\n\t0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54,\n\t0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,\n\t0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d,\n\t0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x22, 0xaa, 0x01, 0xda, 0x41, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,\n\t0x65, 0x2c, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x8a, 0xd3, 0xe4,\n\t0x93, 0x02, 0x8c, 0x01, 0x12, 0x17, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,\n\t0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x34, 0x0a,\n\t0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x28, 0x7b, 0x62, 0x75, 0x63, 0x6b,\n\t0x65, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x75,\n\t0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73,\n\t0x2f, 0x2a, 0x2a, 0x12, 0x3b, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12,\n\t0x2f, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,\n\t0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d,\n\t0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x2a,\n\t0x12, 0x8a, 0x01, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65,\n\t0x74, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,\n\t0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b,\n\t0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75,\n\t0x63, 0x6b, 0x65, 0x74, 0x22, 0x37, 0xda, 0x41, 0x12, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c,\n\t0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x8a, 0xd3, 0xe4, 0x93, 0x02,\n\t0x1c, 0x12, 0x1a, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6e, 0x61, 0x6d, 0x65,\n\t0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x7e, 0x0a,\n\t0x0d, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,\n\t0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,\n\t0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x22, 0x29, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x0a, 0x12, 0x64, 0x65,\n\t0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,\n\t0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x98, 0x01,\n\t0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26,\n\t0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,\n\t0x76, 0x32, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x48,\n\t0xda, 0x41, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,\n\t0xda, 0x41, 0x18, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,\n\t0x2c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x8a, 0xd3, 0xe4, 0x93, 0x02,\n\t0x17, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75,\n\t0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x8d, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x73,\n\t0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52,\n\t0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75,\n\t0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,\n\t0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x38,\n\t0xda, 0x41, 0x18, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,\n\t0x2c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x8a, 0xd3, 0xe4, 0x93, 0x02,\n\t0x17, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75,\n\t0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xba, 0x01, 0x0a, 0x14, 0x43, 0x61, 0x6e,\n\t0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74,\n\t0x65, 0x12, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,\n\t0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x75,\n\t0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,\n\t0x74, 0x1a, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,\n\t0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x75,\n\t0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,\n\t0x73, 0x65, 0x22, 0x41, 0xda, 0x41, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64,\n\t0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64,\n\t0x5f, 0x69, 0x64, 0x12, 0x20, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x70, 0x72, 0x6f,\n\t0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f,\n\t0x2a, 0x7d, 0x2f, 0x2a, 0x2a, 0x12, 0x95, 0x01, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,\n\t0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63,\n\t0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x22, 0x48, 0xda, 0x41, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0xda, 0x41, 0x18, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,\n\t0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xa5, 0x01,\n\t0x0a, 0x0a, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x24, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,\n\t0x2e, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,\n\t0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63,\n\t0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0xda, 0x41, 0x0d, 0x62, 0x75,\n\t0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0xda, 0x41, 0x18, 0x62, 0x75,\n\t0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x67, 0x65, 0x6e, 0x65,\n\t0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06,\n\t0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d,\n\t0x2a, 0x2a, 0x7d, 0x30, 0x01, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65,\n\t0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64,\n\t0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,\n\t0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,\n\t0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x8a,\n\t0xd3, 0xe4, 0x93, 0x02, 0x28, 0x12, 0x26, 0x0a, 0x17, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x62,\n\t0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,\n\t0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x28, 0x01, 0x30,\n\t0x01, 0x12, 0x8c, 0x01, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,\n\t0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x39, 0xda, 0x41, 0x12, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,\n\t0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x8a, 0xd3, 0xe4, 0x93,\n\t0x02, 0x1e, 0x12, 0x1c, 0x0a, 0x0d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x62, 0x75, 0x63,\n\t0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d,\n\t0x12, 0x60, 0x0a, 0x0b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12,\n\t0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,\n\t0x2e, 0x76, 0x32, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65,\n\t0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,\n\t0x28, 0x01, 0x12, 0x6e, 0x0a, 0x0f, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,\n\t0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72,\n\t0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,\n\t0x1a, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,\n\t0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62,\n\t0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01,\n\t0x30, 0x01, 0x12, 0x84, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63,\n\t0x74, 0x73, 0x12, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,\n\t0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63,\n\t0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67,\n\t0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69,\n\t0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,\n\t0x65, 0x22, 0x26, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x8a, 0xd3, 0xe4, 0x93,\n\t0x02, 0x17, 0x12, 0x15, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x0b, 0x7b, 0x62,\n\t0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x98, 0x01, 0x0a, 0x0d, 0x52, 0x65,\n\t0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,\n\t0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71,\n\t0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,\n\t0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65,\n\t0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x34,\n\t0x12, 0x0f, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65,\n\t0x74, 0x12, 0x21, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,\n\t0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,\n\t0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xae, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65,\n\t0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x2d, 0x2e, 0x67,\n\t0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,\n\t0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57,\n\t0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,\n\t0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72,\n\t0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x8a, 0xd3, 0xe4,\n\t0x93, 0x02, 0x32, 0x12, 0x30, 0x0a, 0x21, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x62, 0x6a,\n\t0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,\n\t0x65, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65,\n\t0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xae, 0x01, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57,\n\t0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x51,\n\t0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52,\n\t0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,\n\t0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79,\n\t0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,\n\t0x6e, 0x73, 0x65, 0x22, 0x41, 0xda, 0x41, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69,\n\t0x64, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61,\n\t0x64, 0x5f, 0x69, 0x64, 0x12, 0x20, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x70, 0x72,\n\t0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73,\n\t0x2f, 0x2a, 0x7d, 0x2f, 0x2a, 0x2a, 0x12, 0x96, 0x01, 0x0a, 0x0a, 0x4d, 0x6f, 0x76, 0x65, 0x4f,\n\t0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,\n\t0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x4f, 0x62,\n\t0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f,\n\t0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,\n\t0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x47, 0xda, 0x41, 0x27, 0x62, 0x75, 0x63, 0x6b, 0x65,\n\t0x74, 0x2c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c,\n\t0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65,\n\t0x63, 0x74, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b,\n\t0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x1a,\n\t0xa7, 0x02, 0xca, 0x41, 0x16, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x8a, 0x02, 0x68,\n\t0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63,\n\t0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74,\n\t0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c,\n\t0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x72, 0x65, 0x61,\n\t0x64, 0x2d, 0x6f, 0x6e, 0x6c, 0x79, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77,\n\t0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f,\n\t0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x64, 0x65, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,\n\t0x65, 0x2e, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2c, 0x68,\n\t0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,\n\t0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x64,\n\t0x65, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f,\n\t0x6e, 0x6c, 0x79, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,\n\t0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61,\n\t0x75, 0x74, 0x68, 0x2f, 0x64, 0x65, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x72,\n\t0x65, 0x61, 0x64, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0xe2, 0x01, 0xea, 0x41, 0x78, 0x0a,\n\t0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n\t0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b,\n\t0x65, 0x79, 0x12, 0x53, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72,\n\t0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x2f, 0x7b, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6b, 0x65, 0x79, 0x52,\n\t0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x2f,\n\t0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x7b, 0x63, 0x72, 0x79, 0x70,\n\t0x74, 0x6f, 0x5f, 0x6b, 0x65, 0x79, 0x7d, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x42, 0x0c,\n\t0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3e,\n\t0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d,\n\t0x2f, 0x67, 0x6f, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65,\n\t0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61,\n\t0x67, 0x65, 0x70, 0x62, 0x3b, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x70, 0x62, 0x62, 0x06,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_google_storage_v2_storage_proto_rawDescOnce sync.Once\n\tfile_google_storage_v2_storage_proto_rawDescData = file_google_storage_v2_storage_proto_rawDesc\n)\n\nfunc file_google_storage_v2_storage_proto_rawDescGZIP() []byte {\n\tfile_google_storage_v2_storage_proto_rawDescOnce.Do(func() {\n\t\tfile_google_storage_v2_storage_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_storage_v2_storage_proto_rawDescData)\n\t})\n\treturn file_google_storage_v2_storage_proto_rawDescData\n}\n\nvar file_google_storage_v2_storage_proto_enumTypes = make([]protoimpl.EnumInfo, 1)\nvar file_google_storage_v2_storage_proto_msgTypes = make([]protoimpl.MessageInfo, 75)\nvar file_google_storage_v2_storage_proto_goTypes = []any{\n\t(ServiceConstants_Values)(0),                                  // 0: google.storage.v2.ServiceConstants.Values\n\t(*DeleteBucketRequest)(nil),                                   // 1: google.storage.v2.DeleteBucketRequest\n\t(*GetBucketRequest)(nil),                                      // 2: google.storage.v2.GetBucketRequest\n\t(*CreateBucketRequest)(nil),                                   // 3: google.storage.v2.CreateBucketRequest\n\t(*ListBucketsRequest)(nil),                                    // 4: google.storage.v2.ListBucketsRequest\n\t(*ListBucketsResponse)(nil),                                   // 5: google.storage.v2.ListBucketsResponse\n\t(*LockBucketRetentionPolicyRequest)(nil),                      // 6: google.storage.v2.LockBucketRetentionPolicyRequest\n\t(*UpdateBucketRequest)(nil),                                   // 7: google.storage.v2.UpdateBucketRequest\n\t(*ComposeObjectRequest)(nil),                                  // 8: google.storage.v2.ComposeObjectRequest\n\t(*DeleteObjectRequest)(nil),                                   // 9: google.storage.v2.DeleteObjectRequest\n\t(*RestoreObjectRequest)(nil),                                  // 10: google.storage.v2.RestoreObjectRequest\n\t(*CancelResumableWriteRequest)(nil),                           // 11: google.storage.v2.CancelResumableWriteRequest\n\t(*CancelResumableWriteResponse)(nil),                          // 12: google.storage.v2.CancelResumableWriteResponse\n\t(*ReadObjectRequest)(nil),                                     // 13: google.storage.v2.ReadObjectRequest\n\t(*GetObjectRequest)(nil),                                      // 14: google.storage.v2.GetObjectRequest\n\t(*ReadObjectResponse)(nil),                                    // 15: google.storage.v2.ReadObjectResponse\n\t(*BidiReadObjectSpec)(nil),                                    // 16: google.storage.v2.BidiReadObjectSpec\n\t(*BidiReadObjectRequest)(nil),                                 // 17: google.storage.v2.BidiReadObjectRequest\n\t(*BidiReadObjectResponse)(nil),                                // 18: google.storage.v2.BidiReadObjectResponse\n\t(*BidiReadObjectRedirectedError)(nil),                         // 19: google.storage.v2.BidiReadObjectRedirectedError\n\t(*BidiWriteObjectRedirectedError)(nil),                        // 20: google.storage.v2.BidiWriteObjectRedirectedError\n\t(*BidiReadObjectError)(nil),                                   // 21: google.storage.v2.BidiReadObjectError\n\t(*ReadRangeError)(nil),                                        // 22: google.storage.v2.ReadRangeError\n\t(*ReadRange)(nil),                                             // 23: google.storage.v2.ReadRange\n\t(*ObjectRangeData)(nil),                                       // 24: google.storage.v2.ObjectRangeData\n\t(*BidiReadHandle)(nil),                                        // 25: google.storage.v2.BidiReadHandle\n\t(*BidiWriteHandle)(nil),                                       // 26: google.storage.v2.BidiWriteHandle\n\t(*WriteObjectSpec)(nil),                                       // 27: google.storage.v2.WriteObjectSpec\n\t(*WriteObjectRequest)(nil),                                    // 28: google.storage.v2.WriteObjectRequest\n\t(*WriteObjectResponse)(nil),                                   // 29: google.storage.v2.WriteObjectResponse\n\t(*AppendObjectSpec)(nil),                                      // 30: google.storage.v2.AppendObjectSpec\n\t(*BidiWriteObjectRequest)(nil),                                // 31: google.storage.v2.BidiWriteObjectRequest\n\t(*BidiWriteObjectResponse)(nil),                               // 32: google.storage.v2.BidiWriteObjectResponse\n\t(*ListObjectsRequest)(nil),                                    // 33: google.storage.v2.ListObjectsRequest\n\t(*QueryWriteStatusRequest)(nil),                               // 34: google.storage.v2.QueryWriteStatusRequest\n\t(*QueryWriteStatusResponse)(nil),                              // 35: google.storage.v2.QueryWriteStatusResponse\n\t(*RewriteObjectRequest)(nil),                                  // 36: google.storage.v2.RewriteObjectRequest\n\t(*RewriteResponse)(nil),                                       // 37: google.storage.v2.RewriteResponse\n\t(*MoveObjectRequest)(nil),                                     // 38: google.storage.v2.MoveObjectRequest\n\t(*StartResumableWriteRequest)(nil),                            // 39: google.storage.v2.StartResumableWriteRequest\n\t(*StartResumableWriteResponse)(nil),                           // 40: google.storage.v2.StartResumableWriteResponse\n\t(*UpdateObjectRequest)(nil),                                   // 41: google.storage.v2.UpdateObjectRequest\n\t(*CommonObjectRequestParams)(nil),                             // 42: google.storage.v2.CommonObjectRequestParams\n\t(*ServiceConstants)(nil),                                      // 43: google.storage.v2.ServiceConstants\n\t(*Bucket)(nil),                                                // 44: google.storage.v2.Bucket\n\t(*BucketAccessControl)(nil),                                   // 45: google.storage.v2.BucketAccessControl\n\t(*ChecksummedData)(nil),                                       // 46: google.storage.v2.ChecksummedData\n\t(*ObjectChecksums)(nil),                                       // 47: google.storage.v2.ObjectChecksums\n\t(*CustomerEncryption)(nil),                                    // 48: google.storage.v2.CustomerEncryption\n\t(*Object)(nil),                                                // 49: google.storage.v2.Object\n\t(*ObjectAccessControl)(nil),                                   // 50: google.storage.v2.ObjectAccessControl\n\t(*ListObjectsResponse)(nil),                                   // 51: google.storage.v2.ListObjectsResponse\n\t(*ProjectTeam)(nil),                                           // 52: google.storage.v2.ProjectTeam\n\t(*Owner)(nil),                                                 // 53: google.storage.v2.Owner\n\t(*ContentRange)(nil),                                          // 54: google.storage.v2.ContentRange\n\t(*ComposeObjectRequest_SourceObject)(nil),                     // 55: google.storage.v2.ComposeObjectRequest.SourceObject\n\t(*ComposeObjectRequest_SourceObject_ObjectPreconditions)(nil), // 56: google.storage.v2.ComposeObjectRequest.SourceObject.ObjectPreconditions\n\t(*Bucket_Billing)(nil),                                        // 57: google.storage.v2.Bucket.Billing\n\t(*Bucket_Cors)(nil),                                           // 58: google.storage.v2.Bucket.Cors\n\t(*Bucket_Encryption)(nil),                                     // 59: google.storage.v2.Bucket.Encryption\n\t(*Bucket_IamConfig)(nil),                                      // 60: google.storage.v2.Bucket.IamConfig\n\t(*Bucket_Lifecycle)(nil),                                      // 61: google.storage.v2.Bucket.Lifecycle\n\t(*Bucket_Logging)(nil),                                        // 62: google.storage.v2.Bucket.Logging\n\t(*Bucket_RetentionPolicy)(nil),                                // 63: google.storage.v2.Bucket.RetentionPolicy\n\t(*Bucket_SoftDeletePolicy)(nil),                               // 64: google.storage.v2.Bucket.SoftDeletePolicy\n\t(*Bucket_Versioning)(nil),                                     // 65: google.storage.v2.Bucket.Versioning\n\t(*Bucket_Website)(nil),                                        // 66: google.storage.v2.Bucket.Website\n\t(*Bucket_CustomPlacementConfig)(nil),                          // 67: google.storage.v2.Bucket.CustomPlacementConfig\n\t(*Bucket_Autoclass)(nil),                                      // 68: google.storage.v2.Bucket.Autoclass\n\t(*Bucket_HierarchicalNamespace)(nil),                          // 69: google.storage.v2.Bucket.HierarchicalNamespace\n\tnil,                                                           // 70: google.storage.v2.Bucket.LabelsEntry\n\t(*Bucket_IamConfig_UniformBucketLevelAccess)(nil),             // 71: google.storage.v2.Bucket.IamConfig.UniformBucketLevelAccess\n\t(*Bucket_Lifecycle_Rule)(nil),                                 // 72: google.storage.v2.Bucket.Lifecycle.Rule\n\t(*Bucket_Lifecycle_Rule_Action)(nil),                          // 73: google.storage.v2.Bucket.Lifecycle.Rule.Action\n\t(*Bucket_Lifecycle_Rule_Condition)(nil),                       // 74: google.storage.v2.Bucket.Lifecycle.Rule.Condition\n\tnil,                                                           // 75: google.storage.v2.Object.MetadataEntry\n\t(*fieldmaskpb.FieldMask)(nil),                                 // 76: google.protobuf.FieldMask\n\t(*status.Status)(nil),                                         // 77: google.rpc.Status\n\t(*timestamppb.Timestamp)(nil),                                 // 78: google.protobuf.Timestamp\n\t(*durationpb.Duration)(nil),                                   // 79: google.protobuf.Duration\n\t(*date.Date)(nil),                                             // 80: google.type.Date\n\t(*iampb.GetIamPolicyRequest)(nil),                             // 81: google.iam.v1.GetIamPolicyRequest\n\t(*iampb.SetIamPolicyRequest)(nil),                             // 82: google.iam.v1.SetIamPolicyRequest\n\t(*iampb.TestIamPermissionsRequest)(nil),                       // 83: google.iam.v1.TestIamPermissionsRequest\n\t(*emptypb.Empty)(nil),                                         // 84: google.protobuf.Empty\n\t(*iampb.Policy)(nil),                                          // 85: google.iam.v1.Policy\n\t(*iampb.TestIamPermissionsResponse)(nil),                      // 86: google.iam.v1.TestIamPermissionsResponse\n}\nvar file_google_storage_v2_storage_proto_depIdxs = []int32{\n\t76,  // 0: google.storage.v2.GetBucketRequest.read_mask:type_name -> google.protobuf.FieldMask\n\t44,  // 1: google.storage.v2.CreateBucketRequest.bucket:type_name -> google.storage.v2.Bucket\n\t76,  // 2: google.storage.v2.ListBucketsRequest.read_mask:type_name -> google.protobuf.FieldMask\n\t44,  // 3: google.storage.v2.ListBucketsResponse.buckets:type_name -> google.storage.v2.Bucket\n\t44,  // 4: google.storage.v2.UpdateBucketRequest.bucket:type_name -> google.storage.v2.Bucket\n\t76,  // 5: google.storage.v2.UpdateBucketRequest.update_mask:type_name -> google.protobuf.FieldMask\n\t49,  // 6: google.storage.v2.ComposeObjectRequest.destination:type_name -> google.storage.v2.Object\n\t55,  // 7: google.storage.v2.ComposeObjectRequest.source_objects:type_name -> google.storage.v2.ComposeObjectRequest.SourceObject\n\t42,  // 8: google.storage.v2.ComposeObjectRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams\n\t47,  // 9: google.storage.v2.ComposeObjectRequest.object_checksums:type_name -> google.storage.v2.ObjectChecksums\n\t42,  // 10: google.storage.v2.DeleteObjectRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams\n\t42,  // 11: google.storage.v2.RestoreObjectRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams\n\t42,  // 12: google.storage.v2.ReadObjectRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams\n\t76,  // 13: google.storage.v2.ReadObjectRequest.read_mask:type_name -> google.protobuf.FieldMask\n\t42,  // 14: google.storage.v2.GetObjectRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams\n\t76,  // 15: google.storage.v2.GetObjectRequest.read_mask:type_name -> google.protobuf.FieldMask\n\t46,  // 16: google.storage.v2.ReadObjectResponse.checksummed_data:type_name -> google.storage.v2.ChecksummedData\n\t47,  // 17: google.storage.v2.ReadObjectResponse.object_checksums:type_name -> google.storage.v2.ObjectChecksums\n\t54,  // 18: google.storage.v2.ReadObjectResponse.content_range:type_name -> google.storage.v2.ContentRange\n\t49,  // 19: google.storage.v2.ReadObjectResponse.metadata:type_name -> google.storage.v2.Object\n\t42,  // 20: google.storage.v2.BidiReadObjectSpec.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams\n\t76,  // 21: google.storage.v2.BidiReadObjectSpec.read_mask:type_name -> google.protobuf.FieldMask\n\t25,  // 22: google.storage.v2.BidiReadObjectSpec.read_handle:type_name -> google.storage.v2.BidiReadHandle\n\t16,  // 23: google.storage.v2.BidiReadObjectRequest.read_object_spec:type_name -> google.storage.v2.BidiReadObjectSpec\n\t23,  // 24: google.storage.v2.BidiReadObjectRequest.read_ranges:type_name -> google.storage.v2.ReadRange\n\t24,  // 25: google.storage.v2.BidiReadObjectResponse.object_data_ranges:type_name -> google.storage.v2.ObjectRangeData\n\t49,  // 26: google.storage.v2.BidiReadObjectResponse.metadata:type_name -> google.storage.v2.Object\n\t25,  // 27: google.storage.v2.BidiReadObjectResponse.read_handle:type_name -> google.storage.v2.BidiReadHandle\n\t25,  // 28: google.storage.v2.BidiReadObjectRedirectedError.read_handle:type_name -> google.storage.v2.BidiReadHandle\n\t26,  // 29: google.storage.v2.BidiWriteObjectRedirectedError.write_handle:type_name -> google.storage.v2.BidiWriteHandle\n\t22,  // 30: google.storage.v2.BidiReadObjectError.read_range_errors:type_name -> google.storage.v2.ReadRangeError\n\t77,  // 31: google.storage.v2.ReadRangeError.status:type_name -> google.rpc.Status\n\t46,  // 32: google.storage.v2.ObjectRangeData.checksummed_data:type_name -> google.storage.v2.ChecksummedData\n\t23,  // 33: google.storage.v2.ObjectRangeData.read_range:type_name -> google.storage.v2.ReadRange\n\t49,  // 34: google.storage.v2.WriteObjectSpec.resource:type_name -> google.storage.v2.Object\n\t27,  // 35: google.storage.v2.WriteObjectRequest.write_object_spec:type_name -> google.storage.v2.WriteObjectSpec\n\t46,  // 36: google.storage.v2.WriteObjectRequest.checksummed_data:type_name -> google.storage.v2.ChecksummedData\n\t47,  // 37: google.storage.v2.WriteObjectRequest.object_checksums:type_name -> google.storage.v2.ObjectChecksums\n\t42,  // 38: google.storage.v2.WriteObjectRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams\n\t49,  // 39: google.storage.v2.WriteObjectResponse.resource:type_name -> google.storage.v2.Object\n\t26,  // 40: google.storage.v2.AppendObjectSpec.write_handle:type_name -> google.storage.v2.BidiWriteHandle\n\t27,  // 41: google.storage.v2.BidiWriteObjectRequest.write_object_spec:type_name -> google.storage.v2.WriteObjectSpec\n\t30,  // 42: google.storage.v2.BidiWriteObjectRequest.append_object_spec:type_name -> google.storage.v2.AppendObjectSpec\n\t46,  // 43: google.storage.v2.BidiWriteObjectRequest.checksummed_data:type_name -> google.storage.v2.ChecksummedData\n\t47,  // 44: google.storage.v2.BidiWriteObjectRequest.object_checksums:type_name -> google.storage.v2.ObjectChecksums\n\t42,  // 45: google.storage.v2.BidiWriteObjectRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams\n\t49,  // 46: google.storage.v2.BidiWriteObjectResponse.resource:type_name -> google.storage.v2.Object\n\t26,  // 47: google.storage.v2.BidiWriteObjectResponse.write_handle:type_name -> google.storage.v2.BidiWriteHandle\n\t76,  // 48: google.storage.v2.ListObjectsRequest.read_mask:type_name -> google.protobuf.FieldMask\n\t42,  // 49: google.storage.v2.QueryWriteStatusRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams\n\t49,  // 50: google.storage.v2.QueryWriteStatusResponse.resource:type_name -> google.storage.v2.Object\n\t49,  // 51: google.storage.v2.RewriteObjectRequest.destination:type_name -> google.storage.v2.Object\n\t42,  // 52: google.storage.v2.RewriteObjectRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams\n\t47,  // 53: google.storage.v2.RewriteObjectRequest.object_checksums:type_name -> google.storage.v2.ObjectChecksums\n\t49,  // 54: google.storage.v2.RewriteResponse.resource:type_name -> google.storage.v2.Object\n\t27,  // 55: google.storage.v2.StartResumableWriteRequest.write_object_spec:type_name -> google.storage.v2.WriteObjectSpec\n\t42,  // 56: google.storage.v2.StartResumableWriteRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams\n\t47,  // 57: google.storage.v2.StartResumableWriteRequest.object_checksums:type_name -> google.storage.v2.ObjectChecksums\n\t49,  // 58: google.storage.v2.UpdateObjectRequest.object:type_name -> google.storage.v2.Object\n\t76,  // 59: google.storage.v2.UpdateObjectRequest.update_mask:type_name -> google.protobuf.FieldMask\n\t42,  // 60: google.storage.v2.UpdateObjectRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams\n\t45,  // 61: google.storage.v2.Bucket.acl:type_name -> google.storage.v2.BucketAccessControl\n\t50,  // 62: google.storage.v2.Bucket.default_object_acl:type_name -> google.storage.v2.ObjectAccessControl\n\t61,  // 63: google.storage.v2.Bucket.lifecycle:type_name -> google.storage.v2.Bucket.Lifecycle\n\t78,  // 64: google.storage.v2.Bucket.create_time:type_name -> google.protobuf.Timestamp\n\t58,  // 65: google.storage.v2.Bucket.cors:type_name -> google.storage.v2.Bucket.Cors\n\t78,  // 66: google.storage.v2.Bucket.update_time:type_name -> google.protobuf.Timestamp\n\t70,  // 67: google.storage.v2.Bucket.labels:type_name -> google.storage.v2.Bucket.LabelsEntry\n\t66,  // 68: google.storage.v2.Bucket.website:type_name -> google.storage.v2.Bucket.Website\n\t65,  // 69: google.storage.v2.Bucket.versioning:type_name -> google.storage.v2.Bucket.Versioning\n\t62,  // 70: google.storage.v2.Bucket.logging:type_name -> google.storage.v2.Bucket.Logging\n\t53,  // 71: google.storage.v2.Bucket.owner:type_name -> google.storage.v2.Owner\n\t59,  // 72: google.storage.v2.Bucket.encryption:type_name -> google.storage.v2.Bucket.Encryption\n\t57,  // 73: google.storage.v2.Bucket.billing:type_name -> google.storage.v2.Bucket.Billing\n\t63,  // 74: google.storage.v2.Bucket.retention_policy:type_name -> google.storage.v2.Bucket.RetentionPolicy\n\t60,  // 75: google.storage.v2.Bucket.iam_config:type_name -> google.storage.v2.Bucket.IamConfig\n\t67,  // 76: google.storage.v2.Bucket.custom_placement_config:type_name -> google.storage.v2.Bucket.CustomPlacementConfig\n\t68,  // 77: google.storage.v2.Bucket.autoclass:type_name -> google.storage.v2.Bucket.Autoclass\n\t69,  // 78: google.storage.v2.Bucket.hierarchical_namespace:type_name -> google.storage.v2.Bucket.HierarchicalNamespace\n\t64,  // 79: google.storage.v2.Bucket.soft_delete_policy:type_name -> google.storage.v2.Bucket.SoftDeletePolicy\n\t52,  // 80: google.storage.v2.BucketAccessControl.project_team:type_name -> google.storage.v2.ProjectTeam\n\t50,  // 81: google.storage.v2.Object.acl:type_name -> google.storage.v2.ObjectAccessControl\n\t78,  // 82: google.storage.v2.Object.delete_time:type_name -> google.protobuf.Timestamp\n\t78,  // 83: google.storage.v2.Object.finalize_time:type_name -> google.protobuf.Timestamp\n\t78,  // 84: google.storage.v2.Object.create_time:type_name -> google.protobuf.Timestamp\n\t47,  // 85: google.storage.v2.Object.checksums:type_name -> google.storage.v2.ObjectChecksums\n\t78,  // 86: google.storage.v2.Object.update_time:type_name -> google.protobuf.Timestamp\n\t78,  // 87: google.storage.v2.Object.update_storage_class_time:type_name -> google.protobuf.Timestamp\n\t78,  // 88: google.storage.v2.Object.retention_expire_time:type_name -> google.protobuf.Timestamp\n\t75,  // 89: google.storage.v2.Object.metadata:type_name -> google.storage.v2.Object.MetadataEntry\n\t53,  // 90: google.storage.v2.Object.owner:type_name -> google.storage.v2.Owner\n\t48,  // 91: google.storage.v2.Object.customer_encryption:type_name -> google.storage.v2.CustomerEncryption\n\t78,  // 92: google.storage.v2.Object.custom_time:type_name -> google.protobuf.Timestamp\n\t78,  // 93: google.storage.v2.Object.soft_delete_time:type_name -> google.protobuf.Timestamp\n\t78,  // 94: google.storage.v2.Object.hard_delete_time:type_name -> google.protobuf.Timestamp\n\t52,  // 95: google.storage.v2.ObjectAccessControl.project_team:type_name -> google.storage.v2.ProjectTeam\n\t49,  // 96: google.storage.v2.ListObjectsResponse.objects:type_name -> google.storage.v2.Object\n\t56,  // 97: google.storage.v2.ComposeObjectRequest.SourceObject.object_preconditions:type_name -> google.storage.v2.ComposeObjectRequest.SourceObject.ObjectPreconditions\n\t71,  // 98: google.storage.v2.Bucket.IamConfig.uniform_bucket_level_access:type_name -> google.storage.v2.Bucket.IamConfig.UniformBucketLevelAccess\n\t72,  // 99: google.storage.v2.Bucket.Lifecycle.rule:type_name -> google.storage.v2.Bucket.Lifecycle.Rule\n\t78,  // 100: google.storage.v2.Bucket.RetentionPolicy.effective_time:type_name -> google.protobuf.Timestamp\n\t79,  // 101: google.storage.v2.Bucket.RetentionPolicy.retention_duration:type_name -> google.protobuf.Duration\n\t79,  // 102: google.storage.v2.Bucket.SoftDeletePolicy.retention_duration:type_name -> google.protobuf.Duration\n\t78,  // 103: google.storage.v2.Bucket.SoftDeletePolicy.effective_time:type_name -> google.protobuf.Timestamp\n\t78,  // 104: google.storage.v2.Bucket.Autoclass.toggle_time:type_name -> google.protobuf.Timestamp\n\t78,  // 105: google.storage.v2.Bucket.Autoclass.terminal_storage_class_update_time:type_name -> google.protobuf.Timestamp\n\t78,  // 106: google.storage.v2.Bucket.IamConfig.UniformBucketLevelAccess.lock_time:type_name -> google.protobuf.Timestamp\n\t73,  // 107: google.storage.v2.Bucket.Lifecycle.Rule.action:type_name -> google.storage.v2.Bucket.Lifecycle.Rule.Action\n\t74,  // 108: google.storage.v2.Bucket.Lifecycle.Rule.condition:type_name -> google.storage.v2.Bucket.Lifecycle.Rule.Condition\n\t80,  // 109: google.storage.v2.Bucket.Lifecycle.Rule.Condition.created_before:type_name -> google.type.Date\n\t80,  // 110: google.storage.v2.Bucket.Lifecycle.Rule.Condition.custom_time_before:type_name -> google.type.Date\n\t80,  // 111: google.storage.v2.Bucket.Lifecycle.Rule.Condition.noncurrent_time_before:type_name -> google.type.Date\n\t1,   // 112: google.storage.v2.Storage.DeleteBucket:input_type -> google.storage.v2.DeleteBucketRequest\n\t2,   // 113: google.storage.v2.Storage.GetBucket:input_type -> google.storage.v2.GetBucketRequest\n\t3,   // 114: google.storage.v2.Storage.CreateBucket:input_type -> google.storage.v2.CreateBucketRequest\n\t4,   // 115: google.storage.v2.Storage.ListBuckets:input_type -> google.storage.v2.ListBucketsRequest\n\t6,   // 116: google.storage.v2.Storage.LockBucketRetentionPolicy:input_type -> google.storage.v2.LockBucketRetentionPolicyRequest\n\t81,  // 117: google.storage.v2.Storage.GetIamPolicy:input_type -> google.iam.v1.GetIamPolicyRequest\n\t82,  // 118: google.storage.v2.Storage.SetIamPolicy:input_type -> google.iam.v1.SetIamPolicyRequest\n\t83,  // 119: google.storage.v2.Storage.TestIamPermissions:input_type -> google.iam.v1.TestIamPermissionsRequest\n\t7,   // 120: google.storage.v2.Storage.UpdateBucket:input_type -> google.storage.v2.UpdateBucketRequest\n\t8,   // 121: google.storage.v2.Storage.ComposeObject:input_type -> google.storage.v2.ComposeObjectRequest\n\t9,   // 122: google.storage.v2.Storage.DeleteObject:input_type -> google.storage.v2.DeleteObjectRequest\n\t10,  // 123: google.storage.v2.Storage.RestoreObject:input_type -> google.storage.v2.RestoreObjectRequest\n\t11,  // 124: google.storage.v2.Storage.CancelResumableWrite:input_type -> google.storage.v2.CancelResumableWriteRequest\n\t14,  // 125: google.storage.v2.Storage.GetObject:input_type -> google.storage.v2.GetObjectRequest\n\t13,  // 126: google.storage.v2.Storage.ReadObject:input_type -> google.storage.v2.ReadObjectRequest\n\t17,  // 127: google.storage.v2.Storage.BidiReadObject:input_type -> google.storage.v2.BidiReadObjectRequest\n\t41,  // 128: google.storage.v2.Storage.UpdateObject:input_type -> google.storage.v2.UpdateObjectRequest\n\t28,  // 129: google.storage.v2.Storage.WriteObject:input_type -> google.storage.v2.WriteObjectRequest\n\t31,  // 130: google.storage.v2.Storage.BidiWriteObject:input_type -> google.storage.v2.BidiWriteObjectRequest\n\t33,  // 131: google.storage.v2.Storage.ListObjects:input_type -> google.storage.v2.ListObjectsRequest\n\t36,  // 132: google.storage.v2.Storage.RewriteObject:input_type -> google.storage.v2.RewriteObjectRequest\n\t39,  // 133: google.storage.v2.Storage.StartResumableWrite:input_type -> google.storage.v2.StartResumableWriteRequest\n\t34,  // 134: google.storage.v2.Storage.QueryWriteStatus:input_type -> google.storage.v2.QueryWriteStatusRequest\n\t38,  // 135: google.storage.v2.Storage.MoveObject:input_type -> google.storage.v2.MoveObjectRequest\n\t84,  // 136: google.storage.v2.Storage.DeleteBucket:output_type -> google.protobuf.Empty\n\t44,  // 137: google.storage.v2.Storage.GetBucket:output_type -> google.storage.v2.Bucket\n\t44,  // 138: google.storage.v2.Storage.CreateBucket:output_type -> google.storage.v2.Bucket\n\t5,   // 139: google.storage.v2.Storage.ListBuckets:output_type -> google.storage.v2.ListBucketsResponse\n\t44,  // 140: google.storage.v2.Storage.LockBucketRetentionPolicy:output_type -> google.storage.v2.Bucket\n\t85,  // 141: google.storage.v2.Storage.GetIamPolicy:output_type -> google.iam.v1.Policy\n\t85,  // 142: google.storage.v2.Storage.SetIamPolicy:output_type -> google.iam.v1.Policy\n\t86,  // 143: google.storage.v2.Storage.TestIamPermissions:output_type -> google.iam.v1.TestIamPermissionsResponse\n\t44,  // 144: google.storage.v2.Storage.UpdateBucket:output_type -> google.storage.v2.Bucket\n\t49,  // 145: google.storage.v2.Storage.ComposeObject:output_type -> google.storage.v2.Object\n\t84,  // 146: google.storage.v2.Storage.DeleteObject:output_type -> google.protobuf.Empty\n\t49,  // 147: google.storage.v2.Storage.RestoreObject:output_type -> google.storage.v2.Object\n\t12,  // 148: google.storage.v2.Storage.CancelResumableWrite:output_type -> google.storage.v2.CancelResumableWriteResponse\n\t49,  // 149: google.storage.v2.Storage.GetObject:output_type -> google.storage.v2.Object\n\t15,  // 150: google.storage.v2.Storage.ReadObject:output_type -> google.storage.v2.ReadObjectResponse\n\t18,  // 151: google.storage.v2.Storage.BidiReadObject:output_type -> google.storage.v2.BidiReadObjectResponse\n\t49,  // 152: google.storage.v2.Storage.UpdateObject:output_type -> google.storage.v2.Object\n\t29,  // 153: google.storage.v2.Storage.WriteObject:output_type -> google.storage.v2.WriteObjectResponse\n\t32,  // 154: google.storage.v2.Storage.BidiWriteObject:output_type -> google.storage.v2.BidiWriteObjectResponse\n\t51,  // 155: google.storage.v2.Storage.ListObjects:output_type -> google.storage.v2.ListObjectsResponse\n\t37,  // 156: google.storage.v2.Storage.RewriteObject:output_type -> google.storage.v2.RewriteResponse\n\t40,  // 157: google.storage.v2.Storage.StartResumableWrite:output_type -> google.storage.v2.StartResumableWriteResponse\n\t35,  // 158: google.storage.v2.Storage.QueryWriteStatus:output_type -> google.storage.v2.QueryWriteStatusResponse\n\t49,  // 159: google.storage.v2.Storage.MoveObject:output_type -> google.storage.v2.Object\n\t136, // [136:160] is the sub-list for method output_type\n\t112, // [112:136] is the sub-list for method input_type\n\t112, // [112:112] is the sub-list for extension type_name\n\t112, // [112:112] is the sub-list for extension extendee\n\t0,   // [0:112] is the sub-list for field type_name\n}\n\nfunc init() { file_google_storage_v2_storage_proto_init() }\nfunc file_google_storage_v2_storage_proto_init() {\n\tif File_google_storage_v2_storage_proto != nil {\n\t\treturn\n\t}\n\tfile_google_storage_v2_storage_proto_msgTypes[0].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[1].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[3].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[6].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[7].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[8].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[9].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[12].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[13].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[15].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[18].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[19].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[26].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[27].OneofWrappers = []any{\n\t\t(*WriteObjectRequest_UploadId)(nil),\n\t\t(*WriteObjectRequest_WriteObjectSpec)(nil),\n\t\t(*WriteObjectRequest_ChecksummedData)(nil),\n\t}\n\tfile_google_storage_v2_storage_proto_msgTypes[28].OneofWrappers = []any{\n\t\t(*WriteObjectResponse_PersistedSize)(nil),\n\t\t(*WriteObjectResponse_Resource)(nil),\n\t}\n\tfile_google_storage_v2_storage_proto_msgTypes[29].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[30].OneofWrappers = []any{\n\t\t(*BidiWriteObjectRequest_UploadId)(nil),\n\t\t(*BidiWriteObjectRequest_WriteObjectSpec)(nil),\n\t\t(*BidiWriteObjectRequest_AppendObjectSpec)(nil),\n\t\t(*BidiWriteObjectRequest_ChecksummedData)(nil),\n\t}\n\tfile_google_storage_v2_storage_proto_msgTypes[31].OneofWrappers = []any{\n\t\t(*BidiWriteObjectResponse_PersistedSize)(nil),\n\t\t(*BidiWriteObjectResponse_Resource)(nil),\n\t}\n\tfile_google_storage_v2_storage_proto_msgTypes[32].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[34].OneofWrappers = []any{\n\t\t(*QueryWriteStatusResponse_PersistedSize)(nil),\n\t\t(*QueryWriteStatusResponse_Resource)(nil),\n\t}\n\tfile_google_storage_v2_storage_proto_msgTypes[35].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[37].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[40].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[45].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[46].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[48].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[55].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[63].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[67].OneofWrappers = []any{}\n\tfile_google_storage_v2_storage_proto_msgTypes[73].OneofWrappers = []any{}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_google_storage_v2_storage_proto_rawDesc,\n\t\t\tNumEnums:      1,\n\t\t\tNumMessages:   75,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   1,\n\t\t},\n\t\tGoTypes:           file_google_storage_v2_storage_proto_goTypes,\n\t\tDependencyIndexes: file_google_storage_v2_storage_proto_depIdxs,\n\t\tEnumInfos:         file_google_storage_v2_storage_proto_enumTypes,\n\t\tMessageInfos:      file_google_storage_v2_storage_proto_msgTypes,\n\t}.Build()\n\tFile_google_storage_v2_storage_proto = out.File\n\tfile_google_storage_v2_storage_proto_rawDesc = nil\n\tfile_google_storage_v2_storage_proto_goTypes = nil\n\tfile_google_storage_v2_storage_proto_depIdxs = nil\n}\n\n// Reference imports to suppress errors if they are not otherwise used.\nvar _ context.Context\nvar _ grpc.ClientConnInterface\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the grpc package it is being compiled against.\nconst _ = grpc.SupportPackageIsVersion6\n\n// StorageClient is the client API for Storage service.\n//\n// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.\ntype StorageClient interface {\n\t// Permanently deletes an empty bucket.\n\tDeleteBucket(ctx context.Context, in *DeleteBucketRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\t// Returns metadata for the specified bucket.\n\tGetBucket(ctx context.Context, in *GetBucketRequest, opts ...grpc.CallOption) (*Bucket, error)\n\t// Creates a new bucket.\n\tCreateBucket(ctx context.Context, in *CreateBucketRequest, opts ...grpc.CallOption) (*Bucket, error)\n\t// Retrieves a list of buckets for a given project.\n\tListBuckets(ctx context.Context, in *ListBucketsRequest, opts ...grpc.CallOption) (*ListBucketsResponse, error)\n\t// Locks retention policy on a bucket.\n\tLockBucketRetentionPolicy(ctx context.Context, in *LockBucketRetentionPolicyRequest, opts ...grpc.CallOption) (*Bucket, error)\n\t// Gets the IAM policy for a specified bucket.\n\t// The `resource` field in the request should be\n\t// `projects/_/buckets/{bucket}`.\n\tGetIamPolicy(ctx context.Context, in *iampb.GetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error)\n\t// Updates an IAM policy for the specified bucket.\n\t// The `resource` field in the request should be\n\t// `projects/_/buckets/{bucket}`.\n\tSetIamPolicy(ctx context.Context, in *iampb.SetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error)\n\t// Tests a set of permissions on the given bucket, object, or managed folder\n\t// to see which, if any, are held by the caller.\n\t// The `resource` field in the request should be\n\t// `projects/_/buckets/{bucket}` for a bucket,\n\t// `projects/_/buckets/{bucket}/objects/{object}` for an object, or\n\t// `projects/_/buckets/{bucket}/managedFolders/{managedFolder}`\n\t// for a managed folder.\n\tTestIamPermissions(ctx context.Context, in *iampb.TestIamPermissionsRequest, opts ...grpc.CallOption) (*iampb.TestIamPermissionsResponse, error)\n\t// Updates a bucket. Equivalent to JSON API's storage.buckets.patch method.\n\tUpdateBucket(ctx context.Context, in *UpdateBucketRequest, opts ...grpc.CallOption) (*Bucket, error)\n\t// Concatenates a list of existing objects into a new object in the same\n\t// bucket.\n\tComposeObject(ctx context.Context, in *ComposeObjectRequest, opts ...grpc.CallOption) (*Object, error)\n\t// Deletes an object and its metadata. Deletions are permanent if versioning\n\t// is not enabled for the bucket, or if the generation parameter is used, or\n\t// if [soft delete](https://cloud.google.com/storage/docs/soft-delete) is not\n\t// enabled for the bucket.\n\t// When this API is used to delete an object from a bucket that has soft\n\t// delete policy enabled, the object becomes soft deleted, and the\n\t// `softDeleteTime` and `hardDeleteTime` properties are set on the object.\n\t// This API cannot be used to permanently delete soft-deleted objects.\n\t// Soft-deleted objects are permanently deleted according to their\n\t// `hardDeleteTime`.\n\t//\n\t// You can use the [`RestoreObject`][google.storage.v2.Storage.RestoreObject]\n\t// API to restore soft-deleted objects until the soft delete retention period\n\t// has passed.\n\t//\n\t// **IAM Permissions**:\n\t//\n\t// Requires `storage.objects.delete`\n\t// [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on\n\t// the bucket.\n\tDeleteObject(ctx context.Context, in *DeleteObjectRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)\n\t// Restores a soft-deleted object.\n\tRestoreObject(ctx context.Context, in *RestoreObjectRequest, opts ...grpc.CallOption) (*Object, error)\n\t// Cancels an in-progress resumable upload.\n\t//\n\t// Any attempts to write to the resumable upload after cancelling the upload\n\t// will fail.\n\t//\n\t// The behavior for currently in progress write operations is not guaranteed -\n\t// they could either complete before the cancellation or fail if the\n\t// cancellation completes first.\n\tCancelResumableWrite(ctx context.Context, in *CancelResumableWriteRequest, opts ...grpc.CallOption) (*CancelResumableWriteResponse, error)\n\t// Retrieves object metadata.\n\t//\n\t// **IAM Permissions**:\n\t//\n\t// Requires `storage.objects.get`\n\t// [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on\n\t// the bucket. To return object ACLs, the authenticated user must also have\n\t// the `storage.objects.getIamPolicy` permission.\n\tGetObject(ctx context.Context, in *GetObjectRequest, opts ...grpc.CallOption) (*Object, error)\n\t// Retrieves object data.\n\t//\n\t// **IAM Permissions**:\n\t//\n\t// Requires `storage.objects.get`\n\t// [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on\n\t// the bucket.\n\tReadObject(ctx context.Context, in *ReadObjectRequest, opts ...grpc.CallOption) (Storage_ReadObjectClient, error)\n\t// Reads an object's data.\n\t//\n\t// This is a bi-directional API with the added support for reading multiple\n\t// ranges within one stream both within and across multiple messages.\n\t// If the server encountered an error for any of the inputs, the stream will\n\t// be closed with the relevant error code.\n\t// Because the API allows for multiple outstanding requests, when the stream\n\t// is closed the error response will contain a BidiReadObjectRangesError proto\n\t// in the error extension describing the error for each outstanding read_id.\n\t//\n\t// **IAM Permissions**:\n\t//\n\t// Requires `storage.objects.get`\n\t//\n\t// [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on\n\t// the bucket.\n\t//\n\t// This API is currently in preview and is not yet available for general\n\t// use.\n\tBidiReadObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiReadObjectClient, error)\n\t// Updates an object's metadata.\n\t// Equivalent to JSON API's storage.objects.patch.\n\tUpdateObject(ctx context.Context, in *UpdateObjectRequest, opts ...grpc.CallOption) (*Object, error)\n\t// Stores a new object and metadata.\n\t//\n\t// An object can be written either in a single message stream or in a\n\t// resumable sequence of message streams. To write using a single stream,\n\t// the client should include in the first message of the stream an\n\t// `WriteObjectSpec` describing the destination bucket, object, and any\n\t// preconditions. Additionally, the final message must set 'finish_write' to\n\t// true, or else it is an error.\n\t//\n\t// For a resumable write, the client should instead call\n\t// `StartResumableWrite()`, populating a `WriteObjectSpec` into that request.\n\t// They should then attach the returned `upload_id` to the first message of\n\t// each following call to `WriteObject`. If the stream is closed before\n\t// finishing the upload (either explicitly by the client or due to a network\n\t// error or an error response from the server), the client should do as\n\t// follows:\n\t//   - Check the result Status of the stream, to determine if writing can be\n\t//     resumed on this stream or must be restarted from scratch (by calling\n\t//     `StartResumableWrite()`). The resumable errors are DEADLINE_EXCEEDED,\n\t//     INTERNAL, and UNAVAILABLE. For each case, the client should use binary\n\t//     exponential backoff before retrying.  Additionally, writes can be\n\t//     resumed after RESOURCE_EXHAUSTED errors, but only after taking\n\t//     appropriate measures, which may include reducing aggregate send rate\n\t//     across clients and/or requesting a quota increase for your project.\n\t//   - If the call to `WriteObject` returns `ABORTED`, that indicates\n\t//     concurrent attempts to update the resumable write, caused either by\n\t//     multiple racing clients or by a single client where the previous\n\t//     request was timed out on the client side but nonetheless reached the\n\t//     server. In this case the client should take steps to prevent further\n\t//     concurrent writes (e.g., increase the timeouts, stop using more than\n\t//     one process to perform the upload, etc.), and then should follow the\n\t//     steps below for resuming the upload.\n\t//   - For resumable errors, the client should call `QueryWriteStatus()` and\n\t//     then continue writing from the returned `persisted_size`. This may be\n\t//     less than the amount of data the client previously sent. Note also that\n\t//     it is acceptable to send data starting at an offset earlier than the\n\t//     returned `persisted_size`; in this case, the service will skip data at\n\t//     offsets that were already persisted (without checking that it matches\n\t//     the previously written data), and write only the data starting from the\n\t//     persisted offset. Even though the data isn't written, it may still\n\t//     incur a performance cost over resuming at the correct write offset.\n\t//     This behavior can make client-side handling simpler in some cases.\n\t//   - Clients must only send data that is a multiple of 256 KiB per message,\n\t//     unless the object is being finished with `finish_write` set to `true`.\n\t//\n\t// The service will not view the object as complete until the client has\n\t// sent a `WriteObjectRequest` with `finish_write` set to `true`. Sending any\n\t// requests on a stream after sending a request with `finish_write` set to\n\t// `true` will cause an error. The client **should** check the response it\n\t// receives to determine how much data the service was able to commit and\n\t// whether the service views the object as complete.\n\t//\n\t// Attempting to resume an already finalized object will result in an OK\n\t// status, with a `WriteObjectResponse` containing the finalized object's\n\t// metadata.\n\t//\n\t// Alternatively, the BidiWriteObject operation may be used to write an\n\t// object with controls over flushing and the ability to fetch the ability to\n\t// determine the current persisted size.\n\t//\n\t// **IAM Permissions**:\n\t//\n\t// Requires `storage.objects.create`\n\t// [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on\n\t// the bucket.\n\tWriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_WriteObjectClient, error)\n\t// Stores a new object and metadata.\n\t//\n\t// This is similar to the WriteObject call with the added support for\n\t// manual flushing of persisted state, and the ability to determine current\n\t// persisted size without closing the stream.\n\t//\n\t// The client may specify one or both of the `state_lookup` and `flush` fields\n\t// in each BidiWriteObjectRequest. If `flush` is specified, the data written\n\t// so far will be persisted to storage. If `state_lookup` is specified, the\n\t// service will respond with a BidiWriteObjectResponse that contains the\n\t// persisted size. If both `flush` and `state_lookup` are specified, the flush\n\t// will always occur before a `state_lookup`, so that both may be set in the\n\t// same request and the returned state will be the state of the object\n\t// post-flush. When the stream is closed, a BidiWriteObjectResponse will\n\t// always be sent to the client, regardless of the value of `state_lookup`.\n\tBidiWriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiWriteObjectClient, error)\n\t// Retrieves a list of objects matching the criteria.\n\t//\n\t// **IAM Permissions**:\n\t//\n\t// The authenticated user requires `storage.objects.list`\n\t// [IAM permission](https://cloud.google.com/iam/docs/overview#permissions)\n\t// to use this method. To return object ACLs, the authenticated user must also\n\t// have the `storage.objects.getIamPolicy` permission.\n\tListObjects(ctx context.Context, in *ListObjectsRequest, opts ...grpc.CallOption) (*ListObjectsResponse, error)\n\t// Rewrites a source object to a destination object. Optionally overrides\n\t// metadata.\n\tRewriteObject(ctx context.Context, in *RewriteObjectRequest, opts ...grpc.CallOption) (*RewriteResponse, error)\n\t// Starts a resumable write operation. This\n\t// method is part of the [Resumable\n\t// upload](https://cloud.google.com/storage/docs/resumable-uploads) feature.\n\t// This allows you to upload large objects in multiple chunks, which is more\n\t// resilient to network interruptions than a single upload. The validity\n\t// duration of the write operation, and the consequences of it becoming\n\t// invalid, are service-dependent.\n\t//\n\t// **IAM Permissions**:\n\t//\n\t// Requires `storage.objects.create`\n\t// [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on\n\t// the bucket.\n\tStartResumableWrite(ctx context.Context, in *StartResumableWriteRequest, opts ...grpc.CallOption) (*StartResumableWriteResponse, error)\n\t// Determines the `persisted_size` of an object that is being written. This\n\t// method is part of the [resumable\n\t// upload](https://cloud.google.com/storage/docs/resumable-uploads) feature.\n\t// The returned value is the size of the object that has been persisted so\n\t// far. The value can be used as the `write_offset` for the next `Write()`\n\t// call.\n\t//\n\t// If the object does not exist, meaning if it was deleted, or the\n\t// first `Write()` has not yet reached the service, this method returns the\n\t// error `NOT_FOUND`.\n\t//\n\t// This method is useful for clients that buffer data and need to know which\n\t// data can be safely evicted. The client can call `QueryWriteStatus()` at any\n\t// time to determine how much data has been logged for this object.\n\t// For any sequence of `QueryWriteStatus()` calls for a given\n\t// object name, the sequence of returned `persisted_size` values are\n\t// non-decreasing.\n\tQueryWriteStatus(ctx context.Context, in *QueryWriteStatusRequest, opts ...grpc.CallOption) (*QueryWriteStatusResponse, error)\n\t// Moves the source object to the destination object in the same bucket.\n\tMoveObject(ctx context.Context, in *MoveObjectRequest, opts ...grpc.CallOption) (*Object, error)\n}\n\ntype storageClient struct {\n\tcc grpc.ClientConnInterface\n}\n\nfunc NewStorageClient(cc grpc.ClientConnInterface) StorageClient {\n\treturn &storageClient{cc}\n}\n\nfunc (c *storageClient) DeleteBucket(ctx context.Context, in *DeleteBucketRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/DeleteBucket\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) GetBucket(ctx context.Context, in *GetBucketRequest, opts ...grpc.CallOption) (*Bucket, error) {\n\tout := new(Bucket)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/GetBucket\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) CreateBucket(ctx context.Context, in *CreateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) {\n\tout := new(Bucket)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/CreateBucket\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) ListBuckets(ctx context.Context, in *ListBucketsRequest, opts ...grpc.CallOption) (*ListBucketsResponse, error) {\n\tout := new(ListBucketsResponse)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/ListBuckets\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) LockBucketRetentionPolicy(ctx context.Context, in *LockBucketRetentionPolicyRequest, opts ...grpc.CallOption) (*Bucket, error) {\n\tout := new(Bucket)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/LockBucketRetentionPolicy\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) GetIamPolicy(ctx context.Context, in *iampb.GetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) {\n\tout := new(iampb.Policy)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/GetIamPolicy\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) SetIamPolicy(ctx context.Context, in *iampb.SetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) {\n\tout := new(iampb.Policy)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/SetIamPolicy\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) TestIamPermissions(ctx context.Context, in *iampb.TestIamPermissionsRequest, opts ...grpc.CallOption) (*iampb.TestIamPermissionsResponse, error) {\n\tout := new(iampb.TestIamPermissionsResponse)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/TestIamPermissions\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) UpdateBucket(ctx context.Context, in *UpdateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) {\n\tout := new(Bucket)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/UpdateBucket\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) ComposeObject(ctx context.Context, in *ComposeObjectRequest, opts ...grpc.CallOption) (*Object, error) {\n\tout := new(Object)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/ComposeObject\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) DeleteObject(ctx context.Context, in *DeleteObjectRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {\n\tout := new(emptypb.Empty)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/DeleteObject\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) RestoreObject(ctx context.Context, in *RestoreObjectRequest, opts ...grpc.CallOption) (*Object, error) {\n\tout := new(Object)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/RestoreObject\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) CancelResumableWrite(ctx context.Context, in *CancelResumableWriteRequest, opts ...grpc.CallOption) (*CancelResumableWriteResponse, error) {\n\tout := new(CancelResumableWriteResponse)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/CancelResumableWrite\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) GetObject(ctx context.Context, in *GetObjectRequest, opts ...grpc.CallOption) (*Object, error) {\n\tout := new(Object)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/GetObject\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) ReadObject(ctx context.Context, in *ReadObjectRequest, opts ...grpc.CallOption) (Storage_ReadObjectClient, error) {\n\tstream, err := c.cc.NewStream(ctx, &_Storage_serviceDesc.Streams[0], \"/google.storage.v2.Storage/ReadObject\", opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tx := &storageReadObjectClient{stream}\n\tif err := x.ClientStream.SendMsg(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := x.ClientStream.CloseSend(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn x, nil\n}\n\ntype Storage_ReadObjectClient interface {\n\tRecv() (*ReadObjectResponse, error)\n\tgrpc.ClientStream\n}\n\ntype storageReadObjectClient struct {\n\tgrpc.ClientStream\n}\n\nfunc (x *storageReadObjectClient) Recv() (*ReadObjectResponse, error) {\n\tm := new(ReadObjectResponse)\n\tif err := x.ClientStream.RecvMsg(m); err != nil {\n\t\treturn nil, err\n\t}\n\treturn m, nil\n}\n\nfunc (c *storageClient) BidiReadObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiReadObjectClient, error) {\n\tstream, err := c.cc.NewStream(ctx, &_Storage_serviceDesc.Streams[1], \"/google.storage.v2.Storage/BidiReadObject\", opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tx := &storageBidiReadObjectClient{stream}\n\treturn x, nil\n}\n\ntype Storage_BidiReadObjectClient interface {\n\tSend(*BidiReadObjectRequest) error\n\tRecv() (*BidiReadObjectResponse, error)\n\tgrpc.ClientStream\n}\n\ntype storageBidiReadObjectClient struct {\n\tgrpc.ClientStream\n}\n\nfunc (x *storageBidiReadObjectClient) Send(m *BidiReadObjectRequest) error {\n\treturn x.ClientStream.SendMsg(m)\n}\n\nfunc (x *storageBidiReadObjectClient) Recv() (*BidiReadObjectResponse, error) {\n\tm := new(BidiReadObjectResponse)\n\tif err := x.ClientStream.RecvMsg(m); err != nil {\n\t\treturn nil, err\n\t}\n\treturn m, nil\n}\n\nfunc (c *storageClient) UpdateObject(ctx context.Context, in *UpdateObjectRequest, opts ...grpc.CallOption) (*Object, error) {\n\tout := new(Object)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/UpdateObject\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) WriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_WriteObjectClient, error) {\n\tstream, err := c.cc.NewStream(ctx, &_Storage_serviceDesc.Streams[2], \"/google.storage.v2.Storage/WriteObject\", opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tx := &storageWriteObjectClient{stream}\n\treturn x, nil\n}\n\ntype Storage_WriteObjectClient interface {\n\tSend(*WriteObjectRequest) error\n\tCloseAndRecv() (*WriteObjectResponse, error)\n\tgrpc.ClientStream\n}\n\ntype storageWriteObjectClient struct {\n\tgrpc.ClientStream\n}\n\nfunc (x *storageWriteObjectClient) Send(m *WriteObjectRequest) error {\n\treturn x.ClientStream.SendMsg(m)\n}\n\nfunc (x *storageWriteObjectClient) CloseAndRecv() (*WriteObjectResponse, error) {\n\tif err := x.ClientStream.CloseSend(); err != nil {\n\t\treturn nil, err\n\t}\n\tm := new(WriteObjectResponse)\n\tif err := x.ClientStream.RecvMsg(m); err != nil {\n\t\treturn nil, err\n\t}\n\treturn m, nil\n}\n\nfunc (c *storageClient) BidiWriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiWriteObjectClient, error) {\n\tstream, err := c.cc.NewStream(ctx, &_Storage_serviceDesc.Streams[3], \"/google.storage.v2.Storage/BidiWriteObject\", opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tx := &storageBidiWriteObjectClient{stream}\n\treturn x, nil\n}\n\ntype Storage_BidiWriteObjectClient interface {\n\tSend(*BidiWriteObjectRequest) error\n\tRecv() (*BidiWriteObjectResponse, error)\n\tgrpc.ClientStream\n}\n\ntype storageBidiWriteObjectClient struct {\n\tgrpc.ClientStream\n}\n\nfunc (x *storageBidiWriteObjectClient) Send(m *BidiWriteObjectRequest) error {\n\treturn x.ClientStream.SendMsg(m)\n}\n\nfunc (x *storageBidiWriteObjectClient) Recv() (*BidiWriteObjectResponse, error) {\n\tm := new(BidiWriteObjectResponse)\n\tif err := x.ClientStream.RecvMsg(m); err != nil {\n\t\treturn nil, err\n\t}\n\treturn m, nil\n}\n\nfunc (c *storageClient) ListObjects(ctx context.Context, in *ListObjectsRequest, opts ...grpc.CallOption) (*ListObjectsResponse, error) {\n\tout := new(ListObjectsResponse)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/ListObjects\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) RewriteObject(ctx context.Context, in *RewriteObjectRequest, opts ...grpc.CallOption) (*RewriteResponse, error) {\n\tout := new(RewriteResponse)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/RewriteObject\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) StartResumableWrite(ctx context.Context, in *StartResumableWriteRequest, opts ...grpc.CallOption) (*StartResumableWriteResponse, error) {\n\tout := new(StartResumableWriteResponse)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/StartResumableWrite\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) QueryWriteStatus(ctx context.Context, in *QueryWriteStatusRequest, opts ...grpc.CallOption) (*QueryWriteStatusResponse, error) {\n\tout := new(QueryWriteStatusResponse)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/QueryWriteStatus\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\nfunc (c *storageClient) MoveObject(ctx context.Context, in *MoveObjectRequest, opts ...grpc.CallOption) (*Object, error) {\n\tout := new(Object)\n\terr := c.cc.Invoke(ctx, \"/google.storage.v2.Storage/MoveObject\", in, out, opts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// StorageServer is the server API for Storage service.\ntype StorageServer interface {\n\t// Permanently deletes an empty bucket.\n\tDeleteBucket(context.Context, *DeleteBucketRequest) (*emptypb.Empty, error)\n\t// Returns metadata for the specified bucket.\n\tGetBucket(context.Context, *GetBucketRequest) (*Bucket, error)\n\t// Creates a new bucket.\n\tCreateBucket(context.Context, *CreateBucketRequest) (*Bucket, error)\n\t// Retrieves a list of buckets for a given project.\n\tListBuckets(context.Context, *ListBucketsRequest) (*ListBucketsResponse, error)\n\t// Locks retention policy on a bucket.\n\tLockBucketRetentionPolicy(context.Context, *LockBucketRetentionPolicyRequest) (*Bucket, error)\n\t// Gets the IAM policy for a specified bucket.\n\t// The `resource` field in the request should be\n\t// `projects/_/buckets/{bucket}`.\n\tGetIamPolicy(context.Context, *iampb.GetIamPolicyRequest) (*iampb.Policy, error)\n\t// Updates an IAM policy for the specified bucket.\n\t// The `resource` field in the request should be\n\t// `projects/_/buckets/{bucket}`.\n\tSetIamPolicy(context.Context, *iampb.SetIamPolicyRequest) (*iampb.Policy, error)\n\t// Tests a set of permissions on the given bucket, object, or managed folder\n\t// to see which, if any, are held by the caller.\n\t// The `resource` field in the request should be\n\t// `projects/_/buckets/{bucket}` for a bucket,\n\t// `projects/_/buckets/{bucket}/objects/{object}` for an object, or\n\t// `projects/_/buckets/{bucket}/managedFolders/{managedFolder}`\n\t// for a managed folder.\n\tTestIamPermissions(context.Context, *iampb.TestIamPermissionsRequest) (*iampb.TestIamPermissionsResponse, error)\n\t// Updates a bucket. Equivalent to JSON API's storage.buckets.patch method.\n\tUpdateBucket(context.Context, *UpdateBucketRequest) (*Bucket, error)\n\t// Concatenates a list of existing objects into a new object in the same\n\t// bucket.\n\tComposeObject(context.Context, *ComposeObjectRequest) (*Object, error)\n\t// Deletes an object and its metadata. Deletions are permanent if versioning\n\t// is not enabled for the bucket, or if the generation parameter is used, or\n\t// if [soft delete](https://cloud.google.com/storage/docs/soft-delete) is not\n\t// enabled for the bucket.\n\t// When this API is used to delete an object from a bucket that has soft\n\t// delete policy enabled, the object becomes soft deleted, and the\n\t// `softDeleteTime` and `hardDeleteTime` properties are set on the object.\n\t// This API cannot be used to permanently delete soft-deleted objects.\n\t// Soft-deleted objects are permanently deleted according to their\n\t// `hardDeleteTime`.\n\t//\n\t// You can use the [`RestoreObject`][google.storage.v2.Storage.RestoreObject]\n\t// API to restore soft-deleted objects until the soft delete retention period\n\t// has passed.\n\t//\n\t// **IAM Permissions**:\n\t//\n\t// Requires `storage.objects.delete`\n\t// [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on\n\t// the bucket.\n\tDeleteObject(context.Context, *DeleteObjectRequest) (*emptypb.Empty, error)\n\t// Restores a soft-deleted object.\n\tRestoreObject(context.Context, *RestoreObjectRequest) (*Object, error)\n\t// Cancels an in-progress resumable upload.\n\t//\n\t// Any attempts to write to the resumable upload after cancelling the upload\n\t// will fail.\n\t//\n\t// The behavior for currently in progress write operations is not guaranteed -\n\t// they could either complete before the cancellation or fail if the\n\t// cancellation completes first.\n\tCancelResumableWrite(context.Context, *CancelResumableWriteRequest) (*CancelResumableWriteResponse, error)\n\t// Retrieves object metadata.\n\t//\n\t// **IAM Permissions**:\n\t//\n\t// Requires `storage.objects.get`\n\t// [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on\n\t// the bucket. To return object ACLs, the authenticated user must also have\n\t// the `storage.objects.getIamPolicy` permission.\n\tGetObject(context.Context, *GetObjectRequest) (*Object, error)\n\t// Retrieves object data.\n\t//\n\t// **IAM Permissions**:\n\t//\n\t// Requires `storage.objects.get`\n\t// [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on\n\t// the bucket.\n\tReadObject(*ReadObjectRequest, Storage_ReadObjectServer) error\n\t// Reads an object's data.\n\t//\n\t// This is a bi-directional API with the added support for reading multiple\n\t// ranges within one stream both within and across multiple messages.\n\t// If the server encountered an error for any of the inputs, the stream will\n\t// be closed with the relevant error code.\n\t// Because the API allows for multiple outstanding requests, when the stream\n\t// is closed the error response will contain a BidiReadObjectRangesError proto\n\t// in the error extension describing the error for each outstanding read_id.\n\t//\n\t// **IAM Permissions**:\n\t//\n\t// Requires `storage.objects.get`\n\t//\n\t// [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on\n\t// the bucket.\n\t//\n\t// This API is currently in preview and is not yet available for general\n\t// use.\n\tBidiReadObject(Storage_BidiReadObjectServer) error\n\t// Updates an object's metadata.\n\t// Equivalent to JSON API's storage.objects.patch.\n\tUpdateObject(context.Context, *UpdateObjectRequest) (*Object, error)\n\t// Stores a new object and metadata.\n\t//\n\t// An object can be written either in a single message stream or in a\n\t// resumable sequence of message streams. To write using a single stream,\n\t// the client should include in the first message of the stream an\n\t// `WriteObjectSpec` describing the destination bucket, object, and any\n\t// preconditions. Additionally, the final message must set 'finish_write' to\n\t// true, or else it is an error.\n\t//\n\t// For a resumable write, the client should instead call\n\t// `StartResumableWrite()`, populating a `WriteObjectSpec` into that request.\n\t// They should then attach the returned `upload_id` to the first message of\n\t// each following call to `WriteObject`. If the stream is closed before\n\t// finishing the upload (either explicitly by the client or due to a network\n\t// error or an error response from the server), the client should do as\n\t// follows:\n\t//   - Check the result Status of the stream, to determine if writing can be\n\t//     resumed on this stream or must be restarted from scratch (by calling\n\t//     `StartResumableWrite()`). The resumable errors are DEADLINE_EXCEEDED,\n\t//     INTERNAL, and UNAVAILABLE. For each case, the client should use binary\n\t//     exponential backoff before retrying.  Additionally, writes can be\n\t//     resumed after RESOURCE_EXHAUSTED errors, but only after taking\n\t//     appropriate measures, which may include reducing aggregate send rate\n\t//     across clients and/or requesting a quota increase for your project.\n\t//   - If the call to `WriteObject` returns `ABORTED`, that indicates\n\t//     concurrent attempts to update the resumable write, caused either by\n\t//     multiple racing clients or by a single client where the previous\n\t//     request was timed out on the client side but nonetheless reached the\n\t//     server. In this case the client should take steps to prevent further\n\t//     concurrent writes (e.g., increase the timeouts, stop using more than\n\t//     one process to perform the upload, etc.), and then should follow the\n\t//     steps below for resuming the upload.\n\t//   - For resumable errors, the client should call `QueryWriteStatus()` and\n\t//     then continue writing from the returned `persisted_size`. This may be\n\t//     less than the amount of data the client previously sent. Note also that\n\t//     it is acceptable to send data starting at an offset earlier than the\n\t//     returned `persisted_size`; in this case, the service will skip data at\n\t//     offsets that were already persisted (without checking that it matches\n\t//     the previously written data), and write only the data starting from the\n\t//     persisted offset. Even though the data isn't written, it may still\n\t//     incur a performance cost over resuming at the correct write offset.\n\t//     This behavior can make client-side handling simpler in some cases.\n\t//   - Clients must only send data that is a multiple of 256 KiB per message,\n\t//     unless the object is being finished with `finish_write` set to `true`.\n\t//\n\t// The service will not view the object as complete until the client has\n\t// sent a `WriteObjectRequest` with `finish_write` set to `true`. Sending any\n\t// requests on a stream after sending a request with `finish_write` set to\n\t// `true` will cause an error. The client **should** check the response it\n\t// receives to determine how much data the service was able to commit and\n\t// whether the service views the object as complete.\n\t//\n\t// Attempting to resume an already finalized object will result in an OK\n\t// status, with a `WriteObjectResponse` containing the finalized object's\n\t// metadata.\n\t//\n\t// Alternatively, the BidiWriteObject operation may be used to write an\n\t// object with controls over flushing and the ability to fetch the ability to\n\t// determine the current persisted size.\n\t//\n\t// **IAM Permissions**:\n\t//\n\t// Requires `storage.objects.create`\n\t// [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on\n\t// the bucket.\n\tWriteObject(Storage_WriteObjectServer) error\n\t// Stores a new object and metadata.\n\t//\n\t// This is similar to the WriteObject call with the added support for\n\t// manual flushing of persisted state, and the ability to determine current\n\t// persisted size without closing the stream.\n\t//\n\t// The client may specify one or both of the `state_lookup` and `flush` fields\n\t// in each BidiWriteObjectRequest. If `flush` is specified, the data written\n\t// so far will be persisted to storage. If `state_lookup` is specified, the\n\t// service will respond with a BidiWriteObjectResponse that contains the\n\t// persisted size. If both `flush` and `state_lookup` are specified, the flush\n\t// will always occur before a `state_lookup`, so that both may be set in the\n\t// same request and the returned state will be the state of the object\n\t// post-flush. When the stream is closed, a BidiWriteObjectResponse will\n\t// always be sent to the client, regardless of the value of `state_lookup`.\n\tBidiWriteObject(Storage_BidiWriteObjectServer) error\n\t// Retrieves a list of objects matching the criteria.\n\t//\n\t// **IAM Permissions**:\n\t//\n\t// The authenticated user requires `storage.objects.list`\n\t// [IAM permission](https://cloud.google.com/iam/docs/overview#permissions)\n\t// to use this method. To return object ACLs, the authenticated user must also\n\t// have the `storage.objects.getIamPolicy` permission.\n\tListObjects(context.Context, *ListObjectsRequest) (*ListObjectsResponse, error)\n\t// Rewrites a source object to a destination object. Optionally overrides\n\t// metadata.\n\tRewriteObject(context.Context, *RewriteObjectRequest) (*RewriteResponse, error)\n\t// Starts a resumable write operation. This\n\t// method is part of the [Resumable\n\t// upload](https://cloud.google.com/storage/docs/resumable-uploads) feature.\n\t// This allows you to upload large objects in multiple chunks, which is more\n\t// resilient to network interruptions than a single upload. The validity\n\t// duration of the write operation, and the consequences of it becoming\n\t// invalid, are service-dependent.\n\t//\n\t// **IAM Permissions**:\n\t//\n\t// Requires `storage.objects.create`\n\t// [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on\n\t// the bucket.\n\tStartResumableWrite(context.Context, *StartResumableWriteRequest) (*StartResumableWriteResponse, error)\n\t// Determines the `persisted_size` of an object that is being written. This\n\t// method is part of the [resumable\n\t// upload](https://cloud.google.com/storage/docs/resumable-uploads) feature.\n\t// The returned value is the size of the object that has been persisted so\n\t// far. The value can be used as the `write_offset` for the next `Write()`\n\t// call.\n\t//\n\t// If the object does not exist, meaning if it was deleted, or the\n\t// first `Write()` has not yet reached the service, this method returns the\n\t// error `NOT_FOUND`.\n\t//\n\t// This method is useful for clients that buffer data and need to know which\n\t// data can be safely evicted. The client can call `QueryWriteStatus()` at any\n\t// time to determine how much data has been logged for this object.\n\t// For any sequence of `QueryWriteStatus()` calls for a given\n\t// object name, the sequence of returned `persisted_size` values are\n\t// non-decreasing.\n\tQueryWriteStatus(context.Context, *QueryWriteStatusRequest) (*QueryWriteStatusResponse, error)\n\t// Moves the source object to the destination object in the same bucket.\n\tMoveObject(context.Context, *MoveObjectRequest) (*Object, error)\n}\n\n// UnimplementedStorageServer can be embedded to have forward compatible implementations.\ntype UnimplementedStorageServer struct {\n}\n\nfunc (*UnimplementedStorageServer) DeleteBucket(context.Context, *DeleteBucketRequest) (*emptypb.Empty, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method DeleteBucket not implemented\")\n}\nfunc (*UnimplementedStorageServer) GetBucket(context.Context, *GetBucketRequest) (*Bucket, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method GetBucket not implemented\")\n}\nfunc (*UnimplementedStorageServer) CreateBucket(context.Context, *CreateBucketRequest) (*Bucket, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method CreateBucket not implemented\")\n}\nfunc (*UnimplementedStorageServer) ListBuckets(context.Context, *ListBucketsRequest) (*ListBucketsResponse, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method ListBuckets not implemented\")\n}\nfunc (*UnimplementedStorageServer) LockBucketRetentionPolicy(context.Context, *LockBucketRetentionPolicyRequest) (*Bucket, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method LockBucketRetentionPolicy not implemented\")\n}\nfunc (*UnimplementedStorageServer) GetIamPolicy(context.Context, *iampb.GetIamPolicyRequest) (*iampb.Policy, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method GetIamPolicy not implemented\")\n}\nfunc (*UnimplementedStorageServer) SetIamPolicy(context.Context, *iampb.SetIamPolicyRequest) (*iampb.Policy, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method SetIamPolicy not implemented\")\n}\nfunc (*UnimplementedStorageServer) TestIamPermissions(context.Context, *iampb.TestIamPermissionsRequest) (*iampb.TestIamPermissionsResponse, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method TestIamPermissions not implemented\")\n}\nfunc (*UnimplementedStorageServer) UpdateBucket(context.Context, *UpdateBucketRequest) (*Bucket, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method UpdateBucket not implemented\")\n}\nfunc (*UnimplementedStorageServer) ComposeObject(context.Context, *ComposeObjectRequest) (*Object, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method ComposeObject not implemented\")\n}\nfunc (*UnimplementedStorageServer) DeleteObject(context.Context, *DeleteObjectRequest) (*emptypb.Empty, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method DeleteObject not implemented\")\n}\nfunc (*UnimplementedStorageServer) RestoreObject(context.Context, *RestoreObjectRequest) (*Object, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method RestoreObject not implemented\")\n}\nfunc (*UnimplementedStorageServer) CancelResumableWrite(context.Context, *CancelResumableWriteRequest) (*CancelResumableWriteResponse, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method CancelResumableWrite not implemented\")\n}\nfunc (*UnimplementedStorageServer) GetObject(context.Context, *GetObjectRequest) (*Object, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method GetObject not implemented\")\n}\nfunc (*UnimplementedStorageServer) ReadObject(*ReadObjectRequest, Storage_ReadObjectServer) error {\n\treturn status1.Errorf(codes.Unimplemented, \"method ReadObject not implemented\")\n}\nfunc (*UnimplementedStorageServer) BidiReadObject(Storage_BidiReadObjectServer) error {\n\treturn status1.Errorf(codes.Unimplemented, \"method BidiReadObject not implemented\")\n}\nfunc (*UnimplementedStorageServer) UpdateObject(context.Context, *UpdateObjectRequest) (*Object, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method UpdateObject not implemented\")\n}\nfunc (*UnimplementedStorageServer) WriteObject(Storage_WriteObjectServer) error {\n\treturn status1.Errorf(codes.Unimplemented, \"method WriteObject not implemented\")\n}\nfunc (*UnimplementedStorageServer) BidiWriteObject(Storage_BidiWriteObjectServer) error {\n\treturn status1.Errorf(codes.Unimplemented, \"method BidiWriteObject not implemented\")\n}\nfunc (*UnimplementedStorageServer) ListObjects(context.Context, *ListObjectsRequest) (*ListObjectsResponse, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method ListObjects not implemented\")\n}\nfunc (*UnimplementedStorageServer) RewriteObject(context.Context, *RewriteObjectRequest) (*RewriteResponse, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method RewriteObject not implemented\")\n}\nfunc (*UnimplementedStorageServer) StartResumableWrite(context.Context, *StartResumableWriteRequest) (*StartResumableWriteResponse, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method StartResumableWrite not implemented\")\n}\nfunc (*UnimplementedStorageServer) QueryWriteStatus(context.Context, *QueryWriteStatusRequest) (*QueryWriteStatusResponse, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method QueryWriteStatus not implemented\")\n}\nfunc (*UnimplementedStorageServer) MoveObject(context.Context, *MoveObjectRequest) (*Object, error) {\n\treturn nil, status1.Errorf(codes.Unimplemented, \"method MoveObject not implemented\")\n}\n\nfunc RegisterStorageServer(s *grpc.Server, srv StorageServer) {\n\ts.RegisterService(&_Storage_serviceDesc, srv)\n}\n\nfunc _Storage_DeleteBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(DeleteBucketRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).DeleteBucket(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/DeleteBucket\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).DeleteBucket(ctx, req.(*DeleteBucketRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_GetBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetBucketRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).GetBucket(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/GetBucket\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).GetBucket(ctx, req.(*GetBucketRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_CreateBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CreateBucketRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).CreateBucket(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/CreateBucket\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).CreateBucket(ctx, req.(*CreateBucketRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_ListBuckets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListBucketsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).ListBuckets(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/ListBuckets\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).ListBuckets(ctx, req.(*ListBucketsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_LockBucketRetentionPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(LockBucketRetentionPolicyRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).LockBucketRetentionPolicy(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/LockBucketRetentionPolicy\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).LockBucketRetentionPolicy(ctx, req.(*LockBucketRetentionPolicyRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_GetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(iampb.GetIamPolicyRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).GetIamPolicy(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/GetIamPolicy\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).GetIamPolicy(ctx, req.(*iampb.GetIamPolicyRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_SetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(iampb.SetIamPolicyRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).SetIamPolicy(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/SetIamPolicy\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).SetIamPolicy(ctx, req.(*iampb.SetIamPolicyRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_TestIamPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(iampb.TestIamPermissionsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).TestIamPermissions(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/TestIamPermissions\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).TestIamPermissions(ctx, req.(*iampb.TestIamPermissionsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_UpdateBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateBucketRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).UpdateBucket(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/UpdateBucket\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).UpdateBucket(ctx, req.(*UpdateBucketRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_ComposeObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ComposeObjectRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).ComposeObject(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/ComposeObject\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).ComposeObject(ctx, req.(*ComposeObjectRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_DeleteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(DeleteObjectRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).DeleteObject(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/DeleteObject\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).DeleteObject(ctx, req.(*DeleteObjectRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_RestoreObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(RestoreObjectRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).RestoreObject(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/RestoreObject\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).RestoreObject(ctx, req.(*RestoreObjectRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_CancelResumableWrite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(CancelResumableWriteRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).CancelResumableWrite(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/CancelResumableWrite\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).CancelResumableWrite(ctx, req.(*CancelResumableWriteRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_GetObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(GetObjectRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).GetObject(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/GetObject\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).GetObject(ctx, req.(*GetObjectRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_ReadObject_Handler(srv interface{}, stream grpc.ServerStream) error {\n\tm := new(ReadObjectRequest)\n\tif err := stream.RecvMsg(m); err != nil {\n\t\treturn err\n\t}\n\treturn srv.(StorageServer).ReadObject(m, &storageReadObjectServer{stream})\n}\n\ntype Storage_ReadObjectServer interface {\n\tSend(*ReadObjectResponse) error\n\tgrpc.ServerStream\n}\n\ntype storageReadObjectServer struct {\n\tgrpc.ServerStream\n}\n\nfunc (x *storageReadObjectServer) Send(m *ReadObjectResponse) error {\n\treturn x.ServerStream.SendMsg(m)\n}\n\nfunc _Storage_BidiReadObject_Handler(srv interface{}, stream grpc.ServerStream) error {\n\treturn srv.(StorageServer).BidiReadObject(&storageBidiReadObjectServer{stream})\n}\n\ntype Storage_BidiReadObjectServer interface {\n\tSend(*BidiReadObjectResponse) error\n\tRecv() (*BidiReadObjectRequest, error)\n\tgrpc.ServerStream\n}\n\ntype storageBidiReadObjectServer struct {\n\tgrpc.ServerStream\n}\n\nfunc (x *storageBidiReadObjectServer) Send(m *BidiReadObjectResponse) error {\n\treturn x.ServerStream.SendMsg(m)\n}\n\nfunc (x *storageBidiReadObjectServer) Recv() (*BidiReadObjectRequest, error) {\n\tm := new(BidiReadObjectRequest)\n\tif err := x.ServerStream.RecvMsg(m); err != nil {\n\t\treturn nil, err\n\t}\n\treturn m, nil\n}\n\nfunc _Storage_UpdateObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(UpdateObjectRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).UpdateObject(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/UpdateObject\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).UpdateObject(ctx, req.(*UpdateObjectRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_WriteObject_Handler(srv interface{}, stream grpc.ServerStream) error {\n\treturn srv.(StorageServer).WriteObject(&storageWriteObjectServer{stream})\n}\n\ntype Storage_WriteObjectServer interface {\n\tSendAndClose(*WriteObjectResponse) error\n\tRecv() (*WriteObjectRequest, error)\n\tgrpc.ServerStream\n}\n\ntype storageWriteObjectServer struct {\n\tgrpc.ServerStream\n}\n\nfunc (x *storageWriteObjectServer) SendAndClose(m *WriteObjectResponse) error {\n\treturn x.ServerStream.SendMsg(m)\n}\n\nfunc (x *storageWriteObjectServer) Recv() (*WriteObjectRequest, error) {\n\tm := new(WriteObjectRequest)\n\tif err := x.ServerStream.RecvMsg(m); err != nil {\n\t\treturn nil, err\n\t}\n\treturn m, nil\n}\n\nfunc _Storage_BidiWriteObject_Handler(srv interface{}, stream grpc.ServerStream) error {\n\treturn srv.(StorageServer).BidiWriteObject(&storageBidiWriteObjectServer{stream})\n}\n\ntype Storage_BidiWriteObjectServer interface {\n\tSend(*BidiWriteObjectResponse) error\n\tRecv() (*BidiWriteObjectRequest, error)\n\tgrpc.ServerStream\n}\n\ntype storageBidiWriteObjectServer struct {\n\tgrpc.ServerStream\n}\n\nfunc (x *storageBidiWriteObjectServer) Send(m *BidiWriteObjectResponse) error {\n\treturn x.ServerStream.SendMsg(m)\n}\n\nfunc (x *storageBidiWriteObjectServer) Recv() (*BidiWriteObjectRequest, error) {\n\tm := new(BidiWriteObjectRequest)\n\tif err := x.ServerStream.RecvMsg(m); err != nil {\n\t\treturn nil, err\n\t}\n\treturn m, nil\n}\n\nfunc _Storage_ListObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(ListObjectsRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).ListObjects(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/ListObjects\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).ListObjects(ctx, req.(*ListObjectsRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_RewriteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(RewriteObjectRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).RewriteObject(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/RewriteObject\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).RewriteObject(ctx, req.(*RewriteObjectRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_StartResumableWrite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(StartResumableWriteRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).StartResumableWrite(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/StartResumableWrite\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).StartResumableWrite(ctx, req.(*StartResumableWriteRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_QueryWriteStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(QueryWriteStatusRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).QueryWriteStatus(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/QueryWriteStatus\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).QueryWriteStatus(ctx, req.(*QueryWriteStatusRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nfunc _Storage_MoveObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {\n\tin := new(MoveObjectRequest)\n\tif err := dec(in); err != nil {\n\t\treturn nil, err\n\t}\n\tif interceptor == nil {\n\t\treturn srv.(StorageServer).MoveObject(ctx, in)\n\t}\n\tinfo := &grpc.UnaryServerInfo{\n\t\tServer:     srv,\n\t\tFullMethod: \"/google.storage.v2.Storage/MoveObject\",\n\t}\n\thandler := func(ctx context.Context, req interface{}) (interface{}, error) {\n\t\treturn srv.(StorageServer).MoveObject(ctx, req.(*MoveObjectRequest))\n\t}\n\treturn interceptor(ctx, in, info, handler)\n}\n\nvar _Storage_serviceDesc = grpc.ServiceDesc{\n\tServiceName: \"google.storage.v2.Storage\",\n\tHandlerType: (*StorageServer)(nil),\n\tMethods: []grpc.MethodDesc{\n\t\t{\n\t\t\tMethodName: \"DeleteBucket\",\n\t\t\tHandler:    _Storage_DeleteBucket_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetBucket\",\n\t\t\tHandler:    _Storage_GetBucket_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CreateBucket\",\n\t\t\tHandler:    _Storage_CreateBucket_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListBuckets\",\n\t\t\tHandler:    _Storage_ListBuckets_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"LockBucketRetentionPolicy\",\n\t\t\tHandler:    _Storage_LockBucketRetentionPolicy_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetIamPolicy\",\n\t\t\tHandler:    _Storage_GetIamPolicy_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"SetIamPolicy\",\n\t\t\tHandler:    _Storage_SetIamPolicy_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"TestIamPermissions\",\n\t\t\tHandler:    _Storage_TestIamPermissions_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateBucket\",\n\t\t\tHandler:    _Storage_UpdateBucket_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ComposeObject\",\n\t\t\tHandler:    _Storage_ComposeObject_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"DeleteObject\",\n\t\t\tHandler:    _Storage_DeleteObject_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"RestoreObject\",\n\t\t\tHandler:    _Storage_RestoreObject_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"CancelResumableWrite\",\n\t\t\tHandler:    _Storage_CancelResumableWrite_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"GetObject\",\n\t\t\tHandler:    _Storage_GetObject_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"UpdateObject\",\n\t\t\tHandler:    _Storage_UpdateObject_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"ListObjects\",\n\t\t\tHandler:    _Storage_ListObjects_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"RewriteObject\",\n\t\t\tHandler:    _Storage_RewriteObject_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"StartResumableWrite\",\n\t\t\tHandler:    _Storage_StartResumableWrite_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"QueryWriteStatus\",\n\t\t\tHandler:    _Storage_QueryWriteStatus_Handler,\n\t\t},\n\t\t{\n\t\t\tMethodName: \"MoveObject\",\n\t\t\tHandler:    _Storage_MoveObject_Handler,\n\t\t},\n\t},\n\tStreams: []grpc.StreamDesc{\n\t\t{\n\t\t\tStreamName:    \"ReadObject\",\n\t\t\tHandler:       _Storage_ReadObject_Handler,\n\t\t\tServerStreams: true,\n\t\t},\n\t\t{\n\t\t\tStreamName:    \"BidiReadObject\",\n\t\t\tHandler:       _Storage_BidiReadObject_Handler,\n\t\t\tServerStreams: true,\n\t\t\tClientStreams: true,\n\t\t},\n\t\t{\n\t\t\tStreamName:    \"WriteObject\",\n\t\t\tHandler:       _Storage_WriteObject_Handler,\n\t\t\tClientStreams: true,\n\t\t},\n\t\t{\n\t\t\tStreamName:    \"BidiWriteObject\",\n\t\t\tHandler:       _Storage_BidiWriteObject_Handler,\n\t\t\tServerStreams: true,\n\t\t\tClientStreams: true,\n\t\t},\n\t},\n\tMetadata: \"google/storage/v2/storage.proto\",\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/internal/apiv2/version.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Code generated by gapicgen. DO NOT EDIT.\n\npackage storage\n\nimport \"cloud.google.com/go/storage/internal\"\n\nfunc init() {\n\tversionClient = internal.Version\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/internal/experimental.go",
    "content": "// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// All options in this package are experimental.\n\npackage internal\n\nvar (\n\t// WithMetricInterval is a function which is implemented by storage package.\n\t// It sets how often to emit metrics when using NewPeriodicReader and must be\n\t// greater than 1 minute.\n\tWithMetricInterval any // func (*time.Duration) option.ClientOption\n\n\t// WithMetricExporter is a function which is implemented by storage package.\n\t// Set an alternate client-side metric Exporter to emit metrics through.\n\tWithMetricExporter any // func (*metric.Exporter) option.ClientOption\n\n\t// WithReadStallTimeout is a function which is implemented by storage package.\n\t// It takes ReadStallTimeoutConfig as inputs and returns a option.ClientOption.\n\tWithReadStallTimeout any // func (*ReadStallTimeoutConfig) option.ClientOption\n\n\t// WithGRPCBidiReads is a function which is implemented by the storage package.\n\t// It sets the gRPC client to use the BidiReadObject API for downloads.\n\tWithGRPCBidiReads any // func() option.ClientOption\n\n\t// WithZonalBucketAPIs is a function which is implemented by the storage package.\n\t// It sets the gRPC client to use the BidiReadObject API for downloads and\n\t// appendable object semantics by default for uploads.\n\tWithZonalBucketAPIs any // func() option.ClientOption\n)\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/internal/version.go",
    "content": "// Copyright 2022 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage internal\n\n// Version is the current tagged release of the library.\nconst Version = \"1.54.0\"\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/invoke.go",
    "content": "// Copyright 2014 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/url\"\n\t\"os\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"cloud.google.com/go/internal\"\n\t\"cloud.google.com/go/internal/version\"\n\tsinternal \"cloud.google.com/go/storage/internal\"\n\t\"github.com/google/uuid\"\n\tgax \"github.com/googleapis/gax-go/v2\"\n\t\"github.com/googleapis/gax-go/v2/callctx\"\n\t\"google.golang.org/api/googleapi\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/grpc/status\"\n)\n\nvar defaultRetry *retryConfig = &retryConfig{}\nvar xGoogDefaultHeader = fmt.Sprintf(\"gl-go/%s gccl/%s\", version.Go(), sinternal.Version)\n\nconst (\n\txGoogHeaderKey            = \"x-goog-api-client\"\n\tidempotencyHeaderKey      = \"x-goog-gcs-idempotency-token\"\n\tcookieHeaderKey           = \"cookie\"\n\tdirectpathCookieHeaderKey = \"x-directpath-tracing-cookie\"\n)\n\nvar (\n\tcookieHeader = sync.OnceValue(func() string {\n\t\treturn os.Getenv(\"GOOGLE_SDK_GO_TRACING_COOKIE\")\n\t})\n)\n\nfunc (r *retryConfig) runShouldRetry(err error) bool {\n\tif r == nil || r.shouldRetry == nil {\n\t\treturn ShouldRetry(err)\n\t}\n\treturn r.shouldRetry(err)\n}\n\n// run determines whether a retry is necessary based on the config and\n// idempotency information. It then calls the function with or without retries\n// as appropriate, using the configured settings.\nfunc run(ctx context.Context, call func(ctx context.Context) error, retry *retryConfig, isIdempotent bool) error {\n\tattempts := 1\n\tinvocationID := uuid.New().String()\n\n\tif retry == nil {\n\t\tretry = defaultRetry\n\t}\n\tif (retry.policy == RetryIdempotent && !isIdempotent) || retry.policy == RetryNever {\n\t\tctxWithHeaders := setInvocationHeaders(ctx, invocationID, attempts)\n\t\treturn call(ctxWithHeaders)\n\t}\n\tbo := gax.Backoff{}\n\tif retry.backoff != nil {\n\t\tbo.Multiplier = retry.backoff.Multiplier\n\t\tbo.Initial = retry.backoff.Initial\n\t\tbo.Max = retry.backoff.Max\n\t}\n\n\tvar quitAfterTimer *time.Timer\n\tif retry.maxRetryDuration != 0 {\n\t\tquitAfterTimer = time.NewTimer(retry.maxRetryDuration)\n\t\tdefer quitAfterTimer.Stop()\n\t}\n\n\tvar lastErr error\n\treturn internal.Retry(ctx, bo, func() (stop bool, err error) {\n\t\tif retry.maxRetryDuration != 0 {\n\t\t\tselect {\n\t\t\tcase <-quitAfterTimer.C:\n\t\t\t\tif lastErr == nil {\n\t\t\t\t\treturn true, fmt.Errorf(\"storage: request not sent, choose a larger value for the retry deadline (currently set to %s)\", retry.maxRetryDuration)\n\t\t\t\t}\n\t\t\t\treturn true, fmt.Errorf(\"storage: retry deadline of %s reached after %v attempts; last error: %w\", retry.maxRetryDuration, attempts, lastErr)\n\t\t\tdefault:\n\t\t\t}\n\t\t}\n\n\t\tctxWithHeaders := setInvocationHeaders(ctx, invocationID, attempts)\n\t\tlastErr = call(ctxWithHeaders)\n\t\tif lastErr != nil && retry.maxAttempts != nil && attempts >= *retry.maxAttempts {\n\t\t\treturn true, fmt.Errorf(\"storage: retry failed after %v attempts; last error: %w\", *retry.maxAttempts, lastErr)\n\t\t}\n\t\tattempts++\n\t\tretryable := retry.runShouldRetry(lastErr)\n\t\t// Explicitly check context cancellation so that we can distinguish between a\n\t\t// DEADLINE_EXCEEDED error from the server and a user-set context deadline.\n\t\t// Unfortunately gRPC will codes.DeadlineExceeded (which may be retryable if it's\n\t\t// sent by the server) in both cases.\n\t\tif ctxErr := ctx.Err(); errors.Is(ctxErr, context.Canceled) || errors.Is(ctxErr, context.DeadlineExceeded) {\n\t\t\tretryable = false\n\t\t}\n\t\treturn !retryable, lastErr\n\t})\n}\n\n// Sets invocation ID headers on the context which will be propagated as\n// headers in the call to the service (for both gRPC and HTTP).\nfunc setInvocationHeaders(ctx context.Context, invocationID string, attempts int) context.Context {\n\tinvocationHeader := fmt.Sprintf(\"gccl-invocation-id/%v gccl-attempt-count/%v\", invocationID, attempts)\n\txGoogHeader := strings.Join([]string{invocationHeader, xGoogDefaultHeader}, \" \")\n\n\tctx = callctx.SetHeaders(ctx, xGoogHeaderKey, xGoogHeader)\n\tctx = callctx.SetHeaders(ctx, idempotencyHeaderKey, invocationID)\n\n\tif c := cookieHeader(); c != \"\" {\n\t\tctx = callctx.SetHeaders(ctx, cookieHeaderKey, c)\n\t\tctx = callctx.SetHeaders(ctx, directpathCookieHeaderKey, c)\n\t}\n\n\treturn ctx\n}\n\n// ShouldRetry returns true if an error is retryable, based on best practice\n// guidance from GCS. See\n// https://cloud.google.com/storage/docs/retry-strategy#go for more information\n// on what errors are considered retryable.\n//\n// If you would like to customize retryable errors, use the WithErrorFunc to\n// supply a RetryOption to your library calls. For example, to retry additional\n// errors, you can write a custom func that wraps ShouldRetry and also specifies\n// additional errors that should return true.\nfunc ShouldRetry(err error) bool {\n\tif err == nil {\n\t\treturn false\n\t}\n\tif errors.Is(err, io.ErrUnexpectedEOF) {\n\t\treturn true\n\t}\n\tif errors.Is(err, net.ErrClosed) {\n\t\treturn true\n\t}\n\n\tswitch e := err.(type) {\n\tcase *googleapi.Error:\n\t\t// Retry on 408, 429, and 5xx, according to\n\t\t// https://cloud.google.com/storage/docs/exponential-backoff.\n\t\treturn e.Code == 408 || e.Code == 429 || (e.Code >= 500 && e.Code < 600)\n\tcase *net.OpError, *url.Error:\n\t\t// Retry socket-level errors ECONNREFUSED and ECONNRESET (from syscall).\n\t\t// Unfortunately the error type is unexported, so we resort to string\n\t\t// matching.\n\t\tretriable := []string{\"connection refused\", \"connection reset\", \"broken pipe\"}\n\t\tfor _, s := range retriable {\n\t\t\tif strings.Contains(e.Error(), s) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\t// TODO: remove when https://github.com/golang/go/issues/53472 is resolved.\n\t\t// We don't want to retry io.EOF errors, since these can indicate normal\n\t\t// functioning terminations such as internally in the case of Reader and\n\t\t// externally in the case of iterator methods. However, the linked bug\n\t\t// requires us to retry EOFs that it causes. We can distinguish\n\t\t// EOFs caused by the bug because they are not wrapped correctly.\n\t\tif !errors.Is(err, io.EOF) && strings.Contains(err.Error(), \"EOF\") {\n\t\t\treturn true\n\t\t}\n\tcase *net.DNSError:\n\t\tif e.IsTemporary {\n\t\t\treturn true\n\t\t}\n\tcase interface{ Temporary() bool }:\n\t\tif e.Temporary() {\n\t\t\treturn true\n\t\t}\n\t}\n\t// UNAVAILABLE, RESOURCE_EXHAUSTED, INTERNAL, and DEADLINE_EXCEEDED codes are all retryable for gRPC.\n\tif st, ok := status.FromError(err); ok {\n\t\tif code := st.Code(); code == codes.Unavailable || code == codes.ResourceExhausted || code == codes.Internal || code == codes.DeadlineExceeded {\n\t\t\treturn true\n\t\t}\n\t}\n\t// Unwrap is only supported in go1.13.x+\n\tif e, ok := err.(interface{ Unwrap() error }); ok {\n\t\treturn ShouldRetry(e.Unwrap())\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/notifications.go",
    "content": "// Copyright 2017 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"regexp\"\n\n\traw \"google.golang.org/api/storage/v1\"\n)\n\n// A Notification describes how to send Cloud PubSub messages when certain\n// events occur in a bucket.\ntype Notification struct {\n\t//The ID of the notification.\n\tID string\n\n\t// The ID of the topic to which this subscription publishes.\n\tTopicID string\n\n\t// The ID of the project to which the topic belongs.\n\tTopicProjectID string\n\n\t// Only send notifications about listed event types. If empty, send notifications\n\t// for all event types.\n\t// See https://cloud.google.com/storage/docs/pubsub-notifications#events.\n\tEventTypes []string\n\n\t// If present, only apply this notification configuration to object names that\n\t// begin with this prefix.\n\tObjectNamePrefix string\n\n\t// An optional list of additional attributes to attach to each Cloud PubSub\n\t// message published for this notification subscription.\n\tCustomAttributes map[string]string\n\n\t// The contents of the message payload.\n\t// See https://cloud.google.com/storage/docs/pubsub-notifications#payload.\n\tPayloadFormat string\n}\n\n// Values for Notification.PayloadFormat.\nconst (\n\t// Send no payload with notification messages.\n\tNoPayload = \"NONE\"\n\n\t// Send object metadata as JSON with notification messages.\n\tJSONPayload = \"JSON_API_V1\"\n)\n\n// Values for Notification.EventTypes.\nconst (\n\t// Event that occurs when an object is successfully created.\n\tObjectFinalizeEvent = \"OBJECT_FINALIZE\"\n\n\t// Event that occurs when the metadata of an existing object changes.\n\tObjectMetadataUpdateEvent = \"OBJECT_METADATA_UPDATE\"\n\n\t// Event that occurs when an object is permanently deleted.\n\tObjectDeleteEvent = \"OBJECT_DELETE\"\n\n\t// Event that occurs when the live version of an object becomes an\n\t// archived version.\n\tObjectArchiveEvent = \"OBJECT_ARCHIVE\"\n)\n\nfunc toNotification(rn *raw.Notification) *Notification {\n\tn := &Notification{\n\t\tID:               rn.Id,\n\t\tEventTypes:       rn.EventTypes,\n\t\tObjectNamePrefix: rn.ObjectNamePrefix,\n\t\tCustomAttributes: rn.CustomAttributes,\n\t\tPayloadFormat:    rn.PayloadFormat,\n\t}\n\tn.TopicProjectID, n.TopicID = parseNotificationTopic(rn.Topic)\n\treturn n\n}\n\nvar topicRE = regexp.MustCompile(`^//pubsub\\.googleapis\\.com/projects/([^/]+)/topics/([^/]+)`)\n\n// parseNotificationTopic extracts the project and topic IDs from from the full\n// resource name returned by the service. If the name is malformed, it returns\n// \"?\" for both IDs.\nfunc parseNotificationTopic(nt string) (projectID, topicID string) {\n\tmatches := topicRE.FindStringSubmatch(nt)\n\tif matches == nil {\n\t\treturn \"?\", \"?\"\n\t}\n\treturn matches[1], matches[2]\n}\n\nfunc toRawNotification(n *Notification) *raw.Notification {\n\treturn &raw.Notification{\n\t\tId: n.ID,\n\t\tTopic: fmt.Sprintf(\"//pubsub.googleapis.com/projects/%s/topics/%s\",\n\t\t\tn.TopicProjectID, n.TopicID),\n\t\tEventTypes:       n.EventTypes,\n\t\tObjectNamePrefix: n.ObjectNamePrefix,\n\t\tCustomAttributes: n.CustomAttributes,\n\t\tPayloadFormat:    string(n.PayloadFormat),\n\t}\n}\n\n// AddNotification adds a notification to b. You must set n's TopicProjectID, TopicID\n// and PayloadFormat, and must not set its ID. The other fields are all optional. The\n// returned Notification's ID can be used to refer to it.\n// Note: gRPC is not supported.\nfunc (b *BucketHandle) AddNotification(ctx context.Context, n *Notification) (ret *Notification, err error) {\n\tctx, _ = startSpan(ctx, \"Bucket.AddNotification\")\n\tdefer func() { endSpan(ctx, err) }()\n\n\tif n.ID != \"\" {\n\t\treturn nil, errors.New(\"storage: AddNotification: ID must not be set\")\n\t}\n\tif n.TopicProjectID == \"\" {\n\t\treturn nil, errors.New(\"storage: AddNotification: missing TopicProjectID\")\n\t}\n\tif n.TopicID == \"\" {\n\t\treturn nil, errors.New(\"storage: AddNotification: missing TopicID\")\n\t}\n\n\topts := makeStorageOpts(false, b.retry, b.userProject)\n\tret, err = b.c.tc.CreateNotification(ctx, b.name, n, opts...)\n\treturn ret, err\n}\n\n// Notifications returns all the Notifications configured for this bucket, as a map\n// indexed by notification ID.\n// Note: gRPC is not supported.\nfunc (b *BucketHandle) Notifications(ctx context.Context) (n map[string]*Notification, err error) {\n\tctx, _ = startSpan(ctx, \"Bucket.Notifications\")\n\tdefer func() { endSpan(ctx, err) }()\n\n\topts := makeStorageOpts(true, b.retry, b.userProject)\n\tn, err = b.c.tc.ListNotifications(ctx, b.name, opts...)\n\treturn n, err\n}\n\nfunc notificationsToMap(rns []*raw.Notification) map[string]*Notification {\n\tm := map[string]*Notification{}\n\tfor _, rn := range rns {\n\t\tm[rn.Id] = toNotification(rn)\n\t}\n\treturn m\n}\n\n// DeleteNotification deletes the notification with the given ID.\n// Note: gRPC is not supported.\nfunc (b *BucketHandle) DeleteNotification(ctx context.Context, id string) (err error) {\n\tctx, _ = startSpan(ctx, \"Bucket.DeleteNotification\")\n\tdefer func() { endSpan(ctx, err) }()\n\n\topts := makeStorageOpts(true, b.retry, b.userProject)\n\treturn b.c.tc.DeleteNotification(ctx, b.name, id, opts...)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/option.go",
    "content": "// Copyright 2023 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"os\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"cloud.google.com/go/storage/experimental\"\n\tstorageinternal \"cloud.google.com/go/storage/internal\"\n\t\"go.opentelemetry.io/otel/sdk/metric\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/api/option/internaloption\"\n)\n\nconst (\n\tdynamicReadReqIncreaseRateEnv     = \"DYNAMIC_READ_REQ_INCREASE_RATE\"\n\tdynamicReadReqInitialTimeoutEnv   = \"DYNAMIC_READ_REQ_INITIAL_TIMEOUT\"\n\tdefaultDynamicReadReqIncreaseRate = 15.0\n\tdefaultDynamicReqdReqMaxTimeout   = 1 * time.Hour\n\tdefaultDynamicReadReqMinTimeout   = 500 * time.Millisecond\n\tdefaultTargetPercentile           = 0.99\n)\n\nfunc init() {\n\t// initialize experimental options\n\tstorageinternal.WithMetricExporter = withMetricExporter\n\tstorageinternal.WithMetricInterval = withMetricInterval\n\tstorageinternal.WithReadStallTimeout = withReadStallTimeout\n\tstorageinternal.WithGRPCBidiReads = withGRPCBidiReads\n\tstorageinternal.WithZonalBucketAPIs = withZonalBucketAPIs\n}\n\n// getDynamicReadReqIncreaseRateFromEnv returns the value set in the env variable.\n// It returns defaultDynamicReadReqIncreaseRate if env is not set or the set value is invalid.\nfunc getDynamicReadReqIncreaseRateFromEnv() float64 {\n\tincreaseRate := os.Getenv(dynamicReadReqIncreaseRateEnv)\n\tif increaseRate == \"\" {\n\t\treturn defaultDynamicReadReqIncreaseRate\n\t}\n\n\tval, err := strconv.ParseFloat(increaseRate, 64)\n\tif err != nil {\n\t\treturn defaultDynamicReadReqIncreaseRate\n\t}\n\treturn val\n}\n\n// getDynamicReadReqInitialTimeoutSecFromEnv returns the value set in the env variable.\n// It returns the passed defaultVal if env is not set or the set value is invalid.\nfunc getDynamicReadReqInitialTimeoutSecFromEnv(defaultVal time.Duration) time.Duration {\n\tinitialTimeout := os.Getenv(dynamicReadReqInitialTimeoutEnv)\n\tif initialTimeout == \"\" {\n\t\treturn defaultVal\n\t}\n\n\tval, err := time.ParseDuration(initialTimeout)\n\tif err != nil {\n\t\treturn defaultVal\n\t}\n\treturn val\n}\n\n// set through storageClientOptions.\ntype storageConfig struct {\n\tuseJSONforReads        bool\n\treadAPIWasSet          bool\n\tdisableClientMetrics   bool\n\tmetricExporter         *metric.Exporter\n\tmetricInterval         time.Duration\n\tmanualReader           *metric.ManualReader\n\treadStallTimeoutConfig *experimental.ReadStallTimeoutConfig\n\tgrpcBidiReads          bool\n\tgrpcAppendableUploads  bool\n}\n\n// newStorageConfig generates a new storageConfig with all the given\n// storageClientOptions applied.\nfunc newStorageConfig(opts ...option.ClientOption) storageConfig {\n\tvar conf storageConfig\n\tfor _, opt := range opts {\n\t\tif storageOpt, ok := opt.(storageClientOption); ok {\n\t\t\tstorageOpt.ApplyStorageOpt(&conf)\n\t\t}\n\t}\n\treturn conf\n}\n\n// A storageClientOption is an option for a Google Storage client.\ntype storageClientOption interface {\n\toption.ClientOption\n\tApplyStorageOpt(*storageConfig)\n}\n\n// WithJSONReads is an option that may be passed to [NewClient].\n// It sets the client to use the Cloud Storage JSON API for object\n// reads. Currently, the default API used for reads is XML, but JSON will\n// become the default in a future release.\n//\n// Setting this option is required to use the GenerationNotMatch condition. We\n// also recommend using JSON reads to ensure consistency with other client\n// operations (all of which use JSON by default).\n//\n// Note that when this option is set, reads will return a zero date for\n// [ReaderObjectAttrs].LastModified and may return a different value for\n// [ReaderObjectAttrs].CacheControl.\nfunc WithJSONReads() option.ClientOption {\n\treturn &withReadAPI{useJSON: true}\n}\n\n// WithXMLReads is an option that may be passed to [NewClient].\n// It sets the client to use the Cloud Storage XML API for object reads.\n//\n// This is the current default, but the default will switch to JSON in a future\n// release.\nfunc WithXMLReads() option.ClientOption {\n\treturn &withReadAPI{useJSON: false}\n}\n\ntype withReadAPI struct {\n\tinternaloption.EmbeddableAdapter\n\tuseJSON bool\n}\n\nfunc (w *withReadAPI) ApplyStorageOpt(c *storageConfig) {\n\tc.useJSONforReads = w.useJSON\n\tc.readAPIWasSet = true\n}\n\ntype withDisabledClientMetrics struct {\n\tinternaloption.EmbeddableAdapter\n\tdisabledClientMetrics bool\n}\n\n// WithDisabledClientMetrics is an option that may be passed to [NewClient].\n// gRPC metrics are enabled by default in the GCS client and will export the\n// gRPC telemetry discussed in [gRFC/66] and [gRFC/78] to\n// [Google Cloud Monitoring]. The option is used to disable metrics.\n// Google Cloud Support can use this information to more quickly diagnose\n// problems related to GCS and gRPC.\n// Sending this data does not incur any billing charges, and requires minimal\n// CPU (a single RPC every few minutes) or memory (a few KiB to batch the\n// telemetry).\n//\n// The default is to enable client metrics. To opt-out of metrics collected use\n// this option.\n//\n// [gRFC/66]: https://github.com/grpc/proposal/blob/master/A66-otel-stats.md\n// [gRFC/78]: https://github.com/grpc/proposal/blob/master/A78-grpc-metrics-wrr-pf-xds.md\n// [Google Cloud Monitoring]: https://cloud.google.com/monitoring/docs\nfunc WithDisabledClientMetrics() option.ClientOption {\n\treturn &withDisabledClientMetrics{disabledClientMetrics: true}\n}\n\nfunc (w *withDisabledClientMetrics) ApplyStorageOpt(c *storageConfig) {\n\tc.disableClientMetrics = w.disabledClientMetrics\n}\n\ntype withMeterOptions struct {\n\tinternaloption.EmbeddableAdapter\n\t// set sampling interval\n\tinterval time.Duration\n}\n\nfunc withMetricInterval(interval time.Duration) option.ClientOption {\n\treturn &withMeterOptions{interval: interval}\n}\n\nfunc (w *withMeterOptions) ApplyStorageOpt(c *storageConfig) {\n\tc.metricInterval = w.interval\n}\n\ntype withMetricExporterConfig struct {\n\tinternaloption.EmbeddableAdapter\n\t// exporter override\n\tmetricExporter *metric.Exporter\n}\n\nfunc withMetricExporter(ex *metric.Exporter) option.ClientOption {\n\treturn &withMetricExporterConfig{metricExporter: ex}\n}\n\nfunc (w *withMetricExporterConfig) ApplyStorageOpt(c *storageConfig) {\n\tc.metricExporter = w.metricExporter\n}\n\ntype withTestMetricReaderConfig struct {\n\tinternaloption.EmbeddableAdapter\n\t// reader override\n\tmetricReader *metric.ManualReader\n}\n\nfunc withTestMetricReader(ex *metric.ManualReader) option.ClientOption {\n\treturn &withTestMetricReaderConfig{metricReader: ex}\n}\n\nfunc (w *withTestMetricReaderConfig) ApplyStorageOpt(c *storageConfig) {\n\tc.manualReader = w.metricReader\n}\n\n// WithReadStallTimeout is an option that may be passed to [NewClient].\n// It enables the client to retry the stalled read request, happens as part of\n// storage.Reader creation. As the name suggest, timeout is adjusted dynamically\n// based on past observed read-req latencies.\n//\n// This is only supported for the read operation and that too for http(XML) client.\n// Grpc read-operation will be supported soon.\nfunc withReadStallTimeout(rstc *experimental.ReadStallTimeoutConfig) option.ClientOption {\n\t// TODO (raj-prince): To keep separate dynamicDelay instance for different BucketHandle.\n\t// Currently, dynamicTimeout is kept at the client and hence shared across all the\n\t// BucketHandle, which is not the ideal state. As latency depends on location of VM\n\t// and Bucket, and read latency of different buckets may lie in different range.\n\t// Hence having a separate dynamicTimeout instance at BucketHandle level will\n\t// be better\n\tif rstc.Min == time.Duration(0) {\n\t\trstc.Min = defaultDynamicReadReqMinTimeout\n\t}\n\tif rstc.TargetPercentile == 0 {\n\t\trstc.TargetPercentile = defaultTargetPercentile\n\t}\n\treturn &withReadStallTimeoutConfig{\n\t\treadStallTimeoutConfig: rstc,\n\t}\n}\n\ntype withReadStallTimeoutConfig struct {\n\tinternaloption.EmbeddableAdapter\n\treadStallTimeoutConfig *experimental.ReadStallTimeoutConfig\n}\n\nfunc (wrstc *withReadStallTimeoutConfig) ApplyStorageOpt(config *storageConfig) {\n\tconfig.readStallTimeoutConfig = wrstc.readStallTimeoutConfig\n}\n\nfunc withGRPCBidiReads() option.ClientOption {\n\treturn &withGRPCBidiReadsConfig{}\n}\n\ntype withGRPCBidiReadsConfig struct {\n\tinternaloption.EmbeddableAdapter\n}\n\nfunc (w *withGRPCBidiReadsConfig) ApplyStorageOpt(config *storageConfig) {\n\tconfig.grpcBidiReads = true\n}\n\nfunc withZonalBucketAPIs() option.ClientOption {\n\treturn &withZonalBucketAPIsConfig{}\n}\n\ntype withZonalBucketAPIsConfig struct {\n\tinternaloption.EmbeddableAdapter\n}\n\nfunc (w *withZonalBucketAPIsConfig) ApplyStorageOpt(config *storageConfig) {\n\t// Use both appendable upload semantics and bidi reads.\n\tconfig.grpcAppendableUploads = true\n\tconfig.grpcBidiReads = true\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/post_policy_v4.go",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"crypto\"\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"crypto/sha256\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/url\"\n\t\"strings\"\n\t\"time\"\n)\n\n// PostPolicyV4Options are used to construct a signed post policy.\n// Please see https://cloud.google.com/storage/docs/xml-api/post-object\n// for reference about the fields.\ntype PostPolicyV4Options struct {\n\t// GoogleAccessID represents the authorizer of the signed post policy generation.\n\t// It is typically the Google service account client email address from\n\t// the Google Developers Console in the form of \"xxx@developer.gserviceaccount.com\".\n\t// Required.\n\tGoogleAccessID string\n\n\t// PrivateKey is the Google service account private key. It is obtainable\n\t// from the Google Developers Console.\n\t// At https://console.developers.google.com/project/<your-project-id>/apiui/credential,\n\t// create a service account client ID or reuse one of your existing service account\n\t// credentials. Click on the \"Generate new P12 key\" to generate and download\n\t// a new private key. Once you download the P12 file, use the following command\n\t// to convert it into a PEM file.\n\t//\n\t//    $ openssl pkcs12 -in key.p12 -passin pass:notasecret -out key.pem -nodes\n\t//\n\t// Provide the contents of the PEM file as a byte slice.\n\t// Exactly one of PrivateKey or SignBytes must be non-nil.\n\tPrivateKey []byte\n\n\t// SignBytes is a function for implementing custom signing.\n\t//\n\t// Deprecated: Use SignRawBytes. If both SignBytes and SignRawBytes are defined,\n\t// SignBytes will be ignored.\n\t// This SignBytes function expects the bytes it receives to be hashed, while\n\t// SignRawBytes accepts the raw bytes without hashing, allowing more flexibility.\n\t// Add the following to the top of your signing function to hash the bytes\n\t// to use SignRawBytes instead:\n\t//\t\tshaSum := sha256.Sum256(bytes)\n\t//\t\tbytes = shaSum[:]\n\t//\n\tSignBytes func(hashBytes []byte) (signature []byte, err error)\n\n\t// SignRawBytes is a function for implementing custom signing. For example, if\n\t// your application is running on Google App Engine, you can use\n\t// appengine's internal signing function:\n\t//\t\tctx := appengine.NewContext(request)\n\t//     \tacc, _ := appengine.ServiceAccount(ctx)\n\t//     \t&PostPolicyV4Options{\n\t//     \t\tGoogleAccessID: acc,\n\t//     \t\tSignRawBytes: func(b []byte) ([]byte, error) {\n\t//     \t\t\t_, signedBytes, err := appengine.SignBytes(ctx, b)\n\t//     \t\t\treturn signedBytes, err\n\t//     \t\t},\n\t//     \t\t// etc.\n\t//     \t})\n\t//\n\t// SignRawBytes is equivalent to the SignBytes field on SignedURLOptions;\n\t// that is, you may use the same signing function for the two.\n\t//\n\t// Exactly one of PrivateKey or SignRawBytes must be non-nil.\n\tSignRawBytes func(bytes []byte) (signature []byte, err error)\n\n\t// Expires is the expiration time on the signed post policy.\n\t// It must be a time in the future.\n\t// Required.\n\tExpires time.Time\n\n\t// Style provides options for the type of URL to use. Options are\n\t// PathStyle (default), BucketBoundHostname, and VirtualHostedStyle. See\n\t// https://cloud.google.com/storage/docs/request-endpoints for details.\n\t// Optional.\n\tStyle URLStyle\n\n\t// Insecure when set indicates that the generated URL's scheme\n\t// will use \"http\" instead of \"https\" (default).\n\t// Optional.\n\tInsecure bool\n\n\t// Fields specifies the attributes of a PostPolicyV4 request.\n\t// When Fields is non-nil, its attributes must match those that will\n\t// passed into field Conditions.\n\t// Optional.\n\tFields *PolicyV4Fields\n\n\t// The conditions that the uploaded file will be expected to conform to.\n\t// When used, the failure of an upload to satisfy a condition will result in\n\t// a 4XX status code, back with the message describing the problem.\n\t// Optional.\n\tConditions []PostPolicyV4Condition\n\n\t// Hostname sets the host of the signed post policy. This field overrides\n\t// any endpoint set on a storage Client or through STORAGE_EMULATOR_HOST.\n\t// Only compatible with PathStyle URLStyle.\n\t// Optional.\n\tHostname string\n\n\tshouldHashSignBytes bool\n}\n\nfunc (opts *PostPolicyV4Options) clone() *PostPolicyV4Options {\n\treturn &PostPolicyV4Options{\n\t\tGoogleAccessID:      opts.GoogleAccessID,\n\t\tPrivateKey:          opts.PrivateKey,\n\t\tSignBytes:           opts.SignBytes,\n\t\tSignRawBytes:        opts.SignRawBytes,\n\t\tExpires:             opts.Expires,\n\t\tStyle:               opts.Style,\n\t\tInsecure:            opts.Insecure,\n\t\tFields:              opts.Fields,\n\t\tConditions:          opts.Conditions,\n\t\tshouldHashSignBytes: opts.shouldHashSignBytes,\n\t\tHostname:            opts.Hostname,\n\t}\n}\n\n// PolicyV4Fields describes the attributes for a PostPolicyV4 request.\ntype PolicyV4Fields struct {\n\t// ACL specifies the access control permissions for the object.\n\t// Optional.\n\tACL string\n\t// CacheControl specifies the caching directives for the object.\n\t// Optional.\n\tCacheControl string\n\t// ContentType specifies the media type of the object.\n\t// Optional.\n\tContentType string\n\t// ContentDisposition specifies how the file will be served back to requesters.\n\t// Optional.\n\tContentDisposition string\n\t// ContentEncoding specifies the decompressive transcoding that the object.\n\t// This field is complementary to ContentType in that the file could be\n\t// compressed but ContentType specifies the file's original media type.\n\t// Optional.\n\tContentEncoding string\n\t// Metadata specifies custom metadata for the object.\n\t// If any key doesn't begin with \"x-goog-meta-\", an error will be returned.\n\t// Optional.\n\tMetadata map[string]string\n\t// StatusCodeOnSuccess when set, specifies the status code that Cloud Storage\n\t// will serve back on successful upload of the object.\n\t// Optional.\n\tStatusCodeOnSuccess int\n\t// RedirectToURLOnSuccess when set, specifies the URL that Cloud Storage\n\t// will serve back on successful upload of the object.\n\t// Optional.\n\tRedirectToURLOnSuccess string\n}\n\n// PostPolicyV4 describes the URL and respective form fields for a generated PostPolicyV4 request.\ntype PostPolicyV4 struct {\n\t// URL is the generated URL that the file upload will be made to.\n\tURL string\n\t// Fields specifies the generated key-values that the file uploader\n\t// must include in their multipart upload form.\n\tFields map[string]string\n}\n\n// PostPolicyV4Condition describes the constraints that the subsequent\n// object upload's multipart form fields will be expected to conform to.\ntype PostPolicyV4Condition interface {\n\tisEmpty() bool\n\tjson.Marshaler\n}\n\ntype startsWith struct {\n\tkey, value string\n}\n\nfunc (sw *startsWith) MarshalJSON() ([]byte, error) {\n\treturn json.Marshal([]string{\"starts-with\", sw.key, sw.value})\n}\nfunc (sw *startsWith) isEmpty() bool {\n\treturn sw.value == \"\"\n}\n\n// ConditionStartsWith checks that an attributes starts with value.\n// An empty value will cause this condition to be ignored.\nfunc ConditionStartsWith(key, value string) PostPolicyV4Condition {\n\treturn &startsWith{key, value}\n}\n\ntype contentLengthRangeCondition struct {\n\tstart, end uint64\n}\n\nfunc (clr *contentLengthRangeCondition) MarshalJSON() ([]byte, error) {\n\treturn json.Marshal([]interface{}{\"content-length-range\", clr.start, clr.end})\n}\nfunc (clr *contentLengthRangeCondition) isEmpty() bool {\n\treturn clr.start == 0 && clr.end == 0\n}\n\ntype singleValueCondition struct {\n\tname, value string\n}\n\nfunc (svc *singleValueCondition) MarshalJSON() ([]byte, error) {\n\treturn json.Marshal(map[string]string{svc.name: svc.value})\n}\nfunc (svc *singleValueCondition) isEmpty() bool {\n\treturn svc.value == \"\"\n}\n\n// ConditionContentLengthRange constraints the limits that the\n// multipart upload's range header will be expected to be within.\nfunc ConditionContentLengthRange(start, end uint64) PostPolicyV4Condition {\n\treturn &contentLengthRangeCondition{start, end}\n}\n\nfunc conditionRedirectToURLOnSuccess(redirectURL string) PostPolicyV4Condition {\n\treturn &singleValueCondition{\"success_action_redirect\", redirectURL}\n}\n\nfunc conditionStatusCodeOnSuccess(statusCode int) PostPolicyV4Condition {\n\tsvc := &singleValueCondition{name: \"success_action_status\"}\n\tif statusCode > 0 {\n\t\tsvc.value = fmt.Sprintf(\"%d\", statusCode)\n\t}\n\treturn svc\n}\n\n// GenerateSignedPostPolicyV4 generates a PostPolicyV4 value from bucket, object and opts.\n// The generated URL and fields will then allow an unauthenticated client to perform multipart uploads.\n// If initializing a Storage Client, instead use the Bucket.GenerateSignedPostPolicyV4\n// method which uses the Client's credentials to handle authentication.\nfunc GenerateSignedPostPolicyV4(bucket, object string, opts *PostPolicyV4Options) (*PostPolicyV4, error) {\n\tif bucket == \"\" {\n\t\treturn nil, errors.New(\"storage: bucket must be non-empty\")\n\t}\n\tif object == \"\" {\n\t\treturn nil, errors.New(\"storage: object must be non-empty\")\n\t}\n\tnow := utcNow()\n\tif err := validatePostPolicyV4Options(opts, now); err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar signingFn func(hashedBytes []byte) ([]byte, error)\n\tswitch {\n\tcase opts.SignRawBytes != nil:\n\t\tsigningFn = opts.SignRawBytes\n\tcase opts.shouldHashSignBytes:\n\t\tsigningFn = opts.SignBytes\n\tcase len(opts.PrivateKey) != 0:\n\t\tparsedRSAPrivKey, err := parseKey(opts.PrivateKey)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tsigningFn = func(b []byte) ([]byte, error) {\n\t\t\tsum := sha256.Sum256(b)\n\t\t\treturn rsa.SignPKCS1v15(rand.Reader, parsedRSAPrivKey, crypto.SHA256, sum[:])\n\t\t}\n\n\tdefault:\n\t\treturn nil, errors.New(\"storage: exactly one of PrivateKey or SignRawBytes must be set\")\n\t}\n\n\tvar descFields PolicyV4Fields\n\tif opts.Fields != nil {\n\t\tdescFields = *opts.Fields\n\t}\n\n\tif err := validateMetadata(descFields.Metadata); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Build the policy.\n\tconds := make([]PostPolicyV4Condition, len(opts.Conditions))\n\tcopy(conds, opts.Conditions)\n\tconds = append(conds,\n\t\t// These are ordered lexicographically. Technically the order doesn't matter\n\t\t// for creating the policy, but we use this order to match the\n\t\t// cross-language conformance tests for this feature.\n\t\t&singleValueCondition{\"acl\", descFields.ACL},\n\t\t&singleValueCondition{\"cache-control\", descFields.CacheControl},\n\t\t&singleValueCondition{\"content-disposition\", descFields.ContentDisposition},\n\t\t&singleValueCondition{\"content-encoding\", descFields.ContentEncoding},\n\t\t&singleValueCondition{\"content-type\", descFields.ContentType},\n\t\tconditionRedirectToURLOnSuccess(descFields.RedirectToURLOnSuccess),\n\t\tconditionStatusCodeOnSuccess(descFields.StatusCodeOnSuccess),\n\t)\n\n\tYYYYMMDD := now.Format(yearMonthDay)\n\tpolicyFields := map[string]string{\n\t\t\"key\":                     object,\n\t\t\"x-goog-date\":             now.Format(iso8601),\n\t\t\"x-goog-credential\":       opts.GoogleAccessID + \"/\" + YYYYMMDD + \"/auto/storage/goog4_request\",\n\t\t\"x-goog-algorithm\":        \"GOOG4-RSA-SHA256\",\n\t\t\"acl\":                     descFields.ACL,\n\t\t\"cache-control\":           descFields.CacheControl,\n\t\t\"content-disposition\":     descFields.ContentDisposition,\n\t\t\"content-encoding\":        descFields.ContentEncoding,\n\t\t\"content-type\":            descFields.ContentType,\n\t\t\"success_action_redirect\": descFields.RedirectToURLOnSuccess,\n\t}\n\tfor key, value := range descFields.Metadata {\n\t\tconds = append(conds, &singleValueCondition{key, value})\n\t\tpolicyFields[key] = value\n\t}\n\n\t// Following from the order expected by the conformance test cases,\n\t// hence manually inserting these fields in a specific order.\n\tconds = append(conds,\n\t\t&singleValueCondition{\"bucket\", bucket},\n\t\t&singleValueCondition{\"key\", object},\n\t\t&singleValueCondition{\"x-goog-date\", now.Format(iso8601)},\n\t\t&singleValueCondition{\n\t\t\tname:  \"x-goog-credential\",\n\t\t\tvalue: opts.GoogleAccessID + \"/\" + YYYYMMDD + \"/auto/storage/goog4_request\",\n\t\t},\n\t\t&singleValueCondition{\"x-goog-algorithm\", \"GOOG4-RSA-SHA256\"},\n\t)\n\n\tnonEmptyConds := make([]PostPolicyV4Condition, 0, len(opts.Conditions))\n\tfor _, cond := range conds {\n\t\tif cond == nil || !cond.isEmpty() {\n\t\t\tnonEmptyConds = append(nonEmptyConds, cond)\n\t\t}\n\t}\n\tcondsAsJSON, err := json.Marshal(map[string]interface{}{\n\t\t\"conditions\": nonEmptyConds,\n\t\t\"expiration\": opts.Expires.Format(time.RFC3339),\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"storage: PostPolicyV4 JSON serialization failed: %w\", err)\n\t}\n\n\tb64Policy := base64.StdEncoding.EncodeToString(condsAsJSON)\n\tvar signature []byte\n\tvar signErr error\n\n\tif opts.shouldHashSignBytes {\n\t\t// SignBytes expects hashed bytes as input instead of raw bytes, so we hash them\n\t\tshaSum := sha256.Sum256([]byte(b64Policy))\n\t\tsignature, signErr = signingFn(shaSum[:])\n\t} else {\n\t\tsignature, signErr = signingFn([]byte(b64Policy))\n\t}\n\tif signErr != nil {\n\t\treturn nil, signErr\n\t}\n\n\tpolicyFields[\"policy\"] = b64Policy\n\tpolicyFields[\"x-goog-signature\"] = fmt.Sprintf(\"%x\", signature)\n\n\t// Construct the URL.\n\tscheme := \"https\"\n\tif opts.Insecure {\n\t\tscheme = \"http\"\n\t}\n\tpath := opts.Style.path(bucket, \"\") + \"/\"\n\tu := &url.URL{\n\t\tPath:    path,\n\t\tRawPath: pathEncodeV4(path),\n\t\tHost:    opts.Style.host(opts.Hostname, bucket),\n\t\tScheme:  scheme,\n\t}\n\n\tif descFields.StatusCodeOnSuccess > 0 {\n\t\tpolicyFields[\"success_action_status\"] = fmt.Sprintf(\"%d\", descFields.StatusCodeOnSuccess)\n\t}\n\n\t// Clear out fields with blanks values.\n\tfor key, value := range policyFields {\n\t\tif value == \"\" {\n\t\t\tdelete(policyFields, key)\n\t\t}\n\t}\n\tpp4 := &PostPolicyV4{\n\t\tFields: policyFields,\n\t\tURL:    u.String(),\n\t}\n\treturn pp4, nil\n}\n\n// validatePostPolicyV4Options checks that:\n// * GoogleAccessID is set\n// * either PrivateKey or SignRawBytes/SignBytes is set, but not both\n// * the deadline set in Expires is not in the past\n// * if Style is not set, it'll use PathStyle\n// * sets shouldHashSignBytes to true if opts.SignBytes should be used\nfunc validatePostPolicyV4Options(opts *PostPolicyV4Options, now time.Time) error {\n\tif opts == nil || opts.GoogleAccessID == \"\" {\n\t\treturn errors.New(\"storage: missing required GoogleAccessID\")\n\t}\n\tif privBlank, signBlank := len(opts.PrivateKey) == 0, opts.SignBytes == nil && opts.SignRawBytes == nil; privBlank == signBlank {\n\t\treturn errors.New(\"storage: exactly one of PrivateKey or SignRawBytes must be set\")\n\t}\n\tif opts.Expires.Before(now) {\n\t\treturn errors.New(\"storage: expecting Expires to be in the future\")\n\t}\n\tif opts.Style == nil {\n\t\topts.Style = PathStyle()\n\t}\n\tif opts.SignRawBytes == nil && opts.SignBytes != nil {\n\t\topts.shouldHashSignBytes = true\n\t}\n\treturn nil\n}\n\n// validateMetadata ensures that all keys passed in have a prefix of \"x-goog-meta-\",\n// otherwise it will return an error.\nfunc validateMetadata(hdrs map[string]string) (err error) {\n\tif len(hdrs) == 0 {\n\t\treturn nil\n\t}\n\n\tbadKeys := make([]string, 0, len(hdrs))\n\tfor key := range hdrs {\n\t\tif !strings.HasPrefix(key, \"x-goog-meta-\") {\n\t\t\tbadKeys = append(badKeys, key)\n\t\t}\n\t}\n\tif len(badKeys) != 0 {\n\t\terr = errors.New(\"storage: expected metadata to begin with x-goog-meta-, got \" + strings.Join(badKeys, \", \"))\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/reader.go",
    "content": "// Copyright 2016 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"hash/crc32\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"cloud.google.com/go/internal/trace\"\n)\n\nvar crc32cTable = crc32.MakeTable(crc32.Castagnoli)\n\n// ReaderObjectAttrs are attributes about the object being read. These are populated\n// during the New call. This struct only holds a subset of object attributes: to\n// get the full set of attributes, use ObjectHandle.Attrs.\n//\n// Each field is read-only.\ntype ReaderObjectAttrs struct {\n\t// Size is the length of the object's content.\n\tSize int64\n\n\t// StartOffset is the byte offset within the object\n\t// from which reading begins.\n\t// This value is only non-zero for range requests.\n\tStartOffset int64\n\n\t// ContentType is the MIME type of the object's content.\n\tContentType string\n\n\t// ContentEncoding is the encoding of the object's content.\n\tContentEncoding string\n\n\t// CacheControl specifies whether and for how long browser and Internet\n\t// caches are allowed to cache your objects.\n\tCacheControl string\n\n\t// LastModified is the time that the object was last modified.\n\tLastModified time.Time\n\n\t// Generation is the generation number of the object's content.\n\tGeneration int64\n\n\t// Metageneration is the version of the metadata for this object at\n\t// this generation. This field is used for preconditions and for\n\t// detecting changes in metadata. A metageneration number is only\n\t// meaningful in the context of a particular generation of a\n\t// particular object.\n\tMetageneration int64\n\n\t// CRC32C is the CRC32 checksum of the entire object's content using the\n\t// Castagnoli93 polynomial, if available.\n\tCRC32C uint32\n\n\t// Decompressed is true if the object is stored as a gzip file and was\n\t// decompressed when read.\n\t// Objects are automatically decompressed if the object's metadata property\n\t// \"Content-Encoding\" is set to \"gzip\" or satisfies decompressive\n\t// transcoding as per https://cloud.google.com/storage/docs/transcoding.\n\t//\n\t// To prevent decompression on reads, use [ObjectHandle.ReadCompressed].\n\tDecompressed bool\n}\n\n// NewReader creates a new Reader to read the contents of the\n// object.\n// ErrObjectNotExist will be returned if the object is not found.\n//\n// The caller must call Close on the returned Reader when done reading.\n//\n// By default, reads are made using the Cloud Storage XML API. We recommend\n// using the JSON API instead, which can be done by setting [WithJSONReads]\n// when calling [NewClient]. This ensures consistency with other client\n// operations, which all use JSON. JSON will become the default in a future\n// release.\nfunc (o *ObjectHandle) NewReader(ctx context.Context) (*Reader, error) {\n\treturn o.NewRangeReader(ctx, 0, -1)\n}\n\n// NewRangeReader reads part of an object, reading at most length bytes\n// starting at the given offset. If length is negative, the object is read\n// until the end. If offset is negative, the object is read abs(offset) bytes\n// from the end, and length must also be negative to indicate all remaining\n// bytes will be read.\n//\n// If the object's metadata property \"Content-Encoding\" is set to \"gzip\" or satisfies\n// decompressive transcoding per https://cloud.google.com/storage/docs/transcoding\n// that file will be served back whole, regardless of the requested range as\n// Google Cloud Storage dictates. If decompressive transcoding occurs,\n// [Reader.Attrs.Decompressed] will be true.\n//\n// By default, reads are made using the Cloud Storage XML API. We recommend\n// using the JSON API instead, which can be done by setting [WithJSONReads]\n// when calling [NewClient]. This ensures consistency with other client\n// operations, which all use JSON. JSON will become the default in a future\n// release.\nfunc (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64) (r *Reader, err error) {\n\t// This span covers the life of the reader. It is closed via the context\n\t// in Reader.Close.\n\tctx = trace.StartSpan(ctx, \"cloud.google.com/go/storage.Object.Reader\")\n\n\tif err := o.validate(); err != nil {\n\t\treturn nil, err\n\t}\n\tif offset < 0 && length >= 0 {\n\t\treturn nil, fmt.Errorf(\"storage: invalid offset %d < 0 requires negative length\", offset)\n\t}\n\tif o.conds != nil {\n\t\tif err := o.conds.validate(\"NewRangeReader\"); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\topts := makeStorageOpts(true, o.retry, o.userProject)\n\n\tparams := &newRangeReaderParams{\n\t\tbucket:         o.bucket,\n\t\tobject:         o.object,\n\t\tgen:            o.gen,\n\t\toffset:         offset,\n\t\tlength:         length,\n\t\tencryptionKey:  o.encryptionKey,\n\t\tconds:          o.conds,\n\t\treadCompressed: o.readCompressed,\n\t\thandle:         &o.readHandle,\n\t}\n\n\tr, err = o.c.tc.NewRangeReader(ctx, params, opts...)\n\n\t// Pass the context so that the span can be closed in Reader.Close, or close the\n\t// span now if there is an error.\n\tif err == nil {\n\t\tr.ctx = ctx\n\t} else {\n\t\ttrace.EndSpan(ctx, err)\n\t}\n\n\treturn r, err\n}\n\n// NewMultiRangeDownloader creates a multi-range reader for an object.\n// Must be called on a gRPC client created using [NewGRPCClient].\n//\n// This uses the gRPC-specific bi-directional read API, which is in private\n// preview; please contact your account manager if interested. The option\n// [experimental.WithGRPCBidiReads] or [experimental.WithZonalBucketAPIs]\n// must be selected in order to use this API.\nfunc (o *ObjectHandle) NewMultiRangeDownloader(ctx context.Context) (mrd *MultiRangeDownloader, err error) {\n\t// This span covers the life of the reader. It is closed via the context\n\t// in Reader.Close.\n\tctx = trace.StartSpan(ctx, \"cloud.google.com/go/storage.Object.MultiRangeDownloader\")\n\n\tif err := o.validate(); err != nil {\n\t\treturn nil, err\n\t}\n\tif o.conds != nil {\n\t\tif err := o.conds.validate(\"NewMultiRangeDownloader\"); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\topts := makeStorageOpts(true, o.retry, o.userProject)\n\n\tparams := &newMultiRangeDownloaderParams{\n\t\tbucket:        o.bucket,\n\t\tconds:         o.conds,\n\t\tencryptionKey: o.encryptionKey,\n\t\tgen:           o.gen,\n\t\tobject:        o.object,\n\t\thandle:        &o.readHandle,\n\t}\n\n\tr, err := o.c.tc.NewMultiRangeDownloader(ctx, params, opts...)\n\n\t// Pass the context so that the span can be closed in MultiRangeDownloader.Close(), or close the\n\t// span now if there is an error.\n\tif err == nil {\n\t\tr.ctx = ctx\n\t} else {\n\t\ttrace.EndSpan(ctx, err)\n\t}\n\n\treturn r, err\n}\n\n// decompressiveTranscoding returns true if the request was served decompressed\n// and different than its original storage form. This happens when the \"Content-Encoding\"\n// header is \"gzip\".\n// See:\n//   - https://cloud.google.com/storage/docs/transcoding#transcoding_and_gzip\n//   - https://github.com/googleapis/google-cloud-go/issues/1800\nfunc decompressiveTranscoding(res *http.Response) bool {\n\t// Decompressive Transcoding.\n\treturn res.Header.Get(\"Content-Encoding\") == \"gzip\" ||\n\t\tres.Header.Get(\"X-Goog-Stored-Content-Encoding\") == \"gzip\"\n}\n\nfunc uncompressedByServer(res *http.Response) bool {\n\t// If the data is stored as gzip but is not encoded as gzip, then it\n\t// was uncompressed by the server.\n\treturn res.Header.Get(\"X-Goog-Stored-Content-Encoding\") == \"gzip\" &&\n\t\tres.Header.Get(\"Content-Encoding\") != \"gzip\"\n}\n\n// parseCRC32c parses the crc32c hash from the X-Goog-Hash header.\n// It can parse headers in the form [crc32c=xxx md5=xxx] (XML responses) or the\n// form [crc32c=xxx,md5=xxx] (JSON responses). The md5 hash is ignored.\nfunc parseCRC32c(res *http.Response) (uint32, bool) {\n\tconst prefix = \"crc32c=\"\n\tfor _, spec := range res.Header[\"X-Goog-Hash\"] {\n\t\tvalues := strings.Split(spec, \",\")\n\n\t\tfor _, v := range values {\n\t\t\tif strings.HasPrefix(v, prefix) {\n\t\t\t\tc, err := decodeUint32(v[len(prefix):])\n\t\t\t\tif err == nil {\n\t\t\t\t\treturn c, true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\treturn 0, false\n}\n\n// setConditionsHeaders sets precondition request headers for downloads\n// using the XML API. It assumes that the conditions have been validated.\nfunc setConditionsHeaders(headers http.Header, conds *Conditions) error {\n\tif conds == nil {\n\t\treturn nil\n\t}\n\tif conds.MetagenerationMatch != 0 {\n\t\theaders.Set(\"x-goog-if-metageneration-match\", fmt.Sprint(conds.MetagenerationMatch))\n\t}\n\tswitch {\n\tcase conds.GenerationMatch != 0:\n\t\theaders.Set(\"x-goog-if-generation-match\", fmt.Sprint(conds.GenerationMatch))\n\tcase conds.DoesNotExist:\n\t\theaders.Set(\"x-goog-if-generation-match\", \"0\")\n\t}\n\treturn nil\n}\n\nvar emptyBody = ioutil.NopCloser(strings.NewReader(\"\"))\n\n// Reader reads a Cloud Storage object.\n// It implements io.Reader.\n//\n// Typically, a Reader computes the CRC of the downloaded content and compares it to\n// the stored CRC, returning an error from Read if there is a mismatch. This integrity check\n// is skipped if transcoding occurs. See https://cloud.google.com/storage/docs/transcoding.\ntype Reader struct {\n\tAttrs          ReaderObjectAttrs\n\tobjectMetadata *map[string]string\n\n\tseen, remain, size int64\n\tcheckCRC           bool // Did we check the CRC? This is now only used by tests.\n\n\treader io.ReadCloser\n\tctx    context.Context\n\tmu     sync.Mutex\n\thandle *ReadHandle\n}\n\n// Close closes the Reader. It must be called when done reading.\nfunc (r *Reader) Close() error {\n\terr := r.reader.Close()\n\ttrace.EndSpan(r.ctx, err)\n\treturn err\n}\n\nfunc (r *Reader) Read(p []byte) (int, error) {\n\tn, err := r.reader.Read(p)\n\tif r.remain != -1 {\n\t\tr.remain -= int64(n)\n\t}\n\treturn n, err\n}\n\n// WriteTo writes all the data from the Reader to w. Fulfills the io.WriterTo interface.\n// This is called implicitly when calling io.Copy on a Reader.\nfunc (r *Reader) WriteTo(w io.Writer) (int64, error) {\n\t// This implicitly calls r.reader.WriteTo for gRPC only. JSON and XML don't have an\n\t// implementation of WriteTo.\n\tn, err := io.Copy(w, r.reader)\n\tif r.remain != -1 {\n\t\tr.remain -= int64(n)\n\t}\n\treturn n, err\n}\n\n// Size returns the size of the object in bytes.\n// The returned value is always the same and is not affected by\n// calls to Read or Close.\n//\n// Deprecated: use Reader.Attrs.Size.\nfunc (r *Reader) Size() int64 {\n\treturn r.Attrs.Size\n}\n\n// Remain returns the number of bytes left to read, or -1 if unknown.\nfunc (r *Reader) Remain() int64 {\n\treturn r.remain\n}\n\n// ContentType returns the content type of the object.\n//\n// Deprecated: use Reader.Attrs.ContentType.\nfunc (r *Reader) ContentType() string {\n\treturn r.Attrs.ContentType\n}\n\n// ContentEncoding returns the content encoding of the object.\n//\n// Deprecated: use Reader.Attrs.ContentEncoding.\nfunc (r *Reader) ContentEncoding() string {\n\treturn r.Attrs.ContentEncoding\n}\n\n// CacheControl returns the cache control of the object.\n//\n// Deprecated: use Reader.Attrs.CacheControl.\nfunc (r *Reader) CacheControl() string {\n\treturn r.Attrs.CacheControl\n}\n\n// LastModified returns the value of the Last-Modified header.\n//\n// Deprecated: use Reader.Attrs.LastModified.\nfunc (r *Reader) LastModified() (time.Time, error) {\n\treturn r.Attrs.LastModified, nil\n}\n\n// Metadata returns user-provided metadata, in key/value pairs.\n//\n// It can be nil if no metadata is present, or if the client uses the JSON\n// API for downloads. Only the XML and gRPC APIs support getting\n// custom metadata via the Reader; for JSON make a separate call to\n// ObjectHandle.Attrs.\nfunc (r *Reader) Metadata() map[string]string {\n\tif r.objectMetadata != nil {\n\t\treturn *r.objectMetadata\n\t}\n\treturn nil\n}\n\n// ReadHandle returns the read handle associated with an object.\n// ReadHandle will be periodically refreshed.\n//\n// ReadHandle requires the gRPC-specific bi-directional read API, which is in\n// private preview; please contact your account manager if interested.\n// Note that this only valid for gRPC and only with zonal buckets.\nfunc (r *Reader) ReadHandle() ReadHandle {\n\tif r.handle == nil {\n\t\tr.handle = &ReadHandle{}\n\t}\n\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\treturn (*r.handle)\n}\n\n// MultiRangeDownloader reads a Cloud Storage object.\n//\n// Typically, a MultiRangeDownloader opens a stream to which we can add\n// different ranges to read from the object.\n//\n// This API is currently in preview and is not yet available for general use.\ntype MultiRangeDownloader struct {\n\tAttrs  ReaderObjectAttrs\n\treader multiRangeDownloader\n\tctx    context.Context\n}\n\ntype multiRangeDownloader interface {\n\tadd(output io.Writer, offset, limit int64, callback func(int64, int64, error))\n\twait()\n\tclose() error\n\tgetHandle() []byte\n\terror() error\n}\n\n// Add adds a new range to MultiRangeDownloader.\n//\n// The offset for the first byte to return in the read, relative to the start\n// of the object.\n//\n// A negative offset value will be interpreted as the number of bytes from the\n// end of the object to be returned. Requesting a negative offset with magnitude\n// larger than the size of the object will return the entire object. An offset\n// larger than the size of the object will result in an OutOfRange error.\n//\n// A limit of zero indicates that there is no limit, and a negative limit will\n// cause an error.\n//\n// This will initiate the read range but is non-blocking; call callback to\n// process the result. Add is thread-safe and can be called simultaneously\n// from different goroutines.\n//\n// Callback will be called with the offset, length of data read, and error\n// of the read. Note that the length of the data read may be less than the\n// requested length if the end of the object is reached.\nfunc (mrd *MultiRangeDownloader) Add(output io.Writer, offset, length int64, callback func(int64, int64, error)) {\n\tmrd.reader.add(output, offset, length, callback)\n}\n\n// Close the MultiRangeDownloader. It must be called when done reading.\n// Adding new ranges after this has been called will cause an error.\n//\n// This will immediately close the stream and can result in a\n// \"stream closed early\" error if a response for a range is still not processed.\n// Call [MultiRangeDownloader.Wait] to avoid this error.\nfunc (mrd *MultiRangeDownloader) Close() error {\n\terr := mrd.reader.close()\n\ttrace.EndSpan(mrd.ctx, err)\n\treturn err\n}\n\n// Wait for all the responses to process on the stream.\n// Adding new ranges after this has been called will cause an error.\n// Wait will wait for all callbacks to finish.\nfunc (mrd *MultiRangeDownloader) Wait() {\n\tmrd.reader.wait()\n}\n\n// GetHandle returns the read handle. This can be used to further speed up the\n// follow up read if the same object is read through a different stream.\nfunc (mrd *MultiRangeDownloader) GetHandle() []byte {\n\treturn mrd.reader.getHandle()\n}\n\n// Error returns an error if the MultiRangeDownloader is in a permanent failure\n// state. It returns a nil error if the MultiRangeDownloader is open and can be\n// used.\nfunc (mrd *MultiRangeDownloader) Error() error {\n\treturn mrd.reader.error()\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/storage.go",
    "content": "// Copyright 2014 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto\"\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"crypto/sha256\"\n\t\"crypto/x509\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"encoding/pem\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"cloud.google.com/go/internal/optional\"\n\t\"cloud.google.com/go/internal/trace\"\n\t\"cloud.google.com/go/storage/internal\"\n\t\"cloud.google.com/go/storage/internal/apiv2/storagepb\"\n\t\"github.com/googleapis/gax-go/v2\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/sdk/metric\"\n\t\"go.opentelemetry.io/otel/sdk/metric/metricdata\"\n\t\"golang.org/x/oauth2/google\"\n\t\"google.golang.org/api/googleapi\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/api/option/internaloption\"\n\traw \"google.golang.org/api/storage/v1\"\n\t\"google.golang.org/api/transport\"\n\thtransport \"google.golang.org/api/transport/http\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/grpc/experimental/stats\"\n\t\"google.golang.org/grpc/stats/opentelemetry\"\n\t\"google.golang.org/grpc/status\"\n\t\"google.golang.org/protobuf/proto\"\n\t\"google.golang.org/protobuf/reflect/protoreflect\"\n\t\"google.golang.org/protobuf/types/known/fieldmaskpb\"\n\t\"google.golang.org/protobuf/types/known/timestamppb\"\n)\n\n// Methods which can be used in signed URLs.\nvar signedURLMethods = map[string]bool{\"DELETE\": true, \"GET\": true, \"HEAD\": true, \"POST\": true, \"PUT\": true}\n\nvar (\n\t// ErrBucketNotExist indicates that the bucket does not exist. It should be\n\t// checked for using [errors.Is] instead of direct equality.\n\tErrBucketNotExist = errors.New(\"storage: bucket doesn't exist\")\n\t// ErrObjectNotExist indicates that the object does not exist. It should be\n\t// checked for using [errors.Is] instead of direct equality.\n\tErrObjectNotExist = errors.New(\"storage: object doesn't exist\")\n\t// errMethodNotSupported indicates that the method called is not currently supported by the client.\n\t// TODO: Export this error when launching the transport-agnostic client.\n\terrMethodNotSupported = errors.New(\"storage: method is not currently supported\")\n\t// errSignedURLMethodNotValid indicates that given HTTP method is not valid.\n\terrSignedURLMethodNotValid = fmt.Errorf(\"storage: HTTP method should be one of %v\", reflect.ValueOf(signedURLMethods).MapKeys())\n)\n\nvar userAgent = fmt.Sprintf(\"gcloud-golang-storage/%s\", internal.Version)\n\nconst (\n\t// ScopeFullControl grants permissions to manage your\n\t// data and permissions in Google Cloud Storage.\n\tScopeFullControl = raw.DevstorageFullControlScope\n\n\t// ScopeReadOnly grants permissions to\n\t// view your data in Google Cloud Storage.\n\tScopeReadOnly = raw.DevstorageReadOnlyScope\n\n\t// ScopeReadWrite grants permissions to manage your\n\t// data in Google Cloud Storage.\n\tScopeReadWrite = raw.DevstorageReadWriteScope\n\n\t// aes256Algorithm is the AES256 encryption algorithm used with the\n\t// Customer-Supplied Encryption Keys feature.\n\taes256Algorithm = \"AES256\"\n\n\t// defaultGen indicates the latest object generation by default,\n\t// using a negative value.\n\tdefaultGen = int64(-1)\n)\n\n// TODO: remove this once header with invocation ID is applied to all methods.\nfunc setClientHeader(headers http.Header) {\n\theaders.Set(\"x-goog-api-client\", xGoogDefaultHeader)\n}\n\n// Client is a client for interacting with Google Cloud Storage.\n//\n// Clients should be reused instead of created as needed.\n// The methods of Client are safe for concurrent use by multiple goroutines.\ntype Client struct {\n\thc  *http.Client\n\traw *raw.Service\n\t// Scheme describes the scheme under the current host.\n\tscheme string\n\t// xmlHost is the default host used for XML requests.\n\txmlHost string\n\t// May be nil.\n\tcreds *google.Credentials\n\tretry *retryConfig\n\n\t// tc is the transport-agnostic client implemented with either gRPC or HTTP.\n\ttc storageClient\n\n\t// Option to use gRRPC appendable upload API was set.\n\tgrpcAppendableUploads bool\n}\n\n// NewClient creates a new Google Cloud Storage client using the HTTP transport.\n// The default scope is ScopeFullControl. To use a different scope, like\n// ScopeReadOnly, use option.WithScopes.\n//\n// Clients should be reused instead of created as needed. The methods of Client\n// are safe for concurrent use by multiple goroutines.\n//\n// You may configure the client by passing in options from the [google.golang.org/api/option]\n// package. You may also use options defined in this package, such as [WithJSONReads].\nfunc NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) {\n\tvar creds *google.Credentials\n\n\t// In general, it is recommended to use raw.NewService instead of htransport.NewClient\n\t// since raw.NewService configures the correct default endpoints when initializing the\n\t// internal http client. However, in our case, \"NewRangeReader\" in reader.go needs to\n\t// access the http client directly to make requests, so we create the client manually\n\t// here so it can be re-used by both reader.go and raw.NewService. This means we need to\n\t// manually configure the default endpoint options on the http client. Furthermore, we\n\t// need to account for STORAGE_EMULATOR_HOST override when setting the default endpoints.\n\tif host := os.Getenv(\"STORAGE_EMULATOR_HOST\"); host == \"\" {\n\t\t// Prepend default options to avoid overriding options passed by the user.\n\t\topts = append([]option.ClientOption{option.WithScopes(ScopeFullControl, \"https://www.googleapis.com/auth/cloud-platform\"), option.WithUserAgent(userAgent)}, opts...)\n\n\t\topts = append(opts, internaloption.WithDefaultEndpointTemplate(\"https://storage.UNIVERSE_DOMAIN/storage/v1/\"),\n\t\t\tinternaloption.WithDefaultMTLSEndpoint(\"https://storage.mtls.googleapis.com/storage/v1/\"),\n\t\t\tinternaloption.WithDefaultUniverseDomain(\"googleapis.com\"),\n\t\t)\n\n\t\t// Don't error out here. The user may have passed in their own HTTP\n\t\t// client which does not auth with ADC or other common conventions.\n\t\tc, err := transport.Creds(ctx, opts...)\n\t\tif err == nil {\n\t\t\tcreds = c\n\t\t\topts = append(opts, internaloption.WithCredentials(creds))\n\t\t}\n\t} else {\n\t\tvar hostURL *url.URL\n\n\t\tif strings.Contains(host, \"://\") {\n\t\t\th, err := url.Parse(host)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\thostURL = h\n\t\t} else {\n\t\t\t// Add scheme for user if not supplied in STORAGE_EMULATOR_HOST\n\t\t\t// URL is only parsed correctly if it has a scheme, so we build it ourselves\n\t\t\thostURL = &url.URL{Scheme: \"http\", Host: host}\n\t\t}\n\n\t\thostURL.Path = \"storage/v1/\"\n\t\tendpoint := hostURL.String()\n\n\t\t// Append the emulator host as default endpoint for the user\n\t\topts = append([]option.ClientOption{\n\t\t\toption.WithoutAuthentication(),\n\t\t\tinternaloption.SkipDialSettingsValidation(),\n\t\t\tinternaloption.WithDefaultEndpointTemplate(endpoint),\n\t\t\tinternaloption.WithDefaultMTLSEndpoint(endpoint),\n\t\t}, opts...)\n\t}\n\n\t// htransport selects the correct endpoint among WithEndpoint (user override), WithDefaultEndpointTemplate, and WithDefaultMTLSEndpoint.\n\thc, ep, err := htransport.NewClient(ctx, opts...)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"dialing: %w\", err)\n\t}\n\t// RawService should be created with the chosen endpoint to take account of user override.\n\trawService, err := raw.NewService(ctx, option.WithEndpoint(ep), option.WithHTTPClient(hc))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"storage client: %w\", err)\n\t}\n\t// Update xmlHost and scheme with the chosen endpoint.\n\tu, err := url.Parse(ep)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"supplied endpoint %q is not valid: %w\", ep, err)\n\t}\n\n\ttc, err := newHTTPStorageClient(ctx, withClientOptions(opts...))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"storage: %w\", err)\n\t}\n\n\treturn &Client{\n\t\thc:      hc,\n\t\traw:     rawService,\n\t\tscheme:  u.Scheme,\n\t\txmlHost: u.Host,\n\t\tcreds:   creds,\n\t\ttc:      tc,\n\t}, nil\n}\n\n// NewGRPCClient creates a new Storage client using the gRPC transport and API.\n// Client methods which have not been implemented in gRPC will return an error.\n// In particular, methods for Cloud Pub/Sub notifications, Service Account HMAC\n// keys, and ServiceAccount are not supported.\n// Using a non-default universe domain is also not supported with the Storage\n// gRPC client.\n//\n// Clients should be reused instead of created as needed. The methods of Client\n// are safe for concurrent use by multiple goroutines.\n//\n// You may configure the client by passing in options from the [google.golang.org/api/option]\n// package.\nfunc NewGRPCClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) {\n\ttc, err := newGRPCStorageClient(ctx, withClientOptions(opts...))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &Client{\n\t\ttc:                    tc,\n\t\tgrpcAppendableUploads: tc.config.grpcAppendableUploads,\n\t}, nil\n}\n\n// CheckDirectConnectivitySupported checks if gRPC direct connectivity\n// is available for a specific bucket from the environment where the client\n// is running. A `nil` error represents Direct Connectivity was detected.\n// Direct connectivity is expected to be available when running from inside\n// GCP and connecting to a bucket in the same region.\n//\n// Experimental helper that's subject to change.\n//\n// You can pass in [option.ClientOption] you plan on passing to [NewGRPCClient]\nfunc CheckDirectConnectivitySupported(ctx context.Context, bucket string, opts ...option.ClientOption) error {\n\tview := metric.NewView(\n\t\tmetric.Instrument{\n\t\t\tName: \"grpc.client.attempt.duration\",\n\t\t\tKind: metric.InstrumentKindHistogram,\n\t\t},\n\t\tmetric.Stream{AttributeFilter: attribute.NewAllowKeysFilter(\"grpc.lb.locality\")},\n\t)\n\tmr := metric.NewManualReader()\n\tprovider := metric.NewMeterProvider(metric.WithReader(mr), metric.WithView(view))\n\t// Provider handles shutting down ManualReader\n\tdefer provider.Shutdown(ctx)\n\tmo := opentelemetry.MetricsOptions{\n\t\tMeterProvider:  provider,\n\t\tMetrics:        stats.NewMetrics(\"grpc.client.attempt.duration\"),\n\t\tOptionalLabels: []string{\"grpc.lb.locality\"},\n\t}\n\tcombinedOpts := append(opts, WithDisabledClientMetrics(), option.WithGRPCDialOption(opentelemetry.DialOption(opentelemetry.Options{MetricsOptions: mo})))\n\tclient, err := NewGRPCClient(ctx, combinedOpts...)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"storage.NewGRPCClient: %w\", err)\n\t}\n\tdefer client.Close()\n\tif _, err = client.Bucket(bucket).Attrs(ctx); err != nil {\n\t\treturn fmt.Errorf(\"Bucket.Attrs: %w\", err)\n\t}\n\t// Call manual reader to collect metric\n\trm := metricdata.ResourceMetrics{}\n\tif err = mr.Collect(context.Background(), &rm); err != nil {\n\t\treturn fmt.Errorf(\"ManualReader.Collect: %w\", err)\n\t}\n\tfor _, sm := range rm.ScopeMetrics {\n\t\tfor _, m := range sm.Metrics {\n\t\t\tif m.Name == \"grpc.client.attempt.duration\" {\n\t\t\t\thist := m.Data.(metricdata.Histogram[float64])\n\t\t\t\tfor _, d := range hist.DataPoints {\n\t\t\t\t\tv, present := d.Attributes.Value(\"grpc.lb.locality\")\n\t\t\t\t\tif present && v.AsString() != \"\" && v.AsString() != \"{}\" {\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn errors.New(\"storage: direct connectivity not detected\")\n}\n\n// Close closes the Client.\n//\n// Close need not be called at program exit.\nfunc (c *Client) Close() error {\n\t// Set fields to nil so that subsequent uses will panic.\n\tc.hc = nil\n\tc.raw = nil\n\tc.creds = nil\n\tif c.tc != nil {\n\t\treturn c.tc.Close()\n\t}\n\treturn nil\n}\n\n// SigningScheme determines the API version to use when signing URLs.\ntype SigningScheme int\n\nconst (\n\t// SigningSchemeDefault is presently V2 and will change to V4 in the future.\n\tSigningSchemeDefault SigningScheme = iota\n\n\t// SigningSchemeV2 uses the V2 scheme to sign URLs.\n\tSigningSchemeV2\n\n\t// SigningSchemeV4 uses the V4 scheme to sign URLs.\n\tSigningSchemeV4\n)\n\n// URLStyle determines the style to use for the signed URL. PathStyle is the\n// default. All non-default options work with V4 scheme only. See\n// https://cloud.google.com/storage/docs/request-endpoints for details.\ntype URLStyle interface {\n\t// host should return the host portion of the signed URL, not including\n\t// the scheme (e.g. storage.googleapis.com).\n\thost(hostname, bucket string) string\n\n\t// path should return the path portion of the signed URL, which may include\n\t// both the bucket and object name or only the object name depending on the\n\t// style.\n\tpath(bucket, object string) string\n}\n\ntype pathStyle struct{}\n\ntype virtualHostedStyle struct{}\n\ntype bucketBoundHostname struct {\n\thostname string\n}\n\nfunc (s pathStyle) host(hostname, bucket string) string {\n\tif hostname != \"\" {\n\t\treturn stripScheme(hostname)\n\t}\n\n\tif host := os.Getenv(\"STORAGE_EMULATOR_HOST\"); host != \"\" {\n\t\treturn stripScheme(host)\n\t}\n\n\treturn \"storage.googleapis.com\"\n}\n\nfunc (s virtualHostedStyle) host(hostname, bucket string) string {\n\tif hostname != \"\" {\n\t\treturn bucket + \".\" + stripScheme(hostname)\n\t}\n\n\tif host := os.Getenv(\"STORAGE_EMULATOR_HOST\"); host != \"\" {\n\t\treturn bucket + \".\" + stripScheme(host)\n\t}\n\n\treturn bucket + \".storage.googleapis.com\"\n}\n\nfunc (s bucketBoundHostname) host(_, bucket string) string {\n\treturn s.hostname\n}\n\nfunc (s pathStyle) path(bucket, object string) string {\n\tp := bucket\n\tif object != \"\" {\n\t\tp += \"/\" + object\n\t}\n\treturn p\n}\n\nfunc (s virtualHostedStyle) path(bucket, object string) string {\n\treturn object\n}\n\nfunc (s bucketBoundHostname) path(bucket, object string) string {\n\treturn object\n}\n\n// PathStyle is the default style, and will generate a URL of the form\n// \"<host-name>/<bucket-name>/<object-name>\". By default, <host-name> is\n// storage.googleapis.com, but setting an endpoint on the storage Client or\n// through STORAGE_EMULATOR_HOST overrides this. Setting Hostname on\n// SignedURLOptions or PostPolicyV4Options overrides everything else.\nfunc PathStyle() URLStyle {\n\treturn pathStyle{}\n}\n\n// VirtualHostedStyle generates a URL relative to the bucket's virtual\n// hostname, e.g. \"<bucket-name>.storage.googleapis.com/<object-name>\".\nfunc VirtualHostedStyle() URLStyle {\n\treturn virtualHostedStyle{}\n}\n\n// BucketBoundHostname generates a URL with a custom hostname tied to a\n// specific GCS bucket. The desired hostname should be passed in using the\n// hostname argument. Generated urls will be of the form\n// \"<bucket-bound-hostname>/<object-name>\". See\n// https://cloud.google.com/storage/docs/request-endpoints#cname and\n// https://cloud.google.com/load-balancing/docs/https/adding-backend-buckets-to-load-balancers\n// for details. Note that for CNAMEs, only HTTP is supported, so Insecure must\n// be set to true.\nfunc BucketBoundHostname(hostname string) URLStyle {\n\treturn bucketBoundHostname{hostname: hostname}\n}\n\n// Strips the scheme from a host if it contains it\nfunc stripScheme(host string) string {\n\tif strings.Contains(host, \"://\") {\n\t\thost = strings.SplitN(host, \"://\", 2)[1]\n\t}\n\treturn host\n}\n\n// SignedURLOptions allows you to restrict the access to the signed URL.\ntype SignedURLOptions struct {\n\t// GoogleAccessID represents the authorizer of the signed URL generation.\n\t// It is typically the Google service account client email address from\n\t// the Google Developers Console in the form of \"xxx@developer.gserviceaccount.com\".\n\t// Required.\n\tGoogleAccessID string\n\n\t// PrivateKey is the Google service account private key. It is obtainable\n\t// from the Google Developers Console.\n\t// At https://console.developers.google.com/project/<your-project-id>/apiui/credential,\n\t// create a service account client ID or reuse one of your existing service account\n\t// credentials. Click on the \"Generate new P12 key\" to generate and download\n\t// a new private key. Once you download the P12 file, use the following command\n\t// to convert it into a PEM file.\n\t//\n\t//    $ openssl pkcs12 -in key.p12 -passin pass:notasecret -out key.pem -nodes\n\t//\n\t// Provide the contents of the PEM file as a byte slice.\n\t// Exactly one of PrivateKey or SignBytes must be non-nil.\n\tPrivateKey []byte\n\n\t// SignBytes is a function for implementing custom signing. For example, if\n\t// your application is running on Google App Engine, you can use\n\t// appengine's internal signing function:\n\t//     ctx := appengine.NewContext(request)\n\t//     acc, _ := appengine.ServiceAccount(ctx)\n\t//     url, err := SignedURL(\"bucket\", \"object\", &SignedURLOptions{\n\t//     \tGoogleAccessID: acc,\n\t//     \tSignBytes: func(b []byte) ([]byte, error) {\n\t//     \t\t_, signedBytes, err := appengine.SignBytes(ctx, b)\n\t//     \t\treturn signedBytes, err\n\t//     \t},\n\t//     \t// etc.\n\t//     })\n\t//\n\t// Exactly one of PrivateKey or SignBytes must be non-nil.\n\tSignBytes func([]byte) ([]byte, error)\n\n\t// Method is the HTTP method to be used with the signed URL.\n\t// Signed URLs can be used with GET, HEAD, PUT, and DELETE requests.\n\t// Required.\n\tMethod string\n\n\t// Expires is the expiration time on the signed URL. It must be\n\t// a datetime in the future. For SigningSchemeV4, the expiration may be no\n\t// more than seven days in the future.\n\t// Required.\n\tExpires time.Time\n\n\t// ContentType is the content type header the client must provide\n\t// to use the generated signed URL.\n\t// Optional.\n\tContentType string\n\n\t// Headers is a list of extension headers the client must provide\n\t// in order to use the generated signed URL. Each must be a string of the\n\t// form \"key:values\", with multiple values separated by a semicolon.\n\t// Optional.\n\tHeaders []string\n\n\t// QueryParameters is a map of additional query parameters. When\n\t// SigningScheme is V4, this is used in computing the signature, and the\n\t// client must use the same query parameters when using the generated signed\n\t// URL.\n\t// Optional.\n\tQueryParameters url.Values\n\n\t// MD5 is the base64 encoded MD5 checksum of the file.\n\t// If provided, the client should provide the exact value on the request\n\t// header in order to use the signed URL.\n\t// Optional.\n\tMD5 string\n\n\t// Style provides options for the type of URL to use. Options are\n\t// PathStyle (default), BucketBoundHostname, and VirtualHostedStyle. See\n\t// https://cloud.google.com/storage/docs/request-endpoints for details.\n\t// Only supported for V4 signing.\n\t// Optional.\n\tStyle URLStyle\n\n\t// Insecure determines whether the signed URL should use HTTPS (default) or\n\t// HTTP.\n\t// Only supported for V4 signing.\n\t// Optional.\n\tInsecure bool\n\n\t// Scheme determines the version of URL signing to use. Default is\n\t// SigningSchemeV2.\n\tScheme SigningScheme\n\n\t// Hostname sets the host of the signed URL. This field overrides any\n\t// endpoint set on a storage Client or through STORAGE_EMULATOR_HOST.\n\t// Only compatible with PathStyle and VirtualHostedStyle URLStyles.\n\t// Optional.\n\tHostname string\n}\n\nfunc (opts *SignedURLOptions) clone() *SignedURLOptions {\n\treturn &SignedURLOptions{\n\t\tGoogleAccessID:  opts.GoogleAccessID,\n\t\tSignBytes:       opts.SignBytes,\n\t\tPrivateKey:      opts.PrivateKey,\n\t\tMethod:          opts.Method,\n\t\tExpires:         opts.Expires,\n\t\tContentType:     opts.ContentType,\n\t\tHeaders:         opts.Headers,\n\t\tQueryParameters: opts.QueryParameters,\n\t\tMD5:             opts.MD5,\n\t\tStyle:           opts.Style,\n\t\tInsecure:        opts.Insecure,\n\t\tScheme:          opts.Scheme,\n\t\tHostname:        opts.Hostname,\n\t}\n}\n\nvar (\n\ttabRegex = regexp.MustCompile(`[\\t]+`)\n\t// I was tempted to call this spacex. :)\n\tspaceRegex = regexp.MustCompile(` +`)\n\n\tcanonicalHeaderRegexp    = regexp.MustCompile(`(?i)^(x-goog-[^:]+):(.*)?$`)\n\texcludedCanonicalHeaders = map[string]bool{\n\t\t\"x-goog-encryption-key\":        true,\n\t\t\"x-goog-encryption-key-sha256\": true,\n\t}\n)\n\n// v2SanitizeHeaders applies the specifications for canonical extension headers at\n// https://cloud.google.com/storage/docs/access-control/signed-urls-v2#about-canonical-extension-headers\nfunc v2SanitizeHeaders(hdrs []string) []string {\n\theaderMap := map[string][]string{}\n\tfor _, hdr := range hdrs {\n\t\t// No leading or trailing whitespaces.\n\t\tsanitizedHeader := strings.TrimSpace(hdr)\n\n\t\tvar header, value string\n\t\t// Only keep canonical headers, discard any others.\n\t\theaderMatches := canonicalHeaderRegexp.FindStringSubmatch(sanitizedHeader)\n\t\tif len(headerMatches) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\theader = headerMatches[1]\n\t\tvalue = headerMatches[2]\n\n\t\theader = strings.ToLower(strings.TrimSpace(header))\n\t\tvalue = strings.TrimSpace(value)\n\n\t\tif excludedCanonicalHeaders[header] {\n\t\t\t// Do not keep any deliberately excluded canonical headers when signing.\n\t\t\tcontinue\n\t\t}\n\n\t\tif len(value) > 0 {\n\t\t\t// Remove duplicate headers by appending the values of duplicates\n\t\t\t// in their order of appearance.\n\t\t\theaderMap[header] = append(headerMap[header], value)\n\t\t}\n\t}\n\n\tvar sanitizedHeaders []string\n\tfor header, values := range headerMap {\n\t\t// There should be no spaces around the colon separating the header name\n\t\t// from the header value or around the values themselves. The values\n\t\t// should be separated by commas.\n\t\t//\n\t\t// NOTE: The semantics for headers without a value are not clear.\n\t\t// However from specifications these should be edge-cases anyway and we\n\t\t// should assume that there will be no canonical headers using empty\n\t\t// values. Any such headers are discarded at the regexp stage above.\n\t\tsanitizedHeaders = append(sanitizedHeaders, fmt.Sprintf(\"%s:%s\", header, strings.Join(values, \",\")))\n\t}\n\tsort.Strings(sanitizedHeaders)\n\treturn sanitizedHeaders\n}\n\n// v4SanitizeHeaders applies the specifications for canonical extension headers\n// at https://cloud.google.com/storage/docs/authentication/canonical-requests#about-headers.\n//\n// V4 does a couple things differently from V2:\n//   - Headers get sorted by key, instead of by key:value. We do this in\n//     signedURLV4.\n//   - There's no canonical regexp: we simply split headers on :.\n//   - We don't exclude canonical headers.\n//   - We replace leading and trailing spaces in header values, like v2, but also\n//     all intermediate space duplicates get stripped. That is, there's only ever\n//     a single consecutive space.\nfunc v4SanitizeHeaders(hdrs []string) []string {\n\theaderMap := map[string][]string{}\n\tfor _, hdr := range hdrs {\n\t\t// No leading or trailing whitespaces.\n\t\tsanitizedHeader := strings.TrimSpace(hdr)\n\n\t\tvar key, value string\n\t\theaderMatches := strings.SplitN(sanitizedHeader, \":\", 2)\n\t\tif len(headerMatches) < 2 {\n\t\t\tcontinue\n\t\t}\n\n\t\tkey = headerMatches[0]\n\t\tvalue = headerMatches[1]\n\n\t\tkey = strings.ToLower(strings.TrimSpace(key))\n\t\tvalue = strings.TrimSpace(value)\n\t\tvalue = string(spaceRegex.ReplaceAll([]byte(value), []byte(\" \")))\n\t\tvalue = string(tabRegex.ReplaceAll([]byte(value), []byte(\"\\t\")))\n\n\t\tif len(value) > 0 {\n\t\t\t// Remove duplicate headers by appending the values of duplicates\n\t\t\t// in their order of appearance.\n\t\t\theaderMap[key] = append(headerMap[key], value)\n\t\t}\n\t}\n\n\tvar sanitizedHeaders []string\n\tfor header, values := range headerMap {\n\t\t// There should be no spaces around the colon separating the header name\n\t\t// from the header value or around the values themselves. The values\n\t\t// should be separated by commas.\n\t\t//\n\t\t// NOTE: The semantics for headers without a value are not clear.\n\t\t// However from specifications these should be edge-cases anyway and we\n\t\t// should assume that there will be no canonical headers using empty\n\t\t// values. Any such headers are discarded at the regexp stage above.\n\t\tsanitizedHeaders = append(sanitizedHeaders, fmt.Sprintf(\"%s:%s\", header, strings.Join(values, \",\")))\n\t}\n\treturn sanitizedHeaders\n}\n\n// SignedURL returns a URL for the specified object. Signed URLs allow anyone\n// access to a restricted resource for a limited time without needing a\n// Google account or signing in. For more information about signed URLs, see\n// https://cloud.google.com/storage/docs/accesscontrol#signed_urls_query_string_authentication\n// If initializing a Storage Client, instead use the Bucket.SignedURL method\n// which uses the Client's credentials to handle authentication.\nfunc SignedURL(bucket, object string, opts *SignedURLOptions) (string, error) {\n\tnow := utcNow()\n\tif err := validateOptions(opts, now); err != nil {\n\t\treturn \"\", err\n\t}\n\n\tswitch opts.Scheme {\n\tcase SigningSchemeV2:\n\t\topts.Headers = v2SanitizeHeaders(opts.Headers)\n\t\treturn signedURLV2(bucket, object, opts)\n\tcase SigningSchemeV4:\n\t\topts.Headers = v4SanitizeHeaders(opts.Headers)\n\t\treturn signedURLV4(bucket, object, opts, now)\n\tdefault: // SigningSchemeDefault\n\t\topts.Headers = v2SanitizeHeaders(opts.Headers)\n\t\treturn signedURLV2(bucket, object, opts)\n\t}\n}\n\nfunc validateOptions(opts *SignedURLOptions, now time.Time) error {\n\tif opts == nil {\n\t\treturn errors.New(\"storage: missing required SignedURLOptions\")\n\t}\n\tif opts.GoogleAccessID == \"\" {\n\t\treturn errors.New(\"storage: missing required GoogleAccessID\")\n\t}\n\tif (opts.PrivateKey == nil) == (opts.SignBytes == nil) {\n\t\treturn errors.New(\"storage: exactly one of PrivateKey or SignedBytes must be set\")\n\t}\n\topts.Method = strings.ToUpper(opts.Method)\n\tif _, ok := signedURLMethods[opts.Method]; !ok {\n\t\treturn errSignedURLMethodNotValid\n\t}\n\tif opts.Expires.IsZero() {\n\t\treturn errors.New(\"storage: missing required expires option\")\n\t}\n\tif opts.MD5 != \"\" {\n\t\tmd5, err := base64.StdEncoding.DecodeString(opts.MD5)\n\t\tif err != nil || len(md5) != 16 {\n\t\t\treturn errors.New(\"storage: invalid MD5 checksum\")\n\t\t}\n\t}\n\tif opts.Style == nil {\n\t\topts.Style = PathStyle()\n\t}\n\tif _, ok := opts.Style.(pathStyle); !ok && opts.Scheme == SigningSchemeV2 {\n\t\treturn errors.New(\"storage: only path-style URLs are permitted with SigningSchemeV2\")\n\t}\n\tif opts.Scheme == SigningSchemeV4 {\n\t\tcutoff := now.Add(604801 * time.Second) // 7 days + 1 second\n\t\tif !opts.Expires.Before(cutoff) {\n\t\t\treturn errors.New(\"storage: expires must be within seven days from now\")\n\t\t}\n\t}\n\treturn nil\n}\n\nconst (\n\tiso8601      = \"20060102T150405Z\"\n\tyearMonthDay = \"20060102\"\n)\n\n// utcNow returns the current time in UTC and is a variable to allow for\n// reassignment in tests to provide deterministic signed URL values.\nvar utcNow = func() time.Time {\n\treturn time.Now().UTC()\n}\n\n// extractHeaderNames takes in a series of key:value headers and returns the\n// header names only.\nfunc extractHeaderNames(kvs []string) []string {\n\tvar res []string\n\tfor _, header := range kvs {\n\t\tnameValue := strings.SplitN(header, \":\", 2)\n\t\tres = append(res, nameValue[0])\n\t}\n\treturn res\n}\n\n// pathEncodeV4 creates an encoded string that matches the v4 signature spec.\n// Following the spec precisely is necessary in order to ensure that the URL\n// and signing string are correctly formed, and Go's url.PathEncode and\n// url.QueryEncode don't generate an exact match without some additional logic.\nfunc pathEncodeV4(path string) string {\n\tsegments := strings.Split(path, \"/\")\n\tvar encodedSegments []string\n\tfor _, s := range segments {\n\t\tencodedSegments = append(encodedSegments, url.QueryEscape(s))\n\t}\n\tencodedStr := strings.Join(encodedSegments, \"/\")\n\tencodedStr = strings.Replace(encodedStr, \"+\", \"%20\", -1)\n\treturn encodedStr\n}\n\n// signedURLV4 creates a signed URL using the sigV4 algorithm.\nfunc signedURLV4(bucket, name string, opts *SignedURLOptions, now time.Time) (string, error) {\n\tbuf := &bytes.Buffer{}\n\tfmt.Fprintf(buf, \"%s\\n\", opts.Method)\n\n\tu := &url.URL{Path: opts.Style.path(bucket, name)}\n\tu.RawPath = pathEncodeV4(u.Path)\n\n\t// Note: we have to add a / here because GCS does so auto-magically, despite\n\t// our encoding not doing so (and we have to exactly match their\n\t// canonical query).\n\tfmt.Fprintf(buf, \"/%s\\n\", u.RawPath)\n\n\theaderNames := append(extractHeaderNames(opts.Headers), \"host\")\n\tif opts.ContentType != \"\" {\n\t\theaderNames = append(headerNames, \"content-type\")\n\t}\n\tif opts.MD5 != \"\" {\n\t\theaderNames = append(headerNames, \"content-md5\")\n\t}\n\tsort.Strings(headerNames)\n\tsignedHeaders := strings.Join(headerNames, \";\")\n\ttimestamp := now.Format(iso8601)\n\tcredentialScope := fmt.Sprintf(\"%s/auto/storage/goog4_request\", now.Format(yearMonthDay))\n\tcanonicalQueryString := url.Values{\n\t\t\"X-Goog-Algorithm\":     {\"GOOG4-RSA-SHA256\"},\n\t\t\"X-Goog-Credential\":    {fmt.Sprintf(\"%s/%s\", opts.GoogleAccessID, credentialScope)},\n\t\t\"X-Goog-Date\":          {timestamp},\n\t\t\"X-Goog-Expires\":       {fmt.Sprintf(\"%d\", int(opts.Expires.Sub(now).Seconds()))},\n\t\t\"X-Goog-SignedHeaders\": {signedHeaders},\n\t}\n\t// Add user-supplied query parameters to the canonical query string. For V4,\n\t// it's necessary to include these.\n\tfor k, v := range opts.QueryParameters {\n\t\tcanonicalQueryString[k] = append(canonicalQueryString[k], v...)\n\t}\n\t// url.Values.Encode escaping is correct, except that a space must be replaced\n\t// by `%20` rather than `+`.\n\tescapedQuery := strings.Replace(canonicalQueryString.Encode(), \"+\", \"%20\", -1)\n\tfmt.Fprintf(buf, \"%s\\n\", escapedQuery)\n\n\t// Fill in the hostname based on the desired URL style.\n\tu.Host = opts.Style.host(opts.Hostname, bucket)\n\n\t// Fill in the URL scheme.\n\tif opts.Insecure {\n\t\tu.Scheme = \"http\"\n\t} else {\n\t\tu.Scheme = \"https\"\n\t}\n\n\tvar headersWithValue []string\n\theadersWithValue = append(headersWithValue, \"host:\"+u.Hostname())\n\theadersWithValue = append(headersWithValue, opts.Headers...)\n\tif opts.ContentType != \"\" {\n\t\theadersWithValue = append(headersWithValue, \"content-type:\"+opts.ContentType)\n\t}\n\tif opts.MD5 != \"\" {\n\t\theadersWithValue = append(headersWithValue, \"content-md5:\"+opts.MD5)\n\t}\n\t// Trim extra whitespace from headers and replace with a single space.\n\tvar trimmedHeaders []string\n\tfor _, h := range headersWithValue {\n\t\ttrimmedHeaders = append(trimmedHeaders, strings.Join(strings.Fields(h), \" \"))\n\t}\n\tcanonicalHeaders := strings.Join(sortHeadersByKey(trimmedHeaders), \"\\n\")\n\tfmt.Fprintf(buf, \"%s\\n\\n\", canonicalHeaders)\n\tfmt.Fprintf(buf, \"%s\\n\", signedHeaders)\n\n\t// If the user provides a value for X-Goog-Content-SHA256, we must use\n\t// that value in the request string. If not, we use UNSIGNED-PAYLOAD.\n\tsha256Header := false\n\tfor _, h := range trimmedHeaders {\n\t\tif strings.HasPrefix(strings.ToLower(h), \"x-goog-content-sha256\") && strings.Contains(h, \":\") {\n\t\t\tsha256Header = true\n\t\t\tfmt.Fprintf(buf, \"%s\", strings.SplitN(h, \":\", 2)[1])\n\t\t\tbreak\n\t\t}\n\t}\n\tif !sha256Header {\n\t\tfmt.Fprint(buf, \"UNSIGNED-PAYLOAD\")\n\t}\n\n\tsum := sha256.Sum256(buf.Bytes())\n\thexDigest := hex.EncodeToString(sum[:])\n\tsignBuf := &bytes.Buffer{}\n\tfmt.Fprint(signBuf, \"GOOG4-RSA-SHA256\\n\")\n\tfmt.Fprintf(signBuf, \"%s\\n\", timestamp)\n\tfmt.Fprintf(signBuf, \"%s\\n\", credentialScope)\n\tfmt.Fprintf(signBuf, \"%s\", hexDigest)\n\n\tsignBytes := opts.SignBytes\n\tif opts.PrivateKey != nil {\n\t\tkey, err := parseKey(opts.PrivateKey)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tsignBytes = func(b []byte) ([]byte, error) {\n\t\t\tsum := sha256.Sum256(b)\n\t\t\treturn rsa.SignPKCS1v15(\n\t\t\t\trand.Reader,\n\t\t\t\tkey,\n\t\t\t\tcrypto.SHA256,\n\t\t\t\tsum[:],\n\t\t\t)\n\t\t}\n\t}\n\tb, err := signBytes(signBuf.Bytes())\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tsignature := hex.EncodeToString(b)\n\tcanonicalQueryString.Set(\"X-Goog-Signature\", string(signature))\n\tu.RawQuery = canonicalQueryString.Encode()\n\treturn u.String(), nil\n}\n\n// takes a list of headerKey:headervalue1,headervalue2,etc and sorts by header\n// key.\nfunc sortHeadersByKey(hdrs []string) []string {\n\theadersMap := map[string]string{}\n\tvar headersKeys []string\n\tfor _, h := range hdrs {\n\t\tparts := strings.SplitN(h, \":\", 2)\n\t\tk := parts[0]\n\t\tv := parts[1]\n\t\theadersMap[k] = v\n\t\theadersKeys = append(headersKeys, k)\n\t}\n\tsort.Strings(headersKeys)\n\tvar sorted []string\n\tfor _, k := range headersKeys {\n\t\tv := headersMap[k]\n\t\tsorted = append(sorted, fmt.Sprintf(\"%s:%s\", k, v))\n\t}\n\treturn sorted\n}\n\nfunc signedURLV2(bucket, name string, opts *SignedURLOptions) (string, error) {\n\tsignBytes := opts.SignBytes\n\tif opts.PrivateKey != nil {\n\t\tkey, err := parseKey(opts.PrivateKey)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tsignBytes = func(b []byte) ([]byte, error) {\n\t\t\tsum := sha256.Sum256(b)\n\t\t\treturn rsa.SignPKCS1v15(\n\t\t\t\trand.Reader,\n\t\t\t\tkey,\n\t\t\t\tcrypto.SHA256,\n\t\t\t\tsum[:],\n\t\t\t)\n\t\t}\n\t}\n\n\tu := &url.URL{\n\t\tPath: fmt.Sprintf(\"/%s/%s\", bucket, name),\n\t}\n\n\tbuf := &bytes.Buffer{}\n\tfmt.Fprintf(buf, \"%s\\n\", opts.Method)\n\tfmt.Fprintf(buf, \"%s\\n\", opts.MD5)\n\tfmt.Fprintf(buf, \"%s\\n\", opts.ContentType)\n\tfmt.Fprintf(buf, \"%d\\n\", opts.Expires.Unix())\n\tif len(opts.Headers) > 0 {\n\t\tfmt.Fprintf(buf, \"%s\\n\", strings.Join(opts.Headers, \"\\n\"))\n\t}\n\tfmt.Fprintf(buf, \"%s\", u.String())\n\n\tb, err := signBytes(buf.Bytes())\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tencoded := base64.StdEncoding.EncodeToString(b)\n\tu.Scheme = \"https\"\n\tu.Host = PathStyle().host(opts.Hostname, bucket)\n\tq := u.Query()\n\tq.Set(\"GoogleAccessId\", opts.GoogleAccessID)\n\tq.Set(\"Expires\", fmt.Sprintf(\"%d\", opts.Expires.Unix()))\n\tq.Set(\"Signature\", string(encoded))\n\tu.RawQuery = q.Encode()\n\treturn u.String(), nil\n}\n\n// ReadHandle associated with the object. This is periodically refreshed.\ntype ReadHandle []byte\n\n// ObjectHandle provides operations on an object in a Google Cloud Storage bucket.\n// Use BucketHandle.Object to get a handle.\ntype ObjectHandle struct {\n\tc                 *Client\n\tbucket            string\n\tobject            string\n\tacl               ACLHandle\n\tgen               int64 // a negative value indicates latest\n\tconds             *Conditions\n\tencryptionKey     []byte // AES-256 key\n\tuserProject       string // for requester-pays buckets\n\treadCompressed    bool   // Accept-Encoding: gzip\n\tretry             *retryConfig\n\toverrideRetention *bool\n\tsoftDeleted       bool\n\treadHandle        ReadHandle\n}\n\n// ReadHandle returns a new ObjectHandle that uses the ReadHandle to open the objects.\n//\n// Objects that have already been opened can be opened an additional time,\n// using a read handle returned in the response, at lower latency.\n// This produces the exact same object and generation and does not check if\n// the generation is still the newest one.\n// Note that this will be a noop unless it's set on a gRPC client on buckets with\n// bi-directional read API access.\n// Also note that you can get a ReadHandle only via calling reader.ReadHandle() on a\n// previous read of the same object.\nfunc (o *ObjectHandle) ReadHandle(r ReadHandle) *ObjectHandle {\n\to2 := *o\n\to2.readHandle = r\n\treturn &o2\n}\n\n// ACL provides access to the object's access control list.\n// This controls who can read and write this object.\n// This call does not perform any network operations.\nfunc (o *ObjectHandle) ACL() *ACLHandle {\n\treturn &o.acl\n}\n\n// Generation returns a new ObjectHandle that operates on a specific generation\n// of the object.\n// By default, the handle operates on the latest generation. Not\n// all operations work when given a specific generation; check the API\n// endpoints at https://cloud.google.com/storage/docs/json_api/ for details.\nfunc (o *ObjectHandle) Generation(gen int64) *ObjectHandle {\n\to2 := *o\n\to2.gen = gen\n\treturn &o2\n}\n\n// If returns a new ObjectHandle that applies a set of preconditions.\n// Preconditions already set on the ObjectHandle are ignored. The supplied\n// Conditions must have at least one field set to a non-default value;\n// otherwise an error will be returned from any operation on the ObjectHandle.\n// Operations on the new handle will return an error if the preconditions are not\n// satisfied. See https://cloud.google.com/storage/docs/generations-preconditions\n// for more details.\nfunc (o *ObjectHandle) If(conds Conditions) *ObjectHandle {\n\to2 := *o\n\to2.conds = &conds\n\treturn &o2\n}\n\n// Key returns a new ObjectHandle that uses the supplied encryption\n// key to encrypt and decrypt the object's contents.\n//\n// Encryption key must be a 32-byte AES-256 key.\n// See https://cloud.google.com/storage/docs/encryption for details.\nfunc (o *ObjectHandle) Key(encryptionKey []byte) *ObjectHandle {\n\to2 := *o\n\to2.encryptionKey = encryptionKey\n\treturn &o2\n}\n\n// Attrs returns meta information about the object.\n// ErrObjectNotExist will be returned if the object is not found.\nfunc (o *ObjectHandle) Attrs(ctx context.Context) (attrs *ObjectAttrs, err error) {\n\tctx, _ = startSpan(ctx, \"Object.Attrs\")\n\tdefer func() { endSpan(ctx, err) }()\n\n\tif err := o.validate(); err != nil {\n\t\treturn nil, err\n\t}\n\topts := makeStorageOpts(true, o.retry, o.userProject)\n\treturn o.c.tc.GetObject(ctx, &getObjectParams{o.bucket, o.object, o.gen, o.encryptionKey, o.conds, o.softDeleted}, opts...)\n}\n\n// Update updates an object with the provided attributes. See\n// ObjectAttrsToUpdate docs for details on treatment of zero values.\n// ErrObjectNotExist will be returned if the object is not found.\nfunc (o *ObjectHandle) Update(ctx context.Context, uattrs ObjectAttrsToUpdate) (oa *ObjectAttrs, err error) {\n\tctx, _ = startSpan(ctx, \"Object.Update\")\n\tdefer func() { endSpan(ctx, err) }()\n\n\tif err := o.validate(); err != nil {\n\t\treturn nil, err\n\t}\n\tisIdempotent := o.conds != nil && o.conds.MetagenerationMatch != 0\n\topts := makeStorageOpts(isIdempotent, o.retry, o.userProject)\n\treturn o.c.tc.UpdateObject(ctx,\n\t\t&updateObjectParams{\n\t\t\tbucket:            o.bucket,\n\t\t\tobject:            o.object,\n\t\t\tuattrs:            &uattrs,\n\t\t\tgen:               o.gen,\n\t\t\tencryptionKey:     o.encryptionKey,\n\t\t\tconds:             o.conds,\n\t\t\toverrideRetention: o.overrideRetention,\n\t\t}, opts...)\n}\n\n// BucketName returns the name of the bucket.\nfunc (o *ObjectHandle) BucketName() string {\n\treturn o.bucket\n}\n\n// ObjectName returns the name of the object.\nfunc (o *ObjectHandle) ObjectName() string {\n\treturn o.object\n}\n\n// ObjectAttrsToUpdate is used to update the attributes of an object.\n// Only fields set to non-nil values will be updated.\n// For all fields except CustomTime and Retention, set the field to its zero\n// value to delete it. CustomTime cannot be deleted or changed to an earlier\n// time once set. Retention can be deleted (only if the Mode is Unlocked) by\n// setting it to an empty value (not nil).\n//\n// For example, to change ContentType and delete ContentEncoding, Metadata and\n// Retention, use:\n//\n//\tObjectAttrsToUpdate{\n//\t    ContentType: \"text/html\",\n//\t    ContentEncoding: \"\",\n//\t    Metadata: map[string]string{},\n//\t    Retention: &ObjectRetention{},\n//\t}\ntype ObjectAttrsToUpdate struct {\n\tEventBasedHold     optional.Bool\n\tTemporaryHold      optional.Bool\n\tContentType        optional.String\n\tContentLanguage    optional.String\n\tContentEncoding    optional.String\n\tContentDisposition optional.String\n\tCacheControl       optional.String\n\tCustomTime         time.Time         // Cannot be deleted or backdated from its current value.\n\tMetadata           map[string]string // Set to map[string]string{} to delete.\n\tACL                []ACLRule\n\n\t// If not empty, applies a predefined set of access controls. ACL must be nil.\n\t// See https://cloud.google.com/storage/docs/json_api/v1/objects/patch.\n\tPredefinedACL string\n\n\t// Retention contains the retention configuration for this object.\n\t// Operations other than setting the retention for the first time or\n\t// extending the RetainUntil time on the object retention must be done\n\t// on an ObjectHandle with OverrideUnlockedRetention set to true.\n\tRetention *ObjectRetention\n}\n\n// Delete deletes the single specified object.\nfunc (o *ObjectHandle) Delete(ctx context.Context) (err error) {\n\tctx, _ = startSpan(ctx, \"Object.Delete\")\n\tdefer func() { endSpan(ctx, err) }()\n\tif err := o.validate(); err != nil {\n\t\treturn err\n\t}\n\t// Delete is idempotent if GenerationMatch or Generation have been passed in.\n\t// The default generation is negative to get the latest version of the object.\n\tisIdempotent := (o.conds != nil && o.conds.GenerationMatch != 0) || o.gen >= 0\n\topts := makeStorageOpts(isIdempotent, o.retry, o.userProject)\n\treturn o.c.tc.DeleteObject(ctx, o.bucket, o.object, o.gen, o.conds, opts...)\n}\n\n// ReadCompressed when true causes the read to happen without decompressing.\nfunc (o *ObjectHandle) ReadCompressed(compressed bool) *ObjectHandle {\n\to2 := *o\n\to2.readCompressed = compressed\n\treturn &o2\n}\n\n// OverrideUnlockedRetention provides an option for overriding an Unlocked\n// Retention policy. This must be set to true in order to change a policy\n// from Unlocked to Locked, to set it to null, or to reduce its\n// RetainUntil attribute. It is not required for setting the ObjectRetention for\n// the first time nor for extending the RetainUntil time.\nfunc (o *ObjectHandle) OverrideUnlockedRetention(override bool) *ObjectHandle {\n\to2 := *o\n\to2.overrideRetention = &override\n\treturn &o2\n}\n\n// SoftDeleted returns an object handle that can be used to get an object that\n// has been soft deleted. To get a soft deleted object, the generation must be\n// set on the object using ObjectHandle.Generation.\n// Note that an error will be returned if a live object is queried using this.\nfunc (o *ObjectHandle) SoftDeleted() *ObjectHandle {\n\to2 := *o\n\to2.softDeleted = true\n\treturn &o2\n}\n\n// RestoreOptions allows you to set options when restoring an object.\ntype RestoreOptions struct {\n\t/// CopySourceACL indicates whether the restored object should copy the\n\t// access controls of the source object. Only valid for buckets with\n\t// fine-grained access. If uniform bucket-level access is enabled, setting\n\t// CopySourceACL will cause an error.\n\tCopySourceACL bool\n}\n\n// Restore will restore a soft-deleted object to a live object.\n// Note that you must specify a generation to use this method.\nfunc (o *ObjectHandle) Restore(ctx context.Context, opts *RestoreOptions) (*ObjectAttrs, error) {\n\tif err := o.validate(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Since the generation is required by restore calls, we set the default to\n\t// 0 instead of a negative value, which returns a more descriptive error.\n\tgen := o.gen\n\tif o.gen == defaultGen {\n\t\tgen = 0\n\t}\n\n\t// Restore is always idempotent because Generation is a required param.\n\tsOpts := makeStorageOpts(true, o.retry, o.userProject)\n\treturn o.c.tc.RestoreObject(ctx, &restoreObjectParams{\n\t\tbucket:        o.bucket,\n\t\tobject:        o.object,\n\t\tgen:           gen,\n\t\tconds:         o.conds,\n\t\tcopySourceACL: opts.CopySourceACL,\n\t}, sOpts...)\n}\n\n// Move changes the name of the object to the destination name.\n// It can only be used to rename an object within the same bucket. The\n// bucket must have [HierarchicalNamespace] enabled to use this method.\n//\n// Any preconditions set on the ObjectHandle will be applied for the source\n// object. Set preconditions on the destination object using\n// [MoveObjectDestination.Conditions].\n//\n// This API is in preview and is not yet publicly available.\nfunc (o *ObjectHandle) Move(ctx context.Context, destination MoveObjectDestination) (*ObjectAttrs, error) {\n\tif err := o.validate(); err != nil {\n\t\treturn nil, err\n\t}\n\n\tsOpts := makeStorageOpts(true, o.retry, o.userProject)\n\treturn o.c.tc.MoveObject(ctx, &moveObjectParams{\n\t\tbucket:        o.bucket,\n\t\tsrcObject:     o.object,\n\t\tdstObject:     destination.Object,\n\t\tsrcConds:      o.conds,\n\t\tdstConds:      destination.Conditions,\n\t\tencryptionKey: o.encryptionKey,\n\t}, sOpts...)\n}\n\n// MoveObjectDestination provides the destination object name and (optional) preconditions\n// for [ObjectHandle.Move].\ntype MoveObjectDestination struct {\n\tObject     string\n\tConditions *Conditions\n}\n\n// NewWriter returns a storage Writer that writes to the GCS object\n// associated with this ObjectHandle.\n//\n// A new object will be created unless an object with this name already exists.\n// Otherwise any previous object with the same name will be replaced.\n// The object will not be available (and any previous object will remain)\n// until Close has been called.\n//\n// Attributes can be set on the object by modifying the returned Writer's\n// ObjectAttrs field before the first call to Write. If no ContentType\n// attribute is specified, the content type will be automatically sniffed\n// using net/http.DetectContentType.\n//\n// Note that each Writer allocates an internal buffer of size Writer.ChunkSize.\n// See the ChunkSize docs for more information.\n//\n// It is the caller's responsibility to call Close when writing is done. To\n// stop writing without saving the data, cancel the context.\nfunc (o *ObjectHandle) NewWriter(ctx context.Context) *Writer {\n\tctx = trace.StartSpan(ctx, \"cloud.google.com/go/storage.Object.Writer\")\n\treturn &Writer{\n\t\tctx:         ctx,\n\t\to:           o,\n\t\tdonec:       make(chan struct{}),\n\t\tObjectAttrs: ObjectAttrs{Name: o.object},\n\t\tChunkSize:   googleapi.DefaultUploadChunkSize,\n\t\tAppend:      o.c.grpcAppendableUploads,\n\t}\n}\n\n// NewWriterFromAppendableObject opens a new Writer to an object which has been\n// partially flushed to GCS, but not finalized. It returns the Writer as well\n// as the current end offset of the object. All bytes written will be appended\n// continuing from the offset.\n//\n// Generation must be set on the ObjectHandle or an error will be returned.\n//\n// Writer fields such as ChunkSize or ChunkRetryDuration can be set only\n// by setting the equivalent field in [AppendableWriterOpts]. Attributes set\n// on the returned Writer will not be honored since the stream to GCS has\n// already been opened. Some fields such as ObjectAttrs and checksums cannot\n// be set on a takeover for append.\n//\n// It is the caller's responsibility to call Close when writing is complete to\n// close the stream.\n// Calling Close or Flush is necessary to sync any data in the pipe to GCS.\n//\n// The returned Writer is not safe to use across multiple go routines. In\n// addition, if you attempt to append to the same object from multiple\n// Writers at the same time, an error will be returned on Flush or Close.\n//\n// NewWriterFromAppendableObject is supported only for gRPC clients and only for\n// objects which were created append semantics and not finalized.\n// This feature is in preview and is not yet available for general use.\nfunc (o *ObjectHandle) NewWriterFromAppendableObject(ctx context.Context, opts *AppendableWriterOpts) (*Writer, int64, error) {\n\tctx = trace.StartSpan(ctx, \"cloud.google.com/go/storage.Object.Writer\")\n\tif o.gen < 0 {\n\t\treturn nil, 0, errors.New(\"storage: ObjectHandle.Generation must be set to use NewWriterFromAppendableObject\")\n\t}\n\tw := &Writer{\n\t\tctx:         ctx,\n\t\to:           o,\n\t\tdonec:       make(chan struct{}),\n\t\tObjectAttrs: ObjectAttrs{Name: o.object},\n\t\tAppend:      true,\n\t}\n\topts.apply(w)\n\tif w.ChunkSize == 0 {\n\t\tw.ChunkSize = googleapi.DefaultUploadChunkSize\n\t}\n\terr := w.openWriter()\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\treturn w, w.takeoverOffset, nil\n}\n\n// AppendableWriterOpts provides options to set on a Writer initialized\n// by [NewWriterFromAppendableObject]. Writer options must be set via this\n// struct rather than being modified on the returned Writer. All Writer\n// fields not present in this struct cannot be set when taking over an\n// appendable object.\n//\n// AppendableWriterOpts is supported only for gRPC clients and only for\n// objects which were created append semantics and not finalized.\n// This feature is in preview and is not yet available for general use.\ntype AppendableWriterOpts struct {\n\t// ChunkSize: See Writer.ChunkSize.\n\tChunkSize int\n\t// ChunkRetryDeadline: See Writer.ChunkRetryDeadline.\n\tChunkRetryDeadline time.Duration\n\t// ProgressFunc: See Writer.ProgressFunc.\n\tProgressFunc func(int64)\n\t// FinalizeOnClose: See Writer.FinalizeOnClose.\n\tFinalizeOnClose bool\n}\n\nfunc (opts *AppendableWriterOpts) apply(w *Writer) {\n\tif opts == nil {\n\t\treturn\n\t}\n\tw.ChunkRetryDeadline = opts.ChunkRetryDeadline\n\tw.ProgressFunc = opts.ProgressFunc\n\tw.ChunkSize = opts.ChunkSize\n\tw.FinalizeOnClose = opts.FinalizeOnClose\n}\n\nfunc (o *ObjectHandle) validate() error {\n\tif o.bucket == \"\" {\n\t\treturn errors.New(\"storage: bucket name is empty\")\n\t}\n\tif o.object == \"\" {\n\t\treturn errors.New(\"storage: object name is empty\")\n\t}\n\tif !utf8.ValidString(o.object) {\n\t\treturn fmt.Errorf(\"storage: object name %q is not valid UTF-8\", o.object)\n\t}\n\t// Names . and .. are not valid; see https://cloud.google.com/storage/docs/objects#naming\n\tif o.object == \".\" || o.object == \"..\" {\n\t\treturn fmt.Errorf(\"storage: object name %q is not valid\", o.object)\n\t}\n\treturn nil\n}\n\n// parseKey converts the binary contents of a private key file to an\n// *rsa.PrivateKey. It detects whether the private key is in a PEM container or\n// not. If so, it extracts the private key from PEM container before\n// conversion. It only supports PEM containers with no passphrase.\nfunc parseKey(key []byte) (*rsa.PrivateKey, error) {\n\tif block, _ := pem.Decode(key); block != nil {\n\t\tkey = block.Bytes\n\t}\n\tparsedKey, err := x509.ParsePKCS8PrivateKey(key)\n\tif err != nil {\n\t\tparsedKey, err = x509.ParsePKCS1PrivateKey(key)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\tparsed, ok := parsedKey.(*rsa.PrivateKey)\n\tif !ok {\n\t\treturn nil, errors.New(\"oauth2: private key is invalid\")\n\t}\n\treturn parsed, nil\n}\n\n// toRawObject copies the editable attributes from o to the raw library's Object type.\nfunc (o *ObjectAttrs) toRawObject(bucket string) *raw.Object {\n\tvar ret string\n\tif !o.RetentionExpirationTime.IsZero() {\n\t\tret = o.RetentionExpirationTime.Format(time.RFC3339)\n\t}\n\tvar ct string\n\tif !o.CustomTime.IsZero() {\n\t\tct = o.CustomTime.Format(time.RFC3339)\n\t}\n\treturn &raw.Object{\n\t\tBucket:                  bucket,\n\t\tName:                    o.Name,\n\t\tEventBasedHold:          o.EventBasedHold,\n\t\tTemporaryHold:           o.TemporaryHold,\n\t\tRetentionExpirationTime: ret,\n\t\tContentType:             o.ContentType,\n\t\tContentEncoding:         o.ContentEncoding,\n\t\tContentLanguage:         o.ContentLanguage,\n\t\tCacheControl:            o.CacheControl,\n\t\tContentDisposition:      o.ContentDisposition,\n\t\tStorageClass:            o.StorageClass,\n\t\tAcl:                     toRawObjectACL(o.ACL),\n\t\tMetadata:                o.Metadata,\n\t\tCustomTime:              ct,\n\t\tRetention:               o.Retention.toRawObjectRetention(),\n\t}\n}\n\n// toProtoObject copies the editable attributes from o to the proto library's Object type.\nfunc (o *ObjectAttrs) toProtoObject(b string) *storagepb.Object {\n\t// For now, there are only globally unique buckets, and \"_\" is the alias\n\t// project ID for such buckets. If the bucket is not provided, like in the\n\t// destination ObjectAttrs of a Copy, do not attempt to format it.\n\tif b != \"\" {\n\t\tb = bucketResourceName(globalProjectAlias, b)\n\t}\n\n\treturn &storagepb.Object{\n\t\tBucket:              b,\n\t\tName:                o.Name,\n\t\tEventBasedHold:      proto.Bool(o.EventBasedHold),\n\t\tTemporaryHold:       o.TemporaryHold,\n\t\tContentType:         o.ContentType,\n\t\tContentEncoding:     o.ContentEncoding,\n\t\tContentLanguage:     o.ContentLanguage,\n\t\tCacheControl:        o.CacheControl,\n\t\tContentDisposition:  o.ContentDisposition,\n\t\tStorageClass:        o.StorageClass,\n\t\tAcl:                 toProtoObjectACL(o.ACL),\n\t\tMetadata:            o.Metadata,\n\t\tCreateTime:          toProtoTimestamp(o.Created),\n\t\tFinalizeTime:        toProtoTimestamp(o.Finalized),\n\t\tCustomTime:          toProtoTimestamp(o.CustomTime),\n\t\tDeleteTime:          toProtoTimestamp(o.Deleted),\n\t\tRetentionExpireTime: toProtoTimestamp(o.RetentionExpirationTime),\n\t\tUpdateTime:          toProtoTimestamp(o.Updated),\n\t\tKmsKey:              o.KMSKeyName,\n\t\tGeneration:          o.Generation,\n\t\tSize:                o.Size,\n\t}\n}\n\n// toProtoObject copies the attributes to update from uattrs to the proto library's Object type.\nfunc (uattrs *ObjectAttrsToUpdate) toProtoObject(bucket, object string) *storagepb.Object {\n\to := &storagepb.Object{\n\t\tName:   object,\n\t\tBucket: bucket,\n\t}\n\tif uattrs == nil {\n\t\treturn o\n\t}\n\n\tif uattrs.EventBasedHold != nil {\n\t\to.EventBasedHold = proto.Bool(optional.ToBool(uattrs.EventBasedHold))\n\t}\n\tif uattrs.TemporaryHold != nil {\n\t\to.TemporaryHold = optional.ToBool(uattrs.TemporaryHold)\n\t}\n\tif uattrs.ContentType != nil {\n\t\to.ContentType = optional.ToString(uattrs.ContentType)\n\t}\n\tif uattrs.ContentLanguage != nil {\n\t\to.ContentLanguage = optional.ToString(uattrs.ContentLanguage)\n\t}\n\tif uattrs.ContentEncoding != nil {\n\t\to.ContentEncoding = optional.ToString(uattrs.ContentEncoding)\n\t}\n\tif uattrs.ContentDisposition != nil {\n\t\to.ContentDisposition = optional.ToString(uattrs.ContentDisposition)\n\t}\n\tif uattrs.CacheControl != nil {\n\t\to.CacheControl = optional.ToString(uattrs.CacheControl)\n\t}\n\tif !uattrs.CustomTime.IsZero() {\n\t\to.CustomTime = toProtoTimestamp(uattrs.CustomTime)\n\t}\n\tif uattrs.ACL != nil {\n\t\to.Acl = toProtoObjectACL(uattrs.ACL)\n\t}\n\n\to.Metadata = uattrs.Metadata\n\n\treturn o\n}\n\n// ObjectAttrs represents the metadata for a Google Cloud Storage (GCS) object.\ntype ObjectAttrs struct {\n\t// Bucket is the name of the bucket containing this GCS object.\n\t// This field is read-only.\n\tBucket string\n\n\t// Name is the name of the object within the bucket.\n\t// This field is read-only.\n\tName string\n\n\t// ContentType is the MIME type of the object's content.\n\tContentType string\n\n\t// ContentLanguage is the content language of the object's content.\n\tContentLanguage string\n\n\t// CacheControl is the Cache-Control header to be sent in the response\n\t// headers when serving the object data.\n\tCacheControl string\n\n\t// EventBasedHold specifies whether an object is under event-based hold. New\n\t// objects created in a bucket whose DefaultEventBasedHold is set will\n\t// default to that value.\n\tEventBasedHold bool\n\n\t// TemporaryHold specifies whether an object is under temporary hold. While\n\t// this flag is set to true, the object is protected against deletion and\n\t// overwrites.\n\tTemporaryHold bool\n\n\t// RetentionExpirationTime is a server-determined value that specifies the\n\t// earliest time that the object's retention period expires.\n\t// This is a read-only field.\n\tRetentionExpirationTime time.Time\n\n\t// ACL is the list of access control rules for the object.\n\tACL []ACLRule\n\n\t// If not empty, applies a predefined set of access controls. It should be set\n\t// only when writing, copying or composing an object. When copying or composing,\n\t// it acts as the destinationPredefinedAcl parameter.\n\t// PredefinedACL is always empty for ObjectAttrs returned from the service.\n\t// See https://cloud.google.com/storage/docs/json_api/v1/objects/insert\n\t// for valid values.\n\tPredefinedACL string\n\n\t// Owner is the owner of the object. This field is read-only.\n\t//\n\t// If non-zero, it is in the form of \"user-<userId>\".\n\tOwner string\n\n\t// Size is the length of the object's content. This field is read-only.\n\tSize int64\n\n\t// ContentEncoding is the encoding of the object's content.\n\tContentEncoding string\n\n\t// ContentDisposition is the optional Content-Disposition header of the object\n\t// sent in the response headers.\n\tContentDisposition string\n\n\t// MD5 is the MD5 hash of the object's content. This field is read-only,\n\t// except when used from a Writer. If set on a Writer, the uploaded\n\t// data is rejected if its MD5 hash does not match this field.\n\tMD5 []byte\n\n\t// CRC32C is the CRC32 checksum of the object's content using the Castagnoli93\n\t// polynomial. This field is read-only, except when used from a Writer or\n\t// Composer. In those cases, if the SendCRC32C field in the Writer or Composer\n\t// is set to is true, the uploaded data is rejected if its CRC32C hash does\n\t// not match this field.\n\t//\n\t// Note: For a Writer, SendCRC32C must be set to true BEFORE the first call to\n\t// Writer.Write() in order to send the checksum.\n\tCRC32C uint32\n\n\t// MediaLink is an URL to the object's content. This field is read-only.\n\tMediaLink string\n\n\t// Metadata represents user-provided metadata, in key/value pairs.\n\t// It can be nil if no metadata is provided.\n\t//\n\t// For object downloads using Reader, metadata keys are sent as headers.\n\t// Therefore, avoid setting metadata keys using characters that are not valid\n\t// for headers. See https://www.rfc-editor.org/rfc/rfc7230#section-3.2.6.\n\tMetadata map[string]string\n\n\t// Generation is the generation number of the object's content.\n\t// This field is read-only.\n\tGeneration int64\n\n\t// Metageneration is the version of the metadata for this\n\t// object at this generation. This field is used for preconditions\n\t// and for detecting changes in metadata. A metageneration number\n\t// is only meaningful in the context of a particular generation\n\t// of a particular object. This field is read-only.\n\tMetageneration int64\n\n\t// StorageClass is the storage class of the object. This defines\n\t// how objects are stored and determines the SLA and the cost of storage.\n\t// Typical values are \"STANDARD\", \"NEARLINE\", \"COLDLINE\" and \"ARCHIVE\".\n\t// Defaults to \"STANDARD\".\n\t// See https://cloud.google.com/storage/docs/storage-classes for all\n\t// valid values.\n\tStorageClass string\n\n\t// Created is the time the object was created. This field is read-only.\n\tCreated time.Time\n\n\t// Finalized is the time the object contents were finalized. This may differ\n\t// from Created for appendable objects. This field is read-only.\n\tFinalized time.Time\n\n\t// Deleted is the time the object was deleted.\n\t// If not deleted, it is the zero value. This field is read-only.\n\tDeleted time.Time\n\n\t// Updated is the creation or modification time of the object.\n\t// For buckets with versioning enabled, changing an object's\n\t// metadata does not change this property. This field is read-only.\n\tUpdated time.Time\n\n\t// CustomerKeySHA256 is the base64-encoded SHA-256 hash of the\n\t// customer-supplied encryption key for the object. It is empty if there is\n\t// no customer-supplied encryption key.\n\t// See // https://cloud.google.com/storage/docs/encryption for more about\n\t// encryption in Google Cloud Storage.\n\tCustomerKeySHA256 string\n\n\t// Cloud KMS key name, in the form\n\t// projects/P/locations/L/keyRings/R/cryptoKeys/K, used to encrypt this object,\n\t// if the object is encrypted by such a key.\n\t//\n\t// Providing both a KMSKeyName and a customer-supplied encryption key (via\n\t// ObjectHandle.Key) will result in an error when writing an object.\n\tKMSKeyName string\n\n\t// Prefix is set only for ObjectAttrs which represent synthetic \"directory\n\t// entries\" when iterating over buckets using Query.Delimiter. See\n\t// ObjectIterator.Next. When set, no other fields in ObjectAttrs will be\n\t// populated.\n\tPrefix string\n\n\t// Etag is the HTTP/1.1 Entity tag for the object.\n\t// This field is read-only.\n\tEtag string\n\n\t// A user-specified timestamp which can be applied to an object. This is\n\t// typically set in order to use the CustomTimeBefore and DaysSinceCustomTime\n\t// LifecycleConditions to manage object lifecycles.\n\t//\n\t// CustomTime cannot be removed once set on an object. It can be updated to a\n\t// later value but not to an earlier one. For more information see\n\t// https://cloud.google.com/storage/docs/metadata#custom-time .\n\tCustomTime time.Time\n\n\t// ComponentCount is the number of objects contained within a composite object.\n\t// For non-composite objects, the value will be zero.\n\t// This field is read-only.\n\tComponentCount int64\n\n\t// Retention contains the retention configuration for this object.\n\t// ObjectRetention cannot be configured or reported through the gRPC API.\n\tRetention *ObjectRetention\n\n\t// SoftDeleteTime is the time when the object became soft-deleted.\n\t// Soft-deleted objects are only accessible on an object handle returned by\n\t// ObjectHandle.SoftDeleted; if ObjectHandle.SoftDeleted has not been set,\n\t// ObjectHandle.Attrs will return ErrObjectNotExist if the object is soft-deleted.\n\t// This field is read-only.\n\tSoftDeleteTime time.Time\n\n\t// HardDeleteTime is the time when the object will be permanently deleted.\n\t// Only set when an object becomes soft-deleted with a soft delete policy.\n\t// Soft-deleted objects are only accessible on an object handle returned by\n\t// ObjectHandle.SoftDeleted; if ObjectHandle.SoftDeleted has not been set,\n\t// ObjectHandle.Attrs will return ErrObjectNotExist if the object is soft-deleted.\n\t// This field is read-only.\n\tHardDeleteTime time.Time\n}\n\n// ObjectRetention contains the retention configuration for this object.\ntype ObjectRetention struct {\n\t// Mode is the retention policy's mode on this object. Valid values are\n\t// \"Locked\" and \"Unlocked\".\n\t// Locked retention policies cannot be changed. Unlocked policies require an\n\t// override to change.\n\tMode string\n\n\t// RetainUntil is the time this object will be retained until.\n\tRetainUntil time.Time\n}\n\nfunc (r *ObjectRetention) toRawObjectRetention() *raw.ObjectRetention {\n\tif r == nil {\n\t\treturn nil\n\t}\n\treturn &raw.ObjectRetention{\n\t\tMode:            r.Mode,\n\t\tRetainUntilTime: r.RetainUntil.Format(time.RFC3339),\n\t}\n}\n\nfunc toObjectRetention(r *raw.ObjectRetention) *ObjectRetention {\n\tif r == nil {\n\t\treturn nil\n\t}\n\treturn &ObjectRetention{\n\t\tMode:        r.Mode,\n\t\tRetainUntil: convertTime(r.RetainUntilTime),\n\t}\n}\n\n// convertTime converts a time in RFC3339 format to time.Time.\n// If any error occurs in parsing, the zero-value time.Time is silently returned.\nfunc convertTime(t string) time.Time {\n\tvar r time.Time\n\tif t != \"\" {\n\t\tr, _ = time.Parse(time.RFC3339, t)\n\t}\n\treturn r\n}\n\nfunc convertProtoTime(t *timestamppb.Timestamp) time.Time {\n\tvar r time.Time\n\tif t != nil {\n\t\tr = t.AsTime()\n\t}\n\treturn r\n}\n\nfunc toProtoTimestamp(t time.Time) *timestamppb.Timestamp {\n\tif t.IsZero() {\n\t\treturn nil\n\t}\n\n\treturn timestamppb.New(t)\n}\n\nfunc newObject(o *raw.Object) *ObjectAttrs {\n\tif o == nil {\n\t\treturn nil\n\t}\n\towner := \"\"\n\tif o.Owner != nil {\n\t\towner = o.Owner.Entity\n\t}\n\tmd5, _ := base64.StdEncoding.DecodeString(o.Md5Hash)\n\tcrc32c, _ := decodeUint32(o.Crc32c)\n\tvar sha256 string\n\tif o.CustomerEncryption != nil {\n\t\tsha256 = o.CustomerEncryption.KeySha256\n\t}\n\treturn &ObjectAttrs{\n\t\tBucket:                  o.Bucket,\n\t\tName:                    o.Name,\n\t\tContentType:             o.ContentType,\n\t\tContentLanguage:         o.ContentLanguage,\n\t\tCacheControl:            o.CacheControl,\n\t\tEventBasedHold:          o.EventBasedHold,\n\t\tTemporaryHold:           o.TemporaryHold,\n\t\tRetentionExpirationTime: convertTime(o.RetentionExpirationTime),\n\t\tACL:                     toObjectACLRules(o.Acl),\n\t\tOwner:                   owner,\n\t\tContentEncoding:         o.ContentEncoding,\n\t\tContentDisposition:      o.ContentDisposition,\n\t\tSize:                    int64(o.Size),\n\t\tMD5:                     md5,\n\t\tCRC32C:                  crc32c,\n\t\tMediaLink:               o.MediaLink,\n\t\tMetadata:                o.Metadata,\n\t\tGeneration:              o.Generation,\n\t\tMetageneration:          o.Metageneration,\n\t\tStorageClass:            o.StorageClass,\n\t\tCustomerKeySHA256:       sha256,\n\t\tKMSKeyName:              o.KmsKeyName,\n\t\tCreated:                 convertTime(o.TimeCreated),\n\t\tFinalized:               convertTime(o.TimeFinalized),\n\t\tDeleted:                 convertTime(o.TimeDeleted),\n\t\tUpdated:                 convertTime(o.Updated),\n\t\tEtag:                    o.Etag,\n\t\tCustomTime:              convertTime(o.CustomTime),\n\t\tComponentCount:          o.ComponentCount,\n\t\tRetention:               toObjectRetention(o.Retention),\n\t\tSoftDeleteTime:          convertTime(o.SoftDeleteTime),\n\t\tHardDeleteTime:          convertTime(o.HardDeleteTime),\n\t}\n}\n\nfunc newObjectFromProto(o *storagepb.Object) *ObjectAttrs {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &ObjectAttrs{\n\t\tBucket:                  parseBucketName(o.Bucket),\n\t\tName:                    o.Name,\n\t\tContentType:             o.ContentType,\n\t\tContentLanguage:         o.ContentLanguage,\n\t\tCacheControl:            o.CacheControl,\n\t\tEventBasedHold:          o.GetEventBasedHold(),\n\t\tTemporaryHold:           o.TemporaryHold,\n\t\tRetentionExpirationTime: convertProtoTime(o.GetRetentionExpireTime()),\n\t\tACL:                     toObjectACLRulesFromProto(o.GetAcl()),\n\t\tOwner:                   o.GetOwner().GetEntity(),\n\t\tContentEncoding:         o.ContentEncoding,\n\t\tContentDisposition:      o.ContentDisposition,\n\t\tSize:                    int64(o.Size),\n\t\tMD5:                     o.GetChecksums().GetMd5Hash(),\n\t\tCRC32C:                  o.GetChecksums().GetCrc32C(),\n\t\tMetadata:                o.Metadata,\n\t\tGeneration:              o.Generation,\n\t\tMetageneration:          o.Metageneration,\n\t\tStorageClass:            o.StorageClass,\n\t\t// CustomerKeySHA256 needs to be presented as base64 encoded, but the response from gRPC is not.\n\t\tCustomerKeySHA256: base64.StdEncoding.EncodeToString(o.GetCustomerEncryption().GetKeySha256Bytes()),\n\t\tKMSKeyName:        o.GetKmsKey(),\n\t\tCreated:           convertProtoTime(o.GetCreateTime()),\n\t\tFinalized:         convertProtoTime(o.GetFinalizeTime()),\n\t\tDeleted:           convertProtoTime(o.GetDeleteTime()),\n\t\tUpdated:           convertProtoTime(o.GetUpdateTime()),\n\t\tCustomTime:        convertProtoTime(o.GetCustomTime()),\n\t\tComponentCount:    int64(o.ComponentCount),\n\t\tSoftDeleteTime:    convertProtoTime(o.GetSoftDeleteTime()),\n\t\tHardDeleteTime:    convertProtoTime(o.GetHardDeleteTime()),\n\t}\n}\n\n// Decode a uint32 encoded in Base64 in big-endian byte order.\nfunc decodeUint32(b64 string) (uint32, error) {\n\td, err := base64.StdEncoding.DecodeString(b64)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif len(d) != 4 {\n\t\treturn 0, fmt.Errorf(\"storage: %q does not encode a 32-bit value\", d)\n\t}\n\treturn uint32(d[0])<<24 + uint32(d[1])<<16 + uint32(d[2])<<8 + uint32(d[3]), nil\n}\n\n// Encode a uint32 as Base64 in big-endian byte order.\nfunc encodeUint32(u uint32) string {\n\tb := []byte{byte(u >> 24), byte(u >> 16), byte(u >> 8), byte(u)}\n\treturn base64.StdEncoding.EncodeToString(b)\n}\n\n// Projection is enumerated type for Query.Projection.\ntype Projection int\n\nconst (\n\t// ProjectionDefault returns all fields of objects.\n\tProjectionDefault Projection = iota\n\n\t// ProjectionFull returns all fields of objects.\n\tProjectionFull\n\n\t// ProjectionNoACL returns all fields of objects except for Owner and ACL.\n\tProjectionNoACL\n)\n\nfunc (p Projection) String() string {\n\tswitch p {\n\tcase ProjectionFull:\n\t\treturn \"full\"\n\tcase ProjectionNoACL:\n\t\treturn \"noAcl\"\n\tdefault:\n\t\treturn \"\"\n\t}\n}\n\n// Query represents a query to filter objects from a bucket.\ntype Query struct {\n\t// Delimiter returns results in a directory-like fashion.\n\t// Results will contain only objects whose names, aside from the\n\t// prefix, do not contain delimiter. Objects whose names,\n\t// aside from the prefix, contain delimiter will have their name,\n\t// truncated after the delimiter, returned in prefixes.\n\t// Duplicate prefixes are omitted.\n\t// Must be set to / when used with the MatchGlob parameter to filter results\n\t// in a directory-like mode.\n\t// Optional.\n\tDelimiter string\n\n\t// Prefix is the prefix filter to query objects\n\t// whose names begin with this prefix.\n\t// Optional.\n\tPrefix string\n\n\t// Versions indicates whether multiple versions of the same\n\t// object will be included in the results.\n\tVersions bool\n\n\t// attrSelection is used to select only specific fields to be returned by\n\t// the query. It is set by the user calling SetAttrSelection. These\n\t// are used by toFieldMask and toFieldSelection for gRPC and HTTP/JSON\n\t// clients respectively.\n\tattrSelection []string\n\n\t// StartOffset is used to filter results to objects whose names are\n\t// lexicographically equal to or after startOffset. If endOffset is also set,\n\t// the objects listed will have names between startOffset (inclusive) and\n\t// endOffset (exclusive).\n\tStartOffset string\n\n\t// EndOffset is used to filter results to objects whose names are\n\t// lexicographically before endOffset. If startOffset is also set, the objects\n\t// listed will have names between startOffset (inclusive) and endOffset (exclusive).\n\tEndOffset string\n\n\t// Projection defines the set of properties to return. It will default to ProjectionFull,\n\t// which returns all properties. Passing ProjectionNoACL will omit Owner and ACL,\n\t// which may improve performance when listing many objects.\n\tProjection Projection\n\n\t// IncludeTrailingDelimiter controls how objects which end in a single\n\t// instance of Delimiter (for example, if Query.Delimiter = \"/\" and the\n\t// object name is \"foo/bar/\") are included in the results. By default, these\n\t// objects only show up as prefixes. If IncludeTrailingDelimiter is set to\n\t// true, they will also be included as objects and their metadata will be\n\t// populated in the returned ObjectAttrs.\n\tIncludeTrailingDelimiter bool\n\n\t// MatchGlob is a glob pattern used to filter results (for example, foo*bar). See\n\t// https://cloud.google.com/storage/docs/json_api/v1/objects/list#list-object-glob\n\t// for syntax details. When Delimiter is set in conjunction with MatchGlob,\n\t// it must be set to /.\n\tMatchGlob string\n\n\t// IncludeFoldersAsPrefixes includes Folders and Managed Folders in the set of\n\t// prefixes returned by the query. Only applicable if Delimiter is set to /.\n\tIncludeFoldersAsPrefixes bool\n\n\t// SoftDeleted indicates whether to list soft-deleted objects.\n\t// If true, only objects that have been soft-deleted will be listed.\n\t// By default, soft-deleted objects are not listed.\n\tSoftDeleted bool\n}\n\n// attrToFieldMap maps the field names of ObjectAttrs to the underlying field\n// names in the API call. Only the ObjectAttrs field names are visible to users\n// because they are already part of the public API of the package.\nvar attrToFieldMap = map[string]string{\n\t\"Bucket\":                  \"bucket\",\n\t\"Name\":                    \"name\",\n\t\"ContentType\":             \"contentType\",\n\t\"ContentLanguage\":         \"contentLanguage\",\n\t\"CacheControl\":            \"cacheControl\",\n\t\"EventBasedHold\":          \"eventBasedHold\",\n\t\"TemporaryHold\":           \"temporaryHold\",\n\t\"RetentionExpirationTime\": \"retentionExpirationTime\",\n\t\"ACL\":                     \"acl\",\n\t\"Owner\":                   \"owner\",\n\t\"ContentEncoding\":         \"contentEncoding\",\n\t\"ContentDisposition\":      \"contentDisposition\",\n\t\"Size\":                    \"size\",\n\t\"MD5\":                     \"md5Hash\",\n\t\"CRC32C\":                  \"crc32c\",\n\t\"MediaLink\":               \"mediaLink\",\n\t\"Metadata\":                \"metadata\",\n\t\"Generation\":              \"generation\",\n\t\"Metageneration\":          \"metageneration\",\n\t\"StorageClass\":            \"storageClass\",\n\t\"CustomerKeySHA256\":       \"customerEncryption\",\n\t\"KMSKeyName\":              \"kmsKeyName\",\n\t\"Created\":                 \"timeCreated\",\n\t\"Finalized\":               \"timeFinalized\",\n\t\"Deleted\":                 \"timeDeleted\",\n\t\"Updated\":                 \"updated\",\n\t\"Etag\":                    \"etag\",\n\t\"CustomTime\":              \"customTime\",\n\t\"ComponentCount\":          \"componentCount\",\n\t\"Retention\":               \"retention\",\n\t\"HardDeleteTime\":          \"hardDeleteTime\",\n\t\"SoftDeleteTime\":          \"softDeleteTime\",\n}\n\n// attrToProtoFieldMap maps the field names of ObjectAttrs to the underlying field\n// names in the protobuf Object message.\nvar attrToProtoFieldMap = map[string]string{\n\t\"Name\":                    \"name\",\n\t\"Bucket\":                  \"bucket\",\n\t\"Etag\":                    \"etag\",\n\t\"Generation\":              \"generation\",\n\t\"Metageneration\":          \"metageneration\",\n\t\"StorageClass\":            \"storage_class\",\n\t\"Size\":                    \"size\",\n\t\"ContentEncoding\":         \"content_encoding\",\n\t\"ContentDisposition\":      \"content_disposition\",\n\t\"CacheControl\":            \"cache_control\",\n\t\"ACL\":                     \"acl\",\n\t\"ContentLanguage\":         \"content_language\",\n\t\"Deleted\":                 \"delete_time\",\n\t\"ContentType\":             \"content_type\",\n\t\"Created\":                 \"create_time\",\n\t\"Finalized\":               \"finalize_time\",\n\t\"CRC32C\":                  \"checksums.crc32c\",\n\t\"MD5\":                     \"checksums.md5_hash\",\n\t\"Updated\":                 \"update_time\",\n\t\"KMSKeyName\":              \"kms_key\",\n\t\"TemporaryHold\":           \"temporary_hold\",\n\t\"RetentionExpirationTime\": \"retention_expire_time\",\n\t\"Metadata\":                \"metadata\",\n\t\"EventBasedHold\":          \"event_based_hold\",\n\t\"Owner\":                   \"owner\",\n\t\"CustomerKeySHA256\":       \"customer_encryption\",\n\t\"CustomTime\":              \"custom_time\",\n\t\"ComponentCount\":          \"component_count\",\n\t\"HardDeleteTime\":          \"hard_delete_time\",\n\t\"SoftDeleteTime\":          \"soft_delete_time\",\n\t// MediaLink was explicitly excluded from the proto as it is an HTTP-ism.\n\t// \"MediaLink\":               \"mediaLink\",\n\t// TODO: add object retention - b/308194853\n}\n\n// SetAttrSelection makes the query populate only specific attributes of\n// objects. When iterating over objects, if you only need each object's name\n// and size, pass []string{\"Name\", \"Size\"} to this method. Only these fields\n// will be fetched for each object across the network; the other fields of\n// ObjectAttr will remain at their default values. This is a performance\n// optimization; for more information, see\n// https://cloud.google.com/storage/docs/json_api/v1/how-tos/performance\nfunc (q *Query) SetAttrSelection(attrs []string) error {\n\t// Validate selections.\n\tfor _, attr := range attrs {\n\t\t// If the attr is acceptable for one of the two sets, then it is OK.\n\t\t// If it is not acceptable for either, then return an error.\n\t\t// The respective masking implementations ignore unknown attrs which\n\t\t// makes switching between transports a little easier.\n\t\t_, okJSON := attrToFieldMap[attr]\n\t\t_, okGRPC := attrToProtoFieldMap[attr]\n\n\t\tif !okJSON && !okGRPC {\n\t\t\treturn fmt.Errorf(\"storage: attr %v is not valid\", attr)\n\t\t}\n\t}\n\n\tq.attrSelection = attrs\n\n\treturn nil\n}\n\nfunc (q *Query) toFieldSelection() string {\n\tif q == nil || len(q.attrSelection) == 0 {\n\t\treturn \"\"\n\t}\n\tfieldSet := make(map[string]bool)\n\n\tfor _, attr := range q.attrSelection {\n\t\tfield, ok := attrToFieldMap[attr]\n\t\tif !ok {\n\t\t\t// Future proofing, skip unknown fields, let SetAttrSelection handle\n\t\t\t// error modes.\n\t\t\tcontinue\n\t\t}\n\t\tfieldSet[field] = true\n\t}\n\n\tvar s string\n\tif len(fieldSet) > 0 {\n\t\tvar b bytes.Buffer\n\t\tb.WriteString(\"prefixes,items(\")\n\t\tfirst := true\n\t\tfor field := range fieldSet {\n\t\t\tif !first {\n\t\t\t\tb.WriteString(\",\")\n\t\t\t}\n\t\t\tfirst = false\n\t\t\tb.WriteString(field)\n\t\t}\n\t\tb.WriteString(\")\")\n\t\ts = b.String()\n\t}\n\treturn s\n}\n\nfunc (q *Query) toFieldMask() *fieldmaskpb.FieldMask {\n\t// The default behavior with no Query is ProjectionDefault (i.e. ProjectionFull).\n\tif q == nil {\n\t\treturn &fieldmaskpb.FieldMask{Paths: []string{\"*\"}}\n\t}\n\n\t// User selected attributes via q.SetAttrSeleciton. This takes precedence\n\t// over the Projection.\n\tif numSelected := len(q.attrSelection); numSelected > 0 {\n\t\tprotoFieldPaths := make([]string, 0, numSelected)\n\n\t\tfor _, attr := range q.attrSelection {\n\t\t\tpf, ok := attrToProtoFieldMap[attr]\n\t\t\tif !ok {\n\t\t\t\t// Future proofing, skip unknown fields, let SetAttrSelection\n\t\t\t\t// handle error modes.\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tprotoFieldPaths = append(protoFieldPaths, pf)\n\t\t}\n\n\t\treturn &fieldmaskpb.FieldMask{Paths: protoFieldPaths}\n\t}\n\n\t// ProjectDefault == ProjectionFull which means all fields.\n\tfm := &fieldmaskpb.FieldMask{Paths: []string{\"*\"}}\n\tif q.Projection == ProjectionNoACL {\n\t\tpaths := make([]string, 0, len(attrToProtoFieldMap)-2) // omitting two fields\n\t\tfor _, f := range attrToProtoFieldMap {\n\t\t\t// Skip the acl and owner fields for \"NoACL\".\n\t\t\tif f == \"acl\" || f == \"owner\" {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tpaths = append(paths, f)\n\t\t}\n\t\tfm.Paths = paths\n\t}\n\n\treturn fm\n}\n\n// Conditions constrain methods to act on specific generations of\n// objects.\n//\n// The zero value is an empty set of constraints. Not all conditions or\n// combinations of conditions are applicable to all methods.\n// See https://cloud.google.com/storage/docs/generations-preconditions\n// for details on how these operate.\ntype Conditions struct {\n\t// Generation constraints.\n\t// At most one of the following can be set to a non-zero value.\n\n\t// GenerationMatch specifies that the object must have the given generation\n\t// for the operation to occur.\n\t// If GenerationMatch is zero, it has no effect.\n\t// Use DoesNotExist to specify that the object does not exist in the bucket.\n\tGenerationMatch int64\n\n\t// GenerationNotMatch specifies that the object must not have the given\n\t// generation for the operation to occur.\n\t// If GenerationNotMatch is zero, it has no effect.\n\t// This condition only works for object reads if the WithJSONReads client\n\t// option is set.\n\tGenerationNotMatch int64\n\n\t// DoesNotExist specifies that the object must not exist in the bucket for\n\t// the operation to occur.\n\t// If DoesNotExist is false, it has no effect.\n\tDoesNotExist bool\n\n\t// Metadata generation constraints.\n\t// At most one of the following can be set to a non-zero value.\n\n\t// MetagenerationMatch specifies that the object must have the given\n\t// metageneration for the operation to occur.\n\t// If MetagenerationMatch is zero, it has no effect.\n\tMetagenerationMatch int64\n\n\t// MetagenerationNotMatch specifies that the object must not have the given\n\t// metageneration for the operation to occur.\n\t// If MetagenerationNotMatch is zero, it has no effect.\n\t// This condition only works for object reads if the WithJSONReads client\n\t// option is set.\n\tMetagenerationNotMatch int64\n}\n\nfunc (c *Conditions) validate(method string) error {\n\tif *c == (Conditions{}) {\n\t\treturn fmt.Errorf(\"storage: %s: empty conditions\", method)\n\t}\n\tif !c.isGenerationValid() {\n\t\treturn fmt.Errorf(\"storage: %s: multiple conditions specified for generation\", method)\n\t}\n\tif !c.isMetagenerationValid() {\n\t\treturn fmt.Errorf(\"storage: %s: multiple conditions specified for metageneration\", method)\n\t}\n\treturn nil\n}\n\nfunc (c *Conditions) isGenerationValid() bool {\n\tn := 0\n\tif c.GenerationMatch != 0 {\n\t\tn++\n\t}\n\tif c.GenerationNotMatch != 0 {\n\t\tn++\n\t}\n\tif c.DoesNotExist {\n\t\tn++\n\t}\n\treturn n <= 1\n}\n\nfunc (c *Conditions) isMetagenerationValid() bool {\n\treturn c.MetagenerationMatch == 0 || c.MetagenerationNotMatch == 0\n}\n\n// applyConds modifies the provided call using the conditions in conds.\n// call is something that quacks like a *raw.WhateverCall.\nfunc applyConds(method string, gen int64, conds *Conditions, call interface{}) error {\n\tcval := reflect.ValueOf(call)\n\tif gen >= 0 {\n\t\tif !setGeneration(cval, gen) {\n\t\t\treturn fmt.Errorf(\"storage: %s: generation not supported\", method)\n\t\t}\n\t}\n\tif conds == nil {\n\t\treturn nil\n\t}\n\tif err := conds.validate(method); err != nil {\n\t\treturn err\n\t}\n\tswitch {\n\tcase conds.GenerationMatch != 0:\n\t\tif !setIfGenerationMatch(cval, conds.GenerationMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifGenerationMatch not supported\", method)\n\t\t}\n\tcase conds.GenerationNotMatch != 0:\n\t\tif !setIfGenerationNotMatch(cval, conds.GenerationNotMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifGenerationNotMatch not supported\", method)\n\t\t}\n\tcase conds.DoesNotExist:\n\t\tif !setIfGenerationMatch(cval, int64(0)) {\n\t\t\treturn fmt.Errorf(\"storage: %s: DoesNotExist not supported\", method)\n\t\t}\n\t}\n\tswitch {\n\tcase conds.MetagenerationMatch != 0:\n\t\tif !setIfMetagenerationMatch(cval, conds.MetagenerationMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifMetagenerationMatch not supported\", method)\n\t\t}\n\tcase conds.MetagenerationNotMatch != 0:\n\t\tif !setIfMetagenerationNotMatch(cval, conds.MetagenerationNotMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifMetagenerationNotMatch not supported\", method)\n\t\t}\n\t}\n\treturn nil\n}\n\n// applySourceConds modifies the provided call using the conditions in conds.\n// call is something that quacks like a *raw.WhateverCall.\n// This is specifically for calls like Rewrite and Move which have a source and destination\n// object.\nfunc applySourceConds(method string, gen int64, conds *Conditions, call interface{}) error {\n\tcval := reflect.ValueOf(call)\n\tif gen >= 0 {\n\t\tif !setSourceGeneration(cval, gen) {\n\t\t\treturn fmt.Errorf(\"storage: %s: source generation not supported\", method)\n\t\t}\n\t}\n\tif conds == nil {\n\t\treturn nil\n\t}\n\tif err := conds.validate(method); err != nil {\n\t\treturn err\n\t}\n\tswitch {\n\tcase conds.GenerationMatch != 0:\n\t\tif !setIfSourceGenerationMatch(cval, conds.GenerationMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifSourceGenerationMatch not supported\", method)\n\t\t}\n\tcase conds.GenerationNotMatch != 0:\n\t\tif !setIfSourceGenerationNotMatch(cval, conds.GenerationNotMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifSourceGenerationNotMatch not supported\", method)\n\t\t}\n\tcase conds.DoesNotExist:\n\t\tif !setIfSourceGenerationMatch(cval, int64(0)) {\n\t\t\treturn fmt.Errorf(\"storage: %s: DoesNotExist not supported\", method)\n\t\t}\n\t}\n\tswitch {\n\tcase conds.MetagenerationMatch != 0:\n\t\tif !setIfSourceMetagenerationMatch(cval, conds.MetagenerationMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifSourceMetagenerationMatch not supported\", method)\n\t\t}\n\tcase conds.MetagenerationNotMatch != 0:\n\t\tif !setIfSourceMetagenerationNotMatch(cval, conds.MetagenerationNotMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifSourceMetagenerationNotMatch not supported\", method)\n\t\t}\n\t}\n\treturn nil\n}\n\n// applySourceCondsProto validates and attempts to set the conditions on a protobuf\n// message using protobuf reflection. This is specifically for RPCs which have separate\n// preconditions for source and destination objects (e.g. Rewrite and Move).\nfunc applySourceCondsProto(method string, gen int64, conds *Conditions, msg proto.Message) error {\n\trmsg := msg.ProtoReflect()\n\n\tif gen >= 0 {\n\t\tif !setConditionProtoField(rmsg, \"source_generation\", gen) {\n\t\t\treturn fmt.Errorf(\"storage: %s: generation not supported\", method)\n\t\t}\n\t}\n\tif conds == nil {\n\t\treturn nil\n\t}\n\tif err := conds.validate(method); err != nil {\n\t\treturn err\n\t}\n\n\tswitch {\n\tcase conds.GenerationMatch != 0:\n\t\tif !setConditionProtoField(rmsg, \"if_source_generation_match\", conds.GenerationMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifSourceGenerationMatch not supported\", method)\n\t\t}\n\tcase conds.GenerationNotMatch != 0:\n\t\tif !setConditionProtoField(rmsg, \"if_source_generation_not_match\", conds.GenerationNotMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifSourceGenerationNotMatch not supported\", method)\n\t\t}\n\tcase conds.DoesNotExist:\n\t\tif !setConditionProtoField(rmsg, \"if_source_generation_match\", int64(0)) {\n\t\t\treturn fmt.Errorf(\"storage: %s: DoesNotExist not supported\", method)\n\t\t}\n\t}\n\tswitch {\n\tcase conds.MetagenerationMatch != 0:\n\t\tif !setConditionProtoField(rmsg, \"if_source_metageneration_match\", conds.MetagenerationMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifSourceMetagenerationMatch not supported\", method)\n\t\t}\n\tcase conds.MetagenerationNotMatch != 0:\n\t\tif !setConditionProtoField(rmsg, \"if_source_metageneration_not_match\", conds.MetagenerationNotMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifSourceMetagenerationNotMatch not supported\", method)\n\t\t}\n\t}\n\treturn nil\n}\n\n// setGeneration sets Generation on a *raw.WhateverCall.\n// We can't use anonymous interfaces because the return type is\n// different, since the field setters are builders.\n// We also make sure to supply a compile-time constant to MethodByName;\n// otherwise, the Go Linker will disable dead code elimination, leading\n// to larger binaries for all packages that import storage.\nfunc setGeneration(cval reflect.Value, value interface{}) bool {\n\treturn setCondition(cval.MethodByName(\"Generation\"), value)\n}\n\n// setIfGenerationMatch sets IfGenerationMatch on a *raw.WhateverCall.\n// See also setGeneration.\nfunc setIfGenerationMatch(cval reflect.Value, value interface{}) bool {\n\treturn setCondition(cval.MethodByName(\"IfGenerationMatch\"), value)\n}\n\n// setIfGenerationNotMatch sets IfGenerationNotMatch on a *raw.WhateverCall.\n// See also setGeneration.\nfunc setIfGenerationNotMatch(cval reflect.Value, value interface{}) bool {\n\treturn setCondition(cval.MethodByName(\"IfGenerationNotMatch\"), value)\n}\n\n// setIfMetagenerationMatch sets IfMetagenerationMatch on a *raw.WhateverCall.\n// See also setGeneration.\nfunc setIfMetagenerationMatch(cval reflect.Value, value interface{}) bool {\n\treturn setCondition(cval.MethodByName(\"IfMetagenerationMatch\"), value)\n}\n\n// setIfMetagenerationNotMatch sets IfMetagenerationNotMatch on a *raw.WhateverCall.\n// See also setGeneration.\nfunc setIfMetagenerationNotMatch(cval reflect.Value, value interface{}) bool {\n\treturn setCondition(cval.MethodByName(\"IfMetagenerationNotMatch\"), value)\n}\n\n// More methods to set source object precondition fields (used by Rewrite and Move APIs).\nfunc setSourceGeneration(cval reflect.Value, value interface{}) bool {\n\treturn setCondition(cval.MethodByName(\"SourceGeneration\"), value)\n}\n\nfunc setIfSourceGenerationMatch(cval reflect.Value, value interface{}) bool {\n\treturn setCondition(cval.MethodByName(\"IfSourceGenerationMatch\"), value)\n}\n\nfunc setIfSourceGenerationNotMatch(cval reflect.Value, value interface{}) bool {\n\treturn setCondition(cval.MethodByName(\"IfSourceGenerationNotMatch\"), value)\n}\n\nfunc setIfSourceMetagenerationMatch(cval reflect.Value, value interface{}) bool {\n\treturn setCondition(cval.MethodByName(\"IfSourceMetagenerationMatch\"), value)\n}\n\nfunc setIfSourceMetagenerationNotMatch(cval reflect.Value, value interface{}) bool {\n\treturn setCondition(cval.MethodByName(\"IfSourceMetagenerationNotMatch\"), value)\n}\n\nfunc setCondition(setter reflect.Value, value interface{}) bool {\n\tif setter.IsValid() {\n\t\tsetter.Call([]reflect.Value{reflect.ValueOf(value)})\n\t}\n\treturn setter.IsValid()\n}\n\n// Retryer returns an object handle that is configured with custom retry\n// behavior as specified by the options that are passed to it. All operations\n// on the new handle will use the customized retry configuration.\n// These retry options will merge with the bucket's retryer (if set) for the\n// returned handle. Options passed into this method will take precedence over\n// retry options on the bucket and client. Note that you must explicitly pass in\n// each option you want to override.\nfunc (o *ObjectHandle) Retryer(opts ...RetryOption) *ObjectHandle {\n\to2 := *o\n\tvar retry *retryConfig\n\tif o.retry != nil {\n\t\t// merge the options with the existing retry\n\t\tretry = o.retry\n\t} else {\n\t\tretry = &retryConfig{}\n\t}\n\tfor _, opt := range opts {\n\t\topt.apply(retry)\n\t}\n\to2.retry = retry\n\to2.acl.retry = retry\n\treturn &o2\n}\n\n// SetRetry configures the client with custom retry behavior as specified by the\n// options that are passed to it. All operations using this client will use the\n// customized retry configuration.\n// This should be called once before using the client for network operations, as\n// there could be indeterminate behaviour with operations in progress.\n// Retry options set on a bucket or object handle will take precedence over\n// these options.\nfunc (c *Client) SetRetry(opts ...RetryOption) {\n\tvar retry *retryConfig\n\tif c.retry != nil {\n\t\t// merge the options with the existing retry\n\t\tretry = c.retry\n\t} else {\n\t\tretry = &retryConfig{}\n\t}\n\tfor _, opt := range opts {\n\t\topt.apply(retry)\n\t}\n\tc.retry = retry\n}\n\n// RetryOption allows users to configure non-default retry behavior for API\n// calls made to GCS.\ntype RetryOption interface {\n\tapply(config *retryConfig)\n}\n\n// WithBackoff allows configuration of the backoff timing used for retries.\n// Available configuration options (Initial, Max and Multiplier) are described\n// at https://pkg.go.dev/github.com/googleapis/gax-go/v2#Backoff. If any fields\n// are not supplied by the user, gax default values will be used.\nfunc WithBackoff(backoff gax.Backoff) RetryOption {\n\treturn &withBackoff{\n\t\tbackoff: backoff,\n\t}\n}\n\ntype withBackoff struct {\n\tbackoff gax.Backoff\n}\n\nfunc (wb *withBackoff) apply(config *retryConfig) {\n\tconfig.backoff = &wb.backoff\n}\n\n// WithMaxAttempts configures the maximum number of times an API call can be made\n// in the case of retryable errors.\n// For example, if you set WithMaxAttempts(5), the operation will be attempted up to 5\n// times total (initial call plus 4 retries).\n// Without this setting, operations will continue retrying indefinitely\n// until either the context is canceled or a deadline is reached.\nfunc WithMaxAttempts(maxAttempts int) RetryOption {\n\treturn &withMaxAttempts{\n\t\tmaxAttempts: maxAttempts,\n\t}\n}\n\ntype withMaxAttempts struct {\n\tmaxAttempts int\n}\n\nfunc (wb *withMaxAttempts) apply(config *retryConfig) {\n\tconfig.maxAttempts = &wb.maxAttempts\n}\n\n// RetryPolicy describes the available policies for which operations should be\n// retried. The default is `RetryIdempotent`.\ntype RetryPolicy int\n\nconst (\n\t// RetryIdempotent causes only idempotent operations to be retried when the\n\t// service returns a transient error. Using this policy, fully idempotent\n\t// operations (such as `ObjectHandle.Attrs()`) will always be retried.\n\t// Conditionally idempotent operations (for example `ObjectHandle.Update()`)\n\t// will be retried only if the necessary conditions have been supplied (in\n\t// the case of `ObjectHandle.Update()` this would mean supplying a\n\t// `Conditions.MetagenerationMatch` condition is required).\n\tRetryIdempotent RetryPolicy = iota\n\n\t// RetryAlways causes all operations to be retried when the service returns a\n\t// transient error, regardless of idempotency considerations.\n\tRetryAlways\n\n\t// RetryNever causes the client to not perform retries on failed operations.\n\tRetryNever\n)\n\n// WithPolicy allows the configuration of which operations should be performed\n// with retries for transient errors.\nfunc WithPolicy(policy RetryPolicy) RetryOption {\n\treturn &withPolicy{\n\t\tpolicy: policy,\n\t}\n}\n\ntype withPolicy struct {\n\tpolicy RetryPolicy\n}\n\nfunc (ws *withPolicy) apply(config *retryConfig) {\n\tconfig.policy = ws.policy\n}\n\n// WithErrorFunc allows users to pass a custom function to the retryer. Errors\n// will be retried if and only if `shouldRetry(err)` returns true.\n// By default, the following errors are retried (see ShouldRetry for the default\n// function):\n//\n// - HTTP responses with codes 408, 429, 502, 503, and 504.\n//\n// - Transient network errors such as connection reset and io.ErrUnexpectedEOF.\n//\n// - Errors which are considered transient using the Temporary() interface.\n//\n// - Wrapped versions of these errors.\n//\n// This option can be used to retry on a different set of errors than the\n// default. Users can use the default ShouldRetry function inside their custom\n// function if they only want to make minor modifications to default behavior.\nfunc WithErrorFunc(shouldRetry func(err error) bool) RetryOption {\n\treturn &withErrorFunc{\n\t\tshouldRetry: shouldRetry,\n\t}\n}\n\ntype withErrorFunc struct {\n\tshouldRetry func(err error) bool\n}\n\nfunc (wef *withErrorFunc) apply(config *retryConfig) {\n\tconfig.shouldRetry = wef.shouldRetry\n}\n\ntype retryConfig struct {\n\tbackoff     *gax.Backoff\n\tpolicy      RetryPolicy\n\tshouldRetry func(err error) bool\n\tmaxAttempts *int\n\t// maxRetryDuration, if set, specifies a deadline after which the request\n\t// will no longer be retried. A value of 0 allows infinite retries.\n\t// maxRetryDuration is currently only set by Writer.ChunkRetryDeadline.\n\tmaxRetryDuration time.Duration\n}\n\nfunc (r *retryConfig) clone() *retryConfig {\n\tif r == nil {\n\t\treturn nil\n\t}\n\n\tvar bo *gax.Backoff\n\tif r.backoff != nil {\n\t\tbo = &gax.Backoff{\n\t\t\tInitial:    r.backoff.Initial,\n\t\t\tMax:        r.backoff.Max,\n\t\t\tMultiplier: r.backoff.Multiplier,\n\t\t}\n\t}\n\n\treturn &retryConfig{\n\t\tbackoff:          bo,\n\t\tpolicy:           r.policy,\n\t\tshouldRetry:      r.shouldRetry,\n\t\tmaxAttempts:      r.maxAttempts,\n\t\tmaxRetryDuration: r.maxRetryDuration,\n\t}\n}\n\n// composeSourceObj wraps a *raw.ComposeRequestSourceObjects, but adds the methods\n// that modifyCall searches for by name.\ntype composeSourceObj struct {\n\tsrc *raw.ComposeRequestSourceObjects\n}\n\nfunc (c composeSourceObj) Generation(gen int64) {\n\tc.src.Generation = gen\n}\n\nfunc (c composeSourceObj) IfGenerationMatch(gen int64) {\n\t// It's safe to overwrite ObjectPreconditions, since its only field is\n\t// IfGenerationMatch.\n\tc.src.ObjectPreconditions = &raw.ComposeRequestSourceObjectsObjectPreconditions{\n\t\tIfGenerationMatch: gen,\n\t}\n}\n\nfunc setEncryptionHeaders(headers http.Header, key []byte, copySource bool) error {\n\tif key == nil {\n\t\treturn nil\n\t}\n\t// TODO(jbd): Ask the API team to return a more user-friendly error\n\t// and avoid doing this check at the client level.\n\tif len(key) != 32 {\n\t\treturn errors.New(\"storage: not a 32-byte AES-256 key\")\n\t}\n\tvar cs string\n\tif copySource {\n\t\tcs = \"copy-source-\"\n\t}\n\theaders.Set(\"x-goog-\"+cs+\"encryption-algorithm\", aes256Algorithm)\n\theaders.Set(\"x-goog-\"+cs+\"encryption-key\", base64.StdEncoding.EncodeToString(key))\n\tkeyHash := sha256.Sum256(key)\n\theaders.Set(\"x-goog-\"+cs+\"encryption-key-sha256\", base64.StdEncoding.EncodeToString(keyHash[:]))\n\treturn nil\n}\n\n// toProtoCommonObjectRequestParams sets customer-supplied encryption to the proto library's CommonObjectRequestParams.\nfunc toProtoCommonObjectRequestParams(key []byte) *storagepb.CommonObjectRequestParams {\n\tif key == nil {\n\t\treturn nil\n\t}\n\tkeyHash := sha256.Sum256(key)\n\treturn &storagepb.CommonObjectRequestParams{\n\t\tEncryptionAlgorithm:      aes256Algorithm,\n\t\tEncryptionKeyBytes:       key,\n\t\tEncryptionKeySha256Bytes: keyHash[:],\n\t}\n}\n\nfunc toProtoChecksums(sendCRC32C bool, attrs *ObjectAttrs) *storagepb.ObjectChecksums {\n\tvar checksums *storagepb.ObjectChecksums\n\tif sendCRC32C {\n\t\tchecksums = &storagepb.ObjectChecksums{\n\t\t\tCrc32C: proto.Uint32(attrs.CRC32C),\n\t\t}\n\t}\n\tif len(attrs.MD5) != 0 {\n\t\tif checksums == nil {\n\t\t\tchecksums = &storagepb.ObjectChecksums{\n\t\t\t\tMd5Hash: attrs.MD5,\n\t\t\t}\n\t\t} else {\n\t\t\tchecksums.Md5Hash = attrs.MD5\n\t\t}\n\t}\n\treturn checksums\n}\n\n// ServiceAccount fetches the email address of the given project's Google Cloud Storage service account.\n// Note: gRPC is not supported.\nfunc (c *Client) ServiceAccount(ctx context.Context, projectID string) (string, error) {\n\to := makeStorageOpts(true, c.retry, \"\")\n\treturn c.tc.GetServiceAccount(ctx, projectID, o...)\n}\n\n// bucketResourceName formats the given project ID and bucketResourceName ID\n// into a Bucket resource name. This is the format necessary for the gRPC API as\n// it conforms to the Resource-oriented design practices in https://google.aip.dev/121.\nfunc bucketResourceName(p, b string) string {\n\treturn fmt.Sprintf(\"projects/%s/buckets/%s\", p, b)\n}\n\n// parseBucketName strips the leading resource path segment and returns the\n// bucket ID, which is the simple Bucket name typical of the v1 API.\nfunc parseBucketName(b string) string {\n\tsep := strings.LastIndex(b, \"/\")\n\treturn b[sep+1:]\n}\n\n// parseProjectNumber consume the given resource name and parses out the project\n// number if one is present i.e. it is not a project ID.\nfunc parseProjectNumber(r string) uint64 {\n\tprojectID := regexp.MustCompile(`projects\\/([0-9]+)\\/?`)\n\tif matches := projectID.FindStringSubmatch(r); len(matches) > 0 {\n\t\t// Capture group follows the matched segment. For example:\n\t\t// input: projects/123/bars/456\n\t\t// output: [projects/123/, 123]\n\t\tnumber, err := strconv.ParseUint(matches[1], 10, 64)\n\t\tif err != nil {\n\t\t\treturn 0\n\t\t}\n\t\treturn number\n\t}\n\n\treturn 0\n}\n\n// toProjectResource accepts a project ID and formats it as a Project resource\n// name.\nfunc toProjectResource(project string) string {\n\treturn fmt.Sprintf(\"projects/%s\", project)\n}\n\n// setConditionProtoField uses protobuf reflection to set named condition field\n// to the given condition value if supported on the protobuf message.\nfunc setConditionProtoField(m protoreflect.Message, f string, v int64) bool {\n\tfields := m.Descriptor().Fields()\n\tif rf := fields.ByName(protoreflect.Name(f)); rf != nil {\n\t\tm.Set(rf, protoreflect.ValueOfInt64(v))\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// applyCondsProto validates and attempts to set the conditions on a protobuf\n// message using protobuf reflection.\nfunc applyCondsProto(method string, gen int64, conds *Conditions, msg proto.Message) error {\n\trmsg := msg.ProtoReflect()\n\n\tif gen >= 0 {\n\t\tif !setConditionProtoField(rmsg, \"generation\", gen) {\n\t\t\treturn fmt.Errorf(\"storage: %s: generation not supported\", method)\n\t\t}\n\t}\n\tif conds == nil {\n\t\treturn nil\n\t}\n\tif err := conds.validate(method); err != nil {\n\t\treturn err\n\t}\n\n\tswitch {\n\tcase conds.GenerationMatch != 0:\n\t\tif !setConditionProtoField(rmsg, \"if_generation_match\", conds.GenerationMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifGenerationMatch not supported\", method)\n\t\t}\n\tcase conds.GenerationNotMatch != 0:\n\t\tif !setConditionProtoField(rmsg, \"if_generation_not_match\", conds.GenerationNotMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifGenerationNotMatch not supported\", method)\n\t\t}\n\tcase conds.DoesNotExist:\n\t\tif !setConditionProtoField(rmsg, \"if_generation_match\", int64(0)) {\n\t\t\treturn fmt.Errorf(\"storage: %s: DoesNotExist not supported\", method)\n\t\t}\n\t}\n\tswitch {\n\tcase conds.MetagenerationMatch != 0:\n\t\tif !setConditionProtoField(rmsg, \"if_metageneration_match\", conds.MetagenerationMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifMetagenerationMatch not supported\", method)\n\t\t}\n\tcase conds.MetagenerationNotMatch != 0:\n\t\tif !setConditionProtoField(rmsg, \"if_metageneration_not_match\", conds.MetagenerationNotMatch) {\n\t\t\treturn fmt.Errorf(\"storage: %s: ifMetagenerationNotMatch not supported\", method)\n\t\t}\n\t}\n\treturn nil\n}\n\n// formatObjectErr checks if the provided error is NotFound and if so, wraps\n// it in an ErrObjectNotExist error. If not, formatObjectErr has no effect.\nfunc formatObjectErr(err error) error {\n\tvar e *googleapi.Error\n\tif s, ok := status.FromError(err); (ok && s.Code() == codes.NotFound) ||\n\t\t(errors.As(err, &e) && e.Code == http.StatusNotFound) {\n\t\treturn fmt.Errorf(\"%w: %w\", ErrObjectNotExist, err)\n\t}\n\treturn err\n}\n\n// formatBucketError checks if the provided error is NotFound and if so, wraps\n// it in an ErrBucketNotExist error. If not, formatBucketError has no effect.\nfunc formatBucketError(err error) error {\n\tvar e *googleapi.Error\n\tif s, ok := status.FromError(err); (ok && s.Code() == codes.NotFound) ||\n\t\t(errors.As(err, &e) && e.Code == http.StatusNotFound) {\n\t\treturn fmt.Errorf(\"%w: %w\", ErrBucketNotExist, err)\n\t}\n\treturn err\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/storage.replay",
    "content": "{\n  \"Initial\": \"IjIwMTktMDUtMDJUMjI6MjM6NTMuNDAzNDMyMDEzWiI=\",\n  \"Version\": \"0.2\",\n  \"Converter\": {\n    \"ClearHeaders\": [\n      \"^X-Goog-.*Encryption-Key$\"\n    ],\n    \"RemoveRequestHeaders\": [\n      \"^Authorization$\",\n      \"^Proxy-Authorization$\",\n      \"^Connection$\",\n      \"^Content-Type$\",\n      \"^Date$\",\n      \"^Host$\",\n      \"^Transfer-Encoding$\",\n      \"^Via$\",\n      \"^X-Forwarded-.*$\",\n      \"^X-Cloud-Trace-Context$\",\n      \"^X-Goog-Api-Client$\",\n      \"^X-Google-.*$\",\n      \"^X-Gfe-.*$\"\n    ],\n    \"RemoveResponseHeaders\": [\n      \"^X-Google-.*$\",\n      \"^X-Gfe-.*$\"\n    ],\n    \"ClearParams\": null,\n    \"RemoveParams\": null\n  },\n  \"Entries\": [\n    {\n      \"ID\": \"f5f231bed6e14b7f\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"60\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIn0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"485\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:23:54 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrZvgYBWgsCwPaGI9bo1ccC0WCBc8kJgydTwioDtXR9xps4HiDoKXI-vjYUl876SMqF0JhmhaEBgvxrIL9Y989YCFrH65xGys_r1JbPdi9M9N0kS3M\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1NC42MTBaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"9a9914424ef59619\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"60\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAyIn0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"485\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:23:55 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqFvRYrCleVqpn0QshSvzW5I1-8o7N6vGYh8o5G1f-AHnsX2N_x-NKJrvlxnXqm9auw5gMoWFaJTSTtKL5y85WlQ_eAjmmlrkD4tbHYBZJ386xgaZw\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU1LjEwOVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1NS4xMDlaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"17f2abbdd781a33b\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0002?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2431\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:23:55 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:23:55 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoYoTmTG5mxpFGPvmECUTlGMlQwhfmqGsZtBtZ9xV89Pw3q-p5BBeX_3imdofr_7EBT7nBm4v5alpg45Zi8a8ET28qBH2xfNe4n15HR-1fhGou2wQU\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU1LjEwOVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1NS4xMDlaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"6752f5a9a036af11\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0002?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:23:56 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur4bFsk4ylv96GsTkuDKG--hVaCR_UEhZ_fAzMGt5Eu5ZKncHOLjU_f2PcNP9saFGW-UkH9jXwt_nuR0G2zXOBjMJmLdd7Ml61bGMMrJeVa0OtcGpM\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"9c25646df7aacad9\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"543\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJsYWJlbHMiOnsiZW1wdHkiOiIiLCJsMSI6InYxIn0sImxpZmVjeWNsZSI6eyJydWxlIjpbeyJhY3Rpb24iOnsic3RvcmFnZUNsYXNzIjoiTkVBUkxJTkUiLCJ0eXBlIjoiU2V0U3RvcmFnZUNsYXNzIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjEwLCJjcmVhdGVkQmVmb3JlIjoiMjAxNy0wMS0wMSIsImlzTGl2ZSI6ZmFsc2UsIm1hdGNoZXNTdG9yYWdlQ2xhc3MiOlsiTVVMVElfUkVHSU9OQUwiLCJTVEFOREFSRCJdLCJudW1OZXdlclZlcnNpb25zIjozfX0seyJhY3Rpb24iOnsidHlwZSI6IkRlbGV0ZSJ9LCJjb25kaXRpb24iOnsiYWdlIjozMCwiY3JlYXRlZEJlZm9yZSI6IjIwMTctMDEtMDEiLCJpc0xpdmUiOnRydWUsIm1hdGNoZXNTdG9yYWdlQ2xhc3MiOlsiTkVBUkxJTkUiXSwibnVtTmV3ZXJWZXJzaW9ucyI6MTB9fV19LCJsb2NhdGlvbiI6IlVTIiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsInN0b3JhZ2VDbGFzcyI6Ik5FQVJMSU5FIiwidmVyc2lvbmluZyI6eyJlbmFibGVkIjp0cnVlfX0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"926\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:23:56 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uq6CjN9PjjzT3LmHxW_tU_ciQ1rahetoQGbX_gX8EC5il7tPJi2yxi5VZxnDNrp1h14b7Ix8tnvtkHufAyO1-lMRutdHK5GSzonff78Nm6KPAKN5fU\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU2LjQwOVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1Ni40MDlaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOnRydWV9LCJsaWZlY3ljbGUiOnsicnVsZSI6W3siYWN0aW9uIjp7InR5cGUiOiJTZXRTdG9yYWdlQ2xhc3MiLCJzdG9yYWdlQ2xhc3MiOiJORUFSTElORSJ9LCJjb25kaXRpb24iOnsiYWdlIjoxMCwiY3JlYXRlZEJlZm9yZSI6IjIwMTctMDEtMDEiLCJpc0xpdmUiOmZhbHNlLCJtYXRjaGVzU3RvcmFnZUNsYXNzIjpbIk1VTFRJX1JFR0lPTkFMIiwiU1RBTkRBUkQiXSwibnVtTmV3ZXJWZXJzaW9ucyI6M319LHsiYWN0aW9uIjp7InR5cGUiOiJEZWxldGUifSwiY29uZGl0aW9uIjp7ImFnZSI6MzAsImNyZWF0ZWRCZWZvcmUiOiIyMDE3LTAxLTAxIiwiaXNMaXZlIjp0cnVlLCJtYXRjaGVzU3RvcmFnZUNsYXNzIjpbIk5FQVJMSU5FIl0sIm51bU5ld2VyVmVyc2lvbnMiOjEwfX1dfSwibGFiZWxzIjp7ImwxIjoidjEiLCJlbXB0eSI6IiJ9LCJzdG9yYWdlQ2xhc3MiOiJORUFSTElORSIsImV0YWciOiJDQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"f795b9adcb1b546e\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0002?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2872\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:23:56 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:23:56 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Up2-mWQyRDbFSpF6U96vQpaBYr74NgiUWh3-KZnLWaFYnhQti1tgKWNtL15YgK8blaRSnzGeACPA6jNuM34yhr7bxztrdN2tobEQAzD5RVgzpqx14w\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU2LjQwOVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1Ni40MDlaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInZlcnNpb25pbmciOnsiZW5hYmxlZCI6dHJ1ZX0sImxpZmVjeWNsZSI6eyJydWxlIjpbeyJhY3Rpb24iOnsidHlwZSI6IlNldFN0b3JhZ2VDbGFzcyIsInN0b3JhZ2VDbGFzcyI6Ik5FQVJMSU5FIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjEwLCJjcmVhdGVkQmVmb3JlIjoiMjAxNy0wMS0wMSIsImlzTGl2ZSI6ZmFsc2UsIm1hdGNoZXNTdG9yYWdlQ2xhc3MiOlsiTVVMVElfUkVHSU9OQUwiLCJTVEFOREFSRCJdLCJudW1OZXdlclZlcnNpb25zIjozfX0seyJhY3Rpb24iOnsidHlwZSI6IkRlbGV0ZSJ9LCJjb25kaXRpb24iOnsiYWdlIjozMCwiY3JlYXRlZEJlZm9yZSI6IjIwMTctMDEtMDEiLCJpc0xpdmUiOnRydWUsIm1hdGNoZXNTdG9yYWdlQ2xhc3MiOlsiTkVBUkxJTkUiXSwibnVtTmV3ZXJWZXJzaW9ucyI6MTB9fV19LCJsYWJlbHMiOnsibDEiOiJ2MSIsImVtcHR5IjoiIn0sInN0b3JhZ2VDbGFzcyI6Ik5FQVJMSU5FIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"2ee3f84c4e4045fb\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0002?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:23:57 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UplJEr-Hxa3hDFT5ozLEHYhHfaxlYFpc9Vwm8AL831-w_7BBgxHjjEsU8Br_uLnLes0h9hz37iuE9V8uVZ2liHY7ZD4piNH31oyapjCtwyXrukIP94\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"16f19dbf8e206756\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2431\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:23:57 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:23:57 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqvp5XjvB8nhNuz-bTeN9OklTfiBGldYKkcY13JF6oUfpV0z_jwoEQD3B3Ss3wWpaSmZfePjo7fkkr-hP3jbrUazNHaqQliiHqOBSNmSoPmwJpzfOI\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1NC42MTBaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"949f5ce411d6f672\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"3\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"e30K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2431\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:23:58 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpVeVcmmuUyOt3Hbja89_Ewi6GRsJtRduqK93OT4Ys1aK5GqDWeGxyDbczUyRLeUYvZgtJzYLwVOOUszqAF4ipSXgZ1L_byd9cJ7ttVfQ_ceQBXxY4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1NC42MTBaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"b75303fbdafb66d0\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"64\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJsYWJlbHMiOnsiZW1wdHkiOiIiLCJsMSI6InYxIn0sInZlcnNpb25pbmciOnsiZW5hYmxlZCI6dHJ1ZX19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2493\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:23:58 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqDnNlC3m95GplHjE79aqzhtwgfJCWQjHaCFG4i7qmTFliz2gdE4OiOnKAPIoNqxEngE35065YXNYA65aMSSeEluDKmQ__rJXcS_DpRdoYP4rZIyPo\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1OC40MzZaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInZlcnNpb25pbmciOnsiZW5hYmxlZCI6dHJ1ZX0sImxhYmVscyI6eyJlbXB0eSI6IiIsImwxIjoidjEifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FJPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"831805b62d969707\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"93\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJsYWJlbHMiOnsiYWJzZW50IjpudWxsLCJlbXB0eSI6bnVsbCwibDEiOiJ2MiIsIm5ldyI6Im5ldyJ9LCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOmZhbHNlfX0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2495\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:23:59 GMT\"\n          ],\n          \"Etag\": [\n            \"CAM=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uq8yNb3V9Kq8zPa_pdVrJIYv83v4fu6xAHwktfTz_Cy4K1rpi8xrDzYmw5wICaazfMcAiYPhM8r4Y6WkeOyeCRInvkJ6ndduhNN_dgu1U59uI5F3Qc\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1OS4wMzJaIiwibWV0YWdlbmVyYXRpb24iOiIzIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FNPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQU09In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBTT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInZlcnNpb25pbmciOnsiZW5hYmxlZCI6ZmFsc2V9LCJsYWJlbHMiOnsibDEiOiJ2MiIsIm5ldyI6Im5ldyJ9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQU09In0=\"\n      }\n    },\n    {\n      \"ID\": \"8a816d061fe9e7e0\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"77\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJsaWZlY3ljbGUiOnsicnVsZSI6W3siYWN0aW9uIjp7InR5cGUiOiJEZWxldGUifSwiY29uZGl0aW9uIjp7ImFnZSI6MzB9fV19fQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2570\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:23:59 GMT\"\n          ],\n          \"Etag\": [\n            \"CAQ=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrbjywEmDPkqxln7-Nx_8ngRxoWvncfCx1fGVpPZGEjjmg8OJgv0uaczxapjlNeEcvMnqWI_RVzG6_588QaO8nCnPVnE2kkIek3D_t6UNL9CCPYLRc\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1OS41MzBaIiwibWV0YWdlbmVyYXRpb24iOiI0IiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FRPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQVE9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQVE9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBUT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQVE9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBUT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInZlcnNpb25pbmciOnsiZW5hYmxlZCI6ZmFsc2V9LCJsaWZlY3ljbGUiOnsicnVsZSI6W3siYWN0aW9uIjp7InR5cGUiOiJEZWxldGUifSwiY29uZGl0aW9uIjp7ImFnZSI6MzB9fV19LCJsYWJlbHMiOnsibDEiOiJ2MiIsIm5ldyI6Im5ldyJ9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQVE9In0=\"\n      }\n    },\n    {\n      \"ID\": \"6a60397ebae323e7\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoiYnVja2V0UG9saWN5T25seSJ9Cg==\",\n          \"dGVzdA==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3305\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:00 GMT\"\n          ],\n          \"Etag\": [\n            \"CPmu4bnx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UokOvJnDKKHAQOa8mJLrxFpWWvQ2U_BC_3uI0Z4x870Q068evHio_t_YudbSq614h77-ofhBsyHpoknWnm_YrnXxkHzopreKoMBykFIcbsSB8TDKEE\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRQb2xpY3lPbmx5LzE1NTY4MzU4NDAwNTUxNjEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9idWNrZXRQb2xpY3lPbmx5IiwibmFtZSI6ImJ1Y2tldFBvbGljeU9ubHkiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0MDA1NTE2MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowMC4wNTRaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDAuMDU0WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjAwLjA1NFoiLCJzaXplIjoiNCIsIm1kNUhhc2giOiJDWTlyelVZaDAzUEszazZESmllMDlnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYnVja2V0UG9saWN5T25seT9nZW5lcmF0aW9uPTE1NTY4MzU4NDAwNTUxNjEmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS8xNTU2ODM1ODQwMDU1MTYxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2J1Y2tldFBvbGljeU9ubHkvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImJ1Y2tldFBvbGljeU9ubHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0MDA1NTE2MSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDUG11NGJueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS8xNTU2ODM1ODQwMDU1MTYxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9idWNrZXRQb2xpY3lPbmx5L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYnVja2V0UG9saWN5T25seSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQwMDU1MTYxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ1BtdTRibngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2J1Y2tldFBvbGljeU9ubHkvMTU1NjgzNTg0MDA1NTE2MS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYnVja2V0UG9saWN5T25seS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImJ1Y2tldFBvbGljeU9ubHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0MDA1NTE2MSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDUG11NGJueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS8xNTU2ODM1ODQwMDU1MTYxL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9idWNrZXRQb2xpY3lPbmx5L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYnVja2V0UG9saWN5T25seSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQwMDU1MTYxIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ1BtdTRibngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJocUJ5d0E9PSIsImV0YWciOiJDUG11NGJueC9lRUNFQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"32d392d1da32f27b\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/bucketPolicyOnly/acl/user-test%40example.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"111\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJ1c2VyLXRlc3RAZXhhbXBsZS5jb20iLCJyb2xlIjoiUkVBREVSIn0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"519\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:00 GMT\"\n          ],\n          \"Etag\": [\n            \"CPmu4bnx/eECEAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uoau0xgFp6ib5wM0bBWjRlklvDRPOu0VZ-LFCeENUWXutmkXSfgUbtr2Nuefb7Pm_yLvCNqtB9B6k_N1V7AlvkN4_JEz67ZSXQ_sAD5L1teQIpGiqA\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS8xNTU2ODM1ODQwMDU1MTYxL3VzZXItdGVzdEBleGFtcGxlLmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2J1Y2tldFBvbGljeU9ubHkvYWNsL3VzZXItdGVzdEBleGFtcGxlLmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImJ1Y2tldFBvbGljeU9ubHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0MDA1NTE2MSIsImVudGl0eSI6InVzZXItdGVzdEBleGFtcGxlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJlbWFpbCI6InRlc3RAZXhhbXBsZS5jb20iLCJldGFnIjoiQ1BtdTRibngvZUVDRUFJPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"6e3d0eda38a3ab6e\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"59\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6dHJ1ZX19fQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"663\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:01 GMT\"\n          ],\n          \"Etag\": [\n            \"CAU=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpSPFJHLzusxOr_OvhStJlWEpOs2EuthMO0Ys6pS9bsQeP0fthp_VUZfa8_sN8TX6PJYpxIdFlxB2QUaIujot1cUrssoU74XFrAwoqhlmiE5y9Aw-w\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowMS4yNDJaIiwibWV0YWdlbmVyYXRpb24iOiI1IiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOnRydWUsImxvY2tlZFRpbWUiOiIyMDE5LTA3LTMxVDIyOjI0OjAxLjIzMFoifX0sImxvY2F0aW9uIjoiVVMiLCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOmZhbHNlfSwibGlmZWN5Y2xlIjp7InJ1bGUiOlt7ImFjdGlvbiI6eyJ0eXBlIjoiRGVsZXRlIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjMwfX1dfSwibGFiZWxzIjp7ImwxIjoidjIiLCJuZXciOiJuZXcifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FVPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"8f8dbb687dc49edb\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/acl?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"13230\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:01 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:01 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpGpW2zLlN7nAgV5IVkKU3kx4QWHCkzAgMa-QPC1PyCol8CP9W605bMUmFMeerbR4enzmeNMvtb4a2HzBPUZ296YfGdtkt_6Guq82E226xzC5TPq4w\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImludmFsaWQiLCJtZXNzYWdlIjoiQ2Fubm90IGdldCBsZWdhY3kgQUNMcyBmb3IgYSBidWNrZXQgdGhhdCBoYXMgZW5hYmxlZCBCdWNrZXQgUG9saWN5IE9ubHkuIFJlYWQgbW9yZSBhdCBodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vc3RvcmFnZS9kb2NzL2J1Y2tldC1wb2xpY3ktb25seS4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6SU5WQUxJRF9SRVFVRVNUX0ZPUl9CVUNLRVRfUE9MSUNZX09OTFlfUkVTT1VSQ0U6IENhbm5vdCBnZXQgbGVnYWN5IEFDTHMgZm9yIGEgYnVja2V0IHRoYXQgaGFzIGVuYWJsZWQgQnVja2V0IFBvbGljeSBPbmx5LiBSZWFkIG1vcmUgYXQgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9idWNrZXQtcG9saWN5LW9ubHkuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjEwMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5saXN0KEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6ODkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENhbm5vdCBnZXQgbGVnYWN5IEFDTHMgZm9yIGEgYnVja2V0IHRoYXQgaGFzIGVuYWJsZWQgQnVja2V0IFBvbGljeSBPbmx5LiBSZWFkIG1vcmUgYXQgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9idWNrZXQtcG9saWN5LW9ubHkuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUlOVkFMSURfVkFMVUUsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6SU5WQUxJRF9SRVFVRVNUX0ZPUl9CVUNLRVRfUE9MSUNZX09OTFlfUkVTT1VSQ0U6IENhbm5vdCBnZXQgbGVnYWN5IEFDTHMgZm9yIGEgYnVja2V0IHRoYXQgaGFzIGVuYWJsZWQgQnVja2V0IFBvbGljeSBPbmx5LiBSZWFkIG1vcmUgYXQgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9idWNrZXQtcG9saWN5LW9ubHkuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjEwMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5saXN0KEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6ODkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENhbm5vdCBnZXQgbGVnYWN5IEFDTHMgZm9yIGEgYnVja2V0IHRoYXQgaGFzIGVuYWJsZWQgQnVja2V0IFBvbGljeSBPbmx5LiBSZWFkIG1vcmUgYXQgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9idWNrZXQtcG9saWN5LW9ubHkuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWJhZFJlcXVlc3QsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLklOVkFMSURfVkFMVUUsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpJTlZBTElEX1JFUVVFU1RfRk9SX0JVQ0tFVF9QT0xJQ1lfT05MWV9SRVNPVVJDRTogQ2Fubm90IGdldCBsZWdhY3kgQUNMcyBmb3IgYSBidWNrZXQgdGhhdCBoYXMgZW5hYmxlZCBCdWNrZXQgUG9saWN5IE9ubHkuIFJlYWQgbW9yZSBhdCBodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vc3RvcmFnZS9kb2NzL2J1Y2tldC1wb2xpY3ktb25seS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MTAxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmxpc3QoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YTo4OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ2Fubm90IGdldCBsZWdhY3kgQUNMcyBmb3IgYSBidWNrZXQgdGhhdCBoYXMgZW5hYmxlZCBCdWNrZXQgUG9saWN5IE9ubHkuIFJlYWQgbW9yZSBhdCBodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vc3RvcmFnZS9kb2NzL2J1Y2tldC1wb2xpY3ktb25seS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1JTlZBTElEX1ZBTFVFLCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9Q2Fubm90IGdldCBsZWdhY3kgQUNMcyBmb3IgYSBidWNrZXQgdGhhdCBoYXMgZW5hYmxlZCBCdWNrZXQgUG9saWN5IE9ubHkuIFJlYWQgbW9yZSBhdCBodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vc3RvcmFnZS9kb2NzL2J1Y2tldC1wb2xpY3ktb25seS4sIHVubmFtZWRBcmd1bWVudHM9W119LCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPUNhbm5vdCBnZXQgbGVnYWN5IEFDTHMgZm9yIGEgYnVja2V0IHRoYXQgaGFzIGVuYWJsZWQgQnVja2V0IFBvbGljeSBPbmx5LiBSZWFkIG1vcmUgYXQgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9idWNrZXQtcG9saWN5LW9ubHkuLCByZWFzb249aW52YWxpZCwgcnBjQ29kZT00MDB9IENhbm5vdCBnZXQgbGVnYWN5IEFDTHMgZm9yIGEgYnVja2V0IHRoYXQgaGFzIGVuYWJsZWQgQnVja2V0IFBvbGljeSBPbmx5LiBSZWFkIG1vcmUgYXQgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9idWNrZXQtcG9saWN5LW9ubHkuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6SU5WQUxJRF9SRVFVRVNUX0ZPUl9CVUNLRVRfUE9MSUNZX09OTFlfUkVTT1VSQ0U6IENhbm5vdCBnZXQgbGVnYWN5IEFDTHMgZm9yIGEgYnVja2V0IHRoYXQgaGFzIGVuYWJsZWQgQnVja2V0IFBvbGljeSBPbmx5LiBSZWFkIG1vcmUgYXQgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9idWNrZXQtcG9saWN5LW9ubHkuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjEwMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5saXN0KEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6ODkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENhbm5vdCBnZXQgbGVnYWN5IEFDTHMgZm9yIGEgYnVja2V0IHRoYXQgaGFzIGVuYWJsZWQgQnVja2V0IFBvbGljeSBPbmx5LiBSZWFkIG1vcmUgYXQgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9idWNrZXQtcG9saWN5LW9ubHkuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMCwibWVzc2FnZSI6IkNhbm5vdCBnZXQgbGVnYWN5IEFDTHMgZm9yIGEgYnVja2V0IHRoYXQgaGFzIGVuYWJsZWQgQnVja2V0IFBvbGljeSBPbmx5LiBSZWFkIG1vcmUgYXQgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9idWNrZXQtcG9saWN5LW9ubHkuIn19\"\n      }\n    },\n    {\n      \"ID\": \"42ce6421b2c9fae4\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/bucketPolicyOnly/acl?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"13358\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:02 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:02 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqJwxja3nYzWYbg_I5gWvOiow2ORuo8tNA-_Vzw7DX_YVhhb6_p1giUk3WjUHWt-lyDA13adhPGi4BDfIXzQyf-ZL3lsHoa2sNm29BIqRznw4mkAdE\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5nZXQgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRQb2xpY3lPbmx5LiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5nZXQgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRQb2xpY3lPbmx5LlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5nZXQgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRQb2xpY3lPbmx5LlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1GT1JCSURERU4sIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNDRVNTX0RFTklFRDogYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuZ2V0IGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MTAxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmxpc3QoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YTo4OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuZ2V0IGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9Zm9yYmlkZGVuLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5GT1JCSURERU4sIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5nZXQgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRQb2xpY3lPbmx5LlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5nZXQgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRQb2xpY3lPbmx5LlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmdldCBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2J1Y2tldFBvbGljeU9ubHkuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5nZXQgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRQb2xpY3lPbmx5LiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmdldCBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2J1Y2tldFBvbGljeU9ubHkuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNDRVNTX0RFTklFRDogYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuZ2V0IGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MTAxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmxpc3QoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YTo4OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuZ2V0IGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDAzLCJtZXNzYWdlIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuZ2V0IGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS4ifX0=\"\n      }\n    },\n    {\n      \"ID\": \"0ca0bddf513110f4\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"45\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnt9fX0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"624\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:02 GMT\"\n          ],\n          \"Etag\": [\n            \"CAY=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpdDWPDU9-gPzHEieE0Rqx_40yf8fJLhwAP6fVsdS4F7I7sWj0h-Ti7VoDWciZgI_lgNUB7qyh08wjTAxrTLTsSiIYt2GR6ksxhDRupMoPWni5kXmE\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowMi4zNjFaIiwibWV0YWdlbmVyYXRpb24iOiI2IiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOmZhbHNlfSwibGlmZWN5Y2xlIjp7InJ1bGUiOlt7ImFjdGlvbiI6eyJ0eXBlIjoiRGVsZXRlIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjMwfX1dfSwibGFiZWxzIjp7ImwxIjoidjIiLCJuZXciOiJuZXcifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FZPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"8a8bee740102593d\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/bucketPolicyOnly/acl?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2964\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:02 GMT\"\n          ],\n          \"Etag\": [\n            \"CPmu4bnx/eECEAI=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:02 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uq59Mf8Ea4fgpDnUzupeIP3bGt3VpyI6HjL4KJtDKAD_h-Ua-AJSX3u3x4TCsx2MZcIVhMs9pW9SWsrIcsvsr3kGt2Je9W87LElbN5dlw02EItBcR4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS8xNTU2ODM1ODQwMDU1MTYxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2J1Y2tldFBvbGljeU9ubHkvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImJ1Y2tldFBvbGljeU9ubHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0MDA1NTE2MSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDUG11NGJueC9lRUNFQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS8xNTU2ODM1ODQwMDU1MTYxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9idWNrZXRQb2xpY3lPbmx5L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYnVja2V0UG9saWN5T25seSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQwMDU1MTYxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ1BtdTRibngvZUVDRUFJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2J1Y2tldFBvbGljeU9ubHkvMTU1NjgzNTg0MDA1NTE2MS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYnVja2V0UG9saWN5T25seS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImJ1Y2tldFBvbGljeU9ubHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0MDA1NTE2MSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDUG11NGJueC9lRUNFQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS8xNTU2ODM1ODQwMDU1MTYxL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9idWNrZXRQb2xpY3lPbmx5L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYnVja2V0UG9saWN5T25seSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQwMDU1MTYxIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ1BtdTRibngvZUVDRUFJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2J1Y2tldFBvbGljeU9ubHkvMTU1NjgzNTg0MDA1NTE2MS91c2VyLXRlc3RAZXhhbXBsZS5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9idWNrZXRQb2xpY3lPbmx5L2FjbC91c2VyLXRlc3RAZXhhbXBsZS5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJidWNrZXRQb2xpY3lPbmx5IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDAwNTUxNjEiLCJlbnRpdHkiOiJ1c2VyLXRlc3RAZXhhbXBsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZW1haWwiOiJ0ZXN0QGV4YW1wbGUuY29tIiwiZXRhZyI6IkNQbXU0Ym54L2VFQ0VBST0ifV19\"\n      }\n    },\n    {\n      \"ID\": \"91ba2c22c5f5de9a\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/bucketPolicyOnly?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:03 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrwotKay181GHzZsWfp6BzJA4FDOIfK2s1WlzB9p8QsIEX42AtvMhkgLWqSIyEhb-MSv9snqx0WRwUs5sDN3_5NVoFTzQeLkDBR9mbsixI-udc8SLI\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"43fec6c3a8c8cb63\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoiY29uZGRlbCJ9Cg==\",\n          \"Zm9v\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3161\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:03 GMT\"\n          ],\n          \"Etag\": [\n            \"CNHLq7vx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrrYnzZRz4GFV3BsHoF-vv9v2Lc13Wp6-P5iowSZFjqyykVhYZ6CkesIVxA2v2xNCbVeWgCBXCFFt9fje73cis1cECwwqrYLr5QF5bZCy4TsJ-LT8k\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb25kZGVsLzE1NTY4MzU4NDMzNjg0MDEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb25kZGVsIiwibmFtZSI6ImNvbmRkZWwiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0MzM2ODQwMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowMy4zNjhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDMuMzY4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjAzLjM2OFoiLCJzaXplIjoiMyIsIm1kNUhhc2giOiJyTDBZMjB6QytGenQ3MlZQek1TazJBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29uZGRlbD9nZW5lcmF0aW9uPTE1NTY4MzU4NDMzNjg0MDEmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29uZGRlbC8xNTU2ODM1ODQzMzY4NDAxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbmRkZWwvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbmRkZWwiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0MzM2ODQwMSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTkhMcTd2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29uZGRlbC8xNTU2ODM1ODQzMzY4NDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb25kZGVsL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29uZGRlbCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQzMzY4NDAxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ05ITHE3dngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbmRkZWwvMTU1NjgzNTg0MzM2ODQwMS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29uZGRlbC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbmRkZWwiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0MzM2ODQwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTkhMcTd2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29uZGRlbC8xNTU2ODM1ODQzMzY4NDAxL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb25kZGVsL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29uZGRlbCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQzMzY4NDAxIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ05ITHE3dngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJ6OFN1SFE9PSIsImV0YWciOiJDTkhMcTd2eC9lRUNFQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"ba03d9efb1402903\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/conddel?alt=json\\u0026generation=1556835843368400\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 404,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"12249\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:03 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:03 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur-mcvaL-eBgBoviwBg_r8LyEEK3JNyFaj0cFy2neOMo1pVkWpkGQ-3gz8vQNtAGoX-Q7_CMYLNv_I0pOoy5iRr-MdYKny5ICdC1s3ji5DwL7sqmn0\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29uZGRlbCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpPQkpFQ1RfTk9UX0ZPVU5EOiBObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbmRkZWxcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YTo4OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZGVsZXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IE5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29uZGRlbFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1OT1RfRk9VTkQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6T0JKRUNUX05PVF9GT1VORDogTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb25kZGVsXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6ODgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmRlbGV0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbmRkZWxcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9bm90Rm91bmQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLk5PVF9GT1VORCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6Ok9CSkVDVF9OT1RfRk9VTkQ6IE5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29uZGRlbFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjg4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5kZWxldGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjExMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb25kZGVsXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Tk9UX0ZPVU5ELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZV9pZC5uYW1lLCBtZXNzYWdlPU5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29uZGRlbCwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZV9pZC5uYW1lLCBtZXNzYWdlPU5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29uZGRlbCwgcmVhc29uPW5vdEZvdW5kLCBycGNDb2RlPTQwNH0gTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb25kZGVsOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6T0JKRUNUX05PVF9GT1VORDogTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb25kZGVsXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6ODgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmRlbGV0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbmRkZWxcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb25kZGVsIn19\"\n      }\n    },\n    {\n      \"ID\": \"e26af2cd4673cc7c\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/conddel?alt=json\\u0026ifMetagenerationMatch=2\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 412,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"12051\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:03 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:03 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uopfd5TJBzhGauzgyZW0h-TNFtDHz34k0kjbeuTeQPnMGBaiSFz9FdWA2gxp7qKp-V586voh7kqHgnVSW_QI4bWEuC35pj8NbCmmpNL_9pstpCgckw\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImNvbmRpdGlvbk5vdE1ldCIsIm1lc3NhZ2UiOiJQcmVjb25kaXRpb24gRmFpbGVkIiwibG9jYXRpb25UeXBlIjoiaGVhZGVyIiwibG9jYXRpb24iOiJJZi1NYXRjaCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpJTkNPUlJFQ1RfTUVUQV9HRU5FUkFUSU9OX1NQRUNJRklFRDogRXhwZWN0ZWQgbWV0YWRhdGEgZ2VuZXJhdGlvbiB0byBtYXRjaCAyLCBidXQgYWN0dWFsIHZhbHVlIHdhcyAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjg4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5kZWxldGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjExMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogRXhwZWN0ZWQgbWV0YWRhdGEgZ2VuZXJhdGlvbiB0byBtYXRjaCAyLCBidXQgYWN0dWFsIHZhbHVlIHdhcyAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1QUkVDT05ESVRJT05fRkFJTEVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OklOQ09SUkVDVF9NRVRBX0dFTkVSQVRJT05fU1BFQ0lGSUVEOiBFeHBlY3RlZCBtZXRhZGF0YSBnZW5lcmF0aW9uIHRvIG1hdGNoIDIsIGJ1dCBhY3R1YWwgdmFsdWUgd2FzIDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6ODgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmRlbGV0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBFeHBlY3RlZCBtZXRhZGF0YSBnZW5lcmF0aW9uIHRvIG1hdGNoIDIsIGJ1dCBhY3R1YWwgdmFsdWUgd2FzIDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPXByZWNvbmRpdGlvbkZhaWxlZCwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uQ09ORElUSU9OX05PVF9NRVQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpJTkNPUlJFQ1RfTUVUQV9HRU5FUkFUSU9OX1NQRUNJRklFRDogRXhwZWN0ZWQgbWV0YWRhdGEgZ2VuZXJhdGlvbiB0byBtYXRjaCAyLCBidXQgYWN0dWFsIHZhbHVlIHdhcyAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjg4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5kZWxldGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjExMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogRXhwZWN0ZWQgbWV0YWRhdGEgZ2VuZXJhdGlvbiB0byBtYXRjaCAyLCBidXQgYWN0dWFsIHZhbHVlIHdhcyAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUNPTkRJVElPTl9OT1RfTUVULCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9bnVsbCwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWhlYWRlcnMuSWYtTWF0Y2gsIG1lc3NhZ2U9UHJlY29uZGl0aW9uIEZhaWxlZCwgcmVhc29uPWNvbmRpdGlvbk5vdE1ldCwgcnBjQ29kZT00MTJ9IFByZWNvbmRpdGlvbiBGYWlsZWQ6IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpJTkNPUlJFQ1RfTUVUQV9HRU5FUkFUSU9OX1NQRUNJRklFRDogRXhwZWN0ZWQgbWV0YWRhdGEgZ2VuZXJhdGlvbiB0byBtYXRjaCAyLCBidXQgYWN0dWFsIHZhbHVlIHdhcyAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjg4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5kZWxldGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjExMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogRXhwZWN0ZWQgbWV0YWRhdGEgZ2VuZXJhdGlvbiB0byBtYXRjaCAyLCBidXQgYWN0dWFsIHZhbHVlIHdhcyAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MTIsIm1lc3NhZ2UiOiJQcmVjb25kaXRpb24gRmFpbGVkIn19\"\n      }\n    },\n    {\n      \"ID\": \"857f8a30eb55b023\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/conddel?alt=json\\u0026ifMetagenerationNotMatch=1\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 304,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:04 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:04 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uprv3QMjU4zz49ScYI4YaY9FitNwO7wGMQ1KZ8Y99w4D7keznFfA8M80bMdKvSH55jsWsDoLKcQ1VvIqIEUw88NqSfUM7E5SR_y5zfDaCf_uHSlgPM\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"4c69a7dc19302935\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/conddel?alt=json\\u0026generation=1556835843368401\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:04 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpoiZa1zqMV-8ZkeUrvT6Xi0uJul6yGWWth5s3YbFtA2p0-6vc_54sNtEbxbnsASZyMDXLelHaCSixgcVT6JDVELrXHDim9gHcjjlSTF6BsHWu181A\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"834f05b1eb2dbc32\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoib2JqMSJ9Cg==\",\n          \"TuDshcL7vdCAXh8L42NvEQ==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3150\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:04 GMT\"\n          ],\n          \"Etag\": [\n            \"CLnS+bvx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UozIFQVqWdhJxDLMyV7dfkeraSOw2Mw_AsI_aCWnAUudrz4HjQgZ4kbnvKXJfNF3SMQhxzxZHhk1Otmw7PgPxL7HyDkPDyK1DeHDc8GyfY1B3Q3YfA\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"34a1730e8bbe1d09\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoib2JqMiJ9Cg==\",\n          \"55GZ37DvGFQS3PnkEKv3Jg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3150\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:05 GMT\"\n          ],\n          \"Etag\": [\n            \"CJ2Xkrzx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoVrbP1vUH6TU_zfm_Aaca624z-91MoULnLIBcn9Hg4htv5T5Z6B4XYJMFZUuDjWWeBhR6EpG1UZL4iJe0TJybYQ2CCsB_k63CcOex39xaOIT8UYUA\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyIiwibmFtZSI6Im9iajIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiQ0Mxd2x3ck1PSXEwZHZNa015bFVoZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajI/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ1MDQ5MjQ1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoialY1QVZRPT0iLCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"b7c2c8ec1e65fb6d\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoib2JqL3dpdGgvc2xhc2hlcyJ9Cg==\",\n          \"kT7fkMXrRdrhn2P2+EeT5g==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3366\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:05 GMT\"\n          ],\n          \"Etag\": [\n            \"COqurrzx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrEgFAbU2gAqyKMITI9vr9kAgIBfNY3ZGs1l2_X4e-fVtNb01M9N81N-83LdChVzrk8iB09yuKUKdxRc0nMYrgy7S1fqPwbJdsQ6TJfMB05JJj6qr4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcyIsIm5hbWUiOiJvYmovd2l0aC9zbGFzaGVzIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6InVlei9oSjZ3QXJlRFFuY2NEVWR4Zmc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcz9nZW5lcmF0aW9uPTE1NTY4MzU4NDU1MTEwMTgmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoib2VvK0ZBPT0iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"0dbae3d4b454f434\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj%2Fwith%2Fslashes?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3366\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:05 GMT\"\n          ],\n          \"Etag\": [\n            \"COqurrzx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqk7CzWGAqaT12X_fTymveyPtsPJIPHD814QaAOIQLA_AJo_4OtnQOOXJM2jJhIZ1Co4NgEmboDUG9su4SN5fDTHObNh9elLts9VpUJ9iSYrIsn-Os\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcyIsIm5hbWUiOiJvYmovd2l0aC9zbGFzaGVzIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6InVlei9oSjZ3QXJlRFFuY2NEVWR4Zmc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcz9nZW5lcmF0aW9uPTE1NTY4MzU4NDU1MTEwMTgmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoib2VvK0ZBPT0iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"3793882b91d38a07\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj1?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3150\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:06 GMT\"\n          ],\n          \"Etag\": [\n            \"CLnS+bvx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpzUH_BRjU20OGbDAW2dy0lx9Gk_1Ko7zks6KG6OEpq0pBPfCIBjkCeIZTxKxtvxnOd1hqlZF7SlbNoyNUqX5UFXpZY5NjP5GTeUkm512vaBR5vnDI\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"39924c2826bcd33f\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj2?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3150\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:06 GMT\"\n          ],\n          \"Etag\": [\n            \"CJ2Xkrzx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrgOr-dpWoY-JJi6vRigJX3Mpi_WQ4zWvWKK382DCP-mzWSnrpbaOzijhTCdNz6pmXskVVs30APwlqZgvb-S6xAwXqKJG5n6832Py4UlTdDR_INTew\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyIiwibmFtZSI6Im9iajIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiQ0Mxd2x3ck1PSXEwZHZNa015bFVoZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajI/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ1MDQ5MjQ1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoialY1QVZRPT0iLCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"89ea9ab5e21a635e\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026delimiter=\\u0026pageToken=\\u0026prefix=obj\\u0026prettyPrint=false\\u0026projection=full\\u0026versions=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"9705\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:06 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:06 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqj9dj5PbUhIU3baBv98vMViDP-BnVPs0APrFYL4jSbKc7fK6eAGoyDfsccGzxK-t0lGvozizW4ltrga8DXo_oxlZ9-k5a85v9i0PWTFIisPC7xuL8\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzIiwibmFtZSI6Im9iai93aXRoL3NsYXNoZXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoidWV6L2hKNndBcmVEUW5jY0RVZHhmZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzP2dlbmVyYXRpb249MTU1NjgzNTg0NTUxMTAxOCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJvZW8rRkE9PSIsImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMiIsIm5hbWUiOiJvYmoyIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6IkNDMXdsd3JNT0lxMGR2TWtNeWxVaGc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyP2dlbmVyYXRpb249MTU1NjgzNTg0NTA0OTI0NSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6ImpWNUFWUT09IiwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifV19\"\n      }\n    },\n    {\n      \"ID\": \"b27c106562362f6b\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026delimiter=\\u0026maxResults=1\\u0026pageToken=\\u0026prefix=obj\\u0026prettyPrint=false\\u0026projection=full\\u0026versions=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"3446\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:06 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:06 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoIo3JJa2rfg9_o3bXN_5QU6XU_iIrWYfuEuvKTQL0O5tjIHkODIDd4biyHxjbGNFnrQNbkiEUXWEBlo-3fTVgfFTOWuaPpgae-SafTBP8h5X5ddJ4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNoQnZZbW92ZDJsMGFDOXpiR0Z6YUdWeiIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcyIsIm5hbWUiOiJvYmovd2l0aC9zbGFzaGVzIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6InVlei9oSjZ3QXJlRFFuY2NEVWR4Zmc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcz9nZW5lcmF0aW9uPTE1NTY4MzU4NDU1MTEwMTgmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoib2VvK0ZBPT0iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9XX0=\"\n      }\n    },\n    {\n      \"ID\": \"ca654b46531c4cb2\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026delimiter=\\u0026maxResults=1\\u0026pageToken=ChBvYmovd2l0aC9zbGFzaGVz\\u0026prefix=obj\\u0026prettyPrint=false\\u0026projection=full\\u0026versions=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"3214\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:07 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:07 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqINI0Ii418NlxoYErOrjhTKb3-G3n-8h1Ryc_4YT4Tksc7WXA9m4CcJWInyhJahYC-UUrM47O5EK-3FUt3toZOZxWlbwhE6Sfnra0H-CqjmvxWyRs\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNnUnZZbW94IiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEiLCJuYW1lIjoib2JqMSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ0NjQ3MjI1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJTbmEvVVd2N21jWkkyM29FNXRVYWJRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMT9nZW5lcmF0aW9uPTE1NTY4MzU4NDQ2NDcyMjUmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTG5TK2J2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ0NjQ3MjI1IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTG5TK2J2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ0NjQ3MjI1IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJDVDZkVEE9PSIsImV0YWciOiJDTG5TK2J2eC9lRUNFQUU9In1dfQ==\"\n      }\n    },\n    {\n      \"ID\": \"0186889a60e651db\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026delimiter=\\u0026maxResults=1\\u0026pageToken=CgRvYmox\\u0026prefix=obj\\u0026prettyPrint=false\\u0026projection=full\\u0026versions=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"3187\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:07 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:07 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpFTK3QnFf4m9htpY4s3P9_NHuDiQl8InpJoWPOaQHo0XaYnSoSqkH7CcUbm0-sWamsCZbd4DHoXHLCrea3ff9rLpWlptkL0aMKV_Dleb1Xm-j14fQ\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIiLCJuYW1lIjoib2JqMiIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJDQzF3bHdyTU9JcTBkdk1rTXlsVWhnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMj9nZW5lcmF0aW9uPTE1NTY4MzU4NDUwNDkyNDUmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJqVjVBVlE9PSIsImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In1dfQ==\"\n      }\n    },\n    {\n      \"ID\": \"a253776f79c46fe1\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026delimiter=\\u0026maxResults=1\\u0026pageToken=\\u0026prefix=obj\\u0026prettyPrint=false\\u0026projection=full\\u0026versions=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"3446\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:07 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:07 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uoadifz-4B7kC7DvXOyrNa5omK5-DXUNJBtT_d5I1jciPUvGlRm1L1vkvVMU1Y5n9zFig2CF_qqBLlcdvoYCaUeaNUu706L0fKJhJkA8vV5JUvFq0E\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNoQnZZbW92ZDJsMGFDOXpiR0Z6YUdWeiIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcyIsIm5hbWUiOiJvYmovd2l0aC9zbGFzaGVzIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6InVlei9oSjZ3QXJlRFFuY2NEVWR4Zmc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcz9nZW5lcmF0aW9uPTE1NTY4MzU4NDU1MTEwMTgmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoib2VvK0ZBPT0iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9XX0=\"\n      }\n    },\n    {\n      \"ID\": \"dc8959751769ee9c\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026delimiter=\\u0026maxResults=1\\u0026pageToken=ChBvYmovd2l0aC9zbGFzaGVz\\u0026prefix=obj\\u0026prettyPrint=false\\u0026projection=full\\u0026versions=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"3214\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:08 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:08 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqLeV9n2aiAq15pl3CqEWOt3_OYHsxbG0lHFIKr7Emh5btUEXLXl4nZWPi27LinKW7i0LYvp-HZK5b9E742MR_PNFe87treTpz_QgUmchGPKLcdZVM\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNnUnZZbW94IiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEiLCJuYW1lIjoib2JqMSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ0NjQ3MjI1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJTbmEvVVd2N21jWkkyM29FNXRVYWJRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMT9nZW5lcmF0aW9uPTE1NTY4MzU4NDQ2NDcyMjUmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTG5TK2J2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ0NjQ3MjI1IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTG5TK2J2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ0NjQ3MjI1IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJDVDZkVEE9PSIsImV0YWciOiJDTG5TK2J2eC9lRUNFQUU9In1dfQ==\"\n      }\n    },\n    {\n      \"ID\": \"23f7f167269db6b2\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026delimiter=\\u0026maxResults=1\\u0026pageToken=CgRvYmox\\u0026prefix=obj\\u0026prettyPrint=false\\u0026projection=full\\u0026versions=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"3187\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:08 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:08 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uo4hY4jSbETgB5jf-AU8_b1sRvfTSrlt_Pt6UXiuTte4GtueVBgDwuMEliwE2-nOSiRE6juXOCbR1LQlRrpek1TLeRRf1cCVbz90YcCIGhWV_zFz0o\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIiLCJuYW1lIjoib2JqMiIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJDQzF3bHdyTU9JcTBkdk1rTXlsVWhnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMj9nZW5lcmF0aW9uPTE1NTY4MzU4NDUwNDkyNDUmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJqVjVBVlE9PSIsImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In1dfQ==\"\n      }\n    },\n    {\n      \"ID\": \"518c5855f7f2035b\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026delimiter=\\u0026maxResults=2\\u0026pageToken=\\u0026prefix=obj\\u0026prettyPrint=false\\u0026projection=full\\u0026versions=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"6581\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:09 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:09 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqGaiKkmr1oBduBvG8APGBVoM_Ve7zHw4TBuyV3QYcFr9SYzEnATEwE5P6BH-yBsVXSmaRLej1a55x18Bra_ZAC7nYh2UKvWM66JGE3U1muaDBabyw\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNnUnZZbW94IiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzIiwibmFtZSI6Im9iai93aXRoL3NsYXNoZXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoidWV6L2hKNndBcmVEUW5jY0RVZHhmZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzP2dlbmVyYXRpb249MTU1NjgzNTg0NTUxMTAxOCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJvZW8rRkE9PSIsImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9XX0=\"\n      }\n    },\n    {\n      \"ID\": \"5887398d8cd8c906\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026delimiter=\\u0026maxResults=2\\u0026pageToken=CgRvYmox\\u0026prefix=obj\\u0026prettyPrint=false\\u0026projection=full\\u0026versions=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"3187\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:09 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:09 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqGAvr7ojM3PcmnrTMTX-TXgYKzfo-3gzwYU_l9OaCfpth_ad2lWUJf6w6B8pjEGsAFZJvNueCHYGSJdx6YJ7NAe71oah1xi6lGQvQkWEwAl0fXd7Y\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIiLCJuYW1lIjoib2JqMiIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJDQzF3bHdyTU9JcTBkdk1rTXlsVWhnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMj9nZW5lcmF0aW9uPTE1NTY4MzU4NDUwNDkyNDUmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJqVjVBVlE9PSIsImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In1dfQ==\"\n      }\n    },\n    {\n      \"ID\": \"81d53e304c7ed90d\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026delimiter=\\u0026maxResults=2\\u0026pageToken=\\u0026prefix=obj\\u0026prettyPrint=false\\u0026projection=full\\u0026versions=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"6581\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:09 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:09 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur9XEMeCefUS1K7QkIxrxZboQ1zQ5SkrEUZMzrQdNBNAuDQnpDczXzJvF-rZmxFVYSdMySScTTu-FICOdI91b-fQVRomrqAxJwgn60FoObIVVpgkog\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNnUnZZbW94IiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzIiwibmFtZSI6Im9iai93aXRoL3NsYXNoZXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoidWV6L2hKNndBcmVEUW5jY0RVZHhmZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzP2dlbmVyYXRpb249MTU1NjgzNTg0NTUxMTAxOCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJvZW8rRkE9PSIsImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9XX0=\"\n      }\n    },\n    {\n      \"ID\": \"0be1bdae5ba86bfd\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026delimiter=\\u0026maxResults=2\\u0026pageToken=CgRvYmox\\u0026prefix=obj\\u0026prettyPrint=false\\u0026projection=full\\u0026versions=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"3187\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:10 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:10 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UocXesX_BUCirPixQFUhYfAIoR0Os309HMGHarzTGrqH1PkmHuGaaiNSH_pJq8nnWUXEnjk1cvuPGJWCF21t7EJQtCIGBWQoPBNV6OpvALZGdpPXuI\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIiLCJuYW1lIjoib2JqMiIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJDQzF3bHdyTU9JcTBkdk1rTXlsVWhnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMj9nZW5lcmF0aW9uPTE1NTY4MzU4NDUwNDkyNDUmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJqVjVBVlE9PSIsImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In1dfQ==\"\n      }\n    },\n    {\n      \"ID\": \"592a3fdf8b5a83e5\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026delimiter=\\u0026maxResults=3\\u0026pageToken=\\u0026prefix=obj\\u0026prettyPrint=false\\u0026projection=full\\u0026versions=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"9705\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:10 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:10 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoS2FM55Dkg1PRaNQBzsu5KBns-svmRrQ5byrUGRHgnsBQQDdE3ZznljVTrNq3wDAClddQ4zbCMQSLdqxPPNlom-n1tMg1hO8s6kS8_CTWy2SOM6As\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzIiwibmFtZSI6Im9iai93aXRoL3NsYXNoZXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoidWV6L2hKNndBcmVEUW5jY0RVZHhmZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzP2dlbmVyYXRpb249MTU1NjgzNTg0NTUxMTAxOCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJvZW8rRkE9PSIsImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMiIsIm5hbWUiOiJvYmoyIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6IkNDMXdsd3JNT0lxMGR2TWtNeWxVaGc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyP2dlbmVyYXRpb249MTU1NjgzNTg0NTA0OTI0NSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6ImpWNUFWUT09IiwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifV19\"\n      }\n    },\n    {\n      \"ID\": \"b01846866b585241\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026delimiter=\\u0026maxResults=3\\u0026pageToken=\\u0026prefix=obj\\u0026prettyPrint=false\\u0026projection=full\\u0026versions=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"9705\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:10 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:10 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uo22tWMx8uW6afXbfFrFT8UZzPbsqPItYMdRAPHNEuksgeqWI2US_xblUG6C8WgcHvfEeR_19eVmBTmW6QE7rmosaIm_raZxW9FuCHHiSi8TJnZ1CI\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzIiwibmFtZSI6Im9iai93aXRoL3NsYXNoZXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoidWV6L2hKNndBcmVEUW5jY0RVZHhmZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzP2dlbmVyYXRpb249MTU1NjgzNTg0NTUxMTAxOCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJvZW8rRkE9PSIsImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMiIsIm5hbWUiOiJvYmoyIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6IkNDMXdsd3JNT0lxMGR2TWtNeWxVaGc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyP2dlbmVyYXRpb249MTU1NjgzNTg0NTA0OTI0NSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6ImpWNUFWUT09IiwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifV19\"\n      }\n    },\n    {\n      \"ID\": \"2eeefee032c6e805\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026delimiter=\\u0026maxResults=13\\u0026pageToken=\\u0026prefix=obj\\u0026prettyPrint=false\\u0026projection=full\\u0026versions=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"9705\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:11 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:11 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uq55nB00t16AHTo1gSxBFUNplz5SJcGYBOeCPsK-MD5OLO_kHKT3YNZq69AAHpozaWVrTU_jDQqiqMFSoPhhmlF2dR1mcq6Ihk_y8uuFY6FM4O_hmI\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzIiwibmFtZSI6Im9iai93aXRoL3NsYXNoZXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoidWV6L2hKNndBcmVEUW5jY0RVZHhmZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzP2dlbmVyYXRpb249MTU1NjgzNTg0NTUxMTAxOCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJvZW8rRkE9PSIsImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMiIsIm5hbWUiOiJvYmoyIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6IkNDMXdsd3JNT0lxMGR2TWtNeWxVaGc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyP2dlbmVyYXRpb249MTU1NjgzNTg0NTA0OTI0NSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6ImpWNUFWUT09IiwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifV19\"\n      }\n    },\n    {\n      \"ID\": \"11bfe17bc978cdfd\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026delimiter=\\u0026maxResults=13\\u0026pageToken=\\u0026prefix=obj\\u0026prettyPrint=false\\u0026projection=full\\u0026versions=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"9705\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:11 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:11 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UotgN85lDspseXEgwnXhmfSmio9oOxSzhqtyabApVH0KQz_aVg3DbQ7m0Z0L9SzPzzmNEUfU6xhAT5xQAXf-wvY1NHDFxdf9IJ6YoVNhN0aHN-75hY\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzIiwibmFtZSI6Im9iai93aXRoL3NsYXNoZXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoidWV6L2hKNndBcmVEUW5jY0RVZHhmZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzP2dlbmVyYXRpb249MTU1NjgzNTg0NTUxMTAxOCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJvZW8rRkE9PSIsImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMiIsIm5hbWUiOiJvYmoyIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6IkNDMXdsd3JNT0lxMGR2TWtNeWxVaGc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyP2dlbmVyYXRpb249MTU1NjgzNTg0NTA0OTI0NSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6ImpWNUFWUT09IiwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifV19\"\n      }\n    },\n    {\n      \"ID\": \"c05bfa6f1a43381b\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=60\"\n          ],\n          \"Content-Length\": [\n            \"16\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:11 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"4a76bf516bfb99c648db7a04e6d51a6d\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:11 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:04 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:04 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835844647225\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=CT6dTA==\",\n            \"md5=Sna/UWv7mcZI23oE5tUabQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"16\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrVVjXVa2SMY6cjYeIgdcZOivQwE2Crz6UPZs2VXVBFMwReZs7kKbETuTMwuEMHKKm_LIrk-o6jS07MimubSWVxGMzT1BtCacU1X2Go_RckmyJPZso\"\n          ]\n        },\n        \"Body\": \"TuDshcL7vdCAXh8L42NvEQ==\"\n      }\n    },\n    {\n      \"ID\": \"f2932604385db16e\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=60\"\n          ],\n          \"Content-Length\": [\n            \"16\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:12 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"4a76bf516bfb99c648db7a04e6d51a6d\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:12 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:04 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:04 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835844647225\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=CT6dTA==\",\n            \"md5=Sna/UWv7mcZI23oE5tUabQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"16\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrADckAOw2vMHdy0qy02f20x-8s_Ue81-NYwSpKeqp6Zx6eCPReLM6qXUyxFz0xHNGob5WJA8J4ctl6ZFzL2fEVwBMNY8xxzpkKOAwSu9n9e0OE63E\"\n          ]\n        },\n        \"Body\": \"TuDshcL7vdCAXh8L42NvEQ==\"\n      }\n    },\n    {\n      \"ID\": \"8581afc6216ad2cb\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj2\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=60\"\n          ],\n          \"Content-Length\": [\n            \"16\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:12 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"082d70970acc388ab476f32433295486\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:12 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:05 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:05 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835845049245\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=jV5AVQ==\",\n            \"md5=CC1wlwrMOIq0dvMkMylUhg==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"16\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrkoYpGTn57WC5t-sItsEdWimp47AtSuqw8autFOD3TirChrdQThg_Fh-kykfgvnTaOyiw1InKeYs0Z2MISmjUpu4uHUUGDKTX6W0zQEuUks7i2BqQ\"\n          ]\n        },\n        \"Body\": \"55GZ37DvGFQS3PnkEKv3Jg==\"\n      }\n    },\n    {\n      \"ID\": \"ae129e597d5dd3e8\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj2\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=60\"\n          ],\n          \"Content-Length\": [\n            \"16\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:12 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"082d70970acc388ab476f32433295486\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:12 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:05 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:05 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835845049245\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=jV5AVQ==\",\n            \"md5=CC1wlwrMOIq0dvMkMylUhg==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"16\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoaoET13zBO6-kmfarxy5tCZhmqc2oO38xOd6m6OQ55e-MyyKYM35hNakm5xYdWaoUNsKwVCiklp4HtYE8afVObxcDERuTCgyTw-olewCN6VBwd-H0\"\n          ]\n        },\n        \"Body\": \"55GZ37DvGFQS3PnkEKv3Jg==\"\n      }\n    },\n    {\n      \"ID\": \"11acf26dc7680b3e\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj/with/slashes\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=60\"\n          ],\n          \"Content-Length\": [\n            \"16\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:12 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"b9ecff849eb002b78342771c0d47717e\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:12 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:05 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:05 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835845511018\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=oeo+FA==\",\n            \"md5=uez/hJ6wAreDQnccDUdxfg==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"16\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Up_XtsS2bu4fnGI-Z85gqz1MECYqweRqin42arAyEfpJpZwmadI1-Op9V7n-q3UaYyRtUWFR7an7zKxWhJ_CB6PXz-C55C1nPoI7EWVEV2oXcS-q8c\"\n          ]\n        },\n        \"Body\": \"kT7fkMXrRdrhn2P2+EeT5g==\"\n      }\n    },\n    {\n      \"ID\": \"ff72204b0c538268\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj/with/slashes\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=60\"\n          ],\n          \"Content-Length\": [\n            \"16\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:12 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"b9ecff849eb002b78342771c0d47717e\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:12 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:05 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:05 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835845511018\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=oeo+FA==\",\n            \"md5=uez/hJ6wAreDQnccDUdxfg==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"16\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqrjLdnTX47-_XGNBlBZ0rEgsIkYJMzixBaVmhjn8IsK66UpQAUO-njMM-WznI-DBNIbXVTcPQKZBNe2ZHZEskfuRjsFwMjtooyUH_PqTfZnARVv8M\"\n          ]\n        },\n        \"Body\": \"kT7fkMXrRdrhn2P2+EeT5g==\"\n      }\n    },\n    {\n      \"ID\": \"7972502f866e015e\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1\",\n        \"Header\": {\n          \"Range\": [\n            \"bytes=0-15\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=60\"\n          ],\n          \"Content-Length\": [\n            \"16\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:12 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"4a76bf516bfb99c648db7a04e6d51a6d\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:12 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:04 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:04 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835844647225\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=CT6dTA==\",\n            \"md5=Sna/UWv7mcZI23oE5tUabQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"16\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoNiJIZYFETpngMkDItRU7PtN7Fv4bDU7Kfvndst1JR2eGmW-tOMTfng8Abx6EWwPvvodLkSk-1TM4Gywxzh3c24gPDN4NsQMuh40Mfp0Jvg1syOls\"\n          ]\n        },\n        \"Body\": \"TuDshcL7vdCAXh8L42NvEQ==\"\n      }\n    },\n    {\n      \"ID\": \"251a62254c59cbd1\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1\",\n        \"Header\": {\n          \"Range\": [\n            \"bytes=0-7\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 206,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=60\"\n          ],\n          \"Content-Length\": [\n            \"8\"\n          ],\n          \"Content-Range\": [\n            \"bytes 0-7/16\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:12 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"4a76bf516bfb99c648db7a04e6d51a6d\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:12 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:04 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:04 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835844647225\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=CT6dTA==\",\n            \"md5=Sna/UWv7mcZI23oE5tUabQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"16\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UobLFpkqodTM1bHuzS0GzRCKZypPQkf3nH1hbOexCjgjAcheZhV_zxJRyLhOYZoW8ABEaVMJLULNrzAm1VZs4JrTdtT46fYIcQe7OBeJp0aHI7Lr5s\"\n          ]\n        },\n        \"Body\": \"TuDshcL7vdA=\"\n      }\n    },\n    {\n      \"ID\": \"2482617229166e50\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1\",\n        \"Header\": {\n          \"Range\": [\n            \"bytes=8-23\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 206,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=60\"\n          ],\n          \"Content-Length\": [\n            \"8\"\n          ],\n          \"Content-Range\": [\n            \"bytes 8-15/16\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:12 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"4a76bf516bfb99c648db7a04e6d51a6d\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:12 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:04 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:04 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835844647225\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=CT6dTA==\",\n            \"md5=Sna/UWv7mcZI23oE5tUabQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"16\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uon8ZtKgOTqFm36bWHd3hf535jPGQBEX9j2yPrr11_ycAJjfI4A-mFWMTsFRR3nwSo68784B9TUPUjQd0cib0QIrfBjfDcz91p6oPJG3VpV9afywIY\"\n          ]\n        },\n        \"Body\": \"gF4fC+NjbxE=\"\n      }\n    },\n    {\n      \"ID\": \"74ff0c5848c7dba6\",\n      \"Request\": {\n        \"Method\": \"HEAD\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1\",\n        \"Header\": {\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=60\"\n          ],\n          \"Content-Length\": [\n            \"16\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:12 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"4a76bf516bfb99c648db7a04e6d51a6d\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:12 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:04 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:04 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835844647225\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=CT6dTA==\",\n            \"md5=Sna/UWv7mcZI23oE5tUabQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"16\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqKc-08ZJEWVbyaV84xKlnrHkl2PBuBUQP6xtx6TzZW0fsjyZ-SHshiy-QMGCuP1UF4x1ettHyDvRbAleHIXy4y7wMwoUWST2NKs_0oRA0oVqOoKtQ\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"90888164f5d2d40d\",\n      \"Request\": {\n        \"Method\": \"HEAD\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1\",\n        \"Header\": {\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=60\"\n          ],\n          \"Content-Length\": [\n            \"16\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:13 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"4a76bf516bfb99c648db7a04e6d51a6d\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:13 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:04 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:04 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835844647225\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=CT6dTA==\",\n            \"md5=Sna/UWv7mcZI23oE5tUabQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"16\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoTSlg3r_LSoiqQyJVJDzL-0xNj6jlSNp9zLUmlPtu3xbhCLBDNAxY9CRbyEjw7UudDcsFOe43C3QlsVjoBJln1q179ZspYWXY-fHqjrztAfJkZUpU\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"7961f3dc74fa0663\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1\",\n        \"Header\": {\n          \"Range\": [\n            \"bytes=8-\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 206,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=60\"\n          ],\n          \"Content-Length\": [\n            \"8\"\n          ],\n          \"Content-Range\": [\n            \"bytes 8-15/16\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:13 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"4a76bf516bfb99c648db7a04e6d51a6d\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:13 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:04 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:04 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835844647225\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=CT6dTA==\",\n            \"md5=Sna/UWv7mcZI23oE5tUabQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"16\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqJjC8HFLb8u_EaJVF0_TUOhNWhbooW0oANE8_LPjoIdLcoU42caZe7LjgbTIjCb0Ss3horP2noxirF3u3FGq0Yoh4rjuHBVhwZcemZHnKLgJUUbQQ\"\n          ]\n        },\n        \"Body\": \"gF4fC+NjbxE=\"\n      }\n    },\n    {\n      \"ID\": \"af8c1fcfa456592a\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1\",\n        \"Header\": {\n          \"Range\": [\n            \"bytes=0-31\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=60\"\n          ],\n          \"Content-Length\": [\n            \"16\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:13 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"4a76bf516bfb99c648db7a04e6d51a6d\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:13 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:04 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:04 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835844647225\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=CT6dTA==\",\n            \"md5=Sna/UWv7mcZI23oE5tUabQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"16\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqq6ro5-i6q8pIDup0yW35uFEynuLK95P8OSFhj7b70DK33tjv3fkOdkobsfwplOAGuNME2bLjQuyy8mhd2xBbNjyjvXt13Nc48PB4M2t_46RoM3Ak\"\n          ]\n        },\n        \"Body\": \"TuDshcL7vdCAXh8L42NvEQ==\"\n      }\n    },\n    {\n      \"ID\": \"d312c241da5bd348\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1\",\n        \"Header\": {\n          \"Range\": [\n            \"bytes=32-41\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 416,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=60\"\n          ],\n          \"Content-Length\": [\n            \"167\"\n          ],\n          \"Content-Type\": [\n            \"application/xml; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:13 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"4a76bf516bfb99c648db7a04e6d51a6d\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:13 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:04 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:04 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835844647225\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=CT6dTA==\",\n            \"md5=Sna/UWv7mcZI23oE5tUabQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"16\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpAvzLs-GgdTPEGM2kvABFTxehSb-DhZQ2Y31nQ9ad0RMmfIMtVGRBXvkXo7FwGAy78ZHMSGWRKG-DYMy6JU9PCM4Tpo8PDmm4-rHa_LVpH2dFN-JM\"\n          ]\n        },\n        \"Body\": \"PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+SW52YWxpZFJhbmdlPC9Db2RlPjxNZXNzYWdlPlRoZSByZXF1ZXN0ZWQgcmFuZ2UgY2Fubm90IGJlIHNhdGlzZmllZC48L01lc3NhZ2U+PERldGFpbHM+Ynl0ZXM9MzItNDE8L0RldGFpbHM+PC9FcnJvcj4=\"\n      }\n    },\n    {\n      \"ID\": \"2bbd010d0173c966\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj1?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3150\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:13 GMT\"\n          ],\n          \"Etag\": [\n            \"CLnS+bvx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpZDScoUU4zzBoXc21jt6C1vcW1SrU6ELiWodrCID-OoNKVMbecv_DSgHZATQGs4GS-BebkzqdalqTq5C77aKXQMxiks-9A5kyrc8N4aY9L5YndaI8\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"e3522e1cc7aef940\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2570\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:13 GMT\"\n          ],\n          \"Etag\": [\n            \"CAY=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:13 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur5x_r1PKMQrnKbsfUWRR6wBwFQTM8U9mGwyq_fK56rrHE_UoLDxLRpiuaFGLVi9L4Hj67UXH76drA6KQQQgOsMVo0YEl1pVS2P7OKQ64WF4NubRCU\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowMi4zNjFaIiwibWV0YWdlbmVyYXRpb24iOiI2IiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FZPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQVk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQVk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBWT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQVk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBWT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInZlcnNpb25pbmciOnsiZW5hYmxlZCI6ZmFsc2V9LCJsaWZlY3ljbGUiOnsicnVsZSI6W3siYWN0aW9uIjp7InR5cGUiOiJEZWxldGUifSwiY29uZGl0aW9uIjp7ImFnZSI6MzB9fV19LCJsYWJlbHMiOnsibDEiOiJ2MiIsIm5ldyI6Im5ldyJ9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQVk9In0=\"\n      }\n    },\n    {\n      \"ID\": \"77ed46692038573c\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj1/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/copy-obj1?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"3\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"e30K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3333\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:14 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpBnZgUt8GyAer5VG-_nEuf3YizRjF2t4MS6vOflI_Vid1-zVpQ99TuphB3pZjPZNI5ZoHJxCmDv3lyLwyhUDvk_p_NO9x8qZTEpjf1EOO5uxRsOxo\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMTYiLCJvYmplY3RTaXplIjoiMTYiLCJkb25lIjp0cnVlLCJyZXNvdXJjZSI6eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajEvMTU1NjgzNTg1NDE0NDc5MiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvcHktb2JqMSIsIm5hbWUiOiJjb3B5LW9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NDE0NDc5MiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxNC4xNDRaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTQuMTQ0WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE0LjE0NFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvcHktb2JqMT9nZW5lcmF0aW9uPTE1NTY4MzU4NTQxNDQ3OTImYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxLzE1NTY4MzU4NTQxNDQ3OTIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29weS1vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb3B5LW9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NDE0NDc5MiIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSmlxdmNEeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxLzE1NTY4MzU4NTQxNDQ3OTIvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvcHktb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvcHktb2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU0MTQ0NzkyIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0ppcXZjRHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvcHktb2JqMS8xNTU2ODM1ODU0MTQ0NzkyL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb3B5LW9iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb3B5LW9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NDE0NDc5MiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSmlxdmNEeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxLzE1NTY4MzU4NTQxNDQ3OTIvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvcHktb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvcHktb2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU0MTQ0NzkyIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0ppcXZjRHgvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJDVDZkVEE9PSIsImV0YWciOiJDSmlxdmNEeC9lRUNFQUU9In19\"\n      }\n    },\n    {\n      \"ID\": \"9187dbb998c64d40\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj1/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/copy-obj1?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"31\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJjb250ZW50RW5jb2RpbmciOiJpZGVudGl0eSJ9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3299\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:14 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpyrF7U9KSc3XcJb-T_KGf3Fg2yhFUjJqTl06wpqqhG5IT6chgLCWKnLTuamfHtVq8XcP7acZy4TGyKIEvZ4L36TGTfSM8Zp_JyF8K4rN5p375VBMc\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMTYiLCJvYmplY3RTaXplIjoiMTYiLCJkb25lIjp0cnVlLCJyZXNvdXJjZSI6eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajEvMTU1NjgzNTg1NDc0NzU0MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvcHktb2JqMSIsIm5hbWUiOiJjb3B5LW9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NDc0NzU0MyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxNC43NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTQuNzQ3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE0Ljc0N1oiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvcHktb2JqMT9nZW5lcmF0aW9uPTE1NTY4MzU4NTQ3NDc1NDMmYWx0PW1lZGlhIiwiY29udGVudEVuY29kaW5nIjoiaWRlbnRpdHkiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajEvMTU1NjgzNTg1NDc0NzU0My9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb3B5LW9iajEvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvcHktb2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU0NzQ3NTQzIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKZVA0c0R4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajEvMTU1NjgzNTg1NDc0NzU0My9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29weS1vYmoxL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29weS1vYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTQ3NDc1NDMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSmVQNHNEeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxLzE1NTY4MzU4NTQ3NDc1NDMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvcHktb2JqMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvcHktb2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU0NzQ3NTQzIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKZVA0c0R4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajEvMTU1NjgzNTg1NDc0NzU0My91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29weS1vYmoxL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29weS1vYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTQ3NDc1NDMiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSmVQNHNEeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IkNUNmRUQT09IiwiZXRhZyI6IkNKZVA0c0R4L2VFQ0VBRT0ifX0=\"\n      }\n    },\n    {\n      \"ID\": \"c199412d75fadc45\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj1?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"193\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJhY2wiOlt7ImVudGl0eSI6ImRvbWFpbi1nb29nbGUuY29tIiwicm9sZSI6IlJFQURFUiJ9XSwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiY29udGVudExhbmd1YWdlIjoiZW4iLCJjb250ZW50VHlwZSI6InRleHQvaHRtbCIsIm1ldGFkYXRhIjp7ImtleSI6InZhbHVlIn19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2046\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:15 GMT\"\n          ],\n          \"Etag\": [\n            \"CLnS+bvx/eECEAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqKO5A_yihnTzTSNbXxyLm-I3MkyC58APsD1U6RZ5_xpjjjL3nXVZIyACkeiDKXRZyU_oP1Yt0FeX23ONp6JeNyoy0J0kW8GwGMgPeN1ATdWGzCMXs\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImNvbnRlbnRUeXBlIjoidGV4dC9odG1sIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxNS4yMjBaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJTbmEvVVd2N21jWkkyM29FNXRVYWJRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMT9nZW5lcmF0aW9uPTE1NTY4MzU4NDQ2NDcyMjUmYWx0PW1lZGlhIiwiY29udGVudExhbmd1YWdlIjoiZW4iLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJtZXRhZGF0YSI6eyJrZXkiOiJ2YWx1ZSJ9LCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvZG9tYWluLWdvb2dsZS5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9kb21haW4tZ29vZ2xlLmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6ImRvbWFpbi1nb29nbGUuY29tIiwicm9sZSI6IlJFQURFUiIsImRvbWFpbiI6Imdvb2dsZS5jb20iLCJldGFnIjoiQ0xuUytidngvZUVDRUFJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBST0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFJPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"c845025158c6b7d0\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj1?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"120\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjb250ZW50TGFuZ3VhZ2UiOm51bGwsImNvbnRlbnRUeXBlIjpudWxsLCJtZXRhZGF0YSI6bnVsbH0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"1970\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:15 GMT\"\n          ],\n          \"Etag\": [\n            \"CLnS+bvx/eECEAM=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UryOVdmGzCqBOS2ZZ0nw1SqbHF7qJ1CeTxgb6a1BJyoA42NTNZ8RdEVQGNF5u2hWdSQW79cBOonxjms_MoogyDJVAtKHl1rys87QHF6-750NNNSoEw\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMyIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTUuNTI3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9kb21haW4tZ29vZ2xlLmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL2RvbWFpbi1nb29nbGUuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ0NjQ3MjI1IiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDTG5TK2J2eC9lRUNFQU09In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ0NjQ3MjI1IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0xuUytidngvZUVDRUFNPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJDVDZkVEE9PSIsImV0YWciOiJDTG5TK2J2eC9lRUNFQU09In0=\"\n      }\n    },\n    {\n      \"ID\": \"811b0b9d4980b14f\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoiY2hlY2tzdW0tb2JqZWN0In0K\",\n          \"aGVsbG93b3JsZA==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3305\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:16 GMT\"\n          ],\n          \"Etag\": [\n            \"CIGhrMHx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqJTh_P91pby-vQkRF12GexDihy7TZAlUPamDV_REldvXeqvbrWY_kB0Vcp1lYyuIY7EK2_eMBYYSRMMIVEYz5fxxt51-9Br_UmYvnuRgjhfC16AuA\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jaGVja3N1bS1vYmplY3QvMTU1NjgzNTg1NTk2MjI0MSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NoZWNrc3VtLW9iamVjdCIsIm5hbWUiOiJjaGVja3N1bS1vYmplY3QiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NTk2MjI0MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxNS45NjFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTUuOTYxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE1Ljk2MVoiLCJzaXplIjoiMTAiLCJtZDVIYXNoIjoiL0Y0RGpUaWxjRElJVkVIbi9uQVFzQT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NoZWNrc3VtLW9iamVjdD9nZW5lcmF0aW9uPTE1NTY4MzU4NTU5NjIyNDEmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY2hlY2tzdW0tb2JqZWN0LzE1NTY4MzU4NTU5NjIyNDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY2hlY2tzdW0tb2JqZWN0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjaGVja3N1bS1vYmplY3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NTk2MjI0MSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSUdock1IeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY2hlY2tzdW0tb2JqZWN0LzE1NTY4MzU4NTU5NjIyNDEvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NoZWNrc3VtLW9iamVjdC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNoZWNrc3VtLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU1OTYyMjQxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0lHaHJNSHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NoZWNrc3VtLW9iamVjdC8xNTU2ODM1ODU1OTYyMjQxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jaGVja3N1bS1vYmplY3QvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjaGVja3N1bS1vYmplY3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NTk2MjI0MSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSUdock1IeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY2hlY2tzdW0tb2JqZWN0LzE1NTY4MzU4NTU5NjIyNDEvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NoZWNrc3VtLW9iamVjdC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNoZWNrc3VtLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU1OTYyMjQxIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0lHaHJNSHgvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJWc3UwZ0E9PSIsImV0YWciOiJDSUdock1IeC9lRUNFQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"69c77b8bdd7cc643\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoiemVyby1vYmplY3QifQo=\",\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3240\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:16 GMT\"\n          ],\n          \"Etag\": [\n            \"CLirz8Hx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur2iXVwACD0yFKYjt0WT-lW1Tx6PtpOgDYttPBWBnJZ3CPf4cUK7heI_9SwdzYXoieaRHDj9n3w3M_SExedwQqQ-GTOY9qM9DPmrPy11hEny0WjECc\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS96ZXJvLW9iamVjdC8xNTU2ODM1ODU2NTM3MDE2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vemVyby1vYmplY3QiLCJuYW1lIjoiemVyby1vYmplY3QiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NjUzNzAxNiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxNi41MzZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTYuNTM2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE2LjUzNloiLCJzaXplIjoiMCIsIm1kNUhhc2giOiIxQjJNMlk4QXNnVHBnQW1ZN1BoQ2ZnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vemVyby1vYmplY3Q/Z2VuZXJhdGlvbj0xNTU2ODM1ODU2NTM3MDE2JmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3plcm8tb2JqZWN0LzE1NTY4MzU4NTY1MzcwMTYvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vemVyby1vYmplY3QvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Inplcm8tb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTY1MzcwMTYiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xpcno4SHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3plcm8tb2JqZWN0LzE1NTY4MzU4NTY1MzcwMTYvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3plcm8tb2JqZWN0L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiemVyby1vYmplY3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NjUzNzAxNiIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMaXJ6OEh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS96ZXJvLW9iamVjdC8xNTU2ODM1ODU2NTM3MDE2L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby96ZXJvLW9iamVjdC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Inplcm8tb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTY1MzcwMTYiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xpcno4SHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3plcm8tb2JqZWN0LzE1NTY4MzU4NTY1MzcwMTYvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3plcm8tb2JqZWN0L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiemVyby1vYmplY3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NjUzNzAxNiIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMaXJ6OEh4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQUFBQUFBPT0iLCJldGFnIjoiQ0xpcno4SHgvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"1017883279ca634a\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj1/acl/allUsers?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"98\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJhbGxVc2VycyIsInJvbGUiOiJSRUFERVIifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"417\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:17 GMT\"\n          ],\n          \"Etag\": [\n            \"CLnS+bvx/eECEAQ=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoKqYaaFUj6b4ezS4lnnQgYv4CHVSsqhVSlLP3QqpItNahh25KnLzbTccK_idrfjKV0gExzr17MvFmoRw7oUIWyJJINmpEXEw5EmHScxipsb3KbWZ8\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L2FsbFVzZXJzIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvYWxsVXNlcnMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJhbGxVc2VycyIsInJvbGUiOiJSRUFERVIiLCJldGFnIjoiQ0xuUytidngvZUVDRUFRPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"35f04bf2400be96f\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=60\"\n          ],\n          \"Content-Length\": [\n            \"16\"\n          ],\n          \"Content-Type\": [\n            \"application/octet-stream\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:17 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"4a76bf516bfb99c648db7a04e6d51a6d\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:17 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:04 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:04 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835844647225\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=CT6dTA==\",\n            \"md5=Sna/UWv7mcZI23oE5tUabQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"4\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"16\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqC9teasrZdeHJo8KLaQQ251d02ORMxXreH3TKcaQp4NWLVbpiAw1GpW9WeSdFgbpWtVDdyzfjE93gAs6uA0kdlDPZsIEfJVK3GFfaZE2aW5aFCn8Y\"\n          ]\n        },\n        \"Body\": \"TuDshcL7vdCAXh8L42NvEQ==\"\n      }\n    },\n    {\n      \"ID\": \"d01040504d2a91c4\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoib2JqMSJ9Cg==\",\n          \"aGVsbG8=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 401,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"30343\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:17 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"Www-Authenticate\": [\n            \"Bearer realm=\\\"https://accounts.google.com/\\\"\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqRhLZOcm0K7eNByUzCBgYfgiytuZ6Hj06jPkbkK77LS80OPgO_78AL530-2AcrlLe1fIy0jM0tonLLncLuOszrqKcGgVhqEJuE48-67vqBRACjqmY\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS4iLCJsb2NhdGlvblR5cGUiOiJoZWFkZXIiLCJsb2NhdGlvbiI6IkF1dGhvcml6YXRpb24iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNDRVNTX0RFTklFRDogQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6NDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuaW5zZXJ0KE9iamVjdHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1MT0dJTl9SRVFVSVJFRCwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9Y29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUxPR0lOX1JFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDQ0VTU19ERU5JRUQ6IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9dW5hdXRob3JpemVkLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDQ0VTU19ERU5JRUQ6IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1SRVFVSVJFRCwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkuYXV0aGVudGljYXRlZF91c2VyLCBtZXNzYWdlPUFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS4sIHVubmFtZWRBcmd1bWVudHM9W119LCBsb2NhdGlvbj1oZWFkZXJzLkF1dGhvcml6YXRpb24sIG1lc3NhZ2U9QW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMX0gQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDQ0VTU19ERU5JRUQ6IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDQ0VTU19ERU5JRUQ6IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e1dXVy1BdXRoZW50aWNhdGU9W0JlYXJlciByZWFsbT1cImh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9cIl19LCBodHRwU3RhdHVzPXVuYXV0aG9yaXplZCwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uUkVRVUlSRUQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9UkVRVUlSRUQsIGVycm9yUHJvdG9Eb21haW49Z2RhdGEuQ29yZUVycm9yRG9tYWluLCBmaWx0ZXJlZE1lc3NhZ2U9bnVsbCwgbG9jYXRpb249ZW50aXR5LmF1dGhlbnRpY2F0ZWRfdXNlciwgbWVzc2FnZT1Bbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249aGVhZGVycy5BdXRob3JpemF0aW9uLCBtZXNzYWdlPUFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS4sIHJlYXNvbj1yZXF1aXJlZCwgcnBjQ29kZT00MDF9IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS46IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuYXV0aC5BdXRoZW50aWNhdG9ySW50ZXJjZXB0b3IuYWRkQ2hhbGxlbmdlSGVhZGVyKEF1dGhlbnRpY2F0b3JJbnRlcmNlcHRvci5qYXZhOjI2OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmF1dGguQXV0aGVudGljYXRvckludGVyY2VwdG9yLnByb2Nlc3NFcnJvclJlc3BvbnNlKEF1dGhlbnRpY2F0b3JJbnRlcmNlcHRvci5qYXZhOjIzNilcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmF1dGguR2FpYU1pbnRJbnRlcmNlcHRvci5wcm9jZXNzRXJyb3JSZXNwb25zZShHYWlhTWludEludGVyY2VwdG9yLmphdmE6NzY4KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5pbnRlcmNlcHQuQXJvdW5kSW50ZXJjZXB0b3JXcmFwcGVyLnByb2Nlc3NFcnJvclJlc3BvbnNlKEFyb3VuZEludGVyY2VwdG9yV3JhcHBlci5qYXZhOjI4KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc3RhdHMuU3RhdHNCb290c3RyYXAkSW50ZXJjZXB0b3JTdGF0c1JlY29yZGVyLnByb2Nlc3NFcnJvclJlc3BvbnNlKFN0YXRzQm9vdHN0cmFwLmphdmE6MzE1KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5pbnRlcmNlcHQuSW50ZXJjZXB0aW9ucyRBcm91bmRJbnRlcmNlcHRpb24uaGFuZGxlRXJyb3JSZXNwb25zZShJbnRlcmNlcHRpb25zLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5pbnRlcmNlcHQuSW50ZXJjZXB0aW9ucyRBcm91bmRJbnRlcmNlcHRpb24uYWNjZXNzJDIwMChJbnRlcmNlcHRpb25zLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5pbnRlcmNlcHQuSW50ZXJjZXB0aW9ucyRBcm91bmRJbnRlcmNlcHRpb24kMS5jYWxsKEludGVyY2VwdGlvbnMuamF2YToxNDQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLmludGVyY2VwdC5JbnRlcmNlcHRpb25zJEFyb3VuZEludGVyY2VwdGlvbiQxLmNhbGwoSW50ZXJjZXB0aW9ucy5qYXZhOjEzNylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldEV4Y2VwdGlvbihBYnN0cmFjdEZ1dHVyZS5qYXZhOjc1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2OClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1MT0dJTl9SRVFVSVJFRCwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPXVuYXV0aG9yaXplZCwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uUkVRVUlSRUQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9UkVRVUlSRUQsIGVycm9yUHJvdG9Eb21haW49Z2RhdGEuQ29yZUVycm9yRG9tYWluLCBmaWx0ZXJlZE1lc3NhZ2U9bnVsbCwgbG9jYXRpb249ZW50aXR5LmF1dGhlbnRpY2F0ZWRfdXNlciwgbWVzc2FnZT1Bbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249aGVhZGVycy5BdXRob3JpemF0aW9uLCBtZXNzYWdlPUFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS4sIHJlYXNvbj1yZXF1aXJlZCwgcnBjQ29kZT00MDF9IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS46IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0Li4uIDIwIG1vcmVcbiJ9XSwiY29kZSI6NDAxLCJtZXNzYWdlIjoiQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLiJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"db327c92dac99584\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/copy-obj1?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:18 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uoa0LrEhOIeq-iYERbwsOkXjr0QR1ANe3tDsleUqoFNU7fRIruaqYikdnU1svzhc8iGRwx0A5dAGYQ_mM045LN_oxU1c76ugXtnWS2PW8wBcmst7hk\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"e70c028bd3dc9250\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/copy-obj1?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 404,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"12275\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:18 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:18 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqrvFq18HewCbAkJcD7BmKgE8_WOFqSNkcwbpbNqCDPIy5jLVf2fIaHdg76_1rHuAHTtFM84Zr6euptOehRZOqA38Zc_BrJUSZKjg686imvazehpBc\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxIiwiZGVidWdJbmZvIjoiY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6Ok9CSkVDVF9OT1RfRk9VTkQ6IE5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6ODgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmRlbGV0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvcHktb2JqMVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1OT1RfRk9VTkQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6T0JKRUNUX05PVF9GT1VORDogTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YTo4OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZGVsZXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IE5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPW5vdEZvdW5kLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5OT1RfRk9VTkQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpPQkpFQ1RfTk9UX0ZPVU5EOiBObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvcHktb2JqMVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjg4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5kZWxldGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjExMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1OT1RfRk9VTkQsIGVycm9yUHJvdG9Eb21haW49Z2RhdGEuQ29yZUVycm9yRG9tYWluLCBmaWx0ZXJlZE1lc3NhZ2U9bnVsbCwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlX2lkLm5hbWUsIG1lc3NhZ2U9Tm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajEsIHVubmFtZWRBcmd1bWVudHM9W119LCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2VfaWQubmFtZSwgbWVzc2FnZT1ObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvcHktb2JqMSwgcmVhc29uPW5vdEZvdW5kLCBycGNDb2RlPTQwNH0gTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajE6IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpPQkpFQ1RfTk9UX0ZPVU5EOiBObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvcHktb2JqMVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjg4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5kZWxldGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjExMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajEifX0=\"\n      }\n    },\n    {\n      \"ID\": \"4d7120b41e583669\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/copy-obj1?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 404,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"12215\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:18 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:18 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoJ1cGOQjoNiRk8qv-igyccVp3Vg_ut7NLSEO3A-yyQwgGnoXR5jPbi3tuomYWrS57GIvd6GpShkcAYSIJ2e94Jx_1SseYkYtlSF8a7qsDU0OVFYgM\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxIiwiZGVidWdJbmZvIjoiY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6Ok9CSkVDVF9OT1RfRk9VTkQ6IE5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkdldE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0T2JqZWN0LmphdmE6MzA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuR2V0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRPYmplY3QuamF2YTo3MClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5nZXQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjgxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvcHktb2JqMVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1OT1RfRk9VTkQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6T0JKRUNUX05PVF9GT1VORDogTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuR2V0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRPYmplY3QuamF2YTozMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5HZXRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldE9iamVjdC5qYXZhOjcwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmdldChPYmplY3RzRGVsZWdhdG9yLmphdmE6ODEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IE5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPW5vdEZvdW5kLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5OT1RfRk9VTkQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpPQkpFQ1RfTk9UX0ZPVU5EOiBObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvcHktb2JqMVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5HZXRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldE9iamVjdC5qYXZhOjMwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkdldE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0T2JqZWN0LmphdmE6NzApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZ2V0KE9iamVjdHNEZWxlZ2F0b3IuamF2YTo4MSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1OT1RfRk9VTkQsIGVycm9yUHJvdG9Eb21haW49Z2RhdGEuQ29yZUVycm9yRG9tYWluLCBmaWx0ZXJlZE1lc3NhZ2U9bnVsbCwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlX2lkLm5hbWUsIG1lc3NhZ2U9Tm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajEsIHVubmFtZWRBcmd1bWVudHM9W119LCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2VfaWQubmFtZSwgbWVzc2FnZT1ObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvcHktb2JqMSwgcmVhc29uPW5vdEZvdW5kLCBycGNDb2RlPTQwNH0gTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajE6IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpPQkpFQ1RfTk9UX0ZPVU5EOiBObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvcHktb2JqMVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5HZXRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldE9iamVjdC5qYXZhOjMwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkdldE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0T2JqZWN0LmphdmE6NzApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZ2V0KE9iamVjdHNEZWxlZ2F0b3IuamF2YTo4MSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajEifX0=\"\n      }\n    },\n    {\n      \"ID\": \"e7711da9b067a58f\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/composed1/compose?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"156\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6Im9iajEifSx7Im5hbWUiOiJvYmoyIn0seyJuYW1lIjoib2JqL3dpdGgvc2xhc2hlcyJ9XX0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"750\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:19 GMT\"\n          ],\n          \"Etag\": [\n            \"CI2048Lx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoJ5Us6Rp03fUUqSAPFFGPuqW2qR4gCfzJ4w3W1Kx8C0JGfNDxte0QlBoVEi4K7rV5zkUY1IXQvIk6FOU3DxP8ECZdxkVJBW57Jf5iXo8kRyLVu7OA\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb21wb3NlZDEvMTU1NjgzNTg1ODk2Mjk1NyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbXBvc2VkMSIsIm5hbWUiOiJjb21wb3NlZDEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1ODk2Mjk1NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxOC45NjJaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTguOTYyWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE4Ljk2MloiLCJzaXplIjoiNDgiLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29tcG9zZWQxP2dlbmVyYXRpb249MTU1NjgzNTg1ODk2Mjk1NyZhbHQ9bWVkaWEiLCJjcmMzMmMiOiJBYldCeVE9PSIsImNvbXBvbmVudENvdW50IjozLCJldGFnIjoiQ0kyMDQ4THgvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"de5d78de4310ff60\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/composed1\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"48\"\n          ],\n          \"Content-Type\": [\n            \"application/octet-stream\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:19 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"-CI2048Lx/eECEAE=\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:19 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:18 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Component-Count\": [\n            \"3\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:18 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835858962957\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=AbWByQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"48\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqprnxhGEtAMeMcwiKn43QTEdsHrB7k_jCjOqnvH984bk5CIjIhSalrDVNwlLb37IU67jIYyIY1Nq8uaSz5HGUROWwpE6SVmGvIGXnuAbTP7x8Ez5w\"\n          ]\n        },\n        \"Body\": \"TuDshcL7vdCAXh8L42NvEeeRmd+w7xhUEtz55BCr9yaRPt+QxetF2uGfY/b4R5Pm\"\n      }\n    },\n    {\n      \"ID\": \"4b7c14a3f35089ce\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/composed2/compose?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"182\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjb250ZW50VHlwZSI6InRleHQvanNvbiJ9LCJzb3VyY2VPYmplY3RzIjpbeyJuYW1lIjoib2JqMSJ9LHsibmFtZSI6Im9iajIifSx7Im5hbWUiOiJvYmovd2l0aC9zbGFzaGVzIn1dfQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"776\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:19 GMT\"\n          ],\n          \"Etag\": [\n            \"CP+RiMPx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrMYc2wH1kAYUthDQQhZ4gGQU6kYXq6KGs1msu9ifujWYQ2dwS5ifqZFWiTYf74Rq2y9VkzALfhjkTK6anDL-SwHxUH3IwMe8j1rrrbaMbv7eLQCR8\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb21wb3NlZDIvMTU1NjgzNTg1OTU2NDc5OSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbXBvc2VkMiIsIm5hbWUiOiJjb21wb3NlZDIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1OTU2NDc5OSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9qc29uIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE5LjU2NFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxOS41NjRaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTkuNTY0WiIsInNpemUiOiI0OCIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb21wb3NlZDI/Z2VuZXJhdGlvbj0xNTU2ODM1ODU5NTY0Nzk5JmFsdD1tZWRpYSIsImNyYzMyYyI6IkFiV0J5UT09IiwiY29tcG9uZW50Q291bnQiOjMsImV0YWciOiJDUCtSaU1QeC9lRUNFQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"26a4cb091ed2f1bd\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/composed2\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"48\"\n          ],\n          \"Content-Type\": [\n            \"text/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:19 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"-CP+RiMPx/eECEAE=\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:19 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:19 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Component-Count\": [\n            \"3\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:19 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835859564799\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=AbWByQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"48\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur-t-yqapXjBzjIrFWFhaT080f06JahbskCp0DC_-izUjPK4fYn556m2qyRDgj9HjkkDPtKR6dauzF5afjNZZ61bN_dTvw15d82A206-SdS1Jv_YM4\"\n          ]\n        },\n        \"Body\": \"TuDshcL7vdCAXh8L42NvEeeRmd+w7xhUEtz55BCr9yaRPt+QxetF2uGfY/b4R5Pm\"\n      }\n    },\n    {\n      \"ID\": \"6b59ed7d3d098970\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjb250ZW50RW5jb2RpbmciOiJnemlwIiwibmFtZSI6Imd6aXAtdGVzdCJ9Cg==\",\n          \"H4sIAAAAAAAA/2IgEgACAAD//7E97OkoAAAA\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3227\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:20 GMT\"\n          ],\n          \"Etag\": [\n            \"CNuJssPx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoXNmswaWh2Gfcz1pYPy7etwk09Nz_dmuYVq55M2p3ox38A3mC0QgoHf-hL1uCZxQvusJSIHeugTQvmCgZvRdXV-3juD0W8KI669m0EILAHSfnVoJ8\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9nemlwLXRlc3QvMTU1NjgzNTg2MDI1MTg2NyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2d6aXAtdGVzdCIsIm5hbWUiOiJnemlwLXRlc3QiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2MDI1MTg2NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24veC1nemlwIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjIwLjI1MVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyMC4yNTFaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjAuMjUxWiIsInNpemUiOiIyNyIsIm1kNUhhc2giOiJPdEN3K2FSUklScUtHRkFFT2F4K3F3PT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vZ3ppcC10ZXN0P2dlbmVyYXRpb249MTU1NjgzNTg2MDI1MTg2NyZhbHQ9bWVkaWEiLCJjb250ZW50RW5jb2RpbmciOiJnemlwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvZ3ppcC10ZXN0LzE1NTY4MzU4NjAyNTE4NjcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vZ3ppcC10ZXN0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJnemlwLXRlc3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2MDI1MTg2NyIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTnVKc3NQeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvZ3ppcC10ZXN0LzE1NTY4MzU4NjAyNTE4NjcvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2d6aXAtdGVzdC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imd6aXAtdGVzdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODYwMjUxODY3IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ051SnNzUHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2d6aXAtdGVzdC8xNTU2ODM1ODYwMjUxODY3L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9nemlwLXRlc3QvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJnemlwLXRlc3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2MDI1MTg2NyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTnVKc3NQeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvZ3ppcC10ZXN0LzE1NTY4MzU4NjAyNTE4NjcvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2d6aXAtdGVzdC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imd6aXAtdGVzdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODYwMjUxODY3IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ051SnNzUHgvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiI5RGh3QkE9PSIsImV0YWciOiJDTnVKc3NQeC9lRUNFQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"070a9af78f7967bf\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/gzip-test\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"none\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Type\": [\n            \"application/x-gzip\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:20 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:20 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:20 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Accept-Encoding\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:20 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835860251867\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=9DhwBA==\",\n            \"md5=OtCw+aRRIRqKGFAEOax+qw==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"gzip\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"27\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UosPALnXk-3j5nBlDDWX7hBP4xBNcCe7lGNkEU-sHHTWsRexFWLoB-1gn8RfnlqS6Q5ZTrR86NBxpP1T0bFxgHnlYUYGh-G3mThRCgGIAWjXggOeOU\"\n          ]\n        },\n        \"Body\": \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\"\n      }\n    },\n    {\n      \"ID\": \"3ece6665583d65fb\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj-not-exists\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 404,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"225\"\n          ],\n          \"Content-Type\": [\n            \"application/xml; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:20 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:20 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uph0zmuYk7ZmOWzbNkj24Iai85wz2vKj0mMnMkIHIoDUlDAUCA0e_CgFT5fV_XAvgUx06I9FspomkB_ImflSVCvj55GK6zEoY5iV1hN96nh4AmPBN0\"\n          ]\n        },\n        \"Body\": \"PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+Tm9TdWNoS2V5PC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQga2V5IGRvZXMgbm90IGV4aXN0LjwvTWVzc2FnZT48RGV0YWlscz5ObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai1ub3QtZXhpc3RzPC9EZXRhaWxzPjwvRXJyb3I+\"\n      }\n    },\n    {\n      \"ID\": \"602f4fdfff4e490c\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoic2lnbmVkVVJMIn0K\",\n          \"VGhpcyBpcyBhIHRlc3Qgb2YgU2lnbmVkVVJMLgo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3230\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:21 GMT\"\n          ],\n          \"Etag\": [\n            \"CNat6MPx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoWSi2VcVAHJJzhGSPjVT17kZYaCh3uZvWXBU0R4hVmPZJ10gvbv_Ucrfd2kwrBvRYoZaQcYkY5Q3M-oywiCNtLm6SM9InWHz2Omc-0pWJJjfQWPCM\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zaWduZWRVUkwvMTU1NjgzNTg2MTE0MTIwNiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NpZ25lZFVSTCIsIm5hbWUiOiJzaWduZWRVUkwiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2MTE0MTIwNiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyMS4xNDBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjEuMTQwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjIxLjE0MFoiLCJzaXplIjoiMjkiLCJtZDVIYXNoIjoiSnl4dmd3bTluMk1zckdUTVBiTWVZQT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NpZ25lZFVSTD9nZW5lcmF0aW9uPTE1NTY4MzU4NjExNDEyMDYmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvc2lnbmVkVVJMLzE1NTY4MzU4NjExNDEyMDYvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc2lnbmVkVVJML2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJzaWduZWRVUkwiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2MTE0MTIwNiIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTmF0Nk1QeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvc2lnbmVkVVJMLzE1NTY4MzU4NjExNDEyMDYvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NpZ25lZFVSTC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNpZ25lZFVSTCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODYxMTQxMjA2IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ05hdDZNUHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3NpZ25lZFVSTC8xNTU2ODM1ODYxMTQxMjA2L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9zaWduZWRVUkwvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJzaWduZWRVUkwiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2MTE0MTIwNiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTmF0Nk1QeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvc2lnbmVkVVJMLzE1NTY4MzU4NjExNDEyMDYvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NpZ25lZFVSTC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNpZ25lZFVSTCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODYxMTQxMjA2IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ05hdDZNUHgvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJaVHFBTHc9PSIsImV0YWciOiJDTmF0Nk1QeC9lRUNFQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"4a1c9dc802f4427c\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/defaultObjectAcl/domain-google.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"107\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"119\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:23 GMT\"\n          ],\n          \"Etag\": [\n            \"CAc=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrbFZENfdiDkKpD_H_zm44x7h5bTZ3VD6MEoiiXuMwxHHK-zCSSoPRA2ALNUXoR3EcS1c-huuyZBIiw7ULKii7BNqKz0RMu4lWRxrDRQBOjGwKDDgE\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDQWM9In0=\"\n      }\n    },\n    {\n      \"ID\": \"e12cb7360f4fd8dd\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/defaultObjectAcl?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"684\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:23 GMT\"\n          ],\n          \"Etag\": [\n            \"CAc=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:23 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrVJI9g41JQEDEgaIAOXKSCe2B8xklFKSoIciM7uC0uod7t7NzXfxsIrI6mQeZGkWa2B12xdKpSJBndrNbBvygZ6aXxpBBvL8d80NJ42u8KQC7AaFE\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBYz0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQWM9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBYz0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNBYz0ifV19\"\n      }\n    },\n    {\n      \"ID\": \"d25b1dc2d7247768\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoiYWNsMSJ9Cg==\",\n          \"/pXmp0sD+azbBKjod9MhwQ==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3631\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:24 GMT\"\n          ],\n          \"Etag\": [\n            \"COr+pcXx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UosBTMUgCzCYlGDKqRCN7Kexl832zyi4FxoRqfYtmTr8yv63z4BAQBeCTLajyZqMbRyzjje7TtPPYomUSv_8zrQ8bFdXlNzbTSeKK8kXi2Ys82jus4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wxLzE1NTY4MzU4NjQyNDgxNzAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wxIiwibmFtZSI6ImFjbDEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDI0ODE3MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjI0LjI0N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyNC4yNDdaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjQuMjQ3WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiIwRTl0Rk5wWmowL1dLT0o2ZlY5cGF3PT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMT9nZW5lcmF0aW9uPTE1NTY4MzU4NjQyNDgxNzAmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMS8xNTU2ODM1ODY0MjQ4MTcwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDEvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFjbDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDI0ODE3MCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT3IrcGNYeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMS8xNTU2ODM1ODY0MjQ4MTcwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wxL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYWNsMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY0MjQ4MTcwIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ09yK3BjWHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbDEvMTU1NjgzNTg2NDI0ODE3MC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFjbDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDI0ODE3MCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT3IrcGNYeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMS8xNTU2ODM1ODY0MjQ4MTcwL2RvbWFpbi1nb29nbGUuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMS9hY2wvZG9tYWluLWdvb2dsZS5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJhY2wxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjQyNDgxNzAiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNPcitwY1h4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wxLzE1NTY4MzU4NjQyNDgxNzAvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDEvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJhY2wxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjQyNDgxNzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT3IrcGNYeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IkZpRG1WZz09IiwiZXRhZyI6IkNPcitwY1h4L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"1d3df0d90130f5fe\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoiYWNsMiJ9Cg==\",\n          \"HSHw5Wsm5u7iJL/jjKkPVQ==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3631\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:24 GMT\"\n          ],\n          \"Etag\": [\n            \"CJrxw8Xx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpMl0_NB41LujALQWmul06CCiuw7okuKlhYG_qilsoXlld2qoYgc2-ABYogriA37QOJMK5ZlJ5sYzP2Mp7CTSzK9uccFLi10TdrGFMUjUpD0OvcXrE\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wyLzE1NTY4MzU4NjQ3Mzc5NDYiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wyIiwibmFtZSI6ImFjbDIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDczNzk0NiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjI0LjczN1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyNC43MzdaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjQuNzM3WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJjOStPL3JnMjRIVEZCYytldFdqZWZnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMj9nZW5lcmF0aW9uPTE1NTY4MzU4NjQ3Mzc5NDYmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMi8xNTU2ODM1ODY0NzM3OTQ2L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFjbDIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDczNzk0NiIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSnJ4dzhYeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMi8xNTU2ODM1ODY0NzM3OTQ2L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wyL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYWNsMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY0NzM3OTQ2IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0pyeHc4WHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbDIvMTU1NjgzNTg2NDczNzk0Ni9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFjbDIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDczNzk0NiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSnJ4dzhYeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMi8xNTU2ODM1ODY0NzM3OTQ2L2RvbWFpbi1nb29nbGUuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMi9hY2wvZG9tYWluLWdvb2dsZS5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJhY2wyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjQ3Mzc5NDYiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNKcnh3OFh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wyLzE1NTY4MzU4NjQ3Mzc5NDYvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDIvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJhY2wyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjQ3Mzc5NDYiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSnJ4dzhYeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IkF0TlJ0QT09IiwiZXRhZyI6IkNKcnh3OFh4L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"a270daf4f72d9d3d\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/acl1/acl?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2767\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:25 GMT\"\n          ],\n          \"Etag\": [\n            \"COr+pcXx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:25 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UranlihhkPcnPzTT2UYs4r6Hritk60lULu-pzO6YX-EWIlMlFiXzKmxaZVgOcPfnCgfJsRktKsL_TbFun1PfupraBREfYklCvRXKvJ_526gW-Jf9zs\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMS8xNTU2ODM1ODY0MjQ4MTcwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDEvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFjbDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDI0ODE3MCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT3IrcGNYeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMS8xNTU2ODM1ODY0MjQ4MTcwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wxL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYWNsMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY0MjQ4MTcwIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ09yK3BjWHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbDEvMTU1NjgzNTg2NDI0ODE3MC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFjbDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDI0ODE3MCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT3IrcGNYeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMS8xNTU2ODM1ODY0MjQ4MTcwL2RvbWFpbi1nb29nbGUuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMS9hY2wvZG9tYWluLWdvb2dsZS5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJhY2wxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjQyNDgxNzAiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNPcitwY1h4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wxLzE1NTY4MzU4NjQyNDgxNzAvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDEvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJhY2wxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjQyNDgxNzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT3IrcGNYeC9lRUNFQUU9In1dfQ==\"\n      }\n    },\n    {\n      \"ID\": \"328125b2bc991e95\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/acl1/acl/domain-google.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:25 GMT\"\n          ],\n          \"Etag\": [\n            \"COr+pcXx/eECEAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UosP78wuW4e1mPLJgcCbCxBC4Je5LWjKugd0fVK51u-P3qeXbQXj4_Amo25ZHyut2LZvoipvmK95xEvebSyVyzVydKyU2VSbHLDkwnRpR-nr9UGIf0\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"1c7595376917851f\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/defaultObjectAcl/domain-google.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:26 GMT\"\n          ],\n          \"Etag\": [\n            \"CAg=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqnZXiLrdCFoctnkKUqdvXLdSp9xumFk20gsRJc4xB1CTZ14aLZYwbDJmi90E28Q2_E4klaJBOaB1OCcpbDBoF1N9E9Bk3VEaNYYrHKMoECuO7RMPs\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"4183198b151a3557\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/acl/user-jbd%40google.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"109\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJ1c2VyLWpiZEBnb29nbGUuY29tIiwicm9sZSI6IlJFQURFUiJ9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"386\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:27 GMT\"\n          ],\n          \"Etag\": [\n            \"CAk=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uo361-YkcyyOvd5CL4q3LgTM1Bk4RdkPY3cn-qOm6Dn0vghTnmIE9VKkzGiOnjRNnD7SWXGMqpxaCGvCt6P44D55PqOwAtVTF8PNwmEK9HWCoVXABo\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvdXNlci1qYmRAZ29vZ2xlLmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvdXNlci1qYmRAZ29vZ2xlLmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImVudGl0eSI6InVzZXItamJkQGdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZW1haWwiOiJqYmRAZ29vZ2xlLmNvbSIsImV0YWciOiJDQWs9In0=\"\n      }\n    },\n    {\n      \"ID\": \"e98f53a71d8839c9\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/acl?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"1789\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:28 GMT\"\n          ],\n          \"Etag\": [\n            \"CAk=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:28 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrqACfvLjoBUrCN_6ksyMdPlv7yPWQGo1D9u1UiCCgFDRlEwr6NOp18BSxaeTuMIabf2ciNj7_Ba1W6YCz64HlcYyQOoEXNfGYGKcAqGTubXsGHPVk\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FrPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQWs9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQWs9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvdXNlci1qYmRAZ29vZ2xlLmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvdXNlci1qYmRAZ29vZ2xlLmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImVudGl0eSI6InVzZXItamJkQGdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZW1haWwiOiJqYmRAZ29vZ2xlLmNvbSIsImV0YWciOiJDQWs9In1dfQ==\"\n      }\n    },\n    {\n      \"ID\": \"28b9a29086758e65\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/acl/user-jbd%40google.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:28 GMT\"\n          ],\n          \"Etag\": [\n            \"CAo=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UozsFdtI43Ltv91E18-CrdRZ4pQDVZXReJOVhpWDu3mxNA7rrWU7hNGl4kPMd0FgcVWDigZA5JBNsYbFV113Ew6Cp2uTsuk0uI1io_mhA6-Lmd2h18\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"8ef9f7b6caefd750\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoiZ29waGVyIn0K\",\n          \"ZGF0YQ==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3196\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:29 GMT\"\n          ],\n          \"Etag\": [\n            \"CIXH3cfx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uo97hrh9l4pmrJQqaH8Qu3axsdbEPH2Y8GSEso8-ExKuf4ot8o2uS79ROJcgCtql4vLQJ_4L8q0Z7E9E2WYbbl6vKUYKdQiCI0POisS9o_ViNh9-Yk\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9nb3BoZXIvMTU1NjgzNTg2OTM1MjgzNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2dvcGhlciIsIm5hbWUiOiJnb3BoZXIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2OTM1MjgzNyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyOS4zNTJaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjkuMzUyWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjI5LjM1MloiLCJzaXplIjoiNCIsIm1kNUhhc2giOiJqWGQvT0YwOS9zaUJYU0QzU1dBbTNBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vZ29waGVyP2dlbmVyYXRpb249MTU1NjgzNTg2OTM1MjgzNyZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9nb3BoZXIvMTU1NjgzNTg2OTM1MjgzNy9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9nb3BoZXIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImdvcGhlciIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY5MzUyODM3IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNJWEgzY2Z4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9nb3BoZXIvMTU1NjgzNTg2OTM1MjgzNy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vZ29waGVyL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiZ29waGVyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjkzNTI4MzciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSVhIM2NmeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvZ29waGVyLzE1NTY4MzU4NjkzNTI4MzcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2dvcGhlci9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImdvcGhlciIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY5MzUyODM3IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNJWEgzY2Z4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9nb3BoZXIvMTU1NjgzNTg2OTM1MjgzNy91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vZ29waGVyL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiZ29waGVyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjkzNTI4MzciLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSVhIM2NmeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6InJ0aDkwUT09IiwiZXRhZyI6IkNJWEgzY2Z4L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"ae3a5920bc8a9c3c\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoi0JPQvtGE0LXRgNC+0LLQuCJ9Cg==\",\n          \"ZGF0YQ==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3548\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:29 GMT\"\n          ],\n          \"Etag\": [\n            \"CPzK+8fx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrPLZGQqU8j04JqxMmfsqas3HGTlrdx5NM99YR5nCedJYGMSaZ1ynvd2UbUcdwps_gfRo__0XapzHuD3hM_bshff65qlnw_i2cOwp97N2EhfUsZ1X4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS/Qk9C+0YTQtdGA0L7QstC4LzE1NTY4MzU4Njk4NDQ4NjAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby8lRDAlOTMlRDAlQkUlRDElODQlRDAlQjUlRDElODAlRDAlQkUlRDAlQjIlRDAlQjgiLCJuYW1lIjoi0JPQvtGE0LXRgNC+0LLQuCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY5ODQ0ODYwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjI5Ljg0NFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyOS44NDRaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjkuODQ0WiIsInNpemUiOiI0IiwibWQ1SGFzaCI6ImpYZC9PRjA5L3NpQlhTRDNTV0FtM0E9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby8lRDAlOTMlRDAlQkUlRDElODQlRDAlQjUlRDElODAlRDAlQkUlRDAlQjIlRDAlQjg/Z2VuZXJhdGlvbj0xNTU2ODM1ODY5ODQ0ODYwJmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL9CT0L7RhNC10YDQvtCy0LgvMTU1NjgzNTg2OTg0NDg2MC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby8lRDAlOTMlRDAlQkUlRDElODQlRDAlQjUlRDElODAlRDAlQkUlRDAlQjIlRDAlQjgvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ItCT0L7RhNC10YDQvtCy0LgiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2OTg0NDg2MCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDUHpLKzhmeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEv0JPQvtGE0LXRgNC+0LLQuC8xNTU2ODM1ODY5ODQ0ODYwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby8lRDAlOTMlRDAlQkUlRDElODQlRDAlQjUlRDElODAlRDAlQkUlRDAlQjIlRDAlQjgvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiLQk9C+0YTQtdGA0L7QstC4IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4Njk4NDQ4NjAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDUHpLKzhmeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEv0JPQvtGE0LXRgNC+0LLQuC8xNTU2ODM1ODY5ODQ0ODYwL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby8lRDAlOTMlRDAlQkUlRDElODQlRDAlQjUlRDElODAlRDAlQkUlRDAlQjIlRDAlQjgvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiLQk9C+0YTQtdGA0L7QstC4IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4Njk4NDQ4NjAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ1B6Sys4ZngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL9CT0L7RhNC10YDQvtCy0LgvMTU1NjgzNTg2OTg0NDg2MC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vJUQwJTkzJUQwJUJFJUQxJTg0JUQwJUI1JUQxJTgwJUQwJUJFJUQwJUIyJUQwJUI4L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoi0JPQvtGE0LXRgNC+0LLQuCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY5ODQ0ODYwIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ1B6Sys4ZngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJydGg5MFE9PSIsImV0YWciOiJDUHpLKzhmeC9lRUNFQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"0104a746dbe20580\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoiYSJ9Cg==\",\n          \"ZGF0YQ==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3116\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:30 GMT\"\n          ],\n          \"Etag\": [\n            \"COKVlMjx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqY12miALkWDvx8PHEyL23oxWZlw8Jq7Cn6kS8E8_Tn1tTWWoTuS_pWb5pi9qevCIvqK6aTK56MzwrMuy9axIjpw5yyMZ42MaWK_YFkBr95OnK5IbM\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hLzE1NTY4MzU4NzAyNDc2NTAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hIiwibmFtZSI6ImEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MDI0NzY1MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozMC4yNDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzAuMjQ3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjMwLjI0N1oiLCJzaXplIjoiNCIsIm1kNUhhc2giOiJqWGQvT0YwOS9zaUJYU0QzU1dBbTNBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYT9nZW5lcmF0aW9uPTE1NTY4MzU4NzAyNDc2NTAmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYS8xNTU2ODM1ODcwMjQ3NjUwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2EvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MDI0NzY1MCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT0tWbE1qeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYS8xNTU2ODM1ODcwMjQ3NjUwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODcwMjQ3NjUwIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ09LVmxNangvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2EvMTU1NjgzNTg3MDI0NzY1MC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MDI0NzY1MCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT0tWbE1qeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYS8xNTU2ODM1ODcwMjQ3NjUwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODcwMjQ3NjUwIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09LVmxNangvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJydGg5MFE9PSIsImV0YWciOiJDT0tWbE1qeC9lRUNFQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"da19af085be0fb47\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSJ9Cg==\",\n          \"ZGF0YQ==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"19484\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:30 GMT\"\n          ],\n          \"Etag\": [\n            \"CLmmusjx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrAJr55dqTDkY_jBKB0vAWyE0owtzB_kEoH91_FKTr9C3bHd8fWUiTrsruL5mgwXg2l8gbPiOXad-A9HIJ3Zt_AeXq_p0m-Q8LrHQqJ6sAKsbzV4Zw\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLzE1NTY4MzU4NzA4NzIzNzciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIiwibmFtZSI6ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MDg3MjM3NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozMC44NzJaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzAuODcyWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjMwLjg3MloiLCJzaXplIjoiNCIsIm1kNUhhc2giOiJqWGQvT0YwOS9zaUJYU0QzU1dBbTNBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYT9nZW5lcmF0aW9uPTE1NTY4MzU4NzA4NzIzNzcmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS8xNTU2ODM1ODcwODcyMzc3L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MDg3MjM3NyIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTG1tdXNqeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS8xNTU2ODM1ODcwODcyMzc3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODcwODcyMzc3IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0xtbXVzangvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEvMTU1NjgzNTg3MDg3MjM3Ny9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MDg3MjM3NyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTG1tdXNqeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS8xNTU2ODM1ODcwODcyMzc3L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODcwODcyMzc3IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0xtbXVzangvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJydGg5MFE9PSIsImV0YWciOiJDTG1tdXNqeC9lRUNFQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"96f915707a76c50c\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAifQo=\",\n          \"ZGF0YQ==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"2948\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:31 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrQIwi81TFCNpDIZUjs_5tSUFqURLnaBF7g2l1sGMuHCTWZeLyr45VWkcc8fUDYnF-P84QixYQbTzJGuJzOOx7mw1qluYDqoORFGPICfvKmNxrZM3A\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IlJlcXVpcmVkIiwiZGVidWdJbmZvIjoiY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89bnVsbCwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWJhZFJlcXVlc3QsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLlJFUVVJUkVELCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1udWxsLCBlcnJvclByb3RvQ29kZT1SRVFVSVJFRCwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuaWQubmFtZSwgbWVzc2FnZT1udWxsLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlLmlkLm5hbWUsIG1lc3NhZ2U9UmVxdWlyZWQsIHJlYXNvbj1yZXF1aXJlZCwgcnBjQ29kZT00MDB9IFJlcXVpcmVkXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDAwLCJtZXNzYWdlIjoiUmVxdWlyZWQifX0=\"\n      }\n    },\n    {\n      \"ID\": \"7a562d6e65ef8a7a\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEifQo=\",\n          \"ZGF0YQ==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"4785\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:31 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ups-3Re4_9njFMmkYwND6BuK5cgxs5tKVRwQ2CGkcks-K0aALbethXTYaEb6fLos6w_FSnM8YkPGM3TETCAoyYpVbQPlotXR9CH3DXngjQNv0yv_ZQ\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImludmFsaWQiLCJtZXNzYWdlIjoiVGhlIG1heGltdW0gb2JqZWN0IGxlbmd0aCBpcyAxMDI0IGNoYXJhY3RlcnMsIGJ1dCBnb3QgYSBuYW1lIHdpdGggMTAyNSBjaGFyYWN0ZXJzOiAnJ2FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLi4uJyciLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9SU5WQUxJRF9WQUxVRSwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPW51bGwsIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5JTlZBTElEX1ZBTFVFLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1udWxsLCBlcnJvclByb3RvQ29kZT1JTlZBTElEX1ZBTFVFLCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5pZC5uYW1lLCBtZXNzYWdlPVRoZSBtYXhpbXVtIG9iamVjdCBsZW5ndGggaXMgMTAyNCBjaGFyYWN0ZXJzLCBidXQgZ290IGEgbmFtZSB3aXRoIDEwMjUgY2hhcmFjdGVyczogJydhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS4uLicnLCB1bm5hbWVkQXJndW1lbnRzPVthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV19LCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuaWQubmFtZSwgbWVzc2FnZT1UaGUgbWF4aW11bSBvYmplY3QgbGVuZ3RoIGlzIDEwMjQgY2hhcmFjdGVycywgYnV0IGdvdCBhIG5hbWUgd2l0aCAxMDI1IGNoYXJhY3RlcnM6ICcnYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEuLi4nJywgcmVhc29uPWludmFsaWQsIHJwY0NvZGU9NDAwfSBUaGUgbWF4aW11bSBvYmplY3QgbGVuZ3RoIGlzIDEwMjQgY2hhcmFjdGVycywgYnV0IGdvdCBhIG5hbWUgd2l0aCAxMDI1IGNoYXJhY3RlcnM6ICcnYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEuLi4nJ1xuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMCwibWVzc2FnZSI6IlRoZSBtYXhpbXVtIG9iamVjdCBsZW5ndGggaXMgMTAyNCBjaGFyYWN0ZXJzLCBidXQgZ290IGEgbmFtZSB3aXRoIDEwMjUgY2hhcmFjdGVyczogJydhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS4uLicnIn19\"\n      }\n    },\n    {\n      \"ID\": \"239b642e1919a84a\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoibmV3XG5saW5lcyJ9Cg==\",\n          \"ZGF0YQ==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"3270\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:31 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Urk-XOPoshQkyIHYZp241R2W5lOuLwqPMx606rubzPOaGggM2z_sZO93dYCJHffXuPDOjy64lIxrBXIYW4QT04eM932jPtzPdVd-PFWssV9RYk83JE\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImludmFsaWQiLCJtZXNzYWdlIjoiRGlzYWxsb3dlZCB1bmljb2RlIGNoYXJhY3RlcnMgcHJlc2VudCBpbiBvYmplY3QgbmFtZSAnJ25ld1xubGluZXMnJyIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1JTlZBTElEX1ZBTFVFLCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89bnVsbCwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWJhZFJlcXVlc3QsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLklOVkFMSURfVkFMVUUsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPW51bGwsIGVycm9yUHJvdG9Db2RlPUlOVkFMSURfVkFMVUUsIGVycm9yUHJvdG9Eb21haW49Z2RhdGEuQ29yZUVycm9yRG9tYWluLCBmaWx0ZXJlZE1lc3NhZ2U9bnVsbCwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlLmlkLm5hbWUsIG1lc3NhZ2U9RGlzYWxsb3dlZCB1bmljb2RlIGNoYXJhY3RlcnMgcHJlc2VudCBpbiBvYmplY3QgbmFtZSAnJ25ld1xubGluZXMnJywgdW5uYW1lZEFyZ3VtZW50cz1bbmV3XG5saW5lc119LCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuaWQubmFtZSwgbWVzc2FnZT1EaXNhbGxvd2VkIHVuaWNvZGUgY2hhcmFjdGVycyBwcmVzZW50IGluIG9iamVjdCBuYW1lICcnbmV3XG5saW5lcycnLCByZWFzb249aW52YWxpZCwgcnBjQ29kZT00MDB9IERpc2FsbG93ZWQgdW5pY29kZSBjaGFyYWN0ZXJzIHByZXNlbnQgaW4gb2JqZWN0IG5hbWUgJyduZXdcbmxpbmVzJydcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJEaXNhbGxvd2VkIHVuaWNvZGUgY2hhcmFjdGVycyBwcmVzZW50IGluIG9iamVjdCBuYW1lICcnbmV3XG5saW5lcycnIn19\"\n      }\n    },\n    {\n      \"ID\": \"3cd795cb0b675f98\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:31 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpOXjD9T_c_FRByyyA-CjE753kXZefEzIwQdrNG6OewoHOvKC3Bb9LleziQ6-ymVDg-F1S1eeQeFNJH7nJxDsdA_VmxOjeBzTDB_F3--_1NtwMF6Do\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"361d4541e2cb460a\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/a?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:31 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpomJFlpfOIJoFvdCmQgD2dRXSREzV1ToI2ntcHi8I9tSyzMCUk0ZrytllkwR_nU8WFZ0YuXVl0Kwsq1EhJL85RlBgCkBNc1P-yVMyNbdt5YrooKok\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"a4e929446e49411d\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/%D0%93%D0%BE%D1%84%D0%B5%D1%80%D0%BE%D0%B2%D0%B8?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:31 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqmdInqhuXhUxVjtfRvXvHd6Rmo1ODUbeNFFTBW4diuT7HDjzmYnvd4TU6oJPqbck52yFAR99fMx4Tks1TllSUCB4GsMVbBNENfZU6te-hXIB8XyJs\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"89b2ef62a071f7b9\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/gopher?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:32 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrRgapcSgK1GOswXS37Vynb9BRj0go8bNPOBtrFZ3TDr-nzIdlvKBQuwHtXl4Tlb-mLl-A65zL5Iw3unCEuy6lwtWl5-V7REtcIVHkrWLK5AoLoHqA\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"ca91b2e4ee4555cb\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoiY29udGVudCJ9Cg==\",\n          \"SXQgd2FzIHRoZSBiZXN0IG9mIHRpbWVzLCBpdCB3YXMgdGhlIHdvcnN0IG9mIHRpbWVzLg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3213\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:32 GMT\"\n          ],\n          \"Etag\": [\n            \"CLGNmsnx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UovWW5HSrWbcvQoWGU3c_n64wwcau06tjEM-fzdADFSbmmylG3VLjae6MRNIM4B9gDitCKfjo1_xPQNAZEmMYzRplVmdI4cIrBC8ursFSUywoCSJeU\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzI0NDIwMzMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50IiwibmFtZSI6ImNvbnRlbnQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MjQ0MjAzMyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozMi40NDFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzIuNDQxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjMyLjQ0MVoiLCJzaXplIjoiNTIiLCJtZDVIYXNoIjoiSzI4NUF3S1dXZlZSZEJjQ1VYaHpOZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQ/Z2VuZXJhdGlvbj0xNTU2ODM1ODcyNDQyMDMzJmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3MjQ0MjAzMy9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzI0NDIwMzMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xHTm1zbngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3MjQ0MjAzMy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MjQ0MjAzMyIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMR05tc254L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzI0NDIwMzMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzI0NDIwMzMiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xHTm1zbngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3MjQ0MjAzMy91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MjQ0MjAzMyIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMR05tc254L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiRmNYTThRPT0iLCJldGFnIjoiQ0xHTm1zbngvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"eb678345630fe080\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/content?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3213\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:32 GMT\"\n          ],\n          \"Etag\": [\n            \"CLGNmsnx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrtPOErXGrnlQtXCV1PhgO5nz80m75Fzs7DoR-y8Ava3jvL9NDJ4L-i8SIV_tktR8VqCvv9uh-X1ltJCj3isa_oY8TlV-OsZeIiESuDrRTYueQWQP0\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzI0NDIwMzMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50IiwibmFtZSI6ImNvbnRlbnQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MjQ0MjAzMyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozMi40NDFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzIuNDQxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjMyLjQ0MVoiLCJzaXplIjoiNTIiLCJtZDVIYXNoIjoiSzI4NUF3S1dXZlZSZEJjQ1VYaHpOZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQ/Z2VuZXJhdGlvbj0xNTU2ODM1ODcyNDQyMDMzJmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3MjQ0MjAzMy9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzI0NDIwMzMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xHTm1zbngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3MjQ0MjAzMy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MjQ0MjAzMyIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMR05tc254L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzI0NDIwMzMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzI0NDIwMzMiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xHTm1zbngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3MjQ0MjAzMy91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MjQ0MjAzMyIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMR05tc254L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiRmNYTThRPT0iLCJldGFnIjoiQ0xHTm1zbngvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"d76ba152a62e7dc1\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoiY29udGVudCJ9Cg==\",\n          \"PGh0bWw+PGhlYWQ+PHRpdGxlPk15IGZpcnN0IHBhZ2U8L3RpdGxlPjwvaGVhZD48L2h0bWw+\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3212\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:33 GMT\"\n          ],\n          \"Etag\": [\n            \"CLPJv8nx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqk5XoKCyt74JBpeU8oREfzh3e0LLtXupBjcWtsFfHNZDEn4DjcmzWo6resyQ1gEisBp_STlU4hVaU3MbTyX3LM443_Gsu4ouZGdf3ZTvTzsLD_zNw\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzMwNTU5MjMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50IiwibmFtZSI6ImNvbnRlbnQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MzA1NTkyMyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjMzLjA1NVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozMy4wNTVaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzMuMDU1WiIsInNpemUiOiI1NCIsIm1kNUhhc2giOiJOOHA4L3M5RndkQUFubHZyL2xFQWpRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudD9nZW5lcmF0aW9uPTE1NTY4MzU4NzMwNTU5MjMmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczMDU1OTIzL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MzA1NTkyMyIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTFBKdjhueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczMDU1OTIzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODczMDU1OTIzIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0xQSnY4bngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3MzA1NTkyMy9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MzA1NTkyMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTFBKdjhueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczMDU1OTIzL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODczMDU1OTIzIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0xQSnY4bngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJHb1Vic1E9PSIsImV0YWciOiJDTFBKdjhueC9lRUNFQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"f785ed7f0490bb6d\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/content?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3212\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:33 GMT\"\n          ],\n          \"Etag\": [\n            \"CLPJv8nx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrCqpaad9mhxk7VZgTc8xIunote5-AHPp3vYkUbSU8uiVcq65rcnrbtIuCqJ63JTuVJvKw7pFwnLjyn5fL37JzfXLhmLAowAV67_Qqtxxhiy4WQars\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzMwNTU5MjMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50IiwibmFtZSI6ImNvbnRlbnQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MzA1NTkyMyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjMzLjA1NVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozMy4wNTVaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzMuMDU1WiIsInNpemUiOiI1NCIsIm1kNUhhc2giOiJOOHA4L3M5RndkQUFubHZyL2xFQWpRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudD9nZW5lcmF0aW9uPTE1NTY4MzU4NzMwNTU5MjMmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczMDU1OTIzL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MzA1NTkyMyIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTFBKdjhueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczMDU1OTIzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODczMDU1OTIzIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0xQSnY4bngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3MzA1NTkyMy9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MzA1NTkyMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTFBKdjhueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczMDU1OTIzL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODczMDU1OTIzIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0xQSnY4bngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJHb1Vic1E9PSIsImV0YWciOiJDTFBKdjhueC9lRUNFQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"096d156b863922d6\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvaHRtbCIsIm5hbWUiOiJjb250ZW50In0K\",\n          \"PGh0bWw+PGhlYWQ+PHRpdGxlPk15IGZpcnN0IHBhZ2U8L3RpdGxlPjwvaGVhZD48L2h0bWw+\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3197\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:33 GMT\"\n          ],\n          \"Etag\": [\n            \"CPW+6cnx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoivaSzjVdOm2KP4nXCF8VQDNHXmlNjm9rZwTaWzjvBmH3oK01QYTnHqZ5DhYRewu_1H0KoQgFpUIC-M4OKZoOhRHrq0-H8HLT__SqD1D5cmezrqHo\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzM3NDI3MDkiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50IiwibmFtZSI6ImNvbnRlbnQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3Mzc0MjcwOSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9odG1sIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjMzLjc0MloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozMy43NDJaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzMuNzQyWiIsInNpemUiOiI1NCIsIm1kNUhhc2giOiJOOHA4L3M5RndkQUFubHZyL2xFQWpRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudD9nZW5lcmF0aW9uPTE1NTY4MzU4NzM3NDI3MDkmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczNzQyNzA5L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3Mzc0MjcwOSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDUFcrNmNueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczNzQyNzA5L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODczNzQyNzA5IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ1BXKzZjbngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3Mzc0MjcwOS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3Mzc0MjcwOSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDUFcrNmNueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczNzQyNzA5L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODczNzQyNzA5IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ1BXKzZjbngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJHb1Vic1E9PSIsImV0YWciOiJDUFcrNmNueC9lRUNFQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"0e96d304e9558094\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/content?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3197\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:34 GMT\"\n          ],\n          \"Etag\": [\n            \"CPW+6cnx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uoc-8JwtQprLtec5Ft6q3z4p0ooDaCCLmO9oVgrOXvBpoFhApztj8anfFwEcHdzpB6FBlUFqou0viF_HLHJvHolsxeCCoDOhqyIggOOlWjnSRg8XzY\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzM3NDI3MDkiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50IiwibmFtZSI6ImNvbnRlbnQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3Mzc0MjcwOSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9odG1sIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjMzLjc0MloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozMy43NDJaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzMuNzQyWiIsInNpemUiOiI1NCIsIm1kNUhhc2giOiJOOHA4L3M5RndkQUFubHZyL2xFQWpRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudD9nZW5lcmF0aW9uPTE1NTY4MzU4NzM3NDI3MDkmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczNzQyNzA5L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3Mzc0MjcwOSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDUFcrNmNueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczNzQyNzA5L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODczNzQyNzA5IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ1BXKzZjbngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3Mzc0MjcwOS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3Mzc0MjcwOSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDUFcrNmNueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczNzQyNzA5L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODczNzQyNzA5IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ1BXKzZjbngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJHb1Vic1E9PSIsImV0YWciOiJDUFcrNmNueC9lRUNFQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"b4c8dedc10a69e07\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6ImltYWdlL2pwZWciLCJuYW1lIjoiY29udGVudCJ9Cg==\",\n          \"PGh0bWw+PGhlYWQ+PHRpdGxlPk15IGZpcnN0IHBhZ2U8L3RpdGxlPjwvaGVhZD48L2h0bWw+\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3198\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:34 GMT\"\n          ],\n          \"Etag\": [\n            \"CM/Yjsrx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpC3UBVkNENjfRoaL2M1fPRh-iTDTwCsgF8O3TOX_iBuXcDxMjOoTmrIhD4cE5g1s7PObP66TZB1lecFypnLz8hL-aowsOxUMuL0KXJvrgoGxKHUFg\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzQzNTIyMDciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50IiwibmFtZSI6ImNvbnRlbnQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NDM1MjIwNyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiaW1hZ2UvanBlZyIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNC4zNTFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzQuMzUxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM0LjM1MVoiLCJzaXplIjoiNTQiLCJtZDVIYXNoIjoiTjhwOC9zOUZ3ZEFBbmx2ci9sRUFqUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQ/Z2VuZXJhdGlvbj0xNTU2ODM1ODc0MzUyMjA3JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3NDM1MjIwNy9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzQzNTIyMDciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ00vWWpzcngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3NDM1MjIwNy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NDM1MjIwNyIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNNL1lqc3J4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzQzNTIyMDcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzQzNTIyMDciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ00vWWpzcngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3NDM1MjIwNy91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NDM1MjIwNyIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNNL1lqc3J4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiR29VYnNRPT0iLCJldGFnIjoiQ00vWWpzcngvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"c45640ec17230f64\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/content?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3198\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:34 GMT\"\n          ],\n          \"Etag\": [\n            \"CM/Yjsrx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrvqLsOaMe2H6Xh3MyDCOuHmLzU1fn_Zh6kHLkpTpn4EWj3nFkeROu1g-cABD151cTh8YmY798iEku-Q3TnZIMZ5mexmHiCJKdUhAolbSd9b_apMK8\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzQzNTIyMDciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50IiwibmFtZSI6ImNvbnRlbnQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NDM1MjIwNyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiaW1hZ2UvanBlZyIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNC4zNTFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzQuMzUxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM0LjM1MVoiLCJzaXplIjoiNTQiLCJtZDVIYXNoIjoiTjhwOC9zOUZ3ZEFBbmx2ci9sRUFqUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQ/Z2VuZXJhdGlvbj0xNTU2ODM1ODc0MzUyMjA3JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3NDM1MjIwNy9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzQzNTIyMDciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ00vWWpzcngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3NDM1MjIwNy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NDM1MjIwNyIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNNL1lqc3J4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzQzNTIyMDcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzQzNTIyMDciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ00vWWpzcngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3NDM1MjIwNy91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NDM1MjIwNyIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNNL1lqc3J4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiR29VYnNRPT0iLCJldGFnIjoiQ00vWWpzcngvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"752ab630b062d61e\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ],\n          \"X-Goog-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Encryption-Key\": [\n            \"CLEARED\"\n          ],\n          \"X-Goog-Encryption-Key-Sha256\": [\n            \"H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoiY3VzdG9tZXItZW5jcnlwdGlvbiJ9Cg==\",\n          \"dG9wIHNlY3JldC4=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3482\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:35 GMT\"\n          ],\n          \"Etag\": [\n            \"CPjnucrx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpaWw6jJMKNOoCNMXwJNVVsxqzPhGfMo-5g3krJ7A8_PSGTx4W2OakfmtDvzOpg1hexLJcsWunNHfyWVXsjBpM58dtQlM6VucQW4Uxndlb9RIp0UhM\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uIiwibmFtZSI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNS4wNThaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzUuMDU4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM1LjA1OFoiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoieHdXTkZhMFZkWFBtbEF3cmxjQUpjZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24/Z2VuZXJhdGlvbj0xNTU2ODM1ODc1MDU4NjgwJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzUwNTg2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ1BqbnVjcngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNQam51Y3J4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24vYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzUwNTg2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ1BqbnVjcngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNQam51Y3J4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoicjBOR3JnPT0iLCJldGFnIjoiQ1BqbnVjcngvZUVDRUFFPSIsImN1c3RvbWVyRW5jcnlwdGlvbiI6eyJlbmNyeXB0aW9uQWxnb3JpdGhtIjoiQUVTMjU2Iiwia2V5U2hhMjU2IjoiSCtMbW5YaFJvZUk2VE1XNWJzVjZIeVVrNnB5R2MySU1icVliQVhCY3BzMD0ifX0=\"\n      }\n    },\n    {\n      \"ID\": \"3f4d8fd0e94ca6de\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3425\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:35 GMT\"\n          ],\n          \"Etag\": [\n            \"CPjnucrx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoO-NbHUptMgzQPx9zApWGCeqMgfkk2mt6PJl1iWbq8ocUYq_0ud8gPuj9bcBTBOBdqewKzSouddziC-BFLoOdQJ6ElkN136q5y39ZRDN4zq6UWLUs\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uIiwibmFtZSI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNS4wNThaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzUuMDU4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM1LjA1OFoiLCJzaXplIjoiMTEiLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbj9nZW5lcmF0aW9uPTE1NTY4MzU4NzUwNTg2ODAmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi8xNTU2ODM1ODc1MDU4NjgwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDUGpudWNyeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi8xNTU2ODM1ODc1MDU4NjgwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc1MDU4NjgwIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ1BqbnVjcngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDUGpudWNyeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi8xNTU2ODM1ODc1MDU4NjgwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc1MDU4NjgwIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ1BqbnVjcngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJldGFnIjoiQ1BqbnVjcngvZUVDRUFFPSIsImN1c3RvbWVyRW5jcnlwdGlvbiI6eyJlbmNyeXB0aW9uQWxnb3JpdGhtIjoiQUVTMjU2Iiwia2V5U2hhMjU2IjoiSCtMbW5YaFJvZUk2VE1XNWJzVjZIeVVrNnB5R2MySU1icVliQVhCY3BzMD0ifX0=\"\n      }\n    },\n    {\n      \"ID\": \"0355971107342253\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ],\n          \"X-Goog-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Encryption-Key\": [\n            \"CLEARED\"\n          ],\n          \"X-Goog-Encryption-Key-Sha256\": [\n            \"H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3482\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:35 GMT\"\n          ],\n          \"Etag\": [\n            \"CPjnucrx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UryZM2k28xNlFIDnXCH6SJ8RA2lDVNIx-5_eYRExB4-D1-dg_3fWvU3AREwoow4DvlYN4eyzA1AthWs5y0tYZEzvamBoZufkrXPmD64aT8kzAatns8\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uIiwibmFtZSI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNS4wNThaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzUuMDU4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM1LjA1OFoiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoieHdXTkZhMFZkWFBtbEF3cmxjQUpjZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24/Z2VuZXJhdGlvbj0xNTU2ODM1ODc1MDU4NjgwJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzUwNTg2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ1BqbnVjcngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNQam51Y3J4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24vYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzUwNTg2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ1BqbnVjcngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNQam51Y3J4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoicjBOR3JnPT0iLCJldGFnIjoiQ1BqbnVjcngvZUVDRUFFPSIsImN1c3RvbWVyRW5jcnlwdGlvbiI6eyJlbmNyeXB0aW9uQWxnb3JpdGhtIjoiQUVTMjU2Iiwia2V5U2hhMjU2IjoiSCtMbW5YaFJvZUk2VE1XNWJzVjZIeVVrNnB5R2MySU1icVliQVhCY3BzMD0ifX0=\"\n      }\n    },\n    {\n      \"ID\": \"8f8c7cba5307c918\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"85\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiJ9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3448\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:36 GMT\"\n          ],\n          \"Etag\": [\n            \"CPjnucrx/eECEAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Upnljw7UWMuKFeJUJp_gu-lyfzDRVTwgInddze_9zF5waX4glKKpcRrGpe50cvS8dV_xbbKLQa-CqAMVxlEp7qIHsmTdUR1amjrq0w9U_qrn4gYwSw\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uIiwibmFtZSI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNS4wNThaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzUuOTIwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM1LjA1OFoiLCJzaXplIjoiMTEiLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbj9nZW5lcmF0aW9uPTE1NTY4MzU4NzUwNTg2ODAmYWx0PW1lZGlhIiwiY29udGVudExhbmd1YWdlIjoiZW4iLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc1MDU4NjgwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNQam51Y3J4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24vYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzUwNTg2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDUGpudWNyeC9lRUNFQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi8xNTU2ODM1ODc1MDU4NjgwL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc1MDU4NjgwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNQam51Y3J4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24vYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzUwNTg2ODAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDUGpudWNyeC9lRUNFQUk9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImV0YWciOiJDUGpudWNyeC9lRUNFQUk9IiwiY3VzdG9tZXJFbmNyeXB0aW9uIjp7ImVuY3J5cHRpb25BbGdvcml0aG0iOiJBRVMyNTYiLCJrZXlTaGEyNTYiOiJIK0xtblhoUm9lSTZUTVc1YnNWNkh5VWs2cHlHYzJJTWJxWWJBWEJjcHMwPSJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"fc766ddbbfcd9d8a\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"85\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ],\n          \"X-Goog-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Encryption-Key\": [\n            \"CLEARED\"\n          ],\n          \"X-Goog-Encryption-Key-Sha256\": [\n            \"H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiJ9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3505\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:36 GMT\"\n          ],\n          \"Etag\": [\n            \"CPjnucrx/eECEAM=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqlTuEeQHkdcuHKu_aWtuYjopXaORKyG9TF597i1ybzIPgJHE_oiKH-xYwG_D2txhF_Sv6Jzfy44Dfga1bINCpPLseDEeD_Ez4rvxx8baTX1uJ7lJo\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uIiwibmFtZSI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsIm1ldGFnZW5lcmF0aW9uIjoiMyIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNS4wNThaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzYuMjI1WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM1LjA1OFoiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoieHdXTkZhMFZkWFBtbEF3cmxjQUpjZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24/Z2VuZXJhdGlvbj0xNTU2ODM1ODc1MDU4NjgwJmFsdD1tZWRpYSIsImNvbnRlbnRMYW5ndWFnZSI6ImVuIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi8xNTU2ODM1ODc1MDU4NjgwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDUGpudWNyeC9lRUNFQU09In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi8xNTU2ODM1ODc1MDU4NjgwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc1MDU4NjgwIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ1BqbnVjcngvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDUGpudWNyeC9lRUNFQU09In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi8xNTU2ODM1ODc1MDU4NjgwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc1MDU4NjgwIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ1BqbnVjcngvZUVDRUFNPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJyME5Hcmc9PSIsImV0YWciOiJDUGpudWNyeC9lRUNFQU09IiwiY3VzdG9tZXJFbmNyeXB0aW9uIjp7ImVuY3J5cHRpb25BbGdvcml0aG0iOiJBRVMyNTYiLCJrZXlTaGEyNTYiOiJIK0xtblhoUm9lSTZUTVc1YnNWNkh5VWs2cHlHYzJJTWJxWWJBWEJjcHMwPSJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"fb1e502029272329\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/customer-encryption\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"277\"\n          ],\n          \"Content-Type\": [\n            \"application/xml; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:36 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:36 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Urm5pF1ghApp-RiVg_TAipd-LdTbF-hcDPcVRYbmj7KUIQxnsMUF5WOcrMA1t7ZltdvPZhyfsELISuH6DGJlUUedaCNH-B5j580GjBYLUKCwmAADeM\"\n          ]\n        },\n        \"Body\": \"PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+UmVzb3VyY2VJc0VuY3J5cHRlZFdpdGhDdXN0b21lckVuY3J5cHRpb25LZXk8L0NvZGU+PE1lc3NhZ2U+VGhlIHJlc291cmNlIGlzIGVuY3J5cHRlZCB3aXRoIGEgY3VzdG9tZXIgZW5jcnlwdGlvbiBrZXkuPC9NZXNzYWdlPjxEZXRhaWxzPlRoZSByZXF1ZXN0ZWQgb2JqZWN0IGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LjwvRGV0YWlscz48L0Vycm9yPg==\"\n      }\n    },\n    {\n      \"ID\": \"c151ba4fab0c6499\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/customer-encryption\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ],\n          \"X-Goog-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Encryption-Key\": [\n            \"CLEARED\"\n          ],\n          \"X-Goog-Encryption-Key-Sha256\": [\n            \"H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Language\": [\n            \"en\"\n          ],\n          \"Content-Length\": [\n            \"11\"\n          ],\n          \"Content-Type\": [\n            \"text/plain; charset=utf-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:36 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"-CPjnucrx/eECEAM=\\\"\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:35 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Encryption-Key-Sha256\": [\n            \"H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:35 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835875058680\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=r0NGrg==\",\n            \"md5=xwWNFa0VdXPmlAwrlcAJcg==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"3\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"11\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur68mIGQ8VAtTRZs4F6ixZZYKcqe1oTqWHWqmp7gNF-81XKf2xX6eS4PcegbKx7bYnb4i6dzTCoLlbaJRNHwwLVzNbYMkGNy_bTHbWYTgtlBSKVtWs\"\n          ]\n        },\n        \"Body\": \"dG9wIHNlY3JldC4=\"\n      }\n    },\n    {\n      \"ID\": \"e09c6326cc60ad82\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-2?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"3\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"e30K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"12563\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:36 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqldLQvGKuu2fihIdwh7CvU7W0yE3vUXu8jqefTPSMhlGgvR1EfeYFqjk_Zxj7fEpv7AjugvHnn1DmkJxJWhrZyM8b5gS4uJID92D_018h2YHH1r30\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlc291cmNlSXNFbmNyeXB0ZWRXaXRoQ3VzdG9tZXJFbmNyeXB0aW9uS2V5IiwibWVzc2FnZSI6IlRoZSB0YXJnZXQgb2JqZWN0IGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LiIsImV4dGVuZGVkSGVscCI6Imh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9zdG9yYWdlL2RvY3MvZW5jcnlwdGlvbiNjdXN0b21lci1zdXBwbGllZF9lbmNyeXB0aW9uX2tleXMiLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UkVTT1VSQ0VfSVNfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5yZXdyaXRlKFJld3JpdGVPYmplY3QuamF2YToyMDApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6MTkzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLnJld3JpdGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEyMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE4IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUlOVkFMSURfVkFMVUUsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UkVTT1VSQ0VfSVNfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5yZXdyaXRlKFJld3JpdGVPYmplY3QuamF2YToyMDApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6MTkzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLnJld3JpdGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEyMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE4IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPWh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9zdG9yYWdlL2RvY3MvZW5jcnlwdGlvbiNjdXN0b21lci1zdXBwbGllZF9lbmNyeXB0aW9uX2tleXMsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWJhZFJlcXVlc3QsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4uUkVTT1VSQ0VfSVNfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVksIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpSRVNPVVJDRV9JU19FTkNSWVBURURfV0lUSF9DVVNUT01FUl9FTkNSWVBUSU9OX0tFWVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LnJld3JpdGUoUmV3cml0ZU9iamVjdC5qYXZhOjIwMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YToxOTMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6NDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IucmV3cml0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTIxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTggbW9yZVxuLCBlcnJvclByb3RvQ29kZT1SRVNPVVJDRV9JU19FTkNSWVBURURfV0lUSF9DVVNUT01FUl9FTkNSWVBUSU9OX0tFWSwgZXJyb3JQcm90b0RvbWFpbj1jbG91ZC5iaWdzdG9yZS5hcGkuQmlnc3RvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9VGhlIHJlcXVlc3RlZCBvYmplY3QgaXMgZW5jcnlwdGVkIGJ5IGEgY3VzdG9tZXItc3VwcGxpZWQgZW5jcnlwdGlvbiBrZXkuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1UaGUgdGFyZ2V0IG9iamVjdCBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS4sIHJlYXNvbj1yZXNvdXJjZUlzRW5jcnlwdGVkV2l0aEN1c3RvbWVyRW5jcnlwdGlvbktleSwgcnBjQ29kZT00MDB9IFRoZSB0YXJnZXQgb2JqZWN0IGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlJFU09VUkNFX0lTX0VOQ1JZUFRFRF9XSVRIX0NVU1RPTUVSX0VOQ1JZUFRJT05fS0VZXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QucmV3cml0ZShSZXdyaXRlT2JqZWN0LmphdmE6MjAwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjE5Mylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5yZXdyaXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxOCBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJUaGUgdGFyZ2V0IG9iamVjdCBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS4ifX0=\"\n      }\n    },\n    {\n      \"ID\": \"6c83b36cc6fc482c\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-2?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"3\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ],\n          \"X-Goog-Copy-Source-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Copy-Source-Encryption-Key\": [\n            \"CLEARED\"\n          ],\n          \"X-Goog-Copy-Source-Encryption-Key-Sha256\": [\n            \"H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"e30K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3527\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:37 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqGOUzu40Jq-_GztkQxoFN64MHcSoZjph7ivV8tqrp6ENxFIB0c82xqEdKKfcpqbJ2YXtXQgwflZgX-uiVOgGY_1c8SLoV7geQMfErTz1Q0NDM4YDM\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMTEiLCJvYmplY3RTaXplIjoiMTEiLCJkb25lIjp0cnVlLCJyZXNvdXJjZSI6eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3NzEwODYxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMiIsIm5hbWUiOiJjdXN0b21lci1lbmNyeXB0aW9uLTIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NzEwODYxNCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNy4xMDhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzcuMTA4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM3LjEwOFoiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoieHdXTkZhMFZkWFBtbEF3cmxjQUpjZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMj9nZW5lcmF0aW9uPTE1NTY4MzU4NzcxMDg2MTQmYWx0PW1lZGlhIiwiY29udGVudExhbmd1YWdlIjoiZW4iLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3NzEwODYxNC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uLTIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc3MTA4NjE0IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNJYjN0c3Z4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3NzEwODYxNC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0yL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0yIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzcxMDg2MTQiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSWIzdHN2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0yLzE1NTY4MzU4NzcxMDg2MTQvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc3MTA4NjE0IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNJYjN0c3Z4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3NzEwODYxNC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0yL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0yIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzcxMDg2MTQiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSWIzdHN2eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6InIwTkdyZz09IiwiZXRhZyI6IkNJYjN0c3Z4L2VFQ0VBRT0ifX0=\"\n      }\n    },\n    {\n      \"ID\": \"e499f3b7077fb222\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/customer-encryption-2\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Language\": [\n            \"en\"\n          ],\n          \"Content-Length\": [\n            \"11\"\n          ],\n          \"Content-Type\": [\n            \"text/plain; charset=utf-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:37 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"c7058d15ad157573e6940c2b95c00972\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:37 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:37 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:37 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835877108614\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=r0NGrg==\",\n            \"md5=xwWNFa0VdXPmlAwrlcAJcg==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"11\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpfEf1WUM8E5dSmOe1sOfgheagnlrcFUolvMMBiP6jDvPqoS7Sx0IwklM-DwnuAbBJPQ_EHhX-42njQu9vUjXqamH1U6np0Vmi0BngqFYOTc9MVP3M\"\n          ]\n        },\n        \"Body\": \"dG9wIHNlY3JldC4=\"\n      }\n    },\n    {\n      \"ID\": \"9e67dfa901c4e619\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-2?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"3\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ],\n          \"X-Goog-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Encryption-Key\": [\n            \"CLEARED\"\n          ],\n          \"X-Goog-Encryption-Key-Sha256\": [\n            \"FnBvfQ1dDsyS8kHD+aB6HHIglDoQ5Im7WYDm3XYTGrQ=\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"e30K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"12563\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:37 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoYPZ-j39Sr1Whn6F3PYeVaxqIIjS_fBgSNkBO7f7B8RMWih6iCCLf1cPDXB3Br-0XBkdm6i9N9fGeK84_laVYWuJc0uJwSCXydk0bSWezw0qec5yE\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlc291cmNlSXNFbmNyeXB0ZWRXaXRoQ3VzdG9tZXJFbmNyeXB0aW9uS2V5IiwibWVzc2FnZSI6IlRoZSB0YXJnZXQgb2JqZWN0IGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LiIsImV4dGVuZGVkSGVscCI6Imh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9zdG9yYWdlL2RvY3MvZW5jcnlwdGlvbiNjdXN0b21lci1zdXBwbGllZF9lbmNyeXB0aW9uX2tleXMiLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UkVTT1VSQ0VfSVNfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5yZXdyaXRlKFJld3JpdGVPYmplY3QuamF2YToyMDApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6MTkzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLnJld3JpdGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEyMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE4IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUlOVkFMSURfVkFMVUUsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UkVTT1VSQ0VfSVNfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5yZXdyaXRlKFJld3JpdGVPYmplY3QuamF2YToyMDApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6MTkzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLnJld3JpdGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEyMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE4IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPWh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9zdG9yYWdlL2RvY3MvZW5jcnlwdGlvbiNjdXN0b21lci1zdXBwbGllZF9lbmNyeXB0aW9uX2tleXMsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWJhZFJlcXVlc3QsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4uUkVTT1VSQ0VfSVNfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVksIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpSRVNPVVJDRV9JU19FTkNSWVBURURfV0lUSF9DVVNUT01FUl9FTkNSWVBUSU9OX0tFWVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LnJld3JpdGUoUmV3cml0ZU9iamVjdC5qYXZhOjIwMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YToxOTMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6NDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IucmV3cml0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTIxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTggbW9yZVxuLCBlcnJvclByb3RvQ29kZT1SRVNPVVJDRV9JU19FTkNSWVBURURfV0lUSF9DVVNUT01FUl9FTkNSWVBUSU9OX0tFWSwgZXJyb3JQcm90b0RvbWFpbj1jbG91ZC5iaWdzdG9yZS5hcGkuQmlnc3RvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9VGhlIHJlcXVlc3RlZCBvYmplY3QgaXMgZW5jcnlwdGVkIGJ5IGEgY3VzdG9tZXItc3VwcGxpZWQgZW5jcnlwdGlvbiBrZXkuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1UaGUgdGFyZ2V0IG9iamVjdCBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS4sIHJlYXNvbj1yZXNvdXJjZUlzRW5jcnlwdGVkV2l0aEN1c3RvbWVyRW5jcnlwdGlvbktleSwgcnBjQ29kZT00MDB9IFRoZSB0YXJnZXQgb2JqZWN0IGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlJFU09VUkNFX0lTX0VOQ1JZUFRFRF9XSVRIX0NVU1RPTUVSX0VOQ1JZUFRJT05fS0VZXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QucmV3cml0ZShSZXdyaXRlT2JqZWN0LmphdmE6MjAwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjE5Mylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5yZXdyaXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxOCBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJUaGUgdGFyZ2V0IG9iamVjdCBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS4ifX0=\"\n      }\n    },\n    {\n      \"ID\": \"670f74ac2a0b734e\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-2?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"3\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ],\n          \"X-Goog-Copy-Source-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Copy-Source-Encryption-Key\": [\n            \"CLEARED\"\n          ],\n          \"X-Goog-Copy-Source-Encryption-Key-Sha256\": [\n            \"H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=\"\n          ],\n          \"X-Goog-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Encryption-Key\": [\n            \"CLEARED\"\n          ],\n          \"X-Goog-Encryption-Key-Sha256\": [\n            \"FnBvfQ1dDsyS8kHD+aB6HHIglDoQ5Im7WYDm3XYTGrQ=\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"e30K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3640\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:38 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoWwxnT2DHS1ymBhZJmnwxQiajAVYbOH62dyhX86syLNW_TlPnzYaM_7kACpN8ar5EeAHQ9fsMSHP4CqMcb6ZWg5KY3OkbPvfitdLalAA9MXxMFqoo\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMTEiLCJvYmplY3RTaXplIjoiMTEiLCJkb25lIjp0cnVlLCJyZXNvdXJjZSI6eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3ODE4MzI1MSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMiIsIm5hbWUiOiJjdXN0b21lci1lbmNyeXB0aW9uLTIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3ODE4MzI1MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozOC4xODJaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzguMTgyWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM4LjE4MloiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoieHdXTkZhMFZkWFBtbEF3cmxjQUpjZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMj9nZW5lcmF0aW9uPTE1NTY4MzU4NzgxODMyNTEmYWx0PW1lZGlhIiwiY29udGVudExhbmd1YWdlIjoiZW4iLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3ODE4MzI1MS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uLTIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc4MTgzMjUxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNOUEMrTXZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3ODE4MzI1MS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0yL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0yIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzgxODMyNTEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTlBDK012eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0yLzE1NTY4MzU4NzgxODMyNTEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc4MTgzMjUxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNOUEMrTXZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3ODE4MzI1MS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0yL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0yIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzgxODMyNTEiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTlBDK012eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6InIwTkdyZz09IiwiZXRhZyI6IkNOUEMrTXZ4L2VFQ0VBRT0iLCJjdXN0b21lckVuY3J5cHRpb24iOnsiZW5jcnlwdGlvbkFsZ29yaXRobSI6IkFFUzI1NiIsImtleVNoYTI1NiI6IkZuQnZmUTFkRHN5UzhrSEQrYUI2SEhJZ2xEb1E1SW03V1lEbTNYWVRHclE9In19fQ==\"\n      }\n    },\n    {\n      \"ID\": \"9c6e7ad2d8e2c68a\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/customer-encryption-2\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"277\"\n          ],\n          \"Content-Type\": [\n            \"application/xml; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:38 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:38 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoSrQtDkljyQ-aUJoC8m6nY20wZiHLTwh4znEZ5hyKxLQUrZIi7PnU416twfTwfPXWvd4cPGZC3NVdpJWg332KnUKSEdFPY2BQwLJ-_9S5eVdwMrf8\"\n          ]\n        },\n        \"Body\": \"PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+UmVzb3VyY2VJc0VuY3J5cHRlZFdpdGhDdXN0b21lckVuY3J5cHRpb25LZXk8L0NvZGU+PE1lc3NhZ2U+VGhlIHJlc291cmNlIGlzIGVuY3J5cHRlZCB3aXRoIGEgY3VzdG9tZXIgZW5jcnlwdGlvbiBrZXkuPC9NZXNzYWdlPjxEZXRhaWxzPlRoZSByZXF1ZXN0ZWQgb2JqZWN0IGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LjwvRGV0YWlscz48L0Vycm9yPg==\"\n      }\n    },\n    {\n      \"ID\": \"b5fbec9f26148f95\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/customer-encryption-2\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ],\n          \"X-Goog-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Encryption-Key\": [\n            \"CLEARED\"\n          ],\n          \"X-Goog-Encryption-Key-Sha256\": [\n            \"FnBvfQ1dDsyS8kHD+aB6HHIglDoQ5Im7WYDm3XYTGrQ=\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Language\": [\n            \"en\"\n          ],\n          \"Content-Length\": [\n            \"11\"\n          ],\n          \"Content-Type\": [\n            \"text/plain; charset=utf-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:38 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"-CNPC+Mvx/eECEAE=\\\"\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:38 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Encryption-Key-Sha256\": [\n            \"FnBvfQ1dDsyS8kHD+aB6HHIglDoQ5Im7WYDm3XYTGrQ=\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:38 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835878183251\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=r0NGrg==\",\n            \"md5=xwWNFa0VdXPmlAwrlcAJcg==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"11\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpTr8Qws5nL-el_ied6M7FYtryiLpFfhGNN-TxakIl1FCAOBJwMeq6_KBQ0l4UmT8VePQQ9h_S8r55NolBB1Ex12-iKvooCkTsNmvQ4rE4hOqQGbLc\"\n          ]\n        },\n        \"Body\": \"dG9wIHNlY3JldC4=\"\n      }\n    },\n    {\n      \"ID\": \"616de25561ebbffa\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-2/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-2?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"3\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ],\n          \"X-Goog-Copy-Source-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Copy-Source-Encryption-Key\": [\n            \"CLEARED\"\n          ],\n          \"X-Goog-Copy-Source-Encryption-Key-Sha256\": [\n            \"FnBvfQ1dDsyS8kHD+aB6HHIglDoQ5Im7WYDm3XYTGrQ=\"\n          ],\n          \"X-Goog-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Encryption-Key\": [\n            \"CLEARED\"\n          ],\n          \"X-Goog-Encryption-Key-Sha256\": [\n            \"H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"e30K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3640\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:39 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqyD8XYw6tgOBbcxdUIVAw_vXrrryw0bgh-L-jRW0hyJt0lCHU9K26isn6tykgml7UgX52dgw65xD_ht4yxbHkY_VFl6MkEY6H-mWRx0_52xj49RW8\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMTEiLCJvYmplY3RTaXplIjoiMTEiLCJkb25lIjp0cnVlLCJyZXNvdXJjZSI6eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3ODk5ODUxMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMiIsIm5hbWUiOiJjdXN0b21lci1lbmNyeXB0aW9uLTIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3ODk5ODUxMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozOC45OThaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzguOTk4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM4Ljk5OFoiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoieHdXTkZhMFZkWFBtbEF3cmxjQUpjZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMj9nZW5lcmF0aW9uPTE1NTY4MzU4Nzg5OTg1MTEmYWx0PW1lZGlhIiwiY29udGVudExhbmd1YWdlIjoiZW4iLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3ODk5ODUxMS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uLTIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc4OTk4NTExIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNPK2pxc3p4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3ODk5ODUxMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0yL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0yIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4Nzg5OTg1MTEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTytqcXN6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0yLzE1NTY4MzU4Nzg5OTg1MTEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc4OTk4NTExIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPK2pxc3p4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3ODk5ODUxMS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0yL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0yIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4Nzg5OTg1MTEiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTytqcXN6eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6InIwTkdyZz09IiwiZXRhZyI6IkNPK2pxc3p4L2VFQ0VBRT0iLCJjdXN0b21lckVuY3J5cHRpb24iOnsiZW5jcnlwdGlvbkFsZ29yaXRobSI6IkFFUzI1NiIsImtleVNoYTI1NiI6IkgrTG1uWGhSb2VJNlRNVzVic1Y2SHlVazZweUdjMklNYnFZYkFYQmNwczA9In19fQ==\"\n      }\n    },\n    {\n      \"ID\": \"2ddf1402c6efc3a8\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-3/compose?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"160\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6ImN1c3RvbWVyLWVuY3J5cHRpb24ifSx7Im5hbWUiOiJjdXN0b21lci1lbmNyeXB0aW9uLTIifV19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"13334\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:39 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrFitgTFIY6yt8kk3zprPGtWncWc7Ad6oUFVXVdE0O3QqK0qlYGB7RSw-dwN1AvMk4Sndi8gR22cF8qs88ZlmdAxB-1zYdUNqwArmpP2xni66xX-L4\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlc291cmNlSXNFbmNyeXB0ZWRXaXRoQ3VzdG9tZXJFbmNyeXB0aW9uS2V5IiwibWVzc2FnZSI6IlRoZSB0YXJnZXQgb2JqZWN0IGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LiIsImV4dGVuZGVkSGVscCI6Imh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9zdG9yYWdlL2RvY3MvZW5jcnlwdGlvbiNjdXN0b21lci1zdXBwbGllZF9lbmNyeXB0aW9uX2tleXMiLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UkVTT1VSQ0VfSVNfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVk6IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uKSBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uKSBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9SU5WQUxJRF9WQUxVRSwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpSRVNPVVJDRV9JU19FTkNSWVBURURfV0lUSF9DVVNUT01FUl9FTkNSWVBUSU9OX0tFWTogQ29tcG9uZW50IG9iamVjdCAoZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24pIGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5Db21wb3NlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChDb21wb3NlT2JqZWN0LmphdmE6MTk5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmNvbXBvc2UoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ29tcG9uZW50IG9iamVjdCAoZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24pIGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1odHRwczovL2Nsb3VkLmdvb2dsZS5jb20vc3RvcmFnZS9kb2NzL2VuY3J5cHRpb24jY3VzdG9tZXItc3VwcGxpZWRfZW5jcnlwdGlvbl9rZXlzLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWNsb3VkLmJpZ3N0b3JlLmFwaS5CaWdzdG9yZUVycm9yRG9tYWluLlJFU09VUkNFX0lTX0VOQ1JZUFRFRF9XSVRIX0NVU1RPTUVSX0VOQ1JZUFRJT05fS0VZLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UkVTT1VSQ0VfSVNfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVk6IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uKSBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uKSBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1SRVNPVVJDRV9JU19FTkNSWVBURURfV0lUSF9DVVNUT01FUl9FTkNSWVBUSU9OX0tFWSwgZXJyb3JQcm90b0RvbWFpbj1jbG91ZC5iaWdzdG9yZS5hcGkuQmlnc3RvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9Q29tcG9uZW50IG9iamVjdCAoZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24pIGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9VGhlIHRhcmdldCBvYmplY3QgaXMgZW5jcnlwdGVkIGJ5IGEgY3VzdG9tZXItc3VwcGxpZWQgZW5jcnlwdGlvbiBrZXkuLCByZWFzb249cmVzb3VyY2VJc0VuY3J5cHRlZFdpdGhDdXN0b21lckVuY3J5cHRpb25LZXksIHJwY0NvZGU9NDAwfSBUaGUgdGFyZ2V0IG9iamVjdCBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS46IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpSRVNPVVJDRV9JU19FTkNSWVBURURfV0lUSF9DVVNUT01FUl9FTkNSWVBUSU9OX0tFWTogQ29tcG9uZW50IG9iamVjdCAoZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24pIGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5Db21wb3NlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChDb21wb3NlT2JqZWN0LmphdmE6MTk5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmNvbXBvc2UoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ29tcG9uZW50IG9iamVjdCAoZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24pIGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJUaGUgdGFyZ2V0IG9iamVjdCBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS4ifX0=\"\n      }\n    },\n    {\n      \"ID\": \"eea75f5f6c3c7e89\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-3/compose?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"160\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ],\n          \"X-Goog-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Encryption-Key\": [\n            \"CLEARED\"\n          ],\n          \"X-Goog-Encryption-Key-Sha256\": [\n            \"H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6ImN1c3RvbWVyLWVuY3J5cHRpb24ifSx7Im5hbWUiOiJjdXN0b21lci1lbmNyeXB0aW9uLTIifV19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"911\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:39 GMT\"\n          ],\n          \"Etag\": [\n            \"CPDp3szx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uotyvz71ZfU1J_hl3NsDz9ldw92nWlIp9muxpBUsdv0nTyfJEqz-yQFyEwE2UM11wv7tkpLQfffGlKhlx7CVK0S1UYJnS2XQu2P0Uiz5bbamHxE520\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTMvMTU1NjgzNTg3OTg1OTQ0MCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMyIsIm5hbWUiOiJjdXN0b21lci1lbmNyeXB0aW9uLTMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3OTg1OTQ0MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozOS44NTlaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzkuODU5WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM5Ljg1OVoiLCJzaXplIjoiMjIiLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0zP2dlbmVyYXRpb249MTU1NjgzNTg3OTg1OTQ0MCZhbHQ9bWVkaWEiLCJjcmMzMmMiOiI1ajF5cGc9PSIsImNvbXBvbmVudENvdW50IjoyLCJldGFnIjoiQ1BEcDNzengvZUVDRUFFPSIsImN1c3RvbWVyRW5jcnlwdGlvbiI6eyJlbmNyeXB0aW9uQWxnb3JpdGhtIjoiQUVTMjU2Iiwia2V5U2hhMjU2IjoiSCtMbW5YaFJvZUk2VE1XNWJzVjZIeVVrNnB5R2MySU1icVliQVhCY3BzMD0ifX0=\"\n      }\n    },\n    {\n      \"ID\": \"b19fb82ecf450b51\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/customer-encryption-3\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"277\"\n          ],\n          \"Content-Type\": [\n            \"application/xml; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:40 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:40 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Urcj3TJ6B5h4Q0DT7G_ioI_Icu9iv65m57OlRH6h9mKD9zZZl320H3QD6A7fNd1UPBSGGDZ9I0TG4_lSFa8JgkJQEVRGVRvVQv36b7ArCuGmg0loV0\"\n          ]\n        },\n        \"Body\": \"PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+UmVzb3VyY2VJc0VuY3J5cHRlZFdpdGhDdXN0b21lckVuY3J5cHRpb25LZXk8L0NvZGU+PE1lc3NhZ2U+VGhlIHJlc291cmNlIGlzIGVuY3J5cHRlZCB3aXRoIGEgY3VzdG9tZXIgZW5jcnlwdGlvbiBrZXkuPC9NZXNzYWdlPjxEZXRhaWxzPlRoZSByZXF1ZXN0ZWQgb2JqZWN0IGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LjwvRGV0YWlscz48L0Vycm9yPg==\"\n      }\n    },\n    {\n      \"ID\": \"1f0a12bd00a88965\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/customer-encryption-3\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ],\n          \"X-Goog-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Encryption-Key\": [\n            \"CLEARED\"\n          ],\n          \"X-Goog-Encryption-Key-Sha256\": [\n            \"H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"22\"\n          ],\n          \"Content-Type\": [\n            \"application/octet-stream\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:40 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"-CPDp3szx/eECEAE=\\\"\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:39 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Component-Count\": [\n            \"2\"\n          ],\n          \"X-Goog-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Encryption-Key-Sha256\": [\n            \"H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:24:39 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835879859440\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=5j1ypg==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"22\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur7DoEkjdrkGGrYpsCDbd2Y6c_Mu8sEA7cN_k06l4WjY25UJsijDFWSlSIA9SCi-ouLuI3if4Rh33a5n5vKcN3oSYjzK92eSPVCczEpQdILKFWyQh4\"\n          ]\n        },\n        \"Body\": \"dG9wIHNlY3JldC50b3Agc2VjcmV0Lg==\"\n      }\n    },\n    {\n      \"ID\": \"f649a81672a92823\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-2/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-2?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"3\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ],\n          \"X-Goog-Copy-Source-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Copy-Source-Encryption-Key\": [\n            \"CLEARED\"\n          ],\n          \"X-Goog-Copy-Source-Encryption-Key-Sha256\": [\n            \"H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"e30K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3527\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:40 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrfhqrYGhW8ew5dxbfg_DcMhaJh6k2oY_JqMwPRSDtS3Ef5kljeo8oTONrxRIAP8I0ScqxFCy7okNejkqOeO4Vr1TBZ2mc4MDjwiJA52ERSgZMUyvM\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMTEiLCJvYmplY3RTaXplIjoiMTEiLCJkb25lIjp0cnVlLCJyZXNvdXJjZSI6eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg4MDcxNzUwNiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMiIsIm5hbWUiOiJjdXN0b21lci1lbmNyeXB0aW9uLTIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MDcxNzUwNiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0MC43MTdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDAuNzE3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQwLjcxN1oiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoieHdXTkZhMFZkWFBtbEF3cmxjQUpjZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMj9nZW5lcmF0aW9uPTE1NTY4MzU4ODA3MTc1MDYmYWx0PW1lZGlhIiwiY29udGVudExhbmd1YWdlIjoiZW4iLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg4MDcxNzUwNi9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uLTIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgwNzE3NTA2IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNNS1prODN4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg4MDcxNzUwNi9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0yL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0yIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODA3MTc1MDYiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTUtaazgzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0yLzE1NTY4MzU4ODA3MTc1MDYvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgwNzE3NTA2IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNNS1prODN4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg4MDcxNzUwNi91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0yL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0yIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODA3MTc1MDYiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTUtaazgzeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6InIwTkdyZz09IiwiZXRhZyI6IkNNS1prODN4L2VFQ0VBRT0ifX0=\"\n      }\n    },\n    {\n      \"ID\": \"61763fd57e906039\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-3/compose?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"129\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ],\n          \"X-Goog-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Encryption-Key\": [\n            \"CLEARED\"\n          ],\n          \"X-Goog-Encryption-Key-Sha256\": [\n            \"H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiJ9XX0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"13444\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:41 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur7TRBQyfrSgWnsPL0CVfQCd5s_QJN9pRUHB1YttIoObh1YkzCEtuRxrwyKYtccpyodUCMmTVRyD6d0oDy-c2_Q7GK-_6OC5h_EF_1e9-t6E8VZCQ8\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlc291cmNlTm90RW5jcnlwdGVkV2l0aEN1c3RvbWVyRW5jcnlwdGlvbktleSIsIm1lc3NhZ2UiOiJUaGUgdGFyZ2V0IG9iamVjdCBpcyBub3QgZW5jcnlwdGVkIGJ5IGEgY3VzdG9tZXItc3VwcGxpZWQgZW5jcnlwdGlvbiBrZXkuIiwiZXh0ZW5kZWRIZWxwIjoiaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9lbmNyeXB0aW9uI2N1c3RvbWVyLXN1cHBsaWVkX2VuY3J5cHRpb25fa2V5cyIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpSRVNPVVJDRV9OT1RfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVk6IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIpIHVzIG5vdCBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIpIHVzIG5vdCBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9SU5WQUxJRF9WQUxVRSwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpSRVNPVVJDRV9OT1RfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVk6IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIpIHVzIG5vdCBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIpIHVzIG5vdCBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9aHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9lbmNyeXB0aW9uI2N1c3RvbWVyLXN1cHBsaWVkX2VuY3J5cHRpb25fa2V5cywgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9YmFkUmVxdWVzdCwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1jbG91ZC5iaWdzdG9yZS5hcGkuQmlnc3RvcmVFcnJvckRvbWFpbi5SRVNPVVJDRV9OT1RfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVksIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpSRVNPVVJDRV9OT1RfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVk6IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIpIHVzIG5vdCBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIpIHVzIG5vdCBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1SRVNPVVJDRV9OT1RfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVksIGVycm9yUHJvdG9Eb21haW49Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkuZW5jcnlwdGlvbktleSwgbWVzc2FnZT1Db21wb25lbnQgb2JqZWN0IChnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0yKSB1cyBub3QgZW5jcnlwdGVkIGJ5IGEgY3VzdG9tZXItc3VwcGxpZWQgZW5jcnlwdGlvbiBrZXkuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249ZW50aXR5LmVuY3J5cHRpb25LZXksIG1lc3NhZ2U9VGhlIHRhcmdldCBvYmplY3QgaXMgbm90IGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LiwgcmVhc29uPXJlc291cmNlTm90RW5jcnlwdGVkV2l0aEN1c3RvbWVyRW5jcnlwdGlvbktleSwgcnBjQ29kZT00MDB9IFRoZSB0YXJnZXQgb2JqZWN0IGlzIG5vdCBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS46IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpSRVNPVVJDRV9OT1RfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVk6IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIpIHVzIG5vdCBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIpIHVzIG5vdCBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDAwLCJtZXNzYWdlIjoiVGhlIHRhcmdldCBvYmplY3QgaXMgbm90IGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LiJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"b45cb452c78d7b50\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2571\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:41 GMT\"\n          ],\n          \"Etag\": [\n            \"CAo=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:41 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uq2YnotZtU1JMnJw10vtgVDeukiWK_4DXx0QFWA91CaCYLPXLDKzCzY8xqb6EGkVxvw731As27REu_hYOqZTwSfJJ6SeHemliLV9JgQYjfngxL0HFA\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyOC44ODJaIiwibWV0YWdlbmVyYXRpb24iOiIxMCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBbz0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FvPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FvPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQW89In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FvPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQW89In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOmZhbHNlfSwibGlmZWN5Y2xlIjp7InJ1bGUiOlt7ImFjdGlvbiI6eyJ0eXBlIjoiRGVsZXRlIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjMwfX1dfSwibGFiZWxzIjp7Im5ldyI6Im5ldyIsImwxIjoidjIifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FvPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"6831287fd0edbcd4\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoicG9zYyJ9Cg==\",\n          \"Zm9v\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3128\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:42 GMT\"\n          ],\n          \"Etag\": [\n            \"CJek2c3x/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrXGhYaqbrodjXeCKtZGAt0hM0GrM8GBcZBkGkLJ7550-Iqaxp681SkhDDDOp0V3-xMmoq3rjWOC8A4XvJfAzgxGsO2VekCUJgUBMalL8hEAur49q8\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wb3NjLzE1NTY4MzU4ODE4NjU3NTEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjIiwibmFtZSI6InBvc2MiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MTg2NTc1MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0MS44NjVaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDEuODY1WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQxLjg2NVoiLCJzaXplIjoiMyIsIm1kNUhhc2giOiJyTDBZMjB6QytGenQ3MlZQek1TazJBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYz9nZW5lcmF0aW9uPTE1NTY4MzU4ODE4NjU3NTEmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYy8xNTU2ODM1ODgxODY1NzUxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2MvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MTg2NTc1MSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSmVrMmMzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYy8xNTU2ODM1ODgxODY1NzUxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoicG9zYyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgxODY1NzUxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0plazJjM3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MvMTU1NjgzNTg4MTg2NTc1MS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MTg2NTc1MSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSmVrMmMzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYy8xNTU2ODM1ODgxODY1NzUxL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoicG9zYyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgxODY1NzUxIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0plazJjM3gvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJ6OFN1SFE9PSIsImV0YWciOiJDSmVrMmMzeC9lRUNFQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"7588cdc84e3976f4\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/posc?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3128\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:42 GMT\"\n          ],\n          \"Etag\": [\n            \"CJek2c3x/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpGBHQWnSHLUYlW5nck2w_3QN4x5uYmOM-GIatNzD1tqhzK0JOf7rBe1BKILpdyEUPlSmrLwrukcqJwHgfezE50OQL7ha9n6_fc6qUMoVwkEGawOgA\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wb3NjLzE1NTY4MzU4ODE4NjU3NTEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjIiwibmFtZSI6InBvc2MiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MTg2NTc1MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0MS44NjVaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDEuODY1WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQxLjg2NVoiLCJzaXplIjoiMyIsIm1kNUhhc2giOiJyTDBZMjB6QytGenQ3MlZQek1TazJBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYz9nZW5lcmF0aW9uPTE1NTY4MzU4ODE4NjU3NTEmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYy8xNTU2ODM1ODgxODY1NzUxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2MvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MTg2NTc1MSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSmVrMmMzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYy8xNTU2ODM1ODgxODY1NzUxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoicG9zYyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgxODY1NzUxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0plazJjM3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MvMTU1NjgzNTg4MTg2NTc1MS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MTg2NTc1MSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSmVrMmMzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYy8xNTU2ODM1ODgxODY1NzUxL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoicG9zYyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgxODY1NzUxIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0plazJjM3gvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJ6OFN1SFE9PSIsImV0YWciOiJDSmVrMmMzeC9lRUNFQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"974ed1b42608e806\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/posc/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/posc?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"34\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJzdG9yYWdlQ2xhc3MiOiJNVUxUSV9SRUdJT05BTCJ9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3193\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:42 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrKCtuc_GsAj6sf3zXpqT2_KZrdL0SEwsunv07k0DaaEHMj8gkX4kRCcm5r8AUrD9RNYjoKeceiCyY4pDN8nrHljshmEIXF2P29Oyd0KSuqDjsNeps\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMyIsIm9iamVjdFNpemUiOiIzIiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYy8xNTU2ODM1ODgyNzYwNjA3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYyIsIm5hbWUiOiJwb3NjIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODI3NjA2MDciLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDIuNzYwWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQyLjc2MFoiLCJzdG9yYWdlQ2xhc3MiOiJNVUxUSV9SRUdJT05BTCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0Mi43NjBaIiwic2l6ZSI6IjMiLCJtZDVIYXNoIjoickwwWTIwekMrRnp0NzJWUHpNU2syQT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2M/Z2VuZXJhdGlvbj0xNTU2ODM1ODgyNzYwNjA3JmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MvMTU1NjgzNTg4Mjc2MDYwNy9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJwb3NjIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODI3NjA2MDciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0ovemo4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MvMTU1NjgzNTg4Mjc2MDYwNy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4Mjc2MDYwNyIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNKL3pqODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wb3NjLzE1NTY4MzU4ODI3NjA2MDcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2MvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJwb3NjIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODI3NjA2MDciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0ovemo4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MvMTU1NjgzNTg4Mjc2MDYwNy91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYy9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4Mjc2MDYwNyIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKL3pqODd4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiejhTdUhRPT0iLCJldGFnIjoiQ0ovemo4N3gvZUVDRUFFPSJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"a2be30bf1e3cb539\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoicG9zYzIiLCJzdG9yYWdlQ2xhc3MiOiJNVUxUSV9SRUdJT05BTCJ9Cg==\",\n          \"eHh4\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3150\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:43 GMT\"\n          ],\n          \"Etag\": [\n            \"CILrp87x/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqziYHpTkcbyMFRtHko_e04Rze8FHLbALw476U2bB9k_SqPwILBzxKRLzFvRN4q3RLt4xR1mpR2lgJ1Zq0BNYCefLOZsOeq4JbzJYLxGL5V799xkQ8\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wb3NjMi8xNTU2ODM1ODgzMTUyNzcwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYzIiLCJuYW1lIjoicG9zYzIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MzE1Mjc3MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0My4xNTJaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDMuMTUyWiIsInN0b3JhZ2VDbGFzcyI6Ik1VTFRJX1JFR0lPTkFMIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQzLjE1MloiLCJzaXplIjoiMyIsIm1kNUhhc2giOiI5V0dxOXU4TDhVMUNDTHRHcE15enJRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYzI/Z2VuZXJhdGlvbj0xNTU2ODM1ODgzMTUyNzcwJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MyLzE1NTY4MzU4ODMxNTI3NzAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYzIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODMxNTI3NzAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0lMcnA4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MyLzE1NTY4MzU4ODMxNTI3NzAvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2MyL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoicG9zYzIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MzE1Mjc3MCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNJTHJwODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wb3NjMi8xNTU2ODM1ODgzMTUyNzcwL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODMxNTI3NzAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0lMcnA4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MyLzE1NTY4MzU4ODMxNTI3NzAvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2MyL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoicG9zYzIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MzE1Mjc3MCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNJTHJwODd4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiMTdxQUJRPT0iLCJldGFnIjoiQ0lMcnA4N3gvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"d570e13411ade628\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoiYnVja2V0SW5Db3B5QXR0cnMifQo=\",\n          \"Zm9v\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3336\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:43 GMT\"\n          ],\n          \"Etag\": [\n            \"CPCDx87x/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrltsLp6xgl5GQBA_ZoqyMKcRlP-MvWyo0epRXUAbOAkOUUpAOgezp4fFQRP5wEM1fq771AWUgtYvQ3HLXCnwxmDaCqJxEhICiYhxDp8RpvCnn3xuI\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRJbkNvcHlBdHRycy8xNTU2ODM1ODgzNjYzODU2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYnVja2V0SW5Db3B5QXR0cnMiLCJuYW1lIjoiYnVja2V0SW5Db3B5QXR0cnMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MzY2Mzg1NiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0My42NjNaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDMuNjYzWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQzLjY2M1oiLCJzaXplIjoiMyIsIm1kNUhhc2giOiJyTDBZMjB6QytGenQ3MlZQek1TazJBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYnVja2V0SW5Db3B5QXR0cnM/Z2VuZXJhdGlvbj0xNTU2ODM1ODgzNjYzODU2JmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2J1Y2tldEluQ29weUF0dHJzLzE1NTY4MzU4ODM2NjM4NTYvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYnVja2V0SW5Db3B5QXR0cnMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImJ1Y2tldEluQ29weUF0dHJzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODM2NjM4NTYiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ1BDRHg4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2J1Y2tldEluQ29weUF0dHJzLzE1NTY4MzU4ODM2NjM4NTYvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2J1Y2tldEluQ29weUF0dHJzL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYnVja2V0SW5Db3B5QXR0cnMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MzY2Mzg1NiIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNQQ0R4ODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRJbkNvcHlBdHRycy8xNTU2ODM1ODgzNjYzODU2L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9idWNrZXRJbkNvcHlBdHRycy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImJ1Y2tldEluQ29weUF0dHJzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODM2NjM4NTYiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ1BDRHg4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2J1Y2tldEluQ29weUF0dHJzLzE1NTY4MzU4ODM2NjM4NTYvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2J1Y2tldEluQ29weUF0dHJzL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYnVja2V0SW5Db3B5QXR0cnMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MzY2Mzg1NiIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNQQ0R4ODd4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiejhTdUhRPT0iLCJldGFnIjoiQ1BDRHg4N3gvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"284a06aa5d3f4c0f\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/bucketInCopyAttrs/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/bucketInCopyAttrs?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"62\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"2972\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:43 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqEuzT5vUHzBcQTT84B5lbxQRZ8Wazbvf7pARGdim0OKOWWM6MdR9KrH11f9w9bxrybc2YHzoveHnAwpEgFzwUcXlLN8xDttCt9pwOnPMX3My8utXg\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IlJlcXVpcmVkIiwiZGVidWdJbmZvIjoiY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89bnVsbCwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWJhZFJlcXVlc3QsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLlJFUVVJUkVELCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1udWxsLCBlcnJvclByb3RvQ29kZT1SRVFVSVJFRCwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkuZGVzdGluYXRpb25fcmVzb3VyY2UuaWQubmFtZSwgbWVzc2FnZT1udWxsLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249ZW50aXR5LmRlc3RpbmF0aW9uX3Jlc291cmNlLmlkLm5hbWUsIG1lc3NhZ2U9UmVxdWlyZWQsIHJlYXNvbj1yZXF1aXJlZCwgcnBjQ29kZT00MDB9IFJlcXVpcmVkXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDAwLCJtZXNzYWdlIjoiUmVxdWlyZWQifX0=\"\n      }\n    },\n    {\n      \"ID\": \"631a4dc25c1479df\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjcmMzMmMiOiJjSCtBK3c9PSIsIm5hbWUiOiJoYXNoZXNPblVwbG9hZC0xIn0K\",\n          \"SSBjYW4ndCB3YWl0IHRvIGJlIHZlcmlmaWVk\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3321\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:44 GMT\"\n          ],\n          \"Etag\": [\n            \"CIes587x/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Up5pzFgsk-trM6xfNGHCutAafrBhKStla4toQDjvEsTPe4TTesYnwc0KLg9WK95RXOKqdm_KUngd4hv6Tucfns_MALlJyx1s6A2cZR3vco6jKPTW00\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9oYXNoZXNPblVwbG9hZC0xLzE1NTY4MzU4ODQxOTMyODciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9oYXNoZXNPblVwbG9hZC0xIiwibmFtZSI6Imhhc2hlc09uVXBsb2FkLTEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NDE5MzI4NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0NC4xOTJaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDQuMTkyWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQ0LjE5MloiLCJzaXplIjoiMjciLCJtZDVIYXNoIjoib2ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2hhc2hlc09uVXBsb2FkLTE/Z2VuZXJhdGlvbj0xNTU2ODM1ODg0MTkzMjg3JmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NDE5MzI4Ny9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9oYXNoZXNPblVwbG9hZC0xL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJoYXNoZXNPblVwbG9hZC0xIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODQxOTMyODciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0llczU4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NDE5MzI4Ny9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vaGFzaGVzT25VcGxvYWQtMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imhhc2hlc09uVXBsb2FkLTEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NDE5MzI4NyIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNJZXM1ODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9oYXNoZXNPblVwbG9hZC0xLzE1NTY4MzU4ODQxOTMyODcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2hhc2hlc09uVXBsb2FkLTEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJoYXNoZXNPblVwbG9hZC0xIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODQxOTMyODciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0llczU4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NDE5MzI4Ny91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vaGFzaGVzT25VcGxvYWQtMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imhhc2hlc09uVXBsb2FkLTEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NDE5MzI4NyIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNJZXM1ODd4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiY0grQSt3PT0iLCJldGFnIjoiQ0llczU4N3gvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"e60d42eeeafea205\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjcmMzMmMiOiJjSCtBL0E9PSIsIm5hbWUiOiJoYXNoZXNPblVwbG9hZC0xIn0K\",\n          \"SSBjYW4ndCB3YWl0IHRvIGJlIHZlcmlmaWVk\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"3301\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:44 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpZ9QOOcNdGntWr097PRNnaDFbt2xarczbyHRwkwxSiwRZIhV26iZGbh5vHIpvl3Z5Dxc7hjtWuutHTMn8jpCTEowLJNAre2A6mZxVNtV52Vh6XDX4\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImludmFsaWQiLCJtZXNzYWdlIjoiUHJvdmlkZWQgQ1JDMzJDIFwiY0grQS9BPT1cIiBkb2Vzbid0IG1hdGNoIGNhbGN1bGF0ZWQgQ1JDMzJDIFwiY0grQSt3PT1cIi4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9SU5WQUxJRF9WQUxVRSwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPW51bGwsIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5JTlZBTElEX1ZBTFVFLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1udWxsLCBlcnJvclByb3RvQ29kZT1JTlZBTElEX1ZBTFVFLCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5jcmMzMmMsIG1lc3NhZ2U9UHJvdmlkZWQgQ1JDMzJDIFwiY0grQS9BPT1cIiBkb2Vzbid0IG1hdGNoIGNhbGN1bGF0ZWQgQ1JDMzJDIFwiY0grQSt3PT1cIi4sIHVubmFtZWRBcmd1bWVudHM9W2NIK0EvQT09XX0sIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5jcmMzMmMsIG1lc3NhZ2U9UHJvdmlkZWQgQ1JDMzJDIFwiY0grQS9BPT1cIiBkb2Vzbid0IG1hdGNoIGNhbGN1bGF0ZWQgQ1JDMzJDIFwiY0grQSt3PT1cIi4sIHJlYXNvbj1pbnZhbGlkLCBycGNDb2RlPTQwMH0gUHJvdmlkZWQgQ1JDMzJDIFwiY0grQS9BPT1cIiBkb2Vzbid0IG1hdGNoIGNhbGN1bGF0ZWQgQ1JDMzJDIFwiY0grQSt3PT1cIi5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJQcm92aWRlZCBDUkMzMkMgXCJjSCtBL0E9PVwiIGRvZXNuJ3QgbWF0Y2ggY2FsY3VsYXRlZCBDUkMzMkMgXCJjSCtBK3c9PVwiLiJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"5a293e6162b30ef3\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoiaGFzaGVzT25VcGxvYWQtMSJ9Cg==\",\n          \"SSBjYW4ndCB3YWl0IHRvIGJlIHZlcmlmaWVk\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3321\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:44 GMT\"\n          ],\n          \"Etag\": [\n            \"CJuDg8/x/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqgpXYBQOYHYXTQAVb7IGna0BRqHaB7oBdZ19frcgAVGErLbEHe3bESKZ7zKSO6r0AtvqwfCEuJty95EeD5MkwqIsXbr88YcTG0j7M-g4yTKkejukI\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9oYXNoZXNPblVwbG9hZC0xLzE1NTY4MzU4ODQ2NDY4MTEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9oYXNoZXNPblVwbG9hZC0xIiwibmFtZSI6Imhhc2hlc09uVXBsb2FkLTEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NDY0NjgxMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0NC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQ0LjY0NloiLCJzaXplIjoiMjciLCJtZDVIYXNoIjoib2ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2hhc2hlc09uVXBsb2FkLTE/Z2VuZXJhdGlvbj0xNTU2ODM1ODg0NjQ2ODExJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NDY0NjgxMS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9oYXNoZXNPblVwbG9hZC0xL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJoYXNoZXNPblVwbG9hZC0xIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODQ2NDY4MTEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0p1RGc4L3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NDY0NjgxMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vaGFzaGVzT25VcGxvYWQtMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imhhc2hlc09uVXBsb2FkLTEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NDY0NjgxMSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNKdURnOC94L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9oYXNoZXNPblVwbG9hZC0xLzE1NTY4MzU4ODQ2NDY4MTEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2hhc2hlc09uVXBsb2FkLTEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJoYXNoZXNPblVwbG9hZC0xIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODQ2NDY4MTEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0p1RGc4L3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NDY0NjgxMS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vaGFzaGVzT25VcGxvYWQtMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imhhc2hlc09uVXBsb2FkLTEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NDY0NjgxMSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKdURnOC94L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiY0grQSt3PT0iLCJldGFnIjoiQ0p1RGc4L3gvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"19f19648f1196c10\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJtZDVIYXNoIjoib2ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09IiwibmFtZSI6Imhhc2hlc09uVXBsb2FkLTEifQo=\",\n          \"SSBjYW4ndCB3YWl0IHRvIGJlIHZlcmlmaWVk\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3321\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:45 GMT\"\n          ],\n          \"Etag\": [\n            \"CKDem8/x/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqAmKuvPxUsjTHDB5nMuNG92dU0gql0Yol2zlvPDWEDuXHQRLhOJzYBAH207Ot-_IB22pH5QSfTaTayqEWBUfkobCR9YGVa79W0LG4fv9fnAjxk5Cs\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9oYXNoZXNPblVwbG9hZC0xLzE1NTY4MzU4ODUwNTE2ODAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9oYXNoZXNPblVwbG9hZC0xIiwibmFtZSI6Imhhc2hlc09uVXBsb2FkLTEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NTA1MTY4MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0NS4wNTFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDUuMDUxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQ1LjA1MVoiLCJzaXplIjoiMjciLCJtZDVIYXNoIjoib2ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2hhc2hlc09uVXBsb2FkLTE/Z2VuZXJhdGlvbj0xNTU2ODM1ODg1MDUxNjgwJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NTA1MTY4MC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9oYXNoZXNPblVwbG9hZC0xL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJoYXNoZXNPblVwbG9hZC0xIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODUwNTE2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0tEZW04L3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NTA1MTY4MC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vaGFzaGVzT25VcGxvYWQtMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imhhc2hlc09uVXBsb2FkLTEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NTA1MTY4MCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNLRGVtOC94L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9oYXNoZXNPblVwbG9hZC0xLzE1NTY4MzU4ODUwNTE2ODAvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2hhc2hlc09uVXBsb2FkLTEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJoYXNoZXNPblVwbG9hZC0xIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODUwNTE2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0tEZW04L3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NTA1MTY4MC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vaGFzaGVzT25VcGxvYWQtMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imhhc2hlc09uVXBsb2FkLTEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NTA1MTY4MCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNLRGVtOC94L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiY0grQSt3PT0iLCJldGFnIjoiQ0tEZW04L3gvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"880416f9891fc25f\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJtZDVIYXNoIjoib3ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09IiwibmFtZSI6Imhhc2hlc09uVXBsb2FkLTEifQo=\",\n          \"SSBjYW4ndCB3YWl0IHRvIGJlIHZlcmlmaWVk\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"3515\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:45 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoFC5_DRlr9xktR_eWpfuFqiZRbenVOATtUEg3tfJC8JbCqagKQzn0_sYLvxvG52ordbl2Nwo0L6Y0AbwuenLAo1uoX4uzHnro-JiY8MkdQEsO3uSA\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImludmFsaWQiLCJtZXNzYWdlIjoiUHJvdmlkZWQgTUQ1IGhhc2ggXCJvdlpqR2xjWFBKaUdPQWZLRmJKbDFRPT1cIiBkb2Vzbid0IG1hdGNoIGNhbGN1bGF0ZWQgTUQ1IGhhc2ggXCJvZlpqR2xjWFBKaUdPQWZLRmJKbDFRPT1cIi4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9SU5WQUxJRF9WQUxVRSwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPW51bGwsIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5JTlZBTElEX1ZBTFVFLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1udWxsLCBlcnJvclByb3RvQ29kZT1JTlZBTElEX1ZBTFVFLCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5tZDVfaGFzaF9iYXNlNjQsIG1lc3NhZ2U9UHJvdmlkZWQgTUQ1IGhhc2ggXCJvdlpqR2xjWFBKaUdPQWZLRmJKbDFRPT1cIiBkb2Vzbid0IG1hdGNoIGNhbGN1bGF0ZWQgTUQ1IGhhc2ggXCJvZlpqR2xjWFBKaUdPQWZLRmJKbDFRPT1cIi4sIHVubmFtZWRBcmd1bWVudHM9W292WmpHbGNYUEppR09BZktGYkpsMVE9PV19LCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UubWQ1X2hhc2hfYmFzZTY0LCBtZXNzYWdlPVByb3ZpZGVkIE1ENSBoYXNoIFwib3ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09XCIgZG9lc24ndCBtYXRjaCBjYWxjdWxhdGVkIE1ENSBoYXNoIFwib2ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09XCIuLCByZWFzb249aW52YWxpZCwgcnBjQ29kZT00MDB9IFByb3ZpZGVkIE1ENSBoYXNoIFwib3ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09XCIgZG9lc24ndCBtYXRjaCBjYWxjdWxhdGVkIE1ENSBoYXNoIFwib2ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09XCIuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDAwLCJtZXNzYWdlIjoiUHJvdmlkZWQgTUQ1IGhhc2ggXCJvdlpqR2xjWFBKaUdPQWZLRmJKbDFRPT1cIiBkb2Vzbid0IG1hdGNoIGNhbGN1bGF0ZWQgTUQ1IGhhc2ggXCJvZlpqR2xjWFBKaUdPQWZLRmJKbDFRPT1cIi4ifX0=\"\n      }\n    },\n    {\n      \"ID\": \"e1a7bef7c2f0f7b9\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/iam?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"341\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:45 GMT\"\n          ],\n          \"Etag\": [\n            \"CAo=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:45 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrDioJ0fktjtyI_mABE4-oH9KqDlurM5mWiYDhoDp_LRJYSPvDxjuoaYzNhjoTHdHPALySTzCxScTstm27R-praR27EAm4Gx9k3wHAAwKJUptqRnFE\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNwb2xpY3kiLCJyZXNvdXJjZUlkIjoicHJvamVjdHMvXy9idWNrZXRzL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImJpbmRpbmdzIjpbeyJyb2xlIjoicm9sZXMvc3RvcmFnZS5sZWdhY3lCdWNrZXRPd25lciIsIm1lbWJlcnMiOlsicHJvamVjdEVkaXRvcjpkZWtsZXJrLXNhbmRib3giLCJwcm9qZWN0T3duZXI6ZGVrbGVyay1zYW5kYm94Il19LHsicm9sZSI6InJvbGVzL3N0b3JhZ2UubGVnYWN5QnVja2V0UmVhZGVyIiwibWVtYmVycyI6WyJwcm9qZWN0Vmlld2VyOmRla2xlcmstc2FuZGJveCJdfV0sImV0YWciOiJDQW89In0=\"\n      }\n    },\n    {\n      \"ID\": \"df5371a2b0cd8c3b\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/iam?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"317\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJiaW5kaW5ncyI6W3sibWVtYmVycyI6WyJwcm9qZWN0RWRpdG9yOmRla2xlcmstc2FuZGJveCIsInByb2plY3RPd25lcjpkZWtsZXJrLXNhbmRib3giXSwicm9sZSI6InJvbGVzL3N0b3JhZ2UubGVnYWN5QnVja2V0T3duZXIifSx7Im1lbWJlcnMiOlsicHJvamVjdFZpZXdlcjpkZWtsZXJrLXNhbmRib3giXSwicm9sZSI6InJvbGVzL3N0b3JhZ2UubGVnYWN5QnVja2V0UmVhZGVyIn0seyJtZW1iZXJzIjpbInByb2plY3RWaWV3ZXI6ZGVrbGVyay1zYW5kYm94Il0sInJvbGUiOiJyb2xlcy9zdG9yYWdlLm9iamVjdFZpZXdlciJ9XSwiZXRhZyI6IkNBbz0ifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"423\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:46 GMT\"\n          ],\n          \"Etag\": [\n            \"CAs=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrAVgetrpv1xjtKv2B7KFBdnbg20V-btiRn3sD4kQF7shWIQ1-FqJMRsbYfcYJyTMQHv_BhW_eVzvcc56z0LOcYfE-wbCRZpqYjen6c-bVcMzPet2A\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNwb2xpY3kiLCJyZXNvdXJjZUlkIjoicHJvamVjdHMvXy9idWNrZXRzL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImJpbmRpbmdzIjpbeyJyb2xlIjoicm9sZXMvc3RvcmFnZS5sZWdhY3lCdWNrZXRPd25lciIsIm1lbWJlcnMiOlsicHJvamVjdEVkaXRvcjpkZWtsZXJrLXNhbmRib3giLCJwcm9qZWN0T3duZXI6ZGVrbGVyay1zYW5kYm94Il19LHsicm9sZSI6InJvbGVzL3N0b3JhZ2UubGVnYWN5QnVja2V0UmVhZGVyIiwibWVtYmVycyI6WyJwcm9qZWN0Vmlld2VyOmRla2xlcmstc2FuZGJveCJdfSx7InJvbGUiOiJyb2xlcy9zdG9yYWdlLm9iamVjdFZpZXdlciIsIm1lbWJlcnMiOlsicHJvamVjdFZpZXdlcjpkZWtsZXJrLXNhbmRib3giXX1dLCJldGFnIjoiQ0FzPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"feaa4b1a4dda0450\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/iam?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"423\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:46 GMT\"\n          ],\n          \"Etag\": [\n            \"CAs=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:46 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqwMVZVQQ8s-ZBUJDLKyC-qMMTANncoBhRQWlMCITVUXQrTnFGGxu4GdKyVcuudrSa-DWy5w5iLE-i4a407GopUNma3xIq1eNiyVAziPD7jQ4YluzA\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNwb2xpY3kiLCJyZXNvdXJjZUlkIjoicHJvamVjdHMvXy9idWNrZXRzL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImJpbmRpbmdzIjpbeyJyb2xlIjoicm9sZXMvc3RvcmFnZS5sZWdhY3lCdWNrZXRPd25lciIsIm1lbWJlcnMiOlsicHJvamVjdEVkaXRvcjpkZWtsZXJrLXNhbmRib3giLCJwcm9qZWN0T3duZXI6ZGVrbGVyay1zYW5kYm94Il19LHsicm9sZSI6InJvbGVzL3N0b3JhZ2UubGVnYWN5QnVja2V0UmVhZGVyIiwibWVtYmVycyI6WyJwcm9qZWN0Vmlld2VyOmRla2xlcmstc2FuZGJveCJdfSx7InJvbGUiOiJyb2xlcy9zdG9yYWdlLm9iamVjdFZpZXdlciIsIm1lbWJlcnMiOlsicHJvamVjdFZpZXdlcjpkZWtsZXJrLXNhbmRib3giXX1dLCJldGFnIjoiQ0FzPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"23d94c8a09c0c334\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/iam/testPermissions?alt=json\\u0026permissions=storage.buckets.get\\u0026permissions=storage.buckets.delete\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"108\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:46 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:46 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoR-XKWu9nOWmFZve2-NeDyDvZDo5rYpPD3avVEmZkZ-lODvHCSR0D7zdPeCa61L5EtOIYJBqmC0D9Xc229A1GDS5d91vgAGuzRoxRnNa9DjBw68xM\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSN0ZXN0SWFtUGVybWlzc2lvbnNSZXNwb25zZSIsInBlcm1pc3Npb25zIjpbInN0b3JhZ2UuYnVja2V0cy5nZXQiLCJzdG9yYWdlLmJ1Y2tldHMuZGVsZXRlIl19\"\n      }\n    },\n    {\n      \"ID\": \"3d0a13fe961ed15c\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"93\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJiaWxsaW5nIjp7InJlcXVlc3RlclBheXMiOnRydWV9LCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIn0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"518\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:47 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoIRjhruHo5rweyX35Zt-Mzm5UDD5vr4319gSNjtnJHD2RWtVLvQdjuZ0jv-XKT3s1xcJO7CvoU-qAehCknukI5ssvv2LgwazyhnkcuFws3isqM9uo\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQ2LjgwM1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0Ni44MDNaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImJpbGxpbmciOnsicmVxdWVzdGVyUGF5cyI6dHJ1ZX0sImV0YWciOiJDQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"c1f385994f4db8e3\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/user-integration%40gcloud-golang-firestore-tests.iam.gserviceaccount.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"159\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJ1c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIn0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"589\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:48 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UozEPu-BKQnmBUxTwsOWB7mmIPC5lppmUt6lA150OiXgQttSVRetVysUp299p7PbjI08qchUQl2idgMbfBCScDL5SuoHi_u9ani0DXYX2OV9QXAovQ\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNBST0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"ccb3141a79c55333\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"3054\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:48 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:48 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoG9XpooOFPlHtC8fg7llzYYETQUMEm0PvG4TbxBF5KdfCdB_sxNi0Yy9KrAmMDPBVyq0Iuaq7mzQOhQe9lXe5PBOc8-CGTXZiEMkMMJe3OYxjExIM\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQ2LjgwM1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0Ny45MTlaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNBST0ifV0sImRlZmF1bHRPYmplY3RBY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FJPSJ9XSwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sIm93bmVyIjp7ImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCJ9LCJsb2NhdGlvbiI6IlVTIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJiaWxsaW5nIjp7InJlcXVlc3RlclBheXMiOnRydWV9LCJldGFnIjoiQ0FJPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"2d4244737318f2d5\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026userProject=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"3054\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:48 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:48 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqn_UdEXhLLXE1QsYjwtyqQlzX3nDvpAO1WNpRkHhyV39RJKkxMBrcd8f6Xo3VZFDps7iKuQHnW49yRqjh42062lkisOH7otDXrdAKAih4Iz9fzERM\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQ2LjgwM1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0Ny45MTlaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNBST0ifV0sImRlZmF1bHRPYmplY3RBY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FJPSJ9XSwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sIm93bmVyIjp7ImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCJ9LCJsb2NhdGlvbiI6IlVTIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJiaWxsaW5nIjp7InJlcXVlc3RlclBheXMiOnRydWV9LCJldGFnIjoiQ0FJPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"b63c3951975a766e\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"12183\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:49 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:49 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uq-LP6kQLHNpjT5jYVkPzNXyfr838sGr4jGMVPq-FOq01ayCWvyWVAsvUbxp0NSdOYJcW-z0i2NkQLuSKGQYrX_3z8LW1Vb4uL2jxfC8kSiuz28hkA\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5HZXRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldEJ1Y2tldC5qYXZhOjEwNClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkdldEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0QnVja2V0LmphdmE6MzMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IuZ2V0KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YTo4Mylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YToxMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5HZXRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldEJ1Y2tldC5qYXZhOjMzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmdldChCdWNrZXRzRGVsZWdhdG9yLmphdmE6ODMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YToxMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5HZXRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldEJ1Y2tldC5qYXZhOjMzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmdldChCdWNrZXRzRGVsZWdhdG9yLmphdmE6ODMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YToxMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5HZXRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldEJ1Y2tldC5qYXZhOjMzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmdldChCdWNrZXRzRGVsZWdhdG9yLmphdmE6ODMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19\"\n      }\n    },\n    {\n      \"ID\": \"0764f2598b67c664\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026userProject=gcloud-golang-firestore-tests\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"3054\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:49 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:49 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrGddSv5GSaZB7qBmb0PigbMbJmWs91JB0W99oOTcbMeUk9QeBf-7QF7W_BpAn3wNxqVD5cBDPgGuKrZCfYv77SgCGxcPW-jrXsUY5h50q8eFL0_3o\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQ2LjgwM1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0Ny45MTlaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNBST0ifV0sImRlZmF1bHRPYmplY3RBY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FJPSJ9XSwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sIm93bmVyIjp7ImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCJ9LCJsb2NhdGlvbiI6IlVTIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJiaWxsaW5nIjp7InJlcXVlc3RlclBheXMiOnRydWV9LCJldGFnIjoiQ0FJPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"bdb0ff507e4df251\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026userProject=veener-jba\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"13039\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:49 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:49 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Up8t6bOWiJucB8KpVlIp8WjWLSUKssQaynZNguVy_oBM2ggBePUFnoteMcbw_L9aSHoD4hwi91dMaBC4aVc6VuaMSBSVuCe0L_0IymxhBIx3SRj_As\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YToxMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5HZXRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldEJ1Y2tldC5qYXZhOjMzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmdldChCdWNrZXRzRGVsZWdhdG9yLmphdmE6ODMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YToxMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5HZXRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldEJ1Y2tldC5qYXZhOjMzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmdldChCdWNrZXRzRGVsZWdhdG9yLmphdmE6ODMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkdldEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0QnVja2V0LmphdmE6MTA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YTozMylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5nZXQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjgzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkdldEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0QnVja2V0LmphdmE6MTA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YTozMylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5nZXQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjgzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"d2e66ae2cc0d11bc\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoiZm9vIn0K\",\n          \"aGVsbG8=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3133\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:50 GMT\"\n          ],\n          \"Etag\": [\n            \"COq52NHx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqQ_qlqWPPh6t8-gwPlD5zRB96zsmFgzyez4LG3XN4uErivnyHcCeeHje_i95VLJcWYXn7_-knEn0faPBCCAIStf4fXGs_Lz_VzHK6CLBZjU-oBxcU\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MDI0MDc0NiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MDI0MDc0NiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo1MC4yNDBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NTAuMjQwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjUwLjI0MFoiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTg5MDI0MDc0NiZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MDI0MDc0Ni9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkwMjQwNzQ2IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNPcTUyTkh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MDI0MDc0Ni9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTAyNDA3NDYiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT3E1Mk5IeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTAyNDA3NDYvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkwMjQwNzQ2IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPcTUyTkh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MDI0MDc0Ni91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTAyNDA3NDYiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT3E1Mk5IeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPcTUyTkh4L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"89b2bc9232a865a4\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\\u0026userProject=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoiZm9vIn0K\",\n          \"aGVsbG8=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3133\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:50 GMT\"\n          ],\n          \"Etag\": [\n            \"CJTz9tHx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrymnpCwS6vZ0kM33ZD4nBupWs9hAuaOGpwiNcS4GJctgaLPe9CQ0Ada06yQV1aEfh9FtX6lgYh9jHwbsT6qdgOYOYe9yGDdAF9f91aE4y4VUHQHts\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MDczOTYwNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MDczOTYwNCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo1MC43MzlaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NTAuNzM5WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjUwLjczOVoiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTg5MDczOTYwNCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MDczOTYwNC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkwNzM5NjA0IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKVHo5dEh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MDczOTYwNC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTA3Mzk2MDQiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSlR6OXRIeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTA3Mzk2MDQvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkwNzM5NjA0IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKVHo5dEh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MDczOTYwNC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTA3Mzk2MDQiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSlR6OXRIeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNKVHo5dEh4L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"a70634faba29225b\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoiZm9vIn0K\",\n          \"aGVsbG8=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"12243\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:51 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqsIKUUc6WyIHUlDvAIDlXVeOofVG4sVV3Rus8ktfPMTUTI7e4PH4657AoDnNOKKy9TOgt8yUtUvCNvDFQC1xwVApFofRhWT3kcjsEYRgZPCDDsUqM\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6NDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuaW5zZXJ0KE9iamVjdHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19\"\n      }\n    },\n    {\n      \"ID\": \"5539336327f2e0ba\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\\u0026userProject=gcloud-golang-firestore-tests\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoiZm9vIn0K\",\n          \"aGVsbG8=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3193\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:51 GMT\"\n          ],\n          \"Etag\": [\n            \"COGeqNLx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrH7pn9r8O1Zu1Nc2aNUO_CO75MyvOJyONGw27TUkfWRSSmFIWJUZ6F3e3OprVF5jKtAkQ73puZbyNCK6mozyHrmPRRa0mtyuBPhkYg4DzPGkXJOSU\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo1MS41NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NTEuNTQ3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjUxLjU0N1oiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTg5MTU0ODAwMSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS91c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJ1c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT0dlcU5MeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"029ec3d54709e7ce\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\\u0026userProject=veener-jba\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoiZm9vIn0K\",\n          \"aGVsbG8=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"13099\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:52 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqcpItVCw5LaIWvDckOjfoChIifJGtuURBAmgtpzzna_iVOfDSaQOhxiMDVfYkV3mKG7__z0WTNRdVpa2Zs2IPcIAKwqwSeIMaLtz--MluSCHv9kc8\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"bc0d0ed808bc8e68\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0003/foo\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"5\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:52 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"5d41402abc4b2a76b9719d911017c592\\\"\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:51 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835891548001\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=mnG7TA==\",\n            \"md5=XUFAKrxLKna5cZ2REBfFkg==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"5\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpljfpVGJewuMZUyJZ8DU7j2k6JmfPqXXgkeeu8vGdK5j-C_DUgpubS4nFEp1z8EsN-fUdceCxfiy-FGIJiFpME38hWnztW_WIn6zeSh6LCbwIK9oM\"\n          ]\n        },\n        \"Body\": \"aGVsbG8=\"\n      }\n    },\n    {\n      \"ID\": \"b695481e00d2d6d9\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0003/foo\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ],\n          \"X-Goog-User-Project\": [\n            \"deklerk-sandbox\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"5\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:52 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"5d41402abc4b2a76b9719d911017c592\\\"\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:51 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835891548001\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=mnG7TA==\",\n            \"md5=XUFAKrxLKna5cZ2REBfFkg==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"5\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrmYf7b7ig2ase_O8qHEsgSAXifAlxVdDy_Zh5Qaqx1IlL1wkTvy1BSblI6ZDz3M2X-Y6KrdJp1IaP6nDU1F_Yhyt84Y7dOG80r2g-x4E7NAyyjV0o\"\n          ]\n        },\n        \"Body\": \"aGVsbG8=\"\n      }\n    },\n    {\n      \"ID\": \"2fe3b6cc96ffa451\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0003/foo\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"266\"\n          ],\n          \"Content-Type\": [\n            \"application/xml; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:52 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:52 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur-S2G_BUo7MzXUj-7vUDuVFWfBIA5GJYfTdaeruyelzRGFimnhov8wRB_ozWC2cGPQ-a2xQk8bw_cVV_D2Q7c7rdR1ujaTM3oIjr8vjsJBZXa1VeA\"\n          ]\n        },\n        \"Body\": \"PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+VXNlclByb2plY3RNaXNzaW5nPC9Db2RlPjxNZXNzYWdlPkJ1Y2tldCBpcyBhIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjwvTWVzc2FnZT48RGV0YWlscz5CdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci48L0RldGFpbHM+PC9FcnJvcj4=\"\n      }\n    },\n    {\n      \"ID\": \"59bdcad91d723d0e\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0003/foo\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ],\n          \"X-Goog-User-Project\": [\n            \"gcloud-golang-firestore-tests\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"5\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:52 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"5d41402abc4b2a76b9719d911017c592\\\"\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:24:51 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835891548001\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=mnG7TA==\",\n            \"md5=XUFAKrxLKna5cZ2REBfFkg==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"5\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Up3lrNfk5bvup2RRbcsT6CeDACQitaiF3BTMyQ7B23ACtTqwWweq9ooOfZn3CX7tsbzljhlY_009nsTXXQwm7V_xNNd8FZwT44CzSpul-SZIRODC2w\"\n          ]\n        },\n        \"Body\": \"aGVsbG8=\"\n      }\n    },\n    {\n      \"ID\": \"7b7b6a79cd2a53e3\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0003/foo\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ],\n          \"X-Goog-User-Project\": [\n            \"veener-jba\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"342\"\n          ],\n          \"Content-Type\": [\n            \"application/xml; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:52 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:52 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpT7Ge_QpcDrqajg6a4kZrmoA55ZSma9IM3pyz0Ow1bu5nLURc0V7cAThbvikg47_O-ox0uMdF6zBbtVtKL7olyMUGd9wqCQ9ubELVoJXiNMDehvXY\"\n          ]\n        },\n        \"Body\": \"PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+VXNlclByb2plY3RBY2Nlc3NEZW5pZWQ8L0NvZGU+PE1lc3NhZ2U+UmVxdWVzdGVyIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBwZXJtaXNzaW9ucyBvbiB1c2VyIHByb2plY3QuPC9NZXNzYWdlPjxEZXRhaWxzPmludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuPC9EZXRhaWxzPjwvRXJyb3I+\"\n      }\n    },\n    {\n      \"ID\": \"914bca19df35cbed\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3193\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:53 GMT\"\n          ],\n          \"Etag\": [\n            \"COGeqNLx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpM7lBsoxgNb-rh81Lfe0tWFGTkXQYfEB12ofkKZ8SK8kK5bPRUsQMVhm3aYB2N9e5_QSBZA25my-t5LpgR8TVW1lNTGd97OoD7bdBhP_CGo3xMbos\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo1MS41NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NTEuNTQ3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjUxLjU0N1oiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTg5MTU0ODAwMSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS91c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJ1c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT0dlcU5MeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"164b4ffce0c7e233\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026userProject=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3193\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:53 GMT\"\n          ],\n          \"Etag\": [\n            \"COGeqNLx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqbRkPvid4Zo9mQsbMXlTlOQ1womp_CnHUJcNWRamG_lp4ABhgVPVOdL8lE11J3tmvVkYhzcEPpIJuA_RTvuAbssXFsNo9Fu14cQ44HwhSRYk7r_dU\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo1MS41NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NTEuNTQ3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjUxLjU0N1oiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTg5MTU0ODAwMSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS91c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJ1c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT0dlcU5MeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"d04d3cb2ac9d6376\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"12183\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:53 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:53 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrcH6PdfDpm0th9SnZgYwMYIiYGYz2VvNs-Nb0VYFbZdA4QXfOJiRFg-xKqmDq09HRt7j8OwTDO7UMm2EiqwjPz7j_JPIvfcCzfCnVVoF3XiZFomuQ\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5HZXRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldE9iamVjdC5qYXZhOjMwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkdldE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0T2JqZWN0LmphdmE6NzApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZ2V0KE9iamVjdHNEZWxlZ2F0b3IuamF2YTo4MSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuR2V0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRPYmplY3QuamF2YTozMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5HZXRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldE9iamVjdC5qYXZhOjcwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmdldChPYmplY3RzRGVsZWdhdG9yLmphdmE6ODEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuR2V0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRPYmplY3QuamF2YTozMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5HZXRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldE9iamVjdC5qYXZhOjcwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmdldChPYmplY3RzRGVsZWdhdG9yLmphdmE6ODEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuR2V0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRPYmplY3QuamF2YTozMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5HZXRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldE9iamVjdC5qYXZhOjcwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmdldChPYmplY3RzRGVsZWdhdG9yLmphdmE6ODEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19\"\n      }\n    },\n    {\n      \"ID\": \"8b3aeb1f423d76c5\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026userProject=gcloud-golang-firestore-tests\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3193\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:54 GMT\"\n          ],\n          \"Etag\": [\n            \"COGeqNLx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoX_zzYo9AYFb44YmIz49k5z8v8ITzEQsDrSxEE50-7AC-ndg18Yo5DFAZ9ZFCDtT5P7kch3c0-YlkhX-5oYCUIm-mmPmoTg0CKWVI0TJ9la9z9-vE\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo1MS41NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NTEuNTQ3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjUxLjU0N1oiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTg5MTU0ODAwMSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS91c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJ1c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT0dlcU5MeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"f32edc9a9263c0a1\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026userProject=veener-jba\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"13039\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:54 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:54 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uok5lyOpE3YUZDwRz_bsA-E-xzWeqaApyadumOOFoA_YmOi_xnvFaJr6gfp9Gaktbpud9mv8qDCIvq1Yu7CyAVY0ScanSfNCke3naR_G7kPKYgrywY\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuR2V0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRPYmplY3QuamF2YTozMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5HZXRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldE9iamVjdC5qYXZhOjcwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmdldChPYmplY3RzRGVsZWdhdG9yLmphdmE6ODEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuR2V0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRPYmplY3QuamF2YTozMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5HZXRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldE9iamVjdC5qYXZhOjcwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmdldChPYmplY3RzRGVsZWdhdG9yLmphdmE6ODEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkdldE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0T2JqZWN0LmphdmE6MzA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuR2V0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRPYmplY3QuamF2YTo3MClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5nZXQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjgxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkdldE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0T2JqZWN0LmphdmE6MzA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuR2V0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRPYmplY3QuamF2YTo3MClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5nZXQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjgxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"da73739950dbfa82\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"85\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiJ9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3216\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:54 GMT\"\n          ],\n          \"Etag\": [\n            \"COGeqNLx/eECEAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrdpofRnchjkCQz5LLoghzg-RHoGATH3xbgJVW0LKGBkH025w5EB5RlGmHHnmXuPtK_5Ffyl1bxjmoc_h7_vGvjcxWbHv9-NKe9fLO_oNYRmw-ffvU\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo1MS41NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NTQuNzM4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjUxLjU0N1oiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTg5MTU0ODAwMSZhbHQ9bWVkaWEiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ09HZXFOTHgvZUVDRUFJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ09HZXFOTHgvZUVDRUFJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3VzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3VzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBST0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ09HZXFOTHgvZUVDRUFJPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"94e697431c9323b9\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026userProject=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"85\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiJ9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3216\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:55 GMT\"\n          ],\n          \"Etag\": [\n            \"COGeqNLx/eECEAM=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqhr0guIL00afW_qpaRvxEGRSJEWTtfrZP2Tv8Vqt2xas1ivvvMHVbSpT12ltU7FjytFhno9SFXTS8pW1S0S8qJdFctUCa83tkcQRXgN1uPUwhX1ws\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsIm1ldGFnZW5lcmF0aW9uIjoiMyIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo1MS41NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NTUuMTMwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjUxLjU0N1oiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTg5MTU0ODAwMSZhbHQ9bWVkaWEiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ09HZXFOTHgvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ09HZXFOTHgvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3VzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3VzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBTT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ09HZXFOTHgvZUVDRUFNPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"3c5d694690a75054\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"85\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiJ9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"12375\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:55 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UogsU3nh3dfRYWq9YqTmJc7CfCX1U0b-IrWpDCM7M4YwfuUWgzzzcydWdHLrF0UPqRxNFQj3eMHBbDuHYcF0xuUNah4g5J_nt26feHRp-moh7uFXNw\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5VcGRhdGVBbmRQYXRjaE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQW5kUGF0Y2hPYmplY3QuamF2YTo0MjgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5VcGRhdGVBbmRQYXRjaE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQW5kUGF0Y2hPYmplY3QuamF2YTo1OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci51cGRhdGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEwMylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NDI4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NTgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IudXBkYXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NDI4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NTgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IudXBkYXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NDI4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NTgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IudXBkYXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19\"\n      }\n    },\n    {\n      \"ID\": \"e050063f79f64820\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026userProject=gcloud-golang-firestore-tests\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"85\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiJ9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3216\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:55 GMT\"\n          ],\n          \"Etag\": [\n            \"COGeqNLx/eECEAQ=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uq4hs_SY8_2HHPHu8NfVIkOdwmZz7h6XH0nWRSTQJSqzQZQGvv1p83Z6W209h3bXsbN9_ESiU3OIyLRwmEldfBP94hRhN5t1JnagcKPcMEOv8FtvHs\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsIm1ldGFnZW5lcmF0aW9uIjoiNCIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo1MS41NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NTUuODI0WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjUxLjU0N1oiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTg5MTU0ODAwMSZhbHQ9bWVkaWEiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ09HZXFOTHgvZUVDRUFRPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBUT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ09HZXFOTHgvZUVDRUFRPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3VzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3VzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBUT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ09HZXFOTHgvZUVDRUFRPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"f7edef926cdb7d75\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026userProject=veener-jba\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"85\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiJ9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"13231\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:56 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqyQ9DLrBDGkx7uOkrIKrzMMYA4YygdFsd1si16n2Lr4I5Rfp1lxwadC3jThiJbE-cDyuZATHtvM2bzpsRDPJzbmKgtxYydHykiB-oCsSFqfwy50gw\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NDI4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NTgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IudXBkYXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NDI4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NTgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IudXBkYXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlVwZGF0ZUFuZFBhdGNoT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBbmRQYXRjaE9iamVjdC5qYXZhOjQyOClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlVwZGF0ZUFuZFBhdGNoT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBbmRQYXRjaE9iamVjdC5qYXZhOjU4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLnVwZGF0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlVwZGF0ZUFuZFBhdGNoT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBbmRQYXRjaE9iamVjdC5qYXZhOjQyOClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlVwZGF0ZUFuZFBhdGNoT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBbmRQYXRjaE9iamVjdC5qYXZhOjU4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLnVwZGF0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"2745d195a40b86f1\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"107\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"377\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:57 GMT\"\n          ],\n          \"Etag\": [\n            \"CAM=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpGeWJRYTNsu57knuRFhwHuoeUMIJhUtuQj4PLhGDoFcITB2Y--7JgaOCVhepJ6a5RRKvU9d3UrAyrtbGNOVHyW2WAbN_KpfkiFhYq8l7HPERpLDjg\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZG9tYWluLWdvb2dsZS5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvYWNsL2RvbWFpbi1nb29nbGUuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDQU09In0=\"\n      }\n    },\n    {\n      \"ID\": \"5258a70437064146\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\\u0026prettyPrint=false\\u0026userProject=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"107\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"377\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:57 GMT\"\n          ],\n          \"Etag\": [\n            \"CAM=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqImoOCe_iDYCV8XHpaaEXPn-jeAf0M1MyixGju1tNCSTBIMEKDzh_wxVxapMmXWPnOes7YX0T0Fr663x7eJCl85B0EGXggUgp8bqeDV3cJ-mqeDrY\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZG9tYWluLWdvb2dsZS5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvYWNsL2RvbWFpbi1nb29nbGUuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDQU09In0=\"\n      }\n    },\n    {\n      \"ID\": \"5cef2c464b7356c8\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"107\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"12243\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:58 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpH5br-AVWN2g1nkkM_FJWZIjgOgh2NGLuiyYUS7QD2DSs6B-c0IQHgC2NUyy0eZq4McQhwxBGhUJ05-WeD_bX35i7skN7Jn_q3ELAaDwpi6_x3Z8c\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5VcGRhdGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBY2xzLmphdmE6OTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5VcGRhdGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBY2xzLmphdmE6MjcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLnVwZGF0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwMylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19\"\n      }\n    },\n    {\n      \"ID\": \"11cd5140a264e423\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\\u0026prettyPrint=false\\u0026userProject=gcloud-golang-firestore-tests\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"107\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"377\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:58 GMT\"\n          ],\n          \"Etag\": [\n            \"CAM=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uo2_tsxxuZC3Ni-A0zL0E9w8OVne0sWfLi61Cv48eTWj2R4F6G0AmXZU7J8L-WnDJf4s-6GpZV0SyQqrjBA_Mp75pJfWb6cl9_7oimTy8HPnxAtMwc\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZG9tYWluLWdvb2dsZS5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvYWNsL2RvbWFpbi1nb29nbGUuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDQU09In0=\"\n      }\n    },\n    {\n      \"ID\": \"dac6629e58d45469\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\\u0026prettyPrint=false\\u0026userProject=veener-jba\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"107\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"13099\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:58 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrTXUzCa6WOvWD6NqoHhkdwRtG0Z4h0QurHOuKU1gyAWzXOt8lc1NVsLqe-6m8siE76k7l8g0EY3Le273_4GFB81gHMhM4qBOOgbwSBgLl4zKHZspU\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YTo5MClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YToyNylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IudXBkYXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YTo5MClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YToyNylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IudXBkYXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"1c8663192ed534e8\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2370\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:59 GMT\"\n          ],\n          \"Etag\": [\n            \"CAM=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:59 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqfc2TzyVBAwGuVpWWQt7OYr3IQEmVj5R7LIr5LSRAhwFernkoD6TFVnJno_ria4LL8P9tSQgzCF7uJpStJTpYgTOiW5FqTxQ-AgbOjFmAMjah3o6U\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FNPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9kb21haW4tZ29vZ2xlLmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvZG9tYWluLWdvb2dsZS5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNBTT0ifV19\"\n      }\n    },\n    {\n      \"ID\": \"51858ae7ea77845a\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl?alt=json\\u0026prettyPrint=false\\u0026userProject=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2370\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:59 GMT\"\n          ],\n          \"Etag\": [\n            \"CAM=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:59 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqc5V7vaPL-d4aMLJi5QXyxZYWWtGBx0QuvfeB8rFlhwPGPFLQUABxm_XXkR0AOeIqdZ-intSu7I5srWdFKX85aY8r-z4oRTuB-CjGUe5uMiXQzXU4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FNPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9kb21haW4tZ29vZ2xlLmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvZG9tYWluLWdvb2dsZS5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNBTT0ifV19\"\n      }\n    },\n    {\n      \"ID\": \"8248d1314da9a068\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"12203\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:24:59 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:24:59 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqrg4CYWnZtCkMXT5KHCcQXY-aSGc6JuuEoVkTtKgObB9qr-dE-5sMKCrbTfpFudhid3ulDpkNuOUmRmBy4k7QQoRxqgues_a8dB85cOybZKZTM864\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9UkVRVUlSRUQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9YmFkUmVxdWVzdCwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uUkVRVUlSRUQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfTUlTU0lORzogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjEwMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5saXN0KEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6ODkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MTAxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmxpc3QoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YTo4OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMCwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4ifX0=\"\n      }\n    },\n    {\n      \"ID\": \"8c1628782bcf7eaf\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl?alt=json\\u0026prettyPrint=false\\u0026userProject=gcloud-golang-firestore-tests\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2370\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:00 GMT\"\n          ],\n          \"Etag\": [\n            \"CAM=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:00 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqmer5wTHG4zziRJUR_QqUbX_xgytHZkMg2KFntbVz8pn55RFN7idAyYcqz3AhqthLD-bHH2Lggdg4MuIdjHVk_kKHxvDdqI0p814avmZPYAhJdvsE\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FNPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9kb21haW4tZ29vZ2xlLmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvZG9tYWluLWdvb2dsZS5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNBTT0ifV19\"\n      }\n    },\n    {\n      \"ID\": \"6813d64060667ba0\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl?alt=json\\u0026prettyPrint=false\\u0026userProject=veener-jba\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"13059\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:00 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:00 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpsvYC9PE_CO5H9MncFfA0uYzQqFBOqu0_zdexcxDTJ22CO_vv1LiRY6ZSC49_FMeUZBA3KdMfOnS7DsSxBpqrLC9ZM6GAs2sFolmZKhp0RWJjvOzs\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MTAxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmxpc3QoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YTo4OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9Rk9SQklEREVOLCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9BQ0NFU1NfREVOSUVEOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1mb3JiaWRkZW4sIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLkZPUkJJRERFTiwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9BQ0NFU1NfREVOSUVEOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjEwMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5saXN0KEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6ODkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMywibWVzc2FnZSI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuIn19\"\n      }\n    },\n    {\n      \"ID\": \"76ac0290041d5a26\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:01 GMT\"\n          ],\n          \"Etag\": [\n            \"CAQ=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur-ejQ-G_PN4CMllngdiEh1SqHQNy8TXBA-htpazVSOadp1oThRsYsQuflX2kwkDQHFpeo1UgDPXqi5BRq8qZUBsM2koJIMOp-APWnB8T_qsTHlY30\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"0de0d173f3f5c2cc\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\\u0026prettyPrint=false\\u0026userProject=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 404,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"11631\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:01 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:01 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqLOtWcLW6yZk8n72e3qkdl4ft2-s7FJFYyRv_5REkk9Q6d7qk6Pcpcy_HMCJFgKTV5RZzzIU3k5hceknIV1XNGVWK7gOCFimyeb8sFjNZC7y7rypI\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vdCBGb3VuZCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0xfU0NPUEVfTk9UX0ZPVU5EOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1OT1RfRk9VTkQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9bm90Rm91bmQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLk5PVF9GT1VORCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDTF9TQ09QRV9OT1RfRk9VTkQ6IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6ODYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmRlbGV0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Tk9UX0ZPVU5ELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZV9pZC5zY29wZSwgbWVzc2FnZT1udWxsLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlX2lkLnNjb3BlLCBtZXNzYWdlPU5vdCBGb3VuZCwgcmVhc29uPW5vdEZvdW5kLCBycGNDb2RlPTQwNH0gTm90IEZvdW5kOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm90IEZvdW5kIn19\"\n      }\n    },\n    {\n      \"ID\": \"eb2af5bce5b9e1df\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"12243\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:02 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:02 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqgaldc1OJvgmfZxcZs4i5d6EXMyFK93ZUJLzSK8Vo-qPYKRwhvPzK8GFv3gqrdyjBbvdc2Uz57nCwy10LhC5AD2pscln8VbaQIOAHqxvkwsqV27Rw\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6ODYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmRlbGV0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19\"\n      }\n    },\n    {\n      \"ID\": \"ad55ad01147a8c62\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\\u0026prettyPrint=false\\u0026userProject=gcloud-golang-firestore-tests\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 404,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"11631\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:02 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:02 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoQpkkPNbb1CGY8lAzUfymkmZ7PNlRK6hK3deBeoMip13ARTb212DIgf4lgUDM8PVQsAqcnKwzNulbZICoGzHwrsBZfyi7p5TGX2yJHLXSAGEY0MBE\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vdCBGb3VuZCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0xfU0NPUEVfTk9UX0ZPVU5EOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1OT1RfRk9VTkQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9bm90Rm91bmQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLk5PVF9GT1VORCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDTF9TQ09QRV9OT1RfRk9VTkQ6IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6ODYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmRlbGV0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Tk9UX0ZPVU5ELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZV9pZC5zY29wZSwgbWVzc2FnZT1udWxsLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlX2lkLnNjb3BlLCBtZXNzYWdlPU5vdCBGb3VuZCwgcmVhc29uPW5vdEZvdW5kLCBycGNDb2RlPTQwNH0gTm90IEZvdW5kOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm90IEZvdW5kIn19\"\n      }\n    },\n    {\n      \"ID\": \"1ef9ea9b9bc398a6\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\\u0026prettyPrint=false\\u0026userProject=veener-jba\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"13099\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:03 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:03 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur5WrZwygTHM0dDH6L1kypZzaAQtCwxt9wA7VXvgnjwrfwdRnTw0D7K3VLYLRTPDcf8mRFn5CetkcimFxfqUDoWLMF7bH1TLiBr38K6aBU74aRWUd4\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"5c1cadcffc6c95e0\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"107\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"119\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:04 GMT\"\n          ],\n          \"Etag\": [\n            \"CAU=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uo_n__u-lZKgZqveqge9YBw7wQMldCd4t0io7l_L_nlcF4DSPBPvZd9jGPCstE1EYuQS9L-Z3Y53Q15FlqM1IcmRDv6bYEJQWqkpuzCRRa_TLh9P7A\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDQVU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"4a615256ab8c55b4\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\\u0026prettyPrint=false\\u0026userProject=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"107\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"119\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:04 GMT\"\n          ],\n          \"Etag\": [\n            \"CAU=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpwGIlBhvugAIHxiObS0RPpJ40OY_R3exJfPh5IHLLB3SrdYtGMpD01QLdxc3E0IPGkBiTrwM-Z2X1gMcxuOqJWJUrhV4xTFe_n5G8bBxzievz39F4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDQVU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"63c0acd95aa571a1\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"107\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"12243\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:04 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqNu5DFt-lpr-_4YX8LRIhoi3KVRYVgFAlG7WOPsY7IGJ2NLZSF3SQhmkvfL_IKZ0FWIwx1nGT6HBBe9t2RYXNE1kXis-9KgEaAWhrEByTud5QGx5c\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5VcGRhdGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBY2xzLmphdmE6OTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5VcGRhdGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBY2xzLmphdmE6MjcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLnVwZGF0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwMylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19\"\n      }\n    },\n    {\n      \"ID\": \"3c6b1be88134f9d9\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\\u0026prettyPrint=false\\u0026userProject=gcloud-golang-firestore-tests\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"107\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"119\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:05 GMT\"\n          ],\n          \"Etag\": [\n            \"CAU=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqzTVWCTbjlM7VCFWFbOojrtt8ZMY9bRy0eXj0Uxj3gaYalvwqR0WBrtbX0iGQ-aN5pv3-Acc7EWIoHBa37YbMpx9fuoJUpTswmdpiCOH3wbMN7tIk\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDQVU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"60cde48b740e9a63\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\\u0026prettyPrint=false\\u0026userProject=veener-jba\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"107\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"13099\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:05 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrLyiKgPsp1RDgH3Q2SGlQAwTvGJwVDvb9U9FfvTysIFo6sO-5AoXrGPQfZpr80aMOEKojmPksURjhsteWSV9gdPsOlPIJMorxvQMHeomMCh-Bgmuo\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YTo5MClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YToyNylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IudXBkYXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YTo5MClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YToyNylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IudXBkYXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"95b915570e7c2375\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"684\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:05 GMT\"\n          ],\n          \"Etag\": [\n            \"CAU=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:05 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrOZjNI5VbLPTLuBwhSAdcgxvqgcFpH-ED4XyEgIbnndmtC_zJ0lkLfudymSRpdRE4NBxn1Vp-AmZnb1ONsP2I1GBnLYfpYRbzFQpmihPrgBkDnaB4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBVT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQVU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBVT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNBVT0ifV19\"\n      }\n    },\n    {\n      \"ID\": \"e4170c637b705043\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl?alt=json\\u0026prettyPrint=false\\u0026userProject=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"684\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:05 GMT\"\n          ],\n          \"Etag\": [\n            \"CAU=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:05 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqXQonYrNQZxcXoDllGz19Ruu-Eq1_3FVjMndISB0h1O1ojodwFr2Xor2nZHBZgv3NN_YOSrunnT_KYTfBFNdqtVvqVC2L19Qhwk-cxse_FqrMVbIM\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBVT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQVU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBVT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNBVT0ifV19\"\n      }\n    },\n    {\n      \"ID\": \"a3918deffd2f8f0f\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"12203\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:06 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:06 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpCCE2tr_4iWFlwmQkFVvzfskSWvZdvohQYV52oXF-tWUfie6Brp5TYrvUYx7jH8zsTg9qqk_kv0th8pOA1WsHahBUbDYuaqAmW0EpSJI6_xjBPdZ8\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9UkVRVUlSRUQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9YmFkUmVxdWVzdCwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uUkVRVUlSRUQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfTUlTU0lORzogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjEwMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5saXN0KEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6ODkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MTAxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmxpc3QoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YTo4OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMCwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4ifX0=\"\n      }\n    },\n    {\n      \"ID\": \"42a941620757dac5\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl?alt=json\\u0026prettyPrint=false\\u0026userProject=gcloud-golang-firestore-tests\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"684\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:06 GMT\"\n          ],\n          \"Etag\": [\n            \"CAU=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:06 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uoqov2civPKG8oSKmpVgUSoOD4W3rev4av_O6jgxkc5tSpPMgtxZeG3NznVRuFJLgClao2zPH8BvZIxTAAPUi_R-H0zgPz6ou8k9SMzLrcgW_HW100\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBVT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQVU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBVT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNBVT0ifV19\"\n      }\n    },\n    {\n      \"ID\": \"ae79f2e22d58681a\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl?alt=json\\u0026prettyPrint=false\\u0026userProject=veener-jba\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"13059\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:06 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:06 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqP_EhJin_8uqVkiSwAv0jBAI8A0o7nSwNAQ-Z_EdAnq2PItIGJZl5NOE_xcDTFce_ncHfsf6LvV4NMvuxiOsl32BOddZj_6x5dC36QqrKvhXKaQJ0\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MTAxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmxpc3QoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YTo4OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9Rk9SQklEREVOLCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9BQ0NFU1NfREVOSUVEOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1mb3JiaWRkZW4sIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLkZPUkJJRERFTiwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9BQ0NFU1NfREVOSUVEOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjEwMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5saXN0KEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6ODkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMywibWVzc2FnZSI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuIn19\"\n      }\n    },\n    {\n      \"ID\": \"99becaf4890b3c21\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:08 GMT\"\n          ],\n          \"Etag\": [\n            \"CAY=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpWMu40YNkuE3QcNByTmrKw_cnq4a8DVtcknBJ7gTnLdH1BC6CqoFOStPpa6y4PMmdpLpquozlOzvI4NWjgZYp1d9F_wBEyaq-wquTQAWGXNy3qktY\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"586ccc26d5a22712\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\\u0026prettyPrint=false\\u0026userProject=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 404,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"11631\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:08 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:08 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpsRO9GedosQ-kg2lCQpx2S6C0-HH592CdB3SU9yGMwEEGKX9md7KGeSDhecrm_6Ug6tyYtEMlsMq08YBAKGprXfcN9130mRolu_HVey3CcrXK1nZ0\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vdCBGb3VuZCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0xfU0NPUEVfTk9UX0ZPVU5EOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1OT1RfRk9VTkQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9bm90Rm91bmQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLk5PVF9GT1VORCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDTF9TQ09QRV9OT1RfRk9VTkQ6IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6ODYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmRlbGV0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Tk9UX0ZPVU5ELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZV9pZC5zY29wZSwgbWVzc2FnZT1udWxsLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlX2lkLnNjb3BlLCBtZXNzYWdlPU5vdCBGb3VuZCwgcmVhc29uPW5vdEZvdW5kLCBycGNDb2RlPTQwNH0gTm90IEZvdW5kOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm90IEZvdW5kIn19\"\n      }\n    },\n    {\n      \"ID\": \"fad4bdab588e0f3a\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"12243\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:08 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:08 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoUefKoF0asUvxzmAtX5z5m_5FRy9UfliKkjQN8cYyrHAotGwiQA72QN0lYfA0HXbe7gFRokwBAY8R5OpHcEdRq5K9sw8AwHuNtruFtBMxjN0D3hR4\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6ODYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmRlbGV0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19\"\n      }\n    },\n    {\n      \"ID\": \"23bb9ce53da2f525\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\\u0026prettyPrint=false\\u0026userProject=gcloud-golang-firestore-tests\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 404,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"11631\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:09 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:09 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Upa2KE5JJOXq2FOn7RHasJpOeeHqWU2kk3BC4cQcGQ9jGzh6XIksN6Z6u1NVoCbxW7-3zGiZMdAop-oa_EuyPAauD__JgzNPdngeNeXO7lsGaVI6i8\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vdCBGb3VuZCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0xfU0NPUEVfTk9UX0ZPVU5EOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1OT1RfRk9VTkQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9bm90Rm91bmQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLk5PVF9GT1VORCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDTF9TQ09QRV9OT1RfRk9VTkQ6IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6ODYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmRlbGV0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Tk9UX0ZPVU5ELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZV9pZC5zY29wZSwgbWVzc2FnZT1udWxsLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlX2lkLnNjb3BlLCBtZXNzYWdlPU5vdCBGb3VuZCwgcmVhc29uPW5vdEZvdW5kLCBycGNDb2RlPTQwNH0gTm90IEZvdW5kOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm90IEZvdW5kIn19\"\n      }\n    },\n    {\n      \"ID\": \"46482e47e655836d\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\\u0026prettyPrint=false\\u0026userProject=veener-jba\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"13099\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:09 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:09 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Urze42blCAS2Dskbf5jkbCkdo5IhfOjcTlcufV1ooZd5x_QD0zK1gRoXLXfvLjKHEKaJ7cuDeSRmNjuqgEoxJFMmXUoPOIetWLYbH0G-lJcM6tydew\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"856a1fb5ffdb000f\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"107\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"463\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:09 GMT\"\n          ],\n          \"Etag\": [\n            \"COGeqNLx/eECEAU=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoFSnYuPlv_JejZ0nEjoWRXeLwj0MS-ddTlIaSOjaK5BudyIcIOeVDEeyFYWsF-GCZzMC0F7v-UEw0_lbsYBXCMZcLp6WZu_s3OPDREhpz2s3Txw-s\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvZG9tYWluLWdvb2dsZS5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL2RvbWFpbi1nb29nbGUuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBVT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"a74c3e1b541a9ffc\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\\u0026prettyPrint=false\\u0026userProject=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"107\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"463\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:10 GMT\"\n          ],\n          \"Etag\": [\n            \"COGeqNLx/eECEAU=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ury3MiMZho3xaSHmFgwHNvKIHTa0_gZzfKvX8FW6iVGNkdSbXvmVypIUuIoKXDjd4rOXpFghdoJlES9A_iXUvZyfWAZLvWqR1w6sDRymrIARVd0dPE\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvZG9tYWluLWdvb2dsZS5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL2RvbWFpbi1nb29nbGUuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBVT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"913da4fa24ea5f1f\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"107\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"12243\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:10 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoKAxObyNBS_Mew44t3k1u80cLBGQW_I2ohrF96rIjZRxFscjGFrvsOHfLxw78rTRnpHmfA0uXnNz8T2FPc_Op16Lnn1YkfyOezSEhDBx11qZbinEE\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5VcGRhdGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBY2xzLmphdmE6OTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5VcGRhdGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBY2xzLmphdmE6MjcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLnVwZGF0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwMylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19\"\n      }\n    },\n    {\n      \"ID\": \"5dbdf24cae75e565\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\\u0026prettyPrint=false\\u0026userProject=gcloud-golang-firestore-tests\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"107\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"463\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:10 GMT\"\n          ],\n          \"Etag\": [\n            \"COGeqNLx/eECEAU=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpoJgRZ665WjiUif7SnQ-Vg4B0kJl-UQ_kIk5XgmcQIL5zmCBp3NCxjksybkvNKpGcQnIJSLevfyWd2fugRv5y5vxmEBgqFffIy8ibTIyBDH4b7R74\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvZG9tYWluLWdvb2dsZS5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL2RvbWFpbi1nb29nbGUuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBVT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"f41892a142fe6d2b\",\n      \"Request\": {\n        \"Method\": \"PUT\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\\u0026prettyPrint=false\\u0026userProject=veener-jba\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"107\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"13099\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:11 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpThInLTHhtepE7J4k-Rg6OoLRyOqnjPz4sZmfIH6wp5TSIyLrZQhExKAP52XbwUwMYp7x-xypSMY5kfR66I-dmpRWaFkfs0Lhy-Z6kqb5JUXSppqk\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YTo5MClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YToyNylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IudXBkYXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YTo5MClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YToyNylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IudXBkYXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"5eb0710be2571dab\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2800\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:11 GMT\"\n          ],\n          \"Etag\": [\n            \"COGeqNLx/eECEAU=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:11 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpbetUCGwYg4rhIR-DP3ntPqbkFwSqutNltVR55I4qedP-rZ5hC7ospMy6hZ4aQaNOhNv0frmst8MQZ0j6Mp8BcTC6qy7mU8bhEAiMGLycR5XxUWfI\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQVU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ09HZXFOTHgvZUVDRUFVPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQVU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoidXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09HZXFOTHgvZUVDRUFVPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL2RvbWFpbi1nb29nbGUuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9kb21haW4tZ29vZ2xlLmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDT0dlcU5MeC9lRUNFQVU9In1dfQ==\"\n      }\n    },\n    {\n      \"ID\": \"56aaafb0a24b0644\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl?alt=json\\u0026prettyPrint=false\\u0026userProject=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2800\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:11 GMT\"\n          ],\n          \"Etag\": [\n            \"COGeqNLx/eECEAU=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:11 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrqQczDm-dzjgTlLFcJ2lXQrMTpQ_8UP-1hNbGj7eZEgZcbxWA-oyXqEe4tJXq3gYdZ3mEIcAzaDtNeBHWidpIev7kdXWank04_JSWbQtU2UomJqeU\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQVU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ09HZXFOTHgvZUVDRUFVPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQVU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoidXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09HZXFOTHgvZUVDRUFVPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL2RvbWFpbi1nb29nbGUuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9kb21haW4tZ29vZ2xlLmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDT0dlcU5MeC9lRUNFQVU9In1dfQ==\"\n      }\n    },\n    {\n      \"ID\": \"3bbc40d778939612\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"12203\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:12 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:12 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur5kJWpLwxz76BKPll75-nOsLv_uoh7X-TW0SbNHCYEzkGq8VZ-W8a5tKGUF6rKea4ejr4MhcqJVr1Zu7O-zNAfQWJMsHC9CTkOrPa5Iu1s0KBJDdY\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9UkVRVUlSRUQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9YmFkUmVxdWVzdCwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uUkVRVUlSRUQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfTUlTU0lORzogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjEwMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5saXN0KEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6ODkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MTAxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmxpc3QoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YTo4OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMCwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4ifX0=\"\n      }\n    },\n    {\n      \"ID\": \"a2868e9e376e356b\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl?alt=json\\u0026prettyPrint=false\\u0026userProject=gcloud-golang-firestore-tests\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2800\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:12 GMT\"\n          ],\n          \"Etag\": [\n            \"COGeqNLx/eECEAU=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:12 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoyZfAJB3TroGxzYv0gy7dHUwpU0jtIeU_EyQSFQKzHlHbyRa33r_a-B1aHw5tHaoawuDvv7skisdx10yhmm9ZRrPw0ibwpMkX5Cwhf0OK85DF84jM\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQVU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ09HZXFOTHgvZUVDRUFVPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQVU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoidXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09HZXFOTHgvZUVDRUFVPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL2RvbWFpbi1nb29nbGUuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9kb21haW4tZ29vZ2xlLmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDT0dlcU5MeC9lRUNFQVU9In1dfQ==\"\n      }\n    },\n    {\n      \"ID\": \"ffb216dc74ccc27e\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl?alt=json\\u0026prettyPrint=false\\u0026userProject=veener-jba\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"13059\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:12 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:12 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqBumxgw_FTJlt7J3xLsBDxljAcEyC2G5aQqhEibawMttB-ogPabqDfz8ZN65WtOikIggZQ8OqW8zigV4Q5vfQkog7NMasAuivcMjhAsgqv_6qWv_E\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MTAxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmxpc3QoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YTo4OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9Rk9SQklEREVOLCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9BQ0NFU1NfREVOSUVEOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1mb3JiaWRkZW4sIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLkZPUkJJRERFTiwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9BQ0NFU1NfREVOSUVEOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjEwMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5saXN0KEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6ODkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMywibWVzc2FnZSI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuIn19\"\n      }\n    },\n    {\n      \"ID\": \"183157f40c6c1bcd\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:13 GMT\"\n          ],\n          \"Etag\": [\n            \"COGeqNLx/eECEAY=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrC6xxVQeIIjitNwDv5PhDUIBQbtGdHJDi_AmLs8vTbGzkby-5hguMIwI_UeHlCuGF1u5jBoVwCOgSqJBiJJ5fxh8oCzBn-nHGcGAdIOeQt7gTL0RQ\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"4b6b925053570053\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\\u0026prettyPrint=false\\u0026userProject=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 404,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"11631\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:13 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:13 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpiIBwh04pJH1-X9d1oJluF_2ZCJEFLzF4E7SI-easf2noIolxavCbpH7NP9GMmNXnVK_ZJm4kW8coV5ArXDr-Rwodjnd9Bn2hFiJ_puNeWWldJ6mA\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vdCBGb3VuZCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0xfU0NPUEVfTk9UX0ZPVU5EOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1OT1RfRk9VTkQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9bm90Rm91bmQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLk5PVF9GT1VORCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDTF9TQ09QRV9OT1RfRk9VTkQ6IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6ODYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmRlbGV0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Tk9UX0ZPVU5ELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZV9pZC5zY29wZSwgbWVzc2FnZT1udWxsLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlX2lkLnNjb3BlLCBtZXNzYWdlPU5vdCBGb3VuZCwgcmVhc29uPW5vdEZvdW5kLCBycGNDb2RlPTQwNH0gTm90IEZvdW5kOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm90IEZvdW5kIn19\"\n      }\n    },\n    {\n      \"ID\": \"9b4f9c448170e89d\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"12243\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:14 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:14 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqHc1VVBdvXFq9aDPAprpXNP5xPt-ZtPdYXwCQPHX_s4gkCMom31AtHeDocV_hker5qryWoYnRD8PPu5c7JqDNQ75v7GgE1vO5xAt7AqWPoLU5MO5A\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6ODYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmRlbGV0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19\"\n      }\n    },\n    {\n      \"ID\": \"692d41cf9ea91eb2\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\\u0026prettyPrint=false\\u0026userProject=gcloud-golang-firestore-tests\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 404,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"11631\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:14 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:14 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpuFB_mdJg9Fd7Sj06Xdcrj7Up2xXVc_P-SgISEEtiv4v9doPXzNbzBz92Q2UfEchYWSQnikHhS34dUAOefj9J4vaBYqjc9RjFmrn8YcPNyS8aWKgI\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vdCBGb3VuZCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0xfU0NPUEVfTk9UX0ZPVU5EOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1OT1RfRk9VTkQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9bm90Rm91bmQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLk5PVF9GT1VORCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDTF9TQ09QRV9OT1RfRk9VTkQ6IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6ODYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmRlbGV0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Tk9UX0ZPVU5ELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZV9pZC5zY29wZSwgbWVzc2FnZT1udWxsLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlX2lkLnNjb3BlLCBtZXNzYWdlPU5vdCBGb3VuZCwgcmVhc29uPW5vdEZvdW5kLCBycGNDb2RlPTQwNH0gTm90IEZvdW5kOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm90IEZvdW5kIn19\"\n      }\n    },\n    {\n      \"ID\": \"db035a3cc51de007\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\\u0026prettyPrint=false\\u0026userProject=veener-jba\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"13099\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:14 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:14 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrGb7BqO44vNpZjBnLrSI6_jVCVRFevSqm5eux2DIE2zmUY3sH0T0st7OOsLPcBjvLSbDfijMcdJwsgpM1fQGcerB9bS8Ffd4Qgzdjth0I8FreV4Vs\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"e1d95794cb6be989\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/rewriteTo/b/go-integration-test-20190502-80633403432013-0003/o/copy?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"3\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"e30K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3273\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:15 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoVcH2L0r9wGab--fnRuKptLRoUoHCUHfRegh3rKNQExHVsYLnt1NFwOKFa_6hRbeYXO1aY8-F-KiD6IY3sWykIKXr5iqelEJHTWEMQ8wHuzIcWLO8\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE1MjY2MjE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vY29weSIsIm5hbWUiOiJjb3B5IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MTUyNjYyMTQiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MTUuMjY1WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjE1LjI2NVoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToxNS4yNjVaIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2NvcHk/Z2VuZXJhdGlvbj0xNTU2ODM1OTE1MjY2MjE0JmFsdD1tZWRpYSIsImNvbnRlbnRMYW5ndWFnZSI6ImVuIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE1MjY2MjE0L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2NvcHkvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImNvcHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxNTI2NjIxNCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDS2J4ejkzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE1MjY2MjE0L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9jb3B5L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiY29weSIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTE1MjY2MjE0IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0tieHo5M3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2NvcHkvMTU1NjgzNTkxNTI2NjIxNC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vY29weS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImNvcHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxNTI2NjIxNCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDS2J4ejkzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE1MjY2MjE0L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9jb3B5L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiY29weSIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTE1MjY2MjE0IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0tieHo5M3gvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDS2J4ejkzeC9lRUNFQUU9In19\"\n      }\n    },\n    {\n      \"ID\": \"297f13e741cceb04\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/rewriteTo/b/go-integration-test-20190502-80633403432013-0003/o/copy?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026userProject=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"3\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"e30K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3273\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:15 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UroLXQs6945-UOUyN7qOhICUNnGSzCVrNCv5DD9uMyvgD08zpuufBZj8WM8Fxe0DuOuQowqbPEn1UdJdbFTW7puyeY4zX8fM6UgT7SZIVB0Xi-B0OM\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE1ODQxOTk3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vY29weSIsIm5hbWUiOiJjb3B5IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MTU4NDE5OTciLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MTUuODQxWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjE1Ljg0MVoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToxNS44NDFaIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2NvcHk/Z2VuZXJhdGlvbj0xNTU2ODM1OTE1ODQxOTk3JmFsdD1tZWRpYSIsImNvbnRlbnRMYW5ndWFnZSI6ImVuIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE1ODQxOTk3L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2NvcHkvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImNvcHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxNTg0MTk5NyIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTTJEODkzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE1ODQxOTk3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9jb3B5L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiY29weSIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTE1ODQxOTk3IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ00yRDg5M3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2NvcHkvMTU1NjgzNTkxNTg0MTk5Ny9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vY29weS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImNvcHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxNTg0MTk5NyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTTJEODkzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE1ODQxOTk3L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9jb3B5L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiY29weSIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTE1ODQxOTk3IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ00yRDg5M3gvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTTJEODkzeC9lRUNFQUU9In19\"\n      }\n    },\n    {\n      \"ID\": \"9617f04d2dc95a7c\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/rewriteTo/b/go-integration-test-20190502-80633403432013-0003/o/copy?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"3\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"e30K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"12683\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:16 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqeJiJeDLLZgn9vlRyNk1plY-7dcPXaz47gPNAhMqmSx5ZMvg6pqWj18PVUR65UGuWE7Amtua_zqsv0dVyDZE2FFceMeIQcQ2n6noklvRS9kxPXcEU\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LnJld3JpdGUoUmV3cml0ZU9iamVjdC5qYXZhOjIwMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YToxOTMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6NDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IucmV3cml0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTIxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTggbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9UkVRVUlSRUQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LnJld3JpdGUoUmV3cml0ZU9iamVjdC5qYXZhOjIwMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YToxOTMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6NDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IucmV3cml0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTIxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTggbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9YmFkUmVxdWVzdCwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uUkVRVUlSRUQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfTUlTU0lORzogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QucmV3cml0ZShSZXdyaXRlT2JqZWN0LmphdmE6MjAwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjE5Mylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5yZXdyaXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxOCBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5yZXdyaXRlKFJld3JpdGVPYmplY3QuamF2YToyMDApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6MTkzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLnJld3JpdGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEyMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE4IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMCwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4ifX0=\"\n      }\n    },\n    {\n      \"ID\": \"2309e069a65c894f\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/rewriteTo/b/go-integration-test-20190502-80633403432013-0003/o/copy?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026userProject=gcloud-golang-firestore-tests\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"3\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"e30K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3333\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:16 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpxhvVZmlJMvR93BoI0JsL0TYbDN-kmlYHQOOlRfb-Nnqpc8iUImRtJT8Qvx0XWrOsALmLv4Oub_aeCCWkHPvqaF28oAazlhqRZYoxrPlaQlW0N1Qs\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE2NjM3MTY1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vY29weSIsIm5hbWUiOiJjb3B5IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MTY2MzcxNjUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MTYuNjM2WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjE2LjYzNloiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToxNi42MzZaIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2NvcHk/Z2VuZXJhdGlvbj0xNTU2ODM1OTE2NjM3MTY1JmFsdD1tZWRpYSIsImNvbnRlbnRMYW5ndWFnZSI6ImVuIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE2NjM3MTY1L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2NvcHkvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImNvcHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxNjYzNzE2NSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTzNIbzk3eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE2NjM3MTY1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9jb3B5L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiY29weSIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTE2NjM3MTY1IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ08zSG85N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2NvcHkvMTU1NjgzNTkxNjYzNzE2NS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vY29weS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImNvcHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxNjYzNzE2NSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTzNIbzk3eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE2NjM3MTY1L3VzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9jb3B5L2FjbC91c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiY29weSIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTE2NjM3MTY1IiwiZW50aXR5IjoidXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ08zSG85N3gvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTzNIbzk3eC9lRUNFQUU9In19\"\n      }\n    },\n    {\n      \"ID\": \"d2fe101ea1da654d\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/rewriteTo/b/go-integration-test-20190502-80633403432013-0003/o/copy?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026userProject=veener-jba\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"3\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"e30K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"13539\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:16 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqjFigs6aYtqXW_7VucOIgJY2MQZwuLv9B12s2ffhWgWDxtJyjLinG4A8U9gKBCpiTt9jUvdHKtaG20qZfyfN9Q1eVAkUQh_zv7ESbqnWhsiheI7zw\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5yZXdyaXRlKFJld3JpdGVPYmplY3QuamF2YToyMDApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6MTkzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLnJld3JpdGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEyMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTggbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9Rk9SQklEREVOLCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9BQ0NFU1NfREVOSUVEOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LnJld3JpdGUoUmV3cml0ZU9iamVjdC5qYXZhOjIwMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YToxOTMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6NDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IucmV3cml0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTIxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxOCBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1mb3JiaWRkZW4sIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLkZPUkJJRERFTiwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9BQ0NFU1NfREVOSUVEOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LnJld3JpdGUoUmV3cml0ZU9iamVjdC5qYXZhOjIwMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YToxOTMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6NDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IucmV3cml0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTIxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxOCBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QucmV3cml0ZShSZXdyaXRlT2JqZWN0LmphdmE6MjAwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjE5Mylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5yZXdyaXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE4IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMywibWVzc2FnZSI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuIn19\"\n      }\n    },\n    {\n      \"ID\": \"6620f07aff04b6fd\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/compose/compose?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"127\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6ImZvbyJ9LHsibmFtZSI6ImNvcHkifV19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"742\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:17 GMT\"\n          ],\n          \"Etag\": [\n            \"CP/B0t7x/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpyWMaddvNz0IWnQ6KIl-tv6fJZCvrqTlGuaoHvKqXhxb3O1EKUIEirKSVcaedFZyxtjLhPD7Nj6qf1CRGWG1VnVigo5Wf3sYFDuuLvctxVpoHT0rY\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9jb21wb3NlLzE1NTY4MzU5MTc0MDY0NjMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9jb21wb3NlIiwibmFtZSI6ImNvbXBvc2UiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxNzQwNjQ2MyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToxNy40MDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MTcuNDA2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjE3LjQwNloiLCJzaXplIjoiMTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vY29tcG9zZT9nZW5lcmF0aW9uPTE1NTY4MzU5MTc0MDY0NjMmYWx0PW1lZGlhIiwiY3JjMzJjIjoiL1JDT2dnPT0iLCJjb21wb25lbnRDb3VudCI6MiwiZXRhZyI6IkNQL0IwdDd4L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"7f88847ad9c49799\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/compose/compose?alt=json\\u0026prettyPrint=false\\u0026userProject=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"127\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6ImZvbyJ9LHsibmFtZSI6ImNvcHkifV19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"742\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:18 GMT\"\n          ],\n          \"Etag\": [\n            \"CKav+N7x/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Urtn69BB0ytbCZpuCbus4w__tiLeBpqeNzD2gKl5KN2LgP9ZJOIjudGKpDOJRhyW_WQjVOCJBC1CSB_AgE0MdPzVDAKWt13VfQ8aKe3pMWh4y1kOlI\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9jb21wb3NlLzE1NTY4MzU5MTgwMjY2NjIiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9jb21wb3NlIiwibmFtZSI6ImNvbXBvc2UiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxODAyNjY2MiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToxOC4wMjZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MTguMDI2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjE4LjAyNloiLCJzaXplIjoiMTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vY29tcG9zZT9nZW5lcmF0aW9uPTE1NTY4MzU5MTgwMjY2NjImYWx0PW1lZGlhIiwiY3JjMzJjIjoiL1JDT2dnPT0iLCJjb21wb25lbnRDb3VudCI6MiwiZXRhZyI6IkNLYXYrTjd4L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"a21f3ddca57ed424\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/compose/compose?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"127\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6ImZvbyJ9LHsibmFtZSI6ImNvcHkifV19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"12267\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:18 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrE9jrLJ0W1PUHWT3ldYhVsL9nNhAeFPU2K8g2rCMimty07QlN95esxj7dBAySQ-nzvK17L3WA7vjmxjCpeQADa2bztj6ke8NZjb8fuWkQHsnnzKXA\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5Db21wb3NlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChDb21wb3NlT2JqZWN0LmphdmE6MTk5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmNvbXBvc2UoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19\"\n      }\n    },\n    {\n      \"ID\": \"08fda3fa173e6e11\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/compose/compose?alt=json\\u0026prettyPrint=false\\u0026userProject=gcloud-golang-firestore-tests\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"127\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6ImZvbyJ9LHsibmFtZSI6ImNvcHkifV19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"742\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:19 GMT\"\n          ],\n          \"Etag\": [\n            \"CKy2sd/x/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqfGXVJ2-MQaZWJ-JS6runpSycA3GDKIXYHDGf3VBOXnADbUzL2YhZVmlQcW_95jXY0eMkK4Z5tSRk3cxGP_84T_1t3YDYQS2p37ZouBk7GfX-4xxw\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9jb21wb3NlLzE1NTY4MzU5MTg5NjE0NTIiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9jb21wb3NlIiwibmFtZSI6ImNvbXBvc2UiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxODk2MTQ1MiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToxOC45NjFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MTguOTYxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjE4Ljk2MVoiLCJzaXplIjoiMTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vY29tcG9zZT9nZW5lcmF0aW9uPTE1NTY4MzU5MTg5NjE0NTImYWx0PW1lZGlhIiwiY3JjMzJjIjoiL1JDT2dnPT0iLCJjb21wb25lbnRDb3VudCI6MiwiZXRhZyI6IkNLeTJzZC94L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"0c9e19bd4ec37de2\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/compose/compose?alt=json\\u0026prettyPrint=false\\u0026userProject=veener-jba\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"127\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6ImZvbyJ9LHsibmFtZSI6ImNvcHkifV19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"13123\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:19 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqGREJ2AZDcrZiJzPX5ltwlB28vRYhZ_xv4LMIO3La2IgFWk4wd5IVrqBs3z2epgtg7wkPpZm4qPH9zTzSIsXNxdLLHcNMMYr2azidefxtJVgXqgDY\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YToxOTkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5Db21wb3NlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChDb21wb3NlT2JqZWN0LmphdmE6NDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuY29tcG9zZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YToxOTkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5Db21wb3NlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChDb21wb3NlT2JqZWN0LmphdmE6NDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuY29tcG9zZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"84daee26f7d989ce\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJuYW1lIjoiZm9vIn0K\",\n          \"aGVsbG8=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3112\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:19 GMT\"\n          ],\n          \"Etag\": [\n            \"CLmF4d/x/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoLuw-z5wwTKy-X92_i7pyTrimolUNRUGrElhep6rUH_mmpgu_Vxp-1ncr8x8XNXHLs8NFRW5S7WVUsaDRRTrC5KBPea4EoFLANK8MFY0FpTkXr7_g\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkxOTc0MTYyNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxOTc0MTYyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToxOS43NDFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MTkuNzQxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjE5Ljc0MVoiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTkxOTc0MTYyNSZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkxOTc0MTYyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTE5NzQxNjI1IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNMbUY0ZC94L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkxOTc0MTYyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MTk3NDE2MjUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTG1GNGQveC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU5MTk3NDE2MjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTE5NzQxNjI1IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNMbUY0ZC94L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkxOTc0MTYyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MTk3NDE2MjUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTG1GNGQveC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNMbUY0ZC94L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"8457a5701f4ced08\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:20 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpKF1M6PpAT354ON3809wMCor-B9KITRuEV34MQczP3OD4Co0sJYtNSub2FUzA8qanTDrtANRK0RuxPTz314o3HQro2HLOoyKZBow5CZ4sfsunKHv0\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"1c2ba8a7670e2218\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJuYW1lIjoiZm9vIn0K\",\n          \"aGVsbG8=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3112\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:20 GMT\"\n          ],\n          \"Etag\": [\n            \"CP+SgODx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uoq9hgjjwBbSH1zXN2UlNtWO31Qf5uk4ijjGCQlETB9_5H_CouvU3q4tyHAKEbIBlaW1_mNk3Fsp6LgXqsPPKvFzs3-WHeADAgc2-GpD-0inoYUHMs\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMDI1MTI2MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkyMDI1MTI2MyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyMC4yNTBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MjAuMjUwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjIwLjI1MFoiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTkyMDI1MTI2MyZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMDI1MTI2My9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTIwMjUxMjYzIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNQK1NnT0R4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMDI1MTI2My9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MjAyNTEyNjMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDUCtTZ09EeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU5MjAyNTEyNjMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTIwMjUxMjYzIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNQK1NnT0R4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMDI1MTI2My91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MjAyNTEyNjMiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDUCtTZ09EeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNQK1NnT0R4L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"7e6d2f97bd881584\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\\u0026prettyPrint=false\\u0026userProject=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:20 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UohQH2nTuRg_FtGhlfr9zC26C6lKFA-aZTf4GbiV5kWZCJ9E4YLHfIUKLpCLIgEfX9TAvi4oPNWfEBpbY-orlescLxrxYcB1U5fLmzzHQR2R0teR-s\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"48e189abff98ea93\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJuYW1lIjoiZm9vIn0K\",\n          \"aGVsbG8=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3112\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:21 GMT\"\n          ],\n          \"Etag\": [\n            \"CM3Aq+Dx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uq_NscG9s3iq-8NZq8vQhzdc9FJMaAfq_0GborrX84b8gG2zpbUNtEVnrjFjLyOXqBeJwthPgPUPcsGbIcD597LaPlxt-VNaetM2BLtMtYry8pPeQ8\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMDk2MTYxMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkyMDk2MTYxMyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyMC45NjFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MjAuOTYxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjIwLjk2MVoiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTkyMDk2MTYxMyZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMDk2MTYxMy9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTIwOTYxNjEzIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNNM0FxK0R4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMDk2MTYxMy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MjA5NjE2MTMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTTNBcStEeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU5MjA5NjE2MTMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTIwOTYxNjEzIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNNM0FxK0R4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMDk2MTYxMy91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MjA5NjE2MTMiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTTNBcStEeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNM0FxK0R4L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"02d6922c26c06cbd\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 400,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"12243\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:21 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:21 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrmjSJHhErkbzi8feJ_-8XOMqsIzGrEe6frQzWXQ7dPl0D8MW1mMHClKdwb2zBOTvpx7mXQWy2STZYSqx2o7O1Tr2DB1RZfwCZ3xp1jgw3NCICi7Xw\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjg4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5kZWxldGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjExMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YTo4OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZGVsZXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YTo4OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZGVsZXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YTo4OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZGVsZXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19\"\n      }\n    },\n    {\n      \"ID\": \"3fee93fca0ef933c\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJuYW1lIjoiZm9vIn0K\",\n          \"aGVsbG8=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3112\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:21 GMT\"\n          ],\n          \"Etag\": [\n            \"CLfH1eDx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqLO91a0iSaTsK7EA2iN621UX-atvJ-8m8BeqeR8_o_CQLB8Pco5FMXznwQY7DZ8u0GPd1BvLE98s5S7T1Z6yL66OKL0CFFUntLBqNAKlji2Dcme6g\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMTY1MDYxNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkyMTY1MDYxNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyMS42NTBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MjEuNjUwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjIxLjY1MFoiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTkyMTY1MDYxNSZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMTY1MDYxNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTIxNjUwNjE1IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNMZkgxZUR4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMTY1MDYxNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MjE2NTA2MTUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTGZIMWVEeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU5MjE2NTA2MTUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTIxNjUwNjE1IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNMZkgxZUR4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMTY1MDYxNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MjE2NTA2MTUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTGZIMWVEeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNMZkgxZUR4L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"5c26cf93373a296a\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\\u0026prettyPrint=false\\u0026userProject=gcloud-golang-firestore-tests\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:22 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Urx3fvI3sQc5JiIazK1OQw5W12poVdjRyBKxIBM6N98jEJli9F0O33KVHHcHaP-QybHub31QmLNngZpzcVKJq33DSaVMW2Vpi5BUaVAAUL2jMoyOxs\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"f8b5020ef71e4047\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJuYW1lIjoiZm9vIn0K\",\n          \"aGVsbG8=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3112\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:22 GMT\"\n          ],\n          \"Etag\": [\n            \"CIungeHx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uq8QEz45d-uPa7qZ6Nl_SMqw2iepQXoM4aAkTx4YCqArXnSKI1UO3ZhJ5-_PDg3Uq6PPa2JDBTbxckiZCRMQvf0Cv6E_8Cwk3jKXGkneWFJYSeMAts\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMjM2NzM3MSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkyMjM2NzM3MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyMi4zNjZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MjIuMzY2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjIyLjM2NloiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTkyMjM2NzM3MSZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMjM2NzM3MS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTIyMzY3MzcxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNJdW5nZUh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMjM2NzM3MS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MjIzNjczNzEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSXVuZ2VIeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU5MjIzNjczNzEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTIyMzY3MzcxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNJdW5nZUh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMjM2NzM3MS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MjIzNjczNzEiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSXVuZ2VIeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNJdW5nZUh4L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"7cfadd8c1e7c0bd8\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\\u0026prettyPrint=false\\u0026userProject=veener-jba\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"13099\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:22 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:22 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpjVnPaklKmbO8qV2lapwEIAwPjvf4HSJs3kNHHO_xZH4bV65pVPLKCb2qjMPCYSwEKRZzH6NpYjm6WlxsBdJnfBvpyRpIR017q9iJDyBcVPNUoDn8\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YTo4OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZGVsZXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YTo4OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZGVsZXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6ODgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmRlbGV0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6ODgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmRlbGV0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"b1381b9995cf35f5\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:23 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrD1hmfKK3yAwFXKqIwvCsEVMb_e7MWysJc7zbyVjZ_sbD9P41lzc0gYSef9yl8CRa6B0RtPq14V5MBSdy6C0i_cAkgANDN1da3O5QKELvACU11moU\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"5e06ccad06bbd110\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/copy?alt=json\\u0026prettyPrint=false\\u0026userProject=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:23 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur2FRcf4QGZH2KhkP3kATb9eOy4S9lgrA3NQXYqhc1KBZDbcZN5NHF4MB6WiTxOraNE0HhkW3SOg8sp1gS4kAcWRZ2G0EGWmLgL6RUcwr3a2O-WY10\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"b637ccaa36faa55b\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/compose?alt=json\\u0026prettyPrint=false\\u0026userProject=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:23 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqGzSAdUK8pPs53JjaSJVQJObMJRsfQ5FIpSL0D4tNfft68cfE8Xb5fjSsAQG_PfmKZyX1Ind-s6dW6FgwREeHzu_OnEeOwCOaT8EZi2N4vNeWLvac\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"15055c361faad5c1\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:24 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqwmXVRTmXX3P5iId4-EjuA1oviIQD-Vbdr7M5rgd7d5IxNvmPVkZz_zFyMBNoHd_DzXnPMN5R7grAe1yDdOzbyafIBwRcFsLh4r0a7ghp4LkNSLZk\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"307f8a44d4ce6e9f\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/notificationConfigs?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"32\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:24 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:24 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpaHmcEJBKGI7CtW9fK8-j5Z-oRk_dTwMS40wVaoNH1PN7k6x6d_9aD3w3ce6WGZJF5OYxkdoifp6L2vVz5lIGjzcmmIZ4Wxp1vktBOv8hLa417Mp4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNub3RpZmljYXRpb25zIn0=\"\n      }\n    },\n    {\n      \"ID\": \"f8df88961018be68\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/notificationConfigs?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"121\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJwYXlsb2FkX2Zvcm1hdCI6Ik5PTkUiLCJ0b3BpYyI6Ii8vcHVic3ViLmdvb2dsZWFwaXMuY29tL3Byb2plY3RzL2Rla2xlcmstc2FuZGJveC90b3BpY3MvZ28tc3RvcmFnZS1ub3RpZmljYXRpb24tdGVzdCJ9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"297\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:24 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqWiAA6LvnU4rExe2rVTwwFd51SI93o_d2tOj9OY1jk_qe1Yd1eiTXIa2eNecJQsmgwuFr4BUQoWy8ndutrCqGucmVIRL0jA6-i-vaGGVRF8uEe0AM\"\n          ]\n        },\n        \"Body\": \"eyJpZCI6IjExIiwidG9waWMiOiIvL3B1YnN1Yi5nb29nbGVhcGlzLmNvbS9wcm9qZWN0cy9kZWtsZXJrLXNhbmRib3gvdG9waWNzL2dvLXN0b3JhZ2Utbm90aWZpY2F0aW9uLXRlc3QiLCJwYXlsb2FkX2Zvcm1hdCI6Ik5PTkUiLCJldGFnIjoiMTEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm90aWZpY2F0aW9uQ29uZmlncy8xMSIsImtpbmQiOiJzdG9yYWdlI25vdGlmaWNhdGlvbiJ9\"\n      }\n    },\n    {\n      \"ID\": \"45f44fa6c3668273\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/notificationConfigs?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"340\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:25 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:25 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoFWgB9V-ilyDIBP7KEF3SY7uTg-rikYE1ooEgWYkiXb2cW6oOwwtH1W7oe24WU2A9oyJIGOSskz3_icHqmMn7CfPoZQ-Lu5QdtZzv_5062_-UzAt0\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNub3RpZmljYXRpb25zIiwiaXRlbXMiOlt7ImlkIjoiMTEiLCJ0b3BpYyI6Ii8vcHVic3ViLmdvb2dsZWFwaXMuY29tL3Byb2plY3RzL2Rla2xlcmstc2FuZGJveC90b3BpY3MvZ28tc3RvcmFnZS1ub3RpZmljYXRpb24tdGVzdCIsInBheWxvYWRfZm9ybWF0IjoiTk9ORSIsImV0YWciOiIxMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub3RpZmljYXRpb25Db25maWdzLzExIiwia2luZCI6InN0b3JhZ2Ujbm90aWZpY2F0aW9uIn1dfQ==\"\n      }\n    },\n    {\n      \"ID\": \"08c2546e2c262ee7\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/notificationConfigs/11?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:25 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoTmXr5TZZPRnABz_XbbZpjwU3iPz2e802RkcmNFr3sLzUx205tdmAb6vVWMNlYMUGZ5tGoddlqQ_oPnz0Xdvpz8CiD2eDLMDyrMbxVFjc3BinwBo0\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"efc8b67f9c2f4b40\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/notificationConfigs?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"32\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:25 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:25 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UraMBYT56qFvKLe_OPJfpJRhTy2qSpQyRjP6CScOnnijgaQ88eQtVahktX_Vsvy-G7J11d7GNT64FnpqZrewu1sUmuNNLiEtmkqVFILdNcWed6i1w4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNub3RpZmljYXRpb25zIn0=\"\n      }\n    },\n    {\n      \"ID\": \"6dd92f9ce3b15a57\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/gcp-public-data-landsat/LC08/PRE/044/034/LC80440342016259LGN00/LC80440342016259LGN00_MTL.txt\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=3600\"\n          ],\n          \"Content-Length\": [\n            \"7903\"\n          ],\n          \"Content-Type\": [\n            \"application/octet-stream\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:25 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"7a5fd4743bd647485f88496fadb05c51\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 23:25:25 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Tue, 04 Oct 2016 16:42:07 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1475599327662000\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=PWBt8g==\",\n            \"md5=el/UdDvWR0hfiElvrbBcUQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"7903\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpedRCcxIOhXCWdipyV2E0R3z00CUlOK6rPlof1gpKuQbLeJmvMoPFn28o8zqmmeVJ5rbX41bB6Hp116-_ISgEXl4Htmc1VS0Aq41lJQiN_mIvozbY\"\n          ]\n        },\n        \"Body\": \"R1JPVVAgPSBMMV9NRVRBREFUQV9GSUxFCiAgR1JPVVAgPSBNRVRBREFUQV9GSUxFX0lORk8KICAgIE9SSUdJTiA9ICJJbWFnZSBjb3VydGVzeSBvZiB0aGUgVS5TLiBHZW9sb2dpY2FsIFN1cnZleSIKICAgIFJFUVVFU1RfSUQgPSAiMDcwMTYwOTE5MTA1MV8wMDAwNCIKICAgIExBTkRTQVRfU0NFTkVfSUQgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwIgogICAgRklMRV9EQVRFID0gMjAxNi0wOS0yMFQwMzoxMzowMloKICAgIFNUQVRJT05fSUQgPSAiTEdOIgogICAgUFJPQ0VTU0lOR19TT0ZUV0FSRV9WRVJTSU9OID0gIkxQR1NfMi42LjIiCiAgRU5EX0dST1VQID0gTUVUQURBVEFfRklMRV9JTkZPCiAgR1JPVVAgPSBQUk9EVUNUX01FVEFEQVRBCiAgICBEQVRBX1RZUEUgPSAiTDFUIgogICAgRUxFVkFUSU9OX1NPVVJDRSA9ICJHTFMyMDAwIgogICAgT1VUUFVUX0ZPUk1BVCA9ICJHRU9USUZGIgogICAgU1BBQ0VDUkFGVF9JRCA9ICJMQU5EU0FUXzgiCiAgICBTRU5TT1JfSUQgPSAiT0xJX1RJUlMiCiAgICBXUlNfUEFUSCA9IDQ0CiAgICBXUlNfUk9XID0gMzQKICAgIE5BRElSX09GRk5BRElSID0gIk5BRElSIgogICAgVEFSR0VUX1dSU19QQVRIID0gNDQKICAgIFRBUkdFVF9XUlNfUk9XID0gMzQKICAgIERBVEVfQUNRVUlSRUQgPSAyMDE2LTA5LTE1CiAgICBTQ0VORV9DRU5URVJfVElNRSA9ICIxODo0NjoxOC42ODY3MzgwWiIKICAgIENPUk5FUl9VTF9MQVRfUFJPRFVDVCA9IDM4LjUyODE5CiAgICBDT1JORVJfVUxfTE9OX1BST0RVQ1QgPSAtMTIzLjQwODQzCiAgICBDT1JORVJfVVJfTEFUX1BST0RVQ1QgPSAzOC41MDc2NQogICAgQ09STkVSX1VSX0xPTl9QUk9EVUNUID0gLTEyMC43NjkzMwogICAgQ09STkVSX0xMX0xBVF9QUk9EVUNUID0gMzYuNDE2MzMKICAgIENPUk5FUl9MTF9MT05fUFJPRFVDVCA9IC0xMjMuMzk3MDkKICAgIENPUk5FUl9MUl9MQVRfUFJPRFVDVCA9IDM2LjM5NzI5CiAgICBDT1JORVJfTFJfTE9OX1BST0RVQ1QgPSAtMTIwLjgzMTE3CiAgICBDT1JORVJfVUxfUFJPSkVDVElPTl9YX1BST0RVQ1QgPSA0NjQ0MDAuMDAwCiAgICBDT1JORVJfVUxfUFJPSkVDVElPTl9ZX1BST0RVQ1QgPSA0MjY0NTAwLjAwMAogICAgQ09STkVSX1VSX1BST0pFQ1RJT05fWF9QUk9EVUNUID0gNjk0NTAwLjAwMAogICAgQ09STkVSX1VSX1BST0pFQ1RJT05fWV9QUk9EVUNUID0gNDI2NDUwMC4wMDAKICAgIENPUk5FUl9MTF9QUk9KRUNUSU9OX1hfUFJPRFVDVCA9IDQ2NDQwMC4wMDAKICAgIENPUk5FUl9MTF9QUk9KRUNUSU9OX1lfUFJPRFVDVCA9IDQwMzAyMDAuMDAwCiAgICBDT1JORVJfTFJfUFJPSkVDVElPTl9YX1BST0RVQ1QgPSA2OTQ1MDAuMDAwCiAgICBDT1JORVJfTFJfUFJPSkVDVElPTl9ZX1BST0RVQ1QgPSA0MDMwMjAwLjAwMAogICAgUEFOQ0hST01BVElDX0xJTkVTID0gMTU2MjEKICAgIFBBTkNIUk9NQVRJQ19TQU1QTEVTID0gMTUzNDEKICAgIFJFRkxFQ1RJVkVfTElORVMgPSA3ODExCiAgICBSRUZMRUNUSVZFX1NBTVBMRVMgPSA3NjcxCiAgICBUSEVSTUFMX0xJTkVTID0gNzgxMQogICAgVEhFUk1BTF9TQU1QTEVTID0gNzY3MQogICAgRklMRV9OQU1FX0JBTkRfMSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjEuVElGIgogICAgRklMRV9OQU1FX0JBTkRfMiA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjIuVElGIgogICAgRklMRV9OQU1FX0JBTkRfMyA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjMuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNCA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjQuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjUuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNiA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjYuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNyA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjcuVElGIgogICAgRklMRV9OQU1FX0JBTkRfOCA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjguVElGIgogICAgRklMRV9OQU1FX0JBTkRfOSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjkuVElGIgogICAgRklMRV9OQU1FX0JBTkRfMTAgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxMC5USUYiCiAgICBGSUxFX05BTUVfQkFORF8xMSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjExLlRJRiIKICAgIEZJTEVfTkFNRV9CQU5EX1FVQUxJVFkgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0JRQS5USUYiCiAgICBNRVRBREFUQV9GSUxFX05BTUUgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX01UTC50eHQiCiAgICBCUEZfTkFNRV9PTEkgPSAiTE84QlBGMjAxNjA5MTUxODMwNTdfMjAxNjA5MTUyMDA5NTAuMDEiCiAgICBCUEZfTkFNRV9USVJTID0gIkxUOEJQRjIwMTYwOTAyMDg0MTIyXzIwMTYwOTE3MDc0MDI3LjAyIgogICAgQ1BGX05BTUUgPSAiTDhDUEYyMDE2MDcwMV8yMDE2MDkzMC4wMiIKICAgIFJMVVRfRklMRV9OQU1FID0gIkw4UkxVVDIwMTUwMzAzXzIwNDMxMjMxdjExLmg1IgogIEVORF9HUk9VUCA9IFBST0RVQ1RfTUVUQURBVEEKICBHUk9VUCA9IElNQUdFX0FUVFJJQlVURVMKICAgIENMT1VEX0NPVkVSID0gMjkuNTYKICAgIENMT1VEX0NPVkVSX0xBTkQgPSAzLjMzCiAgICBJTUFHRV9RVUFMSVRZX09MSSA9IDkKICAgIElNQUdFX1FVQUxJVFlfVElSUyA9IDkKICAgIFRJUlNfU1NNX01PREVMID0gIkZJTkFMIgogICAgVElSU19TU01fUE9TSVRJT05fU1RBVFVTID0gIkVTVElNQVRFRCIKICAgIFJPTExfQU5HTEUgPSAtMC4wMDEKICAgIFNVTl9BWklNVVRIID0gMTQ4LjQ4MDQ5Mzk2CiAgICBTVU5fRUxFVkFUSU9OID0gNTAuOTM3NjgzOTkKICAgIEVBUlRIX1NVTl9ESVNUQU5DRSA9IDEuMDA1Mzc1MgogICAgR1JPVU5EX0NPTlRST0xfUE9JTlRTX1ZFUlNJT04gPSA0CiAgICBHUk9VTkRfQ09OVFJPTF9QT0lOVFNfTU9ERUwgPSA1NDgKICAgIEdFT01FVFJJQ19STVNFX01PREVMID0gNS44NTcKICAgIEdFT01FVFJJQ19STVNFX01PREVMX1kgPSAzLjg0MQogICAgR0VPTUVUUklDX1JNU0VfTU9ERUxfWCA9IDQuNDIyCiAgICBHUk9VTkRfQ09OVFJPTF9QT0lOVFNfVkVSSUZZID0gMjI4CiAgICBHRU9NRVRSSUNfUk1TRV9WRVJJRlkgPSAzLjM4MgogIEVORF9HUk9VUCA9IElNQUdFX0FUVFJJQlVURVMKICBHUk9VUCA9IE1JTl9NQVhfUkFESUFOQ0UKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF8xID0gNzUxLjk1NzA5CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfMSA9IC02Mi4wOTY4NgogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzIgPSA3NzAuMDEzMTgKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF8yID0gLTYzLjU4Nzk0CiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfMyA9IDcwOS41NjA2MQogICAgUkFESUFOQ0VfTUlOSU1VTV9CQU5EXzMgPSAtNTguNTk1NzUKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF80ID0gNTk4LjM0MTQ5CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfNCA9IC00OS40MTEyMwogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzUgPSAzNjYuMTU1MTUKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF81ID0gLTMwLjIzNzIxCiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfNiA9IDkxLjA1OTQ2CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfNiA9IC03LjUxOTcyCiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfNyA9IDMwLjY5MTkxCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfNyA9IC0yLjUzNDU1CiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfOCA9IDY3Ny4xNTc4NAogICAgUkFESUFOQ0VfTUlOSU1VTV9CQU5EXzggPSAtNTUuOTE5OTIKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF85ID0gMTQzLjEwMTczCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfOSA9IC0xMS44MTczOQogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzEwID0gMjIuMDAxODAKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF8xMCA9IDAuMTAwMzMKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF8xMSA9IDIyLjAwMTgwCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfMTEgPSAwLjEwMDMzCiAgRU5EX0dST1VQID0gTUlOX01BWF9SQURJQU5DRQogIEdST1VQID0gTUlOX01BWF9SRUZMRUNUQU5DRQogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzEgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzEgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF8yID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF8yID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfMyA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfMyA9IC0wLjA5OTk4MAogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzQgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzQgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF81ID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF81ID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfNiA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfNiA9IC0wLjA5OTk4MAogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzcgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzcgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF84ID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF84ID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfOSA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfOSA9IC0wLjA5OTk4MAogIEVORF9HUk9VUCA9IE1JTl9NQVhfUkVGTEVDVEFOQ0UKICBHUk9VUCA9IE1JTl9NQVhfUElYRUxfVkFMVUUKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF8xID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF8xID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzIgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzIgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfMyA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfMyA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF80ID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF80ID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzUgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzUgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfNiA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfNiA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF83ID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF83ID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzggPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzggPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfOSA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfOSA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF8xMCA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfMTAgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfMTEgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzExID0gMQogIEVORF9HUk9VUCA9IE1JTl9NQVhfUElYRUxfVkFMVUUKICBHUk9VUCA9IFJBRElPTUVUUklDX1JFU0NBTElORwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzEgPSAxLjI0MjJFLTAyCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfMiA9IDEuMjcyMEUtMDIKICAgIFJBRElBTkNFX01VTFRfQkFORF8zID0gMS4xNzIxRS0wMgogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzQgPSA5Ljg4NDJFLTAzCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfNSA9IDYuMDQ4N0UtMDMKICAgIFJBRElBTkNFX01VTFRfQkFORF82ID0gMS41MDQyRS0wMwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzcgPSA1LjA3MDFFLTA0CiAgICBSQURJQU5DRV9NVUxUX0JBTkRfOCA9IDEuMTE4NkUtMDIKICAgIFJBRElBTkNFX01VTFRfQkFORF85ID0gMi4zNjQwRS0wMwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzEwID0gMy4zNDIwRS0wNAogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzExID0gMy4zNDIwRS0wNAogICAgUkFESUFOQ0VfQUREX0JBTkRfMSA9IC02Mi4xMDkyOAogICAgUkFESUFOQ0VfQUREX0JBTkRfMiA9IC02My42MDA2NgogICAgUkFESUFOQ0VfQUREX0JBTkRfMyA9IC01OC42MDc0NwogICAgUkFESUFOQ0VfQUREX0JBTkRfNCA9IC00OS40MjExMgogICAgUkFESUFOQ0VfQUREX0JBTkRfNSA9IC0zMC4yNDMyNgogICAgUkFESUFOQ0VfQUREX0JBTkRfNiA9IC03LjUyMTIyCiAgICBSQURJQU5DRV9BRERfQkFORF83ID0gLTIuNTM1MDUKICAgIFJBRElBTkNFX0FERF9CQU5EXzggPSAtNTUuOTMxMTAKICAgIFJBRElBTkNFX0FERF9CQU5EXzkgPSAtMTEuODE5NzUKICAgIFJBRElBTkNFX0FERF9CQU5EXzEwID0gMC4xMDAwMAogICAgUkFESUFOQ0VfQUREX0JBTkRfMTEgPSAwLjEwMDAwCiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfMSA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF8yID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzMgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfNCA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF81ID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzYgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfNyA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF84ID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzkgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF8xID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF8yID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF8zID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF80ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF81ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF82ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF83ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF84ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF85ID0gLTAuMTAwMDAwCiAgRU5EX0dST1VQID0gUkFESU9NRVRSSUNfUkVTQ0FMSU5HCiAgR1JPVVAgPSBUSVJTX1RIRVJNQUxfQ09OU1RBTlRTCiAgICBLMV9DT05TVEFOVF9CQU5EXzEwID0gNzc0Ljg4NTMKICAgIEsxX0NPTlNUQU5UX0JBTkRfMTEgPSA0ODAuODg4MwogICAgSzJfQ09OU1RBTlRfQkFORF8xMCA9IDEzMjEuMDc4OQogICAgSzJfQ09OU1RBTlRfQkFORF8xMSA9IDEyMDEuMTQ0MgogIEVORF9HUk9VUCA9IFRJUlNfVEhFUk1BTF9DT05TVEFOVFMKICBHUk9VUCA9IFBST0pFQ1RJT05fUEFSQU1FVEVSUwogICAgTUFQX1BST0pFQ1RJT04gPSAiVVRNIgogICAgREFUVU0gPSAiV0dTODQiCiAgICBFTExJUFNPSUQgPSAiV0dTODQiCiAgICBVVE1fWk9ORSA9IDEwCiAgICBHUklEX0NFTExfU0laRV9QQU5DSFJPTUFUSUMgPSAxNS4wMAogICAgR1JJRF9DRUxMX1NJWkVfUkVGTEVDVElWRSA9IDMwLjAwCiAgICBHUklEX0NFTExfU0laRV9USEVSTUFMID0gMzAuMDAKICAgIE9SSUVOVEFUSU9OID0gIk5PUlRIX1VQIgogICAgUkVTQU1QTElOR19PUFRJT04gPSAiQ1VCSUNfQ09OVk9MVVRJT04iCiAgRU5EX0dST1VQID0gUFJPSkVDVElPTl9QQVJBTUVURVJTCkVORF9HUk9VUCA9IEwxX01FVEFEQVRBX0ZJTEUKRU5ECg==\"\n      }\n    },\n    {\n      \"ID\": \"914cb60452456134\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/gcp-public-data-landsat/o?alt=json\\u0026delimiter=\\u0026pageToken=\\u0026prefix=LC08%2FPRE%2F044%2F034%2FLC80440342016259LGN00%2F\\u0026prettyPrint=false\\u0026projection=full\\u0026versions=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"12632\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:26 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:26 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpLE4EijIrGqoHRLrCqmprZtxBU2JtHLLsZ-nIakblnuZX8s6FZA1SEaczyybdjB32loN1-gVCf83PFM4x06S24ATKp9-xRgQ9QNC9fwVH_ec4e9JQ\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvTEMwOC9QUkUvMDQ0LzAzNC9MQzgwNDQwMzQyMDE2MjU5TEdOMDAvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxLlRJRi8xNDc1NTk5MTQ0NTc5MDAwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxLlRJRiIsIm5hbWUiOiJMQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjEuVElGIiwiYnVja2V0IjoiZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQiLCJnZW5lcmF0aW9uIjoiMTQ3NTU5OTE0NDU3OTAwMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwidGltZUNyZWF0ZWQiOiIyMDE2LTEwLTA0VDE2OjM5OjA0LjU0NVoiLCJ1cGRhdGVkIjoiMjAxNi0xMC0wNFQxNjozOTowNC41NDVaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTYtMTAtMDRUMTY6Mzk6MDQuNTQ1WiIsInNpemUiOiI3NDcyMTczNiIsIm1kNUhhc2giOiI4MzVMNkI1ZnJCMHpDQjZzMjJyMlN3PT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxLlRJRj9nZW5lcmF0aW9uPTE0NzU1OTkxNDQ1NzkwMDAmYWx0PW1lZGlhIiwiY3JjMzJjIjoiOTM0QnJnPT0iLCJldGFnIjoiQ0xqZjM1Ykx3YzhDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdC9MQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjEwLlRJRi8xNDc1NTk5MzEwMDQyMDAwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxMC5USUYiLCJuYW1lIjoiTEMwOC9QUkUvMDQ0LzAzNC9MQzgwNDQwMzQyMDE2MjU5TEdOMDAvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxMC5USUYiLCJidWNrZXQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdCIsImdlbmVyYXRpb24iOiIxNDc1NTk5MzEwMDQyMDAwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTYtMTAtMDRUMTY6NDE6NTAuMDAyWiIsInVwZGF0ZWQiOiIyMDE2LTEwLTA0VDE2OjQxOjUwLjAwMloiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxNi0xMC0wNFQxNjo0MTo1MC4wMDJaIiwic2l6ZSI6IjU4NjgxMjI4IiwibWQ1SGFzaCI6IkJXNjIzeEhnMTVJaFYyNG1ickwrQXc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjEwLlRJRj9nZW5lcmF0aW9uPTE0NzU1OTkzMTAwNDIwMDAmYWx0PW1lZGlhIiwiY3JjMzJjIjoieHpWMmZnPT0iLCJldGFnIjoiQ0pEbjB1WEx3YzhDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdC9MQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjExLlRJRi8xNDc1NTk5MzE5MTg4MDAwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxMS5USUYiLCJuYW1lIjoiTEMwOC9QUkUvMDQ0LzAzNC9MQzgwNDQwMzQyMDE2MjU5TEdOMDAvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxMS5USUYiLCJidWNrZXQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdCIsImdlbmVyYXRpb24iOiIxNDc1NTk5MzE5MTg4MDAwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTYtMTAtMDRUMTY6NDE6NTkuMTQ5WiIsInVwZGF0ZWQiOiIyMDE2LTEwLTA0VDE2OjQxOjU5LjE0OVoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxNi0xMC0wNFQxNjo0MTo1OS4xNDlaIiwic2l6ZSI6IjU2Nzk2NDM5IiwibWQ1SGFzaCI6IkZPeGl5eEpYcUFmbFJUOGxGblNkT2c9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjExLlRJRj9nZW5lcmF0aW9uPTE0NzU1OTkzMTkxODgwMDAmYWx0PW1lZGlhIiwiY3JjMzJjIjoicC9IRlZ3PT0iLCJldGFnIjoiQ0tDRWdlckx3YzhDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdC9MQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjIuVElGLzE0NzU1OTkxNjEyMjQwMDAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjIuVElGIiwibmFtZSI6IkxDMDgvUFJFLzA0NC8wMzQvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwL0xDODA0NDAzNDIwMTYyNTlMR04wMF9CMi5USUYiLCJidWNrZXQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdCIsImdlbmVyYXRpb24iOiIxNDc1NTk5MTYxMjI0MDAwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTYtMTAtMDRUMTY6Mzk6MjEuMTYwWiIsInVwZGF0ZWQiOiIyMDE2LTEwLTA0VDE2OjM5OjIxLjE2MFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxNi0xMC0wNFQxNjozOToyMS4xNjBaIiwic2l6ZSI6Ijc3MTQ5NzcxIiwibWQ1SGFzaCI6Ik1QMjJ6ak9vMk5zMGlZNE1UUEpSd0E9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjIuVElGP2dlbmVyYXRpb249MTQ3NTU5OTE2MTIyNDAwMCZhbHQ9bWVkaWEiLCJjcmMzMmMiOiJySThZUmc9PSIsImV0YWciOiJDTURXMTU3THdjOENFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdjcC1wdWJsaWMtZGF0YS1sYW5kc2F0L0xDMDgvUFJFLzA0NC8wMzQvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwL0xDODA0NDAzNDIwMTYyNTlMR04wMF9CMy5USUYvMTQ3NTU5OTE3ODQzNTAwMCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2djcC1wdWJsaWMtZGF0YS1sYW5kc2F0L28vTEMwOCUyRlBSRSUyRjA0NCUyRjAzNCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMF9CMy5USUYiLCJuYW1lIjoiTEMwOC9QUkUvMDQ0LzAzNC9MQzgwNDQwMzQyMDE2MjU5TEdOMDAvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IzLlRJRiIsImJ1Y2tldCI6ImdjcC1wdWJsaWMtZGF0YS1sYW5kc2F0IiwiZ2VuZXJhdGlvbiI6IjE0NzU1OTkxNzg0MzUwMDAiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsInRpbWVDcmVhdGVkIjoiMjAxNi0xMC0wNFQxNjozOTozOC4zNzZaIiwidXBkYXRlZCI6IjIwMTYtMTAtMDRUMTY6Mzk6MzguMzc2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE2LTEwLTA0VDE2OjM5OjM4LjM3NloiLCJzaXplIjoiODAyOTM2ODciLCJtZDVIYXNoIjoidlFNaUdlRHVCZzZjcjNYc2ZJRWpvUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2djcC1wdWJsaWMtZGF0YS1sYW5kc2F0L28vTEMwOCUyRlBSRSUyRjA0NCUyRjAzNCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMF9CMy5USUY/Z2VuZXJhdGlvbj0xNDc1NTk5MTc4NDM1MDAwJmFsdD1tZWRpYSIsImNyYzMyYyI6InVaQnJuQT09IiwiZXRhZyI6IkNMaVQ4cWJMd2M4Q0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvTEMwOC9QUkUvMDQ0LzAzNC9MQzgwNDQwMzQyMDE2MjU5TEdOMDAvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0I0LlRJRi8xNDc1NTk5MTk0MjY4MDAwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0I0LlRJRiIsIm5hbWUiOiJMQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjQuVElGIiwiYnVja2V0IjoiZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQiLCJnZW5lcmF0aW9uIjoiMTQ3NTU5OTE5NDI2ODAwMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwidGltZUNyZWF0ZWQiOiIyMDE2LTEwLTA0VDE2OjM5OjU0LjIxMVoiLCJ1cGRhdGVkIjoiMjAxNi0xMC0wNFQxNjozOTo1NC4yMTFaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTYtMTAtMDRUMTY6Mzk6NTQuMjExWiIsInNpemUiOiI4NDQ5NDM3NSIsIm1kNUhhc2giOiJGV2VWQTAxWk8wK21BK0VSRmN6dWhBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0I0LlRJRj9nZW5lcmF0aW9uPTE0NzU1OTkxOTQyNjgwMDAmYWx0PW1lZGlhIiwiY3JjMzJjIjoiV2VzNW9RPT0iLCJldGFnIjoiQ09EQ3VLN0x3YzhDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdC9MQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjUuVElGLzE0NzU1OTkyMDI5NzkwMDAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjUuVElGIiwibmFtZSI6IkxDMDgvUFJFLzA0NC8wMzQvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwL0xDODA0NDAzNDIwMTYyNTlMR04wMF9CNS5USUYiLCJidWNrZXQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdCIsImdlbmVyYXRpb24iOiIxNDc1NTk5MjAyOTc5MDAwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTYtMTAtMDRUMTY6NDA6MDIuOTM3WiIsInVwZGF0ZWQiOiIyMDE2LTEwLTA0VDE2OjQwOjAyLjkzN1oiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxNi0xMC0wNFQxNjo0MDowMi45MzdaIiwic2l6ZSI6Ijg5MzE4NDY3IiwibWQ1SGFzaCI6InA0b3lLSEFHbzVLeTNLZzFUSzFaUXc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjUuVElGP2dlbmVyYXRpb249MTQ3NTU5OTIwMjk3OTAwMCZhbHQ9bWVkaWEiLCJjcmMzMmMiOiJwVFl1dXc9PSIsImV0YWciOiJDTGlaekxMTHdjOENFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdjcC1wdWJsaWMtZGF0YS1sYW5kc2F0L0xDMDgvUFJFLzA0NC8wMzQvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwL0xDODA0NDAzNDIwMTYyNTlMR04wMF9CNi5USUYvMTQ3NTU5OTIzMzQ4MTAwMCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2djcC1wdWJsaWMtZGF0YS1sYW5kc2F0L28vTEMwOCUyRlBSRSUyRjA0NCUyRjAzNCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMF9CNi5USUYiLCJuYW1lIjoiTEMwOC9QUkUvMDQ0LzAzNC9MQzgwNDQwMzQyMDE2MjU5TEdOMDAvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0I2LlRJRiIsImJ1Y2tldCI6ImdjcC1wdWJsaWMtZGF0YS1sYW5kc2F0IiwiZ2VuZXJhdGlvbiI6IjE0NzU1OTkyMzM0ODEwMDAiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsInRpbWVDcmVhdGVkIjoiMjAxNi0xMC0wNFQxNjo0MDozMy4zNDlaIiwidXBkYXRlZCI6IjIwMTYtMTAtMDRUMTY6NDA6MzMuMzQ5WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE2LTEwLTA0VDE2OjQwOjMzLjM0OVoiLCJzaXplIjoiODk0NjU3NjciLCJtZDVIYXNoIjoiMlo3MkdVT0t0bGd6VDlWUlNHWVhqQT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2djcC1wdWJsaWMtZGF0YS1sYW5kc2F0L28vTEMwOCUyRlBSRSUyRjA0NCUyRjAzNCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMF9CNi5USUY/Z2VuZXJhdGlvbj0xNDc1NTk5MjMzNDgxMDAwJmFsdD1tZWRpYSIsImNyYzMyYyI6IklOWEhiUT09IiwiZXRhZyI6IkNLanlrY0hMd2M4Q0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvTEMwOC9QUkUvMDQ0LzAzNC9MQzgwNDQwMzQyMDE2MjU5TEdOMDAvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0I3LlRJRi8xNDc1NTk5MjQxMDU1MDAwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0I3LlRJRiIsIm5hbWUiOiJMQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjcuVElGIiwiYnVja2V0IjoiZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQiLCJnZW5lcmF0aW9uIjoiMTQ3NTU5OTI0MTA1NTAwMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwidGltZUNyZWF0ZWQiOiIyMDE2LTEwLTA0VDE2OjQwOjQxLjAyMVoiLCJ1cGRhdGVkIjoiMjAxNi0xMC0wNFQxNjo0MDo0MS4wMjFaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTYtMTAtMDRUMTY6NDA6NDEuMDIxWiIsInNpemUiOiI4NjQ2MjYxNCIsIm1kNUhhc2giOiI4Z1BOUTdRWm9GMkNOWlo5RW1ybG9nPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0I3LlRJRj9nZW5lcmF0aW9uPTE0NzU1OTkyNDEwNTUwMDAmYWx0PW1lZGlhIiwiY3JjMzJjIjoidXdDRCtBPT0iLCJldGFnIjoiQ0ppVzRNVEx3YzhDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdC9MQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjguVElGLzE0NzU1OTkyODEzMzgwMDAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjguVElGIiwibmFtZSI6IkxDMDgvUFJFLzA0NC8wMzQvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwL0xDODA0NDAzNDIwMTYyNTlMR04wMF9COC5USUYiLCJidWNrZXQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdCIsImdlbmVyYXRpb24iOiIxNDc1NTk5MjgxMzM4MDAwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTYtMTAtMDRUMTY6NDE6MjEuMzAwWiIsInVwZGF0ZWQiOiIyMDE2LTEwLTA0VDE2OjQxOjIxLjMwMFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxNi0xMC0wNFQxNjo0MToyMS4zMDBaIiwic2l6ZSI6IjMxODg4Nzc3NCIsIm1kNUhhc2giOiJ5Nzk1THJVekJ3azJ0TDZQTTAxY0VBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0I4LlRJRj9nZW5lcmF0aW9uPTE0NzU1OTkyODEzMzgwMDAmYWx0PW1lZGlhIiwiY3JjMzJjIjoiWjMrWmhRPT0iLCJldGFnIjoiQ0pEdCt0Zkx3YzhDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdC9MQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjkuVElGLzE0NzU1OTkyOTE0MjUwMDAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjkuVElGIiwibmFtZSI6IkxDMDgvUFJFLzA0NC8wMzQvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwL0xDODA0NDAzNDIwMTYyNTlMR04wMF9COS5USUYiLCJidWNrZXQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdCIsImdlbmVyYXRpb24iOiIxNDc1NTk5MjkxNDI1MDAwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTYtMTAtMDRUMTY6NDE6MzEuMzYxWiIsInVwZGF0ZWQiOiIyMDE2LTEwLTA0VDE2OjQxOjMxLjM2MVoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxNi0xMC0wNFQxNjo0MTozMS4zNjFaIiwic2l6ZSI6IjQ0MzA4MjA1IiwibWQ1SGFzaCI6IjVCNDFFMkRCYlk1MnBZUFVHVmg5NWc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjkuVElGP2dlbmVyYXRpb249MTQ3NTU5OTI5MTQyNTAwMCZhbHQ9bWVkaWEiLCJjcmMzMmMiOiJhME9EUXc9PSIsImV0YWciOiJDT2pCNHR6THdjOENFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdjcC1wdWJsaWMtZGF0YS1sYW5kc2F0L0xDMDgvUFJFLzA0NC8wMzQvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwL0xDODA0NDAzNDIwMTYyNTlMR04wMF9CUUEuVElGLzE0NzU1OTkzMjcyMjIwMDAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQlFBLlRJRiIsIm5hbWUiOiJMQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQlFBLlRJRiIsImJ1Y2tldCI6ImdjcC1wdWJsaWMtZGF0YS1sYW5kc2F0IiwiZ2VuZXJhdGlvbiI6IjE0NzU1OTkzMjcyMjIwMDAiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsInRpbWVDcmVhdGVkIjoiMjAxNi0xMC0wNFQxNjo0MjowNy4xNTlaIiwidXBkYXRlZCI6IjIwMTYtMTAtMDRUMTY6NDI6MDcuMTU5WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE2LTEwLTA0VDE2OjQyOjA3LjE1OVoiLCJzaXplIjoiMzM1NDcxOSIsIm1kNUhhc2giOiJ6cWlndmw1RW52bWkvR0xjOHlINTFBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0JRQS5USUY/Z2VuZXJhdGlvbj0xNDc1NTk5MzI3MjIyMDAwJmFsdD1tZWRpYSIsImNyYzMyYyI6IldPQmdLQT09IiwiZXRhZyI6IkNQQ3g2KzNMd2M4Q0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvTEMwOC9QUkUvMDQ0LzAzNC9MQzgwNDQwMzQyMDE2MjU5TEdOMDAvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX01UTC50eHQvMTQ3NTU5OTMyNzY2MjAwMCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2djcC1wdWJsaWMtZGF0YS1sYW5kc2F0L28vTEMwOCUyRlBSRSUyRjA0NCUyRjAzNCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMF9NVEwudHh0IiwibmFtZSI6IkxDMDgvUFJFLzA0NC8wMzQvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwL0xDODA0NDAzNDIwMTYyNTlMR04wMF9NVEwudHh0IiwiYnVja2V0IjoiZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQiLCJnZW5lcmF0aW9uIjoiMTQ3NTU5OTMyNzY2MjAwMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwidGltZUNyZWF0ZWQiOiIyMDE2LTEwLTA0VDE2OjQyOjA3LjYxOFoiLCJ1cGRhdGVkIjoiMjAxNi0xMC0wNFQxNjo0MjowNy42MThaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTYtMTAtMDRUMTY6NDI6MDcuNjE4WiIsInNpemUiOiI3OTAzIiwibWQ1SGFzaCI6ImVsL1VkRHZXUjBoZmlFbHZyYkJjVVE9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfTVRMLnR4dD9nZW5lcmF0aW9uPTE0NzU1OTkzMjc2NjIwMDAmYWx0PW1lZGlhIiwiY3JjMzJjIjoiUFdCdDhnPT0iLCJldGFnIjoiQ0xDZmh1N0x3YzhDRUFFPSJ9XX0=\"\n      }\n    },\n    {\n      \"ID\": \"3f3f45cd2b718e17\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/noauth\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"247\"\n          ],\n          \"Content-Type\": [\n            \"application/xml; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:26 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:26 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqsZlmkTyf2_fqITeaIiM8s2MLUvz5qFiP_rzA4Mf6Q9LMxsiQeP-GBRwHON_XvnG2qef3XL1EzgTLA_GxtLKZRjdzOBndJPf9XbJa9KjJCIPlducQ\"\n          ]\n        },\n        \"Body\": \"PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+QWNjZXNzRGVuaWVkPC9Db2RlPjxNZXNzYWdlPkFjY2VzcyBkZW5pZWQuPC9NZXNzYWdlPjxEZXRhaWxzPkFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuZ2V0IGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLjwvRGV0YWlscz48L0Vycm9yPg==\"\n      }\n    },\n    {\n      \"ID\": \"110cdd2daefc6162\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoibm9hdXRoIn0K\",\n          \"Yg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 401,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"30405\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:26 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"Www-Authenticate\": [\n            \"Bearer realm=\\\"https://accounts.google.com/\\\"\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrGgfg36ZmqdKbc0NqBivwXULVnF2NuBAD31rJqzC5Rj9xgHFbRnwxJCbdxCuUdlAhGW_-H88mBadNGmqch0fmAyAd80HPANBkUmIgkolsL4HK7XAU\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLiIsImxvY2F0aW9uVHlwZSI6ImhlYWRlciIsImxvY2F0aW9uIjoiQXV0aG9yaXphdGlvbiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL25vYXV0aC5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1MT0dJTl9SRVFVSVJFRCwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9Y29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUxPR0lOX1JFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDQ0VTU19ERU5JRUQ6IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6NDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuaW5zZXJ0KE9iamVjdHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPXVuYXV0aG9yaXplZCwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uUkVRVUlSRUQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL25vYXV0aC5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5hdXRoZW50aWNhdGVkX3VzZXIsIG1lc3NhZ2U9QW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249aGVhZGVycy5BdXRob3JpemF0aW9uLCBtZXNzYWdlPUFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMX0gQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNDRVNTX0RFTklFRDogQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL25vYXV0aC5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDQ0VTU19ERU5JRUQ6IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6NDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuaW5zZXJ0KE9iamVjdHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXtXV1ctQXV0aGVudGljYXRlPVtCZWFyZXIgcmVhbG09XCJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20vXCJdfSwgaHR0cFN0YXR1cz11bmF1dGhvcml6ZWQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLlJFUVVJUkVELCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNDRVNTX0RFTklFRDogQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL25vYXV0aC5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1SRVFVSVJFRCwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkuYXV0aGVudGljYXRlZF91c2VyLCBtZXNzYWdlPUFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWhlYWRlcnMuQXV0aG9yaXphdGlvbiwgbWVzc2FnZT1Bbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL25vYXV0aC4sIHJlYXNvbj1yZXF1aXJlZCwgcnBjQ29kZT00MDF9IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDQ0VTU19ERU5JRUQ6IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6NDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuaW5zZXJ0KE9iamVjdHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuYXV0aC5BdXRoZW50aWNhdG9ySW50ZXJjZXB0b3IuYWRkQ2hhbGxlbmdlSGVhZGVyKEF1dGhlbnRpY2F0b3JJbnRlcmNlcHRvci5qYXZhOjI2OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmF1dGguQXV0aGVudGljYXRvckludGVyY2VwdG9yLnByb2Nlc3NFcnJvclJlc3BvbnNlKEF1dGhlbnRpY2F0b3JJbnRlcmNlcHRvci5qYXZhOjIzNilcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmF1dGguR2FpYU1pbnRJbnRlcmNlcHRvci5wcm9jZXNzRXJyb3JSZXNwb25zZShHYWlhTWludEludGVyY2VwdG9yLmphdmE6NzY4KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5pbnRlcmNlcHQuQXJvdW5kSW50ZXJjZXB0b3JXcmFwcGVyLnByb2Nlc3NFcnJvclJlc3BvbnNlKEFyb3VuZEludGVyY2VwdG9yV3JhcHBlci5qYXZhOjI4KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc3RhdHMuU3RhdHNCb290c3RyYXAkSW50ZXJjZXB0b3JTdGF0c1JlY29yZGVyLnByb2Nlc3NFcnJvclJlc3BvbnNlKFN0YXRzQm9vdHN0cmFwLmphdmE6MzE1KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5pbnRlcmNlcHQuSW50ZXJjZXB0aW9ucyRBcm91bmRJbnRlcmNlcHRpb24uaGFuZGxlRXJyb3JSZXNwb25zZShJbnRlcmNlcHRpb25zLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5pbnRlcmNlcHQuSW50ZXJjZXB0aW9ucyRBcm91bmRJbnRlcmNlcHRpb24uYWNjZXNzJDIwMChJbnRlcmNlcHRpb25zLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5pbnRlcmNlcHQuSW50ZXJjZXB0aW9ucyRBcm91bmRJbnRlcmNlcHRpb24kMS5jYWxsKEludGVyY2VwdGlvbnMuamF2YToxNDQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLmludGVyY2VwdC5JbnRlcmNlcHRpb25zJEFyb3VuZEludGVyY2VwdGlvbiQxLmNhbGwoSW50ZXJjZXB0aW9ucy5qYXZhOjEzNylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldEV4Y2VwdGlvbihBYnN0cmFjdEZ1dHVyZS5qYXZhOjc1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2OClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1MT0dJTl9SRVFVSVJFRCwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL25vYXV0aC5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz11bmF1dGhvcml6ZWQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLlJFUVVJUkVELCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNDRVNTX0RFTklFRDogQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL25vYXV0aC5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1SRVFVSVJFRCwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkuYXV0aGVudGljYXRlZF91c2VyLCBtZXNzYWdlPUFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWhlYWRlcnMuQXV0aG9yaXphdGlvbiwgbWVzc2FnZT1Bbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL25vYXV0aC4sIHJlYXNvbj1yZXF1aXJlZCwgcnBjQ29kZT00MDF9IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDQ0VTU19ERU5JRUQ6IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6NDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuaW5zZXJ0KE9iamVjdHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0Li4uIDIwIG1vcmVcbiJ9XSwiY29kZSI6NDAxLCJtZXNzYWdlIjoiQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguIn19\"\n      }\n    },\n    {\n      \"ID\": \"848c7013eb1665b1\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/gcp-public-data-landsat/LC08/PRE/044/034/LC80440342016259LGN00/LC80440342016259LGN00_MTL.txt\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=3600\"\n          ],\n          \"Content-Length\": [\n            \"7903\"\n          ],\n          \"Content-Type\": [\n            \"application/octet-stream\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:27 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"7a5fd4743bd647485f88496fadb05c51\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 23:25:27 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Tue, 04 Oct 2016 16:42:07 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1475599327662000\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=PWBt8g==\",\n            \"md5=el/UdDvWR0hfiElvrbBcUQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"7903\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqbrgn51bDFbwZ1c2_BxCHhog7If9w6ooKAtb2YCerQcObpiFJZqT3-Jn7zTXEEPVuysmxKw4PmvEOmkbCAJVkmbEVZm6z877JKFhrXTrkWqWYooq8\"\n          ]\n        },\n        \"Body\": \"R1JPVVAgPSBMMV9NRVRBREFUQV9GSUxFCiAgR1JPVVAgPSBNRVRBREFUQV9GSUxFX0lORk8KICAgIE9SSUdJTiA9ICJJbWFnZSBjb3VydGVzeSBvZiB0aGUgVS5TLiBHZW9sb2dpY2FsIFN1cnZleSIKICAgIFJFUVVFU1RfSUQgPSAiMDcwMTYwOTE5MTA1MV8wMDAwNCIKICAgIExBTkRTQVRfU0NFTkVfSUQgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwIgogICAgRklMRV9EQVRFID0gMjAxNi0wOS0yMFQwMzoxMzowMloKICAgIFNUQVRJT05fSUQgPSAiTEdOIgogICAgUFJPQ0VTU0lOR19TT0ZUV0FSRV9WRVJTSU9OID0gIkxQR1NfMi42LjIiCiAgRU5EX0dST1VQID0gTUVUQURBVEFfRklMRV9JTkZPCiAgR1JPVVAgPSBQUk9EVUNUX01FVEFEQVRBCiAgICBEQVRBX1RZUEUgPSAiTDFUIgogICAgRUxFVkFUSU9OX1NPVVJDRSA9ICJHTFMyMDAwIgogICAgT1VUUFVUX0ZPUk1BVCA9ICJHRU9USUZGIgogICAgU1BBQ0VDUkFGVF9JRCA9ICJMQU5EU0FUXzgiCiAgICBTRU5TT1JfSUQgPSAiT0xJX1RJUlMiCiAgICBXUlNfUEFUSCA9IDQ0CiAgICBXUlNfUk9XID0gMzQKICAgIE5BRElSX09GRk5BRElSID0gIk5BRElSIgogICAgVEFSR0VUX1dSU19QQVRIID0gNDQKICAgIFRBUkdFVF9XUlNfUk9XID0gMzQKICAgIERBVEVfQUNRVUlSRUQgPSAyMDE2LTA5LTE1CiAgICBTQ0VORV9DRU5URVJfVElNRSA9ICIxODo0NjoxOC42ODY3MzgwWiIKICAgIENPUk5FUl9VTF9MQVRfUFJPRFVDVCA9IDM4LjUyODE5CiAgICBDT1JORVJfVUxfTE9OX1BST0RVQ1QgPSAtMTIzLjQwODQzCiAgICBDT1JORVJfVVJfTEFUX1BST0RVQ1QgPSAzOC41MDc2NQogICAgQ09STkVSX1VSX0xPTl9QUk9EVUNUID0gLTEyMC43NjkzMwogICAgQ09STkVSX0xMX0xBVF9QUk9EVUNUID0gMzYuNDE2MzMKICAgIENPUk5FUl9MTF9MT05fUFJPRFVDVCA9IC0xMjMuMzk3MDkKICAgIENPUk5FUl9MUl9MQVRfUFJPRFVDVCA9IDM2LjM5NzI5CiAgICBDT1JORVJfTFJfTE9OX1BST0RVQ1QgPSAtMTIwLjgzMTE3CiAgICBDT1JORVJfVUxfUFJPSkVDVElPTl9YX1BST0RVQ1QgPSA0NjQ0MDAuMDAwCiAgICBDT1JORVJfVUxfUFJPSkVDVElPTl9ZX1BST0RVQ1QgPSA0MjY0NTAwLjAwMAogICAgQ09STkVSX1VSX1BST0pFQ1RJT05fWF9QUk9EVUNUID0gNjk0NTAwLjAwMAogICAgQ09STkVSX1VSX1BST0pFQ1RJT05fWV9QUk9EVUNUID0gNDI2NDUwMC4wMDAKICAgIENPUk5FUl9MTF9QUk9KRUNUSU9OX1hfUFJPRFVDVCA9IDQ2NDQwMC4wMDAKICAgIENPUk5FUl9MTF9QUk9KRUNUSU9OX1lfUFJPRFVDVCA9IDQwMzAyMDAuMDAwCiAgICBDT1JORVJfTFJfUFJPSkVDVElPTl9YX1BST0RVQ1QgPSA2OTQ1MDAuMDAwCiAgICBDT1JORVJfTFJfUFJPSkVDVElPTl9ZX1BST0RVQ1QgPSA0MDMwMjAwLjAwMAogICAgUEFOQ0hST01BVElDX0xJTkVTID0gMTU2MjEKICAgIFBBTkNIUk9NQVRJQ19TQU1QTEVTID0gMTUzNDEKICAgIFJFRkxFQ1RJVkVfTElORVMgPSA3ODExCiAgICBSRUZMRUNUSVZFX1NBTVBMRVMgPSA3NjcxCiAgICBUSEVSTUFMX0xJTkVTID0gNzgxMQogICAgVEhFUk1BTF9TQU1QTEVTID0gNzY3MQogICAgRklMRV9OQU1FX0JBTkRfMSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjEuVElGIgogICAgRklMRV9OQU1FX0JBTkRfMiA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjIuVElGIgogICAgRklMRV9OQU1FX0JBTkRfMyA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjMuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNCA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjQuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjUuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNiA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjYuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNyA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjcuVElGIgogICAgRklMRV9OQU1FX0JBTkRfOCA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjguVElGIgogICAgRklMRV9OQU1FX0JBTkRfOSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjkuVElGIgogICAgRklMRV9OQU1FX0JBTkRfMTAgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxMC5USUYiCiAgICBGSUxFX05BTUVfQkFORF8xMSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjExLlRJRiIKICAgIEZJTEVfTkFNRV9CQU5EX1FVQUxJVFkgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0JRQS5USUYiCiAgICBNRVRBREFUQV9GSUxFX05BTUUgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX01UTC50eHQiCiAgICBCUEZfTkFNRV9PTEkgPSAiTE84QlBGMjAxNjA5MTUxODMwNTdfMjAxNjA5MTUyMDA5NTAuMDEiCiAgICBCUEZfTkFNRV9USVJTID0gIkxUOEJQRjIwMTYwOTAyMDg0MTIyXzIwMTYwOTE3MDc0MDI3LjAyIgogICAgQ1BGX05BTUUgPSAiTDhDUEYyMDE2MDcwMV8yMDE2MDkzMC4wMiIKICAgIFJMVVRfRklMRV9OQU1FID0gIkw4UkxVVDIwMTUwMzAzXzIwNDMxMjMxdjExLmg1IgogIEVORF9HUk9VUCA9IFBST0RVQ1RfTUVUQURBVEEKICBHUk9VUCA9IElNQUdFX0FUVFJJQlVURVMKICAgIENMT1VEX0NPVkVSID0gMjkuNTYKICAgIENMT1VEX0NPVkVSX0xBTkQgPSAzLjMzCiAgICBJTUFHRV9RVUFMSVRZX09MSSA9IDkKICAgIElNQUdFX1FVQUxJVFlfVElSUyA9IDkKICAgIFRJUlNfU1NNX01PREVMID0gIkZJTkFMIgogICAgVElSU19TU01fUE9TSVRJT05fU1RBVFVTID0gIkVTVElNQVRFRCIKICAgIFJPTExfQU5HTEUgPSAtMC4wMDEKICAgIFNVTl9BWklNVVRIID0gMTQ4LjQ4MDQ5Mzk2CiAgICBTVU5fRUxFVkFUSU9OID0gNTAuOTM3NjgzOTkKICAgIEVBUlRIX1NVTl9ESVNUQU5DRSA9IDEuMDA1Mzc1MgogICAgR1JPVU5EX0NPTlRST0xfUE9JTlRTX1ZFUlNJT04gPSA0CiAgICBHUk9VTkRfQ09OVFJPTF9QT0lOVFNfTU9ERUwgPSA1NDgKICAgIEdFT01FVFJJQ19STVNFX01PREVMID0gNS44NTcKICAgIEdFT01FVFJJQ19STVNFX01PREVMX1kgPSAzLjg0MQogICAgR0VPTUVUUklDX1JNU0VfTU9ERUxfWCA9IDQuNDIyCiAgICBHUk9VTkRfQ09OVFJPTF9QT0lOVFNfVkVSSUZZID0gMjI4CiAgICBHRU9NRVRSSUNfUk1TRV9WRVJJRlkgPSAzLjM4MgogIEVORF9HUk9VUCA9IElNQUdFX0FUVFJJQlVURVMKICBHUk9VUCA9IE1JTl9NQVhfUkFESUFOQ0UKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF8xID0gNzUxLjk1NzA5CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfMSA9IC02Mi4wOTY4NgogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzIgPSA3NzAuMDEzMTgKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF8yID0gLTYzLjU4Nzk0CiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfMyA9IDcwOS41NjA2MQogICAgUkFESUFOQ0VfTUlOSU1VTV9CQU5EXzMgPSAtNTguNTk1NzUKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF80ID0gNTk4LjM0MTQ5CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfNCA9IC00OS40MTEyMwogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzUgPSAzNjYuMTU1MTUKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF81ID0gLTMwLjIzNzIxCiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfNiA9IDkxLjA1OTQ2CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfNiA9IC03LjUxOTcyCiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfNyA9IDMwLjY5MTkxCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfNyA9IC0yLjUzNDU1CiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfOCA9IDY3Ny4xNTc4NAogICAgUkFESUFOQ0VfTUlOSU1VTV9CQU5EXzggPSAtNTUuOTE5OTIKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF85ID0gMTQzLjEwMTczCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfOSA9IC0xMS44MTczOQogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzEwID0gMjIuMDAxODAKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF8xMCA9IDAuMTAwMzMKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF8xMSA9IDIyLjAwMTgwCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfMTEgPSAwLjEwMDMzCiAgRU5EX0dST1VQID0gTUlOX01BWF9SQURJQU5DRQogIEdST1VQID0gTUlOX01BWF9SRUZMRUNUQU5DRQogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzEgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzEgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF8yID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF8yID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfMyA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfMyA9IC0wLjA5OTk4MAogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzQgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzQgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF81ID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF81ID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfNiA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfNiA9IC0wLjA5OTk4MAogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzcgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzcgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF84ID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF84ID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfOSA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfOSA9IC0wLjA5OTk4MAogIEVORF9HUk9VUCA9IE1JTl9NQVhfUkVGTEVDVEFOQ0UKICBHUk9VUCA9IE1JTl9NQVhfUElYRUxfVkFMVUUKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF8xID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF8xID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzIgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzIgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfMyA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfMyA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF80ID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF80ID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzUgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzUgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfNiA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfNiA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF83ID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF83ID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzggPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzggPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfOSA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfOSA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF8xMCA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfMTAgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfMTEgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzExID0gMQogIEVORF9HUk9VUCA9IE1JTl9NQVhfUElYRUxfVkFMVUUKICBHUk9VUCA9IFJBRElPTUVUUklDX1JFU0NBTElORwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzEgPSAxLjI0MjJFLTAyCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfMiA9IDEuMjcyMEUtMDIKICAgIFJBRElBTkNFX01VTFRfQkFORF8zID0gMS4xNzIxRS0wMgogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzQgPSA5Ljg4NDJFLTAzCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfNSA9IDYuMDQ4N0UtMDMKICAgIFJBRElBTkNFX01VTFRfQkFORF82ID0gMS41MDQyRS0wMwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzcgPSA1LjA3MDFFLTA0CiAgICBSQURJQU5DRV9NVUxUX0JBTkRfOCA9IDEuMTE4NkUtMDIKICAgIFJBRElBTkNFX01VTFRfQkFORF85ID0gMi4zNjQwRS0wMwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzEwID0gMy4zNDIwRS0wNAogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzExID0gMy4zNDIwRS0wNAogICAgUkFESUFOQ0VfQUREX0JBTkRfMSA9IC02Mi4xMDkyOAogICAgUkFESUFOQ0VfQUREX0JBTkRfMiA9IC02My42MDA2NgogICAgUkFESUFOQ0VfQUREX0JBTkRfMyA9IC01OC42MDc0NwogICAgUkFESUFOQ0VfQUREX0JBTkRfNCA9IC00OS40MjExMgogICAgUkFESUFOQ0VfQUREX0JBTkRfNSA9IC0zMC4yNDMyNgogICAgUkFESUFOQ0VfQUREX0JBTkRfNiA9IC03LjUyMTIyCiAgICBSQURJQU5DRV9BRERfQkFORF83ID0gLTIuNTM1MDUKICAgIFJBRElBTkNFX0FERF9CQU5EXzggPSAtNTUuOTMxMTAKICAgIFJBRElBTkNFX0FERF9CQU5EXzkgPSAtMTEuODE5NzUKICAgIFJBRElBTkNFX0FERF9CQU5EXzEwID0gMC4xMDAwMAogICAgUkFESUFOQ0VfQUREX0JBTkRfMTEgPSAwLjEwMDAwCiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfMSA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF8yID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzMgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfNCA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF81ID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzYgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfNyA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF84ID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzkgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF8xID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF8yID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF8zID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF80ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF81ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF82ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF83ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF84ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF85ID0gLTAuMTAwMDAwCiAgRU5EX0dST1VQID0gUkFESU9NRVRSSUNfUkVTQ0FMSU5HCiAgR1JPVVAgPSBUSVJTX1RIRVJNQUxfQ09OU1RBTlRTCiAgICBLMV9DT05TVEFOVF9CQU5EXzEwID0gNzc0Ljg4NTMKICAgIEsxX0NPTlNUQU5UX0JBTkRfMTEgPSA0ODAuODg4MwogICAgSzJfQ09OU1RBTlRfQkFORF8xMCA9IDEzMjEuMDc4OQogICAgSzJfQ09OU1RBTlRfQkFORF8xMSA9IDEyMDEuMTQ0MgogIEVORF9HUk9VUCA9IFRJUlNfVEhFUk1BTF9DT05TVEFOVFMKICBHUk9VUCA9IFBST0pFQ1RJT05fUEFSQU1FVEVSUwogICAgTUFQX1BST0pFQ1RJT04gPSAiVVRNIgogICAgREFUVU0gPSAiV0dTODQiCiAgICBFTExJUFNPSUQgPSAiV0dTODQiCiAgICBVVE1fWk9ORSA9IDEwCiAgICBHUklEX0NFTExfU0laRV9QQU5DSFJPTUFUSUMgPSAxNS4wMAogICAgR1JJRF9DRUxMX1NJWkVfUkVGTEVDVElWRSA9IDMwLjAwCiAgICBHUklEX0NFTExfU0laRV9USEVSTUFMID0gMzAuMDAKICAgIE9SSUVOVEFUSU9OID0gIk5PUlRIX1VQIgogICAgUkVTQU1QTElOR19PUFRJT04gPSAiQ1VCSUNfQ09OVk9MVVRJT04iCiAgRU5EX0dST1VQID0gUFJPSkVDVElPTl9QQVJBTUVURVJTCkVORF9HUk9VUCA9IEwxX01FVEFEQVRBX0ZJTEUKRU5ECg==\"\n      }\n    },\n    {\n      \"ID\": \"a5f818071a0f22da\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/gcp-public-data-landsat/LC08/PRE/044/034/LC80440342016259LGN00/LC80440342016259LGN00_MTL.txt\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=3600\"\n          ],\n          \"Content-Length\": [\n            \"7903\"\n          ],\n          \"Content-Type\": [\n            \"application/octet-stream\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:27 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"7a5fd4743bd647485f88496fadb05c51\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 23:25:27 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Tue, 04 Oct 2016 16:42:07 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1475599327662000\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=PWBt8g==\",\n            \"md5=el/UdDvWR0hfiElvrbBcUQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"7903\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrozB-0-kEtkjITLFZA2uQpw77J_Zc6GErrYrIyxkPTWeUHJNBRLw4JXhyIEFG8szc7bhqblQVKoKYiZ4myOcfL5zIM9KYGIbCyAP9e4sEEdx2pBe0\"\n          ]\n        },\n        \"Body\": \"R1JPVVAgPSBMMV9NRVRBREFUQV9GSUxFCiAgR1JPVVAgPSBNRVRBREFUQV9GSUxFX0lORk8KICAgIE9SSUdJTiA9ICJJbWFnZSBjb3VydGVzeSBvZiB0aGUgVS5TLiBHZW9sb2dpY2FsIFN1cnZleSIKICAgIFJFUVVFU1RfSUQgPSAiMDcwMTYwOTE5MTA1MV8wMDAwNCIKICAgIExBTkRTQVRfU0NFTkVfSUQgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwIgogICAgRklMRV9EQVRFID0gMjAxNi0wOS0yMFQwMzoxMzowMloKICAgIFNUQVRJT05fSUQgPSAiTEdOIgogICAgUFJPQ0VTU0lOR19TT0ZUV0FSRV9WRVJTSU9OID0gIkxQR1NfMi42LjIiCiAgRU5EX0dST1VQID0gTUVUQURBVEFfRklMRV9JTkZPCiAgR1JPVVAgPSBQUk9EVUNUX01FVEFEQVRBCiAgICBEQVRBX1RZUEUgPSAiTDFUIgogICAgRUxFVkFUSU9OX1NPVVJDRSA9ICJHTFMyMDAwIgogICAgT1VUUFVUX0ZPUk1BVCA9ICJHRU9USUZGIgogICAgU1BBQ0VDUkFGVF9JRCA9ICJMQU5EU0FUXzgiCiAgICBTRU5TT1JfSUQgPSAiT0xJX1RJUlMiCiAgICBXUlNfUEFUSCA9IDQ0CiAgICBXUlNfUk9XID0gMzQKICAgIE5BRElSX09GRk5BRElSID0gIk5BRElSIgogICAgVEFSR0VUX1dSU19QQVRIID0gNDQKICAgIFRBUkdFVF9XUlNfUk9XID0gMzQKICAgIERBVEVfQUNRVUlSRUQgPSAyMDE2LTA5LTE1CiAgICBTQ0VORV9DRU5URVJfVElNRSA9ICIxODo0NjoxOC42ODY3MzgwWiIKICAgIENPUk5FUl9VTF9MQVRfUFJPRFVDVCA9IDM4LjUyODE5CiAgICBDT1JORVJfVUxfTE9OX1BST0RVQ1QgPSAtMTIzLjQwODQzCiAgICBDT1JORVJfVVJfTEFUX1BST0RVQ1QgPSAzOC41MDc2NQogICAgQ09STkVSX1VSX0xPTl9QUk9EVUNUID0gLTEyMC43NjkzMwogICAgQ09STkVSX0xMX0xBVF9QUk9EVUNUID0gMzYuNDE2MzMKICAgIENPUk5FUl9MTF9MT05fUFJPRFVDVCA9IC0xMjMuMzk3MDkKICAgIENPUk5FUl9MUl9MQVRfUFJPRFVDVCA9IDM2LjM5NzI5CiAgICBDT1JORVJfTFJfTE9OX1BST0RVQ1QgPSAtMTIwLjgzMTE3CiAgICBDT1JORVJfVUxfUFJPSkVDVElPTl9YX1BST0RVQ1QgPSA0NjQ0MDAuMDAwCiAgICBDT1JORVJfVUxfUFJPSkVDVElPTl9ZX1BST0RVQ1QgPSA0MjY0NTAwLjAwMAogICAgQ09STkVSX1VSX1BST0pFQ1RJT05fWF9QUk9EVUNUID0gNjk0NTAwLjAwMAogICAgQ09STkVSX1VSX1BST0pFQ1RJT05fWV9QUk9EVUNUID0gNDI2NDUwMC4wMDAKICAgIENPUk5FUl9MTF9QUk9KRUNUSU9OX1hfUFJPRFVDVCA9IDQ2NDQwMC4wMDAKICAgIENPUk5FUl9MTF9QUk9KRUNUSU9OX1lfUFJPRFVDVCA9IDQwMzAyMDAuMDAwCiAgICBDT1JORVJfTFJfUFJPSkVDVElPTl9YX1BST0RVQ1QgPSA2OTQ1MDAuMDAwCiAgICBDT1JORVJfTFJfUFJPSkVDVElPTl9ZX1BST0RVQ1QgPSA0MDMwMjAwLjAwMAogICAgUEFOQ0hST01BVElDX0xJTkVTID0gMTU2MjEKICAgIFBBTkNIUk9NQVRJQ19TQU1QTEVTID0gMTUzNDEKICAgIFJFRkxFQ1RJVkVfTElORVMgPSA3ODExCiAgICBSRUZMRUNUSVZFX1NBTVBMRVMgPSA3NjcxCiAgICBUSEVSTUFMX0xJTkVTID0gNzgxMQogICAgVEhFUk1BTF9TQU1QTEVTID0gNzY3MQogICAgRklMRV9OQU1FX0JBTkRfMSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjEuVElGIgogICAgRklMRV9OQU1FX0JBTkRfMiA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjIuVElGIgogICAgRklMRV9OQU1FX0JBTkRfMyA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjMuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNCA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjQuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjUuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNiA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjYuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNyA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjcuVElGIgogICAgRklMRV9OQU1FX0JBTkRfOCA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjguVElGIgogICAgRklMRV9OQU1FX0JBTkRfOSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjkuVElGIgogICAgRklMRV9OQU1FX0JBTkRfMTAgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxMC5USUYiCiAgICBGSUxFX05BTUVfQkFORF8xMSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjExLlRJRiIKICAgIEZJTEVfTkFNRV9CQU5EX1FVQUxJVFkgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0JRQS5USUYiCiAgICBNRVRBREFUQV9GSUxFX05BTUUgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX01UTC50eHQiCiAgICBCUEZfTkFNRV9PTEkgPSAiTE84QlBGMjAxNjA5MTUxODMwNTdfMjAxNjA5MTUyMDA5NTAuMDEiCiAgICBCUEZfTkFNRV9USVJTID0gIkxUOEJQRjIwMTYwOTAyMDg0MTIyXzIwMTYwOTE3MDc0MDI3LjAyIgogICAgQ1BGX05BTUUgPSAiTDhDUEYyMDE2MDcwMV8yMDE2MDkzMC4wMiIKICAgIFJMVVRfRklMRV9OQU1FID0gIkw4UkxVVDIwMTUwMzAzXzIwNDMxMjMxdjExLmg1IgogIEVORF9HUk9VUCA9IFBST0RVQ1RfTUVUQURBVEEKICBHUk9VUCA9IElNQUdFX0FUVFJJQlVURVMKICAgIENMT1VEX0NPVkVSID0gMjkuNTYKICAgIENMT1VEX0NPVkVSX0xBTkQgPSAzLjMzCiAgICBJTUFHRV9RVUFMSVRZX09MSSA9IDkKICAgIElNQUdFX1FVQUxJVFlfVElSUyA9IDkKICAgIFRJUlNfU1NNX01PREVMID0gIkZJTkFMIgogICAgVElSU19TU01fUE9TSVRJT05fU1RBVFVTID0gIkVTVElNQVRFRCIKICAgIFJPTExfQU5HTEUgPSAtMC4wMDEKICAgIFNVTl9BWklNVVRIID0gMTQ4LjQ4MDQ5Mzk2CiAgICBTVU5fRUxFVkFUSU9OID0gNTAuOTM3NjgzOTkKICAgIEVBUlRIX1NVTl9ESVNUQU5DRSA9IDEuMDA1Mzc1MgogICAgR1JPVU5EX0NPTlRST0xfUE9JTlRTX1ZFUlNJT04gPSA0CiAgICBHUk9VTkRfQ09OVFJPTF9QT0lOVFNfTU9ERUwgPSA1NDgKICAgIEdFT01FVFJJQ19STVNFX01PREVMID0gNS44NTcKICAgIEdFT01FVFJJQ19STVNFX01PREVMX1kgPSAzLjg0MQogICAgR0VPTUVUUklDX1JNU0VfTU9ERUxfWCA9IDQuNDIyCiAgICBHUk9VTkRfQ09OVFJPTF9QT0lOVFNfVkVSSUZZID0gMjI4CiAgICBHRU9NRVRSSUNfUk1TRV9WRVJJRlkgPSAzLjM4MgogIEVORF9HUk9VUCA9IElNQUdFX0FUVFJJQlVURVMKICBHUk9VUCA9IE1JTl9NQVhfUkFESUFOQ0UKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF8xID0gNzUxLjk1NzA5CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfMSA9IC02Mi4wOTY4NgogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzIgPSA3NzAuMDEzMTgKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF8yID0gLTYzLjU4Nzk0CiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfMyA9IDcwOS41NjA2MQogICAgUkFESUFOQ0VfTUlOSU1VTV9CQU5EXzMgPSAtNTguNTk1NzUKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF80ID0gNTk4LjM0MTQ5CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfNCA9IC00OS40MTEyMwogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzUgPSAzNjYuMTU1MTUKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF81ID0gLTMwLjIzNzIxCiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfNiA9IDkxLjA1OTQ2CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfNiA9IC03LjUxOTcyCiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfNyA9IDMwLjY5MTkxCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfNyA9IC0yLjUzNDU1CiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfOCA9IDY3Ny4xNTc4NAogICAgUkFESUFOQ0VfTUlOSU1VTV9CQU5EXzggPSAtNTUuOTE5OTIKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF85ID0gMTQzLjEwMTczCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfOSA9IC0xMS44MTczOQogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzEwID0gMjIuMDAxODAKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF8xMCA9IDAuMTAwMzMKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF8xMSA9IDIyLjAwMTgwCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfMTEgPSAwLjEwMDMzCiAgRU5EX0dST1VQID0gTUlOX01BWF9SQURJQU5DRQogIEdST1VQID0gTUlOX01BWF9SRUZMRUNUQU5DRQogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzEgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzEgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF8yID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF8yID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfMyA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfMyA9IC0wLjA5OTk4MAogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzQgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzQgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF81ID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF81ID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfNiA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfNiA9IC0wLjA5OTk4MAogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzcgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzcgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF84ID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF84ID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfOSA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfOSA9IC0wLjA5OTk4MAogIEVORF9HUk9VUCA9IE1JTl9NQVhfUkVGTEVDVEFOQ0UKICBHUk9VUCA9IE1JTl9NQVhfUElYRUxfVkFMVUUKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF8xID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF8xID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzIgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzIgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfMyA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfMyA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF80ID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF80ID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzUgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzUgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfNiA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfNiA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF83ID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF83ID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzggPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzggPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfOSA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfOSA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF8xMCA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfMTAgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfMTEgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzExID0gMQogIEVORF9HUk9VUCA9IE1JTl9NQVhfUElYRUxfVkFMVUUKICBHUk9VUCA9IFJBRElPTUVUUklDX1JFU0NBTElORwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzEgPSAxLjI0MjJFLTAyCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfMiA9IDEuMjcyMEUtMDIKICAgIFJBRElBTkNFX01VTFRfQkFORF8zID0gMS4xNzIxRS0wMgogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzQgPSA5Ljg4NDJFLTAzCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfNSA9IDYuMDQ4N0UtMDMKICAgIFJBRElBTkNFX01VTFRfQkFORF82ID0gMS41MDQyRS0wMwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzcgPSA1LjA3MDFFLTA0CiAgICBSQURJQU5DRV9NVUxUX0JBTkRfOCA9IDEuMTE4NkUtMDIKICAgIFJBRElBTkNFX01VTFRfQkFORF85ID0gMi4zNjQwRS0wMwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzEwID0gMy4zNDIwRS0wNAogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzExID0gMy4zNDIwRS0wNAogICAgUkFESUFOQ0VfQUREX0JBTkRfMSA9IC02Mi4xMDkyOAogICAgUkFESUFOQ0VfQUREX0JBTkRfMiA9IC02My42MDA2NgogICAgUkFESUFOQ0VfQUREX0JBTkRfMyA9IC01OC42MDc0NwogICAgUkFESUFOQ0VfQUREX0JBTkRfNCA9IC00OS40MjExMgogICAgUkFESUFOQ0VfQUREX0JBTkRfNSA9IC0zMC4yNDMyNgogICAgUkFESUFOQ0VfQUREX0JBTkRfNiA9IC03LjUyMTIyCiAgICBSQURJQU5DRV9BRERfQkFORF83ID0gLTIuNTM1MDUKICAgIFJBRElBTkNFX0FERF9CQU5EXzggPSAtNTUuOTMxMTAKICAgIFJBRElBTkNFX0FERF9CQU5EXzkgPSAtMTEuODE5NzUKICAgIFJBRElBTkNFX0FERF9CQU5EXzEwID0gMC4xMDAwMAogICAgUkFESUFOQ0VfQUREX0JBTkRfMTEgPSAwLjEwMDAwCiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfMSA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF8yID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzMgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfNCA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF81ID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzYgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfNyA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF84ID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzkgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF8xID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF8yID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF8zID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF80ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF81ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF82ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF83ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF84ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF85ID0gLTAuMTAwMDAwCiAgRU5EX0dST1VQID0gUkFESU9NRVRSSUNfUkVTQ0FMSU5HCiAgR1JPVVAgPSBUSVJTX1RIRVJNQUxfQ09OU1RBTlRTCiAgICBLMV9DT05TVEFOVF9CQU5EXzEwID0gNzc0Ljg4NTMKICAgIEsxX0NPTlNUQU5UX0JBTkRfMTEgPSA0ODAuODg4MwogICAgSzJfQ09OU1RBTlRfQkFORF8xMCA9IDEzMjEuMDc4OQogICAgSzJfQ09OU1RBTlRfQkFORF8xMSA9IDEyMDEuMTQ0MgogIEVORF9HUk9VUCA9IFRJUlNfVEhFUk1BTF9DT05TVEFOVFMKICBHUk9VUCA9IFBST0pFQ1RJT05fUEFSQU1FVEVSUwogICAgTUFQX1BST0pFQ1RJT04gPSAiVVRNIgogICAgREFUVU0gPSAiV0dTODQiCiAgICBFTExJUFNPSUQgPSAiV0dTODQiCiAgICBVVE1fWk9ORSA9IDEwCiAgICBHUklEX0NFTExfU0laRV9QQU5DSFJPTUFUSUMgPSAxNS4wMAogICAgR1JJRF9DRUxMX1NJWkVfUkVGTEVDVElWRSA9IDMwLjAwCiAgICBHUklEX0NFTExfU0laRV9USEVSTUFMID0gMzAuMDAKICAgIE9SSUVOVEFUSU9OID0gIk5PUlRIX1VQIgogICAgUkVTQU1QTElOR19PUFRJT04gPSAiQ1VCSUNfQ09OVk9MVVRJT04iCiAgRU5EX0dST1VQID0gUFJPSkVDVElPTl9QQVJBTUVURVJTCkVORF9HUk9VUCA9IEwxX01FVEFEQVRBX0ZJTEUKRU5ECg==\"\n      }\n    },\n    {\n      \"ID\": \"55eeb942e5603431\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/gcp-public-data-landsat/LC08/PRE/044/034/LC80440342016259LGN00/LC80440342016259LGN00_MTL.txt\",\n        \"Header\": {\n          \"Range\": [\n            \"bytes=1-\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 206,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=3600\"\n          ],\n          \"Content-Length\": [\n            \"7902\"\n          ],\n          \"Content-Range\": [\n            \"bytes 1-7902/7903\"\n          ],\n          \"Content-Type\": [\n            \"application/octet-stream\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:27 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"7a5fd4743bd647485f88496fadb05c51\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 23:25:27 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Tue, 04 Oct 2016 16:42:07 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1475599327662000\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=PWBt8g==\",\n            \"md5=el/UdDvWR0hfiElvrbBcUQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"7903\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqlAytrsQn43Os8JxSOx4C8v9ApqqtqwEE7kZ-voKAcmcYe32lG7ANHxzNrwkqN8bbLLohoAHd88brZDVaC3U6Q01dhBBoeDFnlkCzHKUJjA8ZWrgM\"\n          ]\n        },\n        \"Body\": \"Uk9VUCA9IEwxX01FVEFEQVRBX0ZJTEUKICBHUk9VUCA9IE1FVEFEQVRBX0ZJTEVfSU5GTwogICAgT1JJR0lOID0gIkltYWdlIGNvdXJ0ZXN5IG9mIHRoZSBVLlMuIEdlb2xvZ2ljYWwgU3VydmV5IgogICAgUkVRVUVTVF9JRCA9ICIwNzAxNjA5MTkxMDUxXzAwMDA0IgogICAgTEFORFNBVF9TQ0VORV9JRCA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDAiCiAgICBGSUxFX0RBVEUgPSAyMDE2LTA5LTIwVDAzOjEzOjAyWgogICAgU1RBVElPTl9JRCA9ICJMR04iCiAgICBQUk9DRVNTSU5HX1NPRlRXQVJFX1ZFUlNJT04gPSAiTFBHU18yLjYuMiIKICBFTkRfR1JPVVAgPSBNRVRBREFUQV9GSUxFX0lORk8KICBHUk9VUCA9IFBST0RVQ1RfTUVUQURBVEEKICAgIERBVEFfVFlQRSA9ICJMMVQiCiAgICBFTEVWQVRJT05fU09VUkNFID0gIkdMUzIwMDAiCiAgICBPVVRQVVRfRk9STUFUID0gIkdFT1RJRkYiCiAgICBTUEFDRUNSQUZUX0lEID0gIkxBTkRTQVRfOCIKICAgIFNFTlNPUl9JRCA9ICJPTElfVElSUyIKICAgIFdSU19QQVRIID0gNDQKICAgIFdSU19ST1cgPSAzNAogICAgTkFESVJfT0ZGTkFESVIgPSAiTkFESVIiCiAgICBUQVJHRVRfV1JTX1BBVEggPSA0NAogICAgVEFSR0VUX1dSU19ST1cgPSAzNAogICAgREFURV9BQ1FVSVJFRCA9IDIwMTYtMDktMTUKICAgIFNDRU5FX0NFTlRFUl9USU1FID0gIjE4OjQ2OjE4LjY4NjczODBaIgogICAgQ09STkVSX1VMX0xBVF9QUk9EVUNUID0gMzguNTI4MTkKICAgIENPUk5FUl9VTF9MT05fUFJPRFVDVCA9IC0xMjMuNDA4NDMKICAgIENPUk5FUl9VUl9MQVRfUFJPRFVDVCA9IDM4LjUwNzY1CiAgICBDT1JORVJfVVJfTE9OX1BST0RVQ1QgPSAtMTIwLjc2OTMzCiAgICBDT1JORVJfTExfTEFUX1BST0RVQ1QgPSAzNi40MTYzMwogICAgQ09STkVSX0xMX0xPTl9QUk9EVUNUID0gLTEyMy4zOTcwOQogICAgQ09STkVSX0xSX0xBVF9QUk9EVUNUID0gMzYuMzk3MjkKICAgIENPUk5FUl9MUl9MT05fUFJPRFVDVCA9IC0xMjAuODMxMTcKICAgIENPUk5FUl9VTF9QUk9KRUNUSU9OX1hfUFJPRFVDVCA9IDQ2NDQwMC4wMDAKICAgIENPUk5FUl9VTF9QUk9KRUNUSU9OX1lfUFJPRFVDVCA9IDQyNjQ1MDAuMDAwCiAgICBDT1JORVJfVVJfUFJPSkVDVElPTl9YX1BST0RVQ1QgPSA2OTQ1MDAuMDAwCiAgICBDT1JORVJfVVJfUFJPSkVDVElPTl9ZX1BST0RVQ1QgPSA0MjY0NTAwLjAwMAogICAgQ09STkVSX0xMX1BST0pFQ1RJT05fWF9QUk9EVUNUID0gNDY0NDAwLjAwMAogICAgQ09STkVSX0xMX1BST0pFQ1RJT05fWV9QUk9EVUNUID0gNDAzMDIwMC4wMDAKICAgIENPUk5FUl9MUl9QUk9KRUNUSU9OX1hfUFJPRFVDVCA9IDY5NDUwMC4wMDAKICAgIENPUk5FUl9MUl9QUk9KRUNUSU9OX1lfUFJPRFVDVCA9IDQwMzAyMDAuMDAwCiAgICBQQU5DSFJPTUFUSUNfTElORVMgPSAxNTYyMQogICAgUEFOQ0hST01BVElDX1NBTVBMRVMgPSAxNTM0MQogICAgUkVGTEVDVElWRV9MSU5FUyA9IDc4MTEKICAgIFJFRkxFQ1RJVkVfU0FNUExFUyA9IDc2NzEKICAgIFRIRVJNQUxfTElORVMgPSA3ODExCiAgICBUSEVSTUFMX1NBTVBMRVMgPSA3NjcxCiAgICBGSUxFX05BTUVfQkFORF8xID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9CMS5USUYiCiAgICBGSUxFX05BTUVfQkFORF8yID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9CMi5USUYiCiAgICBGSUxFX05BTUVfQkFORF8zID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9CMy5USUYiCiAgICBGSUxFX05BTUVfQkFORF80ID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9CNC5USUYiCiAgICBGSUxFX05BTUVfQkFORF81ID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9CNS5USUYiCiAgICBGSUxFX05BTUVfQkFORF82ID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9CNi5USUYiCiAgICBGSUxFX05BTUVfQkFORF83ID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9CNy5USUYiCiAgICBGSUxFX05BTUVfQkFORF84ID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9COC5USUYiCiAgICBGSUxFX05BTUVfQkFORF85ID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9COS5USUYiCiAgICBGSUxFX05BTUVfQkFORF8xMCA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjEwLlRJRiIKICAgIEZJTEVfTkFNRV9CQU5EXzExID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9CMTEuVElGIgogICAgRklMRV9OQU1FX0JBTkRfUVVBTElUWSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQlFBLlRJRiIKICAgIE1FVEFEQVRBX0ZJTEVfTkFNRSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfTVRMLnR4dCIKICAgIEJQRl9OQU1FX09MSSA9ICJMTzhCUEYyMDE2MDkxNTE4MzA1N18yMDE2MDkxNTIwMDk1MC4wMSIKICAgIEJQRl9OQU1FX1RJUlMgPSAiTFQ4QlBGMjAxNjA5MDIwODQxMjJfMjAxNjA5MTcwNzQwMjcuMDIiCiAgICBDUEZfTkFNRSA9ICJMOENQRjIwMTYwNzAxXzIwMTYwOTMwLjAyIgogICAgUkxVVF9GSUxFX05BTUUgPSAiTDhSTFVUMjAxNTAzMDNfMjA0MzEyMzF2MTEuaDUiCiAgRU5EX0dST1VQID0gUFJPRFVDVF9NRVRBREFUQQogIEdST1VQID0gSU1BR0VfQVRUUklCVVRFUwogICAgQ0xPVURfQ09WRVIgPSAyOS41NgogICAgQ0xPVURfQ09WRVJfTEFORCA9IDMuMzMKICAgIElNQUdFX1FVQUxJVFlfT0xJID0gOQogICAgSU1BR0VfUVVBTElUWV9USVJTID0gOQogICAgVElSU19TU01fTU9ERUwgPSAiRklOQUwiCiAgICBUSVJTX1NTTV9QT1NJVElPTl9TVEFUVVMgPSAiRVNUSU1BVEVEIgogICAgUk9MTF9BTkdMRSA9IC0wLjAwMQogICAgU1VOX0FaSU1VVEggPSAxNDguNDgwNDkzOTYKICAgIFNVTl9FTEVWQVRJT04gPSA1MC45Mzc2ODM5OQogICAgRUFSVEhfU1VOX0RJU1RBTkNFID0gMS4wMDUzNzUyCiAgICBHUk9VTkRfQ09OVFJPTF9QT0lOVFNfVkVSU0lPTiA9IDQKICAgIEdST1VORF9DT05UUk9MX1BPSU5UU19NT0RFTCA9IDU0OAogICAgR0VPTUVUUklDX1JNU0VfTU9ERUwgPSA1Ljg1NwogICAgR0VPTUVUUklDX1JNU0VfTU9ERUxfWSA9IDMuODQxCiAgICBHRU9NRVRSSUNfUk1TRV9NT0RFTF9YID0gNC40MjIKICAgIEdST1VORF9DT05UUk9MX1BPSU5UU19WRVJJRlkgPSAyMjgKICAgIEdFT01FVFJJQ19STVNFX1ZFUklGWSA9IDMuMzgyCiAgRU5EX0dST1VQID0gSU1BR0VfQVRUUklCVVRFUwogIEdST1VQID0gTUlOX01BWF9SQURJQU5DRQogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzEgPSA3NTEuOTU3MDkKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF8xID0gLTYyLjA5Njg2CiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfMiA9IDc3MC4wMTMxOAogICAgUkFESUFOQ0VfTUlOSU1VTV9CQU5EXzIgPSAtNjMuNTg3OTQKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF8zID0gNzA5LjU2MDYxCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfMyA9IC01OC41OTU3NQogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzQgPSA1OTguMzQxNDkKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF80ID0gLTQ5LjQxMTIzCiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfNSA9IDM2Ni4xNTUxNQogICAgUkFESUFOQ0VfTUlOSU1VTV9CQU5EXzUgPSAtMzAuMjM3MjEKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF82ID0gOTEuMDU5NDYKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF82ID0gLTcuNTE5NzIKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF83ID0gMzAuNjkxOTEKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF83ID0gLTIuNTM0NTUKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF84ID0gNjc3LjE1Nzg0CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfOCA9IC01NS45MTk5MgogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzkgPSAxNDMuMTAxNzMKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF85ID0gLTExLjgxNzM5CiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfMTAgPSAyMi4wMDE4MAogICAgUkFESUFOQ0VfTUlOSU1VTV9CQU5EXzEwID0gMC4xMDAzMwogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzExID0gMjIuMDAxODAKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF8xMSA9IDAuMTAwMzMKICBFTkRfR1JPVVAgPSBNSU5fTUFYX1JBRElBTkNFCiAgR1JPVVAgPSBNSU5fTUFYX1JFRkxFQ1RBTkNFCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfMSA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfMSA9IC0wLjA5OTk4MAogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzIgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzIgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF8zID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF8zID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfNCA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfNCA9IC0wLjA5OTk4MAogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzUgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzUgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF82ID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF82ID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfNyA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfNyA9IC0wLjA5OTk4MAogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzggPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzggPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF85ID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF85ID0gLTAuMDk5OTgwCiAgRU5EX0dST1VQID0gTUlOX01BWF9SRUZMRUNUQU5DRQogIEdST1VQID0gTUlOX01BWF9QSVhFTF9WQUxVRQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzEgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzEgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfMiA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfMiA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF8zID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF8zID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzQgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzQgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfNSA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfNSA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF82ID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF82ID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzcgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzcgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfOCA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfOCA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF85ID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF85ID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzEwID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF8xMCA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF8xMSA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfMTEgPSAxCiAgRU5EX0dST1VQID0gTUlOX01BWF9QSVhFTF9WQUxVRQogIEdST1VQID0gUkFESU9NRVRSSUNfUkVTQ0FMSU5HCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfMSA9IDEuMjQyMkUtMDIKICAgIFJBRElBTkNFX01VTFRfQkFORF8yID0gMS4yNzIwRS0wMgogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzMgPSAxLjE3MjFFLTAyCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfNCA9IDkuODg0MkUtMDMKICAgIFJBRElBTkNFX01VTFRfQkFORF81ID0gNi4wNDg3RS0wMwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzYgPSAxLjUwNDJFLTAzCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfNyA9IDUuMDcwMUUtMDQKICAgIFJBRElBTkNFX01VTFRfQkFORF84ID0gMS4xMTg2RS0wMgogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzkgPSAyLjM2NDBFLTAzCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfMTAgPSAzLjM0MjBFLTA0CiAgICBSQURJQU5DRV9NVUxUX0JBTkRfMTEgPSAzLjM0MjBFLTA0CiAgICBSQURJQU5DRV9BRERfQkFORF8xID0gLTYyLjEwOTI4CiAgICBSQURJQU5DRV9BRERfQkFORF8yID0gLTYzLjYwMDY2CiAgICBSQURJQU5DRV9BRERfQkFORF8zID0gLTU4LjYwNzQ3CiAgICBSQURJQU5DRV9BRERfQkFORF80ID0gLTQ5LjQyMTEyCiAgICBSQURJQU5DRV9BRERfQkFORF81ID0gLTMwLjI0MzI2CiAgICBSQURJQU5DRV9BRERfQkFORF82ID0gLTcuNTIxMjIKICAgIFJBRElBTkNFX0FERF9CQU5EXzcgPSAtMi41MzUwNQogICAgUkFESUFOQ0VfQUREX0JBTkRfOCA9IC01NS45MzExMAogICAgUkFESUFOQ0VfQUREX0JBTkRfOSA9IC0xMS44MTk3NQogICAgUkFESUFOQ0VfQUREX0JBTkRfMTAgPSAwLjEwMDAwCiAgICBSQURJQU5DRV9BRERfQkFORF8xMSA9IDAuMTAwMDAKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF8xID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzIgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfMyA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF80ID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzUgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfNiA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF83ID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzggPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfOSA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX0FERF9CQU5EXzEgPSAtMC4xMDAwMDAKICAgIFJFRkxFQ1RBTkNFX0FERF9CQU5EXzIgPSAtMC4xMDAwMDAKICAgIFJFRkxFQ1RBTkNFX0FERF9CQU5EXzMgPSAtMC4xMDAwMDAKICAgIFJFRkxFQ1RBTkNFX0FERF9CQU5EXzQgPSAtMC4xMDAwMDAKICAgIFJFRkxFQ1RBTkNFX0FERF9CQU5EXzUgPSAtMC4xMDAwMDAKICAgIFJFRkxFQ1RBTkNFX0FERF9CQU5EXzYgPSAtMC4xMDAwMDAKICAgIFJFRkxFQ1RBTkNFX0FERF9CQU5EXzcgPSAtMC4xMDAwMDAKICAgIFJFRkxFQ1RBTkNFX0FERF9CQU5EXzggPSAtMC4xMDAwMDAKICAgIFJFRkxFQ1RBTkNFX0FERF9CQU5EXzkgPSAtMC4xMDAwMDAKICBFTkRfR1JPVVAgPSBSQURJT01FVFJJQ19SRVNDQUxJTkcKICBHUk9VUCA9IFRJUlNfVEhFUk1BTF9DT05TVEFOVFMKICAgIEsxX0NPTlNUQU5UX0JBTkRfMTAgPSA3NzQuODg1MwogICAgSzFfQ09OU1RBTlRfQkFORF8xMSA9IDQ4MC44ODgzCiAgICBLMl9DT05TVEFOVF9CQU5EXzEwID0gMTMyMS4wNzg5CiAgICBLMl9DT05TVEFOVF9CQU5EXzExID0gMTIwMS4xNDQyCiAgRU5EX0dST1VQID0gVElSU19USEVSTUFMX0NPTlNUQU5UUwogIEdST1VQID0gUFJPSkVDVElPTl9QQVJBTUVURVJTCiAgICBNQVBfUFJPSkVDVElPTiA9ICJVVE0iCiAgICBEQVRVTSA9ICJXR1M4NCIKICAgIEVMTElQU09JRCA9ICJXR1M4NCIKICAgIFVUTV9aT05FID0gMTAKICAgIEdSSURfQ0VMTF9TSVpFX1BBTkNIUk9NQVRJQyA9IDE1LjAwCiAgICBHUklEX0NFTExfU0laRV9SRUZMRUNUSVZFID0gMzAuMDAKICAgIEdSSURfQ0VMTF9TSVpFX1RIRVJNQUwgPSAzMC4wMAogICAgT1JJRU5UQVRJT04gPSAiTk9SVEhfVVAiCiAgICBSRVNBTVBMSU5HX09QVElPTiA9ICJDVUJJQ19DT05WT0xVVElPTiIKICBFTkRfR1JPVVAgPSBQUk9KRUNUSU9OX1BBUkFNRVRFUlMKRU5EX0dST1VQID0gTDFfTUVUQURBVEFfRklMRQpFTkQK\"\n      }\n    },\n    {\n      \"ID\": \"320dc27adc377057\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/gcp-public-data-landsat/LC08/PRE/044/034/LC80440342016259LGN00/LC80440342016259LGN00_MTL.txt\",\n        \"Header\": {\n          \"Range\": [\n            \"bytes=0-17\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 206,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=3600\"\n          ],\n          \"Content-Length\": [\n            \"18\"\n          ],\n          \"Content-Range\": [\n            \"bytes 0-17/7903\"\n          ],\n          \"Content-Type\": [\n            \"application/octet-stream\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:27 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"7a5fd4743bd647485f88496fadb05c51\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 23:25:27 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Tue, 04 Oct 2016 16:42:07 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1475599327662000\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=PWBt8g==\",\n            \"md5=el/UdDvWR0hfiElvrbBcUQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"7903\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UovperPufphUvaf55r54Wd-USAbL2ZQVTseICyulStqI633iJcFBLryyqecsHQcoU2cXp4MsKgB8uQu979IXcnv-aGNm6viDydIrqmPqA7SmPElPGI\"\n          ]\n        },\n        \"Body\": \"R1JPVVAgPSBMMV9NRVRBREFU\"\n      }\n    },\n    {\n      \"ID\": \"a20a4e3b35dfd271\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/storage-library-test-bucket/gzipped-text.txt\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=3600\"\n          ],\n          \"Content-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:27 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"c6117833aa4d1510d09ef69144d56790\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 23:25:27 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Tue, 14 Nov 2017 13:07:32 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Accept-Encoding\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1510664852486988\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=T1s5RQ==\",\n            \"md5=xhF4M6pNFRDQnvaRRNVnkA==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"2\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"MULTI_REGIONAL\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"gzip\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"31\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uq7491k1eCc7fe_JApsP1zDcSyo759KmHvh-9YHm9ekpOGaG8v1bZNPjaMEkikJSDYt_LkVMHrb9HTDx9vvDGy3Zm1kPrlxS4933Sw-Wdh35lDomi4\"\n          ]\n        },\n        \"Body\": \"H4sIAAAAAAAAC8tIzcnJVyjPL8pJAQCFEUoNCwAAAA==\"\n      }\n    },\n    {\n      \"ID\": \"d1941f2e08f3bc52\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/storage-library-test-bucket/gzipped-text.txt\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=3600\"\n          ],\n          \"Content-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:27 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"c6117833aa4d1510d09ef69144d56790\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 23:25:27 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Tue, 14 Nov 2017 13:07:32 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Accept-Encoding\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1510664852486988\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=T1s5RQ==\",\n            \"md5=xhF4M6pNFRDQnvaRRNVnkA==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"2\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"MULTI_REGIONAL\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"gzip\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"31\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoYIJ-m0VbRdjw7ZGI_0TiIfj6fcuhJkomWPdQGApFxH2_LnekHIdv7igEpJAM3a-zrTOzR20bzvc-JBunTe_-f_Hsyxz_VPxJNrQY7PSrQ3OMfEhQ\"\n          ]\n        },\n        \"Body\": \"H4sIAAAAAAAAC8tIzcnJVyjPL8pJAQCFEUoNCwAAAA==\"\n      }\n    },\n    {\n      \"ID\": \"2451a87df39e1241\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/storage-library-test-bucket/gzipped-text.txt\",\n        \"Header\": {\n          \"Range\": [\n            \"bytes=1-8\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=3600\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:27 GMT\"\n          ],\n          \"Etag\": [\n            \"W/\\\"c6117833aa4d1510d09ef69144d56790\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 23:25:27 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Tue, 14 Nov 2017 13:07:32 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Accept-Encoding\"\n          ],\n          \"Warning\": [\n            \"214 UploadServer gunzipped\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1510664852486988\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=T1s5RQ==\",\n            \"md5=xhF4M6pNFRDQnvaRRNVnkA==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"2\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"MULTI_REGIONAL\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"gzip\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"31\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Response-Body-Transformations\": [\n            \"gunzipped\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoNfvi75DBdUL5KpenQbqbsYr5A8YSQp2lGAPIhe4FlijJP95WctTUrdrLIyq3riprP50HzntCuw7zh5ycZfqbJBkFbibeIwEp5bVDj7yVpJbqctiI\"\n          ]\n        },\n        \"Body\": \"aGVsbG8gd29ybGQ=\"\n      }\n    },\n    {\n      \"ID\": \"f0e47a86731e8924\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/storage-library-test-bucket/gzipped-text.txt\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Range\": [\n            \"bytes=1-8\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 206,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=3600\"\n          ],\n          \"Content-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Range\": [\n            \"bytes 1-8/31\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:27 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"c6117833aa4d1510d09ef69144d56790\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 23:25:27 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Tue, 14 Nov 2017 13:07:32 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Accept-Encoding\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1510664852486988\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=T1s5RQ==\",\n            \"md5=xhF4M6pNFRDQnvaRRNVnkA==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"2\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"MULTI_REGIONAL\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"gzip\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"31\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Upzmwe6UNntf6SxdYLZTz0aZiFJ7UANU6y7I2YKJbADGSVoCRe63OoxcC4uh-9n2JEnkvQgq0dwCHCbQ3qmYG4cWFEovG_fIMKFx6O11iPQUhLmeFw\"\n          ]\n        },\n        \"Body\": \"iwgAAAAAAAA=\"\n      }\n    },\n    {\n      \"ID\": \"2a14c414736e344d\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"168\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJjb3JzIjpbeyJtYXhBZ2VTZWNvbmRzIjozNjAwLCJtZXRob2QiOlsiUE9TVCJdLCJvcmlnaW4iOlsic29tZS1vcmlnaW4uY29tIl0sInJlc3BvbnNlSGVhZGVyIjpbImZvby1iYXIiXX1dLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA0In0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"593\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:28 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrgiftU7BDllYqI1jhKj6RbZME3LoakRb653ThaSSD_kzX1O5odabBcDFfG-oswR6YOcDZTW174qxbUaa2G1EvajUt_wJAD3ViGgoMwT_YjoTvObkc\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA0IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjI4LjAwOVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyOC4wMDlaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJjb3JzIjpbeyJvcmlnaW4iOlsic29tZS1vcmlnaW4uY29tIl0sIm1ldGhvZCI6WyJQT1NUIl0sInJlc3BvbnNlSGVhZGVyIjpbImZvby1iYXIiXSwibWF4QWdlU2Vjb25kcyI6MzYwMH1dLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"b03cb69547c1a6de\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0004?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"99\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJjb3JzIjpbeyJtYXhBZ2VTZWNvbmRzIjozNjAwLCJtZXRob2QiOlsiR0VUIl0sIm9yaWdpbiI6WyIqIl0sInJlc3BvbnNlSGVhZGVyIjpbInNvbWUtaGVhZGVyIl19XX0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2528\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:28 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Urw36CL-_RvF58GoVX1bJlTZ1YUUdWXJKQDIac7eTOYj5s65KYFsk2ndonwA5ro_9nGPfo4qRIYyt7J1Xxb01TiJUQPRXzH-z9T_S5UQE6fxOssN0g\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA0IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjI4LjAwOVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyOC43MjRaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA0L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsImNvcnMiOlt7Im9yaWdpbiI6WyIqIl0sIm1ldGhvZCI6WyJHRVQiXSwicmVzcG9uc2VIZWFkZXIiOlsic29tZS1oZWFkZXIiXSwibWF4QWdlU2Vjb25kcyI6MzYwMH1dLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0=\"\n      }\n    },\n    {\n      \"ID\": \"735da673f622341d\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0004?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2528\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:29 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:29 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Urb-FeCpjdYOEj6HdkFXRMfVXffmMB8xjLqLwPvjgs3FghXs7r94UrXEpX0rW_CgEpjG6v6iHCWCkwxib31kFkLPMZMMZxHTy66dPT2AdBDsIE8Y8k\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA0IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjI4LjAwOVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyOC43MjRaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA0L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsImNvcnMiOlt7Im9yaWdpbiI6WyIqIl0sIm1ldGhvZCI6WyJHRVQiXSwicmVzcG9uc2VIZWFkZXIiOlsic29tZS1oZWFkZXIiXSwibWF4QWdlU2Vjb25kcyI6MzYwMH1dLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0=\"\n      }\n    },\n    {\n      \"ID\": \"97ce23a7211781ed\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"168\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJjb3JzIjpbeyJtYXhBZ2VTZWNvbmRzIjozNjAwLCJtZXRob2QiOlsiUE9TVCJdLCJvcmlnaW4iOlsic29tZS1vcmlnaW4uY29tIl0sInJlc3BvbnNlSGVhZGVyIjpbImZvby1iYXIiXX1dLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA1In0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"593\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:30 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrqrjU-mu7dGgY6-CuNd9AwgGuKtQ_O589el9eyWSAb54cDYnQN74dl8HxRVzIUayStgIinEuuux2afAlvkUGm9lhrefX8nugBXNL2lGluNcfQKfRo\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA1IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjI5LjcyNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyOS43MjRaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJjb3JzIjpbeyJvcmlnaW4iOlsic29tZS1vcmlnaW4uY29tIl0sIm1ldGhvZCI6WyJQT1NUIl0sInJlc3BvbnNlSGVhZGVyIjpbImZvby1iYXIiXSwibWF4QWdlU2Vjb25kcyI6MzYwMH1dLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"a8f5b1c42d7a3c5f\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0005?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"12\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJjb3JzIjpbXX0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2431\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:30 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpZ4q-BeojZ4WgF5ZHNzJG7sIvdOxmprH5GqoQ3DM-QllSzHWOwAfhVdJZH7WmVK5Dfs1TQH-pKgneNLb_9uYM-rDFb_5Hh9vs89o4pOPT9ob9ezTE\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA1IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjI5LjcyNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozMC42MjhaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA1L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBST0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"cab9472f01ed4bd5\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0005?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2431\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:31 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:31 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uo0__TFFuzUsEi6Eck0G1lblGy_1abmyPHERWBavjN2GHncyWWnKQ6yYaFDpDVQ-kfBS15M6H9NoxXUDS0hZ9VX8S9hK4rUGAAFWXznHjOntSK5ldY\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA1IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjI5LjcyNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozMC42MjhaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA1L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBST0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"7a196e6b35872d48\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"168\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJjb3JzIjpbeyJtYXhBZ2VTZWNvbmRzIjozNjAwLCJtZXRob2QiOlsiUE9TVCJdLCJvcmlnaW4iOlsic29tZS1vcmlnaW4uY29tIl0sInJlc3BvbnNlSGVhZGVyIjpbImZvby1iYXIiXX1dLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA2In0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"593\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:31 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpJhdZl7X4YXxzKdcr7SJ3C6Xadtlo0ixoS8DNO1jaDHs5MeGKu9nx2pHWPpnUWd13HZ8inxG0pMh3un84TucDfyLu4Z-5Gp7Ka3HBfPnt_w_VTiuE\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA2IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjMxLjQwN1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozMS40MDdaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJjb3JzIjpbeyJvcmlnaW4iOlsic29tZS1vcmlnaW4uY29tIl0sIm1ldGhvZCI6WyJQT1NUIl0sInJlc3BvbnNlSGVhZGVyIjpbImZvby1iYXIiXSwibWF4QWdlU2Vjb25kcyI6MzYwMH1dLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"24b6a3b712ccab17\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0006?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"3\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"e30K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2539\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:31 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqe_Q9NPVf3WTO_It8-A42wh0FD3KyF4kopi6posCEX6l28cnowG8O7WSYwETklwvpp0Uk1fCXiVmgwqLlWCSc3ez-nYllKp5m_UVtxup1E1UNadGg\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA2IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjMxLjQwN1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozMS40MDdaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA2L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA2L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsImNvcnMiOlt7Im9yaWdpbiI6WyJzb21lLW9yaWdpbi5jb20iXSwibWV0aG9kIjpbIlBPU1QiXSwicmVzcG9uc2VIZWFkZXIiOlsiZm9vLWJhciJdLCJtYXhBZ2VTZWNvbmRzIjozNjAwfV0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"ebed90fad884e1cd\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0006?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2539\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:32 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:32 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrjLjhrtR5T2TdsRM6X3HPy_6vnZjhUfpjytCivwknDLKhiMkND-f1qeZ4te6AnGrv_qtnGI4OGajQJaydHJvQZGWpnBQN9VOXHqYjSBTCxnNbcbC4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA2IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjMxLjQwN1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozMS40MDdaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA2L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA2L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsImNvcnMiOlt7Im9yaWdpbiI6WyJzb21lLW9yaWdpbi5jb20iXSwibWV0aG9kIjpbIlBPU1QiXSwicmVzcG9uc2VIZWFkZXIiOlsiZm9vLWJhciJdLCJtYXhBZ2VTZWNvbmRzIjozNjAwfV0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"31ee7f558375c66a\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0006?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:32 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Up70C3kZ6tTqgyRHbTyjXA5pLWMohouKPHCPhexU8UuWw0cAmLxjHcwaa2xBT-Soq-CLyVxoWeEkxFMhRqqK87xaM38Q2hSjGkeXEhmhoZ3iy5s6D8\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"72458186a1839a5a\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0005?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:32 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpsiYUGF50kaeS-bMsAR51mlDVCwH9HwmqU1hCFSwzrMDgCmGF46ZuQGfqWx4SJprlBWIxaNwT_EQMKQrTQARvFyee5ZOJq21xZUsVEc1iBW0KkiVk\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"20fcdf5cb9502a64\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0004?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:33 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Up8ALydoTkq1rLUaKiwrh6YEhczTwI3VX8iKuCNoqr6N2BSBvtxD2Qc9De99Svk_4EX82rynlWctsS2F9Ffr4WuDby30_W1Fl7TMWFZGWfo5Wc_nfI\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"ace99589753f3389\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"60\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3In0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"485\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:33 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UotVHCMZG4hcbTx20gUPBV1LsUxIAVuDym9d21c2In0VVLzBxOM_DAULuLEd9LTMmpNg6A7yW4yqEsnRlHhAaMbpe7MwAWbadF2gJJ2M7uGdA-rcLQ\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjMzLjcwNVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozMy43MDVaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"466aeae01d2d2933\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0007?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2431\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:34 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:34 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoVuGt1j5ranQuT0nS5bzOIcVM5M42RwIHcF2mKK_H1ctJEqC_djWDMm00OBFXY4yxsTFdQ1ZYjWVnFq8GhUAWUsvsj4_B9Ur8MzJQcbAzG9vHgIjs\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjMzLjcwNVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozMy43MDVaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"34d8505e483be050\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0007?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"31\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJkZWZhdWx0RXZlbnRCYXNlZEhvbGQiOnRydWV9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2460\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:34 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uo5A5V7O5JcpElASqEqUZ_UiEjPa-39PCu3SwJk8EE9cHfyeVL5DWQkAss8k9iRx7YjD4ZC7WnzE_ENz95PuKdccjgzeC2GLFAUzA-sR2iEf-lNil4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjMzLjcwNVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozNC42MzJaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsImRlZmF1bHRFdmVudEJhc2VkSG9sZCI6dHJ1ZSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FJPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"728568d994e275c7\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0007?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2460\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:34 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:34 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrOVH8W8OREkTrF0UKlK3dOp_AAbRF7Rsx16Zbjdl5caBObFjXETVORm7o-d-YYcPIjcrx1mKcQwxHCIXpdE5P6baH6WeY3Wc3JVF7UcQnKna-a_U4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjMzLjcwNVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozNC42MzJaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsImRlZmF1bHRFdmVudEJhc2VkSG9sZCI6dHJ1ZSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FJPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"b7230d8a6b23fd8b\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0007?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"35\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJiaWxsaW5nIjp7InJlcXVlc3RlclBheXMiOnRydWV9fQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2493\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:35 GMT\"\n          ],\n          \"Etag\": [\n            \"CAM=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uouwpmid1Y6D0uXWBb_WrmlZVHKYnw0RGbreddchrmPzQUE1H_DeclZnbl6Yb2346L4YNt44ZeZWEM2u46h7Zx45lw9rUFxZDQIvlXRn4vT6fW4WQQ\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjMzLjcwNVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozNS4zMzNaIiwibWV0YWdlbmVyYXRpb24iOiIzIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FNPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQU09In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBTT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsImRlZmF1bHRFdmVudEJhc2VkSG9sZCI6dHJ1ZSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJiaWxsaW5nIjp7InJlcXVlc3RlclBheXMiOnRydWV9LCJldGFnIjoiQ0FNPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"ec9da9e78b750503\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0007?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2493\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:35 GMT\"\n          ],\n          \"Etag\": [\n            \"CAM=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:35 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uq25oUSnJMHsIEARHohSGtkz5vw7RCXuQupRBliEjCXMeivgUIK0y9C3U4yWEJ-_182SvGUQLvo5rXxymcoyahwAEhfe21FJU_M2IijdiWsSv83eow\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjMzLjcwNVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozNS4zMzNaIiwibWV0YWdlbmVyYXRpb24iOiIzIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FNPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQU09In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBTT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsImRlZmF1bHRFdmVudEJhc2VkSG9sZCI6dHJ1ZSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJiaWxsaW5nIjp7InJlcXVlc3RlclBheXMiOnRydWV9LCJldGFnIjoiQ0FNPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"ad49d37f07d631a5\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0007?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:36 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uq02fbr_iko_zBCbJljbMwyW7mOaz1cqR6AWHm2ac3m9BcqrUXNkmRqxk0R2rZW6SAUC_KzbOze-1wUGY2E0g6wbYLUqcb8IOdqN2-ROvYO49uxzjE\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"7b04c14c4e323488\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"60\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4In0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"485\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:36 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrJrrmhbKyKRTvA3_mNqzRsaaMOAAlvn8UMwBiOR77-6X6m5InqoXMb4qoollPzgpcFOmchQ54jFNic0xJf-tiGu0tlrzSdbjh5Hzw8Rl3RnJy_jPw\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjM2LjUwMVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozNi41MDFaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"ae3e9c648aaff158\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0008/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJuYW1lIjoic29tZS1vYmoifQo=\",\n          \"X7Xb+/Xtxt2fLTn7y+yBvw==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3193\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:37 GMT\"\n          ],\n          \"Etag\": [\n            \"CJbmhujx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrJv7oOcHCzf9atnIPo70j3xSldrZtXTb5CmV1iuM4mMPU4hiBgpDqCAdUDI3i9hlR2qRie9qT30AJNshzO5CSsuzoTQ88W255VO8VVumaCSZ0KXZs\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozNy4xMzdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MzcuMTM3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjM3LjEzN1oiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiZExyZG9WZ2p4bEFBR05hWVgxQm1idz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqP2dlbmVyYXRpb249MTU1NjgzNTkzNzEzNzQzMCZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTM3MTM3NDMwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSmJtaHVqeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvc29tZS1vYmovMTU1NjgzNTkzNzEzNzQzMC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmovYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTM3MTM3NDMwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSmJtaHVqeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Ik01ZUcvQT09IiwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"e7a12fdbeb636933\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0008/o/some-obj?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3193\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:37 GMT\"\n          ],\n          \"Etag\": [\n            \"CJbmhujx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uo-mQ6Bnw1qbAyHbMdumiv5YlTBrFQbHo-9tXn02VufGPTp3_Q8nXXp9VIcdRmzH2CJbhaVLu5fUFYZ6VKgcitBwcE-dCwxWrzaljgyT6zmM7x01ls\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozNy4xMzdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MzcuMTM3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjM3LjEzN1oiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiZExyZG9WZ2p4bEFBR05hWVgxQm1idz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqP2dlbmVyYXRpb249MTU1NjgzNTkzNzEzNzQzMCZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTM3MTM3NDMwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSmJtaHVqeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvc29tZS1vYmovMTU1NjgzNTkzNzEzNzQzMC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmovYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTM3MTM3NDMwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSmJtaHVqeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Ik01ZUcvQT09IiwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"142eb6c42bc6f90e\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0008/o/some-obj?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"84\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJldmVudEJhc2VkSG9sZCI6dHJ1ZX0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3215\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:37 GMT\"\n          ],\n          \"Etag\": [\n            \"CJbmhujx/eECEAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrBTG1gAXfMDmjm_clsDlv04E6VRtZUsUKnaVr4bC3AIRXILH2f0UebFf1_SmXPSf6Go8sw7TXti9yO112PAG5QNin3LwaSjRuFDSH_unnMZJwRceM\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozNy4xMzdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MzcuODI1WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjM3LjEzN1oiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiZExyZG9WZ2p4bEFBR05hWVgxQm1idz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqP2dlbmVyYXRpb249MTU1NjgzNTkzNzEzNzQzMCZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTM3MTM3NDMwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSmJtaHVqeC9lRUNFQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvc29tZS1vYmovMTU1NjgzNTkzNzEzNzQzMC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmovYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTM3MTM3NDMwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSmJtaHVqeC9lRUNFQUk9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Ik01ZUcvQT09IiwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBST0iLCJldmVudEJhc2VkSG9sZCI6dHJ1ZX0=\"\n      }\n    },\n    {\n      \"ID\": \"12487e4f20538041\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0008/o/some-obj?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3215\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:38 GMT\"\n          ],\n          \"Etag\": [\n            \"CJbmhujx/eECEAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqxyG_OCKjwh7TR9zL9nbOGPP1ttxni9cP68b18nTZ7wZ8WqVE0MAGh1XFphNYZEYr-2kdgNgmqQrOvFiNbg6hJi-RfjCWYg0KHPLKfzyWc-gejszc\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozNy4xMzdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MzcuODI1WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjM3LjEzN1oiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiZExyZG9WZ2p4bEFBR05hWVgxQm1idz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqP2dlbmVyYXRpb249MTU1NjgzNTkzNzEzNzQzMCZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTM3MTM3NDMwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSmJtaHVqeC9lRUNFQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvc29tZS1vYmovMTU1NjgzNTkzNzEzNzQzMC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmovYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTM3MTM3NDMwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSmJtaHVqeC9lRUNFQUk9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Ik01ZUcvQT09IiwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBST0iLCJldmVudEJhc2VkSG9sZCI6dHJ1ZX0=\"\n      }\n    },\n    {\n      \"ID\": \"e3a625bb7418cea9\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0008/o/some-obj?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"82\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJjb250ZW50VHlwZSI6ImZvbyJ9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3193\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:38 GMT\"\n          ],\n          \"Etag\": [\n            \"CJbmhujx/eECEAM=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoVf0XeyD5sC9KvHEILX2e7x7VyJ9d9xoyrP3NqGFlsMgvK3zgeOEOXDvSpftUSy4opndA74-LNRkmAi8Q_6wc91iC8OWV7X3VR8kENWwclNK30V_U\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsIm1ldGFnZW5lcmF0aW9uIjoiMyIsImNvbnRlbnRUeXBlIjoiZm9vIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjM3LjEzN1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozOC40MjBaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MzcuMTM3WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJkTHJkb1ZnanhsQUFHTmFZWDFCbWJ3PT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmo/Z2VuZXJhdGlvbj0xNTU2ODM1OTM3MTM3NDMwJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L3NvbWUtb2JqLzE1NTY4MzU5MzcxMzc0MzAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmovYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0pibWh1angvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L3NvbWUtb2JqLzE1NTY4MzU5MzcxMzc0MzAvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0pibWh1angvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L3NvbWUtb2JqLzE1NTY4MzU5MzcxMzc0MzAvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBTT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiTTVlRy9BPT0iLCJldGFnIjoiQ0pibWh1angvZUVDRUFNPSIsImV2ZW50QmFzZWRIb2xkIjp0cnVlfQ==\"\n      }\n    },\n    {\n      \"ID\": \"2290ac6bb34b705b\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0008/o/some-obj?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3193\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:38 GMT\"\n          ],\n          \"Etag\": [\n            \"CJbmhujx/eECEAM=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoKagfJuJDLVLgIcrGtlV_UXlXLSqfEFj2-knllMBWWLktTv22ZfKoeSo8lY6gSfE1LKlvn87WiyJv75QWpcWdXzvablAMBOAZ_XMe-1D8dKZ5ipHs\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsIm1ldGFnZW5lcmF0aW9uIjoiMyIsImNvbnRlbnRUeXBlIjoiZm9vIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjM3LjEzN1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozOC40MjBaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MzcuMTM3WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJkTHJkb1ZnanhsQUFHTmFZWDFCbWJ3PT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmo/Z2VuZXJhdGlvbj0xNTU2ODM1OTM3MTM3NDMwJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L3NvbWUtb2JqLzE1NTY4MzU5MzcxMzc0MzAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmovYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0pibWh1angvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L3NvbWUtb2JqLzE1NTY4MzU5MzcxMzc0MzAvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0pibWh1angvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L3NvbWUtb2JqLzE1NTY4MzU5MzcxMzc0MzAvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBTT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiTTVlRy9BPT0iLCJldGFnIjoiQ0pibWh1angvZUVDRUFNPSIsImV2ZW50QmFzZWRIb2xkIjp0cnVlfQ==\"\n      }\n    },\n    {\n      \"ID\": \"572d50dc9b5ce8a4\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0008/o/some-obj?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"85\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJldmVudEJhc2VkSG9sZCI6ZmFsc2V9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3194\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:39 GMT\"\n          ],\n          \"Etag\": [\n            \"CJbmhujx/eECEAQ=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrWVb2L8OGfosYWTjk_F-zmyNwltYI93f2tqyP4EkOx7hIRpsSG2iGDFXB7SP7DKn-teczhb9tiBKRM7rYG5vcJ5jVinideFoX44khld5BhtRaQsUc\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsIm1ldGFnZW5lcmF0aW9uIjoiNCIsImNvbnRlbnRUeXBlIjoiZm9vIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjM3LjEzN1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozOC45MTlaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MzcuMTM3WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJkTHJkb1ZnanhsQUFHTmFZWDFCbWJ3PT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmo/Z2VuZXJhdGlvbj0xNTU2ODM1OTM3MTM3NDMwJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L3NvbWUtb2JqLzE1NTY4MzU5MzcxMzc0MzAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmovYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0pibWh1angvZUVDRUFRPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L3NvbWUtb2JqLzE1NTY4MzU5MzcxMzc0MzAvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBUT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0pibWh1angvZUVDRUFRPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L3NvbWUtb2JqLzE1NTY4MzU5MzcxMzc0MzAvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBUT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiTTVlRy9BPT0iLCJldGFnIjoiQ0pibWh1angvZUVDRUFRPSIsImV2ZW50QmFzZWRIb2xkIjpmYWxzZX0=\"\n      }\n    },\n    {\n      \"ID\": \"bda340f0117c1fb4\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0008/o/some-obj?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:39 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UotG32AgmOwDD_bLLd_W64JCOZQ2-UgeY_cOZwomlkWb6Vx5JSE54tdsuCPvawuyJ8eNuCf8EM0qXlIjtAyg6QQiuN9t72vHrQLsrSs6WtJBDGZziU\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"9a0b7379af024a3a\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0008?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:39 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur7S22mcdvPtDq_Z9iUbo4v0ApOQXNFgXFNZuacd8yZUq2FhZKco01Z2T4vJSv8s1yZkGXzoUrAuUKnCBx0vZuE-MDGnmTF_YxhQoXobyvAyktswdE\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"affb380cf86f173c\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"60\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5In0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"485\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:40 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrF4q2mbuFoVeV9q22libc-FjfB1eDXSMYhNGZNU6sbaMWEKdc-8eXu1gtMLC7Ia9bSRU0oxgpIRR9516KZRcg7o_VGdrU1lliVPuSY9rYa4OsJymE\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQwLjA4MVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0MC4wODFaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"88123486ecd710ed\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0009/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJuYW1lIjoic29tZS1vYmoifQo=\",\n          \"cGCusp668ZMwY59j94Srfg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3193\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:41 GMT\"\n          ],\n          \"Etag\": [\n            \"CNC/3Onx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrixhGvSHn6UzWmshHjh8Ny2NE4LW-gcPPW4dCm9dZTDfBwtENYMJra88jZlphQFcyabnQwTegZW9_6bL8KYNOsyYQYgdtEDvFFMQeJ9B_IXQbrsgI\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0MC42MzhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NDAuNjM4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQwLjYzOFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiUjhVSExIMG84ZjFlTVhVRHRyMTZLZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqP2dlbmVyYXRpb249MTU1NjgzNTk0MDYzODY3MiZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTQwNjM4NjcyIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTkMvM09ueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvc29tZS1vYmovMTU1NjgzNTk0MDYzODY3Mi9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmovYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTQwNjM4NjcyIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTkMvM09ueC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IjB6R3NGUT09IiwiZXRhZyI6IkNOQy8zT254L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"042e51e8b073dc93\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0009/o/some-obj?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3193\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:41 GMT\"\n          ],\n          \"Etag\": [\n            \"CNC/3Onx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqTH44ERv_v2A5OmhnLVBFOkQ_bPdeDI-MNir5xjrZt1ybrczlk9GwseHZ-kt566XrMnuYGTaCkr4ImF__dpbt98CqMpmYkiJaR1vKcI1DC7o3Dbl8\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0MC42MzhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NDAuNjM4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQwLjYzOFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiUjhVSExIMG84ZjFlTVhVRHRyMTZLZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqP2dlbmVyYXRpb249MTU1NjgzNTk0MDYzODY3MiZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTQwNjM4NjcyIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTkMvM09ueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvc29tZS1vYmovMTU1NjgzNTk0MDYzODY3Mi9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmovYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTQwNjM4NjcyIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTkMvM09ueC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IjB6R3NGUT09IiwiZXRhZyI6IkNOQy8zT254L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"ed898d656784527a\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0009/o/some-obj?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"83\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJ0ZW1wb3JhcnlIb2xkIjp0cnVlfQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3214\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:41 GMT\"\n          ],\n          \"Etag\": [\n            \"CNC/3Onx/eECEAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Urh-jh9w3q8AC6TmG1NF_6JgV-Js74mV6EkB4ccrlZ1ZCQ9TlA4AhJ-J6rkqtJ9fKiy4YjT_l-TN6dQhnCwZvTUqoaJC-W-z6QQZywuQ1uX9a90PhU\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0MC42MzhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NDEuNTE5WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQwLjYzOFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiUjhVSExIMG84ZjFlTVhVRHRyMTZLZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqP2dlbmVyYXRpb249MTU1NjgzNTk0MDYzODY3MiZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTQwNjM4NjcyIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTkMvM09ueC9lRUNFQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvc29tZS1vYmovMTU1NjgzNTk0MDYzODY3Mi9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmovYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTQwNjM4NjcyIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTkMvM09ueC9lRUNFQUk9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IjB6R3NGUT09IiwiZXRhZyI6IkNOQy8zT254L2VFQ0VBST0iLCJ0ZW1wb3JhcnlIb2xkIjp0cnVlfQ==\"\n      }\n    },\n    {\n      \"ID\": \"9ddea19a0c44c449\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0009/o/some-obj?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3214\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:41 GMT\"\n          ],\n          \"Etag\": [\n            \"CNC/3Onx/eECEAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoZVnUhVRVPu1unMjxNHQzZrlqTsVtPMZHc_YPTkvy18AAD3d_TOg9qTNAEv5NXUC5n0XF1sPedifaWR19a5w7dCMltRYfuJUfGxaMzyrvpqKbGjx4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0MC42MzhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NDEuNTE5WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQwLjYzOFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiUjhVSExIMG84ZjFlTVhVRHRyMTZLZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqP2dlbmVyYXRpb249MTU1NjgzNTk0MDYzODY3MiZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTQwNjM4NjcyIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTkMvM09ueC9lRUNFQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvc29tZS1vYmovMTU1NjgzNTk0MDYzODY3Mi9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmovYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTQwNjM4NjcyIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTkMvM09ueC9lRUNFQUk9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IjB6R3NGUT09IiwiZXRhZyI6IkNOQy8zT254L2VFQ0VBST0iLCJ0ZW1wb3JhcnlIb2xkIjp0cnVlfQ==\"\n      }\n    },\n    {\n      \"ID\": \"9b6c4955472bdb51\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0009/o/some-obj?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"82\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJjb250ZW50VHlwZSI6ImZvbyJ9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3192\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:42 GMT\"\n          ],\n          \"Etag\": [\n            \"CNC/3Onx/eECEAM=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoybPBMseeVzkBPlzTObhT-eKnJ9TbsC15btCmXKMDvqgD5Uz4JclrgL9lBqMq09UjP8GL2_3zCDkfA0gJ8SHCDZbHEi1XYcuAUT7hmXazBL3IIMqc\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsIm1ldGFnZW5lcmF0aW9uIjoiMyIsImNvbnRlbnRUeXBlIjoiZm9vIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQwLjYzOFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0Mi4xMjNaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NDAuNjM4WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJSOFVITEgwbzhmMWVNWFVEdHIxNktnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmo/Z2VuZXJhdGlvbj0xNTU2ODM1OTQwNjM4NjcyJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L3NvbWUtb2JqLzE1NTY4MzU5NDA2Mzg2NzIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmovYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ05DLzNPbngvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L3NvbWUtb2JqLzE1NTY4MzU5NDA2Mzg2NzIvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ05DLzNPbngvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L3NvbWUtb2JqLzE1NTY4MzU5NDA2Mzg2NzIvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNOQy8zT254L2VFQ0VBTT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiMHpHc0ZRPT0iLCJldGFnIjoiQ05DLzNPbngvZUVDRUFNPSIsInRlbXBvcmFyeUhvbGQiOnRydWV9\"\n      }\n    },\n    {\n      \"ID\": \"0227238a512229dc\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0009/o/some-obj?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3192\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:42 GMT\"\n          ],\n          \"Etag\": [\n            \"CNC/3Onx/eECEAM=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Up6PS1r6NaUKQ9158DD3cKWHqyParXLdcW8k7sToMskeTU6BjpajWENp3qNHqLMFvX9NrK78TIw31h_ANYkltj3vAQoYq2RG5C6ZB2LCvUIch96SMo\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsIm1ldGFnZW5lcmF0aW9uIjoiMyIsImNvbnRlbnRUeXBlIjoiZm9vIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQwLjYzOFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0Mi4xMjNaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NDAuNjM4WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJSOFVITEgwbzhmMWVNWFVEdHIxNktnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmo/Z2VuZXJhdGlvbj0xNTU2ODM1OTQwNjM4NjcyJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L3NvbWUtb2JqLzE1NTY4MzU5NDA2Mzg2NzIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmovYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ05DLzNPbngvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L3NvbWUtb2JqLzE1NTY4MzU5NDA2Mzg2NzIvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ05DLzNPbngvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L3NvbWUtb2JqLzE1NTY4MzU5NDA2Mzg2NzIvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNOQy8zT254L2VFQ0VBTT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiMHpHc0ZRPT0iLCJldGFnIjoiQ05DLzNPbngvZUVDRUFNPSIsInRlbXBvcmFyeUhvbGQiOnRydWV9\"\n      }\n    },\n    {\n      \"ID\": \"7a81946424736215\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0009/o/some-obj?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"84\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJ0ZW1wb3JhcnlIb2xkIjpmYWxzZX0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3193\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:42 GMT\"\n          ],\n          \"Etag\": [\n            \"CNC/3Onx/eECEAQ=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uo1klBHpEl6qb-hfnVYr2KJLmo_3_1fgqlMYMBpBt23b-U9pF7bPcNEiJaMtrGEhZPQb9-QnqHiU8qPfmpNpSdy9KR41FwZm-89gyu3EtE5gq3J9-0\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsIm1ldGFnZW5lcmF0aW9uIjoiNCIsImNvbnRlbnRUeXBlIjoiZm9vIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQwLjYzOFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0Mi43MjFaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NDAuNjM4WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJSOFVITEgwbzhmMWVNWFVEdHIxNktnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmo/Z2VuZXJhdGlvbj0xNTU2ODM1OTQwNjM4NjcyJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L3NvbWUtb2JqLzE1NTY4MzU5NDA2Mzg2NzIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmovYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ05DLzNPbngvZUVDRUFRPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L3NvbWUtb2JqLzE1NTY4MzU5NDA2Mzg2NzIvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBUT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ05DLzNPbngvZUVDRUFRPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L3NvbWUtb2JqLzE1NTY4MzU5NDA2Mzg2NzIvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNOQy8zT254L2VFQ0VBUT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiMHpHc0ZRPT0iLCJldGFnIjoiQ05DLzNPbngvZUVDRUFRPSIsInRlbXBvcmFyeUhvbGQiOmZhbHNlfQ==\"\n      }\n    },\n    {\n      \"ID\": \"7865e37b40b9ec66\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0009/o/some-obj?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:43 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uo2nfd81k4cBaY8ZFRGIu8G6DHyGUVAdIJCB65E8ZqqO9ADJIV4K22sQaOA8fqGL3jyi3tIszjBVsXHOFrCgca1vLXSpA1-3s2cn-MVhTKpzZ5tzY4\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"fd9104ab049c0173\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0009?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:43 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqMqIYvjYuUxhnSLyoY-p5BYUiuZIX7cs418asOvABObfrQc8eXZpo-V4LSZVWWgt4CNoviMvFwcdC9sCTKCZU1H-9Ifcuf8lptTMZpiWMJjZfD-DY\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"e735515a80a67931\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"105\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwIiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjM2MDAifX0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"573\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:44 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqxx-CzGd9qn-QCqeE_iYOkeO93A0IpWx1voocTxhTrdkkBJonYBIWXeaEq3g-LNThw7j85IKVotWyBNZlHzqYSgBchb0DeXXetMqS8WBkY603Sa60\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQzLjgwNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0My44MDRaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiMzYwMCIsImVmZmVjdGl2ZVRpbWUiOiIyMDE5LTA1LTAyVDIyOjI1OjQzLjgwNFoifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"94bfaea89e1f47c2\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0010/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAiLCJuYW1lIjoic29tZS1vYmoifQo=\",\n          \"29UJUEl2/QvM9FnDBFnPRA==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3245\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:44 GMT\"\n          ],\n          \"Etag\": [\n            \"CPXIv+vx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqLSIzBtq8Qn_3f51_hlfoIkcpamafGwB3U8er3K_mzANwxXyscBHWZhaxb2-3M2wOT6GZER6-zLAtdeeSNtSlUMHkHX77gocrZGYj103HA-AGjVSM\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMC9zb21lLW9iai8xNTU2ODM1OTQ0MzU5MDI5Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0NDM1OTAyOSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ0LjM1OFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0NC4zNThaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NDQuMzU4WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJQYzFTWFEyUUk3MGxNNlZIN1F0NUFnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL28vc29tZS1vYmo/Z2VuZXJhdGlvbj0xNTU2ODM1OTQ0MzU5MDI5JmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL3NvbWUtb2JqLzE1NTY4MzU5NDQzNTkwMjkvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL28vc29tZS1vYmovYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDQzNTkwMjkiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ1BYSXYrdngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL3NvbWUtb2JqLzE1NTY4MzU5NDQzNTkwMjkvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMC9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwIiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0NDM1OTAyOSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNQWEl2K3Z4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMC9zb21lLW9iai8xNTU2ODM1OTQ0MzU5MDI5L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAvby9zb21lLW9iai9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDQzNTkwMjkiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ1BYSXYrdngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL3NvbWUtb2JqLzE1NTY4MzU5NDQzNTkwMjkvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMC9vL3NvbWUtb2JqL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwIiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0NDM1OTAyOSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNQWEl2K3Z4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoidUpwZFdRPT0iLCJldGFnIjoiQ1BYSXYrdngvZUVDRUFFPSIsInJldGVudGlvbkV4cGlyYXRpb25UaW1lIjoiMjAxOS0wNS0wMlQyMzoyNTo0NC4zNThaIn0=\"\n      }\n    },\n    {\n      \"ID\": \"7db6d4640ce21307\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0010/o/some-obj?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3245\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:44 GMT\"\n          ],\n          \"Etag\": [\n            \"CPXIv+vx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoUK3qzYL0xUcMKfWD6mmDZqRfnd8q7O14gBrKng7OYalNXZR3ZegpD1VyqjzW6bgQqFvLrtFjWXwPoJ4E78_nThYByR2n3Hm33ms2fvCdaRSOy1Qc\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMC9zb21lLW9iai8xNTU2ODM1OTQ0MzU5MDI5Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0NDM1OTAyOSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ0LjM1OFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0NC4zNThaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NDQuMzU4WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJQYzFTWFEyUUk3MGxNNlZIN1F0NUFnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL28vc29tZS1vYmo/Z2VuZXJhdGlvbj0xNTU2ODM1OTQ0MzU5MDI5JmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL3NvbWUtb2JqLzE1NTY4MzU5NDQzNTkwMjkvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL28vc29tZS1vYmovYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDQzNTkwMjkiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ1BYSXYrdngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL3NvbWUtb2JqLzE1NTY4MzU5NDQzNTkwMjkvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMC9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwIiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0NDM1OTAyOSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNQWEl2K3Z4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMC9zb21lLW9iai8xNTU2ODM1OTQ0MzU5MDI5L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAvby9zb21lLW9iai9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDQzNTkwMjkiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ1BYSXYrdngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL3NvbWUtb2JqLzE1NTY4MzU5NDQzNTkwMjkvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMC9vL3NvbWUtb2JqL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwIiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0NDM1OTAyOSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNQWEl2K3Z4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoidUpwZFdRPT0iLCJldGFnIjoiQ1BYSXYrdngvZUVDRUFFPSIsInJldGVudGlvbkV4cGlyYXRpb25UaW1lIjoiMjAxOS0wNS0wMlQyMzoyNTo0NC4zNThaIn0=\"\n      }\n    },\n    {\n      \"ID\": \"cec800ec28205dab\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0010?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"25\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJyZXRlbnRpb25Qb2xpY3kiOm51bGx9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2431\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:45 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqAm9jtf7nMSv2Bbn_pFGaLCmlq2CtqUdGeEOyYrkllqiADBk9_xsJS3BufmzfGIdARRHN7jVwbeHKev2CHMyzWoGA8UxNGNIldPCC4oZ1dMPARKHk\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQzLjgwNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0NS4yMjZaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBST0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"c787f6d5b23123a3\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0010/o/some-obj?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:45 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrgP5ghUeBxvXks4XlillwzLwfwyRGxt5y-FImGHSwZ-Meht6M0-keE0YTUG2Qy5hH5i1gpWPyGHXweFDyrk8a3QbDPnG5shDEoxzNOlMEsX6V8-4I\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"144726e64e401a23\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0010?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:45 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpxuxvNJ3APW11H4y-qweAzn3ChIZ0eRjSetoSHkGwVvO7nMR17h5Hbj8I8zgOGjR7HPA201lDCw47ejD6kj1wCz3ZTIrUz-r-qjdm0vGGszQYFidQ\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"eebfbd37f51a5cc6\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"103\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDExIiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjYwIn19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"571\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:46 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uox0foiLUu9KuEF-KVU8lIN_yUKAJsYEuwVqgSXvzFRGmzJtSZvFeNvMDS8W0aQ7c8YoI89qS_MxU8zBSBqcljYpIZe1NPIvkEFEG5K22RJkAuwmh8\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDExIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ2LjE3M1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0Ni4xNzNaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiNjAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyNTo0Ni4xNzNaIn0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"c7ddc04b5d29113a\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0011?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"47\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiMzYwMCJ9fQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2519\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:46 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpD4zsQLTflaR7g-z0FszOHvw5oXvxqdiyjlAnMwMcBcUEjidrpIGgpvmrz1EWi2AyWkdDCSY0l8ItQxYnWwSZt24jOxXBlzq-gCNrCCE6j0fJVGKw\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDExIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ2LjE3M1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0Ni44NjNaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDExL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDExL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiIzNjAwIiwiZWZmZWN0aXZlVGltZSI6IjIwMTktMDUtMDJUMjI6MjU6NDYuMTczWiJ9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0=\"\n      }\n    },\n    {\n      \"ID\": \"e08a38dca4dda51f\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0011?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2519\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:47 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:47 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrsphQdkHT0ctCFLyPV1JRkq7cyQ7w1tvYmAWv-6tYsuThaMN-vkUJoTNz2gPKGy6jV0yqdbXaAlRlD_5n6GiQa-ULOyKLi-C0q8y25lfk7L6zROE4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDExIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ2LjE3M1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0Ni44NjNaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDExL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDExL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiIzNjAwIiwiZWZmZWN0aXZlVGltZSI6IjIwMTktMDUtMDJUMjI6MjU6NDYuMTczWiJ9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0=\"\n      }\n    },\n    {\n      \"ID\": \"fe586a68284be237\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"103\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEyIiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjYwIn19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"571\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:47 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpAjkPxULicnoY5wPnfrg-D7yzTbTzTZcUShEN8JSsqVMN758lI4DlkvFibNK9URhYVBH0xclTheAOO_CEDoVb5egvcF-WJqJ3SDisU2YPaZsohRro\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ3LjU2NVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0Ny41NjVaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiNjAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyNTo0Ny41NjVaIn0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"732c3421adfb99d8\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0012?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"47\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiMzYwMCJ9fQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2519\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:48 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UohfaTh8JFEjT7TTMwV7NkrcAsgkdpDyovvbjHJLNbXalzOWX3_HwhowBimaqZXhkuvBx1D38zsUZ5dEzigoyoXRJtgHfy7ClUrshBL_yMfPkZ4JE4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ3LjU2NVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0OC4yNzBaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiIzNjAwIiwiZWZmZWN0aXZlVGltZSI6IjIwMTktMDUtMDJUMjI6MjU6NDcuNTY1WiJ9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0=\"\n      }\n    },\n    {\n      \"ID\": \"aebe46d0a31a6e95\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0012?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2519\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:48 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:48 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uop7c4AxllIcwFmLfqhIIaGP3Q9uHfmQoAm9LttwjQIvzHiJvu4fg_Q3UfNP8YbDuP97jLsG78JbCK68eSQv8ZHPp8kpzfdJcvOER0cs75wQ9gC7NA\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ3LjU2NVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0OC4yNzBaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiIzNjAwIiwiZWZmZWN0aXZlVGltZSI6IjIwMTktMDUtMDJUMjI6MjU6NDcuNTY1WiJ9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0=\"\n      }\n    },\n    {\n      \"ID\": \"bea48b3667650bdd\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"103\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEzIiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjYwIn19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"571\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:49 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uo1p1nEuvoUAqYHYa8wuU6qF64gN2JPCxLqqFEUiKXLgo9rwPH_btm63155v5hbuS6sow8cYEvsXVJthsJ1Zn8qfb05USodp1EvTTrt_m1rpJnIxdo\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEzIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ5LjAxNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0OS4wMTRaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiNjAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyNTo0OS4wMTRaIn0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"a951cae4048b1267\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0013?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"25\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJyZXRlbnRpb25Qb2xpY3kiOm51bGx9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2431\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:49 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpZAHhwxqSSY5MYFK1fdLLirRH41rc7W2YWSnn4CQZkbdR_98fRYjddtqZVfpEizqsZ1BNa5A7ENxQz7BwQSamASc8XAC5gyZp_pwi-Yu8l0XLSCpU\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEzIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ5LjAxNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0OS42MjdaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBST0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"e7f0506408261db3\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0013?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2431\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:49 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:49 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UotOOFJlGACBcheGxpS8qxLlGsDT0xOhT_Cg1M_6DxUI16IiOu-YHaPvwzxilOKOrTvL8kRzcVUiNuFeS6rQExTmdK70I1IOH2d2BLOrMm1L5Int1g\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEzIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ5LjAxNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0OS42MjdaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBST0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"b2c4589e9b9b5ad2\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"103\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjYwIn19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 429,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"12201\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:50 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoFdLKiYfqS-J3PXjvHGxpXtJwVnUB7Li8XrR-DTYkmyed-ZlUmUcmZFgGyIayuACtUWVYBcRbhYOKvgkfl8srE0OdJbc15OHWBttYqenraJ0MdXj8\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6InVzYWdlTGltaXRzIiwicmVhc29uIjoicmF0ZUxpbWl0RXhjZWVkZWQiLCJtZXNzYWdlIjoiVGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVRPT19NQU5ZX1JFUVVFU1RTLCBjYXRlZ29yeT1RVU9UQV9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPXVzYWdlTGltaXRzLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9dG9vTWFueVJlcXVlc3RzLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWNsb3VkLmJpZ3N0b3JlLmFwaS5CaWdzdG9yZUVycm9yRG9tYWluLkNMSUVOVF9RVU9UQV9FWENFRURFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlBST0pFQ1RfQlVDS0VUX09QX1JBVEVfVE9PX0hJR0g6IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YToxODQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjQyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmluc2VydChCdWNrZXRzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1DTElFTlRfUVVPVEFfRVhDRUVERUQsIGVycm9yUHJvdG9Eb21haW49Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuYnVja2V0Lm5hbWUsIG1lc3NhZ2U9VGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5idWNrZXQubmFtZSwgbWVzc2FnZT1UaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuLCByZWFzb249cmF0ZUxpbWl0RXhjZWVkZWQsIHJwY0NvZGU9NDI5fSBUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UFJPSkVDVF9CVUNLRVRfT1BfUkFURV9UT09fSElHSDogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjE4NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6NDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IuaW5zZXJ0KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MjksIm1lc3NhZ2UiOiJUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuIn19\"\n      }\n    },\n    {\n      \"ID\": \"836baafb4e98da80\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"103\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjYwIn19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 429,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"12201\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:51 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpNuySlLo4SanUdFJK3SGoCidNgWEW4mUuFDGMLLSzY-UUA3TJtN5_FLoLq7et7d1YSUDlOoGZY4a_GdewGQtsUwGdbHLz-bopObpzPy160Wm3UMpg\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6InVzYWdlTGltaXRzIiwicmVhc29uIjoicmF0ZUxpbWl0RXhjZWVkZWQiLCJtZXNzYWdlIjoiVGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVRPT19NQU5ZX1JFUVVFU1RTLCBjYXRlZ29yeT1RVU9UQV9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPXVzYWdlTGltaXRzLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9dG9vTWFueVJlcXVlc3RzLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWNsb3VkLmJpZ3N0b3JlLmFwaS5CaWdzdG9yZUVycm9yRG9tYWluLkNMSUVOVF9RVU9UQV9FWENFRURFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlBST0pFQ1RfQlVDS0VUX09QX1JBVEVfVE9PX0hJR0g6IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YToxODQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjQyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmluc2VydChCdWNrZXRzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1DTElFTlRfUVVPVEFfRVhDRUVERUQsIGVycm9yUHJvdG9Eb21haW49Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuYnVja2V0Lm5hbWUsIG1lc3NhZ2U9VGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5idWNrZXQubmFtZSwgbWVzc2FnZT1UaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuLCByZWFzb249cmF0ZUxpbWl0RXhjZWVkZWQsIHJwY0NvZGU9NDI5fSBUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UFJPSkVDVF9CVUNLRVRfT1BfUkFURV9UT09fSElHSDogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjE4NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6NDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IuaW5zZXJ0KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MjksIm1lc3NhZ2UiOiJUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuIn19\"\n      }\n    },\n    {\n      \"ID\": \"281ffb73e66efd1f\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"103\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjYwIn19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 429,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"12201\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:52 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uo8PK9JysFiApLjDSbbo9GloKqKjLO8vr85RWGkeC_Q0iEQf7zu2mwQVeiuJ81pfdJCUja0HrhNG13sczI2XoflqlsWNFvdxHGjCBrvDObr-s6Y32U\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6InVzYWdlTGltaXRzIiwicmVhc29uIjoicmF0ZUxpbWl0RXhjZWVkZWQiLCJtZXNzYWdlIjoiVGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVRPT19NQU5ZX1JFUVVFU1RTLCBjYXRlZ29yeT1RVU9UQV9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPXVzYWdlTGltaXRzLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9dG9vTWFueVJlcXVlc3RzLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWNsb3VkLmJpZ3N0b3JlLmFwaS5CaWdzdG9yZUVycm9yRG9tYWluLkNMSUVOVF9RVU9UQV9FWENFRURFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlBST0pFQ1RfQlVDS0VUX09QX1JBVEVfVE9PX0hJR0g6IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YToxODQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjQyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmluc2VydChCdWNrZXRzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1DTElFTlRfUVVPVEFfRVhDRUVERUQsIGVycm9yUHJvdG9Eb21haW49Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuYnVja2V0Lm5hbWUsIG1lc3NhZ2U9VGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5idWNrZXQubmFtZSwgbWVzc2FnZT1UaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuLCByZWFzb249cmF0ZUxpbWl0RXhjZWVkZWQsIHJwY0NvZGU9NDI5fSBUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UFJPSkVDVF9CVUNLRVRfT1BfUkFURV9UT09fSElHSDogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjE4NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6NDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IuaW5zZXJ0KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MjksIm1lc3NhZ2UiOiJUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuIn19\"\n      }\n    },\n    {\n      \"ID\": \"515ecb8616d48a7f\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"103\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjYwIn19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"571\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:55 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqF93J_Bpwg-_yefVpKWteSyWBSx9FqNm8MP5eZKqVfvDWpSF6EPZsISss7hNOkKMM5OuV8stlJIW2UAkzsSgkYOHx5fCwOwylbtqAyb8OlYJCHz6Q\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjU1LjIwNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo1NS4yMDRaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiNjAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyNTo1NS4yMDRaIn0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"771e55d617425f26\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0014?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"25\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJyZXRlbnRpb25Qb2xpY3kiOm51bGx9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2431\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:55 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Up6Slob_akPo2UWNmzCe-LD4cb-9DVTq_FPlNxA7mKVF6fBFks6gFnZ83BSajEU2qD8g14Y-pX20kbfoKf8XGR9pIW2xXH_oHCxsjspHZ2ARGePTMA\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjU1LjIwNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo1NS44MjVaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBST0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"9526aab2be8b214c\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0014?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2431\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:56 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:56 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UopNhdzHbHv4sXyk0r1owz7bkkPQwYIGbb3gRingbq7vgESKltWLIr9PDDIUNREfumEvZDfpxMineWYNzZ0qdOaI1QNYqXjnuxO6sCUDjBYEhr76uk\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjU1LjIwNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo1NS44MjVaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBST0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"0aabff8aa1cc1e9c\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"103\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE1IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjYwIn19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"571\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:56 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpTj6zYv1NMHDI_ktA1d-p7HKq4YnJMxxI9nXubPfCMyIspOgya8HYibmvOMFwLtCPagnzRHe0HbmTCSqJpYMay0xYZstGSE_IUWRqI9lUhzq0Iqe4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE1IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjU2LjM3NFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo1Ni4zNzRaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiNjAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyNTo1Ni4zNzRaIn0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"05147b5b5fdd7882\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0015?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"3\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"e30K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2517\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:56 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uoshhz3RuOTlNgZ3gOLis_dSFBsqr7khyJCdWUD8BGk0_j-AHxA5etttVHuHTrUcDksF4LdtfJLhlVrAJe9PrGiYZ-Wy57j6tb7L6vc0qHoTvolIRg\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE1IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjU2LjM3NFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo1Ni4zNzRaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE1L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiI2MCIsImVmZmVjdGl2ZVRpbWUiOiIyMDE5LTA1LTAyVDIyOjI1OjU2LjM3NFoifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"7de8d497e7e1a76c\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0015?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2517\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:57 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:25:57 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Up3mjbvLxwRDDhjg8GTGBNcJM7EraDydPsmD77oQcyYYGVlQnUqg0NQbezf4KQOoOHoEnC9jMR052e0olW3qi9KdAi4-qJEiKGI1rGivb5hnJnmU5o\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE1IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjU2LjM3NFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo1Ni4zNzRaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE1L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiI2MCIsImVmZmVjdGl2ZVRpbWUiOiIyMDE5LTA1LTAyVDIyOjI1OjU2LjM3NFoifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"3876040740117531\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0015?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:57 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqGdmh-XzrU5d5VwRugwWr452hENxpWf1sEtNCDaGksLJ1taCgnEjL_0oAlELqirqyXLlw-frE8LYo1V37Pk1G3qvWGk9E1iSZV7uECOjsdE3JagK8\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"39fb456e528c7081\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0014?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:57 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqKcAQsTdqHfiXj71c5kivJTwCNhY6xUQpZtaxywsmr1kNG5_MdJBsOvuLVbDSHKRIsG9tDxk_9Gz-7zaqP_pqke1aqKOFg9NeCU4ZqfjD0SBy0Q5Q\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"3fdacef865a6fc39\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0013?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:58 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur0PIkQTUvOl8-6tC08mwiS3nBPydo1OYUeD6Q46ZrU6VkmpRwxc9MikGqJlsejuGZkyY_aaxUVKYGREjOF363tfkbII3of6pGFuQ8rINOf8uFV5ts\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"2da48fa864dd9efe\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0012?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:58 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoWkbW_2n8KvRkdk7Lh_5eOVBjW6JvoW0i9LNQUHM-Df2H1QIbUYIwFnUGLt-bPfFa46Ur-v8Q76mU24KpjW7WIC_HVq4Q5H96pRYk7I6ggUsckTs0\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"3ef26f9548e0aec4\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0011?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:59 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqZfOfnhYy6nk2TxHz3h1eMu_0KlczCaOb-xcAIBRoRgxk7Q67BqsT5fvb-vAky2phYzQWNHLTk-0T8V2tpPY4Hg23Ub9evuo6_YEndEVdiBRhTcFI\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"8f3abbeca307cc5a\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"106\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjkwMDAwIn19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"574\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:25:59 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqdSQK1TuFGAgs143LV6RLNjzfrsAl5vt-Jb_RQ4dcVGDzK8I29sKKrPmcY0rLIJuVIQar3mdRGhNLhqXp2xCKli28TFq4rtsIgiA4DxCtdVbajIhY\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjU5LjM2NFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo1OS4zNjRaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiOTAwMDAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyNTo1OS4zNjRaIn0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"bb92a1c4ecd9e884\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0016/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoic29tZS1vYmplY3QifQo=\",\n          \"aGVsbG8gd29ybGQ=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3315\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:00 GMT\"\n          ],\n          \"Etag\": [\n            \"COup9/Lx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrRoCa6t1nTWVUrdfIXfyxZBI6PKBkzO24svoJRDEYMEsduIrzBpdDiX8mIUWSxcL8-pSRZgcDvy9_iHKpoVbiUNt4QhlG7zosGpa3WOk--YlBxjeM\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdC8xNTU2ODM1OTU5OTUyNjE5Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2L28vc29tZS1vYmplY3QiLCJuYW1lIjoic29tZS1vYmplY3QiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk1OTk1MjYxOSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo1OS45NTJaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NTkuOTUyWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjU5Ljk1MloiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoiWHJZN3UrQWU3dENUeXlLN2oxck53dz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9vL3NvbWUtb2JqZWN0P2dlbmVyYXRpb249MTU1NjgzNTk1OTk1MjYxOSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdC8xNTU2ODM1OTU5OTUyNjE5L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9vL3NvbWUtb2JqZWN0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYiLCJvYmplY3QiOiJzb21lLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTU5OTUyNjE5IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNPdXA5L0x4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdC8xNTU2ODM1OTU5OTUyNjE5L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYvby9zb21lLW9iamVjdC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNiIsIm9iamVjdCI6InNvbWUtb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NTk5NTI2MTkiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT3VwOS9MeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYvc29tZS1vYmplY3QvMTU1NjgzNTk1OTk1MjYxOS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2L28vc29tZS1vYmplY3QvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYiLCJvYmplY3QiOiJzb21lLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTU5OTUyNjE5IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPdXA5L0x4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdC8xNTU2ODM1OTU5OTUyNjE5L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYvby9zb21lLW9iamVjdC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNiIsIm9iamVjdCI6InNvbWUtb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NTk5NTI2MTkiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT3VwOS9MeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6InlaUmxxZz09IiwiZXRhZyI6IkNPdXA5L0x4L2VFQ0VBRT0iLCJyZXRlbnRpb25FeHBpcmF0aW9uVGltZSI6IjIwMTktMDUtMDNUMjM6MjU6NTkuOTUyWiJ9\"\n      }\n    },\n    {\n      \"ID\": \"8f2ac73db961f1d6\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0016/o/some-object?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"13884\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:00 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:26:00 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uok63dRFSkGv0Fum7yPhHf_AtYTWceX5_zkck648-jhWkyym1ezg2Og-LqKJ6nnZCW_gPZuU01OkZErKAQbL7mvQroCq8nEtNTEAosMxk9fJRKpYlc\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJPYmplY3QgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdCcgaXMgc3ViamVjdCB0byBidWNrZXQncyByZXRlbnRpb24gcG9saWN5IGFuZCBjYW5ub3QgYmUgZGVsZXRlZCwgb3ZlcndyaXR0ZW4gb3IgYXJjaGl2ZWQgdW50aWwgMjAxOS0wNS0wM1QxNjoyNTo1OS45NTIyMDg0MjgtMDc6MDAiLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UkVURU5USU9OX1BPTElDWV9OT1RfTUVUOiBPYmplY3QgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdCcgaXMgc3ViamVjdCB0byBidWNrZXQncyByZXRlbnRpb24gcG9saWN5IGFuZCBjYW5ub3QgYmUgZGVsZXRlZCwgb3ZlcndyaXR0ZW4gb3IgYXJjaGl2ZWQgdW50aWwgMjAxOS0wNS0wM1QxNjoyNTo1OS45NTIyMDg0MjgtMDc6MDBcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YTo4OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZGVsZXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IE9iamVjdCAnZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2L3NvbWUtb2JqZWN0JyBpcyBzdWJqZWN0IHRvIGJ1Y2tldCdzIHJldGVudGlvbiBwb2xpY3kgYW5kIGNhbm5vdCBiZSBkZWxldGVkLCBvdmVyd3JpdHRlbiBvciBhcmNoaXZlZCB1bnRpbCAyMDE5LTA1LTAzVDE2OjI1OjU5Ljk1MjIwODQyOC0wNzowMFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1GT1JCSURERU4sIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UkVURU5USU9OX1BPTElDWV9OT1RfTUVUOiBPYmplY3QgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdCcgaXMgc3ViamVjdCB0byBidWNrZXQncyByZXRlbnRpb24gcG9saWN5IGFuZCBjYW5ub3QgYmUgZGVsZXRlZCwgb3ZlcndyaXR0ZW4gb3IgYXJjaGl2ZWQgdW50aWwgMjAxOS0wNS0wM1QxNjoyNTo1OS45NTIyMDg0MjgtMDc6MDBcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YTo4OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZGVsZXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IE9iamVjdCAnZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2L3NvbWUtb2JqZWN0JyBpcyBzdWJqZWN0IHRvIGJ1Y2tldCdzIHJldGVudGlvbiBwb2xpY3kgYW5kIGNhbm5vdCBiZSBkZWxldGVkLCBvdmVyd3JpdHRlbiBvciBhcmNoaXZlZCB1bnRpbCAyMDE5LTA1LTAzVDE2OjI1OjU5Ljk1MjIwODQyOC0wNzowMFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1mb3JiaWRkZW4sIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLkZPUkJJRERFTiwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlJFVEVOVElPTl9QT0xJQ1lfTk9UX01FVDogT2JqZWN0ICdnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYvc29tZS1vYmplY3QnIGlzIHN1YmplY3QgdG8gYnVja2V0J3MgcmV0ZW50aW9uIHBvbGljeSBhbmQgY2Fubm90IGJlIGRlbGV0ZWQsIG92ZXJ3cml0dGVuIG9yIGFyY2hpdmVkIHVudGlsIDIwMTktMDUtMDNUMTY6MjU6NTkuOTUyMjA4NDI4LTA3OjAwXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6ODgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmRlbGV0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBPYmplY3QgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdCcgaXMgc3ViamVjdCB0byBidWNrZXQncyByZXRlbnRpb24gcG9saWN5IGFuZCBjYW5ub3QgYmUgZGVsZXRlZCwgb3ZlcndyaXR0ZW4gb3IgYXJjaGl2ZWQgdW50aWwgMjAxOS0wNS0wM1QxNjoyNTo1OS45NTIyMDg0MjgtMDc6MDBcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1GT1JCSURERU4sIGVycm9yUHJvdG9Eb21haW49Z2RhdGEuQ29yZUVycm9yRG9tYWluLCBmaWx0ZXJlZE1lc3NhZ2U9bnVsbCwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1PYmplY3QgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdCcgaXMgc3ViamVjdCB0byBidWNrZXQncyByZXRlbnRpb24gcG9saWN5IGFuZCBjYW5ub3QgYmUgZGVsZXRlZCwgb3ZlcndyaXR0ZW4gb3IgYXJjaGl2ZWQgdW50aWwgMjAxOS0wNS0wM1QxNjoyNTo1OS45NTIyMDg0MjgtMDc6MDAsIHVubmFtZWRBcmd1bWVudHM9W119LCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPU9iamVjdCAnZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2L3NvbWUtb2JqZWN0JyBpcyBzdWJqZWN0IHRvIGJ1Y2tldCdzIHJldGVudGlvbiBwb2xpY3kgYW5kIGNhbm5vdCBiZSBkZWxldGVkLCBvdmVyd3JpdHRlbiBvciBhcmNoaXZlZCB1bnRpbCAyMDE5LTA1LTAzVDE2OjI1OjU5Ljk1MjIwODQyOC0wNzowMCwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IE9iamVjdCAnZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2L3NvbWUtb2JqZWN0JyBpcyBzdWJqZWN0IHRvIGJ1Y2tldCdzIHJldGVudGlvbiBwb2xpY3kgYW5kIGNhbm5vdCBiZSBkZWxldGVkLCBvdmVyd3JpdHRlbiBvciBhcmNoaXZlZCB1bnRpbCAyMDE5LTA1LTAzVDE2OjI1OjU5Ljk1MjIwODQyOC0wNzowMDogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlJFVEVOVElPTl9QT0xJQ1lfTk9UX01FVDogT2JqZWN0ICdnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYvc29tZS1vYmplY3QnIGlzIHN1YmplY3QgdG8gYnVja2V0J3MgcmV0ZW50aW9uIHBvbGljeSBhbmQgY2Fubm90IGJlIGRlbGV0ZWQsIG92ZXJ3cml0dGVuIG9yIGFyY2hpdmVkIHVudGlsIDIwMTktMDUtMDNUMTY6MjU6NTkuOTUyMjA4NDI4LTA3OjAwXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6ODgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmRlbGV0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBPYmplY3QgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdCcgaXMgc3ViamVjdCB0byBidWNrZXQncyByZXRlbnRpb24gcG9saWN5IGFuZCBjYW5ub3QgYmUgZGVsZXRlZCwgb3ZlcndyaXR0ZW4gb3IgYXJjaGl2ZWQgdW50aWwgMjAxOS0wNS0wM1QxNjoyNTo1OS45NTIyMDg0MjgtMDc6MDBcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDAzLCJtZXNzYWdlIjoiT2JqZWN0ICdnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYvc29tZS1vYmplY3QnIGlzIHN1YmplY3QgdG8gYnVja2V0J3MgcmV0ZW50aW9uIHBvbGljeSBhbmQgY2Fubm90IGJlIGRlbGV0ZWQsIG92ZXJ3cml0dGVuIG9yIGFyY2hpdmVkIHVudGlsIDIwMTktMDUtMDNUMTY6MjU6NTkuOTUyMjA4NDI4LTA3OjAwIn19\"\n      }\n    },\n    {\n      \"ID\": \"5a7a0988789dfb17\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0016?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"25\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJyZXRlbnRpb25Qb2xpY3kiOm51bGx9Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2431\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:00 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrZIBPbBTYIUYYaBFrcXzNnp7uuC8DoPry45bX57PyfL7aM5a83NLxYnvWsXD62w3LrRVksNhJbrLnSL5e8ZS6b0Cto8ufh-V00gNrGI-CaTc4achc\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjU5LjM2NFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjowMC43NTZaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBST0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"8410bda61aa0b6fd\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0016/o/some-object?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:01 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uo2MOVFr2ZwvkwYm32qtqndRBhJnBc28nVBEBowKjIIxpOxiYcSef4wtz9sLTJ23PbXr1F8L_TfGwyShv5j1eTsQ-91OXU8Q8JEZtui9VVyK96j2D4\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"7b024f33e16d850f\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0016?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:01 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpDkcsqcqPLSySgf13o9jWNafbKdVjSRqGNu3ZedvF7TlL9TBswdMMpcl0zQOHtvXWIrhrcZODr7RjRhHuvS8gJdMbnYeQDHrBCbiH6x9WrnaZ5uIQ\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"33b0efc1b91cfb42\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"106\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjkwMDAwIn19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"574\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:02 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpItvsNld0b1FGsjQgaVCDxW22UEra8vRGfkWtbDS7R2kMbHRPr0I6iPjzaQBOaa9-xUJxGO-JV6RhMlWwH2NY-FXY2-0lrkZiAzIL-tdFwkCwlF-Q\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjAxLjkwOFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjowMS45MDhaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiOTAwMDAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyNjowMS45MDhaIn0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"632b9a0387d9cff1\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0017?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2520\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:02 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:26:02 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpEVtrO8ed8TEHdpzyw857ZykloGKTT56atylmGnu682Y0VxI_T6SWN0JLFupJ_2Cu80ntiZttFSCBqwqFGfxVrRqsNnf0KBDyzqOH8eI-BaWPBXvE\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjAxLjkwOFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjowMS45MDhaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiI5MDAwMCIsImVmZmVjdGl2ZVRpbWUiOiIyMDE5LTA1LTAyVDIyOjI2OjAxLjkwOFoifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"a32a5924f876577b\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0017/lockRetentionPolicy?alt=json\\u0026ifMetagenerationMatch=1\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"639\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:03 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpsYL8RxAKClLw1KRdSSIORQHYKKf_HMml2vtwDOFrh0kTYDzhGEgX2RJAPQKOP2-70q7ZZ2VfkkGz12tmTiRgSuwB2dM3xxZxZucASROVeoit9Shg\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjAxLjkwOFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjowMy41NDRaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sIm93bmVyIjp7ImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCJ9LCJsb2NhdGlvbiI6IlVTIiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjkwMDAwIiwiZWZmZWN0aXZlVGltZSI6IjIwMTktMDUtMDJUMjI6MjY6MDEuOTA4WiIsImlzTG9ja2VkIjp0cnVlfSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FJPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"718775f2f8320cfd\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0017?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2536\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:03 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:26:03 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UprHupyIuGJCYeUCPKigfkARZRkCc2Jz051KFrXK7YS0FbdKxNe3r20jon1ejkooHsAtcXQOi1tDV41Ob9dJ3Zoyj7stDImJ0eQriMO0WLLQ__-V54\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjAxLjkwOFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjowMy41NDRaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiI5MDAwMCIsImVmZmVjdGl2ZVRpbWUiOiIyMDE5LTA1LTAyVDIyOjI2OjAxLjkwOFoiLCJpc0xvY2tlZCI6dHJ1ZX0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBST0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"2f4b1104fa94954b\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0017?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"47\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiMzYwMCJ9fQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 403,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"13774\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:04 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrafLpm39Fg6hBYYi9lSEizIWUdMduEDQykOeT9Bch6uf9BNQUO9sOAnWpTklSpNac1yW_kSNj-JR8LMmVLirC2kqG2DcQdE-Hg5dtVBkVZ4Xhjlc8\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJDYW5ub3QgcmVkdWNlIHJldGVudGlvbiBkdXJhdGlvbiBvZiBhIGxvY2tlZCBSZXRlbnRpb24gUG9saWN5IGZvciBidWNrZXQgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNycuIiwiZGVidWdJbmZvIjoiY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDQ0VTU19ERU5JRUQ6IENhbm5vdCByZWR1Y2UgcmV0ZW50aW9uIGR1cmF0aW9uIG9mIGEgbG9ja2VkIFJldGVudGlvbiBQb2xpY3kgZm9yIGJ1Y2tldCAnZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3Jy5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuVXBkYXRlQW5kUGF0Y2hCdWNrZXQudXBkYXRlQnVja2V0KFVwZGF0ZUFuZFBhdGNoQnVja2V0LmphdmE6MTE5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuUGF0Y2hCdWNrZXQucGF0Y2hCdWNrZXQoUGF0Y2hCdWNrZXQuamF2YToxOTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5QYXRjaEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUGF0Y2hCdWNrZXQuamF2YToxNDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5QYXRjaEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUGF0Y2hCdWNrZXQuamF2YTo0Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci51cGRhdGUoQnVja2V0c0RlbGVnYXRvci5qYXZhOjEwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ2Fubm90IHJlZHVjZSByZXRlbnRpb24gZHVyYXRpb24gb2YgYSBsb2NrZWQgUmV0ZW50aW9uIFBvbGljeSBmb3IgYnVja2V0ICdnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcnLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxOSBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1GT1JCSURERU4sIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNDRVNTX0RFTklFRDogQ2Fubm90IHJlZHVjZSByZXRlbnRpb24gZHVyYXRpb24gb2YgYSBsb2NrZWQgUmV0ZW50aW9uIFBvbGljeSBmb3IgYnVja2V0ICdnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcnLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5VcGRhdGVBbmRQYXRjaEJ1Y2tldC51cGRhdGVCdWNrZXQoVXBkYXRlQW5kUGF0Y2hCdWNrZXQuamF2YToxMTkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5QYXRjaEJ1Y2tldC5wYXRjaEJ1Y2tldChQYXRjaEJ1Y2tldC5qYXZhOjE5Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLlBhdGNoQnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChQYXRjaEJ1Y2tldC5qYXZhOjE0MSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLlBhdGNoQnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChQYXRjaEJ1Y2tldC5qYXZhOjQ2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLnVwZGF0ZShCdWNrZXRzRGVsZWdhdG9yLmphdmE6MTAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDYW5ub3QgcmVkdWNlIHJldGVudGlvbiBkdXJhdGlvbiBvZiBhIGxvY2tlZCBSZXRlbnRpb24gUG9saWN5IGZvciBidWNrZXQgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNycuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE5IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNDRVNTX0RFTklFRDogQ2Fubm90IHJlZHVjZSByZXRlbnRpb24gZHVyYXRpb24gb2YgYSBsb2NrZWQgUmV0ZW50aW9uIFBvbGljeSBmb3IgYnVja2V0ICdnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcnLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5VcGRhdGVBbmRQYXRjaEJ1Y2tldC51cGRhdGVCdWNrZXQoVXBkYXRlQW5kUGF0Y2hCdWNrZXQuamF2YToxMTkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5QYXRjaEJ1Y2tldC5wYXRjaEJ1Y2tldChQYXRjaEJ1Y2tldC5qYXZhOjE5Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLlBhdGNoQnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChQYXRjaEJ1Y2tldC5qYXZhOjE0MSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLlBhdGNoQnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChQYXRjaEJ1Y2tldC5qYXZhOjQ2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLnVwZGF0ZShCdWNrZXRzRGVsZWdhdG9yLmphdmE6MTAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDYW5ub3QgcmVkdWNlIHJldGVudGlvbiBkdXJhdGlvbiBvZiBhIGxvY2tlZCBSZXRlbnRpb24gUG9saWN5IGZvciBidWNrZXQgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNycuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE5IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Rk9SQklEREVOLCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9Q2Fubm90IHJlZHVjZSByZXRlbnRpb24gZHVyYXRpb24gb2YgYSBsb2NrZWQgUmV0ZW50aW9uIFBvbGljeSBmb3IgYnVja2V0ICdnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcnLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9Q2Fubm90IHJlZHVjZSByZXRlbnRpb24gZHVyYXRpb24gb2YgYSBsb2NrZWQgUmV0ZW50aW9uIFBvbGljeSBmb3IgYnVja2V0ICdnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcnLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IENhbm5vdCByZWR1Y2UgcmV0ZW50aW9uIGR1cmF0aW9uIG9mIGEgbG9ja2VkIFJldGVudGlvbiBQb2xpY3kgZm9yIGJ1Y2tldCAnZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3Jy46IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBDYW5ub3QgcmVkdWNlIHJldGVudGlvbiBkdXJhdGlvbiBvZiBhIGxvY2tlZCBSZXRlbnRpb24gUG9saWN5IGZvciBidWNrZXQgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNycuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLlVwZGF0ZUFuZFBhdGNoQnVja2V0LnVwZGF0ZUJ1Y2tldChVcGRhdGVBbmRQYXRjaEJ1Y2tldC5qYXZhOjExOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLlBhdGNoQnVja2V0LnBhdGNoQnVja2V0KFBhdGNoQnVja2V0LmphdmE6MTk2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuUGF0Y2hCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFBhdGNoQnVja2V0LmphdmE6MTQxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuUGF0Y2hCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFBhdGNoQnVja2V0LmphdmE6NDYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IudXBkYXRlKEJ1Y2tldHNEZWxlZ2F0b3IuamF2YToxMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENhbm5vdCByZWR1Y2UgcmV0ZW50aW9uIGR1cmF0aW9uIG9mIGEgbG9ja2VkIFJldGVudGlvbiBQb2xpY3kgZm9yIGJ1Y2tldCAnZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3Jy5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTkgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDAzLCJtZXNzYWdlIjoiQ2Fubm90IHJlZHVjZSByZXRlbnRpb24gZHVyYXRpb24gb2YgYSBsb2NrZWQgUmV0ZW50aW9uIFBvbGljeSBmb3IgYnVja2V0ICdnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcnLiJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"a8964565736a4805\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"106\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE4IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjkwMDAwIn19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 429,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"12201\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:04 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrNbiNCNtu8DhS-gNXfoe4R9DFKEVzknZ0g6YoI0JdvwH6P199oVJ2oaJwh9WXMte6frhDr_vJo1_PlxLhezMnUTJzMYZgPlPWdU1QN9imk3hXgawE\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6InVzYWdlTGltaXRzIiwicmVhc29uIjoicmF0ZUxpbWl0RXhjZWVkZWQiLCJtZXNzYWdlIjoiVGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVRPT19NQU5ZX1JFUVVFU1RTLCBjYXRlZ29yeT1RVU9UQV9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPXVzYWdlTGltaXRzLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9dG9vTWFueVJlcXVlc3RzLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWNsb3VkLmJpZ3N0b3JlLmFwaS5CaWdzdG9yZUVycm9yRG9tYWluLkNMSUVOVF9RVU9UQV9FWENFRURFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlBST0pFQ1RfQlVDS0VUX09QX1JBVEVfVE9PX0hJR0g6IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YToxODQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjQyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmluc2VydChCdWNrZXRzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1DTElFTlRfUVVPVEFfRVhDRUVERUQsIGVycm9yUHJvdG9Eb21haW49Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuYnVja2V0Lm5hbWUsIG1lc3NhZ2U9VGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5idWNrZXQubmFtZSwgbWVzc2FnZT1UaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuLCByZWFzb249cmF0ZUxpbWl0RXhjZWVkZWQsIHJwY0NvZGU9NDI5fSBUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UFJPSkVDVF9CVUNLRVRfT1BfUkFURV9UT09fSElHSDogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjE4NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6NDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IuaW5zZXJ0KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MjksIm1lc3NhZ2UiOiJUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuIn19\"\n      }\n    },\n    {\n      \"ID\": \"49648eb4e4e2ddda\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"106\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE4IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjkwMDAwIn19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 429,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"12201\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:05 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UplUHmGCg4wOKtpKVz2KH0cn-th8s-KXQR62bOkAF1pV1zIZJvsoI_tURcFttkyHks8g05Hln5fT4Ej_O-Lx6JCTovYYwhhHIK7AAcialHMj5fPHk4\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6InVzYWdlTGltaXRzIiwicmVhc29uIjoicmF0ZUxpbWl0RXhjZWVkZWQiLCJtZXNzYWdlIjoiVGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVRPT19NQU5ZX1JFUVVFU1RTLCBjYXRlZ29yeT1RVU9UQV9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPXVzYWdlTGltaXRzLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9dG9vTWFueVJlcXVlc3RzLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWNsb3VkLmJpZ3N0b3JlLmFwaS5CaWdzdG9yZUVycm9yRG9tYWluLkNMSUVOVF9RVU9UQV9FWENFRURFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlBST0pFQ1RfQlVDS0VUX09QX1JBVEVfVE9PX0hJR0g6IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YToxODQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjQyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmluc2VydChCdWNrZXRzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1DTElFTlRfUVVPVEFfRVhDRUVERUQsIGVycm9yUHJvdG9Eb21haW49Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuYnVja2V0Lm5hbWUsIG1lc3NhZ2U9VGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5idWNrZXQubmFtZSwgbWVzc2FnZT1UaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuLCByZWFzb249cmF0ZUxpbWl0RXhjZWVkZWQsIHJwY0NvZGU9NDI5fSBUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UFJPSkVDVF9CVUNLRVRfT1BfUkFURV9UT09fSElHSDogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjE4NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6NDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IuaW5zZXJ0KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MjksIm1lc3NhZ2UiOiJUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuIn19\"\n      }\n    },\n    {\n      \"ID\": \"42cf12714cf13289\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"106\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE4IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjkwMDAwIn19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 429,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"12201\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:07 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrcjWbo0pc_i_GQTU2WE6YR0XhWYMGRPJutu1MQXo6XbRKJAYhzNK4p2-_gCqZ6BvNGncUP1UZNoTrXsFFGt1RRTRR3DS9XNiws0gt9YQdp_I8dqqM\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6InVzYWdlTGltaXRzIiwicmVhc29uIjoicmF0ZUxpbWl0RXhjZWVkZWQiLCJtZXNzYWdlIjoiVGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVRPT19NQU5ZX1JFUVVFU1RTLCBjYXRlZ29yeT1RVU9UQV9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPXVzYWdlTGltaXRzLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9dG9vTWFueVJlcXVlc3RzLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWNsb3VkLmJpZ3N0b3JlLmFwaS5CaWdzdG9yZUVycm9yRG9tYWluLkNMSUVOVF9RVU9UQV9FWENFRURFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlBST0pFQ1RfQlVDS0VUX09QX1JBVEVfVE9PX0hJR0g6IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YToxODQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjQyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmluc2VydChCdWNrZXRzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1DTElFTlRfUVVPVEFfRVhDRUVERUQsIGVycm9yUHJvdG9Eb21haW49Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuYnVja2V0Lm5hbWUsIG1lc3NhZ2U9VGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5idWNrZXQubmFtZSwgbWVzc2FnZT1UaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuLCByZWFzb249cmF0ZUxpbWl0RXhjZWVkZWQsIHJwY0NvZGU9NDI5fSBUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UFJPSkVDVF9CVUNLRVRfT1BfUkFURV9UT09fSElHSDogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjE4NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6NDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IuaW5zZXJ0KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MjksIm1lc3NhZ2UiOiJUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuIn19\"\n      }\n    },\n    {\n      \"ID\": \"4f0fdb3eb607f33b\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"106\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE4IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjkwMDAwIn19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 429,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"12201\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:11 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Up0EsbUXQesAgz95sFt6OzWRDj5WAXqEpYaqHgGvCClYnBGvjX8eQmor80UQOCIDzT6v9ZAtOPVhFIqkJG6rV0-CDXiLAnr4gwDrPkqgezvm8PQTaY\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6InVzYWdlTGltaXRzIiwicmVhc29uIjoicmF0ZUxpbWl0RXhjZWVkZWQiLCJtZXNzYWdlIjoiVGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVRPT19NQU5ZX1JFUVVFU1RTLCBjYXRlZ29yeT1RVU9UQV9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPXVzYWdlTGltaXRzLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9dG9vTWFueVJlcXVlc3RzLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWNsb3VkLmJpZ3N0b3JlLmFwaS5CaWdzdG9yZUVycm9yRG9tYWluLkNMSUVOVF9RVU9UQV9FWENFRURFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlBST0pFQ1RfQlVDS0VUX09QX1JBVEVfVE9PX0hJR0g6IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YToxODQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjQyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmluc2VydChCdWNrZXRzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1DTElFTlRfUVVPVEFfRVhDRUVERUQsIGVycm9yUHJvdG9Eb21haW49Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuYnVja2V0Lm5hbWUsIG1lc3NhZ2U9VGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5idWNrZXQubmFtZSwgbWVzc2FnZT1UaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuLCByZWFzb249cmF0ZUxpbWl0RXhjZWVkZWQsIHJwY0NvZGU9NDI5fSBUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UFJPSkVDVF9CVUNLRVRfT1BfUkFURV9UT09fSElHSDogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjE4NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6NDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IuaW5zZXJ0KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MjksIm1lc3NhZ2UiOiJUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuIn19\"\n      }\n    },\n    {\n      \"ID\": \"a5a8b8af13be21cf\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"106\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE4IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjkwMDAwIn19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"574\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:15 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpF7Lqxvm1dNC6q_v81ZB1Ui9c2ZLJ3GXLX6Y6UNZN1nbkF78c0J3NwXavHF1cMFZ5oP8ufCnmCLg9vQHM6tfs2ih8YxQSfE4D3AxGsvBaGNP3VUMo\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE4IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE1LjA5N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxNS4wOTdaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiOTAwMDAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyNjoxNS4wOTdaIn0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"e1dbaeed8c6d1ffb\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0018/lockRetentionPolicy?alt=json\\u0026ifMetagenerationMatch=0\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 412,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Content-Length\": [\n            \"12155\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:16 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur4dRXLSTXYf9VXr3eOCMfuLBwDLvNQMXwIYjwEuSFQO_p-SxZQXQJ7I_VA0T5Hn8gnnEZIqLV3vLCnurXr0cyHDEMpCdxWOiIiqsXlgkbcLKf78to\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImNvbmRpdGlvbk5vdE1ldCIsIm1lc3NhZ2UiOiJQcmVjb25kaXRpb24gRmFpbGVkIiwibG9jYXRpb25UeXBlIjoiaGVhZGVyIiwibG9jYXRpb24iOiJJZi1NYXRjaCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpJTkNPUlJFQ1RfTUVUQV9HRU5FUkFUSU9OX1NQRUNJRklFRDogZXhwZWN0ZWQgQnVja2V0TWV0YWRhdGEubWV0YWRhdGFfZ2VuZXJhdGlvbjogMCBhY3R1YWw6IDFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuTG9ja1JldGVudGlvblBvbGljeS5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTG9ja1JldGVudGlvblBvbGljeS5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkxvY2tSZXRlbnRpb25Qb2xpY3kuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExvY2tSZXRlbnRpb25Qb2xpY3kuamF2YTo1Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5sb2NrUmV0ZW50aW9uUG9saWN5KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGV4cGVjdGVkIEJ1Y2tldE1ldGFkYXRhLm1ldGFkYXRhX2dlbmVyYXRpb246IDAgYWN0dWFsOiAxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVBSRUNPTkRJVElPTl9GQUlMRUQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6SU5DT1JSRUNUX01FVEFfR0VORVJBVElPTl9TUEVDSUZJRUQ6IGV4cGVjdGVkIEJ1Y2tldE1ldGFkYXRhLm1ldGFkYXRhX2dlbmVyYXRpb246IDAgYWN0dWFsOiAxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkxvY2tSZXRlbnRpb25Qb2xpY3kuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExvY2tSZXRlbnRpb25Qb2xpY3kuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5Mb2NrUmV0ZW50aW9uUG9saWN5LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMb2NrUmV0ZW50aW9uUG9saWN5LmphdmE6NTcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IubG9ja1JldGVudGlvblBvbGljeShCdWNrZXRzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBleHBlY3RlZCBCdWNrZXRNZXRhZGF0YS5tZXRhZGF0YV9nZW5lcmF0aW9uOiAwIGFjdHVhbDogMVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1wcmVjb25kaXRpb25GYWlsZWQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLkNPTkRJVElPTl9OT1RfTUVULCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6SU5DT1JSRUNUX01FVEFfR0VORVJBVElPTl9TUEVDSUZJRUQ6IGV4cGVjdGVkIEJ1Y2tldE1ldGFkYXRhLm1ldGFkYXRhX2dlbmVyYXRpb246IDAgYWN0dWFsOiAxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkxvY2tSZXRlbnRpb25Qb2xpY3kuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExvY2tSZXRlbnRpb25Qb2xpY3kuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5Mb2NrUmV0ZW50aW9uUG9saWN5LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMb2NrUmV0ZW50aW9uUG9saWN5LmphdmE6NTcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IubG9ja1JldGVudGlvblBvbGljeShCdWNrZXRzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBleHBlY3RlZCBCdWNrZXRNZXRhZGF0YS5tZXRhZGF0YV9nZW5lcmF0aW9uOiAwIGFjdHVhbDogMVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUNPTkRJVElPTl9OT1RfTUVULCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9bnVsbCwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWhlYWRlcnMuSWYtTWF0Y2gsIG1lc3NhZ2U9UHJlY29uZGl0aW9uIEZhaWxlZCwgcmVhc29uPWNvbmRpdGlvbk5vdE1ldCwgcnBjQ29kZT00MTJ9IFByZWNvbmRpdGlvbiBGYWlsZWQ6IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpJTkNPUlJFQ1RfTUVUQV9HRU5FUkFUSU9OX1NQRUNJRklFRDogZXhwZWN0ZWQgQnVja2V0TWV0YWRhdGEubWV0YWRhdGFfZ2VuZXJhdGlvbjogMCBhY3R1YWw6IDFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuTG9ja1JldGVudGlvblBvbGljeS5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTG9ja1JldGVudGlvblBvbGljeS5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkxvY2tSZXRlbnRpb25Qb2xpY3kuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExvY2tSZXRlbnRpb25Qb2xpY3kuamF2YTo1Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5sb2NrUmV0ZW50aW9uUG9saWN5KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGV4cGVjdGVkIEJ1Y2tldE1ldGFkYXRhLm1ldGFkYXRhX2dlbmVyYXRpb246IDAgYWN0dWFsOiAxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQxMiwibWVzc2FnZSI6IlByZWNvbmRpdGlvbiBGYWlsZWQifX0=\"\n      }\n    },\n    {\n      \"ID\": \"814dffcceacb3bd8\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026kmsKeyName=projects%2Fdeklerk-sandbox%2Flocations%2Fglobal%2FkeyRings%2Fgo-integration-test%2FcryptoKeys%2Fkey1\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoia21zIn0K\",\n          \"bXkgc2VjcmV0\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3234\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:17 GMT\"\n          ],\n          \"Etag\": [\n            \"CMGB+Prx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Upis-8CwJYvr7glFAMnec_3T3YDojfTz3O_uICK5tQQmfJF2_rFtNnbqopcxBL5L3aKyoYe4zOLoqN4_MFFrhYKDm6Tmrl3rytuh0ymlCV15VZKyrQ\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9rbXMvMTU1NjgzNTk3Njc0MTA1NyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2ttcyIsIm5hbWUiOiJrbXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3Njc0MTA1NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxNi43NDBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MTYuNzQwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE2Ljc0MFoiLCJzaXplIjoiOSIsIm1kNUhhc2giOiJBQVBRUzQ2VHJuTVlucWlLQWJhZ3RRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28va21zP2dlbmVyYXRpb249MTU1NjgzNTk3Njc0MTA1NyZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9rbXMvMTU1NjgzNTk3Njc0MTA1Ny9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9rbXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImttcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc2NzQxMDU3IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNNR0IrUHJ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9rbXMvMTU1NjgzNTk3Njc0MTA1Ny9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28va21zL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoia21zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NzY3NDEwNTciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTUdCK1ByeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEva21zLzE1NTY4MzU5NzY3NDEwNTcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2ttcy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImttcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc2NzQxMDU3IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNNR0IrUHJ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9rbXMvMTU1NjgzNTk3Njc0MTA1Ny91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28va21zL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoia21zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NzY3NDEwNTciLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTUdCK1ByeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IlVJNzg1QT09IiwiZXRhZyI6IkNNR0IrUHJ4L2VFQ0VBRT0iLCJrbXNLZXlOYW1lIjoicHJvamVjdHMvZGVrbGVyay1zYW5kYm94L2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3MvZ28taW50ZWdyYXRpb24tdGVzdC9jcnlwdG9LZXlzL2tleTEvY3J5cHRvS2V5VmVyc2lvbnMvMSJ9\"\n      }\n    },\n    {\n      \"ID\": \"9b05110f2b59351b\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/kms\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"9\"\n          ],\n          \"Content-Type\": [\n            \"text/plain; charset=utf-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:17 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"-CMGB+Prx/eECEAE=\\\"\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:26:16 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Encryption-Kms-Key-Name\": [\n            \"projects/deklerk-sandbox/locations/global/keyRings/go-integration-test/cryptoKeys/key1/cryptoKeyVersions/1\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:26:16 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835976741057\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=UI785A==\",\n            \"md5=AAPQS46TrnMYnqiKAbagtQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"9\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpZ6aSiGPoeZKANPoMPgXhL1QD5nbILvzv8v3sOMId95Y65wOPssqesNA1MXzp86JA4Qa5gAMxxx5cnY4z3-tCUnvsKoIHn3NXOK2U6ZSRLzYNeQeU\"\n          ]\n        },\n        \"Body\": \"bXkgc2VjcmV0\"\n      }\n    },\n    {\n      \"ID\": \"011b81453e7060ac\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/kms?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3234\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:17 GMT\"\n          ],\n          \"Etag\": [\n            \"CMGB+Prx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uq5t8aexqBqqxnLJFK9mWmGdVrFfd3gaCGOKfGJMO1phB3ATnxt67-cLVpELRy1gNnjNOK7-zMzWCR6yV1v5PQcv3lccINA--Q92RoECpvBON-QKtc\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9rbXMvMTU1NjgzNTk3Njc0MTA1NyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2ttcyIsIm5hbWUiOiJrbXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3Njc0MTA1NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxNi43NDBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MTYuNzQwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE2Ljc0MFoiLCJzaXplIjoiOSIsIm1kNUhhc2giOiJBQVBRUzQ2VHJuTVlucWlLQWJhZ3RRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28va21zP2dlbmVyYXRpb249MTU1NjgzNTk3Njc0MTA1NyZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9rbXMvMTU1NjgzNTk3Njc0MTA1Ny9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9rbXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImttcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc2NzQxMDU3IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNNR0IrUHJ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9rbXMvMTU1NjgzNTk3Njc0MTA1Ny9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28va21zL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoia21zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NzY3NDEwNTciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTUdCK1ByeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEva21zLzE1NTY4MzU5NzY3NDEwNTcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2ttcy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImttcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc2NzQxMDU3IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNNR0IrUHJ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9rbXMvMTU1NjgzNTk3Njc0MTA1Ny91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28va21zL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoia21zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NzY3NDEwNTciLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTUdCK1ByeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IlVJNzg1QT09IiwiZXRhZyI6IkNNR0IrUHJ4L2VFQ0VBRT0iLCJrbXNLZXlOYW1lIjoicHJvamVjdHMvZGVrbGVyay1zYW5kYm94L2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3MvZ28taW50ZWdyYXRpb24tdGVzdC9jcnlwdG9LZXlzL2tleTEvY3J5cHRvS2V5VmVyc2lvbnMvMSJ9\"\n      }\n    },\n    {\n      \"ID\": \"0dbd0a37c735be56\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/kms?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:17 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur_RD6un7NLXQpzwRBFEfZdp982qhfEzyvw8f_P1Lx1wKv8sUid99lQ7Nba5Rs73IJfv3qHXjQfUDHjWclvCAcS91nMboiexn-FwiMrUuKqCQ_d__4\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"1b81fc72e201f2a2\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ],\n          \"X-Goog-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Encryption-Key\": [\n            \"CLEARED\"\n          ],\n          \"X-Goog-Encryption-Key-Sha256\": [\n            \"Io4lnOPU+EThO0X0nq7mNEXB1rWxZsBI4L37pBmyfDc=\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoiY3NlayJ9Cg==\",\n          \"bXkgc2VjcmV0\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3262\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:17 GMT\"\n          ],\n          \"Etag\": [\n            \"CKCxsfvx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqRTb3RtqG1gIL-ENbVZC8nWKRHapQP78uVzv4yyL2t7N8cA5jEBWa014iJALicWO06KthvAMPLctgZCJ2UvPqo72IO4_LheEfTr13-_h43M-roUyc\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jc2VrLzE1NTY4MzU5Nzc2ODEwNTYiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jc2VrIiwibmFtZSI6ImNzZWsiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3NzY4MTA1NiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxNy42ODBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MTcuNjgwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE3LjY4MFoiLCJzaXplIjoiOSIsIm1kNUhhc2giOiJBQVBRUzQ2VHJuTVlucWlLQWJhZ3RRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3Nlaz9nZW5lcmF0aW9uPTE1NTY4MzU5Nzc2ODEwNTYmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3Nlay8xNTU2ODM1OTc3NjgxMDU2L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NzZWsvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNzZWsiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3NzY4MTA1NiIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDS0N4c2Z2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3Nlay8xNTU2ODM1OTc3NjgxMDU2L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jc2VrL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3NlayIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc3NjgxMDU2IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0tDeHNmdngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NzZWsvMTU1NjgzNTk3NzY4MTA1Ni9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3Nlay9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNzZWsiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3NzY4MTA1NiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDS0N4c2Z2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3Nlay8xNTU2ODM1OTc3NjgxMDU2L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jc2VrL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3NlayIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc3NjgxMDU2IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0tDeHNmdngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJVSTc4NUE9PSIsImV0YWciOiJDS0N4c2Z2eC9lRUNFQUU9IiwiY3VzdG9tZXJFbmNyeXB0aW9uIjp7ImVuY3J5cHRpb25BbGdvcml0aG0iOiJBRVMyNTYiLCJrZXlTaGEyNTYiOiJJbzRsbk9QVStFVGhPMFgwbnE3bU5FWEIxcld4WnNCSTRMMzdwQm15ZkRjPSJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"6da27052d0dabd22\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/csek/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/cmek?alt=json\\u0026destinationKmsKeyName=projects%2Fdeklerk-sandbox%2Flocations%2Fglobal%2FkeyRings%2Fgo-integration-test%2FcryptoKeys%2Fkey1\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"3\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ],\n          \"X-Goog-Copy-Source-Encryption-Algorithm\": [\n            \"AES256\"\n          ],\n          \"X-Goog-Copy-Source-Encryption-Key\": [\n            \"CLEARED\"\n          ],\n          \"X-Goog-Copy-Source-Encryption-Key-Sha256\": [\n            \"Io4lnOPU+EThO0X0nq7mNEXB1rWxZsBI4L37pBmyfDc=\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"e30K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3372\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:18 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpKmOV156VWN4edUkrNip1urAj8WTpDcgGTS520rVGilFT71KrZLZQxUMKloxtxKx5R6V9pUvIqYym68P8lQ8RSc5rEE_D1KlH-NyPgybiPERbxYZ4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiOSIsIm9iamVjdFNpemUiOiI5IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY21lay8xNTU2ODM1OTc4MTI2NDc3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY21layIsIm5hbWUiOiJjbWVrIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NzgxMjY0NzciLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MTguMTI2WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE4LjEyNloiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxOC4xMjZaIiwic2l6ZSI6IjkiLCJtZDVIYXNoIjoiQUFQUVM0NlRybk1ZbnFpS0FiYWd0UT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NtZWs/Z2VuZXJhdGlvbj0xNTU2ODM1OTc4MTI2NDc3JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NtZWsvMTU1NjgzNTk3ODEyNjQ3Ny9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jbWVrL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjbWVrIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NzgxMjY0NzciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0kzSnpQdngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NtZWsvMTU1NjgzNTk3ODEyNjQ3Ny9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY21lay9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNtZWsiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3ODEyNjQ3NyIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNJM0p6UHZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jbWVrLzE1NTY4MzU5NzgxMjY0NzcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NtZWsvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjbWVrIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NzgxMjY0NzciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0kzSnpQdngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NtZWsvMTU1NjgzNTk3ODEyNjQ3Ny91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY21lay9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNtZWsiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3ODEyNjQ3NyIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNJM0p6UHZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiVUk3ODVBPT0iLCJldGFnIjoiQ0kzSnpQdngvZUVDRUFFPSIsImttc0tleU5hbWUiOiJwcm9qZWN0cy9kZWtsZXJrLXNhbmRib3gvbG9jYXRpb25zL2dsb2JhbC9rZXlSaW5ncy9nby1pbnRlZ3JhdGlvbi10ZXN0L2NyeXB0b0tleXMva2V5MS9jcnlwdG9LZXlWZXJzaW9ucy8xIn19\"\n      }\n    },\n    {\n      \"ID\": \"6ff8a4be1ed6bda3\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/cmek\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"9\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:18 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"-CI3JzPvx/eECEAE=\\\"\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:26:18 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Encryption-Kms-Key-Name\": [\n            \"projects/deklerk-sandbox/locations/global/keyRings/go-integration-test/cryptoKeys/key1/cryptoKeyVersions/1\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:26:18 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835978126477\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=UI785A==\",\n            \"md5=AAPQS46TrnMYnqiKAbagtQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"9\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqDR7RHLf_CQraIBM5Z3vCUxSJndE0E6FBOLFBqmYvMntnrQyVIfxwuTE6BtHL4b8oQszU6rIycc72JMUjiGRM_XoGdjsk-WhsbBmL_3c3x5H1s4bs\"\n          ]\n        },\n        \"Body\": \"bXkgc2VjcmV0\"\n      }\n    },\n    {\n      \"ID\": \"51f1995364e644ed\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/cmek?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3271\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:18 GMT\"\n          ],\n          \"Etag\": [\n            \"CI3JzPvx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpM1hbkOXC-oSxvoqjP8s2MpxREJEpzVp2TTYj-6B8467MLYSA-yrWs9UoGwRGQUCJTR76e-qAmQnbzGsFGT31Kc3qjevb8SM0MynLHL9GhOMkm72w\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jbWVrLzE1NTY4MzU5NzgxMjY0NzciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jbWVrIiwibmFtZSI6ImNtZWsiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3ODEyNjQ3NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxOC4xMjZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MTguMTI2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE4LjEyNloiLCJzaXplIjoiOSIsIm1kNUhhc2giOiJBQVBRUzQ2VHJuTVlucWlLQWJhZ3RRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY21laz9nZW5lcmF0aW9uPTE1NTY4MzU5NzgxMjY0NzcmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY21lay8xNTU2ODM1OTc4MTI2NDc3L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NtZWsvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNtZWsiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3ODEyNjQ3NyIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSTNKelB2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY21lay8xNTU2ODM1OTc4MTI2NDc3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jbWVrL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY21layIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc4MTI2NDc3IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0kzSnpQdngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NtZWsvMTU1NjgzNTk3ODEyNjQ3Ny9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY21lay9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNtZWsiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3ODEyNjQ3NyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSTNKelB2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY21lay8xNTU2ODM1OTc4MTI2NDc3L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jbWVrL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY21layIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc4MTI2NDc3IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0kzSnpQdngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJVSTc4NUE9PSIsImV0YWciOiJDSTNKelB2eC9lRUNFQUU9Iiwia21zS2V5TmFtZSI6InByb2plY3RzL2Rla2xlcmstc2FuZGJveC9sb2NhdGlvbnMvZ2xvYmFsL2tleVJpbmdzL2dvLWludGVncmF0aW9uLXRlc3QvY3J5cHRvS2V5cy9rZXkxL2NyeXB0b0tleVZlcnNpb25zLzEifQ==\"\n      }\n    },\n    {\n      \"ID\": \"8972a840dc3d95a5\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/csek?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:18 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoTmNCzrFh_7cFaryet35nLbKqM6dyo7nvsyZApHIj6fLKcMDb9ZA-_TRNjGOLNFjjoD0IZ1YOz9P-ftNchBFkjWDTaFzBjbHmryCc9JInU3wd_DLw\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"1e28b278fe3e0a66\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/cmek?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:18 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqrX5OILXadm6r5e8fLyuLEhQncM5jrmmDaOesSqraquvQbXXKhTqNJ63RYU3qj90M3FLjwnAOz8oOBTQQDOq2sRqUkbpBbJzYj82Rp3Rd9VLpNns0\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"d1ac5d123ee4bae6\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"200\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJlbmNyeXB0aW9uIjp7ImRlZmF1bHRLbXNLZXlOYW1lIjoicHJvamVjdHMvZGVrbGVyay1zYW5kYm94L2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3MvZ28taW50ZWdyYXRpb24tdGVzdC9jcnlwdG9LZXlzL2tleTEifSwibG9jYXRpb24iOiJVUyIsIm5hbWUiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"609\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:19 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpbajYTiCBBelYuwcqOs7_O-SyJbcV6WGwYhC4JCMmeImLlFLb93JyaiYrSp-201iYZTIdQ2VViFR_Emxe2Z7b4jV_G-0o2xzkqnkSnz0-Qcw_q0Wc\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE5LjA2N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxOS4wNjdaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImVuY3J5cHRpb24iOnsiZGVmYXVsdEttc0tleU5hbWUiOiJwcm9qZWN0cy9kZWtsZXJrLXNhbmRib3gvbG9jYXRpb25zL2dsb2JhbC9rZXlSaW5ncy9nby1pbnRlZ3JhdGlvbi10ZXN0L2NyeXB0b0tleXMva2V5MSJ9LCJsb2NhdGlvbiI6IlVTIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"d035cdb991d0fabb\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0019?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2555\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:19 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:26:19 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uoi5SKd4TdRXg-INW-U3pKcPA2ioBWIc2zdC5W3J4efS9iZ0EKFNqprjQ-NGEK_3wSDGezk4Al3Dd4JovGxXSnH73rIw22S_R__XRrpTQmYpTiNFGQ\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE5LjA2N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxOS4wNjdaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJlbmNyeXB0aW9uIjp7ImRlZmF1bHRLbXNLZXlOYW1lIjoicHJvamVjdHMvZGVrbGVyay1zYW5kYm94L2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3MvZ28taW50ZWdyYXRpb24tdGVzdC9jcnlwdG9LZXlzL2tleTEifSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"672cb2bcc1ed4ee2\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0019/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJuYW1lIjoia21zIn0K\",\n          \"bXkgc2VjcmV0\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3234\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:20 GMT\"\n          ],\n          \"Etag\": [\n            \"CLHMt/zx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Upyst1aH69iaN9J4055oX7H2yReN5TADIX11Vul8KakNuYZbJ7yXm1GBdvCDVB-IPTvbhzELJWgfurnIHxGpzKJszLO70n58xMnVbSLsHX1J3W02Lw\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9rbXMvMTU1NjgzNTk3OTg3OTk4NSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9vL2ttcyIsIm5hbWUiOiJrbXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3OTg3OTk4NSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxOS44NzlaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MTkuODc5WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE5Ljg3OVoiLCJzaXplIjoiOSIsIm1kNUhhc2giOiJBQVBRUzQ2VHJuTVlucWlLQWJhZ3RRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L28va21zP2dlbmVyYXRpb249MTU1NjgzNTk3OTg3OTk4NSZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9rbXMvMTU1NjgzNTk3OTg3OTk4NS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvby9rbXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsIm9iamVjdCI6ImttcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc5ODc5OTg1IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNMSE10L3p4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9rbXMvMTU1NjgzNTk3OTg3OTk4NS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L28va21zL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5Iiwib2JqZWN0Ijoia21zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5Nzk4Nzk5ODUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTEhNdC96eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkva21zLzE1NTY4MzU5Nzk4Nzk5ODUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9vL2ttcy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsIm9iamVjdCI6ImttcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc5ODc5OTg1IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNMSE10L3p4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9rbXMvMTU1NjgzNTk3OTg3OTk4NS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L28va21zL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5Iiwib2JqZWN0Ijoia21zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5Nzk4Nzk5ODUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTEhNdC96eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IlVJNzg1QT09IiwiZXRhZyI6IkNMSE10L3p4L2VFQ0VBRT0iLCJrbXNLZXlOYW1lIjoicHJvamVjdHMvZGVrbGVyay1zYW5kYm94L2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3MvZ28taW50ZWdyYXRpb24tdGVzdC9jcnlwdG9LZXlzL2tleTEvY3J5cHRvS2V5VmVyc2lvbnMvMSJ9\"\n      }\n    },\n    {\n      \"ID\": \"c037ecafa6249395\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0019/kms\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"9\"\n          ],\n          \"Content-Type\": [\n            \"text/plain; charset=utf-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:20 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"-CLHMt/zx/eECEAE=\\\"\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:26:19 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Encryption-Kms-Key-Name\": [\n            \"projects/deklerk-sandbox/locations/global/keyRings/go-integration-test/cryptoKeys/key1/cryptoKeyVersions/1\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835979879985\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=UI785A==\",\n            \"md5=AAPQS46TrnMYnqiKAbagtQ==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"9\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrrQOFSgCkxAaKVPAQhz0ohMN6irPryraHLjWDEQgV3dNEwc5cxqcDDRChzx6_HR1Z_NPlm3vmjFCJcNK-2rAz-tmvVS8w36Q5U9Lc2wAGUgL_joX4\"\n          ]\n        },\n        \"Body\": \"bXkgc2VjcmV0\"\n      }\n    },\n    {\n      \"ID\": \"fc3eda648104f042\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0019/o/kms?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3234\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:20 GMT\"\n          ],\n          \"Etag\": [\n            \"CLHMt/zx/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqHPSbutJRXX-6i05QnH_4UizrPft0fsGc3_ISDNmXQ4C3RPbEAnNfS1Ren0j3k2z8zxk9AV1WZQCWiKG9D5A8gZAZESFxbSZyjbBH8jkLEsEX54NQ\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9rbXMvMTU1NjgzNTk3OTg3OTk4NSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9vL2ttcyIsIm5hbWUiOiJrbXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3OTg3OTk4NSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxOS44NzlaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MTkuODc5WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE5Ljg3OVoiLCJzaXplIjoiOSIsIm1kNUhhc2giOiJBQVBRUzQ2VHJuTVlucWlLQWJhZ3RRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L28va21zP2dlbmVyYXRpb249MTU1NjgzNTk3OTg3OTk4NSZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9rbXMvMTU1NjgzNTk3OTg3OTk4NS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvby9rbXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsIm9iamVjdCI6ImttcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc5ODc5OTg1IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNMSE10L3p4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9rbXMvMTU1NjgzNTk3OTg3OTk4NS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L28va21zL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5Iiwib2JqZWN0Ijoia21zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5Nzk4Nzk5ODUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTEhNdC96eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkva21zLzE1NTY4MzU5Nzk4Nzk5ODUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9vL2ttcy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsIm9iamVjdCI6ImttcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc5ODc5OTg1IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNMSE10L3p4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9rbXMvMTU1NjgzNTk3OTg3OTk4NS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L28va21zL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5Iiwib2JqZWN0Ijoia21zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5Nzk4Nzk5ODUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTEhNdC96eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IlVJNzg1QT09IiwiZXRhZyI6IkNMSE10L3p4L2VFQ0VBRT0iLCJrbXNLZXlOYW1lIjoicHJvamVjdHMvZGVrbGVyay1zYW5kYm94L2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3MvZ28taW50ZWdyYXRpb24tdGVzdC9jcnlwdG9LZXlzL2tleTEvY3J5cHRvS2V5VmVyc2lvbnMvMSJ9\"\n      }\n    },\n    {\n      \"ID\": \"13283bc1ba20f019\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0019/o/kms?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:20 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uo2b3OtHWqpsRWxurpcGgrEtM10ZDdsrIa2z0nFsO-P4G3RAGYMTVMR0MCtwLDePrKyhfnsK-d9T5AIcRpeaIe8Z40Qm7gkZP4Fdi9jXd6ceYe5Iwc\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"ca2255586aa4aeab\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0019?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"126\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJlbmNyeXB0aW9uIjp7ImRlZmF1bHRLbXNLZXlOYW1lIjoicHJvamVjdHMvZGVrbGVyay1zYW5kYm94L2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3MvZ28taW50ZWdyYXRpb24tdGVzdC9jcnlwdG9LZXlzL2tleTIifX0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2555\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:21 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur05CMGbsLFprbwWYFSeE3I5dKFdFUzO--ImyAzkLt6ueNGpMDviyX6c1S4F6t1bqXTSnyQXXQzgugu8JoecrL3-1eJOPsqnN-OBMubntJCblkyWqE\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE5LjA2N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyMS4zMzZaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJlbmNyeXB0aW9uIjp7ImRlZmF1bHRLbXNLZXlOYW1lIjoicHJvamVjdHMvZGVrbGVyay1zYW5kYm94L2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3MvZ28taW50ZWdyYXRpb24tdGVzdC9jcnlwdG9LZXlzL2tleTIifSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0=\"\n      }\n    },\n    {\n      \"ID\": \"e1c336910a43425f\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0019?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2555\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:21 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:26:21 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Urcwbg5Z9C0rFvSTWYj4FxF27ooV0028Cm-yme-BrfmvK0dWsRkfRQEMWylWwokcmM2kIvLKEiucJlvDLHvnbJPB_HjH3zF2Lm8xCwV_9gPN42QDeo\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE5LjA2N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyMS4zMzZaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJlbmNyeXB0aW9uIjp7ImRlZmF1bHRLbXNLZXlOYW1lIjoicHJvamVjdHMvZGVrbGVyay1zYW5kYm94L2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3MvZ28taW50ZWdyYXRpb24tdGVzdC9jcnlwdG9LZXlzL2tleTIifSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0=\"\n      }\n    },\n    {\n      \"ID\": \"581a002b653f595d\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0019?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"20\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJlbmNyeXB0aW9uIjpudWxsfQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2431\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:22 GMT\"\n          ],\n          \"Etag\": [\n            \"CAM=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Upv2LawTqc_eDVGR_hv2jSCyEA77H33uMkPevVxUUDKj1u4a9IWOH2f1oMXpU52-49Jg17SUSoJUJai1Ueff3ahN58GC9FCxwJt5v5xOHI3SytFjpo\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE5LjA2N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyMi4xMjRaIiwibWV0YWdlbmVyYXRpb24iOiIzIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FNPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQU09In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBTT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBTT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"a0db97c641f3f17c\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0019?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:22 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uo15eoN1OrQFM6eqxJcuNFl7Wfr6x_VvJ0ENBlhhC_Hedf5al2OplGnNslWnRQT9RVs92RVLevZ_F_ohutgnNsUbK1PVsR04UnQ_A6ea3C0ZLy8FkI\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"ca84fc3a71a55ea8\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026predefinedAcl=authenticatedRead\\u0026predefinedDefaultObjectAcl=publicRead\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"60\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIn0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"1468\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:23 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrnCCRKNh19fdBAL3pyCzbtLnG7z20pSwSZKl9uTerD6o6-B5mB79mqZRIbXNcUmcpTdpxTreKjvsHK3Y9EKq_5fkzBPInDj8YkjbGViIpd1ldSots\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjIzLjEwNloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyMy4xMDZaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL2FsbEF1dGhlbnRpY2F0ZWRVc2VycyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMC9hY2wvYWxsQXV0aGVudGljYXRlZFVzZXJzIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIiwiZW50aXR5IjoiYWxsQXV0aGVudGljYXRlZFVzZXJzIiwicm9sZSI6IlJFQURFUiIsImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoiYWxsVXNlcnMiLCJyb2xlIjoiUkVBREVSIiwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"ed54d82686b4d390\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0020?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"1468\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:23 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:26:23 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpXJh1_aAMuDVjYxLZJdwqAt7OwZdmTkc0_5wf_LshhNm_So0q87o7gJ31T58vp1b0_CucSecAyyyOLUbYTDrWDDTZGMkZBpfx1iBArjRtBcud1IgI\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjIzLjEwNloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyMy4xMDZaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL2FsbEF1dGhlbnRpY2F0ZWRVc2VycyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMC9hY2wvYWxsQXV0aGVudGljYXRlZFVzZXJzIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIiwiZW50aXR5IjoiYWxsQXV0aGVudGljYXRlZFVzZXJzIiwicm9sZSI6IlJFQURFUiIsImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoiYWxsVXNlcnMiLCJyb2xlIjoiUkVBREVSIiwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"224aee5425ffb86e\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0020?alt=json\\u0026predefinedAcl=private\\u0026predefinedDefaultObjectAcl=authenticatedRead\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"33\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJhY2wiOltdLCJkZWZhdWx0T2JqZWN0QWNsIjpbXX0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"1113\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:24 GMT\"\n          ],\n          \"Etag\": [\n            \"CAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoknWPZdEFnvKZGCGO_Z26ZaKeXNdBzc6k6qqlbGdQXVEtPvLPR2oYtKCXsqDgFBjMw4wfWVXwDfmcc5u5kBAxshpuzKGgCp8UOxv-i_Rml56mzrOI\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjIzLjEwNloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyNC40MjVaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6ImFsbEF1dGhlbnRpY2F0ZWRVc2VycyIsInJvbGUiOiJSRUFERVIiLCJldGFnIjoiQ0FJPSJ9XSwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sIm93bmVyIjp7ImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCJ9LCJsb2NhdGlvbiI6IlVTIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FJPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"b6a80796e20baf03\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0020/o?alt=json\\u0026predefinedAcl=authenticatedRead\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAiLCJuYW1lIjoicHJpdmF0ZSJ9Cg==\",\n          \"aGVsbG8=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"1995\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:25 GMT\"\n          ],\n          \"Etag\": [\n            \"CNDq5v7x/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqMfGdFW2xElqOJcP4q5XeDjVehJr4FmjcFPij-Y31f_168_Jgb6zibcWxCOJzrV1aUYYTXZW9DMX-BcvfJi6YXoBCPpN23EhrGQyY7tHSb0SVurGY\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMC9wcml2YXRlLzE1NTY4MzU5ODQ4NDgyMDgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvby9wcml2YXRlIiwibmFtZSI6InByaXZhdGUiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4NDg0ODIwOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyNC44NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MjQuODQ3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjI0Ljg0N1oiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL28vcHJpdmF0ZT9nZW5lcmF0aW9uPTE1NTY4MzU5ODQ4NDgyMDgmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvcHJpdmF0ZS8xNTU2ODM1OTg0ODQ4MjA4L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvby9wcml2YXRlL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIiwib2JqZWN0IjoicHJpdmF0ZSIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg0ODQ4MjA4IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ05EcTV2N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL3ByaXZhdGUvMTU1NjgzNTk4NDg0ODIwOC9hbGxBdXRoZW50aWNhdGVkVXNlcnMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvby9wcml2YXRlL2FjbC9hbGxBdXRoZW50aWNhdGVkVXNlcnMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAiLCJvYmplY3QiOiJwcml2YXRlIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5ODQ4NDgyMDgiLCJlbnRpdHkiOiJhbGxBdXRoZW50aWNhdGVkVXNlcnMiLCJyb2xlIjoiUkVBREVSIiwiZXRhZyI6IkNORHE1djd4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ05EcTV2N3gvZUVDRUFFPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"4812f1e0e907256e\",\n      \"Request\": {\n        \"Method\": \"PATCH\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0020/o/private?alt=json\\u0026predefinedAcl=private\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"62\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAifQo=\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"1529\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:25 GMT\"\n          ],\n          \"Etag\": [\n            \"CNDq5v7x/eECEAI=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqTjsMMIlet4CWUmGoB3TuGzhTHXlDwuUe1SAQO8H2vmbTo2QYYV_WozfDO2NyZpsA9LCtgwwthwxeEeEG182WQTTe3xLWnsVjqPZx-iho8JAgI66U\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMC9wcml2YXRlLzE1NTY4MzU5ODQ4NDgyMDgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvby9wcml2YXRlIiwibmFtZSI6InByaXZhdGUiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4NDg0ODIwOCIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyNC44NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MjUuNDIzWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjI0Ljg0N1oiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL28vcHJpdmF0ZT9nZW5lcmF0aW9uPTE1NTY4MzU5ODQ4NDgyMDgmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvcHJpdmF0ZS8xNTU2ODM1OTg0ODQ4MjA4L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvby9wcml2YXRlL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIiwib2JqZWN0IjoicHJpdmF0ZSIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg0ODQ4MjA4IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ05EcTV2N3gvZUVDRUFJPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTkRxNXY3eC9lRUNFQUk9In0=\"\n      }\n    },\n    {\n      \"ID\": \"969763dc18755620\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0020/o/private/rewriteTo/b/go-integration-test-20190502-80633403432013-0020/o/dst?alt=json\\u0026destinationPredefinedAcl=publicRead\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"3\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"e30K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"2017\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:25 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoNk9xKdyuh-I4RkIXqQxMF4A82DZ9b2HYZOdVK7ELOsnMYBqOmrqsY5hzZJsLXMZCZ6zOSzCeefQZuTgYHwyd-jAttJ4QoA1lDk0HTwZqigIfpjCc\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvZHN0LzE1NTY4MzU5ODU4NTAyNjkiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvby9kc3QiLCJuYW1lIjoiZHN0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5ODU4NTAyNjkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MjUuODQ5WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjI1Ljg0OVoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyNS44NDlaIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMC9vL2RzdD9nZW5lcmF0aW9uPTE1NTY4MzU5ODU4NTAyNjkmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvZHN0LzE1NTY4MzU5ODU4NTAyNjkvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMC9vL2RzdC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMCIsIm9iamVjdCI6ImRzdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg1ODUwMjY5IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0ozL28vL3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL2RzdC8xNTU2ODM1OTg1ODUwMjY5L2FsbFVzZXJzIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL28vZHN0L2FjbC9hbGxVc2VycyIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMCIsIm9iamVjdCI6ImRzdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg1ODUwMjY5IiwiZW50aXR5IjoiYWxsVXNlcnMiLCJyb2xlIjoiUkVBREVSIiwiZXRhZyI6IkNKMy9vLy94L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0ozL28vL3gvZUVDRUFFPSJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"8db7e2a6b620e794\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0020/o/comp/compose?alt=json\\u0026destinationPredefinedAcl=authenticatedRead\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"130\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6InByaXZhdGUifSx7Im5hbWUiOiJkc3QifV19Cg==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"1906\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:26 GMT\"\n          ],\n          \"Etag\": [\n            \"CJGwwP/x/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpqjCYxNFNTu3V1H_kV5WJxkbEYE9I3H5fYjfGMPO7n6C9NJstYZGcIh6xVA5RAxMCwP1PdzXITgTI1m2vm5xP5nhzLVRHKhder2qzYFGsAooH-kG0\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMC9jb21wLzE1NTY4MzU5ODYzMTUyODEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvby9jb21wIiwibmFtZSI6ImNvbXAiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4NjMxNTI4MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyNi4zMTRaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MjYuMzE0WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjI2LjMxNFoiLCJzaXplIjoiMTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL28vY29tcD9nZW5lcmF0aW9uPTE1NTY4MzU5ODYzMTUyODEmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvY29tcC8xNTU2ODM1OTg2MzE1MjgxL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvby9jb21wL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIiwib2JqZWN0IjoiY29tcCIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg2MzE1MjgxIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0pHd3dQL3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL2NvbXAvMTU1NjgzNTk4NjMxNTI4MS9hbGxBdXRoZW50aWNhdGVkVXNlcnMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvby9jb21wL2FjbC9hbGxBdXRoZW50aWNhdGVkVXNlcnMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAiLCJvYmplY3QiOiJjb21wIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5ODYzMTUyODEiLCJlbnRpdHkiOiJhbGxBdXRoZW50aWNhdGVkVXNlcnMiLCJyb2xlIjoiUkVBREVSIiwiZXRhZyI6IkNKR3d3UC94L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiL1JDT2dnPT0iLCJjb21wb25lbnRDb3VudCI6MiwiZXRhZyI6IkNKR3d3UC94L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"72a0ce58c513f6d5\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0020/o/comp?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:26 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpWOQtHF0cKNME8sTEm9vbS9KKKLLK9afxka1b6TTVGxDjCQ4qAdnA9zshsfVFVKK5hNS10aABAQog_gjYCZTXbbsF4bQNBM0i4R7bK2r7saocPtFo\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"111b5a296b726631\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0020/o/dst?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:26 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqPsYXABoYOnGueMXiIvH9AntIPEf4xc6i18Nnr_XEYBxy-3LSK9klIcNyfSB7we4lgbctsiYA2e2WWBJlfqk1GnK6YA2fj-e3IiPbKwBwTSLjr1Jk\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"27e4065cd2000d43\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0020/o/private?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:27 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpMPK_b_vcRkSIj1t37L47as9idfpbrNWqzirdNBLwoaGDMPlbjatMzjLThnYRNwk9CqTNQ5H8eoKFbunpe5TMktUo_FHyI7rryoUhbCpkbytRrTeM\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"cccb109f5fba2a3a\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0020?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:27 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoVAiJOaePqfycNhiwbkPOptOqgpe9Tvo0jo1aW2nviozj4-QcjTtnGGyhcdrZ8QTxT-KHPo-saYS9ESC_6osYhChJOCi8b9nXtuqH0BqlvywXs9FE\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"cfab6af30981f62b\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/projects/deklerk-sandbox/serviceAccount?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"116\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:28 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:26:28 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrDBTBzZwm7GH6Jklv6hzuaZaO3JdgliJk8zLZkVNDqwDO7tYP-c06rzrTj03llkWuV_l1k9w2tbUcGG2Rtv-1MdozY6pktTutDMLfyhyHe1DaEIys\"\n          ]\n        },\n        \"Body\": \"eyJlbWFpbF9hZGRyZXNzIjoic2VydmljZS00OTYxNjk2MDE3MTRAZ3MtcHJvamVjdC1hY2NvdW50cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImtpbmQiOiJzdG9yYWdlI3NlcnZpY2VBY2NvdW50In0=\"\n      }\n    },\n    {\n      \"ID\": \"677e783b9aea8c15\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoic29tZS1vYmplY3QifQo=\",\n          \"vcVTjdWWssp9XFk0D3Nk5w==\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3262\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:28 GMT\"\n          ],\n          \"Etag\": [\n            \"CPryt4Dy/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrdWRt6oMzDM98VpA0VDmWRuNvox2ZBw6ZpjbyOFDKCFKgJ92jsLkF8v4M4UUxaTUVpmr8iElUTld7Q2g5_MZSbRatDE2zVgaY-769Ppq7Nx6f0HAg\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zb21lLW9iamVjdC8xNTU2ODM1OTg4MjczNTMwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc29tZS1vYmplY3QiLCJuYW1lIjoic29tZS1vYmplY3QiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4ODI3MzUzMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyOC4yNzNaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MjguMjczWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjI4LjI3M1oiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoidEhhY2ZTS2ZCeUMrLytjbEc3cStqdz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NvbWUtb2JqZWN0P2dlbmVyYXRpb249MTU1NjgzNTk4ODI3MzUzMCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zb21lLW9iamVjdC8xNTU2ODM1OTg4MjczNTMwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NvbWUtb2JqZWN0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJzb21lLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg4MjczNTMwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNQcnl0NER5L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zb21lLW9iamVjdC8xNTU2ODM1OTg4MjczNTMwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9zb21lLW9iamVjdC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNvbWUtb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5ODgyNzM1MzAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDUHJ5dDREeS9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvc29tZS1vYmplY3QvMTU1NjgzNTk4ODI3MzUzMC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc29tZS1vYmplY3QvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJzb21lLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg4MjczNTMwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNQcnl0NER5L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zb21lLW9iamVjdC8xNTU2ODM1OTg4MjczNTMwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9zb21lLW9iamVjdC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNvbWUtb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5ODgyNzM1MzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDUHJ5dDREeS9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IlNtMWdLdz09IiwiZXRhZyI6IkNQcnl0NER5L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"ff3c05fe02cd38ac\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/some-object\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=60\"\n          ],\n          \"Content-Length\": [\n            \"16\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:28 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"b4769c7d229f0720beffe7251bbabe8f\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:27:28 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:26:28 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:26:28 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835988273530\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=Sm1gKw==\",\n            \"md5=tHacfSKfByC+/+clG7q+jw==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"16\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqn6PsKCJsyZAhI_JtSOcVKs7SWuqYsoprQTUagoZXqu1CHWyBc1TzWfUyF9iv5VBS4iZPP5qz0Lf3b51p8O36Sud2-QS2zDg9FKhtm1uBFKLpcTOs\"\n          ]\n        },\n        \"Body\": \"vcVTjdWWssp9XFk0D3Nk5w==\"\n      }\n    },\n    {\n      \"ID\": \"d1c7cc7c0e1d2829\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/some-object?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3262\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:28 GMT\"\n          ],\n          \"Etag\": [\n            \"CPryt4Dy/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqluzdkA1sUAJQJZodwWmM7SP7tNoX2JJjDiqHTy3XtjEqiVDNpI0whWTFJJH4caozRYjJPjTb6_ywm82dnAiYEo-YCknhlvkWexfTq1BM9MRWwQeg\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zb21lLW9iamVjdC8xNTU2ODM1OTg4MjczNTMwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc29tZS1vYmplY3QiLCJuYW1lIjoic29tZS1vYmplY3QiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4ODI3MzUzMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyOC4yNzNaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MjguMjczWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjI4LjI3M1oiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoidEhhY2ZTS2ZCeUMrLytjbEc3cStqdz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NvbWUtb2JqZWN0P2dlbmVyYXRpb249MTU1NjgzNTk4ODI3MzUzMCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zb21lLW9iamVjdC8xNTU2ODM1OTg4MjczNTMwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NvbWUtb2JqZWN0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJzb21lLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg4MjczNTMwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNQcnl0NER5L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zb21lLW9iamVjdC8xNTU2ODM1OTg4MjczNTMwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9zb21lLW9iamVjdC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNvbWUtb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5ODgyNzM1MzAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDUHJ5dDREeS9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvc29tZS1vYmplY3QvMTU1NjgzNTk4ODI3MzUzMC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc29tZS1vYmplY3QvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJzb21lLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg4MjczNTMwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNQcnl0NER5L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zb21lLW9iamVjdC8xNTU2ODM1OTg4MjczNTMwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9zb21lLW9iamVjdC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNvbWUtb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5ODgyNzM1MzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDUHJ5dDREeS9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IlNtMWdLdz09IiwiZXRhZyI6IkNQcnl0NER5L2VFQ0VBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"951f74cbe6b30b67\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2571\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:28 GMT\"\n          ],\n          \"Etag\": [\n            \"CA0=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:26:28 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoMRpk7F0qXPvUV4uNPdV7VhfUO2Mm-qPBbx3VV92y1wRyElPF1kbRNEGJ1KqbIW5w2XozD7IzjxBx4KevqcPxZr0_E1iU1_NASedJ4lZj4EFoP9UI\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyNS41MjdaIiwibWV0YWdlbmVyYXRpb24iOiIxMyIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQTA9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0EwPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQTA9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQTA9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOmZhbHNlfSwibGlmZWN5Y2xlIjp7InJ1bGUiOlt7ImFjdGlvbiI6eyJ0eXBlIjoiRGVsZXRlIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjMwfX1dfSwibGFiZWxzIjp7ImwxIjoidjIiLCJuZXciOiJuZXcifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0EwPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"aadc7916a3fc24ad\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0021?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 404,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"11805\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:29 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:26:29 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqhoAeZtt8ffiWaPr6J0LEaVR3vjerqtJ7gMM9BObOkz_6MtctDuS_s8-DZRxtTZsGfMDtekIKG2v8p2_sb3MxvTgeLhgO4vqvJNIszTaMjjyQcEdY\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vdCBGb3VuZCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpCVUNLRVRfTk9UX0ZPVU5EOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkdldEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0QnVja2V0LmphdmE6MTA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YTozMylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5nZXQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjgzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPU5PVF9GT1VORCwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpCVUNLRVRfTk9UX0ZPVU5EOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkdldEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0QnVja2V0LmphdmE6MTA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YTozMylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5nZXQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjgzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPW5vdEZvdW5kLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5OT1RfRk9VTkQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpCVUNLRVRfTk9UX0ZPVU5EOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkdldEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0QnVja2V0LmphdmE6MTA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YTozMylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5nZXQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjgzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Tk9UX0ZPVU5ELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZV9pZC5uYW1lLCBtZXNzYWdlPW51bGwsIHVubmFtZWRBcmd1bWVudHM9W119LCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2VfaWQubmFtZSwgbWVzc2FnZT1Ob3QgRm91bmQsIHJlYXNvbj1ub3RGb3VuZCwgcnBjQ29kZT00MDR9IE5vdCBGb3VuZDogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkJVQ0tFVF9OT1RfRk9VTkQ6IE5vIHN1Y2ggYnVja2V0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YToxMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5HZXRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldEJ1Y2tldC5qYXZhOjMzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmdldChCdWNrZXRzRGVsZWdhdG9yLmphdmE6ODMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IE5vIHN1Y2ggYnVja2V0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm90IEZvdW5kIn19\"\n      }\n    },\n    {\n      \"ID\": \"03b45b7eac939177\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/storage-library-test-bucket/Caf%C3%A9\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=3600\"\n          ],\n          \"Content-Length\": [\n            \"20\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:29 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"ade43306cb39336d630e101af5fb51b4\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 23:26:29 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Fri, 24 Mar 2017 20:04:38 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1490385878535828\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=fN3yZg==\",\n            \"md5=reQzBss5M21jDhAa9ftRtA==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"2\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"MULTI_REGIONAL\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"20\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpFU2KyS5OA-bAy_MovHXHg5zJZ2kznc6tgTTrSjilrNHiw0NimPHZApcRXOS_ejrSSy8nIn02xipxUWxvHM3ru5IYhJRTeBZxhlq6_XQVsATkvink\"\n          ]\n        },\n        \"Body\": \"Tm9ybWFsaXphdGlvbiBGb3JtIEM=\"\n      }\n    },\n    {\n      \"ID\": \"725883eeccd4b42c\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026prettyPrint=false\\u0026projection=full\\u0026uploadType=multipart\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"multipart/related\",\n        \"BodyParts\": [\n          \"eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoiemVybyJ9Cg==\",\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"3128\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:29 GMT\"\n          ],\n          \"Etag\": [\n            \"CKyp9oDy/eECEAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_single_post_uploads\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UruPh9tBADr1LSQWFlj1C4tjlS6uwlcy_MVRYaTGD4e_qEUlq0iXJx6ns3JHbH7I9olH7aSJpDW6VQcV5EdLwjQMecgA7qKhxzLoYFW4BZdEXbUrro\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS96ZXJvLzE1NTY4MzU5ODkyOTYzMDAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby96ZXJvIiwibmFtZSI6Inplcm8iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4OTI5NjMwMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyOS4yOTVaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MjkuMjk1WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjI5LjI5NVoiLCJzaXplIjoiMCIsIm1kNUhhc2giOiIxQjJNMlk4QXNnVHBnQW1ZN1BoQ2ZnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vemVybz9nZW5lcmF0aW9uPTE1NTY4MzU5ODkyOTYzMDAmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvemVyby8xNTU2ODM1OTg5Mjk2MzAwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3plcm8vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Inplcm8iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4OTI5NjMwMCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDS3lwOW9EeS9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvemVyby8xNTU2ODM1OTg5Mjk2MzAwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby96ZXJvL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiemVybyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg5Mjk2MzAwIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0t5cDlvRHkvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3plcm8vMTU1NjgzNTk4OTI5NjMwMC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vemVyby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Inplcm8iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4OTI5NjMwMCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDS3lwOW9EeS9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvemVyby8xNTU2ODM1OTg5Mjk2MzAwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby96ZXJvL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiemVybyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg5Mjk2MzAwIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0t5cDlvRHkvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJBQUFBQUE9PSIsImV0YWciOiJDS3lwOW9EeS9lRUNFQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"036f06773f6d6306\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0021/o?alt=json\\u0026delimiter=\\u0026pageToken=\\u0026prefix=\\u0026prettyPrint=false\\u0026projection=full\\u0026versions=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 404,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"11821\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:29 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:26:29 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"agent_rejected\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqs9uKpqdPwYRv420tAk0KmBT6DS2POPsIj39ROT-r3ymrd2SB-oOJEXuaHGOfih1ckOqp-YrvHHAh7l7A-6rwlFjoBSb4qCtWzXGPjekN0pUBIok8\"\n          ]\n        },\n        \"Body\": \"eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vdCBGb3VuZCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpCVUNLRVRfTk9UX0ZPVU5EOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkxpc3RPYmplY3RzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0T2JqZWN0cy5qYXZhOjE3MSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkxpc3RPYmplY3RzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0T2JqZWN0cy5qYXZhOjQxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmxpc3QoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPU5PVF9GT1VORCwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpCVUNLRVRfTk9UX0ZPVU5EOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkxpc3RPYmplY3RzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0T2JqZWN0cy5qYXZhOjE3MSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkxpc3RPYmplY3RzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0T2JqZWN0cy5qYXZhOjQxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmxpc3QoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPW5vdEZvdW5kLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5OT1RfRk9VTkQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpCVUNLRVRfTk9UX0ZPVU5EOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkxpc3RPYmplY3RzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0T2JqZWN0cy5qYXZhOjE3MSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkxpc3RPYmplY3RzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0T2JqZWN0cy5qYXZhOjQxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmxpc3QoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Tk9UX0ZPVU5ELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5idWNrZXQsIG1lc3NhZ2U9bnVsbCwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWVudGl0eS5idWNrZXQsIG1lc3NhZ2U9Tm90IEZvdW5kLCByZWFzb249bm90Rm91bmQsIHJwY0NvZGU9NDA0fSBOb3QgRm91bmQ6IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpCVUNLRVRfTk9UX0ZPVU5EOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkxpc3RPYmplY3RzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0T2JqZWN0cy5qYXZhOjE3MSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkxpc3RPYmplY3RzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0T2JqZWN0cy5qYXZhOjQxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmxpc3QoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwNCwibWVzc2FnZSI6Ik5vdCBGb3VuZCJ9fQ==\"\n      }\n    },\n    {\n      \"ID\": \"6b9dc540a02ed56f\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/storage-library-test-bucket/Cafe%CC%81\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"public, max-age=3600\"\n          ],\n          \"Content-Length\": [\n            \"20\"\n          ],\n          \"Content-Type\": [\n            \"text/plain\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:29 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"df597679bac7c6150429ad80a1a05680\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 23:26:29 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Fri, 24 Mar 2017 20:04:37 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1490385877705600\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=qBeWjQ==\",\n            \"md5=31l2ebrHxhUEKa2AoaBWgA==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"2\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"MULTI_REGIONAL\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"20\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrK69XFh4eDvl0RvSevMYIwMVs-nlDelMhoacS-4faSvuEateXMEqzdMvHClWdzkyqcEk7IQ1N0JMcv5uEPt6V98chYK-p9otm8puF4Uf846EBUEmg\"\n          ]\n        },\n        \"Body\": \"Tm9ybWFsaXphdGlvbiBGb3JtIEQ=\"\n      }\n    },\n    {\n      \"ID\": \"09f71762da168c2f\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/zero\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"Go-http-client/1.1\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Accept-Ranges\": [\n            \"bytes\"\n          ],\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"text/plain; charset=utf-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:29 GMT\"\n          ],\n          \"Etag\": [\n            \"\\\"d41d8cd98f00b204e9800998ecf8427e\\\"\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:26:29 GMT\"\n          ],\n          \"Last-Modified\": [\n            \"Thu, 02 May 2019 22:26:29 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"X-Goog-Expiration\": [\n            \"Sat, 01 Jun 2019 22:26:29 GMT\"\n          ],\n          \"X-Goog-Generation\": [\n            \"1556835989296300\"\n          ],\n          \"X-Goog-Hash\": [\n            \"crc32c=AAAAAA==\",\n            \"md5=1B2M2Y8AsgTpgAmY7PhCfg==\"\n          ],\n          \"X-Goog-Metageneration\": [\n            \"1\"\n          ],\n          \"X-Goog-Storage-Class\": [\n            \"STANDARD\"\n          ],\n          \"X-Goog-Stored-Content-Encoding\": [\n            \"identity\"\n          ],\n          \"X-Goog-Stored-Content-Length\": [\n            \"0\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"cloud-storage\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrL3cJhuZXF-arxiYeo4MSf1to_dAoiyMisikOum5rqnrSnFa0OZ25Sl8hUU7lcIeW6P3-dwXK6qv0yHGFYMFnUB0VYpI9BRT16gMo8ikQ_L3gBmew\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"681729281517b9c0\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/zero?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:29 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrKCNWRWyBsgMgWxsrSjXZMKW22GWVttfUWHw_UNSF7X7hnnz4h-cD7vFzaLO7OVWvnuMyW9qpJAA4eJaERT9hSjGfv41XVw_9ouvBOeIK9ykq-DrE\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"39261fa7e6e9aede\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"60\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIyIn0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"485\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:33 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpEt-jSVBZqHHBwfNkeP4NXxMdC1ISsFp2E_M6JiSw9rDj2gTnmTZhrvOn-bo_f9Lx_HMxMDgsXfO0ftWqvUjGwdmHAYNnYK5JSJozLfuosPNxv_S4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjMzLjU1N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjozMy41NTdaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"3e70965b0aa1111b\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0022?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2431\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:34 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:26:34 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrB-4r560VjwZdR64GS_7_mZDefc-iM5ma_H8KjYfrdNXt-IlkgvzShsy7iNLseN6coOnkJwWT5tLbP54_M7nMUjord_jmpb1i19SBRA_3RQ_64yys\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjMzLjU1N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjozMy41NTdaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"b80f9a99661cd572\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0022?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:34 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur4ItFRDN2_vB0_Ej095pAE061aywdVAoU_00t3fazm21R5ZLxUHpQL4ifTJ58218EkOeDBSWNaOaWuuzTnTM0DhXTe4l2X3pytOdfcZdIeyLV1rWA\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"979ffb3f3450c3d5\",\n      \"Request\": {\n        \"Method\": \"POST\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"Content-Length\": [\n            \"543\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"application/json\",\n        \"BodyParts\": [\n          \"eyJsYWJlbHMiOnsiZW1wdHkiOiIiLCJsMSI6InYxIn0sImxpZmVjeWNsZSI6eyJydWxlIjpbeyJhY3Rpb24iOnsic3RvcmFnZUNsYXNzIjoiTkVBUkxJTkUiLCJ0eXBlIjoiU2V0U3RvcmFnZUNsYXNzIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjEwLCJjcmVhdGVkQmVmb3JlIjoiMjAxNy0wMS0wMSIsImlzTGl2ZSI6ZmFsc2UsIm1hdGNoZXNTdG9yYWdlQ2xhc3MiOlsiTVVMVElfUkVHSU9OQUwiLCJTVEFOREFSRCJdLCJudW1OZXdlclZlcnNpb25zIjozfX0seyJhY3Rpb24iOnsidHlwZSI6IkRlbGV0ZSJ9LCJjb25kaXRpb24iOnsiYWdlIjozMCwiY3JlYXRlZEJlZm9yZSI6IjIwMTctMDEtMDEiLCJpc0xpdmUiOnRydWUsIm1hdGNoZXNTdG9yYWdlQ2xhc3MiOlsiTkVBUkxJTkUiXSwibnVtTmV3ZXJWZXJzaW9ucyI6MTB9fV19LCJsb2NhdGlvbiI6IlVTIiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsInN0b3JhZ2VDbGFzcyI6Ik5FQVJMSU5FIiwidmVyc2lvbmluZyI6eyJlbmFibGVkIjp0cnVlfX0K\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"926\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:34 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqM_YYHcsYolLFJJwWhO9AUYmnc3Vp3J6C5AydYOy-0RVAmBxObG8QpwZOsn28vDVllo_OZ1-4bASi_RGi4wdply2CPhzUOCVjP11XNzVYZ4_EiFb4\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjM0LjU2M1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjozNC41NjNaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOnRydWV9LCJsaWZlY3ljbGUiOnsicnVsZSI6W3siYWN0aW9uIjp7InR5cGUiOiJTZXRTdG9yYWdlQ2xhc3MiLCJzdG9yYWdlQ2xhc3MiOiJORUFSTElORSJ9LCJjb25kaXRpb24iOnsiYWdlIjoxMCwiY3JlYXRlZEJlZm9yZSI6IjIwMTctMDEtMDEiLCJpc0xpdmUiOmZhbHNlLCJtYXRjaGVzU3RvcmFnZUNsYXNzIjpbIk1VTFRJX1JFR0lPTkFMIiwiU1RBTkRBUkQiXSwibnVtTmV3ZXJWZXJzaW9ucyI6M319LHsiYWN0aW9uIjp7InR5cGUiOiJEZWxldGUifSwiY29uZGl0aW9uIjp7ImFnZSI6MzAsImNyZWF0ZWRCZWZvcmUiOiIyMDE3LTAxLTAxIiwiaXNMaXZlIjp0cnVlLCJtYXRjaGVzU3RvcmFnZUNsYXNzIjpbIk5FQVJMSU5FIl0sIm51bU5ld2VyVmVyc2lvbnMiOjEwfX1dfSwibGFiZWxzIjp7ImwxIjoidjEiLCJlbXB0eSI6IiJ9LCJzdG9yYWdlQ2xhc3MiOiJORUFSTElORSIsImV0YWciOiJDQUU9In0=\"\n      }\n    },\n    {\n      \"ID\": \"4931edd6fbd7e278\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0022?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2872\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:34 GMT\"\n          ],\n          \"Etag\": [\n            \"CAE=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:26:34 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpxOq-rTQ-0CFxAKezuPpbibtEmD_yASKzhW5dOiUdwVORx6a7_e1dmDnNCdamDPwLsBOpLueQD8iDbwlracb2uxGwwZ6yz92QD-t-JSKM-jSNp2xA\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjM0LjU2M1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjozNC41NjNaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInZlcnNpb25pbmciOnsiZW5hYmxlZCI6dHJ1ZX0sImxpZmVjeWNsZSI6eyJydWxlIjpbeyJhY3Rpb24iOnsidHlwZSI6IlNldFN0b3JhZ2VDbGFzcyIsInN0b3JhZ2VDbGFzcyI6Ik5FQVJMSU5FIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjEwLCJjcmVhdGVkQmVmb3JlIjoiMjAxNy0wMS0wMSIsImlzTGl2ZSI6ZmFsc2UsIm1hdGNoZXNTdG9yYWdlQ2xhc3MiOlsiTVVMVElfUkVHSU9OQUwiLCJTVEFOREFSRCJdLCJudW1OZXdlclZlcnNpb25zIjozfX0seyJhY3Rpb24iOnsidHlwZSI6IkRlbGV0ZSJ9LCJjb25kaXRpb24iOnsiYWdlIjozMCwiY3JlYXRlZEJlZm9yZSI6IjIwMTctMDEtMDEiLCJpc0xpdmUiOnRydWUsIm1hdGNoZXNTdG9yYWdlQ2xhc3MiOlsiTkVBUkxJTkUiXSwibnVtTmV3ZXJWZXJzaW9ucyI6MTB9fV19LCJsYWJlbHMiOnsibDEiOiJ2MSIsImVtcHR5IjoiIn0sInN0b3JhZ2VDbGFzcyI6Ik5FQVJMSU5FIiwiZXRhZyI6IkNBRT0ifQ==\"\n      }\n    },\n    {\n      \"ID\": \"12c06b5419a1fa81\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0022?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:35 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uoc24sLEBwU00YKpSYT4V6iJu3WxME2LgbyRWaYj4kX8s6Gjatzl0AWcCwPRhj_Bq0BOoUhKQzS8L0GJlhHC36eyEWEIs2rk2BcUyo0aE3U8XbuHuM\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"bf24dffbe6cb8609\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\\u0026prettyPrint=false\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"2571\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:35 GMT\"\n          ],\n          \"Etag\": [\n            \"CA0=\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:26:35 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqVkn03LSqmt8RiOPdW3JO4dpsS9vRp7VK8Qc0HwhmS3L9KDOgmyZIqLnvAwuAyvoIz1VsbqeoLwMMtz9pCIX216P4K3OpEs-x_bf_VSwMiFehgZiM\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyNS41MjdaIiwibWV0YWdlbmVyYXRpb24iOiIxMyIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQTA9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0EwPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQTA9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQTA9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOmZhbHNlfSwibGlmZWN5Y2xlIjp7InJ1bGUiOlt7ImFjdGlvbiI6eyJ0eXBlIjoiRGVsZXRlIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjMwfX1dfSwibGFiZWxzIjp7ImwxIjoidjIiLCJuZXciOiJuZXcifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0EwPSJ9\"\n      }\n    },\n    {\n      \"ID\": \"2e41eac5e693f3e1\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\\u0026delimiter=\\u0026pageToken=\\u0026prefix=\\u0026prettyPrint=false\\u0026projection=full\\u0026versions=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"64746\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:35 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:26:35 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqgGJECa6hRJfdjE3ErHERxS3HPU_SALrzjf-HIDuv4lfxMvOwrkF2pfY2jUJ3b8TcIjWcnaa85Rs4LBucKffiSWfFXcfLZMF0EuiVRj9oH6Kp4tOg\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbDEvMTU1NjgzNTg2NDI0ODE3MCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDEiLCJuYW1lIjoiYWNsMSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY0MjQ4MTcwIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjQuMjQ3WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjI1LjYyOVoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyNC4yNDdaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6IjBFOXRGTnBaajAvV0tPSjZmVjlwYXc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wxP2dlbmVyYXRpb249MTU1NjgzNTg2NDI0ODE3MCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wxLzE1NTY4MzU4NjQyNDgxNzAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMS9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYWNsMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY0MjQ4MTcwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNPcitwY1h4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wxLzE1NTY4MzU4NjQyNDgxNzAvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJhY2wxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjQyNDgxNzAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT3IrcGNYeC9lRUNFQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMS8xNTU2ODM1ODY0MjQ4MTcwL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wxL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYWNsMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY0MjQ4MTcwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPcitwY1h4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wxLzE1NTY4MzU4NjQyNDgxNzAvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDEvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJhY2wxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjQyNDgxNzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT3IrcGNYeC9lRUNFQUk9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IkZpRG1WZz09IiwiZXRhZyI6IkNPcitwY1h4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbDIvMTU1NjgzNTg2NDczNzk0NiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDIiLCJuYW1lIjoiYWNsMiIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY0NzM3OTQ2IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjQuNzM3WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjI0LjczN1oiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyNC43MzdaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6ImM5K08vcmcyNEhURkJjK2V0V2plZmc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wyP2dlbmVyYXRpb249MTU1NjgzNTg2NDczNzk0NiZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wyLzE1NTY4MzU4NjQ3Mzc5NDYvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMi9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYWNsMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY0NzM3OTQ2IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKcnh3OFh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wyLzE1NTY4MzU4NjQ3Mzc5NDYvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJhY2wyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjQ3Mzc5NDYiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSnJ4dzhYeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMi8xNTU2ODM1ODY0NzM3OTQ2L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wyL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYWNsMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY0NzM3OTQ2IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKcnh3OFh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wyLzE1NTY4MzU4NjQ3Mzc5NDYvZG9tYWluLWdvb2dsZS5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wyL2FjbC9kb21haW4tZ29vZ2xlLmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFjbDIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDczNzk0NiIsImVudGl0eSI6ImRvbWFpbi1nb29nbGUuY29tIiwicm9sZSI6IlJFQURFUiIsImRvbWFpbiI6Imdvb2dsZS5jb20iLCJldGFnIjoiQ0pyeHc4WHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbDIvMTU1NjgzNTg2NDczNzk0Ni91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFjbDIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDczNzk0NiIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKcnh3OFh4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQXROUnRBPT0iLCJldGFnIjoiQ0pyeHc4WHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0SW5Db3B5QXR0cnMvMTU1NjgzNTg4MzY2Mzg1NiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2J1Y2tldEluQ29weUF0dHJzIiwibmFtZSI6ImJ1Y2tldEluQ29weUF0dHJzIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODM2NjM4NTYiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDMuNjYzWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQzLjY2M1oiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0My42NjNaIiwic2l6ZSI6IjMiLCJtZDVIYXNoIjoickwwWTIwekMrRnp0NzJWUHpNU2syQT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2J1Y2tldEluQ29weUF0dHJzP2dlbmVyYXRpb249MTU1NjgzNTg4MzY2Mzg1NiZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRJbkNvcHlBdHRycy8xNTU2ODM1ODgzNjYzODU2L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2J1Y2tldEluQ29weUF0dHJzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJidWNrZXRJbkNvcHlBdHRycyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgzNjYzODU2IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNQQ0R4ODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRJbkNvcHlBdHRycy8xNTU2ODM1ODgzNjYzODU2L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9idWNrZXRJbkNvcHlBdHRycy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImJ1Y2tldEluQ29weUF0dHJzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODM2NjM4NTYiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDUENEeDg3eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0SW5Db3B5QXR0cnMvMTU1NjgzNTg4MzY2Mzg1Ni9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYnVja2V0SW5Db3B5QXR0cnMvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJidWNrZXRJbkNvcHlBdHRycyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgzNjYzODU2IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNQQ0R4ODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRJbkNvcHlBdHRycy8xNTU2ODM1ODgzNjYzODU2L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9idWNrZXRJbkNvcHlBdHRycy9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImJ1Y2tldEluQ29weUF0dHJzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODM2NjM4NTYiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDUENEeDg3eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Ino4U3VIUT09IiwiZXRhZyI6IkNQQ0R4ODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NoZWNrc3VtLW9iamVjdC8xNTU2ODM1ODU1OTYyMjQxIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY2hlY2tzdW0tb2JqZWN0IiwibmFtZSI6ImNoZWNrc3VtLW9iamVjdCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU1OTYyMjQxIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE1Ljk2MVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxNS45NjFaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTUuOTYxWiIsInNpemUiOiIxMCIsIm1kNUhhc2giOiIvRjREalRpbGNESUlWRUhuL25BUXNBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY2hlY2tzdW0tb2JqZWN0P2dlbmVyYXRpb249MTU1NjgzNTg1NTk2MjI0MSZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jaGVja3N1bS1vYmplY3QvMTU1NjgzNTg1NTk2MjI0MS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jaGVja3N1bS1vYmplY3QvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNoZWNrc3VtLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU1OTYyMjQxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNJR2hyTUh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jaGVja3N1bS1vYmplY3QvMTU1NjgzNTg1NTk2MjI0MS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY2hlY2tzdW0tb2JqZWN0L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY2hlY2tzdW0tb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTU5NjIyNDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSUdock1IeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY2hlY2tzdW0tb2JqZWN0LzE1NTY4MzU4NTU5NjIyNDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NoZWNrc3VtLW9iamVjdC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNoZWNrc3VtLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU1OTYyMjQxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNJR2hyTUh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jaGVja3N1bS1vYmplY3QvMTU1NjgzNTg1NTk2MjI0MS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY2hlY2tzdW0tb2JqZWN0L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY2hlY2tzdW0tb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTU5NjIyNDEiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSUdock1IeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IlZzdTBnQT09IiwiZXRhZyI6IkNJR2hyTUh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbXBvc2VkMS8xNTU2ODM1ODU4OTYyOTU3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29tcG9zZWQxIiwibmFtZSI6ImNvbXBvc2VkMSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU4OTYyOTU3IiwibWV0YWdlbmVyYXRpb24iOiIxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE4Ljk2MloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxOC45NjJaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTguOTYyWiIsInNpemUiOiI0OCIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb21wb3NlZDE/Z2VuZXJhdGlvbj0xNTU2ODM1ODU4OTYyOTU3JmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbXBvc2VkMS8xNTU2ODM1ODU4OTYyOTU3L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbXBvc2VkMS9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29tcG9zZWQxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTg5NjI5NTciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0kyMDQ4THgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbXBvc2VkMS8xNTU2ODM1ODU4OTYyOTU3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb21wb3NlZDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb21wb3NlZDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1ODk2Mjk1NyIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNJMjA0OEx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb21wb3NlZDEvMTU1NjgzNTg1ODk2Mjk1Ny9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29tcG9zZWQxL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29tcG9zZWQxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTg5NjI5NTciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0kyMDQ4THgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbXBvc2VkMS8xNTU2ODM1ODU4OTYyOTU3L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb21wb3NlZDEvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb21wb3NlZDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1ODk2Mjk1NyIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNJMjA0OEx4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQWJXQnlRPT0iLCJjb21wb25lbnRDb3VudCI6MywiZXRhZyI6IkNJMjA0OEx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbXBvc2VkMi8xNTU2ODM1ODU5NTY0Nzk5Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29tcG9zZWQyIiwibmFtZSI6ImNvbXBvc2VkMiIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU5NTY0Nzk5IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L2pzb24iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTkuNTY0WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE5LjU2NFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxOS41NjRaIiwic2l6ZSI6IjQ4IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbXBvc2VkMj9nZW5lcmF0aW9uPTE1NTY4MzU4NTk1NjQ3OTkmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29tcG9zZWQyLzE1NTY4MzU4NTk1NjQ3OTkvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29tcG9zZWQyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb21wb3NlZDIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1OTU2NDc5OSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDUCtSaU1QeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29tcG9zZWQyLzE1NTY4MzU4NTk1NjQ3OTkvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbXBvc2VkMi9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbXBvc2VkMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU5NTY0Nzk5IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ1ArUmlNUHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbXBvc2VkMi8xNTU2ODM1ODU5NTY0Nzk5L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb21wb3NlZDIvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb21wb3NlZDIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1OTU2NDc5OSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDUCtSaU1QeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29tcG9zZWQyLzE1NTY4MzU4NTk1NjQ3OTkvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbXBvc2VkMi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbXBvc2VkMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU5NTY0Nzk5IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ1ArUmlNUHgvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJBYldCeVE9PSIsImNvbXBvbmVudENvdW50IjozLCJldGFnIjoiQ1ArUmlNUHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODc0MzUyMjA3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudCIsIm5hbWUiOiJjb250ZW50IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzQzNTIyMDciLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6ImltYWdlL2pwZWciLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzQuMzUxWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM0LjM1MVoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNC4zNTFaIiwic2l6ZSI6IjU0IiwibWQ1SGFzaCI6Ik44cDgvczlGd2RBQW5sdnIvbEVBalE9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50P2dlbmVyYXRpb249MTU1NjgzNTg3NDM1MjIwNyZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzQzNTIyMDcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc0MzUyMjA3IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNNL1lqc3J4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzQzNTIyMDcvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzQzNTIyMDciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTS9ZanNyeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODc0MzUyMjA3L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc0MzUyMjA3IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNNL1lqc3J4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzQzNTIyMDcvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzQzNTIyMDciLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTS9ZanNyeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IkdvVWJzUT09IiwiZXRhZyI6IkNNL1lqc3J4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24iLCJuYW1lIjoiY3VzdG9tZXItZW5jcnlwdGlvbiIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc1MDU4NjgwIiwibWV0YWdlbmVyYXRpb24iOiIzIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM1LjA1OFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNi4yMjVaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzUuMDU4WiIsInNpemUiOiIxMSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uP2dlbmVyYXRpb249MTU1NjgzNTg3NTA1ODY4MCZhbHQ9bWVkaWEiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzUwNTg2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ1BqbnVjcngvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNQam51Y3J4L2VFQ0VBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24vYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzUwNTg2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ1BqbnVjcngvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNQam51Y3J4L2VFQ0VBTT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiZXRhZyI6IkNQam51Y3J4L2VFQ0VBTT0iLCJjdXN0b21lckVuY3J5cHRpb24iOnsiZW5jcnlwdGlvbkFsZ29yaXRobSI6IkFFUzI1NiIsImtleVNoYTI1NiI6IkgrTG1uWGhSb2VJNlRNVzVic1Y2SHlVazZweUdjMklNYnFZYkFYQmNwczA9In19LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0yLzE1NTY4MzU4ODA3MTc1MDYiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uLTIiLCJuYW1lIjoiY3VzdG9tZXItZW5jcnlwdGlvbi0yIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODA3MTc1MDYiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDAuNzE3WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQwLjcxN1oiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0MC43MTdaIiwic2l6ZSI6IjExIiwibWQ1SGFzaCI6Inh3V05GYTBWZFhQbWxBd3JsY0FKY2c9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uLTI/Z2VuZXJhdGlvbj0xNTU2ODM1ODgwNzE3NTA2JmFsdD1tZWRpYSIsImNvbnRlbnRMYW5ndWFnZSI6ImVuIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0yLzE1NTY4MzU4ODA3MTc1MDYvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0yL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uLTIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MDcxNzUwNiIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTUtaazgzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0yLzE1NTY4MzU4ODA3MTc1MDYvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMi9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgwNzE3NTA2IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ01LWms4M3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24tMi8xNTU2ODM1ODgwNzE3NTA2L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uLTIvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uLTIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MDcxNzUwNiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTUtaazgzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0yLzE1NTY4MzU4ODA3MTc1MDYvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgwNzE3NTA2IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ01LWms4M3gvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJyME5Hcmc9PSIsImV0YWciOiJDTUtaazgzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTMvMTU1NjgzNTg3OTg1OTQ0MCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMyIsIm5hbWUiOiJjdXN0b21lci1lbmNyeXB0aW9uLTMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3OTg1OTQ0MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozOS44NTlaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzkuODU5WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM5Ljg1OVoiLCJzaXplIjoiMjIiLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0zP2dlbmVyYXRpb249MTU1NjgzNTg3OTg1OTQ0MCZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTMvMTU1NjgzNTg3OTg1OTQ0MC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uLTMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc5ODU5NDQwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNQRHAzc3p4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTMvMTU1NjgzNTg3OTg1OTQ0MC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0zL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4Nzk4NTk0NDAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDUERwM3N6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0zLzE1NTY4MzU4Nzk4NTk0NDAvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc5ODU5NDQwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNQRHAzc3p4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTMvMTU1NjgzNTg3OTg1OTQ0MC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0zL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4Nzk4NTk0NDAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDUERwM3N6eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNvbXBvbmVudENvdW50IjoyLCJldGFnIjoiQ1BEcDNzengvZUVDRUFFPSIsImN1c3RvbWVyRW5jcnlwdGlvbiI6eyJlbmNyeXB0aW9uQWxnb3JpdGhtIjoiQUVTMjU2Iiwia2V5U2hhMjU2IjoiSCtMbW5YaFJvZUk2VE1XNWJzVjZIeVVrNnB5R2MySU1icVliQVhCY3BzMD0ifX0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9nemlwLXRlc3QvMTU1NjgzNTg2MDI1MTg2NyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2d6aXAtdGVzdCIsIm5hbWUiOiJnemlwLXRlc3QiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2MDI1MTg2NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24veC1nemlwIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjIwLjI1MVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyMC4yNTFaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjAuMjUxWiIsInNpemUiOiIyNyIsIm1kNUhhc2giOiJPdEN3K2FSUklScUtHRkFFT2F4K3F3PT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vZ3ppcC10ZXN0P2dlbmVyYXRpb249MTU1NjgzNTg2MDI1MTg2NyZhbHQ9bWVkaWEiLCJjb250ZW50RW5jb2RpbmciOiJnemlwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvZ3ppcC10ZXN0LzE1NTY4MzU4NjAyNTE4NjcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vZ3ppcC10ZXN0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJnemlwLXRlc3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2MDI1MTg2NyIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTnVKc3NQeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvZ3ppcC10ZXN0LzE1NTY4MzU4NjAyNTE4NjcvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2d6aXAtdGVzdC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imd6aXAtdGVzdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODYwMjUxODY3IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ051SnNzUHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2d6aXAtdGVzdC8xNTU2ODM1ODYwMjUxODY3L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9nemlwLXRlc3QvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJnemlwLXRlc3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2MDI1MTg2NyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTnVKc3NQeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvZ3ppcC10ZXN0LzE1NTY4MzU4NjAyNTE4NjcvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2d6aXAtdGVzdC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imd6aXAtdGVzdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODYwMjUxODY3IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ051SnNzUHgvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiI5RGh3QkE9PSIsImV0YWciOiJDTnVKc3NQeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9oYXNoZXNPblVwbG9hZC0xLzE1NTY4MzU4ODUwNTE2ODAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9oYXNoZXNPblVwbG9hZC0xIiwibmFtZSI6Imhhc2hlc09uVXBsb2FkLTEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NTA1MTY4MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0NS4wNTFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDUuMDUxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQ1LjA1MVoiLCJzaXplIjoiMjciLCJtZDVIYXNoIjoib2ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2hhc2hlc09uVXBsb2FkLTE/Z2VuZXJhdGlvbj0xNTU2ODM1ODg1MDUxNjgwJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NTA1MTY4MC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9oYXNoZXNPblVwbG9hZC0xL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJoYXNoZXNPblVwbG9hZC0xIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODUwNTE2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0tEZW04L3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NTA1MTY4MC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vaGFzaGVzT25VcGxvYWQtMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imhhc2hlc09uVXBsb2FkLTEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NTA1MTY4MCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNLRGVtOC94L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9oYXNoZXNPblVwbG9hZC0xLzE1NTY4MzU4ODUwNTE2ODAvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2hhc2hlc09uVXBsb2FkLTEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJoYXNoZXNPblVwbG9hZC0xIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODUwNTE2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0tEZW04L3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NTA1MTY4MC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vaGFzaGVzT25VcGxvYWQtMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imhhc2hlc09uVXBsb2FkLTEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NTA1MTY4MCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNLRGVtOC94L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiY0grQSt3PT0iLCJldGFnIjoiQ0tEZW04L3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMiLCJuYW1lIjoib2JqL3dpdGgvc2xhc2hlcyIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJ1ZXovaEo2d0FyZURRbmNjRFVkeGZnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXM/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ1NTExMDE4JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im9lbytGQT09IiwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEiLCJuYW1lIjoib2JqMSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ0NjQ3MjI1IiwibWV0YWdlbmVyYXRpb24iOiI0IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxNy4xMjFaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJTbmEvVVd2N21jWkkyM29FNXRVYWJRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMT9nZW5lcmF0aW9uPTE1NTY4MzU4NDQ2NDcyMjUmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L2RvbWFpbi1nb29nbGUuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvZG9tYWluLWdvb2dsZS5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBUT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTG5TK2J2eC9lRUNFQVE9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L2FsbFVzZXJzIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvYWxsVXNlcnMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJhbGxVc2VycyIsInJvbGUiOiJSRUFERVIiLCJldGFnIjoiQ0xuUytidngvZUVDRUFRPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJDVDZkVEE9PSIsImV0YWciOiJDTG5TK2J2eC9lRUNFQVE9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyIiwibmFtZSI6Im9iajIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiQ0Mxd2x3ck1PSXEwZHZNa015bFVoZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajI/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ1MDQ5MjQ1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoialY1QVZRPT0iLCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYy8xNTU2ODM1ODgyNzYwNjA3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYyIsIm5hbWUiOiJwb3NjIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODI3NjA2MDciLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDIuNzYwWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQyLjc2MFoiLCJzdG9yYWdlQ2xhc3MiOiJNVUxUSV9SRUdJT05BTCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0Mi43NjBaIiwic2l6ZSI6IjMiLCJtZDVIYXNoIjoickwwWTIwekMrRnp0NzJWUHpNU2syQT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2M/Z2VuZXJhdGlvbj0xNTU2ODM1ODgyNzYwNjA3JmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MvMTU1NjgzNTg4Mjc2MDYwNy9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJwb3NjIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODI3NjA2MDciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0ovemo4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MvMTU1NjgzNTg4Mjc2MDYwNy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4Mjc2MDYwNyIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNKL3pqODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wb3NjLzE1NTY4MzU4ODI3NjA2MDcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2MvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJwb3NjIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODI3NjA2MDciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0ovemo4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MvMTU1NjgzNTg4Mjc2MDYwNy91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYy9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4Mjc2MDYwNyIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKL3pqODd4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiejhTdUhRPT0iLCJldGFnIjoiQ0ovemo4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYzIvMTU1NjgzNTg4MzE1Mjc3MCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2MyIiwibmFtZSI6InBvc2MyIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODMxNTI3NzAiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDMuMTUyWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQzLjE1MloiLCJzdG9yYWdlQ2xhc3MiOiJNVUxUSV9SRUdJT05BTCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0My4xNTJaIiwic2l6ZSI6IjMiLCJtZDVIYXNoIjoiOVdHcTl1OEw4VTFDQ0x0R3BNeXpyUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2MyP2dlbmVyYXRpb249MTU1NjgzNTg4MzE1Mjc3MCZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wb3NjMi8xNTU2ODM1ODgzMTUyNzcwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2MyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJwb3NjMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgzMTUyNzcwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNJTHJwODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wb3NjMi8xNTU2ODM1ODgzMTUyNzcwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjMi9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODMxNTI3NzAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSUxycDg3eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYzIvMTU1NjgzNTg4MzE1Mjc3MC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYzIvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJwb3NjMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgzMTUyNzcwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNJTHJwODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wb3NjMi8xNTU2ODM1ODgzMTUyNzcwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjMi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODMxNTI3NzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSUxycDg3eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IjE3cUFCUT09IiwiZXRhZyI6IkNJTHJwODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3NpZ25lZFVSTC8xNTU2ODM1ODYxMTQxMjA2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc2lnbmVkVVJMIiwibmFtZSI6InNpZ25lZFVSTCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODYxMTQxMjA2IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjIxLjE0MFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyMS4xNDBaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjEuMTQwWiIsInNpemUiOiIyOSIsIm1kNUhhc2giOiJKeXh2Z3dtOW4yTXNyR1RNUGJNZVlBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc2lnbmVkVVJMP2dlbmVyYXRpb249MTU1NjgzNTg2MTE0MTIwNiZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zaWduZWRVUkwvMTU1NjgzNTg2MTE0MTIwNi9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9zaWduZWRVUkwvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNpZ25lZFVSTCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODYxMTQxMjA2IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNOYXQ2TVB4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zaWduZWRVUkwvMTU1NjgzNTg2MTE0MTIwNi9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc2lnbmVkVVJML2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoic2lnbmVkVVJMIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjExNDEyMDYiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTmF0Nk1QeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvc2lnbmVkVVJMLzE1NTY4MzU4NjExNDEyMDYvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NpZ25lZFVSTC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNpZ25lZFVSTCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODYxMTQxMjA2IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNOYXQ2TVB4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zaWduZWRVUkwvMTU1NjgzNTg2MTE0MTIwNi91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc2lnbmVkVVJML2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoic2lnbmVkVVJMIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjExNDEyMDYiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTmF0Nk1QeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IlpUcUFMdz09IiwiZXRhZyI6IkNOYXQ2TVB4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3NvbWUtb2JqZWN0LzE1NTY4MzU5ODgyNzM1MzAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9zb21lLW9iamVjdCIsIm5hbWUiOiJzb21lLW9iamVjdCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg4MjczNTMwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjI4LjI3M1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyOC4yNzNaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MjguMjczWiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJ0SGFjZlNLZkJ5QysvK2NsRzdxK2p3PT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc29tZS1vYmplY3Q/Z2VuZXJhdGlvbj0xNTU2ODM1OTg4MjczNTMwJmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3NvbWUtb2JqZWN0LzE1NTY4MzU5ODgyNzM1MzAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc29tZS1vYmplY3QvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNvbWUtb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5ODgyNzM1MzAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ1ByeXQ0RHkvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3NvbWUtb2JqZWN0LzE1NTY4MzU5ODgyNzM1MzAvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NvbWUtb2JqZWN0L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoic29tZS1vYmplY3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4ODI3MzUzMCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNQcnl0NER5L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zb21lLW9iamVjdC8xNTU2ODM1OTg4MjczNTMwL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9zb21lLW9iamVjdC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNvbWUtb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5ODgyNzM1MzAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ1ByeXQ0RHkvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3NvbWUtb2JqZWN0LzE1NTY4MzU5ODgyNzM1MzAvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NvbWUtb2JqZWN0L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoic29tZS1vYmplY3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4ODI3MzUzMCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNQcnl0NER5L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiU20xZ0t3PT0iLCJldGFnIjoiQ1ByeXQ0RHkvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvemVyby1vYmplY3QvMTU1NjgzNTg1NjUzNzAxNiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3plcm8tb2JqZWN0IiwibmFtZSI6Inplcm8tb2JqZWN0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTY1MzcwMTYiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTYuNTM2WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE2LjUzNloiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxNi41MzZaIiwic2l6ZSI6IjAiLCJtZDVIYXNoIjoiMUIyTTJZOEFzZ1RwZ0FtWTdQaENmZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3plcm8tb2JqZWN0P2dlbmVyYXRpb249MTU1NjgzNTg1NjUzNzAxNiZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS96ZXJvLW9iamVjdC8xNTU2ODM1ODU2NTM3MDE2L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3plcm8tb2JqZWN0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJ6ZXJvLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU2NTM3MDE2IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNMaXJ6OEh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS96ZXJvLW9iamVjdC8xNTU2ODM1ODU2NTM3MDE2L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby96ZXJvLW9iamVjdC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Inplcm8tb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTY1MzcwMTYiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTGlyejhIeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvemVyby1vYmplY3QvMTU1NjgzNTg1NjUzNzAxNi9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vemVyby1vYmplY3QvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJ6ZXJvLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU2NTM3MDE2IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNMaXJ6OEh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS96ZXJvLW9iamVjdC8xNTU2ODM1ODU2NTM3MDE2L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby96ZXJvLW9iamVjdC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Inplcm8tb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTY1MzcwMTYiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTGlyejhIeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IkFBQUFBQT09IiwiZXRhZyI6IkNMaXJ6OEh4L2VFQ0VBRT0ifV19\"\n      }\n    },\n    {\n      \"ID\": \"744cbe6970c9623b\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/acl1?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:35 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpfI-4jHQ7K_XJuo8cMIfOvPLKerfuQA1KlRDBi4Fq11Uc9i--oKNuFL_MbH0CCxK8PeI4r4fmZILF9hdSGAMMpMmyX0w67j7t84C4tRDx2LnbzG4I\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"a2bea52380600211\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/acl2?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:35 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrzTcVhZWJuBZITVX_K6haiVlOGb5fEYRdiiH8ODa4XsVSPl4FCDs7zPpKMTfoZA1veIMd4ccdcj8rUqWDMcRfDU5l4cOGvNhGZV-h9S2AVJfl6GdE\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"e187777c49170a6d\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/bucketInCopyAttrs?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:36 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UouPwITheFghtKlzs2vxoAGnEm_V7OZZnYkk_0pLhV8g5YN6TPRS2n1h0iAtzkuFXYtjovp3ifqt_351LO6-CobCar6VgRnJ-_EQ9WgOWhIC9DzYTs\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"653fa745ed683364\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/checksum-object?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:36 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UoBLZLK-ePmvYxO2ByvMQ1dXb_4-5yhOR-1nYkxjkINZf5fY9ptO2H4RfRtbIrRQ-QQNZHqZGgCOGJakKLkNgVI2_ExobQLkJ-JaJ-ViDWL9GZCEgU\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"91230665f80c46f7\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/composed1?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:36 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Upasg8dCwbL7dWntUy3O1t_wWVeDNNT3YCz1uVNL8QUNh4z75y0p9OfL57wFX4CUv3NV06Oi9f7a85m42BzgDZl-kqmv4com_INYmRYjKbwrTdFB8A\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"dc68e1f94de4fa2a\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/composed2?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:36 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqXdUtFVSSFIrK72haTC8pKLogl9pB4lDLpARc8oDKdNt1yfbHj4VAQH0M_Doqj1mLY2LVmThFxvG_1mvtVBm-N4x_J-c5Izq46lZh_xx3wOQEYZKQ\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"db5b5c31ef8e503e\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/content?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:36 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Ur2nVuDhUpL1-5n7rzvboeHuOBlvh-59eoy59Y5ZIyvUy6FXYj2eCphVTBFkaIPXK7XIS6DJXkPzZABjiFi4hMA7Ewdgp860sYu44qguzhTfOymXYY\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"f44103066254972d\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:36 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqul73HMDr4p6XCqdfKz99RILwd68VT50DnynneOl5m5E_a7ky2mbMA8mdM6xyAWCQtiJm8dCxvIuKYtjLavA8JUlkGIqqCLGfLbB2EvWahd55Fw_A\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"99aa9c86d4998414\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-2?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:36 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uqfk5JfeEeFo80cy1Y-OxXgzSIbt_x7qDWML2yJopIrt9DsPmRq4cDVFqg6sUFStj6aMrjxP7iu_tbwZzS_3BtnwqfPrJZvHllZ7tdeFTXLmto742o\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"24bd829460fb4df6\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-3?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:37 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UprF0LO3CObAApP8iwUO6IvC-Yh-5whtr0F_mMzaj0rltEl4C-AZjNuBMGuQUue-v9oBqb-nQU2ykIenSZ3UYnK4XVV7moFIS43VyP7pByYqsHPkMo\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"acdf7531eddfd72c\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/gzip-test?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:37 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqAEWwZD_lXrdbrjMg-PYbmLP1-zSzjESAs-osetXJrFTueJ6ufxVfA3xkMG5KjtEz-68YryfKl9gAGsgfseX6H5COwltvyW6pJSdxDdA-dTV_S8eU\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"8facd7ede0dc71a6\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/hashesOnUpload-1?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:37 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrInkaBVPO1ip6mFSpF0Nihd1wYE9HNfIz8HfFsZkiEVG1mX7eKMItsbmNwWMehWZ0qaKAf081imDi7DmKqs6mEy7vyTokMNXVUp5LrFoQ-yDfVRuc\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"6affac5f0a8dea5a\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj%2Fwith%2Fslashes?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:37 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqhbUYzZ-vUqGcyfzGFaQrr89Q05cXGCB0EbWA2Dy8dmQxB3uWJ7_FUwi6Ish-VMpOrZv78bT9qAHd5Tr5b3s8bTCX6QR9HlelvxkKdyrUv2G8QQuY\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"8258a6e1b5dc73aa\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj1?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:37 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Upola6CIBa9ONjl53PxMpFGQkHvYEau96KG2mgCmUDWDhxZKCw0T58QQRx8OIJW5sisH_acrPcg2o-LLdJgOxCtlVSw-t6wGisVL2-TSopEuezgmu4\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"12186a37ecd09333\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj2?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:37 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UpFxLaOTSsPe7hDbzBznGCoZvAUmeNgWBwS45X2j3rpLlk8_MIFFuCa-aBpAM83d23ixudKpklnhiqCcrQQotCUZhkrMLpWLHBJdmcM0d5rCKL6opY\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"e7a92beca78e4ec6\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/posc?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:37 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrpITV4ogt1-_eCsp0KFz7tVeM2A4FzSevs8Q0BPZ36nEPrP9aAaB4nfWASzLZgi2hNM1l9eFkf5UbYYWDT5J-nQFCapVNcm_4Nr43yd94Ce95SVps\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"5bb0506f3ca9135d\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/posc2?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:38 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqFBt86Wz7Oqelsb0pPpIskBYdMYLR3XuBmD2F5DwyXt84Q1AUyL0Q94YtqTJP1yzgohHCkJWSGibqUARgP8Ilv9v4lVipsdfjSdFHgIjFJ1H-vuU4\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"3ea05ac204d7a112\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/signedURL?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:38 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Up2mLLaTTO-0iqVf4m8WXPEsP-mHlaS6hz_gavjGI5yzU0jCjBNDRw1gj6Wa_cQIBzfjytwP2XYhBIJeAglwa6Uqv87WhzeqgGXt4u820FuZKVgY-w\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"bed8580dc40e850e\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/some-object?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:38 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UodR7nshMeihBskPB6loBZoNDRFEUxojhFCKhQ0NpiEMRHY0ZHU8ncI4Sr7FHUmIDXyK8xVg_I7Qt5ESrqnGmRzW0h1eM8OGfEM-3weHyzMqN-VMik\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"57489f1d9de0ddb8\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/zero-object?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:38 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UqxQ_NSeD-rrAbZXERIaDr3_1wDC_RZ4MyuFZnOhdDqLkn4qub7rAIamqSQKDD8-jbn0c3XmxvowTghxhq4tZaxxHTmYJtB_FPvJxRZtCt3Leugx4g\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"006b3176688c0ac8\",\n      \"Request\": {\n        \"Method\": \"DELETE\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\\u0026prettyPrint=false\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 204,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"no-cache, no-store, max-age=0, must-revalidate\"\n          ],\n          \"Content-Length\": [\n            \"0\"\n          ],\n          \"Content-Type\": [\n            \"application/json\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:38 GMT\"\n          ],\n          \"Expires\": [\n            \"Mon, 01 Jan 1990 00:00:00 GMT\"\n          ],\n          \"Pragma\": [\n            \"no-cache\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2Uo4l8LfaJI78MH37sa7nOmY2A8EB4paZccrewnIFFud-pwGLeVf067ZiRaBAOAPsPYlaxxtsr6gtECA6UY0xiUBHPTLFOe4VNnNQpniNWYJEfZ1-I8\"\n          ]\n        },\n        \"Body\": \"\"\n      }\n    },\n    {\n      \"ID\": \"a853ce25e734dbfd\",\n      \"Request\": {\n        \"Method\": \"GET\",\n        \"URL\": \"https://www.googleapis.com/storage/v1/b?alt=json\\u0026pageToken=\\u0026prefix=go-integration-test\\u0026prettyPrint=false\\u0026project=deklerk-sandbox\\u0026projection=full\",\n        \"Header\": {\n          \"Accept-Encoding\": [\n            \"gzip\"\n          ],\n          \"User-Agent\": [\n            \"google-api-go-client/0.5\"\n          ]\n        },\n        \"MediaType\": \"\",\n        \"BodyParts\": [\n          \"\"\n        ]\n      },\n      \"Response\": {\n        \"StatusCode\": 200,\n        \"Proto\": \"HTTP/1.1\",\n        \"ProtoMajor\": 1,\n        \"ProtoMinor\": 1,\n        \"Header\": {\n          \"Alt-Svc\": [\n            \"quic=\\\":443\\\"; ma=2592000; v=\\\"46,44,43,39\\\"\"\n          ],\n          \"Cache-Control\": [\n            \"private, max-age=0, must-revalidate, no-transform\"\n          ],\n          \"Content-Length\": [\n            \"47300\"\n          ],\n          \"Content-Type\": [\n            \"application/json; charset=UTF-8\"\n          ],\n          \"Date\": [\n            \"Thu, 02 May 2019 22:26:39 GMT\"\n          ],\n          \"Expires\": [\n            \"Thu, 02 May 2019 22:26:39 GMT\"\n          ],\n          \"Server\": [\n            \"UploadServer\"\n          ],\n          \"Vary\": [\n            \"Origin\",\n            \"X-Origin\"\n          ],\n          \"X-Guploader-Customer\": [\n            \"apiary_cloudstorage_metadata\"\n          ],\n          \"X-Guploader-Request-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Upload-Result\": [\n            \"success\"\n          ],\n          \"X-Guploader-Uploadid\": [\n            \"AEnB2UrnXhEY-kWgvl-XqP1kXnVDpQphHD9znE-EyBBlFT-kHZtXEsAW5QG5PuzlaJPfQUwZqnTHP0wxu6YDbRCgDMB31UR760_lfEiX88PtVKIdTgCWm5A\"\n          ]\n        },\n        \"Body\": \"eyJraW5kIjoic3RvcmFnZSNidWNrZXRzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjU5NzcwNTEzMzE0Ni0wMDAxIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjU5NzcwNTEzMzE0Ni0wMDAxIiwicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsIm5hbWUiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NTk3NzA1MTMzMTQ2LTAwMDEiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMTg6Mjk6NTguNjAxWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDE4OjI5OjU4LjYwMVoiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY1OTc3MDUxMzMxNDYtMDAwMS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NTk3NzA1MTMzMTQ2LTAwMDEvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY1OTc3MDUxMzMxNDYtMDAwMSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NTk3NzA1MTMzMTQ2LTAwMDEvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY1OTc3MDUxMzMxNDYtMDAwMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY1OTc3MDUxMzMxNDYtMDAwMSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY1OTc3MDUxMzMxNDYtMDAwMS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjU5NzcwNTEzMzE0Ni0wMDAxL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjU5NzcwNTEzMzE0Ni0wMDAxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImRlZmF1bHRPYmplY3RBY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FFPSJ9XSwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sIm93bmVyIjp7ImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCJ9LCJsb2NhdGlvbiI6IlVTIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NjExNTA2OTA3NjAyLTAwMDEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NjExNTA2OTA3NjAyLTAwMDEiLCJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY2MTE1MDY5MDc2MDItMDAwMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQxODozMDoxMi4yNjRaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMTg6MzA6MTIuMjY0WiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjYxMTUwNjkwNzYwMi0wMDAxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY2MTE1MDY5MDc2MDItMDAwMS9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjYxMTUwNjkwNzYwMi0wMDAxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY2MTE1MDY5MDc2MDItMDAwMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjYxMTUwNjkwNzYwMi0wMDAxL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjYxMTUwNjkwNzYwMi0wMDAxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjYxMTUwNjkwNzYwMi0wMDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NjExNTA2OTA3NjAyLTAwMDEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NjExNTA2OTA3NjAyLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FFPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY2MzM5NjU0MjA4MTgtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY2MzM5NjU0MjA4MTgtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjYzMzk2NTQyMDgxOC0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDE4OjMwOjM0LjY2MloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQxODozMDozNC42NjJaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NjMzOTY1NDIwODE4LTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjYzMzk2NTQyMDgxOC0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NjMzOTY1NDIwODE4LTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjYzMzk2NTQyMDgxOC0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NjMzOTY1NDIwODE4LTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NjMzOTY1NDIwODE4LTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NjMzOTY1NDIwODE4LTAwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY2MzM5NjU0MjA4MTgtMDAwMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY2MzM5NjU0MjA4MTgtMDAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03ODI5NDExMzUxNDUxOS0wMDAxIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03ODI5NDExMzUxNDUxOS0wMDAxIiwicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsIm5hbWUiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc4Mjk0MTEzNTE0NTE5LTAwMDEiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjE6NDQ6NTQuOTYwWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIxOjQ0OjU0Ljk2MFoiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzgyOTQxMTM1MTQ1MTktMDAwMS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc4Mjk0MTEzNTE0NTE5LTAwMDEvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzgyOTQxMTM1MTQ1MTktMDAwMSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc4Mjk0MTEzNTE0NTE5LTAwMDEvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzgyOTQxMTM1MTQ1MTktMDAwMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzgyOTQxMTM1MTQ1MTktMDAwMSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzgyOTQxMTM1MTQ1MTktMDAwMS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03ODI5NDExMzUxNDUxOS0wMDAxL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03ODI5NDExMzUxNDUxOS0wMDAxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImRlZmF1bHRPYmplY3RBY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FFPSJ9XSwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sIm93bmVyIjp7ImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCJ9LCJsb2NhdGlvbiI6IlVTIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5Mzg1MTMzMzgyODI1LTAwMTciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5Mzg1MTMzMzgyODI1LTAwMTciLCJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzkzODUxMzMzODI4MjUtMDAxNyIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjowNTozNC4zNzVaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MDU6MzYuMzQxWiIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTM4NTEzMzM4MjgyNS0wMDE3L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzkzODUxMzMzODI4MjUtMDAxNy9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTM4NTEzMzM4MjgyNS0wMDE3IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzkzODUxMzMzODI4MjUtMDAxNy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTM4NTEzMzM4MjgyNS0wMDE3L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTM4NTEzMzM4MjgyNS0wMDE3IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTM4NTEzMzM4MjgyNS0wMDE3L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5Mzg1MTMzMzgyODI1LTAwMTcvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5Mzg1MTMzMzgyODI1LTAwMTciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FJPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiOTAwMDAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjowNTozNC4zNzVaIiwiaXNMb2NrZWQiOnRydWV9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzkzODUxMzMzODI4MjUtMDAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzkzODUxMzMzODI4MjUtMDAxOCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTM4NTEzMzM4MjgyNS0wMDE4IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjA1OjM3LjczM1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjowNTozNy43MzNaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5Mzg1MTMzMzgyODI1LTAwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTM4NTEzMzM4MjgyNS0wMDE4L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5Mzg1MTMzMzgyODI1LTAwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTM4NTEzMzM4MjgyNS0wMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5Mzg1MTMzMzgyODI1LTAwMTgvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5Mzg1MTMzMzgyODI1LTAwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5Mzg1MTMzMzgyODI1LTAwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzkzODUxMzMzODI4MjUtMDAxOC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzkzODUxMzMzODI4MjUtMDAxOCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiI5MDAwMCIsImVmZmVjdGl2ZVRpbWUiOiIyMDE5LTA1LTAyVDIyOjA1OjM3LjczM1oifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTExNTk1OTI0OTAzLTAwMDEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTExNTk1OTI0OTAzLTAwMDEiLCJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5MTE1OTU5MjQ5MDMtMDAwMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoxMTo1Mi4zNThaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MTE6NTIuMzU4WiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkxMTU5NTkyNDkwMy0wMDAxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5MTE1OTU5MjQ5MDMtMDAwMS9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkxMTU5NTkyNDkwMy0wMDAxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5MTE1OTU5MjQ5MDMtMDAwMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkxMTU5NTkyNDkwMy0wMDAxL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkxMTU5NTkyNDkwMy0wMDAxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkxMTU5NTkyNDkwMy0wMDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTExNTk1OTI0OTAzLTAwMDEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTExNTk1OTI0OTAzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FFPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5Mjg3Mjc5ODIzOTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5Mjg3Mjc5ODIzOTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjEyOjA5LjcwNloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoxMzo0MS42MzRaIiwibWV0YWdlbmVyYXRpb24iOiIxMyIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQTA9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMDEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0EwPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQTA9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQTA9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOmZhbHNlfSwibGlmZWN5Y2xlIjp7InJ1bGUiOlt7ImFjdGlvbiI6eyJ0eXBlIjoiRGVsZXRlIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjMwfX1dfSwibGFiZWxzIjp7ImwxIjoidjIiLCJuZXciOiJuZXcifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMTciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMTciLCJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5Mjg3Mjc5ODIzOTMtMDAxNyIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoxNDoxNy40ODZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MTQ6MTguOTA1WiIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDE3L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5Mjg3Mjc5ODIzOTMtMDAxNy9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDE3IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5Mjg3Mjc5ODIzOTMtMDAxNy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDE3L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDE3IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDE3L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMTcvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMTciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FJPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiOTAwMDAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoxNDoxNy40ODZaIiwiaXNMb2NrZWQiOnRydWV9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5Mjg3Mjc5ODIzOTMtMDAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5Mjg3Mjc5ODIzOTMtMDAxOCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDE4IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjE0OjIwLjEwNVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoxNDoyMC4xMDVaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDE4L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMTgvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5Mjg3Mjc5ODIzOTMtMDAxOC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5Mjg3Mjc5ODIzOTMtMDAxOCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiI5MDAwMCIsImVmZmVjdGl2ZVRpbWUiOiIyMDE5LTA1LTAyVDIyOjE0OjIwLjEwNVoifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzI2NTg5NDAzNDQ2LTAwMDEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzI2NTg5NDAzNDQ2LTAwMDEiLCJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMjY1ODk0MDM0NDYtMDAwMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoxODo0Ny4zOThaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MTg6NDcuMzk4WiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMyNjU4OTQwMzQ0Ni0wMDAxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMjY1ODk0MDM0NDYtMDAwMS9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMyNjU4OTQwMzQ0Ni0wMDAxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMjY1ODk0MDM0NDYtMDAwMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMyNjU4OTQwMzQ0Ni0wMDAxL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMyNjU4OTQwMzQ0Ni0wMDAxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMyNjU4OTQwMzQ0Ni0wMDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzI2NTg5NDAzNDQ2LTAwMDEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzI2NTg5NDAzNDQ2LTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FFPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMjY1ODk0MDM0NDYtMDAwMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMjY1ODk0MDM0NDYtMDAwMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMyNjU4OTQwMzQ0Ni0wMDAyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjE4OjQ4LjExNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoxODo0OC4xMTRaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzI2NTg5NDAzNDQ2LTAwMDIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMyNjU4OTQwMzQ0Ni0wMDAyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzI2NTg5NDAzNDQ2LTAwMDIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMyNjU4OTQwMzQ0Ni0wMDAyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzI2NTg5NDAzNDQ2LTAwMDIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzI2NTg5NDAzNDQ2LTAwMDIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzI2NTg5NDAzNDQ2LTAwMDIvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMjY1ODk0MDM0NDYtMDAwMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMjY1ODk0MDM0NDYtMDAwMiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMzMzk1NTMwMzUzOS0wMDAxIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMzMzk1NTMwMzUzOS0wMDAxIiwicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsIm5hbWUiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzMzOTU1MzAzNTM5LTAwMDEiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MTg6NTQuNzAxWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjE4OjU0LjcwMVoiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMzM5NTUzMDM1MzktMDAwMS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzMzOTU1MzAzNTM5LTAwMDEvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMzM5NTUzMDM1MzktMDAwMSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzMzOTU1MzAzNTM5LTAwMDEvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMzM5NTUzMDM1MzktMDAwMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMzM5NTUzMDM1MzktMDAwMSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMzM5NTUzMDM1MzktMDAwMS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMzMzk1NTMwMzUzOS0wMDAxL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMzMzk1NTMwMzUzOS0wMDAxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImRlZmF1bHRPYmplY3RBY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FFPSJ9XSwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sIm93bmVyIjp7ImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCJ9LCJsb2NhdGlvbiI6IlVTIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzMzOTU1MzAzNTM5LTAwMDIiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzMzOTU1MzAzNTM5LTAwMDIiLCJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMzM5NTUzMDM1MzktMDAwMiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoxODo1NS4yOTNaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MTg6NTUuMjkzWiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMzMzk1NTMwMzUzOS0wMDAyL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMzM5NTUzMDM1MzktMDAwMi9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMzMzk1NTMwMzUzOS0wMDAyIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMzM5NTUzMDM1MzktMDAwMi9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMzMzk1NTMwMzUzOS0wMDAyL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMzMzk1NTMwMzUzOS0wMDAyIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMzMzk1NTMwMzUzOS0wMDAyL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzMzOTU1MzAzNTM5LTAwMDIvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzMzOTU1MzAzNTM5LTAwMDIiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FFPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA0NDU4MzA0MzA4MDgtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA0NDU4MzA0MzA4MDgtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIwOjQ2Ljg5N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMjowNy40MjlaIiwibWV0YWdlbmVyYXRpb24iOiIxMyIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQTA9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMDEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0EwPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQTA9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQTA9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOmZhbHNlfSwibGlmZWN5Y2xlIjp7InJ1bGUiOlt7ImFjdGlvbiI6eyJ0eXBlIjoiRGVsZXRlIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjMwfX1dfSwibGFiZWxzIjp7Im5ldyI6Im5ldyIsImwxIjoidjIifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMTciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMTciLCJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA0NDU4MzA0MzA4MDgtMDAxNyIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMjo1MC40MjhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjI6NTEuOTM1WiIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDE3L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA0NDU4MzA0MzA4MDgtMDAxNy9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDE3IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA0NDU4MzA0MzA4MDgtMDAxNy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDE3L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDE3IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDE3L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMTcvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMTciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FJPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiOTAwMDAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyMjo1MC40MjhaIiwiaXNMb2NrZWQiOnRydWV9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA0NDU4MzA0MzA4MDgtMDAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA0NDU4MzA0MzA4MDgtMDAxOCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDE4IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIyOjUyLjk2MloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMjo1Mi45NjJaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDE4L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMTgvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA0NDU4MzA0MzA4MDgtMDAxOC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA0NDU4MzA0MzA4MDgtMDAxOCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiI5MDAwMCIsImVmZmVjdGl2ZVRpbWUiOiIyMDE5LTA1LTAyVDIyOjIyOjUyLjk2MloifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTciLCJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjowMS45MDhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MDMuNTQ0WiIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNy9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FJPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiOTAwMDAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyNjowMS45MDhaIiwiaXNMb2NrZWQiOnRydWV9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE4IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE1LjA5N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxNS4wOTdaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE4L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTgvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiI5MDAwMCIsImVmZmVjdGl2ZVRpbWUiOiIyMDE5LTA1LTAyVDIyOjI2OjE1LjA5N1oifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9XX0=\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/trace.go",
    "content": "// Copyright 2025 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\n\tinternalTrace \"cloud.google.com/go/internal/trace\"\n\t\"cloud.google.com/go/storage/internal\"\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\totelcodes \"go.opentelemetry.io/otel/codes\"\n\t\"go.opentelemetry.io/otel/trace\"\n)\n\nconst (\n\tstorageOtelTracingDevVar = \"GO_STORAGE_DEV_OTEL_TRACING\"\n\tdefaultTracerName        = \"cloud.google.com/go/storage\"\n\tgcpClientRepo            = \"googleapis/google-cloud-go\"\n\tgcpClientArtifact        = \"cloud.google.com/go/storage\"\n)\n\n// isOTelTracingDevEnabled checks the development flag until experimental feature is launched.\n// TODO: Remove development flag upon experimental launch.\nfunc isOTelTracingDevEnabled() bool {\n\treturn os.Getenv(storageOtelTracingDevVar) == \"true\"\n}\n\nfunc tracer() trace.Tracer {\n\treturn otel.Tracer(defaultTracerName, trace.WithInstrumentationVersion(internal.Version))\n}\n\n// startSpan creates a span and a context.Context containing the newly-created span.\n// If the context.Context provided in `ctx` contains a span then the newly-created\n// span will be a child of that span, otherwise it will be a root span.\nfunc startSpan(ctx context.Context, name string, opts ...trace.SpanStartOption) (context.Context, trace.Span) {\n\tname = appendPackageName(name)\n\t// TODO: Remove internalTrace upon experimental launch.\n\tif !isOTelTracingDevEnabled() {\n\t\tctx = internalTrace.StartSpan(ctx, name)\n\t\treturn ctx, nil\n\t}\n\topts = append(opts, getCommonTraceOptions()...)\n\tctx, span := tracer().Start(ctx, name, opts...)\n\treturn ctx, span\n}\n\n// endSpan retrieves the current span from ctx and completes the span.\n// If an error occurs, the error is recorded as an exception span event for this span,\n// and the span status is set in the form of a code and a description.\nfunc endSpan(ctx context.Context, err error) {\n\t// TODO: Remove internalTrace upon experimental launch.\n\tif !isOTelTracingDevEnabled() {\n\t\tinternalTrace.EndSpan(ctx, err)\n\t} else {\n\t\tspan := trace.SpanFromContext(ctx)\n\t\tif err != nil {\n\t\t\tspan.SetStatus(otelcodes.Error, err.Error())\n\t\t\tspan.RecordError(err)\n\t\t}\n\t\tspan.End()\n\t}\n}\n\n// getCommonTraceOptions makes a SpanStartOption with common attributes.\nfunc getCommonTraceOptions() []trace.SpanStartOption {\n\topts := []trace.SpanStartOption{\n\t\ttrace.WithAttributes(getCommonAttributes()...),\n\t}\n\treturn opts\n}\n\n// getCommonAttributes includes the common attributes used for Cloud Trace adoption tracking.\nfunc getCommonAttributes() []attribute.KeyValue {\n\treturn []attribute.KeyValue{\n\t\tattribute.String(\"gcp.client.version\", internal.Version),\n\t\tattribute.String(\"gcp.client.repo\", gcpClientRepo),\n\t\tattribute.String(\"gcp.client.artifact\", gcpClientArtifact),\n\t}\n}\n\nfunc appendPackageName(spanName string) string {\n\treturn fmt.Sprintf(\"%s.%s\", gcpClientArtifact, spanName)\n}\n"
  },
  {
    "path": "vendor/cloud.google.com/go/storage/writer.go",
    "content": "// Copyright 2014 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage storage\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"sync\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"cloud.google.com/go/internal/trace\"\n)\n\n// A Writer writes a Cloud Storage object.\ntype Writer struct {\n\t// ObjectAttrs are optional attributes to set on the object. Any attributes\n\t// must be initialized before the first Write call. Nil or zero-valued\n\t// attributes are ignored.\n\tObjectAttrs\n\n\t// SendCRC32C specifies whether to transmit a CRC32C field. It should be set\n\t// to true in addition to setting the Writer's CRC32C field, because zero\n\t// is a valid CRC and normally a zero would not be transmitted.\n\t// If a CRC32C is sent, and the data written does not match the checksum,\n\t// the write will be rejected.\n\t//\n\t// Note: SendCRC32C must be set to true BEFORE the first call to\n\t// Writer.Write() in order to send the checksum. If it is set after that\n\t// point, the checksum will be ignored.\n\tSendCRC32C bool\n\n\t// ChunkSize controls the maximum number of bytes of the object that the\n\t// Writer will attempt to send to the server in a single request. Objects\n\t// smaller than the size will be sent in a single request, while larger\n\t// objects will be split over multiple requests. The value will be rounded up\n\t// to the nearest multiple of 256K. The default ChunkSize is 16MiB.\n\t//\n\t// Each Writer will internally allocate a buffer of size ChunkSize. This is\n\t// used to buffer input data and allow for the input to be sent again if a\n\t// request must be retried.\n\t//\n\t// If you upload small objects (< 16MiB), you should set ChunkSize\n\t// to a value slightly larger than the objects' sizes to avoid memory bloat.\n\t// This is especially important if you are uploading many small objects\n\t// concurrently. See\n\t// https://cloud.google.com/storage/docs/json_api/v1/how-tos/upload#size\n\t// for more information about performance trade-offs related to ChunkSize.\n\t//\n\t// If ChunkSize is set to zero, chunking will be disabled and the object will\n\t// be uploaded in a single request without the use of a buffer. This will\n\t// further reduce memory used during uploads, but will also prevent the writer\n\t// from retrying in case of a transient error from the server or resuming an\n\t// upload that fails midway through, since the buffer is required in order to\n\t// retry the failed request.\n\t//\n\t// ChunkSize must be set before the first Write call.\n\tChunkSize int\n\n\t// ChunkRetryDeadline sets a per-chunk retry deadline for multi-chunk\n\t// resumable uploads.\n\t//\n\t// For uploads of larger files, the Writer will attempt to retry if the\n\t// request to upload a particular chunk fails with a transient error.\n\t// If a single chunk has been attempting to upload for longer than this\n\t// deadline and the request fails, it will no longer be retried, and the\n\t// error will be returned to the caller. This is only applicable for files\n\t// which are large enough to require a multi-chunk resumable upload. The\n\t// default value is 32s. Users may want to pick a longer deadline if they\n\t// are using larger values for ChunkSize or if they expect to have a slow or\n\t// unreliable internet connection.\n\t//\n\t// To set a deadline on the entire upload, use context timeout or\n\t// cancellation.\n\tChunkRetryDeadline time.Duration\n\n\t// ChunkTransferTimeout sets a per-chunk request timeout for resumable uploads.\n\t//\n\t// For resumable uploads, the Writer will terminate the request and attempt\n\t// a retry if the request to upload a particular chunk stalls for longer than\n\t// this duration. Retries may continue until the ChunkRetryDeadline is reached.\n\t//\n\t// ChunkTransferTimeout is not applicable to uploads made using a gRPC client.\n\t//\n\t// The default value is no timeout.\n\tChunkTransferTimeout time.Duration\n\n\t// ForceEmptyContentType is an optional parameter that is used to disable\n\t// auto-detection of Content-Type. By default, if a blank Content-Type\n\t// is provided, then gax.DetermineContentType is called to sniff the type.\n\tForceEmptyContentType bool\n\n\t// Append is a parameter to indicate whether the writer should use appendable\n\t// object semantics for the new object generation. Appendable objects are\n\t// visible on the first Write() call, and can be appended to until they are\n\t// finalized. If Writer.FinalizeOnClose is set to true, the object is finalized\n\t// when Writer.Close() is called; otherwise, the object is left unfinalized\n\t// and can be appended to later.\n\t//\n\t// Defaults to false unless the experiemental WithZonalBucketAPIs option was\n\t// set.\n\t//\n\t// Append is only supported for gRPC. This feature is in preview and is not\n\t// yet available for general use.\n\tAppend bool\n\n\t// FinalizeOnClose indicates whether the Writer should finalize an object when\n\t// closing the write stream. This only applies to Writers where Append is\n\t// true, since append semantics allow a prefix of the object to be durable and\n\t// readable. By default, objects written with Append semantics will not be\n\t// finalized, which means they can be appended to later. If Append is set\n\t// to false, this parameter will be ignored; non-appendable objects will\n\t// always be finalized when Writer.Close returns without error.\n\t//\n\t// This feature is in preview and is not yet available for general use.\n\tFinalizeOnClose bool\n\n\t// ProgressFunc can be used to monitor the progress of a large write\n\t// operation. If ProgressFunc is not nil and writing requires multiple\n\t// calls to the underlying service (see\n\t// https://cloud.google.com/storage/docs/json_api/v1/how-tos/resumable-upload),\n\t// then ProgressFunc will be invoked after each call with the number of bytes of\n\t// content copied so far.\n\t//\n\t// ProgressFunc should return quickly without blocking.\n\tProgressFunc func(int64)\n\n\tctx context.Context\n\to   *ObjectHandle\n\n\topened bool\n\tclosed bool\n\tpw     *io.PipeWriter\n\n\tdonec chan struct{} // closed after err and obj are set.\n\tobj   *ObjectAttrs\n\n\tmu             sync.Mutex\n\terr            error\n\tflush          func() (int64, error)\n\ttakeoverOffset int64 // offset from which the writer started appending to the object.\n}\n\n// Write appends to w. It implements the io.Writer interface.\n//\n// Since writes happen asynchronously, Write may return a nil\n// error even though the write failed (or will fail). Always\n// use the error returned from Writer.Close to determine if\n// the upload was successful.\n//\n// Writes will be retried on transient errors from the server, unless\n// Writer.ChunkSize has been set to zero.\nfunc (w *Writer) Write(p []byte) (n int, err error) {\n\tw.mu.Lock()\n\twerr := w.err\n\tw.mu.Unlock()\n\tif werr != nil {\n\t\treturn 0, werr\n\t}\n\tif !w.opened {\n\t\tif err := w.openWriter(); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t}\n\tn, err = w.pw.Write(p)\n\tif err != nil {\n\t\tw.mu.Lock()\n\t\twerr := w.err\n\t\tw.mu.Unlock()\n\t\t// Preserve existing functionality that when context is canceled, Write will return\n\t\t// context.Canceled instead of \"io: read/write on closed pipe\". This hides the\n\t\t// pipe implementation detail from users and makes Write seem as though it's an RPC.\n\t\tif errors.Is(werr, context.Canceled) || errors.Is(werr, context.DeadlineExceeded) {\n\t\t\treturn n, werr\n\t\t}\n\t}\n\treturn n, err\n}\n\n// Flush syncs all bytes currently in the Writer's buffer to Cloud Storage.\n// It returns the offset of bytes that have been currently synced to\n// Cloud Storage and an error.\n//\n// If Flush is never called, Writer will sync data automatically every\n// [Writer.ChunkSize] bytes and on [Writer.Close].\n//\n// [Writer.ProgressFunc] will be called on Flush if present.\n//\n// Do not call Flush concurrently with Write or Close. A single Writer is not\n// safe for unsynchronized use across threads.\n//\n// Note that calling Flush very early (before 512 bytes) may interfere with\n// automatic content sniffing in the Writer.\n//\n// Flush is supported only on gRPC clients where [Writer.Append] is set\n// to true. This feature is in preview and is not yet available for general use.\nfunc (w *Writer) Flush() (int64, error) {\n\t// Return error if Append is not true.\n\tif !w.Append {\n\t\treturn 0, errors.New(\"storage: Flush not supported unless client uses gRPC and Append is set to true\")\n\t}\n\tif w.closed {\n\t\treturn 0, errors.New(\"storage: Flush called on closed Writer\")\n\t}\n\t// Return error if already in error state.\n\tw.mu.Lock()\n\twerr := w.err\n\tw.mu.Unlock()\n\tif werr != nil {\n\t\treturn 0, werr\n\t}\n\t// If Flush called before any bytes written, it should start the upload\n\t// at zero bytes. This will make the object visible with zero length data.\n\tif !w.opened {\n\t\terr := w.openWriter()\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tw.progress(0)\n\t}\n\n\treturn w.flush()\n}\n\n// Close completes the write operation and flushes any buffered data.\n// If Close doesn't return an error, metadata about the written object\n// can be retrieved by calling Attrs.\nfunc (w *Writer) Close() error {\n\tif !w.opened {\n\t\tif err := w.openWriter(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Closing either the read or write causes the entire pipe to close.\n\tif err := w.pw.Close(); err != nil {\n\t\treturn err\n\t}\n\n\t<-w.donec\n\tw.closed = true\n\tw.mu.Lock()\n\tdefer w.mu.Unlock()\n\ttrace.EndSpan(w.ctx, w.err)\n\treturn w.err\n}\n\nfunc (w *Writer) openWriter() (err error) {\n\tif err := w.validateWriteAttrs(); err != nil {\n\t\treturn err\n\t}\n\tif w.o.gen != defaultGen && !w.Append {\n\t\treturn fmt.Errorf(\"storage: generation supported on Writer for appendable objects only, got %v\", w.o.gen)\n\t}\n\n\tisIdempotent := w.o.conds != nil && (w.o.conds.GenerationMatch >= 0 || w.o.conds.DoesNotExist)\n\topts := makeStorageOpts(isIdempotent, w.o.retry, w.o.userProject)\n\tparams := &openWriterParams{\n\t\tctx:                  w.ctx,\n\t\tchunkSize:            w.ChunkSize,\n\t\tchunkRetryDeadline:   w.ChunkRetryDeadline,\n\t\tchunkTransferTimeout: w.ChunkTransferTimeout,\n\t\tbucket:               w.o.bucket,\n\t\tattrs:                &w.ObjectAttrs,\n\t\tconds:                w.o.conds,\n\t\tappendGen:            w.o.gen,\n\t\tencryptionKey:        w.o.encryptionKey,\n\t\tsendCRC32C:           w.SendCRC32C,\n\t\tappend:               w.Append,\n\t\tfinalizeOnClose:      w.FinalizeOnClose,\n\t\tdonec:                w.donec,\n\t\tsetError:             w.error,\n\t\tprogress:             w.progress,\n\t\tsetObj:               func(o *ObjectAttrs) { w.obj = o },\n\t\tsetFlush:             func(f func() (int64, error)) { w.flush = f },\n\t\tsetSize: func(n int64) {\n\t\t\tif w.obj != nil {\n\t\t\t\tw.obj.Size = n\n\t\t\t}\n\t\t},\n\t\tsetPipeWriter:         func(pw *io.PipeWriter) { w.pw = pw },\n\t\tsetTakeoverOffset:     func(n int64) { w.takeoverOffset = n },\n\t\tforceEmptyContentType: w.ForceEmptyContentType,\n\t}\n\tif err := w.ctx.Err(); err != nil {\n\t\treturn err // short-circuit\n\t}\n\tw.pw, err = w.o.c.tc.OpenWriter(params, opts...)\n\tif err != nil {\n\t\treturn err\n\t}\n\tw.opened = true\n\tgo w.monitorCancel()\n\n\treturn nil\n}\n\n// monitorCancel is intended to be used as a background goroutine. It monitors the\n// context, and when it observes that the context has been canceled, it manually\n// closes things that do not take a context.\nfunc (w *Writer) monitorCancel() {\n\tselect {\n\tcase <-w.ctx.Done():\n\t\tw.mu.Lock()\n\t\twerr := w.ctx.Err()\n\t\tw.err = werr\n\t\tw.mu.Unlock()\n\n\t\t// Closing either the read or write causes the entire pipe to close.\n\t\tw.CloseWithError(werr)\n\tcase <-w.donec:\n\t}\n}\n\n// CloseWithError aborts the write operation with the provided error.\n// CloseWithError always returns nil.\n//\n// Deprecated: cancel the context passed to NewWriter instead.\nfunc (w *Writer) CloseWithError(err error) error {\n\tif !w.opened {\n\t\treturn nil\n\t}\n\treturn w.pw.CloseWithError(err)\n}\n\n// Attrs returns metadata about a successfully-written object.\n// It's only valid to call it after Close returns nil.\nfunc (w *Writer) Attrs() *ObjectAttrs {\n\treturn w.obj\n}\n\nfunc (w *Writer) validateWriteAttrs() error {\n\tattrs := w.ObjectAttrs\n\t// Check the developer didn't change the object Name (this is unfortunate, but\n\t// we don't want to store an object under the wrong name).\n\tif attrs.Name != w.o.object {\n\t\treturn fmt.Errorf(\"storage: Writer.Name %q does not match object name %q\", attrs.Name, w.o.object)\n\t}\n\tif !utf8.ValidString(attrs.Name) {\n\t\treturn fmt.Errorf(\"storage: object name %q is not valid UTF-8\", attrs.Name)\n\t}\n\tif attrs.KMSKeyName != \"\" && w.o.encryptionKey != nil {\n\t\treturn errors.New(\"storage: cannot use KMSKeyName with a customer-supplied encryption key\")\n\t}\n\tif w.ChunkSize < 0 {\n\t\treturn errors.New(\"storage: Writer.ChunkSize must be non-negative\")\n\t}\n\treturn nil\n}\n\n// progress is a convenience wrapper that reports write progress to the Writer\n// ProgressFunc if it is set.\nfunc (w *Writer) progress(p int64) {\n\tif w.ProgressFunc != nil {\n\t\tw.ProgressFunc(p)\n\t}\n}\n\n// error acquires the Writer's lock, sets the Writer's err to the given error,\n// then relinquishes the lock.\nfunc (w *Writer) error(err error) {\n\tw.mu.Lock()\n\tw.err = err\n\tw.mu.Unlock()\n}\n"
  },
  {
    "path": "vendor/dario.cat/mergo/.deepsource.toml",
    "content": "version = 1\n\ntest_patterns = [\n  \"*_test.go\"\n]\n\n[[analyzers]]\nname = \"go\"\nenabled = true\n\n  [analyzers.meta]\n  import_path = \"dario.cat/mergo\""
  },
  {
    "path": "vendor/dario.cat/mergo/.gitignore",
    "content": "#### joe made this: http://goel.io/joe\n\n#### go ####\n# Binaries for programs and plugins\n*.exe\n*.dll\n*.so\n*.dylib\n\n# Test binary, build with `go test -c`\n*.test\n\n# Output of the go coverage tool, specifically when used with LiteIDE\n*.out\n\n# Golang/Intellij\n.idea\n\n# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736\n.glide/\n\n#### vim ####\n# Swap\n[._]*.s[a-v][a-z]\n[._]*.sw[a-p]\n[._]s[a-v][a-z]\n[._]sw[a-p]\n\n# Session\nSession.vim\n\n# Temporary\n.netrwhist\n*~\n# Auto-generated tag files\ntags\n"
  },
  {
    "path": "vendor/dario.cat/mergo/.travis.yml",
    "content": "language: go\narch:\n    - amd64\n    - ppc64le\ninstall:\n  - go get -t\n  - go get golang.org/x/tools/cmd/cover\n  - go get github.com/mattn/goveralls\nscript:\n  - go test -race -v ./...\nafter_script:\n  - $HOME/gopath/bin/goveralls -service=travis-ci -repotoken $COVERALLS_TOKEN\n"
  },
  {
    "path": "vendor/dario.cat/mergo/CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment include:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at i@dario.im. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]\n\n[homepage]: http://contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/4/\n"
  },
  {
    "path": "vendor/dario.cat/mergo/CONTRIBUTING.md",
    "content": "<!-- omit in toc -->\n# Contributing to mergo\n\nFirst off, thanks for taking the time to contribute! ❤️\n\nAll types of contributions are encouraged and valued. See the [Table of Contents](#table-of-contents) for different ways to help and details about how this project handles them. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions. 🎉\n\n> And if you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about:\n> - Star the project\n> - Tweet about it\n> - Refer this project in your project's readme\n> - Mention the project at local meetups and tell your friends/colleagues\n\n<!-- omit in toc -->\n## Table of Contents\n\n- [Code of Conduct](#code-of-conduct)\n- [I Have a Question](#i-have-a-question)\n- [I Want To Contribute](#i-want-to-contribute)\n- [Reporting Bugs](#reporting-bugs)\n- [Suggesting Enhancements](#suggesting-enhancements)\n\n## Code of Conduct\n\nThis project and everyone participating in it is governed by the\n[mergo Code of Conduct](https://github.com/imdario/mergoblob/master/CODE_OF_CONDUCT.md).\nBy participating, you are expected to uphold this code. Please report unacceptable behavior\nto <>.\n\n\n## I Have a Question\n\n> If you want to ask a question, we assume that you have read the available [Documentation](https://pkg.go.dev/github.com/imdario/mergo).\n\nBefore you ask a question, it is best to search for existing [Issues](https://github.com/imdario/mergo/issues) that might help you. In case you have found a suitable issue and still need clarification, you can write your question in this issue. It is also advisable to search the internet for answers first.\n\nIf you then still feel the need to ask a question and need clarification, we recommend the following:\n\n- Open an [Issue](https://github.com/imdario/mergo/issues/new).\n- Provide as much context as you can about what you're running into.\n- Provide project and platform versions (nodejs, npm, etc), depending on what seems relevant.\n\nWe will then take care of the issue as soon as possible.\n\n## I Want To Contribute\n\n> ### Legal Notice <!-- omit in toc -->\n> When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license.\n\n### Reporting Bugs\n\n<!-- omit in toc -->\n#### Before Submitting a Bug Report\n\nA good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible.\n\n- Make sure that you are using the latest version.\n- Determine if your bug is really a bug and not an error on your side e.g. using incompatible environment components/versions (Make sure that you have read the [documentation](). If you are looking for support, you might want to check [this section](#i-have-a-question)).\n- To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the [bug tracker](https://github.com/imdario/mergoissues?q=label%3Abug).\n- Also make sure to search the internet (including Stack Overflow) to see if users outside of the GitHub community have discussed the issue.\n- Collect information about the bug:\n- Stack trace (Traceback)\n- OS, Platform and Version (Windows, Linux, macOS, x86, ARM)\n- Version of the interpreter, compiler, SDK, runtime environment, package manager, depending on what seems relevant.\n- Possibly your input and the output\n- Can you reliably reproduce the issue? And can you also reproduce it with older versions?\n\n<!-- omit in toc -->\n#### How Do I Submit a Good Bug Report?\n\n> You must never report security related issues, vulnerabilities or bugs including sensitive information to the issue tracker, or elsewhere in public. Instead sensitive bugs must be sent by email to .\n<!-- You may add a PGP key to allow the messages to be sent encrypted as well. -->\n\nWe use GitHub issues to track bugs and errors. If you run into an issue with the project:\n\n- Open an [Issue](https://github.com/imdario/mergo/issues/new). (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.)\n- Explain the behavior you would expect and the actual behavior.\n- Please provide as much context as possible and describe the *reproduction steps* that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case.\n- Provide the information you collected in the previous section.\n\nOnce it's filed:\n\n- The project team will label the issue accordingly.\n- A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as `needs-repro`. Bugs with the `needs-repro` tag will not be addressed until they are reproduced.\n- If the team is able to reproduce the issue, it will be marked `needs-fix`, as well as possibly other tags (such as `critical`), and the issue will be left to be implemented by someone.\n\n### Suggesting Enhancements\n\nThis section guides you through submitting an enhancement suggestion for mergo, **including completely new features and minor improvements to existing functionality**. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions.\n\n<!-- omit in toc -->\n#### Before Submitting an Enhancement\n\n- Make sure that you are using the latest version.\n- Read the [documentation]() carefully and find out if the functionality is already covered, maybe by an individual configuration.\n- Perform a [search](https://github.com/imdario/mergo/issues) to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.\n- Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library.\n\n<!-- omit in toc -->\n#### How Do I Submit a Good Enhancement Suggestion?\n\nEnhancement suggestions are tracked as [GitHub issues](https://github.com/imdario/mergo/issues).\n\n- Use a **clear and descriptive title** for the issue to identify the suggestion.\n- Provide a **step-by-step description of the suggested enhancement** in as many details as possible.\n- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point you can also tell which alternatives do not work for you.\n- You may want to **include screenshots and animated GIFs** which help you demonstrate the steps or point out the part which the suggestion is related to. You can use [this tool](https://www.cockos.com/licecap/) to record GIFs on macOS and Windows, and [this tool](https://github.com/colinkeenan/silentcast) or [this tool](https://github.com/GNOME/byzanz) on Linux. <!-- this should only be included if the project has a GUI -->\n- **Explain why this enhancement would be useful** to most mergo users. You may also want to point out the other projects that solved it better and which could serve as inspiration.\n\n<!-- omit in toc -->\n## Attribution\nThis guide is based on the **contributing-gen**. [Make your own](https://github.com/bttger/contributing-gen)!\n"
  },
  {
    "path": "vendor/dario.cat/mergo/FUNDING.json",
    "content": "{\n  \"drips\": {\n    \"ethereum\": {\n      \"ownedBy\": \"0x6160020e7102237aC41bdb156e94401692D76930\"\n    }\n  }\n}\n"
  },
  {
    "path": "vendor/dario.cat/mergo/LICENSE",
    "content": "Copyright (c) 2013 Dario Castañé. All rights reserved.\nCopyright (c) 2012 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "vendor/dario.cat/mergo/README.md",
    "content": "# Mergo\n\n[![GitHub release][5]][6]\n[![GoCard][7]][8]\n[![Test status][1]][2]\n[![OpenSSF Scorecard][21]][22]\n[![OpenSSF Best Practices][19]][20]\n[![Coverage status][9]][10]\n[![Sourcegraph][11]][12]\n[![FOSSA status][13]][14]\n\n[![GoDoc][3]][4]\n[![Become my sponsor][15]][16]\n[![Tidelift][17]][18]\n\n[1]: https://github.com/imdario/mergo/workflows/tests/badge.svg?branch=master\n[2]: https://github.com/imdario/mergo/actions/workflows/tests.yml\n[3]: https://godoc.org/github.com/imdario/mergo?status.svg\n[4]: https://godoc.org/github.com/imdario/mergo\n[5]: https://img.shields.io/github/release/imdario/mergo.svg\n[6]: https://github.com/imdario/mergo/releases\n[7]: https://goreportcard.com/badge/imdario/mergo\n[8]: https://goreportcard.com/report/github.com/imdario/mergo\n[9]: https://coveralls.io/repos/github/imdario/mergo/badge.svg?branch=master\n[10]: https://coveralls.io/github/imdario/mergo?branch=master\n[11]: https://sourcegraph.com/github.com/imdario/mergo/-/badge.svg\n[12]: https://sourcegraph.com/github.com/imdario/mergo?badge\n[13]: https://app.fossa.io/api/projects/git%2Bgithub.com%2Fimdario%2Fmergo.svg?type=shield\n[14]: https://app.fossa.io/projects/git%2Bgithub.com%2Fimdario%2Fmergo?ref=badge_shield\n[15]: https://img.shields.io/github/sponsors/imdario\n[16]: https://github.com/sponsors/imdario\n[17]: https://tidelift.com/badges/package/go/github.com%2Fimdario%2Fmergo\n[18]: https://tidelift.com/subscription/pkg/go-github.com-imdario-mergo\n[19]: https://bestpractices.coreinfrastructure.org/projects/7177/badge\n[20]: https://bestpractices.coreinfrastructure.org/projects/7177\n[21]: https://api.securityscorecards.dev/projects/github.com/imdario/mergo/badge\n[22]: https://api.securityscorecards.dev/projects/github.com/imdario/mergo\n\nA helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements.\n\nMergo merges same-type structs and maps by setting default values in zero-value fields. Mergo won't merge unexported (private) fields. It will do recursively any exported one. It also won't merge structs inside maps (because they are not addressable using Go reflection).\n\nAlso a lovely [comune](http://en.wikipedia.org/wiki/Mergo) (municipality) in the Province of Ancona in the Italian region of Marche.\n\n## Status\n\nMergo is stable and frozen, ready for production. Check a short list of the projects using at large scale it [here](https://github.com/imdario/mergo#mergo-in-the-wild).\n\nNo new features are accepted. They will be considered for a future v2 that improves the implementation and fixes bugs for corner cases.\n\n### Important notes\n\n#### 1.0.0\n\nIn [1.0.0](//github.com/imdario/mergo/releases/tag/1.0.0) Mergo moves to a vanity URL `dario.cat/mergo`. No more v1 versions will be released.\n\nIf the vanity URL is causing issues in your project due to a dependency pulling Mergo - it isn't a direct dependency in your project - it is recommended to use [replace](https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive) to pin the version to the last one with the old import URL:\n\n```\nreplace github.com/imdario/mergo => github.com/imdario/mergo v0.3.16\n```\n\n#### 0.3.9\n\nPlease keep in mind that a problematic PR broke [0.3.9](//github.com/imdario/mergo/releases/tag/0.3.9). I reverted it in [0.3.10](//github.com/imdario/mergo/releases/tag/0.3.10), and I consider it stable but not bug-free. Also, this version adds support for go modules.\n\nKeep in mind that in [0.3.2](//github.com/imdario/mergo/releases/tag/0.3.2), Mergo changed `Merge()`and `Map()` signatures to support [transformers](#transformers). I added an optional/variadic argument so that it won't break the existing code.\n\nIf you were using Mergo before April 6th, 2015, please check your project works as intended after updating your local copy with ```go get -u dario.cat/mergo```. I apologize for any issue caused by its previous behavior and any future bug that Mergo could cause in existing projects after the change (release 0.2.0).\n\n### Donations\n\nIf Mergo is useful to you, consider buying me a coffee, a beer, or making a monthly donation to allow me to keep building great free software. :heart_eyes:\n\n<a href=\"https://liberapay.com/dario/donate\"><img alt=\"Donate using Liberapay\" src=\"https://liberapay.com/assets/widgets/donate.svg\"></a>\n<a href='https://github.com/sponsors/imdario' target='_blank'><img alt=\"Become my sponsor\" src=\"https://img.shields.io/github/sponsors/imdario?style=for-the-badge\" /></a>\n\n### Mergo in the wild\n\nMergo is used by [thousands](https://deps.dev/go/dario.cat%2Fmergo/v1.0.0/dependents) [of](https://deps.dev/go/github.com%2Fimdario%2Fmergo/v0.3.16/dependents) [projects](https://deps.dev/go/github.com%2Fimdario%2Fmergo/v0.3.12), including:\n\n* [containerd/containerd](https://github.com/containerd/containerd)\n* [datadog/datadog-agent](https://github.com/datadog/datadog-agent)\n* [docker/cli/](https://github.com/docker/cli/)\n* [goreleaser/goreleaser](https://github.com/goreleaser/goreleaser)\n* [go-micro/go-micro](https://github.com/go-micro/go-micro)\n* [grafana/loki](https://github.com/grafana/loki)\n* [masterminds/sprig](github.com/Masterminds/sprig)\n* [moby/moby](https://github.com/moby/moby)\n* [slackhq/nebula](https://github.com/slackhq/nebula)\n* [volcano-sh/volcano](https://github.com/volcano-sh/volcano)\n\n## Install\n\n    go get dario.cat/mergo\n\n    // use in your .go code\n    import (\n        \"dario.cat/mergo\"\n    )\n\n## Usage\n\nYou can only merge same-type structs with exported fields initialized as zero value of their type and same-types maps. Mergo won't merge unexported (private) fields but will do recursively any exported one. It won't merge empty structs value as [they are zero values](https://golang.org/ref/spec#The_zero_value) too. Also, maps will be merged recursively except for structs inside maps (because they are not addressable using Go reflection).\n\n```go\nif err := mergo.Merge(&dst, src); err != nil {\n    // ...\n}\n```\n\nAlso, you can merge overwriting values using the transformer `WithOverride`.\n\n```go\nif err := mergo.Merge(&dst, src, mergo.WithOverride); err != nil {\n    // ...\n}\n```\n\nIf you need to override pointers, so the source pointer's value is assigned to the destination's pointer, you must use `WithoutDereference`:\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"dario.cat/mergo\"\n)\n\ntype Foo struct {\n\tA *string\n\tB int64\n}\n\nfunc main() {\n\tfirst := \"first\"\n\tsecond := \"second\"\n\tsrc := Foo{\n\t\tA: &first,\n\t\tB: 2,\n\t}\n\n\tdest := Foo{\n\t\tA: &second,\n\t\tB: 1,\n\t}\n\n\tmergo.Merge(&dest, src, mergo.WithOverride, mergo.WithoutDereference)\n}\n```\n\nAdditionally, you can map a `map[string]interface{}` to a struct (and otherwise, from struct to map), following the same restrictions as in `Merge()`. Keys are capitalized to find each corresponding exported field.\n\n```go\nif err := mergo.Map(&dst, srcMap); err != nil {\n    // ...\n}\n```\n\nWarning: if you map a struct to map, it won't do it recursively. Don't expect Mergo to map struct members of your struct as `map[string]interface{}`. They will be just assigned as values.\n\nHere is a nice example:\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"dario.cat/mergo\"\n)\n\ntype Foo struct {\n\tA string\n\tB int64\n}\n\nfunc main() {\n\tsrc := Foo{\n\t\tA: \"one\",\n\t\tB: 2,\n\t}\n\tdest := Foo{\n\t\tA: \"two\",\n\t}\n\tmergo.Merge(&dest, src)\n\tfmt.Println(dest)\n\t// Will print\n\t// {two 2}\n}\n```\n\n### Transformers\n\nTransformers allow to merge specific types differently than in the default behavior. In other words, now you can customize how some types are merged. For example, `time.Time` is a struct; it doesn't have zero value but IsZero can return true because it has fields with zero value. How can we merge a non-zero `time.Time`?\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"dario.cat/mergo\"\n    \"reflect\"\n    \"time\"\n)\n\ntype timeTransformer struct {\n}\n\nfunc (t timeTransformer) Transformer(typ reflect.Type) func(dst, src reflect.Value) error {\n\tif typ == reflect.TypeOf(time.Time{}) {\n\t\treturn func(dst, src reflect.Value) error {\n\t\t\tif dst.CanSet() {\n\t\t\t\tisZero := dst.MethodByName(\"IsZero\")\n\t\t\t\tresult := isZero.Call([]reflect.Value{})\n\t\t\t\tif result[0].Bool() {\n\t\t\t\t\tdst.Set(src)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t}\n\treturn nil\n}\n\ntype Snapshot struct {\n\tTime time.Time\n\t// ...\n}\n\nfunc main() {\n\tsrc := Snapshot{time.Now()}\n\tdest := Snapshot{}\n\tmergo.Merge(&dest, src, mergo.WithTransformers(timeTransformer{}))\n\tfmt.Println(dest)\n\t// Will print\n\t// { 2018-01-12 01:15:00 +0000 UTC m=+0.000000001 }\n}\n```\n\n## Contact me\n\nIf I can help you, you have an idea or you are using Mergo in your projects, don't hesitate to drop me a line (or a pull request): [@im_dario](https://twitter.com/im_dario)\n\n## About\n\nWritten by [Dario Castañé](http://dario.im).\n\n## License\n\n[BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause) license, as [Go language](http://golang.org/LICENSE).\n\n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fimdario%2Fmergo.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fimdario%2Fmergo?ref=badge_large)\n"
  },
  {
    "path": "vendor/dario.cat/mergo/SECURITY.md",
    "content": "# Security Policy\n\n## Supported Versions\n\n| Version | Supported          |\n| ------- | ------------------ |\n| 1.x.x   | :white_check_mark: |\n| < 1.0   | :x:                |\n\n## Security contact information\n\nTo report a security vulnerability, please use the\n[Tidelift security contact](https://tidelift.com/security).\nTidelift will coordinate the fix and disclosure.\n"
  },
  {
    "path": "vendor/dario.cat/mergo/doc.go",
    "content": "// Copyright 2013 Dario Castañé. All rights reserved.\n// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n/*\nA helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements.\n\nMergo merges same-type structs and maps by setting default values in zero-value fields. Mergo won't merge unexported (private) fields. It will do recursively any exported one. It also won't merge structs inside maps (because they are not addressable using Go reflection).\n\n# Status\n\nIt is ready for production use. It is used in several projects by Docker, Google, The Linux Foundation, VMWare, Shopify, etc.\n\n# Important notes\n\n1.0.0\n\nIn 1.0.0 Mergo moves to a vanity URL `dario.cat/mergo`.\n\n0.3.9\n\nPlease keep in mind that a problematic PR broke 0.3.9. We reverted it in 0.3.10. We consider 0.3.10 as stable but not bug-free. . Also, this version adds suppot for go modules.\n\nKeep in mind that in 0.3.2, Mergo changed Merge() and Map() signatures to support transformers. We added an optional/variadic argument so that it won't break the existing code.\n\nIf you were using Mergo before April 6th, 2015, please check your project works as intended after updating your local copy with go get -u dario.cat/mergo. I apologize for any issue caused by its previous behavior and any future bug that Mergo could cause in existing projects after the change (release 0.2.0).\n\n# Install\n\nDo your usual installation procedure:\n\n\tgo get dario.cat/mergo\n\n\t// use in your .go code\n\timport (\n\t    \"dario.cat/mergo\"\n\t)\n\n# Usage\n\nYou can only merge same-type structs with exported fields initialized as zero value of their type and same-types maps. Mergo won't merge unexported (private) fields but will do recursively any exported one. It won't merge empty structs value as they are zero values too. Also, maps will be merged recursively except for structs inside maps (because they are not addressable using Go reflection).\n\n\tif err := mergo.Merge(&dst, src); err != nil {\n\t\t// ...\n\t}\n\nAlso, you can merge overwriting values using the transformer WithOverride.\n\n\tif err := mergo.Merge(&dst, src, mergo.WithOverride); err != nil {\n\t\t// ...\n\t}\n\nAdditionally, you can map a map[string]interface{} to a struct (and otherwise, from struct to map), following the same restrictions as in Merge(). Keys are capitalized to find each corresponding exported field.\n\n\tif err := mergo.Map(&dst, srcMap); err != nil {\n\t\t// ...\n\t}\n\nWarning: if you map a struct to map, it won't do it recursively. Don't expect Mergo to map struct members of your struct as map[string]interface{}. They will be just assigned as values.\n\nHere is a nice example:\n\n\tpackage main\n\n\timport (\n\t\t\"fmt\"\n\t\t\"dario.cat/mergo\"\n\t)\n\n\ttype Foo struct {\n\t\tA string\n\t\tB int64\n\t}\n\n\tfunc main() {\n\t\tsrc := Foo{\n\t\t\tA: \"one\",\n\t\t\tB: 2,\n\t\t}\n\t\tdest := Foo{\n\t\t\tA: \"two\",\n\t\t}\n\t\tmergo.Merge(&dest, src)\n\t\tfmt.Println(dest)\n\t\t// Will print\n\t\t// {two 2}\n\t}\n\n# Transformers\n\nTransformers allow to merge specific types differently than in the default behavior. In other words, now you can customize how some types are merged. For example, time.Time is a struct; it doesn't have zero value but IsZero can return true because it has fields with zero value. How can we merge a non-zero time.Time?\n\n\tpackage main\n\n\timport (\n\t\t\"fmt\"\n\t\t\"dario.cat/mergo\"\n\t\t\"reflect\"\n\t\t\"time\"\n\t)\n\n\ttype timeTransformer struct {\n\t}\n\n\tfunc (t timeTransformer) Transformer(typ reflect.Type) func(dst, src reflect.Value) error {\n\t\tif typ == reflect.TypeOf(time.Time{}) {\n\t\t\treturn func(dst, src reflect.Value) error {\n\t\t\t\tif dst.CanSet() {\n\t\t\t\t\tisZero := dst.MethodByName(\"IsZero\")\n\t\t\t\t\tresult := isZero.Call([]reflect.Value{})\n\t\t\t\t\tif result[0].Bool() {\n\t\t\t\t\t\tdst.Set(src)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\ttype Snapshot struct {\n\t\tTime time.Time\n\t\t// ...\n\t}\n\n\tfunc main() {\n\t\tsrc := Snapshot{time.Now()}\n\t\tdest := Snapshot{}\n\t\tmergo.Merge(&dest, src, mergo.WithTransformers(timeTransformer{}))\n\t\tfmt.Println(dest)\n\t\t// Will print\n\t\t// { 2018-01-12 01:15:00 +0000 UTC m=+0.000000001 }\n\t}\n\n# Contact me\n\nIf I can help you, you have an idea or you are using Mergo in your projects, don't hesitate to drop me a line (or a pull request): https://twitter.com/im_dario\n\n# About\n\nWritten by Dario Castañé: https://da.rio.hn\n\n# License\n\nBSD 3-Clause license, as Go language.\n*/\npackage mergo\n"
  },
  {
    "path": "vendor/dario.cat/mergo/map.go",
    "content": "// Copyright 2014 Dario Castañé. All rights reserved.\n// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Based on src/pkg/reflect/deepequal.go from official\n// golang's stdlib.\n\npackage mergo\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"unicode\"\n\t\"unicode/utf8\"\n)\n\nfunc changeInitialCase(s string, mapper func(rune) rune) string {\n\tif s == \"\" {\n\t\treturn s\n\t}\n\tr, n := utf8.DecodeRuneInString(s)\n\treturn string(mapper(r)) + s[n:]\n}\n\nfunc isExported(field reflect.StructField) bool {\n\tr, _ := utf8.DecodeRuneInString(field.Name)\n\treturn r >= 'A' && r <= 'Z'\n}\n\n// Traverses recursively both values, assigning src's fields values to dst.\n// The map argument tracks comparisons that have already been seen, which allows\n// short circuiting on recursive types.\nfunc deepMap(dst, src reflect.Value, visited map[uintptr]*visit, depth int, config *Config) (err error) {\n\toverwrite := config.Overwrite\n\tif dst.CanAddr() {\n\t\taddr := dst.UnsafeAddr()\n\t\th := 17 * addr\n\t\tseen := visited[h]\n\t\ttyp := dst.Type()\n\t\tfor p := seen; p != nil; p = p.next {\n\t\t\tif p.ptr == addr && p.typ == typ {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\t// Remember, remember...\n\t\tvisited[h] = &visit{typ, seen, addr}\n\t}\n\tzeroValue := reflect.Value{}\n\tswitch dst.Kind() {\n\tcase reflect.Map:\n\t\tdstMap := dst.Interface().(map[string]interface{})\n\t\tfor i, n := 0, src.NumField(); i < n; i++ {\n\t\t\tsrcType := src.Type()\n\t\t\tfield := srcType.Field(i)\n\t\t\tif !isExported(field) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfieldName := field.Name\n\t\t\tfieldName = changeInitialCase(fieldName, unicode.ToLower)\n\t\t\tif _, ok := dstMap[fieldName]; !ok || (!isEmptyValue(reflect.ValueOf(src.Field(i).Interface()), !config.ShouldNotDereference) && overwrite) || config.overwriteWithEmptyValue {\n\t\t\t\tdstMap[fieldName] = src.Field(i).Interface()\n\t\t\t}\n\t\t}\n\tcase reflect.Ptr:\n\t\tif dst.IsNil() {\n\t\t\tv := reflect.New(dst.Type().Elem())\n\t\t\tdst.Set(v)\n\t\t}\n\t\tdst = dst.Elem()\n\t\tfallthrough\n\tcase reflect.Struct:\n\t\tsrcMap := src.Interface().(map[string]interface{})\n\t\tfor key := range srcMap {\n\t\t\tconfig.overwriteWithEmptyValue = true\n\t\t\tsrcValue := srcMap[key]\n\t\t\tfieldName := changeInitialCase(key, unicode.ToUpper)\n\t\t\tdstElement := dst.FieldByName(fieldName)\n\t\t\tif dstElement == zeroValue {\n\t\t\t\t// We discard it because the field doesn't exist.\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tsrcElement := reflect.ValueOf(srcValue)\n\t\t\tdstKind := dstElement.Kind()\n\t\t\tsrcKind := srcElement.Kind()\n\t\t\tif srcKind == reflect.Ptr && dstKind != reflect.Ptr {\n\t\t\t\tsrcElement = srcElement.Elem()\n\t\t\t\tsrcKind = reflect.TypeOf(srcElement.Interface()).Kind()\n\t\t\t} else if dstKind == reflect.Ptr {\n\t\t\t\t// Can this work? I guess it can't.\n\t\t\t\tif srcKind != reflect.Ptr && srcElement.CanAddr() {\n\t\t\t\t\tsrcPtr := srcElement.Addr()\n\t\t\t\t\tsrcElement = reflect.ValueOf(srcPtr)\n\t\t\t\t\tsrcKind = reflect.Ptr\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif !srcElement.IsValid() {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif srcKind == dstKind {\n\t\t\t\tif err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t} else if dstKind == reflect.Interface && dstElement.Kind() == reflect.Interface {\n\t\t\t\tif err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t} else if srcKind == reflect.Map {\n\t\t\t\tif err = deepMap(dstElement, srcElement, visited, depth+1, config); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn fmt.Errorf(\"type mismatch on %s field: found %v, expected %v\", fieldName, srcKind, dstKind)\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// Map sets fields' values in dst from src.\n// src can be a map with string keys or a struct. dst must be the opposite:\n// if src is a map, dst must be a valid pointer to struct. If src is a struct,\n// dst must be map[string]interface{}.\n// It won't merge unexported (private) fields and will do recursively\n// any exported field.\n// If dst is a map, keys will be src fields' names in lower camel case.\n// Missing key in src that doesn't match a field in dst will be skipped. This\n// doesn't apply if dst is a map.\n// This is separated method from Merge because it is cleaner and it keeps sane\n// semantics: merging equal types, mapping different (restricted) types.\nfunc Map(dst, src interface{}, opts ...func(*Config)) error {\n\treturn _map(dst, src, opts...)\n}\n\n// MapWithOverwrite will do the same as Map except that non-empty dst attributes will be overridden by\n// non-empty src attribute values.\n// Deprecated: Use Map(…) with WithOverride\nfunc MapWithOverwrite(dst, src interface{}, opts ...func(*Config)) error {\n\treturn _map(dst, src, append(opts, WithOverride)...)\n}\n\nfunc _map(dst, src interface{}, opts ...func(*Config)) error {\n\tif dst != nil && reflect.ValueOf(dst).Kind() != reflect.Ptr {\n\t\treturn ErrNonPointerArgument\n\t}\n\tvar (\n\t\tvDst, vSrc reflect.Value\n\t\terr        error\n\t)\n\tconfig := &Config{}\n\n\tfor _, opt := range opts {\n\t\topt(config)\n\t}\n\n\tif vDst, vSrc, err = resolveValues(dst, src); err != nil {\n\t\treturn err\n\t}\n\t// To be friction-less, we redirect equal-type arguments\n\t// to deepMerge. Only because arguments can be anything.\n\tif vSrc.Kind() == vDst.Kind() {\n\t\treturn deepMerge(vDst, vSrc, make(map[uintptr]*visit), 0, config)\n\t}\n\tswitch vSrc.Kind() {\n\tcase reflect.Struct:\n\t\tif vDst.Kind() != reflect.Map {\n\t\t\treturn ErrExpectedMapAsDestination\n\t\t}\n\tcase reflect.Map:\n\t\tif vDst.Kind() != reflect.Struct {\n\t\t\treturn ErrExpectedStructAsDestination\n\t\t}\n\tdefault:\n\t\treturn ErrNotSupported\n\t}\n\treturn deepMap(vDst, vSrc, make(map[uintptr]*visit), 0, config)\n}\n"
  },
  {
    "path": "vendor/dario.cat/mergo/merge.go",
    "content": "// Copyright 2013 Dario Castañé. All rights reserved.\n// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Based on src/pkg/reflect/deepequal.go from official\n// golang's stdlib.\n\npackage mergo\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n)\n\nfunc hasMergeableFields(dst reflect.Value) (exported bool) {\n\tfor i, n := 0, dst.NumField(); i < n; i++ {\n\t\tfield := dst.Type().Field(i)\n\t\tif field.Anonymous && dst.Field(i).Kind() == reflect.Struct {\n\t\t\texported = exported || hasMergeableFields(dst.Field(i))\n\t\t} else if isExportedComponent(&field) {\n\t\t\texported = exported || len(field.PkgPath) == 0\n\t\t}\n\t}\n\treturn\n}\n\nfunc isExportedComponent(field *reflect.StructField) bool {\n\tpkgPath := field.PkgPath\n\tif len(pkgPath) > 0 {\n\t\treturn false\n\t}\n\tc := field.Name[0]\n\tif 'a' <= c && c <= 'z' || c == '_' {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype Config struct {\n\tTransformers                 Transformers\n\tOverwrite                    bool\n\tShouldNotDereference         bool\n\tAppendSlice                  bool\n\tTypeCheck                    bool\n\toverwriteWithEmptyValue      bool\n\toverwriteSliceWithEmptyValue bool\n\tsliceDeepCopy                bool\n\tdebug                        bool\n}\n\ntype Transformers interface {\n\tTransformer(reflect.Type) func(dst, src reflect.Value) error\n}\n\n// Traverses recursively both values, assigning src's fields values to dst.\n// The map argument tracks comparisons that have already been seen, which allows\n// short circuiting on recursive types.\nfunc deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, config *Config) (err error) {\n\toverwrite := config.Overwrite\n\ttypeCheck := config.TypeCheck\n\toverwriteWithEmptySrc := config.overwriteWithEmptyValue\n\toverwriteSliceWithEmptySrc := config.overwriteSliceWithEmptyValue\n\tsliceDeepCopy := config.sliceDeepCopy\n\n\tif !src.IsValid() {\n\t\treturn\n\t}\n\tif dst.CanAddr() {\n\t\taddr := dst.UnsafeAddr()\n\t\th := 17 * addr\n\t\tseen := visited[h]\n\t\ttyp := dst.Type()\n\t\tfor p := seen; p != nil; p = p.next {\n\t\t\tif p.ptr == addr && p.typ == typ {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\t// Remember, remember...\n\t\tvisited[h] = &visit{typ, seen, addr}\n\t}\n\n\tif config.Transformers != nil && !isReflectNil(dst) && dst.IsValid() {\n\t\tif fn := config.Transformers.Transformer(dst.Type()); fn != nil {\n\t\t\terr = fn(dst, src)\n\t\t\treturn\n\t\t}\n\t}\n\n\tswitch dst.Kind() {\n\tcase reflect.Struct:\n\t\tif hasMergeableFields(dst) {\n\t\t\tfor i, n := 0, dst.NumField(); i < n; i++ {\n\t\t\t\tif err = deepMerge(dst.Field(i), src.Field(i), visited, depth+1, config); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif dst.CanSet() && (isReflectNil(dst) || overwrite) && (!isEmptyValue(src, !config.ShouldNotDereference) || overwriteWithEmptySrc) {\n\t\t\t\tdst.Set(src)\n\t\t\t}\n\t\t}\n\tcase reflect.Map:\n\t\tif dst.IsNil() && !src.IsNil() {\n\t\t\tif dst.CanSet() {\n\t\t\t\tdst.Set(reflect.MakeMap(dst.Type()))\n\t\t\t} else {\n\t\t\t\tdst = src\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tif src.Kind() != reflect.Map {\n\t\t\tif overwrite && dst.CanSet() {\n\t\t\t\tdst.Set(src)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tfor _, key := range src.MapKeys() {\n\t\t\tsrcElement := src.MapIndex(key)\n\t\t\tif !srcElement.IsValid() {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tdstElement := dst.MapIndex(key)\n\t\t\tswitch srcElement.Kind() {\n\t\t\tcase reflect.Chan, reflect.Func, reflect.Map, reflect.Interface, reflect.Slice:\n\t\t\t\tif srcElement.IsNil() {\n\t\t\t\t\tif overwrite {\n\t\t\t\t\t\tdst.SetMapIndex(key, srcElement)\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tfallthrough\n\t\t\tdefault:\n\t\t\t\tif !srcElement.CanInterface() {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tswitch reflect.TypeOf(srcElement.Interface()).Kind() {\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tfallthrough\n\t\t\t\tcase reflect.Ptr:\n\t\t\t\t\tfallthrough\n\t\t\t\tcase reflect.Map:\n\t\t\t\t\tsrcMapElm := srcElement\n\t\t\t\t\tdstMapElm := dstElement\n\t\t\t\t\tif srcMapElm.CanInterface() {\n\t\t\t\t\t\tsrcMapElm = reflect.ValueOf(srcMapElm.Interface())\n\t\t\t\t\t\tif dstMapElm.IsValid() {\n\t\t\t\t\t\t\tdstMapElm = reflect.ValueOf(dstMapElm.Interface())\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif err = deepMerge(dstMapElm, srcMapElm, visited, depth+1, config); err != nil {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\tcase reflect.Slice:\n\t\t\t\t\tsrcSlice := reflect.ValueOf(srcElement.Interface())\n\n\t\t\t\t\tvar dstSlice reflect.Value\n\t\t\t\t\tif !dstElement.IsValid() || dstElement.IsNil() {\n\t\t\t\t\t\tdstSlice = reflect.MakeSlice(srcSlice.Type(), 0, srcSlice.Len())\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdstSlice = reflect.ValueOf(dstElement.Interface())\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!isEmptyValue(src, !config.ShouldNotDereference) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst, !config.ShouldNotDereference)) && !config.AppendSlice && !sliceDeepCopy {\n\t\t\t\t\t\tif typeCheck && srcSlice.Type() != dstSlice.Type() {\n\t\t\t\t\t\t\treturn fmt.Errorf(\"cannot override two slices with different type (%s, %s)\", srcSlice.Type(), dstSlice.Type())\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdstSlice = srcSlice\n\t\t\t\t\t} else if config.AppendSlice {\n\t\t\t\t\t\tif srcSlice.Type() != dstSlice.Type() {\n\t\t\t\t\t\t\treturn fmt.Errorf(\"cannot append two slices with different type (%s, %s)\", srcSlice.Type(), dstSlice.Type())\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdstSlice = reflect.AppendSlice(dstSlice, srcSlice)\n\t\t\t\t\t} else if sliceDeepCopy {\n\t\t\t\t\t\ti := 0\n\t\t\t\t\t\tfor ; i < srcSlice.Len() && i < dstSlice.Len(); i++ {\n\t\t\t\t\t\t\tsrcElement := srcSlice.Index(i)\n\t\t\t\t\t\t\tdstElement := dstSlice.Index(i)\n\n\t\t\t\t\t\t\tif srcElement.CanInterface() {\n\t\t\t\t\t\t\t\tsrcElement = reflect.ValueOf(srcElement.Interface())\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif dstElement.CanInterface() {\n\t\t\t\t\t\t\t\tdstElement = reflect.ValueOf(dstElement.Interface())\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil {\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tdst.SetMapIndex(key, dstSlice)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif dstElement.IsValid() && !isEmptyValue(dstElement, !config.ShouldNotDereference) {\n\t\t\t\tif reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Slice {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Map && reflect.TypeOf(dstElement.Interface()).Kind() == reflect.Map {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif srcElement.IsValid() && ((srcElement.Kind() != reflect.Ptr && overwrite) || !dstElement.IsValid() || isEmptyValue(dstElement, !config.ShouldNotDereference)) {\n\t\t\t\tif dst.IsNil() {\n\t\t\t\t\tdst.Set(reflect.MakeMap(dst.Type()))\n\t\t\t\t}\n\t\t\t\tdst.SetMapIndex(key, srcElement)\n\t\t\t}\n\t\t}\n\n\t\t// Ensure that all keys in dst are deleted if they are not in src.\n\t\tif overwriteWithEmptySrc {\n\t\t\tfor _, key := range dst.MapKeys() {\n\t\t\t\tsrcElement := src.MapIndex(key)\n\t\t\t\tif !srcElement.IsValid() {\n\t\t\t\t\tdst.SetMapIndex(key, reflect.Value{})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\tcase reflect.Slice:\n\t\tif !dst.CanSet() {\n\t\t\tbreak\n\t\t}\n\t\tif (!isEmptyValue(src, !config.ShouldNotDereference) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst, !config.ShouldNotDereference)) && !config.AppendSlice && !sliceDeepCopy {\n\t\t\tdst.Set(src)\n\t\t} else if config.AppendSlice {\n\t\t\tif src.Type() != dst.Type() {\n\t\t\t\treturn fmt.Errorf(\"cannot append two slice with different type (%s, %s)\", src.Type(), dst.Type())\n\t\t\t}\n\t\t\tdst.Set(reflect.AppendSlice(dst, src))\n\t\t} else if sliceDeepCopy {\n\t\t\tfor i := 0; i < src.Len() && i < dst.Len(); i++ {\n\t\t\t\tsrcElement := src.Index(i)\n\t\t\t\tdstElement := dst.Index(i)\n\t\t\t\tif srcElement.CanInterface() {\n\t\t\t\t\tsrcElement = reflect.ValueOf(srcElement.Interface())\n\t\t\t\t}\n\t\t\t\tif dstElement.CanInterface() {\n\t\t\t\t\tdstElement = reflect.ValueOf(dstElement.Interface())\n\t\t\t\t}\n\n\t\t\t\tif err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\tcase reflect.Ptr:\n\t\tfallthrough\n\tcase reflect.Interface:\n\t\tif isReflectNil(src) {\n\t\t\tif overwriteWithEmptySrc && dst.CanSet() && src.Type().AssignableTo(dst.Type()) {\n\t\t\t\tdst.Set(src)\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\n\t\tif src.Kind() != reflect.Interface {\n\t\t\tif dst.IsNil() || (src.Kind() != reflect.Ptr && overwrite) {\n\t\t\t\tif dst.CanSet() && (overwrite || isEmptyValue(dst, !config.ShouldNotDereference)) {\n\t\t\t\t\tdst.Set(src)\n\t\t\t\t}\n\t\t\t} else if src.Kind() == reflect.Ptr {\n\t\t\t\tif !config.ShouldNotDereference {\n\t\t\t\t\tif err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t} else if src.Elem().Kind() != reflect.Struct {\n\t\t\t\t\tif overwriteWithEmptySrc || (overwrite && !src.IsNil()) || dst.IsNil() {\n\t\t\t\t\t\tdst.Set(src)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if dst.Elem().Type() == src.Type() {\n\t\t\t\tif err = deepMerge(dst.Elem(), src, visited, depth+1, config); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn ErrDifferentArgumentsTypes\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\n\t\tif dst.IsNil() || overwrite {\n\t\t\tif dst.CanSet() && (overwrite || isEmptyValue(dst, !config.ShouldNotDereference)) {\n\t\t\t\tdst.Set(src)\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\n\t\tif dst.Elem().Kind() == src.Elem().Kind() {\n\t\t\tif err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\tdefault:\n\t\tmustSet := (isEmptyValue(dst, !config.ShouldNotDereference) || overwrite) && (!isEmptyValue(src, !config.ShouldNotDereference) || overwriteWithEmptySrc)\n\t\tif mustSet {\n\t\t\tif dst.CanSet() {\n\t\t\t\tdst.Set(src)\n\t\t\t} else {\n\t\t\t\tdst = src\n\t\t\t}\n\t\t}\n\t}\n\n\treturn\n}\n\n// Merge will fill any empty for value type attributes on the dst struct using corresponding\n// src attributes if they themselves are not empty. dst and src must be valid same-type structs\n// and dst must be a pointer to struct.\n// It won't merge unexported (private) fields and will do recursively any exported field.\nfunc Merge(dst, src interface{}, opts ...func(*Config)) error {\n\treturn merge(dst, src, opts...)\n}\n\n// MergeWithOverwrite will do the same as Merge except that non-empty dst attributes will be overridden by\n// non-empty src attribute values.\n// Deprecated: use Merge(…) with WithOverride\nfunc MergeWithOverwrite(dst, src interface{}, opts ...func(*Config)) error {\n\treturn merge(dst, src, append(opts, WithOverride)...)\n}\n\n// WithTransformers adds transformers to merge, allowing to customize the merging of some types.\nfunc WithTransformers(transformers Transformers) func(*Config) {\n\treturn func(config *Config) {\n\t\tconfig.Transformers = transformers\n\t}\n}\n\n// WithOverride will make merge override non-empty dst attributes with non-empty src attributes values.\nfunc WithOverride(config *Config) {\n\tconfig.Overwrite = true\n}\n\n// WithOverwriteWithEmptyValue will make merge override non empty dst attributes with empty src attributes values.\nfunc WithOverwriteWithEmptyValue(config *Config) {\n\tconfig.Overwrite = true\n\tconfig.overwriteWithEmptyValue = true\n}\n\n// WithOverrideEmptySlice will make merge override empty dst slice with empty src slice.\nfunc WithOverrideEmptySlice(config *Config) {\n\tconfig.overwriteSliceWithEmptyValue = true\n}\n\n// WithoutDereference prevents dereferencing pointers when evaluating whether they are empty\n// (i.e. a non-nil pointer is never considered empty).\nfunc WithoutDereference(config *Config) {\n\tconfig.ShouldNotDereference = true\n}\n\n// WithAppendSlice will make merge append slices instead of overwriting it.\nfunc WithAppendSlice(config *Config) {\n\tconfig.AppendSlice = true\n}\n\n// WithTypeCheck will make merge check types while overwriting it (must be used with WithOverride).\nfunc WithTypeCheck(config *Config) {\n\tconfig.TypeCheck = true\n}\n\n// WithSliceDeepCopy will merge slice element one by one with Overwrite flag.\nfunc WithSliceDeepCopy(config *Config) {\n\tconfig.sliceDeepCopy = true\n\tconfig.Overwrite = true\n}\n\nfunc merge(dst, src interface{}, opts ...func(*Config)) error {\n\tif dst != nil && reflect.ValueOf(dst).Kind() != reflect.Ptr {\n\t\treturn ErrNonPointerArgument\n\t}\n\tvar (\n\t\tvDst, vSrc reflect.Value\n\t\terr        error\n\t)\n\n\tconfig := &Config{}\n\n\tfor _, opt := range opts {\n\t\topt(config)\n\t}\n\n\tif vDst, vSrc, err = resolveValues(dst, src); err != nil {\n\t\treturn err\n\t}\n\tif vDst.Type() != vSrc.Type() {\n\t\treturn ErrDifferentArgumentsTypes\n\t}\n\treturn deepMerge(vDst, vSrc, make(map[uintptr]*visit), 0, config)\n}\n\n// IsReflectNil is the reflect value provided nil\nfunc isReflectNil(v reflect.Value) bool {\n\tk := v.Kind()\n\tswitch k {\n\tcase reflect.Interface, reflect.Slice, reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr:\n\t\t// Both interface and slice are nil if first word is 0.\n\t\t// Both are always bigger than a word; assume flagIndir.\n\t\treturn v.IsNil()\n\tdefault:\n\t\treturn false\n\t}\n}\n"
  },
  {
    "path": "vendor/dario.cat/mergo/mergo.go",
    "content": "// Copyright 2013 Dario Castañé. All rights reserved.\n// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Based on src/pkg/reflect/deepequal.go from official\n// golang's stdlib.\n\npackage mergo\n\nimport (\n\t\"errors\"\n\t\"reflect\"\n)\n\n// Errors reported by Mergo when it finds invalid arguments.\nvar (\n\tErrNilArguments                = errors.New(\"src and dst must not be nil\")\n\tErrDifferentArgumentsTypes     = errors.New(\"src and dst must be of same type\")\n\tErrNotSupported                = errors.New(\"only structs, maps, and slices are supported\")\n\tErrExpectedMapAsDestination    = errors.New(\"dst was expected to be a map\")\n\tErrExpectedStructAsDestination = errors.New(\"dst was expected to be a struct\")\n\tErrNonPointerArgument          = errors.New(\"dst must be a pointer\")\n)\n\n// During deepMerge, must keep track of checks that are\n// in progress.  The comparison algorithm assumes that all\n// checks in progress are true when it reencounters them.\n// Visited are stored in a map indexed by 17 * a1 + a2;\ntype visit struct {\n\ttyp  reflect.Type\n\tnext *visit\n\tptr  uintptr\n}\n\n// From src/pkg/encoding/json/encode.go.\nfunc isEmptyValue(v reflect.Value, shouldDereference bool) bool {\n\tswitch v.Kind() {\n\tcase reflect.Array, reflect.Map, reflect.Slice, reflect.String:\n\t\treturn v.Len() == 0\n\tcase reflect.Bool:\n\t\treturn !v.Bool()\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\treturn v.Int() == 0\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\treturn v.Uint() == 0\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn v.Float() == 0\n\tcase reflect.Interface, reflect.Ptr:\n\t\tif v.IsNil() {\n\t\t\treturn true\n\t\t}\n\t\tif shouldDereference {\n\t\t\treturn isEmptyValue(v.Elem(), shouldDereference)\n\t\t}\n\t\treturn false\n\tcase reflect.Func:\n\t\treturn v.IsNil()\n\tcase reflect.Invalid:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc resolveValues(dst, src interface{}) (vDst, vSrc reflect.Value, err error) {\n\tif dst == nil || src == nil {\n\t\terr = ErrNilArguments\n\t\treturn\n\t}\n\tvDst = reflect.ValueOf(dst).Elem()\n\tif vDst.Kind() != reflect.Struct && vDst.Kind() != reflect.Map && vDst.Kind() != reflect.Slice {\n\t\terr = ErrNotSupported\n\t\treturn\n\t}\n\tvSrc = reflect.ValueOf(src)\n\t// We check if vSrc is a pointer to dereference it.\n\tif vSrc.Kind() == reflect.Ptr {\n\t\tvSrc = vSrc.Elem()\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/LICENSE.txt",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation.\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": "vendor/github.com/Azure/azure-sdk-for-go/NOTICE.txt",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties. Microsoft makes certain\nopen source code available at https://3rdpartysource.microsoft.com, or you may\nsend a check or money order for US $5.00, including the product name, the open\nsource component name, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the\nextent required to debug changes to any libraries licensed under the GNU Lesser\nGeneral Public License.\n\n------------------------------------------------------------------------------\n\nAzure SDK for Go uses third-party libraries or other resources that may be\ndistributed under licenses different than the Azure SDK for Go software.\n\nIn the event that we accidentally failed to list a required notice, please\nbring it to our attention. Post an issue or email us:\n\n           azgosdkhelp@microsoft.com\n\nThe attached notices are provided for information only.\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/CHANGELOG.md",
    "content": "# Release History\n\n## 1.18.0 (2025-04-03)\n\n### Features Added\n\n* Added `AccessToken.RefreshOn` and updated `BearerTokenPolicy` to consider nonzero values of it when deciding whether to request a new token\n\n\n## 1.17.1 (2025-03-20)\n\n### Other Changes\n\n* Upgraded to Go 1.23\n* Upgraded dependencies\n\n## 1.17.0 (2025-01-07)\n\n### Features Added\n\n* Added field `OperationLocationResultPath` to `runtime.NewPollerOptions[T]` for LROs that use the `Operation-Location` pattern.\n* Support `encoding.TextMarshaler` and `encoding.TextUnmarshaler` interfaces in `arm.ResourceID`.\n\n## 1.16.0 (2024-10-17)\n\n### Features Added\n\n* Added field `Kind` to `runtime.StartSpanOptions` to allow a kind to be set when starting a span.\n\n### Bugs Fixed\n\n* `BearerTokenPolicy` now rewinds request bodies before retrying\n\n## 1.15.0 (2024-10-14)\n\n### Features Added\n\n* `BearerTokenPolicy` handles CAE claims challenges\n\n### Bugs Fixed\n\n* Omit the `ResponseError.RawResponse` field from JSON marshaling so instances can be marshaled.\n* Fixed an integer overflow in the retry policy.\n\n### Other Changes\n\n* Update dependencies.\n\n## 1.14.0 (2024-08-07)\n\n### Features Added\n\n* Added field `Attributes` to `runtime.StartSpanOptions` to simplify creating spans with attributes.\n\n### Other Changes\n\n* Include the HTTP verb and URL in `log.EventRetryPolicy` log entries so it's clear which operation is being retried.\n\n## 1.13.0 (2024-07-16)\n\n### Features Added\n\n- Added runtime.NewRequestFromRequest(), allowing for a policy.Request to be created from an existing *http.Request.\n\n## 1.12.0 (2024-06-06)\n\n### Features Added\n\n* Added field `StatusCodes` to `runtime.FetcherForNextLinkOptions` allowing for additional HTTP status codes indicating success.\n* Added func `NewUUID` to the `runtime` package for generating UUIDs.\n\n### Bugs Fixed\n\n* Fixed an issue that prevented pollers using the `Operation-Location` strategy from unmarshaling the final result in some cases.\n\n### Other Changes\n\n* Updated dependencies.\n\n## 1.11.1 (2024-04-02)\n\n### Bugs Fixed\n\n* Pollers that use the `Location` header won't consider `http.StatusRequestTimeout` a terminal failure.\n* `runtime.Poller[T].Result` won't consider non-terminal error responses as terminal.\n\n## 1.11.0 (2024-04-01)\n\n### Features Added\n\n* Added `StatusCodes` to `arm/policy.RegistrationOptions` to allow supporting non-standard HTTP status codes during registration.\n* Added field `InsecureAllowCredentialWithHTTP` to `azcore.ClientOptions` and dependent authentication pipeline policies.\n* Added type `MultipartContent` to the `streaming` package to support multipart/form payloads with custom Content-Type and file name.\n\n### Bugs Fixed\n\n* `runtime.SetMultipartFormData` won't try to stringify `[]byte` values.\n* Pollers that use the `Location` header won't consider `http.StatusTooManyRequests` a terminal failure.\n\n### Other Changes\n\n* Update dependencies.\n\n## 1.10.0 (2024-02-29)\n\n### Features Added\n\n* Added logging event `log.EventResponseError` that will contain the contents of `ResponseError.Error()` whenever an `azcore.ResponseError` is created.\n* Added `runtime.NewResponseErrorWithErrorCode` for creating an `azcore.ResponseError` with a caller-supplied error code.\n* Added type `MatchConditions` for use in conditional requests.\n\n### Bugs Fixed\n\n* Fixed a potential race condition between `NullValue` and `IsNullValue`.\n* `runtime.EncodeQueryParams` will escape semicolons before calling `url.ParseQuery`.\n\n### Other Changes\n\n* Update dependencies.\n\n## 1.9.2 (2024-02-06)\n\n### Bugs Fixed\n\n* `runtime.MarshalAsByteArray` and `runtime.MarshalAsJSON` will preserve the preexisting value of the `Content-Type` header.\n\n### Other Changes\n\n* Update to latest version of `internal`.\n\n## 1.9.1 (2023-12-11)\n\n### Bugs Fixed\n\n* The `retry-after-ms` and `x-ms-retry-after-ms` headers weren't being checked during retries.\n\n### Other Changes\n\n* Update dependencies.\n\n## 1.9.0 (2023-11-06)\n\n### Breaking Changes\n> These changes affect only code written against previous beta versions of `v1.7.0` and `v1.8.0`\n* The function `NewTokenCredential` has been removed from the `fake` package. Use a literal `&fake.TokenCredential{}` instead.\n* The field `TracingNamespace` in `runtime.PipelineOptions` has been replaced by `TracingOptions`.\n\n### Bugs Fixed\n\n* Fixed an issue that could cause some allowed HTTP header values to not show up in logs.\n* Include error text instead of error type in traces when the transport returns an error.\n* Fixed an issue that could cause an HTTP/2 request to hang when the TCP connection becomes unresponsive.\n* Block key and SAS authentication for non TLS protected endpoints.\n* Passing a `nil` credential value will no longer cause a panic. Instead, the authentication is skipped.\n* Calling `Error` on a zero-value `azcore.ResponseError` will no longer panic.\n* Fixed an issue in `fake.PagerResponder[T]` that would cause a trailing error to be omitted when iterating over pages.\n* Context values created by `azcore` will no longer flow across disjoint HTTP requests.\n\n### Other Changes\n\n* Skip generating trace info for no-op tracers.\n* The `clientName` paramater in client constructors has been renamed to `moduleName`.\n\n## 1.9.0-beta.1 (2023-10-05)\n\n### Other Changes\n\n* The beta features for tracing and fakes have been reinstated.\n\n## 1.8.0 (2023-10-05)\n\n### Features Added\n\n* This includes the following features from `v1.8.0-beta.N` releases.\n  * Claims and CAE for authentication.\n  * New `messaging` package.\n  * Various helpers in the `runtime` package.\n  * Deprecation of `runtime.With*` funcs and their replacements in the `policy` package.\n* Added types `KeyCredential` and `SASCredential` to the `azcore` package.\n  * Includes their respective constructor functions.\n* Added types `KeyCredentialPolicy` and `SASCredentialPolicy` to the `azcore/runtime` package.\n  * Includes their respective constructor functions and options types.\n\n### Breaking Changes\n> These changes affect only code written against beta versions of `v1.8.0`\n* The beta features for tracing and fakes have been omitted for this release.\n\n### Bugs Fixed\n\n* Fixed an issue that could cause some ARM RPs to not be automatically registered.\n* Block bearer token authentication for non TLS protected endpoints.\n\n### Other Changes\n\n* Updated dependencies.\n\n## 1.8.0-beta.3 (2023-09-07)\n\n### Features Added\n\n* Added function `FetcherForNextLink` and `FetcherForNextLinkOptions` to the `runtime` package to centralize creation of `Pager[T].Fetcher` from a next link URL.\n\n### Bugs Fixed\n\n* Suppress creating spans for nested SDK API calls. The HTTP span will be a child of the outer API span.\n\n### Other Changes\n\n* The following functions in the `runtime` package are now exposed from the `policy` package, and the `runtime` versions have been deprecated.\n  * `WithCaptureResponse`\n  * `WithHTTPHeader`\n  * `WithRetryOptions`\n\n## 1.7.2 (2023-09-06)\n\n### Bugs Fixed\n\n* Fix default HTTP transport to work in WASM modules.\n\n## 1.8.0-beta.2 (2023-08-14)\n\n### Features Added\n\n* Added function `SanitizePagerPollerPath` to the `server` package to centralize sanitization and formalize the contract.\n* Added `TokenRequestOptions.EnableCAE` to indicate whether to request a CAE token.\n\n### Breaking Changes\n\n> This change affects only code written against beta version `v1.8.0-beta.1`.\n* `messaging.CloudEvent` deserializes JSON objects as `[]byte`, instead of `json.RawMessage`. See the documentation for CloudEvent.Data for more information.\n\n> This change affects only code written against beta versions `v1.7.0-beta.2` and `v1.8.0-beta.1`.\n* Removed parameter from method `Span.End()` and its type `tracing.SpanEndOptions`. This API GA'ed in `v1.2.0` so we cannot change it.\n\n### Bugs Fixed\n\n* Propagate any query parameters when constructing a fake poller and/or injecting next links.\n\n## 1.7.1 (2023-08-14)\n\n## Bugs Fixed\n\n* Enable TLS renegotiation in the default transport policy.\n\n## 1.8.0-beta.1 (2023-07-12)\n\n### Features Added\n\n- `messaging/CloudEvent` allows you to serialize/deserialize CloudEvents, as described in the CloudEvents 1.0 specification: [link](https://github.com/cloudevents/spec)\n\n### Other Changes\n\n* The beta features for CAE, tracing, and fakes have been reinstated.\n\n## 1.7.0 (2023-07-12)\n\n### Features Added\n* Added method `WithClientName()` to type `azcore.Client` to support shallow cloning of a client with a new name used for tracing.\n\n### Breaking Changes\n> These changes affect only code written against beta versions v1.7.0-beta.1 or v1.7.0-beta.2\n* The beta features for CAE, tracing, and fakes have been omitted for this release.\n\n## 1.7.0-beta.2 (2023-06-06)\n\n### Breaking Changes\n> These changes affect only code written against beta version v1.7.0-beta.1\n* Method `SpanFromContext()` on type `tracing.Tracer` had the `bool` return value removed.\n  * This includes the field `SpanFromContext` in supporting type `tracing.TracerOptions`.\n* Method `AddError()` has been removed from type `tracing.Span`.\n* Method `Span.End()` now requires an argument of type `*tracing.SpanEndOptions`.\n\n## 1.6.1 (2023-06-06)\n\n### Bugs Fixed\n* Fixed an issue in `azcore.NewClient()` and `arm.NewClient()` that could cause an incorrect module name to be used in telemetry.\n\n### Other Changes\n* This version contains all bug fixes from `v1.7.0-beta.1`\n\n## 1.7.0-beta.1 (2023-05-24)\n\n### Features Added\n* Restored CAE support for ARM clients.\n* Added supporting features to enable distributed tracing.\n  * Added func `runtime.StartSpan()` for use by SDKs to start spans.\n  * Added method `WithContext()` to `runtime.Request` to support shallow cloning with a new context.\n  * Added field `TracingNamespace` to `runtime.PipelineOptions`.\n  * Added field `Tracer` to `runtime.NewPollerOptions` and `runtime.NewPollerFromResumeTokenOptions` types.\n  * Added field `SpanFromContext` to `tracing.TracerOptions`.\n  * Added methods `Enabled()`, `SetAttributes()`, and `SpanFromContext()` to `tracing.Tracer`.\n  * Added supporting pipeline policies to include HTTP spans when creating clients.\n* Added package `fake` to support generated fakes packages in SDKs.\n  * The package contains public surface area exposed by fake servers and supporting APIs intended only for use by the fake server implementations.\n  * Added an internal fake poller implementation.\n\n### Bugs Fixed\n* Retry policy always clones the underlying `*http.Request` before invoking the next policy.\n* Added some non-standard error codes to the list of error codes for unregistered resource providers.\n\n## 1.6.0 (2023-05-04)\n\n### Features Added\n* Added support for ARM cross-tenant authentication. Set the `AuxiliaryTenants` field of `arm.ClientOptions` to enable.\n* Added `TenantID` field to `policy.TokenRequestOptions`.\n\n## 1.5.0 (2023-04-06)\n\n### Features Added\n* Added `ShouldRetry` to `policy.RetryOptions` for finer-grained control over when to retry.\n\n### Breaking Changes\n> These changes affect only code written against a beta version such as v1.5.0-beta.1\n> These features will return in v1.6.0-beta.1.\n* Removed `TokenRequestOptions.Claims` and `.TenantID`\n* Removed ARM client support for CAE and cross-tenant auth.\n\n### Bugs Fixed\n* Added non-conformant LRO terminal states `Cancelled` and `Completed`.\n\n### Other Changes\n* Updated to latest `internal` module.\n\n## 1.5.0-beta.1 (2023-03-02)\n\n### Features Added\n* This release includes the features added in v1.4.0-beta.1\n\n## 1.4.0 (2023-03-02)\n> This release doesn't include features added in v1.4.0-beta.1. They will return in v1.5.0-beta.1.\n\n### Features Added\n* Add `Clone()` method for `arm/policy.ClientOptions`.\n\n### Bugs Fixed\n* ARM's RP registration policy will no longer swallow unrecognized errors.\n* Fixed an issue in `runtime.NewPollerFromResumeToken()` when resuming a `Poller` with a custom `PollingHandler`.\n* Fixed wrong policy copy in `arm/runtime.NewPipeline()`.\n\n## 1.4.0-beta.1 (2023-02-02)\n\n### Features Added\n* Added support for ARM cross-tenant authentication. Set the `AuxiliaryTenants` field of `arm.ClientOptions` to enable.\n* Added `Claims` and `TenantID` fields to `policy.TokenRequestOptions`.\n* ARM bearer token policy handles CAE challenges.\n\n## 1.3.1 (2023-02-02)\n\n### Other Changes\n* Update dependencies to latest versions.\n\n## 1.3.0 (2023-01-06)\n\n### Features Added\n* Added `BearerTokenOptions.AuthorizationHandler` to enable extending `runtime.BearerTokenPolicy`\n  with custom authorization logic\n* Added `Client` types and matching constructors to the `azcore` and `arm` packages.  These represent a basic client for HTTP and ARM respectively.\n\n### Other Changes\n* Updated `internal` module to latest version.\n* `policy/Request.SetBody()` allows replacing a request's body with an empty one\n\n## 1.2.0 (2022-11-04)\n\n### Features Added\n* Added `ClientOptions.APIVersion` field, which overrides the default version a client\n  requests of the service, if the client supports this (all ARM clients do).\n* Added package `tracing` that contains the building blocks for distributed tracing.\n* Added field `TracingProvider` to type `policy.ClientOptions` that will be used to set the per-client tracing implementation.\n\n### Bugs Fixed\n* Fixed an issue in `runtime.SetMultipartFormData` to properly handle slices of `io.ReadSeekCloser`.\n* Fixed the MaxRetryDelay default to be 60s.\n* Failure to poll the state of an LRO will now return an `*azcore.ResponseError` for poller types that require this behavior.\n* Fixed a bug in `runtime.NewPipeline` that would cause pipeline-specified allowed headers and query parameters to be lost.\n\n### Other Changes\n* Retain contents of read-only fields when sending requests.\n\n## 1.1.4 (2022-10-06)\n\n### Bugs Fixed\n* Don't retry a request if the `Retry-After` delay is greater than the configured `RetryOptions.MaxRetryDelay`.\n* `runtime.JoinPaths`: do not unconditionally add a forward slash before the query string\n\n### Other Changes\n* Removed logging URL from retry policy as it's redundant.\n* Retry policy logs when it exits due to a non-retriable status code.\n\n## 1.1.3 (2022-09-01)\n\n### Bugs Fixed\n* Adjusted the initial retry delay to 800ms per the Azure SDK guidelines.\n\n## 1.1.2 (2022-08-09)\n\n### Other Changes\n* Fixed various doc bugs.\n\n## 1.1.1 (2022-06-30)\n\n### Bugs Fixed\n* Avoid polling when a RELO LRO synchronously terminates.\n\n## 1.1.0 (2022-06-03)\n\n### Other Changes\n* The one-second floor for `Frequency` when calling `PollUntilDone()` has been removed when running tests.\n\n## 1.0.0 (2022-05-12)\n\n### Features Added\n* Added interface `runtime.PollingHandler` to support custom poller implementations.\n  * Added field `PollingHandler` of this type to `runtime.NewPollerOptions[T]` and `runtime.NewPollerFromResumeTokenOptions[T]`.\n\n### Breaking Changes\n* Renamed `cloud.Configuration.LoginEndpoint` to `.ActiveDirectoryAuthorityHost`\n* Renamed `cloud.AzurePublicCloud` to `cloud.AzurePublic`\n* Removed `AuxiliaryTenants` field from `arm/ClientOptions` and `arm/policy/BearerTokenOptions`\n* Removed `TokenRequestOptions.TenantID`\n* `Poller[T].PollUntilDone()` now takes an `options *PollUntilDoneOptions` param instead of `freq time.Duration`\n* Removed `arm/runtime.Poller[T]`, `arm/runtime.NewPoller[T]()` and `arm/runtime.NewPollerFromResumeToken[T]()`\n* Removed `arm/runtime.FinalStateVia` and related `const` values\n* Renamed `runtime.PageProcessor` to `runtime.PagingHandler`\n* The `arm/runtime.ProviderRepsonse` and `arm/runtime.Provider` types are no longer exported.\n* Renamed `NewRequestIdPolicy()` to `NewRequestIDPolicy()`\n* `TokenCredential.GetToken` now returns `AccessToken` by value.\n\n### Bugs Fixed\n* When per-try timeouts are enabled, only cancel the context after the body has been read and closed.\n* The `Operation-Location` poller now properly handles `final-state-via` values.\n* Improvements in `runtime.Poller[T]`\n  * `Poll()` shouldn't cache errors, allowing for additional retries when in a non-terminal state.\n  * `Result()` will cache the terminal result or error but not transient errors, allowing for additional retries.\n\n### Other Changes\n* Updated to latest `internal` module and absorbed breaking changes.\n  * Use `temporal.Resource` and deleted copy.\n* The internal poller implementation has been refactored.\n  * The implementation in `internal/pollers/poller.go` has been merged into `runtime/poller.go` with some slight modification.\n  * The internal poller types had their methods updated to conform to the `runtime.PollingHandler` interface.\n  * The creation of resume tokens has been refactored so that implementers of `runtime.PollingHandler` don't need to know about it.\n* `NewPipeline()` places policies from `ClientOptions` after policies from `PipelineOptions`\n* Default User-Agent headers no longer include `azcore` version information\n\n## 0.23.1 (2022-04-14)\n\n### Bugs Fixed\n* Include XML header when marshalling XML content.\n* Handle XML namespaces when searching for error code.\n* Handle `odata.error` when searching for error code.\n\n## 0.23.0 (2022-04-04)\n\n### Features Added\n* Added `runtime.Pager[T any]` and `runtime.Poller[T any]` supporting types for central, generic, implementations.\n* Added `cloud` package with a new API for cloud configuration\n* Added `FinalStateVia` field to `runtime.NewPollerOptions[T any]` type.\n\n### Breaking Changes\n* Removed the `Poller` type-alias to the internal poller implementation.\n* Added `Ptr[T any]` and `SliceOfPtrs[T any]` in the `to` package and removed all non-generic implementations.\n* `NullValue` and `IsNullValue` now take a generic type parameter instead of an interface func parameter.\n* Replaced `arm.Endpoint` with `cloud` API\n  * Removed the `endpoint` parameter from `NewRPRegistrationPolicy()`\n  * `arm/runtime.NewPipeline()` and `.NewRPRegistrationPolicy()` now return an `error`\n* Refactored `NewPoller` and `NewPollerFromResumeToken` funcs in `arm/runtime` and `runtime` packages.\n  * Removed the `pollerID` parameter as it's no longer required.\n  * Created optional parameter structs and moved optional parameters into them.\n* Changed `FinalStateVia` field to a `const` type.\n\n### Other Changes\n* Converted expiring resource and dependent types to use generics.\n\n## 0.22.0 (2022-03-03)\n\n### Features Added\n* Added header `WWW-Authenticate` to the default allow-list of headers for logging.\n* Added a pipeline policy that enables the retrieval of HTTP responses from API calls.\n  * Added `runtime.WithCaptureResponse` to enable the policy at the API level (off by default).\n\n### Breaking Changes\n* Moved `WithHTTPHeader` and `WithRetryOptions` from the `policy` package to the `runtime` package.\n\n## 0.21.1 (2022-02-04)\n\n### Bugs Fixed\n* Restore response body after reading in `Poller.FinalResponse()`. (#16911)\n* Fixed bug in `NullValue` that could lead to incorrect comparisons for empty maps/slices (#16969)\n\n### Other Changes\n* `BearerTokenPolicy` is more resilient to transient authentication failures. (#16789)\n\n## 0.21.0 (2022-01-11)\n\n### Features Added\n* Added `AllowedHeaders` and `AllowedQueryParams` to `policy.LogOptions` to control which headers and query parameters are written to the logger.\n* Added `azcore.ResponseError` type which is returned from APIs when a non-success HTTP status code is received.\n\n### Breaking Changes\n* Moved `[]policy.Policy` parameters of `arm/runtime.NewPipeline` and `runtime.NewPipeline` into a new struct, `runtime.PipelineOptions`\n* Renamed `arm/ClientOptions.Host` to `.Endpoint`\n* Moved `Request.SkipBodyDownload` method to function `runtime.SkipBodyDownload`\n* Removed `azcore.HTTPResponse` interface type\n* `arm.NewPoller()` and `runtime.NewPoller()` no longer require an `eu` parameter\n* `runtime.NewResponseError()` no longer requires an `error` parameter\n\n## 0.20.0 (2021-10-22)\n\n### Breaking Changes\n* Removed `arm.Connection`\n* Removed `azcore.Credential` and `.NewAnonymousCredential()`\n  * `NewRPRegistrationPolicy` now requires an `azcore.TokenCredential`\n* `runtime.NewPipeline` has a new signature that simplifies implementing custom authentication\n* `arm/runtime.RegistrationOptions` embeds `policy.ClientOptions`\n* Contents in the `log` package have been slightly renamed.\n* Removed `AuthenticationOptions` in favor of `policy.BearerTokenOptions`\n* Changed parameters for `NewBearerTokenPolicy()`\n* Moved policy config options out of `arm/runtime` and into `arm/policy`\n\n### Features Added\n* Updating Documentation\n* Added string typdef `arm.Endpoint` to provide a hint toward expected ARM client endpoints\n* `azcore.ClientOptions` contains common pipeline configuration settings\n* Added support for multi-tenant authorization in `arm/runtime`\n* Require one second minimum when calling `PollUntilDone()`\n\n### Bug Fixes\n* Fixed a potential panic when creating the default Transporter.\n* Close LRO initial response body when creating a poller.\n* Fixed a panic when recursively cloning structs that contain time.Time.\n\n## 0.19.0 (2021-08-25)\n\n### Breaking Changes\n* Split content out of `azcore` into various packages.  The intent is to separate content based on its usage (common, uncommon, SDK authors).\n  * `azcore` has all core functionality.\n  * `log` contains facilities for configuring in-box logging.\n  * `policy` is used for configuring pipeline options and creating custom pipeline policies.\n  * `runtime` contains various helpers used by SDK authors and generated content.\n  * `streaming` has helpers for streaming IO operations.\n* `NewTelemetryPolicy()` now requires module and version parameters and the `Value` option has been removed.\n  * As a result, the `Request.Telemetry()` method has been removed.\n* The telemetry policy now includes the SDK prefix `azsdk-go-` so callers no longer need to provide it.\n* The `*http.Request` in `runtime.Request` is no longer anonymously embedded.  Use the `Raw()` method to access it.\n* The `UserAgent` and `Version` constants have been made internal, `Module` and `Version` respectively.\n\n### Bug Fixes\n* Fixed an issue in the retry policy where the request body could be overwritten after a rewind.\n\n### Other Changes\n* Moved modules `armcore` and `to` content into `arm` and `to` packages respectively.\n  * The `Pipeline()` method on `armcore.Connection` has been replaced by `NewPipeline()` in `arm.Connection`.  It takes module and version parameters used by the telemetry policy.\n* Poller logic has been consolidated across ARM and core implementations.\n  * This required some changes to the internal interfaces for core pollers.\n* The core poller types have been improved, including more logging and test coverage.\n\n## 0.18.1 (2021-08-20)\n\n### Features Added\n* Adds an `ETag` type for comparing etags and handling etags on requests\n* Simplifies the `requestBodyProgess` and `responseBodyProgress` into a single `progress` object\n\n### Bugs Fixed\n* `JoinPaths` will preserve query parameters encoded in the `root` url.\n\n### Other Changes\n* Bumps dependency on `internal` module to the latest version (v0.7.0)\n\n## 0.18.0 (2021-07-29)\n### Features Added\n* Replaces methods from Logger type with two package methods for interacting with the logging functionality.\n* `azcore.SetClassifications` replaces `azcore.Logger().SetClassifications`\n* `azcore.SetListener` replaces `azcore.Logger().SetListener`\n\n### Breaking Changes\n* Removes `Logger` type from `azcore`\n\n\n## 0.17.0 (2021-07-27)\n### Features Added\n* Adding TenantID to TokenRequestOptions (https://github.com/Azure/azure-sdk-for-go/pull/14879)\n* Adding AuxiliaryTenants to AuthenticationOptions (https://github.com/Azure/azure-sdk-for-go/pull/15123)\n\n### Breaking Changes\n* Rename `AnonymousCredential` to `NewAnonymousCredential` (https://github.com/Azure/azure-sdk-for-go/pull/15104)\n* rename `AuthenticationPolicyOptions` to `AuthenticationOptions` (https://github.com/Azure/azure-sdk-for-go/pull/15103)\n* Make Header constants private (https://github.com/Azure/azure-sdk-for-go/pull/15038)\n\n\n## 0.16.2 (2021-05-26)\n### Features Added\n* Improved support for byte arrays [#14715](https://github.com/Azure/azure-sdk-for-go/pull/14715)\n\n\n## 0.16.1 (2021-05-19)\n### Features Added\n* Add license.txt to azcore module [#14682](https://github.com/Azure/azure-sdk-for-go/pull/14682)\n\n\n## 0.16.0 (2021-05-07)\n### Features Added\n* Remove extra `*` in UnmarshalAsByteArray() [#14642](https://github.com/Azure/azure-sdk-for-go/pull/14642)\n\n\n## 0.15.1 (2021-05-06)\n### Features Added\n* Cache the original request body on Request [#14634](https://github.com/Azure/azure-sdk-for-go/pull/14634)\n\n\n## 0.15.0 (2021-05-05)\n### Features Added\n* Add support for null map and slice\n* Export `Response.Payload` method\n\n### Breaking Changes\n* remove `Response.UnmarshalError` as it's no longer required\n\n\n## 0.14.5 (2021-04-23)\n### Features Added\n* Add `UnmarshalError()` on `azcore.Response`\n\n\n## 0.14.4 (2021-04-22)\n### Features Added\n* Support for basic LRO polling\n* Added type `LROPoller` and supporting types for basic polling on long running operations.\n* rename poller param and added doc comment\n\n### Bugs Fixed\n* Fixed content type detection bug in logging.\n\n\n## 0.14.3 (2021-03-29)\n### Features Added\n* Add support for multi-part form data\n* Added method `WriteMultipartFormData()` to Request.\n\n\n## 0.14.2 (2021-03-17)\n### Features Added\n* Add support for encoding JSON null values\n* Adds `NullValue()` and `IsNullValue()` functions for setting and detecting sentinel values used for encoding a JSON null.\n* Documentation fixes\n\n### Bugs Fixed\n* Fixed improper error wrapping\n\n\n## 0.14.1 (2021-02-08)\n### Features Added\n* Add `Pager` and `Poller` interfaces to azcore\n\n\n## 0.14.0 (2021-01-12)\n### Features Added\n* Accept zero-value options for default values\n* Specify zero-value options structs to accept default values.\n* Remove `DefaultXxxOptions()` methods.\n* Do not silently change TryTimeout on negative values\n* make per-try timeout opt-in\n\n\n## 0.13.4 (2020-11-20)\n### Features Added\n* Include telemetry string in User Agent\n\n\n## 0.13.3 (2020-11-20)\n### Features Added\n* Updating response body handling on `azcore.Response`\n\n\n## 0.13.2 (2020-11-13)\n### Features Added\n* Remove implementation of stateless policies as first-class functions.\n\n\n## 0.13.1 (2020-11-05)\n### Features Added\n* Add `Telemetry()` method to `azcore.Request()`\n\n\n## 0.13.0 (2020-10-14)\n### Features Added\n* Rename `log` to `logger` to avoid name collision with the log package.\n* Documentation improvements\n* Simplified `DefaultHTTPClientTransport()` implementation\n\n\n## 0.12.1 (2020-10-13)\n### Features Added\n* Update `internal` module dependence to `v0.5.0`\n\n\n## 0.12.0 (2020-10-08)\n### Features Added\n* Removed storage specific content\n* Removed internal content to prevent API clutter\n* Refactored various policy options to conform with our options pattern\n\n\n## 0.11.0 (2020-09-22)\n### Features Added\n\n* Removed `LogError` and `LogSlowResponse`.\n* Renamed `options` in `RequestLogOptions`.\n* Updated `NewRequestLogPolicy()` to follow standard pattern for options.\n* Refactored `requestLogPolicy.Do()` per above changes.\n* Cleaned up/added logging in retry policy.\n* Export `NewResponseError()`\n* Fix `RequestLogOptions` comment\n\n\n## 0.10.1 (2020-09-17)\n### Features Added\n* Add default console logger\n* Default console logger writes to stderr. To enable it, set env var `AZURE_SDK_GO_LOGGING` to the value 'all'.\n* Added `Logger.Writef()` to reduce the need for `ShouldLog()` checks.\n* Add `LogLongRunningOperation`\n\n\n## 0.10.0 (2020-09-10)\n### Features Added\n* The `request` and `transport` interfaces have been refactored to align with the patterns in the standard library.\n* `NewRequest()` now uses `http.NewRequestWithContext()` and performs additional validation, it also requires a context parameter.\n* The `Policy` and `Transport` interfaces have had their context parameter removed as the context is associated with the underlying `http.Request`.\n* `Pipeline.Do()` will validate the HTTP request before sending it through the pipeline, avoiding retries on a malformed request.\n* The `Retrier` interface has been replaced with the `NonRetriableError` interface, and the retry policy updated to test for this.\n* `Request.SetBody()` now requires a content type parameter for setting the request's MIME type.\n* moved path concatenation into `JoinPaths()` func\n\n\n## 0.9.6 (2020-08-18)\n### Features Added\n* Improvements to body download policy\n* Always download the response body for error responses, i.e. HTTP status codes >= 400.\n* Simplify variable declarations\n\n\n## 0.9.5 (2020-08-11)\n### Features Added\n* Set the Content-Length header in `Request.SetBody`\n\n\n## 0.9.4 (2020-08-03)\n### Features Added\n* Fix cancellation of per try timeout\n* Per try timeout is used to ensure that an HTTP operation doesn't take too long, e.g. that a GET on some URL doesn't take an inordinant amount of time.\n* Once the HTTP request returns, the per try timeout should be cancelled, not when the response has been read to completion.\n* Do not drain response body if there are no more retries\n* Do not retry non-idempotent operations when body download fails\n\n\n## 0.9.3 (2020-07-28)\n### Features Added\n* Add support for custom HTTP request headers\n* Inserts an internal policy into the pipeline that can extract HTTP header values from the caller's context, adding them to the request.\n* Use `azcore.WithHTTPHeader` to add HTTP headers to a context.\n* Remove method specific to Go 1.14\n\n\n## 0.9.2 (2020-07-28)\n### Features Added\n* Omit read-only content from request payloads\n* If any field in a payload's object graph contains `azure:\"ro\"`, make a clone of the object graph, omitting all fields with this annotation.\n* Verify no fields were dropped\n* Handle embedded struct types\n* Added test for cloning by value\n* Add messages to failures\n\n\n## 0.9.1 (2020-07-22)\n### Features Added\n* Updated dependency on internal module to fix race condition.\n\n\n## 0.9.0 (2020-07-09)\n### Features Added\n* Add `HTTPResponse` interface to be used by callers to access the raw HTTP response from an error in the event of an API call failure.\n* Updated `sdk/internal` dependency to latest version.\n* Rename package alias\n\n\n## 0.8.2 (2020-06-29)\n### Features Added\n* Added missing documentation comments\n\n### Bugs Fixed\n* Fixed a bug in body download policy.\n\n\n## 0.8.1 (2020-06-26)\n### Features Added\n* Miscellaneous clean-up reported by linters\n\n\n## 0.8.0 (2020-06-01)\n### Features Added\n* Differentiate between standard and URL encoding.\n\n\n## 0.7.1 (2020-05-27)\n### Features Added\n* Add support for for base64 encoding and decoding of payloads.\n\n\n## 0.7.0 (2020-05-12)\n### Features Added\n* Change `RetryAfter()` to a function.\n\n\n## 0.6.0 (2020-04-29)\n### Features Added\n* Updating `RetryAfter` to only return the detaion in the RetryAfter header\n\n\n## 0.5.0 (2020-03-23)\n### Features Added\n* Export `TransportFunc`\n\n### Breaking Changes\n* Removed `IterationDone`\n\n\n## 0.4.1 (2020-02-25)\n### Features Added\n* Ensure per-try timeout is properly cancelled\n* Explicitly call cancel the per-try timeout when the response body has been read/closed by the body download policy.\n* When the response body is returned to the caller for reading/closing, wrap it in a `responseBodyReader` that will cancel the timeout when the body is closed.\n* `Logger.Should()` will return false if no listener is set.\n\n\n## 0.4.0 (2020-02-18)\n### Features Added\n* Enable custom `RetryOptions` to be specified per API call\n* Added `WithRetryOptions()` that adds a custom `RetryOptions` to the provided context, allowing custom settings per API call.\n* Remove 429 from the list of default HTTP status codes for retry.\n* Change StatusCodesForRetry to a slice so consumers can append to it.\n* Added support for retry-after in HTTP-date format.\n* Cleaned up some comments specific to storage.\n* Remove `Request.SetQueryParam()`\n* Renamed `MaxTries` to `MaxRetries`\n\n## 0.3.0 (2020-01-16)\n### Features Added\n* Added `DefaultRetryOptions` to create initialized default options.\n\n### Breaking Changes\n* Removed `Response.CheckStatusCode()`\n\n\n## 0.2.0 (2020-01-15)\n### Features Added\n* Add support for marshalling and unmarshalling JSON\n* Removed `Response.Payload` field\n* Exit early when unmarsahlling if there is no payload\n\n\n## 0.1.0 (2020-01-10)\n### Features Added\n* Initial release\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/LICENSE.txt",
    "content": "MIT License\n\nCopyright (c) Microsoft Corporation.\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": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/README.md",
    "content": "# Azure Core Client Module for Go\n\n[![PkgGoDev](https://pkg.go.dev/badge/github.com/Azure/azure-sdk-for-go/sdk/azcore)](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore)\n[![Build Status](https://dev.azure.com/azure-sdk/public/_apis/build/status/go/go%20-%20azcore%20-%20ci?branchName=main)](https://dev.azure.com/azure-sdk/public/_build/latest?definitionId=1843&branchName=main)\n[![Code Coverage](https://img.shields.io/azure-devops/coverage/azure-sdk/public/1843/main)](https://img.shields.io/azure-devops/coverage/azure-sdk/public/1843/main)\n\nThe `azcore` module provides a set of common interfaces and types for Go SDK client modules.\nThese modules follow the [Azure SDK Design Guidelines for Go](https://azure.github.io/azure-sdk/golang_introduction.html).\n\n## Getting started\n\nThis project uses [Go modules](https://github.com/golang/go/wiki/Modules) for versioning and dependency management.\n\nTypically, you will not need to explicitly install `azcore` as it will be installed as a client module dependency.\nTo add the latest version to your `go.mod` file, execute the following command.\n\n```bash\ngo get github.com/Azure/azure-sdk-for-go/sdk/azcore\n```\n\nGeneral documentation and examples can be found on [pkg.go.dev](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore).\n\n## Contributing\nThis project welcomes contributions and suggestions. Most contributions require\nyou to agree to a Contributor License Agreement (CLA) declaring that you have\nthe right to, and actually do, grant us the rights to use your contribution.\nFor details, visit [https://cla.microsoft.com](https://cla.microsoft.com).\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether\nyou need to provide a CLA and decorate the PR appropriately (e.g., label,\ncomment). Simply follow the instructions provided by the bot. You will only\nneed to do this once across all repos using our CLA.\n\nThis project has adopted the\n[Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information, see the\n[Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any\nadditional questions or comments.\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/ci.yml",
    "content": "# NOTE: Please refer to https://aka.ms/azsdk/engsys/ci-yaml before editing this file.\ntrigger:\n  branches:\n    include:\n      - main\n      - feature/*\n      - hotfix/*\n      - release/*\n  paths:\n    include:\n    - sdk/azcore/\n    - eng/\n\npr:\n  branches:\n    include:\n      - main\n      - feature/*\n      - hotfix/*\n      - release/*\n  paths:\n    include:\n    - sdk/azcore/\n    - eng/\n\nextends:\n  template: /eng/pipelines/templates/jobs/archetype-sdk-client.yml\n  parameters:\n    ServiceDirectory: azcore\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud/cloud.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage cloud\n\nvar (\n\t// AzureChina contains configuration for Azure China.\n\tAzureChina = Configuration{\n\t\tActiveDirectoryAuthorityHost: \"https://login.chinacloudapi.cn/\", Services: map[ServiceName]ServiceConfiguration{},\n\t}\n\t// AzureGovernment contains configuration for Azure Government.\n\tAzureGovernment = Configuration{\n\t\tActiveDirectoryAuthorityHost: \"https://login.microsoftonline.us/\", Services: map[ServiceName]ServiceConfiguration{},\n\t}\n\t// AzurePublic contains configuration for Azure Public Cloud.\n\tAzurePublic = Configuration{\n\t\tActiveDirectoryAuthorityHost: \"https://login.microsoftonline.com/\", Services: map[ServiceName]ServiceConfiguration{},\n\t}\n)\n\n// ServiceName identifies a cloud service.\ntype ServiceName string\n\n// ResourceManager is a global constant identifying Azure Resource Manager.\nconst ResourceManager ServiceName = \"resourceManager\"\n\n// ServiceConfiguration configures a specific cloud service such as Azure Resource Manager.\ntype ServiceConfiguration struct {\n\t// Audience is the audience the client will request for its access tokens.\n\tAudience string\n\t// Endpoint is the service's base URL.\n\tEndpoint string\n}\n\n// Configuration configures a cloud.\ntype Configuration struct {\n\t// ActiveDirectoryAuthorityHost is the base URL of the cloud's Azure Active Directory.\n\tActiveDirectoryAuthorityHost string\n\t// Services contains configuration for the cloud's services.\n\tServices map[ServiceName]ServiceConfiguration\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud/doc.go",
    "content": "//go:build go1.16\n// +build go1.16\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/*\nPackage cloud implements a configuration API for applications deployed to sovereign or private Azure clouds.\n\nAzure SDK client configuration defaults are appropriate for Azure Public Cloud (sometimes referred to as\n\"Azure Commercial\" or simply \"Microsoft Azure\"). This package enables applications deployed to other\nAzure Clouds to configure clients appropriately.\n\nThis package contains predefined configuration for well-known sovereign clouds such as Azure Government and\nAzure China. Azure SDK clients accept this configuration via the Cloud field of azcore.ClientOptions. For\nexample, configuring a credential and ARM client for Azure Government:\n\n\topts := azcore.ClientOptions{Cloud: cloud.AzureGovernment}\n\tcred, err := azidentity.NewDefaultAzureCredential(\n\t\t&azidentity.DefaultAzureCredentialOptions{ClientOptions: opts},\n\t)\n\thandle(err)\n\n\tclient, err := armsubscription.NewClient(\n\t\tcred, &arm.ClientOptions{ClientOptions: opts},\n\t)\n\thandle(err)\n\nApplications deployed to a private cloud such as Azure Stack create a Configuration object with\nappropriate values:\n\n\tc := cloud.Configuration{\n\t\tActiveDirectoryAuthorityHost: \"https://...\",\n\t\tServices: map[cloud.ServiceName]cloud.ServiceConfiguration{\n\t\t\tcloud.ResourceManager: {\n\t\t\t\tAudience: \"...\",\n\t\t\t\tEndpoint: \"https://...\",\n\t\t\t},\n\t\t},\n\t}\n\topts := azcore.ClientOptions{Cloud: c}\n\n\tcred, err := azidentity.NewDefaultAzureCredential(\n\t\t&azidentity.DefaultAzureCredentialOptions{ClientOptions: opts},\n\t)\n\thandle(err)\n\n\tclient, err := armsubscription.NewClient(\n\t\tcred, &arm.ClientOptions{ClientOptions: opts},\n\t)\n\thandle(err)\n*/\npackage cloud\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/core.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage azcore\n\nimport (\n\t\"reflect\"\n\t\"sync\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing\"\n)\n\n// AccessToken represents an Azure service bearer access token with expiry information.\ntype AccessToken = exported.AccessToken\n\n// TokenCredential represents a credential capable of providing an OAuth token.\ntype TokenCredential = exported.TokenCredential\n\n// KeyCredential contains an authentication key used to authenticate to an Azure service.\ntype KeyCredential = exported.KeyCredential\n\n// NewKeyCredential creates a new instance of [KeyCredential] with the specified values.\n//   - key is the authentication key\nfunc NewKeyCredential(key string) *KeyCredential {\n\treturn exported.NewKeyCredential(key)\n}\n\n// SASCredential contains a shared access signature used to authenticate to an Azure service.\ntype SASCredential = exported.SASCredential\n\n// NewSASCredential creates a new instance of [SASCredential] with the specified values.\n//   - sas is the shared access signature\nfunc NewSASCredential(sas string) *SASCredential {\n\treturn exported.NewSASCredential(sas)\n}\n\n// holds sentinel values used to send nulls\nvar nullables map[reflect.Type]any = map[reflect.Type]any{}\nvar nullablesMu sync.RWMutex\n\n// NullValue is used to send an explicit 'null' within a request.\n// This is typically used in JSON-MERGE-PATCH operations to delete a value.\nfunc NullValue[T any]() T {\n\tt := shared.TypeOfT[T]()\n\n\tnullablesMu.RLock()\n\tv, found := nullables[t]\n\tnullablesMu.RUnlock()\n\n\tif found {\n\t\t// return the sentinel object\n\t\treturn v.(T)\n\t}\n\n\t// promote to exclusive lock and check again (double-checked locking pattern)\n\tnullablesMu.Lock()\n\tdefer nullablesMu.Unlock()\n\tv, found = nullables[t]\n\n\tif !found {\n\t\tvar o reflect.Value\n\t\tif k := t.Kind(); k == reflect.Map {\n\t\t\to = reflect.MakeMap(t)\n\t\t} else if k == reflect.Slice {\n\t\t\t// empty slices appear to all point to the same data block\n\t\t\t// which causes comparisons to become ambiguous.  so we create\n\t\t\t// a slice with len/cap of one which ensures a unique address.\n\t\t\to = reflect.MakeSlice(t, 1, 1)\n\t\t} else {\n\t\t\to = reflect.New(t.Elem())\n\t\t}\n\t\tv = o.Interface()\n\t\tnullables[t] = v\n\t}\n\t// return the sentinel object\n\treturn v.(T)\n}\n\n// IsNullValue returns true if the field contains a null sentinel value.\n// This is used by custom marshallers to properly encode a null value.\nfunc IsNullValue[T any](v T) bool {\n\t// see if our map has a sentinel object for this *T\n\tt := reflect.TypeOf(v)\n\tnullablesMu.RLock()\n\tdefer nullablesMu.RUnlock()\n\n\tif o, found := nullables[t]; found {\n\t\to1 := reflect.ValueOf(o)\n\t\tv1 := reflect.ValueOf(v)\n\t\t// we found it; return true if v points to the sentinel object.\n\t\t// NOTE: maps and slices can only be compared to nil, else you get\n\t\t// a runtime panic.  so we compare addresses instead.\n\t\treturn o1.Pointer() == v1.Pointer()\n\t}\n\t// no sentinel object for this *t\n\treturn false\n}\n\n// ClientOptions contains optional settings for a client's pipeline.\n// Instances can be shared across calls to SDK client constructors when uniform configuration is desired.\n// Zero-value fields will have their specified default values applied during use.\ntype ClientOptions = policy.ClientOptions\n\n// Client is a basic HTTP client.  It consists of a pipeline and tracing provider.\ntype Client struct {\n\tpl runtime.Pipeline\n\ttr tracing.Tracer\n\n\t// cached on the client to support shallow copying with new values\n\ttp        tracing.Provider\n\tmodVer    string\n\tnamespace string\n}\n\n// NewClient creates a new Client instance with the provided values.\n//   - moduleName - the fully qualified name of the module where the client is defined; used by the telemetry policy and tracing provider.\n//   - moduleVersion - the semantic version of the module; used by the telemetry policy and tracing provider.\n//   - plOpts - pipeline configuration options; can be the zero-value\n//   - options - optional client configurations; pass nil to accept the default values\nfunc NewClient(moduleName, moduleVersion string, plOpts runtime.PipelineOptions, options *ClientOptions) (*Client, error) {\n\tif options == nil {\n\t\toptions = &ClientOptions{}\n\t}\n\n\tif !options.Telemetry.Disabled {\n\t\tif err := shared.ValidateModVer(moduleVersion); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tpl := runtime.NewPipeline(moduleName, moduleVersion, plOpts, options)\n\n\ttr := options.TracingProvider.NewTracer(moduleName, moduleVersion)\n\tif tr.Enabled() && plOpts.Tracing.Namespace != \"\" {\n\t\ttr.SetAttributes(tracing.Attribute{Key: shared.TracingNamespaceAttrName, Value: plOpts.Tracing.Namespace})\n\t}\n\n\treturn &Client{\n\t\tpl:        pl,\n\t\ttr:        tr,\n\t\ttp:        options.TracingProvider,\n\t\tmodVer:    moduleVersion,\n\t\tnamespace: plOpts.Tracing.Namespace,\n\t}, nil\n}\n\n// Pipeline returns the pipeline for this client.\nfunc (c *Client) Pipeline() runtime.Pipeline {\n\treturn c.pl\n}\n\n// Tracer returns the tracer for this client.\nfunc (c *Client) Tracer() tracing.Tracer {\n\treturn c.tr\n}\n\n// WithClientName returns a shallow copy of the Client with its tracing client name changed to clientName.\n// Note that the values for module name and version will be preserved from the source Client.\n//   - clientName - the fully qualified name of the client (\"package.Client\"); this is used by the tracing provider when creating spans\nfunc (c *Client) WithClientName(clientName string) *Client {\n\ttr := c.tp.NewTracer(clientName, c.modVer)\n\tif tr.Enabled() && c.namespace != \"\" {\n\t\ttr.SetAttributes(tracing.Attribute{Key: shared.TracingNamespaceAttrName, Value: c.namespace})\n\t}\n\treturn &Client{pl: c.pl, tr: tr, tp: c.tp, modVer: c.modVer, namespace: c.namespace}\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/doc.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright 2017 Microsoft Corporation. All rights reserved.\n// Use of this source code is governed by an MIT\n// license that can be found in the LICENSE file.\n\n/*\nPackage azcore implements an HTTP request/response middleware pipeline used by Azure SDK clients.\n\nThe middleware consists of three components.\n\n  - One or more Policy instances.\n  - A Transporter instance.\n  - A Pipeline instance that combines the Policy and Transporter instances.\n\n# Implementing the Policy Interface\n\nA Policy can be implemented in two ways; as a first-class function for a stateless Policy, or as\na method on a type for a stateful Policy.  Note that HTTP requests made via the same pipeline share\nthe same Policy instances, so if a Policy mutates its state it MUST be properly synchronized to\navoid race conditions.\n\nA Policy's Do method is called when an HTTP request wants to be sent over the network. The Do method can\nperform any operation(s) it desires. For example, it can log the outgoing request, mutate the URL, headers,\nand/or query parameters, inject a failure, etc.  Once the Policy has successfully completed its request\nwork, it must call the Next() method on the *policy.Request instance in order to pass the request to the\nnext Policy in the chain.\n\nWhen an HTTP response comes back, the Policy then gets a chance to process the response/error.  The Policy instance\ncan log the response, retry the operation if it failed due to a transient error or timeout, unmarshal the response\nbody, etc.  Once the Policy has successfully completed its response work, it must return the *http.Response\nand error instances to its caller.\n\nTemplate for implementing a stateless Policy:\n\n\ttype policyFunc func(*policy.Request) (*http.Response, error)\n\n\t// Do implements the Policy interface on policyFunc.\n\tfunc (pf policyFunc) Do(req *policy.Request) (*http.Response, error) {\n\t\treturn pf(req)\n\t}\n\n\tfunc NewMyStatelessPolicy() policy.Policy {\n\t\treturn policyFunc(func(req *policy.Request) (*http.Response, error) {\n\t\t\t// TODO: mutate/process Request here\n\n\t\t\t// forward Request to next Policy & get Response/error\n\t\t\tresp, err := req.Next()\n\n\t\t\t// TODO: mutate/process Response/error here\n\n\t\t\t// return Response/error to previous Policy\n\t\t\treturn resp, err\n\t\t})\n\t}\n\nTemplate for implementing a stateful Policy:\n\n\ttype MyStatefulPolicy struct {\n\t\t// TODO: add configuration/setting fields here\n\t}\n\n\t// TODO: add initialization args to NewMyStatefulPolicy()\n\tfunc NewMyStatefulPolicy() policy.Policy {\n\t\treturn &MyStatefulPolicy{\n\t\t\t// TODO: initialize configuration/setting fields here\n\t\t}\n\t}\n\n\tfunc (p *MyStatefulPolicy) Do(req *policy.Request) (resp *http.Response, err error) {\n\t\t// TODO: mutate/process Request here\n\n\t\t// forward Request to next Policy & get Response/error\n\t\tresp, err := req.Next()\n\n\t\t// TODO: mutate/process Response/error here\n\n\t\t// return Response/error to previous Policy\n\t\treturn resp, err\n\t}\n\n# Implementing the Transporter Interface\n\nThe Transporter interface is responsible for sending the HTTP request and returning the corresponding\nHTTP response or error.  The Transporter is invoked by the last Policy in the chain.  The default Transporter\nimplementation uses a shared http.Client from the standard library.\n\nThe same stateful/stateless rules for Policy implementations apply to Transporter implementations.\n\n# Using Policy and Transporter Instances Via a Pipeline\n\nTo use the Policy and Transporter instances, an application passes them to the runtime.NewPipeline function.\n\n\tfunc NewPipeline(transport Transporter, policies ...Policy) Pipeline\n\nThe specified Policy instances form a chain and are invoked in the order provided to NewPipeline\nfollowed by the Transporter.\n\nOnce the Pipeline has been created, create a runtime.Request instance and pass it to Pipeline's Do method.\n\n\tfunc NewRequest(ctx context.Context, httpMethod string, endpoint string) (*Request, error)\n\n\tfunc (p Pipeline) Do(req *Request) (*http.Request, error)\n\nThe Pipeline.Do method sends the specified Request through the chain of Policy and Transporter\ninstances.  The response/error is then sent through the same chain of Policy instances in reverse\norder.  For example, assuming there are Policy types PolicyA, PolicyB, and PolicyC along with\nTransportA.\n\n\tpipeline := NewPipeline(TransportA, PolicyA, PolicyB, PolicyC)\n\nThe flow of Request and Response looks like the following:\n\n\tpolicy.Request -> PolicyA -> PolicyB -> PolicyC -> TransportA -----+\n\t                                                                   |\n\t                                                            HTTP(S) endpoint\n\t                                                                   |\n\tcaller <--------- PolicyA <- PolicyB <- PolicyC <- http.Response-+\n\n# Creating a Request Instance\n\nThe Request instance passed to Pipeline's Do method is a wrapper around an *http.Request.  It also\ncontains some internal state and provides various convenience methods.  You create a Request instance\nby calling the runtime.NewRequest function:\n\n\tfunc NewRequest(ctx context.Context, httpMethod string, endpoint string) (*Request, error)\n\nIf the Request should contain a body, call the SetBody method.\n\n\tfunc (req *Request) SetBody(body ReadSeekCloser, contentType string) error\n\nA seekable stream is required so that upon retry, the retry Policy instance can seek the stream\nback to the beginning before retrying the network request and re-uploading the body.\n\n# Sending an Explicit Null\n\nOperations like JSON-MERGE-PATCH send a JSON null to indicate a value should be deleted.\n\n\t{\n\t\t\"delete-me\": null\n\t}\n\nThis requirement conflicts with the SDK's default marshalling that specifies \"omitempty\" as\na means to resolve the ambiguity between a field to be excluded and its zero-value.\n\n\ttype Widget struct {\n\t\tName  *string `json:\",omitempty\"`\n\t\tCount *int    `json:\",omitempty\"`\n\t}\n\nIn the above example, Name and Count are defined as pointer-to-type to disambiguate between\na missing value (nil) and a zero-value (0) which might have semantic differences.\n\nIn a PATCH operation, any fields left as nil are to have their values preserved.  When updating\na Widget's count, one simply specifies the new value for Count, leaving Name nil.\n\nTo fulfill the requirement for sending a JSON null, the NullValue() function can be used.\n\n\tw := Widget{\n\t\tCount: azcore.NullValue[*int](),\n\t}\n\nThis sends an explict \"null\" for Count, indicating that any current value for Count should be deleted.\n\n# Processing the Response\n\nWhen the HTTP response is received, the *http.Response is returned directly. Each Policy instance\ncan inspect/mutate the *http.Response.\n\n# Built-in Logging\n\nTo enable logging, set environment variable AZURE_SDK_GO_LOGGING to \"all\" before executing your program.\n\nBy default the logger writes to stderr.  This can be customized by calling log.SetListener, providing\na callback that writes to the desired location.  Any custom logging implementation MUST provide its\nown synchronization to handle concurrent invocations.\n\nSee the docs for the log package for further details.\n\n# Pageable Operations\n\nPageable operations return potentially large data sets spread over multiple GET requests.  The result of\neach GET is a \"page\" of data consisting of a slice of items.\n\nPageable operations can be identified by their New*Pager naming convention and return type of *runtime.Pager[T].\n\n\tfunc (c *WidgetClient) NewListWidgetsPager(o *Options) *runtime.Pager[PageResponse]\n\nThe call to WidgetClient.NewListWidgetsPager() returns an instance of *runtime.Pager[T] for fetching pages\nand determining if there are more pages to fetch.  No IO calls are made until the NextPage() method is invoked.\n\n\tpager := widgetClient.NewListWidgetsPager(nil)\n\tfor pager.More() {\n\t\tpage, err := pager.NextPage(context.TODO())\n\t\t// handle err\n\t\tfor _, widget := range page.Values {\n\t\t\t// process widget\n\t\t}\n\t}\n\n# Long-Running Operations\n\nLong-running operations (LROs) are operations consisting of an initial request to start the operation followed\nby polling to determine when the operation has reached a terminal state.  An LRO's terminal state is one\nof the following values.\n\n  - Succeeded - the LRO completed successfully\n  - Failed - the LRO failed to complete\n  - Canceled - the LRO was canceled\n\nLROs can be identified by their Begin* prefix and their return type of *runtime.Poller[T].\n\n\tfunc (c *WidgetClient) BeginCreateOrUpdate(ctx context.Context, w Widget, o *Options) (*runtime.Poller[Response], error)\n\nWhen a call to WidgetClient.BeginCreateOrUpdate() returns a nil error, it means that the LRO has started.\nIt does _not_ mean that the widget has been created or updated (or failed to be created/updated).\n\nThe *runtime.Poller[T] provides APIs for determining the state of the LRO.  To wait for the LRO to complete,\ncall the PollUntilDone() method.\n\n\tpoller, err := widgetClient.BeginCreateOrUpdate(context.TODO(), Widget{}, nil)\n\t// handle err\n\tresult, err := poller.PollUntilDone(context.TODO(), nil)\n\t// handle err\n\t// use result\n\nThe call to PollUntilDone() will block the current goroutine until the LRO has reached a terminal state or the\ncontext is canceled/timed out.\n\nNote that LROs can take anywhere from several seconds to several minutes.  The duration is operation-dependent.  Due to\nthis variant behavior, pollers do _not_ have a preconfigured time-out.  Use a context with the appropriate cancellation\nmechanism as required.\n\n# Resume Tokens\n\nPollers provide the ability to serialize their state into a \"resume token\" which can be used by another process to\nrecreate the poller.  This is achieved via the runtime.Poller[T].ResumeToken() method.\n\n\ttoken, err := poller.ResumeToken()\n\t// handle error\n\nNote that a token can only be obtained for a poller that's in a non-terminal state.  Also note that any subsequent calls\nto poller.Poll() might change the poller's state.  In this case, a new token should be created.\n\nAfter the token has been obtained, it can be used to recreate an instance of the originating poller.\n\n\tpoller, err := widgetClient.BeginCreateOrUpdate(nil, Widget{}, &Options{\n\t\tResumeToken: token,\n\t})\n\nWhen resuming a poller, no IO is performed, and zero-value arguments can be used for everything but the Options.ResumeToken.\n\nResume tokens are unique per service client and operation.  Attempting to resume a poller for LRO BeginB() with a token from LRO\nBeginA() will result in an error.\n\n# Fakes\n\nThe fake package contains types used for constructing in-memory fake servers used in unit tests.\nThis allows writing tests to cover various success/error conditions without the need for connecting to a live service.\n\nPlease see https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/samples/fakes for details and examples on how to use fakes.\n*/\npackage azcore\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/errors.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage azcore\n\nimport \"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n\n// ResponseError is returned when a request is made to a service and\n// the service returns a non-success HTTP status code.\n// Use errors.As() to access this type in the error chain.\n//\n// When marshaling instances, the RawResponse field will be omitted.\n// However, the contents returned by Error() will be preserved.\ntype ResponseError = exported.ResponseError\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/etag.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage azcore\n\nimport (\n\t\"strings\"\n)\n\n// ETag is a property used for optimistic concurrency during updates\n// ETag is a validator based on https://tools.ietf.org/html/rfc7232#section-2.3.2\n// An ETag can be empty (\"\").\ntype ETag string\n\n// ETagAny is an ETag that represents everything, the value is \"*\"\nconst ETagAny ETag = \"*\"\n\n// Equals does a strong comparison of two ETags. Equals returns true when both\n// ETags are not weak and the values of the underlying strings are equal.\nfunc (e ETag) Equals(other ETag) bool {\n\treturn !e.IsWeak() && !other.IsWeak() && e == other\n}\n\n// WeakEquals does a weak comparison of two ETags. Two ETags are equivalent if their opaque-tags match\n// character-by-character, regardless of either or both being tagged as \"weak\".\nfunc (e ETag) WeakEquals(other ETag) bool {\n\tgetStart := func(e1 ETag) int {\n\t\tif e1.IsWeak() {\n\t\t\treturn 2\n\t\t}\n\t\treturn 0\n\t}\n\taStart := getStart(e)\n\tbStart := getStart(other)\n\n\taVal := e[aStart:]\n\tbVal := other[bStart:]\n\n\treturn aVal == bVal\n}\n\n// IsWeak specifies whether the ETag is strong or weak.\nfunc (e ETag) IsWeak() bool {\n\treturn len(e) >= 4 && strings.HasPrefix(string(e), \"W/\\\"\") && strings.HasSuffix(string(e), \"\\\"\")\n}\n\n// MatchConditions specifies HTTP options for conditional requests.\ntype MatchConditions struct {\n\t// Optionally limit requests to resources that have a matching ETag.\n\tIfMatch *ETag\n\n\t// Optionally limit requests to resources that do not match the ETag.\n\tIfNoneMatch *ETag\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/exported.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage exported\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"sync/atomic\"\n\t\"time\"\n)\n\ntype nopCloser struct {\n\tio.ReadSeeker\n}\n\nfunc (n nopCloser) Close() error {\n\treturn nil\n}\n\n// NopCloser returns a ReadSeekCloser with a no-op close method wrapping the provided io.ReadSeeker.\n// Exported as streaming.NopCloser().\nfunc NopCloser(rs io.ReadSeeker) io.ReadSeekCloser {\n\treturn nopCloser{rs}\n}\n\n// HasStatusCode returns true if the Response's status code is one of the specified values.\n// Exported as runtime.HasStatusCode().\nfunc HasStatusCode(resp *http.Response, statusCodes ...int) bool {\n\tif resp == nil {\n\t\treturn false\n\t}\n\tfor _, sc := range statusCodes {\n\t\tif resp.StatusCode == sc {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// AccessToken represents an Azure service bearer access token with expiry information.\n// Exported as azcore.AccessToken.\ntype AccessToken struct {\n\t// Token is the access token\n\tToken string\n\t// ExpiresOn indicates when the token expires\n\tExpiresOn time.Time\n\t// RefreshOn is a suggested time to refresh the token.\n\t// Clients should ignore this value when it's zero.\n\tRefreshOn time.Time\n}\n\n// TokenRequestOptions contain specific parameter that may be used by credentials types when attempting to get a token.\n// Exported as policy.TokenRequestOptions.\ntype TokenRequestOptions struct {\n\t// Claims are any additional claims required for the token to satisfy a conditional access policy, such as a\n\t// service may return in a claims challenge following an authorization failure. If a service returned the\n\t// claims value base64 encoded, it must be decoded before setting this field.\n\tClaims string\n\n\t// EnableCAE indicates whether to enable Continuous Access Evaluation (CAE) for the requested token. When true,\n\t// azidentity credentials request CAE tokens for resource APIs supporting CAE. Clients are responsible for\n\t// handling CAE challenges. If a client that doesn't handle CAE challenges receives a CAE token, it may end up\n\t// in a loop retrying an API call with a token that has been revoked due to CAE.\n\tEnableCAE bool\n\n\t// Scopes contains the list of permission scopes required for the token.\n\tScopes []string\n\n\t// TenantID identifies the tenant from which to request the token. azidentity credentials authenticate in\n\t// their configured default tenants when this field isn't set.\n\tTenantID string\n}\n\n// TokenCredential represents a credential capable of providing an OAuth token.\n// Exported as azcore.TokenCredential.\ntype TokenCredential interface {\n\t// GetToken requests an access token for the specified set of scopes.\n\tGetToken(ctx context.Context, options TokenRequestOptions) (AccessToken, error)\n}\n\n// DecodeByteArray will base-64 decode the provided string into v.\n// Exported as runtime.DecodeByteArray()\nfunc DecodeByteArray(s string, v *[]byte, format Base64Encoding) error {\n\tif len(s) == 0 {\n\t\treturn nil\n\t}\n\tpayload := string(s)\n\tif payload[0] == '\"' {\n\t\t// remove surrounding quotes\n\t\tpayload = payload[1 : len(payload)-1]\n\t}\n\tswitch format {\n\tcase Base64StdFormat:\n\t\tdecoded, err := base64.StdEncoding.DecodeString(payload)\n\t\tif err == nil {\n\t\t\t*v = decoded\n\t\t\treturn nil\n\t\t}\n\t\treturn err\n\tcase Base64URLFormat:\n\t\t// use raw encoding as URL format should not contain any '=' characters\n\t\tdecoded, err := base64.RawURLEncoding.DecodeString(payload)\n\t\tif err == nil {\n\t\t\t*v = decoded\n\t\t\treturn nil\n\t\t}\n\t\treturn err\n\tdefault:\n\t\treturn fmt.Errorf(\"unrecognized byte array format: %d\", format)\n\t}\n}\n\n// KeyCredential contains an authentication key used to authenticate to an Azure service.\n// Exported as azcore.KeyCredential.\ntype KeyCredential struct {\n\tcred *keyCredential\n}\n\n// NewKeyCredential creates a new instance of [KeyCredential] with the specified values.\n//   - key is the authentication key\nfunc NewKeyCredential(key string) *KeyCredential {\n\treturn &KeyCredential{cred: newKeyCredential(key)}\n}\n\n// Update replaces the existing key with the specified value.\nfunc (k *KeyCredential) Update(key string) {\n\tk.cred.Update(key)\n}\n\n// SASCredential contains a shared access signature used to authenticate to an Azure service.\n// Exported as azcore.SASCredential.\ntype SASCredential struct {\n\tcred *keyCredential\n}\n\n// NewSASCredential creates a new instance of [SASCredential] with the specified values.\n//   - sas is the shared access signature\nfunc NewSASCredential(sas string) *SASCredential {\n\treturn &SASCredential{cred: newKeyCredential(sas)}\n}\n\n// Update replaces the existing shared access signature with the specified value.\nfunc (k *SASCredential) Update(sas string) {\n\tk.cred.Update(sas)\n}\n\n// KeyCredentialGet returns the key for cred.\nfunc KeyCredentialGet(cred *KeyCredential) string {\n\treturn cred.cred.Get()\n}\n\n// SASCredentialGet returns the shared access sig for cred.\nfunc SASCredentialGet(cred *SASCredential) string {\n\treturn cred.cred.Get()\n}\n\ntype keyCredential struct {\n\tkey atomic.Value // string\n}\n\nfunc newKeyCredential(key string) *keyCredential {\n\tkeyCred := keyCredential{}\n\tkeyCred.key.Store(key)\n\treturn &keyCred\n}\n\nfunc (k *keyCredential) Get() string {\n\treturn k.key.Load().(string)\n}\n\nfunc (k *keyCredential) Update(key string) {\n\tk.key.Store(key)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/pipeline.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage exported\n\nimport (\n\t\"errors\"\n\t\"net/http\"\n)\n\n// Policy represents an extensibility point for the Pipeline that can mutate the specified\n// Request and react to the received Response.\n// Exported as policy.Policy.\ntype Policy interface {\n\t// Do applies the policy to the specified Request.  When implementing a Policy, mutate the\n\t// request before calling req.Next() to move on to the next policy, and respond to the result\n\t// before returning to the caller.\n\tDo(req *Request) (*http.Response, error)\n}\n\n// Pipeline represents a primitive for sending HTTP requests and receiving responses.\n// Its behavior can be extended by specifying policies during construction.\n// Exported as runtime.Pipeline.\ntype Pipeline struct {\n\tpolicies []Policy\n}\n\n// Transporter represents an HTTP pipeline transport used to send HTTP requests and receive responses.\n// Exported as policy.Transporter.\ntype Transporter interface {\n\t// Do sends the HTTP request and returns the HTTP response or error.\n\tDo(req *http.Request) (*http.Response, error)\n}\n\n// used to adapt a TransportPolicy to a Policy\ntype transportPolicy struct {\n\ttrans Transporter\n}\n\nfunc (tp transportPolicy) Do(req *Request) (*http.Response, error) {\n\tif tp.trans == nil {\n\t\treturn nil, errors.New(\"missing transporter\")\n\t}\n\tresp, err := tp.trans.Do(req.Raw())\n\tif err != nil {\n\t\treturn nil, err\n\t} else if resp == nil {\n\t\t// there was no response and no error (rare but can happen)\n\t\t// this ensures the retry policy will retry the request\n\t\treturn nil, errors.New(\"received nil response\")\n\t}\n\treturn resp, nil\n}\n\n// NewPipeline creates a new Pipeline object from the specified Policies.\n// Not directly exported, but used as part of runtime.NewPipeline().\nfunc NewPipeline(transport Transporter, policies ...Policy) Pipeline {\n\t// transport policy must always be the last in the slice\n\tpolicies = append(policies, transportPolicy{trans: transport})\n\treturn Pipeline{\n\t\tpolicies: policies,\n\t}\n}\n\n// Do is called for each and every HTTP request. It passes the request through all\n// the Policy objects (which can transform the Request's URL/query parameters/headers)\n// and ultimately sends the transformed HTTP request over the network.\nfunc (p Pipeline) Do(req *Request) (*http.Response, error) {\n\tif req == nil {\n\t\treturn nil, errors.New(\"request cannot be nil\")\n\t}\n\treq.policies = p.policies\n\treturn req.Next()\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/request.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage exported\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"reflect\"\n\t\"strconv\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n)\n\n// Base64Encoding is usesd to specify which base-64 encoder/decoder to use when\n// encoding/decoding a slice of bytes to/from a string.\n// Exported as runtime.Base64Encoding\ntype Base64Encoding int\n\nconst (\n\t// Base64StdFormat uses base64.StdEncoding for encoding and decoding payloads.\n\tBase64StdFormat Base64Encoding = 0\n\n\t// Base64URLFormat uses base64.RawURLEncoding for encoding and decoding payloads.\n\tBase64URLFormat Base64Encoding = 1\n)\n\n// EncodeByteArray will base-64 encode the byte slice v.\n// Exported as runtime.EncodeByteArray()\nfunc EncodeByteArray(v []byte, format Base64Encoding) string {\n\tif format == Base64URLFormat {\n\t\treturn base64.RawURLEncoding.EncodeToString(v)\n\t}\n\treturn base64.StdEncoding.EncodeToString(v)\n}\n\n// Request is an abstraction over the creation of an HTTP request as it passes through the pipeline.\n// Don't use this type directly, use NewRequest() instead.\n// Exported as policy.Request.\ntype Request struct {\n\treq      *http.Request\n\tbody     io.ReadSeekCloser\n\tpolicies []Policy\n\tvalues   opValues\n}\n\ntype opValues map[reflect.Type]any\n\n// Set adds/changes a value\nfunc (ov opValues) set(value any) {\n\tov[reflect.TypeOf(value)] = value\n}\n\n// Get looks for a value set by SetValue first\nfunc (ov opValues) get(value any) bool {\n\tv, ok := ov[reflect.ValueOf(value).Elem().Type()]\n\tif ok {\n\t\treflect.ValueOf(value).Elem().Set(reflect.ValueOf(v))\n\t}\n\treturn ok\n}\n\n// NewRequestFromRequest creates a new policy.Request with an existing *http.Request\n// Exported as runtime.NewRequestFromRequest().\nfunc NewRequestFromRequest(req *http.Request) (*Request, error) {\n\tpolicyReq := &Request{req: req}\n\n\tif req.Body != nil {\n\t\t// we can avoid a body copy here if the underlying stream is already a\n\t\t// ReadSeekCloser.\n\t\treadSeekCloser, isReadSeekCloser := req.Body.(io.ReadSeekCloser)\n\n\t\tif !isReadSeekCloser {\n\t\t\t// since this is an already populated http.Request we want to copy\n\t\t\t// over its body, if it has one.\n\t\t\tbodyBytes, err := io.ReadAll(req.Body)\n\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tif err := req.Body.Close(); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\treadSeekCloser = NopCloser(bytes.NewReader(bodyBytes))\n\t\t}\n\n\t\t// SetBody also takes care of updating the http.Request's body\n\t\t// as well, so they should stay in-sync from this point.\n\t\tif err := policyReq.SetBody(readSeekCloser, req.Header.Get(\"Content-Type\")); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treturn policyReq, nil\n}\n\n// NewRequest creates a new Request with the specified input.\n// Exported as runtime.NewRequest().\nfunc NewRequest(ctx context.Context, httpMethod string, endpoint string) (*Request, error) {\n\treq, err := http.NewRequestWithContext(ctx, httpMethod, endpoint, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif req.URL.Host == \"\" {\n\t\treturn nil, errors.New(\"no Host in request URL\")\n\t}\n\tif !(req.URL.Scheme == \"http\" || req.URL.Scheme == \"https\") {\n\t\treturn nil, fmt.Errorf(\"unsupported protocol scheme %s\", req.URL.Scheme)\n\t}\n\treturn &Request{req: req}, nil\n}\n\n// Body returns the original body specified when the Request was created.\nfunc (req *Request) Body() io.ReadSeekCloser {\n\treturn req.body\n}\n\n// Raw returns the underlying HTTP request.\nfunc (req *Request) Raw() *http.Request {\n\treturn req.req\n}\n\n// Next calls the next policy in the pipeline.\n// If there are no more policies, nil and an error are returned.\n// This method is intended to be called from pipeline policies.\n// To send a request through a pipeline call Pipeline.Do().\nfunc (req *Request) Next() (*http.Response, error) {\n\tif len(req.policies) == 0 {\n\t\treturn nil, errors.New(\"no more policies\")\n\t}\n\tnextPolicy := req.policies[0]\n\tnextReq := *req\n\tnextReq.policies = nextReq.policies[1:]\n\treturn nextPolicy.Do(&nextReq)\n}\n\n// SetOperationValue adds/changes a mutable key/value associated with a single operation.\nfunc (req *Request) SetOperationValue(value any) {\n\tif req.values == nil {\n\t\treq.values = opValues{}\n\t}\n\treq.values.set(value)\n}\n\n// OperationValue looks for a value set by SetOperationValue().\nfunc (req *Request) OperationValue(value any) bool {\n\tif req.values == nil {\n\t\treturn false\n\t}\n\treturn req.values.get(value)\n}\n\n// SetBody sets the specified ReadSeekCloser as the HTTP request body, and sets Content-Type and Content-Length\n// accordingly. If the ReadSeekCloser is nil or empty, Content-Length won't be set. If contentType is \"\",\n// Content-Type won't be set, and if it was set, will be deleted.\n// Use streaming.NopCloser to turn an io.ReadSeeker into an io.ReadSeekCloser.\nfunc (req *Request) SetBody(body io.ReadSeekCloser, contentType string) error {\n\t// clobber the existing Content-Type to preserve behavior\n\treturn SetBody(req, body, contentType, true)\n}\n\n// RewindBody seeks the request's Body stream back to the beginning so it can be resent when retrying an operation.\nfunc (req *Request) RewindBody() error {\n\tif req.body != nil {\n\t\t// Reset the stream back to the beginning and restore the body\n\t\t_, err := req.body.Seek(0, io.SeekStart)\n\t\treq.req.Body = req.body\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Close closes the request body.\nfunc (req *Request) Close() error {\n\tif req.body == nil {\n\t\treturn nil\n\t}\n\treturn req.body.Close()\n}\n\n// Clone returns a deep copy of the request with its context changed to ctx.\nfunc (req *Request) Clone(ctx context.Context) *Request {\n\tr2 := *req\n\tr2.req = req.req.Clone(ctx)\n\treturn &r2\n}\n\n// WithContext returns a shallow copy of the request with its context changed to ctx.\nfunc (req *Request) WithContext(ctx context.Context) *Request {\n\tr2 := new(Request)\n\t*r2 = *req\n\tr2.req = r2.req.WithContext(ctx)\n\treturn r2\n}\n\n// not exported but dependent on Request\n\n// PolicyFunc is a type that implements the Policy interface.\n// Use this type when implementing a stateless policy as a first-class function.\ntype PolicyFunc func(*Request) (*http.Response, error)\n\n// Do implements the Policy interface on policyFunc.\nfunc (pf PolicyFunc) Do(req *Request) (*http.Response, error) {\n\treturn pf(req)\n}\n\n// SetBody sets the specified ReadSeekCloser as the HTTP request body, and sets Content-Type and Content-Length accordingly.\n//   - req is the request to modify\n//   - body is the request body; if nil or empty, Content-Length won't be set\n//   - contentType is the value for the Content-Type header; if empty, Content-Type will be deleted\n//   - clobberContentType when true, will overwrite the existing value of Content-Type with contentType\nfunc SetBody(req *Request, body io.ReadSeekCloser, contentType string, clobberContentType bool) error {\n\tvar err error\n\tvar size int64\n\tif body != nil {\n\t\tsize, err = body.Seek(0, io.SeekEnd) // Seek to the end to get the stream's size\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif size == 0 {\n\t\t// treat an empty stream the same as a nil one: assign req a nil body\n\t\tbody = nil\n\t\t// RFC 9110 specifies a client shouldn't set Content-Length on a request containing no content\n\t\t// (Del is a no-op when the header has no value)\n\t\treq.req.Header.Del(shared.HeaderContentLength)\n\t} else {\n\t\t_, err = body.Seek(0, io.SeekStart)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treq.req.Header.Set(shared.HeaderContentLength, strconv.FormatInt(size, 10))\n\t\treq.Raw().GetBody = func() (io.ReadCloser, error) {\n\t\t\t_, err := body.Seek(0, io.SeekStart) // Seek back to the beginning of the stream\n\t\t\treturn body, err\n\t\t}\n\t}\n\t// keep a copy of the body argument.  this is to handle cases\n\t// where req.Body is replaced, e.g. httputil.DumpRequest and friends.\n\treq.body = body\n\treq.req.Body = body\n\treq.req.ContentLength = size\n\tif contentType == \"\" {\n\t\t// Del is a no-op when the header has no value\n\t\treq.req.Header.Del(shared.HeaderContentType)\n\t} else if req.req.Header.Get(shared.HeaderContentType) == \"\" || clobberContentType {\n\t\treq.req.Header.Set(shared.HeaderContentType, contentType)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/response_error.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage exported\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"regexp\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/exported\"\n)\n\n// NewResponseError creates a new *ResponseError from the provided HTTP response.\n// Exported as runtime.NewResponseError().\nfunc NewResponseError(resp *http.Response) error {\n\t// prefer the error code in the response header\n\tif ec := resp.Header.Get(shared.HeaderXMSErrorCode); ec != \"\" {\n\t\treturn NewResponseErrorWithErrorCode(resp, ec)\n\t}\n\n\t// if we didn't get x-ms-error-code, check in the response body\n\tbody, err := exported.Payload(resp, nil)\n\tif err != nil {\n\t\t// since we're not returning the ResponseError in this\n\t\t// case we also don't want to write it to the log.\n\t\treturn err\n\t}\n\n\tvar errorCode string\n\tif len(body) > 0 {\n\t\tif fromJSON := extractErrorCodeJSON(body); fromJSON != \"\" {\n\t\t\terrorCode = fromJSON\n\t\t} else if fromXML := extractErrorCodeXML(body); fromXML != \"\" {\n\t\t\terrorCode = fromXML\n\t\t}\n\t}\n\n\treturn NewResponseErrorWithErrorCode(resp, errorCode)\n}\n\n// NewResponseErrorWithErrorCode creates an *azcore.ResponseError from the provided HTTP response and errorCode.\n// Exported as runtime.NewResponseErrorWithErrorCode().\nfunc NewResponseErrorWithErrorCode(resp *http.Response, errorCode string) error {\n\trespErr := &ResponseError{\n\t\tErrorCode:   errorCode,\n\t\tStatusCode:  resp.StatusCode,\n\t\tRawResponse: resp,\n\t}\n\tlog.Write(log.EventResponseError, respErr.Error())\n\treturn respErr\n}\n\nfunc extractErrorCodeJSON(body []byte) string {\n\tvar rawObj map[string]any\n\tif err := json.Unmarshal(body, &rawObj); err != nil {\n\t\t// not a JSON object\n\t\treturn \"\"\n\t}\n\n\t// check if this is a wrapped error, i.e. { \"error\": { ... } }\n\t// if so then unwrap it\n\tif wrapped, ok := rawObj[\"error\"]; ok {\n\t\tunwrapped, ok := wrapped.(map[string]any)\n\t\tif !ok {\n\t\t\treturn \"\"\n\t\t}\n\t\trawObj = unwrapped\n\t} else if wrapped, ok := rawObj[\"odata.error\"]; ok {\n\t\t// check if this a wrapped odata error, i.e. { \"odata.error\": { ... } }\n\t\tunwrapped, ok := wrapped.(map[string]any)\n\t\tif !ok {\n\t\t\treturn \"\"\n\t\t}\n\t\trawObj = unwrapped\n\t}\n\n\t// now check for the error code\n\tcode, ok := rawObj[\"code\"]\n\tif !ok {\n\t\treturn \"\"\n\t}\n\tcodeStr, ok := code.(string)\n\tif !ok {\n\t\treturn \"\"\n\t}\n\treturn codeStr\n}\n\nfunc extractErrorCodeXML(body []byte) string {\n\t// regular expression is much easier than dealing with the XML parser\n\trx := regexp.MustCompile(`<(?:\\w+:)?[c|C]ode>\\s*(\\w+)\\s*<\\/(?:\\w+:)?[c|C]ode>`)\n\tres := rx.FindStringSubmatch(string(body))\n\tif len(res) != 2 {\n\t\treturn \"\"\n\t}\n\t// first submatch is the entire thing, second one is the captured error code\n\treturn res[1]\n}\n\n// ResponseError is returned when a request is made to a service and\n// the service returns a non-success HTTP status code.\n// Use errors.As() to access this type in the error chain.\n// Exported as azcore.ResponseError.\ntype ResponseError struct {\n\t// ErrorCode is the error code returned by the resource provider if available.\n\tErrorCode string\n\n\t// StatusCode is the HTTP status code as defined in https://pkg.go.dev/net/http#pkg-constants.\n\tStatusCode int\n\n\t// RawResponse is the underlying HTTP response.\n\tRawResponse *http.Response `json:\"-\"`\n\n\terrMsg string\n}\n\n// Error implements the error interface for type ResponseError.\n// Note that the message contents are not contractual and can change over time.\nfunc (e *ResponseError) Error() string {\n\tif e.errMsg != \"\" {\n\t\treturn e.errMsg\n\t}\n\n\tconst separator = \"--------------------------------------------------------------------------------\"\n\t// write the request method and URL with response status code\n\tmsg := &bytes.Buffer{}\n\tif e.RawResponse != nil {\n\t\tif e.RawResponse.Request != nil {\n\t\t\tfmt.Fprintf(msg, \"%s %s://%s%s\\n\", e.RawResponse.Request.Method, e.RawResponse.Request.URL.Scheme, e.RawResponse.Request.URL.Host, e.RawResponse.Request.URL.Path)\n\t\t} else {\n\t\t\tfmt.Fprintln(msg, \"Request information not available\")\n\t\t}\n\t\tfmt.Fprintln(msg, separator)\n\t\tfmt.Fprintf(msg, \"RESPONSE %d: %s\\n\", e.RawResponse.StatusCode, e.RawResponse.Status)\n\t} else {\n\t\tfmt.Fprintln(msg, \"Missing RawResponse\")\n\t\tfmt.Fprintln(msg, separator)\n\t}\n\tif e.ErrorCode != \"\" {\n\t\tfmt.Fprintf(msg, \"ERROR CODE: %s\\n\", e.ErrorCode)\n\t} else {\n\t\tfmt.Fprintln(msg, \"ERROR CODE UNAVAILABLE\")\n\t}\n\tif e.RawResponse != nil {\n\t\tfmt.Fprintln(msg, separator)\n\t\tbody, err := exported.Payload(e.RawResponse, nil)\n\t\tif err != nil {\n\t\t\t// this really shouldn't fail at this point as the response\n\t\t\t// body is already cached (it was read in NewResponseError)\n\t\t\tfmt.Fprintf(msg, \"Error reading response body: %v\", err)\n\t\t} else if len(body) > 0 {\n\t\t\tif err := json.Indent(msg, body, \"\", \"  \"); err != nil {\n\t\t\t\t// failed to pretty-print so just dump it verbatim\n\t\t\t\tfmt.Fprint(msg, string(body))\n\t\t\t}\n\t\t\t// the standard library doesn't have a pretty-printer for XML\n\t\t\tfmt.Fprintln(msg)\n\t\t} else {\n\t\t\tfmt.Fprintln(msg, \"Response contained no body\")\n\t\t}\n\t}\n\tfmt.Fprintln(msg, separator)\n\n\te.errMsg = msg.String()\n\treturn e.errMsg\n}\n\n// internal type used for marshaling/unmarshaling\ntype responseError struct {\n\tErrorCode    string `json:\"errorCode\"`\n\tStatusCode   int    `json:\"statusCode\"`\n\tErrorMessage string `json:\"errorMessage\"`\n}\n\nfunc (e ResponseError) MarshalJSON() ([]byte, error) {\n\treturn json.Marshal(responseError{\n\t\tErrorCode:    e.ErrorCode,\n\t\tStatusCode:   e.StatusCode,\n\t\tErrorMessage: e.Error(),\n\t})\n}\n\nfunc (e *ResponseError) UnmarshalJSON(data []byte) error {\n\tre := responseError{}\n\tif err := json.Unmarshal(data, &re); err != nil {\n\t\treturn err\n\t}\n\n\te.ErrorCode = re.ErrorCode\n\te.StatusCode = re.StatusCode\n\te.errMsg = re.ErrorMessage\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log/log.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// This is an internal helper package to combine the complete logging APIs.\npackage log\n\nimport (\n\tazlog \"github.com/Azure/azure-sdk-for-go/sdk/azcore/log\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/log\"\n)\n\ntype Event = log.Event\n\nconst (\n\tEventRequest       = azlog.EventRequest\n\tEventResponse      = azlog.EventResponse\n\tEventResponseError = azlog.EventResponseError\n\tEventRetryPolicy   = azlog.EventRetryPolicy\n\tEventLRO           = azlog.EventLRO\n)\n\n// Write invokes the underlying listener with the specified event and message.\n// If the event shouldn't be logged or there is no listener then Write does nothing.\nfunc Write(cls log.Event, msg string) {\n\tlog.Write(cls, msg)\n}\n\n// Writef invokes the underlying listener with the specified event and formatted message.\n// If the event shouldn't be logged or there is no listener then Writef does nothing.\nfunc Writef(cls log.Event, format string, a ...any) {\n\tlog.Writef(cls, format, a...)\n}\n\n// SetListener will set the Logger to write to the specified listener.\nfunc SetListener(lst func(Event, string)) {\n\tlog.SetListener(lst)\n}\n\n// Should returns true if the specified log event should be written to the log.\n// By default all log events will be logged.  Call SetEvents() to limit\n// the log events for logging.\n// If no listener has been set this will return false.\n// Calling this method is useful when the message to log is computationally expensive\n// and you want to avoid the overhead if its log event is not enabled.\nfunc Should(cls log.Event) bool {\n\treturn log.Should(cls)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/async/async.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage async\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/poller\"\n)\n\n// see https://github.com/Azure/azure-resource-manager-rpc/blob/master/v1.0/async-api-reference.md\n\n// Applicable returns true if the LRO is using Azure-AsyncOperation.\nfunc Applicable(resp *http.Response) bool {\n\treturn resp.Header.Get(shared.HeaderAzureAsync) != \"\"\n}\n\n// CanResume returns true if the token can rehydrate this poller type.\nfunc CanResume(token map[string]any) bool {\n\t_, ok := token[\"asyncURL\"]\n\treturn ok\n}\n\n// Poller is an LRO poller that uses the Azure-AsyncOperation pattern.\ntype Poller[T any] struct {\n\tpl exported.Pipeline\n\n\tresp *http.Response\n\n\t// The URL from Azure-AsyncOperation header.\n\tAsyncURL string `json:\"asyncURL\"`\n\n\t// The URL from Location header.\n\tLocURL string `json:\"locURL\"`\n\n\t// The URL from the initial LRO request.\n\tOrigURL string `json:\"origURL\"`\n\n\t// The HTTP method from the initial LRO request.\n\tMethod string `json:\"method\"`\n\n\t// The value of final-state-via from swagger, can be the empty string.\n\tFinalState pollers.FinalStateVia `json:\"finalState\"`\n\n\t// The LRO's current state.\n\tCurState string `json:\"state\"`\n}\n\n// New creates a new Poller from the provided initial response and final-state type.\n// Pass nil for response to create an empty Poller for rehydration.\nfunc New[T any](pl exported.Pipeline, resp *http.Response, finalState pollers.FinalStateVia) (*Poller[T], error) {\n\tif resp == nil {\n\t\tlog.Write(log.EventLRO, \"Resuming Azure-AsyncOperation poller.\")\n\t\treturn &Poller[T]{pl: pl}, nil\n\t}\n\tlog.Write(log.EventLRO, \"Using Azure-AsyncOperation poller.\")\n\tasyncURL := resp.Header.Get(shared.HeaderAzureAsync)\n\tif asyncURL == \"\" {\n\t\treturn nil, errors.New(\"response is missing Azure-AsyncOperation header\")\n\t}\n\tif !poller.IsValidURL(asyncURL) {\n\t\treturn nil, fmt.Errorf(\"invalid polling URL %s\", asyncURL)\n\t}\n\t// check for provisioning state.  if the operation is a RELO\n\t// and terminates synchronously this will prevent extra polling.\n\t// it's ok if there's no provisioning state.\n\tstate, _ := poller.GetProvisioningState(resp)\n\tif state == \"\" {\n\t\tstate = poller.StatusInProgress\n\t}\n\tp := &Poller[T]{\n\t\tpl:         pl,\n\t\tresp:       resp,\n\t\tAsyncURL:   asyncURL,\n\t\tLocURL:     resp.Header.Get(shared.HeaderLocation),\n\t\tOrigURL:    resp.Request.URL.String(),\n\t\tMethod:     resp.Request.Method,\n\t\tFinalState: finalState,\n\t\tCurState:   state,\n\t}\n\treturn p, nil\n}\n\n// Done returns true if the LRO is in a terminal state.\nfunc (p *Poller[T]) Done() bool {\n\treturn poller.IsTerminalState(p.CurState)\n}\n\n// Poll retrieves the current state of the LRO.\nfunc (p *Poller[T]) Poll(ctx context.Context) (*http.Response, error) {\n\terr := pollers.PollHelper(ctx, p.AsyncURL, p.pl, func(resp *http.Response) (string, error) {\n\t\tif !poller.StatusCodeValid(resp) {\n\t\t\tp.resp = resp\n\t\t\treturn \"\", exported.NewResponseError(resp)\n\t\t}\n\t\tstate, err := poller.GetStatus(resp)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t} else if state == \"\" {\n\t\t\treturn \"\", errors.New(\"the response did not contain a status\")\n\t\t}\n\t\tp.resp = resp\n\t\tp.CurState = state\n\t\treturn p.CurState, nil\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn p.resp, nil\n}\n\nfunc (p *Poller[T]) Result(ctx context.Context, out *T) error {\n\tif p.resp.StatusCode == http.StatusNoContent {\n\t\treturn nil\n\t} else if poller.Failed(p.CurState) {\n\t\treturn exported.NewResponseError(p.resp)\n\t}\n\tvar req *exported.Request\n\tvar err error\n\tif p.Method == http.MethodPatch || p.Method == http.MethodPut {\n\t\t// for PATCH and PUT, the final GET is on the original resource URL\n\t\treq, err = exported.NewRequest(ctx, http.MethodGet, p.OrigURL)\n\t} else if p.Method == http.MethodPost {\n\t\tif p.FinalState == pollers.FinalStateViaAzureAsyncOp {\n\t\t\t// no final GET required\n\t\t} else if p.FinalState == pollers.FinalStateViaOriginalURI {\n\t\t\treq, err = exported.NewRequest(ctx, http.MethodGet, p.OrigURL)\n\t\t} else if p.LocURL != \"\" {\n\t\t\t// ideally FinalState would be set to \"location\" but it isn't always.\n\t\t\t// must check last due to more permissive condition.\n\t\t\treq, err = exported.NewRequest(ctx, http.MethodGet, p.LocURL)\n\t\t}\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// if a final GET request has been created, execute it\n\tif req != nil {\n\t\tresp, err := p.pl.Do(req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tp.resp = resp\n\t}\n\n\treturn pollers.ResultHelper(p.resp, poller.Failed(p.CurState), \"\", out)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/body/body.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage body\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"net/http\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/poller\"\n)\n\n// Kind is the identifier of this type in a resume token.\nconst kind = \"body\"\n\n// Applicable returns true if the LRO is using no headers, just provisioning state.\n// This is only applicable to PATCH and PUT methods and assumes no polling headers.\nfunc Applicable(resp *http.Response) bool {\n\t// we can't check for absense of headers due to some misbehaving services\n\t// like redis that return a Location header but don't actually use that protocol\n\treturn resp.Request.Method == http.MethodPatch || resp.Request.Method == http.MethodPut\n}\n\n// CanResume returns true if the token can rehydrate this poller type.\nfunc CanResume(token map[string]any) bool {\n\tt, ok := token[\"type\"]\n\tif !ok {\n\t\treturn false\n\t}\n\ttt, ok := t.(string)\n\tif !ok {\n\t\treturn false\n\t}\n\treturn tt == kind\n}\n\n// Poller is an LRO poller that uses the Body pattern.\ntype Poller[T any] struct {\n\tpl exported.Pipeline\n\n\tresp *http.Response\n\n\t// The poller's type, used for resume token processing.\n\tType string `json:\"type\"`\n\n\t// The URL for polling.\n\tPollURL string `json:\"pollURL\"`\n\n\t// The LRO's current state.\n\tCurState string `json:\"state\"`\n}\n\n// New creates a new Poller from the provided initial response.\n// Pass nil for response to create an empty Poller for rehydration.\nfunc New[T any](pl exported.Pipeline, resp *http.Response) (*Poller[T], error) {\n\tif resp == nil {\n\t\tlog.Write(log.EventLRO, \"Resuming Body poller.\")\n\t\treturn &Poller[T]{pl: pl}, nil\n\t}\n\tlog.Write(log.EventLRO, \"Using Body poller.\")\n\tp := &Poller[T]{\n\t\tpl:      pl,\n\t\tresp:    resp,\n\t\tType:    kind,\n\t\tPollURL: resp.Request.URL.String(),\n\t}\n\t// default initial state to InProgress.  depending on the HTTP\n\t// status code and provisioning state, we might change the value.\n\tcurState := poller.StatusInProgress\n\tprovState, err := poller.GetProvisioningState(resp)\n\tif err != nil && !errors.Is(err, poller.ErrNoBody) {\n\t\treturn nil, err\n\t}\n\tif resp.StatusCode == http.StatusCreated && provState != \"\" {\n\t\t// absense of provisioning state is ok for a 201, means the operation is in progress\n\t\tcurState = provState\n\t} else if resp.StatusCode == http.StatusOK {\n\t\tif provState != \"\" {\n\t\t\tcurState = provState\n\t\t} else if provState == \"\" {\n\t\t\t// for a 200, absense of provisioning state indicates success\n\t\t\tcurState = poller.StatusSucceeded\n\t\t}\n\t} else if resp.StatusCode == http.StatusNoContent {\n\t\tcurState = poller.StatusSucceeded\n\t}\n\tp.CurState = curState\n\treturn p, nil\n}\n\nfunc (p *Poller[T]) Done() bool {\n\treturn poller.IsTerminalState(p.CurState)\n}\n\nfunc (p *Poller[T]) Poll(ctx context.Context) (*http.Response, error) {\n\terr := pollers.PollHelper(ctx, p.PollURL, p.pl, func(resp *http.Response) (string, error) {\n\t\tif !poller.StatusCodeValid(resp) {\n\t\t\tp.resp = resp\n\t\t\treturn \"\", exported.NewResponseError(resp)\n\t\t}\n\t\tif resp.StatusCode == http.StatusNoContent {\n\t\t\tp.resp = resp\n\t\t\tp.CurState = poller.StatusSucceeded\n\t\t\treturn p.CurState, nil\n\t\t}\n\t\tstate, err := poller.GetProvisioningState(resp)\n\t\tif errors.Is(err, poller.ErrNoBody) {\n\t\t\t// a missing response body in non-204 case is an error\n\t\t\treturn \"\", err\n\t\t} else if state == \"\" {\n\t\t\t// a response body without provisioning state is considered terminal success\n\t\t\tstate = poller.StatusSucceeded\n\t\t} else if err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tp.resp = resp\n\t\tp.CurState = state\n\t\treturn p.CurState, nil\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn p.resp, nil\n}\n\nfunc (p *Poller[T]) Result(ctx context.Context, out *T) error {\n\treturn pollers.ResultHelper(p.resp, poller.Failed(p.CurState), \"\", out)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/fake/fake.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage fake\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/poller\"\n)\n\n// Applicable returns true if the LRO is a fake.\nfunc Applicable(resp *http.Response) bool {\n\treturn resp.Header.Get(shared.HeaderFakePollerStatus) != \"\"\n}\n\n// CanResume returns true if the token can rehydrate this poller type.\nfunc CanResume(token map[string]any) bool {\n\t_, ok := token[\"fakeURL\"]\n\treturn ok\n}\n\n// Poller is an LRO poller that uses the Core-Fake-Poller pattern.\ntype Poller[T any] struct {\n\tpl exported.Pipeline\n\n\tresp *http.Response\n\n\t// The API name from CtxAPINameKey\n\tAPIName string `json:\"apiName\"`\n\n\t// The URL from Core-Fake-Poller header.\n\tFakeURL string `json:\"fakeURL\"`\n\n\t// The LRO's current state.\n\tFakeStatus string `json:\"status\"`\n}\n\n// lroStatusURLSuffix is the URL path suffix for a faked LRO.\nconst lroStatusURLSuffix = \"/get/fake/status\"\n\n// New creates a new Poller from the provided initial response.\n// Pass nil for response to create an empty Poller for rehydration.\nfunc New[T any](pl exported.Pipeline, resp *http.Response) (*Poller[T], error) {\n\tif resp == nil {\n\t\tlog.Write(log.EventLRO, \"Resuming Core-Fake-Poller poller.\")\n\t\treturn &Poller[T]{pl: pl}, nil\n\t}\n\n\tlog.Write(log.EventLRO, \"Using Core-Fake-Poller poller.\")\n\tfakeStatus := resp.Header.Get(shared.HeaderFakePollerStatus)\n\tif fakeStatus == \"\" {\n\t\treturn nil, errors.New(\"response is missing Fake-Poller-Status header\")\n\t}\n\n\tctxVal := resp.Request.Context().Value(shared.CtxAPINameKey{})\n\tif ctxVal == nil {\n\t\treturn nil, errors.New(\"missing value for CtxAPINameKey\")\n\t}\n\n\tapiName, ok := ctxVal.(string)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"expected string for CtxAPINameKey, the type was %T\", ctxVal)\n\t}\n\n\tqp := \"\"\n\tif resp.Request.URL.RawQuery != \"\" {\n\t\tqp = \"?\" + resp.Request.URL.RawQuery\n\t}\n\n\tp := &Poller[T]{\n\t\tpl:      pl,\n\t\tresp:    resp,\n\t\tAPIName: apiName,\n\t\t// NOTE: any changes to this path format MUST be reflected in SanitizePollerPath()\n\t\tFakeURL:    fmt.Sprintf(\"%s://%s%s%s%s\", resp.Request.URL.Scheme, resp.Request.URL.Host, resp.Request.URL.Path, lroStatusURLSuffix, qp),\n\t\tFakeStatus: fakeStatus,\n\t}\n\treturn p, nil\n}\n\n// Done returns true if the LRO is in a terminal state.\nfunc (p *Poller[T]) Done() bool {\n\treturn poller.IsTerminalState(p.FakeStatus)\n}\n\n// Poll retrieves the current state of the LRO.\nfunc (p *Poller[T]) Poll(ctx context.Context) (*http.Response, error) {\n\tctx = context.WithValue(ctx, shared.CtxAPINameKey{}, p.APIName)\n\terr := pollers.PollHelper(ctx, p.FakeURL, p.pl, func(resp *http.Response) (string, error) {\n\t\tif !poller.StatusCodeValid(resp) {\n\t\t\tp.resp = resp\n\t\t\treturn \"\", exported.NewResponseError(resp)\n\t\t}\n\t\tfakeStatus := resp.Header.Get(shared.HeaderFakePollerStatus)\n\t\tif fakeStatus == \"\" {\n\t\t\treturn \"\", errors.New(\"response is missing Fake-Poller-Status header\")\n\t\t}\n\t\tp.resp = resp\n\t\tp.FakeStatus = fakeStatus\n\t\treturn p.FakeStatus, nil\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn p.resp, nil\n}\n\nfunc (p *Poller[T]) Result(ctx context.Context, out *T) error {\n\tif p.resp.StatusCode == http.StatusNoContent {\n\t\treturn nil\n\t} else if poller.Failed(p.FakeStatus) {\n\t\treturn exported.NewResponseError(p.resp)\n\t}\n\n\treturn pollers.ResultHelper(p.resp, poller.Failed(p.FakeStatus), \"\", out)\n}\n\n// SanitizePollerPath removes any fake-appended suffix from a URL's path.\nfunc SanitizePollerPath(path string) string {\n\treturn strings.TrimSuffix(path, lroStatusURLSuffix)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/loc/loc.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage loc\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/poller\"\n)\n\n// Kind is the identifier of this type in a resume token.\nconst kind = \"loc\"\n\n// Applicable returns true if the LRO is using Location.\nfunc Applicable(resp *http.Response) bool {\n\treturn resp.Header.Get(shared.HeaderLocation) != \"\"\n}\n\n// CanResume returns true if the token can rehydrate this poller type.\nfunc CanResume(token map[string]any) bool {\n\tt, ok := token[\"type\"]\n\tif !ok {\n\t\treturn false\n\t}\n\ttt, ok := t.(string)\n\tif !ok {\n\t\treturn false\n\t}\n\treturn tt == kind\n}\n\n// Poller is an LRO poller that uses the Location pattern.\ntype Poller[T any] struct {\n\tpl   exported.Pipeline\n\tresp *http.Response\n\n\tType     string `json:\"type\"`\n\tPollURL  string `json:\"pollURL\"`\n\tCurState string `json:\"state\"`\n}\n\n// New creates a new Poller from the provided initial response.\n// Pass nil for response to create an empty Poller for rehydration.\nfunc New[T any](pl exported.Pipeline, resp *http.Response) (*Poller[T], error) {\n\tif resp == nil {\n\t\tlog.Write(log.EventLRO, \"Resuming Location poller.\")\n\t\treturn &Poller[T]{pl: pl}, nil\n\t}\n\tlog.Write(log.EventLRO, \"Using Location poller.\")\n\tlocURL := resp.Header.Get(shared.HeaderLocation)\n\tif locURL == \"\" {\n\t\treturn nil, errors.New(\"response is missing Location header\")\n\t}\n\tif !poller.IsValidURL(locURL) {\n\t\treturn nil, fmt.Errorf(\"invalid polling URL %s\", locURL)\n\t}\n\t// check for provisioning state.  if the operation is a RELO\n\t// and terminates synchronously this will prevent extra polling.\n\t// it's ok if there's no provisioning state.\n\tstate, _ := poller.GetProvisioningState(resp)\n\tif state == \"\" {\n\t\tstate = poller.StatusInProgress\n\t}\n\treturn &Poller[T]{\n\t\tpl:       pl,\n\t\tresp:     resp,\n\t\tType:     kind,\n\t\tPollURL:  locURL,\n\t\tCurState: state,\n\t}, nil\n}\n\nfunc (p *Poller[T]) Done() bool {\n\treturn poller.IsTerminalState(p.CurState)\n}\n\nfunc (p *Poller[T]) Poll(ctx context.Context) (*http.Response, error) {\n\terr := pollers.PollHelper(ctx, p.PollURL, p.pl, func(resp *http.Response) (string, error) {\n\t\t// location polling can return an updated polling URL\n\t\tif h := resp.Header.Get(shared.HeaderLocation); h != \"\" {\n\t\t\tp.PollURL = h\n\t\t}\n\t\t// if provisioning state is available, use that.  this is only\n\t\t// for some ARM LRO scenarios (e.g. DELETE with a Location header)\n\t\t// so if it's missing then use HTTP status code.\n\t\tprovState, _ := poller.GetProvisioningState(resp)\n\t\tp.resp = resp\n\t\tif provState != \"\" {\n\t\t\tp.CurState = provState\n\t\t} else if resp.StatusCode == http.StatusAccepted {\n\t\t\tp.CurState = poller.StatusInProgress\n\t\t} else if resp.StatusCode > 199 && resp.StatusCode < 300 {\n\t\t\t// any 2xx other than a 202 indicates success\n\t\t\tp.CurState = poller.StatusSucceeded\n\t\t} else if pollers.IsNonTerminalHTTPStatusCode(resp) {\n\t\t\t// the request timed out or is being throttled.\n\t\t\t// DO NOT include this as a terminal failure. preserve\n\t\t\t// the existing state and return the response.\n\t\t} else {\n\t\t\tp.CurState = poller.StatusFailed\n\t\t}\n\t\treturn p.CurState, nil\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn p.resp, nil\n}\n\nfunc (p *Poller[T]) Result(ctx context.Context, out *T) error {\n\treturn pollers.ResultHelper(p.resp, poller.Failed(p.CurState), \"\", out)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/op/op.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage op\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/poller\"\n)\n\n// Applicable returns true if the LRO is using Operation-Location.\nfunc Applicable(resp *http.Response) bool {\n\treturn resp.Header.Get(shared.HeaderOperationLocation) != \"\"\n}\n\n// CanResume returns true if the token can rehydrate this poller type.\nfunc CanResume(token map[string]any) bool {\n\t_, ok := token[\"oplocURL\"]\n\treturn ok\n}\n\n// Poller is an LRO poller that uses the Operation-Location pattern.\ntype Poller[T any] struct {\n\tpl   exported.Pipeline\n\tresp *http.Response\n\n\tOpLocURL   string                `json:\"oplocURL\"`\n\tLocURL     string                `json:\"locURL\"`\n\tOrigURL    string                `json:\"origURL\"`\n\tMethod     string                `json:\"method\"`\n\tFinalState pollers.FinalStateVia `json:\"finalState\"`\n\tResultPath string                `json:\"resultPath\"`\n\tCurState   string                `json:\"state\"`\n}\n\n// New creates a new Poller from the provided initial response.\n// Pass nil for response to create an empty Poller for rehydration.\nfunc New[T any](pl exported.Pipeline, resp *http.Response, finalState pollers.FinalStateVia, resultPath string) (*Poller[T], error) {\n\tif resp == nil {\n\t\tlog.Write(log.EventLRO, \"Resuming Operation-Location poller.\")\n\t\treturn &Poller[T]{pl: pl}, nil\n\t}\n\tlog.Write(log.EventLRO, \"Using Operation-Location poller.\")\n\topURL := resp.Header.Get(shared.HeaderOperationLocation)\n\tif opURL == \"\" {\n\t\treturn nil, errors.New(\"response is missing Operation-Location header\")\n\t}\n\tif !poller.IsValidURL(opURL) {\n\t\treturn nil, fmt.Errorf(\"invalid Operation-Location URL %s\", opURL)\n\t}\n\tlocURL := resp.Header.Get(shared.HeaderLocation)\n\t// Location header is optional\n\tif locURL != \"\" && !poller.IsValidURL(locURL) {\n\t\treturn nil, fmt.Errorf(\"invalid Location URL %s\", locURL)\n\t}\n\t// default initial state to InProgress.  if the\n\t// service sent us a status then use that instead.\n\tcurState := poller.StatusInProgress\n\tstatus, err := poller.GetStatus(resp)\n\tif err != nil && !errors.Is(err, poller.ErrNoBody) {\n\t\treturn nil, err\n\t}\n\tif status != \"\" {\n\t\tcurState = status\n\t}\n\n\treturn &Poller[T]{\n\t\tpl:         pl,\n\t\tresp:       resp,\n\t\tOpLocURL:   opURL,\n\t\tLocURL:     locURL,\n\t\tOrigURL:    resp.Request.URL.String(),\n\t\tMethod:     resp.Request.Method,\n\t\tFinalState: finalState,\n\t\tResultPath: resultPath,\n\t\tCurState:   curState,\n\t}, nil\n}\n\nfunc (p *Poller[T]) Done() bool {\n\treturn poller.IsTerminalState(p.CurState)\n}\n\nfunc (p *Poller[T]) Poll(ctx context.Context) (*http.Response, error) {\n\terr := pollers.PollHelper(ctx, p.OpLocURL, p.pl, func(resp *http.Response) (string, error) {\n\t\tif !poller.StatusCodeValid(resp) {\n\t\t\tp.resp = resp\n\t\t\treturn \"\", exported.NewResponseError(resp)\n\t\t}\n\t\tstate, err := poller.GetStatus(resp)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t} else if state == \"\" {\n\t\t\treturn \"\", errors.New(\"the response did not contain a status\")\n\t\t}\n\t\tp.resp = resp\n\t\tp.CurState = state\n\t\treturn p.CurState, nil\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn p.resp, nil\n}\n\nfunc (p *Poller[T]) Result(ctx context.Context, out *T) error {\n\tvar req *exported.Request\n\tvar err error\n\n\tif p.FinalState == pollers.FinalStateViaLocation && p.LocURL != \"\" {\n\t\treq, err = exported.NewRequest(ctx, http.MethodGet, p.LocURL)\n\t} else if rl, rlErr := poller.GetResourceLocation(p.resp); rlErr != nil && !errors.Is(rlErr, poller.ErrNoBody) {\n\t\treturn rlErr\n\t} else if rl != \"\" {\n\t\treq, err = exported.NewRequest(ctx, http.MethodGet, rl)\n\t} else if p.Method == http.MethodPatch || p.Method == http.MethodPut {\n\t\treq, err = exported.NewRequest(ctx, http.MethodGet, p.OrigURL)\n\t} else if p.Method == http.MethodPost && p.LocURL != \"\" {\n\t\treq, err = exported.NewRequest(ctx, http.MethodGet, p.LocURL)\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// if a final GET request has been created, execute it\n\tif req != nil {\n\t\t// no JSON path when making a final GET request\n\t\tp.ResultPath = \"\"\n\t\tresp, err := p.pl.Do(req)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tp.resp = resp\n\t}\n\n\treturn pollers.ResultHelper(p.resp, poller.Failed(p.CurState), p.ResultPath, out)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/poller.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage pollers\n\n// FinalStateVia is the enumerated type for the possible final-state-via values.\ntype FinalStateVia string\n\nconst (\n\t// FinalStateViaAzureAsyncOp indicates the final payload comes from the Azure-AsyncOperation URL.\n\tFinalStateViaAzureAsyncOp FinalStateVia = \"azure-async-operation\"\n\n\t// FinalStateViaLocation indicates the final payload comes from the Location URL.\n\tFinalStateViaLocation FinalStateVia = \"location\"\n\n\t// FinalStateViaOriginalURI indicates the final payload comes from the original URL.\n\tFinalStateViaOriginalURI FinalStateVia = \"original-uri\"\n\n\t// FinalStateViaOpLocation indicates the final payload comes from the Operation-Location URL.\n\tFinalStateViaOpLocation FinalStateVia = \"operation-location\"\n)\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/util.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage pollers\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"reflect\"\n\n\tazexported \"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/poller\"\n)\n\n// getTokenTypeName creates a type name from the type parameter T.\nfunc getTokenTypeName[T any]() (string, error) {\n\ttt := shared.TypeOfT[T]()\n\tvar n string\n\tif tt.Kind() == reflect.Pointer {\n\t\tn = \"*\"\n\t\ttt = tt.Elem()\n\t}\n\tn += tt.Name()\n\tif n == \"\" {\n\t\treturn \"\", errors.New(\"nameless types are not allowed\")\n\t}\n\treturn n, nil\n}\n\ntype resumeTokenWrapper[T any] struct {\n\tType  string `json:\"type\"`\n\tToken T      `json:\"token\"`\n}\n\n// NewResumeToken creates a resume token from the specified type.\n// An error is returned if the generic type has no name (e.g. struct{}).\nfunc NewResumeToken[TResult, TSource any](from TSource) (string, error) {\n\tn, err := getTokenTypeName[TResult]()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tb, err := json.Marshal(resumeTokenWrapper[TSource]{\n\t\tType:  n,\n\t\tToken: from,\n\t})\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn string(b), nil\n}\n\n// ExtractToken returns the poller-specific token information from the provided token value.\nfunc ExtractToken(token string) ([]byte, error) {\n\traw := map[string]json.RawMessage{}\n\tif err := json.Unmarshal([]byte(token), &raw); err != nil {\n\t\treturn nil, err\n\t}\n\t// this is dependent on the type resumeTokenWrapper[T]\n\ttk, ok := raw[\"token\"]\n\tif !ok {\n\t\treturn nil, errors.New(\"missing token value\")\n\t}\n\treturn tk, nil\n}\n\n// IsTokenValid returns an error if the specified token isn't applicable for generic type T.\nfunc IsTokenValid[T any](token string) error {\n\traw := map[string]any{}\n\tif err := json.Unmarshal([]byte(token), &raw); err != nil {\n\t\treturn err\n\t}\n\tt, ok := raw[\"type\"]\n\tif !ok {\n\t\treturn errors.New(\"missing type value\")\n\t}\n\ttt, ok := t.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"invalid type format %T\", t)\n\t}\n\tn, err := getTokenTypeName[T]()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif tt != n {\n\t\treturn fmt.Errorf(\"cannot resume from this poller token. token is for type %s, not %s\", tt, n)\n\t}\n\treturn nil\n}\n\n// used if the operation synchronously completed\ntype NopPoller[T any] struct {\n\tresp   *http.Response\n\tresult T\n}\n\n// NewNopPoller creates a NopPoller from the provided response.\n// It unmarshals the response body into an instance of T.\nfunc NewNopPoller[T any](resp *http.Response) (*NopPoller[T], error) {\n\tnp := &NopPoller[T]{resp: resp}\n\tif resp.StatusCode == http.StatusNoContent {\n\t\treturn np, nil\n\t}\n\tpayload, err := exported.Payload(resp, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(payload) == 0 {\n\t\treturn np, nil\n\t}\n\tif err = json.Unmarshal(payload, &np.result); err != nil {\n\t\treturn nil, err\n\t}\n\treturn np, nil\n}\n\nfunc (*NopPoller[T]) Done() bool {\n\treturn true\n}\n\nfunc (p *NopPoller[T]) Poll(context.Context) (*http.Response, error) {\n\treturn p.resp, nil\n}\n\nfunc (p *NopPoller[T]) Result(ctx context.Context, out *T) error {\n\t*out = p.result\n\treturn nil\n}\n\n// PollHelper creates and executes the request, calling update() with the response.\n// If the request fails, the update func is not called.\n// The update func returns the state of the operation for logging purposes or an error\n// if it fails to extract the required state from the response.\nfunc PollHelper(ctx context.Context, endpoint string, pl azexported.Pipeline, update func(resp *http.Response) (string, error)) error {\n\treq, err := azexported.NewRequest(ctx, http.MethodGet, endpoint)\n\tif err != nil {\n\t\treturn err\n\t}\n\tresp, err := pl.Do(req)\n\tif err != nil {\n\t\treturn err\n\t}\n\tstate, err := update(resp)\n\tif err != nil {\n\t\treturn err\n\t}\n\tlog.Writef(log.EventLRO, \"State %s\", state)\n\treturn nil\n}\n\n// ResultHelper processes the response as success or failure.\n// In the success case, it unmarshals the payload into either a new instance of T or out.\n// In the failure case, it creates an *azcore.Response error from the response.\nfunc ResultHelper[T any](resp *http.Response, failed bool, jsonPath string, out *T) error {\n\t// short-circuit the simple success case with no response body to unmarshal\n\tif resp.StatusCode == http.StatusNoContent {\n\t\treturn nil\n\t}\n\n\tdefer resp.Body.Close()\n\tif !poller.StatusCodeValid(resp) || failed {\n\t\t// the LRO failed.  unmarshall the error and update state\n\t\treturn azexported.NewResponseError(resp)\n\t}\n\n\t// success case\n\tpayload, err := exported.Payload(resp, nil)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif jsonPath != \"\" && len(payload) > 0 {\n\t\t// extract the payload from the specified JSON path.\n\t\t// do this before the zero-length check in case there\n\t\t// is no payload.\n\t\tjsonBody := map[string]json.RawMessage{}\n\t\tif err = json.Unmarshal(payload, &jsonBody); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tpayload = jsonBody[jsonPath]\n\t}\n\n\tif len(payload) == 0 {\n\t\treturn nil\n\t}\n\n\tif err = json.Unmarshal(payload, out); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// IsNonTerminalHTTPStatusCode returns true if the HTTP status code should be\n// considered non-terminal thus eligible for retry.\nfunc IsNonTerminalHTTPStatusCode(resp *http.Response) bool {\n\treturn exported.HasStatusCode(resp,\n\t\thttp.StatusRequestTimeout,      // 408\n\t\thttp.StatusTooManyRequests,     // 429\n\t\thttp.StatusInternalServerError, // 500\n\t\thttp.StatusBadGateway,          // 502\n\t\thttp.StatusServiceUnavailable,  // 503\n\t\thttp.StatusGatewayTimeout,      // 504\n\t)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/constants.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage shared\n\nconst (\n\tContentTypeAppJSON   = \"application/json\"\n\tContentTypeAppXML    = \"application/xml\"\n\tContentTypeTextPlain = \"text/plain\"\n)\n\nconst (\n\tHeaderAuthorization          = \"Authorization\"\n\tHeaderAuxiliaryAuthorization = \"x-ms-authorization-auxiliary\"\n\tHeaderAzureAsync             = \"Azure-AsyncOperation\"\n\tHeaderContentLength          = \"Content-Length\"\n\tHeaderContentType            = \"Content-Type\"\n\tHeaderFakePollerStatus       = \"Fake-Poller-Status\"\n\tHeaderLocation               = \"Location\"\n\tHeaderOperationLocation      = \"Operation-Location\"\n\tHeaderRetryAfter             = \"Retry-After\"\n\tHeaderRetryAfterMS           = \"Retry-After-Ms\"\n\tHeaderUserAgent              = \"User-Agent\"\n\tHeaderWWWAuthenticate        = \"WWW-Authenticate\"\n\tHeaderXMSClientRequestID     = \"x-ms-client-request-id\"\n\tHeaderXMSRequestID           = \"x-ms-request-id\"\n\tHeaderXMSErrorCode           = \"x-ms-error-code\"\n\tHeaderXMSRetryAfterMS        = \"x-ms-retry-after-ms\"\n)\n\nconst BearerTokenPrefix = \"Bearer \"\n\nconst TracingNamespaceAttrName = \"az.namespace\"\n\nconst (\n\t// Module is the name of the calling module used in telemetry data.\n\tModule = \"azcore\"\n\n\t// Version is the semantic version (see http://semver.org) of this module.\n\tVersion = \"v1.18.0\"\n)\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/shared.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage shared\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"time\"\n)\n\n// NOTE: when adding a new context key type, it likely needs to be\n// added to the deny-list of key types in ContextWithDeniedValues\n\n// CtxWithHTTPHeaderKey is used as a context key for adding/retrieving http.Header.\ntype CtxWithHTTPHeaderKey struct{}\n\n// CtxWithRetryOptionsKey is used as a context key for adding/retrieving RetryOptions.\ntype CtxWithRetryOptionsKey struct{}\n\n// CtxWithCaptureResponse is used as a context key for retrieving the raw response.\ntype CtxWithCaptureResponse struct{}\n\n// CtxWithTracingTracer is used as a context key for adding/retrieving tracing.Tracer.\ntype CtxWithTracingTracer struct{}\n\n// CtxAPINameKey is used as a context key for adding/retrieving the API name.\ntype CtxAPINameKey struct{}\n\n// Delay waits for the duration to elapse or the context to be cancelled.\nfunc Delay(ctx context.Context, delay time.Duration) error {\n\tselect {\n\tcase <-time.After(delay):\n\t\treturn nil\n\tcase <-ctx.Done():\n\t\treturn ctx.Err()\n\t}\n}\n\n// RetryAfter returns non-zero if the response contains one of the headers with a \"retry after\" value.\n// Headers are checked in the following order: retry-after-ms, x-ms-retry-after-ms, retry-after\nfunc RetryAfter(resp *http.Response) time.Duration {\n\tif resp == nil {\n\t\treturn 0\n\t}\n\n\ttype retryData struct {\n\t\theader string\n\t\tunits  time.Duration\n\n\t\t// custom is used when the regular algorithm failed and is optional.\n\t\t// the returned duration is used verbatim (units is not applied).\n\t\tcustom func(string) time.Duration\n\t}\n\n\tnop := func(string) time.Duration { return 0 }\n\n\t// the headers are listed in order of preference\n\tretries := []retryData{\n\t\t{\n\t\t\theader: HeaderRetryAfterMS,\n\t\t\tunits:  time.Millisecond,\n\t\t\tcustom: nop,\n\t\t},\n\t\t{\n\t\t\theader: HeaderXMSRetryAfterMS,\n\t\t\tunits:  time.Millisecond,\n\t\t\tcustom: nop,\n\t\t},\n\t\t{\n\t\t\theader: HeaderRetryAfter,\n\t\t\tunits:  time.Second,\n\n\t\t\t// retry-after values are expressed in either number of\n\t\t\t// seconds or an HTTP-date indicating when to try again\n\t\t\tcustom: func(ra string) time.Duration {\n\t\t\t\tt, err := time.Parse(time.RFC1123, ra)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn 0\n\t\t\t\t}\n\t\t\t\treturn time.Until(t)\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, retry := range retries {\n\t\tv := resp.Header.Get(retry.header)\n\t\tif v == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tif retryAfter, _ := strconv.Atoi(v); retryAfter > 0 {\n\t\t\treturn time.Duration(retryAfter) * retry.units\n\t\t} else if d := retry.custom(v); d > 0 {\n\t\t\treturn d\n\t\t}\n\t}\n\n\treturn 0\n}\n\n// TypeOfT returns the type of the generic type param.\nfunc TypeOfT[T any]() reflect.Type {\n\t// you can't, at present, obtain the type of\n\t// a type parameter, so this is the trick\n\treturn reflect.TypeOf((*T)(nil)).Elem()\n}\n\n// TransportFunc is a helper to use a first-class func to satisfy the Transporter interface.\ntype TransportFunc func(*http.Request) (*http.Response, error)\n\n// Do implements the Transporter interface for the TransportFunc type.\nfunc (pf TransportFunc) Do(req *http.Request) (*http.Response, error) {\n\treturn pf(req)\n}\n\n// ValidateModVer verifies that moduleVersion is a valid semver 2.0 string.\nfunc ValidateModVer(moduleVersion string) error {\n\tmodVerRegx := regexp.MustCompile(`^v\\d+\\.\\d+\\.\\d+(?:-[a-zA-Z0-9_.-]+)?$`)\n\tif !modVerRegx.MatchString(moduleVersion) {\n\t\treturn fmt.Errorf(\"malformed moduleVersion param value %s\", moduleVersion)\n\t}\n\treturn nil\n}\n\n// ContextWithDeniedValues wraps an existing [context.Context], denying access to certain context values.\n// Pipeline policies that create new requests to be sent down their own pipeline MUST wrap the caller's\n// context with an instance of this type. This is to prevent context values from flowing across disjoint\n// requests which can have unintended side-effects.\ntype ContextWithDeniedValues struct {\n\tcontext.Context\n}\n\n// Value implements part of the [context.Context] interface.\n// It acts as a deny-list for certain context keys.\nfunc (c *ContextWithDeniedValues) Value(key any) any {\n\tswitch key.(type) {\n\tcase CtxAPINameKey, CtxWithCaptureResponse, CtxWithHTTPHeaderKey, CtxWithRetryOptionsKey, CtxWithTracingTracer:\n\t\treturn nil\n\tdefault:\n\t\treturn c.Context.Value(key)\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/log/doc.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright 2017 Microsoft Corporation. All rights reserved.\n// Use of this source code is governed by an MIT\n// license that can be found in the LICENSE file.\n\n// Package log contains functionality for configuring logging behavior.\n// Default logging to stderr can be enabled by setting environment variable AZURE_SDK_GO_LOGGING to \"all\".\npackage log\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/log/log.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// Package log provides functionality for configuring logging facilities.\npackage log\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/log\"\n)\n\n// Event is used to group entries.  Each group can be toggled on or off.\ntype Event = log.Event\n\nconst (\n\t// EventRequest entries contain information about HTTP requests.\n\t// This includes information like the URL, query parameters, and headers.\n\tEventRequest Event = \"Request\"\n\n\t// EventResponse entries contain information about HTTP responses.\n\t// This includes information like the HTTP status code, headers, and request URL.\n\tEventResponse Event = \"Response\"\n\n\t// EventResponseError entries contain information about HTTP responses that returned\n\t// an *azcore.ResponseError (i.e. responses with a non 2xx HTTP status code).\n\t// This includes the contents of ResponseError.Error().\n\tEventResponseError Event = \"ResponseError\"\n\n\t// EventRetryPolicy entries contain information specific to the retry policy in use.\n\tEventRetryPolicy Event = \"Retry\"\n\n\t// EventLRO entries contain information specific to long-running operations.\n\t// This includes information like polling location, operation state, and sleep intervals.\n\tEventLRO Event = \"LongRunningOperation\"\n)\n\n// SetEvents is used to control which events are written to\n// the log.  By default all log events are writen.\n// NOTE: this is not goroutine safe and should be called before using SDK clients.\nfunc SetEvents(cls ...Event) {\n\tlog.SetEvents(cls...)\n}\n\n// SetListener will set the Logger to write to the specified Listener.\n// NOTE: this is not goroutine safe and should be called before using SDK clients.\nfunc SetListener(lst func(Event, string)) {\n\tlog.SetListener(lst)\n}\n\n// for testing purposes\nfunc resetEvents() {\n\tlog.TestResetEvents()\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/policy/doc.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright 2017 Microsoft Corporation. All rights reserved.\n// Use of this source code is governed by an MIT\n// license that can be found in the LICENSE file.\n\n// Package policy contains the definitions needed for configuring in-box pipeline policies\n// and creating custom policies.\npackage policy\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/policy/policy.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage policy\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing\"\n)\n\n// Policy represents an extensibility point for the Pipeline that can mutate the specified\n// Request and react to the received Response.\ntype Policy = exported.Policy\n\n// Transporter represents an HTTP pipeline transport used to send HTTP requests and receive responses.\ntype Transporter = exported.Transporter\n\n// Request is an abstraction over the creation of an HTTP request as it passes through the pipeline.\n// Don't use this type directly, use runtime.NewRequest() instead.\ntype Request = exported.Request\n\n// ClientOptions contains optional settings for a client's pipeline.\n// Instances can be shared across calls to SDK client constructors when uniform configuration is desired.\n// Zero-value fields will have their specified default values applied during use.\ntype ClientOptions struct {\n\t// APIVersion overrides the default version requested of the service.\n\t// Set with caution as this package version has not been tested with arbitrary service versions.\n\tAPIVersion string\n\n\t// Cloud specifies a cloud for the client. The default is Azure Public Cloud.\n\tCloud cloud.Configuration\n\n\t// InsecureAllowCredentialWithHTTP enables authenticated requests over HTTP.\n\t// By default, authenticated requests to an HTTP endpoint are rejected by the client.\n\t// WARNING: setting this to true will allow sending the credential in clear text. Use with caution.\n\tInsecureAllowCredentialWithHTTP bool\n\n\t// Logging configures the built-in logging policy.\n\tLogging LogOptions\n\n\t// Retry configures the built-in retry policy.\n\tRetry RetryOptions\n\n\t// Telemetry configures the built-in telemetry policy.\n\tTelemetry TelemetryOptions\n\n\t// TracingProvider configures the tracing provider.\n\t// It defaults to a no-op tracer.\n\tTracingProvider tracing.Provider\n\n\t// Transport sets the transport for HTTP requests.\n\tTransport Transporter\n\n\t// PerCallPolicies contains custom policies to inject into the pipeline.\n\t// Each policy is executed once per request.\n\tPerCallPolicies []Policy\n\n\t// PerRetryPolicies contains custom policies to inject into the pipeline.\n\t// Each policy is executed once per request, and for each retry of that request.\n\tPerRetryPolicies []Policy\n}\n\n// LogOptions configures the logging policy's behavior.\ntype LogOptions struct {\n\t// IncludeBody indicates if request and response bodies should be included in logging.\n\t// The default value is false.\n\t// NOTE: enabling this can lead to disclosure of sensitive information, use with care.\n\tIncludeBody bool\n\n\t// AllowedHeaders is the slice of headers to log with their values intact.\n\t// All headers not in the slice will have their values REDACTED.\n\t// Applies to request and response headers.\n\tAllowedHeaders []string\n\n\t// AllowedQueryParams is the slice of query parameters to log with their values intact.\n\t// All query parameters not in the slice will have their values REDACTED.\n\tAllowedQueryParams []string\n}\n\n// RetryOptions configures the retry policy's behavior.\n// Zero-value fields will have their specified default values applied during use.\n// This allows for modification of a subset of fields.\ntype RetryOptions struct {\n\t// MaxRetries specifies the maximum number of attempts a failed operation will be retried\n\t// before producing an error.\n\t// The default value is three.  A value less than zero means one try and no retries.\n\tMaxRetries int32\n\n\t// TryTimeout indicates the maximum time allowed for any single try of an HTTP request.\n\t// This is disabled by default.  Specify a value greater than zero to enable.\n\t// NOTE: Setting this to a small value might cause premature HTTP request time-outs.\n\tTryTimeout time.Duration\n\n\t// RetryDelay specifies the initial amount of delay to use before retrying an operation.\n\t// The value is used only if the HTTP response does not contain a Retry-After header.\n\t// The delay increases exponentially with each retry up to the maximum specified by MaxRetryDelay.\n\t// The default value is four seconds.  A value less than zero means no delay between retries.\n\tRetryDelay time.Duration\n\n\t// MaxRetryDelay specifies the maximum delay allowed before retrying an operation.\n\t// Typically the value is greater than or equal to the value specified in RetryDelay.\n\t// The default Value is 60 seconds.  A value less than zero means there is no cap.\n\tMaxRetryDelay time.Duration\n\n\t// StatusCodes specifies the HTTP status codes that indicate the operation should be retried.\n\t// A nil slice will use the following values.\n\t//   http.StatusRequestTimeout      408\n\t//   http.StatusTooManyRequests     429\n\t//   http.StatusInternalServerError 500\n\t//   http.StatusBadGateway          502\n\t//   http.StatusServiceUnavailable  503\n\t//   http.StatusGatewayTimeout      504\n\t// Specifying values will replace the default values.\n\t// Specifying an empty slice will disable retries for HTTP status codes.\n\tStatusCodes []int\n\n\t// ShouldRetry evaluates if the retry policy should retry the request.\n\t// When specified, the function overrides comparison against the list of\n\t// HTTP status codes and error checking within the retry policy. Context\n\t// and NonRetriable errors remain evaluated before calling ShouldRetry.\n\t// The *http.Response and error parameters are mutually exclusive, i.e.\n\t// if one is nil, the other is not nil.\n\t// A return value of true means the retry policy should retry.\n\tShouldRetry func(*http.Response, error) bool\n}\n\n// TelemetryOptions configures the telemetry policy's behavior.\ntype TelemetryOptions struct {\n\t// ApplicationID is an application-specific identification string to add to the User-Agent.\n\t// It has a maximum length of 24 characters and must not contain any spaces.\n\tApplicationID string\n\n\t// Disabled will prevent the addition of any telemetry data to the User-Agent.\n\tDisabled bool\n}\n\n// TokenRequestOptions contain specific parameter that may be used by credentials types when attempting to get a token.\ntype TokenRequestOptions = exported.TokenRequestOptions\n\n// BearerTokenOptions configures the bearer token policy's behavior.\ntype BearerTokenOptions struct {\n\t// AuthorizationHandler allows SDK developers to run client-specific logic when BearerTokenPolicy must authorize a request.\n\t// When this field isn't set, the policy follows its default behavior of authorizing every request with a bearer token from\n\t// its given credential.\n\tAuthorizationHandler AuthorizationHandler\n\n\t// InsecureAllowCredentialWithHTTP enables authenticated requests over HTTP.\n\t// By default, authenticated requests to an HTTP endpoint are rejected by the client.\n\t// WARNING: setting this to true will allow sending the bearer token in clear text. Use with caution.\n\tInsecureAllowCredentialWithHTTP bool\n}\n\n// AuthorizationHandler allows SDK developers to insert custom logic that runs when BearerTokenPolicy must authorize a request.\ntype AuthorizationHandler struct {\n\t// OnRequest provides TokenRequestOptions the policy can use to acquire a token for a request. The policy calls OnRequest\n\t// whenever it needs a token and may call it multiple times for the same request. Its func parameter authorizes the request\n\t// with a token from the policy's credential. Implementations that need to perform I/O should use the Request's context,\n\t// available from Request.Raw().Context(). When OnRequest returns an error, the policy propagates that error and doesn't send\n\t// the request. When OnRequest is nil, the policy follows its default behavior, which is to authorize the request with a token\n\t// from its credential according to its configuration.\n\tOnRequest func(*Request, func(TokenRequestOptions) error) error\n\n\t// OnChallenge allows clients to implement custom HTTP authentication challenge handling. BearerTokenPolicy calls it upon\n\t// receiving a 401 response containing multiple Bearer challenges or a challenge BearerTokenPolicy itself can't handle.\n\t// OnChallenge is responsible for parsing challenge(s) (the Response's WWW-Authenticate header) and reauthorizing the\n\t// Request accordingly. Its func argument authorizes the Request with a token from the policy's credential using the given\n\t// TokenRequestOptions. OnChallenge should honor the Request's context, available from Request.Raw().Context(). When\n\t// OnChallenge returns nil, the policy will send the Request again.\n\tOnChallenge func(*Request, *http.Response, func(TokenRequestOptions) error) error\n}\n\n// WithCaptureResponse applies the HTTP response retrieval annotation to the parent context.\n// The resp parameter will contain the HTTP response after the request has completed.\nfunc WithCaptureResponse(parent context.Context, resp **http.Response) context.Context {\n\treturn context.WithValue(parent, shared.CtxWithCaptureResponse{}, resp)\n}\n\n// WithHTTPHeader adds the specified http.Header to the parent context.\n// Use this to specify custom HTTP headers at the API-call level.\n// Any overlapping headers will have their values replaced with the values specified here.\nfunc WithHTTPHeader(parent context.Context, header http.Header) context.Context {\n\treturn context.WithValue(parent, shared.CtxWithHTTPHeaderKey{}, header)\n}\n\n// WithRetryOptions adds the specified RetryOptions to the parent context.\n// Use this to specify custom RetryOptions at the API-call level.\nfunc WithRetryOptions(parent context.Context, options RetryOptions) context.Context {\n\treturn context.WithValue(parent, shared.CtxWithRetryOptionsKey{}, options)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/doc.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright 2017 Microsoft Corporation. All rights reserved.\n// Use of this source code is governed by an MIT\n// license that can be found in the LICENSE file.\n\n// Package runtime contains various facilities for creating requests and handling responses.\n// The content is intended for SDK authors.\npackage runtime\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/errors.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n)\n\n// NewResponseError creates an *azcore.ResponseError from the provided HTTP response.\n// Call this when a service request returns a non-successful status code.\n// The error code will be extracted from the *http.Response, either from the x-ms-error-code\n// header (preferred) or attempted to be parsed from the response body.\nfunc NewResponseError(resp *http.Response) error {\n\treturn exported.NewResponseError(resp)\n}\n\n// NewResponseErrorWithErrorCode creates an *azcore.ResponseError from the provided HTTP response and errorCode.\n// Use this variant when the error code is in a non-standard location.\nfunc NewResponseErrorWithErrorCode(resp *http.Response, errorCode string) error {\n\treturn exported.NewResponseErrorWithErrorCode(resp, errorCode)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pager.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"reflect\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing\"\n)\n\n// PagingHandler contains the required data for constructing a Pager.\ntype PagingHandler[T any] struct {\n\t// More returns a boolean indicating if there are more pages to fetch.\n\t// It uses the provided page to make the determination.\n\tMore func(T) bool\n\n\t// Fetcher fetches the first and subsequent pages.\n\tFetcher func(context.Context, *T) (T, error)\n\n\t// Tracer contains the Tracer from the client that's creating the Pager.\n\tTracer tracing.Tracer\n}\n\n// Pager provides operations for iterating over paged responses.\n// Methods on this type are not safe for concurrent use.\ntype Pager[T any] struct {\n\tcurrent   *T\n\thandler   PagingHandler[T]\n\ttracer    tracing.Tracer\n\tfirstPage bool\n}\n\n// NewPager creates an instance of Pager using the specified PagingHandler.\n// Pass a non-nil T for firstPage if the first page has already been retrieved.\nfunc NewPager[T any](handler PagingHandler[T]) *Pager[T] {\n\treturn &Pager[T]{\n\t\thandler:   handler,\n\t\ttracer:    handler.Tracer,\n\t\tfirstPage: true,\n\t}\n}\n\n// More returns true if there are more pages to retrieve.\nfunc (p *Pager[T]) More() bool {\n\tif p.current != nil {\n\t\treturn p.handler.More(*p.current)\n\t}\n\treturn true\n}\n\n// NextPage advances the pager to the next page.\nfunc (p *Pager[T]) NextPage(ctx context.Context) (T, error) {\n\tif p.current != nil {\n\t\tif p.firstPage {\n\t\t\t// we get here if it's an LRO-pager, we already have the first page\n\t\t\tp.firstPage = false\n\t\t\treturn *p.current, nil\n\t\t} else if !p.handler.More(*p.current) {\n\t\t\treturn *new(T), errors.New(\"no more pages\")\n\t\t}\n\t} else {\n\t\t// non-LRO case, first page\n\t\tp.firstPage = false\n\t}\n\n\tvar err error\n\tctx, endSpan := StartSpan(ctx, fmt.Sprintf(\"%s.NextPage\", shortenTypeName(reflect.TypeOf(*p).Name())), p.tracer, nil)\n\tdefer func() { endSpan(err) }()\n\n\tresp, err := p.handler.Fetcher(ctx, p.current)\n\tif err != nil {\n\t\treturn *new(T), err\n\t}\n\tp.current = &resp\n\treturn *p.current, nil\n}\n\n// UnmarshalJSON implements the json.Unmarshaler interface for Pager[T].\nfunc (p *Pager[T]) UnmarshalJSON(data []byte) error {\n\treturn json.Unmarshal(data, &p.current)\n}\n\n// FetcherForNextLinkOptions contains the optional values for [FetcherForNextLink].\ntype FetcherForNextLinkOptions struct {\n\t// NextReq is the func to be called when requesting subsequent pages.\n\t// Used for paged operations that have a custom next link operation.\n\tNextReq func(context.Context, string) (*policy.Request, error)\n\n\t// StatusCodes contains additional HTTP status codes indicating success.\n\t// The default value is http.StatusOK.\n\tStatusCodes []int\n}\n\n// FetcherForNextLink is a helper containing boilerplate code to simplify creating a PagingHandler[T].Fetcher from a next link URL.\n//   - ctx is the [context.Context] controlling the lifetime of the HTTP operation\n//   - pl is the [Pipeline] used to dispatch the HTTP request\n//   - nextLink is the URL used to fetch the next page. the empty string indicates the first page is to be requested\n//   - firstReq is the func to be called when creating the request for the first page\n//   - options contains any optional parameters, pass nil to accept the default values\nfunc FetcherForNextLink(ctx context.Context, pl Pipeline, nextLink string, firstReq func(context.Context) (*policy.Request, error), options *FetcherForNextLinkOptions) (*http.Response, error) {\n\tvar req *policy.Request\n\tvar err error\n\tif options == nil {\n\t\toptions = &FetcherForNextLinkOptions{}\n\t}\n\tif nextLink == \"\" {\n\t\treq, err = firstReq(ctx)\n\t} else if nextLink, err = EncodeQueryParams(nextLink); err == nil {\n\t\tif options.NextReq != nil {\n\t\t\treq, err = options.NextReq(ctx, nextLink)\n\t\t} else {\n\t\t\treq, err = NewRequest(ctx, http.MethodGet, nextLink)\n\t\t}\n\t}\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := pl.Do(req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsuccessCodes := []int{http.StatusOK}\n\tsuccessCodes = append(successCodes, options.StatusCodes...)\n\tif !HasStatusCode(resp, successCodes...) {\n\t\treturn nil, NewResponseError(resp)\n\t}\n\treturn resp, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pipeline.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n)\n\n// PipelineOptions contains Pipeline options for SDK developers\ntype PipelineOptions struct {\n\t// AllowedHeaders is the slice of headers to log with their values intact.\n\t// All headers not in the slice will have their values REDACTED.\n\t// Applies to request and response headers.\n\tAllowedHeaders []string\n\n\t// AllowedQueryParameters is the slice of query parameters to log with their values intact.\n\t// All query parameters not in the slice will have their values REDACTED.\n\tAllowedQueryParameters []string\n\n\t// APIVersion overrides the default version requested of the service.\n\t// Set with caution as this package version has not been tested with arbitrary service versions.\n\tAPIVersion APIVersionOptions\n\n\t// PerCall contains custom policies to inject into the pipeline.\n\t// Each policy is executed once per request.\n\tPerCall []policy.Policy\n\n\t// PerRetry contains custom policies to inject into the pipeline.\n\t// Each policy is executed once per request, and for each retry of that request.\n\tPerRetry []policy.Policy\n\n\t// Tracing contains options used to configure distributed tracing.\n\tTracing TracingOptions\n}\n\n// TracingOptions contains tracing options for SDK developers.\ntype TracingOptions struct {\n\t// Namespace contains the value to use for the az.namespace span attribute.\n\tNamespace string\n}\n\n// Pipeline represents a primitive for sending HTTP requests and receiving responses.\n// Its behavior can be extended by specifying policies during construction.\ntype Pipeline = exported.Pipeline\n\n// NewPipeline creates a pipeline from connection options, with any additional policies as specified.\n// Policies from ClientOptions are placed after policies from PipelineOptions.\n// The module and version parameters are used by the telemetry policy, when enabled.\nfunc NewPipeline(module, version string, plOpts PipelineOptions, options *policy.ClientOptions) Pipeline {\n\tcp := policy.ClientOptions{}\n\tif options != nil {\n\t\tcp = *options\n\t}\n\tif len(plOpts.AllowedHeaders) > 0 {\n\t\theaders := make([]string, len(plOpts.AllowedHeaders)+len(cp.Logging.AllowedHeaders))\n\t\tcopy(headers, plOpts.AllowedHeaders)\n\t\theaders = append(headers, cp.Logging.AllowedHeaders...)\n\t\tcp.Logging.AllowedHeaders = headers\n\t}\n\tif len(plOpts.AllowedQueryParameters) > 0 {\n\t\tqp := make([]string, len(plOpts.AllowedQueryParameters)+len(cp.Logging.AllowedQueryParams))\n\t\tcopy(qp, plOpts.AllowedQueryParameters)\n\t\tqp = append(qp, cp.Logging.AllowedQueryParams...)\n\t\tcp.Logging.AllowedQueryParams = qp\n\t}\n\t// we put the includeResponsePolicy at the very beginning so that the raw response\n\t// is populated with the final response (some policies might mutate the response)\n\tpolicies := []policy.Policy{exported.PolicyFunc(includeResponsePolicy)}\n\tif cp.APIVersion != \"\" {\n\t\tpolicies = append(policies, newAPIVersionPolicy(cp.APIVersion, &plOpts.APIVersion))\n\t}\n\tif !cp.Telemetry.Disabled {\n\t\tpolicies = append(policies, NewTelemetryPolicy(module, version, &cp.Telemetry))\n\t}\n\tpolicies = append(policies, plOpts.PerCall...)\n\tpolicies = append(policies, cp.PerCallPolicies...)\n\tpolicies = append(policies, NewRetryPolicy(&cp.Retry))\n\tpolicies = append(policies, plOpts.PerRetry...)\n\tpolicies = append(policies, cp.PerRetryPolicies...)\n\tpolicies = append(policies, exported.PolicyFunc(httpHeaderPolicy))\n\tpolicies = append(policies, newHTTPTracePolicy(cp.Logging.AllowedQueryParams))\n\tpolicies = append(policies, NewLogPolicy(&cp.Logging))\n\tpolicies = append(policies, exported.PolicyFunc(bodyDownloadPolicy))\n\ttransport := cp.Transport\n\tif transport == nil {\n\t\ttransport = defaultHTTPClient\n\t}\n\treturn exported.NewPipeline(transport, policies...)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_api_version.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n)\n\n// APIVersionOptions contains options for API versions\ntype APIVersionOptions struct {\n\t// Location indicates where to set the version on a request, for example in a header or query param\n\tLocation APIVersionLocation\n\t// Name is the name of the header or query parameter, for example \"api-version\"\n\tName string\n}\n\n// APIVersionLocation indicates which part of a request identifies the service version\ntype APIVersionLocation int\n\nconst (\n\t// APIVersionLocationQueryParam indicates a query parameter\n\tAPIVersionLocationQueryParam = 0\n\t// APIVersionLocationHeader indicates a header\n\tAPIVersionLocationHeader = 1\n)\n\n// newAPIVersionPolicy constructs an APIVersionPolicy. If version is \"\", Do will be a no-op. If version\n// isn't empty and opts.Name is empty, Do will return an error.\nfunc newAPIVersionPolicy(version string, opts *APIVersionOptions) *apiVersionPolicy {\n\tif opts == nil {\n\t\topts = &APIVersionOptions{}\n\t}\n\treturn &apiVersionPolicy{location: opts.Location, name: opts.Name, version: version}\n}\n\n// apiVersionPolicy enables users to set the API version of every request a client sends.\ntype apiVersionPolicy struct {\n\t// location indicates whether \"name\" refers to a query parameter or header.\n\tlocation APIVersionLocation\n\n\t// name of the query param or header whose value should be overridden; provided by the client.\n\tname string\n\n\t// version is the value (provided by the user) that replaces the default version value.\n\tversion string\n}\n\n// Do sets the request's API version, if the policy is configured to do so, replacing any prior value.\nfunc (a *apiVersionPolicy) Do(req *policy.Request) (*http.Response, error) {\n\tif a.version != \"\" {\n\t\tif a.name == \"\" {\n\t\t\t// user set ClientOptions.APIVersion but the client ctor didn't set PipelineOptions.APIVersionOptions\n\t\t\treturn nil, errors.New(\"this client doesn't support overriding its API version\")\n\t\t}\n\t\tswitch a.location {\n\t\tcase APIVersionLocationHeader:\n\t\t\treq.Raw().Header.Set(a.name, a.version)\n\t\tcase APIVersionLocationQueryParam:\n\t\t\tq := req.Raw().URL.Query()\n\t\t\tq.Set(a.name, a.version)\n\t\t\treq.Raw().URL.RawQuery = q.Encode()\n\t\tdefault:\n\t\t\treturn nil, fmt.Errorf(\"unknown APIVersionLocation %d\", a.location)\n\t\t}\n\t}\n\treturn req.Next()\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_bearer_token.go",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"net/http\"\n\t\"regexp\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/errorinfo\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/temporal\"\n)\n\n// BearerTokenPolicy authorizes requests with bearer tokens acquired from a TokenCredential.\n// It handles [Continuous Access Evaluation] (CAE) challenges. Clients needing to handle\n// additional authentication challenges, or needing more control over authorization, should\n// provide a [policy.AuthorizationHandler] in [policy.BearerTokenOptions].\n//\n// [Continuous Access Evaluation]: https://learn.microsoft.com/entra/identity/conditional-access/concept-continuous-access-evaluation\ntype BearerTokenPolicy struct {\n\t// mainResource is the resource to be retreived using the tenant specified in the credential\n\tmainResource *temporal.Resource[exported.AccessToken, acquiringResourceState]\n\t// the following fields are read-only\n\tauthzHandler policy.AuthorizationHandler\n\tcred         exported.TokenCredential\n\tscopes       []string\n\tallowHTTP    bool\n}\n\ntype acquiringResourceState struct {\n\treq *policy.Request\n\tp   *BearerTokenPolicy\n\ttro policy.TokenRequestOptions\n}\n\n// acquire acquires or updates the resource; only one\n// thread/goroutine at a time ever calls this function\nfunc acquire(state acquiringResourceState) (newResource exported.AccessToken, newExpiration time.Time, err error) {\n\ttk, err := state.p.cred.GetToken(&shared.ContextWithDeniedValues{Context: state.req.Raw().Context()}, state.tro)\n\tif err != nil {\n\t\treturn exported.AccessToken{}, time.Time{}, err\n\t}\n\treturn tk, tk.ExpiresOn, nil\n}\n\n// shouldRefresh determines whether the token should be refreshed. It's a variable so tests can replace it.\nvar shouldRefresh = func(tk exported.AccessToken, _ acquiringResourceState) bool {\n\tif tk.RefreshOn.IsZero() {\n\t\treturn tk.ExpiresOn.Add(-5 * time.Minute).Before(time.Now())\n\t}\n\t// no offset in this case because the authority suggested a refresh window--between RefreshOn and ExpiresOn\n\treturn tk.RefreshOn.Before(time.Now())\n}\n\n// NewBearerTokenPolicy creates a policy object that authorizes requests with bearer tokens.\n// cred: an azcore.TokenCredential implementation such as a credential object from azidentity\n// scopes: the list of permission scopes required for the token.\n// opts: optional settings. Pass nil to accept default values; this is the same as passing a zero-value options.\nfunc NewBearerTokenPolicy(cred exported.TokenCredential, scopes []string, opts *policy.BearerTokenOptions) *BearerTokenPolicy {\n\tif opts == nil {\n\t\topts = &policy.BearerTokenOptions{}\n\t}\n\tah := opts.AuthorizationHandler\n\tif ah.OnRequest == nil {\n\t\t// Set a default OnRequest that simply requests a token with the given scopes. OnChallenge\n\t\t// doesn't get a default so the policy can use a nil check to determine whether the caller\n\t\t// provided an implementation.\n\t\tah.OnRequest = func(_ *policy.Request, authNZ func(policy.TokenRequestOptions) error) error {\n\t\t\t// authNZ sets EnableCAE: true in all cases, no need to duplicate that here\n\t\t\treturn authNZ(policy.TokenRequestOptions{Scopes: scopes})\n\t\t}\n\t}\n\tmr := temporal.NewResourceWithOptions(acquire, temporal.ResourceOptions[exported.AccessToken, acquiringResourceState]{\n\t\tShouldRefresh: shouldRefresh,\n\t})\n\treturn &BearerTokenPolicy{\n\t\tauthzHandler: ah,\n\t\tcred:         cred,\n\t\tscopes:       scopes,\n\t\tmainResource: mr,\n\t\tallowHTTP:    opts.InsecureAllowCredentialWithHTTP,\n\t}\n}\n\n// authenticateAndAuthorize returns a function which authorizes req with a token from the policy's credential\nfunc (b *BearerTokenPolicy) authenticateAndAuthorize(req *policy.Request) func(policy.TokenRequestOptions) error {\n\treturn func(tro policy.TokenRequestOptions) error {\n\t\ttro.EnableCAE = true\n\t\tas := acquiringResourceState{p: b, req: req, tro: tro}\n\t\ttk, err := b.mainResource.Get(as)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treq.Raw().Header.Set(shared.HeaderAuthorization, shared.BearerTokenPrefix+tk.Token)\n\t\treturn nil\n\t}\n}\n\n// Do authorizes a request with a bearer token\nfunc (b *BearerTokenPolicy) Do(req *policy.Request) (*http.Response, error) {\n\t// skip adding the authorization header if no TokenCredential was provided.\n\t// this prevents a panic that might be hard to diagnose and allows testing\n\t// against http endpoints that don't require authentication.\n\tif b.cred == nil {\n\t\treturn req.Next()\n\t}\n\n\tif err := checkHTTPSForAuth(req, b.allowHTTP); err != nil {\n\t\treturn nil, err\n\t}\n\n\terr := b.authzHandler.OnRequest(req, b.authenticateAndAuthorize(req))\n\tif err != nil {\n\t\treturn nil, errorinfo.NonRetriableError(err)\n\t}\n\n\tres, err := req.Next()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tres, err = b.handleChallenge(req, res, false)\n\treturn res, err\n}\n\n// handleChallenge handles authentication challenges either directly (for CAE challenges) or by calling\n// the AuthorizationHandler. It's a no-op when the response doesn't include an authentication challenge.\n// It will recurse at most once, to handle a CAE challenge following a non-CAE challenge handled by the\n// AuthorizationHandler.\nfunc (b *BearerTokenPolicy) handleChallenge(req *policy.Request, res *http.Response, recursed bool) (*http.Response, error) {\n\tvar err error\n\tif res.StatusCode == http.StatusUnauthorized {\n\t\tb.mainResource.Expire()\n\t\tif res.Header.Get(shared.HeaderWWWAuthenticate) != \"\" {\n\t\t\tcaeChallenge, parseErr := parseCAEChallenge(res)\n\t\t\tif parseErr != nil {\n\t\t\t\treturn res, parseErr\n\t\t\t}\n\t\t\tswitch {\n\t\t\tcase caeChallenge != nil:\n\t\t\t\tauthNZ := func(tro policy.TokenRequestOptions) error {\n\t\t\t\t\t// Take the TokenRequestOptions provided by OnRequest and add the challenge claims. The value\n\t\t\t\t\t// will be empty at time of writing because CAE is the only feature involving claims. If in\n\t\t\t\t\t// the future some client needs to specify unrelated claims, this function may need to merge\n\t\t\t\t\t// them with the challenge claims.\n\t\t\t\t\ttro.Claims = caeChallenge.params[\"claims\"]\n\t\t\t\t\treturn b.authenticateAndAuthorize(req)(tro)\n\t\t\t\t}\n\t\t\t\tif err = b.authzHandler.OnRequest(req, authNZ); err == nil {\n\t\t\t\t\tif err = req.RewindBody(); err == nil {\n\t\t\t\t\t\tres, err = req.Next()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tcase b.authzHandler.OnChallenge != nil && !recursed:\n\t\t\t\tif err = b.authzHandler.OnChallenge(req, res, b.authenticateAndAuthorize(req)); err == nil {\n\t\t\t\t\tif err = req.RewindBody(); err == nil {\n\t\t\t\t\t\tif res, err = req.Next(); err == nil {\n\t\t\t\t\t\t\tres, err = b.handleChallenge(req, res, true)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// don't retry challenge handling errors\n\t\t\t\t\terr = errorinfo.NonRetriableError(err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\t// return the response to the pipeline\n\t\t\t}\n\t\t}\n\t}\n\treturn res, err\n}\n\nfunc checkHTTPSForAuth(req *policy.Request, allowHTTP bool) error {\n\tif strings.ToLower(req.Raw().URL.Scheme) != \"https\" && !allowHTTP {\n\t\treturn errorinfo.NonRetriableError(errors.New(\"authenticated requests are not permitted for non TLS protected (https) endpoints\"))\n\t}\n\treturn nil\n}\n\n// parseCAEChallenge returns a *authChallenge representing Response's CAE challenge (nil when Response has none).\n// If Response includes a CAE challenge having invalid claims, it returns a NonRetriableError.\nfunc parseCAEChallenge(res *http.Response) (*authChallenge, error) {\n\tvar (\n\t\tcaeChallenge *authChallenge\n\t\terr          error\n\t)\n\tfor _, c := range parseChallenges(res) {\n\t\tif c.scheme == \"Bearer\" {\n\t\t\tif claims := c.params[\"claims\"]; claims != \"\" && c.params[\"error\"] == \"insufficient_claims\" {\n\t\t\t\tif b, de := base64.StdEncoding.DecodeString(claims); de == nil {\n\t\t\t\t\tc.params[\"claims\"] = string(b)\n\t\t\t\t\tcaeChallenge = &c\n\t\t\t\t} else {\n\t\t\t\t\t// don't include the decoding error because it's something\n\t\t\t\t\t// unhelpful like \"illegal base64 data at input byte 42\"\n\t\t\t\t\terr = errorinfo.NonRetriableError(errors.New(\"authentication challenge contains invalid claims: \" + claims))\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn caeChallenge, err\n}\n\nvar (\n\tchallenge, challengeParams *regexp.Regexp\n\tonce                       = &sync.Once{}\n)\n\ntype authChallenge struct {\n\tscheme string\n\tparams map[string]string\n}\n\n// parseChallenges assumes authentication challenges have quoted parameter values\nfunc parseChallenges(res *http.Response) []authChallenge {\n\tonce.Do(func() {\n\t\t// matches challenges having quoted parameters, capturing scheme and parameters\n\t\tchallenge = regexp.MustCompile(`(?:(\\w+) ((?:\\w+=\"[^\"]*\",?\\s*)+))`)\n\t\t// captures parameter names and values in a match of the above expression\n\t\tchallengeParams = regexp.MustCompile(`(\\w+)=\"([^\"]*)\"`)\n\t})\n\tparsed := []authChallenge{}\n\t// WWW-Authenticate can have multiple values, each containing multiple challenges\n\tfor _, h := range res.Header.Values(shared.HeaderWWWAuthenticate) {\n\t\tfor _, sm := range challenge.FindAllStringSubmatch(h, -1) {\n\t\t\t// sm is [challenge, scheme, params] (see regexp documentation on submatches)\n\t\t\tc := authChallenge{\n\t\t\t\tparams: make(map[string]string),\n\t\t\t\tscheme: sm[1],\n\t\t\t}\n\t\t\tfor _, sm := range challengeParams.FindAllStringSubmatch(sm[2], -1) {\n\t\t\t\t// sm is [key=\"value\", key, value] (see regexp documentation on submatches)\n\t\t\t\tc.params[sm[1]] = sm[2]\n\t\t\t}\n\t\t\tparsed = append(parsed, c)\n\t\t}\n\t}\n\treturn parsed\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_body_download.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/errorinfo\"\n)\n\n// bodyDownloadPolicy creates a policy object that downloads the response's body to a []byte.\nfunc bodyDownloadPolicy(req *policy.Request) (*http.Response, error) {\n\tresp, err := req.Next()\n\tif err != nil {\n\t\treturn resp, err\n\t}\n\tvar opValues bodyDownloadPolicyOpValues\n\t// don't skip downloading error response bodies\n\tif req.OperationValue(&opValues); opValues.Skip && resp.StatusCode < 400 {\n\t\treturn resp, err\n\t}\n\t// Either bodyDownloadPolicyOpValues was not specified (so skip is false)\n\t// or it was specified and skip is false: don't skip downloading the body\n\t_, err = Payload(resp)\n\tif err != nil {\n\t\treturn resp, newBodyDownloadError(err, req)\n\t}\n\treturn resp, err\n}\n\n// bodyDownloadPolicyOpValues is the struct containing the per-operation values\ntype bodyDownloadPolicyOpValues struct {\n\tSkip bool\n}\n\ntype bodyDownloadError struct {\n\terr error\n}\n\nfunc newBodyDownloadError(err error, req *policy.Request) error {\n\t// on failure, only retry the request for idempotent operations.\n\t// we currently identify them as DELETE, GET, and PUT requests.\n\tif m := strings.ToUpper(req.Raw().Method); m == http.MethodDelete || m == http.MethodGet || m == http.MethodPut {\n\t\t// error is safe for retry\n\t\treturn err\n\t}\n\t// wrap error to avoid retries\n\treturn &bodyDownloadError{\n\t\terr: err,\n\t}\n}\n\nfunc (b *bodyDownloadError) Error() string {\n\treturn fmt.Sprintf(\"body download policy: %s\", b.err.Error())\n}\n\nfunc (b *bodyDownloadError) NonRetriable() {\n\t// marker method\n}\n\nfunc (b *bodyDownloadError) Unwrap() error {\n\treturn b.err\n}\n\nvar _ errorinfo.NonRetriable = (*bodyDownloadError)(nil)\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_http_header.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n)\n\n// newHTTPHeaderPolicy creates a policy object that adds custom HTTP headers to a request\nfunc httpHeaderPolicy(req *policy.Request) (*http.Response, error) {\n\t// check if any custom HTTP headers have been specified\n\tif header := req.Raw().Context().Value(shared.CtxWithHTTPHeaderKey{}); header != nil {\n\t\tfor k, v := range header.(http.Header) {\n\t\t\t// use Set to replace any existing value\n\t\t\t// it also canonicalizes the header key\n\t\t\treq.Raw().Header.Set(k, v[0])\n\t\t\t// add any remaining values\n\t\t\tfor i := 1; i < len(v); i++ {\n\t\t\t\treq.Raw().Header.Add(k, v[i])\n\t\t\t}\n\t\t}\n\t}\n\treturn req.Next()\n}\n\n// WithHTTPHeader adds the specified http.Header to the parent context.\n// Use this to specify custom HTTP headers at the API-call level.\n// Any overlapping headers will have their values replaced with the values specified here.\n// Deprecated: use [policy.WithHTTPHeader] instead.\nfunc WithHTTPHeader(parent context.Context, header http.Header) context.Context {\n\treturn policy.WithHTTPHeader(parent, header)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_http_trace.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing\"\n)\n\nconst (\n\tattrHTTPMethod     = \"http.method\"\n\tattrHTTPURL        = \"http.url\"\n\tattrHTTPUserAgent  = \"http.user_agent\"\n\tattrHTTPStatusCode = \"http.status_code\"\n\n\tattrAZClientReqID  = \"az.client_request_id\"\n\tattrAZServiceReqID = \"az.service_request_id\"\n\n\tattrNetPeerName = \"net.peer.name\"\n)\n\n// newHTTPTracePolicy creates a new instance of the httpTracePolicy.\n//   - allowedQueryParams contains the user-specified query parameters that don't need to be redacted from the trace\nfunc newHTTPTracePolicy(allowedQueryParams []string) exported.Policy {\n\treturn &httpTracePolicy{allowedQP: getAllowedQueryParams(allowedQueryParams)}\n}\n\n// httpTracePolicy is a policy that creates a trace for the HTTP request and its response\ntype httpTracePolicy struct {\n\tallowedQP map[string]struct{}\n}\n\n// Do implements the pipeline.Policy interfaces for the httpTracePolicy type.\nfunc (h *httpTracePolicy) Do(req *policy.Request) (resp *http.Response, err error) {\n\trawTracer := req.Raw().Context().Value(shared.CtxWithTracingTracer{})\n\tif tracer, ok := rawTracer.(tracing.Tracer); ok && tracer.Enabled() {\n\t\tattributes := []tracing.Attribute{\n\t\t\t{Key: attrHTTPMethod, Value: req.Raw().Method},\n\t\t\t{Key: attrHTTPURL, Value: getSanitizedURL(*req.Raw().URL, h.allowedQP)},\n\t\t\t{Key: attrNetPeerName, Value: req.Raw().URL.Host},\n\t\t}\n\n\t\tif ua := req.Raw().Header.Get(shared.HeaderUserAgent); ua != \"\" {\n\t\t\tattributes = append(attributes, tracing.Attribute{Key: attrHTTPUserAgent, Value: ua})\n\t\t}\n\t\tif reqID := req.Raw().Header.Get(shared.HeaderXMSClientRequestID); reqID != \"\" {\n\t\t\tattributes = append(attributes, tracing.Attribute{Key: attrAZClientReqID, Value: reqID})\n\t\t}\n\n\t\tctx := req.Raw().Context()\n\t\tctx, span := tracer.Start(ctx, \"HTTP \"+req.Raw().Method, &tracing.SpanOptions{\n\t\t\tKind:       tracing.SpanKindClient,\n\t\t\tAttributes: attributes,\n\t\t})\n\n\t\tdefer func() {\n\t\t\tif resp != nil {\n\t\t\t\tspan.SetAttributes(tracing.Attribute{Key: attrHTTPStatusCode, Value: resp.StatusCode})\n\t\t\t\tif resp.StatusCode > 399 {\n\t\t\t\t\tspan.SetStatus(tracing.SpanStatusError, resp.Status)\n\t\t\t\t}\n\t\t\t\tif reqID := resp.Header.Get(shared.HeaderXMSRequestID); reqID != \"\" {\n\t\t\t\t\tspan.SetAttributes(tracing.Attribute{Key: attrAZServiceReqID, Value: reqID})\n\t\t\t\t}\n\t\t\t} else if err != nil {\n\t\t\t\tvar urlErr *url.Error\n\t\t\t\tif errors.As(err, &urlErr) {\n\t\t\t\t\t// calling *url.Error.Error() will include the unsanitized URL\n\t\t\t\t\t// which we don't want. in addition, we already have the HTTP verb\n\t\t\t\t\t// and sanitized URL in the trace so we aren't losing any info\n\t\t\t\t\terr = urlErr.Err\n\t\t\t\t}\n\t\t\t\tspan.SetStatus(tracing.SpanStatusError, err.Error())\n\t\t\t}\n\t\t\tspan.End()\n\t\t}()\n\n\t\treq = req.WithContext(ctx)\n\t}\n\tresp, err = req.Next()\n\treturn\n}\n\n// StartSpanOptions contains the optional values for StartSpan.\ntype StartSpanOptions struct {\n\t// Kind indicates the kind of Span.\n\tKind tracing.SpanKind\n\t// Attributes contains key-value pairs of attributes for the span.\n\tAttributes []tracing.Attribute\n}\n\n// StartSpan starts a new tracing span.\n// You must call the returned func to terminate the span. Pass the applicable error\n// if the span will exit with an error condition.\n//   - ctx is the parent context of the newly created context\n//   - name is the name of the span. this is typically the fully qualified name of an API (\"Client.Method\")\n//   - tracer is the client's Tracer for creating spans\n//   - options contains optional values. pass nil to accept any default values\nfunc StartSpan(ctx context.Context, name string, tracer tracing.Tracer, options *StartSpanOptions) (context.Context, func(error)) {\n\tif !tracer.Enabled() {\n\t\treturn ctx, func(err error) {}\n\t}\n\n\t// we MUST propagate the active tracer before returning so that the trace policy can access it\n\tctx = context.WithValue(ctx, shared.CtxWithTracingTracer{}, tracer)\n\n\tif activeSpan := ctx.Value(ctxActiveSpan{}); activeSpan != nil {\n\t\t// per the design guidelines, if a SDK method Foo() calls SDK method Bar(),\n\t\t// then the span for Bar() must be suppressed. however, if Bar() makes a REST\n\t\t// call, then Bar's HTTP span must be a child of Foo's span.\n\t\t// however, there is an exception to this rule. if the SDK method Foo() is a\n\t\t// messaging producer/consumer, and it takes a callback that's a SDK method\n\t\t// Bar(), then the span for Bar() must _not_ be suppressed.\n\t\tif kind := activeSpan.(tracing.SpanKind); kind == tracing.SpanKindClient || kind == tracing.SpanKindInternal {\n\t\t\treturn ctx, func(err error) {}\n\t\t}\n\t}\n\n\tif options == nil {\n\t\toptions = &StartSpanOptions{}\n\t}\n\tif options.Kind == 0 {\n\t\toptions.Kind = tracing.SpanKindInternal\n\t}\n\n\tctx, span := tracer.Start(ctx, name, &tracing.SpanOptions{\n\t\tKind:       options.Kind,\n\t\tAttributes: options.Attributes,\n\t})\n\tctx = context.WithValue(ctx, ctxActiveSpan{}, options.Kind)\n\treturn ctx, func(err error) {\n\t\tif err != nil {\n\t\t\terrType := strings.Replace(fmt.Sprintf(\"%T\", err), \"*exported.\", \"*azcore.\", 1)\n\t\t\tspan.SetStatus(tracing.SpanStatusError, fmt.Sprintf(\"%s:\\n%s\", errType, err.Error()))\n\t\t}\n\t\tspan.End()\n\t}\n}\n\n// ctxActiveSpan is used as a context key for indicating a SDK client span is in progress.\ntype ctxActiveSpan struct{}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_include_response.go",
    "content": "//go:build go1.16\n// +build go1.16\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n)\n\n// includeResponsePolicy creates a policy that retrieves the raw HTTP response upon request\nfunc includeResponsePolicy(req *policy.Request) (*http.Response, error) {\n\tresp, err := req.Next()\n\tif resp == nil {\n\t\treturn resp, err\n\t}\n\tif httpOutRaw := req.Raw().Context().Value(shared.CtxWithCaptureResponse{}); httpOutRaw != nil {\n\t\thttpOut := httpOutRaw.(**http.Response)\n\t\t*httpOut = resp\n\t}\n\treturn resp, err\n}\n\n// WithCaptureResponse applies the HTTP response retrieval annotation to the parent context.\n// The resp parameter will contain the HTTP response after the request has completed.\n// Deprecated: use [policy.WithCaptureResponse] instead.\nfunc WithCaptureResponse(parent context.Context, resp **http.Response) context.Context {\n\treturn policy.WithCaptureResponse(parent, resp)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_key_credential.go",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n)\n\n// KeyCredentialPolicy authorizes requests with a [azcore.KeyCredential].\ntype KeyCredentialPolicy struct {\n\tcred      *exported.KeyCredential\n\theader    string\n\tprefix    string\n\tallowHTTP bool\n}\n\n// KeyCredentialPolicyOptions contains the optional values configuring [KeyCredentialPolicy].\ntype KeyCredentialPolicyOptions struct {\n\t// InsecureAllowCredentialWithHTTP enables authenticated requests over HTTP.\n\t// By default, authenticated requests to an HTTP endpoint are rejected by the client.\n\t// WARNING: setting this to true will allow sending the authentication key in clear text. Use with caution.\n\tInsecureAllowCredentialWithHTTP bool\n\n\t// Prefix is used if the key requires a prefix before it's inserted into the HTTP request.\n\tPrefix string\n}\n\n// NewKeyCredentialPolicy creates a new instance of [KeyCredentialPolicy].\n//   - cred is the [azcore.KeyCredential] used to authenticate with the service\n//   - header is the name of the HTTP request header in which the key is placed\n//   - options contains optional configuration, pass nil to accept the default values\nfunc NewKeyCredentialPolicy(cred *exported.KeyCredential, header string, options *KeyCredentialPolicyOptions) *KeyCredentialPolicy {\n\tif options == nil {\n\t\toptions = &KeyCredentialPolicyOptions{}\n\t}\n\treturn &KeyCredentialPolicy{\n\t\tcred:      cred,\n\t\theader:    header,\n\t\tprefix:    options.Prefix,\n\t\tallowHTTP: options.InsecureAllowCredentialWithHTTP,\n\t}\n}\n\n// Do implementes the Do method on the [policy.Polilcy] interface.\nfunc (k *KeyCredentialPolicy) Do(req *policy.Request) (*http.Response, error) {\n\t// skip adding the authorization header if no KeyCredential was provided.\n\t// this prevents a panic that might be hard to diagnose and allows testing\n\t// against http endpoints that don't require authentication.\n\tif k.cred != nil {\n\t\tif err := checkHTTPSForAuth(req, k.allowHTTP); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tval := exported.KeyCredentialGet(k.cred)\n\t\tif k.prefix != \"\" {\n\t\t\tval = k.prefix + val\n\t\t}\n\t\treq.Raw().Header.Add(k.header, val)\n\t}\n\treturn req.Next()\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_logging.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/diag\"\n)\n\ntype logPolicy struct {\n\tincludeBody    bool\n\tallowedHeaders map[string]struct{}\n\tallowedQP      map[string]struct{}\n}\n\n// NewLogPolicy creates a request/response logging policy object configured using the specified options.\n// Pass nil to accept the default values; this is the same as passing a zero-value options.\nfunc NewLogPolicy(o *policy.LogOptions) policy.Policy {\n\tif o == nil {\n\t\to = &policy.LogOptions{}\n\t}\n\t// construct default hash set of allowed headers\n\tallowedHeaders := map[string]struct{}{\n\t\t\"accept\":                        {},\n\t\t\"cache-control\":                 {},\n\t\t\"connection\":                    {},\n\t\t\"content-length\":                {},\n\t\t\"content-type\":                  {},\n\t\t\"date\":                          {},\n\t\t\"etag\":                          {},\n\t\t\"expires\":                       {},\n\t\t\"if-match\":                      {},\n\t\t\"if-modified-since\":             {},\n\t\t\"if-none-match\":                 {},\n\t\t\"if-unmodified-since\":           {},\n\t\t\"last-modified\":                 {},\n\t\t\"ms-cv\":                         {},\n\t\t\"pragma\":                        {},\n\t\t\"request-id\":                    {},\n\t\t\"retry-after\":                   {},\n\t\t\"server\":                        {},\n\t\t\"traceparent\":                   {},\n\t\t\"transfer-encoding\":             {},\n\t\t\"user-agent\":                    {},\n\t\t\"www-authenticate\":              {},\n\t\t\"x-ms-request-id\":               {},\n\t\t\"x-ms-client-request-id\":        {},\n\t\t\"x-ms-return-client-request-id\": {},\n\t}\n\t// add any caller-specified allowed headers to the set\n\tfor _, ah := range o.AllowedHeaders {\n\t\tallowedHeaders[strings.ToLower(ah)] = struct{}{}\n\t}\n\t// now do the same thing for query params\n\tallowedQP := getAllowedQueryParams(o.AllowedQueryParams)\n\treturn &logPolicy{\n\t\tincludeBody:    o.IncludeBody,\n\t\tallowedHeaders: allowedHeaders,\n\t\tallowedQP:      allowedQP,\n\t}\n}\n\n// getAllowedQueryParams merges the default set of allowed query parameters\n// with a custom set (usually comes from client options).\nfunc getAllowedQueryParams(customAllowedQP []string) map[string]struct{} {\n\tallowedQP := map[string]struct{}{\n\t\t\"api-version\": {},\n\t}\n\tfor _, qp := range customAllowedQP {\n\t\tallowedQP[strings.ToLower(qp)] = struct{}{}\n\t}\n\treturn allowedQP\n}\n\n// logPolicyOpValues is the struct containing the per-operation values\ntype logPolicyOpValues struct {\n\ttry   int32\n\tstart time.Time\n}\n\nfunc (p *logPolicy) Do(req *policy.Request) (*http.Response, error) {\n\t// Get the per-operation values. These are saved in the Message's map so that they persist across each retry calling into this policy object.\n\tvar opValues logPolicyOpValues\n\tif req.OperationValue(&opValues); opValues.start.IsZero() {\n\t\topValues.start = time.Now() // If this is the 1st try, record this operation's start time\n\t}\n\topValues.try++ // The first try is #1 (not #0)\n\treq.SetOperationValue(opValues)\n\n\t// Log the outgoing request as informational\n\tif log.Should(log.EventRequest) {\n\t\tb := &bytes.Buffer{}\n\t\tfmt.Fprintf(b, \"==> OUTGOING REQUEST (Try=%d)\\n\", opValues.try)\n\t\tp.writeRequestWithResponse(b, req, nil, nil)\n\t\tvar err error\n\t\tif p.includeBody {\n\t\t\terr = writeReqBody(req, b)\n\t\t}\n\t\tlog.Write(log.EventRequest, b.String())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\t// Set the time for this particular retry operation and then Do the operation.\n\ttryStart := time.Now()\n\tresponse, err := req.Next() // Make the request\n\ttryEnd := time.Now()\n\ttryDuration := tryEnd.Sub(tryStart)\n\topDuration := tryEnd.Sub(opValues.start)\n\n\tif log.Should(log.EventResponse) {\n\t\t// We're going to log this; build the string to log\n\t\tb := &bytes.Buffer{}\n\t\tfmt.Fprintf(b, \"==> REQUEST/RESPONSE (Try=%d/%v, OpTime=%v) -- \", opValues.try, tryDuration, opDuration)\n\t\tif err != nil { // This HTTP request did not get a response from the service\n\t\t\tfmt.Fprint(b, \"REQUEST ERROR\\n\")\n\t\t} else {\n\t\t\tfmt.Fprint(b, \"RESPONSE RECEIVED\\n\")\n\t\t}\n\n\t\tp.writeRequestWithResponse(b, req, response, err)\n\t\tif err != nil {\n\t\t\t// skip frames runtime.Callers() and runtime.StackTrace()\n\t\t\tb.WriteString(diag.StackTrace(2, 32))\n\t\t} else if p.includeBody {\n\t\t\terr = writeRespBody(response, b)\n\t\t}\n\t\tlog.Write(log.EventResponse, b.String())\n\t}\n\treturn response, err\n}\n\nconst redactedValue = \"REDACTED\"\n\n// getSanitizedURL returns a sanitized string for the provided url.URL\nfunc getSanitizedURL(u url.URL, allowedQueryParams map[string]struct{}) string {\n\t// redact applicable query params\n\tqp := u.Query()\n\tfor k := range qp {\n\t\tif _, ok := allowedQueryParams[strings.ToLower(k)]; !ok {\n\t\t\tqp.Set(k, redactedValue)\n\t\t}\n\t}\n\tu.RawQuery = qp.Encode()\n\treturn u.String()\n}\n\n// writeRequestWithResponse appends a formatted HTTP request into a Buffer. If request and/or err are\n// not nil, then these are also written into the Buffer.\nfunc (p *logPolicy) writeRequestWithResponse(b *bytes.Buffer, req *policy.Request, resp *http.Response, err error) {\n\t// Write the request into the buffer.\n\tfmt.Fprint(b, \"   \"+req.Raw().Method+\" \"+getSanitizedURL(*req.Raw().URL, p.allowedQP)+\"\\n\")\n\tp.writeHeader(b, req.Raw().Header)\n\tif resp != nil {\n\t\tfmt.Fprintln(b, \"   --------------------------------------------------------------------------------\")\n\t\tfmt.Fprint(b, \"   RESPONSE Status: \"+resp.Status+\"\\n\")\n\t\tp.writeHeader(b, resp.Header)\n\t}\n\tif err != nil {\n\t\tfmt.Fprintln(b, \"   --------------------------------------------------------------------------------\")\n\t\tfmt.Fprint(b, \"   ERROR:\\n\"+err.Error()+\"\\n\")\n\t}\n}\n\n// formatHeaders appends an HTTP request's or response's header into a Buffer.\nfunc (p *logPolicy) writeHeader(b *bytes.Buffer, header http.Header) {\n\tif len(header) == 0 {\n\t\tb.WriteString(\"   (no headers)\\n\")\n\t\treturn\n\t}\n\tkeys := make([]string, 0, len(header))\n\t// Alphabetize the headers\n\tfor k := range header {\n\t\tkeys = append(keys, k)\n\t}\n\tsort.Strings(keys)\n\tfor _, k := range keys {\n\t\t// don't use Get() as it will canonicalize k which might cause a mismatch\n\t\tvalue := header[k][0]\n\t\t// redact all header values not in the allow-list\n\t\tif _, ok := p.allowedHeaders[strings.ToLower(k)]; !ok {\n\t\t\tvalue = redactedValue\n\t\t}\n\t\tfmt.Fprintf(b, \"   %s: %+v\\n\", k, value)\n\t}\n}\n\n// returns true if the request/response body should be logged.\n// this is determined by looking at the content-type header value.\nfunc shouldLogBody(b *bytes.Buffer, contentType string) bool {\n\tcontentType = strings.ToLower(contentType)\n\tif strings.HasPrefix(contentType, \"text\") ||\n\t\tstrings.Contains(contentType, \"json\") ||\n\t\tstrings.Contains(contentType, \"xml\") {\n\t\treturn true\n\t}\n\tfmt.Fprintf(b, \"   Skip logging body for %s\\n\", contentType)\n\treturn false\n}\n\n// writes to a buffer, used for logging purposes\nfunc writeReqBody(req *policy.Request, b *bytes.Buffer) error {\n\tif req.Raw().Body == nil {\n\t\tfmt.Fprint(b, \"   Request contained no body\\n\")\n\t\treturn nil\n\t}\n\tif ct := req.Raw().Header.Get(shared.HeaderContentType); !shouldLogBody(b, ct) {\n\t\treturn nil\n\t}\n\tbody, err := io.ReadAll(req.Raw().Body)\n\tif err != nil {\n\t\tfmt.Fprintf(b, \"   Failed to read request body: %s\\n\", err.Error())\n\t\treturn err\n\t}\n\tif err := req.RewindBody(); err != nil {\n\t\treturn err\n\t}\n\tlogBody(b, body)\n\treturn nil\n}\n\n// writes to a buffer, used for logging purposes\nfunc writeRespBody(resp *http.Response, b *bytes.Buffer) error {\n\tct := resp.Header.Get(shared.HeaderContentType)\n\tif ct == \"\" {\n\t\tfmt.Fprint(b, \"   Response contained no body\\n\")\n\t\treturn nil\n\t} else if !shouldLogBody(b, ct) {\n\t\treturn nil\n\t}\n\tbody, err := Payload(resp)\n\tif err != nil {\n\t\tfmt.Fprintf(b, \"   Failed to read response body: %s\\n\", err.Error())\n\t\treturn err\n\t}\n\tif len(body) > 0 {\n\t\tlogBody(b, body)\n\t} else {\n\t\tfmt.Fprint(b, \"   Response contained no body\\n\")\n\t}\n\treturn nil\n}\n\nfunc logBody(b *bytes.Buffer, body []byte) {\n\tfmt.Fprintln(b, \"   --------------------------------------------------------------------------------\")\n\tfmt.Fprintln(b, string(body))\n\tfmt.Fprintln(b, \"   --------------------------------------------------------------------------------\")\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_request_id.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/uuid\"\n)\n\ntype requestIDPolicy struct{}\n\n// NewRequestIDPolicy returns a policy that add the x-ms-client-request-id header\nfunc NewRequestIDPolicy() policy.Policy {\n\treturn &requestIDPolicy{}\n}\n\nfunc (r *requestIDPolicy) Do(req *policy.Request) (*http.Response, error) {\n\tif req.Raw().Header.Get(shared.HeaderXMSClientRequestID) == \"\" {\n\t\tid, err := uuid.New()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treq.Raw().Header.Set(shared.HeaderXMSClientRequestID, id.String())\n\t}\n\n\treturn req.Next()\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_retry.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"io\"\n\t\"math\"\n\t\"math/rand\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/errorinfo\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/exported\"\n)\n\nconst (\n\tdefaultMaxRetries = 3\n)\n\nfunc setDefaults(o *policy.RetryOptions) {\n\tif o.MaxRetries == 0 {\n\t\to.MaxRetries = defaultMaxRetries\n\t} else if o.MaxRetries < 0 {\n\t\to.MaxRetries = 0\n\t}\n\n\t// SDK guidelines specify the default MaxRetryDelay is 60 seconds\n\tif o.MaxRetryDelay == 0 {\n\t\to.MaxRetryDelay = 60 * time.Second\n\t} else if o.MaxRetryDelay < 0 {\n\t\t// not really an unlimited cap, but sufficiently large enough to be considered as such\n\t\to.MaxRetryDelay = math.MaxInt64\n\t}\n\tif o.RetryDelay == 0 {\n\t\to.RetryDelay = 800 * time.Millisecond\n\t} else if o.RetryDelay < 0 {\n\t\to.RetryDelay = 0\n\t}\n\tif o.StatusCodes == nil {\n\t\t// NOTE: if you change this list, you MUST update the docs in policy/policy.go\n\t\to.StatusCodes = []int{\n\t\t\thttp.StatusRequestTimeout,      // 408\n\t\t\thttp.StatusTooManyRequests,     // 429\n\t\t\thttp.StatusInternalServerError, // 500\n\t\t\thttp.StatusBadGateway,          // 502\n\t\t\thttp.StatusServiceUnavailable,  // 503\n\t\t\thttp.StatusGatewayTimeout,      // 504\n\t\t}\n\t}\n}\n\nfunc calcDelay(o policy.RetryOptions, try int32) time.Duration { // try is >=1; never 0\n\t// avoid overflow when shifting left\n\tfactor := time.Duration(math.MaxInt64)\n\tif try < 63 {\n\t\tfactor = time.Duration(int64(1<<try) - 1)\n\t}\n\n\tdelay := factor * o.RetryDelay\n\tif delay < factor {\n\t\t// overflow has happened so set to max value\n\t\tdelay = time.Duration(math.MaxInt64)\n\t}\n\n\t// Introduce jitter:  [0.0, 1.0) / 2 = [0.0, 0.5) + 0.8 = [0.8, 1.3)\n\tjitterMultiplier := rand.Float64()/2 + 0.8 // NOTE: We want math/rand; not crypto/rand\n\n\tdelayFloat := float64(delay) * jitterMultiplier\n\tif delayFloat > float64(math.MaxInt64) {\n\t\t// the jitter pushed us over MaxInt64, so just use MaxInt64\n\t\tdelay = time.Duration(math.MaxInt64)\n\t} else {\n\t\tdelay = time.Duration(delayFloat)\n\t}\n\n\tif delay > o.MaxRetryDelay { // MaxRetryDelay is backfilled with non-negative value\n\t\tdelay = o.MaxRetryDelay\n\t}\n\n\treturn delay\n}\n\n// NewRetryPolicy creates a policy object configured using the specified options.\n// Pass nil to accept the default values; this is the same as passing a zero-value options.\nfunc NewRetryPolicy(o *policy.RetryOptions) policy.Policy {\n\tif o == nil {\n\t\to = &policy.RetryOptions{}\n\t}\n\tp := &retryPolicy{options: *o}\n\treturn p\n}\n\ntype retryPolicy struct {\n\toptions policy.RetryOptions\n}\n\nfunc (p *retryPolicy) Do(req *policy.Request) (resp *http.Response, err error) {\n\toptions := p.options\n\t// check if the retry options have been overridden for this call\n\tif override := req.Raw().Context().Value(shared.CtxWithRetryOptionsKey{}); override != nil {\n\t\toptions = override.(policy.RetryOptions)\n\t}\n\tsetDefaults(&options)\n\t// Exponential retry algorithm: ((2 ^ attempt) - 1) * delay * random(0.8, 1.2)\n\t// When to retry: connection failure or temporary/timeout.\n\tvar rwbody *retryableRequestBody\n\tif req.Body() != nil {\n\t\t// wrap the body so we control when it's actually closed.\n\t\t// do this outside the for loop so defers don't accumulate.\n\t\trwbody = &retryableRequestBody{body: req.Body()}\n\t\tdefer rwbody.realClose()\n\t}\n\ttry := int32(1)\n\tfor {\n\t\tresp = nil // reset\n\t\t// unfortunately we don't have access to the custom allow-list of query params, so we'll redact everything but the default allowed QPs\n\t\tlog.Writef(log.EventRetryPolicy, \"=====> Try=%d for %s %s\", try, req.Raw().Method, getSanitizedURL(*req.Raw().URL, getAllowedQueryParams(nil)))\n\n\t\t// For each try, seek to the beginning of the Body stream. We do this even for the 1st try because\n\t\t// the stream may not be at offset 0 when we first get it and we want the same behavior for the\n\t\t// 1st try as for additional tries.\n\t\terr = req.RewindBody()\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\t// RewindBody() restores Raw().Body to its original state, so set our rewindable after\n\t\tif rwbody != nil {\n\t\t\treq.Raw().Body = rwbody\n\t\t}\n\n\t\tif options.TryTimeout == 0 {\n\t\t\tclone := req.Clone(req.Raw().Context())\n\t\t\tresp, err = clone.Next()\n\t\t} else {\n\t\t\t// Set the per-try time for this particular retry operation and then Do the operation.\n\t\t\ttryCtx, tryCancel := context.WithTimeout(req.Raw().Context(), options.TryTimeout)\n\t\t\tclone := req.Clone(tryCtx)\n\t\t\tresp, err = clone.Next() // Make the request\n\t\t\t// if the body was already downloaded or there was an error it's safe to cancel the context now\n\t\t\tif err != nil {\n\t\t\t\ttryCancel()\n\t\t\t} else if exported.PayloadDownloaded(resp) {\n\t\t\t\ttryCancel()\n\t\t\t} else {\n\t\t\t\t// must cancel the context after the body has been read and closed\n\t\t\t\tresp.Body = &contextCancelReadCloser{cf: tryCancel, body: resp.Body}\n\t\t\t}\n\t\t}\n\t\tif err == nil {\n\t\t\tlog.Writef(log.EventRetryPolicy, \"response %d\", resp.StatusCode)\n\t\t} else {\n\t\t\tlog.Writef(log.EventRetryPolicy, \"error %v\", err)\n\t\t}\n\n\t\tif ctxErr := req.Raw().Context().Err(); ctxErr != nil {\n\t\t\t// don't retry if the parent context has been cancelled or its deadline exceeded\n\t\t\terr = ctxErr\n\t\t\tlog.Writef(log.EventRetryPolicy, \"abort due to %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\t// check if the error is not retriable\n\t\tvar nre errorinfo.NonRetriable\n\t\tif errors.As(err, &nre) {\n\t\t\t// the error says it's not retriable so don't retry\n\t\t\tlog.Writef(log.EventRetryPolicy, \"non-retriable error %T\", nre)\n\t\t\treturn\n\t\t}\n\n\t\tif options.ShouldRetry != nil {\n\t\t\t// a non-nil ShouldRetry overrides our HTTP status code check\n\t\t\tif !options.ShouldRetry(resp, err) {\n\t\t\t\t// predicate says we shouldn't retry\n\t\t\t\tlog.Write(log.EventRetryPolicy, \"exit due to ShouldRetry\")\n\t\t\t\treturn\n\t\t\t}\n\t\t} else if err == nil && !HasStatusCode(resp, options.StatusCodes...) {\n\t\t\t// if there is no error and the response code isn't in the list of retry codes then we're done.\n\t\t\tlog.Write(log.EventRetryPolicy, \"exit due to non-retriable status code\")\n\t\t\treturn\n\t\t}\n\n\t\tif try == options.MaxRetries+1 {\n\t\t\t// max number of tries has been reached, don't sleep again\n\t\t\tlog.Writef(log.EventRetryPolicy, \"MaxRetries %d exceeded\", options.MaxRetries)\n\t\t\treturn\n\t\t}\n\n\t\t// use the delay from retry-after if available\n\t\tdelay := shared.RetryAfter(resp)\n\t\tif delay <= 0 {\n\t\t\tdelay = calcDelay(options, try)\n\t\t} else if delay > options.MaxRetryDelay {\n\t\t\t// the retry-after delay exceeds the the cap so don't retry\n\t\t\tlog.Writef(log.EventRetryPolicy, \"Retry-After delay %s exceeds MaxRetryDelay of %s\", delay, options.MaxRetryDelay)\n\t\t\treturn\n\t\t}\n\n\t\t// drain before retrying so nothing is leaked\n\t\tDrain(resp)\n\n\t\tlog.Writef(log.EventRetryPolicy, \"End Try #%d, Delay=%v\", try, delay)\n\t\tselect {\n\t\tcase <-time.After(delay):\n\t\t\ttry++\n\t\tcase <-req.Raw().Context().Done():\n\t\t\terr = req.Raw().Context().Err()\n\t\t\tlog.Writef(log.EventRetryPolicy, \"abort due to %v\", err)\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// WithRetryOptions adds the specified RetryOptions to the parent context.\n// Use this to specify custom RetryOptions at the API-call level.\n// Deprecated: use [policy.WithRetryOptions] instead.\nfunc WithRetryOptions(parent context.Context, options policy.RetryOptions) context.Context {\n\treturn policy.WithRetryOptions(parent, options)\n}\n\n// ********** The following type/methods implement the retryableRequestBody (a ReadSeekCloser)\n\n// This struct is used when sending a body to the network\ntype retryableRequestBody struct {\n\tbody io.ReadSeeker // Seeking is required to support retries\n}\n\n// Read reads a block of data from an inner stream and reports progress\nfunc (b *retryableRequestBody) Read(p []byte) (n int, err error) {\n\treturn b.body.Read(p)\n}\n\nfunc (b *retryableRequestBody) Seek(offset int64, whence int) (offsetFromStart int64, err error) {\n\treturn b.body.Seek(offset, whence)\n}\n\nfunc (b *retryableRequestBody) Close() error {\n\t// We don't want the underlying transport to close the request body on transient failures so this is a nop.\n\t// The retry policy closes the request body upon success.\n\treturn nil\n}\n\nfunc (b *retryableRequestBody) realClose() error {\n\tif c, ok := b.body.(io.Closer); ok {\n\t\treturn c.Close()\n\t}\n\treturn nil\n}\n\n// ********** The following type/methods implement the contextCancelReadCloser\n\n// contextCancelReadCloser combines an io.ReadCloser with a cancel func.\n// it ensures the cancel func is invoked once the body has been read and closed.\ntype contextCancelReadCloser struct {\n\tcf   context.CancelFunc\n\tbody io.ReadCloser\n}\n\nfunc (rc *contextCancelReadCloser) Read(p []byte) (n int, err error) {\n\treturn rc.body.Read(p)\n}\n\nfunc (rc *contextCancelReadCloser) Close() error {\n\terr := rc.body.Close()\n\trc.cf()\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_sas_credential.go",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n)\n\n// SASCredentialPolicy authorizes requests with a [azcore.SASCredential].\ntype SASCredentialPolicy struct {\n\tcred      *exported.SASCredential\n\theader    string\n\tallowHTTP bool\n}\n\n// SASCredentialPolicyOptions contains the optional values configuring [SASCredentialPolicy].\ntype SASCredentialPolicyOptions struct {\n\t// InsecureAllowCredentialWithHTTP enables authenticated requests over HTTP.\n\t// By default, authenticated requests to an HTTP endpoint are rejected by the client.\n\t// WARNING: setting this to true will allow sending the authentication key in clear text. Use with caution.\n\tInsecureAllowCredentialWithHTTP bool\n}\n\n// NewSASCredentialPolicy creates a new instance of [SASCredentialPolicy].\n//   - cred is the [azcore.SASCredential] used to authenticate with the service\n//   - header is the name of the HTTP request header in which the shared access signature is placed\n//   - options contains optional configuration, pass nil to accept the default values\nfunc NewSASCredentialPolicy(cred *exported.SASCredential, header string, options *SASCredentialPolicyOptions) *SASCredentialPolicy {\n\tif options == nil {\n\t\toptions = &SASCredentialPolicyOptions{}\n\t}\n\treturn &SASCredentialPolicy{\n\t\tcred:      cred,\n\t\theader:    header,\n\t\tallowHTTP: options.InsecureAllowCredentialWithHTTP,\n\t}\n}\n\n// Do implementes the Do method on the [policy.Polilcy] interface.\nfunc (k *SASCredentialPolicy) Do(req *policy.Request) (*http.Response, error) {\n\t// skip adding the authorization header if no SASCredential was provided.\n\t// this prevents a panic that might be hard to diagnose and allows testing\n\t// against http endpoints that don't require authentication.\n\tif k.cred != nil {\n\t\tif err := checkHTTPSForAuth(req, k.allowHTTP); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treq.Raw().Header.Add(k.header, exported.SASCredentialGet(k.cred))\n\t}\n\treturn req.Next()\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_telemetry.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"os\"\n\t\"runtime\"\n\t\"strings\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n)\n\ntype telemetryPolicy struct {\n\ttelemetryValue string\n}\n\n// NewTelemetryPolicy creates a telemetry policy object that adds telemetry information to outgoing HTTP requests.\n// The format is [<application_id> ]azsdk-go-<mod>/<ver> <platform_info>.\n// Pass nil to accept the default values; this is the same as passing a zero-value options.\nfunc NewTelemetryPolicy(mod, ver string, o *policy.TelemetryOptions) policy.Policy {\n\tif o == nil {\n\t\to = &policy.TelemetryOptions{}\n\t}\n\ttp := telemetryPolicy{}\n\tif o.Disabled {\n\t\treturn &tp\n\t}\n\tb := &bytes.Buffer{}\n\t// normalize ApplicationID\n\tif o.ApplicationID != \"\" {\n\t\to.ApplicationID = strings.ReplaceAll(o.ApplicationID, \" \", \"/\")\n\t\tif len(o.ApplicationID) > 24 {\n\t\t\to.ApplicationID = o.ApplicationID[:24]\n\t\t}\n\t\tb.WriteString(o.ApplicationID)\n\t\tb.WriteRune(' ')\n\t}\n\t// mod might be the fully qualified name. in that case, we just want the package name\n\tif i := strings.LastIndex(mod, \"/\"); i > -1 {\n\t\tmod = mod[i+1:]\n\t}\n\tb.WriteString(formatTelemetry(mod, ver))\n\tb.WriteRune(' ')\n\tb.WriteString(platformInfo)\n\ttp.telemetryValue = b.String()\n\treturn &tp\n}\n\nfunc formatTelemetry(comp, ver string) string {\n\treturn fmt.Sprintf(\"azsdk-go-%s/%s\", comp, ver)\n}\n\nfunc (p telemetryPolicy) Do(req *policy.Request) (*http.Response, error) {\n\tif p.telemetryValue == \"\" {\n\t\treturn req.Next()\n\t}\n\t// preserve the existing User-Agent string\n\tif ua := req.Raw().Header.Get(shared.HeaderUserAgent); ua != \"\" {\n\t\tp.telemetryValue = fmt.Sprintf(\"%s %s\", p.telemetryValue, ua)\n\t}\n\treq.Raw().Header.Set(shared.HeaderUserAgent, p.telemetryValue)\n\treturn req.Next()\n}\n\n// NOTE: the ONLY function that should write to this variable is this func\nvar platformInfo = func() string {\n\toperatingSystem := runtime.GOOS // Default OS string\n\tswitch operatingSystem {\n\tcase \"windows\":\n\t\toperatingSystem = os.Getenv(\"OS\") // Get more specific OS information\n\tcase \"linux\": // accept default OS info\n\tcase \"freebsd\": //  accept default OS info\n\t}\n\treturn fmt.Sprintf(\"(%s; %s)\", runtime.Version(), operatingSystem)\n}()\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/poller.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"flag\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"reflect\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/async\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/body\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/fake\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/loc\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/op\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/poller\"\n)\n\n// FinalStateVia is the enumerated type for the possible final-state-via values.\ntype FinalStateVia = pollers.FinalStateVia\n\nconst (\n\t// FinalStateViaAzureAsyncOp indicates the final payload comes from the Azure-AsyncOperation URL.\n\tFinalStateViaAzureAsyncOp = pollers.FinalStateViaAzureAsyncOp\n\n\t// FinalStateViaLocation indicates the final payload comes from the Location URL.\n\tFinalStateViaLocation = pollers.FinalStateViaLocation\n\n\t// FinalStateViaOriginalURI indicates the final payload comes from the original URL.\n\tFinalStateViaOriginalURI = pollers.FinalStateViaOriginalURI\n\n\t// FinalStateViaOpLocation indicates the final payload comes from the Operation-Location URL.\n\tFinalStateViaOpLocation = pollers.FinalStateViaOpLocation\n)\n\n// NewPollerOptions contains the optional parameters for NewPoller.\ntype NewPollerOptions[T any] struct {\n\t// FinalStateVia contains the final-state-via value for the LRO.\n\t// NOTE: used only for Azure-AsyncOperation and Operation-Location LROs.\n\tFinalStateVia FinalStateVia\n\n\t// OperationLocationResultPath contains the JSON path to the result's\n\t// payload when it's included with the terminal success response.\n\t// NOTE: only used for Operation-Location LROs.\n\tOperationLocationResultPath string\n\n\t// Response contains a preconstructed response type.\n\t// The final payload will be unmarshaled into it and returned.\n\tResponse *T\n\n\t// Handler[T] contains a custom polling implementation.\n\tHandler PollingHandler[T]\n\n\t// Tracer contains the Tracer from the client that's creating the Poller.\n\tTracer tracing.Tracer\n}\n\n// NewPoller creates a Poller based on the provided initial response.\nfunc NewPoller[T any](resp *http.Response, pl exported.Pipeline, options *NewPollerOptions[T]) (*Poller[T], error) {\n\tif options == nil {\n\t\toptions = &NewPollerOptions[T]{}\n\t}\n\tresult := options.Response\n\tif result == nil {\n\t\tresult = new(T)\n\t}\n\tif options.Handler != nil {\n\t\treturn &Poller[T]{\n\t\t\top:     options.Handler,\n\t\t\tresp:   resp,\n\t\t\tresult: result,\n\t\t\ttracer: options.Tracer,\n\t\t}, nil\n\t}\n\n\tdefer resp.Body.Close()\n\t// this is a back-stop in case the swagger is incorrect (i.e. missing one or more status codes for success).\n\t// ideally the codegen should return an error if the initial response failed and not even create a poller.\n\tif !poller.StatusCodeValid(resp) {\n\t\treturn nil, errors.New(\"the operation failed or was cancelled\")\n\t}\n\n\t// determine the polling method\n\tvar opr PollingHandler[T]\n\tvar err error\n\tif fake.Applicable(resp) {\n\t\topr, err = fake.New[T](pl, resp)\n\t} else if async.Applicable(resp) {\n\t\t// async poller must be checked first as it can also have a location header\n\t\topr, err = async.New[T](pl, resp, options.FinalStateVia)\n\t} else if op.Applicable(resp) {\n\t\t// op poller must be checked before loc as it can also have a location header\n\t\topr, err = op.New[T](pl, resp, options.FinalStateVia, options.OperationLocationResultPath)\n\t} else if loc.Applicable(resp) {\n\t\topr, err = loc.New[T](pl, resp)\n\t} else if body.Applicable(resp) {\n\t\t// must test body poller last as it's a subset of the other pollers.\n\t\t// TODO: this is ambiguous for PATCH/PUT if it returns a 200 with no polling headers (sync completion)\n\t\topr, err = body.New[T](pl, resp)\n\t} else if m := resp.Request.Method; resp.StatusCode == http.StatusAccepted && (m == http.MethodDelete || m == http.MethodPost) {\n\t\t// if we get here it means we have a 202 with no polling headers.\n\t\t// for DELETE and POST this is a hard error per ARM RPC spec.\n\t\treturn nil, errors.New(\"response is missing polling URL\")\n\t} else {\n\t\topr, err = pollers.NewNopPoller[T](resp)\n\t}\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &Poller[T]{\n\t\top:     opr,\n\t\tresp:   resp,\n\t\tresult: result,\n\t\ttracer: options.Tracer,\n\t}, nil\n}\n\n// NewPollerFromResumeTokenOptions contains the optional parameters for NewPollerFromResumeToken.\ntype NewPollerFromResumeTokenOptions[T any] struct {\n\t// Response contains a preconstructed response type.\n\t// The final payload will be unmarshaled into it and returned.\n\tResponse *T\n\n\t// Handler[T] contains a custom polling implementation.\n\tHandler PollingHandler[T]\n\n\t// Tracer contains the Tracer from the client that's creating the Poller.\n\tTracer tracing.Tracer\n}\n\n// NewPollerFromResumeToken creates a Poller from a resume token string.\nfunc NewPollerFromResumeToken[T any](token string, pl exported.Pipeline, options *NewPollerFromResumeTokenOptions[T]) (*Poller[T], error) {\n\tif options == nil {\n\t\toptions = &NewPollerFromResumeTokenOptions[T]{}\n\t}\n\tresult := options.Response\n\tif result == nil {\n\t\tresult = new(T)\n\t}\n\n\tif err := pollers.IsTokenValid[T](token); err != nil {\n\t\treturn nil, err\n\t}\n\traw, err := pollers.ExtractToken(token)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar asJSON map[string]any\n\tif err := json.Unmarshal(raw, &asJSON); err != nil {\n\t\treturn nil, err\n\t}\n\n\topr := options.Handler\n\t// now rehydrate the poller based on the encoded poller type\n\tif fake.CanResume(asJSON) {\n\t\topr, _ = fake.New[T](pl, nil)\n\t} else if opr != nil {\n\t\tlog.Writef(log.EventLRO, \"Resuming custom poller %T.\", opr)\n\t} else if async.CanResume(asJSON) {\n\t\topr, _ = async.New[T](pl, nil, \"\")\n\t} else if body.CanResume(asJSON) {\n\t\topr, _ = body.New[T](pl, nil)\n\t} else if loc.CanResume(asJSON) {\n\t\topr, _ = loc.New[T](pl, nil)\n\t} else if op.CanResume(asJSON) {\n\t\topr, _ = op.New[T](pl, nil, \"\", \"\")\n\t} else {\n\t\treturn nil, fmt.Errorf(\"unhandled poller token %s\", string(raw))\n\t}\n\tif err := json.Unmarshal(raw, &opr); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &Poller[T]{\n\t\top:     opr,\n\t\tresult: result,\n\t\ttracer: options.Tracer,\n\t}, nil\n}\n\n// PollingHandler[T] abstracts the differences among poller implementations.\ntype PollingHandler[T any] interface {\n\t// Done returns true if the LRO has reached a terminal state.\n\tDone() bool\n\n\t// Poll fetches the latest state of the LRO.\n\tPoll(context.Context) (*http.Response, error)\n\n\t// Result is called once the LRO has reached a terminal state. It populates the out parameter\n\t// with the result of the operation.\n\tResult(ctx context.Context, out *T) error\n}\n\n// Poller encapsulates a long-running operation, providing polling facilities until the operation reaches a terminal state.\n// Methods on this type are not safe for concurrent use.\ntype Poller[T any] struct {\n\top     PollingHandler[T]\n\tresp   *http.Response\n\terr    error\n\tresult *T\n\ttracer tracing.Tracer\n\tdone   bool\n}\n\n// PollUntilDoneOptions contains the optional values for the Poller[T].PollUntilDone() method.\ntype PollUntilDoneOptions struct {\n\t// Frequency is the time to wait between polling intervals in absence of a Retry-After header. Allowed minimum is one second.\n\t// Pass zero to accept the default value (30s).\n\tFrequency time.Duration\n}\n\n// PollUntilDone will poll the service endpoint until a terminal state is reached, an error is received, or the context expires.\n// It internally uses Poll(), Done(), and Result() in its polling loop, sleeping for the specified duration between intervals.\n// options: pass nil to accept the default values.\n// NOTE: the default polling frequency is 30 seconds which works well for most operations.  However, some operations might\n// benefit from a shorter or longer duration.\nfunc (p *Poller[T]) PollUntilDone(ctx context.Context, options *PollUntilDoneOptions) (res T, err error) {\n\tif options == nil {\n\t\toptions = &PollUntilDoneOptions{}\n\t}\n\tcp := *options\n\tif cp.Frequency == 0 {\n\t\tcp.Frequency = 30 * time.Second\n\t}\n\n\tctx, endSpan := StartSpan(ctx, fmt.Sprintf(\"%s.PollUntilDone\", shortenTypeName(reflect.TypeOf(*p).Name())), p.tracer, nil)\n\tdefer func() { endSpan(err) }()\n\n\t// skip the floor check when executing tests so they don't take so long\n\tif isTest := flag.Lookup(\"test.v\"); isTest == nil && cp.Frequency < time.Second {\n\t\terr = errors.New(\"polling frequency minimum is one second\")\n\t\treturn\n\t}\n\n\tstart := time.Now()\n\tlogPollUntilDoneExit := func(v any) {\n\t\tlog.Writef(log.EventLRO, \"END PollUntilDone() for %T: %v, total time: %s\", p.op, v, time.Since(start))\n\t}\n\tlog.Writef(log.EventLRO, \"BEGIN PollUntilDone() for %T\", p.op)\n\tif p.resp != nil {\n\t\t// initial check for a retry-after header existing on the initial response\n\t\tif retryAfter := shared.RetryAfter(p.resp); retryAfter > 0 {\n\t\t\tlog.Writef(log.EventLRO, \"initial Retry-After delay for %s\", retryAfter.String())\n\t\t\tif err = shared.Delay(ctx, retryAfter); err != nil {\n\t\t\t\tlogPollUntilDoneExit(err)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\t// begin polling the endpoint until a terminal state is reached\n\tfor {\n\t\tvar resp *http.Response\n\t\tresp, err = p.Poll(ctx)\n\t\tif err != nil {\n\t\t\tlogPollUntilDoneExit(err)\n\t\t\treturn\n\t\t}\n\t\tif p.Done() {\n\t\t\tlogPollUntilDoneExit(\"succeeded\")\n\t\t\tres, err = p.Result(ctx)\n\t\t\treturn\n\t\t}\n\t\td := cp.Frequency\n\t\tif retryAfter := shared.RetryAfter(resp); retryAfter > 0 {\n\t\t\tlog.Writef(log.EventLRO, \"Retry-After delay for %s\", retryAfter.String())\n\t\t\td = retryAfter\n\t\t} else {\n\t\t\tlog.Writef(log.EventLRO, \"delay for %s\", d.String())\n\t\t}\n\t\tif err = shared.Delay(ctx, d); err != nil {\n\t\t\tlogPollUntilDoneExit(err)\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// Poll fetches the latest state of the LRO.  It returns an HTTP response or error.\n// If Poll succeeds, the poller's state is updated and the HTTP response is returned.\n// If Poll fails, the poller's state is unmodified and the error is returned.\n// Calling Poll on an LRO that has reached a terminal state will return the last HTTP response.\nfunc (p *Poller[T]) Poll(ctx context.Context) (resp *http.Response, err error) {\n\tif p.Done() {\n\t\t// the LRO has reached a terminal state, don't poll again\n\t\tresp = p.resp\n\t\treturn\n\t}\n\n\tctx, endSpan := StartSpan(ctx, fmt.Sprintf(\"%s.Poll\", shortenTypeName(reflect.TypeOf(*p).Name())), p.tracer, nil)\n\tdefer func() { endSpan(err) }()\n\n\tresp, err = p.op.Poll(ctx)\n\tif err != nil {\n\t\treturn\n\t}\n\tp.resp = resp\n\treturn\n}\n\n// Done returns true if the LRO has reached a terminal state.\n// Once a terminal state is reached, call Result().\nfunc (p *Poller[T]) Done() bool {\n\treturn p.op.Done()\n}\n\n// Result returns the result of the LRO and is meant to be used in conjunction with Poll and Done.\n// If the LRO completed successfully, a populated instance of T is returned.\n// If the LRO failed or was canceled, an *azcore.ResponseError error is returned.\n// Calling this on an LRO in a non-terminal state will return an error.\nfunc (p *Poller[T]) Result(ctx context.Context) (res T, err error) {\n\tif !p.Done() {\n\t\terr = errors.New(\"poller is in a non-terminal state\")\n\t\treturn\n\t}\n\tif p.done {\n\t\t// the result has already been retrieved, return the cached value\n\t\tif p.err != nil {\n\t\t\terr = p.err\n\t\t\treturn\n\t\t}\n\t\tres = *p.result\n\t\treturn\n\t}\n\n\tctx, endSpan := StartSpan(ctx, fmt.Sprintf(\"%s.Result\", shortenTypeName(reflect.TypeOf(*p).Name())), p.tracer, nil)\n\tdefer func() { endSpan(err) }()\n\n\terr = p.op.Result(ctx, p.result)\n\tvar respErr *exported.ResponseError\n\tif errors.As(err, &respErr) {\n\t\tif pollers.IsNonTerminalHTTPStatusCode(respErr.RawResponse) {\n\t\t\t// the request failed in a non-terminal way.\n\t\t\t// don't cache the error or mark the Poller as done\n\t\t\treturn\n\t\t}\n\t\t// the LRO failed. record the error\n\t\tp.err = err\n\t} else if err != nil {\n\t\t// the call to Result failed, don't cache anything in this case\n\t\treturn\n\t}\n\tp.done = true\n\tif p.err != nil {\n\t\terr = p.err\n\t\treturn\n\t}\n\tres = *p.result\n\treturn\n}\n\n// ResumeToken returns a value representing the poller that can be used to resume\n// the LRO at a later time. ResumeTokens are unique per service operation.\n// The token's format should be considered opaque and is subject to change.\n// Calling this on an LRO in a terminal state will return an error.\nfunc (p *Poller[T]) ResumeToken() (string, error) {\n\tif p.Done() {\n\t\treturn \"\", errors.New(\"poller is in a terminal state\")\n\t}\n\ttk, err := pollers.NewResumeToken[T](p.op)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn tk, err\n}\n\n// extracts the type name from the string returned from reflect.Value.Name()\nfunc shortenTypeName(s string) string {\n\t// the value is formatted as follows\n\t// Poller[module/Package.Type].Method\n\t// we want to shorten the generic type parameter string to Type\n\t// anything we don't recognize will be left as-is\n\tbegin := strings.Index(s, \"[\")\n\tend := strings.Index(s, \"]\")\n\tif begin == -1 || end == -1 {\n\t\treturn s\n\t}\n\n\ttypeName := s[begin+1 : end]\n\tif i := strings.LastIndex(typeName, \".\"); i > -1 {\n\t\ttypeName = typeName[i+1:]\n\t}\n\treturn s[:begin+1] + typeName + s[end:]\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/request.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"encoding/xml\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"mime/multipart\"\n\t\"net/http\"\n\t\"net/textproto\"\n\t\"net/url\"\n\t\"path\"\n\t\"strings\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/uuid\"\n)\n\n// Base64Encoding is usesd to specify which base-64 encoder/decoder to use when\n// encoding/decoding a slice of bytes to/from a string.\ntype Base64Encoding = exported.Base64Encoding\n\nconst (\n\t// Base64StdFormat uses base64.StdEncoding for encoding and decoding payloads.\n\tBase64StdFormat Base64Encoding = exported.Base64StdFormat\n\n\t// Base64URLFormat uses base64.RawURLEncoding for encoding and decoding payloads.\n\tBase64URLFormat Base64Encoding = exported.Base64URLFormat\n)\n\n// NewRequest creates a new policy.Request with the specified input.\n// The endpoint MUST be properly encoded before calling this function.\nfunc NewRequest(ctx context.Context, httpMethod string, endpoint string) (*policy.Request, error) {\n\treturn exported.NewRequest(ctx, httpMethod, endpoint)\n}\n\n// NewRequestFromRequest creates a new policy.Request with an existing *http.Request\nfunc NewRequestFromRequest(req *http.Request) (*policy.Request, error) {\n\treturn exported.NewRequestFromRequest(req)\n}\n\n// EncodeQueryParams will parse and encode any query parameters in the specified URL.\n// Any semicolons will automatically be escaped.\nfunc EncodeQueryParams(u string) (string, error) {\n\tbefore, after, found := strings.Cut(u, \"?\")\n\tif !found {\n\t\treturn u, nil\n\t}\n\t// starting in Go 1.17, url.ParseQuery will reject semicolons in query params.\n\t// so, we must escape them first. note that this assumes that semicolons aren't\n\t// being used as query param separators which is per the current RFC.\n\t// for more info:\n\t// https://github.com/golang/go/issues/25192\n\t// https://github.com/golang/go/issues/50034\n\tqp, err := url.ParseQuery(strings.ReplaceAll(after, \";\", \"%3B\"))\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn before + \"?\" + qp.Encode(), nil\n}\n\n// JoinPaths concatenates multiple URL path segments into one path,\n// inserting path separation characters as required. JoinPaths will preserve\n// query parameters in the root path\nfunc JoinPaths(root string, paths ...string) string {\n\tif len(paths) == 0 {\n\t\treturn root\n\t}\n\n\tqps := \"\"\n\tif strings.Contains(root, \"?\") {\n\t\tsplitPath := strings.Split(root, \"?\")\n\t\troot, qps = splitPath[0], splitPath[1]\n\t}\n\n\tp := path.Join(paths...)\n\t// path.Join will remove any trailing slashes.\n\t// if one was provided, preserve it.\n\tif strings.HasSuffix(paths[len(paths)-1], \"/\") && !strings.HasSuffix(p, \"/\") {\n\t\tp += \"/\"\n\t}\n\n\tif qps != \"\" {\n\t\tp = p + \"?\" + qps\n\t}\n\n\tif strings.HasSuffix(root, \"/\") && strings.HasPrefix(p, \"/\") {\n\t\troot = root[:len(root)-1]\n\t} else if !strings.HasSuffix(root, \"/\") && !strings.HasPrefix(p, \"/\") {\n\t\tp = \"/\" + p\n\t}\n\treturn root + p\n}\n\n// EncodeByteArray will base-64 encode the byte slice v.\nfunc EncodeByteArray(v []byte, format Base64Encoding) string {\n\treturn exported.EncodeByteArray(v, format)\n}\n\n// MarshalAsByteArray will base-64 encode the byte slice v, then calls SetBody.\n// The encoded value is treated as a JSON string.\nfunc MarshalAsByteArray(req *policy.Request, v []byte, format Base64Encoding) error {\n\t// send as a JSON string\n\tencode := fmt.Sprintf(\"\\\"%s\\\"\", EncodeByteArray(v, format))\n\t// tsp generated code can set Content-Type so we must prefer that\n\treturn exported.SetBody(req, exported.NopCloser(strings.NewReader(encode)), shared.ContentTypeAppJSON, false)\n}\n\n// MarshalAsJSON calls json.Marshal() to get the JSON encoding of v then calls SetBody.\nfunc MarshalAsJSON(req *policy.Request, v any) error {\n\tb, err := json.Marshal(v)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error marshalling type %T: %s\", v, err)\n\t}\n\t// tsp generated code can set Content-Type so we must prefer that\n\treturn exported.SetBody(req, exported.NopCloser(bytes.NewReader(b)), shared.ContentTypeAppJSON, false)\n}\n\n// MarshalAsXML calls xml.Marshal() to get the XML encoding of v then calls SetBody.\nfunc MarshalAsXML(req *policy.Request, v any) error {\n\tb, err := xml.Marshal(v)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error marshalling type %T: %s\", v, err)\n\t}\n\t// inclue the XML header as some services require it\n\tb = []byte(xml.Header + string(b))\n\treturn req.SetBody(exported.NopCloser(bytes.NewReader(b)), shared.ContentTypeAppXML)\n}\n\n// SetMultipartFormData writes the specified keys/values as multi-part form fields with the specified value.\n// File content must be specified as an [io.ReadSeekCloser] or [streaming.MultipartContent].\n// Byte slices will be treated as JSON. All other values are treated as string values.\nfunc SetMultipartFormData(req *policy.Request, formData map[string]any) error {\n\tbody := bytes.Buffer{}\n\twriter := multipart.NewWriter(&body)\n\n\twriteContent := func(fieldname, filename string, src io.Reader) error {\n\t\tfd, err := writer.CreateFormFile(fieldname, filename)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// copy the data to the form file\n\t\tif _, err = io.Copy(fd, src); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t}\n\n\tquoteEscaper := strings.NewReplacer(\"\\\\\", \"\\\\\\\\\", `\"`, \"\\\\\\\"\")\n\n\twriteMultipartContent := func(fieldname string, mpc streaming.MultipartContent) error {\n\t\tif mpc.Body == nil {\n\t\t\treturn errors.New(\"streaming.MultipartContent.Body cannot be nil\")\n\t\t}\n\n\t\t// use fieldname for the file name when unspecified\n\t\tfilename := fieldname\n\n\t\tif mpc.ContentType == \"\" && mpc.Filename == \"\" {\n\t\t\treturn writeContent(fieldname, filename, mpc.Body)\n\t\t}\n\t\tif mpc.Filename != \"\" {\n\t\t\tfilename = mpc.Filename\n\t\t}\n\t\t// this is pretty much copied from multipart.Writer.CreateFormFile\n\t\t// but lets us set the caller provided Content-Type and filename\n\t\th := make(textproto.MIMEHeader)\n\t\th.Set(\"Content-Disposition\",\n\t\t\tfmt.Sprintf(`form-data; name=\"%s\"; filename=\"%s\"`,\n\t\t\t\tquoteEscaper.Replace(fieldname), quoteEscaper.Replace(filename)))\n\t\tcontentType := \"application/octet-stream\"\n\t\tif mpc.ContentType != \"\" {\n\t\t\tcontentType = mpc.ContentType\n\t\t}\n\t\th.Set(\"Content-Type\", contentType)\n\t\tfd, err := writer.CreatePart(h)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// copy the data to the form file\n\t\tif _, err = io.Copy(fd, mpc.Body); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t}\n\n\t// the same as multipart.Writer.WriteField but lets us specify the Content-Type\n\twriteField := func(fieldname, contentType string, value string) error {\n\t\th := make(textproto.MIMEHeader)\n\t\th.Set(\"Content-Disposition\",\n\t\t\tfmt.Sprintf(`form-data; name=\"%s\"`, quoteEscaper.Replace(fieldname)))\n\t\th.Set(\"Content-Type\", contentType)\n\t\tfd, err := writer.CreatePart(h)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif _, err = fd.Write([]byte(value)); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t}\n\n\tfor k, v := range formData {\n\t\tif rsc, ok := v.(io.ReadSeekCloser); ok {\n\t\t\tif err := writeContent(k, k, rsc); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcontinue\n\t\t} else if rscs, ok := v.([]io.ReadSeekCloser); ok {\n\t\t\tfor _, rsc := range rscs {\n\t\t\t\tif err := writeContent(k, k, rsc); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t} else if mpc, ok := v.(streaming.MultipartContent); ok {\n\t\t\tif err := writeMultipartContent(k, mpc); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcontinue\n\t\t} else if mpcs, ok := v.([]streaming.MultipartContent); ok {\n\t\t\tfor _, mpc := range mpcs {\n\t\t\t\tif err := writeMultipartContent(k, mpc); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tvar content string\n\t\tcontentType := shared.ContentTypeTextPlain\n\t\tswitch tt := v.(type) {\n\t\tcase []byte:\n\t\t\t// JSON, don't quote it\n\t\t\tcontent = string(tt)\n\t\t\tcontentType = shared.ContentTypeAppJSON\n\t\tcase string:\n\t\t\tcontent = tt\n\t\tdefault:\n\t\t\t// ensure the value is in string format\n\t\t\tcontent = fmt.Sprintf(\"%v\", v)\n\t\t}\n\n\t\tif err := writeField(k, contentType, content); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := writer.Close(); err != nil {\n\t\treturn err\n\t}\n\treturn req.SetBody(exported.NopCloser(bytes.NewReader(body.Bytes())), writer.FormDataContentType())\n}\n\n// SkipBodyDownload will disable automatic downloading of the response body.\nfunc SkipBodyDownload(req *policy.Request) {\n\treq.SetOperationValue(bodyDownloadPolicyOpValues{Skip: true})\n}\n\n// CtxAPINameKey is used as a context key for adding/retrieving the API name.\ntype CtxAPINameKey = shared.CtxAPINameKey\n\n// NewUUID returns a new UUID using the RFC4122 algorithm.\nfunc NewUUID() (string, error) {\n\tu, err := uuid.New()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn u.String(), nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/response.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\n\tazexported \"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/exported\"\n)\n\n// Payload reads and returns the response body or an error.\n// On a successful read, the response body is cached.\n// Subsequent reads will access the cached value.\nfunc Payload(resp *http.Response) ([]byte, error) {\n\treturn exported.Payload(resp, nil)\n}\n\n// HasStatusCode returns true if the Response's status code is one of the specified values.\nfunc HasStatusCode(resp *http.Response, statusCodes ...int) bool {\n\treturn exported.HasStatusCode(resp, statusCodes...)\n}\n\n// UnmarshalAsByteArray will base-64 decode the received payload and place the result into the value pointed to by v.\nfunc UnmarshalAsByteArray(resp *http.Response, v *[]byte, format Base64Encoding) error {\n\tp, err := Payload(resp)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn DecodeByteArray(string(p), v, format)\n}\n\n// UnmarshalAsJSON calls json.Unmarshal() to unmarshal the received payload into the value pointed to by v.\nfunc UnmarshalAsJSON(resp *http.Response, v any) error {\n\tpayload, err := Payload(resp)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// TODO: verify early exit is correct\n\tif len(payload) == 0 {\n\t\treturn nil\n\t}\n\terr = removeBOM(resp)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = json.Unmarshal(payload, v)\n\tif err != nil {\n\t\terr = fmt.Errorf(\"unmarshalling type %T: %s\", v, err)\n\t}\n\treturn err\n}\n\n// UnmarshalAsXML calls xml.Unmarshal() to unmarshal the received payload into the value pointed to by v.\nfunc UnmarshalAsXML(resp *http.Response, v any) error {\n\tpayload, err := Payload(resp)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// TODO: verify early exit is correct\n\tif len(payload) == 0 {\n\t\treturn nil\n\t}\n\terr = removeBOM(resp)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = xml.Unmarshal(payload, v)\n\tif err != nil {\n\t\terr = fmt.Errorf(\"unmarshalling type %T: %s\", v, err)\n\t}\n\treturn err\n}\n\n// Drain reads the response body to completion then closes it.  The bytes read are discarded.\nfunc Drain(resp *http.Response) {\n\tif resp != nil && resp.Body != nil {\n\t\t_, _ = io.Copy(io.Discard, resp.Body)\n\t\tresp.Body.Close()\n\t}\n}\n\n// removeBOM removes any byte-order mark prefix from the payload if present.\nfunc removeBOM(resp *http.Response) error {\n\t_, err := exported.Payload(resp, &exported.PayloadOptions{\n\t\tBytesModifier: func(b []byte) []byte {\n\t\t\t// UTF8\n\t\t\treturn bytes.TrimPrefix(b, []byte(\"\\xef\\xbb\\xbf\"))\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// DecodeByteArray will base-64 decode the provided string into v.\nfunc DecodeByteArray(s string, v *[]byte, format Base64Encoding) error {\n\treturn azexported.DecodeByteArray(s, v, format)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/transport_default_dialer_other.go",
    "content": "//go:build !wasm\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"context\"\n\t\"net\"\n)\n\nfunc defaultTransportDialContext(dialer *net.Dialer) func(context.Context, string, string) (net.Conn, error) {\n\treturn dialer.DialContext\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/transport_default_dialer_wasm.go",
    "content": "//go:build (js && wasm) || wasip1\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"context\"\n\t\"net\"\n)\n\nfunc defaultTransportDialContext(dialer *net.Dialer) func(context.Context, string, string) (net.Conn, error) {\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/transport_default_http_client.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage runtime\n\nimport (\n\t\"crypto/tls\"\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"golang.org/x/net/http2\"\n)\n\nvar defaultHTTPClient *http.Client\n\nfunc init() {\n\tdefaultTransport := &http.Transport{\n\t\tProxy: http.ProxyFromEnvironment,\n\t\tDialContext: defaultTransportDialContext(&net.Dialer{\n\t\t\tTimeout:   30 * time.Second,\n\t\t\tKeepAlive: 30 * time.Second,\n\t\t}),\n\t\tForceAttemptHTTP2:     true,\n\t\tMaxIdleConns:          100,\n\t\tMaxIdleConnsPerHost:   10,\n\t\tIdleConnTimeout:       90 * time.Second,\n\t\tTLSHandshakeTimeout:   10 * time.Second,\n\t\tExpectContinueTimeout: 1 * time.Second,\n\t\tTLSClientConfig: &tls.Config{\n\t\t\tMinVersion:    tls.VersionTLS12,\n\t\t\tRenegotiation: tls.RenegotiateFreelyAsClient,\n\t\t},\n\t}\n\t// TODO: evaluate removing this once https://github.com/golang/go/issues/59690 has been fixed\n\tif http2Transport, err := http2.ConfigureTransports(defaultTransport); err == nil {\n\t\t// if the connection has been idle for 10 seconds, send a ping frame for a health check\n\t\thttp2Transport.ReadIdleTimeout = 10 * time.Second\n\t\t// if there's no response to the ping within the timeout, the connection will be closed\n\t\thttp2Transport.PingTimeout = 5 * time.Second\n\t}\n\tdefaultHTTPClient = &http.Client{\n\t\tTransport: defaultTransport,\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming/doc.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright 2017 Microsoft Corporation. All rights reserved.\n// Use of this source code is governed by an MIT\n// license that can be found in the LICENSE file.\n\n// Package streaming contains helpers for streaming IO operations and progress reporting.\npackage streaming\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming/progress.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage streaming\n\nimport (\n\t\"io\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported\"\n)\n\ntype progress struct {\n\trc     io.ReadCloser\n\trsc    io.ReadSeekCloser\n\tpr     func(bytesTransferred int64)\n\toffset int64\n}\n\n// NopCloser returns a ReadSeekCloser with a no-op close method wrapping the provided io.ReadSeeker.\n// In addition to adding a Close method to an io.ReadSeeker, this can also be used to wrap an\n// io.ReadSeekCloser with a no-op Close method to allow explicit control of when the io.ReedSeekCloser\n// has its underlying stream closed.\nfunc NopCloser(rs io.ReadSeeker) io.ReadSeekCloser {\n\treturn exported.NopCloser(rs)\n}\n\n// NewRequestProgress adds progress reporting to an HTTP request's body stream.\nfunc NewRequestProgress(body io.ReadSeekCloser, pr func(bytesTransferred int64)) io.ReadSeekCloser {\n\treturn &progress{\n\t\trc:     body,\n\t\trsc:    body,\n\t\tpr:     pr,\n\t\toffset: 0,\n\t}\n}\n\n// NewResponseProgress adds progress reporting to an HTTP response's body stream.\nfunc NewResponseProgress(body io.ReadCloser, pr func(bytesTransferred int64)) io.ReadCloser {\n\treturn &progress{\n\t\trc:     body,\n\t\trsc:    nil,\n\t\tpr:     pr,\n\t\toffset: 0,\n\t}\n}\n\n// Read reads a block of data from an inner stream and reports progress\nfunc (p *progress) Read(b []byte) (n int, err error) {\n\tn, err = p.rc.Read(b)\n\tif err != nil && err != io.EOF {\n\t\treturn\n\t}\n\tp.offset += int64(n)\n\t// Invokes the user's callback method to report progress\n\tp.pr(p.offset)\n\treturn\n}\n\n// Seek only expects a zero or from beginning.\nfunc (p *progress) Seek(offset int64, whence int) (int64, error) {\n\t// This should only ever be called with offset = 0 and whence = io.SeekStart\n\tn, err := p.rsc.Seek(offset, whence)\n\tif err == nil {\n\t\tp.offset = int64(n)\n\t}\n\treturn n, err\n}\n\n// requestBodyProgress supports Close but the underlying stream may not; if it does, Close will close it.\nfunc (p *progress) Close() error {\n\treturn p.rc.Close()\n}\n\n// MultipartContent contains streaming content used in multipart/form payloads.\ntype MultipartContent struct {\n\t// Body contains the required content body.\n\tBody io.ReadSeekCloser\n\n\t// ContentType optionally specifies the HTTP Content-Type for this Body.\n\t// The default value is application/octet-stream.\n\tContentType string\n\n\t// Filename optionally specifies the filename for this Body.\n\t// The default value is the field name for the multipart/form section.\n\tFilename string\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/to/doc.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright 2017 Microsoft Corporation. All rights reserved.\n// Use of this source code is governed by an MIT\n// license that can be found in the LICENSE file.\n\n// Package to contains various type-conversion helper functions.\npackage to\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/to/to.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage to\n\n// Ptr returns a pointer to the provided value.\nfunc Ptr[T any](v T) *T {\n\treturn &v\n}\n\n// SliceOfPtrs returns a slice of *T from the specified values.\nfunc SliceOfPtrs[T any](vv ...T) []*T {\n\tslc := make([]*T, len(vv))\n\tfor i := range vv {\n\t\tslc[i] = Ptr(vv[i])\n\t}\n\treturn slc\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing/constants.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage tracing\n\n// SpanKind represents the role of a Span inside a Trace. Often, this defines how a Span will be processed and visualized by various backends.\ntype SpanKind int\n\nconst (\n\t// SpanKindInternal indicates the span represents an internal operation within an application.\n\tSpanKindInternal SpanKind = 1\n\n\t// SpanKindServer indicates the span covers server-side handling of a request.\n\tSpanKindServer SpanKind = 2\n\n\t// SpanKindClient indicates the span describes a request to a remote service.\n\tSpanKindClient SpanKind = 3\n\n\t// SpanKindProducer indicates the span was created by a messaging producer.\n\tSpanKindProducer SpanKind = 4\n\n\t// SpanKindConsumer indicates the span was created by a messaging consumer.\n\tSpanKindConsumer SpanKind = 5\n)\n\n// SpanStatus represents the status of a span.\ntype SpanStatus int\n\nconst (\n\t// SpanStatusUnset is the default status code.\n\tSpanStatusUnset SpanStatus = 0\n\n\t// SpanStatusError indicates the operation contains an error.\n\tSpanStatusError SpanStatus = 1\n\n\t// SpanStatusOK indicates the operation completed successfully.\n\tSpanStatusOK SpanStatus = 2\n)\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing/tracing.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// Package tracing contains the definitions needed to support distributed tracing.\npackage tracing\n\nimport (\n\t\"context\"\n)\n\n// ProviderOptions contains the optional values when creating a Provider.\ntype ProviderOptions struct {\n\t// for future expansion\n}\n\n// NewProvider creates a new Provider with the specified values.\n//   - newTracerFn is the underlying implementation for creating Tracer instances\n//   - options contains optional values; pass nil to accept the default value\nfunc NewProvider(newTracerFn func(name, version string) Tracer, options *ProviderOptions) Provider {\n\treturn Provider{\n\t\tnewTracerFn: newTracerFn,\n\t}\n}\n\n// Provider is the factory that creates Tracer instances.\n// It defaults to a no-op provider.\ntype Provider struct {\n\tnewTracerFn func(name, version string) Tracer\n}\n\n// NewTracer creates a new Tracer for the specified module name and version.\n//   - module - the fully qualified name of the module\n//   - version - the version of the module\nfunc (p Provider) NewTracer(module, version string) (tracer Tracer) {\n\tif p.newTracerFn != nil {\n\t\ttracer = p.newTracerFn(module, version)\n\t}\n\treturn\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n// TracerOptions contains the optional values when creating a Tracer.\ntype TracerOptions struct {\n\t// SpanFromContext contains the implementation for the Tracer.SpanFromContext method.\n\tSpanFromContext func(context.Context) Span\n}\n\n// NewTracer creates a Tracer with the specified values.\n//   - newSpanFn is the underlying implementation for creating Span instances\n//   - options contains optional values; pass nil to accept the default value\nfunc NewTracer(newSpanFn func(ctx context.Context, spanName string, options *SpanOptions) (context.Context, Span), options *TracerOptions) Tracer {\n\tif options == nil {\n\t\toptions = &TracerOptions{}\n\t}\n\treturn Tracer{\n\t\tnewSpanFn:         newSpanFn,\n\t\tspanFromContextFn: options.SpanFromContext,\n\t}\n}\n\n// Tracer is the factory that creates Span instances.\ntype Tracer struct {\n\tattrs             []Attribute\n\tnewSpanFn         func(ctx context.Context, spanName string, options *SpanOptions) (context.Context, Span)\n\tspanFromContextFn func(ctx context.Context) Span\n}\n\n// Start creates a new span and a context.Context that contains it.\n//   - ctx is the parent context for this span. If it contains a Span, the newly created span will be a child of that span, else it will be a root span\n//   - spanName identifies the span within a trace, it's typically the fully qualified API name\n//   - options contains optional values for the span, pass nil to accept any defaults\nfunc (t Tracer) Start(ctx context.Context, spanName string, options *SpanOptions) (context.Context, Span) {\n\tif t.newSpanFn != nil {\n\t\topts := SpanOptions{}\n\t\tif options != nil {\n\t\t\topts = *options\n\t\t}\n\t\topts.Attributes = append(opts.Attributes, t.attrs...)\n\t\treturn t.newSpanFn(ctx, spanName, &opts)\n\t}\n\treturn ctx, Span{}\n}\n\n// SetAttributes sets attrs to be applied to each Span. If a key from attrs\n// already exists for an attribute of the Span it will be overwritten with\n// the value contained in attrs.\nfunc (t *Tracer) SetAttributes(attrs ...Attribute) {\n\tt.attrs = append(t.attrs, attrs...)\n}\n\n// Enabled returns true if this Tracer is capable of creating Spans.\nfunc (t Tracer) Enabled() bool {\n\treturn t.newSpanFn != nil\n}\n\n// SpanFromContext returns the Span associated with the current context.\n// If the provided context has no Span, false is returned.\nfunc (t Tracer) SpanFromContext(ctx context.Context) Span {\n\tif t.spanFromContextFn != nil {\n\t\treturn t.spanFromContextFn(ctx)\n\t}\n\treturn Span{}\n}\n\n// SpanOptions contains optional settings for creating a span.\ntype SpanOptions struct {\n\t// Kind indicates the kind of Span.\n\tKind SpanKind\n\n\t// Attributes contains key-value pairs of attributes for the span.\n\tAttributes []Attribute\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n// SpanImpl abstracts the underlying implementation for Span,\n// allowing it to work with various tracing implementations.\n// Any zero-values will have their default, no-op behavior.\ntype SpanImpl struct {\n\t// End contains the implementation for the Span.End method.\n\tEnd func()\n\n\t// SetAttributes contains the implementation for the Span.SetAttributes method.\n\tSetAttributes func(...Attribute)\n\n\t// AddEvent contains the implementation for the Span.AddEvent method.\n\tAddEvent func(string, ...Attribute)\n\n\t// SetStatus contains the implementation for the Span.SetStatus method.\n\tSetStatus func(SpanStatus, string)\n}\n\n// NewSpan creates a Span with the specified implementation.\nfunc NewSpan(impl SpanImpl) Span {\n\treturn Span{\n\t\timpl: impl,\n\t}\n}\n\n// Span is a single unit of a trace.  A trace can contain multiple spans.\n// A zero-value Span provides a no-op implementation.\ntype Span struct {\n\timpl SpanImpl\n}\n\n// End terminates the span and MUST be called before the span leaves scope.\n// Any further updates to the span will be ignored after End is called.\nfunc (s Span) End() {\n\tif s.impl.End != nil {\n\t\ts.impl.End()\n\t}\n}\n\n// SetAttributes sets the specified attributes on the Span.\n// Any existing attributes with the same keys will have their values overwritten.\nfunc (s Span) SetAttributes(attrs ...Attribute) {\n\tif s.impl.SetAttributes != nil {\n\t\ts.impl.SetAttributes(attrs...)\n\t}\n}\n\n// AddEvent adds a named event with an optional set of attributes to the span.\nfunc (s Span) AddEvent(name string, attrs ...Attribute) {\n\tif s.impl.AddEvent != nil {\n\t\ts.impl.AddEvent(name, attrs...)\n\t}\n}\n\n// SetStatus sets the status on the span along with a description.\nfunc (s Span) SetStatus(code SpanStatus, desc string) {\n\tif s.impl.SetStatus != nil {\n\t\ts.impl.SetStatus(code, desc)\n\t}\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n// Attribute is a key-value pair.\ntype Attribute struct {\n\t// Key is the name of the attribute.\n\tKey string\n\n\t// Value is the attribute's value.\n\t// Types that are natively supported include int64, float64, int, bool, string.\n\t// Any other type will be formatted per rules of fmt.Sprintf(\"%v\").\n\tValue any\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/LICENSE.txt",
    "content": "MIT License\n\nCopyright (c) Microsoft Corporation.\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": "vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/diag/diag.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage diag\n\nimport (\n\t\"fmt\"\n\t\"runtime\"\n\t\"strings\"\n)\n\n// Caller returns the file and line number of a frame on the caller's stack.\n// If the funtion fails an empty string is returned.\n// skipFrames - the number of frames to skip when determining the caller.\n// Passing a value of 0 will return the immediate caller of this function.\nfunc Caller(skipFrames int) string {\n\tif pc, file, line, ok := runtime.Caller(skipFrames + 1); ok {\n\t\t// the skipFrames + 1 is to skip ourselves\n\t\tframe := runtime.FuncForPC(pc)\n\t\treturn fmt.Sprintf(\"%s()\\n\\t%s:%d\", frame.Name(), file, line)\n\t}\n\treturn \"\"\n}\n\n// StackTrace returns a formatted stack trace string.\n// If the funtion fails an empty string is returned.\n// skipFrames - the number of stack frames to skip before composing the trace string.\n// totalFrames - the maximum number of stack frames to include in the trace string.\nfunc StackTrace(skipFrames, totalFrames int) string {\n\tpcCallers := make([]uintptr, totalFrames)\n\tif frames := runtime.Callers(skipFrames, pcCallers); frames == 0 {\n\t\treturn \"\"\n\t}\n\tframes := runtime.CallersFrames(pcCallers)\n\tsb := strings.Builder{}\n\tfor {\n\t\tframe, more := frames.Next()\n\t\tsb.WriteString(frame.Function)\n\t\tsb.WriteString(\"()\\n\\t\")\n\t\tsb.WriteString(frame.File)\n\t\tsb.WriteRune(':')\n\t\tsb.WriteString(fmt.Sprintf(\"%d\\n\", frame.Line))\n\t\tif !more {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn sb.String()\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/diag/doc.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage diag\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/errorinfo/doc.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage errorinfo\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/errorinfo/errorinfo.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage errorinfo\n\n// NonRetriable represents a non-transient error.  This works in\n// conjunction with the retry policy, indicating that the error condition\n// is idempotent, so no retries will be attempted.\n// Use errors.As() to access this interface in the error chain.\ntype NonRetriable interface {\n\terror\n\tNonRetriable()\n}\n\n// NonRetriableError marks the specified error as non-retriable.\n// This function takes an error as input and returns a new error that is marked as non-retriable.\nfunc NonRetriableError(err error) error {\n\treturn &nonRetriableError{err}\n}\n\n// nonRetriableError is a struct that embeds the error interface.\n// It is used to represent errors that should not be retried.\ntype nonRetriableError struct {\n\terror\n}\n\n// Error method for nonRetriableError struct.\n// It returns the error message of the embedded error.\nfunc (p *nonRetriableError) Error() string {\n\treturn p.error.Error()\n}\n\n// NonRetriable is a marker method for nonRetriableError struct.\n// Non-functional and indicates that the error is non-retriable.\nfunc (*nonRetriableError) NonRetriable() {\n\t// marker method\n}\n\n// Unwrap method for nonRetriableError struct.\n// It returns the original error that was marked as non-retriable.\nfunc (p *nonRetriableError) Unwrap() error {\n\treturn p.error\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/exported/exported.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage exported\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"net/http\"\n)\n\n// HasStatusCode returns true if the Response's status code is one of the specified values.\n// Exported as runtime.HasStatusCode().\nfunc HasStatusCode(resp *http.Response, statusCodes ...int) bool {\n\tif resp == nil {\n\t\treturn false\n\t}\n\tfor _, sc := range statusCodes {\n\t\tif resp.StatusCode == sc {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// PayloadOptions contains the optional values for the Payload func.\n// NOT exported but used by azcore.\ntype PayloadOptions struct {\n\t// BytesModifier receives the downloaded byte slice and returns an updated byte slice.\n\t// Use this to modify the downloaded bytes in a payload (e.g. removing a BOM).\n\tBytesModifier func([]byte) []byte\n}\n\n// Payload reads and returns the response body or an error.\n// On a successful read, the response body is cached.\n// Subsequent reads will access the cached value.\n// Exported as runtime.Payload() WITHOUT the opts parameter.\nfunc Payload(resp *http.Response, opts *PayloadOptions) ([]byte, error) {\n\tif resp.Body == nil {\n\t\t// this shouldn't happen in real-world scenarios as a\n\t\t// response with no body should set it to http.NoBody\n\t\treturn nil, nil\n\t}\n\tmodifyBytes := func(b []byte) []byte { return b }\n\tif opts != nil && opts.BytesModifier != nil {\n\t\tmodifyBytes = opts.BytesModifier\n\t}\n\n\t// r.Body won't be a nopClosingBytesReader if downloading was skipped\n\tif buf, ok := resp.Body.(*nopClosingBytesReader); ok {\n\t\tbytesBody := modifyBytes(buf.Bytes())\n\t\tbuf.Set(bytesBody)\n\t\treturn bytesBody, nil\n\t}\n\n\tbytesBody, err := io.ReadAll(resp.Body)\n\tresp.Body.Close()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tbytesBody = modifyBytes(bytesBody)\n\tresp.Body = &nopClosingBytesReader{s: bytesBody}\n\treturn bytesBody, nil\n}\n\n// PayloadDownloaded returns true if the response body has already been downloaded.\n// This implies that the Payload() func above has been previously called.\n// NOT exported but used by azcore.\nfunc PayloadDownloaded(resp *http.Response) bool {\n\t_, ok := resp.Body.(*nopClosingBytesReader)\n\treturn ok\n}\n\n// nopClosingBytesReader is an io.ReadSeekCloser around a byte slice.\n// It also provides direct access to the byte slice to avoid rereading.\ntype nopClosingBytesReader struct {\n\ts []byte\n\ti int64\n}\n\n// Bytes returns the underlying byte slice.\nfunc (r *nopClosingBytesReader) Bytes() []byte {\n\treturn r.s\n}\n\n// Close implements the io.Closer interface.\nfunc (*nopClosingBytesReader) Close() error {\n\treturn nil\n}\n\n// Read implements the io.Reader interface.\nfunc (r *nopClosingBytesReader) Read(b []byte) (n int, err error) {\n\tif r.i >= int64(len(r.s)) {\n\t\treturn 0, io.EOF\n\t}\n\tn = copy(b, r.s[r.i:])\n\tr.i += int64(n)\n\treturn\n}\n\n// Set replaces the existing byte slice with the specified byte slice and resets the reader.\nfunc (r *nopClosingBytesReader) Set(b []byte) {\n\tr.s = b\n\tr.i = 0\n}\n\n// Seek implements the io.Seeker interface.\nfunc (r *nopClosingBytesReader) Seek(offset int64, whence int) (int64, error) {\n\tvar i int64\n\tswitch whence {\n\tcase io.SeekStart:\n\t\ti = offset\n\tcase io.SeekCurrent:\n\t\ti = r.i + offset\n\tcase io.SeekEnd:\n\t\ti = int64(len(r.s)) + offset\n\tdefault:\n\t\treturn 0, errors.New(\"nopClosingBytesReader: invalid whence\")\n\t}\n\tif i < 0 {\n\t\treturn 0, errors.New(\"nopClosingBytesReader: negative position\")\n\t}\n\tr.i = i\n\treturn i, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/log/doc.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage log\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/log/log.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage log\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n)\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// NOTE: The following are exported as public surface area from azcore.  DO NOT MODIFY\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\n// Event is used to group entries.  Each group can be toggled on or off.\ntype Event string\n\n// SetEvents is used to control which events are written to\n// the log.  By default all log events are writen.\nfunc SetEvents(cls ...Event) {\n\tlog.cls = cls\n}\n\n// SetListener will set the Logger to write to the specified listener.\nfunc SetListener(lst func(Event, string)) {\n\tlog.lst = lst\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// END PUBLIC SURFACE AREA\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\n// Should returns true if the specified log event should be written to the log.\n// By default all log events will be logged.  Call SetEvents() to limit\n// the log events for logging.\n// If no listener has been set this will return false.\n// Calling this method is useful when the message to log is computationally expensive\n// and you want to avoid the overhead if its log event is not enabled.\nfunc Should(cls Event) bool {\n\tif log.lst == nil {\n\t\treturn false\n\t}\n\tif len(log.cls) == 0 {\n\t\treturn true\n\t}\n\tfor _, c := range log.cls {\n\t\tif c == cls {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// Write invokes the underlying listener with the specified event and message.\n// If the event shouldn't be logged or there is no listener then Write does nothing.\nfunc Write(cls Event, message string) {\n\tif !Should(cls) {\n\t\treturn\n\t}\n\tlog.lst(cls, message)\n}\n\n// Writef invokes the underlying listener with the specified event and formatted message.\n// If the event shouldn't be logged or there is no listener then Writef does nothing.\nfunc Writef(cls Event, format string, a ...interface{}) {\n\tif !Should(cls) {\n\t\treturn\n\t}\n\tlog.lst(cls, fmt.Sprintf(format, a...))\n}\n\n// TestResetEvents is used for TESTING PURPOSES ONLY.\nfunc TestResetEvents() {\n\tlog.cls = nil\n}\n\n// logger controls which events to log and writing to the underlying log.\ntype logger struct {\n\tcls []Event\n\tlst func(Event, string)\n}\n\n// the process-wide logger\nvar log logger\n\nfunc init() {\n\tinitLogging()\n}\n\n// split out for testing purposes\nfunc initLogging() {\n\tif cls := os.Getenv(\"AZURE_SDK_GO_LOGGING\"); cls == \"all\" {\n\t\t// cls could be enhanced to support a comma-delimited list of log events\n\t\tlog.lst = func(cls Event, msg string) {\n\t\t\t// simple console logger, it writes to stderr in the following format:\n\t\t\t// [time-stamp] Event: message\n\t\t\tfmt.Fprintf(os.Stderr, \"[%s] %s: %s\\n\", time.Now().Format(time.StampMicro), cls, msg)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/poller/util.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage poller\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/exported\"\n)\n\n// the well-known set of LRO status/provisioning state values.\nconst (\n\tStatusSucceeded  = \"Succeeded\"\n\tStatusCanceled   = \"Canceled\"\n\tStatusFailed     = \"Failed\"\n\tStatusInProgress = \"InProgress\"\n)\n\n// these are non-conformant states that we've seen in the wild.\n// we support them for back-compat.\nconst (\n\tStatusCancelled = \"Cancelled\"\n\tStatusCompleted = \"Completed\"\n)\n\n// IsTerminalState returns true if the LRO's state is terminal.\nfunc IsTerminalState(s string) bool {\n\treturn Failed(s) || Succeeded(s)\n}\n\n// Failed returns true if the LRO's state is terminal failure.\nfunc Failed(s string) bool {\n\treturn strings.EqualFold(s, StatusFailed) || strings.EqualFold(s, StatusCanceled) || strings.EqualFold(s, StatusCancelled)\n}\n\n// Succeeded returns true if the LRO's state is terminal success.\nfunc Succeeded(s string) bool {\n\treturn strings.EqualFold(s, StatusSucceeded) || strings.EqualFold(s, StatusCompleted)\n}\n\n// returns true if the LRO response contains a valid HTTP status code\nfunc StatusCodeValid(resp *http.Response) bool {\n\treturn exported.HasStatusCode(resp, http.StatusOK, http.StatusAccepted, http.StatusCreated, http.StatusNoContent)\n}\n\n// IsValidURL verifies that the URL is valid and absolute.\nfunc IsValidURL(s string) bool {\n\tu, err := url.Parse(s)\n\treturn err == nil && u.IsAbs()\n}\n\n// ErrNoBody is returned if the response didn't contain a body.\nvar ErrNoBody = errors.New(\"the response did not contain a body\")\n\n// GetJSON reads the response body into a raw JSON object.\n// It returns ErrNoBody if there was no content.\nfunc GetJSON(resp *http.Response) (map[string]any, error) {\n\tbody, err := exported.Payload(resp, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(body) == 0 {\n\t\treturn nil, ErrNoBody\n\t}\n\t// unmarshall the body to get the value\n\tvar jsonBody map[string]any\n\tif err = json.Unmarshal(body, &jsonBody); err != nil {\n\t\treturn nil, err\n\t}\n\treturn jsonBody, nil\n}\n\n// provisioningState returns the provisioning state from the response or the empty string.\nfunc provisioningState(jsonBody map[string]any) string {\n\tjsonProps, ok := jsonBody[\"properties\"]\n\tif !ok {\n\t\treturn \"\"\n\t}\n\tprops, ok := jsonProps.(map[string]any)\n\tif !ok {\n\t\treturn \"\"\n\t}\n\trawPs, ok := props[\"provisioningState\"]\n\tif !ok {\n\t\treturn \"\"\n\t}\n\tps, ok := rawPs.(string)\n\tif !ok {\n\t\treturn \"\"\n\t}\n\treturn ps\n}\n\n// status returns the status from the response or the empty string.\nfunc status(jsonBody map[string]any) string {\n\trawStatus, ok := jsonBody[\"status\"]\n\tif !ok {\n\t\treturn \"\"\n\t}\n\tstatus, ok := rawStatus.(string)\n\tif !ok {\n\t\treturn \"\"\n\t}\n\treturn status\n}\n\n// GetStatus returns the LRO's status from the response body.\n// Typically used for Azure-AsyncOperation flows.\n// If there is no status in the response body the empty string is returned.\nfunc GetStatus(resp *http.Response) (string, error) {\n\tjsonBody, err := GetJSON(resp)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn status(jsonBody), nil\n}\n\n// GetProvisioningState returns the LRO's state from the response body.\n// If there is no state in the response body the empty string is returned.\nfunc GetProvisioningState(resp *http.Response) (string, error) {\n\tjsonBody, err := GetJSON(resp)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn provisioningState(jsonBody), nil\n}\n\n// GetResourceLocation returns the LRO's resourceLocation value from the response body.\n// Typically used for Operation-Location flows.\n// If there is no resourceLocation in the response body the empty string is returned.\nfunc GetResourceLocation(resp *http.Response) (string, error) {\n\tjsonBody, err := GetJSON(resp)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tv, ok := jsonBody[\"resourceLocation\"]\n\tif !ok {\n\t\t// it might be ok if the field doesn't exist, the caller must make that determination\n\t\treturn \"\", nil\n\t}\n\tvv, ok := v.(string)\n\tif !ok {\n\t\treturn \"\", fmt.Errorf(\"the resourceLocation value %v was not in string format\", v)\n\t}\n\treturn vv, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/temporal/resource.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage temporal\n\nimport (\n\t\"sync\"\n\t\"time\"\n)\n\n// backoff sets a minimum wait time between eager update attempts. It's a variable so tests can manipulate it.\nvar backoff = func(now, lastAttempt time.Time) bool {\n\treturn lastAttempt.Add(30 * time.Second).After(now)\n}\n\n// AcquireResource abstracts a method for refreshing a temporal resource.\ntype AcquireResource[TResource, TState any] func(state TState) (newResource TResource, newExpiration time.Time, err error)\n\n// ShouldRefresh abstracts a method for indicating whether a resource should be refreshed before expiration.\ntype ShouldRefresh[TResource, TState any] func(TResource, TState) bool\n\n// Resource is a temporal resource (usually a credential) that requires periodic refreshing.\ntype Resource[TResource, TState any] struct {\n\t// cond is used to synchronize access to the shared resource embodied by the remaining fields\n\tcond *sync.Cond\n\n\t// acquiring indicates that some thread/goroutine is in the process of acquiring/updating the resource\n\tacquiring bool\n\n\t// resource contains the value of the shared resource\n\tresource TResource\n\n\t// expiration indicates when the shared resource expires; it is 0 if the resource was never acquired\n\texpiration time.Time\n\n\t// lastAttempt indicates when a thread/goroutine last attempted to acquire/update the resource\n\tlastAttempt time.Time\n\n\t// shouldRefresh indicates whether the resource should be refreshed before expiration\n\tshouldRefresh ShouldRefresh[TResource, TState]\n\n\t// acquireResource is the callback function that actually acquires the resource\n\tacquireResource AcquireResource[TResource, TState]\n}\n\n// NewResource creates a new Resource that uses the specified AcquireResource for refreshing.\nfunc NewResource[TResource, TState any](ar AcquireResource[TResource, TState]) *Resource[TResource, TState] {\n\tr := &Resource[TResource, TState]{acquireResource: ar, cond: sync.NewCond(&sync.Mutex{})}\n\tr.shouldRefresh = r.expiringSoon\n\treturn r\n}\n\n// ResourceOptions contains optional configuration for Resource\ntype ResourceOptions[TResource, TState any] struct {\n\t// ShouldRefresh indicates whether [Resource.Get] should acquire an updated resource despite\n\t// the currently held resource not having expired. [Resource.Get] ignores all errors from\n\t// refresh attempts triggered by ShouldRefresh returning true, and doesn't call ShouldRefresh\n\t// when the resource has expired (it unconditionally updates expired resources). When\n\t// ShouldRefresh is nil, [Resource.Get] refreshes the resource if it will expire within 5\n\t// minutes.\n\tShouldRefresh ShouldRefresh[TResource, TState]\n}\n\n// NewResourceWithOptions creates a new Resource that uses the specified AcquireResource for refreshing.\nfunc NewResourceWithOptions[TResource, TState any](ar AcquireResource[TResource, TState], opts ResourceOptions[TResource, TState]) *Resource[TResource, TState] {\n\tr := NewResource(ar)\n\tif opts.ShouldRefresh != nil {\n\t\tr.shouldRefresh = opts.ShouldRefresh\n\t}\n\treturn r\n}\n\n// Get returns the underlying resource.\n// If the resource is fresh, no refresh is performed.\nfunc (er *Resource[TResource, TState]) Get(state TState) (TResource, error) {\n\tnow, acquire, expired := time.Now(), false, false\n\n\t// acquire exclusive lock\n\ter.cond.L.Lock()\n\tresource := er.resource\n\n\tfor {\n\t\texpired = er.expiration.IsZero() || er.expiration.Before(now)\n\t\tif expired {\n\t\t\t// The resource was never acquired or has expired\n\t\t\tif !er.acquiring {\n\t\t\t\t// If another thread/goroutine is not acquiring/updating the resource, this thread/goroutine will do it\n\t\t\t\ter.acquiring, acquire = true, true\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// Getting here means that this thread/goroutine will wait for the updated resource\n\t\t} else if er.shouldRefresh(resource, state) {\n\t\t\tif !(er.acquiring || backoff(now, er.lastAttempt)) {\n\t\t\t\t// If another thread/goroutine is not acquiring/renewing the resource, and none has attempted\n\t\t\t\t// to do so within the last 30 seconds, this thread/goroutine will do it\n\t\t\t\ter.acquiring, acquire = true, true\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// This thread/goroutine will use the existing resource value while another updates it\n\t\t\tresource = er.resource\n\t\t\tbreak\n\t\t} else {\n\t\t\t// The resource is not close to expiring, this thread/goroutine should use its current value\n\t\t\tresource = er.resource\n\t\t\tbreak\n\t\t}\n\t\t// If we get here, wait for the new resource value to be acquired/updated\n\t\ter.cond.Wait()\n\t}\n\ter.cond.L.Unlock() // Release the lock so no threads/goroutines are blocked\n\n\tvar err error\n\tif acquire {\n\t\t// This thread/goroutine has been selected to acquire/update the resource\n\t\tvar expiration time.Time\n\t\tvar newValue TResource\n\t\ter.lastAttempt = now\n\t\tnewValue, expiration, err = er.acquireResource(state)\n\n\t\t// Atomically, update the shared resource's new value & expiration.\n\t\ter.cond.L.Lock()\n\t\tif err == nil {\n\t\t\t// Update resource & expiration, return the new value\n\t\t\tresource = newValue\n\t\t\ter.resource, er.expiration = resource, expiration\n\t\t} else if !expired {\n\t\t\t// An eager update failed. Discard the error and return the current--still valid--resource value\n\t\t\terr = nil\n\t\t}\n\t\ter.acquiring = false // Indicate that no thread/goroutine is currently acquiring the resource\n\n\t\t// Wake up any waiting threads/goroutines since there is a resource they can ALL use\n\t\ter.cond.L.Unlock()\n\t\ter.cond.Broadcast()\n\t}\n\treturn resource, err // Return the resource this thread/goroutine can use\n}\n\n// Expire marks the resource as expired, ensuring it's refreshed on the next call to Get().\nfunc (er *Resource[TResource, TState]) Expire() {\n\ter.cond.L.Lock()\n\tdefer er.cond.L.Unlock()\n\n\t// Reset the expiration as if we never got this resource to begin with\n\ter.expiration = time.Time{}\n}\n\nfunc (er *Resource[TResource, TState]) expiringSoon(TResource, TState) bool {\n\t// call time.Now() instead of using Get's value so ShouldRefresh doesn't need a time.Time parameter\n\treturn er.expiration.Add(-5 * time.Minute).Before(time.Now())\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/uuid/doc.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage uuid\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/uuid/uuid.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage uuid\n\nimport (\n\t\"crypto/rand\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strconv\"\n)\n\n// The UUID reserved variants.\nconst (\n\treservedRFC4122 byte = 0x40\n)\n\n// A UUID representation compliant with specification in RFC4122 document.\ntype UUID [16]byte\n\n// New returns a new UUID using the RFC4122 algorithm.\nfunc New() (UUID, error) {\n\tu := UUID{}\n\t// Set all bits to pseudo-random values.\n\t// NOTE: this takes a process-wide lock\n\t_, err := rand.Read(u[:])\n\tif err != nil {\n\t\treturn u, err\n\t}\n\tu[8] = (u[8] | reservedRFC4122) & 0x7F // u.setVariant(ReservedRFC4122)\n\n\tvar version byte = 4\n\tu[6] = (u[6] & 0xF) | (version << 4) // u.setVersion(4)\n\treturn u, nil\n}\n\n// String returns the UUID in \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\" format.\nfunc (u UUID) String() string {\n\treturn fmt.Sprintf(\"%x-%x-%x-%x-%x\", u[0:4], u[4:6], u[6:8], u[8:10], u[10:])\n}\n\n// Parse parses a string formatted as \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"\n// or \"{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\" into a UUID.\nfunc Parse(s string) (UUID, error) {\n\tvar uuid UUID\n\t// ensure format\n\tswitch len(s) {\n\tcase 36:\n\t\t// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n\tcase 38:\n\t\t// {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\n\t\ts = s[1:37]\n\tdefault:\n\t\treturn uuid, errors.New(\"invalid UUID format\")\n\t}\n\tif s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' {\n\t\treturn uuid, errors.New(\"invalid UUID format\")\n\t}\n\t// parse chunks\n\tfor i, x := range [16]int{\n\t\t0, 2, 4, 6,\n\t\t9, 11,\n\t\t14, 16,\n\t\t19, 21,\n\t\t24, 26, 28, 30, 32, 34} {\n\t\tb, err := strconv.ParseUint(s[x:x+2], 16, 8)\n\t\tif err != nil {\n\t\t\treturn uuid, fmt.Errorf(\"invalid UUID format: %s\", err)\n\t\t}\n\t\tuuid[i] = byte(b)\n\t}\n\treturn uuid, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/CHANGELOG.md",
    "content": "# Release History\n\n## 1.6.1 (2025-04-16)\n\n### Bugs Fixed\n* Fixed return value of DownloadBuffer when the HTTPRange count given is greater than the data length. Fixes [#23884](https://github.com/Azure/azure-sdk-for-go/issues/23884)\n\n### Other Changes\n* Updated `azidentity` version to `1.9.0`\n* Updated `azcore` version to `1.18.0`\n\n## 1.6.1-beta.1 (2025-02-12)\n\n### Features Added\n* Upgraded service version to `2025-05-05`.\n\n## 1.6.0 (2025-01-23)\n\n### Features Added\n* Upgraded service version to `2025-01-05`.\n\n## 1.6.0-beta.1 (2025-01-13)\n\n### Features Added\n* Added permissions & resourcetype parameters in listblob response.\n* Added BlobProperties field in BlobPrefix definition in listblob response.\n\n### Bugs Fixed\n* Fix FilterBlob API if Query contains a space character. Fixes [#23546](https://github.com/Azure/azure-sdk-for-go/issues/23546)\n\n## 1.5.0 (2024-11-13)\n\n### Features Added\n* Fix compareHeaders custom sorting algorithm for String To Sign.\n\n## 1.5.0-beta.1 (2024-10-22)\n\n### Other Changes\n* Updated `azcore` version to `1.16.0`\n* Updated `azidentity` version to `1.8.0`\n\n## 1.4.1 (2024-09-18)\n\n### Features Added\n* Added crc64 response header to Put Blob.\n* Upgraded service version to `2024-08-04`.\n\n## 1.4.1-beta.1 (2024-08-27)\n\n### Features Added\n* Upgraded service version to `2024-08-04`.\n\n### Other Changes\n* Updated `azcore` version to `1.14.0`\n\n## 1.4.0 (2024-07-18)\n\n### Other Changes\n* GetProperties() was called twice in DownloadFile method. Enhanced to call it only once, reducing latency.\n* Updated `azcore` version to `1.13.0`\n\n## 1.4.0-beta.1 (2024-06-14)\n\n### Features Added\n* Updated service version to `2024-05-04`.\n\n### Other Changes\n* Updated `azidentity` version to `1.6.0`\n* Updated `azcore` version to `1.12.0`\n\n## 1.3.2 (2024-04-09)\n\n### Bugs Fixed\n* Fixed an issue where GetSASURL() was providing HTTPS SAS, instead of the default http+https SAS. Fixes [#22448](https://github.com/Azure/azure-sdk-for-go/issues/22448)\n\n### Other Changes\n* Integrate `InsecureAllowCredentialWithHTTP` client options.\n* Update dependencies.\n\n## 1.3.1 (2024-02-28)\n\n### Bugs Fixed\n\n* Re-enabled `SharedKeyCredential` authentication mode for non TLS protected endpoints.\n* Use random write in `DownloadFile` method. Fixes [#22426](https://github.com/Azure/azure-sdk-for-go/issues/22426).\n\n## 1.3.0 (2024-02-12)\n\n### Bugs Fixed\n* Fix concurrency issue while Downloading File. Fixes [#22156](https://github.com/Azure/azure-sdk-for-go/issues/22156). \n* Fix panic when nil options bag is passed to NewGetPageRangesPager. Fixes [22356](https://github.com/Azure/azure-sdk-for-go/issues/22356).\n* Fix file offset update after Download file. Fixes [#22297](https://github.com/Azure/azure-sdk-for-go/issues/22297).\n\n### Other Changes\n* Updated the version of `azcore` to `1.9.2`\n\n## 1.3.0-beta.1 (2024-01-09)\n\n### Features Added\n\n* Updated service version to `2023-11-03`.\n* Added support for Audience when OAuth is used.\n\n### Bugs Fixed\n\n* Block `SharedKeyCredential` authentication mode for non TLS protected endpoints. Fixes [#21841](https://github.com/Azure/azure-sdk-for-go/issues/21841).\n\n## 1.2.1 (2023-12-13)\n\n### Features Added\n\n* Exposed GetSASURL from specialized clients\n\n### Bugs Fixed\n\n* Fixed case in Blob Batch API when blob path has / in it. Fixes [#21649](https://github.com/Azure/azure-sdk-for-go/issues/21649).\n* Fixed SharedKeyMissingError when using client.BlobClient().GetSASURL() method\n* Fixed an issue that would cause metadata keys with empty values to be omitted when enumerating blobs.\n* Fixed an issue where passing empty map to set blob tags API was causing panic. Fixes [#21869](https://github.com/Azure/azure-sdk-for-go/issues/21869).\n* Fixed an issue where downloaded file has incorrect size when not a multiple of block size. Fixes [#21995](https://github.com/Azure/azure-sdk-for-go/issues/21995).\n* Fixed case where `io.ErrUnexpectedEOF` was treated as expected error in `UploadStream`. Fixes [#21837](https://github.com/Azure/azure-sdk-for-go/issues/21837).\n\n### Other Changes\n\n* Updated the version of `azcore` to `1.9.1` and `azidentity` to `1.4.0`.\n\n## 1.2.0 (2023-10-11)\n\n### Bugs Fixed\n* Fixed null pointer exception when `SetImmutabilityPolicyOptions` is passed as `nil`.\n\n## 1.2.0-beta.1 (2023-09-18)\n\n### Features Added\n* Added support for service version 2020-12-06, 2021-02-12, 2021-04-10, 2021-06-08, 2021-08-06 , 2021-10-04, 2021-12-02, 2022-11-02, 2023-01-03, 2023-05-03, and 2023-08-03\n* Added support for [Cold Tier](https://learn.microsoft.com/azure/storage/blobs/access-tiers-overview?tabs=azure-portal).\n* Added `CopySourceTag` option for `UploadBlobFromURLOptions`\n* Added [FilterBlobs by Tags](https://learn.microsoft.com/rest/api/storageservices/find-blobs-by-tags-container) API for container client.\n* Added `System` option to `ListContainersInclude` to allow listing of system containers (i.e, $web).\n* Updated the SAS Version to `2021-12-02` and added `Encryption Scope` to Account SAS, Service SAS, and User Delegation SAS\n* Added `ArchiveStatusRehydratePendingToCold` value to `ArchiveStatus` enum.\n* Content length limit for `AppendBlob.AppendBlock()` and `AppendBlob.AppendBlockFromURL()` raised from 4 MB to 100 MB.\n\n### Bugs Fixed\n* Fixed issue where some requests fail with mismatch in string to sign.\n* Fixed service SAS creation where expiry time or permissions can be omitted when stored access policy is used. Fixes [#21229](https://github.com/Azure/azure-sdk-for-go/issues/21229).\n\n### Other Changes\n* Updating version of azcore to 1.6.0.\n\n## 1.1.0 (2023-07-13)\n\n### Features Added\n\n* Added [Blob Batch API](https://learn.microsoft.com/rest/api/storageservices/blob-batch).\n* Added support for bearer challenge for identity based managed disks.\n* Added support for GetAccountInfo to container and blob level clients.\n* Added [UploadBlobFromURL API](https://learn.microsoft.com/rest/api/storageservices/put-blob-from-url).\n* Added support for CopySourceAuthorization to appendblob.AppendBlockFromURL\n* Added support for tag permission in Container SAS.\n\n### Bugs Fixed\n\n* Fixed time formatting for the conditional request headers. Fixes [#20475](https://github.com/Azure/azure-sdk-for-go/issues/20475).\n* Fixed an issue where passing a blob tags map of length 0 would result in the x-ms-tags header to be sent to the service with an empty string as value.\n* Fixed block size and number of blocks calculation in `UploadBuffer` and `UploadFile`. Fixes [#20735](https://github.com/Azure/azure-sdk-for-go/issues/20735).\n\n### Other Changes\n\n* Add `dragonfly` to the list of build constraints for `blockblob`.\n* Updating version of azcore to 1.6.0 and azidentity to 1.3.0\n\n## 1.1.0-beta.1 (2023-05-09)\n\n### Features Added\n\n* Added [Blob Batch API](https://learn.microsoft.com/rest/api/storageservices/blob-batch).\n* Added support for bearer challenge for identity based managed disks.\n* Added support for GetAccountInfo to container and blob level clients. \n* Added [UploadBlobFromURL API](https://learn.microsoft.com/rest/api/storageservices/put-blob-from-url).\n* Added support for CopySourceAuthorization to appendblob.AppendBlockFromURL\n* Added support for tag permission in Container SAS. \n\n### Bugs Fixed\n\n* Fixed time formatting for the conditional request headers. Fixes [#20475](https://github.com/Azure/azure-sdk-for-go/issues/20475).\n* Fixed an issue where passing a blob tags map of length 0 would result in the x-ms-tags header to be sent to the service with an empty string as value.\n\n## 1.0.0 (2023-02-07)\n\n### Features Added\n\n* Add support to log calculated block size and count during uploads\n* Added MissingSharedKeyCredential error type for cleaner UX. Related to [#19864](https://github.com/Azure/azure-sdk-for-go/issues/19864).\n\n### Breaking Changes\n\n* Changed API signatures to map correctly to Azure Storage REST APIs, These changes impact:\n  * `blob.GetSASURL()`\n  * `blockblob.StageBlockFromURL()`\n  * `container.SetAccessPolicy()`\n  * `container.GetSASURL()`\n  * `service.GetSASURL()`\n  * `service.FilterBlobs()`\n  * `lease.AcquireLease()` (blobs and containers)\n  * `lease.ChangeLease()` (blobs and containers)\n* Type name changes:\n  * `CpkInfo` -> `CPKInfo`\n  * `CpkScopeInfo` -> `CPKScopeInfo`\n  * `RuleId` -> `RuleID`\n  * `PolicyId` -> `PolicyID`\n  * `CorsRule` -> `CORSRule`\n* Remove `AccountServices` it is now hardcoded to blobs\n\n### Bugs Fixed\n\n* Fixed encoding issues seen in FilterBlobs. Fixes [#17421](https://github.com/Azure/azure-sdk-for-go/issues/17421).\n* Fixing inconsistency seen with Metadata and ORS response. Fixes [#19688](https://github.com/Azure/azure-sdk-for-go/issues/19688).\n* Fixed endless loop during pagination issue [#19773](https://github.com/Azure/azure-sdk-for-go/pull/19773).\n\n### Other Changes\n\n* Exported some missing types in the `blob`, `container` and `service` packages. Fixes [#19775](https://github.com/Azure/azure-sdk-for-go/issues/19775).\n* SAS changes [#19781](https://github.com/Azure/azure-sdk-for-go/pull/19781):\n  * AccountSASPermissions: SetImmutabilityPolicy support\n  * ContainerSASPermissions: Move support\n  * Validations to ensure correct sas perm ordering\n\n## 0.6.1 (2022-12-09)\n\n### Bugs Fixed\n\n* Fix compilation error on Darwin.\n\n## 0.6.0 (2022-12-08)\n\n### Features Added\n\n* Added BlobDeleteType to DeleteOptions to allow access to ['Permanent'](https://learn.microsoft.com/rest/api/storageservices/delete-blob#permanent-delete) DeleteType.\n* Added [Set Blob Expiry API](https://learn.microsoft.com/rest/api/storageservices/set-blob-expiry).\n* Added method `ServiceClient()` to the `azblob.Client` type, allowing access to the underlying service client.\n* Added support for object level immutability policy with versioning (Version Level WORM).\n* Added the custom CRC64 polynomial used by storage for transactional hashes, and implemented automatic hashing for transactions.\n\n### Breaking Changes\n\n* Corrected the name for `saoid` and `suoid` SAS parameters in `BlobSignatureValues` struct as per [this](https://learn.microsoft.com/rest/api/storageservices/create-user-delegation-sas#construct-a-user-delegation-sas)\n* Updated type of `BlockSize` from int to int64 in `UploadStreamOptions`\n* CRC64 transactional hashes are now supplied with a `uint64` rather than a `[]byte` to conform with Golang's `hash/crc64` package\n* Field `XMSContentCRC64` has been renamed to `ContentCRC64`\n* The `Lease*` constant types and values in the `blob` and `container` packages have been moved to the `lease` package and their names fixed up to avoid stuttering.\n* Fields `TransactionalContentCRC64` and `TransactionalContentMD5` have been replaced by `TransactionalValidation`.\n* Fields `SourceContentCRC64` and `SourceContentMD5` have been replaced by `SourceContentValidation`.\n* Field `TransactionalContentMD5` has been removed from type `AppendBlockFromURLOptions`.\n\n### Bugs Fixed\n\n* Corrected signing of User Delegation SAS. Fixes [#19372](https://github.com/Azure/azure-sdk-for-go/issues/19372) and [#19454](https://github.com/Azure/azure-sdk-for-go/issues/19454)\n* Added formatting of start and expiry time in [SetAccessPolicy](https://learn.microsoft.com/rest/api/storageservices/set-container-acl#request-body). Fixes [#18712](https://github.com/Azure/azure-sdk-for-go/issues/18712)\n* Uploading block blobs larger than 256MB can fail in some cases with error `net/http: HTTP/1.x transport connection broken`.\n* Blob name parameters are URL-encoded before constructing the complete blob URL.\n\n### Other Changes\n\n* Added some missing public surface area in the `container` and `service` packages.\n* The `UploadStream()` methods now use anonymous memory mapped files for buffers in order to reduce heap allocations/fragmentation.\n  * The anonymous memory mapped files are typically backed by the page/swap file, multiple files are not actually created.\n\n## 0.5.1 (2022-10-11)\n\n### Bugs Fixed\n\n* `GetSASURL()`: for container and blob clients, don't add a forward slash before the query string\n* Fixed issue [#19249](https://github.com/Azure/azure-sdk-for-go/issues/19249) by increasing service version to '2020-02-10'.\n\n### Other Changes\n\n* Improved docs for client constructors.\n* Updating azcore version to 1.1.4\n\n## 0.5.0 (2022-09-29)\n\n### Breaking Changes\n\n* Complete architectural change for better user experience. Please view the [README](https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob#readme)\n\n### Features Added\n\n* Added [UserDelegationCredential](https://learn.microsoft.com/rest/api/storageservices/create-user-delegation-sas) which resolves [#18976](https://github.com/Azure/azure-sdk-for-go/issues/18976), [#16916](https://github.com/Azure/azure-sdk-for-go/issues/16916), [#18977](https://github.com/Azure/azure-sdk-for-go/issues/18977)\n* Added [Restore Container API](https://learn.microsoft.com/rest/api/storageservices/restore-container).\n\n### Bugs Fixed\n\n* Fixed issue [#18767](https://github.com/Azure/azure-sdk-for-go/issues/18767)\n* Fix deadlock when error writes are slow [#16937](https://github.com/Azure/azure-sdk-for-go/pull/16937)\n\n## 0.4.1 (2022-05-12)\n\n### Other Changes\n\n* Updated to latest `azcore` and `internal` modules\n\n## 0.4.0 (2022-04-19)\n\n### Breaking Changes\n\n* Fixed Issue #17150 : Renaming/refactoring high level methods.\n* Fixed Issue #16972 : Constructors should return clients by reference.\n* Renaming the options bags to match the naming convention same as that of response. The behaviour of options bags\n  remains the same.\n\n### Bugs Fixed\n\n* Fixed Issue #17515 : SetTags options bag missing leaseID.\n* Fixed Issue #17423 : Drop \"Type\" suffix from `GeoReplicationStatusType`.\n* Fixed Issue #17335 : Nil pointer exception when passing nil options bag in `ListBlobsFlat` API call.\n* Fixed Issue #17188 : `BlobURLParts` not supporting VersionID\n* Fixed Issue #17152 , Issue #17131 , Issue #17061 : `UploadStreamToBlockBlob` / `UploadStreamToBlockBlob` methods\n  ignoring the options bag.\n* Fixed Issue #16920 : Fixing error handling example.\n* Fixed Issue #16786 : Refactoring of autorest code generation definition and adding necessary transformations.\n* Fixed Issue #16679 : Response parsing issue in List blobs API.\n\n## 0.3.0 (2022-02-09)\n\n### Breaking Changes\n\n* Updated to latest `azcore`. Public surface area is unchanged.\n* [#16978](https://github.com/Azure/azure-sdk-for-go/pull/16978): The `DownloadResponse.Body` parameter is\n  now `*RetryReaderOptions`.\n\n### Bugs Fixed\n\n* Fixed Issue #16193 : `azblob.GetSASToken` wrong signed resource.\n* Fixed Issue #16223 : `HttpRange` does not expose its fields.\n* Fixed Issue #16254 : Issue passing reader to upload `BlockBlobClient`\n* Fixed Issue #16295 : Problem with listing blobs by using of `ListBlobsHierarchy()`\n* Fixed Issue #16542 : Empty `StorageError` in the Azurite environment\n* Fixed Issue #16679 : Unable to access Metadata when listing blobs\n* Fixed Issue #16816 : `ContainerClient.GetSASToken` doesn't allow list permission.\n* Fixed Issue #16988 : Too many arguments in call to `runtime.NewResponseError`\n\n## 0.2.0 (2021-11-03)\n\n### Breaking Changes\n\n* Clients now have one constructor per authentication method\n\n## 0.1.0 (2021-09-13)\n\n### Features Added\n\n* This is the initial preview release of the `azblob` library\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/LICENSE.txt",
    "content": "    MIT License\n\n    Copyright (c) Microsoft Corporation. All rights reserved.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/README.md",
    "content": "# Azure Blob Storage module for Go\n[![PkgGoDev](https://pkg.go.dev/badge/github.com/Azure/azure-sdk-for-go/sdk/azblob)](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob)\n[![Build Status](https://dev.azure.com/azure-sdk/public/_apis/build/status/go/go%20-%20azdatalake%20-%20ci?branchName=main)](https://dev.azure.com/azure-sdk/public/_build/latest?definitionId=2854&branchName=main)\n[![Code Coverage](https://img.shields.io/azure-devops/coverage/azure-sdk/public/2854/main)](https://img.shields.io/azure-devops/coverage/azure-sdk/public/2854/main)\n\n> Service Version: 2023-11-03\n\nAzure Blob Storage is Microsoft's object storage solution for the cloud. Blob\nStorage is optimized for storing massive amounts of unstructured data - data that does not adhere to a particular data model or\ndefinition, such as text or binary data. For more information, see [Introduction to Azure Blob Storage](https://learn.microsoft.com/azure/storage/blobs/storage-blobs-introduction).\n\nUse the Azure Blob Storage client module `github.com/Azure/azure-sdk-for-go/sdk/storage/azblob` to:\n\n* Authenticate clients with Azure Blob Storage\n* Manipulate containers and blobs in an Azure storage account\n\nKey links:\n\n[Source code][source] | [API reference documentation][docs] | [REST API documentation][rest_docs] | [Product documentation][product_docs] | [Samples][go_samples]\n\n## Getting started\n\n### Prerequisites\n\n- [Supported](https://aka.ms/azsdk/go/supported-versions) version of Go - [Install Go](https://go.dev/doc/install)\n- Azure subscription - [Create a free account](https://azure.microsoft.com/free/)\n- Azure storage account - To create a storage account, use tools including the [Azure portal][storage_account_create_portal],\n[Azure PowerShell][storage_account_create_ps], or the [Azure CLI][storage_account_create_cli].\nHere's an example using the Azure CLI:\n\n```bash\naz storage account create --name MyStorageAccount --resource-group MyResourceGroup --location westus --sku Standard_LRS\n```\n\n### Install the package\n\nInstall the Azure Blob Storage client module for Go with [go get][goget]:\n\n```bash\ngo get github.com/Azure/azure-sdk-for-go/sdk/storage/azblob\n```\n\nIf you plan to authenticate with Azure Active Directory (recommended), also install the [azidentity][azidentity] module.\n\n```bash\ngo get github.com/Azure/azure-sdk-for-go/sdk/azidentity\n```\n\n### Authenticate the client\n\nTo interact with the Azure Blob Storage service, you'll need to create an instance of the `azblob.Client` type.  The [azidentity][azidentity] module makes it easy to add Azure Active Directory support for authenticating Azure SDK clients with their corresponding Azure services.\n\n```go\n// create a credential for authenticating with Azure Active Directory\ncred, err := azidentity.NewDefaultAzureCredential(nil)\n// TODO: handle err\n\n// create an azblob.Client for the specified storage account that uses the above credential\nclient, err := azblob.NewClient(\"https://MYSTORAGEACCOUNT.blob.core.windows.net/\", cred, nil)\n// TODO: handle err\n```\n\nLearn more about enabling Azure Active Directory for authentication with Azure Storage:\n\n*  [Authorize access to blobs using Azure Active Directory][storage_ad]\n\nOther options for authentication include connection strings, shared key, shared access signatures (SAS), and anonymous public access. Use the appropriate client constructor function for the authentication mechanism you wish to use. For examples, see:\n\n* [Blob samples][samples]\n\n## Key concepts\n\nBlob Storage is designed for:\n\n- Serving images or documents directly to a browser.\n- Storing files for distributed access.\n- Streaming video and audio.\n- Writing to log files.\n- Storing data for backup and restore, disaster recovery, and archiving.\n- Storing data for analysis by an on-premises or Azure-hosted service.\n\nBlob Storage offers three types of resources:\n\n- The _storage account_\n- One or more _containers_ in a storage account\n- One or more _blobs_ in a container\n\nInstances of the `azblob.Client` type provide methods for manipulating containers and blobs within a storage account.\nThe storage account is specified when the `azblob.Client` is constructed.\n\n### Specialized clients\n\nThe Azure Blob Storage client module for Go also provides specialized clients in various subpackages. Use these clients when you need to interact with a specific kind of blob. Learn more about [block blobs, append blobs, and page blobs](https://learn.microsoft.com/rest/api/storageservices/understanding-block-blobs--append-blobs--and-page-blobs).\n\n- [appendblob][append_blob]\n- [blockblob][block_blob]\n- [pageblob][page_blob]\n\nThe [blob][blob] package contains APIs common to all blob types.  This includes APIs for deleting and undeleting a blob, setting metadata, and more.\n\nThe [lease][lease] package contains clients for managing leases on blobs and containers. See the [REST API reference](https://learn.microsoft.com/rest/api/storageservices/lease-blob#remarks) for general information on leases.\n\nThe [container][container] package contains APIs specific to containers.  This includes APIs for setting access policies or properties, and more.\n\nThe [service][service] package contains APIs specific to the Blob service. This includes APIs for manipulating containers, retrieving account information, and more.\n\nThe [sas][sas] package contains utilities to aid in the creation and manipulation of shared access signature (SAS) tokens.\nSee the package's documentation for more information.\n\n### Goroutine safety\n\nWe guarantee that all client instance methods are goroutine-safe and independent of each other (see [guideline](https://azure.github.io/azure-sdk/golang_introduction.html#thread-safety)). This ensures that the recommendation to reuse client instances is always safe, even across goroutines.\n\n### Blob metadata\n\nBlob metadata name-value pairs are valid HTTP headers and should adhere to all restrictions governing HTTP headers. Metadata names must be valid HTTP header names, may contain only ASCII characters, and should be treated as case-insensitive. Base64-encode or URL-encode metadata values containing non-ASCII characters.\n\n### Additional concepts\n<!-- CLIENT COMMON BAR -->\n[Client options](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore/policy#ClientOptions) |\n[Accessing the response](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime#WithCaptureResponse) |\n[Handling failures](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore#ResponseError) |\n[Logging](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore/log)\n<!-- CLIENT COMMON BAR -->\n\n## Examples\n\n### Upload a blob\n\n```go\nconst (\n\taccount       = \"https://MYSTORAGEACCOUNT.blob.core.windows.net/\"\n\tcontainerName = \"sample-container\"\n\tblobName      = \"sample-blob\"\n\tsampleFile    = \"path/to/sample/file\"\n)\n\n// authenticate with Azure Active Directory\ncred, err := azidentity.NewDefaultAzureCredential(nil)\n// TODO: handle error\n\n// create a client for the specified storage account\nclient, err := azblob.NewClient(account, cred, nil)\n// TODO: handle error\n\n// open the file for reading\nfile, err := os.OpenFile(sampleFile, os.O_RDONLY, 0)\n// TODO: handle error\ndefer file.Close()\n\n// upload the file to the specified container with the specified blob name\n_, err = client.UploadFile(context.TODO(), containerName, blobName, file, nil)\n// TODO: handle error\n```\n\n### Download a blob\n\n```go\n// this example accesses a public blob via anonymous access, so no credentials are required\nclient, err := azblob.NewClientWithNoCredential(\"https://azurestoragesamples.blob.core.windows.net/\", nil)\n// TODO: handle error\n\n// create or open a local file where we can download the blob\nfile, err := os.Create(\"cloud.jpg\")\n// TODO: handle error\ndefer file.Close()\n\n// download the blob\n_, err = client.DownloadFile(context.TODO(), \"samples\", \"cloud.jpg\", file, nil)\n// TODO: handle error\n```\n\n### Enumerate blobs\n\n```go\nconst (\n\taccount       = \"https://MYSTORAGEACCOUNT.blob.core.windows.net/\"\n\tcontainerName = \"sample-container\"\n)\n\n// authenticate with Azure Active Directory\ncred, err := azidentity.NewDefaultAzureCredential(nil)\n// TODO: handle error\n\n// create a client for the specified storage account\nclient, err := azblob.NewClient(account, cred, nil)\n// TODO: handle error\n\n// blob listings are returned across multiple pages\npager := client.NewListBlobsFlatPager(containerName, nil)\n\n// continue fetching pages until no more remain\nfor pager.More() {\n  // advance to the next page\n\tpage, err := pager.NextPage(context.TODO())\n\t// TODO: handle error\n\n\t// print the blob names for this page\n\tfor _, blob := range page.Segment.BlobItems {\n\t\tfmt.Println(*blob.Name)\n\t}\n}\n```\n\n## Troubleshooting\n\nAll Blob service operations will return an\n[*azcore.ResponseError][azcore_response_error] on failure with a\npopulated `ErrorCode` field. Many of these errors are recoverable.\nThe [bloberror][blob_error] package provides the possible Storage error codes\nalong with helper facilities for error handling.\n\n```go\nconst (\n\tconnectionString = \"<connection_string>\"\n\tcontainerName    = \"sample-container\"\n)\n\n// create a client with the provided connection string\nclient, err := azblob.NewClientFromConnectionString(connectionString, nil)\n// TODO: handle error\n\n// try to delete the container, avoiding any potential race conditions with an in-progress or completed deletion\n_, err = client.DeleteContainer(context.TODO(), containerName, nil)\n\nif bloberror.HasCode(err, bloberror.ContainerBeingDeleted, bloberror.ContainerNotFound) {\n\t// ignore any errors if the container is being deleted or already has been deleted\n} else if err != nil {\n\t// TODO: some other error\n}\n```\n\n## Next steps\n\nGet started with our [Blob samples][samples]. They contain complete examples of the above snippets and more.\n\n## Contributing\n\nSee the [Storage CONTRIBUTING.md][storage_contrib] for details on building,\ntesting, and contributing to this library.\n\nThis project welcomes contributions and suggestions.  Most contributions require\nyou to agree to a Contributor License Agreement (CLA) declaring that you have\nthe right to, and actually do, grant us the rights to use your contribution. For\ndetails, visit [cla.microsoft.com][cla].\n\nThis project has adopted the [Microsoft Open Source Code of Conduct][coc].\nFor more information see the [Code of Conduct FAQ][coc_faq]\nor contact [opencode@microsoft.com][coc_contact] with any\nadditional questions or comments.\n\n\n\n<!-- LINKS -->\n[source]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob\n[docs]: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob#section_documentation\n[rest_docs]: https://learn.microsoft.com/rest/api/storageservices/blob-service-rest-api\n[product_docs]: https://learn.microsoft.com/azure/storage/blobs/storage-blobs-overview\n[godevdl]: https://go.dev/dl/\n[goget]: https://pkg.go.dev/cmd/go#hdr-Add_dependencies_to_current_module_and_install_them\n[go_samples]: https://github.com/Azure-Samples/azure-sdk-for-go-samples/tree/main\n[storage_account_docs]: https://learn.microsoft.com/azure/storage/common/storage-account-overview\n[storage_account_create_ps]: https://learn.microsoft.com/azure/storage/common/storage-quickstart-create-account?tabs=azure-powershell\n[storage_account_create_cli]: https://learn.microsoft.com/azure/storage/common/storage-quickstart-create-account?tabs=azure-cli\n[storage_account_create_portal]: https://learn.microsoft.com/azure/storage/common/storage-quickstart-create-account?tabs=azure-portal\n[azure_cli]: https://learn.microsoft.com/cli/azure\n[azure_sub]: https://azure.microsoft.com/free/\n[azidentity]: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity\n[storage_ad]: https://learn.microsoft.com/azure/storage/common/storage-auth-aad\n[azcore_response_error]: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore#ResponseError\n[samples]: https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/storage/azblob/examples_test.go\n[append_blob]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob/appendblob/client.go\n[blob]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob/blob/client.go\n[blob_error]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob/bloberror/error_codes.go\n[block_blob]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob/blockblob/client.go\n[container]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob/container/client.go\n[lease]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob/lease\n[page_blob]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob/pageblob/client.go\n[sas]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob/sas\n[service]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob/service/client.go\n[storage_contrib]: https://github.com/Azure/azure-sdk-for-go/blob/main/CONTRIBUTING.md\n[cla]: https://cla.microsoft.com\n[coc]: https://opensource.microsoft.com/codeofconduct/\n[coc_faq]: https://opensource.microsoft.com/codeofconduct/faq/\n[coc_contact]: mailto:opencode@microsoft.com\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/appendblob/client.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage appendblob\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"io\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/base\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas\"\n)\n\n// ClientOptions contains the optional parameters when creating a Client.\ntype ClientOptions base.ClientOptions\n\n// Client represents a client to an Azure Storage append blob;\ntype Client base.CompositeClient[generated.BlobClient, generated.AppendBlobClient]\n\n// NewClient creates an instance of Client with the specified values.\n//   - blobURL - the URL of the blob e.g. https://<account>.blob.core.windows.net/container/blob.txt\n//   - cred - an Azure AD credential, typically obtained via the azidentity module\n//   - options - client options; pass nil to accept the default values\nfunc NewClient(blobURL string, cred azcore.TokenCredential, options *ClientOptions) (*Client, error) {\n\taudience := base.GetAudience((*base.ClientOptions)(options))\n\tconOptions := shared.GetClientOptions(options)\n\tauthPolicy := shared.NewStorageChallengePolicy(cred, audience, conOptions.InsecureAllowCredentialWithHTTP)\n\tplOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}}\n\n\tazClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn (*Client)(base.NewAppendBlobClient(blobURL, azClient, nil)), nil\n}\n\n// NewClientWithNoCredential creates an instance of Client with the specified values.\n// This is used to anonymously access a blob or with a shared access signature (SAS) token.\n//   - blobURL - the URL of the blob e.g. https://<account>.blob.core.windows.net/container/blob.txt?<sas token>\n//   - options - client options; pass nil to accept the default values\nfunc NewClientWithNoCredential(blobURL string, options *ClientOptions) (*Client, error) {\n\tconOptions := shared.GetClientOptions(options)\n\n\tazClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, runtime.PipelineOptions{}, &conOptions.ClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn (*Client)(base.NewAppendBlobClient(blobURL, azClient, nil)), nil\n}\n\n// NewClientWithSharedKeyCredential creates an instance of Client with the specified values.\n//   - blobURL - the URL of the blob e.g. https://<account>.blob.core.windows.net/container/blob.txt\n//   - cred - a SharedKeyCredential created with the matching blob's storage account and access key\n//   - options - client options; pass nil to accept the default values\nfunc NewClientWithSharedKeyCredential(blobURL string, cred *blob.SharedKeyCredential, options *ClientOptions) (*Client, error) {\n\tauthPolicy := exported.NewSharedKeyCredPolicy(cred)\n\tconOptions := shared.GetClientOptions(options)\n\tplOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}}\n\n\tazClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn (*Client)(base.NewAppendBlobClient(blobURL, azClient, cred)), nil\n}\n\n// NewClientFromConnectionString creates an instance of Client with the specified values.\n//   - connectionString - a connection string for the desired storage account\n//   - containerName - the name of the container within the storage account\n//   - blobName - the name of the blob within the container\n//   - options - client options; pass nil to accept the default values\nfunc NewClientFromConnectionString(connectionString, containerName, blobName string, options *ClientOptions) (*Client, error) {\n\tparsed, err := shared.ParseConnectionString(connectionString)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tparsed.ServiceURL = runtime.JoinPaths(parsed.ServiceURL, containerName, blobName)\n\n\tif parsed.AccountKey != \"\" && parsed.AccountName != \"\" {\n\t\tcredential, err := exported.NewSharedKeyCredential(parsed.AccountName, parsed.AccountKey)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn NewClientWithSharedKeyCredential(parsed.ServiceURL, credential, options)\n\t}\n\n\treturn NewClientWithNoCredential(parsed.ServiceURL, options)\n}\n\n// BlobClient returns the embedded blob client for this AppendBlob client.\nfunc (ab *Client) BlobClient() *blob.Client {\n\tinnerBlob, _ := base.InnerClients((*base.CompositeClient[generated.BlobClient, generated.AppendBlobClient])(ab))\n\treturn (*blob.Client)(innerBlob)\n}\n\nfunc (ab *Client) sharedKey() *blob.SharedKeyCredential {\n\treturn base.SharedKeyComposite((*base.CompositeClient[generated.BlobClient, generated.AppendBlobClient])(ab))\n}\n\nfunc (ab *Client) generated() *generated.AppendBlobClient {\n\t_, appendBlob := base.InnerClients((*base.CompositeClient[generated.BlobClient, generated.AppendBlobClient])(ab))\n\treturn appendBlob\n}\n\nfunc (ab *Client) innerBlobGenerated() *generated.BlobClient {\n\tb := ab.BlobClient()\n\treturn base.InnerClient((*base.Client[generated.BlobClient])(b))\n}\n\n// URL returns the URL endpoint used by the Client object.\nfunc (ab *Client) URL() string {\n\treturn ab.generated().Endpoint()\n}\n\n// WithSnapshot creates a new AppendBlobURL object identical to the source but with the specified snapshot timestamp.\n// Pass \"\" to remove the snapshot returning a URL to the base blob.\nfunc (ab *Client) WithSnapshot(snapshot string) (*Client, error) {\n\tp, err := blob.ParseURL(ab.URL())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.Snapshot = snapshot\n\n\treturn (*Client)(base.NewAppendBlobClient(p.String(), ab.generated().InternalClient(), ab.sharedKey())), nil\n}\n\n// WithVersionID creates a new AppendBlobURL object identical to the source but with the specified version id.\n// Pass \"\" to remove the versionID returning a URL to the base blob.\nfunc (ab *Client) WithVersionID(versionID string) (*Client, error) {\n\tp, err := blob.ParseURL(ab.URL())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.VersionID = versionID\n\n\treturn (*Client)(base.NewAppendBlobClient(p.String(), ab.generated().InternalClient(), ab.sharedKey())), nil\n}\n\n// Create creates a 0-size append blob. Call AppendBlock to append data to an append blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-blob.\nfunc (ab *Client) Create(ctx context.Context, o *CreateOptions) (CreateResponse, error) {\n\topts, httpHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions := o.format()\n\tresp, err := ab.generated().Create(ctx, 0, opts, httpHeaders, leaseAccessConditions, cpkInfo,\n\t\tcpkScopeInfo, modifiedAccessConditions)\n\treturn resp, err\n}\n\n// AppendBlock writes a stream to a new block of data to the end of the existing append blob.\n// This method panics if the stream is not at position 0.\n// Note that the http client closes the body stream after the request is sent to the service.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/append-block.\nfunc (ab *Client) AppendBlock(ctx context.Context, body io.ReadSeekCloser, o *AppendBlockOptions) (AppendBlockResponse, error) {\n\tcount, err := shared.ValidateSeekableStreamAt0AndGetCount(body)\n\tif err != nil {\n\t\treturn AppendBlockResponse{}, nil\n\t}\n\n\tappendOptions, appendPositionAccessConditions, cpkInfo, cpkScope, modifiedAccessConditions, leaseAccessConditions := o.format()\n\n\tif o != nil && o.TransactionalValidation != nil {\n\t\tbody, err = o.TransactionalValidation.Apply(body, appendOptions)\n\t\tif err != nil {\n\t\t\treturn AppendBlockResponse{}, nil\n\t\t}\n\t}\n\n\tresp, err := ab.generated().AppendBlock(ctx,\n\t\tcount,\n\t\tbody,\n\t\tappendOptions,\n\t\tleaseAccessConditions,\n\t\tappendPositionAccessConditions,\n\t\tcpkInfo,\n\t\tcpkScope,\n\t\tmodifiedAccessConditions)\n\n\treturn resp, err\n}\n\n// AppendBlockFromURL copies a new block of data from source URL to the end of the existing append blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/append-block-from-url.\nfunc (ab *Client) AppendBlockFromURL(ctx context.Context, source string, o *AppendBlockFromURLOptions) (AppendBlockFromURLResponse, error) {\n\tappendBlockFromURLOptions,\n\t\tcpkInfo,\n\t\tcpkScopeInfo,\n\t\tleaseAccessConditions,\n\t\tappendPositionAccessConditions,\n\t\tmodifiedAccessConditions,\n\t\tsourceModifiedAccessConditions := o.format()\n\n\t// content length should be 0 on * from URL. always. It's a 400 if it isn't.\n\tresp, err := ab.generated().AppendBlockFromURL(ctx,\n\t\tsource,\n\t\t0,\n\t\tappendBlockFromURLOptions,\n\t\tcpkInfo,\n\t\tcpkScopeInfo,\n\t\tleaseAccessConditions,\n\t\tappendPositionAccessConditions,\n\t\tmodifiedAccessConditions,\n\t\tsourceModifiedAccessConditions)\n\treturn resp, err\n}\n\n// Seal - The purpose of Append Blob Seal is to allow users and applications to seal append blobs, marking them as read only.\n// https://docs.microsoft.com/en-us/rest/api/storageservices/append-blob-seal\nfunc (ab *Client) Seal(ctx context.Context, o *SealOptions) (SealResponse, error) {\n\tleaseAccessConditions, modifiedAccessConditions, positionAccessConditions := o.format()\n\tresp, err := ab.generated().Seal(ctx,\n\t\tnil,\n\t\tleaseAccessConditions,\n\t\tmodifiedAccessConditions,\n\t\tpositionAccessConditions)\n\treturn resp, err\n}\n\n// Delete marks the specified blob or snapshot for deletion. The blob is later deleted during garbage collection.\n// Note that deleting a blob also deletes all its snapshots.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-blob.\nfunc (ab *Client) Delete(ctx context.Context, o *blob.DeleteOptions) (blob.DeleteResponse, error) {\n\treturn ab.BlobClient().Delete(ctx, o)\n}\n\n// Undelete restores the contents and metadata of a soft-deleted blob and any associated soft-deleted snapshots.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/undelete-blob.\nfunc (ab *Client) Undelete(ctx context.Context, o *blob.UndeleteOptions) (blob.UndeleteResponse, error) {\n\treturn ab.BlobClient().Undelete(ctx, o)\n}\n\n// SetImmutabilityPolicy operation enables users to set the immutability policy on a blob.\n// https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview\nfunc (ab *Client) SetImmutabilityPolicy(ctx context.Context, expiryTime time.Time, options *blob.SetImmutabilityPolicyOptions) (blob.SetImmutabilityPolicyResponse, error) {\n\treturn ab.BlobClient().SetImmutabilityPolicy(ctx, expiryTime, options)\n}\n\n// DeleteImmutabilityPolicy operation enables users to delete the immutability policy on a blob.\n// https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview\nfunc (ab *Client) DeleteImmutabilityPolicy(ctx context.Context, options *blob.DeleteImmutabilityPolicyOptions) (blob.DeleteImmutabilityPolicyResponse, error) {\n\treturn ab.BlobClient().DeleteImmutabilityPolicy(ctx, options)\n}\n\n// SetLegalHold operation enables users to set legal hold on a blob.\n// https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview\nfunc (ab *Client) SetLegalHold(ctx context.Context, legalHold bool, options *blob.SetLegalHoldOptions) (blob.SetLegalHoldResponse, error) {\n\treturn ab.BlobClient().SetLegalHold(ctx, legalHold, options)\n}\n\n// SetTier\n// Deprecated: SetTier only works for page blob in premium storage account and block blob in blob storage account.\nfunc (ab *Client) SetTier(ctx context.Context, tier blob.AccessTier, o *blob.SetTierOptions) (blob.SetTierResponse, error) {\n\treturn blob.SetTierResponse{}, errors.New(\"operation will not work on this blob type. SetTier only works for page blob in premium storage account and block blob in blob storage account\")\n}\n\n// SetExpiry operation sets an expiry time on an existing blob. This operation is only allowed on Hierarchical Namespace enabled accounts.\n// For more information, see https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-expiry\nfunc (ab *Client) SetExpiry(ctx context.Context, expiryType ExpiryType, o *SetExpiryOptions) (SetExpiryResponse, error) {\n\tif expiryType == nil {\n\t\texpiryType = ExpiryTypeNever{}\n\t}\n\tet, opts := expiryType.Format(o)\n\tresp, err := ab.innerBlobGenerated().SetExpiry(ctx, et, opts)\n\treturn resp, err\n}\n\n// GetProperties returns the blob's properties.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob-properties.\nfunc (ab *Client) GetProperties(ctx context.Context, o *blob.GetPropertiesOptions) (blob.GetPropertiesResponse, error) {\n\treturn ab.BlobClient().GetProperties(ctx, o)\n}\n\n// GetAccountInfo provides account level information\n// For more information, see https://learn.microsoft.com/en-us/rest/api/storageservices/get-account-information?tabs=shared-access-signatures.\nfunc (ab *Client) GetAccountInfo(ctx context.Context, o *blob.GetAccountInfoOptions) (blob.GetAccountInfoResponse, error) {\n\treturn ab.BlobClient().GetAccountInfo(ctx, o)\n}\n\n// SetHTTPHeaders changes a blob's HTTP headers.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties.\nfunc (ab *Client) SetHTTPHeaders(ctx context.Context, httpHeaders blob.HTTPHeaders, o *blob.SetHTTPHeadersOptions) (blob.SetHTTPHeadersResponse, error) {\n\treturn ab.BlobClient().SetHTTPHeaders(ctx, httpHeaders, o)\n}\n\n// SetMetadata changes a blob's metadata.\n// https://docs.microsoft.com/rest/api/storageservices/set-blob-metadata.\nfunc (ab *Client) SetMetadata(ctx context.Context, metadata map[string]*string, o *blob.SetMetadataOptions) (blob.SetMetadataResponse, error) {\n\treturn ab.BlobClient().SetMetadata(ctx, metadata, o)\n}\n\n// CreateSnapshot creates a read-only snapshot of a blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/snapshot-blob.\nfunc (ab *Client) CreateSnapshot(ctx context.Context, o *blob.CreateSnapshotOptions) (blob.CreateSnapshotResponse, error) {\n\treturn ab.BlobClient().CreateSnapshot(ctx, o)\n}\n\n// StartCopyFromURL copies the data at the source URL to a blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/copy-blob.\nfunc (ab *Client) StartCopyFromURL(ctx context.Context, copySource string, o *blob.StartCopyFromURLOptions) (blob.StartCopyFromURLResponse, error) {\n\treturn ab.BlobClient().StartCopyFromURL(ctx, copySource, o)\n}\n\n// AbortCopyFromURL stops a pending copy that was previously started and leaves a destination blob with 0 length and metadata.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/abort-copy-blob.\nfunc (ab *Client) AbortCopyFromURL(ctx context.Context, copyID string, o *blob.AbortCopyFromURLOptions) (blob.AbortCopyFromURLResponse, error) {\n\treturn ab.BlobClient().AbortCopyFromURL(ctx, copyID, o)\n}\n\n// SetTags operation enables users to set tags on a blob or specific blob version, but not snapshot.\n// Each call to this operation replaces all existing tags attached to the blob.\n// To remove all tags from the blob, call this operation with no tags set.\n// https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-tags\nfunc (ab *Client) SetTags(ctx context.Context, tags map[string]string, o *blob.SetTagsOptions) (blob.SetTagsResponse, error) {\n\treturn ab.BlobClient().SetTags(ctx, tags, o)\n}\n\n// GetTags operation enables users to get tags on a blob or specific blob version, or snapshot.\n// https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-tags\nfunc (ab *Client) GetTags(ctx context.Context, o *blob.GetTagsOptions) (blob.GetTagsResponse, error) {\n\treturn ab.BlobClient().GetTags(ctx, o)\n}\n\n// CopyFromURL\n// Deprecated: CopyFromURL works only with block blob\nfunc (ab *Client) CopyFromURL(ctx context.Context, copySource string, o *blob.CopyFromURLOptions) (blob.CopyFromURLResponse, error) {\n\treturn blob.CopyFromURLResponse{}, errors.New(\"operation will not work on this blob type. CopyFromURL works only with block blob\")\n}\n\n// GetSASURL is a convenience method for generating a SAS token for the currently pointed at append blob.\n// It can only be used if the credential supplied during creation was a SharedKeyCredential.\nfunc (ab *Client) GetSASURL(permissions sas.BlobPermissions, expiry time.Time, o *blob.GetSASURLOptions) (string, error) {\n\treturn ab.BlobClient().GetSASURL(permissions, expiry, o)\n}\n\n// Concurrent Download Functions -----------------------------------------------------------------------------------------\n\n// DownloadStream reads a range of bytes from a blob. The response also includes the blob's properties and metadata.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob.\nfunc (ab *Client) DownloadStream(ctx context.Context, o *blob.DownloadStreamOptions) (blob.DownloadStreamResponse, error) {\n\treturn ab.BlobClient().DownloadStream(ctx, o)\n}\n\n// DownloadBuffer downloads an Azure blob to a buffer with parallel.\nfunc (ab *Client) DownloadBuffer(ctx context.Context, buffer []byte, o *blob.DownloadBufferOptions) (int64, error) {\n\treturn ab.BlobClient().DownloadBuffer(ctx, shared.NewBytesWriter(buffer), o)\n}\n\n// DownloadFile downloads an Azure blob to a local file.\n// The file would be truncated if the size doesn't match.\nfunc (ab *Client) DownloadFile(ctx context.Context, file *os.File, o *blob.DownloadFileOptions) (int64, error) {\n\treturn ab.BlobClient().DownloadFile(ctx, file, o)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/appendblob/models.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage appendblob\n\nimport (\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared\"\n)\n\n// Type Declarations ---------------------------------------------------------------------\n\n// AppendPositionAccessConditions contains a group of parameters for the Client.AppendBlock method.\ntype AppendPositionAccessConditions = generated.AppendPositionAccessConditions\n\n// Request Model Declaration -------------------------------------------------------------------------------------------\n\n// CreateOptions provides set of configurations for Create Append Blob operation\ntype CreateOptions struct {\n\t// Specifies the date time when the blobs immutability policy is set to expire.\n\tImmutabilityPolicyExpiry *time.Time\n\n\t// Specifies the immutability policy mode to set on the blob.\n\tImmutabilityPolicyMode *blob.ImmutabilityPolicySetting\n\n\t// Specified if a legal hold should be set on the blob.\n\tLegalHold *bool\n\n\tAccessConditions *blob.AccessConditions\n\n\tHTTPHeaders *blob.HTTPHeaders\n\n\tCPKInfo *blob.CPKInfo\n\n\tCPKScopeInfo *blob.CPKScopeInfo\n\n\t// Optional. Used to set blob tags in various blob operations.\n\tTags map[string]string\n\n\t// Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the\n\t// operation will copy the metadata from the source blob or file to the destination blob. If one or more name-value pairs\n\t// are specified, the destination blob is created with the specified metadata, and metadata is not copied from the source\n\t// blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers.\n\t// See Naming and Referencing Containers, Blobs, and Metadata for more information.\n\tMetadata map[string]*string\n}\n\nfunc (o *CreateOptions) format() (*generated.AppendBlobClientCreateOptions, *generated.BlobHTTPHeaders, *generated.LeaseAccessConditions, *generated.CPKInfo, *generated.CPKScopeInfo, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil, nil, nil\n\t}\n\n\toptions := generated.AppendBlobClientCreateOptions{\n\t\tBlobTagsString:           shared.SerializeBlobTagsToStrPtr(o.Tags),\n\t\tMetadata:                 o.Metadata,\n\t\tImmutabilityPolicyExpiry: o.ImmutabilityPolicyExpiry,\n\t\tImmutabilityPolicyMode:   o.ImmutabilityPolicyMode,\n\t\tLegalHold:                o.LegalHold,\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn &options, o.HTTPHeaders, leaseAccessConditions, o.CPKInfo, o.CPKScopeInfo, modifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// AppendBlockOptions contains the optional parameters for the Client.AppendBlock method.\ntype AppendBlockOptions struct {\n\t// TransactionalValidation specifies the transfer validation type to use.\n\t// The default is nil (no transfer validation).\n\tTransactionalValidation blob.TransferValidationType\n\n\tAppendPositionAccessConditions *AppendPositionAccessConditions\n\n\tCPKInfo *blob.CPKInfo\n\n\tCPKScopeInfo *blob.CPKScopeInfo\n\n\tAccessConditions *blob.AccessConditions\n}\n\nfunc (o *AppendBlockOptions) format() (*generated.AppendBlobClientAppendBlockOptions, *generated.AppendPositionAccessConditions,\n\t*generated.CPKInfo, *generated.CPKScopeInfo, *generated.ModifiedAccessConditions, *generated.LeaseAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil, nil, nil\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn &generated.AppendBlobClientAppendBlockOptions{}, o.AppendPositionAccessConditions, o.CPKInfo, o.CPKScopeInfo, modifiedAccessConditions, leaseAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// AppendBlockFromURLOptions contains the optional parameters for the Client.AppendBlockFromURL method.\ntype AppendBlockFromURLOptions struct {\n\t// Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source.\n\tCopySourceAuthorization *string\n\n\t// SourceContentValidation contains the validation mechanism used on the range of bytes read from the source.\n\tSourceContentValidation blob.SourceContentValidationType\n\n\tAppendPositionAccessConditions *AppendPositionAccessConditions\n\n\tCPKInfo *blob.CPKInfo\n\n\tCPKScopeInfo *blob.CPKScopeInfo\n\n\tSourceModifiedAccessConditions *blob.SourceModifiedAccessConditions\n\n\tAccessConditions *blob.AccessConditions\n\n\t// Range specifies a range of bytes.  The default value is all bytes.\n\tRange blob.HTTPRange\n}\n\nfunc (o *AppendBlockFromURLOptions) format() (*generated.AppendBlobClientAppendBlockFromURLOptions, *generated.CPKInfo,\n\t*generated.CPKScopeInfo, *generated.LeaseAccessConditions, *generated.AppendPositionAccessConditions,\n\t*generated.ModifiedAccessConditions, *generated.SourceModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil, nil, nil, nil\n\t}\n\n\toptions := &generated.AppendBlobClientAppendBlockFromURLOptions{\n\t\tSourceRange:             exported.FormatHTTPRange(o.Range),\n\t\tCopySourceAuthorization: o.CopySourceAuthorization,\n\t}\n\n\tif o.SourceContentValidation != nil {\n\t\to.SourceContentValidation.Apply(options)\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn options, o.CPKInfo, o.CPKScopeInfo, leaseAccessConditions, o.AppendPositionAccessConditions, modifiedAccessConditions, o.SourceModifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// SealOptions provides set of configurations for SealAppendBlob operation\ntype SealOptions struct {\n\tAccessConditions               *blob.AccessConditions\n\tAppendPositionAccessConditions *AppendPositionAccessConditions\n}\n\nfunc (o *SealOptions) format() (*generated.LeaseAccessConditions,\n\t*generated.ModifiedAccessConditions, *generated.AppendPositionAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn leaseAccessConditions, modifiedAccessConditions, o.AppendPositionAccessConditions\n\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// ExpiryType defines values for ExpiryType\ntype ExpiryType = exported.ExpiryType\n\n// ExpiryTypeAbsolute defines the absolute time for the blob expiry\ntype ExpiryTypeAbsolute = exported.ExpiryTypeAbsolute\n\n// ExpiryTypeRelativeToNow defines the duration relative to now for the blob expiry\ntype ExpiryTypeRelativeToNow = exported.ExpiryTypeRelativeToNow\n\n// ExpiryTypeRelativeToCreation defines the duration relative to creation for the blob expiry\ntype ExpiryTypeRelativeToCreation = exported.ExpiryTypeRelativeToCreation\n\n// ExpiryTypeNever defines that the blob will be set to never expire\ntype ExpiryTypeNever = exported.ExpiryTypeNever\n\n// SetExpiryOptions contains the optional parameters for the Client.SetExpiry method.\ntype SetExpiryOptions = exported.SetExpiryOptions\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/appendblob/responses.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage appendblob\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n)\n\n// CreateResponse contains the response from method Client.Create.\ntype CreateResponse = generated.AppendBlobClientCreateResponse\n\n// AppendBlockResponse contains the response from method Client.AppendBlock.\ntype AppendBlockResponse = generated.AppendBlobClientAppendBlockResponse\n\n// AppendBlockFromURLResponse contains the response from method Client.AppendBlockFromURL.\ntype AppendBlockFromURLResponse = generated.AppendBlobClientAppendBlockFromURLResponse\n\n// SealResponse contains the response from method Client.Seal.\ntype SealResponse = generated.AppendBlobClientSealResponse\n\n// SetExpiryResponse contains the response from method Client.SetExpiry.\ntype SetExpiryResponse = generated.BlobClientSetExpiryResponse\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/assets.json",
    "content": "{\n  \"AssetsRepo\": \"Azure/azure-sdk-assets\",\n  \"AssetsRepoPrefixPath\": \"go\",\n  \"TagPrefix\": \"go/storage/azblob\",\n  \"Tag\": \"go/storage/azblob_db9a368fe4\"\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob/client.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage blob\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"os\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/bloberror\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/base\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas\"\n)\n\n// ClientOptions contains the optional parameters when creating a Client.\ntype ClientOptions base.ClientOptions\n\n// Client represents a URL to an Azure Storage blob; the blob may be a block blob, append blob, or page blob.\ntype Client base.Client[generated.BlobClient]\n\n// NewClient creates an instance of Client with the specified values.\n//   - blobURL - the URL of the blob e.g. https://<account>.blob.core.windows.net/container/blob.txt\n//   - cred - an Azure AD credential, typically obtained via the azidentity module\n//   - options - client options; pass nil to accept the default values\nfunc NewClient(blobURL string, cred azcore.TokenCredential, options *ClientOptions) (*Client, error) {\n\taudience := base.GetAudience((*base.ClientOptions)(options))\n\tconOptions := shared.GetClientOptions(options)\n\tauthPolicy := shared.NewStorageChallengePolicy(cred, audience, conOptions.InsecureAllowCredentialWithHTTP)\n\tplOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}}\n\n\tazClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn (*Client)(base.NewBlobClient(blobURL, azClient, &cred, (*base.ClientOptions)(conOptions))), nil\n}\n\n// NewClientWithNoCredential creates an instance of Client with the specified values.\n// This is used to anonymously access a blob or with a shared access signature (SAS) token.\n//   - blobURL - the URL of the blob e.g. https://<account>.blob.core.windows.net/container/blob.txt?<sas token>\n//   - options - client options; pass nil to accept the default values\nfunc NewClientWithNoCredential(blobURL string, options *ClientOptions) (*Client, error) {\n\tconOptions := shared.GetClientOptions(options)\n\n\tazClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, runtime.PipelineOptions{}, &conOptions.ClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn (*Client)(base.NewBlobClient(blobURL, azClient, nil, (*base.ClientOptions)(conOptions))), nil\n}\n\n// NewClientWithSharedKeyCredential creates an instance of Client with the specified values.\n//   - blobURL - the URL of the blob e.g. https://<account>.blob.core.windows.net/container/blob.txt\n//   - cred - a SharedKeyCredential created with the matching blob's storage account and access key\n//   - options - client options; pass nil to accept the default values\nfunc NewClientWithSharedKeyCredential(blobURL string, cred *SharedKeyCredential, options *ClientOptions) (*Client, error) {\n\tauthPolicy := exported.NewSharedKeyCredPolicy(cred)\n\tconOptions := shared.GetClientOptions(options)\n\tplOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}}\n\n\tazClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn (*Client)(base.NewBlobClient(blobURL, azClient, cred, (*base.ClientOptions)(conOptions))), nil\n}\n\n// NewClientFromConnectionString creates an instance of Client with the specified values.\n//   - connectionString - a connection string for the desired storage account\n//   - containerName - the name of the container within the storage account\n//   - blobName - the name of the blob within the container\n//   - options - client options; pass nil to accept the default values\nfunc NewClientFromConnectionString(connectionString, containerName, blobName string, options *ClientOptions) (*Client, error) {\n\tparsed, err := shared.ParseConnectionString(connectionString)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tparsed.ServiceURL = runtime.JoinPaths(parsed.ServiceURL, containerName, blobName)\n\n\tif parsed.AccountKey != \"\" && parsed.AccountName != \"\" {\n\t\tcredential, err := exported.NewSharedKeyCredential(parsed.AccountName, parsed.AccountKey)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn NewClientWithSharedKeyCredential(parsed.ServiceURL, credential, options)\n\t}\n\n\treturn NewClientWithNoCredential(parsed.ServiceURL, options)\n}\n\nfunc (b *Client) generated() *generated.BlobClient {\n\treturn base.InnerClient((*base.Client[generated.BlobClient])(b))\n}\n\nfunc (b *Client) sharedKey() *SharedKeyCredential {\n\treturn base.SharedKey((*base.Client[generated.BlobClient])(b))\n}\n\nfunc (b *Client) credential() any {\n\treturn base.Credential((*base.Client[generated.BlobClient])(b))\n}\n\nfunc (b *Client) getClientOptions() *base.ClientOptions {\n\treturn base.GetClientOptions((*base.Client[generated.BlobClient])(b))\n}\n\n// URL returns the URL endpoint used by the Client object.\nfunc (b *Client) URL() string {\n\treturn b.generated().Endpoint()\n}\n\n// WithSnapshot creates a new Client object identical to the source but with the specified snapshot timestamp.\n// Pass \"\" to remove the snapshot returning a URL to the base blob.\nfunc (b *Client) WithSnapshot(snapshot string) (*Client, error) {\n\tp, err := ParseURL(b.URL())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.Snapshot = snapshot\n\n\treturn (*Client)(base.NewBlobClient(p.String(), b.generated().InternalClient(), b.credential(), b.getClientOptions())), nil\n}\n\n// WithVersionID creates a new AppendBlobURL object identical to the source but with the specified version id.\n// Pass \"\" to remove the versionID returning a URL to the base blob.\nfunc (b *Client) WithVersionID(versionID string) (*Client, error) {\n\tp, err := ParseURL(b.URL())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.VersionID = versionID\n\n\treturn (*Client)(base.NewBlobClient(p.String(), b.generated().InternalClient(), b.credential(), b.getClientOptions())), nil\n}\n\n// Delete marks the specified blob or snapshot for deletion. The blob is later deleted during garbage collection.\n// Note that deleting a blob also deletes all its snapshots.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-blob.\nfunc (b *Client) Delete(ctx context.Context, o *DeleteOptions) (DeleteResponse, error) {\n\tdeleteOptions, leaseInfo, accessConditions := o.format()\n\tresp, err := b.generated().Delete(ctx, deleteOptions, leaseInfo, accessConditions)\n\treturn resp, err\n}\n\n// Undelete restores the contents and metadata of a soft-deleted blob and any associated soft-deleted snapshots.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/undelete-blob.\nfunc (b *Client) Undelete(ctx context.Context, o *UndeleteOptions) (UndeleteResponse, error) {\n\tundeleteOptions := o.format()\n\tresp, err := b.generated().Undelete(ctx, undeleteOptions)\n\treturn resp, err\n}\n\n// SetTier operation sets the tier on a blob. The operation is allowed on a page\n// blob in a premium storage account and on a block blob in a blob storage account (locally\n// redundant storage only). A premium page blob's tier determines the allowed size, IOPs, and\n// bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive storage type. This operation\n// does not update the blob's ETag.\n// For detailed information about block blob level tiers see https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-storage-tiers.\nfunc (b *Client) SetTier(ctx context.Context, tier AccessTier, o *SetTierOptions) (SetTierResponse, error) {\n\topts, leaseAccessConditions, modifiedAccessConditions := o.format()\n\tresp, err := b.generated().SetTier(ctx, tier, opts, leaseAccessConditions, modifiedAccessConditions)\n\treturn resp, err\n}\n\n// GetProperties returns the blob's properties.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob-properties.\nfunc (b *Client) GetProperties(ctx context.Context, options *GetPropertiesOptions) (GetPropertiesResponse, error) {\n\topts, leaseAccessConditions, cpkInfo, modifiedAccessConditions := options.format()\n\tresp, err := b.generated().GetProperties(ctx, opts, leaseAccessConditions, cpkInfo, modifiedAccessConditions)\n\treturn resp, err\n}\n\n// SetHTTPHeaders changes a blob's HTTP headers.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties.\nfunc (b *Client) SetHTTPHeaders(ctx context.Context, httpHeaders HTTPHeaders, o *SetHTTPHeadersOptions) (SetHTTPHeadersResponse, error) {\n\topts, leaseAccessConditions, modifiedAccessConditions := o.format()\n\tresp, err := b.generated().SetHTTPHeaders(ctx, opts, &httpHeaders, leaseAccessConditions, modifiedAccessConditions)\n\treturn resp, err\n}\n\n// SetMetadata changes a blob's metadata.\n// https://docs.microsoft.com/rest/api/storageservices/set-blob-metadata.\nfunc (b *Client) SetMetadata(ctx context.Context, metadata map[string]*string, o *SetMetadataOptions) (SetMetadataResponse, error) {\n\tbasics := generated.BlobClientSetMetadataOptions{Metadata: metadata}\n\tleaseAccessConditions, cpkInfo, cpkScope, modifiedAccessConditions := o.format()\n\tresp, err := b.generated().SetMetadata(ctx, &basics, leaseAccessConditions, cpkInfo, cpkScope, modifiedAccessConditions)\n\treturn resp, err\n}\n\n// CreateSnapshot creates a read-only snapshot of a blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/snapshot-blob.\nfunc (b *Client) CreateSnapshot(ctx context.Context, options *CreateSnapshotOptions) (CreateSnapshotResponse, error) {\n\t// CreateSnapshot does NOT panic if the user tries to create a snapshot using a URL that already has a snapshot query parameter\n\t// because checking this would be a performance hit for a VERY unusual path, and we don't think the common case should suffer this\n\t// performance hit.\n\topts, cpkInfo, cpkScope, modifiedAccessConditions, leaseAccessConditions := options.format()\n\tresp, err := b.generated().CreateSnapshot(ctx, opts, cpkInfo, cpkScope, modifiedAccessConditions, leaseAccessConditions)\n\n\treturn resp, err\n}\n\n// StartCopyFromURL copies the data at the source URL to a blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/copy-blob.\nfunc (b *Client) StartCopyFromURL(ctx context.Context, copySource string, options *StartCopyFromURLOptions) (StartCopyFromURLResponse, error) {\n\topts, sourceModifiedAccessConditions, modifiedAccessConditions, leaseAccessConditions := options.format()\n\tresp, err := b.generated().StartCopyFromURL(ctx, copySource, opts, sourceModifiedAccessConditions, modifiedAccessConditions, leaseAccessConditions)\n\treturn resp, err\n}\n\n// AbortCopyFromURL stops a pending copy that was previously started and leaves a destination blob with 0 length and metadata.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/abort-copy-blob.\nfunc (b *Client) AbortCopyFromURL(ctx context.Context, copyID string, options *AbortCopyFromURLOptions) (AbortCopyFromURLResponse, error) {\n\topts, leaseAccessConditions := options.format()\n\tresp, err := b.generated().AbortCopyFromURL(ctx, copyID, opts, leaseAccessConditions)\n\treturn resp, err\n}\n\n// SetTags operation enables users to set tags on a blob or specific blob version, but not snapshot.\n// Each call to this operation replaces all existing tags attached to the blob.\n// To remove all tags from the blob, call this operation with no tags set.\n// https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-tags\nfunc (b *Client) SetTags(ctx context.Context, tags map[string]string, options *SetTagsOptions) (SetTagsResponse, error) {\n\tserializedTags := shared.SerializeBlobTags(tags)\n\tblobSetTagsOptions, modifiedAccessConditions, leaseAccessConditions := options.format()\n\tresp, err := b.generated().SetTags(ctx, *serializedTags, blobSetTagsOptions, modifiedAccessConditions, leaseAccessConditions)\n\treturn resp, err\n}\n\n// GetTags operation enables users to get tags on a blob or specific blob version, or snapshot.\n// https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-tags\nfunc (b *Client) GetTags(ctx context.Context, options *GetTagsOptions) (GetTagsResponse, error) {\n\tblobGetTagsOptions, modifiedAccessConditions, leaseAccessConditions := options.format()\n\tresp, err := b.generated().GetTags(ctx, blobGetTagsOptions, modifiedAccessConditions, leaseAccessConditions)\n\treturn resp, err\n\n}\n\n// SetImmutabilityPolicy operation enables users to set the immutability policy on a blob. Mode defaults to \"Unlocked\".\n// https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview\nfunc (b *Client) SetImmutabilityPolicy(ctx context.Context, expiryTime time.Time, options *SetImmutabilityPolicyOptions) (SetImmutabilityPolicyResponse, error) {\n\tblobSetImmutabilityPolicyOptions, modifiedAccessConditions := options.format()\n\tblobSetImmutabilityPolicyOptions.ImmutabilityPolicyExpiry = &expiryTime\n\tresp, err := b.generated().SetImmutabilityPolicy(ctx, blobSetImmutabilityPolicyOptions, modifiedAccessConditions)\n\treturn resp, err\n}\n\n// DeleteImmutabilityPolicy operation enables users to delete the immutability policy on a blob.\n// https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview\nfunc (b *Client) DeleteImmutabilityPolicy(ctx context.Context, options *DeleteImmutabilityPolicyOptions) (DeleteImmutabilityPolicyResponse, error) {\n\tdeleteImmutabilityOptions := options.format()\n\tresp, err := b.generated().DeleteImmutabilityPolicy(ctx, deleteImmutabilityOptions)\n\treturn resp, err\n}\n\n// SetLegalHold operation enables users to set legal hold on a blob.\n// https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview\nfunc (b *Client) SetLegalHold(ctx context.Context, legalHold bool, options *SetLegalHoldOptions) (SetLegalHoldResponse, error) {\n\tsetLegalHoldOptions := options.format()\n\tresp, err := b.generated().SetLegalHold(ctx, legalHold, setLegalHoldOptions)\n\treturn resp, err\n}\n\n// CopyFromURL synchronously copies the data at the source URL to a block blob, with sizes up to 256 MB.\n// For more information, see https://docs.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url.\nfunc (b *Client) CopyFromURL(ctx context.Context, copySource string, options *CopyFromURLOptions) (CopyFromURLResponse, error) {\n\tcopyOptions, smac, mac, lac, cpkScopeInfo := options.format()\n\tresp, err := b.generated().CopyFromURL(ctx, copySource, copyOptions, smac, mac, lac, cpkScopeInfo)\n\treturn resp, err\n}\n\n// GetAccountInfo provides account level information\n// For more information, see https://learn.microsoft.com/en-us/rest/api/storageservices/get-account-information?tabs=shared-access-signatures.\nfunc (b *Client) GetAccountInfo(ctx context.Context, o *GetAccountInfoOptions) (GetAccountInfoResponse, error) {\n\tgetAccountInfoOptions := o.format()\n\tresp, err := b.generated().GetAccountInfo(ctx, getAccountInfoOptions)\n\treturn resp, err\n}\n\n// GetSASURL is a convenience method for generating a SAS token for the currently pointed at blob.\n// It can only be used if the credential supplied during creation was a SharedKeyCredential.\nfunc (b *Client) GetSASURL(permissions sas.BlobPermissions, expiry time.Time, o *GetSASURLOptions) (string, error) {\n\tif b.sharedKey() == nil {\n\t\treturn \"\", bloberror.MissingSharedKeyCredential\n\t}\n\n\turlParts, err := ParseURL(b.URL())\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tt, err := time.Parse(SnapshotTimeFormat, urlParts.Snapshot)\n\n\tif err != nil {\n\t\tt = time.Time{}\n\t}\n\tst := o.format()\n\n\tqps, err := sas.BlobSignatureValues{\n\t\tContainerName: urlParts.ContainerName,\n\t\tBlobName:      urlParts.BlobName,\n\t\tSnapshotTime:  t,\n\t\tVersion:       sas.Version,\n\t\tPermissions:   permissions.String(),\n\t\tStartTime:     st,\n\t\tExpiryTime:    expiry.UTC(),\n\t}.SignWithSharedKey(b.sharedKey())\n\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tendpoint := b.URL() + \"?\" + qps.Encode()\n\n\treturn endpoint, nil\n}\n\n// Concurrent Download Functions -----------------------------------------------------------------------------------------\n\n// downloadBuffer downloads an Azure blob to a WriterAt in parallel.\nfunc (b *Client) downloadBuffer(ctx context.Context, writer io.WriterAt, o downloadOptions) (int64, error) {\n\tif o.BlockSize == 0 {\n\t\to.BlockSize = DefaultDownloadBlockSize\n\t}\n\tdataDownloaded := int64(0)\n\tcomputeReadLength := true\n\tcount := o.Range.Count\n\tif count == CountToEnd { // If size not specified, calculate it\n\t\t// If we don't have the length at all, get it\n\t\tgr, err := b.GetProperties(ctx, o.getBlobPropertiesOptions())\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tcount = *gr.ContentLength - o.Range.Offset\n\t\tdataDownloaded = count\n\t\tcomputeReadLength = false\n\t}\n\n\tif count <= 0 {\n\t\t// The file is empty, there is nothing to download.\n\t\treturn 0, nil\n\t}\n\n\t// Prepare and do parallel download.\n\tprogress := int64(0)\n\tprogressLock := &sync.Mutex{}\n\n\terr := shared.DoBatchTransfer(ctx, &shared.BatchTransferOptions{\n\t\tOperationName: \"downloadBlobToWriterAt\",\n\t\tTransferSize:  count,\n\t\tChunkSize:     o.BlockSize,\n\t\tNumChunks:     uint64(((count - 1) / o.BlockSize) + 1),\n\t\tConcurrency:   o.Concurrency,\n\t\tOperation: func(ctx context.Context, chunkStart int64, count int64) error {\n\t\t\tdownloadBlobOptions := o.getDownloadBlobOptions(HTTPRange{\n\t\t\t\tOffset: chunkStart + o.Range.Offset,\n\t\t\t\tCount:  count,\n\t\t\t}, nil)\n\t\t\tdr, err := b.DownloadStream(ctx, downloadBlobOptions)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tvar body io.ReadCloser = dr.NewRetryReader(ctx, &o.RetryReaderOptionsPerBlock)\n\t\t\tif o.Progress != nil {\n\t\t\t\trangeProgress := int64(0)\n\t\t\t\tbody = streaming.NewResponseProgress(\n\t\t\t\t\tbody,\n\t\t\t\t\tfunc(bytesTransferred int64) {\n\t\t\t\t\t\tdiff := bytesTransferred - rangeProgress\n\t\t\t\t\t\trangeProgress = bytesTransferred\n\t\t\t\t\t\tprogressLock.Lock()\n\t\t\t\t\t\tprogress += diff\n\t\t\t\t\t\to.Progress(progress)\n\t\t\t\t\t\tprogressLock.Unlock()\n\t\t\t\t\t})\n\t\t\t}\n\t\t\t_, err = io.Copy(shared.NewSectionWriter(writer, chunkStart, count), body)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif computeReadLength {\n\t\t\t\tatomic.AddInt64(&dataDownloaded, *dr.ContentLength)\n\t\t\t}\n\t\t\terr = body.Close()\n\t\t\treturn err\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn dataDownloaded, nil\n}\n\n// DownloadStream reads a range of bytes from a blob. The response also includes the blob's properties and metadata.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob.\nfunc (b *Client) DownloadStream(ctx context.Context, o *DownloadStreamOptions) (DownloadStreamResponse, error) {\n\tdownloadOptions, leaseAccessConditions, cpkInfo, modifiedAccessConditions := o.format()\n\tif o == nil {\n\t\to = &DownloadStreamOptions{}\n\t}\n\n\tdr, err := b.generated().Download(ctx, downloadOptions, leaseAccessConditions, cpkInfo, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn DownloadStreamResponse{}, err\n\t}\n\n\treturn DownloadStreamResponse{\n\t\tclient:                 b,\n\t\tDownloadResponse:       dr,\n\t\tgetInfo:                httpGetterInfo{Range: o.Range, ETag: dr.ETag},\n\t\tObjectReplicationRules: deserializeORSPolicies(dr.ObjectReplicationRules),\n\t\tcpkInfo:                o.CPKInfo,\n\t\tcpkScope:               o.CPKScopeInfo,\n\t}, err\n}\n\n// DownloadBuffer downloads an Azure blob to a buffer with parallel.\nfunc (b *Client) DownloadBuffer(ctx context.Context, buffer []byte, o *DownloadBufferOptions) (int64, error) {\n\tif o == nil {\n\t\to = &DownloadBufferOptions{}\n\t}\n\treturn b.downloadBuffer(ctx, shared.NewBytesWriter(buffer), (downloadOptions)(*o))\n}\n\n// DownloadFile downloads an Azure blob to a local file.\n// The file would be truncated if the size doesn't match.\nfunc (b *Client) DownloadFile(ctx context.Context, file *os.File, o *DownloadFileOptions) (int64, error) {\n\tif o == nil {\n\t\to = &DownloadFileOptions{}\n\t}\n\tdo := (*downloadOptions)(o)\n\n\t// 1. Calculate the size of the destination file\n\tvar size int64\n\n\tcount := do.Range.Count\n\tif count == CountToEnd {\n\t\t// Try to get Azure blob's size\n\t\tgetBlobPropertiesOptions := do.getBlobPropertiesOptions()\n\t\tprops, err := b.GetProperties(ctx, getBlobPropertiesOptions)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tsize = *props.ContentLength - do.Range.Offset\n\t\tdo.Range.Count = size\n\t} else {\n\t\tsize = count\n\t}\n\n\t// 2. Compare and try to resize local file's size if it doesn't match Azure blob's size.\n\tstat, err := file.Stat()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif stat.Size() != size {\n\t\tif err = file.Truncate(size); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t}\n\n\tif size > 0 {\n\t\treturn b.downloadBuffer(ctx, file, *do)\n\t} else { // if the blob's size is 0, there is no need in downloading it\n\t\treturn 0, nil\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob/constants.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage blob\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared\"\n)\n\nconst (\n\tCountToEnd = 0\n\n\tSnapshotTimeFormat = exported.SnapshotTimeFormat\n\n\t// DefaultDownloadBlockSize is default block size\n\tDefaultDownloadBlockSize = int64(4 * 1024 * 1024) // 4MB\n\n\t// DefaultConcurrency is the default number of blocks downloaded or uploaded in parallel\n\tDefaultConcurrency = shared.DefaultConcurrency\n)\n\n// BlobType defines values for BlobType\ntype BlobType = generated.BlobType\n\nconst (\n\tBlobTypeBlockBlob  BlobType = generated.BlobTypeBlockBlob\n\tBlobTypePageBlob   BlobType = generated.BlobTypePageBlob\n\tBlobTypeAppendBlob BlobType = generated.BlobTypeAppendBlob\n)\n\n// PossibleBlobTypeValues returns the possible values for the BlobType const type.\nfunc PossibleBlobTypeValues() []BlobType {\n\treturn generated.PossibleBlobTypeValues()\n}\n\n// DeleteSnapshotsOptionType defines values for DeleteSnapshotsOptionType\ntype DeleteSnapshotsOptionType = generated.DeleteSnapshotsOptionType\n\nconst (\n\tDeleteSnapshotsOptionTypeInclude DeleteSnapshotsOptionType = generated.DeleteSnapshotsOptionTypeInclude\n\tDeleteSnapshotsOptionTypeOnly    DeleteSnapshotsOptionType = generated.DeleteSnapshotsOptionTypeOnly\n)\n\n// PossibleDeleteSnapshotsOptionTypeValues returns the possible values for the DeleteSnapshotsOptionType const type.\nfunc PossibleDeleteSnapshotsOptionTypeValues() []DeleteSnapshotsOptionType {\n\treturn generated.PossibleDeleteSnapshotsOptionTypeValues()\n}\n\n// AccessTier defines values for Blob Access Tier.\ntype AccessTier = generated.AccessTier\n\nconst (\n\tAccessTierArchive AccessTier = generated.AccessTierArchive\n\tAccessTierCool    AccessTier = generated.AccessTierCool\n\tAccessTierCold    AccessTier = generated.AccessTierCold\n\tAccessTierHot     AccessTier = generated.AccessTierHot\n\tAccessTierP10     AccessTier = generated.AccessTierP10\n\tAccessTierP15     AccessTier = generated.AccessTierP15\n\tAccessTierP20     AccessTier = generated.AccessTierP20\n\tAccessTierP30     AccessTier = generated.AccessTierP30\n\tAccessTierP4      AccessTier = generated.AccessTierP4\n\tAccessTierP40     AccessTier = generated.AccessTierP40\n\tAccessTierP50     AccessTier = generated.AccessTierP50\n\tAccessTierP6      AccessTier = generated.AccessTierP6\n\tAccessTierP60     AccessTier = generated.AccessTierP60\n\tAccessTierP70     AccessTier = generated.AccessTierP70\n\tAccessTierP80     AccessTier = generated.AccessTierP80\n\tAccessTierPremium AccessTier = generated.AccessTierPremium\n)\n\n// PossibleAccessTierValues returns the possible values for the AccessTier const type.\nfunc PossibleAccessTierValues() []AccessTier {\n\treturn generated.PossibleAccessTierValues()\n}\n\n// RehydratePriority - If an object is in rehydrate pending state then this header is returned with priority of rehydrate.\n// Valid values are High and Standard.\ntype RehydratePriority = generated.RehydratePriority\n\nconst (\n\tRehydratePriorityHigh     RehydratePriority = generated.RehydratePriorityHigh\n\tRehydratePriorityStandard RehydratePriority = generated.RehydratePriorityStandard\n)\n\n// PossibleRehydratePriorityValues returns the possible values for the RehydratePriority const type.\nfunc PossibleRehydratePriorityValues() []RehydratePriority {\n\treturn generated.PossibleRehydratePriorityValues()\n}\n\n// ImmutabilityPolicyMode defines values for ImmutabilityPolicyMode\ntype ImmutabilityPolicyMode = generated.ImmutabilityPolicyMode\n\nconst (\n\tImmutabilityPolicyModeMutable  ImmutabilityPolicyMode = generated.ImmutabilityPolicyModeMutable\n\tImmutabilityPolicyModeUnlocked ImmutabilityPolicyMode = generated.ImmutabilityPolicyModeUnlocked\n\tImmutabilityPolicyModeLocked   ImmutabilityPolicyMode = generated.ImmutabilityPolicyModeLocked\n)\n\n// PossibleImmutabilityPolicyModeValues returns the possible values for the ImmutabilityPolicyMode const type.\nfunc PossibleImmutabilityPolicyModeValues() []ImmutabilityPolicyMode {\n\treturn generated.PossibleImmutabilityPolicyModeValues()\n}\n\n// ImmutabilityPolicySetting returns the possible values for the ImmutabilityPolicySetting const type.\ntype ImmutabilityPolicySetting = generated.ImmutabilityPolicySetting\n\nconst (\n\tImmutabilityPolicySettingUnlocked ImmutabilityPolicySetting = generated.ImmutabilityPolicySettingUnlocked\n\tImmutabilityPolicySettingLocked   ImmutabilityPolicySetting = generated.ImmutabilityPolicySettingLocked\n)\n\n// PossibleImmutabilityPolicySettingValues returns the possible values for the ImmutabilityPolicySetting const type.\nfunc PossibleImmutabilityPolicySettingValues() []ImmutabilityPolicySetting {\n\treturn generated.PossibleImmutabilityPolicySettingValues()\n}\n\n// CopyStatusType defines values for CopyStatusType\ntype CopyStatusType = generated.CopyStatusType\n\nconst (\n\tCopyStatusTypePending CopyStatusType = generated.CopyStatusTypePending\n\tCopyStatusTypeSuccess CopyStatusType = generated.CopyStatusTypeSuccess\n\tCopyStatusTypeAborted CopyStatusType = generated.CopyStatusTypeAborted\n\tCopyStatusTypeFailed  CopyStatusType = generated.CopyStatusTypeFailed\n)\n\n// PossibleCopyStatusTypeValues returns the possible values for the CopyStatusType const type.\nfunc PossibleCopyStatusTypeValues() []CopyStatusType {\n\treturn generated.PossibleCopyStatusTypeValues()\n}\n\n// EncryptionAlgorithmType defines values for EncryptionAlgorithmType.\ntype EncryptionAlgorithmType = generated.EncryptionAlgorithmType\n\nconst (\n\tEncryptionAlgorithmTypeNone   EncryptionAlgorithmType = generated.EncryptionAlgorithmTypeNone\n\tEncryptionAlgorithmTypeAES256 EncryptionAlgorithmType = generated.EncryptionAlgorithmTypeAES256\n)\n\n// PossibleEncryptionAlgorithmTypeValues returns the possible values for the EncryptionAlgorithmType const type.\nfunc PossibleEncryptionAlgorithmTypeValues() []EncryptionAlgorithmType {\n\treturn generated.PossibleEncryptionAlgorithmTypeValues()\n}\n\n// ArchiveStatus defines values for ArchiveStatus.\ntype ArchiveStatus = generated.ArchiveStatus\n\nconst (\n\tArchiveStatusRehydratePendingToCool ArchiveStatus = generated.ArchiveStatusRehydratePendingToCool\n\tArchiveStatusRehydratePendingToHot  ArchiveStatus = generated.ArchiveStatusRehydratePendingToHot\n\tArchiveStatusRehydratePendingToCold ArchiveStatus = generated.ArchiveStatusRehydratePendingToCold\n)\n\n// PossibleArchiveStatusValues returns the possible values for the ArchiveStatus const type.\nfunc PossibleArchiveStatusValues() []ArchiveStatus {\n\treturn generated.PossibleArchiveStatusValues()\n}\n\n// DeleteType defines values for DeleteType.\ntype DeleteType = generated.DeleteType\n\nconst (\n\tDeleteTypeNone      DeleteType = generated.DeleteTypeNone\n\tDeleteTypePermanent DeleteType = generated.DeleteTypePermanent\n)\n\n// PossibleDeleteTypeValues returns the possible values for the DeleteType const type.\nfunc PossibleDeleteTypeValues() []DeleteType {\n\treturn generated.PossibleDeleteTypeValues()\n}\n\n// QueryFormatType - The quick query format type.\ntype QueryFormatType = generated.QueryFormatType\n\nconst (\n\tQueryFormatTypeDelimited QueryFormatType = generated.QueryFormatTypeDelimited\n\tQueryFormatTypeJSON      QueryFormatType = generated.QueryFormatTypeJSON\n\tQueryFormatTypeArrow     QueryFormatType = generated.QueryFormatTypeArrow\n\tQueryFormatTypeParquet   QueryFormatType = generated.QueryFormatTypeParquet\n)\n\n// PossibleQueryFormatTypeValues returns the possible values for the QueryFormatType const type.\nfunc PossibleQueryFormatTypeValues() []QueryFormatType {\n\treturn generated.PossibleQueryFormatTypeValues()\n}\n\n// TransferValidationType abstracts the various mechanisms used to verify a transfer.\ntype TransferValidationType = exported.TransferValidationType\n\n// TransferValidationTypeCRC64 is a TransferValidationType used to provide a precomputed CRC64.\ntype TransferValidationTypeCRC64 = exported.TransferValidationTypeCRC64\n\n// TransferValidationTypeComputeCRC64 is a TransferValidationType that indicates a CRC64 should be computed during transfer.\nfunc TransferValidationTypeComputeCRC64() TransferValidationType {\n\treturn exported.TransferValidationTypeComputeCRC64()\n}\n\n// TransferValidationTypeMD5 is a TransferValidationType used to provide a precomputed MD5.\ntype TransferValidationTypeMD5 = exported.TransferValidationTypeMD5\n\n// SourceContentValidationType abstracts the various mechanisms used to validate source content.\n// This interface is not publicly implementable.\ntype SourceContentValidationType interface {\n\tApply(generated.SourceContentSetter)\n\tnotPubliclyImplementable()\n}\n\n// SourceContentValidationTypeCRC64 is a SourceContentValidationType used to provide a precomputed CRC64.\ntype SourceContentValidationTypeCRC64 []byte\n\n// Apply implements the SourceContentValidationType interface for type SourceContentValidationTypeCRC64.\nfunc (s SourceContentValidationTypeCRC64) Apply(src generated.SourceContentSetter) {\n\tsrc.SetSourceContentCRC64(s)\n}\n\nfunc (SourceContentValidationTypeCRC64) notPubliclyImplementable() {}\n\nvar _ SourceContentValidationType = (SourceContentValidationTypeCRC64)(nil)\n\n// SourceContentValidationTypeMD5 is a SourceContentValidationType used to provide a precomputed MD5.\ntype SourceContentValidationTypeMD5 []byte\n\n// Apply implements the SourceContentValidationType interface for type SourceContentValidationTypeMD5.\nfunc (s SourceContentValidationTypeMD5) Apply(src generated.SourceContentSetter) {\n\tsrc.SetSourceContentMD5(s)\n}\n\nfunc (SourceContentValidationTypeMD5) notPubliclyImplementable() {}\n\nvar _ SourceContentValidationType = (SourceContentValidationTypeMD5)(nil)\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob/models.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage blob\n\nimport (\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared\"\n)\n\n// SharedKeyCredential contains an account's name and its primary or secondary key.\ntype SharedKeyCredential = exported.SharedKeyCredential\n\n// NewSharedKeyCredential creates an immutable SharedKeyCredential containing the\n// storage account's name and either its primary or secondary key.\nfunc NewSharedKeyCredential(accountName, accountKey string) (*SharedKeyCredential, error) {\n\treturn exported.NewSharedKeyCredential(accountName, accountKey)\n}\n\n// Type Declarations ---------------------------------------------------------------------\n\n// AccessConditions identifies blob-specific access conditions which you optionally set.\ntype AccessConditions = exported.BlobAccessConditions\n\n// LeaseAccessConditions contains optional parameters to access leased entity.\ntype LeaseAccessConditions = exported.LeaseAccessConditions\n\n// ModifiedAccessConditions contains a group of parameters for specifying access conditions.\ntype ModifiedAccessConditions = exported.ModifiedAccessConditions\n\n// CPKInfo contains a group of parameters for client provided encryption key.\ntype CPKInfo = generated.CPKInfo\n\n// CPKScopeInfo contains a group of parameters for client provided encryption scope.\ntype CPKScopeInfo = generated.CPKScopeInfo\n\n// HTTPHeaders contains a group of parameters for the BlobClient.SetHTTPHeaders method.\ntype HTTPHeaders = generated.BlobHTTPHeaders\n\n// SourceModifiedAccessConditions contains a group of parameters for the BlobClient.StartCopyFromURL method.\ntype SourceModifiedAccessConditions = generated.SourceModifiedAccessConditions\n\n// Tags represent map of blob index tags\ntype Tags = generated.BlobTag\n\n// HTTPRange defines a range of bytes within an HTTP resource, starting at offset and\n// ending at offset+count. A zero-value HTTPRange indicates the entire resource. An HTTPRange\n// which has an offset and zero value count indicates from the offset to the resource's end.\ntype HTTPRange = exported.HTTPRange\n\n// Request Model Declaration -------------------------------------------------------------------------------------------\n\n// DownloadStreamOptions contains the optional parameters for the Client.Download method.\ntype DownloadStreamOptions struct {\n\t// When set to true and specified together with the Range, the service returns the MD5 hash for the range, as long as the\n\t// range is less than or equal to 4 MB in size.\n\tRangeGetContentMD5 *bool\n\n\t// Range specifies a range of bytes.  The default value is all bytes.\n\tRange HTTPRange\n\n\tAccessConditions *AccessConditions\n\tCPKInfo          *CPKInfo\n\tCPKScopeInfo     *CPKScopeInfo\n}\n\nfunc (o *DownloadStreamOptions) format() (*generated.BlobClientDownloadOptions, *generated.LeaseAccessConditions, *generated.CPKInfo, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil\n\t}\n\n\tbasics := generated.BlobClientDownloadOptions{\n\t\tRangeGetContentMD5: o.RangeGetContentMD5,\n\t\tRange:              exported.FormatHTTPRange(o.Range),\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn &basics, leaseAccessConditions, o.CPKInfo, modifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// downloadOptions contains common options used by the DownloadBuffer and DownloadFile functions.\ntype downloadOptions struct {\n\t// Range specifies a range of bytes.  The default value is all bytes.\n\tRange HTTPRange\n\n\t// BlockSize specifies the block size to use for each parallel download; the default size is DefaultDownloadBlockSize.\n\tBlockSize int64\n\n\t// Progress is a function that is invoked periodically as bytes are received.\n\tProgress func(bytesTransferred int64)\n\n\t// BlobAccessConditions indicates the access conditions used when making HTTP GET requests against the blob.\n\tAccessConditions *AccessConditions\n\n\t// ClientProvidedKeyOptions indicates the client provided key by name and/or by value to encrypt/decrypt data.\n\tCPKInfo      *CPKInfo\n\tCPKScopeInfo *CPKScopeInfo\n\n\t// Concurrency indicates the maximum number of blocks to download in parallel (0=default).\n\tConcurrency uint16\n\n\t// RetryReaderOptionsPerBlock is used when downloading each block.\n\tRetryReaderOptionsPerBlock RetryReaderOptions\n}\n\nfunc (o *downloadOptions) getBlobPropertiesOptions() *GetPropertiesOptions {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &GetPropertiesOptions{\n\t\tAccessConditions: o.AccessConditions,\n\t\tCPKInfo:          o.CPKInfo,\n\t}\n}\n\nfunc (o *downloadOptions) getDownloadBlobOptions(rnge HTTPRange, rangeGetContentMD5 *bool) *DownloadStreamOptions {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &DownloadStreamOptions{\n\t\tAccessConditions:   o.AccessConditions,\n\t\tCPKInfo:            o.CPKInfo,\n\t\tCPKScopeInfo:       o.CPKScopeInfo,\n\t\tRange:              rnge,\n\t\tRangeGetContentMD5: rangeGetContentMD5,\n\t}\n}\n\n// DownloadBufferOptions contains the optional parameters for the DownloadBuffer method.\ntype DownloadBufferOptions struct {\n\t// Range specifies a range of bytes.  The default value is all bytes.\n\tRange HTTPRange\n\n\t// BlockSize specifies the block size to use for each parallel download; the default size is DefaultDownloadBlockSize.\n\tBlockSize int64\n\n\t// Progress is a function that is invoked periodically as bytes are received.\n\tProgress func(bytesTransferred int64)\n\n\t// BlobAccessConditions indicates the access conditions used when making HTTP GET requests against the blob.\n\tAccessConditions *AccessConditions\n\n\t// CPKInfo contains a group of parameters for client provided encryption key.\n\tCPKInfo *CPKInfo\n\n\t// CPKScopeInfo contains a group of parameters for client provided encryption scope.\n\tCPKScopeInfo *CPKScopeInfo\n\n\t// Concurrency indicates the maximum number of blocks to download in parallel (0=default).\n\tConcurrency uint16\n\n\t// RetryReaderOptionsPerBlock is used when downloading each block.\n\tRetryReaderOptionsPerBlock RetryReaderOptions\n}\n\n// DownloadFileOptions contains the optional parameters for the DownloadFile method.\ntype DownloadFileOptions struct {\n\t// Range specifies a range of bytes.  The default value is all bytes.\n\tRange HTTPRange\n\n\t// BlockSize specifies the block size to use for each parallel download; the default size is DefaultDownloadBlockSize.\n\tBlockSize int64\n\n\t// Progress is a function that is invoked periodically as bytes are received.\n\tProgress func(bytesTransferred int64)\n\n\t// BlobAccessConditions indicates the access conditions used when making HTTP GET requests against the blob.\n\tAccessConditions *AccessConditions\n\n\t// ClientProvidedKeyOptions indicates the client provided key by name and/or by value to encrypt/decrypt data.\n\tCPKInfo      *CPKInfo\n\tCPKScopeInfo *CPKScopeInfo\n\n\t// Concurrency indicates the maximum number of blocks to download in parallel.  The default value is 5.\n\tConcurrency uint16\n\n\t// RetryReaderOptionsPerBlock is used when downloading each block.\n\tRetryReaderOptionsPerBlock RetryReaderOptions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// DeleteOptions contains the optional parameters for the Client.Delete method.\ntype DeleteOptions struct {\n\t// Required if the blob has associated snapshots. Specify one of the following two options: include: Delete the base blob\n\t// and all of its snapshots. only: Delete only the blob's snapshots and not the blob itself.\n\tDeleteSnapshots  *DeleteSnapshotsOptionType\n\tAccessConditions *AccessConditions\n\t// Setting DeleteType to DeleteTypePermanent will permanently delete soft-delete snapshot and/or version blobs.\n\t// WARNING: This is a dangerous operation and should not be used unless you know the implications. Please proceed\n\t// with caution.\n\t// For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-blob\n\tBlobDeleteType *DeleteType\n}\n\nfunc (o *DeleteOptions) format() (*generated.BlobClientDeleteOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil\n\t}\n\n\tbasics := generated.BlobClientDeleteOptions{\n\t\tDeleteSnapshots: o.DeleteSnapshots,\n\t\tDeleteType:      o.BlobDeleteType, // None by default\n\t}\n\n\tif o.AccessConditions == nil {\n\t\treturn &basics, nil, nil\n\t}\n\n\treturn &basics, o.AccessConditions.LeaseAccessConditions, o.AccessConditions.ModifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// UndeleteOptions contains the optional parameters for the Client.Undelete method.\ntype UndeleteOptions struct {\n\t// placeholder for future options\n}\n\nfunc (o *UndeleteOptions) format() *generated.BlobClientUndeleteOptions {\n\treturn nil\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// SetTierOptions contains the optional parameters for the Client.SetTier method.\ntype SetTierOptions struct {\n\t// Optional: Indicates the priority with which to rehydrate an archived blob.\n\tRehydratePriority *RehydratePriority\n\n\tAccessConditions *AccessConditions\n}\n\nfunc (o *SetTierOptions) format() (*generated.BlobClientSetTierOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn &generated.BlobClientSetTierOptions{RehydratePriority: o.RehydratePriority}, leaseAccessConditions, modifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// GetPropertiesOptions contains the optional parameters for the Client.GetProperties method\ntype GetPropertiesOptions struct {\n\tAccessConditions *AccessConditions\n\tCPKInfo          *CPKInfo\n}\n\nfunc (o *GetPropertiesOptions) format() (*generated.BlobClientGetPropertiesOptions,\n\t*generated.LeaseAccessConditions, *generated.CPKInfo, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn nil, leaseAccessConditions, o.CPKInfo, modifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// SetHTTPHeadersOptions contains the optional parameters for the Client.SetHTTPHeaders method.\ntype SetHTTPHeadersOptions struct {\n\tAccessConditions *AccessConditions\n}\n\nfunc (o *SetHTTPHeadersOptions) format() (*generated.BlobClientSetHTTPHeadersOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn nil, leaseAccessConditions, modifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// SetMetadataOptions provides set of configurations for Set Metadata on blob operation\ntype SetMetadataOptions struct {\n\tAccessConditions *AccessConditions\n\tCPKInfo          *CPKInfo\n\tCPKScopeInfo     *CPKScopeInfo\n}\n\nfunc (o *SetMetadataOptions) format() (*generated.LeaseAccessConditions, *CPKInfo,\n\t*CPKScopeInfo, *ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn leaseAccessConditions, o.CPKInfo, o.CPKScopeInfo, modifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// CreateSnapshotOptions contains the optional parameters for the Client.CreateSnapshot method.\ntype CreateSnapshotOptions struct {\n\tMetadata         map[string]*string\n\tAccessConditions *AccessConditions\n\tCPKInfo          *CPKInfo\n\tCPKScopeInfo     *CPKScopeInfo\n}\n\nfunc (o *CreateSnapshotOptions) format() (*generated.BlobClientCreateSnapshotOptions, *generated.CPKInfo,\n\t*generated.CPKScopeInfo, *generated.ModifiedAccessConditions, *generated.LeaseAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil, nil\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\n\treturn &generated.BlobClientCreateSnapshotOptions{\n\t\tMetadata: o.Metadata,\n\t}, o.CPKInfo, o.CPKScopeInfo, modifiedAccessConditions, leaseAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// StartCopyFromURLOptions contains the optional parameters for the Client.StartCopyFromURL method.\ntype StartCopyFromURLOptions struct {\n\t// Specifies the date time when the blobs immutability policy is set to expire.\n\tImmutabilityPolicyExpiry *time.Time\n\t// Specifies the immutability policy mode to set on the blob.\n\tImmutabilityPolicyMode *ImmutabilityPolicySetting\n\t// Specified if a legal hold should be set on the blob.\n\tLegalHold *bool\n\t// Optional. Used to set blob tags in various blob operations.\n\tBlobTags map[string]string\n\t// Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the\n\t// operation will copy the metadata from the source blob or file to the destination blob. If one or more name-value pairs\n\t// are specified, the destination blob is created with the specified metadata, and metadata is not copied from the source\n\t// blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers.\n\t// See Naming and Referencing Containers, Blobs, and Metadata for more information.\n\tMetadata map[string]*string\n\t// Optional: Indicates the priority with which to rehydrate an archived blob.\n\tRehydratePriority *RehydratePriority\n\t// Overrides the sealed state of the destination blob. Service version 2019-12-12 and newer.\n\tSealBlob *bool\n\t// Optional. Indicates the tier to be set on the blob.\n\tTier *AccessTier\n\n\tSourceModifiedAccessConditions *SourceModifiedAccessConditions\n\n\tAccessConditions *AccessConditions\n}\n\nfunc (o *StartCopyFromURLOptions) format() (*generated.BlobClientStartCopyFromURLOptions,\n\t*generated.SourceModifiedAccessConditions, *generated.ModifiedAccessConditions, *generated.LeaseAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil\n\t}\n\n\tbasics := generated.BlobClientStartCopyFromURLOptions{\n\t\tBlobTagsString:           shared.SerializeBlobTagsToStrPtr(o.BlobTags),\n\t\tMetadata:                 o.Metadata,\n\t\tRehydratePriority:        o.RehydratePriority,\n\t\tSealBlob:                 o.SealBlob,\n\t\tTier:                     o.Tier,\n\t\tImmutabilityPolicyExpiry: o.ImmutabilityPolicyExpiry,\n\t\tImmutabilityPolicyMode:   o.ImmutabilityPolicyMode,\n\t\tLegalHold:                o.LegalHold,\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn &basics, o.SourceModifiedAccessConditions, modifiedAccessConditions, leaseAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// AbortCopyFromURLOptions contains the optional parameters for the Client.AbortCopyFromURL method.\ntype AbortCopyFromURLOptions struct {\n\tLeaseAccessConditions *LeaseAccessConditions\n}\n\nfunc (o *AbortCopyFromURLOptions) format() (*generated.BlobClientAbortCopyFromURLOptions, *generated.LeaseAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil\n\t}\n\treturn nil, o.LeaseAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// SetTagsOptions contains the optional parameters for the Client.SetTags method.\ntype SetTagsOptions struct {\n\t// The version id parameter is an opaque DateTime value that, when present,\n\t// specifies the version of the blob to operate on. It's for service version 2019-10-10 and newer.\n\tVersionID *string\n\t// Optional header, Specifies the transactional crc64 for the body, to be validated by the service.\n\tTransactionalContentCRC64 []byte\n\t// Optional header, Specifies the transactional md5 for the body, to be validated by the service.\n\tTransactionalContentMD5 []byte\n\n\tAccessConditions *AccessConditions\n}\n\nfunc (o *SetTagsOptions) format() (*generated.BlobClientSetTagsOptions, *ModifiedAccessConditions, *generated.LeaseAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil\n\t}\n\n\toptions := &generated.BlobClientSetTagsOptions{\n\t\tTransactionalContentMD5:   o.TransactionalContentMD5,\n\t\tTransactionalContentCRC64: o.TransactionalContentCRC64,\n\t\tVersionID:                 o.VersionID,\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn options, modifiedAccessConditions, leaseAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// GetTagsOptions contains the optional parameters for the Client.GetTags method.\ntype GetTagsOptions struct {\n\t// The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve.\n\tSnapshot *string\n\t// The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on.\n\t// It's for service version 2019-10-10 and newer.\n\tVersionID *string\n\n\tBlobAccessConditions *AccessConditions\n}\n\nfunc (o *GetTagsOptions) format() (*generated.BlobClientGetTagsOptions, *generated.ModifiedAccessConditions, *generated.LeaseAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil\n\t}\n\n\toptions := &generated.BlobClientGetTagsOptions{\n\t\tSnapshot:  o.Snapshot,\n\t\tVersionID: o.VersionID,\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.BlobAccessConditions)\n\treturn options, modifiedAccessConditions, leaseAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// SetImmutabilityPolicyOptions contains the parameter for Client.SetImmutabilityPolicy\ntype SetImmutabilityPolicyOptions struct {\n\t// Specifies the immutability policy mode to set on the blob. Possible values to set include: \"Locked\", \"Unlocked\".\n\t// \"Mutable\" can only be returned by service, don't set to \"Mutable\". If mode is not set - it will default to Unlocked.\n\tMode                     *ImmutabilityPolicySetting\n\tModifiedAccessConditions *ModifiedAccessConditions\n}\n\nfunc (o *SetImmutabilityPolicyOptions) format() (*generated.BlobClientSetImmutabilityPolicyOptions, *ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn &generated.BlobClientSetImmutabilityPolicyOptions{}, nil\n\t}\n\tac := &exported.BlobAccessConditions{\n\t\tModifiedAccessConditions: o.ModifiedAccessConditions,\n\t}\n\t_, modifiedAccessConditions := exported.FormatBlobAccessConditions(ac)\n\n\toptions := &generated.BlobClientSetImmutabilityPolicyOptions{\n\t\tImmutabilityPolicyMode: o.Mode,\n\t}\n\n\treturn options, modifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// DeleteImmutabilityPolicyOptions contains the optional parameters for the Client.DeleteImmutabilityPolicy method.\ntype DeleteImmutabilityPolicyOptions struct {\n\t// placeholder for future options\n}\n\nfunc (o *DeleteImmutabilityPolicyOptions) format() *generated.BlobClientDeleteImmutabilityPolicyOptions {\n\treturn nil\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// SetLegalHoldOptions contains the optional parameters for the Client.SetLegalHold method.\ntype SetLegalHoldOptions struct {\n\t// placeholder for future options\n}\n\nfunc (o *SetLegalHoldOptions) format() *generated.BlobClientSetLegalHoldOptions {\n\treturn nil\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// GetSASURLOptions contains the optional parameters for the Client.GetSASURL method.\ntype GetSASURLOptions struct {\n\tStartTime *time.Time\n}\n\nfunc (o *GetSASURLOptions) format() time.Time {\n\tif o == nil {\n\t\treturn time.Time{}\n\t}\n\n\tvar st time.Time\n\tif o.StartTime != nil {\n\t\tst = o.StartTime.UTC()\n\t} else {\n\t\tst = time.Time{}\n\t}\n\treturn st\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// CopyFromURLOptions contains the optional parameters for the Client.CopyFromURL method.\ntype CopyFromURLOptions struct {\n\t// Optional. Used to set blob tags in various blob operations.\n\tBlobTags map[string]string\n\t// Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source.\n\tCopySourceAuthorization *string\n\t// Specifies the date time when the blobs immutability policy is set to expire.\n\tImmutabilityPolicyExpiry *time.Time\n\t// Specifies the immutability policy mode to set on the blob.\n\tImmutabilityPolicyMode *ImmutabilityPolicySetting\n\t// Specified if a legal hold should be set on the blob.\n\tLegalHold *bool\n\t// Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the\n\t// operation will copy the metadata from the source blob or file to the destination\n\t// blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata\n\t// is not copied from the source blob or file. Note that beginning with\n\t// version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers,\n\t// Blobs, and Metadata for more information.\n\tMetadata map[string]*string\n\t// Specify the md5 calculated for the range of bytes that must be read from the copy source.\n\tSourceContentMD5 []byte\n\t// Optional. Indicates the tier to be set on the blob.\n\tTier *AccessTier\n\n\tSourceModifiedAccessConditions *SourceModifiedAccessConditions\n\n\tBlobAccessConditions *AccessConditions\n\n\tCPKScopeInfo *CPKScopeInfo\n}\n\nfunc (o *CopyFromURLOptions) format() (*generated.BlobClientCopyFromURLOptions, *generated.SourceModifiedAccessConditions, *generated.ModifiedAccessConditions, *generated.LeaseAccessConditions, *generated.CPKScopeInfo) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil, nil\n\t}\n\n\toptions := &generated.BlobClientCopyFromURLOptions{\n\t\tBlobTagsString:           shared.SerializeBlobTagsToStrPtr(o.BlobTags),\n\t\tCopySourceAuthorization:  o.CopySourceAuthorization,\n\t\tImmutabilityPolicyExpiry: o.ImmutabilityPolicyExpiry,\n\t\tImmutabilityPolicyMode:   o.ImmutabilityPolicyMode,\n\t\tLegalHold:                o.LegalHold,\n\t\tMetadata:                 o.Metadata,\n\t\tSourceContentMD5:         o.SourceContentMD5,\n\t\tTier:                     o.Tier,\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.BlobAccessConditions)\n\treturn options, o.SourceModifiedAccessConditions, modifiedAccessConditions, leaseAccessConditions, o.CPKScopeInfo\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// GetAccountInfoOptions provides set of options for Client.GetAccountInfo\ntype GetAccountInfoOptions struct {\n\t// placeholder for future options\n}\n\nfunc (o *GetAccountInfoOptions) format() *generated.BlobClientGetAccountInfoOptions {\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob/responses.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage blob\n\nimport (\n\t\"context\"\n\t\"io\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n)\n\n// DownloadResponse contains the response from method BlobClient.Download.\ntype DownloadResponse = generated.BlobClientDownloadResponse\n\n// DownloadStreamResponse contains the response from the DownloadStream method.\n// To read from the stream, read from the Body field, or call the NewRetryReader method.\ntype DownloadStreamResponse struct {\n\tDownloadResponse\n\tObjectReplicationRules []ObjectReplicationPolicy\n\n\tclient   *Client\n\tgetInfo  httpGetterInfo\n\tcpkInfo  *CPKInfo\n\tcpkScope *CPKScopeInfo\n}\n\n// NewRetryReader constructs new RetryReader stream for reading data. If a connection fails while\n// reading, it will make additional requests to reestablish a connection and continue reading.\n// Pass nil for options to accept the default options.\n// Callers of this method should not access the DownloadStreamResponse.Body field.\nfunc (r *DownloadStreamResponse) NewRetryReader(ctx context.Context, options *RetryReaderOptions) *RetryReader {\n\tif options == nil {\n\t\toptions = &RetryReaderOptions{}\n\t}\n\n\treturn newRetryReader(ctx, r.Body, r.getInfo, func(ctx context.Context, getInfo httpGetterInfo) (io.ReadCloser, error) {\n\t\taccessConditions := &AccessConditions{\n\t\t\tModifiedAccessConditions: &ModifiedAccessConditions{IfMatch: getInfo.ETag},\n\t\t}\n\t\toptions := DownloadStreamOptions{\n\t\t\tRange:            getInfo.Range,\n\t\t\tAccessConditions: accessConditions,\n\t\t\tCPKInfo:          r.cpkInfo,\n\t\t\tCPKScopeInfo:     r.cpkScope,\n\t\t}\n\t\tresp, err := r.client.DownloadStream(ctx, &options)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn resp.Body, err\n\t}, *options)\n}\n\n// DeleteResponse contains the response from method BlobClient.Delete.\ntype DeleteResponse = generated.BlobClientDeleteResponse\n\n// UndeleteResponse contains the response from method BlobClient.Undelete.\ntype UndeleteResponse = generated.BlobClientUndeleteResponse\n\n// SetTierResponse contains the response from method BlobClient.SetTier.\ntype SetTierResponse = generated.BlobClientSetTierResponse\n\n// GetPropertiesResponse contains the response from method BlobClient.GetProperties.\ntype GetPropertiesResponse = generated.BlobClientGetPropertiesResponse\n\n// SetHTTPHeadersResponse contains the response from method BlobClient.SetHTTPHeaders.\ntype SetHTTPHeadersResponse = generated.BlobClientSetHTTPHeadersResponse\n\n// SetMetadataResponse contains the response from method BlobClient.SetMetadata.\ntype SetMetadataResponse = generated.BlobClientSetMetadataResponse\n\n// CreateSnapshotResponse contains the response from method BlobClient.CreateSnapshot.\ntype CreateSnapshotResponse = generated.BlobClientCreateSnapshotResponse\n\n// StartCopyFromURLResponse contains the response from method BlobClient.StartCopyFromURL.\ntype StartCopyFromURLResponse = generated.BlobClientStartCopyFromURLResponse\n\n// AbortCopyFromURLResponse contains the response from method BlobClient.AbortCopyFromURL.\ntype AbortCopyFromURLResponse = generated.BlobClientAbortCopyFromURLResponse\n\n// SetTagsResponse contains the response from method BlobClient.SetTags.\ntype SetTagsResponse = generated.BlobClientSetTagsResponse\n\n// GetTagsResponse contains the response from method BlobClient.GetTags.\ntype GetTagsResponse = generated.BlobClientGetTagsResponse\n\n// SetImmutabilityPolicyResponse contains the response from method BlobClient.SetImmutabilityPolicy.\ntype SetImmutabilityPolicyResponse = generated.BlobClientSetImmutabilityPolicyResponse\n\n// DeleteImmutabilityPolicyResponse contains the response from method BlobClient.DeleteImmutabilityPolicyResponse.\ntype DeleteImmutabilityPolicyResponse = generated.BlobClientDeleteImmutabilityPolicyResponse\n\n// SetLegalHoldResponse contains the response from method BlobClient.SetLegalHold.\ntype SetLegalHoldResponse = generated.BlobClientSetLegalHoldResponse\n\n// CopyFromURLResponse contains the response from method BlobClient.CopyFromURL.\ntype CopyFromURLResponse = generated.BlobClientCopyFromURLResponse\n\n// GetAccountInfoResponse contains the response from method BlobClient.GetAccountInfo.\ntype GetAccountInfoResponse = generated.BlobClientGetAccountInfoResponse\n\n// AcquireLeaseResponse contains the response from method BlobClient.AcquireLease.\ntype AcquireLeaseResponse = generated.BlobClientAcquireLeaseResponse\n\n// BreakLeaseResponse contains the response from method BlobClient.BreakLease.\ntype BreakLeaseResponse = generated.BlobClientBreakLeaseResponse\n\n// ChangeLeaseResponse contains the response from method BlobClient.ChangeLease.\ntype ChangeLeaseResponse = generated.BlobClientChangeLeaseResponse\n\n// ReleaseLeaseResponse contains the response from method BlobClient.ReleaseLease.\ntype ReleaseLeaseResponse = generated.BlobClientReleaseLeaseResponse\n\n// RenewLeaseResponse contains the response from method BlobClient.RenewLease.\ntype RenewLeaseResponse = generated.BlobClientRenewLeaseResponse\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob/retry_reader.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage blob\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"net\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n)\n\n// HTTPGetter is a function type that refers to a method that performs an HTTP GET operation.\ntype httpGetter func(ctx context.Context, i httpGetterInfo) (io.ReadCloser, error)\n\n// HTTPGetterInfo is passed to an HTTPGetter function passing it parameters\n// that should be used to make an HTTP GET request.\ntype httpGetterInfo struct {\n\tRange HTTPRange\n\n\t// ETag specifies the resource's etag that should be used when creating\n\t// the HTTP GET request's If-Match header\n\tETag *azcore.ETag\n}\n\n// RetryReaderOptions configures the retry reader's behavior.\n// Zero-value fields will have their specified default values applied during use.\n// This allows for modification of a subset of fields.\ntype RetryReaderOptions struct {\n\t// MaxRetries specifies the maximum number of attempts a failed read will be retried\n\t// before producing an error.\n\t// The default value is three.\n\tMaxRetries int32\n\n\t// OnFailedRead, when non-nil, is called after any failure to read. Expected usage is diagnostic logging.\n\tOnFailedRead func(failureCount int32, lastError error, rnge HTTPRange, willRetry bool)\n\n\t// EarlyCloseAsError can be set to true to prevent retries after \"read on closed response body\". By default,\n\t// retryReader has the following special behaviour: closing the response body before it is all read is treated as a\n\t// retryable error. This is to allow callers to force a retry by closing the body from another goroutine (e.g. if the =\n\t// read is too slow, caller may want to force a retry in the hope that the retry will be quicker).  If\n\t// TreatEarlyCloseAsError is true, then retryReader's special behaviour is suppressed, and \"read on closed body\" is instead\n\t// treated as a fatal (non-retryable) error.\n\t// Note that setting TreatEarlyCloseAsError only guarantees that Closing will produce a fatal error if the Close happens\n\t// from the same \"thread\" (goroutine) as Read.  Concurrent Close calls from other goroutines may instead produce network errors\n\t// which will be retried.\n\t// The default value is false.\n\tEarlyCloseAsError bool\n\n\tdoInjectError      bool\n\tdoInjectErrorRound int32\n\tinjectedError      error\n}\n\n// RetryReader attempts to read from response, and if there is a retry-able network error\n// returned during reading, it will retry according to retry reader option through executing\n// user defined action with provided data to get a new response, and continue the overall reading process\n// through reading from the new response.\n// RetryReader implements the io.ReadCloser interface.\ntype RetryReader struct {\n\tctx                context.Context\n\tinfo               httpGetterInfo\n\tretryReaderOptions RetryReaderOptions\n\tgetter             httpGetter\n\tcountWasBounded    bool\n\n\t// we support Close-ing during Reads (from other goroutines), so we protect the shared state, which is response\n\tresponseMu *sync.Mutex\n\tresponse   io.ReadCloser\n}\n\n// newRetryReader creates a retry reader.\nfunc newRetryReader(ctx context.Context, initialResponse io.ReadCloser, info httpGetterInfo, getter httpGetter, o RetryReaderOptions) *RetryReader {\n\tif o.MaxRetries < 1 {\n\t\to.MaxRetries = 3\n\t}\n\treturn &RetryReader{\n\t\tctx:                ctx,\n\t\tgetter:             getter,\n\t\tinfo:               info,\n\t\tcountWasBounded:    info.Range.Count != CountToEnd,\n\t\tresponse:           initialResponse,\n\t\tresponseMu:         &sync.Mutex{},\n\t\tretryReaderOptions: o,\n\t}\n}\n\n// setResponse function\nfunc (s *RetryReader) setResponse(r io.ReadCloser) {\n\ts.responseMu.Lock()\n\tdefer s.responseMu.Unlock()\n\ts.response = r\n}\n\n// Read from retry reader\nfunc (s *RetryReader) Read(p []byte) (n int, err error) {\n\tfor try := int32(0); ; try++ {\n\t\tif s.countWasBounded && s.info.Range.Count == CountToEnd {\n\t\t\t// User specified an original count and the remaining bytes are 0, return 0, EOF\n\t\t\treturn 0, io.EOF\n\t\t}\n\n\t\ts.responseMu.Lock()\n\t\tresp := s.response\n\t\ts.responseMu.Unlock()\n\t\tif resp == nil { // We don't have a response stream to read from, try to get one.\n\t\t\tnewResponse, err := s.getter(s.ctx, s.info)\n\t\t\tif err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\t\t\t// Successful GET; this is the network stream we'll read from.\n\t\t\ts.setResponse(newResponse)\n\t\t\tresp = newResponse\n\t\t}\n\t\tn, err := resp.Read(p) // Read from the stream (this will return non-nil err if forceRetry is called, from another goroutine, while it is running)\n\n\t\t// Injection mechanism for testing.\n\t\tif s.retryReaderOptions.doInjectError && try == s.retryReaderOptions.doInjectErrorRound {\n\t\t\tif s.retryReaderOptions.injectedError != nil {\n\t\t\t\terr = s.retryReaderOptions.injectedError\n\t\t\t} else {\n\t\t\t\terr = &net.DNSError{IsTemporary: true}\n\t\t\t}\n\t\t}\n\n\t\t// We successfully read data or end EOF.\n\t\tif err == nil || err == io.EOF {\n\t\t\ts.info.Range.Offset += int64(n) // Increments the start offset in case we need to make a new HTTP request in the future\n\t\t\tif s.info.Range.Count != CountToEnd {\n\t\t\t\ts.info.Range.Count -= int64(n) // Decrement the count in case we need to make a new HTTP request in the future\n\t\t\t}\n\t\t\treturn n, err // Return the return to the caller\n\t\t}\n\t\t_ = s.Close()\n\n\t\ts.setResponse(nil) // Our stream is no longer good\n\n\t\t// Check the retry count and error code, and decide whether to retry.\n\t\tretriesExhausted := try >= s.retryReaderOptions.MaxRetries\n\t\t_, isNetError := err.(net.Error)\n\t\tisUnexpectedEOF := err == io.ErrUnexpectedEOF\n\t\twillRetry := (isNetError || isUnexpectedEOF || s.wasRetryableEarlyClose(err)) && !retriesExhausted\n\n\t\t// Notify, for logging purposes, of any failures\n\t\tif s.retryReaderOptions.OnFailedRead != nil {\n\t\t\tfailureCount := try + 1 // because try is zero-based\n\t\t\ts.retryReaderOptions.OnFailedRead(failureCount, err, s.info.Range, willRetry)\n\t\t}\n\n\t\tif willRetry {\n\t\t\tcontinue\n\t\t\t// Loop around and try to get and read from new stream.\n\t\t}\n\t\treturn n, err // Not retryable, or retries exhausted, so just return\n\t}\n}\n\n// By default, we allow early Closing, from another concurrent goroutine, to be used to force a retry\n// Is this safe, to close early from another goroutine?  Early close ultimately ends up calling\n// net.Conn.Close, and that is documented as \"Any blocked Read or Write operations will be unblocked and return errors\"\n// which is exactly the behaviour we want.\n// NOTE: that if caller has forced an early Close from a separate goroutine (separate from the Read)\n// then there are two different types of error that may happen - either the one we check for here,\n// or a net.Error (due to closure of connection). Which one happens depends on timing. We only need this routine\n// to check for one, since the other is a net.Error, which our main Read retry loop is already handing.\nfunc (s *RetryReader) wasRetryableEarlyClose(err error) bool {\n\tif s.retryReaderOptions.EarlyCloseAsError {\n\t\treturn false // user wants all early closes to be errors, and so not retryable\n\t}\n\t// unfortunately, http.errReadOnClosedResBody is private, so the best we can do here is to check for its text\n\treturn strings.HasSuffix(err.Error(), ReadOnClosedBodyMessage)\n}\n\n// ReadOnClosedBodyMessage of retry reader\nconst ReadOnClosedBodyMessage = \"read on closed response body\"\n\n// Close retry reader\nfunc (s *RetryReader) Close() error {\n\ts.responseMu.Lock()\n\tdefer s.responseMu.Unlock()\n\tif s.response != nil {\n\t\treturn s.response.Close()\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob/utils.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage blob\n\nimport (\n\t\"strings\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas\"\n)\n\n// ObjectReplicationRules struct\ntype ObjectReplicationRules struct {\n\tRuleID string\n\tStatus string\n}\n\n// ObjectReplicationPolicy are deserialized attributes.\ntype ObjectReplicationPolicy struct {\n\tPolicyID *string\n\tRules    *[]ObjectReplicationRules\n}\n\n// deserializeORSPolicies is utility function to deserialize ORS Policies.\nfunc deserializeORSPolicies(policies map[string]*string) (objectReplicationPolicies []ObjectReplicationPolicy) {\n\tif policies == nil {\n\t\treturn nil\n\t}\n\t// For source blobs (blobs that have policy ids and rule ids applied to them),\n\t// the header will be formatted as \"x-ms-or-<policy_id>_<rule_id>: {Complete, Failed}\".\n\t// The value of this header is the status of the replication.\n\torPolicyStatusHeader := make(map[string]*string)\n\tfor key, value := range policies {\n\t\tif strings.Contains(key, \"or-\") && key != \"x-ms-or-policy-id\" {\n\t\t\torPolicyStatusHeader[key] = value\n\t\t}\n\t}\n\n\tparsedResult := make(map[string][]ObjectReplicationRules)\n\tfor key, value := range orPolicyStatusHeader {\n\t\tpolicyAndRuleIDs := strings.Split(strings.Split(key, \"or-\")[1], \"_\")\n\t\tpolicyId, ruleId := policyAndRuleIDs[0], policyAndRuleIDs[1]\n\n\t\tparsedResult[policyId] = append(parsedResult[policyId], ObjectReplicationRules{RuleID: ruleId, Status: *value})\n\t}\n\n\tfor policyId, rules := range parsedResult {\n\t\tobjectReplicationPolicies = append(objectReplicationPolicies, ObjectReplicationPolicy{\n\t\t\tPolicyID: &policyId,\n\t\t\tRules:    &rules,\n\t\t})\n\t}\n\treturn\n}\n\n// ParseHTTPHeaders parses GetPropertiesResponse and returns HTTPHeaders.\nfunc ParseHTTPHeaders(resp GetPropertiesResponse) HTTPHeaders {\n\treturn HTTPHeaders{\n\t\tBlobContentType:        resp.ContentType,\n\t\tBlobContentEncoding:    resp.ContentEncoding,\n\t\tBlobContentLanguage:    resp.ContentLanguage,\n\t\tBlobContentDisposition: resp.ContentDisposition,\n\t\tBlobCacheControl:       resp.CacheControl,\n\t\tBlobContentMD5:         resp.ContentMD5,\n\t}\n}\n\n// URLParts object represents the components that make up an Azure Storage Container/Blob URL.\n// NOTE: Changing any SAS-related field requires computing a new SAS signature.\ntype URLParts = sas.URLParts\n\n// ParseURL parses a URL initializing URLParts' fields including any SAS-related & snapshot query parameters. Any other\n// query parameters remain in the UnparsedParams field. This method overwrites all fields in the URLParts object.\nfunc ParseURL(u string) (URLParts, error) {\n\treturn sas.ParseURL(u)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/bloberror/error_codes.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage bloberror\n\nimport (\n\t\"errors\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n)\n\n// HasCode returns true if the provided error is an *azcore.ResponseError\n// with its ErrorCode field equal to one of the specified Codes.\nfunc HasCode(err error, codes ...Code) bool {\n\tvar respErr *azcore.ResponseError\n\tif !errors.As(err, &respErr) {\n\t\treturn false\n\t}\n\n\tfor _, code := range codes {\n\t\tif respErr.ErrorCode == string(code) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\n// Code - Error codes returned by the service\ntype Code = generated.StorageErrorCode\n\nconst (\n\tAccountAlreadyExists                              Code = \"AccountAlreadyExists\"\n\tAccountBeingCreated                               Code = \"AccountBeingCreated\"\n\tAccountIsDisabled                                 Code = \"AccountIsDisabled\"\n\tAppendPositionConditionNotMet                     Code = \"AppendPositionConditionNotMet\"\n\tAuthenticationFailed                              Code = \"AuthenticationFailed\"\n\tAuthorizationFailure                              Code = \"AuthorizationFailure\"\n\tAuthorizationPermissionMismatch                   Code = \"AuthorizationPermissionMismatch\"\n\tAuthorizationProtocolMismatch                     Code = \"AuthorizationProtocolMismatch\"\n\tAuthorizationResourceTypeMismatch                 Code = \"AuthorizationResourceTypeMismatch\"\n\tAuthorizationServiceMismatch                      Code = \"AuthorizationServiceMismatch\"\n\tAuthorizationSourceIPMismatch                     Code = \"AuthorizationSourceIPMismatch\"\n\tBlobAlreadyExists                                 Code = \"BlobAlreadyExists\"\n\tBlobArchived                                      Code = \"BlobArchived\"\n\tBlobBeingRehydrated                               Code = \"BlobBeingRehydrated\"\n\tBlobImmutableDueToPolicy                          Code = \"BlobImmutableDueToPolicy\"\n\tBlobNotArchived                                   Code = \"BlobNotArchived\"\n\tBlobNotFound                                      Code = \"BlobNotFound\"\n\tBlobOverwritten                                   Code = \"BlobOverwritten\"\n\tBlobTierInadequateForContentLength                Code = \"BlobTierInadequateForContentLength\"\n\tBlobUsesCustomerSpecifiedEncryption               Code = \"BlobUsesCustomerSpecifiedEncryption\"\n\tBlockCountExceedsLimit                            Code = \"BlockCountExceedsLimit\"\n\tBlockListTooLong                                  Code = \"BlockListTooLong\"\n\tCannotChangeToLowerTier                           Code = \"CannotChangeToLowerTier\"\n\tCannotVerifyCopySource                            Code = \"CannotVerifyCopySource\"\n\tConditionHeadersNotSupported                      Code = \"ConditionHeadersNotSupported\"\n\tConditionNotMet                                   Code = \"ConditionNotMet\"\n\tContainerAlreadyExists                            Code = \"ContainerAlreadyExists\"\n\tContainerBeingDeleted                             Code = \"ContainerBeingDeleted\"\n\tContainerDisabled                                 Code = \"ContainerDisabled\"\n\tContainerNotFound                                 Code = \"ContainerNotFound\"\n\tContentLengthLargerThanTierLimit                  Code = \"ContentLengthLargerThanTierLimit\"\n\tCopyAcrossAccountsNotSupported                    Code = \"CopyAcrossAccountsNotSupported\"\n\tCopyIDMismatch                                    Code = \"CopyIdMismatch\"\n\tEmptyMetadataKey                                  Code = \"EmptyMetadataKey\"\n\tFeatureVersionMismatch                            Code = \"FeatureVersionMismatch\"\n\tImmutabilityPolicyDeleteOnLockedPolicy            Code = \"ImmutabilityPolicyDeleteOnLockedPolicy\"\n\tIncrementalCopyBlobMismatch                       Code = \"IncrementalCopyBlobMismatch\"\n\tIncrementalCopyOfEralierVersionSnapshotNotAllowed Code = \"IncrementalCopyOfEralierVersionSnapshotNotAllowed\"\n\tIncrementalCopySourceMustBeSnapshot               Code = \"IncrementalCopySourceMustBeSnapshot\"\n\tInfiniteLeaseDurationRequired                     Code = \"InfiniteLeaseDurationRequired\"\n\tInsufficientAccountPermissions                    Code = \"InsufficientAccountPermissions\"\n\tInternalError                                     Code = \"InternalError\"\n\tInvalidAuthenticationInfo                         Code = \"InvalidAuthenticationInfo\"\n\tInvalidBlobOrBlock                                Code = \"InvalidBlobOrBlock\"\n\tInvalidBlobTier                                   Code = \"InvalidBlobTier\"\n\tInvalidBlobType                                   Code = \"InvalidBlobType\"\n\tInvalidBlockID                                    Code = \"InvalidBlockId\"\n\tInvalidBlockList                                  Code = \"InvalidBlockList\"\n\tInvalidHTTPVerb                                   Code = \"InvalidHttpVerb\"\n\tInvalidHeaderValue                                Code = \"InvalidHeaderValue\"\n\tInvalidInput                                      Code = \"InvalidInput\"\n\tInvalidMD5                                        Code = \"InvalidMd5\"\n\tInvalidMetadata                                   Code = \"InvalidMetadata\"\n\tInvalidOperation                                  Code = \"InvalidOperation\"\n\tInvalidPageRange                                  Code = \"InvalidPageRange\"\n\tInvalidQueryParameterValue                        Code = \"InvalidQueryParameterValue\"\n\tInvalidRange                                      Code = \"InvalidRange\"\n\tInvalidResourceName                               Code = \"InvalidResourceName\"\n\tInvalidSourceBlobType                             Code = \"InvalidSourceBlobType\"\n\tInvalidSourceBlobURL                              Code = \"InvalidSourceBlobUrl\"\n\tInvalidURI                                        Code = \"InvalidUri\"\n\tInvalidVersionForPageBlobOperation                Code = \"InvalidVersionForPageBlobOperation\"\n\tInvalidXMLDocument                                Code = \"InvalidXmlDocument\"\n\tInvalidXMLNodeValue                               Code = \"InvalidXmlNodeValue\"\n\tLeaseAlreadyBroken                                Code = \"LeaseAlreadyBroken\"\n\tLeaseAlreadyPresent                               Code = \"LeaseAlreadyPresent\"\n\tLeaseIDMismatchWithBlobOperation                  Code = \"LeaseIdMismatchWithBlobOperation\"\n\tLeaseIDMismatchWithContainerOperation             Code = \"LeaseIdMismatchWithContainerOperation\"\n\tLeaseIDMismatchWithLeaseOperation                 Code = \"LeaseIdMismatchWithLeaseOperation\"\n\tLeaseIDMissing                                    Code = \"LeaseIdMissing\"\n\tLeaseIsBreakingAndCannotBeAcquired                Code = \"LeaseIsBreakingAndCannotBeAcquired\"\n\tLeaseIsBreakingAndCannotBeChanged                 Code = \"LeaseIsBreakingAndCannotBeChanged\"\n\tLeaseIsBrokenAndCannotBeRenewed                   Code = \"LeaseIsBrokenAndCannotBeRenewed\"\n\tLeaseLost                                         Code = \"LeaseLost\"\n\tLeaseNotPresentWithBlobOperation                  Code = \"LeaseNotPresentWithBlobOperation\"\n\tLeaseNotPresentWithContainerOperation             Code = \"LeaseNotPresentWithContainerOperation\"\n\tLeaseNotPresentWithLeaseOperation                 Code = \"LeaseNotPresentWithLeaseOperation\"\n\tMD5Mismatch                                       Code = \"Md5Mismatch\"\n\tCRC64Mismatch                                     Code = \"Crc64Mismatch\"\n\tMaxBlobSizeConditionNotMet                        Code = \"MaxBlobSizeConditionNotMet\"\n\tMetadataTooLarge                                  Code = \"MetadataTooLarge\"\n\tMissingContentLengthHeader                        Code = \"MissingContentLengthHeader\"\n\tMissingRequiredHeader                             Code = \"MissingRequiredHeader\"\n\tMissingRequiredQueryParameter                     Code = \"MissingRequiredQueryParameter\"\n\tMissingRequiredXMLNode                            Code = \"MissingRequiredXmlNode\"\n\tMultipleConditionHeadersNotSupported              Code = \"MultipleConditionHeadersNotSupported\"\n\tNoAuthenticationInformation                       Code = \"NoAuthenticationInformation\"\n\tNoPendingCopyOperation                            Code = \"NoPendingCopyOperation\"\n\tOperationNotAllowedOnIncrementalCopyBlob          Code = \"OperationNotAllowedOnIncrementalCopyBlob\"\n\tOperationNotAllowedOnRootBlob                     Code = \"OperationNotAllowedOnRootBlob\"\n\tOperationTimedOut                                 Code = \"OperationTimedOut\"\n\tOutOfRangeInput                                   Code = \"OutOfRangeInput\"\n\tOutOfRangeQueryParameterValue                     Code = \"OutOfRangeQueryParameterValue\"\n\tPendingCopyOperation                              Code = \"PendingCopyOperation\"\n\tPreviousSnapshotCannotBeNewer                     Code = \"PreviousSnapshotCannotBeNewer\"\n\tPreviousSnapshotNotFound                          Code = \"PreviousSnapshotNotFound\"\n\tPreviousSnapshotOperationNotSupported             Code = \"PreviousSnapshotOperationNotSupported\"\n\tRequestBodyTooLarge                               Code = \"RequestBodyTooLarge\"\n\tRequestURLFailedToParse                           Code = \"RequestUrlFailedToParse\"\n\tResourceAlreadyExists                             Code = \"ResourceAlreadyExists\"\n\tResourceNotFound                                  Code = \"ResourceNotFound\"\n\tResourceTypeMismatch                              Code = \"ResourceTypeMismatch\"\n\tSequenceNumberConditionNotMet                     Code = \"SequenceNumberConditionNotMet\"\n\tSequenceNumberIncrementTooLarge                   Code = \"SequenceNumberIncrementTooLarge\"\n\tServerBusy                                        Code = \"ServerBusy\"\n\tSnapshotCountExceeded                             Code = \"SnapshotCountExceeded\"\n\tSnapshotOperationRateExceeded                     Code = \"SnapshotOperationRateExceeded\"\n\tSnapshotsPresent                                  Code = \"SnapshotsPresent\"\n\tSourceConditionNotMet                             Code = \"SourceConditionNotMet\"\n\tSystemInUse                                       Code = \"SystemInUse\"\n\tTargetConditionNotMet                             Code = \"TargetConditionNotMet\"\n\tUnauthorizedBlobOverwrite                         Code = \"UnauthorizedBlobOverwrite\"\n\tUnsupportedHTTPVerb                               Code = \"UnsupportedHttpVerb\"\n\tUnsupportedHeader                                 Code = \"UnsupportedHeader\"\n\tUnsupportedQueryParameter                         Code = \"UnsupportedQueryParameter\"\n\tUnsupportedXMLNode                                Code = \"UnsupportedXmlNode\"\n)\n\nvar (\n\t// MissingSharedKeyCredential - Error is returned when SAS URL is being created without SharedKeyCredential.\n\tMissingSharedKeyCredential = errors.New(\"SAS can only be signed with a SharedKeyCredential\")\n\tUnsupportedChecksum        = errors.New(\"for multi-part uploads, user generated checksums cannot be validated\")\n)\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob/chunkwriting.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage blockblob\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/base64\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"io\"\n\t\"sync\"\n\t\"sync/atomic\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/uuid\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared\"\n)\n\n// blockWriter provides methods to upload blocks that represent a file to a server and commit them.\n// This allows us to provide a local implementation that fakes the server for hermetic testing.\ntype blockWriter interface {\n\tStageBlock(context.Context, string, io.ReadSeekCloser, *StageBlockOptions) (StageBlockResponse, error)\n\tUpload(context.Context, io.ReadSeekCloser, *UploadOptions) (UploadResponse, error)\n\tCommitBlockList(context.Context, []string, *CommitBlockListOptions) (CommitBlockListResponse, error)\n}\n\n// copyFromReader copies a source io.Reader to blob storage using concurrent uploads.\nfunc copyFromReader[T ~[]byte](ctx context.Context, src io.Reader, dst blockWriter, options UploadStreamOptions, getBufferManager func(maxBuffers int, bufferSize int64) shared.BufferManager[T]) (CommitBlockListResponse, error) {\n\toptions.setDefaults()\n\n\twg := sync.WaitGroup{}       // Used to know when all outgoing blocks have finished processing\n\terrCh := make(chan error, 1) // contains the first error encountered during processing\n\n\tbuffers := getBufferManager(options.Concurrency, options.BlockSize)\n\tdefer buffers.Free()\n\n\t// this controls the lifetime of the uploading goroutines.\n\t// if an error is encountered, cancel() is called which will terminate all uploads.\n\t// NOTE: the ordering is important here.  cancel MUST execute before\n\t// cleaning up the buffers so that any uploading goroutines exit first,\n\t// releasing their buffers back to the pool for cleanup.\n\tctx, cancel := context.WithCancel(ctx)\n\tdefer cancel()\n\n\t// all blocks have IDs that start with a random UUID\n\tblockIDPrefix, err := uuid.New()\n\tif err != nil {\n\t\treturn CommitBlockListResponse{}, err\n\t}\n\ttracker := blockTracker{\n\t\tblockIDPrefix: blockIDPrefix,\n\t\toptions:       options,\n\t}\n\n\t// This goroutine grabs a buffer, reads from the stream into the buffer,\n\t// then creates a goroutine to upload/stage the block.\n\tfor blockNum := uint32(0); true; blockNum++ {\n\t\tvar buffer T\n\t\tselect {\n\t\tcase buffer = <-buffers.Acquire():\n\t\t\t// got a buffer\n\t\tdefault:\n\t\t\t// no buffer available; allocate a new buffer if possible\n\t\t\tif _, err := buffers.Grow(); err != nil {\n\t\t\t\treturn CommitBlockListResponse{}, err\n\t\t\t}\n\n\t\t\t// either grab the newly allocated buffer or wait for one to become available\n\t\t\tbuffer = <-buffers.Acquire()\n\t\t}\n\n\t\tvar n int\n\t\tn, err = shared.ReadAtLeast(src, buffer, len(buffer))\n\n\t\tif n > 0 {\n\t\t\t// some data was read, upload it\n\t\t\twg.Add(1) // We're posting a buffer to be sent\n\n\t\t\t// NOTE: we must pass blockNum as an arg to our goroutine else\n\t\t\t// it's captured by reference and can change underneath us!\n\t\t\tgo func(blockNum uint32) {\n\t\t\t\t// Upload the outgoing block, matching the number of bytes read\n\t\t\t\terr := tracker.uploadBlock(ctx, dst, blockNum, buffer[:n])\n\t\t\t\tif err != nil {\n\t\t\t\t\tselect {\n\t\t\t\t\tcase errCh <- err:\n\t\t\t\t\t\t// error was set\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// some other error is already set\n\t\t\t\t\t}\n\t\t\t\t\tcancel()\n\t\t\t\t}\n\t\t\t\tbuffers.Release(buffer) // The goroutine reading from the stream can reuse this buffer now\n\n\t\t\t\t// signal that the block has been staged.\n\t\t\t\t// we MUST do this after attempting to write to errCh\n\t\t\t\t// to avoid it racing with the reading goroutine.\n\t\t\t\twg.Done()\n\t\t\t}(blockNum)\n\t\t} else {\n\t\t\t// nothing was read so the buffer is empty, send it back for reuse/clean-up.\n\t\t\tbuffers.Release(buffer)\n\t\t}\n\n\t\tif err != nil { // The reader is done, no more outgoing buffers\n\t\t\tif errors.Is(err, io.EOF) {\n\t\t\t\t// these are expected errors, we don't surface those\n\t\t\t\terr = nil\n\t\t\t} else {\n\t\t\t\t// some other error happened, terminate any outstanding uploads\n\t\t\t\tcancel()\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t}\n\n\twg.Wait() // Wait for all outgoing blocks to complete\n\n\tif err != nil {\n\t\t// there was an error reading from src, favor this error over any error during staging\n\t\treturn CommitBlockListResponse{}, err\n\t}\n\n\tselect {\n\tcase err = <-errCh:\n\t\t// there was an error during staging\n\t\treturn CommitBlockListResponse{}, err\n\tdefault:\n\t\t// no error was encountered\n\t}\n\n\t// If no error, after all blocks uploaded, commit them to the blob & return the result\n\treturn tracker.commitBlocks(ctx, dst)\n}\n\n// used to manage the uploading and committing of blocks\ntype blockTracker struct {\n\tblockIDPrefix uuid.UUID // UUID used with all blockIDs\n\tmaxBlockNum   uint32    // defaults to 0\n\tfirstBlock    []byte    // Used only if maxBlockNum is 0\n\toptions       UploadStreamOptions\n}\n\nfunc (bt *blockTracker) uploadBlock(ctx context.Context, to blockWriter, num uint32, buffer []byte) error {\n\tif num == 0 {\n\t\tbt.firstBlock = buffer\n\n\t\t// If whole payload fits in 1 block, don't stage it; End will upload it with 1 I/O operation\n\t\t// If the payload is exactly the same size as the buffer, there may be more content coming in.\n\t\tif len(buffer) < int(bt.options.BlockSize) {\n\t\t\treturn nil\n\t\t}\n\t} else {\n\t\t// Else, upload a staged block...\n\t\tatomicMorphUint32(&bt.maxBlockNum, func(startVal uint32) (val uint32, morphResult uint32) {\n\t\t\t// Atomically remember (in t.numBlocks) the maximum block num we've ever seen\n\t\t\tif startVal < num {\n\t\t\t\treturn num, 0\n\t\t\t}\n\t\t\treturn startVal, 0\n\t\t})\n\t}\n\n\tblockID := newUUIDBlockID(bt.blockIDPrefix).WithBlockNumber(num).ToBase64()\n\t_, err := to.StageBlock(ctx, blockID, streaming.NopCloser(bytes.NewReader(buffer)), bt.options.getStageBlockOptions())\n\treturn err\n}\n\nfunc (bt *blockTracker) commitBlocks(ctx context.Context, to blockWriter) (CommitBlockListResponse, error) {\n\t// If the first block had the exact same size as the buffer\n\t// we would have staged it as a block thinking that there might be more data coming\n\tif bt.maxBlockNum == 0 && len(bt.firstBlock) < int(bt.options.BlockSize) {\n\t\t// If whole payload fits in 1 block (block #0), upload it with 1 I/O operation\n\t\tup, err := to.Upload(ctx, streaming.NopCloser(bytes.NewReader(bt.firstBlock)), bt.options.getUploadOptions())\n\t\tif err != nil {\n\t\t\treturn CommitBlockListResponse{}, err\n\t\t}\n\n\t\t// convert UploadResponse to CommitBlockListResponse\n\t\treturn CommitBlockListResponse{\n\t\t\tClientRequestID:     up.ClientRequestID,\n\t\t\tContentMD5:          up.ContentMD5,\n\t\t\tDate:                up.Date,\n\t\t\tETag:                up.ETag,\n\t\t\tEncryptionKeySHA256: up.EncryptionKeySHA256,\n\t\t\tEncryptionScope:     up.EncryptionScope,\n\t\t\tIsServerEncrypted:   up.IsServerEncrypted,\n\t\t\tLastModified:        up.LastModified,\n\t\t\tRequestID:           up.RequestID,\n\t\t\tVersion:             up.Version,\n\t\t\tVersionID:           up.VersionID,\n\t\t\t//ContentCRC64:     up.ContentCRC64, doesn't exist on UploadResponse\n\t\t}, nil\n\t}\n\n\t// Multiple blocks staged, commit them all now\n\tblockID := newUUIDBlockID(bt.blockIDPrefix)\n\tblockIDs := make([]string, bt.maxBlockNum+1)\n\tfor bn := uint32(0); bn < bt.maxBlockNum+1; bn++ {\n\t\tblockIDs[bn] = blockID.WithBlockNumber(bn).ToBase64()\n\t}\n\n\treturn to.CommitBlockList(ctx, blockIDs, bt.options.getCommitBlockListOptions())\n}\n\n// AtomicMorpherUint32 identifies a method passed to and invoked by the AtomicMorph function.\n// The AtomicMorpher callback is passed a startValue and based on this value it returns\n// what the new value should be and the result that AtomicMorph should return to its caller.\ntype atomicMorpherUint32 func(startVal uint32) (val uint32, morphResult uint32)\n\n// AtomicMorph atomically morphs target in to new value (and result) as indicated bythe AtomicMorpher callback function.\nfunc atomicMorphUint32(target *uint32, morpher atomicMorpherUint32) uint32 {\n\tfor {\n\t\tcurrentVal := atomic.LoadUint32(target)\n\t\tdesiredVal, morphResult := morpher(currentVal)\n\t\tif atomic.CompareAndSwapUint32(target, currentVal, desiredVal) {\n\t\t\treturn morphResult\n\t\t}\n\t}\n}\n\ntype blockID [64]byte\n\nfunc (blockID blockID) ToBase64() string {\n\treturn base64.StdEncoding.EncodeToString(blockID[:])\n}\n\ntype uuidBlockID blockID\n\nfunc newUUIDBlockID(u uuid.UUID) uuidBlockID {\n\tubi := uuidBlockID{}     // Create a new uuidBlockID\n\tcopy(ubi[:len(u)], u[:]) // Copy the specified UUID into it\n\t// Block number defaults to 0\n\treturn ubi\n}\n\nfunc (ubi uuidBlockID) WithBlockNumber(blockNumber uint32) uuidBlockID {\n\tbinary.BigEndian.PutUint32(ubi[len(uuid.UUID{}):], blockNumber) // Put block number after UUID\n\treturn ubi                                                      // Return the passed-in copy\n}\n\nfunc (ubi uuidBlockID) ToBase64() string {\n\treturn blockID(ubi).ToBase64()\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob/client.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage blockblob\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"io\"\n\t\"math\"\n\t\"os\"\n\t\"reflect\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/to\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/log\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/uuid\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/bloberror\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/base\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas\"\n)\n\n// ClientOptions contains the optional parameters when creating a Client.\ntype ClientOptions base.ClientOptions\n\n// Client defines a set of operations applicable to block blobs.\ntype Client base.CompositeClient[generated.BlobClient, generated.BlockBlobClient]\n\n// NewClient creates an instance of Client with the specified values.\n//   - blobURL - the URL of the blob e.g. https://<account>.blob.core.windows.net/container/blob.txt\n//   - cred - an Azure AD credential, typically obtained via the azidentity module\n//   - options - client options; pass nil to accept the default values\nfunc NewClient(blobURL string, cred azcore.TokenCredential, options *ClientOptions) (*Client, error) {\n\taudience := base.GetAudience((*base.ClientOptions)(options))\n\tconOptions := shared.GetClientOptions(options)\n\tauthPolicy := shared.NewStorageChallengePolicy(cred, audience, conOptions.InsecureAllowCredentialWithHTTP)\n\tplOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}}\n\n\tazClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn (*Client)(base.NewBlockBlobClient(blobURL, azClient, nil)), nil\n}\n\n// NewClientWithNoCredential creates an instance of Client with the specified values.\n// This is used to anonymously access a blob or with a shared access signature (SAS) token.\n//   - blobURL - the URL of the blob e.g. https://<account>.blob.core.windows.net/container/blob.txt?<sas token>\n//   - options - client options; pass nil to accept the default values\nfunc NewClientWithNoCredential(blobURL string, options *ClientOptions) (*Client, error) {\n\tconOptions := shared.GetClientOptions(options)\n\n\tazClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, runtime.PipelineOptions{}, &conOptions.ClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn (*Client)(base.NewBlockBlobClient(blobURL, azClient, nil)), nil\n}\n\n// NewClientWithSharedKeyCredential creates an instance of Client with the specified values.\n//   - blobURL - the URL of the blob e.g. https://<account>.blob.core.windows.net/container/blob.txt\n//   - cred - a SharedKeyCredential created with the matching blob's storage account and access key\n//   - options - client options; pass nil to accept the default values\nfunc NewClientWithSharedKeyCredential(blobURL string, cred *blob.SharedKeyCredential, options *ClientOptions) (*Client, error) {\n\tauthPolicy := exported.NewSharedKeyCredPolicy(cred)\n\tconOptions := shared.GetClientOptions(options)\n\tplOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}}\n\n\tazClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn (*Client)(base.NewBlockBlobClient(blobURL, azClient, cred)), nil\n}\n\n// NewClientFromConnectionString creates an instance of Client with the specified values.\n//   - connectionString - a connection string for the desired storage account\n//   - containerName - the name of the container within the storage account\n//   - blobName - the name of the blob within the container\n//   - options - client options; pass nil to accept the default values\nfunc NewClientFromConnectionString(connectionString, containerName, blobName string, options *ClientOptions) (*Client, error) {\n\tparsed, err := shared.ParseConnectionString(connectionString)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tparsed.ServiceURL = runtime.JoinPaths(parsed.ServiceURL, containerName, blobName)\n\n\tif parsed.AccountKey != \"\" && parsed.AccountName != \"\" {\n\t\tcredential, err := exported.NewSharedKeyCredential(parsed.AccountName, parsed.AccountKey)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn NewClientWithSharedKeyCredential(parsed.ServiceURL, credential, options)\n\t}\n\n\treturn NewClientWithNoCredential(parsed.ServiceURL, options)\n}\n\nfunc (bb *Client) sharedKey() *blob.SharedKeyCredential {\n\treturn base.SharedKeyComposite((*base.CompositeClient[generated.BlobClient, generated.BlockBlobClient])(bb))\n}\n\nfunc (bb *Client) generated() *generated.BlockBlobClient {\n\t_, blockBlob := base.InnerClients((*base.CompositeClient[generated.BlobClient, generated.BlockBlobClient])(bb))\n\treturn blockBlob\n}\n\nfunc (bb *Client) innerBlobGenerated() *generated.BlobClient {\n\tb := bb.BlobClient()\n\treturn base.InnerClient((*base.Client[generated.BlobClient])(b))\n}\n\n// URL returns the URL endpoint used by the Client object.\nfunc (bb *Client) URL() string {\n\treturn bb.generated().Endpoint()\n}\n\n// BlobClient returns the embedded blob client for this BlockBlob client.\nfunc (bb *Client) BlobClient() *blob.Client {\n\tblobClient, _ := base.InnerClients((*base.CompositeClient[generated.BlobClient, generated.BlockBlobClient])(bb))\n\treturn (*blob.Client)(blobClient)\n}\n\n// WithSnapshot creates a new Client object identical to the source but with the specified snapshot timestamp.\n// Pass \"\" to remove the snapshot returning a URL to the base blob.\nfunc (bb *Client) WithSnapshot(snapshot string) (*Client, error) {\n\tp, err := blob.ParseURL(bb.URL())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.Snapshot = snapshot\n\n\treturn (*Client)(base.NewBlockBlobClient(p.String(), bb.generated().Internal(), bb.sharedKey())), nil\n}\n\n// WithVersionID creates a new AppendBlobURL object identical to the source but with the specified version id.\n// Pass \"\" to remove the versionID returning a URL to the base blob.\nfunc (bb *Client) WithVersionID(versionID string) (*Client, error) {\n\tp, err := blob.ParseURL(bb.URL())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.VersionID = versionID\n\n\treturn (*Client)(base.NewBlockBlobClient(p.String(), bb.generated().Internal(), bb.sharedKey())), nil\n}\n\n// Upload creates a new block blob or overwrites an existing block blob.\n// Updating an existing block blob overwrites any existing metadata on the blob. Partial updates are not\n// supported with Upload; the content of the existing blob is overwritten with the new content. To\n// perform a partial update of a block blob, use StageBlock and CommitBlockList.\n// This method panics if the stream is not at position 0.\n// Note that the http client closes the body stream after the request is sent to the service.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-blob.\nfunc (bb *Client) Upload(ctx context.Context, body io.ReadSeekCloser, options *UploadOptions) (UploadResponse, error) {\n\tcount, err := shared.ValidateSeekableStreamAt0AndGetCount(body)\n\tif err != nil {\n\t\treturn UploadResponse{}, err\n\t}\n\n\topts, httpHeaders, leaseInfo, cpkV, cpkN, accessConditions := options.format()\n\n\tif options != nil && options.TransactionalValidation != nil {\n\t\tbody, err = options.TransactionalValidation.Apply(body, opts)\n\t\tif err != nil {\n\t\t\treturn UploadResponse{}, err\n\t\t}\n\t}\n\n\tresp, err := bb.generated().Upload(ctx, count, body, opts, httpHeaders, leaseInfo, cpkV, cpkN, accessConditions)\n\treturn resp, err\n}\n\n// UploadBlobFromURL - The Put Blob from URL operation creates a new Block Blob where the contents of the blob are read from\n// a given URL. Partial updates are not supported with Put Blob from URL; the content of an existing blob is overwritten\n// with the content of the new blob. To perform partial updates to a block blob’s contents using a source URL, use the Put\n// Block from URL API in conjunction with Put Block List.\n// For more information, see https://learn.microsoft.com/rest/api/storageservices/put-blob-from-url\nfunc (bb *Client) UploadBlobFromURL(ctx context.Context, copySource string, options *UploadBlobFromURLOptions) (UploadBlobFromURLResponse, error) {\n\topts, httpHeaders, leaseAccessConditions, cpkInfo, cpkSourceInfo, modifiedAccessConditions, sourceModifiedConditions := options.format()\n\n\tresp, err := bb.generated().PutBlobFromURL(ctx, int64(0), copySource, opts, httpHeaders, leaseAccessConditions, cpkInfo, cpkSourceInfo, modifiedAccessConditions, sourceModifiedConditions)\n\n\treturn resp, err\n}\n\n// StageBlock uploads the specified block to the block blob's \"staging area\" to be later committed by a call to CommitBlockList.\n// Note that the http client closes the body stream after the request is sent to the service.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-block.\nfunc (bb *Client) StageBlock(ctx context.Context, base64BlockID string, body io.ReadSeekCloser, options *StageBlockOptions) (StageBlockResponse, error) {\n\tcount, err := shared.ValidateSeekableStreamAt0AndGetCount(body)\n\tif err != nil {\n\t\treturn StageBlockResponse{}, err\n\t}\n\n\topts, leaseAccessConditions, cpkInfo, cpkScopeInfo := options.format()\n\n\tif options != nil && options.TransactionalValidation != nil {\n\t\tbody, err = options.TransactionalValidation.Apply(body, opts)\n\t\tif err != nil {\n\t\t\treturn StageBlockResponse{}, nil\n\t\t}\n\t}\n\n\tresp, err := bb.generated().StageBlock(ctx, base64BlockID, count, body, opts, leaseAccessConditions, cpkInfo, cpkScopeInfo)\n\treturn resp, err\n}\n\n// StageBlockFromURL copies the specified block from a source URL to the block blob's \"staging area\" to be later committed by a call to CommitBlockList.\n// If count is CountToEnd (0), then data is read from specified offset to the end.\n// For more information, see https://docs.microsoft.com/en-us/rest/api/storageservices/put-block-from-url.\nfunc (bb *Client) StageBlockFromURL(ctx context.Context, base64BlockID string, sourceURL string, options *StageBlockFromURLOptions) (StageBlockFromURLResponse, error) {\n\n\tstageBlockFromURLOptions, cpkInfo, cpkScopeInfo, leaseAccessConditions, sourceModifiedAccessConditions := options.format()\n\n\tresp, err := bb.generated().StageBlockFromURL(ctx, base64BlockID, 0, sourceURL, stageBlockFromURLOptions,\n\t\tcpkInfo, cpkScopeInfo, leaseAccessConditions, sourceModifiedAccessConditions)\n\n\treturn resp, err\n}\n\n// CommitBlockList writes a blob by specifying the list of block IDs that make up the blob.\n// In order to be written as part of a blob, a block must have been successfully written\n// to the server in a prior PutBlock operation. You can call PutBlockList to update a blob\n// by uploading only those blocks that have changed, then committing the new and existing\n// blocks together. Any blocks not specified in the block list and permanently deleted.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-block-list.\nfunc (bb *Client) CommitBlockList(ctx context.Context, base64BlockIDs []string, options *CommitBlockListOptions) (CommitBlockListResponse, error) {\n\t// this is a code smell in the generated code\n\tblockIds := make([]*string, len(base64BlockIDs))\n\tfor k, v := range base64BlockIDs {\n\t\tblockIds[k] = to.Ptr(v)\n\t}\n\n\tblockLookupList := generated.BlockLookupList{Latest: blockIds}\n\n\tvar commitOptions *generated.BlockBlobClientCommitBlockListOptions\n\tvar headers *generated.BlobHTTPHeaders\n\tvar leaseAccess *blob.LeaseAccessConditions\n\tvar cpkInfo *generated.CPKInfo\n\tvar cpkScope *generated.CPKScopeInfo\n\tvar modifiedAccess *generated.ModifiedAccessConditions\n\n\tif options != nil {\n\t\tcommitOptions = &generated.BlockBlobClientCommitBlockListOptions{\n\t\t\tBlobTagsString:            shared.SerializeBlobTagsToStrPtr(options.Tags),\n\t\t\tMetadata:                  options.Metadata,\n\t\t\tRequestID:                 options.RequestID,\n\t\t\tTier:                      options.Tier,\n\t\t\tTimeout:                   options.Timeout,\n\t\t\tTransactionalContentCRC64: options.TransactionalContentCRC64,\n\t\t\tTransactionalContentMD5:   options.TransactionalContentMD5,\n\t\t\tLegalHold:                 options.LegalHold,\n\t\t\tImmutabilityPolicyMode:    options.ImmutabilityPolicyMode,\n\t\t\tImmutabilityPolicyExpiry:  options.ImmutabilityPolicyExpiryTime,\n\t\t}\n\n\t\t// If user attempts to pass in their own checksum, errors out.\n\t\tif options.TransactionalContentMD5 != nil || options.TransactionalContentCRC64 != nil {\n\t\t\treturn CommitBlockListResponse{}, bloberror.UnsupportedChecksum\n\t\t}\n\n\t\theaders = options.HTTPHeaders\n\t\tleaseAccess, modifiedAccess = exported.FormatBlobAccessConditions(options.AccessConditions)\n\t\tcpkInfo = options.CPKInfo\n\t\tcpkScope = options.CPKScopeInfo\n\t}\n\n\tresp, err := bb.generated().CommitBlockList(ctx, blockLookupList, commitOptions, headers, leaseAccess, cpkInfo, cpkScope, modifiedAccess)\n\treturn resp, err\n}\n\n// GetBlockList returns the list of blocks that have been uploaded as part of a block blob using the specified block list filter.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-block-list.\nfunc (bb *Client) GetBlockList(ctx context.Context, listType BlockListType, options *GetBlockListOptions) (GetBlockListResponse, error) {\n\to, lac, mac := options.format()\n\n\tresp, err := bb.generated().GetBlockList(ctx, listType, o, lac, mac)\n\n\treturn resp, err\n}\n\n// Redeclared APIs ----- Copy over to Append blob and Page blob as well.\n\n// Delete marks the specified blob or snapshot for deletion. The blob is later deleted during garbage collection.\n// Note that deleting a blob also deletes all its snapshots.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-blob.\nfunc (bb *Client) Delete(ctx context.Context, o *blob.DeleteOptions) (blob.DeleteResponse, error) {\n\treturn bb.BlobClient().Delete(ctx, o)\n}\n\n// Undelete restores the contents and metadata of a soft-deleted blob and any associated soft-deleted snapshots.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/undelete-blob.\nfunc (bb *Client) Undelete(ctx context.Context, o *blob.UndeleteOptions) (blob.UndeleteResponse, error) {\n\treturn bb.BlobClient().Undelete(ctx, o)\n}\n\n// SetImmutabilityPolicy operation enables users to set the immutability policy on a blob.\n// https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview\nfunc (bb *Client) SetImmutabilityPolicy(ctx context.Context, expiryTime time.Time, options *blob.SetImmutabilityPolicyOptions) (blob.SetImmutabilityPolicyResponse, error) {\n\treturn bb.BlobClient().SetImmutabilityPolicy(ctx, expiryTime, options)\n}\n\n// DeleteImmutabilityPolicy operation enables users to delete the immutability policy on a blob.\n// https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview\nfunc (bb *Client) DeleteImmutabilityPolicy(ctx context.Context, options *blob.DeleteImmutabilityPolicyOptions) (blob.DeleteImmutabilityPolicyResponse, error) {\n\treturn bb.BlobClient().DeleteImmutabilityPolicy(ctx, options)\n}\n\n// SetLegalHold operation enables users to set legal hold on a blob.\n// https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview\nfunc (bb *Client) SetLegalHold(ctx context.Context, legalHold bool, options *blob.SetLegalHoldOptions) (blob.SetLegalHoldResponse, error) {\n\treturn bb.BlobClient().SetLegalHold(ctx, legalHold, options)\n}\n\n// SetTier operation sets the tier on a blob. The operation is allowed on a page\n// blob in a premium storage account and on a block blob in a blob storage account (locally\n// redundant storage only). A premium page blob's tier determines the allowed size, IOPs, and\n// bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive storage type. This operation\n// does not update the blob's ETag.\n// For detailed information about block blob level tiering see https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-storage-tiers.\nfunc (bb *Client) SetTier(ctx context.Context, tier blob.AccessTier, o *blob.SetTierOptions) (blob.SetTierResponse, error) {\n\treturn bb.BlobClient().SetTier(ctx, tier, o)\n}\n\n// SetExpiry operation sets an expiry time on an existing blob. This operation is only allowed on Hierarchical Namespace enabled accounts.\n// For more information, see https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-expiry\nfunc (bb *Client) SetExpiry(ctx context.Context, expiryType ExpiryType, o *SetExpiryOptions) (SetExpiryResponse, error) {\n\tif expiryType == nil {\n\t\texpiryType = ExpiryTypeNever{}\n\t}\n\tet, opts := expiryType.Format(o)\n\tresp, err := bb.innerBlobGenerated().SetExpiry(ctx, et, opts)\n\treturn resp, err\n}\n\n// GetProperties returns the blob's properties.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob-properties.\nfunc (bb *Client) GetProperties(ctx context.Context, o *blob.GetPropertiesOptions) (blob.GetPropertiesResponse, error) {\n\treturn bb.BlobClient().GetProperties(ctx, o)\n}\n\n// GetAccountInfo provides account level information\n// For more information, see https://learn.microsoft.com/en-us/rest/api/storageservices/get-account-information?tabs=shared-access-signatures.\nfunc (bb *Client) GetAccountInfo(ctx context.Context, o *blob.GetAccountInfoOptions) (blob.GetAccountInfoResponse, error) {\n\treturn bb.BlobClient().GetAccountInfo(ctx, o)\n}\n\n// SetHTTPHeaders changes a blob's HTTP headers.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties.\nfunc (bb *Client) SetHTTPHeaders(ctx context.Context, httpHeaders blob.HTTPHeaders, o *blob.SetHTTPHeadersOptions) (blob.SetHTTPHeadersResponse, error) {\n\treturn bb.BlobClient().SetHTTPHeaders(ctx, httpHeaders, o)\n}\n\n// SetMetadata changes a blob's metadata.\n// https://docs.microsoft.com/rest/api/storageservices/set-blob-metadata.\nfunc (bb *Client) SetMetadata(ctx context.Context, metadata map[string]*string, o *blob.SetMetadataOptions) (blob.SetMetadataResponse, error) {\n\treturn bb.BlobClient().SetMetadata(ctx, metadata, o)\n}\n\n// CreateSnapshot creates a read-only snapshot of a blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/snapshot-blob.\nfunc (bb *Client) CreateSnapshot(ctx context.Context, o *blob.CreateSnapshotOptions) (blob.CreateSnapshotResponse, error) {\n\treturn bb.BlobClient().CreateSnapshot(ctx, o)\n}\n\n// StartCopyFromURL copies the data at the source URL to a blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/copy-blob.\nfunc (bb *Client) StartCopyFromURL(ctx context.Context, copySource string, o *blob.StartCopyFromURLOptions) (blob.StartCopyFromURLResponse, error) {\n\treturn bb.BlobClient().StartCopyFromURL(ctx, copySource, o)\n}\n\n// AbortCopyFromURL stops a pending copy that was previously started and leaves a destination blob with 0 length and metadata.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/abort-copy-blob.\nfunc (bb *Client) AbortCopyFromURL(ctx context.Context, copyID string, o *blob.AbortCopyFromURLOptions) (blob.AbortCopyFromURLResponse, error) {\n\treturn bb.BlobClient().AbortCopyFromURL(ctx, copyID, o)\n}\n\n// SetTags operation enables users to set tags on a blob or specific blob version, but not snapshot.\n// Each call to this operation replaces all existing tags attached to the blob.\n// To remove all tags from the blob, call this operation with no tags set.\n// https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-tags\nfunc (bb *Client) SetTags(ctx context.Context, tags map[string]string, o *blob.SetTagsOptions) (blob.SetTagsResponse, error) {\n\treturn bb.BlobClient().SetTags(ctx, tags, o)\n}\n\n// GetTags operation enables users to get tags on a blob or specific blob version, or snapshot.\n// https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-tags\nfunc (bb *Client) GetTags(ctx context.Context, o *blob.GetTagsOptions) (blob.GetTagsResponse, error) {\n\treturn bb.BlobClient().GetTags(ctx, o)\n}\n\n// CopyFromURL synchronously copies the data at the source URL to a block blob, with sizes up to 256 MB.\n// For more information, see https://docs.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url.\nfunc (bb *Client) CopyFromURL(ctx context.Context, copySource string, o *blob.CopyFromURLOptions) (blob.CopyFromURLResponse, error) {\n\treturn bb.BlobClient().CopyFromURL(ctx, copySource, o)\n}\n\n// GetSASURL is a convenience method for generating a SAS token for the currently pointed at block blob.\n// It can only be used if the credential supplied during creation was a SharedKeyCredential.\nfunc (bb *Client) GetSASURL(permissions sas.BlobPermissions, expiry time.Time, o *blob.GetSASURLOptions) (string, error) {\n\treturn bb.BlobClient().GetSASURL(permissions, expiry, o)\n}\n\n// Concurrent Upload Functions -----------------------------------------------------------------------------------------\n\n// uploadFromReader uploads a buffer in blocks to a block blob.\nfunc (bb *Client) uploadFromReader(ctx context.Context, reader io.ReaderAt, actualSize int64, o *uploadFromReaderOptions) (uploadFromReaderResponse, error) {\n\tif o.BlockSize == 0 {\n\t\t// If bufferSize > (MaxStageBlockBytes * MaxBlocks), then error\n\t\tif actualSize > MaxStageBlockBytes*MaxBlocks {\n\t\t\treturn uploadFromReaderResponse{}, errors.New(\"buffer is too large to upload to a block blob\")\n\t\t}\n\t\t// If bufferSize <= MaxUploadBlobBytes, then Upload should be used with just 1 I/O request\n\t\tif actualSize <= MaxUploadBlobBytes {\n\t\t\to.BlockSize = MaxUploadBlobBytes // Default if unspecified\n\t\t} else {\n\t\t\to.BlockSize = int64(math.Ceil(float64(actualSize) / MaxBlocks)) // ceil(buffer / max blocks) = block size to use all 50,000 blocks\n\t\t\tif o.BlockSize < blob.DefaultDownloadBlockSize {                // If the block size is smaller than 4MB, round up to 4MB\n\t\t\t\to.BlockSize = blob.DefaultDownloadBlockSize\n\t\t\t}\n\t\t\t// StageBlock will be called with blockSize blocks and a Concurrency of (BufferSize / BlockSize).\n\t\t}\n\t}\n\n\tif actualSize <= MaxUploadBlobBytes {\n\t\t// If the size can fit in 1 Upload call, do it this way\n\t\tvar body io.ReadSeeker = io.NewSectionReader(reader, 0, actualSize)\n\t\tif o.Progress != nil {\n\t\t\tbody = streaming.NewRequestProgress(shared.NopCloser(body), o.Progress)\n\t\t}\n\n\t\tuploadBlockBlobOptions := o.getUploadBlockBlobOptions()\n\t\tresp, err := bb.Upload(ctx, shared.NopCloser(body), uploadBlockBlobOptions)\n\n\t\treturn toUploadReaderAtResponseFromUploadResponse(resp), err\n\t}\n\n\tvar numBlocks = uint16(((actualSize - 1) / o.BlockSize) + 1)\n\tif numBlocks > MaxBlocks {\n\t\t// prevent any math bugs from attempting to upload too many blocks which will always fail\n\t\treturn uploadFromReaderResponse{}, errors.New(\"block limit exceeded\")\n\t}\n\n\tif log.Should(exported.EventUpload) {\n\t\turlparts, err := blob.ParseURL(bb.generated().Endpoint())\n\t\tif err == nil {\n\t\t\tlog.Writef(exported.EventUpload, \"blob name %s actual size %v block-size %v block-count %v\",\n\t\t\t\turlparts.BlobName, actualSize, o.BlockSize, numBlocks)\n\t\t}\n\t}\n\n\tblockIDList := make([]string, numBlocks) // Base-64 encoded block IDs\n\tprogress := int64(0)\n\tprogressLock := &sync.Mutex{}\n\n\terr := shared.DoBatchTransfer(ctx, &shared.BatchTransferOptions{\n\t\tOperationName: \"uploadFromReader\",\n\t\tTransferSize:  actualSize,\n\t\tChunkSize:     o.BlockSize,\n\t\tNumChunks:     uint64(((actualSize - 1) / o.BlockSize) + 1),\n\t\tConcurrency:   o.Concurrency,\n\t\tOperation: func(ctx context.Context, offset int64, chunkSize int64) error {\n\t\t\t// This function is called once per block.\n\t\t\t// It is passed this block's offset within the buffer and its count of bytes\n\t\t\t// Prepare to read the proper block/section of the buffer\n\t\t\tif chunkSize < o.BlockSize {\n\t\t\t\t// this is the last block.  its actual size might be less\n\t\t\t\t// than the calculated size due to rounding up of the payload\n\t\t\t\t// size to fit in a whole number of blocks.\n\t\t\t\tchunkSize = (actualSize - offset)\n\t\t\t}\n\t\t\tvar body io.ReadSeeker = io.NewSectionReader(reader, offset, chunkSize)\n\t\t\tblockNum := offset / o.BlockSize\n\t\t\tif o.Progress != nil {\n\t\t\t\tblockProgress := int64(0)\n\t\t\t\tbody = streaming.NewRequestProgress(shared.NopCloser(body),\n\t\t\t\t\tfunc(bytesTransferred int64) {\n\t\t\t\t\t\tdiff := bytesTransferred - blockProgress\n\t\t\t\t\t\tblockProgress = bytesTransferred\n\t\t\t\t\t\tprogressLock.Lock() // 1 goroutine at a time gets progress report\n\t\t\t\t\t\tprogress += diff\n\t\t\t\t\t\to.Progress(progress)\n\t\t\t\t\t\tprogressLock.Unlock()\n\t\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Block IDs are unique values to avoid issue if 2+ clients are uploading blocks\n\t\t\t// at the same time causing PutBlockList to get a mix of blocks from all the clients.\n\t\t\tgeneratedUuid, err := uuid.New()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tblockIDList[blockNum] = base64.StdEncoding.EncodeToString([]byte(generatedUuid.String()))\n\t\t\tstageBlockOptions := o.getStageBlockOptions()\n\t\t\t_, err = bb.StageBlock(ctx, blockIDList[blockNum], shared.NopCloser(body), stageBlockOptions)\n\t\t\treturn err\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn uploadFromReaderResponse{}, err\n\t}\n\t// All put blocks were successful, call Put Block List to finalize the blob\n\tcommitBlockListOptions := o.getCommitBlockListOptions()\n\tresp, err := bb.CommitBlockList(ctx, blockIDList, commitBlockListOptions)\n\n\treturn toUploadReaderAtResponseFromCommitBlockListResponse(resp), err\n}\n\n// UploadBuffer uploads a buffer in blocks to a block blob.\nfunc (bb *Client) UploadBuffer(ctx context.Context, buffer []byte, o *UploadBufferOptions) (UploadBufferResponse, error) {\n\tuploadOptions := uploadFromReaderOptions{}\n\tif o != nil {\n\t\tuploadOptions = *o\n\t}\n\n\t// If user attempts to pass in their own checksum, errors out.\n\tif uploadOptions.TransactionalValidation != nil && reflect.TypeOf(uploadOptions.TransactionalValidation).Kind() != reflect.Func {\n\t\treturn UploadBufferResponse{}, bloberror.UnsupportedChecksum\n\t}\n\n\treturn bb.uploadFromReader(ctx, bytes.NewReader(buffer), int64(len(buffer)), &uploadOptions)\n}\n\n// UploadFile uploads a file in blocks to a block blob.\nfunc (bb *Client) UploadFile(ctx context.Context, file *os.File, o *UploadFileOptions) (UploadFileResponse, error) {\n\tstat, err := file.Stat()\n\tif err != nil {\n\t\treturn uploadFromReaderResponse{}, err\n\t}\n\tuploadOptions := uploadFromReaderOptions{}\n\tif o != nil {\n\t\tuploadOptions = *o\n\t}\n\n\t// If user attempts to pass in their own checksum, errors out.\n\tif uploadOptions.TransactionalValidation != nil && reflect.TypeOf(uploadOptions.TransactionalValidation).Kind() != reflect.Func {\n\t\treturn UploadFileResponse{}, bloberror.UnsupportedChecksum\n\t}\n\n\treturn bb.uploadFromReader(ctx, file, stat.Size(), &uploadOptions)\n}\n\n// UploadStream copies the file held in io.Reader to the Blob at blockBlobClient.\n// A Context deadline or cancellation will cause this to error.\nfunc (bb *Client) UploadStream(ctx context.Context, body io.Reader, o *UploadStreamOptions) (UploadStreamResponse, error) {\n\tif o == nil {\n\t\to = &UploadStreamOptions{}\n\t}\n\n\t// If user attempts to pass in their own checksum, errors out.\n\tif o.TransactionalValidation != nil && reflect.TypeOf(o.TransactionalValidation).Kind() != reflect.Func {\n\t\treturn UploadStreamResponse{}, bloberror.UnsupportedChecksum\n\t}\n\n\tresult, err := copyFromReader(ctx, body, bb, *o, shared.NewMMBPool)\n\tif err != nil {\n\t\treturn CommitBlockListResponse{}, err\n\t}\n\n\treturn result, nil\n}\n\n// Concurrent Download Functions -----------------------------------------------------------------------------------------\n\n// DownloadStream reads a range of bytes from a blob. The response also includes the blob's properties and metadata.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob.\nfunc (bb *Client) DownloadStream(ctx context.Context, o *blob.DownloadStreamOptions) (blob.DownloadStreamResponse, error) {\n\treturn bb.BlobClient().DownloadStream(ctx, o)\n}\n\n// DownloadBuffer downloads an Azure blob to a buffer with parallel.\nfunc (bb *Client) DownloadBuffer(ctx context.Context, buffer []byte, o *blob.DownloadBufferOptions) (int64, error) {\n\treturn bb.BlobClient().DownloadBuffer(ctx, shared.NewBytesWriter(buffer), o)\n}\n\n// DownloadFile downloads an Azure blob to a local file.\n// The file would be truncated if the size doesn't match.\nfunc (bb *Client) DownloadFile(ctx context.Context, file *os.File, o *blob.DownloadFileOptions) (int64, error) {\n\treturn bb.BlobClient().DownloadFile(ctx, file, o)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob/constants.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage blockblob\n\nimport \"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\nconst (\n\t// CountToEnd specifies the end of the file.\n\tCountToEnd = 0\n\n\t_1MiB = 1024 * 1024\n\n\t// MaxUploadBlobBytes indicates the maximum number of bytes that can be sent in a call to Upload.\n\tMaxUploadBlobBytes = 256 * 1024 * 1024 // 256MB\n\n\t// MaxStageBlockBytes indicates the maximum number of bytes that can be sent in a call to StageBlock.\n\tMaxStageBlockBytes = 4000 * 1024 * 1024 // 4GB\n\n\t// MaxBlocks indicates the maximum number of blocks allowed in a block blob.\n\tMaxBlocks = 50000\n)\n\n// BlockListType defines values for BlockListType\ntype BlockListType = generated.BlockListType\n\nconst (\n\tBlockListTypeCommitted   BlockListType = generated.BlockListTypeCommitted\n\tBlockListTypeUncommitted BlockListType = generated.BlockListTypeUncommitted\n\tBlockListTypeAll         BlockListType = generated.BlockListTypeAll\n)\n\n// PossibleBlockListTypeValues returns the possible values for the BlockListType const type.\nfunc PossibleBlockListTypeValues() []BlockListType {\n\treturn generated.PossibleBlockListTypeValues()\n}\n\n// BlobCopySourceTags - can be 'COPY' or 'REPLACE'\ntype BlobCopySourceTags = generated.BlobCopySourceTags\n\nconst (\n\tBlobCopySourceTagsCopy    = generated.BlobCopySourceTagsCOPY\n\tBlobCopySourceTagsReplace = generated.BlobCopySourceTagsREPLACE\n)\n\n// PossibleBlobCopySourceTagsValues returns the possible values for the BlobCopySourceTags const type.\nfunc PossibleBlobCopySourceTagsValues() []BlobCopySourceTags {\n\treturn generated.PossibleBlobCopySourceTagsValues()\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob/models.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage blockblob\n\nimport (\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared\"\n)\n\n// Type Declarations ---------------------------------------------------------------------\n\n// Block - Represents a single block in a block blob. It describes the block's ID and size.\ntype Block = generated.Block\n\n// BlockList - can be uncommitted or committed blocks (committed/uncommitted)\ntype BlockList = generated.BlockList\n\n// Request Model Declaration -------------------------------------------------------------------------------------------\n\n// UploadOptions contains the optional parameters for the Client.Upload method.\ntype UploadOptions struct {\n\t// Optional. Used to set blob tags in various blob operations.\n\tTags map[string]string\n\n\t// Optional. Specifies a user-defined name-value pair associated with the blob.\n\tMetadata map[string]*string\n\n\t// Optional. Indicates the tier to be set on the blob.\n\tTier *blob.AccessTier\n\n\t// TransactionalValidation specifies the transfer validation type to use.\n\t// The default is nil (no transfer validation).\n\tTransactionalValidation blob.TransferValidationType\n\n\tHTTPHeaders                  *blob.HTTPHeaders\n\tCPKInfo                      *blob.CPKInfo\n\tCPKScopeInfo                 *blob.CPKScopeInfo\n\tAccessConditions             *blob.AccessConditions\n\tLegalHold                    *bool\n\tImmutabilityPolicyMode       *blob.ImmutabilityPolicySetting\n\tImmutabilityPolicyExpiryTime *time.Time\n\n\t// Deprecated: TransactionalContentMD5 can be set by using TransactionalValidation instead\n\tTransactionalContentMD5 []byte\n}\n\nfunc (o *UploadOptions) format() (*generated.BlockBlobClientUploadOptions, *generated.BlobHTTPHeaders, *generated.LeaseAccessConditions,\n\t*generated.CPKInfo, *generated.CPKScopeInfo, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil, nil, nil\n\t}\n\n\tbasics := generated.BlockBlobClientUploadOptions{\n\t\tBlobTagsString:           shared.SerializeBlobTagsToStrPtr(o.Tags),\n\t\tMetadata:                 o.Metadata,\n\t\tTier:                     o.Tier,\n\t\tTransactionalContentMD5:  o.TransactionalContentMD5,\n\t\tLegalHold:                o.LegalHold,\n\t\tImmutabilityPolicyMode:   o.ImmutabilityPolicyMode,\n\t\tImmutabilityPolicyExpiry: o.ImmutabilityPolicyExpiryTime,\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn &basics, o.HTTPHeaders, leaseAccessConditions, o.CPKInfo, o.CPKScopeInfo, modifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// UploadBlobFromURLOptions contains the optional parameters for the Client.UploadBlobFromURL method.\ntype UploadBlobFromURLOptions struct {\n\t// Optional. Used to set blob tags in various blob operations.\n\tTags map[string]string\n\n\t// Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source.\n\tCopySourceAuthorization *string\n\n\t// Optional, default is true. Indicates if properties from the source blob should be copied.\n\tCopySourceBlobProperties *bool\n\n\t// Optional, default 'replace'. Indicates if source tags should be copied or replaced with the tags specified by x-ms-tags.\n\tCopySourceTags *BlobCopySourceTags\n\n\t// Optional. Specifies a user-defined name-value pair associated with the blob.\n\tMetadata map[string]*string\n\n\t// Optional. Specifies the md5 calculated for the range of bytes that must be read from the copy source.\n\tSourceContentMD5 []byte\n\n\t// Optional. Indicates the tier to be set on the blob.\n\tTier *blob.AccessTier\n\n\t// Additional optional headers\n\tHTTPHeaders                    *blob.HTTPHeaders\n\tAccessConditions               *blob.AccessConditions\n\tCPKInfo                        *blob.CPKInfo\n\tCPKScopeInfo                   *blob.CPKScopeInfo\n\tSourceModifiedAccessConditions *blob.SourceModifiedAccessConditions\n}\n\nfunc (o *UploadBlobFromURLOptions) format() (*generated.BlockBlobClientPutBlobFromURLOptions, *generated.BlobHTTPHeaders,\n\t*generated.LeaseAccessConditions, *generated.CPKInfo, *generated.CPKScopeInfo, *generated.ModifiedAccessConditions,\n\t*generated.SourceModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil, nil, nil, nil\n\t}\n\n\toptions := generated.BlockBlobClientPutBlobFromURLOptions{\n\t\tBlobTagsString:           shared.SerializeBlobTagsToStrPtr(o.Tags),\n\t\tCopySourceAuthorization:  o.CopySourceAuthorization,\n\t\tCopySourceBlobProperties: o.CopySourceBlobProperties,\n\t\tCopySourceTags:           o.CopySourceTags,\n\t\tMetadata:                 o.Metadata,\n\t\tSourceContentMD5:         o.SourceContentMD5,\n\t\tTier:                     o.Tier,\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn &options, o.HTTPHeaders, leaseAccessConditions, o.CPKInfo, o.CPKScopeInfo, modifiedAccessConditions, o.SourceModifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// StageBlockOptions contains the optional parameters for the Client.StageBlock method.\ntype StageBlockOptions struct {\n\tCPKInfo *blob.CPKInfo\n\n\tCPKScopeInfo *blob.CPKScopeInfo\n\n\tLeaseAccessConditions *blob.LeaseAccessConditions\n\n\t// TransactionalValidation specifies the transfer validation type to use.\n\t// The default is nil (no transfer validation).\n\tTransactionalValidation blob.TransferValidationType\n}\n\n// StageBlockOptions contains the optional parameters for the Client.StageBlock method.\nfunc (o *StageBlockOptions) format() (*generated.BlockBlobClientStageBlockOptions, *generated.LeaseAccessConditions, *generated.CPKInfo, *generated.CPKScopeInfo) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil\n\t}\n\n\treturn &generated.BlockBlobClientStageBlockOptions{}, o.LeaseAccessConditions, o.CPKInfo, o.CPKScopeInfo\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// StageBlockFromURLOptions contains the optional parameters for the Client.StageBlockFromURL method.\ntype StageBlockFromURLOptions struct {\n\t// Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source.\n\tCopySourceAuthorization *string\n\n\tLeaseAccessConditions *blob.LeaseAccessConditions\n\n\tSourceModifiedAccessConditions *blob.SourceModifiedAccessConditions\n\n\t// SourceContentValidation contains the validation mechanism used on the range of bytes read from the source.\n\tSourceContentValidation blob.SourceContentValidationType\n\n\t// Range specifies a range of bytes.  The default value is all bytes.\n\tRange blob.HTTPRange\n\n\tCPKInfo *blob.CPKInfo\n\n\tCPKScopeInfo *blob.CPKScopeInfo\n}\n\nfunc (o *StageBlockFromURLOptions) format() (*generated.BlockBlobClientStageBlockFromURLOptions, *generated.CPKInfo, *generated.CPKScopeInfo, *generated.LeaseAccessConditions, *generated.SourceModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil, nil\n\t}\n\n\toptions := &generated.BlockBlobClientStageBlockFromURLOptions{\n\t\tCopySourceAuthorization: o.CopySourceAuthorization,\n\t\tSourceRange:             exported.FormatHTTPRange(o.Range),\n\t}\n\n\tif o.SourceContentValidation != nil {\n\t\to.SourceContentValidation.Apply(options)\n\t}\n\n\treturn options, o.CPKInfo, o.CPKScopeInfo, o.LeaseAccessConditions, o.SourceModifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// CommitBlockListOptions contains the optional parameters for Client.CommitBlockList method.\ntype CommitBlockListOptions struct {\n\tTags                         map[string]string\n\tMetadata                     map[string]*string\n\tRequestID                    *string\n\tTier                         *blob.AccessTier\n\tTimeout                      *int32\n\tHTTPHeaders                  *blob.HTTPHeaders\n\tCPKInfo                      *blob.CPKInfo\n\tCPKScopeInfo                 *blob.CPKScopeInfo\n\tAccessConditions             *blob.AccessConditions\n\tLegalHold                    *bool\n\tImmutabilityPolicyMode       *blob.ImmutabilityPolicySetting\n\tImmutabilityPolicyExpiryTime *time.Time\n\n\t// Deprecated: TransactionalContentCRC64 cannot be generated\n\tTransactionalContentCRC64 []byte\n\n\t// Deprecated: TransactionalContentMD5 cannot be generated\n\tTransactionalContentMD5 []byte\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// GetBlockListOptions contains the optional parameters for the Client.GetBlockList method.\ntype GetBlockListOptions struct {\n\tSnapshot         *string\n\tAccessConditions *blob.AccessConditions\n}\n\nfunc (o *GetBlockListOptions) format() (*generated.BlockBlobClientGetBlockListOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn &generated.BlockBlobClientGetBlockListOptions{Snapshot: o.Snapshot}, leaseAccessConditions, modifiedAccessConditions\n}\n\n// ------------------------------------------------------------\n\n// uploadFromReaderOptions identifies options used by the UploadBuffer and UploadFile functions.\ntype uploadFromReaderOptions struct {\n\t// BlockSize specifies the block size to use; the default (and maximum size) is MaxStageBlockBytes.\n\tBlockSize int64\n\n\t// Progress is a function that is invoked periodically as bytes are sent to the BlockBlobClient.\n\t// Note that the progress reporting is not always increasing; it can go down when retrying a request.\n\tProgress func(bytesTransferred int64)\n\n\t// HTTPHeaders indicates the HTTP headers to be associated with the blob.\n\tHTTPHeaders *blob.HTTPHeaders\n\n\t// Metadata indicates the metadata to be associated with the blob when PutBlockList is called.\n\tMetadata map[string]*string\n\n\t// AccessConditions indicates the access conditions for the block blob.\n\tAccessConditions *blob.AccessConditions\n\n\t// AccessTier indicates the tier of blob\n\tAccessTier *blob.AccessTier\n\n\t// BlobTags\n\tTags map[string]string\n\n\t// ClientProvidedKeyOptions indicates the client provided key by name and/or by value to encrypt/decrypt data.\n\tCPKInfo      *blob.CPKInfo\n\tCPKScopeInfo *blob.CPKScopeInfo\n\n\t// Concurrency indicates the maximum number of blocks to upload in parallel (0=default)\n\tConcurrency uint16\n\n\tTransactionalValidation blob.TransferValidationType\n\n\t// Deprecated: TransactionalContentCRC64 cannot be generated at block level\n\tTransactionalContentCRC64 uint64\n\n\t// Deprecated: TransactionalContentMD5 cannot be generated at block level\n\tTransactionalContentMD5 []byte\n}\n\n// UploadBufferOptions provides set of configurations for UploadBuffer operation.\ntype UploadBufferOptions = uploadFromReaderOptions\n\n// UploadFileOptions provides set of configurations for UploadFile operation.\ntype UploadFileOptions = uploadFromReaderOptions\n\nfunc (o *uploadFromReaderOptions) getStageBlockOptions() *StageBlockOptions {\n\tleaseAccessConditions, _ := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn &StageBlockOptions{\n\t\tCPKInfo:               o.CPKInfo,\n\t\tCPKScopeInfo:          o.CPKScopeInfo,\n\t\tLeaseAccessConditions: leaseAccessConditions,\n\n\t\tTransactionalValidation: o.TransactionalValidation,\n\t}\n}\n\nfunc (o *uploadFromReaderOptions) getUploadBlockBlobOptions() *UploadOptions {\n\treturn &UploadOptions{\n\t\tTags:             o.Tags,\n\t\tMetadata:         o.Metadata,\n\t\tTier:             o.AccessTier,\n\t\tHTTPHeaders:      o.HTTPHeaders,\n\t\tAccessConditions: o.AccessConditions,\n\t\tCPKInfo:          o.CPKInfo,\n\t\tCPKScopeInfo:     o.CPKScopeInfo,\n\t}\n}\n\nfunc (o *uploadFromReaderOptions) getCommitBlockListOptions() *CommitBlockListOptions {\n\treturn &CommitBlockListOptions{\n\t\tTags:         o.Tags,\n\t\tMetadata:     o.Metadata,\n\t\tTier:         o.AccessTier,\n\t\tHTTPHeaders:  o.HTTPHeaders,\n\t\tCPKInfo:      o.CPKInfo,\n\t\tCPKScopeInfo: o.CPKScopeInfo,\n\t}\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// UploadStreamOptions provides set of configurations for UploadStream operation.\ntype UploadStreamOptions struct {\n\t// BlockSize defines the size of the buffer used during upload. The default and minimum value is 1 MiB.\n\tBlockSize int64\n\n\t// Concurrency defines the max number of concurrent uploads to be performed to upload the file.\n\t// Each concurrent upload will create a buffer of size BlockSize.  The default value is one.\n\tConcurrency int\n\n\tTransactionalValidation blob.TransferValidationType\n\n\tHTTPHeaders      *blob.HTTPHeaders\n\tMetadata         map[string]*string\n\tAccessConditions *blob.AccessConditions\n\tAccessTier       *blob.AccessTier\n\tTags             map[string]string\n\tCPKInfo          *blob.CPKInfo\n\tCPKScopeInfo     *blob.CPKScopeInfo\n}\n\nfunc (u *UploadStreamOptions) setDefaults() {\n\tif u.Concurrency == 0 {\n\t\tu.Concurrency = 1\n\t}\n\n\tif u.BlockSize < _1MiB {\n\t\tu.BlockSize = _1MiB\n\t}\n}\n\nfunc (u *UploadStreamOptions) getStageBlockOptions() *StageBlockOptions {\n\tif u == nil {\n\t\treturn nil\n\t}\n\n\tleaseAccessConditions, _ := exported.FormatBlobAccessConditions(u.AccessConditions)\n\treturn &StageBlockOptions{\n\t\tTransactionalValidation: u.TransactionalValidation,\n\t\tCPKInfo:                 u.CPKInfo,\n\t\tCPKScopeInfo:            u.CPKScopeInfo,\n\t\tLeaseAccessConditions:   leaseAccessConditions,\n\t}\n}\n\nfunc (u *UploadStreamOptions) getCommitBlockListOptions() *CommitBlockListOptions {\n\tif u == nil {\n\t\treturn nil\n\t}\n\n\treturn &CommitBlockListOptions{\n\t\tTags:             u.Tags,\n\t\tMetadata:         u.Metadata,\n\t\tTier:             u.AccessTier,\n\t\tHTTPHeaders:      u.HTTPHeaders,\n\t\tCPKInfo:          u.CPKInfo,\n\t\tCPKScopeInfo:     u.CPKScopeInfo,\n\t\tAccessConditions: u.AccessConditions,\n\t}\n}\n\nfunc (u *UploadStreamOptions) getUploadOptions() *UploadOptions {\n\tif u == nil {\n\t\treturn nil\n\t}\n\n\treturn &UploadOptions{\n\t\tTags:             u.Tags,\n\t\tMetadata:         u.Metadata,\n\t\tTier:             u.AccessTier,\n\t\tHTTPHeaders:      u.HTTPHeaders,\n\t\tCPKInfo:          u.CPKInfo,\n\t\tCPKScopeInfo:     u.CPKScopeInfo,\n\t\tAccessConditions: u.AccessConditions,\n\t}\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// ExpiryType defines values for ExpiryType.\ntype ExpiryType = exported.ExpiryType\n\n// ExpiryTypeAbsolute defines the absolute time for the blob expiry.\ntype ExpiryTypeAbsolute = exported.ExpiryTypeAbsolute\n\n// ExpiryTypeRelativeToNow defines the duration relative to now for the blob expiry.\ntype ExpiryTypeRelativeToNow = exported.ExpiryTypeRelativeToNow\n\n// ExpiryTypeRelativeToCreation defines the duration relative to creation for the blob expiry.\ntype ExpiryTypeRelativeToCreation = exported.ExpiryTypeRelativeToCreation\n\n// ExpiryTypeNever defines that the blob will be set to never expire.\ntype ExpiryTypeNever = exported.ExpiryTypeNever\n\n// SetExpiryOptions contains the optional parameters for the Client.SetExpiry method.\ntype SetExpiryOptions = exported.SetExpiryOptions\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob/responses.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage blockblob\n\nimport (\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n)\n\n// UploadResponse contains the response from method Client.Upload.\ntype UploadResponse = generated.BlockBlobClientUploadResponse\n\n// UploadBlobFromURLResponse contains the response from the method Client.UploadBlobFromURL\ntype UploadBlobFromURLResponse = generated.BlockBlobClientPutBlobFromURLResponse\n\n// StageBlockResponse contains the response from method Client.StageBlock.\ntype StageBlockResponse = generated.BlockBlobClientStageBlockResponse\n\n// CommitBlockListResponse contains the response from method Client.CommitBlockList.\ntype CommitBlockListResponse = generated.BlockBlobClientCommitBlockListResponse\n\n// StageBlockFromURLResponse contains the response from method Client.StageBlockFromURL.\ntype StageBlockFromURLResponse = generated.BlockBlobClientStageBlockFromURLResponse\n\n// GetBlockListResponse contains the response from method Client.GetBlockList.\ntype GetBlockListResponse = generated.BlockBlobClientGetBlockListResponse\n\n// uploadFromReaderResponse contains the response from method Client.UploadBuffer/Client.UploadFile.\ntype uploadFromReaderResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// ContentMD5 contains the information returned from the Content-MD5 header response.\n\tContentMD5 []byte\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response.\n\tEncryptionKeySHA256 *string\n\n\t// EncryptionScope contains the information returned from the x-ms-encryption-scope header response.\n\tEncryptionScope *string\n\n\t// IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response.\n\tIsServerEncrypted *bool\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n\n\t// VersionID contains the information returned from the x-ms-version-id header response.\n\tVersionID *string\n\n\t// ContentCRC64 contains the information returned from the x-ms-content-crc64 header response.\n\t// Will be a part of response only if uploading data >= internal.MaxUploadBlobBytes (= 256 * 1024 * 1024 // 256MB)\n\tContentCRC64 []byte\n}\n\nfunc toUploadReaderAtResponseFromUploadResponse(resp UploadResponse) uploadFromReaderResponse {\n\treturn uploadFromReaderResponse{\n\t\tClientRequestID:     resp.ClientRequestID,\n\t\tContentMD5:          resp.ContentMD5,\n\t\tDate:                resp.Date,\n\t\tETag:                resp.ETag,\n\t\tEncryptionKeySHA256: resp.EncryptionKeySHA256,\n\t\tEncryptionScope:     resp.EncryptionScope,\n\t\tIsServerEncrypted:   resp.IsServerEncrypted,\n\t\tLastModified:        resp.LastModified,\n\t\tRequestID:           resp.RequestID,\n\t\tVersion:             resp.Version,\n\t\tVersionID:           resp.VersionID,\n\t}\n}\n\nfunc toUploadReaderAtResponseFromCommitBlockListResponse(resp CommitBlockListResponse) uploadFromReaderResponse {\n\treturn uploadFromReaderResponse{\n\t\tClientRequestID:     resp.ClientRequestID,\n\t\tContentMD5:          resp.ContentMD5,\n\t\tDate:                resp.Date,\n\t\tETag:                resp.ETag,\n\t\tEncryptionKeySHA256: resp.EncryptionKeySHA256,\n\t\tEncryptionScope:     resp.EncryptionScope,\n\t\tIsServerEncrypted:   resp.IsServerEncrypted,\n\t\tLastModified:        resp.LastModified,\n\t\tRequestID:           resp.RequestID,\n\t\tVersion:             resp.Version,\n\t\tVersionID:           resp.VersionID,\n\t\tContentCRC64:        resp.ContentCRC64,\n\t}\n}\n\n// UploadFileResponse contains the response from method Client.UploadBuffer/Client.UploadFile.\ntype UploadFileResponse = uploadFromReaderResponse\n\n// UploadBufferResponse contains the response from method Client.UploadBuffer/Client.UploadFile.\ntype UploadBufferResponse = uploadFromReaderResponse\n\n// UploadStreamResponse contains the response from method Client.CommitBlockList.\ntype UploadStreamResponse = CommitBlockListResponse\n\n// SetExpiryResponse contains the response from method Client.SetExpiry.\ntype SetExpiryResponse = generated.BlobClientSetExpiryResponse\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/ci.yml",
    "content": "trigger:\n  branches:\n    include:\n      - main\n      - feature/*\n      - hotfix/*\n      - release/*\n  paths:\n    include:\n      - sdk/storage/azblob\n\npr:\n  branches:\n    include:\n      - main\n      - feature/*\n      - hotfix/*\n      - release/*\n  paths:\n    include:\n      - sdk/storage/azblob\n\n\nextends:\n    template: /eng/pipelines/templates/jobs/archetype-sdk-client.yml\n    parameters:\n      ServiceDirectory: 'storage/azblob'\n      RunLiveTests: true\n      UsePipelineProxy: false\n      EnvVars:\n        AZURE_CLIENT_ID: $(AZBLOB_CLIENT_ID)\n        AZURE_TENANT_ID: $(AZBLOB_TENANT_ID)\n        AZURE_CLIENT_SECRET: $(AZBLOB_CLIENT_SECRET)\n        AZURE_SUBSCRIPTION_ID: $(AZBLOB_SUBSCRIPTION_ID)\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/client.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage azblob\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/base\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/service\"\n)\n\n// ClientOptions contains the optional parameters when creating a Client.\ntype ClientOptions base.ClientOptions\n\n// Client represents a URL to an Azure Storage blob; the blob may be a block blob, append blob, or page blob.\ntype Client struct {\n\tsvc *service.Client\n}\n\n// NewClient creates an instance of Client with the specified values.\n//   - serviceURL - the URL of the storage account e.g. https://<account>.blob.core.windows.net/\n//   - cred - an Azure AD credential, typically obtained via the azidentity module\n//   - options - client options; pass nil to accept the default values\nfunc NewClient(serviceURL string, cred azcore.TokenCredential, options *ClientOptions) (*Client, error) {\n\tsvcClient, err := service.NewClient(serviceURL, cred, (*service.ClientOptions)(options))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &Client{\n\t\tsvc: svcClient,\n\t}, nil\n}\n\n// NewClientWithNoCredential creates an instance of Client with the specified values.\n// This is used to anonymously access a storage account or with a shared access signature (SAS) token.\n//   - serviceURL - the URL of the storage account e.g. https://<account>.blob.core.windows.net/?<sas token>\n//   - options - client options; pass nil to accept the default values\nfunc NewClientWithNoCredential(serviceURL string, options *ClientOptions) (*Client, error) {\n\tsvcClient, err := service.NewClientWithNoCredential(serviceURL, (*service.ClientOptions)(options))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &Client{\n\t\tsvc: svcClient,\n\t}, nil\n}\n\n// NewClientWithSharedKeyCredential creates an instance of Client with the specified values.\n//   - serviceURL - the URL of the storage account e.g. https://<account>.blob.core.windows.net/\n//   - cred - a SharedKeyCredential created with the matching storage account and access key\n//   - options - client options; pass nil to accept the default values\nfunc NewClientWithSharedKeyCredential(serviceURL string, cred *SharedKeyCredential, options *ClientOptions) (*Client, error) {\n\tsvcClient, err := service.NewClientWithSharedKeyCredential(serviceURL, cred, (*service.ClientOptions)(options))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &Client{\n\t\tsvc: svcClient,\n\t}, nil\n}\n\n// NewClientFromConnectionString creates an instance of Client with the specified values.\n//   - connectionString - a connection string for the desired storage account\n//   - options - client options; pass nil to accept the default values\nfunc NewClientFromConnectionString(connectionString string, options *ClientOptions) (*Client, error) {\n\tsvcClient, err := service.NewClientFromConnectionString(connectionString, (*service.ClientOptions)(options))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &Client{\n\t\tsvc: svcClient,\n\t}, nil\n}\n\n// URL returns the URL endpoint used by the BlobClient object.\nfunc (c *Client) URL() string {\n\treturn c.svc.URL()\n}\n\n// ServiceClient returns the embedded service client for this client.\nfunc (c *Client) ServiceClient() *service.Client {\n\treturn c.svc\n}\n\n// CreateContainer is a lifecycle method to creates a new container under the specified account.\n// If the container with the same name already exists, a ContainerAlreadyExists Error will be raised.\n// This method returns a client with which to interact with the newly created container.\nfunc (c *Client) CreateContainer(ctx context.Context, containerName string, o *CreateContainerOptions) (CreateContainerResponse, error) {\n\treturn c.svc.CreateContainer(ctx, containerName, o)\n}\n\n// DeleteContainer is a lifecycle method that marks the specified container for deletion.\n// The container and any blobs contained within it are later deleted during garbage collection.\n// If the container is not found, a ResourceNotFoundError will be raised.\nfunc (c *Client) DeleteContainer(ctx context.Context, containerName string, o *DeleteContainerOptions) (DeleteContainerResponse, error) {\n\treturn c.svc.DeleteContainer(ctx, containerName, o)\n}\n\n// DeleteBlob marks the specified blob or snapshot for deletion. The blob is later deleted during garbage collection.\n// Note that deleting a blob also deletes all its snapshots.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-blob.\nfunc (c *Client) DeleteBlob(ctx context.Context, containerName string, blobName string, o *DeleteBlobOptions) (DeleteBlobResponse, error) {\n\treturn c.svc.NewContainerClient(containerName).NewBlobClient(blobName).Delete(ctx, o)\n}\n\n// NewListBlobsFlatPager returns a pager for blobs starting from the specified Marker. Use an empty\n// Marker to start enumeration from the beginning. Blob names are returned in lexicographic order.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/list-blobs.\nfunc (c *Client) NewListBlobsFlatPager(containerName string, o *ListBlobsFlatOptions) *runtime.Pager[ListBlobsFlatResponse] {\n\treturn c.svc.NewContainerClient(containerName).NewListBlobsFlatPager(o)\n}\n\n// NewListContainersPager operation returns a pager of the containers under the specified account.\n// Use an empty Marker to start enumeration from the beginning. Container names are returned in lexicographic order.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/list-containers2.\nfunc (c *Client) NewListContainersPager(o *ListContainersOptions) *runtime.Pager[ListContainersResponse] {\n\treturn c.svc.NewListContainersPager(o)\n}\n\n// UploadBuffer uploads a buffer in blocks to a block blob.\nfunc (c *Client) UploadBuffer(ctx context.Context, containerName string, blobName string, buffer []byte, o *UploadBufferOptions) (UploadBufferResponse, error) {\n\treturn c.svc.NewContainerClient(containerName).NewBlockBlobClient(blobName).UploadBuffer(ctx, buffer, o)\n}\n\n// UploadFile uploads a file in blocks to a block blob.\nfunc (c *Client) UploadFile(ctx context.Context, containerName string, blobName string, file *os.File, o *UploadFileOptions) (UploadFileResponse, error) {\n\treturn c.svc.NewContainerClient(containerName).NewBlockBlobClient(blobName).UploadFile(ctx, file, o)\n}\n\n// UploadStream copies the file held in io.Reader to the Blob at blockBlobClient.\n// A Context deadline or cancellation will cause this to error.\nfunc (c *Client) UploadStream(ctx context.Context, containerName string, blobName string, body io.Reader, o *UploadStreamOptions) (UploadStreamResponse, error) {\n\treturn c.svc.NewContainerClient(containerName).NewBlockBlobClient(blobName).UploadStream(ctx, body, o)\n}\n\n// DownloadBuffer downloads an Azure blob to a buffer with parallel.\nfunc (c *Client) DownloadBuffer(ctx context.Context, containerName string, blobName string, buffer []byte, o *DownloadBufferOptions) (int64, error) {\n\treturn c.svc.NewContainerClient(containerName).NewBlobClient(blobName).DownloadBuffer(ctx, shared.NewBytesWriter(buffer), o)\n}\n\n// DownloadFile downloads an Azure blob to a local file.\n// The file would be truncated if the size doesn't match.\nfunc (c *Client) DownloadFile(ctx context.Context, containerName string, blobName string, file *os.File, o *DownloadFileOptions) (int64, error) {\n\treturn c.svc.NewContainerClient(containerName).NewBlobClient(blobName).DownloadFile(ctx, file, o)\n}\n\n// DownloadStream reads a range of bytes from a blob. The response also includes the blob's properties and metadata.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob.\nfunc (c *Client) DownloadStream(ctx context.Context, containerName string, blobName string, o *DownloadStreamOptions) (DownloadStreamResponse, error) {\n\to = shared.CopyOptions(o)\n\treturn c.svc.NewContainerClient(containerName).NewBlobClient(blobName).DownloadStream(ctx, o)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/common.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage azblob\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas\"\n)\n\n// SharedKeyCredential contains an account's name and its primary or secondary key.\ntype SharedKeyCredential = exported.SharedKeyCredential\n\n// NewSharedKeyCredential creates an immutable SharedKeyCredential containing the\n// storage account's name and either its primary or secondary key.\nfunc NewSharedKeyCredential(accountName, accountKey string) (*SharedKeyCredential, error) {\n\treturn exported.NewSharedKeyCredential(accountName, accountKey)\n}\n\n// URLParts object represents the components that make up an Azure Storage Container/Blob URL.\n// NOTE: Changing any SAS-related field requires computing a new SAS signature.\ntype URLParts = sas.URLParts\n\n// ParseURL parses a URL initializing URLParts' fields including any SAS-related & snapshot query parameters. Any other\n// query parameters remain in the UnparsedParams field. This method overwrites all fields in the URLParts object.\nfunc ParseURL(u string) (URLParts, error) {\n\treturn sas.ParseURL(u)\n}\n\n// HTTPRange defines a range of bytes within an HTTP resource, starting at offset and\n// ending at offset+count. A zero-value HTTPRange indicates the entire resource. An HTTPRange\n// which has an offset and zero value count indicates from the offset to the resource's end.\ntype HTTPRange = exported.HTTPRange\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/constants.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage azblob\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n)\n\n// PublicAccessType defines values for AccessType - private (default) or blob or container.\ntype PublicAccessType = generated.PublicAccessType\n\nconst (\n\tPublicAccessTypeBlob      PublicAccessType = generated.PublicAccessTypeBlob\n\tPublicAccessTypeContainer PublicAccessType = generated.PublicAccessTypeContainer\n)\n\n// PossiblePublicAccessTypeValues returns the possible values for the PublicAccessType const type.\nfunc PossiblePublicAccessTypeValues() []PublicAccessType {\n\treturn generated.PossiblePublicAccessTypeValues()\n}\n\n// DeleteSnapshotsOptionType defines values for DeleteSnapshotsOptionType.\ntype DeleteSnapshotsOptionType = generated.DeleteSnapshotsOptionType\n\nconst (\n\tDeleteSnapshotsOptionTypeInclude DeleteSnapshotsOptionType = generated.DeleteSnapshotsOptionTypeInclude\n\tDeleteSnapshotsOptionTypeOnly    DeleteSnapshotsOptionType = generated.DeleteSnapshotsOptionTypeOnly\n)\n\n// PossibleDeleteSnapshotsOptionTypeValues returns the possible values for the DeleteSnapshotsOptionType const type.\nfunc PossibleDeleteSnapshotsOptionTypeValues() []DeleteSnapshotsOptionType {\n\treturn generated.PossibleDeleteSnapshotsOptionTypeValues()\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container/batch_builder.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage container\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/url\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n)\n\n// BatchBuilder is used for creating the batch operations list. It contains the list of either delete or set tier sub-requests.\n// NOTE: All sub-requests in the batch must be of the same type, either delete or set tier.\ntype BatchBuilder struct {\n\tendpoint      string\n\tauthPolicy    policy.Policy\n\tsubRequests   []*policy.Request\n\toperationType *exported.BlobBatchOperationType\n}\n\nfunc (bb *BatchBuilder) checkOperationType(operationType exported.BlobBatchOperationType) error {\n\tif bb.operationType == nil {\n\t\tbb.operationType = &operationType\n\t\treturn nil\n\t}\n\tif *bb.operationType != operationType {\n\t\treturn fmt.Errorf(\"BlobBatch only supports one operation type per batch and is already being used for %s operations\", *bb.operationType)\n\t}\n\treturn nil\n}\n\n// Delete operation is used to add delete sub-request to the batch builder.\nfunc (bb *BatchBuilder) Delete(blobName string, options *BatchDeleteOptions) error {\n\terr := bb.checkOperationType(exported.BatchDeleteOperationType)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tblobName = url.PathEscape(blobName)\n\tblobURL := runtime.JoinPaths(bb.endpoint, blobName)\n\n\tblobClient, err := blob.NewClientWithNoCredential(blobURL, nil)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdeleteOptions, leaseInfo, accessConditions := options.format()\n\treq, err := getGeneratedBlobClient(blobClient).DeleteCreateRequest(context.TODO(), deleteOptions, leaseInfo, accessConditions)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// remove x-ms-version header\n\texported.UpdateSubRequestHeaders(req)\n\n\tbb.subRequests = append(bb.subRequests, req)\n\treturn nil\n}\n\n// SetTier operation is used to add set tier sub-request to the batch builder.\nfunc (bb *BatchBuilder) SetTier(blobName string, accessTier blob.AccessTier, options *BatchSetTierOptions) error {\n\terr := bb.checkOperationType(exported.BatchSetTierOperationType)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tblobName = url.PathEscape(blobName)\n\tblobURL := runtime.JoinPaths(bb.endpoint, blobName)\n\n\tblobClient, err := blob.NewClientWithNoCredential(blobURL, nil)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tsetTierOptions, leaseInfo, accessConditions := options.format()\n\treq, err := getGeneratedBlobClient(blobClient).SetTierCreateRequest(context.TODO(), accessTier, setTierOptions, leaseInfo, accessConditions)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// remove x-ms-version header\n\texported.UpdateSubRequestHeaders(req)\n\n\tbb.subRequests = append(bb.subRequests, req)\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container/client.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage container\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/appendblob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/bloberror\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/base\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/pageblob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas\"\n)\n\n// ClientOptions contains the optional parameters when creating a Client.\ntype ClientOptions base.ClientOptions\n\n// Client represents a URL to the Azure Storage container allowing you to manipulate its blobs.\ntype Client base.Client[generated.ContainerClient]\n\n// NewClient creates an instance of Client with the specified values.\n//   - containerURL - the URL of the container e.g. https://<account>.blob.core.windows.net/container\n//   - cred - an Azure AD credential, typically obtained via the azidentity module\n//   - options - client options; pass nil to accept the default values\nfunc NewClient(containerURL string, cred azcore.TokenCredential, options *ClientOptions) (*Client, error) {\n\taudience := base.GetAudience((*base.ClientOptions)(options))\n\tconOptions := shared.GetClientOptions(options)\n\tauthPolicy := shared.NewStorageChallengePolicy(cred, audience, conOptions.InsecureAllowCredentialWithHTTP)\n\tplOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}}\n\n\tazClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn (*Client)(base.NewContainerClient(containerURL, azClient, &cred, (*base.ClientOptions)(conOptions))), nil\n}\n\n// NewClientWithNoCredential creates an instance of Client with the specified values.\n// This is used to anonymously access a container or with a shared access signature (SAS) token.\n//   - containerURL - the URL of the container e.g. https://<account>.blob.core.windows.net/container?<sas token>\n//   - options - client options; pass nil to accept the default values\nfunc NewClientWithNoCredential(containerURL string, options *ClientOptions) (*Client, error) {\n\tconOptions := shared.GetClientOptions(options)\n\n\tazClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, runtime.PipelineOptions{}, &conOptions.ClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn (*Client)(base.NewContainerClient(containerURL, azClient, nil, (*base.ClientOptions)(conOptions))), nil\n}\n\n// NewClientWithSharedKeyCredential creates an instance of Client with the specified values.\n//   - containerURL - the URL of the container e.g. https://<account>.blob.core.windows.net/container\n//   - cred - a SharedKeyCredential created with the matching container's storage account and access key\n//   - options - client options; pass nil to accept the default values\nfunc NewClientWithSharedKeyCredential(containerURL string, cred *SharedKeyCredential, options *ClientOptions) (*Client, error) {\n\tauthPolicy := exported.NewSharedKeyCredPolicy(cred)\n\tconOptions := shared.GetClientOptions(options)\n\tplOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}}\n\n\tazClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn (*Client)(base.NewContainerClient(containerURL, azClient, cred, (*base.ClientOptions)(conOptions))), nil\n}\n\n// NewClientFromConnectionString creates an instance of Client with the specified values.\n//   - connectionString - a connection string for the desired storage account\n//   - containerName - the name of the container within the storage account\n//   - options - client options; pass nil to accept the default values\nfunc NewClientFromConnectionString(connectionString string, containerName string, options *ClientOptions) (*Client, error) {\n\tparsed, err := shared.ParseConnectionString(connectionString)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tparsed.ServiceURL = runtime.JoinPaths(parsed.ServiceURL, containerName)\n\n\tif parsed.AccountKey != \"\" && parsed.AccountName != \"\" {\n\t\tcredential, err := exported.NewSharedKeyCredential(parsed.AccountName, parsed.AccountKey)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn NewClientWithSharedKeyCredential(parsed.ServiceURL, credential, options)\n\t}\n\n\treturn NewClientWithNoCredential(parsed.ServiceURL, options)\n}\n\nfunc (c *Client) generated() *generated.ContainerClient {\n\treturn base.InnerClient((*base.Client[generated.ContainerClient])(c))\n}\n\nfunc (c *Client) sharedKey() *SharedKeyCredential {\n\treturn base.SharedKey((*base.Client[generated.ContainerClient])(c))\n}\n\nfunc (c *Client) credential() any {\n\treturn base.Credential((*base.Client[generated.ContainerClient])(c))\n}\n\n// helper method to return the generated.BlobClient which is used for creating the sub-requests\nfunc getGeneratedBlobClient(b *blob.Client) *generated.BlobClient {\n\treturn base.InnerClient((*base.Client[generated.BlobClient])(b))\n}\n\nfunc (c *Client) getClientOptions() *base.ClientOptions {\n\treturn base.GetClientOptions((*base.Client[generated.ContainerClient])(c))\n}\n\n// URL returns the URL endpoint used by the Client object.\nfunc (c *Client) URL() string {\n\treturn c.generated().Endpoint()\n}\n\n// NewBlobClient creates a new blob.Client object by concatenating blobName to the end of\n// Client's URL. The blob name will be URL-encoded.\n// The new blob.Client uses the same request policy pipeline as this Client.\nfunc (c *Client) NewBlobClient(blobName string) *blob.Client {\n\tblobName = url.PathEscape(blobName)\n\tblobURL := runtime.JoinPaths(c.URL(), blobName)\n\treturn (*blob.Client)(base.NewBlobClient(blobURL, c.generated().InternalClient().WithClientName(exported.ModuleName), c.credential(), c.getClientOptions()))\n}\n\n// NewAppendBlobClient creates a new appendblob.Client object by concatenating blobName to the end of\n// this Client's URL. The blob name will be URL-encoded.\n// The new appendblob.Client uses the same request policy pipeline as this Client.\nfunc (c *Client) NewAppendBlobClient(blobName string) *appendblob.Client {\n\tblobName = url.PathEscape(blobName)\n\tblobURL := runtime.JoinPaths(c.URL(), blobName)\n\treturn (*appendblob.Client)(base.NewAppendBlobClient(blobURL, c.generated().InternalClient().WithClientName(exported.ModuleName), c.sharedKey()))\n}\n\n// NewBlockBlobClient creates a new blockblob.Client object by concatenating blobName to the end of\n// this Client's URL. The blob name will be URL-encoded.\n// The new blockblob.Client uses the same request policy pipeline as this Client.\nfunc (c *Client) NewBlockBlobClient(blobName string) *blockblob.Client {\n\tblobName = url.PathEscape(blobName)\n\tblobURL := runtime.JoinPaths(c.URL(), blobName)\n\treturn (*blockblob.Client)(base.NewBlockBlobClient(blobURL, c.generated().InternalClient().WithClientName(exported.ModuleName), c.sharedKey()))\n}\n\n// NewPageBlobClient creates a new pageblob.Client object by concatenating blobName to the end of\n// this Client's URL. The blob name will be URL-encoded.\n// The new pageblob.Client uses the same request policy pipeline as this Client.\nfunc (c *Client) NewPageBlobClient(blobName string) *pageblob.Client {\n\tblobName = url.PathEscape(blobName)\n\tblobURL := runtime.JoinPaths(c.URL(), blobName)\n\treturn (*pageblob.Client)(base.NewPageBlobClient(blobURL, c.generated().InternalClient().WithClientName(exported.ModuleName), c.sharedKey()))\n}\n\n// Create creates a new container within a storage account. If a container with the same name already exists, the operation fails.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/create-container.\nfunc (c *Client) Create(ctx context.Context, options *CreateOptions) (CreateResponse, error) {\n\tvar opts *generated.ContainerClientCreateOptions\n\tvar cpkScopes *generated.ContainerCPKScopeInfo\n\tif options != nil {\n\t\topts = &generated.ContainerClientCreateOptions{\n\t\t\tAccess:   options.Access,\n\t\t\tMetadata: options.Metadata,\n\t\t}\n\t\tcpkScopes = options.CPKScopeInfo\n\t}\n\tresp, err := c.generated().Create(ctx, opts, cpkScopes)\n\n\treturn resp, err\n}\n\n// Delete marks the specified container for deletion. The container and any blobs contained within it are later deleted during garbage collection.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-container.\nfunc (c *Client) Delete(ctx context.Context, options *DeleteOptions) (DeleteResponse, error) {\n\topts, leaseAccessConditions, modifiedAccessConditions := options.format()\n\tresp, err := c.generated().Delete(ctx, opts, leaseAccessConditions, modifiedAccessConditions)\n\n\treturn resp, err\n}\n\n// Restore operation restore the contents and properties of a soft deleted container to a specified container.\n// For more information, see https://docs.microsoft.com/en-us/rest/api/storageservices/restore-container.\nfunc (c *Client) Restore(ctx context.Context, deletedContainerVersion string, options *RestoreOptions) (RestoreResponse, error) {\n\turlParts, err := blob.ParseURL(c.URL())\n\tif err != nil {\n\t\treturn RestoreResponse{}, err\n\t}\n\n\topts := &generated.ContainerClientRestoreOptions{\n\t\tDeletedContainerName:    &urlParts.ContainerName,\n\t\tDeletedContainerVersion: &deletedContainerVersion,\n\t}\n\tresp, err := c.generated().Restore(ctx, opts)\n\n\treturn resp, err\n}\n\n// GetProperties returns the container's properties.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-container-metadata.\nfunc (c *Client) GetProperties(ctx context.Context, o *GetPropertiesOptions) (GetPropertiesResponse, error) {\n\t// NOTE: GetMetadata actually calls GetProperties internally because GetProperties returns the metadata AND the properties.\n\t// This allows us to not expose a GetMetadata method at all simplifying the API.\n\t// The optionals are nil, like they were in track 1.5\n\topts, leaseAccessConditions := o.format()\n\n\tresp, err := c.generated().GetProperties(ctx, opts, leaseAccessConditions)\n\treturn resp, err\n}\n\n// SetMetadata sets the container's metadata.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/set-container-metadata.\nfunc (c *Client) SetMetadata(ctx context.Context, o *SetMetadataOptions) (SetMetadataResponse, error) {\n\tmetadataOptions, lac, mac := o.format()\n\tresp, err := c.generated().SetMetadata(ctx, metadataOptions, lac, mac)\n\n\treturn resp, err\n}\n\n// GetAccessPolicy returns the container's access policy. The access policy indicates whether container's blobs may be accessed publicly.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-container-acl.\nfunc (c *Client) GetAccessPolicy(ctx context.Context, o *GetAccessPolicyOptions) (GetAccessPolicyResponse, error) {\n\toptions, ac := o.format()\n\tresp, err := c.generated().GetAccessPolicy(ctx, options, ac)\n\treturn resp, err\n}\n\n// SetAccessPolicy sets the container's permissions. The access policy indicates whether blobs in a container may be accessed publicly.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/set-container-acl.\nfunc (c *Client) SetAccessPolicy(ctx context.Context, o *SetAccessPolicyOptions) (SetAccessPolicyResponse, error) {\n\taccessPolicy, mac, lac, acl, err := o.format()\n\tif err != nil {\n\t\treturn SetAccessPolicyResponse{}, err\n\t}\n\tresp, err := c.generated().SetAccessPolicy(ctx, acl, accessPolicy, mac, lac)\n\treturn resp, err\n}\n\n// GetAccountInfo provides account level information\n// For more information, see https://learn.microsoft.com/en-us/rest/api/storageservices/get-account-information?tabs=shared-access-signatures.\nfunc (c *Client) GetAccountInfo(ctx context.Context, o *GetAccountInfoOptions) (GetAccountInfoResponse, error) {\n\tgetAccountInfoOptions := o.format()\n\tresp, err := c.generated().GetAccountInfo(ctx, getAccountInfoOptions)\n\treturn resp, err\n}\n\n// NewListBlobsFlatPager returns a pager for blobs starting from the specified Marker. Use an empty\n// Marker to start enumeration from the beginning. Blob names are returned in lexicographic order.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/list-blobs.\nfunc (c *Client) NewListBlobsFlatPager(o *ListBlobsFlatOptions) *runtime.Pager[ListBlobsFlatResponse] {\n\tlistOptions := generated.ContainerClientListBlobFlatSegmentOptions{}\n\tif o != nil {\n\t\tlistOptions.Include = o.Include.format()\n\t\tlistOptions.Marker = o.Marker\n\t\tlistOptions.Maxresults = o.MaxResults\n\t\tlistOptions.Prefix = o.Prefix\n\t}\n\treturn runtime.NewPager(runtime.PagingHandler[ListBlobsFlatResponse]{\n\t\tMore: func(page ListBlobsFlatResponse) bool {\n\t\t\treturn page.NextMarker != nil && len(*page.NextMarker) > 0\n\t\t},\n\t\tFetcher: func(ctx context.Context, page *ListBlobsFlatResponse) (ListBlobsFlatResponse, error) {\n\t\t\tvar req *policy.Request\n\t\t\tvar err error\n\t\t\tif page == nil {\n\t\t\t\treq, err = c.generated().ListBlobFlatSegmentCreateRequest(ctx, &listOptions)\n\t\t\t} else {\n\t\t\t\tlistOptions.Marker = page.NextMarker\n\t\t\t\treq, err = c.generated().ListBlobFlatSegmentCreateRequest(ctx, &listOptions)\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\treturn ListBlobsFlatResponse{}, err\n\t\t\t}\n\t\t\tresp, err := c.generated().InternalClient().Pipeline().Do(req)\n\t\t\tif err != nil {\n\t\t\t\treturn ListBlobsFlatResponse{}, err\n\t\t\t}\n\t\t\tif !runtime.HasStatusCode(resp, http.StatusOK) {\n\t\t\t\t// TOOD: storage error?\n\t\t\t\treturn ListBlobsFlatResponse{}, runtime.NewResponseError(resp)\n\t\t\t}\n\t\t\treturn c.generated().ListBlobFlatSegmentHandleResponse(resp)\n\t\t},\n\t})\n}\n\n// NewListBlobsHierarchyPager returns a channel of blobs starting from the specified Marker. Use an empty\n// Marker to start enumeration from the beginning. Blob names are returned in lexicographic order.\n// After getting a segment, process it, and then call ListBlobsHierarchicalSegment again (passing the\n// previously-returned Marker) to get the next segment.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/list-blobs.\nfunc (c *Client) NewListBlobsHierarchyPager(delimiter string, o *ListBlobsHierarchyOptions) *runtime.Pager[ListBlobsHierarchyResponse] {\n\tlistOptions := o.format()\n\treturn runtime.NewPager(runtime.PagingHandler[ListBlobsHierarchyResponse]{\n\t\tMore: func(page ListBlobsHierarchyResponse) bool {\n\t\t\treturn page.NextMarker != nil && len(*page.NextMarker) > 0\n\t\t},\n\t\tFetcher: func(ctx context.Context, page *ListBlobsHierarchyResponse) (ListBlobsHierarchyResponse, error) {\n\t\t\tvar req *policy.Request\n\t\t\tvar err error\n\t\t\tif page == nil {\n\t\t\t\treq, err = c.generated().ListBlobHierarchySegmentCreateRequest(ctx, delimiter, &listOptions)\n\t\t\t} else {\n\t\t\t\tlistOptions.Marker = page.NextMarker\n\t\t\t\treq, err = c.generated().ListBlobHierarchySegmentCreateRequest(ctx, delimiter, &listOptions)\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\treturn ListBlobsHierarchyResponse{}, err\n\t\t\t}\n\t\t\tresp, err := c.generated().InternalClient().Pipeline().Do(req)\n\t\t\tif err != nil {\n\t\t\t\treturn ListBlobsHierarchyResponse{}, err\n\t\t\t}\n\t\t\tif !runtime.HasStatusCode(resp, http.StatusOK) {\n\t\t\t\treturn ListBlobsHierarchyResponse{}, runtime.NewResponseError(resp)\n\t\t\t}\n\t\t\treturn c.generated().ListBlobHierarchySegmentHandleResponse(resp)\n\t\t},\n\t})\n}\n\n// GetSASURL is a convenience method for generating a SAS token for the currently pointed at container.\n// It can only be used if the credential supplied during creation was a SharedKeyCredential.\nfunc (c *Client) GetSASURL(permissions sas.ContainerPermissions, expiry time.Time, o *GetSASURLOptions) (string, error) {\n\tif c.sharedKey() == nil {\n\t\treturn \"\", bloberror.MissingSharedKeyCredential\n\t}\n\tst := o.format()\n\turlParts, err := blob.ParseURL(c.URL())\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\t// Containers do not have snapshots, nor versions.\n\tqps, err := sas.BlobSignatureValues{\n\t\tVersion:       sas.Version,\n\t\tContainerName: urlParts.ContainerName,\n\t\tPermissions:   permissions.String(),\n\t\tStartTime:     st,\n\t\tExpiryTime:    expiry.UTC(),\n\t}.SignWithSharedKey(c.sharedKey())\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tendpoint := c.URL() + \"?\" + qps.Encode()\n\n\treturn endpoint, nil\n}\n\n// NewBatchBuilder creates an instance of BatchBuilder using the same auth policy as the client.\n// BatchBuilder is used to build the batch consisting of either delete or set tier sub-requests.\n// All sub-requests in the batch must be of the same type, either delete or set tier.\nfunc (c *Client) NewBatchBuilder() (*BatchBuilder, error) {\n\tvar authPolicy policy.Policy\n\n\tswitch cred := c.credential().(type) {\n\tcase *azcore.TokenCredential:\n\t\tconOptions := c.getClientOptions()\n\t\tauthPolicy = shared.NewStorageChallengePolicy(*cred, base.GetAudience(conOptions), conOptions.InsecureAllowCredentialWithHTTP)\n\tcase *SharedKeyCredential:\n\t\tauthPolicy = exported.NewSharedKeyCredPolicy(cred)\n\tcase nil:\n\t\t// for authentication using SAS\n\t\tauthPolicy = nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unrecognised authentication type %T\", cred)\n\t}\n\n\treturn &BatchBuilder{\n\t\tendpoint:   c.URL(),\n\t\tauthPolicy: authPolicy,\n\t}, nil\n}\n\n// SubmitBatch operation allows multiple API calls to be embedded into a single HTTP request.\n// It builds the request body using the BatchBuilder object passed.\n// BatchBuilder contains the list of operations to be submitted. It supports up to 256 sub-requests in a single batch.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/blob-batch.\nfunc (c *Client) SubmitBatch(ctx context.Context, bb *BatchBuilder, options *SubmitBatchOptions) (SubmitBatchResponse, error) {\n\tif bb == nil || len(bb.subRequests) == 0 {\n\t\treturn SubmitBatchResponse{}, errors.New(\"batch builder is empty\")\n\t}\n\n\t// create the request body\n\tbatchReq, batchID, err := exported.CreateBatchRequest(&exported.BlobBatchBuilder{\n\t\tAuthPolicy:  bb.authPolicy,\n\t\tSubRequests: bb.subRequests,\n\t})\n\tif err != nil {\n\t\treturn SubmitBatchResponse{}, err\n\t}\n\n\treader := bytes.NewReader(batchReq)\n\trsc := streaming.NopCloser(reader)\n\tmultipartContentType := \"multipart/mixed; boundary=\" + batchID\n\n\tresp, err := c.generated().SubmitBatch(ctx, int64(len(batchReq)), multipartContentType, rsc, options.format())\n\tif err != nil {\n\t\treturn SubmitBatchResponse{}, err\n\t}\n\n\tbatchResponses, err := exported.ParseBlobBatchResponse(resp.Body, resp.ContentType, bb.subRequests)\n\tif err != nil {\n\t\treturn SubmitBatchResponse{}, err\n\t}\n\n\treturn SubmitBatchResponse{\n\t\tResponses:   batchResponses,\n\t\tContentType: resp.ContentType,\n\t\tRequestID:   resp.RequestID,\n\t\tVersion:     resp.Version,\n\t}, nil\n}\n\n// FilterBlobs operation finds all blobs in the container whose tags match a given search expression.\n// https://docs.microsoft.com/en-us/rest/api/storageservices/find-blobs-by-tags-container\n// eg. \"dog='germanshepherd' and penguin='emperorpenguin'\"\nfunc (c *Client) FilterBlobs(ctx context.Context, where string, o *FilterBlobsOptions) (FilterBlobsResponse, error) {\n\tcontainerClientFilterBlobsOptions := o.format()\n\tresp, err := c.generated().FilterBlobs(ctx, where, containerClientFilterBlobsOptions)\n\treturn resp, err\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container/constants.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage container\n\nimport \"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\n// AccessTier defines values for blob access tiers.\ntype AccessTier = generated.AccessTier\n\nconst (\n\tAccessTierArchive AccessTier = generated.AccessTierArchive\n\tAccessTierCool    AccessTier = generated.AccessTierCool\n\tAccessTierHot     AccessTier = generated.AccessTierHot\n\tAccessTierP10     AccessTier = generated.AccessTierP10\n\tAccessTierP15     AccessTier = generated.AccessTierP15\n\tAccessTierP20     AccessTier = generated.AccessTierP20\n\tAccessTierP30     AccessTier = generated.AccessTierP30\n\tAccessTierP4      AccessTier = generated.AccessTierP4\n\tAccessTierP40     AccessTier = generated.AccessTierP40\n\tAccessTierP50     AccessTier = generated.AccessTierP50\n\tAccessTierP6      AccessTier = generated.AccessTierP6\n\tAccessTierP60     AccessTier = generated.AccessTierP60\n\tAccessTierP70     AccessTier = generated.AccessTierP70\n\tAccessTierP80     AccessTier = generated.AccessTierP80\n\tAccessTierPremium AccessTier = generated.AccessTierPremium\n)\n\n// PossibleAccessTierValues returns the possible values for the AccessTier const type.\nfunc PossibleAccessTierValues() []AccessTier {\n\treturn generated.PossibleAccessTierValues()\n}\n\n// PublicAccessType defines values for AccessType - private (default) or blob or container.\ntype PublicAccessType = generated.PublicAccessType\n\nconst (\n\tPublicAccessTypeBlob      PublicAccessType = generated.PublicAccessTypeBlob\n\tPublicAccessTypeContainer PublicAccessType = generated.PublicAccessTypeContainer\n)\n\n// PossiblePublicAccessTypeValues returns the possible values for the PublicAccessType const type.\nfunc PossiblePublicAccessTypeValues() []PublicAccessType {\n\treturn generated.PossiblePublicAccessTypeValues()\n}\n\n// SKUName defines values for SkuName - LRS, GRS, RAGRS, ZRS, Premium LRS.\ntype SKUName = generated.SKUName\n\nconst (\n\tSKUNameStandardLRS   SKUName = generated.SKUNameStandardLRS\n\tSKUNameStandardGRS   SKUName = generated.SKUNameStandardGRS\n\tSKUNameStandardRAGRS SKUName = generated.SKUNameStandardRAGRS\n\tSKUNameStandardZRS   SKUName = generated.SKUNameStandardZRS\n\tSKUNamePremiumLRS    SKUName = generated.SKUNamePremiumLRS\n)\n\n// PossibleSKUNameValues returns the possible values for the SKUName const type.\nfunc PossibleSKUNameValues() []SKUName {\n\treturn generated.PossibleSKUNameValues()\n}\n\n// AccountKind defines values for AccountKind\ntype AccountKind = generated.AccountKind\n\nconst (\n\tAccountKindStorage          AccountKind = generated.AccountKindStorage\n\tAccountKindBlobStorage      AccountKind = generated.AccountKindBlobStorage\n\tAccountKindStorageV2        AccountKind = generated.AccountKindStorageV2\n\tAccountKindFileStorage      AccountKind = generated.AccountKindFileStorage\n\tAccountKindBlockBlobStorage AccountKind = generated.AccountKindBlockBlobStorage\n)\n\n// PossibleAccountKindValues returns the possible values for the AccountKind const type.\nfunc PossibleAccountKindValues() []AccountKind {\n\treturn generated.PossibleAccountKindValues()\n}\n\n// BlobType defines values for BlobType\ntype BlobType = generated.BlobType\n\nconst (\n\tBlobTypeBlockBlob  BlobType = generated.BlobTypeBlockBlob\n\tBlobTypePageBlob   BlobType = generated.BlobTypePageBlob\n\tBlobTypeAppendBlob BlobType = generated.BlobTypeAppendBlob\n)\n\n// PossibleBlobTypeValues returns the possible values for the BlobType const type.\nfunc PossibleBlobTypeValues() []BlobType {\n\treturn generated.PossibleBlobTypeValues()\n}\n\n// ArchiveStatus defines values for ArchiveStatus\ntype ArchiveStatus = generated.ArchiveStatus\n\nconst (\n\tArchiveStatusRehydratePendingToCool ArchiveStatus = generated.ArchiveStatusRehydratePendingToCool\n\tArchiveStatusRehydratePendingToHot  ArchiveStatus = generated.ArchiveStatusRehydratePendingToHot\n)\n\n// PossibleArchiveStatusValues returns the possible values for the ArchiveStatus const type.\nfunc PossibleArchiveStatusValues() []ArchiveStatus {\n\treturn generated.PossibleArchiveStatusValues()\n}\n\n// CopyStatusType defines values for CopyStatusType\ntype CopyStatusType = generated.CopyStatusType\n\nconst (\n\tCopyStatusTypePending CopyStatusType = generated.CopyStatusTypePending\n\tCopyStatusTypeSuccess CopyStatusType = generated.CopyStatusTypeSuccess\n\tCopyStatusTypeAborted CopyStatusType = generated.CopyStatusTypeAborted\n\tCopyStatusTypeFailed  CopyStatusType = generated.CopyStatusTypeFailed\n)\n\n// PossibleCopyStatusTypeValues returns the possible values for the CopyStatusType const type.\nfunc PossibleCopyStatusTypeValues() []CopyStatusType {\n\treturn generated.PossibleCopyStatusTypeValues()\n}\n\n// ImmutabilityPolicyMode defines values for ImmutabilityPolicyMode\ntype ImmutabilityPolicyMode = generated.ImmutabilityPolicyMode\n\nconst (\n\tImmutabilityPolicyModeMutable  ImmutabilityPolicyMode = generated.ImmutabilityPolicyModeMutable\n\tImmutabilityPolicyModeUnlocked ImmutabilityPolicyMode = generated.ImmutabilityPolicyModeUnlocked\n\tImmutabilityPolicyModeLocked   ImmutabilityPolicyMode = generated.ImmutabilityPolicyModeLocked\n)\n\n// PossibleImmutabilityPolicyModeValues returns the possible values for the ImmutabilityPolicyMode const type.\nfunc PossibleImmutabilityPolicyModeValues() []ImmutabilityPolicyMode {\n\treturn generated.PossibleImmutabilityPolicyModeValues()\n}\n\n// RehydratePriority - If an object is in rehydrate pending state then this header is returned with priority of rehydrate.\n// Valid values are High and Standard.\ntype RehydratePriority = generated.RehydratePriority\n\nconst (\n\tRehydratePriorityHigh     RehydratePriority = generated.RehydratePriorityHigh\n\tRehydratePriorityStandard RehydratePriority = generated.RehydratePriorityStandard\n)\n\n// PossibleRehydratePriorityValues returns the possible values for the RehydratePriority const type.\nfunc PossibleRehydratePriorityValues() []RehydratePriority {\n\treturn generated.PossibleRehydratePriorityValues()\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container/models.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage container\n\nimport (\n\t\"reflect\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n)\n\n// SharedKeyCredential contains an account's name and its primary or secondary key.\ntype SharedKeyCredential = exported.SharedKeyCredential\n\n// NewSharedKeyCredential creates an immutable SharedKeyCredential containing the\n// storage account's name and either its primary or secondary key.\nfunc NewSharedKeyCredential(accountName, accountKey string) (*SharedKeyCredential, error) {\n\treturn exported.NewSharedKeyCredential(accountName, accountKey)\n}\n\n// Request Model Declaration -------------------------------------------------------------------------------------------\n\n// CPKScopeInfo contains a group of parameters for the ContainerClient.Create method.\ntype CPKScopeInfo = generated.ContainerCPKScopeInfo\n\n// BlobFlatListSegment - List of BlobItem.\ntype BlobFlatListSegment = generated.BlobFlatListSegment\n\n// BlobHierarchyListSegment - List of BlobItem and BlobPrefix.\ntype BlobHierarchyListSegment = generated.BlobHierarchyListSegment\n\n// BlobProperties - Properties of a blob.\ntype BlobProperties = generated.BlobProperties\n\n// BlobItem - An Azure Storage blob.\ntype BlobItem = generated.BlobItem\n\n// BlobTags - Blob tags.\ntype BlobTags = generated.BlobTags\n\n// BlobPrefix is a blob's prefix when hierarchically listing blobs.\ntype BlobPrefix = generated.BlobPrefix\n\n// BlobTag - a key/value pair on a blob.\ntype BlobTag = generated.BlobTag\n\n// AccessConditions identifies container-specific access conditions which you optionally set.\ntype AccessConditions = exported.ContainerAccessConditions\n\n// LeaseAccessConditions contains optional parameters to access leased entity.\ntype LeaseAccessConditions = exported.LeaseAccessConditions\n\n// ModifiedAccessConditions contains a group of parameters for specifying access conditions.\ntype ModifiedAccessConditions = exported.ModifiedAccessConditions\n\n// AccessPolicy - An Access policy.\ntype AccessPolicy = generated.AccessPolicy\n\n// AccessPolicyPermission type simplifies creating the permissions string for a container's access policy.\n// Initialize an instance of this type and then call its String method to set AccessPolicy's Permission field.\ntype AccessPolicyPermission = exported.AccessPolicyPermission\n\n// SignedIdentifier - signed identifier.\ntype SignedIdentifier = generated.SignedIdentifier\n\n// Request Model Declaration -------------------------------------------------------------------------------------------\n\n// CreateOptions contains the optional parameters for the Client.Create method.\ntype CreateOptions struct {\n\t// Specifies whether data in the container may be accessed publicly and the level of access.\n\tAccess *PublicAccessType\n\n\t// Optional. Specifies a user-defined name-value pair associated with the blob.\n\tMetadata map[string]*string\n\n\t// Optional. Specifies the encryption scope settings to set on the container.\n\tCPKScopeInfo *CPKScopeInfo\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// DeleteOptions contains the optional parameters for the Client.Delete method.\ntype DeleteOptions struct {\n\tAccessConditions *AccessConditions\n}\n\nfunc (o *DeleteOptions) format() (*generated.ContainerClientDeleteOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatContainerAccessConditions(o.AccessConditions)\n\treturn nil, leaseAccessConditions, modifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// RestoreOptions contains the optional parameters for the Client.Restore method.\ntype RestoreOptions struct {\n\t// placeholder for future options\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// GetPropertiesOptions contains the optional parameters for the ContainerClient.GetProperties method.\ntype GetPropertiesOptions struct {\n\tLeaseAccessConditions *LeaseAccessConditions\n}\n\n// ContainerClientGetPropertiesOptions contains the optional parameters for the ContainerClient.GetProperties method.\nfunc (o *GetPropertiesOptions) format() (*generated.ContainerClientGetPropertiesOptions, *generated.LeaseAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil\n\t}\n\n\treturn nil, o.LeaseAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// ListBlobsInclude indicates what additional information the service should return with each blob.\ntype ListBlobsInclude struct {\n\tCopy, Metadata, Snapshots, UncommittedBlobs, Deleted, Tags, Versions, LegalHold, ImmutabilityPolicy, DeletedWithVersions, Permissions bool\n}\n\nfunc (l ListBlobsInclude) format() []generated.ListBlobsIncludeItem {\n\tif reflect.ValueOf(l).IsZero() {\n\t\treturn nil\n\t}\n\n\tinclude := []generated.ListBlobsIncludeItem{}\n\n\tif l.Copy {\n\t\tinclude = append(include, generated.ListBlobsIncludeItemCopy)\n\t}\n\tif l.Deleted {\n\t\tinclude = append(include, generated.ListBlobsIncludeItemDeleted)\n\t}\n\tif l.DeletedWithVersions {\n\t\tinclude = append(include, generated.ListBlobsIncludeItemDeletedwithversions)\n\t}\n\tif l.ImmutabilityPolicy {\n\t\tinclude = append(include, generated.ListBlobsIncludeItemImmutabilitypolicy)\n\t}\n\tif l.LegalHold {\n\t\tinclude = append(include, generated.ListBlobsIncludeItemLegalhold)\n\t}\n\tif l.Metadata {\n\t\tinclude = append(include, generated.ListBlobsIncludeItemMetadata)\n\t}\n\tif l.Snapshots {\n\t\tinclude = append(include, generated.ListBlobsIncludeItemSnapshots)\n\t}\n\tif l.Tags {\n\t\tinclude = append(include, generated.ListBlobsIncludeItemTags)\n\t}\n\tif l.UncommittedBlobs {\n\t\tinclude = append(include, generated.ListBlobsIncludeItemUncommittedblobs)\n\t}\n\tif l.Versions {\n\t\tinclude = append(include, generated.ListBlobsIncludeItemVersions)\n\t}\n\tif l.Permissions {\n\t\tinclude = append(include, generated.ListBlobsIncludeItemPermissions)\n\t}\n\treturn include\n}\n\n// ListBlobsFlatOptions contains the optional parameters for the ContainerClient.ListBlobFlatSegment method.\ntype ListBlobsFlatOptions struct {\n\t// Include this parameter to specify one or more datasets to include in the response.\n\tInclude ListBlobsInclude\n\t// A string value that identifies the portion of the list of containers to be returned with the next listing operation. The\n\t// operation returns the NextMarker value within the response body if the listing\n\t// operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used\n\t// as the value for the marker parameter in a subsequent call to request the next\n\t// page of list items. The marker value is opaque to the client.\n\tMarker *string\n\t// Specifies the maximum number of containers to return. If the request does not specify MaxResults, or specifies a value\n\t// greater than 5000, the server will return up to 5000 items. Note that if the\n\t// listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder\n\t// of the results. For this reason, it is possible that the service will\n\t// return fewer results than specified by MaxResults, or than the default of 5000.\n\tMaxResults *int32\n\t// Filters the results to return only containers whose name begins with the specified prefix.\n\tPrefix *string\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// ListBlobsHierarchyOptions provides set of configurations for Client.NewListBlobsHierarchyPager\ntype ListBlobsHierarchyOptions struct {\n\t// Include this parameter to specify one or more datasets to include in the response.\n\tInclude ListBlobsInclude\n\t// A string value that identifies the portion of the list of containers to be returned with the next listing operation. The\n\t// operation returns the NextMarker value within the response body if the listing\n\t// operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used\n\t// as the value for the marker parameter in a subsequent call to request the next\n\t// page of list items. The marker value is opaque to the client.\n\tMarker *string\n\t// Specifies the maximum number of containers to return. If the request does not specify MaxResults, or specifies a value\n\t// greater than 5000, the server will return up to 5000 items. Note that if the\n\t// listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder\n\t// of the results. For this reason, it is possible that the service will\n\t// return fewer results than specified by MaxResults, or than the default of 5000.\n\tMaxResults *int32\n\t// Filters the results to return only containers whose name begins with the specified prefix.\n\tPrefix *string\n}\n\n// ContainerClientListBlobHierarchySegmentOptions contains the optional parameters for the ContainerClient.ListBlobHierarchySegment method.\nfunc (o *ListBlobsHierarchyOptions) format() generated.ContainerClientListBlobHierarchySegmentOptions {\n\tif o == nil {\n\t\treturn generated.ContainerClientListBlobHierarchySegmentOptions{}\n\t}\n\n\treturn generated.ContainerClientListBlobHierarchySegmentOptions{\n\t\tInclude:    o.Include.format(),\n\t\tMarker:     o.Marker,\n\t\tMaxresults: o.MaxResults,\n\t\tPrefix:     o.Prefix,\n\t}\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// GetSASURLOptions contains the optional parameters for the Client.GetSASURL method.\ntype GetSASURLOptions struct {\n\tStartTime *time.Time\n}\n\nfunc (o *GetSASURLOptions) format() time.Time {\n\tif o == nil {\n\t\treturn time.Time{}\n\t}\n\n\tvar st time.Time\n\tif o.StartTime != nil {\n\t\tst = o.StartTime.UTC()\n\t} else {\n\t\tst = time.Time{}\n\t}\n\treturn st\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// SetMetadataOptions contains the optional parameters for the Client.SetMetadata method.\ntype SetMetadataOptions struct {\n\tMetadata                 map[string]*string\n\tLeaseAccessConditions    *LeaseAccessConditions\n\tModifiedAccessConditions *ModifiedAccessConditions\n}\n\nfunc (o *SetMetadataOptions) format() (*generated.ContainerClientSetMetadataOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil\n\t}\n\n\treturn &generated.ContainerClientSetMetadataOptions{Metadata: o.Metadata}, o.LeaseAccessConditions, o.ModifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// GetAccessPolicyOptions contains the optional parameters for the Client.GetAccessPolicy method.\ntype GetAccessPolicyOptions struct {\n\tLeaseAccessConditions *LeaseAccessConditions\n}\n\nfunc (o *GetAccessPolicyOptions) format() (*generated.ContainerClientGetAccessPolicyOptions, *LeaseAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil\n\t}\n\n\treturn nil, o.LeaseAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// SetAccessPolicyOptions provides set of configurations for ContainerClient.SetAccessPolicy operation.\ntype SetAccessPolicyOptions struct {\n\t// Specifies whether data in the container may be accessed publicly and the level of access.\n\t// If this header is not included in the request, container data is private to the account owner.\n\tAccess           *PublicAccessType\n\tAccessConditions *AccessConditions\n\tContainerACL     []*SignedIdentifier\n}\n\nfunc (o *SetAccessPolicyOptions) format() (*generated.ContainerClientSetAccessPolicyOptions, *LeaseAccessConditions, *ModifiedAccessConditions, []*SignedIdentifier, error) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil, nil\n\t}\n\tif o.ContainerACL != nil {\n\t\tfor _, c := range o.ContainerACL {\n\t\t\terr := formatTime(c)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, nil, nil, nil, err\n\t\t\t}\n\t\t}\n\t}\n\tlac, mac := exported.FormatContainerAccessConditions(o.AccessConditions)\n\treturn &generated.ContainerClientSetAccessPolicyOptions{\n\t\tAccess: o.Access,\n\t}, lac, mac, o.ContainerACL, nil\n}\n\nfunc formatTime(c *SignedIdentifier) error {\n\tif c.AccessPolicy == nil {\n\t\treturn nil\n\t}\n\n\tif c.AccessPolicy.Start != nil {\n\t\tst, err := time.Parse(time.RFC3339, c.AccessPolicy.Start.UTC().Format(time.RFC3339))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tc.AccessPolicy.Start = &st\n\t}\n\tif c.AccessPolicy.Expiry != nil {\n\t\tet, err := time.Parse(time.RFC3339, c.AccessPolicy.Expiry.UTC().Format(time.RFC3339))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tc.AccessPolicy.Expiry = &et\n\t}\n\n\treturn nil\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// GetAccountInfoOptions provides set of options for Client.GetAccountInfo\ntype GetAccountInfoOptions struct {\n\t// placeholder for future options\n}\n\nfunc (o *GetAccountInfoOptions) format() *generated.ContainerClientGetAccountInfoOptions {\n\treturn nil\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// BatchDeleteOptions contains the optional parameters for the BatchBuilder.Delete method.\ntype BatchDeleteOptions struct {\n\tblob.DeleteOptions\n\tVersionID *string\n\tSnapshot  *string\n}\n\nfunc (o *BatchDeleteOptions) format() (*generated.BlobClientDeleteOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil\n\t}\n\n\tbasics := generated.BlobClientDeleteOptions{\n\t\tDeleteSnapshots: o.DeleteSnapshots,\n\t\tDeleteType:      o.BlobDeleteType, // None by default\n\t\tSnapshot:        o.Snapshot,\n\t\tVersionID:       o.VersionID,\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn &basics, leaseAccessConditions, modifiedAccessConditions\n}\n\n// BatchSetTierOptions contains the optional parameters for the BatchBuilder.SetTier method.\ntype BatchSetTierOptions struct {\n\tblob.SetTierOptions\n\tVersionID *string\n\tSnapshot  *string\n}\n\nfunc (o *BatchSetTierOptions) format() (*generated.BlobClientSetTierOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil\n\t}\n\n\tbasics := generated.BlobClientSetTierOptions{\n\t\tRehydratePriority: o.RehydratePriority,\n\t\tSnapshot:          o.Snapshot,\n\t\tVersionID:         o.VersionID,\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn &basics, leaseAccessConditions, modifiedAccessConditions\n}\n\n// SubmitBatchOptions contains the optional parameters for the Client.SubmitBatch method.\ntype SubmitBatchOptions struct {\n\t// placeholder for future options\n}\n\nfunc (o *SubmitBatchOptions) format() *generated.ContainerClientSubmitBatchOptions {\n\treturn nil\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// FilterBlobsOptions provides set of options for Client.FilterBlobs.\ntype FilterBlobsOptions struct {\n\t// A string value that identifies the portion of the list of containers to be returned with the next listing operation. The\n\t// operation returns the NextMarker value within the response body if the listing\n\t// operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used\n\t// as the value for the marker parameter in a subsequent call to request the next\n\t// page of list items. The marker value is opaque to the client.\n\tMarker *string\n\t// Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value\n\t// greater than 5000, the server will return up to 5000 items. Note that if the\n\t// listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder\n\t// of the results. For this reason, it is possible that the service will\n\t// return fewer results than specified by maxresults, or than the default of 5000.\n\tMaxResults *int32\n}\n\nfunc (o *FilterBlobsOptions) format() *generated.ContainerClientFilterBlobsOptions {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &generated.ContainerClientFilterBlobsOptions{\n\t\tMarker:     o.Marker,\n\t\tMaxresults: o.MaxResults,\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container/responses.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage container\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n)\n\n// CreateResponse contains the response from method Client.Create.\ntype CreateResponse = generated.ContainerClientCreateResponse\n\n// DeleteResponse contains the response from method Client.Delete.\ntype DeleteResponse = generated.ContainerClientDeleteResponse\n\n// RestoreResponse contains the response from method Client.Restore.\ntype RestoreResponse = generated.ContainerClientRestoreResponse\n\n// GetPropertiesResponse contains the response from method Client.GetProperties.\ntype GetPropertiesResponse = generated.ContainerClientGetPropertiesResponse\n\n// ListBlobsFlatResponse contains the response from method Client.ListBlobFlatSegment.\ntype ListBlobsFlatResponse = generated.ContainerClientListBlobFlatSegmentResponse\n\n// ListBlobsFlatSegmentResponse - An enumeration of blobs\ntype ListBlobsFlatSegmentResponse = generated.ListBlobsFlatSegmentResponse\n\n// ListBlobsHierarchyResponse contains the response from method Client.ListBlobHierarchySegment.\ntype ListBlobsHierarchyResponse = generated.ContainerClientListBlobHierarchySegmentResponse\n\n// ListBlobsHierarchySegmentResponse - An enumeration of blobs\ntype ListBlobsHierarchySegmentResponse = generated.ListBlobsHierarchySegmentResponse\n\n// SetMetadataResponse contains the response from method Client.SetMetadata.\ntype SetMetadataResponse = generated.ContainerClientSetMetadataResponse\n\n// GetAccessPolicyResponse contains the response from method Client.GetAccessPolicy.\ntype GetAccessPolicyResponse = generated.ContainerClientGetAccessPolicyResponse\n\n// SetAccessPolicyResponse contains the response from method Client.SetAccessPolicy.\ntype SetAccessPolicyResponse = generated.ContainerClientSetAccessPolicyResponse\n\n// GetAccountInfoResponse contains the response from method Client.GetAccountInfo.\ntype GetAccountInfoResponse = generated.ContainerClientGetAccountInfoResponse\n\n// SubmitBatchResponse contains the response from method Client.SubmitBatch.\ntype SubmitBatchResponse struct {\n\t// Responses contains the responses of the sub-requests in the batch\n\tResponses []*BatchResponseItem\n\n\t// ContentType contains the information returned from the Content-Type header response.\n\tContentType *string\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BatchResponseItem contains the response for the individual sub-requests.\ntype BatchResponseItem = exported.BatchResponseItem\n\n// FilterBlobsResponse contains the response from method Client.FilterBlobs.\ntype FilterBlobsResponse = generated.ContainerClientFilterBlobsResponse\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/doc.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\n/*\n\nPackage azblob can access an Azure Blob Storage.\n\nThe azblob package is capable of :-\n    - Creating, deleting, and querying containers in an account\n    - Creating, deleting, and querying blobs in a container\n    - Creating Shared Access Signature for authentication\n\nTypes of Resources\n\nThe azblob package allows you to interact with three types of resources :-\n\n* Azure storage accounts.\n* Containers within those storage accounts.\n* Blobs (block blobs/ page blobs/ append blobs) within those containers.\n\nThe Azure Blob Storage (azblob) client library for Go allows you to interact with each of these components through the use of a dedicated client object.\nTo create a client object, you will need the account's blob service endpoint URL and a credential that allows you to access the account.\n\nTypes of Credentials\n\nThe clients support different forms of authentication.\nThe azblob library supports any of the `azcore.TokenCredential` interfaces, authorization via a Connection String,\nor authorization with a Shared Access Signature token.\n\nUsing a Shared Key\n\nTo use an account shared key (aka account key or access key), provide the key as a string.\nThis can be found in your storage account in the Azure Portal under the \"Access Keys\" section.\n\nUse the key as the credential parameter to authenticate the client:\n\n\taccountName, ok := os.LookupEnv(\"AZURE_STORAGE_ACCOUNT_NAME\")\n\tif !ok {\n\t\tpanic(\"AZURE_STORAGE_ACCOUNT_NAME could not be found\")\n\t}\n\taccountKey, ok := os.LookupEnv(\"AZURE_STORAGE_ACCOUNT_KEY\")\n\tif !ok {\n\t\tpanic(\"AZURE_STORAGE_ACCOUNT_KEY could not be found\")\n\t}\n\n\tserviceURL := fmt.Sprintf(\"https://%s.blob.core.windows.net/\", accountName)\n\n\tcred, err := azblob.NewSharedKeyCredential(accountName, accountKey)\n\thandle(err)\n\n\tserviceClient, err := azblob.NewClientWithSharedKeyCredential(serviceURL, cred, nil)\n\thandle(err)\n\n\tfmt.Println(serviceClient.URL())\n\nUsing a Connection String\n\nDepending on your use case and authorization method, you may prefer to initialize a client instance with a connection string instead of providing the account URL and credential separately.\nTo do this, pass the connection string to the service client's `NewClientFromConnectionString` method.\nThe connection string can be found in your storage account in the Azure Portal under the \"Access Keys\" section.\n\n\tconnStr := \"DefaultEndpointsProtocol=https;AccountName=<my_account_name>;AccountKey=<my_account_key>;EndpointSuffix=core.windows.net\"\n\tserviceClient, err := azblob.NewClientFromConnectionString(connStr, nil)\n\thandle(err)\n\nUsing a Shared Access Signature (SAS) Token\n\nTo use a shared access signature (SAS) token, provide the token at the end of your service URL.\nYou can generate a SAS token from the Azure Portal under Shared Access Signature or use the ServiceClient.GetSASToken() functions.\n\n\taccountName, ok := os.LookupEnv(\"AZURE_STORAGE_ACCOUNT_NAME\")\n\tif !ok {\n\t\tpanic(\"AZURE_STORAGE_ACCOUNT_NAME could not be found\")\n\t}\n\taccountKey, ok := os.LookupEnv(\"AZURE_STORAGE_ACCOUNT_KEY\")\n\tif !ok {\n\t\tpanic(\"AZURE_STORAGE_ACCOUNT_KEY could not be found\")\n\t}\n\tserviceURL := fmt.Sprintf(\"https://%s.blob.core.windows.net/\", accountName)\n\n\tcred, err := azblob.NewSharedKeyCredential(accountName, accountKey)\n\thandle(err)\n\tserviceClient, err := azblob.NewClientWithSharedKeyCredential(serviceURL, cred, nil)\n\thandle(err)\n\tfmt.Println(serviceClient.URL())\n\n\t// Alternatively, you can create SAS on the fly\n\n\tresources := sas.AccountResourceTypes{Service: true}\n\tpermission := sas.AccountPermissions{Read: true}\n\tstart := time.Now()\n\texpiry := start.AddDate(0, 0, 1)\n\tserviceURLWithSAS, err := serviceClient.ServiceClient().GetSASURL(resources, permission, expiry, &service.GetSASURLOptions{StartTime: &start})\n\thandle(err)\n\n\tserviceClientWithSAS, err := azblob.NewClientWithNoCredential(serviceURLWithSAS, nil)\n\thandle(err)\n\n\tfmt.Println(serviceClientWithSAS.URL())\n\nTypes of Clients\n\nThere are three different clients provided to interact with the various components of the Blob Service:\n\n1. **`ServiceClient`**\n    * Get and set account settings.\n    * Query, create, and delete containers within the account.\n\n2. **`ContainerClient`**\n    * Get and set container access settings, properties, and metadata.\n    * Create, delete, and query blobs within the container.\n    * `ContainerLeaseClient` to support container lease management.\n\n3. **`BlobClient`**\n    * `AppendBlobClient`, `BlockBlobClient`, and `PageBlobClient`\n    * Get and set blob properties.\n    * Perform CRUD operations on a given blob.\n    * `BlobLeaseClient` to support blob lease management.\n\nExamples\n\n\t// Your account name and key can be obtained from the Azure Portal.\n\taccountName, ok := os.LookupEnv(\"AZURE_STORAGE_ACCOUNT_NAME\")\n\tif !ok {\n\t\tpanic(\"AZURE_STORAGE_ACCOUNT_NAME could not be found\")\n\t}\n\n\taccountKey, ok := os.LookupEnv(\"AZURE_STORAGE_ACCOUNT_KEY\")\n\tif !ok {\n\t\tpanic(\"AZURE_STORAGE_ACCOUNT_KEY could not be found\")\n\t}\n\tcred, err := azblob.NewSharedKeyCredential(accountName, accountKey)\n\thandle(err)\n\n\t// The service URL for blob endpoints is usually in the form: http(s)://<account>.blob.core.windows.net/\n\tserviceClient, err := azblob.NewClientWithSharedKeyCredential(fmt.Sprintf(\"https://%s.blob.core.windows.net/\", accountName), cred, nil)\n\thandle(err)\n\n\t// ===== 1. Create a container =====\n\n\t// First, create a container client, and use the Create method to create a new container in your account\n\tcontainerClient := serviceClient.ServiceClient().NewContainerClient(\"testcontainer\")\n\thandle(err)\n\n\t// All APIs have an options' bag struct as a parameter.\n\t// The options' bag struct allows you to specify optional parameters such as metadata, public access types, etc.\n\t// If you want to use the default options, pass in nil.\n\t_, err = containerClient.Create(context.TODO(), nil)\n\thandle(err)\n\n\t// ===== 2. Upload and Download a block blob =====\n\tuploadData := \"Hello world!\"\n\n\t// Create a new blockBlobClient from the containerClient\n\tblockBlobClient := containerClient.NewBlockBlobClient(\"HelloWorld.txt\")\n\thandle(err)\n\n\t// Upload data to the block blob\n\tblockBlobUploadOptions := blockblob.UploadOptions{\n\t\tMetadata: map[string]*string{\"Foo\": to.Ptr(\"Bar\")},\n\t\tTags:     map[string]string{\"Year\": \"2022\"},\n\t}\n\t_, err = blockBlobClient.Upload(context.TODO(), streaming.NopCloser(strings.NewReader(uploadData)), &blockBlobUploadOptions)\n\thandle(err)\n\n\t// Download the blob's contents and ensure that the download worked properly\n\tblobDownloadResponse, err := blockBlobClient.DownloadStream(context.TODO(), nil)\n\thandle(err)\n\n\t// Use the bytes.Buffer object to read the downloaded data.\n\t// RetryReaderOptions has a lot of in-depth tuning abilities, but for the sake of simplicity, we'll omit those here.\n\treader := blobDownloadResponse.Body(nil)\n\tdownloadData, err := io.ReadAll(reader)\n\thandle(err)\n\tif string(downloadData) != uploadData {\n\t\thandle(errors.New(\"uploaded data should be same as downloaded data\"))\n\t}\n\n\tif err = reader.Close(); err != nil {\n\t\thandle(err)\n\t\treturn\n\t}\n\n\t// ===== 3. List blobs =====\n\t// List methods returns a pager object which can be used to iterate over the results of a paging operation.\n\t// To iterate over a page use the NextPage(context.Context) to fetch the next page of results.\n\t// PageResponse() can be used to iterate over the results of the specific page.\n\t// Always check the Err() method after paging to see if an error was returned by the pager. A pager will return either an error or the page of results.\n\tpager := containerClient.NewListBlobsFlatPager(nil)\n\tfor pager.More() {\n\t\tresp, err := pager.NextPage(context.TODO())\n\t\thandle(err)\n\t\tfor _, v := range resp.Segment.BlobItems {\n\t\t\tfmt.Println(*v.Name)\n\t\t}\n\t}\n\n\t// Delete the blob.\n\t_, err = blockBlobClient.Delete(context.TODO(), nil)\n\thandle(err)\n\n\t// Delete the container.\n\t_, err = containerClient.Delete(context.TODO(), nil)\n\thandle(err)\n*/\n\npackage azblob\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/base/clients.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage base\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared\"\n\t\"strings\"\n)\n\n// ClientOptions contains the optional parameters when creating a Client.\ntype ClientOptions struct {\n\tazcore.ClientOptions\n\n\t// Audience to use when requesting tokens for Azure Active Directory authentication.\n\t// Only has an effect when credential is of type TokenCredential. The value could be\n\t// https://storage.azure.com/ (default) or https://<account>.blob.core.windows.net.\n\tAudience string\n}\n\ntype Client[T any] struct {\n\tinner      *T\n\tcredential any\n\toptions    *ClientOptions\n}\n\nfunc InnerClient[T any](client *Client[T]) *T {\n\treturn client.inner\n}\n\nfunc SharedKey[T any](client *Client[T]) *exported.SharedKeyCredential {\n\tswitch cred := client.credential.(type) {\n\tcase *exported.SharedKeyCredential:\n\t\treturn cred\n\tdefault:\n\t\treturn nil\n\t}\n}\n\nfunc Credential[T any](client *Client[T]) any {\n\treturn client.credential\n}\n\nfunc GetClientOptions[T any](client *Client[T]) *ClientOptions {\n\treturn client.options\n}\n\nfunc GetAudience(clOpts *ClientOptions) string {\n\tif clOpts == nil || len(strings.TrimSpace(clOpts.Audience)) == 0 {\n\t\treturn shared.TokenScope\n\t} else {\n\t\treturn strings.TrimRight(clOpts.Audience, \"/\") + \"/.default\"\n\t}\n}\n\nfunc NewClient[T any](inner *T) *Client[T] {\n\treturn &Client[T]{inner: inner}\n}\n\nfunc NewServiceClient(containerURL string, azClient *azcore.Client, credential any, options *ClientOptions) *Client[generated.ServiceClient] {\n\treturn &Client[generated.ServiceClient]{\n\t\tinner:      generated.NewServiceClient(containerURL, azClient),\n\t\tcredential: credential,\n\t\toptions:    options,\n\t}\n}\n\nfunc NewContainerClient(containerURL string, azClient *azcore.Client, credential any, options *ClientOptions) *Client[generated.ContainerClient] {\n\treturn &Client[generated.ContainerClient]{\n\t\tinner:      generated.NewContainerClient(containerURL, azClient),\n\t\tcredential: credential,\n\t\toptions:    options,\n\t}\n}\n\nfunc NewBlobClient(blobURL string, azClient *azcore.Client, credential any, options *ClientOptions) *Client[generated.BlobClient] {\n\treturn &Client[generated.BlobClient]{\n\t\tinner:      generated.NewBlobClient(blobURL, azClient),\n\t\tcredential: credential,\n\t\toptions:    options,\n\t}\n}\n\ntype CompositeClient[T, U any] struct {\n\tinnerT    *T\n\tinnerU    *U\n\tsharedKey *exported.SharedKeyCredential\n}\n\nfunc InnerClients[T, U any](client *CompositeClient[T, U]) (*Client[T], *U) {\n\treturn &Client[T]{\n\t\tinner:      client.innerT,\n\t\tcredential: client.sharedKey,\n\t}, client.innerU\n}\n\nfunc NewAppendBlobClient(blobURL string, azClient *azcore.Client, sharedKey *exported.SharedKeyCredential) *CompositeClient[generated.BlobClient, generated.AppendBlobClient] {\n\treturn &CompositeClient[generated.BlobClient, generated.AppendBlobClient]{\n\t\tinnerT:    generated.NewBlobClient(blobURL, azClient),\n\t\tinnerU:    generated.NewAppendBlobClient(blobURL, azClient),\n\t\tsharedKey: sharedKey,\n\t}\n}\n\nfunc NewBlockBlobClient(blobURL string, azClient *azcore.Client, sharedKey *exported.SharedKeyCredential) *CompositeClient[generated.BlobClient, generated.BlockBlobClient] {\n\treturn &CompositeClient[generated.BlobClient, generated.BlockBlobClient]{\n\t\tinnerT:    generated.NewBlobClient(blobURL, azClient),\n\t\tinnerU:    generated.NewBlockBlobClient(blobURL, azClient),\n\t\tsharedKey: sharedKey,\n\t}\n}\n\nfunc NewPageBlobClient(blobURL string, azClient *azcore.Client, sharedKey *exported.SharedKeyCredential) *CompositeClient[generated.BlobClient, generated.PageBlobClient] {\n\treturn &CompositeClient[generated.BlobClient, generated.PageBlobClient]{\n\t\tinnerT:    generated.NewBlobClient(blobURL, azClient),\n\t\tinnerU:    generated.NewPageBlobClient(blobURL, azClient),\n\t\tsharedKey: sharedKey,\n\t}\n}\n\nfunc SharedKeyComposite[T, U any](client *CompositeClient[T, U]) *exported.SharedKeyCredential {\n\treturn client.sharedKey\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/access_conditions.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage exported\n\nimport \"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\nconst SnapshotTimeFormat = \"2006-01-02T15:04:05.0000000Z07:00\"\n\n// ContainerAccessConditions identifies container-specific access conditions which you optionally set.\ntype ContainerAccessConditions struct {\n\tModifiedAccessConditions *ModifiedAccessConditions\n\tLeaseAccessConditions    *LeaseAccessConditions\n}\n\nfunc FormatContainerAccessConditions(b *ContainerAccessConditions) (*LeaseAccessConditions, *ModifiedAccessConditions) {\n\tif b == nil {\n\t\treturn nil, nil\n\t}\n\treturn b.LeaseAccessConditions, b.ModifiedAccessConditions\n}\n\n// BlobAccessConditions identifies blob-specific access conditions which you optionally set.\ntype BlobAccessConditions struct {\n\tLeaseAccessConditions    *LeaseAccessConditions\n\tModifiedAccessConditions *ModifiedAccessConditions\n}\n\nfunc FormatBlobAccessConditions(b *BlobAccessConditions) (*LeaseAccessConditions, *ModifiedAccessConditions) {\n\tif b == nil {\n\t\treturn nil, nil\n\t}\n\treturn b.LeaseAccessConditions, b.ModifiedAccessConditions\n}\n\n// LeaseAccessConditions contains optional parameters to access leased entity.\ntype LeaseAccessConditions = generated.LeaseAccessConditions\n\n// ModifiedAccessConditions contains a group of parameters for specifying access conditions.\ntype ModifiedAccessConditions = generated.ModifiedAccessConditions\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/access_policy.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage exported\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n)\n\n// AccessPolicyPermission type simplifies creating the permissions string for a container's access policy.\n// Initialize an instance of this type and then call its String method to set AccessPolicy's Permission field.\ntype AccessPolicyPermission struct {\n\tRead, Add, Create, Write, Delete, List bool\n}\n\n// String produces the access policy permission string for an Azure Storage container.\n// Call this method to set AccessPolicy's Permission field.\nfunc (p *AccessPolicyPermission) String() string {\n\tvar b bytes.Buffer\n\tif p.Read {\n\t\tb.WriteRune('r')\n\t}\n\tif p.Add {\n\t\tb.WriteRune('a')\n\t}\n\tif p.Create {\n\t\tb.WriteRune('c')\n\t}\n\tif p.Write {\n\t\tb.WriteRune('w')\n\t}\n\tif p.Delete {\n\t\tb.WriteRune('d')\n\t}\n\tif p.List {\n\t\tb.WriteRune('l')\n\t}\n\treturn b.String()\n}\n\n// Parse initializes the AccessPolicyPermission's fields from a string.\nfunc (p *AccessPolicyPermission) Parse(s string) error {\n\t*p = AccessPolicyPermission{} // Clear the flags\n\tfor _, r := range s {\n\t\tswitch r {\n\t\tcase 'r':\n\t\t\tp.Read = true\n\t\tcase 'a':\n\t\t\tp.Add = true\n\t\tcase 'c':\n\t\t\tp.Create = true\n\t\tcase 'w':\n\t\t\tp.Write = true\n\t\tcase 'd':\n\t\t\tp.Delete = true\n\t\tcase 'l':\n\t\t\tp.List = true\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"invalid permission: '%v'\", r)\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/blob_batch.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage exported\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"mime\"\n\t\"mime/multipart\"\n\t\"net/http\"\n\t\"net/textproto\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/to\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/log\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/uuid\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared\"\n)\n\nconst (\n\tbatchIdPrefix = \"batch_\"\n\thttpVersion   = \"HTTP/1.1\"\n\thttpNewline   = \"\\r\\n\"\n)\n\n// createBatchID is used for creating a new batch id which is used as batch boundary in the request body\nfunc createBatchID() (string, error) {\n\tbatchID, err := uuid.New()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn batchIdPrefix + batchID.String(), nil\n}\n\n// buildSubRequest is used for building the sub-request. Example:\n// DELETE /container0/blob0 HTTP/1.1\n// x-ms-date: Thu, 14 Jun 2018 16:46:54 GMT\n// Authorization: SharedKey account:<redacted>\n// Content-Length: 0\nfunc buildSubRequest(req *policy.Request) []byte {\n\tvar batchSubRequest strings.Builder\n\tblobPath := req.Raw().URL.EscapedPath()\n\tif len(req.Raw().URL.RawQuery) > 0 {\n\t\tblobPath += \"?\" + req.Raw().URL.RawQuery\n\t}\n\n\tbatchSubRequest.WriteString(fmt.Sprintf(\"%s %s %s%s\", req.Raw().Method, blobPath, httpVersion, httpNewline))\n\n\tfor k, v := range req.Raw().Header {\n\t\tif strings.EqualFold(k, shared.HeaderXmsVersion) {\n\t\t\tcontinue\n\t\t}\n\t\tif len(v) > 0 {\n\t\t\tbatchSubRequest.WriteString(fmt.Sprintf(\"%v: %v%v\", k, v[0], httpNewline))\n\t\t}\n\t}\n\n\tbatchSubRequest.WriteString(httpNewline)\n\treturn []byte(batchSubRequest.String())\n}\n\n// CreateBatchRequest creates a new batch request using the sub-requests present in the BlobBatchBuilder.\n//\n// Example of a sub-request in the batch request body:\n//\n//\t--batch_357de4f7-6d0b-4e02-8cd2-6361411a9525\n//\tContent-Type: application/http\n//\tContent-Transfer-Encoding: binary\n//\tContent-ID: 0\n//\n//\tDELETE /container0/blob0 HTTP/1.1\n//\tx-ms-date: Thu, 14 Jun 2018 16:46:54 GMT\n//\tAuthorization: SharedKey account:<redacted>\n//\tContent-Length: 0\nfunc CreateBatchRequest(bb *BlobBatchBuilder) ([]byte, string, error) {\n\tbatchID, err := createBatchID()\n\tif err != nil {\n\t\treturn nil, \"\", err\n\t}\n\n\t// Create a new multipart buffer\n\treqBody := &bytes.Buffer{}\n\twriter := multipart.NewWriter(reqBody)\n\n\t// Set the boundary\n\terr = writer.SetBoundary(batchID)\n\tif err != nil {\n\t\treturn nil, \"\", err\n\t}\n\n\tpartHeaders := make(textproto.MIMEHeader)\n\tpartHeaders[\"Content-Type\"] = []string{\"application/http\"}\n\tpartHeaders[\"Content-Transfer-Encoding\"] = []string{\"binary\"}\n\tvar partWriter io.Writer\n\n\tfor i, req := range bb.SubRequests {\n\t\tif bb.AuthPolicy != nil {\n\t\t\t_, err := bb.AuthPolicy.Do(req)\n\t\t\tif err != nil && !strings.EqualFold(err.Error(), \"no more policies\") {\n\t\t\t\tif log.Should(EventSubmitBatch) {\n\t\t\t\t\tlog.Writef(EventSubmitBatch, \"failed to authorize sub-request for %v.\\nError: %v\", req.Raw().URL.Path, err.Error())\n\t\t\t\t}\n\t\t\t\treturn nil, \"\", err\n\t\t\t}\n\t\t}\n\n\t\tpartHeaders[\"Content-ID\"] = []string{fmt.Sprintf(\"%v\", i)}\n\t\tpartWriter, err = writer.CreatePart(partHeaders)\n\t\tif err != nil {\n\t\t\treturn nil, \"\", err\n\t\t}\n\n\t\t_, err = partWriter.Write(buildSubRequest(req))\n\t\tif err != nil {\n\t\t\treturn nil, \"\", err\n\t\t}\n\t}\n\n\t// Close the multipart writer\n\terr = writer.Close()\n\tif err != nil {\n\t\treturn nil, \"\", err\n\t}\n\n\treturn reqBody.Bytes(), batchID, nil\n}\n\n// UpdateSubRequestHeaders updates the sub-request headers.\n// Removes x-ms-version header.\nfunc UpdateSubRequestHeaders(req *policy.Request) {\n\t// remove x-ms-version header from the request header\n\tfor k := range req.Raw().Header {\n\t\tif strings.EqualFold(k, shared.HeaderXmsVersion) {\n\t\t\tdelete(req.Raw().Header, k)\n\t\t}\n\t}\n}\n\n// BatchResponseItem contains the response for the individual sub-requests.\ntype BatchResponseItem struct {\n\tContentID     *int\n\tContainerName *string\n\tBlobName      *string\n\tRequestID     *string\n\tVersion       *string\n\tError         error // nil error indicates that the batch sub-request operation is successful\n}\n\nfunc getResponseBoundary(contentType *string) (string, error) {\n\tif contentType == nil {\n\t\treturn \"\", fmt.Errorf(\"Content-Type returned in SubmitBatch response is nil\")\n\t}\n\n\t_, params, err := mime.ParseMediaType(*contentType)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tif val, ok := params[\"boundary\"]; ok {\n\t\treturn val, nil\n\t} else {\n\t\treturn \"\", fmt.Errorf(\"batch boundary not present in Content-Type header of the SubmitBatch response.\\nContent-Type: %v\", *contentType)\n\t}\n}\n\nfunc getContentID(part *multipart.Part) (*int, error) {\n\tcontentID := part.Header.Get(\"Content-ID\")\n\tif contentID == \"\" {\n\t\treturn nil, nil\n\t}\n\n\tval, err := strconv.Atoi(strings.TrimSpace(contentID))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &val, nil\n}\n\nfunc getResponseHeader(key string, resp *http.Response) *string {\n\tval := resp.Header.Get(key)\n\tif val == \"\" {\n\t\treturn nil\n\t}\n\treturn &val\n}\n\n// ParseBlobBatchResponse is used for parsing the batch response body into individual sub-responses for each item in the batch.\nfunc ParseBlobBatchResponse(respBody io.ReadCloser, contentType *string, subRequests []*policy.Request) ([]*BatchResponseItem, error) {\n\tboundary, err := getResponseBoundary(contentType)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\trespReader := multipart.NewReader(respBody, boundary)\n\tvar responses []*BatchResponseItem\n\n\tfor {\n\t\tpart, err := respReader.NextPart()\n\t\tif errors.Is(err, io.EOF) {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tbatchSubResponse := &BatchResponseItem{}\n\t\tbatchSubResponse.ContentID, err = getContentID(part)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tif batchSubResponse.ContentID != nil {\n\t\t\tpath := strings.Trim(subRequests[*batchSubResponse.ContentID].Raw().URL.Path, \"/\")\n\t\t\tp := strings.Split(path, \"/\")\n\t\t\tbatchSubResponse.ContainerName = to.Ptr(p[0])\n\t\t\tbatchSubResponse.BlobName = to.Ptr(strings.Join(p[1:], \"/\"))\n\t\t}\n\n\t\trespBytes, err := io.ReadAll(part)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\trespBytes = append(respBytes, byte('\\n'))\n\t\tbuf := bytes.NewBuffer(respBytes)\n\t\tresp, err := http.ReadResponse(bufio.NewReader(buf), nil)\n\t\t// sub-response parsing error\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tbatchSubResponse.RequestID = getResponseHeader(shared.HeaderXmsRequestID, resp)\n\t\tbatchSubResponse.Version = getResponseHeader(shared.HeaderXmsVersion, resp)\n\n\t\t// sub-response failure\n\t\tif resp.StatusCode < 200 || resp.StatusCode >= 300 {\n\t\t\tif len(responses) == 0 && batchSubResponse.ContentID == nil {\n\t\t\t\t// this case can happen when the parent request fails.\n\t\t\t\t// For example, batch request having more than 256 sub-requests.\n\t\t\t\treturn nil, fmt.Errorf(\"%v\", string(respBytes))\n\t\t\t}\n\n\t\t\tresp.Request = subRequests[*batchSubResponse.ContentID].Raw()\n\t\t\tbatchSubResponse.Error = runtime.NewResponseError(resp)\n\t\t}\n\n\t\tresponses = append(responses, batchSubResponse)\n\t}\n\n\tif len(responses) != len(subRequests) {\n\t\treturn nil, fmt.Errorf(\"expected %v responses, got %v for the batch ID: %v\", len(subRequests), len(responses), boundary)\n\t}\n\n\treturn responses, nil\n}\n\n// not exported but used for batch request creation\n\n// BlobBatchBuilder is used for creating the blob batch request\ntype BlobBatchBuilder struct {\n\tAuthPolicy  policy.Policy\n\tSubRequests []*policy.Request\n}\n\n// BlobBatchOperationType defines the operation of the blob batch sub-requests.\ntype BlobBatchOperationType string\n\nconst (\n\tBatchDeleteOperationType  BlobBatchOperationType = \"delete\"\n\tBatchSetTierOperationType BlobBatchOperationType = \"set tier\"\n)\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/exported.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage exported\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n)\n\n// HTTPRange defines a range of bytes within an HTTP resource, starting at offset and\n// ending at offset+count. A zero-value HTTPRange indicates the entire resource. An HTTPRange\n// which has an offset and zero value count indicates from the offset to the resource's end.\ntype HTTPRange struct {\n\tOffset int64\n\tCount  int64\n}\n\n// FormatHTTPRange converts an HTTPRange to its string format.\nfunc FormatHTTPRange(r HTTPRange) *string {\n\tif r.Offset == 0 && r.Count == 0 {\n\t\treturn nil // No specified range\n\t}\n\tendOffset := \"\" // if count == CountToEnd (0)\n\tif r.Count > 0 {\n\t\tendOffset = strconv.FormatInt((r.Offset+r.Count)-1, 10)\n\t}\n\tdataRange := fmt.Sprintf(\"bytes=%v-%s\", r.Offset, endOffset)\n\treturn &dataRange\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/log_events.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage exported\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/log\"\n)\n\n// NOTE: these are publicly exported via type-aliasing in azblob/log.go\nconst (\n\t// EventUpload is used when we compute number of blocks to upload and size of each block.\n\tEventUpload log.Event = \"azblob.Upload\"\n\n\t// EventSubmitBatch is used for logging events related to submit blob batch operation.\n\tEventSubmitBatch log.Event = \"azblob.SubmitBatch\"\n)\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/set_expiry.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage exported\n\nimport (\n\t\"net/http\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/to\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n)\n\n// ExpiryType defines values for ExpiryType\ntype ExpiryType interface {\n\tFormat(o *SetExpiryOptions) (generated.ExpiryOptions, *generated.BlobClientSetExpiryOptions)\n\tnotPubliclyImplementable()\n}\n\n// ExpiryTypeAbsolute defines the absolute time for the blob expiry\ntype ExpiryTypeAbsolute time.Time\n\n// ExpiryTypeRelativeToNow defines the duration relative to now for the blob expiry\ntype ExpiryTypeRelativeToNow time.Duration\n\n// ExpiryTypeRelativeToCreation defines the duration relative to creation for the blob expiry\ntype ExpiryTypeRelativeToCreation time.Duration\n\n// ExpiryTypeNever defines that the blob will be set to never expire\ntype ExpiryTypeNever struct {\n\t// empty struct since NeverExpire expiry type does not require expiry time\n}\n\n// SetExpiryOptions contains the optional parameters for the Client.SetExpiry method.\ntype SetExpiryOptions struct {\n\t// placeholder for future options\n}\n\nfunc (e ExpiryTypeAbsolute) Format(o *SetExpiryOptions) (generated.ExpiryOptions, *generated.BlobClientSetExpiryOptions) {\n\treturn generated.ExpiryOptionsAbsolute, &generated.BlobClientSetExpiryOptions{\n\t\tExpiresOn: to.Ptr(time.Time(e).UTC().Format(http.TimeFormat)),\n\t}\n}\n\nfunc (e ExpiryTypeAbsolute) notPubliclyImplementable() {}\n\nfunc (e ExpiryTypeRelativeToNow) Format(o *SetExpiryOptions) (generated.ExpiryOptions, *generated.BlobClientSetExpiryOptions) {\n\treturn generated.ExpiryOptionsRelativeToNow, &generated.BlobClientSetExpiryOptions{\n\t\tExpiresOn: to.Ptr(strconv.FormatInt(time.Duration(e).Milliseconds(), 10)),\n\t}\n}\n\nfunc (e ExpiryTypeRelativeToNow) notPubliclyImplementable() {}\n\nfunc (e ExpiryTypeRelativeToCreation) Format(o *SetExpiryOptions) (generated.ExpiryOptions, *generated.BlobClientSetExpiryOptions) {\n\treturn generated.ExpiryOptionsRelativeToCreation, &generated.BlobClientSetExpiryOptions{\n\t\tExpiresOn: to.Ptr(strconv.FormatInt(time.Duration(e).Milliseconds(), 10)),\n\t}\n}\n\nfunc (e ExpiryTypeRelativeToCreation) notPubliclyImplementable() {}\n\nfunc (e ExpiryTypeNever) Format(o *SetExpiryOptions) (generated.ExpiryOptions, *generated.BlobClientSetExpiryOptions) {\n\treturn generated.ExpiryOptionsNeverExpire, nil\n}\n\nfunc (e ExpiryTypeNever) notPubliclyImplementable() {}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/shared_key_credential.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage exported\n\nimport (\n\t\"bytes\"\n\t\"crypto/hmac\"\n\t\"crypto/sha256\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"sort\"\n\t\"strings\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\tazlog \"github.com/Azure/azure-sdk-for-go/sdk/azcore/log\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/log\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared\"\n)\n\n// NewSharedKeyCredential creates an immutable SharedKeyCredential containing the\n// storage account's name and either its primary or secondary key.\nfunc NewSharedKeyCredential(accountName string, accountKey string) (*SharedKeyCredential, error) {\n\tc := SharedKeyCredential{accountName: accountName}\n\tif err := c.SetAccountKey(accountKey); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &c, nil\n}\n\n// SharedKeyCredential contains an account's name and its primary or secondary key.\ntype SharedKeyCredential struct {\n\t// Only the NewSharedKeyCredential method should set these; all other methods should treat them as read-only\n\taccountName string\n\taccountKey  atomic.Value // []byte\n}\n\n// AccountName returns the Storage account's name.\nfunc (c *SharedKeyCredential) AccountName() string {\n\treturn c.accountName\n}\n\n// SetAccountKey replaces the existing account key with the specified account key.\nfunc (c *SharedKeyCredential) SetAccountKey(accountKey string) error {\n\t_bytes, err := base64.StdEncoding.DecodeString(accountKey)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"decode account key: %w\", err)\n\t}\n\tc.accountKey.Store(_bytes)\n\treturn nil\n}\n\n// ComputeHMACSHA256 generates a hash signature for an HTTP request or for a SAS.\nfunc (c *SharedKeyCredential) computeHMACSHA256(message string) (string, error) {\n\th := hmac.New(sha256.New, c.accountKey.Load().([]byte))\n\t_, err := h.Write([]byte(message))\n\treturn base64.StdEncoding.EncodeToString(h.Sum(nil)), err\n}\n\nfunc (c *SharedKeyCredential) buildStringToSign(req *http.Request) (string, error) {\n\t// https://docs.microsoft.com/en-us/rest/api/storageservices/authentication-for-the-azure-storage-services\n\theaders := req.Header\n\tcontentLength := getHeader(shared.HeaderContentLength, headers)\n\tif contentLength == \"0\" {\n\t\tcontentLength = \"\"\n\t}\n\n\tcanonicalizedResource, err := c.buildCanonicalizedResource(req.URL)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tstringToSign := strings.Join([]string{\n\t\treq.Method,\n\t\tgetHeader(shared.HeaderContentEncoding, headers),\n\t\tgetHeader(shared.HeaderContentLanguage, headers),\n\t\tcontentLength,\n\t\tgetHeader(shared.HeaderContentMD5, headers),\n\t\tgetHeader(shared.HeaderContentType, headers),\n\t\t\"\", // Empty date because x-ms-date is expected (as per web page above)\n\t\tgetHeader(shared.HeaderIfModifiedSince, headers),\n\t\tgetHeader(shared.HeaderIfMatch, headers),\n\t\tgetHeader(shared.HeaderIfNoneMatch, headers),\n\t\tgetHeader(shared.HeaderIfUnmodifiedSince, headers),\n\t\tgetHeader(shared.HeaderRange, headers),\n\t\tc.buildCanonicalizedHeader(headers),\n\t\tcanonicalizedResource,\n\t}, \"\\n\")\n\treturn stringToSign, nil\n}\n\nfunc getHeader(key string, headers map[string][]string) string {\n\tif headers == nil {\n\t\treturn \"\"\n\t}\n\tif v, ok := headers[key]; ok {\n\t\tif len(v) > 0 {\n\t\t\treturn v[0]\n\t\t}\n\t}\n\n\treturn \"\"\n}\n\nfunc getWeightTables() [][]int {\n\ttableLv0 := [...]int{\n\t\t0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,\n\t\t0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,\n\t\t0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x71c, 0x0, 0x71f, 0x721, 0x723, 0x725,\n\t\t0x0, 0x0, 0x0, 0x72d, 0x803, 0x0, 0x0, 0x733, 0x0, 0xd03, 0xd1a, 0xd1c, 0xd1e,\n\t\t0xd20, 0xd22, 0xd24, 0xd26, 0xd28, 0xd2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,\n\t\t0xe02, 0xe09, 0xe0a, 0xe1a, 0xe21, 0xe23, 0xe25, 0xe2c, 0xe32, 0xe35, 0xe36, 0xe48, 0xe51,\n\t\t0xe70, 0xe7c, 0xe7e, 0xe89, 0xe8a, 0xe91, 0xe99, 0xe9f, 0xea2, 0xea4, 0xea6, 0xea7, 0xea9,\n\t\t0x0, 0x0, 0x0, 0x743, 0x744, 0x748, 0xe02, 0xe09, 0xe0a, 0xe1a, 0xe21, 0xe23, 0xe25,\n\t\t0xe2c, 0xe32, 0xe35, 0xe36, 0xe48, 0xe51, 0xe70, 0xe7c, 0xe7e, 0xe89, 0xe8a, 0xe91, 0xe99,\n\t\t0xe9f, 0xea2, 0xea4, 0xea6, 0xea7, 0xea9, 0x0, 0x74c, 0x0, 0x750, 0x0,\n\t}\n\ttableLv2 := [...]int{\n\t\t0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,\n\t\t0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,\n\t\t0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8012, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8212, 0x0, 0x0,\n\t\t0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,\n\t\t0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,\n\t\t0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,\n\t\t0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,\n\t\t0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,\n\t}\n\ttables := [][]int{tableLv0[:], tableLv2[:]}\n\treturn tables\n}\n\n// NewHeaderStringComparer performs a multi-level, weight-based comparison of two strings\nfunc compareHeaders(lhs, rhs string, tables [][]int) int {\n\tcurrLevel, i, j := 0, 0, 0\n\tn := len(tables)\n\tlhsLen := len(lhs)\n\trhsLen := len(rhs)\n\n\tfor currLevel < n {\n\t\tif currLevel == (n-1) && i != j {\n\t\t\tif i > j {\n\t\t\t\treturn -1\n\t\t\t}\n\t\t\tif i < j {\n\t\t\t\treturn 1\n\t\t\t}\n\t\t\treturn 0\n\t\t}\n\n\t\tvar w1, w2 int\n\n\t\t// Check bounds before accessing lhs[i]\n\t\tif i < lhsLen {\n\t\t\tw1 = tables[currLevel][lhs[i]]\n\t\t} else {\n\t\t\tw1 = 0x1\n\t\t}\n\n\t\t// Check bounds before accessing rhs[j]\n\t\tif j < rhsLen {\n\t\t\tw2 = tables[currLevel][rhs[j]]\n\t\t} else {\n\t\t\tw2 = 0x1\n\t\t}\n\n\t\tif w1 == 0x1 && w2 == 0x1 {\n\t\t\ti = 0\n\t\t\tj = 0\n\t\t\tcurrLevel++\n\t\t} else if w1 == w2 {\n\t\t\ti++\n\t\t\tj++\n\t\t} else if w1 == 0 {\n\t\t\ti++\n\t\t} else if w2 == 0 {\n\t\t\tj++\n\t\t} else {\n\t\t\tif w1 < w2 {\n\t\t\t\treturn -1\n\t\t\t}\n\t\t\tif w1 > w2 {\n\t\t\t\treturn 1\n\t\t\t}\n\t\t\treturn 0\n\t\t}\n\t}\n\treturn 0\n}\n\nfunc (c *SharedKeyCredential) buildCanonicalizedHeader(headers http.Header) string {\n\tcm := map[string][]string{}\n\tfor k, v := range headers {\n\t\theaderName := strings.TrimSpace(strings.ToLower(k))\n\t\tif strings.HasPrefix(headerName, \"x-ms-\") {\n\t\t\tcm[headerName] = v // NOTE: the value must not have any whitespace around it.\n\t\t}\n\t}\n\tif len(cm) == 0 {\n\t\treturn \"\"\n\t}\n\n\tkeys := make([]string, 0, len(cm))\n\tfor key := range cm {\n\t\tkeys = append(keys, key)\n\t}\n\ttables := getWeightTables()\n\t// Sort the keys using the custom comparator\n\tsort.Slice(keys, func(i, j int) bool {\n\t\treturn compareHeaders(keys[i], keys[j], tables) < 0\n\t})\n\tch := bytes.NewBufferString(\"\")\n\tfor i, key := range keys {\n\t\tif i > 0 {\n\t\t\tch.WriteRune('\\n')\n\t\t}\n\t\tch.WriteString(key)\n\t\tch.WriteRune(':')\n\t\tch.WriteString(strings.Join(cm[key], \",\"))\n\t}\n\treturn ch.String()\n}\n\nfunc (c *SharedKeyCredential) buildCanonicalizedResource(u *url.URL) (string, error) {\n\t// https://docs.microsoft.com/en-us/rest/api/storageservices/authentication-for-the-azure-storage-services\n\tcr := bytes.NewBufferString(\"/\")\n\tcr.WriteString(c.accountName)\n\n\tif len(u.Path) > 0 {\n\t\t// Any portion of the CanonicalizedResource string that is derived from\n\t\t// the resource's URI should be encoded exactly as it is in the URI.\n\t\t// -- https://msdn.microsoft.com/en-gb/library/azure/dd179428.aspx\n\t\tcr.WriteString(u.EscapedPath())\n\t} else {\n\t\t// a slash is required to indicate the root path\n\t\tcr.WriteString(\"/\")\n\t}\n\n\t// params is a map[string][]string; param name is key; params values is []string\n\tparams, err := url.ParseQuery(u.RawQuery) // Returns URL decoded values\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to parse query params: %w\", err)\n\t}\n\n\tif len(params) > 0 { // There is at least 1 query parameter\n\t\tvar paramNames []string // We use this to sort the parameter key names\n\t\tfor paramName := range params {\n\t\t\tparamNames = append(paramNames, paramName) // paramNames must be lowercase\n\t\t}\n\t\tsort.Strings(paramNames)\n\n\t\tfor _, paramName := range paramNames {\n\t\t\tparamValues := params[paramName]\n\t\t\tsort.Strings(paramValues)\n\n\t\t\t// Join the sorted key values separated by ','\n\t\t\t// Then prepend \"keyName:\"; then add this string to the buffer\n\t\t\tcr.WriteString(\"\\n\" + strings.ToLower(paramName) + \":\" + strings.Join(paramValues, \",\"))\n\t\t}\n\t}\n\treturn cr.String(), nil\n}\n\n// ComputeHMACSHA256 is a helper for computing the signed string outside of this package.\nfunc ComputeHMACSHA256(cred *SharedKeyCredential, message string) (string, error) {\n\treturn cred.computeHMACSHA256(message)\n}\n\n// the following content isn't actually exported but must live\n// next to SharedKeyCredential as it uses its unexported methods\n\ntype SharedKeyCredPolicy struct {\n\tcred *SharedKeyCredential\n}\n\nfunc NewSharedKeyCredPolicy(cred *SharedKeyCredential) *SharedKeyCredPolicy {\n\treturn &SharedKeyCredPolicy{cred: cred}\n}\n\nfunc (s *SharedKeyCredPolicy) Do(req *policy.Request) (*http.Response, error) {\n\t// skip adding the authorization header if no SharedKeyCredential was provided.\n\t// this prevents a panic that might be hard to diagnose and allows testing\n\t// against http endpoints that don't require authentication.\n\tif s.cred == nil {\n\t\treturn req.Next()\n\t}\n\n\tif d := getHeader(shared.HeaderXmsDate, req.Raw().Header); d == \"\" {\n\t\treq.Raw().Header.Set(shared.HeaderXmsDate, time.Now().UTC().Format(http.TimeFormat))\n\t}\n\tstringToSign, err := s.cred.buildStringToSign(req.Raw())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsignature, err := s.cred.computeHMACSHA256(stringToSign)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tauthHeader := strings.Join([]string{\"SharedKey \", s.cred.AccountName(), \":\", signature}, \"\")\n\treq.Raw().Header.Set(shared.HeaderAuthorization, authHeader)\n\n\tresponse, err := req.Next()\n\tif err != nil && response != nil && response.StatusCode == http.StatusForbidden {\n\t\t// Service failed to authenticate request, log it\n\t\tlog.Write(azlog.EventResponse, \"===== HTTP Forbidden status, String-to-Sign:\\n\"+stringToSign+\"\\n===============================\\n\")\n\t}\n\treturn response, err\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/transfer_validation_option.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage exported\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"hash/crc64\"\n\t\"io\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared\"\n)\n\n// TransferValidationType abstracts the various mechanisms used to verify a transfer.\ntype TransferValidationType interface {\n\tApply(io.ReadSeekCloser, generated.TransactionalContentSetter) (io.ReadSeekCloser, error)\n\tnotPubliclyImplementable()\n}\n\n// TransferValidationTypeCRC64 is a TransferValidationType used to provide a precomputed CRC64.\ntype TransferValidationTypeCRC64 uint64\n\nfunc (c TransferValidationTypeCRC64) Apply(rsc io.ReadSeekCloser, cfg generated.TransactionalContentSetter) (io.ReadSeekCloser, error) {\n\tbuf := make([]byte, 8)\n\tbinary.LittleEndian.PutUint64(buf, uint64(c))\n\tcfg.SetCRC64(buf)\n\treturn rsc, nil\n}\n\nfunc (TransferValidationTypeCRC64) notPubliclyImplementable() {}\n\n// TransferValidationTypeComputeCRC64 is a TransferValidationType that indicates a CRC64 should be computed during transfer.\nfunc TransferValidationTypeComputeCRC64() TransferValidationType {\n\treturn transferValidationTypeFn(func(rsc io.ReadSeekCloser, cfg generated.TransactionalContentSetter) (io.ReadSeekCloser, error) {\n\t\tbuf, err := io.ReadAll(rsc)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tcrc := crc64.Checksum(buf, shared.CRC64Table)\n\t\treturn TransferValidationTypeCRC64(crc).Apply(streaming.NopCloser(bytes.NewReader(buf)), cfg)\n\t})\n}\n\n// TransferValidationTypeMD5 is a TransferValidationType used to provide a precomputed MD5.\ntype TransferValidationTypeMD5 []byte\n\nfunc (c TransferValidationTypeMD5) Apply(rsc io.ReadSeekCloser, cfg generated.TransactionalContentSetter) (io.ReadSeekCloser, error) {\n\tcfg.SetMD5(c)\n\treturn rsc, nil\n}\n\nfunc (TransferValidationTypeMD5) notPubliclyImplementable() {}\n\ntype transferValidationTypeFn func(io.ReadSeekCloser, generated.TransactionalContentSetter) (io.ReadSeekCloser, error)\n\nfunc (t transferValidationTypeFn) Apply(rsc io.ReadSeekCloser, cfg generated.TransactionalContentSetter) (io.ReadSeekCloser, error) {\n\treturn t(rsc, cfg)\n}\n\nfunc (transferValidationTypeFn) notPubliclyImplementable() {}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/user_delegation_credential.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage exported\n\nimport (\n\t\"crypto/hmac\"\n\t\"crypto/sha256\"\n\t\"encoding/base64\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n)\n\n// NewUserDelegationCredential creates a new UserDelegationCredential using a Storage account's Name and a user delegation Key from it\nfunc NewUserDelegationCredential(accountName string, udk UserDelegationKey) *UserDelegationCredential {\n\treturn &UserDelegationCredential{\n\t\taccountName:       accountName,\n\t\tuserDelegationKey: udk,\n\t}\n}\n\n// UserDelegationKey contains UserDelegationKey.\ntype UserDelegationKey = generated.UserDelegationKey\n\n// UserDelegationCredential contains an account's name and its user delegation key.\ntype UserDelegationCredential struct {\n\taccountName       string\n\tuserDelegationKey UserDelegationKey\n}\n\n// getAccountName returns the Storage account's Name\nfunc (f *UserDelegationCredential) getAccountName() string {\n\treturn f.accountName\n}\n\n// GetAccountName is a helper method for accessing the user delegation key parameters outside this package.\nfunc GetAccountName(udc *UserDelegationCredential) string {\n\treturn udc.getAccountName()\n}\n\n// computeHMACSHA256 generates a hash signature for an HTTP request or for a SAS.\nfunc (f *UserDelegationCredential) computeHMACSHA256(message string) (string, error) {\n\tbytes, _ := base64.StdEncoding.DecodeString(*f.userDelegationKey.Value)\n\th := hmac.New(sha256.New, bytes)\n\t_, err := h.Write([]byte(message))\n\treturn base64.StdEncoding.EncodeToString(h.Sum(nil)), err\n}\n\n// ComputeUDCHMACSHA256 is a helper method for computing the signed string outside this package.\nfunc ComputeUDCHMACSHA256(udc *UserDelegationCredential, message string) (string, error) {\n\treturn udc.computeHMACSHA256(message)\n}\n\n// getUDKParams returns UserDelegationKey\nfunc (f *UserDelegationCredential) getUDKParams() *UserDelegationKey {\n\treturn &f.userDelegationKey\n}\n\n// GetUDKParams is a helper method for accessing the user delegation key parameters outside this package.\nfunc GetUDKParams(udc *UserDelegationCredential) *UserDelegationKey {\n\treturn udc.getUDKParams()\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/version.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage exported\n\nconst (\n\tModuleName    = \"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob\"\n\tModuleVersion = \"v1.6.1\"\n)\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/appendblob_client.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\npackage generated\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n)\n\nfunc (client *AppendBlobClient) Endpoint() string {\n\treturn client.endpoint\n}\n\nfunc (client *AppendBlobClient) InternalClient() *azcore.Client {\n\treturn client.internal\n}\n\n// NewAppendBlobClient creates a new instance of AppendBlobClient with the specified values.\n//   - endpoint - The URL of the service account, container, or blob that is the target of the desired operation.\n//   - azClient - azcore.Client is a basic HTTP client. It consists of a pipeline and tracing provider.\nfunc NewAppendBlobClient(endpoint string, azClient *azcore.Client) *AppendBlobClient {\n\tclient := &AppendBlobClient{\n\t\tinternal: azClient,\n\t\tendpoint: endpoint,\n\t}\n\treturn client\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/autorest.md",
    "content": "# Code Generation - Azure Blob SDK for Golang\n\n### Settings\n\n```yaml\ngo: true\nclear-output-folder: false\nversion: \"^3.0.0\"\nlicense-header: MICROSOFT_MIT_NO_VERSION\ninput-file: \"https://raw.githubusercontent.com/Azure/azure-rest-api-specs/ae95eb6a4701d844bada7d1c4f5ecf4a7444e5b8/specification/storage/data-plane/Microsoft.BlobStorage/stable/2025-01-05/blob.json\"\ncredential-scope: \"https://storage.azure.com/.default\"\noutput-folder: ../generated\nfile-prefix: \"zz_\"\nopenapi-type: \"data-plane\"\nverbose: true\nsecurity: AzureKey\nmodelerfour:\n  group-parameters: false\n  seal-single-value-enum-by-default: true\n  lenient-model-deduplication: true\nexport-clients: true\nuse: \"@autorest/go@4.0.0-preview.65\"\n```\n\n### Add a Properties field to the BlobPrefix definition\n```yaml\ndirective:\n- from: swagger-document\n  where: $.definitions\n  transform: >\n    $.BlobPrefix.properties[\"Properties\"] = {\n      \"type\": \"object\",\n      \"$ref\": \"#/definitions/BlobPropertiesInternal\"\n    };\n```\n\n### Add Owner,Group,Permissions,Acl,ResourceType in ListBlob Response\n``` yaml\ndirective:  \n- from: swagger-document    \n  where: $.definitions\n  transform: >\n    $.BlobPropertiesInternal.properties[\"Owner\"] = {\n      \"type\" : \"string\",\n    };\n    $.BlobPropertiesInternal.properties[\"Group\"] = {\n      \"type\" : \"string\",\n    };\n    $.BlobPropertiesInternal.properties[\"Permissions\"] = {\n      \"type\" : \"string\",\n    };\n    $.BlobPropertiesInternal.properties[\"Acl\"] = {\n      \"type\" : \"string\",\n    };\n    $.BlobPropertiesInternal.properties[\"ResourceType\"] = {\n      \"type\" : \"string\",\n    };\n\n```\n\n### Add permissions in ListBlobsInclude\n``` yaml\ndirective:  \n- from: swagger-document    \n  where: $.parameters.ListBlobsInclude    \n  transform: >        \n    $.items.enum.push(\"permissions\");\n```\n\n### Updating service version to 2025-05-05\n```yaml\ndirective:\n- from: \n  - zz_appendblob_client.go\n  - zz_blob_client.go\n  - zz_blockblob_client.go\n  - zz_container_client.go\n  - zz_pageblob_client.go\n  - zz_service_client.go\n  where: $\n  transform: >-\n    return $.\n      replaceAll(`[]string{\"2025-01-05\"}`, `[]string{ServiceVersion}`);\n```\n\n### Fix CRC Response Header in PutBlob response\n``` yaml\ndirective:\n- from: swagger-document\n  where: $[\"x-ms-paths\"][\"/{containerName}/{blob}?BlockBlob\"].put.responses[\"201\"].headers\n  transform: >\n      $[\"x-ms-content-crc64\"] = {\n        \"x-ms-client-name\": \"ContentCRC64\",\n        \"type\": \"string\",\n        \"format\": \"byte\",\n        \"description\": \"Returned for a block blob so that the client can check the integrity of message content.\"\n      };\n```\n\n### Undo breaking change with BlobName \n``` yaml\ndirective:\n- from: zz_models.go\n  where: $\n  transform: >-\n    return $.\n      replace(/Name\\s+\\*BlobName/g, `Name *string`);\n```\n\n### Removing UnmarshalXML for BlobItems to create customer UnmarshalXML function\n```yaml\ndirective:\n- from: swagger-document\n  where: $.definitions\n  transform: >\n    $.BlobItemInternal[\"x-ms-go-omit-serde-methods\"] = true;\n```\n\n### Remove pager methods and export various generated methods in container client\n\n``` yaml\ndirective:\n  - from: zz_container_client.go\n    where: $\n    transform: >-\n      return $.\n        replace(/func \\(client \\*ContainerClient\\) NewListBlobFlatSegmentPager\\(.+\\/\\/ listBlobFlatSegmentCreateRequest creates the ListBlobFlatSegment request/s, `//\\n// listBlobFlatSegmentCreateRequest creates the ListBlobFlatSegment request`).\n        replace(/\\(client \\*ContainerClient\\) listBlobFlatSegmentCreateRequest\\(/, `(client *ContainerClient) ListBlobFlatSegmentCreateRequest(`).\n        replace(/\\(client \\*ContainerClient\\) listBlobFlatSegmentHandleResponse\\(/, `(client *ContainerClient) ListBlobFlatSegmentHandleResponse(`);\n```\n\n### Remove pager methods and export various generated methods in service client\n\n``` yaml\ndirective:\n  - from: zz_service_client.go\n    where: $\n    transform: >-\n      return $.\n        replace(/func \\(client \\*ServiceClient\\) NewListContainersSegmentPager\\(.+\\/\\/ listContainersSegmentCreateRequest creates the ListContainersSegment request/s, `//\\n// listContainersSegmentCreateRequest creates the ListContainersSegment request`).\n        replace(/\\(client \\*ServiceClient\\) listContainersSegmentCreateRequest\\(/, `(client *ServiceClient) ListContainersSegmentCreateRequest(`).\n        replace(/\\(client \\*ServiceClient\\) listContainersSegmentHandleResponse\\(/, `(client *ServiceClient) ListContainersSegmentHandleResponse(`);\n```\n\n### Fix BlobMetadata.\n\n``` yaml\ndirective:\n- from: swagger-document\n  where: $.definitions\n  transform: >\n    delete $.BlobMetadata[\"properties\"];\n\n```\n\n### Don't include container name or blob in path - we have direct URIs.\n\n``` yaml\ndirective:\n- from: swagger-document\n  where: $[\"x-ms-paths\"]\n  transform: >\n    for (const property in $)\n    {\n        if (property.includes('/{containerName}/{blob}'))\n        {\n            $[property][\"parameters\"] = $[property][\"parameters\"].filter(function(param) { return (typeof param['$ref'] === \"undefined\") || (false == param['$ref'].endsWith(\"#/parameters/ContainerName\") && false == param['$ref'].endsWith(\"#/parameters/Blob\"))});\n        } \n        else if (property.includes('/{containerName}'))\n        {\n            $[property][\"parameters\"] = $[property][\"parameters\"].filter(function(param) { return (typeof param['$ref'] === \"undefined\") || (false == param['$ref'].endsWith(\"#/parameters/ContainerName\"))});\n        }\n    }\n```\n\n### Remove DataLake stuff.\n\n``` yaml\ndirective:\n- from: swagger-document\n  where: $[\"x-ms-paths\"]\n  transform: >\n    for (const property in $)\n    {\n        if (property.includes('filesystem'))\n        {\n            delete $[property];\n        }\n    }\n```\n\n### Remove DataLakeStorageError\n\n``` yaml\ndirective:\n- from: swagger-document\n  where: $.definitions\n  transform: >\n    delete $.DataLakeStorageError;\n```\n\n### Fix 304s\n\n``` yaml\ndirective:\n- from: swagger-document\n  where: $[\"x-ms-paths\"][\"/{containerName}/{blob}\"]\n  transform: >\n    $.get.responses[\"304\"] = {\n      \"description\": \"The condition specified using HTTP conditional header(s) is not met.\",\n      \"x-az-response-name\": \"ConditionNotMetError\",\n      \"headers\": { \"x-ms-error-code\": { \"x-ms-client-name\": \"ErrorCode\", \"type\": \"string\" } }\n    };\n```\n\n### Fix GeoReplication\n\n``` yaml\ndirective:\n- from: swagger-document\n  where: $.definitions\n  transform: >\n    delete $.GeoReplication.properties.Status[\"x-ms-enum\"];\n    $.GeoReplication.properties.Status[\"x-ms-enum\"] = {\n        \"name\": \"BlobGeoReplicationStatus\",\n        \"modelAsString\": false\n    };\n```\n\n### Fix RehydratePriority\n\n``` yaml\ndirective:\n- from: swagger-document\n  where: $.definitions\n  transform: >\n    delete $.RehydratePriority[\"x-ms-enum\"];\n    $.RehydratePriority[\"x-ms-enum\"] = {\n        \"name\": \"RehydratePriority\",\n        \"modelAsString\": false\n    };\n```\n\n### Fix BlobDeleteType\n\n``` yaml\ndirective:\n- from: swagger-document\n  where: $.parameters\n  transform: >\n    delete $.BlobDeleteType.enum;\n    $.BlobDeleteType.enum = [\n        \"None\",\n        \"Permanent\"\n    ];\n```\n\n### Fix EncryptionAlgorithm\n\n``` yaml\ndirective:\n- from: swagger-document\n  where: $.parameters\n  transform: >\n    delete $.EncryptionAlgorithm.enum;\n    $.EncryptionAlgorithm.enum = [\n      \"None\",\n      \"AES256\"\n    ];\n```\n\n### Fix XML string \"ObjectReplicationMetadata\" to \"OrMetadata\"\n\n``` yaml\ndirective:\n- from: swagger-document\n  where: $.definitions\n  transform: >\n    $.BlobItemInternal.properties[\"OrMetadata\"] = $.BlobItemInternal.properties[\"ObjectReplicationMetadata\"];\n    delete $.BlobItemInternal.properties[\"ObjectReplicationMetadata\"];\n```\n\n# Export various createRequest/HandleResponse methods\n\n``` yaml\ndirective:\n- from: zz_container_client.go\n  where: $\n  transform: >-\n    return $.\n      replace(/listBlobHierarchySegmentCreateRequest/g, function(_, s) { return `ListBlobHierarchySegmentCreateRequest` }).\n      replace(/listBlobHierarchySegmentHandleResponse/g, function(_, s) { return `ListBlobHierarchySegmentHandleResponse` });\n\n- from: zz_pageblob_client.go\n  where: $\n  transform: >-\n    return $.\n      replace(/getPageRanges(Diff)?CreateRequest/g, function(_, s) { if (s === undefined) { s = '' }; return `GetPageRanges${s}CreateRequest` }).\n      replace(/getPageRanges(Diff)?HandleResponse/g, function(_, s) { if (s === undefined) { s = '' }; return `GetPageRanges${s}HandleResponse` });\n```\n\n### Clean up some const type names so they don't stutter\n\n``` yaml\ndirective:\n- from: swagger-document\n  where: $.parameters['BlobDeleteType']\n  transform: >\n    $[\"x-ms-enum\"].name = \"DeleteType\";\n    $[\"x-ms-client-name\"] = \"DeleteType\";\n\n- from: swagger-document\n  where: $.parameters['BlobExpiryOptions']\n  transform: >\n    $[\"x-ms-enum\"].name = \"ExpiryOptions\";\n    $[\"x-ms-client-name\"].name = \"ExpiryOptions\";\n\n- from: swagger-document\n  where: $[\"x-ms-paths\"][*].*.responses[*].headers[\"x-ms-immutability-policy-mode\"]\n  transform: >\n    $[\"x-ms-client-name\"].name = \"ImmutabilityPolicyMode\";\n    $.enum = [ \"Mutable\", \"Unlocked\", \"Locked\"];\n    $[\"x-ms-enum\"] = { \"name\": \"ImmutabilityPolicyMode\", \"modelAsString\": false };\n\n- from: swagger-document\n  where: $.parameters['ImmutabilityPolicyMode']\n  transform: >\n    $[\"x-ms-enum\"].name = \"ImmutabilityPolicySetting\";\n    $[\"x-ms-client-name\"].name = \"ImmutabilityPolicySetting\";\n\n- from: swagger-document\n  where: $.definitions['BlobPropertiesInternal']\n  transform: >\n    $.properties.ImmutabilityPolicyMode[\"x-ms-enum\"].name = \"ImmutabilityPolicyMode\";\n```\n\n### use azcore.ETag\n\n``` yaml\ndirective:\n- from:\n  - zz_models.go\n  - zz_options.go\n  where: $\n  transform: >-\n    return $.\n      replace(/import \"time\"/, `import (\\n\\t\"time\"\\n\\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\\n)`).\n      replace(/Etag\\s+\\*string/g, `ETag *azcore.ETag`).\n      replace(/IfMatch\\s+\\*string/g, `IfMatch *azcore.ETag`).\n      replace(/IfNoneMatch\\s+\\*string/g, `IfNoneMatch *azcore.ETag`).\n      replace(/SourceIfMatch\\s+\\*string/g, `SourceIfMatch *azcore.ETag`).\n      replace(/SourceIfNoneMatch\\s+\\*string/g, `SourceIfNoneMatch *azcore.ETag`);\n\n- from: zz_responses.go\n  where: $\n  transform: >-\n    return $.\n      replace(/\"time\"/, `\"time\"\\n\\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"`).\n      replace(/ETag\\s+\\*string/g, `ETag *azcore.ETag`);\n\n- from:\n  - zz_appendblob_client.go\n  - zz_blob_client.go\n  - zz_blockblob_client.go\n  - zz_container_client.go\n  - zz_pageblob_client.go\n  where: $\n  transform: >-\n    return $.\n      replace(/\"github\\.com\\/Azure\\/azure\\-sdk\\-for\\-go\\/sdk\\/azcore\\/policy\"/, `\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\\n\\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"`).\n      replace(/result\\.ETag\\s+=\\s+&val/g, `result.ETag = (*azcore.ETag)(&val)`).\n      replace(/\\*modifiedAccessConditions.IfMatch/g, `string(*modifiedAccessConditions.IfMatch)`).\n      replace(/\\*modifiedAccessConditions.IfNoneMatch/g, `string(*modifiedAccessConditions.IfNoneMatch)`).\n      replace(/\\*sourceModifiedAccessConditions.SourceIfMatch/g, `string(*sourceModifiedAccessConditions.SourceIfMatch)`).\n      replace(/\\*sourceModifiedAccessConditions.SourceIfNoneMatch/g, `string(*sourceModifiedAccessConditions.SourceIfNoneMatch)`);\n```\n\n### Unsure why this casing changed, but fixing it\n\n``` yaml\ndirective:\n- from: zz_models.go\n  where: $\n  transform: >-\n    return $.\n      replace(/SignedOid\\s+\\*string/g, `SignedOID *string`).\n      replace(/SignedTid\\s+\\*string/g, `SignedTID *string`);\n```\n\n### Fixing Typo with StorageErrorCodeIncrementalCopyOfEarlierVersionSnapshotNotAllowed\n\n``` yaml\ndirective:\n- from: zz_constants.go\n  where: $\n  transform: >-\n    return $.\n      replace(/IncrementalCopyOfEralierVersionSnapshotNotAllowed/g, \"IncrementalCopyOfEarlierVersionSnapshotNotAllowed\");\n```\n\n### Fix up x-ms-content-crc64 header response name\n\n``` yaml\ndirective:\n- from: swagger-document\n  where: $.x-ms-paths.*.*.responses.*.headers.x-ms-content-crc64\n  transform: >\n    $[\"x-ms-client-name\"] = \"ContentCRC64\"\n```\n\n``` yaml\ndirective:\n- rename-model:\n    from: BlobItemInternal\n    to: BlobItem\n- rename-model:\n    from: BlobPropertiesInternal\n    to: BlobProperties\n```\n\n### Updating encoding URL, Golang adds '+' which disrupts encoding with service\n\n``` yaml\ndirective:\n- from: \n  - zz_service_client.go\n  - zz_container_client.go\n  where: $\n  transform: >-\n    return $.\n      replace(/req.Raw\\(\\).URL.RawQuery \\= reqQP.Encode\\(\\)/g, `req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)`);\n```\n\n### Change `where` parameter in blob filtering to be required\n\n``` yaml\ndirective:\n- from: swagger-document\n  where: $.parameters.FilterBlobsWhere\n  transform: >\n    $.required = true;\n```\n\n### Change `Duration` parameter in leases to be required\n\n``` yaml\ndirective:\n- from: swagger-document\n  where: $.parameters.LeaseDuration\n  transform: >\n    $.required = true;\n```\n\n### Change CPK acronym to be all caps\n\n``` yaml\ndirective:\n  - from: source-file-go\n    where: $\n    transform: >-\n      return $.\n        replace(/Cpk/g, \"CPK\");\n```\n\n### Change CORS acronym to be all caps\n\n``` yaml\ndirective:\n  - from: source-file-go\n    where: $\n    transform: >-\n      return $.\n        replace(/Cors/g, \"CORS\");\n```\n\n### Change cors xml to be correct\n\n``` yaml\ndirective:\n  - from: source-file-go\n    where: $\n    transform: >-\n      return $.\n        replace(/xml:\"CORS>CORSRule\"/g, \"xml:\\\"Cors>CorsRule\\\"\");\n```\n\n### Fix Content-Type header in submit batch request\n\n``` yaml\ndirective:\n- from: \n  - zz_container_client.go\n  - zz_service_client.go\n  where: $\n  transform: >-\n    return $.\n      replace (/req.SetBody\\(body\\,\\s+\\\"application\\/xml\\\"\\)/g, `req.SetBody(body, multipartContentType)`);\n```\n\n### Fix response status code check in submit batch request\n\n``` yaml\ndirective:\n- from: zz_service_client.go\n  where: $\n  transform: >-\n    return $.\n      replace(/if\\s+!runtime\\.HasStatusCode\\(httpResp,\\s+http\\.StatusOK\\)\\s+\\{\\s+err\\s+=\\s+runtime\\.NewResponseError\\(httpResp\\)\\s+return ServiceClientSubmitBatchResponse\\{\\}\\,\\s+err\\s+}/g, \n      `if !runtime.HasStatusCode(httpResp, http.StatusAccepted) {\\n\\t\\terr = runtime.NewResponseError(httpResp)\\n\\t\\treturn ServiceClientSubmitBatchResponse{}, err\\n\\t}`);\n```\n\n### Convert time to GMT for If-Modified-Since and If-Unmodified-Since request headers\n\n``` yaml\ndirective:\n- from: \n  - zz_container_client.go\n  - zz_blob_client.go\n  - zz_appendblob_client.go\n  - zz_blockblob_client.go\n  - zz_pageblob_client.go\n  where: $\n  transform: >-\n    return $.\n      replace (/req\\.Raw\\(\\)\\.Header\\[\\\"If-Modified-Since\\\"\\]\\s+=\\s+\\[\\]string\\{modifiedAccessConditions\\.IfModifiedSince\\.Format\\(time\\.RFC1123\\)\\}/g, \n      `req.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}`).\n      replace (/req\\.Raw\\(\\)\\.Header\\[\\\"If-Unmodified-Since\\\"\\]\\s+=\\s+\\[\\]string\\{modifiedAccessConditions\\.IfUnmodifiedSince\\.Format\\(time\\.RFC1123\\)\\}/g, \n      `req.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}`).\n      replace (/req\\.Raw\\(\\)\\.Header\\[\\\"x-ms-source-if-modified-since\\\"\\]\\s+=\\s+\\[\\]string\\{sourceModifiedAccessConditions\\.SourceIfModifiedSince\\.Format\\(time\\.RFC1123\\)\\}/g, \n      `req.Raw().Header[\"x-ms-source-if-modified-since\"] = []string{(*sourceModifiedAccessConditions.SourceIfModifiedSince).In(gmt).Format(time.RFC1123)}`).\n      replace (/req\\.Raw\\(\\)\\.Header\\[\\\"x-ms-source-if-unmodified-since\\\"\\]\\s+=\\s+\\[\\]string\\{sourceModifiedAccessConditions\\.SourceIfUnmodifiedSince\\.Format\\(time\\.RFC1123\\)\\}/g, \n      `req.Raw().Header[\"x-ms-source-if-unmodified-since\"] = []string{(*sourceModifiedAccessConditions.SourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)}`).\n      replace (/req\\.Raw\\(\\)\\.Header\\[\\\"x-ms-immutability-policy-until-date\\\"\\]\\s+=\\s+\\[\\]string\\{options\\.ImmutabilityPolicyExpiry\\.Format\\(time\\.RFC1123\\)\\}/g, \n      `req.Raw().Header[\"x-ms-immutability-policy-until-date\"] = []string{(*options.ImmutabilityPolicyExpiry).In(gmt).Format(time.RFC1123)}`);\n      \n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/blob_client.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage generated\n\nimport (\n\t\"context\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"time\"\n)\n\n// used to convert times from UTC to GMT before sending across the wire\nvar gmt = time.FixedZone(\"GMT\", 0)\n\nfunc (client *BlobClient) Endpoint() string {\n\treturn client.endpoint\n}\n\nfunc (client *BlobClient) InternalClient() *azcore.Client {\n\treturn client.internal\n}\n\nfunc (client *BlobClient) DeleteCreateRequest(ctx context.Context, options *BlobClientDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treturn client.deleteCreateRequest(ctx, options, leaseAccessConditions, modifiedAccessConditions)\n}\n\nfunc (client *BlobClient) SetTierCreateRequest(ctx context.Context, tier AccessTier, options *BlobClientSetTierOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treturn client.setTierCreateRequest(ctx, tier, options, leaseAccessConditions, modifiedAccessConditions)\n}\n\n// NewBlobClient creates a new instance of BlobClient with the specified values.\n//   - endpoint - The URL of the service account, container, or blob that is the target of the desired operation.\n//   - azClient - azcore.Client is a basic HTTP client. It consists of a pipeline and tracing provider.\nfunc NewBlobClient(endpoint string, azClient *azcore.Client) *BlobClient {\n\tclient := &BlobClient{\n\t\tinternal: azClient,\n\t\tendpoint: endpoint,\n\t}\n\treturn client\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/block_blob_client.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\npackage generated\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n)\n\nfunc (client *BlockBlobClient) Endpoint() string {\n\treturn client.endpoint\n}\n\nfunc (client *BlockBlobClient) Internal() *azcore.Client {\n\treturn client.internal\n}\n\n// NewBlockBlobClient creates a new instance of BlockBlobClient with the specified values.\n//   - endpoint - The URL of the service account, container, or blob that is the target of the desired operation.\n//   - azClient - azcore.Client is a basic HTTP client. It consists of a pipeline and tracing provider.\nfunc NewBlockBlobClient(endpoint string, azClient *azcore.Client) *BlockBlobClient {\n\tclient := &BlockBlobClient{\n\t\tinternal: azClient,\n\t\tendpoint: endpoint,\n\t}\n\treturn client\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/build.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n//go:generate autorest ./autorest.md\n//go:generate gofmt -w .\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage generated\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/constants.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage generated\n\nconst ServiceVersion = \"2025-05-05\"\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/container_client.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage generated\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n)\n\nfunc (client *ContainerClient) Endpoint() string {\n\treturn client.endpoint\n}\n\nfunc (client *ContainerClient) InternalClient() *azcore.Client {\n\treturn client.internal\n}\n\n// NewContainerClient creates a new instance of ContainerClient with the specified values.\n//   - endpoint - The URL of the service account, container, or blob that is the target of the desired operation.\n//   - pl - the pipeline used for sending requests and handling responses.\nfunc NewContainerClient(endpoint string, azClient *azcore.Client) *ContainerClient {\n\tclient := &ContainerClient{\n\t\tinternal: azClient,\n\t\tendpoint: endpoint,\n\t}\n\treturn client\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/models.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage generated\n\nimport (\n\t\"encoding/xml\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/to\"\n\t\"net/url\"\n)\n\ntype TransactionalContentSetter interface {\n\tSetCRC64([]byte)\n\tSetMD5([]byte)\n}\n\nfunc (a *AppendBlobClientAppendBlockOptions) SetCRC64(v []byte) {\n\ta.TransactionalContentCRC64 = v\n}\n\nfunc (a *AppendBlobClientAppendBlockOptions) SetMD5(v []byte) {\n\ta.TransactionalContentMD5 = v\n}\n\nfunc (b *BlockBlobClientStageBlockOptions) SetCRC64(v []byte) {\n\tb.TransactionalContentCRC64 = v\n}\n\nfunc (b *BlockBlobClientStageBlockOptions) SetMD5(v []byte) {\n\tb.TransactionalContentMD5 = v\n}\n\nfunc (p *PageBlobClientUploadPagesOptions) SetCRC64(v []byte) {\n\tp.TransactionalContentCRC64 = v\n}\n\nfunc (p *PageBlobClientUploadPagesOptions) SetMD5(v []byte) {\n\tp.TransactionalContentMD5 = v\n}\n\nfunc (b *BlockBlobClientUploadOptions) SetCRC64(v []byte) {\n\tb.TransactionalContentCRC64 = v\n}\n\nfunc (b *BlockBlobClientUploadOptions) SetMD5(v []byte) {\n\tb.TransactionalContentMD5 = v\n}\n\ntype SourceContentSetter interface {\n\tSetSourceContentCRC64(v []byte)\n\tSetSourceContentMD5(v []byte)\n}\n\nfunc (a *AppendBlobClientAppendBlockFromURLOptions) SetSourceContentCRC64(v []byte) {\n\ta.SourceContentcrc64 = v\n}\n\nfunc (a *AppendBlobClientAppendBlockFromURLOptions) SetSourceContentMD5(v []byte) {\n\ta.SourceContentMD5 = v\n}\n\nfunc (b *BlockBlobClientStageBlockFromURLOptions) SetSourceContentCRC64(v []byte) {\n\tb.SourceContentcrc64 = v\n}\n\nfunc (b *BlockBlobClientStageBlockFromURLOptions) SetSourceContentMD5(v []byte) {\n\tb.SourceContentMD5 = v\n}\n\nfunc (p *PageBlobClientUploadPagesFromURLOptions) SetSourceContentCRC64(v []byte) {\n\tp.SourceContentcrc64 = v\n}\n\nfunc (p *PageBlobClientUploadPagesFromURLOptions) SetSourceContentMD5(v []byte) {\n\tp.SourceContentMD5 = v\n}\n\n// Custom UnmarshalXML functions for types that need special handling.\n\n// UnmarshalXML implements the xml.Unmarshaller interface for type BlobPrefix.\nfunc (b *BlobPrefix) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) error {\n\ttype alias BlobPrefix\n\taux := &struct {\n\t\t*alias\n\t\tBlobName *BlobName `xml:\"Name\"`\n\t}{\n\t\talias: (*alias)(b),\n\t}\n\tif err := dec.DecodeElement(aux, &start); err != nil {\n\t\treturn err\n\t}\n\tif aux.BlobName != nil {\n\t\tif aux.BlobName.Encoded != nil && *aux.BlobName.Encoded {\n\t\t\tname, err := url.QueryUnescape(*aux.BlobName.Content)\n\n\t\t\t// name, err := base64.StdEncoding.DecodeString(*aux.BlobName.Content)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tb.Name = to.Ptr(string(name))\n\t\t} else {\n\t\t\tb.Name = aux.BlobName.Content\n\t\t}\n\t}\n\treturn nil\n}\n\n// UnmarshalXML implements the xml.Unmarshaller interface for type BlobItem.\nfunc (b *BlobItem) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) error {\n\ttype alias BlobItem\n\taux := &struct {\n\t\t*alias\n\t\tBlobName   *BlobName            `xml:\"Name\"`\n\t\tMetadata   additionalProperties `xml:\"Metadata\"`\n\t\tOrMetadata additionalProperties `xml:\"OrMetadata\"`\n\t}{\n\t\talias: (*alias)(b),\n\t}\n\tif err := dec.DecodeElement(aux, &start); err != nil {\n\t\treturn err\n\t}\n\tb.Metadata = (map[string]*string)(aux.Metadata)\n\tb.OrMetadata = (map[string]*string)(aux.OrMetadata)\n\tif aux.BlobName != nil {\n\t\tif aux.BlobName.Encoded != nil && *aux.BlobName.Encoded {\n\t\t\tname, err := url.QueryUnescape(*aux.BlobName.Content)\n\n\t\t\t// name, err := base64.StdEncoding.DecodeString(*aux.BlobName.Content)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tb.Name = to.Ptr(string(name))\n\t\t} else {\n\t\t\tb.Name = aux.BlobName.Content\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/pageblob_client.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage generated\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n)\n\nfunc (client *PageBlobClient) Endpoint() string {\n\treturn client.endpoint\n}\n\nfunc (client *PageBlobClient) InternalClient() *azcore.Client {\n\treturn client.internal\n}\n\n// NewPageBlobClient creates a new instance of PageBlobClient with the specified values.\n//   - endpoint - The URL of the service account, container, or blob that is the target of the desired operation.\n//   - azClient - azcore.Client is a basic HTTP client. It consists of a pipeline and tracing provider.\nfunc NewPageBlobClient(endpoint string, azClient *azcore.Client) *PageBlobClient {\n\tclient := &PageBlobClient{\n\t\tinternal: azClient,\n\t\tendpoint: endpoint,\n\t}\n\treturn client\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/service_client.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage generated\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n)\n\nfunc (client *ServiceClient) Endpoint() string {\n\treturn client.endpoint\n}\n\nfunc (client *ServiceClient) InternalClient() *azcore.Client {\n\treturn client.internal\n}\n\n// NewServiceClient creates a new instance of ServiceClient with the specified values.\n//   - endpoint - The URL of the service account, container, or blob that is the target of the desired operation.\n//   - azClient - azcore.Client is a basic HTTP client. It consists of a pipeline and tracing provider.\nfunc NewServiceClient(endpoint string, azClient *azcore.Client) *ServiceClient {\n\tclient := &ServiceClient{\n\t\tinternal: azClient,\n\t\tendpoint: endpoint,\n\t}\n\treturn client\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_appendblob_client.go",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n// Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\npackage generated\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"io\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"time\"\n)\n\n// AppendBlobClient contains the methods for the AppendBlob group.\n// Don't use this type directly, use a constructor function instead.\ntype AppendBlobClient struct {\n\tinternal *azcore.Client\n\tendpoint string\n}\n\n// AppendBlock - The Append Block operation commits a new block of data to the end of an existing append blob. The Append\n// Block operation is permitted only if the blob was created with x-ms-blob-type set to\n// AppendBlob. Append Block is supported only on version 2015-02-21 version or later.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - contentLength - The length of the request.\n//   - body - Initial data\n//   - options - AppendBlobClientAppendBlockOptions contains the optional parameters for the AppendBlobClient.AppendBlock method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - AppendPositionAccessConditions - AppendPositionAccessConditions contains a group of parameters for the AppendBlobClient.AppendBlock\n//     method.\n//   - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method.\n//   - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *AppendBlobClient) AppendBlock(ctx context.Context, contentLength int64, body io.ReadSeekCloser, options *AppendBlobClientAppendBlockOptions, leaseAccessConditions *LeaseAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (AppendBlobClientAppendBlockResponse, error) {\n\tvar err error\n\treq, err := client.appendBlockCreateRequest(ctx, contentLength, body, options, leaseAccessConditions, appendPositionAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn AppendBlobClientAppendBlockResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn AppendBlobClientAppendBlockResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusCreated) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn AppendBlobClientAppendBlockResponse{}, err\n\t}\n\tresp, err := client.appendBlockHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// appendBlockCreateRequest creates the AppendBlock request.\nfunc (client *AppendBlobClient) appendBlockCreateRequest(ctx context.Context, contentLength int64, body io.ReadSeekCloser, options *AppendBlobClientAppendBlockOptions, leaseAccessConditions *LeaseAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"appendblock\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\treq.Raw().Header[\"Content-Length\"] = []string{strconv.FormatInt(contentLength, 10)}\n\tif options != nil && options.TransactionalContentMD5 != nil {\n\t\treq.Raw().Header[\"Content-MD5\"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentMD5)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif appendPositionAccessConditions != nil && appendPositionAccessConditions.AppendPosition != nil {\n\t\treq.Raw().Header[\"x-ms-blob-condition-appendpos\"] = []string{strconv.FormatInt(*appendPositionAccessConditions.AppendPosition, 10)}\n\t}\n\tif appendPositionAccessConditions != nil && appendPositionAccessConditions.MaxSize != nil {\n\t\treq.Raw().Header[\"x-ms-blob-condition-maxsize\"] = []string{strconv.FormatInt(*appendPositionAccessConditions.MaxSize, 10)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif options != nil && options.TransactionalContentCRC64 != nil {\n\t\treq.Raw().Header[\"x-ms-content-crc64\"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentCRC64)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-algorithm\"] = []string{string(*cpkInfo.EncryptionAlgorithm)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKey != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key\"] = []string{*cpkInfo.EncryptionKey}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key-sha256\"] = []string{*cpkInfo.EncryptionKeySHA256}\n\t}\n\tif cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-scope\"] = []string{*cpkScopeInfo.EncryptionScope}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\tif options != nil && options.StructuredBodyType != nil {\n\t\treq.Raw().Header[\"x-ms-structured-body\"] = []string{*options.StructuredBodyType}\n\t}\n\tif options != nil && options.StructuredContentLength != nil {\n\t\treq.Raw().Header[\"x-ms-structured-content-length\"] = []string{strconv.FormatInt(*options.StructuredContentLength, 10)}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\tif err := req.SetBody(body, \"application/octet-stream\"); err != nil {\n\t\treturn nil, err\n\t}\n\treturn req, nil\n}\n\n// appendBlockHandleResponse handles the AppendBlock response.\nfunc (client *AppendBlobClient) appendBlockHandleResponse(resp *http.Response) (AppendBlobClientAppendBlockResponse, error) {\n\tresult := AppendBlobClientAppendBlockResponse{}\n\tif val := resp.Header.Get(\"x-ms-blob-append-offset\"); val != \"\" {\n\t\tresult.BlobAppendOffset = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-blob-committed-block-count\"); val != \"\" {\n\t\tblobCommittedBlockCount32, err := strconv.ParseInt(val, 10, 32)\n\t\tblobCommittedBlockCount := int32(blobCommittedBlockCount32)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientAppendBlockResponse{}, err\n\t\t}\n\t\tresult.BlobCommittedBlockCount = &blobCommittedBlockCount\n\t}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-content-crc64\"); val != \"\" {\n\t\tcontentCRC64, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientAppendBlockResponse{}, err\n\t\t}\n\t\tresult.ContentCRC64 = contentCRC64\n\t}\n\tif val := resp.Header.Get(\"Content-MD5\"); val != \"\" {\n\t\tcontentMD5, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientAppendBlockResponse{}, err\n\t\t}\n\t\tresult.ContentMD5 = contentMD5\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientAppendBlockResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-key-sha256\"); val != \"\" {\n\t\tresult.EncryptionKeySHA256 = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-scope\"); val != \"\" {\n\t\tresult.EncryptionScope = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-server-encrypted\"); val != \"\" {\n\t\tisServerEncrypted, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientAppendBlockResponse{}, err\n\t\t}\n\t\tresult.IsServerEncrypted = &isServerEncrypted\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientAppendBlockResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-structured-body\"); val != \"\" {\n\t\tresult.StructuredBodyType = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// AppendBlockFromURL - The Append Block operation commits a new block of data to the end of an existing append blob where\n// the contents are read from a source url. The Append Block operation is permitted only if the blob was\n// created with x-ms-blob-type set to AppendBlob. Append Block is supported only on version 2015-02-21 version or later.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - sourceURL - Specify a URL to the copy source.\n//   - contentLength - The length of the request.\n//   - options - AppendBlobClientAppendBlockFromURLOptions contains the optional parameters for the AppendBlobClient.AppendBlockFromURL\n//     method.\n//   - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method.\n//   - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - AppendPositionAccessConditions - AppendPositionAccessConditions contains a group of parameters for the AppendBlobClient.AppendBlock\n//     method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\n//   - SourceModifiedAccessConditions - SourceModifiedAccessConditions contains a group of parameters for the BlobClient.StartCopyFromURL\n//     method.\nfunc (client *AppendBlobClient) AppendBlockFromURL(ctx context.Context, sourceURL string, contentLength int64, options *AppendBlobClientAppendBlockFromURLOptions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, leaseAccessConditions *LeaseAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (AppendBlobClientAppendBlockFromURLResponse, error) {\n\tvar err error\n\treq, err := client.appendBlockFromURLCreateRequest(ctx, sourceURL, contentLength, options, cpkInfo, cpkScopeInfo, leaseAccessConditions, appendPositionAccessConditions, modifiedAccessConditions, sourceModifiedAccessConditions)\n\tif err != nil {\n\t\treturn AppendBlobClientAppendBlockFromURLResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn AppendBlobClientAppendBlockFromURLResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusCreated) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn AppendBlobClientAppendBlockFromURLResponse{}, err\n\t}\n\tresp, err := client.appendBlockFromURLHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// appendBlockFromURLCreateRequest creates the AppendBlockFromURL request.\nfunc (client *AppendBlobClient) appendBlockFromURLCreateRequest(ctx context.Context, sourceURL string, contentLength int64, options *AppendBlobClientAppendBlockFromURLOptions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, leaseAccessConditions *LeaseAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"appendblock\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\treq.Raw().Header[\"Content-Length\"] = []string{strconv.FormatInt(contentLength, 10)}\n\tif options != nil && options.TransactionalContentMD5 != nil {\n\t\treq.Raw().Header[\"Content-MD5\"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentMD5)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif appendPositionAccessConditions != nil && appendPositionAccessConditions.AppendPosition != nil {\n\t\treq.Raw().Header[\"x-ms-blob-condition-appendpos\"] = []string{strconv.FormatInt(*appendPositionAccessConditions.AppendPosition, 10)}\n\t}\n\tif appendPositionAccessConditions != nil && appendPositionAccessConditions.MaxSize != nil {\n\t\treq.Raw().Header[\"x-ms-blob-condition-maxsize\"] = []string{strconv.FormatInt(*appendPositionAccessConditions.MaxSize, 10)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-copy-source\"] = []string{sourceURL}\n\tif options != nil && options.CopySourceAuthorization != nil {\n\t\treq.Raw().Header[\"x-ms-copy-source-authorization\"] = []string{*options.CopySourceAuthorization}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-algorithm\"] = []string{string(*cpkInfo.EncryptionAlgorithm)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKey != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key\"] = []string{*cpkInfo.EncryptionKey}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key-sha256\"] = []string{*cpkInfo.EncryptionKeySHA256}\n\t}\n\tif cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-scope\"] = []string{*cpkScopeInfo.EncryptionScope}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\tif options != nil && options.SourceContentcrc64 != nil {\n\t\treq.Raw().Header[\"x-ms-source-content-crc64\"] = []string{base64.StdEncoding.EncodeToString(options.SourceContentcrc64)}\n\t}\n\tif options != nil && options.SourceContentMD5 != nil {\n\t\treq.Raw().Header[\"x-ms-source-content-md5\"] = []string{base64.StdEncoding.EncodeToString(options.SourceContentMD5)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfMatch != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-match\"] = []string{string(*sourceModifiedAccessConditions.SourceIfMatch)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfModifiedSince != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-modified-since\"] = []string{(*sourceModifiedAccessConditions.SourceIfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfNoneMatch != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-none-match\"] = []string{string(*sourceModifiedAccessConditions.SourceIfNoneMatch)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-unmodified-since\"] = []string{(*sourceModifiedAccessConditions.SourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.SourceRange != nil {\n\t\treq.Raw().Header[\"x-ms-source-range\"] = []string{*options.SourceRange}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// appendBlockFromURLHandleResponse handles the AppendBlockFromURL response.\nfunc (client *AppendBlobClient) appendBlockFromURLHandleResponse(resp *http.Response) (AppendBlobClientAppendBlockFromURLResponse, error) {\n\tresult := AppendBlobClientAppendBlockFromURLResponse{}\n\tif val := resp.Header.Get(\"x-ms-blob-append-offset\"); val != \"\" {\n\t\tresult.BlobAppendOffset = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-blob-committed-block-count\"); val != \"\" {\n\t\tblobCommittedBlockCount32, err := strconv.ParseInt(val, 10, 32)\n\t\tblobCommittedBlockCount := int32(blobCommittedBlockCount32)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientAppendBlockFromURLResponse{}, err\n\t\t}\n\t\tresult.BlobCommittedBlockCount = &blobCommittedBlockCount\n\t}\n\tif val := resp.Header.Get(\"x-ms-content-crc64\"); val != \"\" {\n\t\tcontentCRC64, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientAppendBlockFromURLResponse{}, err\n\t\t}\n\t\tresult.ContentCRC64 = contentCRC64\n\t}\n\tif val := resp.Header.Get(\"Content-MD5\"); val != \"\" {\n\t\tcontentMD5, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientAppendBlockFromURLResponse{}, err\n\t\t}\n\t\tresult.ContentMD5 = contentMD5\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientAppendBlockFromURLResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-key-sha256\"); val != \"\" {\n\t\tresult.EncryptionKeySHA256 = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-scope\"); val != \"\" {\n\t\tresult.EncryptionScope = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-server-encrypted\"); val != \"\" {\n\t\tisServerEncrypted, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientAppendBlockFromURLResponse{}, err\n\t\t}\n\t\tresult.IsServerEncrypted = &isServerEncrypted\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientAppendBlockFromURLResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// Create - The Create Append Blob operation creates a new append blob.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - contentLength - The length of the request.\n//   - options - AppendBlobClientCreateOptions contains the optional parameters for the AppendBlobClient.Create method.\n//   - BlobHTTPHeaders - BlobHTTPHeaders contains a group of parameters for the BlobClient.SetHTTPHeaders method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method.\n//   - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *AppendBlobClient) Create(ctx context.Context, contentLength int64, options *AppendBlobClientCreateOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (AppendBlobClientCreateResponse, error) {\n\tvar err error\n\treq, err := client.createCreateRequest(ctx, contentLength, options, blobHTTPHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn AppendBlobClientCreateResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn AppendBlobClientCreateResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusCreated) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn AppendBlobClientCreateResponse{}, err\n\t}\n\tresp, err := client.createHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// createCreateRequest creates the Create request.\nfunc (client *AppendBlobClient) createCreateRequest(ctx context.Context, contentLength int64, options *AppendBlobClientCreateOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\treq.Raw().Header[\"Content-Length\"] = []string{strconv.FormatInt(contentLength, 10)}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobCacheControl != nil {\n\t\treq.Raw().Header[\"x-ms-blob-cache-control\"] = []string{*blobHTTPHeaders.BlobCacheControl}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentDisposition != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-disposition\"] = []string{*blobHTTPHeaders.BlobContentDisposition}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentEncoding != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-encoding\"] = []string{*blobHTTPHeaders.BlobContentEncoding}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentLanguage != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-language\"] = []string{*blobHTTPHeaders.BlobContentLanguage}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentMD5 != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-md5\"] = []string{base64.StdEncoding.EncodeToString(blobHTTPHeaders.BlobContentMD5)}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentType != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-type\"] = []string{*blobHTTPHeaders.BlobContentType}\n\t}\n\treq.Raw().Header[\"x-ms-blob-type\"] = []string{\"AppendBlob\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-algorithm\"] = []string{string(*cpkInfo.EncryptionAlgorithm)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKey != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key\"] = []string{*cpkInfo.EncryptionKey}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key-sha256\"] = []string{*cpkInfo.EncryptionKeySHA256}\n\t}\n\tif cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-scope\"] = []string{*cpkScopeInfo.EncryptionScope}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif options != nil && options.ImmutabilityPolicyMode != nil {\n\t\treq.Raw().Header[\"x-ms-immutability-policy-mode\"] = []string{string(*options.ImmutabilityPolicyMode)}\n\t}\n\tif options != nil && options.ImmutabilityPolicyExpiry != nil {\n\t\treq.Raw().Header[\"x-ms-immutability-policy-until-date\"] = []string{(*options.ImmutabilityPolicyExpiry).In(gmt).Format(time.RFC1123)}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\tif options != nil && options.LegalHold != nil {\n\t\treq.Raw().Header[\"x-ms-legal-hold\"] = []string{strconv.FormatBool(*options.LegalHold)}\n\t}\n\tif options != nil && options.Metadata != nil {\n\t\tfor k, v := range options.Metadata {\n\t\t\tif v != nil {\n\t\t\t\treq.Raw().Header[\"x-ms-meta-\"+k] = []string{*v}\n\t\t\t}\n\t\t}\n\t}\n\tif options != nil && options.BlobTagsString != nil {\n\t\treq.Raw().Header[\"x-ms-tags\"] = []string{*options.BlobTagsString}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// createHandleResponse handles the Create response.\nfunc (client *AppendBlobClient) createHandleResponse(resp *http.Response) (AppendBlobClientCreateResponse, error) {\n\tresult := AppendBlobClientCreateResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Content-MD5\"); val != \"\" {\n\t\tcontentMD5, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientCreateResponse{}, err\n\t\t}\n\t\tresult.ContentMD5 = contentMD5\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientCreateResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-key-sha256\"); val != \"\" {\n\t\tresult.EncryptionKeySHA256 = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-scope\"); val != \"\" {\n\t\tresult.EncryptionScope = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-server-encrypted\"); val != \"\" {\n\t\tisServerEncrypted, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientCreateResponse{}, err\n\t\t}\n\t\tresult.IsServerEncrypted = &isServerEncrypted\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientCreateResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version-id\"); val != \"\" {\n\t\tresult.VersionID = &val\n\t}\n\treturn result, nil\n}\n\n// Seal - The Seal operation seals the Append Blob to make it read-only. Seal is supported only on version 2019-12-12 version\n// or later.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - AppendBlobClientSealOptions contains the optional parameters for the AppendBlobClient.Seal method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\n//   - AppendPositionAccessConditions - AppendPositionAccessConditions contains a group of parameters for the AppendBlobClient.AppendBlock\n//     method.\nfunc (client *AppendBlobClient) Seal(ctx context.Context, options *AppendBlobClientSealOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions) (AppendBlobClientSealResponse, error) {\n\tvar err error\n\treq, err := client.sealCreateRequest(ctx, options, leaseAccessConditions, modifiedAccessConditions, appendPositionAccessConditions)\n\tif err != nil {\n\t\treturn AppendBlobClientSealResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn AppendBlobClientSealResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn AppendBlobClientSealResponse{}, err\n\t}\n\tresp, err := client.sealHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// sealCreateRequest creates the Seal request.\nfunc (client *AppendBlobClient) sealCreateRequest(ctx context.Context, options *AppendBlobClientSealOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"seal\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif appendPositionAccessConditions != nil && appendPositionAccessConditions.AppendPosition != nil {\n\t\treq.Raw().Header[\"x-ms-blob-condition-appendpos\"] = []string{strconv.FormatInt(*appendPositionAccessConditions.AppendPosition, 10)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// sealHandleResponse handles the Seal response.\nfunc (client *AppendBlobClient) sealHandleResponse(resp *http.Response) (AppendBlobClientSealResponse, error) {\n\tresult := AppendBlobClientSealResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientSealResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-blob-sealed\"); val != \"\" {\n\t\tisSealed, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientSealResponse{}, err\n\t\t}\n\t\tresult.IsSealed = &isSealed\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn AppendBlobClientSealResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_blob_client.go",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n// Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\npackage generated\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/to\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n)\n\n// BlobClient contains the methods for the Blob group.\n// Don't use this type directly, use a constructor function instead.\ntype BlobClient struct {\n\tinternal *azcore.Client\n\tendpoint string\n}\n\n// AbortCopyFromURL - The Abort Copy From URL operation aborts a pending Copy From URL operation, and leaves a destination\n// blob with zero length and full metadata.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - copyID - The copy identifier provided in the x-ms-copy-id header of the original Copy Blob operation.\n//   - options - BlobClientAbortCopyFromURLOptions contains the optional parameters for the BlobClient.AbortCopyFromURL method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\nfunc (client *BlobClient) AbortCopyFromURL(ctx context.Context, copyID string, options *BlobClientAbortCopyFromURLOptions, leaseAccessConditions *LeaseAccessConditions) (BlobClientAbortCopyFromURLResponse, error) {\n\tvar err error\n\treq, err := client.abortCopyFromURLCreateRequest(ctx, copyID, options, leaseAccessConditions)\n\tif err != nil {\n\t\treturn BlobClientAbortCopyFromURLResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientAbortCopyFromURLResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusNoContent) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientAbortCopyFromURLResponse{}, err\n\t}\n\tresp, err := client.abortCopyFromURLHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// abortCopyFromURLCreateRequest creates the AbortCopyFromURL request.\nfunc (client *BlobClient) abortCopyFromURLCreateRequest(ctx context.Context, copyID string, options *BlobClientAbortCopyFromURLOptions, leaseAccessConditions *LeaseAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"copy\")\n\treqQP.Set(\"copyid\", copyID)\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-copy-action\"] = []string{\"abort\"}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// abortCopyFromURLHandleResponse handles the AbortCopyFromURL response.\nfunc (client *BlobClient) abortCopyFromURLHandleResponse(resp *http.Response) (BlobClientAbortCopyFromURLResponse, error) {\n\tresult := BlobClientAbortCopyFromURLResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientAbortCopyFromURLResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// AcquireLease - [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - duration - Specifies the duration of the lease, in seconds, or negative one (-1) for a lease that never expires. A non-infinite\n//     lease can be between 15 and 60 seconds. A lease duration cannot be changed using\n//     renew or change.\n//   - options - BlobClientAcquireLeaseOptions contains the optional parameters for the BlobClient.AcquireLease method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *BlobClient) AcquireLease(ctx context.Context, duration int32, options *BlobClientAcquireLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientAcquireLeaseResponse, error) {\n\tvar err error\n\treq, err := client.acquireLeaseCreateRequest(ctx, duration, options, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn BlobClientAcquireLeaseResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientAcquireLeaseResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusCreated) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientAcquireLeaseResponse{}, err\n\t}\n\tresp, err := client.acquireLeaseHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// acquireLeaseCreateRequest creates the AcquireLease request.\nfunc (client *BlobClient) acquireLeaseCreateRequest(ctx context.Context, duration int32, options *BlobClientAcquireLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"lease\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\treq.Raw().Header[\"x-ms-lease-action\"] = []string{\"acquire\"}\n\treq.Raw().Header[\"x-ms-lease-duration\"] = []string{strconv.FormatInt(int64(duration), 10)}\n\tif options != nil && options.ProposedLeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-proposed-lease-id\"] = []string{*options.ProposedLeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// acquireLeaseHandleResponse handles the AcquireLease response.\nfunc (client *BlobClient) acquireLeaseHandleResponse(resp *http.Response) (BlobClientAcquireLeaseResponse, error) {\n\tresult := BlobClientAcquireLeaseResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientAcquireLeaseResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientAcquireLeaseResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-id\"); val != \"\" {\n\t\tresult.LeaseID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// BreakLease - [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - BlobClientBreakLeaseOptions contains the optional parameters for the BlobClient.BreakLease method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *BlobClient) BreakLease(ctx context.Context, options *BlobClientBreakLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientBreakLeaseResponse, error) {\n\tvar err error\n\treq, err := client.breakLeaseCreateRequest(ctx, options, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn BlobClientBreakLeaseResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientBreakLeaseResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusAccepted) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientBreakLeaseResponse{}, err\n\t}\n\tresp, err := client.breakLeaseHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// breakLeaseCreateRequest creates the BreakLease request.\nfunc (client *BlobClient) breakLeaseCreateRequest(ctx context.Context, options *BlobClientBreakLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"lease\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\treq.Raw().Header[\"x-ms-lease-action\"] = []string{\"break\"}\n\tif options != nil && options.BreakPeriod != nil {\n\t\treq.Raw().Header[\"x-ms-lease-break-period\"] = []string{strconv.FormatInt(int64(*options.BreakPeriod), 10)}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// breakLeaseHandleResponse handles the BreakLease response.\nfunc (client *BlobClient) breakLeaseHandleResponse(resp *http.Response) (BlobClientBreakLeaseResponse, error) {\n\tresult := BlobClientBreakLeaseResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientBreakLeaseResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientBreakLeaseResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-time\"); val != \"\" {\n\t\tleaseTime32, err := strconv.ParseInt(val, 10, 32)\n\t\tleaseTime := int32(leaseTime32)\n\t\tif err != nil {\n\t\t\treturn BlobClientBreakLeaseResponse{}, err\n\t\t}\n\t\tresult.LeaseTime = &leaseTime\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// ChangeLease - [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - leaseID - Specifies the current lease ID on the resource.\n//   - proposedLeaseID - Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the proposed\n//     lease ID is not in the correct format. See Guid Constructor (String) for a list of valid GUID\n//     string formats.\n//   - options - BlobClientChangeLeaseOptions contains the optional parameters for the BlobClient.ChangeLease method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *BlobClient) ChangeLease(ctx context.Context, leaseID string, proposedLeaseID string, options *BlobClientChangeLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientChangeLeaseResponse, error) {\n\tvar err error\n\treq, err := client.changeLeaseCreateRequest(ctx, leaseID, proposedLeaseID, options, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn BlobClientChangeLeaseResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientChangeLeaseResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientChangeLeaseResponse{}, err\n\t}\n\tresp, err := client.changeLeaseHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// changeLeaseCreateRequest creates the ChangeLease request.\nfunc (client *BlobClient) changeLeaseCreateRequest(ctx context.Context, leaseID string, proposedLeaseID string, options *BlobClientChangeLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"lease\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\treq.Raw().Header[\"x-ms-lease-action\"] = []string{\"change\"}\n\treq.Raw().Header[\"x-ms-lease-id\"] = []string{leaseID}\n\treq.Raw().Header[\"x-ms-proposed-lease-id\"] = []string{proposedLeaseID}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// changeLeaseHandleResponse handles the ChangeLease response.\nfunc (client *BlobClient) changeLeaseHandleResponse(resp *http.Response) (BlobClientChangeLeaseResponse, error) {\n\tresult := BlobClientChangeLeaseResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientChangeLeaseResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientChangeLeaseResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-id\"); val != \"\" {\n\t\tresult.LeaseID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// CopyFromURL - The Copy From URL operation copies a blob or an internet resource to a new blob. It will not return a response\n// until the copy is complete.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - copySource - Specifies the name of the source page blob snapshot. This value is a URL of up to 2 KB in length that specifies\n//     a page blob snapshot. The value should be URL-encoded as it would appear in a request\n//     URI. The source blob must either be public or must be authenticated via a shared access signature.\n//   - options - BlobClientCopyFromURLOptions contains the optional parameters for the BlobClient.CopyFromURL method.\n//   - SourceModifiedAccessConditions - SourceModifiedAccessConditions contains a group of parameters for the BlobClient.StartCopyFromURL\n//     method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method.\nfunc (client *BlobClient) CopyFromURL(ctx context.Context, copySource string, options *BlobClientCopyFromURLOptions, sourceModifiedAccessConditions *SourceModifiedAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions, cpkScopeInfo *CPKScopeInfo) (BlobClientCopyFromURLResponse, error) {\n\tvar err error\n\treq, err := client.copyFromURLCreateRequest(ctx, copySource, options, sourceModifiedAccessConditions, modifiedAccessConditions, leaseAccessConditions, cpkScopeInfo)\n\tif err != nil {\n\t\treturn BlobClientCopyFromURLResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientCopyFromURLResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusAccepted) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientCopyFromURLResponse{}, err\n\t}\n\tresp, err := client.copyFromURLHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// copyFromURLCreateRequest creates the CopyFromURL request.\nfunc (client *BlobClient) copyFromURLCreateRequest(ctx context.Context, copySource string, options *BlobClientCopyFromURLOptions, sourceModifiedAccessConditions *SourceModifiedAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions, cpkScopeInfo *CPKScopeInfo) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.Tier != nil {\n\t\treq.Raw().Header[\"x-ms-access-tier\"] = []string{string(*options.Tier)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-copy-source\"] = []string{copySource}\n\tif options != nil && options.CopySourceAuthorization != nil {\n\t\treq.Raw().Header[\"x-ms-copy-source-authorization\"] = []string{*options.CopySourceAuthorization}\n\t}\n\tif options != nil && options.CopySourceTags != nil {\n\t\treq.Raw().Header[\"x-ms-copy-source-tag-option\"] = []string{string(*options.CopySourceTags)}\n\t}\n\tif cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-scope\"] = []string{*cpkScopeInfo.EncryptionScope}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif options != nil && options.ImmutabilityPolicyMode != nil {\n\t\treq.Raw().Header[\"x-ms-immutability-policy-mode\"] = []string{string(*options.ImmutabilityPolicyMode)}\n\t}\n\tif options != nil && options.ImmutabilityPolicyExpiry != nil {\n\t\treq.Raw().Header[\"x-ms-immutability-policy-until-date\"] = []string{(*options.ImmutabilityPolicyExpiry).In(gmt).Format(time.RFC1123)}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\tif options != nil && options.LegalHold != nil {\n\t\treq.Raw().Header[\"x-ms-legal-hold\"] = []string{strconv.FormatBool(*options.LegalHold)}\n\t}\n\tif options != nil && options.Metadata != nil {\n\t\tfor k, v := range options.Metadata {\n\t\t\tif v != nil {\n\t\t\t\treq.Raw().Header[\"x-ms-meta-\"+k] = []string{*v}\n\t\t\t}\n\t\t}\n\t}\n\treq.Raw().Header[\"x-ms-requires-sync\"] = []string{\"true\"}\n\tif options != nil && options.SourceContentMD5 != nil {\n\t\treq.Raw().Header[\"x-ms-source-content-md5\"] = []string{base64.StdEncoding.EncodeToString(options.SourceContentMD5)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfMatch != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-match\"] = []string{string(*sourceModifiedAccessConditions.SourceIfMatch)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfModifiedSince != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-modified-since\"] = []string{(*sourceModifiedAccessConditions.SourceIfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfNoneMatch != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-none-match\"] = []string{string(*sourceModifiedAccessConditions.SourceIfNoneMatch)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-unmodified-since\"] = []string{(*sourceModifiedAccessConditions.SourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.BlobTagsString != nil {\n\t\treq.Raw().Header[\"x-ms-tags\"] = []string{*options.BlobTagsString}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// copyFromURLHandleResponse handles the CopyFromURL response.\nfunc (client *BlobClient) copyFromURLHandleResponse(resp *http.Response) (BlobClientCopyFromURLResponse, error) {\n\tresult := BlobClientCopyFromURLResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-content-crc64\"); val != \"\" {\n\t\tcontentCRC64, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientCopyFromURLResponse{}, err\n\t\t}\n\t\tresult.ContentCRC64 = contentCRC64\n\t}\n\tif val := resp.Header.Get(\"Content-MD5\"); val != \"\" {\n\t\tcontentMD5, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientCopyFromURLResponse{}, err\n\t\t}\n\t\tresult.ContentMD5 = contentMD5\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-id\"); val != \"\" {\n\t\tresult.CopyID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-status\"); val != \"\" {\n\t\tresult.CopyStatus = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientCopyFromURLResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-scope\"); val != \"\" {\n\t\tresult.EncryptionScope = &val\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientCopyFromURLResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version-id\"); val != \"\" {\n\t\tresult.VersionID = &val\n\t}\n\treturn result, nil\n}\n\n// CreateSnapshot - The Create Snapshot operation creates a read-only snapshot of a blob\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - BlobClientCreateSnapshotOptions contains the optional parameters for the BlobClient.CreateSnapshot method.\n//   - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method.\n//   - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\nfunc (client *BlobClient) CreateSnapshot(ctx context.Context, options *BlobClientCreateSnapshotOptions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (BlobClientCreateSnapshotResponse, error) {\n\tvar err error\n\treq, err := client.createSnapshotCreateRequest(ctx, options, cpkInfo, cpkScopeInfo, modifiedAccessConditions, leaseAccessConditions)\n\tif err != nil {\n\t\treturn BlobClientCreateSnapshotResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientCreateSnapshotResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusCreated) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientCreateSnapshotResponse{}, err\n\t}\n\tresp, err := client.createSnapshotHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// createSnapshotCreateRequest creates the CreateSnapshot request.\nfunc (client *BlobClient) createSnapshotCreateRequest(ctx context.Context, options *BlobClientCreateSnapshotOptions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"snapshot\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-algorithm\"] = []string{string(*cpkInfo.EncryptionAlgorithm)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKey != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key\"] = []string{*cpkInfo.EncryptionKey}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key-sha256\"] = []string{*cpkInfo.EncryptionKeySHA256}\n\t}\n\tif cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-scope\"] = []string{*cpkScopeInfo.EncryptionScope}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\tif options != nil && options.Metadata != nil {\n\t\tfor k, v := range options.Metadata {\n\t\t\tif v != nil {\n\t\t\t\treq.Raw().Header[\"x-ms-meta-\"+k] = []string{*v}\n\t\t\t}\n\t\t}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// createSnapshotHandleResponse handles the CreateSnapshot response.\nfunc (client *BlobClient) createSnapshotHandleResponse(resp *http.Response) (BlobClientCreateSnapshotResponse, error) {\n\tresult := BlobClientCreateSnapshotResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientCreateSnapshotResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-server-encrypted\"); val != \"\" {\n\t\tisServerEncrypted, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientCreateSnapshotResponse{}, err\n\t\t}\n\t\tresult.IsServerEncrypted = &isServerEncrypted\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientCreateSnapshotResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-snapshot\"); val != \"\" {\n\t\tresult.Snapshot = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version-id\"); val != \"\" {\n\t\tresult.VersionID = &val\n\t}\n\treturn result, nil\n}\n\n// Delete - If the storage account's soft delete feature is disabled then, when a blob is deleted, it is permanently removed\n// from the storage account. If the storage account's soft delete feature is enabled,\n// then, when a blob is deleted, it is marked for deletion and becomes inaccessible immediately. However, the blob service\n// retains the blob or snapshot for the number of days specified by the\n// DeleteRetentionPolicy section of Storage service properties [Set-Blob-Service-Properties.md]. After the specified number\n// of days has passed, the blob's data is permanently removed from the storage\n// account. Note that you continue to be charged for the soft-deleted blob's storage until it is permanently removed. Use\n// the List Blobs API and specify the \"include=deleted\" query parameter to discover\n// which blobs and snapshots have been soft deleted. You can then use the Undelete Blob API to restore a soft-deleted blob.\n// All other operations on a soft-deleted blob or snapshot causes the service to\n// return an HTTP status code of 404 (ResourceNotFound).\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - BlobClientDeleteOptions contains the optional parameters for the BlobClient.Delete method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *BlobClient) Delete(ctx context.Context, options *BlobClientDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientDeleteResponse, error) {\n\tvar err error\n\treq, err := client.deleteCreateRequest(ctx, options, leaseAccessConditions, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn BlobClientDeleteResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientDeleteResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusAccepted) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientDeleteResponse{}, err\n\t}\n\tresp, err := client.deleteHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// deleteCreateRequest creates the Delete request.\nfunc (client *BlobClient) deleteCreateRequest(ctx context.Context, options *BlobClientDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodDelete, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\tif options != nil && options.DeleteType != nil {\n\t\treqQP.Set(\"deletetype\", string(*options.DeleteType))\n\t}\n\tif options != nil && options.Snapshot != nil {\n\t\treqQP.Set(\"snapshot\", *options.Snapshot)\n\t}\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\tif options != nil && options.VersionID != nil {\n\t\treqQP.Set(\"versionid\", *options.VersionID)\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif options != nil && options.DeleteSnapshots != nil {\n\t\treq.Raw().Header[\"x-ms-delete-snapshots\"] = []string{string(*options.DeleteSnapshots)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// deleteHandleResponse handles the Delete response.\nfunc (client *BlobClient) deleteHandleResponse(resp *http.Response) (BlobClientDeleteResponse, error) {\n\tresult := BlobClientDeleteResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientDeleteResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// DeleteImmutabilityPolicy - The Delete Immutability Policy operation deletes the immutability policy on the blob\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - BlobClientDeleteImmutabilityPolicyOptions contains the optional parameters for the BlobClient.DeleteImmutabilityPolicy\n//     method.\nfunc (client *BlobClient) DeleteImmutabilityPolicy(ctx context.Context, options *BlobClientDeleteImmutabilityPolicyOptions) (BlobClientDeleteImmutabilityPolicyResponse, error) {\n\tvar err error\n\treq, err := client.deleteImmutabilityPolicyCreateRequest(ctx, options)\n\tif err != nil {\n\t\treturn BlobClientDeleteImmutabilityPolicyResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientDeleteImmutabilityPolicyResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientDeleteImmutabilityPolicyResponse{}, err\n\t}\n\tresp, err := client.deleteImmutabilityPolicyHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// deleteImmutabilityPolicyCreateRequest creates the DeleteImmutabilityPolicy request.\nfunc (client *BlobClient) deleteImmutabilityPolicyCreateRequest(ctx context.Context, options *BlobClientDeleteImmutabilityPolicyOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodDelete, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"immutabilityPolicies\")\n\tif options != nil && options.Snapshot != nil {\n\t\treqQP.Set(\"snapshot\", *options.Snapshot)\n\t}\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\tif options != nil && options.VersionID != nil {\n\t\treqQP.Set(\"versionid\", *options.VersionID)\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// deleteImmutabilityPolicyHandleResponse handles the DeleteImmutabilityPolicy response.\nfunc (client *BlobClient) deleteImmutabilityPolicyHandleResponse(resp *http.Response) (BlobClientDeleteImmutabilityPolicyResponse, error) {\n\tresult := BlobClientDeleteImmutabilityPolicyResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientDeleteImmutabilityPolicyResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// Download - The Download operation reads or downloads a blob from the system, including its metadata and properties. You\n// can also call Download to read a snapshot.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - BlobClientDownloadOptions contains the optional parameters for the BlobClient.Download method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *BlobClient) Download(ctx context.Context, options *BlobClientDownloadOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientDownloadResponse, error) {\n\tvar err error\n\treq, err := client.downloadCreateRequest(ctx, options, leaseAccessConditions, cpkInfo, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn BlobClientDownloadResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientDownloadResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK, http.StatusPartialContent, http.StatusNotModified) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientDownloadResponse{}, err\n\t}\n\tresp, err := client.downloadHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// downloadCreateRequest creates the Download request.\nfunc (client *BlobClient) downloadCreateRequest(ctx context.Context, options *BlobClientDownloadOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\tif options != nil && options.Snapshot != nil {\n\t\treqQP.Set(\"snapshot\", *options.Snapshot)\n\t}\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\tif options != nil && options.VersionID != nil {\n\t\treqQP.Set(\"versionid\", *options.VersionID)\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\truntime.SkipBodyDownload(req)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-algorithm\"] = []string{string(*cpkInfo.EncryptionAlgorithm)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKey != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key\"] = []string{*cpkInfo.EncryptionKey}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key-sha256\"] = []string{*cpkInfo.EncryptionKeySHA256}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\tif options != nil && options.Range != nil {\n\t\treq.Raw().Header[\"x-ms-range\"] = []string{*options.Range}\n\t}\n\tif options != nil && options.RangeGetContentCRC64 != nil {\n\t\treq.Raw().Header[\"x-ms-range-get-content-crc64\"] = []string{strconv.FormatBool(*options.RangeGetContentCRC64)}\n\t}\n\tif options != nil && options.RangeGetContentMD5 != nil {\n\t\treq.Raw().Header[\"x-ms-range-get-content-md5\"] = []string{strconv.FormatBool(*options.RangeGetContentMD5)}\n\t}\n\tif options != nil && options.StructuredBodyType != nil {\n\t\treq.Raw().Header[\"x-ms-structured-body\"] = []string{*options.StructuredBodyType}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// downloadHandleResponse handles the Download response.\nfunc (client *BlobClient) downloadHandleResponse(resp *http.Response) (BlobClientDownloadResponse, error) {\n\tresult := BlobClientDownloadResponse{Body: resp.Body}\n\tif val := resp.Header.Get(\"Accept-Ranges\"); val != \"\" {\n\t\tresult.AcceptRanges = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-blob-committed-block-count\"); val != \"\" {\n\t\tblobCommittedBlockCount32, err := strconv.ParseInt(val, 10, 32)\n\t\tblobCommittedBlockCount := int32(blobCommittedBlockCount32)\n\t\tif err != nil {\n\t\t\treturn BlobClientDownloadResponse{}, err\n\t\t}\n\t\tresult.BlobCommittedBlockCount = &blobCommittedBlockCount\n\t}\n\tif val := resp.Header.Get(\"x-ms-blob-content-md5\"); val != \"\" {\n\t\tblobContentMD5, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientDownloadResponse{}, err\n\t\t}\n\t\tresult.BlobContentMD5 = blobContentMD5\n\t}\n\tif val := resp.Header.Get(\"x-ms-blob-sequence-number\"); val != \"\" {\n\t\tblobSequenceNumber, err := strconv.ParseInt(val, 10, 64)\n\t\tif err != nil {\n\t\t\treturn BlobClientDownloadResponse{}, err\n\t\t}\n\t\tresult.BlobSequenceNumber = &blobSequenceNumber\n\t}\n\tif val := resp.Header.Get(\"x-ms-blob-type\"); val != \"\" {\n\t\tresult.BlobType = (*BlobType)(&val)\n\t}\n\tif val := resp.Header.Get(\"Cache-Control\"); val != \"\" {\n\t\tresult.CacheControl = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-content-crc64\"); val != \"\" {\n\t\tcontentCRC64, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientDownloadResponse{}, err\n\t\t}\n\t\tresult.ContentCRC64 = contentCRC64\n\t}\n\tif val := resp.Header.Get(\"Content-Disposition\"); val != \"\" {\n\t\tresult.ContentDisposition = &val\n\t}\n\tif val := resp.Header.Get(\"Content-Encoding\"); val != \"\" {\n\t\tresult.ContentEncoding = &val\n\t}\n\tif val := resp.Header.Get(\"Content-Language\"); val != \"\" {\n\t\tresult.ContentLanguage = &val\n\t}\n\tif val := resp.Header.Get(\"Content-Length\"); val != \"\" {\n\t\tcontentLength, err := strconv.ParseInt(val, 10, 64)\n\t\tif err != nil {\n\t\t\treturn BlobClientDownloadResponse{}, err\n\t\t}\n\t\tresult.ContentLength = &contentLength\n\t}\n\tif val := resp.Header.Get(\"Content-MD5\"); val != \"\" {\n\t\tcontentMD5, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientDownloadResponse{}, err\n\t\t}\n\t\tresult.ContentMD5 = contentMD5\n\t}\n\tif val := resp.Header.Get(\"Content-Range\"); val != \"\" {\n\t\tresult.ContentRange = &val\n\t}\n\tif val := resp.Header.Get(\"Content-Type\"); val != \"\" {\n\t\tresult.ContentType = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-completion-time\"); val != \"\" {\n\t\tcopyCompletionTime, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientDownloadResponse{}, err\n\t\t}\n\t\tresult.CopyCompletionTime = &copyCompletionTime\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-id\"); val != \"\" {\n\t\tresult.CopyID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-progress\"); val != \"\" {\n\t\tresult.CopyProgress = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-source\"); val != \"\" {\n\t\tresult.CopySource = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-status\"); val != \"\" {\n\t\tresult.CopyStatus = (*CopyStatusType)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-status-description\"); val != \"\" {\n\t\tresult.CopyStatusDescription = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-creation-time\"); val != \"\" {\n\t\tcreationTime, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientDownloadResponse{}, err\n\t\t}\n\t\tresult.CreationTime = &creationTime\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientDownloadResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-key-sha256\"); val != \"\" {\n\t\tresult.EncryptionKeySHA256 = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-scope\"); val != \"\" {\n\t\tresult.EncryptionScope = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-error-code\"); val != \"\" {\n\t\tresult.ErrorCode = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-immutability-policy-until-date\"); val != \"\" {\n\t\timmutabilityPolicyExpiresOn, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientDownloadResponse{}, err\n\t\t}\n\t\tresult.ImmutabilityPolicyExpiresOn = &immutabilityPolicyExpiresOn\n\t}\n\tif val := resp.Header.Get(\"x-ms-immutability-policy-mode\"); val != \"\" {\n\t\tresult.ImmutabilityPolicyMode = (*ImmutabilityPolicyMode)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-is-current-version\"); val != \"\" {\n\t\tisCurrentVersion, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientDownloadResponse{}, err\n\t\t}\n\t\tresult.IsCurrentVersion = &isCurrentVersion\n\t}\n\tif val := resp.Header.Get(\"x-ms-blob-sealed\"); val != \"\" {\n\t\tisSealed, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientDownloadResponse{}, err\n\t\t}\n\t\tresult.IsSealed = &isSealed\n\t}\n\tif val := resp.Header.Get(\"x-ms-server-encrypted\"); val != \"\" {\n\t\tisServerEncrypted, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientDownloadResponse{}, err\n\t\t}\n\t\tresult.IsServerEncrypted = &isServerEncrypted\n\t}\n\tif val := resp.Header.Get(\"x-ms-last-access-time\"); val != \"\" {\n\t\tlastAccessed, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientDownloadResponse{}, err\n\t\t}\n\t\tresult.LastAccessed = &lastAccessed\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientDownloadResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-duration\"); val != \"\" {\n\t\tresult.LeaseDuration = (*LeaseDurationType)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-state\"); val != \"\" {\n\t\tresult.LeaseState = (*LeaseStateType)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-status\"); val != \"\" {\n\t\tresult.LeaseStatus = (*LeaseStatusType)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-legal-hold\"); val != \"\" {\n\t\tlegalHold, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientDownloadResponse{}, err\n\t\t}\n\t\tresult.LegalHold = &legalHold\n\t}\n\tfor hh := range resp.Header {\n\t\tif len(hh) > len(\"x-ms-meta-\") && strings.EqualFold(hh[:len(\"x-ms-meta-\")], \"x-ms-meta-\") {\n\t\t\tif result.Metadata == nil {\n\t\t\t\tresult.Metadata = map[string]*string{}\n\t\t\t}\n\t\t\tresult.Metadata[hh[len(\"x-ms-meta-\"):]] = to.Ptr(resp.Header.Get(hh))\n\t\t}\n\t}\n\tif val := resp.Header.Get(\"x-ms-or-policy-id\"); val != \"\" {\n\t\tresult.ObjectReplicationPolicyID = &val\n\t}\n\tfor hh := range resp.Header {\n\t\tif len(hh) > len(\"x-ms-or-\") && strings.EqualFold(hh[:len(\"x-ms-or-\")], \"x-ms-or-\") {\n\t\t\tif result.ObjectReplicationRules == nil {\n\t\t\t\tresult.ObjectReplicationRules = map[string]*string{}\n\t\t\t}\n\t\t\tresult.ObjectReplicationRules[hh[len(\"x-ms-or-\"):]] = to.Ptr(resp.Header.Get(hh))\n\t\t}\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-structured-body\"); val != \"\" {\n\t\tresult.StructuredBodyType = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-structured-content-length\"); val != \"\" {\n\t\tstructuredContentLength, err := strconv.ParseInt(val, 10, 64)\n\t\tif err != nil {\n\t\t\treturn BlobClientDownloadResponse{}, err\n\t\t}\n\t\tresult.StructuredContentLength = &structuredContentLength\n\t}\n\tif val := resp.Header.Get(\"x-ms-tag-count\"); val != \"\" {\n\t\ttagCount, err := strconv.ParseInt(val, 10, 64)\n\t\tif err != nil {\n\t\t\treturn BlobClientDownloadResponse{}, err\n\t\t}\n\t\tresult.TagCount = &tagCount\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version-id\"); val != \"\" {\n\t\tresult.VersionID = &val\n\t}\n\treturn result, nil\n}\n\n// GetAccountInfo - Returns the sku name and account kind\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - BlobClientGetAccountInfoOptions contains the optional parameters for the BlobClient.GetAccountInfo method.\nfunc (client *BlobClient) GetAccountInfo(ctx context.Context, options *BlobClientGetAccountInfoOptions) (BlobClientGetAccountInfoResponse, error) {\n\tvar err error\n\treq, err := client.getAccountInfoCreateRequest(ctx, options)\n\tif err != nil {\n\t\treturn BlobClientGetAccountInfoResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientGetAccountInfoResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientGetAccountInfoResponse{}, err\n\t}\n\tresp, err := client.getAccountInfoHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// getAccountInfoCreateRequest creates the GetAccountInfo request.\nfunc (client *BlobClient) getAccountInfoCreateRequest(ctx context.Context, options *BlobClientGetAccountInfoOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"properties\")\n\treqQP.Set(\"restype\", \"account\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// getAccountInfoHandleResponse handles the GetAccountInfo response.\nfunc (client *BlobClient) getAccountInfoHandleResponse(resp *http.Response) (BlobClientGetAccountInfoResponse, error) {\n\tresult := BlobClientGetAccountInfoResponse{}\n\tif val := resp.Header.Get(\"x-ms-account-kind\"); val != \"\" {\n\t\tresult.AccountKind = (*AccountKind)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetAccountInfoResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-is-hns-enabled\"); val != \"\" {\n\t\tisHierarchicalNamespaceEnabled, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetAccountInfoResponse{}, err\n\t\t}\n\t\tresult.IsHierarchicalNamespaceEnabled = &isHierarchicalNamespaceEnabled\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-sku-name\"); val != \"\" {\n\t\tresult.SKUName = (*SKUName)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// GetProperties - The Get Properties operation returns all user-defined metadata, standard HTTP properties, and system properties\n// for the blob. It does not return the content of the blob.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - BlobClientGetPropertiesOptions contains the optional parameters for the BlobClient.GetProperties method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *BlobClient) GetProperties(ctx context.Context, options *BlobClientGetPropertiesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientGetPropertiesResponse, error) {\n\tvar err error\n\treq, err := client.getPropertiesCreateRequest(ctx, options, leaseAccessConditions, cpkInfo, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn BlobClientGetPropertiesResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientGetPropertiesResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientGetPropertiesResponse{}, err\n\t}\n\tresp, err := client.getPropertiesHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// getPropertiesCreateRequest creates the GetProperties request.\nfunc (client *BlobClient) getPropertiesCreateRequest(ctx context.Context, options *BlobClientGetPropertiesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodHead, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\tif options != nil && options.Snapshot != nil {\n\t\treqQP.Set(\"snapshot\", *options.Snapshot)\n\t}\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\tif options != nil && options.VersionID != nil {\n\t\treqQP.Set(\"versionid\", *options.VersionID)\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-algorithm\"] = []string{string(*cpkInfo.EncryptionAlgorithm)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKey != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key\"] = []string{*cpkInfo.EncryptionKey}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key-sha256\"] = []string{*cpkInfo.EncryptionKeySHA256}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// getPropertiesHandleResponse handles the GetProperties response.\nfunc (client *BlobClient) getPropertiesHandleResponse(resp *http.Response) (BlobClientGetPropertiesResponse, error) {\n\tresult := BlobClientGetPropertiesResponse{}\n\tif val := resp.Header.Get(\"Accept-Ranges\"); val != \"\" {\n\t\tresult.AcceptRanges = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-access-tier\"); val != \"\" {\n\t\tresult.AccessTier = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-access-tier-change-time\"); val != \"\" {\n\t\taccessTierChangeTime, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.AccessTierChangeTime = &accessTierChangeTime\n\t}\n\tif val := resp.Header.Get(\"x-ms-access-tier-inferred\"); val != \"\" {\n\t\taccessTierInferred, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.AccessTierInferred = &accessTierInferred\n\t}\n\tif val := resp.Header.Get(\"x-ms-archive-status\"); val != \"\" {\n\t\tresult.ArchiveStatus = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-blob-committed-block-count\"); val != \"\" {\n\t\tblobCommittedBlockCount32, err := strconv.ParseInt(val, 10, 32)\n\t\tblobCommittedBlockCount := int32(blobCommittedBlockCount32)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.BlobCommittedBlockCount = &blobCommittedBlockCount\n\t}\n\tif val := resp.Header.Get(\"x-ms-blob-sequence-number\"); val != \"\" {\n\t\tblobSequenceNumber, err := strconv.ParseInt(val, 10, 64)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.BlobSequenceNumber = &blobSequenceNumber\n\t}\n\tif val := resp.Header.Get(\"x-ms-blob-type\"); val != \"\" {\n\t\tresult.BlobType = (*BlobType)(&val)\n\t}\n\tif val := resp.Header.Get(\"Cache-Control\"); val != \"\" {\n\t\tresult.CacheControl = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Content-Disposition\"); val != \"\" {\n\t\tresult.ContentDisposition = &val\n\t}\n\tif val := resp.Header.Get(\"Content-Encoding\"); val != \"\" {\n\t\tresult.ContentEncoding = &val\n\t}\n\tif val := resp.Header.Get(\"Content-Language\"); val != \"\" {\n\t\tresult.ContentLanguage = &val\n\t}\n\tif val := resp.Header.Get(\"Content-Length\"); val != \"\" {\n\t\tcontentLength, err := strconv.ParseInt(val, 10, 64)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.ContentLength = &contentLength\n\t}\n\tif val := resp.Header.Get(\"Content-MD5\"); val != \"\" {\n\t\tcontentMD5, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.ContentMD5 = contentMD5\n\t}\n\tif val := resp.Header.Get(\"Content-Type\"); val != \"\" {\n\t\tresult.ContentType = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-completion-time\"); val != \"\" {\n\t\tcopyCompletionTime, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.CopyCompletionTime = &copyCompletionTime\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-id\"); val != \"\" {\n\t\tresult.CopyID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-progress\"); val != \"\" {\n\t\tresult.CopyProgress = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-source\"); val != \"\" {\n\t\tresult.CopySource = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-status\"); val != \"\" {\n\t\tresult.CopyStatus = (*CopyStatusType)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-status-description\"); val != \"\" {\n\t\tresult.CopyStatusDescription = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-creation-time\"); val != \"\" {\n\t\tcreationTime, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.CreationTime = &creationTime\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-destination-snapshot\"); val != \"\" {\n\t\tresult.DestinationSnapshot = &val\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-key-sha256\"); val != \"\" {\n\t\tresult.EncryptionKeySHA256 = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-scope\"); val != \"\" {\n\t\tresult.EncryptionScope = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-expiry-time\"); val != \"\" {\n\t\texpiresOn, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.ExpiresOn = &expiresOn\n\t}\n\tif val := resp.Header.Get(\"x-ms-immutability-policy-until-date\"); val != \"\" {\n\t\timmutabilityPolicyExpiresOn, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.ImmutabilityPolicyExpiresOn = &immutabilityPolicyExpiresOn\n\t}\n\tif val := resp.Header.Get(\"x-ms-immutability-policy-mode\"); val != \"\" {\n\t\tresult.ImmutabilityPolicyMode = (*ImmutabilityPolicyMode)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-is-current-version\"); val != \"\" {\n\t\tisCurrentVersion, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.IsCurrentVersion = &isCurrentVersion\n\t}\n\tif val := resp.Header.Get(\"x-ms-incremental-copy\"); val != \"\" {\n\t\tisIncrementalCopy, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.IsIncrementalCopy = &isIncrementalCopy\n\t}\n\tif val := resp.Header.Get(\"x-ms-blob-sealed\"); val != \"\" {\n\t\tisSealed, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.IsSealed = &isSealed\n\t}\n\tif val := resp.Header.Get(\"x-ms-server-encrypted\"); val != \"\" {\n\t\tisServerEncrypted, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.IsServerEncrypted = &isServerEncrypted\n\t}\n\tif val := resp.Header.Get(\"x-ms-last-access-time\"); val != \"\" {\n\t\tlastAccessed, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.LastAccessed = &lastAccessed\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-duration\"); val != \"\" {\n\t\tresult.LeaseDuration = (*LeaseDurationType)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-state\"); val != \"\" {\n\t\tresult.LeaseState = (*LeaseStateType)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-status\"); val != \"\" {\n\t\tresult.LeaseStatus = (*LeaseStatusType)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-legal-hold\"); val != \"\" {\n\t\tlegalHold, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.LegalHold = &legalHold\n\t}\n\tfor hh := range resp.Header {\n\t\tif len(hh) > len(\"x-ms-meta-\") && strings.EqualFold(hh[:len(\"x-ms-meta-\")], \"x-ms-meta-\") {\n\t\t\tif result.Metadata == nil {\n\t\t\t\tresult.Metadata = map[string]*string{}\n\t\t\t}\n\t\t\tresult.Metadata[hh[len(\"x-ms-meta-\"):]] = to.Ptr(resp.Header.Get(hh))\n\t\t}\n\t}\n\tif val := resp.Header.Get(\"x-ms-or-policy-id\"); val != \"\" {\n\t\tresult.ObjectReplicationPolicyID = &val\n\t}\n\tfor hh := range resp.Header {\n\t\tif len(hh) > len(\"x-ms-or-\") && strings.EqualFold(hh[:len(\"x-ms-or-\")], \"x-ms-or-\") {\n\t\t\tif result.ObjectReplicationRules == nil {\n\t\t\t\tresult.ObjectReplicationRules = map[string]*string{}\n\t\t\t}\n\t\t\tresult.ObjectReplicationRules[hh[len(\"x-ms-or-\"):]] = to.Ptr(resp.Header.Get(hh))\n\t\t}\n\t}\n\tif val := resp.Header.Get(\"x-ms-rehydrate-priority\"); val != \"\" {\n\t\tresult.RehydratePriority = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-tag-count\"); val != \"\" {\n\t\ttagCount, err := strconv.ParseInt(val, 10, 64)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.TagCount = &tagCount\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version-id\"); val != \"\" {\n\t\tresult.VersionID = &val\n\t}\n\treturn result, nil\n}\n\n// GetTags - The Get Tags operation enables users to get the tags associated with a blob.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - BlobClientGetTagsOptions contains the optional parameters for the BlobClient.GetTags method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\nfunc (client *BlobClient) GetTags(ctx context.Context, options *BlobClientGetTagsOptions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (BlobClientGetTagsResponse, error) {\n\tvar err error\n\treq, err := client.getTagsCreateRequest(ctx, options, modifiedAccessConditions, leaseAccessConditions)\n\tif err != nil {\n\t\treturn BlobClientGetTagsResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientGetTagsResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientGetTagsResponse{}, err\n\t}\n\tresp, err := client.getTagsHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// getTagsCreateRequest creates the GetTags request.\nfunc (client *BlobClient) getTagsCreateRequest(ctx context.Context, options *BlobClientGetTagsOptions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"tags\")\n\tif options != nil && options.Snapshot != nil {\n\t\treqQP.Set(\"snapshot\", *options.Snapshot)\n\t}\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\tif options != nil && options.VersionID != nil {\n\t\treqQP.Set(\"versionid\", *options.VersionID)\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// getTagsHandleResponse handles the GetTags response.\nfunc (client *BlobClient) getTagsHandleResponse(resp *http.Response) (BlobClientGetTagsResponse, error) {\n\tresult := BlobClientGetTagsResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientGetTagsResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif err := runtime.UnmarshalAsXML(resp, &result.BlobTags); err != nil {\n\t\treturn BlobClientGetTagsResponse{}, err\n\t}\n\treturn result, nil\n}\n\n// Query - The Query operation enables users to select/project on blob data by providing simple query expressions.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - BlobClientQueryOptions contains the optional parameters for the BlobClient.Query method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *BlobClient) Query(ctx context.Context, options *BlobClientQueryOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientQueryResponse, error) {\n\tvar err error\n\treq, err := client.queryCreateRequest(ctx, options, leaseAccessConditions, cpkInfo, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn BlobClientQueryResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientQueryResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK, http.StatusPartialContent) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientQueryResponse{}, err\n\t}\n\tresp, err := client.queryHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// queryCreateRequest creates the Query request.\nfunc (client *BlobClient) queryCreateRequest(ctx context.Context, options *BlobClientQueryOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPost, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"query\")\n\tif options != nil && options.Snapshot != nil {\n\t\treqQP.Set(\"snapshot\", *options.Snapshot)\n\t}\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\truntime.SkipBodyDownload(req)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-algorithm\"] = []string{string(*cpkInfo.EncryptionAlgorithm)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKey != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key\"] = []string{*cpkInfo.EncryptionKey}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key-sha256\"] = []string{*cpkInfo.EncryptionKeySHA256}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\tif options != nil && options.QueryRequest != nil {\n\t\tif err := runtime.MarshalAsXML(req, *options.QueryRequest); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn req, nil\n\t}\n\treturn req, nil\n}\n\n// queryHandleResponse handles the Query response.\nfunc (client *BlobClient) queryHandleResponse(resp *http.Response) (BlobClientQueryResponse, error) {\n\tresult := BlobClientQueryResponse{Body: resp.Body}\n\tif val := resp.Header.Get(\"Accept-Ranges\"); val != \"\" {\n\t\tresult.AcceptRanges = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-blob-committed-block-count\"); val != \"\" {\n\t\tblobCommittedBlockCount32, err := strconv.ParseInt(val, 10, 32)\n\t\tblobCommittedBlockCount := int32(blobCommittedBlockCount32)\n\t\tif err != nil {\n\t\t\treturn BlobClientQueryResponse{}, err\n\t\t}\n\t\tresult.BlobCommittedBlockCount = &blobCommittedBlockCount\n\t}\n\tif val := resp.Header.Get(\"x-ms-blob-content-md5\"); val != \"\" {\n\t\tblobContentMD5, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientQueryResponse{}, err\n\t\t}\n\t\tresult.BlobContentMD5 = blobContentMD5\n\t}\n\tif val := resp.Header.Get(\"x-ms-blob-sequence-number\"); val != \"\" {\n\t\tblobSequenceNumber, err := strconv.ParseInt(val, 10, 64)\n\t\tif err != nil {\n\t\t\treturn BlobClientQueryResponse{}, err\n\t\t}\n\t\tresult.BlobSequenceNumber = &blobSequenceNumber\n\t}\n\tif val := resp.Header.Get(\"x-ms-blob-type\"); val != \"\" {\n\t\tresult.BlobType = (*BlobType)(&val)\n\t}\n\tif val := resp.Header.Get(\"Cache-Control\"); val != \"\" {\n\t\tresult.CacheControl = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-content-crc64\"); val != \"\" {\n\t\tcontentCRC64, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientQueryResponse{}, err\n\t\t}\n\t\tresult.ContentCRC64 = contentCRC64\n\t}\n\tif val := resp.Header.Get(\"Content-Disposition\"); val != \"\" {\n\t\tresult.ContentDisposition = &val\n\t}\n\tif val := resp.Header.Get(\"Content-Encoding\"); val != \"\" {\n\t\tresult.ContentEncoding = &val\n\t}\n\tif val := resp.Header.Get(\"Content-Language\"); val != \"\" {\n\t\tresult.ContentLanguage = &val\n\t}\n\tif val := resp.Header.Get(\"Content-Length\"); val != \"\" {\n\t\tcontentLength, err := strconv.ParseInt(val, 10, 64)\n\t\tif err != nil {\n\t\t\treturn BlobClientQueryResponse{}, err\n\t\t}\n\t\tresult.ContentLength = &contentLength\n\t}\n\tif val := resp.Header.Get(\"Content-MD5\"); val != \"\" {\n\t\tcontentMD5, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientQueryResponse{}, err\n\t\t}\n\t\tresult.ContentMD5 = contentMD5\n\t}\n\tif val := resp.Header.Get(\"Content-Range\"); val != \"\" {\n\t\tresult.ContentRange = &val\n\t}\n\tif val := resp.Header.Get(\"Content-Type\"); val != \"\" {\n\t\tresult.ContentType = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-completion-time\"); val != \"\" {\n\t\tcopyCompletionTime, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientQueryResponse{}, err\n\t\t}\n\t\tresult.CopyCompletionTime = &copyCompletionTime\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-id\"); val != \"\" {\n\t\tresult.CopyID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-progress\"); val != \"\" {\n\t\tresult.CopyProgress = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-source\"); val != \"\" {\n\t\tresult.CopySource = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-status\"); val != \"\" {\n\t\tresult.CopyStatus = (*CopyStatusType)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-status-description\"); val != \"\" {\n\t\tresult.CopyStatusDescription = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientQueryResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-key-sha256\"); val != \"\" {\n\t\tresult.EncryptionKeySHA256 = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-scope\"); val != \"\" {\n\t\tresult.EncryptionScope = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-server-encrypted\"); val != \"\" {\n\t\tisServerEncrypted, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientQueryResponse{}, err\n\t\t}\n\t\tresult.IsServerEncrypted = &isServerEncrypted\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientQueryResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-duration\"); val != \"\" {\n\t\tresult.LeaseDuration = (*LeaseDurationType)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-state\"); val != \"\" {\n\t\tresult.LeaseState = (*LeaseStateType)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-status\"); val != \"\" {\n\t\tresult.LeaseStatus = (*LeaseStatusType)(&val)\n\t}\n\tfor hh := range resp.Header {\n\t\tif len(hh) > len(\"x-ms-meta-\") && strings.EqualFold(hh[:len(\"x-ms-meta-\")], \"x-ms-meta-\") {\n\t\t\tif result.Metadata == nil {\n\t\t\t\tresult.Metadata = map[string]*string{}\n\t\t\t}\n\t\t\tresult.Metadata[hh[len(\"x-ms-meta-\"):]] = to.Ptr(resp.Header.Get(hh))\n\t\t}\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// ReleaseLease - [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - leaseID - Specifies the current lease ID on the resource.\n//   - options - BlobClientReleaseLeaseOptions contains the optional parameters for the BlobClient.ReleaseLease method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *BlobClient) ReleaseLease(ctx context.Context, leaseID string, options *BlobClientReleaseLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientReleaseLeaseResponse, error) {\n\tvar err error\n\treq, err := client.releaseLeaseCreateRequest(ctx, leaseID, options, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn BlobClientReleaseLeaseResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientReleaseLeaseResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientReleaseLeaseResponse{}, err\n\t}\n\tresp, err := client.releaseLeaseHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// releaseLeaseCreateRequest creates the ReleaseLease request.\nfunc (client *BlobClient) releaseLeaseCreateRequest(ctx context.Context, leaseID string, options *BlobClientReleaseLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"lease\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\treq.Raw().Header[\"x-ms-lease-action\"] = []string{\"release\"}\n\treq.Raw().Header[\"x-ms-lease-id\"] = []string{leaseID}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// releaseLeaseHandleResponse handles the ReleaseLease response.\nfunc (client *BlobClient) releaseLeaseHandleResponse(resp *http.Response) (BlobClientReleaseLeaseResponse, error) {\n\tresult := BlobClientReleaseLeaseResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientReleaseLeaseResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientReleaseLeaseResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// RenewLease - [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - leaseID - Specifies the current lease ID on the resource.\n//   - options - BlobClientRenewLeaseOptions contains the optional parameters for the BlobClient.RenewLease method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *BlobClient) RenewLease(ctx context.Context, leaseID string, options *BlobClientRenewLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientRenewLeaseResponse, error) {\n\tvar err error\n\treq, err := client.renewLeaseCreateRequest(ctx, leaseID, options, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn BlobClientRenewLeaseResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientRenewLeaseResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientRenewLeaseResponse{}, err\n\t}\n\tresp, err := client.renewLeaseHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// renewLeaseCreateRequest creates the RenewLease request.\nfunc (client *BlobClient) renewLeaseCreateRequest(ctx context.Context, leaseID string, options *BlobClientRenewLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"lease\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\treq.Raw().Header[\"x-ms-lease-action\"] = []string{\"renew\"}\n\treq.Raw().Header[\"x-ms-lease-id\"] = []string{leaseID}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// renewLeaseHandleResponse handles the RenewLease response.\nfunc (client *BlobClient) renewLeaseHandleResponse(resp *http.Response) (BlobClientRenewLeaseResponse, error) {\n\tresult := BlobClientRenewLeaseResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientRenewLeaseResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientRenewLeaseResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-id\"); val != \"\" {\n\t\tresult.LeaseID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// SetExpiry - Sets the time a blob will expire and be deleted.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - expiryOptions - Required. Indicates mode of the expiry time\n//   - options - BlobClientSetExpiryOptions contains the optional parameters for the BlobClient.SetExpiry method.\nfunc (client *BlobClient) SetExpiry(ctx context.Context, expiryOptions ExpiryOptions, options *BlobClientSetExpiryOptions) (BlobClientSetExpiryResponse, error) {\n\tvar err error\n\treq, err := client.setExpiryCreateRequest(ctx, expiryOptions, options)\n\tif err != nil {\n\t\treturn BlobClientSetExpiryResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientSetExpiryResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientSetExpiryResponse{}, err\n\t}\n\tresp, err := client.setExpiryHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// setExpiryCreateRequest creates the SetExpiry request.\nfunc (client *BlobClient) setExpiryCreateRequest(ctx context.Context, expiryOptions ExpiryOptions, options *BlobClientSetExpiryOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"expiry\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-expiry-option\"] = []string{string(expiryOptions)}\n\tif options != nil && options.ExpiresOn != nil {\n\t\treq.Raw().Header[\"x-ms-expiry-time\"] = []string{*options.ExpiresOn}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// setExpiryHandleResponse handles the SetExpiry response.\nfunc (client *BlobClient) setExpiryHandleResponse(resp *http.Response) (BlobClientSetExpiryResponse, error) {\n\tresult := BlobClientSetExpiryResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientSetExpiryResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientSetExpiryResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// SetHTTPHeaders - The Set HTTP Headers operation sets system properties on the blob\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - BlobClientSetHTTPHeadersOptions contains the optional parameters for the BlobClient.SetHTTPHeaders method.\n//   - BlobHTTPHeaders - BlobHTTPHeaders contains a group of parameters for the BlobClient.SetHTTPHeaders method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *BlobClient) SetHTTPHeaders(ctx context.Context, options *BlobClientSetHTTPHeadersOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientSetHTTPHeadersResponse, error) {\n\tvar err error\n\treq, err := client.setHTTPHeadersCreateRequest(ctx, options, blobHTTPHeaders, leaseAccessConditions, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn BlobClientSetHTTPHeadersResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientSetHTTPHeadersResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientSetHTTPHeadersResponse{}, err\n\t}\n\tresp, err := client.setHTTPHeadersHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// setHTTPHeadersCreateRequest creates the SetHTTPHeaders request.\nfunc (client *BlobClient) setHTTPHeadersCreateRequest(ctx context.Context, options *BlobClientSetHTTPHeadersOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"properties\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobCacheControl != nil {\n\t\treq.Raw().Header[\"x-ms-blob-cache-control\"] = []string{*blobHTTPHeaders.BlobCacheControl}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentDisposition != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-disposition\"] = []string{*blobHTTPHeaders.BlobContentDisposition}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentEncoding != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-encoding\"] = []string{*blobHTTPHeaders.BlobContentEncoding}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentLanguage != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-language\"] = []string{*blobHTTPHeaders.BlobContentLanguage}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentMD5 != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-md5\"] = []string{base64.StdEncoding.EncodeToString(blobHTTPHeaders.BlobContentMD5)}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentType != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-type\"] = []string{*blobHTTPHeaders.BlobContentType}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// setHTTPHeadersHandleResponse handles the SetHTTPHeaders response.\nfunc (client *BlobClient) setHTTPHeadersHandleResponse(resp *http.Response) (BlobClientSetHTTPHeadersResponse, error) {\n\tresult := BlobClientSetHTTPHeadersResponse{}\n\tif val := resp.Header.Get(\"x-ms-blob-sequence-number\"); val != \"\" {\n\t\tblobSequenceNumber, err := strconv.ParseInt(val, 10, 64)\n\t\tif err != nil {\n\t\t\treturn BlobClientSetHTTPHeadersResponse{}, err\n\t\t}\n\t\tresult.BlobSequenceNumber = &blobSequenceNumber\n\t}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientSetHTTPHeadersResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientSetHTTPHeadersResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// SetImmutabilityPolicy - The Set Immutability Policy operation sets the immutability policy on the blob\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - BlobClientSetImmutabilityPolicyOptions contains the optional parameters for the BlobClient.SetImmutabilityPolicy\n//     method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *BlobClient) SetImmutabilityPolicy(ctx context.Context, options *BlobClientSetImmutabilityPolicyOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientSetImmutabilityPolicyResponse, error) {\n\tvar err error\n\treq, err := client.setImmutabilityPolicyCreateRequest(ctx, options, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn BlobClientSetImmutabilityPolicyResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientSetImmutabilityPolicyResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientSetImmutabilityPolicyResponse{}, err\n\t}\n\tresp, err := client.setImmutabilityPolicyHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// setImmutabilityPolicyCreateRequest creates the SetImmutabilityPolicy request.\nfunc (client *BlobClient) setImmutabilityPolicyCreateRequest(ctx context.Context, options *BlobClientSetImmutabilityPolicyOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"immutabilityPolicies\")\n\tif options != nil && options.Snapshot != nil {\n\t\treqQP.Set(\"snapshot\", *options.Snapshot)\n\t}\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\tif options != nil && options.VersionID != nil {\n\t\treqQP.Set(\"versionid\", *options.VersionID)\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif options != nil && options.ImmutabilityPolicyMode != nil {\n\t\treq.Raw().Header[\"x-ms-immutability-policy-mode\"] = []string{string(*options.ImmutabilityPolicyMode)}\n\t}\n\tif options != nil && options.ImmutabilityPolicyExpiry != nil {\n\t\treq.Raw().Header[\"x-ms-immutability-policy-until-date\"] = []string{(*options.ImmutabilityPolicyExpiry).In(gmt).Format(time.RFC1123)}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// setImmutabilityPolicyHandleResponse handles the SetImmutabilityPolicy response.\nfunc (client *BlobClient) setImmutabilityPolicyHandleResponse(resp *http.Response) (BlobClientSetImmutabilityPolicyResponse, error) {\n\tresult := BlobClientSetImmutabilityPolicyResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientSetImmutabilityPolicyResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-immutability-policy-until-date\"); val != \"\" {\n\t\timmutabilityPolicyExpiry, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientSetImmutabilityPolicyResponse{}, err\n\t\t}\n\t\tresult.ImmutabilityPolicyExpiry = &immutabilityPolicyExpiry\n\t}\n\tif val := resp.Header.Get(\"x-ms-immutability-policy-mode\"); val != \"\" {\n\t\tresult.ImmutabilityPolicyMode = (*ImmutabilityPolicyMode)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// SetLegalHold - The Set Legal Hold operation sets a legal hold on the blob.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - legalHold - Specified if a legal hold should be set on the blob.\n//   - options - BlobClientSetLegalHoldOptions contains the optional parameters for the BlobClient.SetLegalHold method.\nfunc (client *BlobClient) SetLegalHold(ctx context.Context, legalHold bool, options *BlobClientSetLegalHoldOptions) (BlobClientSetLegalHoldResponse, error) {\n\tvar err error\n\treq, err := client.setLegalHoldCreateRequest(ctx, legalHold, options)\n\tif err != nil {\n\t\treturn BlobClientSetLegalHoldResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientSetLegalHoldResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientSetLegalHoldResponse{}, err\n\t}\n\tresp, err := client.setLegalHoldHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// setLegalHoldCreateRequest creates the SetLegalHold request.\nfunc (client *BlobClient) setLegalHoldCreateRequest(ctx context.Context, legalHold bool, options *BlobClientSetLegalHoldOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"legalhold\")\n\tif options != nil && options.Snapshot != nil {\n\t\treqQP.Set(\"snapshot\", *options.Snapshot)\n\t}\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\tif options != nil && options.VersionID != nil {\n\t\treqQP.Set(\"versionid\", *options.VersionID)\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-legal-hold\"] = []string{strconv.FormatBool(legalHold)}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// setLegalHoldHandleResponse handles the SetLegalHold response.\nfunc (client *BlobClient) setLegalHoldHandleResponse(resp *http.Response) (BlobClientSetLegalHoldResponse, error) {\n\tresult := BlobClientSetLegalHoldResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientSetLegalHoldResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-legal-hold\"); val != \"\" {\n\t\tlegalHold, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientSetLegalHoldResponse{}, err\n\t\t}\n\t\tresult.LegalHold = &legalHold\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// SetMetadata - The Set Blob Metadata operation sets user-defined metadata for the specified blob as one or more name-value\n// pairs\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - BlobClientSetMetadataOptions contains the optional parameters for the BlobClient.SetMetadata method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method.\n//   - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *BlobClient) SetMetadata(ctx context.Context, options *BlobClientSetMetadataOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientSetMetadataResponse, error) {\n\tvar err error\n\treq, err := client.setMetadataCreateRequest(ctx, options, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn BlobClientSetMetadataResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientSetMetadataResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientSetMetadataResponse{}, err\n\t}\n\tresp, err := client.setMetadataHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// setMetadataCreateRequest creates the SetMetadata request.\nfunc (client *BlobClient) setMetadataCreateRequest(ctx context.Context, options *BlobClientSetMetadataOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"metadata\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-algorithm\"] = []string{string(*cpkInfo.EncryptionAlgorithm)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKey != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key\"] = []string{*cpkInfo.EncryptionKey}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key-sha256\"] = []string{*cpkInfo.EncryptionKeySHA256}\n\t}\n\tif cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-scope\"] = []string{*cpkScopeInfo.EncryptionScope}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\tif options != nil && options.Metadata != nil {\n\t\tfor k, v := range options.Metadata {\n\t\t\tif v != nil {\n\t\t\t\treq.Raw().Header[\"x-ms-meta-\"+k] = []string{*v}\n\t\t\t}\n\t\t}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// setMetadataHandleResponse handles the SetMetadata response.\nfunc (client *BlobClient) setMetadataHandleResponse(resp *http.Response) (BlobClientSetMetadataResponse, error) {\n\tresult := BlobClientSetMetadataResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientSetMetadataResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-key-sha256\"); val != \"\" {\n\t\tresult.EncryptionKeySHA256 = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-scope\"); val != \"\" {\n\t\tresult.EncryptionScope = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-server-encrypted\"); val != \"\" {\n\t\tisServerEncrypted, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlobClientSetMetadataResponse{}, err\n\t\t}\n\t\tresult.IsServerEncrypted = &isServerEncrypted\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientSetMetadataResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version-id\"); val != \"\" {\n\t\tresult.VersionID = &val\n\t}\n\treturn result, nil\n}\n\n// SetTags - The Set Tags operation enables users to set tags on a blob.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - tags - Blob tags\n//   - options - BlobClientSetTagsOptions contains the optional parameters for the BlobClient.SetTags method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\nfunc (client *BlobClient) SetTags(ctx context.Context, tags BlobTags, options *BlobClientSetTagsOptions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (BlobClientSetTagsResponse, error) {\n\tvar err error\n\treq, err := client.setTagsCreateRequest(ctx, tags, options, modifiedAccessConditions, leaseAccessConditions)\n\tif err != nil {\n\t\treturn BlobClientSetTagsResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientSetTagsResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusNoContent) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientSetTagsResponse{}, err\n\t}\n\tresp, err := client.setTagsHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// setTagsCreateRequest creates the SetTags request.\nfunc (client *BlobClient) setTagsCreateRequest(ctx context.Context, tags BlobTags, options *BlobClientSetTagsOptions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"tags\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\tif options != nil && options.VersionID != nil {\n\t\treqQP.Set(\"versionid\", *options.VersionID)\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.TransactionalContentMD5 != nil {\n\t\treq.Raw().Header[\"Content-MD5\"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentMD5)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif options != nil && options.TransactionalContentCRC64 != nil {\n\t\treq.Raw().Header[\"x-ms-content-crc64\"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentCRC64)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\tif err := runtime.MarshalAsXML(req, tags); err != nil {\n\t\treturn nil, err\n\t}\n\treturn req, nil\n}\n\n// setTagsHandleResponse handles the SetTags response.\nfunc (client *BlobClient) setTagsHandleResponse(resp *http.Response) (BlobClientSetTagsResponse, error) {\n\tresult := BlobClientSetTagsResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientSetTagsResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// SetTier - The Set Tier operation sets the tier on a blob. The operation is allowed on a page blob in a premium storage\n// account and on a block blob in a blob storage account (locally redundant storage only). A\n// premium page blob's tier determines the allowed size, IOPS, and bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive\n// storage type. This operation does not update the blob's ETag.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - tier - Indicates the tier to be set on the blob.\n//   - options - BlobClientSetTierOptions contains the optional parameters for the BlobClient.SetTier method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *BlobClient) SetTier(ctx context.Context, tier AccessTier, options *BlobClientSetTierOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientSetTierResponse, error) {\n\tvar err error\n\treq, err := client.setTierCreateRequest(ctx, tier, options, leaseAccessConditions, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn BlobClientSetTierResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientSetTierResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK, http.StatusAccepted) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientSetTierResponse{}, err\n\t}\n\tresp, err := client.setTierHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// setTierCreateRequest creates the SetTier request.\nfunc (client *BlobClient) setTierCreateRequest(ctx context.Context, tier AccessTier, options *BlobClientSetTierOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"tier\")\n\tif options != nil && options.Snapshot != nil {\n\t\treqQP.Set(\"snapshot\", *options.Snapshot)\n\t}\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\tif options != nil && options.VersionID != nil {\n\t\treqQP.Set(\"versionid\", *options.VersionID)\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\treq.Raw().Header[\"x-ms-access-tier\"] = []string{string(tier)}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\tif options != nil && options.RehydratePriority != nil {\n\t\treq.Raw().Header[\"x-ms-rehydrate-priority\"] = []string{string(*options.RehydratePriority)}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// setTierHandleResponse handles the SetTier response.\nfunc (client *BlobClient) setTierHandleResponse(resp *http.Response) (BlobClientSetTierResponse, error) {\n\tresult := BlobClientSetTierResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// StartCopyFromURL - The Start Copy From URL operation copies a blob or an internet resource to a new blob.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - copySource - Specifies the name of the source page blob snapshot. This value is a URL of up to 2 KB in length that specifies\n//     a page blob snapshot. The value should be URL-encoded as it would appear in a request\n//     URI. The source blob must either be public or must be authenticated via a shared access signature.\n//   - options - BlobClientStartCopyFromURLOptions contains the optional parameters for the BlobClient.StartCopyFromURL method.\n//   - SourceModifiedAccessConditions - SourceModifiedAccessConditions contains a group of parameters for the BlobClient.StartCopyFromURL\n//     method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\nfunc (client *BlobClient) StartCopyFromURL(ctx context.Context, copySource string, options *BlobClientStartCopyFromURLOptions, sourceModifiedAccessConditions *SourceModifiedAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (BlobClientStartCopyFromURLResponse, error) {\n\tvar err error\n\treq, err := client.startCopyFromURLCreateRequest(ctx, copySource, options, sourceModifiedAccessConditions, modifiedAccessConditions, leaseAccessConditions)\n\tif err != nil {\n\t\treturn BlobClientStartCopyFromURLResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientStartCopyFromURLResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusAccepted) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientStartCopyFromURLResponse{}, err\n\t}\n\tresp, err := client.startCopyFromURLHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// startCopyFromURLCreateRequest creates the StartCopyFromURL request.\nfunc (client *BlobClient) startCopyFromURLCreateRequest(ctx context.Context, copySource string, options *BlobClientStartCopyFromURLOptions, sourceModifiedAccessConditions *SourceModifiedAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.Tier != nil {\n\t\treq.Raw().Header[\"x-ms-access-tier\"] = []string{string(*options.Tier)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-copy-source\"] = []string{copySource}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif options != nil && options.ImmutabilityPolicyMode != nil {\n\t\treq.Raw().Header[\"x-ms-immutability-policy-mode\"] = []string{string(*options.ImmutabilityPolicyMode)}\n\t}\n\tif options != nil && options.ImmutabilityPolicyExpiry != nil {\n\t\treq.Raw().Header[\"x-ms-immutability-policy-until-date\"] = []string{(*options.ImmutabilityPolicyExpiry).In(gmt).Format(time.RFC1123)}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\tif options != nil && options.LegalHold != nil {\n\t\treq.Raw().Header[\"x-ms-legal-hold\"] = []string{strconv.FormatBool(*options.LegalHold)}\n\t}\n\tif options != nil && options.Metadata != nil {\n\t\tfor k, v := range options.Metadata {\n\t\t\tif v != nil {\n\t\t\t\treq.Raw().Header[\"x-ms-meta-\"+k] = []string{*v}\n\t\t\t}\n\t\t}\n\t}\n\tif options != nil && options.RehydratePriority != nil {\n\t\treq.Raw().Header[\"x-ms-rehydrate-priority\"] = []string{string(*options.RehydratePriority)}\n\t}\n\tif options != nil && options.SealBlob != nil {\n\t\treq.Raw().Header[\"x-ms-seal-blob\"] = []string{strconv.FormatBool(*options.SealBlob)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfMatch != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-match\"] = []string{string(*sourceModifiedAccessConditions.SourceIfMatch)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfModifiedSince != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-modified-since\"] = []string{(*sourceModifiedAccessConditions.SourceIfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfNoneMatch != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-none-match\"] = []string{string(*sourceModifiedAccessConditions.SourceIfNoneMatch)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfTags != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-tags\"] = []string{*sourceModifiedAccessConditions.SourceIfTags}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-unmodified-since\"] = []string{(*sourceModifiedAccessConditions.SourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.BlobTagsString != nil {\n\t\treq.Raw().Header[\"x-ms-tags\"] = []string{*options.BlobTagsString}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// startCopyFromURLHandleResponse handles the StartCopyFromURL response.\nfunc (client *BlobClient) startCopyFromURLHandleResponse(resp *http.Response) (BlobClientStartCopyFromURLResponse, error) {\n\tresult := BlobClientStartCopyFromURLResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-id\"); val != \"\" {\n\t\tresult.CopyID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-status\"); val != \"\" {\n\t\tresult.CopyStatus = (*CopyStatusType)(&val)\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientStartCopyFromURLResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientStartCopyFromURLResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version-id\"); val != \"\" {\n\t\tresult.VersionID = &val\n\t}\n\treturn result, nil\n}\n\n// Undelete - Undelete a blob that was previously soft deleted\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - BlobClientUndeleteOptions contains the optional parameters for the BlobClient.Undelete method.\nfunc (client *BlobClient) Undelete(ctx context.Context, options *BlobClientUndeleteOptions) (BlobClientUndeleteResponse, error) {\n\tvar err error\n\treq, err := client.undeleteCreateRequest(ctx, options)\n\tif err != nil {\n\t\treturn BlobClientUndeleteResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlobClientUndeleteResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlobClientUndeleteResponse{}, err\n\t}\n\tresp, err := client.undeleteHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// undeleteCreateRequest creates the Undelete request.\nfunc (client *BlobClient) undeleteCreateRequest(ctx context.Context, options *BlobClientUndeleteOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"undelete\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// undeleteHandleResponse handles the Undelete response.\nfunc (client *BlobClient) undeleteHandleResponse(resp *http.Response) (BlobClientUndeleteResponse, error) {\n\tresult := BlobClientUndeleteResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlobClientUndeleteResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_blockblob_client.go",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n// Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\npackage generated\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"io\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"time\"\n)\n\n// BlockBlobClient contains the methods for the BlockBlob group.\n// Don't use this type directly, use a constructor function instead.\ntype BlockBlobClient struct {\n\tinternal *azcore.Client\n\tendpoint string\n}\n\n// CommitBlockList - The Commit Block List operation writes a blob by specifying the list of block IDs that make up the blob.\n// In order to be written as part of a blob, a block must have been successfully written to the\n// server in a prior Put Block operation. You can call Put Block List to update a blob by uploading only those blocks that\n// have changed, then committing the new and existing blocks together. You can do\n// this by specifying whether to commit a block from the committed block list or from the uncommitted block list, or to commit\n// the most recently uploaded version of the block, whichever list it may\n// belong to.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - blocks - Blob Blocks.\n//   - options - BlockBlobClientCommitBlockListOptions contains the optional parameters for the BlockBlobClient.CommitBlockList\n//     method.\n//   - BlobHTTPHeaders - BlobHTTPHeaders contains a group of parameters for the BlobClient.SetHTTPHeaders method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method.\n//   - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *BlockBlobClient) CommitBlockList(ctx context.Context, blocks BlockLookupList, options *BlockBlobClientCommitBlockListOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlockBlobClientCommitBlockListResponse, error) {\n\tvar err error\n\treq, err := client.commitBlockListCreateRequest(ctx, blocks, options, blobHTTPHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn BlockBlobClientCommitBlockListResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlockBlobClientCommitBlockListResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusCreated) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlockBlobClientCommitBlockListResponse{}, err\n\t}\n\tresp, err := client.commitBlockListHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// commitBlockListCreateRequest creates the CommitBlockList request.\nfunc (client *BlockBlobClient) commitBlockListCreateRequest(ctx context.Context, blocks BlockLookupList, options *BlockBlobClientCommitBlockListOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"blocklist\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.TransactionalContentMD5 != nil {\n\t\treq.Raw().Header[\"Content-MD5\"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentMD5)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.Tier != nil {\n\t\treq.Raw().Header[\"x-ms-access-tier\"] = []string{string(*options.Tier)}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobCacheControl != nil {\n\t\treq.Raw().Header[\"x-ms-blob-cache-control\"] = []string{*blobHTTPHeaders.BlobCacheControl}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentDisposition != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-disposition\"] = []string{*blobHTTPHeaders.BlobContentDisposition}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentEncoding != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-encoding\"] = []string{*blobHTTPHeaders.BlobContentEncoding}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentLanguage != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-language\"] = []string{*blobHTTPHeaders.BlobContentLanguage}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentMD5 != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-md5\"] = []string{base64.StdEncoding.EncodeToString(blobHTTPHeaders.BlobContentMD5)}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentType != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-type\"] = []string{*blobHTTPHeaders.BlobContentType}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif options != nil && options.TransactionalContentCRC64 != nil {\n\t\treq.Raw().Header[\"x-ms-content-crc64\"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentCRC64)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-algorithm\"] = []string{string(*cpkInfo.EncryptionAlgorithm)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKey != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key\"] = []string{*cpkInfo.EncryptionKey}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key-sha256\"] = []string{*cpkInfo.EncryptionKeySHA256}\n\t}\n\tif cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-scope\"] = []string{*cpkScopeInfo.EncryptionScope}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif options != nil && options.ImmutabilityPolicyMode != nil {\n\t\treq.Raw().Header[\"x-ms-immutability-policy-mode\"] = []string{string(*options.ImmutabilityPolicyMode)}\n\t}\n\tif options != nil && options.ImmutabilityPolicyExpiry != nil {\n\t\treq.Raw().Header[\"x-ms-immutability-policy-until-date\"] = []string{(*options.ImmutabilityPolicyExpiry).In(gmt).Format(time.RFC1123)}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\tif options != nil && options.LegalHold != nil {\n\t\treq.Raw().Header[\"x-ms-legal-hold\"] = []string{strconv.FormatBool(*options.LegalHold)}\n\t}\n\tif options != nil && options.Metadata != nil {\n\t\tfor k, v := range options.Metadata {\n\t\t\tif v != nil {\n\t\t\t\treq.Raw().Header[\"x-ms-meta-\"+k] = []string{*v}\n\t\t\t}\n\t\t}\n\t}\n\tif options != nil && options.BlobTagsString != nil {\n\t\treq.Raw().Header[\"x-ms-tags\"] = []string{*options.BlobTagsString}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\tif err := runtime.MarshalAsXML(req, blocks); err != nil {\n\t\treturn nil, err\n\t}\n\treturn req, nil\n}\n\n// commitBlockListHandleResponse handles the CommitBlockList response.\nfunc (client *BlockBlobClient) commitBlockListHandleResponse(resp *http.Response) (BlockBlobClientCommitBlockListResponse, error) {\n\tresult := BlockBlobClientCommitBlockListResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-content-crc64\"); val != \"\" {\n\t\tcontentCRC64, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientCommitBlockListResponse{}, err\n\t\t}\n\t\tresult.ContentCRC64 = contentCRC64\n\t}\n\tif val := resp.Header.Get(\"Content-MD5\"); val != \"\" {\n\t\tcontentMD5, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientCommitBlockListResponse{}, err\n\t\t}\n\t\tresult.ContentMD5 = contentMD5\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientCommitBlockListResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-key-sha256\"); val != \"\" {\n\t\tresult.EncryptionKeySHA256 = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-scope\"); val != \"\" {\n\t\tresult.EncryptionScope = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-server-encrypted\"); val != \"\" {\n\t\tisServerEncrypted, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientCommitBlockListResponse{}, err\n\t\t}\n\t\tresult.IsServerEncrypted = &isServerEncrypted\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientCommitBlockListResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version-id\"); val != \"\" {\n\t\tresult.VersionID = &val\n\t}\n\treturn result, nil\n}\n\n// GetBlockList - The Get Block List operation retrieves the list of blocks that have been uploaded as part of a block blob\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - listType - Specifies whether to return the list of committed blocks, the list of uncommitted blocks, or both lists together.\n//   - options - BlockBlobClientGetBlockListOptions contains the optional parameters for the BlockBlobClient.GetBlockList method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *BlockBlobClient) GetBlockList(ctx context.Context, listType BlockListType, options *BlockBlobClientGetBlockListOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlockBlobClientGetBlockListResponse, error) {\n\tvar err error\n\treq, err := client.getBlockListCreateRequest(ctx, listType, options, leaseAccessConditions, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn BlockBlobClientGetBlockListResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlockBlobClientGetBlockListResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlockBlobClientGetBlockListResponse{}, err\n\t}\n\tresp, err := client.getBlockListHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// getBlockListCreateRequest creates the GetBlockList request.\nfunc (client *BlockBlobClient) getBlockListCreateRequest(ctx context.Context, listType BlockListType, options *BlockBlobClientGetBlockListOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"blocklisttype\", string(listType))\n\treqQP.Set(\"comp\", \"blocklist\")\n\tif options != nil && options.Snapshot != nil {\n\t\treqQP.Set(\"snapshot\", *options.Snapshot)\n\t}\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// getBlockListHandleResponse handles the GetBlockList response.\nfunc (client *BlockBlobClient) getBlockListHandleResponse(resp *http.Response) (BlockBlobClientGetBlockListResponse, error) {\n\tresult := BlockBlobClientGetBlockListResponse{}\n\tif val := resp.Header.Get(\"x-ms-blob-content-length\"); val != \"\" {\n\t\tblobContentLength, err := strconv.ParseInt(val, 10, 64)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientGetBlockListResponse{}, err\n\t\t}\n\t\tresult.BlobContentLength = &blobContentLength\n\t}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Content-Type\"); val != \"\" {\n\t\tresult.ContentType = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientGetBlockListResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientGetBlockListResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif err := runtime.UnmarshalAsXML(resp, &result.BlockList); err != nil {\n\t\treturn BlockBlobClientGetBlockListResponse{}, err\n\t}\n\treturn result, nil\n}\n\n// PutBlobFromURL - The Put Blob from URL operation creates a new Block Blob where the contents of the blob are read from\n// a given URL. This API is supported beginning with the 2020-04-08 version. Partial updates are not\n// supported with Put Blob from URL; the content of an existing blob is overwritten with the content of the new blob. To perform\n// partial updates to a block blob’s contents using a source URL, use the Put\n// Block from URL API in conjunction with Put Block List.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - contentLength - The length of the request.\n//   - copySource - Specifies the name of the source page blob snapshot. This value is a URL of up to 2 KB in length that specifies\n//     a page blob snapshot. The value should be URL-encoded as it would appear in a request\n//     URI. The source blob must either be public or must be authenticated via a shared access signature.\n//   - options - BlockBlobClientPutBlobFromURLOptions contains the optional parameters for the BlockBlobClient.PutBlobFromURL\n//     method.\n//   - BlobHTTPHeaders - BlobHTTPHeaders contains a group of parameters for the BlobClient.SetHTTPHeaders method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method.\n//   - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\n//   - SourceModifiedAccessConditions - SourceModifiedAccessConditions contains a group of parameters for the BlobClient.StartCopyFromURL\n//     method.\nfunc (client *BlockBlobClient) PutBlobFromURL(ctx context.Context, contentLength int64, copySource string, options *BlockBlobClientPutBlobFromURLOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (BlockBlobClientPutBlobFromURLResponse, error) {\n\tvar err error\n\treq, err := client.putBlobFromURLCreateRequest(ctx, contentLength, copySource, options, blobHTTPHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions, sourceModifiedAccessConditions)\n\tif err != nil {\n\t\treturn BlockBlobClientPutBlobFromURLResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlockBlobClientPutBlobFromURLResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusCreated) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlockBlobClientPutBlobFromURLResponse{}, err\n\t}\n\tresp, err := client.putBlobFromURLHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// putBlobFromURLCreateRequest creates the PutBlobFromURL request.\nfunc (client *BlockBlobClient) putBlobFromURLCreateRequest(ctx context.Context, contentLength int64, copySource string, options *BlockBlobClientPutBlobFromURLOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\treq.Raw().Header[\"Content-Length\"] = []string{strconv.FormatInt(contentLength, 10)}\n\tif options != nil && options.TransactionalContentMD5 != nil {\n\t\treq.Raw().Header[\"Content-MD5\"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentMD5)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.Tier != nil {\n\t\treq.Raw().Header[\"x-ms-access-tier\"] = []string{string(*options.Tier)}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobCacheControl != nil {\n\t\treq.Raw().Header[\"x-ms-blob-cache-control\"] = []string{*blobHTTPHeaders.BlobCacheControl}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentDisposition != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-disposition\"] = []string{*blobHTTPHeaders.BlobContentDisposition}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentEncoding != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-encoding\"] = []string{*blobHTTPHeaders.BlobContentEncoding}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentLanguage != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-language\"] = []string{*blobHTTPHeaders.BlobContentLanguage}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentMD5 != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-md5\"] = []string{base64.StdEncoding.EncodeToString(blobHTTPHeaders.BlobContentMD5)}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentType != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-type\"] = []string{*blobHTTPHeaders.BlobContentType}\n\t}\n\treq.Raw().Header[\"x-ms-blob-type\"] = []string{\"BlockBlob\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-copy-source\"] = []string{copySource}\n\tif options != nil && options.CopySourceAuthorization != nil {\n\t\treq.Raw().Header[\"x-ms-copy-source-authorization\"] = []string{*options.CopySourceAuthorization}\n\t}\n\tif options != nil && options.CopySourceBlobProperties != nil {\n\t\treq.Raw().Header[\"x-ms-copy-source-blob-properties\"] = []string{strconv.FormatBool(*options.CopySourceBlobProperties)}\n\t}\n\tif options != nil && options.CopySourceTags != nil {\n\t\treq.Raw().Header[\"x-ms-copy-source-tag-option\"] = []string{string(*options.CopySourceTags)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-algorithm\"] = []string{string(*cpkInfo.EncryptionAlgorithm)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKey != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key\"] = []string{*cpkInfo.EncryptionKey}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key-sha256\"] = []string{*cpkInfo.EncryptionKeySHA256}\n\t}\n\tif cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-scope\"] = []string{*cpkScopeInfo.EncryptionScope}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\tif options != nil && options.Metadata != nil {\n\t\tfor k, v := range options.Metadata {\n\t\t\tif v != nil {\n\t\t\t\treq.Raw().Header[\"x-ms-meta-\"+k] = []string{*v}\n\t\t\t}\n\t\t}\n\t}\n\tif options != nil && options.SourceContentMD5 != nil {\n\t\treq.Raw().Header[\"x-ms-source-content-md5\"] = []string{base64.StdEncoding.EncodeToString(options.SourceContentMD5)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfMatch != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-match\"] = []string{string(*sourceModifiedAccessConditions.SourceIfMatch)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfModifiedSince != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-modified-since\"] = []string{(*sourceModifiedAccessConditions.SourceIfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfNoneMatch != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-none-match\"] = []string{string(*sourceModifiedAccessConditions.SourceIfNoneMatch)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfTags != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-tags\"] = []string{*sourceModifiedAccessConditions.SourceIfTags}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-unmodified-since\"] = []string{(*sourceModifiedAccessConditions.SourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.BlobTagsString != nil {\n\t\treq.Raw().Header[\"x-ms-tags\"] = []string{*options.BlobTagsString}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// putBlobFromURLHandleResponse handles the PutBlobFromURL response.\nfunc (client *BlockBlobClient) putBlobFromURLHandleResponse(resp *http.Response) (BlockBlobClientPutBlobFromURLResponse, error) {\n\tresult := BlockBlobClientPutBlobFromURLResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Content-MD5\"); val != \"\" {\n\t\tcontentMD5, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientPutBlobFromURLResponse{}, err\n\t\t}\n\t\tresult.ContentMD5 = contentMD5\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientPutBlobFromURLResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-key-sha256\"); val != \"\" {\n\t\tresult.EncryptionKeySHA256 = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-scope\"); val != \"\" {\n\t\tresult.EncryptionScope = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-server-encrypted\"); val != \"\" {\n\t\tisServerEncrypted, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientPutBlobFromURLResponse{}, err\n\t\t}\n\t\tresult.IsServerEncrypted = &isServerEncrypted\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientPutBlobFromURLResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version-id\"); val != \"\" {\n\t\tresult.VersionID = &val\n\t}\n\treturn result, nil\n}\n\n// StageBlock - The Stage Block operation creates a new block to be committed as part of a blob\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - blockID - A valid Base64 string value that identifies the block. Prior to encoding, the string must be less than or equal\n//     to 64 bytes in size. For a given blob, the length of the value specified for the blockid\n//     parameter must be the same size for each block.\n//   - contentLength - The length of the request.\n//   - body - Initial data\n//   - options - BlockBlobClientStageBlockOptions contains the optional parameters for the BlockBlobClient.StageBlock method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method.\n//   - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method.\nfunc (client *BlockBlobClient) StageBlock(ctx context.Context, blockID string, contentLength int64, body io.ReadSeekCloser, options *BlockBlobClientStageBlockOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo) (BlockBlobClientStageBlockResponse, error) {\n\tvar err error\n\treq, err := client.stageBlockCreateRequest(ctx, blockID, contentLength, body, options, leaseAccessConditions, cpkInfo, cpkScopeInfo)\n\tif err != nil {\n\t\treturn BlockBlobClientStageBlockResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlockBlobClientStageBlockResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusCreated) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlockBlobClientStageBlockResponse{}, err\n\t}\n\tresp, err := client.stageBlockHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// stageBlockCreateRequest creates the StageBlock request.\nfunc (client *BlockBlobClient) stageBlockCreateRequest(ctx context.Context, blockID string, contentLength int64, body io.ReadSeekCloser, options *BlockBlobClientStageBlockOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"blockid\", blockID)\n\treqQP.Set(\"comp\", \"block\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\treq.Raw().Header[\"Content-Length\"] = []string{strconv.FormatInt(contentLength, 10)}\n\tif options != nil && options.TransactionalContentMD5 != nil {\n\t\treq.Raw().Header[\"Content-MD5\"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentMD5)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif options != nil && options.TransactionalContentCRC64 != nil {\n\t\treq.Raw().Header[\"x-ms-content-crc64\"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentCRC64)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-algorithm\"] = []string{string(*cpkInfo.EncryptionAlgorithm)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKey != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key\"] = []string{*cpkInfo.EncryptionKey}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key-sha256\"] = []string{*cpkInfo.EncryptionKeySHA256}\n\t}\n\tif cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-scope\"] = []string{*cpkScopeInfo.EncryptionScope}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\tif options != nil && options.StructuredBodyType != nil {\n\t\treq.Raw().Header[\"x-ms-structured-body\"] = []string{*options.StructuredBodyType}\n\t}\n\tif options != nil && options.StructuredContentLength != nil {\n\t\treq.Raw().Header[\"x-ms-structured-content-length\"] = []string{strconv.FormatInt(*options.StructuredContentLength, 10)}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\tif err := req.SetBody(body, \"application/octet-stream\"); err != nil {\n\t\treturn nil, err\n\t}\n\treturn req, nil\n}\n\n// stageBlockHandleResponse handles the StageBlock response.\nfunc (client *BlockBlobClient) stageBlockHandleResponse(resp *http.Response) (BlockBlobClientStageBlockResponse, error) {\n\tresult := BlockBlobClientStageBlockResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-content-crc64\"); val != \"\" {\n\t\tcontentCRC64, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientStageBlockResponse{}, err\n\t\t}\n\t\tresult.ContentCRC64 = contentCRC64\n\t}\n\tif val := resp.Header.Get(\"Content-MD5\"); val != \"\" {\n\t\tcontentMD5, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientStageBlockResponse{}, err\n\t\t}\n\t\tresult.ContentMD5 = contentMD5\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientStageBlockResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-key-sha256\"); val != \"\" {\n\t\tresult.EncryptionKeySHA256 = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-scope\"); val != \"\" {\n\t\tresult.EncryptionScope = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-server-encrypted\"); val != \"\" {\n\t\tisServerEncrypted, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientStageBlockResponse{}, err\n\t\t}\n\t\tresult.IsServerEncrypted = &isServerEncrypted\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-structured-body\"); val != \"\" {\n\t\tresult.StructuredBodyType = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// StageBlockFromURL - The Stage Block operation creates a new block to be committed as part of a blob where the contents\n// are read from a URL.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - blockID - A valid Base64 string value that identifies the block. Prior to encoding, the string must be less than or equal\n//     to 64 bytes in size. For a given blob, the length of the value specified for the blockid\n//     parameter must be the same size for each block.\n//   - contentLength - The length of the request.\n//   - sourceURL - Specify a URL to the copy source.\n//   - options - BlockBlobClientStageBlockFromURLOptions contains the optional parameters for the BlockBlobClient.StageBlockFromURL\n//     method.\n//   - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method.\n//   - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - SourceModifiedAccessConditions - SourceModifiedAccessConditions contains a group of parameters for the BlobClient.StartCopyFromURL\n//     method.\nfunc (client *BlockBlobClient) StageBlockFromURL(ctx context.Context, blockID string, contentLength int64, sourceURL string, options *BlockBlobClientStageBlockFromURLOptions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, leaseAccessConditions *LeaseAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (BlockBlobClientStageBlockFromURLResponse, error) {\n\tvar err error\n\treq, err := client.stageBlockFromURLCreateRequest(ctx, blockID, contentLength, sourceURL, options, cpkInfo, cpkScopeInfo, leaseAccessConditions, sourceModifiedAccessConditions)\n\tif err != nil {\n\t\treturn BlockBlobClientStageBlockFromURLResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlockBlobClientStageBlockFromURLResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusCreated) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlockBlobClientStageBlockFromURLResponse{}, err\n\t}\n\tresp, err := client.stageBlockFromURLHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// stageBlockFromURLCreateRequest creates the StageBlockFromURL request.\nfunc (client *BlockBlobClient) stageBlockFromURLCreateRequest(ctx context.Context, blockID string, contentLength int64, sourceURL string, options *BlockBlobClientStageBlockFromURLOptions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, leaseAccessConditions *LeaseAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"blockid\", blockID)\n\treqQP.Set(\"comp\", \"block\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\treq.Raw().Header[\"Content-Length\"] = []string{strconv.FormatInt(contentLength, 10)}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-copy-source\"] = []string{sourceURL}\n\tif options != nil && options.CopySourceAuthorization != nil {\n\t\treq.Raw().Header[\"x-ms-copy-source-authorization\"] = []string{*options.CopySourceAuthorization}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-algorithm\"] = []string{string(*cpkInfo.EncryptionAlgorithm)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKey != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key\"] = []string{*cpkInfo.EncryptionKey}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key-sha256\"] = []string{*cpkInfo.EncryptionKeySHA256}\n\t}\n\tif cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-scope\"] = []string{*cpkScopeInfo.EncryptionScope}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\tif options != nil && options.SourceContentcrc64 != nil {\n\t\treq.Raw().Header[\"x-ms-source-content-crc64\"] = []string{base64.StdEncoding.EncodeToString(options.SourceContentcrc64)}\n\t}\n\tif options != nil && options.SourceContentMD5 != nil {\n\t\treq.Raw().Header[\"x-ms-source-content-md5\"] = []string{base64.StdEncoding.EncodeToString(options.SourceContentMD5)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfMatch != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-match\"] = []string{string(*sourceModifiedAccessConditions.SourceIfMatch)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfModifiedSince != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-modified-since\"] = []string{(*sourceModifiedAccessConditions.SourceIfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfNoneMatch != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-none-match\"] = []string{string(*sourceModifiedAccessConditions.SourceIfNoneMatch)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-unmodified-since\"] = []string{(*sourceModifiedAccessConditions.SourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.SourceRange != nil {\n\t\treq.Raw().Header[\"x-ms-source-range\"] = []string{*options.SourceRange}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// stageBlockFromURLHandleResponse handles the StageBlockFromURL response.\nfunc (client *BlockBlobClient) stageBlockFromURLHandleResponse(resp *http.Response) (BlockBlobClientStageBlockFromURLResponse, error) {\n\tresult := BlockBlobClientStageBlockFromURLResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-content-crc64\"); val != \"\" {\n\t\tcontentCRC64, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientStageBlockFromURLResponse{}, err\n\t\t}\n\t\tresult.ContentCRC64 = contentCRC64\n\t}\n\tif val := resp.Header.Get(\"Content-MD5\"); val != \"\" {\n\t\tcontentMD5, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientStageBlockFromURLResponse{}, err\n\t\t}\n\t\tresult.ContentMD5 = contentMD5\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientStageBlockFromURLResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-key-sha256\"); val != \"\" {\n\t\tresult.EncryptionKeySHA256 = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-scope\"); val != \"\" {\n\t\tresult.EncryptionScope = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-server-encrypted\"); val != \"\" {\n\t\tisServerEncrypted, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientStageBlockFromURLResponse{}, err\n\t\t}\n\t\tresult.IsServerEncrypted = &isServerEncrypted\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// Upload - The Upload Block Blob operation updates the content of an existing block blob. Updating an existing block blob\n// overwrites any existing metadata on the blob. Partial updates are not supported with Put\n// Blob; the content of the existing blob is overwritten with the content of the new blob. To perform a partial update of\n// the content of a block blob, use the Put Block List operation.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - contentLength - The length of the request.\n//   - body - Initial data\n//   - options - BlockBlobClientUploadOptions contains the optional parameters for the BlockBlobClient.Upload method.\n//   - BlobHTTPHeaders - BlobHTTPHeaders contains a group of parameters for the BlobClient.SetHTTPHeaders method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method.\n//   - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *BlockBlobClient) Upload(ctx context.Context, contentLength int64, body io.ReadSeekCloser, options *BlockBlobClientUploadOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlockBlobClientUploadResponse, error) {\n\tvar err error\n\treq, err := client.uploadCreateRequest(ctx, contentLength, body, options, blobHTTPHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn BlockBlobClientUploadResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn BlockBlobClientUploadResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusCreated) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn BlockBlobClientUploadResponse{}, err\n\t}\n\tresp, err := client.uploadHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// uploadCreateRequest creates the Upload request.\nfunc (client *BlockBlobClient) uploadCreateRequest(ctx context.Context, contentLength int64, body io.ReadSeekCloser, options *BlockBlobClientUploadOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\treq.Raw().Header[\"Content-Length\"] = []string{strconv.FormatInt(contentLength, 10)}\n\tif options != nil && options.TransactionalContentMD5 != nil {\n\t\treq.Raw().Header[\"Content-MD5\"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentMD5)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.Tier != nil {\n\t\treq.Raw().Header[\"x-ms-access-tier\"] = []string{string(*options.Tier)}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobCacheControl != nil {\n\t\treq.Raw().Header[\"x-ms-blob-cache-control\"] = []string{*blobHTTPHeaders.BlobCacheControl}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentDisposition != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-disposition\"] = []string{*blobHTTPHeaders.BlobContentDisposition}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentEncoding != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-encoding\"] = []string{*blobHTTPHeaders.BlobContentEncoding}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentLanguage != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-language\"] = []string{*blobHTTPHeaders.BlobContentLanguage}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentMD5 != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-md5\"] = []string{base64.StdEncoding.EncodeToString(blobHTTPHeaders.BlobContentMD5)}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentType != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-type\"] = []string{*blobHTTPHeaders.BlobContentType}\n\t}\n\treq.Raw().Header[\"x-ms-blob-type\"] = []string{\"BlockBlob\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif options != nil && options.TransactionalContentCRC64 != nil {\n\t\treq.Raw().Header[\"x-ms-content-crc64\"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentCRC64)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-algorithm\"] = []string{string(*cpkInfo.EncryptionAlgorithm)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKey != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key\"] = []string{*cpkInfo.EncryptionKey}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key-sha256\"] = []string{*cpkInfo.EncryptionKeySHA256}\n\t}\n\tif cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-scope\"] = []string{*cpkScopeInfo.EncryptionScope}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif options != nil && options.ImmutabilityPolicyMode != nil {\n\t\treq.Raw().Header[\"x-ms-immutability-policy-mode\"] = []string{string(*options.ImmutabilityPolicyMode)}\n\t}\n\tif options != nil && options.ImmutabilityPolicyExpiry != nil {\n\t\treq.Raw().Header[\"x-ms-immutability-policy-until-date\"] = []string{(*options.ImmutabilityPolicyExpiry).In(gmt).Format(time.RFC1123)}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\tif options != nil && options.LegalHold != nil {\n\t\treq.Raw().Header[\"x-ms-legal-hold\"] = []string{strconv.FormatBool(*options.LegalHold)}\n\t}\n\tif options != nil && options.Metadata != nil {\n\t\tfor k, v := range options.Metadata {\n\t\t\tif v != nil {\n\t\t\t\treq.Raw().Header[\"x-ms-meta-\"+k] = []string{*v}\n\t\t\t}\n\t\t}\n\t}\n\tif options != nil && options.StructuredBodyType != nil {\n\t\treq.Raw().Header[\"x-ms-structured-body\"] = []string{*options.StructuredBodyType}\n\t}\n\tif options != nil && options.StructuredContentLength != nil {\n\t\treq.Raw().Header[\"x-ms-structured-content-length\"] = []string{strconv.FormatInt(*options.StructuredContentLength, 10)}\n\t}\n\tif options != nil && options.BlobTagsString != nil {\n\t\treq.Raw().Header[\"x-ms-tags\"] = []string{*options.BlobTagsString}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\tif err := req.SetBody(body, \"application/octet-stream\"); err != nil {\n\t\treturn nil, err\n\t}\n\treturn req, nil\n}\n\n// uploadHandleResponse handles the Upload response.\nfunc (client *BlockBlobClient) uploadHandleResponse(resp *http.Response) (BlockBlobClientUploadResponse, error) {\n\tresult := BlockBlobClientUploadResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-content-crc64\"); val != \"\" {\n\t\tcontentCRC64, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientUploadResponse{}, err\n\t\t}\n\t\tresult.ContentCRC64 = contentCRC64\n\t}\n\tif val := resp.Header.Get(\"Content-MD5\"); val != \"\" {\n\t\tcontentMD5, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientUploadResponse{}, err\n\t\t}\n\t\tresult.ContentMD5 = contentMD5\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientUploadResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-key-sha256\"); val != \"\" {\n\t\tresult.EncryptionKeySHA256 = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-scope\"); val != \"\" {\n\t\tresult.EncryptionScope = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-server-encrypted\"); val != \"\" {\n\t\tisServerEncrypted, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientUploadResponse{}, err\n\t\t}\n\t\tresult.IsServerEncrypted = &isServerEncrypted\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn BlockBlobClientUploadResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-structured-body\"); val != \"\" {\n\t\tresult.StructuredBodyType = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version-id\"); val != \"\" {\n\t\tresult.VersionID = &val\n\t}\n\treturn result, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_constants.go",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n// Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\npackage generated\n\ntype AccessTier string\n\nconst (\n\tAccessTierArchive AccessTier = \"Archive\"\n\tAccessTierCold    AccessTier = \"Cold\"\n\tAccessTierCool    AccessTier = \"Cool\"\n\tAccessTierHot     AccessTier = \"Hot\"\n\tAccessTierP10     AccessTier = \"P10\"\n\tAccessTierP15     AccessTier = \"P15\"\n\tAccessTierP20     AccessTier = \"P20\"\n\tAccessTierP30     AccessTier = \"P30\"\n\tAccessTierP4      AccessTier = \"P4\"\n\tAccessTierP40     AccessTier = \"P40\"\n\tAccessTierP50     AccessTier = \"P50\"\n\tAccessTierP6      AccessTier = \"P6\"\n\tAccessTierP60     AccessTier = \"P60\"\n\tAccessTierP70     AccessTier = \"P70\"\n\tAccessTierP80     AccessTier = \"P80\"\n\tAccessTierPremium AccessTier = \"Premium\"\n)\n\n// PossibleAccessTierValues returns the possible values for the AccessTier const type.\nfunc PossibleAccessTierValues() []AccessTier {\n\treturn []AccessTier{\n\t\tAccessTierArchive,\n\t\tAccessTierCold,\n\t\tAccessTierCool,\n\t\tAccessTierHot,\n\t\tAccessTierP10,\n\t\tAccessTierP15,\n\t\tAccessTierP20,\n\t\tAccessTierP30,\n\t\tAccessTierP4,\n\t\tAccessTierP40,\n\t\tAccessTierP50,\n\t\tAccessTierP6,\n\t\tAccessTierP60,\n\t\tAccessTierP70,\n\t\tAccessTierP80,\n\t\tAccessTierPremium,\n\t}\n}\n\ntype AccountKind string\n\nconst (\n\tAccountKindBlobStorage      AccountKind = \"BlobStorage\"\n\tAccountKindBlockBlobStorage AccountKind = \"BlockBlobStorage\"\n\tAccountKindFileStorage      AccountKind = \"FileStorage\"\n\tAccountKindStorage          AccountKind = \"Storage\"\n\tAccountKindStorageV2        AccountKind = \"StorageV2\"\n)\n\n// PossibleAccountKindValues returns the possible values for the AccountKind const type.\nfunc PossibleAccountKindValues() []AccountKind {\n\treturn []AccountKind{\n\t\tAccountKindBlobStorage,\n\t\tAccountKindBlockBlobStorage,\n\t\tAccountKindFileStorage,\n\t\tAccountKindStorage,\n\t\tAccountKindStorageV2,\n\t}\n}\n\ntype ArchiveStatus string\n\nconst (\n\tArchiveStatusRehydratePendingToCold ArchiveStatus = \"rehydrate-pending-to-cold\"\n\tArchiveStatusRehydratePendingToCool ArchiveStatus = \"rehydrate-pending-to-cool\"\n\tArchiveStatusRehydratePendingToHot  ArchiveStatus = \"rehydrate-pending-to-hot\"\n)\n\n// PossibleArchiveStatusValues returns the possible values for the ArchiveStatus const type.\nfunc PossibleArchiveStatusValues() []ArchiveStatus {\n\treturn []ArchiveStatus{\n\t\tArchiveStatusRehydratePendingToCold,\n\t\tArchiveStatusRehydratePendingToCool,\n\t\tArchiveStatusRehydratePendingToHot,\n\t}\n}\n\ntype BlobCopySourceTags string\n\nconst (\n\tBlobCopySourceTagsCOPY    BlobCopySourceTags = \"COPY\"\n\tBlobCopySourceTagsREPLACE BlobCopySourceTags = \"REPLACE\"\n)\n\n// PossibleBlobCopySourceTagsValues returns the possible values for the BlobCopySourceTags const type.\nfunc PossibleBlobCopySourceTagsValues() []BlobCopySourceTags {\n\treturn []BlobCopySourceTags{\n\t\tBlobCopySourceTagsCOPY,\n\t\tBlobCopySourceTagsREPLACE,\n\t}\n}\n\n// BlobGeoReplicationStatus - The status of the secondary location\ntype BlobGeoReplicationStatus string\n\nconst (\n\tBlobGeoReplicationStatusBootstrap   BlobGeoReplicationStatus = \"bootstrap\"\n\tBlobGeoReplicationStatusLive        BlobGeoReplicationStatus = \"live\"\n\tBlobGeoReplicationStatusUnavailable BlobGeoReplicationStatus = \"unavailable\"\n)\n\n// PossibleBlobGeoReplicationStatusValues returns the possible values for the BlobGeoReplicationStatus const type.\nfunc PossibleBlobGeoReplicationStatusValues() []BlobGeoReplicationStatus {\n\treturn []BlobGeoReplicationStatus{\n\t\tBlobGeoReplicationStatusBootstrap,\n\t\tBlobGeoReplicationStatusLive,\n\t\tBlobGeoReplicationStatusUnavailable,\n\t}\n}\n\ntype BlobType string\n\nconst (\n\tBlobTypeAppendBlob BlobType = \"AppendBlob\"\n\tBlobTypeBlockBlob  BlobType = \"BlockBlob\"\n\tBlobTypePageBlob   BlobType = \"PageBlob\"\n)\n\n// PossibleBlobTypeValues returns the possible values for the BlobType const type.\nfunc PossibleBlobTypeValues() []BlobType {\n\treturn []BlobType{\n\t\tBlobTypeAppendBlob,\n\t\tBlobTypeBlockBlob,\n\t\tBlobTypePageBlob,\n\t}\n}\n\ntype BlockListType string\n\nconst (\n\tBlockListTypeAll         BlockListType = \"all\"\n\tBlockListTypeCommitted   BlockListType = \"committed\"\n\tBlockListTypeUncommitted BlockListType = \"uncommitted\"\n)\n\n// PossibleBlockListTypeValues returns the possible values for the BlockListType const type.\nfunc PossibleBlockListTypeValues() []BlockListType {\n\treturn []BlockListType{\n\t\tBlockListTypeAll,\n\t\tBlockListTypeCommitted,\n\t\tBlockListTypeUncommitted,\n\t}\n}\n\ntype CopyStatusType string\n\nconst (\n\tCopyStatusTypeAborted CopyStatusType = \"aborted\"\n\tCopyStatusTypeFailed  CopyStatusType = \"failed\"\n\tCopyStatusTypePending CopyStatusType = \"pending\"\n\tCopyStatusTypeSuccess CopyStatusType = \"success\"\n)\n\n// PossibleCopyStatusTypeValues returns the possible values for the CopyStatusType const type.\nfunc PossibleCopyStatusTypeValues() []CopyStatusType {\n\treturn []CopyStatusType{\n\t\tCopyStatusTypeAborted,\n\t\tCopyStatusTypeFailed,\n\t\tCopyStatusTypePending,\n\t\tCopyStatusTypeSuccess,\n\t}\n}\n\ntype DeleteSnapshotsOptionType string\n\nconst (\n\tDeleteSnapshotsOptionTypeInclude DeleteSnapshotsOptionType = \"include\"\n\tDeleteSnapshotsOptionTypeOnly    DeleteSnapshotsOptionType = \"only\"\n)\n\n// PossibleDeleteSnapshotsOptionTypeValues returns the possible values for the DeleteSnapshotsOptionType const type.\nfunc PossibleDeleteSnapshotsOptionTypeValues() []DeleteSnapshotsOptionType {\n\treturn []DeleteSnapshotsOptionType{\n\t\tDeleteSnapshotsOptionTypeInclude,\n\t\tDeleteSnapshotsOptionTypeOnly,\n\t}\n}\n\ntype DeleteType string\n\nconst (\n\tDeleteTypeNone      DeleteType = \"None\"\n\tDeleteTypePermanent DeleteType = \"Permanent\"\n)\n\n// PossibleDeleteTypeValues returns the possible values for the DeleteType const type.\nfunc PossibleDeleteTypeValues() []DeleteType {\n\treturn []DeleteType{\n\t\tDeleteTypeNone,\n\t\tDeleteTypePermanent,\n\t}\n}\n\ntype EncryptionAlgorithmType string\n\nconst (\n\tEncryptionAlgorithmTypeAES256 EncryptionAlgorithmType = \"AES256\"\n\tEncryptionAlgorithmTypeNone   EncryptionAlgorithmType = \"None\"\n)\n\n// PossibleEncryptionAlgorithmTypeValues returns the possible values for the EncryptionAlgorithmType const type.\nfunc PossibleEncryptionAlgorithmTypeValues() []EncryptionAlgorithmType {\n\treturn []EncryptionAlgorithmType{\n\t\tEncryptionAlgorithmTypeAES256,\n\t\tEncryptionAlgorithmTypeNone,\n\t}\n}\n\ntype ExpiryOptions string\n\nconst (\n\tExpiryOptionsAbsolute           ExpiryOptions = \"Absolute\"\n\tExpiryOptionsNeverExpire        ExpiryOptions = \"NeverExpire\"\n\tExpiryOptionsRelativeToCreation ExpiryOptions = \"RelativeToCreation\"\n\tExpiryOptionsRelativeToNow      ExpiryOptions = \"RelativeToNow\"\n)\n\n// PossibleExpiryOptionsValues returns the possible values for the ExpiryOptions const type.\nfunc PossibleExpiryOptionsValues() []ExpiryOptions {\n\treturn []ExpiryOptions{\n\t\tExpiryOptionsAbsolute,\n\t\tExpiryOptionsNeverExpire,\n\t\tExpiryOptionsRelativeToCreation,\n\t\tExpiryOptionsRelativeToNow,\n\t}\n}\n\ntype FilterBlobsIncludeItem string\n\nconst (\n\tFilterBlobsIncludeItemNone     FilterBlobsIncludeItem = \"none\"\n\tFilterBlobsIncludeItemVersions FilterBlobsIncludeItem = \"versions\"\n)\n\n// PossibleFilterBlobsIncludeItemValues returns the possible values for the FilterBlobsIncludeItem const type.\nfunc PossibleFilterBlobsIncludeItemValues() []FilterBlobsIncludeItem {\n\treturn []FilterBlobsIncludeItem{\n\t\tFilterBlobsIncludeItemNone,\n\t\tFilterBlobsIncludeItemVersions,\n\t}\n}\n\ntype ImmutabilityPolicyMode string\n\nconst (\n\tImmutabilityPolicyModeLocked   ImmutabilityPolicyMode = \"Locked\"\n\tImmutabilityPolicyModeMutable  ImmutabilityPolicyMode = \"Mutable\"\n\tImmutabilityPolicyModeUnlocked ImmutabilityPolicyMode = \"Unlocked\"\n)\n\n// PossibleImmutabilityPolicyModeValues returns the possible values for the ImmutabilityPolicyMode const type.\nfunc PossibleImmutabilityPolicyModeValues() []ImmutabilityPolicyMode {\n\treturn []ImmutabilityPolicyMode{\n\t\tImmutabilityPolicyModeLocked,\n\t\tImmutabilityPolicyModeMutable,\n\t\tImmutabilityPolicyModeUnlocked,\n\t}\n}\n\ntype ImmutabilityPolicySetting string\n\nconst (\n\tImmutabilityPolicySettingLocked   ImmutabilityPolicySetting = \"Locked\"\n\tImmutabilityPolicySettingUnlocked ImmutabilityPolicySetting = \"Unlocked\"\n)\n\n// PossibleImmutabilityPolicySettingValues returns the possible values for the ImmutabilityPolicySetting const type.\nfunc PossibleImmutabilityPolicySettingValues() []ImmutabilityPolicySetting {\n\treturn []ImmutabilityPolicySetting{\n\t\tImmutabilityPolicySettingLocked,\n\t\tImmutabilityPolicySettingUnlocked,\n\t}\n}\n\ntype LeaseDurationType string\n\nconst (\n\tLeaseDurationTypeFixed    LeaseDurationType = \"fixed\"\n\tLeaseDurationTypeInfinite LeaseDurationType = \"infinite\"\n)\n\n// PossibleLeaseDurationTypeValues returns the possible values for the LeaseDurationType const type.\nfunc PossibleLeaseDurationTypeValues() []LeaseDurationType {\n\treturn []LeaseDurationType{\n\t\tLeaseDurationTypeFixed,\n\t\tLeaseDurationTypeInfinite,\n\t}\n}\n\ntype LeaseStateType string\n\nconst (\n\tLeaseStateTypeAvailable LeaseStateType = \"available\"\n\tLeaseStateTypeBreaking  LeaseStateType = \"breaking\"\n\tLeaseStateTypeBroken    LeaseStateType = \"broken\"\n\tLeaseStateTypeExpired   LeaseStateType = \"expired\"\n\tLeaseStateTypeLeased    LeaseStateType = \"leased\"\n)\n\n// PossibleLeaseStateTypeValues returns the possible values for the LeaseStateType const type.\nfunc PossibleLeaseStateTypeValues() []LeaseStateType {\n\treturn []LeaseStateType{\n\t\tLeaseStateTypeAvailable,\n\t\tLeaseStateTypeBreaking,\n\t\tLeaseStateTypeBroken,\n\t\tLeaseStateTypeExpired,\n\t\tLeaseStateTypeLeased,\n\t}\n}\n\ntype LeaseStatusType string\n\nconst (\n\tLeaseStatusTypeLocked   LeaseStatusType = \"locked\"\n\tLeaseStatusTypeUnlocked LeaseStatusType = \"unlocked\"\n)\n\n// PossibleLeaseStatusTypeValues returns the possible values for the LeaseStatusType const type.\nfunc PossibleLeaseStatusTypeValues() []LeaseStatusType {\n\treturn []LeaseStatusType{\n\t\tLeaseStatusTypeLocked,\n\t\tLeaseStatusTypeUnlocked,\n\t}\n}\n\ntype ListBlobsIncludeItem string\n\nconst (\n\tListBlobsIncludeItemCopy                ListBlobsIncludeItem = \"copy\"\n\tListBlobsIncludeItemDeleted             ListBlobsIncludeItem = \"deleted\"\n\tListBlobsIncludeItemDeletedwithversions ListBlobsIncludeItem = \"deletedwithversions\"\n\tListBlobsIncludeItemImmutabilitypolicy  ListBlobsIncludeItem = \"immutabilitypolicy\"\n\tListBlobsIncludeItemLegalhold           ListBlobsIncludeItem = \"legalhold\"\n\tListBlobsIncludeItemMetadata            ListBlobsIncludeItem = \"metadata\"\n\tListBlobsIncludeItemPermissions         ListBlobsIncludeItem = \"permissions\"\n\tListBlobsIncludeItemSnapshots           ListBlobsIncludeItem = \"snapshots\"\n\tListBlobsIncludeItemTags                ListBlobsIncludeItem = \"tags\"\n\tListBlobsIncludeItemUncommittedblobs    ListBlobsIncludeItem = \"uncommittedblobs\"\n\tListBlobsIncludeItemVersions            ListBlobsIncludeItem = \"versions\"\n)\n\n// PossibleListBlobsIncludeItemValues returns the possible values for the ListBlobsIncludeItem const type.\nfunc PossibleListBlobsIncludeItemValues() []ListBlobsIncludeItem {\n\treturn []ListBlobsIncludeItem{\n\t\tListBlobsIncludeItemCopy,\n\t\tListBlobsIncludeItemDeleted,\n\t\tListBlobsIncludeItemDeletedwithversions,\n\t\tListBlobsIncludeItemImmutabilitypolicy,\n\t\tListBlobsIncludeItemLegalhold,\n\t\tListBlobsIncludeItemMetadata,\n\t\tListBlobsIncludeItemPermissions,\n\t\tListBlobsIncludeItemSnapshots,\n\t\tListBlobsIncludeItemTags,\n\t\tListBlobsIncludeItemUncommittedblobs,\n\t\tListBlobsIncludeItemVersions,\n\t}\n}\n\ntype ListContainersIncludeType string\n\nconst (\n\tListContainersIncludeTypeDeleted  ListContainersIncludeType = \"deleted\"\n\tListContainersIncludeTypeMetadata ListContainersIncludeType = \"metadata\"\n\tListContainersIncludeTypeSystem   ListContainersIncludeType = \"system\"\n)\n\n// PossibleListContainersIncludeTypeValues returns the possible values for the ListContainersIncludeType const type.\nfunc PossibleListContainersIncludeTypeValues() []ListContainersIncludeType {\n\treturn []ListContainersIncludeType{\n\t\tListContainersIncludeTypeDeleted,\n\t\tListContainersIncludeTypeMetadata,\n\t\tListContainersIncludeTypeSystem,\n\t}\n}\n\ntype PremiumPageBlobAccessTier string\n\nconst (\n\tPremiumPageBlobAccessTierP10 PremiumPageBlobAccessTier = \"P10\"\n\tPremiumPageBlobAccessTierP15 PremiumPageBlobAccessTier = \"P15\"\n\tPremiumPageBlobAccessTierP20 PremiumPageBlobAccessTier = \"P20\"\n\tPremiumPageBlobAccessTierP30 PremiumPageBlobAccessTier = \"P30\"\n\tPremiumPageBlobAccessTierP4  PremiumPageBlobAccessTier = \"P4\"\n\tPremiumPageBlobAccessTierP40 PremiumPageBlobAccessTier = \"P40\"\n\tPremiumPageBlobAccessTierP50 PremiumPageBlobAccessTier = \"P50\"\n\tPremiumPageBlobAccessTierP6  PremiumPageBlobAccessTier = \"P6\"\n\tPremiumPageBlobAccessTierP60 PremiumPageBlobAccessTier = \"P60\"\n\tPremiumPageBlobAccessTierP70 PremiumPageBlobAccessTier = \"P70\"\n\tPremiumPageBlobAccessTierP80 PremiumPageBlobAccessTier = \"P80\"\n)\n\n// PossiblePremiumPageBlobAccessTierValues returns the possible values for the PremiumPageBlobAccessTier const type.\nfunc PossiblePremiumPageBlobAccessTierValues() []PremiumPageBlobAccessTier {\n\treturn []PremiumPageBlobAccessTier{\n\t\tPremiumPageBlobAccessTierP10,\n\t\tPremiumPageBlobAccessTierP15,\n\t\tPremiumPageBlobAccessTierP20,\n\t\tPremiumPageBlobAccessTierP30,\n\t\tPremiumPageBlobAccessTierP4,\n\t\tPremiumPageBlobAccessTierP40,\n\t\tPremiumPageBlobAccessTierP50,\n\t\tPremiumPageBlobAccessTierP6,\n\t\tPremiumPageBlobAccessTierP60,\n\t\tPremiumPageBlobAccessTierP70,\n\t\tPremiumPageBlobAccessTierP80,\n\t}\n}\n\ntype PublicAccessType string\n\nconst (\n\tPublicAccessTypeBlob      PublicAccessType = \"blob\"\n\tPublicAccessTypeContainer PublicAccessType = \"container\"\n)\n\n// PossiblePublicAccessTypeValues returns the possible values for the PublicAccessType const type.\nfunc PossiblePublicAccessTypeValues() []PublicAccessType {\n\treturn []PublicAccessType{\n\t\tPublicAccessTypeBlob,\n\t\tPublicAccessTypeContainer,\n\t}\n}\n\n// QueryFormatType - The quick query format type.\ntype QueryFormatType string\n\nconst (\n\tQueryFormatTypeArrow     QueryFormatType = \"arrow\"\n\tQueryFormatTypeDelimited QueryFormatType = \"delimited\"\n\tQueryFormatTypeJSON      QueryFormatType = \"json\"\n\tQueryFormatTypeParquet   QueryFormatType = \"parquet\"\n)\n\n// PossibleQueryFormatTypeValues returns the possible values for the QueryFormatType const type.\nfunc PossibleQueryFormatTypeValues() []QueryFormatType {\n\treturn []QueryFormatType{\n\t\tQueryFormatTypeArrow,\n\t\tQueryFormatTypeDelimited,\n\t\tQueryFormatTypeJSON,\n\t\tQueryFormatTypeParquet,\n\t}\n}\n\n// RehydratePriority - If an object is in rehydrate pending state then this header is returned with priority of rehydrate.\n// Valid values are High and Standard.\ntype RehydratePriority string\n\nconst (\n\tRehydratePriorityHigh     RehydratePriority = \"High\"\n\tRehydratePriorityStandard RehydratePriority = \"Standard\"\n)\n\n// PossibleRehydratePriorityValues returns the possible values for the RehydratePriority const type.\nfunc PossibleRehydratePriorityValues() []RehydratePriority {\n\treturn []RehydratePriority{\n\t\tRehydratePriorityHigh,\n\t\tRehydratePriorityStandard,\n\t}\n}\n\ntype SKUName string\n\nconst (\n\tSKUNamePremiumLRS    SKUName = \"Premium_LRS\"\n\tSKUNameStandardGRS   SKUName = \"Standard_GRS\"\n\tSKUNameStandardLRS   SKUName = \"Standard_LRS\"\n\tSKUNameStandardRAGRS SKUName = \"Standard_RAGRS\"\n\tSKUNameStandardZRS   SKUName = \"Standard_ZRS\"\n)\n\n// PossibleSKUNameValues returns the possible values for the SKUName const type.\nfunc PossibleSKUNameValues() []SKUName {\n\treturn []SKUName{\n\t\tSKUNamePremiumLRS,\n\t\tSKUNameStandardGRS,\n\t\tSKUNameStandardLRS,\n\t\tSKUNameStandardRAGRS,\n\t\tSKUNameStandardZRS,\n\t}\n}\n\ntype SequenceNumberActionType string\n\nconst (\n\tSequenceNumberActionTypeIncrement SequenceNumberActionType = \"increment\"\n\tSequenceNumberActionTypeMax       SequenceNumberActionType = \"max\"\n\tSequenceNumberActionTypeUpdate    SequenceNumberActionType = \"update\"\n)\n\n// PossibleSequenceNumberActionTypeValues returns the possible values for the SequenceNumberActionType const type.\nfunc PossibleSequenceNumberActionTypeValues() []SequenceNumberActionType {\n\treturn []SequenceNumberActionType{\n\t\tSequenceNumberActionTypeIncrement,\n\t\tSequenceNumberActionTypeMax,\n\t\tSequenceNumberActionTypeUpdate,\n\t}\n}\n\n// StorageErrorCode - Error codes returned by the service\ntype StorageErrorCode string\n\nconst (\n\tStorageErrorCodeAccountAlreadyExists                              StorageErrorCode = \"AccountAlreadyExists\"\n\tStorageErrorCodeAccountBeingCreated                               StorageErrorCode = \"AccountBeingCreated\"\n\tStorageErrorCodeAccountIsDisabled                                 StorageErrorCode = \"AccountIsDisabled\"\n\tStorageErrorCodeAppendPositionConditionNotMet                     StorageErrorCode = \"AppendPositionConditionNotMet\"\n\tStorageErrorCodeAuthenticationFailed                              StorageErrorCode = \"AuthenticationFailed\"\n\tStorageErrorCodeAuthorizationFailure                              StorageErrorCode = \"AuthorizationFailure\"\n\tStorageErrorCodeAuthorizationPermissionMismatch                   StorageErrorCode = \"AuthorizationPermissionMismatch\"\n\tStorageErrorCodeAuthorizationProtocolMismatch                     StorageErrorCode = \"AuthorizationProtocolMismatch\"\n\tStorageErrorCodeAuthorizationResourceTypeMismatch                 StorageErrorCode = \"AuthorizationResourceTypeMismatch\"\n\tStorageErrorCodeAuthorizationServiceMismatch                      StorageErrorCode = \"AuthorizationServiceMismatch\"\n\tStorageErrorCodeAuthorizationSourceIPMismatch                     StorageErrorCode = \"AuthorizationSourceIPMismatch\"\n\tStorageErrorCodeBlobAccessTierNotSupportedForAccountType          StorageErrorCode = \"BlobAccessTierNotSupportedForAccountType\"\n\tStorageErrorCodeBlobAlreadyExists                                 StorageErrorCode = \"BlobAlreadyExists\"\n\tStorageErrorCodeBlobArchived                                      StorageErrorCode = \"BlobArchived\"\n\tStorageErrorCodeBlobBeingRehydrated                               StorageErrorCode = \"BlobBeingRehydrated\"\n\tStorageErrorCodeBlobImmutableDueToPolicy                          StorageErrorCode = \"BlobImmutableDueToPolicy\"\n\tStorageErrorCodeBlobNotArchived                                   StorageErrorCode = \"BlobNotArchived\"\n\tStorageErrorCodeBlobNotFound                                      StorageErrorCode = \"BlobNotFound\"\n\tStorageErrorCodeBlobOverwritten                                   StorageErrorCode = \"BlobOverwritten\"\n\tStorageErrorCodeBlobTierInadequateForContentLength                StorageErrorCode = \"BlobTierInadequateForContentLength\"\n\tStorageErrorCodeBlobUsesCustomerSpecifiedEncryption               StorageErrorCode = \"BlobUsesCustomerSpecifiedEncryption\"\n\tStorageErrorCodeBlockCountExceedsLimit                            StorageErrorCode = \"BlockCountExceedsLimit\"\n\tStorageErrorCodeBlockListTooLong                                  StorageErrorCode = \"BlockListTooLong\"\n\tStorageErrorCodeCannotChangeToLowerTier                           StorageErrorCode = \"CannotChangeToLowerTier\"\n\tStorageErrorCodeCannotVerifyCopySource                            StorageErrorCode = \"CannotVerifyCopySource\"\n\tStorageErrorCodeConditionHeadersNotSupported                      StorageErrorCode = \"ConditionHeadersNotSupported\"\n\tStorageErrorCodeConditionNotMet                                   StorageErrorCode = \"ConditionNotMet\"\n\tStorageErrorCodeContainerAlreadyExists                            StorageErrorCode = \"ContainerAlreadyExists\"\n\tStorageErrorCodeContainerBeingDeleted                             StorageErrorCode = \"ContainerBeingDeleted\"\n\tStorageErrorCodeContainerDisabled                                 StorageErrorCode = \"ContainerDisabled\"\n\tStorageErrorCodeContainerNotFound                                 StorageErrorCode = \"ContainerNotFound\"\n\tStorageErrorCodeContentLengthLargerThanTierLimit                  StorageErrorCode = \"ContentLengthLargerThanTierLimit\"\n\tStorageErrorCodeCopyAcrossAccountsNotSupported                    StorageErrorCode = \"CopyAcrossAccountsNotSupported\"\n\tStorageErrorCodeCopyIDMismatch                                    StorageErrorCode = \"CopyIdMismatch\"\n\tStorageErrorCodeEmptyMetadataKey                                  StorageErrorCode = \"EmptyMetadataKey\"\n\tStorageErrorCodeFeatureVersionMismatch                            StorageErrorCode = \"FeatureVersionMismatch\"\n\tStorageErrorCodeIncrementalCopyBlobMismatch                       StorageErrorCode = \"IncrementalCopyBlobMismatch\"\n\tStorageErrorCodeIncrementalCopyOfEarlierVersionSnapshotNotAllowed StorageErrorCode = \"IncrementalCopyOfEarlierVersionSnapshotNotAllowed\"\n\tStorageErrorCodeIncrementalCopySourceMustBeSnapshot               StorageErrorCode = \"IncrementalCopySourceMustBeSnapshot\"\n\tStorageErrorCodeInfiniteLeaseDurationRequired                     StorageErrorCode = \"InfiniteLeaseDurationRequired\"\n\tStorageErrorCodeInsufficientAccountPermissions                    StorageErrorCode = \"InsufficientAccountPermissions\"\n\tStorageErrorCodeInternalError                                     StorageErrorCode = \"InternalError\"\n\tStorageErrorCodeInvalidAuthenticationInfo                         StorageErrorCode = \"InvalidAuthenticationInfo\"\n\tStorageErrorCodeInvalidBlobOrBlock                                StorageErrorCode = \"InvalidBlobOrBlock\"\n\tStorageErrorCodeInvalidBlobTier                                   StorageErrorCode = \"InvalidBlobTier\"\n\tStorageErrorCodeInvalidBlobType                                   StorageErrorCode = \"InvalidBlobType\"\n\tStorageErrorCodeInvalidBlockID                                    StorageErrorCode = \"InvalidBlockId\"\n\tStorageErrorCodeInvalidBlockList                                  StorageErrorCode = \"InvalidBlockList\"\n\tStorageErrorCodeInvalidHTTPVerb                                   StorageErrorCode = \"InvalidHttpVerb\"\n\tStorageErrorCodeInvalidHeaderValue                                StorageErrorCode = \"InvalidHeaderValue\"\n\tStorageErrorCodeInvalidInput                                      StorageErrorCode = \"InvalidInput\"\n\tStorageErrorCodeInvalidMD5                                        StorageErrorCode = \"InvalidMd5\"\n\tStorageErrorCodeInvalidMetadata                                   StorageErrorCode = \"InvalidMetadata\"\n\tStorageErrorCodeInvalidOperation                                  StorageErrorCode = \"InvalidOperation\"\n\tStorageErrorCodeInvalidPageRange                                  StorageErrorCode = \"InvalidPageRange\"\n\tStorageErrorCodeInvalidQueryParameterValue                        StorageErrorCode = \"InvalidQueryParameterValue\"\n\tStorageErrorCodeInvalidRange                                      StorageErrorCode = \"InvalidRange\"\n\tStorageErrorCodeInvalidResourceName                               StorageErrorCode = \"InvalidResourceName\"\n\tStorageErrorCodeInvalidSourceBlobType                             StorageErrorCode = \"InvalidSourceBlobType\"\n\tStorageErrorCodeInvalidSourceBlobURL                              StorageErrorCode = \"InvalidSourceBlobUrl\"\n\tStorageErrorCodeInvalidURI                                        StorageErrorCode = \"InvalidUri\"\n\tStorageErrorCodeInvalidVersionForPageBlobOperation                StorageErrorCode = \"InvalidVersionForPageBlobOperation\"\n\tStorageErrorCodeInvalidXMLDocument                                StorageErrorCode = \"InvalidXmlDocument\"\n\tStorageErrorCodeInvalidXMLNodeValue                               StorageErrorCode = \"InvalidXmlNodeValue\"\n\tStorageErrorCodeLeaseAlreadyBroken                                StorageErrorCode = \"LeaseAlreadyBroken\"\n\tStorageErrorCodeLeaseAlreadyPresent                               StorageErrorCode = \"LeaseAlreadyPresent\"\n\tStorageErrorCodeLeaseIDMismatchWithBlobOperation                  StorageErrorCode = \"LeaseIdMismatchWithBlobOperation\"\n\tStorageErrorCodeLeaseIDMismatchWithContainerOperation             StorageErrorCode = \"LeaseIdMismatchWithContainerOperation\"\n\tStorageErrorCodeLeaseIDMismatchWithLeaseOperation                 StorageErrorCode = \"LeaseIdMismatchWithLeaseOperation\"\n\tStorageErrorCodeLeaseIDMissing                                    StorageErrorCode = \"LeaseIdMissing\"\n\tStorageErrorCodeLeaseIsBreakingAndCannotBeAcquired                StorageErrorCode = \"LeaseIsBreakingAndCannotBeAcquired\"\n\tStorageErrorCodeLeaseIsBreakingAndCannotBeChanged                 StorageErrorCode = \"LeaseIsBreakingAndCannotBeChanged\"\n\tStorageErrorCodeLeaseIsBrokenAndCannotBeRenewed                   StorageErrorCode = \"LeaseIsBrokenAndCannotBeRenewed\"\n\tStorageErrorCodeLeaseLost                                         StorageErrorCode = \"LeaseLost\"\n\tStorageErrorCodeLeaseNotPresentWithBlobOperation                  StorageErrorCode = \"LeaseNotPresentWithBlobOperation\"\n\tStorageErrorCodeLeaseNotPresentWithContainerOperation             StorageErrorCode = \"LeaseNotPresentWithContainerOperation\"\n\tStorageErrorCodeLeaseNotPresentWithLeaseOperation                 StorageErrorCode = \"LeaseNotPresentWithLeaseOperation\"\n\tStorageErrorCodeMD5Mismatch                                       StorageErrorCode = \"Md5Mismatch\"\n\tStorageErrorCodeMaxBlobSizeConditionNotMet                        StorageErrorCode = \"MaxBlobSizeConditionNotMet\"\n\tStorageErrorCodeMetadataTooLarge                                  StorageErrorCode = \"MetadataTooLarge\"\n\tStorageErrorCodeMissingContentLengthHeader                        StorageErrorCode = \"MissingContentLengthHeader\"\n\tStorageErrorCodeMissingRequiredHeader                             StorageErrorCode = \"MissingRequiredHeader\"\n\tStorageErrorCodeMissingRequiredQueryParameter                     StorageErrorCode = \"MissingRequiredQueryParameter\"\n\tStorageErrorCodeMissingRequiredXMLNode                            StorageErrorCode = \"MissingRequiredXmlNode\"\n\tStorageErrorCodeMultipleConditionHeadersNotSupported              StorageErrorCode = \"MultipleConditionHeadersNotSupported\"\n\tStorageErrorCodeNoAuthenticationInformation                       StorageErrorCode = \"NoAuthenticationInformation\"\n\tStorageErrorCodeNoPendingCopyOperation                            StorageErrorCode = \"NoPendingCopyOperation\"\n\tStorageErrorCodeOperationNotAllowedOnIncrementalCopyBlob          StorageErrorCode = \"OperationNotAllowedOnIncrementalCopyBlob\"\n\tStorageErrorCodeOperationTimedOut                                 StorageErrorCode = \"OperationTimedOut\"\n\tStorageErrorCodeOutOfRangeInput                                   StorageErrorCode = \"OutOfRangeInput\"\n\tStorageErrorCodeOutOfRangeQueryParameterValue                     StorageErrorCode = \"OutOfRangeQueryParameterValue\"\n\tStorageErrorCodePendingCopyOperation                              StorageErrorCode = \"PendingCopyOperation\"\n\tStorageErrorCodePreviousSnapshotCannotBeNewer                     StorageErrorCode = \"PreviousSnapshotCannotBeNewer\"\n\tStorageErrorCodePreviousSnapshotNotFound                          StorageErrorCode = \"PreviousSnapshotNotFound\"\n\tStorageErrorCodePreviousSnapshotOperationNotSupported             StorageErrorCode = \"PreviousSnapshotOperationNotSupported\"\n\tStorageErrorCodeRequestBodyTooLarge                               StorageErrorCode = \"RequestBodyTooLarge\"\n\tStorageErrorCodeRequestURLFailedToParse                           StorageErrorCode = \"RequestUrlFailedToParse\"\n\tStorageErrorCodeResourceAlreadyExists                             StorageErrorCode = \"ResourceAlreadyExists\"\n\tStorageErrorCodeResourceNotFound                                  StorageErrorCode = \"ResourceNotFound\"\n\tStorageErrorCodeResourceTypeMismatch                              StorageErrorCode = \"ResourceTypeMismatch\"\n\tStorageErrorCodeSequenceNumberConditionNotMet                     StorageErrorCode = \"SequenceNumberConditionNotMet\"\n\tStorageErrorCodeSequenceNumberIncrementTooLarge                   StorageErrorCode = \"SequenceNumberIncrementTooLarge\"\n\tStorageErrorCodeServerBusy                                        StorageErrorCode = \"ServerBusy\"\n\tStorageErrorCodeSnapshotCountExceeded                             StorageErrorCode = \"SnapshotCountExceeded\"\n\tStorageErrorCodeSnapshotOperationRateExceeded                     StorageErrorCode = \"SnapshotOperationRateExceeded\"\n\tStorageErrorCodeSnapshotsPresent                                  StorageErrorCode = \"SnapshotsPresent\"\n\tStorageErrorCodeSourceConditionNotMet                             StorageErrorCode = \"SourceConditionNotMet\"\n\tStorageErrorCodeSystemInUse                                       StorageErrorCode = \"SystemInUse\"\n\tStorageErrorCodeTargetConditionNotMet                             StorageErrorCode = \"TargetConditionNotMet\"\n\tStorageErrorCodeUnauthorizedBlobOverwrite                         StorageErrorCode = \"UnauthorizedBlobOverwrite\"\n\tStorageErrorCodeUnsupportedHTTPVerb                               StorageErrorCode = \"UnsupportedHttpVerb\"\n\tStorageErrorCodeUnsupportedHeader                                 StorageErrorCode = \"UnsupportedHeader\"\n\tStorageErrorCodeUnsupportedQueryParameter                         StorageErrorCode = \"UnsupportedQueryParameter\"\n\tStorageErrorCodeUnsupportedXMLNode                                StorageErrorCode = \"UnsupportedXmlNode\"\n)\n\n// PossibleStorageErrorCodeValues returns the possible values for the StorageErrorCode const type.\nfunc PossibleStorageErrorCodeValues() []StorageErrorCode {\n\treturn []StorageErrorCode{\n\t\tStorageErrorCodeAccountAlreadyExists,\n\t\tStorageErrorCodeAccountBeingCreated,\n\t\tStorageErrorCodeAccountIsDisabled,\n\t\tStorageErrorCodeAppendPositionConditionNotMet,\n\t\tStorageErrorCodeAuthenticationFailed,\n\t\tStorageErrorCodeAuthorizationFailure,\n\t\tStorageErrorCodeAuthorizationPermissionMismatch,\n\t\tStorageErrorCodeAuthorizationProtocolMismatch,\n\t\tStorageErrorCodeAuthorizationResourceTypeMismatch,\n\t\tStorageErrorCodeAuthorizationServiceMismatch,\n\t\tStorageErrorCodeAuthorizationSourceIPMismatch,\n\t\tStorageErrorCodeBlobAccessTierNotSupportedForAccountType,\n\t\tStorageErrorCodeBlobAlreadyExists,\n\t\tStorageErrorCodeBlobArchived,\n\t\tStorageErrorCodeBlobBeingRehydrated,\n\t\tStorageErrorCodeBlobImmutableDueToPolicy,\n\t\tStorageErrorCodeBlobNotArchived,\n\t\tStorageErrorCodeBlobNotFound,\n\t\tStorageErrorCodeBlobOverwritten,\n\t\tStorageErrorCodeBlobTierInadequateForContentLength,\n\t\tStorageErrorCodeBlobUsesCustomerSpecifiedEncryption,\n\t\tStorageErrorCodeBlockCountExceedsLimit,\n\t\tStorageErrorCodeBlockListTooLong,\n\t\tStorageErrorCodeCannotChangeToLowerTier,\n\t\tStorageErrorCodeCannotVerifyCopySource,\n\t\tStorageErrorCodeConditionHeadersNotSupported,\n\t\tStorageErrorCodeConditionNotMet,\n\t\tStorageErrorCodeContainerAlreadyExists,\n\t\tStorageErrorCodeContainerBeingDeleted,\n\t\tStorageErrorCodeContainerDisabled,\n\t\tStorageErrorCodeContainerNotFound,\n\t\tStorageErrorCodeContentLengthLargerThanTierLimit,\n\t\tStorageErrorCodeCopyAcrossAccountsNotSupported,\n\t\tStorageErrorCodeCopyIDMismatch,\n\t\tStorageErrorCodeEmptyMetadataKey,\n\t\tStorageErrorCodeFeatureVersionMismatch,\n\t\tStorageErrorCodeIncrementalCopyBlobMismatch,\n\t\tStorageErrorCodeIncrementalCopyOfEarlierVersionSnapshotNotAllowed,\n\t\tStorageErrorCodeIncrementalCopySourceMustBeSnapshot,\n\t\tStorageErrorCodeInfiniteLeaseDurationRequired,\n\t\tStorageErrorCodeInsufficientAccountPermissions,\n\t\tStorageErrorCodeInternalError,\n\t\tStorageErrorCodeInvalidAuthenticationInfo,\n\t\tStorageErrorCodeInvalidBlobOrBlock,\n\t\tStorageErrorCodeInvalidBlobTier,\n\t\tStorageErrorCodeInvalidBlobType,\n\t\tStorageErrorCodeInvalidBlockID,\n\t\tStorageErrorCodeInvalidBlockList,\n\t\tStorageErrorCodeInvalidHTTPVerb,\n\t\tStorageErrorCodeInvalidHeaderValue,\n\t\tStorageErrorCodeInvalidInput,\n\t\tStorageErrorCodeInvalidMD5,\n\t\tStorageErrorCodeInvalidMetadata,\n\t\tStorageErrorCodeInvalidOperation,\n\t\tStorageErrorCodeInvalidPageRange,\n\t\tStorageErrorCodeInvalidQueryParameterValue,\n\t\tStorageErrorCodeInvalidRange,\n\t\tStorageErrorCodeInvalidResourceName,\n\t\tStorageErrorCodeInvalidSourceBlobType,\n\t\tStorageErrorCodeInvalidSourceBlobURL,\n\t\tStorageErrorCodeInvalidURI,\n\t\tStorageErrorCodeInvalidVersionForPageBlobOperation,\n\t\tStorageErrorCodeInvalidXMLDocument,\n\t\tStorageErrorCodeInvalidXMLNodeValue,\n\t\tStorageErrorCodeLeaseAlreadyBroken,\n\t\tStorageErrorCodeLeaseAlreadyPresent,\n\t\tStorageErrorCodeLeaseIDMismatchWithBlobOperation,\n\t\tStorageErrorCodeLeaseIDMismatchWithContainerOperation,\n\t\tStorageErrorCodeLeaseIDMismatchWithLeaseOperation,\n\t\tStorageErrorCodeLeaseIDMissing,\n\t\tStorageErrorCodeLeaseIsBreakingAndCannotBeAcquired,\n\t\tStorageErrorCodeLeaseIsBreakingAndCannotBeChanged,\n\t\tStorageErrorCodeLeaseIsBrokenAndCannotBeRenewed,\n\t\tStorageErrorCodeLeaseLost,\n\t\tStorageErrorCodeLeaseNotPresentWithBlobOperation,\n\t\tStorageErrorCodeLeaseNotPresentWithContainerOperation,\n\t\tStorageErrorCodeLeaseNotPresentWithLeaseOperation,\n\t\tStorageErrorCodeMD5Mismatch,\n\t\tStorageErrorCodeMaxBlobSizeConditionNotMet,\n\t\tStorageErrorCodeMetadataTooLarge,\n\t\tStorageErrorCodeMissingContentLengthHeader,\n\t\tStorageErrorCodeMissingRequiredHeader,\n\t\tStorageErrorCodeMissingRequiredQueryParameter,\n\t\tStorageErrorCodeMissingRequiredXMLNode,\n\t\tStorageErrorCodeMultipleConditionHeadersNotSupported,\n\t\tStorageErrorCodeNoAuthenticationInformation,\n\t\tStorageErrorCodeNoPendingCopyOperation,\n\t\tStorageErrorCodeOperationNotAllowedOnIncrementalCopyBlob,\n\t\tStorageErrorCodeOperationTimedOut,\n\t\tStorageErrorCodeOutOfRangeInput,\n\t\tStorageErrorCodeOutOfRangeQueryParameterValue,\n\t\tStorageErrorCodePendingCopyOperation,\n\t\tStorageErrorCodePreviousSnapshotCannotBeNewer,\n\t\tStorageErrorCodePreviousSnapshotNotFound,\n\t\tStorageErrorCodePreviousSnapshotOperationNotSupported,\n\t\tStorageErrorCodeRequestBodyTooLarge,\n\t\tStorageErrorCodeRequestURLFailedToParse,\n\t\tStorageErrorCodeResourceAlreadyExists,\n\t\tStorageErrorCodeResourceNotFound,\n\t\tStorageErrorCodeResourceTypeMismatch,\n\t\tStorageErrorCodeSequenceNumberConditionNotMet,\n\t\tStorageErrorCodeSequenceNumberIncrementTooLarge,\n\t\tStorageErrorCodeServerBusy,\n\t\tStorageErrorCodeSnapshotCountExceeded,\n\t\tStorageErrorCodeSnapshotOperationRateExceeded,\n\t\tStorageErrorCodeSnapshotsPresent,\n\t\tStorageErrorCodeSourceConditionNotMet,\n\t\tStorageErrorCodeSystemInUse,\n\t\tStorageErrorCodeTargetConditionNotMet,\n\t\tStorageErrorCodeUnauthorizedBlobOverwrite,\n\t\tStorageErrorCodeUnsupportedHTTPVerb,\n\t\tStorageErrorCodeUnsupportedHeader,\n\t\tStorageErrorCodeUnsupportedQueryParameter,\n\t\tStorageErrorCodeUnsupportedXMLNode,\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_container_client.go",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n// Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\npackage generated\n\nimport (\n\t\"context\"\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/to\"\n\t\"io\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n)\n\n// ContainerClient contains the methods for the Container group.\n// Don't use this type directly, use a constructor function instead.\ntype ContainerClient struct {\n\tinternal *azcore.Client\n\tendpoint string\n}\n\n// AcquireLease - [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15\n// to 60 seconds, or can be infinite\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - duration - Specifies the duration of the lease, in seconds, or negative one (-1) for a lease that never expires. A non-infinite\n//     lease can be between 15 and 60 seconds. A lease duration cannot be changed using\n//     renew or change.\n//   - options - ContainerClientAcquireLeaseOptions contains the optional parameters for the ContainerClient.AcquireLease method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *ContainerClient) AcquireLease(ctx context.Context, duration int32, options *ContainerClientAcquireLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerClientAcquireLeaseResponse, error) {\n\tvar err error\n\treq, err := client.acquireLeaseCreateRequest(ctx, duration, options, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn ContainerClientAcquireLeaseResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ContainerClientAcquireLeaseResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusCreated) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ContainerClientAcquireLeaseResponse{}, err\n\t}\n\tresp, err := client.acquireLeaseHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// acquireLeaseCreateRequest creates the AcquireLease request.\nfunc (client *ContainerClient) acquireLeaseCreateRequest(ctx context.Context, duration int32, options *ContainerClientAcquireLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"lease\")\n\treqQP.Set(\"restype\", \"container\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-lease-action\"] = []string{\"acquire\"}\n\treq.Raw().Header[\"x-ms-lease-duration\"] = []string{strconv.FormatInt(int64(duration), 10)}\n\tif options != nil && options.ProposedLeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-proposed-lease-id\"] = []string{*options.ProposedLeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// acquireLeaseHandleResponse handles the AcquireLease response.\nfunc (client *ContainerClient) acquireLeaseHandleResponse(resp *http.Response) (ContainerClientAcquireLeaseResponse, error) {\n\tresult := ContainerClientAcquireLeaseResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientAcquireLeaseResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientAcquireLeaseResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-id\"); val != \"\" {\n\t\tresult.LeaseID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// BreakLease - [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15\n// to 60 seconds, or can be infinite\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - ContainerClientBreakLeaseOptions contains the optional parameters for the ContainerClient.BreakLease method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *ContainerClient) BreakLease(ctx context.Context, options *ContainerClientBreakLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerClientBreakLeaseResponse, error) {\n\tvar err error\n\treq, err := client.breakLeaseCreateRequest(ctx, options, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn ContainerClientBreakLeaseResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ContainerClientBreakLeaseResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusAccepted) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ContainerClientBreakLeaseResponse{}, err\n\t}\n\tresp, err := client.breakLeaseHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// breakLeaseCreateRequest creates the BreakLease request.\nfunc (client *ContainerClient) breakLeaseCreateRequest(ctx context.Context, options *ContainerClientBreakLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"lease\")\n\treqQP.Set(\"restype\", \"container\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-lease-action\"] = []string{\"break\"}\n\tif options != nil && options.BreakPeriod != nil {\n\t\treq.Raw().Header[\"x-ms-lease-break-period\"] = []string{strconv.FormatInt(int64(*options.BreakPeriod), 10)}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// breakLeaseHandleResponse handles the BreakLease response.\nfunc (client *ContainerClient) breakLeaseHandleResponse(resp *http.Response) (ContainerClientBreakLeaseResponse, error) {\n\tresult := ContainerClientBreakLeaseResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientBreakLeaseResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientBreakLeaseResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-time\"); val != \"\" {\n\t\tleaseTime32, err := strconv.ParseInt(val, 10, 32)\n\t\tleaseTime := int32(leaseTime32)\n\t\tif err != nil {\n\t\t\treturn ContainerClientBreakLeaseResponse{}, err\n\t\t}\n\t\tresult.LeaseTime = &leaseTime\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// ChangeLease - [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15\n// to 60 seconds, or can be infinite\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - leaseID - Specifies the current lease ID on the resource.\n//   - proposedLeaseID - Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the proposed\n//     lease ID is not in the correct format. See Guid Constructor (String) for a list of valid GUID\n//     string formats.\n//   - options - ContainerClientChangeLeaseOptions contains the optional parameters for the ContainerClient.ChangeLease method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *ContainerClient) ChangeLease(ctx context.Context, leaseID string, proposedLeaseID string, options *ContainerClientChangeLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerClientChangeLeaseResponse, error) {\n\tvar err error\n\treq, err := client.changeLeaseCreateRequest(ctx, leaseID, proposedLeaseID, options, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn ContainerClientChangeLeaseResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ContainerClientChangeLeaseResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ContainerClientChangeLeaseResponse{}, err\n\t}\n\tresp, err := client.changeLeaseHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// changeLeaseCreateRequest creates the ChangeLease request.\nfunc (client *ContainerClient) changeLeaseCreateRequest(ctx context.Context, leaseID string, proposedLeaseID string, options *ContainerClientChangeLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"lease\")\n\treqQP.Set(\"restype\", \"container\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-lease-action\"] = []string{\"change\"}\n\treq.Raw().Header[\"x-ms-lease-id\"] = []string{leaseID}\n\treq.Raw().Header[\"x-ms-proposed-lease-id\"] = []string{proposedLeaseID}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// changeLeaseHandleResponse handles the ChangeLease response.\nfunc (client *ContainerClient) changeLeaseHandleResponse(resp *http.Response) (ContainerClientChangeLeaseResponse, error) {\n\tresult := ContainerClientChangeLeaseResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientChangeLeaseResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientChangeLeaseResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-id\"); val != \"\" {\n\t\tresult.LeaseID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// Create - creates a new container under the specified account. If the container with the same name already exists, the operation\n// fails\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - ContainerClientCreateOptions contains the optional parameters for the ContainerClient.Create method.\n//   - ContainerCPKScopeInfo - ContainerCPKScopeInfo contains a group of parameters for the ContainerClient.Create method.\nfunc (client *ContainerClient) Create(ctx context.Context, options *ContainerClientCreateOptions, containerCPKScopeInfo *ContainerCPKScopeInfo) (ContainerClientCreateResponse, error) {\n\tvar err error\n\treq, err := client.createCreateRequest(ctx, options, containerCPKScopeInfo)\n\tif err != nil {\n\t\treturn ContainerClientCreateResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ContainerClientCreateResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusCreated) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ContainerClientCreateResponse{}, err\n\t}\n\tresp, err := client.createHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// createCreateRequest creates the Create request.\nfunc (client *ContainerClient) createCreateRequest(ctx context.Context, options *ContainerClientCreateOptions, containerCPKScopeInfo *ContainerCPKScopeInfo) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"restype\", \"container\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.Access != nil {\n\t\treq.Raw().Header[\"x-ms-blob-public-access\"] = []string{string(*options.Access)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif containerCPKScopeInfo != nil && containerCPKScopeInfo.DefaultEncryptionScope != nil {\n\t\treq.Raw().Header[\"x-ms-default-encryption-scope\"] = []string{*containerCPKScopeInfo.DefaultEncryptionScope}\n\t}\n\tif containerCPKScopeInfo != nil && containerCPKScopeInfo.PreventEncryptionScopeOverride != nil {\n\t\treq.Raw().Header[\"x-ms-deny-encryption-scope-override\"] = []string{strconv.FormatBool(*containerCPKScopeInfo.PreventEncryptionScopeOverride)}\n\t}\n\tif options != nil && options.Metadata != nil {\n\t\tfor k, v := range options.Metadata {\n\t\t\tif v != nil {\n\t\t\t\treq.Raw().Header[\"x-ms-meta-\"+k] = []string{*v}\n\t\t\t}\n\t\t}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// createHandleResponse handles the Create response.\nfunc (client *ContainerClient) createHandleResponse(resp *http.Response) (ContainerClientCreateResponse, error) {\n\tresult := ContainerClientCreateResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientCreateResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientCreateResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// Delete - operation marks the specified container for deletion. The container and any blobs contained within it are later\n// deleted during garbage collection\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - ContainerClientDeleteOptions contains the optional parameters for the ContainerClient.Delete method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *ContainerClient) Delete(ctx context.Context, options *ContainerClientDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerClientDeleteResponse, error) {\n\tvar err error\n\treq, err := client.deleteCreateRequest(ctx, options, leaseAccessConditions, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn ContainerClientDeleteResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ContainerClientDeleteResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusAccepted) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ContainerClientDeleteResponse{}, err\n\t}\n\tresp, err := client.deleteHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// deleteCreateRequest creates the Delete request.\nfunc (client *ContainerClient) deleteCreateRequest(ctx context.Context, options *ContainerClientDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodDelete, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"restype\", \"container\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// deleteHandleResponse handles the Delete response.\nfunc (client *ContainerClient) deleteHandleResponse(resp *http.Response) (ContainerClientDeleteResponse, error) {\n\tresult := ContainerClientDeleteResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientDeleteResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// FilterBlobs - The Filter Blobs operation enables callers to list blobs in a container whose tags match a given search expression.\n// Filter blobs searches within the given container.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - where - Filters the results to return only to return only blobs whose tags match the specified expression.\n//   - options - ContainerClientFilterBlobsOptions contains the optional parameters for the ContainerClient.FilterBlobs method.\nfunc (client *ContainerClient) FilterBlobs(ctx context.Context, where string, options *ContainerClientFilterBlobsOptions) (ContainerClientFilterBlobsResponse, error) {\n\tvar err error\n\treq, err := client.filterBlobsCreateRequest(ctx, where, options)\n\tif err != nil {\n\t\treturn ContainerClientFilterBlobsResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ContainerClientFilterBlobsResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ContainerClientFilterBlobsResponse{}, err\n\t}\n\tresp, err := client.filterBlobsHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// filterBlobsCreateRequest creates the FilterBlobs request.\nfunc (client *ContainerClient) filterBlobsCreateRequest(ctx context.Context, where string, options *ContainerClientFilterBlobsOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"blobs\")\n\tif options != nil && options.Include != nil {\n\t\treqQP.Set(\"include\", strings.Join(strings.Fields(strings.Trim(fmt.Sprint(options.Include), \"[]\")), \",\"))\n\t}\n\tif options != nil && options.Marker != nil {\n\t\treqQP.Set(\"marker\", *options.Marker)\n\t}\n\tif options != nil && options.Maxresults != nil {\n\t\treqQP.Set(\"maxresults\", strconv.FormatInt(int64(*options.Maxresults), 10))\n\t}\n\treqQP.Set(\"restype\", \"container\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treqQP.Set(\"where\", where)\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// filterBlobsHandleResponse handles the FilterBlobs response.\nfunc (client *ContainerClient) filterBlobsHandleResponse(resp *http.Response) (ContainerClientFilterBlobsResponse, error) {\n\tresult := ContainerClientFilterBlobsResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientFilterBlobsResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif err := runtime.UnmarshalAsXML(resp, &result.FilterBlobSegment); err != nil {\n\t\treturn ContainerClientFilterBlobsResponse{}, err\n\t}\n\treturn result, nil\n}\n\n// GetAccessPolicy - gets the permissions for the specified container. The permissions indicate whether container data may\n// be accessed publicly.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - ContainerClientGetAccessPolicyOptions contains the optional parameters for the ContainerClient.GetAccessPolicy\n//     method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\nfunc (client *ContainerClient) GetAccessPolicy(ctx context.Context, options *ContainerClientGetAccessPolicyOptions, leaseAccessConditions *LeaseAccessConditions) (ContainerClientGetAccessPolicyResponse, error) {\n\tvar err error\n\treq, err := client.getAccessPolicyCreateRequest(ctx, options, leaseAccessConditions)\n\tif err != nil {\n\t\treturn ContainerClientGetAccessPolicyResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ContainerClientGetAccessPolicyResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ContainerClientGetAccessPolicyResponse{}, err\n\t}\n\tresp, err := client.getAccessPolicyHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// getAccessPolicyCreateRequest creates the GetAccessPolicy request.\nfunc (client *ContainerClient) getAccessPolicyCreateRequest(ctx context.Context, options *ContainerClientGetAccessPolicyOptions, leaseAccessConditions *LeaseAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"acl\")\n\treqQP.Set(\"restype\", \"container\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// getAccessPolicyHandleResponse handles the GetAccessPolicy response.\nfunc (client *ContainerClient) getAccessPolicyHandleResponse(resp *http.Response) (ContainerClientGetAccessPolicyResponse, error) {\n\tresult := ContainerClientGetAccessPolicyResponse{}\n\tif val := resp.Header.Get(\"x-ms-blob-public-access\"); val != \"\" {\n\t\tresult.BlobPublicAccess = (*PublicAccessType)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientGetAccessPolicyResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientGetAccessPolicyResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif err := runtime.UnmarshalAsXML(resp, &result); err != nil {\n\t\treturn ContainerClientGetAccessPolicyResponse{}, err\n\t}\n\treturn result, nil\n}\n\n// GetAccountInfo - Returns the sku name and account kind\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - ContainerClientGetAccountInfoOptions contains the optional parameters for the ContainerClient.GetAccountInfo\n//     method.\nfunc (client *ContainerClient) GetAccountInfo(ctx context.Context, options *ContainerClientGetAccountInfoOptions) (ContainerClientGetAccountInfoResponse, error) {\n\tvar err error\n\treq, err := client.getAccountInfoCreateRequest(ctx, options)\n\tif err != nil {\n\t\treturn ContainerClientGetAccountInfoResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ContainerClientGetAccountInfoResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ContainerClientGetAccountInfoResponse{}, err\n\t}\n\tresp, err := client.getAccountInfoHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// getAccountInfoCreateRequest creates the GetAccountInfo request.\nfunc (client *ContainerClient) getAccountInfoCreateRequest(ctx context.Context, options *ContainerClientGetAccountInfoOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"properties\")\n\treqQP.Set(\"restype\", \"account\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// getAccountInfoHandleResponse handles the GetAccountInfo response.\nfunc (client *ContainerClient) getAccountInfoHandleResponse(resp *http.Response) (ContainerClientGetAccountInfoResponse, error) {\n\tresult := ContainerClientGetAccountInfoResponse{}\n\tif val := resp.Header.Get(\"x-ms-account-kind\"); val != \"\" {\n\t\tresult.AccountKind = (*AccountKind)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientGetAccountInfoResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-is-hns-enabled\"); val != \"\" {\n\t\tisHierarchicalNamespaceEnabled, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientGetAccountInfoResponse{}, err\n\t\t}\n\t\tresult.IsHierarchicalNamespaceEnabled = &isHierarchicalNamespaceEnabled\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-sku-name\"); val != \"\" {\n\t\tresult.SKUName = (*SKUName)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// GetProperties - returns all user-defined metadata and system properties for the specified container. The data returned\n// does not include the container's list of blobs\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - ContainerClientGetPropertiesOptions contains the optional parameters for the ContainerClient.GetProperties method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\nfunc (client *ContainerClient) GetProperties(ctx context.Context, options *ContainerClientGetPropertiesOptions, leaseAccessConditions *LeaseAccessConditions) (ContainerClientGetPropertiesResponse, error) {\n\tvar err error\n\treq, err := client.getPropertiesCreateRequest(ctx, options, leaseAccessConditions)\n\tif err != nil {\n\t\treturn ContainerClientGetPropertiesResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ContainerClientGetPropertiesResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ContainerClientGetPropertiesResponse{}, err\n\t}\n\tresp, err := client.getPropertiesHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// getPropertiesCreateRequest creates the GetProperties request.\nfunc (client *ContainerClient) getPropertiesCreateRequest(ctx context.Context, options *ContainerClientGetPropertiesOptions, leaseAccessConditions *LeaseAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"restype\", \"container\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// getPropertiesHandleResponse handles the GetProperties response.\nfunc (client *ContainerClient) getPropertiesHandleResponse(resp *http.Response) (ContainerClientGetPropertiesResponse, error) {\n\tresult := ContainerClientGetPropertiesResponse{}\n\tif val := resp.Header.Get(\"x-ms-blob-public-access\"); val != \"\" {\n\t\tresult.BlobPublicAccess = (*PublicAccessType)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-default-encryption-scope\"); val != \"\" {\n\t\tresult.DefaultEncryptionScope = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-deny-encryption-scope-override\"); val != \"\" {\n\t\tdenyEncryptionScopeOverride, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.DenyEncryptionScopeOverride = &denyEncryptionScopeOverride\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-has-immutability-policy\"); val != \"\" {\n\t\thasImmutabilityPolicy, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.HasImmutabilityPolicy = &hasImmutabilityPolicy\n\t}\n\tif val := resp.Header.Get(\"x-ms-has-legal-hold\"); val != \"\" {\n\t\thasLegalHold, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.HasLegalHold = &hasLegalHold\n\t}\n\tif val := resp.Header.Get(\"x-ms-immutable-storage-with-versioning-enabled\"); val != \"\" {\n\t\tisImmutableStorageWithVersioningEnabled, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.IsImmutableStorageWithVersioningEnabled = &isImmutableStorageWithVersioningEnabled\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientGetPropertiesResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-duration\"); val != \"\" {\n\t\tresult.LeaseDuration = (*LeaseDurationType)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-state\"); val != \"\" {\n\t\tresult.LeaseState = (*LeaseStateType)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-status\"); val != \"\" {\n\t\tresult.LeaseStatus = (*LeaseStatusType)(&val)\n\t}\n\tfor hh := range resp.Header {\n\t\tif len(hh) > len(\"x-ms-meta-\") && strings.EqualFold(hh[:len(\"x-ms-meta-\")], \"x-ms-meta-\") {\n\t\t\tif result.Metadata == nil {\n\t\t\t\tresult.Metadata = map[string]*string{}\n\t\t\t}\n\t\t\tresult.Metadata[hh[len(\"x-ms-meta-\"):]] = to.Ptr(resp.Header.Get(hh))\n\t\t}\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// NewListBlobFlatSegmentPager - [Update] The List Blobs operation returns a list of the blobs under the specified container\n//\n// Generated from API version 2025-01-05\n//   - options - ContainerClientListBlobFlatSegmentOptions contains the optional parameters for the ContainerClient.NewListBlobFlatSegmentPager\n//     method.\n//\n// listBlobFlatSegmentCreateRequest creates the ListBlobFlatSegment request.\nfunc (client *ContainerClient) ListBlobFlatSegmentCreateRequest(ctx context.Context, options *ContainerClientListBlobFlatSegmentOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"list\")\n\tif options != nil && options.Include != nil {\n\t\treqQP.Set(\"include\", strings.Join(strings.Fields(strings.Trim(fmt.Sprint(options.Include), \"[]\")), \",\"))\n\t}\n\tif options != nil && options.Marker != nil {\n\t\treqQP.Set(\"marker\", *options.Marker)\n\t}\n\tif options != nil && options.Maxresults != nil {\n\t\treqQP.Set(\"maxresults\", strconv.FormatInt(int64(*options.Maxresults), 10))\n\t}\n\tif options != nil && options.Prefix != nil {\n\t\treqQP.Set(\"prefix\", *options.Prefix)\n\t}\n\treqQP.Set(\"restype\", \"container\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// listBlobFlatSegmentHandleResponse handles the ListBlobFlatSegment response.\nfunc (client *ContainerClient) ListBlobFlatSegmentHandleResponse(resp *http.Response) (ContainerClientListBlobFlatSegmentResponse, error) {\n\tresult := ContainerClientListBlobFlatSegmentResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Content-Type\"); val != \"\" {\n\t\tresult.ContentType = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientListBlobFlatSegmentResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif err := runtime.UnmarshalAsXML(resp, &result.ListBlobsFlatSegmentResponse); err != nil {\n\t\treturn ContainerClientListBlobFlatSegmentResponse{}, err\n\t}\n\treturn result, nil\n}\n\n// NewListBlobHierarchySegmentPager - [Update] The List Blobs operation returns a list of the blobs under the specified container\n//\n// Generated from API version 2025-01-05\n//   - delimiter - When the request includes this parameter, the operation returns a BlobPrefix element in the response body that\n//     acts as a placeholder for all blobs whose names begin with the same substring up to the\n//     appearance of the delimiter character. The delimiter may be a single character or a string.\n//   - options - ContainerClientListBlobHierarchySegmentOptions contains the optional parameters for the ContainerClient.NewListBlobHierarchySegmentPager\n//     method.\nfunc (client *ContainerClient) NewListBlobHierarchySegmentPager(delimiter string, options *ContainerClientListBlobHierarchySegmentOptions) *runtime.Pager[ContainerClientListBlobHierarchySegmentResponse] {\n\treturn runtime.NewPager(runtime.PagingHandler[ContainerClientListBlobHierarchySegmentResponse]{\n\t\tMore: func(page ContainerClientListBlobHierarchySegmentResponse) bool {\n\t\t\treturn page.NextMarker != nil && len(*page.NextMarker) > 0\n\t\t},\n\t\tFetcher: func(ctx context.Context, page *ContainerClientListBlobHierarchySegmentResponse) (ContainerClientListBlobHierarchySegmentResponse, error) {\n\t\t\tnextLink := \"\"\n\t\t\tif page != nil {\n\t\t\t\tnextLink = *page.NextMarker\n\t\t\t}\n\t\t\tresp, err := runtime.FetcherForNextLink(ctx, client.internal.Pipeline(), nextLink, func(ctx context.Context) (*policy.Request, error) {\n\t\t\t\treturn client.ListBlobHierarchySegmentCreateRequest(ctx, delimiter, options)\n\t\t\t}, nil)\n\t\t\tif err != nil {\n\t\t\t\treturn ContainerClientListBlobHierarchySegmentResponse{}, err\n\t\t\t}\n\t\t\treturn client.ListBlobHierarchySegmentHandleResponse(resp)\n\t\t},\n\t})\n}\n\n// ListBlobHierarchySegmentCreateRequest creates the ListBlobHierarchySegment request.\nfunc (client *ContainerClient) ListBlobHierarchySegmentCreateRequest(ctx context.Context, delimiter string, options *ContainerClientListBlobHierarchySegmentOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"list\")\n\treqQP.Set(\"delimiter\", delimiter)\n\tif options != nil && options.Include != nil {\n\t\treqQP.Set(\"include\", strings.Join(strings.Fields(strings.Trim(fmt.Sprint(options.Include), \"[]\")), \",\"))\n\t}\n\tif options != nil && options.Marker != nil {\n\t\treqQP.Set(\"marker\", *options.Marker)\n\t}\n\tif options != nil && options.Maxresults != nil {\n\t\treqQP.Set(\"maxresults\", strconv.FormatInt(int64(*options.Maxresults), 10))\n\t}\n\tif options != nil && options.Prefix != nil {\n\t\treqQP.Set(\"prefix\", *options.Prefix)\n\t}\n\treqQP.Set(\"restype\", \"container\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// ListBlobHierarchySegmentHandleResponse handles the ListBlobHierarchySegment response.\nfunc (client *ContainerClient) ListBlobHierarchySegmentHandleResponse(resp *http.Response) (ContainerClientListBlobHierarchySegmentResponse, error) {\n\tresult := ContainerClientListBlobHierarchySegmentResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Content-Type\"); val != \"\" {\n\t\tresult.ContentType = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientListBlobHierarchySegmentResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif err := runtime.UnmarshalAsXML(resp, &result.ListBlobsHierarchySegmentResponse); err != nil {\n\t\treturn ContainerClientListBlobHierarchySegmentResponse{}, err\n\t}\n\treturn result, nil\n}\n\n// ReleaseLease - [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15\n// to 60 seconds, or can be infinite\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - leaseID - Specifies the current lease ID on the resource.\n//   - options - ContainerClientReleaseLeaseOptions contains the optional parameters for the ContainerClient.ReleaseLease method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *ContainerClient) ReleaseLease(ctx context.Context, leaseID string, options *ContainerClientReleaseLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerClientReleaseLeaseResponse, error) {\n\tvar err error\n\treq, err := client.releaseLeaseCreateRequest(ctx, leaseID, options, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn ContainerClientReleaseLeaseResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ContainerClientReleaseLeaseResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ContainerClientReleaseLeaseResponse{}, err\n\t}\n\tresp, err := client.releaseLeaseHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// releaseLeaseCreateRequest creates the ReleaseLease request.\nfunc (client *ContainerClient) releaseLeaseCreateRequest(ctx context.Context, leaseID string, options *ContainerClientReleaseLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"lease\")\n\treqQP.Set(\"restype\", \"container\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-lease-action\"] = []string{\"release\"}\n\treq.Raw().Header[\"x-ms-lease-id\"] = []string{leaseID}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// releaseLeaseHandleResponse handles the ReleaseLease response.\nfunc (client *ContainerClient) releaseLeaseHandleResponse(resp *http.Response) (ContainerClientReleaseLeaseResponse, error) {\n\tresult := ContainerClientReleaseLeaseResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientReleaseLeaseResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientReleaseLeaseResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// Rename - Renames an existing container.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - sourceContainerName - Required. Specifies the name of the container to rename.\n//   - options - ContainerClientRenameOptions contains the optional parameters for the ContainerClient.Rename method.\nfunc (client *ContainerClient) Rename(ctx context.Context, sourceContainerName string, options *ContainerClientRenameOptions) (ContainerClientRenameResponse, error) {\n\tvar err error\n\treq, err := client.renameCreateRequest(ctx, sourceContainerName, options)\n\tif err != nil {\n\t\treturn ContainerClientRenameResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ContainerClientRenameResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ContainerClientRenameResponse{}, err\n\t}\n\tresp, err := client.renameHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// renameCreateRequest creates the Rename request.\nfunc (client *ContainerClient) renameCreateRequest(ctx context.Context, sourceContainerName string, options *ContainerClientRenameOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"rename\")\n\treqQP.Set(\"restype\", \"container\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-source-container-name\"] = []string{sourceContainerName}\n\tif options != nil && options.SourceLeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-source-lease-id\"] = []string{*options.SourceLeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// renameHandleResponse handles the Rename response.\nfunc (client *ContainerClient) renameHandleResponse(resp *http.Response) (ContainerClientRenameResponse, error) {\n\tresult := ContainerClientRenameResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientRenameResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// RenewLease - [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15\n// to 60 seconds, or can be infinite\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - leaseID - Specifies the current lease ID on the resource.\n//   - options - ContainerClientRenewLeaseOptions contains the optional parameters for the ContainerClient.RenewLease method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *ContainerClient) RenewLease(ctx context.Context, leaseID string, options *ContainerClientRenewLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerClientRenewLeaseResponse, error) {\n\tvar err error\n\treq, err := client.renewLeaseCreateRequest(ctx, leaseID, options, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn ContainerClientRenewLeaseResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ContainerClientRenewLeaseResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ContainerClientRenewLeaseResponse{}, err\n\t}\n\tresp, err := client.renewLeaseHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// renewLeaseCreateRequest creates the RenewLease request.\nfunc (client *ContainerClient) renewLeaseCreateRequest(ctx context.Context, leaseID string, options *ContainerClientRenewLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"lease\")\n\treqQP.Set(\"restype\", \"container\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-lease-action\"] = []string{\"renew\"}\n\treq.Raw().Header[\"x-ms-lease-id\"] = []string{leaseID}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// renewLeaseHandleResponse handles the RenewLease response.\nfunc (client *ContainerClient) renewLeaseHandleResponse(resp *http.Response) (ContainerClientRenewLeaseResponse, error) {\n\tresult := ContainerClientRenewLeaseResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientRenewLeaseResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientRenewLeaseResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-lease-id\"); val != \"\" {\n\t\tresult.LeaseID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// Restore - Restores a previously-deleted container.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - ContainerClientRestoreOptions contains the optional parameters for the ContainerClient.Restore method.\nfunc (client *ContainerClient) Restore(ctx context.Context, options *ContainerClientRestoreOptions) (ContainerClientRestoreResponse, error) {\n\tvar err error\n\treq, err := client.restoreCreateRequest(ctx, options)\n\tif err != nil {\n\t\treturn ContainerClientRestoreResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ContainerClientRestoreResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusCreated) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ContainerClientRestoreResponse{}, err\n\t}\n\tresp, err := client.restoreHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// restoreCreateRequest creates the Restore request.\nfunc (client *ContainerClient) restoreCreateRequest(ctx context.Context, options *ContainerClientRestoreOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"undelete\")\n\treqQP.Set(\"restype\", \"container\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif options != nil && options.DeletedContainerName != nil {\n\t\treq.Raw().Header[\"x-ms-deleted-container-name\"] = []string{*options.DeletedContainerName}\n\t}\n\tif options != nil && options.DeletedContainerVersion != nil {\n\t\treq.Raw().Header[\"x-ms-deleted-container-version\"] = []string{*options.DeletedContainerVersion}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// restoreHandleResponse handles the Restore response.\nfunc (client *ContainerClient) restoreHandleResponse(resp *http.Response) (ContainerClientRestoreResponse, error) {\n\tresult := ContainerClientRestoreResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientRestoreResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// SetAccessPolicy - sets the permissions for the specified container. The permissions indicate whether blobs in a container\n// may be accessed publicly.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - containerACL - the acls for the container\n//   - options - ContainerClientSetAccessPolicyOptions contains the optional parameters for the ContainerClient.SetAccessPolicy\n//     method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *ContainerClient) SetAccessPolicy(ctx context.Context, containerACL []*SignedIdentifier, options *ContainerClientSetAccessPolicyOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerClientSetAccessPolicyResponse, error) {\n\tvar err error\n\treq, err := client.setAccessPolicyCreateRequest(ctx, containerACL, options, leaseAccessConditions, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn ContainerClientSetAccessPolicyResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ContainerClientSetAccessPolicyResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ContainerClientSetAccessPolicyResponse{}, err\n\t}\n\tresp, err := client.setAccessPolicyHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// setAccessPolicyCreateRequest creates the SetAccessPolicy request.\nfunc (client *ContainerClient) setAccessPolicyCreateRequest(ctx context.Context, containerACL []*SignedIdentifier, options *ContainerClientSetAccessPolicyOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"acl\")\n\treqQP.Set(\"restype\", \"container\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.Access != nil {\n\t\treq.Raw().Header[\"x-ms-blob-public-access\"] = []string{string(*options.Access)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\ttype wrapper struct {\n\t\tXMLName      xml.Name             `xml:\"SignedIdentifiers\"`\n\t\tContainerACL *[]*SignedIdentifier `xml:\"SignedIdentifier\"`\n\t}\n\tif err := runtime.MarshalAsXML(req, wrapper{ContainerACL: &containerACL}); err != nil {\n\t\treturn nil, err\n\t}\n\treturn req, nil\n}\n\n// setAccessPolicyHandleResponse handles the SetAccessPolicy response.\nfunc (client *ContainerClient) setAccessPolicyHandleResponse(resp *http.Response) (ContainerClientSetAccessPolicyResponse, error) {\n\tresult := ContainerClientSetAccessPolicyResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientSetAccessPolicyResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientSetAccessPolicyResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// SetMetadata - operation sets one or more user-defined name-value pairs for the specified container.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - ContainerClientSetMetadataOptions contains the optional parameters for the ContainerClient.SetMetadata method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *ContainerClient) SetMetadata(ctx context.Context, options *ContainerClientSetMetadataOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerClientSetMetadataResponse, error) {\n\tvar err error\n\treq, err := client.setMetadataCreateRequest(ctx, options, leaseAccessConditions, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn ContainerClientSetMetadataResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ContainerClientSetMetadataResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ContainerClientSetMetadataResponse{}, err\n\t}\n\tresp, err := client.setMetadataHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// setMetadataCreateRequest creates the SetMetadata request.\nfunc (client *ContainerClient) setMetadataCreateRequest(ctx context.Context, options *ContainerClientSetMetadataOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"metadata\")\n\treqQP.Set(\"restype\", \"container\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\tif options != nil && options.Metadata != nil {\n\t\tfor k, v := range options.Metadata {\n\t\t\tif v != nil {\n\t\t\t\treq.Raw().Header[\"x-ms-meta-\"+k] = []string{*v}\n\t\t\t}\n\t\t}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// setMetadataHandleResponse handles the SetMetadata response.\nfunc (client *ContainerClient) setMetadataHandleResponse(resp *http.Response) (ContainerClientSetMetadataResponse, error) {\n\tresult := ContainerClientSetMetadataResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientSetMetadataResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ContainerClientSetMetadataResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// SubmitBatch - The Batch operation allows multiple API calls to be embedded into a single HTTP request.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - contentLength - The length of the request.\n//   - multipartContentType - Required. The value of this header must be multipart/mixed with a batch boundary. Example header\n//     value: multipart/mixed; boundary=batch_\n//   - body - Initial data\n//   - options - ContainerClientSubmitBatchOptions contains the optional parameters for the ContainerClient.SubmitBatch method.\nfunc (client *ContainerClient) SubmitBatch(ctx context.Context, contentLength int64, multipartContentType string, body io.ReadSeekCloser, options *ContainerClientSubmitBatchOptions) (ContainerClientSubmitBatchResponse, error) {\n\tvar err error\n\treq, err := client.submitBatchCreateRequest(ctx, contentLength, multipartContentType, body, options)\n\tif err != nil {\n\t\treturn ContainerClientSubmitBatchResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ContainerClientSubmitBatchResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusAccepted) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ContainerClientSubmitBatchResponse{}, err\n\t}\n\tresp, err := client.submitBatchHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// submitBatchCreateRequest creates the SubmitBatch request.\nfunc (client *ContainerClient) submitBatchCreateRequest(ctx context.Context, contentLength int64, multipartContentType string, body io.ReadSeekCloser, options *ContainerClientSubmitBatchOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPost, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"batch\")\n\treqQP.Set(\"restype\", \"container\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\truntime.SkipBodyDownload(req)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\treq.Raw().Header[\"Content-Length\"] = []string{strconv.FormatInt(contentLength, 10)}\n\treq.Raw().Header[\"Content-Type\"] = []string{multipartContentType}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\tif err := req.SetBody(body, multipartContentType); err != nil {\n\t\treturn nil, err\n\t}\n\treturn req, nil\n}\n\n// submitBatchHandleResponse handles the SubmitBatch response.\nfunc (client *ContainerClient) submitBatchHandleResponse(resp *http.Response) (ContainerClientSubmitBatchResponse, error) {\n\tresult := ContainerClientSubmitBatchResponse{Body: resp.Body}\n\tif val := resp.Header.Get(\"Content-Type\"); val != \"\" {\n\t\tresult.ContentType = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_models.go",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n// Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\npackage generated\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"time\"\n)\n\n// AccessPolicy - An Access policy\ntype AccessPolicy struct {\n\t// the date-time the policy expires\n\tExpiry *time.Time `xml:\"Expiry\"`\n\n\t// the permissions for the acl policy\n\tPermission *string `xml:\"Permission\"`\n\n\t// the date-time the policy is active\n\tStart *time.Time `xml:\"Start\"`\n}\n\n// ArrowConfiguration - Groups the settings used for formatting the response if the response should be Arrow formatted.\ntype ArrowConfiguration struct {\n\t// REQUIRED\n\tSchema []*ArrowField `xml:\"Schema>Field\"`\n}\n\n// ArrowField - Groups settings regarding specific field of an arrow schema\ntype ArrowField struct {\n\t// REQUIRED\n\tType      *string `xml:\"Type\"`\n\tName      *string `xml:\"Name\"`\n\tPrecision *int32  `xml:\"Precision\"`\n\tScale     *int32  `xml:\"Scale\"`\n}\n\ntype BlobFlatListSegment struct {\n\t// REQUIRED\n\tBlobItems []*BlobItem `xml:\"Blob\"`\n}\n\ntype BlobHierarchyListSegment struct {\n\t// REQUIRED\n\tBlobItems    []*BlobItem   `xml:\"Blob\"`\n\tBlobPrefixes []*BlobPrefix `xml:\"BlobPrefix\"`\n}\n\n// BlobItem - An Azure Storage blob\ntype BlobItem struct {\n\t// REQUIRED\n\tDeleted *bool `xml:\"Deleted\"`\n\n\t// REQUIRED\n\tName *string `xml:\"Name\"`\n\n\t// REQUIRED; Properties of a blob\n\tProperties *BlobProperties `xml:\"Properties\"`\n\n\t// REQUIRED\n\tSnapshot *string `xml:\"Snapshot\"`\n\n\t// Blob tags\n\tBlobTags         *BlobTags `xml:\"Tags\"`\n\tHasVersionsOnly  *bool     `xml:\"HasVersionsOnly\"`\n\tIsCurrentVersion *bool     `xml:\"IsCurrentVersion\"`\n\n\t// Dictionary of\n\tMetadata map[string]*string `xml:\"Metadata\"`\n\n\t// Dictionary of\n\tOrMetadata map[string]*string `xml:\"OrMetadata\"`\n\tVersionID  *string            `xml:\"VersionId\"`\n}\n\ntype BlobName struct {\n\t// The name of the blob.\n\tContent *string `xml:\",chardata\"`\n\n\t// Indicates if the blob name is encoded.\n\tEncoded *bool `xml:\"Encoded,attr\"`\n}\n\ntype BlobPrefix struct {\n\t// REQUIRED\n\tName *string `xml:\"Name\"`\n\n\t// Properties of a blob\n\tProperties *BlobProperties `xml:\"Properties\"`\n}\n\n// BlobProperties - Properties of a blob\ntype BlobProperties struct {\n\t// REQUIRED\n\tETag *azcore.ETag `xml:\"Etag\"`\n\n\t// REQUIRED\n\tLastModified         *time.Time     `xml:\"Last-Modified\"`\n\tACL                  *string        `xml:\"Acl\"`\n\tAccessTier           *AccessTier    `xml:\"AccessTier\"`\n\tAccessTierChangeTime *time.Time     `xml:\"AccessTierChangeTime\"`\n\tAccessTierInferred   *bool          `xml:\"AccessTierInferred\"`\n\tArchiveStatus        *ArchiveStatus `xml:\"ArchiveStatus\"`\n\tBlobSequenceNumber   *int64         `xml:\"x-ms-blob-sequence-number\"`\n\tBlobType             *BlobType      `xml:\"BlobType\"`\n\tCacheControl         *string        `xml:\"Cache-Control\"`\n\tContentDisposition   *string        `xml:\"Content-Disposition\"`\n\tContentEncoding      *string        `xml:\"Content-Encoding\"`\n\tContentLanguage      *string        `xml:\"Content-Language\"`\n\n\t// Size in bytes\n\tContentLength             *int64          `xml:\"Content-Length\"`\n\tContentMD5                []byte          `xml:\"Content-MD5\"`\n\tContentType               *string         `xml:\"Content-Type\"`\n\tCopyCompletionTime        *time.Time      `xml:\"CopyCompletionTime\"`\n\tCopyID                    *string         `xml:\"CopyId\"`\n\tCopyProgress              *string         `xml:\"CopyProgress\"`\n\tCopySource                *string         `xml:\"CopySource\"`\n\tCopyStatus                *CopyStatusType `xml:\"CopyStatus\"`\n\tCopyStatusDescription     *string         `xml:\"CopyStatusDescription\"`\n\tCreationTime              *time.Time      `xml:\"Creation-Time\"`\n\tCustomerProvidedKeySHA256 *string         `xml:\"CustomerProvidedKeySha256\"`\n\tDeletedTime               *time.Time      `xml:\"DeletedTime\"`\n\tDestinationSnapshot       *string         `xml:\"DestinationSnapshot\"`\n\n\t// The name of the encryption scope under which the blob is encrypted.\n\tEncryptionScope             *string                 `xml:\"EncryptionScope\"`\n\tExpiresOn                   *time.Time              `xml:\"Expiry-Time\"`\n\tGroup                       *string                 `xml:\"Group\"`\n\tImmutabilityPolicyExpiresOn *time.Time              `xml:\"ImmutabilityPolicyUntilDate\"`\n\tImmutabilityPolicyMode      *ImmutabilityPolicyMode `xml:\"ImmutabilityPolicyMode\"`\n\tIncrementalCopy             *bool                   `xml:\"IncrementalCopy\"`\n\tIsSealed                    *bool                   `xml:\"Sealed\"`\n\tLastAccessedOn              *time.Time              `xml:\"LastAccessTime\"`\n\tLeaseDuration               *LeaseDurationType      `xml:\"LeaseDuration\"`\n\tLeaseState                  *LeaseStateType         `xml:\"LeaseState\"`\n\tLeaseStatus                 *LeaseStatusType        `xml:\"LeaseStatus\"`\n\tLegalHold                   *bool                   `xml:\"LegalHold\"`\n\tOwner                       *string                 `xml:\"Owner\"`\n\tPermissions                 *string                 `xml:\"Permissions\"`\n\n\t// If an object is in rehydrate pending state then this header is returned with priority of rehydrate. Valid values are High\n\t// and Standard.\n\tRehydratePriority      *RehydratePriority `xml:\"RehydratePriority\"`\n\tRemainingRetentionDays *int32             `xml:\"RemainingRetentionDays\"`\n\tResourceType           *string            `xml:\"ResourceType\"`\n\tServerEncrypted        *bool              `xml:\"ServerEncrypted\"`\n\tTagCount               *int32             `xml:\"TagCount\"`\n}\n\ntype BlobTag struct {\n\t// REQUIRED\n\tKey *string `xml:\"Key\"`\n\n\t// REQUIRED\n\tValue *string `xml:\"Value\"`\n}\n\n// BlobTags - Blob tags\ntype BlobTags struct {\n\t// REQUIRED\n\tBlobTagSet []*BlobTag `xml:\"TagSet>Tag\"`\n}\n\n// Block - Represents a single block in a block blob. It describes the block's ID and size.\ntype Block struct {\n\t// REQUIRED; The base64 encoded block ID.\n\tName *string `xml:\"Name\"`\n\n\t// REQUIRED; The block size in bytes.\n\tSize *int64 `xml:\"Size\"`\n}\n\ntype BlockList struct {\n\tCommittedBlocks   []*Block `xml:\"CommittedBlocks>Block\"`\n\tUncommittedBlocks []*Block `xml:\"UncommittedBlocks>Block\"`\n}\n\ntype BlockLookupList struct {\n\tCommitted   []*string `xml:\"Committed\"`\n\tLatest      []*string `xml:\"Latest\"`\n\tUncommitted []*string `xml:\"Uncommitted\"`\n}\n\ntype ClearRange struct {\n\t// REQUIRED\n\tEnd *int64 `xml:\"End\"`\n\n\t// REQUIRED\n\tStart *int64 `xml:\"Start\"`\n}\n\n// ContainerItem - An Azure Storage container\ntype ContainerItem struct {\n\t// REQUIRED\n\tName *string `xml:\"Name\"`\n\n\t// REQUIRED; Properties of a container\n\tProperties *ContainerProperties `xml:\"Properties\"`\n\tDeleted    *bool                `xml:\"Deleted\"`\n\n\t// Dictionary of\n\tMetadata map[string]*string `xml:\"Metadata\"`\n\tVersion  *string            `xml:\"Version\"`\n}\n\n// ContainerProperties - Properties of a container\ntype ContainerProperties struct {\n\t// REQUIRED\n\tETag *azcore.ETag `xml:\"Etag\"`\n\n\t// REQUIRED\n\tLastModified           *time.Time `xml:\"Last-Modified\"`\n\tDefaultEncryptionScope *string    `xml:\"DefaultEncryptionScope\"`\n\tDeletedTime            *time.Time `xml:\"DeletedTime\"`\n\tHasImmutabilityPolicy  *bool      `xml:\"HasImmutabilityPolicy\"`\n\tHasLegalHold           *bool      `xml:\"HasLegalHold\"`\n\n\t// Indicates if version level worm is enabled on this container.\n\tIsImmutableStorageWithVersioningEnabled *bool              `xml:\"ImmutableStorageWithVersioningEnabled\"`\n\tLeaseDuration                           *LeaseDurationType `xml:\"LeaseDuration\"`\n\tLeaseState                              *LeaseStateType    `xml:\"LeaseState\"`\n\tLeaseStatus                             *LeaseStatusType   `xml:\"LeaseStatus\"`\n\tPreventEncryptionScopeOverride          *bool              `xml:\"DenyEncryptionScopeOverride\"`\n\tPublicAccess                            *PublicAccessType  `xml:\"PublicAccess\"`\n\tRemainingRetentionDays                  *int32             `xml:\"RemainingRetentionDays\"`\n}\n\n// CORSRule - CORS is an HTTP feature that enables a web application running under one domain to access resources in another\n// domain. Web browsers implement a security restriction known as same-origin policy that\n// prevents a web page from calling APIs in a different domain; CORS provides a secure way to allow one domain (the origin\n// domain) to call APIs in another domain\ntype CORSRule struct {\n\t// REQUIRED; the request headers that the origin domain may specify on the CORS request.\n\tAllowedHeaders *string `xml:\"AllowedHeaders\"`\n\n\t// REQUIRED; The methods (HTTP request verbs) that the origin domain may use for a CORS request. (comma separated)\n\tAllowedMethods *string `xml:\"AllowedMethods\"`\n\n\t// REQUIRED; The origin domains that are permitted to make a request against the storage service via CORS. The origin domain\n\t// is the domain from which the request originates. Note that the origin must be an exact\n\t// case-sensitive match with the origin that the user age sends to the service. You can also use the wildcard character '*'\n\t// to allow all origin domains to make requests via CORS.\n\tAllowedOrigins *string `xml:\"AllowedOrigins\"`\n\n\t// REQUIRED; The response headers that may be sent in the response to the CORS request and exposed by the browser to the request\n\t// issuer\n\tExposedHeaders *string `xml:\"ExposedHeaders\"`\n\n\t// REQUIRED; The maximum amount time that a browser should cache the preflight OPTIONS request.\n\tMaxAgeInSeconds *int32 `xml:\"MaxAgeInSeconds\"`\n}\n\n// DelimitedTextConfiguration - Groups the settings used for interpreting the blob data if the blob is delimited text formatted.\ntype DelimitedTextConfiguration struct {\n\t// The string used to separate columns.\n\tColumnSeparator *string `xml:\"ColumnSeparator\"`\n\n\t// The string used as an escape character.\n\tEscapeChar *string `xml:\"EscapeChar\"`\n\n\t// The string used to quote a specific field.\n\tFieldQuote *string `xml:\"FieldQuote\"`\n\n\t// Represents whether the data has headers.\n\tHeadersPresent *bool `xml:\"HasHeaders\"`\n\n\t// The string used to separate records.\n\tRecordSeparator *string `xml:\"RecordSeparator\"`\n}\n\n// FilterBlobItem - Blob info from a Filter Blobs API call\ntype FilterBlobItem struct {\n\t// REQUIRED\n\tContainerName *string `xml:\"ContainerName\"`\n\n\t// REQUIRED\n\tName             *string `xml:\"Name\"`\n\tIsCurrentVersion *bool   `xml:\"IsCurrentVersion\"`\n\n\t// Blob tags\n\tTags      *BlobTags `xml:\"Tags\"`\n\tVersionID *string   `xml:\"VersionId\"`\n}\n\n// FilterBlobSegment - The result of a Filter Blobs API call\ntype FilterBlobSegment struct {\n\t// REQUIRED\n\tBlobs []*FilterBlobItem `xml:\"Blobs>Blob\"`\n\n\t// REQUIRED\n\tServiceEndpoint *string `xml:\"ServiceEndpoint,attr\"`\n\n\t// REQUIRED\n\tWhere      *string `xml:\"Where\"`\n\tNextMarker *string `xml:\"NextMarker\"`\n}\n\n// GeoReplication - Geo-Replication information for the Secondary Storage Service\ntype GeoReplication struct {\n\t// REQUIRED; A GMT date/time value, to the second. All primary writes preceding this value are guaranteed to be available\n\t// for read operations at the secondary. Primary writes after this point in time may or may\n\t// not be available for reads.\n\tLastSyncTime *time.Time `xml:\"LastSyncTime\"`\n\n\t// REQUIRED; The status of the secondary location\n\tStatus *BlobGeoReplicationStatus `xml:\"Status\"`\n}\n\n// JSONTextConfiguration - json text configuration\ntype JSONTextConfiguration struct {\n\t// The string used to separate records.\n\tRecordSeparator *string `xml:\"RecordSeparator\"`\n}\n\n// KeyInfo - Key information\ntype KeyInfo struct {\n\t// REQUIRED; The date-time the key expires in ISO 8601 UTC time\n\tExpiry *string `xml:\"Expiry\"`\n\n\t// REQUIRED; The date-time the key is active in ISO 8601 UTC time\n\tStart *string `xml:\"Start\"`\n}\n\n// ListBlobsFlatSegmentResponse - An enumeration of blobs\ntype ListBlobsFlatSegmentResponse struct {\n\t// REQUIRED\n\tContainerName *string `xml:\"ContainerName,attr\"`\n\n\t// REQUIRED\n\tSegment *BlobFlatListSegment `xml:\"Blobs\"`\n\n\t// REQUIRED\n\tServiceEndpoint *string `xml:\"ServiceEndpoint,attr\"`\n\tMarker          *string `xml:\"Marker\"`\n\tMaxResults      *int32  `xml:\"MaxResults\"`\n\tNextMarker      *string `xml:\"NextMarker\"`\n\tPrefix          *string `xml:\"Prefix\"`\n}\n\n// ListBlobsHierarchySegmentResponse - An enumeration of blobs\ntype ListBlobsHierarchySegmentResponse struct {\n\t// REQUIRED\n\tContainerName *string `xml:\"ContainerName,attr\"`\n\n\t// REQUIRED\n\tSegment *BlobHierarchyListSegment `xml:\"Blobs\"`\n\n\t// REQUIRED\n\tServiceEndpoint *string `xml:\"ServiceEndpoint,attr\"`\n\tDelimiter       *string `xml:\"Delimiter\"`\n\tMarker          *string `xml:\"Marker\"`\n\tMaxResults      *int32  `xml:\"MaxResults\"`\n\tNextMarker      *string `xml:\"NextMarker\"`\n\tPrefix          *string `xml:\"Prefix\"`\n}\n\n// ListContainersSegmentResponse - An enumeration of containers\ntype ListContainersSegmentResponse struct {\n\t// REQUIRED\n\tContainerItems []*ContainerItem `xml:\"Containers>Container\"`\n\n\t// REQUIRED\n\tServiceEndpoint *string `xml:\"ServiceEndpoint,attr\"`\n\tMarker          *string `xml:\"Marker\"`\n\tMaxResults      *int32  `xml:\"MaxResults\"`\n\tNextMarker      *string `xml:\"NextMarker\"`\n\tPrefix          *string `xml:\"Prefix\"`\n}\n\n// Logging - Azure Analytics Logging settings.\ntype Logging struct {\n\t// REQUIRED; Indicates whether all delete requests should be logged.\n\tDelete *bool `xml:\"Delete\"`\n\n\t// REQUIRED; Indicates whether all read requests should be logged.\n\tRead *bool `xml:\"Read\"`\n\n\t// REQUIRED; the retention policy which determines how long the associated data should persist\n\tRetentionPolicy *RetentionPolicy `xml:\"RetentionPolicy\"`\n\n\t// REQUIRED; The version of Storage Analytics to configure.\n\tVersion *string `xml:\"Version\"`\n\n\t// REQUIRED; Indicates whether all write requests should be logged.\n\tWrite *bool `xml:\"Write\"`\n}\n\n// Metrics - a summary of request statistics grouped by API in hour or minute aggregates for blobs\ntype Metrics struct {\n\t// REQUIRED; Indicates whether metrics are enabled for the Blob service.\n\tEnabled *bool `xml:\"Enabled\"`\n\n\t// Indicates whether metrics should generate summary statistics for called API operations.\n\tIncludeAPIs *bool `xml:\"IncludeAPIs\"`\n\n\t// the retention policy which determines how long the associated data should persist\n\tRetentionPolicy *RetentionPolicy `xml:\"RetentionPolicy\"`\n\n\t// The version of Storage Analytics to configure.\n\tVersion *string `xml:\"Version\"`\n}\n\n// PageList - the list of pages\ntype PageList struct {\n\tClearRange []*ClearRange `xml:\"ClearRange\"`\n\tNextMarker *string       `xml:\"NextMarker\"`\n\tPageRange  []*PageRange  `xml:\"PageRange\"`\n}\n\ntype PageRange struct {\n\t// REQUIRED\n\tEnd *int64 `xml:\"End\"`\n\n\t// REQUIRED\n\tStart *int64 `xml:\"Start\"`\n}\n\ntype QueryFormat struct {\n\t// REQUIRED; The quick query format type.\n\tType *QueryFormatType `xml:\"Type\"`\n\n\t// Groups the settings used for formatting the response if the response should be Arrow formatted.\n\tArrowConfiguration *ArrowConfiguration `xml:\"ArrowConfiguration\"`\n\n\t// Groups the settings used for interpreting the blob data if the blob is delimited text formatted.\n\tDelimitedTextConfiguration *DelimitedTextConfiguration `xml:\"DelimitedTextConfiguration\"`\n\n\t// json text configuration\n\tJSONTextConfiguration *JSONTextConfiguration `xml:\"JsonTextConfiguration\"`\n\n\t// parquet configuration\n\tParquetTextConfiguration any `xml:\"ParquetTextConfiguration\"`\n}\n\n// QueryRequest - Groups the set of query request settings.\ntype QueryRequest struct {\n\t// REQUIRED; The query expression in SQL. The maximum size of the query expression is 256KiB.\n\tExpression *string `xml:\"Expression\"`\n\n\t// CONSTANT; Required. The type of the provided query expression.\n\t// Field has constant value \"SQL\", any specified value is ignored.\n\tQueryType           *string             `xml:\"QueryType\"`\n\tInputSerialization  *QuerySerialization `xml:\"InputSerialization\"`\n\tOutputSerialization *QuerySerialization `xml:\"OutputSerialization\"`\n}\n\ntype QuerySerialization struct {\n\t// REQUIRED\n\tFormat *QueryFormat `xml:\"Format\"`\n}\n\n// RetentionPolicy - the retention policy which determines how long the associated data should persist\ntype RetentionPolicy struct {\n\t// REQUIRED; Indicates whether a retention policy is enabled for the storage service\n\tEnabled *bool `xml:\"Enabled\"`\n\n\t// Indicates whether permanent delete is allowed on this storage account.\n\tAllowPermanentDelete *bool `xml:\"AllowPermanentDelete\"`\n\n\t// Indicates the number of days that metrics or logging or soft-deleted data should be retained. All data older than this\n\t// value will be deleted\n\tDays *int32 `xml:\"Days\"`\n}\n\n// SignedIdentifier - signed identifier\ntype SignedIdentifier struct {\n\t// REQUIRED; An Access policy\n\tAccessPolicy *AccessPolicy `xml:\"AccessPolicy\"`\n\n\t// REQUIRED; a unique id\n\tID *string `xml:\"Id\"`\n}\n\n// StaticWebsite - The properties that enable an account to host a static website\ntype StaticWebsite struct {\n\t// REQUIRED; Indicates whether this account is hosting a static website\n\tEnabled *bool `xml:\"Enabled\"`\n\n\t// Absolute path of the default index page\n\tDefaultIndexDocumentPath *string `xml:\"DefaultIndexDocumentPath\"`\n\n\t// The absolute path of the custom 404 page\n\tErrorDocument404Path *string `xml:\"ErrorDocument404Path\"`\n\n\t// The default name of the index page under each directory\n\tIndexDocument *string `xml:\"IndexDocument\"`\n}\n\ntype StorageError struct {\n\tMessage *string\n}\n\n// StorageServiceProperties - Storage Service Properties.\ntype StorageServiceProperties struct {\n\t// The set of CORS rules.\n\tCORS []*CORSRule `xml:\"Cors>CorsRule\"`\n\n\t// The default version to use for requests to the Blob service if an incoming request's version is not specified. Possible\n\t// values include version 2008-10-27 and all more recent versions\n\tDefaultServiceVersion *string `xml:\"DefaultServiceVersion\"`\n\n\t// the retention policy which determines how long the associated data should persist\n\tDeleteRetentionPolicy *RetentionPolicy `xml:\"DeleteRetentionPolicy\"`\n\n\t// a summary of request statistics grouped by API in hour or minute aggregates for blobs\n\tHourMetrics *Metrics `xml:\"HourMetrics\"`\n\n\t// Azure Analytics Logging settings.\n\tLogging *Logging `xml:\"Logging\"`\n\n\t// a summary of request statistics grouped by API in hour or minute aggregates for blobs\n\tMinuteMetrics *Metrics `xml:\"MinuteMetrics\"`\n\n\t// The properties that enable an account to host a static website\n\tStaticWebsite *StaticWebsite `xml:\"StaticWebsite\"`\n}\n\n// StorageServiceStats - Stats for the storage service.\ntype StorageServiceStats struct {\n\t// Geo-Replication information for the Secondary Storage Service\n\tGeoReplication *GeoReplication `xml:\"GeoReplication\"`\n}\n\n// UserDelegationKey - A user delegation key\ntype UserDelegationKey struct {\n\t// REQUIRED; The date-time the key expires\n\tSignedExpiry *time.Time `xml:\"SignedExpiry\"`\n\n\t// REQUIRED; The Azure Active Directory object ID in GUID format.\n\tSignedOID *string `xml:\"SignedOid\"`\n\n\t// REQUIRED; Abbreviation of the Azure Storage service that accepts the key\n\tSignedService *string `xml:\"SignedService\"`\n\n\t// REQUIRED; The date-time the key is active\n\tSignedStart *time.Time `xml:\"SignedStart\"`\n\n\t// REQUIRED; The Azure Active Directory tenant ID in GUID format\n\tSignedTID *string `xml:\"SignedTid\"`\n\n\t// REQUIRED; The service version that created the key\n\tSignedVersion *string `xml:\"SignedVersion\"`\n\n\t// REQUIRED; The key as a base64 string\n\tValue *string `xml:\"Value\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_models_serde.go",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n// Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\npackage generated\n\nimport (\n\t\"encoding/json\"\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"reflect\"\n\t\"time\"\n)\n\n// MarshalXML implements the xml.Marshaller interface for type AccessPolicy.\nfunc (a AccessPolicy) MarshalXML(enc *xml.Encoder, start xml.StartElement) error {\n\ttype alias AccessPolicy\n\taux := &struct {\n\t\t*alias\n\t\tExpiry *dateTimeRFC3339 `xml:\"Expiry\"`\n\t\tStart  *dateTimeRFC3339 `xml:\"Start\"`\n\t}{\n\t\talias:  (*alias)(&a),\n\t\tExpiry: (*dateTimeRFC3339)(a.Expiry),\n\t\tStart:  (*dateTimeRFC3339)(a.Start),\n\t}\n\treturn enc.EncodeElement(aux, start)\n}\n\n// UnmarshalXML implements the xml.Unmarshaller interface for type AccessPolicy.\nfunc (a *AccessPolicy) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) error {\n\ttype alias AccessPolicy\n\taux := &struct {\n\t\t*alias\n\t\tExpiry *dateTimeRFC3339 `xml:\"Expiry\"`\n\t\tStart  *dateTimeRFC3339 `xml:\"Start\"`\n\t}{\n\t\talias: (*alias)(a),\n\t}\n\tif err := dec.DecodeElement(aux, &start); err != nil {\n\t\treturn err\n\t}\n\tif aux.Expiry != nil && !(*time.Time)(aux.Expiry).IsZero() {\n\t\ta.Expiry = (*time.Time)(aux.Expiry)\n\t}\n\tif aux.Start != nil && !(*time.Time)(aux.Start).IsZero() {\n\t\ta.Start = (*time.Time)(aux.Start)\n\t}\n\treturn nil\n}\n\n// MarshalXML implements the xml.Marshaller interface for type ArrowConfiguration.\nfunc (a ArrowConfiguration) MarshalXML(enc *xml.Encoder, start xml.StartElement) error {\n\ttype alias ArrowConfiguration\n\taux := &struct {\n\t\t*alias\n\t\tSchema *[]*ArrowField `xml:\"Schema>Field\"`\n\t}{\n\t\talias: (*alias)(&a),\n\t}\n\tif a.Schema != nil {\n\t\taux.Schema = &a.Schema\n\t}\n\treturn enc.EncodeElement(aux, start)\n}\n\n// MarshalXML implements the xml.Marshaller interface for type BlobFlatListSegment.\nfunc (b BlobFlatListSegment) MarshalXML(enc *xml.Encoder, start xml.StartElement) error {\n\ttype alias BlobFlatListSegment\n\taux := &struct {\n\t\t*alias\n\t\tBlobItems *[]*BlobItem `xml:\"Blob\"`\n\t}{\n\t\talias: (*alias)(&b),\n\t}\n\tif b.BlobItems != nil {\n\t\taux.BlobItems = &b.BlobItems\n\t}\n\treturn enc.EncodeElement(aux, start)\n}\n\n// MarshalXML implements the xml.Marshaller interface for type BlobHierarchyListSegment.\nfunc (b BlobHierarchyListSegment) MarshalXML(enc *xml.Encoder, start xml.StartElement) error {\n\ttype alias BlobHierarchyListSegment\n\taux := &struct {\n\t\t*alias\n\t\tBlobItems    *[]*BlobItem   `xml:\"Blob\"`\n\t\tBlobPrefixes *[]*BlobPrefix `xml:\"BlobPrefix\"`\n\t}{\n\t\talias: (*alias)(&b),\n\t}\n\tif b.BlobItems != nil {\n\t\taux.BlobItems = &b.BlobItems\n\t}\n\tif b.BlobPrefixes != nil {\n\t\taux.BlobPrefixes = &b.BlobPrefixes\n\t}\n\treturn enc.EncodeElement(aux, start)\n}\n\n// MarshalXML implements the xml.Marshaller interface for type BlobProperties.\nfunc (b BlobProperties) MarshalXML(enc *xml.Encoder, start xml.StartElement) error {\n\ttype alias BlobProperties\n\taux := &struct {\n\t\t*alias\n\t\tAccessTierChangeTime        *dateTimeRFC1123 `xml:\"AccessTierChangeTime\"`\n\t\tContentMD5                  *string          `xml:\"Content-MD5\"`\n\t\tCopyCompletionTime          *dateTimeRFC1123 `xml:\"CopyCompletionTime\"`\n\t\tCreationTime                *dateTimeRFC1123 `xml:\"Creation-Time\"`\n\t\tDeletedTime                 *dateTimeRFC1123 `xml:\"DeletedTime\"`\n\t\tExpiresOn                   *dateTimeRFC1123 `xml:\"Expiry-Time\"`\n\t\tImmutabilityPolicyExpiresOn *dateTimeRFC1123 `xml:\"ImmutabilityPolicyUntilDate\"`\n\t\tLastAccessedOn              *dateTimeRFC1123 `xml:\"LastAccessTime\"`\n\t\tLastModified                *dateTimeRFC1123 `xml:\"Last-Modified\"`\n\t}{\n\t\talias:                       (*alias)(&b),\n\t\tAccessTierChangeTime:        (*dateTimeRFC1123)(b.AccessTierChangeTime),\n\t\tCopyCompletionTime:          (*dateTimeRFC1123)(b.CopyCompletionTime),\n\t\tCreationTime:                (*dateTimeRFC1123)(b.CreationTime),\n\t\tDeletedTime:                 (*dateTimeRFC1123)(b.DeletedTime),\n\t\tExpiresOn:                   (*dateTimeRFC1123)(b.ExpiresOn),\n\t\tImmutabilityPolicyExpiresOn: (*dateTimeRFC1123)(b.ImmutabilityPolicyExpiresOn),\n\t\tLastAccessedOn:              (*dateTimeRFC1123)(b.LastAccessedOn),\n\t\tLastModified:                (*dateTimeRFC1123)(b.LastModified),\n\t}\n\tif b.ContentMD5 != nil {\n\t\tencodedContentMD5 := runtime.EncodeByteArray(b.ContentMD5, runtime.Base64StdFormat)\n\t\taux.ContentMD5 = &encodedContentMD5\n\t}\n\treturn enc.EncodeElement(aux, start)\n}\n\n// UnmarshalXML implements the xml.Unmarshaller interface for type BlobProperties.\nfunc (b *BlobProperties) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) error {\n\ttype alias BlobProperties\n\taux := &struct {\n\t\t*alias\n\t\tAccessTierChangeTime        *dateTimeRFC1123 `xml:\"AccessTierChangeTime\"`\n\t\tContentMD5                  *string          `xml:\"Content-MD5\"`\n\t\tCopyCompletionTime          *dateTimeRFC1123 `xml:\"CopyCompletionTime\"`\n\t\tCreationTime                *dateTimeRFC1123 `xml:\"Creation-Time\"`\n\t\tDeletedTime                 *dateTimeRFC1123 `xml:\"DeletedTime\"`\n\t\tExpiresOn                   *dateTimeRFC1123 `xml:\"Expiry-Time\"`\n\t\tImmutabilityPolicyExpiresOn *dateTimeRFC1123 `xml:\"ImmutabilityPolicyUntilDate\"`\n\t\tLastAccessedOn              *dateTimeRFC1123 `xml:\"LastAccessTime\"`\n\t\tLastModified                *dateTimeRFC1123 `xml:\"Last-Modified\"`\n\t}{\n\t\talias: (*alias)(b),\n\t}\n\tif err := dec.DecodeElement(aux, &start); err != nil {\n\t\treturn err\n\t}\n\tif aux.AccessTierChangeTime != nil && !(*time.Time)(aux.AccessTierChangeTime).IsZero() {\n\t\tb.AccessTierChangeTime = (*time.Time)(aux.AccessTierChangeTime)\n\t}\n\tif aux.ContentMD5 != nil {\n\t\tif err := runtime.DecodeByteArray(*aux.ContentMD5, &b.ContentMD5, runtime.Base64StdFormat); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif aux.CopyCompletionTime != nil && !(*time.Time)(aux.CopyCompletionTime).IsZero() {\n\t\tb.CopyCompletionTime = (*time.Time)(aux.CopyCompletionTime)\n\t}\n\tif aux.CreationTime != nil && !(*time.Time)(aux.CreationTime).IsZero() {\n\t\tb.CreationTime = (*time.Time)(aux.CreationTime)\n\t}\n\tif aux.DeletedTime != nil && !(*time.Time)(aux.DeletedTime).IsZero() {\n\t\tb.DeletedTime = (*time.Time)(aux.DeletedTime)\n\t}\n\tif aux.ExpiresOn != nil && !(*time.Time)(aux.ExpiresOn).IsZero() {\n\t\tb.ExpiresOn = (*time.Time)(aux.ExpiresOn)\n\t}\n\tif aux.ImmutabilityPolicyExpiresOn != nil && !(*time.Time)(aux.ImmutabilityPolicyExpiresOn).IsZero() {\n\t\tb.ImmutabilityPolicyExpiresOn = (*time.Time)(aux.ImmutabilityPolicyExpiresOn)\n\t}\n\tif aux.LastAccessedOn != nil && !(*time.Time)(aux.LastAccessedOn).IsZero() {\n\t\tb.LastAccessedOn = (*time.Time)(aux.LastAccessedOn)\n\t}\n\tif aux.LastModified != nil && !(*time.Time)(aux.LastModified).IsZero() {\n\t\tb.LastModified = (*time.Time)(aux.LastModified)\n\t}\n\treturn nil\n}\n\n// MarshalXML implements the xml.Marshaller interface for type BlobTags.\nfunc (b BlobTags) MarshalXML(enc *xml.Encoder, start xml.StartElement) error {\n\tstart.Name.Local = \"Tags\"\n\ttype alias BlobTags\n\taux := &struct {\n\t\t*alias\n\t\tBlobTagSet *[]*BlobTag `xml:\"TagSet>Tag\"`\n\t}{\n\t\talias: (*alias)(&b),\n\t}\n\tif b.BlobTagSet != nil {\n\t\taux.BlobTagSet = &b.BlobTagSet\n\t}\n\treturn enc.EncodeElement(aux, start)\n}\n\n// MarshalXML implements the xml.Marshaller interface for type BlockList.\nfunc (b BlockList) MarshalXML(enc *xml.Encoder, start xml.StartElement) error {\n\ttype alias BlockList\n\taux := &struct {\n\t\t*alias\n\t\tCommittedBlocks   *[]*Block `xml:\"CommittedBlocks>Block\"`\n\t\tUncommittedBlocks *[]*Block `xml:\"UncommittedBlocks>Block\"`\n\t}{\n\t\talias: (*alias)(&b),\n\t}\n\tif b.CommittedBlocks != nil {\n\t\taux.CommittedBlocks = &b.CommittedBlocks\n\t}\n\tif b.UncommittedBlocks != nil {\n\t\taux.UncommittedBlocks = &b.UncommittedBlocks\n\t}\n\treturn enc.EncodeElement(aux, start)\n}\n\n// MarshalXML implements the xml.Marshaller interface for type BlockLookupList.\nfunc (b BlockLookupList) MarshalXML(enc *xml.Encoder, start xml.StartElement) error {\n\tstart.Name.Local = \"BlockList\"\n\ttype alias BlockLookupList\n\taux := &struct {\n\t\t*alias\n\t\tCommitted   *[]*string `xml:\"Committed\"`\n\t\tLatest      *[]*string `xml:\"Latest\"`\n\t\tUncommitted *[]*string `xml:\"Uncommitted\"`\n\t}{\n\t\talias: (*alias)(&b),\n\t}\n\tif b.Committed != nil {\n\t\taux.Committed = &b.Committed\n\t}\n\tif b.Latest != nil {\n\t\taux.Latest = &b.Latest\n\t}\n\tif b.Uncommitted != nil {\n\t\taux.Uncommitted = &b.Uncommitted\n\t}\n\treturn enc.EncodeElement(aux, start)\n}\n\n// UnmarshalXML implements the xml.Unmarshaller interface for type ContainerItem.\nfunc (c *ContainerItem) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) error {\n\ttype alias ContainerItem\n\taux := &struct {\n\t\t*alias\n\t\tMetadata additionalProperties `xml:\"Metadata\"`\n\t}{\n\t\talias: (*alias)(c),\n\t}\n\tif err := dec.DecodeElement(aux, &start); err != nil {\n\t\treturn err\n\t}\n\tc.Metadata = (map[string]*string)(aux.Metadata)\n\treturn nil\n}\n\n// MarshalXML implements the xml.Marshaller interface for type ContainerProperties.\nfunc (c ContainerProperties) MarshalXML(enc *xml.Encoder, start xml.StartElement) error {\n\ttype alias ContainerProperties\n\taux := &struct {\n\t\t*alias\n\t\tDeletedTime  *dateTimeRFC1123 `xml:\"DeletedTime\"`\n\t\tLastModified *dateTimeRFC1123 `xml:\"Last-Modified\"`\n\t}{\n\t\talias:        (*alias)(&c),\n\t\tDeletedTime:  (*dateTimeRFC1123)(c.DeletedTime),\n\t\tLastModified: (*dateTimeRFC1123)(c.LastModified),\n\t}\n\treturn enc.EncodeElement(aux, start)\n}\n\n// UnmarshalXML implements the xml.Unmarshaller interface for type ContainerProperties.\nfunc (c *ContainerProperties) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) error {\n\ttype alias ContainerProperties\n\taux := &struct {\n\t\t*alias\n\t\tDeletedTime  *dateTimeRFC1123 `xml:\"DeletedTime\"`\n\t\tLastModified *dateTimeRFC1123 `xml:\"Last-Modified\"`\n\t}{\n\t\talias: (*alias)(c),\n\t}\n\tif err := dec.DecodeElement(aux, &start); err != nil {\n\t\treturn err\n\t}\n\tif aux.DeletedTime != nil && !(*time.Time)(aux.DeletedTime).IsZero() {\n\t\tc.DeletedTime = (*time.Time)(aux.DeletedTime)\n\t}\n\tif aux.LastModified != nil && !(*time.Time)(aux.LastModified).IsZero() {\n\t\tc.LastModified = (*time.Time)(aux.LastModified)\n\t}\n\treturn nil\n}\n\n// MarshalXML implements the xml.Marshaller interface for type FilterBlobSegment.\nfunc (f FilterBlobSegment) MarshalXML(enc *xml.Encoder, start xml.StartElement) error {\n\ttype alias FilterBlobSegment\n\taux := &struct {\n\t\t*alias\n\t\tBlobs *[]*FilterBlobItem `xml:\"Blobs>Blob\"`\n\t}{\n\t\talias: (*alias)(&f),\n\t}\n\tif f.Blobs != nil {\n\t\taux.Blobs = &f.Blobs\n\t}\n\treturn enc.EncodeElement(aux, start)\n}\n\n// MarshalXML implements the xml.Marshaller interface for type GeoReplication.\nfunc (g GeoReplication) MarshalXML(enc *xml.Encoder, start xml.StartElement) error {\n\ttype alias GeoReplication\n\taux := &struct {\n\t\t*alias\n\t\tLastSyncTime *dateTimeRFC1123 `xml:\"LastSyncTime\"`\n\t}{\n\t\talias:        (*alias)(&g),\n\t\tLastSyncTime: (*dateTimeRFC1123)(g.LastSyncTime),\n\t}\n\treturn enc.EncodeElement(aux, start)\n}\n\n// UnmarshalXML implements the xml.Unmarshaller interface for type GeoReplication.\nfunc (g *GeoReplication) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) error {\n\ttype alias GeoReplication\n\taux := &struct {\n\t\t*alias\n\t\tLastSyncTime *dateTimeRFC1123 `xml:\"LastSyncTime\"`\n\t}{\n\t\talias: (*alias)(g),\n\t}\n\tif err := dec.DecodeElement(aux, &start); err != nil {\n\t\treturn err\n\t}\n\tif aux.LastSyncTime != nil && !(*time.Time)(aux.LastSyncTime).IsZero() {\n\t\tg.LastSyncTime = (*time.Time)(aux.LastSyncTime)\n\t}\n\treturn nil\n}\n\n// MarshalXML implements the xml.Marshaller interface for type ListContainersSegmentResponse.\nfunc (l ListContainersSegmentResponse) MarshalXML(enc *xml.Encoder, start xml.StartElement) error {\n\ttype alias ListContainersSegmentResponse\n\taux := &struct {\n\t\t*alias\n\t\tContainerItems *[]*ContainerItem `xml:\"Containers>Container\"`\n\t}{\n\t\talias: (*alias)(&l),\n\t}\n\tif l.ContainerItems != nil {\n\t\taux.ContainerItems = &l.ContainerItems\n\t}\n\treturn enc.EncodeElement(aux, start)\n}\n\n// MarshalXML implements the xml.Marshaller interface for type PageList.\nfunc (p PageList) MarshalXML(enc *xml.Encoder, start xml.StartElement) error {\n\ttype alias PageList\n\taux := &struct {\n\t\t*alias\n\t\tClearRange *[]*ClearRange `xml:\"ClearRange\"`\n\t\tPageRange  *[]*PageRange  `xml:\"PageRange\"`\n\t}{\n\t\talias: (*alias)(&p),\n\t}\n\tif p.ClearRange != nil {\n\t\taux.ClearRange = &p.ClearRange\n\t}\n\tif p.PageRange != nil {\n\t\taux.PageRange = &p.PageRange\n\t}\n\treturn enc.EncodeElement(aux, start)\n}\n\n// MarshalXML implements the xml.Marshaller interface for type QueryRequest.\nfunc (q QueryRequest) MarshalXML(enc *xml.Encoder, start xml.StartElement) error {\n\tstart.Name.Local = \"QueryRequest\"\n\ttype alias QueryRequest\n\taux := &struct {\n\t\t*alias\n\t}{\n\t\talias: (*alias)(&q),\n\t}\n\treturn enc.EncodeElement(aux, start)\n}\n\n// MarshalJSON implements the json.Marshaller interface for type StorageError.\nfunc (s StorageError) MarshalJSON() ([]byte, error) {\n\tobjectMap := make(map[string]any)\n\tpopulate(objectMap, \"Message\", s.Message)\n\treturn json.Marshal(objectMap)\n}\n\n// UnmarshalJSON implements the json.Unmarshaller interface for type StorageError.\nfunc (s *StorageError) UnmarshalJSON(data []byte) error {\n\tvar rawMsg map[string]json.RawMessage\n\tif err := json.Unmarshal(data, &rawMsg); err != nil {\n\t\treturn fmt.Errorf(\"unmarshalling type %T: %v\", s, err)\n\t}\n\tfor key, val := range rawMsg {\n\t\tvar err error\n\t\tswitch key {\n\t\tcase \"Message\":\n\t\t\terr = unpopulate(val, \"Message\", &s.Message)\n\t\t\tdelete(rawMsg, key)\n\t\t}\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"unmarshalling type %T: %v\", s, err)\n\t\t}\n\t}\n\treturn nil\n}\n\n// MarshalXML implements the xml.Marshaller interface for type StorageServiceProperties.\nfunc (s StorageServiceProperties) MarshalXML(enc *xml.Encoder, start xml.StartElement) error {\n\ttype alias StorageServiceProperties\n\taux := &struct {\n\t\t*alias\n\t\tCORS *[]*CORSRule `xml:\"Cors>CorsRule\"`\n\t}{\n\t\talias: (*alias)(&s),\n\t}\n\tif s.CORS != nil {\n\t\taux.CORS = &s.CORS\n\t}\n\treturn enc.EncodeElement(aux, start)\n}\n\n// MarshalXML implements the xml.Marshaller interface for type UserDelegationKey.\nfunc (u UserDelegationKey) MarshalXML(enc *xml.Encoder, start xml.StartElement) error {\n\ttype alias UserDelegationKey\n\taux := &struct {\n\t\t*alias\n\t\tSignedExpiry *dateTimeRFC3339 `xml:\"SignedExpiry\"`\n\t\tSignedStart  *dateTimeRFC3339 `xml:\"SignedStart\"`\n\t}{\n\t\talias:        (*alias)(&u),\n\t\tSignedExpiry: (*dateTimeRFC3339)(u.SignedExpiry),\n\t\tSignedStart:  (*dateTimeRFC3339)(u.SignedStart),\n\t}\n\treturn enc.EncodeElement(aux, start)\n}\n\n// UnmarshalXML implements the xml.Unmarshaller interface for type UserDelegationKey.\nfunc (u *UserDelegationKey) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) error {\n\ttype alias UserDelegationKey\n\taux := &struct {\n\t\t*alias\n\t\tSignedExpiry *dateTimeRFC3339 `xml:\"SignedExpiry\"`\n\t\tSignedStart  *dateTimeRFC3339 `xml:\"SignedStart\"`\n\t}{\n\t\talias: (*alias)(u),\n\t}\n\tif err := dec.DecodeElement(aux, &start); err != nil {\n\t\treturn err\n\t}\n\tif aux.SignedExpiry != nil && !(*time.Time)(aux.SignedExpiry).IsZero() {\n\t\tu.SignedExpiry = (*time.Time)(aux.SignedExpiry)\n\t}\n\tif aux.SignedStart != nil && !(*time.Time)(aux.SignedStart).IsZero() {\n\t\tu.SignedStart = (*time.Time)(aux.SignedStart)\n\t}\n\treturn nil\n}\n\nfunc populate(m map[string]any, k string, v any) {\n\tif v == nil {\n\t\treturn\n\t} else if azcore.IsNullValue(v) {\n\t\tm[k] = nil\n\t} else if !reflect.ValueOf(v).IsNil() {\n\t\tm[k] = v\n\t}\n}\n\nfunc unpopulate(data json.RawMessage, fn string, v any) error {\n\tif data == nil || string(data) == \"null\" {\n\t\treturn nil\n\t}\n\tif err := json.Unmarshal(data, v); err != nil {\n\t\treturn fmt.Errorf(\"struct field %s: %v\", fn, err)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_options.go",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n// Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\npackage generated\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"time\"\n)\n\n// AppendBlobClientAppendBlockFromURLOptions contains the optional parameters for the AppendBlobClient.AppendBlockFromURL\n// method.\ntype AppendBlobClientAppendBlockFromURLOptions struct {\n\t// Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source.\n\tCopySourceAuthorization *string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// Specify the md5 calculated for the range of bytes that must be read from the copy source.\n\tSourceContentMD5 []byte\n\n\t// Specify the crc64 calculated for the range of bytes that must be read from the copy source.\n\tSourceContentcrc64 []byte\n\n\t// Bytes of source data in the specified range.\n\tSourceRange *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n\n\t// Specify the transactional md5 for the body, to be validated by the service.\n\tTransactionalContentMD5 []byte\n}\n\n// AppendBlobClientAppendBlockOptions contains the optional parameters for the AppendBlobClient.AppendBlock method.\ntype AppendBlobClientAppendBlockOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// Required if the request body is a structured message. Specifies the message schema version and properties.\n\tStructuredBodyType *string\n\n\t// Required if the request body is a structured message. Specifies the length of the blob/file content inside the message\n\t// body. Will always be smaller than Content-Length.\n\tStructuredContentLength *int64\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n\n\t// Specify the transactional crc64 for the body, to be validated by the service.\n\tTransactionalContentCRC64 []byte\n\n\t// Specify the transactional md5 for the body, to be validated by the service.\n\tTransactionalContentMD5 []byte\n}\n\n// AppendBlobClientCreateOptions contains the optional parameters for the AppendBlobClient.Create method.\ntype AppendBlobClientCreateOptions struct {\n\t// Optional. Used to set blob tags in various blob operations.\n\tBlobTagsString *string\n\n\t// Specifies the date time when the blobs immutability policy is set to expire.\n\tImmutabilityPolicyExpiry *time.Time\n\n\t// Specifies the immutability policy mode to set on the blob.\n\tImmutabilityPolicyMode *ImmutabilityPolicySetting\n\n\t// Specified if a legal hold should be set on the blob.\n\tLegalHold *bool\n\n\t// Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the\n\t// operation will copy the metadata from the source blob or file to the destination\n\t// blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata\n\t// is not copied from the source blob or file. Note that beginning with\n\t// version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers,\n\t// Blobs, and Metadata for more information.\n\tMetadata map[string]*string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// AppendBlobClientSealOptions contains the optional parameters for the AppendBlobClient.Seal method.\ntype AppendBlobClientSealOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// AppendPositionAccessConditions contains a group of parameters for the AppendBlobClient.AppendBlock method.\ntype AppendPositionAccessConditions struct {\n\t// Optional conditional header, used only for the Append Block operation. A number indicating the byte offset to compare.\n\t// Append Block will succeed only if the append position is equal to this number. If\n\t// it is not, the request will fail with the AppendPositionConditionNotMet error (HTTP status code 412 - Precondition Failed).\n\tAppendPosition *int64\n\n\t// Optional conditional header. The max length in bytes permitted for the append blob. If the Append Block operation would\n\t// cause the blob to exceed that limit or if the blob size is already greater than\n\t// the value specified in this header, the request will fail with MaxBlobSizeConditionNotMet error (HTTP status code 412 -\n\t// Precondition Failed).\n\tMaxSize *int64\n}\n\n// BlobClientAbortCopyFromURLOptions contains the optional parameters for the BlobClient.AbortCopyFromURL method.\ntype BlobClientAbortCopyFromURLOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// BlobClientAcquireLeaseOptions contains the optional parameters for the BlobClient.AcquireLease method.\ntype BlobClientAcquireLeaseOptions struct {\n\t// Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the proposed lease ID is\n\t// not in the correct format. See Guid Constructor (String) for a list of valid GUID\n\t// string formats.\n\tProposedLeaseID *string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// BlobClientBreakLeaseOptions contains the optional parameters for the BlobClient.BreakLease method.\ntype BlobClientBreakLeaseOptions struct {\n\t// For a break operation, proposed duration the lease should continue before it is broken, in seconds, between 0 and 60. This\n\t// break period is only used if it is shorter than the time remaining on the\n\t// lease. If longer, the time remaining on the lease is used. A new lease will not be available before the break period has\n\t// expired, but the lease may be held for longer than the break period. If this\n\t// header does not appear with a break operation, a fixed-duration lease breaks after the remaining lease period elapses,\n\t// and an infinite lease breaks immediately.\n\tBreakPeriod *int32\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// BlobClientChangeLeaseOptions contains the optional parameters for the BlobClient.ChangeLease method.\ntype BlobClientChangeLeaseOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// BlobClientCopyFromURLOptions contains the optional parameters for the BlobClient.CopyFromURL method.\ntype BlobClientCopyFromURLOptions struct {\n\t// Optional. Used to set blob tags in various blob operations.\n\tBlobTagsString *string\n\n\t// Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source.\n\tCopySourceAuthorization *string\n\n\t// Optional, default 'replace'. Indicates if source tags should be copied or replaced with the tags specified by x-ms-tags.\n\tCopySourceTags *BlobCopySourceTags\n\n\t// Specifies the date time when the blobs immutability policy is set to expire.\n\tImmutabilityPolicyExpiry *time.Time\n\n\t// Specifies the immutability policy mode to set on the blob.\n\tImmutabilityPolicyMode *ImmutabilityPolicySetting\n\n\t// Specified if a legal hold should be set on the blob.\n\tLegalHold *bool\n\n\t// Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the\n\t// operation will copy the metadata from the source blob or file to the destination\n\t// blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata\n\t// is not copied from the source blob or file. Note that beginning with\n\t// version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers,\n\t// Blobs, and Metadata for more information.\n\tMetadata map[string]*string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// Specify the md5 calculated for the range of bytes that must be read from the copy source.\n\tSourceContentMD5 []byte\n\n\t// Optional. Indicates the tier to be set on the blob.\n\tTier *AccessTier\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// BlobClientCreateSnapshotOptions contains the optional parameters for the BlobClient.CreateSnapshot method.\ntype BlobClientCreateSnapshotOptions struct {\n\t// Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the\n\t// operation will copy the metadata from the source blob or file to the destination\n\t// blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata\n\t// is not copied from the source blob or file. Note that beginning with\n\t// version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers,\n\t// Blobs, and Metadata for more information.\n\tMetadata map[string]*string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// BlobClientDeleteImmutabilityPolicyOptions contains the optional parameters for the BlobClient.DeleteImmutabilityPolicy\n// method.\ntype BlobClientDeleteImmutabilityPolicyOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more\n\t// information on working with blob snapshots, see Creating a Snapshot of a Blob.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob]\n\tSnapshot *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n\n\t// The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on.\n\t// It's for service version 2019-10-10 and newer.\n\tVersionID *string\n}\n\n// BlobClientDeleteOptions contains the optional parameters for the BlobClient.Delete method.\ntype BlobClientDeleteOptions struct {\n\t// Required if the blob has associated snapshots. Specify one of the following two options: include: Delete the base blob\n\t// and all of its snapshots. only: Delete only the blob's snapshots and not the blob\n\t// itself\n\tDeleteSnapshots *DeleteSnapshotsOptionType\n\n\t// Optional. Only possible value is 'permanent', which specifies to permanently delete a blob if blob soft delete is enabled.\n\tDeleteType *DeleteType\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more\n\t// information on working with blob snapshots, see Creating a Snapshot of a Blob.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob]\n\tSnapshot *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n\n\t// The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on.\n\t// It's for service version 2019-10-10 and newer.\n\tVersionID *string\n}\n\n// BlobClientDownloadOptions contains the optional parameters for the BlobClient.Download method.\ntype BlobClientDownloadOptions struct {\n\t// Return only the bytes of the blob in the specified range.\n\tRange *string\n\n\t// When set to true and specified together with the Range, the service returns the CRC64 hash for the range, as long as the\n\t// range is less than or equal to 4 MB in size.\n\tRangeGetContentCRC64 *bool\n\n\t// When set to true and specified together with the Range, the service returns the MD5 hash for the range, as long as the\n\t// range is less than or equal to 4 MB in size.\n\tRangeGetContentMD5 *bool\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more\n\t// information on working with blob snapshots, see Creating a Snapshot of a Blob.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob]\n\tSnapshot *string\n\n\t// Specifies the response content should be returned as a structured message and specifies the message schema version and\n\t// properties.\n\tStructuredBodyType *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n\n\t// The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on.\n\t// It's for service version 2019-10-10 and newer.\n\tVersionID *string\n}\n\n// BlobClientGetAccountInfoOptions contains the optional parameters for the BlobClient.GetAccountInfo method.\ntype BlobClientGetAccountInfoOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// BlobClientGetPropertiesOptions contains the optional parameters for the BlobClient.GetProperties method.\ntype BlobClientGetPropertiesOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more\n\t// information on working with blob snapshots, see Creating a Snapshot of a Blob.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob]\n\tSnapshot *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n\n\t// The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on.\n\t// It's for service version 2019-10-10 and newer.\n\tVersionID *string\n}\n\n// BlobClientGetTagsOptions contains the optional parameters for the BlobClient.GetTags method.\ntype BlobClientGetTagsOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more\n\t// information on working with blob snapshots, see Creating a Snapshot of a Blob.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob]\n\tSnapshot *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n\n\t// The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on.\n\t// It's for service version 2019-10-10 and newer.\n\tVersionID *string\n}\n\n// BlobClientQueryOptions contains the optional parameters for the BlobClient.Query method.\ntype BlobClientQueryOptions struct {\n\t// the query request\n\tQueryRequest *QueryRequest\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more\n\t// information on working with blob snapshots, see Creating a Snapshot of a Blob.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob]\n\tSnapshot *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// BlobClientReleaseLeaseOptions contains the optional parameters for the BlobClient.ReleaseLease method.\ntype BlobClientReleaseLeaseOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// BlobClientRenewLeaseOptions contains the optional parameters for the BlobClient.RenewLease method.\ntype BlobClientRenewLeaseOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// BlobClientSetExpiryOptions contains the optional parameters for the BlobClient.SetExpiry method.\ntype BlobClientSetExpiryOptions struct {\n\t// The time to set the blob to expiry\n\tExpiresOn *string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// BlobClientSetHTTPHeadersOptions contains the optional parameters for the BlobClient.SetHTTPHeaders method.\ntype BlobClientSetHTTPHeadersOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// BlobClientSetImmutabilityPolicyOptions contains the optional parameters for the BlobClient.SetImmutabilityPolicy method.\ntype BlobClientSetImmutabilityPolicyOptions struct {\n\t// Specifies the date time when the blobs immutability policy is set to expire.\n\tImmutabilityPolicyExpiry *time.Time\n\n\t// Specifies the immutability policy mode to set on the blob.\n\tImmutabilityPolicyMode *ImmutabilityPolicySetting\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more\n\t// information on working with blob snapshots, see Creating a Snapshot of a Blob.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob]\n\tSnapshot *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n\n\t// The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on.\n\t// It's for service version 2019-10-10 and newer.\n\tVersionID *string\n}\n\n// BlobClientSetLegalHoldOptions contains the optional parameters for the BlobClient.SetLegalHold method.\ntype BlobClientSetLegalHoldOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more\n\t// information on working with blob snapshots, see Creating a Snapshot of a Blob.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob]\n\tSnapshot *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n\n\t// The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on.\n\t// It's for service version 2019-10-10 and newer.\n\tVersionID *string\n}\n\n// BlobClientSetMetadataOptions contains the optional parameters for the BlobClient.SetMetadata method.\ntype BlobClientSetMetadataOptions struct {\n\t// Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the\n\t// operation will copy the metadata from the source blob or file to the destination\n\t// blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata\n\t// is not copied from the source blob or file. Note that beginning with\n\t// version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers,\n\t// Blobs, and Metadata for more information.\n\tMetadata map[string]*string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// BlobClientSetTagsOptions contains the optional parameters for the BlobClient.SetTags method.\ntype BlobClientSetTagsOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n\n\t// Specify the transactional crc64 for the body, to be validated by the service.\n\tTransactionalContentCRC64 []byte\n\n\t// Specify the transactional md5 for the body, to be validated by the service.\n\tTransactionalContentMD5 []byte\n\n\t// The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on.\n\t// It's for service version 2019-10-10 and newer.\n\tVersionID *string\n}\n\n// BlobClientSetTierOptions contains the optional parameters for the BlobClient.SetTier method.\ntype BlobClientSetTierOptions struct {\n\t// Optional: Indicates the priority with which to rehydrate an archived blob.\n\tRehydratePriority *RehydratePriority\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more\n\t// information on working with blob snapshots, see Creating a Snapshot of a Blob.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob]\n\tSnapshot *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n\n\t// The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on.\n\t// It's for service version 2019-10-10 and newer.\n\tVersionID *string\n}\n\n// BlobClientStartCopyFromURLOptions contains the optional parameters for the BlobClient.StartCopyFromURL method.\ntype BlobClientStartCopyFromURLOptions struct {\n\t// Optional. Used to set blob tags in various blob operations.\n\tBlobTagsString *string\n\n\t// Specifies the date time when the blobs immutability policy is set to expire.\n\tImmutabilityPolicyExpiry *time.Time\n\n\t// Specifies the immutability policy mode to set on the blob.\n\tImmutabilityPolicyMode *ImmutabilityPolicySetting\n\n\t// Specified if a legal hold should be set on the blob.\n\tLegalHold *bool\n\n\t// Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the\n\t// operation will copy the metadata from the source blob or file to the destination\n\t// blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata\n\t// is not copied from the source blob or file. Note that beginning with\n\t// version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers,\n\t// Blobs, and Metadata for more information.\n\tMetadata map[string]*string\n\n\t// Optional: Indicates the priority with which to rehydrate an archived blob.\n\tRehydratePriority *RehydratePriority\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// Overrides the sealed state of the destination blob. Service version 2019-12-12 and newer.\n\tSealBlob *bool\n\n\t// Optional. Indicates the tier to be set on the blob.\n\tTier *AccessTier\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// BlobClientUndeleteOptions contains the optional parameters for the BlobClient.Undelete method.\ntype BlobClientUndeleteOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// BlobHTTPHeaders contains a group of parameters for the BlobClient.SetHTTPHeaders method.\ntype BlobHTTPHeaders struct {\n\t// Optional. Sets the blob's cache control. If specified, this property is stored with the blob and returned with a read request.\n\tBlobCacheControl *string\n\n\t// Optional. Sets the blob's Content-Disposition header.\n\tBlobContentDisposition *string\n\n\t// Optional. Sets the blob's content encoding. If specified, this property is stored with the blob and returned with a read\n\t// request.\n\tBlobContentEncoding *string\n\n\t// Optional. Set the blob's content language. If specified, this property is stored with the blob and returned with a read\n\t// request.\n\tBlobContentLanguage *string\n\n\t// Optional. An MD5 hash of the blob content. Note that this hash is not validated, as the hashes for the individual blocks\n\t// were validated when each was uploaded.\n\tBlobContentMD5 []byte\n\n\t// Optional. Sets the blob's content type. If specified, this property is stored with the blob and returned with a read request.\n\tBlobContentType *string\n}\n\n// BlockBlobClientCommitBlockListOptions contains the optional parameters for the BlockBlobClient.CommitBlockList method.\ntype BlockBlobClientCommitBlockListOptions struct {\n\t// Optional. Used to set blob tags in various blob operations.\n\tBlobTagsString *string\n\n\t// Specifies the date time when the blobs immutability policy is set to expire.\n\tImmutabilityPolicyExpiry *time.Time\n\n\t// Specifies the immutability policy mode to set on the blob.\n\tImmutabilityPolicyMode *ImmutabilityPolicySetting\n\n\t// Specified if a legal hold should be set on the blob.\n\tLegalHold *bool\n\n\t// Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the\n\t// operation will copy the metadata from the source blob or file to the destination\n\t// blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata\n\t// is not copied from the source blob or file. Note that beginning with\n\t// version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers,\n\t// Blobs, and Metadata for more information.\n\tMetadata map[string]*string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// Optional. Indicates the tier to be set on the blob.\n\tTier *AccessTier\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n\n\t// Specify the transactional crc64 for the body, to be validated by the service.\n\tTransactionalContentCRC64 []byte\n\n\t// Specify the transactional md5 for the body, to be validated by the service.\n\tTransactionalContentMD5 []byte\n}\n\n// BlockBlobClientGetBlockListOptions contains the optional parameters for the BlockBlobClient.GetBlockList method.\ntype BlockBlobClientGetBlockListOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more\n\t// information on working with blob snapshots, see Creating a Snapshot of a Blob.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob]\n\tSnapshot *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// BlockBlobClientPutBlobFromURLOptions contains the optional parameters for the BlockBlobClient.PutBlobFromURL method.\ntype BlockBlobClientPutBlobFromURLOptions struct {\n\t// Optional. Used to set blob tags in various blob operations.\n\tBlobTagsString *string\n\n\t// Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source.\n\tCopySourceAuthorization *string\n\n\t// Optional, default is true. Indicates if properties from the source blob should be copied.\n\tCopySourceBlobProperties *bool\n\n\t// Optional, default 'replace'. Indicates if source tags should be copied or replaced with the tags specified by x-ms-tags.\n\tCopySourceTags *BlobCopySourceTags\n\n\t// Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the\n\t// operation will copy the metadata from the source blob or file to the destination\n\t// blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata\n\t// is not copied from the source blob or file. Note that beginning with\n\t// version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers,\n\t// Blobs, and Metadata for more information.\n\tMetadata map[string]*string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// Specify the md5 calculated for the range of bytes that must be read from the copy source.\n\tSourceContentMD5 []byte\n\n\t// Optional. Indicates the tier to be set on the blob.\n\tTier *AccessTier\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n\n\t// Specify the transactional md5 for the body, to be validated by the service.\n\tTransactionalContentMD5 []byte\n}\n\n// BlockBlobClientStageBlockFromURLOptions contains the optional parameters for the BlockBlobClient.StageBlockFromURL method.\ntype BlockBlobClientStageBlockFromURLOptions struct {\n\t// Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source.\n\tCopySourceAuthorization *string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// Specify the md5 calculated for the range of bytes that must be read from the copy source.\n\tSourceContentMD5 []byte\n\n\t// Specify the crc64 calculated for the range of bytes that must be read from the copy source.\n\tSourceContentcrc64 []byte\n\n\t// Bytes of source data in the specified range.\n\tSourceRange *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// BlockBlobClientStageBlockOptions contains the optional parameters for the BlockBlobClient.StageBlock method.\ntype BlockBlobClientStageBlockOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// Required if the request body is a structured message. Specifies the message schema version and properties.\n\tStructuredBodyType *string\n\n\t// Required if the request body is a structured message. Specifies the length of the blob/file content inside the message\n\t// body. Will always be smaller than Content-Length.\n\tStructuredContentLength *int64\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n\n\t// Specify the transactional crc64 for the body, to be validated by the service.\n\tTransactionalContentCRC64 []byte\n\n\t// Specify the transactional md5 for the body, to be validated by the service.\n\tTransactionalContentMD5 []byte\n}\n\n// BlockBlobClientUploadOptions contains the optional parameters for the BlockBlobClient.Upload method.\ntype BlockBlobClientUploadOptions struct {\n\t// Optional. Used to set blob tags in various blob operations.\n\tBlobTagsString *string\n\n\t// Specifies the date time when the blobs immutability policy is set to expire.\n\tImmutabilityPolicyExpiry *time.Time\n\n\t// Specifies the immutability policy mode to set on the blob.\n\tImmutabilityPolicyMode *ImmutabilityPolicySetting\n\n\t// Specified if a legal hold should be set on the blob.\n\tLegalHold *bool\n\n\t// Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the\n\t// operation will copy the metadata from the source blob or file to the destination\n\t// blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata\n\t// is not copied from the source blob or file. Note that beginning with\n\t// version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers,\n\t// Blobs, and Metadata for more information.\n\tMetadata map[string]*string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// Required if the request body is a structured message. Specifies the message schema version and properties.\n\tStructuredBodyType *string\n\n\t// Required if the request body is a structured message. Specifies the length of the blob/file content inside the message\n\t// body. Will always be smaller than Content-Length.\n\tStructuredContentLength *int64\n\n\t// Optional. Indicates the tier to be set on the blob.\n\tTier *AccessTier\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n\n\t// Specify the transactional crc64 for the body, to be validated by the service.\n\tTransactionalContentCRC64 []byte\n\n\t// Specify the transactional md5 for the body, to be validated by the service.\n\tTransactionalContentMD5 []byte\n}\n\n// ContainerClientAcquireLeaseOptions contains the optional parameters for the ContainerClient.AcquireLease method.\ntype ContainerClientAcquireLeaseOptions struct {\n\t// Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the proposed lease ID is\n\t// not in the correct format. See Guid Constructor (String) for a list of valid GUID\n\t// string formats.\n\tProposedLeaseID *string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ContainerClientBreakLeaseOptions contains the optional parameters for the ContainerClient.BreakLease method.\ntype ContainerClientBreakLeaseOptions struct {\n\t// For a break operation, proposed duration the lease should continue before it is broken, in seconds, between 0 and 60. This\n\t// break period is only used if it is shorter than the time remaining on the\n\t// lease. If longer, the time remaining on the lease is used. A new lease will not be available before the break period has\n\t// expired, but the lease may be held for longer than the break period. If this\n\t// header does not appear with a break operation, a fixed-duration lease breaks after the remaining lease period elapses,\n\t// and an infinite lease breaks immediately.\n\tBreakPeriod *int32\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ContainerClientChangeLeaseOptions contains the optional parameters for the ContainerClient.ChangeLease method.\ntype ContainerClientChangeLeaseOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ContainerClientCreateOptions contains the optional parameters for the ContainerClient.Create method.\ntype ContainerClientCreateOptions struct {\n\t// Specifies whether data in the container may be accessed publicly and the level of access\n\tAccess *PublicAccessType\n\n\t// Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the\n\t// operation will copy the metadata from the source blob or file to the destination\n\t// blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata\n\t// is not copied from the source blob or file. Note that beginning with\n\t// version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers,\n\t// Blobs, and Metadata for more information.\n\tMetadata map[string]*string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ContainerClientDeleteOptions contains the optional parameters for the ContainerClient.Delete method.\ntype ContainerClientDeleteOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ContainerClientFilterBlobsOptions contains the optional parameters for the ContainerClient.FilterBlobs method.\ntype ContainerClientFilterBlobsOptions struct {\n\t// Include this parameter to specify one or more datasets to include in the response.\n\tInclude []FilterBlobsIncludeItem\n\n\t// A string value that identifies the portion of the list of containers to be returned with the next listing operation. The\n\t// operation returns the NextMarker value within the response body if the listing\n\t// operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used\n\t// as the value for the marker parameter in a subsequent call to request the next\n\t// page of list items. The marker value is opaque to the client.\n\tMarker *string\n\n\t// Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value\n\t// greater than 5000, the server will return up to 5000 items. Note that if the\n\t// listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder\n\t// of the results. For this reason, it is possible that the service will\n\t// return fewer results than specified by maxresults, or than the default of 5000.\n\tMaxresults *int32\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ContainerClientGetAccessPolicyOptions contains the optional parameters for the ContainerClient.GetAccessPolicy method.\ntype ContainerClientGetAccessPolicyOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ContainerClientGetAccountInfoOptions contains the optional parameters for the ContainerClient.GetAccountInfo method.\ntype ContainerClientGetAccountInfoOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ContainerClientGetPropertiesOptions contains the optional parameters for the ContainerClient.GetProperties method.\ntype ContainerClientGetPropertiesOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ContainerClientListBlobFlatSegmentOptions contains the optional parameters for the ContainerClient.NewListBlobFlatSegmentPager\n// method.\ntype ContainerClientListBlobFlatSegmentOptions struct {\n\t// Include this parameter to specify one or more datasets to include in the response.\n\tInclude []ListBlobsIncludeItem\n\n\t// A string value that identifies the portion of the list of containers to be returned with the next listing operation. The\n\t// operation returns the NextMarker value within the response body if the listing\n\t// operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used\n\t// as the value for the marker parameter in a subsequent call to request the next\n\t// page of list items. The marker value is opaque to the client.\n\tMarker *string\n\n\t// Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value\n\t// greater than 5000, the server will return up to 5000 items. Note that if the\n\t// listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder\n\t// of the results. For this reason, it is possible that the service will\n\t// return fewer results than specified by maxresults, or than the default of 5000.\n\tMaxresults *int32\n\n\t// Filters the results to return only containers whose name begins with the specified prefix.\n\tPrefix *string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ContainerClientListBlobHierarchySegmentOptions contains the optional parameters for the ContainerClient.NewListBlobHierarchySegmentPager\n// method.\ntype ContainerClientListBlobHierarchySegmentOptions struct {\n\t// Include this parameter to specify one or more datasets to include in the response.\n\tInclude []ListBlobsIncludeItem\n\n\t// A string value that identifies the portion of the list of containers to be returned with the next listing operation. The\n\t// operation returns the NextMarker value within the response body if the listing\n\t// operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used\n\t// as the value for the marker parameter in a subsequent call to request the next\n\t// page of list items. The marker value is opaque to the client.\n\tMarker *string\n\n\t// Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value\n\t// greater than 5000, the server will return up to 5000 items. Note that if the\n\t// listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder\n\t// of the results. For this reason, it is possible that the service will\n\t// return fewer results than specified by maxresults, or than the default of 5000.\n\tMaxresults *int32\n\n\t// Filters the results to return only containers whose name begins with the specified prefix.\n\tPrefix *string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ContainerClientReleaseLeaseOptions contains the optional parameters for the ContainerClient.ReleaseLease method.\ntype ContainerClientReleaseLeaseOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ContainerClientRenameOptions contains the optional parameters for the ContainerClient.Rename method.\ntype ContainerClientRenameOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// A lease ID for the source path. If specified, the source path must have an active lease and the lease ID must match.\n\tSourceLeaseID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ContainerClientRenewLeaseOptions contains the optional parameters for the ContainerClient.RenewLease method.\ntype ContainerClientRenewLeaseOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ContainerClientRestoreOptions contains the optional parameters for the ContainerClient.Restore method.\ntype ContainerClientRestoreOptions struct {\n\t// Optional. Version 2019-12-12 and later. Specifies the name of the deleted container to restore.\n\tDeletedContainerName *string\n\n\t// Optional. Version 2019-12-12 and later. Specifies the version of the deleted container to restore.\n\tDeletedContainerVersion *string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ContainerClientSetAccessPolicyOptions contains the optional parameters for the ContainerClient.SetAccessPolicy method.\ntype ContainerClientSetAccessPolicyOptions struct {\n\t// Specifies whether data in the container may be accessed publicly and the level of access\n\tAccess *PublicAccessType\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ContainerClientSetMetadataOptions contains the optional parameters for the ContainerClient.SetMetadata method.\ntype ContainerClientSetMetadataOptions struct {\n\t// Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the\n\t// operation will copy the metadata from the source blob or file to the destination\n\t// blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata\n\t// is not copied from the source blob or file. Note that beginning with\n\t// version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers,\n\t// Blobs, and Metadata for more information.\n\tMetadata map[string]*string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ContainerClientSubmitBatchOptions contains the optional parameters for the ContainerClient.SubmitBatch method.\ntype ContainerClientSubmitBatchOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ContainerCPKScopeInfo contains a group of parameters for the ContainerClient.Create method.\ntype ContainerCPKScopeInfo struct {\n\t// Optional. Version 2019-07-07 and later. Specifies the default encryption scope to set on the container and use for all\n\t// future writes.\n\tDefaultEncryptionScope *string\n\n\t// Optional. Version 2019-07-07 and newer. If true, prevents any request from specifying a different encryption scope than\n\t// the scope set on the container.\n\tPreventEncryptionScopeOverride *bool\n}\n\n// CPKInfo contains a group of parameters for the BlobClient.Download method.\ntype CPKInfo struct {\n\t// The algorithm used to produce the encryption key hash. Currently, the only accepted value is \"AES256\". Must be provided\n\t// if the x-ms-encryption-key header is provided.\n\tEncryptionAlgorithm *EncryptionAlgorithmType\n\n\t// Optional. Specifies the encryption key to use to encrypt the data provided in the request. If not specified, encryption\n\t// is performed with the root account encryption key. For more information, see\n\t// Encryption at Rest for Azure Storage Services.\n\tEncryptionKey *string\n\n\t// The SHA-256 hash of the provided encryption key. Must be provided if the x-ms-encryption-key header is provided.\n\tEncryptionKeySHA256 *string\n}\n\n// CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method.\ntype CPKScopeInfo struct {\n\t// Optional. Version 2019-07-07 and later. Specifies the name of the encryption scope to use to encrypt the data provided\n\t// in the request. If not specified, encryption is performed with the default\n\t// account encryption scope. For more information, see Encryption at Rest for Azure Storage Services.\n\tEncryptionScope *string\n}\n\n// LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\ntype LeaseAccessConditions struct {\n\t// If specified, the operation only succeeds if the resource's lease is active and matches this ID.\n\tLeaseID *string\n}\n\n// ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\ntype ModifiedAccessConditions struct {\n\t// Specify an ETag value to operate only on blobs with a matching value.\n\tIfMatch *azcore.ETag\n\n\t// Specify this header value to operate only on a blob if it has been modified since the specified date/time.\n\tIfModifiedSince *time.Time\n\n\t// Specify an ETag value to operate only on blobs without a matching value.\n\tIfNoneMatch *azcore.ETag\n\n\t// Specify a SQL where clause on blob tags to operate only on blobs with a matching value.\n\tIfTags *string\n\n\t// Specify this header value to operate only on a blob if it has not been modified since the specified date/time.\n\tIfUnmodifiedSince *time.Time\n}\n\n// PageBlobClientClearPagesOptions contains the optional parameters for the PageBlobClient.ClearPages method.\ntype PageBlobClientClearPagesOptions struct {\n\t// Return only the bytes of the blob in the specified range.\n\tRange *string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// PageBlobClientCopyIncrementalOptions contains the optional parameters for the PageBlobClient.CopyIncremental method.\ntype PageBlobClientCopyIncrementalOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// PageBlobClientCreateOptions contains the optional parameters for the PageBlobClient.Create method.\ntype PageBlobClientCreateOptions struct {\n\t// Set for page blobs only. The sequence number is a user-controlled value that you can use to track requests. The value of\n\t// the sequence number must be between 0 and 2^63 - 1.\n\tBlobSequenceNumber *int64\n\n\t// Optional. Used to set blob tags in various blob operations.\n\tBlobTagsString *string\n\n\t// Specifies the date time when the blobs immutability policy is set to expire.\n\tImmutabilityPolicyExpiry *time.Time\n\n\t// Specifies the immutability policy mode to set on the blob.\n\tImmutabilityPolicyMode *ImmutabilityPolicySetting\n\n\t// Specified if a legal hold should be set on the blob.\n\tLegalHold *bool\n\n\t// Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the\n\t// operation will copy the metadata from the source blob or file to the destination\n\t// blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata\n\t// is not copied from the source blob or file. Note that beginning with\n\t// version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers,\n\t// Blobs, and Metadata for more information.\n\tMetadata map[string]*string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// Optional. Indicates the tier to be set on the page blob.\n\tTier *PremiumPageBlobAccessTier\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// PageBlobClientGetPageRangesDiffOptions contains the optional parameters for the PageBlobClient.NewGetPageRangesDiffPager\n// method.\ntype PageBlobClientGetPageRangesDiffOptions struct {\n\t// A string value that identifies the portion of the list of containers to be returned with the next listing operation. The\n\t// operation returns the NextMarker value within the response body if the listing\n\t// operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used\n\t// as the value for the marker parameter in a subsequent call to request the next\n\t// page of list items. The marker value is opaque to the client.\n\tMarker *string\n\n\t// Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value\n\t// greater than 5000, the server will return up to 5000 items. Note that if the\n\t// listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder\n\t// of the results. For this reason, it is possible that the service will\n\t// return fewer results than specified by maxresults, or than the default of 5000.\n\tMaxresults *int32\n\n\t// Optional. This header is only supported in service versions 2019-04-19 and after and specifies the URL of a previous snapshot\n\t// of the target blob. The response will only contain pages that were changed\n\t// between the target blob and its previous snapshot.\n\tPrevSnapshotURL *string\n\n\t// Optional in version 2015-07-08 and newer. The prevsnapshot parameter is a DateTime value that specifies that the response\n\t// will contain only pages that were changed between target blob and previous\n\t// snapshot. Changed pages include both updated and cleared pages. The target blob may be a snapshot, as long as the snapshot\n\t// specified by prevsnapshot is the older of the two. Note that incremental\n\t// snapshots are currently supported only for blobs created on or after January 1, 2016.\n\tPrevsnapshot *string\n\n\t// Return only the bytes of the blob in the specified range.\n\tRange *string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more\n\t// information on working with blob snapshots, see Creating a Snapshot of a Blob.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob]\n\tSnapshot *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// PageBlobClientGetPageRangesOptions contains the optional parameters for the PageBlobClient.NewGetPageRangesPager method.\ntype PageBlobClientGetPageRangesOptions struct {\n\t// A string value that identifies the portion of the list of containers to be returned with the next listing operation. The\n\t// operation returns the NextMarker value within the response body if the listing\n\t// operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used\n\t// as the value for the marker parameter in a subsequent call to request the next\n\t// page of list items. The marker value is opaque to the client.\n\tMarker *string\n\n\t// Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value\n\t// greater than 5000, the server will return up to 5000 items. Note that if the\n\t// listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder\n\t// of the results. For this reason, it is possible that the service will\n\t// return fewer results than specified by maxresults, or than the default of 5000.\n\tMaxresults *int32\n\n\t// Return only the bytes of the blob in the specified range.\n\tRange *string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more\n\t// information on working with blob snapshots, see Creating a Snapshot of a Blob.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob]\n\tSnapshot *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// PageBlobClientResizeOptions contains the optional parameters for the PageBlobClient.Resize method.\ntype PageBlobClientResizeOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// PageBlobClientUpdateSequenceNumberOptions contains the optional parameters for the PageBlobClient.UpdateSequenceNumber\n// method.\ntype PageBlobClientUpdateSequenceNumberOptions struct {\n\t// Set for page blobs only. The sequence number is a user-controlled value that you can use to track requests. The value of\n\t// the sequence number must be between 0 and 2^63 - 1.\n\tBlobSequenceNumber *int64\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// PageBlobClientUploadPagesFromURLOptions contains the optional parameters for the PageBlobClient.UploadPagesFromURL method.\ntype PageBlobClientUploadPagesFromURLOptions struct {\n\t// Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source.\n\tCopySourceAuthorization *string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// Specify the md5 calculated for the range of bytes that must be read from the copy source.\n\tSourceContentMD5 []byte\n\n\t// Specify the crc64 calculated for the range of bytes that must be read from the copy source.\n\tSourceContentcrc64 []byte\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// PageBlobClientUploadPagesOptions contains the optional parameters for the PageBlobClient.UploadPages method.\ntype PageBlobClientUploadPagesOptions struct {\n\t// Return only the bytes of the blob in the specified range.\n\tRange *string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// Required if the request body is a structured message. Specifies the message schema version and properties.\n\tStructuredBodyType *string\n\n\t// Required if the request body is a structured message. Specifies the length of the blob/file content inside the message\n\t// body. Will always be smaller than Content-Length.\n\tStructuredContentLength *int64\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n\n\t// Specify the transactional crc64 for the body, to be validated by the service.\n\tTransactionalContentCRC64 []byte\n\n\t// Specify the transactional md5 for the body, to be validated by the service.\n\tTransactionalContentMD5 []byte\n}\n\n// SequenceNumberAccessConditions contains a group of parameters for the PageBlobClient.UploadPages method.\ntype SequenceNumberAccessConditions struct {\n\t// Specify this header value to operate only on a blob if it has the specified sequence number.\n\tIfSequenceNumberEqualTo *int64\n\n\t// Specify this header value to operate only on a blob if it has a sequence number less than the specified.\n\tIfSequenceNumberLessThan *int64\n\n\t// Specify this header value to operate only on a blob if it has a sequence number less than or equal to the specified.\n\tIfSequenceNumberLessThanOrEqualTo *int64\n}\n\n// ServiceClientFilterBlobsOptions contains the optional parameters for the ServiceClient.FilterBlobs method.\ntype ServiceClientFilterBlobsOptions struct {\n\t// Include this parameter to specify one or more datasets to include in the response.\n\tInclude []FilterBlobsIncludeItem\n\n\t// A string value that identifies the portion of the list of containers to be returned with the next listing operation. The\n\t// operation returns the NextMarker value within the response body if the listing\n\t// operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used\n\t// as the value for the marker parameter in a subsequent call to request the next\n\t// page of list items. The marker value is opaque to the client.\n\tMarker *string\n\n\t// Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value\n\t// greater than 5000, the server will return up to 5000 items. Note that if the\n\t// listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder\n\t// of the results. For this reason, it is possible that the service will\n\t// return fewer results than specified by maxresults, or than the default of 5000.\n\tMaxresults *int32\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ServiceClientGetAccountInfoOptions contains the optional parameters for the ServiceClient.GetAccountInfo method.\ntype ServiceClientGetAccountInfoOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ServiceClientGetPropertiesOptions contains the optional parameters for the ServiceClient.GetProperties method.\ntype ServiceClientGetPropertiesOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ServiceClientGetStatisticsOptions contains the optional parameters for the ServiceClient.GetStatistics method.\ntype ServiceClientGetStatisticsOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ServiceClientGetUserDelegationKeyOptions contains the optional parameters for the ServiceClient.GetUserDelegationKey method.\ntype ServiceClientGetUserDelegationKeyOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ServiceClientListContainersSegmentOptions contains the optional parameters for the ServiceClient.NewListContainersSegmentPager\n// method.\ntype ServiceClientListContainersSegmentOptions struct {\n\t// Include this parameter to specify that the container's metadata be returned as part of the response body.\n\tInclude []ListContainersIncludeType\n\n\t// A string value that identifies the portion of the list of containers to be returned with the next listing operation. The\n\t// operation returns the NextMarker value within the response body if the listing\n\t// operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used\n\t// as the value for the marker parameter in a subsequent call to request the next\n\t// page of list items. The marker value is opaque to the client.\n\tMarker *string\n\n\t// Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value\n\t// greater than 5000, the server will return up to 5000 items. Note that if the\n\t// listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder\n\t// of the results. For this reason, it is possible that the service will\n\t// return fewer results than specified by maxresults, or than the default of 5000.\n\tMaxresults *int32\n\n\t// Filters the results to return only containers whose name begins with the specified prefix.\n\tPrefix *string\n\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ServiceClientSetPropertiesOptions contains the optional parameters for the ServiceClient.SetProperties method.\ntype ServiceClientSetPropertiesOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// ServiceClientSubmitBatchOptions contains the optional parameters for the ServiceClient.SubmitBatch method.\ntype ServiceClientSubmitBatchOptions struct {\n\t// Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n\t// analytics logging is enabled.\n\tRequestID *string\n\n\t// The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations]\n\tTimeout *int32\n}\n\n// SourceModifiedAccessConditions contains a group of parameters for the BlobClient.StartCopyFromURL method.\ntype SourceModifiedAccessConditions struct {\n\t// Specify an ETag value to operate only on blobs with a matching value.\n\tSourceIfMatch *azcore.ETag\n\n\t// Specify this header value to operate only on a blob if it has been modified since the specified date/time.\n\tSourceIfModifiedSince *time.Time\n\n\t// Specify an ETag value to operate only on blobs without a matching value.\n\tSourceIfNoneMatch *azcore.ETag\n\n\t// Specify a SQL where clause on blob tags to operate only on blobs with a matching value.\n\tSourceIfTags *string\n\n\t// Specify this header value to operate only on a blob if it has not been modified since the specified date/time.\n\tSourceIfUnmodifiedSince *time.Time\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_pageblob_client.go",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n// Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\npackage generated\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"io\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"time\"\n)\n\n// PageBlobClient contains the methods for the PageBlob group.\n// Don't use this type directly, use a constructor function instead.\ntype PageBlobClient struct {\n\tinternal *azcore.Client\n\tendpoint string\n}\n\n// ClearPages - The Clear Pages operation clears a set of pages from a page blob\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - contentLength - The length of the request.\n//   - options - PageBlobClientClearPagesOptions contains the optional parameters for the PageBlobClient.ClearPages method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method.\n//   - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method.\n//   - SequenceNumberAccessConditions - SequenceNumberAccessConditions contains a group of parameters for the PageBlobClient.UploadPages\n//     method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *PageBlobClient) ClearPages(ctx context.Context, contentLength int64, options *PageBlobClientClearPagesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobClientClearPagesResponse, error) {\n\tvar err error\n\treq, err := client.clearPagesCreateRequest(ctx, contentLength, options, leaseAccessConditions, cpkInfo, cpkScopeInfo, sequenceNumberAccessConditions, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn PageBlobClientClearPagesResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn PageBlobClientClearPagesResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusCreated) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn PageBlobClientClearPagesResponse{}, err\n\t}\n\tresp, err := client.clearPagesHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// clearPagesCreateRequest creates the ClearPages request.\nfunc (client *PageBlobClient) clearPagesCreateRequest(ctx context.Context, contentLength int64, options *PageBlobClientClearPagesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"page\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\treq.Raw().Header[\"Content-Length\"] = []string{strconv.FormatInt(contentLength, 10)}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-algorithm\"] = []string{string(*cpkInfo.EncryptionAlgorithm)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKey != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key\"] = []string{*cpkInfo.EncryptionKey}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key-sha256\"] = []string{*cpkInfo.EncryptionKeySHA256}\n\t}\n\tif cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-scope\"] = []string{*cpkScopeInfo.EncryptionScope}\n\t}\n\tif sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberEqualTo != nil {\n\t\treq.Raw().Header[\"x-ms-if-sequence-number-eq\"] = []string{strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberEqualTo, 10)}\n\t}\n\tif sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberLessThanOrEqualTo != nil {\n\t\treq.Raw().Header[\"x-ms-if-sequence-number-le\"] = []string{strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberLessThanOrEqualTo, 10)}\n\t}\n\tif sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberLessThan != nil {\n\t\treq.Raw().Header[\"x-ms-if-sequence-number-lt\"] = []string{strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberLessThan, 10)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-page-write\"] = []string{\"clear\"}\n\tif options != nil && options.Range != nil {\n\t\treq.Raw().Header[\"x-ms-range\"] = []string{*options.Range}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// clearPagesHandleResponse handles the ClearPages response.\nfunc (client *PageBlobClient) clearPagesHandleResponse(resp *http.Response) (PageBlobClientClearPagesResponse, error) {\n\tresult := PageBlobClientClearPagesResponse{}\n\tif val := resp.Header.Get(\"x-ms-blob-sequence-number\"); val != \"\" {\n\t\tblobSequenceNumber, err := strconv.ParseInt(val, 10, 64)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientClearPagesResponse{}, err\n\t\t}\n\t\tresult.BlobSequenceNumber = &blobSequenceNumber\n\t}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-content-crc64\"); val != \"\" {\n\t\tcontentCRC64, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientClearPagesResponse{}, err\n\t\t}\n\t\tresult.ContentCRC64 = contentCRC64\n\t}\n\tif val := resp.Header.Get(\"Content-MD5\"); val != \"\" {\n\t\tcontentMD5, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientClearPagesResponse{}, err\n\t\t}\n\t\tresult.ContentMD5 = contentMD5\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientClearPagesResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientClearPagesResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// CopyIncremental - The Copy Incremental operation copies a snapshot of the source page blob to a destination page blob.\n// The snapshot is copied such that only the differential changes between the previously copied\n// snapshot are transferred to the destination. The copied snapshots are complete copies of the original snapshot and can\n// be read or copied from as usual. This API is supported since REST version\n// 2016-05-31.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - copySource - Specifies the name of the source page blob snapshot. This value is a URL of up to 2 KB in length that specifies\n//     a page blob snapshot. The value should be URL-encoded as it would appear in a request\n//     URI. The source blob must either be public or must be authenticated via a shared access signature.\n//   - options - PageBlobClientCopyIncrementalOptions contains the optional parameters for the PageBlobClient.CopyIncremental\n//     method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *PageBlobClient) CopyIncremental(ctx context.Context, copySource string, options *PageBlobClientCopyIncrementalOptions, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobClientCopyIncrementalResponse, error) {\n\tvar err error\n\treq, err := client.copyIncrementalCreateRequest(ctx, copySource, options, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn PageBlobClientCopyIncrementalResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn PageBlobClientCopyIncrementalResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusAccepted) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn PageBlobClientCopyIncrementalResponse{}, err\n\t}\n\tresp, err := client.copyIncrementalHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// copyIncrementalCreateRequest creates the CopyIncremental request.\nfunc (client *PageBlobClient) copyIncrementalCreateRequest(ctx context.Context, copySource string, options *PageBlobClientCopyIncrementalOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"incrementalcopy\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-copy-source\"] = []string{copySource}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// copyIncrementalHandleResponse handles the CopyIncremental response.\nfunc (client *PageBlobClient) copyIncrementalHandleResponse(resp *http.Response) (PageBlobClientCopyIncrementalResponse, error) {\n\tresult := PageBlobClientCopyIncrementalResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-id\"); val != \"\" {\n\t\tresult.CopyID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-copy-status\"); val != \"\" {\n\t\tresult.CopyStatus = (*CopyStatusType)(&val)\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientCopyIncrementalResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientCopyIncrementalResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// Create - The Create operation creates a new page blob.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - contentLength - The length of the request.\n//   - blobContentLength - This header specifies the maximum size for the page blob, up to 1 TB. The page blob size must be aligned\n//     to a 512-byte boundary.\n//   - options - PageBlobClientCreateOptions contains the optional parameters for the PageBlobClient.Create method.\n//   - BlobHTTPHeaders - BlobHTTPHeaders contains a group of parameters for the BlobClient.SetHTTPHeaders method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method.\n//   - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *PageBlobClient) Create(ctx context.Context, contentLength int64, blobContentLength int64, options *PageBlobClientCreateOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobClientCreateResponse, error) {\n\tvar err error\n\treq, err := client.createCreateRequest(ctx, contentLength, blobContentLength, options, blobHTTPHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn PageBlobClientCreateResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn PageBlobClientCreateResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusCreated) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn PageBlobClientCreateResponse{}, err\n\t}\n\tresp, err := client.createHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// createCreateRequest creates the Create request.\nfunc (client *PageBlobClient) createCreateRequest(ctx context.Context, contentLength int64, blobContentLength int64, options *PageBlobClientCreateOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\treq.Raw().Header[\"Content-Length\"] = []string{strconv.FormatInt(contentLength, 10)}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.Tier != nil {\n\t\treq.Raw().Header[\"x-ms-access-tier\"] = []string{string(*options.Tier)}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobCacheControl != nil {\n\t\treq.Raw().Header[\"x-ms-blob-cache-control\"] = []string{*blobHTTPHeaders.BlobCacheControl}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentDisposition != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-disposition\"] = []string{*blobHTTPHeaders.BlobContentDisposition}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentEncoding != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-encoding\"] = []string{*blobHTTPHeaders.BlobContentEncoding}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentLanguage != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-language\"] = []string{*blobHTTPHeaders.BlobContentLanguage}\n\t}\n\treq.Raw().Header[\"x-ms-blob-content-length\"] = []string{strconv.FormatInt(blobContentLength, 10)}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentMD5 != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-md5\"] = []string{base64.StdEncoding.EncodeToString(blobHTTPHeaders.BlobContentMD5)}\n\t}\n\tif blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentType != nil {\n\t\treq.Raw().Header[\"x-ms-blob-content-type\"] = []string{*blobHTTPHeaders.BlobContentType}\n\t}\n\tif options != nil && options.BlobSequenceNumber != nil {\n\t\treq.Raw().Header[\"x-ms-blob-sequence-number\"] = []string{strconv.FormatInt(*options.BlobSequenceNumber, 10)}\n\t}\n\treq.Raw().Header[\"x-ms-blob-type\"] = []string{\"PageBlob\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-algorithm\"] = []string{string(*cpkInfo.EncryptionAlgorithm)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKey != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key\"] = []string{*cpkInfo.EncryptionKey}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key-sha256\"] = []string{*cpkInfo.EncryptionKeySHA256}\n\t}\n\tif cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-scope\"] = []string{*cpkScopeInfo.EncryptionScope}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif options != nil && options.ImmutabilityPolicyMode != nil {\n\t\treq.Raw().Header[\"x-ms-immutability-policy-mode\"] = []string{string(*options.ImmutabilityPolicyMode)}\n\t}\n\tif options != nil && options.ImmutabilityPolicyExpiry != nil {\n\t\treq.Raw().Header[\"x-ms-immutability-policy-until-date\"] = []string{(*options.ImmutabilityPolicyExpiry).In(gmt).Format(time.RFC1123)}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\tif options != nil && options.LegalHold != nil {\n\t\treq.Raw().Header[\"x-ms-legal-hold\"] = []string{strconv.FormatBool(*options.LegalHold)}\n\t}\n\tif options != nil && options.Metadata != nil {\n\t\tfor k, v := range options.Metadata {\n\t\t\tif v != nil {\n\t\t\t\treq.Raw().Header[\"x-ms-meta-\"+k] = []string{*v}\n\t\t\t}\n\t\t}\n\t}\n\tif options != nil && options.BlobTagsString != nil {\n\t\treq.Raw().Header[\"x-ms-tags\"] = []string{*options.BlobTagsString}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// createHandleResponse handles the Create response.\nfunc (client *PageBlobClient) createHandleResponse(resp *http.Response) (PageBlobClientCreateResponse, error) {\n\tresult := PageBlobClientCreateResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Content-MD5\"); val != \"\" {\n\t\tcontentMD5, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientCreateResponse{}, err\n\t\t}\n\t\tresult.ContentMD5 = contentMD5\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientCreateResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-key-sha256\"); val != \"\" {\n\t\tresult.EncryptionKeySHA256 = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-scope\"); val != \"\" {\n\t\tresult.EncryptionScope = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-server-encrypted\"); val != \"\" {\n\t\tisServerEncrypted, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientCreateResponse{}, err\n\t\t}\n\t\tresult.IsServerEncrypted = &isServerEncrypted\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientCreateResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version-id\"); val != \"\" {\n\t\tresult.VersionID = &val\n\t}\n\treturn result, nil\n}\n\n// NewGetPageRangesPager - The Get Page Ranges operation returns the list of valid page ranges for a page blob or snapshot\n// of a page blob\n//\n// Generated from API version 2025-01-05\n//   - options - PageBlobClientGetPageRangesOptions contains the optional parameters for the PageBlobClient.NewGetPageRangesPager\n//     method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *PageBlobClient) NewGetPageRangesPager(options *PageBlobClientGetPageRangesOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) *runtime.Pager[PageBlobClientGetPageRangesResponse] {\n\treturn runtime.NewPager(runtime.PagingHandler[PageBlobClientGetPageRangesResponse]{\n\t\tMore: func(page PageBlobClientGetPageRangesResponse) bool {\n\t\t\treturn page.NextMarker != nil && len(*page.NextMarker) > 0\n\t\t},\n\t\tFetcher: func(ctx context.Context, page *PageBlobClientGetPageRangesResponse) (PageBlobClientGetPageRangesResponse, error) {\n\t\t\tnextLink := \"\"\n\t\t\tif page != nil {\n\t\t\t\tnextLink = *page.NextMarker\n\t\t\t}\n\t\t\tresp, err := runtime.FetcherForNextLink(ctx, client.internal.Pipeline(), nextLink, func(ctx context.Context) (*policy.Request, error) {\n\t\t\t\treturn client.GetPageRangesCreateRequest(ctx, options, leaseAccessConditions, modifiedAccessConditions)\n\t\t\t}, nil)\n\t\t\tif err != nil {\n\t\t\t\treturn PageBlobClientGetPageRangesResponse{}, err\n\t\t\t}\n\t\t\treturn client.GetPageRangesHandleResponse(resp)\n\t\t},\n\t})\n}\n\n// GetPageRangesCreateRequest creates the GetPageRanges request.\nfunc (client *PageBlobClient) GetPageRangesCreateRequest(ctx context.Context, options *PageBlobClientGetPageRangesOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"pagelist\")\n\tif options != nil && options.Marker != nil {\n\t\treqQP.Set(\"marker\", *options.Marker)\n\t}\n\tif options != nil && options.Maxresults != nil {\n\t\treqQP.Set(\"maxresults\", strconv.FormatInt(int64(*options.Maxresults), 10))\n\t}\n\tif options != nil && options.Snapshot != nil {\n\t\treqQP.Set(\"snapshot\", *options.Snapshot)\n\t}\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\tif options != nil && options.Range != nil {\n\t\treq.Raw().Header[\"x-ms-range\"] = []string{*options.Range}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// GetPageRangesHandleResponse handles the GetPageRanges response.\nfunc (client *PageBlobClient) GetPageRangesHandleResponse(resp *http.Response) (PageBlobClientGetPageRangesResponse, error) {\n\tresult := PageBlobClientGetPageRangesResponse{}\n\tif val := resp.Header.Get(\"x-ms-blob-content-length\"); val != \"\" {\n\t\tblobContentLength, err := strconv.ParseInt(val, 10, 64)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientGetPageRangesResponse{}, err\n\t\t}\n\t\tresult.BlobContentLength = &blobContentLength\n\t}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientGetPageRangesResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientGetPageRangesResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif err := runtime.UnmarshalAsXML(resp, &result.PageList); err != nil {\n\t\treturn PageBlobClientGetPageRangesResponse{}, err\n\t}\n\treturn result, nil\n}\n\n// NewGetPageRangesDiffPager - The Get Page Ranges Diff operation returns the list of valid page ranges for a page blob that\n// were changed between target blob and previous snapshot.\n//\n// Generated from API version 2025-01-05\n//   - options - PageBlobClientGetPageRangesDiffOptions contains the optional parameters for the PageBlobClient.NewGetPageRangesDiffPager\n//     method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *PageBlobClient) NewGetPageRangesDiffPager(options *PageBlobClientGetPageRangesDiffOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) *runtime.Pager[PageBlobClientGetPageRangesDiffResponse] {\n\treturn runtime.NewPager(runtime.PagingHandler[PageBlobClientGetPageRangesDiffResponse]{\n\t\tMore: func(page PageBlobClientGetPageRangesDiffResponse) bool {\n\t\t\treturn page.NextMarker != nil && len(*page.NextMarker) > 0\n\t\t},\n\t\tFetcher: func(ctx context.Context, page *PageBlobClientGetPageRangesDiffResponse) (PageBlobClientGetPageRangesDiffResponse, error) {\n\t\t\tnextLink := \"\"\n\t\t\tif page != nil {\n\t\t\t\tnextLink = *page.NextMarker\n\t\t\t}\n\t\t\tresp, err := runtime.FetcherForNextLink(ctx, client.internal.Pipeline(), nextLink, func(ctx context.Context) (*policy.Request, error) {\n\t\t\t\treturn client.GetPageRangesDiffCreateRequest(ctx, options, leaseAccessConditions, modifiedAccessConditions)\n\t\t\t}, nil)\n\t\t\tif err != nil {\n\t\t\t\treturn PageBlobClientGetPageRangesDiffResponse{}, err\n\t\t\t}\n\t\t\treturn client.GetPageRangesDiffHandleResponse(resp)\n\t\t},\n\t})\n}\n\n// GetPageRangesDiffCreateRequest creates the GetPageRangesDiff request.\nfunc (client *PageBlobClient) GetPageRangesDiffCreateRequest(ctx context.Context, options *PageBlobClientGetPageRangesDiffOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"pagelist\")\n\tif options != nil && options.Marker != nil {\n\t\treqQP.Set(\"marker\", *options.Marker)\n\t}\n\tif options != nil && options.Maxresults != nil {\n\t\treqQP.Set(\"maxresults\", strconv.FormatInt(int64(*options.Maxresults), 10))\n\t}\n\tif options != nil && options.Prevsnapshot != nil {\n\t\treqQP.Set(\"prevsnapshot\", *options.Prevsnapshot)\n\t}\n\tif options != nil && options.Snapshot != nil {\n\t\treqQP.Set(\"snapshot\", *options.Snapshot)\n\t}\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\tif options != nil && options.PrevSnapshotURL != nil {\n\t\treq.Raw().Header[\"x-ms-previous-snapshot-url\"] = []string{*options.PrevSnapshotURL}\n\t}\n\tif options != nil && options.Range != nil {\n\t\treq.Raw().Header[\"x-ms-range\"] = []string{*options.Range}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// GetPageRangesDiffHandleResponse handles the GetPageRangesDiff response.\nfunc (client *PageBlobClient) GetPageRangesDiffHandleResponse(resp *http.Response) (PageBlobClientGetPageRangesDiffResponse, error) {\n\tresult := PageBlobClientGetPageRangesDiffResponse{}\n\tif val := resp.Header.Get(\"x-ms-blob-content-length\"); val != \"\" {\n\t\tblobContentLength, err := strconv.ParseInt(val, 10, 64)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientGetPageRangesDiffResponse{}, err\n\t\t}\n\t\tresult.BlobContentLength = &blobContentLength\n\t}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientGetPageRangesDiffResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientGetPageRangesDiffResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif err := runtime.UnmarshalAsXML(resp, &result.PageList); err != nil {\n\t\treturn PageBlobClientGetPageRangesDiffResponse{}, err\n\t}\n\treturn result, nil\n}\n\n// Resize - Resize the Blob\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - blobContentLength - This header specifies the maximum size for the page blob, up to 1 TB. The page blob size must be aligned\n//     to a 512-byte boundary.\n//   - options - PageBlobClientResizeOptions contains the optional parameters for the PageBlobClient.Resize method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method.\n//   - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *PageBlobClient) Resize(ctx context.Context, blobContentLength int64, options *PageBlobClientResizeOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobClientResizeResponse, error) {\n\tvar err error\n\treq, err := client.resizeCreateRequest(ctx, blobContentLength, options, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn PageBlobClientResizeResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn PageBlobClientResizeResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn PageBlobClientResizeResponse{}, err\n\t}\n\tresp, err := client.resizeHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// resizeCreateRequest creates the Resize request.\nfunc (client *PageBlobClient) resizeCreateRequest(ctx context.Context, blobContentLength int64, options *PageBlobClientResizeOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"properties\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\treq.Raw().Header[\"x-ms-blob-content-length\"] = []string{strconv.FormatInt(blobContentLength, 10)}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-algorithm\"] = []string{string(*cpkInfo.EncryptionAlgorithm)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKey != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key\"] = []string{*cpkInfo.EncryptionKey}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key-sha256\"] = []string{*cpkInfo.EncryptionKeySHA256}\n\t}\n\tif cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-scope\"] = []string{*cpkScopeInfo.EncryptionScope}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// resizeHandleResponse handles the Resize response.\nfunc (client *PageBlobClient) resizeHandleResponse(resp *http.Response) (PageBlobClientResizeResponse, error) {\n\tresult := PageBlobClientResizeResponse{}\n\tif val := resp.Header.Get(\"x-ms-blob-sequence-number\"); val != \"\" {\n\t\tblobSequenceNumber, err := strconv.ParseInt(val, 10, 64)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientResizeResponse{}, err\n\t\t}\n\t\tresult.BlobSequenceNumber = &blobSequenceNumber\n\t}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientResizeResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientResizeResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// UpdateSequenceNumber - Update the sequence number of the blob\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - sequenceNumberAction - Required if the x-ms-blob-sequence-number header is set for the request. This property applies to\n//     page blobs only. This property indicates how the service should modify the blob's sequence number\n//   - options - PageBlobClientUpdateSequenceNumberOptions contains the optional parameters for the PageBlobClient.UpdateSequenceNumber\n//     method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *PageBlobClient) UpdateSequenceNumber(ctx context.Context, sequenceNumberAction SequenceNumberActionType, options *PageBlobClientUpdateSequenceNumberOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobClientUpdateSequenceNumberResponse, error) {\n\tvar err error\n\treq, err := client.updateSequenceNumberCreateRequest(ctx, sequenceNumberAction, options, leaseAccessConditions, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn PageBlobClientUpdateSequenceNumberResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn PageBlobClientUpdateSequenceNumberResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn PageBlobClientUpdateSequenceNumberResponse{}, err\n\t}\n\tresp, err := client.updateSequenceNumberHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// updateSequenceNumberCreateRequest creates the UpdateSequenceNumber request.\nfunc (client *PageBlobClient) updateSequenceNumberCreateRequest(ctx context.Context, sequenceNumberAction SequenceNumberActionType, options *PageBlobClientUpdateSequenceNumberOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"properties\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.BlobSequenceNumber != nil {\n\t\treq.Raw().Header[\"x-ms-blob-sequence-number\"] = []string{strconv.FormatInt(*options.BlobSequenceNumber, 10)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-sequence-number-action\"] = []string{string(sequenceNumberAction)}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// updateSequenceNumberHandleResponse handles the UpdateSequenceNumber response.\nfunc (client *PageBlobClient) updateSequenceNumberHandleResponse(resp *http.Response) (PageBlobClientUpdateSequenceNumberResponse, error) {\n\tresult := PageBlobClientUpdateSequenceNumberResponse{}\n\tif val := resp.Header.Get(\"x-ms-blob-sequence-number\"); val != \"\" {\n\t\tblobSequenceNumber, err := strconv.ParseInt(val, 10, 64)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientUpdateSequenceNumberResponse{}, err\n\t\t}\n\t\tresult.BlobSequenceNumber = &blobSequenceNumber\n\t}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientUpdateSequenceNumberResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientUpdateSequenceNumberResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// UploadPages - The Upload Pages operation writes a range of pages to a page blob\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - contentLength - The length of the request.\n//   - body - Initial data\n//   - options - PageBlobClientUploadPagesOptions contains the optional parameters for the PageBlobClient.UploadPages method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method.\n//   - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method.\n//   - SequenceNumberAccessConditions - SequenceNumberAccessConditions contains a group of parameters for the PageBlobClient.UploadPages\n//     method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\nfunc (client *PageBlobClient) UploadPages(ctx context.Context, contentLength int64, body io.ReadSeekCloser, options *PageBlobClientUploadPagesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobClientUploadPagesResponse, error) {\n\tvar err error\n\treq, err := client.uploadPagesCreateRequest(ctx, contentLength, body, options, leaseAccessConditions, cpkInfo, cpkScopeInfo, sequenceNumberAccessConditions, modifiedAccessConditions)\n\tif err != nil {\n\t\treturn PageBlobClientUploadPagesResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn PageBlobClientUploadPagesResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusCreated) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn PageBlobClientUploadPagesResponse{}, err\n\t}\n\tresp, err := client.uploadPagesHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// uploadPagesCreateRequest creates the UploadPages request.\nfunc (client *PageBlobClient) uploadPagesCreateRequest(ctx context.Context, contentLength int64, body io.ReadSeekCloser, options *PageBlobClientUploadPagesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"page\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\treq.Raw().Header[\"Content-Length\"] = []string{strconv.FormatInt(contentLength, 10)}\n\tif options != nil && options.TransactionalContentMD5 != nil {\n\t\treq.Raw().Header[\"Content-MD5\"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentMD5)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\tif options != nil && options.TransactionalContentCRC64 != nil {\n\t\treq.Raw().Header[\"x-ms-content-crc64\"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentCRC64)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-algorithm\"] = []string{string(*cpkInfo.EncryptionAlgorithm)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKey != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key\"] = []string{*cpkInfo.EncryptionKey}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key-sha256\"] = []string{*cpkInfo.EncryptionKeySHA256}\n\t}\n\tif cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-scope\"] = []string{*cpkScopeInfo.EncryptionScope}\n\t}\n\tif sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberEqualTo != nil {\n\t\treq.Raw().Header[\"x-ms-if-sequence-number-eq\"] = []string{strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberEqualTo, 10)}\n\t}\n\tif sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberLessThanOrEqualTo != nil {\n\t\treq.Raw().Header[\"x-ms-if-sequence-number-le\"] = []string{strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberLessThanOrEqualTo, 10)}\n\t}\n\tif sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberLessThan != nil {\n\t\treq.Raw().Header[\"x-ms-if-sequence-number-lt\"] = []string{strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberLessThan, 10)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-page-write\"] = []string{\"update\"}\n\tif options != nil && options.Range != nil {\n\t\treq.Raw().Header[\"x-ms-range\"] = []string{*options.Range}\n\t}\n\tif options != nil && options.StructuredBodyType != nil {\n\t\treq.Raw().Header[\"x-ms-structured-body\"] = []string{*options.StructuredBodyType}\n\t}\n\tif options != nil && options.StructuredContentLength != nil {\n\t\treq.Raw().Header[\"x-ms-structured-content-length\"] = []string{strconv.FormatInt(*options.StructuredContentLength, 10)}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\tif err := req.SetBody(body, \"application/octet-stream\"); err != nil {\n\t\treturn nil, err\n\t}\n\treturn req, nil\n}\n\n// uploadPagesHandleResponse handles the UploadPages response.\nfunc (client *PageBlobClient) uploadPagesHandleResponse(resp *http.Response) (PageBlobClientUploadPagesResponse, error) {\n\tresult := PageBlobClientUploadPagesResponse{}\n\tif val := resp.Header.Get(\"x-ms-blob-sequence-number\"); val != \"\" {\n\t\tblobSequenceNumber, err := strconv.ParseInt(val, 10, 64)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientUploadPagesResponse{}, err\n\t\t}\n\t\tresult.BlobSequenceNumber = &blobSequenceNumber\n\t}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-content-crc64\"); val != \"\" {\n\t\tcontentCRC64, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientUploadPagesResponse{}, err\n\t\t}\n\t\tresult.ContentCRC64 = contentCRC64\n\t}\n\tif val := resp.Header.Get(\"Content-MD5\"); val != \"\" {\n\t\tcontentMD5, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientUploadPagesResponse{}, err\n\t\t}\n\t\tresult.ContentMD5 = contentMD5\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientUploadPagesResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-key-sha256\"); val != \"\" {\n\t\tresult.EncryptionKeySHA256 = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-scope\"); val != \"\" {\n\t\tresult.EncryptionScope = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-server-encrypted\"); val != \"\" {\n\t\tisServerEncrypted, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientUploadPagesResponse{}, err\n\t\t}\n\t\tresult.IsServerEncrypted = &isServerEncrypted\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientUploadPagesResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-structured-body\"); val != \"\" {\n\t\tresult.StructuredBodyType = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// UploadPagesFromURL - The Upload Pages operation writes a range of pages to a page blob where the contents are read from\n// a URL\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - sourceURL - Specify a URL to the copy source.\n//   - sourceRange - Bytes of source data in the specified range. The length of this range should match the ContentLength header\n//     and x-ms-range/Range destination range header.\n//   - contentLength - The length of the request.\n//   - rangeParam - The range of bytes to which the source range would be written. The range should be 512 aligned and range-end\n//     is required.\n//   - options - PageBlobClientUploadPagesFromURLOptions contains the optional parameters for the PageBlobClient.UploadPagesFromURL\n//     method.\n//   - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method.\n//   - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method.\n//   - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method.\n//   - SequenceNumberAccessConditions - SequenceNumberAccessConditions contains a group of parameters for the PageBlobClient.UploadPages\n//     method.\n//   - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method.\n//   - SourceModifiedAccessConditions - SourceModifiedAccessConditions contains a group of parameters for the BlobClient.StartCopyFromURL\n//     method.\nfunc (client *PageBlobClient) UploadPagesFromURL(ctx context.Context, sourceURL string, sourceRange string, contentLength int64, rangeParam string, options *PageBlobClientUploadPagesFromURLOptions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, leaseAccessConditions *LeaseAccessConditions, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (PageBlobClientUploadPagesFromURLResponse, error) {\n\tvar err error\n\treq, err := client.uploadPagesFromURLCreateRequest(ctx, sourceURL, sourceRange, contentLength, rangeParam, options, cpkInfo, cpkScopeInfo, leaseAccessConditions, sequenceNumberAccessConditions, modifiedAccessConditions, sourceModifiedAccessConditions)\n\tif err != nil {\n\t\treturn PageBlobClientUploadPagesFromURLResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn PageBlobClientUploadPagesFromURLResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusCreated) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn PageBlobClientUploadPagesFromURLResponse{}, err\n\t}\n\tresp, err := client.uploadPagesFromURLHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// uploadPagesFromURLCreateRequest creates the UploadPagesFromURL request.\nfunc (client *PageBlobClient) uploadPagesFromURLCreateRequest(ctx context.Context, sourceURL string, sourceRange string, contentLength int64, rangeParam string, options *PageBlobClientUploadPagesFromURLOptions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, leaseAccessConditions *LeaseAccessConditions, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"page\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = reqQP.Encode()\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\treq.Raw().Header[\"Content-Length\"] = []string{strconv.FormatInt(contentLength, 10)}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil {\n\t\treq.Raw().Header[\"If-Match\"] = []string{string(*modifiedAccessConditions.IfMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil {\n\t\treq.Raw().Header[\"If-Modified-Since\"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil {\n\t\treq.Raw().Header[\"If-None-Match\"] = []string{string(*modifiedAccessConditions.IfNoneMatch)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"If-Unmodified-Since\"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-copy-source\"] = []string{sourceURL}\n\tif options != nil && options.CopySourceAuthorization != nil {\n\t\treq.Raw().Header[\"x-ms-copy-source-authorization\"] = []string{*options.CopySourceAuthorization}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-algorithm\"] = []string{string(*cpkInfo.EncryptionAlgorithm)}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKey != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key\"] = []string{*cpkInfo.EncryptionKey}\n\t}\n\tif cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-key-sha256\"] = []string{*cpkInfo.EncryptionKeySHA256}\n\t}\n\tif cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil {\n\t\treq.Raw().Header[\"x-ms-encryption-scope\"] = []string{*cpkScopeInfo.EncryptionScope}\n\t}\n\tif sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberEqualTo != nil {\n\t\treq.Raw().Header[\"x-ms-if-sequence-number-eq\"] = []string{strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberEqualTo, 10)}\n\t}\n\tif sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberLessThanOrEqualTo != nil {\n\t\treq.Raw().Header[\"x-ms-if-sequence-number-le\"] = []string{strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberLessThanOrEqualTo, 10)}\n\t}\n\tif sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberLessThan != nil {\n\t\treq.Raw().Header[\"x-ms-if-sequence-number-lt\"] = []string{strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberLessThan, 10)}\n\t}\n\tif modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil {\n\t\treq.Raw().Header[\"x-ms-if-tags\"] = []string{*modifiedAccessConditions.IfTags}\n\t}\n\tif leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil {\n\t\treq.Raw().Header[\"x-ms-lease-id\"] = []string{*leaseAccessConditions.LeaseID}\n\t}\n\treq.Raw().Header[\"x-ms-page-write\"] = []string{\"update\"}\n\treq.Raw().Header[\"x-ms-range\"] = []string{rangeParam}\n\tif options != nil && options.SourceContentcrc64 != nil {\n\t\treq.Raw().Header[\"x-ms-source-content-crc64\"] = []string{base64.StdEncoding.EncodeToString(options.SourceContentcrc64)}\n\t}\n\tif options != nil && options.SourceContentMD5 != nil {\n\t\treq.Raw().Header[\"x-ms-source-content-md5\"] = []string{base64.StdEncoding.EncodeToString(options.SourceContentMD5)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfMatch != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-match\"] = []string{string(*sourceModifiedAccessConditions.SourceIfMatch)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfModifiedSince != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-modified-since\"] = []string{(*sourceModifiedAccessConditions.SourceIfModifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfNoneMatch != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-none-match\"] = []string{string(*sourceModifiedAccessConditions.SourceIfNoneMatch)}\n\t}\n\tif sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfUnmodifiedSince != nil {\n\t\treq.Raw().Header[\"x-ms-source-if-unmodified-since\"] = []string{(*sourceModifiedAccessConditions.SourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)}\n\t}\n\treq.Raw().Header[\"x-ms-source-range\"] = []string{sourceRange}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// uploadPagesFromURLHandleResponse handles the UploadPagesFromURL response.\nfunc (client *PageBlobClient) uploadPagesFromURLHandleResponse(resp *http.Response) (PageBlobClientUploadPagesFromURLResponse, error) {\n\tresult := PageBlobClientUploadPagesFromURLResponse{}\n\tif val := resp.Header.Get(\"x-ms-blob-sequence-number\"); val != \"\" {\n\t\tblobSequenceNumber, err := strconv.ParseInt(val, 10, 64)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientUploadPagesFromURLResponse{}, err\n\t\t}\n\t\tresult.BlobSequenceNumber = &blobSequenceNumber\n\t}\n\tif val := resp.Header.Get(\"x-ms-content-crc64\"); val != \"\" {\n\t\tcontentCRC64, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientUploadPagesFromURLResponse{}, err\n\t\t}\n\t\tresult.ContentCRC64 = contentCRC64\n\t}\n\tif val := resp.Header.Get(\"Content-MD5\"); val != \"\" {\n\t\tcontentMD5, err := base64.StdEncoding.DecodeString(val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientUploadPagesFromURLResponse{}, err\n\t\t}\n\t\tresult.ContentMD5 = contentMD5\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientUploadPagesFromURLResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"ETag\"); val != \"\" {\n\t\tresult.ETag = (*azcore.ETag)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-key-sha256\"); val != \"\" {\n\t\tresult.EncryptionKeySHA256 = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-encryption-scope\"); val != \"\" {\n\t\tresult.EncryptionScope = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-server-encrypted\"); val != \"\" {\n\t\tisServerEncrypted, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientUploadPagesFromURLResponse{}, err\n\t\t}\n\t\tresult.IsServerEncrypted = &isServerEncrypted\n\t}\n\tif val := resp.Header.Get(\"Last-Modified\"); val != \"\" {\n\t\tlastModified, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn PageBlobClientUploadPagesFromURLResponse{}, err\n\t\t}\n\t\tresult.LastModified = &lastModified\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_responses.go",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n// Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\npackage generated\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"io\"\n\t\"time\"\n)\n\n// AppendBlobClientAppendBlockFromURLResponse contains the response from method AppendBlobClient.AppendBlockFromURL.\ntype AppendBlobClientAppendBlockFromURLResponse struct {\n\t// BlobAppendOffset contains the information returned from the x-ms-blob-append-offset header response.\n\tBlobAppendOffset *string\n\n\t// BlobCommittedBlockCount contains the information returned from the x-ms-blob-committed-block-count header response.\n\tBlobCommittedBlockCount *int32\n\n\t// ContentCRC64 contains the information returned from the x-ms-content-crc64 header response.\n\tContentCRC64 []byte\n\n\t// ContentMD5 contains the information returned from the Content-MD5 header response.\n\tContentMD5 []byte\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response.\n\tEncryptionKeySHA256 *string\n\n\t// EncryptionScope contains the information returned from the x-ms-encryption-scope header response.\n\tEncryptionScope *string\n\n\t// IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response.\n\tIsServerEncrypted *bool\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// AppendBlobClientAppendBlockResponse contains the response from method AppendBlobClient.AppendBlock.\ntype AppendBlobClientAppendBlockResponse struct {\n\t// BlobAppendOffset contains the information returned from the x-ms-blob-append-offset header response.\n\tBlobAppendOffset *string\n\n\t// BlobCommittedBlockCount contains the information returned from the x-ms-blob-committed-block-count header response.\n\tBlobCommittedBlockCount *int32\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// ContentCRC64 contains the information returned from the x-ms-content-crc64 header response.\n\tContentCRC64 []byte\n\n\t// ContentMD5 contains the information returned from the Content-MD5 header response.\n\tContentMD5 []byte\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response.\n\tEncryptionKeySHA256 *string\n\n\t// EncryptionScope contains the information returned from the x-ms-encryption-scope header response.\n\tEncryptionScope *string\n\n\t// IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response.\n\tIsServerEncrypted *bool\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// StructuredBodyType contains the information returned from the x-ms-structured-body header response.\n\tStructuredBodyType *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// AppendBlobClientCreateResponse contains the response from method AppendBlobClient.Create.\ntype AppendBlobClientCreateResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// ContentMD5 contains the information returned from the Content-MD5 header response.\n\tContentMD5 []byte\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response.\n\tEncryptionKeySHA256 *string\n\n\t// EncryptionScope contains the information returned from the x-ms-encryption-scope header response.\n\tEncryptionScope *string\n\n\t// IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response.\n\tIsServerEncrypted *bool\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n\n\t// VersionID contains the information returned from the x-ms-version-id header response.\n\tVersionID *string\n}\n\n// AppendBlobClientSealResponse contains the response from method AppendBlobClient.Seal.\ntype AppendBlobClientSealResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// IsSealed contains the information returned from the x-ms-blob-sealed header response.\n\tIsSealed *bool\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlobClientAbortCopyFromURLResponse contains the response from method BlobClient.AbortCopyFromURL.\ntype BlobClientAbortCopyFromURLResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlobClientAcquireLeaseResponse contains the response from method BlobClient.AcquireLease.\ntype BlobClientAcquireLeaseResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// LeaseID contains the information returned from the x-ms-lease-id header response.\n\tLeaseID *string\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlobClientBreakLeaseResponse contains the response from method BlobClient.BreakLease.\ntype BlobClientBreakLeaseResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// LeaseTime contains the information returned from the x-ms-lease-time header response.\n\tLeaseTime *int32\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlobClientChangeLeaseResponse contains the response from method BlobClient.ChangeLease.\ntype BlobClientChangeLeaseResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// LeaseID contains the information returned from the x-ms-lease-id header response.\n\tLeaseID *string\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlobClientCopyFromURLResponse contains the response from method BlobClient.CopyFromURL.\ntype BlobClientCopyFromURLResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// ContentCRC64 contains the information returned from the x-ms-content-crc64 header response.\n\tContentCRC64 []byte\n\n\t// ContentMD5 contains the information returned from the Content-MD5 header response.\n\tContentMD5 []byte\n\n\t// CopyID contains the information returned from the x-ms-copy-id header response.\n\tCopyID *string\n\n\t// CopyStatus contains the information returned from the x-ms-copy-status header response.\n\tCopyStatus *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// EncryptionScope contains the information returned from the x-ms-encryption-scope header response.\n\tEncryptionScope *string\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n\n\t// VersionID contains the information returned from the x-ms-version-id header response.\n\tVersionID *string\n}\n\n// BlobClientCreateSnapshotResponse contains the response from method BlobClient.CreateSnapshot.\ntype BlobClientCreateSnapshotResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response.\n\tIsServerEncrypted *bool\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Snapshot contains the information returned from the x-ms-snapshot header response.\n\tSnapshot *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n\n\t// VersionID contains the information returned from the x-ms-version-id header response.\n\tVersionID *string\n}\n\n// BlobClientDeleteImmutabilityPolicyResponse contains the response from method BlobClient.DeleteImmutabilityPolicy.\ntype BlobClientDeleteImmutabilityPolicyResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlobClientDeleteResponse contains the response from method BlobClient.Delete.\ntype BlobClientDeleteResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlobClientDownloadResponse contains the response from method BlobClient.Download.\ntype BlobClientDownloadResponse struct {\n\t// AcceptRanges contains the information returned from the Accept-Ranges header response.\n\tAcceptRanges *string\n\n\t// BlobCommittedBlockCount contains the information returned from the x-ms-blob-committed-block-count header response.\n\tBlobCommittedBlockCount *int32\n\n\t// BlobContentMD5 contains the information returned from the x-ms-blob-content-md5 header response.\n\tBlobContentMD5 []byte\n\n\t// BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response.\n\tBlobSequenceNumber *int64\n\n\t// BlobType contains the information returned from the x-ms-blob-type header response.\n\tBlobType *BlobType\n\n\t// Body contains the streaming response.\n\tBody io.ReadCloser\n\n\t// CacheControl contains the information returned from the Cache-Control header response.\n\tCacheControl *string\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// ContentCRC64 contains the information returned from the x-ms-content-crc64 header response.\n\tContentCRC64 []byte\n\n\t// ContentDisposition contains the information returned from the Content-Disposition header response.\n\tContentDisposition *string\n\n\t// ContentEncoding contains the information returned from the Content-Encoding header response.\n\tContentEncoding *string\n\n\t// ContentLanguage contains the information returned from the Content-Language header response.\n\tContentLanguage *string\n\n\t// ContentLength contains the information returned from the Content-Length header response.\n\tContentLength *int64\n\n\t// ContentMD5 contains the information returned from the Content-MD5 header response.\n\tContentMD5 []byte\n\n\t// ContentRange contains the information returned from the Content-Range header response.\n\tContentRange *string\n\n\t// ContentType contains the information returned from the Content-Type header response.\n\tContentType *string\n\n\t// CopyCompletionTime contains the information returned from the x-ms-copy-completion-time header response.\n\tCopyCompletionTime *time.Time\n\n\t// CopyID contains the information returned from the x-ms-copy-id header response.\n\tCopyID *string\n\n\t// CopyProgress contains the information returned from the x-ms-copy-progress header response.\n\tCopyProgress *string\n\n\t// CopySource contains the information returned from the x-ms-copy-source header response.\n\tCopySource *string\n\n\t// CopyStatus contains the information returned from the x-ms-copy-status header response.\n\tCopyStatus *CopyStatusType\n\n\t// CopyStatusDescription contains the information returned from the x-ms-copy-status-description header response.\n\tCopyStatusDescription *string\n\n\t// CreationTime contains the information returned from the x-ms-creation-time header response.\n\tCreationTime *time.Time\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response.\n\tEncryptionKeySHA256 *string\n\n\t// EncryptionScope contains the information returned from the x-ms-encryption-scope header response.\n\tEncryptionScope *string\n\n\t// ErrorCode contains the information returned from the x-ms-error-code header response.\n\tErrorCode *string\n\n\t// ImmutabilityPolicyExpiresOn contains the information returned from the x-ms-immutability-policy-until-date header response.\n\tImmutabilityPolicyExpiresOn *time.Time\n\n\t// ImmutabilityPolicyMode contains the information returned from the x-ms-immutability-policy-mode header response.\n\tImmutabilityPolicyMode *ImmutabilityPolicyMode\n\n\t// IsCurrentVersion contains the information returned from the x-ms-is-current-version header response.\n\tIsCurrentVersion *bool\n\n\t// IsSealed contains the information returned from the x-ms-blob-sealed header response.\n\tIsSealed *bool\n\n\t// IsServerEncrypted contains the information returned from the x-ms-server-encrypted header response.\n\tIsServerEncrypted *bool\n\n\t// LastAccessed contains the information returned from the x-ms-last-access-time header response.\n\tLastAccessed *time.Time\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// LeaseDuration contains the information returned from the x-ms-lease-duration header response.\n\tLeaseDuration *LeaseDurationType\n\n\t// LeaseState contains the information returned from the x-ms-lease-state header response.\n\tLeaseState *LeaseStateType\n\n\t// LeaseStatus contains the information returned from the x-ms-lease-status header response.\n\tLeaseStatus *LeaseStatusType\n\n\t// LegalHold contains the information returned from the x-ms-legal-hold header response.\n\tLegalHold *bool\n\n\t// Metadata contains the information returned from the x-ms-meta header response.\n\tMetadata map[string]*string\n\n\t// ObjectReplicationPolicyID contains the information returned from the x-ms-or-policy-id header response.\n\tObjectReplicationPolicyID *string\n\n\t// ObjectReplicationRules contains the information returned from the x-ms-or header response.\n\tObjectReplicationRules map[string]*string\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// StructuredBodyType contains the information returned from the x-ms-structured-body header response.\n\tStructuredBodyType *string\n\n\t// StructuredContentLength contains the information returned from the x-ms-structured-content-length header response.\n\tStructuredContentLength *int64\n\n\t// TagCount contains the information returned from the x-ms-tag-count header response.\n\tTagCount *int64\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n\n\t// VersionID contains the information returned from the x-ms-version-id header response.\n\tVersionID *string\n}\n\n// BlobClientGetAccountInfoResponse contains the response from method BlobClient.GetAccountInfo.\ntype BlobClientGetAccountInfoResponse struct {\n\t// AccountKind contains the information returned from the x-ms-account-kind header response.\n\tAccountKind *AccountKind\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// IsHierarchicalNamespaceEnabled contains the information returned from the x-ms-is-hns-enabled header response.\n\tIsHierarchicalNamespaceEnabled *bool\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// SKUName contains the information returned from the x-ms-sku-name header response.\n\tSKUName *SKUName\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlobClientGetPropertiesResponse contains the response from method BlobClient.GetProperties.\ntype BlobClientGetPropertiesResponse struct {\n\t// AcceptRanges contains the information returned from the Accept-Ranges header response.\n\tAcceptRanges *string\n\n\t// AccessTier contains the information returned from the x-ms-access-tier header response.\n\tAccessTier *string\n\n\t// AccessTierChangeTime contains the information returned from the x-ms-access-tier-change-time header response.\n\tAccessTierChangeTime *time.Time\n\n\t// AccessTierInferred contains the information returned from the x-ms-access-tier-inferred header response.\n\tAccessTierInferred *bool\n\n\t// ArchiveStatus contains the information returned from the x-ms-archive-status header response.\n\tArchiveStatus *string\n\n\t// BlobCommittedBlockCount contains the information returned from the x-ms-blob-committed-block-count header response.\n\tBlobCommittedBlockCount *int32\n\n\t// BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response.\n\tBlobSequenceNumber *int64\n\n\t// BlobType contains the information returned from the x-ms-blob-type header response.\n\tBlobType *BlobType\n\n\t// CacheControl contains the information returned from the Cache-Control header response.\n\tCacheControl *string\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// ContentDisposition contains the information returned from the Content-Disposition header response.\n\tContentDisposition *string\n\n\t// ContentEncoding contains the information returned from the Content-Encoding header response.\n\tContentEncoding *string\n\n\t// ContentLanguage contains the information returned from the Content-Language header response.\n\tContentLanguage *string\n\n\t// ContentLength contains the information returned from the Content-Length header response.\n\tContentLength *int64\n\n\t// ContentMD5 contains the information returned from the Content-MD5 header response.\n\tContentMD5 []byte\n\n\t// ContentType contains the information returned from the Content-Type header response.\n\tContentType *string\n\n\t// CopyCompletionTime contains the information returned from the x-ms-copy-completion-time header response.\n\tCopyCompletionTime *time.Time\n\n\t// CopyID contains the information returned from the x-ms-copy-id header response.\n\tCopyID *string\n\n\t// CopyProgress contains the information returned from the x-ms-copy-progress header response.\n\tCopyProgress *string\n\n\t// CopySource contains the information returned from the x-ms-copy-source header response.\n\tCopySource *string\n\n\t// CopyStatus contains the information returned from the x-ms-copy-status header response.\n\tCopyStatus *CopyStatusType\n\n\t// CopyStatusDescription contains the information returned from the x-ms-copy-status-description header response.\n\tCopyStatusDescription *string\n\n\t// CreationTime contains the information returned from the x-ms-creation-time header response.\n\tCreationTime *time.Time\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// DestinationSnapshot contains the information returned from the x-ms-copy-destination-snapshot header response.\n\tDestinationSnapshot *string\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response.\n\tEncryptionKeySHA256 *string\n\n\t// EncryptionScope contains the information returned from the x-ms-encryption-scope header response.\n\tEncryptionScope *string\n\n\t// ExpiresOn contains the information returned from the x-ms-expiry-time header response.\n\tExpiresOn *time.Time\n\n\t// ImmutabilityPolicyExpiresOn contains the information returned from the x-ms-immutability-policy-until-date header response.\n\tImmutabilityPolicyExpiresOn *time.Time\n\n\t// ImmutabilityPolicyMode contains the information returned from the x-ms-immutability-policy-mode header response.\n\tImmutabilityPolicyMode *ImmutabilityPolicyMode\n\n\t// IsCurrentVersion contains the information returned from the x-ms-is-current-version header response.\n\tIsCurrentVersion *bool\n\n\t// IsIncrementalCopy contains the information returned from the x-ms-incremental-copy header response.\n\tIsIncrementalCopy *bool\n\n\t// IsSealed contains the information returned from the x-ms-blob-sealed header response.\n\tIsSealed *bool\n\n\t// IsServerEncrypted contains the information returned from the x-ms-server-encrypted header response.\n\tIsServerEncrypted *bool\n\n\t// LastAccessed contains the information returned from the x-ms-last-access-time header response.\n\tLastAccessed *time.Time\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// LeaseDuration contains the information returned from the x-ms-lease-duration header response.\n\tLeaseDuration *LeaseDurationType\n\n\t// LeaseState contains the information returned from the x-ms-lease-state header response.\n\tLeaseState *LeaseStateType\n\n\t// LeaseStatus contains the information returned from the x-ms-lease-status header response.\n\tLeaseStatus *LeaseStatusType\n\n\t// LegalHold contains the information returned from the x-ms-legal-hold header response.\n\tLegalHold *bool\n\n\t// Metadata contains the information returned from the x-ms-meta header response.\n\tMetadata map[string]*string\n\n\t// ObjectReplicationPolicyID contains the information returned from the x-ms-or-policy-id header response.\n\tObjectReplicationPolicyID *string\n\n\t// ObjectReplicationRules contains the information returned from the x-ms-or header response.\n\tObjectReplicationRules map[string]*string\n\n\t// RehydratePriority contains the information returned from the x-ms-rehydrate-priority header response.\n\tRehydratePriority *string\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// TagCount contains the information returned from the x-ms-tag-count header response.\n\tTagCount *int64\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n\n\t// VersionID contains the information returned from the x-ms-version-id header response.\n\tVersionID *string\n}\n\n// BlobClientGetTagsResponse contains the response from method BlobClient.GetTags.\ntype BlobClientGetTagsResponse struct {\n\t// Blob tags\n\tBlobTags\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlobClientQueryResponse contains the response from method BlobClient.Query.\ntype BlobClientQueryResponse struct {\n\t// AcceptRanges contains the information returned from the Accept-Ranges header response.\n\tAcceptRanges *string\n\n\t// BlobCommittedBlockCount contains the information returned from the x-ms-blob-committed-block-count header response.\n\tBlobCommittedBlockCount *int32\n\n\t// BlobContentMD5 contains the information returned from the x-ms-blob-content-md5 header response.\n\tBlobContentMD5 []byte\n\n\t// BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response.\n\tBlobSequenceNumber *int64\n\n\t// BlobType contains the information returned from the x-ms-blob-type header response.\n\tBlobType *BlobType\n\n\t// Body contains the streaming response.\n\tBody io.ReadCloser\n\n\t// CacheControl contains the information returned from the Cache-Control header response.\n\tCacheControl *string\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// ContentCRC64 contains the information returned from the x-ms-content-crc64 header response.\n\tContentCRC64 []byte\n\n\t// ContentDisposition contains the information returned from the Content-Disposition header response.\n\tContentDisposition *string\n\n\t// ContentEncoding contains the information returned from the Content-Encoding header response.\n\tContentEncoding *string\n\n\t// ContentLanguage contains the information returned from the Content-Language header response.\n\tContentLanguage *string\n\n\t// ContentLength contains the information returned from the Content-Length header response.\n\tContentLength *int64\n\n\t// ContentMD5 contains the information returned from the Content-MD5 header response.\n\tContentMD5 []byte\n\n\t// ContentRange contains the information returned from the Content-Range header response.\n\tContentRange *string\n\n\t// ContentType contains the information returned from the Content-Type header response.\n\tContentType *string\n\n\t// CopyCompletionTime contains the information returned from the x-ms-copy-completion-time header response.\n\tCopyCompletionTime *time.Time\n\n\t// CopyID contains the information returned from the x-ms-copy-id header response.\n\tCopyID *string\n\n\t// CopyProgress contains the information returned from the x-ms-copy-progress header response.\n\tCopyProgress *string\n\n\t// CopySource contains the information returned from the x-ms-copy-source header response.\n\tCopySource *string\n\n\t// CopyStatus contains the information returned from the x-ms-copy-status header response.\n\tCopyStatus *CopyStatusType\n\n\t// CopyStatusDescription contains the information returned from the x-ms-copy-status-description header response.\n\tCopyStatusDescription *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response.\n\tEncryptionKeySHA256 *string\n\n\t// EncryptionScope contains the information returned from the x-ms-encryption-scope header response.\n\tEncryptionScope *string\n\n\t// IsServerEncrypted contains the information returned from the x-ms-server-encrypted header response.\n\tIsServerEncrypted *bool\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// LeaseDuration contains the information returned from the x-ms-lease-duration header response.\n\tLeaseDuration *LeaseDurationType\n\n\t// LeaseState contains the information returned from the x-ms-lease-state header response.\n\tLeaseState *LeaseStateType\n\n\t// LeaseStatus contains the information returned from the x-ms-lease-status header response.\n\tLeaseStatus *LeaseStatusType\n\n\t// Metadata contains the information returned from the x-ms-meta header response.\n\tMetadata map[string]*string\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlobClientReleaseLeaseResponse contains the response from method BlobClient.ReleaseLease.\ntype BlobClientReleaseLeaseResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlobClientRenewLeaseResponse contains the response from method BlobClient.RenewLease.\ntype BlobClientRenewLeaseResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// LeaseID contains the information returned from the x-ms-lease-id header response.\n\tLeaseID *string\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlobClientSetExpiryResponse contains the response from method BlobClient.SetExpiry.\ntype BlobClientSetExpiryResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlobClientSetHTTPHeadersResponse contains the response from method BlobClient.SetHTTPHeaders.\ntype BlobClientSetHTTPHeadersResponse struct {\n\t// BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response.\n\tBlobSequenceNumber *int64\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlobClientSetImmutabilityPolicyResponse contains the response from method BlobClient.SetImmutabilityPolicy.\ntype BlobClientSetImmutabilityPolicyResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ImmutabilityPolicyExpiry contains the information returned from the x-ms-immutability-policy-until-date header response.\n\tImmutabilityPolicyExpiry *time.Time\n\n\t// ImmutabilityPolicyMode contains the information returned from the x-ms-immutability-policy-mode header response.\n\tImmutabilityPolicyMode *ImmutabilityPolicyMode\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlobClientSetLegalHoldResponse contains the response from method BlobClient.SetLegalHold.\ntype BlobClientSetLegalHoldResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// LegalHold contains the information returned from the x-ms-legal-hold header response.\n\tLegalHold *bool\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlobClientSetMetadataResponse contains the response from method BlobClient.SetMetadata.\ntype BlobClientSetMetadataResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response.\n\tEncryptionKeySHA256 *string\n\n\t// EncryptionScope contains the information returned from the x-ms-encryption-scope header response.\n\tEncryptionScope *string\n\n\t// IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response.\n\tIsServerEncrypted *bool\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n\n\t// VersionID contains the information returned from the x-ms-version-id header response.\n\tVersionID *string\n}\n\n// BlobClientSetTagsResponse contains the response from method BlobClient.SetTags.\ntype BlobClientSetTagsResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlobClientSetTierResponse contains the response from method BlobClient.SetTier.\ntype BlobClientSetTierResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlobClientStartCopyFromURLResponse contains the response from method BlobClient.StartCopyFromURL.\ntype BlobClientStartCopyFromURLResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// CopyID contains the information returned from the x-ms-copy-id header response.\n\tCopyID *string\n\n\t// CopyStatus contains the information returned from the x-ms-copy-status header response.\n\tCopyStatus *CopyStatusType\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n\n\t// VersionID contains the information returned from the x-ms-version-id header response.\n\tVersionID *string\n}\n\n// BlobClientUndeleteResponse contains the response from method BlobClient.Undelete.\ntype BlobClientUndeleteResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlockBlobClientCommitBlockListResponse contains the response from method BlockBlobClient.CommitBlockList.\ntype BlockBlobClientCommitBlockListResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// ContentCRC64 contains the information returned from the x-ms-content-crc64 header response.\n\tContentCRC64 []byte\n\n\t// ContentMD5 contains the information returned from the Content-MD5 header response.\n\tContentMD5 []byte\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response.\n\tEncryptionKeySHA256 *string\n\n\t// EncryptionScope contains the information returned from the x-ms-encryption-scope header response.\n\tEncryptionScope *string\n\n\t// IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response.\n\tIsServerEncrypted *bool\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n\n\t// VersionID contains the information returned from the x-ms-version-id header response.\n\tVersionID *string\n}\n\n// BlockBlobClientGetBlockListResponse contains the response from method BlockBlobClient.GetBlockList.\ntype BlockBlobClientGetBlockListResponse struct {\n\tBlockList\n\n\t// BlobContentLength contains the information returned from the x-ms-blob-content-length header response.\n\tBlobContentLength *int64\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// ContentType contains the information returned from the Content-Type header response.\n\tContentType *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlockBlobClientPutBlobFromURLResponse contains the response from method BlockBlobClient.PutBlobFromURL.\ntype BlockBlobClientPutBlobFromURLResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// ContentMD5 contains the information returned from the Content-MD5 header response.\n\tContentMD5 []byte\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response.\n\tEncryptionKeySHA256 *string\n\n\t// EncryptionScope contains the information returned from the x-ms-encryption-scope header response.\n\tEncryptionScope *string\n\n\t// IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response.\n\tIsServerEncrypted *bool\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n\n\t// VersionID contains the information returned from the x-ms-version-id header response.\n\tVersionID *string\n}\n\n// BlockBlobClientStageBlockFromURLResponse contains the response from method BlockBlobClient.StageBlockFromURL.\ntype BlockBlobClientStageBlockFromURLResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// ContentCRC64 contains the information returned from the x-ms-content-crc64 header response.\n\tContentCRC64 []byte\n\n\t// ContentMD5 contains the information returned from the Content-MD5 header response.\n\tContentMD5 []byte\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response.\n\tEncryptionKeySHA256 *string\n\n\t// EncryptionScope contains the information returned from the x-ms-encryption-scope header response.\n\tEncryptionScope *string\n\n\t// IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response.\n\tIsServerEncrypted *bool\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlockBlobClientStageBlockResponse contains the response from method BlockBlobClient.StageBlock.\ntype BlockBlobClientStageBlockResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// ContentCRC64 contains the information returned from the x-ms-content-crc64 header response.\n\tContentCRC64 []byte\n\n\t// ContentMD5 contains the information returned from the Content-MD5 header response.\n\tContentMD5 []byte\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response.\n\tEncryptionKeySHA256 *string\n\n\t// EncryptionScope contains the information returned from the x-ms-encryption-scope header response.\n\tEncryptionScope *string\n\n\t// IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response.\n\tIsServerEncrypted *bool\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// StructuredBodyType contains the information returned from the x-ms-structured-body header response.\n\tStructuredBodyType *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BlockBlobClientUploadResponse contains the response from method BlockBlobClient.Upload.\ntype BlockBlobClientUploadResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// ContentCRC64 contains the information returned from the x-ms-content-crc64 header response.\n\tContentCRC64 []byte\n\n\t// ContentMD5 contains the information returned from the Content-MD5 header response.\n\tContentMD5 []byte\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response.\n\tEncryptionKeySHA256 *string\n\n\t// EncryptionScope contains the information returned from the x-ms-encryption-scope header response.\n\tEncryptionScope *string\n\n\t// IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response.\n\tIsServerEncrypted *bool\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// StructuredBodyType contains the information returned from the x-ms-structured-body header response.\n\tStructuredBodyType *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n\n\t// VersionID contains the information returned from the x-ms-version-id header response.\n\tVersionID *string\n}\n\n// ContainerClientAcquireLeaseResponse contains the response from method ContainerClient.AcquireLease.\ntype ContainerClientAcquireLeaseResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// LeaseID contains the information returned from the x-ms-lease-id header response.\n\tLeaseID *string\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ContainerClientBreakLeaseResponse contains the response from method ContainerClient.BreakLease.\ntype ContainerClientBreakLeaseResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// LeaseTime contains the information returned from the x-ms-lease-time header response.\n\tLeaseTime *int32\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ContainerClientChangeLeaseResponse contains the response from method ContainerClient.ChangeLease.\ntype ContainerClientChangeLeaseResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// LeaseID contains the information returned from the x-ms-lease-id header response.\n\tLeaseID *string\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ContainerClientCreateResponse contains the response from method ContainerClient.Create.\ntype ContainerClientCreateResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ContainerClientDeleteResponse contains the response from method ContainerClient.Delete.\ntype ContainerClientDeleteResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ContainerClientFilterBlobsResponse contains the response from method ContainerClient.FilterBlobs.\ntype ContainerClientFilterBlobsResponse struct {\n\t// The result of a Filter Blobs API call\n\tFilterBlobSegment\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ContainerClientGetAccessPolicyResponse contains the response from method ContainerClient.GetAccessPolicy.\ntype ContainerClientGetAccessPolicyResponse struct {\n\t// BlobPublicAccess contains the information returned from the x-ms-blob-public-access header response.\n\tBlobPublicAccess *PublicAccessType\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// a collection of signed identifiers\n\tSignedIdentifiers []*SignedIdentifier `xml:\"SignedIdentifier\"`\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ContainerClientGetAccountInfoResponse contains the response from method ContainerClient.GetAccountInfo.\ntype ContainerClientGetAccountInfoResponse struct {\n\t// AccountKind contains the information returned from the x-ms-account-kind header response.\n\tAccountKind *AccountKind\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// IsHierarchicalNamespaceEnabled contains the information returned from the x-ms-is-hns-enabled header response.\n\tIsHierarchicalNamespaceEnabled *bool\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// SKUName contains the information returned from the x-ms-sku-name header response.\n\tSKUName *SKUName\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ContainerClientGetPropertiesResponse contains the response from method ContainerClient.GetProperties.\ntype ContainerClientGetPropertiesResponse struct {\n\t// BlobPublicAccess contains the information returned from the x-ms-blob-public-access header response.\n\tBlobPublicAccess *PublicAccessType\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// DefaultEncryptionScope contains the information returned from the x-ms-default-encryption-scope header response.\n\tDefaultEncryptionScope *string\n\n\t// DenyEncryptionScopeOverride contains the information returned from the x-ms-deny-encryption-scope-override header response.\n\tDenyEncryptionScopeOverride *bool\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// HasImmutabilityPolicy contains the information returned from the x-ms-has-immutability-policy header response.\n\tHasImmutabilityPolicy *bool\n\n\t// HasLegalHold contains the information returned from the x-ms-has-legal-hold header response.\n\tHasLegalHold *bool\n\n\t// IsImmutableStorageWithVersioningEnabled contains the information returned from the x-ms-immutable-storage-with-versioning-enabled\n\t// header response.\n\tIsImmutableStorageWithVersioningEnabled *bool\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// LeaseDuration contains the information returned from the x-ms-lease-duration header response.\n\tLeaseDuration *LeaseDurationType\n\n\t// LeaseState contains the information returned from the x-ms-lease-state header response.\n\tLeaseState *LeaseStateType\n\n\t// LeaseStatus contains the information returned from the x-ms-lease-status header response.\n\tLeaseStatus *LeaseStatusType\n\n\t// Metadata contains the information returned from the x-ms-meta header response.\n\tMetadata map[string]*string\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ContainerClientListBlobFlatSegmentResponse contains the response from method ContainerClient.NewListBlobFlatSegmentPager.\ntype ContainerClientListBlobFlatSegmentResponse struct {\n\t// An enumeration of blobs\n\tListBlobsFlatSegmentResponse\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// ContentType contains the information returned from the Content-Type header response.\n\tContentType *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ContainerClientListBlobHierarchySegmentResponse contains the response from method ContainerClient.NewListBlobHierarchySegmentPager.\ntype ContainerClientListBlobHierarchySegmentResponse struct {\n\t// An enumeration of blobs\n\tListBlobsHierarchySegmentResponse\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// ContentType contains the information returned from the Content-Type header response.\n\tContentType *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ContainerClientReleaseLeaseResponse contains the response from method ContainerClient.ReleaseLease.\ntype ContainerClientReleaseLeaseResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ContainerClientRenameResponse contains the response from method ContainerClient.Rename.\ntype ContainerClientRenameResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ContainerClientRenewLeaseResponse contains the response from method ContainerClient.RenewLease.\ntype ContainerClientRenewLeaseResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// LeaseID contains the information returned from the x-ms-lease-id header response.\n\tLeaseID *string\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ContainerClientRestoreResponse contains the response from method ContainerClient.Restore.\ntype ContainerClientRestoreResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ContainerClientSetAccessPolicyResponse contains the response from method ContainerClient.SetAccessPolicy.\ntype ContainerClientSetAccessPolicyResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ContainerClientSetMetadataResponse contains the response from method ContainerClient.SetMetadata.\ntype ContainerClientSetMetadataResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ContainerClientSubmitBatchResponse contains the response from method ContainerClient.SubmitBatch.\ntype ContainerClientSubmitBatchResponse struct {\n\t// Body contains the streaming response.\n\tBody io.ReadCloser\n\n\t// ContentType contains the information returned from the Content-Type header response.\n\tContentType *string\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// PageBlobClientClearPagesResponse contains the response from method PageBlobClient.ClearPages.\ntype PageBlobClientClearPagesResponse struct {\n\t// BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response.\n\tBlobSequenceNumber *int64\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// ContentCRC64 contains the information returned from the x-ms-content-crc64 header response.\n\tContentCRC64 []byte\n\n\t// ContentMD5 contains the information returned from the Content-MD5 header response.\n\tContentMD5 []byte\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// PageBlobClientCopyIncrementalResponse contains the response from method PageBlobClient.CopyIncremental.\ntype PageBlobClientCopyIncrementalResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// CopyID contains the information returned from the x-ms-copy-id header response.\n\tCopyID *string\n\n\t// CopyStatus contains the information returned from the x-ms-copy-status header response.\n\tCopyStatus *CopyStatusType\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// PageBlobClientCreateResponse contains the response from method PageBlobClient.Create.\ntype PageBlobClientCreateResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// ContentMD5 contains the information returned from the Content-MD5 header response.\n\tContentMD5 []byte\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response.\n\tEncryptionKeySHA256 *string\n\n\t// EncryptionScope contains the information returned from the x-ms-encryption-scope header response.\n\tEncryptionScope *string\n\n\t// IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response.\n\tIsServerEncrypted *bool\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n\n\t// VersionID contains the information returned from the x-ms-version-id header response.\n\tVersionID *string\n}\n\n// PageBlobClientGetPageRangesDiffResponse contains the response from method PageBlobClient.NewGetPageRangesDiffPager.\ntype PageBlobClientGetPageRangesDiffResponse struct {\n\t// the list of pages\n\tPageList\n\n\t// BlobContentLength contains the information returned from the x-ms-blob-content-length header response.\n\tBlobContentLength *int64\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// PageBlobClientGetPageRangesResponse contains the response from method PageBlobClient.NewGetPageRangesPager.\ntype PageBlobClientGetPageRangesResponse struct {\n\t// the list of pages\n\tPageList\n\n\t// BlobContentLength contains the information returned from the x-ms-blob-content-length header response.\n\tBlobContentLength *int64\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// PageBlobClientResizeResponse contains the response from method PageBlobClient.Resize.\ntype PageBlobClientResizeResponse struct {\n\t// BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response.\n\tBlobSequenceNumber *int64\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// PageBlobClientUpdateSequenceNumberResponse contains the response from method PageBlobClient.UpdateSequenceNumber.\ntype PageBlobClientUpdateSequenceNumberResponse struct {\n\t// BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response.\n\tBlobSequenceNumber *int64\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// PageBlobClientUploadPagesFromURLResponse contains the response from method PageBlobClient.UploadPagesFromURL.\ntype PageBlobClientUploadPagesFromURLResponse struct {\n\t// BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response.\n\tBlobSequenceNumber *int64\n\n\t// ContentCRC64 contains the information returned from the x-ms-content-crc64 header response.\n\tContentCRC64 []byte\n\n\t// ContentMD5 contains the information returned from the Content-MD5 header response.\n\tContentMD5 []byte\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response.\n\tEncryptionKeySHA256 *string\n\n\t// EncryptionScope contains the information returned from the x-ms-encryption-scope header response.\n\tEncryptionScope *string\n\n\t// IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response.\n\tIsServerEncrypted *bool\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// PageBlobClientUploadPagesResponse contains the response from method PageBlobClient.UploadPages.\ntype PageBlobClientUploadPagesResponse struct {\n\t// BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response.\n\tBlobSequenceNumber *int64\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// ContentCRC64 contains the information returned from the x-ms-content-crc64 header response.\n\tContentCRC64 []byte\n\n\t// ContentMD5 contains the information returned from the Content-MD5 header response.\n\tContentMD5 []byte\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// ETag contains the information returned from the ETag header response.\n\tETag *azcore.ETag\n\n\t// EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response.\n\tEncryptionKeySHA256 *string\n\n\t// EncryptionScope contains the information returned from the x-ms-encryption-scope header response.\n\tEncryptionScope *string\n\n\t// IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response.\n\tIsServerEncrypted *bool\n\n\t// LastModified contains the information returned from the Last-Modified header response.\n\tLastModified *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// StructuredBodyType contains the information returned from the x-ms-structured-body header response.\n\tStructuredBodyType *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ServiceClientFilterBlobsResponse contains the response from method ServiceClient.FilterBlobs.\ntype ServiceClientFilterBlobsResponse struct {\n\t// The result of a Filter Blobs API call\n\tFilterBlobSegment\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ServiceClientGetAccountInfoResponse contains the response from method ServiceClient.GetAccountInfo.\ntype ServiceClientGetAccountInfoResponse struct {\n\t// AccountKind contains the information returned from the x-ms-account-kind header response.\n\tAccountKind *AccountKind\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// IsHierarchicalNamespaceEnabled contains the information returned from the x-ms-is-hns-enabled header response.\n\tIsHierarchicalNamespaceEnabled *bool\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// SKUName contains the information returned from the x-ms-sku-name header response.\n\tSKUName *SKUName\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ServiceClientGetPropertiesResponse contains the response from method ServiceClient.GetProperties.\ntype ServiceClientGetPropertiesResponse struct {\n\t// Storage Service Properties.\n\tStorageServiceProperties\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ServiceClientGetStatisticsResponse contains the response from method ServiceClient.GetStatistics.\ntype ServiceClientGetStatisticsResponse struct {\n\t// Stats for the storage service.\n\tStorageServiceStats\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ServiceClientGetUserDelegationKeyResponse contains the response from method ServiceClient.GetUserDelegationKey.\ntype ServiceClientGetUserDelegationKeyResponse struct {\n\t// A user delegation key\n\tUserDelegationKey\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// Date contains the information returned from the Date header response.\n\tDate *time.Time\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ServiceClientListContainersSegmentResponse contains the response from method ServiceClient.NewListContainersSegmentPager.\ntype ServiceClientListContainersSegmentResponse struct {\n\t// An enumeration of containers\n\tListContainersSegmentResponse\n\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ServiceClientSetPropertiesResponse contains the response from method ServiceClient.SetProperties.\ntype ServiceClientSetPropertiesResponse struct {\n\t// ClientRequestID contains the information returned from the x-ms-client-request-id header response.\n\tClientRequestID *string\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// ServiceClientSubmitBatchResponse contains the response from method ServiceClient.SubmitBatch.\ntype ServiceClientSubmitBatchResponse struct {\n\t// Body contains the streaming response.\n\tBody io.ReadCloser\n\n\t// ContentType contains the information returned from the Content-Type header response.\n\tContentType *string\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_service_client.go",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n// Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\npackage generated\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"io\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n)\n\n// ServiceClient contains the methods for the Service group.\n// Don't use this type directly, use a constructor function instead.\ntype ServiceClient struct {\n\tinternal *azcore.Client\n\tendpoint string\n}\n\n// FilterBlobs - The Filter Blobs operation enables callers to list blobs across all containers whose tags match a given search\n// expression. Filter blobs searches across all containers within a storage account but can\n// be scoped within the expression to a single container.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - where - Filters the results to return only to return only blobs whose tags match the specified expression.\n//   - options - ServiceClientFilterBlobsOptions contains the optional parameters for the ServiceClient.FilterBlobs method.\nfunc (client *ServiceClient) FilterBlobs(ctx context.Context, where string, options *ServiceClientFilterBlobsOptions) (ServiceClientFilterBlobsResponse, error) {\n\tvar err error\n\treq, err := client.filterBlobsCreateRequest(ctx, where, options)\n\tif err != nil {\n\t\treturn ServiceClientFilterBlobsResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ServiceClientFilterBlobsResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ServiceClientFilterBlobsResponse{}, err\n\t}\n\tresp, err := client.filterBlobsHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// filterBlobsCreateRequest creates the FilterBlobs request.\nfunc (client *ServiceClient) filterBlobsCreateRequest(ctx context.Context, where string, options *ServiceClientFilterBlobsOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"blobs\")\n\tif options != nil && options.Include != nil {\n\t\treqQP.Set(\"include\", strings.Join(strings.Fields(strings.Trim(fmt.Sprint(options.Include), \"[]\")), \",\"))\n\t}\n\tif options != nil && options.Marker != nil {\n\t\treqQP.Set(\"marker\", *options.Marker)\n\t}\n\tif options != nil && options.Maxresults != nil {\n\t\treqQP.Set(\"maxresults\", strconv.FormatInt(int64(*options.Maxresults), 10))\n\t}\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treqQP.Set(\"where\", where)\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// filterBlobsHandleResponse handles the FilterBlobs response.\nfunc (client *ServiceClient) filterBlobsHandleResponse(resp *http.Response) (ServiceClientFilterBlobsResponse, error) {\n\tresult := ServiceClientFilterBlobsResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ServiceClientFilterBlobsResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif err := runtime.UnmarshalAsXML(resp, &result.FilterBlobSegment); err != nil {\n\t\treturn ServiceClientFilterBlobsResponse{}, err\n\t}\n\treturn result, nil\n}\n\n// GetAccountInfo - Returns the sku name and account kind\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - ServiceClientGetAccountInfoOptions contains the optional parameters for the ServiceClient.GetAccountInfo method.\nfunc (client *ServiceClient) GetAccountInfo(ctx context.Context, options *ServiceClientGetAccountInfoOptions) (ServiceClientGetAccountInfoResponse, error) {\n\tvar err error\n\treq, err := client.getAccountInfoCreateRequest(ctx, options)\n\tif err != nil {\n\t\treturn ServiceClientGetAccountInfoResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ServiceClientGetAccountInfoResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ServiceClientGetAccountInfoResponse{}, err\n\t}\n\tresp, err := client.getAccountInfoHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// getAccountInfoCreateRequest creates the GetAccountInfo request.\nfunc (client *ServiceClient) getAccountInfoCreateRequest(ctx context.Context, options *ServiceClientGetAccountInfoOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"properties\")\n\treqQP.Set(\"restype\", \"account\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// getAccountInfoHandleResponse handles the GetAccountInfo response.\nfunc (client *ServiceClient) getAccountInfoHandleResponse(resp *http.Response) (ServiceClientGetAccountInfoResponse, error) {\n\tresult := ServiceClientGetAccountInfoResponse{}\n\tif val := resp.Header.Get(\"x-ms-account-kind\"); val != \"\" {\n\t\tresult.AccountKind = (*AccountKind)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ServiceClientGetAccountInfoResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-is-hns-enabled\"); val != \"\" {\n\t\tisHierarchicalNamespaceEnabled, err := strconv.ParseBool(val)\n\t\tif err != nil {\n\t\t\treturn ServiceClientGetAccountInfoResponse{}, err\n\t\t}\n\t\tresult.IsHierarchicalNamespaceEnabled = &isHierarchicalNamespaceEnabled\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-sku-name\"); val != \"\" {\n\t\tresult.SKUName = (*SKUName)(&val)\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// GetProperties - gets the properties of a storage account's Blob service, including properties for Storage Analytics and\n// CORS (Cross-Origin Resource Sharing) rules.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - ServiceClientGetPropertiesOptions contains the optional parameters for the ServiceClient.GetProperties method.\nfunc (client *ServiceClient) GetProperties(ctx context.Context, options *ServiceClientGetPropertiesOptions) (ServiceClientGetPropertiesResponse, error) {\n\tvar err error\n\treq, err := client.getPropertiesCreateRequest(ctx, options)\n\tif err != nil {\n\t\treturn ServiceClientGetPropertiesResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ServiceClientGetPropertiesResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ServiceClientGetPropertiesResponse{}, err\n\t}\n\tresp, err := client.getPropertiesHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// getPropertiesCreateRequest creates the GetProperties request.\nfunc (client *ServiceClient) getPropertiesCreateRequest(ctx context.Context, options *ServiceClientGetPropertiesOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"properties\")\n\treqQP.Set(\"restype\", \"service\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// getPropertiesHandleResponse handles the GetProperties response.\nfunc (client *ServiceClient) getPropertiesHandleResponse(resp *http.Response) (ServiceClientGetPropertiesResponse, error) {\n\tresult := ServiceClientGetPropertiesResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif err := runtime.UnmarshalAsXML(resp, &result.StorageServiceProperties); err != nil {\n\t\treturn ServiceClientGetPropertiesResponse{}, err\n\t}\n\treturn result, nil\n}\n\n// GetStatistics - Retrieves statistics related to replication for the Blob service. It is only available on the secondary\n// location endpoint when read-access geo-redundant replication is enabled for the storage account.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - options - ServiceClientGetStatisticsOptions contains the optional parameters for the ServiceClient.GetStatistics method.\nfunc (client *ServiceClient) GetStatistics(ctx context.Context, options *ServiceClientGetStatisticsOptions) (ServiceClientGetStatisticsResponse, error) {\n\tvar err error\n\treq, err := client.getStatisticsCreateRequest(ctx, options)\n\tif err != nil {\n\t\treturn ServiceClientGetStatisticsResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ServiceClientGetStatisticsResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ServiceClientGetStatisticsResponse{}, err\n\t}\n\tresp, err := client.getStatisticsHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// getStatisticsCreateRequest creates the GetStatistics request.\nfunc (client *ServiceClient) getStatisticsCreateRequest(ctx context.Context, options *ServiceClientGetStatisticsOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"stats\")\n\treqQP.Set(\"restype\", \"service\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// getStatisticsHandleResponse handles the GetStatistics response.\nfunc (client *ServiceClient) getStatisticsHandleResponse(resp *http.Response) (ServiceClientGetStatisticsResponse, error) {\n\tresult := ServiceClientGetStatisticsResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ServiceClientGetStatisticsResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif err := runtime.UnmarshalAsXML(resp, &result.StorageServiceStats); err != nil {\n\t\treturn ServiceClientGetStatisticsResponse{}, err\n\t}\n\treturn result, nil\n}\n\n// GetUserDelegationKey - Retrieves a user delegation key for the Blob service. This is only a valid operation when using\n// bearer token authentication.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - keyInfo - Key information\n//   - options - ServiceClientGetUserDelegationKeyOptions contains the optional parameters for the ServiceClient.GetUserDelegationKey\n//     method.\nfunc (client *ServiceClient) GetUserDelegationKey(ctx context.Context, keyInfo KeyInfo, options *ServiceClientGetUserDelegationKeyOptions) (ServiceClientGetUserDelegationKeyResponse, error) {\n\tvar err error\n\treq, err := client.getUserDelegationKeyCreateRequest(ctx, keyInfo, options)\n\tif err != nil {\n\t\treturn ServiceClientGetUserDelegationKeyResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ServiceClientGetUserDelegationKeyResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusOK) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ServiceClientGetUserDelegationKeyResponse{}, err\n\t}\n\tresp, err := client.getUserDelegationKeyHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// getUserDelegationKeyCreateRequest creates the GetUserDelegationKey request.\nfunc (client *ServiceClient) getUserDelegationKeyCreateRequest(ctx context.Context, keyInfo KeyInfo, options *ServiceClientGetUserDelegationKeyOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPost, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"userdelegationkey\")\n\treqQP.Set(\"restype\", \"service\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\tif err := runtime.MarshalAsXML(req, keyInfo); err != nil {\n\t\treturn nil, err\n\t}\n\treturn req, nil\n}\n\n// getUserDelegationKeyHandleResponse handles the GetUserDelegationKey response.\nfunc (client *ServiceClient) getUserDelegationKeyHandleResponse(resp *http.Response) (ServiceClientGetUserDelegationKeyResponse, error) {\n\tresult := ServiceClientGetUserDelegationKeyResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"Date\"); val != \"\" {\n\t\tdate, err := time.Parse(time.RFC1123, val)\n\t\tif err != nil {\n\t\t\treturn ServiceClientGetUserDelegationKeyResponse{}, err\n\t\t}\n\t\tresult.Date = &date\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif err := runtime.UnmarshalAsXML(resp, &result.UserDelegationKey); err != nil {\n\t\treturn ServiceClientGetUserDelegationKeyResponse{}, err\n\t}\n\treturn result, nil\n}\n\n// NewListContainersSegmentPager - The List Containers Segment operation returns a list of the containers under the specified\n// account\n//\n// Generated from API version 2025-01-05\n//   - options - ServiceClientListContainersSegmentOptions contains the optional parameters for the ServiceClient.NewListContainersSegmentPager\n//     method.\n//\n// listContainersSegmentCreateRequest creates the ListContainersSegment request.\nfunc (client *ServiceClient) ListContainersSegmentCreateRequest(ctx context.Context, options *ServiceClientListContainersSegmentOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"list\")\n\tif options != nil && options.Include != nil {\n\t\treqQP.Set(\"include\", strings.Join(strings.Fields(strings.Trim(fmt.Sprint(options.Include), \"[]\")), \",\"))\n\t}\n\tif options != nil && options.Marker != nil {\n\t\treqQP.Set(\"marker\", *options.Marker)\n\t}\n\tif options != nil && options.Maxresults != nil {\n\t\treqQP.Set(\"maxresults\", strconv.FormatInt(int64(*options.Maxresults), 10))\n\t}\n\tif options != nil && options.Prefix != nil {\n\t\treqQP.Set(\"prefix\", *options.Prefix)\n\t}\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\treturn req, nil\n}\n\n// listContainersSegmentHandleResponse handles the ListContainersSegment response.\nfunc (client *ServiceClient) ListContainersSegmentHandleResponse(resp *http.Response) (ServiceClientListContainersSegmentResponse, error) {\n\tresult := ServiceClientListContainersSegmentResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\tif err := runtime.UnmarshalAsXML(resp, &result.ListContainersSegmentResponse); err != nil {\n\t\treturn ServiceClientListContainersSegmentResponse{}, err\n\t}\n\treturn result, nil\n}\n\n// SetProperties - Sets properties for a storage account's Blob service endpoint, including properties for Storage Analytics\n// and CORS (Cross-Origin Resource Sharing) rules\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - storageServiceProperties - The StorageService properties.\n//   - options - ServiceClientSetPropertiesOptions contains the optional parameters for the ServiceClient.SetProperties method.\nfunc (client *ServiceClient) SetProperties(ctx context.Context, storageServiceProperties StorageServiceProperties, options *ServiceClientSetPropertiesOptions) (ServiceClientSetPropertiesResponse, error) {\n\tvar err error\n\treq, err := client.setPropertiesCreateRequest(ctx, storageServiceProperties, options)\n\tif err != nil {\n\t\treturn ServiceClientSetPropertiesResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ServiceClientSetPropertiesResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusAccepted) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ServiceClientSetPropertiesResponse{}, err\n\t}\n\tresp, err := client.setPropertiesHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// setPropertiesCreateRequest creates the SetProperties request.\nfunc (client *ServiceClient) setPropertiesCreateRequest(ctx context.Context, storageServiceProperties StorageServiceProperties, options *ServiceClientSetPropertiesOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"properties\")\n\treqQP.Set(\"restype\", \"service\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\tif err := runtime.MarshalAsXML(req, storageServiceProperties); err != nil {\n\t\treturn nil, err\n\t}\n\treturn req, nil\n}\n\n// setPropertiesHandleResponse handles the SetProperties response.\nfunc (client *ServiceClient) setPropertiesHandleResponse(resp *http.Response) (ServiceClientSetPropertiesResponse, error) {\n\tresult := ServiceClientSetPropertiesResponse{}\n\tif val := resp.Header.Get(\"x-ms-client-request-id\"); val != \"\" {\n\t\tresult.ClientRequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n\n// SubmitBatch - The Batch operation allows multiple API calls to be embedded into a single HTTP request.\n// If the operation fails it returns an *azcore.ResponseError type.\n//\n// Generated from API version 2025-01-05\n//   - contentLength - The length of the request.\n//   - multipartContentType - Required. The value of this header must be multipart/mixed with a batch boundary. Example header\n//     value: multipart/mixed; boundary=batch_\n//   - body - Initial data\n//   - options - ServiceClientSubmitBatchOptions contains the optional parameters for the ServiceClient.SubmitBatch method.\nfunc (client *ServiceClient) SubmitBatch(ctx context.Context, contentLength int64, multipartContentType string, body io.ReadSeekCloser, options *ServiceClientSubmitBatchOptions) (ServiceClientSubmitBatchResponse, error) {\n\tvar err error\n\treq, err := client.submitBatchCreateRequest(ctx, contentLength, multipartContentType, body, options)\n\tif err != nil {\n\t\treturn ServiceClientSubmitBatchResponse{}, err\n\t}\n\thttpResp, err := client.internal.Pipeline().Do(req)\n\tif err != nil {\n\t\treturn ServiceClientSubmitBatchResponse{}, err\n\t}\n\tif !runtime.HasStatusCode(httpResp, http.StatusAccepted) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ServiceClientSubmitBatchResponse{}, err\n\t}\n\tresp, err := client.submitBatchHandleResponse(httpResp)\n\treturn resp, err\n}\n\n// submitBatchCreateRequest creates the SubmitBatch request.\nfunc (client *ServiceClient) submitBatchCreateRequest(ctx context.Context, contentLength int64, multipartContentType string, body io.ReadSeekCloser, options *ServiceClientSubmitBatchOptions) (*policy.Request, error) {\n\treq, err := runtime.NewRequest(ctx, http.MethodPost, client.endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treqQP := req.Raw().URL.Query()\n\treqQP.Set(\"comp\", \"batch\")\n\tif options != nil && options.Timeout != nil {\n\t\treqQP.Set(\"timeout\", strconv.FormatInt(int64(*options.Timeout), 10))\n\t}\n\treq.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), \"+\", \"%20\", -1)\n\truntime.SkipBodyDownload(req)\n\treq.Raw().Header[\"Accept\"] = []string{\"application/xml\"}\n\treq.Raw().Header[\"Content-Length\"] = []string{strconv.FormatInt(contentLength, 10)}\n\treq.Raw().Header[\"Content-Type\"] = []string{multipartContentType}\n\tif options != nil && options.RequestID != nil {\n\t\treq.Raw().Header[\"x-ms-client-request-id\"] = []string{*options.RequestID}\n\t}\n\treq.Raw().Header[\"x-ms-version\"] = []string{ServiceVersion}\n\tif err := req.SetBody(body, multipartContentType); err != nil {\n\t\treturn nil, err\n\t}\n\treturn req, nil\n}\n\n// submitBatchHandleResponse handles the SubmitBatch response.\nfunc (client *ServiceClient) submitBatchHandleResponse(resp *http.Response) (ServiceClientSubmitBatchResponse, error) {\n\tresult := ServiceClientSubmitBatchResponse{Body: resp.Body}\n\tif val := resp.Header.Get(\"Content-Type\"); val != \"\" {\n\t\tresult.ContentType = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-request-id\"); val != \"\" {\n\t\tresult.RequestID = &val\n\t}\n\tif val := resp.Header.Get(\"x-ms-version\"); val != \"\" {\n\t\tresult.Version = &val\n\t}\n\treturn result, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_time_rfc1123.go",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n// Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\npackage generated\n\nimport (\n\t\"strings\"\n\t\"time\"\n)\n\nconst (\n\tdateTimeRFC1123JSON = `\"` + time.RFC1123 + `\"`\n)\n\ntype dateTimeRFC1123 time.Time\n\nfunc (t dateTimeRFC1123) MarshalJSON() ([]byte, error) {\n\tb := []byte(time.Time(t).Format(dateTimeRFC1123JSON))\n\treturn b, nil\n}\n\nfunc (t dateTimeRFC1123) MarshalText() ([]byte, error) {\n\tb := []byte(time.Time(t).Format(time.RFC1123))\n\treturn b, nil\n}\n\nfunc (t *dateTimeRFC1123) UnmarshalJSON(data []byte) error {\n\tp, err := time.Parse(dateTimeRFC1123JSON, strings.ToUpper(string(data)))\n\t*t = dateTimeRFC1123(p)\n\treturn err\n}\n\nfunc (t *dateTimeRFC1123) UnmarshalText(data []byte) error {\n\tif len(data) == 0 {\n\t\treturn nil\n\t}\n\tp, err := time.Parse(time.RFC1123, string(data))\n\t*t = dateTimeRFC1123(p)\n\treturn err\n}\n\nfunc (t dateTimeRFC1123) String() string {\n\treturn time.Time(t).Format(time.RFC1123)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_time_rfc3339.go",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n// Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\npackage generated\n\nimport (\n\t\"regexp\"\n\t\"strings\"\n\t\"time\"\n)\n\n// Azure reports time in UTC but it doesn't include the 'Z' time zone suffix in some cases.\nvar tzOffsetRegex = regexp.MustCompile(`(?:Z|z|\\+|-)(?:\\d+:\\d+)*\"*$`)\n\nconst (\n\tutcDateTime        = \"2006-01-02T15:04:05.999999999\"\n\tutcDateTimeJSON    = `\"` + utcDateTime + `\"`\n\tutcDateTimeNoT     = \"2006-01-02 15:04:05.999999999\"\n\tutcDateTimeJSONNoT = `\"` + utcDateTimeNoT + `\"`\n\tdateTimeNoT        = `2006-01-02 15:04:05.999999999Z07:00`\n\tdateTimeJSON       = `\"` + time.RFC3339Nano + `\"`\n\tdateTimeJSONNoT    = `\"` + dateTimeNoT + `\"`\n)\n\ntype dateTimeRFC3339 time.Time\n\nfunc (t dateTimeRFC3339) MarshalJSON() ([]byte, error) {\n\ttt := time.Time(t)\n\treturn tt.MarshalJSON()\n}\n\nfunc (t dateTimeRFC3339) MarshalText() ([]byte, error) {\n\ttt := time.Time(t)\n\treturn tt.MarshalText()\n}\n\nfunc (t *dateTimeRFC3339) UnmarshalJSON(data []byte) error {\n\ttzOffset := tzOffsetRegex.Match(data)\n\thasT := strings.Contains(string(data), \"T\") || strings.Contains(string(data), \"t\")\n\tvar layout string\n\tif tzOffset && hasT {\n\t\tlayout = dateTimeJSON\n\t} else if tzOffset {\n\t\tlayout = dateTimeJSONNoT\n\t} else if hasT {\n\t\tlayout = utcDateTimeJSON\n\t} else {\n\t\tlayout = utcDateTimeJSONNoT\n\t}\n\treturn t.Parse(layout, string(data))\n}\n\nfunc (t *dateTimeRFC3339) UnmarshalText(data []byte) error {\n\tif len(data) == 0 {\n\t\treturn nil\n\t}\n\ttzOffset := tzOffsetRegex.Match(data)\n\thasT := strings.Contains(string(data), \"T\") || strings.Contains(string(data), \"t\")\n\tvar layout string\n\tif tzOffset && hasT {\n\t\tlayout = time.RFC3339Nano\n\t} else if tzOffset {\n\t\tlayout = dateTimeNoT\n\t} else if hasT {\n\t\tlayout = utcDateTime\n\t} else {\n\t\tlayout = utcDateTimeNoT\n\t}\n\treturn t.Parse(layout, string(data))\n}\n\nfunc (t *dateTimeRFC3339) Parse(layout, value string) error {\n\tp, err := time.Parse(layout, strings.ToUpper(value))\n\t*t = dateTimeRFC3339(p)\n\treturn err\n}\n\nfunc (t dateTimeRFC3339) String() string {\n\treturn time.Time(t).Format(time.RFC3339Nano)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_xml_helper.go",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n// Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\npackage generated\n\nimport (\n\t\"encoding/xml\"\n\t\"errors\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/to\"\n\t\"io\"\n\t\"strings\"\n)\n\ntype additionalProperties map[string]*string\n\n// UnmarshalXML implements the xml.Unmarshaler interface for additionalProperties.\nfunc (ap *additionalProperties) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {\n\ttokName := \"\"\n\ttokValue := \"\"\n\tfor {\n\t\tt, err := d.Token()\n\t\tif errors.Is(err, io.EOF) {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn err\n\t\t}\n\t\tswitch tt := t.(type) {\n\t\tcase xml.StartElement:\n\t\t\ttokName = strings.ToLower(tt.Name.Local)\n\t\t\ttokValue = \"\"\n\t\tcase xml.CharData:\n\t\t\tif tokName == \"\" {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ttokValue = string(tt)\n\t\tcase xml.EndElement:\n\t\t\tif tokName == \"\" {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif *ap == nil {\n\t\t\t\t*ap = additionalProperties{}\n\t\t\t}\n\t\t\t(*ap)[tokName] = to.Ptr(tokValue)\n\t\t\ttokName = \"\"\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared/batch_transfer.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage shared\n\nimport (\n\t\"context\"\n\t\"errors\"\n)\n\nconst (\n\tDefaultConcurrency = 5\n)\n\n// BatchTransferOptions identifies options used by doBatchTransfer.\ntype BatchTransferOptions struct {\n\tTransferSize  int64\n\tChunkSize     int64\n\tNumChunks     uint64\n\tConcurrency   uint16\n\tOperation     func(ctx context.Context, offset int64, chunkSize int64) error\n\tOperationName string\n}\n\n// DoBatchTransfer helps to execute operations in a batch manner.\n// Can be used by users to customize batch works (for other scenarios that the SDK does not provide)\nfunc DoBatchTransfer(ctx context.Context, o *BatchTransferOptions) error {\n\tif o.ChunkSize == 0 {\n\t\treturn errors.New(\"ChunkSize cannot be 0\")\n\t}\n\n\tif o.Concurrency == 0 {\n\t\to.Concurrency = DefaultConcurrency // default concurrency\n\t}\n\n\t// Prepare and do parallel operations.\n\toperationChannel := make(chan func() error, o.Concurrency) // Create the channel that release 'concurrency' goroutines concurrently\n\toperationResponseChannel := make(chan error, o.NumChunks)  // Holds each response\n\tctx, cancel := context.WithCancel(ctx)\n\tdefer cancel()\n\n\t// Create the goroutines that process each operation (in parallel).\n\tfor g := uint16(0); g < o.Concurrency; g++ {\n\t\tgo func() {\n\t\t\tfor f := range operationChannel {\n\t\t\t\terr := f()\n\t\t\t\toperationResponseChannel <- err\n\t\t\t}\n\t\t}()\n\t}\n\n\t// Add each chunk's operation to the channel.\n\tfor chunkNum := uint64(0); chunkNum < o.NumChunks; chunkNum++ {\n\t\tcurChunkSize := o.ChunkSize\n\n\t\tif chunkNum == o.NumChunks-1 { // Last chunk\n\t\t\tcurChunkSize = o.TransferSize - (int64(chunkNum) * o.ChunkSize) // Remove size of all transferred chunks from total\n\t\t}\n\t\toffset := int64(chunkNum) * o.ChunkSize\n\t\toperationChannel <- func() error {\n\t\t\treturn o.Operation(ctx, offset, curChunkSize)\n\t\t}\n\t}\n\tclose(operationChannel)\n\n\t// Wait for the operations to complete.\n\tvar firstErr error = nil\n\tfor chunkNum := uint64(0); chunkNum < o.NumChunks; chunkNum++ {\n\t\tresponseError := <-operationResponseChannel\n\t\t// record the first error (the original error which should cause the other chunks to fail with canceled context)\n\t\tif responseError != nil && firstErr == nil {\n\t\t\tcancel() // As soon as any operation fails, cancel all remaining operation calls\n\t\t\tfirstErr = responseError\n\t\t}\n\t}\n\treturn firstErr\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared/buffer_manager.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage shared\n\ntype BufferManager[T ~[]byte] interface {\n\t// Acquire returns the channel that contains the pool of buffers.\n\tAcquire() <-chan T\n\n\t// Release releases the buffer back to the pool for reuse/cleanup.\n\tRelease(T)\n\n\t// Grow grows the number of buffers, up to the predefined max.\n\t// It returns the total number of buffers or an error.\n\t// No error is returned if the number of buffers has reached max.\n\t// This is called only from the reading goroutine.\n\tGrow() (int, error)\n\n\t// Free cleans up all buffers.\n\tFree()\n}\n\n// mmbPool implements the bufferManager interface.\n// it uses anonymous memory mapped files for buffers.\n// don't use this type directly, use newMMBPool() instead.\ntype mmbPool struct {\n\tbuffers chan Mmb\n\tcount   int\n\tmax     int\n\tsize    int64\n}\n\nfunc NewMMBPool(maxBuffers int, bufferSize int64) BufferManager[Mmb] {\n\treturn &mmbPool{\n\t\tbuffers: make(chan Mmb, maxBuffers),\n\t\tmax:     maxBuffers,\n\t\tsize:    bufferSize,\n\t}\n}\n\nfunc (pool *mmbPool) Acquire() <-chan Mmb {\n\treturn pool.buffers\n}\n\nfunc (pool *mmbPool) Grow() (int, error) {\n\tif pool.count < pool.max {\n\t\tbuffer, err := NewMMB(pool.size)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tpool.buffers <- buffer\n\t\tpool.count++\n\t}\n\treturn pool.count, nil\n}\n\nfunc (pool *mmbPool) Release(buffer Mmb) {\n\tpool.buffers <- buffer\n}\n\nfunc (pool *mmbPool) Free() {\n\tfor i := 0; i < pool.count; i++ {\n\t\tbuffer := <-pool.buffers\n\t\tbuffer.Delete()\n\t}\n\tpool.count = 0\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared/bytes_writer.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage shared\n\nimport (\n\t\"errors\"\n)\n\ntype bytesWriter []byte\n\nfunc NewBytesWriter(b []byte) bytesWriter {\n\treturn b\n}\n\nfunc (c bytesWriter) WriteAt(b []byte, off int64) (int, error) {\n\tif off >= int64(len(c)) || off < 0 {\n\t\treturn 0, errors.New(\"offset value is out of range\")\n\t}\n\n\tn := copy(c[int(off):], b)\n\tif n < len(b) {\n\t\treturn n, errors.New(\"not enough space for all bytes\")\n\t}\n\n\treturn n, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared/challenge_policy.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage shared\n\nimport (\n\t\"errors\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n)\n\ntype storageAuthorizer struct {\n\tscopes   []string\n\ttenantID string\n}\n\nfunc NewStorageChallengePolicy(cred azcore.TokenCredential, audience string, allowHTTP bool) policy.Policy {\n\ts := storageAuthorizer{scopes: []string{audience}}\n\treturn runtime.NewBearerTokenPolicy(cred, []string{audience}, &policy.BearerTokenOptions{\n\t\tAuthorizationHandler: policy.AuthorizationHandler{\n\t\t\tOnRequest:   s.onRequest,\n\t\t\tOnChallenge: s.onChallenge,\n\t\t},\n\t\tInsecureAllowCredentialWithHTTP: allowHTTP,\n\t})\n}\n\nfunc (s *storageAuthorizer) onRequest(req *policy.Request, authNZ func(policy.TokenRequestOptions) error) error {\n\treturn authNZ(policy.TokenRequestOptions{Scopes: s.scopes})\n}\n\nfunc (s *storageAuthorizer) onChallenge(req *policy.Request, resp *http.Response, authNZ func(policy.TokenRequestOptions) error) error {\n\t// parse the challenge\n\terr := s.parseChallenge(resp)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// TODO: Set tenantID when policy.TokenRequestOptions supports it. https://github.com/Azure/azure-sdk-for-go/issues/19841\n\treturn authNZ(policy.TokenRequestOptions{Scopes: s.scopes})\n}\n\ntype challengePolicyError struct {\n\terr error\n}\n\nfunc (c *challengePolicyError) Error() string {\n\treturn c.err.Error()\n}\n\nfunc (*challengePolicyError) NonRetriable() {\n\t// marker method\n}\n\nfunc (c *challengePolicyError) Unwrap() error {\n\treturn c.err\n}\n\n// parses Tenant ID from auth challenge\n// https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000/oauth2/authorize\nfunc parseTenant(url string) string {\n\tif url == \"\" {\n\t\treturn \"\"\n\t}\n\tparts := strings.Split(url, \"/\")\n\tif len(parts) >= 3 {\n\t\ttenant := parts[3]\n\t\ttenant = strings.ReplaceAll(tenant, \",\", \"\")\n\t\treturn tenant\n\t} else {\n\t\treturn \"\"\n\t}\n}\n\nfunc (s *storageAuthorizer) parseChallenge(resp *http.Response) error {\n\tauthHeader := resp.Header.Get(\"WWW-Authenticate\")\n\tif authHeader == \"\" {\n\t\treturn &challengePolicyError{err: errors.New(\"response has no WWW-Authenticate header for challenge authentication\")}\n\t}\n\n\t// Strip down to auth and resource\n\t// Format is \"Bearer authorization_uri=\\\"<site>\\\" resource_id=\\\"<site>\\\"\"\n\tauthHeader = strings.ReplaceAll(authHeader, \"Bearer \", \"\")\n\n\tparts := strings.Split(authHeader, \" \")\n\n\tvals := map[string]string{}\n\tfor _, part := range parts {\n\t\tsubParts := strings.Split(part, \"=\")\n\t\tif len(subParts) == 2 {\n\t\t\tstripped := strings.ReplaceAll(subParts[1], \"\\\"\", \"\")\n\t\t\tstripped = strings.TrimSuffix(stripped, \",\")\n\t\t\tvals[subParts[0]] = stripped\n\t\t}\n\t}\n\n\ts.tenantID = parseTenant(vals[\"authorization_uri\"])\n\n\tscope := vals[\"resource_id\"]\n\tif scope == \"\" {\n\t\treturn &challengePolicyError{err: errors.New(\"could not find a valid resource in the WWW-Authenticate header\")}\n\t}\n\n\tif !strings.HasSuffix(scope, \"/.default\") {\n\t\tscope += \"/.default\"\n\t}\n\ts.scopes = []string{scope}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared/mmf_unix.go",
    "content": "//go:build go1.18 && (linux || darwin || dragonfly || freebsd || openbsd || netbsd || solaris || aix || zos)\n// +build go1.18\n// +build linux darwin dragonfly freebsd openbsd netbsd solaris aix zos\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage shared\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"syscall\"\n)\n\n// mmb is a memory mapped buffer\ntype Mmb []byte\n\n// newMMB creates a new memory mapped buffer with the specified size\nfunc NewMMB(size int64) (Mmb, error) {\n\tprot, flags := syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_ANON|syscall.MAP_PRIVATE\n\taddr, err := syscall.Mmap(-1, 0, int(size), prot, flags)\n\tif err != nil {\n\t\treturn nil, os.NewSyscallError(\"Mmap\", err)\n\t}\n\treturn Mmb(addr), nil\n}\n\n// delete cleans up the memory mapped buffer\nfunc (m *Mmb) Delete() {\n\terr := syscall.Munmap(*m)\n\t*m = nil\n\tif err != nil {\n\t\t// if we get here, there is likely memory corruption.\n\t\t// please open an issue https://github.com/Azure/azure-sdk-for-go/issues\n\t\tpanic(fmt.Sprintf(\"Munmap error: %v\", err))\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared/mmf_windows.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage shared\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"reflect\"\n\t\"syscall\"\n\t\"unsafe\"\n)\n\n// Mmb is a memory mapped buffer\ntype Mmb []byte\n\n// NewMMB creates a new memory mapped buffer with the specified size\nfunc NewMMB(size int64) (Mmb, error) {\n\tconst InvalidHandleValue = ^uintptr(0) // -1\n\n\tprot, access := uint32(syscall.PAGE_READWRITE), uint32(syscall.FILE_MAP_WRITE)\n\thMMF, err := syscall.CreateFileMapping(syscall.Handle(InvalidHandleValue), nil, prot, uint32(size>>32), uint32(size&0xffffffff), nil)\n\tif err != nil {\n\t\treturn nil, os.NewSyscallError(\"CreateFileMapping\", err)\n\t}\n\tdefer func() {\n\t\t_ = syscall.CloseHandle(hMMF)\n\t}()\n\n\taddr, err := syscall.MapViewOfFile(hMMF, access, 0, 0, uintptr(size))\n\tif err != nil {\n\t\treturn nil, os.NewSyscallError(\"MapViewOfFile\", err)\n\t}\n\n\tm := Mmb{}\n\th := (*reflect.SliceHeader)(unsafe.Pointer(&m))\n\th.Data = addr\n\th.Len = int(size)\n\th.Cap = h.Len\n\treturn m, nil\n}\n\n// Delete cleans up the memory mapped buffer\nfunc (m *Mmb) Delete() {\n\taddr := uintptr(unsafe.Pointer(&(([]byte)(*m)[0])))\n\t*m = Mmb{}\n\terr := syscall.UnmapViewOfFile(addr)\n\tif err != nil {\n\t\t// if we get here, there is likely memory corruption.\n\t\t// please open an issue https://github.com/Azure/azure-sdk-for-go/issues\n\t\tpanic(fmt.Sprintf(\"UnmapViewOfFile error: %v\", err))\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared/section_writer.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage shared\n\nimport (\n\t\"errors\"\n\t\"io\"\n)\n\ntype SectionWriter struct {\n\tCount    int64\n\tOffset   int64\n\tPosition int64\n\tWriterAt io.WriterAt\n}\n\nfunc NewSectionWriter(c io.WriterAt, off int64, count int64) *SectionWriter {\n\treturn &SectionWriter{\n\t\tCount:    count,\n\t\tOffset:   off,\n\t\tWriterAt: c,\n\t}\n}\n\nfunc (c *SectionWriter) Write(p []byte) (int, error) {\n\tremaining := c.Count - c.Position\n\n\tif remaining <= 0 {\n\t\treturn 0, errors.New(\"end of section reached\")\n\t}\n\n\tslice := p\n\n\tif int64(len(slice)) > remaining {\n\t\tslice = slice[:remaining]\n\t}\n\n\tn, err := c.WriterAt.WriteAt(slice, c.Offset+c.Position)\n\tc.Position += int64(n)\n\tif err != nil {\n\t\treturn n, err\n\t}\n\n\tif len(p) > n {\n\t\treturn n, errors.New(\"not enough space for all bytes\")\n\t}\n\n\treturn n, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared/shared.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage shared\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"hash/crc64\"\n\t\"io\"\n\t\"net\"\n\t\"net/url\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/to\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/internal/uuid\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n)\n\nconst (\n\tTokenScope = \"https://storage.azure.com/.default\"\n)\n\nconst (\n\tHeaderAuthorization     = \"Authorization\"\n\tHeaderXmsDate           = \"x-ms-date\"\n\tHeaderContentLength     = \"Content-Length\"\n\tHeaderContentEncoding   = \"Content-Encoding\"\n\tHeaderContentLanguage   = \"Content-Language\"\n\tHeaderContentType       = \"Content-Type\"\n\tHeaderContentMD5        = \"Content-MD5\"\n\tHeaderIfModifiedSince   = \"If-Modified-Since\"\n\tHeaderIfMatch           = \"If-Match\"\n\tHeaderIfNoneMatch       = \"If-None-Match\"\n\tHeaderIfUnmodifiedSince = \"If-Unmodified-Since\"\n\tHeaderRange             = \"Range\"\n\tHeaderXmsVersion        = \"x-ms-version\"\n\tHeaderXmsRequestID      = \"x-ms-request-id\"\n)\n\nconst crc64Polynomial uint64 = 0x9A6C9329AC4BC9B5\n\nvar CRC64Table = crc64.MakeTable(crc64Polynomial)\n\n// CopyOptions returns a zero-value T if opts is nil.\n// If opts is not nil, a copy is made and its address returned.\nfunc CopyOptions[T any](opts *T) *T {\n\tif opts == nil {\n\t\treturn new(T)\n\t}\n\tcp := *opts\n\treturn &cp\n}\n\nvar errConnectionString = errors.New(\"connection string is either blank or malformed. The expected connection string \" +\n\t\"should contain key value pairs separated by semicolons. For example 'DefaultEndpointsProtocol=https;AccountName=<accountName>;\" +\n\t\"AccountKey=<accountKey>;EndpointSuffix=core.windows.net'\")\n\ntype ParsedConnectionString struct {\n\tServiceURL  string\n\tAccountName string\n\tAccountKey  string\n}\n\nfunc ParseConnectionString(connectionString string) (ParsedConnectionString, error) {\n\tconst (\n\t\tdefaultScheme = \"https\"\n\t\tdefaultSuffix = \"core.windows.net\"\n\t)\n\n\tconnStrMap := make(map[string]string)\n\tconnectionString = strings.TrimRight(connectionString, \";\")\n\n\tsplitString := strings.Split(connectionString, \";\")\n\tif len(splitString) == 0 {\n\t\treturn ParsedConnectionString{}, errConnectionString\n\t}\n\tfor _, stringPart := range splitString {\n\t\tparts := strings.SplitN(stringPart, \"=\", 2)\n\t\tif len(parts) != 2 {\n\t\t\treturn ParsedConnectionString{}, errConnectionString\n\t\t}\n\t\tconnStrMap[parts[0]] = parts[1]\n\t}\n\n\tprotocol, ok := connStrMap[\"DefaultEndpointsProtocol\"]\n\tif !ok {\n\t\tprotocol = defaultScheme\n\t}\n\n\tsuffix, ok := connStrMap[\"EndpointSuffix\"]\n\tif !ok {\n\t\tsuffix = defaultSuffix\n\t}\n\n\tblobEndpoint, has_blobEndpoint := connStrMap[\"BlobEndpoint\"]\n\taccountName, has_accountName := connStrMap[\"AccountName\"]\n\n\tvar serviceURL string\n\tif has_blobEndpoint {\n\t\tserviceURL = blobEndpoint\n\t} else if has_accountName {\n\t\tserviceURL = fmt.Sprintf(\"%v://%v.blob.%v\", protocol, accountName, suffix)\n\t} else {\n\t\treturn ParsedConnectionString{}, errors.New(\"connection string needs either AccountName or BlobEndpoint\")\n\t}\n\n\tif !strings.HasSuffix(serviceURL, \"/\") {\n\t\t// add a trailing slash to be consistent with the portal\n\t\tserviceURL += \"/\"\n\t}\n\n\taccountKey, has_accountKey := connStrMap[\"AccountKey\"]\n\tsharedAccessSignature, has_sharedAccessSignature := connStrMap[\"SharedAccessSignature\"]\n\n\tif has_accountName && has_accountKey {\n\t\treturn ParsedConnectionString{\n\t\t\tServiceURL:  serviceURL,\n\t\t\tAccountName: accountName,\n\t\t\tAccountKey:  accountKey,\n\t\t}, nil\n\t} else if has_sharedAccessSignature {\n\t\treturn ParsedConnectionString{\n\t\t\tServiceURL: fmt.Sprintf(\"%v?%v\", serviceURL, sharedAccessSignature),\n\t\t}, nil\n\t} else {\n\t\treturn ParsedConnectionString{}, errors.New(\"connection string needs either AccountKey or SharedAccessSignature\")\n\t}\n\n}\n\n// SerializeBlobTags converts tags to generated.BlobTags\nfunc SerializeBlobTags(tagsMap map[string]string) *generated.BlobTags {\n\tblobTagSet := make([]*generated.BlobTag, 0)\n\tfor key, val := range tagsMap {\n\t\tnewKey, newVal := key, val\n\t\tblobTagSet = append(blobTagSet, &generated.BlobTag{Key: &newKey, Value: &newVal})\n\t}\n\treturn &generated.BlobTags{BlobTagSet: blobTagSet}\n}\n\nfunc SerializeBlobTagsToStrPtr(tagsMap map[string]string) *string {\n\tif len(tagsMap) == 0 {\n\t\treturn nil\n\t}\n\ttags := make([]string, 0)\n\tfor key, val := range tagsMap {\n\t\ttags = append(tags, url.QueryEscape(key)+\"=\"+url.QueryEscape(val))\n\t}\n\tblobTagsString := strings.Join(tags, \"&\")\n\treturn &blobTagsString\n}\n\nfunc ValidateSeekableStreamAt0AndGetCount(body io.ReadSeeker) (int64, error) {\n\tif body == nil { // nil body's are \"logically\" seekable to 0 and are 0 bytes long\n\t\treturn 0, nil\n\t}\n\n\terr := validateSeekableStreamAt0(body)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tcount, err := body.Seek(0, io.SeekEnd)\n\tif err != nil {\n\t\treturn 0, errors.New(\"body stream must be seekable\")\n\t}\n\n\t_, err = body.Seek(0, io.SeekStart)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn count, nil\n}\n\n// return an error if body is not a valid seekable stream at 0\nfunc validateSeekableStreamAt0(body io.ReadSeeker) error {\n\tif body == nil { // nil body's are \"logically\" seekable to 0\n\t\treturn nil\n\t}\n\tif pos, err := body.Seek(0, io.SeekCurrent); pos != 0 || err != nil {\n\t\t// Help detect programmer error\n\t\tif err != nil {\n\t\t\treturn errors.New(\"body stream must be seekable\")\n\t\t}\n\t\treturn errors.New(\"body stream must be set to position 0\")\n\t}\n\treturn nil\n}\n\nfunc RangeToString(offset, count int64) string {\n\treturn \"bytes=\" + strconv.FormatInt(offset, 10) + \"-\" + strconv.FormatInt(offset+count-1, 10)\n}\n\ntype nopCloser struct {\n\tio.ReadSeeker\n}\n\nfunc (n nopCloser) Close() error {\n\treturn nil\n}\n\n// NopCloser returns a ReadSeekCloser with a no-op close method wrapping the provided io.ReadSeeker.\nfunc NopCloser(rs io.ReadSeeker) io.ReadSeekCloser {\n\treturn nopCloser{rs}\n}\n\nfunc GenerateLeaseID(leaseID *string) (*string, error) {\n\tif leaseID == nil {\n\t\tgeneratedUuid, err := uuid.New()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tleaseID = to.Ptr(generatedUuid.String())\n\t}\n\treturn leaseID, nil\n}\n\nfunc GetClientOptions[T any](o *T) *T {\n\tif o == nil {\n\t\treturn new(T)\n\t}\n\treturn o\n}\n\n// IsIPEndpointStyle checkes if URL's host is IP, in this case the storage account endpoint will be composed as:\n// http(s)://IP(:port)/storageaccount/container/...\n// As url's Host property, host could be both host or host:port\nfunc IsIPEndpointStyle(host string) bool {\n\tif host == \"\" {\n\t\treturn false\n\t}\n\tif h, _, err := net.SplitHostPort(host); err == nil {\n\t\thost = h\n\t}\n\t// For IPv6, there could be case where SplitHostPort fails for cannot finding port.\n\t// In this case, eliminate the '[' and ']' in the URL.\n\t// For details about IPv6 URL, please refer to https://tools.ietf.org/html/rfc2732\n\tif host[0] == '[' && host[len(host)-1] == ']' {\n\t\thost = host[1 : len(host)-1]\n\t}\n\treturn net.ParseIP(host) != nil\n}\n\n// ReadAtLeast reads from r into buf until it has read at least min bytes.\n// It returns the number of bytes copied and an error.\n// The EOF error is returned if no bytes were read or\n// EOF happened after reading fewer than min bytes.\n// If min is greater than the length of buf, ReadAtLeast returns ErrShortBuffer.\n// On return, n >= min if and only if err == nil.\n// If r returns an error having read at least min bytes, the error is dropped.\n// This method is same as io.ReadAtLeast except that it does not\n// return io.ErrUnexpectedEOF when fewer than min bytes are read.\nfunc ReadAtLeast(r io.Reader, buf []byte, min int) (n int, err error) {\n\tif len(buf) < min {\n\t\treturn 0, io.ErrShortBuffer\n\t}\n\tfor n < min && err == nil {\n\t\tvar nn int\n\t\tnn, err = r.Read(buf[n:])\n\t\tn += nn\n\t}\n\tif n >= min {\n\t\terr = nil\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/log.go",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage azblob\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n)\n\nconst (\n\t// EventUpload is used for logging events related to upload operation.\n\tEventUpload = exported.EventUpload\n\n\t// EventSubmitBatch is used for logging events related to submit blob batch operation.\n\tEventSubmitBatch = exported.EventSubmitBatch\n)\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/migrationguide.md",
    "content": "# Guide to migrate from `azure-storage-blob-go` to `azblob`\n\nThis guide is intended to assist in the migration from the `azure-storage-blob-go` module, or previous betas of `azblob`, to the latest releases of the `azblob` module.\n\n## Simplified API surface area\n\nThe redesign of the `azblob` module separates clients into various sub-packages.\nIn previous versions, the public surface area was \"flat\", so all clients and supporting types were in the `azblob` package.\nThis made it difficult to navigate the public surface area.\n\n## Clients\n\nIn `azure-storage-blob-go` a client constructor always requires a `url.URL` and `Pipeline` parameters.\n\nIn `azblob` a client constructor always requires a `string` URL, any specified credential type, and a `*ClientOptions` for optional values.  You pass `nil` to accept default options.\n\n```go\n// new code\nclient, err := azblob.NewClient(\"<my storage account URL>\", cred, nil)\n```\n\n## Authentication\n\nIn `azure-storage-blob-go` you created a `Pipeline` with the required credential type. This pipeline was then passed to the client constructor.\n\nIn `azblob`, you pass the required credential directly to the client constructor.\n\n```go\n// new code.  cred is an AAD token credential created from the azidentity module\nclient, err := azblob.NewClient(\"<my storage account URL>\", cred, nil)\n```\n\nThe `azure-storage-blob-go` module provided limited support for OAuth token authentication via `NewTokenCredential`.\nThis been replaced by using Azure Identity credentials from [azidentity](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#section-readme).\n\nAuthentication with a shared key via `NewSharedKeyCredential` remains unchanged.\n\nIn `azure-storage-blob-go` you created a `Pipeline` with `NewAnonymousCredential` to support anonymous or SAS authentication.\n\nIn `azblob` you use the construtor `NewClientWithNoCredential()` instead.\n\n```go\n// new code\nclient, err := azblob.NewClientWithNoCredential(\"<public blob or blob with SAS URL>\", nil)\n```\n\n## Listing blobs/containers\n\nIn `azure-storage-blob-go` you explicitly created a `Marker` type that was used to page over results ([example](https://pkg.go.dev/github.com/Azure/azure-storage-blob-go/azblob?utm_source=godoc#example-package)).\n\nIn `azblob`, operations that return paginated values return a `*runtime.Pager[T]`.\n\n```go\n// new code\npager := client.NewListBlobsFlatPager(\"my-container\", nil)\nfor pager.More() {\n\tpage, err := pager.NextPage(context.TODO())\n\t// process results\n}\n```\n\n## Configuring the HTTP pipeline\n\nIn `azure-storage-blob-go` you explicitly created a HTTP pipeline with configuration before creating a client.\nThis pipeline instance was then passed as an argument to the client constructor ([example](https://pkg.go.dev/github.com/Azure/azure-storage-blob-go/azblob?utm_source=godoc#example-NewPipeline)).\n\nIn `azblob` a HTTP pipeline is created during client construction.  The pipeline is configured through the `azcore.ClientOptions` type.\n\n```go\n// new code\nclient, err := azblob.NewClient(account, cred, &azblob.ClientOptions{\n\tClientOptions: azcore.ClientOptions{\n\t\t// configure HTTP pipeline options here\n\t},\n})\n```\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/models.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage azblob\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/service\"\n)\n\n// CreateContainerOptions contains the optional parameters for the ContainerClient.Create method.\ntype CreateContainerOptions = service.CreateContainerOptions\n\n// DeleteContainerOptions contains the optional parameters for the container.Client.Delete method.\ntype DeleteContainerOptions = service.DeleteContainerOptions\n\n// DeleteBlobOptions contains the optional parameters for the Client.Delete method.\ntype DeleteBlobOptions = blob.DeleteOptions\n\n// DownloadStreamOptions contains the optional parameters for the Client.DownloadStream method.\ntype DownloadStreamOptions = blob.DownloadStreamOptions\n\n// ListBlobsFlatOptions contains the optional parameters for the container.Client.ListBlobFlatSegment method.\ntype ListBlobsFlatOptions = container.ListBlobsFlatOptions\n\n// ListBlobsInclude indicates what additional information the service should return with each blob.\ntype ListBlobsInclude = container.ListBlobsInclude\n\n// ListContainersOptions contains the optional parameters for the container.Client.ListContainers operation\ntype ListContainersOptions = service.ListContainersOptions\n\n// UploadBufferOptions provides set of configurations for UploadBuffer operation\ntype UploadBufferOptions = blockblob.UploadBufferOptions\n\n// UploadFileOptions provides set of configurations for UploadFile operation\ntype UploadFileOptions = blockblob.UploadFileOptions\n\n// UploadStreamOptions provides set of configurations for UploadStream operation\ntype UploadStreamOptions = blockblob.UploadStreamOptions\n\n// DownloadBufferOptions identifies options used by the DownloadBuffer and DownloadFile functions.\ntype DownloadBufferOptions = blob.DownloadBufferOptions\n\n// DownloadFileOptions identifies options used by the DownloadBuffer and DownloadFile functions.\ntype DownloadFileOptions = blob.DownloadFileOptions\n\n// CPKInfo contains a group of parameters for client provided encryption key.\ntype CPKInfo = blob.CPKInfo\n\n// CPKScopeInfo contains a group of parameters for the ContainerClient.Create method.\ntype CPKScopeInfo = container.CPKScopeInfo\n\n// AccessConditions identifies blob-specific access conditions which you optionally set.\ntype AccessConditions = exported.BlobAccessConditions\n\n// ListContainersInclude indicates what additional information the service should return with each container.\ntype ListContainersInclude = service.ListContainersInclude\n\n// ObjectReplicationPolicy are deserialized attributes\ntype ObjectReplicationPolicy = blob.ObjectReplicationPolicy\n\n// RetryReaderOptions contains properties which can help to decide when to do retry.\ntype RetryReaderOptions = blob.RetryReaderOptions\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/pageblob/client.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage pageblob\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/base\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas\"\n)\n\n// ClientOptions contains the optional parameters when creating a Client.\ntype ClientOptions base.ClientOptions\n\n// Client represents a client to an Azure Storage page blob;\ntype Client base.CompositeClient[generated.BlobClient, generated.PageBlobClient]\n\n// NewClient creates an instance of Client with the specified values.\n//   - blobURL - the URL of the blob e.g. https://<account>.blob.core.windows.net/container/blob.txt\n//   - cred - an Azure AD credential, typically obtained via the azidentity module\n//   - options - client options; pass nil to accept the default values\nfunc NewClient(blobURL string, cred azcore.TokenCredential, options *ClientOptions) (*Client, error) {\n\taudience := base.GetAudience((*base.ClientOptions)(options))\n\tconOptions := shared.GetClientOptions(options)\n\tauthPolicy := shared.NewStorageChallengePolicy(cred, audience, conOptions.InsecureAllowCredentialWithHTTP)\n\tplOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}}\n\n\tazClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn (*Client)(base.NewPageBlobClient(blobURL, azClient, nil)), nil\n}\n\n// NewClientWithNoCredential creates an instance of Client with the specified values.\n// This is used to anonymously access a blob or with a shared access signature (SAS) token.\n//   - blobURL - the URL of the blob e.g. https://<account>.blob.core.windows.net/container/blob.txt?<sas token>\n//   - options - client options; pass nil to accept the default values\nfunc NewClientWithNoCredential(blobURL string, options *ClientOptions) (*Client, error) {\n\tconOptions := shared.GetClientOptions(options)\n\n\tazClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, runtime.PipelineOptions{}, &conOptions.ClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn (*Client)(base.NewPageBlobClient(blobURL, azClient, nil)), nil\n}\n\n// NewClientWithSharedKeyCredential creates an instance of Client with the specified values.\n//   - blobURL - the URL of the blob e.g. https://<account>.blob.core.windows.net/container/blob.txt\n//   - cred - a SharedKeyCredential created with the matching blob's storage account and access key\n//   - options - client options; pass nil to accept the default values\nfunc NewClientWithSharedKeyCredential(blobURL string, cred *blob.SharedKeyCredential, options *ClientOptions) (*Client, error) {\n\tauthPolicy := exported.NewSharedKeyCredPolicy(cred)\n\tconOptions := shared.GetClientOptions(options)\n\tplOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}}\n\n\tazClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn (*Client)(base.NewPageBlobClient(blobURL, azClient, cred)), nil\n}\n\n// NewClientFromConnectionString creates an instance of Client with the specified values.\n//   - connectionString - a connection string for the desired storage account\n//   - containerName - the name of the container within the storage account\n//   - blobName - the name of the blob within the container\n//   - options - client options; pass nil to accept the default values\nfunc NewClientFromConnectionString(connectionString, containerName, blobName string, options *ClientOptions) (*Client, error) {\n\tparsed, err := shared.ParseConnectionString(connectionString)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tparsed.ServiceURL = runtime.JoinPaths(parsed.ServiceURL, containerName, blobName)\n\n\tif parsed.AccountKey != \"\" && parsed.AccountName != \"\" {\n\t\tcredential, err := exported.NewSharedKeyCredential(parsed.AccountName, parsed.AccountKey)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn NewClientWithSharedKeyCredential(parsed.ServiceURL, credential, options)\n\t}\n\n\treturn NewClientWithNoCredential(parsed.ServiceURL, options)\n}\n\nfunc (pb *Client) generated() *generated.PageBlobClient {\n\t_, pageBlob := base.InnerClients((*base.CompositeClient[generated.BlobClient, generated.PageBlobClient])(pb))\n\treturn pageBlob\n}\n\n// URL returns the URL endpoint used by the Client object.\nfunc (pb *Client) URL() string {\n\treturn pb.generated().Endpoint()\n}\n\n// BlobClient returns the embedded blob client for this AppendBlob client.\nfunc (pb *Client) BlobClient() *blob.Client {\n\tinnerBlob, _ := base.InnerClients((*base.CompositeClient[generated.BlobClient, generated.PageBlobClient])(pb))\n\treturn (*blob.Client)(innerBlob)\n}\n\nfunc (pb *Client) sharedKey() *blob.SharedKeyCredential {\n\treturn base.SharedKeyComposite((*base.CompositeClient[generated.BlobClient, generated.PageBlobClient])(pb))\n}\n\n// WithSnapshot creates a new PageBlobURL object identical to the source but with the specified snapshot timestamp.\n// Pass \"\" to remove the snapshot returning a URL to the base blob.\nfunc (pb *Client) WithSnapshot(snapshot string) (*Client, error) {\n\tp, err := blob.ParseURL(pb.URL())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.Snapshot = snapshot\n\n\treturn (*Client)(base.NewPageBlobClient(p.String(), pb.generated().InternalClient(), pb.sharedKey())), nil\n}\n\n// WithVersionID creates a new PageBlobURL object identical to the source but with the specified snapshot timestamp.\n// Pass \"\" to remove the version returning a URL to the base blob.\nfunc (pb *Client) WithVersionID(versionID string) (*Client, error) {\n\tp, err := blob.ParseURL(pb.URL())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.VersionID = versionID\n\n\treturn (*Client)(base.NewPageBlobClient(p.String(), pb.generated().InternalClient(), pb.sharedKey())), nil\n}\n\n// Create creates a page blob of the specified length. Call PutPage to upload data to a page blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-blob.\nfunc (pb *Client) Create(ctx context.Context, size int64, o *CreateOptions) (CreateResponse, error) {\n\tcreateOptions, HTTPHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions := o.format()\n\n\tresp, err := pb.generated().Create(ctx, 0, size, createOptions, HTTPHeaders,\n\t\tleaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions)\n\treturn resp, err\n}\n\n// UploadPages writes 1 or more pages to the page blob. The start offset and the stream size must be a multiple of 512 bytes.\n// This method panics if the stream is not at position 0.\n// Note that the http client closes the body stream after the request is sent to the service.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-page.\nfunc (pb *Client) UploadPages(ctx context.Context, body io.ReadSeekCloser, contentRange blob.HTTPRange, options *UploadPagesOptions) (UploadPagesResponse, error) {\n\tcount, err := shared.ValidateSeekableStreamAt0AndGetCount(body)\n\n\tif err != nil {\n\t\treturn UploadPagesResponse{}, err\n\t}\n\n\tuploadPagesOptions := &generated.PageBlobClientUploadPagesOptions{\n\t\tRange: exported.FormatHTTPRange(contentRange),\n\t}\n\n\tleaseAccessConditions, cpkInfo, cpkScopeInfo, sequenceNumberAccessConditions, modifiedAccessConditions := options.format()\n\n\tif options != nil && options.TransactionalValidation != nil {\n\t\tbody, err = options.TransactionalValidation.Apply(body, uploadPagesOptions)\n\t\tif err != nil {\n\t\t\treturn UploadPagesResponse{}, nil\n\t\t}\n\t}\n\n\tresp, err := pb.generated().UploadPages(ctx, count, body, uploadPagesOptions, leaseAccessConditions,\n\t\tcpkInfo, cpkScopeInfo, sequenceNumberAccessConditions, modifiedAccessConditions)\n\n\treturn resp, err\n}\n\n// UploadPagesFromURL copies 1 or more pages from a source URL to the page blob.\n// The sourceOffset specifies the start offset of source data to copy from.\n// The destOffset specifies the start offset of data in page blob will be written to.\n// The count must be a multiple of 512 bytes.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-page-from-url.\nfunc (pb *Client) UploadPagesFromURL(ctx context.Context, source string, sourceOffset, destOffset, count int64,\n\to *UploadPagesFromURLOptions) (UploadPagesFromURLResponse, error) {\n\n\tuploadPagesFromURLOptions, cpkInfo, cpkScopeInfo, leaseAccessConditions, sequenceNumberAccessConditions,\n\t\tmodifiedAccessConditions, sourceModifiedAccessConditions := o.format()\n\n\tresp, err := pb.generated().UploadPagesFromURL(ctx, source, shared.RangeToString(sourceOffset, count), 0,\n\t\tshared.RangeToString(destOffset, count), uploadPagesFromURLOptions, cpkInfo, cpkScopeInfo, leaseAccessConditions,\n\t\tsequenceNumberAccessConditions, modifiedAccessConditions, sourceModifiedAccessConditions)\n\n\treturn resp, err\n}\n\n// ClearPages frees the specified pages from the page blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-page.\nfunc (pb *Client) ClearPages(ctx context.Context, rnge blob.HTTPRange, options *ClearPagesOptions) (ClearPagesResponse, error) {\n\tclearOptions := &generated.PageBlobClientClearPagesOptions{\n\t\tRange: exported.FormatHTTPRange(rnge),\n\t}\n\n\tleaseAccessConditions, cpkInfo, cpkScopeInfo, sequenceNumberAccessConditions, modifiedAccessConditions := options.format()\n\n\tresp, err := pb.generated().ClearPages(ctx, 0, clearOptions, leaseAccessConditions, cpkInfo,\n\t\tcpkScopeInfo, sequenceNumberAccessConditions, modifiedAccessConditions)\n\n\treturn resp, err\n}\n\n// NewGetPageRangesPager returns the list of valid page ranges for a page blob or snapshot of a page blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges.\nfunc (pb *Client) NewGetPageRangesPager(o *GetPageRangesOptions) *runtime.Pager[GetPageRangesResponse] {\n\topts, leaseAccessConditions, modifiedAccessConditions := o.format()\n\n\treturn runtime.NewPager(runtime.PagingHandler[GetPageRangesResponse]{\n\t\tMore: func(page GetPageRangesResponse) bool {\n\t\t\treturn page.NextMarker != nil && len(*page.NextMarker) > 0\n\t\t},\n\t\tFetcher: func(ctx context.Context, page *GetPageRangesResponse) (GetPageRangesResponse, error) {\n\t\t\tvar req *policy.Request\n\t\t\tvar err error\n\t\t\tif page == nil {\n\t\t\t\treq, err = pb.generated().GetPageRangesCreateRequest(ctx, opts, leaseAccessConditions, modifiedAccessConditions)\n\t\t\t} else {\n\t\t\t\topts.Marker = page.NextMarker\n\t\t\t\treq, err = pb.generated().GetPageRangesCreateRequest(ctx, opts, leaseAccessConditions, modifiedAccessConditions)\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\treturn GetPageRangesResponse{}, err\n\t\t\t}\n\t\t\tresp, err := pb.generated().InternalClient().Pipeline().Do(req)\n\t\t\tif err != nil {\n\t\t\t\treturn GetPageRangesResponse{}, err\n\t\t\t}\n\t\t\tif !runtime.HasStatusCode(resp, http.StatusOK) {\n\t\t\t\treturn GetPageRangesResponse{}, runtime.NewResponseError(resp)\n\t\t\t}\n\t\t\treturn pb.generated().GetPageRangesHandleResponse(resp)\n\t\t},\n\t})\n}\n\n// NewGetPageRangesDiffPager gets the collection of page ranges that differ between a specified snapshot and this page blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges.\nfunc (pb *Client) NewGetPageRangesDiffPager(o *GetPageRangesDiffOptions) *runtime.Pager[GetPageRangesDiffResponse] {\n\topts, leaseAccessConditions, modifiedAccessConditions := o.format()\n\n\treturn runtime.NewPager(runtime.PagingHandler[GetPageRangesDiffResponse]{\n\t\tMore: func(page GetPageRangesDiffResponse) bool {\n\t\t\treturn page.NextMarker != nil && len(*page.NextMarker) > 0\n\t\t},\n\t\tFetcher: func(ctx context.Context, page *GetPageRangesDiffResponse) (GetPageRangesDiffResponse, error) {\n\t\t\tvar req *policy.Request\n\t\t\tvar err error\n\t\t\tif page == nil {\n\t\t\t\treq, err = pb.generated().GetPageRangesDiffCreateRequest(ctx, opts, leaseAccessConditions, modifiedAccessConditions)\n\t\t\t} else {\n\t\t\t\topts.Marker = page.NextMarker\n\t\t\t\treq, err = pb.generated().GetPageRangesDiffCreateRequest(ctx, opts, leaseAccessConditions, modifiedAccessConditions)\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\treturn GetPageRangesDiffResponse{}, err\n\t\t\t}\n\t\t\tresp, err := pb.generated().InternalClient().Pipeline().Do(req)\n\t\t\tif err != nil {\n\t\t\t\treturn GetPageRangesDiffResponse{}, err\n\t\t\t}\n\t\t\tif !runtime.HasStatusCode(resp, http.StatusOK) {\n\t\t\t\treturn GetPageRangesDiffResponse{}, runtime.NewResponseError(resp)\n\t\t\t}\n\t\t\treturn pb.generated().GetPageRangesDiffHandleResponse(resp)\n\t\t},\n\t})\n}\n\n// Resize resizes the page blob to the specified size (which must be a multiple of 512).\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties.\nfunc (pb *Client) Resize(ctx context.Context, size int64, options *ResizeOptions) (ResizeResponse, error) {\n\tresizeOptions, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions := options.format()\n\n\tresp, err := pb.generated().Resize(ctx, size, resizeOptions, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions)\n\n\treturn resp, err\n}\n\n// UpdateSequenceNumber sets the page blob's sequence number.\nfunc (pb *Client) UpdateSequenceNumber(ctx context.Context, options *UpdateSequenceNumberOptions) (UpdateSequenceNumberResponse, error) {\n\tactionType, updateOptions, lac, mac := options.format()\n\tresp, err := pb.generated().UpdateSequenceNumber(ctx, *actionType, updateOptions, lac, mac)\n\n\treturn resp, err\n}\n\n// StartCopyIncremental begins an operation to start an incremental copy from one-page blob's snapshot to this page blob.\n// The snapshot is copied such that only the differential changes between the previously copied snapshot are transferred to the destination.\n// The copied snapshots are complete copies of the original snapshot and can be read or copied from as usual.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/incremental-copy-blob and\n// https://docs.microsoft.com/en-us/azure/virtual-machines/windows/incremental-snapshots.\nfunc (pb *Client) StartCopyIncremental(ctx context.Context, copySource string, prevSnapshot string, options *CopyIncrementalOptions) (CopyIncrementalResponse, error) {\n\tcopySourceURL, err := url.Parse(copySource)\n\tif err != nil {\n\t\treturn CopyIncrementalResponse{}, err\n\t}\n\n\tqueryParams := copySourceURL.Query()\n\tqueryParams.Set(\"snapshot\", prevSnapshot)\n\tcopySourceURL.RawQuery = queryParams.Encode()\n\n\tpageBlobCopyIncrementalOptions, modifiedAccessConditions := options.format()\n\tresp, err := pb.generated().CopyIncremental(ctx, copySourceURL.String(), pageBlobCopyIncrementalOptions, modifiedAccessConditions)\n\n\treturn resp, err\n}\n\n// Redeclared APIs\n\n// Delete marks the specified blob or snapshot for deletion. The blob is later deleted during garbage collection.\n// Note that deleting a blob also deletes all its snapshots.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-blob.\nfunc (pb *Client) Delete(ctx context.Context, o *blob.DeleteOptions) (blob.DeleteResponse, error) {\n\treturn pb.BlobClient().Delete(ctx, o)\n}\n\n// Undelete restores the contents and metadata of a soft-deleted blob and any associated soft-deleted snapshots.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/undelete-blob.\nfunc (pb *Client) Undelete(ctx context.Context, o *blob.UndeleteOptions) (blob.UndeleteResponse, error) {\n\treturn pb.BlobClient().Undelete(ctx, o)\n}\n\n// SetImmutabilityPolicy operation enables users to set the immutability policy on a blob.\n// https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview\nfunc (pb *Client) SetImmutabilityPolicy(ctx context.Context, expiryTime time.Time, options *blob.SetImmutabilityPolicyOptions) (blob.SetImmutabilityPolicyResponse, error) {\n\treturn pb.BlobClient().SetImmutabilityPolicy(ctx, expiryTime, options)\n}\n\n// DeleteImmutabilityPolicy operation enables users to delete the immutability policy on a blob.\n// https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview\nfunc (pb *Client) DeleteImmutabilityPolicy(ctx context.Context, options *blob.DeleteImmutabilityPolicyOptions) (blob.DeleteImmutabilityPolicyResponse, error) {\n\treturn pb.BlobClient().DeleteImmutabilityPolicy(ctx, options)\n}\n\n// SetLegalHold operation enables users to set legal hold on a blob.\n// https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview\nfunc (pb *Client) SetLegalHold(ctx context.Context, legalHold bool, options *blob.SetLegalHoldOptions) (blob.SetLegalHoldResponse, error) {\n\treturn pb.BlobClient().SetLegalHold(ctx, legalHold, options)\n}\n\n// SetTier operation sets the tier on a blob. The operation is allowed on a page\n// blob in a premium storage account and on a block blob in a blob storage account (locally\n// redundant storage only). A premium page blob's tier determines the allowed size, IOPs, and\n// bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive storage type. This operation\n// does not update the blob's ETag.\n// For detailed information about block blob level tier-ing see https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-storage-tiers.\nfunc (pb *Client) SetTier(ctx context.Context, tier blob.AccessTier, o *blob.SetTierOptions) (blob.SetTierResponse, error) {\n\treturn pb.BlobClient().SetTier(ctx, tier, o)\n}\n\n// GetProperties returns the blob's properties.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob-properties.\nfunc (pb *Client) GetProperties(ctx context.Context, o *blob.GetPropertiesOptions) (blob.GetPropertiesResponse, error) {\n\treturn pb.BlobClient().GetProperties(ctx, o)\n}\n\n// GetAccountInfo provides account level information\n// For more information, see https://learn.microsoft.com/en-us/rest/api/storageservices/get-account-information?tabs=shared-access-signatures.\nfunc (pb *Client) GetAccountInfo(ctx context.Context, o *blob.GetAccountInfoOptions) (blob.GetAccountInfoResponse, error) {\n\treturn pb.BlobClient().GetAccountInfo(ctx, o)\n}\n\n// SetHTTPHeaders changes a blob's HTTP headers.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties.\nfunc (pb *Client) SetHTTPHeaders(ctx context.Context, httpHeaders blob.HTTPHeaders, o *blob.SetHTTPHeadersOptions) (blob.SetHTTPHeadersResponse, error) {\n\treturn pb.BlobClient().SetHTTPHeaders(ctx, httpHeaders, o)\n}\n\n// SetMetadata changes a blob's metadata.\n// https://docs.microsoft.com/rest/api/storageservices/set-blob-metadata.\nfunc (pb *Client) SetMetadata(ctx context.Context, metadata map[string]*string, o *blob.SetMetadataOptions) (blob.SetMetadataResponse, error) {\n\treturn pb.BlobClient().SetMetadata(ctx, metadata, o)\n}\n\n// CreateSnapshot creates a read-only snapshot of a blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/snapshot-blob.\nfunc (pb *Client) CreateSnapshot(ctx context.Context, o *blob.CreateSnapshotOptions) (blob.CreateSnapshotResponse, error) {\n\treturn pb.BlobClient().CreateSnapshot(ctx, o)\n}\n\n// StartCopyFromURL copies the data at the source URL to a blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/copy-blob.\nfunc (pb *Client) StartCopyFromURL(ctx context.Context, copySource string, o *blob.StartCopyFromURLOptions) (blob.StartCopyFromURLResponse, error) {\n\treturn pb.BlobClient().StartCopyFromURL(ctx, copySource, o)\n}\n\n// AbortCopyFromURL stops a pending copy that was previously started and leaves a destination blob with 0 length and metadata.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/abort-copy-blob.\nfunc (pb *Client) AbortCopyFromURL(ctx context.Context, copyID string, o *blob.AbortCopyFromURLOptions) (blob.AbortCopyFromURLResponse, error) {\n\treturn pb.BlobClient().AbortCopyFromURL(ctx, copyID, o)\n}\n\n// SetTags operation enables users to set tags on a blob or specific blob version, but not snapshot.\n// Each call to this operation replaces all existing tags attached to the blob.\n// To remove all tags from the blob, call this operation with no tags set.\n// https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-tags\nfunc (pb *Client) SetTags(ctx context.Context, tags map[string]string, o *blob.SetTagsOptions) (blob.SetTagsResponse, error) {\n\treturn pb.BlobClient().SetTags(ctx, tags, o)\n}\n\n// GetTags operation enables users to get tags on a blob or specific blob version, or snapshot.\n// https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-tags\nfunc (pb *Client) GetTags(ctx context.Context, o *blob.GetTagsOptions) (blob.GetTagsResponse, error) {\n\treturn pb.BlobClient().GetTags(ctx, o)\n}\n\n// CopyFromURL synchronously copies the data at the source URL to a block blob, with sizes up to 256 MB.\n// For more information, see https://docs.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url.\nfunc (pb *Client) CopyFromURL(ctx context.Context, copySource string, o *blob.CopyFromURLOptions) (blob.CopyFromURLResponse, error) {\n\treturn pb.BlobClient().CopyFromURL(ctx, copySource, o)\n}\n\n// GetSASURL is a convenience method for generating a SAS token for the currently pointed at Page blob.\n// It can only be used if the credential supplied during creation was a SharedKeyCredential.\nfunc (pb *Client) GetSASURL(permissions sas.BlobPermissions, expiry time.Time, o *blob.GetSASURLOptions) (string, error) {\n\treturn pb.BlobClient().GetSASURL(permissions, expiry, o)\n}\n\n// Concurrent Download Functions -----------------------------------------------------------------------------------------\n\n// DownloadStream reads a range of bytes from a blob. The response also includes the blob's properties and metadata.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob.\nfunc (pb *Client) DownloadStream(ctx context.Context, o *blob.DownloadStreamOptions) (blob.DownloadStreamResponse, error) {\n\treturn pb.BlobClient().DownloadStream(ctx, o)\n}\n\n// DownloadBuffer downloads an Azure blob to a buffer with parallel.\nfunc (pb *Client) DownloadBuffer(ctx context.Context, buffer []byte, o *blob.DownloadBufferOptions) (int64, error) {\n\treturn pb.BlobClient().DownloadBuffer(ctx, shared.NewBytesWriter(buffer), o)\n}\n\n// DownloadFile downloads an Azure blob to a local file.\n// The file would be truncated if the size doesn't match.\nfunc (pb *Client) DownloadFile(ctx context.Context, file *os.File, o *blob.DownloadFileOptions) (int64, error) {\n\treturn pb.BlobClient().DownloadFile(ctx, file, o)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/pageblob/constants.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage pageblob\n\nimport \"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\nconst (\n\t// PageBytes indicates the number of bytes in a page (512).\n\tPageBytes = 512\n)\n\n// CopyStatusType defines values for CopyStatusType\ntype CopyStatusType = generated.CopyStatusType\n\nconst (\n\tCopyStatusTypePending CopyStatusType = generated.CopyStatusTypePending\n\tCopyStatusTypeSuccess CopyStatusType = generated.CopyStatusTypeSuccess\n\tCopyStatusTypeAborted CopyStatusType = generated.CopyStatusTypeAborted\n\tCopyStatusTypeFailed  CopyStatusType = generated.CopyStatusTypeFailed\n)\n\n// PossibleCopyStatusTypeValues returns the possible values for the CopyStatusType const type.\nfunc PossibleCopyStatusTypeValues() []CopyStatusType {\n\treturn generated.PossibleCopyStatusTypeValues()\n}\n\n// PremiumPageBlobAccessTier defines values for Premium PageBlob's AccessTier.\ntype PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTier\n\nconst (\n\tPremiumPageBlobAccessTierP10 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP10\n\tPremiumPageBlobAccessTierP15 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP15\n\tPremiumPageBlobAccessTierP20 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP20\n\tPremiumPageBlobAccessTierP30 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP30\n\tPremiumPageBlobAccessTierP4  PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP4\n\tPremiumPageBlobAccessTierP40 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP40\n\tPremiumPageBlobAccessTierP50 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP50\n\tPremiumPageBlobAccessTierP6  PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP6\n\tPremiumPageBlobAccessTierP60 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP60\n\tPremiumPageBlobAccessTierP70 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP70\n\tPremiumPageBlobAccessTierP80 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP80\n)\n\n// PossiblePremiumPageBlobAccessTierValues returns the possible values for the PremiumPageBlobAccessTier const type.\nfunc PossiblePremiumPageBlobAccessTierValues() []PremiumPageBlobAccessTier {\n\treturn generated.PossiblePremiumPageBlobAccessTierValues()\n}\n\n// SequenceNumberActionType defines values for SequenceNumberActionType.\ntype SequenceNumberActionType = generated.SequenceNumberActionType\n\nconst (\n\tSequenceNumberActionTypeMax       SequenceNumberActionType = generated.SequenceNumberActionTypeMax\n\tSequenceNumberActionTypeUpdate    SequenceNumberActionType = generated.SequenceNumberActionTypeUpdate\n\tSequenceNumberActionTypeIncrement SequenceNumberActionType = generated.SequenceNumberActionTypeIncrement\n)\n\n// PossibleSequenceNumberActionTypeValues returns the possible values for the SequenceNumberActionType const type.\nfunc PossibleSequenceNumberActionTypeValues() []SequenceNumberActionType {\n\treturn generated.PossibleSequenceNumberActionTypeValues()\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/pageblob/models.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage pageblob\n\nimport (\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n)\n\n// Type Declarations ---------------------------------------------------------------------\n\n// PageList - the list of pages.\ntype PageList = generated.PageList\n\n// ClearRange defines a range of pages.\ntype ClearRange = generated.ClearRange\n\n// PageRange defines a range of pages.\ntype PageRange = generated.PageRange\n\n// SequenceNumberAccessConditions contains a group of parameters for the Client.UploadPages method.\ntype SequenceNumberAccessConditions = generated.SequenceNumberAccessConditions\n\n// Request Model Declaration -------------------------------------------------------------------------------------------\n\n// CreateOptions contains the optional parameters for the Client.Create method.\ntype CreateOptions struct {\n\t// Set for page blobs only. The sequence number is a user-controlled value that you can use to track requests. The value of\n\t// the sequence number must be between 0 and 2^63 - 1.\n\tSequenceNumber *int64\n\n\t// Optional. Used to set blob tags in various blob operations.\n\tTags map[string]string\n\n\t// Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the\n\t// operation will copy the metadata from the source blob or file to the destination blob. If one or more name-value pairs\n\t// are specified, the destination blob is created with the specified metadata, and metadata is not copied from the source\n\t// blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers.\n\t// See Naming and Referencing Containers, Blobs, and Metadata for more information.\n\tMetadata map[string]*string\n\n\t// Optional. Indicates the tier to be set on the page blob.\n\tTier *PremiumPageBlobAccessTier\n\n\tHTTPHeaders *blob.HTTPHeaders\n\n\tCPKInfo *blob.CPKInfo\n\n\tCPKScopeInfo *blob.CPKScopeInfo\n\n\tAccessConditions *blob.AccessConditions\n\t// Specifies the date time when the blobs immutability policy is set to expire.\n\tImmutabilityPolicyExpiry *time.Time\n\t// Specifies the immutability policy mode to set on the blob.\n\tImmutabilityPolicyMode *blob.ImmutabilityPolicyMode\n\t// Specified if a legal hold should be set on the blob.\n\tLegalHold *bool\n}\n\nfunc (o *CreateOptions) format() (*generated.PageBlobClientCreateOptions, *generated.BlobHTTPHeaders,\n\t*generated.LeaseAccessConditions, *generated.CPKInfo, *generated.CPKScopeInfo, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil, nil, nil\n\t}\n\n\toptions := &generated.PageBlobClientCreateOptions{\n\t\tBlobSequenceNumber: o.SequenceNumber,\n\t\tBlobTagsString:     shared.SerializeBlobTagsToStrPtr(o.Tags),\n\t\tMetadata:           o.Metadata,\n\t\tTier:               o.Tier,\n\t}\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn options, o.HTTPHeaders, leaseAccessConditions, o.CPKInfo, o.CPKScopeInfo, modifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// UploadPagesOptions contains the optional parameters for the Client.UploadPages method.\ntype UploadPagesOptions struct {\n\t// TransactionalValidation specifies the transfer validation type to use.\n\t// The default is nil (no transfer validation).\n\tTransactionalValidation blob.TransferValidationType\n\n\tCPKInfo                        *blob.CPKInfo\n\tCPKScopeInfo                   *blob.CPKScopeInfo\n\tSequenceNumberAccessConditions *SequenceNumberAccessConditions\n\tAccessConditions               *blob.AccessConditions\n}\n\nfunc (o *UploadPagesOptions) format() (*generated.LeaseAccessConditions,\n\t*generated.CPKInfo, *generated.CPKScopeInfo, *generated.SequenceNumberAccessConditions, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil, nil\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn leaseAccessConditions, o.CPKInfo, o.CPKScopeInfo, o.SequenceNumberAccessConditions, modifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// UploadPagesFromURLOptions contains the optional parameters for the Client.UploadPagesFromURL method.\ntype UploadPagesFromURLOptions struct {\n\t// Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source.\n\tCopySourceAuthorization *string\n\n\t// SourceContentValidation contains the validation mechanism used on the range of bytes read from the source.\n\tSourceContentValidation blob.SourceContentValidationType\n\n\tCPKInfo *blob.CPKInfo\n\n\tCPKScopeInfo *blob.CPKScopeInfo\n\n\tSequenceNumberAccessConditions *SequenceNumberAccessConditions\n\n\tSourceModifiedAccessConditions *blob.SourceModifiedAccessConditions\n\n\tAccessConditions *blob.AccessConditions\n}\n\nfunc (o *UploadPagesFromURLOptions) format() (*generated.PageBlobClientUploadPagesFromURLOptions, *generated.CPKInfo, *generated.CPKScopeInfo,\n\t*generated.LeaseAccessConditions, *generated.SequenceNumberAccessConditions, *generated.ModifiedAccessConditions, *generated.SourceModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil, nil, nil, nil\n\t}\n\n\toptions := &generated.PageBlobClientUploadPagesFromURLOptions{\n\t\tCopySourceAuthorization: o.CopySourceAuthorization,\n\t}\n\n\tif o.SourceContentValidation != nil {\n\t\to.SourceContentValidation.Apply(options)\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn options, o.CPKInfo, o.CPKScopeInfo, leaseAccessConditions, o.SequenceNumberAccessConditions, modifiedAccessConditions, o.SourceModifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// ClearPagesOptions contains the optional parameters for the Client.ClearPages operation\ntype ClearPagesOptions struct {\n\tCPKInfo                        *blob.CPKInfo\n\tCPKScopeInfo                   *blob.CPKScopeInfo\n\tSequenceNumberAccessConditions *SequenceNumberAccessConditions\n\tAccessConditions               *blob.AccessConditions\n}\n\nfunc (o *ClearPagesOptions) format() (*generated.LeaseAccessConditions, *generated.CPKInfo,\n\t*generated.CPKScopeInfo, *generated.SequenceNumberAccessConditions, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil, nil\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn leaseAccessConditions, o.CPKInfo, o.CPKScopeInfo, o.SequenceNumberAccessConditions, modifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// GetPageRangesOptions contains the optional parameters for the Client.NewGetPageRangesPager method.\ntype GetPageRangesOptions struct {\n\tMarker *string\n\t// Specifies the maximum number of containers to return. If the request does not specify MaxResults, or specifies a value\n\t// greater than 5000, the server will return up to 5000 items. Note that if the\n\t// listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder\n\t// of the results. For this reason, it is possible that the service will\n\t// return fewer results than specified by MaxResults, or than the default of 5000.\n\tMaxResults *int32\n\t// Optional. This header is only supported in service versions 2019-04-19 and after and specifies the URL of a previous snapshot\n\t// of the target blob. The response will only contain pages that were changed\n\t// between the target blob and its previous snapshot.\n\tPrevSnapshotURL *string\n\t// Optional in version 2015-07-08 and newer. The PrevSnapshot parameter is a DateTime value that specifies that the response\n\t// will contain only pages that were changed between target blob and previous\n\t// snapshot. Changed pages include both updated and cleared pages. The target blob may be a snapshot, as long as the snapshot\n\t// specified by PrevSnapshot is the older of the two. Note that incremental\n\t// snapshots are currently supported only for blobs created on or after January 1, 2016.\n\tPrevSnapshot *string\n\t// Range specifies a range of bytes.  The default value is all bytes.\n\tRange blob.HTTPRange\n\t// The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more\n\t// information on working with blob snapshots, see Creating a Snapshot of a Blob.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob]\n\tSnapshot *string\n\n\tAccessConditions *blob.AccessConditions\n}\n\nfunc (o *GetPageRangesOptions) format() (*generated.PageBlobClientGetPageRangesOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn &generated.PageBlobClientGetPageRangesOptions{}, nil, nil\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn &generated.PageBlobClientGetPageRangesOptions{\n\t\tMarker:     o.Marker,\n\t\tMaxresults: o.MaxResults,\n\t\tRange:      exported.FormatHTTPRange(o.Range),\n\t\tSnapshot:   o.Snapshot,\n\t}, leaseAccessConditions, modifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// GetPageRangesDiffOptions contains the optional parameters for the Client.NewGetPageRangesDiffPager method.\ntype GetPageRangesDiffOptions struct {\n\t// A string value that identifies the portion of the list of containers to be returned with the next listing operation. The\n\t// operation returns the NextMarker value within the response body if the listing\n\t// operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used\n\t// as the value for the marker parameter in a subsequent call to request the next\n\t// page of list items. The marker value is opaque to the client.\n\tMarker *string\n\t// Specifies the maximum number of containers to return. If the request does not specify MaxResults, or specifies a value\n\t// greater than 5000, the server will return up to 5000 items. Note that if the\n\t// listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder\n\t// of the results. For this reason, it is possible that the service will\n\t// return fewer results than specified by MaxResults, or than the default of 5000.\n\tMaxResults *int32\n\t// Optional. This header is only supported in service versions 2019-04-19 and after and specifies the URL of a previous snapshot\n\t// of the target blob. The response will only contain pages that were changed\n\t// between the target blob and its previous snapshot.\n\tPrevSnapshotURL *string\n\t// Optional in version 2015-07-08 and newer. The PrevSnapshot parameter is a DateTime value that specifies that the response\n\t// will contain only pages that were changed between target blob and previous\n\t// snapshot. Changed pages include both updated and cleared pages. The target blob may be a snapshot, as long as the snapshot\n\t// specified by PrevSnapshot is the older of the two. Note that incremental\n\t// snapshots are currently supported only for blobs created on or after January 1, 2016.\n\tPrevSnapshot *string\n\t// Range specifies a range of bytes.  The default value is all bytes.\n\tRange blob.HTTPRange\n\n\t// The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more\n\t// information on working with blob snapshots, see Creating a Snapshot of a Blob.\n\t// [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob]\n\tSnapshot *string\n\n\tAccessConditions *blob.AccessConditions\n}\n\nfunc (o *GetPageRangesDiffOptions) format() (*generated.PageBlobClientGetPageRangesDiffOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn &generated.PageBlobClientGetPageRangesDiffOptions{\n\t\tMarker:          o.Marker,\n\t\tMaxresults:      o.MaxResults,\n\t\tPrevSnapshotURL: o.PrevSnapshotURL,\n\t\tPrevsnapshot:    o.PrevSnapshot,\n\t\tRange:           exported.FormatHTTPRange(o.Range),\n\t\tSnapshot:        o.Snapshot,\n\t}, leaseAccessConditions, modifiedAccessConditions\n\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// ResizeOptions contains the optional parameters for the Client.Resize method.\ntype ResizeOptions struct {\n\tCPKInfo          *blob.CPKInfo\n\tCPKScopeInfo     *blob.CPKScopeInfo\n\tAccessConditions *blob.AccessConditions\n}\n\nfunc (o *ResizeOptions) format() (*generated.PageBlobClientResizeOptions, *generated.LeaseAccessConditions,\n\t*generated.CPKInfo, *generated.CPKScopeInfo, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil, nil\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn nil, leaseAccessConditions, o.CPKInfo, o.CPKScopeInfo, modifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// UpdateSequenceNumberOptions contains the optional parameters for the Client.UpdateSequenceNumber method.\ntype UpdateSequenceNumberOptions struct {\n\tActionType *SequenceNumberActionType\n\n\tSequenceNumber *int64\n\n\tAccessConditions *blob.AccessConditions\n}\n\nfunc (o *UpdateSequenceNumberOptions) format() (*generated.SequenceNumberActionType, *generated.PageBlobClientUpdateSequenceNumberOptions,\n\t*generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil, nil\n\t}\n\n\toptions := &generated.PageBlobClientUpdateSequenceNumberOptions{\n\t\tBlobSequenceNumber: o.SequenceNumber,\n\t}\n\n\tif *o.ActionType == SequenceNumberActionTypeIncrement {\n\t\toptions.BlobSequenceNumber = nil\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn o.ActionType, options, leaseAccessConditions, modifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// CopyIncrementalOptions contains the optional parameters for the Client.StartCopyIncremental method.\ntype CopyIncrementalOptions struct {\n\tModifiedAccessConditions *blob.ModifiedAccessConditions\n}\n\nfunc (o *CopyIncrementalOptions) format() (*generated.PageBlobClientCopyIncrementalOptions, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil\n\t}\n\n\treturn nil, o.ModifiedAccessConditions\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/pageblob/responses.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage pageblob\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n)\n\n// CreateResponse contains the response from method Client.Create.\ntype CreateResponse = generated.PageBlobClientCreateResponse\n\n// UploadPagesResponse contains the response from method Client.UploadPages.\ntype UploadPagesResponse = generated.PageBlobClientUploadPagesResponse\n\n// UploadPagesFromURLResponse contains the response from method Client.UploadPagesFromURL.\ntype UploadPagesFromURLResponse = generated.PageBlobClientUploadPagesFromURLResponse\n\n// ClearPagesResponse contains the response from method Client.ClearPages.\ntype ClearPagesResponse = generated.PageBlobClientClearPagesResponse\n\n// GetPageRangesResponse contains the response from method Client.NewGetPageRangesPager.\ntype GetPageRangesResponse = generated.PageBlobClientGetPageRangesResponse\n\n// GetPageRangesDiffResponse contains the response from method Client.NewGetPageRangesDiffPager.\ntype GetPageRangesDiffResponse = generated.PageBlobClientGetPageRangesDiffResponse\n\n// ResizeResponse contains the response from method Client.Resize.\ntype ResizeResponse = generated.PageBlobClientResizeResponse\n\n// UpdateSequenceNumberResponse contains the response from method Client.UpdateSequenceNumber.\ntype UpdateSequenceNumberResponse = generated.PageBlobClientUpdateSequenceNumberResponse\n\n// CopyIncrementalResponse contains the response from method Client.StartCopyIncremental.\ntype CopyIncrementalResponse = generated.PageBlobClientCopyIncrementalResponse\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/responses.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage azblob\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/service\"\n)\n\n// CreateContainerResponse contains the response from method container.Client.Create.\ntype CreateContainerResponse = service.CreateContainerResponse\n\n// DeleteContainerResponse contains the response from method container.Client.Delete\ntype DeleteContainerResponse = service.DeleteContainerResponse\n\n// DeleteBlobResponse contains the response from method blob.Client.Delete.\ntype DeleteBlobResponse = blob.DeleteResponse\n\n// UploadResponse contains the response from method blockblob.Client.CommitBlockList.\ntype UploadResponse = blockblob.CommitBlockListResponse\n\n// DownloadStreamResponse wraps AutoRest generated BlobDownloadResponse and helps to provide info for retry.\ntype DownloadStreamResponse = blob.DownloadStreamResponse\n\n// ListBlobsFlatResponse contains the response from method container.Client.ListBlobFlatSegment.\ntype ListBlobsFlatResponse = container.ListBlobsFlatResponse\n\n// ListContainersResponse contains the response from method service.Client.ListContainersSegment.\ntype ListContainersResponse = service.ListContainersResponse\n\n// UploadBufferResponse contains the response from method Client.UploadBuffer/Client.UploadFile.\ntype UploadBufferResponse = blockblob.UploadBufferResponse\n\n// UploadFileResponse contains the response from method Client.UploadBuffer/Client.UploadFile.\ntype UploadFileResponse = blockblob.UploadFileResponse\n\n// UploadStreamResponse contains the response from method Client.CommitBlockList.\ntype UploadStreamResponse = blockblob.CommitBlockListResponse\n\n// ListContainersSegmentResponse - An enumeration of containers\ntype ListContainersSegmentResponse = generated.ListContainersSegmentResponse\n\n// ListBlobsFlatSegmentResponse - An enumeration of blobs\ntype ListBlobsFlatSegmentResponse = generated.ListBlobsFlatSegmentResponse\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas/account.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage sas\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n)\n\n// SharedKeyCredential contains an account's name and its primary or secondary key.\ntype SharedKeyCredential = exported.SharedKeyCredential\n\n// UserDelegationCredential contains an account's name and its user delegation key.\ntype UserDelegationCredential = exported.UserDelegationCredential\n\n// AccountSignatureValues is used to generate a Shared Access Signature (SAS) for an Azure Storage account.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/constructing-an-account-sas\ntype AccountSignatureValues struct {\n\tVersion         string    `param:\"sv\"`  // If not specified, this format to SASVersion\n\tProtocol        Protocol  `param:\"spr\"` // See the SASProtocol* constants\n\tStartTime       time.Time `param:\"st\"`  // Not specified if IsZero\n\tExpiryTime      time.Time `param:\"se\"`  // Not specified if IsZero\n\tPermissions     string    `param:\"sp\"`  // Create by initializing AccountPermissions and then call String()\n\tIPRange         IPRange   `param:\"sip\"`\n\tResourceTypes   string    `param:\"srt\"` // Create by initializing AccountResourceTypes and then call String()\n\tEncryptionScope string    `param:\"ses\"`\n}\n\n// SignWithSharedKey uses an account's shared key credential to sign this signature values to produce\n// the proper SAS query parameters.\nfunc (v AccountSignatureValues) SignWithSharedKey(sharedKeyCredential *SharedKeyCredential) (QueryParameters, error) {\n\t// https://docs.microsoft.com/en-us/rest/api/storageservices/Constructing-an-Account-SAS\n\tif v.ExpiryTime.IsZero() || v.Permissions == \"\" || v.ResourceTypes == \"\" {\n\t\treturn QueryParameters{}, errors.New(\"account SAS is missing at least one of these: ExpiryTime, Permissions, Service, or ResourceType\")\n\t}\n\tif v.Version == \"\" {\n\t\tv.Version = Version\n\t}\n\tperms, err := parseAccountPermissions(v.Permissions)\n\tif err != nil {\n\t\treturn QueryParameters{}, err\n\t}\n\tv.Permissions = perms.String()\n\n\tresources, err := parseAccountResourceTypes(v.ResourceTypes)\n\tif err != nil {\n\t\treturn QueryParameters{}, err\n\t}\n\tv.ResourceTypes = resources.String()\n\n\tstartTime, expiryTime, _ := formatTimesForSigning(v.StartTime, v.ExpiryTime, time.Time{})\n\n\tstringToSign := strings.Join([]string{\n\t\tsharedKeyCredential.AccountName(),\n\t\tv.Permissions,\n\t\t\"b\", // blob service\n\t\tv.ResourceTypes,\n\t\tstartTime,\n\t\texpiryTime,\n\t\tv.IPRange.String(),\n\t\tstring(v.Protocol),\n\t\tv.Version,\n\t\tv.EncryptionScope,\n\t\t\"\"}, // That is right, the account SAS requires a terminating extra newline\n\t\t\"\\n\")\n\n\tsignature, err := exported.ComputeHMACSHA256(sharedKeyCredential, stringToSign)\n\tif err != nil {\n\t\treturn QueryParameters{}, err\n\t}\n\tp := QueryParameters{\n\t\t// Common SAS parameters\n\t\tversion:         v.Version,\n\t\tprotocol:        v.Protocol,\n\t\tstartTime:       v.StartTime,\n\t\texpiryTime:      v.ExpiryTime,\n\t\tpermissions:     v.Permissions,\n\t\tipRange:         v.IPRange,\n\t\tencryptionScope: v.EncryptionScope,\n\n\t\t// Account-specific SAS parameters\n\t\tservices:      \"b\", // will always be \"b\"\n\t\tresourceTypes: v.ResourceTypes,\n\n\t\t// Calculated SAS signature\n\t\tsignature: signature,\n\t}\n\n\treturn p, nil\n}\n\n// AccountPermissions type simplifies creating the permissions string for an Azure Storage Account SAS.\n// Initialize an instance of this type and then call its String method to set AccountSignatureValues' Permissions field.\ntype AccountPermissions struct {\n\tRead, Write, Delete, DeletePreviousVersion, PermanentDelete, List, Add, Create, Update, Process, FilterByTags, Tag, SetImmutabilityPolicy bool\n}\n\n// String produces the SAS permissions string for an Azure Storage account.\n// Call this method to set AccountSignatureValues' Permissions field.\nfunc (p *AccountPermissions) String() string {\n\tvar buffer bytes.Buffer\n\tif p.Read {\n\t\tbuffer.WriteRune('r')\n\t}\n\tif p.Write {\n\t\tbuffer.WriteRune('w')\n\t}\n\tif p.Delete {\n\t\tbuffer.WriteRune('d')\n\t}\n\tif p.DeletePreviousVersion {\n\t\tbuffer.WriteRune('x')\n\t}\n\tif p.PermanentDelete {\n\t\tbuffer.WriteRune('y')\n\t}\n\tif p.List {\n\t\tbuffer.WriteRune('l')\n\t}\n\tif p.Add {\n\t\tbuffer.WriteRune('a')\n\t}\n\tif p.Create {\n\t\tbuffer.WriteRune('c')\n\t}\n\tif p.Update {\n\t\tbuffer.WriteRune('u')\n\t}\n\tif p.Process {\n\t\tbuffer.WriteRune('p')\n\t}\n\tif p.FilterByTags {\n\t\tbuffer.WriteRune('f')\n\t}\n\tif p.Tag {\n\t\tbuffer.WriteRune('t')\n\t}\n\tif p.SetImmutabilityPolicy {\n\t\tbuffer.WriteRune('i')\n\t}\n\treturn buffer.String()\n}\n\n// Parse initializes the AccountPermissions' fields from a string.\nfunc parseAccountPermissions(s string) (AccountPermissions, error) {\n\tp := AccountPermissions{} // Clear out the flags\n\tfor _, r := range s {\n\t\tswitch r {\n\t\tcase 'r':\n\t\t\tp.Read = true\n\t\tcase 'w':\n\t\t\tp.Write = true\n\t\tcase 'd':\n\t\t\tp.Delete = true\n\t\tcase 'x':\n\t\t\tp.DeletePreviousVersion = true\n\t\tcase 'y':\n\t\t\tp.PermanentDelete = true\n\t\tcase 'l':\n\t\t\tp.List = true\n\t\tcase 'a':\n\t\t\tp.Add = true\n\t\tcase 'c':\n\t\t\tp.Create = true\n\t\tcase 'u':\n\t\t\tp.Update = true\n\t\tcase 'p':\n\t\t\tp.Process = true\n\t\tcase 't':\n\t\t\tp.Tag = true\n\t\tcase 'f':\n\t\t\tp.FilterByTags = true\n\t\tcase 'i':\n\t\t\tp.SetImmutabilityPolicy = true\n\t\tdefault:\n\t\t\treturn AccountPermissions{}, fmt.Errorf(\"invalid permission character: '%v'\", r)\n\t\t}\n\t}\n\treturn p, nil\n}\n\n// AccountResourceTypes type simplifies creating the resource types string for an Azure Storage Account SAS.\n// Initialize an instance of this type and then call its String method to set AccountSignatureValues' ResourceTypes field.\ntype AccountResourceTypes struct {\n\tService, Container, Object bool\n}\n\n// String produces the SAS resource types string for an Azure Storage account.\n// Call this method to set AccountSignatureValues' ResourceTypes field.\nfunc (rt *AccountResourceTypes) String() string {\n\tvar buffer bytes.Buffer\n\tif rt.Service {\n\t\tbuffer.WriteRune('s')\n\t}\n\tif rt.Container {\n\t\tbuffer.WriteRune('c')\n\t}\n\tif rt.Object {\n\t\tbuffer.WriteRune('o')\n\t}\n\treturn buffer.String()\n}\n\n// parseAccountResourceTypes initializes the AccountResourceTypes' fields from a string.\nfunc parseAccountResourceTypes(s string) (AccountResourceTypes, error) {\n\trt := AccountResourceTypes{}\n\tfor _, r := range s {\n\t\tswitch r {\n\t\tcase 's':\n\t\t\trt.Service = true\n\t\tcase 'c':\n\t\t\trt.Container = true\n\t\tcase 'o':\n\t\t\trt.Object = true\n\t\tdefault:\n\t\t\treturn AccountResourceTypes{}, fmt.Errorf(\"invalid resource type character: '%v'\", r)\n\t\t}\n\t}\n\treturn rt, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas/query_params.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage sas\n\nimport (\n\t\"errors\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\t\"net\"\n\t\"net/url\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n)\n\n// TimeFormat represents the format of a SAS start or expiry time. Use it when formatting/parsing a time.Time.\nconst (\n\tTimeFormat = \"2006-01-02T15:04:05Z\" // \"2017-07-27T00:00:00Z\" // ISO 8601\n)\n\nvar (\n\t// Version is the default version encoded in the SAS token.\n\tVersion = generated.ServiceVersion\n)\n\n// TimeFormats ISO 8601 format.\n// Please refer to https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas for more details.\nvar timeFormats = []string{\"2006-01-02T15:04:05.0000000Z\", TimeFormat, \"2006-01-02T15:04Z\", \"2006-01-02\"}\n\n// Protocol indicates the http/https.\ntype Protocol string\n\nconst (\n\t// ProtocolHTTPS can be specified for a SAS protocol.\n\tProtocolHTTPS Protocol = \"https\"\n\n\t// ProtocolHTTPSandHTTP can be specified for a SAS protocol.\n\tProtocolHTTPSandHTTP Protocol = \"https,http\"\n)\n\n// FormatTimesForSigning converts a time.Time to a snapshotTimeFormat string suitable for a\n// Field's StartTime or ExpiryTime fields. Returns \"\" if value.IsZero().\nfunc formatTimesForSigning(startTime, expiryTime, snapshotTime time.Time) (string, string, string) {\n\tss := \"\"\n\tif !startTime.IsZero() {\n\t\tss = formatTimeWithDefaultFormat(&startTime)\n\t}\n\tse := \"\"\n\tif !expiryTime.IsZero() {\n\t\tse = formatTimeWithDefaultFormat(&expiryTime)\n\t}\n\tsh := \"\"\n\tif !snapshotTime.IsZero() {\n\t\tsh = snapshotTime.Format(exported.SnapshotTimeFormat)\n\t}\n\treturn ss, se, sh\n}\n\n// formatTimeWithDefaultFormat format time with ISO 8601 in \"yyyy-MM-ddTHH:mm:ssZ\".\nfunc formatTimeWithDefaultFormat(t *time.Time) string {\n\treturn formatTime(t, TimeFormat) // By default, \"yyyy-MM-ddTHH:mm:ssZ\" is used\n}\n\n// formatTime format time with given format, use ISO 8601 in \"yyyy-MM-ddTHH:mm:ssZ\" by default.\nfunc formatTime(t *time.Time, format string) string {\n\tif format != \"\" {\n\t\treturn t.Format(format)\n\t}\n\treturn t.Format(TimeFormat) // By default, \"yyyy-MM-ddTHH:mm:ssZ\" is used\n}\n\n// ParseTime try to parse a SAS time string.\nfunc parseTime(val string) (t time.Time, timeFormat string, err error) {\n\tfor _, sasTimeFormat := range timeFormats {\n\t\tt, err = time.Parse(sasTimeFormat, val)\n\t\tif err == nil {\n\t\t\ttimeFormat = sasTimeFormat\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif err != nil {\n\t\terr = errors.New(\"fail to parse time with IOS 8601 formats, please refer to https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas for more details\")\n\t}\n\n\treturn\n}\n\n// IPRange represents a SAS IP range's start IP and (optionally) end IP.\ntype IPRange struct {\n\tStart net.IP // Not specified if length = 0\n\tEnd   net.IP // Not specified if length = 0\n}\n\n// String returns a string representation of an IPRange.\nfunc (ipr *IPRange) String() string {\n\tif len(ipr.Start) == 0 {\n\t\treturn \"\"\n\t}\n\tstart := ipr.Start.String()\n\tif len(ipr.End) == 0 {\n\t\treturn start\n\t}\n\treturn start + \"-\" + ipr.End.String()\n}\n\n// https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas\n\n// QueryParameters object represents the components that make up an Azure Storage SAS' query parameters.\n// You parse a map of query parameters into its fields by calling NewQueryParameters(). You add the components\n// to a query parameter map by calling AddToValues().\n// NOTE: Changing any field requires computing a new SAS signature using a XxxSASSignatureValues type.\n// This type defines the components used by all Azure Storage resources (Containers, Blobs, Files, & Queues).\ntype QueryParameters struct {\n\t// All members are immutable or values so copies of this struct are goroutine-safe.\n\tversion              string    `param:\"sv\"`\n\tservices             string    `param:\"ss\"`\n\tresourceTypes        string    `param:\"srt\"`\n\tprotocol             Protocol  `param:\"spr\"`\n\tstartTime            time.Time `param:\"st\"`\n\texpiryTime           time.Time `param:\"se\"`\n\tsnapshotTime         time.Time `param:\"snapshot\"`\n\tipRange              IPRange   `param:\"sip\"`\n\tidentifier           string    `param:\"si\"`\n\tresource             string    `param:\"sr\"`\n\tpermissions          string    `param:\"sp\"`\n\tsignature            string    `param:\"sig\"`\n\tcacheControl         string    `param:\"rscc\"`\n\tcontentDisposition   string    `param:\"rscd\"`\n\tcontentEncoding      string    `param:\"rsce\"`\n\tcontentLanguage      string    `param:\"rscl\"`\n\tcontentType          string    `param:\"rsct\"`\n\tsignedOID            string    `param:\"skoid\"`\n\tsignedTID            string    `param:\"sktid\"`\n\tsignedStart          time.Time `param:\"skt\"`\n\tsignedService        string    `param:\"sks\"`\n\tsignedExpiry         time.Time `param:\"ske\"`\n\tsignedVersion        string    `param:\"skv\"`\n\tsignedDirectoryDepth string    `param:\"sdd\"`\n\tauthorizedObjectID   string    `param:\"saoid\"`\n\tunauthorizedObjectID string    `param:\"suoid\"`\n\tcorrelationID        string    `param:\"scid\"`\n\tencryptionScope      string    `param:\"ses\"`\n\t// private member used for startTime and expiryTime formatting.\n\tstTimeFormat string\n\tseTimeFormat string\n}\n\n// AuthorizedObjectID returns authorizedObjectID.\nfunc (p *QueryParameters) AuthorizedObjectID() string {\n\treturn p.authorizedObjectID\n}\n\n// UnauthorizedObjectID returns unauthorizedObjectID.\nfunc (p *QueryParameters) UnauthorizedObjectID() string {\n\treturn p.unauthorizedObjectID\n}\n\n// SignedCorrelationID returns signedCorrelationID.\nfunc (p *QueryParameters) SignedCorrelationID() string {\n\treturn p.correlationID\n}\n\n// EncryptionScope returns encryptionScope\nfunc (p *QueryParameters) EncryptionScope() string {\n\treturn p.encryptionScope\n}\n\n// SignedOID returns signedOID.\nfunc (p *QueryParameters) SignedOID() string {\n\treturn p.signedOID\n}\n\n// SignedTID returns signedTID.\nfunc (p *QueryParameters) SignedTID() string {\n\treturn p.signedTID\n}\n\n// SignedStart returns signedStart.\nfunc (p *QueryParameters) SignedStart() time.Time {\n\treturn p.signedStart\n}\n\n// SignedExpiry returns signedExpiry.\nfunc (p *QueryParameters) SignedExpiry() time.Time {\n\treturn p.signedExpiry\n}\n\n// SignedService returns signedService.\nfunc (p *QueryParameters) SignedService() string {\n\treturn p.signedService\n}\n\n// SignedVersion returns signedVersion.\nfunc (p *QueryParameters) SignedVersion() string {\n\treturn p.signedVersion\n}\n\n// SnapshotTime returns snapshotTime.\nfunc (p *QueryParameters) SnapshotTime() time.Time {\n\treturn p.snapshotTime\n}\n\n// Version returns version.\nfunc (p *QueryParameters) Version() string {\n\treturn p.version\n}\n\n// Services returns services.\nfunc (p *QueryParameters) Services() string {\n\treturn p.services\n}\n\n// ResourceTypes returns resourceTypes.\nfunc (p *QueryParameters) ResourceTypes() string {\n\treturn p.resourceTypes\n}\n\n// Protocol returns protocol.\nfunc (p *QueryParameters) Protocol() Protocol {\n\treturn p.protocol\n}\n\n// StartTime returns startTime.\nfunc (p *QueryParameters) StartTime() time.Time {\n\treturn p.startTime\n}\n\n// ExpiryTime returns expiryTime.\nfunc (p *QueryParameters) ExpiryTime() time.Time {\n\treturn p.expiryTime\n}\n\n// IPRange returns ipRange.\nfunc (p *QueryParameters) IPRange() IPRange {\n\treturn p.ipRange\n}\n\n// Identifier returns identifier.\nfunc (p *QueryParameters) Identifier() string {\n\treturn p.identifier\n}\n\n// Resource returns resource.\nfunc (p *QueryParameters) Resource() string {\n\treturn p.resource\n}\n\n// Permissions returns permissions.\nfunc (p *QueryParameters) Permissions() string {\n\treturn p.permissions\n}\n\n// Signature returns signature.\nfunc (p *QueryParameters) Signature() string {\n\treturn p.signature\n}\n\n// CacheControl returns cacheControl.\nfunc (p *QueryParameters) CacheControl() string {\n\treturn p.cacheControl\n}\n\n// ContentDisposition returns contentDisposition.\nfunc (p *QueryParameters) ContentDisposition() string {\n\treturn p.contentDisposition\n}\n\n// ContentEncoding returns contentEncoding.\nfunc (p *QueryParameters) ContentEncoding() string {\n\treturn p.contentEncoding\n}\n\n// ContentLanguage returns contentLanguage.\nfunc (p *QueryParameters) ContentLanguage() string {\n\treturn p.contentLanguage\n}\n\n// ContentType returns contentType.\nfunc (p *QueryParameters) ContentType() string {\n\treturn p.contentType\n}\n\n// SignedDirectoryDepth returns signedDirectoryDepth.\nfunc (p *QueryParameters) SignedDirectoryDepth() string {\n\treturn p.signedDirectoryDepth\n}\n\n// Encode encodes the SAS query parameters into URL encoded form sorted by key.\nfunc (p *QueryParameters) Encode() string {\n\tv := url.Values{}\n\n\tif p.version != \"\" {\n\t\tv.Add(\"sv\", p.version)\n\t}\n\tif p.services != \"\" {\n\t\tv.Add(\"ss\", p.services)\n\t}\n\tif p.resourceTypes != \"\" {\n\t\tv.Add(\"srt\", p.resourceTypes)\n\t}\n\tif p.protocol != \"\" {\n\t\tv.Add(\"spr\", string(p.protocol))\n\t}\n\tif !p.startTime.IsZero() {\n\t\tv.Add(\"st\", formatTime(&(p.startTime), p.stTimeFormat))\n\t}\n\tif !p.expiryTime.IsZero() {\n\t\tv.Add(\"se\", formatTime(&(p.expiryTime), p.seTimeFormat))\n\t}\n\tif len(p.ipRange.Start) > 0 {\n\t\tv.Add(\"sip\", p.ipRange.String())\n\t}\n\tif p.identifier != \"\" {\n\t\tv.Add(\"si\", p.identifier)\n\t}\n\tif p.resource != \"\" {\n\t\tv.Add(\"sr\", p.resource)\n\t}\n\tif p.permissions != \"\" {\n\t\tv.Add(\"sp\", p.permissions)\n\t}\n\tif p.signedOID != \"\" {\n\t\tv.Add(\"skoid\", p.signedOID)\n\t\tv.Add(\"sktid\", p.signedTID)\n\t\tv.Add(\"skt\", p.signedStart.Format(TimeFormat))\n\t\tv.Add(\"ske\", p.signedExpiry.Format(TimeFormat))\n\t\tv.Add(\"sks\", p.signedService)\n\t\tv.Add(\"skv\", p.signedVersion)\n\t}\n\tif p.signature != \"\" {\n\t\tv.Add(\"sig\", p.signature)\n\t}\n\tif p.cacheControl != \"\" {\n\t\tv.Add(\"rscc\", p.cacheControl)\n\t}\n\tif p.contentDisposition != \"\" {\n\t\tv.Add(\"rscd\", p.contentDisposition)\n\t}\n\tif p.contentEncoding != \"\" {\n\t\tv.Add(\"rsce\", p.contentEncoding)\n\t}\n\tif p.contentLanguage != \"\" {\n\t\tv.Add(\"rscl\", p.contentLanguage)\n\t}\n\tif p.contentType != \"\" {\n\t\tv.Add(\"rsct\", p.contentType)\n\t}\n\tif p.signedDirectoryDepth != \"\" {\n\t\tv.Add(\"sdd\", p.signedDirectoryDepth)\n\t}\n\tif p.authorizedObjectID != \"\" {\n\t\tv.Add(\"saoid\", p.authorizedObjectID)\n\t}\n\tif p.unauthorizedObjectID != \"\" {\n\t\tv.Add(\"suoid\", p.unauthorizedObjectID)\n\t}\n\tif p.correlationID != \"\" {\n\t\tv.Add(\"scid\", p.correlationID)\n\t}\n\tif p.encryptionScope != \"\" {\n\t\tv.Add(\"ses\", p.encryptionScope)\n\t}\n\n\treturn v.Encode()\n}\n\n// NewQueryParameters creates and initializes a QueryParameters object based on the\n// query parameter map's passed-in values. If deleteSASParametersFromValues is true,\n// all SAS-related query parameters are removed from the passed-in map. If\n// deleteSASParametersFromValues is false, the map passed-in map is unaltered.\nfunc NewQueryParameters(values url.Values, deleteSASParametersFromValues bool) QueryParameters {\n\tp := QueryParameters{}\n\tfor k, v := range values {\n\t\tval := v[0]\n\t\tisSASKey := true\n\t\tswitch strings.ToLower(k) {\n\t\tcase \"sv\":\n\t\t\tp.version = val\n\t\tcase \"ss\":\n\t\t\tp.services = val\n\t\tcase \"srt\":\n\t\t\tp.resourceTypes = val\n\t\tcase \"spr\":\n\t\t\tp.protocol = Protocol(val)\n\t\tcase \"snapshot\":\n\t\t\tp.snapshotTime, _ = time.Parse(exported.SnapshotTimeFormat, val)\n\t\tcase \"st\":\n\t\t\tp.startTime, p.stTimeFormat, _ = parseTime(val)\n\t\tcase \"se\":\n\t\t\tp.expiryTime, p.seTimeFormat, _ = parseTime(val)\n\t\tcase \"sip\":\n\t\t\tdashIndex := strings.Index(val, \"-\")\n\t\t\tif dashIndex == -1 {\n\t\t\t\tp.ipRange.Start = net.ParseIP(val)\n\t\t\t} else {\n\t\t\t\tp.ipRange.Start = net.ParseIP(val[:dashIndex])\n\t\t\t\tp.ipRange.End = net.ParseIP(val[dashIndex+1:])\n\t\t\t}\n\t\tcase \"si\":\n\t\t\tp.identifier = val\n\t\tcase \"sr\":\n\t\t\tp.resource = val\n\t\tcase \"sp\":\n\t\t\tp.permissions = val\n\t\tcase \"sig\":\n\t\t\tp.signature = val\n\t\tcase \"rscc\":\n\t\t\tp.cacheControl = val\n\t\tcase \"rscd\":\n\t\t\tp.contentDisposition = val\n\t\tcase \"rsce\":\n\t\t\tp.contentEncoding = val\n\t\tcase \"rscl\":\n\t\t\tp.contentLanguage = val\n\t\tcase \"rsct\":\n\t\t\tp.contentType = val\n\t\tcase \"skoid\":\n\t\t\tp.signedOID = val\n\t\tcase \"sktid\":\n\t\t\tp.signedTID = val\n\t\tcase \"skt\":\n\t\t\tp.signedStart, _ = time.Parse(TimeFormat, val)\n\t\tcase \"ske\":\n\t\t\tp.signedExpiry, _ = time.Parse(TimeFormat, val)\n\t\tcase \"sks\":\n\t\t\tp.signedService = val\n\t\tcase \"skv\":\n\t\t\tp.signedVersion = val\n\t\tcase \"sdd\":\n\t\t\tp.signedDirectoryDepth = val\n\t\tcase \"saoid\":\n\t\t\tp.authorizedObjectID = val\n\t\tcase \"suoid\":\n\t\t\tp.unauthorizedObjectID = val\n\t\tcase \"scid\":\n\t\t\tp.correlationID = val\n\t\tcase \"ses\":\n\t\t\tp.encryptionScope = val\n\t\tdefault:\n\t\t\tisSASKey = false // We didn't recognize the query parameter\n\t\t}\n\t\tif isSASKey && deleteSASParametersFromValues {\n\t\t\tdelete(values, k)\n\t\t}\n\t}\n\treturn p\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas/service.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\npackage sas\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n)\n\n// BlobSignatureValues is used to generate a Shared Access Signature (SAS) for an Azure Storage container or blob.\n// For more information on creating service sas, see https://docs.microsoft.com/rest/api/storageservices/constructing-a-service-sas\n// For more information on creating user delegation sas, see https://docs.microsoft.com/rest/api/storageservices/create-user-delegation-sas\ntype BlobSignatureValues struct {\n\tVersion              string    `param:\"sv\"`  // If not specified, this defaults to Version\n\tProtocol             Protocol  `param:\"spr\"` // See the Protocol* constants\n\tStartTime            time.Time `param:\"st\"`  // Not specified if IsZero\n\tExpiryTime           time.Time `param:\"se\"`  // Not specified if IsZero\n\tSnapshotTime         time.Time\n\tPermissions          string  `param:\"sp\"` // Create by initializing ContainerPermissions or BlobPermissions and then call String()\n\tIPRange              IPRange `param:\"sip\"`\n\tIdentifier           string  `param:\"si\"`\n\tContainerName        string\n\tBlobName             string // Use \"\" to create a Container SAS\n\tDirectory            string // Not nil for a directory SAS (ie sr=d)\n\tCacheControl         string // rscc\n\tContentDisposition   string // rscd\n\tContentEncoding      string // rsce\n\tContentLanguage      string // rscl\n\tContentType          string // rsct\n\tBlobVersion          string // sr=bv\n\tAuthorizedObjectID   string // saoid\n\tUnauthorizedObjectID string // suoid\n\tCorrelationID        string // scid\n\tEncryptionScope      string `param:\"ses\"`\n}\n\nfunc getDirectoryDepth(path string) string {\n\tif path == \"\" {\n\t\treturn \"\"\n\t}\n\treturn fmt.Sprint(strings.Count(path, \"/\") + 1)\n}\n\n// SignWithSharedKey uses an account's SharedKeyCredential to sign this signature values to produce the proper SAS query parameters.\nfunc (v BlobSignatureValues) SignWithSharedKey(sharedKeyCredential *SharedKeyCredential) (QueryParameters, error) {\n\tif v.Identifier == \"\" && (v.ExpiryTime.IsZero() || v.Permissions == \"\") {\n\t\treturn QueryParameters{}, errors.New(\"service SAS is missing at least one of these: ExpiryTime or Permissions\")\n\t}\n\n\t// Parse the resource\n\tresource := \"c\"\n\tif !v.SnapshotTime.IsZero() {\n\t\tresource = \"bs\"\n\t} else if v.BlobVersion != \"\" {\n\t\tresource = \"bv\"\n\t} else if v.Directory != \"\" {\n\t\tresource = \"d\"\n\t\tv.BlobName = \"\"\n\t} else if v.BlobName == \"\" {\n\t\t// do nothing\n\t} else {\n\t\tresource = \"b\"\n\t}\n\n\t// make sure the permission characters are in the correct order\n\tif resource == \"c\" {\n\t\tperms, err := parseContainerPermissions(v.Permissions)\n\t\tif err != nil {\n\t\t\treturn QueryParameters{}, err\n\t\t}\n\t\tv.Permissions = perms.String()\n\t} else {\n\t\tperms, err := parseBlobPermissions(v.Permissions)\n\t\tif err != nil {\n\t\t\treturn QueryParameters{}, err\n\t\t}\n\t\tv.Permissions = perms.String()\n\t}\n\n\tif v.Version == \"\" {\n\t\tv.Version = Version\n\t}\n\tstartTime, expiryTime, snapshotTime := formatTimesForSigning(v.StartTime, v.ExpiryTime, v.SnapshotTime)\n\n\tsignedIdentifier := v.Identifier\n\n\t// String to sign: http://msdn.microsoft.com/en-us/library/azure/dn140255.aspx\n\tstringToSign := strings.Join([]string{\n\t\tv.Permissions,\n\t\tstartTime,\n\t\texpiryTime,\n\t\tgetCanonicalName(sharedKeyCredential.AccountName(), v.ContainerName, v.BlobName, v.Directory),\n\t\tsignedIdentifier,\n\t\tv.IPRange.String(),\n\t\tstring(v.Protocol),\n\t\tv.Version,\n\t\tresource,\n\t\tsnapshotTime, // signed timestamp\n\t\tv.EncryptionScope,\n\t\tv.CacheControl,       // rscc\n\t\tv.ContentDisposition, // rscd\n\t\tv.ContentEncoding,    // rsce\n\t\tv.ContentLanguage,    // rscl\n\t\tv.ContentType},       // rsct\n\t\t\"\\n\")\n\n\tsignature, err := exported.ComputeHMACSHA256(sharedKeyCredential, stringToSign)\n\tif err != nil {\n\t\treturn QueryParameters{}, err\n\t}\n\n\tp := QueryParameters{\n\t\t// Common SAS parameters\n\t\tversion:         v.Version,\n\t\tprotocol:        v.Protocol,\n\t\tstartTime:       v.StartTime,\n\t\texpiryTime:      v.ExpiryTime,\n\t\tpermissions:     v.Permissions,\n\t\tipRange:         v.IPRange,\n\t\tencryptionScope: v.EncryptionScope,\n\n\t\t// Container/Blob-specific SAS parameters\n\t\tresource:             resource,\n\t\tidentifier:           v.Identifier,\n\t\tcacheControl:         v.CacheControl,\n\t\tcontentDisposition:   v.ContentDisposition,\n\t\tcontentEncoding:      v.ContentEncoding,\n\t\tcontentLanguage:      v.ContentLanguage,\n\t\tcontentType:          v.ContentType,\n\t\tsnapshotTime:         v.SnapshotTime,\n\t\tsignedDirectoryDepth: getDirectoryDepth(v.Directory),\n\t\tauthorizedObjectID:   v.AuthorizedObjectID,\n\t\tunauthorizedObjectID: v.UnauthorizedObjectID,\n\t\tcorrelationID:        v.CorrelationID,\n\t\t// Calculated SAS signature\n\t\tsignature: signature,\n\t}\n\n\treturn p, nil\n}\n\n// SignWithUserDelegation uses an account's UserDelegationCredential to sign this signature values to produce the proper SAS query parameters.\nfunc (v BlobSignatureValues) SignWithUserDelegation(userDelegationCredential *UserDelegationCredential) (QueryParameters, error) {\n\tif userDelegationCredential == nil {\n\t\treturn QueryParameters{}, fmt.Errorf(\"cannot sign SAS query without User Delegation Key\")\n\t}\n\n\tif v.ExpiryTime.IsZero() || v.Permissions == \"\" {\n\t\treturn QueryParameters{}, errors.New(\"user delegation SAS is missing at least one of these: ExpiryTime or Permissions\")\n\t}\n\n\t// Parse the resource\n\tresource := \"c\"\n\tif !v.SnapshotTime.IsZero() {\n\t\tresource = \"bs\"\n\t} else if v.BlobVersion != \"\" {\n\t\tresource = \"bv\"\n\t} else if v.Directory != \"\" {\n\t\tresource = \"d\"\n\t\tv.BlobName = \"\"\n\t} else if v.BlobName == \"\" {\n\t\t// do nothing\n\t} else {\n\t\tresource = \"b\"\n\t}\n\t// make sure the permission characters are in the correct order\n\tif resource == \"c\" {\n\t\tperms, err := parseContainerPermissions(v.Permissions)\n\t\tif err != nil {\n\t\t\treturn QueryParameters{}, err\n\t\t}\n\t\tv.Permissions = perms.String()\n\t} else {\n\t\tperms, err := parseBlobPermissions(v.Permissions)\n\t\tif err != nil {\n\t\t\treturn QueryParameters{}, err\n\t\t}\n\t\tv.Permissions = perms.String()\n\t}\n\n\tif v.Version == \"\" {\n\t\tv.Version = Version\n\t}\n\tstartTime, expiryTime, snapshotTime := formatTimesForSigning(v.StartTime, v.ExpiryTime, v.SnapshotTime)\n\n\tudk := exported.GetUDKParams(userDelegationCredential)\n\n\tudkStart, udkExpiry, _ := formatTimesForSigning(*udk.SignedStart, *udk.SignedExpiry, time.Time{})\n\n\tstringToSign := strings.Join([]string{\n\t\tv.Permissions,\n\t\tstartTime,\n\t\texpiryTime,\n\t\tgetCanonicalName(exported.GetAccountName(userDelegationCredential), v.ContainerName, v.BlobName, v.Directory),\n\t\t*udk.SignedOID,\n\t\t*udk.SignedTID,\n\t\tudkStart,\n\t\tudkExpiry,\n\t\t*udk.SignedService,\n\t\t*udk.SignedVersion,\n\t\tv.AuthorizedObjectID,\n\t\tv.UnauthorizedObjectID,\n\t\tv.CorrelationID,\n\t\tv.IPRange.String(),\n\t\tstring(v.Protocol),\n\t\tv.Version,\n\t\tresource,\n\t\tsnapshotTime, // signed timestamp\n\t\tv.EncryptionScope,\n\t\tv.CacheControl,       // rscc\n\t\tv.ContentDisposition, // rscd\n\t\tv.ContentEncoding,    // rsce\n\t\tv.ContentLanguage,    // rscl\n\t\tv.ContentType},       // rsct\n\t\t\"\\n\")\n\n\tsignature, err := exported.ComputeUDCHMACSHA256(userDelegationCredential, stringToSign)\n\tif err != nil {\n\t\treturn QueryParameters{}, err\n\t}\n\n\tp := QueryParameters{\n\t\t// Common SAS parameters\n\t\tversion:         v.Version,\n\t\tprotocol:        v.Protocol,\n\t\tstartTime:       v.StartTime,\n\t\texpiryTime:      v.ExpiryTime,\n\t\tpermissions:     v.Permissions,\n\t\tipRange:         v.IPRange,\n\t\tencryptionScope: v.EncryptionScope,\n\n\t\t// Container/Blob-specific SAS parameters\n\t\tresource:             resource,\n\t\tidentifier:           v.Identifier,\n\t\tcacheControl:         v.CacheControl,\n\t\tcontentDisposition:   v.ContentDisposition,\n\t\tcontentEncoding:      v.ContentEncoding,\n\t\tcontentLanguage:      v.ContentLanguage,\n\t\tcontentType:          v.ContentType,\n\t\tsnapshotTime:         v.SnapshotTime,\n\t\tsignedDirectoryDepth: getDirectoryDepth(v.Directory),\n\t\tauthorizedObjectID:   v.AuthorizedObjectID,\n\t\tunauthorizedObjectID: v.UnauthorizedObjectID,\n\t\tcorrelationID:        v.CorrelationID,\n\t\t// Calculated SAS signature\n\t\tsignature: signature,\n\t}\n\n\t// User delegation SAS specific parameters\n\tp.signedOID = *udk.SignedOID\n\tp.signedTID = *udk.SignedTID\n\tp.signedStart = *udk.SignedStart\n\tp.signedExpiry = *udk.SignedExpiry\n\tp.signedService = *udk.SignedService\n\tp.signedVersion = *udk.SignedVersion\n\n\treturn p, nil\n}\n\n// getCanonicalName computes the canonical name for a container or blob resource for SAS signing.\nfunc getCanonicalName(account string, containerName string, blobName string, directoryName string) string {\n\t// Container: \"/blob/account/containername\"\n\t// Blob:      \"/blob/account/containername/blobname\"\n\telements := []string{\"/blob/\", account, \"/\", containerName}\n\tif blobName != \"\" {\n\t\telements = append(elements, \"/\", strings.ReplaceAll(blobName, \"\\\\\", \"/\"))\n\t} else if directoryName != \"\" {\n\t\telements = append(elements, \"/\", directoryName)\n\t}\n\treturn strings.Join(elements, \"\")\n}\n\n// ContainerPermissions type simplifies creating the permissions string for an Azure Storage container SAS.\n// Initialize an instance of this type and then call its String method to set BlobSignatureValues' Permissions field.\n// All permissions descriptions can be found here: https://docs.microsoft.com/en-us/rest/api/storageservices/create-service-sas#permissions-for-a-directory-container-or-blob\ntype ContainerPermissions struct {\n\tRead, Add, Create, Write, Delete, DeletePreviousVersion, List, Tag, FilterByTags, Move, SetImmutabilityPolicy bool\n\tExecute, ModifyOwnership, ModifyPermissions                                                                   bool // Meant for hierarchical namespace accounts\n}\n\n// String produces the SAS permissions string for an Azure Storage container.\n// Call this method to set BlobSignatureValues' Permissions field.\nfunc (p *ContainerPermissions) String() string {\n\tvar b bytes.Buffer\n\tif p.Read {\n\t\tb.WriteRune('r')\n\t}\n\tif p.Add {\n\t\tb.WriteRune('a')\n\t}\n\tif p.Create {\n\t\tb.WriteRune('c')\n\t}\n\tif p.Write {\n\t\tb.WriteRune('w')\n\t}\n\tif p.Delete {\n\t\tb.WriteRune('d')\n\t}\n\tif p.DeletePreviousVersion {\n\t\tb.WriteRune('x')\n\t}\n\tif p.List {\n\t\tb.WriteRune('l')\n\t}\n\tif p.Tag {\n\t\tb.WriteRune('t')\n\t}\n\tif p.FilterByTags {\n\t\tb.WriteRune('f')\n\t}\n\tif p.Move {\n\t\tb.WriteRune('m')\n\t}\n\tif p.Execute {\n\t\tb.WriteRune('e')\n\t}\n\tif p.ModifyOwnership {\n\t\tb.WriteRune('o')\n\t}\n\tif p.ModifyPermissions {\n\t\tb.WriteRune('p')\n\t}\n\tif p.SetImmutabilityPolicy {\n\t\tb.WriteRune('i')\n\t}\n\treturn b.String()\n}\n\n// Parse initializes ContainerPermissions' fields from a string.\nfunc parseContainerPermissions(s string) (ContainerPermissions, error) {\n\tp := ContainerPermissions{} // Clear the flags\n\tfor _, r := range s {\n\t\tswitch r {\n\t\tcase 'r':\n\t\t\tp.Read = true\n\t\tcase 'a':\n\t\t\tp.Add = true\n\t\tcase 'c':\n\t\t\tp.Create = true\n\t\tcase 'w':\n\t\t\tp.Write = true\n\t\tcase 'd':\n\t\t\tp.Delete = true\n\t\tcase 'x':\n\t\t\tp.DeletePreviousVersion = true\n\t\tcase 'l':\n\t\t\tp.List = true\n\t\tcase 't':\n\t\t\tp.Tag = true\n\t\tcase 'f':\n\t\t\tp.FilterByTags = true\n\t\tcase 'm':\n\t\t\tp.Move = true\n\t\tcase 'e':\n\t\t\tp.Execute = true\n\t\tcase 'o':\n\t\t\tp.ModifyOwnership = true\n\t\tcase 'p':\n\t\t\tp.ModifyPermissions = true\n\t\tcase 'i':\n\t\t\tp.SetImmutabilityPolicy = true\n\t\tdefault:\n\t\t\treturn ContainerPermissions{}, fmt.Errorf(\"invalid permission: '%v'\", r)\n\t\t}\n\t}\n\treturn p, nil\n}\n\n// BlobPermissions type simplifies creating the permissions string for an Azure Storage blob SAS.\n// Initialize an instance of this type and then call its String method to set BlobSignatureValues' Permissions field.\ntype BlobPermissions struct {\n\tRead, Add, Create, Write, Delete, DeletePreviousVersion, PermanentDelete, List, Tag, Move, Execute, Ownership, Permissions, SetImmutabilityPolicy bool\n}\n\n// String produces the SAS permissions string for an Azure Storage blob.\n// Call this method to set BlobSignatureValues' Permissions field.\nfunc (p *BlobPermissions) String() string {\n\tvar b bytes.Buffer\n\tif p.Read {\n\t\tb.WriteRune('r')\n\t}\n\tif p.Add {\n\t\tb.WriteRune('a')\n\t}\n\tif p.Create {\n\t\tb.WriteRune('c')\n\t}\n\tif p.Write {\n\t\tb.WriteRune('w')\n\t}\n\tif p.Delete {\n\t\tb.WriteRune('d')\n\t}\n\tif p.DeletePreviousVersion {\n\t\tb.WriteRune('x')\n\t}\n\tif p.PermanentDelete {\n\t\tb.WriteRune('y')\n\t}\n\tif p.List {\n\t\tb.WriteRune('l')\n\t}\n\tif p.Tag {\n\t\tb.WriteRune('t')\n\t}\n\tif p.Move {\n\t\tb.WriteRune('m')\n\t}\n\tif p.Execute {\n\t\tb.WriteRune('e')\n\t}\n\tif p.Ownership {\n\t\tb.WriteRune('o')\n\t}\n\tif p.Permissions {\n\t\tb.WriteRune('p')\n\t}\n\tif p.SetImmutabilityPolicy {\n\t\tb.WriteRune('i')\n\t}\n\treturn b.String()\n}\n\n// Parse initializes BlobPermissions' fields from a string.\nfunc parseBlobPermissions(s string) (BlobPermissions, error) {\n\tp := BlobPermissions{} // Clear the flags\n\tfor _, r := range s {\n\t\tswitch r {\n\t\tcase 'r':\n\t\t\tp.Read = true\n\t\tcase 'a':\n\t\t\tp.Add = true\n\t\tcase 'c':\n\t\t\tp.Create = true\n\t\tcase 'w':\n\t\t\tp.Write = true\n\t\tcase 'd':\n\t\t\tp.Delete = true\n\t\tcase 'x':\n\t\t\tp.DeletePreviousVersion = true\n\t\tcase 'y':\n\t\t\tp.PermanentDelete = true\n\t\tcase 'l':\n\t\t\tp.List = true\n\t\tcase 't':\n\t\t\tp.Tag = true\n\t\tcase 'm':\n\t\t\tp.Move = true\n\t\tcase 'e':\n\t\t\tp.Execute = true\n\t\tcase 'o':\n\t\t\tp.Ownership = true\n\t\tcase 'p':\n\t\t\tp.Permissions = true\n\t\tcase 'i':\n\t\t\tp.SetImmutabilityPolicy = true\n\t\tdefault:\n\t\t\treturn BlobPermissions{}, fmt.Errorf(\"invalid permission: '%v'\", r)\n\t\t}\n\t}\n\treturn p, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas/url_parts.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage sas\n\nimport (\n\t\"net/url\"\n\t\"strings\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared\"\n)\n\nconst (\n\tsnapshot  = \"snapshot\"\n\tversionId = \"versionid\"\n)\n\n// IPEndpointStyleInfo is used for IP endpoint style URL when working with Azure storage emulator.\n// Ex: \"https://10.132.141.33/accountname/containername\"\ntype IPEndpointStyleInfo struct {\n\tAccountName string // \"\" if not using IP endpoint style\n}\n\n// URLParts object represents the components that make up an Azure Storage Container/Blob URL.\n// NOTE: Changing any SAS-related field requires computing a new SAS signature.\ntype URLParts struct {\n\tScheme              string // Ex: \"https://\"\n\tHost                string // Ex: \"account.blob.core.windows.net\", \"10.132.141.33\", \"10.132.141.33:80\"\n\tIPEndpointStyleInfo IPEndpointStyleInfo\n\tContainerName       string // \"\" if no container\n\tBlobName            string // \"\" if no blob\n\tSnapshot            string // \"\" if not a snapshot\n\tSAS                 QueryParameters\n\tUnparsedParams      string\n\tVersionID           string // \"\" if not versioning enabled\n}\n\n// ParseURL parses a URL initializing URLParts' fields including any SAS-related & snapshot query parameters.\n// Any other query parameters remain in the UnparsedParams field.\nfunc ParseURL(u string) (URLParts, error) {\n\turi, err := url.Parse(u)\n\tif err != nil {\n\t\treturn URLParts{}, err\n\t}\n\n\tup := URLParts{\n\t\tScheme: uri.Scheme,\n\t\tHost:   uri.Host,\n\t}\n\n\t// Find the container & blob names (if any)\n\tif uri.Path != \"\" {\n\t\tpath := uri.Path\n\t\tif path[0] == '/' {\n\t\t\tpath = path[1:] // If path starts with a slash, remove it\n\t\t}\n\t\tif shared.IsIPEndpointStyle(up.Host) {\n\t\t\tif accountEndIndex := strings.Index(path, \"/\"); accountEndIndex == -1 { // Slash not found; path has account name & no container name or blob\n\t\t\t\tup.IPEndpointStyleInfo.AccountName = path\n\t\t\t\tpath = \"\" // No ContainerName present in the URL so path should be empty\n\t\t\t} else {\n\t\t\t\tup.IPEndpointStyleInfo.AccountName = path[:accountEndIndex] // The account name is the part between the slashes\n\t\t\t\tpath = path[accountEndIndex+1:]                             // path refers to portion after the account name now (container & blob names)\n\t\t\t}\n\t\t}\n\n\t\tcontainerEndIndex := strings.Index(path, \"/\") // Find the next slash (if it exists)\n\t\tif containerEndIndex == -1 {                  // Slash not found; path has container name & no blob name\n\t\t\tup.ContainerName = path\n\t\t} else {\n\t\t\tup.ContainerName = path[:containerEndIndex] // The container name is the part between the slashes\n\t\t\tup.BlobName = path[containerEndIndex+1:]    // The blob name is after the container slash\n\t\t}\n\t}\n\n\t// Convert the query parameters to a case-sensitive map & trim whitespace\n\tparamsMap := uri.Query()\n\n\tup.Snapshot = \"\" // Assume no snapshot\n\tif snapshotStr, ok := caseInsensitiveValues(paramsMap).Get(snapshot); ok {\n\t\tup.Snapshot = snapshotStr[0]\n\t\t// If we recognized the query parameter, remove it from the map\n\t\tdelete(paramsMap, snapshot)\n\t}\n\n\tup.VersionID = \"\" // Assume no versionID\n\tif versionIDs, ok := caseInsensitiveValues(paramsMap).Get(versionId); ok {\n\t\tup.VersionID = versionIDs[0]\n\t\t// If we recognized the query parameter, remove it from the map\n\t\tdelete(paramsMap, versionId)   // delete \"versionid\" from paramsMap\n\t\tdelete(paramsMap, \"versionId\") // delete \"versionId\" from paramsMap\n\t}\n\n\tup.SAS = NewQueryParameters(paramsMap, true)\n\tup.UnparsedParams = paramsMap.Encode()\n\treturn up, nil\n}\n\n// String returns a URL object whose fields are initialized from the URLParts fields. The URL's RawQuery\n// field contains the SAS, snapshot, and unparsed query parameters.\nfunc (up URLParts) String() string {\n\tpath := \"\"\n\tif shared.IsIPEndpointStyle(up.Host) && up.IPEndpointStyleInfo.AccountName != \"\" {\n\t\tpath += \"/\" + up.IPEndpointStyleInfo.AccountName\n\t}\n\t// Concatenate container & blob names (if they exist)\n\tif up.ContainerName != \"\" {\n\t\tpath += \"/\" + up.ContainerName\n\t\tif up.BlobName != \"\" {\n\t\t\tpath += \"/\" + up.BlobName\n\t\t}\n\t}\n\n\trawQuery := up.UnparsedParams\n\n\t// If no snapshot is initially provided, fill it in from the SAS query properties to help the user\n\tif up.Snapshot == \"\" && !up.SAS.SnapshotTime().IsZero() {\n\t\tup.Snapshot = up.SAS.SnapshotTime().Format(exported.SnapshotTimeFormat)\n\t}\n\n\t// Concatenate blob version id query parameter (if it exists)\n\tif up.VersionID != \"\" {\n\t\tif len(rawQuery) > 0 {\n\t\t\trawQuery += \"&\"\n\t\t}\n\t\trawQuery += versionId + \"=\" + up.VersionID\n\t}\n\n\t// Concatenate blob snapshot query parameter (if it exists)\n\tif up.Snapshot != \"\" {\n\t\tif len(rawQuery) > 0 {\n\t\t\trawQuery += \"&\"\n\t\t}\n\t\trawQuery += snapshot + \"=\" + up.Snapshot\n\t}\n\tsas := up.SAS.Encode()\n\tif sas != \"\" {\n\t\tif len(rawQuery) > 0 {\n\t\t\trawQuery += \"&\"\n\t\t}\n\t\trawQuery += sas\n\t}\n\tu := url.URL{\n\t\tScheme:   up.Scheme,\n\t\tHost:     up.Host,\n\t\tPath:     path,\n\t\tRawQuery: rawQuery,\n\t}\n\treturn u.String()\n}\n\ntype caseInsensitiveValues url.Values // map[string][]string\n\nfunc (values caseInsensitiveValues) Get(key string) ([]string, bool) {\n\tkey = strings.ToLower(key)\n\tfor k, v := range values {\n\t\tif strings.ToLower(k) == key {\n\t\t\treturn v, true\n\t\t}\n\t}\n\treturn []string{}, false\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/service/batch_builder.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage service\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/url\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n)\n\n// BatchBuilder is used for creating the batch operations list. It contains the list of either delete or set tier sub-requests.\n// NOTE: All sub-requests in the batch must be of the same type, either delete or set tier.\ntype BatchBuilder struct {\n\tendpoint      string\n\tauthPolicy    policy.Policy\n\tsubRequests   []*policy.Request\n\toperationType *exported.BlobBatchOperationType\n}\n\nfunc (bb *BatchBuilder) checkOperationType(operationType exported.BlobBatchOperationType) error {\n\tif bb.operationType == nil {\n\t\tbb.operationType = &operationType\n\t\treturn nil\n\t}\n\tif *bb.operationType != operationType {\n\t\treturn fmt.Errorf(\"BlobBatch only supports one operation type per batch and is already being used for %s operations\", *bb.operationType)\n\t}\n\treturn nil\n}\n\n// Delete operation is used to add delete sub-request to the batch builder.\nfunc (bb *BatchBuilder) Delete(containerName string, blobName string, options *BatchDeleteOptions) error {\n\terr := bb.checkOperationType(exported.BatchDeleteOperationType)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tblobName = url.PathEscape(blobName)\n\tblobURL := runtime.JoinPaths(bb.endpoint, containerName, blobName)\n\n\tblobClient, err := blob.NewClientWithNoCredential(blobURL, nil)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdeleteOptions, leaseInfo, accessConditions := options.format()\n\treq, err := getGeneratedBlobClient(blobClient).DeleteCreateRequest(context.TODO(), deleteOptions, leaseInfo, accessConditions)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// remove x-ms-version header\n\texported.UpdateSubRequestHeaders(req)\n\n\tbb.subRequests = append(bb.subRequests, req)\n\treturn nil\n}\n\n// SetTier operation is used to add set tier sub-request to the batch builder.\nfunc (bb *BatchBuilder) SetTier(containerName string, blobName string, accessTier blob.AccessTier, options *BatchSetTierOptions) error {\n\terr := bb.checkOperationType(exported.BatchSetTierOperationType)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tblobName = url.PathEscape(blobName)\n\tblobURL := runtime.JoinPaths(bb.endpoint, containerName, blobName)\n\n\tblobClient, err := blob.NewClientWithNoCredential(blobURL, nil)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tsetTierOptions, leaseInfo, accessConditions := options.format()\n\treq, err := getGeneratedBlobClient(blobClient).SetTierCreateRequest(context.TODO(), accessTier, setTierOptions, leaseInfo, accessConditions)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// remove x-ms-version header\n\texported.UpdateSubRequestHeaders(req)\n\n\tbb.subRequests = append(bb.subRequests, req)\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/service/client.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage service\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/bloberror\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/base\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas\"\n)\n\n// ClientOptions contains the optional parameters when creating a Client.\ntype ClientOptions base.ClientOptions\n\n// Client represents a URL to the Azure Blob Storage service allowing you to manipulate blob containers.\ntype Client base.Client[generated.ServiceClient]\n\n// NewClient creates an instance of Client with the specified values.\n//   - serviceURL - the URL of the storage account e.g. https://<account>.blob.core.windows.net/\n//   - cred - an Azure AD credential, typically obtained via the azidentity module\n//   - options - client options; pass nil to accept the default values\nfunc NewClient(serviceURL string, cred azcore.TokenCredential, options *ClientOptions) (*Client, error) {\n\taudience := base.GetAudience((*base.ClientOptions)(options))\n\tconOptions := shared.GetClientOptions(options)\n\tauthPolicy := shared.NewStorageChallengePolicy(cred, audience, conOptions.InsecureAllowCredentialWithHTTP)\n\tplOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}}\n\n\tazClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn (*Client)(base.NewServiceClient(serviceURL, azClient, &cred, (*base.ClientOptions)(conOptions))), nil\n}\n\n// NewClientWithNoCredential creates an instance of Client with the specified values.\n// This is used to anonymously access a storage account or with a shared access signature (SAS) token.\n//   - serviceURL - the URL of the storage account e.g. https://<account>.blob.core.windows.net/?<sas token>\n//   - options - client options; pass nil to accept the default values\nfunc NewClientWithNoCredential(serviceURL string, options *ClientOptions) (*Client, error) {\n\tconOptions := shared.GetClientOptions(options)\n\n\tazClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, runtime.PipelineOptions{}, &conOptions.ClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn (*Client)(base.NewServiceClient(serviceURL, azClient, nil, (*base.ClientOptions)(conOptions))), nil\n}\n\n// NewClientWithSharedKeyCredential creates an instance of Client with the specified values.\n//   - serviceURL - the URL of the storage account e.g. https://<account>.blob.core.windows.net/\n//   - cred - a SharedKeyCredential created with the matching storage account and access key\n//   - options - client options; pass nil to accept the default values\nfunc NewClientWithSharedKeyCredential(serviceURL string, cred *SharedKeyCredential, options *ClientOptions) (*Client, error) {\n\tauthPolicy := exported.NewSharedKeyCredPolicy(cred)\n\tconOptions := shared.GetClientOptions(options)\n\tplOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}}\n\n\tazClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn (*Client)(base.NewServiceClient(serviceURL, azClient, cred, (*base.ClientOptions)(conOptions))), nil\n}\n\n// NewClientFromConnectionString creates an instance of Client with the specified values.\n//   - connectionString - a connection string for the desired storage account\n//   - options - client options; pass nil to accept the default values\nfunc NewClientFromConnectionString(connectionString string, options *ClientOptions) (*Client, error) {\n\tparsed, err := shared.ParseConnectionString(connectionString)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif parsed.AccountKey != \"\" && parsed.AccountName != \"\" {\n\t\tcredential, err := exported.NewSharedKeyCredential(parsed.AccountName, parsed.AccountKey)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn NewClientWithSharedKeyCredential(parsed.ServiceURL, credential, options)\n\t}\n\n\treturn NewClientWithNoCredential(parsed.ServiceURL, options)\n}\n\n// GetUserDelegationCredential obtains a UserDelegationKey object using the base ServiceURL object.\n// OAuth is required for this call, as well as any role that can delegate access to the storage account.\nfunc (s *Client) GetUserDelegationCredential(ctx context.Context, info KeyInfo, o *GetUserDelegationCredentialOptions) (*UserDelegationCredential, error) {\n\turl, err := blob.ParseURL(s.URL())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tgetUserDelegationKeyOptions := o.format()\n\tudk, err := s.generated().GetUserDelegationKey(ctx, info, getUserDelegationKeyOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn exported.NewUserDelegationCredential(strings.Split(url.Host, \".\")[0], udk.UserDelegationKey), nil\n}\n\nfunc (s *Client) generated() *generated.ServiceClient {\n\treturn base.InnerClient((*base.Client[generated.ServiceClient])(s))\n}\n\nfunc (s *Client) sharedKey() *SharedKeyCredential {\n\treturn base.SharedKey((*base.Client[generated.ServiceClient])(s))\n}\n\nfunc (s *Client) credential() any {\n\treturn base.Credential((*base.Client[generated.ServiceClient])(s))\n}\n\n// helper method to return the generated.BlobClient which is used for creating the sub-requests\nfunc getGeneratedBlobClient(b *blob.Client) *generated.BlobClient {\n\treturn base.InnerClient((*base.Client[generated.BlobClient])(b))\n}\n\nfunc (s *Client) getClientOptions() *base.ClientOptions {\n\treturn base.GetClientOptions((*base.Client[generated.ServiceClient])(s))\n}\n\n// URL returns the URL endpoint used by the Client object.\nfunc (s *Client) URL() string {\n\treturn s.generated().Endpoint()\n}\n\n// NewContainerClient creates a new container.Client object by concatenating containerName to the end of\n// this Client's URL. The new container.Client uses the same request policy pipeline as the Client.\nfunc (s *Client) NewContainerClient(containerName string) *container.Client {\n\tcontainerURL := runtime.JoinPaths(s.generated().Endpoint(), containerName)\n\treturn (*container.Client)(base.NewContainerClient(containerURL, s.generated().InternalClient().WithClientName(exported.ModuleName), s.credential(), s.getClientOptions()))\n}\n\n// CreateContainer is a lifecycle method to creates a new container under the specified account.\n// If the container with the same name already exists, a ResourceExistsError will be raised.\n// This method returns a client with which to interact with the newly created container.\nfunc (s *Client) CreateContainer(ctx context.Context, containerName string, options *CreateContainerOptions) (CreateContainerResponse, error) {\n\tcontainerClient := s.NewContainerClient(containerName)\n\tcontainerCreateResp, err := containerClient.Create(ctx, options)\n\treturn containerCreateResp, err\n}\n\n// DeleteContainer is a lifecycle method that marks the specified container for deletion.\n// The container and any blobs contained within it are later deleted during garbage collection.\n// If the container is not found, a ResourceNotFoundError will be raised.\nfunc (s *Client) DeleteContainer(ctx context.Context, containerName string, options *DeleteContainerOptions) (DeleteContainerResponse, error) {\n\tcontainerClient := s.NewContainerClient(containerName)\n\tcontainerDeleteResp, err := containerClient.Delete(ctx, options)\n\treturn containerDeleteResp, err\n}\n\n// RestoreContainer restores soft-deleted container\n// Operation will only be successful if used within the specified number of days set in the delete retention policy\nfunc (s *Client) RestoreContainer(ctx context.Context, deletedContainerName string, deletedContainerVersion string, options *RestoreContainerOptions) (RestoreContainerResponse, error) {\n\tcontainerClient := s.NewContainerClient(deletedContainerName)\n\tcontainerRestoreResp, err := containerClient.Restore(ctx, deletedContainerVersion, options)\n\treturn containerRestoreResp, err\n}\n\n// GetAccountInfo provides account level information\n// For more information, see https://learn.microsoft.com/en-us/rest/api/storageservices/get-account-information?tabs=shared-access-signatures.\nfunc (s *Client) GetAccountInfo(ctx context.Context, o *GetAccountInfoOptions) (GetAccountInfoResponse, error) {\n\tgetAccountInfoOptions := o.format()\n\tresp, err := s.generated().GetAccountInfo(ctx, getAccountInfoOptions)\n\treturn resp, err\n}\n\n// NewListContainersPager operation returns a pager of the containers under the specified account.\n// Use an empty Marker to start enumeration from the beginning. Container names are returned in lexicographic order.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/list-containers2.\nfunc (s *Client) NewListContainersPager(o *ListContainersOptions) *runtime.Pager[ListContainersResponse] {\n\tlistOptions := generated.ServiceClientListContainersSegmentOptions{}\n\tif o != nil {\n\t\tif o.Include.Deleted {\n\t\t\tlistOptions.Include = append(listOptions.Include, generated.ListContainersIncludeTypeDeleted)\n\t\t}\n\t\tif o.Include.Metadata {\n\t\t\tlistOptions.Include = append(listOptions.Include, generated.ListContainersIncludeTypeMetadata)\n\t\t}\n\t\tif o.Include.System {\n\t\t\tlistOptions.Include = append(listOptions.Include, generated.ListContainersIncludeTypeSystem)\n\t\t}\n\t\tlistOptions.Marker = o.Marker\n\t\tlistOptions.Maxresults = o.MaxResults\n\t\tlistOptions.Prefix = o.Prefix\n\t}\n\treturn runtime.NewPager(runtime.PagingHandler[ListContainersResponse]{\n\t\tMore: func(page ListContainersResponse) bool {\n\t\t\treturn page.NextMarker != nil && len(*page.NextMarker) > 0\n\t\t},\n\t\tFetcher: func(ctx context.Context, page *ListContainersResponse) (ListContainersResponse, error) {\n\t\t\tvar req *policy.Request\n\t\t\tvar err error\n\t\t\tif page == nil {\n\t\t\t\treq, err = s.generated().ListContainersSegmentCreateRequest(ctx, &listOptions)\n\t\t\t} else {\n\t\t\t\tlistOptions.Marker = page.NextMarker\n\t\t\t\treq, err = s.generated().ListContainersSegmentCreateRequest(ctx, &listOptions)\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\treturn ListContainersResponse{}, err\n\t\t\t}\n\t\t\tresp, err := s.generated().InternalClient().Pipeline().Do(req)\n\t\t\tif err != nil {\n\t\t\t\treturn ListContainersResponse{}, err\n\t\t\t}\n\t\t\tif !runtime.HasStatusCode(resp, http.StatusOK) {\n\t\t\t\treturn ListContainersResponse{}, runtime.NewResponseError(resp)\n\t\t\t}\n\t\t\treturn s.generated().ListContainersSegmentHandleResponse(resp)\n\t\t},\n\t})\n}\n\n// GetProperties - gets the properties of a storage account's Blob service, including properties for Storage Analytics\n// and CORS (Cross-Origin Resource Sharing) rules.\nfunc (s *Client) GetProperties(ctx context.Context, o *GetPropertiesOptions) (GetPropertiesResponse, error) {\n\tgetPropertiesOptions := o.format()\n\tresp, err := s.generated().GetProperties(ctx, getPropertiesOptions)\n\treturn resp, err\n}\n\n// SetProperties Sets the properties of a storage account's Blob service, including Azure Storage Analytics.\n// If an element (e.g. analytics_logging) is left as None, the existing settings on the service for that functionality are preserved.\nfunc (s *Client) SetProperties(ctx context.Context, o *SetPropertiesOptions) (SetPropertiesResponse, error) {\n\tproperties, setPropertiesOptions := o.format()\n\tresp, err := s.generated().SetProperties(ctx, properties, setPropertiesOptions)\n\treturn resp, err\n}\n\n// GetStatistics Retrieves statistics related to replication for the Blob service.\n// It is only available when read-access geo-redundant replication is enabled for  the storage account.\n// With geo-redundant replication, Azure Storage maintains your data durable\n// in two locations. In both locations, Azure Storage constantly maintains\n// multiple healthy replicas of your data. The location where you read,\n// create, update, or delete data is the primary storage account location.\n// The primary location exists in the region you choose at the time you\n// create an account via the Azure Management Azure classic portal, for\n// example, North Central US. The location to which your data is replicated\n// is the secondary location. The secondary location is automatically\n// determined based on the location of the primary; it is in a second data\n// center that resides in the same region as the primary location. Read-only\n// access is available from the secondary location, if read-access geo-redundant\n// replication is enabled for your storage account.\nfunc (s *Client) GetStatistics(ctx context.Context, o *GetStatisticsOptions) (GetStatisticsResponse, error) {\n\tgetStatisticsOptions := o.format()\n\tresp, err := s.generated().GetStatistics(ctx, getStatisticsOptions)\n\n\treturn resp, err\n}\n\n// GetSASURL is a convenience method for generating a SAS token for the currently pointed at account.\n// It can only be used if the credential supplied during creation was a SharedKeyCredential.\nfunc (s *Client) GetSASURL(resources sas.AccountResourceTypes, permissions sas.AccountPermissions, expiry time.Time, o *GetSASURLOptions) (string, error) {\n\tif s.sharedKey() == nil {\n\t\treturn \"\", bloberror.MissingSharedKeyCredential\n\t}\n\tst := o.format()\n\tqps, err := sas.AccountSignatureValues{\n\t\tVersion:       sas.Version,\n\t\tPermissions:   permissions.String(),\n\t\tResourceTypes: resources.String(),\n\t\tStartTime:     st,\n\t\tExpiryTime:    expiry.UTC(),\n\t}.SignWithSharedKey(s.sharedKey())\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tendpoint := s.URL()\n\tif !strings.HasSuffix(endpoint, \"/\") {\n\t\t// add a trailing slash to be consistent with the portal\n\t\tendpoint += \"/\"\n\t}\n\tendpoint += \"?\" + qps.Encode()\n\n\treturn endpoint, nil\n}\n\n// FilterBlobs operation finds all blobs in the storage account whose tags match a given search expression.\n// Filter blobs searches across all containers within a storage account but can be scoped within the expression to a single container.\n// https://docs.microsoft.com/en-us/rest/api/storageservices/find-blobs-by-tags\n// eg. \"dog='germanshepherd' and penguin='emperorpenguin'\"\n// To specify a container, eg. \"@container=’containerName’ and Name = ‘C’\"\nfunc (s *Client) FilterBlobs(ctx context.Context, where string, o *FilterBlobsOptions) (FilterBlobsResponse, error) {\n\tserviceFilterBlobsOptions := o.format()\n\tresp, err := s.generated().FilterBlobs(ctx, where, serviceFilterBlobsOptions)\n\treturn resp, err\n}\n\n// NewBatchBuilder creates an instance of BatchBuilder using the same auth policy as the client.\n// BatchBuilder is used to build the batch consisting of either delete or set tier sub-requests.\n// All sub-requests in the batch must be of the same type, either delete or set tier.\n// NOTE: Service level Blob Batch operation is supported only when the Client was created using SharedKeyCredential and Account SAS.\nfunc (s *Client) NewBatchBuilder() (*BatchBuilder, error) {\n\tvar authPolicy policy.Policy\n\n\tswitch cred := s.credential().(type) {\n\tcase *azcore.TokenCredential:\n\t\tconOptions := s.getClientOptions()\n\t\tauthPolicy = shared.NewStorageChallengePolicy(*cred, base.GetAudience(conOptions), conOptions.InsecureAllowCredentialWithHTTP)\n\tcase *SharedKeyCredential:\n\t\tauthPolicy = exported.NewSharedKeyCredPolicy(cred)\n\tcase nil:\n\t\t// for authentication using SAS\n\t\tauthPolicy = nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unrecognised authentication type %T\", cred)\n\t}\n\n\treturn &BatchBuilder{\n\t\tendpoint:   s.URL(),\n\t\tauthPolicy: authPolicy,\n\t}, nil\n}\n\n// SubmitBatch operation allows multiple API calls to be embedded into a single HTTP request.\n// It builds the request body using the BatchBuilder object passed.\n// BatchBuilder contains the list of operations to be submitted. It supports up to 256 sub-requests in a single batch.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/blob-batch.\nfunc (s *Client) SubmitBatch(ctx context.Context, bb *BatchBuilder, options *SubmitBatchOptions) (SubmitBatchResponse, error) {\n\tif bb == nil || len(bb.subRequests) == 0 {\n\t\treturn SubmitBatchResponse{}, errors.New(\"batch builder is empty\")\n\t}\n\n\t// create the request body\n\tbatchReq, batchID, err := exported.CreateBatchRequest(&exported.BlobBatchBuilder{\n\t\tAuthPolicy:  bb.authPolicy,\n\t\tSubRequests: bb.subRequests,\n\t})\n\tif err != nil {\n\t\treturn SubmitBatchResponse{}, err\n\t}\n\n\treader := bytes.NewReader(batchReq)\n\trsc := streaming.NopCloser(reader)\n\tmultipartContentType := \"multipart/mixed; boundary=\" + batchID\n\n\tresp, err := s.generated().SubmitBatch(ctx, int64(len(batchReq)), multipartContentType, rsc, options.format())\n\tif err != nil {\n\t\treturn SubmitBatchResponse{}, err\n\t}\n\n\tbatchResponses, err := exported.ParseBlobBatchResponse(resp.Body, resp.ContentType, bb.subRequests)\n\tif err != nil {\n\t\treturn SubmitBatchResponse{}, err\n\t}\n\n\treturn SubmitBatchResponse{\n\t\tResponses:   batchResponses,\n\t\tContentType: resp.ContentType,\n\t\tRequestID:   resp.RequestID,\n\t\tVersion:     resp.Version,\n\t}, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/service/constants.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage service\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n)\n\nconst (\n\t// ContainerNameRoot is the special Azure Storage name used to identify a storage account's root container.\n\tContainerNameRoot = \"$root\"\n\n\t// ContainerNameLogs is the special Azure Storage name used to identify a storage account's logs container.\n\tContainerNameLogs = \"$logs\"\n)\n\n// SKUName defines values for SkuName - LRS, GRS, RAGRS, ZRS, Premium LRS\ntype SKUName = generated.SKUName\n\nconst (\n\tSKUNameStandardLRS   SKUName = generated.SKUNameStandardLRS\n\tSKUNameStandardGRS   SKUName = generated.SKUNameStandardGRS\n\tSKUNameStandardRAGRS SKUName = generated.SKUNameStandardRAGRS\n\tSKUNameStandardZRS   SKUName = generated.SKUNameStandardZRS\n\tSKUNamePremiumLRS    SKUName = generated.SKUNamePremiumLRS\n)\n\n// PossibleSKUNameValues returns the possible values for the SKUName const type.\nfunc PossibleSKUNameValues() []SKUName {\n\treturn generated.PossibleSKUNameValues()\n}\n\n// ListContainersIncludeType defines values for ListContainersIncludeType\ntype ListContainersIncludeType = generated.ListContainersIncludeType\n\nconst (\n\tListContainersIncludeTypeMetadata ListContainersIncludeType = generated.ListContainersIncludeTypeMetadata\n\tListContainersIncludeTypeDeleted  ListContainersIncludeType = generated.ListContainersIncludeTypeDeleted\n\tListContainersIncludeTypeSystem   ListContainersIncludeType = generated.ListContainersIncludeTypeSystem\n)\n\n// PossibleListContainersIncludeTypeValues returns the possible values for the ListContainersIncludeType const type.\nfunc PossibleListContainersIncludeTypeValues() []ListContainersIncludeType {\n\treturn generated.PossibleListContainersIncludeTypeValues()\n}\n\n// AccountKind defines values for AccountKind\ntype AccountKind = generated.AccountKind\n\nconst (\n\tAccountKindStorage          AccountKind = generated.AccountKindStorage\n\tAccountKindBlobStorage      AccountKind = generated.AccountKindBlobStorage\n\tAccountKindStorageV2        AccountKind = generated.AccountKindStorageV2\n\tAccountKindFileStorage      AccountKind = generated.AccountKindFileStorage\n\tAccountKindBlockBlobStorage AccountKind = generated.AccountKindBlockBlobStorage\n)\n\n// PossibleAccountKindValues returns the possible values for the AccountKind const type.\nfunc PossibleAccountKindValues() []AccountKind {\n\treturn generated.PossibleAccountKindValues()\n}\n\n// BlobGeoReplicationStatus - The status of the secondary location\ntype BlobGeoReplicationStatus = generated.BlobGeoReplicationStatus\n\nconst (\n\tBlobGeoReplicationStatusLive        BlobGeoReplicationStatus = generated.BlobGeoReplicationStatusLive\n\tBlobGeoReplicationStatusBootstrap   BlobGeoReplicationStatus = generated.BlobGeoReplicationStatusBootstrap\n\tBlobGeoReplicationStatusUnavailable BlobGeoReplicationStatus = generated.BlobGeoReplicationStatusUnavailable\n)\n\n// PossibleBlobGeoReplicationStatusValues returns the possible values for the BlobGeoReplicationStatus const type.\nfunc PossibleBlobGeoReplicationStatusValues() []BlobGeoReplicationStatus {\n\treturn generated.PossibleBlobGeoReplicationStatusValues()\n}\n\n// PublicAccessType defines values for AccessType - private (default) or blob or container\ntype PublicAccessType = generated.PublicAccessType\n\nconst (\n\tPublicAccessTypeBlob      PublicAccessType = generated.PublicAccessTypeBlob\n\tPublicAccessTypeContainer PublicAccessType = generated.PublicAccessTypeContainer\n)\n\n// PossiblePublicAccessTypeValues returns the possible values for the PublicAccessType const type.\nfunc PossiblePublicAccessTypeValues() []PublicAccessType {\n\treturn generated.PossiblePublicAccessTypeValues()\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/service/models.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage service\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/to\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n\t\"time\"\n)\n\n// SharedKeyCredential contains an account's name and its primary or secondary key.\ntype SharedKeyCredential = exported.SharedKeyCredential\n\n// NewSharedKeyCredential creates an immutable SharedKeyCredential containing the\n// storage account's name and either its primary or secondary key.\nfunc NewSharedKeyCredential(accountName, accountKey string) (*SharedKeyCredential, error) {\n\treturn exported.NewSharedKeyCredential(accountName, accountKey)\n}\n\n// UserDelegationCredential contains an account's name and its user delegation key.\ntype UserDelegationCredential = exported.UserDelegationCredential\n\n// UserDelegationKey contains UserDelegationKey.\ntype UserDelegationKey = generated.UserDelegationKey\n\n// KeyInfo contains KeyInfo struct.\ntype KeyInfo = generated.KeyInfo\n\n// GetUserDelegationCredentialOptions contains optional parameters for Service.GetUserDelegationKey method.\ntype GetUserDelegationCredentialOptions struct {\n\t// placeholder for future options\n}\n\nfunc (o *GetUserDelegationCredentialOptions) format() *generated.ServiceClientGetUserDelegationKeyOptions {\n\treturn nil\n}\n\n// AccessConditions identifies container-specific access conditions which you optionally set.\ntype AccessConditions = exported.ContainerAccessConditions\n\n// BlobTag - a key/value pair on a blob\ntype BlobTag = generated.BlobTag\n\n// ContainerItem - An Azure Storage container returned from method Client.ListContainersSegment.\ntype ContainerItem = generated.ContainerItem\n\n// ContainerProperties - Properties of a container\ntype ContainerProperties = generated.ContainerProperties\n\n// CPKInfo contains a group of parameters for the BlobClient.Download method.\ntype CPKInfo = generated.CPKInfo\n\n// CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method.\ntype CPKScopeInfo = generated.CPKScopeInfo\n\n// CreateContainerOptions contains the optional parameters for the container.Client.Create method.\ntype CreateContainerOptions = container.CreateOptions\n\n// DeleteContainerOptions contains the optional parameters for the container.Client.Delete method.\ntype DeleteContainerOptions = container.DeleteOptions\n\n// RestoreContainerOptions contains the optional parameters for the container.Client.Restore method.\ntype RestoreContainerOptions = container.RestoreOptions\n\n// CORSRule - CORS is an HTTP feature that enables a web application running under one domain to access resources in another\n// domain. Web browsers implement a security restriction known as same-origin policy that\n// prevents a web page from calling APIs in a different domain; CORS provides a secure way to allow one domain (the origin\n// domain) to call APIs in another domain.\ntype CORSRule = generated.CORSRule\n\n// FilterBlobSegment - The result of a Filter Blobs API call.\ntype FilterBlobSegment = generated.FilterBlobSegment\n\n// BlobTags - Blob tags\ntype BlobTags = generated.BlobTags\n\n// FilterBlobItem - Blob info returned from method Client.FilterBlobs.\ntype FilterBlobItem = generated.FilterBlobItem\n\n// GeoReplication - Geo-Replication information for the Secondary Storage Service.\ntype GeoReplication = generated.GeoReplication\n\n// RetentionPolicy - the retention policy which determines how long the associated data should persist.\ntype RetentionPolicy = generated.RetentionPolicy\n\n// Metrics - a summary of request statistics grouped by API in hour or minute aggregates for blobs.\ntype Metrics = generated.Metrics\n\n// Logging - Azure Analytics Logging settings.\ntype Logging = generated.Logging\n\n// StaticWebsite - The properties that enable an account to host a static website.\ntype StaticWebsite = generated.StaticWebsite\n\n// StorageServiceProperties - Storage Service Properties.\ntype StorageServiceProperties = generated.StorageServiceProperties\n\n// StorageServiceStats - Stats for the storage service.\ntype StorageServiceStats = generated.StorageServiceStats\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// GetAccountInfoOptions provides set of options for Client.GetAccountInfo\ntype GetAccountInfoOptions struct {\n\t// placeholder for future options\n}\n\nfunc (o *GetAccountInfoOptions) format() *generated.ServiceClientGetAccountInfoOptions {\n\treturn nil\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// GetPropertiesOptions contains the optional parameters for the Client.GetProperties method.\ntype GetPropertiesOptions struct {\n\t// placeholder for future options\n}\n\nfunc (o *GetPropertiesOptions) format() *generated.ServiceClientGetPropertiesOptions {\n\treturn nil\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// ListContainersOptions provides set of configurations for ListContainers operation.\ntype ListContainersOptions struct {\n\tInclude ListContainersInclude\n\n\t// A string value that identifies the portion of the list of containers to be returned with the next listing operation. The\n\t// operation returns the NextMarker value within the response body if the listing operation did not return all containers\n\t// remaining to be listed with the current page. The NextMarker value can be used as the value for the marker parameter in\n\t// a subsequent call to request the next page of list items. The marker value is opaque to the client.\n\tMarker *string\n\n\t// Specifies the maximum number of containers to return. If the request does not specify max results, or specifies a value\n\t// greater than 5000, the server will return up to 5000 items. Note that if the listing operation crosses a partition boundary,\n\t// then the service will return a continuation token for retrieving the remainder of the results. For this reason, it is possible\n\t// that the service will return fewer results than specified by max results, or than the default of 5000.\n\tMaxResults *int32\n\n\t// Filters the results to return only containers whose name begins with the specified prefix.\n\tPrefix *string\n}\n\n// ListContainersInclude indicates what additional information the service should return with each container.\ntype ListContainersInclude struct {\n\t// Tells the service whether to return metadata for each container.\n\tMetadata bool\n\n\t// Tells the service whether to return soft-deleted containers.\n\tDeleted bool\n\n\t// Tells the service whether to return system containers.\n\tSystem bool\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// SetPropertiesOptions provides set of options for Client.SetProperties\ntype SetPropertiesOptions struct {\n\t// The set of CORS rules.\n\tCORS []*CORSRule\n\n\t// The default version to use for requests to the Blob service if an incoming request's version is not specified. Possible\n\t// values include version 2008-10-27 and all more recent versions.\n\tDefaultServiceVersion *string\n\n\t// the retention policy which determines how long the associated data should persist.\n\tDeleteRetentionPolicy *RetentionPolicy\n\n\t// a summary of request statistics grouped by API in hour or minute aggregates for blobs\n\t// If version is not set - we default to \"1.0\"\n\tHourMetrics *Metrics\n\n\t// Azure Analytics Logging settings.\n\t// If version is not set - we default to \"1.0\"\n\tLogging *Logging\n\n\t// a summary of request statistics grouped by API in hour or minute aggregates for blobs\n\t// If version is not set - we default to \"1.0\"\n\tMinuteMetrics *Metrics\n\n\t// The properties that enable an account to host a static website.\n\tStaticWebsite *StaticWebsite\n}\n\nfunc (o *SetPropertiesOptions) format() (generated.StorageServiceProperties, *generated.ServiceClientSetPropertiesOptions) {\n\tif o == nil {\n\t\treturn generated.StorageServiceProperties{}, nil\n\t}\n\n\tdefaultVersion := to.Ptr[string](\"1.0\")\n\tdefaultAge := to.Ptr[int32](0)\n\temptyStr := to.Ptr[string](\"\")\n\n\tif o.CORS != nil {\n\t\tfor i := 0; i < len(o.CORS); i++ {\n\t\t\tif o.CORS[i].AllowedHeaders == nil {\n\t\t\t\to.CORS[i].AllowedHeaders = emptyStr\n\t\t\t}\n\t\t\tif o.CORS[i].ExposedHeaders == nil {\n\t\t\t\to.CORS[i].ExposedHeaders = emptyStr\n\t\t\t}\n\t\t\tif o.CORS[i].MaxAgeInSeconds == nil {\n\t\t\t\to.CORS[i].MaxAgeInSeconds = defaultAge\n\t\t\t}\n\t\t}\n\t}\n\n\tif o.HourMetrics != nil {\n\t\tif o.HourMetrics.Version == nil {\n\t\t\to.HourMetrics.Version = defaultVersion\n\t\t}\n\t}\n\n\tif o.Logging != nil {\n\t\tif o.Logging.Version == nil {\n\t\t\to.Logging.Version = defaultVersion\n\t\t}\n\t}\n\n\tif o.MinuteMetrics != nil {\n\t\tif o.MinuteMetrics.Version == nil {\n\t\t\to.MinuteMetrics.Version = defaultVersion\n\t\t}\n\n\t}\n\n\treturn generated.StorageServiceProperties{\n\t\tCORS:                  o.CORS,\n\t\tDefaultServiceVersion: o.DefaultServiceVersion,\n\t\tDeleteRetentionPolicy: o.DeleteRetentionPolicy,\n\t\tHourMetrics:           o.HourMetrics,\n\t\tLogging:               o.Logging,\n\t\tMinuteMetrics:         o.MinuteMetrics,\n\t\tStaticWebsite:         o.StaticWebsite,\n\t}, nil\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// GetSASURLOptions contains the optional parameters for the Client.GetSASURL method.\ntype GetSASURLOptions struct {\n\tStartTime *time.Time\n}\n\nfunc (o *GetSASURLOptions) format() time.Time {\n\tif o == nil {\n\t\treturn time.Time{}\n\t}\n\n\tvar st time.Time\n\tif o.StartTime != nil {\n\t\tst = o.StartTime.UTC()\n\t} else {\n\t\tst = time.Time{}\n\t}\n\treturn st\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// GetStatisticsOptions provides set of options for Client.GetStatistics\ntype GetStatisticsOptions struct {\n\t// placeholder for future options\n}\n\nfunc (o *GetStatisticsOptions) format() *generated.ServiceClientGetStatisticsOptions {\n\treturn nil\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// FilterBlobsOptions provides set of options for Client.FindBlobsByTags.\ntype FilterBlobsOptions struct {\n\t// A string value that identifies the portion of the list of containers to be returned with the next listing operation. The\n\t// operation returns the NextMarker value within the response body if the listing\n\t// operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used\n\t// as the value for the marker parameter in a subsequent call to request the next\n\t// page of list items. The marker value is opaque to the client.\n\tMarker *string\n\t// Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value\n\t// greater than 5000, the server will return up to 5000 items. Note that if the\n\t// listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder\n\t// of the results. For this reason, it is possible that the service will\n\t// return fewer results than specified by maxresults, or than the default of 5000.\n\tMaxResults *int32\n}\n\nfunc (o *FilterBlobsOptions) format() *generated.ServiceClientFilterBlobsOptions {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn &generated.ServiceClientFilterBlobsOptions{\n\t\tMarker:     o.Marker,\n\t\tMaxresults: o.MaxResults,\n\t}\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// BatchDeleteOptions contains the optional parameters for the BatchBuilder.Delete method.\ntype BatchDeleteOptions struct {\n\tblob.DeleteOptions\n\tVersionID *string\n\tSnapshot  *string\n}\n\nfunc (o *BatchDeleteOptions) format() (*generated.BlobClientDeleteOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil\n\t}\n\n\tbasics := generated.BlobClientDeleteOptions{\n\t\tDeleteSnapshots: o.DeleteSnapshots,\n\t\tDeleteType:      o.BlobDeleteType, // None by default\n\t\tSnapshot:        o.Snapshot,\n\t\tVersionID:       o.VersionID,\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn &basics, leaseAccessConditions, modifiedAccessConditions\n}\n\n// BatchSetTierOptions contains the optional parameters for the BatchBuilder.SetTier method.\ntype BatchSetTierOptions struct {\n\tblob.SetTierOptions\n\tVersionID *string\n\tSnapshot  *string\n}\n\nfunc (o *BatchSetTierOptions) format() (*generated.BlobClientSetTierOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) {\n\tif o == nil {\n\t\treturn nil, nil, nil\n\t}\n\n\tbasics := generated.BlobClientSetTierOptions{\n\t\tRehydratePriority: o.RehydratePriority,\n\t\tSnapshot:          o.Snapshot,\n\t\tVersionID:         o.VersionID,\n\t}\n\n\tleaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions)\n\treturn &basics, leaseAccessConditions, modifiedAccessConditions\n}\n\n// SubmitBatchOptions contains the optional parameters for the Client.SubmitBatch method.\ntype SubmitBatchOptions struct {\n\t// placeholder for future options\n}\n\nfunc (o *SubmitBatchOptions) format() *generated.ServiceClientSubmitBatchOptions {\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/service/responses.go",
    "content": "//go:build go1.18\n// +build go1.18\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\npackage service\n\nimport (\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated\"\n)\n\n// CreateContainerResponse contains the response from method container.Client.Create.\ntype CreateContainerResponse = generated.ContainerClientCreateResponse\n\n// DeleteContainerResponse contains the response from method container.Client.Delete\ntype DeleteContainerResponse = generated.ContainerClientDeleteResponse\n\n// RestoreContainerResponse contains the response from method container.Client.Restore\ntype RestoreContainerResponse = generated.ContainerClientRestoreResponse\n\n// GetAccountInfoResponse contains the response from method Client.GetAccountInfo.\ntype GetAccountInfoResponse = generated.ServiceClientGetAccountInfoResponse\n\n// ListContainersResponse contains the response from method Client.ListContainersSegment.\ntype ListContainersResponse = generated.ServiceClientListContainersSegmentResponse\n\n// ListContainersSegmentResponse - An enumeration of containers\ntype ListContainersSegmentResponse = generated.ListContainersSegmentResponse\n\n// GetPropertiesResponse contains the response from method Client.GetProperties.\ntype GetPropertiesResponse = generated.ServiceClientGetPropertiesResponse\n\n// SetPropertiesResponse contains the response from method Client.SetProperties.\ntype SetPropertiesResponse = generated.ServiceClientSetPropertiesResponse\n\n// GetStatisticsResponse contains the response from method Client.GetStatistics.\ntype GetStatisticsResponse = generated.ServiceClientGetStatisticsResponse\n\n// FilterBlobsResponse contains the response from method Client.FilterBlobs.\ntype FilterBlobsResponse = generated.ServiceClientFilterBlobsResponse\n\n// GetUserDelegationKeyResponse contains the response from method ServiceClient.GetUserDelegationKey.\ntype GetUserDelegationKeyResponse = generated.ServiceClientGetUserDelegationKeyResponse\n\n// SubmitBatchResponse contains the response from method Client.SubmitBatch.\ntype SubmitBatchResponse struct {\n\t// Responses contains the responses of the sub-requests in the batch\n\tResponses []*BatchResponseItem\n\n\t// ContentType contains the information returned from the Content-Type header response.\n\tContentType *string\n\n\t// RequestID contains the information returned from the x-ms-request-id header response.\n\tRequestID *string\n\n\t// Version contains the information returned from the x-ms-version header response.\n\tVersion *string\n}\n\n// BatchResponseItem contains the response for the individual sub-requests.\ntype BatchResponseItem = exported.BatchResponseItem\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/test-resources.json",
    "content": "{\n    \"$schema\": \"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#\",\n    \"contentVersion\": \"1.0.0.0\",\n    \"parameters\": {\n      \"baseName\": {\n        \"type\": \"String\"\n      },\n      \"tenantId\": {\n        \"type\": \"string\",\n        \"defaultValue\": \"72f988bf-86f1-41af-91ab-2d7cd011db47\",\n        \"metadata\": {\n          \"description\": \"The tenant ID to which the application and resources belong.\"\n        }\n      },\n      \"testApplicationOid\": {\n        \"type\": \"string\",\n        \"metadata\": {\n          \"description\": \"The principal to assign the role to. This is application object id.\"\n        }\n      }\n    },\n    \"variables\": {\n      \"mgmtApiVersion\": \"2022-09-01\",\n      \"authorizationApiVersion\": \"2018-09-01-preview\",\n      \"blobDataContributorRoleId\": \"[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/ba92f5b4-2d11-453d-a403-e96b0029c9fe')]\",\n      \"contributorRoleId\": \"[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c')]\",\n      \"blobDataOwnerRoleId\": \"[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/b7e6dc6d-f1e8-4753-8033-0f276bb0955b')]\",\n      \"primaryAccountName\": \"[concat(parameters('baseName'), 'prim')]\",\n      \"immutableAccountName\": \"[concat(parameters('baseName'), 'imm')]\",\n      \"primaryEncryptionScopeName\": \"encryptionScope\",\n      \"primaryEncryptionScope\": \"[concat(parameters('baseName'), 'prim', concat('/', variables('primaryEncryptionScopeName')))]\",\n      \"secondaryAccountName\": \"[concat(parameters('baseName'), 'sec')]\",\n      \"premiumAccountName\": \"[concat(parameters('baseName'), 'prem')]\",\n      \"dataLakeAccountName\": \"[concat(parameters('baseName'), 'dtlk')]\",\n      \"softDeleteAccountName\": \"[concat(parameters('baseName'), 'sftdl')]\",\n      \"premiumFileAccountName\": \"[concat(parameters('baseName'), 'pfile')]\",\n      \"webjobsPrimaryAccountName\": \"[concat(parameters('baseName'), 'wjprim')]\",\n      \"webjobsSecondaryAccountName\": \"[concat(parameters('baseName'), 'wjsec')]\",\n      \"location\": \"[resourceGroup().location]\",\n      \"resourceGroupName\": \"[resourceGroup().name]\",\n      \"subscriptionId\": \"[subscription().subscriptionId]\",\n      \"encryption\": {\n        \"services\": {\n          \"file\": {\n            \"enabled\": true\n          },\n          \"blob\": {\n            \"enabled\": true\n          }\n        },\n        \"keySource\": \"Microsoft.Storage\"\n      },\n      \"networkAcls\": {\n        \"bypass\": \"AzureServices\",\n        \"virtualNetworkRules\": [],\n        \"ipRules\": [],\n        \"defaultAction\": \"Allow\"\n      }\n    },\n    \"resources\": [\n      {\n        \"type\": \"Microsoft.Authorization/roleAssignments\",\n        \"apiVersion\": \"[variables('authorizationApiVersion')]\",\n        \"name\": \"[guid(concat('dataContributorRoleId', resourceGroup().id))]\",\n        \"properties\": {\n          \"roleDefinitionId\": \"[variables('blobDataContributorRoleId')]\",\n          \"principalId\": \"[parameters('testApplicationOid')]\"\n        }\n      },\n      {\n        \"type\": \"Microsoft.Authorization/roleAssignments\",\n        \"apiVersion\": \"[variables('authorizationApiVersion')]\",\n        \"name\": \"[guid(concat('contributorRoleId', resourceGroup().id))]\",\n        \"properties\": {\n          \"roleDefinitionId\": \"[variables('contributorRoleId')]\",\n          \"principalId\": \"[parameters('testApplicationOid')]\"\n        }\n      },\n      {\n        \"type\": \"Microsoft.Authorization/roleAssignments\",\n        \"apiVersion\": \"[variables('authorizationApiVersion')]\",\n        \"name\": \"[guid(concat('blobDataOwnerRoleId', resourceGroup().id))]\",\n        \"properties\": {\n          \"roleDefinitionId\": \"[variables('blobDataOwnerRoleId')]\",\n          \"principalId\": \"[parameters('testApplicationOid')]\"\n        }\n      },\n      {\n        \"type\": \"Microsoft.Storage/storageAccounts\",\n        \"apiVersion\": \"[variables('mgmtApiVersion')]\",\n        \"name\": \"[variables('primaryAccountName')]\",\n        \"location\": \"[variables('location')]\",\n        \"sku\": {\n          \"name\": \"Standard_RAGRS\",\n          \"tier\": \"Standard\"\n        },\n        \"kind\": \"StorageV2\",\n        \"properties\": {\n          \"networkAcls\": \"[variables('networkAcls')]\",\n          \"supportsHttpsTrafficOnly\": true,\n          \"encryption\": \"[variables('encryption')]\",\n          \"accessTier\": \"Hot\"\n        }\n      },\n      {\n        \"type\": \"Microsoft.Storage/storageAccounts/blobServices\",\n        \"apiVersion\": \"[variables('mgmtApiVersion')]\",\n        \"name\": \"[concat(variables('primaryAccountName'), '/default')]\",\n        \"properties\": {\n          \"isVersioningEnabled\": true,\n          \"lastAccessTimeTrackingPolicy\": {\n            \"enable\": true,\n            \"name\": \"AccessTimeTracking\",\n            \"trackingGranularityInDays\": 1,\n            \"blobType\": [\n              \"blockBlob\"\n            ]\n          }\n        },\n        \"dependsOn\": [\n          \"[variables('primaryAccountName')]\"\n        ]\n      },\n      {\n        \"type\": \"Microsoft.Storage/storageAccounts\",\n        \"apiVersion\": \"[variables('mgmtApiVersion')]\",\n        \"name\": \"[variables('immutableAccountName')]\",\n        \"location\": \"[variables('location')]\",\n        \"sku\": {\n          \"name\": \"Standard_RAGRS\",\n          \"tier\": \"Standard\"\n        },\n        \"kind\": \"StorageV2\",\n        \"properties\": {\n          \"networkAcls\": \"[variables('networkAcls')]\",\n          \"supportsHttpsTrafficOnly\": true,\n          \"encryption\": \"[variables('encryption')]\",\n          \"accessTier\": \"Hot\",\n          \"immutableStorageWithVersioning\": {\n            \"enabled\": true\n          }\n        }\n      },\n      {\n        \"type\": \"Microsoft.Storage/storageAccounts/blobServices\",\n        \"apiVersion\": \"[variables('mgmtApiVersion')]\",\n        \"name\": \"[concat(variables('immutableAccountName'), '/default')]\",\n        \"properties\": {\n          \"isVersioningEnabled\": true,\n          \"lastAccessTimeTrackingPolicy\": {\n            \"enable\": true,\n            \"name\": \"AccessTimeTracking\",\n            \"trackingGranularityInDays\": 1,\n            \"blobType\": [\n              \"blockBlob\"\n            ]\n          }\n        },\n        \"dependsOn\": [\n          \"[variables('immutableAccountName')]\"\n        ]\n      },\n      {\n        \"type\": \"Microsoft.Storage/storageAccounts/encryptionScopes\",\n        \"apiVersion\": \"[variables('mgmtApiVersion')]\",\n        \"name\": \"[variables('primaryEncryptionScope')]\",\n        \"properties\": {\n          \"source\": \"Microsoft.Storage\",\n          \"state\": \"Enabled\"\n        },\n        \"dependsOn\": [\n          \"[variables('primaryAccountName')]\"\n        ]\n      },\n      {\n        \"type\": \"Microsoft.Storage/storageAccounts\",\n        \"apiVersion\": \"[variables('mgmtApiVersion')]\",\n        \"name\": \"[variables('secondaryAccountName')]\",\n        \"location\": \"[variables('location')]\",\n        \"sku\": {\n          \"name\": \"Standard_RAGRS\",\n          \"tier\": \"Standard\"\n        },\n        \"kind\": \"StorageV2\",\n        \"properties\": {\n          \"networkAcls\": \"[variables('networkAcls')]\",\n          \"supportsHttpsTrafficOnly\": true,\n          \"encryption\": \"[variables('encryption')]\",\n          \"accessTier\": \"Hot\"\n        }\n      },\n      {\n        \"type\": \"Microsoft.Storage/storageAccounts\",\n        \"apiVersion\": \"[variables('mgmtApiVersion')]\",\n        \"name\": \"[variables('premiumAccountName')]\",\n        \"location\": \"[variables('location')]\",\n        \"sku\": {\n          \"name\": \"Premium_LRS\",\n          \"tier\": \"Premium\"\n        },\n        \"kind\": \"StorageV2\",\n        \"properties\": {\n          \"networkAcls\": \"[variables('networkAcls')]\",\n          \"supportsHttpsTrafficOnly\": true,\n          \"encryption\": \"[variables('encryption')]\",\n          \"accessTier\": \"Hot\"\n        }\n      },\n      {\n        \"type\": \"Microsoft.Storage/storageAccounts\",\n        \"apiVersion\": \"[variables('mgmtApiVersion')]\",\n        \"name\": \"[variables('dataLakeAccountName')]\",\n        \"location\": \"[variables('location')]\",\n        \"sku\": {\n          \"name\": \"Standard_RAGRS\",\n          \"tier\": \"Standard\"\n        },\n        \"kind\": \"StorageV2\",\n        \"properties\": {\n          \"isHnsEnabled\": true,\n          \"networkAcls\": \"[variables('networkAcls')]\",\n          \"supportsHttpsTrafficOnly\": true,\n          \"encryption\": \"[variables('encryption')]\",\n          \"accessTier\": \"Hot\"\n        }\n      },\n      {\n        \"type\": \"Microsoft.Storage/storageAccounts/blobServices\",\n        \"apiVersion\": \"[variables('mgmtApiVersion')]\",\n        \"name\": \"[concat(variables('dataLakeAccountName'), '/default')]\",\n        \"properties\": {\n          \"containerDeleteRetentionPolicy\": {\n            \"enabled\": true,\n            \"days\": 1\n          }\n        },\n        \"dependsOn\": [\n          \"[variables('dataLakeAccountName')]\"\n        ]\n      },\n      {\n        \"type\": \"Microsoft.Storage/storageAccounts\",\n        \"apiVersion\": \"[variables('mgmtApiVersion')]\",\n        \"name\": \"[variables('softDeleteAccountName')]\",\n        \"location\": \"[variables('location')]\",\n        \"sku\": {\n          \"name\": \"Standard_RAGRS\",\n          \"tier\": \"Standard\"\n        },\n        \"kind\": \"StorageV2\",\n        \"properties\": {\n          \"networkAcls\": \"[variables('networkAcls')]\",\n          \"supportsHttpsTrafficOnly\": true,\n          \"encryption\": \"[variables('encryption')]\",\n          \"accessTier\": \"Hot\"\n        }\n      },\n      {\n        \"type\": \"Microsoft.Storage/storageAccounts/blobServices\",\n        \"apiVersion\": \"[variables('mgmtApiVersion')]\",\n        \"name\": \"[concat(variables('softDeleteAccountName'), '/default')]\",\n        \"properties\": {\n          \"isVersioningEnabled\": true,\n          \"deleteRetentionPolicy\": {\n            \"allowPermanentDelete\": true,\n            \"enabled\": true,\n            \"days\": 1\n          },\n          \"containerDeleteRetentionPolicy\": {\n            \"enabled\": true,\n            \"days\": 1\n          }\n        },\n        \"dependsOn\": [\n          \"[variables('softDeleteAccountName')]\"\n        ]\n      },\n      {\n        \"type\": \"Microsoft.Storage/storageAccounts/fileServices\",\n        \"apiVersion\": \"[variables('mgmtApiVersion')]\",\n        \"name\": \"[concat(variables('softDeleteAccountName'), '/default')]\",\n        \"properties\": {\n          \"shareDeleteRetentionPolicy\": {\n            \"enabled\": true,\n            \"days\": 1\n          }\n        },\n        \"dependsOn\": [\n          \"[variables('softDeleteAccountName')]\"\n        ]\n      },\n      {\n        \"type\": \"Microsoft.Storage/storageAccounts\",\n        \"apiVersion\": \"[variables('mgmtApiVersion')]\",\n        \"name\": \"[variables('premiumFileAccountName')]\",\n        \"location\": \"[variables('location')]\",\n        \"sku\": {\n          \"name\": \"Premium_LRS\",\n          \"tier\": \"Premium\"\n        },\n        \"kind\": \"FileStorage\",\n        \"properties\": {\n          \"networkAcls\": \"[variables('networkAcls')]\",\n          \"supportsHttpsTrafficOnly\": true,\n          \"encryption\": \"[variables('encryption')]\",\n          \"accessTier\": \"Hot\"\n        }\n      },\n      {\n        \"type\": \"Microsoft.Storage/storageAccounts\",\n        \"apiVersion\": \"[variables('mgmtApiVersion')]\",\n        \"name\": \"[variables('webjobsPrimaryAccountName')]\",\n        \"location\": \"[variables('location')]\",\n        \"sku\": {\n          \"name\": \"Standard_RAGRS\",\n          \"tier\": \"Standard\"\n        },\n        \"kind\": \"StorageV2\",\n        \"properties\": {\n          \"networkAcls\": \"[variables('networkAcls')]\",\n          \"supportsHttpsTrafficOnly\": true,\n          \"encryption\": \"[variables('encryption')]\",\n          \"accessTier\": \"Hot\"\n        }\n      },\n      {\n        \"type\": \"Microsoft.Storage/storageAccounts\",\n        \"apiVersion\": \"[variables('mgmtApiVersion')]\",\n        \"name\": \"[variables('webjobsSecondaryAccountName')]\",\n        \"location\": \"[variables('location')]\",\n        \"sku\": {\n          \"name\": \"Standard_RAGRS\",\n          \"tier\": \"Standard\"\n        },\n        \"kind\": \"StorageV2\",\n        \"properties\": {\n          \"networkAcls\": \"[variables('networkAcls')]\",\n          \"supportsHttpsTrafficOnly\": true,\n          \"encryption\": \"[variables('encryption')]\",\n          \"accessTier\": \"Hot\"\n        }\n      }\n    ],\n    \"functions\": [\n      {\n        \"namespace\": \"url\",\n        \"members\": {\n          \"serviceEndpointSuffix\": {\n            \"parameters\": [\n              {\n                \"name\": \"endpoint\",\n                \"type\": \"string\"\n              }\n            ],\n            \"output\": {\n              \"type\": \"string\",\n              \"value\": \"[substring(parameters('endpoint'), add(indexOf(parameters('endpoint'), '.'),1), sub(length(parameters('endpoint')), add(indexOf(parameters('endpoint'), '.'),2)))]\"\n            }\n          }\n        }\n      },\n      {\n        \"namespace\": \"connectionString\",\n        \"members\": {\n          \"create\": {\n            \"parameters\": [\n              {\n                \"name\": \"accountName\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"accountKey\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"blobEndpoint\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"queueEndpoint\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"fileEndpoint\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"tableEndpoint\",\n                \"type\": \"string\"\n              }\n            ],\n            \"output\": {\n              \"type\": \"string\",\n              \"value\": \"[concat('DefaultEndpointsProtocol=https;AccountName=', parameters('accountName'), ';AccountKey=', parameters('accountKey'), ';BlobEndpoint=', parameters('blobEndpoint'), ';QueueEndpoint=', parameters('queueEndpoint'), ';FileEndpoint=', parameters('fileEndpoint'), ';TableEndpoint=', parameters('tableEndpoint'))]\"\n            }\n          }\n        }\n      }\n    ],\n    \"outputs\": {\n      \"AZURE_STORAGE_ACCOUNT_NAME\": {\n        \"type\": \"string\",\n        \"value\": \"[variables('primaryAccountName')]\"\n      },\n      \"AZURE_STORAGE_ACCOUNT_KEY\": {\n        \"type\": \"string\",\n        \"value\": \"[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('primaryAccountName')), variables('mgmtApiVersion')).keys[0].value]\"\n      },\n      \"PRIMARY_STORAGE_ACCOUNT_BLOB_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('primaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.blob)]\"\n      },\n      \"PRIMARY_STORAGE_ACCOUNT_FILE_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('primaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.file)]\"\n      },\n      \"PRIMARY_STORAGE_ACCOUNT_QUEUE_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('primaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.queue)]\"\n      },\n      \"PRIMARY_STORAGE_ACCOUNT_TABLE_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('primaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.table)]\"\n      },\n      \"SECONDARY_AZURE_STORAGE_ACCOUNT_NAME\": {\n        \"type\": \"string\",\n        \"value\": \"[variables('secondaryAccountName')]\"\n      },\n      \"SECONDARY_AZURE_STORAGE_ACCOUNT_KEY\": {\n        \"type\": \"string\",\n        \"value\": \"[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('secondaryAccountName')), variables('mgmtApiVersion')).keys[0].value]\"\n      },\n      \"SECONDARY_STORAGE_ACCOUNT_BLOB_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('secondaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.blob)]\"\n      },\n      \"SECONDARY_STORAGE_ACCOUNT_FILE_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('secondaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.file)]\"\n      },\n      \"SECONDARY_STORAGE_ACCOUNT_QUEUE_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('secondaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.queue)]\"\n      },\n      \"SECONDARY_STORAGE_ACCOUNT_TABLE_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('secondaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.table)]\"\n      },\n      \"BLOB_STORAGE_ACCOUNT_NAME\": {\n        \"type\": \"string\",\n        \"value\": \"[variables('secondaryAccountName')]\"\n      },\n      \"BLOB_STORAGE_ACCOUNT_KEY\": {\n        \"type\": \"string\",\n        \"value\": \"[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('secondaryAccountName')), variables('mgmtApiVersion')).keys[0].value]\"\n      },\n      \"PREMIUM_AZURE_STORAGE_ACCOUNT_NAME\": {\n        \"type\": \"string\",\n        \"value\": \"[variables('premiumAccountName')]\"\n      },\n      \"PREMIUM_AZURE_STORAGE_ACCOUNT_KEY\": {\n        \"type\": \"string\",\n        \"value\": \"[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('premiumAccountName')), variables('mgmtApiVersion')).keys[0].value]\"\n      },\n      \"PREMIUM_STORAGE_ACCOUNT_BLOB_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('premiumAccountName')), variables('mgmtApiVersion')).primaryEndpoints.blob)]\"\n      },\n      \"DATALAKE_AZURE_STORAGE_ACCOUNT_NAME\": {\n        \"type\": \"string\",\n        \"value\": \"[variables('dataLakeAccountName')]\"\n      },\n      \"DATALAKE_AZURE_STORAGE_ACCOUNT_KEY\": {\n        \"type\": \"string\",\n        \"value\": \"[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('dataLakeAccountName')), variables('mgmtApiVersion')).keys[0].value]\"\n      },\n      \"DATALAKE_STORAGE_ACCOUNT_BLOB_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('dataLakeAccountName')), variables('mgmtApiVersion')).primaryEndpoints.blob)]\"\n      },\n      \"DATALAKE_STORAGE_ACCOUNT_FILE_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('dataLakeAccountName')), variables('mgmtApiVersion')).primaryEndpoints.file)]\"\n      },\n      \"DATALAKE_STORAGE_ACCOUNT_QUEUE_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('dataLakeAccountName')), variables('mgmtApiVersion')).primaryEndpoints.queue)]\"\n      },\n      \"DATALAKE_STORAGE_ACCOUNT_TABLE_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('dataLakeAccountName')), variables('mgmtApiVersion')).primaryEndpoints.table)]\"\n      },\n      \"IMMUTABLE_AZURE_STORAGE_ACCOUNT_NAME\": {\n        \"type\": \"string\",\n        \"value\": \"[variables('immutableAccountName')]\"\n      },\n      \"IMMUTABLE_AZURE_STORAGE_ACCOUNT_KEY\": {\n        \"type\": \"string\",\n        \"value\": \"[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('immutableAccountName')), variables('mgmtApiVersion')).keys[0].value]\"\n      },\n      \"IMMUTABLE_AZURE_STORAGE_ACCOUNT_BLOB_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('immutableAccountName')), variables('mgmtApiVersion')).primaryEndpoints.blob)]\"\n      },\n      \"IMMUTABLE_STORAGE_ACCOUNT_FILE_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('immutableAccountName')), variables('mgmtApiVersion')).primaryEndpoints.file)]\"\n      },\n      \"IMMUTABLE_AZURE_STORAGE_ACCOUNT_QUEUE_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('immutableAccountName')), variables('mgmtApiVersion')).primaryEndpoints.queue)]\"\n      },\n      \"IMMUTABLE_AZURE_STORAGE_ACCOUNT_TABLE_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('immutableAccountName')), variables('mgmtApiVersion')).primaryEndpoints.table)]\"\n      },\n      \"SOFT_DELETE_AZURE_STORAGE_ACCOUNT_NAME\": {\n        \"type\": \"string\",\n        \"value\": \"[variables('softDeleteAccountName')]\"\n      },\n      \"SOFT_DELETE_AZURE_STORAGE_ACCOUNT_KEY\": {\n        \"type\": \"string\",\n        \"value\": \"[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('softDeleteAccountName')), variables('mgmtApiVersion')).keys[0].value]\"\n      },\n      \"SOFT_DELETE_AZURE_STORAGE_ACCOUNT_BLOB_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('softDeleteAccountName')), variables('mgmtApiVersion')).primaryEndpoints.blob)]\"\n      },\n      \"SOFT_DELETE_AZURE_STORAGE_ACCOUNT_FILE_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('softDeleteAccountName')), variables('mgmtApiVersion')).primaryEndpoints.file)]\"\n      },\n      \"SOFT_DELETE_AZURE_STORAGE_ACCOUNT_QUEUE_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('softDeleteAccountName')), variables('mgmtApiVersion')).primaryEndpoints.queue)]\"\n      },\n      \"SOFT_DELETE_AZURE_STORAGE_ACCOUNT_TABLE_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('softDeleteAccountName')), variables('mgmtApiVersion')).primaryEndpoints.table)]\"\n      },\n      \"PREMIUM_FILE_STORAGE_ACCOUNT_NAME\": {\n        \"type\": \"string\",\n        \"value\": \"[variables('premiumFileAccountName')]\"\n      },\n      \"PREMIUM_FILE_STORAGE_ACCOUNT_KEY\": {\n        \"type\": \"string\",\n        \"value\": \"[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('premiumFileAccountName')), variables('mgmtApiVersion')).keys[0].value]\"\n      },\n      \"PREMIUM_FILE_STORAGE_ACCOUNT_FILE_ENDPOINT_SUFFIX\": {\n        \"type\": \"string\",\n        \"value\": \"[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('premiumFileAccountName')), variables('mgmtApiVersion')).primaryEndpoints.file)]\"\n      },\n      \"AZUREWEBJOBSSTORAGE\": {\n        \"type\": \"string\",\n        \"value\": \"[connectionString.create(variables('webjobsPrimaryAccountName'), listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsPrimaryAccountName')), variables('mgmtApiVersion')).keys[0].value, reference(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsPrimaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.blob, reference(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsPrimaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.queue, reference(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsPrimaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.file, reference(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsPrimaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.table)]\"\n      },\n      \"AZUREWEBJOBSSECONDARYSTORAGE\": {\n        \"type\": \"string\",\n        \"value\": \"[connectionString.create(variables('webjobsSecondaryAccountName'), listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsSecondaryAccountName')), variables('mgmtApiVersion')).keys[0].value, reference(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsSecondaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.blob, reference(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsSecondaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.queue, reference(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsSecondaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.file, reference(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsSecondaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.table)]\"\n      },\n      \"RESOURCE_GROUP_NAME\": {\n        \"type\": \"string\",\n        \"value\": \"[variables('resourceGroupName')]\"\n      },\n      \"SUBSCRIPTION_ID\": {\n        \"type\": \"string\",\n        \"value\": \"[variables('subscriptionId')]\"\n      },\n      \"LOCATION\": {\n        \"type\": \"string\",\n        \"value\": \"[variables('location')]\"\n      },\n      \"AZURE_STORAGE_ENCRYPTION_SCOPE\": {\n        \"type\": \"string\",\n        \"value\": \"[variables('primaryEncryptionScopeName')]\"\n      }\n    }\n  }\n  "
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/CHANGELOG.md",
    "content": "# Change History\n\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/accesstokens.go",
    "content": "package containerregistry\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n//\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"context\"\n\t\"github.com/Azure/go-autorest/autorest\"\n\t\"github.com/Azure/go-autorest/autorest/azure\"\n\t\"github.com/Azure/go-autorest/tracing\"\n\t\"net/http\"\n)\n\n// AccessTokensClient is the metadata API definition for the Azure Container Registry runtime\ntype AccessTokensClient struct {\n\tBaseClient\n}\n\n// NewAccessTokensClient creates an instance of the AccessTokensClient client.\nfunc NewAccessTokensClient(loginURI string) AccessTokensClient {\n\treturn AccessTokensClient{New(loginURI)}\n}\n\n// Get exchange ACR Refresh token for an ACR Access Token\n// Parameters:\n// service - indicates the name of your Azure container registry.\n// scope - which is expected to be a valid scope, and can be specified more than once for multiple scope\n// requests. You obtained this from the Www-Authenticate response header from the challenge.\n// refreshToken - must be a valid ACR refresh token\nfunc (client AccessTokensClient) Get(ctx context.Context, service string, scope string, refreshToken string) (result AccessToken, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/AccessTokensClient.Get\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response.Response != nil {\n\t\t\t\tsc = result.Response.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.GetPreparer(ctx, service, scope, refreshToken)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.AccessTokensClient\", \"Get\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.GetSender(req)\n\tif err != nil {\n\t\tresult.Response = autorest.Response{Response: resp}\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.AccessTokensClient\", \"Get\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.GetResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.AccessTokensClient\", \"Get\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// GetPreparer prepares the Get request.\nfunc (client AccessTokensClient) GetPreparer(ctx context.Context, service string, scope string, refreshToken string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tformDataParameters := map[string]interface{}{\n\t\t\"grant_type\":    \"refresh_token\",\n\t\t\"refresh_token\": refreshToken,\n\t\t\"scope\":         scope,\n\t\t\"service\":       service,\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsPost(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPath(\"/oauth2/token\"),\n\t\tautorest.WithFormData(autorest.MapToValues(formDataParameters)))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// GetSender sends the Get request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client AccessTokensClient) GetSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// GetResponder handles the response to the Get request. The method always\n// closes the http.Response Body.\nfunc (client AccessTokensClient) GetResponder(resp *http.Response) (result AccessToken, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK),\n\t\tautorest.ByUnmarshallingJSON(&result),\n\t\tautorest.ByClosing())\n\tresult.Response = autorest.Response{Response: resp}\n\treturn\n}\n\n// GetFromLogin exchange Username, Password and Scope an ACR Access Token\n// Parameters:\n// service - indicates the name of your Azure container registry.\n// scope - expected to be a valid scope, and can be specified more than once for multiple scope requests. You\n// can obtain this from the Www-Authenticate response header from the challenge.\nfunc (client AccessTokensClient) GetFromLogin(ctx context.Context, service string, scope string) (result AccessToken, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/AccessTokensClient.GetFromLogin\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response.Response != nil {\n\t\t\t\tsc = result.Response.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.GetFromLoginPreparer(ctx, service, scope)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.AccessTokensClient\", \"GetFromLogin\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.GetFromLoginSender(req)\n\tif err != nil {\n\t\tresult.Response = autorest.Response{Response: resp}\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.AccessTokensClient\", \"GetFromLogin\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.GetFromLoginResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.AccessTokensClient\", \"GetFromLogin\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// GetFromLoginPreparer prepares the GetFromLogin request.\nfunc (client AccessTokensClient) GetFromLoginPreparer(ctx context.Context, service string, scope string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tqueryParameters := map[string]interface{}{\n\t\t\"scope\":   autorest.Encode(\"query\", scope),\n\t\t\"service\": autorest.Encode(\"query\", service),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsGet(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPath(\"/oauth2/token\"),\n\t\tautorest.WithQueryParameters(queryParameters))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// GetFromLoginSender sends the GetFromLogin request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client AccessTokensClient) GetFromLoginSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// GetFromLoginResponder handles the response to the GetFromLogin request. The method always\n// closes the http.Response Body.\nfunc (client AccessTokensClient) GetFromLoginResponder(resp *http.Response) (result AccessToken, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK),\n\t\tautorest.ByUnmarshallingJSON(&result),\n\t\tautorest.ByClosing())\n\tresult.Response = autorest.Response{Response: resp}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/blob.go",
    "content": "package containerregistry\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n//\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"context\"\n\t\"github.com/Azure/go-autorest/autorest\"\n\t\"github.com/Azure/go-autorest/autorest/azure\"\n\t\"github.com/Azure/go-autorest/tracing\"\n\t\"io\"\n\t\"net/http\"\n)\n\n// BlobClient is the metadata API definition for the Azure Container Registry runtime\ntype BlobClient struct {\n\tBaseClient\n}\n\n// NewBlobClient creates an instance of the BlobClient client.\nfunc NewBlobClient(loginURI string) BlobClient {\n\treturn BlobClient{New(loginURI)}\n}\n\n// CancelUpload cancel outstanding upload processes, releasing associated resources. If this is not called, the\n// unfinished uploads will eventually timeout.\n// Parameters:\n// location - link acquired from upload start or previous chunk. Note, do not include initial / (must do\n// substring(1) )\nfunc (client BlobClient) CancelUpload(ctx context.Context, location string) (result autorest.Response, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/BlobClient.CancelUpload\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response != nil {\n\t\t\t\tsc = result.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.CancelUploadPreparer(ctx, location)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"CancelUpload\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.CancelUploadSender(req)\n\tif err != nil {\n\t\tresult.Response = resp\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"CancelUpload\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.CancelUploadResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"CancelUpload\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// CancelUploadPreparer prepares the CancelUpload request.\nfunc (client BlobClient) CancelUploadPreparer(ctx context.Context, location string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"nextBlobUuidLink\": location,\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsDelete(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/{nextBlobUuidLink}\", pathParameters))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// CancelUploadSender sends the CancelUpload request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client BlobClient) CancelUploadSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// CancelUploadResponder handles the response to the CancelUpload request. The method always\n// closes the http.Response Body.\nfunc (client BlobClient) CancelUploadResponder(resp *http.Response) (result autorest.Response, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusNoContent),\n\t\tautorest.ByClosing())\n\tresult.Response = resp\n\treturn\n}\n\n// Check same as GET, except only the headers are returned.\n// Parameters:\n// name - name of the image (including the namespace)\n// digest - digest of a BLOB\nfunc (client BlobClient) Check(ctx context.Context, name string, digest string) (result autorest.Response, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/BlobClient.Check\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response != nil {\n\t\t\t\tsc = result.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.CheckPreparer(ctx, name, digest)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"Check\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.CheckSender(req)\n\tif err != nil {\n\t\tresult.Response = resp\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"Check\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.CheckResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"Check\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// CheckPreparer prepares the Check request.\nfunc (client BlobClient) CheckPreparer(ctx context.Context, name string, digest string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"digest\": autorest.Encode(\"path\", digest),\n\t\t\"name\":   autorest.Encode(\"path\", name),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsHead(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/v2/{name}/blobs/{digest}\", pathParameters))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// CheckSender sends the Check request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client BlobClient) CheckSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// CheckResponder handles the response to the Check request. The method always\n// closes the http.Response Body.\nfunc (client BlobClient) CheckResponder(resp *http.Response) (result autorest.Response, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusTemporaryRedirect),\n\t\tautorest.ByClosing())\n\tresult.Response = resp\n\treturn\n}\n\n// CheckChunk same as GET, except only the headers are returned.\n// Parameters:\n// name - name of the image (including the namespace)\n// digest - digest of a BLOB\n// rangeParameter - format : bytes=<start>-<end>,  HTTP Range header specifying blob chunk.\nfunc (client BlobClient) CheckChunk(ctx context.Context, name string, digest string, rangeParameter string) (result autorest.Response, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/BlobClient.CheckChunk\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response != nil {\n\t\t\t\tsc = result.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.CheckChunkPreparer(ctx, name, digest, rangeParameter)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"CheckChunk\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.CheckChunkSender(req)\n\tif err != nil {\n\t\tresult.Response = resp\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"CheckChunk\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.CheckChunkResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"CheckChunk\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// CheckChunkPreparer prepares the CheckChunk request.\nfunc (client BlobClient) CheckChunkPreparer(ctx context.Context, name string, digest string, rangeParameter string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"digest\": autorest.Encode(\"path\", digest),\n\t\t\"name\":   autorest.Encode(\"path\", name),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsHead(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/v2/{name}/blobs/{digest}\", pathParameters),\n\t\tautorest.WithHeader(\"Range\", autorest.String(rangeParameter)))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// CheckChunkSender sends the CheckChunk request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client BlobClient) CheckChunkSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// CheckChunkResponder handles the response to the CheckChunk request. The method always\n// closes the http.Response Body.\nfunc (client BlobClient) CheckChunkResponder(resp *http.Response) (result autorest.Response, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK),\n\t\tautorest.ByClosing())\n\tresult.Response = resp\n\treturn\n}\n\n// Delete removes an already uploaded blob.\n// Parameters:\n// name - name of the image (including the namespace)\n// digest - digest of a BLOB\nfunc (client BlobClient) Delete(ctx context.Context, name string, digest string) (result ReadCloser, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/BlobClient.Delete\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response.Response != nil {\n\t\t\t\tsc = result.Response.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.DeletePreparer(ctx, name, digest)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"Delete\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.DeleteSender(req)\n\tif err != nil {\n\t\tresult.Response = autorest.Response{Response: resp}\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"Delete\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.DeleteResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"Delete\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// DeletePreparer prepares the Delete request.\nfunc (client BlobClient) DeletePreparer(ctx context.Context, name string, digest string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"digest\": autorest.Encode(\"path\", digest),\n\t\t\"name\":   autorest.Encode(\"path\", name),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsDelete(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/v2/{name}/blobs/{digest}\", pathParameters))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// DeleteSender sends the Delete request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client BlobClient) DeleteSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// DeleteResponder handles the response to the Delete request. The method always\n// closes the http.Response Body.\nfunc (client BlobClient) DeleteResponder(resp *http.Response) (result ReadCloser, err error) {\n\tresult.Value = &resp.Body\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted))\n\tresult.Response = autorest.Response{Response: resp}\n\treturn\n}\n\n// EndUpload complete the upload, providing all the data in the body, if necessary. A request without a body will just\n// complete the upload with previously uploaded content.\n// Parameters:\n// digest - digest of a BLOB\n// location - link acquired from upload start or previous chunk. Note, do not include initial / (must do\n// substring(1) )\n// value - optional raw data of blob\nfunc (client BlobClient) EndUpload(ctx context.Context, digest string, location string, value io.ReadCloser) (result autorest.Response, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/BlobClient.EndUpload\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response != nil {\n\t\t\t\tsc = result.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.EndUploadPreparer(ctx, digest, location, value)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"EndUpload\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.EndUploadSender(req)\n\tif err != nil {\n\t\tresult.Response = resp\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"EndUpload\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.EndUploadResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"EndUpload\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// EndUploadPreparer prepares the EndUpload request.\nfunc (client BlobClient) EndUploadPreparer(ctx context.Context, digest string, location string, value io.ReadCloser) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"nextBlobUuidLink\": location,\n\t}\n\n\tqueryParameters := map[string]interface{}{\n\t\t\"digest\": autorest.Encode(\"query\", digest),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsContentType(\"application/octet-stream\"),\n\t\tautorest.AsPut(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/{nextBlobUuidLink}\", pathParameters),\n\t\tautorest.WithQueryParameters(queryParameters))\n\tif value != nil {\n\t\tpreparer = autorest.DecoratePreparer(preparer,\n\t\t\tautorest.WithFile(value))\n\t}\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// EndUploadSender sends the EndUpload request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client BlobClient) EndUploadSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// EndUploadResponder handles the response to the EndUpload request. The method always\n// closes the http.Response Body.\nfunc (client BlobClient) EndUploadResponder(resp *http.Response) (result autorest.Response, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusCreated),\n\t\tautorest.ByClosing())\n\tresult.Response = resp\n\treturn\n}\n\n// Get retrieve the blob from the registry identified by digest.\n// Parameters:\n// name - name of the image (including the namespace)\n// digest - digest of a BLOB\nfunc (client BlobClient) Get(ctx context.Context, name string, digest string) (result ReadCloser, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/BlobClient.Get\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response.Response != nil {\n\t\t\t\tsc = result.Response.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.GetPreparer(ctx, name, digest)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"Get\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.GetSender(req)\n\tif err != nil {\n\t\tresult.Response = autorest.Response{Response: resp}\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"Get\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.GetResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"Get\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// GetPreparer prepares the Get request.\nfunc (client BlobClient) GetPreparer(ctx context.Context, name string, digest string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"digest\": autorest.Encode(\"path\", digest),\n\t\t\"name\":   autorest.Encode(\"path\", name),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsGet(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/v2/{name}/blobs/{digest}\", pathParameters))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// GetSender sends the Get request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client BlobClient) GetSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// GetResponder handles the response to the Get request. The method always\n// closes the http.Response Body.\nfunc (client BlobClient) GetResponder(resp *http.Response) (result ReadCloser, err error) {\n\tresult.Value = &resp.Body\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusTemporaryRedirect))\n\tresult.Response = autorest.Response{Response: resp}\n\treturn\n}\n\n// GetChunk retrieve the blob from the registry identified by `digest`. This endpoint may also support RFC7233\n// compliant range requests. Support can be detected by issuing a HEAD request. If the header `Accept-Range: bytes` is\n// returned, range requests can be used to fetch partial content.\n// Parameters:\n// name - name of the image (including the namespace)\n// digest - digest of a BLOB\n// rangeParameter - format : bytes=<start>-<end>,  HTTP Range header specifying blob chunk.\nfunc (client BlobClient) GetChunk(ctx context.Context, name string, digest string, rangeParameter string) (result ReadCloser, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/BlobClient.GetChunk\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response.Response != nil {\n\t\t\t\tsc = result.Response.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.GetChunkPreparer(ctx, name, digest, rangeParameter)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"GetChunk\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.GetChunkSender(req)\n\tif err != nil {\n\t\tresult.Response = autorest.Response{Response: resp}\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"GetChunk\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.GetChunkResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"GetChunk\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// GetChunkPreparer prepares the GetChunk request.\nfunc (client BlobClient) GetChunkPreparer(ctx context.Context, name string, digest string, rangeParameter string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"digest\": autorest.Encode(\"path\", digest),\n\t\t\"name\":   autorest.Encode(\"path\", name),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsGet(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/v2/{name}/blobs/{digest}\", pathParameters),\n\t\tautorest.WithHeader(\"Range\", autorest.String(rangeParameter)))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// GetChunkSender sends the GetChunk request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client BlobClient) GetChunkSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// GetChunkResponder handles the response to the GetChunk request. The method always\n// closes the http.Response Body.\nfunc (client BlobClient) GetChunkResponder(resp *http.Response) (result ReadCloser, err error) {\n\tresult.Value = &resp.Body\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusPartialContent))\n\tresult.Response = autorest.Response{Response: resp}\n\treturn\n}\n\n// GetStatus retrieve status of upload identified by uuid. The primary purpose of this endpoint is to resolve the\n// current status of a resumable upload.\n// Parameters:\n// location - link acquired from upload start or previous chunk. Note, do not include initial / (must do\n// substring(1) )\nfunc (client BlobClient) GetStatus(ctx context.Context, location string) (result autorest.Response, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/BlobClient.GetStatus\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response != nil {\n\t\t\t\tsc = result.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.GetStatusPreparer(ctx, location)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"GetStatus\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.GetStatusSender(req)\n\tif err != nil {\n\t\tresult.Response = resp\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"GetStatus\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.GetStatusResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"GetStatus\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// GetStatusPreparer prepares the GetStatus request.\nfunc (client BlobClient) GetStatusPreparer(ctx context.Context, location string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"nextBlobUuidLink\": location,\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsGet(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/{nextBlobUuidLink}\", pathParameters))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// GetStatusSender sends the GetStatus request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client BlobClient) GetStatusSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// GetStatusResponder handles the response to the GetStatus request. The method always\n// closes the http.Response Body.\nfunc (client BlobClient) GetStatusResponder(resp *http.Response) (result autorest.Response, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusNoContent),\n\t\tautorest.ByClosing())\n\tresult.Response = resp\n\treturn\n}\n\n// Mount mount a blob identified by the `mount` parameter from another repository.\n// Parameters:\n// name - name of the image (including the namespace)\n// from - name of the source repository.\n// mount - digest of blob to mount from the source repository.\nfunc (client BlobClient) Mount(ctx context.Context, name string, from string, mount string) (result autorest.Response, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/BlobClient.Mount\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response != nil {\n\t\t\t\tsc = result.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.MountPreparer(ctx, name, from, mount)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"Mount\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.MountSender(req)\n\tif err != nil {\n\t\tresult.Response = resp\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"Mount\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.MountResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"Mount\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// MountPreparer prepares the Mount request.\nfunc (client BlobClient) MountPreparer(ctx context.Context, name string, from string, mount string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"name\": autorest.Encode(\"path\", name),\n\t}\n\n\tqueryParameters := map[string]interface{}{\n\t\t\"from\":  autorest.Encode(\"query\", from),\n\t\t\"mount\": autorest.Encode(\"query\", mount),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsPost(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/v2/{name}/blobs/uploads/\", pathParameters),\n\t\tautorest.WithQueryParameters(queryParameters))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// MountSender sends the Mount request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client BlobClient) MountSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// MountResponder handles the response to the Mount request. The method always\n// closes the http.Response Body.\nfunc (client BlobClient) MountResponder(resp *http.Response) (result autorest.Response, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusCreated),\n\t\tautorest.ByClosing())\n\tresult.Response = resp\n\treturn\n}\n\n// StartUpload initiate a resumable blob upload with an empty request body.\n// Parameters:\n// name - name of the image (including the namespace)\nfunc (client BlobClient) StartUpload(ctx context.Context, name string) (result autorest.Response, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/BlobClient.StartUpload\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response != nil {\n\t\t\t\tsc = result.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.StartUploadPreparer(ctx, name)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"StartUpload\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.StartUploadSender(req)\n\tif err != nil {\n\t\tresult.Response = resp\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"StartUpload\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.StartUploadResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"StartUpload\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// StartUploadPreparer prepares the StartUpload request.\nfunc (client BlobClient) StartUploadPreparer(ctx context.Context, name string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"name\": autorest.Encode(\"path\", name),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsPost(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/v2/{name}/blobs/uploads/\", pathParameters))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// StartUploadSender sends the StartUpload request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client BlobClient) StartUploadSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// StartUploadResponder handles the response to the StartUpload request. The method always\n// closes the http.Response Body.\nfunc (client BlobClient) StartUploadResponder(resp *http.Response) (result autorest.Response, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted),\n\t\tautorest.ByClosing())\n\tresult.Response = resp\n\treturn\n}\n\n// Upload upload a stream of data without completing the upload.\n// Parameters:\n// value - raw data of blob\n// location - link acquired from upload start or previous chunk. Note, do not include initial / (must do\n// substring(1) )\nfunc (client BlobClient) Upload(ctx context.Context, value io.ReadCloser, location string) (result autorest.Response, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/BlobClient.Upload\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response != nil {\n\t\t\t\tsc = result.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.UploadPreparer(ctx, value, location)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"Upload\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.UploadSender(req)\n\tif err != nil {\n\t\tresult.Response = resp\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"Upload\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.UploadResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.BlobClient\", \"Upload\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// UploadPreparer prepares the Upload request.\nfunc (client BlobClient) UploadPreparer(ctx context.Context, value io.ReadCloser, location string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"nextBlobUuidLink\": location,\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsContentType(\"application/octet-stream\"),\n\t\tautorest.AsPatch(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/{nextBlobUuidLink}\", pathParameters),\n\t\tautorest.WithFile(value))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// UploadSender sends the Upload request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client BlobClient) UploadSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// UploadResponder handles the response to the Upload request. The method always\n// closes the http.Response Body.\nfunc (client BlobClient) UploadResponder(resp *http.Response) (result autorest.Response, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted),\n\t\tautorest.ByClosing())\n\tresult.Response = resp\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/client.go",
    "content": "// Package containerregistry implements the Azure ARM Containerregistry service API version 2019-08-15-preview.\n//\n// Metadata API definition for the Azure Container Registry runtime\npackage containerregistry\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n//\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"github.com/Azure/go-autorest/autorest\"\n)\n\n// BaseClient is the base client for Containerregistry.\ntype BaseClient struct {\n\tautorest.Client\n\tLoginURI string\n}\n\n// New creates an instance of the BaseClient client.\nfunc New(loginURI string) BaseClient {\n\treturn NewWithoutDefaults(loginURI)\n}\n\n// NewWithoutDefaults creates an instance of the BaseClient client.\nfunc NewWithoutDefaults(loginURI string) BaseClient {\n\treturn BaseClient{\n\t\tClient:   autorest.NewClientWithUserAgent(UserAgent()),\n\t\tLoginURI: loginURI,\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/dataplane_meta.json",
    "content": "{\n  \"commit\": \"3c764635e7d442b3e74caf593029fcd440b3ef82\",\n  \"readme\": \"/_/azure-rest-api-specs/specification/containerregistry/data-plane/readme.md\",\n  \"tag\": \"package-2019-08\",\n  \"use\": \"@microsoft.azure/autorest.go@2.1.183\",\n  \"repository_url\": \"https://github.com/Azure/azure-rest-api-specs.git\",\n  \"autorest_command\": \"autorest --use=@microsoft.azure/autorest.go@2.1.183 --tag=package-2019-08 --go-sdk-folder=/_/azure-sdk-for-go --go --verbose --use-onever --version=2.0.4421 --go.license-header=MICROSOFT_MIT_NO_VERSION /_/azure-rest-api-specs/specification/containerregistry/data-plane/readme.md\",\n  \"additional_properties\": {\n    \"additional_options\": \"--go --verbose --use-onever --version=2.0.4421 --go.license-header=MICROSOFT_MIT_NO_VERSION\"\n  }\n}"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/manifests.go",
    "content": "package containerregistry\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n//\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"context\"\n\t\"github.com/Azure/go-autorest/autorest\"\n\t\"github.com/Azure/go-autorest/autorest/azure\"\n\t\"github.com/Azure/go-autorest/tracing\"\n\t\"net/http\"\n)\n\n// ManifestsClient is the metadata API definition for the Azure Container Registry runtime\ntype ManifestsClient struct {\n\tBaseClient\n}\n\n// NewManifestsClient creates an instance of the ManifestsClient client.\nfunc NewManifestsClient(loginURI string) ManifestsClient {\n\treturn ManifestsClient{New(loginURI)}\n}\n\n// Create put the manifest identified by `name` and `reference` where `reference` can be a tag or digest.\n// Parameters:\n// name - name of the image (including the namespace)\n// reference - a tag or a digest, pointing to a specific image\n// payload - manifest body, can take v1 or v2 values depending on accept header\nfunc (client ManifestsClient) Create(ctx context.Context, name string, reference string, payload Manifest) (result SetObject, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/ManifestsClient.Create\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response.Response != nil {\n\t\t\t\tsc = result.Response.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.CreatePreparer(ctx, name, reference, payload)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.ManifestsClient\", \"Create\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.CreateSender(req)\n\tif err != nil {\n\t\tresult.Response = autorest.Response{Response: resp}\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.ManifestsClient\", \"Create\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.CreateResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.ManifestsClient\", \"Create\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// CreatePreparer prepares the Create request.\nfunc (client ManifestsClient) CreatePreparer(ctx context.Context, name string, reference string, payload Manifest) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"name\":      autorest.Encode(\"path\", name),\n\t\t\"reference\": autorest.Encode(\"path\", reference),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsContentType(\"application/vnd.docker.distribution.manifest.v2+json\"),\n\t\tautorest.AsPut(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/v2/{name}/manifests/{reference}\", pathParameters),\n\t\tautorest.WithJSON(payload))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// CreateSender sends the Create request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client ManifestsClient) CreateSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// CreateResponder handles the response to the Create request. The method always\n// closes the http.Response Body.\nfunc (client ManifestsClient) CreateResponder(resp *http.Response) (result SetObject, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusCreated),\n\t\tautorest.ByUnmarshallingJSON(&result.Value),\n\t\tautorest.ByClosing())\n\tresult.Response = autorest.Response{Response: resp}\n\treturn\n}\n\n// Delete delete the manifest identified by `name` and `reference`. Note that a manifest can _only_ be deleted by\n// `digest`.\n// Parameters:\n// name - name of the image (including the namespace)\n// reference - a tag or a digest, pointing to a specific image\nfunc (client ManifestsClient) Delete(ctx context.Context, name string, reference string) (result autorest.Response, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/ManifestsClient.Delete\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response != nil {\n\t\t\t\tsc = result.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.DeletePreparer(ctx, name, reference)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.ManifestsClient\", \"Delete\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.DeleteSender(req)\n\tif err != nil {\n\t\tresult.Response = resp\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.ManifestsClient\", \"Delete\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.DeleteResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.ManifestsClient\", \"Delete\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// DeletePreparer prepares the Delete request.\nfunc (client ManifestsClient) DeletePreparer(ctx context.Context, name string, reference string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"name\":      autorest.Encode(\"path\", name),\n\t\t\"reference\": autorest.Encode(\"path\", reference),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsDelete(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/v2/{name}/manifests/{reference}\", pathParameters))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// DeleteSender sends the Delete request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client ManifestsClient) DeleteSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// DeleteResponder handles the response to the Delete request. The method always\n// closes the http.Response Body.\nfunc (client ManifestsClient) DeleteResponder(resp *http.Response) (result autorest.Response, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted),\n\t\tautorest.ByClosing())\n\tresult.Response = resp\n\treturn\n}\n\n// Get get the manifest identified by `name` and `reference` where `reference` can be a tag or digest.\n// Parameters:\n// name - name of the image (including the namespace)\n// reference - a tag or a digest, pointing to a specific image\n// accept - accept header string delimited by comma. For example,\n// application/vnd.docker.distribution.manifest.v2+json\nfunc (client ManifestsClient) Get(ctx context.Context, name string, reference string, accept string) (result ManifestWrapper, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/ManifestsClient.Get\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response.Response != nil {\n\t\t\t\tsc = result.Response.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.GetPreparer(ctx, name, reference, accept)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.ManifestsClient\", \"Get\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.GetSender(req)\n\tif err != nil {\n\t\tresult.Response = autorest.Response{Response: resp}\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.ManifestsClient\", \"Get\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.GetResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.ManifestsClient\", \"Get\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// GetPreparer prepares the Get request.\nfunc (client ManifestsClient) GetPreparer(ctx context.Context, name string, reference string, accept string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"name\":      autorest.Encode(\"path\", name),\n\t\t\"reference\": autorest.Encode(\"path\", reference),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsGet(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/v2/{name}/manifests/{reference}\", pathParameters))\n\tif len(accept) > 0 {\n\t\tpreparer = autorest.DecoratePreparer(preparer,\n\t\t\tautorest.WithHeader(\"accept\", autorest.String(accept)))\n\t}\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// GetSender sends the Get request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client ManifestsClient) GetSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// GetResponder handles the response to the Get request. The method always\n// closes the http.Response Body.\nfunc (client ManifestsClient) GetResponder(resp *http.Response) (result ManifestWrapper, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK),\n\t\tautorest.ByUnmarshallingJSON(&result),\n\t\tautorest.ByClosing())\n\tresult.Response = autorest.Response{Response: resp}\n\treturn\n}\n\n// GetAttributes get manifest attributes\n// Parameters:\n// name - name of the image (including the namespace)\n// reference - a tag or a digest, pointing to a specific image\nfunc (client ManifestsClient) GetAttributes(ctx context.Context, name string, reference string) (result ManifestAttributes, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/ManifestsClient.GetAttributes\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response.Response != nil {\n\t\t\t\tsc = result.Response.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.GetAttributesPreparer(ctx, name, reference)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.ManifestsClient\", \"GetAttributes\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.GetAttributesSender(req)\n\tif err != nil {\n\t\tresult.Response = autorest.Response{Response: resp}\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.ManifestsClient\", \"GetAttributes\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.GetAttributesResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.ManifestsClient\", \"GetAttributes\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// GetAttributesPreparer prepares the GetAttributes request.\nfunc (client ManifestsClient) GetAttributesPreparer(ctx context.Context, name string, reference string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"name\":      autorest.Encode(\"path\", name),\n\t\t\"reference\": autorest.Encode(\"path\", reference),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsGet(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/acr/v1/{name}/_manifests/{reference}\", pathParameters))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// GetAttributesSender sends the GetAttributes request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client ManifestsClient) GetAttributesSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// GetAttributesResponder handles the response to the GetAttributes request. The method always\n// closes the http.Response Body.\nfunc (client ManifestsClient) GetAttributesResponder(resp *http.Response) (result ManifestAttributes, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK),\n\t\tautorest.ByUnmarshallingJSON(&result),\n\t\tautorest.ByClosing())\n\tresult.Response = autorest.Response{Response: resp}\n\treturn\n}\n\n// GetList list manifests of a repository\n// Parameters:\n// name - name of the image (including the namespace)\n// last - query parameter for the last item in previous query. Result set will include values lexically after\n// last.\n// n - query parameter for max number of items\n// orderby - orderby query parameter\nfunc (client ManifestsClient) GetList(ctx context.Context, name string, last string, n *int32, orderby string) (result AcrManifests, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/ManifestsClient.GetList\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response.Response != nil {\n\t\t\t\tsc = result.Response.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.GetListPreparer(ctx, name, last, n, orderby)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.ManifestsClient\", \"GetList\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.GetListSender(req)\n\tif err != nil {\n\t\tresult.Response = autorest.Response{Response: resp}\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.ManifestsClient\", \"GetList\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.GetListResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.ManifestsClient\", \"GetList\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// GetListPreparer prepares the GetList request.\nfunc (client ManifestsClient) GetListPreparer(ctx context.Context, name string, last string, n *int32, orderby string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"name\": autorest.Encode(\"path\", name),\n\t}\n\n\tqueryParameters := map[string]interface{}{}\n\tif len(last) > 0 {\n\t\tqueryParameters[\"last\"] = autorest.Encode(\"query\", last)\n\t}\n\tif n != nil {\n\t\tqueryParameters[\"n\"] = autorest.Encode(\"query\", *n)\n\t}\n\tif len(orderby) > 0 {\n\t\tqueryParameters[\"orderby\"] = autorest.Encode(\"query\", orderby)\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsGet(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/acr/v1/{name}/_manifests\", pathParameters),\n\t\tautorest.WithQueryParameters(queryParameters))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// GetListSender sends the GetList request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client ManifestsClient) GetListSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// GetListResponder handles the response to the GetList request. The method always\n// closes the http.Response Body.\nfunc (client ManifestsClient) GetListResponder(resp *http.Response) (result AcrManifests, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK),\n\t\tautorest.ByUnmarshallingJSON(&result),\n\t\tautorest.ByClosing())\n\tresult.Response = autorest.Response{Response: resp}\n\treturn\n}\n\n// UpdateAttributes update attributes of a manifest\n// Parameters:\n// name - name of the image (including the namespace)\n// reference - a tag or a digest, pointing to a specific image\n// value - repository attribute value\nfunc (client ManifestsClient) UpdateAttributes(ctx context.Context, name string, reference string, value *ChangeableAttributes) (result autorest.Response, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/ManifestsClient.UpdateAttributes\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response != nil {\n\t\t\t\tsc = result.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.UpdateAttributesPreparer(ctx, name, reference, value)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.ManifestsClient\", \"UpdateAttributes\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.UpdateAttributesSender(req)\n\tif err != nil {\n\t\tresult.Response = resp\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.ManifestsClient\", \"UpdateAttributes\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.UpdateAttributesResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.ManifestsClient\", \"UpdateAttributes\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// UpdateAttributesPreparer prepares the UpdateAttributes request.\nfunc (client ManifestsClient) UpdateAttributesPreparer(ctx context.Context, name string, reference string, value *ChangeableAttributes) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"name\":      autorest.Encode(\"path\", name),\n\t\t\"reference\": autorest.Encode(\"path\", reference),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsContentType(\"application/json; charset=utf-8\"),\n\t\tautorest.AsPatch(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/acr/v1/{name}/_manifests/{reference}\", pathParameters))\n\tif value != nil {\n\t\tpreparer = autorest.DecoratePreparer(preparer,\n\t\t\tautorest.WithJSON(value))\n\t}\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// UpdateAttributesSender sends the UpdateAttributes request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client ManifestsClient) UpdateAttributesSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// UpdateAttributesResponder handles the response to the UpdateAttributes request. The method always\n// closes the http.Response Body.\nfunc (client ManifestsClient) UpdateAttributesResponder(resp *http.Response) (result autorest.Response, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK),\n\t\tautorest.ByClosing())\n\tresult.Response = resp\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/models.go",
    "content": "package containerregistry\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n//\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/Azure/go-autorest/autorest\"\n\t\"github.com/Azure/go-autorest/autorest/date\"\n\t\"io\"\n)\n\n// The package's fully qualified name.\nconst fqdn = \"github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry\"\n\n// AccessToken ...\ntype AccessToken struct {\n\tautorest.Response `json:\"-\"`\n\t// AccessToken - The access token for performing authenticated requests\n\tAccessToken *string `json:\"access_token,omitempty\"`\n}\n\n// AcrErrorInfo error information\ntype AcrErrorInfo struct {\n\t// Code - Error code\n\tCode *string `json:\"code,omitempty\"`\n\t// Message - Error message\n\tMessage *string `json:\"message,omitempty\"`\n\t// Detail - Error details\n\tDetail interface{} `json:\"detail,omitempty\"`\n}\n\n// AcrErrors acr error response describing why the operation failed\ntype AcrErrors struct {\n\t// Errors - Array of detailed error\n\tErrors *[]AcrErrorInfo `json:\"errors,omitempty\"`\n}\n\n// AcrManifests manifest attributes\ntype AcrManifests struct {\n\tautorest.Response `json:\"-\"`\n\t// Registry - Registry name\n\tRegistry *string `json:\"registry,omitempty\"`\n\t// ImageName - Image name\n\tImageName *string `json:\"imageName,omitempty\"`\n\t// ManifestsAttributes - List of manifests\n\tManifestsAttributes *[]ManifestAttributesBase `json:\"manifests,omitempty\"`\n}\n\n// Annotations additional information provided through arbitrary metadata.\ntype Annotations struct {\n\t// AdditionalProperties - Unmatched properties from the message are deserialized this collection\n\tAdditionalProperties map[string]interface{} `json:\"\"`\n\t// Created - Date and time on which the image was built (string, date-time as defined by https://tools.ietf.org/html/rfc3339#section-5.6)\n\tCreated *date.Time `json:\"org.opencontainers.image.created,omitempty\"`\n\t// Authors - Contact details of the people or organization responsible for the image.\n\tAuthors *string `json:\"org.opencontainers.image.authors,omitempty\"`\n\t// URL - URL to find more information on the image.\n\tURL *string `json:\"org.opencontainers.image.url,omitempty\"`\n\t// Documentation - URL to get documentation on the image.\n\tDocumentation *string `json:\"org.opencontainers.image.documentation,omitempty\"`\n\t// Source - URL to get source code for building the image.\n\tSource *string `json:\"org.opencontainers.image.source,omitempty\"`\n\t// Version - Version of the packaged software. The version MAY match a label or tag in the source code repository, may also be Semantic versioning-compatible\n\tVersion *string `json:\"org.opencontainers.image.version,omitempty\"`\n\t// Revision - Source control revision identifier for the packaged software.\n\tRevision *string `json:\"org.opencontainers.image.revision,omitempty\"`\n\t// Vendor - Name of the distributing entity, organization or individual.\n\tVendor *string `json:\"org.opencontainers.image.vendor,omitempty\"`\n\t// Licenses - License(s) under which contained software is distributed as an SPDX License Expression.\n\tLicenses *string `json:\"org.opencontainers.image.licenses,omitempty\"`\n\t// Name - Name of the reference for a target.\n\tName *string `json:\"org.opencontainers.image.ref.name,omitempty\"`\n\t// Title - Human-readable title of the image\n\tTitle *string `json:\"org.opencontainers.image.title,omitempty\"`\n\t// Description - Human-readable description of the software packaged in the image\n\tDescription *string `json:\"org.opencontainers.image.description,omitempty\"`\n}\n\n// MarshalJSON is the custom marshaler for Annotations.\nfunc (a Annotations) MarshalJSON() ([]byte, error) {\n\tobjectMap := make(map[string]interface{})\n\tif a.Created != nil {\n\t\tobjectMap[\"org.opencontainers.image.created\"] = a.Created\n\t}\n\tif a.Authors != nil {\n\t\tobjectMap[\"org.opencontainers.image.authors\"] = a.Authors\n\t}\n\tif a.URL != nil {\n\t\tobjectMap[\"org.opencontainers.image.url\"] = a.URL\n\t}\n\tif a.Documentation != nil {\n\t\tobjectMap[\"org.opencontainers.image.documentation\"] = a.Documentation\n\t}\n\tif a.Source != nil {\n\t\tobjectMap[\"org.opencontainers.image.source\"] = a.Source\n\t}\n\tif a.Version != nil {\n\t\tobjectMap[\"org.opencontainers.image.version\"] = a.Version\n\t}\n\tif a.Revision != nil {\n\t\tobjectMap[\"org.opencontainers.image.revision\"] = a.Revision\n\t}\n\tif a.Vendor != nil {\n\t\tobjectMap[\"org.opencontainers.image.vendor\"] = a.Vendor\n\t}\n\tif a.Licenses != nil {\n\t\tobjectMap[\"org.opencontainers.image.licenses\"] = a.Licenses\n\t}\n\tif a.Name != nil {\n\t\tobjectMap[\"org.opencontainers.image.ref.name\"] = a.Name\n\t}\n\tif a.Title != nil {\n\t\tobjectMap[\"org.opencontainers.image.title\"] = a.Title\n\t}\n\tif a.Description != nil {\n\t\tobjectMap[\"org.opencontainers.image.description\"] = a.Description\n\t}\n\tfor k, v := range a.AdditionalProperties {\n\t\tobjectMap[k] = v\n\t}\n\treturn json.Marshal(objectMap)\n}\n\n// UnmarshalJSON is the custom unmarshaler for Annotations struct.\nfunc (a *Annotations) UnmarshalJSON(body []byte) error {\n\tvar m map[string]*json.RawMessage\n\terr := json.Unmarshal(body, &m)\n\tif err != nil {\n\t\treturn err\n\t}\n\tfor k, v := range m {\n\t\tswitch k {\n\t\tdefault:\n\t\t\tif v != nil {\n\t\t\t\tvar additionalProperties interface{}\n\t\t\t\terr = json.Unmarshal(*v, &additionalProperties)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif a.AdditionalProperties == nil {\n\t\t\t\t\ta.AdditionalProperties = make(map[string]interface{})\n\t\t\t\t}\n\t\t\t\ta.AdditionalProperties[k] = additionalProperties\n\t\t\t}\n\t\tcase \"org.opencontainers.image.created\":\n\t\t\tif v != nil {\n\t\t\t\tvar created date.Time\n\t\t\t\terr = json.Unmarshal(*v, &created)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\ta.Created = &created\n\t\t\t}\n\t\tcase \"org.opencontainers.image.authors\":\n\t\t\tif v != nil {\n\t\t\t\tvar authors string\n\t\t\t\terr = json.Unmarshal(*v, &authors)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\ta.Authors = &authors\n\t\t\t}\n\t\tcase \"org.opencontainers.image.url\":\n\t\t\tif v != nil {\n\t\t\t\tvar URL string\n\t\t\t\terr = json.Unmarshal(*v, &URL)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\ta.URL = &URL\n\t\t\t}\n\t\tcase \"org.opencontainers.image.documentation\":\n\t\t\tif v != nil {\n\t\t\t\tvar documentation string\n\t\t\t\terr = json.Unmarshal(*v, &documentation)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\ta.Documentation = &documentation\n\t\t\t}\n\t\tcase \"org.opencontainers.image.source\":\n\t\t\tif v != nil {\n\t\t\t\tvar source string\n\t\t\t\terr = json.Unmarshal(*v, &source)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\ta.Source = &source\n\t\t\t}\n\t\tcase \"org.opencontainers.image.version\":\n\t\t\tif v != nil {\n\t\t\t\tvar version string\n\t\t\t\terr = json.Unmarshal(*v, &version)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\ta.Version = &version\n\t\t\t}\n\t\tcase \"org.opencontainers.image.revision\":\n\t\t\tif v != nil {\n\t\t\t\tvar revision string\n\t\t\t\terr = json.Unmarshal(*v, &revision)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\ta.Revision = &revision\n\t\t\t}\n\t\tcase \"org.opencontainers.image.vendor\":\n\t\t\tif v != nil {\n\t\t\t\tvar vendor string\n\t\t\t\terr = json.Unmarshal(*v, &vendor)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\ta.Vendor = &vendor\n\t\t\t}\n\t\tcase \"org.opencontainers.image.licenses\":\n\t\t\tif v != nil {\n\t\t\t\tvar licenses string\n\t\t\t\terr = json.Unmarshal(*v, &licenses)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\ta.Licenses = &licenses\n\t\t\t}\n\t\tcase \"org.opencontainers.image.ref.name\":\n\t\t\tif v != nil {\n\t\t\t\tvar name string\n\t\t\t\terr = json.Unmarshal(*v, &name)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\ta.Name = &name\n\t\t\t}\n\t\tcase \"org.opencontainers.image.title\":\n\t\t\tif v != nil {\n\t\t\t\tvar title string\n\t\t\t\terr = json.Unmarshal(*v, &title)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\ta.Title = &title\n\t\t\t}\n\t\tcase \"org.opencontainers.image.description\":\n\t\t\tif v != nil {\n\t\t\t\tvar description string\n\t\t\t\terr = json.Unmarshal(*v, &description)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\ta.Description = &description\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// ChangeableAttributes ...\ntype ChangeableAttributes struct {\n\t// DeleteEnabled - Delete enabled\n\tDeleteEnabled *bool `json:\"deleteEnabled,omitempty\"`\n\t// WriteEnabled - Write enabled\n\tWriteEnabled *bool `json:\"writeEnabled,omitempty\"`\n\t// ListEnabled - List enabled\n\tListEnabled *bool `json:\"listEnabled,omitempty\"`\n\t// ReadEnabled - Read enabled\n\tReadEnabled *bool `json:\"readEnabled,omitempty\"`\n}\n\n// DeletedRepository deleted repository\ntype DeletedRepository struct {\n\tautorest.Response `json:\"-\"`\n\t// ManifestsDeleted - SHA of the deleted image\n\tManifestsDeleted *[]string `json:\"manifestsDeleted,omitempty\"`\n\t// TagsDeleted - Tag of the deleted image\n\tTagsDeleted *[]string `json:\"tagsDeleted,omitempty\"`\n}\n\n// Descriptor docker V2 image layer descriptor including config and layers\ntype Descriptor struct {\n\t// MediaType - Layer media type\n\tMediaType *string `json:\"mediaType,omitempty\"`\n\t// Size - Layer size\n\tSize *int64 `json:\"size,omitempty\"`\n\t// Digest - Layer digest\n\tDigest *string `json:\"digest,omitempty\"`\n\t// Urls - Specifies a list of URIs from which this object may be downloaded.\n\tUrls        *[]string    `json:\"urls,omitempty\"`\n\tAnnotations *Annotations `json:\"annotations,omitempty\"`\n}\n\n// FsLayer image layer information\ntype FsLayer struct {\n\t// BlobSum - SHA of an image layer\n\tBlobSum *string `json:\"blobSum,omitempty\"`\n}\n\n// History a list of unstructured historical data for v1 compatibility\ntype History struct {\n\t// V1Compatibility - The raw v1 compatibility information\n\tV1Compatibility *string `json:\"v1Compatibility,omitempty\"`\n}\n\n// ImageSignature signature of a signed manifest\ntype ImageSignature struct {\n\t// Header - A JSON web signature\n\tHeader *JWK `json:\"header,omitempty\"`\n\t// Signature - A signature for the image manifest, signed by a libtrust private key\n\tSignature *string `json:\"signature,omitempty\"`\n\t// Protected - The signed protected header\n\tProtected *string `json:\"protected,omitempty\"`\n}\n\n// JWK a JSON web signature\ntype JWK struct {\n\tJwk *JWKHeader `json:\"jwk,omitempty\"`\n\t// Alg - The algorithm used to sign or encrypt the JWT\n\tAlg *string `json:\"alg,omitempty\"`\n}\n\n// JWKHeader JSON web key parameter\ntype JWKHeader struct {\n\t// Crv - crv value\n\tCrv *string `json:\"crv,omitempty\"`\n\t// Kid - kid value\n\tKid *string `json:\"kid,omitempty\"`\n\t// Kty - kty value\n\tKty *string `json:\"kty,omitempty\"`\n\t// X - x value\n\tX *string `json:\"x,omitempty\"`\n\t// Y - y value\n\tY *string `json:\"y,omitempty\"`\n}\n\n// Manifest returns the requested manifest file\ntype Manifest struct {\n\t// SchemaVersion - Schema version\n\tSchemaVersion *int32 `json:\"schemaVersion,omitempty\"`\n}\n\n// ManifestAttributes manifest attributes details\ntype ManifestAttributes struct {\n\tautorest.Response `json:\"-\"`\n\t// Registry - Registry name\n\tRegistry *string `json:\"registry,omitempty\"`\n\t// ImageName - Image name\n\tImageName *string `json:\"imageName,omitempty\"`\n\t// Attributes - Manifest attributes\n\tAttributes *ManifestAttributesBase `json:\"manifest,omitempty\"`\n}\n\n// ManifestAttributesBase manifest details\ntype ManifestAttributesBase struct {\n\t// Digest - Manifest\n\tDigest *string `json:\"digest,omitempty\"`\n\t// ImageSize - Image size\n\tImageSize *int64 `json:\"imageSize,omitempty\"`\n\t// CreatedTime - Created time\n\tCreatedTime *string `json:\"createdTime,omitempty\"`\n\t// LastUpdateTime - Last update time\n\tLastUpdateTime *string `json:\"lastUpdateTime,omitempty\"`\n\t// Architecture - CPU architecture\n\tArchitecture *string `json:\"architecture,omitempty\"`\n\t// Os - Operating system\n\tOs *string `json:\"os,omitempty\"`\n\t// MediaType - Media type\n\tMediaType *string `json:\"mediaType,omitempty\"`\n\t// ConfigMediaType - Config blob media type\n\tConfigMediaType *string `json:\"configMediaType,omitempty\"`\n\t// Tags - List of tags\n\tTags *[]string `json:\"tags,omitempty\"`\n\t// ChangeableAttributes - Changeable attributes\n\tChangeableAttributes *ChangeableAttributes `json:\"changeableAttributes,omitempty\"`\n}\n\n// ManifestAttributesManifest list of manifest attributes\ntype ManifestAttributesManifest struct {\n\t// References - List of manifest attributes details\n\tReferences *[]ManifestAttributesManifestReferences `json:\"references,omitempty\"`\n\t// QuarantineTag - Quarantine tag name\n\tQuarantineTag *string `json:\"quarantineTag,omitempty\"`\n}\n\n// ManifestAttributesManifestReferences manifest attributes details\ntype ManifestAttributesManifestReferences struct {\n\t// Digest - Manifest digest\n\tDigest *string `json:\"digest,omitempty\"`\n\t// Architecture - CPU architecture\n\tArchitecture *string `json:\"architecture,omitempty\"`\n\t// Os - Operating system\n\tOs *string `json:\"os,omitempty\"`\n}\n\n// ManifestChangeableAttributes changeable attributes\ntype ManifestChangeableAttributes struct {\n\t// DeleteEnabled - Delete enabled\n\tDeleteEnabled *bool `json:\"deleteEnabled,omitempty\"`\n\t// WriteEnabled - Write enabled\n\tWriteEnabled *bool `json:\"writeEnabled,omitempty\"`\n\t// ListEnabled - List enabled\n\tListEnabled *bool `json:\"listEnabled,omitempty\"`\n\t// ReadEnabled - Read enabled\n\tReadEnabled *bool `json:\"readEnabled,omitempty\"`\n\t// QuarantineState - Quarantine state\n\tQuarantineState *string `json:\"quarantineState,omitempty\"`\n\t// QuarantineDetails - Quarantine details\n\tQuarantineDetails *string `json:\"quarantineDetails,omitempty\"`\n}\n\n// ManifestList returns the requested Docker multi-arch-manifest file\ntype ManifestList struct {\n\t// MediaType - Media type for this Manifest\n\tMediaType *string `json:\"mediaType,omitempty\"`\n\t// Manifests - List of V2 image layer information\n\tManifests *[]ManifestListAttributes `json:\"manifests,omitempty\"`\n\t// SchemaVersion - Schema version\n\tSchemaVersion *int32 `json:\"schemaVersion,omitempty\"`\n}\n\n// ManifestListAttributes ...\ntype ManifestListAttributes struct {\n\t// MediaType - The MIME type of the referenced object. This will generally be application/vnd.docker.image.manifest.v2+json, but it could also be application/vnd.docker.image.manifest.v1+json\n\tMediaType *string `json:\"mediaType,omitempty\"`\n\t// Size - The size in bytes of the object\n\tSize *int64 `json:\"size,omitempty\"`\n\t// Digest - The digest of the content, as defined by the Registry V2 HTTP API Specification\n\tDigest   *string   `json:\"digest,omitempty\"`\n\tPlatform *Platform `json:\"platform,omitempty\"`\n}\n\n// ManifestWrapper returns the requested manifest file\ntype ManifestWrapper struct {\n\tautorest.Response `json:\"-\"`\n\t// MediaType - Media type for this Manifest\n\tMediaType *string `json:\"mediaType,omitempty\"`\n\t// Manifests - (ManifestList, OCIIndex) List of V2 image layer information\n\tManifests *[]ManifestListAttributes `json:\"manifests,omitempty\"`\n\t// Config - (V2, OCI) Image config descriptor\n\tConfig *Descriptor `json:\"config,omitempty\"`\n\t// Layers - (V2, OCI) List of V2 image layer information\n\tLayers *[]Descriptor `json:\"layers,omitempty\"`\n\t// Annotations - (OCI, OCIIndex) Additional metadata\n\tAnnotations *Annotations `json:\"annotations,omitempty\"`\n\t// Architecture - (V1) CPU architecture\n\tArchitecture *string `json:\"architecture,omitempty\"`\n\t// Name - (V1) Image name\n\tName *string `json:\"name,omitempty\"`\n\t// Tag - (V1) Image tag\n\tTag *string `json:\"tag,omitempty\"`\n\t// FsLayers - (V1) List of layer information\n\tFsLayers *[]FsLayer `json:\"fsLayers,omitempty\"`\n\t// History - (V1) Image history\n\tHistory *[]History `json:\"history,omitempty\"`\n\t// Signatures - (V1) Image signature\n\tSignatures *[]ImageSignature `json:\"signatures,omitempty\"`\n\t// SchemaVersion - Schema version\n\tSchemaVersion *int32 `json:\"schemaVersion,omitempty\"`\n}\n\n// OCIIndex returns the requested OCI index file\ntype OCIIndex struct {\n\t// Manifests - List of OCI image layer information\n\tManifests   *[]ManifestListAttributes `json:\"manifests,omitempty\"`\n\tAnnotations *Annotations              `json:\"annotations,omitempty\"`\n\t// SchemaVersion - Schema version\n\tSchemaVersion *int32 `json:\"schemaVersion,omitempty\"`\n}\n\n// OCIManifest returns the requested OCI Manifest file\ntype OCIManifest struct {\n\t// Config - V2 image config descriptor\n\tConfig *Descriptor `json:\"config,omitempty\"`\n\t// Layers - List of V2 image layer information\n\tLayers      *[]Descriptor `json:\"layers,omitempty\"`\n\tAnnotations *Annotations  `json:\"annotations,omitempty\"`\n\t// SchemaVersion - Schema version\n\tSchemaVersion *int32 `json:\"schemaVersion,omitempty\"`\n}\n\n// Platform the platform object describes the platform which the image in the manifest runs on. A full list\n// of valid operating system and architecture values are listed in the Go language documentation for $GOOS\n// and $GOARCH\ntype Platform struct {\n\t// Architecture - Specifies the CPU architecture, for example amd64 or ppc64le.\n\tArchitecture *string `json:\"architecture,omitempty\"`\n\t// Os - The os field specifies the operating system, for example linux or windows.\n\tOs *string `json:\"os,omitempty\"`\n\t// OsVersion - The optional os.version field specifies the operating system version, for example 10.0.10586.\n\tOsVersion *string `json:\"os.version,omitempty\"`\n\t// OsFeatures - The optional os.features field specifies an array of strings, each listing a required OS feature (for example on Windows win32k\n\tOsFeatures *[]string `json:\"os.features,omitempty\"`\n\t// Variant - The optional variant field specifies a variant of the CPU, for example armv6l to specify a particular CPU variant of the ARM CPU.\n\tVariant *string `json:\"variant,omitempty\"`\n\t// Features - The optional features field specifies an array of strings, each listing a required CPU feature (for example sse4 or aes\n\tFeatures *[]string `json:\"features,omitempty\"`\n}\n\n// ReadCloser ...\ntype ReadCloser struct {\n\tautorest.Response `json:\"-\"`\n\tValue             *io.ReadCloser `json:\"value,omitempty\"`\n}\n\n// RefreshToken ...\ntype RefreshToken struct {\n\tautorest.Response `json:\"-\"`\n\t// RefreshToken - The refresh token to be used for generating access tokens\n\tRefreshToken *string `json:\"refresh_token,omitempty\"`\n}\n\n// Repositories list of repositories\ntype Repositories struct {\n\tautorest.Response `json:\"-\"`\n\t// Names - Repository names\n\tNames *[]string `json:\"repositories,omitempty\"`\n}\n\n// RepositoryAttributes repository attributes\ntype RepositoryAttributes struct {\n\tautorest.Response `json:\"-\"`\n\t// Registry - Registry name\n\tRegistry *string `json:\"registry,omitempty\"`\n\t// ImageName - Image name\n\tImageName *string `json:\"imageName,omitempty\"`\n\t// CreatedTime - Image created time\n\tCreatedTime *string `json:\"createdTime,omitempty\"`\n\t// LastUpdateTime - Image last update time\n\tLastUpdateTime *string `json:\"lastUpdateTime,omitempty\"`\n\t// ManifestCount - Number of the manifests\n\tManifestCount *int32 `json:\"manifestCount,omitempty\"`\n\t// TagCount - Number of the tags\n\tTagCount *int32 `json:\"tagCount,omitempty\"`\n\t// ChangeableAttributes - Changeable attributes\n\tChangeableAttributes *ChangeableAttributes `json:\"changeableAttributes,omitempty\"`\n}\n\n// RepositoryTags result of the request to list tags of the image\ntype RepositoryTags struct {\n\t// Name - Name of the image\n\tName *string `json:\"name,omitempty\"`\n\t// Tags - List of tags\n\tTags *[]string `json:\"tags,omitempty\"`\n}\n\n// SetObject ...\ntype SetObject struct {\n\tautorest.Response `json:\"-\"`\n\tValue             interface{} `json:\"value,omitempty\"`\n}\n\n// TagAttributes tag attributes\ntype TagAttributes struct {\n\tautorest.Response `json:\"-\"`\n\t// Registry - Registry name\n\tRegistry *string `json:\"registry,omitempty\"`\n\t// ImageName - Image name\n\tImageName *string `json:\"imageName,omitempty\"`\n\t// Attributes - List of tag attribute details\n\tAttributes *TagAttributesBase `json:\"tag,omitempty\"`\n}\n\n// TagAttributesBase tag attribute details\ntype TagAttributesBase struct {\n\t// Name - Tag name\n\tName *string `json:\"name,omitempty\"`\n\t// Digest - Tag digest\n\tDigest *string `json:\"digest,omitempty\"`\n\t// CreatedTime - Tag created time\n\tCreatedTime *string `json:\"createdTime,omitempty\"`\n\t// LastUpdateTime - Tag last update time\n\tLastUpdateTime *string `json:\"lastUpdateTime,omitempty\"`\n\t// Signed - Is signed\n\tSigned *bool `json:\"signed,omitempty\"`\n\t// ChangeableAttributes - Changeable attributes\n\tChangeableAttributes *ChangeableAttributes `json:\"changeableAttributes,omitempty\"`\n}\n\n// TagAttributesTag tag\ntype TagAttributesTag struct {\n\t// SignatureRecord - SignatureRecord value\n\tSignatureRecord *string `json:\"signatureRecord,omitempty\"`\n}\n\n// TagList list of tag details\ntype TagList struct {\n\tautorest.Response `json:\"-\"`\n\t// Registry - Registry name\n\tRegistry *string `json:\"registry,omitempty\"`\n\t// ImageName - Image name\n\tImageName *string `json:\"imageName,omitempty\"`\n\t// Tags - List of tag attribute details\n\tTags *[]TagAttributesBase `json:\"tags,omitempty\"`\n}\n\n// V1Manifest returns the requested V1 manifest file\ntype V1Manifest struct {\n\t// Architecture - CPU architecture\n\tArchitecture *string `json:\"architecture,omitempty\"`\n\t// Name - Image name\n\tName *string `json:\"name,omitempty\"`\n\t// Tag - Image tag\n\tTag *string `json:\"tag,omitempty\"`\n\t// FsLayers - List of layer information\n\tFsLayers *[]FsLayer `json:\"fsLayers,omitempty\"`\n\t// History - Image history\n\tHistory *[]History `json:\"history,omitempty\"`\n\t// Signatures - Image signature\n\tSignatures *[]ImageSignature `json:\"signatures,omitempty\"`\n\t// SchemaVersion - Schema version\n\tSchemaVersion *int32 `json:\"schemaVersion,omitempty\"`\n}\n\n// V2Manifest returns the requested Docker V2 Manifest file\ntype V2Manifest struct {\n\t// MediaType - Media type for this Manifest\n\tMediaType *string `json:\"mediaType,omitempty\"`\n\t// Config - V2 image config descriptor\n\tConfig *Descriptor `json:\"config,omitempty\"`\n\t// Layers - List of V2 image layer information\n\tLayers *[]Descriptor `json:\"layers,omitempty\"`\n\t// SchemaVersion - Schema version\n\tSchemaVersion *int32 `json:\"schemaVersion,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/refreshtokens.go",
    "content": "package containerregistry\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n//\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"context\"\n\t\"github.com/Azure/go-autorest/autorest\"\n\t\"github.com/Azure/go-autorest/autorest/azure\"\n\t\"github.com/Azure/go-autorest/tracing\"\n\t\"net/http\"\n)\n\n// RefreshTokensClient is the metadata API definition for the Azure Container Registry runtime\ntype RefreshTokensClient struct {\n\tBaseClient\n}\n\n// NewRefreshTokensClient creates an instance of the RefreshTokensClient client.\nfunc NewRefreshTokensClient(loginURI string) RefreshTokensClient {\n\treturn RefreshTokensClient{New(loginURI)}\n}\n\n// GetFromExchange exchange AAD tokens for an ACR refresh Token\n// Parameters:\n// grantType - can take a value of access_token_refresh_token, or access_token, or refresh_token\n// service - indicates the name of your Azure container registry.\n// tenant - AAD tenant associated to the AAD credentials.\n// refreshToken - AAD refresh token, mandatory when grant_type is access_token_refresh_token or refresh_token\n// accessToken - AAD access token, mandatory when grant_type is access_token_refresh_token or access_token.\nfunc (client RefreshTokensClient) GetFromExchange(ctx context.Context, grantType string, service string, tenant string, refreshToken string, accessToken string) (result RefreshToken, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/RefreshTokensClient.GetFromExchange\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response.Response != nil {\n\t\t\t\tsc = result.Response.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.GetFromExchangePreparer(ctx, grantType, service, tenant, refreshToken, accessToken)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.RefreshTokensClient\", \"GetFromExchange\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.GetFromExchangeSender(req)\n\tif err != nil {\n\t\tresult.Response = autorest.Response{Response: resp}\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.RefreshTokensClient\", \"GetFromExchange\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.GetFromExchangeResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.RefreshTokensClient\", \"GetFromExchange\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// GetFromExchangePreparer prepares the GetFromExchange request.\nfunc (client RefreshTokensClient) GetFromExchangePreparer(ctx context.Context, grantType string, service string, tenant string, refreshToken string, accessToken string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tformDataParameters := map[string]interface{}{\n\t\t\"grant_type\": grantType,\n\t\t\"service\":    service,\n\t}\n\tif len(tenant) > 0 {\n\t\tformDataParameters[\"tenant\"] = tenant\n\t}\n\tif len(refreshToken) > 0 {\n\t\tformDataParameters[\"refresh_token\"] = refreshToken\n\t}\n\tif len(accessToken) > 0 {\n\t\tformDataParameters[\"access_token\"] = accessToken\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsPost(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPath(\"/oauth2/exchange\"),\n\t\tautorest.WithFormData(autorest.MapToValues(formDataParameters)))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// GetFromExchangeSender sends the GetFromExchange request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client RefreshTokensClient) GetFromExchangeSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// GetFromExchangeResponder handles the response to the GetFromExchange request. The method always\n// closes the http.Response Body.\nfunc (client RefreshTokensClient) GetFromExchangeResponder(resp *http.Response) (result RefreshToken, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK),\n\t\tautorest.ByUnmarshallingJSON(&result),\n\t\tautorest.ByClosing())\n\tresult.Response = autorest.Response{Response: resp}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/repository.go",
    "content": "package containerregistry\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n//\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"context\"\n\t\"github.com/Azure/go-autorest/autorest\"\n\t\"github.com/Azure/go-autorest/autorest/azure\"\n\t\"github.com/Azure/go-autorest/tracing\"\n\t\"net/http\"\n)\n\n// RepositoryClient is the metadata API definition for the Azure Container Registry runtime\ntype RepositoryClient struct {\n\tBaseClient\n}\n\n// NewRepositoryClient creates an instance of the RepositoryClient client.\nfunc NewRepositoryClient(loginURI string) RepositoryClient {\n\treturn RepositoryClient{New(loginURI)}\n}\n\n// Delete delete the repository identified by `name`\n// Parameters:\n// name - name of the image (including the namespace)\nfunc (client RepositoryClient) Delete(ctx context.Context, name string) (result DeletedRepository, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/RepositoryClient.Delete\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response.Response != nil {\n\t\t\t\tsc = result.Response.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.DeletePreparer(ctx, name)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.RepositoryClient\", \"Delete\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.DeleteSender(req)\n\tif err != nil {\n\t\tresult.Response = autorest.Response{Response: resp}\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.RepositoryClient\", \"Delete\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.DeleteResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.RepositoryClient\", \"Delete\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// DeletePreparer prepares the Delete request.\nfunc (client RepositoryClient) DeletePreparer(ctx context.Context, name string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"name\": autorest.Encode(\"path\", name),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsDelete(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/acr/v1/{name}\", pathParameters))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// DeleteSender sends the Delete request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client RepositoryClient) DeleteSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// DeleteResponder handles the response to the Delete request. The method always\n// closes the http.Response Body.\nfunc (client RepositoryClient) DeleteResponder(resp *http.Response) (result DeletedRepository, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted),\n\t\tautorest.ByUnmarshallingJSON(&result),\n\t\tautorest.ByClosing())\n\tresult.Response = autorest.Response{Response: resp}\n\treturn\n}\n\n// GetAttributes get repository attributes\n// Parameters:\n// name - name of the image (including the namespace)\nfunc (client RepositoryClient) GetAttributes(ctx context.Context, name string) (result RepositoryAttributes, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/RepositoryClient.GetAttributes\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response.Response != nil {\n\t\t\t\tsc = result.Response.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.GetAttributesPreparer(ctx, name)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.RepositoryClient\", \"GetAttributes\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.GetAttributesSender(req)\n\tif err != nil {\n\t\tresult.Response = autorest.Response{Response: resp}\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.RepositoryClient\", \"GetAttributes\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.GetAttributesResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.RepositoryClient\", \"GetAttributes\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// GetAttributesPreparer prepares the GetAttributes request.\nfunc (client RepositoryClient) GetAttributesPreparer(ctx context.Context, name string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"name\": autorest.Encode(\"path\", name),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsGet(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/acr/v1/{name}\", pathParameters))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// GetAttributesSender sends the GetAttributes request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client RepositoryClient) GetAttributesSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// GetAttributesResponder handles the response to the GetAttributes request. The method always\n// closes the http.Response Body.\nfunc (client RepositoryClient) GetAttributesResponder(resp *http.Response) (result RepositoryAttributes, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK),\n\t\tautorest.ByUnmarshallingJSON(&result),\n\t\tautorest.ByClosing())\n\tresult.Response = autorest.Response{Response: resp}\n\treturn\n}\n\n// GetList list repositories\n// Parameters:\n// last - query parameter for the last item in previous query. Result set will include values lexically after\n// last.\n// n - query parameter for max number of items\nfunc (client RepositoryClient) GetList(ctx context.Context, last string, n *int32) (result Repositories, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/RepositoryClient.GetList\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response.Response != nil {\n\t\t\t\tsc = result.Response.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.GetListPreparer(ctx, last, n)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.RepositoryClient\", \"GetList\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.GetListSender(req)\n\tif err != nil {\n\t\tresult.Response = autorest.Response{Response: resp}\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.RepositoryClient\", \"GetList\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.GetListResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.RepositoryClient\", \"GetList\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// GetListPreparer prepares the GetList request.\nfunc (client RepositoryClient) GetListPreparer(ctx context.Context, last string, n *int32) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tqueryParameters := map[string]interface{}{}\n\tif len(last) > 0 {\n\t\tqueryParameters[\"last\"] = autorest.Encode(\"query\", last)\n\t}\n\tif n != nil {\n\t\tqueryParameters[\"n\"] = autorest.Encode(\"query\", *n)\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsGet(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPath(\"/acr/v1/_catalog\"),\n\t\tautorest.WithQueryParameters(queryParameters))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// GetListSender sends the GetList request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client RepositoryClient) GetListSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// GetListResponder handles the response to the GetList request. The method always\n// closes the http.Response Body.\nfunc (client RepositoryClient) GetListResponder(resp *http.Response) (result Repositories, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK),\n\t\tautorest.ByUnmarshallingJSON(&result),\n\t\tautorest.ByClosing())\n\tresult.Response = autorest.Response{Response: resp}\n\treturn\n}\n\n// UpdateAttributes update the attribute identified by `name` where `reference` is the name of the repository.\n// Parameters:\n// name - name of the image (including the namespace)\n// value - repository attribute value\nfunc (client RepositoryClient) UpdateAttributes(ctx context.Context, name string, value *ChangeableAttributes) (result autorest.Response, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/RepositoryClient.UpdateAttributes\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response != nil {\n\t\t\t\tsc = result.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.UpdateAttributesPreparer(ctx, name, value)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.RepositoryClient\", \"UpdateAttributes\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.UpdateAttributesSender(req)\n\tif err != nil {\n\t\tresult.Response = resp\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.RepositoryClient\", \"UpdateAttributes\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.UpdateAttributesResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.RepositoryClient\", \"UpdateAttributes\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// UpdateAttributesPreparer prepares the UpdateAttributes request.\nfunc (client RepositoryClient) UpdateAttributesPreparer(ctx context.Context, name string, value *ChangeableAttributes) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"name\": autorest.Encode(\"path\", name),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsContentType(\"application/json; charset=utf-8\"),\n\t\tautorest.AsPatch(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/acr/v1/{name}\", pathParameters))\n\tif value != nil {\n\t\tpreparer = autorest.DecoratePreparer(preparer,\n\t\t\tautorest.WithJSON(value))\n\t}\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// UpdateAttributesSender sends the UpdateAttributes request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client RepositoryClient) UpdateAttributesSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// UpdateAttributesResponder handles the response to the UpdateAttributes request. The method always\n// closes the http.Response Body.\nfunc (client RepositoryClient) UpdateAttributesResponder(resp *http.Response) (result autorest.Response, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK),\n\t\tautorest.ByClosing())\n\tresult.Response = resp\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/tag.go",
    "content": "package containerregistry\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n//\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"context\"\n\t\"github.com/Azure/go-autorest/autorest\"\n\t\"github.com/Azure/go-autorest/autorest/azure\"\n\t\"github.com/Azure/go-autorest/tracing\"\n\t\"net/http\"\n)\n\n// TagClient is the metadata API definition for the Azure Container Registry runtime\ntype TagClient struct {\n\tBaseClient\n}\n\n// NewTagClient creates an instance of the TagClient client.\nfunc NewTagClient(loginURI string) TagClient {\n\treturn TagClient{New(loginURI)}\n}\n\n// Delete delete tag\n// Parameters:\n// name - name of the image (including the namespace)\n// reference - tag name\nfunc (client TagClient) Delete(ctx context.Context, name string, reference string) (result autorest.Response, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/TagClient.Delete\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response != nil {\n\t\t\t\tsc = result.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.DeletePreparer(ctx, name, reference)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.TagClient\", \"Delete\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.DeleteSender(req)\n\tif err != nil {\n\t\tresult.Response = resp\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.TagClient\", \"Delete\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.DeleteResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.TagClient\", \"Delete\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// DeletePreparer prepares the Delete request.\nfunc (client TagClient) DeletePreparer(ctx context.Context, name string, reference string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"name\":      autorest.Encode(\"path\", name),\n\t\t\"reference\": autorest.Encode(\"path\", reference),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsDelete(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/acr/v1/{name}/_tags/{reference}\", pathParameters))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// DeleteSender sends the Delete request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client TagClient) DeleteSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// DeleteResponder handles the response to the Delete request. The method always\n// closes the http.Response Body.\nfunc (client TagClient) DeleteResponder(resp *http.Response) (result autorest.Response, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted),\n\t\tautorest.ByClosing())\n\tresult.Response = resp\n\treturn\n}\n\n// GetAttributes get tag attributes by tag\n// Parameters:\n// name - name of the image (including the namespace)\n// reference - tag name\nfunc (client TagClient) GetAttributes(ctx context.Context, name string, reference string) (result TagAttributes, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/TagClient.GetAttributes\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response.Response != nil {\n\t\t\t\tsc = result.Response.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.GetAttributesPreparer(ctx, name, reference)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.TagClient\", \"GetAttributes\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.GetAttributesSender(req)\n\tif err != nil {\n\t\tresult.Response = autorest.Response{Response: resp}\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.TagClient\", \"GetAttributes\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.GetAttributesResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.TagClient\", \"GetAttributes\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// GetAttributesPreparer prepares the GetAttributes request.\nfunc (client TagClient) GetAttributesPreparer(ctx context.Context, name string, reference string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"name\":      autorest.Encode(\"path\", name),\n\t\t\"reference\": autorest.Encode(\"path\", reference),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsGet(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/acr/v1/{name}/_tags/{reference}\", pathParameters))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// GetAttributesSender sends the GetAttributes request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client TagClient) GetAttributesSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// GetAttributesResponder handles the response to the GetAttributes request. The method always\n// closes the http.Response Body.\nfunc (client TagClient) GetAttributesResponder(resp *http.Response) (result TagAttributes, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK),\n\t\tautorest.ByUnmarshallingJSON(&result),\n\t\tautorest.ByClosing())\n\tresult.Response = autorest.Response{Response: resp}\n\treturn\n}\n\n// GetList list tags of a repository\n// Parameters:\n// name - name of the image (including the namespace)\n// last - query parameter for the last item in previous query. Result set will include values lexically after\n// last.\n// n - query parameter for max number of items\n// orderby - orderby query parameter\n// digest - filter by digest\nfunc (client TagClient) GetList(ctx context.Context, name string, last string, n *int32, orderby string, digest string) (result TagList, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/TagClient.GetList\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response.Response != nil {\n\t\t\t\tsc = result.Response.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.GetListPreparer(ctx, name, last, n, orderby, digest)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.TagClient\", \"GetList\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.GetListSender(req)\n\tif err != nil {\n\t\tresult.Response = autorest.Response{Response: resp}\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.TagClient\", \"GetList\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.GetListResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.TagClient\", \"GetList\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// GetListPreparer prepares the GetList request.\nfunc (client TagClient) GetListPreparer(ctx context.Context, name string, last string, n *int32, orderby string, digest string) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"name\": autorest.Encode(\"path\", name),\n\t}\n\n\tqueryParameters := map[string]interface{}{}\n\tif len(last) > 0 {\n\t\tqueryParameters[\"last\"] = autorest.Encode(\"query\", last)\n\t}\n\tif n != nil {\n\t\tqueryParameters[\"n\"] = autorest.Encode(\"query\", *n)\n\t}\n\tif len(orderby) > 0 {\n\t\tqueryParameters[\"orderby\"] = autorest.Encode(\"query\", orderby)\n\t}\n\tif len(digest) > 0 {\n\t\tqueryParameters[\"digest\"] = autorest.Encode(\"query\", digest)\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsGet(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/acr/v1/{name}/_tags\", pathParameters),\n\t\tautorest.WithQueryParameters(queryParameters))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// GetListSender sends the GetList request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client TagClient) GetListSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// GetListResponder handles the response to the GetList request. The method always\n// closes the http.Response Body.\nfunc (client TagClient) GetListResponder(resp *http.Response) (result TagList, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK),\n\t\tautorest.ByUnmarshallingJSON(&result),\n\t\tautorest.ByClosing())\n\tresult.Response = autorest.Response{Response: resp}\n\treturn\n}\n\n// UpdateAttributes update tag attributes\n// Parameters:\n// name - name of the image (including the namespace)\n// reference - tag name\n// value - repository attribute value\nfunc (client TagClient) UpdateAttributes(ctx context.Context, name string, reference string, value *ChangeableAttributes) (result autorest.Response, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/TagClient.UpdateAttributes\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response != nil {\n\t\t\t\tsc = result.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.UpdateAttributesPreparer(ctx, name, reference, value)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.TagClient\", \"UpdateAttributes\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.UpdateAttributesSender(req)\n\tif err != nil {\n\t\tresult.Response = resp\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.TagClient\", \"UpdateAttributes\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.UpdateAttributesResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.TagClient\", \"UpdateAttributes\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// UpdateAttributesPreparer prepares the UpdateAttributes request.\nfunc (client TagClient) UpdateAttributesPreparer(ctx context.Context, name string, reference string, value *ChangeableAttributes) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpathParameters := map[string]interface{}{\n\t\t\"name\":      autorest.Encode(\"path\", name),\n\t\t\"reference\": autorest.Encode(\"path\", reference),\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsContentType(\"application/json; charset=utf-8\"),\n\t\tautorest.AsPatch(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPathParameters(\"/acr/v1/{name}/_tags/{reference}\", pathParameters))\n\tif value != nil {\n\t\tpreparer = autorest.DecoratePreparer(preparer,\n\t\t\tautorest.WithJSON(value))\n\t}\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// UpdateAttributesSender sends the UpdateAttributes request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client TagClient) UpdateAttributesSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// UpdateAttributesResponder handles the response to the UpdateAttributes request. The method always\n// closes the http.Response Body.\nfunc (client TagClient) UpdateAttributesResponder(resp *http.Response) (result autorest.Response, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK),\n\t\tautorest.ByClosing())\n\tresult.Response = resp\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/v2support.go",
    "content": "package containerregistry\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n//\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"context\"\n\t\"github.com/Azure/go-autorest/autorest\"\n\t\"github.com/Azure/go-autorest/autorest/azure\"\n\t\"github.com/Azure/go-autorest/tracing\"\n\t\"net/http\"\n)\n\n// V2SupportClient is the metadata API definition for the Azure Container Registry runtime\ntype V2SupportClient struct {\n\tBaseClient\n}\n\n// NewV2SupportClient creates an instance of the V2SupportClient client.\nfunc NewV2SupportClient(loginURI string) V2SupportClient {\n\treturn V2SupportClient{New(loginURI)}\n}\n\n// Check tells whether this Docker Registry instance supports Docker Registry HTTP API v2\nfunc (client V2SupportClient) Check(ctx context.Context) (result autorest.Response, err error) {\n\tif tracing.IsEnabled() {\n\t\tctx = tracing.StartSpan(ctx, fqdn+\"/V2SupportClient.Check\")\n\t\tdefer func() {\n\t\t\tsc := -1\n\t\t\tif result.Response != nil {\n\t\t\t\tsc = result.Response.StatusCode\n\t\t\t}\n\t\t\ttracing.EndSpan(ctx, sc, err)\n\t\t}()\n\t}\n\treq, err := client.CheckPreparer(ctx)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.V2SupportClient\", \"Check\", nil, \"Failure preparing request\")\n\t\treturn\n\t}\n\n\tresp, err := client.CheckSender(req)\n\tif err != nil {\n\t\tresult.Response = resp\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.V2SupportClient\", \"Check\", resp, \"Failure sending request\")\n\t\treturn\n\t}\n\n\tresult, err = client.CheckResponder(resp)\n\tif err != nil {\n\t\terr = autorest.NewErrorWithError(err, \"containerregistry.V2SupportClient\", \"Check\", resp, \"Failure responding to request\")\n\t\treturn\n\t}\n\n\treturn\n}\n\n// CheckPreparer prepares the Check request.\nfunc (client V2SupportClient) CheckPreparer(ctx context.Context) (*http.Request, error) {\n\turlParameters := map[string]interface{}{\n\t\t\"url\": client.LoginURI,\n\t}\n\n\tpreparer := autorest.CreatePreparer(\n\t\tautorest.AsGet(),\n\t\tautorest.WithCustomBaseURL(\"{url}\", urlParameters),\n\t\tautorest.WithPath(\"/v2/\"))\n\treturn preparer.Prepare((&http.Request{}).WithContext(ctx))\n}\n\n// CheckSender sends the Check request. The method will close the\n// http.Response Body if it receives an error.\nfunc (client V2SupportClient) CheckSender(req *http.Request) (*http.Response, error) {\n\treturn client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))\n}\n\n// CheckResponder handles the response to the Check request. The method always\n// closes the http.Response Body.\nfunc (client V2SupportClient) CheckResponder(resp *http.Response) (result autorest.Response, err error) {\n\terr = autorest.Respond(\n\t\tresp,\n\t\tazure.WithErrorUnlessStatusCode(http.StatusOK),\n\t\tautorest.ByClosing())\n\tresult.Response = resp\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/version.go",
    "content": "package containerregistry\n\nimport \"github.com/Azure/azure-sdk-for-go/version\"\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n//\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\n// UserAgent returns the UserAgent string to use when sending http.Requests.\nfunc UserAgent() string {\n\treturn \"Azure-SDK-For-Go/\" + Version() + \" containerregistry/2019-08-15-preview\"\n}\n\n// Version returns the semantic version (see http://semver.org) of the client.\nfunc Version() string {\n\treturn version.Number\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/version/version.go",
    "content": "package version\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See License.txt in the project root for license information.\n\n// Number contains the semantic version of this SDK.\nconst Number = \"v68.0.0\"\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Microsoft Corporation\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\nall copies 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\nTHE SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/README.md",
    "content": "# go-ansiterm\n\nThis is a cross platform Ansi Terminal Emulation library.  It reads a stream of Ansi characters and produces the appropriate function calls.  The results of the function calls are platform dependent.\n\nFor example the parser might receive \"ESC, [, A\" as a stream of three characters.  This is the code for Cursor Up (http://www.vt100.net/docs/vt510-rm/CUU).  The parser then calls the cursor up function (CUU()) on an event handler.  The event handler determines what platform specific work must be done to cause the cursor to move up one position.\n\nThe parser (parser.go) is a partial implementation of this state machine (http://vt100.net/emu/vt500_parser.png).  There are also two event handler implementations, one for tests (test_event_handler.go) to validate that the expected events are being produced and called, the other is a Windows implementation (winterm/win_event_handler.go).\n\nSee parser_test.go for examples exercising the state machine and generating appropriate function calls.\n\n-----\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/SECURITY.md",
    "content": "<!-- BEGIN MICROSOFT SECURITY.MD V0.0.8 BLOCK -->\n\n## Security\n\nMicrosoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).\n\nIf you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.\n\n## Reporting Security Issues\n\n**Please do not report security vulnerabilities through public GitHub issues.**\n\nInstead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).\n\nIf you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com).  If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).\n\nYou should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). \n\nPlease include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:\n\n  * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)\n  * Full paths of source file(s) related to the manifestation of the issue\n  * The location of the affected source code (tag/branch/commit or direct URL)\n  * Any special configuration required to reproduce the issue\n  * Step-by-step instructions to reproduce the issue\n  * Proof-of-concept or exploit code (if possible)\n  * Impact of the issue, including how an attacker might exploit the issue\n\nThis information will help us triage your report more quickly.\n\nIf you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.\n\n## Preferred Languages\n\nWe prefer all communications to be in English.\n\n## Policy\n\nMicrosoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).\n\n<!-- END MICROSOFT SECURITY.MD BLOCK -->\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/constants.go",
    "content": "package ansiterm\n\nconst LogEnv = \"DEBUG_TERMINAL\"\n\n// ANSI constants\n// References:\n// -- http://www.ecma-international.org/publications/standards/Ecma-048.htm\n// -- http://man7.org/linux/man-pages/man4/console_codes.4.html\n// -- http://manpages.ubuntu.com/manpages/intrepid/man4/console_codes.4.html\n// -- http://en.wikipedia.org/wiki/ANSI_escape_code\n// -- http://vt100.net/emu/dec_ansi_parser\n// -- http://vt100.net/emu/vt500_parser.svg\n// -- http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n// -- http://www.inwap.com/pdp10/ansicode.txt\nconst (\n\t// ECMA-48 Set Graphics Rendition\n\t// Note:\n\t// -- Constants leading with an underscore (e.g., _ANSI_xxx) are unsupported or reserved\n\t// -- Fonts could possibly be supported via SetCurrentConsoleFontEx\n\t// -- Windows does not expose the per-window cursor (i.e., caret) blink times\n\tANSI_SGR_RESET              = 0\n\tANSI_SGR_BOLD               = 1\n\tANSI_SGR_DIM                = 2\n\t_ANSI_SGR_ITALIC            = 3\n\tANSI_SGR_UNDERLINE          = 4\n\t_ANSI_SGR_BLINKSLOW         = 5\n\t_ANSI_SGR_BLINKFAST         = 6\n\tANSI_SGR_REVERSE            = 7\n\t_ANSI_SGR_INVISIBLE         = 8\n\t_ANSI_SGR_LINETHROUGH       = 9\n\t_ANSI_SGR_FONT_00           = 10\n\t_ANSI_SGR_FONT_01           = 11\n\t_ANSI_SGR_FONT_02           = 12\n\t_ANSI_SGR_FONT_03           = 13\n\t_ANSI_SGR_FONT_04           = 14\n\t_ANSI_SGR_FONT_05           = 15\n\t_ANSI_SGR_FONT_06           = 16\n\t_ANSI_SGR_FONT_07           = 17\n\t_ANSI_SGR_FONT_08           = 18\n\t_ANSI_SGR_FONT_09           = 19\n\t_ANSI_SGR_FONT_10           = 20\n\t_ANSI_SGR_DOUBLEUNDERLINE   = 21\n\tANSI_SGR_BOLD_DIM_OFF       = 22\n\t_ANSI_SGR_ITALIC_OFF        = 23\n\tANSI_SGR_UNDERLINE_OFF      = 24\n\t_ANSI_SGR_BLINK_OFF         = 25\n\t_ANSI_SGR_RESERVED_00       = 26\n\tANSI_SGR_REVERSE_OFF        = 27\n\t_ANSI_SGR_INVISIBLE_OFF     = 28\n\t_ANSI_SGR_LINETHROUGH_OFF   = 29\n\tANSI_SGR_FOREGROUND_BLACK   = 30\n\tANSI_SGR_FOREGROUND_RED     = 31\n\tANSI_SGR_FOREGROUND_GREEN   = 32\n\tANSI_SGR_FOREGROUND_YELLOW  = 33\n\tANSI_SGR_FOREGROUND_BLUE    = 34\n\tANSI_SGR_FOREGROUND_MAGENTA = 35\n\tANSI_SGR_FOREGROUND_CYAN    = 36\n\tANSI_SGR_FOREGROUND_WHITE   = 37\n\t_ANSI_SGR_RESERVED_01       = 38\n\tANSI_SGR_FOREGROUND_DEFAULT = 39\n\tANSI_SGR_BACKGROUND_BLACK   = 40\n\tANSI_SGR_BACKGROUND_RED     = 41\n\tANSI_SGR_BACKGROUND_GREEN   = 42\n\tANSI_SGR_BACKGROUND_YELLOW  = 43\n\tANSI_SGR_BACKGROUND_BLUE    = 44\n\tANSI_SGR_BACKGROUND_MAGENTA = 45\n\tANSI_SGR_BACKGROUND_CYAN    = 46\n\tANSI_SGR_BACKGROUND_WHITE   = 47\n\t_ANSI_SGR_RESERVED_02       = 48\n\tANSI_SGR_BACKGROUND_DEFAULT = 49\n\t// 50 - 65: Unsupported\n\n\tANSI_MAX_CMD_LENGTH = 4096\n\n\tMAX_INPUT_EVENTS = 128\n\tDEFAULT_WIDTH    = 80\n\tDEFAULT_HEIGHT   = 24\n\n\tANSI_BEL              = 0x07\n\tANSI_BACKSPACE        = 0x08\n\tANSI_TAB              = 0x09\n\tANSI_LINE_FEED        = 0x0A\n\tANSI_VERTICAL_TAB     = 0x0B\n\tANSI_FORM_FEED        = 0x0C\n\tANSI_CARRIAGE_RETURN  = 0x0D\n\tANSI_ESCAPE_PRIMARY   = 0x1B\n\tANSI_ESCAPE_SECONDARY = 0x5B\n\tANSI_OSC_STRING_ENTRY = 0x5D\n\tANSI_COMMAND_FIRST    = 0x40\n\tANSI_COMMAND_LAST     = 0x7E\n\tDCS_ENTRY             = 0x90\n\tCSI_ENTRY             = 0x9B\n\tOSC_STRING            = 0x9D\n\tANSI_PARAMETER_SEP    = \";\"\n\tANSI_CMD_G0           = '('\n\tANSI_CMD_G1           = ')'\n\tANSI_CMD_G2           = '*'\n\tANSI_CMD_G3           = '+'\n\tANSI_CMD_DECPNM       = '>'\n\tANSI_CMD_DECPAM       = '='\n\tANSI_CMD_OSC          = ']'\n\tANSI_CMD_STR_TERM     = '\\\\'\n\n\tKEY_CONTROL_PARAM_2 = \";2\"\n\tKEY_CONTROL_PARAM_3 = \";3\"\n\tKEY_CONTROL_PARAM_4 = \";4\"\n\tKEY_CONTROL_PARAM_5 = \";5\"\n\tKEY_CONTROL_PARAM_6 = \";6\"\n\tKEY_CONTROL_PARAM_7 = \";7\"\n\tKEY_CONTROL_PARAM_8 = \";8\"\n\tKEY_ESC_CSI         = \"\\x1B[\"\n\tKEY_ESC_N           = \"\\x1BN\"\n\tKEY_ESC_O           = \"\\x1BO\"\n\n\tFILL_CHARACTER = ' '\n)\n\nfunc getByteRange(start byte, end byte) []byte {\n\tbytes := make([]byte, 0, 32)\n\tfor i := start; i <= end; i++ {\n\t\tbytes = append(bytes, byte(i))\n\t}\n\n\treturn bytes\n}\n\nvar toGroundBytes = getToGroundBytes()\nvar executors = getExecuteBytes()\n\n// SPACE\t\t  20+A0 hex  Always and everywhere a blank space\n// Intermediate\t  20-2F hex   !\"#$%&'()*+,-./\nvar intermeds = getByteRange(0x20, 0x2F)\n\n// Parameters\t  30-3F hex  0123456789:;<=>?\n// CSI Parameters 30-39, 3B hex 0123456789;\nvar csiParams = getByteRange(0x30, 0x3F)\n\nvar csiCollectables = append(getByteRange(0x30, 0x39), getByteRange(0x3B, 0x3F)...)\n\n// Uppercase\t  40-5F hex  @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\nvar upperCase = getByteRange(0x40, 0x5F)\n\n// Lowercase\t  60-7E hex  `abcdefghijlkmnopqrstuvwxyz{|}~\nvar lowerCase = getByteRange(0x60, 0x7E)\n\n// Alphabetics\t  40-7E hex  (all of upper and lower case)\nvar alphabetics = append(upperCase, lowerCase...)\n\nvar printables = getByteRange(0x20, 0x7F)\n\nvar escapeIntermediateToGroundBytes = getByteRange(0x30, 0x7E)\nvar escapeToGroundBytes = getEscapeToGroundBytes()\n\n// See http://www.vt100.net/emu/vt500_parser.png for description of the complex\n// byte ranges below\n\nfunc getEscapeToGroundBytes() []byte {\n\tescapeToGroundBytes := getByteRange(0x30, 0x4F)\n\tescapeToGroundBytes = append(escapeToGroundBytes, getByteRange(0x51, 0x57)...)\n\tescapeToGroundBytes = append(escapeToGroundBytes, 0x59)\n\tescapeToGroundBytes = append(escapeToGroundBytes, 0x5A)\n\tescapeToGroundBytes = append(escapeToGroundBytes, 0x5C)\n\tescapeToGroundBytes = append(escapeToGroundBytes, getByteRange(0x60, 0x7E)...)\n\treturn escapeToGroundBytes\n}\n\nfunc getExecuteBytes() []byte {\n\texecuteBytes := getByteRange(0x00, 0x17)\n\texecuteBytes = append(executeBytes, 0x19)\n\texecuteBytes = append(executeBytes, getByteRange(0x1C, 0x1F)...)\n\treturn executeBytes\n}\n\nfunc getToGroundBytes() []byte {\n\tgroundBytes := []byte{0x18}\n\tgroundBytes = append(groundBytes, 0x1A)\n\tgroundBytes = append(groundBytes, getByteRange(0x80, 0x8F)...)\n\tgroundBytes = append(groundBytes, getByteRange(0x91, 0x97)...)\n\tgroundBytes = append(groundBytes, 0x99)\n\tgroundBytes = append(groundBytes, 0x9A)\n\tgroundBytes = append(groundBytes, 0x9C)\n\treturn groundBytes\n}\n\n// Delete\t\t     7F hex  Always and everywhere ignored\n// C1 Control\t  80-9F hex  32 additional control characters\n// G1 Displayable A1-FE hex  94 additional displayable characters\n// Special\t\t  A0+FF hex  Same as SPACE and DELETE\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/context.go",
    "content": "package ansiterm\n\ntype ansiContext struct {\n\tcurrentChar byte\n\tparamBuffer []byte\n\tinterBuffer []byte\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/csi_entry_state.go",
    "content": "package ansiterm\n\ntype csiEntryState struct {\n\tbaseState\n}\n\nfunc (csiState csiEntryState) Handle(b byte) (s state, e error) {\n\tcsiState.parser.logf(\"CsiEntry::Handle %#x\", b)\n\n\tnextState, err := csiState.baseState.Handle(b)\n\tif nextState != nil || err != nil {\n\t\treturn nextState, err\n\t}\n\n\tswitch {\n\tcase sliceContains(alphabetics, b):\n\t\treturn csiState.parser.ground, nil\n\tcase sliceContains(csiCollectables, b):\n\t\treturn csiState.parser.csiParam, nil\n\tcase sliceContains(executors, b):\n\t\treturn csiState, csiState.parser.execute()\n\t}\n\n\treturn csiState, nil\n}\n\nfunc (csiState csiEntryState) Transition(s state) error {\n\tcsiState.parser.logf(\"CsiEntry::Transition %s --> %s\", csiState.Name(), s.Name())\n\tcsiState.baseState.Transition(s)\n\n\tswitch s {\n\tcase csiState.parser.ground:\n\t\treturn csiState.parser.csiDispatch()\n\tcase csiState.parser.csiParam:\n\t\tswitch {\n\t\tcase sliceContains(csiParams, csiState.parser.context.currentChar):\n\t\t\tcsiState.parser.collectParam()\n\t\tcase sliceContains(intermeds, csiState.parser.context.currentChar):\n\t\t\tcsiState.parser.collectInter()\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (csiState csiEntryState) Enter() error {\n\tcsiState.parser.clear()\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/csi_param_state.go",
    "content": "package ansiterm\n\ntype csiParamState struct {\n\tbaseState\n}\n\nfunc (csiState csiParamState) Handle(b byte) (s state, e error) {\n\tcsiState.parser.logf(\"CsiParam::Handle %#x\", b)\n\n\tnextState, err := csiState.baseState.Handle(b)\n\tif nextState != nil || err != nil {\n\t\treturn nextState, err\n\t}\n\n\tswitch {\n\tcase sliceContains(alphabetics, b):\n\t\treturn csiState.parser.ground, nil\n\tcase sliceContains(csiCollectables, b):\n\t\tcsiState.parser.collectParam()\n\t\treturn csiState, nil\n\tcase sliceContains(executors, b):\n\t\treturn csiState, csiState.parser.execute()\n\t}\n\n\treturn csiState, nil\n}\n\nfunc (csiState csiParamState) Transition(s state) error {\n\tcsiState.parser.logf(\"CsiParam::Transition %s --> %s\", csiState.Name(), s.Name())\n\tcsiState.baseState.Transition(s)\n\n\tswitch s {\n\tcase csiState.parser.ground:\n\t\treturn csiState.parser.csiDispatch()\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/escape_intermediate_state.go",
    "content": "package ansiterm\n\ntype escapeIntermediateState struct {\n\tbaseState\n}\n\nfunc (escState escapeIntermediateState) Handle(b byte) (s state, e error) {\n\tescState.parser.logf(\"escapeIntermediateState::Handle %#x\", b)\n\tnextState, err := escState.baseState.Handle(b)\n\tif nextState != nil || err != nil {\n\t\treturn nextState, err\n\t}\n\n\tswitch {\n\tcase sliceContains(intermeds, b):\n\t\treturn escState, escState.parser.collectInter()\n\tcase sliceContains(executors, b):\n\t\treturn escState, escState.parser.execute()\n\tcase sliceContains(escapeIntermediateToGroundBytes, b):\n\t\treturn escState.parser.ground, nil\n\t}\n\n\treturn escState, nil\n}\n\nfunc (escState escapeIntermediateState) Transition(s state) error {\n\tescState.parser.logf(\"escapeIntermediateState::Transition %s --> %s\", escState.Name(), s.Name())\n\tescState.baseState.Transition(s)\n\n\tswitch s {\n\tcase escState.parser.ground:\n\t\treturn escState.parser.escDispatch()\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/escape_state.go",
    "content": "package ansiterm\n\ntype escapeState struct {\n\tbaseState\n}\n\nfunc (escState escapeState) Handle(b byte) (s state, e error) {\n\tescState.parser.logf(\"escapeState::Handle %#x\", b)\n\tnextState, err := escState.baseState.Handle(b)\n\tif nextState != nil || err != nil {\n\t\treturn nextState, err\n\t}\n\n\tswitch {\n\tcase b == ANSI_ESCAPE_SECONDARY:\n\t\treturn escState.parser.csiEntry, nil\n\tcase b == ANSI_OSC_STRING_ENTRY:\n\t\treturn escState.parser.oscString, nil\n\tcase sliceContains(executors, b):\n\t\treturn escState, escState.parser.execute()\n\tcase sliceContains(escapeToGroundBytes, b):\n\t\treturn escState.parser.ground, nil\n\tcase sliceContains(intermeds, b):\n\t\treturn escState.parser.escapeIntermediate, nil\n\t}\n\n\treturn escState, nil\n}\n\nfunc (escState escapeState) Transition(s state) error {\n\tescState.parser.logf(\"Escape::Transition %s --> %s\", escState.Name(), s.Name())\n\tescState.baseState.Transition(s)\n\n\tswitch s {\n\tcase escState.parser.ground:\n\t\treturn escState.parser.escDispatch()\n\tcase escState.parser.escapeIntermediate:\n\t\treturn escState.parser.collectInter()\n\t}\n\n\treturn nil\n}\n\nfunc (escState escapeState) Enter() error {\n\tescState.parser.clear()\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/event_handler.go",
    "content": "package ansiterm\n\ntype AnsiEventHandler interface {\n\t// Print\n\tPrint(b byte) error\n\n\t// Execute C0 commands\n\tExecute(b byte) error\n\n\t// CUrsor Up\n\tCUU(int) error\n\n\t// CUrsor Down\n\tCUD(int) error\n\n\t// CUrsor Forward\n\tCUF(int) error\n\n\t// CUrsor Backward\n\tCUB(int) error\n\n\t// Cursor to Next Line\n\tCNL(int) error\n\n\t// Cursor to Previous Line\n\tCPL(int) error\n\n\t// Cursor Horizontal position Absolute\n\tCHA(int) error\n\n\t// Vertical line Position Absolute\n\tVPA(int) error\n\n\t// CUrsor Position\n\tCUP(int, int) error\n\n\t// Horizontal and Vertical Position (depends on PUM)\n\tHVP(int, int) error\n\n\t// Text Cursor Enable Mode\n\tDECTCEM(bool) error\n\n\t// Origin Mode\n\tDECOM(bool) error\n\n\t// 132 Column Mode\n\tDECCOLM(bool) error\n\n\t// Erase in Display\n\tED(int) error\n\n\t// Erase in Line\n\tEL(int) error\n\n\t// Insert Line\n\tIL(int) error\n\n\t// Delete Line\n\tDL(int) error\n\n\t// Insert Character\n\tICH(int) error\n\n\t// Delete Character\n\tDCH(int) error\n\n\t// Set Graphics Rendition\n\tSGR([]int) error\n\n\t// Pan Down\n\tSU(int) error\n\n\t// Pan Up\n\tSD(int) error\n\n\t// Device Attributes\n\tDA([]string) error\n\n\t// Set Top and Bottom Margins\n\tDECSTBM(int, int) error\n\n\t// Index\n\tIND() error\n\n\t// Reverse Index\n\tRI() error\n\n\t// Flush updates from previous commands\n\tFlush() error\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/ground_state.go",
    "content": "package ansiterm\n\ntype groundState struct {\n\tbaseState\n}\n\nfunc (gs groundState) Handle(b byte) (s state, e error) {\n\tgs.parser.context.currentChar = b\n\n\tnextState, err := gs.baseState.Handle(b)\n\tif nextState != nil || err != nil {\n\t\treturn nextState, err\n\t}\n\n\tswitch {\n\tcase sliceContains(printables, b):\n\t\treturn gs, gs.parser.print()\n\n\tcase sliceContains(executors, b):\n\t\treturn gs, gs.parser.execute()\n\t}\n\n\treturn gs, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/osc_string_state.go",
    "content": "package ansiterm\n\ntype oscStringState struct {\n\tbaseState\n}\n\nfunc (oscState oscStringState) Handle(b byte) (s state, e error) {\n\toscState.parser.logf(\"OscString::Handle %#x\", b)\n\tnextState, err := oscState.baseState.Handle(b)\n\tif nextState != nil || err != nil {\n\t\treturn nextState, err\n\t}\n\n\t// There are several control characters and sequences which can\n\t// terminate an OSC string. Most of them are handled by the baseState\n\t// handler. The ANSI_BEL character is a special case which behaves as a\n\t// terminator only for an OSC string.\n\tif b == ANSI_BEL {\n\t\treturn oscState.parser.ground, nil\n\t}\n\n\treturn oscState, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/parser.go",
    "content": "package ansiterm\n\nimport (\n\t\"errors\"\n\t\"log\"\n\t\"os\"\n)\n\ntype AnsiParser struct {\n\tcurrState          state\n\teventHandler       AnsiEventHandler\n\tcontext            *ansiContext\n\tcsiEntry           state\n\tcsiParam           state\n\tdcsEntry           state\n\tescape             state\n\tescapeIntermediate state\n\terror              state\n\tground             state\n\toscString          state\n\tstateMap           []state\n\n\tlogf func(string, ...interface{})\n}\n\ntype Option func(*AnsiParser)\n\nfunc WithLogf(f func(string, ...interface{})) Option {\n\treturn func(ap *AnsiParser) {\n\t\tap.logf = f\n\t}\n}\n\nfunc CreateParser(initialState string, evtHandler AnsiEventHandler, opts ...Option) *AnsiParser {\n\tap := &AnsiParser{\n\t\teventHandler: evtHandler,\n\t\tcontext:      &ansiContext{},\n\t}\n\tfor _, o := range opts {\n\t\to(ap)\n\t}\n\n\tif isDebugEnv := os.Getenv(LogEnv); isDebugEnv == \"1\" {\n\t\tlogFile, _ := os.Create(\"ansiParser.log\")\n\t\tlogger := log.New(logFile, \"\", log.LstdFlags)\n\t\tif ap.logf != nil {\n\t\t\tl := ap.logf\n\t\t\tap.logf = func(s string, v ...interface{}) {\n\t\t\t\tl(s, v...)\n\t\t\t\tlogger.Printf(s, v...)\n\t\t\t}\n\t\t} else {\n\t\t\tap.logf = logger.Printf\n\t\t}\n\t}\n\n\tif ap.logf == nil {\n\t\tap.logf = func(string, ...interface{}) {}\n\t}\n\n\tap.csiEntry = csiEntryState{baseState{name: \"CsiEntry\", parser: ap}}\n\tap.csiParam = csiParamState{baseState{name: \"CsiParam\", parser: ap}}\n\tap.dcsEntry = dcsEntryState{baseState{name: \"DcsEntry\", parser: ap}}\n\tap.escape = escapeState{baseState{name: \"Escape\", parser: ap}}\n\tap.escapeIntermediate = escapeIntermediateState{baseState{name: \"EscapeIntermediate\", parser: ap}}\n\tap.error = errorState{baseState{name: \"Error\", parser: ap}}\n\tap.ground = groundState{baseState{name: \"Ground\", parser: ap}}\n\tap.oscString = oscStringState{baseState{name: \"OscString\", parser: ap}}\n\n\tap.stateMap = []state{\n\t\tap.csiEntry,\n\t\tap.csiParam,\n\t\tap.dcsEntry,\n\t\tap.escape,\n\t\tap.escapeIntermediate,\n\t\tap.error,\n\t\tap.ground,\n\t\tap.oscString,\n\t}\n\n\tap.currState = getState(initialState, ap.stateMap)\n\n\tap.logf(\"CreateParser: parser %p\", ap)\n\treturn ap\n}\n\nfunc getState(name string, states []state) state {\n\tfor _, el := range states {\n\t\tif el.Name() == name {\n\t\t\treturn el\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (ap *AnsiParser) Parse(bytes []byte) (int, error) {\n\tfor i, b := range bytes {\n\t\tif err := ap.handle(b); err != nil {\n\t\t\treturn i, err\n\t\t}\n\t}\n\n\treturn len(bytes), ap.eventHandler.Flush()\n}\n\nfunc (ap *AnsiParser) handle(b byte) error {\n\tap.context.currentChar = b\n\tnewState, err := ap.currState.Handle(b)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif newState == nil {\n\t\tap.logf(\"WARNING: newState is nil\")\n\t\treturn errors.New(\"New state of 'nil' is invalid.\")\n\t}\n\n\tif newState != ap.currState {\n\t\tif err := ap.changeState(newState); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (ap *AnsiParser) changeState(newState state) error {\n\tap.logf(\"ChangeState %s --> %s\", ap.currState.Name(), newState.Name())\n\n\t// Exit old state\n\tif err := ap.currState.Exit(); err != nil {\n\t\tap.logf(\"Exit state '%s' failed with : '%v'\", ap.currState.Name(), err)\n\t\treturn err\n\t}\n\n\t// Perform transition action\n\tif err := ap.currState.Transition(newState); err != nil {\n\t\tap.logf(\"Transition from '%s' to '%s' failed with: '%v'\", ap.currState.Name(), newState.Name, err)\n\t\treturn err\n\t}\n\n\t// Enter new state\n\tif err := newState.Enter(); err != nil {\n\t\tap.logf(\"Enter state '%s' failed with: '%v'\", newState.Name(), err)\n\t\treturn err\n\t}\n\n\tap.currState = newState\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/parser_action_helpers.go",
    "content": "package ansiterm\n\nimport (\n\t\"strconv\"\n)\n\nfunc parseParams(bytes []byte) ([]string, error) {\n\tparamBuff := make([]byte, 0, 0)\n\tparams := []string{}\n\n\tfor _, v := range bytes {\n\t\tif v == ';' {\n\t\t\tif len(paramBuff) > 0 {\n\t\t\t\t// Completed parameter, append it to the list\n\t\t\t\ts := string(paramBuff)\n\t\t\t\tparams = append(params, s)\n\t\t\t\tparamBuff = make([]byte, 0, 0)\n\t\t\t}\n\t\t} else {\n\t\t\tparamBuff = append(paramBuff, v)\n\t\t}\n\t}\n\n\t// Last parameter may not be terminated with ';'\n\tif len(paramBuff) > 0 {\n\t\ts := string(paramBuff)\n\t\tparams = append(params, s)\n\t}\n\n\treturn params, nil\n}\n\nfunc parseCmd(context ansiContext) (string, error) {\n\treturn string(context.currentChar), nil\n}\n\nfunc getInt(params []string, dflt int) int {\n\ti := getInts(params, 1, dflt)[0]\n\treturn i\n}\n\nfunc getInts(params []string, minCount int, dflt int) []int {\n\tints := []int{}\n\n\tfor _, v := range params {\n\t\ti, _ := strconv.Atoi(v)\n\t\t// Zero is mapped to the default value in VT100.\n\t\tif i == 0 {\n\t\t\ti = dflt\n\t\t}\n\t\tints = append(ints, i)\n\t}\n\n\tif len(ints) < minCount {\n\t\tremaining := minCount - len(ints)\n\t\tfor i := 0; i < remaining; i++ {\n\t\t\tints = append(ints, dflt)\n\t\t}\n\t}\n\n\treturn ints\n}\n\nfunc (ap *AnsiParser) modeDispatch(param string, set bool) error {\n\tswitch param {\n\tcase \"?3\":\n\t\treturn ap.eventHandler.DECCOLM(set)\n\tcase \"?6\":\n\t\treturn ap.eventHandler.DECOM(set)\n\tcase \"?25\":\n\t\treturn ap.eventHandler.DECTCEM(set)\n\t}\n\treturn nil\n}\n\nfunc (ap *AnsiParser) hDispatch(params []string) error {\n\tif len(params) == 1 {\n\t\treturn ap.modeDispatch(params[0], true)\n\t}\n\n\treturn nil\n}\n\nfunc (ap *AnsiParser) lDispatch(params []string) error {\n\tif len(params) == 1 {\n\t\treturn ap.modeDispatch(params[0], false)\n\t}\n\n\treturn nil\n}\n\nfunc getEraseParam(params []string) int {\n\tparam := getInt(params, 0)\n\tif param < 0 || 3 < param {\n\t\tparam = 0\n\t}\n\n\treturn param\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/parser_actions.go",
    "content": "package ansiterm\n\nfunc (ap *AnsiParser) collectParam() error {\n\tcurrChar := ap.context.currentChar\n\tap.logf(\"collectParam %#x\", currChar)\n\tap.context.paramBuffer = append(ap.context.paramBuffer, currChar)\n\treturn nil\n}\n\nfunc (ap *AnsiParser) collectInter() error {\n\tcurrChar := ap.context.currentChar\n\tap.logf(\"collectInter %#x\", currChar)\n\tap.context.paramBuffer = append(ap.context.interBuffer, currChar)\n\treturn nil\n}\n\nfunc (ap *AnsiParser) escDispatch() error {\n\tcmd, _ := parseCmd(*ap.context)\n\tintermeds := ap.context.interBuffer\n\tap.logf(\"escDispatch currentChar: %#x\", ap.context.currentChar)\n\tap.logf(\"escDispatch: %v(%v)\", cmd, intermeds)\n\n\tswitch cmd {\n\tcase \"D\": // IND\n\t\treturn ap.eventHandler.IND()\n\tcase \"E\": // NEL, equivalent to CRLF\n\t\terr := ap.eventHandler.Execute(ANSI_CARRIAGE_RETURN)\n\t\tif err == nil {\n\t\t\terr = ap.eventHandler.Execute(ANSI_LINE_FEED)\n\t\t}\n\t\treturn err\n\tcase \"M\": // RI\n\t\treturn ap.eventHandler.RI()\n\t}\n\n\treturn nil\n}\n\nfunc (ap *AnsiParser) csiDispatch() error {\n\tcmd, _ := parseCmd(*ap.context)\n\tparams, _ := parseParams(ap.context.paramBuffer)\n\tap.logf(\"Parsed params: %v with length: %d\", params, len(params))\n\n\tap.logf(\"csiDispatch: %v(%v)\", cmd, params)\n\n\tswitch cmd {\n\tcase \"@\":\n\t\treturn ap.eventHandler.ICH(getInt(params, 1))\n\tcase \"A\":\n\t\treturn ap.eventHandler.CUU(getInt(params, 1))\n\tcase \"B\":\n\t\treturn ap.eventHandler.CUD(getInt(params, 1))\n\tcase \"C\":\n\t\treturn ap.eventHandler.CUF(getInt(params, 1))\n\tcase \"D\":\n\t\treturn ap.eventHandler.CUB(getInt(params, 1))\n\tcase \"E\":\n\t\treturn ap.eventHandler.CNL(getInt(params, 1))\n\tcase \"F\":\n\t\treturn ap.eventHandler.CPL(getInt(params, 1))\n\tcase \"G\":\n\t\treturn ap.eventHandler.CHA(getInt(params, 1))\n\tcase \"H\":\n\t\tints := getInts(params, 2, 1)\n\t\tx, y := ints[0], ints[1]\n\t\treturn ap.eventHandler.CUP(x, y)\n\tcase \"J\":\n\t\tparam := getEraseParam(params)\n\t\treturn ap.eventHandler.ED(param)\n\tcase \"K\":\n\t\tparam := getEraseParam(params)\n\t\treturn ap.eventHandler.EL(param)\n\tcase \"L\":\n\t\treturn ap.eventHandler.IL(getInt(params, 1))\n\tcase \"M\":\n\t\treturn ap.eventHandler.DL(getInt(params, 1))\n\tcase \"P\":\n\t\treturn ap.eventHandler.DCH(getInt(params, 1))\n\tcase \"S\":\n\t\treturn ap.eventHandler.SU(getInt(params, 1))\n\tcase \"T\":\n\t\treturn ap.eventHandler.SD(getInt(params, 1))\n\tcase \"c\":\n\t\treturn ap.eventHandler.DA(params)\n\tcase \"d\":\n\t\treturn ap.eventHandler.VPA(getInt(params, 1))\n\tcase \"f\":\n\t\tints := getInts(params, 2, 1)\n\t\tx, y := ints[0], ints[1]\n\t\treturn ap.eventHandler.HVP(x, y)\n\tcase \"h\":\n\t\treturn ap.hDispatch(params)\n\tcase \"l\":\n\t\treturn ap.lDispatch(params)\n\tcase \"m\":\n\t\treturn ap.eventHandler.SGR(getInts(params, 1, 0))\n\tcase \"r\":\n\t\tints := getInts(params, 2, 1)\n\t\ttop, bottom := ints[0], ints[1]\n\t\treturn ap.eventHandler.DECSTBM(top, bottom)\n\tdefault:\n\t\tap.logf(\"ERROR: Unsupported CSI command: '%s', with full context:  %v\", cmd, ap.context)\n\t\treturn nil\n\t}\n\n}\n\nfunc (ap *AnsiParser) print() error {\n\treturn ap.eventHandler.Print(ap.context.currentChar)\n}\n\nfunc (ap *AnsiParser) clear() error {\n\tap.context = &ansiContext{}\n\treturn nil\n}\n\nfunc (ap *AnsiParser) execute() error {\n\treturn ap.eventHandler.Execute(ap.context.currentChar)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/states.go",
    "content": "package ansiterm\n\ntype stateID int\n\ntype state interface {\n\tEnter() error\n\tExit() error\n\tHandle(byte) (state, error)\n\tName() string\n\tTransition(state) error\n}\n\ntype baseState struct {\n\tname   string\n\tparser *AnsiParser\n}\n\nfunc (base baseState) Enter() error {\n\treturn nil\n}\n\nfunc (base baseState) Exit() error {\n\treturn nil\n}\n\nfunc (base baseState) Handle(b byte) (s state, e error) {\n\n\tswitch {\n\tcase b == CSI_ENTRY:\n\t\treturn base.parser.csiEntry, nil\n\tcase b == DCS_ENTRY:\n\t\treturn base.parser.dcsEntry, nil\n\tcase b == ANSI_ESCAPE_PRIMARY:\n\t\treturn base.parser.escape, nil\n\tcase b == OSC_STRING:\n\t\treturn base.parser.oscString, nil\n\tcase sliceContains(toGroundBytes, b):\n\t\treturn base.parser.ground, nil\n\t}\n\n\treturn nil, nil\n}\n\nfunc (base baseState) Name() string {\n\treturn base.name\n}\n\nfunc (base baseState) Transition(s state) error {\n\tif s == base.parser.ground {\n\t\texecBytes := []byte{0x18}\n\t\texecBytes = append(execBytes, 0x1A)\n\t\texecBytes = append(execBytes, getByteRange(0x80, 0x8F)...)\n\t\texecBytes = append(execBytes, getByteRange(0x91, 0x97)...)\n\t\texecBytes = append(execBytes, 0x99)\n\t\texecBytes = append(execBytes, 0x9A)\n\n\t\tif sliceContains(execBytes, base.parser.context.currentChar) {\n\t\t\treturn base.parser.execute()\n\t\t}\n\t}\n\n\treturn nil\n}\n\ntype dcsEntryState struct {\n\tbaseState\n}\n\ntype errorState struct {\n\tbaseState\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/utilities.go",
    "content": "package ansiterm\n\nimport (\n\t\"strconv\"\n)\n\nfunc sliceContains(bytes []byte, b byte) bool {\n\tfor _, v := range bytes {\n\t\tif v == b {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\nfunc convertBytesToInteger(bytes []byte) int {\n\ts := string(bytes)\n\ti, _ := strconv.Atoi(s)\n\treturn i\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/winterm/ansi.go",
    "content": "// +build windows\n\npackage winterm\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\t\"syscall\"\n\n\t\"github.com/Azure/go-ansiterm\"\n\twindows \"golang.org/x/sys/windows\"\n)\n\n// Windows keyboard constants\n// See https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx.\nconst (\n\tVK_PRIOR    = 0x21 // PAGE UP key\n\tVK_NEXT     = 0x22 // PAGE DOWN key\n\tVK_END      = 0x23 // END key\n\tVK_HOME     = 0x24 // HOME key\n\tVK_LEFT     = 0x25 // LEFT ARROW key\n\tVK_UP       = 0x26 // UP ARROW key\n\tVK_RIGHT    = 0x27 // RIGHT ARROW key\n\tVK_DOWN     = 0x28 // DOWN ARROW key\n\tVK_SELECT   = 0x29 // SELECT key\n\tVK_PRINT    = 0x2A // PRINT key\n\tVK_EXECUTE  = 0x2B // EXECUTE key\n\tVK_SNAPSHOT = 0x2C // PRINT SCREEN key\n\tVK_INSERT   = 0x2D // INS key\n\tVK_DELETE   = 0x2E // DEL key\n\tVK_HELP     = 0x2F // HELP key\n\tVK_F1       = 0x70 // F1 key\n\tVK_F2       = 0x71 // F2 key\n\tVK_F3       = 0x72 // F3 key\n\tVK_F4       = 0x73 // F4 key\n\tVK_F5       = 0x74 // F5 key\n\tVK_F6       = 0x75 // F6 key\n\tVK_F7       = 0x76 // F7 key\n\tVK_F8       = 0x77 // F8 key\n\tVK_F9       = 0x78 // F9 key\n\tVK_F10      = 0x79 // F10 key\n\tVK_F11      = 0x7A // F11 key\n\tVK_F12      = 0x7B // F12 key\n\n\tRIGHT_ALT_PRESSED  = 0x0001\n\tLEFT_ALT_PRESSED   = 0x0002\n\tRIGHT_CTRL_PRESSED = 0x0004\n\tLEFT_CTRL_PRESSED  = 0x0008\n\tSHIFT_PRESSED      = 0x0010\n\tNUMLOCK_ON         = 0x0020\n\tSCROLLLOCK_ON      = 0x0040\n\tCAPSLOCK_ON        = 0x0080\n\tENHANCED_KEY       = 0x0100\n)\n\ntype ansiCommand struct {\n\tCommandBytes []byte\n\tCommand      string\n\tParameters   []string\n\tIsSpecial    bool\n}\n\nfunc newAnsiCommand(command []byte) *ansiCommand {\n\n\tif isCharacterSelectionCmdChar(command[1]) {\n\t\t// Is Character Set Selection commands\n\t\treturn &ansiCommand{\n\t\t\tCommandBytes: command,\n\t\t\tCommand:      string(command),\n\t\t\tIsSpecial:    true,\n\t\t}\n\t}\n\n\t// last char is command character\n\tlastCharIndex := len(command) - 1\n\n\tac := &ansiCommand{\n\t\tCommandBytes: command,\n\t\tCommand:      string(command[lastCharIndex]),\n\t\tIsSpecial:    false,\n\t}\n\n\t// more than a single escape\n\tif lastCharIndex != 0 {\n\t\tstart := 1\n\t\t// skip if double char escape sequence\n\t\tif command[0] == ansiterm.ANSI_ESCAPE_PRIMARY && command[1] == ansiterm.ANSI_ESCAPE_SECONDARY {\n\t\t\tstart++\n\t\t}\n\t\t// convert this to GetNextParam method\n\t\tac.Parameters = strings.Split(string(command[start:lastCharIndex]), ansiterm.ANSI_PARAMETER_SEP)\n\t}\n\n\treturn ac\n}\n\nfunc (ac *ansiCommand) paramAsSHORT(index int, defaultValue int16) int16 {\n\tif index < 0 || index >= len(ac.Parameters) {\n\t\treturn defaultValue\n\t}\n\n\tparam, err := strconv.ParseInt(ac.Parameters[index], 10, 16)\n\tif err != nil {\n\t\treturn defaultValue\n\t}\n\n\treturn int16(param)\n}\n\nfunc (ac *ansiCommand) String() string {\n\treturn fmt.Sprintf(\"0x%v \\\"%v\\\" (\\\"%v\\\")\",\n\t\tbytesToHex(ac.CommandBytes),\n\t\tac.Command,\n\t\tstrings.Join(ac.Parameters, \"\\\",\\\"\"))\n}\n\n// isAnsiCommandChar returns true if the passed byte falls within the range of ANSI commands.\n// See http://manpages.ubuntu.com/manpages/intrepid/man4/console_codes.4.html.\nfunc isAnsiCommandChar(b byte) bool {\n\tswitch {\n\tcase ansiterm.ANSI_COMMAND_FIRST <= b && b <= ansiterm.ANSI_COMMAND_LAST && b != ansiterm.ANSI_ESCAPE_SECONDARY:\n\t\treturn true\n\tcase b == ansiterm.ANSI_CMD_G1 || b == ansiterm.ANSI_CMD_OSC || b == ansiterm.ANSI_CMD_DECPAM || b == ansiterm.ANSI_CMD_DECPNM:\n\t\t// non-CSI escape sequence terminator\n\t\treturn true\n\tcase b == ansiterm.ANSI_CMD_STR_TERM || b == ansiterm.ANSI_BEL:\n\t\t// String escape sequence terminator\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc isXtermOscSequence(command []byte, current byte) bool {\n\treturn (len(command) >= 2 && command[0] == ansiterm.ANSI_ESCAPE_PRIMARY && command[1] == ansiterm.ANSI_CMD_OSC && current != ansiterm.ANSI_BEL)\n}\n\nfunc isCharacterSelectionCmdChar(b byte) bool {\n\treturn (b == ansiterm.ANSI_CMD_G0 || b == ansiterm.ANSI_CMD_G1 || b == ansiterm.ANSI_CMD_G2 || b == ansiterm.ANSI_CMD_G3)\n}\n\n// bytesToHex converts a slice of bytes to a human-readable string.\nfunc bytesToHex(b []byte) string {\n\thex := make([]string, len(b))\n\tfor i, ch := range b {\n\t\thex[i] = fmt.Sprintf(\"%X\", ch)\n\t}\n\treturn strings.Join(hex, \"\")\n}\n\n// ensureInRange adjusts the passed value, if necessary, to ensure it is within\n// the passed min / max range.\nfunc ensureInRange(n int16, min int16, max int16) int16 {\n\tif n < min {\n\t\treturn min\n\t} else if n > max {\n\t\treturn max\n\t} else {\n\t\treturn n\n\t}\n}\n\nfunc GetStdFile(nFile int) (*os.File, uintptr) {\n\tvar file *os.File\n\n\t// syscall uses negative numbers\n\t// windows package uses very big uint32\n\t// Keep these switches split so we don't have to convert ints too much.\n\tswitch uint32(nFile) {\n\tcase windows.STD_INPUT_HANDLE:\n\t\tfile = os.Stdin\n\tcase windows.STD_OUTPUT_HANDLE:\n\t\tfile = os.Stdout\n\tcase windows.STD_ERROR_HANDLE:\n\t\tfile = os.Stderr\n\tdefault:\n\t\tswitch nFile {\n\t\tcase syscall.STD_INPUT_HANDLE:\n\t\t\tfile = os.Stdin\n\t\tcase syscall.STD_OUTPUT_HANDLE:\n\t\t\tfile = os.Stdout\n\t\tcase syscall.STD_ERROR_HANDLE:\n\t\t\tfile = os.Stderr\n\t\tdefault:\n\t\t\tpanic(fmt.Errorf(\"Invalid standard handle identifier: %v\", nFile))\n\t\t}\n\t}\n\n\tfd, err := syscall.GetStdHandle(nFile)\n\tif err != nil {\n\t\tpanic(fmt.Errorf(\"Invalid standard handle identifier: %v -- %v\", nFile, err))\n\t}\n\n\treturn file, uintptr(fd)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/winterm/api.go",
    "content": "// +build windows\n\npackage winterm\n\nimport (\n\t\"fmt\"\n\t\"syscall\"\n\t\"unsafe\"\n)\n\n//===========================================================================================================\n// IMPORTANT NOTE:\n//\n//\tThe methods below make extensive use of the \"unsafe\" package to obtain the required pointers.\n//\tBeginning in Go 1.3, the garbage collector may release local variables (e.g., incoming arguments, stack\n//\tvariables) the pointers reference *before* the API completes.\n//\n//  As a result, in those cases, the code must hint that the variables remain in active by invoking the\n//\tdummy method \"use\" (see below). Newer versions of Go are planned to change the mechanism to no longer\n//\trequire unsafe pointers.\n//\n//\tIf you add or modify methods, ENSURE protection of local variables through the \"use\" builtin to inform\n//\tthe garbage collector the variables remain in use if:\n//\n//\t-- The value is not a pointer (e.g., int32, struct)\n//\t-- The value is not referenced by the method after passing the pointer to Windows\n//\n//\tSee http://golang.org/doc/go1.3.\n//===========================================================================================================\n\nvar (\n\tkernel32DLL = syscall.NewLazyDLL(\"kernel32.dll\")\n\n\tgetConsoleCursorInfoProc       = kernel32DLL.NewProc(\"GetConsoleCursorInfo\")\n\tsetConsoleCursorInfoProc       = kernel32DLL.NewProc(\"SetConsoleCursorInfo\")\n\tsetConsoleCursorPositionProc   = kernel32DLL.NewProc(\"SetConsoleCursorPosition\")\n\tsetConsoleModeProc             = kernel32DLL.NewProc(\"SetConsoleMode\")\n\tgetConsoleScreenBufferInfoProc = kernel32DLL.NewProc(\"GetConsoleScreenBufferInfo\")\n\tsetConsoleScreenBufferSizeProc = kernel32DLL.NewProc(\"SetConsoleScreenBufferSize\")\n\tscrollConsoleScreenBufferProc  = kernel32DLL.NewProc(\"ScrollConsoleScreenBufferA\")\n\tsetConsoleTextAttributeProc    = kernel32DLL.NewProc(\"SetConsoleTextAttribute\")\n\tsetConsoleWindowInfoProc       = kernel32DLL.NewProc(\"SetConsoleWindowInfo\")\n\twriteConsoleOutputProc         = kernel32DLL.NewProc(\"WriteConsoleOutputW\")\n\treadConsoleInputProc           = kernel32DLL.NewProc(\"ReadConsoleInputW\")\n\twaitForSingleObjectProc        = kernel32DLL.NewProc(\"WaitForSingleObject\")\n)\n\n// Windows Console constants\nconst (\n\t// Console modes\n\t// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx.\n\tENABLE_PROCESSED_INPUT        = 0x0001\n\tENABLE_LINE_INPUT             = 0x0002\n\tENABLE_ECHO_INPUT             = 0x0004\n\tENABLE_WINDOW_INPUT           = 0x0008\n\tENABLE_MOUSE_INPUT            = 0x0010\n\tENABLE_INSERT_MODE            = 0x0020\n\tENABLE_QUICK_EDIT_MODE        = 0x0040\n\tENABLE_EXTENDED_FLAGS         = 0x0080\n\tENABLE_AUTO_POSITION          = 0x0100\n\tENABLE_VIRTUAL_TERMINAL_INPUT = 0x0200\n\n\tENABLE_PROCESSED_OUTPUT            = 0x0001\n\tENABLE_WRAP_AT_EOL_OUTPUT          = 0x0002\n\tENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004\n\tDISABLE_NEWLINE_AUTO_RETURN        = 0x0008\n\tENABLE_LVB_GRID_WORLDWIDE          = 0x0010\n\n\t// Character attributes\n\t// Note:\n\t// -- The attributes are combined to produce various colors (e.g., Blue + Green will create Cyan).\n\t//    Clearing all foreground or background colors results in black; setting all creates white.\n\t// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms682088(v=vs.85).aspx#_win32_character_attributes.\n\tFOREGROUND_BLUE      uint16 = 0x0001\n\tFOREGROUND_GREEN     uint16 = 0x0002\n\tFOREGROUND_RED       uint16 = 0x0004\n\tFOREGROUND_INTENSITY uint16 = 0x0008\n\tFOREGROUND_MASK      uint16 = 0x000F\n\n\tBACKGROUND_BLUE      uint16 = 0x0010\n\tBACKGROUND_GREEN     uint16 = 0x0020\n\tBACKGROUND_RED       uint16 = 0x0040\n\tBACKGROUND_INTENSITY uint16 = 0x0080\n\tBACKGROUND_MASK      uint16 = 0x00F0\n\n\tCOMMON_LVB_MASK          uint16 = 0xFF00\n\tCOMMON_LVB_REVERSE_VIDEO uint16 = 0x4000\n\tCOMMON_LVB_UNDERSCORE    uint16 = 0x8000\n\n\t// Input event types\n\t// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms683499(v=vs.85).aspx.\n\tKEY_EVENT                = 0x0001\n\tMOUSE_EVENT              = 0x0002\n\tWINDOW_BUFFER_SIZE_EVENT = 0x0004\n\tMENU_EVENT               = 0x0008\n\tFOCUS_EVENT              = 0x0010\n\n\t// WaitForSingleObject return codes\n\tWAIT_ABANDONED = 0x00000080\n\tWAIT_FAILED    = 0xFFFFFFFF\n\tWAIT_SIGNALED  = 0x0000000\n\tWAIT_TIMEOUT   = 0x00000102\n\n\t// WaitForSingleObject wait duration\n\tWAIT_INFINITE       = 0xFFFFFFFF\n\tWAIT_ONE_SECOND     = 1000\n\tWAIT_HALF_SECOND    = 500\n\tWAIT_QUARTER_SECOND = 250\n)\n\n// Windows API Console types\n// -- See https://msdn.microsoft.com/en-us/library/windows/desktop/ms682101(v=vs.85).aspx for Console specific types (e.g., COORD)\n// -- See https://msdn.microsoft.com/en-us/library/aa296569(v=vs.60).aspx for comments on alignment\ntype (\n\tCHAR_INFO struct {\n\t\tUnicodeChar uint16\n\t\tAttributes  uint16\n\t}\n\n\tCONSOLE_CURSOR_INFO struct {\n\t\tSize    uint32\n\t\tVisible int32\n\t}\n\n\tCONSOLE_SCREEN_BUFFER_INFO struct {\n\t\tSize              COORD\n\t\tCursorPosition    COORD\n\t\tAttributes        uint16\n\t\tWindow            SMALL_RECT\n\t\tMaximumWindowSize COORD\n\t}\n\n\tCOORD struct {\n\t\tX int16\n\t\tY int16\n\t}\n\n\tSMALL_RECT struct {\n\t\tLeft   int16\n\t\tTop    int16\n\t\tRight  int16\n\t\tBottom int16\n\t}\n\n\t// INPUT_RECORD is a C/C++ union of which KEY_EVENT_RECORD is one case, it is also the largest\n\t// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms683499(v=vs.85).aspx.\n\tINPUT_RECORD struct {\n\t\tEventType uint16\n\t\tKeyEvent  KEY_EVENT_RECORD\n\t}\n\n\tKEY_EVENT_RECORD struct {\n\t\tKeyDown         int32\n\t\tRepeatCount     uint16\n\t\tVirtualKeyCode  uint16\n\t\tVirtualScanCode uint16\n\t\tUnicodeChar     uint16\n\t\tControlKeyState uint32\n\t}\n\n\tWINDOW_BUFFER_SIZE struct {\n\t\tSize COORD\n\t}\n)\n\n// boolToBOOL converts a Go bool into a Windows int32.\nfunc boolToBOOL(f bool) int32 {\n\tif f {\n\t\treturn int32(1)\n\t} else {\n\t\treturn int32(0)\n\t}\n}\n\n// GetConsoleCursorInfo retrieves information about the size and visiblity of the console cursor.\n// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms683163(v=vs.85).aspx.\nfunc GetConsoleCursorInfo(handle uintptr, cursorInfo *CONSOLE_CURSOR_INFO) error {\n\tr1, r2, err := getConsoleCursorInfoProc.Call(handle, uintptr(unsafe.Pointer(cursorInfo)), 0)\n\treturn checkError(r1, r2, err)\n}\n\n// SetConsoleCursorInfo sets the size and visiblity of the console cursor.\n// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms686019(v=vs.85).aspx.\nfunc SetConsoleCursorInfo(handle uintptr, cursorInfo *CONSOLE_CURSOR_INFO) error {\n\tr1, r2, err := setConsoleCursorInfoProc.Call(handle, uintptr(unsafe.Pointer(cursorInfo)), 0)\n\treturn checkError(r1, r2, err)\n}\n\n// SetConsoleCursorPosition location of the console cursor.\n// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms686025(v=vs.85).aspx.\nfunc SetConsoleCursorPosition(handle uintptr, coord COORD) error {\n\tr1, r2, err := setConsoleCursorPositionProc.Call(handle, coordToPointer(coord))\n\tuse(coord)\n\treturn checkError(r1, r2, err)\n}\n\n// GetConsoleMode gets the console mode for given file descriptor\n// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms683167(v=vs.85).aspx.\nfunc GetConsoleMode(handle uintptr) (mode uint32, err error) {\n\terr = syscall.GetConsoleMode(syscall.Handle(handle), &mode)\n\treturn mode, err\n}\n\n// SetConsoleMode sets the console mode for given file descriptor\n// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx.\nfunc SetConsoleMode(handle uintptr, mode uint32) error {\n\tr1, r2, err := setConsoleModeProc.Call(handle, uintptr(mode), 0)\n\tuse(mode)\n\treturn checkError(r1, r2, err)\n}\n\n// GetConsoleScreenBufferInfo retrieves information about the specified console screen buffer.\n// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms683171(v=vs.85).aspx.\nfunc GetConsoleScreenBufferInfo(handle uintptr) (*CONSOLE_SCREEN_BUFFER_INFO, error) {\n\tinfo := CONSOLE_SCREEN_BUFFER_INFO{}\n\terr := checkError(getConsoleScreenBufferInfoProc.Call(handle, uintptr(unsafe.Pointer(&info)), 0))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &info, nil\n}\n\nfunc ScrollConsoleScreenBuffer(handle uintptr, scrollRect SMALL_RECT, clipRect SMALL_RECT, destOrigin COORD, char CHAR_INFO) error {\n\tr1, r2, err := scrollConsoleScreenBufferProc.Call(handle, uintptr(unsafe.Pointer(&scrollRect)), uintptr(unsafe.Pointer(&clipRect)), coordToPointer(destOrigin), uintptr(unsafe.Pointer(&char)))\n\tuse(scrollRect)\n\tuse(clipRect)\n\tuse(destOrigin)\n\tuse(char)\n\treturn checkError(r1, r2, err)\n}\n\n// SetConsoleScreenBufferSize sets the size of the console screen buffer.\n// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms686044(v=vs.85).aspx.\nfunc SetConsoleScreenBufferSize(handle uintptr, coord COORD) error {\n\tr1, r2, err := setConsoleScreenBufferSizeProc.Call(handle, coordToPointer(coord))\n\tuse(coord)\n\treturn checkError(r1, r2, err)\n}\n\n// SetConsoleTextAttribute sets the attributes of characters written to the\n// console screen buffer by the WriteFile or WriteConsole function.\n// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047(v=vs.85).aspx.\nfunc SetConsoleTextAttribute(handle uintptr, attribute uint16) error {\n\tr1, r2, err := setConsoleTextAttributeProc.Call(handle, uintptr(attribute), 0)\n\tuse(attribute)\n\treturn checkError(r1, r2, err)\n}\n\n// SetConsoleWindowInfo sets the size and position of the console screen buffer's window.\n// Note that the size and location must be within and no larger than the backing console screen buffer.\n// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms686125(v=vs.85).aspx.\nfunc SetConsoleWindowInfo(handle uintptr, isAbsolute bool, rect SMALL_RECT) error {\n\tr1, r2, err := setConsoleWindowInfoProc.Call(handle, uintptr(boolToBOOL(isAbsolute)), uintptr(unsafe.Pointer(&rect)))\n\tuse(isAbsolute)\n\tuse(rect)\n\treturn checkError(r1, r2, err)\n}\n\n// WriteConsoleOutput writes the CHAR_INFOs from the provided buffer to the active console buffer.\n// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms687404(v=vs.85).aspx.\nfunc WriteConsoleOutput(handle uintptr, buffer []CHAR_INFO, bufferSize COORD, bufferCoord COORD, writeRegion *SMALL_RECT) error {\n\tr1, r2, err := writeConsoleOutputProc.Call(handle, uintptr(unsafe.Pointer(&buffer[0])), coordToPointer(bufferSize), coordToPointer(bufferCoord), uintptr(unsafe.Pointer(writeRegion)))\n\tuse(buffer)\n\tuse(bufferSize)\n\tuse(bufferCoord)\n\treturn checkError(r1, r2, err)\n}\n\n// ReadConsoleInput reads (and removes) data from the console input buffer.\n// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms684961(v=vs.85).aspx.\nfunc ReadConsoleInput(handle uintptr, buffer []INPUT_RECORD, count *uint32) error {\n\tr1, r2, err := readConsoleInputProc.Call(handle, uintptr(unsafe.Pointer(&buffer[0])), uintptr(len(buffer)), uintptr(unsafe.Pointer(count)))\n\tuse(buffer)\n\treturn checkError(r1, r2, err)\n}\n\n// WaitForSingleObject waits for the passed handle to be signaled.\n// It returns true if the handle was signaled; false otherwise.\n// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx.\nfunc WaitForSingleObject(handle uintptr, msWait uint32) (bool, error) {\n\tr1, _, err := waitForSingleObjectProc.Call(handle, uintptr(uint32(msWait)))\n\tswitch r1 {\n\tcase WAIT_ABANDONED, WAIT_TIMEOUT:\n\t\treturn false, nil\n\tcase WAIT_SIGNALED:\n\t\treturn true, nil\n\t}\n\tuse(msWait)\n\treturn false, err\n}\n\n// String helpers\nfunc (info CONSOLE_SCREEN_BUFFER_INFO) String() string {\n\treturn fmt.Sprintf(\"Size(%v) Cursor(%v) Window(%v) Max(%v)\", info.Size, info.CursorPosition, info.Window, info.MaximumWindowSize)\n}\n\nfunc (coord COORD) String() string {\n\treturn fmt.Sprintf(\"%v,%v\", coord.X, coord.Y)\n}\n\nfunc (rect SMALL_RECT) String() string {\n\treturn fmt.Sprintf(\"(%v,%v),(%v,%v)\", rect.Left, rect.Top, rect.Right, rect.Bottom)\n}\n\n// checkError evaluates the results of a Windows API call and returns the error if it failed.\nfunc checkError(r1, r2 uintptr, err error) error {\n\t// Windows APIs return non-zero to indicate success\n\tif r1 != 0 {\n\t\treturn nil\n\t}\n\n\t// Return the error if provided, otherwise default to EINVAL\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn syscall.EINVAL\n}\n\n// coordToPointer converts a COORD into a uintptr (by fooling the type system).\nfunc coordToPointer(c COORD) uintptr {\n\t// Note: This code assumes the two SHORTs are correctly laid out; the \"cast\" to uint32 is just to get a pointer to pass.\n\treturn uintptr(*((*uint32)(unsafe.Pointer(&c))))\n}\n\n// use is a no-op, but the compiler cannot see that it is.\n// Calling use(p) ensures that p is kept live until that point.\nfunc use(p interface{}) {}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/winterm/attr_translation.go",
    "content": "// +build windows\n\npackage winterm\n\nimport \"github.com/Azure/go-ansiterm\"\n\nconst (\n\tFOREGROUND_COLOR_MASK = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE\n\tBACKGROUND_COLOR_MASK = BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE\n)\n\n// collectAnsiIntoWindowsAttributes modifies the passed Windows text mode flags to reflect the\n// request represented by the passed ANSI mode.\nfunc collectAnsiIntoWindowsAttributes(windowsMode uint16, inverted bool, baseMode uint16, ansiMode int16) (uint16, bool) {\n\tswitch ansiMode {\n\n\t// Mode styles\n\tcase ansiterm.ANSI_SGR_BOLD:\n\t\twindowsMode = windowsMode | FOREGROUND_INTENSITY\n\n\tcase ansiterm.ANSI_SGR_DIM, ansiterm.ANSI_SGR_BOLD_DIM_OFF:\n\t\twindowsMode &^= FOREGROUND_INTENSITY\n\n\tcase ansiterm.ANSI_SGR_UNDERLINE:\n\t\twindowsMode = windowsMode | COMMON_LVB_UNDERSCORE\n\n\tcase ansiterm.ANSI_SGR_REVERSE:\n\t\tinverted = true\n\n\tcase ansiterm.ANSI_SGR_REVERSE_OFF:\n\t\tinverted = false\n\n\tcase ansiterm.ANSI_SGR_UNDERLINE_OFF:\n\t\twindowsMode &^= COMMON_LVB_UNDERSCORE\n\n\t\t// Foreground colors\n\tcase ansiterm.ANSI_SGR_FOREGROUND_DEFAULT:\n\t\twindowsMode = (windowsMode &^ FOREGROUND_MASK) | (baseMode & FOREGROUND_MASK)\n\n\tcase ansiterm.ANSI_SGR_FOREGROUND_BLACK:\n\t\twindowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK)\n\n\tcase ansiterm.ANSI_SGR_FOREGROUND_RED:\n\t\twindowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_RED\n\n\tcase ansiterm.ANSI_SGR_FOREGROUND_GREEN:\n\t\twindowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_GREEN\n\n\tcase ansiterm.ANSI_SGR_FOREGROUND_YELLOW:\n\t\twindowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_RED | FOREGROUND_GREEN\n\n\tcase ansiterm.ANSI_SGR_FOREGROUND_BLUE:\n\t\twindowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_BLUE\n\n\tcase ansiterm.ANSI_SGR_FOREGROUND_MAGENTA:\n\t\twindowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_RED | FOREGROUND_BLUE\n\n\tcase ansiterm.ANSI_SGR_FOREGROUND_CYAN:\n\t\twindowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_GREEN | FOREGROUND_BLUE\n\n\tcase ansiterm.ANSI_SGR_FOREGROUND_WHITE:\n\t\twindowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE\n\n\t\t// Background colors\n\tcase ansiterm.ANSI_SGR_BACKGROUND_DEFAULT:\n\t\t// Black with no intensity\n\t\twindowsMode = (windowsMode &^ BACKGROUND_MASK) | (baseMode & BACKGROUND_MASK)\n\n\tcase ansiterm.ANSI_SGR_BACKGROUND_BLACK:\n\t\twindowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK)\n\n\tcase ansiterm.ANSI_SGR_BACKGROUND_RED:\n\t\twindowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_RED\n\n\tcase ansiterm.ANSI_SGR_BACKGROUND_GREEN:\n\t\twindowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_GREEN\n\n\tcase ansiterm.ANSI_SGR_BACKGROUND_YELLOW:\n\t\twindowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_RED | BACKGROUND_GREEN\n\n\tcase ansiterm.ANSI_SGR_BACKGROUND_BLUE:\n\t\twindowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_BLUE\n\n\tcase ansiterm.ANSI_SGR_BACKGROUND_MAGENTA:\n\t\twindowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_RED | BACKGROUND_BLUE\n\n\tcase ansiterm.ANSI_SGR_BACKGROUND_CYAN:\n\t\twindowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_GREEN | BACKGROUND_BLUE\n\n\tcase ansiterm.ANSI_SGR_BACKGROUND_WHITE:\n\t\twindowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE\n\t}\n\n\treturn windowsMode, inverted\n}\n\n// invertAttributes inverts the foreground and background colors of a Windows attributes value\nfunc invertAttributes(windowsMode uint16) uint16 {\n\treturn (COMMON_LVB_MASK & windowsMode) | ((FOREGROUND_MASK & windowsMode) << 4) | ((BACKGROUND_MASK & windowsMode) >> 4)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/winterm/cursor_helpers.go",
    "content": "// +build windows\n\npackage winterm\n\nconst (\n\thorizontal = iota\n\tvertical\n)\n\nfunc (h *windowsAnsiEventHandler) getCursorWindow(info *CONSOLE_SCREEN_BUFFER_INFO) SMALL_RECT {\n\tif h.originMode {\n\t\tsr := h.effectiveSr(info.Window)\n\t\treturn SMALL_RECT{\n\t\t\tTop:    sr.top,\n\t\t\tBottom: sr.bottom,\n\t\t\tLeft:   0,\n\t\t\tRight:  info.Size.X - 1,\n\t\t}\n\t} else {\n\t\treturn SMALL_RECT{\n\t\t\tTop:    info.Window.Top,\n\t\t\tBottom: info.Window.Bottom,\n\t\t\tLeft:   0,\n\t\t\tRight:  info.Size.X - 1,\n\t\t}\n\t}\n}\n\n// setCursorPosition sets the cursor to the specified position, bounded to the screen size\nfunc (h *windowsAnsiEventHandler) setCursorPosition(position COORD, window SMALL_RECT) error {\n\tposition.X = ensureInRange(position.X, window.Left, window.Right)\n\tposition.Y = ensureInRange(position.Y, window.Top, window.Bottom)\n\terr := SetConsoleCursorPosition(h.fd, position)\n\tif err != nil {\n\t\treturn err\n\t}\n\th.logf(\"Cursor position set: (%d, %d)\", position.X, position.Y)\n\treturn err\n}\n\nfunc (h *windowsAnsiEventHandler) moveCursorVertical(param int) error {\n\treturn h.moveCursor(vertical, param)\n}\n\nfunc (h *windowsAnsiEventHandler) moveCursorHorizontal(param int) error {\n\treturn h.moveCursor(horizontal, param)\n}\n\nfunc (h *windowsAnsiEventHandler) moveCursor(moveMode int, param int) error {\n\tinfo, err := GetConsoleScreenBufferInfo(h.fd)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tposition := info.CursorPosition\n\tswitch moveMode {\n\tcase horizontal:\n\t\tposition.X += int16(param)\n\tcase vertical:\n\t\tposition.Y += int16(param)\n\t}\n\n\tif err = h.setCursorPosition(position, h.getCursorWindow(info)); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (h *windowsAnsiEventHandler) moveCursorLine(param int) error {\n\tinfo, err := GetConsoleScreenBufferInfo(h.fd)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tposition := info.CursorPosition\n\tposition.X = 0\n\tposition.Y += int16(param)\n\n\tif err = h.setCursorPosition(position, h.getCursorWindow(info)); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (h *windowsAnsiEventHandler) moveCursorColumn(param int) error {\n\tinfo, err := GetConsoleScreenBufferInfo(h.fd)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tposition := info.CursorPosition\n\tposition.X = int16(param) - 1\n\n\tif err = h.setCursorPosition(position, h.getCursorWindow(info)); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/winterm/erase_helpers.go",
    "content": "// +build windows\n\npackage winterm\n\nimport \"github.com/Azure/go-ansiterm\"\n\nfunc (h *windowsAnsiEventHandler) clearRange(attributes uint16, fromCoord COORD, toCoord COORD) error {\n\t// Ignore an invalid (negative area) request\n\tif toCoord.Y < fromCoord.Y {\n\t\treturn nil\n\t}\n\n\tvar err error\n\n\tvar coordStart = COORD{}\n\tvar coordEnd = COORD{}\n\n\txCurrent, yCurrent := fromCoord.X, fromCoord.Y\n\txEnd, yEnd := toCoord.X, toCoord.Y\n\n\t// Clear any partial initial line\n\tif xCurrent > 0 {\n\t\tcoordStart.X, coordStart.Y = xCurrent, yCurrent\n\t\tcoordEnd.X, coordEnd.Y = xEnd, yCurrent\n\n\t\terr = h.clearRect(attributes, coordStart, coordEnd)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\txCurrent = 0\n\t\tyCurrent += 1\n\t}\n\n\t// Clear intervening rectangular section\n\tif yCurrent < yEnd {\n\t\tcoordStart.X, coordStart.Y = xCurrent, yCurrent\n\t\tcoordEnd.X, coordEnd.Y = xEnd, yEnd-1\n\n\t\terr = h.clearRect(attributes, coordStart, coordEnd)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\txCurrent = 0\n\t\tyCurrent = yEnd\n\t}\n\n\t// Clear remaining partial ending line\n\tcoordStart.X, coordStart.Y = xCurrent, yCurrent\n\tcoordEnd.X, coordEnd.Y = xEnd, yEnd\n\n\terr = h.clearRect(attributes, coordStart, coordEnd)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (h *windowsAnsiEventHandler) clearRect(attributes uint16, fromCoord COORD, toCoord COORD) error {\n\tregion := SMALL_RECT{Top: fromCoord.Y, Left: fromCoord.X, Bottom: toCoord.Y, Right: toCoord.X}\n\twidth := toCoord.X - fromCoord.X + 1\n\theight := toCoord.Y - fromCoord.Y + 1\n\tsize := uint32(width) * uint32(height)\n\n\tif size <= 0 {\n\t\treturn nil\n\t}\n\n\tbuffer := make([]CHAR_INFO, size)\n\n\tchar := CHAR_INFO{ansiterm.FILL_CHARACTER, attributes}\n\tfor i := 0; i < int(size); i++ {\n\t\tbuffer[i] = char\n\t}\n\n\terr := WriteConsoleOutput(h.fd, buffer, COORD{X: width, Y: height}, COORD{X: 0, Y: 0}, &region)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/winterm/scroll_helper.go",
    "content": "// +build windows\n\npackage winterm\n\n// effectiveSr gets the current effective scroll region in buffer coordinates\nfunc (h *windowsAnsiEventHandler) effectiveSr(window SMALL_RECT) scrollRegion {\n\ttop := addInRange(window.Top, h.sr.top, window.Top, window.Bottom)\n\tbottom := addInRange(window.Top, h.sr.bottom, window.Top, window.Bottom)\n\tif top >= bottom {\n\t\ttop = window.Top\n\t\tbottom = window.Bottom\n\t}\n\treturn scrollRegion{top: top, bottom: bottom}\n}\n\nfunc (h *windowsAnsiEventHandler) scrollUp(param int) error {\n\tinfo, err := GetConsoleScreenBufferInfo(h.fd)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tsr := h.effectiveSr(info.Window)\n\treturn h.scroll(param, sr, info)\n}\n\nfunc (h *windowsAnsiEventHandler) scrollDown(param int) error {\n\treturn h.scrollUp(-param)\n}\n\nfunc (h *windowsAnsiEventHandler) deleteLines(param int) error {\n\tinfo, err := GetConsoleScreenBufferInfo(h.fd)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tstart := info.CursorPosition.Y\n\tsr := h.effectiveSr(info.Window)\n\t// Lines cannot be inserted or deleted outside the scrolling region.\n\tif start >= sr.top && start <= sr.bottom {\n\t\tsr.top = start\n\t\treturn h.scroll(param, sr, info)\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc (h *windowsAnsiEventHandler) insertLines(param int) error {\n\treturn h.deleteLines(-param)\n}\n\n// scroll scrolls the provided scroll region by param lines. The scroll region is in buffer coordinates.\nfunc (h *windowsAnsiEventHandler) scroll(param int, sr scrollRegion, info *CONSOLE_SCREEN_BUFFER_INFO) error {\n\th.logf(\"scroll: scrollTop: %d, scrollBottom: %d\", sr.top, sr.bottom)\n\th.logf(\"scroll: windowTop: %d, windowBottom: %d\", info.Window.Top, info.Window.Bottom)\n\n\t// Copy from and clip to the scroll region (full buffer width)\n\tscrollRect := SMALL_RECT{\n\t\tTop:    sr.top,\n\t\tBottom: sr.bottom,\n\t\tLeft:   0,\n\t\tRight:  info.Size.X - 1,\n\t}\n\n\t// Origin to which area should be copied\n\tdestOrigin := COORD{\n\t\tX: 0,\n\t\tY: sr.top - int16(param),\n\t}\n\n\tchar := CHAR_INFO{\n\t\tUnicodeChar: ' ',\n\t\tAttributes:  h.attributes,\n\t}\n\n\tif err := ScrollConsoleScreenBuffer(h.fd, scrollRect, scrollRect, destOrigin, char); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (h *windowsAnsiEventHandler) deleteCharacters(param int) error {\n\tinfo, err := GetConsoleScreenBufferInfo(h.fd)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn h.scrollLine(param, info.CursorPosition, info)\n}\n\nfunc (h *windowsAnsiEventHandler) insertCharacters(param int) error {\n\treturn h.deleteCharacters(-param)\n}\n\n// scrollLine scrolls a line horizontally starting at the provided position by a number of columns.\nfunc (h *windowsAnsiEventHandler) scrollLine(columns int, position COORD, info *CONSOLE_SCREEN_BUFFER_INFO) error {\n\t// Copy from and clip to the scroll region (full buffer width)\n\tscrollRect := SMALL_RECT{\n\t\tTop:    position.Y,\n\t\tBottom: position.Y,\n\t\tLeft:   position.X,\n\t\tRight:  info.Size.X - 1,\n\t}\n\n\t// Origin to which area should be copied\n\tdestOrigin := COORD{\n\t\tX: position.X - int16(columns),\n\t\tY: position.Y,\n\t}\n\n\tchar := CHAR_INFO{\n\t\tUnicodeChar: ' ',\n\t\tAttributes:  h.attributes,\n\t}\n\n\tif err := ScrollConsoleScreenBuffer(h.fd, scrollRect, scrollRect, destOrigin, char); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/winterm/utilities.go",
    "content": "// +build windows\n\npackage winterm\n\n// AddInRange increments a value by the passed quantity while ensuring the values\n// always remain within the supplied min / max range.\nfunc addInRange(n int16, increment int16, min int16, max int16) int16 {\n\treturn ensureInRange(n+increment, min, max)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/go-ansiterm/winterm/win_event_handler.go",
    "content": "// +build windows\n\npackage winterm\n\nimport (\n\t\"bytes\"\n\t\"log\"\n\t\"os\"\n\t\"strconv\"\n\n\t\"github.com/Azure/go-ansiterm\"\n)\n\ntype windowsAnsiEventHandler struct {\n\tfd             uintptr\n\tfile           *os.File\n\tinfoReset      *CONSOLE_SCREEN_BUFFER_INFO\n\tsr             scrollRegion\n\tbuffer         bytes.Buffer\n\tattributes     uint16\n\tinverted       bool\n\twrapNext       bool\n\tdrewMarginByte bool\n\toriginMode     bool\n\tmarginByte     byte\n\tcurInfo        *CONSOLE_SCREEN_BUFFER_INFO\n\tcurPos         COORD\n\tlogf           func(string, ...interface{})\n}\n\ntype Option func(*windowsAnsiEventHandler)\n\nfunc WithLogf(f func(string, ...interface{})) Option {\n\treturn func(w *windowsAnsiEventHandler) {\n\t\tw.logf = f\n\t}\n}\n\nfunc CreateWinEventHandler(fd uintptr, file *os.File, opts ...Option) ansiterm.AnsiEventHandler {\n\tinfoReset, err := GetConsoleScreenBufferInfo(fd)\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\th := &windowsAnsiEventHandler{\n\t\tfd:         fd,\n\t\tfile:       file,\n\t\tinfoReset:  infoReset,\n\t\tattributes: infoReset.Attributes,\n\t}\n\tfor _, o := range opts {\n\t\to(h)\n\t}\n\n\tif isDebugEnv := os.Getenv(ansiterm.LogEnv); isDebugEnv == \"1\" {\n\t\tlogFile, _ := os.Create(\"winEventHandler.log\")\n\t\tlogger := log.New(logFile, \"\", log.LstdFlags)\n\t\tif h.logf != nil {\n\t\t\tl := h.logf\n\t\t\th.logf = func(s string, v ...interface{}) {\n\t\t\t\tl(s, v...)\n\t\t\t\tlogger.Printf(s, v...)\n\t\t\t}\n\t\t} else {\n\t\t\th.logf = logger.Printf\n\t\t}\n\t}\n\n\tif h.logf == nil {\n\t\th.logf = func(string, ...interface{}) {}\n\t}\n\n\treturn h\n}\n\ntype scrollRegion struct {\n\ttop    int16\n\tbottom int16\n}\n\n// simulateLF simulates a LF or CR+LF by scrolling if necessary to handle the\n// current cursor position and scroll region settings, in which case it returns\n// true. If no special handling is necessary, then it does nothing and returns\n// false.\n//\n// In the false case, the caller should ensure that a carriage return\n// and line feed are inserted or that the text is otherwise wrapped.\nfunc (h *windowsAnsiEventHandler) simulateLF(includeCR bool) (bool, error) {\n\tif h.wrapNext {\n\t\tif err := h.Flush(); err != nil {\n\t\t\treturn false, err\n\t\t}\n\t\th.clearWrap()\n\t}\n\tpos, info, err := h.getCurrentInfo()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tsr := h.effectiveSr(info.Window)\n\tif pos.Y == sr.bottom {\n\t\t// Scrolling is necessary. Let Windows automatically scroll if the scrolling region\n\t\t// is the full window.\n\t\tif sr.top == info.Window.Top && sr.bottom == info.Window.Bottom {\n\t\t\tif includeCR {\n\t\t\t\tpos.X = 0\n\t\t\t\th.updatePos(pos)\n\t\t\t}\n\t\t\treturn false, nil\n\t\t}\n\n\t\t// A custom scroll region is active. Scroll the window manually to simulate\n\t\t// the LF.\n\t\tif err := h.Flush(); err != nil {\n\t\t\treturn false, err\n\t\t}\n\t\th.logf(\"Simulating LF inside scroll region\")\n\t\tif err := h.scrollUp(1); err != nil {\n\t\t\treturn false, err\n\t\t}\n\t\tif includeCR {\n\t\t\tpos.X = 0\n\t\t\tif err := SetConsoleCursorPosition(h.fd, pos); err != nil {\n\t\t\t\treturn false, err\n\t\t\t}\n\t\t}\n\t\treturn true, nil\n\n\t} else if pos.Y < info.Window.Bottom {\n\t\t// Let Windows handle the LF.\n\t\tpos.Y++\n\t\tif includeCR {\n\t\t\tpos.X = 0\n\t\t}\n\t\th.updatePos(pos)\n\t\treturn false, nil\n\t} else {\n\t\t// The cursor is at the bottom of the screen but outside the scroll\n\t\t// region. Skip the LF.\n\t\th.logf(\"Simulating LF outside scroll region\")\n\t\tif includeCR {\n\t\t\tif err := h.Flush(); err != nil {\n\t\t\t\treturn false, err\n\t\t\t}\n\t\t\tpos.X = 0\n\t\t\tif err := SetConsoleCursorPosition(h.fd, pos); err != nil {\n\t\t\t\treturn false, err\n\t\t\t}\n\t\t}\n\t\treturn true, nil\n\t}\n}\n\n// executeLF executes a LF without a CR.\nfunc (h *windowsAnsiEventHandler) executeLF() error {\n\thandled, err := h.simulateLF(false)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !handled {\n\t\t// Windows LF will reset the cursor column position. Write the LF\n\t\t// and restore the cursor position.\n\t\tpos, _, err := h.getCurrentInfo()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\th.buffer.WriteByte(ansiterm.ANSI_LINE_FEED)\n\t\tif pos.X != 0 {\n\t\t\tif err := h.Flush(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\th.logf(\"Resetting cursor position for LF without CR\")\n\t\t\tif err := SetConsoleCursorPosition(h.fd, pos); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (h *windowsAnsiEventHandler) Print(b byte) error {\n\tif h.wrapNext {\n\t\th.buffer.WriteByte(h.marginByte)\n\t\th.clearWrap()\n\t\tif _, err := h.simulateLF(true); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tpos, info, err := h.getCurrentInfo()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif pos.X == info.Size.X-1 {\n\t\th.wrapNext = true\n\t\th.marginByte = b\n\t} else {\n\t\tpos.X++\n\t\th.updatePos(pos)\n\t\th.buffer.WriteByte(b)\n\t}\n\treturn nil\n}\n\nfunc (h *windowsAnsiEventHandler) Execute(b byte) error {\n\tswitch b {\n\tcase ansiterm.ANSI_TAB:\n\t\th.logf(\"Execute(TAB)\")\n\t\t// Move to the next tab stop, but preserve auto-wrap if already set.\n\t\tif !h.wrapNext {\n\t\t\tpos, info, err := h.getCurrentInfo()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tpos.X = (pos.X + 8) - pos.X%8\n\t\t\tif pos.X >= info.Size.X {\n\t\t\t\tpos.X = info.Size.X - 1\n\t\t\t}\n\t\t\tif err := h.Flush(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif err := SetConsoleCursorPosition(h.fd, pos); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\treturn nil\n\n\tcase ansiterm.ANSI_BEL:\n\t\th.buffer.WriteByte(ansiterm.ANSI_BEL)\n\t\treturn nil\n\n\tcase ansiterm.ANSI_BACKSPACE:\n\t\tif h.wrapNext {\n\t\t\tif err := h.Flush(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\th.clearWrap()\n\t\t}\n\t\tpos, _, err := h.getCurrentInfo()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif pos.X > 0 {\n\t\t\tpos.X--\n\t\t\th.updatePos(pos)\n\t\t\th.buffer.WriteByte(ansiterm.ANSI_BACKSPACE)\n\t\t}\n\t\treturn nil\n\n\tcase ansiterm.ANSI_VERTICAL_TAB, ansiterm.ANSI_FORM_FEED:\n\t\t// Treat as true LF.\n\t\treturn h.executeLF()\n\n\tcase ansiterm.ANSI_LINE_FEED:\n\t\t// Simulate a CR and LF for now since there is no way in go-ansiterm\n\t\t// to tell if the LF should include CR (and more things break when it's\n\t\t// missing than when it's incorrectly added).\n\t\thandled, err := h.simulateLF(true)\n\t\tif handled || err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn h.buffer.WriteByte(ansiterm.ANSI_LINE_FEED)\n\n\tcase ansiterm.ANSI_CARRIAGE_RETURN:\n\t\tif h.wrapNext {\n\t\t\tif err := h.Flush(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\th.clearWrap()\n\t\t}\n\t\tpos, _, err := h.getCurrentInfo()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif pos.X != 0 {\n\t\t\tpos.X = 0\n\t\t\th.updatePos(pos)\n\t\t\th.buffer.WriteByte(ansiterm.ANSI_CARRIAGE_RETURN)\n\t\t}\n\t\treturn nil\n\n\tdefault:\n\t\treturn nil\n\t}\n}\n\nfunc (h *windowsAnsiEventHandler) CUU(param int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"CUU: [%v]\", []string{strconv.Itoa(param)})\n\th.clearWrap()\n\treturn h.moveCursorVertical(-param)\n}\n\nfunc (h *windowsAnsiEventHandler) CUD(param int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"CUD: [%v]\", []string{strconv.Itoa(param)})\n\th.clearWrap()\n\treturn h.moveCursorVertical(param)\n}\n\nfunc (h *windowsAnsiEventHandler) CUF(param int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"CUF: [%v]\", []string{strconv.Itoa(param)})\n\th.clearWrap()\n\treturn h.moveCursorHorizontal(param)\n}\n\nfunc (h *windowsAnsiEventHandler) CUB(param int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"CUB: [%v]\", []string{strconv.Itoa(param)})\n\th.clearWrap()\n\treturn h.moveCursorHorizontal(-param)\n}\n\nfunc (h *windowsAnsiEventHandler) CNL(param int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"CNL: [%v]\", []string{strconv.Itoa(param)})\n\th.clearWrap()\n\treturn h.moveCursorLine(param)\n}\n\nfunc (h *windowsAnsiEventHandler) CPL(param int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"CPL: [%v]\", []string{strconv.Itoa(param)})\n\th.clearWrap()\n\treturn h.moveCursorLine(-param)\n}\n\nfunc (h *windowsAnsiEventHandler) CHA(param int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"CHA: [%v]\", []string{strconv.Itoa(param)})\n\th.clearWrap()\n\treturn h.moveCursorColumn(param)\n}\n\nfunc (h *windowsAnsiEventHandler) VPA(param int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"VPA: [[%d]]\", param)\n\th.clearWrap()\n\tinfo, err := GetConsoleScreenBufferInfo(h.fd)\n\tif err != nil {\n\t\treturn err\n\t}\n\twindow := h.getCursorWindow(info)\n\tposition := info.CursorPosition\n\tposition.Y = window.Top + int16(param) - 1\n\treturn h.setCursorPosition(position, window)\n}\n\nfunc (h *windowsAnsiEventHandler) CUP(row int, col int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"CUP: [[%d %d]]\", row, col)\n\th.clearWrap()\n\tinfo, err := GetConsoleScreenBufferInfo(h.fd)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\twindow := h.getCursorWindow(info)\n\tposition := COORD{window.Left + int16(col) - 1, window.Top + int16(row) - 1}\n\treturn h.setCursorPosition(position, window)\n}\n\nfunc (h *windowsAnsiEventHandler) HVP(row int, col int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"HVP: [[%d %d]]\", row, col)\n\th.clearWrap()\n\treturn h.CUP(row, col)\n}\n\nfunc (h *windowsAnsiEventHandler) DECTCEM(visible bool) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"DECTCEM: [%v]\", []string{strconv.FormatBool(visible)})\n\th.clearWrap()\n\treturn nil\n}\n\nfunc (h *windowsAnsiEventHandler) DECOM(enable bool) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"DECOM: [%v]\", []string{strconv.FormatBool(enable)})\n\th.clearWrap()\n\th.originMode = enable\n\treturn h.CUP(1, 1)\n}\n\nfunc (h *windowsAnsiEventHandler) DECCOLM(use132 bool) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"DECCOLM: [%v]\", []string{strconv.FormatBool(use132)})\n\th.clearWrap()\n\tif err := h.ED(2); err != nil {\n\t\treturn err\n\t}\n\tinfo, err := GetConsoleScreenBufferInfo(h.fd)\n\tif err != nil {\n\t\treturn err\n\t}\n\ttargetWidth := int16(80)\n\tif use132 {\n\t\ttargetWidth = 132\n\t}\n\tif info.Size.X < targetWidth {\n\t\tif err := SetConsoleScreenBufferSize(h.fd, COORD{targetWidth, info.Size.Y}); err != nil {\n\t\t\th.logf(\"set buffer failed: %v\", err)\n\t\t\treturn err\n\t\t}\n\t}\n\twindow := info.Window\n\twindow.Left = 0\n\twindow.Right = targetWidth - 1\n\tif err := SetConsoleWindowInfo(h.fd, true, window); err != nil {\n\t\th.logf(\"set window failed: %v\", err)\n\t\treturn err\n\t}\n\tif info.Size.X > targetWidth {\n\t\tif err := SetConsoleScreenBufferSize(h.fd, COORD{targetWidth, info.Size.Y}); err != nil {\n\t\t\th.logf(\"set buffer failed: %v\", err)\n\t\t\treturn err\n\t\t}\n\t}\n\treturn SetConsoleCursorPosition(h.fd, COORD{0, 0})\n}\n\nfunc (h *windowsAnsiEventHandler) ED(param int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"ED: [%v]\", []string{strconv.Itoa(param)})\n\th.clearWrap()\n\n\t// [J  -- Erases from the cursor to the end of the screen, including the cursor position.\n\t// [1J -- Erases from the beginning of the screen to the cursor, including the cursor position.\n\t// [2J -- Erases the complete display. The cursor does not move.\n\t// Notes:\n\t// -- Clearing the entire buffer, versus just the Window, works best for Windows Consoles\n\n\tinfo, err := GetConsoleScreenBufferInfo(h.fd)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar start COORD\n\tvar end COORD\n\n\tswitch param {\n\tcase 0:\n\t\tstart = info.CursorPosition\n\t\tend = COORD{info.Size.X - 1, info.Size.Y - 1}\n\n\tcase 1:\n\t\tstart = COORD{0, 0}\n\t\tend = info.CursorPosition\n\n\tcase 2:\n\t\tstart = COORD{0, 0}\n\t\tend = COORD{info.Size.X - 1, info.Size.Y - 1}\n\t}\n\n\terr = h.clearRange(h.attributes, start, end)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// If the whole buffer was cleared, move the window to the top while preserving\n\t// the window-relative cursor position.\n\tif param == 2 {\n\t\tpos := info.CursorPosition\n\t\twindow := info.Window\n\t\tpos.Y -= window.Top\n\t\twindow.Bottom -= window.Top\n\t\twindow.Top = 0\n\t\tif err := SetConsoleCursorPosition(h.fd, pos); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := SetConsoleWindowInfo(h.fd, true, window); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (h *windowsAnsiEventHandler) EL(param int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"EL: [%v]\", strconv.Itoa(param))\n\th.clearWrap()\n\n\t// [K  -- Erases from the cursor to the end of the line, including the cursor position.\n\t// [1K -- Erases from the beginning of the line to the cursor, including the cursor position.\n\t// [2K -- Erases the complete line.\n\n\tinfo, err := GetConsoleScreenBufferInfo(h.fd)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar start COORD\n\tvar end COORD\n\n\tswitch param {\n\tcase 0:\n\t\tstart = info.CursorPosition\n\t\tend = COORD{info.Size.X, info.CursorPosition.Y}\n\n\tcase 1:\n\t\tstart = COORD{0, info.CursorPosition.Y}\n\t\tend = info.CursorPosition\n\n\tcase 2:\n\t\tstart = COORD{0, info.CursorPosition.Y}\n\t\tend = COORD{info.Size.X, info.CursorPosition.Y}\n\t}\n\n\terr = h.clearRange(h.attributes, start, end)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (h *windowsAnsiEventHandler) IL(param int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"IL: [%v]\", strconv.Itoa(param))\n\th.clearWrap()\n\treturn h.insertLines(param)\n}\n\nfunc (h *windowsAnsiEventHandler) DL(param int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"DL: [%v]\", strconv.Itoa(param))\n\th.clearWrap()\n\treturn h.deleteLines(param)\n}\n\nfunc (h *windowsAnsiEventHandler) ICH(param int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"ICH: [%v]\", strconv.Itoa(param))\n\th.clearWrap()\n\treturn h.insertCharacters(param)\n}\n\nfunc (h *windowsAnsiEventHandler) DCH(param int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"DCH: [%v]\", strconv.Itoa(param))\n\th.clearWrap()\n\treturn h.deleteCharacters(param)\n}\n\nfunc (h *windowsAnsiEventHandler) SGR(params []int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\tstrings := []string{}\n\tfor _, v := range params {\n\t\tstrings = append(strings, strconv.Itoa(v))\n\t}\n\n\th.logf(\"SGR: [%v]\", strings)\n\n\tif len(params) <= 0 {\n\t\th.attributes = h.infoReset.Attributes\n\t\th.inverted = false\n\t} else {\n\t\tfor _, attr := range params {\n\n\t\t\tif attr == ansiterm.ANSI_SGR_RESET {\n\t\t\t\th.attributes = h.infoReset.Attributes\n\t\t\t\th.inverted = false\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\th.attributes, h.inverted = collectAnsiIntoWindowsAttributes(h.attributes, h.inverted, h.infoReset.Attributes, int16(attr))\n\t\t}\n\t}\n\n\tattributes := h.attributes\n\tif h.inverted {\n\t\tattributes = invertAttributes(attributes)\n\t}\n\terr := SetConsoleTextAttribute(h.fd, attributes)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (h *windowsAnsiEventHandler) SU(param int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"SU: [%v]\", []string{strconv.Itoa(param)})\n\th.clearWrap()\n\treturn h.scrollUp(param)\n}\n\nfunc (h *windowsAnsiEventHandler) SD(param int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"SD: [%v]\", []string{strconv.Itoa(param)})\n\th.clearWrap()\n\treturn h.scrollDown(param)\n}\n\nfunc (h *windowsAnsiEventHandler) DA(params []string) error {\n\th.logf(\"DA: [%v]\", params)\n\t// DA cannot be implemented because it must send data on the VT100 input stream,\n\t// which is not available to go-ansiterm.\n\treturn nil\n}\n\nfunc (h *windowsAnsiEventHandler) DECSTBM(top int, bottom int) error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"DECSTBM: [%d, %d]\", top, bottom)\n\n\t// Windows is 0 indexed, Linux is 1 indexed\n\th.sr.top = int16(top - 1)\n\th.sr.bottom = int16(bottom - 1)\n\n\t// This command also moves the cursor to the origin.\n\th.clearWrap()\n\treturn h.CUP(1, 1)\n}\n\nfunc (h *windowsAnsiEventHandler) RI() error {\n\tif err := h.Flush(); err != nil {\n\t\treturn err\n\t}\n\th.logf(\"RI: []\")\n\th.clearWrap()\n\n\tinfo, err := GetConsoleScreenBufferInfo(h.fd)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tsr := h.effectiveSr(info.Window)\n\tif info.CursorPosition.Y == sr.top {\n\t\treturn h.scrollDown(1)\n\t}\n\n\treturn h.moveCursorVertical(-1)\n}\n\nfunc (h *windowsAnsiEventHandler) IND() error {\n\th.logf(\"IND: []\")\n\treturn h.executeLF()\n}\n\nfunc (h *windowsAnsiEventHandler) Flush() error {\n\th.curInfo = nil\n\tif h.buffer.Len() > 0 {\n\t\th.logf(\"Flush: [%s]\", h.buffer.Bytes())\n\t\tif _, err := h.buffer.WriteTo(h.file); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif h.wrapNext && !h.drewMarginByte {\n\t\th.logf(\"Flush: drawing margin byte '%c'\", h.marginByte)\n\n\t\tinfo, err := GetConsoleScreenBufferInfo(h.fd)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tcharInfo := []CHAR_INFO{{UnicodeChar: uint16(h.marginByte), Attributes: info.Attributes}}\n\t\tsize := COORD{1, 1}\n\t\tposition := COORD{0, 0}\n\t\tregion := SMALL_RECT{Left: info.CursorPosition.X, Top: info.CursorPosition.Y, Right: info.CursorPosition.X, Bottom: info.CursorPosition.Y}\n\t\tif err := WriteConsoleOutput(h.fd, charInfo, size, position, &region); err != nil {\n\t\t\treturn err\n\t\t}\n\t\th.drewMarginByte = true\n\t}\n\treturn nil\n}\n\n// cacheConsoleInfo ensures that the current console screen information has been queried\n// since the last call to Flush(). It must be called before accessing h.curInfo or h.curPos.\nfunc (h *windowsAnsiEventHandler) getCurrentInfo() (COORD, *CONSOLE_SCREEN_BUFFER_INFO, error) {\n\tif h.curInfo == nil {\n\t\tinfo, err := GetConsoleScreenBufferInfo(h.fd)\n\t\tif err != nil {\n\t\t\treturn COORD{}, nil, err\n\t\t}\n\t\th.curInfo = info\n\t\th.curPos = info.CursorPosition\n\t}\n\treturn h.curPos, h.curInfo, nil\n}\n\nfunc (h *windowsAnsiEventHandler) updatePos(pos COORD) {\n\tif h.curInfo == nil {\n\t\tpanic(\"failed to call getCurrentInfo before calling updatePos\")\n\t}\n\th.curPos = pos\n}\n\n// clearWrap clears the state where the cursor is in the margin\n// waiting for the next character before wrapping the line. This must\n// be done before most operations that act on the cursor.\nfunc (h *windowsAnsiEventHandler) clearWrap() {\n\th.wrapNext = false\n\th.drewMarginByte = false\n}\n"
  },
  {
    "path": "vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp/README.md",
    "content": "# GCP Resource detection library\n\nThis is a library intended to be used by Upstream OpenTelemetry resource detectors.  It exists within this repository to allow for integration testing of the detection functions in real GCP environments.\n"
  },
  {
    "path": "vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp/app_engine.go",
    "content": "// Copyright 2022 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage gcp\n\nimport \"context\"\n\nconst (\n\t// See https://cloud.google.com/appengine/docs/flexible/python/migrating#modules\n\t// for the environment variables available in GAE environments.\n\tgaeServiceEnv  = \"GAE_SERVICE\"\n\tgaeVersionEnv  = \"GAE_VERSION\"\n\tgaeInstanceEnv = \"GAE_INSTANCE\"\n\tgaeEnv         = \"GAE_ENV\"\n\tgaeStandard    = \"standard\"\n)\n\nfunc (d *Detector) onAppEngineStandard() bool {\n\t// See https://cloud.google.com/appengine/docs/standard/go111/runtime#environment_variables.\n\tenv, found := d.os.LookupEnv(gaeEnv)\n\treturn found && env == gaeStandard\n}\n\nfunc (d *Detector) onAppEngine() bool {\n\t_, found := d.os.LookupEnv(gaeServiceEnv)\n\treturn found\n}\n\n// AppEngineServiceName returns the service name of the app engine service.\nfunc (d *Detector) AppEngineServiceName() (string, error) {\n\tif name, found := d.os.LookupEnv(gaeServiceEnv); found {\n\t\treturn name, nil\n\t}\n\treturn \"\", errEnvVarNotFound\n}\n\n// AppEngineServiceVersion returns the service version of the app engine service.\nfunc (d *Detector) AppEngineServiceVersion() (string, error) {\n\tif version, found := d.os.LookupEnv(gaeVersionEnv); found {\n\t\treturn version, nil\n\t}\n\treturn \"\", errEnvVarNotFound\n}\n\n// AppEngineServiceInstance returns the service instance of the app engine service.\nfunc (d *Detector) AppEngineServiceInstance() (string, error) {\n\tif instanceID, found := d.os.LookupEnv(gaeInstanceEnv); found {\n\t\treturn instanceID, nil\n\t}\n\treturn \"\", errEnvVarNotFound\n}\n\n// AppEngineFlexAvailabilityZoneAndRegion returns the zone and region in which this program is running.\nfunc (d *Detector) AppEngineFlexAvailabilityZoneAndRegion() (string, string, error) {\n\t// The GCE metadata server is available on App Engine Flex.\n\treturn d.GCEAvailabilityZoneAndRegion()\n}\n\n// AppEngineStandardAvailabilityZone returns the zone the app engine service is running in.\nfunc (d *Detector) AppEngineStandardAvailabilityZone() (string, error) {\n\treturn d.metadata.ZoneWithContext(context.TODO())\n}\n\n// AppEngineStandardCloudRegion returns the region the app engine service is running in.\nfunc (d *Detector) AppEngineStandardCloudRegion() (string, error) {\n\treturn d.FaaSCloudRegion()\n}\n"
  },
  {
    "path": "vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp/bms.go",
    "content": "// Copyright 2024 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage gcp\n\nconst (\n\tbmsProjectIDEnv  = \"BMS_PROJECT_ID\"\n\tbmsRegionEnv     = \"BMS_REGION\"\n\tbmsInstanceIDEnv = \"BMS_INSTANCE_ID\"\n)\n\n// onBareMetalSolution checks if the code is running on a Google Cloud Bare Metal Solution (BMS) by verifying\n// the presence and non-empty values of BMS_PROJECT_ID, BMS_REGION, and BMS_INSTANCE_ID environment variables.\n// For more information on Google Cloud Bare Metal Solution, see: https://cloud.google.com/bare-metal/docs\nfunc (d *Detector) onBareMetalSolution() bool {\n\tprojectID, projectIDExists := d.os.LookupEnv(bmsProjectIDEnv)\n\tregion, regionExists := d.os.LookupEnv(bmsRegionEnv)\n\tinstanceID, instanceIDExists := d.os.LookupEnv(bmsInstanceIDEnv)\n\treturn projectIDExists && regionExists && instanceIDExists && projectID != \"\" && region != \"\" && instanceID != \"\"\n}\n\n// BareMetalSolutionInstanceID returns the instance ID from the BMS_INSTANCE_ID environment variable.\nfunc (d *Detector) BareMetalSolutionInstanceID() (string, error) {\n\tif instanceID, found := d.os.LookupEnv(bmsInstanceIDEnv); found {\n\t\treturn instanceID, nil\n\t}\n\treturn \"\", errEnvVarNotFound\n}\n\n// BareMetalSolutionCloudRegion returns the region from the BMS_REGION environment variable.\nfunc (d *Detector) BareMetalSolutionCloudRegion() (string, error) {\n\tif region, found := d.os.LookupEnv(bmsRegionEnv); found {\n\t\treturn region, nil\n\t}\n\treturn \"\", errEnvVarNotFound\n}\n\n// BareMetalSolutionProjectID returns the project ID from the BMS_PROJECT_ID environment variable.\nfunc (d *Detector) BareMetalSolutionProjectID() (string, error) {\n\tif project, found := d.os.LookupEnv(bmsProjectIDEnv); found {\n\t\treturn project, nil\n\t}\n\treturn \"\", errEnvVarNotFound\n}\n"
  },
  {
    "path": "vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp/detector.go",
    "content": "// Copyright 2022 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage gcp\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"os\"\n\t\"strings\"\n\n\t\"cloud.google.com/go/compute/metadata\"\n)\n\nvar errEnvVarNotFound = errors.New(\"environment variable not found\")\n\n// NewDetector returns a *Detector which can get detect the platform,\n// and fetch attributes of the platform on which it is running.\nfunc NewDetector() *Detector {\n\treturn &Detector{metadata: metadata.NewClient(nil), os: realOSProvider{}}\n}\n\ntype Platform int64\n\nconst (\n\tUnknownPlatform Platform = iota\n\tGKE\n\tGCE\n\tCloudRun\n\tCloudRunJob\n\tCloudFunctions\n\tAppEngineStandard\n\tAppEngineFlex\n\tBareMetalSolution\n)\n\n// CloudPlatform returns the platform on which this program is running.\nfunc (d *Detector) CloudPlatform() Platform {\n\tswitch {\n\tcase d.onBareMetalSolution():\n\t\treturn BareMetalSolution\n\tcase d.onGKE():\n\t\treturn GKE\n\tcase d.onCloudFunctions():\n\t\treturn CloudFunctions\n\tcase d.onCloudRun():\n\t\treturn CloudRun\n\tcase d.onCloudRunJob():\n\t\treturn CloudRunJob\n\tcase d.onAppEngineStandard():\n\t\treturn AppEngineStandard\n\tcase d.onAppEngine():\n\t\treturn AppEngineFlex\n\tcase d.onGCE():\n\t\treturn GCE\n\t}\n\treturn UnknownPlatform\n}\n\n// ProjectID returns the ID of the project in which this program is running.\nfunc (d *Detector) ProjectID() (string, error) {\n\t// N.B. d.metadata.ProjectIDWithContext(context.TODO()) is cached globally, so if we use it here it's untestable.\n\ts, err := d.metadata.GetWithContext(context.TODO(), \"project/project-id\")\n\treturn strings.TrimSpace(s), err\n}\n\n// instanceID returns the ID of the project in which this program is running.\nfunc (d *Detector) instanceID() (string, error) {\n\t// N.B. d.metadata.InstanceIDWithContext(context.TODO()) is cached globally, so if we use it here it's untestable.\n\ts, err := d.metadata.GetWithContext(context.TODO(), \"instance/id\")\n\treturn strings.TrimSpace(s), err\n}\n\n// Detector collects resource information for all GCP platforms.\ntype Detector struct {\n\tmetadata *metadata.Client\n\tos       osProvider\n}\n\n// osProvider contains the subset of the os package functions used by.\ntype osProvider interface {\n\tLookupEnv(string) (string, bool)\n}\n\n// realOSProvider uses the os package to lookup env vars.\ntype realOSProvider struct{}\n\nfunc (realOSProvider) LookupEnv(env string) (string, bool) {\n\treturn os.LookupEnv(env)\n}\n"
  },
  {
    "path": "vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp/faas.go",
    "content": "// Copyright 2022 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage gcp\n\nimport (\n\t\"context\"\n\t\"strings\"\n)\n\nconst (\n\t// Cloud Functions env vars:\n\t// https://cloud.google.com/functions/docs/configuring/env-var#newer_runtimes\n\t//\n\t// Cloud Run env vars:\n\t// https://cloud.google.com/run/docs/container-contract#services-env-vars\n\t//\n\t// Cloud Run jobs env vars:\n\t// https://cloud.google.com/run/docs/container-contract#jobs-env-vars\n\tcloudFunctionsTargetEnv  = \"FUNCTION_TARGET\"\n\tcloudRunConfigurationEnv = \"K_CONFIGURATION\"\n\tcloudRunJobsEnv          = \"CLOUD_RUN_JOB\"\n\tfaasServiceEnv           = \"K_SERVICE\"\n\tfaasRevisionEnv          = \"K_REVISION\"\n\tcloudRunJobExecutionEnv  = \"CLOUD_RUN_EXECUTION\"\n\tcloudRunJobTaskIndexEnv  = \"CLOUD_RUN_TASK_INDEX\"\n\tregionMetadataAttr       = \"instance/region\"\n)\n\nfunc (d *Detector) onCloudFunctions() bool {\n\t_, found := d.os.LookupEnv(cloudFunctionsTargetEnv)\n\treturn found\n}\n\nfunc (d *Detector) onCloudRun() bool {\n\t_, found := d.os.LookupEnv(cloudRunConfigurationEnv)\n\treturn found\n}\n\nfunc (d *Detector) onCloudRunJob() bool {\n\t_, found := d.os.LookupEnv(cloudRunJobsEnv)\n\treturn found\n}\n\n// FaaSName returns the name of the Cloud Run, Cloud Run jobs or Cloud Functions service.\nfunc (d *Detector) FaaSName() (string, error) {\n\tif name, found := d.os.LookupEnv(faasServiceEnv); found {\n\t\treturn name, nil\n\t}\n\tif name, found := d.os.LookupEnv(cloudRunJobsEnv); found {\n\t\treturn name, nil\n\t}\n\treturn \"\", errEnvVarNotFound\n}\n\n// FaaSVersion returns the revision of the Cloud Run or Cloud Functions service.\nfunc (d *Detector) FaaSVersion() (string, error) {\n\tif version, found := d.os.LookupEnv(faasRevisionEnv); found {\n\t\treturn version, nil\n\t}\n\treturn \"\", errEnvVarNotFound\n}\n\n// CloudRunJobExecution returns the execution id of the Cloud Run jobs.\nfunc (d *Detector) CloudRunJobExecution() (string, error) {\n\tif eid, found := d.os.LookupEnv(cloudRunJobExecutionEnv); found {\n\t\treturn eid, nil\n\t}\n\treturn \"\", errEnvVarNotFound\n}\n\n// CloudRunJobTaskIndex returns the task index for the execution of the Cloud Run jobs.\nfunc (d *Detector) CloudRunJobTaskIndex() (string, error) {\n\tif tidx, found := d.os.LookupEnv(cloudRunJobTaskIndexEnv); found {\n\t\treturn tidx, nil\n\t}\n\treturn \"\", errEnvVarNotFound\n}\n\n// FaaSID returns the instance id of the Cloud Run or Cloud Function.\nfunc (d *Detector) FaaSID() (string, error) {\n\treturn d.instanceID()\n}\n\n// FaaSCloudRegion detects region from the metadata server.\n// It is in the format /projects/<project_number>/regions/<region>.\n//\n// https://cloud.google.com/run/docs/reference/container-contract#metadata-server\nfunc (d *Detector) FaaSCloudRegion() (string, error) {\n\tregion, err := d.metadata.GetWithContext(context.TODO(), regionMetadataAttr)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn region[strings.LastIndex(region, \"/\")+1:], nil\n}\n"
  },
  {
    "path": "vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp/gce.go",
    "content": "// Copyright 2022 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage gcp\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"cloud.google.com/go/compute/metadata\"\n)\n\n// See the available GCE instance metadata:\n// https://cloud.google.com/compute/docs/metadata/predefined-metadata-keys#instance-metadata\nconst machineTypeMetadataAttr = \"instance/machine-type\"\n\n// https://cloud.google.com/compute/docs/instance-groups/getting-info-about-migs#checking_if_a_vm_instance_is_part_of_a_mig\nconst createdByInstanceAttr = \"created-by\"\n\nfunc (d *Detector) onGCE() bool {\n\t_, err := d.metadata.GetWithContext(context.TODO(), machineTypeMetadataAttr)\n\treturn err == nil\n}\n\n// GCEHostType returns the machine type of the instance on which this program is running.\nfunc (d *Detector) GCEHostType() (string, error) {\n\treturn d.metadata.GetWithContext(context.TODO(), machineTypeMetadataAttr)\n}\n\n// GCEHostID returns the instance ID of the instance on which this program is running.\nfunc (d *Detector) GCEHostID() (string, error) {\n\treturn d.instanceID()\n}\n\n// GCEHostName returns the instance name of the instance on which this program is running.\n// Recommended to use GCEInstanceName() or GCEInstanceHostname() to more accurately reflect which\n// value is returned.\nfunc (d *Detector) GCEHostName() (string, error) {\n\treturn d.metadata.InstanceNameWithContext(context.TODO())\n}\n\n// GCEInstanceName returns the instance name of the instance on which this program is running.\n// This is the value visible in the Cloud Console UI, and the prefix for the default hostname\n// of the instance as defined by the default internal DNS name (see https://cloud.google.com/compute/docs/internal-dns#instance-fully-qualified-domain-names).\nfunc (d *Detector) GCEInstanceName() (string, error) {\n\treturn d.metadata.InstanceNameWithContext(context.TODO())\n}\n\n// GCEInstanceHostname returns the full value of the default or custom hostname of the instance\n// on which this program is running. See https://cloud.google.com/compute/docs/instances/custom-hostname-vm.\nfunc (d *Detector) GCEInstanceHostname() (string, error) {\n\treturn d.metadata.HostnameWithContext(context.TODO())\n}\n\n// GCEAvailabilityZoneAndRegion returns the zone and region in which this program is running.\nfunc (d *Detector) GCEAvailabilityZoneAndRegion() (string, string, error) {\n\tzone, err := d.metadata.ZoneWithContext(context.TODO())\n\tif err != nil {\n\t\treturn \"\", \"\", err\n\t}\n\tif zone == \"\" {\n\t\treturn \"\", \"\", fmt.Errorf(\"no zone detected from GCE metadata server\")\n\t}\n\tsplitZone := strings.SplitN(zone, \"-\", 3)\n\tif len(splitZone) != 3 {\n\t\treturn \"\", \"\", fmt.Errorf(\"zone was not in the expected format: country-region-zone.  Got %v\", zone)\n\t}\n\treturn zone, strings.Join(splitZone[0:2], \"-\"), nil\n}\n\ntype ManagedInstanceGroup struct {\n\tName     string\n\tLocation string\n\tType     LocationType\n}\n\nvar createdByMIGRE = regexp.MustCompile(`^projects/[^/]+/(zones|regions)/([^/]+)/instanceGroupManagers/([^/]+)$`)\n\nfunc (d *Detector) GCEManagedInstanceGroup() (ManagedInstanceGroup, error) {\n\tcreatedBy, err := d.metadata.InstanceAttributeValueWithContext(context.TODO(), createdByInstanceAttr)\n\tif _, ok := err.(metadata.NotDefinedError); ok {\n\t\treturn ManagedInstanceGroup{}, nil\n\t} else if err != nil {\n\t\treturn ManagedInstanceGroup{}, err\n\t}\n\tmatches := createdByMIGRE.FindStringSubmatch(createdBy)\n\tif matches == nil {\n\t\t// The \"created-by\" key exists, but it doesn't describe a MIG.\n\t\t// Something else must have created this VM.\n\t\treturn ManagedInstanceGroup{}, nil\n\t}\n\n\tmig := ManagedInstanceGroup{\n\t\tName:     matches[3],\n\t\tLocation: matches[2],\n\t}\n\tswitch matches[1] {\n\tcase \"zones\":\n\t\tmig.Type = Zone\n\tcase \"regions\":\n\t\tmig.Type = Region\n\t}\n\treturn mig, nil\n}\n"
  },
  {
    "path": "vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp/gke.go",
    "content": "// Copyright 2022 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage gcp\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n)\n\nconst (\n\t// If the kubernetes.default.svc service exists in the cluster,\n\t// then the KUBERNETES_SERVICE_HOST env var will be populated.\n\t// Use this as an indication that we are running on kubernetes.\n\tk8sServiceHostEnv = \"KUBERNETES_SERVICE_HOST\"\n\t// See the available GKE metadata:\n\t// https://cloud.google.com/kubernetes-engine/docs/concepts/workload-identity#instance_metadata\n\tclusterNameMetadataAttr     = \"cluster-name\"\n\tclusterLocationMetadataAttr = \"cluster-location\"\n)\n\nfunc (d *Detector) onGKE() bool {\n\t// Check if we are on k8s first\n\t_, found := d.os.LookupEnv(k8sServiceHostEnv)\n\tif !found {\n\t\treturn false\n\t}\n\t// If we are on k8s, make sure that we are actually on GKE, and not a\n\t// different managed k8s platform.\n\t_, err := d.metadata.InstanceAttributeValueWithContext(context.TODO(), clusterLocationMetadataAttr)\n\treturn err == nil\n}\n\n// GKEHostID returns the instance ID of the instance on which this program is running.\nfunc (d *Detector) GKEHostID() (string, error) {\n\treturn d.GCEHostID()\n}\n\n// GKEClusterName returns the name if the GKE cluster in which this program is running.\nfunc (d *Detector) GKEClusterName() (string, error) {\n\treturn d.metadata.InstanceAttributeValueWithContext(context.TODO(), clusterNameMetadataAttr)\n}\n\ntype LocationType int64\n\nconst (\n\tUndefinedLocation LocationType = iota\n\tZone\n\tRegion\n)\n\n// GKEAvailabilityZoneOrRegion returns the location of the cluster and whether the cluster is zonal or regional.\nfunc (d *Detector) GKEAvailabilityZoneOrRegion() (string, LocationType, error) {\n\tclusterLocation, err := d.metadata.InstanceAttributeValueWithContext(context.TODO(), clusterLocationMetadataAttr)\n\tif err != nil {\n\t\treturn \"\", UndefinedLocation, err\n\t}\n\tswitch strings.Count(clusterLocation, \"-\") {\n\tcase 1:\n\t\treturn clusterLocation, Region, nil\n\tcase 2:\n\t\treturn clusterLocation, Zone, nil\n\tdefault:\n\t\treturn \"\", UndefinedLocation, fmt.Errorf(\"unrecognized format for cluster location: %v\", clusterLocation)\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/README.md",
    "content": "# OpenTelemetry Google Cloud Monitoring Exporter\n\n[![Docs](https://godoc.org/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric?status.svg)](https://pkg.go.dev/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric)\n[![Apache License][license-image]][license-url]\n\nOpenTelemetry Google Cloud Monitoring Exporter allows the user to send collected metrics to Google Cloud.\n\nTo get started with instrumentation in Google Cloud, see [Generate traces and metrics with\nGo](https://cloud.google.com/stackdriver/docs/instrumentation/setup/go).\n\nTo learn more about instrumentation and observability, including opinionated recommendations\nfor Google Cloud Observability, visit [Instrumentation and\nobservability](https://cloud.google.com/stackdriver/docs/instrumentation/overview).\n\n[Google Cloud Monitoring](https://cloud.google.com/monitoring) provides visibility into the performance, uptime, and overall health of cloud-powered applications. It collects metrics, events, and metadata from Google Cloud, Amazon Web Services, hosted uptime probes, application instrumentation, and a variety of common application components including Cassandra, Nginx, Apache Web Server, Elasticsearch, and many others. Operations ingests that data and generates insights via dashboards, charts, and alerts. Cloud Monitoring alerting helps you collaborate by integrating with Slack, PagerDuty, and more.\n\n## Setup\n\nGoogle Cloud Monitoring is a managed service provided by Google Cloud Platform. Google Cloud Monitoring requires to set up \"Workspace\" in advance. The guide to create a new Workspace is available on [the official document](https://cloud.google.com/monitoring/workspaces/create).\n\n## Authentication\n\nThe Google Cloud Monitoring exporter depends upon [`google.FindDefaultCredentials`](https://pkg.go.dev/golang.org/x/oauth2/google?tab=doc#FindDefaultCredentials), so the service account is automatically detected by default, but also the custom credential file (so called `service_account_key.json`) can be detected with specific conditions. Quoting from the document of `google.FindDefaultCredentials`:\n\n* A JSON file whose path is specified by the `GOOGLE_APPLICATION_CREDENTIALS` environment variable.\n* A JSON file in a location known to the gcloud command-line tool. On Windows, this is `%APPDATA%/gcloud/application_default_credentials.json`. On other systems, `$HOME/.config/gcloud/application_default_credentials.json`.\n\nWhen running code locally, you may need to specify a Google Project ID in addition to `GOOGLE_APPLICATION_CREDENTIALS`. This is best done using an environment variable (e.g. `GOOGLE_CLOUD_PROJECT`) and the `metric.WithProjectID` method, e.g.:\n\n```golang\nprojectID := os.Getenv(\"GOOGLE_CLOUD_PROJECT\")\nopts := []mexporter.Option{\n    mexporter.WithProjectID(projectID),\n}\n```\n\n## Useful links\n\n* For more information on OpenTelemetry, visit: https://opentelemetry.io/\n* For more about OpenTelemetry Go, visit: https://github.com/open-telemetry/opentelemetry-go\n* Learn more about Google Cloud Monitoring at https://cloud.google.com/monitoring\n\n[license-url]: https://github.com/GoogleCloudPlatform/opentelemetry-operations-go/blob/main/LICENSE\n[license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat\n"
  },
  {
    "path": "vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/cloudmonitoring.go",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage metric\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\n\tsdkmetric \"go.opentelemetry.io/otel/sdk/metric\"\n\n\tmonitoring \"cloud.google.com/go/monitoring/apiv3/v2\"\n\t\"golang.org/x/oauth2/google\"\n)\n\n// New creates a new Exporter thats implements metric.Exporter.\nfunc New(opts ...Option) (sdkmetric.Exporter, error) {\n\to := options{\n\t\tcontext:                 context.Background(),\n\t\tresourceAttributeFilter: DefaultResourceAttributesFilter,\n\t}\n\tfor _, opt := range opts {\n\t\topt(&o)\n\t}\n\n\tif o.projectID == \"\" {\n\t\tcreds, err := google.FindDefaultCredentials(o.context, monitoring.DefaultAuthScopes()...)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to find Google Cloud credentials: %v\", err)\n\t\t}\n\t\tif creds.ProjectID == \"\" {\n\t\t\treturn nil, errors.New(\"google cloud monitoring: no project found with application default credentials\")\n\t\t}\n\t\to.projectID = creds.ProjectID\n\t}\n\treturn newMetricExporter(&o)\n}\n"
  },
  {
    "path": "vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/constants.go",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage metric\n\n// TODO: remove this file when the constants are ready in the Go SDK\n\n// Mappings for the well-known OpenTelemetry resource label keys\n// to applicable Monitored Resource label keys.\n// A uniquely identifying name for the Kubernetes cluster. Kubernetes\n// does not have cluster names as an internal concept so this may be\n// set to any meaningful value within the environment. For example,\n// GKE clusters have a name which can be used for this label.\nconst (\n\t// Deprecated: use semconv.CloudProviderKey instead.\n\tCloudKeyProvider = \"cloud.provider\"\n\t// Deprecated: use semconv.CloudAccountIDKey instead.\n\tCloudKeyAccountID = \"cloud.account.id\"\n\t// Deprecated: use semconv.CloudRegionKey instead.\n\tCloudKeyRegion = \"cloud.region\"\n\t// Deprecated: use semconv.CloudAvailabilityZoneKey instead.\n\tCloudKeyZone = \"cloud.availability_zone\"\n\n\t// Deprecated: use semconv.ServiceNamespaceKey instead.\n\tServiceKeyNamespace = \"service.namespace\"\n\t// Deprecated: use semconv.ServiceInstanceIDKey instead.\n\tServiceKeyInstanceID = \"service.instance.id\"\n\t// Deprecated: use semconv.ServiceNameKey instead.\n\tServiceKeyName = \"service.name\"\n\n\t// Deprecated: HostType is not needed.\n\tHostType = \"host\"\n\t// A uniquely identifying name for the host.\n\t// Deprecated: use semconv.HostNameKey instead.\n\tHostKeyName = \"host.name\"\n\t// A hostname as returned by the 'hostname' command on host machine.\n\t// Deprecated: HostKeyHostName is not needed.\n\tHostKeyHostName = \"host.hostname\"\n\t// Deprecated: use semconv.HostIDKey instead.\n\tHostKeyID = \"host.id\"\n\t// Deprecated: use semconv.HostTypeKey instead.\n\tHostKeyType = \"host.type\"\n\n\t// A uniquely identifying name for the Container.\n\t// Deprecated: use semconv.ContainerNameKey instead.\n\tContainerKeyName = \"container.name\"\n\t// Deprecated: use semconv.ContainerImageNameKey instead.\n\tContainerKeyImageName = \"container.image.name\"\n\t// Deprecated: use semconv.ContainerImageTagKey instead.\n\tContainerKeyImageTag = \"container.image.tag\"\n\n\t// Cloud Providers\n\t// Deprecated: use semconv.CloudProviderAWS instead.\n\tCloudProviderAWS = \"aws\"\n\t// Deprecated: use semconv.CloudProviderGCP instead.\n\tCloudProviderGCP = \"gcp\"\n\t// Deprecated: use semconv.CloudProviderAzure instead.\n\tCloudProviderAZURE = \"azure\"\n\n\t// Deprecated: Use \"k8s\" instead. This should not be needed.\n\tK8S = \"k8s\"\n\t// Deprecated: use semconv.K8SClusterNameKey instead.\n\tK8SKeyClusterName = \"k8s.cluster.name\"\n\t// Deprecated: use semconv.K8SNamespaceNameKey instead.\n\tK8SKeyNamespaceName = \"k8s.namespace.name\"\n\t// Deprecated: use semconv.K8SPodNameKey instead.\n\tK8SKeyPodName = \"k8s.pod.name\"\n\t// Deprecated: use semconv.K8SDeploymentNameKey instead.\n\tK8SKeyDeploymentName = \"k8s.deployment.name\"\n\n\t// Monitored Resources types\n\t// Deprecated: Use \"k8s_container\" instead.\n\tK8SContainer = \"k8s_container\"\n\t// Deprecated: Use \"k8s_node\" instead.\n\tK8SNode = \"k8s_node\"\n\t// Deprecated: Use \"k8s_pod\" instead.\n\tK8SPod = \"k8s_pod\"\n\t// Deprecated: Use \"k8s_cluster\" instead.\n\tK8SCluster = \"k8s_cluster\"\n\t// Deprecated: Use \"gce_instance\" instead.\n\tGCEInstance = \"gce_instance\"\n\t// Deprecated: Use \"aws_ec2_instance\" instead.\n\tAWSEC2Instance = \"aws_ec2_instance\"\n\t// Deprecated: Use \"generic_task\" instead.\n\tGenericTask = \"generic_task\"\n)\n"
  },
  {
    "path": "vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/error.go",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage metric\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\nvar (\n\terrBlankProjectID = errors.New(\"expecting a non-blank ProjectID\")\n)\n\ntype errUnexpectedAggregationKind struct {\n\tkind string\n}\n\nfunc (e errUnexpectedAggregationKind) Error() string {\n\treturn fmt.Sprintf(\"the metric kind is unexpected: %v\", e.kind)\n}\n"
  },
  {
    "path": "vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/metric.go",
    "content": "// Copyright 2021 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage metric\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math\"\n\t\"net/url\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\t\"unicode\"\n\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/sdk/instrumentation\"\n\t\"go.opentelemetry.io/otel/sdk/metric\"\n\t\"go.opentelemetry.io/otel/sdk/metric/metricdata\"\n\t\"go.opentelemetry.io/otel/sdk/resource\"\n\t\"go.opentelemetry.io/otel/trace\"\n\n\tmonitoring \"cloud.google.com/go/monitoring/apiv3/v2\"\n\t\"cloud.google.com/go/monitoring/apiv3/v2/monitoringpb\"\n\t\"github.com/googleapis/gax-go/v2\"\n\t\"google.golang.org/api/option\"\n\t\"google.golang.org/genproto/googleapis/api/distribution\"\n\t\"google.golang.org/genproto/googleapis/api/label\"\n\tgooglemetricpb \"google.golang.org/genproto/googleapis/api/metric\"\n\tmonitoredrespb \"google.golang.org/genproto/googleapis/api/monitoredres\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/encoding/gzip\"\n\t\"google.golang.org/grpc/metadata\"\n\t\"google.golang.org/protobuf/types/known/anypb\"\n\t\"google.golang.org/protobuf/types/known/timestamppb\"\n\n\t\"github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping\"\n)\n\nconst (\n\t// The number of timeserieses to send to GCM in a single request. This\n\t// is a hard limit in the GCM API, so we never want to exceed 200.\n\tsendBatchSize = 200\n\n\tcloudMonitoringMetricDescriptorNameFormat = \"workload.googleapis.com/%s\"\n\tplatformMappingMonitoredResourceKey       = \"gcp.resource_type\"\n)\n\n// key is used to judge the uniqueness of the record descriptor.\ntype key struct {\n\tname        string\n\tlibraryname string\n}\n\nfunc keyOf(metrics metricdata.Metrics, library instrumentation.Scope) key {\n\treturn key{\n\t\tname:        metrics.Name,\n\t\tlibraryname: library.Name,\n\t}\n}\n\n// metricExporter is the implementation of OpenTelemetry metric exporter for\n// Google Cloud Monitoring.\ntype metricExporter struct {\n\to        *options\n\tshutdown chan struct{}\n\t// mdCache is the cache to hold MetricDescriptor to avoid creating duplicate MD.\n\tmdCache      map[key]*googlemetricpb.MetricDescriptor\n\tclient       *monitoring.MetricClient\n\tmdLock       sync.RWMutex\n\tshutdownOnce sync.Once\n}\n\n// ForceFlush does nothing, the exporter holds no state.\nfunc (e *metricExporter) ForceFlush(ctx context.Context) error { return ctx.Err() }\n\n// Shutdown shuts down the client connections.\nfunc (e *metricExporter) Shutdown(ctx context.Context) error {\n\terr := errShutdown\n\te.shutdownOnce.Do(func() {\n\t\tclose(e.shutdown)\n\t\terr = errors.Join(ctx.Err(), e.client.Close())\n\t})\n\treturn err\n}\n\n// newMetricExporter returns an exporter that uploads OTel metric data to Google Cloud Monitoring.\nfunc newMetricExporter(o *options) (*metricExporter, error) {\n\tif strings.TrimSpace(o.projectID) == \"\" {\n\t\treturn nil, errBlankProjectID\n\t}\n\n\tclientOpts := append([]option.ClientOption{option.WithGRPCDialOption(grpc.WithUserAgent(userAgent))}, o.monitoringClientOptions...)\n\tctx := o.context\n\tif ctx == nil {\n\t\tctx = context.Background()\n\t}\n\tclient, err := monitoring.NewMetricClient(ctx, clientOpts...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif o.compression == \"gzip\" {\n\t\tclient.CallOptions.GetMetricDescriptor = append(client.CallOptions.GetMetricDescriptor,\n\t\t\tgax.WithGRPCOptions(grpc.UseCompressor(gzip.Name)))\n\t\tclient.CallOptions.CreateMetricDescriptor = append(client.CallOptions.CreateMetricDescriptor,\n\t\t\tgax.WithGRPCOptions(grpc.UseCompressor(gzip.Name)))\n\t\tclient.CallOptions.CreateTimeSeries = append(client.CallOptions.CreateTimeSeries,\n\t\t\tgax.WithGRPCOptions(grpc.UseCompressor(gzip.Name)))\n\t\tclient.CallOptions.CreateServiceTimeSeries = append(client.CallOptions.CreateServiceTimeSeries,\n\t\t\tgax.WithGRPCOptions(grpc.UseCompressor(gzip.Name)))\n\t}\n\n\tcache := map[key]*googlemetricpb.MetricDescriptor{}\n\te := &metricExporter{\n\t\to:        o,\n\t\tmdCache:  cache,\n\t\tclient:   client,\n\t\tshutdown: make(chan struct{}),\n\t}\n\treturn e, nil\n}\n\nvar errShutdown = fmt.Errorf(\"exporter is shutdown\")\n\n// Export exports OpenTelemetry Metrics to Google Cloud Monitoring.\nfunc (me *metricExporter) Export(ctx context.Context, rm *metricdata.ResourceMetrics) error {\n\tselect {\n\tcase <-me.shutdown:\n\t\treturn errShutdown\n\tdefault:\n\t}\n\n\tif me.o.destinationProjectQuota {\n\t\tctx = metadata.NewOutgoingContext(ctx, metadata.New(map[string]string{\"x-goog-user-project\": strings.TrimPrefix(me.o.projectID, \"projects/\")}))\n\t}\n\treturn errors.Join(\n\t\tme.exportMetricDescriptor(ctx, rm),\n\t\tme.exportTimeSeries(ctx, rm),\n\t)\n}\n\n// Temporality returns the Temporality to use for an instrument kind.\nfunc (me *metricExporter) Temporality(ik metric.InstrumentKind) metricdata.Temporality {\n\treturn metric.DefaultTemporalitySelector(ik)\n}\n\n// Aggregation returns the Aggregation to use for an instrument kind.\nfunc (me *metricExporter) Aggregation(ik metric.InstrumentKind) metric.Aggregation {\n\treturn metric.DefaultAggregationSelector(ik)\n}\n\n// exportMetricDescriptor create MetricDescriptor from the record\n// if the descriptor is not registered in Cloud Monitoring yet.\nfunc (me *metricExporter) exportMetricDescriptor(ctx context.Context, rm *metricdata.ResourceMetrics) error {\n\t// We only send metric descriptors if we're configured *and* we're not sending service timeseries.\n\tif me.o.disableCreateMetricDescriptors {\n\t\treturn nil\n\t}\n\n\tme.mdLock.Lock()\n\tdefer me.mdLock.Unlock()\n\tmds := make(map[key]*googlemetricpb.MetricDescriptor)\n\textraLabels := me.extraLabelsFromResource(rm.Resource)\n\tfor _, scope := range rm.ScopeMetrics {\n\t\tfor _, metrics := range scope.Metrics {\n\t\t\tk := keyOf(metrics, scope.Scope)\n\n\t\t\tif _, ok := me.mdCache[k]; ok {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif _, localok := mds[k]; !localok {\n\t\t\t\tmd := me.recordToMdpb(metrics, extraLabels)\n\t\t\t\tmds[k] = md\n\t\t\t}\n\t\t}\n\t}\n\n\t// TODO: This process is synchronous and blocks longer time if records in cps\n\t// have many different descriptors. In the cps.ForEach above, it should spawn\n\t// goroutines to send CreateMetricDescriptorRequest asynchronously in the case\n\t// the descriptor does not exist in global cache (me.mdCache).\n\t// See details in #26.\n\tvar errs []error\n\tfor kmd, md := range mds {\n\t\terr := me.createMetricDescriptorIfNeeded(ctx, md)\n\t\tif err == nil {\n\t\t\tme.mdCache[kmd] = md\n\t\t}\n\t\terrs = append(errs, err)\n\t}\n\treturn errors.Join(errs...)\n}\n\nfunc (me *metricExporter) createMetricDescriptorIfNeeded(ctx context.Context, md *googlemetricpb.MetricDescriptor) error {\n\tmdReq := &monitoringpb.GetMetricDescriptorRequest{\n\t\tName: fmt.Sprintf(\"projects/%s/metricDescriptors/%s\", me.o.projectID, md.Type),\n\t}\n\t_, err := me.client.GetMetricDescriptor(ctx, mdReq)\n\tif err == nil {\n\t\t// If the metric descriptor already exists, skip the CreateMetricDescriptor call.\n\t\t// Metric descriptors cannot be updated without deleting them first, so there\n\t\t// isn't anything we can do here:\n\t\t// https://cloud.google.com/monitoring/custom-metrics/creating-metrics#md-modify\n\t\treturn nil\n\t}\n\treq := &monitoringpb.CreateMetricDescriptorRequest{\n\t\tName:             fmt.Sprintf(\"projects/%s\", me.o.projectID),\n\t\tMetricDescriptor: md,\n\t}\n\t_, err = me.client.CreateMetricDescriptor(ctx, req)\n\treturn err\n}\n\n// exportTimeSeries create TimeSeries from the records in cps.\n// res should be the common resource among all TimeSeries, such as instance id, application name and so on.\nfunc (me *metricExporter) exportTimeSeries(ctx context.Context, rm *metricdata.ResourceMetrics) error {\n\ttss, err := me.recordsToTspbs(rm)\n\tif len(tss) == 0 {\n\t\treturn err\n\t}\n\n\tname := fmt.Sprintf(\"projects/%s\", me.o.projectID)\n\n\terrs := []error{err}\n\tfor i := 0; i < len(tss); i += sendBatchSize {\n\t\tj := i + sendBatchSize\n\t\tif j >= len(tss) {\n\t\t\tj = len(tss)\n\t\t}\n\n\t\t// TODO: When this exporter is rewritten, support writing to multiple\n\t\t// projects based on the \"gcp.project.id\" resource.\n\t\treq := &monitoringpb.CreateTimeSeriesRequest{\n\t\t\tName:       name,\n\t\t\tTimeSeries: tss[i:j],\n\t\t}\n\t\tif me.o.createServiceTimeSeries {\n\t\t\terrs = append(errs, me.client.CreateServiceTimeSeries(ctx, req))\n\t\t} else {\n\t\t\terrs = append(errs, me.client.CreateTimeSeries(ctx, req))\n\t\t}\n\t}\n\n\treturn errors.Join(errs...)\n}\n\nfunc (me *metricExporter) extraLabelsFromResource(res *resource.Resource) *attribute.Set {\n\tset, _ := attribute.NewSetWithFiltered(res.Attributes(), me.o.resourceAttributeFilter)\n\treturn &set\n}\n\n// descToMetricType converts descriptor to MetricType proto type.\n// Basically this returns default value (\"workload.googleapis.com/[metric type]\").\nfunc (me *metricExporter) descToMetricType(desc metricdata.Metrics) string {\n\tif formatter := me.o.metricDescriptorTypeFormatter; formatter != nil {\n\t\treturn formatter(desc)\n\t}\n\treturn fmt.Sprintf(cloudMonitoringMetricDescriptorNameFormat, desc.Name)\n}\n\n// metricTypeToDisplayName takes a GCM metric type, like (workload.googleapis.com/MyCoolMetric) and returns the display name.\nfunc metricTypeToDisplayName(mURL string) string {\n\t// strip domain, keep path after domain.\n\tu, err := url.Parse(fmt.Sprintf(\"metrics://%s\", mURL))\n\tif err != nil || u.Path == \"\" {\n\t\treturn mURL\n\t}\n\treturn strings.TrimLeft(u.Path, \"/\")\n}\n\n// recordToMdpb extracts data and converts them to googlemetricpb.MetricDescriptor.\nfunc (me *metricExporter) recordToMdpb(metrics metricdata.Metrics, extraLabels *attribute.Set) *googlemetricpb.MetricDescriptor {\n\tname := metrics.Name\n\ttyp := me.descToMetricType(metrics)\n\tkind, valueType := recordToMdpbKindType(metrics.Data)\n\n\t// Detailed explanations on MetricDescriptor proto is not documented on\n\t// generated Go packages. Refer to the original proto file.\n\t// https://github.com/googleapis/googleapis/blob/50af053/google/api/metric.proto#L33\n\treturn &googlemetricpb.MetricDescriptor{\n\t\tName:        name,\n\t\tDisplayName: metricTypeToDisplayName(typ),\n\t\tType:        typ,\n\t\tMetricKind:  kind,\n\t\tValueType:   valueType,\n\t\tUnit:        string(metrics.Unit),\n\t\tDescription: metrics.Description,\n\t\tLabels:      labelDescriptors(metrics, extraLabels),\n\t}\n}\n\nfunc labelDescriptors(metrics metricdata.Metrics, extraLabels *attribute.Set) []*label.LabelDescriptor {\n\tlabels := []*label.LabelDescriptor{}\n\tseenKeys := map[string]struct{}{}\n\taddAttributes := func(attr *attribute.Set) {\n\t\titer := attr.Iter()\n\t\tfor iter.Next() {\n\t\t\tkv := iter.Attribute()\n\t\t\t// Skip keys that have already been set\n\t\t\tif _, ok := seenKeys[normalizeLabelKey(string(kv.Key))]; ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tlabels = append(labels, &label.LabelDescriptor{\n\t\t\t\tKey: normalizeLabelKey(string(kv.Key)),\n\t\t\t})\n\t\t\tseenKeys[normalizeLabelKey(string(kv.Key))] = struct{}{}\n\t\t}\n\t}\n\taddAttributes(extraLabels)\n\tswitch a := metrics.Data.(type) {\n\tcase metricdata.Gauge[int64]:\n\t\tfor _, pt := range a.DataPoints {\n\t\t\taddAttributes(&pt.Attributes)\n\t\t}\n\tcase metricdata.Gauge[float64]:\n\t\tfor _, pt := range a.DataPoints {\n\t\t\taddAttributes(&pt.Attributes)\n\t\t}\n\tcase metricdata.Sum[int64]:\n\t\tfor _, pt := range a.DataPoints {\n\t\t\taddAttributes(&pt.Attributes)\n\t\t}\n\tcase metricdata.Sum[float64]:\n\t\tfor _, pt := range a.DataPoints {\n\t\t\taddAttributes(&pt.Attributes)\n\t\t}\n\tcase metricdata.Histogram[float64]:\n\t\tfor _, pt := range a.DataPoints {\n\t\t\taddAttributes(&pt.Attributes)\n\t\t}\n\tcase metricdata.Histogram[int64]:\n\t\tfor _, pt := range a.DataPoints {\n\t\t\taddAttributes(&pt.Attributes)\n\t\t}\n\t}\n\treturn labels\n}\n\ntype attributes struct {\n\tattrs attribute.Set\n}\n\nfunc (attrs *attributes) GetString(key string) (string, bool) {\n\tvalue, ok := attrs.attrs.Value(attribute.Key(key))\n\treturn value.AsString(), ok\n}\n\n// resourceToMonitoredResourcepb converts resource in OTel to MonitoredResource\n// proto type for Cloud Monitoring.\n//\n// https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.monitoredResourceDescriptors\nfunc (me *metricExporter) resourceToMonitoredResourcepb(res *resource.Resource) *monitoredrespb.MonitoredResource {\n\tplatformMrType, platformMappingRequested := res.Set().Value(platformMappingMonitoredResourceKey)\n\n\t// check if platform mapping is requested and possible\n\tif platformMappingRequested && platformMrType.AsString() == me.o.monitoredResourceDescription.mrType {\n\t\t// assemble attributes required to construct this MR\n\t\tattributeMap := make(map[string]string)\n\t\tfor expectedLabel := range me.o.monitoredResourceDescription.mrLabels {\n\t\t\tvalue, found := res.Set().Value(attribute.Key(expectedLabel))\n\t\t\tif found {\n\t\t\t\tattributeMap[expectedLabel] = value.AsString()\n\t\t\t}\n\t\t}\n\t\treturn &monitoredrespb.MonitoredResource{\n\t\t\tType:   platformMrType.AsString(),\n\t\t\tLabels: attributeMap,\n\t\t}\n\t}\n\n\tgmr := resourcemapping.ResourceAttributesToMonitoringMonitoredResource(&attributes{\n\t\tattrs: attribute.NewSet(res.Attributes()...),\n\t})\n\tnewLabels := make(map[string]string, len(gmr.Labels))\n\tfor k, v := range gmr.Labels {\n\t\tnewLabels[k] = sanitizeUTF8(v)\n\t}\n\tmr := &monitoredrespb.MonitoredResource{\n\t\tType:   gmr.Type,\n\t\tLabels: newLabels,\n\t}\n\treturn mr\n}\n\n// recordToMdpbKindType return the mapping from OTel's record descriptor to\n// Cloud Monitoring's MetricKind and ValueType.\nfunc recordToMdpbKindType(a metricdata.Aggregation) (googlemetricpb.MetricDescriptor_MetricKind, googlemetricpb.MetricDescriptor_ValueType) {\n\tswitch agg := a.(type) {\n\tcase metricdata.Gauge[int64]:\n\t\treturn googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_INT64\n\tcase metricdata.Gauge[float64]:\n\t\treturn googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_DOUBLE\n\tcase metricdata.Sum[int64]:\n\t\tif agg.IsMonotonic {\n\t\t\treturn googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_INT64\n\t\t}\n\t\treturn googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_INT64\n\tcase metricdata.Sum[float64]:\n\t\tif agg.IsMonotonic {\n\t\t\treturn googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_DOUBLE\n\t\t}\n\t\treturn googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_DOUBLE\n\tcase metricdata.Histogram[int64], metricdata.Histogram[float64]:\n\t\treturn googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_DISTRIBUTION\n\tdefault:\n\t\treturn googlemetricpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED, googlemetricpb.MetricDescriptor_VALUE_TYPE_UNSPECIFIED\n\t}\n}\n\n// recordToMpb converts data from records to Metric proto type for Cloud Monitoring.\nfunc (me *metricExporter) recordToMpb(metrics metricdata.Metrics, attributes attribute.Set, library instrumentation.Scope, extraLabels *attribute.Set) *googlemetricpb.Metric {\n\tme.mdLock.RLock()\n\tdefer me.mdLock.RUnlock()\n\tk := keyOf(metrics, library)\n\tmd, ok := me.mdCache[k]\n\tif !ok {\n\t\tmd = me.recordToMdpb(metrics, extraLabels)\n\t}\n\n\tlabels := make(map[string]string)\n\taddAttributes := func(attr *attribute.Set) {\n\t\titer := attr.Iter()\n\t\tfor iter.Next() {\n\t\t\tkv := iter.Attribute()\n\t\t\tlabels[normalizeLabelKey(string(kv.Key))] = sanitizeUTF8(kv.Value.Emit())\n\t\t}\n\t}\n\taddAttributes(extraLabels)\n\taddAttributes(&attributes)\n\n\treturn &googlemetricpb.Metric{\n\t\tType:   md.Type,\n\t\tLabels: labels,\n\t}\n}\n\n// recordToTspb converts record to TimeSeries proto type with common resource.\n// ref. https://cloud.google.com/monitoring/api/ref_v3/rest/v3/TimeSeries\nfunc (me *metricExporter) recordToTspb(m metricdata.Metrics, mr *monitoredrespb.MonitoredResource, library instrumentation.Scope, extraLabels *attribute.Set) ([]*monitoringpb.TimeSeries, error) {\n\tvar tss []*monitoringpb.TimeSeries\n\tvar errs []error\n\tif m.Data == nil {\n\t\treturn nil, nil\n\t}\n\tswitch a := m.Data.(type) {\n\tcase metricdata.Gauge[int64]:\n\t\tfor _, point := range a.DataPoints {\n\t\t\tts, err := gaugeToTimeSeries[int64](point, m, mr)\n\t\t\tif err != nil {\n\t\t\t\terrs = append(errs, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tts.Metric = me.recordToMpb(m, point.Attributes, library, extraLabels)\n\t\t\ttss = append(tss, ts)\n\t\t}\n\tcase metricdata.Gauge[float64]:\n\t\tfor _, point := range a.DataPoints {\n\t\t\tts, err := gaugeToTimeSeries[float64](point, m, mr)\n\t\t\tif err != nil {\n\t\t\t\terrs = append(errs, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tts.Metric = me.recordToMpb(m, point.Attributes, library, extraLabels)\n\t\t\ttss = append(tss, ts)\n\t\t}\n\tcase metricdata.Sum[int64]:\n\t\tfor _, point := range a.DataPoints {\n\t\t\tvar ts *monitoringpb.TimeSeries\n\t\t\tvar err error\n\t\t\tif a.IsMonotonic {\n\t\t\t\tts, err = sumToTimeSeries[int64](point, m, mr)\n\t\t\t} else {\n\t\t\t\t// Send non-monotonic sums as gauges\n\t\t\t\tts, err = gaugeToTimeSeries[int64](point, m, mr)\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\terrs = append(errs, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tts.Metric = me.recordToMpb(m, point.Attributes, library, extraLabels)\n\t\t\ttss = append(tss, ts)\n\t\t}\n\tcase metricdata.Sum[float64]:\n\t\tfor _, point := range a.DataPoints {\n\t\t\tvar ts *monitoringpb.TimeSeries\n\t\t\tvar err error\n\t\t\tif a.IsMonotonic {\n\t\t\t\tts, err = sumToTimeSeries[float64](point, m, mr)\n\t\t\t} else {\n\t\t\t\t// Send non-monotonic sums as gauges\n\t\t\t\tts, err = gaugeToTimeSeries[float64](point, m, mr)\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\terrs = append(errs, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tts.Metric = me.recordToMpb(m, point.Attributes, library, extraLabels)\n\t\t\ttss = append(tss, ts)\n\t\t}\n\tcase metricdata.Histogram[int64]:\n\t\tfor _, point := range a.DataPoints {\n\t\t\tts, err := histogramToTimeSeries(point, m, mr, me.o.enableSumOfSquaredDeviation, me.o.projectID)\n\t\t\tif err != nil {\n\t\t\t\terrs = append(errs, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tts.Metric = me.recordToMpb(m, point.Attributes, library, extraLabels)\n\t\t\ttss = append(tss, ts)\n\t\t}\n\tcase metricdata.Histogram[float64]:\n\t\tfor _, point := range a.DataPoints {\n\t\t\tts, err := histogramToTimeSeries(point, m, mr, me.o.enableSumOfSquaredDeviation, me.o.projectID)\n\t\t\tif err != nil {\n\t\t\t\terrs = append(errs, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tts.Metric = me.recordToMpb(m, point.Attributes, library, extraLabels)\n\t\t\ttss = append(tss, ts)\n\t\t}\n\tcase metricdata.ExponentialHistogram[int64]:\n\t\tfor _, point := range a.DataPoints {\n\t\t\tts, err := expHistogramToTimeSeries(point, m, mr, me.o.enableSumOfSquaredDeviation, me.o.projectID)\n\t\t\tif err != nil {\n\t\t\t\terrs = append(errs, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tts.Metric = me.recordToMpb(m, point.Attributes, library, extraLabels)\n\t\t\ttss = append(tss, ts)\n\t\t}\n\tcase metricdata.ExponentialHistogram[float64]:\n\t\tfor _, point := range a.DataPoints {\n\t\t\tts, err := expHistogramToTimeSeries(point, m, mr, me.o.enableSumOfSquaredDeviation, me.o.projectID)\n\t\t\tif err != nil {\n\t\t\t\terrs = append(errs, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tts.Metric = me.recordToMpb(m, point.Attributes, library, extraLabels)\n\t\t\ttss = append(tss, ts)\n\t\t}\n\tdefault:\n\t\terrs = append(errs, errUnexpectedAggregationKind{kind: reflect.TypeOf(m.Data).String()})\n\t}\n\treturn tss, errors.Join(errs...)\n}\n\nfunc (me *metricExporter) recordsToTspbs(rm *metricdata.ResourceMetrics) ([]*monitoringpb.TimeSeries, error) {\n\tmr := me.resourceToMonitoredResourcepb(rm.Resource)\n\textraLabels := me.extraLabelsFromResource(rm.Resource)\n\n\tvar (\n\t\ttss  []*monitoringpb.TimeSeries\n\t\terrs []error\n\t)\n\tfor _, scope := range rm.ScopeMetrics {\n\t\tfor _, metrics := range scope.Metrics {\n\t\t\tts, err := me.recordToTspb(metrics, mr, scope.Scope, extraLabels)\n\t\t\terrs = append(errs, err)\n\t\t\ttss = append(tss, ts...)\n\t\t}\n\t}\n\n\treturn tss, errors.Join(errs...)\n}\n\nfunc sanitizeUTF8(s string) string {\n\treturn strings.ToValidUTF8(s, \"�\")\n}\n\nfunc gaugeToTimeSeries[N int64 | float64](point metricdata.DataPoint[N], metrics metricdata.Metrics, mr *monitoredrespb.MonitoredResource) (*monitoringpb.TimeSeries, error) {\n\tvalue, valueType := numberDataPointToValue(point)\n\ttimestamp := timestamppb.New(point.Time)\n\tif err := timestamp.CheckValid(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &monitoringpb.TimeSeries{\n\t\tResource:   mr,\n\t\tUnit:       string(metrics.Unit),\n\t\tMetricKind: googlemetricpb.MetricDescriptor_GAUGE,\n\t\tValueType:  valueType,\n\t\tPoints: []*monitoringpb.Point{{\n\t\t\tInterval: &monitoringpb.TimeInterval{\n\t\t\t\tEndTime: timestamp,\n\t\t\t},\n\t\t\tValue: value,\n\t\t}},\n\t}, nil\n}\n\nfunc sumToTimeSeries[N int64 | float64](point metricdata.DataPoint[N], metrics metricdata.Metrics, mr *monitoredrespb.MonitoredResource) (*monitoringpb.TimeSeries, error) {\n\tinterval, err := toNonemptyTimeIntervalpb(point.StartTime, point.Time)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvalue, valueType := numberDataPointToValue[N](point)\n\treturn &monitoringpb.TimeSeries{\n\t\tResource:   mr,\n\t\tUnit:       string(metrics.Unit),\n\t\tMetricKind: googlemetricpb.MetricDescriptor_CUMULATIVE,\n\t\tValueType:  valueType,\n\t\tPoints: []*monitoringpb.Point{{\n\t\t\tInterval: interval,\n\t\t\tValue:    value,\n\t\t}},\n\t}, nil\n}\n\n// TODO(@dashpole): Refactor to pass control-coupling lint check.\n//\n//nolint:revive\nfunc histogramToTimeSeries[N int64 | float64](point metricdata.HistogramDataPoint[N], metrics metricdata.Metrics, mr *monitoredrespb.MonitoredResource, enableSOSD bool, projectID string) (*monitoringpb.TimeSeries, error) {\n\tinterval, err := toNonemptyTimeIntervalpb(point.StartTime, point.Time)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdistributionValue := histToDistribution(point, projectID)\n\tif enableSOSD {\n\t\tsetSumOfSquaredDeviation(point, distributionValue)\n\t}\n\treturn &monitoringpb.TimeSeries{\n\t\tResource:   mr,\n\t\tUnit:       string(metrics.Unit),\n\t\tMetricKind: googlemetricpb.MetricDescriptor_CUMULATIVE,\n\t\tValueType:  googlemetricpb.MetricDescriptor_DISTRIBUTION,\n\t\tPoints: []*monitoringpb.Point{{\n\t\t\tInterval: interval,\n\t\t\tValue: &monitoringpb.TypedValue{\n\t\t\t\tValue: &monitoringpb.TypedValue_DistributionValue{\n\t\t\t\t\tDistributionValue: distributionValue,\n\t\t\t\t},\n\t\t\t},\n\t\t}},\n\t}, nil\n}\n\nfunc expHistogramToTimeSeries[N int64 | float64](point metricdata.ExponentialHistogramDataPoint[N], metrics metricdata.Metrics, mr *monitoredrespb.MonitoredResource, enableSOSD bool, projectID string) (*monitoringpb.TimeSeries, error) {\n\tinterval, err := toNonemptyTimeIntervalpb(point.StartTime, point.Time)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdistributionValue := expHistToDistribution(point, projectID)\n\t// TODO: Implement \"setSumOfSquaredDeviationExpHist\" for parameter \"enableSOSD\" functionality.\n\treturn &monitoringpb.TimeSeries{\n\t\tResource:   mr,\n\t\tUnit:       string(metrics.Unit),\n\t\tMetricKind: googlemetricpb.MetricDescriptor_CUMULATIVE,\n\t\tValueType:  googlemetricpb.MetricDescriptor_DISTRIBUTION,\n\t\tPoints: []*monitoringpb.Point{{\n\t\t\tInterval: interval,\n\t\t\tValue: &monitoringpb.TypedValue{\n\t\t\t\tValue: &monitoringpb.TypedValue_DistributionValue{\n\t\t\t\t\tDistributionValue: distributionValue,\n\t\t\t\t},\n\t\t\t},\n\t\t}},\n\t}, nil\n}\n\nfunc toNonemptyTimeIntervalpb(start, end time.Time) (*monitoringpb.TimeInterval, error) {\n\t// The end time of a new interval must be at least a millisecond after the end time of the\n\t// previous interval, for all non-gauge types.\n\t// https://cloud.google.com/monitoring/api/ref_v3/rpc/google.monitoring.v3#timeinterval\n\tif end.Sub(start).Milliseconds() <= 1 {\n\t\tend = start.Add(time.Millisecond)\n\t}\n\tstartpb := timestamppb.New(start)\n\tendpb := timestamppb.New(end)\n\terr := errors.Join(\n\t\tstartpb.CheckValid(),\n\t\tendpb.CheckValid(),\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &monitoringpb.TimeInterval{\n\t\tStartTime: startpb,\n\t\tEndTime:   endpb,\n\t}, nil\n}\n\nfunc histToDistribution[N int64 | float64](hist metricdata.HistogramDataPoint[N], projectID string) *distribution.Distribution {\n\tcounts := make([]int64, len(hist.BucketCounts))\n\tfor i, v := range hist.BucketCounts {\n\t\tcounts[i] = int64(v)\n\t}\n\tvar mean float64\n\tif !math.IsNaN(float64(hist.Sum)) && hist.Count > 0 { // Avoid divide-by-zero\n\t\tmean = float64(hist.Sum) / float64(hist.Count)\n\t}\n\treturn &distribution.Distribution{\n\t\tCount:        int64(hist.Count),\n\t\tMean:         mean,\n\t\tBucketCounts: counts,\n\t\tBucketOptions: &distribution.Distribution_BucketOptions{\n\t\t\tOptions: &distribution.Distribution_BucketOptions_ExplicitBuckets{\n\t\t\t\tExplicitBuckets: &distribution.Distribution_BucketOptions_Explicit{\n\t\t\t\t\tBounds: hist.Bounds,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tExemplars: toDistributionExemplar[N](hist.Exemplars, projectID),\n\t}\n}\n\nfunc expHistToDistribution[N int64 | float64](hist metricdata.ExponentialHistogramDataPoint[N], projectID string) *distribution.Distribution {\n\t// First calculate underflow bucket with all negatives + zeros.\n\tunderflow := hist.ZeroCount\n\tnegativeBuckets := hist.NegativeBucket.Counts\n\tfor i := 0; i < len(negativeBuckets); i++ {\n\t\tunderflow += negativeBuckets[i]\n\t}\n\n\t// Next, pull in remaining buckets.\n\tcounts := make([]int64, len(hist.PositiveBucket.Counts)+2)\n\tbucketOptions := &distribution.Distribution_BucketOptions{}\n\tcounts[0] = int64(underflow)\n\tpositiveBuckets := hist.PositiveBucket.Counts\n\tfor i := 0; i < len(positiveBuckets); i++ {\n\t\tcounts[i+1] = int64(positiveBuckets[i])\n\t}\n\t// Overflow bucket is always empty\n\tcounts[len(counts)-1] = 0\n\n\tif len(hist.PositiveBucket.Counts) == 0 {\n\t\t// We cannot send exponential distributions with no positive buckets,\n\t\t// instead we send a simple overflow/underflow histogram.\n\t\tbucketOptions.Options = &distribution.Distribution_BucketOptions_ExplicitBuckets{\n\t\t\tExplicitBuckets: &distribution.Distribution_BucketOptions_Explicit{\n\t\t\t\tBounds: []float64{0},\n\t\t\t},\n\t\t}\n\t} else {\n\t\t// Exponential histogram\n\t\tgrowth := math.Exp2(math.Exp2(-float64(hist.Scale)))\n\t\tscale := math.Pow(growth, float64(hist.PositiveBucket.Offset))\n\t\tbucketOptions.Options = &distribution.Distribution_BucketOptions_ExponentialBuckets{\n\t\t\tExponentialBuckets: &distribution.Distribution_BucketOptions_Exponential{\n\t\t\t\tGrowthFactor:     growth,\n\t\t\t\tScale:            scale,\n\t\t\t\tNumFiniteBuckets: int32(len(counts) - 2),\n\t\t\t},\n\t\t}\n\t}\n\n\tvar mean float64\n\tif !math.IsNaN(float64(hist.Sum)) && hist.Count > 0 { // Avoid divide-by-zero\n\t\tmean = float64(hist.Sum) / float64(hist.Count)\n\t}\n\n\treturn &distribution.Distribution{\n\t\tCount:         int64(hist.Count),\n\t\tMean:          mean,\n\t\tBucketCounts:  counts,\n\t\tBucketOptions: bucketOptions,\n\t\tExemplars:     toDistributionExemplar[N](hist.Exemplars, projectID),\n\t}\n}\n\nfunc toDistributionExemplar[N int64 | float64](Exemplars []metricdata.Exemplar[N], projectID string) []*distribution.Distribution_Exemplar {\n\tvar exemplars []*distribution.Distribution_Exemplar\n\tfor _, e := range Exemplars {\n\t\tattachments := []*anypb.Any{}\n\t\tif hasValidSpanContext(e) {\n\t\t\tsctx, err := anypb.New(&monitoringpb.SpanContext{\n\t\t\t\tSpanName: fmt.Sprintf(\"projects/%s/traces/%s/spans/%s\", projectID, hex.EncodeToString(e.TraceID[:]), hex.EncodeToString(e.SpanID[:])),\n\t\t\t})\n\t\t\tif err == nil {\n\t\t\t\tattachments = append(attachments, sctx)\n\t\t\t}\n\t\t}\n\t\tif len(e.FilteredAttributes) > 0 {\n\t\t\tattr, err := anypb.New(&monitoringpb.DroppedLabels{\n\t\t\t\tLabel: attributesToLabels(e.FilteredAttributes),\n\t\t\t})\n\t\t\tif err == nil {\n\t\t\t\tattachments = append(attachments, attr)\n\t\t\t}\n\t\t}\n\t\texemplars = append(exemplars, &distribution.Distribution_Exemplar{\n\t\t\tValue:       float64(e.Value),\n\t\t\tTimestamp:   timestamppb.New(e.Time),\n\t\t\tAttachments: attachments,\n\t\t})\n\t}\n\tsort.Slice(exemplars, func(i, j int) bool {\n\t\treturn exemplars[i].Value < exemplars[j].Value\n\t})\n\treturn exemplars\n}\n\nfunc attributesToLabels(attrs []attribute.KeyValue) map[string]string {\n\tlabels := make(map[string]string, len(attrs))\n\tfor _, attr := range attrs {\n\t\tlabels[normalizeLabelKey(string(attr.Key))] = sanitizeUTF8(attr.Value.Emit())\n\t}\n\treturn labels\n}\n\nvar (\n\tnilTraceID trace.TraceID\n\tnilSpanID  trace.SpanID\n)\n\nfunc hasValidSpanContext[N int64 | float64](e metricdata.Exemplar[N]) bool {\n\treturn !bytes.Equal(e.TraceID[:], nilTraceID[:]) && !bytes.Equal(e.SpanID[:], nilSpanID[:])\n}\n\nfunc setSumOfSquaredDeviation[N int64 | float64](hist metricdata.HistogramDataPoint[N], dist *distribution.Distribution) {\n\tvar prevBound float64\n\t// Calculate the sum of squared deviation.\n\tfor i := 0; i < len(hist.Bounds); i++ {\n\t\t// Assume all points in the bucket occur at the middle of the bucket range\n\t\tmiddleOfBucket := (prevBound + hist.Bounds[i]) / 2\n\t\tdist.SumOfSquaredDeviation += float64(dist.BucketCounts[i]) * (middleOfBucket - dist.Mean) * (middleOfBucket - dist.Mean)\n\t\tprevBound = hist.Bounds[i]\n\t}\n\t// The infinity bucket is an implicit +Inf bound after the list of explicit bounds.\n\t// Assume points in the infinity bucket are at the top of the previous bucket\n\tmiddleOfInfBucket := prevBound\n\tif len(dist.BucketCounts) > 0 {\n\t\tdist.SumOfSquaredDeviation += float64(dist.BucketCounts[len(dist.BucketCounts)-1]) * (middleOfInfBucket - dist.Mean) * (middleOfInfBucket - dist.Mean)\n\t}\n}\n\nfunc numberDataPointToValue[N int64 | float64](\n\tpoint metricdata.DataPoint[N],\n) (*monitoringpb.TypedValue, googlemetricpb.MetricDescriptor_ValueType) {\n\tswitch v := any(point.Value).(type) {\n\tcase int64:\n\t\treturn &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_Int64Value{\n\t\t\t\tInt64Value: v,\n\t\t\t}},\n\t\t\tgooglemetricpb.MetricDescriptor_INT64\n\tcase float64:\n\t\treturn &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_DoubleValue{\n\t\t\t\tDoubleValue: v,\n\t\t\t}},\n\t\t\tgooglemetricpb.MetricDescriptor_DOUBLE\n\t}\n\t// It is impossible to reach this statement\n\treturn nil, googlemetricpb.MetricDescriptor_INT64\n}\n\n// https://github.com/googleapis/googleapis/blob/c4c562f89acce603fb189679836712d08c7f8584/google/api/metric.proto#L149\n//\n// > The label key name must follow:\n// >\n// > * Only upper and lower-case letters, digits and underscores (_) are\n// >   allowed.\n// > * Label name must start with a letter or digit.\n// > * The maximum length of a label name is 100 characters.\n//\n//\tNote: this does not truncate if a label is too long.\nfunc normalizeLabelKey(s string) string {\n\tif len(s) == 0 {\n\t\treturn s\n\t}\n\ts = strings.Map(sanitizeRune, s)\n\tif unicode.IsDigit(rune(s[0])) {\n\t\ts = \"key_\" + s\n\t}\n\treturn s\n}\n\n// converts anything that is not a letter or digit to an underscore.\nfunc sanitizeRune(r rune) rune {\n\tif unicode.IsLetter(r) || unicode.IsDigit(r) {\n\t\treturn r\n\t}\n\t// Everything else turns into an underscore\n\treturn '_'\n}\n"
  },
  {
    "path": "vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/option.go",
    "content": "// Copyright 2020-2021 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage metric\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"go.opentelemetry.io/otel\"\n\t\"go.opentelemetry.io/otel/attribute\"\n\t\"go.opentelemetry.io/otel/sdk/metric/metricdata\"\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.24.0\"\n\n\tapioption \"google.golang.org/api/option\"\n)\n\nvar userAgent = fmt.Sprintf(\"opentelemetry-go %s; google-cloud-metric-exporter %s\", otel.Version(), Version())\n\n// MonitoredResourceDescription is the struct which holds information required to map OTel resource to specific\n// Google Cloud MonitoredResource.\ntype MonitoredResourceDescription struct {\n\tmrLabels map[string]struct{}\n\tmrType   string\n}\n\n// Option is function type that is passed to the exporter initialization function.\ntype Option func(*options)\n\n// options is the struct to hold options for metricExporter and its client instance.\ntype options struct {\n\t// context allows you to provide a custom context for API calls.\n\t//\n\t// This context will be used several times: first, to create Cloud Monitoring\n\t// clients, and then every time a new batch of metrics needs to be uploaded.\n\t//\n\t// If unset, context.Background() will be used.\n\tcontext context.Context\n\t// metricDescriptorTypeFormatter is the custom formtter for the MetricDescriptor.Type.\n\t// By default, the format string is \"workload.googleapis.com/[metric name]\".\n\tmetricDescriptorTypeFormatter func(metricdata.Metrics) string\n\t// resourceAttributeFilter determinies which resource attributes to\n\t// add to metrics as metric labels. By default, it adds service.name,\n\t// service.namespace, and service.instance.id.\n\tresourceAttributeFilter attribute.Filter\n\t// monitoredResourceDescription sets whether to attempt mapping the OTel Resource to a specific\n\t// Google Cloud Monitored Resource. When provided, the exporter attempts to map only to the provided\n\t// monitored resource type.\n\tmonitoredResourceDescription MonitoredResourceDescription\n\t// projectID is the identifier of the Cloud Monitoring\n\t// project the user is uploading the stats data to.\n\t// If not set, this will default to your \"Application Default Credentials\".\n\t// For details see: https://developers.google.com/accounts/docs/application-default-credentials.\n\t//\n\t// It will be used in the project_id label of a Google Cloud Monitoring monitored\n\t// resource if the resource does not inherently belong to a specific\n\t// project, e.g. on-premise resource like k8s_container or generic_task.\n\tprojectID string\n\t// compression enables gzip compression on gRPC calls.\n\tcompression string\n\t// monitoringClientOptions are additional options to be passed\n\t// to the underlying Stackdriver Monitoring API client.\n\t// Optional.\n\tmonitoringClientOptions []apioption.ClientOption\n\t// destinationProjectQuota sets whether the request should use quota from\n\t// the destination project for the request.\n\tdestinationProjectQuota bool\n\n\t// disableCreateMetricDescriptors disables automatic MetricDescriptor creation\n\tdisableCreateMetricDescriptors bool\n\n\t// enableSumOfSquaredDeviation enables calculation of an estimated sum of squared\n\t// deviation.  It isn't correct, so we don't send it by default.\n\tenableSumOfSquaredDeviation bool\n\n\t// createServiceTimeSeries sets whether to create timeseries using `CreateServiceTimeSeries`.\n\t// Implicitly, this sets `disableCreateMetricDescriptors` to true.\n\tcreateServiceTimeSeries bool\n}\n\n// WithProjectID sets Google Cloud Platform project as projectID.\n// Without using this option, it automatically detects the project ID\n// from the default credential detection process.\n// Please find the detailed order of the default credential detection process on the doc:\n// https://godoc.org/golang.org/x/oauth2/google#FindDefaultCredentials\nfunc WithProjectID(id string) func(o *options) {\n\treturn func(o *options) {\n\t\to.projectID = id\n\t}\n}\n\n// WithDestinationProjectQuota enables per-request usage of the destination\n// project's quota. For example, when setting gcp.project.id on a metric.\nfunc WithDestinationProjectQuota() func(o *options) {\n\treturn func(o *options) {\n\t\to.destinationProjectQuota = true\n\t}\n}\n\n// WithMonitoringClientOptions add the options for Cloud Monitoring client instance.\n// Available options are defined in.\nfunc WithMonitoringClientOptions(opts ...apioption.ClientOption) func(o *options) {\n\treturn func(o *options) {\n\t\to.monitoringClientOptions = append(o.monitoringClientOptions, opts...)\n\t}\n}\n\n// WithMetricDescriptorTypeFormatter sets the custom formatter for MetricDescriptor.\n// Note that the format has to follow the convention defined in the official document.\n// The default is \"workload.googleapis.com/[metric name]\".\n// ref. https://cloud.google.com/monitoring/custom-metrics/creating-metrics#custom_metric_names\nfunc WithMetricDescriptorTypeFormatter(f func(metricdata.Metrics) string) func(o *options) {\n\treturn func(o *options) {\n\t\to.metricDescriptorTypeFormatter = f\n\t}\n}\n\n// WithFilteredResourceAttributes determinies which resource attributes to\n// add to metrics as metric labels. By default, it adds service.name,\n// service.namespace, and service.instance.id. This is recommended to avoid\n// writing duplicate timeseries against the same monitored resource. Use\n// WithFilteredResourceAttributes(NoAttributes()) to disable the addition of\n// resource attributes to metric labels.\nfunc WithFilteredResourceAttributes(filter attribute.Filter) func(o *options) {\n\treturn func(o *options) {\n\t\to.resourceAttributeFilter = filter\n\t}\n}\n\n// DefaultResourceAttributesFilter is the default filter applied to resource\n// attributes.\nfunc DefaultResourceAttributesFilter(kv attribute.KeyValue) bool {\n\treturn (kv.Key == semconv.ServiceNameKey ||\n\t\tkv.Key == semconv.ServiceNamespaceKey ||\n\t\tkv.Key == semconv.ServiceInstanceIDKey) && len(kv.Value.AsString()) > 0\n}\n\n// NoAttributes can be passed to WithFilteredResourceAttributes to disable\n// adding resource attributes as metric labels.\nfunc NoAttributes(attribute.KeyValue) bool {\n\treturn false\n}\n\n// WithDisableCreateMetricDescriptors will disable the automatic creation of\n// MetricDescriptors when an unknown metric is set to be exported.\nfunc WithDisableCreateMetricDescriptors() func(o *options) {\n\treturn func(o *options) {\n\t\to.disableCreateMetricDescriptors = true\n\t}\n}\n\n// WithCompression sets the compression to use for gRPC requests.\nfunc WithCompression(c string) func(o *options) {\n\treturn func(o *options) {\n\t\to.compression = c\n\t}\n}\n\n// WithSumOfSquaredDeviation sets the SumOfSquaredDeviation field on histograms.\n// It is an estimate, and is not the actual sum of squared deviations.\nfunc WithSumOfSquaredDeviation() func(o *options) {\n\treturn func(o *options) {\n\t\to.enableSumOfSquaredDeviation = true\n\t}\n}\n\n// WithCreateServiceTimeSeries configures the exporter to use `CreateServiceTimeSeries` for creating timeseries.\n// If this is used, metric descriptors are not exported.\nfunc WithCreateServiceTimeSeries() func(o *options) {\n\treturn func(o *options) {\n\t\to.createServiceTimeSeries = true\n\t\to.disableCreateMetricDescriptors = true\n\t}\n}\n\n// WithMonitoredResourceDescription configures the exporter to attempt to map the OpenTelemetry Resource to the provided\n// Google MonitoredResource. The provided mrLabels would be searched for in the OpenTelemetry Resource Attributes and if\n// found, would be included in the MonitoredResource labels.\nfunc WithMonitoredResourceDescription(mrType string, mrLabels []string) func(o *options) {\n\treturn func(o *options) {\n\t\tmrLabelSet := make(map[string]struct{})\n\t\tfor _, label := range mrLabels {\n\t\t\tmrLabelSet[label] = struct{}{}\n\t\t}\n\t\to.monitoredResourceDescription = MonitoredResourceDescription{\n\t\t\tmrType:   mrType,\n\t\t\tmrLabels: mrLabelSet,\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/version.go",
    "content": "// Copyright 2020 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage metric\n\n// Version is the current release version of the OpenTelemetry\n// Operations Metric Exporter in use.\nfunc Version() string {\n\treturn \"0.51.0\"\n}\n"
  },
  {
    "path": "vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping/resourcemapping.go",
    "content": "// Copyright 2022 Google LLC\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      https://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage resourcemapping\n\nimport (\n\t\"strings\"\n\n\tsemconv \"go.opentelemetry.io/otel/semconv/v1.24.0\"\n\tmonitoredrespb \"google.golang.org/genproto/googleapis/api/monitoredres\"\n)\n\nconst (\n\tProjectIDAttributeKey = \"gcp.project.id\"\n\n\tawsAccount           = \"aws_account\"\n\tawsEc2Instance       = \"aws_ec2_instance\"\n\tclusterName          = \"cluster_name\"\n\tcontainerName        = \"container_name\"\n\tgceInstance          = \"gce_instance\"\n\tgenericNode          = \"generic_node\"\n\tgenericTask          = \"generic_task\"\n\tinstanceID           = \"instance_id\"\n\tjob                  = \"job\"\n\tk8sCluster           = \"k8s_cluster\"\n\tk8sContainer         = \"k8s_container\"\n\tk8sNode              = \"k8s_node\"\n\tk8sPod               = \"k8s_pod\"\n\tlocation             = \"location\"\n\tnamespace            = \"namespace\"\n\tnamespaceName        = \"namespace_name\"\n\tnodeID               = \"node_id\"\n\tnodeName             = \"node_name\"\n\tpodName              = \"pod_name\"\n\tregion               = \"region\"\n\ttaskID               = \"task_id\"\n\tzone                 = \"zone\"\n\tgaeInstance          = \"gae_instance\"\n\tgaeApp               = \"gae_app\"\n\tgaeModuleID          = \"module_id\"\n\tgaeVersionID         = \"version_id\"\n\tcloudRunRevision     = \"cloud_run_revision\"\n\tcloudFunction        = \"cloud_function\"\n\tcloudFunctionName    = \"function_name\"\n\tserviceName          = \"service_name\"\n\tconfigurationName    = \"configuration_name\"\n\trevisionName         = \"revision_name\"\n\tbmsInstance          = \"baremetalsolution.googleapis.com/Instance\"\n\tunknownServicePrefix = \"unknown_service\"\n)\n\nvar (\n\t// monitoredResourceMappings contains mappings of GCM resource label keys onto mapping config from OTel\n\t// resource for a given monitored resource type.\n\tmonitoredResourceMappings = map[string]map[string]struct {\n\t\t// If none of the otelKeys are present in the Resource, fallback to this literal value\n\t\tfallbackLiteral string\n\t\t// OTel resource keys to try and populate the resource label from. For entries with\n\t\t// multiple OTel resource keys, the keys' values will be coalesced in order until there\n\t\t// is a non-empty value.\n\t\totelKeys []string\n\t}{\n\t\tgceInstance: {\n\t\t\tzone:       {otelKeys: []string{string(semconv.CloudAvailabilityZoneKey)}},\n\t\t\tinstanceID: {otelKeys: []string{string(semconv.HostIDKey)}},\n\t\t},\n\t\tk8sContainer: {\n\t\t\tlocation: {otelKeys: []string{\n\t\t\t\tstring(semconv.CloudAvailabilityZoneKey),\n\t\t\t\tstring(semconv.CloudRegionKey),\n\t\t\t}},\n\t\t\tclusterName:   {otelKeys: []string{string(semconv.K8SClusterNameKey)}},\n\t\t\tnamespaceName: {otelKeys: []string{string(semconv.K8SNamespaceNameKey)}},\n\t\t\tpodName:       {otelKeys: []string{string(semconv.K8SPodNameKey)}},\n\t\t\tcontainerName: {otelKeys: []string{string(semconv.K8SContainerNameKey)}},\n\t\t},\n\t\tk8sPod: {\n\t\t\tlocation: {otelKeys: []string{\n\t\t\t\tstring(semconv.CloudAvailabilityZoneKey),\n\t\t\t\tstring(semconv.CloudRegionKey),\n\t\t\t}},\n\t\t\tclusterName:   {otelKeys: []string{string(semconv.K8SClusterNameKey)}},\n\t\t\tnamespaceName: {otelKeys: []string{string(semconv.K8SNamespaceNameKey)}},\n\t\t\tpodName:       {otelKeys: []string{string(semconv.K8SPodNameKey)}},\n\t\t},\n\t\tk8sNode: {\n\t\t\tlocation: {otelKeys: []string{\n\t\t\t\tstring(semconv.CloudAvailabilityZoneKey),\n\t\t\t\tstring(semconv.CloudRegionKey),\n\t\t\t}},\n\t\t\tclusterName: {otelKeys: []string{string(semconv.K8SClusterNameKey)}},\n\t\t\tnodeName:    {otelKeys: []string{string(semconv.K8SNodeNameKey)}},\n\t\t},\n\t\tk8sCluster: {\n\t\t\tlocation: {otelKeys: []string{\n\t\t\t\tstring(semconv.CloudAvailabilityZoneKey),\n\t\t\t\tstring(semconv.CloudRegionKey),\n\t\t\t}},\n\t\t\tclusterName: {otelKeys: []string{string(semconv.K8SClusterNameKey)}},\n\t\t},\n\t\tgaeInstance: {\n\t\t\tlocation: {otelKeys: []string{\n\t\t\t\tstring(semconv.CloudAvailabilityZoneKey),\n\t\t\t\tstring(semconv.CloudRegionKey),\n\t\t\t}},\n\t\t\tgaeModuleID:  {otelKeys: []string{string(semconv.FaaSNameKey)}},\n\t\t\tgaeVersionID: {otelKeys: []string{string(semconv.FaaSVersionKey)}},\n\t\t\tinstanceID:   {otelKeys: []string{string(semconv.FaaSInstanceKey)}},\n\t\t},\n\t\tgaeApp: {\n\t\t\tlocation: {otelKeys: []string{\n\t\t\t\tstring(semconv.CloudAvailabilityZoneKey),\n\t\t\t\tstring(semconv.CloudRegionKey),\n\t\t\t}},\n\t\t\tgaeModuleID:  {otelKeys: []string{string(semconv.FaaSNameKey)}},\n\t\t\tgaeVersionID: {otelKeys: []string{string(semconv.FaaSVersionKey)}},\n\t\t},\n\t\tawsEc2Instance: {\n\t\t\tinstanceID: {otelKeys: []string{string(semconv.HostIDKey)}},\n\t\t\tregion: {\n\t\t\t\totelKeys: []string{\n\t\t\t\t\tstring(semconv.CloudAvailabilityZoneKey),\n\t\t\t\t\tstring(semconv.CloudRegionKey),\n\t\t\t\t},\n\t\t\t},\n\t\t\tawsAccount: {otelKeys: []string{string(semconv.CloudAccountIDKey)}},\n\t\t},\n\t\tbmsInstance: {\n\t\t\tlocation:   {otelKeys: []string{string(semconv.CloudRegionKey)}},\n\t\t\tinstanceID: {otelKeys: []string{string(semconv.HostIDKey)}},\n\t\t},\n\t\tgenericTask: {\n\t\t\tlocation: {\n\t\t\t\totelKeys: []string{\n\t\t\t\t\tstring(semconv.CloudAvailabilityZoneKey),\n\t\t\t\t\tstring(semconv.CloudRegionKey),\n\t\t\t\t},\n\t\t\t\tfallbackLiteral: \"global\",\n\t\t\t},\n\t\t\tnamespace: {otelKeys: []string{string(semconv.ServiceNamespaceKey)}},\n\t\t\tjob:       {otelKeys: []string{string(semconv.ServiceNameKey), string(semconv.FaaSNameKey)}},\n\t\t\ttaskID:    {otelKeys: []string{string(semconv.ServiceInstanceIDKey), string(semconv.FaaSInstanceKey)}},\n\t\t},\n\t\tgenericNode: {\n\t\t\tlocation: {\n\t\t\t\totelKeys: []string{\n\t\t\t\t\tstring(semconv.CloudAvailabilityZoneKey),\n\t\t\t\t\tstring(semconv.CloudRegionKey),\n\t\t\t\t},\n\t\t\t\tfallbackLiteral: \"global\",\n\t\t\t},\n\t\t\tnamespace: {otelKeys: []string{string(semconv.ServiceNamespaceKey)}},\n\t\t\tnodeID:    {otelKeys: []string{string(semconv.HostIDKey), string(semconv.HostNameKey)}},\n\t\t},\n\t}\n)\n\n// ReadOnlyAttributes is an interface to abstract between pulling attributes from PData library or OTEL SDK.\ntype ReadOnlyAttributes interface {\n\tGetString(string) (string, bool)\n}\n\n// ResourceAttributesToLoggingMonitoredResource converts from a set of OTEL resource attributes into a\n// GCP monitored resource type and label set for Cloud Logging.\n// E.g.\n// This may output `gce_instance` type with appropriate labels.\nfunc ResourceAttributesToLoggingMonitoredResource(attrs ReadOnlyAttributes) *monitoredrespb.MonitoredResource {\n\tcloudPlatform, _ := attrs.GetString(string(semconv.CloudPlatformKey))\n\tswitch cloudPlatform {\n\tcase semconv.CloudPlatformGCPAppEngine.Value.AsString():\n\t\treturn createMonitoredResource(gaeApp, attrs)\n\tdefault:\n\t\treturn commonResourceAttributesToMonitoredResource(cloudPlatform, attrs)\n\t}\n}\n\n// ResourceAttributesToMonitoringMonitoredResource converts from a set of OTEL resource attributes into a\n// GCP monitored resource type and label set for Cloud Monitoring\n// E.g.\n// This may output `gce_instance` type with appropriate labels.\nfunc ResourceAttributesToMonitoringMonitoredResource(attrs ReadOnlyAttributes) *monitoredrespb.MonitoredResource {\n\tcloudPlatform, _ := attrs.GetString(string(semconv.CloudPlatformKey))\n\tswitch cloudPlatform {\n\tcase semconv.CloudPlatformGCPAppEngine.Value.AsString():\n\t\treturn createMonitoredResource(gaeInstance, attrs)\n\tdefault:\n\t\treturn commonResourceAttributesToMonitoredResource(cloudPlatform, attrs)\n\t}\n}\n\nfunc commonResourceAttributesToMonitoredResource(cloudPlatform string, attrs ReadOnlyAttributes) *monitoredrespb.MonitoredResource {\n\tswitch cloudPlatform {\n\tcase semconv.CloudPlatformGCPComputeEngine.Value.AsString():\n\t\treturn createMonitoredResource(gceInstance, attrs)\n\tcase semconv.CloudPlatformAWSEC2.Value.AsString():\n\t\treturn createMonitoredResource(awsEc2Instance, attrs)\n\t// TODO(alex-basinov): replace this string literal with semconv.CloudPlatformGCPBareMetalSolution\n\t// once https://github.com/open-telemetry/semantic-conventions/pull/64 makes its way\n\t// into the semconv module.\n\tcase \"gcp_bare_metal_solution\":\n\t\treturn createMonitoredResource(bmsInstance, attrs)\n\tdefault:\n\t\t// if k8s.cluster.name is set, pattern match for various k8s resources.\n\t\t// this will also match non-cloud k8s platforms like minikube.\n\t\tif _, ok := attrs.GetString(string(semconv.K8SClusterNameKey)); ok {\n\t\t\t// Try for most to least specific k8s_container, k8s_pod, etc\n\t\t\tif _, ok := attrs.GetString(string(semconv.K8SContainerNameKey)); ok {\n\t\t\t\treturn createMonitoredResource(k8sContainer, attrs)\n\t\t\t} else if _, ok := attrs.GetString(string(semconv.K8SPodNameKey)); ok {\n\t\t\t\treturn createMonitoredResource(k8sPod, attrs)\n\t\t\t} else if _, ok := attrs.GetString(string(semconv.K8SNodeNameKey)); ok {\n\t\t\t\treturn createMonitoredResource(k8sNode, attrs)\n\t\t\t}\n\t\t\treturn createMonitoredResource(k8sCluster, attrs)\n\t\t}\n\n\t\t// Fallback to generic_task\n\t\t_, hasServiceName := attrs.GetString(string(semconv.ServiceNameKey))\n\t\t_, hasFaaSName := attrs.GetString(string(semconv.FaaSNameKey))\n\t\t_, hasServiceInstanceID := attrs.GetString(string(semconv.ServiceInstanceIDKey))\n\t\t_, hasFaaSInstance := attrs.GetString(string(semconv.FaaSInstanceKey))\n\t\tif (hasServiceName && hasServiceInstanceID) || (hasFaaSInstance && hasFaaSName) {\n\t\t\treturn createMonitoredResource(genericTask, attrs)\n\t\t}\n\n\t\t// Everything else fallback to generic_node\n\t\treturn createMonitoredResource(genericNode, attrs)\n\t}\n}\n\nfunc createMonitoredResource(\n\tmonitoredResourceType string,\n\tresourceAttrs ReadOnlyAttributes,\n) *monitoredrespb.MonitoredResource {\n\tmappings := monitoredResourceMappings[monitoredResourceType]\n\tmrLabels := make(map[string]string, len(mappings))\n\n\tfor mrKey, mappingConfig := range mappings {\n\t\tmrValue := \"\"\n\t\tok := false\n\t\t// Coalesce the possible keys in order\n\t\tfor _, otelKey := range mappingConfig.otelKeys {\n\t\t\tmrValue, ok = resourceAttrs.GetString(otelKey)\n\t\t\tif mrValue != \"\" && !strings.HasPrefix(mrValue, unknownServicePrefix) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif mrValue == \"\" && contains(mappingConfig.otelKeys, string(semconv.ServiceNameKey)) {\n\t\t\t// the service name started with unknown_service, and was ignored above\n\t\t\tmrValue, ok = resourceAttrs.GetString(string(semconv.ServiceNameKey))\n\t\t}\n\t\tif !ok || mrValue == \"\" {\n\t\t\tmrValue = mappingConfig.fallbackLiteral\n\t\t}\n\t\tmrLabels[mrKey] = sanitizeUTF8(mrValue)\n\t}\n\treturn &monitoredrespb.MonitoredResource{\n\t\tType:   monitoredResourceType,\n\t\tLabels: mrLabels,\n\t}\n}\n\nfunc contains(list []string, element string) bool {\n\tfor _, item := range list {\n\t\tif item == element {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc sanitizeUTF8(s string) string {\n\treturn strings.ToValidUTF8(s, \"�\")\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/.gitattributes",
    "content": "* text=auto eol=lf"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/.gitignore",
    "content": ".vscode/\n\n*.exe\n\n# testing\ntestdata\n\n# go workspaces\ngo.work\ngo.work.sum\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/.golangci.yml",
    "content": "linters:\n  enable:\n    # style\n    - containedctx # struct contains a context\n    - dupl # duplicate code\n    - errname # erorrs are named correctly\n    - nolintlint # \"//nolint\" directives are properly explained\n    - revive # golint replacement\n    - unconvert # unnecessary conversions\n    - wastedassign\n\n    # bugs, performance, unused, etc ...\n    - contextcheck # function uses a non-inherited context\n    - errorlint # errors not wrapped for 1.13\n    - exhaustive # check exhaustiveness of enum switch statements\n    - gofmt # files are gofmt'ed\n    - gosec # security\n    - nilerr # returns nil even with non-nil error\n    - thelper #  test helpers without t.Helper()\n    - unparam # unused function params\n\nissues:\n  exclude-dirs:\n    - pkg/etw/sample\n\n  exclude-rules:\n    # err is very often shadowed in nested scopes\n    - linters:\n        - govet\n      text: '^shadow: declaration of \"err\" shadows declaration'\n\n    # ignore long lines for skip autogen directives\n    - linters:\n        - revive\n      text: \"^line-length-limit: \"\n      source: \"^//(go:generate|sys) \"\n\n    #TODO: remove after upgrading to go1.18\n    # ignore comment spacing for nolint and sys directives\n    - linters:\n        - revive\n      text: \"^comment-spacings: no space between comment delimiter and comment text\"\n      source: \"//(cspell:|nolint:|sys |todo)\"\n\n    # not on go 1.18 yet, so no any\n    - linters:\n        - revive\n      text: \"^use-any: since GO 1.18 'interface{}' can be replaced by 'any'\"\n\n    # allow unjustified ignores of error checks in defer statements\n    - linters:\n        - nolintlint\n      text: \"^directive `//nolint:errcheck` should provide explanation\"\n      source: '^\\s*defer '\n\n    # allow unjustified ignores of error lints for io.EOF\n    - linters:\n        - nolintlint\n      text: \"^directive `//nolint:errorlint` should provide explanation\"\n      source: '[=|!]= io.EOF'\n\n\nlinters-settings:\n  exhaustive:\n    default-signifies-exhaustive: true\n  govet:\n    enable-all: true\n    disable:\n      # struct order is often for Win32 compat\n      # also, ignore pointer bytes/GC issues for now until performance becomes an issue\n      - fieldalignment\n  nolintlint:\n    require-explanation: true\n    require-specific: true\n  revive:\n    # revive is more configurable than static check, so likely the preferred alternative to static-check\n    # (once the perf issue is solved: https://github.com/golangci/golangci-lint/issues/2997)\n    enable-all-rules:\n      true\n      # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md\n    rules:\n      # rules with required arguments\n      - name: argument-limit\n        disabled: true\n      - name: banned-characters\n        disabled: true\n      - name: cognitive-complexity\n        disabled: true\n      - name: cyclomatic\n        disabled: true\n      - name: file-header\n        disabled: true\n      - name: function-length\n        disabled: true\n      - name: function-result-limit\n        disabled: true\n      - name: max-public-structs\n        disabled: true\n      # geneally annoying rules\n      - name: add-constant # complains about any and all strings and integers\n        disabled: true\n      - name: confusing-naming # we frequently use \"Foo()\" and \"foo()\" together\n        disabled: true\n      - name: flag-parameter # excessive, and a common idiom we use\n        disabled: true\n      - name: unhandled-error # warns over common fmt.Print* and io.Close; rely on errcheck instead\n        disabled: true\n      # general config\n      - name: line-length-limit\n        arguments:\n          - 140\n      - name: var-naming\n        arguments:\n          - []\n          - - CID\n            - CRI\n            - CTRD\n            - DACL\n            - DLL\n            - DOS\n            - ETW\n            - FSCTL\n            - GCS\n            - GMSA\n            - HCS\n            - HV\n            - IO\n            - LCOW\n            - LDAP\n            - LPAC\n            - LTSC\n            - MMIO\n            - NT\n            - OCI\n            - PMEM\n            - PWSH\n            - RX\n            - SACl\n            - SID\n            - SMB\n            - TX\n            - VHD\n            - VHDX\n            - VMID\n            - VPCI\n            - WCOW\n            - WIM\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/CODEOWNERS",
    "content": "  * @microsoft/containerplat\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Microsoft\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\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/README.md",
    "content": "# go-winio [![Build Status](https://github.com/microsoft/go-winio/actions/workflows/ci.yml/badge.svg)](https://github.com/microsoft/go-winio/actions/workflows/ci.yml)\n\nThis repository contains utilities for efficiently performing Win32 IO operations in\nGo. Currently, this is focused on accessing named pipes and other file handles, and\nfor using named pipes as a net transport.\n\nThis code relies on IO completion ports to avoid blocking IO on system threads, allowing Go\nto reuse the thread to schedule another goroutine. This limits support to Windows Vista and\nnewer operating systems. This is similar to the implementation of network sockets in Go's net\npackage.\n\nPlease see the LICENSE file for licensing information.\n\n## Contributing\n\nThis project welcomes contributions and suggestions.\nMost contributions require you to agree to a Contributor License Agreement (CLA) declaring that\nyou have the right to, and actually do, grant us the rights to use your contribution.\nFor details, visit [Microsoft CLA](https://cla.microsoft.com).\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need to\nprovide a CLA and decorate the PR appropriately (e.g., label, comment).\nSimply follow the instructions provided by the bot.\nYou will only need to do this once across all repos using our CLA.\n\nAdditionally, the pull request pipeline requires the following steps to be performed before\nmergining.\n\n### Code Sign-Off\n\nWe require that contributors sign their commits using [`git commit --signoff`][git-commit-s]\nto certify they either authored the work themselves or otherwise have permission to use it in this project.\n\nA range of commits can be signed off using [`git rebase --signoff`][git-rebase-s].\n\nPlease see [the developer certificate](https://developercertificate.org) for more info,\nas well as to make sure that you can attest to the rules listed.\nOur CI uses the DCO Github app to ensure that all commits in a given PR are signed-off.\n\n### Linting\n\nCode must pass a linting stage, which uses [`golangci-lint`][lint].\nThe linting settings are stored in [`.golangci.yaml`](./.golangci.yaml), and can be run\nautomatically with VSCode by adding the following to your workspace or folder settings:\n\n```json\n    \"go.lintTool\": \"golangci-lint\",\n    \"go.lintOnSave\": \"package\",\n```\n\nAdditional editor [integrations options are also available][lint-ide].\n\nAlternatively, `golangci-lint` can be [installed locally][lint-install] and run from the repo root:\n\n```shell\n# use . or specify a path to only lint a package\n# to show all lint errors, use flags \"--max-issues-per-linter=0 --max-same-issues=0\"\n> golangci-lint run ./...\n```\n\n### Go Generate\n\nThe pipeline checks that auto-generated code, via `go generate`, are up to date.\n\nThis can be done for the entire repo:\n\n```shell\n> go generate ./...\n```\n\n## Code of Conduct\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or\ncontact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Special Thanks\n\nThanks to [natefinch][natefinch] for the inspiration for this library.\nSee [npipe](https://github.com/natefinch/npipe) for another named pipe implementation.\n\n[lint]: https://golangci-lint.run/\n[lint-ide]: https://golangci-lint.run/usage/integrations/#editor-integration\n[lint-install]: https://golangci-lint.run/usage/install/#local-installation\n\n[git-commit-s]: https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--s\n[git-rebase-s]: https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---signoff\n\n[natefinch]: https://github.com/natefinch\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/SECURITY.md",
    "content": "<!-- BEGIN MICROSOFT SECURITY.MD V0.0.7 BLOCK -->\n\n## Security\n\nMicrosoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).\n\nIf you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.\n\n## Reporting Security Issues\n\n**Please do not report security vulnerabilities through public GitHub issues.**\n\nInstead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).\n\nIf you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com).  If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).\n\nYou should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). \n\nPlease include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:\n\n  * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)\n  * Full paths of source file(s) related to the manifestation of the issue\n  * The location of the affected source code (tag/branch/commit or direct URL)\n  * Any special configuration required to reproduce the issue\n  * Step-by-step instructions to reproduce the issue\n  * Proof-of-concept or exploit code (if possible)\n  * Impact of the issue, including how an attacker might exploit the issue\n\nThis information will help us triage your report more quickly.\n\nIf you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.\n\n## Preferred Languages\n\nWe prefer all communications to be in English.\n\n## Policy\n\nMicrosoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).\n\n<!-- END MICROSOFT SECURITY.MD BLOCK -->\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/backup.go",
    "content": "//go:build windows\n// +build windows\n\npackage winio\n\nimport (\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"runtime\"\n\t\"unicode/utf16\"\n\n\t\"github.com/Microsoft/go-winio/internal/fs\"\n\t\"golang.org/x/sys/windows\"\n)\n\n//sys backupRead(h windows.Handle, b []byte, bytesRead *uint32, abort bool, processSecurity bool, context *uintptr) (err error) = BackupRead\n//sys backupWrite(h windows.Handle, b []byte, bytesWritten *uint32, abort bool, processSecurity bool, context *uintptr) (err error) = BackupWrite\n\nconst (\n\tBackupData = uint32(iota + 1)\n\tBackupEaData\n\tBackupSecurity\n\tBackupAlternateData\n\tBackupLink\n\tBackupPropertyData\n\tBackupObjectId //revive:disable-line:var-naming ID, not Id\n\tBackupReparseData\n\tBackupSparseBlock\n\tBackupTxfsData\n)\n\nconst (\n\tStreamSparseAttributes = uint32(8)\n)\n\n//nolint:revive // var-naming: ALL_CAPS\nconst (\n\tWRITE_DAC              = windows.WRITE_DAC\n\tWRITE_OWNER            = windows.WRITE_OWNER\n\tACCESS_SYSTEM_SECURITY = windows.ACCESS_SYSTEM_SECURITY\n)\n\n// BackupHeader represents a backup stream of a file.\ntype BackupHeader struct {\n\t//revive:disable-next-line:var-naming ID, not Id\n\tId         uint32 // The backup stream ID\n\tAttributes uint32 // Stream attributes\n\tSize       int64  // The size of the stream in bytes\n\tName       string // The name of the stream (for BackupAlternateData only).\n\tOffset     int64  // The offset of the stream in the file (for BackupSparseBlock only).\n}\n\ntype win32StreamID struct {\n\tStreamID   uint32\n\tAttributes uint32\n\tSize       uint64\n\tNameSize   uint32\n}\n\n// BackupStreamReader reads from a stream produced by the BackupRead Win32 API and produces a series\n// of BackupHeader values.\ntype BackupStreamReader struct {\n\tr         io.Reader\n\tbytesLeft int64\n}\n\n// NewBackupStreamReader produces a BackupStreamReader from any io.Reader.\nfunc NewBackupStreamReader(r io.Reader) *BackupStreamReader {\n\treturn &BackupStreamReader{r, 0}\n}\n\n// Next returns the next backup stream and prepares for calls to Read(). It skips the remainder of the current stream if\n// it was not completely read.\nfunc (r *BackupStreamReader) Next() (*BackupHeader, error) {\n\tif r.bytesLeft > 0 { //nolint:nestif // todo: flatten this\n\t\tif s, ok := r.r.(io.Seeker); ok {\n\t\t\t// Make sure Seek on io.SeekCurrent sometimes succeeds\n\t\t\t// before trying the actual seek.\n\t\t\tif _, err := s.Seek(0, io.SeekCurrent); err == nil {\n\t\t\t\tif _, err = s.Seek(r.bytesLeft, io.SeekCurrent); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tr.bytesLeft = 0\n\t\t\t}\n\t\t}\n\t\tif _, err := io.Copy(io.Discard, r); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\tvar wsi win32StreamID\n\tif err := binary.Read(r.r, binary.LittleEndian, &wsi); err != nil {\n\t\treturn nil, err\n\t}\n\thdr := &BackupHeader{\n\t\tId:         wsi.StreamID,\n\t\tAttributes: wsi.Attributes,\n\t\tSize:       int64(wsi.Size),\n\t}\n\tif wsi.NameSize != 0 {\n\t\tname := make([]uint16, int(wsi.NameSize/2))\n\t\tif err := binary.Read(r.r, binary.LittleEndian, name); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\thdr.Name = windows.UTF16ToString(name)\n\t}\n\tif wsi.StreamID == BackupSparseBlock {\n\t\tif err := binary.Read(r.r, binary.LittleEndian, &hdr.Offset); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\thdr.Size -= 8\n\t}\n\tr.bytesLeft = hdr.Size\n\treturn hdr, nil\n}\n\n// Read reads from the current backup stream.\nfunc (r *BackupStreamReader) Read(b []byte) (int, error) {\n\tif r.bytesLeft == 0 {\n\t\treturn 0, io.EOF\n\t}\n\tif int64(len(b)) > r.bytesLeft {\n\t\tb = b[:r.bytesLeft]\n\t}\n\tn, err := r.r.Read(b)\n\tr.bytesLeft -= int64(n)\n\tif err == io.EOF {\n\t\terr = io.ErrUnexpectedEOF\n\t} else if r.bytesLeft == 0 && err == nil {\n\t\terr = io.EOF\n\t}\n\treturn n, err\n}\n\n// BackupStreamWriter writes a stream compatible with the BackupWrite Win32 API.\ntype BackupStreamWriter struct {\n\tw         io.Writer\n\tbytesLeft int64\n}\n\n// NewBackupStreamWriter produces a BackupStreamWriter on top of an io.Writer.\nfunc NewBackupStreamWriter(w io.Writer) *BackupStreamWriter {\n\treturn &BackupStreamWriter{w, 0}\n}\n\n// WriteHeader writes the next backup stream header and prepares for calls to Write().\nfunc (w *BackupStreamWriter) WriteHeader(hdr *BackupHeader) error {\n\tif w.bytesLeft != 0 {\n\t\treturn fmt.Errorf(\"missing %d bytes\", w.bytesLeft)\n\t}\n\tname := utf16.Encode([]rune(hdr.Name))\n\twsi := win32StreamID{\n\t\tStreamID:   hdr.Id,\n\t\tAttributes: hdr.Attributes,\n\t\tSize:       uint64(hdr.Size),\n\t\tNameSize:   uint32(len(name) * 2),\n\t}\n\tif hdr.Id == BackupSparseBlock {\n\t\t// Include space for the int64 block offset\n\t\twsi.Size += 8\n\t}\n\tif err := binary.Write(w.w, binary.LittleEndian, &wsi); err != nil {\n\t\treturn err\n\t}\n\tif len(name) != 0 {\n\t\tif err := binary.Write(w.w, binary.LittleEndian, name); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif hdr.Id == BackupSparseBlock {\n\t\tif err := binary.Write(w.w, binary.LittleEndian, hdr.Offset); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tw.bytesLeft = hdr.Size\n\treturn nil\n}\n\n// Write writes to the current backup stream.\nfunc (w *BackupStreamWriter) Write(b []byte) (int, error) {\n\tif w.bytesLeft < int64(len(b)) {\n\t\treturn 0, fmt.Errorf(\"too many bytes by %d\", int64(len(b))-w.bytesLeft)\n\t}\n\tn, err := w.w.Write(b)\n\tw.bytesLeft -= int64(n)\n\treturn n, err\n}\n\n// BackupFileReader provides an io.ReadCloser interface on top of the BackupRead Win32 API.\ntype BackupFileReader struct {\n\tf               *os.File\n\tincludeSecurity bool\n\tctx             uintptr\n}\n\n// NewBackupFileReader returns a new BackupFileReader from a file handle. If includeSecurity is true,\n// Read will attempt to read the security descriptor of the file.\nfunc NewBackupFileReader(f *os.File, includeSecurity bool) *BackupFileReader {\n\tr := &BackupFileReader{f, includeSecurity, 0}\n\treturn r\n}\n\n// Read reads a backup stream from the file by calling the Win32 API BackupRead().\nfunc (r *BackupFileReader) Read(b []byte) (int, error) {\n\tvar bytesRead uint32\n\terr := backupRead(windows.Handle(r.f.Fd()), b, &bytesRead, false, r.includeSecurity, &r.ctx)\n\tif err != nil {\n\t\treturn 0, &os.PathError{Op: \"BackupRead\", Path: r.f.Name(), Err: err}\n\t}\n\truntime.KeepAlive(r.f)\n\tif bytesRead == 0 {\n\t\treturn 0, io.EOF\n\t}\n\treturn int(bytesRead), nil\n}\n\n// Close frees Win32 resources associated with the BackupFileReader. It does not close\n// the underlying file.\nfunc (r *BackupFileReader) Close() error {\n\tif r.ctx != 0 {\n\t\t_ = backupRead(windows.Handle(r.f.Fd()), nil, nil, true, false, &r.ctx)\n\t\truntime.KeepAlive(r.f)\n\t\tr.ctx = 0\n\t}\n\treturn nil\n}\n\n// BackupFileWriter provides an io.WriteCloser interface on top of the BackupWrite Win32 API.\ntype BackupFileWriter struct {\n\tf               *os.File\n\tincludeSecurity bool\n\tctx             uintptr\n}\n\n// NewBackupFileWriter returns a new BackupFileWriter from a file handle. If includeSecurity is true,\n// Write() will attempt to restore the security descriptor from the stream.\nfunc NewBackupFileWriter(f *os.File, includeSecurity bool) *BackupFileWriter {\n\tw := &BackupFileWriter{f, includeSecurity, 0}\n\treturn w\n}\n\n// Write restores a portion of the file using the provided backup stream.\nfunc (w *BackupFileWriter) Write(b []byte) (int, error) {\n\tvar bytesWritten uint32\n\terr := backupWrite(windows.Handle(w.f.Fd()), b, &bytesWritten, false, w.includeSecurity, &w.ctx)\n\tif err != nil {\n\t\treturn 0, &os.PathError{Op: \"BackupWrite\", Path: w.f.Name(), Err: err}\n\t}\n\truntime.KeepAlive(w.f)\n\tif int(bytesWritten) != len(b) {\n\t\treturn int(bytesWritten), errors.New(\"not all bytes could be written\")\n\t}\n\treturn len(b), nil\n}\n\n// Close frees Win32 resources associated with the BackupFileWriter. It does not\n// close the underlying file.\nfunc (w *BackupFileWriter) Close() error {\n\tif w.ctx != 0 {\n\t\t_ = backupWrite(windows.Handle(w.f.Fd()), nil, nil, true, false, &w.ctx)\n\t\truntime.KeepAlive(w.f)\n\t\tw.ctx = 0\n\t}\n\treturn nil\n}\n\n// OpenForBackup opens a file or directory, potentially skipping access checks if the backup\n// or restore privileges have been acquired.\n//\n// If the file opened was a directory, it cannot be used with Readdir().\nfunc OpenForBackup(path string, access uint32, share uint32, createmode uint32) (*os.File, error) {\n\th, err := fs.CreateFile(path,\n\t\tfs.AccessMask(access),\n\t\tfs.FileShareMode(share),\n\t\tnil,\n\t\tfs.FileCreationDisposition(createmode),\n\t\tfs.FILE_FLAG_BACKUP_SEMANTICS|fs.FILE_FLAG_OPEN_REPARSE_POINT,\n\t\t0,\n\t)\n\tif err != nil {\n\t\terr = &os.PathError{Op: \"open\", Path: path, Err: err}\n\t\treturn nil, err\n\t}\n\treturn os.NewFile(uintptr(h), path), nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/backuptar/doc.go",
    "content": "// This file only exists to allow go get on non-Windows platforms.\n\npackage backuptar\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/backuptar/strconv.go",
    "content": "//go:build windows\n\npackage backuptar\n\nimport (\n\t\"archive/tar\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n)\n\n// Functions copied from https://github.com/golang/go/blob/master/src/archive/tar/strconv.go\n// as we need to manage the LIBARCHIVE.creationtime PAXRecord manually.\n// Idea taken from containerd which did the same thing.\n\n// parsePAXTime takes a string of the form %d.%d as described in the PAX\n// specification. Note that this implementation allows for negative timestamps,\n// which is allowed for by the PAX specification, but not always portable.\nfunc parsePAXTime(s string) (time.Time, error) {\n\tconst maxNanoSecondDigits = 9\n\n\t// Split string into seconds and sub-seconds parts.\n\tss, sn := s, \"\"\n\tif pos := strings.IndexByte(s, '.'); pos >= 0 {\n\t\tss, sn = s[:pos], s[pos+1:]\n\t}\n\n\t// Parse the seconds.\n\tsecs, err := strconv.ParseInt(ss, 10, 64)\n\tif err != nil {\n\t\treturn time.Time{}, tar.ErrHeader\n\t}\n\tif len(sn) == 0 {\n\t\treturn time.Unix(secs, 0), nil // No sub-second values\n\t}\n\n\t// Parse the nanoseconds.\n\tif strings.Trim(sn, \"0123456789\") != \"\" {\n\t\treturn time.Time{}, tar.ErrHeader\n\t}\n\tif len(sn) < maxNanoSecondDigits {\n\t\tsn += strings.Repeat(\"0\", maxNanoSecondDigits-len(sn)) // Right pad\n\t} else {\n\t\tsn = sn[:maxNanoSecondDigits] // Right truncate\n\t}\n\tnsecs, _ := strconv.ParseInt(sn, 10, 64) // Must succeed\n\tif len(ss) > 0 && ss[0] == '-' {\n\t\treturn time.Unix(secs, -1*nsecs), nil // Negative correction\n\t}\n\treturn time.Unix(secs, nsecs), nil\n}\n\n// formatPAXTime converts ts into a time of the form %d.%d as described in the\n// PAX specification. This function is capable of negative timestamps.\nfunc formatPAXTime(ts time.Time) (s string) {\n\tsecs, nsecs := ts.Unix(), ts.Nanosecond()\n\tif nsecs == 0 {\n\t\treturn strconv.FormatInt(secs, 10)\n\t}\n\n\t// If seconds is negative, then perform correction.\n\tsign := \"\"\n\tif secs < 0 {\n\t\tsign = \"-\"             // Remember sign\n\t\tsecs = -(secs + 1)     // Add a second to secs\n\t\tnsecs = -(nsecs - 1e9) // Take that second away from nsecs\n\t}\n\treturn strings.TrimRight(fmt.Sprintf(\"%s%d.%09d\", sign, secs, nsecs), \"0\")\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/backuptar/tar.go",
    "content": "//go:build windows\n// +build windows\n\npackage backuptar\n\nimport (\n\t\"archive/tar\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"io\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/Microsoft/go-winio\"\n\t\"golang.org/x/sys/windows\"\n)\n\n//nolint:deadcode,varcheck // keep unused constants for potential future use\nconst (\n\tcISUID  = 0004000 // Set uid\n\tcISGID  = 0002000 // Set gid\n\tcISVTX  = 0001000 // Save text (sticky bit)\n\tcISDIR  = 0040000 // Directory\n\tcISFIFO = 0010000 // FIFO\n\tcISREG  = 0100000 // Regular file\n\tcISLNK  = 0120000 // Symbolic link\n\tcISBLK  = 0060000 // Block special file\n\tcISCHR  = 0020000 // Character special file\n\tcISSOCK = 0140000 // Socket\n)\n\nconst (\n\thdrFileAttributes        = \"MSWINDOWS.fileattr\"\n\thdrSecurityDescriptor    = \"MSWINDOWS.sd\"\n\thdrRawSecurityDescriptor = \"MSWINDOWS.rawsd\"\n\thdrMountPoint            = \"MSWINDOWS.mountpoint\"\n\thdrEaPrefix              = \"MSWINDOWS.xattr.\"\n\n\thdrCreationTime = \"LIBARCHIVE.creationtime\"\n)\n\n// zeroReader is an io.Reader that always returns 0s.\ntype zeroReader struct{}\n\nfunc (zeroReader) Read(b []byte) (int, error) {\n\tfor i := range b {\n\t\tb[i] = 0\n\t}\n\treturn len(b), nil\n}\n\nfunc copySparse(t *tar.Writer, br *winio.BackupStreamReader) error {\n\tcurOffset := int64(0)\n\tfor {\n\t\tbhdr, err := br.Next()\n\t\tif err == io.EOF { //nolint:errorlint\n\t\t\terr = io.ErrUnexpectedEOF\n\t\t}\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif bhdr.Id != winio.BackupSparseBlock {\n\t\t\treturn fmt.Errorf(\"unexpected stream %d\", bhdr.Id)\n\t\t}\n\n\t\t// We can't seek backwards, since we have already written that data to the tar.Writer.\n\t\tif bhdr.Offset < curOffset {\n\t\t\treturn fmt.Errorf(\"cannot seek back from %d to %d\", curOffset, bhdr.Offset)\n\t\t}\n\t\t// archive/tar does not support writing sparse files\n\t\t// so just write zeroes to catch up to the current offset.\n\t\tif _, err = io.CopyN(t, zeroReader{}, bhdr.Offset-curOffset); err != nil {\n\t\t\treturn fmt.Errorf(\"seek to offset %d: %w\", bhdr.Offset, err)\n\t\t}\n\t\tif bhdr.Size == 0 {\n\t\t\t// A sparse block with size = 0 is used to mark the end of the sparse blocks.\n\t\t\tbreak\n\t\t}\n\t\tn, err := io.Copy(t, br)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif n != bhdr.Size {\n\t\t\treturn fmt.Errorf(\"copied %d bytes instead of %d at offset %d\", n, bhdr.Size, bhdr.Offset)\n\t\t}\n\t\tcurOffset = bhdr.Offset + n\n\t}\n\treturn nil\n}\n\n// BasicInfoHeader creates a tar header from basic file information.\nfunc BasicInfoHeader(name string, size int64, fileInfo *winio.FileBasicInfo) *tar.Header {\n\thdr := &tar.Header{\n\t\tFormat:     tar.FormatPAX,\n\t\tName:       filepath.ToSlash(name),\n\t\tSize:       size,\n\t\tTypeflag:   tar.TypeReg,\n\t\tModTime:    time.Unix(0, fileInfo.LastWriteTime.Nanoseconds()),\n\t\tChangeTime: time.Unix(0, fileInfo.ChangeTime.Nanoseconds()),\n\t\tAccessTime: time.Unix(0, fileInfo.LastAccessTime.Nanoseconds()),\n\t\tPAXRecords: make(map[string]string),\n\t}\n\thdr.PAXRecords[hdrFileAttributes] = fmt.Sprintf(\"%d\", fileInfo.FileAttributes)\n\thdr.PAXRecords[hdrCreationTime] = formatPAXTime(time.Unix(0, fileInfo.CreationTime.Nanoseconds()))\n\n\tif (fileInfo.FileAttributes & windows.FILE_ATTRIBUTE_DIRECTORY) != 0 {\n\t\thdr.Mode |= cISDIR\n\t\thdr.Size = 0\n\t\thdr.Typeflag = tar.TypeDir\n\t}\n\treturn hdr\n}\n\n// SecurityDescriptorFromTarHeader reads the SDDL associated with the header of the current file\n// from the tar header and returns the security descriptor into a byte slice.\nfunc SecurityDescriptorFromTarHeader(hdr *tar.Header) ([]byte, error) {\n\tif sdraw, ok := hdr.PAXRecords[hdrRawSecurityDescriptor]; ok {\n\t\tsd, err := base64.StdEncoding.DecodeString(sdraw)\n\t\tif err != nil {\n\t\t\t// Not returning sd as-is in the error-case, as base64.DecodeString\n\t\t\t// may return partially decoded data (not nil or empty slice) in case\n\t\t\t// of a failure: https://github.com/golang/go/blob/go1.17.7/src/encoding/base64/base64.go#L382-L387\n\t\t\treturn nil, err\n\t\t}\n\t\treturn sd, nil\n\t}\n\t// Maintaining old SDDL-based behavior for backward compatibility. All new\n\t// tar headers written by this library will have raw binary for the security\n\t// descriptor.\n\tif sddl, ok := hdr.PAXRecords[hdrSecurityDescriptor]; ok {\n\t\treturn winio.SddlToSecurityDescriptor(sddl)\n\t}\n\treturn nil, nil\n}\n\n// ExtendedAttributesFromTarHeader reads the EAs associated with the header of the\n// current file from the tar header and returns it as a byte slice.\nfunc ExtendedAttributesFromTarHeader(hdr *tar.Header) ([]byte, error) {\n\tvar eas []winio.ExtendedAttribute //nolint:prealloc // len(eas) <= len(hdr.PAXRecords); prealloc is wasteful\n\tfor k, v := range hdr.PAXRecords {\n\t\tif !strings.HasPrefix(k, hdrEaPrefix) {\n\t\t\tcontinue\n\t\t}\n\t\tdata, err := base64.StdEncoding.DecodeString(v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\teas = append(eas, winio.ExtendedAttribute{\n\t\t\tName:  k[len(hdrEaPrefix):],\n\t\t\tValue: data,\n\t\t})\n\t}\n\tvar eaData []byte\n\tvar err error\n\tif len(eas) != 0 {\n\t\teaData, err = winio.EncodeExtendedAttributes(eas)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn eaData, nil\n}\n\n// EncodeReparsePointFromTarHeader reads the ReparsePoint structure from the tar header\n// and encodes it into a byte slice. The file for which this function is called must be a\n// symlink.\nfunc EncodeReparsePointFromTarHeader(hdr *tar.Header) []byte {\n\t_, isMountPoint := hdr.PAXRecords[hdrMountPoint]\n\trp := winio.ReparsePoint{\n\t\tTarget:       filepath.FromSlash(hdr.Linkname),\n\t\tIsMountPoint: isMountPoint,\n\t}\n\treturn winio.EncodeReparsePoint(&rp)\n}\n\n// WriteTarFileFromBackupStream writes a file to a tar writer using data from a Win32 backup stream.\n//\n// This encodes Win32 metadata as tar pax vendor extensions starting with MSWINDOWS.\n//\n// The additional Win32 metadata is:\n//\n//   - MSWINDOWS.fileattr: The Win32 file attributes, as a decimal value\n//   - MSWINDOWS.rawsd: The Win32 security descriptor, in raw binary format\n//   - MSWINDOWS.mountpoint: If present, this is a mount point and not a symlink, even though the type is '2' (symlink)\nfunc WriteTarFileFromBackupStream(t *tar.Writer, r io.Reader, name string, size int64, fileInfo *winio.FileBasicInfo) error {\n\tname = filepath.ToSlash(name)\n\thdr := BasicInfoHeader(name, size, fileInfo)\n\n\t// If r can be seeked, then this function is two-pass: pass 1 collects the\n\t// tar header data, and pass 2 copies the data stream. If r cannot be\n\t// seeked, then some header data (in particular EAs) will be silently lost.\n\tvar (\n\t\trestartPos int64\n\t\terr        error\n\t)\n\tsr, readTwice := r.(io.Seeker)\n\tif readTwice {\n\t\tif restartPos, err = sr.Seek(0, io.SeekCurrent); err != nil {\n\t\t\treadTwice = false\n\t\t}\n\t}\n\n\tbr := winio.NewBackupStreamReader(r)\n\tvar dataHdr *winio.BackupHeader\n\tfor dataHdr == nil {\n\t\tbhdr, err := br.Next()\n\t\tif err == io.EOF { //nolint:errorlint\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tswitch bhdr.Id {\n\t\tcase winio.BackupData:\n\t\t\thdr.Mode |= cISREG\n\t\t\tif !readTwice {\n\t\t\t\tdataHdr = bhdr\n\t\t\t}\n\t\tcase winio.BackupSecurity:\n\t\t\tsd, err := io.ReadAll(br)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\thdr.PAXRecords[hdrRawSecurityDescriptor] = base64.StdEncoding.EncodeToString(sd)\n\n\t\tcase winio.BackupReparseData:\n\t\t\thdr.Mode |= cISLNK\n\t\t\thdr.Typeflag = tar.TypeSymlink\n\t\t\treparseBuffer, _ := io.ReadAll(br)\n\t\t\trp, err := winio.DecodeReparsePoint(reparseBuffer)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif rp.IsMountPoint {\n\t\t\t\thdr.PAXRecords[hdrMountPoint] = \"1\"\n\t\t\t}\n\t\t\thdr.Linkname = rp.Target\n\n\t\tcase winio.BackupEaData:\n\t\t\teab, err := io.ReadAll(br)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\teas, err := winio.DecodeExtendedAttributes(eab)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tfor _, ea := range eas {\n\t\t\t\t// Use base64 encoding for the binary value. Note that there\n\t\t\t\t// is no way to encode the EA's flags, since their use doesn't\n\t\t\t\t// make any sense for persisted EAs.\n\t\t\t\thdr.PAXRecords[hdrEaPrefix+ea.Name] = base64.StdEncoding.EncodeToString(ea.Value)\n\t\t\t}\n\n\t\tcase winio.BackupAlternateData, winio.BackupLink, winio.BackupPropertyData, winio.BackupObjectId, winio.BackupTxfsData:\n\t\t\t// ignore these streams\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"%s: unknown stream ID %d\", name, bhdr.Id)\n\t\t}\n\t}\n\n\terr = t.WriteHeader(hdr)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif readTwice {\n\t\t// Get back to the data stream.\n\t\tif _, err = sr.Seek(restartPos, io.SeekStart); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor dataHdr == nil {\n\t\t\tbhdr, err := br.Next()\n\t\t\tif err == io.EOF { //nolint:errorlint\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif bhdr.Id == winio.BackupData {\n\t\t\t\tdataHdr = bhdr\n\t\t\t}\n\t\t}\n\t}\n\n\t// The logic for copying file contents is fairly complicated due to the need for handling sparse files,\n\t// and the weird ways they are represented by BackupRead. A normal file will always either have a data stream\n\t// with size and content, or no data stream at all (if empty). However, for a sparse file, the content can also\n\t// be represented using a series of sparse block streams following the data stream. Additionally, the way sparse\n\t// files are handled by BackupRead has changed in the OS recently. The specifics of the representation are described\n\t// in the list at the bottom of this block comment.\n\t//\n\t// Sparse files can be represented in four different ways, based on the specifics of the file.\n\t// - Size = 0:\n\t//     Previously: BackupRead yields no data stream and no sparse block streams.\n\t//     Recently: BackupRead yields a data stream with size = 0. There are no following sparse block streams.\n\t// - Size > 0, no allocated ranges:\n\t//     BackupRead yields a data stream with size = 0. Following is a single sparse block stream with\n\t//     size = 0 and offset = <file size>.\n\t// - Size > 0, one allocated range:\n\t//     BackupRead yields a data stream with size = <file size> containing the file contents. There are no\n\t//     sparse block streams. This is the case if you take a normal file with contents and simply set the\n\t//     sparse flag on it.\n\t// - Size > 0, multiple allocated ranges:\n\t//     BackupRead yields a data stream with size = 0. Following are sparse block streams for each allocated\n\t//     range of the file containing the range contents. Finally there is a sparse block stream with\n\t//     size = 0 and offset = <file size>.\n\n\tif dataHdr != nil { //nolint:nestif // todo: reduce nesting complexity\n\t\t// A data stream was found. Copy the data.\n\t\t// We assume that we will either have a data stream size > 0 XOR have sparse block streams.\n\t\tif dataHdr.Size > 0 || (dataHdr.Attributes&winio.StreamSparseAttributes) == 0 {\n\t\t\tif size != dataHdr.Size {\n\t\t\t\treturn fmt.Errorf(\"%s: mismatch between file size %d and header size %d\", name, size, dataHdr.Size)\n\t\t\t}\n\t\t\tif _, err = io.Copy(t, br); err != nil {\n\t\t\t\treturn fmt.Errorf(\"%s: copying contents from data stream: %w\", name, err)\n\t\t\t}\n\t\t} else if size > 0 {\n\t\t\t// As of a recent OS change, BackupRead now returns a data stream for empty sparse files.\n\t\t\t// These files have no sparse block streams, so skip the copySparse call if file size = 0.\n\t\t\tif err = copySparse(t, br); err != nil {\n\t\t\t\treturn fmt.Errorf(\"%s: copying contents from sparse block stream: %w\", name, err)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Look for streams after the data stream. The only ones we handle are alternate data streams.\n\t// Other streams may have metadata that could be serialized, but the tar header has already\n\t// been written. In practice, this means that we don't get EA or TXF metadata.\n\tfor {\n\t\tbhdr, err := br.Next()\n\t\tif err == io.EOF { //nolint:errorlint\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tswitch bhdr.Id {\n\t\tcase winio.BackupAlternateData:\n\t\t\tif (bhdr.Attributes & winio.StreamSparseAttributes) != 0 {\n\t\t\t\t// Unsupported for now, since the size of the alternate stream is not present\n\t\t\t\t// in the backup stream until after the data has been read.\n\t\t\t\treturn fmt.Errorf(\"%s: tar of sparse alternate data streams is unsupported\", name)\n\t\t\t}\n\t\t\taltName := strings.TrimSuffix(bhdr.Name, \":$DATA\")\n\t\t\thdr = &tar.Header{\n\t\t\t\tFormat:     hdr.Format,\n\t\t\t\tName:       name + altName,\n\t\t\t\tMode:       hdr.Mode,\n\t\t\t\tTypeflag:   tar.TypeReg,\n\t\t\t\tSize:       bhdr.Size,\n\t\t\t\tModTime:    hdr.ModTime,\n\t\t\t\tAccessTime: hdr.AccessTime,\n\t\t\t\tChangeTime: hdr.ChangeTime,\n\t\t\t}\n\t\t\terr = t.WriteHeader(hdr)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\t_, err = io.Copy(t, br)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase winio.BackupEaData, winio.BackupLink, winio.BackupPropertyData, winio.BackupObjectId, winio.BackupTxfsData:\n\t\t\t// ignore these streams\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"%s: unknown stream ID %d after data\", name, bhdr.Id)\n\t\t}\n\t}\n\treturn nil\n}\n\n// FileInfoFromHeader retrieves basic Win32 file information from a tar header, using the additional metadata written by\n// WriteTarFileFromBackupStream.\nfunc FileInfoFromHeader(hdr *tar.Header) (name string, size int64, fileInfo *winio.FileBasicInfo, err error) {\n\tname = hdr.Name\n\tif hdr.Typeflag == tar.TypeReg {\n\t\tsize = hdr.Size\n\t}\n\tfileInfo = &winio.FileBasicInfo{\n\t\tLastAccessTime: windows.NsecToFiletime(hdr.AccessTime.UnixNano()),\n\t\tLastWriteTime:  windows.NsecToFiletime(hdr.ModTime.UnixNano()),\n\t\tChangeTime:     windows.NsecToFiletime(hdr.ChangeTime.UnixNano()),\n\t\t// Default to ModTime, we'll pull hdrCreationTime below if present\n\t\tCreationTime: windows.NsecToFiletime(hdr.ModTime.UnixNano()),\n\t}\n\tif attrStr, ok := hdr.PAXRecords[hdrFileAttributes]; ok {\n\t\tattr, err := strconv.ParseUint(attrStr, 10, 32)\n\t\tif err != nil {\n\t\t\treturn \"\", 0, nil, err\n\t\t}\n\t\tfileInfo.FileAttributes = uint32(attr)\n\t} else {\n\t\tif hdr.Typeflag == tar.TypeDir {\n\t\t\tfileInfo.FileAttributes |= windows.FILE_ATTRIBUTE_DIRECTORY\n\t\t}\n\t}\n\tif creationTimeStr, ok := hdr.PAXRecords[hdrCreationTime]; ok {\n\t\tcreationTime, err := parsePAXTime(creationTimeStr)\n\t\tif err != nil {\n\t\t\treturn \"\", 0, nil, err\n\t\t}\n\t\tfileInfo.CreationTime = windows.NsecToFiletime(creationTime.UnixNano())\n\t}\n\treturn name, size, fileInfo, err\n}\n\n// WriteBackupStreamFromTarFile writes a Win32 backup stream from the current tar file. Since this function may process multiple\n// tar file entries in order to collect all the alternate data streams for the file, it returns the next\n// tar file that was not processed, or io.EOF is there are no more.\nfunc WriteBackupStreamFromTarFile(w io.Writer, t *tar.Reader, hdr *tar.Header) (*tar.Header, error) {\n\tbw := winio.NewBackupStreamWriter(w)\n\n\tsd, err := SecurityDescriptorFromTarHeader(hdr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(sd) != 0 {\n\t\tbhdr := winio.BackupHeader{\n\t\t\tId:   winio.BackupSecurity,\n\t\t\tSize: int64(len(sd)),\n\t\t}\n\t\terr := bw.WriteHeader(&bhdr)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t_, err = bw.Write(sd)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\teadata, err := ExtendedAttributesFromTarHeader(hdr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(eadata) != 0 {\n\t\tbhdr := winio.BackupHeader{\n\t\t\tId:   winio.BackupEaData,\n\t\t\tSize: int64(len(eadata)),\n\t\t}\n\t\terr = bw.WriteHeader(&bhdr)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t_, err = bw.Write(eadata)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tif hdr.Typeflag == tar.TypeSymlink {\n\t\treparse := EncodeReparsePointFromTarHeader(hdr)\n\t\tbhdr := winio.BackupHeader{\n\t\t\tId:   winio.BackupReparseData,\n\t\t\tSize: int64(len(reparse)),\n\t\t}\n\t\terr := bw.WriteHeader(&bhdr)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t_, err = bw.Write(reparse)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tif hdr.Typeflag == tar.TypeReg {\n\t\tbhdr := winio.BackupHeader{\n\t\t\tId:   winio.BackupData,\n\t\t\tSize: hdr.Size,\n\t\t}\n\t\terr := bw.WriteHeader(&bhdr)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t_, err = io.Copy(bw, t)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\t// Copy all the alternate data streams and return the next non-ADS header.\n\tfor {\n\t\tahdr, err := t.Next()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif ahdr.Typeflag != tar.TypeReg || !strings.HasPrefix(ahdr.Name, hdr.Name+\":\") {\n\t\t\treturn ahdr, nil\n\t\t}\n\t\tbhdr := winio.BackupHeader{\n\t\t\tId:   winio.BackupAlternateData,\n\t\t\tSize: ahdr.Size,\n\t\t\tName: ahdr.Name[len(hdr.Name):] + \":$DATA\",\n\t\t}\n\t\terr = bw.WriteHeader(&bhdr)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t_, err = io.Copy(bw, t)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/doc.go",
    "content": "// This package provides utilities for efficiently performing Win32 IO operations in Go.\n// Currently, this package is provides support for genreal IO and management of\n//   - named pipes\n//   - files\n//   - [Hyper-V sockets]\n//\n// This code is similar to Go's [net] package, and uses IO completion ports to avoid\n// blocking IO on system threads, allowing Go to reuse the thread to schedule other goroutines.\n//\n// This limits support to Windows Vista and newer operating systems.\n//\n// Additionally, this package provides support for:\n//   - creating and managing GUIDs\n//   - writing to [ETW]\n//   - opening and manageing VHDs\n//   - parsing [Windows Image files]\n//   - auto-generating Win32 API code\n//\n// [Hyper-V sockets]: https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/user-guide/make-integration-service\n// [ETW]: https://docs.microsoft.com/en-us/windows-hardware/drivers/devtest/event-tracing-for-windows--etw-\n// [Windows Image files]: https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/work-with-windows-images\npackage winio\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/ea.go",
    "content": "package winio\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n)\n\ntype fileFullEaInformation struct {\n\tNextEntryOffset uint32\n\tFlags           uint8\n\tNameLength      uint8\n\tValueLength     uint16\n}\n\nvar (\n\tfileFullEaInformationSize = binary.Size(&fileFullEaInformation{})\n\n\terrInvalidEaBuffer = errors.New(\"invalid extended attribute buffer\")\n\terrEaNameTooLarge  = errors.New(\"extended attribute name too large\")\n\terrEaValueTooLarge = errors.New(\"extended attribute value too large\")\n)\n\n// ExtendedAttribute represents a single Windows EA.\ntype ExtendedAttribute struct {\n\tName  string\n\tValue []byte\n\tFlags uint8\n}\n\nfunc parseEa(b []byte) (ea ExtendedAttribute, nb []byte, err error) {\n\tvar info fileFullEaInformation\n\terr = binary.Read(bytes.NewReader(b), binary.LittleEndian, &info)\n\tif err != nil {\n\t\terr = errInvalidEaBuffer\n\t\treturn ea, nb, err\n\t}\n\n\tnameOffset := fileFullEaInformationSize\n\tnameLen := int(info.NameLength)\n\tvalueOffset := nameOffset + int(info.NameLength) + 1\n\tvalueLen := int(info.ValueLength)\n\tnextOffset := int(info.NextEntryOffset)\n\tif valueLen+valueOffset > len(b) || nextOffset < 0 || nextOffset > len(b) {\n\t\terr = errInvalidEaBuffer\n\t\treturn ea, nb, err\n\t}\n\n\tea.Name = string(b[nameOffset : nameOffset+nameLen])\n\tea.Value = b[valueOffset : valueOffset+valueLen]\n\tea.Flags = info.Flags\n\tif info.NextEntryOffset != 0 {\n\t\tnb = b[info.NextEntryOffset:]\n\t}\n\treturn ea, nb, err\n}\n\n// DecodeExtendedAttributes decodes a list of EAs from a FILE_FULL_EA_INFORMATION\n// buffer retrieved from BackupRead, ZwQueryEaFile, etc.\nfunc DecodeExtendedAttributes(b []byte) (eas []ExtendedAttribute, err error) {\n\tfor len(b) != 0 {\n\t\tea, nb, err := parseEa(b)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\teas = append(eas, ea)\n\t\tb = nb\n\t}\n\treturn eas, err\n}\n\nfunc writeEa(buf *bytes.Buffer, ea *ExtendedAttribute, last bool) error {\n\tif int(uint8(len(ea.Name))) != len(ea.Name) {\n\t\treturn errEaNameTooLarge\n\t}\n\tif int(uint16(len(ea.Value))) != len(ea.Value) {\n\t\treturn errEaValueTooLarge\n\t}\n\tentrySize := uint32(fileFullEaInformationSize + len(ea.Name) + 1 + len(ea.Value))\n\twithPadding := (entrySize + 3) &^ 3\n\tnextOffset := uint32(0)\n\tif !last {\n\t\tnextOffset = withPadding\n\t}\n\tinfo := fileFullEaInformation{\n\t\tNextEntryOffset: nextOffset,\n\t\tFlags:           ea.Flags,\n\t\tNameLength:      uint8(len(ea.Name)),\n\t\tValueLength:     uint16(len(ea.Value)),\n\t}\n\n\terr := binary.Write(buf, binary.LittleEndian, &info)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t_, err = buf.Write([]byte(ea.Name))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = buf.WriteByte(0)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t_, err = buf.Write(ea.Value)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t_, err = buf.Write([]byte{0, 0, 0}[0 : withPadding-entrySize])\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// EncodeExtendedAttributes encodes a list of EAs into a FILE_FULL_EA_INFORMATION\n// buffer for use with BackupWrite, ZwSetEaFile, etc.\nfunc EncodeExtendedAttributes(eas []ExtendedAttribute) ([]byte, error) {\n\tvar buf bytes.Buffer\n\tfor i := range eas {\n\t\tlast := false\n\t\tif i == len(eas)-1 {\n\t\t\tlast = true\n\t\t}\n\n\t\terr := writeEa(&buf, &eas[i], last)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn buf.Bytes(), nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/file.go",
    "content": "//go:build windows\n// +build windows\n\npackage winio\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"runtime\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\n//sys cancelIoEx(file windows.Handle, o *windows.Overlapped) (err error) = CancelIoEx\n//sys createIoCompletionPort(file windows.Handle, port windows.Handle, key uintptr, threadCount uint32) (newport windows.Handle, err error) = CreateIoCompletionPort\n//sys getQueuedCompletionStatus(port windows.Handle, bytes *uint32, key *uintptr, o **ioOperation, timeout uint32) (err error) = GetQueuedCompletionStatus\n//sys setFileCompletionNotificationModes(h windows.Handle, flags uint8) (err error) = SetFileCompletionNotificationModes\n//sys wsaGetOverlappedResult(h windows.Handle, o *windows.Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) = ws2_32.WSAGetOverlappedResult\n\nvar (\n\tErrFileClosed = errors.New(\"file has already been closed\")\n\tErrTimeout    = &timeoutError{}\n)\n\ntype timeoutError struct{}\n\nfunc (*timeoutError) Error() string   { return \"i/o timeout\" }\nfunc (*timeoutError) Timeout() bool   { return true }\nfunc (*timeoutError) Temporary() bool { return true }\n\ntype timeoutChan chan struct{}\n\nvar ioInitOnce sync.Once\nvar ioCompletionPort windows.Handle\n\n// ioResult contains the result of an asynchronous IO operation.\ntype ioResult struct {\n\tbytes uint32\n\terr   error\n}\n\n// ioOperation represents an outstanding asynchronous Win32 IO.\ntype ioOperation struct {\n\to  windows.Overlapped\n\tch chan ioResult\n}\n\nfunc initIO() {\n\th, err := createIoCompletionPort(windows.InvalidHandle, 0, 0, 0xffffffff)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tioCompletionPort = h\n\tgo ioCompletionProcessor(h)\n}\n\n// win32File implements Reader, Writer, and Closer on a Win32 handle without blocking in a syscall.\n// It takes ownership of this handle and will close it if it is garbage collected.\ntype win32File struct {\n\thandle        windows.Handle\n\twg            sync.WaitGroup\n\twgLock        sync.RWMutex\n\tclosing       atomic.Bool\n\tsocket        bool\n\treadDeadline  deadlineHandler\n\twriteDeadline deadlineHandler\n}\n\ntype deadlineHandler struct {\n\tsetLock     sync.Mutex\n\tchannel     timeoutChan\n\tchannelLock sync.RWMutex\n\ttimer       *time.Timer\n\ttimedout    atomic.Bool\n}\n\n// makeWin32File makes a new win32File from an existing file handle.\nfunc makeWin32File(h windows.Handle) (*win32File, error) {\n\tf := &win32File{handle: h}\n\tioInitOnce.Do(initIO)\n\t_, err := createIoCompletionPort(h, ioCompletionPort, 0, 0xffffffff)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = setFileCompletionNotificationModes(h, windows.FILE_SKIP_COMPLETION_PORT_ON_SUCCESS|windows.FILE_SKIP_SET_EVENT_ON_HANDLE)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tf.readDeadline.channel = make(timeoutChan)\n\tf.writeDeadline.channel = make(timeoutChan)\n\treturn f, nil\n}\n\n// Deprecated: use NewOpenFile instead.\nfunc MakeOpenFile(h syscall.Handle) (io.ReadWriteCloser, error) {\n\treturn NewOpenFile(windows.Handle(h))\n}\n\nfunc NewOpenFile(h windows.Handle) (io.ReadWriteCloser, error) {\n\t// If we return the result of makeWin32File directly, it can result in an\n\t// interface-wrapped nil, rather than a nil interface value.\n\tf, err := makeWin32File(h)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn f, nil\n}\n\n// closeHandle closes the resources associated with a Win32 handle.\nfunc (f *win32File) closeHandle() {\n\tf.wgLock.Lock()\n\t// Atomically set that we are closing, releasing the resources only once.\n\tif !f.closing.Swap(true) {\n\t\tf.wgLock.Unlock()\n\t\t// cancel all IO and wait for it to complete\n\t\t_ = cancelIoEx(f.handle, nil)\n\t\tf.wg.Wait()\n\t\t// at this point, no new IO can start\n\t\twindows.Close(f.handle)\n\t\tf.handle = 0\n\t} else {\n\t\tf.wgLock.Unlock()\n\t}\n}\n\n// Close closes a win32File.\nfunc (f *win32File) Close() error {\n\tf.closeHandle()\n\treturn nil\n}\n\n// IsClosed checks if the file has been closed.\nfunc (f *win32File) IsClosed() bool {\n\treturn f.closing.Load()\n}\n\n// prepareIO prepares for a new IO operation.\n// The caller must call f.wg.Done() when the IO is finished, prior to Close() returning.\nfunc (f *win32File) prepareIO() (*ioOperation, error) {\n\tf.wgLock.RLock()\n\tif f.closing.Load() {\n\t\tf.wgLock.RUnlock()\n\t\treturn nil, ErrFileClosed\n\t}\n\tf.wg.Add(1)\n\tf.wgLock.RUnlock()\n\tc := &ioOperation{}\n\tc.ch = make(chan ioResult)\n\treturn c, nil\n}\n\n// ioCompletionProcessor processes completed async IOs forever.\nfunc ioCompletionProcessor(h windows.Handle) {\n\tfor {\n\t\tvar bytes uint32\n\t\tvar key uintptr\n\t\tvar op *ioOperation\n\t\terr := getQueuedCompletionStatus(h, &bytes, &key, &op, windows.INFINITE)\n\t\tif op == nil {\n\t\t\tpanic(err)\n\t\t}\n\t\top.ch <- ioResult{bytes, err}\n\t}\n}\n\n// todo: helsaawy - create an asyncIO version that takes a context\n\n// asyncIO processes the return value from ReadFile or WriteFile, blocking until\n// the operation has actually completed.\nfunc (f *win32File) asyncIO(c *ioOperation, d *deadlineHandler, bytes uint32, err error) (int, error) {\n\tif err != windows.ERROR_IO_PENDING { //nolint:errorlint // err is Errno\n\t\treturn int(bytes), err\n\t}\n\n\tif f.closing.Load() {\n\t\t_ = cancelIoEx(f.handle, &c.o)\n\t}\n\n\tvar timeout timeoutChan\n\tif d != nil {\n\t\td.channelLock.Lock()\n\t\ttimeout = d.channel\n\t\td.channelLock.Unlock()\n\t}\n\n\tvar r ioResult\n\tselect {\n\tcase r = <-c.ch:\n\t\terr = r.err\n\t\tif err == windows.ERROR_OPERATION_ABORTED { //nolint:errorlint // err is Errno\n\t\t\tif f.closing.Load() {\n\t\t\t\terr = ErrFileClosed\n\t\t\t}\n\t\t} else if err != nil && f.socket {\n\t\t\t// err is from Win32. Query the overlapped structure to get the winsock error.\n\t\t\tvar bytes, flags uint32\n\t\t\terr = wsaGetOverlappedResult(f.handle, &c.o, &bytes, false, &flags)\n\t\t}\n\tcase <-timeout:\n\t\t_ = cancelIoEx(f.handle, &c.o)\n\t\tr = <-c.ch\n\t\terr = r.err\n\t\tif err == windows.ERROR_OPERATION_ABORTED { //nolint:errorlint // err is Errno\n\t\t\terr = ErrTimeout\n\t\t}\n\t}\n\n\t// runtime.KeepAlive is needed, as c is passed via native\n\t// code to ioCompletionProcessor, c must remain alive\n\t// until the channel read is complete.\n\t// todo: (de)allocate *ioOperation via win32 heap functions, instead of needing to KeepAlive?\n\truntime.KeepAlive(c)\n\treturn int(r.bytes), err\n}\n\n// Read reads from a file handle.\nfunc (f *win32File) Read(b []byte) (int, error) {\n\tc, err := f.prepareIO()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tdefer f.wg.Done()\n\n\tif f.readDeadline.timedout.Load() {\n\t\treturn 0, ErrTimeout\n\t}\n\n\tvar bytes uint32\n\terr = windows.ReadFile(f.handle, b, &bytes, &c.o)\n\tn, err := f.asyncIO(c, &f.readDeadline, bytes, err)\n\truntime.KeepAlive(b)\n\n\t// Handle EOF conditions.\n\tif err == nil && n == 0 && len(b) != 0 {\n\t\treturn 0, io.EOF\n\t} else if err == windows.ERROR_BROKEN_PIPE { //nolint:errorlint // err is Errno\n\t\treturn 0, io.EOF\n\t}\n\treturn n, err\n}\n\n// Write writes to a file handle.\nfunc (f *win32File) Write(b []byte) (int, error) {\n\tc, err := f.prepareIO()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tdefer f.wg.Done()\n\n\tif f.writeDeadline.timedout.Load() {\n\t\treturn 0, ErrTimeout\n\t}\n\n\tvar bytes uint32\n\terr = windows.WriteFile(f.handle, b, &bytes, &c.o)\n\tn, err := f.asyncIO(c, &f.writeDeadline, bytes, err)\n\truntime.KeepAlive(b)\n\treturn n, err\n}\n\nfunc (f *win32File) SetReadDeadline(deadline time.Time) error {\n\treturn f.readDeadline.set(deadline)\n}\n\nfunc (f *win32File) SetWriteDeadline(deadline time.Time) error {\n\treturn f.writeDeadline.set(deadline)\n}\n\nfunc (f *win32File) Flush() error {\n\treturn windows.FlushFileBuffers(f.handle)\n}\n\nfunc (f *win32File) Fd() uintptr {\n\treturn uintptr(f.handle)\n}\n\nfunc (d *deadlineHandler) set(deadline time.Time) error {\n\td.setLock.Lock()\n\tdefer d.setLock.Unlock()\n\n\tif d.timer != nil {\n\t\tif !d.timer.Stop() {\n\t\t\t<-d.channel\n\t\t}\n\t\td.timer = nil\n\t}\n\td.timedout.Store(false)\n\n\tselect {\n\tcase <-d.channel:\n\t\td.channelLock.Lock()\n\t\td.channel = make(chan struct{})\n\t\td.channelLock.Unlock()\n\tdefault:\n\t}\n\n\tif deadline.IsZero() {\n\t\treturn nil\n\t}\n\n\ttimeoutIO := func() {\n\t\td.timedout.Store(true)\n\t\tclose(d.channel)\n\t}\n\n\tnow := time.Now()\n\tduration := deadline.Sub(now)\n\tif deadline.After(now) {\n\t\t// Deadline is in the future, set a timer to wait\n\t\td.timer = time.AfterFunc(duration, timeoutIO)\n\t} else {\n\t\t// Deadline is in the past. Cancel all pending IO now.\n\t\ttimeoutIO()\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/fileinfo.go",
    "content": "//go:build windows\n// +build windows\n\npackage winio\n\nimport (\n\t\"os\"\n\t\"runtime\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\n// FileBasicInfo contains file access time and file attributes information.\ntype FileBasicInfo struct {\n\tCreationTime, LastAccessTime, LastWriteTime, ChangeTime windows.Filetime\n\tFileAttributes                                          uint32\n\t_                                                       uint32 // padding\n}\n\n// alignedFileBasicInfo is a FileBasicInfo, but aligned to uint64 by containing\n// uint64 rather than windows.Filetime. Filetime contains two uint32s. uint64\n// alignment is necessary to pass this as FILE_BASIC_INFO.\ntype alignedFileBasicInfo struct {\n\tCreationTime, LastAccessTime, LastWriteTime, ChangeTime uint64\n\tFileAttributes                                          uint32\n\t_                                                       uint32 // padding\n}\n\n// GetFileBasicInfo retrieves times and attributes for a file.\nfunc GetFileBasicInfo(f *os.File) (*FileBasicInfo, error) {\n\tbi := &alignedFileBasicInfo{}\n\tif err := windows.GetFileInformationByHandleEx(\n\t\twindows.Handle(f.Fd()),\n\t\twindows.FileBasicInfo,\n\t\t(*byte)(unsafe.Pointer(bi)),\n\t\tuint32(unsafe.Sizeof(*bi)),\n\t); err != nil {\n\t\treturn nil, &os.PathError{Op: \"GetFileInformationByHandleEx\", Path: f.Name(), Err: err}\n\t}\n\truntime.KeepAlive(f)\n\t// Reinterpret the alignedFileBasicInfo as a FileBasicInfo so it matches the\n\t// public API of this module. The data may be unnecessarily aligned.\n\treturn (*FileBasicInfo)(unsafe.Pointer(bi)), nil\n}\n\n// SetFileBasicInfo sets times and attributes for a file.\nfunc SetFileBasicInfo(f *os.File, bi *FileBasicInfo) error {\n\t// Create an alignedFileBasicInfo based on a FileBasicInfo. The copy is\n\t// suitable to pass to GetFileInformationByHandleEx.\n\tbiAligned := *(*alignedFileBasicInfo)(unsafe.Pointer(bi))\n\tif err := windows.SetFileInformationByHandle(\n\t\twindows.Handle(f.Fd()),\n\t\twindows.FileBasicInfo,\n\t\t(*byte)(unsafe.Pointer(&biAligned)),\n\t\tuint32(unsafe.Sizeof(biAligned)),\n\t); err != nil {\n\t\treturn &os.PathError{Op: \"SetFileInformationByHandle\", Path: f.Name(), Err: err}\n\t}\n\truntime.KeepAlive(f)\n\treturn nil\n}\n\n// FileStandardInfo contains extended information for the file.\n// FILE_STANDARD_INFO in WinBase.h\n// https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-file_standard_info\ntype FileStandardInfo struct {\n\tAllocationSize, EndOfFile int64\n\tNumberOfLinks             uint32\n\tDeletePending, Directory  bool\n}\n\n// GetFileStandardInfo retrieves ended information for the file.\nfunc GetFileStandardInfo(f *os.File) (*FileStandardInfo, error) {\n\tsi := &FileStandardInfo{}\n\tif err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()),\n\t\twindows.FileStandardInfo,\n\t\t(*byte)(unsafe.Pointer(si)),\n\t\tuint32(unsafe.Sizeof(*si))); err != nil {\n\t\treturn nil, &os.PathError{Op: \"GetFileInformationByHandleEx\", Path: f.Name(), Err: err}\n\t}\n\truntime.KeepAlive(f)\n\treturn si, nil\n}\n\n// FileIDInfo contains the volume serial number and file ID for a file. This pair should be\n// unique on a system.\ntype FileIDInfo struct {\n\tVolumeSerialNumber uint64\n\tFileID             [16]byte\n}\n\n// GetFileID retrieves the unique (volume, file ID) pair for a file.\nfunc GetFileID(f *os.File) (*FileIDInfo, error) {\n\tfileID := &FileIDInfo{}\n\tif err := windows.GetFileInformationByHandleEx(\n\t\twindows.Handle(f.Fd()),\n\t\twindows.FileIdInfo,\n\t\t(*byte)(unsafe.Pointer(fileID)),\n\t\tuint32(unsafe.Sizeof(*fileID)),\n\t); err != nil {\n\t\treturn nil, &os.PathError{Op: \"GetFileInformationByHandleEx\", Path: f.Name(), Err: err}\n\t}\n\truntime.KeepAlive(f)\n\treturn fileID, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/hvsock.go",
    "content": "//go:build windows\n// +build windows\n\npackage winio\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"os\"\n\t\"time\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n\n\t\"github.com/Microsoft/go-winio/internal/socket\"\n\t\"github.com/Microsoft/go-winio/pkg/guid\"\n)\n\nconst afHVSock = 34 // AF_HYPERV\n\n// Well known Service and VM IDs\n// https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/user-guide/make-integration-service#vmid-wildcards\n\n// HvsockGUIDWildcard is the wildcard VmId for accepting connections from all partitions.\nfunc HvsockGUIDWildcard() guid.GUID { // 00000000-0000-0000-0000-000000000000\n\treturn guid.GUID{}\n}\n\n// HvsockGUIDBroadcast is the wildcard VmId for broadcasting sends to all partitions.\nfunc HvsockGUIDBroadcast() guid.GUID { // ffffffff-ffff-ffff-ffff-ffffffffffff\n\treturn guid.GUID{\n\t\tData1: 0xffffffff,\n\t\tData2: 0xffff,\n\t\tData3: 0xffff,\n\t\tData4: [8]uint8{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},\n\t}\n}\n\n// HvsockGUIDLoopback is the Loopback VmId for accepting connections to the same partition as the connector.\nfunc HvsockGUIDLoopback() guid.GUID { // e0e16197-dd56-4a10-9195-5ee7a155a838\n\treturn guid.GUID{\n\t\tData1: 0xe0e16197,\n\t\tData2: 0xdd56,\n\t\tData3: 0x4a10,\n\t\tData4: [8]uint8{0x91, 0x95, 0x5e, 0xe7, 0xa1, 0x55, 0xa8, 0x38},\n\t}\n}\n\n// HvsockGUIDSiloHost is the address of a silo's host partition:\n//   - The silo host of a hosted silo is the utility VM.\n//   - The silo host of a silo on a physical host is the physical host.\nfunc HvsockGUIDSiloHost() guid.GUID { // 36bd0c5c-7276-4223-88ba-7d03b654c568\n\treturn guid.GUID{\n\t\tData1: 0x36bd0c5c,\n\t\tData2: 0x7276,\n\t\tData3: 0x4223,\n\t\tData4: [8]byte{0x88, 0xba, 0x7d, 0x03, 0xb6, 0x54, 0xc5, 0x68},\n\t}\n}\n\n// HvsockGUIDChildren is the wildcard VmId for accepting connections from the connector's child partitions.\nfunc HvsockGUIDChildren() guid.GUID { // 90db8b89-0d35-4f79-8ce9-49ea0ac8b7cd\n\treturn guid.GUID{\n\t\tData1: 0x90db8b89,\n\t\tData2: 0xd35,\n\t\tData3: 0x4f79,\n\t\tData4: [8]uint8{0x8c, 0xe9, 0x49, 0xea, 0xa, 0xc8, 0xb7, 0xcd},\n\t}\n}\n\n// HvsockGUIDParent is the wildcard VmId for accepting connections from the connector's parent partition.\n// Listening on this VmId accepts connection from:\n//   - Inside silos: silo host partition.\n//   - Inside hosted silo: host of the VM.\n//   - Inside VM: VM host.\n//   - Physical host: Not supported.\nfunc HvsockGUIDParent() guid.GUID { // a42e7cda-d03f-480c-9cc2-a4de20abb878\n\treturn guid.GUID{\n\t\tData1: 0xa42e7cda,\n\t\tData2: 0xd03f,\n\t\tData3: 0x480c,\n\t\tData4: [8]uint8{0x9c, 0xc2, 0xa4, 0xde, 0x20, 0xab, 0xb8, 0x78},\n\t}\n}\n\n// hvsockVsockServiceTemplate is the Service GUID used for the VSOCK protocol.\nfunc hvsockVsockServiceTemplate() guid.GUID { // 00000000-facb-11e6-bd58-64006a7986d3\n\treturn guid.GUID{\n\t\tData2: 0xfacb,\n\t\tData3: 0x11e6,\n\t\tData4: [8]uint8{0xbd, 0x58, 0x64, 0x00, 0x6a, 0x79, 0x86, 0xd3},\n\t}\n}\n\n// An HvsockAddr is an address for a AF_HYPERV socket.\ntype HvsockAddr struct {\n\tVMID      guid.GUID\n\tServiceID guid.GUID\n}\n\ntype rawHvsockAddr struct {\n\tFamily    uint16\n\t_         uint16\n\tVMID      guid.GUID\n\tServiceID guid.GUID\n}\n\nvar _ socket.RawSockaddr = &rawHvsockAddr{}\n\n// Network returns the address's network name, \"hvsock\".\nfunc (*HvsockAddr) Network() string {\n\treturn \"hvsock\"\n}\n\nfunc (addr *HvsockAddr) String() string {\n\treturn fmt.Sprintf(\"%s:%s\", &addr.VMID, &addr.ServiceID)\n}\n\n// VsockServiceID returns an hvsock service ID corresponding to the specified AF_VSOCK port.\nfunc VsockServiceID(port uint32) guid.GUID {\n\tg := hvsockVsockServiceTemplate() // make a copy\n\tg.Data1 = port\n\treturn g\n}\n\nfunc (addr *HvsockAddr) raw() rawHvsockAddr {\n\treturn rawHvsockAddr{\n\t\tFamily:    afHVSock,\n\t\tVMID:      addr.VMID,\n\t\tServiceID: addr.ServiceID,\n\t}\n}\n\nfunc (addr *HvsockAddr) fromRaw(raw *rawHvsockAddr) {\n\taddr.VMID = raw.VMID\n\taddr.ServiceID = raw.ServiceID\n}\n\n// Sockaddr returns a pointer to and the size of this struct.\n//\n// Implements the [socket.RawSockaddr] interface, and allows use in\n// [socket.Bind] and [socket.ConnectEx].\nfunc (r *rawHvsockAddr) Sockaddr() (unsafe.Pointer, int32, error) {\n\treturn unsafe.Pointer(r), int32(unsafe.Sizeof(rawHvsockAddr{})), nil\n}\n\n// Sockaddr interface allows use with `sockets.Bind()` and `.ConnectEx()`.\nfunc (r *rawHvsockAddr) FromBytes(b []byte) error {\n\tn := int(unsafe.Sizeof(rawHvsockAddr{}))\n\n\tif len(b) < n {\n\t\treturn fmt.Errorf(\"got %d, want %d: %w\", len(b), n, socket.ErrBufferSize)\n\t}\n\n\tcopy(unsafe.Slice((*byte)(unsafe.Pointer(r)), n), b[:n])\n\tif r.Family != afHVSock {\n\t\treturn fmt.Errorf(\"got %d, want %d: %w\", r.Family, afHVSock, socket.ErrAddrFamily)\n\t}\n\n\treturn nil\n}\n\n// HvsockListener is a socket listener for the AF_HYPERV address family.\ntype HvsockListener struct {\n\tsock *win32File\n\taddr HvsockAddr\n}\n\nvar _ net.Listener = &HvsockListener{}\n\n// HvsockConn is a connected socket of the AF_HYPERV address family.\ntype HvsockConn struct {\n\tsock          *win32File\n\tlocal, remote HvsockAddr\n}\n\nvar _ net.Conn = &HvsockConn{}\n\nfunc newHVSocket() (*win32File, error) {\n\tfd, err := windows.Socket(afHVSock, windows.SOCK_STREAM, 1)\n\tif err != nil {\n\t\treturn nil, os.NewSyscallError(\"socket\", err)\n\t}\n\tf, err := makeWin32File(fd)\n\tif err != nil {\n\t\twindows.Close(fd)\n\t\treturn nil, err\n\t}\n\tf.socket = true\n\treturn f, nil\n}\n\n// ListenHvsock listens for connections on the specified hvsock address.\nfunc ListenHvsock(addr *HvsockAddr) (_ *HvsockListener, err error) {\n\tl := &HvsockListener{addr: *addr}\n\n\tvar sock *win32File\n\tsock, err = newHVSocket()\n\tif err != nil {\n\t\treturn nil, l.opErr(\"listen\", err)\n\t}\n\tdefer func() {\n\t\tif err != nil {\n\t\t\t_ = sock.Close()\n\t\t}\n\t}()\n\n\tsa := addr.raw()\n\terr = socket.Bind(sock.handle, &sa)\n\tif err != nil {\n\t\treturn nil, l.opErr(\"listen\", os.NewSyscallError(\"socket\", err))\n\t}\n\terr = windows.Listen(sock.handle, 16)\n\tif err != nil {\n\t\treturn nil, l.opErr(\"listen\", os.NewSyscallError(\"listen\", err))\n\t}\n\treturn &HvsockListener{sock: sock, addr: *addr}, nil\n}\n\nfunc (l *HvsockListener) opErr(op string, err error) error {\n\treturn &net.OpError{Op: op, Net: \"hvsock\", Addr: &l.addr, Err: err}\n}\n\n// Addr returns the listener's network address.\nfunc (l *HvsockListener) Addr() net.Addr {\n\treturn &l.addr\n}\n\n// Accept waits for the next connection and returns it.\nfunc (l *HvsockListener) Accept() (_ net.Conn, err error) {\n\tsock, err := newHVSocket()\n\tif err != nil {\n\t\treturn nil, l.opErr(\"accept\", err)\n\t}\n\tdefer func() {\n\t\tif sock != nil {\n\t\t\tsock.Close()\n\t\t}\n\t}()\n\tc, err := l.sock.prepareIO()\n\tif err != nil {\n\t\treturn nil, l.opErr(\"accept\", err)\n\t}\n\tdefer l.sock.wg.Done()\n\n\t// AcceptEx, per documentation, requires an extra 16 bytes per address.\n\t//\n\t// https://docs.microsoft.com/en-us/windows/win32/api/mswsock/nf-mswsock-acceptex\n\tconst addrlen = uint32(16 + unsafe.Sizeof(rawHvsockAddr{}))\n\tvar addrbuf [addrlen * 2]byte\n\n\tvar bytes uint32\n\terr = windows.AcceptEx(l.sock.handle, sock.handle, &addrbuf[0], 0 /* rxdatalen */, addrlen, addrlen, &bytes, &c.o)\n\tif _, err = l.sock.asyncIO(c, nil, bytes, err); err != nil {\n\t\treturn nil, l.opErr(\"accept\", os.NewSyscallError(\"acceptex\", err))\n\t}\n\n\tconn := &HvsockConn{\n\t\tsock: sock,\n\t}\n\t// The local address returned in the AcceptEx buffer is the same as the Listener socket's\n\t// address. However, the service GUID reported by GetSockName is different from the Listeners\n\t// socket, and is sometimes the same as the local address of the socket that dialed the\n\t// address, with the service GUID.Data1 incremented, but othertimes is different.\n\t// todo: does the local address matter? is the listener's address or the actual address appropriate?\n\tconn.local.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[0])))\n\tconn.remote.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[addrlen])))\n\n\t// initialize the accepted socket and update its properties with those of the listening socket\n\tif err = windows.Setsockopt(sock.handle,\n\t\twindows.SOL_SOCKET, windows.SO_UPDATE_ACCEPT_CONTEXT,\n\t\t(*byte)(unsafe.Pointer(&l.sock.handle)), int32(unsafe.Sizeof(l.sock.handle))); err != nil {\n\t\treturn nil, conn.opErr(\"accept\", os.NewSyscallError(\"setsockopt\", err))\n\t}\n\n\tsock = nil\n\treturn conn, nil\n}\n\n// Close closes the listener, causing any pending Accept calls to fail.\nfunc (l *HvsockListener) Close() error {\n\treturn l.sock.Close()\n}\n\n// HvsockDialer configures and dials a Hyper-V Socket (ie, [HvsockConn]).\ntype HvsockDialer struct {\n\t// Deadline is the time the Dial operation must connect before erroring.\n\tDeadline time.Time\n\n\t// Retries is the number of additional connects to try if the connection times out, is refused,\n\t// or the host is unreachable\n\tRetries uint\n\n\t// RetryWait is the time to wait after a connection error to retry\n\tRetryWait time.Duration\n\n\trt *time.Timer // redial wait timer\n}\n\n// Dial the Hyper-V socket at addr.\n//\n// See [HvsockDialer.Dial] for more information.\nfunc Dial(ctx context.Context, addr *HvsockAddr) (conn *HvsockConn, err error) {\n\treturn (&HvsockDialer{}).Dial(ctx, addr)\n}\n\n// Dial attempts to connect to the Hyper-V socket at addr, and returns a connection if successful.\n// Will attempt (HvsockDialer).Retries if dialing fails, waiting (HvsockDialer).RetryWait between\n// retries.\n//\n// Dialing can be cancelled either by providing (HvsockDialer).Deadline, or cancelling ctx.\nfunc (d *HvsockDialer) Dial(ctx context.Context, addr *HvsockAddr) (conn *HvsockConn, err error) {\n\top := \"dial\"\n\t// create the conn early to use opErr()\n\tconn = &HvsockConn{\n\t\tremote: *addr,\n\t}\n\n\tif !d.Deadline.IsZero() {\n\t\tvar cancel context.CancelFunc\n\t\tctx, cancel = context.WithDeadline(ctx, d.Deadline)\n\t\tdefer cancel()\n\t}\n\n\t// preemptive timeout/cancellation check\n\tif err = ctx.Err(); err != nil {\n\t\treturn nil, conn.opErr(op, err)\n\t}\n\n\tsock, err := newHVSocket()\n\tif err != nil {\n\t\treturn nil, conn.opErr(op, err)\n\t}\n\tdefer func() {\n\t\tif sock != nil {\n\t\t\tsock.Close()\n\t\t}\n\t}()\n\n\tsa := addr.raw()\n\terr = socket.Bind(sock.handle, &sa)\n\tif err != nil {\n\t\treturn nil, conn.opErr(op, os.NewSyscallError(\"bind\", err))\n\t}\n\n\tc, err := sock.prepareIO()\n\tif err != nil {\n\t\treturn nil, conn.opErr(op, err)\n\t}\n\tdefer sock.wg.Done()\n\tvar bytes uint32\n\tfor i := uint(0); i <= d.Retries; i++ {\n\t\terr = socket.ConnectEx(\n\t\t\tsock.handle,\n\t\t\t&sa,\n\t\t\tnil, // sendBuf\n\t\t\t0,   // sendDataLen\n\t\t\t&bytes,\n\t\t\t(*windows.Overlapped)(unsafe.Pointer(&c.o)))\n\t\t_, err = sock.asyncIO(c, nil, bytes, err)\n\t\tif i < d.Retries && canRedial(err) {\n\t\t\tif err = d.redialWait(ctx); err == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tbreak\n\t}\n\tif err != nil {\n\t\treturn nil, conn.opErr(op, os.NewSyscallError(\"connectex\", err))\n\t}\n\n\t// update the connection properties, so shutdown can be used\n\tif err = windows.Setsockopt(\n\t\tsock.handle,\n\t\twindows.SOL_SOCKET,\n\t\twindows.SO_UPDATE_CONNECT_CONTEXT,\n\t\tnil, // optvalue\n\t\t0,   // optlen\n\t); err != nil {\n\t\treturn nil, conn.opErr(op, os.NewSyscallError(\"setsockopt\", err))\n\t}\n\n\t// get the local name\n\tvar sal rawHvsockAddr\n\terr = socket.GetSockName(sock.handle, &sal)\n\tif err != nil {\n\t\treturn nil, conn.opErr(op, os.NewSyscallError(\"getsockname\", err))\n\t}\n\tconn.local.fromRaw(&sal)\n\n\t// one last check for timeout, since asyncIO doesn't check the context\n\tif err = ctx.Err(); err != nil {\n\t\treturn nil, conn.opErr(op, err)\n\t}\n\n\tconn.sock = sock\n\tsock = nil\n\n\treturn conn, nil\n}\n\n// redialWait waits before attempting to redial, resetting the timer as appropriate.\nfunc (d *HvsockDialer) redialWait(ctx context.Context) (err error) {\n\tif d.RetryWait == 0 {\n\t\treturn nil\n\t}\n\n\tif d.rt == nil {\n\t\td.rt = time.NewTimer(d.RetryWait)\n\t} else {\n\t\t// should already be stopped and drained\n\t\td.rt.Reset(d.RetryWait)\n\t}\n\n\tselect {\n\tcase <-ctx.Done():\n\tcase <-d.rt.C:\n\t\treturn nil\n\t}\n\n\t// stop and drain the timer\n\tif !d.rt.Stop() {\n\t\t<-d.rt.C\n\t}\n\treturn ctx.Err()\n}\n\n// assumes error is a plain, unwrapped windows.Errno provided by direct syscall.\nfunc canRedial(err error) bool {\n\t//nolint:errorlint // guaranteed to be an Errno\n\tswitch err {\n\tcase windows.WSAECONNREFUSED, windows.WSAENETUNREACH, windows.WSAETIMEDOUT,\n\t\twindows.ERROR_CONNECTION_REFUSED, windows.ERROR_CONNECTION_UNAVAIL:\n\t\treturn true\n\tdefault:\n\t\treturn false\n\t}\n}\n\nfunc (conn *HvsockConn) opErr(op string, err error) error {\n\t// translate from \"file closed\" to \"socket closed\"\n\tif errors.Is(err, ErrFileClosed) {\n\t\terr = socket.ErrSocketClosed\n\t}\n\treturn &net.OpError{Op: op, Net: \"hvsock\", Source: &conn.local, Addr: &conn.remote, Err: err}\n}\n\nfunc (conn *HvsockConn) Read(b []byte) (int, error) {\n\tc, err := conn.sock.prepareIO()\n\tif err != nil {\n\t\treturn 0, conn.opErr(\"read\", err)\n\t}\n\tdefer conn.sock.wg.Done()\n\tbuf := windows.WSABuf{Buf: &b[0], Len: uint32(len(b))}\n\tvar flags, bytes uint32\n\terr = windows.WSARecv(conn.sock.handle, &buf, 1, &bytes, &flags, &c.o, nil)\n\tn, err := conn.sock.asyncIO(c, &conn.sock.readDeadline, bytes, err)\n\tif err != nil {\n\t\tvar eno windows.Errno\n\t\tif errors.As(err, &eno) {\n\t\t\terr = os.NewSyscallError(\"wsarecv\", eno)\n\t\t}\n\t\treturn 0, conn.opErr(\"read\", err)\n\t} else if n == 0 {\n\t\terr = io.EOF\n\t}\n\treturn n, err\n}\n\nfunc (conn *HvsockConn) Write(b []byte) (int, error) {\n\tt := 0\n\tfor len(b) != 0 {\n\t\tn, err := conn.write(b)\n\t\tif err != nil {\n\t\t\treturn t + n, err\n\t\t}\n\t\tt += n\n\t\tb = b[n:]\n\t}\n\treturn t, nil\n}\n\nfunc (conn *HvsockConn) write(b []byte) (int, error) {\n\tc, err := conn.sock.prepareIO()\n\tif err != nil {\n\t\treturn 0, conn.opErr(\"write\", err)\n\t}\n\tdefer conn.sock.wg.Done()\n\tbuf := windows.WSABuf{Buf: &b[0], Len: uint32(len(b))}\n\tvar bytes uint32\n\terr = windows.WSASend(conn.sock.handle, &buf, 1, &bytes, 0, &c.o, nil)\n\tn, err := conn.sock.asyncIO(c, &conn.sock.writeDeadline, bytes, err)\n\tif err != nil {\n\t\tvar eno windows.Errno\n\t\tif errors.As(err, &eno) {\n\t\t\terr = os.NewSyscallError(\"wsasend\", eno)\n\t\t}\n\t\treturn 0, conn.opErr(\"write\", err)\n\t}\n\treturn n, err\n}\n\n// Close closes the socket connection, failing any pending read or write calls.\nfunc (conn *HvsockConn) Close() error {\n\treturn conn.sock.Close()\n}\n\nfunc (conn *HvsockConn) IsClosed() bool {\n\treturn conn.sock.IsClosed()\n}\n\n// shutdown disables sending or receiving on a socket.\nfunc (conn *HvsockConn) shutdown(how int) error {\n\tif conn.IsClosed() {\n\t\treturn socket.ErrSocketClosed\n\t}\n\n\terr := windows.Shutdown(conn.sock.handle, how)\n\tif err != nil {\n\t\t// If the connection was closed, shutdowns fail with \"not connected\"\n\t\tif errors.Is(err, windows.WSAENOTCONN) ||\n\t\t\terrors.Is(err, windows.WSAESHUTDOWN) {\n\t\t\terr = socket.ErrSocketClosed\n\t\t}\n\t\treturn os.NewSyscallError(\"shutdown\", err)\n\t}\n\treturn nil\n}\n\n// CloseRead shuts down the read end of the socket, preventing future read operations.\nfunc (conn *HvsockConn) CloseRead() error {\n\terr := conn.shutdown(windows.SHUT_RD)\n\tif err != nil {\n\t\treturn conn.opErr(\"closeread\", err)\n\t}\n\treturn nil\n}\n\n// CloseWrite shuts down the write end of the socket, preventing future write operations and\n// notifying the other endpoint that no more data will be written.\nfunc (conn *HvsockConn) CloseWrite() error {\n\terr := conn.shutdown(windows.SHUT_WR)\n\tif err != nil {\n\t\treturn conn.opErr(\"closewrite\", err)\n\t}\n\treturn nil\n}\n\n// LocalAddr returns the local address of the connection.\nfunc (conn *HvsockConn) LocalAddr() net.Addr {\n\treturn &conn.local\n}\n\n// RemoteAddr returns the remote address of the connection.\nfunc (conn *HvsockConn) RemoteAddr() net.Addr {\n\treturn &conn.remote\n}\n\n// SetDeadline implements the net.Conn SetDeadline method.\nfunc (conn *HvsockConn) SetDeadline(t time.Time) error {\n\t// todo: implement `SetDeadline` for `win32File`\n\tif err := conn.SetReadDeadline(t); err != nil {\n\t\treturn fmt.Errorf(\"set read deadline: %w\", err)\n\t}\n\tif err := conn.SetWriteDeadline(t); err != nil {\n\t\treturn fmt.Errorf(\"set write deadline: %w\", err)\n\t}\n\treturn nil\n}\n\n// SetReadDeadline implements the net.Conn SetReadDeadline method.\nfunc (conn *HvsockConn) SetReadDeadline(t time.Time) error {\n\treturn conn.sock.SetReadDeadline(t)\n}\n\n// SetWriteDeadline implements the net.Conn SetWriteDeadline method.\nfunc (conn *HvsockConn) SetWriteDeadline(t time.Time) error {\n\treturn conn.sock.SetWriteDeadline(t)\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/internal/fs/doc.go",
    "content": "// This package contains Win32 filesystem functionality.\npackage fs\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/internal/fs/fs.go",
    "content": "//go:build windows\n\npackage fs\n\nimport (\n\t\"golang.org/x/sys/windows\"\n\n\t\"github.com/Microsoft/go-winio/internal/stringbuffer\"\n)\n\n//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go fs.go\n\n// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew\n//sys CreateFile(name string, access AccessMask, mode FileShareMode, sa *windows.SecurityAttributes, createmode FileCreationDisposition, attrs FileFlagOrAttribute, templatefile windows.Handle) (handle windows.Handle, err error) [failretval==windows.InvalidHandle] = CreateFileW\n\nconst NullHandle windows.Handle = 0\n\n// AccessMask defines standard, specific, and generic rights.\n//\n// Used with CreateFile and NtCreateFile (and co.).\n//\n//\tBitmask:\n//\t 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1\n//\t 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0\n//\t+---------------+---------------+-------------------------------+\n//\t|G|G|G|G|Resvd|A| StandardRights|         SpecificRights        |\n//\t|R|W|E|A|     |S|               |                               |\n//\t+-+-------------+---------------+-------------------------------+\n//\n//\tGR     Generic Read\n//\tGW     Generic Write\n//\tGE     Generic Exectue\n//\tGA     Generic All\n//\tResvd  Reserved\n//\tAS     Access Security System\n//\n// https://learn.microsoft.com/en-us/windows/win32/secauthz/access-mask\n//\n// https://learn.microsoft.com/en-us/windows/win32/secauthz/generic-access-rights\n//\n// https://learn.microsoft.com/en-us/windows/win32/fileio/file-access-rights-constants\ntype AccessMask = windows.ACCESS_MASK\n\n//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.\nconst (\n\t// Not actually any.\n\t//\n\t// For CreateFile: \"query certain metadata such as file, directory, or device attributes without accessing that file or device\"\n\t// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew#parameters\n\tFILE_ANY_ACCESS AccessMask = 0\n\n\tGENERIC_READ           AccessMask = 0x8000_0000\n\tGENERIC_WRITE          AccessMask = 0x4000_0000\n\tGENERIC_EXECUTE        AccessMask = 0x2000_0000\n\tGENERIC_ALL            AccessMask = 0x1000_0000\n\tACCESS_SYSTEM_SECURITY AccessMask = 0x0100_0000\n\n\t// Specific Object Access\n\t// from ntioapi.h\n\n\tFILE_READ_DATA      AccessMask = (0x0001) // file & pipe\n\tFILE_LIST_DIRECTORY AccessMask = (0x0001) // directory\n\n\tFILE_WRITE_DATA AccessMask = (0x0002) // file & pipe\n\tFILE_ADD_FILE   AccessMask = (0x0002) // directory\n\n\tFILE_APPEND_DATA          AccessMask = (0x0004) // file\n\tFILE_ADD_SUBDIRECTORY     AccessMask = (0x0004) // directory\n\tFILE_CREATE_PIPE_INSTANCE AccessMask = (0x0004) // named pipe\n\n\tFILE_READ_EA         AccessMask = (0x0008) // file & directory\n\tFILE_READ_PROPERTIES AccessMask = FILE_READ_EA\n\n\tFILE_WRITE_EA         AccessMask = (0x0010) // file & directory\n\tFILE_WRITE_PROPERTIES AccessMask = FILE_WRITE_EA\n\n\tFILE_EXECUTE  AccessMask = (0x0020) // file\n\tFILE_TRAVERSE AccessMask = (0x0020) // directory\n\n\tFILE_DELETE_CHILD AccessMask = (0x0040) // directory\n\n\tFILE_READ_ATTRIBUTES AccessMask = (0x0080) // all\n\n\tFILE_WRITE_ATTRIBUTES AccessMask = (0x0100) // all\n\n\tFILE_ALL_ACCESS      AccessMask = (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)\n\tFILE_GENERIC_READ    AccessMask = (STANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE)\n\tFILE_GENERIC_WRITE   AccessMask = (STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA | SYNCHRONIZE)\n\tFILE_GENERIC_EXECUTE AccessMask = (STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES | FILE_EXECUTE | SYNCHRONIZE)\n\n\tSPECIFIC_RIGHTS_ALL AccessMask = 0x0000FFFF\n\n\t// Standard Access\n\t// from ntseapi.h\n\n\tDELETE       AccessMask = 0x0001_0000\n\tREAD_CONTROL AccessMask = 0x0002_0000\n\tWRITE_DAC    AccessMask = 0x0004_0000\n\tWRITE_OWNER  AccessMask = 0x0008_0000\n\tSYNCHRONIZE  AccessMask = 0x0010_0000\n\n\tSTANDARD_RIGHTS_REQUIRED AccessMask = 0x000F_0000\n\n\tSTANDARD_RIGHTS_READ    AccessMask = READ_CONTROL\n\tSTANDARD_RIGHTS_WRITE   AccessMask = READ_CONTROL\n\tSTANDARD_RIGHTS_EXECUTE AccessMask = READ_CONTROL\n\n\tSTANDARD_RIGHTS_ALL AccessMask = 0x001F_0000\n)\n\ntype FileShareMode uint32\n\n//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.\nconst (\n\tFILE_SHARE_NONE        FileShareMode = 0x00\n\tFILE_SHARE_READ        FileShareMode = 0x01\n\tFILE_SHARE_WRITE       FileShareMode = 0x02\n\tFILE_SHARE_DELETE      FileShareMode = 0x04\n\tFILE_SHARE_VALID_FLAGS FileShareMode = 0x07\n)\n\ntype FileCreationDisposition uint32\n\n//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.\nconst (\n\t// from winbase.h\n\n\tCREATE_NEW        FileCreationDisposition = 0x01\n\tCREATE_ALWAYS     FileCreationDisposition = 0x02\n\tOPEN_EXISTING     FileCreationDisposition = 0x03\n\tOPEN_ALWAYS       FileCreationDisposition = 0x04\n\tTRUNCATE_EXISTING FileCreationDisposition = 0x05\n)\n\n// Create disposition values for NtCreate*\ntype NTFileCreationDisposition uint32\n\n//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.\nconst (\n\t// From ntioapi.h\n\n\tFILE_SUPERSEDE           NTFileCreationDisposition = 0x00\n\tFILE_OPEN                NTFileCreationDisposition = 0x01\n\tFILE_CREATE              NTFileCreationDisposition = 0x02\n\tFILE_OPEN_IF             NTFileCreationDisposition = 0x03\n\tFILE_OVERWRITE           NTFileCreationDisposition = 0x04\n\tFILE_OVERWRITE_IF        NTFileCreationDisposition = 0x05\n\tFILE_MAXIMUM_DISPOSITION NTFileCreationDisposition = 0x05\n)\n\n// CreateFile and co. take flags or attributes together as one parameter.\n// Define alias until we can use generics to allow both\n//\n// https://learn.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants\ntype FileFlagOrAttribute uint32\n\n//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.\nconst (\n\t// from winnt.h\n\n\tFILE_FLAG_WRITE_THROUGH       FileFlagOrAttribute = 0x8000_0000\n\tFILE_FLAG_OVERLAPPED          FileFlagOrAttribute = 0x4000_0000\n\tFILE_FLAG_NO_BUFFERING        FileFlagOrAttribute = 0x2000_0000\n\tFILE_FLAG_RANDOM_ACCESS       FileFlagOrAttribute = 0x1000_0000\n\tFILE_FLAG_SEQUENTIAL_SCAN     FileFlagOrAttribute = 0x0800_0000\n\tFILE_FLAG_DELETE_ON_CLOSE     FileFlagOrAttribute = 0x0400_0000\n\tFILE_FLAG_BACKUP_SEMANTICS    FileFlagOrAttribute = 0x0200_0000\n\tFILE_FLAG_POSIX_SEMANTICS     FileFlagOrAttribute = 0x0100_0000\n\tFILE_FLAG_OPEN_REPARSE_POINT  FileFlagOrAttribute = 0x0020_0000\n\tFILE_FLAG_OPEN_NO_RECALL      FileFlagOrAttribute = 0x0010_0000\n\tFILE_FLAG_FIRST_PIPE_INSTANCE FileFlagOrAttribute = 0x0008_0000\n)\n\n// NtCreate* functions take a dedicated CreateOptions parameter.\n//\n// https://learn.microsoft.com/en-us/windows/win32/api/Winternl/nf-winternl-ntcreatefile\n//\n// https://learn.microsoft.com/en-us/windows/win32/devnotes/nt-create-named-pipe-file\ntype NTCreateOptions uint32\n\n//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.\nconst (\n\t// From ntioapi.h\n\n\tFILE_DIRECTORY_FILE            NTCreateOptions = 0x0000_0001\n\tFILE_WRITE_THROUGH             NTCreateOptions = 0x0000_0002\n\tFILE_SEQUENTIAL_ONLY           NTCreateOptions = 0x0000_0004\n\tFILE_NO_INTERMEDIATE_BUFFERING NTCreateOptions = 0x0000_0008\n\n\tFILE_SYNCHRONOUS_IO_ALERT    NTCreateOptions = 0x0000_0010\n\tFILE_SYNCHRONOUS_IO_NONALERT NTCreateOptions = 0x0000_0020\n\tFILE_NON_DIRECTORY_FILE      NTCreateOptions = 0x0000_0040\n\tFILE_CREATE_TREE_CONNECTION  NTCreateOptions = 0x0000_0080\n\n\tFILE_COMPLETE_IF_OPLOCKED NTCreateOptions = 0x0000_0100\n\tFILE_NO_EA_KNOWLEDGE      NTCreateOptions = 0x0000_0200\n\tFILE_DISABLE_TUNNELING    NTCreateOptions = 0x0000_0400\n\tFILE_RANDOM_ACCESS        NTCreateOptions = 0x0000_0800\n\n\tFILE_DELETE_ON_CLOSE        NTCreateOptions = 0x0000_1000\n\tFILE_OPEN_BY_FILE_ID        NTCreateOptions = 0x0000_2000\n\tFILE_OPEN_FOR_BACKUP_INTENT NTCreateOptions = 0x0000_4000\n\tFILE_NO_COMPRESSION         NTCreateOptions = 0x0000_8000\n)\n\ntype FileSQSFlag = FileFlagOrAttribute\n\n//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.\nconst (\n\t// from winbase.h\n\n\tSECURITY_ANONYMOUS      FileSQSFlag = FileSQSFlag(SecurityAnonymous << 16)\n\tSECURITY_IDENTIFICATION FileSQSFlag = FileSQSFlag(SecurityIdentification << 16)\n\tSECURITY_IMPERSONATION  FileSQSFlag = FileSQSFlag(SecurityImpersonation << 16)\n\tSECURITY_DELEGATION     FileSQSFlag = FileSQSFlag(SecurityDelegation << 16)\n\n\tSECURITY_SQOS_PRESENT     FileSQSFlag = 0x0010_0000\n\tSECURITY_VALID_SQOS_FLAGS FileSQSFlag = 0x001F_0000\n)\n\n// GetFinalPathNameByHandle flags\n//\n// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfinalpathnamebyhandlew#parameters\ntype GetFinalPathFlag uint32\n\n//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.\nconst (\n\tGetFinalPathDefaultFlag GetFinalPathFlag = 0x0\n\n\tFILE_NAME_NORMALIZED GetFinalPathFlag = 0x0\n\tFILE_NAME_OPENED     GetFinalPathFlag = 0x8\n\n\tVOLUME_NAME_DOS  GetFinalPathFlag = 0x0\n\tVOLUME_NAME_GUID GetFinalPathFlag = 0x1\n\tVOLUME_NAME_NT   GetFinalPathFlag = 0x2\n\tVOLUME_NAME_NONE GetFinalPathFlag = 0x4\n)\n\n// getFinalPathNameByHandle facilitates calling the Windows API GetFinalPathNameByHandle\n// with the given handle and flags. It transparently takes care of creating a buffer of the\n// correct size for the call.\n//\n// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfinalpathnamebyhandlew\nfunc GetFinalPathNameByHandle(h windows.Handle, flags GetFinalPathFlag) (string, error) {\n\tb := stringbuffer.NewWString()\n\t//TODO: can loop infinitely if Win32 keeps returning the same (or a larger) n?\n\tfor {\n\t\tn, err := windows.GetFinalPathNameByHandle(h, b.Pointer(), b.Cap(), uint32(flags))\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\t// If the buffer wasn't large enough, n will be the total size needed (including null terminator).\n\t\t// Resize and try again.\n\t\tif n > b.Cap() {\n\t\t\tb.ResizeTo(n)\n\t\t\tcontinue\n\t\t}\n\t\t// If the buffer is large enough, n will be the size not including the null terminator.\n\t\t// Convert to a Go string and return.\n\t\treturn b.String(), nil\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/internal/fs/security.go",
    "content": "package fs\n\n// https://learn.microsoft.com/en-us/windows/win32/api/winnt/ne-winnt-security_impersonation_level\ntype SecurityImpersonationLevel int32 // C default enums underlying type is `int`, which is Go `int32`\n\n// Impersonation levels\nconst (\n\tSecurityAnonymous      SecurityImpersonationLevel = 0\n\tSecurityIdentification SecurityImpersonationLevel = 1\n\tSecurityImpersonation  SecurityImpersonationLevel = 2\n\tSecurityDelegation     SecurityImpersonationLevel = 3\n)\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go",
    "content": "//go:build windows\n\n// Code generated by 'go generate' using \"github.com/Microsoft/go-winio/tools/mkwinsyscall\"; DO NOT EDIT.\n\npackage fs\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\nvar _ unsafe.Pointer\n\n// Do the interface allocations only once for common\n// Errno values.\nconst (\n\terrnoERROR_IO_PENDING = 997\n)\n\nvar (\n\terrERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)\n\terrERROR_EINVAL     error = syscall.EINVAL\n)\n\n// errnoErr returns common boxed Errno values, to prevent\n// allocations at runtime.\nfunc errnoErr(e syscall.Errno) error {\n\tswitch e {\n\tcase 0:\n\t\treturn errERROR_EINVAL\n\tcase errnoERROR_IO_PENDING:\n\t\treturn errERROR_IO_PENDING\n\t}\n\treturn e\n}\n\nvar (\n\tmodkernel32 = windows.NewLazySystemDLL(\"kernel32.dll\")\n\n\tprocCreateFileW = modkernel32.NewProc(\"CreateFileW\")\n)\n\nfunc CreateFile(name string, access AccessMask, mode FileShareMode, sa *windows.SecurityAttributes, createmode FileCreationDisposition, attrs FileFlagOrAttribute, templatefile windows.Handle) (handle windows.Handle, err error) {\n\tvar _p0 *uint16\n\t_p0, err = syscall.UTF16PtrFromString(name)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn _CreateFile(_p0, access, mode, sa, createmode, attrs, templatefile)\n}\n\nfunc _CreateFile(name *uint16, access AccessMask, mode FileShareMode, sa *windows.SecurityAttributes, createmode FileCreationDisposition, attrs FileFlagOrAttribute, templatefile windows.Handle) (handle windows.Handle, err error) {\n\tr0, _, e1 := syscall.SyscallN(procCreateFileW.Addr(), uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile))\n\thandle = windows.Handle(r0)\n\tif handle == windows.InvalidHandle {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/internal/socket/rawaddr.go",
    "content": "package socket\n\nimport (\n\t\"unsafe\"\n)\n\n// RawSockaddr allows structs to be used with [Bind] and [ConnectEx]. The\n// struct must meet the Win32 sockaddr requirements specified here:\n// https://docs.microsoft.com/en-us/windows/win32/winsock/sockaddr-2\n//\n// Specifically, the struct size must be least larger than an int16 (unsigned short)\n// for the address family.\ntype RawSockaddr interface {\n\t// Sockaddr returns a pointer to the RawSockaddr and its struct size, allowing\n\t// for the RawSockaddr's data to be overwritten by syscalls (if necessary).\n\t//\n\t// It is the callers responsibility to validate that the values are valid; invalid\n\t// pointers or size can cause a panic.\n\tSockaddr() (unsafe.Pointer, int32, error)\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/internal/socket/socket.go",
    "content": "//go:build windows\n\npackage socket\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"sync\"\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"github.com/Microsoft/go-winio/pkg/guid\"\n\t\"golang.org/x/sys/windows\"\n)\n\n//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go socket.go\n\n//sys getsockname(s windows.Handle, name unsafe.Pointer, namelen *int32) (err error) [failretval==socketError] = ws2_32.getsockname\n//sys getpeername(s windows.Handle, name unsafe.Pointer, namelen *int32) (err error) [failretval==socketError] = ws2_32.getpeername\n//sys bind(s windows.Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socketError] = ws2_32.bind\n\nconst socketError = uintptr(^uint32(0))\n\nvar (\n\t// todo(helsaawy): create custom error types to store the desired vs actual size and addr family?\n\n\tErrBufferSize     = errors.New(\"buffer size\")\n\tErrAddrFamily     = errors.New(\"address family\")\n\tErrInvalidPointer = errors.New(\"invalid pointer\")\n\tErrSocketClosed   = fmt.Errorf(\"socket closed: %w\", net.ErrClosed)\n)\n\n// todo(helsaawy): replace these with generics, ie: GetSockName[S RawSockaddr](s windows.Handle) (S, error)\n\n// GetSockName writes the local address of socket s to the [RawSockaddr] rsa.\n// If rsa is not large enough, the [windows.WSAEFAULT] is returned.\nfunc GetSockName(s windows.Handle, rsa RawSockaddr) error {\n\tptr, l, err := rsa.Sockaddr()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"could not retrieve socket pointer and size: %w\", err)\n\t}\n\n\t// although getsockname returns WSAEFAULT if the buffer is too small, it does not set\n\t// &l to the correct size, so--apart from doubling the buffer repeatedly--there is no remedy\n\treturn getsockname(s, ptr, &l)\n}\n\n// GetPeerName returns the remote address the socket is connected to.\n//\n// See [GetSockName] for more information.\nfunc GetPeerName(s windows.Handle, rsa RawSockaddr) error {\n\tptr, l, err := rsa.Sockaddr()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"could not retrieve socket pointer and size: %w\", err)\n\t}\n\n\treturn getpeername(s, ptr, &l)\n}\n\nfunc Bind(s windows.Handle, rsa RawSockaddr) (err error) {\n\tptr, l, err := rsa.Sockaddr()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"could not retrieve socket pointer and size: %w\", err)\n\t}\n\n\treturn bind(s, ptr, l)\n}\n\n// \"golang.org/x/sys/windows\".ConnectEx and .Bind only accept internal implementations of the\n// their sockaddr interface, so they cannot be used with HvsockAddr\n// Replicate functionality here from\n// https://cs.opensource.google/go/x/sys/+/master:windows/syscall_windows.go\n\n// The function pointers to `AcceptEx`, `ConnectEx` and `GetAcceptExSockaddrs` must be loaded at\n// runtime via a WSAIoctl call:\n// https://docs.microsoft.com/en-us/windows/win32/api/Mswsock/nc-mswsock-lpfn_connectex#remarks\n\ntype runtimeFunc struct {\n\tid   guid.GUID\n\tonce sync.Once\n\taddr uintptr\n\terr  error\n}\n\nfunc (f *runtimeFunc) Load() error {\n\tf.once.Do(func() {\n\t\tvar s windows.Handle\n\t\ts, f.err = windows.Socket(windows.AF_INET, windows.SOCK_STREAM, windows.IPPROTO_TCP)\n\t\tif f.err != nil {\n\t\t\treturn\n\t\t}\n\t\tdefer windows.CloseHandle(s) //nolint:errcheck\n\n\t\tvar n uint32\n\t\tf.err = windows.WSAIoctl(s,\n\t\t\twindows.SIO_GET_EXTENSION_FUNCTION_POINTER,\n\t\t\t(*byte)(unsafe.Pointer(&f.id)),\n\t\t\tuint32(unsafe.Sizeof(f.id)),\n\t\t\t(*byte)(unsafe.Pointer(&f.addr)),\n\t\t\tuint32(unsafe.Sizeof(f.addr)),\n\t\t\t&n,\n\t\t\tnil, // overlapped\n\t\t\t0,   // completionRoutine\n\t\t)\n\t})\n\treturn f.err\n}\n\nvar (\n\t// todo: add `AcceptEx` and `GetAcceptExSockaddrs`\n\tWSAID_CONNECTEX = guid.GUID{ //revive:disable-line:var-naming ALL_CAPS\n\t\tData1: 0x25a207b9,\n\t\tData2: 0xddf3,\n\t\tData3: 0x4660,\n\t\tData4: [8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e},\n\t}\n\n\tconnectExFunc = runtimeFunc{id: WSAID_CONNECTEX}\n)\n\nfunc ConnectEx(\n\tfd windows.Handle,\n\trsa RawSockaddr,\n\tsendBuf *byte,\n\tsendDataLen uint32,\n\tbytesSent *uint32,\n\toverlapped *windows.Overlapped,\n) error {\n\tif err := connectExFunc.Load(); err != nil {\n\t\treturn fmt.Errorf(\"failed to load ConnectEx function pointer: %w\", err)\n\t}\n\tptr, n, err := rsa.Sockaddr()\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn connectEx(fd, ptr, n, sendBuf, sendDataLen, bytesSent, overlapped)\n}\n\n// BOOL LpfnConnectex(\n//   [in]           SOCKET s,\n//   [in]           const sockaddr *name,\n//   [in]           int namelen,\n//   [in, optional] PVOID lpSendBuffer,\n//   [in]           DWORD dwSendDataLength,\n//   [out]          LPDWORD lpdwBytesSent,\n//   [in]           LPOVERLAPPED lpOverlapped\n// )\n\nfunc connectEx(\n\ts windows.Handle,\n\tname unsafe.Pointer,\n\tnamelen int32,\n\tsendBuf *byte,\n\tsendDataLen uint32,\n\tbytesSent *uint32,\n\toverlapped *windows.Overlapped,\n) (err error) {\n\tr1, _, e1 := syscall.SyscallN(connectExFunc.addr,\n\t\tuintptr(s),\n\t\tuintptr(name),\n\t\tuintptr(namelen),\n\t\tuintptr(unsafe.Pointer(sendBuf)),\n\t\tuintptr(sendDataLen),\n\t\tuintptr(unsafe.Pointer(bytesSent)),\n\t\tuintptr(unsafe.Pointer(overlapped)),\n\t)\n\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/internal/socket/zsyscall_windows.go",
    "content": "//go:build windows\n\n// Code generated by 'go generate' using \"github.com/Microsoft/go-winio/tools/mkwinsyscall\"; DO NOT EDIT.\n\npackage socket\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\nvar _ unsafe.Pointer\n\n// Do the interface allocations only once for common\n// Errno values.\nconst (\n\terrnoERROR_IO_PENDING = 997\n)\n\nvar (\n\terrERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)\n\terrERROR_EINVAL     error = syscall.EINVAL\n)\n\n// errnoErr returns common boxed Errno values, to prevent\n// allocations at runtime.\nfunc errnoErr(e syscall.Errno) error {\n\tswitch e {\n\tcase 0:\n\t\treturn errERROR_EINVAL\n\tcase errnoERROR_IO_PENDING:\n\t\treturn errERROR_IO_PENDING\n\t}\n\treturn e\n}\n\nvar (\n\tmodws2_32 = windows.NewLazySystemDLL(\"ws2_32.dll\")\n\n\tprocbind        = modws2_32.NewProc(\"bind\")\n\tprocgetpeername = modws2_32.NewProc(\"getpeername\")\n\tprocgetsockname = modws2_32.NewProc(\"getsockname\")\n)\n\nfunc bind(s windows.Handle, name unsafe.Pointer, namelen int32) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procbind.Addr(), uintptr(s), uintptr(name), uintptr(namelen))\n\tif r1 == socketError {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc getpeername(s windows.Handle, name unsafe.Pointer, namelen *int32) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procgetpeername.Addr(), uintptr(s), uintptr(name), uintptr(unsafe.Pointer(namelen)))\n\tif r1 == socketError {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc getsockname(s windows.Handle, name unsafe.Pointer, namelen *int32) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procgetsockname.Addr(), uintptr(s), uintptr(name), uintptr(unsafe.Pointer(namelen)))\n\tif r1 == socketError {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go",
    "content": "package stringbuffer\n\nimport (\n\t\"sync\"\n\t\"unicode/utf16\"\n)\n\n// TODO: worth exporting and using in mkwinsyscall?\n\n// Uint16BufferSize is the buffer size in the pool, chosen somewhat arbitrarily to accommodate\n// large path strings:\n// MAX_PATH (260) + size of volume GUID prefix (49) + null terminator = 310.\nconst MinWStringCap = 310\n\n// use *[]uint16 since []uint16 creates an extra allocation where the slice header\n// is copied to heap and then referenced via pointer in the interface header that sync.Pool\n// stores.\nvar pathPool = sync.Pool{ // if go1.18+ adds Pool[T], use that to store []uint16 directly\n\tNew: func() interface{} {\n\t\tb := make([]uint16, MinWStringCap)\n\t\treturn &b\n\t},\n}\n\nfunc newBuffer() []uint16 { return *(pathPool.Get().(*[]uint16)) }\n\n// freeBuffer copies the slice header data, and puts a pointer to that in the pool.\n// This avoids taking a pointer to the slice header in WString, which can be set to nil.\nfunc freeBuffer(b []uint16) { pathPool.Put(&b) }\n\n// WString is a wide string buffer ([]uint16) meant for storing UTF-16 encoded strings\n// for interacting with Win32 APIs.\n// Sizes are specified as uint32 and not int.\n//\n// It is not thread safe.\ntype WString struct {\n\t// type-def allows casting to []uint16 directly, use struct to prevent that and allow adding fields in the future.\n\n\t// raw buffer\n\tb []uint16\n}\n\n// NewWString returns a [WString] allocated from a shared pool with an\n// initial capacity of at least [MinWStringCap].\n// Since the buffer may have been previously used, its contents are not guaranteed to be empty.\n//\n// The buffer should be freed via [WString.Free]\nfunc NewWString() *WString {\n\treturn &WString{\n\t\tb: newBuffer(),\n\t}\n}\n\nfunc (b *WString) Free() {\n\tif b.empty() {\n\t\treturn\n\t}\n\tfreeBuffer(b.b)\n\tb.b = nil\n}\n\n// ResizeTo grows the buffer to at least c and returns the new capacity, freeing the\n// previous buffer back into pool.\nfunc (b *WString) ResizeTo(c uint32) uint32 {\n\t// already sufficient (or n is 0)\n\tif c <= b.Cap() {\n\t\treturn b.Cap()\n\t}\n\n\tif c <= MinWStringCap {\n\t\tc = MinWStringCap\n\t}\n\t// allocate at-least double buffer size, as is done in [bytes.Buffer] and other places\n\tif c <= 2*b.Cap() {\n\t\tc = 2 * b.Cap()\n\t}\n\n\tb2 := make([]uint16, c)\n\tif !b.empty() {\n\t\tcopy(b2, b.b)\n\t\tfreeBuffer(b.b)\n\t}\n\tb.b = b2\n\treturn c\n}\n\n// Buffer returns the underlying []uint16 buffer.\nfunc (b *WString) Buffer() []uint16 {\n\tif b.empty() {\n\t\treturn nil\n\t}\n\treturn b.b\n}\n\n// Pointer returns a pointer to the first uint16 in the buffer.\n// If the [WString.Free] has already been called, the pointer will be nil.\nfunc (b *WString) Pointer() *uint16 {\n\tif b.empty() {\n\t\treturn nil\n\t}\n\treturn &b.b[0]\n}\n\n// String returns the returns the UTF-8 encoding of the UTF-16 string in the buffer.\n//\n// It assumes that the data is null-terminated.\nfunc (b *WString) String() string {\n\t// Using [windows.UTF16ToString] would require importing \"golang.org/x/sys/windows\"\n\t// and would make this code Windows-only, which makes no sense.\n\t// So copy UTF16ToString code into here.\n\t// If other windows-specific code is added, switch to [windows.UTF16ToString]\n\n\ts := b.b\n\tfor i, v := range s {\n\t\tif v == 0 {\n\t\t\ts = s[:i]\n\t\t\tbreak\n\t\t}\n\t}\n\treturn string(utf16.Decode(s))\n}\n\n// Cap returns the underlying buffer capacity.\nfunc (b *WString) Cap() uint32 {\n\tif b.empty() {\n\t\treturn 0\n\t}\n\treturn b.cap()\n}\n\nfunc (b *WString) cap() uint32 { return uint32(cap(b.b)) }\nfunc (b *WString) empty() bool { return b == nil || b.cap() == 0 }\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/pipe.go",
    "content": "//go:build windows\n// +build windows\n\npackage winio\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"os\"\n\t\"runtime\"\n\t\"time\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n\n\t\"github.com/Microsoft/go-winio/internal/fs\"\n)\n\n//sys connectNamedPipe(pipe windows.Handle, o *windows.Overlapped) (err error) = ConnectNamedPipe\n//sys createNamedPipe(name string, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *windows.SecurityAttributes) (handle windows.Handle, err error)  [failretval==windows.InvalidHandle] = CreateNamedPipeW\n//sys disconnectNamedPipe(pipe windows.Handle) (err error) = DisconnectNamedPipe\n//sys getNamedPipeInfo(pipe windows.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) = GetNamedPipeInfo\n//sys getNamedPipeHandleState(pipe windows.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) = GetNamedPipeHandleStateW\n//sys ntCreateNamedPipeFile(pipe *windows.Handle, access ntAccessMask, oa *objectAttributes, iosb *ioStatusBlock, share ntFileShareMode, disposition ntFileCreationDisposition, options ntFileOptions, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntStatus) = ntdll.NtCreateNamedPipeFile\n//sys rtlNtStatusToDosError(status ntStatus) (winerr error) = ntdll.RtlNtStatusToDosErrorNoTeb\n//sys rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntStatus) = ntdll.RtlDosPathNameToNtPathName_U\n//sys rtlDefaultNpAcl(dacl *uintptr) (status ntStatus) = ntdll.RtlDefaultNpAcl\n\ntype PipeConn interface {\n\tnet.Conn\n\tDisconnect() error\n\tFlush() error\n}\n\n// type aliases for mkwinsyscall code\ntype (\n\tntAccessMask              = fs.AccessMask\n\tntFileShareMode           = fs.FileShareMode\n\tntFileCreationDisposition = fs.NTFileCreationDisposition\n\tntFileOptions             = fs.NTCreateOptions\n)\n\ntype ioStatusBlock struct {\n\tStatus, Information uintptr\n}\n\n//\ttypedef struct _OBJECT_ATTRIBUTES {\n//\t  ULONG           Length;\n//\t  HANDLE          RootDirectory;\n//\t  PUNICODE_STRING ObjectName;\n//\t  ULONG           Attributes;\n//\t  PVOID           SecurityDescriptor;\n//\t  PVOID           SecurityQualityOfService;\n//\t} OBJECT_ATTRIBUTES;\n//\n// https://learn.microsoft.com/en-us/windows/win32/api/ntdef/ns-ntdef-_object_attributes\ntype objectAttributes struct {\n\tLength             uintptr\n\tRootDirectory      uintptr\n\tObjectName         *unicodeString\n\tAttributes         uintptr\n\tSecurityDescriptor *securityDescriptor\n\tSecurityQoS        uintptr\n}\n\ntype unicodeString struct {\n\tLength        uint16\n\tMaximumLength uint16\n\tBuffer        uintptr\n}\n\n//\ttypedef struct _SECURITY_DESCRIPTOR {\n//\t  BYTE                        Revision;\n//\t  BYTE                        Sbz1;\n//\t  SECURITY_DESCRIPTOR_CONTROL Control;\n//\t  PSID                        Owner;\n//\t  PSID                        Group;\n//\t  PACL                        Sacl;\n//\t  PACL                        Dacl;\n//\t} SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;\n//\n// https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-security_descriptor\ntype securityDescriptor struct {\n\tRevision byte\n\tSbz1     byte\n\tControl  uint16\n\tOwner    uintptr\n\tGroup    uintptr\n\tSacl     uintptr //revive:disable-line:var-naming SACL, not Sacl\n\tDacl     uintptr //revive:disable-line:var-naming DACL, not Dacl\n}\n\ntype ntStatus int32\n\nfunc (status ntStatus) Err() error {\n\tif status >= 0 {\n\t\treturn nil\n\t}\n\treturn rtlNtStatusToDosError(status)\n}\n\nvar (\n\t// ErrPipeListenerClosed is returned for pipe operations on listeners that have been closed.\n\tErrPipeListenerClosed = net.ErrClosed\n\n\terrPipeWriteClosed = errors.New(\"pipe has been closed for write\")\n)\n\ntype win32Pipe struct {\n\t*win32File\n\tpath string\n}\n\nvar _ PipeConn = (*win32Pipe)(nil)\n\ntype win32MessageBytePipe struct {\n\twin32Pipe\n\twriteClosed bool\n\treadEOF     bool\n}\n\ntype pipeAddress string\n\nfunc (f *win32Pipe) LocalAddr() net.Addr {\n\treturn pipeAddress(f.path)\n}\n\nfunc (f *win32Pipe) RemoteAddr() net.Addr {\n\treturn pipeAddress(f.path)\n}\n\nfunc (f *win32Pipe) SetDeadline(t time.Time) error {\n\tif err := f.SetReadDeadline(t); err != nil {\n\t\treturn err\n\t}\n\treturn f.SetWriteDeadline(t)\n}\n\nfunc (f *win32Pipe) Disconnect() error {\n\treturn disconnectNamedPipe(f.win32File.handle)\n}\n\n// CloseWrite closes the write side of a message pipe in byte mode.\nfunc (f *win32MessageBytePipe) CloseWrite() error {\n\tif f.writeClosed {\n\t\treturn errPipeWriteClosed\n\t}\n\terr := f.win32File.Flush()\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, err = f.win32File.Write(nil)\n\tif err != nil {\n\t\treturn err\n\t}\n\tf.writeClosed = true\n\treturn nil\n}\n\n// Write writes bytes to a message pipe in byte mode. Zero-byte writes are ignored, since\n// they are used to implement CloseWrite().\nfunc (f *win32MessageBytePipe) Write(b []byte) (int, error) {\n\tif f.writeClosed {\n\t\treturn 0, errPipeWriteClosed\n\t}\n\tif len(b) == 0 {\n\t\treturn 0, nil\n\t}\n\treturn f.win32File.Write(b)\n}\n\n// Read reads bytes from a message pipe in byte mode. A read of a zero-byte message on a message\n// mode pipe will return io.EOF, as will all subsequent reads.\nfunc (f *win32MessageBytePipe) Read(b []byte) (int, error) {\n\tif f.readEOF {\n\t\treturn 0, io.EOF\n\t}\n\tn, err := f.win32File.Read(b)\n\tif err == io.EOF { //nolint:errorlint\n\t\t// If this was the result of a zero-byte read, then\n\t\t// it is possible that the read was due to a zero-size\n\t\t// message. Since we are simulating CloseWrite with a\n\t\t// zero-byte message, ensure that all future Read() calls\n\t\t// also return EOF.\n\t\tf.readEOF = true\n\t} else if err == windows.ERROR_MORE_DATA { //nolint:errorlint // err is Errno\n\t\t// ERROR_MORE_DATA indicates that the pipe's read mode is message mode\n\t\t// and the message still has more bytes. Treat this as a success, since\n\t\t// this package presents all named pipes as byte streams.\n\t\terr = nil\n\t}\n\treturn n, err\n}\n\nfunc (pipeAddress) Network() string {\n\treturn \"pipe\"\n}\n\nfunc (s pipeAddress) String() string {\n\treturn string(s)\n}\n\n// tryDialPipe attempts to dial the pipe at `path` until `ctx` cancellation or timeout.\nfunc tryDialPipe(ctx context.Context, path *string, access fs.AccessMask, impLevel PipeImpLevel) (windows.Handle, error) {\n\tfor {\n\t\tselect {\n\t\tcase <-ctx.Done():\n\t\t\treturn windows.Handle(0), ctx.Err()\n\t\tdefault:\n\t\t\th, err := fs.CreateFile(*path,\n\t\t\t\taccess,\n\t\t\t\t0,   // mode\n\t\t\t\tnil, // security attributes\n\t\t\t\tfs.OPEN_EXISTING,\n\t\t\t\tfs.FILE_FLAG_OVERLAPPED|fs.SECURITY_SQOS_PRESENT|fs.FileSQSFlag(impLevel),\n\t\t\t\t0, // template file handle\n\t\t\t)\n\t\t\tif err == nil {\n\t\t\t\treturn h, nil\n\t\t\t}\n\t\t\tif err != windows.ERROR_PIPE_BUSY { //nolint:errorlint // err is Errno\n\t\t\t\treturn h, &os.PathError{Err: err, Op: \"open\", Path: *path}\n\t\t\t}\n\t\t\t// Wait 10 msec and try again. This is a rather simplistic\n\t\t\t// view, as we always try each 10 milliseconds.\n\t\t\ttime.Sleep(10 * time.Millisecond)\n\t\t}\n\t}\n}\n\n// DialPipe connects to a named pipe by path, timing out if the connection\n// takes longer than the specified duration. If timeout is nil, then we use\n// a default timeout of 2 seconds.  (We do not use WaitNamedPipe.)\nfunc DialPipe(path string, timeout *time.Duration) (net.Conn, error) {\n\tvar absTimeout time.Time\n\tif timeout != nil {\n\t\tabsTimeout = time.Now().Add(*timeout)\n\t} else {\n\t\tabsTimeout = time.Now().Add(2 * time.Second)\n\t}\n\tctx, cancel := context.WithDeadline(context.Background(), absTimeout)\n\tdefer cancel()\n\tconn, err := DialPipeContext(ctx, path)\n\tif errors.Is(err, context.DeadlineExceeded) {\n\t\treturn nil, ErrTimeout\n\t}\n\treturn conn, err\n}\n\n// DialPipeContext attempts to connect to a named pipe by `path` until `ctx`\n// cancellation or timeout.\nfunc DialPipeContext(ctx context.Context, path string) (net.Conn, error) {\n\treturn DialPipeAccess(ctx, path, uint32(fs.GENERIC_READ|fs.GENERIC_WRITE))\n}\n\n// PipeImpLevel is an enumeration of impersonation levels that may be set\n// when calling DialPipeAccessImpersonation.\ntype PipeImpLevel uint32\n\nconst (\n\tPipeImpLevelAnonymous      = PipeImpLevel(fs.SECURITY_ANONYMOUS)\n\tPipeImpLevelIdentification = PipeImpLevel(fs.SECURITY_IDENTIFICATION)\n\tPipeImpLevelImpersonation  = PipeImpLevel(fs.SECURITY_IMPERSONATION)\n\tPipeImpLevelDelegation     = PipeImpLevel(fs.SECURITY_DELEGATION)\n)\n\n// DialPipeAccess attempts to connect to a named pipe by `path` with `access` until `ctx`\n// cancellation or timeout.\nfunc DialPipeAccess(ctx context.Context, path string, access uint32) (net.Conn, error) {\n\treturn DialPipeAccessImpLevel(ctx, path, access, PipeImpLevelAnonymous)\n}\n\n// DialPipeAccessImpLevel attempts to connect to a named pipe by `path` with\n// `access` at `impLevel` until `ctx` cancellation or timeout. The other\n// DialPipe* implementations use PipeImpLevelAnonymous.\nfunc DialPipeAccessImpLevel(ctx context.Context, path string, access uint32, impLevel PipeImpLevel) (net.Conn, error) {\n\tvar err error\n\tvar h windows.Handle\n\th, err = tryDialPipe(ctx, &path, fs.AccessMask(access), impLevel)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar flags uint32\n\terr = getNamedPipeInfo(h, &flags, nil, nil, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tf, err := makeWin32File(h)\n\tif err != nil {\n\t\twindows.Close(h)\n\t\treturn nil, err\n\t}\n\n\t// If the pipe is in message mode, return a message byte pipe, which\n\t// supports CloseWrite().\n\tif flags&windows.PIPE_TYPE_MESSAGE != 0 {\n\t\treturn &win32MessageBytePipe{\n\t\t\twin32Pipe: win32Pipe{win32File: f, path: path},\n\t\t}, nil\n\t}\n\treturn &win32Pipe{win32File: f, path: path}, nil\n}\n\ntype acceptResponse struct {\n\tf   *win32File\n\terr error\n}\n\ntype win32PipeListener struct {\n\tfirstHandle windows.Handle\n\tpath        string\n\tconfig      PipeConfig\n\tacceptCh    chan (chan acceptResponse)\n\tcloseCh     chan int\n\tdoneCh      chan int\n}\n\nfunc makeServerPipeHandle(path string, sd []byte, c *PipeConfig, first bool) (windows.Handle, error) {\n\tpath16, err := windows.UTF16FromString(path)\n\tif err != nil {\n\t\treturn 0, &os.PathError{Op: \"open\", Path: path, Err: err}\n\t}\n\n\tvar oa objectAttributes\n\toa.Length = unsafe.Sizeof(oa)\n\n\tvar ntPath unicodeString\n\tif err := rtlDosPathNameToNtPathName(&path16[0],\n\t\t&ntPath,\n\t\t0,\n\t\t0,\n\t).Err(); err != nil {\n\t\treturn 0, &os.PathError{Op: \"open\", Path: path, Err: err}\n\t}\n\tdefer windows.LocalFree(windows.Handle(ntPath.Buffer)) //nolint:errcheck\n\toa.ObjectName = &ntPath\n\toa.Attributes = windows.OBJ_CASE_INSENSITIVE\n\n\t// The security descriptor is only needed for the first pipe.\n\tif first {\n\t\tif sd != nil {\n\t\t\t//todo: does `sdb` need to be allocated on the heap, or can go allocate it?\n\t\t\tl := uint32(len(sd))\n\t\t\tsdb, err := windows.LocalAlloc(0, l)\n\t\t\tif err != nil {\n\t\t\t\treturn 0, fmt.Errorf(\"LocalAlloc for security descriptor with of length %d: %w\", l, err)\n\t\t\t}\n\t\t\tdefer windows.LocalFree(windows.Handle(sdb)) //nolint:errcheck\n\t\t\tcopy((*[0xffff]byte)(unsafe.Pointer(sdb))[:], sd)\n\t\t\toa.SecurityDescriptor = (*securityDescriptor)(unsafe.Pointer(sdb))\n\t\t} else {\n\t\t\t// Construct the default named pipe security descriptor.\n\t\t\tvar dacl uintptr\n\t\t\tif err := rtlDefaultNpAcl(&dacl).Err(); err != nil {\n\t\t\t\treturn 0, fmt.Errorf(\"getting default named pipe ACL: %w\", err)\n\t\t\t}\n\t\t\tdefer windows.LocalFree(windows.Handle(dacl)) //nolint:errcheck\n\n\t\t\tsdb := &securityDescriptor{\n\t\t\t\tRevision: 1,\n\t\t\t\tControl:  windows.SE_DACL_PRESENT,\n\t\t\t\tDacl:     dacl,\n\t\t\t}\n\t\t\toa.SecurityDescriptor = sdb\n\t\t}\n\t}\n\n\ttyp := uint32(windows.FILE_PIPE_REJECT_REMOTE_CLIENTS)\n\tif c.MessageMode {\n\t\ttyp |= windows.FILE_PIPE_MESSAGE_TYPE\n\t}\n\n\tdisposition := fs.FILE_OPEN\n\taccess := fs.GENERIC_READ | fs.GENERIC_WRITE | fs.SYNCHRONIZE\n\tif first {\n\t\tdisposition = fs.FILE_CREATE\n\t\t// By not asking for read or write access, the named pipe file system\n\t\t// will put this pipe into an initially disconnected state, blocking\n\t\t// client connections until the next call with first == false.\n\t\taccess = fs.SYNCHRONIZE\n\t}\n\n\ttimeout := int64(-50 * 10000) // 50ms\n\n\tvar (\n\t\th    windows.Handle\n\t\tiosb ioStatusBlock\n\t)\n\terr = ntCreateNamedPipeFile(&h,\n\t\taccess,\n\t\t&oa,\n\t\t&iosb,\n\t\tfs.FILE_SHARE_READ|fs.FILE_SHARE_WRITE,\n\t\tdisposition,\n\t\t0,\n\t\ttyp,\n\t\t0,\n\t\t0,\n\t\t0xffffffff,\n\t\tuint32(c.InputBufferSize),\n\t\tuint32(c.OutputBufferSize),\n\t\t&timeout).Err()\n\tif err != nil {\n\t\treturn 0, &os.PathError{Op: \"open\", Path: path, Err: err}\n\t}\n\n\truntime.KeepAlive(ntPath)\n\treturn h, nil\n}\n\nfunc (l *win32PipeListener) makeServerPipe() (*win32File, error) {\n\th, err := makeServerPipeHandle(l.path, nil, &l.config, false)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tf, err := makeWin32File(h)\n\tif err != nil {\n\t\twindows.Close(h)\n\t\treturn nil, err\n\t}\n\treturn f, nil\n}\n\nfunc (l *win32PipeListener) makeConnectedServerPipe() (*win32File, error) {\n\tp, err := l.makeServerPipe()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Wait for the client to connect.\n\tch := make(chan error)\n\tgo func(p *win32File) {\n\t\tch <- connectPipe(p)\n\t}(p)\n\n\tselect {\n\tcase err = <-ch:\n\t\tif err != nil {\n\t\t\tp.Close()\n\t\t\tp = nil\n\t\t}\n\tcase <-l.closeCh:\n\t\t// Abort the connect request by closing the handle.\n\t\tp.Close()\n\t\tp = nil\n\t\terr = <-ch\n\t\tif err == nil || err == ErrFileClosed { //nolint:errorlint // err is Errno\n\t\t\terr = ErrPipeListenerClosed\n\t\t}\n\t}\n\treturn p, err\n}\n\nfunc (l *win32PipeListener) listenerRoutine() {\n\tclosed := false\n\tfor !closed {\n\t\tselect {\n\t\tcase <-l.closeCh:\n\t\t\tclosed = true\n\t\tcase responseCh := <-l.acceptCh:\n\t\t\tvar (\n\t\t\t\tp   *win32File\n\t\t\t\terr error\n\t\t\t)\n\t\t\tfor {\n\t\t\t\tp, err = l.makeConnectedServerPipe()\n\t\t\t\t// If the connection was immediately closed by the client, try\n\t\t\t\t// again.\n\t\t\t\tif err != windows.ERROR_NO_DATA { //nolint:errorlint // err is Errno\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tresponseCh <- acceptResponse{p, err}\n\t\t\tclosed = err == ErrPipeListenerClosed //nolint:errorlint // err is Errno\n\t\t}\n\t}\n\twindows.Close(l.firstHandle)\n\tl.firstHandle = 0\n\t// Notify Close() and Accept() callers that the handle has been closed.\n\tclose(l.doneCh)\n}\n\n// PipeConfig contain configuration for the pipe listener.\ntype PipeConfig struct {\n\t// SecurityDescriptor contains a Windows security descriptor in SDDL format.\n\tSecurityDescriptor string\n\n\t// MessageMode determines whether the pipe is in byte or message mode. In either\n\t// case the pipe is read in byte mode by default. The only practical difference in\n\t// this implementation is that CloseWrite() is only supported for message mode pipes;\n\t// CloseWrite() is implemented as a zero-byte write, but zero-byte writes are only\n\t// transferred to the reader (and returned as io.EOF in this implementation)\n\t// when the pipe is in message mode.\n\tMessageMode bool\n\n\t// InputBufferSize specifies the size of the input buffer, in bytes.\n\tInputBufferSize int32\n\n\t// OutputBufferSize specifies the size of the output buffer, in bytes.\n\tOutputBufferSize int32\n}\n\n// ListenPipe creates a listener on a Windows named pipe path, e.g. \\\\.\\pipe\\mypipe.\n// The pipe must not already exist.\nfunc ListenPipe(path string, c *PipeConfig) (net.Listener, error) {\n\tvar (\n\t\tsd  []byte\n\t\terr error\n\t)\n\tif c == nil {\n\t\tc = &PipeConfig{}\n\t}\n\tif c.SecurityDescriptor != \"\" {\n\t\tsd, err = SddlToSecurityDescriptor(c.SecurityDescriptor)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\th, err := makeServerPipeHandle(path, sd, c, true)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tl := &win32PipeListener{\n\t\tfirstHandle: h,\n\t\tpath:        path,\n\t\tconfig:      *c,\n\t\tacceptCh:    make(chan (chan acceptResponse)),\n\t\tcloseCh:     make(chan int),\n\t\tdoneCh:      make(chan int),\n\t}\n\tgo l.listenerRoutine()\n\treturn l, nil\n}\n\nfunc connectPipe(p *win32File) error {\n\tc, err := p.prepareIO()\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer p.wg.Done()\n\n\terr = connectNamedPipe(p.handle, &c.o)\n\t_, err = p.asyncIO(c, nil, 0, err)\n\tif err != nil && err != windows.ERROR_PIPE_CONNECTED { //nolint:errorlint // err is Errno\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (l *win32PipeListener) Accept() (net.Conn, error) {\n\tch := make(chan acceptResponse)\n\tselect {\n\tcase l.acceptCh <- ch:\n\t\tresponse := <-ch\n\t\terr := response.err\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif l.config.MessageMode {\n\t\t\treturn &win32MessageBytePipe{\n\t\t\t\twin32Pipe: win32Pipe{win32File: response.f, path: l.path},\n\t\t\t}, nil\n\t\t}\n\t\treturn &win32Pipe{win32File: response.f, path: l.path}, nil\n\tcase <-l.doneCh:\n\t\treturn nil, ErrPipeListenerClosed\n\t}\n}\n\nfunc (l *win32PipeListener) Close() error {\n\tselect {\n\tcase l.closeCh <- 1:\n\t\t<-l.doneCh\n\tcase <-l.doneCh:\n\t}\n\treturn nil\n}\n\nfunc (l *win32PipeListener) Addr() net.Addr {\n\treturn pipeAddress(l.path)\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/pkg/bindfilter/bind_filter.go",
    "content": "//go:build windows\n// +build windows\n\npackage bindfilter\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\n//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go ./bind_filter.go\n//sys bfSetupFilter(jobHandle windows.Handle, flags uint32, virtRootPath string, virtTargetPath string, virtExceptions **uint16, virtExceptionPathCount uint32) (hr error) = bindfltapi.BfSetupFilter?\n//sys bfRemoveMapping(jobHandle windows.Handle, virtRootPath string)  (hr error) = bindfltapi.BfRemoveMapping?\n//sys bfGetMappings(flags uint32, jobHandle windows.Handle, virtRootPath *uint16, sid *windows.SID, bufferSize *uint32, outBuffer *byte)  (hr error) = bindfltapi.BfGetMappings?\n\n// BfSetupFilter flags. See:\n// https://github.com/microsoft/BuildXL/blob/a6dce509f0d4f774255e5fbfb75fa6d5290ed163/Public/Src/Utilities/Native/Processes/Windows/NativeContainerUtilities.cs#L193-L240\n//\n//nolint:revive // var-naming: ALL_CAPS\nconst (\n\tBINDFLT_FLAG_READ_ONLY_MAPPING uint32 = 0x00000001\n\t// Tells bindflt to fail mapping with STATUS_INVALID_PARAMETER if a mapping produces\n\t// multiple targets.\n\tBINDFLT_FLAG_NO_MULTIPLE_TARGETS uint32 = 0x00000040\n)\n\n//nolint:revive // var-naming: ALL_CAPS\nconst (\n\tBINDFLT_GET_MAPPINGS_FLAG_VOLUME uint32 = 0x00000001\n\tBINDFLT_GET_MAPPINGS_FLAG_SILO   uint32 = 0x00000002\n\tBINDFLT_GET_MAPPINGS_FLAG_USER   uint32 = 0x00000004\n)\n\n// ApplyFileBinding creates a global mount of the source in root, with an optional\n// read only flag.\n// The bind filter allows us to create mounts of directories and volumes. By default it allows\n// us to mount multiple sources inside a single root, acting as an overlay. Files from the\n// second source will superscede the first source that was mounted.\n// This function disables this behavior and sets the BINDFLT_FLAG_NO_MULTIPLE_TARGETS flag\n// on the mount.\nfunc ApplyFileBinding(root, source string, readOnly bool) error {\n\t// The parent directory needs to exist for the bind to work. MkdirAll stats and\n\t// returns nil if the directory exists internally so we should be fine to mkdirall\n\t// every time.\n\tif err := os.MkdirAll(filepath.Dir(root), 0); err != nil {\n\t\treturn err\n\t}\n\n\tif strings.Contains(source, \"Volume{\") && !strings.HasSuffix(source, \"\\\\\") {\n\t\t// Add trailing slash to volumes, otherwise we get an error when binding it to\n\t\t// a folder.\n\t\tsource = source + \"\\\\\"\n\t}\n\n\tflags := BINDFLT_FLAG_NO_MULTIPLE_TARGETS\n\tif readOnly {\n\t\tflags |= BINDFLT_FLAG_READ_ONLY_MAPPING\n\t}\n\n\t// Set the job handle to 0 to create a global mount.\n\tif err := bfSetupFilter(\n\t\t0,\n\t\tflags,\n\t\troot,\n\t\tsource,\n\t\tnil,\n\t\t0,\n\t); err != nil {\n\t\treturn fmt.Errorf(\"failed to bind target %q to root %q: %w\", source, root, err)\n\t}\n\treturn nil\n}\n\n// RemoveFileBinding removes a mount from the root path.\nfunc RemoveFileBinding(root string) error {\n\tif err := bfRemoveMapping(0, root); err != nil {\n\t\treturn fmt.Errorf(\"removing file binding: %w\", err)\n\t}\n\treturn nil\n}\n\n// GetBindMappings returns a list of bind mappings that have their root on a\n// particular volume. The volumePath parameter can be any path that exists on\n// a volume. For example, if a number of mappings are created in C:\\ProgramData\\test,\n// to get a list of those mappings, the volumePath parameter would have to be set to\n// C:\\ or the VOLUME_NAME_GUID notation of C:\\ (\\\\?\\Volume{GUID}\\), or any child\n// path that exists.\nfunc GetBindMappings(volumePath string) ([]BindMapping, error) {\n\trootPtr, err := windows.UTF16PtrFromString(volumePath)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tflags := BINDFLT_GET_MAPPINGS_FLAG_VOLUME\n\t// allocate a large buffer for results\n\tvar outBuffSize uint32 = 256 * 1024\n\tbuf := make([]byte, outBuffSize)\n\n\tif err := bfGetMappings(flags, 0, rootPtr, nil, &outBuffSize, &buf[0]); err != nil {\n\t\treturn nil, err\n\t}\n\n\tif outBuffSize < 12 {\n\t\treturn nil, fmt.Errorf(\"invalid buffer returned\")\n\t}\n\n\tresult := buf[:outBuffSize]\n\n\t// The first 12 bytes are the three uint32 fields in getMappingsResponseHeader{}\n\theaderBuffer := result[:12]\n\t// The alternative to using unsafe and casting it to the above defined structures, is to manually\n\t// parse the fields. Not too terrible, but not sure it'd worth the trouble.\n\theader := *(*getMappingsResponseHeader)(unsafe.Pointer(&headerBuffer[0]))\n\n\tif header.MappingCount == 0 {\n\t\t// no mappings\n\t\treturn []BindMapping{}, nil\n\t}\n\n\tmappingsBuffer := result[12 : int(unsafe.Sizeof(mappingEntry{}))*int(header.MappingCount)]\n\t// Get a pointer to the first mapping in the slice\n\tmappingsPointer := (*mappingEntry)(unsafe.Pointer(&mappingsBuffer[0]))\n\t// Get slice of mappings\n\tmappings := unsafe.Slice(mappingsPointer, header.MappingCount)\n\n\tmappingEntries := make([]BindMapping, header.MappingCount)\n\tfor i := 0; i < int(header.MappingCount); i++ {\n\t\tbindMapping, err := getBindMappingFromBuffer(result, mappings[i])\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"fetching bind mappings: %w\", err)\n\t\t}\n\t\tmappingEntries[i] = bindMapping\n\t}\n\n\treturn mappingEntries, nil\n}\n\n// mappingEntry holds information about where in the response buffer we can\n// find information about the virtual root (the mount point) and the targets (sources)\n// that get mounted, as well as the flags used to bind the targets to the virtual root.\ntype mappingEntry struct {\n\tVirtRootLength      uint32\n\tVirtRootOffset      uint32\n\tFlags               uint32\n\tNumberOfTargets     uint32\n\tTargetEntriesOffset uint32\n}\n\ntype mappingTargetEntry struct {\n\tTargetRootLength uint32\n\tTargetRootOffset uint32\n}\n\n// getMappingsResponseHeader represents the first 12 bytes of the BfGetMappings() response.\n// It gives us the size of the buffer, the status of the call and the number of mappings.\n// A response\ntype getMappingsResponseHeader struct {\n\tSize         uint32\n\tStatus       uint32\n\tMappingCount uint32\n}\n\ntype BindMapping struct {\n\tMountPoint string\n\tFlags      uint32\n\tTargets    []string\n}\n\nfunc decodeEntry(buffer []byte) (string, error) {\n\tname := make([]uint16, len(buffer)/2)\n\terr := binary.Read(bytes.NewReader(buffer), binary.LittleEndian, &name)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"decoding name: %w\", err)\n\t}\n\treturn windows.UTF16ToString(name), nil\n}\n\nfunc getTargetsFromBuffer(buffer []byte, offset, count int) ([]string, error) {\n\tif len(buffer) < offset+count*6 {\n\t\treturn nil, fmt.Errorf(\"invalid buffer\")\n\t}\n\n\ttargets := make([]string, count)\n\tfor i := 0; i < count; i++ {\n\t\tentryBuf := buffer[offset+i*8 : offset+i*8+8]\n\t\ttgt := *(*mappingTargetEntry)(unsafe.Pointer(&entryBuf[0]))\n\t\tif len(buffer) < int(tgt.TargetRootOffset)+int(tgt.TargetRootLength) {\n\t\t\treturn nil, fmt.Errorf(\"invalid buffer\")\n\t\t}\n\t\tdecoded, err := decodeEntry(buffer[tgt.TargetRootOffset : tgt.TargetRootOffset+tgt.TargetRootLength])\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"decoding name: %w\", err)\n\t\t}\n\t\tdecoded, err = getFinalPath(decoded)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"fetching final path: %w\", err)\n\t\t}\n\n\t\ttargets[i] = decoded\n\t}\n\treturn targets, nil\n}\n\nfunc getFinalPath(pth string) (string, error) {\n\t// BfGetMappings returns VOLUME_NAME_NT paths like \\Device\\HarddiskVolume2\\ProgramData.\n\t// These can be accessed by prepending \\\\.\\GLOBALROOT to the path. We use this to get the\n\t// DOS paths for these files.\n\tif strings.HasPrefix(pth, `\\Device`) {\n\t\tpth = `\\\\.\\GLOBALROOT` + pth\n\t}\n\n\than, err := openPath(pth)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"fetching file handle: %w\", err)\n\t}\n\tdefer func() {\n\t\t_ = windows.CloseHandle(han)\n\t}()\n\n\tbuf := make([]uint16, 100)\n\tvar flags uint32 = 0x0\n\tfor {\n\t\tn, err := windows.GetFinalPathNameByHandle(han, &buf[0], uint32(len(buf)), flags)\n\t\tif err != nil {\n\t\t\t// if we mounted a volume that does not also have a drive letter assigned, attempting to\n\t\t\t// fetch the VOLUME_NAME_DOS will fail with os.ErrNotExist. Attempt to get the VOLUME_NAME_GUID.\n\t\t\tif errors.Is(err, os.ErrNotExist) && flags != 0x1 {\n\t\t\t\tflags = 0x1\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn \"\", fmt.Errorf(\"getting final path name: %w\", err)\n\t\t}\n\t\tif n < uint32(len(buf)) {\n\t\t\tbreak\n\t\t}\n\t\tbuf = make([]uint16, n)\n\t}\n\tfinalPath := windows.UTF16ToString(buf)\n\t// We got VOLUME_NAME_DOS, we need to strip away some leading slashes.\n\t// Leave unchanged if we ended up requesting VOLUME_NAME_GUID\n\tif len(finalPath) > 4 && finalPath[:4] == `\\\\?\\` && flags == 0x0 {\n\t\tfinalPath = finalPath[4:]\n\t\tif len(finalPath) > 3 && finalPath[:3] == `UNC` {\n\t\t\t// return path like \\\\server\\share\\...\n\t\t\tfinalPath = `\\` + finalPath[3:]\n\t\t}\n\t}\n\n\treturn finalPath, nil\n}\n\nfunc getBindMappingFromBuffer(buffer []byte, entry mappingEntry) (BindMapping, error) {\n\tif len(buffer) < int(entry.VirtRootOffset)+int(entry.VirtRootLength) {\n\t\treturn BindMapping{}, fmt.Errorf(\"invalid buffer\")\n\t}\n\n\tsrc, err := decodeEntry(buffer[entry.VirtRootOffset : entry.VirtRootOffset+entry.VirtRootLength])\n\tif err != nil {\n\t\treturn BindMapping{}, fmt.Errorf(\"decoding entry: %w\", err)\n\t}\n\ttargets, err := getTargetsFromBuffer(buffer, int(entry.TargetEntriesOffset), int(entry.NumberOfTargets))\n\tif err != nil {\n\t\treturn BindMapping{}, fmt.Errorf(\"fetching targets: %w\", err)\n\t}\n\n\tsrc, err = getFinalPath(src)\n\tif err != nil {\n\t\treturn BindMapping{}, fmt.Errorf(\"fetching final path: %w\", err)\n\t}\n\n\treturn BindMapping{\n\t\tFlags:      entry.Flags,\n\t\tTargets:    targets,\n\t\tMountPoint: src,\n\t}, nil\n}\n\nfunc openPath(path string) (windows.Handle, error) {\n\tu16, err := windows.UTF16PtrFromString(path)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\th, err := windows.CreateFile(\n\t\tu16,\n\t\t0,\n\t\twindows.FILE_SHARE_READ|windows.FILE_SHARE_WRITE|windows.FILE_SHARE_DELETE,\n\t\tnil,\n\t\twindows.OPEN_EXISTING,\n\t\twindows.FILE_FLAG_BACKUP_SEMANTICS, // Needed to open a directory handle.\n\t\t0)\n\tif err != nil {\n\t\treturn 0, &os.PathError{\n\t\t\tOp:   \"CreateFile\",\n\t\t\tPath: path,\n\t\t\tErr:  err,\n\t\t}\n\t}\n\treturn h, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/pkg/bindfilter/zsyscall_windows.go",
    "content": "//go:build windows\n\n// Code generated by 'go generate' using \"github.com/Microsoft/go-winio/tools/mkwinsyscall\"; DO NOT EDIT.\n\npackage bindfilter\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\nvar _ unsafe.Pointer\n\n// Do the interface allocations only once for common\n// Errno values.\nconst (\n\terrnoERROR_IO_PENDING = 997\n)\n\nvar (\n\terrERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)\n\terrERROR_EINVAL     error = syscall.EINVAL\n)\n\n// errnoErr returns common boxed Errno values, to prevent\n// allocations at runtime.\nfunc errnoErr(e syscall.Errno) error {\n\tswitch e {\n\tcase 0:\n\t\treturn errERROR_EINVAL\n\tcase errnoERROR_IO_PENDING:\n\t\treturn errERROR_IO_PENDING\n\t}\n\treturn e\n}\n\nvar (\n\tmodbindfltapi = windows.NewLazySystemDLL(\"bindfltapi.dll\")\n\n\tprocBfGetMappings   = modbindfltapi.NewProc(\"BfGetMappings\")\n\tprocBfRemoveMapping = modbindfltapi.NewProc(\"BfRemoveMapping\")\n\tprocBfSetupFilter   = modbindfltapi.NewProc(\"BfSetupFilter\")\n)\n\nfunc bfGetMappings(flags uint32, jobHandle windows.Handle, virtRootPath *uint16, sid *windows.SID, bufferSize *uint32, outBuffer *byte) (hr error) {\n\thr = procBfGetMappings.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procBfGetMappings.Addr(), uintptr(flags), uintptr(jobHandle), uintptr(unsafe.Pointer(virtRootPath)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(bufferSize)), uintptr(unsafe.Pointer(outBuffer)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc bfRemoveMapping(jobHandle windows.Handle, virtRootPath string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(virtRootPath)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _bfRemoveMapping(jobHandle, _p0)\n}\n\nfunc _bfRemoveMapping(jobHandle windows.Handle, virtRootPath *uint16) (hr error) {\n\thr = procBfRemoveMapping.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procBfRemoveMapping.Addr(), uintptr(jobHandle), uintptr(unsafe.Pointer(virtRootPath)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc bfSetupFilter(jobHandle windows.Handle, flags uint32, virtRootPath string, virtTargetPath string, virtExceptions **uint16, virtExceptionPathCount uint32) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(virtRootPath)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(virtTargetPath)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _bfSetupFilter(jobHandle, flags, _p0, _p1, virtExceptions, virtExceptionPathCount)\n}\n\nfunc _bfSetupFilter(jobHandle windows.Handle, flags uint32, virtRootPath *uint16, virtTargetPath *uint16, virtExceptions **uint16, virtExceptionPathCount uint32) (hr error) {\n\thr = procBfSetupFilter.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procBfSetupFilter.Addr(), uintptr(jobHandle), uintptr(flags), uintptr(unsafe.Pointer(virtRootPath)), uintptr(unsafe.Pointer(virtTargetPath)), uintptr(unsafe.Pointer(virtExceptions)), uintptr(virtExceptionPathCount))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go",
    "content": "// Package guid provides a GUID type. The backing structure for a GUID is\n// identical to that used by the golang.org/x/sys/windows GUID type.\n// There are two main binary encodings used for a GUID, the big-endian encoding,\n// and the Windows (mixed-endian) encoding. See here for details:\n// https://en.wikipedia.org/wiki/Universally_unique_identifier#Encoding\npackage guid\n\nimport (\n\t\"crypto/rand\"\n\t\"crypto/sha1\" //nolint:gosec // not used for secure application\n\t\"encoding\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"strconv\"\n)\n\n//go:generate go run golang.org/x/tools/cmd/stringer -type=Variant -trimprefix=Variant -linecomment\n\n// Variant specifies which GUID variant (or \"type\") of the GUID. It determines\n// how the entirety of the rest of the GUID is interpreted.\ntype Variant uint8\n\n// The variants specified by RFC 4122 section 4.1.1.\nconst (\n\t// VariantUnknown specifies a GUID variant which does not conform to one of\n\t// the variant encodings specified in RFC 4122.\n\tVariantUnknown Variant = iota\n\tVariantNCS\n\tVariantRFC4122 // RFC 4122\n\tVariantMicrosoft\n\tVariantFuture\n)\n\n// Version specifies how the bits in the GUID were generated. For instance, a\n// version 4 GUID is randomly generated, and a version 5 is generated from the\n// hash of an input string.\ntype Version uint8\n\nfunc (v Version) String() string {\n\treturn strconv.FormatUint(uint64(v), 10)\n}\n\nvar _ = (encoding.TextMarshaler)(GUID{})\nvar _ = (encoding.TextUnmarshaler)(&GUID{})\n\n// NewV4 returns a new version 4 (pseudorandom) GUID, as defined by RFC 4122.\nfunc NewV4() (GUID, error) {\n\tvar b [16]byte\n\tif _, err := rand.Read(b[:]); err != nil {\n\t\treturn GUID{}, err\n\t}\n\n\tg := FromArray(b)\n\tg.setVersion(4) // Version 4 means randomly generated.\n\tg.setVariant(VariantRFC4122)\n\n\treturn g, nil\n}\n\n// NewV5 returns a new version 5 (generated from a string via SHA-1 hashing)\n// GUID, as defined by RFC 4122. The RFC is unclear on the encoding of the name,\n// and the sample code treats it as a series of bytes, so we do the same here.\n//\n// Some implementations, such as those found on Windows, treat the name as a\n// big-endian UTF16 stream of bytes. If that is desired, the string can be\n// encoded as such before being passed to this function.\nfunc NewV5(namespace GUID, name []byte) (GUID, error) {\n\tb := sha1.New() //nolint:gosec // not used for secure application\n\tnamespaceBytes := namespace.ToArray()\n\tb.Write(namespaceBytes[:])\n\tb.Write(name)\n\n\ta := [16]byte{}\n\tcopy(a[:], b.Sum(nil))\n\n\tg := FromArray(a)\n\tg.setVersion(5) // Version 5 means generated from a string.\n\tg.setVariant(VariantRFC4122)\n\n\treturn g, nil\n}\n\nfunc fromArray(b [16]byte, order binary.ByteOrder) GUID {\n\tvar g GUID\n\tg.Data1 = order.Uint32(b[0:4])\n\tg.Data2 = order.Uint16(b[4:6])\n\tg.Data3 = order.Uint16(b[6:8])\n\tcopy(g.Data4[:], b[8:16])\n\treturn g\n}\n\nfunc (g GUID) toArray(order binary.ByteOrder) [16]byte {\n\tb := [16]byte{}\n\torder.PutUint32(b[0:4], g.Data1)\n\torder.PutUint16(b[4:6], g.Data2)\n\torder.PutUint16(b[6:8], g.Data3)\n\tcopy(b[8:16], g.Data4[:])\n\treturn b\n}\n\n// FromArray constructs a GUID from a big-endian encoding array of 16 bytes.\nfunc FromArray(b [16]byte) GUID {\n\treturn fromArray(b, binary.BigEndian)\n}\n\n// ToArray returns an array of 16 bytes representing the GUID in big-endian\n// encoding.\nfunc (g GUID) ToArray() [16]byte {\n\treturn g.toArray(binary.BigEndian)\n}\n\n// FromWindowsArray constructs a GUID from a Windows encoding array of bytes.\nfunc FromWindowsArray(b [16]byte) GUID {\n\treturn fromArray(b, binary.LittleEndian)\n}\n\n// ToWindowsArray returns an array of 16 bytes representing the GUID in Windows\n// encoding.\nfunc (g GUID) ToWindowsArray() [16]byte {\n\treturn g.toArray(binary.LittleEndian)\n}\n\nfunc (g GUID) String() string {\n\treturn fmt.Sprintf(\n\t\t\"%08x-%04x-%04x-%04x-%012x\",\n\t\tg.Data1,\n\t\tg.Data2,\n\t\tg.Data3,\n\t\tg.Data4[:2],\n\t\tg.Data4[2:])\n}\n\n// FromString parses a string containing a GUID and returns the GUID. The only\n// format currently supported is the `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`\n// format.\nfunc FromString(s string) (GUID, error) {\n\tif len(s) != 36 {\n\t\treturn GUID{}, fmt.Errorf(\"invalid GUID %q\", s)\n\t}\n\tif s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' {\n\t\treturn GUID{}, fmt.Errorf(\"invalid GUID %q\", s)\n\t}\n\n\tvar g GUID\n\n\tdata1, err := strconv.ParseUint(s[0:8], 16, 32)\n\tif err != nil {\n\t\treturn GUID{}, fmt.Errorf(\"invalid GUID %q\", s)\n\t}\n\tg.Data1 = uint32(data1)\n\n\tdata2, err := strconv.ParseUint(s[9:13], 16, 16)\n\tif err != nil {\n\t\treturn GUID{}, fmt.Errorf(\"invalid GUID %q\", s)\n\t}\n\tg.Data2 = uint16(data2)\n\n\tdata3, err := strconv.ParseUint(s[14:18], 16, 16)\n\tif err != nil {\n\t\treturn GUID{}, fmt.Errorf(\"invalid GUID %q\", s)\n\t}\n\tg.Data3 = uint16(data3)\n\n\tfor i, x := range []int{19, 21, 24, 26, 28, 30, 32, 34} {\n\t\tv, err := strconv.ParseUint(s[x:x+2], 16, 8)\n\t\tif err != nil {\n\t\t\treturn GUID{}, fmt.Errorf(\"invalid GUID %q\", s)\n\t\t}\n\t\tg.Data4[i] = uint8(v)\n\t}\n\n\treturn g, nil\n}\n\nfunc (g *GUID) setVariant(v Variant) {\n\td := g.Data4[0]\n\tswitch v {\n\tcase VariantNCS:\n\t\td = (d & 0x7f)\n\tcase VariantRFC4122:\n\t\td = (d & 0x3f) | 0x80\n\tcase VariantMicrosoft:\n\t\td = (d & 0x1f) | 0xc0\n\tcase VariantFuture:\n\t\td = (d & 0x0f) | 0xe0\n\tcase VariantUnknown:\n\t\tfallthrough\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"invalid variant: %d\", v))\n\t}\n\tg.Data4[0] = d\n}\n\n// Variant returns the GUID variant, as defined in RFC 4122.\nfunc (g GUID) Variant() Variant {\n\tb := g.Data4[0]\n\tif b&0x80 == 0 {\n\t\treturn VariantNCS\n\t} else if b&0xc0 == 0x80 {\n\t\treturn VariantRFC4122\n\t} else if b&0xe0 == 0xc0 {\n\t\treturn VariantMicrosoft\n\t} else if b&0xe0 == 0xe0 {\n\t\treturn VariantFuture\n\t}\n\treturn VariantUnknown\n}\n\nfunc (g *GUID) setVersion(v Version) {\n\tg.Data3 = (g.Data3 & 0x0fff) | (uint16(v) << 12)\n}\n\n// Version returns the GUID version, as defined in RFC 4122.\nfunc (g GUID) Version() Version {\n\treturn Version((g.Data3 & 0xF000) >> 12)\n}\n\n// MarshalText returns the textual representation of the GUID.\nfunc (g GUID) MarshalText() ([]byte, error) {\n\treturn []byte(g.String()), nil\n}\n\n// UnmarshalText takes the textual representation of a GUID, and unmarhals it\n// into this GUID.\nfunc (g *GUID) UnmarshalText(text []byte) error {\n\tg2, err := FromString(string(text))\n\tif err != nil {\n\t\treturn err\n\t}\n\t*g = g2\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/pkg/guid/guid_nonwindows.go",
    "content": "//go:build !windows\n// +build !windows\n\npackage guid\n\n// GUID represents a GUID/UUID. It has the same structure as\n// golang.org/x/sys/windows.GUID so that it can be used with functions expecting\n// that type. It is defined as its own type as that is only available to builds\n// targeted at `windows`. The representation matches that used by native Windows\n// code.\ntype GUID struct {\n\tData1 uint32\n\tData2 uint16\n\tData3 uint16\n\tData4 [8]byte\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/pkg/guid/guid_windows.go",
    "content": "//go:build windows\n// +build windows\n\npackage guid\n\nimport \"golang.org/x/sys/windows\"\n\n// GUID represents a GUID/UUID. It has the same structure as\n// golang.org/x/sys/windows.GUID so that it can be used with functions expecting\n// that type. It is defined as its own type so that stringification and\n// marshaling can be supported. The representation matches that used by native\n// Windows code.\ntype GUID windows.GUID\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/pkg/guid/variant_string.go",
    "content": "// Code generated by \"stringer -type=Variant -trimprefix=Variant -linecomment\"; DO NOT EDIT.\n\npackage guid\n\nimport \"strconv\"\n\nfunc _() {\n\t// An \"invalid array index\" compiler error signifies that the constant values have changed.\n\t// Re-run the stringer command to generate them again.\n\tvar x [1]struct{}\n\t_ = x[VariantUnknown-0]\n\t_ = x[VariantNCS-1]\n\t_ = x[VariantRFC4122-2]\n\t_ = x[VariantMicrosoft-3]\n\t_ = x[VariantFuture-4]\n}\n\nconst _Variant_name = \"UnknownNCSRFC 4122MicrosoftFuture\"\n\nvar _Variant_index = [...]uint8{0, 7, 10, 18, 27, 33}\n\nfunc (i Variant) String() string {\n\tif i >= Variant(len(_Variant_index)-1) {\n\t\treturn \"Variant(\" + strconv.FormatInt(int64(i), 10) + \")\"\n\t}\n\treturn _Variant_name[_Variant_index[i]:_Variant_index[i+1]]\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/privilege.go",
    "content": "//go:build windows\n// +build windows\n\npackage winio\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"runtime\"\n\t\"sync\"\n\t\"unicode/utf16\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\n//sys adjustTokenPrivileges(token windows.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) [true] = advapi32.AdjustTokenPrivileges\n//sys impersonateSelf(level uint32) (err error) = advapi32.ImpersonateSelf\n//sys revertToSelf() (err error) = advapi32.RevertToSelf\n//sys openThreadToken(thread windows.Handle, accessMask uint32, openAsSelf bool, token *windows.Token) (err error) = advapi32.OpenThreadToken\n//sys getCurrentThread() (h windows.Handle) = GetCurrentThread\n//sys lookupPrivilegeValue(systemName string, name string, luid *uint64) (err error) = advapi32.LookupPrivilegeValueW\n//sys lookupPrivilegeName(systemName string, luid *uint64, buffer *uint16, size *uint32) (err error) = advapi32.LookupPrivilegeNameW\n//sys lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) = advapi32.LookupPrivilegeDisplayNameW\n\nconst (\n\t//revive:disable-next-line:var-naming ALL_CAPS\n\tSE_PRIVILEGE_ENABLED = windows.SE_PRIVILEGE_ENABLED\n\n\t//revive:disable-next-line:var-naming ALL_CAPS\n\tERROR_NOT_ALL_ASSIGNED windows.Errno = windows.ERROR_NOT_ALL_ASSIGNED\n\n\tSeBackupPrivilege   = \"SeBackupPrivilege\"\n\tSeRestorePrivilege  = \"SeRestorePrivilege\"\n\tSeSecurityPrivilege = \"SeSecurityPrivilege\"\n)\n\nvar (\n\tprivNames     = make(map[string]uint64)\n\tprivNameMutex sync.Mutex\n)\n\n// PrivilegeError represents an error enabling privileges.\ntype PrivilegeError struct {\n\tprivileges []uint64\n}\n\nfunc (e *PrivilegeError) Error() string {\n\ts := \"Could not enable privilege \"\n\tif len(e.privileges) > 1 {\n\t\ts = \"Could not enable privileges \"\n\t}\n\tfor i, p := range e.privileges {\n\t\tif i != 0 {\n\t\t\ts += \", \"\n\t\t}\n\t\ts += `\"`\n\t\ts += getPrivilegeName(p)\n\t\ts += `\"`\n\t}\n\treturn s\n}\n\n// RunWithPrivilege enables a single privilege for a function call.\nfunc RunWithPrivilege(name string, fn func() error) error {\n\treturn RunWithPrivileges([]string{name}, fn)\n}\n\n// RunWithPrivileges enables privileges for a function call.\nfunc RunWithPrivileges(names []string, fn func() error) error {\n\tprivileges, err := mapPrivileges(names)\n\tif err != nil {\n\t\treturn err\n\t}\n\truntime.LockOSThread()\n\tdefer runtime.UnlockOSThread()\n\ttoken, err := newThreadToken()\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer releaseThreadToken(token)\n\terr = adjustPrivileges(token, privileges, SE_PRIVILEGE_ENABLED)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn fn()\n}\n\nfunc mapPrivileges(names []string) ([]uint64, error) {\n\tprivileges := make([]uint64, 0, len(names))\n\tprivNameMutex.Lock()\n\tdefer privNameMutex.Unlock()\n\tfor _, name := range names {\n\t\tp, ok := privNames[name]\n\t\tif !ok {\n\t\t\terr := lookupPrivilegeValue(\"\", name, &p)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tprivNames[name] = p\n\t\t}\n\t\tprivileges = append(privileges, p)\n\t}\n\treturn privileges, nil\n}\n\n// EnableProcessPrivileges enables privileges globally for the process.\nfunc EnableProcessPrivileges(names []string) error {\n\treturn enableDisableProcessPrivilege(names, SE_PRIVILEGE_ENABLED)\n}\n\n// DisableProcessPrivileges disables privileges globally for the process.\nfunc DisableProcessPrivileges(names []string) error {\n\treturn enableDisableProcessPrivilege(names, 0)\n}\n\nfunc enableDisableProcessPrivilege(names []string, action uint32) error {\n\tprivileges, err := mapPrivileges(names)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tp := windows.CurrentProcess()\n\tvar token windows.Token\n\terr = windows.OpenProcessToken(p, windows.TOKEN_ADJUST_PRIVILEGES|windows.TOKEN_QUERY, &token)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdefer token.Close()\n\treturn adjustPrivileges(token, privileges, action)\n}\n\nfunc adjustPrivileges(token windows.Token, privileges []uint64, action uint32) error {\n\tvar b bytes.Buffer\n\t_ = binary.Write(&b, binary.LittleEndian, uint32(len(privileges)))\n\tfor _, p := range privileges {\n\t\t_ = binary.Write(&b, binary.LittleEndian, p)\n\t\t_ = binary.Write(&b, binary.LittleEndian, action)\n\t}\n\tprevState := make([]byte, b.Len())\n\treqSize := uint32(0)\n\tsuccess, err := adjustTokenPrivileges(token, false, &b.Bytes()[0], uint32(len(prevState)), &prevState[0], &reqSize)\n\tif !success {\n\t\treturn err\n\t}\n\tif err == ERROR_NOT_ALL_ASSIGNED { //nolint:errorlint // err is Errno\n\t\treturn &PrivilegeError{privileges}\n\t}\n\treturn nil\n}\n\nfunc getPrivilegeName(luid uint64) string {\n\tvar nameBuffer [256]uint16\n\tbufSize := uint32(len(nameBuffer))\n\terr := lookupPrivilegeName(\"\", &luid, &nameBuffer[0], &bufSize)\n\tif err != nil {\n\t\treturn fmt.Sprintf(\"<unknown privilege %d>\", luid)\n\t}\n\n\tvar displayNameBuffer [256]uint16\n\tdisplayBufSize := uint32(len(displayNameBuffer))\n\tvar langID uint32\n\terr = lookupPrivilegeDisplayName(\"\", &nameBuffer[0], &displayNameBuffer[0], &displayBufSize, &langID)\n\tif err != nil {\n\t\treturn fmt.Sprintf(\"<unknown privilege %s>\", string(utf16.Decode(nameBuffer[:bufSize])))\n\t}\n\n\treturn string(utf16.Decode(displayNameBuffer[:displayBufSize]))\n}\n\nfunc newThreadToken() (windows.Token, error) {\n\terr := impersonateSelf(windows.SecurityImpersonation)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tvar token windows.Token\n\terr = openThreadToken(getCurrentThread(), windows.TOKEN_ADJUST_PRIVILEGES|windows.TOKEN_QUERY, false, &token)\n\tif err != nil {\n\t\trerr := revertToSelf()\n\t\tif rerr != nil {\n\t\t\tpanic(rerr)\n\t\t}\n\t\treturn 0, err\n\t}\n\treturn token, nil\n}\n\nfunc releaseThreadToken(h windows.Token) {\n\terr := revertToSelf()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\th.Close()\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/reparse.go",
    "content": "//go:build windows\n// +build windows\n\npackage winio\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"strings\"\n\t\"unicode/utf16\"\n\t\"unsafe\"\n)\n\nconst (\n\treparseTagMountPoint = 0xA0000003\n\treparseTagSymlink    = 0xA000000C\n)\n\ntype reparseDataBuffer struct {\n\tReparseTag           uint32\n\tReparseDataLength    uint16\n\tReserved             uint16\n\tSubstituteNameOffset uint16\n\tSubstituteNameLength uint16\n\tPrintNameOffset      uint16\n\tPrintNameLength      uint16\n}\n\n// ReparsePoint describes a Win32 symlink or mount point.\ntype ReparsePoint struct {\n\tTarget       string\n\tIsMountPoint bool\n}\n\n// UnsupportedReparsePointError is returned when trying to decode a non-symlink or\n// mount point reparse point.\ntype UnsupportedReparsePointError struct {\n\tTag uint32\n}\n\nfunc (e *UnsupportedReparsePointError) Error() string {\n\treturn fmt.Sprintf(\"unsupported reparse point %x\", e.Tag)\n}\n\n// DecodeReparsePoint decodes a Win32 REPARSE_DATA_BUFFER structure containing either a symlink\n// or a mount point.\nfunc DecodeReparsePoint(b []byte) (*ReparsePoint, error) {\n\ttag := binary.LittleEndian.Uint32(b[0:4])\n\treturn DecodeReparsePointData(tag, b[8:])\n}\n\nfunc DecodeReparsePointData(tag uint32, b []byte) (*ReparsePoint, error) {\n\tisMountPoint := false\n\tswitch tag {\n\tcase reparseTagMountPoint:\n\t\tisMountPoint = true\n\tcase reparseTagSymlink:\n\tdefault:\n\t\treturn nil, &UnsupportedReparsePointError{tag}\n\t}\n\tnameOffset := 8 + binary.LittleEndian.Uint16(b[4:6])\n\tif !isMountPoint {\n\t\tnameOffset += 4\n\t}\n\tnameLength := binary.LittleEndian.Uint16(b[6:8])\n\tname := make([]uint16, nameLength/2)\n\terr := binary.Read(bytes.NewReader(b[nameOffset:nameOffset+nameLength]), binary.LittleEndian, &name)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &ReparsePoint{string(utf16.Decode(name)), isMountPoint}, nil\n}\n\nfunc isDriveLetter(c byte) bool {\n\treturn (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')\n}\n\n// EncodeReparsePoint encodes a Win32 REPARSE_DATA_BUFFER structure describing a symlink or\n// mount point.\nfunc EncodeReparsePoint(rp *ReparsePoint) []byte {\n\t// Generate an NT path and determine if this is a relative path.\n\tvar ntTarget string\n\trelative := false\n\tif strings.HasPrefix(rp.Target, `\\\\?\\`) {\n\t\tntTarget = `\\??\\` + rp.Target[4:]\n\t} else if strings.HasPrefix(rp.Target, `\\\\`) {\n\t\tntTarget = `\\??\\UNC\\` + rp.Target[2:]\n\t} else if len(rp.Target) >= 2 && isDriveLetter(rp.Target[0]) && rp.Target[1] == ':' {\n\t\tntTarget = `\\??\\` + rp.Target\n\t} else {\n\t\tntTarget = rp.Target\n\t\trelative = true\n\t}\n\n\t// The paths must be NUL-terminated even though they are counted strings.\n\ttarget16 := utf16.Encode([]rune(rp.Target + \"\\x00\"))\n\tntTarget16 := utf16.Encode([]rune(ntTarget + \"\\x00\"))\n\n\tsize := int(unsafe.Sizeof(reparseDataBuffer{})) - 8\n\tsize += len(ntTarget16)*2 + len(target16)*2\n\n\ttag := uint32(reparseTagMountPoint)\n\tif !rp.IsMountPoint {\n\t\ttag = reparseTagSymlink\n\t\tsize += 4 // Add room for symlink flags\n\t}\n\n\tdata := reparseDataBuffer{\n\t\tReparseTag:           tag,\n\t\tReparseDataLength:    uint16(size),\n\t\tSubstituteNameOffset: 0,\n\t\tSubstituteNameLength: uint16((len(ntTarget16) - 1) * 2),\n\t\tPrintNameOffset:      uint16(len(ntTarget16) * 2),\n\t\tPrintNameLength:      uint16((len(target16) - 1) * 2),\n\t}\n\n\tvar b bytes.Buffer\n\t_ = binary.Write(&b, binary.LittleEndian, &data)\n\tif !rp.IsMountPoint {\n\t\tflags := uint32(0)\n\t\tif relative {\n\t\t\tflags |= 1\n\t\t}\n\t\t_ = binary.Write(&b, binary.LittleEndian, flags)\n\t}\n\n\t_ = binary.Write(&b, binary.LittleEndian, ntTarget16)\n\t_ = binary.Write(&b, binary.LittleEndian, target16)\n\treturn b.Bytes()\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/sd.go",
    "content": "//go:build windows\n// +build windows\n\npackage winio\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\n//sys lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) = advapi32.LookupAccountNameW\n//sys lookupAccountSid(systemName *uint16, sid *byte, name *uint16, nameSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) = advapi32.LookupAccountSidW\n//sys convertSidToStringSid(sid *byte, str **uint16) (err error) = advapi32.ConvertSidToStringSidW\n//sys convertStringSidToSid(str *uint16, sid **byte) (err error) = advapi32.ConvertStringSidToSidW\n\ntype AccountLookupError struct {\n\tName string\n\tErr  error\n}\n\nfunc (e *AccountLookupError) Error() string {\n\tif e.Name == \"\" {\n\t\treturn \"lookup account: empty account name specified\"\n\t}\n\tvar s string\n\tswitch {\n\tcase errors.Is(e.Err, windows.ERROR_INVALID_SID):\n\t\ts = \"the security ID structure is invalid\"\n\tcase errors.Is(e.Err, windows.ERROR_NONE_MAPPED):\n\t\ts = \"not found\"\n\tdefault:\n\t\ts = e.Err.Error()\n\t}\n\treturn \"lookup account \" + e.Name + \": \" + s\n}\n\nfunc (e *AccountLookupError) Unwrap() error { return e.Err }\n\ntype SddlConversionError struct {\n\tSddl string\n\tErr  error\n}\n\nfunc (e *SddlConversionError) Error() string {\n\treturn \"convert \" + e.Sddl + \": \" + e.Err.Error()\n}\n\nfunc (e *SddlConversionError) Unwrap() error { return e.Err }\n\n// LookupSidByName looks up the SID of an account by name\n//\n//revive:disable-next-line:var-naming SID, not Sid\nfunc LookupSidByName(name string) (sid string, err error) {\n\tif name == \"\" {\n\t\treturn \"\", &AccountLookupError{name, windows.ERROR_NONE_MAPPED}\n\t}\n\n\tvar sidSize, sidNameUse, refDomainSize uint32\n\terr = lookupAccountName(nil, name, nil, &sidSize, nil, &refDomainSize, &sidNameUse)\n\tif err != nil && err != windows.ERROR_INSUFFICIENT_BUFFER { //nolint:errorlint // err is Errno\n\t\treturn \"\", &AccountLookupError{name, err}\n\t}\n\tsidBuffer := make([]byte, sidSize)\n\trefDomainBuffer := make([]uint16, refDomainSize)\n\terr = lookupAccountName(nil, name, &sidBuffer[0], &sidSize, &refDomainBuffer[0], &refDomainSize, &sidNameUse)\n\tif err != nil {\n\t\treturn \"\", &AccountLookupError{name, err}\n\t}\n\tvar strBuffer *uint16\n\terr = convertSidToStringSid(&sidBuffer[0], &strBuffer)\n\tif err != nil {\n\t\treturn \"\", &AccountLookupError{name, err}\n\t}\n\tsid = windows.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(strBuffer))[:])\n\t_, _ = windows.LocalFree(windows.Handle(unsafe.Pointer(strBuffer)))\n\treturn sid, nil\n}\n\n// LookupNameBySid looks up the name of an account by SID\n//\n//revive:disable-next-line:var-naming SID, not Sid\nfunc LookupNameBySid(sid string) (name string, err error) {\n\tif sid == \"\" {\n\t\treturn \"\", &AccountLookupError{sid, windows.ERROR_NONE_MAPPED}\n\t}\n\n\tsidBuffer, err := windows.UTF16PtrFromString(sid)\n\tif err != nil {\n\t\treturn \"\", &AccountLookupError{sid, err}\n\t}\n\n\tvar sidPtr *byte\n\tif err = convertStringSidToSid(sidBuffer, &sidPtr); err != nil {\n\t\treturn \"\", &AccountLookupError{sid, err}\n\t}\n\tdefer windows.LocalFree(windows.Handle(unsafe.Pointer(sidPtr))) //nolint:errcheck\n\n\tvar nameSize, refDomainSize, sidNameUse uint32\n\terr = lookupAccountSid(nil, sidPtr, nil, &nameSize, nil, &refDomainSize, &sidNameUse)\n\tif err != nil && err != windows.ERROR_INSUFFICIENT_BUFFER { //nolint:errorlint // err is Errno\n\t\treturn \"\", &AccountLookupError{sid, err}\n\t}\n\n\tnameBuffer := make([]uint16, nameSize)\n\trefDomainBuffer := make([]uint16, refDomainSize)\n\terr = lookupAccountSid(nil, sidPtr, &nameBuffer[0], &nameSize, &refDomainBuffer[0], &refDomainSize, &sidNameUse)\n\tif err != nil {\n\t\treturn \"\", &AccountLookupError{sid, err}\n\t}\n\n\tname = windows.UTF16ToString(nameBuffer)\n\treturn name, nil\n}\n\nfunc SddlToSecurityDescriptor(sddl string) ([]byte, error) {\n\tsd, err := windows.SecurityDescriptorFromString(sddl)\n\tif err != nil {\n\t\treturn nil, &SddlConversionError{Sddl: sddl, Err: err}\n\t}\n\tb := unsafe.Slice((*byte)(unsafe.Pointer(sd)), sd.Length())\n\treturn b, nil\n}\n\nfunc SecurityDescriptorToSddl(sd []byte) (string, error) {\n\tif l := int(unsafe.Sizeof(windows.SECURITY_DESCRIPTOR{})); len(sd) < l {\n\t\treturn \"\", fmt.Errorf(\"SecurityDescriptor (%d) smaller than expected (%d): %w\", len(sd), l, windows.ERROR_INCORRECT_SIZE)\n\t}\n\ts := (*windows.SECURITY_DESCRIPTOR)(unsafe.Pointer(&sd[0]))\n\treturn s.String(), nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/syscall.go",
    "content": "//go:build windows\n\npackage winio\n\n//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go ./*.go\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/vhd/vhd.go",
    "content": "//go:build windows\n// +build windows\n\npackage vhd\n\nimport (\n\t\"fmt\"\n\t\"syscall\"\n\n\t\"github.com/Microsoft/go-winio/pkg/guid\"\n\t\"golang.org/x/sys/windows\"\n)\n\n//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zvhd_windows.go vhd.go\n\n//sys createVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, createVirtualDiskFlags uint32, providerSpecificFlags uint32, parameters *CreateVirtualDiskParameters, overlapped *syscall.Overlapped, handle *syscall.Handle) (win32err error) = virtdisk.CreateVirtualDisk\n//sys openVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, openVirtualDiskFlags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (win32err error) = virtdisk.OpenVirtualDisk\n//sys attachVirtualDisk(handle syscall.Handle, securityDescriptor *uintptr, attachVirtualDiskFlag uint32, providerSpecificFlags uint32, parameters *AttachVirtualDiskParameters, overlapped *syscall.Overlapped) (win32err error) = virtdisk.AttachVirtualDisk\n//sys detachVirtualDisk(handle syscall.Handle, detachVirtualDiskFlags uint32, providerSpecificFlags uint32) (win32err error) = virtdisk.DetachVirtualDisk\n//sys getVirtualDiskPhysicalPath(handle syscall.Handle, diskPathSizeInBytes *uint32, buffer *uint16) (win32err error) = virtdisk.GetVirtualDiskPhysicalPath\n\ntype (\n\tCreateVirtualDiskFlag uint32\n\tVirtualDiskFlag       uint32\n\tAttachVirtualDiskFlag uint32\n\tDetachVirtualDiskFlag uint32\n\tVirtualDiskAccessMask uint32\n)\n\ntype VirtualStorageType struct {\n\tDeviceID uint32\n\tVendorID guid.GUID\n}\n\ntype CreateVersion2 struct {\n\tUniqueID                 guid.GUID\n\tMaximumSize              uint64\n\tBlockSizeInBytes         uint32\n\tSectorSizeInBytes        uint32\n\tPhysicalSectorSizeInByte uint32\n\tParentPath               *uint16 // string\n\tSourcePath               *uint16 // string\n\tOpenFlags                uint32\n\tParentVirtualStorageType VirtualStorageType\n\tSourceVirtualStorageType VirtualStorageType\n\tResiliencyGUID           guid.GUID\n}\n\ntype CreateVirtualDiskParameters struct {\n\tVersion  uint32 // Must always be set to 2\n\tVersion2 CreateVersion2\n}\n\ntype OpenVersion2 struct {\n\tGetInfoOnly    bool\n\tReadOnly       bool\n\tResiliencyGUID guid.GUID\n}\n\ntype OpenVirtualDiskParameters struct {\n\tVersion  uint32 // Must always be set to 2\n\tVersion2 OpenVersion2\n}\n\n// The higher level `OpenVersion2` struct uses `bool`s to refer to `GetInfoOnly` and `ReadOnly` for ease of use. However,\n// the internal windows structure uses `BOOL`s aka int32s for these types. `openVersion2` is used for translating\n// `OpenVersion2` fields to the correct windows internal field types on the `Open____` methods.\ntype openVersion2 struct {\n\tgetInfoOnly    int32\n\treadOnly       int32\n\tresiliencyGUID guid.GUID\n}\n\ntype openVirtualDiskParameters struct {\n\tversion  uint32\n\tversion2 openVersion2\n}\n\ntype AttachVersion2 struct {\n\tRestrictedOffset uint64\n\tRestrictedLength uint64\n}\n\ntype AttachVirtualDiskParameters struct {\n\tVersion  uint32\n\tVersion2 AttachVersion2\n}\n\nconst (\n\t//revive:disable-next-line:var-naming ALL_CAPS\n\tVIRTUAL_STORAGE_TYPE_DEVICE_VHDX = 0x3\n\n\t// Access Mask for opening a VHD.\n\tVirtualDiskAccessNone     VirtualDiskAccessMask = 0x00000000\n\tVirtualDiskAccessAttachRO VirtualDiskAccessMask = 0x00010000\n\tVirtualDiskAccessAttachRW VirtualDiskAccessMask = 0x00020000\n\tVirtualDiskAccessDetach   VirtualDiskAccessMask = 0x00040000\n\tVirtualDiskAccessGetInfo  VirtualDiskAccessMask = 0x00080000\n\tVirtualDiskAccessCreate   VirtualDiskAccessMask = 0x00100000\n\tVirtualDiskAccessMetaOps  VirtualDiskAccessMask = 0x00200000\n\tVirtualDiskAccessRead     VirtualDiskAccessMask = 0x000d0000\n\tVirtualDiskAccessAll      VirtualDiskAccessMask = 0x003f0000\n\tVirtualDiskAccessWritable VirtualDiskAccessMask = 0x00320000\n\n\t// Flags for creating a VHD.\n\tCreateVirtualDiskFlagNone                              CreateVirtualDiskFlag = 0x0\n\tCreateVirtualDiskFlagFullPhysicalAllocation            CreateVirtualDiskFlag = 0x1\n\tCreateVirtualDiskFlagPreventWritesToSourceDisk         CreateVirtualDiskFlag = 0x2\n\tCreateVirtualDiskFlagDoNotCopyMetadataFromParent       CreateVirtualDiskFlag = 0x4\n\tCreateVirtualDiskFlagCreateBackingStorage              CreateVirtualDiskFlag = 0x8\n\tCreateVirtualDiskFlagUseChangeTrackingSourceLimit      CreateVirtualDiskFlag = 0x10\n\tCreateVirtualDiskFlagPreserveParentChangeTrackingState CreateVirtualDiskFlag = 0x20\n\tCreateVirtualDiskFlagVhdSetUseOriginalBackingStorage   CreateVirtualDiskFlag = 0x40 //revive:disable-line:var-naming VHD, not Vhd\n\tCreateVirtualDiskFlagSparseFile                        CreateVirtualDiskFlag = 0x80\n\tCreateVirtualDiskFlagPmemCompatible                    CreateVirtualDiskFlag = 0x100 //revive:disable-line:var-naming PMEM, not Pmem\n\tCreateVirtualDiskFlagSupportCompressedVolumes          CreateVirtualDiskFlag = 0x200\n\n\t// Flags for opening a VHD.\n\tOpenVirtualDiskFlagNone                        VirtualDiskFlag = 0x00000000\n\tOpenVirtualDiskFlagNoParents                   VirtualDiskFlag = 0x00000001\n\tOpenVirtualDiskFlagBlankFile                   VirtualDiskFlag = 0x00000002\n\tOpenVirtualDiskFlagBootDrive                   VirtualDiskFlag = 0x00000004\n\tOpenVirtualDiskFlagCachedIO                    VirtualDiskFlag = 0x00000008\n\tOpenVirtualDiskFlagCustomDiffChain             VirtualDiskFlag = 0x00000010\n\tOpenVirtualDiskFlagParentCachedIO              VirtualDiskFlag = 0x00000020\n\tOpenVirtualDiskFlagVhdsetFileOnly              VirtualDiskFlag = 0x00000040\n\tOpenVirtualDiskFlagIgnoreRelativeParentLocator VirtualDiskFlag = 0x00000080\n\tOpenVirtualDiskFlagNoWriteHardening            VirtualDiskFlag = 0x00000100\n\tOpenVirtualDiskFlagSupportCompressedVolumes    VirtualDiskFlag = 0x00000200\n\n\t// Flags for attaching a VHD.\n\tAttachVirtualDiskFlagNone                          AttachVirtualDiskFlag = 0x00000000\n\tAttachVirtualDiskFlagReadOnly                      AttachVirtualDiskFlag = 0x00000001\n\tAttachVirtualDiskFlagNoDriveLetter                 AttachVirtualDiskFlag = 0x00000002\n\tAttachVirtualDiskFlagPermanentLifetime             AttachVirtualDiskFlag = 0x00000004\n\tAttachVirtualDiskFlagNoLocalHost                   AttachVirtualDiskFlag = 0x00000008\n\tAttachVirtualDiskFlagNoSecurityDescriptor          AttachVirtualDiskFlag = 0x00000010\n\tAttachVirtualDiskFlagBypassDefaultEncryptionPolicy AttachVirtualDiskFlag = 0x00000020\n\tAttachVirtualDiskFlagNonPnp                        AttachVirtualDiskFlag = 0x00000040\n\tAttachVirtualDiskFlagRestrictedRange               AttachVirtualDiskFlag = 0x00000080\n\tAttachVirtualDiskFlagSinglePartition               AttachVirtualDiskFlag = 0x00000100\n\tAttachVirtualDiskFlagRegisterVolume                AttachVirtualDiskFlag = 0x00000200\n\n\t// Flags for detaching a VHD.\n\tDetachVirtualDiskFlagNone DetachVirtualDiskFlag = 0x0\n)\n\n// CreateVhdx is a helper function to create a simple vhdx file at the given path using\n// default values.\n//\n//revive:disable-next-line:var-naming VHDX, not Vhdx\nfunc CreateVhdx(path string, maxSizeInGb, blockSizeInMb uint32) error {\n\tparams := CreateVirtualDiskParameters{\n\t\tVersion: 2,\n\t\tVersion2: CreateVersion2{\n\t\t\tMaximumSize:      uint64(maxSizeInGb) * 1024 * 1024 * 1024,\n\t\t\tBlockSizeInBytes: blockSizeInMb * 1024 * 1024,\n\t\t},\n\t}\n\n\thandle, err := CreateVirtualDisk(path, VirtualDiskAccessNone, CreateVirtualDiskFlagNone, &params)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn syscall.CloseHandle(handle)\n}\n\n// DetachVirtualDisk detaches a virtual hard disk by handle.\nfunc DetachVirtualDisk(handle syscall.Handle) (err error) {\n\tif err := detachVirtualDisk(handle, 0, 0); err != nil {\n\t\treturn fmt.Errorf(\"failed to detach virtual disk: %w\", err)\n\t}\n\treturn nil\n}\n\n// DetachVhd detaches a vhd found at `path`.\n//\n//revive:disable-next-line:var-naming VHD, not Vhd\nfunc DetachVhd(path string) error {\n\thandle, err := OpenVirtualDisk(\n\t\tpath,\n\t\tVirtualDiskAccessNone,\n\t\tOpenVirtualDiskFlagCachedIO|OpenVirtualDiskFlagIgnoreRelativeParentLocator,\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer syscall.CloseHandle(handle) //nolint:errcheck\n\treturn DetachVirtualDisk(handle)\n}\n\n// AttachVirtualDisk attaches a virtual hard disk for use.\nfunc AttachVirtualDisk(\n\thandle syscall.Handle,\n\tattachVirtualDiskFlag AttachVirtualDiskFlag,\n\tparameters *AttachVirtualDiskParameters,\n) (err error) {\n\t// Supports both version 1 and 2 of the attach parameters as version 2 wasn't present in RS5.\n\tif err := attachVirtualDisk(\n\t\thandle,\n\t\tnil,\n\t\tuint32(attachVirtualDiskFlag),\n\t\t0,\n\t\tparameters,\n\t\tnil,\n\t); err != nil {\n\t\treturn fmt.Errorf(\"failed to attach virtual disk: %w\", err)\n\t}\n\treturn nil\n}\n\n// AttachVhd attaches a virtual hard disk at `path` for use. Attaches using version 2\n// of the ATTACH_VIRTUAL_DISK_PARAMETERS.\n//\n//revive:disable-next-line:var-naming VHD, not Vhd\nfunc AttachVhd(path string) (err error) {\n\thandle, err := OpenVirtualDisk(\n\t\tpath,\n\t\tVirtualDiskAccessNone,\n\t\tOpenVirtualDiskFlagCachedIO|OpenVirtualDiskFlagIgnoreRelativeParentLocator,\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdefer syscall.CloseHandle(handle) //nolint:errcheck\n\tparams := AttachVirtualDiskParameters{Version: 2}\n\tif err := AttachVirtualDisk(\n\t\thandle,\n\t\tAttachVirtualDiskFlagNone,\n\t\t&params,\n\t); err != nil {\n\t\treturn fmt.Errorf(\"failed to attach virtual disk: %w\", err)\n\t}\n\treturn nil\n}\n\n// OpenVirtualDisk obtains a handle to a VHD opened with supplied access mask and flags.\nfunc OpenVirtualDisk(\n\tvhdPath string,\n\tvirtualDiskAccessMask VirtualDiskAccessMask,\n\topenVirtualDiskFlags VirtualDiskFlag,\n) (syscall.Handle, error) {\n\tparameters := OpenVirtualDiskParameters{Version: 2}\n\thandle, err := OpenVirtualDiskWithParameters(\n\t\tvhdPath,\n\t\tvirtualDiskAccessMask,\n\t\topenVirtualDiskFlags,\n\t\t&parameters,\n\t)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn handle, nil\n}\n\n// OpenVirtualDiskWithParameters obtains a handle to a VHD opened with supplied access mask, flags and parameters.\nfunc OpenVirtualDiskWithParameters(\n\tvhdPath string,\n\tvirtualDiskAccessMask VirtualDiskAccessMask,\n\topenVirtualDiskFlags VirtualDiskFlag,\n\tparameters *OpenVirtualDiskParameters,\n) (syscall.Handle, error) {\n\tvar (\n\t\thandle      syscall.Handle\n\t\tdefaultType VirtualStorageType\n\t\tgetInfoOnly int32\n\t\treadOnly    int32\n\t)\n\tif parameters.Version != 2 {\n\t\treturn handle, fmt.Errorf(\"only version 2 VHDs are supported, found version: %d\", parameters.Version)\n\t}\n\tif parameters.Version2.GetInfoOnly {\n\t\tgetInfoOnly = 1\n\t}\n\tif parameters.Version2.ReadOnly {\n\t\treadOnly = 1\n\t}\n\tparams := &openVirtualDiskParameters{\n\t\tversion: parameters.Version,\n\t\tversion2: openVersion2{\n\t\t\tgetInfoOnly,\n\t\t\treadOnly,\n\t\t\tparameters.Version2.ResiliencyGUID,\n\t\t},\n\t}\n\tif err := openVirtualDisk(\n\t\t&defaultType,\n\t\tvhdPath,\n\t\tuint32(virtualDiskAccessMask),\n\t\tuint32(openVirtualDiskFlags),\n\t\tparams,\n\t\t&handle,\n\t); err != nil {\n\t\treturn 0, fmt.Errorf(\"failed to open virtual disk: %w\", err)\n\t}\n\treturn handle, nil\n}\n\n// CreateVirtualDisk creates a virtual harddisk and returns a handle to the disk.\nfunc CreateVirtualDisk(\n\tpath string,\n\tvirtualDiskAccessMask VirtualDiskAccessMask,\n\tcreateVirtualDiskFlags CreateVirtualDiskFlag,\n\tparameters *CreateVirtualDiskParameters,\n) (syscall.Handle, error) {\n\tvar (\n\t\thandle      syscall.Handle\n\t\tdefaultType VirtualStorageType\n\t)\n\tif parameters.Version != 2 {\n\t\treturn handle, fmt.Errorf(\"only version 2 VHDs are supported, found version: %d\", parameters.Version)\n\t}\n\n\tif err := createVirtualDisk(\n\t\t&defaultType,\n\t\tpath,\n\t\tuint32(virtualDiskAccessMask),\n\t\tnil,\n\t\tuint32(createVirtualDiskFlags),\n\t\t0,\n\t\tparameters,\n\t\tnil,\n\t\t&handle,\n\t); err != nil {\n\t\treturn handle, fmt.Errorf(\"failed to create virtual disk: %w\", err)\n\t}\n\treturn handle, nil\n}\n\n// GetVirtualDiskPhysicalPath takes a handle to a virtual hard disk and returns the physical\n// path of the disk on the machine. This path is in the form \\\\.\\PhysicalDriveX where X is an integer\n// that represents the particular enumeration of the physical disk on the caller's system.\nfunc GetVirtualDiskPhysicalPath(handle syscall.Handle) (_ string, err error) {\n\tvar (\n\t\tdiskPathSizeInBytes uint32 = 256 * 2 // max path length 256 wide chars\n\t\tdiskPhysicalPathBuf [256]uint16\n\t)\n\tif err := getVirtualDiskPhysicalPath(\n\t\thandle,\n\t\t&diskPathSizeInBytes,\n\t\t&diskPhysicalPathBuf[0],\n\t); err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to get disk physical path: %w\", err)\n\t}\n\treturn windows.UTF16ToString(diskPhysicalPathBuf[:]), nil\n}\n\n// CreateDiffVhd is a helper function to create a differencing virtual disk.\n//\n//revive:disable-next-line:var-naming VHD, not Vhd\nfunc CreateDiffVhd(diffVhdPath, baseVhdPath string, blockSizeInMB uint32) error {\n\t// Setting `ParentPath` is how to signal to create a differencing disk.\n\tcreateParams := &CreateVirtualDiskParameters{\n\t\tVersion: 2,\n\t\tVersion2: CreateVersion2{\n\t\t\tParentPath:       windows.StringToUTF16Ptr(baseVhdPath),\n\t\t\tBlockSizeInBytes: blockSizeInMB * 1024 * 1024,\n\t\t\tOpenFlags:        uint32(OpenVirtualDiskFlagCachedIO),\n\t\t},\n\t}\n\n\tvhdHandle, err := CreateVirtualDisk(\n\t\tdiffVhdPath,\n\t\tVirtualDiskAccessNone,\n\t\tCreateVirtualDiskFlagNone,\n\t\tcreateParams,\n\t)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create differencing vhd: %w\", err)\n\t}\n\tif err := syscall.CloseHandle(vhdHandle); err != nil {\n\t\treturn fmt.Errorf(\"failed to close differencing vhd handle: %w\", err)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/vhd/zvhd_windows.go",
    "content": "//go:build windows\n\n// Code generated by 'go generate' using \"github.com/Microsoft/go-winio/tools/mkwinsyscall\"; DO NOT EDIT.\n\npackage vhd\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\nvar _ unsafe.Pointer\n\n// Do the interface allocations only once for common\n// Errno values.\nconst (\n\terrnoERROR_IO_PENDING = 997\n)\n\nvar (\n\terrERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)\n\terrERROR_EINVAL     error = syscall.EINVAL\n)\n\n// errnoErr returns common boxed Errno values, to prevent\n// allocations at runtime.\nfunc errnoErr(e syscall.Errno) error {\n\tswitch e {\n\tcase 0:\n\t\treturn errERROR_EINVAL\n\tcase errnoERROR_IO_PENDING:\n\t\treturn errERROR_IO_PENDING\n\t}\n\treturn e\n}\n\nvar (\n\tmodvirtdisk = windows.NewLazySystemDLL(\"virtdisk.dll\")\n\n\tprocAttachVirtualDisk          = modvirtdisk.NewProc(\"AttachVirtualDisk\")\n\tprocCreateVirtualDisk          = modvirtdisk.NewProc(\"CreateVirtualDisk\")\n\tprocDetachVirtualDisk          = modvirtdisk.NewProc(\"DetachVirtualDisk\")\n\tprocGetVirtualDiskPhysicalPath = modvirtdisk.NewProc(\"GetVirtualDiskPhysicalPath\")\n\tprocOpenVirtualDisk            = modvirtdisk.NewProc(\"OpenVirtualDisk\")\n)\n\nfunc attachVirtualDisk(handle syscall.Handle, securityDescriptor *uintptr, attachVirtualDiskFlag uint32, providerSpecificFlags uint32, parameters *AttachVirtualDiskParameters, overlapped *syscall.Overlapped) (win32err error) {\n\tr0, _, _ := syscall.SyscallN(procAttachVirtualDisk.Addr(), uintptr(handle), uintptr(unsafe.Pointer(securityDescriptor)), uintptr(attachVirtualDiskFlag), uintptr(providerSpecificFlags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(overlapped)))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc createVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, createVirtualDiskFlags uint32, providerSpecificFlags uint32, parameters *CreateVirtualDiskParameters, overlapped *syscall.Overlapped, handle *syscall.Handle) (win32err error) {\n\tvar _p0 *uint16\n\t_p0, win32err = syscall.UTF16PtrFromString(path)\n\tif win32err != nil {\n\t\treturn\n\t}\n\treturn _createVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, securityDescriptor, createVirtualDiskFlags, providerSpecificFlags, parameters, overlapped, handle)\n}\n\nfunc _createVirtualDisk(virtualStorageType *VirtualStorageType, path *uint16, virtualDiskAccessMask uint32, securityDescriptor *uintptr, createVirtualDiskFlags uint32, providerSpecificFlags uint32, parameters *CreateVirtualDiskParameters, overlapped *syscall.Overlapped, handle *syscall.Handle) (win32err error) {\n\tr0, _, _ := syscall.SyscallN(procCreateVirtualDisk.Addr(), uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(unsafe.Pointer(securityDescriptor)), uintptr(createVirtualDiskFlags), uintptr(providerSpecificFlags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(handle)))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc detachVirtualDisk(handle syscall.Handle, detachVirtualDiskFlags uint32, providerSpecificFlags uint32) (win32err error) {\n\tr0, _, _ := syscall.SyscallN(procDetachVirtualDisk.Addr(), uintptr(handle), uintptr(detachVirtualDiskFlags), uintptr(providerSpecificFlags))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc getVirtualDiskPhysicalPath(handle syscall.Handle, diskPathSizeInBytes *uint32, buffer *uint16) (win32err error) {\n\tr0, _, _ := syscall.SyscallN(procGetVirtualDiskPhysicalPath.Addr(), uintptr(handle), uintptr(unsafe.Pointer(diskPathSizeInBytes)), uintptr(unsafe.Pointer(buffer)))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc openVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, openVirtualDiskFlags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (win32err error) {\n\tvar _p0 *uint16\n\t_p0, win32err = syscall.UTF16PtrFromString(path)\n\tif win32err != nil {\n\t\treturn\n\t}\n\treturn _openVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, openVirtualDiskFlags, parameters, handle)\n}\n\nfunc _openVirtualDisk(virtualStorageType *VirtualStorageType, path *uint16, virtualDiskAccessMask uint32, openVirtualDiskFlags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (win32err error) {\n\tr0, _, _ := syscall.SyscallN(procOpenVirtualDisk.Addr(), uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(openVirtualDiskFlags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(handle)))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/go-winio/zsyscall_windows.go",
    "content": "//go:build windows\n\n// Code generated by 'go generate' using \"github.com/Microsoft/go-winio/tools/mkwinsyscall\"; DO NOT EDIT.\n\npackage winio\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\nvar _ unsafe.Pointer\n\n// Do the interface allocations only once for common\n// Errno values.\nconst (\n\terrnoERROR_IO_PENDING = 997\n)\n\nvar (\n\terrERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)\n\terrERROR_EINVAL     error = syscall.EINVAL\n)\n\n// errnoErr returns common boxed Errno values, to prevent\n// allocations at runtime.\nfunc errnoErr(e syscall.Errno) error {\n\tswitch e {\n\tcase 0:\n\t\treturn errERROR_EINVAL\n\tcase errnoERROR_IO_PENDING:\n\t\treturn errERROR_IO_PENDING\n\t}\n\treturn e\n}\n\nvar (\n\tmodadvapi32 = windows.NewLazySystemDLL(\"advapi32.dll\")\n\tmodkernel32 = windows.NewLazySystemDLL(\"kernel32.dll\")\n\tmodntdll    = windows.NewLazySystemDLL(\"ntdll.dll\")\n\tmodws2_32   = windows.NewLazySystemDLL(\"ws2_32.dll\")\n\n\tprocAdjustTokenPrivileges              = modadvapi32.NewProc(\"AdjustTokenPrivileges\")\n\tprocConvertSidToStringSidW             = modadvapi32.NewProc(\"ConvertSidToStringSidW\")\n\tprocConvertStringSidToSidW             = modadvapi32.NewProc(\"ConvertStringSidToSidW\")\n\tprocImpersonateSelf                    = modadvapi32.NewProc(\"ImpersonateSelf\")\n\tprocLookupAccountNameW                 = modadvapi32.NewProc(\"LookupAccountNameW\")\n\tprocLookupAccountSidW                  = modadvapi32.NewProc(\"LookupAccountSidW\")\n\tprocLookupPrivilegeDisplayNameW        = modadvapi32.NewProc(\"LookupPrivilegeDisplayNameW\")\n\tprocLookupPrivilegeNameW               = modadvapi32.NewProc(\"LookupPrivilegeNameW\")\n\tprocLookupPrivilegeValueW              = modadvapi32.NewProc(\"LookupPrivilegeValueW\")\n\tprocOpenThreadToken                    = modadvapi32.NewProc(\"OpenThreadToken\")\n\tprocRevertToSelf                       = modadvapi32.NewProc(\"RevertToSelf\")\n\tprocBackupRead                         = modkernel32.NewProc(\"BackupRead\")\n\tprocBackupWrite                        = modkernel32.NewProc(\"BackupWrite\")\n\tprocCancelIoEx                         = modkernel32.NewProc(\"CancelIoEx\")\n\tprocConnectNamedPipe                   = modkernel32.NewProc(\"ConnectNamedPipe\")\n\tprocCreateIoCompletionPort             = modkernel32.NewProc(\"CreateIoCompletionPort\")\n\tprocCreateNamedPipeW                   = modkernel32.NewProc(\"CreateNamedPipeW\")\n\tprocDisconnectNamedPipe                = modkernel32.NewProc(\"DisconnectNamedPipe\")\n\tprocGetCurrentThread                   = modkernel32.NewProc(\"GetCurrentThread\")\n\tprocGetNamedPipeHandleStateW           = modkernel32.NewProc(\"GetNamedPipeHandleStateW\")\n\tprocGetNamedPipeInfo                   = modkernel32.NewProc(\"GetNamedPipeInfo\")\n\tprocGetQueuedCompletionStatus          = modkernel32.NewProc(\"GetQueuedCompletionStatus\")\n\tprocSetFileCompletionNotificationModes = modkernel32.NewProc(\"SetFileCompletionNotificationModes\")\n\tprocNtCreateNamedPipeFile              = modntdll.NewProc(\"NtCreateNamedPipeFile\")\n\tprocRtlDefaultNpAcl                    = modntdll.NewProc(\"RtlDefaultNpAcl\")\n\tprocRtlDosPathNameToNtPathName_U       = modntdll.NewProc(\"RtlDosPathNameToNtPathName_U\")\n\tprocRtlNtStatusToDosErrorNoTeb         = modntdll.NewProc(\"RtlNtStatusToDosErrorNoTeb\")\n\tprocWSAGetOverlappedResult             = modws2_32.NewProc(\"WSAGetOverlappedResult\")\n)\n\nfunc adjustTokenPrivileges(token windows.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) {\n\tvar _p0 uint32\n\tif releaseAll {\n\t\t_p0 = 1\n\t}\n\tr0, _, e1 := syscall.SyscallN(procAdjustTokenPrivileges.Addr(), uintptr(token), uintptr(_p0), uintptr(unsafe.Pointer(input)), uintptr(outputSize), uintptr(unsafe.Pointer(output)), uintptr(unsafe.Pointer(requiredSize)))\n\tsuccess = r0 != 0\n\tif true {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc convertSidToStringSid(sid *byte, str **uint16) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procConvertSidToStringSidW.Addr(), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(str)))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc convertStringSidToSid(str *uint16, sid **byte) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procConvertStringSidToSidW.Addr(), uintptr(unsafe.Pointer(str)), uintptr(unsafe.Pointer(sid)))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc impersonateSelf(level uint32) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procImpersonateSelf.Addr(), uintptr(level))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) {\n\tvar _p0 *uint16\n\t_p0, err = syscall.UTF16PtrFromString(accountName)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn _lookupAccountName(systemName, _p0, sid, sidSize, refDomain, refDomainSize, sidNameUse)\n}\n\nfunc _lookupAccountName(systemName *uint16, accountName *uint16, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procLookupAccountNameW.Addr(), uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(accountName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(sidSize)), uintptr(unsafe.Pointer(refDomain)), uintptr(unsafe.Pointer(refDomainSize)), uintptr(unsafe.Pointer(sidNameUse)))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc lookupAccountSid(systemName *uint16, sid *byte, name *uint16, nameSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procLookupAccountSidW.Addr(), uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameSize)), uintptr(unsafe.Pointer(refDomain)), uintptr(unsafe.Pointer(refDomainSize)), uintptr(unsafe.Pointer(sidNameUse)))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) {\n\tvar _p0 *uint16\n\t_p0, err = syscall.UTF16PtrFromString(systemName)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn _lookupPrivilegeDisplayName(_p0, name, buffer, size, languageId)\n}\n\nfunc _lookupPrivilegeDisplayName(systemName *uint16, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procLookupPrivilegeDisplayNameW.Addr(), uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)), uintptr(unsafe.Pointer(languageId)))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc lookupPrivilegeName(systemName string, luid *uint64, buffer *uint16, size *uint32) (err error) {\n\tvar _p0 *uint16\n\t_p0, err = syscall.UTF16PtrFromString(systemName)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn _lookupPrivilegeName(_p0, luid, buffer, size)\n}\n\nfunc _lookupPrivilegeName(systemName *uint16, luid *uint64, buffer *uint16, size *uint32) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procLookupPrivilegeNameW.Addr(), uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(luid)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc lookupPrivilegeValue(systemName string, name string, luid *uint64) (err error) {\n\tvar _p0 *uint16\n\t_p0, err = syscall.UTF16PtrFromString(systemName)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, err = syscall.UTF16PtrFromString(name)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn _lookupPrivilegeValue(_p0, _p1, luid)\n}\n\nfunc _lookupPrivilegeValue(systemName *uint16, name *uint16, luid *uint64) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procLookupPrivilegeValueW.Addr(), uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(luid)))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc openThreadToken(thread windows.Handle, accessMask uint32, openAsSelf bool, token *windows.Token) (err error) {\n\tvar _p0 uint32\n\tif openAsSelf {\n\t\t_p0 = 1\n\t}\n\tr1, _, e1 := syscall.SyscallN(procOpenThreadToken.Addr(), uintptr(thread), uintptr(accessMask), uintptr(_p0), uintptr(unsafe.Pointer(token)))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc revertToSelf() (err error) {\n\tr1, _, e1 := syscall.SyscallN(procRevertToSelf.Addr())\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc backupRead(h windows.Handle, b []byte, bytesRead *uint32, abort bool, processSecurity bool, context *uintptr) (err error) {\n\tvar _p0 *byte\n\tif len(b) > 0 {\n\t\t_p0 = &b[0]\n\t}\n\tvar _p1 uint32\n\tif abort {\n\t\t_p1 = 1\n\t}\n\tvar _p2 uint32\n\tif processSecurity {\n\t\t_p2 = 1\n\t}\n\tr1, _, e1 := syscall.SyscallN(procBackupRead.Addr(), uintptr(h), uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(unsafe.Pointer(bytesRead)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(context)))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc backupWrite(h windows.Handle, b []byte, bytesWritten *uint32, abort bool, processSecurity bool, context *uintptr) (err error) {\n\tvar _p0 *byte\n\tif len(b) > 0 {\n\t\t_p0 = &b[0]\n\t}\n\tvar _p1 uint32\n\tif abort {\n\t\t_p1 = 1\n\t}\n\tvar _p2 uint32\n\tif processSecurity {\n\t\t_p2 = 1\n\t}\n\tr1, _, e1 := syscall.SyscallN(procBackupWrite.Addr(), uintptr(h), uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(unsafe.Pointer(bytesWritten)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(context)))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc cancelIoEx(file windows.Handle, o *windows.Overlapped) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procCancelIoEx.Addr(), uintptr(file), uintptr(unsafe.Pointer(o)))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc connectNamedPipe(pipe windows.Handle, o *windows.Overlapped) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procConnectNamedPipe.Addr(), uintptr(pipe), uintptr(unsafe.Pointer(o)))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc createIoCompletionPort(file windows.Handle, port windows.Handle, key uintptr, threadCount uint32) (newport windows.Handle, err error) {\n\tr0, _, e1 := syscall.SyscallN(procCreateIoCompletionPort.Addr(), uintptr(file), uintptr(port), uintptr(key), uintptr(threadCount))\n\tnewport = windows.Handle(r0)\n\tif newport == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc createNamedPipe(name string, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *windows.SecurityAttributes) (handle windows.Handle, err error) {\n\tvar _p0 *uint16\n\t_p0, err = syscall.UTF16PtrFromString(name)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn _createNamedPipe(_p0, flags, pipeMode, maxInstances, outSize, inSize, defaultTimeout, sa)\n}\n\nfunc _createNamedPipe(name *uint16, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *windows.SecurityAttributes) (handle windows.Handle, err error) {\n\tr0, _, e1 := syscall.SyscallN(procCreateNamedPipeW.Addr(), uintptr(unsafe.Pointer(name)), uintptr(flags), uintptr(pipeMode), uintptr(maxInstances), uintptr(outSize), uintptr(inSize), uintptr(defaultTimeout), uintptr(unsafe.Pointer(sa)))\n\thandle = windows.Handle(r0)\n\tif handle == windows.InvalidHandle {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc disconnectNamedPipe(pipe windows.Handle) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procDisconnectNamedPipe.Addr(), uintptr(pipe))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc getCurrentThread() (h windows.Handle) {\n\tr0, _, _ := syscall.SyscallN(procGetCurrentThread.Addr())\n\th = windows.Handle(r0)\n\treturn\n}\n\nfunc getNamedPipeHandleState(pipe windows.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procGetNamedPipeHandleStateW.Addr(), uintptr(pipe), uintptr(unsafe.Pointer(state)), uintptr(unsafe.Pointer(curInstances)), uintptr(unsafe.Pointer(maxCollectionCount)), uintptr(unsafe.Pointer(collectDataTimeout)), uintptr(unsafe.Pointer(userName)), uintptr(maxUserNameSize))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc getNamedPipeInfo(pipe windows.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procGetNamedPipeInfo.Addr(), uintptr(pipe), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(outSize)), uintptr(unsafe.Pointer(inSize)), uintptr(unsafe.Pointer(maxInstances)))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc getQueuedCompletionStatus(port windows.Handle, bytes *uint32, key *uintptr, o **ioOperation, timeout uint32) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procGetQueuedCompletionStatus.Addr(), uintptr(port), uintptr(unsafe.Pointer(bytes)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(o)), uintptr(timeout))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc setFileCompletionNotificationModes(h windows.Handle, flags uint8) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procSetFileCompletionNotificationModes.Addr(), uintptr(h), uintptr(flags))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc ntCreateNamedPipeFile(pipe *windows.Handle, access ntAccessMask, oa *objectAttributes, iosb *ioStatusBlock, share ntFileShareMode, disposition ntFileCreationDisposition, options ntFileOptions, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntStatus) {\n\tr0, _, _ := syscall.SyscallN(procNtCreateNamedPipeFile.Addr(), uintptr(unsafe.Pointer(pipe)), uintptr(access), uintptr(unsafe.Pointer(oa)), uintptr(unsafe.Pointer(iosb)), uintptr(share), uintptr(disposition), uintptr(options), uintptr(typ), uintptr(readMode), uintptr(completionMode), uintptr(maxInstances), uintptr(inboundQuota), uintptr(outputQuota), uintptr(unsafe.Pointer(timeout)))\n\tstatus = ntStatus(r0)\n\treturn\n}\n\nfunc rtlDefaultNpAcl(dacl *uintptr) (status ntStatus) {\n\tr0, _, _ := syscall.SyscallN(procRtlDefaultNpAcl.Addr(), uintptr(unsafe.Pointer(dacl)))\n\tstatus = ntStatus(r0)\n\treturn\n}\n\nfunc rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntStatus) {\n\tr0, _, _ := syscall.SyscallN(procRtlDosPathNameToNtPathName_U.Addr(), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(ntName)), uintptr(filePart), uintptr(reserved))\n\tstatus = ntStatus(r0)\n\treturn\n}\n\nfunc rtlNtStatusToDosError(status ntStatus) (winerr error) {\n\tr0, _, _ := syscall.SyscallN(procRtlNtStatusToDosErrorNoTeb.Addr(), uintptr(status))\n\tif r0 != 0 {\n\t\twinerr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc wsaGetOverlappedResult(h windows.Handle, o *windows.Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) {\n\tvar _p0 uint32\n\tif wait {\n\t\t_p0 = 1\n\t}\n\tr1, _, e1 := syscall.SyscallN(procWSAGetOverlappedResult.Addr(), uintptr(h), uintptr(unsafe.Pointer(o)), uintptr(unsafe.Pointer(bytes)), uintptr(_p0), uintptr(unsafe.Pointer(flags)))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/.clang-format",
    "content": "Language: Cpp\nBasedOnStyle: Microsoft\nBreakBeforeBraces: Attach\nPointerAlignment: Left\nAllowShortFunctionsOnASingleLine: All\n# match Go style\nIndentCaseLabels: false\n# don't break comments over line limit (needed for CodeQL exceptions)\nReflowComments: false\nInsertNewlineAtEOF: true\nKeepEmptyLines:\n  AtEndOfFile: true\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/.gitattributes",
    "content": "* text=auto eol=lf\nvendor/** -text\ntest/vendor/** -text"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/.gitignore",
    "content": "# Binaries for programs and plugins\n*.exe\n*.dll\n*.so\n*.dylib\n\n# Ignore vscode setting files\n.vscode/\n.idea/\n\n# Test binary, build with `go test -c`\n*.test\n\n# Output of the go coverage tool, specifically when used with LiteIDE\n*.out\n\n# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736\n.glide/\n\n# Ignore gcs bin directory\nservice/bin/\nservice/pkg/\n\n*.img\n*.vhd\n*.tar.gz\n*.tar\n\n# Make stuff\n.rootfs-done\nbin/*\nrootfs/*\nrootfs-conv/*\n*.o\n/build/\n\ndeps/*\nout/*\n\n# protobuf files\n# only files at root of the repo, otherwise this will cause issues with vendoring\n/protobuf/*\n\n# test results\ntest/results\n\n# go workspace files\ngo.work\ngo.work.sum\n\n# keys and related artifacts\n*.pem\n*.cose\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/.golangci.yml",
    "content": "run:\n  timeout: 8m\n  tests: true\n  build-tags:\n    - admin\n    - functional\n    - integration\n\nlinters:\n  enable:\n    # defaults:\n    # - errcheck\n    # - gosimple\n    # - govet\n    # - ineffassign\n    # - staticcheck\n    # - typecheck\n    # - unused\n\n    - errorlint # error wrapping (eg, not using `errors.Is`, using `%s` instead of `%w` in `fmt.Errorf`)\n    - gofmt # whether code was gofmt-ed\n    - govet # enabled by default, but just to be sure\n    - nolintlint # ill-formed or insufficient nolint directives\n    - stylecheck # golint replacement\n    - thelper #  test helpers without t.Helper()\n\nlinters-settings:\n  govet:\n    enable-all: true\n    disable:\n      # struct order is often for Win32 compat\n      # also, ignore pointer bytes/GC issues for now until performance becomes an issue\n      - fieldalignment\n\n  stylecheck:\n    # https://staticcheck.io/docs/checks\n    checks: [\"all\"]\n\nissues:\n  exclude-dirs:\n    # paths are relative to module root\n    - cri-containerd/test-images\n  exclude-rules:\n    # err is very often shadowed in nested scopes\n    - linters:\n        - govet\n      text: '^shadow: declaration of \"err\" shadows declaration'\n\n    # path is relative to module root, which is ./test/\n    - path: cri-containerd\n      linters:\n        - stylecheck\n      text: \"^ST1003: should not use underscores in package names$\"\n      source: \"^package cri_containerd$\"\n\n    # don't bother with propper error wrapping in test code\n    - path: cri-containerd\n      linters:\n        - errorlint\n      text: \"non-wrapping format verb for fmt.Errorf\"\n\n    # This repo has a LOT of generated schema files, operating system bindings, and other\n    # things that ST1003 from stylecheck won't like (screaming case Windows api constants for example).\n    # There's also some structs that we *could* change the initialisms to be Go friendly\n    # (Id -> ID) but they're exported and it would be a breaking change.\n    # This makes it so that most new code, code that isn't supposed to be a pretty faithful\n    # mapping to an OS call/constants, or non-generated code still checks if we're following idioms,\n    # while ignoring the things that are just noise or would be more of a hassle than it'd be worth to change.\n    - path: layer.go\n      linters:\n        - stylecheck\n      text: \"ST1003:\"\n\n    - path: hcsshim.go\n      linters:\n        - stylecheck\n      text: \"ST1003:\"\n\n    - path: cmd\\\\ncproxy\\\\nodenetsvc\\\\\n      linters:\n        - stylecheck\n      text: \"ST1003:\"\n\n    - path: cmd\\\\ncproxy_mock\\\\\n      linters:\n        - stylecheck\n      text: \"ST1003:\"\n\n    - path: internal\\\\hcs\\\\schema2\\\\\n      linters:\n        - stylecheck\n        - gofmt\n\n    - path: internal\\\\wclayer\\\\\n      linters:\n        - stylecheck\n      text: \"ST1003:\"\n\n    - path: hcn\\\\\n      linters:\n        - stylecheck\n      text: \"ST1003:\"\n\n    - path: internal\\\\hcs\\\\schema1\\\\\n      linters:\n        - stylecheck\n      text: \"ST1003:\"\n\n    - path: internal\\\\hns\\\\\n      linters:\n        - stylecheck\n      text: \"ST1003:\"\n\n    - path: ext4\\\\internal\\\\compactext4\\\\\n      linters:\n        - stylecheck\n      text: \"ST1003:\"\n\n    - path: ext4\\\\internal\\\\format\\\\\n      linters:\n        - stylecheck\n      text: \"ST1003:\"\n\n    - path: internal\\\\guestrequest\\\\\n      linters:\n        - stylecheck\n      text: \"ST1003:\"\n\n    - path: internal\\\\guest\\\\prot\\\\\n      linters:\n        - stylecheck\n      text: \"ST1003:\"\n\n    - path: internal\\\\windevice\\\\\n      linters:\n        - stylecheck\n      text: \"ST1003:\"\n\n    - path: internal\\\\winapi\\\\\n      linters:\n        - stylecheck\n      text: \"ST1003:\"\n\n    - path: internal\\\\vmcompute\\\\\n      linters:\n        - stylecheck\n      text: \"ST1003:\"\n\n    - path: internal\\\\regstate\\\\\n      linters:\n        - stylecheck\n      text: \"ST1003:\"\n\n    - path: internal\\\\hcserror\\\\\n      linters:\n        - stylecheck\n      text: \"ST1003:\"\n\n    # v0 APIs are deprecated, but still retained for backwards compatability\n    - path: cmd\\\\ncproxy\\\\\n      linters:\n        - staticcheck\n      text: \"^SA1019: .*(ncproxygrpc|nodenetsvc)[/]?v0\"\n\n    - path: internal\\\\tools\\\\networkagent\n      linters:\n        - staticcheck\n      text: \"^SA1019: .*nodenetsvc[/]?v0\"\n\n    - path: internal\\\\vhdx\\\\info\n      linters:\n        - stylecheck\n      text: \"ST1003:\"\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/CODEOWNERS",
    "content": "* @microsoft/containerplat"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Microsoft\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."
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/Makefile",
    "content": "include Makefile.bootfiles\n\nGO:=go\nGO_FLAGS:=-ldflags \"-s -w\" # strip Go binaries\nCGO_ENABLED:=0\nGOMODVENDOR:=\nKMOD:=0\n\nCFLAGS:=-O2 -Wall\nLDFLAGS:=-static -s #strip C binaries\nLDLIBS:=\nPREPROCESSORFLAGS:=\nifeq \"$(KMOD)\" \"1\"\nLDFLAGS:= -s\nLDLIBS:= -lkmod\nPREPROCESSORFLAGS:=-DMODULES=1\nendif\n\nGO_FLAGS_EXTRA:=\nifeq \"$(GOMODVENDOR)\" \"1\"\nGO_FLAGS_EXTRA += -mod=vendor\nendif\nGO_BUILD_TAGS:=\nifneq ($(strip $(GO_BUILD_TAGS)),)\nGO_FLAGS_EXTRA += -tags=\"$(GO_BUILD_TAGS)\"\nendif\nGO_BUILD:=CGO_ENABLED=$(CGO_ENABLED) $(GO) build $(GO_FLAGS) $(GO_FLAGS_EXTRA)\n\nSRCROOT=$(dir $(abspath $(firstword $(MAKEFILE_LIST))))\n# additional directories to search for rule prerequisites and targets\nVPATH=$(SRCROOT)\n\n# The link aliases for gcstools\nGCS_TOOLS=\\\n\tgenerichook \\\n\tinstall-drivers\n\ntest:\n\tcd $(SRCROOT) && $(GO) test -v ./internal/guest/...\n\n# This target includes utilities which may be useful for testing purposes.\nout/delta-dev.tar.gz: out/delta.tar.gz bin/internal/tools/snp-report\n\trm -rf rootfs-dev\n\tmkdir rootfs-dev\n\ttar -xzf out/delta.tar.gz -C rootfs-dev\n\tcp bin/internal/tools/snp-report rootfs-dev/bin/\n\ttar -zcf $@ -C rootfs-dev .\n\trm -rf rootfs-dev\n\nout/delta-snp.tar.gz: out/delta.tar.gz bin/internal/tools/snp-report boot/startup_v2056.sh boot/startup_simple.sh boot/startup.sh\n\trm -rf rootfs-snp\n\tmkdir rootfs-snp\n\ttar -xzf out/delta.tar.gz -C rootfs-snp\n\tcp boot/startup_v2056.sh rootfs-snp/startup_v2056.sh\n\tcp boot/startup_simple.sh rootfs-snp/startup_simple.sh\n\tcp boot/startup.sh rootfs-snp/startup.sh\n\tcp bin/internal/tools/snp-report rootfs-snp/bin/\n\tchmod a+x rootfs-snp/startup_v2056.sh\n\tchmod a+x rootfs-snp/startup_simple.sh\n\tchmod a+x rootfs-snp/startup.sh\n\ttar -zcf $@ -C rootfs-snp .\n\trm -rf rootfs-snp\n\nout/delta.tar.gz: bin/init bin/vsockexec bin/cmd/gcs bin/cmd/gcstools bin/cmd/hooks/wait-paths Makefile\n\t@mkdir -p out\n\trm -rf rootfs\n\tmkdir -p rootfs/bin/\n\tmkdir -p rootfs/info/\n\tcp bin/init rootfs/\n\tcp bin/vsockexec rootfs/bin/\n\tcp bin/cmd/gcs rootfs/bin/\n\tcp bin/cmd/gcstools rootfs/bin/\n\tcp bin/cmd/hooks/wait-paths rootfs/bin/\n\tfor tool in $(GCS_TOOLS); do ln -s gcstools rootfs/bin/$$tool; done\n\tgit -C $(SRCROOT) rev-parse HEAD > rootfs/info/gcs.commit && \\\n\tgit -C $(SRCROOT) rev-parse --abbrev-ref HEAD > rootfs/info/gcs.branch && \\\n\tdate --iso-8601=minute --utc > rootfs/info/tar.date\n\t$(if $(and $(realpath $(subst .tar,.testdata.json,$(BASE))), $(shell which jq)), \\\n\t\tjq -r '.IMAGE_NAME' $(subst .tar,.testdata.json,$(BASE)) 2>/dev/null > rootfs/info/image.name && \\\n\t\tjq -r '.DATETIME' $(subst .tar,.testdata.json,$(BASE)) 2>/dev/null > rootfs/info/build.date)\n\ttar -zcf $@ -C rootfs .\n\trm -rf rootfs\n\nbin/cmd/gcs bin/cmd/gcstools bin/cmd/hooks/wait-paths bin/cmd/tar2ext4 bin/internal/tools/snp-report:\n\t@mkdir -p $(dir $@)\n\tGOOS=linux $(GO_BUILD) -o $@ $(SRCROOT)/$(@:bin/%=%)\n\nbin/vsockexec: vsockexec/vsockexec.o vsockexec/vsock.o\n\t@mkdir -p bin\n\t$(CC) $(LDFLAGS) -o $@ $^\n\nbin/init: init/init.o vsockexec/vsock.o\n\t@mkdir -p bin\n\t$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)\n\n%.o: %.c\n\t@mkdir -p $(dir $@)\n\t$(CC) $(PREPROCESSORFLAGS) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/Makefile.bootfiles",
    "content": "BASE:=base.tar.gz\nDEV_BUILD:=0\n\nDELTA_TARGET=out/delta.tar.gz\n\nifeq \"$(DEV_BUILD)\" \"1\"\nDELTA_TARGET=out/delta-dev.tar.gz\nendif\n\nifeq \"$(SNP_BUILD)\" \"1\"\nDELTA_TARGET=out/delta-snp.tar.gz\nendif\n\nSRCROOT=$(dir $(abspath $(firstword $(MAKEFILE_LIST))))\n\nPATH_PREFIX:=\n# These have PATH_PREFIX prepended to obtain the full path in recipies e.g. $(PATH_PREFIX)/$(VMGS_TOOL)\nVMGS_TOOL:=\nIGVM_TOOL:=\nKERNEL_PATH:=\nTAR2EXT4_TOOL:=bin/cmd/tar2ext4\n\nROOTFS_DEVICE:=/dev/sda\nHASH_DEVICE:=/dev/sdb\n\n.PHONY: all always rootfs test snp simple\n\n.DEFAULT_GOAL := all\n\nall: out/initrd.img out/rootfs.tar.gz\n\nclean:\n\tfind -name '*.o' -print0 | xargs -0 -r rm\n\trm -rf bin rootfs out\n\nrootfs: out/rootfs.vhd\n\nsnp: out/kernel.vmgs out/rootfs-verity.vhd out/v2056.vmgs out/v2056combined.vmgs\n\nsimple: out/simple.vmgs snp\n\n%.vmgs: %.bin\n\trm -f $@\n\t# du -BM returns the size of the bin file in M, eg 7M. The sed command replaces the M with *1024*1024 and then bc does the math to convert to bytes\n\t$(PATH_PREFIX)/$(VMGS_TOOL) create --filepath $@ --filesize `du -BM $< | sed  \"s/M.*/*1024*1024/\" | bc`\n\t$(PATH_PREFIX)/$(VMGS_TOOL) write --filepath $@ --datapath $< -i=8\n\n# Simplest debug UVM used to test changes to the linux kernel. No dmverity protection. Boots an initramdisk rather than directly booting a vhd disk.\nout/simple.bin: out/initrd.img $(PATH_PREFIX)/$(KERNEL_PATH) boot/startup_simple.sh\n\trm -f $@\n\tpython3 $(PATH_PREFIX)/$(IGVM_TOOL) \\\n\t\t-o $@ \\\n\t\t-kernel $(PATH_PREFIX)/$(KERNEL_PATH) \\\n\t\t-append \"8250_core.nr_uarts=0 panic=-1 debug loglevel=7 rdinit=/startup_simple.sh\" \\\n\t\t-rdinit out/initrd.img \\\n\t\t-vtl 0\n\n# The boot performance is optimized by supplying rootfs as a SCSI attachment. In this case the kernel boots with\n# dm-verity to ensure the integrity. Similar to layer VHDs the verity Merkle tree is appended to ext4 filesystem.\n# It transpires that the /dev/sd* order is not deterministic wrt the scsi device order. Thus build a single userland\n# fs + merkle tree device and boot that.\n#\n# From https://www.kernel.org/doc/html/latest/admin-guide/device-mapper/dm-init.html\n#\n# dm-mod.create=<name>,<uuid>,<minor>,<flags>,<table>[,<table>+][;<name>,<uuid>,<minor>,<flags>,<table>[,<table>+]+]\n#\n# where:\n# <name>          ::= The device name.\n# <uuid>          ::= xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | \"\"\n# <minor>         ::= The device minor number | \"\"\n# <flags>         ::= \"ro\" | \"rw\"\n# <table>         ::= <start_sector> <num_sectors> <target_type> <target_args>\n# <target_type>   ::= \"verity\" | \"linear\" | ... (see list below)\n#\n# From https://docs.kernel.org/admin-guide/device-mapper/verity.html\n# <version> <dev> <hash_dev>\n# <data_block_size> <hash_block_size>\n# <num_data_blocks> <hash_start_block>\n# <algorithm> <digest> <salt>\n# [<#opt_params> <opt_params>]\n#\n# typical igvm tool line once all the macros are expanded\n# python3 /home/user/igvmfile.py -o out/v2056.bin -kernel /hose/user/bzImage -append \"8250_core.nr_uarts=0 panic=-1 debug loglevel=9 ignore_loglevel dev.scsi.logging_level=9411 root=/dev/dm-0 dm-mod.create=\\\"dmverity,,,ro,0 196744 verity 1 /dev/sda /dev/sdb 4096 4096 24593 0 sha256 6d625a306aafdf73125a84388b7bfdd2c3a154bd8d698955f4adffc736bdfd66 b9065c23231f0d8901cc3a68e1d3b8d624213e76d6f9f6d3ccbcb829f9c710ba 1 ignore_corruption\\\" init=/startup_v2056.sh\"  -vtl 0\n#\n# so a kernel command line of:\n# 8250_core.nr_uarts=0 panic=-1 debug loglevel=9 ignore_loglevel dev.scsi.logging_level=9411 root=/dev/dm-0 dm-mod.create=\\\"dmverity,,,ro,0 196744 verity 1 /dev/sda /dev/sdb 4096 4096 24593 0 sha256 6d625a306aafdf73125a84388b7bfdd2c3a154bd8d698955f4adffc736bdfd66 b9065c23231f0d8901cc3a68e1d3b8d624213e76d6f9f6d3ccbcb829f9c710ba 1 ignore_corruption\\\" init=/startup_v2056.sh\n#\n# and a dm-mod.create of:\n# dmverity,,,ro,0 196744 verity 1 /dev/sda /dev/sdb 4096 4096 24593 0 sha256 6d625a306aafdf73125a84388b7bfdd2c3a154bd8d698955f4adffc736bdfd66 b9065c23231f0d8901cc3a68e1d3b8d624213e76d6f9f6d3ccbcb829f9c710ba 1 ignore_corruption\n#\n# which breaks down to:\n#\n# name = \"dmverity\"\n# uuid = \"\"\n# minor = \"\"\n# flags = \"ro\"\n# table = 0 196744 verity \"args\"\n#     start_sector = 0\n#     num_sectors = 196744\n#     target_type = verity\n#     target_args = 1 /dev/sda /dev/sdb 4096 4096 24593 0 sha256 6d625a306aafdf73125a84388b7bfdd2c3a154bd8d698955f4adffc736bdfd66 b9065c23231f0d8901cc3a68e1d3b8d624213e76d6f9f6d3ccbcb829f9c710ba 1 ignore_corruption\n# args:\n#     version               1\n#     dev                   /dev/sda\n#     hash_dev              /dev/sdb\n#     data_block_size       4096\n#     hash_block_size       4096\n#     num_data_blocks       24593\n#     hash_start_block      0\n#     algorithm             sha256\n#     digest                6d625a306aafdf73125a84388b7bfdd2c3a154bd8d698955f4adffc736bdfd66\n#     salt                  b9065c23231f0d8901cc3a68e1d3b8d624213e76d6f9f6d3ccbcb829f9c710ba\n#     opt_params\n#         count = 1\n#         ignore_corruption\n#\n# combined typical (not bigger count of sectors for the whole device)\n# dmverity,,,ro,0 199672 verity 1 /dev/sda /dev/sda 4096 4096 24959 24959 sha256 4aa6e79866ee946ddbd9cddd6554bc6449272942fcc65934326817785a3bd374 adc4956274489c936395bab046a2d476f21ef436e571ba53da2fdf3aee59bf0a\n#\n# A few notes:\n#  - num_sectors is the size of the final (aka target) verity device, i.e. the size of our rootfs excluding the Merkle\n#    tree.\n#  - We don't add verity superblock, so the <hash_start_block> will be exactly at the end of ext4 filesystem and equal\n#    to its size. In the case when verity superblock is present an extra block should be added to the offset value,\n#    i.e. 24959 becomes 24960.\n\n\n# Debug build for use with uvmtester. UVM with dm-verity protected vhd disk mounted directly via the kernel command line.\n# Ignores corruption in dm-verity protected disk. (Use dmesg to see if dm-verity is ignoring data corruption.)\nout/v2056.bin: out/rootfs.vhd out/rootfs.hash.vhd $(PATH_PREFIX)/$(KERNEL_PATH) out/rootfs.hash.datasectors out/rootfs.hash.datablocksize out/rootfs.hash.hashblocksize out/rootfs.hash.datablocks out/rootfs.hash.rootdigest out/rootfs.hash.salt boot/startup_v2056.sh\n\trm -f $@\n\tpython3 $(PATH_PREFIX)/$(IGVM_TOOL) \\\n\t\t-o $@ \\\n\t\t-kernel $(PATH_PREFIX)/$(KERNEL_PATH) \\\n\t\t-append \"8250_core.nr_uarts=0 panic=-1 debug loglevel=9 root=/dev/dm-0 dm-mod.create=\\\"dmverity,,,ro,0 $(shell cat out/rootfs.hash.datasectors) verity 1 $(ROOTFS_DEVICE) $(HASH_DEVICE) $(shell cat out/rootfs.hash.datablocksize) $(shell cat out/rootfs.hash.hashblocksize) $(shell cat out/rootfs.hash.datablocks) $(shell cat out/rootfs.hash.datablocks) sha256 $(shell cat out/rootfs.hash.rootdigest) $(shell cat out/rootfs.hash.salt) 1 ignore_corruption\\\" init=/startup_v2056.sh\" \\\n\t\t-vtl 0\n\nout/v2056combined.bin: out/rootfs-verity.vhd $(PATH_PREFIX)/$(KERNEL_PATH) out/rootfs.hash.datablocksize out/rootfs.hash.hashblocksize out/rootfs.hash.datablocks out/rootfs.hash.rootdigest out/rootfs.hash.salt boot/startup_v2056.sh\n\trm -f $@\n\techo root=/dev/dm-0 dm-mod.create=\\\"dmverity,,,ro,0 $(shell cat out/rootfs.hash.datasectors) verity 1 $(ROOTFS_DEVICE) $(ROOTFS_DEVICE) $(shell cat out/rootfs.hash.datablocksize) $(shell cat out/rootfs.hash.hashblocksize) $(shell cat out/rootfs.hash.datablocks) $(shell cat out/rootfs.hash.datablocks) sha256 $(shell cat out/rootfs.hash.rootdigest) $(shell cat out/rootfs.hash.salt) 1 ignore_corruption\\\"\n\tpython3 $(PATH_PREFIX)/$(IGVM_TOOL) \\\n\t\t-o $@ \\\n\t\t-kernel $(PATH_PREFIX)/$(KERNEL_PATH) \\\n\t\t-append \"8250_core.nr_uarts=0 panic=-1 debug loglevel=9 ignore_loglevel dev.scsi.logging_level=9411 root=/dev/dm-0 dm-mod.create=\\\"dmverity,,,ro,0 $(shell cat out/rootfs.hash.datasectors) verity 1 $(ROOTFS_DEVICE) $(ROOTFS_DEVICE) $(shell cat out/rootfs.hash.datablocksize) $(shell cat out/rootfs.hash.hashblocksize) $(shell cat out/rootfs.hash.datablocks) $(shell cat out/rootfs.hash.datablocks) sha256 $(shell cat out/rootfs.hash.rootdigest) $(shell cat out/rootfs.hash.salt) 1 ignore_corruption\\\" init=/startup_v2056.sh\" \\\n\t\t-vtl 0\n\n# Full UVM with dm-verity protected vhd disk mounted directly via the kernel command line.\nout/kernel.bin: out/rootfs-verity.vhd $(PATH_PREFIX)/$(KERNEL_PATH) out/rootfs.hash.datasectors out/rootfs.hash.datablocksize out/rootfs.hash.hashblocksize out/rootfs.hash.datablocks out/rootfs.hash.rootdigest out/rootfs.hash.salt boot/startup.sh\n\trm -f $@\n\techo root=/dev/dm-0 dm-mod.create=\\\"dmverity,,,ro,0 $(shell cat out/rootfs.hash.datasectors) verity 1 $(ROOTFS_DEVICE) $(ROOTFS_DEVICE) $(shell cat out/rootfs.hash.datablocksize) $(shell cat out/rootfs.hash.hashblocksize) $(shell cat out/rootfs.hash.datablocks) $(shell cat out/rootfs.hash.datablocks) sha256 $(shell cat out/rootfs.hash.rootdigest) $(shell cat out/rootfs.hash.salt)\\\"\n\tpython3 $(PATH_PREFIX)/$(IGVM_TOOL) \\\n\t\t-o $@ \\\n\t\t-kernel $(PATH_PREFIX)/$(KERNEL_PATH) \\\n\t\t-append \"8250_core.nr_uarts=0 panic=-1 debug loglevel=7 root=/dev/dm-0 dm-mod.create=\\\"dmverity,,,ro,0 $(shell cat out/rootfs.hash.datasectors) verity 1 $(ROOTFS_DEVICE) $(ROOTFS_DEVICE) $(shell cat out/rootfs.hash.datablocksize) $(shell cat out/rootfs.hash.hashblocksize) $(shell cat out/rootfs.hash.datablocks) $(shell cat out/rootfs.hash.datablocks) sha256 $(shell cat out/rootfs.hash.rootdigest) $(shell cat out/rootfs.hash.salt)\\\" init=/startup.sh\" \\\n\t\t-vtl 0\n\n# Rule to make a vhd from a file. This is used to create the rootfs.hash.vhd from rootfs.hash.\n%.vhd: % $(TAR2EXT4_TOOL)\n\t$(TAR2EXT4_TOOL) -only-vhd -i $< -o $@\n\n# Rule to make a vhd from an ext4 file. This is used to create the rootfs.vhd from rootfs.ext4.\n%.vhd: %.ext4 $(TAR2EXT4_TOOL)\n\t$(TAR2EXT4_TOOL) -only-vhd -i $< -o $@\n\n%.hash %.hash.info %.hash.datablocks %.hash.rootdigest %hash.datablocksize %.hash.datasectors %.hash.hashblocksize: %.ext4 %.hash.salt\n\tveritysetup format --no-superblock --salt $(shell cat out/rootfs.hash.salt) $< $*.hash > $*.hash.info\n    # Retrieve info required by dm-verity at boot time\n    # Get the blocksize of rootfs\n\tcat $*.hash.info | awk '/^Root hash:/{ print $$3 }' > $*.hash.rootdigest\n\tcat $*.hash.info | awk '/^Salt:/{ print $$2 }' > $*.hash.salt\n\tcat $*.hash.info | awk '/^Data block size:/{ print $$4 }' > $*.hash.datablocksize\n\tcat $*.hash.info | awk '/^Hash block size:/{ print $$4 }' > $*.hash.hashblocksize\n\tcat $*.hash.info | awk '/^Data blocks:/{ print $$3 }' > $*.hash.datablocks\n\techo $$(( $$(cat $*.hash.datablocks) * $$(cat $*.hash.datablocksize) / 512 )) > $*.hash.datasectors\n\nout/rootfs.hash.salt:\n\thexdump -vn32 -e'8/4 \"%08X\" 1 \"\\n\"' /dev/random > $@\n\nout/rootfs.ext4: out/rootfs.tar.gz $(TAR2EXT4_TOOL)\n\tgzip -f -d ./out/rootfs.tar.gz\n\t$(TAR2EXT4_TOOL) -i ./out/rootfs.tar -o $@\n\nout/rootfs-verity.ext4: out/rootfs.ext4 out/rootfs.hash\n\tcp out/rootfs.ext4 $@\n\tcat out/rootfs.hash >> $@\n\nout/rootfs.tar.gz: out/initrd.img\n\trm -rf rootfs-conv\n\tmkdir rootfs-conv\n\tgunzip -c out/initrd.img | (cd rootfs-conv && cpio -imd)\n\ttar -zcf $@ -C rootfs-conv .\n\trm -rf rootfs-conv\n\nout/initrd.img: $(BASE) $(DELTA_TARGET) $(SRCROOT)/hack/catcpio.sh\n\t$(SRCROOT)/hack/catcpio.sh \"$(BASE)\" $(DELTA_TARGET) > out/initrd.img.uncompressed\n\tgzip -c out/initrd.img.uncompressed > $@\n\trm out/initrd.img.uncompressed\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/Protobuild.toml",
    "content": "version = \"2\"\ngenerators = [\"go\", \"go-grpc\"]\n\n# Control protoc include paths.\n[includes]\n  before = [\"./protobuf\"]\n\n  # defaults are \"/usr/local/include\" and \"/usr/include\", which don't exist on Windows.\n  # override defaults to supress errors about non-existant directories.\n  after = []\n\n# This section maps protobuf imports to Go packages.\n[packages]\n  # github.com/containerd/cgroups protofiles still list their go path as \"github.com/containerd/cgroups/cgroup1/stats\"\n  \"github.com/containerd/cgroups/v3/cgroup1/stats/metrics.proto\" = \"github.com/containerd/cgroups/v3/cgroup1/stats\"\n\n[[overrides]]\nprefixes = [\n  \"github.com/Microsoft/hcsshim/internal/shimdiag\",\n  \"github.com/Microsoft/hcsshim/internal/extendedtask\",\n  \"github.com/Microsoft/hcsshim/internal/computeagent\",\n  \"github.com/Microsoft/hcsshim/internal/ncproxyttrpc\",\n  \"github.com/Microsoft/hcsshim/internal/vmservice\",\n]\ngenerators = [\"go\", \"go-ttrpc\"]\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/README.md",
    "content": "# hcsshim\n\n[![Build status](https://github.com/microsoft/hcsshim/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/microsoft/hcsshim/actions?query=branch%3Amaster)\n\nThis package contains the Golang interface for using the Windows [Host Compute Service](https://techcommunity.microsoft.com/t5/containers/introducing-the-host-compute-service-hcs/ba-p/382332) (HCS) to launch and manage [Windows Containers](https://docs.microsoft.com/en-us/virtualization/windowscontainers/about/). It also contains other helpers and functions for managing Windows Containers such as the Golang interface for the Host Network Service (HNS), as well as code for the [guest agent](./internal/guest/README.md) (commonly referred to as the GCS or Guest Compute Service in the codebase) used to support running Linux Hyper-V containers.\n\nIt is primarily used in the [Moby](https://github.com/moby/moby) and [Containerd](https://github.com/containerd/containerd) projects, but it can be freely used by other projects as well.\n\n## Building\n\nWhile this repository can be used as a library of sorts to call the HCS apis, there are a couple binaries built out of the repository as well. The main ones being the Linux guest agent, and an implementation of the [runtime v2 containerd shim api](https://github.com/containerd/containerd/blob/master/runtime/v2/README.md).\n\n### Linux Hyper-V Container Guest Agent\n\nTo build the Linux guest agent itself all that's needed is to set your GOOS to \"Linux\" and build out of ./cmd/gcs.\n\n```powershell\nC:\\> $env:GOOS=\"linux\"\nC:\\> go build .\\cmd\\gcs\\\n```\n\nor on a Linux machine\n\n```sh\n> go build ./cmd/gcs\n```\n\nIf you want it to be packaged inside of a rootfs to boot with alongside all of the other tools then you'll need to provide a rootfs that it can be packaged inside of. An easy way is to export the rootfs of a container.\n\n```sh\ndocker pull busybox\ndocker run --name base_image_container busybox\ndocker export base_image_container | gzip > base.tar.gz\nBASE=./base.tar.gz\nmake all\n```\n\nIf the build is successful, in the `./out` folder you should see:\n\n```sh\n> ls ./out/\ndelta.tar.gz  initrd.img  rootfs.tar.gz\n```\n\n### Containerd Shim\n\nFor info on the [Runtime V2 API](https://github.com/containerd/containerd/blob/main/core/runtime/v2/README.md).\n\nContrary to the typical Linux architecture of shim -> runc, the runhcs shim is used both to launch and manage the lifetime of containers.\n\n```powershell\nC:\\> $env:GOOS=\"windows\"\nC:\\> go build .\\cmd\\containerd-shim-runhcs-v1\n```\n\nThen place the binary in the same directory that Containerd is located at in your environment.\nA default Containerd configuration file can be generated by running:\n\n```powershell\n.\\containerd.exe config default | Out-File \"C:\\Program Files\\containerd\\config.toml\" -Encoding ascii\n```\n\nThis config file will already have the shim set as the default runtime for cri interactions.\n\nTo trial using the shim out with ctr.exe:\n\n```powershell\nC:\\> ctr.exe run --runtime io.containerd.runhcs.v1 --rm mcr.microsoft.com/windows/nanoserver:2004 windows-test cmd /c \"echo Hello World!\"\n```\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to agree to a\nContributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us\nthe rights to use your contribution. For details, visit [Microsoft CLA](https://cla.microsoft.com).\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need to provide\na CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions\nprovided by the bot. You will only need to do this once across all repos using our CLA.\n\nWe require that contributors sign their commits\nto certify they either authored the work themselves or otherwise have permission to use it in this project.\n\nWe also require that contributors sign their commits using  using [`git commit --signoff`][git-commit-s]\nto certify they either authored the work themselves or otherwise have permission to use it in this project.\nA range of commits can be signed off using [`git rebase --signoff`][git-rebase-s].\n\nPlease see  [the developer certificate](https://developercertificate.org) for more info,\nas well as to make sure that you can attest to the rules listed.\nOur CI uses the [DCO Github app](https://github.com/apps/dco) to ensure that all commits in a given PR are signed-off.\n\n### Linting\n\nCode must pass a linting stage, which uses [`golangci-lint`][lint].\nSince `./test` is a separate Go module, the linter is run from both the root and the\n`test` directories. Additionally, the linter is run with `GOOS` set to both `windows` and\n`linux`.\n\nThe linting settings are stored in [`.golangci.yaml`](./.golangci.yaml), and can be run\nautomatically with VSCode by adding the following to your workspace or folder settings:\n\n```json\n    \"go.lintTool\": \"golangci-lint\",\n    \"go.lintOnSave\": \"package\",\n```\n\nAdditional editor [integrations options are also available][lint-ide].\n\nAlternatively, `golangci-lint` can be [installed][lint-install] and run locally:\n\n```shell\n# use . or specify a path to only lint a package\n# to show all lint errors, use flags \"--max-issues-per-linter=0 --max-same-issues=0\"\n> golangci-lint run\n```\n\nTo run across the entire repo for both `GOOS=windows` and `linux`:\n\n```powershell\n> foreach ( $goos in ('windows', 'linux') ) {\n    foreach ( $repo in ('.', 'test') ) {\n        pwsh -Command \"cd $repo && go env -w GOOS=$goos && golangci-lint.exe run --verbose\"\n    }\n}\n```\n\n### Go Generate\n\nThe pipeline checks that auto-generated code, via `go generate`, are up to date.\nSimilar to the [linting stage](#linting), `go generate` is run in both the root and test Go modules.\n\nThis can be done via:\n\n```shell\n> go generate ./...\n> cd test && go generate ./...\n```\n\n## Code of Conduct\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or\ncontact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Dependencies\n\nThis project requires Golang 1.18 or newer to build.\n\nFor system requirements to run this project, see the Microsoft docs on [Windows Container requirements](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/system-requirements).\n\n## Reporting Security Issues\n\nSecurity issues and bugs should be reported privately, via email, to the Microsoft Security\nResponse Center (MSRC) at [secure@microsoft.com](mailto:secure@microsoft.com). You should\nreceive a response within 24 hours. If for some reason you do not, please follow up via\nemail to ensure we received your original message. Further information, including the\n[MSRC PGP](https://technet.microsoft.com/en-us/security/dn606155) key, can be found in\nthe [Security TechCenter](https://technet.microsoft.com/en-us/security/default).\n\nFor additional details, see [Report a Computer Security Vulnerability](https://technet.microsoft.com/en-us/security/ff852094.aspx) on Technet\n\n---------------\nCopyright (c) 2018 Microsoft Corp.  All rights reserved.\n\n[lint]: https://golangci-lint.run/\n[lint-ide]: https://golangci-lint.run/usage/integrations/#editor-integration\n[lint-install]: https://golangci-lint.run/usage/install/#local-installation\n\n[git-commit-s]: https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--s\n[git-rebase-s]: https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---signoff\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/SECURITY.md",
    "content": "<!-- BEGIN MICROSOFT SECURITY.MD V0.0.7 BLOCK -->\n\n## Security\n\nMicrosoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).\n\nIf you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.\n\n## Reporting Security Issues\n\n**Please do not report security vulnerabilities through public GitHub issues.**\n\nInstead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).\n\nIf you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com).  If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).\n\nYou should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). \n\nPlease include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:\n\n  * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)\n  * Full paths of source file(s) related to the manifestation of the issue\n  * The location of the affected source code (tag/branch/commit or direct URL)\n  * Any special configuration required to reproduce the issue\n  * Step-by-step instructions to reproduce the issue\n  * Proof-of-concept or exploit code (if possible)\n  * Impact of the issue, including how an attacker might exploit the issue\n\nThis information will help us triage your report more quickly.\n\nIf you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.\n\n## Preferred Languages\n\nWe prefer all communications to be in English.\n\n## Policy\n\nMicrosoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).\n\n<!-- END MICROSOFT SECURITY.MD BLOCK -->\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/options/doc.go",
    "content": "package options\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/options/runhcs.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.35.2\n// \tprotoc        v5.26.0\n// source: github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/options/runhcs.proto\n\npackage options\n\nimport (\n\tprotoreflect \"google.golang.org/protobuf/reflect/protoreflect\"\n\tprotoimpl \"google.golang.org/protobuf/runtime/protoimpl\"\n\ttimestamppb \"google.golang.org/protobuf/types/known/timestamppb\"\n\treflect \"reflect\"\n\tsync \"sync\"\n)\n\nconst (\n\t// Verify that this generated code is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)\n\t// Verify that runtime/protoimpl is sufficiently up-to-date.\n\t_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)\n)\n\ntype Options_DebugType int32\n\nconst (\n\tOptions_NPIPE Options_DebugType = 0\n\tOptions_FILE  Options_DebugType = 1\n\tOptions_ETW   Options_DebugType = 2\n)\n\n// Enum value maps for Options_DebugType.\nvar (\n\tOptions_DebugType_name = map[int32]string{\n\t\t0: \"NPIPE\",\n\t\t1: \"FILE\",\n\t\t2: \"ETW\",\n\t}\n\tOptions_DebugType_value = map[string]int32{\n\t\t\"NPIPE\": 0,\n\t\t\"FILE\":  1,\n\t\t\"ETW\":   2,\n\t}\n)\n\nfunc (x Options_DebugType) Enum() *Options_DebugType {\n\tp := new(Options_DebugType)\n\t*p = x\n\treturn p\n}\n\nfunc (x Options_DebugType) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (Options_DebugType) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_enumTypes[0].Descriptor()\n}\n\nfunc (Options_DebugType) Type() protoreflect.EnumType {\n\treturn &file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_enumTypes[0]\n}\n\nfunc (x Options_DebugType) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use Options_DebugType.Descriptor instead.\nfunc (Options_DebugType) EnumDescriptor() ([]byte, []int) {\n\treturn file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescGZIP(), []int{0, 0}\n}\n\ntype Options_SandboxIsolation int32\n\nconst (\n\tOptions_PROCESS    Options_SandboxIsolation = 0\n\tOptions_HYPERVISOR Options_SandboxIsolation = 1\n)\n\n// Enum value maps for Options_SandboxIsolation.\nvar (\n\tOptions_SandboxIsolation_name = map[int32]string{\n\t\t0: \"PROCESS\",\n\t\t1: \"HYPERVISOR\",\n\t}\n\tOptions_SandboxIsolation_value = map[string]int32{\n\t\t\"PROCESS\":    0,\n\t\t\"HYPERVISOR\": 1,\n\t}\n)\n\nfunc (x Options_SandboxIsolation) Enum() *Options_SandboxIsolation {\n\tp := new(Options_SandboxIsolation)\n\t*p = x\n\treturn p\n}\n\nfunc (x Options_SandboxIsolation) String() string {\n\treturn protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))\n}\n\nfunc (Options_SandboxIsolation) Descriptor() protoreflect.EnumDescriptor {\n\treturn file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_enumTypes[1].Descriptor()\n}\n\nfunc (Options_SandboxIsolation) Type() protoreflect.EnumType {\n\treturn &file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_enumTypes[1]\n}\n\nfunc (x Options_SandboxIsolation) Number() protoreflect.EnumNumber {\n\treturn protoreflect.EnumNumber(x)\n}\n\n// Deprecated: Use Options_SandboxIsolation.Descriptor instead.\nfunc (Options_SandboxIsolation) EnumDescriptor() ([]byte, []int) {\n\treturn file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescGZIP(), []int{0, 1}\n}\n\n// Options are the set of customizations that can be passed at Create time.\ntype Options struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\t// Enable debug tracing (sets the logrus log level to debug). This may be deprecated in the future, prefer\n\t// log_level as this will override debug if both of them are set.\n\tDebug bool `protobuf:\"varint,1,opt,name=debug,proto3\" json:\"debug,omitempty\"`\n\t// debug tracing output type\n\tDebugType Options_DebugType `protobuf:\"varint,2,opt,name=debug_type,json=debugType,proto3,enum=containerd.runhcs.v1.Options_DebugType\" json:\"debug_type,omitempty\"`\n\t// registry key root for storage of the runhcs container state\n\tRegistryRoot string `protobuf:\"bytes,3,opt,name=registry_root,json=registryRoot,proto3\" json:\"registry_root,omitempty\"`\n\t// sandbox_image is the image to use for the sandbox that matches the\n\t// sandbox_platform.\n\tSandboxImage string `protobuf:\"bytes,4,opt,name=sandbox_image,json=sandboxImage,proto3\" json:\"sandbox_image,omitempty\"`\n\t// sandbox_platform is a CRI setting that specifies the platform\n\t// architecture for all sandbox's in this runtime. Values are\n\t// 'windows/amd64' and 'linux/amd64'.\n\tSandboxPlatform string `protobuf:\"bytes,5,opt,name=sandbox_platform,json=sandboxPlatform,proto3\" json:\"sandbox_platform,omitempty\"`\n\t// sandbox_isolation is a CRI setting that specifies the isolation level of\n\t// the sandbox. For Windows runtime PROCESS and HYPERVISOR are valid. For\n\t// LCOW only HYPERVISOR is valid and default if omitted.\n\tSandboxIsolation Options_SandboxIsolation `protobuf:\"varint,6,opt,name=sandbox_isolation,json=sandboxIsolation,proto3,enum=containerd.runhcs.v1.Options_SandboxIsolation\" json:\"sandbox_isolation,omitempty\"`\n\t// boot_files_root_path is the path to the directory containing the LCOW\n\t// kernel and root FS files.\n\tBootFilesRootPath string `protobuf:\"bytes,7,opt,name=boot_files_root_path,json=bootFilesRootPath,proto3\" json:\"boot_files_root_path,omitempty\"`\n\t// vm_processor_count is the default number of processors to create for the\n\t// hypervisor isolated utility vm.\n\t//\n\t// The platform default if omitted is 2, unless the host only has a single\n\t// core in which case it is 1.\n\tVmProcessorCount int32 `protobuf:\"varint,8,opt,name=vm_processor_count,json=vmProcessorCount,proto3\" json:\"vm_processor_count,omitempty\"`\n\t// vm_memory_size_in_mb is the default amount of memory to assign to the\n\t// hypervisor isolated utility vm.\n\t//\n\t// The platform default is 1024MB if omitted.\n\tVmMemorySizeInMb int32 `protobuf:\"varint,9,opt,name=vm_memory_size_in_mb,json=vmMemorySizeInMb,proto3\" json:\"vm_memory_size_in_mb,omitempty\"`\n\t// GPUVHDPath is the path to the gpu vhd to add to the uvm\n\t// when a container requests a gpu\n\tGPUVHDPath string `protobuf:\"bytes,10,opt,name=GPUVHDPath,proto3\" json:\"GPUVHDPath,omitempty\"`\n\t// scale_cpu_limits_to_sandbox indicates that container CPU limits should\n\t// be adjusted to account for the difference in number of cores between the\n\t// host and UVM.\n\tScaleCpuLimitsToSandbox bool `protobuf:\"varint,11,opt,name=scale_cpu_limits_to_sandbox,json=scaleCpuLimitsToSandbox,proto3\" json:\"scale_cpu_limits_to_sandbox,omitempty\"`\n\t// default_container_scratch_size_in_gb is the default scratch size (sandbox.vhdx)\n\t// to be used for containers. Every container will get a sandbox of `size_in_gb` assigned\n\t// instead of the default of 20GB.\n\tDefaultContainerScratchSizeInGb int32 `protobuf:\"varint,12,opt,name=default_container_scratch_size_in_gb,json=defaultContainerScratchSizeInGb,proto3\" json:\"default_container_scratch_size_in_gb,omitempty\"`\n\t// default_vm_scratch_size_in_gb is the default scratch size (sandbox.vhdx)\n\t// to be used for the UVM. This only applies to WCOW as LCOW doesn't mount a scratch\n\t// specifically for the UVM.\n\tDefaultVmScratchSizeInGb int32 `protobuf:\"varint,13,opt,name=default_vm_scratch_size_in_gb,json=defaultVmScratchSizeInGb,proto3\" json:\"default_vm_scratch_size_in_gb,omitempty\"`\n\t// share_scratch specifies if we'd like to reuse scratch space between multiple containers.\n\t// This currently only affects LCOW. The sandbox containers scratch space is re-used for all\n\t// subsequent containers launched in the pod.\n\tShareScratch bool `protobuf:\"varint,14,opt,name=share_scratch,json=shareScratch,proto3\" json:\"share_scratch,omitempty\"`\n\t// NCProxyAddr is the address of the network configuration proxy service. If omitted\n\t// the network is setup locally.\n\tNCProxyAddr string `protobuf:\"bytes,15,opt,name=NCProxyAddr,proto3\" json:\"NCProxyAddr,omitempty\"`\n\t// log_level specifies the logrus log level for the shim. Supported values are a string representation of the\n\t// logrus log levels: \"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\", \"panic\". This setting will override\n\t// the `debug` field if both are specified, unless the level specified is also \"debug\", as these are equivalent.\n\tLogLevel string `protobuf:\"bytes,16,opt,name=log_level,json=logLevel,proto3\" json:\"log_level,omitempty\"`\n\t// io_retry_timeout_in_sec is the timeout in seconds for how long to try and reconnect to an upstream IO provider if a connection is lost.\n\t// The typical example is if Containerd has restarted but is expected to come back online. A 0 for this field is interpreted as an infinite\n\t// timeout.\n\tIoRetryTimeoutInSec int32 `protobuf:\"varint,17,opt,name=io_retry_timeout_in_sec,json=ioRetryTimeoutInSec,proto3\" json:\"io_retry_timeout_in_sec,omitempty\"`\n\t// default_container_annotations specifies a set of annotations that should be set for every workload container\n\tDefaultContainerAnnotations map[string]string `protobuf:\"bytes,18,rep,name=default_container_annotations,json=defaultContainerAnnotations,proto3\" json:\"default_container_annotations,omitempty\" protobuf_key:\"bytes,1,opt,name=key,proto3\" protobuf_val:\"bytes,2,opt,name=value,proto3\"`\n\t// no_inherit_host_timezone specifies to skip inheriting the hosts time zone for WCOW UVMs and instead default to\n\t// UTC.\n\tNoInheritHostTimezone bool `protobuf:\"varint,19,opt,name=no_inherit_host_timezone,json=noInheritHostTimezone,proto3\" json:\"no_inherit_host_timezone,omitempty\"`\n\t// scrub_logs enables removing environment variables and other potentially sensitive information from logs\n\tScrubLogs bool `protobuf:\"varint,20,opt,name=scrub_logs,json=scrubLogs,proto3\" json:\"scrub_logs,omitempty\"`\n}\n\nfunc (x *Options) Reset() {\n\t*x = Options{}\n\tmi := &file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_msgTypes[0]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *Options) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*Options) ProtoMessage() {}\n\nfunc (x *Options) ProtoReflect() protoreflect.Message {\n\tmi := &file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_msgTypes[0]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use Options.ProtoReflect.Descriptor instead.\nfunc (*Options) Descriptor() ([]byte, []int) {\n\treturn file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescGZIP(), []int{0}\n}\n\nfunc (x *Options) GetDebug() bool {\n\tif x != nil {\n\t\treturn x.Debug\n\t}\n\treturn false\n}\n\nfunc (x *Options) GetDebugType() Options_DebugType {\n\tif x != nil {\n\t\treturn x.DebugType\n\t}\n\treturn Options_NPIPE\n}\n\nfunc (x *Options) GetRegistryRoot() string {\n\tif x != nil {\n\t\treturn x.RegistryRoot\n\t}\n\treturn \"\"\n}\n\nfunc (x *Options) GetSandboxImage() string {\n\tif x != nil {\n\t\treturn x.SandboxImage\n\t}\n\treturn \"\"\n}\n\nfunc (x *Options) GetSandboxPlatform() string {\n\tif x != nil {\n\t\treturn x.SandboxPlatform\n\t}\n\treturn \"\"\n}\n\nfunc (x *Options) GetSandboxIsolation() Options_SandboxIsolation {\n\tif x != nil {\n\t\treturn x.SandboxIsolation\n\t}\n\treturn Options_PROCESS\n}\n\nfunc (x *Options) GetBootFilesRootPath() string {\n\tif x != nil {\n\t\treturn x.BootFilesRootPath\n\t}\n\treturn \"\"\n}\n\nfunc (x *Options) GetVmProcessorCount() int32 {\n\tif x != nil {\n\t\treturn x.VmProcessorCount\n\t}\n\treturn 0\n}\n\nfunc (x *Options) GetVmMemorySizeInMb() int32 {\n\tif x != nil {\n\t\treturn x.VmMemorySizeInMb\n\t}\n\treturn 0\n}\n\nfunc (x *Options) GetGPUVHDPath() string {\n\tif x != nil {\n\t\treturn x.GPUVHDPath\n\t}\n\treturn \"\"\n}\n\nfunc (x *Options) GetScaleCpuLimitsToSandbox() bool {\n\tif x != nil {\n\t\treturn x.ScaleCpuLimitsToSandbox\n\t}\n\treturn false\n}\n\nfunc (x *Options) GetDefaultContainerScratchSizeInGb() int32 {\n\tif x != nil {\n\t\treturn x.DefaultContainerScratchSizeInGb\n\t}\n\treturn 0\n}\n\nfunc (x *Options) GetDefaultVmScratchSizeInGb() int32 {\n\tif x != nil {\n\t\treturn x.DefaultVmScratchSizeInGb\n\t}\n\treturn 0\n}\n\nfunc (x *Options) GetShareScratch() bool {\n\tif x != nil {\n\t\treturn x.ShareScratch\n\t}\n\treturn false\n}\n\nfunc (x *Options) GetNCProxyAddr() string {\n\tif x != nil {\n\t\treturn x.NCProxyAddr\n\t}\n\treturn \"\"\n}\n\nfunc (x *Options) GetLogLevel() string {\n\tif x != nil {\n\t\treturn x.LogLevel\n\t}\n\treturn \"\"\n}\n\nfunc (x *Options) GetIoRetryTimeoutInSec() int32 {\n\tif x != nil {\n\t\treturn x.IoRetryTimeoutInSec\n\t}\n\treturn 0\n}\n\nfunc (x *Options) GetDefaultContainerAnnotations() map[string]string {\n\tif x != nil {\n\t\treturn x.DefaultContainerAnnotations\n\t}\n\treturn nil\n}\n\nfunc (x *Options) GetNoInheritHostTimezone() bool {\n\tif x != nil {\n\t\treturn x.NoInheritHostTimezone\n\t}\n\treturn false\n}\n\nfunc (x *Options) GetScrubLogs() bool {\n\tif x != nil {\n\t\treturn x.ScrubLogs\n\t}\n\treturn false\n}\n\n// ProcessDetails contains additional information about a process. This is the additional\n// info returned in the Pids query.\ntype ProcessDetails struct {\n\tstate         protoimpl.MessageState\n\tsizeCache     protoimpl.SizeCache\n\tunknownFields protoimpl.UnknownFields\n\n\tImageName                    string                 `protobuf:\"bytes,1,opt,name=image_name,json=imageName,proto3\" json:\"image_name,omitempty\"`\n\tCreatedAt                    *timestamppb.Timestamp `protobuf:\"bytes,2,opt,name=created_at,json=createdAt,proto3\" json:\"created_at,omitempty\"`\n\tKernelTime_100Ns             uint64                 `protobuf:\"varint,3,opt,name=kernel_time_100_ns,json=kernelTime100Ns,proto3\" json:\"kernel_time_100_ns,omitempty\"`\n\tMemoryCommitBytes            uint64                 `protobuf:\"varint,4,opt,name=memory_commit_bytes,json=memoryCommitBytes,proto3\" json:\"memory_commit_bytes,omitempty\"`\n\tMemoryWorkingSetPrivateBytes uint64                 `protobuf:\"varint,5,opt,name=memory_working_set_private_bytes,json=memoryWorkingSetPrivateBytes,proto3\" json:\"memory_working_set_private_bytes,omitempty\"`\n\tMemoryWorkingSetSharedBytes  uint64                 `protobuf:\"varint,6,opt,name=memory_working_set_shared_bytes,json=memoryWorkingSetSharedBytes,proto3\" json:\"memory_working_set_shared_bytes,omitempty\"`\n\tProcessID                    uint32                 `protobuf:\"varint,7,opt,name=process_id,json=processId,proto3\" json:\"process_id,omitempty\"`\n\tUserTime_100Ns               uint64                 `protobuf:\"varint,8,opt,name=user_time_100_ns,json=userTime100Ns,proto3\" json:\"user_time_100_ns,omitempty\"`\n\tExecID                       string                 `protobuf:\"bytes,9,opt,name=exec_id,json=execId,proto3\" json:\"exec_id,omitempty\"`\n}\n\nfunc (x *ProcessDetails) Reset() {\n\t*x = ProcessDetails{}\n\tmi := &file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_msgTypes[1]\n\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\tms.StoreMessageInfo(mi)\n}\n\nfunc (x *ProcessDetails) String() string {\n\treturn protoimpl.X.MessageStringOf(x)\n}\n\nfunc (*ProcessDetails) ProtoMessage() {}\n\nfunc (x *ProcessDetails) ProtoReflect() protoreflect.Message {\n\tmi := &file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_msgTypes[1]\n\tif x != nil {\n\t\tms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))\n\t\tif ms.LoadMessageInfo() == nil {\n\t\t\tms.StoreMessageInfo(mi)\n\t\t}\n\t\treturn ms\n\t}\n\treturn mi.MessageOf(x)\n}\n\n// Deprecated: Use ProcessDetails.ProtoReflect.Descriptor instead.\nfunc (*ProcessDetails) Descriptor() ([]byte, []int) {\n\treturn file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescGZIP(), []int{1}\n}\n\nfunc (x *ProcessDetails) GetImageName() string {\n\tif x != nil {\n\t\treturn x.ImageName\n\t}\n\treturn \"\"\n}\n\nfunc (x *ProcessDetails) GetCreatedAt() *timestamppb.Timestamp {\n\tif x != nil {\n\t\treturn x.CreatedAt\n\t}\n\treturn nil\n}\n\nfunc (x *ProcessDetails) GetKernelTime_100Ns() uint64 {\n\tif x != nil {\n\t\treturn x.KernelTime_100Ns\n\t}\n\treturn 0\n}\n\nfunc (x *ProcessDetails) GetMemoryCommitBytes() uint64 {\n\tif x != nil {\n\t\treturn x.MemoryCommitBytes\n\t}\n\treturn 0\n}\n\nfunc (x *ProcessDetails) GetMemoryWorkingSetPrivateBytes() uint64 {\n\tif x != nil {\n\t\treturn x.MemoryWorkingSetPrivateBytes\n\t}\n\treturn 0\n}\n\nfunc (x *ProcessDetails) GetMemoryWorkingSetSharedBytes() uint64 {\n\tif x != nil {\n\t\treturn x.MemoryWorkingSetSharedBytes\n\t}\n\treturn 0\n}\n\nfunc (x *ProcessDetails) GetProcessID() uint32 {\n\tif x != nil {\n\t\treturn x.ProcessID\n\t}\n\treturn 0\n}\n\nfunc (x *ProcessDetails) GetUserTime_100Ns() uint64 {\n\tif x != nil {\n\t\treturn x.UserTime_100Ns\n\t}\n\treturn 0\n}\n\nfunc (x *ProcessDetails) GetExecID() string {\n\tif x != nil {\n\t\treturn x.ExecID\n\t}\n\treturn \"\"\n}\n\nvar File_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto protoreflect.FileDescriptor\n\nvar file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDesc = []byte{\n\t0x0a, 0x4f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x69, 0x63,\n\t0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2f, 0x68, 0x63, 0x73, 0x73, 0x68, 0x69, 0x6d, 0x2f, 0x63,\n\t0x6d, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2d, 0x73, 0x68,\n\t0x69, 0x6d, 0x2d, 0x72, 0x75, 0x6e, 0x68, 0x63, 0x73, 0x2d, 0x76, 0x31, 0x2f, 0x6f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x75, 0x6e, 0x68, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74,\n\t0x6f, 0x12, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75,\n\t0x6e, 0x68, 0x63, 0x73, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,\n\t0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,\n\t0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd9, 0x09, 0x0a, 0x07, 0x4f, 0x70, 0x74,\n\t0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x62, 0x75, 0x67, 0x18, 0x01, 0x20,\n\t0x01, 0x28, 0x08, 0x52, 0x05, 0x64, 0x65, 0x62, 0x75, 0x67, 0x12, 0x46, 0x0a, 0x0a, 0x64, 0x65,\n\t0x62, 0x75, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27,\n\t0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75, 0x6e, 0x68,\n\t0x63, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65,\n\t0x62, 0x75, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x64, 0x65, 0x62, 0x75, 0x67, 0x54, 0x79,\n\t0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x72,\n\t0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x67, 0x69, 0x73,\n\t0x74, 0x72, 0x79, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62,\n\t0x6f, 0x78, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,\n\t0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x10,\n\t0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,\n\t0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x50,\n\t0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x5b, 0x0a, 0x11, 0x73, 0x61, 0x6e, 0x64, 0x62,\n\t0x6f, 0x78, 0x5f, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01,\n\t0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e,\n\t0x72, 0x75, 0x6e, 0x68, 0x63, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,\n\t0x73, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x69,\n\t0x6f, 0x6e, 0x52, 0x10, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x73, 0x6f, 0x6c, 0x61,\n\t0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x14, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x66, 0x69, 0x6c,\n\t0x65, 0x73, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01,\n\t0x28, 0x09, 0x52, 0x11, 0x62, 0x6f, 0x6f, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6f, 0x6f,\n\t0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x2c, 0x0a, 0x12, 0x76, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x63,\n\t0x65, 0x73, 0x73, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28,\n\t0x05, 0x52, 0x10, 0x76, 0x6d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x43, 0x6f,\n\t0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x14, 0x76, 0x6d, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79,\n\t0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x6d, 0x62, 0x18, 0x09, 0x20, 0x01, 0x28,\n\t0x05, 0x52, 0x10, 0x76, 0x6d, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x49,\n\t0x6e, 0x4d, 0x62, 0x12, 0x1e, 0x0a, 0x0a, 0x47, 0x50, 0x55, 0x56, 0x48, 0x44, 0x50, 0x61, 0x74,\n\t0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x47, 0x50, 0x55, 0x56, 0x48, 0x44, 0x50,\n\t0x61, 0x74, 0x68, 0x12, 0x3c, 0x0a, 0x1b, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x63, 0x70, 0x75,\n\t0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x61, 0x6e, 0x64, 0x62,\n\t0x6f, 0x78, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x43,\n\t0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x54, 0x6f, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f,\n\t0x78, 0x12, 0x4d, 0x0a, 0x24, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6f, 0x6e,\n\t0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x72, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73,\n\t0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x67, 0x62, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52,\n\t0x1f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,\n\t0x72, 0x53, 0x63, 0x72, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x47, 0x62,\n\t0x12, 0x3f, 0x0a, 0x1d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x6d, 0x5f, 0x73,\n\t0x63, 0x72, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x67,\n\t0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,\n\t0x56, 0x6d, 0x53, 0x63, 0x72, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x47,\n\t0x62, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x68, 0x61, 0x72, 0x65, 0x5f, 0x73, 0x63, 0x72, 0x61, 0x74,\n\t0x63, 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x73, 0x68, 0x61, 0x72, 0x65, 0x53,\n\t0x63, 0x72, 0x61, 0x74, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x4e, 0x43, 0x50, 0x72, 0x6f, 0x78,\n\t0x79, 0x41, 0x64, 0x64, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4e, 0x43, 0x50,\n\t0x72, 0x6f, 0x78, 0x79, 0x41, 0x64, 0x64, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f,\n\t0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x67,\n\t0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x34, 0x0a, 0x17, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x74, 0x72,\n\t0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x65, 0x63,\n\t0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x69, 0x6f, 0x52, 0x65, 0x74, 0x72, 0x79, 0x54,\n\t0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x49, 0x6e, 0x53, 0x65, 0x63, 0x12, 0x82, 0x01, 0x0a, 0x1d,\n\t0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,\n\t0x72, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x12, 0x20,\n\t0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64,\n\t0x2e, 0x72, 0x75, 0x6e, 0x68, 0x63, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f,\n\t0x6e, 0x73, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69,\n\t0x6e, 0x65, 0x72, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e,\n\t0x74, 0x72, 0x79, 0x52, 0x1b, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x74,\n\t0x61, 0x69, 0x6e, 0x65, 0x72, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,\n\t0x12, 0x37, 0x0a, 0x18, 0x6e, 0x6f, 0x5f, 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x5f, 0x68,\n\t0x6f, 0x73, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x13, 0x20, 0x01,\n\t0x28, 0x08, 0x52, 0x15, 0x6e, 0x6f, 0x49, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x48, 0x6f, 0x73,\n\t0x74, 0x54, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72,\n\t0x75, 0x62, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73,\n\t0x63, 0x72, 0x75, 0x62, 0x4c, 0x6f, 0x67, 0x73, 0x1a, 0x4e, 0x0a, 0x20, 0x44, 0x65, 0x66, 0x61,\n\t0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x41, 0x6e, 0x6e, 0x6f,\n\t0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,\n\t0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14,\n\t0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76,\n\t0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x29, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75,\n\t0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x50, 0x49, 0x50, 0x45, 0x10, 0x00,\n\t0x12, 0x08, 0x0a, 0x04, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x54,\n\t0x57, 0x10, 0x02, 0x22, 0x2f, 0x0a, 0x10, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x73,\n\t0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x4f, 0x43, 0x45,\n\t0x53, 0x53, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x48, 0x59, 0x50, 0x45, 0x52, 0x56, 0x49, 0x53,\n\t0x4f, 0x52, 0x10, 0x01, 0x22, 0xb6, 0x03, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73,\n\t0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65,\n\t0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6d, 0x61,\n\t0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,\n\t0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,\n\t0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d,\n\t0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41,\n\t0x74, 0x12, 0x2b, 0x0a, 0x12, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65,\n\t0x5f, 0x31, 0x30, 0x30, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x6b,\n\t0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x31, 0x30, 0x30, 0x4e, 0x73, 0x12, 0x2e,\n\t0x0a, 0x13, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f,\n\t0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x6d, 0x65, 0x6d,\n\t0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x46,\n\t0x0a, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67,\n\t0x5f, 0x73, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74,\n\t0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79,\n\t0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74,\n\t0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x1f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79,\n\t0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61,\n\t0x72, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52,\n\t0x1b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x65,\n\t0x74, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a,\n\t0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d,\n\t0x52, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x10, 0x75,\n\t0x73, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x31, 0x30, 0x30, 0x5f, 0x6e, 0x73, 0x18,\n\t0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x31,\n\t0x30, 0x30, 0x4e, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x69, 0x64, 0x18,\n\t0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x78, 0x65, 0x63, 0x49, 0x64, 0x42, 0x44, 0x5a,\n\t0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x69, 0x63, 0x72,\n\t0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2f, 0x68, 0x63, 0x73, 0x73, 0x68, 0x69, 0x6d, 0x2f, 0x63, 0x6d,\n\t0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2d, 0x73, 0x68, 0x69,\n\t0x6d, 0x2d, 0x72, 0x75, 0x6e, 0x68, 0x63, 0x73, 0x2d, 0x76, 0x31, 0x2f, 0x6f, 0x70, 0x74, 0x69,\n\t0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,\n}\n\nvar (\n\tfile_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescOnce sync.Once\n\tfile_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescData = file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDesc\n)\n\nfunc file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescGZIP() []byte {\n\tfile_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescOnce.Do(func() {\n\t\tfile_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescData)\n\t})\n\treturn file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescData\n}\n\nvar file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_enumTypes = make([]protoimpl.EnumInfo, 2)\nvar file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_msgTypes = make([]protoimpl.MessageInfo, 3)\nvar file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_goTypes = []any{\n\t(Options_DebugType)(0),        // 0: containerd.runhcs.v1.Options.DebugType\n\t(Options_SandboxIsolation)(0), // 1: containerd.runhcs.v1.Options.SandboxIsolation\n\t(*Options)(nil),               // 2: containerd.runhcs.v1.Options\n\t(*ProcessDetails)(nil),        // 3: containerd.runhcs.v1.ProcessDetails\n\tnil,                           // 4: containerd.runhcs.v1.Options.DefaultContainerAnnotationsEntry\n\t(*timestamppb.Timestamp)(nil), // 5: google.protobuf.Timestamp\n}\nvar file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_depIdxs = []int32{\n\t0, // 0: containerd.runhcs.v1.Options.debug_type:type_name -> containerd.runhcs.v1.Options.DebugType\n\t1, // 1: containerd.runhcs.v1.Options.sandbox_isolation:type_name -> containerd.runhcs.v1.Options.SandboxIsolation\n\t4, // 2: containerd.runhcs.v1.Options.default_container_annotations:type_name -> containerd.runhcs.v1.Options.DefaultContainerAnnotationsEntry\n\t5, // 3: containerd.runhcs.v1.ProcessDetails.created_at:type_name -> google.protobuf.Timestamp\n\t4, // [4:4] is the sub-list for method output_type\n\t4, // [4:4] is the sub-list for method input_type\n\t4, // [4:4] is the sub-list for extension type_name\n\t4, // [4:4] is the sub-list for extension extendee\n\t0, // [0:4] is the sub-list for field type_name\n}\n\nfunc init() {\n\tfile_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_init()\n}\nfunc file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_init() {\n\tif File_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto != nil {\n\t\treturn\n\t}\n\ttype x struct{}\n\tout := protoimpl.TypeBuilder{\n\t\tFile: protoimpl.DescBuilder{\n\t\t\tGoPackagePath: reflect.TypeOf(x{}).PkgPath(),\n\t\t\tRawDescriptor: file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDesc,\n\t\t\tNumEnums:      2,\n\t\t\tNumMessages:   3,\n\t\t\tNumExtensions: 0,\n\t\t\tNumServices:   0,\n\t\t},\n\t\tGoTypes:           file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_goTypes,\n\t\tDependencyIndexes: file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_depIdxs,\n\t\tEnumInfos:         file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_enumTypes,\n\t\tMessageInfos:      file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_msgTypes,\n\t}.Build()\n\tFile_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto = out.File\n\tfile_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDesc = nil\n\tfile_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_goTypes = nil\n\tfile_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_depIdxs = nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/options/runhcs.proto",
    "content": "syntax = \"proto3\";\n\npackage containerd.runhcs.v1;\n\nimport \"google/protobuf/timestamp.proto\";\n\noption go_package = \"github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/options\";\n\n// Options are the set of customizations that can be passed at Create time.\nmessage Options {\n\t// Enable debug tracing (sets the logrus log level to debug). This may be deprecated in the future, prefer\n\t// log_level as this will override debug if both of them are set.\n\tbool debug = 1;\n\n\tenum DebugType {\n\t\tNPIPE = 0;\n\t\tFILE = 1;\n\t\tETW = 2;\n\t}\n\n\t// debug tracing output type\n\tDebugType debug_type = 2;\n\n\t// registry key root for storage of the runhcs container state\n\tstring registry_root = 3;\n\n\t// sandbox_image is the image to use for the sandbox that matches the\n\t// sandbox_platform.\n\tstring sandbox_image = 4;\n\n\t// sandbox_platform is a CRI setting that specifies the platform\n\t// architecture for all sandbox's in this runtime. Values are\n\t// 'windows/amd64' and 'linux/amd64'.\n\tstring sandbox_platform = 5;\n\n\tenum SandboxIsolation {\n\t\tPROCESS = 0;\n\t\tHYPERVISOR = 1;\n\t}\n\n\t// sandbox_isolation is a CRI setting that specifies the isolation level of\n\t// the sandbox. For Windows runtime PROCESS and HYPERVISOR are valid. For\n\t// LCOW only HYPERVISOR is valid and default if omitted.\n\tSandboxIsolation sandbox_isolation = 6;\n\n\t// boot_files_root_path is the path to the directory containing the LCOW\n\t// kernel and root FS files.\n\tstring boot_files_root_path = 7;\n\n\t// vm_processor_count is the default number of processors to create for the\n\t// hypervisor isolated utility vm.\n\t//\n\t// The platform default if omitted is 2, unless the host only has a single\n\t// core in which case it is 1.\n\tint32 vm_processor_count = 8;\n\n\t// vm_memory_size_in_mb is the default amount of memory to assign to the\n\t// hypervisor isolated utility vm.\n\t//\n\t// The platform default is 1024MB if omitted.\n\tint32 vm_memory_size_in_mb = 9;\n\n\t// GPUVHDPath is the path to the gpu vhd to add to the uvm\n\t// when a container requests a gpu\n\tstring GPUVHDPath = 10;\n\n\t// scale_cpu_limits_to_sandbox indicates that container CPU limits should\n\t// be adjusted to account for the difference in number of cores between the\n\t// host and UVM.\n\tbool scale_cpu_limits_to_sandbox = 11;\n\n\t// default_container_scratch_size_in_gb is the default scratch size (sandbox.vhdx)\n\t// to be used for containers. Every container will get a sandbox of `size_in_gb` assigned\n\t// instead of the default of 20GB.\n\tint32 default_container_scratch_size_in_gb = 12;\n\n\t// default_vm_scratch_size_in_gb is the default scratch size (sandbox.vhdx)\n\t// to be used for the UVM. This only applies to WCOW as LCOW doesn't mount a scratch\n\t// specifically for the UVM.\n\tint32 default_vm_scratch_size_in_gb = 13;\n\n\t// share_scratch specifies if we'd like to reuse scratch space between multiple containers.\n\t// This currently only affects LCOW. The sandbox containers scratch space is re-used for all\n\t// subsequent containers launched in the pod.\n\tbool share_scratch = 14;\n\n\t// NCProxyAddr is the address of the network configuration proxy service. If omitted\n\t// the network is setup locally.\n\tstring NCProxyAddr = 15;\n\n\t// log_level specifies the logrus log level for the shim. Supported values are a string representation of the\n\t// logrus log levels: \"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\", \"panic\". This setting will override\n\t// the `debug` field if both are specified, unless the level specified is also \"debug\", as these are equivalent.\n\tstring log_level = 16;\n\n\t// io_retry_timeout_in_sec is the timeout in seconds for how long to try and reconnect to an upstream IO provider if a connection is lost.\n\t// The typical example is if Containerd has restarted but is expected to come back online. A 0 for this field is interpreted as an infinite\n\t// timeout.\n\tint32 io_retry_timeout_in_sec = 17;\n\n\t// default_container_annotations specifies a set of annotations that should be set for every workload container\n\tmap<string, string> default_container_annotations = 18;\n\n\t// no_inherit_host_timezone specifies to skip inheriting the hosts time zone for WCOW UVMs and instead default to\n\t// UTC.\n\tbool no_inherit_host_timezone = 19;\n\n\t// scrub_logs enables removing environment variables and other potentially sensitive information from logs\n\tbool scrub_logs = 20;\n}\n\n// ProcessDetails contains additional information about a process. This is the additional\n// info returned in the Pids query.\nmessage ProcessDetails {\n\tstring image_name = 1;\n\tgoogle.protobuf.Timestamp created_at = 2;\n\tuint64 kernel_time_100_ns = 3;\n\tuint64 memory_commit_bytes = 4;\n\tuint64 memory_working_set_private_bytes = 5;\n\tuint64 memory_working_set_shared_bytes = 6;\n\tuint32 process_id = 7;\n\tuint64 user_time_100_ns = 8;\n\tstring exec_id = 9;\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/computestorage/attach.go",
    "content": "//go:build windows\n\npackage computestorage\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"github.com/pkg/errors\"\n\t\"go.opencensus.io/trace\"\n)\n\n// AttachLayerStorageFilter sets up the layer storage filter on a writable\n// container layer.\n//\n// `layerPath` is a path to a directory the writable layer is mounted. If the\n// path does not end in a `\\` the platform will append it automatically.\n//\n// `layerData` is the parent read-only layer data.\nfunc AttachLayerStorageFilter(ctx context.Context, layerPath string, layerData LayerData) (err error) {\n\ttitle := \"hcsshim::AttachLayerStorageFilter\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"layerPath\", layerPath),\n\t)\n\n\tbytes, err := json.Marshal(layerData)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = hcsAttachLayerStorageFilter(layerPath, string(bytes))\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"failed to attach layer storage filter\")\n\t}\n\treturn nil\n}\n\n// AttachOverlayFilter sets up a filter of the given type on a writable container layer.  Currently the only\n// supported filter types are WCIFS & UnionFS (defined in internal/hcs/schema2/layer.go)\n//\n// `volumePath` is volume path at which writable layer is mounted. If the\n// path does not end in a `\\` the platform will append it automatically.\n//\n// `layerData` is the parent read-only layer data.\nfunc AttachOverlayFilter(ctx context.Context, volumePath string, layerData LayerData) (err error) {\n\ttitle := \"hcsshim::AttachOverlayFilter\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"volumePath\", volumePath),\n\t)\n\n\tbytes, err := json.Marshal(layerData)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = hcsAttachOverlayFilter(volumePath, string(bytes))\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"failed to attach overlay filter\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/computestorage/destroy.go",
    "content": "//go:build windows\n\npackage computestorage\n\nimport (\n\t\"context\"\n\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"github.com/pkg/errors\"\n\t\"go.opencensus.io/trace\"\n)\n\n// DestroyLayer deletes a container layer.\n//\n// `layerPath` is a path to a directory containing the layer to export.\nfunc DestroyLayer(ctx context.Context, layerPath string) (err error) {\n\ttitle := \"hcsshim::DestroyLayer\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"layerPath\", layerPath))\n\n\terr = hcsDestroyLayer(layerPath)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"failed to destroy layer\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/computestorage/detach.go",
    "content": "//go:build windows\n\npackage computestorage\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\n\thcsschema \"github.com/Microsoft/hcsshim/internal/hcs/schema2\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"github.com/pkg/errors\"\n\t\"go.opencensus.io/trace\"\n)\n\n// DetachLayerStorageFilter detaches the layer storage filter on a writable container layer.\n//\n// `layerPath` is a path to a directory containing the layer to export.\nfunc DetachLayerStorageFilter(ctx context.Context, layerPath string) (err error) {\n\ttitle := \"hcsshim::DetachLayerStorageFilter\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"layerPath\", layerPath))\n\n\terr = hcsDetachLayerStorageFilter(layerPath)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"failed to detach layer storage filter\")\n\t}\n\treturn nil\n}\n\n// DetachOverlayFilter detaches the filter on a writable container layer.\n//\n// `volumePath` is a path to writable container volume.\nfunc DetachOverlayFilter(ctx context.Context, volumePath string, filterType hcsschema.FileSystemFilterType) (err error) {\n\ttitle := \"hcsshim::DetachOverlayFilter\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"volumePath\", volumePath))\n\n\tlayerData := LayerData{}\n\tlayerData.FilterType = filterType\n\tbytes, err := json.Marshal(layerData)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = hcsDetachOverlayFilter(volumePath, string(bytes))\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"failed to detach overlay filter\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/computestorage/export.go",
    "content": "//go:build windows\n\npackage computestorage\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"github.com/pkg/errors\"\n\t\"go.opencensus.io/trace\"\n)\n\n// ExportLayer exports a container layer.\n//\n// `layerPath` is a path to a directory containing the layer to export.\n//\n// `exportFolderPath` is a pre-existing folder to export the layer to.\n//\n// `layerData` is the parent layer data.\n//\n// `options` are the export options applied to the exported layer.\nfunc ExportLayer(ctx context.Context, layerPath, exportFolderPath string, layerData LayerData, options ExportLayerOptions) (err error) {\n\ttitle := \"hcsshim::ExportLayer\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"layerPath\", layerPath),\n\t\ttrace.StringAttribute(\"exportFolderPath\", exportFolderPath),\n\t)\n\n\tldBytes, err := json.Marshal(layerData)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\toBytes, err := json.Marshal(options)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = hcsExportLayer(layerPath, exportFolderPath, string(ldBytes), string(oBytes))\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"failed to export layer\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/computestorage/format.go",
    "content": "//go:build windows\n\npackage computestorage\n\nimport (\n\t\"context\"\n\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"github.com/pkg/errors\"\n\t\"golang.org/x/sys/windows\"\n)\n\n// FormatWritableLayerVhd formats a virtual disk for use as a writable container layer.\n//\n// If the VHD is not mounted it will be temporarily mounted.\n//\n// NOTE: This API had a breaking change in the operating system after Windows Server 2019.\n// On ws2019 the API expects to get passed a file handle from CreateFile for the vhd that\n// the caller wants to format. On > ws2019, its expected that the caller passes a vhd handle\n// that can be obtained from the virtdisk APIs.\nfunc FormatWritableLayerVhd(ctx context.Context, vhdHandle windows.Handle) (err error) {\n\ttitle := \"hcsshim::FormatWritableLayerVhd\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\n\terr = hcsFormatWritableLayerVhd(vhdHandle)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"failed to format writable layer vhd\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/computestorage/helpers.go",
    "content": "//go:build windows\n\npackage computestorage\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"syscall\"\n\n\t\"github.com/Microsoft/go-winio/vhd\"\n\t\"github.com/Microsoft/hcsshim/internal/memory\"\n\t\"github.com/pkg/errors\"\n\t\"golang.org/x/sys/windows\"\n\n\t\"github.com/Microsoft/hcsshim/internal/security\"\n)\n\nconst (\n\tdefaultVHDXBlockSizeInMB = 1\n)\n\n// SetupContainerBaseLayer is a helper to setup a containers scratch. It\n// will create and format the vhdx's inside and the size is configurable with the sizeInGB\n// parameter.\n//\n// `layerPath` is the path to the base container layer on disk.\n//\n// `baseVhdPath` is the path to where the base vhdx for the base layer should be created.\n//\n// `diffVhdPath` is the path where the differencing disk for the base layer should be created.\n//\n// `sizeInGB` is the size in gigabytes to make the base vhdx.\nfunc SetupContainerBaseLayer(ctx context.Context, layerPath, baseVhdPath, diffVhdPath string, sizeInGB uint64) (err error) {\n\tvar (\n\t\thivesPath  = filepath.Join(layerPath, \"Hives\")\n\t\tlayoutPath = filepath.Join(layerPath, \"Layout\")\n\t)\n\n\t// We need to remove the hives directory and layout file as `SetupBaseOSLayer` fails if these files\n\t// already exist. `SetupBaseOSLayer` will create these files internally. We also remove the base and\n\t// differencing disks if they exist in case we're asking for a different size.\n\tif _, err := os.Stat(hivesPath); err == nil {\n\t\tif err := os.RemoveAll(hivesPath); err != nil {\n\t\t\treturn errors.Wrap(err, \"failed to remove prexisting hives directory\")\n\t\t}\n\t}\n\tif _, err := os.Stat(layoutPath); err == nil {\n\t\tif err := os.RemoveAll(layoutPath); err != nil {\n\t\t\treturn errors.Wrap(err, \"failed to remove prexisting layout file\")\n\t\t}\n\t}\n\n\tif _, err := os.Stat(baseVhdPath); err == nil {\n\t\tif err := os.RemoveAll(baseVhdPath); err != nil {\n\t\t\treturn errors.Wrap(err, \"failed to remove base vhdx path\")\n\t\t}\n\t}\n\tif _, err := os.Stat(diffVhdPath); err == nil {\n\t\tif err := os.RemoveAll(diffVhdPath); err != nil {\n\t\t\treturn errors.Wrap(err, \"failed to remove differencing vhdx\")\n\t\t}\n\t}\n\n\tcreateParams := &vhd.CreateVirtualDiskParameters{\n\t\tVersion: 2,\n\t\tVersion2: vhd.CreateVersion2{\n\t\t\tMaximumSize:      sizeInGB * memory.GiB,\n\t\t\tBlockSizeInBytes: defaultVHDXBlockSizeInMB * memory.MiB,\n\t\t},\n\t}\n\thandle, err := vhd.CreateVirtualDisk(baseVhdPath, vhd.VirtualDiskAccessNone, vhd.CreateVirtualDiskFlagNone, createParams)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"failed to create vhdx\")\n\t}\n\n\tdefer func() {\n\t\tif err != nil {\n\t\t\t_ = syscall.CloseHandle(handle)\n\t\t\tos.RemoveAll(baseVhdPath)\n\t\t\tos.RemoveAll(diffVhdPath)\n\t\t}\n\t}()\n\n\tif err = FormatWritableLayerVhd(ctx, windows.Handle(handle)); err != nil {\n\t\treturn err\n\t}\n\t// Base vhd handle must be closed before calling SetupBaseLayer in case of Container layer\n\tif err = syscall.CloseHandle(handle); err != nil {\n\t\treturn errors.Wrap(err, \"failed to close vhdx handle\")\n\t}\n\n\toptions := OsLayerOptions{\n\t\tType: OsLayerTypeContainer,\n\t}\n\n\t// SetupBaseOSLayer expects an empty vhd handle for a container layer and will\n\t// error out otherwise.\n\tif err = SetupBaseOSLayer(ctx, layerPath, 0, options); err != nil {\n\t\treturn err\n\t}\n\t// Create the differencing disk that will be what's copied for the final rw layer\n\t// for a container.\n\tif err = vhd.CreateDiffVhd(diffVhdPath, baseVhdPath, defaultVHDXBlockSizeInMB); err != nil {\n\t\treturn errors.Wrap(err, \"failed to create differencing disk\")\n\t}\n\n\tif err = security.GrantVmGroupAccess(baseVhdPath); err != nil {\n\t\treturn errors.Wrapf(err, \"failed to grant vm group access to %s\", baseVhdPath)\n\t}\n\tif err = security.GrantVmGroupAccess(diffVhdPath); err != nil {\n\t\treturn errors.Wrapf(err, \"failed to grant vm group access to %s\", diffVhdPath)\n\t}\n\treturn nil\n}\n\n// SetupUtilityVMBaseLayer is a helper to setup a UVMs scratch space. It will create and format\n// the vhdx inside and the size is configurable by the sizeInGB parameter.\n//\n// `uvmPath` is the path to the UtilityVM filesystem.\n//\n// `baseVhdPath` is the path to where the base vhdx for the UVM should be created.\n//\n// `diffVhdPath` is the path where the differencing disk for the UVM should be created.\n//\n// `sizeInGB` specifies the size in gigabytes to make the base vhdx.\nfunc SetupUtilityVMBaseLayer(ctx context.Context, uvmPath, baseVhdPath, diffVhdPath string, sizeInGB uint64) (err error) {\n\t// Remove the base and differencing disks if they exist in case we're asking for a different size.\n\tif _, err := os.Stat(baseVhdPath); err == nil {\n\t\tif err := os.RemoveAll(baseVhdPath); err != nil {\n\t\t\treturn errors.Wrap(err, \"failed to remove base vhdx\")\n\t\t}\n\t}\n\tif _, err := os.Stat(diffVhdPath); err == nil {\n\t\tif err := os.RemoveAll(diffVhdPath); err != nil {\n\t\t\treturn errors.Wrap(err, \"failed to remove differencing vhdx\")\n\t\t}\n\t}\n\n\t// Just create the vhdx for utilityVM layer, no need to format it.\n\tcreateParams := &vhd.CreateVirtualDiskParameters{\n\t\tVersion: 2,\n\t\tVersion2: vhd.CreateVersion2{\n\t\t\tMaximumSize:      sizeInGB * memory.GiB,\n\t\t\tBlockSizeInBytes: defaultVHDXBlockSizeInMB * memory.MiB,\n\t\t},\n\t}\n\thandle, err := vhd.CreateVirtualDisk(baseVhdPath, vhd.VirtualDiskAccessNone, vhd.CreateVirtualDiskFlagNone, createParams)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"failed to create vhdx\")\n\t}\n\n\tdefer func() {\n\t\tif err != nil {\n\t\t\t_ = syscall.CloseHandle(handle)\n\t\t\tos.RemoveAll(baseVhdPath)\n\t\t\tos.RemoveAll(diffVhdPath)\n\t\t}\n\t}()\n\n\t// If it is a UtilityVM layer then the base vhdx must be attached when calling\n\t// `SetupBaseOSLayer`\n\tattachParams := &vhd.AttachVirtualDiskParameters{\n\t\tVersion: 2,\n\t}\n\tif err := vhd.AttachVirtualDisk(handle, vhd.AttachVirtualDiskFlagNone, attachParams); err != nil {\n\t\treturn errors.Wrapf(err, \"failed to attach virtual disk\")\n\t}\n\n\toptions := OsLayerOptions{\n\t\tType: OsLayerTypeVM,\n\t}\n\tif err := SetupBaseOSLayer(ctx, uvmPath, windows.Handle(handle), options); err != nil {\n\t\treturn err\n\t}\n\n\t// Detach and close the handle after setting up the layer as we don't need the handle\n\t// for anything else and we no longer need to be attached either.\n\tif err = vhd.DetachVirtualDisk(handle); err != nil {\n\t\treturn errors.Wrap(err, \"failed to detach vhdx\")\n\t}\n\tif err = syscall.CloseHandle(handle); err != nil {\n\t\treturn errors.Wrap(err, \"failed to close vhdx handle\")\n\t}\n\n\t// Create the differencing disk that will be what's copied for the final rw layer\n\t// for a container.\n\tif err = vhd.CreateDiffVhd(diffVhdPath, baseVhdPath, defaultVHDXBlockSizeInMB); err != nil {\n\t\treturn errors.Wrap(err, \"failed to create differencing disk\")\n\t}\n\n\tif err := security.GrantVmGroupAccess(baseVhdPath); err != nil {\n\t\treturn errors.Wrapf(err, \"failed to grant vm group access to %s\", baseVhdPath)\n\t}\n\tif err := security.GrantVmGroupAccess(diffVhdPath); err != nil {\n\t\treturn errors.Wrapf(err, \"failed to grant vm group access to %s\", diffVhdPath)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/computestorage/import.go",
    "content": "//go:build windows\n\npackage computestorage\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"github.com/pkg/errors\"\n\t\"go.opencensus.io/trace\"\n)\n\n// ImportLayer imports a container layer.\n//\n// `layerPath` is a path to a directory to import the layer to. If the directory\n// does not exist it will be automatically created.\n//\n// `sourceFolderpath` is a pre-existing folder that contains the layer to\n// import.\n//\n// `layerData` is the parent layer data.\nfunc ImportLayer(ctx context.Context, layerPath, sourceFolderPath string, layerData LayerData) (err error) {\n\ttitle := \"hcsshim::ImportLayer\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"layerPath\", layerPath),\n\t\ttrace.StringAttribute(\"sourceFolderPath\", sourceFolderPath),\n\t)\n\n\tbytes, err := json.Marshal(layerData)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = hcsImportLayer(layerPath, sourceFolderPath, string(bytes))\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"failed to import layer\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/computestorage/initialize.go",
    "content": "//go:build windows\n\npackage computestorage\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"github.com/pkg/errors\"\n\t\"go.opencensus.io/trace\"\n)\n\n// InitializeWritableLayer initializes a writable layer for a container.\n//\n// `layerPath` is a path to a directory the layer is mounted. If the\n// path does not end in a `\\` the platform will append it automatically.\n//\n// `layerData` is the parent read-only layer data.\nfunc InitializeWritableLayer(ctx context.Context, layerPath string, layerData LayerData) (err error) {\n\ttitle := \"hcsshim::InitializeWritableLayer\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"layerPath\", layerPath),\n\t)\n\n\tbytes, err := json.Marshal(layerData)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Options are not used in the platform as of RS5\n\terr = hcsInitializeWritableLayer(layerPath, string(bytes), \"\")\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"failed to intitialize container layer\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/computestorage/mount.go",
    "content": "//go:build windows\n\npackage computestorage\n\nimport (\n\t\"context\"\n\n\t\"github.com/Microsoft/hcsshim/internal/interop\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"github.com/pkg/errors\"\n\t\"golang.org/x/sys/windows\"\n)\n\n// GetLayerVhdMountPath returns the volume path for a virtual disk of a writable container layer.\nfunc GetLayerVhdMountPath(ctx context.Context, vhdHandle windows.Handle) (path string, err error) {\n\ttitle := \"hcsshim::GetLayerVhdMountPath\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\n\tvar mountPath *uint16\n\terr = hcsGetLayerVhdMountPath(vhdHandle, &mountPath)\n\tif err != nil {\n\t\treturn \"\", errors.Wrap(err, \"failed to get vhd mount path\")\n\t}\n\tpath = interop.ConvertAndFreeCoTaskMemString(mountPath)\n\treturn path, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/computestorage/setup.go",
    "content": "//go:build windows\n\npackage computestorage\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"github.com/Microsoft/hcsshim/osversion\"\n\t\"github.com/pkg/errors\"\n\t\"go.opencensus.io/trace\"\n\t\"golang.org/x/sys/windows\"\n)\n\n// SetupBaseOSLayer sets up a layer that contains a base OS for a container.\n//\n// `layerPath` is a path to a directory containing the layer.\n//\n// `vhdHandle` is an empty file handle of `options.Type == OsLayerTypeContainer`\n// or else it is a file handle to the 'SystemTemplateBase.vhdx' if `options.Type\n// == OsLayerTypeVm`.\n//\n// `options` are the options applied while processing the layer.\nfunc SetupBaseOSLayer(ctx context.Context, layerPath string, vhdHandle windows.Handle, options OsLayerOptions) (err error) {\n\ttitle := \"hcsshim::SetupBaseOSLayer\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"layerPath\", layerPath),\n\t)\n\n\tbytes, err := json.Marshal(options)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = hcsSetupBaseOSLayer(layerPath, vhdHandle, string(bytes))\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"failed to setup base OS layer\")\n\t}\n\treturn nil\n}\n\n// SetupBaseOSVolume sets up a volume that contains a base OS for a container.\n//\n// `layerPath` is a path to a directory containing the layer.\n//\n// `volumePath` is the path to the volume to be used for setup.\n//\n// `options` are the options applied while processing the layer.\n//\n// NOTE: This API is only available on builds of Windows greater than 19645. Inside we\n// check if the hosts build has the API available by using 'GetVersion' which requires\n// the calling application to be manifested. https://docs.microsoft.com/en-us/windows/win32/sbscs/manifests\nfunc SetupBaseOSVolume(ctx context.Context, layerPath, volumePath string, options OsLayerOptions) (err error) {\n\tif osversion.Build() < 19645 {\n\t\treturn errors.New(\"SetupBaseOSVolume is not present on builds older than 19645\")\n\t}\n\ttitle := \"hcsshim::SetupBaseOSVolume\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"layerPath\", layerPath),\n\t\ttrace.StringAttribute(\"volumePath\", volumePath),\n\t)\n\n\tbytes, err := json.Marshal(options)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = hcsSetupBaseOSVolume(layerPath, volumePath, string(bytes))\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"failed to setup base OS layer\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/computestorage/storage.go",
    "content": "// Package computestorage is a wrapper around the HCS storage APIs. These are new storage APIs introduced\n// separate from the original graphdriver calls intended to give more freedom around creating\n// and managing container layers and scratch spaces.\npackage computestorage\n\nimport (\n\thcsschema \"github.com/Microsoft/hcsshim/internal/hcs/schema2\"\n)\n\n//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go storage.go\n\n//sys hcsImportLayer(layerPath string, sourceFolderPath string, layerData string) (hr error) = computestorage.HcsImportLayer?\n//sys hcsExportLayer(layerPath string, exportFolderPath string, layerData string, options string) (hr error) = computestorage.HcsExportLayer?\n//sys hcsDestroyLayer(layerPath string) (hr error) = computestorage.HcsDestroyLayer?\n//sys hcsSetupBaseOSLayer(layerPath string, handle windows.Handle, options string) (hr error) = computestorage.HcsSetupBaseOSLayer?\n//sys hcsInitializeWritableLayer(writableLayerPath string, layerData string, options string) (hr error) = computestorage.HcsInitializeWritableLayer?\n//sys hcsAttachLayerStorageFilter(layerPath string, layerData string) (hr error) = computestorage.HcsAttachLayerStorageFilter?\n//sys hcsDetachLayerStorageFilter(layerPath string) (hr error) = computestorage.HcsDetachLayerStorageFilter?\n//sys hcsFormatWritableLayerVhd(handle windows.Handle) (hr error) = computestorage.HcsFormatWritableLayerVhd?\n//sys hcsGetLayerVhdMountPath(vhdHandle windows.Handle, mountPath **uint16) (hr error) = computestorage.HcsGetLayerVhdMountPath?\n//sys hcsSetupBaseOSVolume(layerPath string, volumePath string, options string) (hr error) = computestorage.HcsSetupBaseOSVolume?\n//sys hcsAttachOverlayFilter(volumePath string, layerData string) (hr error) = computestorage.HcsAttachOverlayFilter?\n//sys hcsDetachOverlayFilter(volumePath string, layerData string) (hr error) = computestorage.HcsDetachOverlayFilter?\n\ntype Version = hcsschema.Version\ntype Layer = hcsschema.Layer\n\n// LayerData is the data used to describe parent layer information.\ntype LayerData struct {\n\tSchemaVersion Version                        `json:\"SchemaVersion,omitempty\"`\n\tLayers        []Layer                        `json:\"Layers,omitempty\"`\n\tFilterType    hcsschema.FileSystemFilterType `json:\"FilterType,omitempty\"`\n}\n\n// ExportLayerOptions are the set of options that are used with the `computestorage.HcsExportLayer` syscall.\ntype ExportLayerOptions struct {\n\tIsWritableLayer bool `json:\"IsWritableLayer,omitempty\"`\n}\n\n// OsLayerType is the type of layer being operated on.\ntype OsLayerType string\n\nconst (\n\t// OsLayerTypeContainer is a container layer.\n\tOsLayerTypeContainer OsLayerType = \"Container\"\n\t// OsLayerTypeVM is a virtual machine layer.\n\tOsLayerTypeVM OsLayerType = \"Vm\"\n)\n\n// OsLayerOptions are the set of options that are used with the `SetupBaseOSLayer` and\n// `SetupBaseOSVolume` calls.\ntype OsLayerOptions struct {\n\tType                       OsLayerType `json:\"Type,omitempty\"`\n\tDisableCiCacheOptimization bool        `json:\"DisableCiCacheOptimization,omitempty\"`\n\tSkipUpdateBcdForBoot       bool        `json:\"SkipUpdateBcdForBoot,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/computestorage/zsyscall_windows.go",
    "content": "//go:build windows\n\n// Code generated by 'go generate' using \"github.com/Microsoft/go-winio/tools/mkwinsyscall\"; DO NOT EDIT.\n\npackage computestorage\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\nvar _ unsafe.Pointer\n\n// Do the interface allocations only once for common\n// Errno values.\nconst (\n\terrnoERROR_IO_PENDING = 997\n)\n\nvar (\n\terrERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)\n\terrERROR_EINVAL     error = syscall.EINVAL\n)\n\n// errnoErr returns common boxed Errno values, to prevent\n// allocations at runtime.\nfunc errnoErr(e syscall.Errno) error {\n\tswitch e {\n\tcase 0:\n\t\treturn errERROR_EINVAL\n\tcase errnoERROR_IO_PENDING:\n\t\treturn errERROR_IO_PENDING\n\t}\n\treturn e\n}\n\nvar (\n\tmodcomputestorage = windows.NewLazySystemDLL(\"computestorage.dll\")\n\n\tprocHcsAttachLayerStorageFilter = modcomputestorage.NewProc(\"HcsAttachLayerStorageFilter\")\n\tprocHcsAttachOverlayFilter      = modcomputestorage.NewProc(\"HcsAttachOverlayFilter\")\n\tprocHcsDestroyLayer             = modcomputestorage.NewProc(\"HcsDestroyLayer\")\n\tprocHcsDetachLayerStorageFilter = modcomputestorage.NewProc(\"HcsDetachLayerStorageFilter\")\n\tprocHcsDetachOverlayFilter      = modcomputestorage.NewProc(\"HcsDetachOverlayFilter\")\n\tprocHcsExportLayer              = modcomputestorage.NewProc(\"HcsExportLayer\")\n\tprocHcsFormatWritableLayerVhd   = modcomputestorage.NewProc(\"HcsFormatWritableLayerVhd\")\n\tprocHcsGetLayerVhdMountPath     = modcomputestorage.NewProc(\"HcsGetLayerVhdMountPath\")\n\tprocHcsImportLayer              = modcomputestorage.NewProc(\"HcsImportLayer\")\n\tprocHcsInitializeWritableLayer  = modcomputestorage.NewProc(\"HcsInitializeWritableLayer\")\n\tprocHcsSetupBaseOSLayer         = modcomputestorage.NewProc(\"HcsSetupBaseOSLayer\")\n\tprocHcsSetupBaseOSVolume        = modcomputestorage.NewProc(\"HcsSetupBaseOSVolume\")\n)\n\nfunc hcsAttachLayerStorageFilter(layerPath string, layerData string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(layerPath)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(layerData)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsAttachLayerStorageFilter(_p0, _p1)\n}\n\nfunc _hcsAttachLayerStorageFilter(layerPath *uint16, layerData *uint16) (hr error) {\n\thr = procHcsAttachLayerStorageFilter.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsAttachLayerStorageFilter.Addr(), uintptr(unsafe.Pointer(layerPath)), uintptr(unsafe.Pointer(layerData)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsAttachOverlayFilter(volumePath string, layerData string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(volumePath)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(layerData)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsAttachOverlayFilter(_p0, _p1)\n}\n\nfunc _hcsAttachOverlayFilter(volumePath *uint16, layerData *uint16) (hr error) {\n\thr = procHcsAttachOverlayFilter.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsAttachOverlayFilter.Addr(), uintptr(unsafe.Pointer(volumePath)), uintptr(unsafe.Pointer(layerData)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsDestroyLayer(layerPath string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(layerPath)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsDestroyLayer(_p0)\n}\n\nfunc _hcsDestroyLayer(layerPath *uint16) (hr error) {\n\thr = procHcsDestroyLayer.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsDestroyLayer.Addr(), uintptr(unsafe.Pointer(layerPath)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsDetachLayerStorageFilter(layerPath string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(layerPath)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsDetachLayerStorageFilter(_p0)\n}\n\nfunc _hcsDetachLayerStorageFilter(layerPath *uint16) (hr error) {\n\thr = procHcsDetachLayerStorageFilter.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsDetachLayerStorageFilter.Addr(), uintptr(unsafe.Pointer(layerPath)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsDetachOverlayFilter(volumePath string, layerData string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(volumePath)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(layerData)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsDetachOverlayFilter(_p0, _p1)\n}\n\nfunc _hcsDetachOverlayFilter(volumePath *uint16, layerData *uint16) (hr error) {\n\thr = procHcsDetachOverlayFilter.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsDetachOverlayFilter.Addr(), uintptr(unsafe.Pointer(volumePath)), uintptr(unsafe.Pointer(layerData)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsExportLayer(layerPath string, exportFolderPath string, layerData string, options string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(layerPath)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(exportFolderPath)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p2 *uint16\n\t_p2, hr = syscall.UTF16PtrFromString(layerData)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p3 *uint16\n\t_p3, hr = syscall.UTF16PtrFromString(options)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsExportLayer(_p0, _p1, _p2, _p3)\n}\n\nfunc _hcsExportLayer(layerPath *uint16, exportFolderPath *uint16, layerData *uint16, options *uint16) (hr error) {\n\thr = procHcsExportLayer.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsExportLayer.Addr(), uintptr(unsafe.Pointer(layerPath)), uintptr(unsafe.Pointer(exportFolderPath)), uintptr(unsafe.Pointer(layerData)), uintptr(unsafe.Pointer(options)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsFormatWritableLayerVhd(handle windows.Handle) (hr error) {\n\thr = procHcsFormatWritableLayerVhd.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsFormatWritableLayerVhd.Addr(), uintptr(handle))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsGetLayerVhdMountPath(vhdHandle windows.Handle, mountPath **uint16) (hr error) {\n\thr = procHcsGetLayerVhdMountPath.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsGetLayerVhdMountPath.Addr(), uintptr(vhdHandle), uintptr(unsafe.Pointer(mountPath)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsImportLayer(layerPath string, sourceFolderPath string, layerData string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(layerPath)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(sourceFolderPath)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p2 *uint16\n\t_p2, hr = syscall.UTF16PtrFromString(layerData)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsImportLayer(_p0, _p1, _p2)\n}\n\nfunc _hcsImportLayer(layerPath *uint16, sourceFolderPath *uint16, layerData *uint16) (hr error) {\n\thr = procHcsImportLayer.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsImportLayer.Addr(), uintptr(unsafe.Pointer(layerPath)), uintptr(unsafe.Pointer(sourceFolderPath)), uintptr(unsafe.Pointer(layerData)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsInitializeWritableLayer(writableLayerPath string, layerData string, options string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(writableLayerPath)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(layerData)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p2 *uint16\n\t_p2, hr = syscall.UTF16PtrFromString(options)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsInitializeWritableLayer(_p0, _p1, _p2)\n}\n\nfunc _hcsInitializeWritableLayer(writableLayerPath *uint16, layerData *uint16, options *uint16) (hr error) {\n\thr = procHcsInitializeWritableLayer.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsInitializeWritableLayer.Addr(), uintptr(unsafe.Pointer(writableLayerPath)), uintptr(unsafe.Pointer(layerData)), uintptr(unsafe.Pointer(options)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsSetupBaseOSLayer(layerPath string, handle windows.Handle, options string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(layerPath)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(options)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsSetupBaseOSLayer(_p0, handle, _p1)\n}\n\nfunc _hcsSetupBaseOSLayer(layerPath *uint16, handle windows.Handle, options *uint16) (hr error) {\n\thr = procHcsSetupBaseOSLayer.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsSetupBaseOSLayer.Addr(), uintptr(unsafe.Pointer(layerPath)), uintptr(handle), uintptr(unsafe.Pointer(options)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsSetupBaseOSVolume(layerPath string, volumePath string, options string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(layerPath)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(volumePath)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p2 *uint16\n\t_p2, hr = syscall.UTF16PtrFromString(options)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsSetupBaseOSVolume(_p0, _p1, _p2)\n}\n\nfunc _hcsSetupBaseOSVolume(layerPath *uint16, volumePath *uint16, options *uint16) (hr error) {\n\thr = procHcsSetupBaseOSVolume.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsSetupBaseOSVolume.Addr(), uintptr(unsafe.Pointer(layerPath)), uintptr(unsafe.Pointer(volumePath)), uintptr(unsafe.Pointer(options)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/container.go",
    "content": "//go:build windows\n\npackage hcsshim\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcs\"\n\t\"github.com/Microsoft/hcsshim/internal/hcs/schema1\"\n\t\"github.com/Microsoft/hcsshim/internal/mergemaps\"\n)\n\n// ContainerProperties holds the properties for a container and the processes running in that container\ntype ContainerProperties = schema1.ContainerProperties\n\n// MemoryStats holds the memory statistics for a container\ntype MemoryStats = schema1.MemoryStats\n\n// ProcessorStats holds the processor statistics for a container\ntype ProcessorStats = schema1.ProcessorStats\n\n// StorageStats holds the storage statistics for a container\ntype StorageStats = schema1.StorageStats\n\n// NetworkStats holds the network statistics for a container\ntype NetworkStats = schema1.NetworkStats\n\n// Statistics is the structure returned by a statistics call on a container\ntype Statistics = schema1.Statistics\n\n// ProcessList is the structure of an item returned by a ProcessList call on a container\ntype ProcessListItem = schema1.ProcessListItem\n\n// MappedVirtualDiskController is the structure of an item returned by a MappedVirtualDiskList call on a container\ntype MappedVirtualDiskController = schema1.MappedVirtualDiskController\n\n// Type of Request Support in ModifySystem\ntype RequestType = schema1.RequestType\n\n// Type of Resource Support in ModifySystem\ntype ResourceType = schema1.ResourceType\n\n// RequestType const\nconst (\n\tAdd     = schema1.Add\n\tRemove  = schema1.Remove\n\tNetwork = schema1.Network\n)\n\n// ResourceModificationRequestResponse is the structure used to send request to the container to modify the system\n// Supported resource types are Network and Request Types are Add/Remove\ntype ResourceModificationRequestResponse = schema1.ResourceModificationRequestResponse\n\ntype container struct {\n\tsystem   *hcs.System\n\twaitOnce sync.Once\n\twaitErr  error\n\twaitCh   chan struct{}\n}\n\n// createContainerAdditionalJSON is read from the environment at initialization\n// time. It allows an environment variable to define additional JSON which\n// is merged in the CreateComputeSystem call to HCS.\nvar createContainerAdditionalJSON []byte\n\nfunc init() {\n\tcreateContainerAdditionalJSON = ([]byte)(os.Getenv(\"HCSSHIM_CREATECONTAINER_ADDITIONALJSON\"))\n}\n\n// CreateContainer creates a new container with the given configuration but does not start it.\nfunc CreateContainer(id string, c *ContainerConfig) (Container, error) {\n\tfullConfig, err := mergemaps.MergeJSON(c, createContainerAdditionalJSON)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to merge additional JSON '%s': %w\", createContainerAdditionalJSON, err)\n\t}\n\n\tsystem, err := hcs.CreateComputeSystem(context.Background(), id, fullConfig)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &container{system: system}, err\n}\n\n// OpenContainer opens an existing container by ID.\nfunc OpenContainer(id string) (Container, error) {\n\tsystem, err := hcs.OpenComputeSystem(context.Background(), id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &container{system: system}, err\n}\n\n// GetContainers gets a list of the containers on the system that match the query\nfunc GetContainers(q ComputeSystemQuery) ([]ContainerProperties, error) {\n\treturn hcs.GetComputeSystems(context.Background(), q)\n}\n\n// Start synchronously starts the container.\nfunc (container *container) Start() error {\n\treturn convertSystemError(container.system.Start(context.Background()), container)\n}\n\n// Shutdown requests a container shutdown, but it may not actually be shutdown until Wait() succeeds.\nfunc (container *container) Shutdown() error {\n\terr := container.system.Shutdown(context.Background())\n\tif err != nil {\n\t\treturn convertSystemError(err, container)\n\t}\n\treturn &ContainerError{Container: container, Err: ErrVmcomputeOperationPending, Operation: \"hcsshim::ComputeSystem::Shutdown\"}\n}\n\n// Terminate requests a container terminate, but it may not actually be terminated until Wait() succeeds.\nfunc (container *container) Terminate() error {\n\terr := container.system.Terminate(context.Background())\n\tif err != nil {\n\t\treturn convertSystemError(err, container)\n\t}\n\treturn &ContainerError{Container: container, Err: ErrVmcomputeOperationPending, Operation: \"hcsshim::ComputeSystem::Terminate\"}\n}\n\n// Waits synchronously waits for the container to shutdown or terminate.\nfunc (container *container) Wait() error {\n\terr := container.system.Wait()\n\tif err == nil {\n\t\terr = container.system.ExitError()\n\t}\n\treturn convertSystemError(err, container)\n}\n\n// WaitTimeout synchronously waits for the container to terminate or the duration to elapse. It\n// returns false if timeout occurs.\nfunc (container *container) WaitTimeout(timeout time.Duration) error {\n\tcontainer.waitOnce.Do(func() {\n\t\tcontainer.waitCh = make(chan struct{})\n\t\tgo func() {\n\t\t\tcontainer.waitErr = container.Wait()\n\t\t\tclose(container.waitCh)\n\t\t}()\n\t})\n\tt := time.NewTimer(timeout)\n\tdefer t.Stop()\n\tselect {\n\tcase <-t.C:\n\t\treturn &ContainerError{Container: container, Err: ErrTimeout, Operation: \"hcsshim::ComputeSystem::Wait\"}\n\tcase <-container.waitCh:\n\t\treturn container.waitErr\n\t}\n}\n\n// Pause pauses the execution of a container.\nfunc (container *container) Pause() error {\n\treturn convertSystemError(container.system.Pause(context.Background()), container)\n}\n\n// Resume resumes the execution of a container.\nfunc (container *container) Resume() error {\n\treturn convertSystemError(container.system.Resume(context.Background()), container)\n}\n\n// HasPendingUpdates returns true if the container has updates pending to install\nfunc (container *container) HasPendingUpdates() (bool, error) {\n\treturn false, nil\n}\n\n// Statistics returns statistics for the container. This is a legacy v1 call\nfunc (container *container) Statistics() (Statistics, error) {\n\tproperties, err := container.system.Properties(context.Background(), schema1.PropertyTypeStatistics)\n\tif err != nil {\n\t\treturn Statistics{}, convertSystemError(err, container)\n\t}\n\n\treturn properties.Statistics, nil\n}\n\n// ProcessList returns an array of ProcessListItems for the container. This is a legacy v1 call\nfunc (container *container) ProcessList() ([]ProcessListItem, error) {\n\tproperties, err := container.system.Properties(context.Background(), schema1.PropertyTypeProcessList)\n\tif err != nil {\n\t\treturn nil, convertSystemError(err, container)\n\t}\n\n\treturn properties.ProcessList, nil\n}\n\n// This is a legacy v1 call\nfunc (container *container) MappedVirtualDisks() (map[int]MappedVirtualDiskController, error) {\n\tproperties, err := container.system.Properties(context.Background(), schema1.PropertyTypeMappedVirtualDisk)\n\tif err != nil {\n\t\treturn nil, convertSystemError(err, container)\n\t}\n\n\treturn properties.MappedVirtualDiskControllers, nil\n}\n\n// CreateProcess launches a new process within the container.\nfunc (container *container) CreateProcess(c *ProcessConfig) (Process, error) {\n\tp, err := container.system.CreateProcess(context.Background(), c)\n\tif err != nil {\n\t\treturn nil, convertSystemError(err, container)\n\t}\n\treturn &process{p: p.(*hcs.Process)}, nil\n}\n\n// OpenProcess gets an interface to an existing process within the container.\nfunc (container *container) OpenProcess(pid int) (Process, error) {\n\tp, err := container.system.OpenProcess(context.Background(), pid)\n\tif err != nil {\n\t\treturn nil, convertSystemError(err, container)\n\t}\n\treturn &process{p: p}, nil\n}\n\n// Close cleans up any state associated with the container but does not terminate or wait for it.\nfunc (container *container) Close() error {\n\treturn convertSystemError(container.system.Close(), container)\n}\n\n// Modify the System\nfunc (container *container) Modify(config *ResourceModificationRequestResponse) error {\n\treturn convertSystemError(container.system.Modify(context.Background(), config), container)\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/errors.go",
    "content": "//go:build windows\n\npackage hcsshim\n\nimport (\n\t\"fmt\"\n\t\"syscall\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hns\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcs\"\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n)\n\nvar (\n\t// ErrComputeSystemDoesNotExist is an error encountered when the container being operated on no longer exists = hcs.exist\n\tErrComputeSystemDoesNotExist = hcs.ErrComputeSystemDoesNotExist\n\n\t// ErrElementNotFound is an error encountered when the object being referenced does not exist\n\tErrElementNotFound = hcs.ErrElementNotFound\n\n\t// ErrElementNotFound is an error encountered when the object being referenced does not exist\n\tErrNotSupported = hcs.ErrNotSupported\n\n\t// ErrInvalidData is an error encountered when the request being sent to hcs is invalid/unsupported\n\t// decimal -2147024883 / hex 0x8007000d\n\tErrInvalidData = hcs.ErrInvalidData\n\n\t// ErrHandleClose is an error encountered when the handle generating the notification being waited on has been closed\n\tErrHandleClose = hcs.ErrHandleClose\n\n\t// ErrAlreadyClosed is an error encountered when using a handle that has been closed by the Close method\n\tErrAlreadyClosed = hcs.ErrAlreadyClosed\n\n\t// ErrInvalidNotificationType is an error encountered when an invalid notification type is used\n\tErrInvalidNotificationType = hcs.ErrInvalidNotificationType\n\n\t// ErrInvalidProcessState is an error encountered when the process is not in a valid state for the requested operation\n\tErrInvalidProcessState = hcs.ErrInvalidProcessState\n\n\t// ErrTimeout is an error encountered when waiting on a notification times out\n\tErrTimeout = hcs.ErrTimeout\n\n\t// ErrUnexpectedContainerExit is the error encountered when a container exits while waiting for\n\t// a different expected notification\n\tErrUnexpectedContainerExit = hcs.ErrUnexpectedContainerExit\n\n\t// ErrUnexpectedProcessAbort is the error encountered when communication with the compute service\n\t// is lost while waiting for a notification\n\tErrUnexpectedProcessAbort = hcs.ErrUnexpectedProcessAbort\n\n\t// ErrUnexpectedValue is an error encountered when hcs returns an invalid value\n\tErrUnexpectedValue = hcs.ErrUnexpectedValue\n\n\t// ErrOperationDenied is an error when hcs attempts an operation that is explicitly denied\n\tErrOperationDenied = hcs.ErrOperationDenied\n\n\t// ErrVmcomputeAlreadyStopped is an error encountered when a shutdown or terminate request is made on a stopped container\n\tErrVmcomputeAlreadyStopped = hcs.ErrVmcomputeAlreadyStopped\n\n\t// ErrVmcomputeOperationPending is an error encountered when the operation is being completed asynchronously\n\tErrVmcomputeOperationPending = hcs.ErrVmcomputeOperationPending\n\n\t// ErrVmcomputeOperationInvalidState is an error encountered when the compute system is not in a valid state for the requested operation\n\tErrVmcomputeOperationInvalidState = hcs.ErrVmcomputeOperationInvalidState\n\n\t// ErrProcNotFound is an error encountered when a procedure look up fails.\n\tErrProcNotFound = hcs.ErrProcNotFound\n\n\t// ErrVmcomputeOperationAccessIsDenied is an error which can be encountered when enumerating compute systems in RS1/RS2\n\t// builds when the underlying silo might be in the process of terminating. HCS was fixed in RS3.\n\tErrVmcomputeOperationAccessIsDenied = hcs.ErrVmcomputeOperationAccessIsDenied\n\n\t// ErrVmcomputeInvalidJSON is an error encountered when the compute system does not support/understand the messages sent by management\n\tErrVmcomputeInvalidJSON = hcs.ErrVmcomputeInvalidJSON\n\n\t// ErrVmcomputeUnknownMessage is an error encountered guest compute system doesn't support the message\n\tErrVmcomputeUnknownMessage = hcs.ErrVmcomputeUnknownMessage\n\n\t// ErrNotSupported is an error encountered when hcs doesn't support the request\n\tErrPlatformNotSupported = hcs.ErrPlatformNotSupported\n)\n\ntype EndpointNotFoundError = hns.EndpointNotFoundError\ntype NetworkNotFoundError = hns.NetworkNotFoundError\n\n// ProcessError is an error encountered in HCS during an operation on a Process object\ntype ProcessError struct {\n\tProcess   *process\n\tOperation string\n\tErr       error\n\tEvents    []hcs.ErrorEvent\n}\n\n// ContainerError is an error encountered in HCS during an operation on a Container object\ntype ContainerError struct {\n\tContainer *container\n\tOperation string\n\tErr       error\n\tEvents    []hcs.ErrorEvent\n}\n\nfunc (e *ContainerError) Error() string {\n\tif e == nil {\n\t\treturn \"<nil>\"\n\t}\n\n\tif e.Container == nil {\n\t\treturn \"unexpected nil container for error: \" + e.Err.Error()\n\t}\n\n\ts := \"container \" + e.Container.system.ID()\n\n\tif e.Operation != \"\" {\n\t\ts += \" encountered an error during \" + e.Operation\n\t}\n\n\t//nolint:errorlint // legacy code\n\tswitch e.Err.(type) {\n\tcase nil:\n\t\tbreak\n\tcase syscall.Errno:\n\t\ts += fmt.Sprintf(\": failure in a Windows system call: %s (0x%x)\", e.Err, hcserror.Win32FromError(e.Err))\n\tdefault:\n\t\ts += fmt.Sprintf(\": %s\", e.Err.Error())\n\t}\n\n\tfor _, ev := range e.Events {\n\t\ts += \"\\n\" + ev.String()\n\t}\n\n\treturn s\n}\n\nfunc (e *ProcessError) Error() string {\n\tif e == nil {\n\t\treturn \"<nil>\"\n\t}\n\n\tif e.Process == nil {\n\t\treturn \"Unexpected nil process for error: \" + e.Err.Error()\n\t}\n\n\ts := fmt.Sprintf(\"process %d in container %s\", e.Process.p.Pid(), e.Process.p.SystemID())\n\tif e.Operation != \"\" {\n\t\ts += \" encountered an error during \" + e.Operation\n\t}\n\n\t//nolint:errorlint // legacy code\n\tswitch e.Err.(type) {\n\tcase nil:\n\t\tbreak\n\tcase syscall.Errno:\n\t\ts += fmt.Sprintf(\": failure in a Windows system call: %s (0x%x)\", e.Err, hcserror.Win32FromError(e.Err))\n\tdefault:\n\t\ts += fmt.Sprintf(\": %s\", e.Err.Error())\n\t}\n\n\tfor _, ev := range e.Events {\n\t\ts += \"\\n\" + ev.String()\n\t}\n\n\treturn s\n}\n\n// IsNotExist checks if an error is caused by the Container or Process not existing.\n// Note: Currently, ErrElementNotFound can mean that a Process has either\n// already exited, or does not exist. Both IsAlreadyStopped and IsNotExist\n// will currently return true when the error is ErrElementNotFound.\nfunc IsNotExist(err error) bool {\n\tif _, ok := err.(EndpointNotFoundError); ok { //nolint:errorlint // legacy code\n\t\treturn true\n\t}\n\tif _, ok := err.(NetworkNotFoundError); ok { //nolint:errorlint // legacy code\n\t\treturn true\n\t}\n\treturn hcs.IsNotExist(getInnerError(err))\n}\n\n// IsAlreadyClosed checks if an error is caused by the Container or Process having been\n// already closed by a call to the Close() method.\nfunc IsAlreadyClosed(err error) bool {\n\treturn hcs.IsAlreadyClosed(getInnerError(err))\n}\n\n// IsPending returns a boolean indicating whether the error is that\n// the requested operation is being completed in the background.\nfunc IsPending(err error) bool {\n\treturn hcs.IsPending(getInnerError(err))\n}\n\n// IsTimeout returns a boolean indicating whether the error is caused by\n// a timeout waiting for the operation to complete.\nfunc IsTimeout(err error) bool {\n\treturn hcs.IsTimeout(getInnerError(err))\n}\n\n// IsAlreadyStopped returns a boolean indicating whether the error is caused by\n// a Container or Process being already stopped.\n// Note: Currently, ErrElementNotFound can mean that a Process has either\n// already exited, or does not exist. Both IsAlreadyStopped and IsNotExist\n// will currently return true when the error is ErrElementNotFound.\nfunc IsAlreadyStopped(err error) bool {\n\treturn hcs.IsAlreadyStopped(getInnerError(err))\n}\n\n// IsNotSupported returns a boolean indicating whether the error is caused by\n// unsupported platform requests\n// Note: Currently Unsupported platform requests can be mean either\n// ErrVmcomputeInvalidJSON, ErrInvalidData, ErrNotSupported or ErrVmcomputeUnknownMessage\n// is thrown from the Platform\nfunc IsNotSupported(err error) bool {\n\treturn hcs.IsNotSupported(getInnerError(err))\n}\n\n// IsOperationInvalidState returns true when err is caused by\n// `ErrVmcomputeOperationInvalidState`.\nfunc IsOperationInvalidState(err error) bool {\n\treturn hcs.IsOperationInvalidState(getInnerError(err))\n}\n\n// IsAccessIsDenied returns true when err is caused by\n// `ErrVmcomputeOperationAccessIsDenied`.\nfunc IsAccessIsDenied(err error) bool {\n\treturn hcs.IsAccessIsDenied(getInnerError(err))\n}\n\nfunc getInnerError(err error) error {\n\t//nolint:errorlint // legacy code\n\tswitch pe := err.(type) {\n\tcase nil:\n\t\treturn nil\n\tcase *ContainerError:\n\t\terr = pe.Err\n\tcase *ProcessError:\n\t\terr = pe.Err\n\t}\n\treturn err\n}\n\nfunc convertSystemError(err error, c *container) error {\n\tif serr, ok := err.(*hcs.SystemError); ok { //nolint:errorlint // legacy code\n\t\treturn &ContainerError{Container: c, Operation: serr.Op, Err: serr.Err, Events: serr.Events}\n\t}\n\treturn err\n}\n\nfunc convertProcessError(err error, p *process) error {\n\tif perr, ok := err.(*hcs.ProcessError); ok { //nolint:errorlint // legacy code\n\t\treturn &ProcessError{Process: p, Operation: perr.Op, Err: perr.Err, Events: perr.Events}\n\t}\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/hcsshim.go",
    "content": "//go:build windows\n\n// Shim for the Host Compute Service (HCS) to manage Windows Server\n// containers and Hyper-V containers.\n\npackage hcsshim\n\nimport (\n\t\"golang.org/x/sys/windows\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n)\n\n//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go hcsshim.go\n\n//sys SetCurrentThreadCompartmentId(compartmentId uint32) (hr error) = iphlpapi.SetCurrentThreadCompartmentId\n\nconst (\n\t// Specific user-visible exit codes\n\tWaitErrExecFailed = 32767\n\n\tERROR_GEN_FAILURE          = windows.ERROR_GEN_FAILURE\n\tERROR_SHUTDOWN_IN_PROGRESS = windows.ERROR_SHUTDOWN_IN_PROGRESS\n\tWSAEINVAL                  = windows.WSAEINVAL\n\n\t// Timeout on wait calls\n\tTimeoutInfinite = 0xFFFFFFFF\n)\n\ntype HcsError = hcserror.HcsError\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/hnsaccelnet.go",
    "content": "//go:build windows\n\npackage hcsshim\n\nimport (\n\t\"errors\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hns\"\n)\n\n// HNSNnvManagementMacAddress represents management mac address\n// which needs to be excluded from VF reassignment\ntype HNSNnvManagementMacAddress = hns.HNSNnvManagementMacAddress\n\n// HNSNnvManagementMacList represents a list of management\n// mac addresses for exclusion from VF reassignment\ntype HNSNnvManagementMacList = hns.HNSNnvManagementMacList\n\nvar (\n\tErrorEmptyMacAddressList = errors.New(\"management mac_address list is empty\")\n)\n\n// SetNnvManagementMacAddresses sets a list of\n// management mac addresses in hns for exclusion from VF reassignment.\nfunc SetNnvManagementMacAddresses(managementMacAddresses []string) (*HNSNnvManagementMacList, error) {\n\tif len(managementMacAddresses) == 0 {\n\t\treturn nil, ErrorEmptyMacAddressList\n\t}\n\tnnvManagementMacList := &HNSNnvManagementMacList{}\n\tfor _, mac := range managementMacAddresses {\n\t\tnnvManagementMacList.MacAddressList = append(nnvManagementMacList.MacAddressList, HNSNnvManagementMacAddress{MacAddress: mac})\n\t}\n\treturn nnvManagementMacList.Set()\n}\n\n// GetNnvManagementMacAddresses retrieves a list of\n// management mac addresses in hns for exclusion from VF reassignment.\nfunc GetNnvManagementMacAddresses() (*HNSNnvManagementMacList, error) {\n\treturn hns.GetNnvManagementMacAddressList()\n}\n\n// DeleteNnvManagementMacAddresses delete list of\n// management mac addresses in hns which are excluded from VF reassignment.\nfunc DeleteNnvManagementMacAddresses() (*HNSNnvManagementMacList, error) {\n\treturn hns.DeleteNnvManagementMacAddressList()\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/hnsendpoint.go",
    "content": "//go:build windows\n\npackage hcsshim\n\nimport (\n\t\"github.com/Microsoft/hcsshim/internal/hns\"\n)\n\n// HNSEndpoint represents a network endpoint in HNS\ntype HNSEndpoint = hns.HNSEndpoint\n\n// HNSEndpointStats represent the stats for an networkendpoint in HNS\ntype HNSEndpointStats = hns.EndpointStats\n\n// Namespace represents a Compartment.\ntype Namespace = hns.Namespace\n\n// SystemType represents the type of the system on which actions are done\ntype SystemType string\n\n// SystemType const\nconst (\n\tContainerType      SystemType = \"Container\"\n\tVirtualMachineType SystemType = \"VirtualMachine\"\n\tHostType           SystemType = \"Host\"\n)\n\n// EndpointAttachDetachRequest is the structure used to send request to the container to modify the system\n// Supported resource types are Network and Request Types are Add/Remove\ntype EndpointAttachDetachRequest = hns.EndpointAttachDetachRequest\n\n// EndpointResquestResponse is object to get the endpoint request response\ntype EndpointResquestResponse = hns.EndpointResquestResponse\n\n// HNSEndpointRequest makes a HNS call to modify/query a network endpoint\nfunc HNSEndpointRequest(method, path, request string) (*HNSEndpoint, error) {\n\treturn hns.HNSEndpointRequest(method, path, request)\n}\n\n// HNSListEndpointRequest makes a HNS call to query the list of available endpoints\nfunc HNSListEndpointRequest() ([]HNSEndpoint, error) {\n\treturn hns.HNSListEndpointRequest()\n}\n\n// HotAttachEndpoint makes a HCS Call to attach the endpoint to the container\nfunc HotAttachEndpoint(containerID string, endpointID string) error {\n\tendpoint, err := GetHNSEndpointByID(endpointID)\n\tif err != nil {\n\t\treturn err\n\t}\n\tisAttached, err := endpoint.IsAttached(containerID)\n\tif isAttached {\n\t\treturn err\n\t}\n\treturn modifyNetworkEndpoint(containerID, endpointID, Add)\n}\n\n// HotDetachEndpoint makes a HCS Call to detach the endpoint from the container\nfunc HotDetachEndpoint(containerID string, endpointID string) error {\n\tendpoint, err := GetHNSEndpointByID(endpointID)\n\tif err != nil {\n\t\treturn err\n\t}\n\tisAttached, err := endpoint.IsAttached(containerID)\n\tif !isAttached {\n\t\treturn err\n\t}\n\treturn modifyNetworkEndpoint(containerID, endpointID, Remove)\n}\n\n// ModifyContainer corresponding to the container id, by sending a request\nfunc modifyContainer(id string, request *ResourceModificationRequestResponse) error {\n\tcontainer, err := OpenContainer(id)\n\tif err != nil {\n\t\tif IsNotExist(err) {\n\t\t\treturn ErrComputeSystemDoesNotExist\n\t\t}\n\t\treturn getInnerError(err)\n\t}\n\tdefer container.Close()\n\terr = container.Modify(request)\n\tif err != nil {\n\t\tif IsNotSupported(err) {\n\t\t\treturn ErrPlatformNotSupported\n\t\t}\n\t\treturn getInnerError(err)\n\t}\n\n\treturn nil\n}\n\nfunc modifyNetworkEndpoint(containerID string, endpointID string, request RequestType) error {\n\trequestMessage := &ResourceModificationRequestResponse{\n\t\tResource: Network,\n\t\tRequest:  request,\n\t\tData:     endpointID,\n\t}\n\terr := modifyContainer(containerID, requestMessage)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// GetHNSEndpointByID get the Endpoint by ID\nfunc GetHNSEndpointByID(endpointID string) (*HNSEndpoint, error) {\n\treturn hns.GetHNSEndpointByID(endpointID)\n}\n\n// GetHNSEndpointByName gets the endpoint filtered by Name\nfunc GetHNSEndpointByName(endpointName string) (*HNSEndpoint, error) {\n\treturn hns.GetHNSEndpointByName(endpointName)\n}\n\n// GetHNSEndpointStats gets the endpoint stats by ID\nfunc GetHNSEndpointStats(endpointName string) (*HNSEndpointStats, error) {\n\treturn hns.GetHNSEndpointStats(endpointName)\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/hnsglobals.go",
    "content": "//go:build windows\n\npackage hcsshim\n\nimport (\n\t\"github.com/Microsoft/hcsshim/internal/hns\"\n)\n\ntype HNSGlobals = hns.HNSGlobals\ntype HNSVersion = hns.HNSVersion\n\nvar (\n\tHNSVersion1803 = hns.HNSVersion1803\n)\n\nfunc GetHNSGlobals() (*HNSGlobals, error) {\n\treturn hns.GetHNSGlobals()\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/hnsnetwork.go",
    "content": "//go:build windows\n\npackage hcsshim\n\nimport (\n\t\"github.com/Microsoft/hcsshim/internal/hns\"\n)\n\n// Subnet is associated with a network and represents a list\n// of subnets available to the network\ntype Subnet = hns.Subnet\n\n// MacPool is associated with a network and represents a list\n// of macaddresses available to the network\ntype MacPool = hns.MacPool\n\n// HNSNetwork represents a network in HNS\ntype HNSNetwork = hns.HNSNetwork\n\n// HNSNetworkRequest makes a call into HNS to update/query a single network\nfunc HNSNetworkRequest(method, path, request string) (*HNSNetwork, error) {\n\treturn hns.HNSNetworkRequest(method, path, request)\n}\n\n// HNSListNetworkRequest makes a HNS call to query the list of available networks\nfunc HNSListNetworkRequest(method, path, request string) ([]HNSNetwork, error) {\n\treturn hns.HNSListNetworkRequest(method, path, request)\n}\n\n// GetHNSNetworkByID\nfunc GetHNSNetworkByID(networkID string) (*HNSNetwork, error) {\n\treturn hns.GetHNSNetworkByID(networkID)\n}\n\n// GetHNSNetworkName filtered by Name\nfunc GetHNSNetworkByName(networkName string) (*HNSNetwork, error) {\n\treturn hns.GetHNSNetworkByName(networkName)\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/hnspolicy.go",
    "content": "package hcsshim\n\nimport (\n\t\"github.com/Microsoft/hcsshim/internal/hns\"\n)\n\n// Type of Request Support in ModifySystem\ntype PolicyType = hns.PolicyType\n\n// RequestType const\nconst (\n\tNat                  = hns.Nat\n\tACL                  = hns.ACL\n\tPA                   = hns.PA\n\tVLAN                 = hns.VLAN\n\tVSID                 = hns.VSID\n\tVNet                 = hns.VNet\n\tL2Driver             = hns.L2Driver\n\tIsolation            = hns.Isolation\n\tQOS                  = hns.QOS\n\tOutboundNat          = hns.OutboundNat\n\tExternalLoadBalancer = hns.ExternalLoadBalancer\n\tRoute                = hns.Route\n\tProxy                = hns.Proxy\n)\n\ntype ProxyPolicy = hns.ProxyPolicy\n\ntype NatPolicy = hns.NatPolicy\n\ntype QosPolicy = hns.QosPolicy\n\ntype IsolationPolicy = hns.IsolationPolicy\n\ntype VlanPolicy = hns.VlanPolicy\n\ntype VsidPolicy = hns.VsidPolicy\n\ntype PaPolicy = hns.PaPolicy\n\ntype OutboundNatPolicy = hns.OutboundNatPolicy\n\ntype ActionType = hns.ActionType\ntype DirectionType = hns.DirectionType\ntype RuleType = hns.RuleType\n\nconst (\n\tAllow = hns.Allow\n\tBlock = hns.Block\n\n\tIn  = hns.In\n\tOut = hns.Out\n\n\tHost   = hns.Host\n\tSwitch = hns.Switch\n)\n\ntype ACLPolicy = hns.ACLPolicy\n\ntype Policy = hns.Policy\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/hnspolicylist.go",
    "content": "//go:build windows\n\npackage hcsshim\n\nimport (\n\t\"github.com/Microsoft/hcsshim/internal/hns\"\n)\n\n// RoutePolicy is a structure defining schema for Route based Policy\ntype RoutePolicy = hns.RoutePolicy\n\n// ELBPolicy is a structure defining schema for ELB LoadBalancing based Policy\ntype ELBPolicy = hns.ELBPolicy\n\n// LBPolicy is a structure defining schema for LoadBalancing based Policy\ntype LBPolicy = hns.LBPolicy\n\n// PolicyList is a structure defining schema for Policy list request\ntype PolicyList = hns.PolicyList\n\n// HNSPolicyListRequest makes a call into HNS to update/query a single network\nfunc HNSPolicyListRequest(method, path, request string) (*PolicyList, error) {\n\treturn hns.HNSPolicyListRequest(method, path, request)\n}\n\n// HNSListPolicyListRequest gets all the policy list\nfunc HNSListPolicyListRequest() ([]PolicyList, error) {\n\treturn hns.HNSListPolicyListRequest()\n}\n\n// PolicyListRequest makes a HNS call to modify/query a network policy list\nfunc PolicyListRequest(method, path, request string) (*PolicyList, error) {\n\treturn hns.PolicyListRequest(method, path, request)\n}\n\n// GetPolicyListByID get the policy list by ID\nfunc GetPolicyListByID(policyListID string) (*PolicyList, error) {\n\treturn hns.GetPolicyListByID(policyListID)\n}\n\n// AddLoadBalancer policy list for the specified endpoints\nfunc AddLoadBalancer(endpoints []HNSEndpoint, isILB bool, sourceVIP, vip string, protocol uint16, internalPort uint16, externalPort uint16) (*PolicyList, error) {\n\treturn hns.AddLoadBalancer(endpoints, isILB, sourceVIP, vip, protocol, internalPort, externalPort)\n}\n\n// AddRoute adds route policy list for the specified endpoints\nfunc AddRoute(endpoints []HNSEndpoint, destinationPrefix string, nextHop string, encapEnabled bool) (*PolicyList, error) {\n\treturn hns.AddRoute(endpoints, destinationPrefix, nextHop, encapEnabled)\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/hnssupport.go",
    "content": "//go:build windows\n\npackage hcsshim\n\nimport (\n\t\"github.com/Microsoft/hcsshim/internal/hns\"\n)\n\ntype HNSSupportedFeatures = hns.HNSSupportedFeatures\n\ntype HNSAclFeatures = hns.HNSAclFeatures\n\nfunc GetHNSSupportedFeatures() HNSSupportedFeatures {\n\treturn hns.GetHNSSupportedFeatures()\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/interface.go",
    "content": "//go:build windows\n\npackage hcsshim\n\nimport (\n\t\"io\"\n\t\"time\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcs/schema1\"\n)\n\n// ProcessConfig is used as both the input of Container.CreateProcess\n// and to convert the parameters to JSON for passing onto the HCS\ntype ProcessConfig = schema1.ProcessConfig\n\ntype Layer = schema1.Layer\ntype MappedDir = schema1.MappedDir\ntype MappedPipe = schema1.MappedPipe\ntype HvRuntime = schema1.HvRuntime\ntype MappedVirtualDisk = schema1.MappedVirtualDisk\n\n// AssignedDevice represents a device that has been directly assigned to a container\n//\n// NOTE: Support added in RS5\ntype AssignedDevice = schema1.AssignedDevice\n\n// ContainerConfig is used as both the input of CreateContainer\n// and to convert the parameters to JSON for passing onto the HCS\ntype ContainerConfig = schema1.ContainerConfig\n\ntype ComputeSystemQuery = schema1.ComputeSystemQuery\n\n// Container represents a created (but not necessarily running) container.\ntype Container interface {\n\t// Start synchronously starts the container.\n\tStart() error\n\n\t// Shutdown requests a container shutdown, but it may not actually be shutdown until Wait() succeeds.\n\tShutdown() error\n\n\t// Terminate requests a container terminate, but it may not actually be terminated until Wait() succeeds.\n\tTerminate() error\n\n\t// Waits synchronously waits for the container to shutdown or terminate.\n\tWait() error\n\n\t// WaitTimeout synchronously waits for the container to terminate or the duration to elapse. It\n\t// returns false if timeout occurs.\n\tWaitTimeout(time.Duration) error\n\n\t// Pause pauses the execution of a container.\n\tPause() error\n\n\t// Resume resumes the execution of a container.\n\tResume() error\n\n\t// HasPendingUpdates returns true if the container has updates pending to install.\n\tHasPendingUpdates() (bool, error)\n\n\t// Statistics returns statistics for a container.\n\tStatistics() (Statistics, error)\n\n\t// ProcessList returns details for the processes in a container.\n\tProcessList() ([]ProcessListItem, error)\n\n\t// MappedVirtualDisks returns virtual disks mapped to a utility VM, indexed by controller\n\tMappedVirtualDisks() (map[int]MappedVirtualDiskController, error)\n\n\t// CreateProcess launches a new process within the container.\n\tCreateProcess(c *ProcessConfig) (Process, error)\n\n\t// OpenProcess gets an interface to an existing process within the container.\n\tOpenProcess(pid int) (Process, error)\n\n\t// Close cleans up any state associated with the container but does not terminate or wait for it.\n\tClose() error\n\n\t// Modify the System\n\tModify(config *ResourceModificationRequestResponse) error\n}\n\n// Process represents a running or exited process.\ntype Process interface {\n\t// Pid returns the process ID of the process within the container.\n\tPid() int\n\n\t// Kill signals the process to terminate but does not wait for it to finish terminating.\n\tKill() error\n\n\t// Wait waits for the process to exit.\n\tWait() error\n\n\t// WaitTimeout waits for the process to exit or the duration to elapse. It returns\n\t// false if timeout occurs.\n\tWaitTimeout(time.Duration) error\n\n\t// ExitCode returns the exit code of the process. The process must have\n\t// already terminated.\n\tExitCode() (int, error)\n\n\t// ResizeConsole resizes the console of the process.\n\tResizeConsole(width, height uint16) error\n\n\t// Stdio returns the stdin, stdout, and stderr pipes, respectively. Closing\n\t// these pipes does not close the underlying pipes; it should be possible to\n\t// call this multiple times to get multiple interfaces.\n\tStdio() (io.WriteCloser, io.ReadCloser, io.ReadCloser, error)\n\n\t// CloseStdin closes the write side of the stdin pipe so that the process is\n\t// notified on the read side that there is no more data in stdin.\n\tCloseStdin() error\n\n\t// Close cleans up any state associated with the process but does not kill\n\t// or wait on it.\n\tClose() error\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/cow/cow.go",
    "content": "//go:build windows\n\npackage cow\n\nimport (\n\t\"context\"\n\t\"io\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcs/schema1\"\n\thcsschema \"github.com/Microsoft/hcsshim/internal/hcs/schema2\"\n)\n\n// Process is the interface for an OS process running in a container or utility VM.\ntype Process interface {\n\t// Close releases resources associated with the process and closes the\n\t// writer and readers returned by Stdio. Depending on the implementation,\n\t// this may also terminate the process.\n\tClose() error\n\t// CloseStdin causes the process's stdin handle to receive EOF/EPIPE/whatever\n\t// is appropriate to indicate that no more data is available.\n\tCloseStdin(ctx context.Context) error\n\t// CloseStdout closes the stdout connection to the process. It is used to indicate\n\t// that we are done receiving output on the shim side.\n\tCloseStdout(ctx context.Context) error\n\t// CloseStderr closes the stderr connection to the process. It is used to indicate\n\t// that we are done receiving output on the shim side.\n\tCloseStderr(ctx context.Context) error\n\t// Pid returns the process ID.\n\tPid() int\n\t// Stdio returns the stdio streams for a process. These may be nil if a stream\n\t// was not requested during CreateProcess.\n\tStdio() (_ io.Writer, _ io.Reader, _ io.Reader)\n\t// ResizeConsole resizes the virtual terminal associated with the process.\n\tResizeConsole(ctx context.Context, width, height uint16) error\n\t// Kill sends a SIGKILL or equivalent signal to the process and returns whether\n\t// the signal was delivered. It does not wait for the process to terminate.\n\tKill(ctx context.Context) (bool, error)\n\t// Signal sends a signal to the process and returns whether the signal was\n\t// delivered. The input is OS specific (either\n\t// guestrequest.SignalProcessOptionsWCOW or\n\t// guestrequest.SignalProcessOptionsLCOW). It does not wait for the process\n\t// to terminate.\n\tSignal(ctx context.Context, options interface{}) (bool, error)\n\t// Wait waits for the process to complete, or for a connection to the process to be\n\t// terminated by some error condition (including calling Close).\n\tWait() error\n\t// ExitCode returns the exit code of the process. Returns an error if the process is\n\t// not running.\n\tExitCode() (int, error)\n}\n\n// ProcessHost is the interface for creating processes.\ntype ProcessHost interface {\n\t// CreateProcess creates a process. The configuration is host specific\n\t// (either hcsschema.ProcessParameters or lcow.ProcessParameters).\n\tCreateProcess(ctx context.Context, config interface{}) (Process, error)\n\t// OS returns the host's operating system, \"linux\" or \"windows\".\n\tOS() string\n\t// IsOCI specifies whether this is an OCI-compliant process host. If true,\n\t// then the configuration passed to CreateProcess should have an OCI process\n\t// spec (or nil if this is the initial process in an OCI container).\n\t// Otherwise, it should have the HCS-specific process parameters.\n\tIsOCI() bool\n}\n\n// Container is the interface for container objects, either running on the host or\n// in a utility VM.\ntype Container interface {\n\tProcessHost\n\t// Close releases the resources associated with the container. Depending on\n\t// the implementation, this may also terminate the container.\n\tClose() error\n\t// ID returns the container ID.\n\tID() string\n\t// Properties returns the requested container properties targeting a V1 schema container.\n\tProperties(ctx context.Context, types ...schema1.PropertyType) (*schema1.ContainerProperties, error)\n\t// PropertiesV2 returns the requested container properties targeting a V2 schema container.\n\tPropertiesV2(ctx context.Context, types ...hcsschema.PropertyType) (*hcsschema.Properties, error)\n\t// Start starts a container.\n\tStart(ctx context.Context) error\n\t// Shutdown sends a shutdown request to the container (but does not wait for\n\t// the shutdown to complete).\n\tShutdown(ctx context.Context) error\n\t// Terminate sends a terminate request to the container (but does not wait\n\t// for the terminate to complete).\n\tTerminate(ctx context.Context) error\n\t// Wait waits for the container to terminate, or for the connection to the\n\t// container to be terminated by some error condition (including calling\n\t// Close).\n\tWait() error\n\t// WaitChannel returns the wait channel of the container\n\tWaitChannel() <-chan struct{}\n\t// WaitError returns the container termination error.\n\t// This function should only be called after the channel in WaitChannel()\n\t// is closed. Otherwise it is not thread safe.\n\tWaitError() error\n\t// Modify sends a request to modify container resources\n\tModify(ctx context.Context, config interface{}) error\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/callback.go",
    "content": "//go:build windows\n\npackage hcs\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\t\"syscall\"\n\n\t\"github.com/Microsoft/hcsshim/internal/interop\"\n\t\"github.com/Microsoft/hcsshim/internal/logfields\"\n\t\"github.com/Microsoft/hcsshim/internal/vmcompute\"\n\t\"github.com/sirupsen/logrus\"\n)\n\nvar (\n\tnextCallback    uintptr\n\tcallbackMap     = map[uintptr]*notificationWatcherContext{}\n\tcallbackMapLock = sync.RWMutex{}\n\n\tnotificationWatcherCallback = syscall.NewCallback(notificationWatcher)\n\n\t// Notifications for HCS_SYSTEM handles\n\thcsNotificationSystemExited                      hcsNotification = 0x00000001\n\thcsNotificationSystemCreateCompleted             hcsNotification = 0x00000002\n\thcsNotificationSystemStartCompleted              hcsNotification = 0x00000003\n\thcsNotificationSystemPauseCompleted              hcsNotification = 0x00000004\n\thcsNotificationSystemResumeCompleted             hcsNotification = 0x00000005\n\thcsNotificationSystemCrashReport                 hcsNotification = 0x00000006\n\thcsNotificationSystemSiloJobCreated              hcsNotification = 0x00000007\n\thcsNotificationSystemSaveCompleted               hcsNotification = 0x00000008\n\thcsNotificationSystemRdpEnhancedModeStateChanged hcsNotification = 0x00000009\n\thcsNotificationSystemShutdownFailed              hcsNotification = 0x0000000A\n\thcsNotificationSystemGetPropertiesCompleted      hcsNotification = 0x0000000B\n\thcsNotificationSystemModifyCompleted             hcsNotification = 0x0000000C\n\thcsNotificationSystemCrashInitiated              hcsNotification = 0x0000000D\n\thcsNotificationSystemGuestConnectionClosed       hcsNotification = 0x0000000E\n\n\t// Notifications for HCS_PROCESS handles\n\thcsNotificationProcessExited hcsNotification = 0x00010000\n\n\t// Common notifications\n\thcsNotificationInvalid           hcsNotification = 0x00000000\n\thcsNotificationServiceDisconnect hcsNotification = 0x01000000\n)\n\ntype hcsNotification uint32\n\nfunc (hn hcsNotification) String() string {\n\tswitch hn {\n\tcase hcsNotificationSystemExited:\n\t\treturn \"SystemExited\"\n\tcase hcsNotificationSystemCreateCompleted:\n\t\treturn \"SystemCreateCompleted\"\n\tcase hcsNotificationSystemStartCompleted:\n\t\treturn \"SystemStartCompleted\"\n\tcase hcsNotificationSystemPauseCompleted:\n\t\treturn \"SystemPauseCompleted\"\n\tcase hcsNotificationSystemResumeCompleted:\n\t\treturn \"SystemResumeCompleted\"\n\tcase hcsNotificationSystemCrashReport:\n\t\treturn \"SystemCrashReport\"\n\tcase hcsNotificationSystemSiloJobCreated:\n\t\treturn \"SystemSiloJobCreated\"\n\tcase hcsNotificationSystemSaveCompleted:\n\t\treturn \"SystemSaveCompleted\"\n\tcase hcsNotificationSystemRdpEnhancedModeStateChanged:\n\t\treturn \"SystemRdpEnhancedModeStateChanged\"\n\tcase hcsNotificationSystemShutdownFailed:\n\t\treturn \"SystemShutdownFailed\"\n\tcase hcsNotificationSystemGetPropertiesCompleted:\n\t\treturn \"SystemGetPropertiesCompleted\"\n\tcase hcsNotificationSystemModifyCompleted:\n\t\treturn \"SystemModifyCompleted\"\n\tcase hcsNotificationSystemCrashInitiated:\n\t\treturn \"SystemCrashInitiated\"\n\tcase hcsNotificationSystemGuestConnectionClosed:\n\t\treturn \"SystemGuestConnectionClosed\"\n\tcase hcsNotificationProcessExited:\n\t\treturn \"ProcessExited\"\n\tcase hcsNotificationInvalid:\n\t\treturn \"Invalid\"\n\tcase hcsNotificationServiceDisconnect:\n\t\treturn \"ServiceDisconnect\"\n\tdefault:\n\t\treturn fmt.Sprintf(\"Unknown: %d\", hn)\n\t}\n}\n\ntype notificationChannel chan error\n\ntype notificationWatcherContext struct {\n\tchannels notificationChannels\n\thandle   vmcompute.HcsCallback\n\n\tsystemID  string\n\tprocessID int\n}\n\ntype notificationChannels map[hcsNotification]notificationChannel\n\nfunc newSystemChannels() notificationChannels {\n\tchannels := make(notificationChannels)\n\tfor _, notif := range []hcsNotification{\n\t\thcsNotificationServiceDisconnect,\n\t\thcsNotificationSystemExited,\n\t\thcsNotificationSystemCreateCompleted,\n\t\thcsNotificationSystemStartCompleted,\n\t\thcsNotificationSystemPauseCompleted,\n\t\thcsNotificationSystemResumeCompleted,\n\t\thcsNotificationSystemSaveCompleted,\n\t} {\n\t\tchannels[notif] = make(notificationChannel, 1)\n\t}\n\treturn channels\n}\n\nfunc newProcessChannels() notificationChannels {\n\tchannels := make(notificationChannels)\n\tfor _, notif := range []hcsNotification{\n\t\thcsNotificationServiceDisconnect,\n\t\thcsNotificationProcessExited,\n\t} {\n\t\tchannels[notif] = make(notificationChannel, 1)\n\t}\n\treturn channels\n}\n\nfunc closeChannels(channels notificationChannels) {\n\tfor _, c := range channels {\n\t\tclose(c)\n\t}\n}\n\nfunc notificationWatcher(notificationType hcsNotification, callbackNumber uintptr, notificationStatus uintptr, notificationData *uint16) uintptr {\n\tvar result error\n\tif int32(notificationStatus) < 0 {\n\t\tresult = interop.Win32FromHresult(notificationStatus)\n\t}\n\n\tcallbackMapLock.RLock()\n\tcontext := callbackMap[callbackNumber]\n\tcallbackMapLock.RUnlock()\n\n\tif context == nil {\n\t\treturn 0\n\t}\n\n\tlog := logrus.WithFields(logrus.Fields{\n\t\t\"notification-type\": notificationType.String(),\n\t\t\"system-id\":         context.systemID,\n\t})\n\tif context.processID != 0 {\n\t\tlog.Data[logfields.ProcessID] = context.processID\n\t}\n\tlog.Debug(\"HCS notification\")\n\n\tif channel, ok := context.channels[notificationType]; ok {\n\t\tchannel <- result\n\t}\n\n\treturn 0\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/doc.go",
    "content": "package hcs\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/errors.go",
    "content": "//go:build windows\n\npackage hcs\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"syscall\"\n\n\t\"github.com/Microsoft/hcsshim/internal/log\"\n)\n\nvar (\n\t// ErrComputeSystemDoesNotExist is an error encountered when the container being operated on no longer exists\n\tErrComputeSystemDoesNotExist = syscall.Errno(0xc037010e)\n\n\t// ErrElementNotFound is an error encountered when the object being referenced does not exist\n\tErrElementNotFound = syscall.Errno(0x490)\n\n\t// ErrElementNotFound is an error encountered when the object being referenced does not exist\n\tErrNotSupported = syscall.Errno(0x32)\n\n\t// ErrInvalidData is an error encountered when the request being sent to hcs is invalid/unsupported\n\t// decimal -2147024883 / hex 0x8007000d\n\tErrInvalidData = syscall.Errno(0xd)\n\n\t// ErrHandleClose is an error encountered when the handle generating the notification being waited on has been closed\n\tErrHandleClose = errors.New(\"hcsshim: the handle generating this notification has been closed\")\n\n\t// ErrAlreadyClosed is an error encountered when using a handle that has been closed by the Close method\n\tErrAlreadyClosed = errors.New(\"hcsshim: the handle has already been closed\")\n\n\t// ErrInvalidNotificationType is an error encountered when an invalid notification type is used\n\tErrInvalidNotificationType = errors.New(\"hcsshim: invalid notification type\")\n\n\t// ErrInvalidProcessState is an error encountered when the process is not in a valid state for the requested operation\n\tErrInvalidProcessState = errors.New(\"the process is in an invalid state for the attempted operation\")\n\n\t// ErrTimeout is an error encountered when waiting on a notification times out\n\tErrTimeout = errors.New(\"hcsshim: timeout waiting for notification\")\n\n\t// ErrUnexpectedContainerExit is the error encountered when a container exits while waiting for\n\t// a different expected notification\n\tErrUnexpectedContainerExit = errors.New(\"unexpected container exit\")\n\n\t// ErrUnexpectedProcessAbort is the error encountered when communication with the compute service\n\t// is lost while waiting for a notification\n\tErrUnexpectedProcessAbort = errors.New(\"lost communication with compute service\")\n\n\t// ErrUnexpectedValue is an error encountered when hcs returns an invalid value\n\tErrUnexpectedValue = errors.New(\"unexpected value returned from hcs\")\n\n\t// ErrOperationDenied is an error when hcs attempts an operation that is explicitly denied\n\tErrOperationDenied = errors.New(\"operation denied\")\n\n\t// ErrVmcomputeAlreadyStopped is an error encountered when a shutdown or terminate request is made on a stopped container\n\tErrVmcomputeAlreadyStopped = syscall.Errno(0xc0370110)\n\n\t// ErrVmcomputeOperationPending is an error encountered when the operation is being completed asynchronously\n\tErrVmcomputeOperationPending = syscall.Errno(0xC0370103)\n\n\t// ErrVmcomputeOperationInvalidState is an error encountered when the compute system is not in a valid state for the requested operation\n\tErrVmcomputeOperationInvalidState = syscall.Errno(0xc0370105)\n\n\t// ErrProcNotFound is an error encountered when a procedure look up fails.\n\tErrProcNotFound = syscall.Errno(0x7f)\n\n\t// ErrVmcomputeOperationAccessIsDenied is an error which can be encountered when enumerating compute systems in RS1/RS2\n\t// builds when the underlying silo might be in the process of terminating. HCS was fixed in RS3.\n\tErrVmcomputeOperationAccessIsDenied = syscall.Errno(0x5)\n\n\t// ErrVmcomputeInvalidJSON is an error encountered when the compute system does not support/understand the messages sent by management\n\tErrVmcomputeInvalidJSON = syscall.Errno(0xc037010d)\n\n\t// ErrVmcomputeUnknownMessage is an error encountered guest compute system doesn't support the message\n\tErrVmcomputeUnknownMessage = syscall.Errno(0xc037010b)\n\n\t// ErrVmcomputeUnexpectedExit is an error encountered when the compute system terminates unexpectedly\n\tErrVmcomputeUnexpectedExit = syscall.Errno(0xC0370106)\n\n\t// ErrNotSupported is an error encountered when hcs doesn't support the request\n\tErrPlatformNotSupported = errors.New(\"unsupported platform request\")\n\n\t// ErrProcessAlreadyStopped is returned by hcs if the process we're trying to kill has already been stopped.\n\tErrProcessAlreadyStopped = syscall.Errno(0x8037011f)\n\n\t// ErrInvalidHandle is an error that can be encountered when querying the properties of a compute system when the handle to that\n\t// compute system has already been closed.\n\tErrInvalidHandle = syscall.Errno(0x6)\n)\n\ntype ErrorEvent struct {\n\tMessage    string `json:\"Message,omitempty\"`    // Fully formated error message\n\tStackTrace string `json:\"StackTrace,omitempty\"` // Stack trace in string form\n\tProvider   string `json:\"Provider,omitempty\"`\n\tEventID    uint16 `json:\"EventId,omitempty\"`\n\tFlags      uint32 `json:\"Flags,omitempty\"`\n\tSource     string `json:\"Source,omitempty\"`\n\t//Data       []EventData `json:\"Data,omitempty\"`  // Omit this as HCS doesn't encode this well. It's more confusing to include. It is however logged in debug mode (see processHcsResult function)\n}\n\ntype hcsResult struct {\n\tError        int32\n\tErrorMessage string\n\tErrorEvents  []ErrorEvent `json:\"ErrorEvents,omitempty\"`\n}\n\nfunc (ev *ErrorEvent) String() string {\n\tevs := \"[Event Detail: \" + ev.Message\n\tif ev.StackTrace != \"\" {\n\t\tevs += \" Stack Trace: \" + ev.StackTrace\n\t}\n\tif ev.Provider != \"\" {\n\t\tevs += \" Provider: \" + ev.Provider\n\t}\n\tif ev.EventID != 0 {\n\t\tevs = fmt.Sprintf(\"%s EventID: %d\", evs, ev.EventID)\n\t}\n\tif ev.Flags != 0 {\n\t\tevs = fmt.Sprintf(\"%s flags: %d\", evs, ev.Flags)\n\t}\n\tif ev.Source != \"\" {\n\t\tevs += \" Source: \" + ev.Source\n\t}\n\tevs += \"]\"\n\treturn evs\n}\n\nfunc processHcsResult(ctx context.Context, resultJSON string) []ErrorEvent {\n\tif resultJSON != \"\" {\n\t\tresult := &hcsResult{}\n\t\tif err := json.Unmarshal([]byte(resultJSON), result); err != nil {\n\t\t\tlog.G(ctx).WithError(err).Warning(\"Could not unmarshal HCS result\")\n\t\t\treturn nil\n\t\t}\n\t\treturn result.ErrorEvents\n\t}\n\treturn nil\n}\n\ntype HcsError struct {\n\tOp     string\n\tErr    error\n\tEvents []ErrorEvent\n}\n\nvar _ net.Error = &HcsError{}\n\nfunc (e *HcsError) Error() string {\n\ts := e.Op + \": \" + e.Err.Error()\n\tfor _, ev := range e.Events {\n\t\ts += \"\\n\" + ev.String()\n\t}\n\treturn s\n}\n\nfunc (e *HcsError) Is(target error) bool {\n\treturn errors.Is(e.Err, target)\n}\n\n// unwrap isnt really needed, but helpful convince function\n\nfunc (e *HcsError) Unwrap() error {\n\treturn e.Err\n}\n\n// Deprecated: net.Error.Temporary is deprecated.\nfunc (e *HcsError) Temporary() bool {\n\terr := e.netError()\n\treturn (err != nil) && err.Temporary()\n}\n\nfunc (e *HcsError) Timeout() bool {\n\terr := e.netError()\n\treturn (err != nil) && err.Timeout()\n}\n\nfunc (e *HcsError) netError() (err net.Error) {\n\tif errors.As(e.Unwrap(), &err) {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// SystemError is an error encountered in HCS during an operation on a Container object\ntype SystemError struct {\n\tHcsError\n\tID string\n}\n\nvar _ net.Error = &SystemError{}\n\nfunc (e *SystemError) Error() string {\n\ts := e.Op + \" \" + e.ID + \": \" + e.Err.Error()\n\tfor _, ev := range e.Events {\n\t\ts += \"\\n\" + ev.String()\n\t}\n\treturn s\n}\n\nfunc makeSystemError(system *System, op string, err error, events []ErrorEvent) error {\n\t// Don't double wrap errors\n\tvar e *SystemError\n\tif errors.As(err, &e) {\n\t\treturn err\n\t}\n\n\treturn &SystemError{\n\t\tID: system.ID(),\n\t\tHcsError: HcsError{\n\t\t\tOp:     op,\n\t\t\tErr:    err,\n\t\t\tEvents: events,\n\t\t},\n\t}\n}\n\n// ProcessError is an error encountered in HCS during an operation on a Process object\ntype ProcessError struct {\n\tHcsError\n\tSystemID string\n\tPid      int\n}\n\nvar _ net.Error = &ProcessError{}\n\nfunc (e *ProcessError) Error() string {\n\ts := fmt.Sprintf(\"%s %s:%d: %s\", e.Op, e.SystemID, e.Pid, e.Err.Error())\n\tfor _, ev := range e.Events {\n\t\ts += \"\\n\" + ev.String()\n\t}\n\treturn s\n}\n\nfunc makeProcessError(process *Process, op string, err error, events []ErrorEvent) error {\n\t// Don't double wrap errors\n\tvar e *ProcessError\n\tif errors.As(err, &e) {\n\t\treturn err\n\t}\n\treturn &ProcessError{\n\t\tPid:      process.Pid(),\n\t\tSystemID: process.SystemID(),\n\t\tHcsError: HcsError{\n\t\t\tOp:     op,\n\t\t\tErr:    err,\n\t\t\tEvents: events,\n\t\t},\n\t}\n}\n\n// IsNotExist checks if an error is caused by the Container or Process not existing.\n// Note: Currently, ErrElementNotFound can mean that a Process has either\n// already exited, or does not exist. Both IsAlreadyStopped and IsNotExist\n// will currently return true when the error is ErrElementNotFound.\nfunc IsNotExist(err error) bool {\n\treturn IsAny(err, ErrComputeSystemDoesNotExist, ErrElementNotFound)\n}\n\n// IsErrorInvalidHandle checks whether the error is the result of an operation carried\n// out on a handle that is invalid/closed. This error popped up while trying to query\n// stats on a container in the process of being stopped.\nfunc IsErrorInvalidHandle(err error) bool {\n\treturn errors.Is(err, ErrInvalidHandle)\n}\n\n// IsAlreadyClosed checks if an error is caused by the Container or Process having been\n// already closed by a call to the Close() method.\nfunc IsAlreadyClosed(err error) bool {\n\treturn errors.Is(err, ErrAlreadyClosed)\n}\n\n// IsPending returns a boolean indicating whether the error is that\n// the requested operation is being completed in the background.\nfunc IsPending(err error) bool {\n\treturn errors.Is(err, ErrVmcomputeOperationPending)\n}\n\n// IsTimeout returns a boolean indicating whether the error is caused by\n// a timeout waiting for the operation to complete.\nfunc IsTimeout(err error) bool {\n\t// HcsError and co. implement Timeout regardless of whether the errors they wrap do,\n\t// so `errors.As(err, net.Error)`` will always be true.\n\t// Using `errors.As(err.Unwrap(), net.Err)` wont work for general errors.\n\t// So first check if there an `ErrTimeout` in the chain, then convert to a net error.\n\tif errors.Is(err, ErrTimeout) {\n\t\treturn true\n\t}\n\n\tvar nerr net.Error\n\treturn errors.As(err, &nerr) && nerr.Timeout()\n}\n\n// IsAlreadyStopped returns a boolean indicating whether the error is caused by\n// a Container or Process being already stopped.\n// Note: Currently, ErrElementNotFound can mean that a Process has either\n// already exited, or does not exist. Both IsAlreadyStopped and IsNotExist\n// will currently return true when the error is ErrElementNotFound.\nfunc IsAlreadyStopped(err error) bool {\n\treturn IsAny(err, ErrVmcomputeAlreadyStopped, ErrProcessAlreadyStopped, ErrElementNotFound)\n}\n\n// IsNotSupported returns a boolean indicating whether the error is caused by\n// unsupported platform requests\n// Note: Currently Unsupported platform requests can be mean either\n// ErrVmcomputeInvalidJSON, ErrInvalidData, ErrNotSupported or ErrVmcomputeUnknownMessage\n// is thrown from the Platform\nfunc IsNotSupported(err error) bool {\n\t// If Platform doesn't recognize or support the request sent, below errors are seen\n\treturn IsAny(err, ErrVmcomputeInvalidJSON, ErrInvalidData, ErrNotSupported, ErrVmcomputeUnknownMessage)\n}\n\n// IsOperationInvalidState returns true when err is caused by\n// `ErrVmcomputeOperationInvalidState`.\nfunc IsOperationInvalidState(err error) bool {\n\treturn errors.Is(err, ErrVmcomputeOperationInvalidState)\n}\n\n// IsAccessIsDenied returns true when err is caused by\n// `ErrVmcomputeOperationAccessIsDenied`.\nfunc IsAccessIsDenied(err error) bool {\n\treturn errors.Is(err, ErrVmcomputeOperationAccessIsDenied)\n}\n\n// IsAny is a vectorized version of [errors.Is], it returns true if err is one of targets.\nfunc IsAny(err error, targets ...error) bool {\n\tfor _, e := range targets {\n\t\tif errors.Is(err, e) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go",
    "content": "//go:build windows\n\npackage hcs\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"io\"\n\t\"os\"\n\t\"sync\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"go.opencensus.io/trace\"\n\n\t\"github.com/Microsoft/hcsshim/internal/cow\"\n\thcsschema \"github.com/Microsoft/hcsshim/internal/hcs/schema2\"\n\t\"github.com/Microsoft/hcsshim/internal/log\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"github.com/Microsoft/hcsshim/internal/protocol/guestrequest\"\n\t\"github.com/Microsoft/hcsshim/internal/vmcompute\"\n)\n\ntype Process struct {\n\thandleLock          sync.RWMutex\n\thandle              vmcompute.HcsProcess\n\tprocessID           int\n\tsystem              *System\n\thasCachedStdio      bool\n\tstdioLock           sync.Mutex\n\tstdin               io.WriteCloser\n\tstdout              io.ReadCloser\n\tstderr              io.ReadCloser\n\tcallbackNumber      uintptr\n\tkillSignalDelivered bool\n\n\tclosedWaitOnce sync.Once\n\twaitBlock      chan struct{}\n\texitCode       int\n\twaitError      error\n}\n\nvar _ cow.Process = &Process{}\n\nfunc newProcess(process vmcompute.HcsProcess, processID int, computeSystem *System) *Process {\n\treturn &Process{\n\t\thandle:    process,\n\t\tprocessID: processID,\n\t\tsystem:    computeSystem,\n\t\twaitBlock: make(chan struct{}),\n\t}\n}\n\n// Pid returns the process ID of the process within the container.\nfunc (process *Process) Pid() int {\n\treturn process.processID\n}\n\n// SystemID returns the ID of the process's compute system.\nfunc (process *Process) SystemID() string {\n\treturn process.system.ID()\n}\n\nfunc (process *Process) processSignalResult(ctx context.Context, err error) (bool, error) {\n\tif err == nil {\n\t\treturn true, nil\n\t}\n\tif errors.Is(err, ErrVmcomputeOperationInvalidState) || errors.Is(err, ErrComputeSystemDoesNotExist) || errors.Is(err, ErrElementNotFound) {\n\t\tif !process.stopped() {\n\t\t\t// The process should be gone, but we have not received the notification.\n\t\t\t// After a second, force unblock the process wait to work around a possible\n\t\t\t// deadlock in the HCS.\n\t\t\tgo func() {\n\t\t\t\ttime.Sleep(time.Second)\n\t\t\t\tprocess.closedWaitOnce.Do(func() {\n\t\t\t\t\tlog.G(ctx).WithError(err).Warn(\"force unblocking process waits\")\n\t\t\t\t\tprocess.exitCode = -1\n\t\t\t\t\tprocess.waitError = err\n\t\t\t\t\tclose(process.waitBlock)\n\t\t\t\t})\n\t\t\t}()\n\t\t}\n\t\treturn false, nil\n\t}\n\treturn false, nil\n}\n\n// Signal signals the process with `options`.\n//\n// For LCOW `guestresource.SignalProcessOptionsLCOW`.\n//\n// For WCOW `guestresource.SignalProcessOptionsWCOW`.\nfunc (process *Process) Signal(ctx context.Context, options interface{}) (bool, error) {\n\tprocess.handleLock.RLock()\n\tdefer process.handleLock.RUnlock()\n\n\toperation := \"hcs::Process::Signal\"\n\n\tif process.handle == 0 {\n\t\treturn false, makeProcessError(process, operation, ErrAlreadyClosed, nil)\n\t}\n\n\toptionsb, err := json.Marshal(options)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\tresultJSON, err := vmcompute.HcsSignalProcess(ctx, process.handle, string(optionsb))\n\tevents := processHcsResult(ctx, resultJSON)\n\tdelivered, err := process.processSignalResult(ctx, err)\n\tif err != nil {\n\t\terr = makeProcessError(process, operation, err, events)\n\t}\n\treturn delivered, err\n}\n\n// Kill signals the process to terminate but does not wait for it to finish terminating.\nfunc (process *Process) Kill(ctx context.Context) (bool, error) {\n\tprocess.handleLock.RLock()\n\tdefer process.handleLock.RUnlock()\n\n\toperation := \"hcs::Process::Kill\"\n\n\tif process.handle == 0 {\n\t\treturn false, makeProcessError(process, operation, ErrAlreadyClosed, nil)\n\t}\n\n\tif process.stopped() {\n\t\treturn false, makeProcessError(process, operation, ErrProcessAlreadyStopped, nil)\n\t}\n\n\tif process.killSignalDelivered {\n\t\t// A kill signal has already been sent to this process. Sending a second\n\t\t// one offers no real benefit, as processes cannot stop themselves from\n\t\t// being terminated, once a TerminateProcess has been issued. Sending a\n\t\t// second kill may result in a number of errors (two of which detailed bellow)\n\t\t// and which we can avoid handling.\n\t\treturn true, nil\n\t}\n\n\t// HCS serializes the signals sent to a target pid per compute system handle.\n\t// To avoid SIGKILL being serialized behind other signals, we open a new compute\n\t// system handle to deliver the kill signal.\n\t// If the calls to opening a new compute system handle fail, we forcefully\n\t// terminate the container itself so that no container is left behind\n\thcsSystem, err := OpenComputeSystem(ctx, process.system.id)\n\tif err != nil {\n\t\t// log error and force termination of container\n\t\tlog.G(ctx).WithField(\"err\", err).Error(\"OpenComputeSystem() call failed\")\n\t\terr = process.system.Terminate(ctx)\n\t\t// if the Terminate() call itself ever failed, log and return error\n\t\tif err != nil {\n\t\t\tlog.G(ctx).WithField(\"err\", err).Error(\"Terminate() call failed\")\n\t\t\treturn false, err\n\t\t}\n\t\tprocess.system.Close()\n\t\treturn true, nil\n\t}\n\tdefer hcsSystem.Close()\n\n\tnewProcessHandle, err := hcsSystem.OpenProcess(ctx, process.Pid())\n\tif err != nil {\n\t\t// Return true only if the target process has either already\n\t\t// exited, or does not exist.\n\t\tif IsAlreadyStopped(err) {\n\t\t\treturn true, nil\n\t\t} else {\n\t\t\treturn false, err\n\t\t}\n\t}\n\tdefer newProcessHandle.Close()\n\n\tresultJSON, err := vmcompute.HcsTerminateProcess(ctx, newProcessHandle.handle)\n\tif err != nil {\n\t\t// We still need to check these two cases, as processes may still be killed by an\n\t\t// external actor (human operator, OOM, random script etc).\n\t\tif errors.Is(err, os.ErrPermission) || IsAlreadyStopped(err) {\n\t\t\t// There are two cases where it should be safe to ignore an error returned\n\t\t\t// by HcsTerminateProcess. The first one is cause by the fact that\n\t\t\t// HcsTerminateProcess ends up calling TerminateProcess in the context\n\t\t\t// of a container. According to the TerminateProcess documentation:\n\t\t\t// https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-terminateprocess#remarks\n\t\t\t// After a process has terminated, call to TerminateProcess with open\n\t\t\t// handles to the process fails with ERROR_ACCESS_DENIED (5) error code.\n\t\t\t// It's safe to ignore this error here. HCS should always have permissions\n\t\t\t// to kill processes inside any container. So an ERROR_ACCESS_DENIED\n\t\t\t// is unlikely to be anything else than what the ending remarks in the\n\t\t\t// documentation states.\n\t\t\t//\n\t\t\t// The second case is generated by hcs itself, if for any reason HcsTerminateProcess\n\t\t\t// is called twice in a very short amount of time. In such cases, hcs may return\n\t\t\t// HCS_E_PROCESS_ALREADY_STOPPED.\n\t\t\treturn true, nil\n\t\t}\n\t}\n\tevents := processHcsResult(ctx, resultJSON)\n\tdelivered, err := newProcessHandle.processSignalResult(ctx, err)\n\tif err != nil {\n\t\terr = makeProcessError(newProcessHandle, operation, err, events)\n\t}\n\n\tprocess.killSignalDelivered = delivered\n\treturn delivered, err\n}\n\n// waitBackground waits for the process exit notification. Once received sets\n// `process.waitError` (if any) and unblocks all `Wait` calls.\n//\n// This MUST be called exactly once per `process.handle` but `Wait` is safe to\n// call multiple times.\nfunc (process *Process) waitBackground() {\n\toperation := \"hcs::Process::waitBackground\"\n\tctx, span := oc.StartSpan(context.Background(), operation)\n\tdefer span.End()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"cid\", process.SystemID()),\n\t\ttrace.Int64Attribute(\"pid\", int64(process.processID)))\n\n\tvar (\n\t\terr            error\n\t\texitCode       = -1\n\t\tpropertiesJSON string\n\t\tresultJSON     string\n\t)\n\n\terr = waitForNotification(ctx, process.callbackNumber, hcsNotificationProcessExited, nil)\n\tif err != nil {\n\t\terr = makeProcessError(process, operation, err, nil)\n\t\tlog.G(ctx).WithError(err).Error(\"failed wait\")\n\t} else {\n\t\tprocess.handleLock.RLock()\n\t\tdefer process.handleLock.RUnlock()\n\n\t\t// Make sure we didn't race with Close() here\n\t\tif process.handle != 0 {\n\t\t\tpropertiesJSON, resultJSON, err = vmcompute.HcsGetProcessProperties(ctx, process.handle)\n\t\t\tevents := processHcsResult(ctx, resultJSON)\n\t\t\tif err != nil {\n\t\t\t\terr = makeProcessError(process, operation, err, events)\n\t\t\t} else {\n\t\t\t\tproperties := &hcsschema.ProcessStatus{}\n\t\t\t\terr = json.Unmarshal([]byte(propertiesJSON), properties)\n\t\t\t\tif err != nil {\n\t\t\t\t\terr = makeProcessError(process, operation, err, nil)\n\t\t\t\t} else {\n\t\t\t\t\tif properties.LastWaitResult != 0 {\n\t\t\t\t\t\tlog.G(ctx).WithField(\"wait-result\", properties.LastWaitResult).Warning(\"non-zero last wait result\")\n\t\t\t\t\t} else {\n\t\t\t\t\t\texitCode = int(properties.ExitCode)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tlog.G(ctx).WithField(\"exitCode\", exitCode).Debug(\"process exited\")\n\n\tprocess.closedWaitOnce.Do(func() {\n\t\tprocess.exitCode = exitCode\n\t\tprocess.waitError = err\n\t\tclose(process.waitBlock)\n\t})\n\toc.SetSpanStatus(span, err)\n}\n\n// Wait waits for the process to exit. If the process has already exited returns\n// the previous error (if any).\nfunc (process *Process) Wait() error {\n\t<-process.waitBlock\n\treturn process.waitError\n}\n\n// Exited returns if the process has stopped\nfunc (process *Process) stopped() bool {\n\tselect {\n\tcase <-process.waitBlock:\n\t\treturn true\n\tdefault:\n\t\treturn false\n\t}\n}\n\n// ResizeConsole resizes the console of the process.\nfunc (process *Process) ResizeConsole(ctx context.Context, width, height uint16) error {\n\tprocess.handleLock.RLock()\n\tdefer process.handleLock.RUnlock()\n\n\toperation := \"hcs::Process::ResizeConsole\"\n\n\tif process.handle == 0 {\n\t\treturn makeProcessError(process, operation, ErrAlreadyClosed, nil)\n\t}\n\tmodifyRequest := hcsschema.ProcessModifyRequest{\n\t\tOperation: guestrequest.ModifyProcessConsoleSize,\n\t\tConsoleSize: &hcsschema.ConsoleSize{\n\t\t\tHeight: height,\n\t\t\tWidth:  width,\n\t\t},\n\t}\n\n\tmodifyRequestb, err := json.Marshal(modifyRequest)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tresultJSON, err := vmcompute.HcsModifyProcess(ctx, process.handle, string(modifyRequestb))\n\tevents := processHcsResult(ctx, resultJSON)\n\tif err != nil {\n\t\treturn makeProcessError(process, operation, err, events)\n\t}\n\n\treturn nil\n}\n\n// ExitCode returns the exit code of the process. The process must have\n// already terminated.\nfunc (process *Process) ExitCode() (int, error) {\n\tif !process.stopped() {\n\t\treturn -1, makeProcessError(process, \"hcs::Process::ExitCode\", ErrInvalidProcessState, nil)\n\t}\n\tif process.waitError != nil {\n\t\treturn -1, process.waitError\n\t}\n\treturn process.exitCode, nil\n}\n\n// StdioLegacy returns the stdin, stdout, and stderr pipes, respectively. Closing\n// these pipes does not close the underlying pipes. Once returned, these pipes\n// are the responsibility of the caller to close.\nfunc (process *Process) StdioLegacy() (_ io.WriteCloser, _ io.ReadCloser, _ io.ReadCloser, err error) {\n\toperation := \"hcs::Process::StdioLegacy\"\n\tctx, span := oc.StartSpan(context.Background(), operation)\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"cid\", process.SystemID()),\n\t\ttrace.Int64Attribute(\"pid\", int64(process.processID)))\n\n\tprocess.handleLock.RLock()\n\tdefer process.handleLock.RUnlock()\n\n\tif process.handle == 0 {\n\t\treturn nil, nil, nil, makeProcessError(process, operation, ErrAlreadyClosed, nil)\n\t}\n\n\tprocess.stdioLock.Lock()\n\tdefer process.stdioLock.Unlock()\n\tif process.hasCachedStdio {\n\t\tstdin, stdout, stderr := process.stdin, process.stdout, process.stderr\n\t\tprocess.stdin, process.stdout, process.stderr = nil, nil, nil\n\t\tprocess.hasCachedStdio = false\n\t\treturn stdin, stdout, stderr, nil\n\t}\n\n\tprocessInfo, resultJSON, err := vmcompute.HcsGetProcessInfo(ctx, process.handle)\n\tevents := processHcsResult(ctx, resultJSON)\n\tif err != nil {\n\t\treturn nil, nil, nil, makeProcessError(process, operation, err, events)\n\t}\n\n\tpipes, err := makeOpenFiles([]syscall.Handle{processInfo.StdInput, processInfo.StdOutput, processInfo.StdError})\n\tif err != nil {\n\t\treturn nil, nil, nil, makeProcessError(process, operation, err, nil)\n\t}\n\n\treturn pipes[0], pipes[1], pipes[2], nil\n}\n\n// Stdio returns the stdin, stdout, and stderr pipes, respectively.\n// To close them, close the process handle, or use the `CloseStd*` functions.\nfunc (process *Process) Stdio() (stdin io.Writer, stdout, stderr io.Reader) {\n\tprocess.stdioLock.Lock()\n\tdefer process.stdioLock.Unlock()\n\treturn process.stdin, process.stdout, process.stderr\n}\n\n// CloseStdin closes the write side of the stdin pipe so that the process is\n// notified on the read side that there is no more data in stdin.\nfunc (process *Process) CloseStdin(ctx context.Context) (err error) {\n\toperation := \"hcs::Process::CloseStdin\"\n\tctx, span := trace.StartSpan(ctx, operation)\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"cid\", process.SystemID()),\n\t\ttrace.Int64Attribute(\"pid\", int64(process.processID)))\n\n\tprocess.handleLock.RLock()\n\tdefer process.handleLock.RUnlock()\n\n\tif process.handle == 0 {\n\t\treturn makeProcessError(process, operation, ErrAlreadyClosed, nil)\n\t}\n\n\t//HcsModifyProcess request to close stdin will fail if the process has already exited\n\tif !process.stopped() {\n\t\tmodifyRequest := hcsschema.ProcessModifyRequest{\n\t\t\tOperation: guestrequest.CloseProcessHandle,\n\t\t\tCloseHandle: &hcsschema.CloseHandle{\n\t\t\t\tHandle: guestrequest.STDInHandle,\n\t\t\t},\n\t\t}\n\n\t\tmodifyRequestb, err := json.Marshal(modifyRequest)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tresultJSON, err := vmcompute.HcsModifyProcess(ctx, process.handle, string(modifyRequestb))\n\t\tevents := processHcsResult(ctx, resultJSON)\n\t\tif err != nil {\n\t\t\treturn makeProcessError(process, operation, err, events)\n\t\t}\n\t}\n\n\tprocess.stdioLock.Lock()\n\tdefer process.stdioLock.Unlock()\n\tif process.stdin != nil {\n\t\tprocess.stdin.Close()\n\t\tprocess.stdin = nil\n\t}\n\n\treturn nil\n}\n\nfunc (process *Process) CloseStdout(ctx context.Context) (err error) {\n\tctx, span := oc.StartSpan(ctx, \"hcs::Process::CloseStdout\") //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"cid\", process.SystemID()),\n\t\ttrace.Int64Attribute(\"pid\", int64(process.processID)))\n\n\tprocess.handleLock.Lock()\n\tdefer process.handleLock.Unlock()\n\n\tif process.handle == 0 {\n\t\treturn nil\n\t}\n\n\tprocess.stdioLock.Lock()\n\tdefer process.stdioLock.Unlock()\n\tif process.stdout != nil {\n\t\tprocess.stdout.Close()\n\t\tprocess.stdout = nil\n\t}\n\treturn nil\n}\n\nfunc (process *Process) CloseStderr(ctx context.Context) (err error) {\n\tctx, span := oc.StartSpan(ctx, \"hcs::Process::CloseStderr\") //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"cid\", process.SystemID()),\n\t\ttrace.Int64Attribute(\"pid\", int64(process.processID)))\n\n\tprocess.handleLock.Lock()\n\tdefer process.handleLock.Unlock()\n\n\tif process.handle == 0 {\n\t\treturn nil\n\t}\n\n\tprocess.stdioLock.Lock()\n\tdefer process.stdioLock.Unlock()\n\tif process.stderr != nil {\n\t\tprocess.stderr.Close()\n\t\tprocess.stderr = nil\n\t}\n\treturn nil\n}\n\n// Close cleans up any state associated with the process but does not kill\n// or wait on it.\nfunc (process *Process) Close() (err error) {\n\toperation := \"hcs::Process::Close\"\n\tctx, span := oc.StartSpan(context.Background(), operation)\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"cid\", process.SystemID()),\n\t\ttrace.Int64Attribute(\"pid\", int64(process.processID)))\n\n\tprocess.handleLock.Lock()\n\tdefer process.handleLock.Unlock()\n\n\t// Don't double free this\n\tif process.handle == 0 {\n\t\treturn nil\n\t}\n\n\tprocess.stdioLock.Lock()\n\tif process.stdin != nil {\n\t\tprocess.stdin.Close()\n\t\tprocess.stdin = nil\n\t}\n\tif process.stdout != nil {\n\t\tprocess.stdout.Close()\n\t\tprocess.stdout = nil\n\t}\n\tif process.stderr != nil {\n\t\tprocess.stderr.Close()\n\t\tprocess.stderr = nil\n\t}\n\tprocess.stdioLock.Unlock()\n\n\tif err = process.unregisterCallback(ctx); err != nil {\n\t\treturn makeProcessError(process, operation, err, nil)\n\t}\n\n\tif err = vmcompute.HcsCloseProcess(ctx, process.handle); err != nil {\n\t\treturn makeProcessError(process, operation, err, nil)\n\t}\n\n\tprocess.handle = 0\n\tprocess.closedWaitOnce.Do(func() {\n\t\tprocess.exitCode = -1\n\t\tprocess.waitError = ErrAlreadyClosed\n\t\tclose(process.waitBlock)\n\t})\n\n\treturn nil\n}\n\nfunc (process *Process) registerCallback(ctx context.Context) error {\n\tcallbackContext := &notificationWatcherContext{\n\t\tchannels:  newProcessChannels(),\n\t\tsystemID:  process.SystemID(),\n\t\tprocessID: process.processID,\n\t}\n\n\tcallbackMapLock.Lock()\n\tcallbackNumber := nextCallback\n\tnextCallback++\n\tcallbackMap[callbackNumber] = callbackContext\n\tcallbackMapLock.Unlock()\n\n\tcallbackHandle, err := vmcompute.HcsRegisterProcessCallback(ctx, process.handle, notificationWatcherCallback, callbackNumber)\n\tif err != nil {\n\t\treturn err\n\t}\n\tcallbackContext.handle = callbackHandle\n\tprocess.callbackNumber = callbackNumber\n\n\treturn nil\n}\n\nfunc (process *Process) unregisterCallback(ctx context.Context) error {\n\tcallbackNumber := process.callbackNumber\n\n\tcallbackMapLock.RLock()\n\tcallbackContext := callbackMap[callbackNumber]\n\tcallbackMapLock.RUnlock()\n\n\tif callbackContext == nil {\n\t\treturn nil\n\t}\n\n\thandle := callbackContext.handle\n\n\tif handle == 0 {\n\t\treturn nil\n\t}\n\n\t// vmcompute.HcsUnregisterProcessCallback has its own synchronization to\n\t// wait for all callbacks to complete. We must NOT hold the callbackMapLock.\n\terr := vmcompute.HcsUnregisterProcessCallback(ctx, handle)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tcloseChannels(callbackContext.channels)\n\n\tcallbackMapLock.Lock()\n\tdelete(callbackMap, callbackNumber)\n\tcallbackMapLock.Unlock()\n\n\thandle = 0 //nolint:ineffassign\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema1/schema1.go",
    "content": "//go:build windows\n\npackage schema1\n\nimport (\n\t\"encoding/json\"\n\t\"time\"\n\n\t\"github.com/Microsoft/go-winio/pkg/guid\"\n\thcsschema \"github.com/Microsoft/hcsshim/internal/hcs/schema2\"\n)\n\n// ProcessConfig is used as both the input of Container.CreateProcess\n// and to convert the parameters to JSON for passing onto the HCS\ntype ProcessConfig struct {\n\tApplicationName   string            `json:\",omitempty\"`\n\tCommandLine       string            `json:\",omitempty\"`\n\tCommandArgs       []string          `json:\",omitempty\"` // Used by Linux Containers on Windows\n\tUser              string            `json:\",omitempty\"`\n\tWorkingDirectory  string            `json:\",omitempty\"`\n\tEnvironment       map[string]string `json:\",omitempty\"`\n\tEmulateConsole    bool              `json:\",omitempty\"`\n\tCreateStdInPipe   bool              `json:\",omitempty\"`\n\tCreateStdOutPipe  bool              `json:\",omitempty\"`\n\tCreateStdErrPipe  bool              `json:\",omitempty\"`\n\tConsoleSize       [2]uint           `json:\",omitempty\"`\n\tCreateInUtilityVm bool              `json:\",omitempty\"` // Used by Linux Containers on Windows\n\tOCISpecification  *json.RawMessage  `json:\",omitempty\"` // Used by Linux Containers on Windows\n}\n\ntype Layer struct {\n\tID   string\n\tPath string\n}\n\ntype MappedDir struct {\n\tHostPath          string\n\tContainerPath     string\n\tReadOnly          bool\n\tBandwidthMaximum  uint64\n\tIOPSMaximum       uint64\n\tCreateInUtilityVM bool\n\t// LinuxMetadata - Support added in 1803/RS4+.\n\tLinuxMetadata bool `json:\",omitempty\"`\n}\n\ntype MappedPipe struct {\n\tHostPath          string\n\tContainerPipeName string\n}\n\ntype HvRuntime struct {\n\tImagePath           string `json:\",omitempty\"`\n\tSkipTemplate        bool   `json:\",omitempty\"`\n\tLinuxInitrdFile     string `json:\",omitempty\"` // File under ImagePath on host containing an initrd image for starting a Linux utility VM\n\tLinuxKernelFile     string `json:\",omitempty\"` // File under ImagePath on host containing a kernel for starting a Linux utility VM\n\tLinuxBootParameters string `json:\",omitempty\"` // Additional boot parameters for starting a Linux Utility VM in initrd mode\n\tBootSource          string `json:\",omitempty\"` // \"Vhd\" for Linux Utility VM booting from VHD\n\tWritableBootSource  bool   `json:\",omitempty\"` // Linux Utility VM booting from VHD\n}\n\ntype MappedVirtualDisk struct {\n\tHostPath          string `json:\",omitempty\"` // Path to VHD on the host\n\tContainerPath     string // Platform-specific mount point path in the container\n\tCreateInUtilityVM bool   `json:\",omitempty\"`\n\tReadOnly          bool   `json:\",omitempty\"`\n\tCache             string `json:\",omitempty\"` // \"\" (Unspecified); \"Disabled\"; \"Enabled\"; \"Private\"; \"PrivateAllowSharing\"\n\tAttachOnly        bool   `json:\",omitempty\"`\n}\n\n// AssignedDevice represents a device that has been directly assigned to a container\n//\n// NOTE: Support added in RS5\ntype AssignedDevice struct {\n\t//  InterfaceClassGUID of the device to assign to container.\n\tInterfaceClassGUID string `json:\"InterfaceClassGuid,omitempty\"`\n}\n\n// ContainerConfig is used as both the input of CreateContainer\n// and to convert the parameters to JSON for passing onto the HCS\ntype ContainerConfig struct {\n\tSystemType                  string              // HCS requires this to be hard-coded to \"Container\"\n\tName                        string              // Name of the container. We use the docker ID.\n\tOwner                       string              `json:\",omitempty\"` // The management platform that created this container\n\tVolumePath                  string              `json:\",omitempty\"` // Windows volume path for scratch space. Used by Windows Server Containers only. Format \\\\?\\\\Volume{GUID}\n\tIgnoreFlushesDuringBoot     bool                `json:\",omitempty\"` // Optimization hint for container startup in Windows\n\tLayerFolderPath             string              `json:\",omitempty\"` // Where the layer folders are located. Used by Windows Server Containers only. Format  %root%\\windowsfilter\\containerID\n\tLayers                      []Layer             // List of storage layers. Required for Windows Server and Hyper-V Containers. Format ID=GUID;Path=%root%\\windowsfilter\\layerID\n\tCredentials                 string              `json:\",omitempty\"` // Credentials information\n\tProcessorCount              uint32              `json:\",omitempty\"` // Number of processors to assign to the container.\n\tProcessorWeight             uint64              `json:\",omitempty\"` // CPU shares (relative weight to other containers with cpu shares). Range is from 1 to 10000. A value of 0 results in default shares.\n\tProcessorMaximum            int64               `json:\",omitempty\"` // Specifies the portion of processor cycles that this container can use as a percentage times 100. Range is from 1 to 10000. A value of 0 results in no limit.\n\tStorageIOPSMaximum          uint64              `json:\",omitempty\"` // Maximum Storage IOPS\n\tStorageBandwidthMaximum     uint64              `json:\",omitempty\"` // Maximum Storage Bandwidth in bytes per second\n\tStorageSandboxSize          uint64              `json:\",omitempty\"` // Size in bytes that the container system drive should be expanded to if smaller\n\tMemoryMaximumInMB           int64               `json:\",omitempty\"` // Maximum memory available to the container in Megabytes\n\tHostName                    string              `json:\",omitempty\"` // Hostname\n\tMappedDirectories           []MappedDir         `json:\",omitempty\"` // List of mapped directories (volumes/mounts)\n\tMappedPipes                 []MappedPipe        `json:\",omitempty\"` // List of mapped Windows named pipes\n\tHvPartition                 bool                // True if it a Hyper-V Container\n\tNetworkSharedContainerName  string              `json:\",omitempty\"` // Name (ID) of the container that we will share the network stack with.\n\tEndpointList                []string            `json:\",omitempty\"` // List of networking endpoints to be attached to container\n\tHvRuntime                   *HvRuntime          `json:\",omitempty\"` // Hyper-V container settings. Used by Hyper-V containers only. Format ImagePath=%root%\\BaseLayerID\\UtilityVM\n\tServicing                   bool                `json:\",omitempty\"` // True if this container is for servicing\n\tAllowUnqualifiedDNSQuery    bool                `json:\",omitempty\"` // True to allow unqualified DNS name resolution\n\tDNSSearchList               string              `json:\",omitempty\"` // Comma separated list of DNS suffixes to use for name resolution\n\tContainerType               string              `json:\",omitempty\"` // \"Linux\" for Linux containers on Windows. Omitted otherwise.\n\tTerminateOnLastHandleClosed bool                `json:\",omitempty\"` // Should HCS terminate the container once all handles have been closed\n\tMappedVirtualDisks          []MappedVirtualDisk `json:\",omitempty\"` // Array of virtual disks to mount at start\n\tAssignedDevices             []AssignedDevice    `json:\",omitempty\"` // Array of devices to assign. NOTE: Support added in RS5\n}\n\ntype ComputeSystemQuery struct {\n\tIDs    []string `json:\"Ids,omitempty\"`\n\tTypes  []string `json:\",omitempty\"`\n\tNames  []string `json:\",omitempty\"`\n\tOwners []string `json:\",omitempty\"`\n}\n\ntype PropertyType string\n\nconst (\n\tPropertyTypeStatistics        PropertyType = \"Statistics\"        // V1 and V2\n\tPropertyTypeProcessList       PropertyType = \"ProcessList\"       // V1 and V2\n\tPropertyTypeMappedVirtualDisk PropertyType = \"MappedVirtualDisk\" // Not supported in V2 schema call\n\tPropertyTypeGuestConnection   PropertyType = \"GuestConnection\"   // V1 and V2. Nil return from HCS before RS5\n)\n\ntype PropertyQuery struct {\n\tPropertyTypes []PropertyType `json:\",omitempty\"`\n}\n\n// ContainerProperties holds the properties for a container and the processes running in that container\ntype ContainerProperties struct {\n\tID                           string `json:\"Id\"`\n\tState                        string\n\tName                         string\n\tSystemType                   string\n\tRuntimeOSType                string `json:\"RuntimeOsType,omitempty\"`\n\tOwner                        string\n\tSiloGUID                     string                              `json:\"SiloGuid,omitempty\"`\n\tRuntimeID                    guid.GUID                           `json:\"RuntimeId,omitempty\"`\n\tIsRuntimeTemplate            bool                                `json:\",omitempty\"`\n\tRuntimeImagePath             string                              `json:\",omitempty\"`\n\tStopped                      bool                                `json:\",omitempty\"`\n\tExitType                     string                              `json:\",omitempty\"`\n\tAreUpdatesPending            bool                                `json:\",omitempty\"`\n\tObRoot                       string                              `json:\",omitempty\"`\n\tStatistics                   Statistics                          `json:\",omitempty\"`\n\tProcessList                  []ProcessListItem                   `json:\",omitempty\"`\n\tMappedVirtualDiskControllers map[int]MappedVirtualDiskController `json:\",omitempty\"`\n\tGuestConnectionInfo          GuestConnectionInfo                 `json:\",omitempty\"`\n}\n\n// MemoryStats holds the memory statistics for a container\ntype MemoryStats struct {\n\tUsageCommitBytes            uint64 `json:\"MemoryUsageCommitBytes,omitempty\"`\n\tUsageCommitPeakBytes        uint64 `json:\"MemoryUsageCommitPeakBytes,omitempty\"`\n\tUsagePrivateWorkingSetBytes uint64 `json:\"MemoryUsagePrivateWorkingSetBytes,omitempty\"`\n}\n\n// ProcessorStats holds the processor statistics for a container\ntype ProcessorStats struct {\n\tTotalRuntime100ns  uint64 `json:\",omitempty\"`\n\tRuntimeUser100ns   uint64 `json:\",omitempty\"`\n\tRuntimeKernel100ns uint64 `json:\",omitempty\"`\n}\n\n// StorageStats holds the storage statistics for a container\ntype StorageStats struct {\n\tReadCountNormalized  uint64 `json:\",omitempty\"`\n\tReadSizeBytes        uint64 `json:\",omitempty\"`\n\tWriteCountNormalized uint64 `json:\",omitempty\"`\n\tWriteSizeBytes       uint64 `json:\",omitempty\"`\n}\n\n// NetworkStats holds the network statistics for a container\ntype NetworkStats struct {\n\tBytesReceived          uint64 `json:\",omitempty\"`\n\tBytesSent              uint64 `json:\",omitempty\"`\n\tPacketsReceived        uint64 `json:\",omitempty\"`\n\tPacketsSent            uint64 `json:\",omitempty\"`\n\tDroppedPacketsIncoming uint64 `json:\",omitempty\"`\n\tDroppedPacketsOutgoing uint64 `json:\",omitempty\"`\n\tEndpointId             string `json:\",omitempty\"`\n\tInstanceId             string `json:\",omitempty\"`\n}\n\n// Statistics is the structure returned by a statistics call on a container\ntype Statistics struct {\n\tTimestamp          time.Time      `json:\",omitempty\"`\n\tContainerStartTime time.Time      `json:\",omitempty\"`\n\tUptime100ns        uint64         `json:\",omitempty\"`\n\tMemory             MemoryStats    `json:\",omitempty\"`\n\tProcessor          ProcessorStats `json:\",omitempty\"`\n\tStorage            StorageStats   `json:\",omitempty\"`\n\tNetwork            []NetworkStats `json:\",omitempty\"`\n}\n\n// ProcessList is the structure of an item returned by a ProcessList call on a container\ntype ProcessListItem struct {\n\tCreateTimestamp              time.Time `json:\",omitempty\"`\n\tImageName                    string    `json:\",omitempty\"`\n\tKernelTime100ns              uint64    `json:\",omitempty\"`\n\tMemoryCommitBytes            uint64    `json:\",omitempty\"`\n\tMemoryWorkingSetPrivateBytes uint64    `json:\",omitempty\"`\n\tMemoryWorkingSetSharedBytes  uint64    `json:\",omitempty\"`\n\tProcessId                    uint32    `json:\",omitempty\"`\n\tUserTime100ns                uint64    `json:\",omitempty\"`\n}\n\n// MappedVirtualDiskController is the structure of an item returned by a MappedVirtualDiskList call on a container\ntype MappedVirtualDiskController struct {\n\tMappedVirtualDisks map[int]MappedVirtualDisk `json:\",omitempty\"`\n}\n\n// GuestDefinedCapabilities is part of the GuestConnectionInfo returned by a GuestConnection call on a utility VM\ntype GuestDefinedCapabilities struct {\n\tNamespaceAddRequestSupported  bool `json:\",omitempty\"`\n\tSignalProcessSupported        bool `json:\",omitempty\"`\n\tDumpStacksSupported           bool `json:\",omitempty\"`\n\tDeleteContainerStateSupported bool `json:\",omitempty\"`\n\tUpdateContainerSupported      bool `json:\",omitempty\"`\n}\n\n// GuestConnectionInfo is the structure of an iterm return by a GuestConnection call on a utility VM\ntype GuestConnectionInfo struct {\n\tSupportedSchemaVersions  []hcsschema.Version      `json:\",omitempty\"`\n\tProtocolVersion          uint32                   `json:\",omitempty\"`\n\tGuestDefinedCapabilities GuestDefinedCapabilities `json:\",omitempty\"`\n}\n\n// Type of Request Support in ModifySystem\ntype RequestType string\n\n// Type of Resource Support in ModifySystem\ntype ResourceType string\n\n// RequestType const\nconst (\n\tAdd     RequestType  = \"Add\"\n\tRemove  RequestType  = \"Remove\"\n\tNetwork ResourceType = \"Network\"\n)\n\n// ResourceModificationRequestResponse is the structure used to send request to the container to modify the system\n// Supported resource types are Network and Request Types are Add/Remove\ntype ResourceModificationRequestResponse struct {\n\tResource ResourceType `json:\"ResourceType\"`\n\tData     interface{}  `json:\"Settings\"`\n\tRequest  RequestType  `json:\"RequestType,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/attachment.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype Attachment struct {\n\tType_ string `json:\"Type,omitempty\"`\n\n\tPath string `json:\"Path,omitempty\"`\n\n\tIgnoreFlushes bool `json:\"IgnoreFlushes,omitempty\"`\n\n\tCachingMode string `json:\"CachingMode,omitempty\"`\n\n\tNoWriteHardening bool `json:\"NoWriteHardening,omitempty\"`\n\n\tDisableExpansionOptimization bool `json:\"DisableExpansionOptimization,omitempty\"`\n\n\tIgnoreRelativeLocator bool `json:\"IgnoreRelativeLocator,omitempty\"`\n\n\tCaptureIoAttributionContext bool `json:\"CaptureIoAttributionContext,omitempty\"`\n\n\tReadOnly bool `json:\"ReadOnly,omitempty\"`\n\n\tSupportCompressedVolumes bool `json:\"SupportCompressedVolumes,omitempty\"`\n\n\tAlwaysAllowSparseFiles bool `json:\"AlwaysAllowSparseFiles,omitempty\"`\n\n\tExtensibleVirtualDiskType string `json:\"ExtensibleVirtualDiskType,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/battery.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype Battery struct {\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cache_query_stats_response.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype CacheQueryStatsResponse struct {\n\tL3OccupancyBytes int32 `json:\"L3OccupancyBytes,omitempty\"`\n\n\tL3TotalBwBytes int32 `json:\"L3TotalBwBytes,omitempty\"`\n\n\tL3LocalBwBytes int32 `json:\"L3LocalBwBytes,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/chipset.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype Chipset struct {\n\tUefi *Uefi `json:\"Uefi,omitempty\"`\n\n\tIsNumLockDisabled bool `json:\"IsNumLockDisabled,omitempty\"`\n\n\tBaseBoardSerialNumber string `json:\"BaseBoardSerialNumber,omitempty\"`\n\n\tChassisSerialNumber string `json:\"ChassisSerialNumber,omitempty\"`\n\n\tChassisAssetTag string `json:\"ChassisAssetTag,omitempty\"`\n\n\tUseUtc bool `json:\"UseUtc,omitempty\"`\n\n\t// LinuxKernelDirect - Added in v2.2 Builds >=181117\n\tLinuxKernelDirect *LinuxKernelDirect `json:\"LinuxKernelDirect,omitempty\"`\n\n\tFirmwareFile *FirmwareFile `json:\"FirmwareFile,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cimfs.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.5\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype CimMount struct {\n\tImagePath      string `json:\"ImagePath,omitempty\"`\n\tFileSystemName string `json:\"FileSystemName,omitempty\"`\n\tVolumeGuid     string `json:\"VolumeGuid,omitempty\"`\n\tMountFlags     uint32 `json:\"MountFlags,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/close_handle.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\nimport \"github.com/Microsoft/hcsshim/internal/protocol/guestrequest\"\n\ntype CloseHandle struct {\n\tHandle guestrequest.STDIOHandle `json:\"Handle,omitempty\"` // NOTE: Swagger generated as string. Locally updated.\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/com_port.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n//  ComPort specifies the named pipe that will be used for the port, with empty string indicating a disconnected port.\ntype ComPort struct {\n\tNamedPipe string `json:\"NamedPipe,omitempty\"`\n\n\tOptimizeForDebugger bool `json:\"OptimizeForDebugger,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/compute_system.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype ComputeSystem struct {\n\tOwner string `json:\"Owner,omitempty\"`\n\n\tSchemaVersion *Version `json:\"SchemaVersion,omitempty\"`\n\n\tHostingSystemId string `json:\"HostingSystemId,omitempty\"`\n\n\tHostedSystem interface{} `json:\"HostedSystem,omitempty\"`\n\n\tContainer *Container `json:\"Container,omitempty\"`\n\n\tVirtualMachine *VirtualMachine `json:\"VirtualMachine,omitempty\"`\n\n\tShouldTerminateOnLastHandleClosed bool `json:\"ShouldTerminateOnLastHandleClosed,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/configuration.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\nimport (\n\t\"net/http\"\n)\n\n// contextKeys are used to identify the type of value in the context.\n// Since these are string, it is possible to get a short description of the\n// context key for logging and debugging using key.String().\n\ntype contextKey string\n\nfunc (c contextKey) String() string {\n\treturn \"auth \" + string(c)\n}\n\nvar (\n\t// ContextOAuth2 takes a oauth2.TokenSource as authentication for the request.\n\tContextOAuth2 = contextKey(\"token\")\n\n\t// ContextBasicAuth takes BasicAuth as authentication for the request.\n\tContextBasicAuth = contextKey(\"basic\")\n\n\t// ContextAccessToken takes a string oauth2 access token as authentication for the request.\n\tContextAccessToken = contextKey(\"accesstoken\")\n\n\t// ContextAPIKey takes an APIKey as authentication for the request\n\tContextAPIKey = contextKey(\"apikey\")\n)\n\n// BasicAuth provides basic http authentication to a request passed via context using ContextBasicAuth\ntype BasicAuth struct {\n\tUserName string `json:\"userName,omitempty\"`\n\tPassword string `json:\"password,omitempty\"`\n}\n\n// APIKey provides API key based authentication to a request passed via context using ContextAPIKey\ntype APIKey struct {\n\tKey    string\n\tPrefix string\n}\n\ntype Configuration struct {\n\tBasePath      string            `json:\"basePath,omitempty\"`\n\tHost          string            `json:\"host,omitempty\"`\n\tScheme        string            `json:\"scheme,omitempty\"`\n\tDefaultHeader map[string]string `json:\"defaultHeader,omitempty\"`\n\tUserAgent     string            `json:\"userAgent,omitempty\"`\n\tHTTPClient    *http.Client\n}\n\nfunc NewConfiguration() *Configuration {\n\tcfg := &Configuration{\n\t\tBasePath:      \"https://localhost\",\n\t\tDefaultHeader: make(map[string]string),\n\t\tUserAgent:     \"Swagger-Codegen/2.1.0/go\",\n\t}\n\treturn cfg\n}\n\nfunc (c *Configuration) AddDefaultHeader(key string, value string) {\n\tc.DefaultHeader[key] = value\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/console_size.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n// NOTE: Swagger generated fields as int32. Locally updated to uint16 to match documentation.\n// https://learn.microsoft.com/en-us/virtualization/api/hcs/schemareference#ConsoleSize\n\ntype ConsoleSize struct {\n\tHeight uint16 `json:\"Height,omitempty\"`\n\n\tWidth uint16 `json:\"Width,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype Container struct {\n\tGuestOs *GuestOs `json:\"GuestOs,omitempty\"`\n\n\tStorage *Storage `json:\"Storage,omitempty\"`\n\n\tMappedDirectories []MappedDirectory `json:\"MappedDirectories,omitempty\"`\n\n\tMappedPipes []MappedPipe `json:\"MappedPipes,omitempty\"`\n\n\tMemory *Memory `json:\"Memory,omitempty\"`\n\n\tProcessor *Processor `json:\"Processor,omitempty\"`\n\n\tNetworking *Networking `json:\"Networking,omitempty\"`\n\n\tHvSocket *HvSocket `json:\"HvSocket,omitempty\"`\n\n\tContainerCredentialGuard *ContainerCredentialGuardState `json:\"ContainerCredentialGuard,omitempty\"`\n\n\tRegistryChanges *RegistryChanges `json:\"RegistryChanges,omitempty\"`\n\n\tAssignedDevices []Device `json:\"AssignedDevices,omitempty\"`\n\n\tAdditionalDeviceNamespace *ContainerDefinitionDevice `json:\"AdditionalDeviceNamespace,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_add_instance_request.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype ContainerCredentialGuardAddInstanceRequest struct {\n\tId             string `json:\"Id,omitempty\"`\n\tCredentialSpec string `json:\"CredentialSpec,omitempty\"`\n\tTransport      string `json:\"Transport,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_hv_socket_service_config.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype ContainerCredentialGuardHvSocketServiceConfig struct {\n\tServiceId     string                 `json:\"ServiceId,omitempty\"`\n\tServiceConfig *HvSocketServiceConfig `json:\"ServiceConfig,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_instance.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype ContainerCredentialGuardInstance struct {\n\tId              string                                         `json:\"Id,omitempty\"`\n\tCredentialGuard *ContainerCredentialGuardState                 `json:\"CredentialGuard,omitempty\"`\n\tHvSocketConfig  *ContainerCredentialGuardHvSocketServiceConfig `json:\"HvSocketConfig,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_modify_operation.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype ContainerCredentialGuardModifyOperation string\n\nconst (\n\tAddInstance    ContainerCredentialGuardModifyOperation = \"AddInstance\"\n\tRemoveInstance ContainerCredentialGuardModifyOperation = \"RemoveInstance\"\n)\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_operation_request.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype ContainerCredentialGuardOperationRequest struct {\n\tOperation        ContainerCredentialGuardModifyOperation `json:\"Operation,omitempty\"`\n\tOperationDetails interface{}                             `json:\"OperationDetails,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_remove_instance_request.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype ContainerCredentialGuardRemoveInstanceRequest struct {\n\tId string `json:\"Id,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_state.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype ContainerCredentialGuardState struct {\n\n\t//  Authentication cookie for calls to a Container Credential Guard instance.\n\tCookie string `json:\"Cookie,omitempty\"`\n\n\t//  Name of the RPC endpoint of the Container Credential Guard instance.\n\tRpcEndpoint string `json:\"RpcEndpoint,omitempty\"`\n\n\t//  Transport used for the configured Container Credential Guard instance.\n\tTransport string `json:\"Transport,omitempty\"`\n\n\t//  Credential spec used for the configured Container Credential Guard instance.\n\tCredentialSpec string `json:\"CredentialSpec,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_system_info.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype ContainerCredentialGuardSystemInfo struct {\n\tInstances []ContainerCredentialGuardInstance `json:\"Instances,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_memory_information.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n//  memory usage as viewed from within the container\ntype ContainerMemoryInformation struct {\n\tTotalPhysicalBytes int32 `json:\"TotalPhysicalBytes,omitempty\"`\n\n\tTotalUsage int32 `json:\"TotalUsage,omitempty\"`\n\n\tCommittedBytes int32 `json:\"CommittedBytes,omitempty\"`\n\n\tSharedCommittedBytes int32 `json:\"SharedCommittedBytes,omitempty\"`\n\n\tCommitLimitBytes int32 `json:\"CommitLimitBytes,omitempty\"`\n\n\tPeakCommitmentBytes int32 `json:\"PeakCommitmentBytes,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n// CPU groups allow Hyper-V administrators to better manage and allocate the host's CPU resources across guest virtual machines\ntype CpuGroup struct {\n\tId string `json:\"Id,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_affinity.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype CpuGroupAffinity struct {\n\tLogicalProcessorCount int32   `json:\"LogicalProcessorCount,omitempty\"`\n\tLogicalProcessors     []int32 `json:\"LogicalProcessors,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_config.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype CpuGroupConfig struct {\n\tGroupId         string             `json:\"GroupId,omitempty\"`\n\tAffinity        *CpuGroupAffinity  `json:\"Affinity,omitempty\"`\n\tGroupProperties []CpuGroupProperty `json:\"GroupProperties,omitempty\"`\n\t// Hypervisor CPU group IDs exposed to clients\n\tHypervisorGroupId uint64 `json:\"HypervisorGroupId,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_configurations.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n// Structure used to return cpu groups for a Service property query\ntype CpuGroupConfigurations struct {\n\tCpuGroups []CpuGroupConfig `json:\"CpuGroups,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_operations.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype CPUGroupOperation string\n\nconst (\n\tCreateGroup CPUGroupOperation = \"CreateGroup\"\n\tDeleteGroup CPUGroupOperation = \"DeleteGroup\"\n\tSetProperty CPUGroupOperation = \"SetProperty\"\n)\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_property.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype CPUGroupPropertyCode uint32\n\nconst (\n\tCPUCapacityProperty           = 0x00010000\n\tCPUSchedulingPriorityProperty = 0x00020000\n\tIdleLPReserveProperty         = 0x00030000\n)\n\ntype CpuGroupProperty struct {\n\tPropertyCode  uint32 `json:\"PropertyCode,omitempty\"`\n\tPropertyValue uint32 `json:\"PropertyValue,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/create_group_operation.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n// Create group operation settings\ntype CreateGroupOperation struct {\n\tGroupId               string   `json:\"GroupId,omitempty\"`\n\tLogicalProcessorCount uint32   `json:\"LogicalProcessorCount,omitempty\"`\n\tLogicalProcessors     []uint32 `json:\"LogicalProcessors,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/debug_options.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype DebugOptions struct {\n\t// BugcheckSavedStateFileName is the path for the file in which the guest VM state will be saved when\n\t// the guest crashes.\n\tBugcheckSavedStateFileName string `json:\"BugcheckSavedStateFileName,omitempty\"`\n\t// BugcheckNoCrashdumpSavedStateFileName is the path of the file in which the guest VM state will be\n\t// saved when the guest crashes but the guest isn't able to generate the crash dump. This usually\n\t// happens in early boot failures.\n\tBugcheckNoCrashdumpSavedStateFileName string `json:\"BugcheckNoCrashdumpSavedStateFileName,omitempty\"`\n\tTripleFaultSavedStateFileName         string `json:\"TripleFaultSavedStateFileName,omitempty\"`\n\tFirmwareDumpFileName                  string `json:\"FirmwareDumpFileName,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/delete_group_operation.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n// Delete group operation settings\ntype DeleteGroupOperation struct {\n\tGroupId string `json:\"GroupId,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/device.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype DeviceType string\n\nconst (\n\tClassGUID        DeviceType = \"ClassGuid\"\n\tDeviceInstanceID DeviceType = \"DeviceInstance\"\n\tGPUMirror        DeviceType = \"GpuMirror\"\n)\n\ntype Device struct {\n\t//  The type of device to assign to the container.\n\tType DeviceType `json:\"Type,omitempty\"`\n\t//  The interface class guid of the device interfaces to assign to the  container.  Only used when Type is ClassGuid.\n\tInterfaceClassGuid string `json:\"InterfaceClassGuid,omitempty\"`\n\t//  The location path of the device to assign to the container.  Only used when Type is DeviceInstanceID.\n\tLocationPath string `json:\"LocationPath,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/devices.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype Devices struct {\n\tComPorts map[string]ComPort `json:\"ComPorts,omitempty\"`\n\n\tScsi map[string]Scsi `json:\"Scsi,omitempty\"`\n\n\tVirtualPMem *VirtualPMemController `json:\"VirtualPMem,omitempty\"`\n\n\tNetworkAdapters map[string]NetworkAdapter `json:\"NetworkAdapters,omitempty\"`\n\n\tVideoMonitor *VideoMonitor `json:\"VideoMonitor,omitempty\"`\n\n\tKeyboard *Keyboard `json:\"Keyboard,omitempty\"`\n\n\tMouse *Mouse `json:\"Mouse,omitempty\"`\n\n\tHvSocket *HvSocket2 `json:\"HvSocket,omitempty\"`\n\n\tEnhancedModeVideo *EnhancedModeVideo `json:\"EnhancedModeVideo,omitempty\"`\n\n\tGuestCrashReporting *GuestCrashReporting `json:\"GuestCrashReporting,omitempty\"`\n\n\tVirtualSmb *VirtualSmb `json:\"VirtualSmb,omitempty\"`\n\n\tPlan9 *Plan9 `json:\"Plan9,omitempty\"`\n\n\tBattery *Battery `json:\"Battery,omitempty\"`\n\n\tFlexibleIov map[string]FlexibleIoDevice `json:\"FlexibleIov,omitempty\"`\n\n\tSharedMemory *SharedMemoryConfiguration `json:\"SharedMemory,omitempty\"`\n\n\t// TODO: This is pre-release support in schema 2.3. Need to add build number\n\t// docs when a public build with this is out.\n\tVirtualPci map[string]VirtualPciDevice `json:\",omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/enhanced_mode_video.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype EnhancedModeVideo struct {\n\tConnectionOptions *RdpConnectionOptions `json:\"ConnectionOptions,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/firmware.go",
    "content": "package hcsschema\n\ntype FirmwareFile struct {\n\t// Parameters is an experimental/pre-release field. The field itself or its\n\t// behavior can change in future iterations of the schema. Avoid taking a hard\n\t// dependency on this field.\n\tParameters []byte `json:\"Parameters,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/flexible_io_device.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype FlexibleIoDevice struct {\n\tEmulatorId string `json:\"EmulatorId,omitempty\"`\n\n\tHostingModel string `json:\"HostingModel,omitempty\"`\n\n\tConfiguration []string `json:\"Configuration,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_connection.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype GuestConnection struct {\n\n\t//  Use Vsock rather than Hyper-V sockets to communicate with the guest service.\n\tUseVsock bool `json:\"UseVsock,omitempty\"`\n\n\t//  Don't disconnect the guest connection when pausing the virtual machine.\n\tUseConnectedSuspend bool `json:\"UseConnectedSuspend,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_connection_info.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n//  Information about the guest.\ntype GuestConnectionInfo struct {\n\n\t//  Each schema version x.y stands for the range of versions a.b where a==x  and b<=y. This list comes from the SupportedSchemaVersions field in  GcsCapabilities.\n\tSupportedSchemaVersions []Version `json:\"SupportedSchemaVersions,omitempty\"`\n\n\tProtocolVersion int32 `json:\"ProtocolVersion,omitempty\"`\n\n\tGuestDefinedCapabilities *interface{} `json:\"GuestDefinedCapabilities,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_crash_reporting.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype GuestCrashReporting struct {\n\tWindowsCrashSettings *WindowsCrashReporting `json:\"WindowsCrashSettings,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_os.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype GuestOs struct {\n\tHostName string `json:\"HostName,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_state.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype GuestState struct {\n\n\t//  The path to an existing file uses for persistent guest state storage.  An empty string indicates the system should initialize new transient, in-memory guest state.\n\tGuestStateFilePath string `json:\"GuestStateFilePath,omitempty\"`\n\n\t//  The guest state file type affected by different guest isolation modes - whether a file or block storage.\n\tGuestStateFileType string `json:\"GuestStateFileType,omitempty\"`\n\n\t//  The path to an existing file for persistent runtime state storage.  An empty string indicates the system should initialize new transient, in-memory runtime state.\n\tRuntimeStateFilePath string `json:\"RuntimeStateFilePath,omitempty\"`\n\n\t//  If true, the guest state and runtime state files will be used as templates  to populate transient, in-memory state instead of using the files as persistent backing store.\n\tForceTransientState bool `json:\"ForceTransientState,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/host_processor_modify_request.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n// Structure used to request a service processor modification\ntype HostProcessorModificationRequest struct {\n\tOperation        CPUGroupOperation `json:\"Operation,omitempty\"`\n\tOperationDetails interface{}       `json:\"OperationDetails,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hosted_system.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype HostedSystem struct {\n\tSchemaVersion *Version `json:\"SchemaVersion,omitempty\"`\n\n\tContainer *Container `json:\"Container,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype HvSocket struct {\n\tConfig *HvSocketSystemConfig `json:\"Config,omitempty\"`\n\n\tEnablePowerShellDirect bool `json:\"EnablePowerShellDirect,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_2.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n//  HvSocket configuration for a VM\ntype HvSocket2 struct {\n\tHvSocketConfig *HvSocketSystemConfig `json:\"HvSocketConfig,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_address.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n//  This class defines address settings applied to a VM\n//  by the GCS every time a VM starts or restores.\ntype HvSocketAddress struct {\n\tLocalAddress  string `json:\"LocalAddress,omitempty\"`\n\tParentAddress string `json:\"ParentAddress,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_service_config.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype HvSocketServiceConfig struct {\n\n\t//  SDDL string that HvSocket will check before allowing a host process to bind  to this specific service.  If not specified, defaults to the system DefaultBindSecurityDescriptor, defined in  HvSocketSystemWpConfig in V1.\n\tBindSecurityDescriptor string `json:\"BindSecurityDescriptor,omitempty\"`\n\n\t//  SDDL string that HvSocket will check before allowing a host process to connect  to this specific service.  If not specified, defaults to the system DefaultConnectSecurityDescriptor, defined in  HvSocketSystemWpConfig in V1.\n\tConnectSecurityDescriptor string `json:\"ConnectSecurityDescriptor,omitempty\"`\n\n\t//  If true, HvSocket will process wildcard binds for this service/system combination.  Wildcard binds are secured in the registry at  SOFTWARE/Microsoft/Windows NT/CurrentVersion/Virtualization/HvSocket/WildcardDescriptors\n\tAllowWildcardBinds bool `json:\"AllowWildcardBinds,omitempty\"`\n\n\t// Disabled controls whether the HvSocket service is accepting connection requests.\n\t// This set to true will make the service refuse all incoming connections as well as cancel\n\t// any connections already established. The service itself will still be active however\n\t// and can be re-enabled at a future time.\n\tDisabled bool `json:\"Disabled,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_system_config.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n//  This is the HCS Schema version of the HvSocket configuration. The VMWP version is  located in Config.Devices.IC in V1.\ntype HvSocketSystemConfig struct {\n\n\t//  SDDL string that HvSocket will check before allowing a host process to bind  to an unlisted service for this specific container/VM (not wildcard binds).\n\tDefaultBindSecurityDescriptor string `json:\"DefaultBindSecurityDescriptor,omitempty\"`\n\n\t//  SDDL string that HvSocket will check before allowing a host process to connect  to an unlisted service in the VM/container.\n\tDefaultConnectSecurityDescriptor string `json:\"DefaultConnectSecurityDescriptor,omitempty\"`\n\n\tServiceTable map[string]HvSocketServiceConfig `json:\"ServiceTable,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/interrupt_moderation_mode.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype InterruptModerationName string\n\n// The valid interrupt moderation modes for I/O virtualization (IOV) offloading.\nconst (\n\tDefaultName  InterruptModerationName = \"Default\"\n\tAdaptiveName InterruptModerationName = \"Adaptive\"\n\tOffName      InterruptModerationName = \"Off\"\n\tLowName      InterruptModerationName = \"Low\"\n\tMediumName   InterruptModerationName = \"Medium\"\n\tHighName     InterruptModerationName = \"High\"\n)\n\ntype InterruptModerationValue uint32\n\nconst (\n\tDefaultValue InterruptModerationValue = iota\n\tAdaptiveValue\n\tOffValue\n\tLowValue    InterruptModerationValue = 100\n\tMediumValue InterruptModerationValue = 200\n\tHighValue   InterruptModerationValue = 300\n)\n\nvar InterruptModerationValueToName = map[InterruptModerationValue]InterruptModerationName{\n\tDefaultValue:  DefaultName,\n\tAdaptiveValue: AdaptiveName,\n\tOffValue:      OffName,\n\tLowValue:      LowName,\n\tMediumValue:   MediumName,\n\tHighValue:     HighName,\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/iov_settings.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype IovSettings struct {\n\t// The weight assigned to this port for I/O virtualization (IOV) offloading.\n\t// Setting this to 0 disables IOV offloading.\n\tOffloadWeight *uint32 `json:\"OffloadWeight,omitempty\"`\n\n\t// The number of queue pairs requested for this port for I/O virtualization (IOV) offloading.\n\tQueuePairsRequested *uint32 `json:\"QueuePairsRequested,omitempty\"`\n\n\t// The interrupt moderation mode for I/O virtualization (IOV) offloading.\n\tInterruptModeration *InterruptModerationName `json:\"InterruptModeration,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/isolation_settings.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype IsolationSettings struct {\n\t// Guest isolation type options to decide virtual trust levels of virtual machine\n\tIsolationType string `json:\"IsolationType,omitempty\"`\n\t// Configuration to debug HCL layer for HCS VM TODO: Task 31102306: Miss the way to prevent the exposure of private debug configuration in HCS TODO: Think about the secret configurations which are private in VMMS VM (only edit by hvsedit)\n\tDebugHost string `json:\"DebugHost,omitempty\"`\n\tDebugPort int64  `json:\"DebugPort,omitempty\"`\n\t// Optional data passed by host on isolated virtual machine start\n\tLaunchData string `json:\"LaunchData,omitempty\"`\n\tHclEnabled *bool  `json:\"HclEnabled,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/keyboard.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype Keyboard struct {\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/layer.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype FileSystemFilterType string\n\nconst (\n\tUnionFS FileSystemFilterType = \"UnionFS\"\n\tWCIFS   FileSystemFilterType = \"WCIFS\"\n)\n\ntype Layer struct {\n\tId string `json:\"Id,omitempty\"`\n\n\tPath string `json:\"Path,omitempty\"`\n\n\tPathType string `json:\"PathType,omitempty\"`\n\n\t//  Unspecified defaults to Enabled\n\tCache string `json:\"Cache,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/linux_kernel_direct.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.2\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype LinuxKernelDirect struct {\n\tKernelFilePath string `json:\"KernelFilePath,omitempty\"`\n\n\tInitRdPath string `json:\"InitRdPath,omitempty\"`\n\n\tKernelCmdLine string `json:\"KernelCmdLine,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/logical_processor.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype LogicalProcessor struct {\n\tLpIndex     uint32 `json:\"LpIndex,omitempty\"`\n\tNodeNumber  uint8  `json:\"NodeNumber,omitempty\"`\n\tPackageId   uint32 `json:\"PackageId,omitempty\"`\n\tCoreId      uint32 `json:\"CoreId,omitempty\"`\n\tRootVpIndex int32  `json:\"RootVpIndex,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/mapped_directory.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype MappedDirectory struct {\n\tHostPath string `json:\"HostPath,omitempty\"`\n\n\tHostPathType string `json:\"HostPathType,omitempty\"`\n\n\tContainerPath string `json:\"ContainerPath,omitempty\"`\n\n\tReadOnly bool `json:\"ReadOnly,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/mapped_pipe.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype MappedPipe struct {\n\tContainerPipeName string `json:\"ContainerPipeName,omitempty\"`\n\n\tHostPath string `json:\"HostPath,omitempty\"`\n\n\tHostPathType string `json:\"HostPathType,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype Memory struct {\n\tSizeInMB uint64 `json:\"SizeInMB,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_backing_type.go",
    "content": "// Autogenerated code; DO NOT EDIT.\n\n/*\n * Schema Open API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swaggerapi/swaggercodegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swaggerapi/swaggercodegen.git)\n */\n\npackage hcsschema\n\ntype MemoryBackingType string\n\n// List of MemoryBackingType\nconst (\n\tMemoryBackingType_PHYSICAL MemoryBackingType = \"Physical\"\n\tMemoryBackingType_VIRTUAL  MemoryBackingType = \"Virtual\"\n\tMemoryBackingType_HYBRID   MemoryBackingType = \"Hybrid\"\n)\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_information_for_vm.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype MemoryInformationForVm struct {\n\tVirtualNodeCount uint32 `json:\"VirtualNodeCount,omitempty\"`\n\n\tVirtualMachineMemory *VmMemory `json:\"VirtualMachineMemory,omitempty\"`\n\n\tVirtualNodes []VirtualNodeInfo `json:\"VirtualNodes,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_stats.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n//  Memory runtime statistics\ntype MemoryStats struct {\n\tMemoryUsageCommitBytes uint64 `json:\"MemoryUsageCommitBytes,omitempty\"`\n\n\tMemoryUsageCommitPeakBytes uint64 `json:\"MemoryUsageCommitPeakBytes,omitempty\"`\n\n\tMemoryUsagePrivateWorkingSetBytes uint64 `json:\"MemoryUsagePrivateWorkingSetBytes,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_container_definition_device.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype ContainerDefinitionDevice struct {\n\tDeviceExtension []DeviceExtension `json:\"device_extension,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_category.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype DeviceCategory struct {\n\tName           string           `json:\"name,omitempty\"`\n\tInterfaceClass []InterfaceClass `json:\"interface_class,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_extension.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype DeviceExtension struct {\n\tDeviceCategory *DeviceCategory           `json:\"device_category,omitempty\"`\n\tNamespace      *DeviceExtensionNamespace `json:\"namespace,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_instance.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype DeviceInstance struct {\n\tId             string           `json:\"id,omitempty\"`\n\tLocationPath   string           `json:\"location_path,omitempty\"`\n\tPortName       string           `json:\"port_name,omitempty\"`\n\tInterfaceClass []InterfaceClass `json:\"interface_class,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_namespace.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype DeviceNamespace struct {\n\tRequiresDriverstore bool             `json:\"requires_driverstore,omitempty\"`\n\tDeviceCategory      []DeviceCategory `json:\"device_category,omitempty\"`\n\tDeviceInstance      []DeviceInstance `json:\"device_instance,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_interface_class.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype InterfaceClass struct {\n\tType_      string `json:\"type,omitempty\"`\n\tIdentifier string `json:\"identifier,omitempty\"`\n\tRecurse    bool   `json:\"recurse,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_namespace.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype DeviceExtensionNamespace struct {\n\tOb     *ObjectNamespace `json:\"ob,omitempty\"`\n\tDevice *DeviceNamespace `json:\"device,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_directory.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype ObjectDirectory struct {\n\tName    string            `json:\"name,omitempty\"`\n\tClonesd string            `json:\"clonesd,omitempty\"`\n\tShadow  string            `json:\"shadow,omitempty\"`\n\tSymlink []ObjectSymlink   `json:\"symlink,omitempty\"`\n\tObjdir  []ObjectDirectory `json:\"objdir,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_namespace.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype ObjectNamespace struct {\n\tShadow  string            `json:\"shadow,omitempty\"`\n\tSymlink []ObjectSymlink   `json:\"symlink,omitempty\"`\n\tObjdir  []ObjectDirectory `json:\"objdir,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_symlink.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype ObjectSymlink struct {\n\tName        string `json:\"name,omitempty\"`\n\tPath        string `json:\"path,omitempty\"`\n\tScope       string `json:\"scope,omitempty\"`\n\tPathtoclone string `json:\"pathtoclone,omitempty\"`\n\tAccessMask  int32  `json:\"access_mask,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/modification_request.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype ModificationRequest struct {\n\tPropertyType PropertyType `json:\"PropertyType,omitempty\"`\n\tSettings     interface{}  `json:\"Settings,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/modify_setting_request.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\nimport \"github.com/Microsoft/hcsshim/internal/protocol/guestrequest\"\n\ntype ModifySettingRequest struct {\n\tResourcePath string `json:\"ResourcePath,omitempty\"`\n\n\tRequestType guestrequest.RequestType `json:\"RequestType,omitempty\"` // NOTE: Swagger generated as string. Locally updated.\n\n\tSettings interface{} `json:\"Settings,omitempty\"` // NOTE: Swagger generated as *interface{}. Locally updated\n\n\tGuestRequest interface{} `json:\"GuestRequest,omitempty\"` // NOTE: Swagger generated as *interface{}. Locally updated\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/mouse.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype Mouse struct {\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/network_adapter.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype NetworkAdapter struct {\n\tEndpointId string `json:\"EndpointId,omitempty\"`\n\tMacAddress string `json:\"MacAddress,omitempty\"`\n\t// The I/O virtualization (IOV) offloading configuration.\n\tIovSettings *IovSettings `json:\"IovSettings,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/networking.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype Networking struct {\n\tAllowUnqualifiedDnsQuery bool `json:\"AllowUnqualifiedDnsQuery,omitempty\"`\n\n\tDnsSearchList string `json:\"DnsSearchList,omitempty\"`\n\n\tNetworkSharedContainerName string `json:\"NetworkSharedContainerName,omitempty\"`\n\n\t//  Guid in windows; string in linux\n\tNamespace string `json:\"Namespace,omitempty\"`\n\n\tNetworkAdapters []string `json:\"NetworkAdapters,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/numa.go",
    "content": "// Autogenerated code; DO NOT EDIT.\n\n/*\n * Schema Open API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype Numa struct {\n\tVirtualNodeCount       uint8         `json:\"VirtualNodeCount,omitempty\"`\n\tPreferredPhysicalNodes []int64       `json:\"PreferredPhysicalNodes,omitempty\"`\n\tSettings               []NumaSetting `json:\"Settings,omitempty\"`\n\tMaxSizePerNode         uint64        `json:\"MaxSizePerNode,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/numa_node.go",
    "content": "// Autogenerated code; DO NOT EDIT.\n\n/*\n * Schema Open API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype NumaNode struct {\n\tVirtualNodeIndex  uint32 `json:\"VirtualNodeIndex,omitempty\"`\n\tPhysicalNodeIndex uint32 `json:\"PhysicalNodeIndex,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/numa_node_memory.go",
    "content": "// Autogenerated code; DO NOT EDIT.\n\n/*\n * Schema Open API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype NumaNodeMemory struct {\n\t// Total physical memory on on this physical NUMA node that is consumable by the VMs.\n\tTotalConsumableMemoryInPages uint64 `json:\"TotalConsumableMemoryInPages,omitempty\"`\n\t// Currently available physical memory on this physical NUMA node for the VMs.\n\tAvailableMemoryInPages uint64 `json:\"AvailableMemoryInPages,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/numa_node_processor.go",
    "content": "// Autogenerated code; DO NOT EDIT.\n\n/*\n * Schema Open API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype NumaNodeProcessor struct {\n\tTotalAssignedProcessors  uint32 `json:\"TotalAssignedProcessors,omitempty\"`\n\tTotalAvailableProcessors uint32 `json:\"TotalAvailableProcessors,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/numa_processors.go",
    "content": "// Autogenerated code; DO NOT EDIT.\n\n/*\n * Schema Open API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype NumaProcessors struct {\n\tCountPerNode  Range  `json:\"count_per_node,omitempty\"`\n\tNodePerSocket uint32 `json:\"node_per_socket,omitempty\"`\n}\n\ntype Range struct {\n\tMax uint32 `json:\"max,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/numa_setting.go",
    "content": "// Autogenerated code; DO NOT EDIT.\n\n/*\n * Schema Open API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype NumaSetting struct {\n\tVirtualNodeNumber        uint32            `json:\"VirtualNodeNumber,omitempty\"`\n\tPhysicalNodeNumber       uint32            `json:\"PhysicalNodeNumber,omitempty\"`\n\tVirtualSocketNumber      uint32            `json:\"VirtualSocketNumber,omitempty\"`\n\tCountOfProcessors        uint32            `json:\"CountOfProcessors,omitempty\"`\n\tCountOfMemoryBlocks      uint64            `json:\"CountOfMemoryBlocks,omitempty\"`\n\tMemoryBackingType        MemoryBackingType `json:\"MemoryBackingType,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/pause_notification.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n//  Notification data that is indicated to components running in the Virtual Machine.\ntype PauseNotification struct {\n\tReason string `json:\"Reason,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/pause_options.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n//  Options for HcsPauseComputeSystem\ntype PauseOptions struct {\n\tSuspensionLevel string `json:\"SuspensionLevel,omitempty\"`\n\n\tHostedNotification *PauseNotification `json:\"HostedNotification,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/plan9.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype Plan9 struct {\n\tShares []Plan9Share `json:\"Shares,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/plan9_share.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype Plan9Share struct {\n\tName string `json:\"Name,omitempty\"`\n\n\t//  The name by which the guest operation system can access this share, via  the aname parameter in the Plan9 protocol.\n\tAccessName string `json:\"AccessName,omitempty\"`\n\n\tPath string `json:\"Path,omitempty\"`\n\n\tPort int32 `json:\"Port,omitempty\"`\n\n\t// Flags are marked private. Until they are exported correctly\n\t//\n\t// ReadOnly      0x00000001\n\t// LinuxMetadata 0x00000004\n\t// CaseSensitive 0x00000008\n\tFlags int32 `json:\"Flags,omitempty\"`\n\n\tReadOnly bool `json:\"ReadOnly,omitempty\"`\n\n\tUseShareRootIdentity bool `json:\"UseShareRootIdentity,omitempty\"`\n\n\tAllowedFiles []string `json:\"AllowedFiles,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_details.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\nimport (\n\t\"time\"\n)\n\n//  Information about a process running in a container\ntype ProcessDetails struct {\n\tProcessId int32 `json:\"ProcessId,omitempty\"`\n\n\tImageName string `json:\"ImageName,omitempty\"`\n\n\tCreateTimestamp time.Time `json:\"CreateTimestamp,omitempty\"`\n\n\tUserTime100ns int32 `json:\"UserTime100ns,omitempty\"`\n\n\tKernelTime100ns int32 `json:\"KernelTime100ns,omitempty\"`\n\n\tMemoryCommitBytes int32 `json:\"MemoryCommitBytes,omitempty\"`\n\n\tMemoryWorkingSetPrivateBytes int32 `json:\"MemoryWorkingSetPrivateBytes,omitempty\"`\n\n\tMemoryWorkingSetSharedBytes int32 `json:\"MemoryWorkingSetSharedBytes,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_modify_request.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\nimport \"github.com/Microsoft/hcsshim/internal/protocol/guestrequest\"\n\n// Passed to HcsRpc_ModifyProcess\ntype ProcessModifyRequest struct {\n\tOperation guestrequest.ProcessModifyOperation `json:\"Operation,omitempty\"` // NOTE: Swagger generated as string. Locally updated.\n\n\tConsoleSize *ConsoleSize `json:\"ConsoleSize,omitempty\"`\n\n\tCloseHandle *CloseHandle `json:\"CloseHandle,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_parameters.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype ProcessParameters struct {\n\tApplicationName string `json:\"ApplicationName,omitempty\"`\n\n\tCommandLine string `json:\"CommandLine,omitempty\"`\n\n\t//  optional alternative to CommandLine, currently only supported by Linux GCS\n\tCommandArgs []string `json:\"CommandArgs,omitempty\"`\n\n\tUser string `json:\"User,omitempty\"`\n\n\tWorkingDirectory string `json:\"WorkingDirectory,omitempty\"`\n\n\tEnvironment map[string]string `json:\"Environment,omitempty\"`\n\n\t//  if set, will run as low-privilege process\n\tRestrictedToken bool `json:\"RestrictedToken,omitempty\"`\n\n\t//  if set, ignore StdErrPipe\n\tEmulateConsole bool `json:\"EmulateConsole,omitempty\"`\n\n\tCreateStdInPipe bool `json:\"CreateStdInPipe,omitempty\"`\n\n\tCreateStdOutPipe bool `json:\"CreateStdOutPipe,omitempty\"`\n\n\tCreateStdErrPipe bool `json:\"CreateStdErrPipe,omitempty\"`\n\n\t//  height then width\n\tConsoleSize []int32 `json:\"ConsoleSize,omitempty\"`\n\n\t//  if set, find an existing session for the user and create the process in it\n\tUseExistingLogin bool `json:\"UseExistingLogin,omitempty\"`\n\n\t//  if set, use the legacy console instead of conhost\n\tUseLegacyConsole bool `json:\"UseLegacyConsole,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_status.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n// NOTE: Swagger generated fields as int32. Locally updated to uint16 to match documentation.\n// https://learn.microsoft.com/en-us/virtualization/api/hcs/schemareference#ConsoleSize\n\n// Status of a process running in a container\ntype ProcessStatus struct {\n\tProcessId uint32 `json:\"ProcessId,omitempty\"` // NOTE: Swagger generated as int32. Locally updated to match documentation.\n\n\tExited bool `json:\"Exited,omitempty\"`\n\n\tExitCode uint32 `json:\"ExitCode,omitempty\"` // NOTE: Swagger generated as int32. Locally updated to match documentation.\n\n\tLastWaitResult int32 `json:\"LastWaitResult,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype Processor struct {\n\tCount int32 `json:\"Count,omitempty\"`\n\n\tMaximum int32 `json:\"Maximum,omitempty\"`\n\n\tWeight int32 `json:\"Weight,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor_stats.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n//  CPU runtime statistics\ntype ProcessorStats struct {\n\tTotalRuntime100ns uint64 `json:\"TotalRuntime100ns,omitempty\"`\n\n\tRuntimeUser100ns uint64 `json:\"RuntimeUser100ns,omitempty\"`\n\n\tRuntimeKernel100ns uint64 `json:\"RuntimeKernel100ns,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor_topology.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype ProcessorTopology struct {\n\tLogicalProcessorCount uint32             `json:\"LogicalProcessorCount,omitempty\"`\n\tLogicalProcessors     []LogicalProcessor `json:\"LogicalProcessors,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/properties.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\nimport (\n\tv1 \"github.com/containerd/cgroups/v3/cgroup1/stats\"\n)\n\ntype Properties struct {\n\tId string `json:\"Id,omitempty\"`\n\n\tSystemType string `json:\"SystemType,omitempty\"`\n\n\tRuntimeOsType string `json:\"RuntimeOsType,omitempty\"`\n\n\tName string `json:\"Name,omitempty\"`\n\n\tOwner string `json:\"Owner,omitempty\"`\n\n\tRuntimeId string `json:\"RuntimeId,omitempty\"`\n\n\tSystemGUID string `json:\"SystemGUID,omitempty\"`\n\n\tRuntimeTemplateId string `json:\"RuntimeTemplateId,omitempty\"`\n\n\tState string `json:\"State,omitempty\"`\n\n\tStopped bool `json:\"Stopped,omitempty\"`\n\n\tExitType string `json:\"ExitType,omitempty\"`\n\n\tMemory *MemoryInformationForVm `json:\"Memory,omitempty\"`\n\n\tStatistics *Statistics `json:\"Statistics,omitempty\"`\n\n\tProcessList []ProcessDetails `json:\"ProcessList,omitempty\"`\n\n\tTerminateOnLastHandleClosed bool `json:\"TerminateOnLastHandleClosed,omitempty\"`\n\n\tHostingSystemId string `json:\"HostingSystemId,omitempty\"`\n\n\tSharedMemoryRegionInfo []SharedMemoryRegionInfo `json:\"SharedMemoryRegionInfo,omitempty\"`\n\n\tGuestConnectionInfo *GuestConnectionInfo `json:\"GuestConnectionInfo,omitempty\"`\n\n\t// Metrics is not part of the API for HCS but this is used for LCOW v2 to\n\t// return the full cgroup metrics from the guest.\n\tMetrics *v1.Metrics `json:\"LCOWMetrics,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/property_query.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n//   By default the basic properties will be returned. This query provides a way to  request specific properties.\ntype PropertyQuery struct {\n\tPropertyTypes []PropertyType `json:\"PropertyTypes,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/property_type.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype PropertyType string\n\nconst (\n\tPTMemory                      PropertyType = \"Memory\"\n\tPTGuestMemory                 PropertyType = \"GuestMemory\"\n\tPTStatistics                  PropertyType = \"Statistics\"\n\tPTProcessList                 PropertyType = \"ProcessList\"\n\tPTTerminateOnLastHandleClosed PropertyType = \"TerminateOnLastHandleClosed\"\n\tPTSharedMemoryRegion          PropertyType = \"SharedMemoryRegion\"\n\tPTContainerCredentialGuard    PropertyType = \"ContainerCredentialGuard\" // This field is not generated by swagger. This was added manually.\n\tPTGuestConnection             PropertyType = \"GuestConnection\"\n\tPTICHeartbeatStatus           PropertyType = \"ICHeartbeatStatus\"\n\tPTProcessorTopology           PropertyType = \"ProcessorTopology\"\n\tPTCPUGroup                    PropertyType = \"CpuGroup\"\n\tPTSystemGUID                  PropertyType = \"SystemGUID\"\n)\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/rdp_connection_options.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype RdpConnectionOptions struct {\n\tAccessSids []string `json:\"AccessSids,omitempty\"`\n\n\tNamedPipe string `json:\"NamedPipe,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_changes.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype RegistryChanges struct {\n\tAddValues []RegistryValue `json:\"AddValues,omitempty\"`\n\n\tDeleteKeys []RegistryKey `json:\"DeleteKeys,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_hive.go",
    "content": "package hcsschema\n\n// NOTE: manually added\n\ntype RegistryHive string\n\n// List of RegistryHive\nconst (\n\tRegistryHive_SYSTEM   RegistryHive = \"System\"\n\tRegistryHive_SOFTWARE RegistryHive = \"Software\"\n\tRegistryHive_SECURITY RegistryHive = \"Security\"\n\tRegistryHive_SAM      RegistryHive = \"Sam\"\n)\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_key.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype RegistryKey struct {\n\tHive RegistryHive `json:\"Hive,omitempty\"`\n\n\tName string `json:\"Name,omitempty\"`\n\n\tVolatile bool `json:\"Volatile,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_value.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype RegistryValue struct {\n\tKey *RegistryKey `json:\"Key,omitempty\"`\n\n\tName string `json:\"Name,omitempty\"`\n\n\tType_ RegistryValueType `json:\"Type,omitempty\"`\n\n\t//  One and only one value type must be set.\n\tStringValue string `json:\"StringValue,omitempty\"`\n\n\tBinaryValue string `json:\"BinaryValue,omitempty\"`\n\n\tDWordValue int32 `json:\"DWordValue,omitempty\"`\n\n\tQWordValue int32 `json:\"QWordValue,omitempty\"`\n\n\t//  Only used if RegistryValueType is CustomType  The data is in BinaryValue\n\tCustomType int32 `json:\"CustomType,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_value_type.go",
    "content": "package hcsschema\n\n// NOTE: manually added\n\ntype RegistryValueType string\n\n// List of RegistryValueType\nconst (\n\tRegistryValueType_NONE            RegistryValueType = \"None\"\n\tRegistryValueType_STRING          RegistryValueType = \"String\"\n\tRegistryValueType_EXPANDED_STRING RegistryValueType = \"ExpandedString\"\n\tRegistryValueType_MULTI_STRING    RegistryValueType = \"MultiString\"\n\tRegistryValueType_BINARY          RegistryValueType = \"Binary\"\n\tRegistryValueType_D_WORD          RegistryValueType = \"DWord\"\n\tRegistryValueType_Q_WORD          RegistryValueType = \"QWord\"\n\tRegistryValueType_CUSTOM_TYPE     RegistryValueType = \"CustomType\"\n)\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/restore_state.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype RestoreState struct {\n\n\t//  The path to the save state file to restore the system from.\n\tSaveStateFilePath string `json:\"SaveStateFilePath,omitempty\"`\n\n\t//  The ID of the template system to clone this new system off of. An empty  string indicates the system should not be cloned from a template.\n\tTemplateSystemId string `json:\"TemplateSystemId,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/save_options.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype SaveOptions struct {\n\n\t//  The type of save operation to be performed.\n\tSaveType string `json:\"SaveType,omitempty\"`\n\n\t//  The path to the file that will container the saved state.\n\tSaveStateFilePath string `json:\"SaveStateFilePath,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/scsi.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype Scsi struct {\n\n\t//  Map of attachments, where the key is the integer LUN number on the controller.\n\tAttachments map[string]Attachment `json:\"Attachments,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/security_settings.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype SecuritySettings struct {\n\t// Enablement of Trusted Platform Module on the computer system\n\tEnableTpm bool               `json:\"EnableTpm,omitempty\"`\n\tIsolation *IsolationSettings `json:\"Isolation,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/service_properties.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\nimport \"encoding/json\"\n\ntype ServiceProperties struct {\n\t// Changed Properties field to []json.RawMessage from []interface{} to avoid having to\n\t// remarshal sp.Properties[n] and unmarshal into the type(s) we want.\n\tProperties []json.RawMessage `json:\"Properties,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/shared_memory_configuration.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype SharedMemoryConfiguration struct {\n\tRegions []SharedMemoryRegion `json:\"Regions,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/shared_memory_region.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype SharedMemoryRegion struct {\n\tSectionName string `json:\"SectionName,omitempty\"`\n\n\tStartOffset int32 `json:\"StartOffset,omitempty\"`\n\n\tLength int32 `json:\"Length,omitempty\"`\n\n\tAllowGuestWrite bool `json:\"AllowGuestWrite,omitempty\"`\n\n\tHiddenFromGuest bool `json:\"HiddenFromGuest,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/shared_memory_region_info.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype SharedMemoryRegionInfo struct {\n\tSectionName string `json:\"SectionName,omitempty\"`\n\n\tGuestPhysicalAddress int32 `json:\"GuestPhysicalAddress,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/silo_properties.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n//  Silo job information\ntype SiloProperties struct {\n\tEnabled bool `json:\"Enabled,omitempty\"`\n\n\tJobName string `json:\"JobName,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/statistics.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\nimport (\n\t\"time\"\n)\n\n//  Runtime statistics for a container\ntype Statistics struct {\n\tTimestamp time.Time `json:\"Timestamp,omitempty\"`\n\n\tContainerStartTime time.Time `json:\"ContainerStartTime,omitempty\"`\n\n\tUptime100ns uint64 `json:\"Uptime100ns,omitempty\"`\n\n\tProcessor *ProcessorStats `json:\"Processor,omitempty\"`\n\n\tMemory *MemoryStats `json:\"Memory,omitempty\"`\n\n\tStorage *StorageStats `json:\"Storage,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype Storage struct {\n\n\t//  List of layers that describe the parent hierarchy for a container's  storage. These layers combined together, presented as a disposable  and/or committable working storage, are used by the container to  record all changes done to the parent layers.\n\tLayers []Layer `json:\"Layers,omitempty\"`\n\n\t//  Path that points to the scratch space of a container, where parent  layers are combined together to present a new disposable and/or committable  layer with the changes done during its runtime.\n\tPath string `json:\"Path,omitempty\"`\n\n\tQoS *StorageQoS `json:\"QoS,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage_qo_s.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype StorageQoS struct {\n\tIopsMaximum int32 `json:\"IopsMaximum,omitempty\"`\n\n\tBandwidthMaximum int32 `json:\"BandwidthMaximum,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage_stats.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n//  Storage runtime statistics\ntype StorageStats struct {\n\tReadCountNormalized uint64 `json:\"ReadCountNormalized,omitempty\"`\n\n\tReadSizeBytes uint64 `json:\"ReadSizeBytes,omitempty\"`\n\n\tWriteCountNormalized uint64 `json:\"WriteCountNormalized,omitempty\"`\n\n\tWriteSizeBytes uint64 `json:\"WriteSizeBytes,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/system_time.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype SystemTime struct {\n\tYear int32 `json:\"Year,omitempty\"`\n\n\tMonth int32 `json:\"Month,omitempty\"`\n\n\tDayOfWeek int32 `json:\"DayOfWeek,omitempty\"`\n\n\tDay int32 `json:\"Day,omitempty\"`\n\n\tHour int32 `json:\"Hour,omitempty\"`\n\n\tMinute int32 `json:\"Minute,omitempty\"`\n\n\tSecond int32 `json:\"Second,omitempty\"`\n\n\tMilliseconds int32 `json:\"Milliseconds,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/time_zone_information.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype TimeZoneInformation struct {\n\tBias int32 `json:\"Bias,omitempty\"`\n\n\tStandardName string `json:\"StandardName,omitempty\"`\n\n\tStandardDate *SystemTime `json:\"StandardDate,omitempty\"`\n\n\tStandardBias int32 `json:\"StandardBias,omitempty\"`\n\n\tDaylightName string `json:\"DaylightName,omitempty\"`\n\n\tDaylightDate *SystemTime `json:\"DaylightDate,omitempty\"`\n\n\tDaylightBias int32 `json:\"DaylightBias,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/topology.go",
    "content": "// Autogenerated code; DO NOT EDIT.\n\n/*\n * Schema Open API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype Topology struct {\n\tMemory        *VirtualMachineMemory                `json:\"Memory,omitempty\"`\n\tProcessor     *VirtualMachineProcessor             `json:\"Processor,omitempty\"`\n\tNuma          *Numa                                `json:\"Numa,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/uefi.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype Uefi struct {\n\tEnableDebugger bool `json:\"EnableDebugger,omitempty\"`\n\n\tApplySecureBootTemplate string `json:\"ApplySecureBootTemplate,omitempty\"`\n\n\tSecureBootTemplateId string `json:\"SecureBootTemplateId,omitempty\"`\n\n\tBootThis *UefiBootEntry `json:\"BootThis,omitempty\"`\n\n\tConsole string `json:\"Console,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/uefi_boot_entry.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype UefiBootEntry struct {\n\tDeviceType string `json:\"DeviceType,omitempty\"`\n\n\tDevicePath string `json:\"DevicePath,omitempty\"`\n\n\tDiskNumber int32 `json:\"DiskNumber,omitempty\"`\n\n\tOptionalData string `json:\"OptionalData,omitempty\"`\n\n\tVmbFsRootPath string `json:\"VmbFsRootPath,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/version.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype Version struct {\n\tMajor int32 `json:\"Major,omitempty\"`\n\n\tMinor int32 `json:\"Minor,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/video_monitor.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype VideoMonitor struct {\n\tHorizontalResolution int32 `json:\"HorizontalResolution,omitempty\"`\n\n\tVerticalResolution int32 `json:\"VerticalResolution,omitempty\"`\n\n\tConnectionOptions *RdpConnectionOptions `json:\"ConnectionOptions,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_machine.go",
    "content": "// Autogenerated code; DO NOT EDIT.\n\n/*\n * Schema Open API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n// Configuration of a virtual machine, used during its creation to set up and/or use resources.\ntype VirtualMachine struct {\n\tVersion *Version `json:\"Version,omitempty\"`\n\t// When set to true, the virtual machine will treat a reset as a stop, releasing resources and cleaning up state.\n\tStopOnReset     bool             `json:\"StopOnReset,omitempty\"`\n\tChipset         *Chipset         `json:\"Chipset,omitempty\"`\n\tComputeTopology *Topology        `json:\"ComputeTopology,omitempty\"`\n\tDevices         *Devices         `json:\"Devices,omitempty\"`\n\tGuestState      *GuestState      `json:\"GuestState,omitempty\"`\n\tRestoreState    *RestoreState    `json:\"RestoreState,omitempty\"`\n\tRegistryChanges *RegistryChanges `json:\"RegistryChanges,omitempty\"`\n\tStorageQoS      *StorageQoS      `json:\"StorageQoS,omitempty\"`\n\tDebugOptions    *DebugOptions    `json:\"DebugOptions,omitempty\"`\n\tGuestConnection *GuestConnection `json:\"GuestConnection,omitempty\"`\n\tSecuritySettings  *SecuritySettings `json:\"SecuritySettings,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_machine_memory.go",
    "content": "// Autogenerated code; DO NOT EDIT.\n\n/*\n * Schema Open API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype VirtualMachineMemory struct {\n\tSizeInMB uint64             `json:\"SizeInMB,omitempty\"`\n\tBacking  *MemoryBackingType `json:\"Backing,omitempty\"`\n\t// If enabled, then the VM's memory is backed by the Windows pagefile rather than physically backed, statically allocated memory.\n\tAllowOvercommit bool                   `json:\"AllowOvercommit,omitempty\"`\n\t// If enabled, then the memory hot hint feature is exposed to the VM, allowing it to prefetch pages into its working set. (if supported by the guest operating system).\n\tEnableHotHint bool `json:\"EnableHotHint,omitempty\"`\n\t// If enabled, then the memory cold hint feature is exposed to the VM, allowing it to trim zeroed pages from its working set (if supported by the guest operating system).\n\tEnableColdHint bool `json:\"EnableColdHint,omitempty\"`\n\t// If enabled, then the memory cold discard hint feature is exposed to the VM, allowing it to trim non-zeroed pages from the working set (if supported by the guest operating system).\n\tEnableColdDiscardHint bool `json:\"EnableColdDiscardHint,omitempty\"`\n\t// If enabled, then commit is not charged for each backing page until first access.\n\tEnableDeferredCommit bool `json:\"EnableDeferredCommit,omitempty\"`\n\t// Low MMIO region allocated below 4GB\n\tLowMMIOGapInMB uint64 `json:\"LowMmioGapInMB,omitempty\"`\n\t// High MMIO region allocated above 4GB (base and size)\n\tHighMMIOBaseInMB         uint64                 `json:\"HighMmioBaseInMB,omitempty\"`\n\tHighMMIOGapInMB          uint64                 `json:\"HighMmioGapInMB,omitempty\"`\n\tSlitType                   *VirtualSlitType                   `json:\"SlitType,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_machine_processor.go",
    "content": "// Autogenerated code; DO NOT EDIT.\n\n/*\n * Schema Open API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype VirtualMachineProcessor struct {\n\tCount       uint32 `json:\"Count,omitempty\"`\n\tLimit       uint64 `json:\"Limit,omitempty\"`\n\tWeight      uint64 `json:\"Weight,omitempty\"`\n\tReservation uint64 `json:\"Reservation,omitempty\"`\n\tCpuGroup                   *CpuGroup            `json:\"CpuGroup,omitempty\"`\n\tNumaProcessorsSettings     *NumaProcessors      `json:\"NumaProcessorsSettings,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_node_info.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype VirtualNodeInfo struct {\n\tVirtualNodeIndex int32 `json:\"VirtualNodeIndex,omitempty\"`\n\n\tPhysicalNodeNumber int32 `json:\"PhysicalNodeNumber,omitempty\"`\n\n\tVirtualProcessorCount int32 `json:\"VirtualProcessorCount,omitempty\"`\n\n\tMemoryUsageInPages int32 `json:\"MemoryUsageInPages,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_p_mem_controller.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype VirtualPMemController struct {\n\tDevices map[string]VirtualPMemDevice `json:\"Devices,omitempty\"`\n\n\tMaximumCount uint32 `json:\"MaximumCount,omitempty\"`\n\n\tMaximumSizeBytes uint64 `json:\"MaximumSizeBytes,omitempty\"`\n\n\tBacking string `json:\"Backing,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_p_mem_device.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype VirtualPMemDevice struct {\n\tHostPath string `json:\"HostPath,omitempty\"`\n\n\tReadOnly bool `json:\"ReadOnly,omitempty\"`\n\n\tImageFormat string `json:\"ImageFormat,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_p_mem_mapping.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype VirtualPMemMapping struct {\n\tHostPath    string `json:\"HostPath,omitempty\"`\n\tImageFormat string `json:\"ImageFormat,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_pci_device.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.3\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n// TODO: PropagateNumaAffinity is pre-release/experimental field in schema 2.11. Need to add build number\n// docs when a public build with this is out.\ntype VirtualPciDevice struct {\n\tFunctions []VirtualPciFunction `json:\",omitempty\"`\n\tPropagateNumaAffinity *bool\t`json:\"PropagateNumaAffinity,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_pci_function.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.3\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n// TODO: This is pre-release support in schema 2.3. Need to add build number\n// docs when a public build with this is out.\ntype VirtualPciFunction struct {\n\tDeviceInstancePath string `json:\",omitempty\"`\n\n\tVirtualFunction uint16 `json:\",omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_slit_type.go",
    "content": "// Autogenerated code; DO NOT EDIT.\n\n/*\n * Schema Open API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n// VirtualSlitType : Indicates if a virtual SLIT should ne enabled for a VM and the type of virtual SLIT to be enabled.\ntype VirtualSlitType string\n\n// List of VirtualSlitType\nconst (\n\tVirtualSlitType_NONE                       VirtualSlitType = \"None\"\n\tVirtualSlitType_FIRMWARE                   VirtualSlitType = \"Firmware\"\n\tVirtualSlitType_MEASURED                   VirtualSlitType = \"Measured\"\n\tVirtualSlitType_FIRMWARE_FALLBACK_MEASURED VirtualSlitType = \"FirmwareFallbackMeasured\"\n)\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_smb.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype VirtualSmb struct {\n\tShares []VirtualSmbShare `json:\"Shares,omitempty\"`\n\n\tDirectFileMappingInMB int64 `json:\"DirectFileMappingInMB,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_smb_share.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype VirtualSmbShare struct {\n\tName string `json:\"Name,omitempty\"`\n\n\tPath string `json:\"Path,omitempty\"`\n\n\tAllowedFiles []string `json:\"AllowedFiles,omitempty\"`\n\n\tOptions *VirtualSmbShareOptions `json:\"Options,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_smb_share_options.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype VirtualSmbShareOptions struct {\n\tReadOnly bool `json:\"ReadOnly,omitempty\"`\n\n\t//  convert exclusive access to shared read access\n\tShareRead bool `json:\"ShareRead,omitempty\"`\n\n\t//  all opens will use cached I/O\n\tCacheIo bool `json:\"CacheIo,omitempty\"`\n\n\t//  disable oplock support\n\tNoOplocks bool `json:\"NoOplocks,omitempty\"`\n\n\t//  Acquire the backup privilege when attempting to open\n\tTakeBackupPrivilege bool `json:\"TakeBackupPrivilege,omitempty\"`\n\n\t//  Use the identity of the share root when opening\n\tUseShareRootIdentity bool `json:\"UseShareRootIdentity,omitempty\"`\n\n\t//  disable Direct Mapping\n\tNoDirectmap bool `json:\"NoDirectmap,omitempty\"`\n\n\t//  disable Byterange locks\n\tNoLocks bool `json:\"NoLocks,omitempty\"`\n\n\t//  disable Directory CHange Notifications\n\tNoDirnotify bool `json:\"NoDirnotify,omitempty\"`\n\n\t//  share is use for VM shared memory\n\tVmSharedMemory bool `json:\"VmSharedMemory,omitempty\"`\n\n\t//  allow access only to the files specified in AllowedFiles\n\tRestrictFileAccess bool `json:\"RestrictFileAccess,omitempty\"`\n\n\t//  disable all oplocks except Level II\n\tForceLevelIIOplocks bool `json:\"ForceLevelIIOplocks,omitempty\"`\n\n\t//  Allow the host to reparse this base layer\n\tReparseBaseLayer bool `json:\"ReparseBaseLayer,omitempty\"`\n\n\t//  Enable pseudo-oplocks\n\tPseudoOplocks bool `json:\"PseudoOplocks,omitempty\"`\n\n\t//  All opens will use non-cached IO\n\tNonCacheIo bool `json:\"NonCacheIo,omitempty\"`\n\n\t//  Enable pseudo directory change notifications\n\tPseudoDirnotify bool `json:\"PseudoDirnotify,omitempty\"`\n\n\t//  Block directory enumeration, renames, and deletes.\n\tSingleFileMapping bool `json:\"SingleFileMapping,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/vm_memory.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype VmMemory struct {\n\tAvailableMemory int32 `json:\"AvailableMemory,omitempty\"`\n\n\tAvailableMemoryBuffer int32 `json:\"AvailableMemoryBuffer,omitempty\"`\n\n\tReservedMemory uint64 `json:\"ReservedMemory,omitempty\"`\n\n\tAssignedMemory uint64 `json:\"AssignedMemory,omitempty\"`\n\n\tSlpActive bool `json:\"SlpActive,omitempty\"`\n\n\tBalancingEnabled bool `json:\"BalancingEnabled,omitempty\"`\n\n\tDmOperationInProgress bool `json:\"DmOperationInProgress,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/vm_processor_limits.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.4\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\n// ProcessorLimits is used when modifying processor scheduling limits of a virtual machine.\ntype ProcessorLimits struct {\n\t// Maximum amount of host CPU resources that the virtual machine can use.\n\tLimit uint64 `json:\"Limit,omitempty\"`\n\t// Value describing the relative priority of this virtual machine compared to other virtual machines.\n\tWeight uint64 `json:\"Weight,omitempty\"`\n\t// Minimum amount of host CPU resources that the virtual machine is guaranteed.\n\tReservation uint64 `json:\"Reservation,omitempty\"`\n\t// Provides the target maximum CPU frequency, in MHz, for a virtual machine.\n\tMaximumFrequencyMHz uint32 `json:\"MaximumFrequencyMHz,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/windows_crash_reporting.go",
    "content": "/*\n * HCS API\n *\n * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)\n *\n * API version: 2.1\n * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)\n */\n\npackage hcsschema\n\ntype WindowsCrashReporting struct {\n\tDumpFileName string `json:\"DumpFileName,omitempty\"`\n\n\tMaxDumpSize int64 `json:\"MaxDumpSize,omitempty\"`\n\n\tDumpType string `json:\"DumpType,omitempty\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/service.go",
    "content": "//go:build windows\n\npackage hcs\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\n\thcsschema \"github.com/Microsoft/hcsshim/internal/hcs/schema2\"\n\t\"github.com/Microsoft/hcsshim/internal/vmcompute\"\n)\n\n// GetServiceProperties returns properties of the host compute service.\nfunc GetServiceProperties(ctx context.Context, q hcsschema.PropertyQuery) (*hcsschema.ServiceProperties, error) {\n\toperation := \"hcs::GetServiceProperties\"\n\n\tqueryb, err := json.Marshal(q)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tpropertiesJSON, resultJSON, err := vmcompute.HcsGetServiceProperties(ctx, string(queryb))\n\tevents := processHcsResult(ctx, resultJSON)\n\tif err != nil {\n\t\treturn nil, &HcsError{Op: operation, Err: err, Events: events}\n\t}\n\n\tif propertiesJSON == \"\" {\n\t\treturn nil, ErrUnexpectedValue\n\t}\n\tproperties := &hcsschema.ServiceProperties{}\n\tif err := json.Unmarshal([]byte(propertiesJSON), properties); err != nil {\n\t\treturn nil, err\n\t}\n\treturn properties, nil\n}\n\n// ModifyServiceSettings modifies settings of the host compute service.\nfunc ModifyServiceSettings(ctx context.Context, settings hcsschema.ModificationRequest) error {\n\toperation := \"hcs::ModifyServiceSettings\"\n\n\tsettingsJSON, err := json.Marshal(settings)\n\tif err != nil {\n\t\treturn err\n\t}\n\tresultJSON, err := vmcompute.HcsModifyServiceSettings(ctx, string(settingsJSON))\n\tevents := processHcsResult(ctx, resultJSON)\n\tif err != nil {\n\t\treturn &HcsError{Op: operation, Err: err, Events: events}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go",
    "content": "//go:build windows\n\npackage hcs\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\t\"sync\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"github.com/Microsoft/hcsshim/internal/cow\"\n\t\"github.com/Microsoft/hcsshim/internal/hcs/schema1\"\n\thcsschema \"github.com/Microsoft/hcsshim/internal/hcs/schema2\"\n\t\"github.com/Microsoft/hcsshim/internal/jobobject\"\n\t\"github.com/Microsoft/hcsshim/internal/log\"\n\t\"github.com/Microsoft/hcsshim/internal/logfields\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"github.com/Microsoft/hcsshim/internal/timeout\"\n\t\"github.com/Microsoft/hcsshim/internal/vmcompute\"\n\t\"github.com/sirupsen/logrus\"\n\t\"go.opencensus.io/trace\"\n)\n\ntype System struct {\n\thandleLock     sync.RWMutex\n\thandle         vmcompute.HcsSystem\n\tid             string\n\tcallbackNumber uintptr\n\n\tclosedWaitOnce sync.Once\n\twaitBlock      chan struct{}\n\twaitError      error\n\texitError      error\n\tos, typ, owner string\n\tstartTime      time.Time\n}\n\nvar _ cow.Container = &System{}\nvar _ cow.ProcessHost = &System{}\n\nfunc newSystem(id string) *System {\n\treturn &System{\n\t\tid:        id,\n\t\twaitBlock: make(chan struct{}),\n\t}\n}\n\n// Implementation detail for silo naming, this should NOT be relied upon very heavily.\nfunc siloNameFmt(containerID string) string {\n\treturn fmt.Sprintf(`\\Container_%s`, containerID)\n}\n\n// CreateComputeSystem creates a new compute system with the given configuration but does not start it.\nfunc CreateComputeSystem(ctx context.Context, id string, hcsDocumentInterface interface{}) (_ *System, err error) {\n\toperation := \"hcs::CreateComputeSystem\"\n\n\t// hcsCreateComputeSystemContext is an async operation. Start the outer span\n\t// here to measure the full create time.\n\tctx, span := oc.StartSpan(ctx, operation)\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"cid\", id))\n\n\tcomputeSystem := newSystem(id)\n\n\thcsDocumentB, err := json.Marshal(hcsDocumentInterface)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\thcsDocument := string(hcsDocumentB)\n\n\tvar (\n\t\tidentity    syscall.Handle\n\t\tresultJSON  string\n\t\tcreateError error\n\t)\n\tcomputeSystem.handle, resultJSON, createError = vmcompute.HcsCreateComputeSystem(ctx, id, hcsDocument, identity)\n\tif createError == nil || IsPending(createError) {\n\t\tdefer func() {\n\t\t\tif err != nil {\n\t\t\t\tcomputeSystem.Close()\n\t\t\t}\n\t\t}()\n\t\tif err = computeSystem.registerCallback(ctx); err != nil {\n\t\t\t// Terminate the compute system if it still exists. We're okay to\n\t\t\t// ignore a failure here.\n\t\t\t_ = computeSystem.Terminate(ctx)\n\t\t\treturn nil, makeSystemError(computeSystem, operation, err, nil)\n\t\t}\n\t}\n\n\tevents, err := processAsyncHcsResult(ctx, createError, resultJSON, computeSystem.callbackNumber,\n\t\thcsNotificationSystemCreateCompleted, &timeout.SystemCreate)\n\tif err != nil {\n\t\tif errors.Is(err, ErrTimeout) {\n\t\t\t// Terminate the compute system if it still exists. We're okay to\n\t\t\t// ignore a failure here.\n\t\t\t_ = computeSystem.Terminate(ctx)\n\t\t}\n\t\treturn nil, makeSystemError(computeSystem, operation, err, events)\n\t}\n\tgo computeSystem.waitBackground()\n\tif err = computeSystem.getCachedProperties(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\treturn computeSystem, nil\n}\n\n// OpenComputeSystem opens an existing compute system by ID.\nfunc OpenComputeSystem(ctx context.Context, id string) (*System, error) {\n\toperation := \"hcs::OpenComputeSystem\"\n\n\tcomputeSystem := newSystem(id)\n\thandle, resultJSON, err := vmcompute.HcsOpenComputeSystem(ctx, id)\n\tevents := processHcsResult(ctx, resultJSON)\n\tif err != nil {\n\t\treturn nil, makeSystemError(computeSystem, operation, err, events)\n\t}\n\tcomputeSystem.handle = handle\n\tdefer func() {\n\t\tif err != nil {\n\t\t\tcomputeSystem.Close()\n\t\t}\n\t}()\n\tif err = computeSystem.registerCallback(ctx); err != nil {\n\t\treturn nil, makeSystemError(computeSystem, operation, err, nil)\n\t}\n\tgo computeSystem.waitBackground()\n\tif err = computeSystem.getCachedProperties(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\treturn computeSystem, nil\n}\n\nfunc (computeSystem *System) getCachedProperties(ctx context.Context) error {\n\tprops, err := computeSystem.Properties(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\tcomputeSystem.typ = strings.ToLower(props.SystemType)\n\tcomputeSystem.os = strings.ToLower(props.RuntimeOSType)\n\tcomputeSystem.owner = strings.ToLower(props.Owner)\n\tif computeSystem.os == \"\" && computeSystem.typ == \"container\" {\n\t\t// Pre-RS5 HCS did not return the OS, but it only supported containers\n\t\t// that ran Windows.\n\t\tcomputeSystem.os = \"windows\"\n\t}\n\treturn nil\n}\n\n// OS returns the operating system of the compute system, \"linux\" or \"windows\".\nfunc (computeSystem *System) OS() string {\n\treturn computeSystem.os\n}\n\n// IsOCI returns whether processes in the compute system should be created via\n// OCI.\nfunc (computeSystem *System) IsOCI() bool {\n\treturn computeSystem.os == \"linux\" && computeSystem.typ == \"container\"\n}\n\n// GetComputeSystems gets a list of the compute systems on the system that match the query\nfunc GetComputeSystems(ctx context.Context, q schema1.ComputeSystemQuery) ([]schema1.ContainerProperties, error) {\n\toperation := \"hcs::GetComputeSystems\"\n\n\tqueryb, err := json.Marshal(q)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tcomputeSystemsJSON, resultJSON, err := vmcompute.HcsEnumerateComputeSystems(ctx, string(queryb))\n\tevents := processHcsResult(ctx, resultJSON)\n\tif err != nil {\n\t\treturn nil, &HcsError{Op: operation, Err: err, Events: events}\n\t}\n\n\tif computeSystemsJSON == \"\" {\n\t\treturn nil, ErrUnexpectedValue\n\t}\n\tcomputeSystems := []schema1.ContainerProperties{}\n\tif err = json.Unmarshal([]byte(computeSystemsJSON), &computeSystems); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn computeSystems, nil\n}\n\n// Start synchronously starts the computeSystem.\nfunc (computeSystem *System) Start(ctx context.Context) (err error) {\n\toperation := \"hcs::System::Start\"\n\n\t// hcsStartComputeSystemContext is an async operation. Start the outer span\n\t// here to measure the full start time.\n\tctx, span := oc.StartSpan(ctx, operation)\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"cid\", computeSystem.id))\n\n\tcomputeSystem.handleLock.RLock()\n\tdefer computeSystem.handleLock.RUnlock()\n\n\t// prevent starting an exited system because waitblock we do not recreate waitBlock\n\t// or rerun waitBackground, so we have no way to be notified of it closing again\n\tif computeSystem.handle == 0 {\n\t\treturn makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil)\n\t}\n\n\tresultJSON, err := vmcompute.HcsStartComputeSystem(ctx, computeSystem.handle, \"\")\n\tevents, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber,\n\t\thcsNotificationSystemStartCompleted, &timeout.SystemStart)\n\tif err != nil {\n\t\treturn makeSystemError(computeSystem, operation, err, events)\n\t}\n\tcomputeSystem.startTime = time.Now()\n\treturn nil\n}\n\n// ID returns the compute system's identifier.\nfunc (computeSystem *System) ID() string {\n\treturn computeSystem.id\n}\n\n// Shutdown requests a compute system shutdown.\nfunc (computeSystem *System) Shutdown(ctx context.Context) error {\n\tcomputeSystem.handleLock.RLock()\n\tdefer computeSystem.handleLock.RUnlock()\n\n\toperation := \"hcs::System::Shutdown\"\n\n\tif computeSystem.handle == 0 || computeSystem.stopped() {\n\t\treturn nil\n\t}\n\n\tresultJSON, err := vmcompute.HcsShutdownComputeSystem(ctx, computeSystem.handle, \"\")\n\tevents := processHcsResult(ctx, resultJSON)\n\tif err != nil &&\n\t\t!errors.Is(err, ErrVmcomputeAlreadyStopped) &&\n\t\t!errors.Is(err, ErrComputeSystemDoesNotExist) &&\n\t\t!errors.Is(err, ErrVmcomputeOperationPending) {\n\t\treturn makeSystemError(computeSystem, operation, err, events)\n\t}\n\treturn nil\n}\n\n// Terminate requests a compute system terminate.\nfunc (computeSystem *System) Terminate(ctx context.Context) error {\n\tcomputeSystem.handleLock.RLock()\n\tdefer computeSystem.handleLock.RUnlock()\n\n\toperation := \"hcs::System::Terminate\"\n\n\tif computeSystem.handle == 0 || computeSystem.stopped() {\n\t\treturn nil\n\t}\n\n\tresultJSON, err := vmcompute.HcsTerminateComputeSystem(ctx, computeSystem.handle, \"\")\n\tevents := processHcsResult(ctx, resultJSON)\n\tif err != nil &&\n\t\t!errors.Is(err, ErrVmcomputeAlreadyStopped) &&\n\t\t!errors.Is(err, ErrComputeSystemDoesNotExist) &&\n\t\t!errors.Is(err, ErrVmcomputeOperationPending) {\n\t\treturn makeSystemError(computeSystem, operation, err, events)\n\t}\n\treturn nil\n}\n\n// waitBackground waits for the compute system exit notification. Once received\n// sets `computeSystem.waitError` (if any) and unblocks all `Wait` calls.\n//\n// This MUST be called exactly once per `computeSystem.handle` but `Wait` is\n// safe to call multiple times.\nfunc (computeSystem *System) waitBackground() {\n\toperation := \"hcs::System::waitBackground\"\n\tctx, span := oc.StartSpan(context.Background(), operation)\n\tdefer span.End()\n\tspan.AddAttributes(trace.StringAttribute(\"cid\", computeSystem.id))\n\n\terr := waitForNotification(ctx, computeSystem.callbackNumber, hcsNotificationSystemExited, nil)\n\tif err == nil {\n\t\tlog.G(ctx).Debug(\"system exited\")\n\t} else if errors.Is(err, ErrVmcomputeUnexpectedExit) {\n\t\tlog.G(ctx).Debug(\"unexpected system exit\")\n\t\tcomputeSystem.exitError = makeSystemError(computeSystem, operation, err, nil)\n\t\terr = nil\n\t} else {\n\t\terr = makeSystemError(computeSystem, operation, err, nil)\n\t}\n\tcomputeSystem.closedWaitOnce.Do(func() {\n\t\tcomputeSystem.waitError = err\n\t\tclose(computeSystem.waitBlock)\n\t})\n\toc.SetSpanStatus(span, err)\n}\n\nfunc (computeSystem *System) WaitChannel() <-chan struct{} {\n\treturn computeSystem.waitBlock\n}\n\nfunc (computeSystem *System) WaitError() error {\n\treturn computeSystem.waitError\n}\n\n// Wait synchronously waits for the compute system to shutdown or terminate.\n// If the compute system has already exited returns the previous error (if any).\nfunc (computeSystem *System) Wait() error {\n\treturn computeSystem.WaitCtx(context.Background())\n}\n\n// WaitCtx synchronously waits for the compute system to shutdown or terminate, or the context to be cancelled.\n//\n// See [System.Wait] for more information.\nfunc (computeSystem *System) WaitCtx(ctx context.Context) error {\n\tselect {\n\tcase <-computeSystem.WaitChannel():\n\t\treturn computeSystem.WaitError()\n\tcase <-ctx.Done():\n\t\treturn ctx.Err()\n\t}\n}\n\n// stopped returns true if the compute system stopped.\nfunc (computeSystem *System) stopped() bool {\n\tselect {\n\tcase <-computeSystem.waitBlock:\n\t\treturn true\n\tdefault:\n\t}\n\treturn false\n}\n\n// ExitError returns an error describing the reason the compute system terminated.\nfunc (computeSystem *System) ExitError() error {\n\tif !computeSystem.stopped() {\n\t\treturn errors.New(\"container not exited\")\n\t}\n\tif computeSystem.waitError != nil {\n\t\treturn computeSystem.waitError\n\t}\n\treturn computeSystem.exitError\n}\n\n// Properties returns the requested container properties targeting a V1 schema container.\nfunc (computeSystem *System) Properties(ctx context.Context, types ...schema1.PropertyType) (*schema1.ContainerProperties, error) {\n\tcomputeSystem.handleLock.RLock()\n\tdefer computeSystem.handleLock.RUnlock()\n\n\toperation := \"hcs::System::Properties\"\n\n\tif computeSystem.handle == 0 {\n\t\treturn nil, makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil)\n\t}\n\n\tqueryBytes, err := json.Marshal(schema1.PropertyQuery{PropertyTypes: types})\n\tif err != nil {\n\t\treturn nil, makeSystemError(computeSystem, operation, err, nil)\n\t}\n\n\tpropertiesJSON, resultJSON, err := vmcompute.HcsGetComputeSystemProperties(ctx, computeSystem.handle, string(queryBytes))\n\tevents := processHcsResult(ctx, resultJSON)\n\tif err != nil {\n\t\treturn nil, makeSystemError(computeSystem, operation, err, events)\n\t}\n\n\tif propertiesJSON == \"\" {\n\t\treturn nil, ErrUnexpectedValue\n\t}\n\tproperties := &schema1.ContainerProperties{}\n\tif err := json.Unmarshal([]byte(propertiesJSON), properties); err != nil {\n\t\treturn nil, makeSystemError(computeSystem, operation, err, nil)\n\t}\n\n\treturn properties, nil\n}\n\n// queryInProc handles querying for container properties without reaching out to HCS. `props`\n// will be updated to contain any data returned from the queries present in `types`. If any properties\n// failed to be queried they will be tallied up and returned in as the first return value. Failures on\n// query are NOT considered errors; the only failure case for this method is if the containers job object\n// cannot be opened.\nfunc (computeSystem *System) queryInProc(\n\tctx context.Context,\n\tprops *hcsschema.Properties,\n\ttypes []hcsschema.PropertyType,\n) ([]hcsschema.PropertyType, error) {\n\t// In the future we can make use of some new functionality in the HCS that allows you\n\t// to pass a job object for HCS to use for the container. Currently, the only way we'll\n\t// be able to open the job/silo is if we're running as SYSTEM.\n\tjobOptions := &jobobject.Options{\n\t\tUseNTVariant: true,\n\t\tName:         siloNameFmt(computeSystem.id),\n\t}\n\tjob, err := jobobject.Open(ctx, jobOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer job.Close()\n\n\tvar fallbackQueryTypes []hcsschema.PropertyType\n\tfor _, propType := range types {\n\t\tswitch propType {\n\t\tcase hcsschema.PTStatistics:\n\t\t\t// Handle a bad caller asking for the same type twice. No use in re-querying if this is\n\t\t\t// filled in already.\n\t\t\tif props.Statistics == nil {\n\t\t\t\tprops.Statistics, err = computeSystem.statisticsInProc(job)\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.G(ctx).WithError(err).Warn(\"failed to get statistics in-proc\")\n\n\t\t\t\t\tfallbackQueryTypes = append(fallbackQueryTypes, propType)\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tfallbackQueryTypes = append(fallbackQueryTypes, propType)\n\t\t}\n\t}\n\n\treturn fallbackQueryTypes, nil\n}\n\n// statisticsInProc emulates what HCS does to grab statistics for a given container with a small\n// change to make grabbing the private working set total much more efficient.\nfunc (computeSystem *System) statisticsInProc(job *jobobject.JobObject) (*hcsschema.Statistics, error) {\n\t// Start timestamp for these stats before we grab them to match HCS\n\ttimestamp := time.Now()\n\n\tmemInfo, err := job.QueryMemoryStats()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tprocessorInfo, err := job.QueryProcessorStats()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tstorageInfo, err := job.QueryStorageStats()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// This calculates the private working set more efficiently than HCS does. HCS calls NtQuerySystemInformation\n\t// with the class SystemProcessInformation which returns an array containing system information for *every*\n\t// process running on the machine. They then grab the pids that are running in the container and filter down\n\t// the entries in the array to only what's running in that silo and start tallying up the total. This doesn't\n\t// work well as performance should get worse if more processess are running on the machine in general and not\n\t// just in the container. All of the additional information besides the WorkingSetPrivateSize field is ignored\n\t// as well which isn't great and is wasted work to fetch.\n\t//\n\t// HCS only let's you grab statistics in an all or nothing fashion, so we can't just grab the private\n\t// working set ourselves and ask for everything else separately. The optimization we can make here is\n\t// to open the silo ourselves and do the same queries for the rest of the info, as well as calculating\n\t// the private working set in a more efficient manner by:\n\t//\n\t// 1. Find the pids running in the silo\n\t// 2. Get a process handle for every process (only need PROCESS_QUERY_LIMITED_INFORMATION access)\n\t// 3. Call NtQueryInformationProcess on each process with the class ProcessVmCounters\n\t// 4. Tally up the total using the field PrivateWorkingSetSize in VM_COUNTERS_EX2.\n\tprivateWorkingSet, err := job.QueryPrivateWorkingSet()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &hcsschema.Statistics{\n\t\tTimestamp:          timestamp,\n\t\tContainerStartTime: computeSystem.startTime,\n\t\tUptime100ns:        uint64(time.Since(computeSystem.startTime).Nanoseconds()) / 100,\n\t\tMemory: &hcsschema.MemoryStats{\n\t\t\tMemoryUsageCommitBytes:            memInfo.JobMemory,\n\t\t\tMemoryUsageCommitPeakBytes:        memInfo.PeakJobMemoryUsed,\n\t\t\tMemoryUsagePrivateWorkingSetBytes: privateWorkingSet,\n\t\t},\n\t\tProcessor: &hcsschema.ProcessorStats{\n\t\t\tRuntimeKernel100ns: uint64(processorInfo.TotalKernelTime),\n\t\t\tRuntimeUser100ns:   uint64(processorInfo.TotalUserTime),\n\t\t\tTotalRuntime100ns:  uint64(processorInfo.TotalKernelTime + processorInfo.TotalUserTime),\n\t\t},\n\t\tStorage: &hcsschema.StorageStats{\n\t\t\tReadCountNormalized:  uint64(storageInfo.ReadStats.IoCount),\n\t\t\tReadSizeBytes:        storageInfo.ReadStats.TotalSize,\n\t\t\tWriteCountNormalized: uint64(storageInfo.WriteStats.IoCount),\n\t\t\tWriteSizeBytes:       storageInfo.WriteStats.TotalSize,\n\t\t},\n\t}, nil\n}\n\n// hcsPropertiesV2Query is a helper to make a HcsGetComputeSystemProperties call using the V2 schema property types.\nfunc (computeSystem *System) hcsPropertiesV2Query(ctx context.Context, types []hcsschema.PropertyType) (*hcsschema.Properties, error) {\n\toperation := \"hcs::System::PropertiesV2\"\n\n\tif computeSystem.handle == 0 {\n\t\treturn nil, makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil)\n\t}\n\n\tqueryBytes, err := json.Marshal(hcsschema.PropertyQuery{PropertyTypes: types})\n\tif err != nil {\n\t\treturn nil, makeSystemError(computeSystem, operation, err, nil)\n\t}\n\n\tpropertiesJSON, resultJSON, err := vmcompute.HcsGetComputeSystemProperties(ctx, computeSystem.handle, string(queryBytes))\n\tevents := processHcsResult(ctx, resultJSON)\n\tif err != nil {\n\t\treturn nil, makeSystemError(computeSystem, operation, err, events)\n\t}\n\n\tif propertiesJSON == \"\" {\n\t\treturn nil, ErrUnexpectedValue\n\t}\n\tprops := &hcsschema.Properties{}\n\tif err := json.Unmarshal([]byte(propertiesJSON), props); err != nil {\n\t\treturn nil, makeSystemError(computeSystem, operation, err, nil)\n\t}\n\n\treturn props, nil\n}\n\n// PropertiesV2 returns the requested compute systems properties targeting a V2 schema compute system.\nfunc (computeSystem *System) PropertiesV2(ctx context.Context, types ...hcsschema.PropertyType) (_ *hcsschema.Properties, err error) {\n\tcomputeSystem.handleLock.RLock()\n\tdefer computeSystem.handleLock.RUnlock()\n\n\t// Let HCS tally up the total for VM based queries instead of querying ourselves.\n\tif computeSystem.typ != \"container\" {\n\t\treturn computeSystem.hcsPropertiesV2Query(ctx, types)\n\t}\n\n\t// Define a starter Properties struct with the default fields returned from every\n\t// query. Owner is only returned from Statistics but it's harmless to include.\n\tproperties := &hcsschema.Properties{\n\t\tId:            computeSystem.id,\n\t\tSystemType:    computeSystem.typ,\n\t\tRuntimeOsType: computeSystem.os,\n\t\tOwner:         computeSystem.owner,\n\t}\n\n\tlogEntry := log.G(ctx)\n\t// First lets try and query ourselves without reaching to HCS. If any of the queries fail\n\t// we'll take note and fallback to querying HCS for any of the failed types.\n\tfallbackTypes, err := computeSystem.queryInProc(ctx, properties, types)\n\tif err == nil && len(fallbackTypes) == 0 {\n\t\treturn properties, nil\n\t} else if err != nil {\n\t\tlogEntry = logEntry.WithError(fmt.Errorf(\"failed to query compute system properties in-proc: %w\", err))\n\t\tfallbackTypes = types\n\t}\n\n\tlogEntry.WithFields(logrus.Fields{\n\t\tlogfields.ContainerID: computeSystem.id,\n\t\t\"propertyTypes\":       fallbackTypes,\n\t}).Info(\"falling back to HCS for property type queries\")\n\n\thcsProperties, err := computeSystem.hcsPropertiesV2Query(ctx, fallbackTypes)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Now add in anything that we might have successfully queried in process.\n\tif properties.Statistics != nil {\n\t\thcsProperties.Statistics = properties.Statistics\n\t\thcsProperties.Owner = properties.Owner\n\t}\n\n\t// For future support for querying processlist in-proc as well.\n\tif properties.ProcessList != nil {\n\t\thcsProperties.ProcessList = properties.ProcessList\n\t}\n\n\treturn hcsProperties, nil\n}\n\n// Pause pauses the execution of the computeSystem. This feature is not enabled in TP5.\nfunc (computeSystem *System) Pause(ctx context.Context) (err error) {\n\toperation := \"hcs::System::Pause\"\n\n\t// hcsPauseComputeSystemContext is an async operation. Start the outer span\n\t// here to measure the full pause time.\n\tctx, span := oc.StartSpan(ctx, operation)\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"cid\", computeSystem.id))\n\n\tcomputeSystem.handleLock.RLock()\n\tdefer computeSystem.handleLock.RUnlock()\n\n\tif computeSystem.handle == 0 {\n\t\treturn makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil)\n\t}\n\n\tresultJSON, err := vmcompute.HcsPauseComputeSystem(ctx, computeSystem.handle, \"\")\n\tevents, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber,\n\t\thcsNotificationSystemPauseCompleted, &timeout.SystemPause)\n\tif err != nil {\n\t\treturn makeSystemError(computeSystem, operation, err, events)\n\t}\n\n\treturn nil\n}\n\n// Resume resumes the execution of the computeSystem. This feature is not enabled in TP5.\nfunc (computeSystem *System) Resume(ctx context.Context) (err error) {\n\toperation := \"hcs::System::Resume\"\n\n\t// hcsResumeComputeSystemContext is an async operation. Start the outer span\n\t// here to measure the full restore time.\n\tctx, span := oc.StartSpan(ctx, operation)\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"cid\", computeSystem.id))\n\n\tcomputeSystem.handleLock.RLock()\n\tdefer computeSystem.handleLock.RUnlock()\n\n\tif computeSystem.handle == 0 {\n\t\treturn makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil)\n\t}\n\n\tresultJSON, err := vmcompute.HcsResumeComputeSystem(ctx, computeSystem.handle, \"\")\n\tevents, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber,\n\t\thcsNotificationSystemResumeCompleted, &timeout.SystemResume)\n\tif err != nil {\n\t\treturn makeSystemError(computeSystem, operation, err, events)\n\t}\n\n\treturn nil\n}\n\n// Save the compute system\nfunc (computeSystem *System) Save(ctx context.Context, options interface{}) (err error) {\n\toperation := \"hcs::System::Save\"\n\n\t// hcsSaveComputeSystemContext is an async operation. Start the outer span\n\t// here to measure the full save time.\n\tctx, span := oc.StartSpan(ctx, operation)\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"cid\", computeSystem.id))\n\n\tsaveOptions, err := json.Marshal(options)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tcomputeSystem.handleLock.RLock()\n\tdefer computeSystem.handleLock.RUnlock()\n\n\tif computeSystem.handle == 0 {\n\t\treturn makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil)\n\t}\n\n\tresult, err := vmcompute.HcsSaveComputeSystem(ctx, computeSystem.handle, string(saveOptions))\n\tevents, err := processAsyncHcsResult(ctx, err, result, computeSystem.callbackNumber,\n\t\thcsNotificationSystemSaveCompleted, &timeout.SystemSave)\n\tif err != nil {\n\t\treturn makeSystemError(computeSystem, operation, err, events)\n\t}\n\n\treturn nil\n}\n\nfunc (computeSystem *System) createProcess(ctx context.Context, operation string, c interface{}) (*Process, *vmcompute.HcsProcessInformation, error) {\n\tcomputeSystem.handleLock.RLock()\n\tdefer computeSystem.handleLock.RUnlock()\n\n\tif computeSystem.handle == 0 {\n\t\treturn nil, nil, makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil)\n\t}\n\n\tconfigurationb, err := json.Marshal(c)\n\tif err != nil {\n\t\treturn nil, nil, makeSystemError(computeSystem, operation, err, nil)\n\t}\n\n\tconfiguration := string(configurationb)\n\tprocessInfo, processHandle, resultJSON, err := vmcompute.HcsCreateProcess(ctx, computeSystem.handle, configuration)\n\tevents := processHcsResult(ctx, resultJSON)\n\tif err != nil {\n\t\tif v2, ok := c.(*hcsschema.ProcessParameters); ok {\n\t\t\toperation += \": \" + v2.CommandLine\n\t\t} else if v1, ok := c.(*schema1.ProcessConfig); ok {\n\t\t\toperation += \": \" + v1.CommandLine\n\t\t}\n\t\treturn nil, nil, makeSystemError(computeSystem, operation, err, events)\n\t}\n\n\tlog.G(ctx).WithField(\"pid\", processInfo.ProcessId).Debug(\"created process pid\")\n\treturn newProcess(processHandle, int(processInfo.ProcessId), computeSystem), &processInfo, nil\n}\n\n// CreateProcess launches a new process within the computeSystem.\nfunc (computeSystem *System) CreateProcess(ctx context.Context, c interface{}) (cow.Process, error) {\n\toperation := \"hcs::System::CreateProcess\"\n\tprocess, processInfo, err := computeSystem.createProcess(ctx, operation, c)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer func() {\n\t\tif err != nil {\n\t\t\tprocess.Close()\n\t\t}\n\t}()\n\n\tpipes, err := makeOpenFiles([]syscall.Handle{processInfo.StdInput, processInfo.StdOutput, processInfo.StdError})\n\tif err != nil {\n\t\treturn nil, makeSystemError(computeSystem, operation, err, nil)\n\t}\n\tprocess.stdin = pipes[0]\n\tprocess.stdout = pipes[1]\n\tprocess.stderr = pipes[2]\n\tprocess.hasCachedStdio = true\n\n\tif err = process.registerCallback(ctx); err != nil {\n\t\treturn nil, makeSystemError(computeSystem, operation, err, nil)\n\t}\n\tgo process.waitBackground()\n\n\treturn process, nil\n}\n\n// OpenProcess gets an interface to an existing process within the computeSystem.\nfunc (computeSystem *System) OpenProcess(ctx context.Context, pid int) (*Process, error) {\n\tcomputeSystem.handleLock.RLock()\n\tdefer computeSystem.handleLock.RUnlock()\n\n\toperation := \"hcs::System::OpenProcess\"\n\n\tif computeSystem.handle == 0 {\n\t\treturn nil, makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil)\n\t}\n\n\tprocessHandle, resultJSON, err := vmcompute.HcsOpenProcess(ctx, computeSystem.handle, uint32(pid))\n\tevents := processHcsResult(ctx, resultJSON)\n\tif err != nil {\n\t\treturn nil, makeSystemError(computeSystem, operation, err, events)\n\t}\n\n\tprocess := newProcess(processHandle, pid, computeSystem)\n\tif err = process.registerCallback(ctx); err != nil {\n\t\treturn nil, makeSystemError(computeSystem, operation, err, nil)\n\t}\n\tgo process.waitBackground()\n\n\treturn process, nil\n}\n\n// Close cleans up any state associated with the compute system but does not terminate or wait for it.\nfunc (computeSystem *System) Close() error {\n\treturn computeSystem.CloseCtx(context.Background())\n}\n\n// CloseCtx is similar to [System.Close], but accepts a context.\n//\n// The context is used for all operations, including waits, so timeouts/cancellations may prevent\n// proper system cleanup.\nfunc (computeSystem *System) CloseCtx(ctx context.Context) (err error) {\n\toperation := \"hcs::System::Close\"\n\tctx, span := oc.StartSpan(ctx, operation)\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"cid\", computeSystem.id))\n\n\tcomputeSystem.handleLock.Lock()\n\tdefer computeSystem.handleLock.Unlock()\n\n\t// Don't double free this\n\tif computeSystem.handle == 0 {\n\t\treturn nil\n\t}\n\n\tif err = computeSystem.unregisterCallback(ctx); err != nil {\n\t\treturn makeSystemError(computeSystem, operation, err, nil)\n\t}\n\n\terr = vmcompute.HcsCloseComputeSystem(ctx, computeSystem.handle)\n\tif err != nil {\n\t\treturn makeSystemError(computeSystem, operation, err, nil)\n\t}\n\n\tcomputeSystem.handle = 0\n\tcomputeSystem.closedWaitOnce.Do(func() {\n\t\tcomputeSystem.waitError = ErrAlreadyClosed\n\t\tclose(computeSystem.waitBlock)\n\t})\n\n\treturn nil\n}\n\nfunc (computeSystem *System) registerCallback(ctx context.Context) error {\n\tcallbackContext := &notificationWatcherContext{\n\t\tchannels: newSystemChannels(),\n\t\tsystemID: computeSystem.id,\n\t}\n\n\tcallbackMapLock.Lock()\n\tcallbackNumber := nextCallback\n\tnextCallback++\n\tcallbackMap[callbackNumber] = callbackContext\n\tcallbackMapLock.Unlock()\n\n\tcallbackHandle, err := vmcompute.HcsRegisterComputeSystemCallback(ctx, computeSystem.handle,\n\t\tnotificationWatcherCallback, callbackNumber)\n\tif err != nil {\n\t\treturn err\n\t}\n\tcallbackContext.handle = callbackHandle\n\tcomputeSystem.callbackNumber = callbackNumber\n\n\treturn nil\n}\n\nfunc (computeSystem *System) unregisterCallback(ctx context.Context) error {\n\tcallbackNumber := computeSystem.callbackNumber\n\n\tcallbackMapLock.RLock()\n\tcallbackContext := callbackMap[callbackNumber]\n\tcallbackMapLock.RUnlock()\n\n\tif callbackContext == nil {\n\t\treturn nil\n\t}\n\n\thandle := callbackContext.handle\n\n\tif handle == 0 {\n\t\treturn nil\n\t}\n\n\t// hcsUnregisterComputeSystemCallback has its own synchronization\n\t// to wait for all callbacks to complete. We must NOT hold the callbackMapLock.\n\terr := vmcompute.HcsUnregisterComputeSystemCallback(ctx, handle)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tcloseChannels(callbackContext.channels)\n\n\tcallbackMapLock.Lock()\n\tdelete(callbackMap, callbackNumber)\n\tcallbackMapLock.Unlock()\n\n\thandle = 0 //nolint:ineffassign\n\n\treturn nil\n}\n\n// Modify the System by sending a request to HCS\nfunc (computeSystem *System) Modify(ctx context.Context, config interface{}) error {\n\tcomputeSystem.handleLock.RLock()\n\tdefer computeSystem.handleLock.RUnlock()\n\n\toperation := \"hcs::System::Modify\"\n\n\tif computeSystem.handle == 0 {\n\t\treturn makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil)\n\t}\n\n\trequestBytes, err := json.Marshal(config)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\trequestJSON := string(requestBytes)\n\tresultJSON, err := vmcompute.HcsModifyComputeSystem(ctx, computeSystem.handle, requestJSON)\n\tevents := processHcsResult(ctx, resultJSON)\n\tif err != nil {\n\t\treturn makeSystemError(computeSystem, operation, err, events)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/utils.go",
    "content": "//go:build windows\n\npackage hcs\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"syscall\"\n\n\t\"github.com/Microsoft/go-winio\"\n\tdiskutil \"github.com/Microsoft/go-winio/vhd\"\n\t\"github.com/Microsoft/hcsshim/computestorage\"\n\t\"github.com/pkg/errors\"\n\t\"golang.org/x/sys/windows\"\n)\n\n// makeOpenFiles calls winio.NewOpenFile for each handle in a slice but closes all the handles\n// if there is an error.\nfunc makeOpenFiles(hs []syscall.Handle) (_ []io.ReadWriteCloser, err error) {\n\tfs := make([]io.ReadWriteCloser, len(hs))\n\tfor i, h := range hs {\n\t\tif h != syscall.Handle(0) {\n\t\t\tif err == nil {\n\t\t\t\tfs[i], err = winio.NewOpenFile(windows.Handle(h))\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\tsyscall.Close(h)\n\t\t\t}\n\t\t}\n\t}\n\tif err != nil {\n\t\tfor _, f := range fs {\n\t\t\tif f != nil {\n\t\t\t\tf.Close()\n\t\t\t}\n\t\t}\n\t\treturn nil, err\n\t}\n\treturn fs, nil\n}\n\n// CreateNTFSVHD creates a VHD formatted with NTFS of size `sizeGB` at the given `vhdPath`.\nfunc CreateNTFSVHD(ctx context.Context, vhdPath string, sizeGB uint32) (err error) {\n\tif err := diskutil.CreateVhdx(vhdPath, sizeGB, 1); err != nil {\n\t\treturn errors.Wrap(err, \"failed to create VHD\")\n\t}\n\n\tvhd, err := diskutil.OpenVirtualDisk(vhdPath, diskutil.VirtualDiskAccessNone, diskutil.OpenVirtualDiskFlagNone)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"failed to open VHD\")\n\t}\n\tdefer func() {\n\t\terr2 := windows.CloseHandle(windows.Handle(vhd))\n\t\tif err == nil {\n\t\t\terr = errors.Wrap(err2, \"failed to close VHD\")\n\t\t}\n\t}()\n\n\tif err := computestorage.FormatWritableLayerVhd(ctx, windows.Handle(vhd)); err != nil {\n\t\treturn errors.Wrap(err, \"failed to format VHD\")\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcs/waithelper.go",
    "content": "//go:build windows\n\npackage hcs\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/Microsoft/hcsshim/internal/log\"\n)\n\nfunc processAsyncHcsResult(\n\tctx context.Context,\n\terr error,\n\tresultJSON string,\n\tcallbackNumber uintptr,\n\texpectedNotification hcsNotification,\n\ttimeout *time.Duration,\n) ([]ErrorEvent, error) {\n\tevents := processHcsResult(ctx, resultJSON)\n\tif IsPending(err) {\n\t\treturn nil, waitForNotification(ctx, callbackNumber, expectedNotification, timeout)\n\t}\n\n\treturn events, err\n}\n\nfunc waitForNotification(\n\tctx context.Context,\n\tcallbackNumber uintptr,\n\texpectedNotification hcsNotification,\n\ttimeout *time.Duration,\n) error {\n\tcallbackMapLock.RLock()\n\tif _, ok := callbackMap[callbackNumber]; !ok {\n\t\tcallbackMapLock.RUnlock()\n\t\tlog.G(ctx).WithField(\"callbackNumber\", callbackNumber).Error(\"failed to waitForNotification: callbackNumber does not exist in callbackMap\")\n\t\treturn ErrHandleClose\n\t}\n\tchannels := callbackMap[callbackNumber].channels\n\tcallbackMapLock.RUnlock()\n\n\texpectedChannel := channels[expectedNotification]\n\tif expectedChannel == nil {\n\t\tlog.G(ctx).WithField(\"type\", expectedNotification).Error(\"unknown notification type in waitForNotification\")\n\t\treturn ErrInvalidNotificationType\n\t}\n\n\tvar c <-chan time.Time\n\tif timeout != nil {\n\t\ttimer := time.NewTimer(*timeout)\n\t\tc = timer.C\n\t\tdefer timer.Stop()\n\t}\n\n\tselect {\n\tcase err, ok := <-expectedChannel:\n\t\tif !ok {\n\t\t\treturn ErrHandleClose\n\t\t}\n\t\treturn err\n\tcase err, ok := <-channels[hcsNotificationSystemExited]:\n\t\tif !ok {\n\t\t\treturn ErrHandleClose\n\t\t}\n\t\t// If the expected notification is hcsNotificationSystemExited which of the two selects\n\t\t// chosen is random. Return the raw error if hcsNotificationSystemExited is expected\n\t\tif channels[hcsNotificationSystemExited] == expectedChannel {\n\t\t\treturn err\n\t\t}\n\t\treturn ErrUnexpectedContainerExit\n\tcase _, ok := <-channels[hcsNotificationServiceDisconnect]:\n\t\tif !ok {\n\t\t\treturn ErrHandleClose\n\t\t}\n\t\t// hcsNotificationServiceDisconnect should never be an expected notification\n\t\t// it does not need the same handling as hcsNotificationSystemExited\n\t\treturn ErrUnexpectedProcessAbort\n\tcase <-c:\n\t\treturn ErrTimeout\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcserror/doc.go",
    "content": "package hcserror\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hcserror/hcserror.go",
    "content": "//go:build windows\n\npackage hcserror\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\ntype HcsError struct {\n\ttitle string\n\trest  string\n\tErr   error\n}\n\nfunc (e *HcsError) Error() string {\n\ts := e.title\n\tif len(s) > 0 && s[len(s)-1] != ' ' {\n\t\ts += \" \"\n\t}\n\ts += fmt.Sprintf(\"failed in Win32: %s (0x%x)\", e.Err, Win32FromError(e.Err))\n\tif e.rest != \"\" {\n\t\tif e.rest[0] != ' ' {\n\t\t\ts += \" \"\n\t\t}\n\t\ts += e.rest\n\t}\n\treturn s\n}\n\nfunc New(err error, title, rest string) error {\n\t// Pass through DLL errors directly since they do not originate from HCS.\n\tvar e *windows.DLLError\n\tif errors.As(err, &e) {\n\t\treturn err\n\t}\n\treturn &HcsError{title, rest, err}\n}\n\nfunc Win32FromError(err error) uint32 {\n\tvar herr *HcsError\n\tif errors.As(err, &herr) {\n\t\treturn Win32FromError(herr.Err)\n\t}\n\tvar code windows.Errno\n\tif errors.As(err, &code) {\n\t\treturn uint32(code)\n\t}\n\treturn uint32(windows.ERROR_GEN_FAILURE)\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hns/doc.go",
    "content": "package hns\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hns/hns.go",
    "content": "package hns\n\nimport \"fmt\"\n\n//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go hns.go\n\n//sys _hnsCall(method string, path string, object string, response **uint16) (hr error) = vmcompute.HNSCall?\n\ntype EndpointNotFoundError struct {\n\tEndpointName string\n}\n\nfunc (e EndpointNotFoundError) Error() string {\n\treturn fmt.Sprintf(\"Endpoint %s not found\", e.EndpointName)\n}\n\ntype NetworkNotFoundError struct {\n\tNetworkName string\n}\n\nfunc (e NetworkNotFoundError) Error() string {\n\treturn fmt.Sprintf(\"Network %s not found\", e.NetworkName)\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hns/hnsaccelnet.go",
    "content": "//go:build windows\n\npackage hns\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/sirupsen/logrus\"\n)\n\n// HNSNnvManagementMacAddress represents management mac address\n// which needs to be excluded from VF reassignment\ntype HNSNnvManagementMacAddress struct {\n\tMacAddress string `json:\",omitempty\"`\n}\n\n// HNSNnvManagementMacList represents a list of management\n// mac addresses for exclusion from VF reassignment\ntype HNSNnvManagementMacList struct {\n\tMacAddressList []HNSNnvManagementMacAddress `json:\",omitempty\"`\n}\n\n// HNSNnvManagementMacRequest makes a HNS call to modify/query NnvManagementMacList\nfunc HNSNnvManagementMacRequest(method, path, request string) (*HNSNnvManagementMacList, error) {\n\tnnvManagementMacList := &HNSNnvManagementMacList{}\n\terr := hnsCall(method, \"/accelnet/\"+path, request, &nnvManagementMacList)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn nnvManagementMacList, nil\n}\n\n// Set ManagementMacAddressList by sending \"POST\" NnvManagementMacRequest to HNS.\nfunc (nnvManagementMacList *HNSNnvManagementMacList) Set() (*HNSNnvManagementMacList, error) {\n\toperation := \"Set\"\n\ttitle := \"hcsshim::nnvManagementMacList::\" + operation\n\tlogrus.Debugf(title+\" id=%s\", nnvManagementMacList.MacAddressList)\n\n\tjsonString, err := json.Marshal(nnvManagementMacList)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn HNSNnvManagementMacRequest(\"POST\", \"\", string(jsonString))\n}\n\n// Get ManagementMacAddressList by sending \"GET\" NnvManagementMacRequest to HNS.\nfunc GetNnvManagementMacAddressList() (*HNSNnvManagementMacList, error) {\n\toperation := \"Get\"\n\ttitle := \"hcsshim::nnvManagementMacList::\" + operation\n\tlogrus.Debug(title)\n\treturn HNSNnvManagementMacRequest(\"GET\", \"\", \"\")\n}\n\n// Delete ManagementMacAddressList by sending \"DELETE\" NnvManagementMacRequest to HNS.\nfunc DeleteNnvManagementMacAddressList() (*HNSNnvManagementMacList, error) {\n\toperation := \"Delete\"\n\ttitle := \"hcsshim::nnvManagementMacList::\" + operation\n\tlogrus.Debug(title)\n\treturn HNSNnvManagementMacRequest(\"DELETE\", \"\", \"\")\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hns/hnsendpoint.go",
    "content": "//go:build windows\n\npackage hns\n\nimport (\n\t\"encoding/json\"\n\t\"net\"\n\t\"strings\"\n\n\t\"github.com/sirupsen/logrus\"\n)\n\n// EndpointState represents the states of an HNS Endpoint lifecycle.\ntype EndpointState uint16\n\n// EndpointState const\n// The lifecycle of an Endpoint goes through created, attached, AttachedSharing - endpoint is being shared with other containers,\n// detached, after being attached, degraded and finally destroyed.\n// Note: This attribute is used by calico to define stale containers and is dependent on HNS v1 api, if we move to HNS v2 api we will need\n// to update the current calico code and cordinate the change with calico. Reach out to Microsoft to facilate the change via HNS.\nconst (\n\tUninitialized   EndpointState = iota\n\tCreated         EndpointState = 1\n\tAttached        EndpointState = 2\n\tAttachedSharing EndpointState = 3\n\tDetached        EndpointState = 4\n\tDegraded        EndpointState = 5\n\tDestroyed       EndpointState = 6\n)\n\nfunc (es EndpointState) String() string {\n\treturn [...]string{\"Uninitialized\", \"Created\", \"Attached\", \"AttachedSharing\", \"Detached\", \"Degraded\", \"Destroyed\"}[es]\n}\n\n// HNSEndpoint represents a network endpoint in HNS\ntype HNSEndpoint struct {\n\tId                 string            `json:\"ID,omitempty\"`\n\tName               string            `json:\",omitempty\"`\n\tVirtualNetwork     string            `json:\",omitempty\"`\n\tVirtualNetworkName string            `json:\",omitempty\"`\n\tPolicies           []json.RawMessage `json:\",omitempty\"`\n\tMacAddress         string            `json:\",omitempty\"`\n\tIPAddress          net.IP            `json:\",omitempty\"`\n\tIPv6Address        net.IP            `json:\",omitempty\"`\n\tDNSSuffix          string            `json:\",omitempty\"`\n\tDNSServerList      string            `json:\",omitempty\"`\n\tDNSDomain          string            `json:\",omitempty\"`\n\tGatewayAddress     string            `json:\",omitempty\"`\n\tGatewayAddressV6   string            `json:\",omitempty\"`\n\tEnableInternalDNS  bool              `json:\",omitempty\"`\n\tDisableICC         bool              `json:\",omitempty\"`\n\tPrefixLength       uint8             `json:\",omitempty\"`\n\tIPv6PrefixLength   uint8             `json:\",omitempty\"`\n\tIsRemoteEndpoint   bool              `json:\",omitempty\"`\n\tEnableLowMetric    bool              `json:\",omitempty\"`\n\tNamespace          *Namespace        `json:\",omitempty\"`\n\tEncapOverhead      uint16            `json:\",omitempty\"`\n\tSharedContainers   []string          `json:\",omitempty\"`\n\tState              EndpointState     `json:\",omitempty\"`\n}\n\n// SystemType represents the type of the system on which actions are done\ntype SystemType string\n\n// SystemType const\nconst (\n\tContainerType      SystemType = \"Container\"\n\tVirtualMachineType SystemType = \"VirtualMachine\"\n\tHostType           SystemType = \"Host\"\n)\n\n// EndpointAttachDetachRequest is the structure used to send request to the container to modify the system\n// Supported resource types are Network and Request Types are Add/Remove\ntype EndpointAttachDetachRequest struct {\n\tContainerID    string     `json:\"ContainerId,omitempty\"`\n\tSystemType     SystemType `json:\"SystemType\"`\n\tCompartmentID  uint16     `json:\"CompartmentId,omitempty\"`\n\tVirtualNICName string     `json:\"VirtualNicName,omitempty\"`\n}\n\n// EndpointResquestResponse is object to get the endpoint request response\ntype EndpointResquestResponse struct {\n\tSuccess bool\n\tError   string\n}\n\n// EndpointStats is the object that has stats for a given endpoint\ntype EndpointStats struct {\n\tBytesReceived          uint64 `json:\"BytesReceived\"`\n\tBytesSent              uint64 `json:\"BytesSent\"`\n\tDroppedPacketsIncoming uint64 `json:\"DroppedPacketsIncoming\"`\n\tDroppedPacketsOutgoing uint64 `json:\"DroppedPacketsOutgoing\"`\n\tEndpointID             string `json:\"EndpointId\"`\n\tInstanceID             string `json:\"InstanceId\"`\n\tPacketsReceived        uint64 `json:\"PacketsReceived\"`\n\tPacketsSent            uint64 `json:\"PacketsSent\"`\n}\n\n// HNSEndpointRequest makes a HNS call to modify/query a network endpoint\nfunc HNSEndpointRequest(method, path, request string) (*HNSEndpoint, error) {\n\tendpoint := &HNSEndpoint{}\n\terr := hnsCall(method, \"/endpoints/\"+path, request, &endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn endpoint, nil\n}\n\n// HNSListEndpointRequest makes a HNS call to query the list of available endpoints\nfunc HNSListEndpointRequest() ([]HNSEndpoint, error) {\n\tvar endpoint []HNSEndpoint\n\terr := hnsCall(\"GET\", \"/endpoints/\", \"\", &endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn endpoint, nil\n}\n\n// hnsEndpointStatsRequest makes a HNS call to query the stats for a given endpoint ID\nfunc hnsEndpointStatsRequest(id string) (*EndpointStats, error) {\n\tvar stats EndpointStats\n\terr := hnsCall(\"GET\", \"/endpointstats/\"+id, \"\", &stats)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &stats, nil\n}\n\n// GetHNSEndpointByID get the Endpoint by ID\nfunc GetHNSEndpointByID(endpointID string) (*HNSEndpoint, error) {\n\treturn HNSEndpointRequest(\"GET\", endpointID, \"\")\n}\n\n// GetHNSEndpointStats get the stats for a n Endpoint by ID\nfunc GetHNSEndpointStats(endpointID string) (*EndpointStats, error) {\n\treturn hnsEndpointStatsRequest(endpointID)\n}\n\n// GetHNSEndpointByName gets the endpoint filtered by Name\nfunc GetHNSEndpointByName(endpointName string) (*HNSEndpoint, error) {\n\thnsResponse, err := HNSListEndpointRequest()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfor _, hnsEndpoint := range hnsResponse {\n\t\tif hnsEndpoint.Name == endpointName {\n\t\t\treturn &hnsEndpoint, nil\n\t\t}\n\t}\n\treturn nil, EndpointNotFoundError{EndpointName: endpointName}\n}\n\ntype endpointAttachInfo struct {\n\tSharedContainers json.RawMessage `json:\",omitempty\"`\n}\n\nfunc (endpoint *HNSEndpoint) IsAttached(vID string) (bool, error) {\n\tattachInfo := endpointAttachInfo{}\n\terr := hnsCall(\"GET\", \"/endpoints/\"+endpoint.Id, \"\", &attachInfo)\n\n\t// Return false allows us to just return the err\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\tif strings.Contains(strings.ToLower(string(attachInfo.SharedContainers)), strings.ToLower(vID)) {\n\t\treturn true, nil\n\t}\n\n\treturn false, nil\n}\n\n// Create Endpoint by sending EndpointRequest to HNS. TODO: Create a separate HNS interface to place all these methods\nfunc (endpoint *HNSEndpoint) Create() (*HNSEndpoint, error) {\n\toperation := \"Create\"\n\ttitle := \"hcsshim::HNSEndpoint::\" + operation\n\tlogrus.Debugf(title+\" id=%s\", endpoint.Id)\n\n\tjsonString, err := json.Marshal(endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn HNSEndpointRequest(\"POST\", \"\", string(jsonString))\n}\n\n// Delete Endpoint by sending EndpointRequest to HNS\nfunc (endpoint *HNSEndpoint) Delete() (*HNSEndpoint, error) {\n\toperation := \"Delete\"\n\ttitle := \"hcsshim::HNSEndpoint::\" + operation\n\tlogrus.Debugf(title+\" id=%s\", endpoint.Id)\n\n\treturn HNSEndpointRequest(\"DELETE\", endpoint.Id, \"\")\n}\n\n// Update Endpoint\nfunc (endpoint *HNSEndpoint) Update() (*HNSEndpoint, error) {\n\toperation := \"Update\"\n\ttitle := \"hcsshim::HNSEndpoint::\" + operation\n\tlogrus.Debugf(title+\" id=%s\", endpoint.Id)\n\tjsonString, err := json.Marshal(endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = hnsCall(\"POST\", \"/endpoints/\"+endpoint.Id, string(jsonString), &endpoint)\n\n\treturn endpoint, err\n}\n\n// ApplyACLPolicy applies a set of ACL Policies on the Endpoint\nfunc (endpoint *HNSEndpoint) ApplyACLPolicy(policies ...*ACLPolicy) error {\n\toperation := \"ApplyACLPolicy\"\n\ttitle := \"hcsshim::HNSEndpoint::\" + operation\n\tlogrus.Debugf(title+\" id=%s\", endpoint.Id)\n\n\tfor _, policy := range policies {\n\t\tif policy == nil {\n\t\t\tcontinue\n\t\t}\n\t\tjsonString, err := json.Marshal(policy)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tendpoint.Policies = append(endpoint.Policies, jsonString)\n\t}\n\n\t_, err := endpoint.Update()\n\treturn err\n}\n\n// ApplyProxyPolicy applies a set of Proxy Policies on the Endpoint\nfunc (endpoint *HNSEndpoint) ApplyProxyPolicy(policies ...*ProxyPolicy) error {\n\toperation := \"ApplyProxyPolicy\"\n\ttitle := \"hcsshim::HNSEndpoint::\" + operation\n\tlogrus.Debugf(title+\" id=%s\", endpoint.Id)\n\n\tfor _, policy := range policies {\n\t\tif policy == nil {\n\t\t\tcontinue\n\t\t}\n\t\tjsonString, err := json.Marshal(policy)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tendpoint.Policies = append(endpoint.Policies, jsonString)\n\t}\n\n\t_, err := endpoint.Update()\n\treturn err\n}\n\n// ContainerAttach attaches an endpoint to container\nfunc (endpoint *HNSEndpoint) ContainerAttach(containerID string, compartmentID uint16) error {\n\toperation := \"ContainerAttach\"\n\ttitle := \"hcsshim::HNSEndpoint::\" + operation\n\tlogrus.Debugf(title+\" id=%s\", endpoint.Id)\n\n\trequestMessage := &EndpointAttachDetachRequest{\n\t\tContainerID:   containerID,\n\t\tCompartmentID: compartmentID,\n\t\tSystemType:    ContainerType,\n\t}\n\tresponse := &EndpointResquestResponse{}\n\tjsonString, err := json.Marshal(requestMessage)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn hnsCall(\"POST\", \"/endpoints/\"+endpoint.Id+\"/attach\", string(jsonString), &response)\n}\n\n// ContainerDetach detaches an endpoint from container\nfunc (endpoint *HNSEndpoint) ContainerDetach(containerID string) error {\n\toperation := \"ContainerDetach\"\n\ttitle := \"hcsshim::HNSEndpoint::\" + operation\n\tlogrus.Debugf(title+\" id=%s\", endpoint.Id)\n\n\trequestMessage := &EndpointAttachDetachRequest{\n\t\tContainerID: containerID,\n\t\tSystemType:  ContainerType,\n\t}\n\tresponse := &EndpointResquestResponse{}\n\n\tjsonString, err := json.Marshal(requestMessage)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn hnsCall(\"POST\", \"/endpoints/\"+endpoint.Id+\"/detach\", string(jsonString), &response)\n}\n\n// HostAttach attaches a nic on the host\nfunc (endpoint *HNSEndpoint) HostAttach(compartmentID uint16) error {\n\toperation := \"HostAttach\"\n\ttitle := \"hcsshim::HNSEndpoint::\" + operation\n\tlogrus.Debugf(title+\" id=%s\", endpoint.Id)\n\trequestMessage := &EndpointAttachDetachRequest{\n\t\tCompartmentID: compartmentID,\n\t\tSystemType:    HostType,\n\t}\n\tresponse := &EndpointResquestResponse{}\n\n\tjsonString, err := json.Marshal(requestMessage)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn hnsCall(\"POST\", \"/endpoints/\"+endpoint.Id+\"/attach\", string(jsonString), &response)\n}\n\n// HostDetach detaches a nic on the host\nfunc (endpoint *HNSEndpoint) HostDetach() error {\n\toperation := \"HostDetach\"\n\ttitle := \"hcsshim::HNSEndpoint::\" + operation\n\tlogrus.Debugf(title+\" id=%s\", endpoint.Id)\n\trequestMessage := &EndpointAttachDetachRequest{\n\t\tSystemType: HostType,\n\t}\n\tresponse := &EndpointResquestResponse{}\n\n\tjsonString, err := json.Marshal(requestMessage)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn hnsCall(\"POST\", \"/endpoints/\"+endpoint.Id+\"/detach\", string(jsonString), &response)\n}\n\n// VirtualMachineNICAttach attaches a endpoint to a virtual machine\nfunc (endpoint *HNSEndpoint) VirtualMachineNICAttach(virtualMachineNICName string) error {\n\toperation := \"VirtualMachineNicAttach\"\n\ttitle := \"hcsshim::HNSEndpoint::\" + operation\n\tlogrus.Debugf(title+\" id=%s\", endpoint.Id)\n\trequestMessage := &EndpointAttachDetachRequest{\n\t\tVirtualNICName: virtualMachineNICName,\n\t\tSystemType:     VirtualMachineType,\n\t}\n\tresponse := &EndpointResquestResponse{}\n\n\tjsonString, err := json.Marshal(requestMessage)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn hnsCall(\"POST\", \"/endpoints/\"+endpoint.Id+\"/attach\", string(jsonString), &response)\n}\n\n// VirtualMachineNICDetach detaches a endpoint  from a virtual machine\nfunc (endpoint *HNSEndpoint) VirtualMachineNICDetach() error {\n\toperation := \"VirtualMachineNicDetach\"\n\ttitle := \"hcsshim::HNSEndpoint::\" + operation\n\tlogrus.Debugf(title+\" id=%s\", endpoint.Id)\n\n\trequestMessage := &EndpointAttachDetachRequest{\n\t\tSystemType: VirtualMachineType,\n\t}\n\tresponse := &EndpointResquestResponse{}\n\n\tjsonString, err := json.Marshal(requestMessage)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn hnsCall(\"POST\", \"/endpoints/\"+endpoint.Id+\"/detach\", string(jsonString), &response)\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hns/hnsfuncs.go",
    "content": "//go:build windows\n\npackage hns\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n\t\"github.com/Microsoft/hcsshim/internal/interop\"\n\t\"github.com/sirupsen/logrus\"\n)\n\nfunc hnsCallRawResponse(method, path, request string) (*hnsResponse, error) {\n\tvar responseBuffer *uint16\n\tlogrus.Debugf(\"[%s]=>[%s] Request : %s\", method, path, request)\n\n\terr := _hnsCall(method, path, request, &responseBuffer)\n\tif err != nil {\n\t\treturn nil, hcserror.New(err, \"hnsCall \", \"\")\n\t}\n\tresponse := interop.ConvertAndFreeCoTaskMemString(responseBuffer)\n\n\thnsresponse := &hnsResponse{}\n\tif err = json.Unmarshal([]byte(response), &hnsresponse); err != nil {\n\t\treturn nil, err\n\t}\n\treturn hnsresponse, nil\n}\n\nfunc hnsCall(method, path, request string, returnResponse interface{}) error {\n\thnsresponse, err := hnsCallRawResponse(method, path, request)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed during hnsCallRawResponse: %w\", err)\n\t}\n\tif !hnsresponse.Success {\n\t\treturn fmt.Errorf(\"hns failed with error : %s\", hnsresponse.Error)\n\t}\n\n\tif len(hnsresponse.Output) == 0 {\n\t\treturn nil\n\t}\n\n\tlogrus.Debugf(\"Network Response : %s\", hnsresponse.Output)\n\terr = json.Unmarshal(hnsresponse.Output, returnResponse)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hns/hnsglobals.go",
    "content": "//go:build windows\n\npackage hns\n\ntype HNSGlobals struct {\n\tVersion HNSVersion `json:\"Version\"`\n}\n\ntype HNSVersion struct {\n\tMajor int `json:\"Major\"`\n\tMinor int `json:\"Minor\"`\n}\n\nvar (\n\tHNSVersion1803 = HNSVersion{Major: 7, Minor: 2}\n)\n\nfunc GetHNSGlobals() (*HNSGlobals, error) {\n\tvar version HNSVersion\n\terr := hnsCall(\"GET\", \"/globals/version\", \"\", &version)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tglobals := &HNSGlobals{\n\t\tVersion: version,\n\t}\n\n\treturn globals, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hns/hnsnetwork.go",
    "content": "//go:build windows\n\npackage hns\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"net\"\n\n\t\"github.com/sirupsen/logrus\"\n)\n\n// Subnet is associated with a network and represents a list\n// of subnets available to the network\ntype Subnet struct {\n\tAddressPrefix  string            `json:\",omitempty\"`\n\tGatewayAddress string            `json:\",omitempty\"`\n\tPolicies       []json.RawMessage `json:\",omitempty\"`\n}\n\n// MacPool is associated with a network and represents a list\n// of macaddresses available to the network\ntype MacPool struct {\n\tStartMacAddress string `json:\",omitempty\"`\n\tEndMacAddress   string `json:\",omitempty\"`\n}\n\n// HNSNetwork represents a network in HNS\ntype HNSNetwork struct {\n\tId                   string            `json:\"ID,omitempty\"`\n\tName                 string            `json:\",omitempty\"`\n\tType                 string            `json:\",omitempty\"`\n\tNetworkAdapterName   string            `json:\",omitempty\"`\n\tSourceMac            string            `json:\",omitempty\"`\n\tPolicies             []json.RawMessage `json:\",omitempty\"`\n\tMacPools             []MacPool         `json:\",omitempty\"`\n\tSubnets              []Subnet          `json:\",omitempty\"`\n\tDNSSuffix            string            `json:\",omitempty\"`\n\tDNSServerList        string            `json:\",omitempty\"`\n\tDNSServerCompartment uint32            `json:\",omitempty\"`\n\tManagementIP         string            `json:\",omitempty\"`\n\tAutomaticDNS         bool              `json:\",omitempty\"`\n}\n\ntype hnsResponse struct {\n\tSuccess bool\n\tError   string\n\tOutput  json.RawMessage\n}\n\n// HNSNetworkRequest makes a call into HNS to update/query a single network\nfunc HNSNetworkRequest(method, path, request string) (*HNSNetwork, error) {\n\tvar network HNSNetwork\n\terr := hnsCall(method, \"/networks/\"+path, request, &network)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &network, nil\n}\n\n// HNSListNetworkRequest makes a HNS call to query the list of available networks\nfunc HNSListNetworkRequest(method, path, request string) ([]HNSNetwork, error) {\n\tvar network []HNSNetwork\n\terr := hnsCall(method, \"/networks/\"+path, request, &network)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn network, nil\n}\n\n// GetHNSNetworkByID\nfunc GetHNSNetworkByID(networkID string) (*HNSNetwork, error) {\n\treturn HNSNetworkRequest(\"GET\", networkID, \"\")\n}\n\n// GetHNSNetworkName filtered by Name\nfunc GetHNSNetworkByName(networkName string) (*HNSNetwork, error) {\n\thsnnetworks, err := HNSListNetworkRequest(\"GET\", \"\", \"\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfor _, hnsnetwork := range hsnnetworks {\n\t\tif hnsnetwork.Name == networkName {\n\t\t\treturn &hnsnetwork, nil\n\t\t}\n\t}\n\treturn nil, NetworkNotFoundError{NetworkName: networkName}\n}\n\n// Create Network by sending NetworkRequest to HNS.\nfunc (network *HNSNetwork) Create() (*HNSNetwork, error) {\n\toperation := \"Create\"\n\ttitle := \"hcsshim::HNSNetwork::\" + operation\n\tlogrus.Debugf(title+\" id=%s\", network.Id)\n\n\tfor _, subnet := range network.Subnets {\n\t\tif (subnet.AddressPrefix != \"\") && (subnet.GatewayAddress == \"\") {\n\t\t\treturn nil, errors.New(\"network create error, subnet has address prefix but no gateway specified\")\n\t\t}\n\t}\n\n\tjsonString, err := json.Marshal(network)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn HNSNetworkRequest(\"POST\", \"\", string(jsonString))\n}\n\n// Delete Network by sending NetworkRequest to HNS\nfunc (network *HNSNetwork) Delete() (*HNSNetwork, error) {\n\toperation := \"Delete\"\n\ttitle := \"hcsshim::HNSNetwork::\" + operation\n\tlogrus.Debugf(title+\" id=%s\", network.Id)\n\n\treturn HNSNetworkRequest(\"DELETE\", network.Id, \"\")\n}\n\n// Creates an endpoint on the Network.\nfunc (network *HNSNetwork) NewEndpoint(ipAddress net.IP, macAddress net.HardwareAddr) *HNSEndpoint {\n\treturn &HNSEndpoint{\n\t\tVirtualNetwork: network.Id,\n\t\tIPAddress:      ipAddress,\n\t\tMacAddress:     string(macAddress),\n\t}\n}\n\nfunc (network *HNSNetwork) CreateEndpoint(endpoint *HNSEndpoint) (*HNSEndpoint, error) {\n\toperation := \"CreateEndpoint\"\n\ttitle := \"hcsshim::HNSNetwork::\" + operation\n\tlogrus.Debugf(title+\" id=%s, endpointId=%s\", network.Id, endpoint.Id)\n\n\tendpoint.VirtualNetwork = network.Id\n\treturn endpoint.Create()\n}\n\nfunc (network *HNSNetwork) CreateRemoteEndpoint(endpoint *HNSEndpoint) (*HNSEndpoint, error) {\n\toperation := \"CreateRemoteEndpoint\"\n\ttitle := \"hcsshim::HNSNetwork::\" + operation\n\tlogrus.Debugf(title+\" id=%s\", network.Id)\n\tendpoint.IsRemoteEndpoint = true\n\treturn network.CreateEndpoint(endpoint)\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go",
    "content": "package hns\n\n// Type of Request Support in ModifySystem\ntype PolicyType string\n\n// RequestType const\nconst (\n\tNat                  PolicyType = \"NAT\"\n\tACL                  PolicyType = \"ACL\"\n\tPA                   PolicyType = \"PA\"\n\tVLAN                 PolicyType = \"VLAN\"\n\tVSID                 PolicyType = \"VSID\"\n\tVNet                 PolicyType = \"VNET\"\n\tL2Driver             PolicyType = \"L2Driver\"\n\tIsolation            PolicyType = \"Isolation\"\n\tQOS                  PolicyType = \"QOS\"\n\tOutboundNat          PolicyType = \"OutBoundNAT\"\n\tExternalLoadBalancer PolicyType = \"ELB\"\n\tRoute                PolicyType = \"ROUTE\"\n\tProxy                PolicyType = \"PROXY\"\n)\n\ntype NatPolicy struct {\n\tType                 PolicyType `json:\"Type\"`\n\tProtocol             string     `json:\",omitempty\"`\n\tInternalPort         uint16     `json:\",omitempty\"`\n\tExternalPort         uint16     `json:\",omitempty\"`\n\tExternalPortReserved bool       `json:\",omitempty\"`\n}\n\ntype QosPolicy struct {\n\tType                            PolicyType `json:\"Type\"`\n\tMaximumOutgoingBandwidthInBytes uint64\n}\n\ntype IsolationPolicy struct {\n\tType               PolicyType `json:\"Type\"`\n\tVLAN               uint\n\tVSID               uint\n\tInDefaultIsolation bool\n}\n\ntype VlanPolicy struct {\n\tType PolicyType `json:\"Type\"`\n\tVLAN uint\n}\n\ntype VsidPolicy struct {\n\tType PolicyType `json:\"Type\"`\n\tVSID uint\n}\n\ntype PaPolicy struct {\n\tType PolicyType `json:\"Type\"`\n\tPA   string     `json:\"PA\"`\n}\n\ntype OutboundNatPolicy struct {\n\tPolicy\n\tVIP              string   `json:\"VIP,omitempty\"`\n\tExceptions       []string `json:\"ExceptionList,omitempty\"`\n\tDestinations     []string `json:\",omitempty\"`\n\tMaxPortPoolUsage uint16   `json:\",omitempty\"`\n}\n\ntype ProxyPolicy struct {\n\tType          PolicyType `json:\"Type\"`\n\tIP            string     `json:\",omitempty\"`\n\tPort          string     `json:\",omitempty\"`\n\tExceptionList []string   `json:\",omitempty\"`\n\tDestination   string     `json:\",omitempty\"`\n\tOutboundNat   bool       `json:\",omitempty\"`\n}\n\ntype ActionType string\ntype DirectionType string\ntype RuleType string\n\nconst (\n\tAllow ActionType = \"Allow\"\n\tBlock ActionType = \"Block\"\n\n\tIn  DirectionType = \"In\"\n\tOut DirectionType = \"Out\"\n\n\tHost   RuleType = \"Host\"\n\tSwitch RuleType = \"Switch\"\n)\n\ntype ACLPolicy struct {\n\tType            PolicyType `json:\"Type\"`\n\tId              string     `json:\"Id,omitempty\"`\n\tProtocol        uint16     `json:\",omitempty\"`\n\tProtocols       string     `json:\"Protocols,omitempty\"`\n\tInternalPort    uint16     `json:\",omitempty\"`\n\tAction          ActionType\n\tDirection       DirectionType\n\tLocalAddresses  string   `json:\",omitempty\"`\n\tRemoteAddresses string   `json:\",omitempty\"`\n\tLocalPorts      string   `json:\"LocalPorts,omitempty\"`\n\tLocalPort       uint16   `json:\",omitempty\"`\n\tRemotePorts     string   `json:\"RemotePorts,omitempty\"`\n\tRemotePort      uint16   `json:\",omitempty\"`\n\tRuleType        RuleType `json:\"RuleType,omitempty\"`\n\tPriority        uint16   `json:\",omitempty\"`\n\tServiceName     string   `json:\",omitempty\"`\n}\n\ntype Policy struct {\n\tType PolicyType `json:\"Type\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicylist.go",
    "content": "//go:build windows\n\npackage hns\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/sirupsen/logrus\"\n)\n\n// RoutePolicy is a structure defining schema for Route based Policy\ntype RoutePolicy struct {\n\tPolicy\n\tDestinationPrefix string `json:\"DestinationPrefix,omitempty\"`\n\tNextHop           string `json:\"NextHop,omitempty\"`\n\tEncapEnabled      bool   `json:\"NeedEncap,omitempty\"`\n}\n\n// ELBPolicy is a structure defining schema for ELB LoadBalancing based Policy\ntype ELBPolicy struct {\n\tLBPolicy\n\tSourceVIP string   `json:\"SourceVIP,omitempty\"`\n\tVIPs      []string `json:\"VIPs,omitempty\"`\n\tILB       bool     `json:\"ILB,omitempty\"`\n\tDSR       bool     `json:\"IsDSR,omitempty\"`\n}\n\n// LBPolicy is a structure defining schema for LoadBalancing based Policy\ntype LBPolicy struct {\n\tPolicy\n\tProtocol     uint16 `json:\"Protocol,omitempty\"`\n\tInternalPort uint16\n\tExternalPort uint16\n}\n\n// PolicyList is a structure defining schema for Policy list request\ntype PolicyList struct {\n\tID                 string            `json:\"ID,omitempty\"`\n\tEndpointReferences []string          `json:\"References,omitempty\"`\n\tPolicies           []json.RawMessage `json:\"Policies,omitempty\"`\n}\n\n// HNSPolicyListRequest makes a call into HNS to update/query a single network\nfunc HNSPolicyListRequest(method, path, request string) (*PolicyList, error) {\n\tvar policy PolicyList\n\terr := hnsCall(method, \"/policylists/\"+path, request, &policy)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &policy, nil\n}\n\n// HNSListPolicyListRequest gets all the policy list\nfunc HNSListPolicyListRequest() ([]PolicyList, error) {\n\tvar plist []PolicyList\n\terr := hnsCall(\"GET\", \"/policylists/\", \"\", &plist)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn plist, nil\n}\n\n// PolicyListRequest makes a HNS call to modify/query a network policy list\nfunc PolicyListRequest(method, path, request string) (*PolicyList, error) {\n\tpolicylist := &PolicyList{}\n\terr := hnsCall(method, \"/policylists/\"+path, request, &policylist)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn policylist, nil\n}\n\n// GetPolicyListByID get the policy list by ID\nfunc GetPolicyListByID(policyListID string) (*PolicyList, error) {\n\treturn PolicyListRequest(\"GET\", policyListID, \"\")\n}\n\n// Create PolicyList by sending PolicyListRequest to HNS.\nfunc (policylist *PolicyList) Create() (*PolicyList, error) {\n\toperation := \"Create\"\n\ttitle := \"hcsshim::PolicyList::\" + operation\n\tlogrus.Debugf(title+\" id=%s\", policylist.ID)\n\tjsonString, err := json.Marshal(policylist)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn PolicyListRequest(\"POST\", \"\", string(jsonString))\n}\n\n// Delete deletes PolicyList\nfunc (policylist *PolicyList) Delete() (*PolicyList, error) {\n\toperation := \"Delete\"\n\ttitle := \"hcsshim::PolicyList::\" + operation\n\tlogrus.Debugf(title+\" id=%s\", policylist.ID)\n\n\treturn PolicyListRequest(\"DELETE\", policylist.ID, \"\")\n}\n\n// AddEndpoint add an endpoint to a Policy List\nfunc (policylist *PolicyList) AddEndpoint(endpoint *HNSEndpoint) (*PolicyList, error) {\n\toperation := \"AddEndpoint\"\n\ttitle := \"hcsshim::PolicyList::\" + operation\n\tlogrus.Debugf(title+\" id=%s, endpointId:%s\", policylist.ID, endpoint.Id)\n\n\t_, err := policylist.Delete()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Add Endpoint to the Existing List\n\tpolicylist.EndpointReferences = append(policylist.EndpointReferences, \"/endpoints/\"+endpoint.Id)\n\n\treturn policylist.Create()\n}\n\n// RemoveEndpoint removes an endpoint from the Policy List\nfunc (policylist *PolicyList) RemoveEndpoint(endpoint *HNSEndpoint) (*PolicyList, error) {\n\toperation := \"RemoveEndpoint\"\n\ttitle := \"hcsshim::PolicyList::\" + operation\n\tlogrus.Debugf(title+\" id=%s, endpointId:%s\", policylist.ID, endpoint.Id)\n\n\t_, err := policylist.Delete()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\telementToRemove := \"/endpoints/\" + endpoint.Id\n\n\tvar references []string\n\n\tfor _, endpointReference := range policylist.EndpointReferences {\n\t\tif endpointReference == elementToRemove {\n\t\t\tcontinue\n\t\t}\n\t\treferences = append(references, endpointReference)\n\t}\n\tpolicylist.EndpointReferences = references\n\treturn policylist.Create()\n}\n\n// AddLoadBalancer policy list for the specified endpoints\nfunc AddLoadBalancer(endpoints []HNSEndpoint, isILB bool, sourceVIP, vip string, protocol uint16, internalPort uint16, externalPort uint16) (*PolicyList, error) {\n\toperation := \"AddLoadBalancer\"\n\ttitle := \"hcsshim::PolicyList::\" + operation\n\tlogrus.Debugf(title+\" endpointId=%v, isILB=%v, sourceVIP=%s, vip=%s, protocol=%v, internalPort=%v, externalPort=%v\", endpoints, isILB, sourceVIP, vip, protocol, internalPort, externalPort)\n\n\tpolicylist := &PolicyList{}\n\n\telbPolicy := &ELBPolicy{\n\t\tSourceVIP: sourceVIP,\n\t\tILB:       isILB,\n\t}\n\n\tif len(vip) > 0 {\n\t\telbPolicy.VIPs = []string{vip}\n\t}\n\telbPolicy.Type = ExternalLoadBalancer\n\telbPolicy.Protocol = protocol\n\telbPolicy.InternalPort = internalPort\n\telbPolicy.ExternalPort = externalPort\n\n\tfor _, endpoint := range endpoints {\n\t\tpolicylist.EndpointReferences = append(policylist.EndpointReferences, \"/endpoints/\"+endpoint.Id)\n\t}\n\n\tjsonString, err := json.Marshal(elbPolicy)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tpolicylist.Policies = append(policylist.Policies, jsonString)\n\treturn policylist.Create()\n}\n\n// AddRoute adds route policy list for the specified endpoints\nfunc AddRoute(endpoints []HNSEndpoint, destinationPrefix string, nextHop string, encapEnabled bool) (*PolicyList, error) {\n\toperation := \"AddRoute\"\n\ttitle := \"hcsshim::PolicyList::\" + operation\n\tlogrus.Debugf(title+\" destinationPrefix:%s\", destinationPrefix)\n\n\tpolicylist := &PolicyList{}\n\n\trPolicy := &RoutePolicy{\n\t\tDestinationPrefix: destinationPrefix,\n\t\tNextHop:           nextHop,\n\t\tEncapEnabled:      encapEnabled,\n\t}\n\trPolicy.Type = Route\n\n\tfor _, endpoint := range endpoints {\n\t\tpolicylist.EndpointReferences = append(policylist.EndpointReferences, \"/endpoints/\"+endpoint.Id)\n\t}\n\n\tjsonString, err := json.Marshal(rPolicy)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tpolicylist.Policies = append(policylist.Policies, jsonString)\n\treturn policylist.Create()\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hns/hnssupport.go",
    "content": "//go:build windows\n\npackage hns\n\nimport (\n\t\"github.com/sirupsen/logrus\"\n)\n\ntype HNSSupportedFeatures struct {\n\tAcl HNSAclFeatures `json:\"ACL\"`\n}\n\ntype HNSAclFeatures struct {\n\tAclAddressLists       bool `json:\"AclAddressLists\"`\n\tAclNoHostRulePriority bool `json:\"AclHostRulePriority\"`\n\tAclPortRanges         bool `json:\"AclPortRanges\"`\n\tAclRuleId             bool `json:\"AclRuleId\"`\n}\n\nfunc GetHNSSupportedFeatures() HNSSupportedFeatures {\n\tvar hnsFeatures HNSSupportedFeatures\n\n\tglobals, err := GetHNSGlobals()\n\tif err != nil {\n\t\t// Expected on pre-1803 builds, all features will be false/unsupported\n\t\tlogrus.Debugf(\"Unable to obtain HNS globals: %s\", err)\n\t\treturn hnsFeatures\n\t}\n\n\thnsFeatures.Acl = HNSAclFeatures{\n\t\tAclAddressLists:       isHNSFeatureSupported(globals.Version, HNSVersion1803),\n\t\tAclNoHostRulePriority: isHNSFeatureSupported(globals.Version, HNSVersion1803),\n\t\tAclPortRanges:         isHNSFeatureSupported(globals.Version, HNSVersion1803),\n\t\tAclRuleId:             isHNSFeatureSupported(globals.Version, HNSVersion1803),\n\t}\n\n\treturn hnsFeatures\n}\n\nfunc isHNSFeatureSupported(currentVersion HNSVersion, minVersionSupported HNSVersion) bool {\n\tif currentVersion.Major < minVersionSupported.Major {\n\t\treturn false\n\t}\n\tif currentVersion.Major > minVersionSupported.Major {\n\t\treturn true\n\t}\n\tif currentVersion.Minor < minVersionSupported.Minor {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hns/namespace.go",
    "content": "//go:build windows\n\npackage hns\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"path\"\n\t\"strings\"\n)\n\ntype namespaceRequest struct {\n\tIsDefault bool `json:\",omitempty\"`\n}\n\ntype namespaceEndpointRequest struct {\n\tID string `json:\"Id\"`\n}\n\ntype NamespaceResource struct {\n\tType string\n\tData json.RawMessage\n}\n\ntype namespaceResourceRequest struct {\n\tType string\n\tData interface{}\n}\n\ntype Namespace struct {\n\tID            string\n\tIsDefault     bool                `json:\",omitempty\"`\n\tResourceList  []NamespaceResource `json:\",omitempty\"`\n\tCompartmentId uint32              `json:\",omitempty\"`\n}\n\nfunc issueNamespaceRequest(id *string, method, subpath string, request interface{}) (*Namespace, error) {\n\tvar err error\n\thnspath := \"/namespaces/\"\n\tif id != nil {\n\t\thnspath = path.Join(hnspath, *id)\n\t}\n\tif subpath != \"\" {\n\t\thnspath = path.Join(hnspath, subpath)\n\t}\n\tvar reqJSON []byte\n\tif request != nil {\n\t\tif reqJSON, err = json.Marshal(request); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\tvar ns Namespace\n\terr = hnsCall(method, hnspath, string(reqJSON), &ns)\n\tif err != nil {\n\t\tif strings.Contains(err.Error(), \"Element not found.\") {\n\t\t\treturn nil, os.ErrNotExist\n\t\t}\n\t\treturn nil, fmt.Errorf(\"%s %s: %w\", method, hnspath, err)\n\t}\n\treturn &ns, err\n}\n\nfunc CreateNamespace() (string, error) {\n\treq := namespaceRequest{}\n\tns, err := issueNamespaceRequest(nil, \"POST\", \"\", &req)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn ns.ID, nil\n}\n\nfunc RemoveNamespace(id string) error {\n\t_, err := issueNamespaceRequest(&id, \"DELETE\", \"\", nil)\n\treturn err\n}\n\nfunc GetNamespaceEndpoints(id string) ([]string, error) {\n\tns, err := issueNamespaceRequest(&id, \"GET\", \"\", nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar endpoints []string\n\tfor _, rsrc := range ns.ResourceList {\n\t\tif rsrc.Type == \"Endpoint\" {\n\t\t\tvar endpoint namespaceEndpointRequest\n\t\t\terr = json.Unmarshal(rsrc.Data, &endpoint)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"unmarshal endpoint: %w\", err)\n\t\t\t}\n\t\t\tendpoints = append(endpoints, endpoint.ID)\n\t\t}\n\t}\n\treturn endpoints, nil\n}\n\nfunc AddNamespaceEndpoint(id string, endpointID string) error {\n\tresource := namespaceResourceRequest{\n\t\tType: \"Endpoint\",\n\t\tData: namespaceEndpointRequest{endpointID},\n\t}\n\t_, err := issueNamespaceRequest(&id, \"POST\", \"addresource\", &resource)\n\treturn err\n}\n\nfunc RemoveNamespaceEndpoint(id string, endpointID string) error {\n\tresource := namespaceResourceRequest{\n\t\tType: \"Endpoint\",\n\t\tData: namespaceEndpointRequest{endpointID},\n\t}\n\t_, err := issueNamespaceRequest(&id, \"POST\", \"removeresource\", &resource)\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/hns/zsyscall_windows.go",
    "content": "//go:build windows\n\n// Code generated by 'go generate' using \"github.com/Microsoft/go-winio/tools/mkwinsyscall\"; DO NOT EDIT.\n\npackage hns\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\nvar _ unsafe.Pointer\n\n// Do the interface allocations only once for common\n// Errno values.\nconst (\n\terrnoERROR_IO_PENDING = 997\n)\n\nvar (\n\terrERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)\n\terrERROR_EINVAL     error = syscall.EINVAL\n)\n\n// errnoErr returns common boxed Errno values, to prevent\n// allocations at runtime.\nfunc errnoErr(e syscall.Errno) error {\n\tswitch e {\n\tcase 0:\n\t\treturn errERROR_EINVAL\n\tcase errnoERROR_IO_PENDING:\n\t\treturn errERROR_IO_PENDING\n\t}\n\treturn e\n}\n\nvar (\n\tmodvmcompute = windows.NewLazySystemDLL(\"vmcompute.dll\")\n\n\tprocHNSCall = modvmcompute.NewProc(\"HNSCall\")\n)\n\nfunc _hnsCall(method string, path string, object string, response **uint16) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(method)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(path)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p2 *uint16\n\t_p2, hr = syscall.UTF16PtrFromString(object)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn __hnsCall(_p0, _p1, _p2, response)\n}\n\nfunc __hnsCall(method *uint16, path *uint16, object *uint16, response **uint16) (hr error) {\n\thr = procHNSCall.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHNSCall.Addr(), uintptr(unsafe.Pointer(method)), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(object)), uintptr(unsafe.Pointer(response)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/interop/doc.go",
    "content": "package interop\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/interop/interop.go",
    "content": "//go:build windows\n\npackage interop\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\n//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go interop.go\n\n//sys coTaskMemFree(buffer unsafe.Pointer) = api_ms_win_core_com_l1_1_0.CoTaskMemFree\n\nfunc ConvertAndFreeCoTaskMemString(buffer *uint16) string {\n\tstr := syscall.UTF16ToString((*[1 << 29]uint16)(unsafe.Pointer(buffer))[:])\n\tcoTaskMemFree(unsafe.Pointer(buffer))\n\treturn str\n}\n\nfunc Win32FromHresult(hr uintptr) syscall.Errno {\n\tif hr&0x1fff0000 == 0x00070000 {\n\t\treturn syscall.Errno(hr & 0xffff)\n\t}\n\treturn syscall.Errno(hr)\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/interop/zsyscall_windows.go",
    "content": "//go:build windows\n\n// Code generated by 'go generate' using \"github.com/Microsoft/go-winio/tools/mkwinsyscall\"; DO NOT EDIT.\n\npackage interop\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\nvar _ unsafe.Pointer\n\n// Do the interface allocations only once for common\n// Errno values.\nconst (\n\terrnoERROR_IO_PENDING = 997\n)\n\nvar (\n\terrERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)\n\terrERROR_EINVAL     error = syscall.EINVAL\n)\n\n// errnoErr returns common boxed Errno values, to prevent\n// allocations at runtime.\nfunc errnoErr(e syscall.Errno) error {\n\tswitch e {\n\tcase 0:\n\t\treturn errERROR_EINVAL\n\tcase errnoERROR_IO_PENDING:\n\t\treturn errERROR_IO_PENDING\n\t}\n\treturn e\n}\n\nvar (\n\tmodapi_ms_win_core_com_l1_1_0 = windows.NewLazySystemDLL(\"api-ms-win-core-com-l1-1-0.dll\")\n\n\tprocCoTaskMemFree = modapi_ms_win_core_com_l1_1_0.NewProc(\"CoTaskMemFree\")\n)\n\nfunc coTaskMemFree(buffer unsafe.Pointer) {\n\tsyscall.SyscallN(procCoTaskMemFree.Addr(), uintptr(buffer))\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/jobobject/doc.go",
    "content": "// This package provides higher level constructs for the win32 job object API.\n// Most of the core creation and management functions are already present in \"golang.org/x/sys/windows\"\n// (CreateJobObject, AssignProcessToJobObject, etc.) as well as most of the limit information\n// structs and associated limit flags. Whatever is not present from the job object API\n// in golang.org/x/sys/windows is located in /internal/winapi.\n//\n// https://docs.microsoft.com/en-us/windows/win32/procthread/job-objects\npackage jobobject\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/jobobject/iocp.go",
    "content": "//go:build windows\n\npackage jobobject\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"sync\"\n\t\"unsafe\"\n\n\t\"github.com/Microsoft/hcsshim/internal/log\"\n\t\"github.com/Microsoft/hcsshim/internal/queue\"\n\t\"github.com/Microsoft/hcsshim/internal/winapi\"\n\t\"github.com/sirupsen/logrus\"\n\t\"golang.org/x/sys/windows\"\n)\n\nvar (\n\tioInitOnce sync.Once\n\tinitIOErr  error\n\t// Global iocp handle that will be re-used for every job object\n\tioCompletionPort windows.Handle\n\t// Mapping of job handle to queue to place notifications in.\n\tjobMap sync.Map\n)\n\n// MsgAllProcessesExited is a type representing a message that every process in a job has exited.\ntype MsgAllProcessesExited struct{}\n\n// MsgUnimplemented represents a message that we are aware of, but that isn't implemented currently.\n// This should not be treated as an error.\ntype MsgUnimplemented struct{}\n\n// pollIOCP polls the io completion port forever.\nfunc pollIOCP(ctx context.Context, iocpHandle windows.Handle) {\n\tvar (\n\t\toverlapped uintptr\n\t\tcode       uint32\n\t\tkey        uintptr\n\t)\n\n\tfor {\n\t\terr := windows.GetQueuedCompletionStatus(iocpHandle, &code, &key, (**windows.Overlapped)(unsafe.Pointer(&overlapped)), windows.INFINITE)\n\t\tif err != nil {\n\t\t\tlog.G(ctx).WithError(err).Error(\"failed to poll for job object message\")\n\t\t\tcontinue\n\t\t}\n\t\tif val, ok := jobMap.Load(key); ok {\n\t\t\tmsq, ok := val.(*queue.MessageQueue)\n\t\t\tif !ok {\n\t\t\t\tlog.G(ctx).WithField(\"value\", msq).Warn(\"encountered non queue type in job map\")\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tnotification, err := parseMessage(code, overlapped)\n\t\t\tif err != nil {\n\t\t\t\tlog.G(ctx).WithFields(logrus.Fields{\n\t\t\t\t\t\"code\":       code,\n\t\t\t\t\t\"overlapped\": overlapped,\n\t\t\t\t}).Warn(\"failed to parse job object message\")\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif err := msq.Enqueue(notification); errors.Is(err, queue.ErrQueueClosed) {\n\t\t\t\t// Write will only return an error when the queue is closed.\n\t\t\t\t// The only time a queue would ever be closed is when we call `Close` on\n\t\t\t\t// the job it belongs to which also removes it from the jobMap, so something\n\t\t\t\t// went wrong here. We can't return as this is reading messages for all jobs\n\t\t\t\t// so just log it and move on.\n\t\t\t\tlog.G(ctx).WithFields(logrus.Fields{\n\t\t\t\t\t\"code\":       code,\n\t\t\t\t\t\"overlapped\": overlapped,\n\t\t\t\t}).Warn(\"tried to write to a closed queue\")\n\t\t\t\tcontinue\n\t\t\t}\n\t\t} else {\n\t\t\tlog.G(ctx).Warn(\"received a message for a job not present in the mapping\")\n\t\t}\n\t}\n}\n\nfunc parseMessage(code uint32, overlapped uintptr) (interface{}, error) {\n\t// Check code and parse out relevant information related to that notification\n\t// that we care about. For now all we handle is the message that all processes\n\t// in the job have exited.\n\tswitch code {\n\tcase winapi.JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO:\n\t\treturn MsgAllProcessesExited{}, nil\n\t// Other messages for completeness and a check to make sure that if we fall\n\t// into the default case that this is a code we don't know how to handle.\n\tcase winapi.JOB_OBJECT_MSG_END_OF_JOB_TIME:\n\tcase winapi.JOB_OBJECT_MSG_END_OF_PROCESS_TIME:\n\tcase winapi.JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT:\n\tcase winapi.JOB_OBJECT_MSG_NEW_PROCESS:\n\tcase winapi.JOB_OBJECT_MSG_EXIT_PROCESS:\n\tcase winapi.JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS:\n\tcase winapi.JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT:\n\tcase winapi.JOB_OBJECT_MSG_JOB_MEMORY_LIMIT:\n\tcase winapi.JOB_OBJECT_MSG_NOTIFICATION_LIMIT:\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unknown job notification type: %d\", code)\n\t}\n\treturn MsgUnimplemented{}, nil\n}\n\n// Assigns an IO completion port to get notified of events for the registered job\n// object.\nfunc attachIOCP(job windows.Handle, iocp windows.Handle) error {\n\tinfo := winapi.JOBOBJECT_ASSOCIATE_COMPLETION_PORT{\n\t\tCompletionKey:  job,\n\t\tCompletionPort: iocp,\n\t}\n\t_, err := windows.SetInformationJobObject(job, windows.JobObjectAssociateCompletionPortInformation, uintptr(unsafe.Pointer(&info)), uint32(unsafe.Sizeof(info)))\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/jobobject/jobobject.go",
    "content": "//go:build windows\n\npackage jobobject\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"unsafe\"\n\n\t\"github.com/Microsoft/hcsshim/internal/queue\"\n\t\"github.com/Microsoft/hcsshim/internal/winapi\"\n\t\"golang.org/x/sys/windows\"\n)\n\n// JobObject is a high level wrapper around a Windows job object. Holds a handle to\n// the job, a queue to receive iocp notifications about the lifecycle\n// of the job and a mutex for synchronized handle access.\ntype JobObject struct {\n\thandle windows.Handle\n\t// silo signifies that this job is currently a silo.\n\tsilo       atomic.Bool\n\tmq         *queue.MessageQueue\n\thandleLock sync.RWMutex\n}\n\n// JobLimits represents the resource constraints that can be applied to a job object.\ntype JobLimits struct {\n\tCPULimit           uint32\n\tCPUWeight          uint32\n\tMemoryLimitInBytes uint64\n\tMaxIOPS            int64\n\tMaxBandwidth       int64\n}\n\ntype CPURateControlType uint32\n\nconst (\n\tWeightBased CPURateControlType = iota\n\tRateBased\n)\n\n// Processor resource controls\nconst (\n\tcpuLimitMin  = 1\n\tcpuLimitMax  = 10000\n\tcpuWeightMin = 1\n\tcpuWeightMax = 9\n)\n\nvar (\n\tErrAlreadyClosed = errors.New(\"the handle has already been closed\")\n\tErrNotRegistered = errors.New(\"job is not registered to receive notifications\")\n\tErrNotSilo       = errors.New(\"job is not a silo\")\n)\n\n// Options represents the set of configurable options when making or opening a job object.\ntype Options struct {\n\t// `Name` specifies the name of the job object if a named job object is desired.\n\tName string\n\t// `Notifications` specifies if the job will be registered to receive notifications.\n\t// Defaults to false.\n\tNotifications bool\n\t// `UseNTVariant` specifies if we should use the `Nt` variant of Open/CreateJobObject.\n\t// Defaults to false.\n\tUseNTVariant bool\n\t// `Silo` specifies to promote the job to a silo. This additionally sets the flag\n\t// JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE as it is required for the upgrade to complete.\n\tSilo bool\n\t// `IOTracking` enables tracking I/O statistics on the job object. More specifically this\n\t// calls SetInformationJobObject with the JobObjectIoAttribution class.\n\tEnableIOTracking bool\n}\n\n// Create creates a job object.\n//\n// If options.Name is an empty string, the job will not be assigned a name.\n//\n// If options.Notifications are not enabled `PollNotifications` will return immediately with error `errNotRegistered`.\n//\n// If `options` is nil, use default option values.\n//\n// Returns a JobObject structure and an error if there is one.\nfunc Create(ctx context.Context, options *Options) (_ *JobObject, err error) {\n\tif options == nil {\n\t\toptions = &Options{}\n\t}\n\n\tvar jobName *winapi.UnicodeString\n\tif options.Name != \"\" {\n\t\tjobName, err = winapi.NewUnicodeString(options.Name)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tvar jobHandle windows.Handle\n\tif options.UseNTVariant {\n\t\toa := winapi.ObjectAttributes{\n\t\t\tLength:     unsafe.Sizeof(winapi.ObjectAttributes{}),\n\t\t\tObjectName: jobName,\n\t\t\tAttributes: 0,\n\t\t}\n\t\tstatus := winapi.NtCreateJobObject(&jobHandle, winapi.JOB_OBJECT_ALL_ACCESS, &oa)\n\t\tif status != 0 {\n\t\t\treturn nil, winapi.RtlNtStatusToDosError(status)\n\t\t}\n\t} else {\n\t\tvar jobNameBuf *uint16\n\t\tif jobName != nil && jobName.Buffer != nil {\n\t\t\tjobNameBuf = jobName.Buffer\n\t\t}\n\t\tjobHandle, err = windows.CreateJobObject(nil, jobNameBuf)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tdefer func() {\n\t\tif err != nil {\n\t\t\twindows.Close(jobHandle)\n\t\t}\n\t}()\n\n\tjob := &JobObject{\n\t\thandle: jobHandle,\n\t}\n\n\t// If the IOCP we'll be using to receive messages for all jobs hasn't been\n\t// created, create it and start polling.\n\tif options.Notifications {\n\t\tmq, err := setupNotifications(ctx, job)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tjob.mq = mq\n\t}\n\n\tif options.EnableIOTracking {\n\t\tif err := enableIOTracking(jobHandle); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tif options.Silo {\n\t\t// This is a required setting for upgrading to a silo.\n\t\tif err := job.SetTerminateOnLastHandleClose(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := job.PromoteToSilo(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treturn job, nil\n}\n\n// Open opens an existing job object with name provided in `options`. If no name is provided\n// return an error since we need to know what job object to open.\n//\n// If options.Notifications is false `PollNotifications` will return immediately with error `errNotRegistered`.\n//\n// Returns a JobObject structure and an error if there is one.\nfunc Open(ctx context.Context, options *Options) (_ *JobObject, err error) {\n\tif options == nil || options.Name == \"\" {\n\t\treturn nil, errors.New(\"no job object name specified to open\")\n\t}\n\n\tunicodeJobName, err := winapi.NewUnicodeString(options.Name)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar jobHandle windows.Handle\n\tif options.UseNTVariant {\n\t\toa := winapi.ObjectAttributes{\n\t\t\tLength:     unsafe.Sizeof(winapi.ObjectAttributes{}),\n\t\t\tObjectName: unicodeJobName,\n\t\t\tAttributes: 0,\n\t\t}\n\t\tstatus := winapi.NtOpenJobObject(&jobHandle, winapi.JOB_OBJECT_ALL_ACCESS, &oa)\n\t\tif status != 0 {\n\t\t\treturn nil, winapi.RtlNtStatusToDosError(status)\n\t\t}\n\t} else {\n\t\tjobHandle, err = winapi.OpenJobObject(winapi.JOB_OBJECT_ALL_ACCESS, false, unicodeJobName.Buffer)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tdefer func() {\n\t\tif err != nil {\n\t\t\twindows.Close(jobHandle)\n\t\t}\n\t}()\n\n\tjob := &JobObject{\n\t\thandle: jobHandle,\n\t}\n\n\tjob.silo.Store(isJobSilo(jobHandle))\n\n\t// If the IOCP we'll be using to receive messages for all jobs hasn't been\n\t// created, create it and start polling.\n\tif options.Notifications {\n\t\tmq, err := setupNotifications(ctx, job)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tjob.mq = mq\n\t}\n\n\treturn job, nil\n}\n\n// helper function to setup notifications for creating/opening a job object\nfunc setupNotifications(ctx context.Context, job *JobObject) (*queue.MessageQueue, error) {\n\tjob.handleLock.RLock()\n\tdefer job.handleLock.RUnlock()\n\n\tif job.handle == 0 {\n\t\treturn nil, ErrAlreadyClosed\n\t}\n\n\tioInitOnce.Do(func() {\n\t\th, err := windows.CreateIoCompletionPort(windows.InvalidHandle, 0, 0, 0xffffffff)\n\t\tif err != nil {\n\t\t\tinitIOErr = err\n\t\t\treturn\n\t\t}\n\t\tioCompletionPort = h\n\t\tgo pollIOCP(ctx, h)\n\t})\n\n\tif initIOErr != nil {\n\t\treturn nil, initIOErr\n\t}\n\n\tmq := queue.NewMessageQueue()\n\tjobMap.Store(uintptr(job.handle), mq)\n\tif err := attachIOCP(job.handle, ioCompletionPort); err != nil {\n\t\tjobMap.Delete(uintptr(job.handle))\n\t\treturn nil, fmt.Errorf(\"failed to attach job to IO completion port: %w\", err)\n\t}\n\treturn mq, nil\n}\n\n// PollNotification will poll for a job object notification. This call should only be called once\n// per job (ideally in a goroutine loop) and will block if there is not a notification ready.\n// This call will return immediately with error `ErrNotRegistered` if the job was not registered\n// to receive notifications during `Create`. Internally, messages will be queued and there\n// is no worry of messages being dropped.\nfunc (job *JobObject) PollNotification() (interface{}, error) {\n\tif job.mq == nil {\n\t\treturn nil, ErrNotRegistered\n\t}\n\treturn job.mq.Dequeue()\n}\n\n// UpdateProcThreadAttribute updates the passed in ProcThreadAttributeList to contain what is necessary to\n// launch a process in a job at creation time. This can be used to avoid having to call Assign() after a process\n// has already started running.\nfunc (job *JobObject) UpdateProcThreadAttribute(attrList *windows.ProcThreadAttributeListContainer) error {\n\tjob.handleLock.RLock()\n\tdefer job.handleLock.RUnlock()\n\n\tif job.handle == 0 {\n\t\treturn ErrAlreadyClosed\n\t}\n\n\tif err := attrList.Update(\n\t\twinapi.PROC_THREAD_ATTRIBUTE_JOB_LIST,\n\t\tunsafe.Pointer(&job.handle),\n\t\tunsafe.Sizeof(job.handle),\n\t); err != nil {\n\t\treturn fmt.Errorf(\"failed to update proc thread attributes for job object: %w\", err)\n\t}\n\n\treturn nil\n}\n\n// Close closes the job object handle.\nfunc (job *JobObject) Close() error {\n\tjob.handleLock.Lock()\n\tdefer job.handleLock.Unlock()\n\n\tif job.handle == 0 {\n\t\treturn ErrAlreadyClosed\n\t}\n\n\tif err := windows.Close(job.handle); err != nil {\n\t\treturn err\n\t}\n\n\tif job.mq != nil {\n\t\tjob.mq.Close()\n\t}\n\t// Handles now invalid so if the map entry to receive notifications for this job still\n\t// exists remove it so we can stop receiving notifications.\n\tif _, ok := jobMap.Load(uintptr(job.handle)); ok {\n\t\tjobMap.Delete(uintptr(job.handle))\n\t}\n\n\tjob.handle = 0\n\treturn nil\n}\n\n// Assign assigns a process to the job object.\nfunc (job *JobObject) Assign(pid uint32) error {\n\tjob.handleLock.RLock()\n\tdefer job.handleLock.RUnlock()\n\n\tif job.handle == 0 {\n\t\treturn ErrAlreadyClosed\n\t}\n\n\tif pid == 0 {\n\t\treturn errors.New(\"invalid pid: 0\")\n\t}\n\thProc, err := windows.OpenProcess(winapi.PROCESS_ALL_ACCESS, true, pid)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer windows.Close(hProc)\n\treturn windows.AssignProcessToJobObject(job.handle, hProc)\n}\n\n// Terminate terminates the job, essentially calls TerminateProcess on every process in the\n// job.\nfunc (job *JobObject) Terminate(exitCode uint32) error {\n\tjob.handleLock.RLock()\n\tdefer job.handleLock.RUnlock()\n\tif job.handle == 0 {\n\t\treturn ErrAlreadyClosed\n\t}\n\treturn windows.TerminateJobObject(job.handle, exitCode)\n}\n\n// Pids returns all of the process IDs in the job object.\nfunc (job *JobObject) Pids() ([]uint32, error) {\n\tjob.handleLock.RLock()\n\tdefer job.handleLock.RUnlock()\n\n\tif job.handle == 0 {\n\t\treturn nil, ErrAlreadyClosed\n\t}\n\n\tinfo := winapi.JOBOBJECT_BASIC_PROCESS_ID_LIST{}\n\terr := winapi.QueryInformationJobObject(\n\t\tjob.handle,\n\t\twinapi.JobObjectBasicProcessIdList,\n\t\tunsafe.Pointer(&info),\n\t\tuint32(unsafe.Sizeof(info)),\n\t\tnil,\n\t)\n\n\t// This is either the case where there is only one process or no processes in\n\t// the job. Any other case will result in ERROR_MORE_DATA. Check if info.NumberOfProcessIdsInList\n\t// is 1 and just return this, otherwise return an empty slice.\n\tif err == nil {\n\t\tif info.NumberOfProcessIdsInList == 1 {\n\t\t\treturn []uint32{uint32(info.ProcessIdList[0])}, nil\n\t\t}\n\t\t// Return empty slice instead of nil to play well with the caller of this.\n\t\t// Do not return an error if no processes are running inside the job\n\t\treturn []uint32{}, nil\n\t}\n\n\tif err != winapi.ERROR_MORE_DATA { //nolint:errorlint\n\t\treturn nil, fmt.Errorf(\"failed initial query for PIDs in job object: %w\", err)\n\t}\n\n\tjobBasicProcessIDListSize := unsafe.Sizeof(info) + (unsafe.Sizeof(info.ProcessIdList[0]) * uintptr(info.NumberOfAssignedProcesses-1))\n\tbuf := make([]byte, jobBasicProcessIDListSize)\n\tif err = winapi.QueryInformationJobObject(\n\t\tjob.handle,\n\t\twinapi.JobObjectBasicProcessIdList,\n\t\tunsafe.Pointer(&buf[0]),\n\t\tuint32(len(buf)),\n\t\tnil,\n\t); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to query for PIDs in job object: %w\", err)\n\t}\n\n\tbufInfo := (*winapi.JOBOBJECT_BASIC_PROCESS_ID_LIST)(unsafe.Pointer(&buf[0]))\n\tpids := make([]uint32, bufInfo.NumberOfProcessIdsInList)\n\tfor i, bufPid := range bufInfo.AllPids() {\n\t\tpids[i] = uint32(bufPid)\n\t}\n\treturn pids, nil\n}\n\n// QueryMemoryStats gets the memory stats for the job object.\nfunc (job *JobObject) QueryMemoryStats() (*winapi.JOBOBJECT_MEMORY_USAGE_INFORMATION, error) {\n\tjob.handleLock.RLock()\n\tdefer job.handleLock.RUnlock()\n\n\tif job.handle == 0 {\n\t\treturn nil, ErrAlreadyClosed\n\t}\n\n\tinfo := winapi.JOBOBJECT_MEMORY_USAGE_INFORMATION{}\n\tif err := winapi.QueryInformationJobObject(\n\t\tjob.handle,\n\t\twinapi.JobObjectMemoryUsageInformation,\n\t\tunsafe.Pointer(&info),\n\t\tuint32(unsafe.Sizeof(info)),\n\t\tnil,\n\t); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to query for job object memory stats: %w\", err)\n\t}\n\treturn &info, nil\n}\n\n// QueryProcessorStats gets the processor stats for the job object.\nfunc (job *JobObject) QueryProcessorStats() (*winapi.JOBOBJECT_BASIC_ACCOUNTING_INFORMATION, error) {\n\tjob.handleLock.RLock()\n\tdefer job.handleLock.RUnlock()\n\n\tif job.handle == 0 {\n\t\treturn nil, ErrAlreadyClosed\n\t}\n\n\tinfo := winapi.JOBOBJECT_BASIC_ACCOUNTING_INFORMATION{}\n\tif err := winapi.QueryInformationJobObject(\n\t\tjob.handle,\n\t\twinapi.JobObjectBasicAccountingInformation,\n\t\tunsafe.Pointer(&info),\n\t\tuint32(unsafe.Sizeof(info)),\n\t\tnil,\n\t); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to query for job object process stats: %w\", err)\n\t}\n\treturn &info, nil\n}\n\n// QueryStorageStats gets the storage (I/O) stats for the job object. This call will error\n// if either `EnableIOTracking` wasn't set to true on creation of the job, or SetIOTracking()\n// hasn't been called since creation of the job.\nfunc (job *JobObject) QueryStorageStats() (*winapi.JOBOBJECT_IO_ATTRIBUTION_INFORMATION, error) {\n\tjob.handleLock.RLock()\n\tdefer job.handleLock.RUnlock()\n\n\tif job.handle == 0 {\n\t\treturn nil, ErrAlreadyClosed\n\t}\n\n\tinfo := winapi.JOBOBJECT_IO_ATTRIBUTION_INFORMATION{\n\t\tControlFlags: winapi.JOBOBJECT_IO_ATTRIBUTION_CONTROL_ENABLE,\n\t}\n\tif err := winapi.QueryInformationJobObject(\n\t\tjob.handle,\n\t\twinapi.JobObjectIoAttribution,\n\t\tunsafe.Pointer(&info),\n\t\tuint32(unsafe.Sizeof(info)),\n\t\tnil,\n\t); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to query for job object storage stats: %w\", err)\n\t}\n\treturn &info, nil\n}\n\n// ApplyFileBinding makes a file binding using the Bind Filter from target to root. If the job has\n// not been upgraded to a silo this call will fail. The binding is only applied and visible for processes\n// running in the job, any processes on the host or in another job will not be able to see the binding.\nfunc (job *JobObject) ApplyFileBinding(root, target string, readOnly bool) error {\n\tjob.handleLock.RLock()\n\tdefer job.handleLock.RUnlock()\n\n\tif job.handle == 0 {\n\t\treturn ErrAlreadyClosed\n\t}\n\n\tif !job.silo.Load() {\n\t\treturn ErrNotSilo\n\t}\n\n\t// The parent directory needs to exist for the bind to work. MkdirAll stats and\n\t// returns nil if the directory exists internally so we should be fine to mkdirall\n\t// every time.\n\tif err := os.MkdirAll(filepath.Dir(root), 0); err != nil {\n\t\treturn err\n\t}\n\n\trootPtr, err := windows.UTF16PtrFromString(root)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\ttargetPtr, err := windows.UTF16PtrFromString(target)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tflags := winapi.BINDFLT_FLAG_USE_CURRENT_SILO_MAPPING\n\tif readOnly {\n\t\tflags |= winapi.BINDFLT_FLAG_READ_ONLY_MAPPING\n\t}\n\n\tif err := winapi.BfSetupFilter(\n\t\tjob.handle,\n\t\tflags,\n\t\trootPtr,\n\t\ttargetPtr,\n\t\tnil,\n\t\t0,\n\t); err != nil {\n\t\treturn fmt.Errorf(\"failed to bind target %q to root %q for job object: %w\", target, root, err)\n\t}\n\treturn nil\n}\n\n// isJobSilo is a helper to determine if a job object that was opened is a silo. This should ONLY be called\n// from `Open` and any callers in this package afterwards should use `job.isSilo()`\nfunc isJobSilo(h windows.Handle) bool {\n\t// None of the information from the structure that this info class expects will be used, this is just used as\n\t// the call will fail if the job hasn't been upgraded to a silo so we can use this to tell when we open a job\n\t// if it's a silo or not. We still need to define the struct layout as expected by Win32, else the struct\n\t// alignment might be different and the call will fail.\n\tvar siloInfo winapi.SILOOBJECT_BASIC_INFORMATION\n\terr := winapi.QueryInformationJobObject(\n\t\th,\n\t\twinapi.JobObjectSiloBasicInformation,\n\t\tunsafe.Pointer(&siloInfo),\n\t\tuint32(unsafe.Sizeof(siloInfo)),\n\t\tnil,\n\t)\n\treturn err == nil\n}\n\n// PromoteToSilo promotes a job object to a silo. There must be no running processess\n// in the job for this to succeed. If the job is already a silo this is a no-op.\nfunc (job *JobObject) PromoteToSilo() error {\n\tjob.handleLock.RLock()\n\tdefer job.handleLock.RUnlock()\n\n\tif job.handle == 0 {\n\t\treturn ErrAlreadyClosed\n\t}\n\n\tif job.silo.Load() {\n\t\treturn nil\n\t}\n\n\tpids, err := job.Pids()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif len(pids) != 0 {\n\t\treturn fmt.Errorf(\"job cannot have running processes to be promoted to a silo, found %d running processes\", len(pids))\n\t}\n\n\t_, err = windows.SetInformationJobObject(\n\t\tjob.handle,\n\t\twinapi.JobObjectCreateSilo,\n\t\t0,\n\t\t0,\n\t)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to promote job to silo: %w\", err)\n\t}\n\n\tjob.silo.Store(true)\n\treturn nil\n}\n\n// QueryPrivateWorkingSet returns the private working set size for the job. This is calculated by adding up the\n// private working set for every process running in the job.\nfunc (job *JobObject) QueryPrivateWorkingSet() (uint64, error) {\n\tpids, err := job.Pids()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\topenAndQueryWorkingSet := func(pid uint32) (uint64, error) {\n\t\th, err := windows.OpenProcess(windows.PROCESS_QUERY_LIMITED_INFORMATION, false, pid)\n\t\tif err != nil {\n\t\t\t// Continue to the next if OpenProcess doesn't return a valid handle (fails). Handles a\n\t\t\t// case where one of the pids in the job exited before we open.\n\t\t\treturn 0, nil\n\t\t}\n\t\tdefer func() {\n\t\t\t_ = windows.Close(h)\n\t\t}()\n\t\t// Check if the process is actually running in the job still. There's a small chance\n\t\t// that the process could have exited and had its pid re-used between grabbing the pids\n\t\t// in the job and opening the handle to it above.\n\t\tvar inJob int32\n\t\tif err := winapi.IsProcessInJob(h, job.handle, &inJob); err != nil {\n\t\t\t// This shouldn't fail unless we have incorrect access rights which we control\n\t\t\t// here so probably best to error out if this failed.\n\t\t\treturn 0, err\n\t\t}\n\t\t// Don't report stats for this process as it's not running in the job. This shouldn't be\n\t\t// an error condition though.\n\t\tif inJob == 0 {\n\t\t\treturn 0, nil\n\t\t}\n\n\t\tvar vmCounters winapi.VM_COUNTERS_EX2\n\t\tstatus := winapi.NtQueryInformationProcess(\n\t\t\th,\n\t\t\twinapi.ProcessVmCounters,\n\t\t\tunsafe.Pointer(&vmCounters),\n\t\t\tuint32(unsafe.Sizeof(vmCounters)),\n\t\t\tnil,\n\t\t)\n\t\tif !winapi.NTSuccess(status) {\n\t\t\treturn 0, fmt.Errorf(\"failed to query information for process: %w\", winapi.RtlNtStatusToDosError(status))\n\t\t}\n\t\treturn uint64(vmCounters.PrivateWorkingSetSize), nil\n\t}\n\n\tvar jobWorkingSetSize uint64\n\tfor _, pid := range pids {\n\t\tworkingSet, err := openAndQueryWorkingSet(pid)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tjobWorkingSetSize += workingSet\n\t}\n\n\treturn jobWorkingSetSize, nil\n}\n\n// SetIOTracking enables IO tracking for processes in the job object.\n// This enables use of the QueryStorageStats method.\nfunc (job *JobObject) SetIOTracking() error {\n\tjob.handleLock.RLock()\n\tdefer job.handleLock.RUnlock()\n\n\tif job.handle == 0 {\n\t\treturn ErrAlreadyClosed\n\t}\n\n\treturn enableIOTracking(job.handle)\n}\n\nfunc enableIOTracking(job windows.Handle) error {\n\tinfo := winapi.JOBOBJECT_IO_ATTRIBUTION_INFORMATION{\n\t\tControlFlags: winapi.JOBOBJECT_IO_ATTRIBUTION_CONTROL_ENABLE,\n\t}\n\tif _, err := windows.SetInformationJobObject(\n\t\tjob,\n\t\twinapi.JobObjectIoAttribution,\n\t\tuintptr(unsafe.Pointer(&info)),\n\t\tuint32(unsafe.Sizeof(info)),\n\t); err != nil {\n\t\treturn fmt.Errorf(\"failed to enable IO tracking on job object: %w\", err)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/jobobject/limits.go",
    "content": "//go:build windows\n\npackage jobobject\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"unsafe\"\n\n\t\"github.com/Microsoft/hcsshim/internal/winapi\"\n\t\"golang.org/x/sys/windows\"\n)\n\nconst (\n\tmemoryLimitMax uint64 = 0xffffffffffffffff\n)\n\nfunc isFlagSet(flag, controlFlags uint32) bool {\n\treturn (flag & controlFlags) == flag\n}\n\n// SetResourceLimits sets resource limits on the job object (cpu, memory, storage).\nfunc (job *JobObject) SetResourceLimits(limits *JobLimits) error {\n\t// Go through and check what limits were specified and apply them to the job.\n\tif limits.MemoryLimitInBytes != 0 {\n\t\tif err := job.SetMemoryLimit(limits.MemoryLimitInBytes); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to set job object memory limit: %w\", err)\n\t\t}\n\t}\n\n\tif limits.CPULimit != 0 {\n\t\tif err := job.SetCPULimit(RateBased, limits.CPULimit); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to set job object cpu limit: %w\", err)\n\t\t}\n\t} else if limits.CPUWeight != 0 {\n\t\tif err := job.SetCPULimit(WeightBased, limits.CPUWeight); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to set job object cpu limit: %w\", err)\n\t\t}\n\t}\n\n\tif limits.MaxBandwidth != 0 || limits.MaxIOPS != 0 {\n\t\tif err := job.SetIOLimit(limits.MaxBandwidth, limits.MaxIOPS); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to set io limit on job object: %w\", err)\n\t\t}\n\t}\n\treturn nil\n}\n\n// SetTerminateOnLastHandleClose sets the job object flag that specifies that the job should terminate\n// all processes in the job on the last open handle being closed.\nfunc (job *JobObject) SetTerminateOnLastHandleClose() error {\n\tinfo, err := job.getExtendedInformation()\n\tif err != nil {\n\t\treturn err\n\t}\n\tinfo.BasicLimitInformation.LimitFlags |= windows.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE\n\treturn job.setExtendedInformation(info)\n}\n\n// SetMemoryLimit sets the memory limit of the job object based on the given `memoryLimitInBytes`.\nfunc (job *JobObject) SetMemoryLimit(memoryLimitInBytes uint64) error {\n\tif memoryLimitInBytes >= memoryLimitMax {\n\t\treturn errors.New(\"memory limit specified exceeds the max size\")\n\t}\n\n\tinfo, err := job.getExtendedInformation()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tinfo.JobMemoryLimit = uintptr(memoryLimitInBytes)\n\tinfo.BasicLimitInformation.LimitFlags |= windows.JOB_OBJECT_LIMIT_JOB_MEMORY\n\treturn job.setExtendedInformation(info)\n}\n\n// GetMemoryLimit gets the memory limit in bytes of the job object.\nfunc (job *JobObject) GetMemoryLimit() (uint64, error) {\n\tinfo, err := job.getExtendedInformation()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn uint64(info.JobMemoryLimit), nil\n}\n\n// SetCPULimit sets the CPU limit depending on the specified `CPURateControlType` to\n// `rateControlValue` for the job object.\nfunc (job *JobObject) SetCPULimit(rateControlType CPURateControlType, rateControlValue uint32) error {\n\tcpuInfo, err := job.getCPURateControlInformation()\n\tif err != nil {\n\t\treturn err\n\t}\n\tswitch rateControlType {\n\tcase WeightBased:\n\t\tif rateControlValue < cpuWeightMin || rateControlValue > cpuWeightMax {\n\t\t\treturn fmt.Errorf(\"processor weight value of `%d` is invalid\", rateControlValue)\n\t\t}\n\t\tcpuInfo.ControlFlags |= winapi.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE | winapi.JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED\n\t\tcpuInfo.Value = rateControlValue\n\tcase RateBased:\n\t\tif rateControlValue < cpuLimitMin || rateControlValue > cpuLimitMax {\n\t\t\treturn fmt.Errorf(\"processor rate of `%d` is invalid\", rateControlValue)\n\t\t}\n\t\tcpuInfo.ControlFlags |= winapi.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE | winapi.JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP\n\t\tcpuInfo.Value = rateControlValue\n\tdefault:\n\t\treturn errors.New(\"invalid job object cpu rate control type\")\n\t}\n\treturn job.setCPURateControlInfo(cpuInfo)\n}\n\n// GetCPULimit gets the cpu limits for the job object.\n// `rateControlType` is used to indicate what type of cpu limit to query for.\nfunc (job *JobObject) GetCPULimit(rateControlType CPURateControlType) (uint32, error) {\n\tinfo, err := job.getCPURateControlInformation()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tif !isFlagSet(winapi.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE, info.ControlFlags) {\n\t\treturn 0, errors.New(\"the job does not have cpu rate control enabled\")\n\t}\n\n\tswitch rateControlType {\n\tcase WeightBased:\n\t\tif !isFlagSet(winapi.JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED, info.ControlFlags) {\n\t\t\treturn 0, errors.New(\"cannot get cpu weight for job object without cpu weight option set\")\n\t\t}\n\tcase RateBased:\n\t\tif !isFlagSet(winapi.JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP, info.ControlFlags) {\n\t\t\treturn 0, errors.New(\"cannot get cpu rate hard cap for job object without cpu rate hard cap option set\")\n\t\t}\n\tdefault:\n\t\treturn 0, errors.New(\"invalid job object cpu rate control type\")\n\t}\n\treturn info.Value, nil\n}\n\n// SetCPUAffinity sets the processor affinity for the job object.\n// The affinity is passed in as a bitmask.\nfunc (job *JobObject) SetCPUAffinity(affinityBitMask uint64) error {\n\tinfo, err := job.getExtendedInformation()\n\tif err != nil {\n\t\treturn err\n\t}\n\tinfo.BasicLimitInformation.LimitFlags |= uint32(windows.JOB_OBJECT_LIMIT_AFFINITY)\n\n\t// We really, really shouldn't be running on 32 bit, but just in case (and to satisfy CodeQL) ...\n\tconst maxUintptr = ^uintptr(0)\n\tif affinityBitMask > uint64(maxUintptr) {\n\t\treturn fmt.Errorf(\"affinity bitmask (%d) exceeds max allowable value (%d)\", affinityBitMask, maxUintptr)\n\t}\n\n\t// CodeQL [SM03681] checked against max value above (there is no math.MaxUintPtr ...)\n\tinfo.BasicLimitInformation.Affinity = uintptr(affinityBitMask)\n\treturn job.setExtendedInformation(info)\n}\n\n// GetCPUAffinity gets the processor affinity for the job object.\n// The returned affinity is a bitmask.\nfunc (job *JobObject) GetCPUAffinity() (uint64, error) {\n\tinfo, err := job.getExtendedInformation()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn uint64(info.BasicLimitInformation.Affinity), nil\n}\n\n// SetIOLimit sets the IO limits specified on the job object.\nfunc (job *JobObject) SetIOLimit(maxBandwidth, maxIOPS int64) error {\n\tioInfo, err := job.getIOLimit()\n\tif err != nil {\n\t\treturn err\n\t}\n\tioInfo.ControlFlags |= winapi.JOB_OBJECT_IO_RATE_CONTROL_ENABLE\n\tif maxBandwidth != 0 {\n\t\tioInfo.MaxBandwidth = maxBandwidth\n\t}\n\tif maxIOPS != 0 {\n\t\tioInfo.MaxIops = maxIOPS\n\t}\n\treturn job.setIORateControlInfo(ioInfo)\n}\n\n// GetIOMaxBandwidthLimit gets the max bandwidth for the job object.\nfunc (job *JobObject) GetIOMaxBandwidthLimit() (int64, error) {\n\tinfo, err := job.getIOLimit()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn info.MaxBandwidth, nil\n}\n\n// GetIOMaxIopsLimit gets the max iops for the job object.\nfunc (job *JobObject) GetIOMaxIopsLimit() (int64, error) {\n\tinfo, err := job.getIOLimit()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn info.MaxIops, nil\n}\n\n// Helper function for getting a job object's extended information.\nfunc (job *JobObject) getExtendedInformation() (*windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION, error) {\n\tjob.handleLock.RLock()\n\tdefer job.handleLock.RUnlock()\n\n\tif job.handle == 0 {\n\t\treturn nil, ErrAlreadyClosed\n\t}\n\n\tinfo := windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION{}\n\tif err := winapi.QueryInformationJobObject(\n\t\tjob.handle,\n\t\twindows.JobObjectExtendedLimitInformation,\n\t\tunsafe.Pointer(&info),\n\t\tuint32(unsafe.Sizeof(info)),\n\t\tnil,\n\t); err != nil {\n\t\treturn nil, fmt.Errorf(\"query %v returned error: %w\", info, err)\n\t}\n\treturn &info, nil\n}\n\n// Helper function for getting a job object's CPU rate control information.\nfunc (job *JobObject) getCPURateControlInformation() (*winapi.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION, error) {\n\tjob.handleLock.RLock()\n\tdefer job.handleLock.RUnlock()\n\n\tif job.handle == 0 {\n\t\treturn nil, ErrAlreadyClosed\n\t}\n\n\tinfo := winapi.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION{}\n\tif err := winapi.QueryInformationJobObject(\n\t\tjob.handle,\n\t\twindows.JobObjectCpuRateControlInformation,\n\t\tunsafe.Pointer(&info),\n\t\tuint32(unsafe.Sizeof(info)),\n\t\tnil,\n\t); err != nil {\n\t\treturn nil, fmt.Errorf(\"query %v returned error: %w\", info, err)\n\t}\n\treturn &info, nil\n}\n\n// Helper function for setting a job object's extended information.\nfunc (job *JobObject) setExtendedInformation(info *windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION) error {\n\tjob.handleLock.RLock()\n\tdefer job.handleLock.RUnlock()\n\n\tif job.handle == 0 {\n\t\treturn ErrAlreadyClosed\n\t}\n\n\tif _, err := windows.SetInformationJobObject(\n\t\tjob.handle,\n\t\twindows.JobObjectExtendedLimitInformation,\n\t\tuintptr(unsafe.Pointer(info)),\n\t\tuint32(unsafe.Sizeof(*info)),\n\t); err != nil {\n\t\treturn fmt.Errorf(\"failed to set Extended info %v on job object: %w\", info, err)\n\t}\n\treturn nil\n}\n\n// Helper function for querying job handle for IO limit information.\nfunc (job *JobObject) getIOLimit() (*winapi.JOBOBJECT_IO_RATE_CONTROL_INFORMATION, error) {\n\tjob.handleLock.RLock()\n\tdefer job.handleLock.RUnlock()\n\n\tif job.handle == 0 {\n\t\treturn nil, ErrAlreadyClosed\n\t}\n\n\tioInfo := &winapi.JOBOBJECT_IO_RATE_CONTROL_INFORMATION{}\n\tvar blockCount uint32 = 1\n\n\tif _, err := winapi.QueryIoRateControlInformationJobObject(\n\t\tjob.handle,\n\t\tnil,\n\t\t&ioInfo,\n\t\t&blockCount,\n\t); err != nil {\n\t\treturn nil, fmt.Errorf(\"query %v returned error: %w\", ioInfo, err)\n\t}\n\n\tif !isFlagSet(winapi.JOB_OBJECT_IO_RATE_CONTROL_ENABLE, ioInfo.ControlFlags) {\n\t\treturn nil, fmt.Errorf(\"query %v cannot get IO limits for job object without IO rate control option set\", ioInfo)\n\t}\n\treturn ioInfo, nil\n}\n\n// Helper function for setting a job object's IO rate control information.\nfunc (job *JobObject) setIORateControlInfo(ioInfo *winapi.JOBOBJECT_IO_RATE_CONTROL_INFORMATION) error {\n\tjob.handleLock.RLock()\n\tdefer job.handleLock.RUnlock()\n\n\tif job.handle == 0 {\n\t\treturn ErrAlreadyClosed\n\t}\n\n\tif _, err := winapi.SetIoRateControlInformationJobObject(job.handle, ioInfo); err != nil {\n\t\treturn fmt.Errorf(\"failed to set IO limit info %v on job object: %w\", ioInfo, err)\n\t}\n\treturn nil\n}\n\n// Helper function for setting a job object's CPU rate control information.\nfunc (job *JobObject) setCPURateControlInfo(cpuInfo *winapi.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION) error {\n\tjob.handleLock.RLock()\n\tdefer job.handleLock.RUnlock()\n\n\tif job.handle == 0 {\n\t\treturn ErrAlreadyClosed\n\t}\n\tif _, err := windows.SetInformationJobObject(\n\t\tjob.handle,\n\t\twindows.JobObjectCpuRateControlInformation,\n\t\tuintptr(unsafe.Pointer(cpuInfo)),\n\t\tuint32(unsafe.Sizeof(cpuInfo)),\n\t); err != nil {\n\t\treturn fmt.Errorf(\"failed to set cpu limit info %v on job object: %w\", cpuInfo, err)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/log/context.go",
    "content": "package log\n\nimport (\n\t\"context\"\n\n\t\"github.com/sirupsen/logrus\"\n)\n\ntype entryContextKeyType int\n\nconst _entryContextKey entryContextKeyType = iota\n\nvar (\n\t// L is the default, blank logging entry. WithField and co. all return a copy\n\t// of the original entry, so this will not leak fields between calls.\n\t//\n\t// Do NOT modify fields directly, as that will corrupt state for all users and\n\t// is not thread safe.\n\t// Instead, use `L.With*` or `L.Dup()`. Or `G(context.Background())`.\n\tL = logrus.NewEntry(logrus.StandardLogger())\n\n\t// G is an alias for GetEntry.\n\tG = GetEntry\n\n\t// S is an alias for SetEntry.\n\tS = SetEntry\n\n\t// U is an alias for UpdateContext.\n\tU = UpdateContext\n)\n\n// GetEntry returns a `logrus.Entry` stored in the context, if one exists.\n// Otherwise, it returns a default entry that points to the current context.\n//\n// Note: if the a new entry is returned, it will reference the passed in context.\n// However, existing contexts may be stored in parent contexts and additionally reference\n// earlier contexts.\n// Use `UpdateContext` to update the entry and context.\nfunc GetEntry(ctx context.Context) *logrus.Entry {\n\tentry := fromContext(ctx)\n\n\tif entry == nil {\n\t\tentry = L.WithContext(ctx)\n\t}\n\n\treturn entry\n}\n\n// SetEntry updates the log entry in the context with the provided fields, and\n// returns both. It is equivalent to:\n//\n//\tentry := GetEntry(ctx).WithFields(fields)\n//\tctx = WithContext(ctx, entry)\n//\n// See WithContext for more information.\nfunc SetEntry(ctx context.Context, fields logrus.Fields) (context.Context, *logrus.Entry) {\n\te := GetEntry(ctx)\n\tif len(fields) > 0 {\n\t\te = e.WithFields(fields)\n\t}\n\treturn WithContext(ctx, e)\n}\n\n// UpdateContext extracts the log entry from the context, and, if the entry's\n// context points to a parent's of the current context, ands the entry\n// to the most recent context. It is equivalent to:\n//\n//\tentry := GetEntry(ctx)\n//\tctx = WithContext(ctx, entry)\n//\n// This allows the entry to reference the most recent context and any new\n// values (such as span contexts) added to it.\n//\n// See WithContext for more information.\nfunc UpdateContext(ctx context.Context) context.Context {\n\t// there is no way to check its ctx (and not one of its parents) that contains `e`\n\t// so, at a slight cost, force add `e` to the context\n\tctx, _ = WithContext(ctx, GetEntry(ctx))\n\treturn ctx\n}\n\n// WithContext returns a context that contains the provided log entry.\n// The entry can be extracted with `GetEntry` (`G`)\n//\n// The entry in the context is a copy of `entry` (generated by `entry.WithContext`).\nfunc WithContext(ctx context.Context, entry *logrus.Entry) (context.Context, *logrus.Entry) {\n\t// regardless of the order, entry.Context != GetEntry(ctx)\n\t// here, the returned entry will reference the supplied context\n\tentry = entry.WithContext(ctx)\n\tctx = context.WithValue(ctx, _entryContextKey, entry)\n\n\treturn ctx, entry\n}\n\nfunc fromContext(ctx context.Context) *logrus.Entry {\n\te, _ := ctx.Value(_entryContextKey).(*logrus.Entry)\n\treturn e\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/log/format.go",
    "content": "package log\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net\"\n\t\"reflect\"\n\t\"time\"\n\n\t\"github.com/sirupsen/logrus\"\n\t\"google.golang.org/protobuf/encoding/protojson\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\n// TimeFormat is [time.RFC3339Nano] with nanoseconds padded using\n// zeros to ensure the formatted time is always the same number of\n// characters.\n// Based on RFC3339NanoFixed from github.com/containerd/log\nconst TimeFormat = \"2006-01-02T15:04:05.000000000Z07:00\"\n\nfunc FormatTime(t time.Time) string {\n\treturn t.Format(TimeFormat)\n}\n\n// DurationFormat formats a [time.Duration] log entry.\n//\n// A nil value signals an error with the formatting.\ntype DurationFormat func(time.Duration) interface{}\n\nfunc DurationFormatString(d time.Duration) interface{}       { return d.String() }\nfunc DurationFormatSeconds(d time.Duration) interface{}      { return d.Seconds() }\nfunc DurationFormatMilliseconds(d time.Duration) interface{} { return d.Milliseconds() }\n\n// FormatIO formats net.Conn and other types that have an `Addr()` or `Name()`.\n//\n// See FormatEnabled for more information.\nfunc FormatIO(ctx context.Context, v interface{}) string {\n\tm := make(map[string]string)\n\tm[\"type\"] = reflect.TypeOf(v).String()\n\n\tswitch t := v.(type) {\n\tcase net.Conn:\n\t\tm[\"localAddress\"] = formatAddr(t.LocalAddr())\n\t\tm[\"remoteAddress\"] = formatAddr(t.RemoteAddr())\n\tcase interface{ Addr() net.Addr }:\n\t\tm[\"address\"] = formatAddr(t.Addr())\n\tdefault:\n\t\treturn Format(ctx, t)\n\t}\n\n\treturn Format(ctx, m)\n}\n\nfunc formatAddr(a net.Addr) string {\n\treturn a.Network() + \"://\" + a.String()\n}\n\n// Format formats an object into a JSON string, without any indendtation or\n// HTML escapes.\n// Context is used to output a log waring if the conversion fails.\n//\n// This is intended primarily for `trace.StringAttribute()`\nfunc Format(ctx context.Context, v interface{}) string {\n\tb, err := encode(v)\n\tif err != nil {\n\t\t// logging errors aren't really warning worthy, and can potentially spam a lot of logs out\n\t\tG(ctx).WithFields(logrus.Fields{\n\t\t\tlogrus.ErrorKey: err,\n\t\t\t\"type\":          fmt.Sprintf(\"%T\", v),\n\t\t}).Debug(\"could not format value\")\n\t\treturn \"\"\n\t}\n\n\treturn string(b)\n}\n\nfunc encode(v interface{}) (_ []byte, err error) {\n\tif m, ok := v.(proto.Message); ok {\n\t\t// use canonical JSON encoding for protobufs (instead of [encoding/json])\n\t\t// https://protobuf.dev/programming-guides/proto3/#json\n\t\tvar b []byte\n\t\tb, err = protojson.MarshalOptions{\n\t\t\tAllowPartial: true,\n\t\t\t// protobuf defaults to camel case for JSON encoding; use proto field name instead (snake case)\n\t\t\tUseProtoNames: true,\n\t\t}.Marshal(m)\n\t\tif err == nil {\n\t\t\t// the protojson marshaller tries to unmarshal anypb.Any fields, which can\n\t\t\t// fail for types encoded with \"github.com/containerd/typeurl/v2\"\n\t\t\t// we can try creating a dedicated protoregistry.MessageTypeResolver that uses typeurl, but, its\n\t\t\t// more robust to fall back on json marshalling for errors in general\n\t\t\treturn b, nil\n\t\t}\n\n\t}\n\n\tbuf := &bytes.Buffer{}\n\tenc := json.NewEncoder(buf)\n\tenc.SetEscapeHTML(false)\n\tenc.SetIndent(\"\", \"\")\n\n\tif jErr := enc.Encode(v); jErr != nil {\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"protojson encoding: %w; json encoding: %w\", err, jErr)\n\t\t}\n\t\treturn nil, fmt.Errorf(\"json encoding: %w\", jErr)\n\t}\n\n\t// encoder.Encode appends a newline to the end\n\treturn bytes.TrimSpace(buf.Bytes()), nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/log/hook.go",
    "content": "package log\n\nimport (\n\t\"bytes\"\n\t\"reflect\"\n\t\"time\"\n\n\t\"github.com/Microsoft/hcsshim/internal/logfields\"\n\t\"github.com/sirupsen/logrus\"\n\t\"go.opencensus.io/trace\"\n)\n\nconst nullString = \"null\"\n\n// Hook intercepts and formats a [logrus.Entry] before it logged.\n//\n// The shim either outputs the logs through an ETW hook, discarding the (formatted) output\n// or logs output to a pipe for logging binaries to consume.\n// The Linux GCS outputs logrus entries over stdout, which is then consumed and re-output\n// by the shim.\ntype Hook struct {\n\t// EncodeAsJSON formats structs, maps, arrays, slices, and [bytes.Buffer] as JSON.\n\t// Variables of [bytes.Buffer] will be converted to []byte.\n\t//\n\t// Default is false.\n\tEncodeAsJSON bool\n\n\t// FormatTime specifies the format for [time.Time] variables.\n\t// An empty string disables formatting.\n\t// When disabled, the fall back will the JSON encoding, if enabled.\n\t//\n\t// Default is [TimeFormat].\n\tTimeFormat string\n\n\t// Duration format converts a [time.Duration] fields to an appropriate encoding.\n\t// nil disables formatting.\n\t// When disabled, the fall back will the JSON encoding, if enabled.\n\t//\n\t// Default is [DurationFormatString], which appends a duration unit after the value.\n\tDurationFormat DurationFormat\n\n\t// AddSpanContext adds [logfields.TraceID] and [logfields.SpanID] fields to\n\t// the entry from the span context stored in [logrus.Entry.Context], if it exists.\n\tAddSpanContext bool\n}\n\nvar _ logrus.Hook = &Hook{}\n\nfunc NewHook() *Hook {\n\treturn &Hook{\n\t\tTimeFormat:     TimeFormat,\n\t\tDurationFormat: DurationFormatString,\n\t\tAddSpanContext: true,\n\t}\n}\n\nfunc (h *Hook) Levels() []logrus.Level {\n\treturn logrus.AllLevels\n}\n\nfunc (h *Hook) Fire(e *logrus.Entry) (err error) {\n\t// JSON encode, if necessary, then add span information\n\th.encode(e)\n\th.addSpanContext(e)\n\n\treturn nil\n}\n\n// encode loops through all the fields in the [logrus.Entry] and encodes them according to\n// the settings in [Hook].\n// If [Hook.TimeFormat] is non-empty, it will be passed to [time.Time.Format] for\n// fields of type [time.Time].\n//\n// If [Hook.EncodeAsJSON] is true, then fields that are not numeric, boolean, strings, or\n// errors will be encoded via a [json.Marshal] (with HTML escaping disabled).\n// Chanel- and function-typed fields, as well as unsafe pointers are left alone and not encoded.\n//\n// If [Hook.TimeFormat] and [Hook.DurationFormat] are empty and [Hook.EncodeAsJSON] is false,\n// then this is a no-op.\nfunc (h *Hook) encode(e *logrus.Entry) {\n\td := e.Data\n\n\tformatTime := h.TimeFormat != \"\"\n\tformatDuration := h.DurationFormat != nil\n\tif !(h.EncodeAsJSON || formatTime || formatDuration) {\n\t\treturn\n\t}\n\n\tfor k, v := range d {\n\t\t// encode types with dedicated formatting options first\n\n\t\tif vv, ok := v.(time.Time); formatTime && ok {\n\t\t\td[k] = vv.Format(h.TimeFormat)\n\t\t\tcontinue\n\t\t}\n\n\t\tif vv, ok := v.(time.Duration); formatDuration && ok {\n\t\t\td[k] = h.DurationFormat(vv)\n\t\t\tcontinue\n\t\t}\n\n\t\t// general case JSON encoding\n\n\t\tif !h.EncodeAsJSON {\n\t\t\tcontinue\n\t\t}\n\n\t\tswitch vv := v.(type) {\n\t\t// built in types\n\t\t// \"json\" marshals errors as \"{}\", so leave alone here\n\t\tcase bool, string, error, uintptr,\n\t\t\tint8, int16, int32, int64, int,\n\t\t\tuint8, uint32, uint64, uint,\n\t\t\tfloat32, float64:\n\t\t\tcontinue\n\n\t\t// Rather than setting d[k] = vv.String(), JSON encode []byte value, since it\n\t\t// may be a binary payload and not representable as a string.\n\t\t// `case bytes.Buffer,*bytes.Buffer:` resolves `vv` to `interface{}`,\n\t\t// so cannot use `vv.Bytes`.\n\t\t// Could move to below the `reflect.Indirect()` call below, but\n\t\t// that would require additional typematching and dereferencing.\n\t\t// Easier to keep these duplicate branches here.\n\t\tcase bytes.Buffer:\n\t\t\tv = vv.Bytes()\n\t\tcase *bytes.Buffer:\n\t\t\tv = vv.Bytes()\n\t\t}\n\n\t\t// dereference pointer or interface variables\n\t\trv := reflect.Indirect(reflect.ValueOf(v))\n\t\t// check if `v` is a null pointer\n\t\tif !rv.IsValid() {\n\t\t\td[k] = nullString\n\t\t\tcontinue\n\t\t}\n\n\t\tswitch rv.Kind() {\n\t\tcase reflect.Map, reflect.Struct, reflect.Array, reflect.Slice:\n\t\tdefault:\n\t\t\t// Bool, [U]?Int*, Float*, Complex*, Uintptr, String: encoded as normal\n\t\t\t// Chan, Func: not supported by json\n\t\t\t// Interface, Pointer: dereferenced above\n\t\t\t// UnsafePointer: not supported by json, not safe to de-reference; leave alone\n\t\t\tcontinue\n\t\t}\n\n\t\tb, err := encode(v)\n\t\tif err != nil {\n\t\t\t// Errors are written to stderr (ie, to `panic.log`) and stops the remaining\n\t\t\t// hooks (ie, exporting to ETW) from firing. So add encoding errors to\n\t\t\t// the entry data to be written out, but keep on processing.\n\t\t\td[k+\"-\"+logrus.ErrorKey] = err.Error()\n\t\t\t// keep the original `v` as the value,\n\t\t\tcontinue\n\t\t}\n\t\td[k] = string(b)\n\t}\n}\n\nfunc (h *Hook) addSpanContext(e *logrus.Entry) {\n\tctx := e.Context\n\tif !h.AddSpanContext || ctx == nil {\n\t\treturn\n\t}\n\tspan := trace.FromContext(ctx)\n\tif span == nil {\n\t\treturn\n\t}\n\tsctx := span.SpanContext()\n\te.Data[logfields.TraceID] = sctx.TraceID.String()\n\te.Data[logfields.SpanID] = sctx.SpanID.String()\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/log/nopformatter.go",
    "content": "package log\n\nimport (\n\t\"github.com/sirupsen/logrus\"\n)\n\ntype NopFormatter struct{}\n\nvar _ logrus.Formatter = NopFormatter{}\n\n// Format does nothing and returns a nil slice.\nfunc (NopFormatter) Format(*logrus.Entry) ([]byte, error) { return nil, nil }\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/log/scrub.go",
    "content": "package log\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"sync/atomic\"\n\n\thcsschema \"github.com/Microsoft/hcsshim/internal/hcs/schema2\"\n)\n\n// This package scrubs objects of potentially sensitive information to pass to logging\n\ntype genMap = map[string]interface{}\ntype scrubberFunc func(genMap) error\n\nconst _scrubbedReplacement = \"<scrubbed>\"\n\nvar (\n\tErrUnknownType = errors.New(\"encoded object is of unknown type\")\n\n\t// case sensitive keywords, so \"env\" is not a substring on \"Environment\"\n\t_scrubKeywords = [][]byte{[]byte(\"env\"), []byte(\"Environment\")}\n\n\t_scrub atomic.Bool\n)\n\n// SetScrubbing enables scrubbing\nfunc SetScrubbing(enable bool) { _scrub.Store(enable) }\n\n// IsScrubbingEnabled checks if scrubbing is enabled\nfunc IsScrubbingEnabled() bool { return _scrub.Load() }\n\n// ScrubProcessParameters scrubs HCS Create Process requests with config parameters of\n// type internal/hcs/schema2.ScrubProcessParameters (aka hcsshema.ScrubProcessParameters)\nfunc ScrubProcessParameters(s string) (string, error) {\n\t// todo: deal with v1 ProcessConfig\n\tb := []byte(s)\n\tif !IsScrubbingEnabled() || !hasKeywords(b) || !json.Valid(b) {\n\t\treturn s, nil\n\t}\n\n\tpp := hcsschema.ProcessParameters{}\n\tif err := json.Unmarshal(b, &pp); err != nil {\n\t\treturn \"\", err\n\t}\n\tpp.Environment = map[string]string{_scrubbedReplacement: _scrubbedReplacement}\n\n\tb, err := encode(pp)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn string(b), nil\n}\n\n// ScrubBridgeCreate scrubs requests sent over the bridge of type\n// internal/gcs/protocol.containerCreate wrapping an internal/hcsoci.linuxHostedSystem\nfunc ScrubBridgeCreate(b []byte) ([]byte, error) {\n\treturn scrubBytes(b, scrubBridgeCreate)\n}\n\nfunc scrubBridgeCreate(m genMap) error {\n\tif !isRequestBase(m) {\n\t\treturn ErrUnknownType\n\t}\n\tif ss, ok := m[\"ContainerConfig\"]; ok {\n\t\t// ContainerConfig is a json encoded struct passed as a regular string field\n\t\ts, ok := ss.(string)\n\t\tif !ok {\n\t\t\treturn ErrUnknownType\n\t\t}\n\t\tb, err := scrubBytes([]byte(s), scrubLinuxHostedSystem)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tm[\"ContainerConfig\"] = string(b)\n\t\treturn nil\n\t}\n\treturn ErrUnknownType\n}\n\nfunc scrubLinuxHostedSystem(m genMap) error {\n\tif m, ok := index(m, \"OciSpecification\"); ok { //nolint:govet // shadow\n\t\tif _, ok := m[\"annotations\"]; ok {\n\t\t\tm[\"annotations\"] = map[string]string{_scrubbedReplacement: _scrubbedReplacement}\n\t\t}\n\t\tif m, ok := index(m, \"process\"); ok { //nolint:govet // shadow\n\t\t\tif _, ok := m[\"env\"]; ok {\n\t\t\t\tm[\"env\"] = []string{_scrubbedReplacement}\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\treturn ErrUnknownType\n}\n\n// ScrubBridgeExecProcess scrubs requests sent over the bridge of type\n// internal/gcs/protocol.containerExecuteProcess\nfunc ScrubBridgeExecProcess(b []byte) ([]byte, error) {\n\treturn scrubBytes(b, scrubExecuteProcess)\n}\n\nfunc scrubExecuteProcess(m genMap) error {\n\tif !isRequestBase(m) {\n\t\treturn ErrUnknownType\n\t}\n\tif m, ok := index(m, \"Settings\"); ok { //nolint:govet // shadow\n\t\tif ss, ok := m[\"ProcessParameters\"]; ok {\n\t\t\t// ProcessParameters is a json encoded struct passed as a regular sting field\n\t\t\ts, ok := ss.(string)\n\t\t\tif !ok {\n\t\t\t\treturn ErrUnknownType\n\t\t\t}\n\n\t\t\ts, err := ScrubProcessParameters(s)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tm[\"ProcessParameters\"] = s\n\t\t\treturn nil\n\t\t}\n\t}\n\treturn ErrUnknownType\n}\n\nfunc scrubBytes(b []byte, scrub scrubberFunc) ([]byte, error) {\n\tif !IsScrubbingEnabled() || !hasKeywords(b) || !json.Valid(b) {\n\t\treturn b, nil\n\t}\n\n\tm := make(genMap)\n\tif err := json.Unmarshal(b, &m); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// could use regexp, but if the env strings contain braces, the regexp fails\n\t// parsing into individual structs would require access to private structs\n\tif err := scrub(m); err != nil {\n\t\treturn nil, err\n\t}\n\n\tb, err := encode(m)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn b, nil\n}\n\nfunc isRequestBase(m genMap) bool {\n\t// neither of these are (currently) `omitempty`\n\t_, a := m[\"ActivityId\"]\n\t_, c := m[\"ContainerId\"]\n\treturn a && c\n}\n\n// combination `m, ok := m[s]` and `m, ok := m.(genMap)`\nfunc index(m genMap, s string) (genMap, bool) {\n\tif m, ok := m[s]; ok {\n\t\tmm, ok := m.(genMap)\n\t\treturn mm, ok\n\t}\n\n\treturn m, false\n}\n\nfunc hasKeywords(b []byte) bool {\n\tfor _, bb := range _scrubKeywords {\n\t\tif bytes.Contains(b, bb) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/logfields/fields.go",
    "content": "package logfields\n\nconst (\n\t// Identifiers\n\n\tName      = \"name\"\n\tNamespace = \"namespace\"\n\tOperation = \"operation\"\n\n\tID          = \"id\"\n\tSandboxID   = \"sid\"\n\tContainerID = \"cid\"\n\tExecID      = \"eid\"\n\tProcessID   = \"pid\"\n\tTaskID      = \"tid\"\n\tUVMID       = \"uvm-id\"\n\n\t// networking and IO\n\n\tFile  = \"file\"\n\tPath  = \"path\"\n\tBytes = \"bytes\"\n\tPipe  = \"pipe\"\n\n\t// Common Misc\n\n\tAttempt = \"attemptNo\"\n\tJSON    = \"json\"\n\n\t// Time\n\n\tStartTime = \"startTime\"\n\tEndTime   = \"endTime\"\n\tDuration  = \"duration\"\n\tTimeout   = \"timeout\"\n\n\t// Keys/values\n\n\tField         = \"field\"\n\tKey           = \"key\"\n\tOCIAnnotation = \"oci-annotation\"\n\tValue         = \"value\"\n\tOptions       = \"options\"\n\n\t// Golang type's\n\n\tExpectedType = \"expected-type\"\n\tBool         = \"bool\"\n\tInt32        = \"int32\"\n\tUint32       = \"uint32\"\n\tUint64       = \"uint64\"\n\n\t// runhcs\n\n\tVMShimOperation = \"vmshim-op\"\n\n\t// logging and tracing\n\n\tTraceID      = \"traceID\"\n\tSpanID       = \"spanID\"\n\tParentSpanID = \"parentSpanID\"\n)\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/longpath/longpath.go",
    "content": "package longpath\n\nimport (\n\t\"path/filepath\"\n\t\"strings\"\n)\n\n// LongAbs makes a path absolute and returns it in NT long path form.\nfunc LongAbs(path string) (string, error) {\n\tif strings.HasPrefix(path, `\\\\?\\`) || strings.HasPrefix(path, `\\\\.\\`) {\n\t\treturn path, nil\n\t}\n\tif !filepath.IsAbs(path) {\n\t\tabsPath, err := filepath.Abs(path)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tpath = absPath\n\t}\n\tif strings.HasPrefix(path, `\\\\`) {\n\t\treturn `\\\\?\\UNC\\` + path[2:], nil\n\t}\n\treturn `\\\\?\\` + path, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/memory/pool.go",
    "content": "package memory\n\nimport (\n\t\"github.com/pkg/errors\"\n)\n\nconst (\n\tminimumClassSize  = MiB\n\tmaximumClassSize  = 4 * GiB\n\tmemoryClassNumber = 7\n)\n\nvar (\n\tErrInvalidMemoryClass = errors.New(\"invalid memory class\")\n\tErrEarlyMerge         = errors.New(\"not all children have been freed\")\n\tErrEmptyPoolOperation = errors.New(\"operation on empty pool\")\n)\n\n// GetMemoryClassType returns the minimum memory class type that can hold a device of\n// a given size. The smallest class is 1MB and the largest one is 4GB with 2 bit offset\n// intervals in between, for a total of 7 different classes. This function does not\n// do a validity check\nfunc GetMemoryClassType(s uint64) classType {\n\ts = (s - 1) >> 20\n\tmemCls := uint32(0)\n\tfor s > 0 {\n\t\ts = s >> 2\n\t\tmemCls++\n\t}\n\treturn classType(memCls)\n}\n\n// GetMemoryClassSize returns size in bytes for a given memory class\nfunc GetMemoryClassSize(memCls classType) (uint64, error) {\n\tif memCls >= memoryClassNumber {\n\t\treturn 0, ErrInvalidMemoryClass\n\t}\n\treturn minimumClassSize << (2 * memCls), nil\n}\n\n// region represents a contiguous memory block\ntype region struct {\n\t// parent region that has been split into 4\n\tparent *region\n\tclass  classType\n\t// offset represents offset in bytes\n\toffset uint64\n}\n\n// memoryPool tracks free and busy (used) memory regions\ntype memoryPool struct {\n\tfree map[uint64]*region\n\tbusy map[uint64]*region\n}\n\n// PoolAllocator implements a memory allocation strategy similar to buddy-malloc https://github.com/evanw/buddy-malloc/blob/master/buddy-malloc.c\n// We borrow the idea of spanning a tree of fixed size regions on top of a contiguous memory\n// space.\n//\n// There are a total of 7 different region sizes that can be allocated, with the smallest\n// being 1MB and the largest 4GB (the default maximum size of a Virtual PMem device).\n//\n// For efficiency and to reduce fragmentation an entire region is allocated when requested.\n// When there's no available region of requested size, we try to allocate more memory for\n// this particular size by splitting the next available larger region into smaller ones, e.g.\n// if there's no region available for size class 0, we try splitting a region from class 1,\n// then class 2 etc, until we are able to do so or hit the upper limit.\ntype PoolAllocator struct {\n\tpools [memoryClassNumber]*memoryPool\n}\n\nvar _ MappedRegion = &region{}\nvar _ Allocator = &PoolAllocator{}\n\nfunc (r *region) Offset() uint64 {\n\treturn r.offset\n}\n\nfunc (r *region) Size() uint64 {\n\tsz, err := GetMemoryClassSize(r.class)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn sz\n}\n\nfunc (r *region) Type() classType {\n\treturn r.class\n}\n\nfunc newEmptyMemoryPool() *memoryPool {\n\treturn &memoryPool{\n\t\tfree: make(map[uint64]*region),\n\t\tbusy: make(map[uint64]*region),\n\t}\n}\n\nfunc NewPoolMemoryAllocator() PoolAllocator {\n\tpa := PoolAllocator{}\n\tp := newEmptyMemoryPool()\n\t// by default we allocate a single region with maximum possible size (class type)\n\tp.free[0] = &region{\n\t\tclass:  memoryClassNumber - 1,\n\t\toffset: 0,\n\t}\n\tpa.pools[memoryClassNumber-1] = p\n\treturn pa\n}\n\n// Allocate checks memory region pool for the given `size` and returns a free region with\n// minimal offset, if none available tries expanding matched memory pool.\n//\n// Internally it's done via moving a region from free pool into a busy pool\nfunc (pa *PoolAllocator) Allocate(size uint64) (MappedRegion, error) {\n\tmemCls := GetMemoryClassType(size)\n\tif memCls >= memoryClassNumber {\n\t\treturn nil, ErrInvalidMemoryClass\n\t}\n\n\t// find region with the smallest offset\n\tnextCls, nextOffset, err := pa.findNextOffset(memCls)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// this means that there are no more regions for the current class, try expanding\n\tif nextCls != memCls {\n\t\tif err := pa.split(memCls); err != nil {\n\t\t\tif errors.Is(err, ErrInvalidMemoryClass) {\n\t\t\t\treturn nil, ErrNotEnoughSpace\n\t\t\t}\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tif err := pa.markBusy(memCls, nextOffset); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// by this point memory pool for memCls should have been created,\n\t// either prior or during split call\n\tif r := pa.pools[memCls].busy[nextOffset]; r != nil {\n\t\treturn r, nil\n\t}\n\n\treturn nil, ErrNotEnoughSpace\n}\n\n// Release marks a memory region of class `memCls` and offset `offset` as free and tries to merge smaller regions into\n// a bigger one.\nfunc (pa *PoolAllocator) Release(reg MappedRegion) error {\n\tmp := pa.pools[reg.Type()]\n\tif mp == nil {\n\t\treturn ErrEmptyPoolOperation\n\t}\n\n\terr := pa.markFree(reg.Type(), reg.Offset())\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tn := mp.free[reg.Offset()]\n\tif n == nil {\n\t\treturn ErrNotAllocated\n\t}\n\tif err := pa.merge(n.parent); err != nil {\n\t\tif !errors.Is(err, ErrEarlyMerge) {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// findNextOffset finds next region location for a given memCls\nfunc (pa *PoolAllocator) findNextOffset(memCls classType) (classType, uint64, error) {\n\tfor mc := memCls; mc < memoryClassNumber; mc++ {\n\t\tpi := pa.pools[mc]\n\t\tif pi == nil || len(pi.free) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\ttarget := uint64(maximumClassSize)\n\t\tfor offset := range pi.free {\n\t\t\tif offset < target {\n\t\t\t\ttarget = offset\n\t\t\t}\n\t\t}\n\t\treturn mc, target, nil\n\t}\n\treturn 0, 0, ErrNotEnoughSpace\n}\n\n// split tries to recursively split a bigger memory region into smaller ones until it succeeds or hits the upper limit\nfunc (pa *PoolAllocator) split(clsType classType) error {\n\tnextClsType := clsType + 1\n\tif nextClsType >= memoryClassNumber {\n\t\treturn ErrInvalidMemoryClass\n\t}\n\n\tnextPool := pa.pools[nextClsType]\n\tif nextPool == nil {\n\t\tnextPool = newEmptyMemoryPool()\n\t\tpa.pools[nextClsType] = nextPool\n\t}\n\n\tcls, offset, err := pa.findNextOffset(nextClsType)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// not enough memory in the next class, try to recursively expand\n\tif cls != nextClsType {\n\t\tif err := pa.split(nextClsType); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif err := pa.markBusy(nextClsType, offset); err != nil {\n\t\treturn err\n\t}\n\n\t// memCls validity has been checked already, we can ignore the error\n\tclsSize, _ := GetMemoryClassSize(clsType)\n\n\tnextReg := nextPool.busy[offset]\n\tif nextReg == nil {\n\t\treturn ErrNotAllocated\n\t}\n\n\t// expand memCls\n\tcp := pa.pools[clsType]\n\tif cp == nil {\n\t\tcp = newEmptyMemoryPool()\n\t\tpa.pools[clsType] = cp\n\t}\n\t// create 4 smaller regions\n\tfor i := uint64(0); i < 4; i++ {\n\t\toffset := nextReg.offset + i*clsSize\n\t\treg := &region{\n\t\t\tparent: nextReg,\n\t\t\tclass:  clsType,\n\t\t\toffset: offset,\n\t\t}\n\t\tcp.free[offset] = reg\n\t}\n\treturn nil\n}\n\nfunc (pa *PoolAllocator) merge(parent *region) error {\n\t// nothing to merge\n\tif parent == nil {\n\t\treturn nil\n\t}\n\n\tchildCls := parent.class - 1\n\tchildPool := pa.pools[childCls]\n\t// no child nodes to merge, try to merge parent\n\tif childPool == nil {\n\t\treturn pa.merge(parent.parent)\n\t}\n\n\tchildSize, err := GetMemoryClassSize(childCls)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// check if all the child nodes are free\n\tvar children []*region\n\tfor i := uint64(0); i < 4; i++ {\n\t\tchild, free := childPool.free[parent.offset+i*childSize]\n\t\tif !free {\n\t\t\treturn ErrEarlyMerge\n\t\t}\n\t\tchildren = append(children, child)\n\t}\n\n\t// at this point all the child nodes will be free and we can merge\n\tfor _, child := range children {\n\t\tdelete(childPool.free, child.offset)\n\t}\n\n\tif err := pa.markFree(parent.class, parent.offset); err != nil {\n\t\treturn err\n\t}\n\n\treturn pa.merge(parent.parent)\n}\n\n// markFree internally moves a region with `offset` from busy to free map\nfunc (pa *PoolAllocator) markFree(memCls classType, offset uint64) error {\n\tclsPool := pa.pools[memCls]\n\tif clsPool == nil {\n\t\treturn ErrEmptyPoolOperation\n\t}\n\n\tif reg, exists := clsPool.busy[offset]; exists {\n\t\tclsPool.free[offset] = reg\n\t\tdelete(clsPool.busy, offset)\n\t\treturn nil\n\t}\n\treturn ErrNotAllocated\n}\n\n// markBusy internally moves a region with `offset` from free to busy map\nfunc (pa *PoolAllocator) markBusy(memCls classType, offset uint64) error {\n\tclsPool := pa.pools[memCls]\n\tif clsPool == nil {\n\t\treturn ErrEmptyPoolOperation\n\t}\n\n\tif reg, exists := clsPool.free[offset]; exists {\n\t\tclsPool.busy[offset] = reg\n\t\tdelete(clsPool.free, offset)\n\t\treturn nil\n\t}\n\treturn ErrNotAllocated\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/memory/types.go",
    "content": "package memory\n\nimport \"github.com/pkg/errors\"\n\ntype classType uint32\n\nconst (\n\tMiB = 1024 * 1024\n\tGiB = 1024 * MiB\n)\n\nvar (\n\tErrNotEnoughSpace = errors.New(\"not enough space\")\n\tErrNotAllocated   = errors.New(\"no memory allocated at the given offset\")\n)\n\n// MappedRegion represents a memory block with an offset\ntype MappedRegion interface {\n\tOffset() uint64\n\tSize() uint64\n\tType() classType\n}\n\n// Allocator is an interface for memory allocation\ntype Allocator interface {\n\tAllocate(uint64) (MappedRegion, error)\n\tRelease(MappedRegion) error\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/mergemaps/merge.go",
    "content": "package mergemaps\n\nimport \"encoding/json\"\n\n// Merge recursively merges map `fromMap` into map `ToMap`. Any pre-existing values\n// in ToMap are overwritten. Values in fromMap are added to ToMap.\n// From http://stackoverflow.com/questions/40491438/merging-two-json-strings-in-golang\nfunc Merge(fromMap, ToMap interface{}) interface{} {\n\tswitch fromMap := fromMap.(type) {\n\tcase map[string]interface{}:\n\t\tToMap, ok := ToMap.(map[string]interface{})\n\t\tif !ok {\n\t\t\treturn fromMap\n\t\t}\n\t\tfor keyToMap, valueToMap := range ToMap {\n\t\t\tif valueFromMap, ok := fromMap[keyToMap]; ok {\n\t\t\t\tfromMap[keyToMap] = Merge(valueFromMap, valueToMap)\n\t\t\t} else {\n\t\t\t\tfromMap[keyToMap] = valueToMap\n\t\t\t}\n\t\t}\n\tcase nil:\n\t\t// merge(nil, map[string]interface{...}) -> map[string]interface{...}\n\t\tToMap, ok := ToMap.(map[string]interface{})\n\t\tif ok {\n\t\t\treturn ToMap\n\t\t}\n\t}\n\treturn fromMap\n}\n\n// MergeJSON merges the contents of a JSON string into an object representation,\n// returning a new object suitable for translating to JSON.\nfunc MergeJSON(object interface{}, additionalJSON []byte) (interface{}, error) {\n\tif len(additionalJSON) == 0 {\n\t\treturn object, nil\n\t}\n\tobjectJSON, err := json.Marshal(object)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar objectMap, newMap map[string]interface{}\n\terr = json.Unmarshal(objectJSON, &objectMap)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = json.Unmarshal(additionalJSON, &newMap)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn Merge(newMap, objectMap), nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/oc/errors.go",
    "content": "package oc\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"net\"\n\t\"os\"\n\n\terrdefs \"github.com/containerd/errdefs/pkg/errgrpc\"\n\t\"google.golang.org/grpc/codes\"\n\t\"google.golang.org/grpc/status\"\n)\n\n// todo: break import cycle with \"internal/hcs/errors.go\" and reference errors defined there\n// todo: add errors defined in \"internal/guest/gcserror\" (Hresult does not implement error)\n\nfunc toStatusCode(err error) codes.Code {\n\t// checks if err implements GRPCStatus() *\"google.golang.org/grpc/status\".Status,\n\t// wraps an error defined in \"github.com/containerd/errdefs\", or is a\n\t// context timeout or cancelled error\n\tif s, ok := status.FromError(errdefs.ToGRPC(err)); ok {\n\t\treturn s.Code()\n\t}\n\n\tswitch {\n\t// case isAny(err):\n\t// \treturn codes.Cancelled\n\tcase isAny(err, os.ErrInvalid):\n\t\treturn codes.InvalidArgument\n\tcase isAny(err, os.ErrDeadlineExceeded):\n\t\treturn codes.DeadlineExceeded\n\tcase isAny(err, os.ErrNotExist):\n\t\treturn codes.NotFound\n\tcase isAny(err, os.ErrExist):\n\t\treturn codes.AlreadyExists\n\tcase isAny(err, os.ErrPermission):\n\t\treturn codes.PermissionDenied\n\t// case isAny(err):\n\t// \treturn codes.ResourceExhausted\n\tcase isAny(err, os.ErrClosed, net.ErrClosed, io.ErrClosedPipe, io.ErrShortBuffer):\n\t\treturn codes.FailedPrecondition\n\t// case isAny(err):\n\t// \treturn codes.Aborted\n\t// case isAny(err):\n\t// \treturn codes.OutOfRange\n\t// case isAny(err):\n\t// \treturn codes.Unimplemented\n\tcase isAny(err, io.ErrNoProgress):\n\t\treturn codes.Internal\n\t// case isAny(err):\n\t// \treturn codes.Unavailable\n\tcase isAny(err, io.ErrShortWrite, io.ErrUnexpectedEOF):\n\t\treturn codes.DataLoss\n\t// case isAny(err):\n\t// \treturn codes.Unauthenticated\n\tdefault:\n\t\treturn codes.Unknown\n\t}\n}\n\n// isAny returns true if errors.Is is true for any of the provided errors, errs.\nfunc isAny(err error, errs ...error) bool {\n\tfor _, e := range errs {\n\t\tif errors.Is(err, e) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/oc/exporter.go",
    "content": "package oc\n\nimport (\n\t\"github.com/sirupsen/logrus\"\n\t\"go.opencensus.io/trace\"\n\t\"google.golang.org/grpc/codes\"\n\n\t\"github.com/Microsoft/hcsshim/internal/log\"\n\t\"github.com/Microsoft/hcsshim/internal/logfields\"\n)\n\nconst spanMessage = \"Span\"\n\nvar _errorCodeKey = logrus.ErrorKey + \"Code\"\n\n// LogrusExporter is an OpenCensus `trace.Exporter` that exports\n// `trace.SpanData` to logrus output.\ntype LogrusExporter struct{}\n\nvar _ trace.Exporter = &LogrusExporter{}\n\n// ExportSpan exports `s` based on the the following rules:\n//\n// 1. All output will contain `s.Attributes`, `s.SpanKind`, `s.TraceID`,\n// `s.SpanID`, and `s.ParentSpanID` for correlation\n//\n// 2. Any calls to .Annotate will not be supported.\n//\n// 3. The span itself will be written at `logrus.InfoLevel` unless\n// `s.Status.Code != 0` in which case it will be written at `logrus.ErrorLevel`\n// providing `s.Status.Message` as the error value.\nfunc (le *LogrusExporter) ExportSpan(s *trace.SpanData) {\n\tif s.DroppedAnnotationCount > 0 {\n\t\tlogrus.WithFields(logrus.Fields{\n\t\t\t\"name\":            s.Name,\n\t\t\tlogfields.TraceID: s.TraceID.String(),\n\t\t\tlogfields.SpanID:  s.SpanID.String(),\n\t\t\t\"dropped\":         s.DroppedAttributeCount,\n\t\t\t\"maxAttributes\":   len(s.Attributes),\n\t\t}).Warning(\"span had dropped attributes\")\n\t}\n\n\tentry := log.L.Dup()\n\t// Combine all span annotations with span data (eg, trace ID, span ID, parent span ID,\n\t// error, status code)\n\t// (OC) Span attributes are guaranteed to be  strings, bools, or int64s, so we can\n\t// can skip overhead in entry.WithFields() and add them directly to entry.Data.\n\t// Preallocate ahead of time, since we should add, at most, 10 additional entries\n\tdata := make(logrus.Fields, len(entry.Data)+len(s.Attributes)+10)\n\n\t// Default log entry may have prexisting/application-wide data\n\tfor k, v := range entry.Data {\n\t\tdata[k] = v\n\t}\n\tfor k, v := range s.Attributes {\n\t\tdata[k] = v\n\t}\n\n\tdata[logfields.Name] = s.Name\n\tdata[logfields.TraceID] = s.TraceID.String()\n\tdata[logfields.SpanID] = s.SpanID.String()\n\tdata[logfields.ParentSpanID] = s.ParentSpanID.String()\n\tdata[logfields.StartTime] = s.StartTime\n\tdata[logfields.EndTime] = s.EndTime\n\tdata[logfields.Duration] = s.EndTime.Sub(s.StartTime)\n\tif sk := spanKindToString(s.SpanKind); sk != \"\" {\n\t\tdata[\"spanKind\"] = sk\n\t}\n\n\tlevel := logrus.InfoLevel\n\tif s.Status.Code != 0 {\n\t\tlevel = logrus.ErrorLevel\n\n\t\t// don't overwrite an existing \"error\" or \"errorCode\" attributes\n\t\tif _, ok := data[logrus.ErrorKey]; !ok {\n\t\t\tdata[logrus.ErrorKey] = s.Status.Message\n\t\t}\n\t\tif _, ok := data[_errorCodeKey]; !ok {\n\t\t\tdata[_errorCodeKey] = codes.Code(s.Status.Code).String()\n\t\t}\n\t}\n\n\tentry.Data = data\n\tentry.Time = s.StartTime\n\tentry.Log(level, spanMessage)\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/oc/span.go",
    "content": "package oc\n\nimport (\n\t\"context\"\n\n\t\"github.com/Microsoft/hcsshim/internal/log\"\n\t\"go.opencensus.io/trace\"\n)\n\nvar DefaultSampler = trace.AlwaysSample()\n\n// SetSpanStatus sets `span.SetStatus` to the proper status depending on `err`. If\n// `err` is `nil` assumes `trace.StatusCodeOk`.\nfunc SetSpanStatus(span *trace.Span, err error) {\n\tstatus := trace.Status{}\n\tif err != nil {\n\t\tstatus.Code = int32(toStatusCode(err))\n\t\tstatus.Message = err.Error()\n\t}\n\tspan.SetStatus(status)\n}\n\n// StartSpan wraps \"go.opencensus.io/trace\".StartSpan, but, if the span is sampling,\n// adds a log entry to the context that points to the newly created span.\nfunc StartSpan(ctx context.Context, name string, o ...trace.StartOption) (context.Context, *trace.Span) {\n\tctx, s := trace.StartSpan(ctx, name, o...)\n\treturn update(ctx, s)\n}\n\n// StartSpanWithRemoteParent wraps \"go.opencensus.io/trace\".StartSpanWithRemoteParent.\n//\n// See StartSpan for more information.\nfunc StartSpanWithRemoteParent(ctx context.Context, name string, parent trace.SpanContext, o ...trace.StartOption) (context.Context, *trace.Span) {\n\tctx, s := trace.StartSpanWithRemoteParent(ctx, name, parent, o...)\n\treturn update(ctx, s)\n}\n\nfunc update(ctx context.Context, s *trace.Span) (context.Context, *trace.Span) {\n\tif s.IsRecordingEvents() {\n\t\tctx = log.UpdateContext(ctx)\n\t}\n\n\treturn ctx, s\n}\n\nvar WithServerSpanKind = trace.WithSpanKind(trace.SpanKindServer)\nvar WithClientSpanKind = trace.WithSpanKind(trace.SpanKindClient)\n\nfunc spanKindToString(sk int) string {\n\tswitch sk {\n\tcase trace.SpanKindClient:\n\t\treturn \"client\"\n\tcase trace.SpanKindServer:\n\t\treturn \"server\"\n\tdefault:\n\t\treturn \"\"\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/protocol/guestrequest/types.go",
    "content": "package guestrequest\n\n// These are constants for v2 schema modify requests.\n\ntype RequestType string\ntype ResourceType string\n\n// RequestType const.\nconst (\n\tRequestTypeAdd    RequestType = \"Add\"\n\tRequestTypeRemove RequestType = \"Remove\"\n\tRequestTypePreAdd RequestType = \"PreAdd\" // For networking\n\tRequestTypeUpdate RequestType = \"Update\"\n)\n\ntype SignalValueWCOW string\n\nconst (\n\tSignalValueWCOWCtrlC        SignalValueWCOW = \"CtrlC\"\n\tSignalValueWCOWCtrlBreak    SignalValueWCOW = \"CtrlBreak\"\n\tSignalValueWCOWCtrlClose    SignalValueWCOW = \"CtrlClose\"\n\tSignalValueWCOWCtrlLogOff   SignalValueWCOW = \"CtrlLogOff\"\n\tSignalValueWCOWCtrlShutdown SignalValueWCOW = \"CtrlShutdown\"\n)\n\n// ModificationRequest is for modify commands passed to the guest.\ntype ModificationRequest struct {\n\tRequestType  RequestType  `json:\"RequestType,omitempty\"`\n\tResourceType ResourceType `json:\"ResourceType,omitempty\"`\n\tSettings     interface{}  `json:\"Settings,omitempty\"`\n}\n\ntype NetworkModifyRequest struct {\n\tAdapterId   string      `json:\"AdapterId,omitempty\"` //nolint:stylecheck\n\tRequestType RequestType `json:\"RequestType,omitempty\"`\n\tSettings    interface{} `json:\"Settings,omitempty\"`\n}\n\ntype RS4NetworkModifyRequest struct {\n\tAdapterInstanceId string      `json:\"AdapterInstanceId,omitempty\"` //nolint:stylecheck\n\tRequestType       RequestType `json:\"RequestType,omitempty\"`\n\tSettings          interface{} `json:\"Settings,omitempty\"`\n}\n\nvar (\n\t// V5 GUIDs for SCSI controllers\n\t// These GUIDs are created with namespace GUID \"d422512d-2bf2-4752-809d-7b82b5fcb1b4\"\n\t// and index as names. For example, first GUID is created like this:\n\t// guid.NewV5(\"d422512d-2bf2-4752-809d-7b82b5fcb1b4\", []byte(\"0\"))\n\tScsiControllerGuids = []string{\n\t\t\"df6d0690-79e5-55b6-a5ec-c1e2f77f580a\",\n\t\t\"0110f83b-de10-5172-a266-78bca56bf50a\",\n\t\t\"b5d2d8d4-3a75-51bf-945b-3444dc6b8579\",\n\t\t\"305891a9-b251-5dfe-91a2-c25d9212275b\",\n\t}\n)\n\n// constants for v2 schema ProcessModifyRequest\n\n// Operation type for [hcsschema.ProcessModifyRequest].\ntype ProcessModifyOperation string\n\nconst (\n\tModifyProcessConsoleSize ProcessModifyOperation = \"ConsoleSize\"\n\tCloseProcessHandle       ProcessModifyOperation = \"CloseHandle\"\n)\n\n// Standard IO handle(s) to close for [hcsschema.CloseHandle] in [hcsschema.ProcessModifyRequest].\ntype STDIOHandle string\n\nconst (\n\tSTDInHandle  STDIOHandle = \"StdIn\"\n\tSTDOutHandle STDIOHandle = \"StdOut\"\n\tSTDErrHandle STDIOHandle = \"StdErr\"\n\tAllHandles   STDIOHandle = \"All\"\n)\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/queue/mq.go",
    "content": "package queue\n\nimport (\n\t\"errors\"\n\t\"sync\"\n)\n\nvar ErrQueueClosed = errors.New(\"the queue is closed for reading and writing\")\n\n// MessageQueue represents a threadsafe message queue to be used to retrieve or\n// write messages to.\ntype MessageQueue struct {\n\tm        *sync.RWMutex\n\tc        *sync.Cond\n\tmessages []interface{}\n\tclosed   bool\n}\n\n// NewMessageQueue returns a new MessageQueue.\nfunc NewMessageQueue() *MessageQueue {\n\tm := &sync.RWMutex{}\n\treturn &MessageQueue{\n\t\tm:        m,\n\t\tc:        sync.NewCond(m),\n\t\tmessages: []interface{}{},\n\t}\n}\n\n// Enqueue writes `msg` to the queue.\nfunc (mq *MessageQueue) Enqueue(msg interface{}) error {\n\tmq.m.Lock()\n\tdefer mq.m.Unlock()\n\n\tif mq.closed {\n\t\treturn ErrQueueClosed\n\t}\n\tmq.messages = append(mq.messages, msg)\n\t// Signal a waiter that there is now a value available in the queue.\n\tmq.c.Signal()\n\treturn nil\n}\n\n// Dequeue will read a value from the queue and remove it. If the queue\n// is empty, this will block until the queue is closed or a value gets enqueued.\nfunc (mq *MessageQueue) Dequeue() (interface{}, error) {\n\tmq.m.Lock()\n\tdefer mq.m.Unlock()\n\n\tfor !mq.closed && mq.size() == 0 {\n\t\tmq.c.Wait()\n\t}\n\n\t// We got woken up, check if it's because the queue got closed.\n\tif mq.closed {\n\t\treturn nil, ErrQueueClosed\n\t}\n\n\tval := mq.messages[0]\n\tmq.messages[0] = nil\n\tmq.messages = mq.messages[1:]\n\treturn val, nil\n}\n\n// Size returns the size of the queue.\nfunc (mq *MessageQueue) Size() int {\n\tmq.m.RLock()\n\tdefer mq.m.RUnlock()\n\treturn mq.size()\n}\n\n// Nonexported size check to check if the queue is empty inside already locked functions.\nfunc (mq *MessageQueue) size() int {\n\treturn len(mq.messages)\n}\n\n// Close closes the queue for future writes or reads. Any attempts to read or write from the\n// queue after close will return ErrQueueClosed. This is safe to call multiple times.\nfunc (mq *MessageQueue) Close() {\n\tmq.m.Lock()\n\tdefer mq.m.Unlock()\n\n\t// Already closed, noop\n\tif mq.closed {\n\t\treturn\n\t}\n\n\tmq.messages = nil\n\tmq.closed = true\n\t// If there's anybody currently waiting on a value from Dequeue, we need to\n\t// broadcast so the read(s) can return ErrQueueClosed.\n\tmq.c.Broadcast()\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/safefile/do.go",
    "content": "package safefile\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go",
    "content": "//go:build windows\n\npackage safefile\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"syscall\"\n\t\"unicode/utf16\"\n\t\"unsafe\"\n\n\t\"github.com/Microsoft/hcsshim/internal/longpath\"\n\t\"github.com/Microsoft/hcsshim/internal/winapi\"\n\n\twinio \"github.com/Microsoft/go-winio\"\n)\n\nfunc OpenRoot(path string) (*os.File, error) {\n\tlongpath, err := longpath.LongAbs(path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn winio.OpenForBackup(longpath, syscall.GENERIC_READ, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, syscall.OPEN_EXISTING)\n}\n\nfunc cleanGoStringRelativePath(path string) (string, error) {\n\tpath = filepath.Clean(path)\n\tif strings.Contains(path, \":\") {\n\t\t// Since alternate data streams must follow the file they\n\t\t// are attached to, finding one here (out of order) is invalid.\n\t\treturn \"\", errors.New(\"path contains invalid character `:`\")\n\t}\n\tfspath := filepath.FromSlash(path)\n\tif len(fspath) > 0 && fspath[0] == '\\\\' {\n\t\treturn \"\", errors.New(\"expected relative path\")\n\t}\n\treturn fspath, nil\n}\n\nfunc ntRelativePath(path string) ([]uint16, error) {\n\tfspath, err := cleanGoStringRelativePath(path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tpath16 := utf16.Encode(([]rune)(fspath))\n\tif len(path16) > 32767 {\n\t\treturn nil, syscall.ENAMETOOLONG\n\t}\n\n\treturn path16, nil\n}\n\n// openRelativeInternal opens a relative path from the given root, failing if\n// any of the intermediate path components are reparse points.\nfunc openRelativeInternal(path string, root *os.File, accessMask uint32, shareFlags uint32, createDisposition uint32, flags uint32) (*os.File, error) {\n\tvar (\n\t\th    uintptr\n\t\tiosb winapi.IOStatusBlock\n\t\toa   winapi.ObjectAttributes\n\t)\n\n\tcleanRelativePath, err := cleanGoStringRelativePath(path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif root == nil || root.Fd() == 0 {\n\t\treturn nil, errors.New(\"missing root directory\")\n\t}\n\n\tpathUnicode, err := winapi.NewUnicodeString(cleanRelativePath)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\toa.Length = unsafe.Sizeof(oa)\n\toa.ObjectName = pathUnicode\n\toa.RootDirectory = uintptr(root.Fd())\n\toa.Attributes = winapi.OBJ_DONT_REPARSE\n\tstatus := winapi.NtCreateFile(\n\t\t&h,\n\t\taccessMask|syscall.SYNCHRONIZE,\n\t\t&oa,\n\t\t&iosb,\n\t\tnil,\n\t\t0,\n\t\tshareFlags,\n\t\tcreateDisposition,\n\t\twinapi.FILE_OPEN_FOR_BACKUP_INTENT|winapi.FILE_SYNCHRONOUS_IO_NONALERT|flags,\n\t\tnil,\n\t\t0,\n\t)\n\tif status != 0 {\n\t\treturn nil, winapi.RtlNtStatusToDosError(status)\n\t}\n\n\tfullPath, err := longpath.LongAbs(filepath.Join(root.Name(), path))\n\tif err != nil {\n\t\tsyscall.Close(syscall.Handle(h))\n\t\treturn nil, err\n\t}\n\n\treturn os.NewFile(h, fullPath), nil\n}\n\n// OpenRelative opens a relative path from the given root, failing if\n// any of the intermediate path components are reparse points.\nfunc OpenRelative(path string, root *os.File, accessMask uint32, shareFlags uint32, createDisposition uint32, flags uint32) (*os.File, error) {\n\tf, err := openRelativeInternal(path, root, accessMask, shareFlags, createDisposition, flags)\n\tif err != nil {\n\t\terr = &os.PathError{Op: \"open\", Path: filepath.Join(root.Name(), path), Err: err}\n\t}\n\treturn f, err\n}\n\n// LinkRelative creates a hard link from oldname to newname (relative to oldroot\n// and newroot), failing if any of the intermediate path components are reparse\n// points.\nfunc LinkRelative(oldname string, oldroot *os.File, newname string, newroot *os.File) error {\n\t// Open the old file.\n\toldf, err := openRelativeInternal(\n\t\toldname,\n\t\toldroot,\n\t\tsyscall.FILE_WRITE_ATTRIBUTES,\n\t\tsyscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,\n\t\twinapi.FILE_OPEN,\n\t\t0,\n\t)\n\tif err != nil {\n\t\treturn &os.LinkError{Op: \"link\", Old: filepath.Join(oldroot.Name(), oldname), New: filepath.Join(newroot.Name(), newname), Err: err}\n\t}\n\tdefer oldf.Close()\n\n\t// Open the parent of the new file.\n\tvar parent *os.File\n\tparentPath := filepath.Dir(newname)\n\tif parentPath != \".\" {\n\t\tparent, err = openRelativeInternal(\n\t\t\tparentPath,\n\t\t\tnewroot,\n\t\t\tsyscall.GENERIC_READ,\n\t\t\tsyscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,\n\t\t\twinapi.FILE_OPEN,\n\t\t\twinapi.FILE_DIRECTORY_FILE)\n\t\tif err != nil {\n\t\t\treturn &os.LinkError{Op: \"link\", Old: oldf.Name(), New: filepath.Join(newroot.Name(), newname), Err: err}\n\t\t}\n\t\tdefer parent.Close()\n\n\t\tfi, err := winio.GetFileBasicInfo(parent)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif (fi.FileAttributes & syscall.FILE_ATTRIBUTE_REPARSE_POINT) != 0 {\n\t\t\treturn &os.LinkError{Op: \"link\", Old: oldf.Name(), New: filepath.Join(newroot.Name(), newname), Err: winapi.RtlNtStatusToDosError(winapi.STATUS_REPARSE_POINT_ENCOUNTERED)}\n\t\t}\n\t} else {\n\t\tparent = newroot\n\t}\n\n\t// Issue an NT call to create the link. This will be safe because NT will\n\t// not open any more directories to create the link, so it cannot walk any\n\t// more reparse points.\n\tnewbase := filepath.Base(newname)\n\tnewbase16, err := ntRelativePath(newbase)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tsize := int(unsafe.Offsetof(winapi.FileLinkInformation{}.FileName)) + len(newbase16)*2\n\tlinkinfoBuffer := winapi.LocalAlloc(0, size)\n\tdefer winapi.LocalFree(linkinfoBuffer)\n\n\tlinkinfo := (*winapi.FileLinkInformation)(unsafe.Pointer(linkinfoBuffer))\n\tlinkinfo.RootDirectory = parent.Fd()\n\tlinkinfo.FileNameLength = uint32(len(newbase16) * 2)\n\tcopy(winapi.Uint16BufferToSlice(&linkinfo.FileName[0], len(newbase16)), newbase16)\n\n\tvar iosb winapi.IOStatusBlock\n\tstatus := winapi.NtSetInformationFile(\n\t\toldf.Fd(),\n\t\t&iosb,\n\t\tlinkinfoBuffer,\n\t\tuint32(size),\n\t\twinapi.FileLinkInformationClass,\n\t)\n\tif status != 0 {\n\t\treturn &os.LinkError{Op: \"link\", Old: oldf.Name(), New: filepath.Join(parent.Name(), newbase), Err: winapi.RtlNtStatusToDosError(status)}\n\t}\n\n\treturn nil\n}\n\n// deleteOnClose marks a file to be deleted when the handle is closed.\nfunc deleteOnClose(f *os.File) error {\n\tdisposition := winapi.FileDispositionInformationEx{Flags: winapi.FILE_DISPOSITION_DELETE}\n\tvar iosb winapi.IOStatusBlock\n\tstatus := winapi.NtSetInformationFile(\n\t\tf.Fd(),\n\t\t&iosb,\n\t\tuintptr(unsafe.Pointer(&disposition)),\n\t\tuint32(unsafe.Sizeof(disposition)),\n\t\twinapi.FileDispositionInformationExClass,\n\t)\n\tif status != 0 {\n\t\treturn winapi.RtlNtStatusToDosError(status)\n\t}\n\treturn nil\n}\n\n// clearReadOnly clears the readonly attribute on a file.\nfunc clearReadOnly(f *os.File) error {\n\tbi, err := winio.GetFileBasicInfo(f)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif bi.FileAttributes&syscall.FILE_ATTRIBUTE_READONLY == 0 {\n\t\treturn nil\n\t}\n\tsbi := winio.FileBasicInfo{\n\t\tFileAttributes: bi.FileAttributes &^ syscall.FILE_ATTRIBUTE_READONLY,\n\t}\n\tif sbi.FileAttributes == 0 {\n\t\tsbi.FileAttributes = syscall.FILE_ATTRIBUTE_NORMAL\n\t}\n\treturn winio.SetFileBasicInfo(f, &sbi)\n}\n\n// RemoveRelative removes a file or directory relative to a root, failing if any\n// intermediate path components are reparse points.\nfunc RemoveRelative(path string, root *os.File) error {\n\tf, err := openRelativeInternal(\n\t\tpath,\n\t\troot,\n\t\twinapi.FILE_READ_ATTRIBUTES|winapi.FILE_WRITE_ATTRIBUTES|winapi.DELETE,\n\t\tsyscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,\n\t\twinapi.FILE_OPEN,\n\t\twinapi.FILE_OPEN_REPARSE_POINT)\n\tif err == nil {\n\t\tdefer f.Close()\n\t\terr = deleteOnClose(f)\n\t\tif err == syscall.ERROR_ACCESS_DENIED { //nolint:errorlint\n\t\t\t// Maybe the file is marked readonly. Clear the bit and retry.\n\t\t\t_ = clearReadOnly(f)\n\t\t\terr = deleteOnClose(f)\n\t\t}\n\t}\n\tif err != nil {\n\t\treturn &os.PathError{Op: \"remove\", Path: filepath.Join(root.Name(), path), Err: err}\n\t}\n\treturn nil\n}\n\n// RemoveAllRelative removes a directory tree relative to a root, failing if any\n// intermediate path components are reparse points.\nfunc RemoveAllRelative(path string, root *os.File) error {\n\tfi, err := LstatRelative(path, root)\n\tif err != nil {\n\t\tif os.IsNotExist(err) {\n\t\t\treturn nil\n\t\t}\n\t\treturn err\n\t}\n\tfileAttributes := fi.Sys().(*syscall.Win32FileAttributeData).FileAttributes\n\tif fileAttributes&syscall.FILE_ATTRIBUTE_DIRECTORY == 0 || fileAttributes&syscall.FILE_ATTRIBUTE_REPARSE_POINT != 0 {\n\t\t// If this is a reparse point, it can't have children. Simple remove will do.\n\t\terr := RemoveRelative(path, root)\n\t\tif err == nil || os.IsNotExist(err) {\n\t\t\treturn nil\n\t\t}\n\t\treturn err\n\t}\n\n\t// It is necessary to use os.Open as Readdirnames does not work with\n\t// OpenRelative. This is safe because the above LstatRelative fails\n\t// if the target is outside the root, and we know this is not a\n\t// symlink from the above FILE_ATTRIBUTE_REPARSE_POINT check.\n\tfd, err := os.Open(filepath.Join(root.Name(), path))\n\tif err != nil {\n\t\tif os.IsNotExist(err) {\n\t\t\t// Race. It was deleted between the Lstat and Open.\n\t\t\t// Return nil per RemoveAll's docs.\n\t\t\treturn nil\n\t\t}\n\t\treturn err\n\t}\n\n\t// Remove contents & return first error.\n\tfor {\n\t\tnames, err1 := fd.Readdirnames(100)\n\t\tfor _, name := range names {\n\t\t\tif err2 := RemoveAllRelative(path+string(os.PathSeparator)+name, root); err == nil {\n\t\t\t\terr = err2\n\t\t\t}\n\t\t}\n\t\tif err1 == io.EOF {\n\t\t\t// Readdirnames has no more files to return\n\t\t\tbreak\n\t\t}\n\t\t// If Readdirnames returned an error, use it.\n\t\tif err == nil {\n\t\t\terr = err1\n\t\t}\n\t\tif len(names) == 0 {\n\t\t\tbreak\n\t\t}\n\t}\n\tfd.Close()\n\n\t// Remove directory.\n\terr1 := RemoveRelative(path, root)\n\tif err1 == nil || os.IsNotExist(err1) {\n\t\treturn nil\n\t}\n\tif err == nil {\n\t\terr = err1\n\t}\n\treturn err\n}\n\n// MkdirRelative creates a directory relative to a root, failing if any\n// intermediate path components are reparse points.\nfunc MkdirRelative(path string, root *os.File) error {\n\tf, err := openRelativeInternal(\n\t\tpath,\n\t\troot,\n\t\t0,\n\t\tsyscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,\n\t\twinapi.FILE_CREATE,\n\t\twinapi.FILE_DIRECTORY_FILE)\n\tif err == nil {\n\t\tf.Close()\n\t} else {\n\t\terr = &os.PathError{Op: \"mkdir\", Path: filepath.Join(root.Name(), path), Err: err}\n\t}\n\treturn err\n}\n\n// MkdirAllRelative creates each directory in the path relative to a root, failing if\n// any existing intermediate path components are reparse points.\nfunc MkdirAllRelative(path string, root *os.File) error {\n\tpathParts := strings.Split(filepath.Clean(path), (string)(filepath.Separator))\n\tfor index := range pathParts {\n\t\tpartialPath := filepath.Join(pathParts[0 : index+1]...)\n\t\tstat, err := LstatRelative(partialPath, root)\n\n\t\tif err != nil {\n\t\t\tif os.IsNotExist(err) {\n\t\t\t\tif err := MkdirRelative(partialPath, root); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\n\t\tif !stat.IsDir() {\n\t\t\tfullPath := filepath.Join(root.Name(), partialPath)\n\t\t\treturn &os.PathError{Op: \"mkdir\", Path: fullPath, Err: syscall.ENOTDIR}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// LstatRelative performs a stat operation on a file relative to a root, failing\n// if any intermediate path components are reparse points.\nfunc LstatRelative(path string, root *os.File) (os.FileInfo, error) {\n\tf, err := openRelativeInternal(\n\t\tpath,\n\t\troot,\n\t\twinapi.FILE_READ_ATTRIBUTES,\n\t\tsyscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,\n\t\twinapi.FILE_OPEN,\n\t\twinapi.FILE_OPEN_REPARSE_POINT)\n\tif err != nil {\n\t\treturn nil, &os.PathError{Op: \"stat\", Path: filepath.Join(root.Name(), path), Err: err}\n\t}\n\tdefer f.Close()\n\treturn f.Stat()\n}\n\n// EnsureNotReparsePointRelative validates that a given file (relative to a\n// root) and all intermediate path components are not a reparse points.\nfunc EnsureNotReparsePointRelative(path string, root *os.File) error {\n\t// Perform an open with OBJ_DONT_REPARSE but without specifying FILE_OPEN_REPARSE_POINT.\n\tf, err := OpenRelative(\n\t\tpath,\n\t\troot,\n\t\t0,\n\t\tsyscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,\n\t\twinapi.FILE_OPEN,\n\t\t0)\n\tif err != nil {\n\t\treturn err\n\t}\n\tf.Close()\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/security/grantvmgroupaccess.go",
    "content": "//go:build windows\n// +build windows\n\npackage security\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"syscall\"\n\t\"unsafe\"\n)\n\ntype (\n\taccessMask          uint32\n\taccessMode          uint32\n\tdesiredAccess       uint32\n\tinheritMode         uint32\n\tobjectType          uint32\n\tshareMode           uint32\n\tsecurityInformation uint32\n\ttrusteeForm         uint32\n\ttrusteeType         uint32\n)\n\ntype explicitAccess struct {\n\taccessPermissions accessMask\n\taccessMode        accessMode\n\tinheritance       inheritMode\n\ttrustee           trustee\n}\n\ntype trustee struct {\n\tmultipleTrustee          *trustee\n\tmultipleTrusteeOperation int32\n\ttrusteeForm              trusteeForm\n\ttrusteeType              trusteeType\n\tname                     uintptr\n}\n\nconst (\n\tAccessMaskNone    accessMask = 0\n\tAccessMaskRead    accessMask = 1 << 31 // GENERIC_READ\n\tAccessMaskWrite   accessMask = 1 << 30 // GENERIC_WRITE\n\tAccessMaskExecute accessMask = 1 << 29 // GENERIC_EXECUTE\n\tAccessMaskAll     accessMask = 1 << 28 // GENERIC_ALL\n\n\taccessMaskDesiredPermission = AccessMaskRead\n\n\taccessModeGrant accessMode = 1\n\n\tdesiredAccessReadControl desiredAccess = 0x20000\n\tdesiredAccessWriteDac    desiredAccess = 0x40000\n\n\tgvmga = \"GrantVmGroupAccess:\"\n\n\tinheritModeNoInheritance                  inheritMode = 0x0\n\tinheritModeSubContainersAndObjectsInherit inheritMode = 0x3\n\n\tobjectTypeFileObject objectType = 0x1\n\n\tsecurityInformationDACL securityInformation = 0x4\n\n\tshareModeRead  shareMode = 0x1\n\tshareModeWrite shareMode = 0x2\n\n\t//nolint:stylecheck // ST1003\n\tsidVmGroup = \"S-1-5-83-0\"\n\n\ttrusteeFormIsSid trusteeForm = 0\n\n\ttrusteeTypeWellKnownGroup trusteeType = 5\n)\n\n// GrantVmGroupAccess sets the DACL for a specified file or directory to\n// include Grant ACE entries for the VM Group SID. This is a golang re-\n// implementation of the same function in vmcompute, just not exported in\n// RS5. Which kind of sucks. Sucks a lot :/\nfunc GrantVmGroupAccess(name string) error { //nolint:stylecheck // ST1003\n\treturn GrantVmGroupAccessWithMask(name, accessMaskDesiredPermission)\n}\n\n// GrantVmGroupAccessWithMask sets the desired DACL for a specified file or\n// directory.\nfunc GrantVmGroupAccessWithMask(name string, access accessMask) error { //nolint:stylecheck // ST1003\n\tif access == 0 || access<<4 != 0 {\n\t\treturn fmt.Errorf(\"invalid access mask: 0x%08x\", access)\n\t}\n\t// Stat (to determine if `name` is a directory).\n\ts, err := os.Stat(name)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"%s os.Stat %s: %w\", gvmga, name, err)\n\t}\n\n\t// Get a handle to the file/directory. Must defer Close on success.\n\tfd, err := createFile(name, s.IsDir())\n\tif err != nil {\n\t\treturn err // Already wrapped\n\t}\n\tdefer func() {\n\t\t_ = syscall.CloseHandle(fd)\n\t}()\n\n\t// Get the current DACL and Security Descriptor. Must defer LocalFree on success.\n\tot := objectTypeFileObject\n\tsi := securityInformationDACL\n\tsd := uintptr(0)\n\torigDACL := uintptr(0)\n\tif err := getSecurityInfo(fd, uint32(ot), uint32(si), nil, nil, &origDACL, nil, &sd); err != nil {\n\t\treturn fmt.Errorf(\"%s GetSecurityInfo %s: %w\", gvmga, name, err)\n\t}\n\tdefer func() {\n\t\t_, _ = syscall.LocalFree((syscall.Handle)(unsafe.Pointer(sd)))\n\t}()\n\n\t// Generate a new DACL which is the current DACL with the required ACEs added.\n\t// Must defer LocalFree on success.\n\tnewDACL, err := generateDACLWithAcesAdded(name, s.IsDir(), access, origDACL)\n\tif err != nil {\n\t\treturn err // Already wrapped\n\t}\n\tdefer func() {\n\t\t_, _ = syscall.LocalFree((syscall.Handle)(unsafe.Pointer(newDACL)))\n\t}()\n\n\t// And finally use SetSecurityInfo to apply the updated DACL.\n\tif err := setSecurityInfo(fd, uint32(ot), uint32(si), uintptr(0), uintptr(0), newDACL, uintptr(0)); err != nil {\n\t\treturn fmt.Errorf(\"%s SetSecurityInfo %s: %w\", gvmga, name, err)\n\t}\n\n\treturn nil\n}\n\n// createFile is a helper function to call [Nt]CreateFile to get a handle to\n// the file or directory.\nfunc createFile(name string, isDir bool) (syscall.Handle, error) {\n\tnamep, err := syscall.UTF16FromString(name)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"syscall.UTF16FromString %s: %w\", name, err)\n\t}\n\tda := uint32(desiredAccessReadControl | desiredAccessWriteDac)\n\tsm := uint32(shareModeRead | shareModeWrite)\n\tfa := uint32(syscall.FILE_ATTRIBUTE_NORMAL)\n\tif isDir {\n\t\tfa = uint32(fa | syscall.FILE_FLAG_BACKUP_SEMANTICS)\n\t}\n\tfd, err := syscall.CreateFile(&namep[0], da, sm, nil, syscall.OPEN_EXISTING, fa, 0)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"%s syscall.CreateFile %s: %w\", gvmga, name, err)\n\t}\n\treturn fd, nil\n}\n\n// generateDACLWithAcesAdded generates a new DACL with the two needed ACEs added.\n// The caller is responsible for LocalFree of the returned DACL on success.\nfunc generateDACLWithAcesAdded(name string, isDir bool, desiredAccess accessMask, origDACL uintptr) (uintptr, error) {\n\t// Generate pointers to the SIDs based on the string SIDs\n\tsid, err := syscall.StringToSid(sidVmGroup)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"%s syscall.StringToSid %s %s: %w\", gvmga, name, sidVmGroup, err)\n\t}\n\n\tinheritance := inheritModeNoInheritance\n\tif isDir {\n\t\tinheritance = inheritModeSubContainersAndObjectsInherit\n\t}\n\n\teaArray := []explicitAccess{\n\t\t{\n\t\t\taccessPermissions: desiredAccess,\n\t\t\taccessMode:        accessModeGrant,\n\t\t\tinheritance:       inheritance,\n\t\t\ttrustee: trustee{\n\t\t\t\ttrusteeForm: trusteeFormIsSid,\n\t\t\t\ttrusteeType: trusteeTypeWellKnownGroup,\n\t\t\t\tname:        uintptr(unsafe.Pointer(sid)),\n\t\t\t},\n\t\t},\n\t}\n\n\tmodifiedDACL := uintptr(0)\n\tif err := setEntriesInAcl(uintptr(uint32(1)), uintptr(unsafe.Pointer(&eaArray[0])), origDACL, &modifiedDACL); err != nil {\n\t\treturn 0, fmt.Errorf(\"%s SetEntriesInAcl %s: %w\", gvmga, name, err)\n\t}\n\n\treturn modifiedDACL, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/security/syscall_windows.go",
    "content": "package security\n\n//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go syscall_windows.go\n\n//sys getSecurityInfo(handle syscall.Handle, objectType uint32, si uint32, ppsidOwner **uintptr, ppsidGroup **uintptr, ppDacl *uintptr, ppSacl *uintptr, ppSecurityDescriptor *uintptr) (win32err error) = advapi32.GetSecurityInfo\n//sys setSecurityInfo(handle syscall.Handle, objectType uint32, si uint32, psidOwner uintptr, psidGroup uintptr, pDacl uintptr, pSacl uintptr) (win32err error) = advapi32.SetSecurityInfo\n//sys setEntriesInAcl(count uintptr, pListOfEEs uintptr, oldAcl uintptr, newAcl *uintptr) (win32err error) = advapi32.SetEntriesInAclW\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/security/zsyscall_windows.go",
    "content": "//go:build windows\n\n// Code generated by 'go generate' using \"github.com/Microsoft/go-winio/tools/mkwinsyscall\"; DO NOT EDIT.\n\npackage security\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\nvar _ unsafe.Pointer\n\n// Do the interface allocations only once for common\n// Errno values.\nconst (\n\terrnoERROR_IO_PENDING = 997\n)\n\nvar (\n\terrERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)\n\terrERROR_EINVAL     error = syscall.EINVAL\n)\n\n// errnoErr returns common boxed Errno values, to prevent\n// allocations at runtime.\nfunc errnoErr(e syscall.Errno) error {\n\tswitch e {\n\tcase 0:\n\t\treturn errERROR_EINVAL\n\tcase errnoERROR_IO_PENDING:\n\t\treturn errERROR_IO_PENDING\n\t}\n\treturn e\n}\n\nvar (\n\tmodadvapi32 = windows.NewLazySystemDLL(\"advapi32.dll\")\n\n\tprocGetSecurityInfo  = modadvapi32.NewProc(\"GetSecurityInfo\")\n\tprocSetEntriesInAclW = modadvapi32.NewProc(\"SetEntriesInAclW\")\n\tprocSetSecurityInfo  = modadvapi32.NewProc(\"SetSecurityInfo\")\n)\n\nfunc getSecurityInfo(handle syscall.Handle, objectType uint32, si uint32, ppsidOwner **uintptr, ppsidGroup **uintptr, ppDacl *uintptr, ppSacl *uintptr, ppSecurityDescriptor *uintptr) (win32err error) {\n\tr0, _, _ := syscall.SyscallN(procGetSecurityInfo.Addr(), uintptr(handle), uintptr(objectType), uintptr(si), uintptr(unsafe.Pointer(ppsidOwner)), uintptr(unsafe.Pointer(ppsidGroup)), uintptr(unsafe.Pointer(ppDacl)), uintptr(unsafe.Pointer(ppSacl)), uintptr(unsafe.Pointer(ppSecurityDescriptor)))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc setEntriesInAcl(count uintptr, pListOfEEs uintptr, oldAcl uintptr, newAcl *uintptr) (win32err error) {\n\tr0, _, _ := syscall.SyscallN(procSetEntriesInAclW.Addr(), uintptr(count), uintptr(pListOfEEs), uintptr(oldAcl), uintptr(unsafe.Pointer(newAcl)))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc setSecurityInfo(handle syscall.Handle, objectType uint32, si uint32, psidOwner uintptr, psidGroup uintptr, pDacl uintptr, pSacl uintptr) (win32err error) {\n\tr0, _, _ := syscall.SyscallN(procSetSecurityInfo.Addr(), uintptr(handle), uintptr(objectType), uintptr(si), uintptr(psidOwner), uintptr(psidGroup), uintptr(pDacl), uintptr(pSacl))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/timeout/timeout.go",
    "content": "package timeout\n\nimport (\n\t\"os\"\n\t\"strconv\"\n\t\"time\"\n)\n\nvar (\n\t// defaultTimeout is the timeout for most operations that is not overridden.\n\tdefaultTimeout = 4 * time.Minute\n\n\t// defaultTimeoutTestdRetry is the retry loop timeout for testd to respond\n\t// for a disk to come online in LCOW.\n\tdefaultTimeoutTestdRetry = 5 * time.Second\n)\n\n// External variables for HCSShim consumers to use.\nvar (\n\t// SystemCreate is the timeout for creating a compute system\n\tSystemCreate time.Duration = defaultTimeout\n\n\t// SystemStart is the timeout for starting a compute system\n\tSystemStart time.Duration = defaultTimeout\n\n\t// SystemPause is the timeout for pausing a compute system\n\tSystemPause time.Duration = defaultTimeout\n\n\t// SystemResume is the timeout for resuming a compute system\n\tSystemResume time.Duration = defaultTimeout\n\n\t// SystemSave is the timeout for saving a compute system\n\tSystemSave time.Duration = defaultTimeout\n\n\t// SyscallWatcher is the timeout before warning of a potential stuck platform syscall.\n\tSyscallWatcher time.Duration = defaultTimeout\n\n\t// Tar2VHD is the timeout for the tar2vhd operation to complete\n\tTar2VHD time.Duration = defaultTimeout\n\n\t// ExternalCommandToStart is the timeout for external commands to start\n\tExternalCommandToStart = defaultTimeout\n\n\t// ExternalCommandToComplete is the timeout for external commands to complete.\n\t// Generally this means copying data from their stdio pipes.\n\tExternalCommandToComplete = defaultTimeout\n\n\t// TestDRetryLoop is the timeout for testd retry loop when onlining a SCSI disk in LCOW\n\tTestDRetryLoop = defaultTimeoutTestdRetry\n)\n\nfunc init() {\n\tSystemCreate = durationFromEnvironment(\"HCSSHIM_TIMEOUT_SYSTEMCREATE\", SystemCreate)\n\tSystemStart = durationFromEnvironment(\"HCSSHIM_TIMEOUT_SYSTEMSTART\", SystemStart)\n\tSystemPause = durationFromEnvironment(\"HCSSHIM_TIMEOUT_SYSTEMPAUSE\", SystemPause)\n\tSystemResume = durationFromEnvironment(\"HCSSHIM_TIMEOUT_SYSTEMRESUME\", SystemResume)\n\tSystemSave = durationFromEnvironment(\"HCSSHIM_TIMEOUT_SYSTEMSAVE\", SystemSave)\n\tSyscallWatcher = durationFromEnvironment(\"HCSSHIM_TIMEOUT_SYSCALLWATCHER\", SyscallWatcher)\n\tTar2VHD = durationFromEnvironment(\"HCSSHIM_TIMEOUT_TAR2VHD\", Tar2VHD)\n\tExternalCommandToStart = durationFromEnvironment(\"HCSSHIM_TIMEOUT_EXTERNALCOMMANDSTART\", ExternalCommandToStart)\n\tExternalCommandToComplete = durationFromEnvironment(\"HCSSHIM_TIMEOUT_EXTERNALCOMMANDCOMPLETE\", ExternalCommandToComplete)\n\tTestDRetryLoop = durationFromEnvironment(\"HCSSHIM_TIMEOUT_TESTDRETRYLOOP\", TestDRetryLoop)\n}\n\nfunc durationFromEnvironment(env string, defaultValue time.Duration) time.Duration {\n\tenvTimeout := os.Getenv(env)\n\tif len(envTimeout) > 0 {\n\t\te, err := strconv.Atoi(envTimeout)\n\t\tif err == nil && e > 0 {\n\t\t\treturn time.Second * time.Duration(e)\n\t\t}\n\t}\n\treturn defaultValue\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/vmcompute/doc.go",
    "content": "package vmcompute\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/vmcompute/vmcompute.go",
    "content": "//go:build windows\n\npackage vmcompute\n\nimport (\n\tgcontext \"context\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"github.com/sirupsen/logrus\"\n\t\"go.opencensus.io/trace\"\n\n\t\"github.com/Microsoft/hcsshim/internal/interop\"\n\t\"github.com/Microsoft/hcsshim/internal/log\"\n\t\"github.com/Microsoft/hcsshim/internal/logfields\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"github.com/Microsoft/hcsshim/internal/timeout\"\n)\n\n//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go vmcompute.go\n\n//sys hcsEnumerateComputeSystems(query string, computeSystems **uint16, result **uint16) (hr error) = vmcompute.HcsEnumerateComputeSystems?\n//sys hcsCreateComputeSystem(id string, configuration string, identity syscall.Handle, computeSystem *HcsSystem, result **uint16) (hr error) = vmcompute.HcsCreateComputeSystem?\n//sys hcsOpenComputeSystem(id string, computeSystem *HcsSystem, result **uint16) (hr error) = vmcompute.HcsOpenComputeSystem?\n//sys hcsCloseComputeSystem(computeSystem HcsSystem) (hr error) = vmcompute.HcsCloseComputeSystem?\n//sys hcsStartComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsStartComputeSystem?\n//sys hcsShutdownComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsShutdownComputeSystem?\n//sys hcsTerminateComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsTerminateComputeSystem?\n//sys hcsPauseComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsPauseComputeSystem?\n//sys hcsResumeComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsResumeComputeSystem?\n//sys hcsGetComputeSystemProperties(computeSystem HcsSystem, propertyQuery string, properties **uint16, result **uint16) (hr error) = vmcompute.HcsGetComputeSystemProperties?\n//sys hcsModifyComputeSystem(computeSystem HcsSystem, configuration string, result **uint16) (hr error) = vmcompute.HcsModifyComputeSystem?\n//sys hcsModifyServiceSettings(settings string, result **uint16) (hr error) = vmcompute.HcsModifyServiceSettings?\n//sys hcsRegisterComputeSystemCallback(computeSystem HcsSystem, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) = vmcompute.HcsRegisterComputeSystemCallback?\n//sys hcsUnregisterComputeSystemCallback(callbackHandle HcsCallback) (hr error) = vmcompute.HcsUnregisterComputeSystemCallback?\n//sys hcsSaveComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsSaveComputeSystem?\n\n//sys hcsCreateProcess(computeSystem HcsSystem, processParameters string, processInformation *HcsProcessInformation, process *HcsProcess, result **uint16) (hr error) = vmcompute.HcsCreateProcess?\n//sys hcsOpenProcess(computeSystem HcsSystem, pid uint32, process *HcsProcess, result **uint16) (hr error) = vmcompute.HcsOpenProcess?\n//sys hcsCloseProcess(process HcsProcess) (hr error) = vmcompute.HcsCloseProcess?\n//sys hcsTerminateProcess(process HcsProcess, result **uint16) (hr error) = vmcompute.HcsTerminateProcess?\n//sys hcsSignalProcess(process HcsProcess, options string, result **uint16) (hr error) = vmcompute.HcsSignalProcess?\n//sys hcsGetProcessInfo(process HcsProcess, processInformation *HcsProcessInformation, result **uint16) (hr error) = vmcompute.HcsGetProcessInfo?\n//sys hcsGetProcessProperties(process HcsProcess, processProperties **uint16, result **uint16) (hr error) = vmcompute.HcsGetProcessProperties?\n//sys hcsModifyProcess(process HcsProcess, settings string, result **uint16) (hr error) = vmcompute.HcsModifyProcess?\n//sys hcsGetServiceProperties(propertyQuery string, properties **uint16, result **uint16) (hr error) = vmcompute.HcsGetServiceProperties?\n//sys hcsRegisterProcessCallback(process HcsProcess, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) = vmcompute.HcsRegisterProcessCallback?\n//sys hcsUnregisterProcessCallback(callbackHandle HcsCallback) (hr error) = vmcompute.HcsUnregisterProcessCallback?\n\n// errVmcomputeOperationPending is an error encountered when the operation is being completed asynchronously\nconst errVmcomputeOperationPending = syscall.Errno(0xC0370103)\n\n// HcsSystem is the handle associated with a created compute system.\ntype HcsSystem syscall.Handle\n\n// HcsProcess is the handle associated with a created process in a compute\n// system.\ntype HcsProcess syscall.Handle\n\n// HcsCallback is the handle associated with the function to call when events\n// occur.\ntype HcsCallback syscall.Handle\n\n// HcsProcessInformation is the structure used when creating or getting process\n// info.\ntype HcsProcessInformation struct {\n\t// ProcessId is the pid of the created process.\n\tProcessId uint32\n\t_         uint32 // reserved padding\n\t// StdInput is the handle associated with the stdin of the process.\n\tStdInput syscall.Handle\n\t// StdOutput is the handle associated with the stdout of the process.\n\tStdOutput syscall.Handle\n\t// StdError is the handle associated with the stderr of the process.\n\tStdError syscall.Handle\n}\n\nfunc execute(ctx gcontext.Context, timeout time.Duration, f func() error) error {\n\tnow := time.Now()\n\tif timeout > 0 {\n\t\tvar cancel gcontext.CancelFunc\n\t\tctx, cancel = gcontext.WithTimeout(ctx, timeout)\n\t\tdefer cancel()\n\t}\n\n\t// if ctx already has prior deadlines, the shortest timeout takes precedence and is used.\n\t// find the true timeout for reporting\n\t//\n\t// this is mostly an issue with (*UtilityVM).Start(context.Context), which sets its\n\t// own (2 minute) timeout.\n\tdeadline, ok := ctx.Deadline()\n\ttrueTimeout := timeout\n\tif ok {\n\t\ttrueTimeout = deadline.Sub(now)\n\t\tlog.G(ctx).WithFields(logrus.Fields{\n\t\t\tlogfields.Timeout: trueTimeout,\n\t\t\t\"desiredTimeout\":  timeout,\n\t\t}).Trace(\"Executing syscall with deadline\")\n\t}\n\n\tdone := make(chan error, 1)\n\tgo func() {\n\t\tdone <- f()\n\t}()\n\tselect {\n\tcase <-ctx.Done():\n\t\tif ctx.Err() == gcontext.DeadlineExceeded {\n\t\t\tlog.G(ctx).WithField(logfields.Timeout, trueTimeout).\n\t\t\t\tWarning(\"Syscall did not complete within operation timeout. This may indicate a platform issue. \" +\n\t\t\t\t\t\"If it appears to be making no forward progress, obtain the stacks and see if there is a syscall \" +\n\t\t\t\t\t\"stuck in the platform API for a significant length of time.\")\n\t\t}\n\t\treturn ctx.Err()\n\tcase err := <-done:\n\t\treturn err\n\t}\n}\n\nfunc HcsEnumerateComputeSystems(ctx gcontext.Context, query string) (computeSystems, result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsEnumerateComputeSystems\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\toc.SetSpanStatus(span, hr)\n\t}()\n\tspan.AddAttributes(trace.StringAttribute(\"query\", query))\n\n\treturn computeSystems, result, execute(ctx, timeout.SyscallWatcher, func() error {\n\t\tvar (\n\t\t\tcomputeSystemsp *uint16\n\t\t\tresultp         *uint16\n\t\t)\n\t\terr := hcsEnumerateComputeSystems(query, &computeSystemsp, &resultp)\n\t\tif computeSystemsp != nil {\n\t\t\tcomputeSystems = interop.ConvertAndFreeCoTaskMemString(computeSystemsp)\n\t\t}\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsCreateComputeSystem(ctx gcontext.Context, id string, configuration string, identity syscall.Handle) (computeSystem HcsSystem, result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsCreateComputeSystem\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\tif hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned\n\t\t\toc.SetSpanStatus(span, hr)\n\t\t}\n\t}()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"id\", id),\n\t\ttrace.StringAttribute(\"configuration\", configuration))\n\n\treturn computeSystem, result, execute(ctx, timeout.SystemCreate, func() error {\n\t\tvar resultp *uint16\n\t\terr := hcsCreateComputeSystem(id, configuration, identity, &computeSystem, &resultp)\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsOpenComputeSystem(ctx gcontext.Context, id string) (computeSystem HcsSystem, result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsOpenComputeSystem\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\toc.SetSpanStatus(span, hr)\n\t}()\n\n\treturn computeSystem, result, execute(ctx, timeout.SyscallWatcher, func() error {\n\t\tvar resultp *uint16\n\t\terr := hcsOpenComputeSystem(id, &computeSystem, &resultp)\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsCloseComputeSystem(ctx gcontext.Context, computeSystem HcsSystem) (hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsCloseComputeSystem\")\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, hr) }()\n\n\treturn execute(ctx, timeout.SyscallWatcher, func() error {\n\t\treturn hcsCloseComputeSystem(computeSystem)\n\t})\n}\n\nfunc HcsStartComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsStartComputeSystem\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\tif hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned\n\t\t\toc.SetSpanStatus(span, hr)\n\t\t}\n\t}()\n\tspan.AddAttributes(trace.StringAttribute(\"options\", options))\n\n\treturn result, execute(ctx, timeout.SystemStart, func() error {\n\t\tvar resultp *uint16\n\t\terr := hcsStartComputeSystem(computeSystem, options, &resultp)\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsShutdownComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsShutdownComputeSystem\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\tif hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned\n\t\t\toc.SetSpanStatus(span, hr)\n\t\t}\n\t}()\n\tspan.AddAttributes(trace.StringAttribute(\"options\", options))\n\n\treturn result, execute(ctx, timeout.SyscallWatcher, func() error {\n\t\tvar resultp *uint16\n\t\terr := hcsShutdownComputeSystem(computeSystem, options, &resultp)\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsTerminateComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsTerminateComputeSystem\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\tif hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned\n\t\t\toc.SetSpanStatus(span, hr)\n\t\t}\n\t}()\n\tspan.AddAttributes(trace.StringAttribute(\"options\", options))\n\n\treturn result, execute(ctx, timeout.SyscallWatcher, func() error {\n\t\tvar resultp *uint16\n\t\terr := hcsTerminateComputeSystem(computeSystem, options, &resultp)\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsPauseComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsPauseComputeSystem\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\tif hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned\n\t\t\toc.SetSpanStatus(span, hr)\n\t\t}\n\t}()\n\tspan.AddAttributes(trace.StringAttribute(\"options\", options))\n\n\treturn result, execute(ctx, timeout.SystemPause, func() error {\n\t\tvar resultp *uint16\n\t\terr := hcsPauseComputeSystem(computeSystem, options, &resultp)\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsResumeComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsResumeComputeSystem\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\tif hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned\n\t\t\toc.SetSpanStatus(span, hr)\n\t\t}\n\t}()\n\tspan.AddAttributes(trace.StringAttribute(\"options\", options))\n\n\treturn result, execute(ctx, timeout.SystemResume, func() error {\n\t\tvar resultp *uint16\n\t\terr := hcsResumeComputeSystem(computeSystem, options, &resultp)\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsGetComputeSystemProperties(ctx gcontext.Context, computeSystem HcsSystem, propertyQuery string) (properties, result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsGetComputeSystemProperties\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\toc.SetSpanStatus(span, hr)\n\t}()\n\tspan.AddAttributes(trace.StringAttribute(\"propertyQuery\", propertyQuery))\n\n\treturn properties, result, execute(ctx, timeout.SyscallWatcher, func() error {\n\t\tvar (\n\t\t\tpropertiesp *uint16\n\t\t\tresultp     *uint16\n\t\t)\n\t\terr := hcsGetComputeSystemProperties(computeSystem, propertyQuery, &propertiesp, &resultp)\n\t\tif propertiesp != nil {\n\t\t\tproperties = interop.ConvertAndFreeCoTaskMemString(propertiesp)\n\t\t}\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsModifyComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, configuration string) (result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsModifyComputeSystem\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\toc.SetSpanStatus(span, hr)\n\t}()\n\tspan.AddAttributes(trace.StringAttribute(\"configuration\", configuration))\n\n\treturn result, execute(ctx, timeout.SyscallWatcher, func() error {\n\t\tvar resultp *uint16\n\t\terr := hcsModifyComputeSystem(computeSystem, configuration, &resultp)\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsModifyServiceSettings(ctx gcontext.Context, settings string) (result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsModifyServiceSettings\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\toc.SetSpanStatus(span, hr)\n\t}()\n\tspan.AddAttributes(trace.StringAttribute(\"settings\", settings))\n\n\treturn result, execute(ctx, timeout.SyscallWatcher, func() error {\n\t\tvar resultp *uint16\n\t\terr := hcsModifyServiceSettings(settings, &resultp)\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsRegisterComputeSystemCallback(ctx gcontext.Context, computeSystem HcsSystem, callback uintptr, context uintptr) (callbackHandle HcsCallback, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsRegisterComputeSystemCallback\")\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, hr) }()\n\n\treturn callbackHandle, execute(ctx, timeout.SyscallWatcher, func() error {\n\t\treturn hcsRegisterComputeSystemCallback(computeSystem, callback, context, &callbackHandle)\n\t})\n}\n\nfunc HcsUnregisterComputeSystemCallback(ctx gcontext.Context, callbackHandle HcsCallback) (hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsUnregisterComputeSystemCallback\")\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, hr) }()\n\n\treturn execute(ctx, timeout.SyscallWatcher, func() error {\n\t\treturn hcsUnregisterComputeSystemCallback(callbackHandle)\n\t})\n}\n\nfunc HcsCreateProcess(ctx gcontext.Context, computeSystem HcsSystem, processParameters string) (processInformation HcsProcessInformation, process HcsProcess, result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsCreateProcess\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\toc.SetSpanStatus(span, hr)\n\t}()\n\tif span.IsRecordingEvents() {\n\t\t// wont handle v1 process parameters\n\t\tif s, err := log.ScrubProcessParameters(processParameters); err == nil {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"processParameters\", s))\n\t\t}\n\t}\n\n\treturn processInformation, process, result, execute(ctx, timeout.SyscallWatcher, func() error {\n\t\tvar resultp *uint16\n\t\terr := hcsCreateProcess(computeSystem, processParameters, &processInformation, &process, &resultp)\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsOpenProcess(ctx gcontext.Context, computeSystem HcsSystem, pid uint32) (process HcsProcess, result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsOpenProcess\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\toc.SetSpanStatus(span, hr)\n\t}()\n\tspan.AddAttributes(trace.Int64Attribute(\"pid\", int64(pid)))\n\n\treturn process, result, execute(ctx, timeout.SyscallWatcher, func() error {\n\t\tvar resultp *uint16\n\t\terr := hcsOpenProcess(computeSystem, pid, &process, &resultp)\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsCloseProcess(ctx gcontext.Context, process HcsProcess) (hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsCloseProcess\")\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, hr) }()\n\n\treturn execute(ctx, timeout.SyscallWatcher, func() error {\n\t\treturn hcsCloseProcess(process)\n\t})\n}\n\nfunc HcsTerminateProcess(ctx gcontext.Context, process HcsProcess) (result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsTerminateProcess\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\toc.SetSpanStatus(span, hr)\n\t}()\n\n\treturn result, execute(ctx, timeout.SyscallWatcher, func() error {\n\t\tvar resultp *uint16\n\t\terr := hcsTerminateProcess(process, &resultp)\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsSignalProcess(ctx gcontext.Context, process HcsProcess, options string) (result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsSignalProcess\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\toc.SetSpanStatus(span, hr)\n\t}()\n\tspan.AddAttributes(trace.StringAttribute(\"options\", options))\n\n\treturn result, execute(ctx, timeout.SyscallWatcher, func() error {\n\t\tvar resultp *uint16\n\t\terr := hcsSignalProcess(process, options, &resultp)\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsGetProcessInfo(ctx gcontext.Context, process HcsProcess) (processInformation HcsProcessInformation, result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsGetProcessInfo\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\toc.SetSpanStatus(span, hr)\n\t}()\n\n\treturn processInformation, result, execute(ctx, timeout.SyscallWatcher, func() error {\n\t\tvar resultp *uint16\n\t\terr := hcsGetProcessInfo(process, &processInformation, &resultp)\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsGetProcessProperties(ctx gcontext.Context, process HcsProcess) (processProperties, result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsGetProcessProperties\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\toc.SetSpanStatus(span, hr)\n\t}()\n\n\treturn processProperties, result, execute(ctx, timeout.SyscallWatcher, func() error {\n\t\tvar (\n\t\t\tprocessPropertiesp *uint16\n\t\t\tresultp            *uint16\n\t\t)\n\t\terr := hcsGetProcessProperties(process, &processPropertiesp, &resultp)\n\t\tif processPropertiesp != nil {\n\t\t\tprocessProperties = interop.ConvertAndFreeCoTaskMemString(processPropertiesp)\n\t\t}\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsModifyProcess(ctx gcontext.Context, process HcsProcess, settings string) (result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsModifyProcess\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\toc.SetSpanStatus(span, hr)\n\t}()\n\tspan.AddAttributes(trace.StringAttribute(\"settings\", settings))\n\n\treturn result, execute(ctx, timeout.SyscallWatcher, func() error {\n\t\tvar resultp *uint16\n\t\terr := hcsModifyProcess(process, settings, &resultp)\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsGetServiceProperties(ctx gcontext.Context, propertyQuery string) (properties, result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsGetServiceProperties\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\toc.SetSpanStatus(span, hr)\n\t}()\n\tspan.AddAttributes(trace.StringAttribute(\"propertyQuery\", propertyQuery))\n\n\treturn properties, result, execute(ctx, timeout.SyscallWatcher, func() error {\n\t\tvar (\n\t\t\tpropertiesp *uint16\n\t\t\tresultp     *uint16\n\t\t)\n\t\terr := hcsGetServiceProperties(propertyQuery, &propertiesp, &resultp)\n\t\tif propertiesp != nil {\n\t\t\tproperties = interop.ConvertAndFreeCoTaskMemString(propertiesp)\n\t\t}\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc HcsRegisterProcessCallback(ctx gcontext.Context, process HcsProcess, callback uintptr, context uintptr) (callbackHandle HcsCallback, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsRegisterProcessCallback\")\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, hr) }()\n\n\treturn callbackHandle, execute(ctx, timeout.SyscallWatcher, func() error {\n\t\treturn hcsRegisterProcessCallback(process, callback, context, &callbackHandle)\n\t})\n}\n\nfunc HcsUnregisterProcessCallback(ctx gcontext.Context, callbackHandle HcsCallback) (hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsUnregisterProcessCallback\")\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, hr) }()\n\n\treturn execute(ctx, timeout.SyscallWatcher, func() error {\n\t\treturn hcsUnregisterProcessCallback(callbackHandle)\n\t})\n}\n\nfunc HcsSaveComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) {\n\tctx, span := oc.StartSpan(ctx, \"HcsSaveComputeSystem\")\n\tdefer span.End()\n\tdefer func() {\n\t\tif result != \"\" {\n\t\t\tspan.AddAttributes(trace.StringAttribute(\"result\", result))\n\t\t}\n\t\tif hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned\n\t\t\toc.SetSpanStatus(span, hr)\n\t\t}\n\t}()\n\n\treturn result, execute(ctx, timeout.SyscallWatcher, func() error {\n\t\tvar resultp *uint16\n\t\terr := hcsSaveComputeSystem(computeSystem, options, &resultp)\n\t\tif resultp != nil {\n\t\t\tresult = interop.ConvertAndFreeCoTaskMemString(resultp)\n\t\t}\n\t\treturn err\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/vmcompute/zsyscall_windows.go",
    "content": "//go:build windows\n\n// Code generated by 'go generate' using \"github.com/Microsoft/go-winio/tools/mkwinsyscall\"; DO NOT EDIT.\n\npackage vmcompute\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\nvar _ unsafe.Pointer\n\n// Do the interface allocations only once for common\n// Errno values.\nconst (\n\terrnoERROR_IO_PENDING = 997\n)\n\nvar (\n\terrERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)\n\terrERROR_EINVAL     error = syscall.EINVAL\n)\n\n// errnoErr returns common boxed Errno values, to prevent\n// allocations at runtime.\nfunc errnoErr(e syscall.Errno) error {\n\tswitch e {\n\tcase 0:\n\t\treturn errERROR_EINVAL\n\tcase errnoERROR_IO_PENDING:\n\t\treturn errERROR_IO_PENDING\n\t}\n\treturn e\n}\n\nvar (\n\tmodvmcompute = windows.NewLazySystemDLL(\"vmcompute.dll\")\n\n\tprocHcsCloseComputeSystem              = modvmcompute.NewProc(\"HcsCloseComputeSystem\")\n\tprocHcsCloseProcess                    = modvmcompute.NewProc(\"HcsCloseProcess\")\n\tprocHcsCreateComputeSystem             = modvmcompute.NewProc(\"HcsCreateComputeSystem\")\n\tprocHcsCreateProcess                   = modvmcompute.NewProc(\"HcsCreateProcess\")\n\tprocHcsEnumerateComputeSystems         = modvmcompute.NewProc(\"HcsEnumerateComputeSystems\")\n\tprocHcsGetComputeSystemProperties      = modvmcompute.NewProc(\"HcsGetComputeSystemProperties\")\n\tprocHcsGetProcessInfo                  = modvmcompute.NewProc(\"HcsGetProcessInfo\")\n\tprocHcsGetProcessProperties            = modvmcompute.NewProc(\"HcsGetProcessProperties\")\n\tprocHcsGetServiceProperties            = modvmcompute.NewProc(\"HcsGetServiceProperties\")\n\tprocHcsModifyComputeSystem             = modvmcompute.NewProc(\"HcsModifyComputeSystem\")\n\tprocHcsModifyProcess                   = modvmcompute.NewProc(\"HcsModifyProcess\")\n\tprocHcsModifyServiceSettings           = modvmcompute.NewProc(\"HcsModifyServiceSettings\")\n\tprocHcsOpenComputeSystem               = modvmcompute.NewProc(\"HcsOpenComputeSystem\")\n\tprocHcsOpenProcess                     = modvmcompute.NewProc(\"HcsOpenProcess\")\n\tprocHcsPauseComputeSystem              = modvmcompute.NewProc(\"HcsPauseComputeSystem\")\n\tprocHcsRegisterComputeSystemCallback   = modvmcompute.NewProc(\"HcsRegisterComputeSystemCallback\")\n\tprocHcsRegisterProcessCallback         = modvmcompute.NewProc(\"HcsRegisterProcessCallback\")\n\tprocHcsResumeComputeSystem             = modvmcompute.NewProc(\"HcsResumeComputeSystem\")\n\tprocHcsSaveComputeSystem               = modvmcompute.NewProc(\"HcsSaveComputeSystem\")\n\tprocHcsShutdownComputeSystem           = modvmcompute.NewProc(\"HcsShutdownComputeSystem\")\n\tprocHcsSignalProcess                   = modvmcompute.NewProc(\"HcsSignalProcess\")\n\tprocHcsStartComputeSystem              = modvmcompute.NewProc(\"HcsStartComputeSystem\")\n\tprocHcsTerminateComputeSystem          = modvmcompute.NewProc(\"HcsTerminateComputeSystem\")\n\tprocHcsTerminateProcess                = modvmcompute.NewProc(\"HcsTerminateProcess\")\n\tprocHcsUnregisterComputeSystemCallback = modvmcompute.NewProc(\"HcsUnregisterComputeSystemCallback\")\n\tprocHcsUnregisterProcessCallback       = modvmcompute.NewProc(\"HcsUnregisterProcessCallback\")\n)\n\nfunc hcsCloseComputeSystem(computeSystem HcsSystem) (hr error) {\n\thr = procHcsCloseComputeSystem.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsCloseComputeSystem.Addr(), uintptr(computeSystem))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsCloseProcess(process HcsProcess) (hr error) {\n\thr = procHcsCloseProcess.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsCloseProcess.Addr(), uintptr(process))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsCreateComputeSystem(id string, configuration string, identity syscall.Handle, computeSystem *HcsSystem, result **uint16) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(id)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(configuration)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsCreateComputeSystem(_p0, _p1, identity, computeSystem, result)\n}\n\nfunc _hcsCreateComputeSystem(id *uint16, configuration *uint16, identity syscall.Handle, computeSystem *HcsSystem, result **uint16) (hr error) {\n\thr = procHcsCreateComputeSystem.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsCreateComputeSystem.Addr(), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(configuration)), uintptr(identity), uintptr(unsafe.Pointer(computeSystem)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsCreateProcess(computeSystem HcsSystem, processParameters string, processInformation *HcsProcessInformation, process *HcsProcess, result **uint16) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(processParameters)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsCreateProcess(computeSystem, _p0, processInformation, process, result)\n}\n\nfunc _hcsCreateProcess(computeSystem HcsSystem, processParameters *uint16, processInformation *HcsProcessInformation, process *HcsProcess, result **uint16) (hr error) {\n\thr = procHcsCreateProcess.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsCreateProcess.Addr(), uintptr(computeSystem), uintptr(unsafe.Pointer(processParameters)), uintptr(unsafe.Pointer(processInformation)), uintptr(unsafe.Pointer(process)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsEnumerateComputeSystems(query string, computeSystems **uint16, result **uint16) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(query)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsEnumerateComputeSystems(_p0, computeSystems, result)\n}\n\nfunc _hcsEnumerateComputeSystems(query *uint16, computeSystems **uint16, result **uint16) (hr error) {\n\thr = procHcsEnumerateComputeSystems.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsEnumerateComputeSystems.Addr(), uintptr(unsafe.Pointer(query)), uintptr(unsafe.Pointer(computeSystems)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsGetComputeSystemProperties(computeSystem HcsSystem, propertyQuery string, properties **uint16, result **uint16) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(propertyQuery)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsGetComputeSystemProperties(computeSystem, _p0, properties, result)\n}\n\nfunc _hcsGetComputeSystemProperties(computeSystem HcsSystem, propertyQuery *uint16, properties **uint16, result **uint16) (hr error) {\n\thr = procHcsGetComputeSystemProperties.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsGetComputeSystemProperties.Addr(), uintptr(computeSystem), uintptr(unsafe.Pointer(propertyQuery)), uintptr(unsafe.Pointer(properties)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsGetProcessInfo(process HcsProcess, processInformation *HcsProcessInformation, result **uint16) (hr error) {\n\thr = procHcsGetProcessInfo.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsGetProcessInfo.Addr(), uintptr(process), uintptr(unsafe.Pointer(processInformation)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsGetProcessProperties(process HcsProcess, processProperties **uint16, result **uint16) (hr error) {\n\thr = procHcsGetProcessProperties.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsGetProcessProperties.Addr(), uintptr(process), uintptr(unsafe.Pointer(processProperties)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsGetServiceProperties(propertyQuery string, properties **uint16, result **uint16) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(propertyQuery)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsGetServiceProperties(_p0, properties, result)\n}\n\nfunc _hcsGetServiceProperties(propertyQuery *uint16, properties **uint16, result **uint16) (hr error) {\n\thr = procHcsGetServiceProperties.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsGetServiceProperties.Addr(), uintptr(unsafe.Pointer(propertyQuery)), uintptr(unsafe.Pointer(properties)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsModifyComputeSystem(computeSystem HcsSystem, configuration string, result **uint16) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(configuration)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsModifyComputeSystem(computeSystem, _p0, result)\n}\n\nfunc _hcsModifyComputeSystem(computeSystem HcsSystem, configuration *uint16, result **uint16) (hr error) {\n\thr = procHcsModifyComputeSystem.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsModifyComputeSystem.Addr(), uintptr(computeSystem), uintptr(unsafe.Pointer(configuration)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsModifyProcess(process HcsProcess, settings string, result **uint16) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(settings)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsModifyProcess(process, _p0, result)\n}\n\nfunc _hcsModifyProcess(process HcsProcess, settings *uint16, result **uint16) (hr error) {\n\thr = procHcsModifyProcess.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsModifyProcess.Addr(), uintptr(process), uintptr(unsafe.Pointer(settings)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsModifyServiceSettings(settings string, result **uint16) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(settings)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsModifyServiceSettings(_p0, result)\n}\n\nfunc _hcsModifyServiceSettings(settings *uint16, result **uint16) (hr error) {\n\thr = procHcsModifyServiceSettings.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsModifyServiceSettings.Addr(), uintptr(unsafe.Pointer(settings)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsOpenComputeSystem(id string, computeSystem *HcsSystem, result **uint16) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(id)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsOpenComputeSystem(_p0, computeSystem, result)\n}\n\nfunc _hcsOpenComputeSystem(id *uint16, computeSystem *HcsSystem, result **uint16) (hr error) {\n\thr = procHcsOpenComputeSystem.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsOpenComputeSystem.Addr(), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(computeSystem)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsOpenProcess(computeSystem HcsSystem, pid uint32, process *HcsProcess, result **uint16) (hr error) {\n\thr = procHcsOpenProcess.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsOpenProcess.Addr(), uintptr(computeSystem), uintptr(pid), uintptr(unsafe.Pointer(process)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsPauseComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(options)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsPauseComputeSystem(computeSystem, _p0, result)\n}\n\nfunc _hcsPauseComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) {\n\thr = procHcsPauseComputeSystem.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsPauseComputeSystem.Addr(), uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsRegisterComputeSystemCallback(computeSystem HcsSystem, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) {\n\thr = procHcsRegisterComputeSystemCallback.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsRegisterComputeSystemCallback.Addr(), uintptr(computeSystem), uintptr(callback), uintptr(context), uintptr(unsafe.Pointer(callbackHandle)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsRegisterProcessCallback(process HcsProcess, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) {\n\thr = procHcsRegisterProcessCallback.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsRegisterProcessCallback.Addr(), uintptr(process), uintptr(callback), uintptr(context), uintptr(unsafe.Pointer(callbackHandle)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsResumeComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(options)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsResumeComputeSystem(computeSystem, _p0, result)\n}\n\nfunc _hcsResumeComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) {\n\thr = procHcsResumeComputeSystem.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsResumeComputeSystem.Addr(), uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsSaveComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(options)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsSaveComputeSystem(computeSystem, _p0, result)\n}\n\nfunc _hcsSaveComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) {\n\thr = procHcsSaveComputeSystem.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsSaveComputeSystem.Addr(), uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsShutdownComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(options)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsShutdownComputeSystem(computeSystem, _p0, result)\n}\n\nfunc _hcsShutdownComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) {\n\thr = procHcsShutdownComputeSystem.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsShutdownComputeSystem.Addr(), uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsSignalProcess(process HcsProcess, options string, result **uint16) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(options)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsSignalProcess(process, _p0, result)\n}\n\nfunc _hcsSignalProcess(process HcsProcess, options *uint16, result **uint16) (hr error) {\n\thr = procHcsSignalProcess.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsSignalProcess.Addr(), uintptr(process), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsStartComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(options)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsStartComputeSystem(computeSystem, _p0, result)\n}\n\nfunc _hcsStartComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) {\n\thr = procHcsStartComputeSystem.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsStartComputeSystem.Addr(), uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsTerminateComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(options)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _hcsTerminateComputeSystem(computeSystem, _p0, result)\n}\n\nfunc _hcsTerminateComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) {\n\thr = procHcsTerminateComputeSystem.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsTerminateComputeSystem.Addr(), uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsTerminateProcess(process HcsProcess, result **uint16) (hr error) {\n\thr = procHcsTerminateProcess.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsTerminateProcess.Addr(), uintptr(process), uintptr(unsafe.Pointer(result)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsUnregisterComputeSystemCallback(callbackHandle HcsCallback) (hr error) {\n\thr = procHcsUnregisterComputeSystemCallback.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsUnregisterComputeSystemCallback.Addr(), uintptr(callbackHandle))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc hcsUnregisterProcessCallback(callbackHandle HcsCallback) (hr error) {\n\thr = procHcsUnregisterProcessCallback.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procHcsUnregisterProcessCallback.Addr(), uintptr(callbackHandle))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/activatelayer.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"go.opencensus.io/trace\"\n)\n\n// ActivateLayer will find the layer with the given id and mount it's filesystem.\n// For a read/write layer, the mounted filesystem will appear as a volume on the\n// host, while a read-only layer is generally expected to be a no-op.\n// An activated layer must later be deactivated via DeactivateLayer.\nfunc ActivateLayer(ctx context.Context, path string) (err error) {\n\ttitle := \"hcsshim::ActivateLayer\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"path\", path))\n\n\terr = activateLayer(&stdDriverInfo, path)\n\tif err != nil {\n\t\treturn hcserror.New(err, title, \"\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayerreader.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"syscall\"\n\n\t\"github.com/Microsoft/go-winio\"\n\t\"github.com/Microsoft/hcsshim/internal/longpath\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"go.opencensus.io/trace\"\n)\n\ntype baseLayerReader struct {\n\ts            *trace.Span\n\troot         string\n\tresult       chan *fileEntry\n\tproceed      chan bool\n\tcurrentFile  *os.File\n\tbackupReader *winio.BackupFileReader\n}\n\nfunc newBaseLayerReader(root string, s *trace.Span) (r *baseLayerReader) {\n\tr = &baseLayerReader{\n\t\ts:       s,\n\t\troot:    root,\n\t\tresult:  make(chan *fileEntry),\n\t\tproceed: make(chan bool),\n\t}\n\tgo r.walk()\n\treturn r\n}\n\nfunc (r *baseLayerReader) walkUntilCancelled() error {\n\troot, err := longpath.LongAbs(r.root)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tr.root = root\n\n\terr = filepath.Walk(filepath.Join(r.root, filesPath), func(path string, info os.FileInfo, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Indirect fix for https://github.com/moby/moby/issues/32838#issuecomment-343610048.\n\t\t// Handle failure from what may be a golang bug in the conversion of\n\t\t// UTF16 to UTF8 in files which are left in the recycle bin. Os.Lstat\n\t\t// which is called by filepath.Walk will fail when a filename contains\n\t\t// unicode characters. Skip the recycle bin regardless which is goodness.\n\t\tif strings.EqualFold(path, filepath.Join(r.root, `Files\\$Recycle.Bin`)) && info.IsDir() {\n\t\t\treturn filepath.SkipDir\n\t\t}\n\n\t\tr.result <- &fileEntry{path, info, nil}\n\t\tif !<-r.proceed {\n\t\t\treturn errorIterationCanceled\n\t\t}\n\n\t\treturn nil\n\t})\n\n\tif err == errorIterationCanceled { //nolint:errorlint // explicitly returned\n\t\treturn nil\n\t}\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tutilityVMAbsPath := filepath.Join(r.root, UtilityVMPath)\n\tutilityVMFilesAbsPath := filepath.Join(r.root, UtilityVMFilesPath)\n\n\t// Ignore a UtilityVM without Files, that's not _really_ a UtiltyVM\n\tif _, err = os.Lstat(utilityVMFilesAbsPath); err != nil {\n\t\tif os.IsNotExist(err) {\n\t\t\treturn io.EOF\n\t\t}\n\t\treturn err\n\t}\n\n\terr = filepath.Walk(utilityVMAbsPath, func(path string, info os.FileInfo, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif path != utilityVMAbsPath && path != utilityVMFilesAbsPath && !hasPathPrefix(path, utilityVMFilesAbsPath) {\n\t\t\tif info.IsDir() {\n\t\t\t\treturn filepath.SkipDir\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\n\t\tr.result <- &fileEntry{path, info, nil}\n\t\tif !<-r.proceed {\n\t\t\treturn errorIterationCanceled\n\t\t}\n\n\t\treturn nil\n\t})\n\n\tif err == errorIterationCanceled { //nolint:errorlint // explicitly returned\n\t\treturn nil\n\t}\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn io.EOF\n}\n\nfunc (r *baseLayerReader) walk() {\n\tdefer close(r.result)\n\tif !<-r.proceed {\n\t\treturn\n\t}\n\n\terr := r.walkUntilCancelled()\n\tif err != nil {\n\t\tfor {\n\t\t\tr.result <- &fileEntry{err: err}\n\t\t\tif !<-r.proceed {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (r *baseLayerReader) reset() {\n\tif r.backupReader != nil {\n\t\tr.backupReader.Close()\n\t\tr.backupReader = nil\n\t}\n\tif r.currentFile != nil {\n\t\tr.currentFile.Close()\n\t\tr.currentFile = nil\n\t}\n}\n\nfunc (r *baseLayerReader) Next() (path string, size int64, fileInfo *winio.FileBasicInfo, err error) {\n\tr.reset()\n\tr.proceed <- true\n\tfe := <-r.result\n\tif fe == nil {\n\t\terr = errors.New(\"BaseLayerReader closed\")\n\t\treturn\n\t}\n\tif fe.err != nil {\n\t\terr = fe.err\n\t\treturn\n\t}\n\n\tpath, err = filepath.Rel(r.root, fe.path)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tf, err := openFileOrDir(fe.path, syscall.GENERIC_READ, syscall.OPEN_EXISTING)\n\tif err != nil {\n\t\treturn\n\t}\n\tdefer func() {\n\t\tif f != nil {\n\t\t\tf.Close()\n\t\t}\n\t}()\n\n\tfileInfo, err = winio.GetFileBasicInfo(f)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tsize = fe.fi.Size()\n\tr.backupReader = winio.NewBackupFileReader(f, true)\n\n\tr.currentFile = f\n\tf = nil\n\treturn\n}\n\nfunc (r *baseLayerReader) LinkInfo() (uint32, *winio.FileIDInfo, error) {\n\tfileStandardInfo, err := winio.GetFileStandardInfo(r.currentFile)\n\tif err != nil {\n\t\treturn 0, nil, err\n\t}\n\tfileIDInfo, err := winio.GetFileID(r.currentFile)\n\tif err != nil {\n\t\treturn 0, nil, err\n\t}\n\treturn fileStandardInfo.NumberOfLinks, fileIDInfo, nil\n}\n\nfunc (r *baseLayerReader) Read(b []byte) (int, error) {\n\tif r.backupReader == nil {\n\t\treturn 0, io.EOF\n\t}\n\treturn r.backupReader.Read(b)\n}\n\nfunc (r *baseLayerReader) Close() (err error) {\n\tdefer r.s.End()\n\tdefer func() {\n\t\toc.SetSpanStatus(r.s, err)\n\t\tclose(r.proceed)\n\t}()\n\tr.proceed <- false\n\t// The r.result channel will be closed once walk() returns\n\t<-r.result\n\tr.reset()\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayerwriter.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"syscall\"\n\n\t\"github.com/Microsoft/go-winio\"\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"github.com/Microsoft/hcsshim/internal/safefile\"\n\t\"github.com/Microsoft/hcsshim/internal/winapi\"\n\t\"go.opencensus.io/trace\"\n)\n\ntype baseLayerWriter struct {\n\tctx context.Context\n\ts   *trace.Span\n\n\troot         *os.File\n\tf            *os.File\n\tbw           *winio.BackupFileWriter\n\terr          error\n\thasUtilityVM bool\n\tdirInfo      []dirInfo\n}\n\ntype dirInfo struct {\n\tpath     string\n\tfileInfo winio.FileBasicInfo\n}\n\n// reapplyDirectoryTimes reapplies directory modification, creation, etc. times\n// after processing of the directory tree has completed. The times are expected\n// to be ordered such that parent directories come before child directories.\nfunc reapplyDirectoryTimes(root *os.File, dis []dirInfo) error {\n\tfor i := range dis {\n\t\tdi := &dis[len(dis)-i-1] // reverse order: process child directories first\n\t\tf, err := safefile.OpenRelative(di.path, root, syscall.GENERIC_READ|syscall.GENERIC_WRITE, syscall.FILE_SHARE_READ, winapi.FILE_OPEN, winapi.FILE_DIRECTORY_FILE|syscall.FILE_FLAG_OPEN_REPARSE_POINT)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\terr = winio.SetFileBasicInfo(f, &di.fileInfo)\n\t\tf.Close()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (w *baseLayerWriter) closeCurrentFile() error {\n\tif w.f != nil {\n\t\terr := w.bw.Close()\n\t\terr2 := w.f.Close()\n\t\tw.f = nil\n\t\tw.bw = nil\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err2 != nil {\n\t\t\treturn err2\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (w *baseLayerWriter) Add(name string, fileInfo *winio.FileBasicInfo) (err error) {\n\tdefer func() {\n\t\tif err != nil {\n\t\t\tw.err = err\n\t\t}\n\t}()\n\n\terr = w.closeCurrentFile()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif filepath.ToSlash(name) == `UtilityVM/Files` {\n\t\tw.hasUtilityVM = true\n\t}\n\n\tvar f *os.File\n\tdefer func() {\n\t\tif f != nil {\n\t\t\tf.Close()\n\t\t}\n\t}()\n\n\textraFlags := uint32(0)\n\tif fileInfo.FileAttributes&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 {\n\t\textraFlags |= winapi.FILE_DIRECTORY_FILE\n\t\tw.dirInfo = append(w.dirInfo, dirInfo{name, *fileInfo})\n\t}\n\n\tmode := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE | winio.WRITE_DAC | winio.WRITE_OWNER | winio.ACCESS_SYSTEM_SECURITY)\n\tf, err = safefile.OpenRelative(name, w.root, mode, syscall.FILE_SHARE_READ, winapi.FILE_CREATE, extraFlags)\n\tif err != nil {\n\t\treturn hcserror.New(err, \"Failed to safefile.OpenRelative\", name)\n\t}\n\n\terr = winio.SetFileBasicInfo(f, fileInfo)\n\tif err != nil {\n\t\treturn hcserror.New(err, \"Failed to SetFileBasicInfo\", name)\n\t}\n\n\tw.f = f\n\tw.bw = winio.NewBackupFileWriter(f, true)\n\tf = nil\n\treturn nil\n}\n\nfunc (w *baseLayerWriter) AddLink(name string, target string) (err error) {\n\tdefer func() {\n\t\tif err != nil {\n\t\t\tw.err = err\n\t\t}\n\t}()\n\n\terr = w.closeCurrentFile()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn safefile.LinkRelative(target, w.root, name, w.root)\n}\n\nfunc (w *baseLayerWriter) Remove(name string) error {\n\treturn errors.New(\"base layer cannot have tombstones\")\n}\n\nfunc (w *baseLayerWriter) Write(b []byte) (int, error) {\n\tn, err := w.bw.Write(b)\n\tif err != nil {\n\t\tw.err = err\n\t}\n\treturn n, err\n}\n\nfunc (w *baseLayerWriter) Close() (err error) {\n\tdefer w.s.End()\n\tdefer func() { oc.SetSpanStatus(w.s, err) }()\n\tdefer func() {\n\t\tw.root.Close()\n\t\tw.root = nil\n\t}()\n\n\terr = w.closeCurrentFile()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif w.err == nil {\n\t\t// Restore the file times of all the directories, since they may have\n\t\t// been modified by creating child directories.\n\t\terr = reapplyDirectoryTimes(w.root, w.dirInfo)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\terr = ProcessBaseLayer(w.ctx, w.root.Name())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif w.hasUtilityVM {\n\t\t\terr := safefile.EnsureNotReparsePointRelative(\"UtilityVM\", w.root)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\terr = ProcessUtilityVMImage(w.ctx, filepath.Join(w.root.Name(), \"UtilityVM\"))\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn w.err\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/converttobaselayer.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n\t\"github.com/Microsoft/hcsshim/internal/longpath\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"github.com/Microsoft/hcsshim/internal/safefile\"\n\t\"github.com/Microsoft/hcsshim/internal/winapi\"\n\t\"github.com/pkg/errors\"\n\t\"go.opencensus.io/trace\"\n\t\"golang.org/x/sys/windows\"\n)\n\nvar hiveNames = []string{\"DEFAULT\", \"SAM\", \"SECURITY\", \"SOFTWARE\", \"SYSTEM\"}\n\n// Ensure the given file exists as an ordinary file, and create a minimal hive file if not.\nfunc ensureHive(path string, root *os.File) (err error) {\n\t_, err = safefile.LstatRelative(path, root)\n\tif err != nil && !os.IsNotExist(err) {\n\t\treturn fmt.Errorf(\"accessing %s: %w\", path, err)\n\t}\n\n\tversion := windows.RtlGetVersion()\n\tif version == nil {\n\t\treturn fmt.Errorf(\"failed to get OS version\")\n\t}\n\n\tvar fullPath string\n\tfullPath, err = longpath.LongAbs(filepath.Join(root.Name(), path))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"getting path: %w\", err)\n\t}\n\n\tvar key winapi.ORHKey\n\terr = winapi.ORCreateHive(&key)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"creating hive: %w\", err)\n\t}\n\n\tdefer func() {\n\t\tcloseErr := winapi.ORCloseHive(key)\n\t\tif closeErr != nil && err == nil {\n\t\t\terr = fmt.Errorf(\"closing hive key: %w\", closeErr)\n\t\t}\n\t}()\n\n\terr = winapi.ORSaveHive(key, fullPath, version.MajorVersion, version.MinorVersion)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"saving hive: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc ensureBaseLayer(root *os.File) (hasUtilityVM bool, err error) {\n\t// The base layer registry hives will be copied from here\n\tconst hiveSourcePath = \"Files\\\\Windows\\\\System32\\\\config\"\n\tif err = safefile.MkdirAllRelative(hiveSourcePath, root); err != nil {\n\t\treturn\n\t}\n\n\tfor _, hiveName := range hiveNames {\n\t\thivePath := filepath.Join(hiveSourcePath, hiveName)\n\t\tif err = ensureHive(hivePath, root); err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\tstat, err := safefile.LstatRelative(UtilityVMFilesPath, root)\n\n\tif os.IsNotExist(err) {\n\t\treturn false, nil\n\t}\n\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif !stat.Mode().IsDir() {\n\t\tfullPath := filepath.Join(root.Name(), UtilityVMFilesPath)\n\t\treturn false, errors.Errorf(\"%s has unexpected file mode %s\", fullPath, stat.Mode().String())\n\t}\n\n\tconst bcdRelativePath = \"EFI\\\\Microsoft\\\\Boot\\\\BCD\"\n\n\t// Just check that this exists as a regular file. If it exists but is not a valid registry hive,\n\t// ProcessUtilityVMImage will complain:\n\t// \"The registry could not read in, or write out, or flush, one of the files that contain the system's image of the registry.\"\n\tbcdPath := filepath.Join(UtilityVMFilesPath, bcdRelativePath)\n\n\tstat, err = safefile.LstatRelative(bcdPath, root)\n\tif err != nil {\n\t\treturn false, errors.Wrapf(err, \"UtilityVM must contain '%s'\", bcdRelativePath)\n\t}\n\n\tif !stat.Mode().IsRegular() {\n\t\tfullPath := filepath.Join(root.Name(), bcdPath)\n\t\treturn false, errors.Errorf(\"%s has unexpected file mode %s\", fullPath, stat.Mode().String())\n\t}\n\n\treturn true, nil\n}\n\nfunc convertToBaseLayer(ctx context.Context, root *os.File) error {\n\thasUtilityVM, err := ensureBaseLayer(root)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := ProcessBaseLayer(ctx, root.Name()); err != nil {\n\t\treturn err\n\t}\n\n\tif !hasUtilityVM {\n\t\treturn nil\n\t}\n\n\terr = safefile.EnsureNotReparsePointRelative(UtilityVMPath, root)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tutilityVMPath := filepath.Join(root.Name(), UtilityVMPath)\n\treturn ProcessUtilityVMImage(ctx, utilityVMPath)\n}\n\n// ConvertToBaseLayer processes a candidate base layer, i.e. a directory\n// containing the desired file content under Files/, and optionally the\n// desired file content for a UtilityVM under UtilityVM/Files/\nfunc ConvertToBaseLayer(ctx context.Context, path string) (err error) {\n\ttitle := \"hcsshim::ConvertToBaseLayer\"\n\tctx, span := trace.StartSpan(ctx, title)\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"path\", path))\n\n\troot, err := safefile.OpenRoot(path)\n\tif err != nil {\n\t\treturn hcserror.New(err, title+\" - failed\", \"\")\n\t}\n\tdefer func() {\n\t\tif err2 := root.Close(); err == nil && err2 != nil {\n\t\t\terr = hcserror.New(err2, title+\" - failed\", \"\")\n\t\t}\n\t}()\n\n\tif err = convertToBaseLayer(ctx, root); err != nil {\n\t\treturn hcserror.New(err, title+\" - failed\", \"\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/createlayer.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"go.opencensus.io/trace\"\n)\n\n// CreateLayer creates a new, empty, read-only layer on the filesystem based on\n// the parent layer provided.\nfunc CreateLayer(ctx context.Context, path, parent string) (err error) {\n\ttitle := \"hcsshim::CreateLayer\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"path\", path),\n\t\ttrace.StringAttribute(\"parent\", parent))\n\n\terr = createLayer(&stdDriverInfo, path, parent)\n\tif err != nil {\n\t\treturn hcserror.New(err, title, \"\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\t\"strings\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"go.opencensus.io/trace\"\n)\n\n// CreateScratchLayer creates and populates new read-write layer for use by a container.\n// This requires the full list of paths to all parent layers up to the base\nfunc CreateScratchLayer(ctx context.Context, path string, parentLayerPaths []string) (err error) {\n\ttitle := \"hcsshim::CreateScratchLayer\"\n\tctx, span := oc.StartSpan(ctx, title)\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"path\", path),\n\t\ttrace.StringAttribute(\"parentLayerPaths\", strings.Join(parentLayerPaths, \", \")))\n\n\t// Generate layer descriptors\n\tlayers, err := layerPathsToDescriptors(ctx, parentLayerPaths)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = createSandboxLayer(&stdDriverInfo, path, 0, layers)\n\tif err != nil {\n\t\treturn hcserror.New(err, title, \"\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/deactivatelayer.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"go.opencensus.io/trace\"\n)\n\n// DeactivateLayer will dismount a layer that was mounted via ActivateLayer.\nfunc DeactivateLayer(ctx context.Context, path string) (err error) {\n\ttitle := \"hcsshim::DeactivateLayer\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"path\", path))\n\n\terr = deactivateLayer(&stdDriverInfo, path)\n\tif err != nil {\n\t\treturn hcserror.New(err, title+\"- failed\", \"\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/destroylayer.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"go.opencensus.io/trace\"\n)\n\n// DestroyLayer will remove the on-disk files representing the layer with the given\n// path, including that layer's containing folder, if any.\nfunc DestroyLayer(ctx context.Context, path string) (err error) {\n\ttitle := \"hcsshim::DestroyLayer\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"path\", path))\n\n\terr = destroyLayer(&stdDriverInfo, path)\n\tif err != nil {\n\t\treturn hcserror.New(err, title, \"\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/doc.go",
    "content": "// Package wclayer provides bindings to HCS's legacy layer management API and\n// provides a higher level interface around these calls for container layer\n// management.\npackage wclayer\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/expandscratchsize.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"go.opencensus.io/trace\"\n)\n\n// ExpandScratchSize expands the size of a layer to at least size bytes.\nfunc ExpandScratchSize(ctx context.Context, path string, size uint64) (err error) {\n\ttitle := \"hcsshim::ExpandScratchSize\"\n\tctx, span := oc.StartSpan(ctx, title)\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"path\", path),\n\t\ttrace.Int64Attribute(\"size\", int64(size)))\n\n\terr = expandSandboxSize(&stdDriverInfo, path, size)\n\tif err != nil {\n\t\treturn hcserror.New(err, title, \"\")\n\t}\n\n\t// Always expand the volume too. In case of legacy layers not expanding the volume here works because\n\t// the PrepareLayer call internally handles the expansion. However, in other cases (like CimFS) we\n\t// don't call PrepareLayer and so the volume will never be expanded.  This also means in case of\n\t// legacy layers, we might have a small perf hit because the VHD is mounted twice for expansion (once\n\t// here and once during the PrepareLayer call). But as long as the perf hit is minimal, we should be\n\t// okay.\n\terr = expandSandboxVolume(ctx, path)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\ntype virtualStorageType struct {\n\tDeviceID uint32\n\tVendorID [16]byte\n}\n\ntype openVersion2 struct {\n\tGetInfoOnly    int32    // bool but 4-byte aligned\n\tReadOnly       int32    // bool but 4-byte aligned\n\tResiliencyGUID [16]byte // GUID\n}\n\ntype openVirtualDiskParameters struct {\n\tVersion  uint32 // Must always be set to 2\n\tVersion2 openVersion2\n}\n\nfunc attachVhd(path string) (syscall.Handle, error) {\n\tvar (\n\t\tdefaultType virtualStorageType\n\t\thandle      syscall.Handle\n\t)\n\tparameters := openVirtualDiskParameters{Version: 2}\n\terr := openVirtualDisk(\n\t\t&defaultType,\n\t\tpath,\n\t\t0,\n\t\t0,\n\t\t&parameters,\n\t\t&handle)\n\tif err != nil {\n\t\treturn 0, &os.PathError{Op: \"OpenVirtualDisk\", Path: path, Err: err}\n\t}\n\terr = attachVirtualDisk(handle, 0, 0, 0, 0, 0)\n\tif err != nil {\n\t\tsyscall.Close(handle)\n\t\treturn 0, &os.PathError{Op: \"AttachVirtualDisk\", Path: path, Err: err}\n\t}\n\treturn handle, nil\n}\n\nfunc expandSandboxVolume(ctx context.Context, path string) error {\n\t// Mount the sandbox VHD temporarily.\n\tvhdPath := filepath.Join(path, \"sandbox.vhdx\")\n\tvhd, err := attachVhd(vhdPath)\n\tif err != nil {\n\t\treturn &os.PathError{Op: \"OpenVirtualDisk\", Path: vhdPath, Err: err}\n\t}\n\tdefer syscall.Close(vhd)\n\n\t// Open the volume.\n\tvolumePath, err := GetLayerMountPath(ctx, path)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif volumePath[len(volumePath)-1] == '\\\\' {\n\t\tvolumePath = volumePath[:len(volumePath)-1]\n\t}\n\tvolume, err := os.OpenFile(volumePath, os.O_RDWR, 0)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer volume.Close()\n\n\t// Get the volume's underlying partition size in NTFS clusters.\n\tvar (\n\t\tpartitionSize int64\n\t\tbytes         uint32\n\t)\n\tconst _IOCTL_DISK_GET_LENGTH_INFO = 0x0007405C\n\terr = syscall.DeviceIoControl(syscall.Handle(volume.Fd()), _IOCTL_DISK_GET_LENGTH_INFO, nil, 0, (*byte)(unsafe.Pointer(&partitionSize)), 8, &bytes, nil)\n\tif err != nil {\n\t\treturn &os.PathError{Op: \"IOCTL_DISK_GET_LENGTH_INFO\", Path: volume.Name(), Err: err}\n\t}\n\tconst (\n\t\tclusterSize = 4096\n\t\tsectorSize  = 512\n\t)\n\ttargetClusters := partitionSize / clusterSize\n\n\t// Get the volume's current size in NTFS clusters.\n\tvar volumeSize int64\n\terr = getDiskFreeSpaceEx(volume.Name()+\"\\\\\", nil, &volumeSize, nil)\n\tif err != nil {\n\t\treturn &os.PathError{Op: \"GetDiskFreeSpaceEx\", Path: volume.Name(), Err: err}\n\t}\n\tvolumeClusters := volumeSize / clusterSize\n\n\t// Only resize the volume if there is space to grow, otherwise this will\n\t// fail with invalid parameter. NTFS reserves one cluster.\n\tif volumeClusters+1 < targetClusters {\n\t\ttargetSectors := targetClusters * (clusterSize / sectorSize)\n\t\tconst _FSCTL_EXTEND_VOLUME = 0x000900F0\n\t\terr = syscall.DeviceIoControl(syscall.Handle(volume.Fd()), _FSCTL_EXTEND_VOLUME, (*byte)(unsafe.Pointer(&targetSectors)), 8, nil, 0, &bytes, nil)\n\t\tif err != nil {\n\t\t\treturn &os.PathError{Op: \"FSCTL_EXTEND_VOLUME\", Path: volume.Name(), Err: err}\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/exportlayer.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/Microsoft/go-winio\"\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"go.opencensus.io/trace\"\n)\n\n// ExportLayer will create a folder at exportFolderPath and fill that folder with\n// the transport format version of the layer identified by layerId. This transport\n// format includes any metadata required for later importing the layer (using\n// ImportLayer), and requires the full list of parent layer paths in order to\n// perform the export.\nfunc ExportLayer(ctx context.Context, path string, exportFolderPath string, parentLayerPaths []string) (err error) {\n\ttitle := \"hcsshim::ExportLayer\"\n\tctx, span := oc.StartSpan(ctx, title)\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"path\", path),\n\t\ttrace.StringAttribute(\"exportFolderPath\", exportFolderPath),\n\t\ttrace.StringAttribute(\"parentLayerPaths\", strings.Join(parentLayerPaths, \", \")))\n\n\t// Generate layer descriptors\n\tlayers, err := layerPathsToDescriptors(ctx, parentLayerPaths)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = exportLayer(&stdDriverInfo, path, exportFolderPath, layers)\n\tif err != nil {\n\t\treturn hcserror.New(err, title, \"\")\n\t}\n\treturn nil\n}\n\n// LayerReader is an interface that supports reading an existing container image layer.\ntype LayerReader interface {\n\t// Next advances to the next file and returns the name, size, and file info\n\tNext() (string, int64, *winio.FileBasicInfo, error)\n\t// LinkInfo returns the number of links and the file identifier for the current file.\n\tLinkInfo() (uint32, *winio.FileIDInfo, error)\n\t// Read reads data from the current file, in the format of a Win32 backup stream, and\n\t// returns the number of bytes read.\n\tRead(b []byte) (int, error)\n\t// Close finishes the layer reading process and releases any resources.\n\tClose() error\n}\n\n// NewLayerReader returns a new layer reader for reading the contents of an on-disk layer.\n// The caller must have taken the SeBackupPrivilege privilege\n// to call this and any methods on the resulting LayerReader.\nfunc NewLayerReader(ctx context.Context, path string, parentLayerPaths []string) (_ LayerReader, err error) {\n\tctx, span := oc.StartSpan(ctx, \"hcsshim::NewLayerReader\")\n\tdefer func() {\n\t\tif err != nil {\n\t\t\toc.SetSpanStatus(span, err)\n\t\t\tspan.End()\n\t\t}\n\t}()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"path\", path),\n\t\ttrace.StringAttribute(\"parentLayerPaths\", strings.Join(parentLayerPaths, \", \")))\n\n\tif len(parentLayerPaths) == 0 {\n\t\t// This is a base layer. It gets exported differently.\n\t\treturn newBaseLayerReader(path, span), nil\n\t}\n\n\texportPath, err := os.MkdirTemp(\"\", \"hcs\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = ExportLayer(ctx, path, exportPath, parentLayerPaths)\n\tif err != nil {\n\t\tos.RemoveAll(exportPath)\n\t\treturn nil, err\n\t}\n\treturn &legacyLayerReaderWrapper{\n\t\tctx:               ctx,\n\t\ts:                 span,\n\t\tlegacyLayerReader: newLegacyLayerReader(exportPath),\n\t}, nil\n}\n\ntype legacyLayerReaderWrapper struct {\n\tctx context.Context\n\ts   *trace.Span\n\n\t*legacyLayerReader\n}\n\nfunc (r *legacyLayerReaderWrapper) Close() (err error) {\n\tdefer r.s.End()\n\tdefer func() { oc.SetSpanStatus(r.s, err) }()\n\n\terr = r.legacyLayerReader.Close()\n\tos.RemoveAll(r.root)\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/getlayermountpath.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\t\"syscall\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n\t\"github.com/Microsoft/hcsshim/internal/log\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"go.opencensus.io/trace\"\n)\n\n// GetLayerMountPath will look for a mounted layer with the given path and return\n// the path at which that layer can be accessed.  This path may be a volume path\n// if the layer is a mounted read-write layer, otherwise it is expected to be the\n// folder path at which the layer is stored.\nfunc GetLayerMountPath(ctx context.Context, path string) (_ string, err error) {\n\ttitle := \"hcsshim::GetLayerMountPath\"\n\tctx, span := oc.StartSpan(ctx, title)\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"path\", path))\n\n\tvar mountPathLength uintptr = 0\n\n\t// Call the procedure itself.\n\tlog.G(ctx).Debug(\"Calling proc (1)\")\n\terr = getLayerMountPath(&stdDriverInfo, path, &mountPathLength, nil)\n\tif err != nil {\n\t\treturn \"\", hcserror.New(err, title, \"(first call)\")\n\t}\n\n\t// Allocate a mount path of the returned length.\n\tif mountPathLength == 0 {\n\t\treturn \"\", nil\n\t}\n\tmountPathp := make([]uint16, mountPathLength)\n\tmountPathp[0] = 0\n\n\t// Call the procedure again\n\tlog.G(ctx).Debug(\"Calling proc (2)\")\n\terr = getLayerMountPath(&stdDriverInfo, path, &mountPathLength, &mountPathp[0])\n\tif err != nil {\n\t\treturn \"\", hcserror.New(err, title, \"(second call)\")\n\t}\n\n\tmountPath := syscall.UTF16ToString(mountPathp[0:])\n\tspan.AddAttributes(trace.StringAttribute(\"mountPath\", mountPath))\n\treturn mountPath, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/getsharedbaseimages.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n\t\"github.com/Microsoft/hcsshim/internal/interop\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"go.opencensus.io/trace\"\n)\n\n// GetSharedBaseImages will enumerate the images stored in the common central\n// image store and return descriptive info about those images for the purpose\n// of registering them with the graphdriver, graph, and tagstore.\nfunc GetSharedBaseImages(ctx context.Context) (_ string, err error) {\n\ttitle := \"hcsshim::GetSharedBaseImages\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\n\tvar buffer *uint16\n\terr = getBaseImages(&buffer)\n\tif err != nil {\n\t\treturn \"\", hcserror.New(err, title, \"\")\n\t}\n\timageData := interop.ConvertAndFreeCoTaskMemString(buffer)\n\tspan.AddAttributes(trace.StringAttribute(\"imageData\", imageData))\n\treturn imageData, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/grantvmaccess.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"go.opencensus.io/trace\"\n)\n\n// GrantVmAccess adds access to a file for a given VM\nfunc GrantVmAccess(ctx context.Context, vmid string, filepath string) (err error) {\n\ttitle := \"hcsshim::GrantVmAccess\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"vm-id\", vmid),\n\t\ttrace.StringAttribute(\"path\", filepath))\n\n\terr = grantVmAccess(vmid, filepath)\n\tif err != nil {\n\t\treturn hcserror.New(err, title, \"\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/importlayer.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/Microsoft/go-winio\"\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"github.com/Microsoft/hcsshim/internal/safefile\"\n\t\"go.opencensus.io/trace\"\n)\n\n// ImportLayer will take the contents of the folder at importFolderPath and import\n// that into a layer with the id layerId.  Note that in order to correctly populate\n// the layer and interperet the transport format, all parent layers must already\n// be present on the system at the paths provided in parentLayerPaths.\nfunc ImportLayer(ctx context.Context, path string, importFolderPath string, parentLayerPaths []string) (err error) {\n\ttitle := \"hcsshim::ImportLayer\"\n\tctx, span := oc.StartSpan(ctx, title)\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"path\", path),\n\t\ttrace.StringAttribute(\"importFolderPath\", importFolderPath),\n\t\ttrace.StringAttribute(\"parentLayerPaths\", strings.Join(parentLayerPaths, \", \")))\n\n\t// Generate layer descriptors\n\tlayers, err := layerPathsToDescriptors(ctx, parentLayerPaths)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = importLayer(&stdDriverInfo, path, importFolderPath, layers)\n\tif err != nil {\n\t\treturn hcserror.New(err, title, \"\")\n\t}\n\treturn nil\n}\n\n// LayerWriter is an interface that supports writing a new container image layer.\ntype LayerWriter interface {\n\t// Add adds a file to the layer with given metadata.\n\tAdd(name string, fileInfo *winio.FileBasicInfo) error\n\t// AddLink adds a hard link to the layer. The target must already have been added.\n\tAddLink(name string, target string) error\n\t// Remove removes a file that was present in a parent layer from the layer.\n\tRemove(name string) error\n\t// Write writes data to the current file. The data must be in the format of a Win32\n\t// backup stream.\n\tWrite(b []byte) (int, error)\n\t// Close finishes the layer writing process and releases any resources.\n\tClose() error\n}\n\ntype legacyLayerWriterWrapper struct {\n\tctx context.Context\n\ts   *trace.Span\n\n\t*legacyLayerWriter\n\tpath             string\n\tparentLayerPaths []string\n}\n\nfunc (r *legacyLayerWriterWrapper) Close() (err error) {\n\tdefer r.s.End()\n\tdefer func() { oc.SetSpanStatus(r.s, err) }()\n\tdefer os.RemoveAll(r.root.Name())\n\tdefer r.legacyLayerWriter.CloseRoots()\n\n\terr = r.legacyLayerWriter.Close()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err = ImportLayer(r.ctx, r.destRoot.Name(), r.path, r.parentLayerPaths); err != nil {\n\t\treturn err\n\t}\n\tfor _, name := range r.Tombstones {\n\t\tif err = safefile.RemoveRelative(name, r.destRoot); err != nil && !os.IsNotExist(err) {\n\t\t\treturn err\n\t\t}\n\t}\n\t// Add any hard links that were collected.\n\tfor _, lnk := range r.PendingLinks {\n\t\tif err = safefile.RemoveRelative(lnk.Path, r.destRoot); err != nil && !os.IsNotExist(err) {\n\t\t\treturn err\n\t\t}\n\t\tif err = safefile.LinkRelative(lnk.Target, lnk.TargetRoot, lnk.Path, r.destRoot); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// The reapplyDirectoryTimes must be called AFTER we are done with Tombstone\n\t// deletion and hard link creation. This is because Tombstone deletion and hard link\n\t// creation updates the directory last write timestamps so that will change the\n\t// timestamps added by the `Add` call. Some container applications depend on the\n\t// correctness of these timestamps and so we should change the timestamps back to\n\t// the original value (i.e the value provided in the Add call) after this\n\t// processing is done.\n\terr = reapplyDirectoryTimes(r.destRoot, r.changedDi)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Prepare the utility VM for use if one is present in the layer.\n\tif r.HasUtilityVM {\n\t\terr := safefile.EnsureNotReparsePointRelative(\"UtilityVM\", r.destRoot)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\terr = ProcessUtilityVMImage(r.ctx, filepath.Join(r.destRoot.Name(), \"UtilityVM\"))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// NewLayerWriter returns a new layer writer for creating a layer on disk.\n// The caller must have taken the SeBackupPrivilege and SeRestorePrivilege privileges\n// to call this and any methods on the resulting LayerWriter.\nfunc NewLayerWriter(ctx context.Context, path string, parentLayerPaths []string) (_ LayerWriter, err error) {\n\tctx, span := oc.StartSpan(ctx, \"hcsshim::NewLayerWriter\")\n\tdefer func() {\n\t\tif err != nil {\n\t\t\toc.SetSpanStatus(span, err)\n\t\t\tspan.End()\n\t\t}\n\t}()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"path\", path),\n\t\ttrace.StringAttribute(\"parentLayerPaths\", strings.Join(parentLayerPaths, \", \")))\n\n\tif len(parentLayerPaths) == 0 {\n\t\t// This is a base layer. It gets imported differently.\n\t\tf, err := safefile.OpenRoot(path)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn &baseLayerWriter{\n\t\t\tctx:  ctx,\n\t\t\ts:    span,\n\t\t\troot: f,\n\t\t}, nil\n\t}\n\n\timportPath, err := os.MkdirTemp(\"\", \"hcs\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tw, err := newLegacyLayerWriter(importPath, parentLayerPaths, path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &legacyLayerWriterWrapper{\n\t\tctx:               ctx,\n\t\ts:                 span,\n\t\tlegacyLayerWriter: w,\n\t\tpath:              importPath,\n\t\tparentLayerPaths:  parentLayerPaths,\n\t}, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerexists.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"go.opencensus.io/trace\"\n)\n\n// LayerExists will return true if a layer with the given id exists and is known\n// to the system.\nfunc LayerExists(ctx context.Context, path string) (_ bool, err error) {\n\ttitle := \"hcsshim::LayerExists\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"path\", path))\n\n\t// Call the procedure itself.\n\tvar exists uint32\n\terr = layerExists(&stdDriverInfo, path, &exists)\n\tif err != nil {\n\t\treturn false, hcserror.New(err, title, \"\")\n\t}\n\tspan.AddAttributes(trace.BoolAttribute(\"layer-exists\", exists != 0))\n\treturn exists != 0, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerid.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\t\"path/filepath\"\n\n\t\"github.com/Microsoft/go-winio/pkg/guid\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"go.opencensus.io/trace\"\n)\n\n// LayerID returns the layer ID of a layer on disk.\nfunc LayerID(ctx context.Context, path string) (_ guid.GUID, err error) {\n\ttitle := \"hcsshim::LayerID\"\n\tctx, span := oc.StartSpan(ctx, title)\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"path\", path))\n\n\t_, file := filepath.Split(path)\n\treturn NameToGuid(ctx, file)\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerutils.go",
    "content": "//go:build windows\n\npackage wclayer\n\n// This file contains utility functions to support storage (graph) related\n// functionality.\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"syscall\"\n\n\t\"github.com/Microsoft/go-winio/pkg/guid\"\n\t\"github.com/sirupsen/logrus\"\n)\n\n/*\nTo pass into syscall, we need a struct matching the following:\n\nenum GraphDriverType\n{\n    DiffDriver,\n    FilterDriver\n};\n\nstruct DriverInfo {\n    GraphDriverType Flavour;\n    LPCWSTR HomeDir;\n};\n*/\n\ntype driverInfo struct {\n\tFlavour  int\n\tHomeDirp *uint16\n}\n\nvar (\n\tutf16EmptyString uint16\n\tstdDriverInfo    = driverInfo{1, &utf16EmptyString}\n)\n\n/*\nTo pass into syscall, we need a struct matching the following:\n\ntypedef struct _WC_LAYER_DESCRIPTOR {\n\n\t//\n\t// The ID of the layer\n\t//\n\n\tGUID LayerId;\n\n\t//\n\t// Additional flags\n\t//\n\n\tunion {\n\t    struct {\n\t        ULONG Reserved : 31;\n\t        ULONG Dirty : 1;    // Created from sandbox as a result of snapshot\n\t    };\n\t    ULONG Value;\n\t} Flags;\n\n\t//\n\t// Path to the layer root directory, null-terminated\n\t//\n\n\tPCWSTR Path;\n\n} WC_LAYER_DESCRIPTOR, *PWC_LAYER_DESCRIPTOR;\n*/\ntype WC_LAYER_DESCRIPTOR struct {\n\tLayerId guid.GUID\n\tFlags   uint32\n\tPathp   *uint16\n}\n\nfunc layerPathsToDescriptors(ctx context.Context, parentLayerPaths []string) ([]WC_LAYER_DESCRIPTOR, error) {\n\t// Array of descriptors that gets constructed.\n\tvar layers []WC_LAYER_DESCRIPTOR\n\n\tfor i := 0; i < len(parentLayerPaths); i++ {\n\t\tg, err := LayerID(ctx, parentLayerPaths[i])\n\t\tif err != nil {\n\t\t\tlogrus.WithError(err).Debug(\"Failed to convert name to guid\")\n\t\t\treturn nil, err\n\t\t}\n\n\t\tp, err := syscall.UTF16PtrFromString(parentLayerPaths[i])\n\t\tif err != nil {\n\t\t\tlogrus.WithError(err).Debug(\"Failed conversion of parentLayerPath to pointer\")\n\t\t\treturn nil, err\n\t\t}\n\n\t\tlayers = append(layers, WC_LAYER_DESCRIPTOR{\n\t\t\tLayerId: g,\n\t\t\tFlags:   0,\n\t\t\tPathp:   p,\n\t\t})\n\t}\n\n\treturn layers, nil\n}\n\n// GetLayerUvmBuild looks for a file named `uvmbuildversion` at `layerPath\\uvmbuildversion` and returns the\n// build number of the UVM from that file.\nfunc GetLayerUvmBuild(layerPath string) (uint16, error) {\n\tdata, err := os.ReadFile(filepath.Join(layerPath, UvmBuildFileName))\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tver, err := strconv.ParseUint(string(data), 10, 16)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn uint16(ver), nil\n}\n\n// WriteLayerUvmBuildFile writes a file at path `layerPath\\uvmbuildversion` that contains the given `build`\n// version for future reference.\nfunc WriteLayerUvmBuildFile(layerPath string, build uint16) error {\n\treturn os.WriteFile(filepath.Join(layerPath, UvmBuildFileName), []byte(fmt.Sprintf(\"%d\", build)), 0777)\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"bufio\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"syscall\"\n\n\t\"github.com/Microsoft/go-winio\"\n\t\"github.com/Microsoft/hcsshim/internal/longpath\"\n\t\"github.com/Microsoft/hcsshim/internal/safefile\"\n\t\"github.com/Microsoft/hcsshim/internal/winapi\"\n)\n\nvar errorIterationCanceled = errors.New(\"\")\n\nvar mutatedUtilityVMFiles = map[string]bool{\n\t`EFI\\Microsoft\\Boot\\BCD`:      true,\n\t`EFI\\Microsoft\\Boot\\BCD.LOG`:  true,\n\t`EFI\\Microsoft\\Boot\\BCD.LOG1`: true,\n\t`EFI\\Microsoft\\Boot\\BCD.LOG2`: true,\n}\n\nconst (\n\tfilesPath           = `Files`\n\tHivesPath           = `Hives`\n\tUtilityVMPath       = `UtilityVM`\n\tUtilityVMFilesPath  = `UtilityVM\\Files`\n\tRegFilesPath        = `Files\\Windows\\System32\\config`\n\tBootDirRelativePath = `\\EFI\\Microsoft\\Boot`\n\tBcdFilePath         = `UtilityVM\\Files\\EFI\\Microsoft\\Boot\\BCD`\n\tBootMgrFilePath     = `UtilityVM\\Files\\EFI\\Microsoft\\Boot\\bootmgfw.efi`\n\tContainerBaseVhd    = `blank-base.vhdx`\n\tContainerScratchVhd = `blank.vhdx`\n\tUtilityVMBaseVhd    = `SystemTemplateBase.vhdx`\n\tUtilityVMScratchVhd = `SystemTemplate.vhdx`\n\tLayoutFileName      = `layout`\n\tUvmBuildFileName    = `uvmbuildversion`\n)\n\nfunc openFileOrDir(path string, mode uint32, createDisposition uint32) (file *os.File, err error) {\n\treturn winio.OpenForBackup(path, mode, syscall.FILE_SHARE_READ, createDisposition)\n}\n\nfunc hasPathPrefix(p, prefix string) bool {\n\treturn strings.HasPrefix(p, prefix) && len(p) > len(prefix) && p[len(prefix)] == '\\\\'\n}\n\ntype fileEntry struct {\n\tpath string\n\tfi   os.FileInfo\n\terr  error\n}\n\ntype legacyLayerReader struct {\n\troot         string\n\tresult       chan *fileEntry\n\tproceed      chan bool\n\tcurrentFile  *os.File\n\tbackupReader *winio.BackupFileReader\n}\n\n// newLegacyLayerReader returns a new LayerReader that can read the Windows\n// container layer transport format from disk.\nfunc newLegacyLayerReader(root string) *legacyLayerReader {\n\tr := &legacyLayerReader{\n\t\troot:    root,\n\t\tresult:  make(chan *fileEntry),\n\t\tproceed: make(chan bool),\n\t}\n\tgo r.walk()\n\treturn r\n}\n\nfunc readTombstones(path string) (map[string]([]string), error) {\n\ttf, err := os.Open(filepath.Join(path, \"tombstones.txt\"))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer tf.Close()\n\ts := bufio.NewScanner(tf)\n\tif !s.Scan() || s.Text() != \"\\xef\\xbb\\xbfVersion 1.0\" {\n\t\treturn nil, errors.New(\"invalid tombstones file\")\n\t}\n\n\tts := make(map[string]([]string))\n\tfor s.Scan() {\n\t\tt := filepath.Join(filesPath, s.Text()[1:]) // skip leading `\\`\n\t\tdir := filepath.Dir(t)\n\t\tts[dir] = append(ts[dir], t)\n\t}\n\tif err = s.Err(); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn ts, nil\n}\n\nfunc (r *legacyLayerReader) walkUntilCancelled() error {\n\troot, err := longpath.LongAbs(r.root)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tr.root = root\n\tts, err := readTombstones(r.root)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = filepath.Walk(r.root, func(path string, info os.FileInfo, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Indirect fix for https://github.com/moby/moby/issues/32838#issuecomment-343610048.\n\t\t// Handle failure from what may be a golang bug in the conversion of\n\t\t// UTF16 to UTF8 in files which are left in the recycle bin. Os.Lstat\n\t\t// which is called by filepath.Walk will fail when a filename contains\n\t\t// unicode characters. Skip the recycle bin regardless which is goodness.\n\t\tif strings.EqualFold(path, filepath.Join(r.root, `Files\\$Recycle.Bin`)) && info.IsDir() {\n\t\t\treturn filepath.SkipDir\n\t\t}\n\n\t\tif path == r.root || path == filepath.Join(r.root, \"tombstones.txt\") || strings.HasSuffix(path, \".$wcidirs$\") {\n\t\t\treturn nil\n\t\t}\n\n\t\tr.result <- &fileEntry{path, info, nil}\n\t\tif !<-r.proceed {\n\t\t\treturn errorIterationCanceled\n\t\t}\n\n\t\t// List all the tombstones.\n\t\tif info.IsDir() {\n\t\t\trelPath, err := filepath.Rel(r.root, path)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif dts, ok := ts[relPath]; ok {\n\t\t\t\tfor _, t := range dts {\n\t\t\t\t\tr.result <- &fileEntry{filepath.Join(r.root, t), nil, nil}\n\t\t\t\t\tif !<-r.proceed {\n\t\t\t\t\t\treturn errorIterationCanceled\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t})\n\tif err == errorIterationCanceled { //nolint:errorlint // explicitly returned\n\t\treturn nil\n\t}\n\tif err == nil {\n\t\treturn io.EOF\n\t}\n\treturn err\n}\n\nfunc (r *legacyLayerReader) walk() {\n\tdefer close(r.result)\n\tif !<-r.proceed {\n\t\treturn\n\t}\n\n\terr := r.walkUntilCancelled()\n\tif err != nil {\n\t\tfor {\n\t\t\tr.result <- &fileEntry{err: err}\n\t\t\tif !<-r.proceed {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (r *legacyLayerReader) reset() {\n\tif r.backupReader != nil {\n\t\tr.backupReader.Close()\n\t\tr.backupReader = nil\n\t}\n\tif r.currentFile != nil {\n\t\tr.currentFile.Close()\n\t\tr.currentFile = nil\n\t}\n}\n\nfunc findBackupStreamSize(r io.Reader) (int64, error) {\n\tbr := winio.NewBackupStreamReader(r)\n\tfor {\n\t\thdr, err := br.Next()\n\t\tif err != nil {\n\t\t\tif errors.Is(err, io.EOF) {\n\t\t\t\terr = nil\n\t\t\t}\n\t\t\treturn 0, err\n\t\t}\n\t\tif hdr.Id == winio.BackupData {\n\t\t\treturn hdr.Size, nil\n\t\t}\n\t}\n}\n\nfunc (r *legacyLayerReader) Next() (path string, size int64, fileInfo *winio.FileBasicInfo, err error) {\n\tr.reset()\n\tr.proceed <- true\n\tfe := <-r.result\n\tif fe == nil {\n\t\terr = errors.New(\"LegacyLayerReader closed\")\n\t\treturn\n\t}\n\tif fe.err != nil {\n\t\terr = fe.err\n\t\treturn\n\t}\n\n\tpath, err = filepath.Rel(r.root, fe.path)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif fe.fi == nil {\n\t\t// This is a tombstone. Return a nil fileInfo.\n\t\treturn\n\t}\n\n\tif fe.fi.IsDir() && hasPathPrefix(path, filesPath) {\n\t\tfe.path += \".$wcidirs$\"\n\t}\n\n\tf, err := openFileOrDir(fe.path, syscall.GENERIC_READ, syscall.OPEN_EXISTING)\n\tif err != nil {\n\t\treturn\n\t}\n\tdefer func() {\n\t\tif f != nil {\n\t\t\tf.Close()\n\t\t}\n\t}()\n\n\tfileInfo, err = winio.GetFileBasicInfo(f)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif !hasPathPrefix(path, filesPath) {\n\t\tsize = fe.fi.Size()\n\t\tr.backupReader = winio.NewBackupFileReader(f, false)\n\t\tif path == HivesPath || path == filesPath {\n\t\t\t// The Hives directory has a non-deterministic file time because of the\n\t\t\t// nature of the import process. Use the times from System_Delta.\n\t\t\tvar g *os.File\n\t\t\tg, err = os.Open(filepath.Join(r.root, HivesPath, `System_Delta`))\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tattr := fileInfo.FileAttributes\n\t\t\tfileInfo, err = winio.GetFileBasicInfo(g)\n\t\t\tg.Close()\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfileInfo.FileAttributes = attr\n\t\t}\n\n\t\t// The creation time and access time get reset for files outside of the Files path.\n\t\tfileInfo.CreationTime = fileInfo.LastWriteTime\n\t\tfileInfo.LastAccessTime = fileInfo.LastWriteTime\n\t} else {\n\t\t// The file attributes are written before the backup stream.\n\t\tvar attr uint32\n\t\terr = binary.Read(f, binary.LittleEndian, &attr)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tfileInfo.FileAttributes = attr\n\t\tbeginning := int64(4)\n\n\t\t// Find the accurate file size.\n\t\tif !fe.fi.IsDir() {\n\t\t\tsize, err = findBackupStreamSize(f)\n\t\t\tif err != nil {\n\t\t\t\terr = &os.PathError{Op: \"findBackupStreamSize\", Path: fe.path, Err: err}\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\t// Return back to the beginning of the backup stream.\n\t\t_, err = f.Seek(beginning, 0)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\tr.currentFile = f\n\tf = nil\n\treturn\n}\n\nfunc (r *legacyLayerReader) LinkInfo() (uint32, *winio.FileIDInfo, error) {\n\tfileStandardInfo, err := winio.GetFileStandardInfo(r.currentFile)\n\tif err != nil {\n\t\treturn 0, nil, err\n\t}\n\tfileIDInfo, err := winio.GetFileID(r.currentFile)\n\tif err != nil {\n\t\treturn 0, nil, err\n\t}\n\treturn fileStandardInfo.NumberOfLinks, fileIDInfo, nil\n}\n\nfunc (r *legacyLayerReader) Read(b []byte) (int, error) {\n\tif r.backupReader == nil {\n\t\tif r.currentFile == nil {\n\t\t\treturn 0, io.EOF\n\t\t}\n\t\treturn r.currentFile.Read(b)\n\t}\n\treturn r.backupReader.Read(b)\n}\n\nfunc (r *legacyLayerReader) Seek(offset int64, whence int) (int64, error) {\n\tif r.backupReader == nil {\n\t\tif r.currentFile == nil {\n\t\t\treturn 0, errors.New(\"no current file\")\n\t\t}\n\t\treturn r.currentFile.Seek(offset, whence)\n\t}\n\treturn 0, errors.New(\"seek not supported on this stream\")\n}\n\nfunc (r *legacyLayerReader) Close() error {\n\tr.proceed <- false\n\t<-r.result\n\tr.reset()\n\treturn nil\n}\n\ntype pendingLink struct {\n\tPath, Target string\n\tTargetRoot   *os.File\n}\n\ntype pendingDir struct {\n\tPath string\n\tRoot *os.File\n}\n\ntype legacyLayerWriter struct {\n\troot            *os.File\n\tdestRoot        *os.File\n\tparentRoots     []*os.File\n\tcurrentFile     *os.File\n\tbufWriter       *bufio.Writer\n\tcurrentFileName string\n\tcurrentFileRoot *os.File\n\tbackupWriter    *winio.BackupFileWriter\n\tTombstones      []string\n\tHasUtilityVM    bool\n\tchangedDi       []dirInfo\n\taddedFiles      map[string]bool\n\tPendingLinks    []pendingLink\n\tpendingDirs     []pendingDir\n\tcurrentIsDir    bool\n}\n\n// newLegacyLayerWriter returns a LayerWriter that can write the container layer\n// transport format to disk.\nfunc newLegacyLayerWriter(root string, parentRoots []string, destRoot string) (w *legacyLayerWriter, err error) {\n\tw = &legacyLayerWriter{\n\t\taddedFiles: make(map[string]bool),\n\t}\n\tdefer func() {\n\t\tif err != nil {\n\t\t\tw.CloseRoots()\n\t\t\tw = nil\n\t\t}\n\t}()\n\tw.root, err = safefile.OpenRoot(root)\n\tif err != nil {\n\t\treturn\n\t}\n\tw.destRoot, err = safefile.OpenRoot(destRoot)\n\tif err != nil {\n\t\treturn\n\t}\n\tfor _, r := range parentRoots {\n\t\tf, err := safefile.OpenRoot(r)\n\t\tif err != nil {\n\t\t\treturn w, err\n\t\t}\n\t\tw.parentRoots = append(w.parentRoots, f)\n\t}\n\tw.bufWriter = bufio.NewWriterSize(io.Discard, 65536)\n\treturn\n}\n\nfunc (w *legacyLayerWriter) CloseRoots() {\n\tif w.root != nil {\n\t\tw.root.Close()\n\t\tw.root = nil\n\t}\n\tif w.destRoot != nil {\n\t\tw.destRoot.Close()\n\t\tw.destRoot = nil\n\t}\n\tfor i := range w.parentRoots {\n\t\t_ = w.parentRoots[i].Close()\n\t}\n\tw.parentRoots = nil\n}\n\nfunc (w *legacyLayerWriter) initUtilityVM() error {\n\tif !w.HasUtilityVM {\n\t\terr := safefile.MkdirRelative(UtilityVMPath, w.destRoot)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Server 2016 does not support multiple layers for the utility VM, so\n\t\t// clone the utility VM from the parent layer into this layer. Use hard\n\t\t// links to avoid unnecessary copying, since most of the files are\n\t\t// immutable.\n\t\terr = cloneTree(w.parentRoots[0], w.destRoot, UtilityVMFilesPath, mutatedUtilityVMFiles)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"cloning the parent utility VM image failed: %w\", err)\n\t\t}\n\t\tw.HasUtilityVM = true\n\t}\n\treturn nil\n}\n\nfunc (w *legacyLayerWriter) reset() error {\n\terr := w.bufWriter.Flush()\n\tif err != nil {\n\t\treturn err\n\t}\n\tw.bufWriter.Reset(io.Discard)\n\tif w.currentIsDir {\n\t\tr := w.currentFile\n\t\tbr := winio.NewBackupStreamReader(r)\n\t\t// Seek to the beginning of the backup stream, skipping the fileattrs\n\t\tif _, err := r.Seek(4, io.SeekStart); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tfor {\n\t\t\tbhdr, err := br.Next()\n\t\t\tif errors.Is(err, io.EOF) {\n\t\t\t\t// end of backupstream data\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tswitch bhdr.Id {\n\t\t\tcase winio.BackupReparseData:\n\t\t\t\t// The current file is a `.$wcidirs$` metadata file that\n\t\t\t\t// describes a directory reparse point. Delete the placeholder\n\t\t\t\t// directory to prevent future files being added into the\n\t\t\t\t// destination of the reparse point during the ImportLayer call\n\t\t\t\tif err := safefile.RemoveRelative(w.currentFileName, w.currentFileRoot); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tw.pendingDirs = append(w.pendingDirs, pendingDir{Path: w.currentFileName, Root: w.currentFileRoot})\n\t\t\tdefault:\n\t\t\t\t// ignore all other stream types, as we only care about directory reparse points\n\t\t\t}\n\t\t}\n\t\tw.currentIsDir = false\n\t}\n\tif w.backupWriter != nil {\n\t\tw.backupWriter.Close()\n\t\tw.backupWriter = nil\n\t}\n\tif w.currentFile != nil {\n\t\tw.currentFile.Close()\n\t\tw.currentFile = nil\n\t\tw.currentFileName = \"\"\n\t\tw.currentFileRoot = nil\n\t}\n\treturn nil\n}\n\n// copyFileWithMetadata copies a file using the backup/restore APIs in order to preserve metadata\nfunc copyFileWithMetadata(srcRoot, destRoot *os.File, subPath string, isDir bool) (fileInfo *winio.FileBasicInfo, err error) {\n\tsrc, err := safefile.OpenRelative(\n\t\tsubPath,\n\t\tsrcRoot,\n\t\tsyscall.GENERIC_READ|winio.ACCESS_SYSTEM_SECURITY,\n\t\tsyscall.FILE_SHARE_READ,\n\t\twinapi.FILE_OPEN,\n\t\twinapi.FILE_OPEN_REPARSE_POINT)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer src.Close()\n\tsrcr := winio.NewBackupFileReader(src, true)\n\tdefer srcr.Close()\n\n\tfileInfo, err = winio.GetFileBasicInfo(src)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\textraFlags := uint32(0)\n\tif isDir {\n\t\textraFlags |= winapi.FILE_DIRECTORY_FILE\n\t}\n\tdest, err := safefile.OpenRelative(\n\t\tsubPath,\n\t\tdestRoot,\n\t\tsyscall.GENERIC_READ|syscall.GENERIC_WRITE|winio.WRITE_DAC|winio.WRITE_OWNER|winio.ACCESS_SYSTEM_SECURITY,\n\t\tsyscall.FILE_SHARE_READ,\n\t\twinapi.FILE_CREATE,\n\t\textraFlags)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer dest.Close()\n\n\terr = winio.SetFileBasicInfo(dest, fileInfo)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tdestw := winio.NewBackupFileWriter(dest, true)\n\tdefer func() {\n\t\tcerr := destw.Close()\n\t\tif err == nil {\n\t\t\terr = cerr\n\t\t}\n\t}()\n\n\t_, err = io.Copy(destw, srcr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn fileInfo, nil\n}\n\n// cloneTree clones a directory tree using hard links. It skips hard links for\n// the file names in the provided map and just copies those files.\nfunc cloneTree(srcRoot *os.File, destRoot *os.File, subPath string, mutatedFiles map[string]bool) error {\n\tvar di []dirInfo\n\terr := safefile.EnsureNotReparsePointRelative(subPath, srcRoot)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = filepath.Walk(filepath.Join(srcRoot.Name(), subPath), func(srcFilePath string, info os.FileInfo, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\trelPath, err := filepath.Rel(srcRoot.Name(), srcFilePath)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tfileAttributes := info.Sys().(*syscall.Win32FileAttributeData).FileAttributes\n\t\t// Directories, reparse points, and files that will be mutated during\n\t\t// utility VM import must be copied. All other files can be hard linked.\n\t\tisReparsePoint := fileAttributes&syscall.FILE_ATTRIBUTE_REPARSE_POINT != 0\n\t\t// In go1.9, FileInfo.IsDir() returns false if the directory is also a symlink.\n\t\t// See: https://github.com/golang/go/commit/1989921aef60c83e6f9127a8448fb5ede10e9acc\n\t\t// Fixes the problem by checking syscall.FILE_ATTRIBUTE_DIRECTORY directly\n\t\tisDir := fileAttributes&syscall.FILE_ATTRIBUTE_DIRECTORY != 0\n\n\t\tif isDir || isReparsePoint || mutatedFiles[relPath] {\n\t\t\tfi, err := copyFileWithMetadata(srcRoot, destRoot, relPath, isDir)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif isDir {\n\t\t\t\tdi = append(di, dirInfo{path: relPath, fileInfo: *fi})\n\t\t\t}\n\t\t} else {\n\t\t\terr = safefile.LinkRelative(relPath, srcRoot, relPath, destRoot)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn reapplyDirectoryTimes(destRoot, di)\n}\n\nfunc (w *legacyLayerWriter) Add(name string, fileInfo *winio.FileBasicInfo) error {\n\tif err := w.reset(); err != nil {\n\t\treturn err\n\t}\n\n\tif name == UtilityVMPath {\n\t\treturn w.initUtilityVM()\n\t}\n\n\tif (fileInfo.FileAttributes & syscall.FILE_ATTRIBUTE_DIRECTORY) != 0 {\n\t\tw.changedDi = append(w.changedDi, dirInfo{path: name, fileInfo: *fileInfo})\n\t}\n\n\tname = filepath.Clean(name)\n\tif hasPathPrefix(name, UtilityVMPath) {\n\t\tif !w.HasUtilityVM {\n\t\t\treturn errors.New(\"missing UtilityVM directory\")\n\t\t}\n\t\tif !hasPathPrefix(name, UtilityVMFilesPath) && name != UtilityVMFilesPath {\n\t\t\treturn errors.New(\"invalid UtilityVM layer\")\n\t\t}\n\t\tcreateDisposition := uint32(winapi.FILE_OPEN)\n\t\tif (fileInfo.FileAttributes & syscall.FILE_ATTRIBUTE_DIRECTORY) != 0 {\n\t\t\tst, err := safefile.LstatRelative(name, w.destRoot)\n\t\t\tif err != nil && !os.IsNotExist(err) {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif st != nil {\n\t\t\t\t// Delete the existing file/directory if it is not the same type as this directory.\n\t\t\t\texistingAttr := st.Sys().(*syscall.Win32FileAttributeData).FileAttributes\n\t\t\t\tif (uint32(fileInfo.FileAttributes)^existingAttr)&(syscall.FILE_ATTRIBUTE_DIRECTORY|syscall.FILE_ATTRIBUTE_REPARSE_POINT) != 0 {\n\t\t\t\t\tif err = safefile.RemoveAllRelative(name, w.destRoot); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tst = nil\n\t\t\t\t}\n\t\t\t}\n\t\t\tif st == nil {\n\t\t\t\tif err = safefile.MkdirRelative(name, w.destRoot); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Overwrite any existing hard link.\n\t\t\terr := safefile.RemoveRelative(name, w.destRoot)\n\t\t\tif err != nil && !os.IsNotExist(err) {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcreateDisposition = winapi.FILE_CREATE\n\t\t}\n\n\t\tf, err := safefile.OpenRelative(\n\t\t\tname,\n\t\t\tw.destRoot,\n\t\t\tsyscall.GENERIC_READ|syscall.GENERIC_WRITE|winio.WRITE_DAC|winio.WRITE_OWNER|winio.ACCESS_SYSTEM_SECURITY,\n\t\t\tsyscall.FILE_SHARE_READ,\n\t\t\tcreateDisposition,\n\t\t\twinapi.FILE_OPEN_REPARSE_POINT,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdefer func() {\n\t\t\tif f != nil {\n\t\t\t\tf.Close()\n\t\t\t\t_ = safefile.RemoveRelative(name, w.destRoot)\n\t\t\t}\n\t\t}()\n\n\t\terr = winio.SetFileBasicInfo(f, fileInfo)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tw.backupWriter = winio.NewBackupFileWriter(f, true)\n\t\tw.bufWriter.Reset(w.backupWriter)\n\t\tw.currentFile = f\n\t\tw.currentFileName = name\n\t\tw.currentFileRoot = w.destRoot\n\t\tw.addedFiles[name] = true\n\t\tf = nil\n\t\treturn nil\n\t}\n\n\tfname := name\n\tif (fileInfo.FileAttributes & syscall.FILE_ATTRIBUTE_DIRECTORY) != 0 {\n\t\terr := safefile.MkdirRelative(name, w.root)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfname += \".$wcidirs$\"\n\t\tw.currentIsDir = true\n\t}\n\n\tf, err := safefile.OpenRelative(fname, w.root, syscall.GENERIC_READ|syscall.GENERIC_WRITE, syscall.FILE_SHARE_READ, winapi.FILE_CREATE, 0)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer func() {\n\t\tif f != nil {\n\t\t\tf.Close()\n\t\t\t_ = safefile.RemoveRelative(fname, w.root)\n\t\t}\n\t}()\n\n\tstrippedFi := *fileInfo\n\tstrippedFi.FileAttributes = 0\n\terr = winio.SetFileBasicInfo(f, &strippedFi)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif hasPathPrefix(name, HivesPath) {\n\t\tw.backupWriter = winio.NewBackupFileWriter(f, false)\n\t\tw.bufWriter.Reset(w.backupWriter)\n\t} else {\n\t\tw.bufWriter.Reset(f)\n\t\t// The file attributes are written before the stream.\n\t\terr = binary.Write(w.bufWriter, binary.LittleEndian, uint32(fileInfo.FileAttributes))\n\t\tif err != nil {\n\t\t\tw.bufWriter.Reset(io.Discard)\n\t\t\treturn err\n\t\t}\n\t}\n\n\tw.currentFile = f\n\tw.currentFileName = name\n\tw.currentFileRoot = w.root\n\tw.addedFiles[name] = true\n\tf = nil\n\treturn nil\n}\n\nfunc (w *legacyLayerWriter) AddLink(name string, target string) error {\n\tif err := w.reset(); err != nil {\n\t\treturn err\n\t}\n\n\ttarget = filepath.Clean(target)\n\tvar roots []*os.File\n\tif hasPathPrefix(target, filesPath) {\n\t\t// Look for cross-layer hard link targets in the parent layers, since\n\t\t// nothing is in the destination path yet.\n\t\troots = w.parentRoots\n\t} else if hasPathPrefix(target, UtilityVMFilesPath) {\n\t\t// Since the utility VM is fully cloned into the destination path\n\t\t// already, look for cross-layer hard link targets directly in the\n\t\t// destination path.\n\t\troots = []*os.File{w.destRoot}\n\t}\n\n\tif roots == nil || (!hasPathPrefix(name, filesPath) && !hasPathPrefix(name, UtilityVMFilesPath)) {\n\t\treturn errors.New(\"invalid hard link in layer\")\n\t}\n\n\t// Try to find the target of the link in a previously added file. If that\n\t// fails, search in parent layers.\n\tvar selectedRoot *os.File\n\tif _, ok := w.addedFiles[target]; ok {\n\t\tselectedRoot = w.destRoot\n\t} else {\n\t\tfor _, r := range roots {\n\t\t\tif _, err := safefile.LstatRelative(target, r); err != nil {\n\t\t\t\tif !os.IsNotExist(err) {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tselectedRoot = r\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif selectedRoot == nil {\n\t\t\treturn fmt.Errorf(\"failed to find link target for '%s' -> '%s'\", name, target)\n\t\t}\n\t}\n\n\t// The link can't be written until after the ImportLayer call.\n\tw.PendingLinks = append(w.PendingLinks, pendingLink{\n\t\tPath:       name,\n\t\tTarget:     target,\n\t\tTargetRoot: selectedRoot,\n\t})\n\tw.addedFiles[name] = true\n\treturn nil\n}\n\nfunc (w *legacyLayerWriter) Remove(name string) error {\n\tname = filepath.Clean(name)\n\tif hasPathPrefix(name, filesPath) {\n\t\tw.Tombstones = append(w.Tombstones, name)\n\t} else if hasPathPrefix(name, UtilityVMFilesPath) {\n\t\terr := w.initUtilityVM()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Make sure the path exists; os.RemoveAll will not fail if the file is\n\t\t// already gone, and this needs to be a fatal error for diagnostics\n\t\t// purposes.\n\t\tif _, err := safefile.LstatRelative(name, w.destRoot); err != nil {\n\t\t\treturn err\n\t\t}\n\t\terr = safefile.RemoveAllRelative(name, w.destRoot)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\treturn fmt.Errorf(\"invalid tombstone %s\", name)\n\t}\n\n\treturn nil\n}\n\nfunc (w *legacyLayerWriter) Write(b []byte) (int, error) {\n\tif w.backupWriter == nil && w.currentFile == nil {\n\t\treturn 0, errors.New(\"closed\")\n\t}\n\treturn w.bufWriter.Write(b)\n}\n\nfunc (w *legacyLayerWriter) Close() error {\n\tif err := w.reset(); err != nil {\n\t\treturn err\n\t}\n\tif err := safefile.RemoveRelative(\"tombstones.txt\", w.root); err != nil && !os.IsNotExist(err) {\n\t\treturn err\n\t}\n\tfor _, pd := range w.pendingDirs {\n\t\terr := safefile.MkdirRelative(pd.Path, pd.Root)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/nametoguid.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\n\t\"github.com/Microsoft/go-winio/pkg/guid\"\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"go.opencensus.io/trace\"\n)\n\n// NameToGuid converts the given string into a GUID using the algorithm in the\n// Host Compute Service, ensuring GUIDs generated with the same string are common\n// across all clients.\nfunc NameToGuid(ctx context.Context, name string) (_ guid.GUID, err error) {\n\ttitle := \"hcsshim::NameToGuid\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"objectName\", name))\n\n\tvar id guid.GUID\n\terr = nameToGuid(name, &id)\n\tif err != nil {\n\t\treturn guid.GUID{}, hcserror.New(err, title, \"\")\n\t}\n\tspan.AddAttributes(trace.StringAttribute(\"guid\", id.String()))\n\treturn id, nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/preparelayer.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"go.opencensus.io/trace\"\n)\n\nvar prepareLayerLock sync.Mutex\n\n// PrepareLayer finds a mounted read-write layer matching path and enables the\n// the filesystem filter for use on that layer.  This requires the paths to all\n// parent layers, and is necessary in order to view or interact with the layer\n// as an actual filesystem (reading and writing files, creating directories, etc).\n// Disabling the filter must be done via UnprepareLayer.\nfunc PrepareLayer(ctx context.Context, path string, parentLayerPaths []string) (err error) {\n\ttitle := \"hcsshim::PrepareLayer\"\n\tctx, span := oc.StartSpan(ctx, title)\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(\n\t\ttrace.StringAttribute(\"path\", path),\n\t\ttrace.StringAttribute(\"parentLayerPaths\", strings.Join(parentLayerPaths, \", \")))\n\n\t// Generate layer descriptors\n\tlayers, err := layerPathsToDescriptors(ctx, parentLayerPaths)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// This lock is a temporary workaround for a Windows bug. Only allowing one\n\t// call to prepareLayer at a time vastly reduces the chance of a timeout.\n\tprepareLayerLock.Lock()\n\tdefer prepareLayerLock.Unlock()\n\terr = prepareLayer(&stdDriverInfo, path, layers)\n\tif err != nil {\n\t\treturn hcserror.New(err, title, \"\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/processimage.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\t\"os\"\n\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"go.opencensus.io/trace\"\n)\n\n// ProcessBaseLayer post-processes a base layer that has had its files extracted.\n// The files should have been extracted to <path>\\Files.\nfunc ProcessBaseLayer(ctx context.Context, path string) (err error) {\n\ttitle := \"hcsshim::ProcessBaseLayer\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"path\", path))\n\n\terr = processBaseImage(path)\n\tif err != nil {\n\t\treturn &os.PathError{Op: title, Path: path, Err: err}\n\t}\n\treturn nil\n}\n\n// ProcessUtilityVMImage post-processes a utility VM image that has had its files extracted.\n// The files should have been extracted to <path>\\Files.\nfunc ProcessUtilityVMImage(ctx context.Context, path string) (err error) {\n\ttitle := \"hcsshim::ProcessUtilityVMImage\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"path\", path))\n\n\terr = processUtilityImage(path)\n\tif err != nil {\n\t\treturn &os.PathError{Op: title, Path: path, Err: err}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/unpreparelayer.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport (\n\t\"context\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcserror\"\n\t\"github.com/Microsoft/hcsshim/internal/oc\"\n\t\"go.opencensus.io/trace\"\n)\n\n// UnprepareLayer disables the filesystem filter for the read-write layer with\n// the given id.\nfunc UnprepareLayer(ctx context.Context, path string) (err error) {\n\ttitle := \"hcsshim::UnprepareLayer\"\n\tctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck\n\tdefer span.End()\n\tdefer func() { oc.SetSpanStatus(span, err) }()\n\tspan.AddAttributes(trace.StringAttribute(\"path\", path))\n\n\terr = unprepareLayer(&stdDriverInfo, path)\n\tif err != nil {\n\t\treturn hcserror.New(err, title, \"\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/wclayer.go",
    "content": "//go:build windows\n\npackage wclayer\n\nimport \"github.com/Microsoft/go-winio/pkg/guid\"\n\n//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go wclayer.go\n\n//sys activateLayer(info *driverInfo, id string) (hr error) = vmcompute.ActivateLayer?\n//sys copyLayer(info *driverInfo, srcId string, dstId string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) = vmcompute.CopyLayer?\n//sys createLayer(info *driverInfo, id string, parent string) (hr error) = vmcompute.CreateLayer?\n//sys createSandboxLayer(info *driverInfo, id string, parent uintptr, descriptors []WC_LAYER_DESCRIPTOR) (hr error) = vmcompute.CreateSandboxLayer?\n//sys expandSandboxSize(info *driverInfo, id string, size uint64) (hr error) = vmcompute.ExpandSandboxSize?\n//sys deactivateLayer(info *driverInfo, id string) (hr error) = vmcompute.DeactivateLayer?\n//sys destroyLayer(info *driverInfo, id string) (hr error) = vmcompute.DestroyLayer?\n//sys exportLayer(info *driverInfo, id string, path string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) = vmcompute.ExportLayer?\n//sys getLayerMountPath(info *driverInfo, id string, length *uintptr, buffer *uint16) (hr error) = vmcompute.GetLayerMountPath?\n//sys getBaseImages(buffer **uint16) (hr error) = vmcompute.GetBaseImages?\n//sys importLayer(info *driverInfo, id string, path string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) = vmcompute.ImportLayer?\n//sys layerExists(info *driverInfo, id string, exists *uint32) (hr error) = vmcompute.LayerExists?\n//sys nameToGuid(name string, guid *_guid) (hr error) = vmcompute.NameToGuid?\n//sys prepareLayer(info *driverInfo, id string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) = vmcompute.PrepareLayer?\n//sys unprepareLayer(info *driverInfo, id string) (hr error) = vmcompute.UnprepareLayer?\n//sys processBaseImage(path string) (hr error) = vmcompute.ProcessBaseImage?\n//sys processUtilityImage(path string) (hr error) = vmcompute.ProcessUtilityImage?\n\n//sys grantVmAccess(vmid string, filepath string) (hr error) = vmcompute.GrantVmAccess?\n\n//sys openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) [failretval != 0] = virtdisk.OpenVirtualDisk\n//sys attachVirtualDisk(handle syscall.Handle, sd uintptr, flags uint32, providerFlags uint32, params uintptr, overlapped uintptr) (err error) [failretval != 0] = virtdisk.AttachVirtualDisk\n\n//sys getDiskFreeSpaceEx(directoryName string, freeBytesAvailableToCaller *int64, totalNumberOfBytes *int64, totalNumberOfFreeBytes *int64) (err error) = GetDiskFreeSpaceExW\n\ntype _guid = guid.GUID\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/wclayer/zsyscall_windows.go",
    "content": "//go:build windows\n\n// Code generated by 'go generate' using \"github.com/Microsoft/go-winio/tools/mkwinsyscall\"; DO NOT EDIT.\n\npackage wclayer\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\nvar _ unsafe.Pointer\n\n// Do the interface allocations only once for common\n// Errno values.\nconst (\n\terrnoERROR_IO_PENDING = 997\n)\n\nvar (\n\terrERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)\n\terrERROR_EINVAL     error = syscall.EINVAL\n)\n\n// errnoErr returns common boxed Errno values, to prevent\n// allocations at runtime.\nfunc errnoErr(e syscall.Errno) error {\n\tswitch e {\n\tcase 0:\n\t\treturn errERROR_EINVAL\n\tcase errnoERROR_IO_PENDING:\n\t\treturn errERROR_IO_PENDING\n\t}\n\treturn e\n}\n\nvar (\n\tmodkernel32  = windows.NewLazySystemDLL(\"kernel32.dll\")\n\tmodvirtdisk  = windows.NewLazySystemDLL(\"virtdisk.dll\")\n\tmodvmcompute = windows.NewLazySystemDLL(\"vmcompute.dll\")\n\n\tprocGetDiskFreeSpaceExW = modkernel32.NewProc(\"GetDiskFreeSpaceExW\")\n\tprocAttachVirtualDisk   = modvirtdisk.NewProc(\"AttachVirtualDisk\")\n\tprocOpenVirtualDisk     = modvirtdisk.NewProc(\"OpenVirtualDisk\")\n\tprocActivateLayer       = modvmcompute.NewProc(\"ActivateLayer\")\n\tprocCopyLayer           = modvmcompute.NewProc(\"CopyLayer\")\n\tprocCreateLayer         = modvmcompute.NewProc(\"CreateLayer\")\n\tprocCreateSandboxLayer  = modvmcompute.NewProc(\"CreateSandboxLayer\")\n\tprocDeactivateLayer     = modvmcompute.NewProc(\"DeactivateLayer\")\n\tprocDestroyLayer        = modvmcompute.NewProc(\"DestroyLayer\")\n\tprocExpandSandboxSize   = modvmcompute.NewProc(\"ExpandSandboxSize\")\n\tprocExportLayer         = modvmcompute.NewProc(\"ExportLayer\")\n\tprocGetBaseImages       = modvmcompute.NewProc(\"GetBaseImages\")\n\tprocGetLayerMountPath   = modvmcompute.NewProc(\"GetLayerMountPath\")\n\tprocGrantVmAccess       = modvmcompute.NewProc(\"GrantVmAccess\")\n\tprocImportLayer         = modvmcompute.NewProc(\"ImportLayer\")\n\tprocLayerExists         = modvmcompute.NewProc(\"LayerExists\")\n\tprocNameToGuid          = modvmcompute.NewProc(\"NameToGuid\")\n\tprocPrepareLayer        = modvmcompute.NewProc(\"PrepareLayer\")\n\tprocProcessBaseImage    = modvmcompute.NewProc(\"ProcessBaseImage\")\n\tprocProcessUtilityImage = modvmcompute.NewProc(\"ProcessUtilityImage\")\n\tprocUnprepareLayer      = modvmcompute.NewProc(\"UnprepareLayer\")\n)\n\nfunc getDiskFreeSpaceEx(directoryName string, freeBytesAvailableToCaller *int64, totalNumberOfBytes *int64, totalNumberOfFreeBytes *int64) (err error) {\n\tvar _p0 *uint16\n\t_p0, err = syscall.UTF16PtrFromString(directoryName)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn _getDiskFreeSpaceEx(_p0, freeBytesAvailableToCaller, totalNumberOfBytes, totalNumberOfFreeBytes)\n}\n\nfunc _getDiskFreeSpaceEx(directoryName *uint16, freeBytesAvailableToCaller *int64, totalNumberOfBytes *int64, totalNumberOfFreeBytes *int64) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procGetDiskFreeSpaceExW.Addr(), uintptr(unsafe.Pointer(directoryName)), uintptr(unsafe.Pointer(freeBytesAvailableToCaller)), uintptr(unsafe.Pointer(totalNumberOfBytes)), uintptr(unsafe.Pointer(totalNumberOfFreeBytes)))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc attachVirtualDisk(handle syscall.Handle, sd uintptr, flags uint32, providerFlags uint32, params uintptr, overlapped uintptr) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procAttachVirtualDisk.Addr(), uintptr(handle), uintptr(sd), uintptr(flags), uintptr(providerFlags), uintptr(params), uintptr(overlapped))\n\tif r1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) {\n\tvar _p0 *uint16\n\t_p0, err = syscall.UTF16PtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn _openVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, flags, parameters, handle)\n}\n\nfunc _openVirtualDisk(virtualStorageType *virtualStorageType, path *uint16, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procOpenVirtualDisk.Addr(), uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(flags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(handle)))\n\tif r1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc activateLayer(info *driverInfo, id string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(id)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _activateLayer(info, _p0)\n}\n\nfunc _activateLayer(info *driverInfo, id *uint16) (hr error) {\n\thr = procActivateLayer.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procActivateLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc copyLayer(info *driverInfo, srcId string, dstId string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(srcId)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(dstId)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _copyLayer(info, _p0, _p1, descriptors)\n}\n\nfunc _copyLayer(info *driverInfo, srcId *uint16, dstId *uint16, descriptors []WC_LAYER_DESCRIPTOR) (hr error) {\n\thr = procCopyLayer.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p2 *WC_LAYER_DESCRIPTOR\n\tif len(descriptors) > 0 {\n\t\t_p2 = &descriptors[0]\n\t}\n\tr0, _, _ := syscall.SyscallN(procCopyLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(srcId)), uintptr(unsafe.Pointer(dstId)), uintptr(unsafe.Pointer(_p2)), uintptr(len(descriptors)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc createLayer(info *driverInfo, id string, parent string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(id)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(parent)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _createLayer(info, _p0, _p1)\n}\n\nfunc _createLayer(info *driverInfo, id *uint16, parent *uint16) (hr error) {\n\thr = procCreateLayer.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procCreateLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(parent)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc createSandboxLayer(info *driverInfo, id string, parent uintptr, descriptors []WC_LAYER_DESCRIPTOR) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(id)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _createSandboxLayer(info, _p0, parent, descriptors)\n}\n\nfunc _createSandboxLayer(info *driverInfo, id *uint16, parent uintptr, descriptors []WC_LAYER_DESCRIPTOR) (hr error) {\n\thr = procCreateSandboxLayer.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *WC_LAYER_DESCRIPTOR\n\tif len(descriptors) > 0 {\n\t\t_p1 = &descriptors[0]\n\t}\n\tr0, _, _ := syscall.SyscallN(procCreateSandboxLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(parent), uintptr(unsafe.Pointer(_p1)), uintptr(len(descriptors)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc deactivateLayer(info *driverInfo, id string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(id)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _deactivateLayer(info, _p0)\n}\n\nfunc _deactivateLayer(info *driverInfo, id *uint16) (hr error) {\n\thr = procDeactivateLayer.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procDeactivateLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc destroyLayer(info *driverInfo, id string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(id)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _destroyLayer(info, _p0)\n}\n\nfunc _destroyLayer(info *driverInfo, id *uint16) (hr error) {\n\thr = procDestroyLayer.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procDestroyLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc expandSandboxSize(info *driverInfo, id string, size uint64) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(id)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _expandSandboxSize(info, _p0, size)\n}\n\nfunc _expandSandboxSize(info *driverInfo, id *uint16, size uint64) (hr error) {\n\thr = procExpandSandboxSize.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procExpandSandboxSize.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(size))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc exportLayer(info *driverInfo, id string, path string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(id)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(path)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _exportLayer(info, _p0, _p1, descriptors)\n}\n\nfunc _exportLayer(info *driverInfo, id *uint16, path *uint16, descriptors []WC_LAYER_DESCRIPTOR) (hr error) {\n\thr = procExportLayer.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p2 *WC_LAYER_DESCRIPTOR\n\tif len(descriptors) > 0 {\n\t\t_p2 = &descriptors[0]\n\t}\n\tr0, _, _ := syscall.SyscallN(procExportLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(_p2)), uintptr(len(descriptors)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc getBaseImages(buffer **uint16) (hr error) {\n\thr = procGetBaseImages.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procGetBaseImages.Addr(), uintptr(unsafe.Pointer(buffer)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc getLayerMountPath(info *driverInfo, id string, length *uintptr, buffer *uint16) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(id)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _getLayerMountPath(info, _p0, length, buffer)\n}\n\nfunc _getLayerMountPath(info *driverInfo, id *uint16, length *uintptr, buffer *uint16) (hr error) {\n\thr = procGetLayerMountPath.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procGetLayerMountPath.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(length)), uintptr(unsafe.Pointer(buffer)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc grantVmAccess(vmid string, filepath string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(vmid)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(filepath)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _grantVmAccess(_p0, _p1)\n}\n\nfunc _grantVmAccess(vmid *uint16, filepath *uint16) (hr error) {\n\thr = procGrantVmAccess.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procGrantVmAccess.Addr(), uintptr(unsafe.Pointer(vmid)), uintptr(unsafe.Pointer(filepath)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc importLayer(info *driverInfo, id string, path string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(id)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(path)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _importLayer(info, _p0, _p1, descriptors)\n}\n\nfunc _importLayer(info *driverInfo, id *uint16, path *uint16, descriptors []WC_LAYER_DESCRIPTOR) (hr error) {\n\thr = procImportLayer.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p2 *WC_LAYER_DESCRIPTOR\n\tif len(descriptors) > 0 {\n\t\t_p2 = &descriptors[0]\n\t}\n\tr0, _, _ := syscall.SyscallN(procImportLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(_p2)), uintptr(len(descriptors)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc layerExists(info *driverInfo, id string, exists *uint32) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(id)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _layerExists(info, _p0, exists)\n}\n\nfunc _layerExists(info *driverInfo, id *uint16, exists *uint32) (hr error) {\n\thr = procLayerExists.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procLayerExists.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(exists)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc nameToGuid(name string, guid *_guid) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(name)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _nameToGuid(_p0, guid)\n}\n\nfunc _nameToGuid(name *uint16, guid *_guid) (hr error) {\n\thr = procNameToGuid.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procNameToGuid.Addr(), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(guid)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc prepareLayer(info *driverInfo, id string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(id)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _prepareLayer(info, _p0, descriptors)\n}\n\nfunc _prepareLayer(info *driverInfo, id *uint16, descriptors []WC_LAYER_DESCRIPTOR) (hr error) {\n\thr = procPrepareLayer.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *WC_LAYER_DESCRIPTOR\n\tif len(descriptors) > 0 {\n\t\t_p1 = &descriptors[0]\n\t}\n\tr0, _, _ := syscall.SyscallN(procPrepareLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(_p1)), uintptr(len(descriptors)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc processBaseImage(path string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(path)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _processBaseImage(_p0)\n}\n\nfunc _processBaseImage(path *uint16) (hr error) {\n\thr = procProcessBaseImage.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procProcessBaseImage.Addr(), uintptr(unsafe.Pointer(path)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc processUtilityImage(path string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(path)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _processUtilityImage(_p0)\n}\n\nfunc _processUtilityImage(path *uint16) (hr error) {\n\thr = procProcessUtilityImage.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procProcessUtilityImage.Addr(), uintptr(unsafe.Pointer(path)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc unprepareLayer(info *driverInfo, id string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(id)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _unprepareLayer(info, _p0)\n}\n\nfunc _unprepareLayer(info *driverInfo, id *uint16) (hr error) {\n\thr = procUnprepareLayer.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procUnprepareLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/bindflt.go",
    "content": "package winapi\n\nconst (\n\tBINDFLT_FLAG_READ_ONLY_MAPPING        uint32 = 0x00000001\n\tBINDFLT_FLAG_MERGED_BIND_MAPPING      uint32 = 0x00000002\n\tBINDFLT_FLAG_USE_CURRENT_SILO_MAPPING uint32 = 0x00000004\n)\n\n// HRESULT\n// BfSetupFilter(\n//     _In_opt_ HANDLE JobHandle,\n//     _In_ ULONG Flags,\n//     _In_ LPCWSTR VirtualizationRootPath,\n//     _In_ LPCWSTR VirtualizationTargetPath,\n//     _In_reads_opt_( VirtualizationExceptionPathCount ) LPCWSTR* VirtualizationExceptionPaths,\n//     _In_opt_ ULONG VirtualizationExceptionPathCount\n// );\n//\n//sys BfSetupFilter(jobHandle windows.Handle, flags uint32, virtRootPath *uint16, virtTargetPath *uint16, virtExceptions **uint16, virtExceptionPathCount uint32) (hr error) = bindfltapi.BfSetupFilter?\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/cimfs.go",
    "content": "//go:build windows\n\npackage winapi\n\nimport (\n\t\"unsafe\"\n\n\t\"github.com/Microsoft/go-winio/pkg/guid\"\n\t\"golang.org/x/sys/windows\"\n)\n\ntype g = guid.GUID\ntype FsHandle uintptr\ntype StreamHandle uintptr\n\ntype CimFsFileMetadata struct {\n\tAttributes uint32\n\tFileSize   int64\n\n\tCreationTime   windows.Filetime\n\tLastWriteTime  windows.Filetime\n\tChangeTime     windows.Filetime\n\tLastAccessTime windows.Filetime\n\n\tSecurityDescriptorBuffer unsafe.Pointer\n\tSecurityDescriptorSize   uint32\n\n\tReparseDataBuffer unsafe.Pointer\n\tReparseDataSize   uint32\n\n\tExtendedAttributes unsafe.Pointer\n\tEACount            uint32\n}\n\ntype CimFsImagePath struct {\n\tImageDir  *uint16\n\tImageName *uint16\n}\n\n//sys CimMountImage(imagePath string, fsName string, flags uint32, volumeID *g) (hr error) = cimfs.CimMountImage?\n//sys CimDismountImage(volumeID *g) (hr error) = cimfs.CimDismountImage?\n\n//sys CimCreateImage(imagePath string, oldFSName *uint16, newFSName *uint16, cimFSHandle *FsHandle) (hr error) = cimfs.CimCreateImage?\n//sys CimCreateImage2(imagePath string, flags uint32, oldFSName *uint16, newFSName *uint16, cimFSHandle *FsHandle) (hr error) = cimfs.CimCreateImage2?\n//sys CimCloseImage(cimFSHandle FsHandle) = cimfs.CimCloseImage?\n//sys CimCommitImage(cimFSHandle FsHandle) (hr error) = cimfs.CimCommitImage?\n\n//sys CimCreateFile(cimFSHandle FsHandle, path string, file *CimFsFileMetadata, cimStreamHandle *StreamHandle) (hr error) = cimfs.CimCreateFile?\n//sys CimCloseStream(cimStreamHandle StreamHandle) (hr error) = cimfs.CimCloseStream?\n//sys CimWriteStream(cimStreamHandle StreamHandle, buffer uintptr, bufferSize uint32) (hr error) = cimfs.CimWriteStream?\n//sys CimDeletePath(cimFSHandle FsHandle, path string) (hr error) = cimfs.CimDeletePath?\n//sys CimCreateHardLink(cimFSHandle FsHandle, newPath string, oldPath string) (hr error) = cimfs.CimCreateHardLink?\n//sys CimCreateAlternateStream(cimFSHandle FsHandle, path string, size uint64, cimStreamHandle *StreamHandle) (hr error) = cimfs.CimCreateAlternateStream?\n//sys CimAddFsToMergedImage(cimFSHandle FsHandle, path string) (hr error) = cimfs.CimAddFsToMergedImage?\n//sys CimAddFsToMergedImage2(cimFSHandle FsHandle, path string, flags uint32) (hr error) = cimfs.CimAddFsToMergedImage2?\n//sys CimMergeMountImage(numCimPaths uint32, backingImagePaths *CimFsImagePath, flags uint32, volumeID *g) (hr error) = cimfs.CimMergeMountImage?\n//sys CimTombstoneFile(cimFSHandle FsHandle, path string) (hr error) = cimfs.CimTombstoneFile?\n//sys CimCreateMergeLink(cimFSHandle FsHandle, newPath string, oldPath string) (hr error) = cimfs.CimCreateMergeLink?\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/console.go",
    "content": "//go:build windows\n\npackage winapi\n\nimport (\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\nconst PSEUDOCONSOLE_INHERIT_CURSOR = 0x1\n\n// CreatePseudoConsole creates a windows pseudo console.\nfunc CreatePseudoConsole(size windows.Coord, hInput windows.Handle, hOutput windows.Handle, dwFlags uint32, hpcon *windows.Handle) error {\n\t// We need this wrapper as the function takes a COORD struct and not a pointer to one, so we need to cast to something beforehand.\n\treturn createPseudoConsole(*((*uint32)(unsafe.Pointer(&size))), hInput, hOutput, 0, hpcon)\n}\n\n// ResizePseudoConsole resizes the internal buffers of the pseudo console to the width and height specified in `size`.\nfunc ResizePseudoConsole(hpcon windows.Handle, size windows.Coord) error {\n\t// We need this wrapper as the function takes a COORD struct and not a pointer to one, so we need to cast to something beforehand.\n\treturn resizePseudoConsole(hpcon, *((*uint32)(unsafe.Pointer(&size))))\n}\n\n// HRESULT WINAPI CreatePseudoConsole(\n//     _In_ COORD size,\n//     _In_ HANDLE hInput,\n//     _In_ HANDLE hOutput,\n//     _In_ DWORD dwFlags,\n//     _Out_ HPCON* phPC\n// );\n//\n//sys createPseudoConsole(size uint32, hInput windows.Handle, hOutput windows.Handle, dwFlags uint32, hpcon *windows.Handle) (hr error) = kernel32.CreatePseudoConsole\n\n// void WINAPI ClosePseudoConsole(\n//     _In_ HPCON hPC\n// );\n//\n//sys ClosePseudoConsole(hpc windows.Handle) = kernel32.ClosePseudoConsole\n\n// HRESULT WINAPI ResizePseudoConsole(\n//     _In_ HPCON hPC ,\n//     _In_ COORD size\n// );\n//\n//sys resizePseudoConsole(hPc windows.Handle, size uint32) (hr error) = kernel32.ResizePseudoConsole\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/devices.go",
    "content": "//go:build windows\n\npackage winapi\n\nimport \"github.com/Microsoft/go-winio/pkg/guid\"\n\n//sys CMGetDeviceIDListSize(pulLen *uint32, pszFilter *byte, uFlags uint32) (hr error) = cfgmgr32.CM_Get_Device_ID_List_SizeA\n//sys CMGetDeviceIDList(pszFilter *byte, buffer *byte, bufferLen uint32, uFlags uint32) (hr error)= cfgmgr32.CM_Get_Device_ID_ListA\n//sys CMLocateDevNode(pdnDevInst *uint32, pDeviceID string, uFlags uint32) (hr error) = cfgmgr32.CM_Locate_DevNodeW\n//sys CMGetDevNodeProperty(dnDevInst uint32, propertyKey *DevPropKey, propertyType *uint32, propertyBuffer *uint16, propertyBufferSize *uint32, uFlags uint32) (hr error) = cfgmgr32.CM_Get_DevNode_PropertyW\n\ntype DevPropKey struct {\n\tFmtid guid.GUID\n\tPid   uint32\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/doc.go",
    "content": "// Package winapi contains various low-level bindings to Windows APIs. It can\n// be thought of as an extension to golang.org/x/sys/windows.\npackage winapi\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/elevation.go",
    "content": "//go:build windows\n\npackage winapi\n\nimport (\n\t\"golang.org/x/sys/windows\"\n)\n\nfunc IsElevated() bool {\n\treturn windows.GetCurrentProcessToken().IsElevated()\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/errors.go",
    "content": "//go:build windows\n\npackage winapi\n\nimport \"syscall\"\n\n//sys RtlNtStatusToDosError(status uint32) (winerr error) = ntdll.RtlNtStatusToDosError\n\nconst (\n\tSTATUS_REPARSE_POINT_ENCOUNTERED               = 0xC000050B\n\tERROR_NO_MORE_ITEMS                            = 0x103\n\tERROR_MORE_DATA                  syscall.Errno = 234\n)\n\nfunc NTSuccess(status uint32) bool {\n\treturn status == 0\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/filesystem.go",
    "content": "//go:build windows\n\npackage winapi\n\n//sys CopyFileW(existingFileName *uint16, newFileName *uint16, failIfExists int32) (err error) = kernel32.CopyFileW\n//sys NtCreateFile(handle *uintptr, accessMask uint32, oa *ObjectAttributes, iosb *IOStatusBlock, allocationSize *uint64, fileAttributes uint32, shareAccess uint32, createDisposition uint32, createOptions uint32, eaBuffer *byte, eaLength uint32) (status uint32) = ntdll.NtCreateFile\n//sys NtSetInformationFile(handle uintptr, iosb *IOStatusBlock, information uintptr, length uint32, class uint32) (status uint32) = ntdll.NtSetInformationFile\n\n//sys NtOpenDirectoryObject(handle *uintptr, accessMask uint32, oa *ObjectAttributes) (status uint32) = ntdll.NtOpenDirectoryObject\n//sys NtQueryDirectoryObject(handle uintptr, buffer *byte, length uint32, singleEntry bool, restartScan bool, context *uint32, returnLength *uint32)(status uint32) = ntdll.NtQueryDirectoryObject\n\nconst (\n\tFileLinkInformationClass          = 11\n\tFileDispositionInformationExClass = 64\n\n\tFILE_READ_ATTRIBUTES  = 0x0080\n\tFILE_WRITE_ATTRIBUTES = 0x0100\n\tDELETE                = 0x10000\n\n\tFILE_OPEN   = 1\n\tFILE_CREATE = 2\n\n\tFILE_LIST_DIRECTORY          = 0x00000001\n\tFILE_DIRECTORY_FILE          = 0x00000001\n\tFILE_SYNCHRONOUS_IO_NONALERT = 0x00000020\n\tFILE_OPEN_FOR_BACKUP_INTENT  = 0x00004000\n\tFILE_OPEN_REPARSE_POINT      = 0x00200000\n\n\tFILE_DISPOSITION_DELETE = 0x00000001\n\n\tOBJ_DONT_REPARSE = 0x1000\n\n\tSTATUS_MORE_ENTRIES    = 0x105\n\tSTATUS_NO_MORE_ENTRIES = 0x8000001a\n)\n\n// Select entries from FILE_INFO_BY_HANDLE_CLASS.\n//\n// C declaration:\n//\n//\ttypedef enum _FILE_INFO_BY_HANDLE_CLASS {\n//\t    FileBasicInfo,\n//\t    FileStandardInfo,\n//\t    FileNameInfo,\n//\t    FileRenameInfo,\n//\t    FileDispositionInfo,\n//\t    FileAllocationInfo,\n//\t    FileEndOfFileInfo,\n//\t    FileStreamInfo,\n//\t    FileCompressionInfo,\n//\t    FileAttributeTagInfo,\n//\t    FileIdBothDirectoryInfo,\n//\t    FileIdBothDirectoryRestartInfo,\n//\t    FileIoPriorityHintInfo,\n//\t    FileRemoteProtocolInfo,\n//\t    FileFullDirectoryInfo,\n//\t    FileFullDirectoryRestartInfo,\n//\t    FileStorageInfo,\n//\t    FileAlignmentInfo,\n//\t    FileIdInfo,\n//\t    FileIdExtdDirectoryInfo,\n//\t    FileIdExtdDirectoryRestartInfo,\n//\t    FileDispositionInfoEx,\n//\t    FileRenameInfoEx,\n//\t    FileCaseSensitiveInfo,\n//\t    FileNormalizedNameInfo,\n//\t    MaximumFileInfoByHandleClass\n//\t} FILE_INFO_BY_HANDLE_CLASS, *PFILE_INFO_BY_HANDLE_CLASS;\n//\n// Documentation: https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ne-minwinbase-file_info_by_handle_class\nconst (\n\tFileIdInfo = 18\n)\n\ntype FileDispositionInformationEx struct {\n\tFlags uintptr\n}\n\ntype IOStatusBlock struct {\n\tStatus, Information uintptr\n}\n\ntype ObjectAttributes struct {\n\tLength             uintptr\n\tRootDirectory      uintptr\n\tObjectName         *UnicodeString\n\tAttributes         uintptr\n\tSecurityDescriptor uintptr\n\tSecurityQoS        uintptr\n}\n\ntype ObjectDirectoryInformation struct {\n\tName     UnicodeString\n\tTypeName UnicodeString\n}\n\ntype FileLinkInformation struct {\n\tReplaceIfExists bool\n\tRootDirectory   uintptr\n\tFileNameLength  uint32\n\tFileName        [1]uint16\n}\n\n// C declaration:\n//\n//\ttypedef struct _FILE_ID_INFO {\n//\t\tULONGLONG   VolumeSerialNumber;\n//\t\tFILE_ID_128 FileId;\n//\t} FILE_ID_INFO, *PFILE_ID_INFO;\n//\n// Documentation: https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-file_id_info\ntype FILE_ID_INFO struct {\n\tVolumeSerialNumber uint64\n\tFileID             [16]byte\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go",
    "content": "//go:build windows\n\npackage winapi\n\nimport (\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\n// Messages that can be received from an assigned io completion port.\n// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_associate_completion_port\nconst (\n\tJOB_OBJECT_MSG_END_OF_JOB_TIME       uint32 = 1\n\tJOB_OBJECT_MSG_END_OF_PROCESS_TIME   uint32 = 2\n\tJOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT  uint32 = 3\n\tJOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO   uint32 = 4\n\tJOB_OBJECT_MSG_NEW_PROCESS           uint32 = 6\n\tJOB_OBJECT_MSG_EXIT_PROCESS          uint32 = 7\n\tJOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS uint32 = 8\n\tJOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT  uint32 = 9\n\tJOB_OBJECT_MSG_JOB_MEMORY_LIMIT      uint32 = 10\n\tJOB_OBJECT_MSG_NOTIFICATION_LIMIT    uint32 = 11\n)\n\n// Access rights for creating or opening job objects.\n//\n// https://docs.microsoft.com/en-us/windows/win32/procthread/job-object-security-and-access-rights\nconst (\n\tJOB_OBJECT_QUERY      = 0x0004\n\tJOB_OBJECT_ALL_ACCESS = 0x1F003F\n)\n\n// IO limit flags\n//\n// https://docs.microsoft.com/en-us/windows/win32/api/jobapi2/ns-jobapi2-jobobject_io_rate_control_information\nconst JOB_OBJECT_IO_RATE_CONTROL_ENABLE = 0x1\n\nconst JOBOBJECT_IO_ATTRIBUTION_CONTROL_ENABLE uint32 = 0x1\n\n// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_cpu_rate_control_information\nconst (\n\tJOB_OBJECT_CPU_RATE_CONTROL_ENABLE uint32 = 1 << iota\n\tJOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED\n\tJOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP\n\tJOB_OBJECT_CPU_RATE_CONTROL_NOTIFY\n\tJOB_OBJECT_CPU_RATE_CONTROL_MIN_MAX_RATE\n)\n\n// JobObjectInformationClass values. Used for a call to QueryInformationJobObject\n//\n// https://docs.microsoft.com/en-us/windows/win32/api/jobapi2/nf-jobapi2-queryinformationjobobject\nconst (\n\tJobObjectBasicAccountingInformation      uint32 = 1\n\tJobObjectBasicProcessIdList              uint32 = 3\n\tJobObjectBasicAndIoAccountingInformation uint32 = 8\n\tJobObjectLimitViolationInformation       uint32 = 13\n\tJobObjectMemoryUsageInformation          uint32 = 28\n\tJobObjectNotificationLimitInformation2   uint32 = 33\n\tJobObjectCreateSilo                      uint32 = 35\n\tJobObjectSiloBasicInformation            uint32 = 36\n\tJobObjectIoAttribution                   uint32 = 42\n)\n\n// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_limit_information\ntype JOBOBJECT_BASIC_LIMIT_INFORMATION struct {\n\tPerProcessUserTimeLimit int64\n\tPerJobUserTimeLimit     int64\n\tLimitFlags              uint32\n\tMinimumWorkingSetSize   uintptr\n\tMaximumWorkingSetSize   uintptr\n\tActiveProcessLimit      uint32\n\tAffinity                uintptr\n\tPriorityClass           uint32\n\tSchedulingClass         uint32\n}\n\n// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_cpu_rate_control_information\ntype JOBOBJECT_CPU_RATE_CONTROL_INFORMATION struct {\n\tControlFlags uint32\n\tValue        uint32\n}\n\n// https://docs.microsoft.com/en-us/windows/win32/api/jobapi2/ns-jobapi2-jobobject_io_rate_control_information\ntype JOBOBJECT_IO_RATE_CONTROL_INFORMATION struct {\n\tMaxIops         int64\n\tMaxBandwidth    int64\n\tReservationIops int64\n\tBaseIOSize      uint32\n\tVolumeName      string\n\tControlFlags    uint32\n}\n\n// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_process_id_list\ntype JOBOBJECT_BASIC_PROCESS_ID_LIST struct {\n\tNumberOfAssignedProcesses uint32\n\tNumberOfProcessIdsInList  uint32\n\tProcessIdList             [1]uintptr\n}\n\n// AllPids returns all the process Ids in the job object.\nfunc (p *JOBOBJECT_BASIC_PROCESS_ID_LIST) AllPids() []uintptr {\n\treturn (*[(1 << 27) - 1]uintptr)(unsafe.Pointer(&p.ProcessIdList[0]))[:p.NumberOfProcessIdsInList:p.NumberOfProcessIdsInList]\n}\n\n// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_accounting_information\ntype JOBOBJECT_BASIC_ACCOUNTING_INFORMATION struct {\n\tTotalUserTime             int64\n\tTotalKernelTime           int64\n\tThisPeriodTotalUserTime   int64\n\tThisPeriodTotalKernelTime int64\n\tTotalPageFaultCount       uint32\n\tTotalProcesses            uint32\n\tActiveProcesses           uint32\n\tTotalTerminateProcesses   uint32\n}\n\n// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_and_io_accounting_information\ntype JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION struct {\n\tBasicInfo JOBOBJECT_BASIC_ACCOUNTING_INFORMATION\n\tIoInfo    windows.IO_COUNTERS\n}\n\n//\ttypedef struct _JOBOBJECT_MEMORY_USAGE_INFORMATION {\n//\t\tULONG64 JobMemory;\n//\t\tULONG64 PeakJobMemoryUsed;\n//\t} JOBOBJECT_MEMORY_USAGE_INFORMATION, *PJOBOBJECT_MEMORY_USAGE_INFORMATION;\ntype JOBOBJECT_MEMORY_USAGE_INFORMATION struct {\n\tJobMemory         uint64\n\tPeakJobMemoryUsed uint64\n}\n\n//\ttypedef struct _JOBOBJECT_IO_ATTRIBUTION_STATS {\n//\t\tULONG_PTR IoCount;\n//\t\tULONGLONG TotalNonOverlappedQueueTime;\n//\t\tULONGLONG TotalNonOverlappedServiceTime;\n//\t\tULONGLONG TotalSize;\n//\t} JOBOBJECT_IO_ATTRIBUTION_STATS, *PJOBOBJECT_IO_ATTRIBUTION_STATS;\ntype JOBOBJECT_IO_ATTRIBUTION_STATS struct {\n\tIoCount                       uintptr\n\tTotalNonOverlappedQueueTime   uint64\n\tTotalNonOverlappedServiceTime uint64\n\tTotalSize                     uint64\n}\n\n//\ttypedef struct _JOBOBJECT_IO_ATTRIBUTION_INFORMATION {\n//\t    ULONG ControlFlags;\n//\t    JOBOBJECT_IO_ATTRIBUTION_STATS ReadStats;\n//\t    JOBOBJECT_IO_ATTRIBUTION_STATS WriteStats;\n//\t} JOBOBJECT_IO_ATTRIBUTION_INFORMATION, *PJOBOBJECT_IO_ATTRIBUTION_INFORMATION;\ntype JOBOBJECT_IO_ATTRIBUTION_INFORMATION struct {\n\tControlFlags uint32\n\tReadStats    JOBOBJECT_IO_ATTRIBUTION_STATS\n\tWriteStats   JOBOBJECT_IO_ATTRIBUTION_STATS\n}\n\n// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_associate_completion_port\ntype JOBOBJECT_ASSOCIATE_COMPLETION_PORT struct {\n\tCompletionKey  windows.Handle\n\tCompletionPort windows.Handle\n}\n\n//\ttypedef struct _SILOOBJECT_BASIC_INFORMATION {\n//\t    DWORD SiloId;\n//\t    DWORD SiloParentId;\n//\t    DWORD NumberOfProcesses;\n//\t    BOOLEAN IsInServerSilo;\n//\t    BYTE  Reserved[3];\n//\t} SILOOBJECT_BASIC_INFORMATION, *PSILOOBJECT_BASIC_INFORMATION;\ntype SILOOBJECT_BASIC_INFORMATION struct {\n\tSiloID            uint32\n\tSiloParentID      uint32\n\tNumberOfProcesses uint32\n\tIsInServerSilo    bool\n\tReserved          [3]uint8\n}\n\n// BOOL IsProcessInJob(\n// \t\tHANDLE ProcessHandle,\n// \t\tHANDLE JobHandle,\n// \t\tPBOOL  Result\n// );\n//\n//sys IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result *int32) (err error) = kernel32.IsProcessInJob\n\n// BOOL QueryInformationJobObject(\n//\t\tHANDLE             hJob,\n//\t\tJOBOBJECTINFOCLASS JobObjectInformationClass,\n//\t\tLPVOID             lpJobObjectInformation,\n//\t\tDWORD              cbJobObjectInformationLength,\n//\t\tLPDWORD            lpReturnLength\n// );\n//\n//sys QueryInformationJobObject(jobHandle windows.Handle, infoClass uint32, jobObjectInfo unsafe.Pointer, jobObjectInformationLength uint32, lpReturnLength *uint32) (err error) = kernel32.QueryInformationJobObject\n\n// HANDLE OpenJobObjectW(\n//\t\tDWORD   dwDesiredAccess,\n//\t\tBOOL    bInheritHandle,\n//\t\tLPCWSTR lpName\n// );\n//\n//sys OpenJobObject(desiredAccess uint32, inheritHandle bool, lpName *uint16) (handle windows.Handle, err error) = kernel32.OpenJobObjectW\n\n// DWORD SetIoRateControlInformationJobObject(\n//\t\tHANDLE                                hJob,\n//\t\tJOBOBJECT_IO_RATE_CONTROL_INFORMATION *IoRateControlInfo\n// );\n//\n//sys SetIoRateControlInformationJobObject(jobHandle windows.Handle, ioRateControlInfo *JOBOBJECT_IO_RATE_CONTROL_INFORMATION) (ret uint32, err error) = kernel32.SetIoRateControlInformationJobObject\n\n// DWORD QueryIoRateControlInformationJobObject(\n// \t\tHANDLE                                hJob,\n// \t\tPCWSTR                                VolumeName,\n//\t\tJOBOBJECT_IO_RATE_CONTROL_INFORMATION **InfoBlocks,\n// \t\tULONG                                 *InfoBlockCount\n// );\n//\n//sys QueryIoRateControlInformationJobObject(jobHandle windows.Handle, volumeName *uint16, ioRateControlInfo **JOBOBJECT_IO_RATE_CONTROL_INFORMATION, infoBlockCount *uint32) (ret uint32, err error) = kernel32.QueryIoRateControlInformationJobObject\n\n// NTSTATUS\n// NtOpenJobObject (\n//     _Out_ PHANDLE JobHandle,\n//     _In_ ACCESS_MASK DesiredAccess,\n//     _In_ POBJECT_ATTRIBUTES ObjectAttributes\n// );\n//\n//sys NtOpenJobObject(jobHandle *windows.Handle, desiredAccess uint32, objAttributes *ObjectAttributes) (status uint32) = ntdll.NtOpenJobObject\n\n// NTSTATUS\n// NTAPI\n// NtCreateJobObject (\n//     _Out_ PHANDLE JobHandle,\n//     _In_ ACCESS_MASK DesiredAccess,\n//     _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes\n// );\n//\n//sys NtCreateJobObject(jobHandle *windows.Handle, desiredAccess uint32, objAttributes *ObjectAttributes) (status uint32) = ntdll.NtCreateJobObject\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/logon.go",
    "content": "package winapi\n\n// BOOL LogonUserA(\n// \tLPCWSTR  lpszUsername,\n// \tLPCWSTR  lpszDomain,\n// \tLPCWSTR  lpszPassword,\n// \tDWORD   dwLogonType,\n// \tDWORD   dwLogonProvider,\n// \tPHANDLE phToken\n// );\n//\n//sys LogonUser(username *uint16, domain *uint16, password *uint16, logonType uint32, logonProvider uint32, token *windows.Token) (err error) = advapi32.LogonUserW\n\n// Logon types\nconst (\n\tLOGON32_LOGON_INTERACTIVE       uint32 = 2\n\tLOGON32_LOGON_NETWORK           uint32 = 3\n\tLOGON32_LOGON_BATCH             uint32 = 4\n\tLOGON32_LOGON_SERVICE           uint32 = 5\n\tLOGON32_LOGON_UNLOCK            uint32 = 7\n\tLOGON32_LOGON_NETWORK_CLEARTEXT uint32 = 8\n\tLOGON32_LOGON_NEW_CREDENTIALS   uint32 = 9\n)\n\n// Logon providers\nconst (\n\tLOGON32_PROVIDER_DEFAULT uint32 = 0\n\tLOGON32_PROVIDER_WINNT40 uint32 = 2\n\tLOGON32_PROVIDER_WINNT50 uint32 = 3\n)\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/memory.go",
    "content": "package winapi\n\n//sys LocalAlloc(flags uint32, size int) (ptr uintptr) = kernel32.LocalAlloc\n//sys LocalFree(ptr uintptr) = kernel32.LocalFree\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/net.go",
    "content": "package winapi\n\n//sys SetJobCompartmentId(handle windows.Handle, compartmentId uint32) (win32Err error) = iphlpapi.SetJobCompartmentId\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/offlinereg.go",
    "content": "package winapi\n\n// Offline registry management API\n\ntype ORHKey uintptr\n\ntype RegType uint32\n\nconst (\n\t// Registry value types: https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-value-types\n\tREG_TYPE_NONE                       RegType = 0\n\tREG_TYPE_SZ                         RegType = 1\n\tREG_TYPE_EXPAND_SZ                  RegType = 2\n\tREG_TYPE_BINARY                     RegType = 3\n\tREG_TYPE_DWORD                      RegType = 4\n\tREG_TYPE_DWORD_LITTLE_ENDIAN        RegType = 4\n\tREG_TYPE_DWORD_BIG_ENDIAN           RegType = 5\n\tREG_TYPE_LINK                       RegType = 6\n\tREG_TYPE_MULTI_SZ                   RegType = 7\n\tREG_TYPE_RESOURCE_LIST              RegType = 8\n\tREG_TYPE_FULL_RESOURCE_DESCRIPTOR   RegType = 9\n\tREG_TYPE_RESOURCE_REQUIREMENTS_LIST RegType = 10\n\tREG_TYPE_QWORD                      RegType = 11\n\tREG_TYPE_QWORD_LITTLE_ENDIAN        RegType = 11\n)\n\n//sys ORCreateHive(key *ORHKey) (win32err error) = offreg.ORCreateHive\n//sys ORMergeHives(hiveHandles []ORHKey, result *ORHKey) (win32err error) = offreg.ORMergeHives\n//sys OROpenHive(hivePath string, result *ORHKey) (win32err error) = offreg.OROpenHive\n//sys ORCloseHive(handle ORHKey) (win32err error) = offreg.ORCloseHive\n//sys ORSaveHive(handle ORHKey, hivePath string, osMajorVersion uint32, osMinorVersion uint32) (win32err error) = offreg.ORSaveHive\n//sys OROpenKey(handle ORHKey, subKey string, result *ORHKey) (win32err error) = offreg.OROpenKey\n//sys ORCloseKey(handle ORHKey) (win32err error) = offreg.ORCloseKey\n//sys ORCreateKey(handle ORHKey, subKey string, class uintptr, options uint32, securityDescriptor uintptr, result *ORHKey, disposition *uint32) (win32err error) = offreg.ORCreateKey\n//sys ORDeleteKey(handle ORHKey, subKey string) (win32err error) = offreg.ORDeleteKey\n//sys ORGetValue(handle ORHKey, subKey string, value string, valueType *uint32, data *byte, dataLen *uint32) (win32err error) = offreg.ORGetValue\n//sys ORSetValue(handle ORHKey, valueName string, valueType uint32, data *byte, dataLen uint32) (win32err error) = offreg.ORSetValue\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/path.go",
    "content": "package winapi\n\n// DWORD SearchPathW(\n// \tLPCWSTR lpPath,\n// \tLPCWSTR lpFileName,\n// \tLPCWSTR lpExtension,\n// \tDWORD   nBufferLength,\n// \tLPWSTR  lpBuffer,\n// \tLPWSTR  *lpFilePart\n// );\n//\n//sys SearchPath(lpPath *uint16, lpFileName *uint16, lpExtension *uint16, nBufferLength uint32, lpBuffer *uint16, lpFilePath *uint16) (size uint32, err error) = kernel32.SearchPathW\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go",
    "content": "package winapi\n\nconst PROCESS_ALL_ACCESS uint32 = 2097151\n\nconst (\n\tPROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE = 0x20016\n\tPROC_THREAD_ATTRIBUTE_JOB_LIST      = 0x2000D\n)\n\n// ProcessVmCounters corresponds to the _VM_COUNTERS_EX and _VM_COUNTERS_EX2 structures.\nconst ProcessVmCounters = 3\n\n// __kernel_entry NTSTATUS NtQueryInformationProcess(\n// \t[in]            HANDLE           ProcessHandle,\n// \t[in]            PROCESSINFOCLASS ProcessInformationClass,\n// \t[out]           PVOID            ProcessInformation,\n// \t[in]            ULONG            ProcessInformationLength,\n// \t[out, optional] PULONG           ReturnLength\n// );\n//\n//sys NtQueryInformationProcess(processHandle windows.Handle, processInfoClass uint32, processInfo unsafe.Pointer, processInfoLength uint32, returnLength *uint32) (status uint32) = ntdll.NtQueryInformationProcess\n\n//\ttypedef struct _VM_COUNTERS_EX {\n//\t\t   SIZE_T PeakVirtualSize;\n//\t\t   SIZE_T VirtualSize;\n//\t\t   ULONG PageFaultCount;\n//\t\t   SIZE_T PeakWorkingSetSize;\n//\t\t   SIZE_T WorkingSetSize;\n//\t\t   SIZE_T QuotaPeakPagedPoolUsage;\n//\t\t   SIZE_T QuotaPagedPoolUsage;\n//\t\t   SIZE_T QuotaPeakNonPagedPoolUsage;\n//\t\t   SIZE_T QuotaNonPagedPoolUsage;\n//\t\t   SIZE_T PagefileUsage;\n//\t\t   SIZE_T PeakPagefileUsage;\n//\t\t   SIZE_T PrivateUsage;\n//\t} VM_COUNTERS_EX, *PVM_COUNTERS_EX;\ntype VM_COUNTERS_EX struct {\n\tPeakVirtualSize            uintptr\n\tVirtualSize                uintptr\n\tPageFaultCount             uint32\n\tPeakWorkingSetSize         uintptr\n\tWorkingSetSize             uintptr\n\tQuotaPeakPagedPoolUsage    uintptr\n\tQuotaPagedPoolUsage        uintptr\n\tQuotaPeakNonPagedPoolUsage uintptr\n\tQuotaNonPagedPoolUsage     uintptr\n\tPagefileUsage              uintptr\n\tPeakPagefileUsage          uintptr\n\tPrivateUsage               uintptr\n}\n\n//\ttypedef struct _VM_COUNTERS_EX2 {\n//\t\t   VM_COUNTERS_EX CountersEx;\n//\t\t   SIZE_T PrivateWorkingSetSize;\n//\t\t   SIZE_T SharedCommitUsage;\n//\t} VM_COUNTERS_EX2, *PVM_COUNTERS_EX2;\ntype VM_COUNTERS_EX2 struct {\n\tCountersEx            VM_COUNTERS_EX\n\tPrivateWorkingSetSize uintptr\n\tSharedCommitUsage     uintptr\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/processor.go",
    "content": "package winapi\n\n// Get count from all processor groups.\n// https://docs.microsoft.com/en-us/windows/win32/procthread/processor-groups\nconst ALL_PROCESSOR_GROUPS = 0xFFFF\n\n//sys GetActiveProcessorCount(groupNumber uint16) (amount uint32) = kernel32.GetActiveProcessorCount\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/system.go",
    "content": "//go:build windows\n\npackage winapi\n\nimport \"golang.org/x/sys/windows\"\n\nconst SystemProcessInformation = 5\n\nconst STATUS_INFO_LENGTH_MISMATCH = 0xC0000004\n\n// __kernel_entry NTSTATUS NtQuerySystemInformation(\n// \tSYSTEM_INFORMATION_CLASS SystemInformationClass,\n// \tPVOID                    SystemInformation,\n// \tULONG                    SystemInformationLength,\n// \tPULONG                   ReturnLength\n// );\n//\n//sys NtQuerySystemInformation(systemInfoClass int, systemInformation unsafe.Pointer, systemInfoLength uint32, returnLength *uint32) (status uint32) = ntdll.NtQuerySystemInformation\n\ntype SYSTEM_PROCESS_INFORMATION struct {\n\tNextEntryOffset              uint32         // ULONG\n\tNumberOfThreads              uint32         // ULONG\n\tWorkingSetPrivateSize        int64          // LARGE_INTEGER\n\tHardFaultCount               uint32         // ULONG\n\tNumberOfThreadsHighWatermark uint32         // ULONG\n\tCycleTime                    uint64         // ULONGLONG\n\tCreateTime                   int64          // LARGE_INTEGER\n\tUserTime                     int64          // LARGE_INTEGER\n\tKernelTime                   int64          // LARGE_INTEGER\n\tImageName                    UnicodeString  // UNICODE_STRING\n\tBasePriority                 int32          // KPRIORITY\n\tUniqueProcessID              windows.Handle // HANDLE\n\tInheritedFromUniqueProcessID windows.Handle // HANDLE\n\tHandleCount                  uint32         // ULONG\n\tSessionID                    uint32         // ULONG\n\tUniqueProcessKey             *uint32        // ULONG_PTR\n\tPeakVirtualSize              uintptr        // SIZE_T\n\tVirtualSize                  uintptr        // SIZE_T\n\tPageFaultCount               uint32         // ULONG\n\tPeakWorkingSetSize           uintptr        // SIZE_T\n\tWorkingSetSize               uintptr        // SIZE_T\n\tQuotaPeakPagedPoolUsage      uintptr        // SIZE_T\n\tQuotaPagedPoolUsage          uintptr        // SIZE_T\n\tQuotaPeakNonPagedPoolUsage   uintptr        // SIZE_T\n\tQuotaNonPagedPoolUsage       uintptr        // SIZE_T\n\tPagefileUsage                uintptr        // SIZE_T\n\tPeakPagefileUsage            uintptr        // SIZE_T\n\tPrivatePageCount             uintptr        // SIZE_T\n\tReadOperationCount           int64          // LARGE_INTEGER\n\tWriteOperationCount          int64          // LARGE_INTEGER\n\tOtherOperationCount          int64          // LARGE_INTEGER\n\tReadTransferCount            int64          // LARGE_INTEGER\n\tWriteTransferCount           int64          // LARGE_INTEGER\n\tOtherTransferCount           int64          // LARGE_INTEGER\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/thread.go",
    "content": "package winapi\n\n// HANDLE CreateRemoteThread(\n// \tHANDLE                 hProcess,\n// \tLPSECURITY_ATTRIBUTES  lpThreadAttributes,\n// \tSIZE_T                 dwStackSize,\n// \tLPTHREAD_START_ROUTINE lpStartAddress,\n// \tLPVOID                 lpParameter,\n// \tDWORD                  dwCreationFlags,\n// \tLPDWORD                lpThreadId\n// );\n//\n//sys CreateRemoteThread(process windows.Handle, sa *windows.SecurityAttributes, stackSize uint32, startAddr uintptr, parameter uintptr, creationFlags uint32, threadID *uint32) (handle windows.Handle, err error) = kernel32.CreateRemoteThread\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/user.go",
    "content": "//go:build windows\n\npackage winapi\n\nimport (\n\t\"syscall\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\nconst UserNameCharLimit = 20\n\nconst (\n\tUSER_PRIV_GUEST uint32 = iota\n\tUSER_PRIV_USER\n\tUSER_PRIV_ADMIN\n)\n\nconst (\n\tUF_NORMAL_ACCOUNT     = 0x00200\n\tUF_DONT_EXPIRE_PASSWD = 0x10000\n)\n\nconst NERR_UserNotFound = syscall.Errno(0x8AD)\n\n//\ttypedef struct _LOCALGROUP_MEMBERS_INFO_0 {\n//\t\tPSID lgrmi0_sid;\n//\t} LOCALGROUP_MEMBERS_INFO_0, *PLOCALGROUP_MEMBERS_INFO_0, *LPLOCALGROUP_MEMBERS_INFO_0;\ntype LocalGroupMembersInfo0 struct {\n\tSid *windows.SID\n}\n\n//\ttypedef struct _LOCALGROUP_INFO_1 {\n//\t\tLPWSTR lgrpi1_name;\n//\t\tLPWSTR lgrpi1_comment;\n//\t} LOCALGROUP_INFO_1, *PLOCALGROUP_INFO_1, *LPLOCALGROUP_INFO_1;\ntype LocalGroupInfo1 struct {\n\tName    *uint16\n\tComment *uint16\n}\n\n//\ttypedef struct _USER_INFO_1 {\n//\t\tLPWSTR usri1_name;\n//\t\tLPWSTR usri1_password;\n//\t\tDWORD  usri1_password_age;\n//\t\tDWORD  usri1_priv;\n//\t\tLPWSTR usri1_home_dir;\n//\t\tLPWSTR usri1_comment;\n//\t\tDWORD  usri1_flags;\n//\t\tLPWSTR usri1_script_path;\n//\t} USER_INFO_1, *PUSER_INFO_1, *LPUSER_INFO_1;\ntype UserInfo1 struct {\n\tName        *uint16\n\tPassword    *uint16\n\tPasswordAge uint32\n\tPriv        uint32\n\tHomeDir     *uint16\n\tComment     *uint16\n\tFlags       uint32\n\tScriptPath  *uint16\n}\n\n// NET_API_STATUS NET_API_FUNCTION NetLocalGroupGetInfo(\n// \t[in]  LPCWSTR servername,\n// \t[in]  LPCWSTR groupname,\n// \t[in]  DWORD   level,\n// \t[out] LPBYTE  *bufptr\n// );\n//\n//sys netLocalGroupGetInfo(serverName *uint16, groupName *uint16, level uint32, bufptr **byte) (status error) = netapi32.NetLocalGroupGetInfo\n\n// NetLocalGroupGetInfo is a slightly go friendlier wrapper around the NetLocalGroupGetInfo function. Instead of taking in *uint16's, it takes in\n// go strings and does the conversion internally.\nfunc NetLocalGroupGetInfo(serverName, groupName string, level uint32, bufPtr **byte) (err error) {\n\tvar (\n\t\tserverNameUTF16 *uint16\n\t\tgroupNameUTF16  *uint16\n\t)\n\tif serverName != \"\" {\n\t\tserverNameUTF16, err = windows.UTF16PtrFromString(serverName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif groupName != \"\" {\n\t\tgroupNameUTF16, err = windows.UTF16PtrFromString(groupName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn netLocalGroupGetInfo(\n\t\tserverNameUTF16,\n\t\tgroupNameUTF16,\n\t\tlevel,\n\t\tbufPtr,\n\t)\n}\n\n// NET_API_STATUS NET_API_FUNCTION NetUserAdd(\n// \t[in]  LPCWSTR servername,\n// \t[in]  DWORD   level,\n// \t[in]  LPBYTE  buf,\n// \t[out] LPDWORD parm_err\n// );\n//\n//sys netUserAdd(serverName *uint16, level uint32, buf *byte, parm_err *uint32) (status error) = netapi32.NetUserAdd\n\n// NetUserAdd is a slightly go friendlier wrapper around the NetUserAdd function. Instead of taking in *uint16's, it takes in\n// go strings and does the conversion internally.\nfunc NetUserAdd(serverName string, level uint32, buf *byte, parm_err *uint32) (err error) {\n\tvar serverNameUTF16 *uint16\n\tif serverName != \"\" {\n\t\tserverNameUTF16, err = windows.UTF16PtrFromString(serverName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn netUserAdd(\n\t\tserverNameUTF16,\n\t\tlevel,\n\t\tbuf,\n\t\tparm_err,\n\t)\n}\n\n// NET_API_STATUS NET_API_FUNCTION NetUserDel(\n// \t[in] LPCWSTR servername,\n// \t[in] LPCWSTR username\n// );\n//\n//sys netUserDel(serverName *uint16, username *uint16) (status error) = netapi32.NetUserDel\n\n// NetUserDel is a slightly go friendlier wrapper around the NetUserDel function. Instead of taking in *uint16's, it takes in\n// go strings and does the conversion internally.\nfunc NetUserDel(serverName, userName string) (err error) {\n\tvar (\n\t\tserverNameUTF16 *uint16\n\t\tuserNameUTF16   *uint16\n\t)\n\tif serverName != \"\" {\n\t\tserverNameUTF16, err = windows.UTF16PtrFromString(serverName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif userName != \"\" {\n\t\tuserNameUTF16, err = windows.UTF16PtrFromString(userName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn netUserDel(\n\t\tserverNameUTF16,\n\t\tuserNameUTF16,\n\t)\n}\n\n// NET_API_STATUS NET_API_FUNCTION NetLocalGroupAddMembers(\n// \t[in] LPCWSTR servername,\n// \t[in] LPCWSTR groupname,\n// \t[in] DWORD   level,\n// \t[in] LPBYTE  buf,\n// \t[in] DWORD   totalentries\n// );\n//\n//sys netLocalGroupAddMembers(serverName *uint16, groupName *uint16, level uint32, buf *byte, totalEntries uint32) (status error) = netapi32.NetLocalGroupAddMembers\n\n// NetLocalGroupAddMembers is a slightly go friendlier wrapper around the NetLocalGroupAddMembers function. Instead of taking in *uint16's, it takes in\n// go strings and does the conversion internally.\nfunc NetLocalGroupAddMembers(serverName, groupName string, level uint32, buf *byte, totalEntries uint32) (err error) {\n\tvar (\n\t\tserverNameUTF16 *uint16\n\t\tgroupNameUTF16  *uint16\n\t)\n\tif serverName != \"\" {\n\t\tserverNameUTF16, err = windows.UTF16PtrFromString(serverName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif groupName != \"\" {\n\t\tgroupNameUTF16, err = windows.UTF16PtrFromString(groupName)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn netLocalGroupAddMembers(\n\t\tserverNameUTF16,\n\t\tgroupNameUTF16,\n\t\tlevel,\n\t\tbuf,\n\t\ttotalEntries,\n\t)\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go",
    "content": "//go:build windows\n\npackage winapi\n\nimport (\n\t\"errors\"\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\n// Uint16BufferToSlice wraps a uint16 pointer-and-length into a slice\n// for easier interop with Go APIs\nfunc Uint16BufferToSlice(buffer *uint16, bufferLength int) (result []uint16) {\n\tresult = unsafe.Slice(buffer, bufferLength)\n\treturn\n}\n\n// UnicodeString corresponds to UNICODE_STRING win32 struct defined here\n// https://docs.microsoft.com/en-us/windows/win32/api/ntdef/ns-ntdef-_unicode_string\ntype UnicodeString struct {\n\tLength        uint16\n\tMaximumLength uint16\n\tBuffer        *uint16\n}\n\n// NTSTRSAFE_UNICODE_STRING_MAX_CCH is a constant defined in ntstrsafe.h. This value\n// denotes the maximum number of wide chars a path can have.\nconst NTSTRSAFE_UNICODE_STRING_MAX_CCH = 32767\n\n// String converts a UnicodeString to a golang string\nfunc (uni UnicodeString) String() string {\n\t// UnicodeString is not guaranteed to be null terminated, therefore\n\t// use the UnicodeString's Length field\n\treturn windows.UTF16ToString(Uint16BufferToSlice(uni.Buffer, int(uni.Length/2)))\n}\n\n// NewUnicodeString allocates a new UnicodeString and copies `s` into\n// the buffer of the new UnicodeString.\nfunc NewUnicodeString(s string) (*UnicodeString, error) {\n\tbuf, err := windows.UTF16FromString(s)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif len(buf) > NTSTRSAFE_UNICODE_STRING_MAX_CCH {\n\t\treturn nil, syscall.ENAMETOOLONG\n\t}\n\n\tuni := &UnicodeString{\n\t\t// The length is in bytes and should not include the trailing null character.\n\t\tLength:        uint16((len(buf) - 1) * 2),\n\t\tMaximumLength: uint16((len(buf) - 1) * 2),\n\t\tBuffer:        &buf[0],\n\t}\n\treturn uni, nil\n}\n\n// ConvertStringSetToSlice is a helper function used to convert the contents of\n// `buf` into a string slice. `buf` contains a set of null terminated strings\n// with an additional null at the end to indicate the end of the set.\nfunc ConvertStringSetToSlice(buf []byte) ([]string, error) {\n\tvar results []string\n\tprev := 0\n\tfor i := range buf {\n\t\tif buf[i] == 0 {\n\t\t\tif prev == i {\n\t\t\t\t// found two null characters in a row, return result\n\t\t\t\treturn results, nil\n\t\t\t}\n\t\t\tresults = append(results, string(buf[prev:i]))\n\t\t\tprev = i + 1\n\t\t}\n\t}\n\treturn nil, errors.New(\"string set malformed: missing null terminator at end of buffer\")\n}\n\n// ParseUtf16LE parses a UTF-16LE byte array into a string (without passing\n// through a uint16 or rune array).\nfunc ParseUtf16LE(b []byte) string {\n\treturn windows.UTF16PtrToString((*uint16)(unsafe.Pointer(&b[0])))\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go",
    "content": "package winapi\n\n//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go ./*.go\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go",
    "content": "//go:build windows\n\n// Code generated by 'go generate' using \"github.com/Microsoft/go-winio/tools/mkwinsyscall\"; DO NOT EDIT.\n\npackage winapi\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\nvar _ unsafe.Pointer\n\n// Do the interface allocations only once for common\n// Errno values.\nconst (\n\terrnoERROR_IO_PENDING = 997\n)\n\nvar (\n\terrERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)\n\terrERROR_EINVAL     error = syscall.EINVAL\n)\n\n// errnoErr returns common boxed Errno values, to prevent\n// allocations at runtime.\nfunc errnoErr(e syscall.Errno) error {\n\tswitch e {\n\tcase 0:\n\t\treturn errERROR_EINVAL\n\tcase errnoERROR_IO_PENDING:\n\t\treturn errERROR_IO_PENDING\n\t}\n\treturn e\n}\n\nvar (\n\tmodadvapi32   = windows.NewLazySystemDLL(\"advapi32.dll\")\n\tmodbindfltapi = windows.NewLazySystemDLL(\"bindfltapi.dll\")\n\tmodcfgmgr32   = windows.NewLazySystemDLL(\"cfgmgr32.dll\")\n\tmodcimfs      = windows.NewLazySystemDLL(\"cimfs.dll\")\n\tmodiphlpapi   = windows.NewLazySystemDLL(\"iphlpapi.dll\")\n\tmodkernel32   = windows.NewLazySystemDLL(\"kernel32.dll\")\n\tmodnetapi32   = windows.NewLazySystemDLL(\"netapi32.dll\")\n\tmodntdll      = windows.NewLazySystemDLL(\"ntdll.dll\")\n\tmodoffreg     = windows.NewLazySystemDLL(\"offreg.dll\")\n\n\tprocLogonUserW                             = modadvapi32.NewProc(\"LogonUserW\")\n\tprocBfSetupFilter                          = modbindfltapi.NewProc(\"BfSetupFilter\")\n\tprocCM_Get_DevNode_PropertyW               = modcfgmgr32.NewProc(\"CM_Get_DevNode_PropertyW\")\n\tprocCM_Get_Device_ID_ListA                 = modcfgmgr32.NewProc(\"CM_Get_Device_ID_ListA\")\n\tprocCM_Get_Device_ID_List_SizeA            = modcfgmgr32.NewProc(\"CM_Get_Device_ID_List_SizeA\")\n\tprocCM_Locate_DevNodeW                     = modcfgmgr32.NewProc(\"CM_Locate_DevNodeW\")\n\tprocCimAddFsToMergedImage                  = modcimfs.NewProc(\"CimAddFsToMergedImage\")\n\tprocCimAddFsToMergedImage2                 = modcimfs.NewProc(\"CimAddFsToMergedImage2\")\n\tprocCimCloseImage                          = modcimfs.NewProc(\"CimCloseImage\")\n\tprocCimCloseStream                         = modcimfs.NewProc(\"CimCloseStream\")\n\tprocCimCommitImage                         = modcimfs.NewProc(\"CimCommitImage\")\n\tprocCimCreateAlternateStream               = modcimfs.NewProc(\"CimCreateAlternateStream\")\n\tprocCimCreateFile                          = modcimfs.NewProc(\"CimCreateFile\")\n\tprocCimCreateHardLink                      = modcimfs.NewProc(\"CimCreateHardLink\")\n\tprocCimCreateImage                         = modcimfs.NewProc(\"CimCreateImage\")\n\tprocCimCreateImage2                        = modcimfs.NewProc(\"CimCreateImage2\")\n\tprocCimCreateMergeLink                     = modcimfs.NewProc(\"CimCreateMergeLink\")\n\tprocCimDeletePath                          = modcimfs.NewProc(\"CimDeletePath\")\n\tprocCimDismountImage                       = modcimfs.NewProc(\"CimDismountImage\")\n\tprocCimMergeMountImage                     = modcimfs.NewProc(\"CimMergeMountImage\")\n\tprocCimMountImage                          = modcimfs.NewProc(\"CimMountImage\")\n\tprocCimTombstoneFile                       = modcimfs.NewProc(\"CimTombstoneFile\")\n\tprocCimWriteStream                         = modcimfs.NewProc(\"CimWriteStream\")\n\tprocSetJobCompartmentId                    = modiphlpapi.NewProc(\"SetJobCompartmentId\")\n\tprocClosePseudoConsole                     = modkernel32.NewProc(\"ClosePseudoConsole\")\n\tprocCopyFileW                              = modkernel32.NewProc(\"CopyFileW\")\n\tprocCreatePseudoConsole                    = modkernel32.NewProc(\"CreatePseudoConsole\")\n\tprocCreateRemoteThread                     = modkernel32.NewProc(\"CreateRemoteThread\")\n\tprocGetActiveProcessorCount                = modkernel32.NewProc(\"GetActiveProcessorCount\")\n\tprocIsProcessInJob                         = modkernel32.NewProc(\"IsProcessInJob\")\n\tprocLocalAlloc                             = modkernel32.NewProc(\"LocalAlloc\")\n\tprocLocalFree                              = modkernel32.NewProc(\"LocalFree\")\n\tprocOpenJobObjectW                         = modkernel32.NewProc(\"OpenJobObjectW\")\n\tprocQueryInformationJobObject              = modkernel32.NewProc(\"QueryInformationJobObject\")\n\tprocQueryIoRateControlInformationJobObject = modkernel32.NewProc(\"QueryIoRateControlInformationJobObject\")\n\tprocResizePseudoConsole                    = modkernel32.NewProc(\"ResizePseudoConsole\")\n\tprocSearchPathW                            = modkernel32.NewProc(\"SearchPathW\")\n\tprocSetIoRateControlInformationJobObject   = modkernel32.NewProc(\"SetIoRateControlInformationJobObject\")\n\tprocNetLocalGroupAddMembers                = modnetapi32.NewProc(\"NetLocalGroupAddMembers\")\n\tprocNetLocalGroupGetInfo                   = modnetapi32.NewProc(\"NetLocalGroupGetInfo\")\n\tprocNetUserAdd                             = modnetapi32.NewProc(\"NetUserAdd\")\n\tprocNetUserDel                             = modnetapi32.NewProc(\"NetUserDel\")\n\tprocNtCreateFile                           = modntdll.NewProc(\"NtCreateFile\")\n\tprocNtCreateJobObject                      = modntdll.NewProc(\"NtCreateJobObject\")\n\tprocNtOpenDirectoryObject                  = modntdll.NewProc(\"NtOpenDirectoryObject\")\n\tprocNtOpenJobObject                        = modntdll.NewProc(\"NtOpenJobObject\")\n\tprocNtQueryDirectoryObject                 = modntdll.NewProc(\"NtQueryDirectoryObject\")\n\tprocNtQueryInformationProcess              = modntdll.NewProc(\"NtQueryInformationProcess\")\n\tprocNtQuerySystemInformation               = modntdll.NewProc(\"NtQuerySystemInformation\")\n\tprocNtSetInformationFile                   = modntdll.NewProc(\"NtSetInformationFile\")\n\tprocRtlNtStatusToDosError                  = modntdll.NewProc(\"RtlNtStatusToDosError\")\n\tprocORCloseHive                            = modoffreg.NewProc(\"ORCloseHive\")\n\tprocORCloseKey                             = modoffreg.NewProc(\"ORCloseKey\")\n\tprocORCreateHive                           = modoffreg.NewProc(\"ORCreateHive\")\n\tprocORCreateKey                            = modoffreg.NewProc(\"ORCreateKey\")\n\tprocORDeleteKey                            = modoffreg.NewProc(\"ORDeleteKey\")\n\tprocORGetValue                             = modoffreg.NewProc(\"ORGetValue\")\n\tprocORMergeHives                           = modoffreg.NewProc(\"ORMergeHives\")\n\tprocOROpenHive                             = modoffreg.NewProc(\"OROpenHive\")\n\tprocOROpenKey                              = modoffreg.NewProc(\"OROpenKey\")\n\tprocORSaveHive                             = modoffreg.NewProc(\"ORSaveHive\")\n\tprocORSetValue                             = modoffreg.NewProc(\"ORSetValue\")\n)\n\nfunc LogonUser(username *uint16, domain *uint16, password *uint16, logonType uint32, logonProvider uint32, token *windows.Token) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procLogonUserW.Addr(), uintptr(unsafe.Pointer(username)), uintptr(unsafe.Pointer(domain)), uintptr(unsafe.Pointer(password)), uintptr(logonType), uintptr(logonProvider), uintptr(unsafe.Pointer(token)))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc BfSetupFilter(jobHandle windows.Handle, flags uint32, virtRootPath *uint16, virtTargetPath *uint16, virtExceptions **uint16, virtExceptionPathCount uint32) (hr error) {\n\thr = procBfSetupFilter.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procBfSetupFilter.Addr(), uintptr(jobHandle), uintptr(flags), uintptr(unsafe.Pointer(virtRootPath)), uintptr(unsafe.Pointer(virtTargetPath)), uintptr(unsafe.Pointer(virtExceptions)), uintptr(virtExceptionPathCount))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CMGetDevNodeProperty(dnDevInst uint32, propertyKey *DevPropKey, propertyType *uint32, propertyBuffer *uint16, propertyBufferSize *uint32, uFlags uint32) (hr error) {\n\tr0, _, _ := syscall.SyscallN(procCM_Get_DevNode_PropertyW.Addr(), uintptr(dnDevInst), uintptr(unsafe.Pointer(propertyKey)), uintptr(unsafe.Pointer(propertyType)), uintptr(unsafe.Pointer(propertyBuffer)), uintptr(unsafe.Pointer(propertyBufferSize)), uintptr(uFlags))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CMGetDeviceIDList(pszFilter *byte, buffer *byte, bufferLen uint32, uFlags uint32) (hr error) {\n\tr0, _, _ := syscall.SyscallN(procCM_Get_Device_ID_ListA.Addr(), uintptr(unsafe.Pointer(pszFilter)), uintptr(unsafe.Pointer(buffer)), uintptr(bufferLen), uintptr(uFlags))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CMGetDeviceIDListSize(pulLen *uint32, pszFilter *byte, uFlags uint32) (hr error) {\n\tr0, _, _ := syscall.SyscallN(procCM_Get_Device_ID_List_SizeA.Addr(), uintptr(unsafe.Pointer(pulLen)), uintptr(unsafe.Pointer(pszFilter)), uintptr(uFlags))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CMLocateDevNode(pdnDevInst *uint32, pDeviceID string, uFlags uint32) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(pDeviceID)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _CMLocateDevNode(pdnDevInst, _p0, uFlags)\n}\n\nfunc _CMLocateDevNode(pdnDevInst *uint32, pDeviceID *uint16, uFlags uint32) (hr error) {\n\tr0, _, _ := syscall.SyscallN(procCM_Locate_DevNodeW.Addr(), uintptr(unsafe.Pointer(pdnDevInst)), uintptr(unsafe.Pointer(pDeviceID)), uintptr(uFlags))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CimAddFsToMergedImage(cimFSHandle FsHandle, path string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(path)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _CimAddFsToMergedImage(cimFSHandle, _p0)\n}\n\nfunc _CimAddFsToMergedImage(cimFSHandle FsHandle, path *uint16) (hr error) {\n\thr = procCimAddFsToMergedImage.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procCimAddFsToMergedImage.Addr(), uintptr(cimFSHandle), uintptr(unsafe.Pointer(path)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CimAddFsToMergedImage2(cimFSHandle FsHandle, path string, flags uint32) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(path)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _CimAddFsToMergedImage2(cimFSHandle, _p0, flags)\n}\n\nfunc _CimAddFsToMergedImage2(cimFSHandle FsHandle, path *uint16, flags uint32) (hr error) {\n\thr = procCimAddFsToMergedImage2.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procCimAddFsToMergedImage2.Addr(), uintptr(cimFSHandle), uintptr(unsafe.Pointer(path)), uintptr(flags))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CimCloseImage(cimFSHandle FsHandle) (err error) {\n\terr = procCimCloseImage.Find()\n\tif err != nil {\n\t\treturn\n\t}\n\tsyscall.SyscallN(procCimCloseImage.Addr(), uintptr(cimFSHandle))\n\treturn\n}\n\nfunc CimCloseStream(cimStreamHandle StreamHandle) (hr error) {\n\thr = procCimCloseStream.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procCimCloseStream.Addr(), uintptr(cimStreamHandle))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CimCommitImage(cimFSHandle FsHandle) (hr error) {\n\thr = procCimCommitImage.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procCimCommitImage.Addr(), uintptr(cimFSHandle))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CimCreateAlternateStream(cimFSHandle FsHandle, path string, size uint64, cimStreamHandle *StreamHandle) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(path)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _CimCreateAlternateStream(cimFSHandle, _p0, size, cimStreamHandle)\n}\n\nfunc _CimCreateAlternateStream(cimFSHandle FsHandle, path *uint16, size uint64, cimStreamHandle *StreamHandle) (hr error) {\n\thr = procCimCreateAlternateStream.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procCimCreateAlternateStream.Addr(), uintptr(cimFSHandle), uintptr(unsafe.Pointer(path)), uintptr(size), uintptr(unsafe.Pointer(cimStreamHandle)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CimCreateFile(cimFSHandle FsHandle, path string, file *CimFsFileMetadata, cimStreamHandle *StreamHandle) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(path)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _CimCreateFile(cimFSHandle, _p0, file, cimStreamHandle)\n}\n\nfunc _CimCreateFile(cimFSHandle FsHandle, path *uint16, file *CimFsFileMetadata, cimStreamHandle *StreamHandle) (hr error) {\n\thr = procCimCreateFile.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procCimCreateFile.Addr(), uintptr(cimFSHandle), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(file)), uintptr(unsafe.Pointer(cimStreamHandle)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CimCreateHardLink(cimFSHandle FsHandle, newPath string, oldPath string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(newPath)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(oldPath)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _CimCreateHardLink(cimFSHandle, _p0, _p1)\n}\n\nfunc _CimCreateHardLink(cimFSHandle FsHandle, newPath *uint16, oldPath *uint16) (hr error) {\n\thr = procCimCreateHardLink.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procCimCreateHardLink.Addr(), uintptr(cimFSHandle), uintptr(unsafe.Pointer(newPath)), uintptr(unsafe.Pointer(oldPath)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CimCreateImage(imagePath string, oldFSName *uint16, newFSName *uint16, cimFSHandle *FsHandle) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(imagePath)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _CimCreateImage(_p0, oldFSName, newFSName, cimFSHandle)\n}\n\nfunc _CimCreateImage(imagePath *uint16, oldFSName *uint16, newFSName *uint16, cimFSHandle *FsHandle) (hr error) {\n\thr = procCimCreateImage.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procCimCreateImage.Addr(), uintptr(unsafe.Pointer(imagePath)), uintptr(unsafe.Pointer(oldFSName)), uintptr(unsafe.Pointer(newFSName)), uintptr(unsafe.Pointer(cimFSHandle)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CimCreateImage2(imagePath string, flags uint32, oldFSName *uint16, newFSName *uint16, cimFSHandle *FsHandle) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(imagePath)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _CimCreateImage2(_p0, flags, oldFSName, newFSName, cimFSHandle)\n}\n\nfunc _CimCreateImage2(imagePath *uint16, flags uint32, oldFSName *uint16, newFSName *uint16, cimFSHandle *FsHandle) (hr error) {\n\thr = procCimCreateImage2.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procCimCreateImage2.Addr(), uintptr(unsafe.Pointer(imagePath)), uintptr(flags), uintptr(unsafe.Pointer(oldFSName)), uintptr(unsafe.Pointer(newFSName)), uintptr(unsafe.Pointer(cimFSHandle)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CimCreateMergeLink(cimFSHandle FsHandle, newPath string, oldPath string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(newPath)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(oldPath)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _CimCreateMergeLink(cimFSHandle, _p0, _p1)\n}\n\nfunc _CimCreateMergeLink(cimFSHandle FsHandle, newPath *uint16, oldPath *uint16) (hr error) {\n\thr = procCimCreateMergeLink.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procCimCreateMergeLink.Addr(), uintptr(cimFSHandle), uintptr(unsafe.Pointer(newPath)), uintptr(unsafe.Pointer(oldPath)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CimDeletePath(cimFSHandle FsHandle, path string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(path)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _CimDeletePath(cimFSHandle, _p0)\n}\n\nfunc _CimDeletePath(cimFSHandle FsHandle, path *uint16) (hr error) {\n\thr = procCimDeletePath.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procCimDeletePath.Addr(), uintptr(cimFSHandle), uintptr(unsafe.Pointer(path)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CimDismountImage(volumeID *g) (hr error) {\n\thr = procCimDismountImage.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procCimDismountImage.Addr(), uintptr(unsafe.Pointer(volumeID)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CimMergeMountImage(numCimPaths uint32, backingImagePaths *CimFsImagePath, flags uint32, volumeID *g) (hr error) {\n\thr = procCimMergeMountImage.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procCimMergeMountImage.Addr(), uintptr(numCimPaths), uintptr(unsafe.Pointer(backingImagePaths)), uintptr(flags), uintptr(unsafe.Pointer(volumeID)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CimMountImage(imagePath string, fsName string, flags uint32, volumeID *g) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(imagePath)\n\tif hr != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, hr = syscall.UTF16PtrFromString(fsName)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _CimMountImage(_p0, _p1, flags, volumeID)\n}\n\nfunc _CimMountImage(imagePath *uint16, fsName *uint16, flags uint32, volumeID *g) (hr error) {\n\thr = procCimMountImage.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procCimMountImage.Addr(), uintptr(unsafe.Pointer(imagePath)), uintptr(unsafe.Pointer(fsName)), uintptr(flags), uintptr(unsafe.Pointer(volumeID)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CimTombstoneFile(cimFSHandle FsHandle, path string) (hr error) {\n\tvar _p0 *uint16\n\t_p0, hr = syscall.UTF16PtrFromString(path)\n\tif hr != nil {\n\t\treturn\n\t}\n\treturn _CimTombstoneFile(cimFSHandle, _p0)\n}\n\nfunc _CimTombstoneFile(cimFSHandle FsHandle, path *uint16) (hr error) {\n\thr = procCimTombstoneFile.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procCimTombstoneFile.Addr(), uintptr(cimFSHandle), uintptr(unsafe.Pointer(path)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CimWriteStream(cimStreamHandle StreamHandle, buffer uintptr, bufferSize uint32) (hr error) {\n\thr = procCimWriteStream.Find()\n\tif hr != nil {\n\t\treturn\n\t}\n\tr0, _, _ := syscall.SyscallN(procCimWriteStream.Addr(), uintptr(cimStreamHandle), uintptr(buffer), uintptr(bufferSize))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc SetJobCompartmentId(handle windows.Handle, compartmentId uint32) (win32Err error) {\n\tr0, _, _ := syscall.SyscallN(procSetJobCompartmentId.Addr(), uintptr(handle), uintptr(compartmentId))\n\tif r0 != 0 {\n\t\twin32Err = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc ClosePseudoConsole(hpc windows.Handle) {\n\tsyscall.SyscallN(procClosePseudoConsole.Addr(), uintptr(hpc))\n\treturn\n}\n\nfunc CopyFileW(existingFileName *uint16, newFileName *uint16, failIfExists int32) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procCopyFileW.Addr(), uintptr(unsafe.Pointer(existingFileName)), uintptr(unsafe.Pointer(newFileName)), uintptr(failIfExists))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc createPseudoConsole(size uint32, hInput windows.Handle, hOutput windows.Handle, dwFlags uint32, hpcon *windows.Handle) (hr error) {\n\tr0, _, _ := syscall.SyscallN(procCreatePseudoConsole.Addr(), uintptr(size), uintptr(hInput), uintptr(hOutput), uintptr(dwFlags), uintptr(unsafe.Pointer(hpcon)))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc CreateRemoteThread(process windows.Handle, sa *windows.SecurityAttributes, stackSize uint32, startAddr uintptr, parameter uintptr, creationFlags uint32, threadID *uint32) (handle windows.Handle, err error) {\n\tr0, _, e1 := syscall.SyscallN(procCreateRemoteThread.Addr(), uintptr(process), uintptr(unsafe.Pointer(sa)), uintptr(stackSize), uintptr(startAddr), uintptr(parameter), uintptr(creationFlags), uintptr(unsafe.Pointer(threadID)))\n\thandle = windows.Handle(r0)\n\tif handle == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc GetActiveProcessorCount(groupNumber uint16) (amount uint32) {\n\tr0, _, _ := syscall.SyscallN(procGetActiveProcessorCount.Addr(), uintptr(groupNumber))\n\tamount = uint32(r0)\n\treturn\n}\n\nfunc IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result *int32) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procIsProcessInJob.Addr(), uintptr(procHandle), uintptr(jobHandle), uintptr(unsafe.Pointer(result)))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc LocalAlloc(flags uint32, size int) (ptr uintptr) {\n\tr0, _, _ := syscall.SyscallN(procLocalAlloc.Addr(), uintptr(flags), uintptr(size))\n\tptr = uintptr(r0)\n\treturn\n}\n\nfunc LocalFree(ptr uintptr) {\n\tsyscall.SyscallN(procLocalFree.Addr(), uintptr(ptr))\n\treturn\n}\n\nfunc OpenJobObject(desiredAccess uint32, inheritHandle bool, lpName *uint16) (handle windows.Handle, err error) {\n\tvar _p0 uint32\n\tif inheritHandle {\n\t\t_p0 = 1\n\t}\n\tr0, _, e1 := syscall.SyscallN(procOpenJobObjectW.Addr(), uintptr(desiredAccess), uintptr(_p0), uintptr(unsafe.Pointer(lpName)))\n\thandle = windows.Handle(r0)\n\tif handle == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc QueryInformationJobObject(jobHandle windows.Handle, infoClass uint32, jobObjectInfo unsafe.Pointer, jobObjectInformationLength uint32, lpReturnLength *uint32) (err error) {\n\tr1, _, e1 := syscall.SyscallN(procQueryInformationJobObject.Addr(), uintptr(jobHandle), uintptr(infoClass), uintptr(jobObjectInfo), uintptr(jobObjectInformationLength), uintptr(unsafe.Pointer(lpReturnLength)))\n\tif r1 == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc QueryIoRateControlInformationJobObject(jobHandle windows.Handle, volumeName *uint16, ioRateControlInfo **JOBOBJECT_IO_RATE_CONTROL_INFORMATION, infoBlockCount *uint32) (ret uint32, err error) {\n\tr0, _, e1 := syscall.SyscallN(procQueryIoRateControlInformationJobObject.Addr(), uintptr(jobHandle), uintptr(unsafe.Pointer(volumeName)), uintptr(unsafe.Pointer(ioRateControlInfo)), uintptr(unsafe.Pointer(infoBlockCount)))\n\tret = uint32(r0)\n\tif ret == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc resizePseudoConsole(hPc windows.Handle, size uint32) (hr error) {\n\tr0, _, _ := syscall.SyscallN(procResizePseudoConsole.Addr(), uintptr(hPc), uintptr(size))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc SearchPath(lpPath *uint16, lpFileName *uint16, lpExtension *uint16, nBufferLength uint32, lpBuffer *uint16, lpFilePath *uint16) (size uint32, err error) {\n\tr0, _, e1 := syscall.SyscallN(procSearchPathW.Addr(), uintptr(unsafe.Pointer(lpPath)), uintptr(unsafe.Pointer(lpFileName)), uintptr(unsafe.Pointer(lpExtension)), uintptr(nBufferLength), uintptr(unsafe.Pointer(lpBuffer)), uintptr(unsafe.Pointer(lpFilePath)))\n\tsize = uint32(r0)\n\tif size == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc SetIoRateControlInformationJobObject(jobHandle windows.Handle, ioRateControlInfo *JOBOBJECT_IO_RATE_CONTROL_INFORMATION) (ret uint32, err error) {\n\tr0, _, e1 := syscall.SyscallN(procSetIoRateControlInformationJobObject.Addr(), uintptr(jobHandle), uintptr(unsafe.Pointer(ioRateControlInfo)))\n\tret = uint32(r0)\n\tif ret == 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\nfunc netLocalGroupAddMembers(serverName *uint16, groupName *uint16, level uint32, buf *byte, totalEntries uint32) (status error) {\n\tr0, _, _ := syscall.SyscallN(procNetLocalGroupAddMembers.Addr(), uintptr(unsafe.Pointer(serverName)), uintptr(unsafe.Pointer(groupName)), uintptr(level), uintptr(unsafe.Pointer(buf)), uintptr(totalEntries))\n\tif r0 != 0 {\n\t\tstatus = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc netLocalGroupGetInfo(serverName *uint16, groupName *uint16, level uint32, bufptr **byte) (status error) {\n\tr0, _, _ := syscall.SyscallN(procNetLocalGroupGetInfo.Addr(), uintptr(unsafe.Pointer(serverName)), uintptr(unsafe.Pointer(groupName)), uintptr(level), uintptr(unsafe.Pointer(bufptr)))\n\tif r0 != 0 {\n\t\tstatus = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc netUserAdd(serverName *uint16, level uint32, buf *byte, parm_err *uint32) (status error) {\n\tr0, _, _ := syscall.SyscallN(procNetUserAdd.Addr(), uintptr(unsafe.Pointer(serverName)), uintptr(level), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(parm_err)))\n\tif r0 != 0 {\n\t\tstatus = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc netUserDel(serverName *uint16, username *uint16) (status error) {\n\tr0, _, _ := syscall.SyscallN(procNetUserDel.Addr(), uintptr(unsafe.Pointer(serverName)), uintptr(unsafe.Pointer(username)))\n\tif r0 != 0 {\n\t\tstatus = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc NtCreateFile(handle *uintptr, accessMask uint32, oa *ObjectAttributes, iosb *IOStatusBlock, allocationSize *uint64, fileAttributes uint32, shareAccess uint32, createDisposition uint32, createOptions uint32, eaBuffer *byte, eaLength uint32) (status uint32) {\n\tr0, _, _ := syscall.SyscallN(procNtCreateFile.Addr(), uintptr(unsafe.Pointer(handle)), uintptr(accessMask), uintptr(unsafe.Pointer(oa)), uintptr(unsafe.Pointer(iosb)), uintptr(unsafe.Pointer(allocationSize)), uintptr(fileAttributes), uintptr(shareAccess), uintptr(createDisposition), uintptr(createOptions), uintptr(unsafe.Pointer(eaBuffer)), uintptr(eaLength))\n\tstatus = uint32(r0)\n\treturn\n}\n\nfunc NtCreateJobObject(jobHandle *windows.Handle, desiredAccess uint32, objAttributes *ObjectAttributes) (status uint32) {\n\tr0, _, _ := syscall.SyscallN(procNtCreateJobObject.Addr(), uintptr(unsafe.Pointer(jobHandle)), uintptr(desiredAccess), uintptr(unsafe.Pointer(objAttributes)))\n\tstatus = uint32(r0)\n\treturn\n}\n\nfunc NtOpenDirectoryObject(handle *uintptr, accessMask uint32, oa *ObjectAttributes) (status uint32) {\n\tr0, _, _ := syscall.SyscallN(procNtOpenDirectoryObject.Addr(), uintptr(unsafe.Pointer(handle)), uintptr(accessMask), uintptr(unsafe.Pointer(oa)))\n\tstatus = uint32(r0)\n\treturn\n}\n\nfunc NtOpenJobObject(jobHandle *windows.Handle, desiredAccess uint32, objAttributes *ObjectAttributes) (status uint32) {\n\tr0, _, _ := syscall.SyscallN(procNtOpenJobObject.Addr(), uintptr(unsafe.Pointer(jobHandle)), uintptr(desiredAccess), uintptr(unsafe.Pointer(objAttributes)))\n\tstatus = uint32(r0)\n\treturn\n}\n\nfunc NtQueryDirectoryObject(handle uintptr, buffer *byte, length uint32, singleEntry bool, restartScan bool, context *uint32, returnLength *uint32) (status uint32) {\n\tvar _p0 uint32\n\tif singleEntry {\n\t\t_p0 = 1\n\t}\n\tvar _p1 uint32\n\tif restartScan {\n\t\t_p1 = 1\n\t}\n\tr0, _, _ := syscall.SyscallN(procNtQueryDirectoryObject.Addr(), uintptr(handle), uintptr(unsafe.Pointer(buffer)), uintptr(length), uintptr(_p0), uintptr(_p1), uintptr(unsafe.Pointer(context)), uintptr(unsafe.Pointer(returnLength)))\n\tstatus = uint32(r0)\n\treturn\n}\n\nfunc NtQueryInformationProcess(processHandle windows.Handle, processInfoClass uint32, processInfo unsafe.Pointer, processInfoLength uint32, returnLength *uint32) (status uint32) {\n\tr0, _, _ := syscall.SyscallN(procNtQueryInformationProcess.Addr(), uintptr(processHandle), uintptr(processInfoClass), uintptr(processInfo), uintptr(processInfoLength), uintptr(unsafe.Pointer(returnLength)))\n\tstatus = uint32(r0)\n\treturn\n}\n\nfunc NtQuerySystemInformation(systemInfoClass int, systemInformation unsafe.Pointer, systemInfoLength uint32, returnLength *uint32) (status uint32) {\n\tr0, _, _ := syscall.SyscallN(procNtQuerySystemInformation.Addr(), uintptr(systemInfoClass), uintptr(systemInformation), uintptr(systemInfoLength), uintptr(unsafe.Pointer(returnLength)))\n\tstatus = uint32(r0)\n\treturn\n}\n\nfunc NtSetInformationFile(handle uintptr, iosb *IOStatusBlock, information uintptr, length uint32, class uint32) (status uint32) {\n\tr0, _, _ := syscall.SyscallN(procNtSetInformationFile.Addr(), uintptr(handle), uintptr(unsafe.Pointer(iosb)), uintptr(information), uintptr(length), uintptr(class))\n\tstatus = uint32(r0)\n\treturn\n}\n\nfunc RtlNtStatusToDosError(status uint32) (winerr error) {\n\tr0, _, _ := syscall.SyscallN(procRtlNtStatusToDosError.Addr(), uintptr(status))\n\tif r0 != 0 {\n\t\twinerr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc ORCloseHive(handle ORHKey) (win32err error) {\n\tr0, _, _ := syscall.SyscallN(procORCloseHive.Addr(), uintptr(handle))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc ORCloseKey(handle ORHKey) (win32err error) {\n\tr0, _, _ := syscall.SyscallN(procORCloseKey.Addr(), uintptr(handle))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc ORCreateHive(key *ORHKey) (win32err error) {\n\tr0, _, _ := syscall.SyscallN(procORCreateHive.Addr(), uintptr(unsafe.Pointer(key)))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc ORCreateKey(handle ORHKey, subKey string, class uintptr, options uint32, securityDescriptor uintptr, result *ORHKey, disposition *uint32) (win32err error) {\n\tvar _p0 *uint16\n\t_p0, win32err = syscall.UTF16PtrFromString(subKey)\n\tif win32err != nil {\n\t\treturn\n\t}\n\treturn _ORCreateKey(handle, _p0, class, options, securityDescriptor, result, disposition)\n}\n\nfunc _ORCreateKey(handle ORHKey, subKey *uint16, class uintptr, options uint32, securityDescriptor uintptr, result *ORHKey, disposition *uint32) (win32err error) {\n\tr0, _, _ := syscall.SyscallN(procORCreateKey.Addr(), uintptr(handle), uintptr(unsafe.Pointer(subKey)), uintptr(class), uintptr(options), uintptr(securityDescriptor), uintptr(unsafe.Pointer(result)), uintptr(unsafe.Pointer(disposition)))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc ORDeleteKey(handle ORHKey, subKey string) (win32err error) {\n\tvar _p0 *uint16\n\t_p0, win32err = syscall.UTF16PtrFromString(subKey)\n\tif win32err != nil {\n\t\treturn\n\t}\n\treturn _ORDeleteKey(handle, _p0)\n}\n\nfunc _ORDeleteKey(handle ORHKey, subKey *uint16) (win32err error) {\n\tr0, _, _ := syscall.SyscallN(procORDeleteKey.Addr(), uintptr(handle), uintptr(unsafe.Pointer(subKey)))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc ORGetValue(handle ORHKey, subKey string, value string, valueType *uint32, data *byte, dataLen *uint32) (win32err error) {\n\tvar _p0 *uint16\n\t_p0, win32err = syscall.UTF16PtrFromString(subKey)\n\tif win32err != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, win32err = syscall.UTF16PtrFromString(value)\n\tif win32err != nil {\n\t\treturn\n\t}\n\treturn _ORGetValue(handle, _p0, _p1, valueType, data, dataLen)\n}\n\nfunc _ORGetValue(handle ORHKey, subKey *uint16, value *uint16, valueType *uint32, data *byte, dataLen *uint32) (win32err error) {\n\tr0, _, _ := syscall.SyscallN(procORGetValue.Addr(), uintptr(handle), uintptr(unsafe.Pointer(subKey)), uintptr(unsafe.Pointer(value)), uintptr(unsafe.Pointer(valueType)), uintptr(unsafe.Pointer(data)), uintptr(unsafe.Pointer(dataLen)))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc ORMergeHives(hiveHandles []ORHKey, result *ORHKey) (win32err error) {\n\tvar _p0 *ORHKey\n\tif len(hiveHandles) > 0 {\n\t\t_p0 = &hiveHandles[0]\n\t}\n\tr0, _, _ := syscall.SyscallN(procORMergeHives.Addr(), uintptr(unsafe.Pointer(_p0)), uintptr(len(hiveHandles)), uintptr(unsafe.Pointer(result)))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc OROpenHive(hivePath string, result *ORHKey) (win32err error) {\n\tvar _p0 *uint16\n\t_p0, win32err = syscall.UTF16PtrFromString(hivePath)\n\tif win32err != nil {\n\t\treturn\n\t}\n\treturn _OROpenHive(_p0, result)\n}\n\nfunc _OROpenHive(hivePath *uint16, result *ORHKey) (win32err error) {\n\tr0, _, _ := syscall.SyscallN(procOROpenHive.Addr(), uintptr(unsafe.Pointer(hivePath)), uintptr(unsafe.Pointer(result)))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc OROpenKey(handle ORHKey, subKey string, result *ORHKey) (win32err error) {\n\tvar _p0 *uint16\n\t_p0, win32err = syscall.UTF16PtrFromString(subKey)\n\tif win32err != nil {\n\t\treturn\n\t}\n\treturn _OROpenKey(handle, _p0, result)\n}\n\nfunc _OROpenKey(handle ORHKey, subKey *uint16, result *ORHKey) (win32err error) {\n\tr0, _, _ := syscall.SyscallN(procOROpenKey.Addr(), uintptr(handle), uintptr(unsafe.Pointer(subKey)), uintptr(unsafe.Pointer(result)))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc ORSaveHive(handle ORHKey, hivePath string, osMajorVersion uint32, osMinorVersion uint32) (win32err error) {\n\tvar _p0 *uint16\n\t_p0, win32err = syscall.UTF16PtrFromString(hivePath)\n\tif win32err != nil {\n\t\treturn\n\t}\n\treturn _ORSaveHive(handle, _p0, osMajorVersion, osMinorVersion)\n}\n\nfunc _ORSaveHive(handle ORHKey, hivePath *uint16, osMajorVersion uint32, osMinorVersion uint32) (win32err error) {\n\tr0, _, _ := syscall.SyscallN(procORSaveHive.Addr(), uintptr(handle), uintptr(unsafe.Pointer(hivePath)), uintptr(osMajorVersion), uintptr(osMinorVersion))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc ORSetValue(handle ORHKey, valueName string, valueType uint32, data *byte, dataLen uint32) (win32err error) {\n\tvar _p0 *uint16\n\t_p0, win32err = syscall.UTF16PtrFromString(valueName)\n\tif win32err != nil {\n\t\treturn\n\t}\n\treturn _ORSetValue(handle, _p0, valueType, data, dataLen)\n}\n\nfunc _ORSetValue(handle ORHKey, valueName *uint16, valueType uint32, data *byte, dataLen uint32) (win32err error) {\n\tr0, _, _ := syscall.SyscallN(procORSetValue.Addr(), uintptr(handle), uintptr(unsafe.Pointer(valueName)), uintptr(valueType), uintptr(unsafe.Pointer(data)), uintptr(dataLen))\n\tif r0 != 0 {\n\t\twin32err = syscall.Errno(r0)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/layer.go",
    "content": "//go:build windows\n\npackage hcsshim\n\nimport (\n\t\"context\"\n\t\"crypto/sha1\"\n\t\"path/filepath\"\n\n\t\"github.com/Microsoft/go-winio/pkg/guid\"\n\t\"github.com/Microsoft/hcsshim/internal/wclayer\"\n)\n\nfunc layerPath(info *DriverInfo, id string) string {\n\treturn filepath.Join(info.HomeDir, id)\n}\n\nfunc ActivateLayer(info DriverInfo, id string) error {\n\treturn wclayer.ActivateLayer(context.Background(), layerPath(&info, id))\n}\nfunc CreateLayer(info DriverInfo, id, parent string) error {\n\treturn wclayer.CreateLayer(context.Background(), layerPath(&info, id), parent)\n}\n\n// New clients should use CreateScratchLayer instead. Kept in to preserve API compatibility.\nfunc CreateSandboxLayer(info DriverInfo, layerId, parentId string, parentLayerPaths []string) error {\n\treturn wclayer.CreateScratchLayer(context.Background(), layerPath(&info, layerId), parentLayerPaths)\n}\nfunc CreateScratchLayer(info DriverInfo, layerId, parentId string, parentLayerPaths []string) error {\n\treturn wclayer.CreateScratchLayer(context.Background(), layerPath(&info, layerId), parentLayerPaths)\n}\nfunc DeactivateLayer(info DriverInfo, id string) error {\n\treturn wclayer.DeactivateLayer(context.Background(), layerPath(&info, id))\n}\n\nfunc DestroyLayer(info DriverInfo, id string) error {\n\treturn wclayer.DestroyLayer(context.Background(), layerPath(&info, id))\n}\n\n// New clients should use ExpandScratchSize instead. Kept in to preserve API compatibility.\nfunc ExpandSandboxSize(info DriverInfo, layerId string, size uint64) error {\n\treturn wclayer.ExpandScratchSize(context.Background(), layerPath(&info, layerId), size)\n}\nfunc ExpandScratchSize(info DriverInfo, layerId string, size uint64) error {\n\treturn wclayer.ExpandScratchSize(context.Background(), layerPath(&info, layerId), size)\n}\nfunc ExportLayer(info DriverInfo, layerId string, exportFolderPath string, parentLayerPaths []string) error {\n\treturn wclayer.ExportLayer(context.Background(), layerPath(&info, layerId), exportFolderPath, parentLayerPaths)\n}\nfunc GetLayerMountPath(info DriverInfo, id string) (string, error) {\n\treturn wclayer.GetLayerMountPath(context.Background(), layerPath(&info, id))\n}\nfunc GetSharedBaseImages() (imageData string, err error) {\n\treturn wclayer.GetSharedBaseImages(context.Background())\n}\nfunc ImportLayer(info DriverInfo, layerID string, importFolderPath string, parentLayerPaths []string) error {\n\treturn wclayer.ImportLayer(context.Background(), layerPath(&info, layerID), importFolderPath, parentLayerPaths)\n}\nfunc LayerExists(info DriverInfo, id string) (bool, error) {\n\treturn wclayer.LayerExists(context.Background(), layerPath(&info, id))\n}\nfunc PrepareLayer(info DriverInfo, layerId string, parentLayerPaths []string) error {\n\treturn wclayer.PrepareLayer(context.Background(), layerPath(&info, layerId), parentLayerPaths)\n}\nfunc ProcessBaseLayer(path string) error {\n\treturn wclayer.ProcessBaseLayer(context.Background(), path)\n}\nfunc ProcessUtilityVMImage(path string) error {\n\treturn wclayer.ProcessUtilityVMImage(context.Background(), path)\n}\nfunc UnprepareLayer(info DriverInfo, layerId string) error {\n\treturn wclayer.UnprepareLayer(context.Background(), layerPath(&info, layerId))\n}\nfunc ConvertToBaseLayer(path string) error {\n\treturn wclayer.ConvertToBaseLayer(context.Background(), path)\n}\n\ntype DriverInfo struct {\n\tFlavour int\n\tHomeDir string\n}\n\ntype GUID [16]byte\n\nfunc NameToGuid(name string) (id GUID, err error) {\n\tg, err := wclayer.NameToGuid(context.Background(), name)\n\treturn g.ToWindowsArray(), err\n}\n\nfunc NewGUID(source string) *GUID {\n\th := sha1.Sum([]byte(source))\n\tvar g GUID\n\tcopy(g[0:], h[0:16])\n\treturn &g\n}\n\nfunc (g *GUID) ToString() string {\n\treturn guid.FromWindowsArray(*g).String()\n}\n\ntype LayerReader = wclayer.LayerReader\n\nfunc NewLayerReader(info DriverInfo, layerID string, parentLayerPaths []string) (LayerReader, error) {\n\treturn wclayer.NewLayerReader(context.Background(), layerPath(&info, layerID), parentLayerPaths)\n}\n\ntype LayerWriter = wclayer.LayerWriter\n\nfunc NewLayerWriter(info DriverInfo, layerID string, parentLayerPaths []string) (LayerWriter, error) {\n\treturn wclayer.NewLayerWriter(context.Background(), layerPath(&info, layerID), parentLayerPaths)\n}\n\ntype WC_LAYER_DESCRIPTOR = wclayer.WC_LAYER_DESCRIPTOR\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/osversion/osversion_windows.go",
    "content": "package osversion\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\t\"golang.org/x/sys/windows\"\n\t\"golang.org/x/sys/windows/registry\"\n)\n\n// OSVersion is a wrapper for Windows version information\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx\ntype OSVersion struct {\n\tVersion      uint32\n\tMajorVersion uint8\n\tMinorVersion uint8\n\tBuild        uint16\n}\n\nvar (\n\tosv  OSVersion\n\tonce sync.Once\n)\n\n// Get gets the operating system version on Windows.\n// The calling application must be manifested to get the correct version information.\nfunc Get() OSVersion {\n\tonce.Do(func() {\n\t\tv := *windows.RtlGetVersion()\n\t\tosv = OSVersion{}\n\t\tosv.MajorVersion = uint8(v.MajorVersion)\n\t\tosv.MinorVersion = uint8(v.MinorVersion)\n\t\tosv.Build = uint16(v.BuildNumber)\n\t\t// Fill version value so that existing clients don't break\n\t\tosv.Version = v.BuildNumber << 16\n\t\tosv.Version = osv.Version | (uint32(v.MinorVersion) << 8)\n\t\tosv.Version = osv.Version | v.MajorVersion\n\t})\n\treturn osv\n}\n\n// Build gets the build-number on Windows\n// The calling application must be manifested to get the correct version information.\nfunc Build() uint16 {\n\treturn Get().Build\n}\n\n// String returns the OSVersion formatted as a string. It implements the\n// [fmt.Stringer] interface.\nfunc (osv OSVersion) String() string {\n\treturn fmt.Sprintf(\"%d.%d.%d\", osv.MajorVersion, osv.MinorVersion, osv.Build)\n}\n\n// ToString returns the OSVersion formatted as a string.\n//\n// Deprecated: use [OSVersion.String].\nfunc (osv OSVersion) ToString() string {\n\treturn osv.String()\n}\n\n// Running `cmd /c ver` shows something like \"10.0.20348.1000\". The last component (\"1000\") is the revision\n// number\nfunc BuildRevision() (uint32, error) {\n\tk, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion`, registry.QUERY_VALUE)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"open `CurrentVersion` registry key: %w\", err)\n\t}\n\tdefer k.Close()\n\ts, _, err := k.GetIntegerValue(\"UBR\")\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"read `UBR` from registry: %w\", err)\n\t}\n\treturn uint32(s), nil\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/osversion/platform_compat_windows.go",
    "content": "package osversion\n\n// List of stable ABI compliant ltsc releases\n// Note: List must be sorted in ascending order\nvar compatLTSCReleases = []uint16{\n\tLTSC2022,\n\tLTSC2025,\n}\n\n// CheckHostAndContainerCompat checks if given host and container\n// OS versions are compatible.\n// It includes support for stable ABI compliant versions as well.\n// Every release after WS 2022 will support the previous ltsc\n// container image. Stable ABI is in preview mode for windows 11 client.\n// Refer: https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility?tabs=windows-server-2022%2Cwindows-10#windows-server-host-os-compatibility\nfunc CheckHostAndContainerCompat(host, ctr OSVersion) bool {\n\t// check major minor versions of host and guest\n\tif host.MajorVersion != ctr.MajorVersion ||\n\t\thost.MinorVersion != ctr.MinorVersion {\n\t\treturn false\n\t}\n\n\t// If host is < WS 2022, exact version match is required\n\tif host.Build < LTSC2022 {\n\t\treturn host.Build == ctr.Build\n\t}\n\n\t// Find the latest LTSC version that is earlier than the host version.\n\t// This is the earliest version of container that the host can run.\n\t//\n\t// If the host version is an LTSC, then it supports compatibility with\n\t// everything from the previous LTSC up to itself, so we want supportedLTSCRelease\n\t// to be the previous entry.\n\t//\n\t// If no match is found, then we know that the host is LTSC2022 exactly,\n\t// since we already checked that it's not less than LTSC2022.\n\tvar supportedLTSCRelease uint16 = LTSC2022\n\tfor i := len(compatLTSCReleases) - 1; i >= 0; i-- {\n\t\tif host.Build > compatLTSCReleases[i] {\n\t\t\tsupportedLTSCRelease = compatLTSCReleases[i]\n\t\t\tbreak\n\t\t}\n\t}\n\treturn supportedLTSCRelease <= ctr.Build && ctr.Build <= host.Build\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/osversion/windowsbuilds.go",
    "content": "package osversion\n\n// Windows Client and Server build numbers.\n//\n// See:\n// https://learn.microsoft.com/en-us/windows/release-health/release-information\n// https://learn.microsoft.com/en-us/windows/release-health/windows-server-release-info\n// https://learn.microsoft.com/en-us/windows/release-health/windows11-release-information\nconst (\n\t// RS1 (version 1607, codename \"Redstone 1\") corresponds to Windows Server\n\t// 2016 (ltsc2016) and Windows 10 (Anniversary Update).\n\tRS1 = 14393\n\t// V1607 (version 1607, codename \"Redstone 1\") is an alias for [RS1].\n\tV1607 = RS1\n\t// LTSC2016 (Windows Server 2016) is an alias for [RS1].\n\tLTSC2016 = RS1\n\n\t// RS2 (version 1703, codename \"Redstone 2\") was a client-only update, and\n\t// corresponds to Windows 10 (Creators Update).\n\tRS2 = 15063\n\t// V1703 (version 1703, codename \"Redstone 2\") is an alias for [RS2].\n\tV1703 = RS2\n\n\t// RS3 (version 1709, codename \"Redstone 3\") corresponds to Windows Server\n\t// 1709 (Semi-Annual Channel (SAC)), and Windows 10 (Fall Creators Update).\n\tRS3 = 16299\n\t// V1709 (version 1709, codename \"Redstone 3\") is an alias for [RS3].\n\tV1709 = RS3\n\n\t// RS4 (version 1803, codename \"Redstone 4\") corresponds to Windows Server\n\t// 1803 (Semi-Annual Channel (SAC)), and Windows 10 (April 2018 Update).\n\tRS4 = 17134\n\t// V1803 (version 1803, codename \"Redstone 4\") is an alias for [RS4].\n\tV1803 = RS4\n\n\t// RS5 (version 1809, codename \"Redstone 5\") corresponds to Windows Server\n\t// 2019 (ltsc2019), and Windows 10 (October 2018 Update).\n\tRS5 = 17763\n\t// V1809 (version 1809, codename \"Redstone 5\") is an alias for [RS5].\n\tV1809 = RS5\n\t// LTSC2019 (Windows Server 2019) is an alias for [RS5].\n\tLTSC2019 = RS5\n\n\t// V19H1 (version 1903, codename 19H1) corresponds to Windows Server 1903 (semi-annual\n\t// channel).\n\tV19H1 = 18362\n\t// V1903 (version 1903) is an alias for [V19H1].\n\tV1903 = V19H1\n\n\t// V19H2 (version 1909, codename 19H2) corresponds to Windows Server 1909 (semi-annual\n\t// channel).\n\tV19H2 = 18363\n\t// V1909 (version 1909) is an alias for [V19H2].\n\tV1909 = V19H2\n\n\t// V20H1 (version 2004, codename 20H1) corresponds to Windows Server 2004 (semi-annual\n\t// channel).\n\tV20H1 = 19041\n\t// V2004 (version 2004) is an alias for [V20H1].\n\tV2004 = V20H1\n\n\t// V20H2 corresponds to Windows Server 20H2 (semi-annual channel).\n\tV20H2 = 19042\n\n\t// V21H1 corresponds to Windows Server 21H1 (semi-annual channel).\n\tV21H1 = 19043\n\n\t// V21H2Win10 corresponds to Windows 10 (November 2021 Update).\n\tV21H2Win10 = 19044\n\n\t// V21H2Server corresponds to Windows Server 2022 (ltsc2022).\n\tV21H2Server = 20348\n\t// LTSC2022 (Windows Server 2022) is an alias for [V21H2Server]\n\tLTSC2022 = V21H2Server\n\n\t// V21H2Win11 corresponds to Windows 11 (original release).\n\tV21H2Win11 = 22000\n\n\t// V22H2Win10 corresponds to Windows 10 (2022 Update).\n\tV22H2Win10 = 19045\n\n\t// V22H2Win11 corresponds to Windows 11 (2022 Update).\n\tV22H2Win11 = 22621\n\n\t// V23H2 is the 23H2 release in the Windows Server annual channel.\n\tV23H2 = 25398\n\n\t// Windows Server 2025 build 26100\n\tV25H1Server = 26100\n\tLTSC2025    = V25H1Server\n)\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/pkg/ociwclayer/doc.go",
    "content": "// Package ociwclayer provides functions for importing and exporting Windows\n// container layers from and to their OCI tar representation.\npackage ociwclayer\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/pkg/ociwclayer/export.go",
    "content": "//go:build windows\n\npackage ociwclayer\n\nimport (\n\t\"archive/tar\"\n\t\"context\"\n\t\"errors\"\n\t\"io\"\n\t\"path/filepath\"\n\n\t\"github.com/Microsoft/go-winio/backuptar\"\n\t\"github.com/Microsoft/hcsshim/internal/wclayer\"\n)\n\n// ExportLayerToTar writes an OCI layer tar stream from the provided on-disk layer.\n// The caller must specify the parent layers, if any, ordered from lowest to\n// highest layer.\n//\n// The layer will be mounted for this process, so the caller should ensure that\n// it is not currently mounted.\nfunc ExportLayerToTar(ctx context.Context, w io.Writer, path string, parentLayerPaths []string) error {\n\terr := wclayer.ActivateLayer(ctx, path)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer func() {\n\t\t_ = wclayer.DeactivateLayer(ctx, path)\n\t}()\n\n\t// Prepare and unprepare the layer to ensure that it has been initialized.\n\terr = wclayer.PrepareLayer(ctx, path, parentLayerPaths)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = wclayer.UnprepareLayer(ctx, path)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tr, err := wclayer.NewLayerReader(ctx, path, parentLayerPaths)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = writeTarFromLayer(ctx, r, w)\n\tcerr := r.Close()\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn cerr\n}\n\nfunc writeTarFromLayer(ctx context.Context, r wclayer.LayerReader, w io.Writer) error {\n\tlinkRecords := make(map[[16]byte]string)\n\n\tt := tar.NewWriter(w)\n\tfor {\n\t\tselect {\n\t\tcase <-ctx.Done():\n\t\t\treturn ctx.Err()\n\t\tdefault:\n\t\t}\n\n\t\tname, size, fileInfo, err := r.Next()\n\t\tif errors.Is(err, io.EOF) {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif fileInfo == nil {\n\t\t\t// Write a whiteout file.\n\t\t\thdr := &tar.Header{\n\t\t\t\tName: filepath.ToSlash(filepath.Join(filepath.Dir(name), WhiteoutPrefix+filepath.Base(name))),\n\t\t\t}\n\t\t\terr := t.WriteHeader(hdr)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\tnumberOfLinks, fileIDInfo, err := r.LinkInfo()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif numberOfLinks > 1 {\n\t\t\t\tif linkName, ok := linkRecords[fileIDInfo.FileID]; ok {\n\t\t\t\t\t// We've seen this file before, by another name, so put a hardlink in the tar stream.\n\t\t\t\t\thdr := backuptar.BasicInfoHeader(name, 0, fileInfo)\n\t\t\t\t\thdr.Mode = 0644\n\t\t\t\t\thdr.Typeflag = tar.TypeLink\n\t\t\t\t\thdr.Linkname = linkName\n\t\t\t\t\tif err := t.WriteHeader(hdr); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\t// All subsequent names for this file will be hard-linked to this name\n\t\t\t\tlinkRecords[fileIDInfo.FileID] = filepath.ToSlash(name)\n\t\t\t}\n\n\t\t\terr = backuptar.WriteTarFileFromBackupStream(t, r, name, size, fileInfo)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn t.Close()\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/pkg/ociwclayer/import.go",
    "content": "//go:build windows\n\npackage ociwclayer\n\nimport (\n\t\"archive/tar\"\n\t\"bufio\"\n\t\"context\"\n\t\"errors\"\n\t\"io\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\twinio \"github.com/Microsoft/go-winio\"\n\t\"github.com/Microsoft/go-winio/backuptar\"\n\t\"github.com/Microsoft/hcsshim/internal/wclayer\"\n)\n\nconst WhiteoutPrefix = \".wh.\"\n\nvar (\n\t// mutatedFiles is a list of files that are mutated by the import process\n\t// and must be backed up and restored.\n\tmutatedFiles = map[string]string{\n\t\t\"UtilityVM/Files/EFI/Microsoft/Boot/BCD\":      \"bcd.bak\",\n\t\t\"UtilityVM/Files/EFI/Microsoft/Boot/BCD.LOG\":  \"bcd.log.bak\",\n\t\t\"UtilityVM/Files/EFI/Microsoft/Boot/BCD.LOG1\": \"bcd.log1.bak\",\n\t\t\"UtilityVM/Files/EFI/Microsoft/Boot/BCD.LOG2\": \"bcd.log2.bak\",\n\t}\n)\n\n// ImportLayerFromTar  reads a layer from an OCI layer tar stream and extracts it to the\n// specified path. The caller must specify the parent layers, if any, ordered\n// from lowest to highest layer.\n//\n// The caller must ensure that the thread or process has acquired backup and\n// restore privileges.\n//\n// This function returns the total size of the layer's files, in bytes.\nfunc ImportLayerFromTar(ctx context.Context, r io.Reader, path string, parentLayerPaths []string) (int64, error) {\n\terr := os.MkdirAll(path, 0)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tw, err := wclayer.NewLayerWriter(ctx, path, parentLayerPaths)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tn, err := writeLayerFromTar(ctx, r, w, path)\n\tcerr := w.Close()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif cerr != nil {\n\t\treturn 0, cerr\n\t}\n\treturn n, nil\n}\n\nfunc writeLayerFromTar(ctx context.Context, r io.Reader, w wclayer.LayerWriter, root string) (int64, error) {\n\tt := tar.NewReader(r)\n\t// CodeQL [SM03409] `internal\\wclayer` uses `internal/safefile` to bind tar extraction to the layer's root directory\n\thdr, err := t.Next()\n\ttotalSize := int64(0)\n\tbuf := bufio.NewWriter(nil)\n\tfor err == nil {\n\t\tselect {\n\t\tcase <-ctx.Done():\n\t\t\treturn 0, ctx.Err()\n\t\tdefault:\n\t\t}\n\n\t\tbase := path.Base(hdr.Name)\n\t\tif strings.HasPrefix(base, WhiteoutPrefix) {\n\t\t\tname := path.Join(path.Dir(hdr.Name), base[len(WhiteoutPrefix):])\n\t\t\terr = w.Remove(filepath.FromSlash(name))\n\t\t\tif err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\t\t\t// CodeQL [SM03409] `internal\\wclayer` uses `internal/safefile` to bind tar extraction to the layer's root directory\n\t\t\thdr, err = t.Next()\n\t\t} else if hdr.Typeflag == tar.TypeLink {\n\t\t\terr = w.AddLink(filepath.FromSlash(hdr.Name), filepath.FromSlash(hdr.Linkname))\n\t\t\tif err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\t\t\t// CodeQL [SM03409] `internal\\wclayer` uses `internal/safefile` to bind tar extraction to the layer's root directory\n\t\t\thdr, err = t.Next()\n\t\t} else {\n\t\t\tvar (\n\t\t\t\tname     string\n\t\t\t\tsize     int64\n\t\t\t\tfileInfo *winio.FileBasicInfo\n\t\t\t)\n\t\t\tname, size, fileInfo, err = backuptar.FileInfoFromHeader(hdr)\n\t\t\tif err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\t\t\terr = w.Add(filepath.FromSlash(name), fileInfo)\n\t\t\tif err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\t\t\thdr, err = writeBackupStreamFromTarAndSaveMutatedFiles(buf, w, t, hdr, root)\n\t\t\ttotalSize += size\n\t\t}\n\t}\n\tif !errors.Is(err, io.EOF) {\n\t\treturn 0, err\n\t}\n\treturn totalSize, nil\n}\n\n// writeBackupStreamFromTarAndSaveMutatedFiles reads data from a tar stream and\n// writes it to a backup stream, and also saves any files that will be mutated\n// by the import layer process to a backup location.\nfunc writeBackupStreamFromTarAndSaveMutatedFiles(buf *bufio.Writer, w io.Writer, t *tar.Reader, hdr *tar.Header, root string) (nextHdr *tar.Header, err error) {\n\tvar bcdBackup *os.File\n\tvar bcdBackupWriter *winio.BackupFileWriter\n\tif backupPath, ok := mutatedFiles[hdr.Name]; ok {\n\t\tbcdBackup, err = os.Create(filepath.Join(root, backupPath))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tdefer func() {\n\t\t\tcerr := bcdBackup.Close()\n\t\t\tif err == nil {\n\t\t\t\terr = cerr\n\t\t\t}\n\t\t}()\n\n\t\tbcdBackupWriter = winio.NewBackupFileWriter(bcdBackup, false)\n\t\tdefer func() {\n\t\t\tcerr := bcdBackupWriter.Close()\n\t\t\tif err == nil {\n\t\t\t\terr = cerr\n\t\t\t}\n\t\t}()\n\n\t\tbuf.Reset(io.MultiWriter(w, bcdBackupWriter))\n\t} else {\n\t\tbuf.Reset(w)\n\t}\n\n\tdefer func() {\n\t\tferr := buf.Flush()\n\t\tif err == nil {\n\t\t\terr = ferr\n\t\t}\n\t}()\n\n\treturn backuptar.WriteBackupStreamFromTarFile(buf, t, hdr)\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/process.go",
    "content": "//go:build windows\n\npackage hcsshim\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/Microsoft/hcsshim/internal/hcs\"\n)\n\n// ContainerError is an error encountered in HCS\ntype process struct {\n\tp        *hcs.Process\n\twaitOnce sync.Once\n\twaitCh   chan struct{}\n\twaitErr  error\n}\n\n// Pid returns the process ID of the process within the container.\nfunc (process *process) Pid() int {\n\treturn process.p.Pid()\n}\n\n// Kill signals the process to terminate but does not wait for it to finish terminating.\nfunc (process *process) Kill() error {\n\tfound, err := process.p.Kill(context.Background())\n\tif err != nil {\n\t\treturn convertProcessError(err, process)\n\t}\n\tif !found {\n\t\treturn &ProcessError{Process: process, Err: ErrElementNotFound, Operation: \"hcsshim::Process::Kill\"}\n\t}\n\treturn nil\n}\n\n// Wait waits for the process to exit.\nfunc (process *process) Wait() error {\n\treturn convertProcessError(process.p.Wait(), process)\n}\n\n// WaitTimeout waits for the process to exit or the duration to elapse. It returns\n// false if timeout occurs.\nfunc (process *process) WaitTimeout(timeout time.Duration) error {\n\tprocess.waitOnce.Do(func() {\n\t\tprocess.waitCh = make(chan struct{})\n\t\tgo func() {\n\t\t\tprocess.waitErr = process.Wait()\n\t\t\tclose(process.waitCh)\n\t\t}()\n\t})\n\tt := time.NewTimer(timeout)\n\tdefer t.Stop()\n\tselect {\n\tcase <-t.C:\n\t\treturn &ProcessError{Process: process, Err: ErrTimeout, Operation: \"hcsshim::Process::Wait\"}\n\tcase <-process.waitCh:\n\t\treturn process.waitErr\n\t}\n}\n\n// ExitCode returns the exit code of the process. The process must have\n// already terminated.\nfunc (process *process) ExitCode() (int, error) {\n\tcode, err := process.p.ExitCode()\n\tif err != nil {\n\t\terr = convertProcessError(err, process)\n\t}\n\treturn code, err\n}\n\n// ResizeConsole resizes the console of the process.\nfunc (process *process) ResizeConsole(width, height uint16) error {\n\treturn convertProcessError(process.p.ResizeConsole(context.Background(), width, height), process)\n}\n\n// Stdio returns the stdin, stdout, and stderr pipes, respectively. Closing\n// these pipes does not close the underlying pipes; it should be possible to\n// call this multiple times to get multiple interfaces.\nfunc (process *process) Stdio() (io.WriteCloser, io.ReadCloser, io.ReadCloser, error) {\n\tstdin, stdout, stderr, err := process.p.StdioLegacy()\n\tif err != nil {\n\t\terr = convertProcessError(err, process)\n\t}\n\treturn stdin, stdout, stderr, err\n}\n\n// CloseStdin closes the write side of the stdin pipe so that the process is\n// notified on the read side that there is no more data in stdin.\nfunc (process *process) CloseStdin() error {\n\treturn convertProcessError(process.p.CloseStdin(context.Background()), process)\n}\n\n// Close cleans up any state associated with the process but does not kill\n// or wait on it.\nfunc (process *process) Close() error {\n\treturn convertProcessError(process.p.Close(), process)\n}\n"
  },
  {
    "path": "vendor/github.com/Microsoft/hcsshim/zsyscall_windows.go",
    "content": "//go:build windows\n\n// Code generated by 'go generate' using \"github.com/Microsoft/go-winio/tools/mkwinsyscall\"; DO NOT EDIT.\n\npackage hcsshim\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/windows\"\n)\n\nvar _ unsafe.Pointer\n\n// Do the interface allocations only once for common\n// Errno values.\nconst (\n\terrnoERROR_IO_PENDING = 997\n)\n\nvar (\n\terrERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)\n\terrERROR_EINVAL     error = syscall.EINVAL\n)\n\n// errnoErr returns common boxed Errno values, to prevent\n// allocations at runtime.\nfunc errnoErr(e syscall.Errno) error {\n\tswitch e {\n\tcase 0:\n\t\treturn errERROR_EINVAL\n\tcase errnoERROR_IO_PENDING:\n\t\treturn errERROR_IO_PENDING\n\t}\n\treturn e\n}\n\nvar (\n\tmodiphlpapi = windows.NewLazySystemDLL(\"iphlpapi.dll\")\n\n\tprocSetCurrentThreadCompartmentId = modiphlpapi.NewProc(\"SetCurrentThreadCompartmentId\")\n)\n\nfunc SetCurrentThreadCompartmentId(compartmentId uint32) (hr error) {\n\tr0, _, _ := syscall.SyscallN(procSetCurrentThreadCompartmentId.Addr(), uintptr(compartmentId))\n\tif int32(r0) < 0 {\n\t\tif r0&0x1fff0000 == 0x00070000 {\n\t\t\tr0 &= 0xffff\n\t\t}\n\t\thr = syscall.Errno(r0)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/AUTHORS",
    "content": "# This source code refers to The Go Authors for copyright purposes.\n# The master list of authors is in the main Go distribution,\n# visible at https://tip.golang.org/AUTHORS.\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/CONTRIBUTORS",
    "content": "# This source code was written by the Go contributors.\n# The master list of contributors is in the main Go distribution,\n# visible at https://tip.golang.org/CONTRIBUTORS.\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/LICENSE",
    "content": "Copyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/PATENTS",
    "content": "Additional IP Rights Grant (Patents)\n\n\"This implementation\" means the copyrightable works distributed by\nGoogle as part of the Go project.\n\nGoogle hereby grants to You a perpetual, worldwide, non-exclusive,\nno-charge, royalty-free, irrevocable (except as stated in this section)\npatent license to make, have made, use, offer to sell, sell, import,\ntransfer and otherwise run, modify and propagate the contents of this\nimplementation of Go, where such license applies only to those patent\nclaims, both currently owned or controlled by Google and acquired in\nthe future, licensable by Google that are necessarily infringed by this\nimplementation of Go.  This grant does not include claims that would be\ninfringed only as a consequence of further modification of this\nimplementation.  If you or your agent or exclusive licensee institute or\norder or agree to the institution of patent litigation against any\nentity (including a cross-claim or counterclaim in a lawsuit) alleging\nthat this implementation of Go or any code incorporated within this\nimplementation of Go constitutes direct or contributory patent\ninfringement, or inducement of patent infringement, then any patent\nrights granted to you under this License for this implementation of Go\nshall terminate as of the date such litigation is filed.\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/bitcurves/bitcurve.go",
    "content": "package bitcurves\n\n// Copyright 2010 The Go Authors. All rights reserved.\n// Copyright 2011 ThePiachu. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package bitelliptic implements several Koblitz elliptic curves over prime\n// fields.\n\n// This package operates, internally, on Jacobian coordinates. For a given\n// (x, y) position on the curve, the Jacobian coordinates are (x1, y1, z1)\n// where x = x1/z1² and y = y1/z1³. The greatest speedups come when the whole\n// calculation can be performed within the transform (as in ScalarMult and\n// ScalarBaseMult). But even for Add and Double, it's faster to apply and\n// reverse the transform than to operate in affine coordinates.\n\nimport (\n\t\"crypto/elliptic\"\n\t\"io\"\n\t\"math/big\"\n\t\"sync\"\n)\n\n// A BitCurve represents a Koblitz Curve with a=0.\n// See http://www.hyperelliptic.org/EFD/g1p/auto-shortw.html\ntype BitCurve struct {\n\tName    string\n\tP       *big.Int // the order of the underlying field\n\tN       *big.Int // the order of the base point\n\tB       *big.Int // the constant of the BitCurve equation\n\tGx, Gy  *big.Int // (x,y) of the base point\n\tBitSize int      // the size of the underlying field\n}\n\n// Params returns the parameters of the given BitCurve (see BitCurve struct)\nfunc (bitCurve *BitCurve) Params() (cp *elliptic.CurveParams) {\n\tcp = new(elliptic.CurveParams)\n\tcp.Name = bitCurve.Name\n\tcp.P = bitCurve.P\n\tcp.N = bitCurve.N\n\tcp.Gx = bitCurve.Gx\n\tcp.Gy = bitCurve.Gy\n\tcp.BitSize = bitCurve.BitSize\n\treturn cp\n}\n\n// IsOnCurve returns true if the given (x,y) lies on the BitCurve.\nfunc (bitCurve *BitCurve) IsOnCurve(x, y *big.Int) bool {\n\t// y² = x³ + b\n\ty2 := new(big.Int).Mul(y, y) //y²\n\ty2.Mod(y2, bitCurve.P)       //y²%P\n\n\tx3 := new(big.Int).Mul(x, x) //x²\n\tx3.Mul(x3, x)                //x³\n\n\tx3.Add(x3, bitCurve.B) //x³+B\n\tx3.Mod(x3, bitCurve.P) //(x³+B)%P\n\n\treturn x3.Cmp(y2) == 0\n}\n\n// affineFromJacobian reverses the Jacobian transform. See the comment at the\n// top of the file.\nfunc (bitCurve *BitCurve) affineFromJacobian(x, y, z *big.Int) (xOut, yOut *big.Int) {\n\tif z.Cmp(big.NewInt(0)) == 0 {\n\t\tpanic(\"bitcurve: Can't convert to affine with Jacobian Z = 0\")\n\t}\n\t// x = YZ^2 mod P\n\tzinv := new(big.Int).ModInverse(z, bitCurve.P)\n\tzinvsq := new(big.Int).Mul(zinv, zinv)\n\n\txOut = new(big.Int).Mul(x, zinvsq)\n\txOut.Mod(xOut, bitCurve.P)\n\t// y = YZ^3 mod P\n\tzinvsq.Mul(zinvsq, zinv)\n\tyOut = new(big.Int).Mul(y, zinvsq)\n\tyOut.Mod(yOut, bitCurve.P)\n\treturn xOut, yOut\n}\n\n// Add returns the sum of (x1,y1) and (x2,y2)\nfunc (bitCurve *BitCurve) Add(x1, y1, x2, y2 *big.Int) (*big.Int, *big.Int) {\n\tz := new(big.Int).SetInt64(1)\n\tx, y, z := bitCurve.addJacobian(x1, y1, z, x2, y2, z)\n\treturn bitCurve.affineFromJacobian(x, y, z)\n}\n\n// addJacobian takes two points in Jacobian coordinates, (x1, y1, z1) and\n// (x2, y2, z2) and returns their sum, also in Jacobian form.\nfunc (bitCurve *BitCurve) addJacobian(x1, y1, z1, x2, y2, z2 *big.Int) (*big.Int, *big.Int, *big.Int) {\n\t// See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-add-2007-bl\n\tz1z1 := new(big.Int).Mul(z1, z1)\n\tz1z1.Mod(z1z1, bitCurve.P)\n\tz2z2 := new(big.Int).Mul(z2, z2)\n\tz2z2.Mod(z2z2, bitCurve.P)\n\n\tu1 := new(big.Int).Mul(x1, z2z2)\n\tu1.Mod(u1, bitCurve.P)\n\tu2 := new(big.Int).Mul(x2, z1z1)\n\tu2.Mod(u2, bitCurve.P)\n\th := new(big.Int).Sub(u2, u1)\n\tif h.Sign() == -1 {\n\t\th.Add(h, bitCurve.P)\n\t}\n\ti := new(big.Int).Lsh(h, 1)\n\ti.Mul(i, i)\n\tj := new(big.Int).Mul(h, i)\n\n\ts1 := new(big.Int).Mul(y1, z2)\n\ts1.Mul(s1, z2z2)\n\ts1.Mod(s1, bitCurve.P)\n\ts2 := new(big.Int).Mul(y2, z1)\n\ts2.Mul(s2, z1z1)\n\ts2.Mod(s2, bitCurve.P)\n\tr := new(big.Int).Sub(s2, s1)\n\tif r.Sign() == -1 {\n\t\tr.Add(r, bitCurve.P)\n\t}\n\tr.Lsh(r, 1)\n\tv := new(big.Int).Mul(u1, i)\n\n\tx3 := new(big.Int).Set(r)\n\tx3.Mul(x3, x3)\n\tx3.Sub(x3, j)\n\tx3.Sub(x3, v)\n\tx3.Sub(x3, v)\n\tx3.Mod(x3, bitCurve.P)\n\n\ty3 := new(big.Int).Set(r)\n\tv.Sub(v, x3)\n\ty3.Mul(y3, v)\n\ts1.Mul(s1, j)\n\ts1.Lsh(s1, 1)\n\ty3.Sub(y3, s1)\n\ty3.Mod(y3, bitCurve.P)\n\n\tz3 := new(big.Int).Add(z1, z2)\n\tz3.Mul(z3, z3)\n\tz3.Sub(z3, z1z1)\n\tif z3.Sign() == -1 {\n\t\tz3.Add(z3, bitCurve.P)\n\t}\n\tz3.Sub(z3, z2z2)\n\tif z3.Sign() == -1 {\n\t\tz3.Add(z3, bitCurve.P)\n\t}\n\tz3.Mul(z3, h)\n\tz3.Mod(z3, bitCurve.P)\n\n\treturn x3, y3, z3\n}\n\n// Double returns 2*(x,y)\nfunc (bitCurve *BitCurve) Double(x1, y1 *big.Int) (*big.Int, *big.Int) {\n\tz1 := new(big.Int).SetInt64(1)\n\treturn bitCurve.affineFromJacobian(bitCurve.doubleJacobian(x1, y1, z1))\n}\n\n// doubleJacobian takes a point in Jacobian coordinates, (x, y, z), and\n// returns its double, also in Jacobian form.\nfunc (bitCurve *BitCurve) doubleJacobian(x, y, z *big.Int) (*big.Int, *big.Int, *big.Int) {\n\t// See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l\n\n\ta := new(big.Int).Mul(x, x) //X1²\n\tb := new(big.Int).Mul(y, y) //Y1²\n\tc := new(big.Int).Mul(b, b) //B²\n\n\td := new(big.Int).Add(x, b) //X1+B\n\td.Mul(d, d)                 //(X1+B)²\n\td.Sub(d, a)                 //(X1+B)²-A\n\td.Sub(d, c)                 //(X1+B)²-A-C\n\td.Mul(d, big.NewInt(2))     //2*((X1+B)²-A-C)\n\n\te := new(big.Int).Mul(big.NewInt(3), a) //3*A\n\tf := new(big.Int).Mul(e, e)             //E²\n\n\tx3 := new(big.Int).Mul(big.NewInt(2), d) //2*D\n\tx3.Sub(f, x3)                            //F-2*D\n\tx3.Mod(x3, bitCurve.P)\n\n\ty3 := new(big.Int).Sub(d, x3)                  //D-X3\n\ty3.Mul(e, y3)                                  //E*(D-X3)\n\ty3.Sub(y3, new(big.Int).Mul(big.NewInt(8), c)) //E*(D-X3)-8*C\n\ty3.Mod(y3, bitCurve.P)\n\n\tz3 := new(big.Int).Mul(y, z) //Y1*Z1\n\tz3.Mul(big.NewInt(2), z3)    //3*Y1*Z1\n\tz3.Mod(z3, bitCurve.P)\n\n\treturn x3, y3, z3\n}\n\n// TODO: double check if it is okay\n// ScalarMult returns k*(Bx,By) where k is a number in big-endian form.\nfunc (bitCurve *BitCurve) ScalarMult(Bx, By *big.Int, k []byte) (*big.Int, *big.Int) {\n\t// We have a slight problem in that the identity of the group (the\n\t// point at infinity) cannot be represented in (x, y) form on a finite\n\t// machine. Thus the standard add/double algorithm has to be tweaked\n\t// slightly: our initial state is not the identity, but x, and we\n\t// ignore the first true bit in |k|.  If we don't find any true bits in\n\t// |k|, then we return nil, nil, because we cannot return the identity\n\t// element.\n\n\tBz := new(big.Int).SetInt64(1)\n\tx := Bx\n\ty := By\n\tz := Bz\n\n\tseenFirstTrue := false\n\tfor _, byte := range k {\n\t\tfor bitNum := 0; bitNum < 8; bitNum++ {\n\t\t\tif seenFirstTrue {\n\t\t\t\tx, y, z = bitCurve.doubleJacobian(x, y, z)\n\t\t\t}\n\t\t\tif byte&0x80 == 0x80 {\n\t\t\t\tif !seenFirstTrue {\n\t\t\t\t\tseenFirstTrue = true\n\t\t\t\t} else {\n\t\t\t\t\tx, y, z = bitCurve.addJacobian(Bx, By, Bz, x, y, z)\n\t\t\t\t}\n\t\t\t}\n\t\t\tbyte <<= 1\n\t\t}\n\t}\n\n\tif !seenFirstTrue {\n\t\treturn nil, nil\n\t}\n\n\treturn bitCurve.affineFromJacobian(x, y, z)\n}\n\n// ScalarBaseMult returns k*G, where G is the base point of the group and k is\n// an integer in big-endian form.\nfunc (bitCurve *BitCurve) ScalarBaseMult(k []byte) (*big.Int, *big.Int) {\n\treturn bitCurve.ScalarMult(bitCurve.Gx, bitCurve.Gy, k)\n}\n\nvar mask = []byte{0xff, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f}\n\n// TODO: double check if it is okay\n// GenerateKey returns a public/private key pair. The private key is generated\n// using the given reader, which must return random data.\nfunc (bitCurve *BitCurve) GenerateKey(rand io.Reader) (priv []byte, x, y *big.Int, err error) {\n\tbyteLen := (bitCurve.BitSize + 7) >> 3\n\tpriv = make([]byte, byteLen)\n\n\tfor x == nil {\n\t\t_, err = io.ReadFull(rand, priv)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\t// We have to mask off any excess bits in the case that the size of the\n\t\t// underlying field is not a whole number of bytes.\n\t\tpriv[0] &= mask[bitCurve.BitSize%8]\n\t\t// This is because, in tests, rand will return all zeros and we don't\n\t\t// want to get the point at infinity and loop forever.\n\t\tpriv[1] ^= 0x42\n\t\tx, y = bitCurve.ScalarBaseMult(priv)\n\t}\n\treturn\n}\n\n// Marshal converts a point into the form specified in section 4.3.6 of ANSI\n// X9.62.\nfunc (bitCurve *BitCurve) Marshal(x, y *big.Int) []byte {\n\tbyteLen := (bitCurve.BitSize + 7) >> 3\n\n\tret := make([]byte, 1+2*byteLen)\n\tret[0] = 4 // uncompressed point\n\n\txBytes := x.Bytes()\n\tcopy(ret[1+byteLen-len(xBytes):], xBytes)\n\tyBytes := y.Bytes()\n\tcopy(ret[1+2*byteLen-len(yBytes):], yBytes)\n\treturn ret\n}\n\n// Unmarshal converts a point, serialised by Marshal, into an x, y pair. On\n// error, x = nil.\nfunc (bitCurve *BitCurve) Unmarshal(data []byte) (x, y *big.Int) {\n\tbyteLen := (bitCurve.BitSize + 7) >> 3\n\tif len(data) != 1+2*byteLen {\n\t\treturn\n\t}\n\tif data[0] != 4 { // uncompressed form\n\t\treturn\n\t}\n\tx = new(big.Int).SetBytes(data[1 : 1+byteLen])\n\ty = new(big.Int).SetBytes(data[1+byteLen:])\n\treturn\n}\n\n//curve parameters taken from:\n//http://www.secg.org/collateral/sec2_final.pdf\n\nvar initonce sync.Once\nvar secp160k1 *BitCurve\nvar secp192k1 *BitCurve\nvar secp224k1 *BitCurve\nvar secp256k1 *BitCurve\n\nfunc initAll() {\n\tinitS160()\n\tinitS192()\n\tinitS224()\n\tinitS256()\n}\n\nfunc initS160() {\n\t// See SEC 2 section 2.4.1\n\tsecp160k1 = new(BitCurve)\n\tsecp160k1.Name = \"secp160k1\"\n\tsecp160k1.P, _ = new(big.Int).SetString(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73\", 16)\n\tsecp160k1.N, _ = new(big.Int).SetString(\"0100000000000000000001B8FA16DFAB9ACA16B6B3\", 16)\n\tsecp160k1.B, _ = new(big.Int).SetString(\"0000000000000000000000000000000000000007\", 16)\n\tsecp160k1.Gx, _ = new(big.Int).SetString(\"3B4C382CE37AA192A4019E763036F4F5DD4D7EBB\", 16)\n\tsecp160k1.Gy, _ = new(big.Int).SetString(\"938CF935318FDCED6BC28286531733C3F03C4FEE\", 16)\n\tsecp160k1.BitSize = 160\n}\n\nfunc initS192() {\n\t// See SEC 2 section 2.5.1\n\tsecp192k1 = new(BitCurve)\n\tsecp192k1.Name = \"secp192k1\"\n\tsecp192k1.P, _ = new(big.Int).SetString(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37\", 16)\n\tsecp192k1.N, _ = new(big.Int).SetString(\"FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D\", 16)\n\tsecp192k1.B, _ = new(big.Int).SetString(\"000000000000000000000000000000000000000000000003\", 16)\n\tsecp192k1.Gx, _ = new(big.Int).SetString(\"DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D\", 16)\n\tsecp192k1.Gy, _ = new(big.Int).SetString(\"9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D\", 16)\n\tsecp192k1.BitSize = 192\n}\n\nfunc initS224() {\n\t// See SEC 2 section 2.6.1\n\tsecp224k1 = new(BitCurve)\n\tsecp224k1.Name = \"secp224k1\"\n\tsecp224k1.P, _ = new(big.Int).SetString(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D\", 16)\n\tsecp224k1.N, _ = new(big.Int).SetString(\"010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7\", 16)\n\tsecp224k1.B, _ = new(big.Int).SetString(\"00000000000000000000000000000000000000000000000000000005\", 16)\n\tsecp224k1.Gx, _ = new(big.Int).SetString(\"A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C\", 16)\n\tsecp224k1.Gy, _ = new(big.Int).SetString(\"7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5\", 16)\n\tsecp224k1.BitSize = 224\n}\n\nfunc initS256() {\n\t// See SEC 2 section 2.7.1\n\tsecp256k1 = new(BitCurve)\n\tsecp256k1.Name = \"secp256k1\"\n\tsecp256k1.P, _ = new(big.Int).SetString(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F\", 16)\n\tsecp256k1.N, _ = new(big.Int).SetString(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141\", 16)\n\tsecp256k1.B, _ = new(big.Int).SetString(\"0000000000000000000000000000000000000000000000000000000000000007\", 16)\n\tsecp256k1.Gx, _ = new(big.Int).SetString(\"79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798\", 16)\n\tsecp256k1.Gy, _ = new(big.Int).SetString(\"483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8\", 16)\n\tsecp256k1.BitSize = 256\n}\n\n// S160 returns a BitCurve which implements secp160k1 (see SEC 2 section 2.4.1)\nfunc S160() *BitCurve {\n\tinitonce.Do(initAll)\n\treturn secp160k1\n}\n\n// S192 returns a BitCurve which implements secp192k1 (see SEC 2 section 2.5.1)\nfunc S192() *BitCurve {\n\tinitonce.Do(initAll)\n\treturn secp192k1\n}\n\n// S224 returns a BitCurve which implements secp224k1 (see SEC 2 section 2.6.1)\nfunc S224() *BitCurve {\n\tinitonce.Do(initAll)\n\treturn secp224k1\n}\n\n// S256 returns a BitCurve which implements bitcurves (see SEC 2 section 2.7.1)\nfunc S256() *BitCurve {\n\tinitonce.Do(initAll)\n\treturn secp256k1\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/brainpool/brainpool.go",
    "content": "// Package brainpool implements Brainpool elliptic curves.\n// Implementation of rcurves is from github.com/ebfe/brainpool\n// Note that these curves are implemented with naive, non-constant time operations\n// and are likely not suitable for environments where timing attacks are a concern.\npackage brainpool\n\nimport (\n\t\"crypto/elliptic\"\n\t\"math/big\"\n\t\"sync\"\n)\n\nvar (\n\tonce                   sync.Once\n\tp256t1, p384t1, p512t1 *elliptic.CurveParams\n\tp256r1, p384r1, p512r1 *rcurve\n)\n\nfunc initAll() {\n\tinitP256t1()\n\tinitP384t1()\n\tinitP512t1()\n\tinitP256r1()\n\tinitP384r1()\n\tinitP512r1()\n}\n\nfunc initP256t1() {\n\tp256t1 = &elliptic.CurveParams{Name: \"brainpoolP256t1\"}\n\tp256t1.P, _ = new(big.Int).SetString(\"A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377\", 16)\n\tp256t1.N, _ = new(big.Int).SetString(\"A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7\", 16)\n\tp256t1.B, _ = new(big.Int).SetString(\"662C61C430D84EA4FE66A7733D0B76B7BF93EBC4AF2F49256AE58101FEE92B04\", 16)\n\tp256t1.Gx, _ = new(big.Int).SetString(\"A3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F4\", 16)\n\tp256t1.Gy, _ = new(big.Int).SetString(\"2D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BE\", 16)\n\tp256t1.BitSize = 256\n}\n\nfunc initP256r1() {\n\ttwisted := p256t1\n\tparams := &elliptic.CurveParams{\n\t\tName:    \"brainpoolP256r1\",\n\t\tP:       twisted.P,\n\t\tN:       twisted.N,\n\t\tBitSize: twisted.BitSize,\n\t}\n\tparams.Gx, _ = new(big.Int).SetString(\"8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262\", 16)\n\tparams.Gy, _ = new(big.Int).SetString(\"547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997\", 16)\n\tz, _ := new(big.Int).SetString(\"3E2D4BD9597B58639AE7AA669CAB9837CF5CF20A2C852D10F655668DFC150EF0\", 16)\n\tp256r1 = newrcurve(twisted, params, z)\n}\n\nfunc initP384t1() {\n\tp384t1 = &elliptic.CurveParams{Name: \"brainpoolP384t1\"}\n\tp384t1.P, _ = new(big.Int).SetString(\"8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53\", 16)\n\tp384t1.N, _ = new(big.Int).SetString(\"8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565\", 16)\n\tp384t1.B, _ = new(big.Int).SetString(\"7F519EADA7BDA81BD826DBA647910F8C4B9346ED8CCDC64E4B1ABD11756DCE1D2074AA263B88805CED70355A33B471EE\", 16)\n\tp384t1.Gx, _ = new(big.Int).SetString(\"18DE98B02DB9A306F2AFCD7235F72A819B80AB12EBD653172476FECD462AABFFC4FF191B946A5F54D8D0AA2F418808CC\", 16)\n\tp384t1.Gy, _ = new(big.Int).SetString(\"25AB056962D30651A114AFD2755AD336747F93475B7A1FCA3B88F2B6A208CCFE469408584DC2B2912675BF5B9E582928\", 16)\n\tp384t1.BitSize = 384\n}\n\nfunc initP384r1() {\n\ttwisted := p384t1\n\tparams := &elliptic.CurveParams{\n\t\tName:    \"brainpoolP384r1\",\n\t\tP:       twisted.P,\n\t\tN:       twisted.N,\n\t\tBitSize: twisted.BitSize,\n\t}\n\tparams.Gx, _ = new(big.Int).SetString(\"1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E\", 16)\n\tparams.Gy, _ = new(big.Int).SetString(\"8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315\", 16)\n\tz, _ := new(big.Int).SetString(\"41DFE8DD399331F7166A66076734A89CD0D2BCDB7D068E44E1F378F41ECBAE97D2D63DBC87BCCDDCCC5DA39E8589291C\", 16)\n\tp384r1 = newrcurve(twisted, params, z)\n}\n\nfunc initP512t1() {\n\tp512t1 = &elliptic.CurveParams{Name: \"brainpoolP512t1\"}\n\tp512t1.P, _ = new(big.Int).SetString(\"AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3\", 16)\n\tp512t1.N, _ = new(big.Int).SetString(\"AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069\", 16)\n\tp512t1.B, _ = new(big.Int).SetString(\"7CBBBCF9441CFAB76E1890E46884EAE321F70C0BCB4981527897504BEC3E36A62BCDFA2304976540F6450085F2DAE145C22553B465763689180EA2571867423E\", 16)\n\tp512t1.Gx, _ = new(big.Int).SetString(\"640ECE5C12788717B9C1BA06CBC2A6FEBA85842458C56DDE9DB1758D39C0313D82BA51735CDB3EA499AA77A7D6943A64F7A3F25FE26F06B51BAA2696FA9035DA\", 16)\n\tp512t1.Gy, _ = new(big.Int).SetString(\"5B534BD595F5AF0FA2C892376C84ACE1BB4E3019B71634C01131159CAE03CEE9D9932184BEEF216BD71DF2DADF86A627306ECFF96DBB8BACE198B61E00F8B332\", 16)\n\tp512t1.BitSize = 512\n}\n\nfunc initP512r1() {\n\ttwisted := p512t1\n\tparams := &elliptic.CurveParams{\n\t\tName:    \"brainpoolP512r1\",\n\t\tP:       twisted.P,\n\t\tN:       twisted.N,\n\t\tBitSize: twisted.BitSize,\n\t}\n\tparams.Gx, _ = new(big.Int).SetString(\"81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822\", 16)\n\tparams.Gy, _ = new(big.Int).SetString(\"7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892\", 16)\n\tz, _ := new(big.Int).SetString(\"12EE58E6764838B69782136F0F2D3BA06E27695716054092E60A80BEDB212B64E585D90BCE13761F85C3F1D2A64E3BE8FEA2220F01EBA5EEB0F35DBD29D922AB\", 16)\n\tp512r1 = newrcurve(twisted, params, z)\n}\n\n// P256t1 returns a Curve which implements Brainpool P256t1 (see RFC 5639, section 3.4)\nfunc P256t1() elliptic.Curve {\n\tonce.Do(initAll)\n\treturn p256t1\n}\n\n// P256r1 returns a Curve which implements Brainpool P256r1 (see RFC 5639, section 3.4)\nfunc P256r1() elliptic.Curve {\n\tonce.Do(initAll)\n\treturn p256r1\n}\n\n// P384t1 returns a Curve which implements Brainpool P384t1 (see RFC 5639, section 3.6)\nfunc P384t1() elliptic.Curve {\n\tonce.Do(initAll)\n\treturn p384t1\n}\n\n// P384r1 returns a Curve which implements Brainpool P384r1 (see RFC 5639, section 3.6)\nfunc P384r1() elliptic.Curve {\n\tonce.Do(initAll)\n\treturn p384r1\n}\n\n// P512t1 returns a Curve which implements Brainpool P512t1 (see RFC 5639, section 3.7)\nfunc P512t1() elliptic.Curve {\n\tonce.Do(initAll)\n\treturn p512t1\n}\n\n// P512r1 returns a Curve which implements Brainpool P512r1 (see RFC 5639, section 3.7)\nfunc P512r1() elliptic.Curve {\n\tonce.Do(initAll)\n\treturn p512r1\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/brainpool/rcurve.go",
    "content": "package brainpool\n\nimport (\n\t\"crypto/elliptic\"\n\t\"math/big\"\n)\n\nvar _ elliptic.Curve = (*rcurve)(nil)\n\ntype rcurve struct {\n\ttwisted elliptic.Curve\n\tparams  *elliptic.CurveParams\n\tz       *big.Int\n\tzinv    *big.Int\n\tz2      *big.Int\n\tz3      *big.Int\n\tzinv2   *big.Int\n\tzinv3   *big.Int\n}\n\nvar (\n\ttwo   = big.NewInt(2)\n\tthree = big.NewInt(3)\n)\n\nfunc newrcurve(twisted elliptic.Curve, params *elliptic.CurveParams, z *big.Int) *rcurve {\n\tzinv := new(big.Int).ModInverse(z, params.P)\n\treturn &rcurve{\n\t\ttwisted: twisted,\n\t\tparams:  params,\n\t\tz:       z,\n\t\tzinv:    zinv,\n\t\tz2:      new(big.Int).Exp(z, two, params.P),\n\t\tz3:      new(big.Int).Exp(z, three, params.P),\n\t\tzinv2:   new(big.Int).Exp(zinv, two, params.P),\n\t\tzinv3:   new(big.Int).Exp(zinv, three, params.P),\n\t}\n}\n\nfunc (curve *rcurve) toTwisted(x, y *big.Int) (*big.Int, *big.Int) {\n\tvar tx, ty big.Int\n\ttx.Mul(x, curve.z2)\n\ttx.Mod(&tx, curve.params.P)\n\tty.Mul(y, curve.z3)\n\tty.Mod(&ty, curve.params.P)\n\treturn &tx, &ty\n}\n\nfunc (curve *rcurve) fromTwisted(tx, ty *big.Int) (*big.Int, *big.Int) {\n\tvar x, y big.Int\n\tx.Mul(tx, curve.zinv2)\n\tx.Mod(&x, curve.params.P)\n\ty.Mul(ty, curve.zinv3)\n\ty.Mod(&y, curve.params.P)\n\treturn &x, &y\n}\n\nfunc (curve *rcurve) Params() *elliptic.CurveParams {\n\treturn curve.params\n}\n\nfunc (curve *rcurve) IsOnCurve(x, y *big.Int) bool {\n\treturn curve.twisted.IsOnCurve(curve.toTwisted(x, y))\n}\n\nfunc (curve *rcurve) Add(x1, y1, x2, y2 *big.Int) (x, y *big.Int) {\n\ttx1, ty1 := curve.toTwisted(x1, y1)\n\ttx2, ty2 := curve.toTwisted(x2, y2)\n\treturn curve.fromTwisted(curve.twisted.Add(tx1, ty1, tx2, ty2))\n}\n\nfunc (curve *rcurve) Double(x1, y1 *big.Int) (x, y *big.Int) {\n\treturn curve.fromTwisted(curve.twisted.Double(curve.toTwisted(x1, y1)))\n}\n\nfunc (curve *rcurve) ScalarMult(x1, y1 *big.Int, scalar []byte) (x, y *big.Int) {\n\ttx1, ty1 := curve.toTwisted(x1, y1)\n\treturn curve.fromTwisted(curve.twisted.ScalarMult(tx1, ty1, scalar))\n}\n\nfunc (curve *rcurve) ScalarBaseMult(scalar []byte) (x, y *big.Int) {\n\treturn curve.fromTwisted(curve.twisted.ScalarBaseMult(scalar))\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/eax/eax.go",
    "content": "// Copyright (C) 2019 ProtonTech AG\n\n// Package eax provides an implementation of the EAX\n// (encrypt-authenticate-translate) mode of operation, as described in\n// Bellare, Rogaway, and Wagner \"THE EAX MODE OF OPERATION: A TWO-PASS\n// AUTHENTICATED-ENCRYPTION SCHEME OPTIMIZED FOR SIMPLICITY AND EFFICIENCY.\"\n// In FSE'04, volume 3017 of LNCS, 2004\npackage eax\n\nimport (\n\t\"crypto/cipher\"\n\t\"crypto/subtle\"\n\t\"errors\"\n\t\"github.com/ProtonMail/go-crypto/internal/byteutil\"\n)\n\nconst (\n\tdefaultTagSize   = 16\n\tdefaultNonceSize = 16\n)\n\ntype eax struct {\n\tblock     cipher.Block // Only AES-{128, 192, 256} supported\n\ttagSize   int          // At least 12 bytes recommended\n\tnonceSize int\n}\n\nfunc (e *eax) NonceSize() int {\n\treturn e.nonceSize\n}\n\nfunc (e *eax) Overhead() int {\n\treturn e.tagSize\n}\n\n// NewEAX returns an EAX instance with AES-{KEYLENGTH} and default nonce and\n// tag lengths. Supports {128, 192, 256}- bit key length.\nfunc NewEAX(block cipher.Block) (cipher.AEAD, error) {\n\treturn NewEAXWithNonceAndTagSize(block, defaultNonceSize, defaultTagSize)\n}\n\n// NewEAXWithNonceAndTagSize returns an EAX instance with AES-{keyLength} and\n// given nonce and tag lengths in bytes. Panics on zero nonceSize and\n// exceedingly long tags.\n//\n// It is recommended to use at least 12 bytes as tag length (see, for instance,\n// NIST SP 800-38D).\n//\n// Only to be used for compatibility with existing cryptosystems with\n// non-standard parameters. For all other cases, prefer NewEAX.\nfunc NewEAXWithNonceAndTagSize(\n\tblock cipher.Block, nonceSize, tagSize int) (cipher.AEAD, error) {\n\tif nonceSize < 1 {\n\t\treturn nil, eaxError(\"Cannot initialize EAX with nonceSize = 0\")\n\t}\n\tif tagSize > block.BlockSize() {\n\t\treturn nil, eaxError(\"Custom tag length exceeds blocksize\")\n\t}\n\treturn &eax{\n\t\tblock:     block,\n\t\ttagSize:   tagSize,\n\t\tnonceSize: nonceSize,\n\t}, nil\n}\n\nfunc (e *eax) Seal(dst, nonce, plaintext, adata []byte) []byte {\n\tif len(nonce) > e.nonceSize {\n\t\tpanic(\"crypto/eax: Nonce too long for this instance\")\n\t}\n\tret, out := byteutil.SliceForAppend(dst, len(plaintext)+e.tagSize)\n\tomacNonce := e.omacT(0, nonce)\n\tomacAdata := e.omacT(1, adata)\n\n\t// Encrypt message using CTR mode and omacNonce as IV\n\tctr := cipher.NewCTR(e.block, omacNonce)\n\tciphertextData := out[:len(plaintext)]\n\tctr.XORKeyStream(ciphertextData, plaintext)\n\n\tomacCiphertext := e.omacT(2, ciphertextData)\n\n\ttag := out[len(plaintext):]\n\tfor i := 0; i < e.tagSize; i++ {\n\t\ttag[i] = omacCiphertext[i] ^ omacNonce[i] ^ omacAdata[i]\n\t}\n\treturn ret\n}\n\nfunc (e *eax) Open(dst, nonce, ciphertext, adata []byte) ([]byte, error) {\n\tif len(nonce) > e.nonceSize {\n\t\tpanic(\"crypto/eax: Nonce too long for this instance\")\n\t}\n\tif len(ciphertext) < e.tagSize {\n\t\treturn nil, eaxError(\"Ciphertext shorter than tag length\")\n\t}\n\tsep := len(ciphertext) - e.tagSize\n\n\t// Compute tag\n\tomacNonce := e.omacT(0, nonce)\n\tomacAdata := e.omacT(1, adata)\n\tomacCiphertext := e.omacT(2, ciphertext[:sep])\n\n\ttag := make([]byte, e.tagSize)\n\tfor i := 0; i < e.tagSize; i++ {\n\t\ttag[i] = omacCiphertext[i] ^ omacNonce[i] ^ omacAdata[i]\n\t}\n\n\t// Compare tags\n\tif subtle.ConstantTimeCompare(ciphertext[sep:], tag) != 1 {\n\t\treturn nil, eaxError(\"Tag authentication failed\")\n\t}\n\n\t// Decrypt ciphertext\n\tret, out := byteutil.SliceForAppend(dst, len(ciphertext))\n\tctr := cipher.NewCTR(e.block, omacNonce)\n\tctr.XORKeyStream(out, ciphertext[:sep])\n\n\treturn ret[:sep], nil\n}\n\n// Tweakable OMAC - Calls OMAC_K([t]_n || plaintext)\nfunc (e *eax) omacT(t byte, plaintext []byte) []byte {\n\tblockSize := e.block.BlockSize()\n\tbyteT := make([]byte, blockSize)\n\tbyteT[blockSize-1] = t\n\tconcat := append(byteT, plaintext...)\n\treturn e.omac(concat)\n}\n\nfunc (e *eax) omac(plaintext []byte) []byte {\n\tblockSize := e.block.BlockSize()\n\t// L ← E_K(0^n); B ← 2L; P ← 4L\n\tL := make([]byte, blockSize)\n\te.block.Encrypt(L, L)\n\tB := byteutil.GfnDouble(L)\n\tP := byteutil.GfnDouble(B)\n\n\t// CBC with IV = 0\n\tcbc := cipher.NewCBCEncrypter(e.block, make([]byte, blockSize))\n\tpadded := e.pad(plaintext, B, P)\n\tcbcCiphertext := make([]byte, len(padded))\n\tcbc.CryptBlocks(cbcCiphertext, padded)\n\n\treturn cbcCiphertext[len(cbcCiphertext)-blockSize:]\n}\n\nfunc (e *eax) pad(plaintext, B, P []byte) []byte {\n\t// if |M| in {n, 2n, 3n, ...}\n\tblockSize := e.block.BlockSize()\n\tif len(plaintext) != 0 && len(plaintext)%blockSize == 0 {\n\t\treturn byteutil.RightXor(plaintext, B)\n\t}\n\n\t// else return (M || 1 || 0^(n−1−(|M| % n))) xor→ P\n\tending := make([]byte, blockSize-len(plaintext)%blockSize)\n\tending[0] = 0x80\n\tpadded := append(plaintext, ending...)\n\treturn byteutil.RightXor(padded, P)\n}\n\nfunc eaxError(err string) error {\n\treturn errors.New(\"crypto/eax: \" + err)\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/eax/eax_test_vectors.go",
    "content": "package eax\n\n// Test vectors from\n// https://web.cs.ucdavis.edu/~rogaway/papers/eax.pdf\nvar testVectors = []struct {\n\tmsg, key, nonce, header, ciphertext string\n}{\n\t{\"\",\n\t\t\"233952DEE4D5ED5F9B9C6D6FF80FF478\",\n\t\t\"62EC67F9C3A4A407FCB2A8C49031A8B3\",\n\t\t\"6BFB914FD07EAE6B\",\n\t\t\"E037830E8389F27B025A2D6527E79D01\"},\n\t{\"F7FB\",\n\t\t\"91945D3F4DCBEE0BF45EF52255F095A4\",\n\t\t\"BECAF043B0A23D843194BA972C66DEBD\",\n\t\t\"FA3BFD4806EB53FA\",\n\t\t\"19DD5C4C9331049D0BDAB0277408F67967E5\"},\n\t{\"1A47CB4933\",\n\t\t\"01F74AD64077F2E704C0F60ADA3DD523\",\n\t\t\"70C3DB4F0D26368400A10ED05D2BFF5E\",\n\t\t\"234A3463C1264AC6\",\n\t\t\"D851D5BAE03A59F238A23E39199DC9266626C40F80\"},\n\t{\"481C9E39B1\",\n\t\t\"D07CF6CBB7F313BDDE66B727AFD3C5E8\",\n\t\t\"8408DFFF3C1A2B1292DC199E46B7D617\",\n\t\t\"33CCE2EABFF5A79D\",\n\t\t\"632A9D131AD4C168A4225D8E1FF755939974A7BEDE\"},\n\t{\"40D0C07DA5E4\",\n\t\t\"35B6D0580005BBC12B0587124557D2C2\",\n\t\t\"FDB6B06676EEDC5C61D74276E1F8E816\",\n\t\t\"AEB96EAEBE2970E9\",\n\t\t\"071DFE16C675CB0677E536F73AFE6A14B74EE49844DD\"},\n\t{\"4DE3B35C3FC039245BD1FB7D\",\n\t\t\"BD8E6E11475E60B268784C38C62FEB22\",\n\t\t\"6EAC5C93072D8E8513F750935E46DA1B\",\n\t\t\"D4482D1CA78DCE0F\",\n\t\t\"835BB4F15D743E350E728414ABB8644FD6CCB86947C5E10590210A4F\"},\n\t{\"8B0A79306C9CE7ED99DAE4F87F8DD61636\",\n\t\t\"7C77D6E813BED5AC98BAA417477A2E7D\",\n\t\t\"1A8C98DCD73D38393B2BF1569DEEFC19\",\n\t\t\"65D2017990D62528\",\n\t\t\"02083E3979DA014812F59F11D52630DA30137327D10649B0AA6E1C181DB617D7F2\"},\n\t{\"1BDA122BCE8A8DBAF1877D962B8592DD2D56\",\n\t\t\"5FFF20CAFAB119CA2FC73549E20F5B0D\",\n\t\t\"DDE59B97D722156D4D9AFF2BC7559826\",\n\t\t\"54B9F04E6A09189A\",\n\t\t\"2EC47B2C4954A489AFC7BA4897EDCDAE8CC33B60450599BD02C96382902AEF7F832A\"},\n\t{\"6CF36720872B8513F6EAB1A8A44438D5EF11\",\n\t\t\"A4A4782BCFFD3EC5E7EF6D8C34A56123\",\n\t\t\"B781FCF2F75FA5A8DE97A9CA48E522EC\",\n\t\t\"899A175897561D7E\",\n\t\t\"0DE18FD0FDD91E7AF19F1D8EE8733938B1E8E7F6D2231618102FDB7FE55FF1991700\"},\n\t{\"CA40D7446E545FFAED3BD12A740A659FFBBB3CEAB7\",\n\t\t\"8395FCF1E95BEBD697BD010BC766AAC3\",\n\t\t\"22E7ADD93CFC6393C57EC0B3C17D6B44\",\n\t\t\"126735FCC320D25A\",\n\t\t\"CB8920F87A6C75CFF39627B56E3ED197C552D295A7CFC46AFC253B4652B1AF3795B124AB6E\"},\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/eax/random_vectors.go",
    "content": "// These vectors include key length in {128, 192, 256}, tag size 128, and\n// random nonce, header, and plaintext lengths.\n\n// This file was automatically generated.\n\npackage eax\n\nvar randomVectors = []struct {\n\tkey, nonce, header, plaintext, ciphertext string\n}{\n\t{\"DFDE093F36B0356E5A81F609786982E3\",\n\t\t\"1D8AC604419001816905BA72B14CED7E\",\n\t\t\"152A1517A998D7A24163FCDD146DE81AC347C8B97088F502093C1ABB8F6E33D9A219C34D7603A18B1F5ABE02E56661B7D7F67E81EC08C1302EF38D80A859486D450E94A4F26AD9E68EEBBC0C857A0FC5CF9E641D63D565A7E361BC8908F5A8DC8FD6\",\n\t\t\"1C8EAAB71077FE18B39730A3156ADE29C5EE824C7EE86ED2A253B775603FB237116E654F6FEC588DD27F523A0E01246FE73FE348491F2A8E9ABC6CA58D663F71CDBCF4AD798BE46C42AE6EE8B599DB44A1A48D7BBBBA0F7D2750181E1C5E66967F7D57CBD30AFBDA5727\",\n\t\t\"79E7E150934BBEBF7013F61C60462A14D8B15AF7A248AFB8A344EF021C1500E16666891D6E973D8BB56B71A371F12CA34660C4410C016982B20F547E3762A58B7BF4F20236CADCF559E2BE7D783B13723B2741FC7CDC8997D839E39A3DDD2BADB96743DD7049F1BDB0516A262869915B3F70498AFB7B191BF960\"},\n\t{\"F10619EF02E5D94D7550EB84ED364A21\",\n\t\t\"8DC0D4F2F745BBAE835CC5574B942D20\",\n\t\t\"FE561358F2E8DF7E1024FF1AE9A8D36EBD01352214505CB99D644777A8A1F6027FA2BDBFC529A9B91136D5F2416CFC5F0F4EC3A1AFD32BDDA23CA504C5A5CB451785FABF4DFE4CD50D817491991A60615B30286361C100A95D1712F2A45F8E374461F4CA2B\",\n\t\t\"D7B5A971FC219631D30EFC3664AE3127D9CF3097DAD9C24AC7905D15E8D9B25B026B31D68CAE00975CDB81EB1FD96FD5E1A12E2BB83FA25F1B1D91363457657FC03875C27F2946C5\",\n\t\t\"2F336ED42D3CC38FC61660C4CD60BA4BD438B05F5965D8B7B399D2E7167F5D34F792D318F94DB15D67463AC449E13D568CC09BFCE32A35EE3EE96A041927680AE329811811E27F2D1E8E657707AF99BA96D13A478D695D59\"},\n\t{\"429F514EFC64D98A698A9247274CFF45\",\n\t\t\"976AA5EB072F912D126ACEBC954FEC38\",\n\t\t\"A71D89DC5B6CEDBB7451A27C3C2CAE09126DB4C421\",\n\t\t\"5632FE62AB1DC549D54D3BC3FC868ACCEDEFD9ECF5E9F8\",\n\t\t\"848AE4306CA8C7F416F8707625B7F55881C0AB430353A5C967CDA2DA787F581A70E34DBEBB2385\"},\n\t{\"398138F309085F47F8457CDF53895A63\",\n\t\t\"F8A8A7F2D28E5FFF7BBC2F24353F7A36\",\n\t\t\"5D633C21BA7764B8855CAB586F3746E236AD486039C83C6B56EFA9C651D38A41D6B20DAEE3418BFEA44B8BD6\",\n\t\t\"A3BBAA91920AF5E10659818B1B3B300AC79BFC129C8329E75251F73A66D3AE0128EB91D5031E0A65C329DB7D1E9C0493E268\",\n\t\t\"D078097267606E5FB07CFB7E2B4B718172A82C6A4CEE65D549A4DFB9838003BD2FBF64A7A66988AC1A632FD88F9E9FBB57C5A78AD2E086EACBA3DB68511D81C2970A\"},\n\t{\"7A4151EBD3901B42CBA45DAFB2E931BA\",\n\t\t\"0FC88ACEE74DD538040321C330974EB8\",\n\t\t\"250464FB04733BAB934C59E6AD2D6AE8D662CBCFEFBE61E5A308D4211E58C4C25935B72C69107722E946BFCBF416796600542D76AEB73F2B25BF53BAF97BDEB36ED3A7A51C31E7F170EB897457E7C17571D1BA0A908954E9\",\n\t\t\"88C41F3EBEC23FAB8A362D969CAC810FAD4F7CA6A7F7D0D44F060F92E37E1183768DD4A8C733F71C96058D362A39876D183B86C103DE\",\n\t\t\"74A25B2182C51096D48A870D80F18E1CE15867778E34FCBA6BD7BFB3739FDCD42AD0F2D9F4EBA29085285C6048C15BCE5E5166F1F962D3337AA88E6062F05523029D0A7F0BF9\"},\n\t{\"BFB147E1CD5459424F8C0271FC0E0DC5\",\n\t\t\"EABCC126442BF373969EA3015988CC45\",\n\t\t\"4C0880E1D71AA2C7\",\n\t\t\"BE1B5EC78FBF73E7A6682B21BA7E0E5D2D1C7ABE\",\n\t\t\"5660D7C1380E2F306895B1402CB2D6C37876504276B414D120F4CF92FDDDBB293A238EA0\"},\n\t{\"595DD6F52D18BC2CA8EB4EDAA18D9FA3\",\n\t\t\"0F84B5D36CF4BC3B863313AF3B4D2E97\",\n\t\t\"30AE6CC5F99580F12A779D98BD379A60948020C0B6FBD5746B30BA3A15C6CD33DAF376C70A9F15B6C0EB410A93161F7958AE23\",\n\t\t\"8EF3687A1642B070970B0B91462229D1D76ABC154D18211F7152AA9FF368\",\n\t\t\"317C1DDB11417E5A9CC4DDE7FDFF6659A5AC4B31DE025212580A05CDAC6024D3E4AE7C2966E52B9129E9ECDBED86\"},\n\t{\"44E6F2DC8FDC778AD007137D11410F50\",\n\t\t\"270A237AD977F7187AA6C158A0BAB24F\",\n\t\t\"509B0F0EB12E2AA5C5BA2DE553C07FAF4CE0C9E926531AA709A3D6224FCB783ACCF1559E10B1123EBB7D52E8AB54E6B5352A9ED0D04124BF0E9D9BACFD7E32B817B2E625F5EE94A64EDE9E470DE7FE6886C19B294F9F828209FE257A78\",\n\t\t\"8B3D7815DF25618A5D0C55A601711881483878F113A12EC36CF64900549A3199555528559DC118F789788A55FAFD944E6E99A9CA3F72F238CD3F4D88223F7A745992B3FAED1848\",\n\t\t\"1CC00D79F7AD82FDA71B58D286E5F34D0CC4CEF30704E771CC1E50746BDF83E182B078DB27149A42BAE619DF0F85B0B1090AD55D3B4471B0D6F6ECCD09C8F876B30081F0E7537A9624F8AAF29DA85E324122EFB4D68A56\"},\n\t{\"BB7BC352A03044B4428D8DBB4B0701FDEC4649FD17B81452\",\n\t\t\"8B4BBE26CCD9859DCD84884159D6B0A4\",\n\t\t\"2212BEB0E78E0F044A86944CF33C8D5C80D9DBE1034BF3BCF73611835C7D3A52F5BD2D81B68FD681B68540A496EE5DA16FD8AC8824E60E1EC2042BE28FB0BFAD4E4B03596446BDD8C37D936D9B3D5295BE19F19CF5ACE1D33A46C952CE4DE5C12F92C1DD051E04AEED\",\n\t\t\"9037234CC44FFF828FABED3A7084AF40FA7ABFF8E0C0EFB57A1CC361E18FC4FAC1AB54F3ABFE9FF77263ACE16C3A\",\n\t\t\"A9391B805CCD956081E0B63D282BEA46E7025126F1C1631239C33E92AA6F92CD56E5A4C56F00FF9658E93D48AF4EF0EF81628E34AD4DB0CDAEDCD2A17EE7\"},\n\t{\"99C0AD703196D2F60A74E6B378B838B31F82EA861F06FC4E\",\n\t\t\"92745C018AA708ECFEB1667E9F3F1B01\",\n\t\t\"828C69F376C0C0EC651C67749C69577D589EE39E51404D80EBF70C8660A8F5FD375473F4A7C611D59CB546A605D67446CE2AA844135FCD78BB5FBC90222A00D42920BB1D7EEDFB0C4672554F583EF23184F89063CDECBE482367B5F9AF3ACBC3AF61392BD94CBCD9B64677\",\n\t\t\"A879214658FD0A5B0E09836639BF82E05EC7A5EF71D4701934BDA228435C68AC3D5CEB54997878B06A655EEACEFB1345C15867E7FE6C6423660C8B88DF128EBD6BCD85118DBAE16E9252FFB204324E5C8F38CA97759BDBF3CB0083\",\n\t\t\"51FE87996F194A2585E438B023B345439EA60D1AEBED4650CDAF48A4D4EEC4FC77DC71CC4B09D3BEEF8B7B7AF716CE2B4EFFB3AC9E6323C18AC35E0AA6E2BBBC8889490EB6226C896B0D105EAB42BFE7053CCF00ED66BA94C1BA09A792AA873F0C3B26C5C5F9A936E57B25\"},\n\t{\"7086816D00D648FB8304AA8C9E552E1B69A9955FB59B25D1\",\n\t\t\"0F45CF7F0BF31CCEB85D9DA10F4D749F\",\n\t\t\"93F27C60A417D9F0669E86ACC784FC8917B502DAF30A6338F11B30B94D74FEFE2F8BE1BBE2EAD10FAB7EED3C6F72B7C3ECEE1937C32ED4970A6404E139209C05\",\n\t\t\"877F046601F3CBE4FB1491943FA29487E738F94B99AF206262A1D6FF856C9AA0B8D4D08A54370C98F8E88FA3DCC2B14C1F76D71B2A4C7963AEE8AF960464C5BEC8357AD00DC8\",\n\t\t\"FE96906B895CE6A8E72BC72344E2C8BB3C63113D70EAFA26C299BAFE77A8A6568172EB447FB3E86648A0AF3512DEB1AAC0819F3EC553903BF28A9FB0F43411237A774BF9EE03E445D280FBB9CD12B9BAAB6EF5E52691\"},\n\t{\"062F65A896D5BF1401BADFF70E91B458E1F9BD4888CB2E4D\",\n\t\t\"5B11EA1D6008EBB41CF892FCA5B943D1\",\n\t\t\"BAF4FF5C8242\",\n\t\t\"A8870E091238355984EB2F7D61A865B9170F440BFF999A5993DD41A10F4440D21FF948DDA2BF663B2E03AC3324492DC5E40262ECC6A65C07672353BE23E7FB3A9D79FF6AA38D97960905A38DECC312CB6A59E5467ECF06C311CD43ADC0B543EDF34FE8BE611F176460D5627CA51F8F8D9FED71F55C\",\n\t\t\"B10E127A632172CF8AA7539B140D2C9C2590E6F28C3CB892FC498FCE56A34F732FBFF32E79C7B9747D9094E8635A0C084D6F0247F9768FB5FF83493799A9BEC6C39572120C40E9292C8C947AE8573462A9108C36D9D7112E6995AE5867E6C8BB387D1C5D4BEF524F391B9FD9F0A3B4BFA079E915BCD920185CFD38D114C558928BD7D47877\"},\n\t{\"38A8E45D6D705A11AF58AED5A1344896998EACF359F2E26A\",\n\t\t\"FD82B5B31804FF47D44199B533D0CF84\",\n\t\t\"DE454D4E62FE879F2050EE3E25853623D3E9AC52EEC1A1779A48CFAF5ECA0BFDE44749391866D1\",\n\t\t\"B804\",\n\t\t\"164BB965C05EBE0931A1A63293EDF9C38C27\"},\n\t{\"34C33C97C6D7A0850DA94D78A58DC61EC717CD7574833068\",\n\t\t\"343BE00DA9483F05C14F2E9EB8EA6AE8\",\n\t\t\"78312A43EFDE3CAE34A65796FF059A3FE15304EEA5CF1D9306949FE5BF3349D4977D4EBE76C040FE894C5949E4E4D6681153DA87FB9AC5062063CA2EA183566343362370944CE0362D25FC195E124FD60E8682E665D13F2229DDA3E4B2CB1DCA\",\n\t\t\"CC11BB284B1153578E4A5ED9D937B869DAF00F5B1960C23455CA9CC43F486A3BE0B66254F1041F04FDF459C8640465B6E1D2CF899A381451E8E7FCB50CF87823BE77E24B132BBEEDC72E53369B275E1D8F49ECE59F4F215230AC4FE133FC80E4F634EE80BA4682B62C86\",\n\t\t\"E7F703DC31A95E3A4919FF957836CB76C063D81702AEA4703E1C2BF30831E58C4609D626EC6810E12EAA5B930F049FF9EFC22C3E3F1EBD4A1FB285CB02A1AC5AD46B425199FC0A85670A5C4E3DAA9636C8F64C199F42F18AAC8EA7457FD377F322DD7752D7D01B946C8F0A97E6113F0D50106F319AFD291AAACE\"},\n\t{\"C6ECF7F053573E403E61B83052A343D93CBCC179D1E835BE\",\n\t\t\"E280E13D7367042E3AA09A80111B6184\",\n\t\t\"21486C9D7A9647\",\n\t\t\"5F2639AFA6F17931853791CD8C92382BBB677FD72D0AB1A080D0E49BFAA21810E963E4FACD422E92F65CBFAD5884A60CD94740DF31AF02F95AA57DA0C4401B0ED906\",\n\t\t\"5C51DB20755302070C45F52E50128A67C8B2E4ED0EACB7E29998CCE2E8C289DD5655913EC1A51CC3AABE5CDC2402B2BE7D6D4BF6945F266FBD70BA9F37109067157AE7530678B45F64475D4EBFCB5FFF46A5\"},\n\t{\"5EC6CF7401BC57B18EF154E8C38ACCA8959E57D2F3975FF5\",\n\t\t\"656B41CB3F9CF8C08BAD7EBFC80BD225\",\n\t\t\"6B817C2906E2AF425861A7EF59BA5801F143EE2A139EE72697CDE168B4\",\n\t\t\"2C0E1DDC9B1E5389BA63845B18B1F8A1DB062037151BCC56EF7C21C0BB4DAE366636BBA975685D7CC5A94AFBE89C769016388C56FB7B57CE750A12B718A8BDCF70E80E8659A8330EFC8F86640F21735E8C80E23FE43ABF23507CE3F964AE4EC99D\",\n\t\t\"ED780CF911E6D1AA8C979B889B0B9DC1ABE261832980BDBFB576901D9EF5AB8048998E31A15BE54B3E5845A4D136AD24D0BDA1C3006168DF2F8AC06729CB0818867398150020131D8F04EDF1923758C9EABB5F735DE5EA1758D4BC0ACFCA98AFD202E9839B8720253693B874C65586C6F0\"},\n\t{\"C92F678EB2208662F5BCF3403EC05F5961E957908A3E79421E1D25FC19054153\",\n\t\t\"DA0F3A40983D92F2D4C01FED33C7A192\",\n\t\t\"2B6E9D26DB406A0FAB47608657AA10EFC2B4AA5F459B29FF85AC9A40BFFE7AEB04F77E9A11FAAA116D7F6D4DA417671A9AB02C588E0EF59CB1BFB4B1CC931B63A3B3A159FCEC97A04D1E6F0C7E6A9CEF6B0ABB04758A69F1FE754DF4C2610E8C46B6CF413BDB31351D55BEDCB7B4A13A1C98E10984475E0F2F957853\",\n\t\t\"F37326A80E08\",\n\t\t\"83519E53E321D334F7C10B568183775C0E9AAE55F806\"},\n\t{\"6847E0491BE57E72995D186D50094B0B3593957A5146798FCE68B287B2FB37B5\",\n\t\t\"3EE1182AEBB19A02B128F28E1D5F7F99\",\n\t\t\"D9F35ABB16D776CE\",\n\t\t\"DB7566ED8EA95BDF837F23DB277BAFBC5E70D1105ADFD0D9EF15475051B1EF94709C67DCA9F8D5\",\n\t\t\"2CDCED0C9EBD6E2A508822A685F7DCD1CDD99E7A5FCA786C234E7F7F1D27EC49751AD5DCFA30C5EDA87C43CAE3B919B6BBCFE34C8EDA59\"},\n\t{\"82B019673642C08388D3E42075A4D5D587558C229E4AB8F660E37650C4C41A0A\",\n\t\t\"336F5D681E0410FAE7B607246092C6DC\",\n\t\t\"D430CBD8FE435B64214E9E9CDC5DE99D31CFCFB8C10AA0587A49DF276611\",\n\t\t\"998404153AD77003E1737EDE93ED79859EE6DCCA93CB40C4363AA817ABF2DBBD46E42A14A7183B6CC01E12A577888141363D0AE011EB6E8D28C0B235\",\n\t\t\"9BEF69EEB60BD3D6065707B7557F25292A8872857CFBD24F2F3C088E4450995333088DA50FD9121221C504DF1D0CD5EFE6A12666C5D5BB12282CF4C19906E9CFAB97E9BDF7F49DC17CFC384B\"},\n\t{\"747B2E269B1859F0622C15C8BAD6A725028B1F94B8DB7326948D1E6ED663A8BC\",\n\t\t\"AB91F7245DDCE3F1C747872D47BE0A8A\",\n\t\t\"3B03F786EF1DDD76E1D42646DA4CD2A5165DC5383CE86D1A0B5F13F910DC278A4E451EE0192CBA178E13B3BA27FDC7840DF73D2E104B\",\n\t\t\"6B803F4701114F3E5FE21718845F8416F70F626303F545BE197189E0A2BA396F37CE06D389EB2658BC7D56D67868708F6D0D32\",\n\t\t\"1570DDB0BCE75AA25D1957A287A2C36B1A5F2270186DA81BA6112B7F43B0F3D1D0ED072591DCF1F1C99BBB25621FC39B896FF9BD9413A2845363A9DCD310C32CF98E57\"},\n\t{\"02E59853FB29AEDA0FE1C5F19180AD99A12FF2F144670BB2B8BADF09AD812E0A\",\n\t\t\"C691294EF67CD04D1B9242AF83DD1421\",\n\t\t\"879334DAE3\",\n\t\t\"1E17F46A98FEF5CBB40759D95354\",\n\t\t\"FED8C3FF27DDF6313AED444A2985B36CBA268AAD6AAC563C0BA28F6DB5DB\"},\n\t{\"F6C1FB9B4188F2288FF03BD716023198C3582CF2A037FC2F29760916C2B7FCDB\",\n\t\t\"4228DA0678CA3534588859E77DFF014C\",\n\t\t\"D8153CAF35539A61DD8D05B3C9B44F01E564FB9348BCD09A1C23B84195171308861058F0A3CD2A55B912A3AAEE06FF4D356C77275828F2157C2FC7C115DA39E443210CCC56BEDB0CC99BBFB227ABD5CC454F4E7F547C7378A659EEB6A7E809101A84F866503CB18D4484E1FA09B3EC7FC75EB2E35270800AA7\",\n\t\t\"23B660A779AD285704B12EC1C580387A47BEC7B00D452C6570\",\n\t\t\"5AA642BBABA8E49849002A2FAF31DB8FC7773EFDD656E469CEC19B3206D4174C9A263D0A05484261F6\"},\n\t{\"8FF6086F1FADB9A3FBE245EAC52640C43B39D43F89526BB5A6EBA47710931446\",\n\t\t\"943188480C99437495958B0AE4831AA9\",\n\t\t\"AD5CD0BDA426F6EBA23C8EB23DC73FF9FEC173355EDBD6C9344C4C4383F211888F7CE6B29899A6801DF6B38651A7C77150941A\",\n\t\t\"80CD5EA8D7F81DDF5070B934937912E8F541A5301877528EB41AB60C020968D459960ED8FB73083329841A\",\n\t\t\"ABAE8EB7F36FCA2362551E72DAC890BA1BB6794797E0FC3B67426EC9372726ED4725D379EA0AC9147E48DCD0005C502863C2C5358A38817C8264B5\"},\n\t{\"A083B54E6B1FE01B65D42FCD248F97BB477A41462BBFE6FD591006C022C8FD84\",\n\t\t\"B0490F5BD68A52459556B3749ACDF40E\",\n\t\t\"8892E047DA5CFBBDF7F3CFCBD1BD21C6D4C80774B1826999234394BD3E513CC7C222BB40E1E3140A152F19B3802F0D036C24A590512AD0E8\",\n\t\t\"D7B15752789DC94ED0F36778A5C7BBB207BEC32BAC66E702B39966F06E381E090C6757653C3D26A81EC6AD6C364D66867A334C91BB0B8A8A4B6EACDF0783D09010AEBA2DD2062308FE99CC1F\",\n\t\t\"C071280A732ADC93DF272BF1E613B2BB7D46FC6665EF2DC1671F3E211D6BDE1D6ADDD28DF3AA2E47053FC8BB8AE9271EC8BC8B2CFFA320D225B451685B6D23ACEFDD241FE284F8ADC8DB07F456985B14330BBB66E0FB212213E05B3E\"},\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/internal/byteutil/byteutil.go",
    "content": "// Copyright (C) 2019 ProtonTech AG\n// This file contains necessary tools for the aex and ocb packages.\n//\n// These functions SHOULD NOT be used elsewhere, since they are optimized for\n// specific input nature in the EAX and OCB modes of operation.\n\npackage byteutil\n\n// GfnDouble computes 2 * input in the field of 2^n elements.\n// The irreducible polynomial in the finite field for n=128 is\n// x^128 + x^7 + x^2 + x + 1 (equals 0x87)\n// Constant-time execution in order to avoid side-channel attacks\nfunc GfnDouble(input []byte) []byte {\n\tif len(input) != 16 {\n\t\tpanic(\"Doubling in GFn only implemented for n = 128\")\n\t}\n\t// If the first bit is zero, return 2L = L << 1\n\t// Else return (L << 1) xor 0^120 10000111\n\tshifted := ShiftBytesLeft(input)\n\tshifted[15] ^= ((input[0] >> 7) * 0x87)\n\treturn shifted\n}\n\n// ShiftBytesLeft outputs the byte array corresponding to x << 1 in binary.\nfunc ShiftBytesLeft(x []byte) []byte {\n\tl := len(x)\n\tdst := make([]byte, l)\n\tfor i := 0; i < l-1; i++ {\n\t\tdst[i] = (x[i] << 1) | (x[i+1] >> 7)\n\t}\n\tdst[l-1] = x[l-1] << 1\n\treturn dst\n}\n\n// ShiftNBytesLeft puts in dst the byte array corresponding to x << n in binary.\nfunc ShiftNBytesLeft(dst, x []byte, n int) {\n\t// Erase first n / 8 bytes\n\tcopy(dst, x[n/8:])\n\n\t// Shift the remaining n % 8 bits\n\tbits := uint(n % 8)\n\tl := len(dst)\n\tfor i := 0; i < l-1; i++ {\n\t\tdst[i] = (dst[i] << bits) | (dst[i+1] >> uint(8-bits))\n\t}\n\tdst[l-1] = dst[l-1] << bits\n\n\t// Append trailing zeroes\n\tdst = append(dst, make([]byte, n/8)...)\n}\n\n// XorBytesMut replaces X with X XOR Y. len(X) must be >= len(Y).\nfunc XorBytesMut(X, Y []byte) {\n\tfor i := 0; i < len(Y); i++ {\n\t\tX[i] ^= Y[i]\n\t}\n}\n\n// XorBytes puts X XOR Y into Z. len(Z) and len(X) must be >= len(Y).\nfunc XorBytes(Z, X, Y []byte) {\n\tfor i := 0; i < len(Y); i++ {\n\t\tZ[i] = X[i] ^ Y[i]\n\t}\n}\n\n// RightXor XORs smaller input (assumed Y) at the right of the larger input (assumed X)\nfunc RightXor(X, Y []byte) []byte {\n\toffset := len(X) - len(Y)\n\txored := make([]byte, len(X))\n\tcopy(xored, X)\n\tfor i := 0; i < len(Y); i++ {\n\t\txored[offset+i] ^= Y[i]\n\t}\n\treturn xored\n}\n\n// SliceForAppend takes a slice and a requested number of bytes. It returns a\n// slice with the contents of the given slice followed by that many bytes and a\n// second slice that aliases into it and contains only the extra bytes. If the\n// original slice has sufficient capacity then no allocation is performed.\nfunc SliceForAppend(in []byte, n int) (head, tail []byte) {\n\tif total := len(in) + n; cap(in) >= total {\n\t\thead = in[:total]\n\t} else {\n\t\thead = make([]byte, total)\n\t\tcopy(head, in)\n\t}\n\ttail = head[len(in):]\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/ocb/ocb.go",
    "content": "// Copyright (C) 2019 ProtonTech AG\n\n// Package ocb provides an implementation of the OCB (offset codebook) mode of\n// operation, as described in RFC-7253 of the IRTF and in Rogaway, Bellare,\n// Black and Krovetz - OCB: A BLOCK-CIPHER MODE OF OPERATION FOR EFFICIENT\n// AUTHENTICATED ENCRYPTION (2003).\n// Security considerations (from RFC-7253): A private key MUST NOT be used to\n// encrypt more than 2^48 blocks. Tag length should be at least 12 bytes (a\n// brute-force forging adversary succeeds after 2^{tag length} attempts). A\n// single key SHOULD NOT be used to decrypt ciphertext with different tag\n// lengths. Nonces need not be secret, but MUST NOT be reused.\n// This package only supports underlying block ciphers with 128-bit blocks,\n// such as AES-{128, 192, 256}, but may be extended to other sizes.\npackage ocb\n\nimport (\n\t\"bytes\"\n\t\"crypto/cipher\"\n\t\"crypto/subtle\"\n\t\"errors\"\n\t\"math/bits\"\n\n\t\"github.com/ProtonMail/go-crypto/internal/byteutil\"\n)\n\ntype ocb struct {\n\tblock     cipher.Block\n\ttagSize   int\n\tnonceSize int\n\tmask      mask\n\t// Optimized en/decrypt: For each nonce N used to en/decrypt, the 'Ktop'\n\t// internal variable can be reused for en/decrypting with nonces sharing\n\t// all but the last 6 bits with N. The prefix of the first nonce used to\n\t// compute the new Ktop, and the Ktop value itself, are stored in\n\t// reusableKtop. If using incremental nonces, this saves one block cipher\n\t// call every 63 out of 64 OCB encryptions, and stores one nonce and one\n\t// output of the block cipher in memory only.\n\treusableKtop reusableKtop\n}\n\ntype mask struct {\n\t// L_*, L_$, (L_i)_{i ∈ N}\n\tlAst []byte\n\tlDol []byte\n\tL    [][]byte\n}\n\ntype reusableKtop struct {\n\tnoncePrefix []byte\n\tKtop        []byte\n}\n\nconst (\n\tdefaultTagSize   = 16\n\tdefaultNonceSize = 15\n)\n\nconst (\n\tenc = iota\n\tdec\n)\n\nfunc (o *ocb) NonceSize() int {\n\treturn o.nonceSize\n}\n\nfunc (o *ocb) Overhead() int {\n\treturn o.tagSize\n}\n\n// NewOCB returns an OCB instance with the given block cipher and default\n// tag and nonce sizes.\nfunc NewOCB(block cipher.Block) (cipher.AEAD, error) {\n\treturn NewOCBWithNonceAndTagSize(block, defaultNonceSize, defaultTagSize)\n}\n\n// NewOCBWithNonceAndTagSize returns an OCB instance with the given block\n// cipher, nonce length, and tag length. Panics on zero nonceSize and\n// exceedingly long tag size.\n//\n// It is recommended to use at least 12 bytes as tag length.\nfunc NewOCBWithNonceAndTagSize(\n\tblock cipher.Block, nonceSize, tagSize int) (cipher.AEAD, error) {\n\tif block.BlockSize() != 16 {\n\t\treturn nil, ocbError(\"Block cipher must have 128-bit blocks\")\n\t}\n\tif nonceSize < 1 {\n\t\treturn nil, ocbError(\"Incorrect nonce length\")\n\t}\n\tif nonceSize >= block.BlockSize() {\n\t\treturn nil, ocbError(\"Nonce length exceeds blocksize - 1\")\n\t}\n\tif tagSize > block.BlockSize() {\n\t\treturn nil, ocbError(\"Custom tag length exceeds blocksize\")\n\t}\n\treturn &ocb{\n\t\tblock:     block,\n\t\ttagSize:   tagSize,\n\t\tnonceSize: nonceSize,\n\t\tmask:      initializeMaskTable(block),\n\t\treusableKtop: reusableKtop{\n\t\t\tnoncePrefix: nil,\n\t\t\tKtop:        nil,\n\t\t},\n\t}, nil\n}\n\nfunc (o *ocb) Seal(dst, nonce, plaintext, adata []byte) []byte {\n\tif len(nonce) > o.nonceSize {\n\t\tpanic(\"crypto/ocb: Incorrect nonce length given to OCB\")\n\t}\n\tsep := len(plaintext)\n\tret, out := byteutil.SliceForAppend(dst, sep+o.tagSize)\n\ttag := o.crypt(enc, out[:sep], nonce, adata, plaintext)\n\tcopy(out[sep:], tag)\n\treturn ret\n}\n\nfunc (o *ocb) Open(dst, nonce, ciphertext, adata []byte) ([]byte, error) {\n\tif len(nonce) > o.nonceSize {\n\t\tpanic(\"Nonce too long for this instance\")\n\t}\n\tif len(ciphertext) < o.tagSize {\n\t\treturn nil, ocbError(\"Ciphertext shorter than tag length\")\n\t}\n\tsep := len(ciphertext) - o.tagSize\n\tret, out := byteutil.SliceForAppend(dst, sep)\n\tciphertextData := ciphertext[:sep]\n\ttag := o.crypt(dec, out, nonce, adata, ciphertextData)\n\tif subtle.ConstantTimeCompare(tag, ciphertext[sep:]) == 1 {\n\t\treturn ret, nil\n\t}\n\tfor i := range out {\n\t\tout[i] = 0\n\t}\n\treturn nil, ocbError(\"Tag authentication failed\")\n}\n\n// On instruction enc (resp. dec), crypt is the encrypt (resp. decrypt)\n// function. It writes the resulting plain/ciphertext into Y and returns\n// the tag.\nfunc (o *ocb) crypt(instruction int, Y, nonce, adata, X []byte) []byte {\n\t//\n\t// Consider X as a sequence of 128-bit blocks\n\t//\n\t// Note: For encryption (resp. decryption), X is the plaintext (resp., the\n\t// ciphertext without the tag).\n\tblockSize := o.block.BlockSize()\n\n\t//\n\t// Nonce-dependent and per-encryption variables\n\t//\n\t// Zero out the last 6 bits of the nonce into truncatedNonce to see if Ktop\n\t// is already computed.\n\ttruncatedNonce := make([]byte, len(nonce))\n\tcopy(truncatedNonce, nonce)\n\ttruncatedNonce[len(truncatedNonce)-1] &= 192\n\tvar Ktop []byte\n\tif bytes.Equal(truncatedNonce, o.reusableKtop.noncePrefix) {\n\t\tKtop = o.reusableKtop.Ktop\n\t} else {\n\t\t// Nonce = num2str(TAGLEN mod 128, 7) || zeros(120 - bitlen(N)) || 1 || N\n\t\tpaddedNonce := append(make([]byte, blockSize-1-len(nonce)), 1)\n\t\tpaddedNonce = append(paddedNonce, truncatedNonce...)\n\t\tpaddedNonce[0] |= byte(((8 * o.tagSize) % (8 * blockSize)) << 1)\n\t\t// Last 6 bits of paddedNonce are already zero. Encrypt into Ktop\n\t\tpaddedNonce[blockSize-1] &= 192\n\t\tKtop = paddedNonce\n\t\to.block.Encrypt(Ktop, Ktop)\n\t\to.reusableKtop.noncePrefix = truncatedNonce\n\t\to.reusableKtop.Ktop = Ktop\n\t}\n\n\t// Stretch = Ktop || ((lower half of Ktop) XOR (lower half of Ktop << 8))\n\txorHalves := make([]byte, blockSize/2)\n\tbyteutil.XorBytes(xorHalves, Ktop[:blockSize/2], Ktop[1:1+blockSize/2])\n\tstretch := append(Ktop, xorHalves...)\n\tbottom := int(nonce[len(nonce)-1] & 63)\n\toffset := make([]byte, len(stretch))\n\tbyteutil.ShiftNBytesLeft(offset, stretch, bottom)\n\toffset = offset[:blockSize]\n\n\t//\n\t// Process any whole blocks\n\t//\n\t// Note: For encryption Y is ciphertext || tag, for decryption Y is\n\t// plaintext || tag.\n\tchecksum := make([]byte, blockSize)\n\tm := len(X) / blockSize\n\tfor i := 0; i < m; i++ {\n\t\tindex := bits.TrailingZeros(uint(i + 1))\n\t\tif len(o.mask.L)-1 < index {\n\t\t\to.mask.extendTable(index)\n\t\t}\n\t\tbyteutil.XorBytesMut(offset, o.mask.L[bits.TrailingZeros(uint(i+1))])\n\t\tblockX := X[i*blockSize : (i+1)*blockSize]\n\t\tblockY := Y[i*blockSize : (i+1)*blockSize]\n\t\tswitch instruction {\n\t\tcase enc:\n\t\t\tbyteutil.XorBytesMut(checksum, blockX)\n\t\t\tbyteutil.XorBytes(blockY, blockX, offset)\n\t\t\to.block.Encrypt(blockY, blockY)\n\t\t\tbyteutil.XorBytesMut(blockY, offset)\n\t\tcase dec:\n\t\t\tbyteutil.XorBytes(blockY, blockX, offset)\n\t\t\to.block.Decrypt(blockY, blockY)\n\t\t\tbyteutil.XorBytesMut(blockY, offset)\n\t\t\tbyteutil.XorBytesMut(checksum, blockY)\n\t\t}\n\t}\n\t//\n\t// Process any final partial block and compute raw tag\n\t//\n\ttag := make([]byte, blockSize)\n\tif len(X)%blockSize != 0 {\n\t\tbyteutil.XorBytesMut(offset, o.mask.lAst)\n\t\tpad := make([]byte, blockSize)\n\t\to.block.Encrypt(pad, offset)\n\t\tchunkX := X[blockSize*m:]\n\t\tchunkY := Y[blockSize*m : len(X)]\n\t\tswitch instruction {\n\t\tcase enc:\n\t\t\tbyteutil.XorBytesMut(checksum, chunkX)\n\t\t\tchecksum[len(chunkX)] ^= 128\n\t\t\tbyteutil.XorBytes(chunkY, chunkX, pad[:len(chunkX)])\n\t\t\t// P_* || bit(1) || zeroes(127) - len(P_*)\n\t\tcase dec:\n\t\t\tbyteutil.XorBytes(chunkY, chunkX, pad[:len(chunkX)])\n\t\t\t// P_* || bit(1) || zeroes(127) - len(P_*)\n\t\t\tbyteutil.XorBytesMut(checksum, chunkY)\n\t\t\tchecksum[len(chunkY)] ^= 128\n\t\t}\n\t}\n\tbyteutil.XorBytes(tag, checksum, offset)\n\tbyteutil.XorBytesMut(tag, o.mask.lDol)\n\to.block.Encrypt(tag, tag)\n\tbyteutil.XorBytesMut(tag, o.hash(adata))\n\treturn tag[:o.tagSize]\n}\n\n// This hash function is used to compute the tag. Per design, on empty input it\n// returns a slice of zeros, of the same length as the underlying block cipher\n// block size.\nfunc (o *ocb) hash(adata []byte) []byte {\n\t//\n\t// Consider A as a sequence of 128-bit blocks\n\t//\n\tA := make([]byte, len(adata))\n\tcopy(A, adata)\n\tblockSize := o.block.BlockSize()\n\n\t//\n\t// Process any whole blocks\n\t//\n\tsum := make([]byte, blockSize)\n\toffset := make([]byte, blockSize)\n\tm := len(A) / blockSize\n\tfor i := 0; i < m; i++ {\n\t\tchunk := A[blockSize*i : blockSize*(i+1)]\n\t\tindex := bits.TrailingZeros(uint(i + 1))\n\t\t// If the mask table is too short\n\t\tif len(o.mask.L)-1 < index {\n\t\t\to.mask.extendTable(index)\n\t\t}\n\t\tbyteutil.XorBytesMut(offset, o.mask.L[index])\n\t\tbyteutil.XorBytesMut(chunk, offset)\n\t\to.block.Encrypt(chunk, chunk)\n\t\tbyteutil.XorBytesMut(sum, chunk)\n\t}\n\n\t//\n\t// Process any final partial block; compute final hash value\n\t//\n\tif len(A)%blockSize != 0 {\n\t\tbyteutil.XorBytesMut(offset, o.mask.lAst)\n\t\t// Pad block with 1 || 0 ^ 127 - bitlength(a)\n\t\tending := make([]byte, blockSize-len(A)%blockSize)\n\t\tending[0] = 0x80\n\t\tencrypted := append(A[blockSize*m:], ending...)\n\t\tbyteutil.XorBytesMut(encrypted, offset)\n\t\to.block.Encrypt(encrypted, encrypted)\n\t\tbyteutil.XorBytesMut(sum, encrypted)\n\t}\n\treturn sum\n}\n\nfunc initializeMaskTable(block cipher.Block) mask {\n\t//\n\t// Key-dependent variables\n\t//\n\tlAst := make([]byte, block.BlockSize())\n\tblock.Encrypt(lAst, lAst)\n\tlDol := byteutil.GfnDouble(lAst)\n\tL := make([][]byte, 1)\n\tL[0] = byteutil.GfnDouble(lDol)\n\n\treturn mask{\n\t\tlAst: lAst,\n\t\tlDol: lDol,\n\t\tL:    L,\n\t}\n}\n\n// Extends the L array of mask m up to L[limit], with L[i] = GfnDouble(L[i-1])\nfunc (m *mask) extendTable(limit int) {\n\tfor i := len(m.L); i <= limit; i++ {\n\t\tm.L = append(m.L, byteutil.GfnDouble(m.L[i-1]))\n\t}\n}\n\nfunc ocbError(err string) error {\n\treturn errors.New(\"crypto/ocb: \" + err)\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/ocb/random_vectors.go",
    "content": "// In the test vectors provided by RFC 7253, the \"bottom\"\n// internal variable, which defines \"offset\" for the first time, does not\n// exceed 15. However, it can attain values up to 63.\n\n// These vectors include key length in {128, 192, 256}, tag size 128, and\n// random nonce, header, and plaintext lengths.\n\n// This file was automatically generated.\n\npackage ocb\n\nvar randomVectors = []struct {\n\tkey, nonce, header, plaintext, ciphertext string\n}{\n\n\t{\"9438C5D599308EAF13F800D2D31EA7F0\",\n\t\t\"C38EE4801BEBFFA1CD8635BE\",\n\t\t\"0E507B7DADD8A98CDFE272D3CB6B3E8332B56AE583FB049C0874D4200BED16BD1A044182434E9DA0E841F182DFD5B3016B34641CED0784F1745F63AB3D0DA22D3351C9EF9A658B8081E24498EBF61FCE40DA6D8E184536\",\n\t\t\"962D227786FB8913A8BAD5DC3250\",\n\t\t\"EEDEF5FFA5986D1E3BF86DDD33EF9ADC79DCA06E215FA772CCBA814F63AD\"},\n\t{\"BA7DE631C7D6712167C6724F5B9A2B1D\",\n\t\t\"35263EBDA05765DC0E71F1F5\",\n\t\t\"0103257B4224507C0242FEFE821EA7FA42E0A82863E5F8B68F7D881B4B44FA428A2B6B21D2F591260802D8AB6D83\",\n\t\t\"9D6D1FC93AE8A64E7889B7B2E3521EFA9B920A8DDB692E6F833DDC4A38AFA535E5E2A3ED82CB7E26404AB86C54D01C4668F28398C2DF33D5D561CBA1C8DCFA7A912F5048E545B59483C0E3221F54B14DAA2E4EB657B3BEF9554F34CAD69B2724AE962D3D8A\",\n\t\t\"E93852D1985C5E775655E937FA79CE5BF28A585F2AF53A5018853B9634BE3C84499AC0081918FDCE0624494D60E25F76ACD6853AC7576E3C350F332249BFCABD4E73CEABC36BE4EDDA40914E598AE74174A0D7442149B26990899491BDDFE8FC54D6C18E83AE9E9A6FFBF5D376565633862EEAD88D\"},\n\t{\"2E74B25289F6FD3E578C24866E9C72A5\",\n\t\t\"FD912F15025AF8414642BA1D1D\",\n\t\t\"FB5FB8C26F365EEDAB5FE260C6E3CCD27806729C8335F146063A7F9EA93290E56CF84576EB446350D22AD730547C267B1F0BBB97EB34E1E2C41A\",\n\t\t\"6C092EBF78F76EE8C1C6E592277D9545BA16EDB67BC7D8480B9827702DC2F8A129E2B08A2CE710CA7E1DA45CE162BB6CD4B512E632116E2211D3C90871EFB06B8D4B902681C7FB\",\n\t\t\"6AC0A77F26531BF4F354A1737F99E49BE32ECD909A7A71AD69352906F54B08A9CE9B8CA5D724CBFFC5673437F23F630697F3B84117A1431D6FA8CC13A974FB4AD360300522E09511B99E71065D5AC4BBCB1D791E864EF4\"},\n\t{\"E7EC507C802528F790AFF5303A017B17\",\n\t\t\"4B97A7A568940A9E3CE7A99E93031E\",\n\t\t\"28349BDC5A09390C480F9B8AA3EDEA3DDB8B9D64BCA322C570B8225DF0E31190DAB25A4014BA39519E02ABFB12B89AA28BBFD29E486E7FB28734258C817B63CED9912DBAFEBB93E2798AB2890DE3B0ACFCFF906AB15563EF7823CE83D27CDB251195E22BD1337BCBDE65E7C2C427321C463C2777BFE5AEAA\",\n\t\t\"9455B3EA706B74\",\n\t\t\"7F33BA3EA848D48A96B9530E26888F43EBD4463C9399B6\"},\n\t{\"6C928AA3224736F28EE7378DE0090191\",\n\t\t\"8936138E2E4C6A13280017A1622D\",\n\t\t\"6202717F2631565BDCDC57C6584543E72A7C8BD444D0D108ED35069819633C\",\n\t\t\"DA0691439E5F035F3E455269D14FE5C201C8C9B0A3FE2D3F86BCC59387C868FE65733D388360B31E3CE28B4BF6A8BE636706B536D5720DB66B47CF1C7A5AFD6F61E0EF90F1726D6B0E169F9A768B2B7AE4EE00A17F630AC905FCAAA1B707FFF25B3A1AAE83B504837C64A5639B2A34002B300EC035C9B43654DA55\",\n\t\t\"B8804D182AB0F0EEB464FA7BD1329AD6154F982013F3765FEDFE09E26DAC078C9C1439BFC1159D6C02A25E3FF83EF852570117B315852AD5EE20E0FA3AA0A626B0E43BC0CEA38B44579DD36803455FB46989B90E6D229F513FD727AF8372517E9488384C515D6067704119C931299A0982EDDFB9C2E86A90C450C077EB222511EC9CCABC9FCFDB19F70088\"},\n\t{\"ECEA315CA4B3F425B0C9957A17805EA4\",\n\t\t\"664CDAE18403F4F9BA13015A44FC\",\n\t\t\"642AFB090D6C6DB46783F08B01A3EF2A8FEB5736B531EAC226E7888FCC8505F396818F83105065FACB3267485B9E5E4A0261F621041C08FCCB2A809A49AB5252A91D0971BCC620B9D614BD77E57A0EED2FA5\",\n\t\t\"6852C31F8083E20E364CEA21BB7854D67CEE812FE1C9ED2425C0932A90D3780728D1BB\",\n\t\t\"2ECEF962A9695A463ADABB275BDA9FF8B2BA57AEC2F52EFFB700CD9271A74D2A011C24AEA946051BD6291776429B7E681BA33E\"},\n\t{\"4EE616C4A58AAA380878F71A373461F6\",\n\t\t\"91B8C9C176D9C385E9C47E52\",\n\t\t\"CDA440B7F9762C572A718AC754EDEECC119E5EE0CCB9FEA4FFB22EEE75087C032EBF3DA9CDD8A28CC010B99ED45143B41A4BA50EA2A005473F89639237838867A57F23B0F0ED3BF22490E4501DAC9C658A9B9F\",\n\t\t\"D6E645FA9AE410D15B8123FD757FA356A8DBE9258DDB5BE88832E615910993F497EC\",\n\t\t\"B70ED7BF959FB2AAED4F36174A2A99BFB16992C8CDF369C782C4DB9C73DE78C5DB8E0615F647243B97ACDB24503BC9CADC48\"},\n\t{\"DCD475773136C830D5E3D0C5FE05B7FF\",\n\t\t\"BB8E1FBB483BE7616A922C4A\",\n\t\t\"36FEF2E1CB29E76A6EA663FC3AF66ECD7404F466382F7B040AABED62293302B56E8783EF7EBC21B4A16C3E78A7483A0A403F253A2CDC5BBF79DC3DAE6C73F39A961D8FBBE8D41B\",\n\t\t\"441E886EA38322B2437ECA7DEB5282518865A66780A454E510878E61BFEC3106A3CD93D2A02052E6F9E1832F9791053E3B76BF4C07EFDD6D4106E3027FABB752E60C1AA425416A87D53938163817A1051EBA1D1DEEB4B9B25C7E97368B52E5911A31810B0EC5AF547559B6142D9F4C4A6EF24A4CF75271BF9D48F62B\",\n\t\t\"1BE4DD2F4E25A6512C2CC71D24BBB07368589A94C2714962CD0ACE5605688F06342587521E75F0ACAFFD86212FB5C34327D238DB36CF2B787794B9A4412E7CD1410EA5DDD2450C265F29CF96013CD213FD2880657694D718558964BC189B4A84AFCF47EB012935483052399DBA5B088B0A0477F20DFE0E85DCB735E21F22A439FB837DD365A93116D063E607\"},\n\t{\"3FBA2B3D30177FFE15C1C59ED2148BB2C091F5615FBA7C07\",\n\t\t\"FACF804A4BEBF998505FF9DE\",\n\t\t\"8213B9263B2971A5BDA18DBD02208EE1\",\n\t\t\"15B323926993B326EA19F892D704439FC478828322AF72118748284A1FD8A6D814E641F70512FD706980337379F31DC63355974738D7FEA87AD2858C0C2EBBFBE74371C21450072373C7B651B334D7C4D43260B9D7CCD3AF9EDB\",\n\t\t\"6D35DC1469B26E6AAB26272A41B46916397C24C485B61162E640A062D9275BC33DDCFD3D9E1A53B6C8F51AC89B66A41D59B3574197A40D9B6DCF8A4E2A001409C8112F16B9C389E0096179DB914E05D6D11ED0005AD17E1CE105A2F0BAB8F6B1540DEB968B7A5428FF44\"},\n\t{\"53B52B8D4D748BCDF1DDE68857832FA46227FA6E2F32EFA1\",\n\t\t\"0B0EF53D4606B28D1398355F\",\n\t\t\"F23882436349094AF98BCACA8218E81581A043B19009E28EFBF2DE37883E04864148CC01D240552CA8844EC1456F42034653067DA67E80F87105FD06E14FF771246C9612867BE4D215F6D761\",\n\t\t\"F15030679BD4088D42CAC9BF2E9606EAD4798782FA3ED8C57EBE7F84A53236F51B25967C6489D0CD20C9EEA752F9BC\",\n\t\t\"67B96E2D67C3729C96DAEAEDF821D61C17E648643A2134C5621FEC621186915AD80864BFD1EB5B238BF526A679385E012A457F583AFA78134242E9D9C1B4E4\"},\n\t{\"0272DD80F23399F49BFC320381A5CD8225867245A49A7D41\",\n\t\t\"5C83F4896D0738E1366B1836\",\n\t\t\"69B0337289B19F73A12BAEEA857CCAF396C11113715D9500CCCF48BA08CFF12BC8B4BADB3084E63B85719DB5058FA7C2C11DEB096D7943CFA7CAF5\",\n\t\t\"C01AD10FC8B562CD17C7BC2FAB3E26CBDFF8D7F4DEA816794BBCC12336991712972F52816AABAB244EB43B0137E2BAC1DD413CE79531E78BEF782E6B439612BB3AEF154DE3502784F287958EBC159419F9EBA27916A28D6307324129F506B1DE80C1755A929F87\",\n\t\t\"FEFE52DD7159C8DD6E8EC2D3D3C0F37AB6CB471A75A071D17EC4ACDD8F3AA4D7D4F7BB559F3C09099E3D9003E5E8AA1F556B79CECDE66F85B08FA5955E6976BF2695EA076388A62D2AD5BAB7CBF1A7F3F4C8D5CDF37CDE99BD3E30B685D9E5EEE48C7C89118EF4878EB89747F28271FA2CC45F8E9E7601\"},\n\t{\"3EEAED04A455D6E5E5AB53CFD5AFD2F2BC625C7BF4BE49A5\",\n\t\t\"36B88F63ADBB5668588181D774\",\n\t\t\"D367E3CB3703E762D23C6533188EF7028EFF9D935A3977150361997EC9DEAF1E4794BDE26AA8B53C124980B1362EC86FCDDFC7A90073171C1BAEE351A53234B86C66E8AB92FAE99EC6967A6D3428892D80\",\n\t\t\"573454C719A9A55E04437BF7CBAAF27563CCCD92ADD5E515CD63305DFF0687E5EEF790C5DCA5C0033E9AB129505E2775438D92B38F08F3B0356BA142C6F694\",\n\t\t\"E9F79A5B432D9E682C9AAA5661CFC2E49A0FCB81A431E54B42EB73DD3BED3F377FEC556ABA81624BA64A5D739AD41467460088F8D4F442180A9382CA635745473794C382FCDDC49BA4EB6D8A44AE3C\"},\n\t{\"B695C691538F8CBD60F039D0E28894E3693CC7C36D92D79D\",\n\t\t\"BC099AEB637361BAC536B57618\",\n\t\t\"BFFF1A65AE38D1DC142C71637319F5F6508E2CB33C9DCB94202B359ED5A5ED8042E7F4F09231D32A7242976677E6F4C549BF65FADC99E5AF43F7A46FD95E16C2\",\n\t\t\"081DF3FD85B415D803F0BE5AC58CFF0023FDDED99788296C3731D8\",\n\t\t\"E50C64E3614D94FE69C47092E46ACC9957C6FEA2CCBF96BC62FBABE7424753C75F9C147C42AE26FE171531\"},\n\t{\"C9ACBD2718F0689A1BE9802A551B6B8D9CF5614DAF5E65ED\",\n\t\t\"B1B0AAF373B8B026EB80422051D8\",\n\t\t\"6648C0E61AC733C76119D23FB24548D637751387AA2EAE9D80E912B7BD486CAAD9EAF4D7A5FE2B54AAD481E8EC94BB4D558000896E2010462B70C9FED1E7273080D1\",\n\t\t\"189F591F6CB6D59AFEDD14C341741A8F1037DC0DF00FC57CE65C30F49E860255CEA5DC6019380CC0FE8880BC1A9E685F41C239C38F36E3F2A1388865C5C311059C0A\",\n\t\t\"922A5E949B61D03BE34AB5F4E58607D4504EA14017BB363DAE3C873059EA7A1C77A746FB78981671D26C2CF6D9F24952D510044CE02A10177E9DB42D0145211DFE6E84369C5E3BC2669EAB4147B2822895F9\"},\n\t{\"7A832BD2CF5BF4919F353CE2A8C86A5E406DA2D52BE16A72\",\n\t\t\"2F2F17CECF7E5A756D10785A3CB9DB\",\n\t\t\"61DA05E3788CC2D8405DBA70C7A28E5AF699863C9F72E6C6770126929F5D6FA267F005EBCF49495CB46400958A3AE80D1289D1C671\",\n\t\t\"44E91121195A41AF14E8CFDBD39A4B517BE0DF1A72977ED8A3EEF8EEDA1166B2EB6DB2C4AE2E74FA0F0C74537F659BFBD141E5DDEC67E64EDA85AABD3F52C85A785B9FB3CECD70E7DF\",\n\t\t\"BEDF596EA21288D2B84901E188F6EE1468B14D5161D3802DBFE00D60203A24E2AB62714BF272A45551489838C3A7FEAADC177B591836E73684867CCF4E12901DCF2064058726BBA554E84ADC5136F507E961188D4AF06943D3\"},\n\t{\"1508E8AE9079AA15F1CEC4F776B4D11BCCB061B58AA56C18\",\n\t\t\"BCA625674F41D1E3AB47672DC0C3\",\n\t\t\"8B12CF84F16360F0EAD2A41BC021530FFCEC7F3579CAE658E10E2D3D81870F65AFCED0C77C6C4C6E6BA424FF23088C796BA6195ABA35094BF1829E089662E7A95FC90750AE16D0C8AFA55DAC789D7735B970B58D4BE7CEC7341DA82A0179A01929C27A59C5063215B859EA43\",\n\t\t\"E525422519ECE070E82C\",\n\t\t\"B47BC07C3ED1C0A43BA52C43CBACBCDBB29CAF1001E09FDF7107\"},\n\t{\"7550C2761644E911FE9ADD119BAC07376BEA442845FEAD876D7E7AC1B713E464\",\n\t\t\"36D2EC25ADD33CDEDF495205BBC923\",\n\t\t\"7FCFE81A3790DE97FFC3DE160C470847EA7E841177C2F759571CBD837EA004A6CA8C6F4AEBFF2E9FD552D73EB8A30705D58D70C0B67AEEA280CBBF0A477358ACEF1E7508F2735CD9A0E4F9AC92B8C008F575D3B6278F1C18BD01227E3502E5255F3AB1893632AD00C717C588EF652A51A43209E7EE90\",\n\t\t\"2B1A62F8FDFAA3C16470A21AD307C9A7D03ADE8EF72C69B06F8D738CDE578D7AEFD0D40BD9C022FB9F580DF5394C998ACCCEFC5471A3996FB8F1045A81FDC6F32D13502EA65A211390C8D882B8E0BEFD8DD8CBEF51D1597B124E9F7F\",\n\t\t\"C873E02A22DB89EB0787DB6A60B99F7E4A0A085D5C4232A81ADCE2D60AA36F92DDC33F93DD8640AC0E08416B187FB382B3EC3EE85A64B0E6EE41C1366A5AD2A282F66605E87031CCBA2FA7B2DA201D975994AADE3DD1EE122AE09604AD489B84BF0C1AB7129EE16C6934850E\"},\n\t{\"A51300285E554FDBDE7F771A9A9A80955639DD87129FAEF74987C91FB9687C71\",\n\t\t\"81691D5D20EC818FCFF24B33DECC\",\n\t\t\"C948093218AA9EB2A8E44A87EEA73FC8B6B75A196819A14BD83709EA323E8DF8B491045220E1D88729A38DBCFFB60D3056DAD4564498FD6574F74512945DEB34B69329ACED9FFC05D5D59DFCD5B973E2ACAFE6AD1EF8BBBC49351A2DD12508ED89ED\",\n\t\t\"EB861165DAF7625F827C6B574ED703F03215\",\n\t\t\"C6CD1CE76D2B3679C1B5AA1CFD67CCB55444B6BFD3E22C81CBC9BB738796B83E54E3\"},\n\t{\"8CE0156D26FAEB7E0B9B800BBB2E9D4075B5EAC5C62358B0E7F6FCE610223282\",\n\t\t\"D2A7B94DD12CDACA909D3AD7\",\n\t\t\"E021A78F374FC271389AB9A3E97077D755\",\n\t\t\"7C26000B58929F5095E1CEE154F76C2A299248E299F9B5ADE6C403AA1FD4A67FD4E0232F214CE7B919EE7A1027D2B76C57475715CD078461\",\n\t\t\"C556FB38DF069B56F337B5FF5775CE6EAA16824DFA754F20B78819028EA635C3BB7AA731DE8776B2DCB67DCA2D33EEDF3C7E52EA450013722A41755A0752433ED17BDD5991AAE77A\"},\n\t{\"1E8000A2CE00A561C9920A30BF0D7B983FEF8A1014C8F04C35CA6970E6BA02BD\",\n\t\t\"65ED3D63F79F90BBFD19775E\",\n\t\t\"336A8C0B7243582A46B221AA677647FCAE91\",\n\t\t\"134A8B34824A290E7B\",\n\t\t\"914FBEF80D0E6E17F8BDBB6097EBF5FBB0554952DC2B9E5151\"},\n\t{\"53D5607BBE690B6E8D8F6D97F3DF2BA853B682597A214B8AA0EA6E598650AF15\",\n\t\t\"C391A856B9FE234E14BA1AC7BB40FF\",\n\t\t\"479682BC21349C4BE1641D5E78FE2C79EC1B9CF5470936DCAD9967A4DCD7C4EFADA593BC9EDE71E6A08829B8580901B61E274227E9D918502DE3\",\n\t\t\"EAD154DC09C5E26C5D26FF33ED148B27120C7F2C23225CC0D0631B03E1F6C6D96FEB88C1A4052ACB4CE746B884B6502931F407021126C6AAB8C514C077A5A38438AE88EE\",\n\t\t\"938821286EBB671D999B87C032E1D6055392EB564E57970D55E545FC5E8BAB90E6E3E3C0913F6320995FC636D72CD9919657CC38BD51552F4A502D8D1FE56DB33EBAC5092630E69EBB986F0E15CEE9FC8C052501\"},\n\t{\"294362FCC984F440CEA3E9F7D2C06AF20C53AAC1B3738CA2186C914A6E193ABB\",\n\t\t\"B15B61C8BB39261A8F55AB178EC3\",\n\t\t\"D0729B6B75BB\",\n\t\t\"2BD089ADCE9F334BAE3B065996C7D616DD0C27DF4218DCEEA0FBCA0F968837CE26B0876083327E25681FDDD620A32EC0DA12F73FAE826CC94BFF2B90A54D2651\",\n\t\t\"AC94B25E4E21DE2437B806966CCD5D9385EF0CD4A51AB9FA6DE675C7B8952D67802E9FEC1FDE9F5D1EAB06057498BC0EEA454804FC9D2068982A3E24182D9AC2E7AB9994DDC899A604264583F63D066B\"},\n\t{\"959DBFEB039B1A5B8CE6A44649B602AAA5F98A906DB96143D202CD2024F749D9\",\n\t\t\"01D7BDB1133E9C347486C1EFA6\",\n\t\t\"F3843955BD741F379DD750585EDC55E2CDA05CCBA8C1F4622AC2FE35214BC3A019B8BD12C4CC42D9213D1E1556941E8D8450830287FFB3B763A13722DD4140ED9846FB5FFF745D7B0B967D810A068222E10B259AF1D392035B0D83DC1498A6830B11B2418A840212599171E0258A1C203B05362978\",\n\t\t\"A21811232C950FA8B12237C2EBD6A7CD2C3A155905E9E0C7C120\",\n\t\t\"63C1CE397B22F1A03F1FA549B43178BC405B152D3C95E977426D519B3DFCA28498823240592B6EEE7A14\"},\n\t{\"096AE499F5294173F34FF2B375F0E5D5AB79D0D03B33B1A74D7D576826345DF4\",\n\t\t\"0C52B3D11D636E5910A4DD76D32C\",\n\t\t\"229E9ECA3053789E937447BC719467075B6138A142DA528DA8F0CF8DDF022FD9AF8E74779BA3AC306609\",\n\t\t\"8B7A00038783E8BAF6EDEAE0C4EAB48FC8FD501A588C7E4A4DB71E3604F2155A97687D3D2FFF8569261375A513CF4398CE0F87CA1658A1050F6EF6C4EA3E25\",\n\t\t\"C20B6CF8D3C8241825FD90B2EDAC7593600646E579A8D8DAAE9E2E40C3835FE801B2BE4379131452BC5182C90307B176DFBE2049544222FE7783147B690774F6D9D7CEF52A91E61E298E9AA15464AC\"},\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_a.go",
    "content": "package ocb\n\nimport (\n\t\"encoding/hex\"\n)\n\n// Test vectors from https://tools.ietf.org/html/rfc7253. Note that key is\n// shared across tests.\nvar testKey, _ = hex.DecodeString(\"000102030405060708090A0B0C0D0E0F\")\n\nvar rfc7253testVectors = []struct {\n\tnonce, header, plaintext, ciphertext string\n}{\n\t{\"BBAA99887766554433221100\",\n\t\t\"\",\n\t\t\"\",\n\t\t\"785407BFFFC8AD9EDCC5520AC9111EE6\"},\n\t{\"BBAA99887766554433221101\",\n\t\t\"0001020304050607\",\n\t\t\"0001020304050607\",\n\t\t\"6820B3657B6F615A5725BDA0D3B4EB3A257C9AF1F8F03009\"},\n\t{\"BBAA99887766554433221102\",\n\t\t\"0001020304050607\",\n\t\t\"\",\n\t\t\"81017F8203F081277152FADE694A0A00\"},\n\t{\"BBAA99887766554433221103\",\n\t\t\"\",\n\t\t\"0001020304050607\",\n\t\t\"45DD69F8F5AAE72414054CD1F35D82760B2CD00D2F99BFA9\"},\n\t{\"BBAA99887766554433221104\",\n\t\t\"000102030405060708090A0B0C0D0E0F\",\n\t\t\"000102030405060708090A0B0C0D0E0F\",\n\t\t\"571D535B60B277188BE5147170A9A22C3AD7A4FF3835B8C5701C1CCEC8FC3358\"},\n\t{\"BBAA99887766554433221105\",\n\t\t\"000102030405060708090A0B0C0D0E0F\",\n\t\t\"\",\n\t\t\"8CF761B6902EF764462AD86498CA6B97\"},\n\t{\"BBAA99887766554433221106\",\n\t\t\"\",\n\t\t\"000102030405060708090A0B0C0D0E0F\",\n\t\t\"5CE88EC2E0692706A915C00AEB8B2396F40E1C743F52436BDF06D8FA1ECA343D\"},\n\t{\"BBAA99887766554433221107\",\n\t\t\"000102030405060708090A0B0C0D0E0F1011121314151617\",\n\t\t\"000102030405060708090A0B0C0D0E0F1011121314151617\",\n\t\t\"1CA2207308C87C010756104D8840CE1952F09673A448A122C92C62241051F57356D7F3C90BB0E07F\"},\n\t{\"BBAA99887766554433221108\",\n\t\t\"000102030405060708090A0B0C0D0E0F1011121314151617\",\n\t\t\"\",\n\t\t\"6DC225A071FC1B9F7C69F93B0F1E10DE\"},\n\t{\"BBAA99887766554433221109\",\n\t\t\"\",\n\t\t\"000102030405060708090A0B0C0D0E0F1011121314151617\",\n\t\t\"221BD0DE7FA6FE993ECCD769460A0AF2D6CDED0C395B1C3CE725F32494B9F914D85C0B1EB38357FF\"},\n\t{\"BBAA9988776655443322110A\",\n\t\t\"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\",\n\t\t\"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\",\n\t\t\"BD6F6C496201C69296C11EFD138A467ABD3C707924B964DEAFFC40319AF5A48540FBBA186C5553C68AD9F592A79A4240\"},\n\t{\"BBAA9988776655443322110B\",\n\t\t\"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\",\n\t\t\"\",\n\t\t\"FE80690BEE8A485D11F32965BC9D2A32\"},\n\t{\"BBAA9988776655443322110C\",\n\t\t\"\",\n\t\t\"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F\",\n\t\t\"2942BFC773BDA23CABC6ACFD9BFD5835BD300F0973792EF46040C53F1432BCDFB5E1DDE3BC18A5F840B52E653444D5DF\"},\n\t{\"BBAA9988776655443322110D\",\n\t\t\"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627\",\n\t\t\"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627\",\n\t\t\"D5CA91748410C1751FF8A2F618255B68A0A12E093FF454606E59F9C1D0DDC54B65E8628E568BAD7AED07BA06A4A69483A7035490C5769E60\"},\n\t{\"BBAA9988776655443322110E\",\n\t\t\"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627\",\n\t\t\"\",\n\t\t\"C5CD9D1850C141E358649994EE701B68\"},\n\t{\"BBAA9988776655443322110F\",\n\t\t\"\",\n\t\t\"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627\",\n\t\t\"4412923493C57D5DE0D700F753CCE0D1D2D95060122E9F15A5DDBFC5787E50B5CC55EE507BCB084E479AD363AC366B95A98CA5F3000B1479\"},\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_b.go",
    "content": "package ocb\n\n// Second set of test vectors from https://tools.ietf.org/html/rfc7253\nvar rfc7253TestVectorTaglen96 = struct {\n\tkey, nonce, header, plaintext, ciphertext string\n}{\"0F0E0D0C0B0A09080706050403020100\",\n\t\"BBAA9988776655443322110D\",\n\t\"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627\",\n\t\"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627\",\n\t\"1792A4E31E0755FB03E31B22116E6C2DDF9EFD6E33D536F1A0124B0A55BAE884ED93481529C76B6AD0C515F4D1CDD4FDAC4F02AA\"}\n\nvar rfc7253AlgorithmTest = []struct {\n\tKEYLEN, TAGLEN int\n\tOUTPUT         string\n}{\n\t{128, 128, \"67E944D23256C5E0B6C61FA22FDF1EA2\"},\n\t{192, 128, \"F673F2C3E7174AAE7BAE986CA9F29E17\"},\n\t{256, 128, \"D90EB8E9C977C88B79DD793D7FFA161C\"},\n\t{128, 96, \"77A3D8E73589158D25D01209\"},\n\t{192, 96, \"05D56EAD2752C86BE6932C5E\"},\n\t{256, 96, \"5458359AC23B0CBA9E6330DD\"},\n\t{128, 64, \"192C9B7BD90BA06A\"},\n\t{192, 64, \"0066BC6E0EF34E24\"},\n\t{256, 64, \"7D4EA5D445501CBE\"},\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/aes/keywrap/keywrap.go",
    "content": "// Copyright 2014 Matthew Endsley\n// All rights reserved\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted providing that the following conditions\n// are met:\n// 1. Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright\n//    notice, this list of conditions and the following disclaimer in the\n//    documentation and/or other materials provided with the distribution.\n//\n// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n// ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY\n// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n// IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\n// Package keywrap is an implementation of the RFC 3394 AES key wrapping\n// algorithm. This is used in OpenPGP with elliptic curve keys.\npackage keywrap\n\nimport (\n\t\"crypto/aes\"\n\t\"encoding/binary\"\n\t\"errors\"\n)\n\nvar (\n\t// ErrWrapPlaintext is returned if the plaintext is not a multiple\n\t// of 64 bits.\n\tErrWrapPlaintext = errors.New(\"keywrap: plainText must be a multiple of 64 bits\")\n\n\t// ErrUnwrapCiphertext is returned if the ciphertext is not a\n\t// multiple of 64 bits.\n\tErrUnwrapCiphertext = errors.New(\"keywrap: cipherText must by a multiple of 64 bits\")\n\n\t// ErrUnwrapFailed is returned if unwrapping a key fails.\n\tErrUnwrapFailed = errors.New(\"keywrap: failed to unwrap key\")\n\n\t// NB: the AES NewCipher call only fails if the key is an invalid length.\n\n\t// ErrInvalidKey is returned when the AES key is invalid.\n\tErrInvalidKey = errors.New(\"keywrap: invalid AES key\")\n)\n\n// Wrap a key using the RFC 3394 AES Key Wrap Algorithm.\nfunc Wrap(key, plainText []byte) ([]byte, error) {\n\tif len(plainText)%8 != 0 {\n\t\treturn nil, ErrWrapPlaintext\n\t}\n\n\tc, err := aes.NewCipher(key)\n\tif err != nil {\n\t\treturn nil, ErrInvalidKey\n\t}\n\n\tnblocks := len(plainText) / 8\n\n\t// 1) Initialize variables.\n\tvar block [aes.BlockSize]byte\n\t// - Set A = IV, an initial value (see 2.2.3)\n\tfor ii := 0; ii < 8; ii++ {\n\t\tblock[ii] = 0xA6\n\t}\n\n\t// - For i = 1 to n\n\t// -   Set R[i] = P[i]\n\tintermediate := make([]byte, len(plainText))\n\tcopy(intermediate, plainText)\n\n\t// 2) Calculate intermediate values.\n\tfor ii := 0; ii < 6; ii++ {\n\t\tfor jj := 0; jj < nblocks; jj++ {\n\t\t\t// - B = AES(K, A | R[i])\n\t\t\tcopy(block[8:], intermediate[jj*8:jj*8+8])\n\t\t\tc.Encrypt(block[:], block[:])\n\n\t\t\t// - A = MSB(64, B) ^ t where t = (n*j)+1\n\t\t\tt := uint64(ii*nblocks + jj + 1)\n\t\t\tval := binary.BigEndian.Uint64(block[:8]) ^ t\n\t\t\tbinary.BigEndian.PutUint64(block[:8], val)\n\n\t\t\t// - R[i] = LSB(64, B)\n\t\t\tcopy(intermediate[jj*8:jj*8+8], block[8:])\n\t\t}\n\t}\n\n\t// 3) Output results.\n\t// - Set C[0] = A\n\t// - For i = 1 to n\n\t// -   C[i] = R[i]\n\treturn append(block[:8], intermediate...), nil\n}\n\n// Unwrap a key using the RFC 3394 AES Key Wrap Algorithm.\nfunc Unwrap(key, cipherText []byte) ([]byte, error) {\n\tif len(cipherText)%8 != 0 {\n\t\treturn nil, ErrUnwrapCiphertext\n\t}\n\n\tc, err := aes.NewCipher(key)\n\tif err != nil {\n\t\treturn nil, ErrInvalidKey\n\t}\n\n\tnblocks := len(cipherText)/8 - 1\n\n\t// 1) Initialize variables.\n\tvar block [aes.BlockSize]byte\n\t// - Set A = C[0]\n\tcopy(block[:8], cipherText[:8])\n\n\t// - For i = 1 to n\n\t// -   Set R[i] = C[i]\n\tintermediate := make([]byte, len(cipherText)-8)\n\tcopy(intermediate, cipherText[8:])\n\n\t// 2) Compute intermediate values.\n\tfor jj := 5; jj >= 0; jj-- {\n\t\tfor ii := nblocks - 1; ii >= 0; ii-- {\n\t\t\t// - B = AES-1(K, (A ^ t) | R[i]) where t = n*j+1\n\t\t\t// - A = MSB(64, B)\n\t\t\tt := uint64(jj*nblocks + ii + 1)\n\t\t\tval := binary.BigEndian.Uint64(block[:8]) ^ t\n\t\t\tbinary.BigEndian.PutUint64(block[:8], val)\n\n\t\t\tcopy(block[8:], intermediate[ii*8:ii*8+8])\n\t\t\tc.Decrypt(block[:], block[:])\n\n\t\t\t// - R[i] = LSB(B, 64)\n\t\t\tcopy(intermediate[ii*8:ii*8+8], block[8:])\n\t\t}\n\t}\n\n\t// 3) Output results.\n\t// - If A is an appropriate initial value (see 2.2.3),\n\tfor ii := 0; ii < 8; ii++ {\n\t\tif block[ii] != 0xA6 {\n\t\t\treturn nil, ErrUnwrapFailed\n\t\t}\n\t}\n\n\t// - For i = 1 to n\n\t// -   P[i] = R[i]\n\treturn intermediate, nil\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/armor/armor.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package armor implements OpenPGP ASCII Armor, see RFC 4880. OpenPGP Armor is\n// very similar to PEM except that it has an additional CRC checksum.\npackage armor // import \"github.com/ProtonMail/go-crypto/openpgp/armor\"\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"encoding/base64\"\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n)\n\n// A Block represents an OpenPGP armored structure.\n//\n// The encoded form is:\n//\n//\t-----BEGIN Type-----\n//\tHeaders\n//\n//\tbase64-encoded Bytes\n//\t'=' base64 encoded checksum (optional) not checked anymore\n//\t-----END Type-----\n//\n// where Headers is a possibly empty sequence of Key: Value lines.\n//\n// Since the armored data can be very large, this package presents a streaming\n// interface.\ntype Block struct {\n\tType    string            // The type, taken from the preamble (i.e. \"PGP SIGNATURE\").\n\tHeader  map[string]string // Optional headers.\n\tBody    io.Reader         // A Reader from which the contents can be read\n\tlReader lineReader\n\toReader openpgpReader\n}\n\nvar ArmorCorrupt error = errors.StructuralError(\"armor invalid\")\n\nvar armorStart = []byte(\"-----BEGIN \")\nvar armorEnd = []byte(\"-----END \")\nvar armorEndOfLine = []byte(\"-----\")\n\n// lineReader wraps a line based reader. It watches for the end of an armor block\ntype lineReader struct {\n\tin  *bufio.Reader\n\tbuf []byte\n\teof bool\n}\n\nfunc (l *lineReader) Read(p []byte) (n int, err error) {\n\tif l.eof {\n\t\treturn 0, io.EOF\n\t}\n\n\tif len(l.buf) > 0 {\n\t\tn = copy(p, l.buf)\n\t\tl.buf = l.buf[n:]\n\t\treturn\n\t}\n\n\tline, isPrefix, err := l.in.ReadLine()\n\tif err != nil {\n\t\treturn\n\t}\n\tif isPrefix {\n\t\treturn 0, ArmorCorrupt\n\t}\n\n\tif bytes.HasPrefix(line, armorEnd) {\n\t\tl.eof = true\n\t\treturn 0, io.EOF\n\t}\n\n\tif len(line) == 5 && line[0] == '=' {\n\t\t// This is the checksum line\n\t\t// Don't check the checksum\n\n\t\tl.eof = true\n\t\treturn 0, io.EOF\n\t}\n\n\tif len(line) > 96 {\n\t\treturn 0, ArmorCorrupt\n\t}\n\n\tn = copy(p, line)\n\tbytesToSave := len(line) - n\n\tif bytesToSave > 0 {\n\t\tif cap(l.buf) < bytesToSave {\n\t\t\tl.buf = make([]byte, 0, bytesToSave)\n\t\t}\n\t\tl.buf = l.buf[0:bytesToSave]\n\t\tcopy(l.buf, line[n:])\n\t}\n\n\treturn\n}\n\n// openpgpReader passes Read calls to the underlying base64 decoder.\ntype openpgpReader struct {\n\tlReader   *lineReader\n\tb64Reader io.Reader\n}\n\nfunc (r *openpgpReader) Read(p []byte) (n int, err error) {\n\tn, err = r.b64Reader.Read(p)\n\treturn\n}\n\n// Decode reads a PGP armored block from the given Reader. It will ignore\n// leading garbage. If it doesn't find a block, it will return nil, io.EOF. The\n// given Reader is not usable after calling this function: an arbitrary amount\n// of data may have been read past the end of the block.\nfunc Decode(in io.Reader) (p *Block, err error) {\n\tr := bufio.NewReaderSize(in, 100)\n\tvar line []byte\n\tignoreNext := false\n\nTryNextBlock:\n\tp = nil\n\n\t// Skip leading garbage\n\tfor {\n\t\tignoreThis := ignoreNext\n\t\tline, ignoreNext, err = r.ReadLine()\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tif ignoreNext || ignoreThis {\n\t\t\tcontinue\n\t\t}\n\t\tline = bytes.TrimSpace(line)\n\t\tif len(line) > len(armorStart)+len(armorEndOfLine) && bytes.HasPrefix(line, armorStart) {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tp = new(Block)\n\tp.Type = string(line[len(armorStart) : len(line)-len(armorEndOfLine)])\n\tp.Header = make(map[string]string)\n\tnextIsContinuation := false\n\tvar lastKey string\n\n\t// Read headers\n\tfor {\n\t\tisContinuation := nextIsContinuation\n\t\tline, nextIsContinuation, err = r.ReadLine()\n\t\tif err != nil {\n\t\t\tp = nil\n\t\t\treturn\n\t\t}\n\t\tif isContinuation {\n\t\t\tp.Header[lastKey] += string(line)\n\t\t\tcontinue\n\t\t}\n\t\tline = bytes.TrimSpace(line)\n\t\tif len(line) == 0 {\n\t\t\tbreak\n\t\t}\n\n\t\ti := bytes.Index(line, []byte(\":\"))\n\t\tif i == -1 {\n\t\t\tgoto TryNextBlock\n\t\t}\n\t\tlastKey = string(line[:i])\n\t\tvar value string\n\t\tif len(line) > i+2 {\n\t\t\tvalue = string(line[i+2:])\n\t\t}\n\t\tp.Header[lastKey] = value\n\t}\n\n\tp.lReader.in = r\n\tp.oReader.lReader = &p.lReader\n\tp.oReader.b64Reader = base64.NewDecoder(base64.StdEncoding, &p.lReader)\n\tp.Body = &p.oReader\n\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/armor/encode.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage armor\n\nimport (\n\t\"encoding/base64\"\n\t\"io\"\n\t\"sort\"\n)\n\nvar armorHeaderSep = []byte(\": \")\nvar blockEnd = []byte(\"\\n=\")\nvar newline = []byte(\"\\n\")\nvar armorEndOfLineOut = []byte(\"-----\\n\")\n\nconst crc24Init = 0xb704ce\nconst crc24Poly = 0x1864cfb\n\n// crc24 calculates the OpenPGP checksum as specified in RFC 4880, section 6.1\nfunc crc24(crc uint32, d []byte) uint32 {\n\tfor _, b := range d {\n\t\tcrc ^= uint32(b) << 16\n\t\tfor i := 0; i < 8; i++ {\n\t\t\tcrc <<= 1\n\t\t\tif crc&0x1000000 != 0 {\n\t\t\t\tcrc ^= crc24Poly\n\t\t\t}\n\t\t}\n\t}\n\treturn crc\n}\n\n// writeSlices writes its arguments to the given Writer.\nfunc writeSlices(out io.Writer, slices ...[]byte) (err error) {\n\tfor _, s := range slices {\n\t\t_, err = out.Write(s)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn\n}\n\n// lineBreaker breaks data across several lines, all of the same byte length\n// (except possibly the last). Lines are broken with a single '\\n'.\ntype lineBreaker struct {\n\tlineLength  int\n\tline        []byte\n\tused        int\n\tout         io.Writer\n\thaveWritten bool\n}\n\nfunc newLineBreaker(out io.Writer, lineLength int) *lineBreaker {\n\treturn &lineBreaker{\n\t\tlineLength: lineLength,\n\t\tline:       make([]byte, lineLength),\n\t\tused:       0,\n\t\tout:        out,\n\t}\n}\n\nfunc (l *lineBreaker) Write(b []byte) (n int, err error) {\n\tn = len(b)\n\n\tif n == 0 {\n\t\treturn\n\t}\n\n\tif l.used == 0 && l.haveWritten {\n\t\t_, err = l.out.Write([]byte{'\\n'})\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\tif l.used+len(b) < l.lineLength {\n\t\tl.used += copy(l.line[l.used:], b)\n\t\treturn\n\t}\n\n\tl.haveWritten = true\n\t_, err = l.out.Write(l.line[0:l.used])\n\tif err != nil {\n\t\treturn\n\t}\n\texcess := l.lineLength - l.used\n\tl.used = 0\n\n\t_, err = l.out.Write(b[0:excess])\n\tif err != nil {\n\t\treturn\n\t}\n\n\t_, err = l.Write(b[excess:])\n\treturn\n}\n\nfunc (l *lineBreaker) Close() (err error) {\n\tif l.used > 0 {\n\t\t_, err = l.out.Write(l.line[0:l.used])\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\n// encoding keeps track of a running CRC24 over the data which has been written\n// to it and outputs a OpenPGP checksum when closed, followed by an armor\n// trailer.\n//\n// It's built into a stack of io.Writers:\n//\n//\tencoding -> base64 encoder -> lineBreaker -> out\ntype encoding struct {\n\tout        io.Writer\n\tbreaker    *lineBreaker\n\tb64        io.WriteCloser\n\tcrc        uint32\n\tcrcEnabled bool\n\tblockType  []byte\n}\n\nfunc (e *encoding) Write(data []byte) (n int, err error) {\n\tif e.crcEnabled {\n\t\te.crc = crc24(e.crc, data)\n\t}\n\treturn e.b64.Write(data)\n}\n\nfunc (e *encoding) Close() (err error) {\n\terr = e.b64.Close()\n\tif err != nil {\n\t\treturn\n\t}\n\te.breaker.Close()\n\n\tif e.crcEnabled {\n\t\tvar checksumBytes [3]byte\n\t\tchecksumBytes[0] = byte(e.crc >> 16)\n\t\tchecksumBytes[1] = byte(e.crc >> 8)\n\t\tchecksumBytes[2] = byte(e.crc)\n\n\t\tvar b64ChecksumBytes [4]byte\n\t\tbase64.StdEncoding.Encode(b64ChecksumBytes[:], checksumBytes[:])\n\n\t\treturn writeSlices(e.out, blockEnd, b64ChecksumBytes[:], newline, armorEnd, e.blockType, armorEndOfLine)\n\t}\n\treturn writeSlices(e.out, newline, armorEnd, e.blockType, armorEndOfLine)\n}\n\nfunc encode(out io.Writer, blockType string, headers map[string]string, checksum bool) (w io.WriteCloser, err error) {\n\tbType := []byte(blockType)\n\terr = writeSlices(out, armorStart, bType, armorEndOfLineOut)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tkeys := make([]string, len(headers))\n\ti := 0\n\tfor k := range headers {\n\t\tkeys[i] = k\n\t\ti++\n\t}\n\tsort.Strings(keys)\n\tfor _, k := range keys {\n\t\terr = writeSlices(out, []byte(k), armorHeaderSep, []byte(headers[k]), newline)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\t_, err = out.Write(newline)\n\tif err != nil {\n\t\treturn\n\t}\n\n\te := &encoding{\n\t\tout:        out,\n\t\tbreaker:    newLineBreaker(out, 64),\n\t\tblockType:  bType,\n\t\tcrc:        crc24Init,\n\t\tcrcEnabled: checksum,\n\t}\n\te.b64 = base64.NewEncoder(base64.StdEncoding, e.breaker)\n\treturn e, nil\n}\n\n// Encode returns a WriteCloser which will encode the data written to it in\n// OpenPGP armor.\nfunc Encode(out io.Writer, blockType string, headers map[string]string) (w io.WriteCloser, err error) {\n\treturn encode(out, blockType, headers, true)\n}\n\n// EncodeWithChecksumOption returns a WriteCloser which will encode the data written to it in\n// OpenPGP armor and provides the option to include a checksum.\n// When forming ASCII Armor, the CRC24 footer SHOULD NOT be generated,\n// unless interoperability with implementations that require the CRC24 footer\n// to be present is a concern.\nfunc EncodeWithChecksumOption(out io.Writer, blockType string, headers map[string]string, doChecksum bool) (w io.WriteCloser, err error) {\n\treturn encode(out, blockType, headers, doChecksum)\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/canonical_text.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage openpgp\n\nimport (\n\t\"hash\"\n\t\"io\"\n)\n\n// NewCanonicalTextHash reformats text written to it into the canonical\n// form and then applies the hash h.  See RFC 4880, section 5.2.1.\nfunc NewCanonicalTextHash(h hash.Hash) hash.Hash {\n\treturn &canonicalTextHash{h, 0}\n}\n\ntype canonicalTextHash struct {\n\th hash.Hash\n\ts int\n}\n\nvar newline = []byte{'\\r', '\\n'}\n\nfunc writeCanonical(cw io.Writer, buf []byte, s *int) (int, error) {\n\tstart := 0\n\tfor i, c := range buf {\n\t\tswitch *s {\n\t\tcase 0:\n\t\t\tif c == '\\r' {\n\t\t\t\t*s = 1\n\t\t\t} else if c == '\\n' {\n\t\t\t\tif _, err := cw.Write(buf[start:i]); err != nil {\n\t\t\t\t\treturn 0, err\n\t\t\t\t}\n\t\t\t\tif _, err := cw.Write(newline); err != nil {\n\t\t\t\t\treturn 0, err\n\t\t\t\t}\n\t\t\t\tstart = i + 1\n\t\t\t}\n\t\tcase 1:\n\t\t\t*s = 0\n\t\t}\n\t}\n\n\tif _, err := cw.Write(buf[start:]); err != nil {\n\t\treturn 0, err\n\t}\n\treturn len(buf), nil\n}\n\nfunc (cth *canonicalTextHash) Write(buf []byte) (int, error) {\n\treturn writeCanonical(cth.h, buf, &cth.s)\n}\n\nfunc (cth *canonicalTextHash) Sum(in []byte) []byte {\n\treturn cth.h.Sum(in)\n}\n\nfunc (cth *canonicalTextHash) Reset() {\n\tcth.h.Reset()\n\tcth.s = 0\n}\n\nfunc (cth *canonicalTextHash) Size() int {\n\treturn cth.h.Size()\n}\n\nfunc (cth *canonicalTextHash) BlockSize() int {\n\treturn cth.h.BlockSize()\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/ecdh/ecdh.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package ecdh implements ECDH encryption, suitable for OpenPGP,\n// as specified in RFC 6637, section 8.\npackage ecdh\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/aes/keywrap\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/algorithm\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/ecc\"\n)\n\ntype KDF struct {\n\tHash   algorithm.Hash\n\tCipher algorithm.Cipher\n}\n\ntype PublicKey struct {\n\tcurve ecc.ECDHCurve\n\tPoint []byte\n\tKDF\n}\n\ntype PrivateKey struct {\n\tPublicKey\n\tD []byte\n}\n\nfunc NewPublicKey(curve ecc.ECDHCurve, kdfHash algorithm.Hash, kdfCipher algorithm.Cipher) *PublicKey {\n\treturn &PublicKey{\n\t\tcurve: curve,\n\t\tKDF: KDF{\n\t\t\tHash:   kdfHash,\n\t\t\tCipher: kdfCipher,\n\t\t},\n\t}\n}\n\nfunc NewPrivateKey(key PublicKey) *PrivateKey {\n\treturn &PrivateKey{\n\t\tPublicKey: key,\n\t}\n}\n\nfunc (pk *PublicKey) GetCurve() ecc.ECDHCurve {\n\treturn pk.curve\n}\n\nfunc (pk *PublicKey) MarshalPoint() []byte {\n\treturn pk.curve.MarshalBytePoint(pk.Point)\n}\n\nfunc (pk *PublicKey) UnmarshalPoint(p []byte) error {\n\tpk.Point = pk.curve.UnmarshalBytePoint(p)\n\tif pk.Point == nil {\n\t\treturn errors.New(\"ecdh: failed to parse EC point\")\n\t}\n\treturn nil\n}\n\nfunc (sk *PrivateKey) MarshalByteSecret() []byte {\n\treturn sk.curve.MarshalByteSecret(sk.D)\n}\n\nfunc (sk *PrivateKey) UnmarshalByteSecret(d []byte) error {\n\tsk.D = sk.curve.UnmarshalByteSecret(d)\n\n\tif sk.D == nil {\n\t\treturn errors.New(\"ecdh: failed to parse scalar\")\n\t}\n\treturn nil\n}\n\nfunc GenerateKey(rand io.Reader, c ecc.ECDHCurve, kdf KDF) (priv *PrivateKey, err error) {\n\tpriv = new(PrivateKey)\n\tpriv.PublicKey.curve = c\n\tpriv.PublicKey.KDF = kdf\n\tpriv.PublicKey.Point, priv.D, err = c.GenerateECDH(rand)\n\treturn\n}\n\nfunc Encrypt(random io.Reader, pub *PublicKey, msg, curveOID, fingerprint []byte) (vsG, c []byte, err error) {\n\tif len(msg) > 40 {\n\t\treturn nil, nil, errors.New(\"ecdh: message too long\")\n\t}\n\t// the sender MAY use 21, 13, and 5 bytes of padding for AES-128,\n\t// AES-192, and AES-256, respectively, to provide the same number of\n\t// octets, 40 total, as an input to the key wrapping method.\n\tpadding := make([]byte, 40-len(msg))\n\tfor i := range padding {\n\t\tpadding[i] = byte(40 - len(msg))\n\t}\n\tm := append(msg, padding...)\n\n\tephemeral, zb, err := pub.curve.Encaps(random, pub.Point)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tvsG = pub.curve.MarshalBytePoint(ephemeral)\n\n\tz, err := buildKey(pub, zb, curveOID, fingerprint, false, false)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tif c, err = keywrap.Wrap(z, m); err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\treturn vsG, c, nil\n\n}\n\nfunc Decrypt(priv *PrivateKey, vsG, c, curveOID, fingerprint []byte) (msg []byte, err error) {\n\tvar m []byte\n\tzb, err := priv.PublicKey.curve.Decaps(priv.curve.UnmarshalBytePoint(vsG), priv.D)\n\n\t// Try buildKey three times to workaround an old bug, see comments in buildKey.\n\tfor i := 0; i < 3; i++ {\n\t\tvar z []byte\n\t\t// RFC6637 §8: \"Compute Z = KDF( S, Z_len, Param );\"\n\t\tz, err = buildKey(&priv.PublicKey, zb, curveOID, fingerprint, i == 1, i == 2)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// RFC6637 §8: \"Compute C = AESKeyWrap( Z, c ) as per [RFC3394]\"\n\t\tm, err = keywrap.Unwrap(z, c)\n\t\tif err == nil {\n\t\t\tbreak\n\t\t}\n\t}\n\n\t// Only return an error after we've tried all (required) variants of buildKey.\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// RFC6637 §8: \"m = symm_alg_ID || session key || checksum || pkcs5_padding\"\n\t// The last byte should be the length of the padding, as per PKCS5; strip it off.\n\treturn m[:len(m)-int(m[len(m)-1])], nil\n}\n\nfunc buildKey(pub *PublicKey, zb []byte, curveOID, fingerprint []byte, stripLeading, stripTrailing bool) ([]byte, error) {\n\t// Param = curve_OID_len || curve_OID || public_key_alg_ID || 03\n\t//         || 01 || KDF_hash_ID || KEK_alg_ID for AESKeyWrap\n\t//         || \"Anonymous Sender    \" || recipient_fingerprint;\n\tparam := new(bytes.Buffer)\n\tif _, err := param.Write(curveOID); err != nil {\n\t\treturn nil, err\n\t}\n\talgKDF := []byte{18, 3, 1, pub.KDF.Hash.Id(), pub.KDF.Cipher.Id()}\n\tif _, err := param.Write(algKDF); err != nil {\n\t\treturn nil, err\n\t}\n\tif _, err := param.Write([]byte(\"Anonymous Sender    \")); err != nil {\n\t\treturn nil, err\n\t}\n\tif _, err := param.Write(fingerprint[:]); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// MB = Hash ( 00 || 00 || 00 || 01 || ZB || Param );\n\th := pub.KDF.Hash.New()\n\tif _, err := h.Write([]byte{0x0, 0x0, 0x0, 0x1}); err != nil {\n\t\treturn nil, err\n\t}\n\tzbLen := len(zb)\n\ti := 0\n\tj := zbLen - 1\n\tif stripLeading {\n\t\t// Work around old go crypto bug where the leading zeros are missing.\n\t\tfor i < zbLen && zb[i] == 0 {\n\t\t\ti++\n\t\t}\n\t}\n\tif stripTrailing {\n\t\t// Work around old OpenPGP.js bug where insignificant trailing zeros in\n\t\t// this little-endian number are missing.\n\t\t// (See https://github.com/openpgpjs/openpgpjs/pull/853.)\n\t\tfor j >= 0 && zb[j] == 0 {\n\t\t\tj--\n\t\t}\n\t}\n\tif _, err := h.Write(zb[i : j+1]); err != nil {\n\t\treturn nil, err\n\t}\n\tif _, err := h.Write(param.Bytes()); err != nil {\n\t\treturn nil, err\n\t}\n\tmb := h.Sum(nil)\n\n\treturn mb[:pub.KDF.Cipher.KeySize()], nil // return oBits leftmost bits of MB.\n\n}\n\nfunc Validate(priv *PrivateKey) error {\n\treturn priv.curve.ValidateECDH(priv.Point, priv.D)\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/ecdsa/ecdsa.go",
    "content": "// Package ecdsa implements ECDSA signature, suitable for OpenPGP,\n// as specified in RFC 6637, section 5.\npackage ecdsa\n\nimport (\n\t\"errors\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/ecc\"\n\t\"io\"\n\t\"math/big\"\n)\n\ntype PublicKey struct {\n\tX, Y  *big.Int\n\tcurve ecc.ECDSACurve\n}\n\ntype PrivateKey struct {\n\tPublicKey\n\tD *big.Int\n}\n\nfunc NewPublicKey(curve ecc.ECDSACurve) *PublicKey {\n\treturn &PublicKey{\n\t\tcurve: curve,\n\t}\n}\n\nfunc NewPrivateKey(key PublicKey) *PrivateKey {\n\treturn &PrivateKey{\n\t\tPublicKey: key,\n\t}\n}\n\nfunc (pk *PublicKey) GetCurve() ecc.ECDSACurve {\n\treturn pk.curve\n}\n\nfunc (pk *PublicKey) MarshalPoint() []byte {\n\treturn pk.curve.MarshalIntegerPoint(pk.X, pk.Y)\n}\n\nfunc (pk *PublicKey) UnmarshalPoint(p []byte) error {\n\tpk.X, pk.Y = pk.curve.UnmarshalIntegerPoint(p)\n\tif pk.X == nil {\n\t\treturn errors.New(\"ecdsa: failed to parse EC point\")\n\t}\n\treturn nil\n}\n\nfunc (sk *PrivateKey) MarshalIntegerSecret() []byte {\n\treturn sk.curve.MarshalIntegerSecret(sk.D)\n}\n\nfunc (sk *PrivateKey) UnmarshalIntegerSecret(d []byte) error {\n\tsk.D = sk.curve.UnmarshalIntegerSecret(d)\n\n\tif sk.D == nil {\n\t\treturn errors.New(\"ecdsa: failed to parse scalar\")\n\t}\n\treturn nil\n}\n\nfunc GenerateKey(rand io.Reader, c ecc.ECDSACurve) (priv *PrivateKey, err error) {\n\tpriv = new(PrivateKey)\n\tpriv.PublicKey.curve = c\n\tpriv.PublicKey.X, priv.PublicKey.Y, priv.D, err = c.GenerateECDSA(rand)\n\treturn\n}\n\nfunc Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err error) {\n\treturn priv.PublicKey.curve.Sign(rand, priv.X, priv.Y, priv.D, hash)\n}\n\nfunc Verify(pub *PublicKey, hash []byte, r, s *big.Int) bool {\n\treturn pub.curve.Verify(pub.X, pub.Y, hash, r, s)\n}\n\nfunc Validate(priv *PrivateKey) error {\n\treturn priv.curve.ValidateECDSA(priv.X, priv.Y, priv.D.Bytes())\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/ed25519/ed25519.go",
    "content": "// Package ed25519 implements the ed25519 signature algorithm for OpenPGP\n// as defined in the Open PGP crypto refresh.\npackage ed25519\n\nimport (\n\t\"crypto/subtle\"\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\ted25519lib \"github.com/cloudflare/circl/sign/ed25519\"\n)\n\nconst (\n\t// PublicKeySize is the size, in bytes, of public keys in this package.\n\tPublicKeySize = ed25519lib.PublicKeySize\n\t// SeedSize is the size, in bytes, of private key seeds.\n\t// The private key representation used by RFC 8032.\n\tSeedSize = ed25519lib.SeedSize\n\t// SignatureSize is the size, in bytes, of signatures generated and verified by this package.\n\tSignatureSize = ed25519lib.SignatureSize\n)\n\ntype PublicKey struct {\n\t// Point represents the elliptic curve point of the public key.\n\tPoint []byte\n}\n\ntype PrivateKey struct {\n\tPublicKey\n\t// Key the private key representation by RFC 8032,\n\t// encoded as seed | pub key point.\n\tKey []byte\n}\n\n// NewPublicKey creates a new empty ed25519 public key.\nfunc NewPublicKey() *PublicKey {\n\treturn &PublicKey{}\n}\n\n// NewPrivateKey creates a new empty private key referencing the public key.\nfunc NewPrivateKey(key PublicKey) *PrivateKey {\n\treturn &PrivateKey{\n\t\tPublicKey: key,\n\t}\n}\n\n// Seed returns the ed25519 private key secret seed.\n// The private key representation by RFC 8032.\nfunc (pk *PrivateKey) Seed() []byte {\n\treturn pk.Key[:SeedSize]\n}\n\n// MarshalByteSecret returns the underlying 32 byte seed of the private key.\nfunc (pk *PrivateKey) MarshalByteSecret() []byte {\n\treturn pk.Seed()\n}\n\n// UnmarshalByteSecret computes the private key from the secret seed\n// and stores it in the private key object.\nfunc (sk *PrivateKey) UnmarshalByteSecret(seed []byte) error {\n\tsk.Key = ed25519lib.NewKeyFromSeed(seed)\n\treturn nil\n}\n\n// GenerateKey generates a fresh private key with the provided randomness source.\nfunc GenerateKey(rand io.Reader) (*PrivateKey, error) {\n\tpublicKey, privateKey, err := ed25519lib.GenerateKey(rand)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tprivateKeyOut := new(PrivateKey)\n\tprivateKeyOut.PublicKey.Point = publicKey[:]\n\tprivateKeyOut.Key = privateKey[:]\n\treturn privateKeyOut, nil\n}\n\n// Sign signs a message with the ed25519 algorithm.\n// priv MUST be a valid key! Check this with Validate() before use.\nfunc Sign(priv *PrivateKey, message []byte) ([]byte, error) {\n\treturn ed25519lib.Sign(priv.Key, message), nil\n}\n\n// Verify verifies an ed25519 signature.\nfunc Verify(pub *PublicKey, message []byte, signature []byte) bool {\n\treturn ed25519lib.Verify(pub.Point, message, signature)\n}\n\n// Validate checks if the ed25519 private key is valid.\nfunc Validate(priv *PrivateKey) error {\n\texpectedPrivateKey := ed25519lib.NewKeyFromSeed(priv.Seed())\n\tif subtle.ConstantTimeCompare(priv.Key, expectedPrivateKey) == 0 {\n\t\treturn errors.KeyInvalidError(\"ed25519: invalid ed25519 secret\")\n\t}\n\tif subtle.ConstantTimeCompare(priv.PublicKey.Point, expectedPrivateKey[SeedSize:]) == 0 {\n\t\treturn errors.KeyInvalidError(\"ed25519: invalid ed25519 public key\")\n\t}\n\treturn nil\n}\n\n// ENCODING/DECODING signature:\n\n// WriteSignature encodes and writes an ed25519 signature to writer.\nfunc WriteSignature(writer io.Writer, signature []byte) error {\n\t_, err := writer.Write(signature)\n\treturn err\n}\n\n// ReadSignature decodes an ed25519 signature from a reader.\nfunc ReadSignature(reader io.Reader) ([]byte, error) {\n\tsignature := make([]byte, SignatureSize)\n\tif _, err := io.ReadFull(reader, signature); err != nil {\n\t\treturn nil, err\n\t}\n\treturn signature, nil\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/ed448/ed448.go",
    "content": "// Package ed448 implements the ed448 signature algorithm for OpenPGP\n// as defined in the Open PGP crypto refresh.\npackage ed448\n\nimport (\n\t\"crypto/subtle\"\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\ted448lib \"github.com/cloudflare/circl/sign/ed448\"\n)\n\nconst (\n\t// PublicKeySize is the size, in bytes, of public keys in this package.\n\tPublicKeySize = ed448lib.PublicKeySize\n\t// SeedSize is the size, in bytes, of private key seeds.\n\t// The private key representation used by RFC 8032.\n\tSeedSize = ed448lib.SeedSize\n\t// SignatureSize is the size, in bytes, of signatures generated and verified by this package.\n\tSignatureSize = ed448lib.SignatureSize\n)\n\ntype PublicKey struct {\n\t// Point represents the elliptic curve point of the public key.\n\tPoint []byte\n}\n\ntype PrivateKey struct {\n\tPublicKey\n\t// Key the private key representation by RFC 8032,\n\t// encoded as seed | public key point.\n\tKey []byte\n}\n\n// NewPublicKey creates a new empty ed448 public key.\nfunc NewPublicKey() *PublicKey {\n\treturn &PublicKey{}\n}\n\n// NewPrivateKey creates a new empty private key referencing the public key.\nfunc NewPrivateKey(key PublicKey) *PrivateKey {\n\treturn &PrivateKey{\n\t\tPublicKey: key,\n\t}\n}\n\n// Seed returns the ed448 private key secret seed.\n// The private key representation by RFC 8032.\nfunc (pk *PrivateKey) Seed() []byte {\n\treturn pk.Key[:SeedSize]\n}\n\n// MarshalByteSecret returns the underlying seed of the private key.\nfunc (pk *PrivateKey) MarshalByteSecret() []byte {\n\treturn pk.Seed()\n}\n\n// UnmarshalByteSecret computes the private key from the secret seed\n// and stores it in the private key object.\nfunc (sk *PrivateKey) UnmarshalByteSecret(seed []byte) error {\n\tsk.Key = ed448lib.NewKeyFromSeed(seed)\n\treturn nil\n}\n\n// GenerateKey generates a fresh private key with the provided randomness source.\nfunc GenerateKey(rand io.Reader) (*PrivateKey, error) {\n\tpublicKey, privateKey, err := ed448lib.GenerateKey(rand)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tprivateKeyOut := new(PrivateKey)\n\tprivateKeyOut.PublicKey.Point = publicKey[:]\n\tprivateKeyOut.Key = privateKey[:]\n\treturn privateKeyOut, nil\n}\n\n// Sign signs a message with the ed448 algorithm.\n// priv MUST be a valid key! Check this with Validate() before use.\nfunc Sign(priv *PrivateKey, message []byte) ([]byte, error) {\n\t// Ed448 is used with the empty string as a context string.\n\t// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-08#section-13.7\n\treturn ed448lib.Sign(priv.Key, message, \"\"), nil\n}\n\n// Verify verifies a ed448 signature\nfunc Verify(pub *PublicKey, message []byte, signature []byte) bool {\n\t// Ed448 is used with the empty string as a context string.\n\t// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-08#section-13.7\n\treturn ed448lib.Verify(pub.Point, message, signature, \"\")\n}\n\n// Validate checks if the ed448 private key is valid\nfunc Validate(priv *PrivateKey) error {\n\texpectedPrivateKey := ed448lib.NewKeyFromSeed(priv.Seed())\n\tif subtle.ConstantTimeCompare(priv.Key, expectedPrivateKey) == 0 {\n\t\treturn errors.KeyInvalidError(\"ed448: invalid ed448 secret\")\n\t}\n\tif subtle.ConstantTimeCompare(priv.PublicKey.Point, expectedPrivateKey[SeedSize:]) == 0 {\n\t\treturn errors.KeyInvalidError(\"ed448: invalid ed448 public key\")\n\t}\n\treturn nil\n}\n\n// ENCODING/DECODING signature:\n\n// WriteSignature encodes and writes an ed448 signature to writer.\nfunc WriteSignature(writer io.Writer, signature []byte) error {\n\t_, err := writer.Write(signature)\n\treturn err\n}\n\n// ReadSignature decodes an ed448 signature from a reader.\nfunc ReadSignature(reader io.Reader) ([]byte, error) {\n\tsignature := make([]byte, SignatureSize)\n\tif _, err := io.ReadFull(reader, signature); err != nil {\n\t\treturn nil, err\n\t}\n\treturn signature, nil\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/eddsa/eddsa.go",
    "content": "// Package eddsa implements EdDSA signature, suitable for OpenPGP, as specified in\n// https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-13.7\npackage eddsa\n\nimport (\n\t\"errors\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/ecc\"\n\t\"io\"\n)\n\ntype PublicKey struct {\n\tX     []byte\n\tcurve ecc.EdDSACurve\n}\n\ntype PrivateKey struct {\n\tPublicKey\n\tD []byte\n}\n\nfunc NewPublicKey(curve ecc.EdDSACurve) *PublicKey {\n\treturn &PublicKey{\n\t\tcurve: curve,\n\t}\n}\n\nfunc NewPrivateKey(key PublicKey) *PrivateKey {\n\treturn &PrivateKey{\n\t\tPublicKey: key,\n\t}\n}\n\nfunc (pk *PublicKey) GetCurve() ecc.EdDSACurve {\n\treturn pk.curve\n}\n\nfunc (pk *PublicKey) MarshalPoint() []byte {\n\treturn pk.curve.MarshalBytePoint(pk.X)\n}\n\nfunc (pk *PublicKey) UnmarshalPoint(x []byte) error {\n\tpk.X = pk.curve.UnmarshalBytePoint(x)\n\n\tif pk.X == nil {\n\t\treturn errors.New(\"eddsa: failed to parse EC point\")\n\t}\n\treturn nil\n}\n\nfunc (sk *PrivateKey) MarshalByteSecret() []byte {\n\treturn sk.curve.MarshalByteSecret(sk.D)\n}\n\nfunc (sk *PrivateKey) UnmarshalByteSecret(d []byte) error {\n\tsk.D = sk.curve.UnmarshalByteSecret(d)\n\n\tif sk.D == nil {\n\t\treturn errors.New(\"eddsa: failed to parse scalar\")\n\t}\n\treturn nil\n}\n\nfunc GenerateKey(rand io.Reader, c ecc.EdDSACurve) (priv *PrivateKey, err error) {\n\tpriv = new(PrivateKey)\n\tpriv.PublicKey.curve = c\n\tpriv.PublicKey.X, priv.D, err = c.GenerateEdDSA(rand)\n\treturn\n}\n\nfunc Sign(priv *PrivateKey, message []byte) (r, s []byte, err error) {\n\tsig, err := priv.PublicKey.curve.Sign(priv.PublicKey.X, priv.D, message)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tr, s = priv.PublicKey.curve.MarshalSignature(sig)\n\treturn\n}\n\nfunc Verify(pub *PublicKey, message, r, s []byte) bool {\n\tsig := pub.curve.UnmarshalSignature(r, s)\n\tif sig == nil {\n\t\treturn false\n\t}\n\n\treturn pub.curve.Verify(pub.X, message, sig)\n}\n\nfunc Validate(priv *PrivateKey) error {\n\treturn priv.curve.ValidateEdDSA(priv.PublicKey.X, priv.D)\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/elgamal/elgamal.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package elgamal implements ElGamal encryption, suitable for OpenPGP,\n// as specified in \"A Public-Key Cryptosystem and a Signature Scheme Based on\n// Discrete Logarithms,\" IEEE Transactions on Information Theory, v. IT-31,\n// n. 4, 1985, pp. 469-472.\n//\n// This form of ElGamal embeds PKCS#1 v1.5 padding, which may make it\n// unsuitable for other protocols. RSA should be used in preference in any\n// case.\npackage elgamal // import \"github.com/ProtonMail/go-crypto/openpgp/elgamal\"\n\nimport (\n\t\"crypto/rand\"\n\t\"crypto/subtle\"\n\t\"errors\"\n\t\"io\"\n\t\"math/big\"\n)\n\n// PublicKey represents an ElGamal public key.\ntype PublicKey struct {\n\tG, P, Y *big.Int\n}\n\n// PrivateKey represents an ElGamal private key.\ntype PrivateKey struct {\n\tPublicKey\n\tX *big.Int\n}\n\n// Encrypt encrypts the given message to the given public key. The result is a\n// pair of integers. Errors can result from reading random, or because msg is\n// too large to be encrypted to the public key.\nfunc Encrypt(random io.Reader, pub *PublicKey, msg []byte) (c1, c2 *big.Int, err error) {\n\tpLen := (pub.P.BitLen() + 7) / 8\n\tif len(msg) > pLen-11 {\n\t\terr = errors.New(\"elgamal: message too long\")\n\t\treturn\n\t}\n\n\t// EM = 0x02 || PS || 0x00 || M\n\tem := make([]byte, pLen-1)\n\tem[0] = 2\n\tps, mm := em[1:len(em)-len(msg)-1], em[len(em)-len(msg):]\n\terr = nonZeroRandomBytes(ps, random)\n\tif err != nil {\n\t\treturn\n\t}\n\tem[len(em)-len(msg)-1] = 0\n\tcopy(mm, msg)\n\n\tm := new(big.Int).SetBytes(em)\n\n\tk, err := rand.Int(random, pub.P)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tc1 = new(big.Int).Exp(pub.G, k, pub.P)\n\ts := new(big.Int).Exp(pub.Y, k, pub.P)\n\tc2 = s.Mul(s, m)\n\tc2.Mod(c2, pub.P)\n\n\treturn\n}\n\n// Decrypt takes two integers, resulting from an ElGamal encryption, and\n// returns the plaintext of the message. An error can result only if the\n// ciphertext is invalid. Users should keep in mind that this is a padding\n// oracle and thus, if exposed to an adaptive chosen ciphertext attack, can\n// be used to break the cryptosystem.  See “Chosen Ciphertext Attacks\n// Against Protocols Based on the RSA Encryption Standard PKCS #1”, Daniel\n// Bleichenbacher, Advances in Cryptology (Crypto '98),\nfunc Decrypt(priv *PrivateKey, c1, c2 *big.Int) (msg []byte, err error) {\n\ts := new(big.Int).Exp(c1, priv.X, priv.P)\n\tif s.ModInverse(s, priv.P) == nil {\n\t\treturn nil, errors.New(\"elgamal: invalid private key\")\n\t}\n\ts.Mul(s, c2)\n\ts.Mod(s, priv.P)\n\tem := s.Bytes()\n\n\tfirstByteIsTwo := subtle.ConstantTimeByteEq(em[0], 2)\n\n\t// The remainder of the plaintext must be a string of non-zero random\n\t// octets, followed by a 0, followed by the message.\n\t//   lookingForIndex: 1 iff we are still looking for the zero.\n\t//   index: the offset of the first zero byte.\n\tvar lookingForIndex, index int\n\tlookingForIndex = 1\n\n\tfor i := 1; i < len(em); i++ {\n\t\tequals0 := subtle.ConstantTimeByteEq(em[i], 0)\n\t\tindex = subtle.ConstantTimeSelect(lookingForIndex&equals0, i, index)\n\t\tlookingForIndex = subtle.ConstantTimeSelect(equals0, 0, lookingForIndex)\n\t}\n\n\tif firstByteIsTwo != 1 || lookingForIndex != 0 || index < 9 {\n\t\treturn nil, errors.New(\"elgamal: decryption error\")\n\t}\n\treturn em[index+1:], nil\n}\n\n// nonZeroRandomBytes fills the given slice with non-zero random octets.\nfunc nonZeroRandomBytes(s []byte, rand io.Reader) (err error) {\n\t_, err = io.ReadFull(rand, s)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tfor i := 0; i < len(s); i++ {\n\t\tfor s[i] == 0 {\n\t\t\t_, err = io.ReadFull(rand, s[i:i+1])\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/errors/errors.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package errors contains common error types for the OpenPGP packages.\npackage errors // import \"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n)\n\nvar (\n\t// ErrDecryptSessionKeyParsing is a generic error message for parsing errors in decrypted data\n\t// to reduce the risk of oracle attacks.\n\tErrDecryptSessionKeyParsing = DecryptWithSessionKeyError(\"parsing error\")\n\t// ErrAEADTagVerification is returned if one of the tag verifications in SEIPDv2 fails\n\tErrAEADTagVerification error = DecryptWithSessionKeyError(\"AEAD tag verification failed\")\n\t// ErrMDCHashMismatch\n\tErrMDCHashMismatch error = SignatureError(\"MDC hash mismatch\")\n\t// ErrMDCMissing\n\tErrMDCMissing error = SignatureError(\"MDC packet not found\")\n)\n\n// A StructuralError is returned when OpenPGP data is found to be syntactically\n// invalid.\ntype StructuralError string\n\nfunc (s StructuralError) Error() string {\n\treturn \"openpgp: invalid data: \" + string(s)\n}\n\n// A DecryptWithSessionKeyError is returned when a failure occurs when reading from symmetrically decrypted data or\n// an authentication tag verification fails.\n// Such an error indicates that the supplied session key is likely wrong or the data got corrupted.\ntype DecryptWithSessionKeyError string\n\nfunc (s DecryptWithSessionKeyError) Error() string {\n\treturn \"openpgp: decryption with session key failed: \" + string(s)\n}\n\n// HandleSensitiveParsingError handles parsing errors when reading data from potentially decrypted data.\n// The function makes parsing errors generic to reduce the risk of oracle attacks in SEIPDv1.\nfunc HandleSensitiveParsingError(err error, decrypted bool) error {\n\tif !decrypted {\n\t\t// Data was not encrypted so we return the inner error.\n\t\treturn err\n\t}\n\t// The data is read from a stream that decrypts using a session key;\n\t// therefore, we need to handle parsing errors appropriately.\n\t// This is essential to mitigate the risk of oracle attacks.\n\tif decError, ok := err.(*DecryptWithSessionKeyError); ok {\n\t\treturn decError\n\t}\n\tif decError, ok := err.(DecryptWithSessionKeyError); ok {\n\t\treturn decError\n\t}\n\treturn ErrDecryptSessionKeyParsing\n}\n\n// UnsupportedError indicates that, although the OpenPGP data is valid, it\n// makes use of currently unimplemented features.\ntype UnsupportedError string\n\nfunc (s UnsupportedError) Error() string {\n\treturn \"openpgp: unsupported feature: \" + string(s)\n}\n\n// InvalidArgumentError indicates that the caller is in error and passed an\n// incorrect value.\ntype InvalidArgumentError string\n\nfunc (i InvalidArgumentError) Error() string {\n\treturn \"openpgp: invalid argument: \" + string(i)\n}\n\n// SignatureError indicates that a syntactically valid signature failed to\n// validate.\ntype SignatureError string\n\nfunc (b SignatureError) Error() string {\n\treturn \"openpgp: invalid signature: \" + string(b)\n}\n\ntype signatureExpiredError int\n\nfunc (se signatureExpiredError) Error() string {\n\treturn \"openpgp: signature expired\"\n}\n\nvar ErrSignatureExpired error = signatureExpiredError(0)\n\ntype keyExpiredError int\n\nfunc (ke keyExpiredError) Error() string {\n\treturn \"openpgp: key expired\"\n}\n\nvar ErrSignatureOlderThanKey error = signatureOlderThanKeyError(0)\n\ntype signatureOlderThanKeyError int\n\nfunc (ske signatureOlderThanKeyError) Error() string {\n\treturn \"openpgp: signature is older than the key\"\n}\n\nvar ErrKeyExpired error = keyExpiredError(0)\n\ntype keyIncorrectError int\n\nfunc (ki keyIncorrectError) Error() string {\n\treturn \"openpgp: incorrect key\"\n}\n\nvar ErrKeyIncorrect error = keyIncorrectError(0)\n\n// KeyInvalidError indicates that the public key parameters are invalid\n// as they do not match the private ones\ntype KeyInvalidError string\n\nfunc (e KeyInvalidError) Error() string {\n\treturn \"openpgp: invalid key: \" + string(e)\n}\n\ntype unknownIssuerError int\n\nfunc (unknownIssuerError) Error() string {\n\treturn \"openpgp: signature made by unknown entity\"\n}\n\nvar ErrUnknownIssuer error = unknownIssuerError(0)\n\ntype keyRevokedError int\n\nfunc (keyRevokedError) Error() string {\n\treturn \"openpgp: signature made by revoked key\"\n}\n\nvar ErrKeyRevoked error = keyRevokedError(0)\n\ntype WeakAlgorithmError string\n\nfunc (e WeakAlgorithmError) Error() string {\n\treturn \"openpgp: weak algorithms are rejected: \" + string(e)\n}\n\ntype UnknownPacketTypeError uint8\n\nfunc (upte UnknownPacketTypeError) Error() string {\n\treturn \"openpgp: unknown packet type: \" + strconv.Itoa(int(upte))\n}\n\ntype CriticalUnknownPacketTypeError uint8\n\nfunc (upte CriticalUnknownPacketTypeError) Error() string {\n\treturn \"openpgp: unknown critical packet type: \" + strconv.Itoa(int(upte))\n}\n\n// AEADError indicates that there is a problem when initializing or using a\n// AEAD instance, configuration struct, nonces or index values.\ntype AEADError string\n\nfunc (ae AEADError) Error() string {\n\treturn \"openpgp: aead error: \" + string(ae)\n}\n\n// ErrDummyPrivateKey results when operations are attempted on a private key\n// that is just a dummy key. See\n// https://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=blob;f=doc/DETAILS;h=fe55ae16ab4e26d8356dc574c9e8bc935e71aef1;hb=23191d7851eae2217ecdac6484349849a24fd94a#l1109\ntype ErrDummyPrivateKey string\n\nfunc (dke ErrDummyPrivateKey) Error() string {\n\treturn \"openpgp: s2k GNU dummy key: \" + string(dke)\n}\n\n// ErrMalformedMessage results when the packet sequence is incorrect\ntype ErrMalformedMessage string\n\nfunc (dke ErrMalformedMessage) Error() string {\n\treturn \"openpgp: malformed message \" + string(dke)\n}\n\n// ErrEncryptionKeySelection is returned if encryption key selection fails (v2 API).\ntype ErrEncryptionKeySelection struct {\n\tPrimaryKeyId      string\n\tPrimaryKeyErr     error\n\tEncSelectionKeyId *string\n\tEncSelectionErr   error\n}\n\nfunc (eks ErrEncryptionKeySelection) Error() string {\n\tprefix := fmt.Sprintf(\"openpgp: key selection for primary key %s:\", eks.PrimaryKeyId)\n\tif eks.PrimaryKeyErr != nil {\n\t\treturn fmt.Sprintf(\"%s invalid primary key: %s\", prefix, eks.PrimaryKeyErr)\n\t}\n\tif eks.EncSelectionKeyId != nil {\n\t\treturn fmt.Sprintf(\"%s invalid encryption key %s: %s\", prefix, *eks.EncSelectionKeyId, eks.EncSelectionErr)\n\t}\n\treturn fmt.Sprintf(\"%s no encryption key: %s\", prefix, eks.EncSelectionErr)\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/hash.go",
    "content": "package openpgp\n\nimport (\n\t\"crypto\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/algorithm\"\n)\n\n// HashIdToHash returns a crypto.Hash which corresponds to the given OpenPGP\n// hash id.\nfunc HashIdToHash(id byte) (h crypto.Hash, ok bool) {\n\treturn algorithm.HashIdToHash(id)\n}\n\n// HashIdToString returns the name of the hash function corresponding to the\n// given OpenPGP hash id.\nfunc HashIdToString(id byte) (name string, ok bool) {\n\treturn algorithm.HashIdToString(id)\n}\n\n// HashToHashId returns an OpenPGP hash id which corresponds the given Hash.\nfunc HashToHashId(h crypto.Hash) (id byte, ok bool) {\n\treturn algorithm.HashToHashId(h)\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/aead.go",
    "content": "// Copyright (C) 2019 ProtonTech AG\n\npackage algorithm\n\nimport (\n\t\"crypto/cipher\"\n\t\"github.com/ProtonMail/go-crypto/eax\"\n\t\"github.com/ProtonMail/go-crypto/ocb\"\n)\n\n// AEADMode defines the Authenticated Encryption with Associated Data mode of\n// operation.\ntype AEADMode uint8\n\n// Supported modes of operation (see RFC4880bis [EAX] and RFC7253)\nconst (\n\tAEADModeEAX = AEADMode(1)\n\tAEADModeOCB = AEADMode(2)\n\tAEADModeGCM = AEADMode(3)\n)\n\n// TagLength returns the length in bytes of authentication tags.\nfunc (mode AEADMode) TagLength() int {\n\tswitch mode {\n\tcase AEADModeEAX:\n\t\treturn 16\n\tcase AEADModeOCB:\n\t\treturn 16\n\tcase AEADModeGCM:\n\t\treturn 16\n\tdefault:\n\t\treturn 0\n\t}\n}\n\n// NonceLength returns the length in bytes of nonces.\nfunc (mode AEADMode) NonceLength() int {\n\tswitch mode {\n\tcase AEADModeEAX:\n\t\treturn 16\n\tcase AEADModeOCB:\n\t\treturn 15\n\tcase AEADModeGCM:\n\t\treturn 12\n\tdefault:\n\t\treturn 0\n\t}\n}\n\n// New returns a fresh instance of the given mode\nfunc (mode AEADMode) New(block cipher.Block) (alg cipher.AEAD) {\n\tvar err error\n\tswitch mode {\n\tcase AEADModeEAX:\n\t\talg, err = eax.NewEAX(block)\n\tcase AEADModeOCB:\n\t\talg, err = ocb.NewOCB(block)\n\tcase AEADModeGCM:\n\t\talg, err = cipher.NewGCM(block)\n\t}\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\treturn alg\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/cipher.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage algorithm\n\nimport (\n\t\"crypto/aes\"\n\t\"crypto/cipher\"\n\t\"crypto/des\"\n\n\t\"golang.org/x/crypto/cast5\"\n)\n\n// Cipher is an official symmetric key cipher algorithm. See RFC 4880,\n// section 9.2.\ntype Cipher interface {\n\t// Id returns the algorithm ID, as a byte, of the cipher.\n\tId() uint8\n\t// KeySize returns the key size, in bytes, of the cipher.\n\tKeySize() int\n\t// BlockSize returns the block size, in bytes, of the cipher.\n\tBlockSize() int\n\t// New returns a fresh instance of the given cipher.\n\tNew(key []byte) cipher.Block\n}\n\n// The following constants mirror the OpenPGP standard (RFC 4880).\nconst (\n\tTripleDES = CipherFunction(2)\n\tCAST5     = CipherFunction(3)\n\tAES128    = CipherFunction(7)\n\tAES192    = CipherFunction(8)\n\tAES256    = CipherFunction(9)\n)\n\n// CipherById represents the different block ciphers specified for OpenPGP. See\n// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-13\nvar CipherById = map[uint8]Cipher{\n\tTripleDES.Id(): TripleDES,\n\tCAST5.Id():     CAST5,\n\tAES128.Id():    AES128,\n\tAES192.Id():    AES192,\n\tAES256.Id():    AES256,\n}\n\ntype CipherFunction uint8\n\n// ID returns the algorithm Id, as a byte, of cipher.\nfunc (sk CipherFunction) Id() uint8 {\n\treturn uint8(sk)\n}\n\n// KeySize returns the key size, in bytes, of cipher.\nfunc (cipher CipherFunction) KeySize() int {\n\tswitch cipher {\n\tcase CAST5:\n\t\treturn cast5.KeySize\n\tcase AES128:\n\t\treturn 16\n\tcase AES192, TripleDES:\n\t\treturn 24\n\tcase AES256:\n\t\treturn 32\n\t}\n\treturn 0\n}\n\n// BlockSize returns the block size, in bytes, of cipher.\nfunc (cipher CipherFunction) BlockSize() int {\n\tswitch cipher {\n\tcase TripleDES:\n\t\treturn des.BlockSize\n\tcase CAST5:\n\t\treturn 8\n\tcase AES128, AES192, AES256:\n\t\treturn 16\n\t}\n\treturn 0\n}\n\n// New returns a fresh instance of the given cipher.\nfunc (cipher CipherFunction) New(key []byte) (block cipher.Block) {\n\tvar err error\n\tswitch cipher {\n\tcase TripleDES:\n\t\tblock, err = des.NewTripleDESCipher(key)\n\tcase CAST5:\n\t\tblock, err = cast5.NewCipher(key)\n\tcase AES128, AES192, AES256:\n\t\tblock, err = aes.NewCipher(key)\n\t}\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/hash.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage algorithm\n\nimport (\n\t\"crypto\"\n\t\"fmt\"\n\t\"hash\"\n)\n\n// Hash is an official hash function algorithm. See RFC 4880, section 9.4.\ntype Hash interface {\n\t// Id returns the algorithm ID, as a byte, of Hash.\n\tId() uint8\n\t// Available reports whether the given hash function is linked into the binary.\n\tAvailable() bool\n\t// HashFunc simply returns the value of h so that Hash implements SignerOpts.\n\tHashFunc() crypto.Hash\n\t// New returns a new hash.Hash calculating the given hash function. New\n\t// panics if the hash function is not linked into the binary.\n\tNew() hash.Hash\n\t// Size returns the length, in bytes, of a digest resulting from the given\n\t// hash function. It doesn't require that the hash function in question be\n\t// linked into the program.\n\tSize() int\n\t// String is the name of the hash function corresponding to the given\n\t// OpenPGP hash id.\n\tString() string\n}\n\n// The following vars mirror the crypto/Hash supported hash functions.\nvar (\n\tSHA1     Hash = cryptoHash{2, crypto.SHA1}\n\tSHA256   Hash = cryptoHash{8, crypto.SHA256}\n\tSHA384   Hash = cryptoHash{9, crypto.SHA384}\n\tSHA512   Hash = cryptoHash{10, crypto.SHA512}\n\tSHA224   Hash = cryptoHash{11, crypto.SHA224}\n\tSHA3_256 Hash = cryptoHash{12, crypto.SHA3_256}\n\tSHA3_512 Hash = cryptoHash{14, crypto.SHA3_512}\n)\n\n// HashById represents the different hash functions specified for OpenPGP. See\n// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-14\nvar (\n\tHashById = map[uint8]Hash{\n\t\tSHA256.Id():   SHA256,\n\t\tSHA384.Id():   SHA384,\n\t\tSHA512.Id():   SHA512,\n\t\tSHA224.Id():   SHA224,\n\t\tSHA3_256.Id(): SHA3_256,\n\t\tSHA3_512.Id(): SHA3_512,\n\t}\n)\n\n// cryptoHash contains pairs relating OpenPGP's hash identifier with\n// Go's crypto.Hash type. See RFC 4880, section 9.4.\ntype cryptoHash struct {\n\tid uint8\n\tcrypto.Hash\n}\n\n// Id returns the algorithm ID, as a byte, of cryptoHash.\nfunc (h cryptoHash) Id() uint8 {\n\treturn h.id\n}\n\nvar hashNames = map[uint8]string{\n\tSHA256.Id():   \"SHA256\",\n\tSHA384.Id():   \"SHA384\",\n\tSHA512.Id():   \"SHA512\",\n\tSHA224.Id():   \"SHA224\",\n\tSHA3_256.Id(): \"SHA3-256\",\n\tSHA3_512.Id(): \"SHA3-512\",\n}\n\nfunc (h cryptoHash) String() string {\n\ts, ok := hashNames[h.id]\n\tif !ok {\n\t\tpanic(fmt.Sprintf(\"Unsupported hash function %d\", h.id))\n\t}\n\treturn s\n}\n\n// HashIdToHash returns a crypto.Hash which corresponds to the given OpenPGP\n// hash id.\nfunc HashIdToHash(id byte) (h crypto.Hash, ok bool) {\n\tif hash, ok := HashById[id]; ok {\n\t\treturn hash.HashFunc(), true\n\t}\n\treturn 0, false\n}\n\n// HashIdToHashWithSha1 returns a crypto.Hash which corresponds to the given OpenPGP\n// hash id, allowing sha1.\nfunc HashIdToHashWithSha1(id byte) (h crypto.Hash, ok bool) {\n\tif hash, ok := HashById[id]; ok {\n\t\treturn hash.HashFunc(), true\n\t}\n\n\tif id == SHA1.Id() {\n\t\treturn SHA1.HashFunc(), true\n\t}\n\n\treturn 0, false\n}\n\n// HashIdToString returns the name of the hash function corresponding to the\n// given OpenPGP hash id.\nfunc HashIdToString(id byte) (name string, ok bool) {\n\tif hash, ok := HashById[id]; ok {\n\t\treturn hash.String(), true\n\t}\n\treturn \"\", false\n}\n\n// HashToHashId returns an OpenPGP hash id which corresponds the given Hash.\nfunc HashToHashId(h crypto.Hash) (id byte, ok bool) {\n\tfor id, hash := range HashById {\n\t\tif hash.HashFunc() == h {\n\t\t\treturn id, true\n\t\t}\n\t}\n\n\treturn 0, false\n}\n\n// HashToHashIdWithSha1 returns an OpenPGP hash id which corresponds the given Hash,\n// allowing instances of SHA1\nfunc HashToHashIdWithSha1(h crypto.Hash) (id byte, ok bool) {\n\tfor id, hash := range HashById {\n\t\tif hash.HashFunc() == h {\n\t\t\treturn id, true\n\t\t}\n\t}\n\n\tif h == SHA1.HashFunc() {\n\t\treturn SHA1.Id(), true\n\t}\n\n\treturn 0, false\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519.go",
    "content": "// Package ecc implements a generic interface for ECDH, ECDSA, and EdDSA.\npackage ecc\n\nimport (\n\t\"crypto/subtle\"\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\tx25519lib \"github.com/cloudflare/circl/dh/x25519\"\n)\n\ntype curve25519 struct{}\n\nfunc NewCurve25519() *curve25519 {\n\treturn &curve25519{}\n}\n\nfunc (c *curve25519) GetCurveName() string {\n\treturn \"curve25519\"\n}\n\n// MarshalBytePoint encodes the public point from native format, adding the prefix.\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6\nfunc (c *curve25519) MarshalBytePoint(point []byte) []byte {\n\treturn append([]byte{0x40}, point...)\n}\n\n// UnmarshalBytePoint decodes the public point to native format, removing the prefix.\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6\nfunc (c *curve25519) UnmarshalBytePoint(point []byte) []byte {\n\tif len(point) != x25519lib.Size+1 {\n\t\treturn nil\n\t}\n\n\t// Remove prefix\n\treturn point[1:]\n}\n\n// MarshalByteSecret encodes the secret scalar from native format.\n// Note that the EC secret scalar differs from the definition of public keys in\n// [Curve25519] in two ways: (1) the byte-ordering is big-endian, which is\n// more uniform with how big integers are represented in OpenPGP, and (2) the\n// leading zeros are truncated.\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6.1.1\n// Note that leading zero bytes are stripped later when encoding as an MPI.\nfunc (c *curve25519) MarshalByteSecret(secret []byte) []byte {\n\td := make([]byte, x25519lib.Size)\n\tcopyReversed(d, secret)\n\n\t// The following ensures that the private key is a number of the form\n\t// 2^{254} + 8 * [0, 2^{251}), in order to avoid the small subgroup of\n\t// the curve.\n\t//\n\t// This masking is done internally in the underlying lib and so is unnecessary\n\t// for security, but OpenPGP implementations require that private keys be\n\t// pre-masked.\n\td[0] &= 127\n\td[0] |= 64\n\td[31] &= 248\n\n\treturn d\n}\n\n// UnmarshalByteSecret decodes the secret scalar from native format.\n// Note that the EC secret scalar differs from the definition of public keys in\n// [Curve25519] in two ways: (1) the byte-ordering is big-endian, which is\n// more uniform with how big integers are represented in OpenPGP, and (2) the\n// leading zeros are truncated.\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6.1.1\nfunc (c *curve25519) UnmarshalByteSecret(d []byte) []byte {\n\tif len(d) > x25519lib.Size {\n\t\treturn nil\n\t}\n\n\t// Ensure truncated leading bytes are re-added\n\tsecret := make([]byte, x25519lib.Size)\n\tcopyReversed(secret, d)\n\n\treturn secret\n}\n\n// generateKeyPairBytes Generates a private-public key-pair.\n// 'priv' is a private key; a little-endian scalar belonging to the set\n// 2^{254} + 8 * [0, 2^{251}), in order to avoid the small subgroup of the\n// curve. 'pub' is simply 'priv' * G where G is the base point.\n// See https://cr.yp.to/ecdh.html and RFC7748, sec 5.\nfunc (c *curve25519) generateKeyPairBytes(rand io.Reader) (priv, pub x25519lib.Key, err error) {\n\t_, err = io.ReadFull(rand, priv[:])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tx25519lib.KeyGen(&pub, &priv)\n\treturn\n}\n\nfunc (c *curve25519) GenerateECDH(rand io.Reader) (point []byte, secret []byte, err error) {\n\tpriv, pub, err := c.generateKeyPairBytes(rand)\n\tif err != nil {\n\t\treturn\n\t}\n\n\treturn pub[:], priv[:], nil\n}\n\nfunc (c *genericCurve) MaskSecret(secret []byte) []byte {\n\treturn secret\n}\n\nfunc (c *curve25519) Encaps(rand io.Reader, point []byte) (ephemeral, sharedSecret []byte, err error) {\n\t// RFC6637 §8: \"Generate an ephemeral key pair {v, V=vG}\"\n\t// ephemeralPrivate corresponds to `v`.\n\t// ephemeralPublic corresponds to `V`.\n\tephemeralPrivate, ephemeralPublic, err := c.generateKeyPairBytes(rand)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\t// RFC6637 §8: \"Obtain the authenticated recipient public key R\"\n\t// pubKey corresponds to `R`.\n\tvar pubKey x25519lib.Key\n\tcopy(pubKey[:], point)\n\n\t// RFC6637 §8: \"Compute the shared point S = vR\"\n\t//\t\"VB = convert point V to the octet string\"\n\t// sharedPoint corresponds to `VB`.\n\tvar sharedPoint x25519lib.Key\n\tx25519lib.Shared(&sharedPoint, &ephemeralPrivate, &pubKey)\n\n\treturn ephemeralPublic[:], sharedPoint[:], nil\n}\n\nfunc (c *curve25519) Decaps(vsG, secret []byte) (sharedSecret []byte, err error) {\n\tvar ephemeralPublic, decodedPrivate, sharedPoint x25519lib.Key\n\t// RFC6637 §8: \"The decryption is the inverse of the method given.\"\n\t// All quoted descriptions in comments below describe encryption, and\n\t// the reverse is performed.\n\t// vsG corresponds to `VB` in RFC6637 §8 .\n\n\t// RFC6637 §8: \"VB = convert point V to the octet string\"\n\tcopy(ephemeralPublic[:], vsG)\n\n\t// decodedPrivate corresponds to `r` in RFC6637 §8 .\n\tcopy(decodedPrivate[:], secret)\n\n\t// RFC6637 §8: \"Note that the recipient obtains the shared secret by calculating\n\t//   S = rV = rvG, where (r,R) is the recipient's key pair.\"\n\t// sharedPoint corresponds to `S`.\n\tx25519lib.Shared(&sharedPoint, &decodedPrivate, &ephemeralPublic)\n\n\treturn sharedPoint[:], nil\n}\n\nfunc (c *curve25519) ValidateECDH(point []byte, secret []byte) (err error) {\n\tvar pk, sk x25519lib.Key\n\tcopy(sk[:], secret)\n\tx25519lib.KeyGen(&pk, &sk)\n\n\tif subtle.ConstantTimeCompare(point, pk[:]) == 0 {\n\t\treturn errors.KeyInvalidError(\"ecc: invalid curve25519 public point\")\n\t}\n\n\treturn nil\n}\n\nfunc copyReversed(out []byte, in []byte) {\n\tl := len(in)\n\tfor i := 0; i < l; i++ {\n\t\tout[i] = in[l-i-1]\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve_info.go",
    "content": "// Package ecc implements a generic interface for ECDH, ECDSA, and EdDSA.\npackage ecc\n\nimport (\n\t\"bytes\"\n\t\"crypto/elliptic\"\n\n\t\"github.com/ProtonMail/go-crypto/bitcurves\"\n\t\"github.com/ProtonMail/go-crypto/brainpool\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/encoding\"\n)\n\nconst Curve25519GenName = \"Curve25519\"\n\ntype CurveInfo struct {\n\tGenName string\n\tOid     *encoding.OID\n\tCurve   Curve\n}\n\nvar Curves = []CurveInfo{\n\t{\n\t\t// NIST P-256\n\t\tGenName: \"P256\",\n\t\tOid:     encoding.NewOID([]byte{0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07}),\n\t\tCurve:   NewGenericCurve(elliptic.P256()),\n\t},\n\t{\n\t\t// NIST P-384\n\t\tGenName: \"P384\",\n\t\tOid:     encoding.NewOID([]byte{0x2B, 0x81, 0x04, 0x00, 0x22}),\n\t\tCurve:   NewGenericCurve(elliptic.P384()),\n\t},\n\t{\n\t\t// NIST P-521\n\t\tGenName: \"P521\",\n\t\tOid:     encoding.NewOID([]byte{0x2B, 0x81, 0x04, 0x00, 0x23}),\n\t\tCurve:   NewGenericCurve(elliptic.P521()),\n\t},\n\t{\n\t\t// SecP256k1\n\t\tGenName: \"SecP256k1\",\n\t\tOid:     encoding.NewOID([]byte{0x2B, 0x81, 0x04, 0x00, 0x0A}),\n\t\tCurve:   NewGenericCurve(bitcurves.S256()),\n\t},\n\t{\n\t\t// Curve25519\n\t\tGenName: Curve25519GenName,\n\t\tOid:     encoding.NewOID([]byte{0x2B, 0x06, 0x01, 0x04, 0x01, 0x97, 0x55, 0x01, 0x05, 0x01}),\n\t\tCurve:   NewCurve25519(),\n\t},\n\t{\n\t\t// x448\n\t\tGenName: \"Curve448\",\n\t\tOid:     encoding.NewOID([]byte{0x2B, 0x65, 0x6F}),\n\t\tCurve:   NewX448(),\n\t},\n\t{\n\t\t// Ed25519\n\t\tGenName: Curve25519GenName,\n\t\tOid:     encoding.NewOID([]byte{0x2B, 0x06, 0x01, 0x04, 0x01, 0xDA, 0x47, 0x0F, 0x01}),\n\t\tCurve:   NewEd25519(),\n\t},\n\t{\n\t\t// Ed448\n\t\tGenName: \"Curve448\",\n\t\tOid:     encoding.NewOID([]byte{0x2B, 0x65, 0x71}),\n\t\tCurve:   NewEd448(),\n\t},\n\t{\n\t\t// BrainpoolP256r1\n\t\tGenName: \"BrainpoolP256\",\n\t\tOid:     encoding.NewOID([]byte{0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x07}),\n\t\tCurve:   NewGenericCurve(brainpool.P256r1()),\n\t},\n\t{\n\t\t// BrainpoolP384r1\n\t\tGenName: \"BrainpoolP384\",\n\t\tOid:     encoding.NewOID([]byte{0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0B}),\n\t\tCurve:   NewGenericCurve(brainpool.P384r1()),\n\t},\n\t{\n\t\t// BrainpoolP512r1\n\t\tGenName: \"BrainpoolP512\",\n\t\tOid:     encoding.NewOID([]byte{0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0D}),\n\t\tCurve:   NewGenericCurve(brainpool.P512r1()),\n\t},\n}\n\nfunc FindByCurve(curve Curve) *CurveInfo {\n\tfor _, curveInfo := range Curves {\n\t\tif curveInfo.Curve.GetCurveName() == curve.GetCurveName() {\n\t\t\treturn &curveInfo\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc FindByOid(oid encoding.Field) *CurveInfo {\n\tvar rawBytes = oid.Bytes()\n\tfor _, curveInfo := range Curves {\n\t\tif bytes.Equal(curveInfo.Oid.Bytes(), rawBytes) {\n\t\t\treturn &curveInfo\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc FindEdDSAByGenName(curveGenName string) EdDSACurve {\n\tfor _, curveInfo := range Curves {\n\t\tif curveInfo.GenName == curveGenName {\n\t\t\tcurve, ok := curveInfo.Curve.(EdDSACurve)\n\t\t\tif ok {\n\t\t\t\treturn curve\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc FindECDSAByGenName(curveGenName string) ECDSACurve {\n\tfor _, curveInfo := range Curves {\n\t\tif curveInfo.GenName == curveGenName {\n\t\t\tcurve, ok := curveInfo.Curve.(ECDSACurve)\n\t\t\tif ok {\n\t\t\t\treturn curve\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc FindECDHByGenName(curveGenName string) ECDHCurve {\n\tfor _, curveInfo := range Curves {\n\t\tif curveInfo.GenName == curveGenName {\n\t\t\tcurve, ok := curveInfo.Curve.(ECDHCurve)\n\t\t\tif ok {\n\t\t\t\treturn curve\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curves.go",
    "content": "// Package ecc implements a generic interface for ECDH, ECDSA, and EdDSA.\npackage ecc\n\nimport (\n\t\"io\"\n\t\"math/big\"\n)\n\ntype Curve interface {\n\tGetCurveName() string\n}\n\ntype ECDSACurve interface {\n\tCurve\n\tMarshalIntegerPoint(x, y *big.Int) []byte\n\tUnmarshalIntegerPoint([]byte) (x, y *big.Int)\n\tMarshalIntegerSecret(d *big.Int) []byte\n\tUnmarshalIntegerSecret(d []byte) *big.Int\n\tGenerateECDSA(rand io.Reader) (x, y, secret *big.Int, err error)\n\tSign(rand io.Reader, x, y, d *big.Int, hash []byte) (r, s *big.Int, err error)\n\tVerify(x, y *big.Int, hash []byte, r, s *big.Int) bool\n\tValidateECDSA(x, y *big.Int, secret []byte) error\n}\n\ntype EdDSACurve interface {\n\tCurve\n\tMarshalBytePoint(x []byte) []byte\n\tUnmarshalBytePoint([]byte) (x []byte)\n\tMarshalByteSecret(d []byte) []byte\n\tUnmarshalByteSecret(d []byte) []byte\n\tMarshalSignature(sig []byte) (r, s []byte)\n\tUnmarshalSignature(r, s []byte) (sig []byte)\n\tGenerateEdDSA(rand io.Reader) (pub, priv []byte, err error)\n\tSign(publicKey, privateKey, message []byte) (sig []byte, err error)\n\tVerify(publicKey, message, sig []byte) bool\n\tValidateEdDSA(publicKey, privateKey []byte) (err error)\n}\ntype ECDHCurve interface {\n\tCurve\n\tMarshalBytePoint([]byte) (encoded []byte)\n\tUnmarshalBytePoint(encoded []byte) []byte\n\tMarshalByteSecret(d []byte) []byte\n\tUnmarshalByteSecret(d []byte) []byte\n\tGenerateECDH(rand io.Reader) (point []byte, secret []byte, err error)\n\tEncaps(rand io.Reader, point []byte) (ephemeral, sharedSecret []byte, err error)\n\tDecaps(ephemeral, secret []byte) (sharedSecret []byte, err error)\n\tValidateECDH(public []byte, secret []byte) error\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/ed25519.go",
    "content": "// Package ecc implements a generic interface for ECDH, ECDSA, and EdDSA.\npackage ecc\n\nimport (\n\t\"bytes\"\n\t\"crypto/subtle\"\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\ted25519lib \"github.com/cloudflare/circl/sign/ed25519\"\n)\n\nconst ed25519Size = 32\n\ntype ed25519 struct{}\n\nfunc NewEd25519() *ed25519 {\n\treturn &ed25519{}\n}\n\nfunc (c *ed25519) GetCurveName() string {\n\treturn \"ed25519\"\n}\n\n// MarshalBytePoint encodes the public point from native format, adding the prefix.\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5\nfunc (c *ed25519) MarshalBytePoint(x []byte) []byte {\n\treturn append([]byte{0x40}, x...)\n}\n\n// UnmarshalBytePoint decodes a point from prefixed format to native.\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5\nfunc (c *ed25519) UnmarshalBytePoint(point []byte) (x []byte) {\n\tif len(point) != ed25519lib.PublicKeySize+1 {\n\t\treturn nil\n\t}\n\n\t// Return unprefixed\n\treturn point[1:]\n}\n\n// MarshalByteSecret encodes a scalar in native format.\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5\nfunc (c *ed25519) MarshalByteSecret(d []byte) []byte {\n\treturn d\n}\n\n// UnmarshalByteSecret decodes a scalar in native format and re-adds the stripped leading zeroes\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5\nfunc (c *ed25519) UnmarshalByteSecret(s []byte) (d []byte) {\n\tif len(s) > ed25519lib.SeedSize {\n\t\treturn nil\n\t}\n\n\t// Handle stripped leading zeroes\n\td = make([]byte, ed25519lib.SeedSize)\n\tcopy(d[ed25519lib.SeedSize-len(s):], s)\n\treturn\n}\n\n// MarshalSignature splits a signature in R and S.\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.2.3.3.1\nfunc (c *ed25519) MarshalSignature(sig []byte) (r, s []byte) {\n\treturn sig[:ed25519Size], sig[ed25519Size:]\n}\n\n// UnmarshalSignature decodes R and S in the native format, re-adding the stripped leading zeroes\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.2.3.3.1\nfunc (c *ed25519) UnmarshalSignature(r, s []byte) (sig []byte) {\n\t// Check size\n\tif len(r) > 32 || len(s) > 32 {\n\t\treturn nil\n\t}\n\n\tsig = make([]byte, ed25519lib.SignatureSize)\n\n\t// Handle stripped leading zeroes\n\tcopy(sig[ed25519Size-len(r):ed25519Size], r)\n\tcopy(sig[ed25519lib.SignatureSize-len(s):], s)\n\treturn sig\n}\n\nfunc (c *ed25519) GenerateEdDSA(rand io.Reader) (pub, priv []byte, err error) {\n\tpk, sk, err := ed25519lib.GenerateKey(rand)\n\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\treturn pk, sk[:ed25519lib.SeedSize], nil\n}\n\nfunc getEd25519Sk(publicKey, privateKey []byte) ed25519lib.PrivateKey {\n\tprivateKeyCap, privateKeyLen, publicKeyLen := cap(privateKey), len(privateKey), len(publicKey)\n\n\tif privateKeyCap >= privateKeyLen+publicKeyLen &&\n\t\tbytes.Equal(privateKey[privateKeyLen:privateKeyLen+publicKeyLen], publicKey) {\n\t\treturn privateKey[:privateKeyLen+publicKeyLen]\n\t}\n\n\treturn append(privateKey[:privateKeyLen:privateKeyLen], publicKey...)\n}\n\nfunc (c *ed25519) Sign(publicKey, privateKey, message []byte) (sig []byte, err error) {\n\tsig = ed25519lib.Sign(getEd25519Sk(publicKey, privateKey), message)\n\treturn sig, nil\n}\n\nfunc (c *ed25519) Verify(publicKey, message, sig []byte) bool {\n\treturn ed25519lib.Verify(publicKey, message, sig)\n}\n\nfunc (c *ed25519) ValidateEdDSA(publicKey, privateKey []byte) (err error) {\n\tpriv := getEd25519Sk(publicKey, privateKey)\n\texpectedPriv := ed25519lib.NewKeyFromSeed(priv.Seed())\n\tif subtle.ConstantTimeCompare(priv, expectedPriv) == 0 {\n\t\treturn errors.KeyInvalidError(\"ecc: invalid ed25519 secret\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/ed448.go",
    "content": "// Package ecc implements a generic interface for ECDH, ECDSA, and EdDSA.\npackage ecc\n\nimport (\n\t\"bytes\"\n\t\"crypto/subtle\"\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\ted448lib \"github.com/cloudflare/circl/sign/ed448\"\n)\n\ntype ed448 struct{}\n\nfunc NewEd448() *ed448 {\n\treturn &ed448{}\n}\n\nfunc (c *ed448) GetCurveName() string {\n\treturn \"ed448\"\n}\n\n// MarshalBytePoint encodes the public point from native format, adding the prefix.\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5\nfunc (c *ed448) MarshalBytePoint(x []byte) []byte {\n\t// Return prefixed\n\treturn append([]byte{0x40}, x...)\n}\n\n// UnmarshalBytePoint decodes a point from prefixed format to native.\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5\nfunc (c *ed448) UnmarshalBytePoint(point []byte) (x []byte) {\n\tif len(point) != ed448lib.PublicKeySize+1 {\n\t\treturn nil\n\t}\n\n\t// Strip prefix\n\treturn point[1:]\n}\n\n// MarshalByteSecret encoded a scalar from native format to prefixed.\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5\nfunc (c *ed448) MarshalByteSecret(d []byte) []byte {\n\t// Return prefixed\n\treturn append([]byte{0x40}, d...)\n}\n\n// UnmarshalByteSecret decodes a scalar from prefixed format to native.\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5\nfunc (c *ed448) UnmarshalByteSecret(s []byte) (d []byte) {\n\t// Check prefixed size\n\tif len(s) != ed448lib.SeedSize+1 {\n\t\treturn nil\n\t}\n\n\t// Strip prefix\n\treturn s[1:]\n}\n\n// MarshalSignature splits a signature in R and S, where R is in prefixed native format and\n// S is an MPI with value zero.\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.2.3.3.2\nfunc (c *ed448) MarshalSignature(sig []byte) (r, s []byte) {\n\treturn append([]byte{0x40}, sig...), []byte{}\n}\n\n// UnmarshalSignature decodes R and S in the native format. Only R is used, in prefixed native format.\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.2.3.3.2\nfunc (c *ed448) UnmarshalSignature(r, s []byte) (sig []byte) {\n\tif len(r) != ed448lib.SignatureSize+1 {\n\t\treturn nil\n\t}\n\n\treturn r[1:]\n}\n\nfunc (c *ed448) GenerateEdDSA(rand io.Reader) (pub, priv []byte, err error) {\n\tpk, sk, err := ed448lib.GenerateKey(rand)\n\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\treturn pk, sk[:ed448lib.SeedSize], nil\n}\n\nfunc getEd448Sk(publicKey, privateKey []byte) ed448lib.PrivateKey {\n\tprivateKeyCap, privateKeyLen, publicKeyLen := cap(privateKey), len(privateKey), len(publicKey)\n\n\tif privateKeyCap >= privateKeyLen+publicKeyLen &&\n\t\tbytes.Equal(privateKey[privateKeyLen:privateKeyLen+publicKeyLen], publicKey) {\n\t\treturn privateKey[:privateKeyLen+publicKeyLen]\n\t}\n\n\treturn append(privateKey[:privateKeyLen:privateKeyLen], publicKey...)\n}\n\nfunc (c *ed448) Sign(publicKey, privateKey, message []byte) (sig []byte, err error) {\n\t// Ed448 is used with the empty string as a context string.\n\t// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-13.7\n\tsig = ed448lib.Sign(getEd448Sk(publicKey, privateKey), message, \"\")\n\n\treturn sig, nil\n}\n\nfunc (c *ed448) Verify(publicKey, message, sig []byte) bool {\n\t// Ed448 is used with the empty string as a context string.\n\t// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-13.7\n\treturn ed448lib.Verify(publicKey, message, sig, \"\")\n}\n\nfunc (c *ed448) ValidateEdDSA(publicKey, privateKey []byte) (err error) {\n\tpriv := getEd448Sk(publicKey, privateKey)\n\texpectedPriv := ed448lib.NewKeyFromSeed(priv.Seed())\n\tif subtle.ConstantTimeCompare(priv, expectedPriv) == 0 {\n\t\treturn errors.KeyInvalidError(\"ecc: invalid ed448 secret\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/generic.go",
    "content": "// Package ecc implements a generic interface for ECDH, ECDSA, and EdDSA.\npackage ecc\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"fmt\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\t\"io\"\n\t\"math/big\"\n)\n\ntype genericCurve struct {\n\tCurve elliptic.Curve\n}\n\nfunc NewGenericCurve(c elliptic.Curve) *genericCurve {\n\treturn &genericCurve{\n\t\tCurve: c,\n\t}\n}\n\nfunc (c *genericCurve) GetCurveName() string {\n\treturn c.Curve.Params().Name\n}\n\nfunc (c *genericCurve) MarshalBytePoint(point []byte) []byte {\n\treturn point\n}\n\nfunc (c *genericCurve) UnmarshalBytePoint(point []byte) []byte {\n\treturn point\n}\n\nfunc (c *genericCurve) MarshalIntegerPoint(x, y *big.Int) []byte {\n\treturn elliptic.Marshal(c.Curve, x, y)\n}\n\nfunc (c *genericCurve) UnmarshalIntegerPoint(point []byte) (x, y *big.Int) {\n\treturn elliptic.Unmarshal(c.Curve, point)\n}\n\nfunc (c *genericCurve) MarshalByteSecret(d []byte) []byte {\n\treturn d\n}\n\nfunc (c *genericCurve) UnmarshalByteSecret(d []byte) []byte {\n\treturn d\n}\n\nfunc (c *genericCurve) MarshalIntegerSecret(d *big.Int) []byte {\n\treturn d.Bytes()\n}\n\nfunc (c *genericCurve) UnmarshalIntegerSecret(d []byte) *big.Int {\n\treturn new(big.Int).SetBytes(d)\n}\n\nfunc (c *genericCurve) GenerateECDH(rand io.Reader) (point, secret []byte, err error) {\n\tsecret, x, y, err := elliptic.GenerateKey(c.Curve, rand)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tpoint = elliptic.Marshal(c.Curve, x, y)\n\treturn point, secret, nil\n}\n\nfunc (c *genericCurve) GenerateECDSA(rand io.Reader) (x, y, secret *big.Int, err error) {\n\tpriv, err := ecdsa.GenerateKey(c.Curve, rand)\n\tif err != nil {\n\t\treturn\n\t}\n\n\treturn priv.X, priv.Y, priv.D, nil\n}\n\nfunc (c *genericCurve) Encaps(rand io.Reader, point []byte) (ephemeral, sharedSecret []byte, err error) {\n\txP, yP := elliptic.Unmarshal(c.Curve, point)\n\tif xP == nil {\n\t\tpanic(\"invalid point\")\n\t}\n\n\td, x, y, err := elliptic.GenerateKey(c.Curve, rand)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tvsG := elliptic.Marshal(c.Curve, x, y)\n\tzbBig, _ := c.Curve.ScalarMult(xP, yP, d)\n\n\tbyteLen := (c.Curve.Params().BitSize + 7) >> 3\n\tzb := make([]byte, byteLen)\n\tzbBytes := zbBig.Bytes()\n\tcopy(zb[byteLen-len(zbBytes):], zbBytes)\n\n\treturn vsG, zb, nil\n}\n\nfunc (c *genericCurve) Decaps(ephemeral, secret []byte) (sharedSecret []byte, err error) {\n\tx, y := elliptic.Unmarshal(c.Curve, ephemeral)\n\tzbBig, _ := c.Curve.ScalarMult(x, y, secret)\n\tbyteLen := (c.Curve.Params().BitSize + 7) >> 3\n\tzb := make([]byte, byteLen)\n\tzbBytes := zbBig.Bytes()\n\tcopy(zb[byteLen-len(zbBytes):], zbBytes)\n\n\treturn zb, nil\n}\n\nfunc (c *genericCurve) Sign(rand io.Reader, x, y, d *big.Int, hash []byte) (r, s *big.Int, err error) {\n\tpriv := &ecdsa.PrivateKey{D: d, PublicKey: ecdsa.PublicKey{X: x, Y: y, Curve: c.Curve}}\n\treturn ecdsa.Sign(rand, priv, hash)\n}\n\nfunc (c *genericCurve) Verify(x, y *big.Int, hash []byte, r, s *big.Int) bool {\n\tpub := &ecdsa.PublicKey{X: x, Y: y, Curve: c.Curve}\n\treturn ecdsa.Verify(pub, hash, r, s)\n}\n\nfunc (c *genericCurve) validate(xP, yP *big.Int, secret []byte) error {\n\t// the public point should not be at infinity (0,0)\n\tzero := new(big.Int)\n\tif xP.Cmp(zero) == 0 && yP.Cmp(zero) == 0 {\n\t\treturn errors.KeyInvalidError(fmt.Sprintf(\"ecc (%s): infinity point\", c.Curve.Params().Name))\n\t}\n\n\t// re-derive the public point Q' = (X,Y) = dG\n\t// to compare to declared Q in public key\n\texpectedX, expectedY := c.Curve.ScalarBaseMult(secret)\n\tif xP.Cmp(expectedX) != 0 || yP.Cmp(expectedY) != 0 {\n\t\treturn errors.KeyInvalidError(fmt.Sprintf(\"ecc (%s): invalid point\", c.Curve.Params().Name))\n\t}\n\n\treturn nil\n}\n\nfunc (c *genericCurve) ValidateECDSA(xP, yP *big.Int, secret []byte) error {\n\treturn c.validate(xP, yP, secret)\n}\n\nfunc (c *genericCurve) ValidateECDH(point []byte, secret []byte) error {\n\txP, yP := elliptic.Unmarshal(c.Curve, point)\n\tif xP == nil {\n\t\treturn errors.KeyInvalidError(fmt.Sprintf(\"ecc (%s): invalid point\", c.Curve.Params().Name))\n\t}\n\n\treturn c.validate(xP, yP, secret)\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/x448.go",
    "content": "// Package ecc implements a generic interface for ECDH, ECDSA, and EdDSA.\npackage ecc\n\nimport (\n\t\"crypto/subtle\"\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\tx448lib \"github.com/cloudflare/circl/dh/x448\"\n)\n\ntype x448 struct{}\n\nfunc NewX448() *x448 {\n\treturn &x448{}\n}\n\nfunc (c *x448) GetCurveName() string {\n\treturn \"x448\"\n}\n\n// MarshalBytePoint encodes the public point from native format, adding the prefix.\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6\nfunc (c *x448) MarshalBytePoint(point []byte) []byte {\n\treturn append([]byte{0x40}, point...)\n}\n\n// UnmarshalBytePoint decodes a point from prefixed format to native.\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6\nfunc (c *x448) UnmarshalBytePoint(point []byte) []byte {\n\tif len(point) != x448lib.Size+1 {\n\t\treturn nil\n\t}\n\n\treturn point[1:]\n}\n\n// MarshalByteSecret encoded a scalar from native format to prefixed.\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6.1.2\nfunc (c *x448) MarshalByteSecret(d []byte) []byte {\n\treturn append([]byte{0x40}, d...)\n}\n\n// UnmarshalByteSecret decodes a scalar from prefixed format to native.\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6.1.2\nfunc (c *x448) UnmarshalByteSecret(d []byte) []byte {\n\tif len(d) != x448lib.Size+1 {\n\t\treturn nil\n\t}\n\n\t// Store without prefix\n\treturn d[1:]\n}\n\nfunc (c *x448) generateKeyPairBytes(rand io.Reader) (sk, pk x448lib.Key, err error) {\n\tif _, err = rand.Read(sk[:]); err != nil {\n\t\treturn\n\t}\n\n\tx448lib.KeyGen(&pk, &sk)\n\treturn\n}\n\nfunc (c *x448) GenerateECDH(rand io.Reader) (point []byte, secret []byte, err error) {\n\tpriv, pub, err := c.generateKeyPairBytes(rand)\n\tif err != nil {\n\t\treturn\n\t}\n\n\treturn pub[:], priv[:], nil\n}\n\nfunc (c *x448) Encaps(rand io.Reader, point []byte) (ephemeral, sharedSecret []byte, err error) {\n\tvar pk, ss x448lib.Key\n\tseed, e, err := c.generateKeyPairBytes(rand)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tcopy(pk[:], point)\n\tx448lib.Shared(&ss, &seed, &pk)\n\n\treturn e[:], ss[:], nil\n}\n\nfunc (c *x448) Decaps(ephemeral, secret []byte) (sharedSecret []byte, err error) {\n\tvar ss, sk, e x448lib.Key\n\n\tcopy(sk[:], secret)\n\tcopy(e[:], ephemeral)\n\tx448lib.Shared(&ss, &sk, &e)\n\n\treturn ss[:], nil\n}\n\nfunc (c *x448) ValidateECDH(point []byte, secret []byte) error {\n\tvar sk, pk, expectedPk x448lib.Key\n\n\tcopy(pk[:], point)\n\tcopy(sk[:], secret)\n\tx448lib.KeyGen(&expectedPk, &sk)\n\n\tif subtle.ConstantTimeCompare(expectedPk[:], pk[:]) == 0 {\n\t\treturn errors.KeyInvalidError(\"ecc: invalid curve25519 public point\")\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/encoding.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package encoding implements openpgp packet field encodings as specified in\n// RFC 4880 and 6637.\npackage encoding\n\nimport \"io\"\n\n// Field is an encoded field of an openpgp packet.\ntype Field interface {\n\t// Bytes returns the decoded data.\n\tBytes() []byte\n\n\t// BitLength is the size in bits of the decoded data.\n\tBitLength() uint16\n\n\t// EncodedBytes returns the encoded data.\n\tEncodedBytes() []byte\n\n\t// EncodedLength is the size in bytes of the encoded data.\n\tEncodedLength() uint16\n\n\t// ReadFrom reads the next Field from r.\n\tReadFrom(r io.Reader) (int64, error)\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/mpi.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage encoding\n\nimport (\n\t\"io\"\n\t\"math/big\"\n\t\"math/bits\"\n)\n\n// An MPI is used to store the contents of a big integer, along with the bit\n// length that was specified in the original input. This allows the MPI to be\n// reserialized exactly.\ntype MPI struct {\n\tbytes     []byte\n\tbitLength uint16\n}\n\n// NewMPI returns a MPI initialized with bytes.\nfunc NewMPI(bytes []byte) *MPI {\n\tfor len(bytes) != 0 && bytes[0] == 0 {\n\t\tbytes = bytes[1:]\n\t}\n\tif len(bytes) == 0 {\n\t\tbitLength := uint16(0)\n\t\treturn &MPI{bytes, bitLength}\n\t}\n\tbitLength := 8*uint16(len(bytes)-1) + uint16(bits.Len8(bytes[0]))\n\treturn &MPI{bytes, bitLength}\n}\n\n// Bytes returns the decoded data.\nfunc (m *MPI) Bytes() []byte {\n\treturn m.bytes\n}\n\n// BitLength is the size in bits of the decoded data.\nfunc (m *MPI) BitLength() uint16 {\n\treturn m.bitLength\n}\n\n// EncodedBytes returns the encoded data.\nfunc (m *MPI) EncodedBytes() []byte {\n\treturn append([]byte{byte(m.bitLength >> 8), byte(m.bitLength)}, m.bytes...)\n}\n\n// EncodedLength is the size in bytes of the encoded data.\nfunc (m *MPI) EncodedLength() uint16 {\n\treturn uint16(2 + len(m.bytes))\n}\n\n// ReadFrom reads into m the next MPI from r.\nfunc (m *MPI) ReadFrom(r io.Reader) (int64, error) {\n\tvar buf [2]byte\n\tn, err := io.ReadFull(r, buf[0:])\n\tif err != nil {\n\t\tif err == io.EOF {\n\t\t\terr = io.ErrUnexpectedEOF\n\t\t}\n\t\treturn int64(n), err\n\t}\n\n\tm.bitLength = uint16(buf[0])<<8 | uint16(buf[1])\n\tm.bytes = make([]byte, (int(m.bitLength)+7)/8)\n\n\tnn, err := io.ReadFull(r, m.bytes)\n\tif err == io.EOF {\n\t\terr = io.ErrUnexpectedEOF\n\t}\n\n\t// remove leading zero bytes from malformed GnuPG encoded MPIs:\n\t// https://bugs.gnupg.org/gnupg/issue1853\n\t// for _, b := range m.bytes {\n\t// \tif b != 0 {\n\t// \t\tbreak\n\t// \t}\n\t// \tm.bytes = m.bytes[1:]\n\t// \tm.bitLength -= 8\n\t// }\n\n\treturn int64(n) + int64(nn), err\n}\n\n// SetBig initializes m with the bits from n.\nfunc (m *MPI) SetBig(n *big.Int) *MPI {\n\tm.bytes = n.Bytes()\n\tm.bitLength = uint16(n.BitLen())\n\treturn m\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/oid.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage encoding\n\nimport (\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n)\n\n// OID is used to store a variable-length field with a one-octet size\n// prefix. See https://tools.ietf.org/html/rfc6637#section-9.\ntype OID struct {\n\tbytes []byte\n}\n\nconst (\n\t// maxOID is the maximum number of bytes in a OID.\n\tmaxOID = 254\n\t// reservedOIDLength1 and reservedOIDLength2 are OID lengths that the RFC\n\t// specifies are reserved.\n\treservedOIDLength1 = 0\n\treservedOIDLength2 = 0xff\n)\n\n// NewOID returns a OID initialized with bytes.\nfunc NewOID(bytes []byte) *OID {\n\tswitch len(bytes) {\n\tcase reservedOIDLength1, reservedOIDLength2:\n\t\tpanic(\"encoding: NewOID argument length is reserved\")\n\tdefault:\n\t\tif len(bytes) > maxOID {\n\t\t\tpanic(\"encoding: NewOID argument too large\")\n\t\t}\n\t}\n\n\treturn &OID{\n\t\tbytes: bytes,\n\t}\n}\n\n// Bytes returns the decoded data.\nfunc (o *OID) Bytes() []byte {\n\treturn o.bytes\n}\n\n// BitLength is the size in bits of the decoded data.\nfunc (o *OID) BitLength() uint16 {\n\treturn uint16(len(o.bytes) * 8)\n}\n\n// EncodedBytes returns the encoded data.\nfunc (o *OID) EncodedBytes() []byte {\n\treturn append([]byte{byte(len(o.bytes))}, o.bytes...)\n}\n\n// EncodedLength is the size in bytes of the encoded data.\nfunc (o *OID) EncodedLength() uint16 {\n\treturn uint16(1 + len(o.bytes))\n}\n\n// ReadFrom reads into b the next OID from r.\nfunc (o *OID) ReadFrom(r io.Reader) (int64, error) {\n\tvar buf [1]byte\n\tn, err := io.ReadFull(r, buf[:])\n\tif err != nil {\n\t\tif err == io.EOF {\n\t\t\terr = io.ErrUnexpectedEOF\n\t\t}\n\t\treturn int64(n), err\n\t}\n\n\tswitch buf[0] {\n\tcase reservedOIDLength1, reservedOIDLength2:\n\t\treturn int64(n), errors.UnsupportedError(\"reserved for future extensions\")\n\t}\n\n\to.bytes = make([]byte, buf[0])\n\n\tnn, err := io.ReadFull(r, o.bytes)\n\tif err == io.EOF {\n\t\terr = io.ErrUnexpectedEOF\n\t}\n\n\treturn int64(n) + int64(nn), err\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/key_generation.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage openpgp\n\nimport (\n\t\"crypto\"\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\tgoerrors \"errors\"\n\t\"io\"\n\t\"math/big\"\n\t\"time\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/ecdh\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/ecdsa\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/ed25519\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/ed448\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/eddsa\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/algorithm\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/ecc\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/packet\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/x25519\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/x448\"\n)\n\n// NewEntity returns an Entity that contains a fresh RSA/RSA keypair with a\n// single identity composed of the given full name, comment and email, any of\n// which may be empty but must not contain any of \"()<>\\x00\".\n// If config is nil, sensible defaults will be used.\nfunc NewEntity(name, comment, email string, config *packet.Config) (*Entity, error) {\n\tcreationTime := config.Now()\n\tkeyLifetimeSecs := config.KeyLifetime()\n\n\t// Generate a primary signing key\n\tprimaryPrivRaw, err := newSigner(config)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tprimary := packet.NewSignerPrivateKey(creationTime, primaryPrivRaw)\n\tif config.V6() {\n\t\tif err := primary.UpgradeToV6(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\te := &Entity{\n\t\tPrimaryKey: &primary.PublicKey,\n\t\tPrivateKey: primary,\n\t\tIdentities: make(map[string]*Identity),\n\t\tSubkeys:    []Subkey{},\n\t\tSignatures: []*packet.Signature{},\n\t}\n\n\tif config.V6() {\n\t\t// In v6 keys algorithm preferences should be stored in direct key signatures\n\t\tselfSignature := createSignaturePacket(&primary.PublicKey, packet.SigTypeDirectSignature, config)\n\t\terr = writeKeyProperties(selfSignature, creationTime, keyLifetimeSecs, config)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\terr = selfSignature.SignDirectKeyBinding(&primary.PublicKey, primary, config)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\te.Signatures = append(e.Signatures, selfSignature)\n\t\te.SelfSignature = selfSignature\n\t}\n\n\terr = e.addUserId(name, comment, email, config, creationTime, keyLifetimeSecs, !config.V6())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// NOTE: No key expiry here, but we will not return this subkey in EncryptionKey()\n\t// if the primary/master key has expired.\n\terr = e.addEncryptionSubkey(config, creationTime, 0)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn e, nil\n}\n\nfunc (t *Entity) AddUserId(name, comment, email string, config *packet.Config) error {\n\tcreationTime := config.Now()\n\tkeyLifetimeSecs := config.KeyLifetime()\n\treturn t.addUserId(name, comment, email, config, creationTime, keyLifetimeSecs, !config.V6())\n}\n\nfunc writeKeyProperties(selfSignature *packet.Signature, creationTime time.Time, keyLifetimeSecs uint32, config *packet.Config) error {\n\tadvertiseAead := config.AEAD() != nil\n\n\tselfSignature.CreationTime = creationTime\n\tselfSignature.KeyLifetimeSecs = &keyLifetimeSecs\n\tselfSignature.FlagsValid = true\n\tselfSignature.FlagSign = true\n\tselfSignature.FlagCertify = true\n\tselfSignature.SEIPDv1 = true // true by default, see 5.8 vs. 5.14\n\tselfSignature.SEIPDv2 = advertiseAead\n\n\t// Set the PreferredHash for the SelfSignature from the packet.Config.\n\t// If it is not the must-implement algorithm from rfc4880bis, append that.\n\thash, ok := algorithm.HashToHashId(config.Hash())\n\tif !ok {\n\t\treturn errors.UnsupportedError(\"unsupported preferred hash function\")\n\t}\n\n\tselfSignature.PreferredHash = []uint8{hash}\n\tif config.Hash() != crypto.SHA256 {\n\t\tselfSignature.PreferredHash = append(selfSignature.PreferredHash, hashToHashId(crypto.SHA256))\n\t}\n\n\t// Likewise for DefaultCipher.\n\tselfSignature.PreferredSymmetric = []uint8{uint8(config.Cipher())}\n\tif config.Cipher() != packet.CipherAES128 {\n\t\tselfSignature.PreferredSymmetric = append(selfSignature.PreferredSymmetric, uint8(packet.CipherAES128))\n\t}\n\n\t// We set CompressionNone as the preferred compression algorithm because\n\t// of compression side channel attacks, then append the configured\n\t// DefaultCompressionAlgo if any is set (to signal support for cases\n\t// where the application knows that using compression is safe).\n\tselfSignature.PreferredCompression = []uint8{uint8(packet.CompressionNone)}\n\tif config.Compression() != packet.CompressionNone {\n\t\tselfSignature.PreferredCompression = append(selfSignature.PreferredCompression, uint8(config.Compression()))\n\t}\n\n\tif advertiseAead {\n\t\t// Get the preferred AEAD mode from the packet.Config.\n\t\t// If it is not the must-implement algorithm from rfc9580, append that.\n\t\tmodes := []uint8{uint8(config.AEAD().Mode())}\n\t\tif config.AEAD().Mode() != packet.AEADModeOCB {\n\t\t\tmodes = append(modes, uint8(packet.AEADModeOCB))\n\t\t}\n\n\t\t// For preferred (AES256, GCM), we'll generate (AES256, GCM), (AES256, OCB), (AES128, GCM), (AES128, OCB)\n\t\tfor _, cipher := range selfSignature.PreferredSymmetric {\n\t\t\tfor _, mode := range modes {\n\t\t\t\tselfSignature.PreferredCipherSuites = append(selfSignature.PreferredCipherSuites, [2]uint8{cipher, mode})\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (t *Entity) addUserId(name, comment, email string, config *packet.Config, creationTime time.Time, keyLifetimeSecs uint32, writeProperties bool) error {\n\tuid := packet.NewUserId(name, comment, email)\n\tif uid == nil {\n\t\treturn errors.InvalidArgumentError(\"user id field contained invalid characters\")\n\t}\n\n\tif _, ok := t.Identities[uid.Id]; ok {\n\t\treturn errors.InvalidArgumentError(\"user id exist\")\n\t}\n\n\tprimary := t.PrivateKey\n\tisPrimaryId := len(t.Identities) == 0\n\tselfSignature := createSignaturePacket(&primary.PublicKey, packet.SigTypePositiveCert, config)\n\tif writeProperties {\n\t\terr := writeKeyProperties(selfSignature, creationTime, keyLifetimeSecs, config)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tselfSignature.IsPrimaryId = &isPrimaryId\n\n\t// User ID binding signature\n\terr := selfSignature.SignUserId(uid.Id, &primary.PublicKey, primary, config)\n\tif err != nil {\n\t\treturn err\n\t}\n\tt.Identities[uid.Id] = &Identity{\n\t\tName:          uid.Id,\n\t\tUserId:        uid,\n\t\tSelfSignature: selfSignature,\n\t\tSignatures:    []*packet.Signature{selfSignature},\n\t}\n\treturn nil\n}\n\n// AddSigningSubkey adds a signing keypair as a subkey to the Entity.\n// If config is nil, sensible defaults will be used.\nfunc (e *Entity) AddSigningSubkey(config *packet.Config) error {\n\tcreationTime := config.Now()\n\tkeyLifetimeSecs := config.KeyLifetime()\n\n\tsubPrivRaw, err := newSigner(config)\n\tif err != nil {\n\t\treturn err\n\t}\n\tsub := packet.NewSignerPrivateKey(creationTime, subPrivRaw)\n\tsub.IsSubkey = true\n\tif config.V6() {\n\t\tif err := sub.UpgradeToV6(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tsubkey := Subkey{\n\t\tPublicKey:  &sub.PublicKey,\n\t\tPrivateKey: sub,\n\t}\n\tsubkey.Sig = createSignaturePacket(e.PrimaryKey, packet.SigTypeSubkeyBinding, config)\n\tsubkey.Sig.CreationTime = creationTime\n\tsubkey.Sig.KeyLifetimeSecs = &keyLifetimeSecs\n\tsubkey.Sig.FlagsValid = true\n\tsubkey.Sig.FlagSign = true\n\tsubkey.Sig.EmbeddedSignature = createSignaturePacket(subkey.PublicKey, packet.SigTypePrimaryKeyBinding, config)\n\tsubkey.Sig.EmbeddedSignature.CreationTime = creationTime\n\n\terr = subkey.Sig.EmbeddedSignature.CrossSignKey(subkey.PublicKey, e.PrimaryKey, subkey.PrivateKey, config)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = subkey.Sig.SignKey(subkey.PublicKey, e.PrivateKey, config)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\te.Subkeys = append(e.Subkeys, subkey)\n\treturn nil\n}\n\n// AddEncryptionSubkey adds an encryption keypair as a subkey to the Entity.\n// If config is nil, sensible defaults will be used.\nfunc (e *Entity) AddEncryptionSubkey(config *packet.Config) error {\n\tcreationTime := config.Now()\n\tkeyLifetimeSecs := config.KeyLifetime()\n\treturn e.addEncryptionSubkey(config, creationTime, keyLifetimeSecs)\n}\n\nfunc (e *Entity) addEncryptionSubkey(config *packet.Config, creationTime time.Time, keyLifetimeSecs uint32) error {\n\tsubPrivRaw, err := newDecrypter(config)\n\tif err != nil {\n\t\treturn err\n\t}\n\tsub := packet.NewDecrypterPrivateKey(creationTime, subPrivRaw)\n\tsub.IsSubkey = true\n\tif config.V6() {\n\t\tif err := sub.UpgradeToV6(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tsubkey := Subkey{\n\t\tPublicKey:  &sub.PublicKey,\n\t\tPrivateKey: sub,\n\t}\n\tsubkey.Sig = createSignaturePacket(e.PrimaryKey, packet.SigTypeSubkeyBinding, config)\n\tsubkey.Sig.CreationTime = creationTime\n\tsubkey.Sig.KeyLifetimeSecs = &keyLifetimeSecs\n\tsubkey.Sig.FlagsValid = true\n\tsubkey.Sig.FlagEncryptStorage = true\n\tsubkey.Sig.FlagEncryptCommunications = true\n\n\terr = subkey.Sig.SignKey(subkey.PublicKey, e.PrivateKey, config)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\te.Subkeys = append(e.Subkeys, subkey)\n\treturn nil\n}\n\n// Generates a signing key\nfunc newSigner(config *packet.Config) (signer interface{}, err error) {\n\tswitch config.PublicKeyAlgorithm() {\n\tcase packet.PubKeyAlgoRSA:\n\t\tbits := config.RSAModulusBits()\n\t\tif bits < 1024 {\n\t\t\treturn nil, errors.InvalidArgumentError(\"bits must be >= 1024\")\n\t\t}\n\t\tif config != nil && len(config.RSAPrimes) >= 2 {\n\t\t\tprimes := config.RSAPrimes[0:2]\n\t\t\tconfig.RSAPrimes = config.RSAPrimes[2:]\n\t\t\treturn generateRSAKeyWithPrimes(config.Random(), 2, bits, primes)\n\t\t}\n\t\treturn rsa.GenerateKey(config.Random(), bits)\n\tcase packet.PubKeyAlgoEdDSA:\n\t\tif config.V6() {\n\t\t\t// Implementations MUST NOT accept or generate v6 key material\n\t\t\t// using the deprecated OIDs.\n\t\t\treturn nil, errors.InvalidArgumentError(\"EdDSALegacy cannot be used for v6 keys\")\n\t\t}\n\t\tcurve := ecc.FindEdDSAByGenName(string(config.CurveName()))\n\t\tif curve == nil {\n\t\t\treturn nil, errors.InvalidArgumentError(\"unsupported curve\")\n\t\t}\n\n\t\tpriv, err := eddsa.GenerateKey(config.Random(), curve)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn priv, nil\n\tcase packet.PubKeyAlgoECDSA:\n\t\tcurve := ecc.FindECDSAByGenName(string(config.CurveName()))\n\t\tif curve == nil {\n\t\t\treturn nil, errors.InvalidArgumentError(\"unsupported curve\")\n\t\t}\n\n\t\tpriv, err := ecdsa.GenerateKey(config.Random(), curve)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn priv, nil\n\tcase packet.PubKeyAlgoEd25519:\n\t\tpriv, err := ed25519.GenerateKey(config.Random())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn priv, nil\n\tcase packet.PubKeyAlgoEd448:\n\t\tpriv, err := ed448.GenerateKey(config.Random())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn priv, nil\n\tdefault:\n\t\treturn nil, errors.InvalidArgumentError(\"unsupported public key algorithm\")\n\t}\n}\n\n// Generates an encryption/decryption key\nfunc newDecrypter(config *packet.Config) (decrypter interface{}, err error) {\n\tswitch config.PublicKeyAlgorithm() {\n\tcase packet.PubKeyAlgoRSA:\n\t\tbits := config.RSAModulusBits()\n\t\tif bits < 1024 {\n\t\t\treturn nil, errors.InvalidArgumentError(\"bits must be >= 1024\")\n\t\t}\n\t\tif config != nil && len(config.RSAPrimes) >= 2 {\n\t\t\tprimes := config.RSAPrimes[0:2]\n\t\t\tconfig.RSAPrimes = config.RSAPrimes[2:]\n\t\t\treturn generateRSAKeyWithPrimes(config.Random(), 2, bits, primes)\n\t\t}\n\t\treturn rsa.GenerateKey(config.Random(), bits)\n\tcase packet.PubKeyAlgoEdDSA, packet.PubKeyAlgoECDSA:\n\t\tfallthrough // When passing EdDSA or ECDSA, we generate an ECDH subkey\n\tcase packet.PubKeyAlgoECDH:\n\t\tif config.V6() &&\n\t\t\t(config.CurveName() == packet.Curve25519 ||\n\t\t\t\tconfig.CurveName() == packet.Curve448) {\n\t\t\t// Implementations MUST NOT accept or generate v6 key material\n\t\t\t// using the deprecated OIDs.\n\t\t\treturn nil, errors.InvalidArgumentError(\"ECDH with Curve25519/448 legacy cannot be used for v6 keys\")\n\t\t}\n\t\tvar kdf = ecdh.KDF{\n\t\t\tHash:   algorithm.SHA512,\n\t\t\tCipher: algorithm.AES256,\n\t\t}\n\t\tcurve := ecc.FindECDHByGenName(string(config.CurveName()))\n\t\tif curve == nil {\n\t\t\treturn nil, errors.InvalidArgumentError(\"unsupported curve\")\n\t\t}\n\t\treturn ecdh.GenerateKey(config.Random(), curve, kdf)\n\tcase packet.PubKeyAlgoEd25519, packet.PubKeyAlgoX25519: // When passing Ed25519, we generate an x25519 subkey\n\t\treturn x25519.GenerateKey(config.Random())\n\tcase packet.PubKeyAlgoEd448, packet.PubKeyAlgoX448: // When passing Ed448, we generate an x448 subkey\n\t\treturn x448.GenerateKey(config.Random())\n\tdefault:\n\t\treturn nil, errors.InvalidArgumentError(\"unsupported public key algorithm\")\n\t}\n}\n\nvar bigOne = big.NewInt(1)\n\n// generateRSAKeyWithPrimes generates a multi-prime RSA keypair of the\n// given bit size, using the given random source and pre-populated primes.\nfunc generateRSAKeyWithPrimes(random io.Reader, nprimes int, bits int, prepopulatedPrimes []*big.Int) (*rsa.PrivateKey, error) {\n\tpriv := new(rsa.PrivateKey)\n\tpriv.E = 65537\n\n\tif nprimes < 2 {\n\t\treturn nil, goerrors.New(\"generateRSAKeyWithPrimes: nprimes must be >= 2\")\n\t}\n\n\tif bits < 1024 {\n\t\treturn nil, goerrors.New(\"generateRSAKeyWithPrimes: bits must be >= 1024\")\n\t}\n\n\tprimes := make([]*big.Int, nprimes)\n\nNextSetOfPrimes:\n\tfor {\n\t\ttodo := bits\n\t\t// crypto/rand should set the top two bits in each prime.\n\t\t// Thus each prime has the form\n\t\t//   p_i = 2^bitlen(p_i) × 0.11... (in base 2).\n\t\t// And the product is:\n\t\t//   P = 2^todo × α\n\t\t// where α is the product of nprimes numbers of the form 0.11...\n\t\t//\n\t\t// If α < 1/2 (which can happen for nprimes > 2), we need to\n\t\t// shift todo to compensate for lost bits: the mean value of 0.11...\n\t\t// is 7/8, so todo + shift - nprimes * log2(7/8) ~= bits - 1/2\n\t\t// will give good results.\n\t\tif nprimes >= 7 {\n\t\t\ttodo += (nprimes - 2) / 5\n\t\t}\n\t\tfor i := 0; i < nprimes; i++ {\n\t\t\tvar err error\n\t\t\tif len(prepopulatedPrimes) == 0 {\n\t\t\t\tprimes[i], err = rand.Prime(random, todo/(nprimes-i))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tprimes[i] = prepopulatedPrimes[0]\n\t\t\t\tprepopulatedPrimes = prepopulatedPrimes[1:]\n\t\t\t}\n\n\t\t\ttodo -= primes[i].BitLen()\n\t\t}\n\n\t\t// Make sure that primes is pairwise unequal.\n\t\tfor i, prime := range primes {\n\t\t\tfor j := 0; j < i; j++ {\n\t\t\t\tif prime.Cmp(primes[j]) == 0 {\n\t\t\t\t\tcontinue NextSetOfPrimes\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tn := new(big.Int).Set(bigOne)\n\t\ttotient := new(big.Int).Set(bigOne)\n\t\tpminus1 := new(big.Int)\n\t\tfor _, prime := range primes {\n\t\t\tn.Mul(n, prime)\n\t\t\tpminus1.Sub(prime, bigOne)\n\t\t\ttotient.Mul(totient, pminus1)\n\t\t}\n\t\tif n.BitLen() != bits {\n\t\t\t// This should never happen for nprimes == 2 because\n\t\t\t// crypto/rand should set the top two bits in each prime.\n\t\t\t// For nprimes > 2 we hope it does not happen often.\n\t\t\tcontinue NextSetOfPrimes\n\t\t}\n\n\t\tpriv.D = new(big.Int)\n\t\te := big.NewInt(int64(priv.E))\n\t\tok := priv.D.ModInverse(e, totient)\n\n\t\tif ok != nil {\n\t\t\tpriv.Primes = primes\n\t\t\tpriv.N = n\n\t\t\tbreak\n\t\t}\n\t}\n\n\tpriv.Precompute()\n\treturn priv, nil\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/keys.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage openpgp\n\nimport (\n\tgoerrors \"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"time\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/armor\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/packet\"\n)\n\n// PublicKeyType is the armor type for a PGP public key.\nvar PublicKeyType = \"PGP PUBLIC KEY BLOCK\"\n\n// PrivateKeyType is the armor type for a PGP private key.\nvar PrivateKeyType = \"PGP PRIVATE KEY BLOCK\"\n\n// An Entity represents the components of an OpenPGP key: a primary public key\n// (which must be a signing key), one or more identities claimed by that key,\n// and zero or more subkeys, which may be encryption keys.\ntype Entity struct {\n\tPrimaryKey    *packet.PublicKey\n\tPrivateKey    *packet.PrivateKey\n\tIdentities    map[string]*Identity // indexed by Identity.Name\n\tRevocations   []*packet.Signature\n\tSubkeys       []Subkey\n\tSelfSignature *packet.Signature   // Direct-key self signature of the PrimaryKey (contains primary key properties in v6)\n\tSignatures    []*packet.Signature // all (potentially unverified) self-signatures, revocations, and third-party signatures\n}\n\n// An Identity represents an identity claimed by an Entity and zero or more\n// assertions by other entities about that claim.\ntype Identity struct {\n\tName          string // by convention, has the form \"Full Name (comment) <email@example.com>\"\n\tUserId        *packet.UserId\n\tSelfSignature *packet.Signature\n\tRevocations   []*packet.Signature\n\tSignatures    []*packet.Signature // all (potentially unverified) self-signatures, revocations, and third-party signatures\n}\n\n// A Subkey is an additional public key in an Entity. Subkeys can be used for\n// encryption.\ntype Subkey struct {\n\tPublicKey   *packet.PublicKey\n\tPrivateKey  *packet.PrivateKey\n\tSig         *packet.Signature\n\tRevocations []*packet.Signature\n}\n\n// A Key identifies a specific public key in an Entity. This is either the\n// Entity's primary key or a subkey.\ntype Key struct {\n\tEntity        *Entity\n\tPublicKey     *packet.PublicKey\n\tPrivateKey    *packet.PrivateKey\n\tSelfSignature *packet.Signature\n\tRevocations   []*packet.Signature\n}\n\n// A KeyRing provides access to public and private keys.\ntype KeyRing interface {\n\t// KeysById returns the set of keys that have the given key id.\n\tKeysById(id uint64) []Key\n\t// KeysByIdAndUsage returns the set of keys with the given id\n\t// that also meet the key usage given by requiredUsage.\n\t// The requiredUsage is expressed as the bitwise-OR of\n\t// packet.KeyFlag* values.\n\tKeysByIdUsage(id uint64, requiredUsage byte) []Key\n\t// DecryptionKeys returns all private keys that are valid for\n\t// decryption.\n\tDecryptionKeys() []Key\n}\n\n// PrimaryIdentity returns an Identity, preferring non-revoked identities,\n// identities marked as primary, or the latest-created identity, in that order.\nfunc (e *Entity) PrimaryIdentity() *Identity {\n\tvar primaryIdentity *Identity\n\tfor _, ident := range e.Identities {\n\t\tif shouldPreferIdentity(primaryIdentity, ident) {\n\t\t\tprimaryIdentity = ident\n\t\t}\n\t}\n\treturn primaryIdentity\n}\n\nfunc shouldPreferIdentity(existingId, potentialNewId *Identity) bool {\n\tif existingId == nil {\n\t\treturn true\n\t}\n\n\tif len(existingId.Revocations) > len(potentialNewId.Revocations) {\n\t\treturn true\n\t}\n\n\tif len(existingId.Revocations) < len(potentialNewId.Revocations) {\n\t\treturn false\n\t}\n\n\tif existingId.SelfSignature == nil {\n\t\treturn true\n\t}\n\n\tif existingId.SelfSignature.IsPrimaryId != nil && *existingId.SelfSignature.IsPrimaryId &&\n\t\t!(potentialNewId.SelfSignature.IsPrimaryId != nil && *potentialNewId.SelfSignature.IsPrimaryId) {\n\t\treturn false\n\t}\n\n\tif !(existingId.SelfSignature.IsPrimaryId != nil && *existingId.SelfSignature.IsPrimaryId) &&\n\t\tpotentialNewId.SelfSignature.IsPrimaryId != nil && *potentialNewId.SelfSignature.IsPrimaryId {\n\t\treturn true\n\t}\n\n\treturn potentialNewId.SelfSignature.CreationTime.After(existingId.SelfSignature.CreationTime)\n}\n\n// EncryptionKey returns the best candidate Key for encrypting a message to the\n// given Entity.\nfunc (e *Entity) EncryptionKey(now time.Time) (Key, bool) {\n\t// Fail to find any encryption key if the...\n\tprimarySelfSignature, primaryIdentity := e.PrimarySelfSignature()\n\tif primarySelfSignature == nil || // no self-signature found\n\t\te.PrimaryKey.KeyExpired(primarySelfSignature, now) || // primary key has expired\n\t\te.Revoked(now) || // primary key has been revoked\n\t\tprimarySelfSignature.SigExpired(now) || // user ID or or direct self-signature has expired\n\t\t(primaryIdentity != nil && primaryIdentity.Revoked(now)) { // user ID has been revoked (for v4 keys)\n\t\treturn Key{}, false\n\t}\n\n\t// Iterate the keys to find the newest, unexpired one\n\tcandidateSubkey := -1\n\tvar maxTime time.Time\n\tfor i, subkey := range e.Subkeys {\n\t\tif subkey.Sig.FlagsValid &&\n\t\t\tsubkey.Sig.FlagEncryptCommunications &&\n\t\t\tsubkey.PublicKey.PubKeyAlgo.CanEncrypt() &&\n\t\t\t!subkey.PublicKey.KeyExpired(subkey.Sig, now) &&\n\t\t\t!subkey.Sig.SigExpired(now) &&\n\t\t\t!subkey.Revoked(now) &&\n\t\t\t(maxTime.IsZero() || subkey.Sig.CreationTime.After(maxTime)) {\n\t\t\tcandidateSubkey = i\n\t\t\tmaxTime = subkey.Sig.CreationTime\n\t\t}\n\t}\n\n\tif candidateSubkey != -1 {\n\t\tsubkey := e.Subkeys[candidateSubkey]\n\t\treturn Key{e, subkey.PublicKey, subkey.PrivateKey, subkey.Sig, subkey.Revocations}, true\n\t}\n\n\t// If we don't have any subkeys for encryption and the primary key\n\t// is marked as OK to encrypt with, then we can use it.\n\tif primarySelfSignature.FlagsValid && primarySelfSignature.FlagEncryptCommunications &&\n\t\te.PrimaryKey.PubKeyAlgo.CanEncrypt() {\n\t\treturn Key{e, e.PrimaryKey, e.PrivateKey, primarySelfSignature, e.Revocations}, true\n\t}\n\n\treturn Key{}, false\n}\n\n// CertificationKey return the best candidate Key for certifying a key with this\n// Entity.\nfunc (e *Entity) CertificationKey(now time.Time) (Key, bool) {\n\treturn e.CertificationKeyById(now, 0)\n}\n\n// CertificationKeyById return the Key for key certification with this\n// Entity and keyID.\nfunc (e *Entity) CertificationKeyById(now time.Time, id uint64) (Key, bool) {\n\treturn e.signingKeyByIdUsage(now, id, packet.KeyFlagCertify)\n}\n\n// SigningKey return the best candidate Key for signing a message with this\n// Entity.\nfunc (e *Entity) SigningKey(now time.Time) (Key, bool) {\n\treturn e.SigningKeyById(now, 0)\n}\n\n// SigningKeyById return the Key for signing a message with this\n// Entity and keyID.\nfunc (e *Entity) SigningKeyById(now time.Time, id uint64) (Key, bool) {\n\treturn e.signingKeyByIdUsage(now, id, packet.KeyFlagSign)\n}\n\nfunc (e *Entity) signingKeyByIdUsage(now time.Time, id uint64, flags int) (Key, bool) {\n\t// Fail to find any signing key if the...\n\tprimarySelfSignature, primaryIdentity := e.PrimarySelfSignature()\n\tif primarySelfSignature == nil || // no self-signature found\n\t\te.PrimaryKey.KeyExpired(primarySelfSignature, now) || // primary key has expired\n\t\te.Revoked(now) || // primary key has been revoked\n\t\tprimarySelfSignature.SigExpired(now) || // user ID or direct self-signature has expired\n\t\t(primaryIdentity != nil && primaryIdentity.Revoked(now)) { // user ID has been revoked (for v4 keys)\n\t\treturn Key{}, false\n\t}\n\n\t// Iterate the keys to find the newest, unexpired one\n\tcandidateSubkey := -1\n\tvar maxTime time.Time\n\tfor idx, subkey := range e.Subkeys {\n\t\tif subkey.Sig.FlagsValid &&\n\t\t\t(flags&packet.KeyFlagCertify == 0 || subkey.Sig.FlagCertify) &&\n\t\t\t(flags&packet.KeyFlagSign == 0 || subkey.Sig.FlagSign) &&\n\t\t\tsubkey.PublicKey.PubKeyAlgo.CanSign() &&\n\t\t\t!subkey.PublicKey.KeyExpired(subkey.Sig, now) &&\n\t\t\t!subkey.Sig.SigExpired(now) &&\n\t\t\t!subkey.Revoked(now) &&\n\t\t\t(maxTime.IsZero() || subkey.Sig.CreationTime.After(maxTime)) &&\n\t\t\t(id == 0 || subkey.PublicKey.KeyId == id) {\n\t\t\tcandidateSubkey = idx\n\t\t\tmaxTime = subkey.Sig.CreationTime\n\t\t}\n\t}\n\n\tif candidateSubkey != -1 {\n\t\tsubkey := e.Subkeys[candidateSubkey]\n\t\treturn Key{e, subkey.PublicKey, subkey.PrivateKey, subkey.Sig, subkey.Revocations}, true\n\t}\n\n\t// If we don't have any subkeys for signing and the primary key\n\t// is marked as OK to sign with, then we can use it.\n\tif primarySelfSignature.FlagsValid &&\n\t\t(flags&packet.KeyFlagCertify == 0 || primarySelfSignature.FlagCertify) &&\n\t\t(flags&packet.KeyFlagSign == 0 || primarySelfSignature.FlagSign) &&\n\t\te.PrimaryKey.PubKeyAlgo.CanSign() &&\n\t\t(id == 0 || e.PrimaryKey.KeyId == id) {\n\t\treturn Key{e, e.PrimaryKey, e.PrivateKey, primarySelfSignature, e.Revocations}, true\n\t}\n\n\t// No keys with a valid Signing Flag or no keys matched the id passed in\n\treturn Key{}, false\n}\n\nfunc revoked(revocations []*packet.Signature, now time.Time) bool {\n\tfor _, revocation := range revocations {\n\t\tif revocation.RevocationReason != nil && *revocation.RevocationReason == packet.KeyCompromised {\n\t\t\t// If the key is compromised, the key is considered revoked even before the revocation date.\n\t\t\treturn true\n\t\t}\n\t\tif !revocation.SigExpired(now) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// Revoked returns whether the entity has any direct key revocation signatures.\n// Note that third-party revocation signatures are not supported.\n// Note also that Identity and Subkey revocation should be checked separately.\nfunc (e *Entity) Revoked(now time.Time) bool {\n\treturn revoked(e.Revocations, now)\n}\n\n// EncryptPrivateKeys encrypts all non-encrypted keys in the entity with the same key\n// derived from the provided passphrase. Public keys and dummy keys are ignored,\n// and don't cause an error to be returned.\nfunc (e *Entity) EncryptPrivateKeys(passphrase []byte, config *packet.Config) error {\n\tvar keysToEncrypt []*packet.PrivateKey\n\t// Add entity private key to encrypt.\n\tif e.PrivateKey != nil && !e.PrivateKey.Dummy() && !e.PrivateKey.Encrypted {\n\t\tkeysToEncrypt = append(keysToEncrypt, e.PrivateKey)\n\t}\n\n\t// Add subkeys to encrypt.\n\tfor _, sub := range e.Subkeys {\n\t\tif sub.PrivateKey != nil && !sub.PrivateKey.Dummy() && !sub.PrivateKey.Encrypted {\n\t\t\tkeysToEncrypt = append(keysToEncrypt, sub.PrivateKey)\n\t\t}\n\t}\n\treturn packet.EncryptPrivateKeys(keysToEncrypt, passphrase, config)\n}\n\n// DecryptPrivateKeys decrypts all encrypted keys in the entity with the given passphrase.\n// Avoids recomputation of similar s2k key derivations. Public keys and dummy keys are ignored,\n// and don't cause an error to be returned.\nfunc (e *Entity) DecryptPrivateKeys(passphrase []byte) error {\n\tvar keysToDecrypt []*packet.PrivateKey\n\t// Add entity private key to decrypt.\n\tif e.PrivateKey != nil && !e.PrivateKey.Dummy() && e.PrivateKey.Encrypted {\n\t\tkeysToDecrypt = append(keysToDecrypt, e.PrivateKey)\n\t}\n\n\t// Add subkeys to decrypt.\n\tfor _, sub := range e.Subkeys {\n\t\tif sub.PrivateKey != nil && !sub.PrivateKey.Dummy() && sub.PrivateKey.Encrypted {\n\t\t\tkeysToDecrypt = append(keysToDecrypt, sub.PrivateKey)\n\t\t}\n\t}\n\treturn packet.DecryptPrivateKeys(keysToDecrypt, passphrase)\n}\n\n// Revoked returns whether the identity has been revoked by a self-signature.\n// Note that third-party revocation signatures are not supported.\nfunc (i *Identity) Revoked(now time.Time) bool {\n\treturn revoked(i.Revocations, now)\n}\n\n// Revoked returns whether the subkey has been revoked by a self-signature.\n// Note that third-party revocation signatures are not supported.\nfunc (s *Subkey) Revoked(now time.Time) bool {\n\treturn revoked(s.Revocations, now)\n}\n\n// Revoked returns whether the key or subkey has been revoked by a self-signature.\n// Note that third-party revocation signatures are not supported.\n// Note also that Identity revocation should be checked separately.\n// Normally, it's not necessary to call this function, except on keys returned by\n// KeysById or KeysByIdUsage.\nfunc (key *Key) Revoked(now time.Time) bool {\n\treturn revoked(key.Revocations, now)\n}\n\n// An EntityList contains one or more Entities.\ntype EntityList []*Entity\n\n// KeysById returns the set of keys that have the given key id.\nfunc (el EntityList) KeysById(id uint64) (keys []Key) {\n\tfor _, e := range el {\n\t\tif e.PrimaryKey.KeyId == id {\n\t\t\tselfSig, _ := e.PrimarySelfSignature()\n\t\t\tkeys = append(keys, Key{e, e.PrimaryKey, e.PrivateKey, selfSig, e.Revocations})\n\t\t}\n\n\t\tfor _, subKey := range e.Subkeys {\n\t\t\tif subKey.PublicKey.KeyId == id {\n\t\t\t\tkeys = append(keys, Key{e, subKey.PublicKey, subKey.PrivateKey, subKey.Sig, subKey.Revocations})\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// KeysByIdAndUsage returns the set of keys with the given id that also meet\n// the key usage given by requiredUsage.  The requiredUsage is expressed as\n// the bitwise-OR of packet.KeyFlag* values.\nfunc (el EntityList) KeysByIdUsage(id uint64, requiredUsage byte) (keys []Key) {\n\tfor _, key := range el.KeysById(id) {\n\t\tif requiredUsage != 0 {\n\t\t\tif key.SelfSignature == nil || !key.SelfSignature.FlagsValid {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tvar usage byte\n\t\t\tif key.SelfSignature.FlagCertify {\n\t\t\t\tusage |= packet.KeyFlagCertify\n\t\t\t}\n\t\t\tif key.SelfSignature.FlagSign {\n\t\t\t\tusage |= packet.KeyFlagSign\n\t\t\t}\n\t\t\tif key.SelfSignature.FlagEncryptCommunications {\n\t\t\t\tusage |= packet.KeyFlagEncryptCommunications\n\t\t\t}\n\t\t\tif key.SelfSignature.FlagEncryptStorage {\n\t\t\t\tusage |= packet.KeyFlagEncryptStorage\n\t\t\t}\n\t\t\tif usage&requiredUsage != requiredUsage {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\tkeys = append(keys, key)\n\t}\n\treturn\n}\n\n// DecryptionKeys returns all private keys that are valid for decryption.\nfunc (el EntityList) DecryptionKeys() (keys []Key) {\n\tfor _, e := range el {\n\t\tfor _, subKey := range e.Subkeys {\n\t\t\tif subKey.PrivateKey != nil && subKey.Sig.FlagsValid && (subKey.Sig.FlagEncryptStorage || subKey.Sig.FlagEncryptCommunications) {\n\t\t\t\tkeys = append(keys, Key{e, subKey.PublicKey, subKey.PrivateKey, subKey.Sig, subKey.Revocations})\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// ReadArmoredKeyRing reads one or more public/private keys from an armor keyring file.\nfunc ReadArmoredKeyRing(r io.Reader) (EntityList, error) {\n\tblock, err := armor.Decode(r)\n\tif err == io.EOF {\n\t\treturn nil, errors.InvalidArgumentError(\"no armored data found\")\n\t}\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif block.Type != PublicKeyType && block.Type != PrivateKeyType {\n\t\treturn nil, errors.InvalidArgumentError(\"expected public or private key block, got: \" + block.Type)\n\t}\n\n\treturn ReadKeyRing(block.Body)\n}\n\n// ReadKeyRing reads one or more public/private keys. Unsupported keys are\n// ignored as long as at least a single valid key is found.\nfunc ReadKeyRing(r io.Reader) (el EntityList, err error) {\n\tpackets := packet.NewReader(r)\n\tvar lastUnsupportedError error\n\n\tfor {\n\t\tvar e *Entity\n\t\te, err = ReadEntity(packets)\n\t\tif err != nil {\n\t\t\t// TODO: warn about skipped unsupported/unreadable keys\n\t\t\tif _, ok := err.(errors.UnsupportedError); ok {\n\t\t\t\tlastUnsupportedError = err\n\t\t\t\terr = readToNextPublicKey(packets)\n\t\t\t} else if _, ok := err.(errors.StructuralError); ok {\n\t\t\t\t// Skip unreadable, badly-formatted keys\n\t\t\t\tlastUnsupportedError = err\n\t\t\t\terr = readToNextPublicKey(packets)\n\t\t\t}\n\t\t\tif err == io.EOF {\n\t\t\t\terr = nil\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\tel = nil\n\t\t\t\tbreak\n\t\t\t}\n\t\t} else {\n\t\t\tel = append(el, e)\n\t\t}\n\t}\n\n\tif len(el) == 0 && err == nil {\n\t\terr = lastUnsupportedError\n\t}\n\treturn\n}\n\n// readToNextPublicKey reads packets until the start of the entity and leaves\n// the first packet of the new entity in the Reader.\nfunc readToNextPublicKey(packets *packet.Reader) (err error) {\n\tvar p packet.Packet\n\tfor {\n\t\tp, err = packets.Next()\n\t\tif err == io.EOF {\n\t\t\treturn\n\t\t} else if err != nil {\n\t\t\tif _, ok := err.(errors.UnsupportedError); ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tif pk, ok := p.(*packet.PublicKey); ok && !pk.IsSubkey {\n\t\t\tpackets.Unread(p)\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// ReadEntity reads an entity (public key, identities, subkeys etc) from the\n// given Reader.\nfunc ReadEntity(packets *packet.Reader) (*Entity, error) {\n\te := new(Entity)\n\te.Identities = make(map[string]*Identity)\n\n\tp, err := packets.Next()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar ok bool\n\tif e.PrimaryKey, ok = p.(*packet.PublicKey); !ok {\n\t\tif e.PrivateKey, ok = p.(*packet.PrivateKey); !ok {\n\t\t\tpackets.Unread(p)\n\t\t\treturn nil, errors.StructuralError(\"first packet was not a public/private key\")\n\t\t}\n\t\te.PrimaryKey = &e.PrivateKey.PublicKey\n\t}\n\n\tif !e.PrimaryKey.PubKeyAlgo.CanSign() {\n\t\treturn nil, errors.StructuralError(\"primary key cannot be used for signatures\")\n\t}\n\n\tvar revocations []*packet.Signature\n\tvar directSignatures []*packet.Signature\nEachPacket:\n\tfor {\n\t\tp, err := packets.Next()\n\t\tif err == io.EOF {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tswitch pkt := p.(type) {\n\t\tcase *packet.UserId:\n\t\t\tif err := addUserID(e, packets, pkt); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\tcase *packet.Signature:\n\t\t\tif pkt.SigType == packet.SigTypeKeyRevocation {\n\t\t\t\trevocations = append(revocations, pkt)\n\t\t\t} else if pkt.SigType == packet.SigTypeDirectSignature {\n\t\t\t\tdirectSignatures = append(directSignatures, pkt)\n\t\t\t}\n\t\t\t// Else, ignoring the signature as it does not follow anything\n\t\t\t// we would know to attach it to.\n\t\tcase *packet.PrivateKey:\n\t\t\tif !pkt.IsSubkey {\n\t\t\t\tpackets.Unread(p)\n\t\t\t\tbreak EachPacket\n\t\t\t}\n\t\t\terr = addSubkey(e, packets, &pkt.PublicKey, pkt)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\tcase *packet.PublicKey:\n\t\t\tif !pkt.IsSubkey {\n\t\t\t\tpackets.Unread(p)\n\t\t\t\tbreak EachPacket\n\t\t\t}\n\t\t\terr = addSubkey(e, packets, pkt, nil)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\tdefault:\n\t\t\t// we ignore unknown packets.\n\t\t}\n\t}\n\n\tif len(e.Identities) == 0 && e.PrimaryKey.Version < 6 {\n\t\treturn nil, errors.StructuralError(fmt.Sprintf(\"v%d entity without any identities\", e.PrimaryKey.Version))\n\t}\n\n\t// An implementation MUST ensure that a valid direct-key signature is present before using a v6 key.\n\tif e.PrimaryKey.Version == 6 {\n\t\tif len(directSignatures) == 0 {\n\t\t\treturn nil, errors.StructuralError(\"v6 entity without a valid direct-key signature\")\n\t\t}\n\t\t// Select main direct key signature.\n\t\tvar mainDirectKeySelfSignature *packet.Signature\n\t\tfor _, directSignature := range directSignatures {\n\t\t\tif directSignature.SigType == packet.SigTypeDirectSignature &&\n\t\t\t\tdirectSignature.CheckKeyIdOrFingerprint(e.PrimaryKey) &&\n\t\t\t\t(mainDirectKeySelfSignature == nil ||\n\t\t\t\t\tdirectSignature.CreationTime.After(mainDirectKeySelfSignature.CreationTime)) {\n\t\t\t\tmainDirectKeySelfSignature = directSignature\n\t\t\t}\n\t\t}\n\t\tif mainDirectKeySelfSignature == nil {\n\t\t\treturn nil, errors.StructuralError(\"no valid direct-key self-signature for v6 primary key found\")\n\t\t}\n\t\t// Check that the main self-signature is valid.\n\t\terr = e.PrimaryKey.VerifyDirectKeySignature(mainDirectKeySelfSignature)\n\t\tif err != nil {\n\t\t\treturn nil, errors.StructuralError(\"invalid direct-key self-signature for v6 primary key\")\n\t\t}\n\t\te.SelfSignature = mainDirectKeySelfSignature\n\t\te.Signatures = directSignatures\n\t}\n\n\tfor _, revocation := range revocations {\n\t\terr = e.PrimaryKey.VerifyRevocationSignature(revocation)\n\t\tif err == nil {\n\t\t\te.Revocations = append(e.Revocations, revocation)\n\t\t} else {\n\t\t\t// TODO: RFC 4880 5.2.3.15 defines revocation keys.\n\t\t\treturn nil, errors.StructuralError(\"revocation signature signed by alternate key\")\n\t\t}\n\t}\n\n\treturn e, nil\n}\n\nfunc addUserID(e *Entity, packets *packet.Reader, pkt *packet.UserId) error {\n\t// Make a new Identity object, that we might wind up throwing away.\n\t// We'll only add it if we get a valid self-signature over this\n\t// userID.\n\tidentity := new(Identity)\n\tidentity.Name = pkt.Id\n\tidentity.UserId = pkt\n\n\tfor {\n\t\tp, err := packets.Next()\n\t\tif err == io.EOF {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tsig, ok := p.(*packet.Signature)\n\t\tif !ok {\n\t\t\tpackets.Unread(p)\n\t\t\tbreak\n\t\t}\n\n\t\tif sig.SigType != packet.SigTypeGenericCert &&\n\t\t\tsig.SigType != packet.SigTypePersonaCert &&\n\t\t\tsig.SigType != packet.SigTypeCasualCert &&\n\t\t\tsig.SigType != packet.SigTypePositiveCert &&\n\t\t\tsig.SigType != packet.SigTypeCertificationRevocation {\n\t\t\treturn errors.StructuralError(\"user ID signature with wrong type\")\n\t\t}\n\n\t\tif sig.CheckKeyIdOrFingerprint(e.PrimaryKey) {\n\t\t\tif err = e.PrimaryKey.VerifyUserIdSignature(pkt.Id, e.PrimaryKey, sig); err != nil {\n\t\t\t\treturn errors.StructuralError(\"user ID self-signature invalid: \" + err.Error())\n\t\t\t}\n\t\t\tif sig.SigType == packet.SigTypeCertificationRevocation {\n\t\t\t\tidentity.Revocations = append(identity.Revocations, sig)\n\t\t\t} else if identity.SelfSignature == nil || sig.CreationTime.After(identity.SelfSignature.CreationTime) {\n\t\t\t\tidentity.SelfSignature = sig\n\t\t\t}\n\t\t\tidentity.Signatures = append(identity.Signatures, sig)\n\t\t\te.Identities[pkt.Id] = identity\n\t\t} else {\n\t\t\tidentity.Signatures = append(identity.Signatures, sig)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc addSubkey(e *Entity, packets *packet.Reader, pub *packet.PublicKey, priv *packet.PrivateKey) error {\n\tvar subKey Subkey\n\tsubKey.PublicKey = pub\n\tsubKey.PrivateKey = priv\n\n\tfor {\n\t\tp, err := packets.Next()\n\t\tif err == io.EOF {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn errors.StructuralError(\"subkey signature invalid: \" + err.Error())\n\t\t}\n\n\t\tsig, ok := p.(*packet.Signature)\n\t\tif !ok {\n\t\t\tpackets.Unread(p)\n\t\t\tbreak\n\t\t}\n\n\t\tif sig.SigType != packet.SigTypeSubkeyBinding && sig.SigType != packet.SigTypeSubkeyRevocation {\n\t\t\treturn errors.StructuralError(\"subkey signature with wrong type\")\n\t\t}\n\n\t\tif err := e.PrimaryKey.VerifyKeySignature(subKey.PublicKey, sig); err != nil {\n\t\t\treturn errors.StructuralError(\"subkey signature invalid: \" + err.Error())\n\t\t}\n\n\t\tswitch sig.SigType {\n\t\tcase packet.SigTypeSubkeyRevocation:\n\t\t\tsubKey.Revocations = append(subKey.Revocations, sig)\n\t\tcase packet.SigTypeSubkeyBinding:\n\t\t\tif subKey.Sig == nil || sig.CreationTime.After(subKey.Sig.CreationTime) {\n\t\t\t\tsubKey.Sig = sig\n\t\t\t}\n\t\t}\n\t}\n\n\tif subKey.Sig == nil {\n\t\treturn errors.StructuralError(\"subkey packet not followed by signature\")\n\t}\n\n\te.Subkeys = append(e.Subkeys, subKey)\n\n\treturn nil\n}\n\n// SerializePrivate serializes an Entity, including private key material, but\n// excluding signatures from other entities, to the given Writer.\n// Identities and subkeys are re-signed in case they changed since NewEntry.\n// If config is nil, sensible defaults will be used.\nfunc (e *Entity) SerializePrivate(w io.Writer, config *packet.Config) (err error) {\n\tif e.PrivateKey.Dummy() {\n\t\treturn errors.ErrDummyPrivateKey(\"dummy private key cannot re-sign identities\")\n\t}\n\treturn e.serializePrivate(w, config, true)\n}\n\n// SerializePrivateWithoutSigning serializes an Entity, including private key\n// material, but excluding signatures from other entities, to the given Writer.\n// Self-signatures of identities and subkeys are not re-signed. This is useful\n// when serializing GNU dummy keys, among other things.\n// If config is nil, sensible defaults will be used.\nfunc (e *Entity) SerializePrivateWithoutSigning(w io.Writer, config *packet.Config) (err error) {\n\treturn e.serializePrivate(w, config, false)\n}\n\nfunc (e *Entity) serializePrivate(w io.Writer, config *packet.Config, reSign bool) (err error) {\n\tif e.PrivateKey == nil {\n\t\treturn goerrors.New(\"openpgp: private key is missing\")\n\t}\n\terr = e.PrivateKey.Serialize(w)\n\tif err != nil {\n\t\treturn\n\t}\n\tfor _, revocation := range e.Revocations {\n\t\terr := revocation.Serialize(w)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tfor _, directSignature := range e.Signatures {\n\t\terr := directSignature.Serialize(w)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tfor _, ident := range e.Identities {\n\t\terr = ident.UserId.Serialize(w)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tif reSign {\n\t\t\tif ident.SelfSignature == nil {\n\t\t\t\treturn goerrors.New(\"openpgp: can't re-sign identity without valid self-signature\")\n\t\t\t}\n\t\t\terr = ident.SelfSignature.SignUserId(ident.UserId.Id, e.PrimaryKey, e.PrivateKey, config)\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tfor _, sig := range ident.Signatures {\n\t\t\terr = sig.Serialize(w)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\tfor _, subkey := range e.Subkeys {\n\t\terr = subkey.PrivateKey.Serialize(w)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tif reSign {\n\t\t\terr = subkey.Sig.SignKey(subkey.PublicKey, e.PrivateKey, config)\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif subkey.Sig.EmbeddedSignature != nil {\n\t\t\t\terr = subkey.Sig.EmbeddedSignature.CrossSignKey(subkey.PublicKey, e.PrimaryKey,\n\t\t\t\t\tsubkey.PrivateKey, config)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor _, revocation := range subkey.Revocations {\n\t\t\terr := revocation.Serialize(w)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\terr = subkey.Sig.Serialize(w)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\treturn nil\n}\n\n// Serialize writes the public part of the given Entity to w, including\n// signatures from other entities. No private key material will be output.\nfunc (e *Entity) Serialize(w io.Writer) error {\n\terr := e.PrimaryKey.Serialize(w)\n\tif err != nil {\n\t\treturn err\n\t}\n\tfor _, revocation := range e.Revocations {\n\t\terr := revocation.Serialize(w)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tfor _, directSignature := range e.Signatures {\n\t\terr := directSignature.Serialize(w)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tfor _, ident := range e.Identities {\n\t\terr = ident.UserId.Serialize(w)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor _, sig := range ident.Signatures {\n\t\t\terr = sig.Serialize(w)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\tfor _, subkey := range e.Subkeys {\n\t\terr = subkey.PublicKey.Serialize(w)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor _, revocation := range subkey.Revocations {\n\t\t\terr := revocation.Serialize(w)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\terr = subkey.Sig.Serialize(w)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// SignIdentity adds a signature to e, from signer, attesting that identity is\n// associated with e. The provided identity must already be an element of\n// e.Identities and the private key of signer must have been decrypted if\n// necessary.\n// If config is nil, sensible defaults will be used.\nfunc (e *Entity) SignIdentity(identity string, signer *Entity, config *packet.Config) error {\n\tcertificationKey, ok := signer.CertificationKey(config.Now())\n\tif !ok {\n\t\treturn errors.InvalidArgumentError(\"no valid certification key found\")\n\t}\n\n\tif certificationKey.PrivateKey.Encrypted {\n\t\treturn errors.InvalidArgumentError(\"signing Entity's private key must be decrypted\")\n\t}\n\n\tident, ok := e.Identities[identity]\n\tif !ok {\n\t\treturn errors.InvalidArgumentError(\"given identity string not found in Entity\")\n\t}\n\n\tsig := createSignaturePacket(certificationKey.PublicKey, packet.SigTypeGenericCert, config)\n\n\tsigningUserID := config.SigningUserId()\n\tif signingUserID != \"\" {\n\t\tif _, ok := signer.Identities[signingUserID]; !ok {\n\t\t\treturn errors.InvalidArgumentError(\"signer identity string not found in signer Entity\")\n\t\t}\n\t\tsig.SignerUserId = &signingUserID\n\t}\n\n\tif err := sig.SignUserId(identity, e.PrimaryKey, certificationKey.PrivateKey, config); err != nil {\n\t\treturn err\n\t}\n\tident.Signatures = append(ident.Signatures, sig)\n\treturn nil\n}\n\n// RevokeKey generates a key revocation signature (packet.SigTypeKeyRevocation) with the\n// specified reason code and text (RFC4880 section-5.2.3.23).\n// If config is nil, sensible defaults will be used.\nfunc (e *Entity) RevokeKey(reason packet.ReasonForRevocation, reasonText string, config *packet.Config) error {\n\trevSig := createSignaturePacket(e.PrimaryKey, packet.SigTypeKeyRevocation, config)\n\trevSig.RevocationReason = &reason\n\trevSig.RevocationReasonText = reasonText\n\n\tif err := revSig.RevokeKey(e.PrimaryKey, e.PrivateKey, config); err != nil {\n\t\treturn err\n\t}\n\te.Revocations = append(e.Revocations, revSig)\n\treturn nil\n}\n\n// RevokeSubkey generates a subkey revocation signature (packet.SigTypeSubkeyRevocation) for\n// a subkey with the specified reason code and text (RFC4880 section-5.2.3.23).\n// If config is nil, sensible defaults will be used.\nfunc (e *Entity) RevokeSubkey(sk *Subkey, reason packet.ReasonForRevocation, reasonText string, config *packet.Config) error {\n\tif err := e.PrimaryKey.VerifyKeySignature(sk.PublicKey, sk.Sig); err != nil {\n\t\treturn errors.InvalidArgumentError(\"given subkey is not associated with this key\")\n\t}\n\n\trevSig := createSignaturePacket(e.PrimaryKey, packet.SigTypeSubkeyRevocation, config)\n\trevSig.RevocationReason = &reason\n\trevSig.RevocationReasonText = reasonText\n\n\tif err := revSig.RevokeSubkey(sk.PublicKey, e.PrivateKey, config); err != nil {\n\t\treturn err\n\t}\n\n\tsk.Revocations = append(sk.Revocations, revSig)\n\treturn nil\n}\n\nfunc (e *Entity) primaryDirectSignature() *packet.Signature {\n\treturn e.SelfSignature\n}\n\n// PrimarySelfSignature searches the entity for the self-signature that stores key preferences.\n// For V4 keys, returns the self-signature of the primary identity, and the identity.\n// For V6 keys, returns the latest valid direct-key self-signature, and no identity (nil).\n// This self-signature is to be used to check the key expiration,\n// algorithm preferences, and so on.\nfunc (e *Entity) PrimarySelfSignature() (*packet.Signature, *Identity) {\n\tif e.PrimaryKey.Version == 6 {\n\t\treturn e.primaryDirectSignature(), nil\n\t}\n\tprimaryIdentity := e.PrimaryIdentity()\n\tif primaryIdentity == nil {\n\t\treturn nil, nil\n\t}\n\treturn primaryIdentity.SelfSignature, primaryIdentity\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/keys_test_data.go",
    "content": "package openpgp\n\nconst expiringKeyHex = \"c6c04d0451d0c680010800abbb021fd03ffc4e96618901180c3fdcb060ee69eeead97b91256d11420d80b5f1b51930248044130bd300605cf8a05b7a40d3d8cfb0a910be2e3db50dcd50a9c54064c2a5550801daa834ff4480b33d3d3ca495ff8a4e84a886977d17d998f881241a874083d8b995beab555b6d22b8a4817ab17ac3e7304f7d4d2c05c495fb2218348d3bc13651db1d92732e368a9dd7dcefa6eddff30b94706a9aaee47e9d39321460b740c59c6fc3c2fd8ab6c0fb868cb87c0051f0321301fe0f0e1820b15e7fb7063395769b525005c7e30a7ce85984f5cac00504e7b4fdc45d74958de8388436fd5c7ba9ea121f1c851b5911dd1b47a14d81a09e92ef37721e2325b6790011010001cd00c2c07b041001080025050251d0c680050900278d00060b09070803020415080a0203160201021901021b03021e01000a0910e7b484133a890a35ae4b0800a1beb82e7f28eaf5273d6af9d3391314f6280b2b624eaca2851f89a9ebcaf80ac589ebd509f168bc4322106ca2e2ce77a76e071a3c7444787d65216b5f05e82c77928860b92aace3b7d0327db59492f422eb9dfab7249266d37429870b091a98aba8724c2259ebf8f85093f21255eafa75aa841e31d94f2ac891b9755fed455e539044ee69fc47950b80e003fc9f298d695660f28329eaa38037c367efde1727458e514faf990d439a21461b719edaddf9296d3d0647b43ca56cb8dbf63b4fcf8b9968e7928c463470fab3b98e44d0d95645062f94b2d04fe56bd52822b71934db8ce845622c40b92fcbe765a142e7f38b61a6aa9606c8e8858dcd3b6eb1894acec04d0451d1f06b01080088bea67444e1789390e7c0335c86775502d58ec783d99c8ef4e06de235ed3dd4b0467f6f358d818c7d8989d43ec6d69fcbc8c32632d5a1b605e3fa8e41d695fcdcaa535936cd0157f9040dce362519803b908eafe838bb13216c885c6f93e9e8d5745607f0d062322085d6bdc760969149a8ff8dd9f5c18d9bfe2e6f63a06e17694cf1f67587c6fb70e9aebf90ffc528ca3b615ac7c9d4a21ea4f7c06f2e98fbbd90a859b8608bf9ea638e3a54289ce44c283110d0c45fa458de6251cd6e7baf71f80f12c8978340490fd90c92b81736ae902ed958e478dceae2835953d189c45d182aff02ea2be61b81d8e94430f041d638647b43e2fcb45fd512fbf5068b810011010001c2c06504180108000f050251d1f06b050900081095021b0c000a0910e7b484133a890a35e63407fe2ec88d6d1e6c9ce7553ece0cb2524747217bad29f251d33df84599ffcc900141a355abd62126800744068a5e05dc167056aa9205273dc7765a2ed49db15c2a83b8d6e6429c902136f1e12229086c1c10c0053242c2a4ae1930db58163387a48cad64607ff2153c320e42843dec28e3fce90e7399d63ac0affa2fee1f0adc0953c89eb3f46ef1d6c04328ed13b491669d5120a3782e3ffb7c69575fb77eebd108794f4dda9d34be2bae57e8e59ec8ebfda2f6f06104b2321be408ea146e2db482b00c5055c8618de36ac9716f80da2617e225556d0fce61b01c8cea2d1e0ea982c31711060ca370f2739366e1e708f38405d784b49d16a26cf62d152eae734327cec04d0451d1f07b010800d5af91c5e7c2fd8951c8d254eab0c97cdcb66822f868b79b78c366255059a68fd74ebca9adb9b970cd9e586690e6e0756705432306878c897b10a4b4ca0005966f99ac8fa4e6f9caf54bf8e53844544beee9872a7ac64c119cf1393d96e674254b661f61ee975633d0e8a8672531edb6bb8e211204e7754a9efa802342118eee850beea742bac95a3f706cc2024cf6037a308bb68162b2f53b9a6346a96e6d31871a2456186e24a1c7a82b82ac04afdfd57cd7fb9ba77a9c760d40b76a170f7be525e5fb6a9848cc726e806187710d9b190387df28700f321f988a392899f93815cc937f309129eb94d5299c5547cb2c085898e6639496e70d746c9d3fb9881d0011010001c2c06504180108000f050251d1f07b050900266305021b0c000a0910e7b484133a890a35bff207fd10dfe8c4a6ea1dd30568012b6fd6891a763c87ad0f7a1d112aad9e8e3239378a3b85588c235865bac2e614348cb4f216d7217f53b3ef48c192e0a4d31d64d7bfa5faccf21155965fa156e887056db644a05ad08a85cc6152d1377d9e37b46f4ff462bbe68ace2dc586ef90070314576c985d8037c2ba63f0a7dc17a62e15bd77e88bc61d9d00858979709f12304264a4cf4225c5cf86f12c8e19486cb9cdcc69f18f027e5f16f4ca8b50e28b3115eaff3a345acd21f624aef81f6ede515c1b55b26b84c1e32264754eab672d5489b287e7277ea855e0a5ff2aa9e8b8c76d579a964ec225255f4d57bf66639ccb34b64798846943e162a41096a7002ca21c7f56\"\nconst subkeyUsageHex = \"988d04533a52bc010400d26af43085558f65b9e7dbc90cb9238015259aed5e954637adcfa2181548b2d0b60c65f1f42ec5081cbf1bc0a8aa4900acfb77070837c58f26012fbce297d70afe96e759ad63531f0037538e70dbf8e384569b9720d99d8eb39d8d0a2947233ed242436cb6ac7dfe74123354b3d0119b5c235d3dd9c9d6c004f8ffaf67ad8583001101000188b7041f010200210502533b8552170c8001ce094aa433f7040bb2ddf0be3893cb843d0fe70c020700000a0910a42704b92866382aa98404009d63d916a27543da4221c60087c33f1c44bec9998c5438018ed370cca4962876c748e94b73eb39c58eb698063f3fd6346d58dd2a11c0247934c4a9d71f24754f7468f96fb24c3e791dd2392b62f626148ad724189498cbf993db2df7c0cdc2d677c35da0f16cb16c9ce7c33b4de65a4a91b1d21a130ae9cc26067718910ef8e2b417556d627261203c756d627261407379642e65642e61753e88b80413010200220502533a52bc021b03060b090807030206150802090a0b0416020301021e01021780000a0910a42704b92866382a47840400c0c2bd04f5fca586de408b395b3c280a278259c93eaaa8b79a53b97003f8ed502a8a00446dd9947fb462677e4fcac0dac2f0701847d15130aadb6cd9e0705ea0cf5f92f129136c7be21a718d46c8e641eb7f044f2adae573e11ae423a0a9ca51324f03a8a2f34b91fa40c3cc764bee4dccadedb54c768ba0469b683ea53f1c29b88d04533a52bc01040099c92a5d6f8b744224da27bc2369127c35269b58bec179de6bbc038f749344222f85a31933224f26b70243c4e4b2d242f0c4777eaef7b5502f9dad6d8bf3aaeb471210674b74de2d7078af497d55f5cdad97c7bedfbc1b41e8065a97c9c3d344b21fc81d27723af8e374bc595da26ea242dccb6ae497be26eea57e563ed517e90011010001889f0418010200090502533a52bc021b0c000a0910a42704b92866382afa1403ff70284c2de8a043ff51d8d29772602fa98009b7861c540535f874f2c230af8caf5638151a636b21f8255003997ccd29747fdd06777bb24f9593bd7d98a3e887689bf902f999915fcc94625ae487e5d13e6616f89090ebc4fdc7eb5cad8943e4056995bb61c6af37f8043016876a958ec7ebf39c43d20d53b7f546cfa83e8d2604b88d04533b8283010400c0b529316dbdf58b4c54461e7e669dc11c09eb7f73819f178ccd4177b9182b91d138605fcf1e463262fabefa73f94a52b5e15d1904635541c7ea540f07050ce0fb51b73e6f88644cec86e91107c957a114f69554548a85295d2b70bd0b203992f76eb5d493d86d9eabcaa7ef3fc7db7e458438db3fcdb0ca1cc97c638439a9170011010001889f0418010200090502533b8283021b0c000a0910a42704b92866382adc6d0400cfff6258485a21675adb7a811c3e19ebca18851533f75a7ba317950b9997fda8d1a4c8c76505c08c04b6c2cc31dc704d33da36a21273f2b388a1a706f7c3378b66d887197a525936ed9a69acb57fe7f718133da85ec742001c5d1864e9c6c8ea1b94f1c3759cebfd93b18606066c063a63be86085b7e37bdbc65f9a915bf084bb901a204533b85cd110400aed3d2c52af2b38b5b67904b0ef73d6dd7aef86adb770e2b153cd22489654dcc91730892087bb9856ae2d9f7ed1eb48f214243fe86bfe87b349ebd7c30e630e49c07b21fdabf78b7a95c8b7f969e97e3d33f2e074c63552ba64a2ded7badc05ce0ea2be6d53485f6900c7860c7aa76560376ce963d7271b9b54638a4028b573f00a0d8854bfcdb04986141568046202192263b9b67350400aaa1049dbc7943141ef590a70dcb028d730371d92ea4863de715f7f0f16d168bd3dc266c2450457d46dcbbf0b071547e5fbee7700a820c3750b236335d8d5848adb3c0da010e998908dfd93d961480084f3aea20b247034f8988eccb5546efaa35a92d0451df3aaf1aee5aa36a4c4d462c760ecd9cebcabfbe1412b1f21450f203fd126687cd486496e971a87fd9e1a8a765fe654baa219a6871ab97768596ab05c26c1aeea8f1a2c72395a58dbc12ef9640d2b95784e974a4d2d5a9b17c25fedacfe551bda52602de8f6d2e48443f5dd1a2a2a8e6a5e70ecdb88cd6e766ad9745c7ee91d78cc55c3d06536b49c3fee6c3d0b6ff0fb2bf13a314f57c953b8f4d93bf88e70418010200090502533b85cd021b0200520910a42704b92866382a47200419110200060502533b85cd000a091042ce2c64bc0ba99214b2009e26b26852c8b13b10c35768e40e78fbbb48bd084100a0c79d9ea0844fa5853dd3c85ff3ecae6f2c9dd6c557aa04008bbbc964cd65b9b8299d4ebf31f41cc7264b8cf33a00e82c5af022331fac79efc9563a822497ba012953cefe2629f1242fcdcb911dbb2315985bab060bfd58261ace3c654bdbbe2e8ed27a46e836490145c86dc7bae15c011f7e1ffc33730109b9338cd9f483e7cef3d2f396aab5bd80efb6646d7e778270ee99d934d187dd98\"\nconst revokedKeyHex = \"988d045331ce82010400c4fdf7b40a5477f206e6ee278eaef888ca73bf9128a9eef9f2f1ddb8b7b71a4c07cfa241f028a04edb405e4d916c61d6beabc333813dc7b484d2b3c52ee233c6a79b1eea4e9cc51596ba9cd5ac5aeb9df62d86ea051055b79d03f8a4fa9f38386f5bd17529138f3325d46801514ea9047977e0829ed728e68636802796801be10011010001889f04200102000905025331d0e3021d03000a0910a401d9f09a34f7c042aa040086631196405b7e6af71026b88e98012eab44aa9849f6ef3fa930c7c9f23deaedba9db1538830f8652fb7648ec3fcade8dbcbf9eaf428e83c6cbcc272201bfe2fbb90d41963397a7c0637a1a9d9448ce695d9790db2dc95433ad7be19eb3de72dacf1d6db82c3644c13eae2a3d072b99bb341debba012c5ce4006a7d34a1f4b94b444526567205265766f6b657220283c52656727732022424d204261726973746122204b657920262530305c303e5c29203c72656740626d626172697374612e636f2e61753e88b704130102002205025331ce82021b03060b090807030206150802090a0b0416020301021e01021780000a0910a401d9f09a34f7c0019c03f75edfbeb6a73e7225ad3cc52724e2872e04260d7daf0d693c170d8c4b243b8767bc7785763533febc62ec2600c30603c433c095453ede59ff2fcabeb84ce32e0ed9d5cf15ffcbc816202b64370d4d77c1e9077d74e94a16fb4fa2e5bec23a56d7a73cf275f91691ae1801a976fcde09e981a2f6327ac27ea1fecf3185df0d56889c04100102000605025331cfb5000a0910fe9645554e8266b64b4303fc084075396674fb6f778d302ac07cef6bc0b5d07b66b2004c44aef711cbac79617ef06d836b4957522d8772dd94bf41a2f4ac8b1ee6d70c57503f837445a74765a076d07b829b8111fc2a918423ddb817ead7ca2a613ef0bfb9c6b3562aec6c3cf3c75ef3031d81d95f6563e4cdcc9960bcb386c5d757b104fcca5fe11fc709df884604101102000605025331cfe7000a09107b15a67f0b3ddc0317f6009e360beea58f29c1d963a22b962b80788c3fa6c84e009d148cfde6b351469b8eae91187eff07ad9d08fcaab88d045331ce820104009f25e20a42b904f3fa555530fe5c46737cf7bd076c35a2a0d22b11f7e0b61a69320b768f4a80fe13980ce380d1cfc4a0cd8fbe2d2e2ef85416668b77208baa65bf973fe8e500e78cc310d7c8705cdb34328bf80e24f0385fce5845c33bc7943cf6b11b02348a23da0bf6428e57c05135f2dc6bd7c1ce325d666d5a5fd2fd5e410011010001889f04180102000905025331ce82021b0c000a0910a401d9f09a34f7c0418003fe34feafcbeaef348a800a0d908a7a6809cc7304017d820f70f0474d5e23cb17e38b67dc6dca282c6ca00961f4ec9edf2738d0f087b1d81e4871ef08e1798010863afb4eac4c44a376cb343be929c5be66a78cfd4456ae9ec6a99d97f4e1c3ff3583351db2147a65c0acef5c003fb544ab3a2e2dc4d43646f58b811a6c3a369d1f\"\nconst revokedSubkeyHex = \"988d04533121f6010400aefc803a3e4bb1a61c86e8a86d2726c6a43e0079e9f2713f1fa017e9854c83877f4aced8e331d675c67ea83ddab80aacbfa0b9040bb12d96f5a3d6be09455e2a76546cbd21677537db941cab710216b6d24ec277ee0bd65b910f416737ed120f6b93a9d3b306245c8cfd8394606fdb462e5cf43c551438d2864506c63367fc890011010001b41d416c696365203c616c69636540626d626172697374612e636f2e61753e88bb041301020025021b03060b090807030206150802090a0b0416020301021e01021780050253312798021901000a09104ef7e4beccde97f015a803ff5448437780f63263b0df8442a995e7f76c221351a51edd06f2063d8166cf3157aada4923dfc44aa0f2a6a4da5cf83b7fe722ba8ab416c976e77c6b5682e7f1069026673bd0de56ba06fd5d7a9f177607f277d9b55ff940a638c3e68525c67517e2b3d976899b93ca267f705b3e5efad7d61220e96b618a4497eab8d04403d23f8846041011020006050253312910000a09107b15a67f0b3ddc03d96e009f50b6365d86c4be5d5e9d0ea42d5e56f5794c617700a0ab274e19c2827780016d23417ce89e0a2c0d987d889c04100102000605025331cf7a000a0910a401d9f09a34f7c0ee970400aca292f213041c9f3b3fc49148cbda9d84afee6183c8dd6c5ff2600b29482db5fecd4303797be1ee6d544a20a858080fec43412061c9a71fae4039fd58013b4ae341273e6c66ad4c7cdd9e68245bedb260562e7b166f2461a1032f2b38c0e0e5715fb3d1656979e052b55ca827a76f872b78a9fdae64bc298170bfcebedc1271b41a416c696365203c616c696365407379646973702e6f722e61753e88b804130102002205025331278b021b03060b090807030206150802090a0b0416020301021e01021780000a09104ef7e4beccde97f06a7003fa03c3af68d272ebc1fa08aa72a03b02189c26496a2833d90450801c4e42c5b5f51ad96ce2d2c9cef4b7c02a6a2fcf1412d6a2d486098eb762f5010a201819c17fd2888aec8eda20c65a3b75744de7ee5cc8ac7bfc470cbe3cb982720405a27a3c6a8c229cfe36905f881b02ed5680f6a8f05866efb9d6c5844897e631deb949ca8846041011020006050253312910000a09107b15a67f0b3ddc0347bc009f7fa35db59147469eb6f2c5aaf6428accb138b22800a0caa2f5f0874bacc5909c652a57a31beda65eddd5889c04100102000605025331cf7a000a0910a401d9f09a34f7c0316403ff46f2a5c101256627f16384d34a38fb47a6c88ba60506843e532d91614339fccae5f884a5741e7582ffaf292ba38ee10a270a05f139bde3814b6a077e8cd2db0f105ebea2a83af70d385f13b507fac2ad93ff79d84950328bb86f3074745a8b7f9b64990fb142e2a12976e27e8d09a28dc5621f957ac49091116da410ac3cbde1b88d04533121f6010400cbd785b56905e4192e2fb62a720727d43c4fa487821203cf72138b884b78b701093243e1d8c92a0248a6c0203a5a88693da34af357499abacaf4b3309c640797d03093870a323b4b6f37865f6eaa2838148a67df4735d43a90ca87942554cdf1c4a751b1e75f9fd4ce4e97e278d6c1c7ed59d33441df7d084f3f02beb68896c70011010001889f0418010200090502533121f6021b0c000a09104ef7e4beccde97f0b98b03fc0a5ccf6a372995835a2f5da33b282a7d612c0ab2a97f59cf9fff73e9110981aac2858c41399afa29624a7fd8a0add11654e3d882c0fd199e161bdad65e5e2548f7b68a437ea64293db1246e3011cbb94dc1bcdeaf0f2539bd88ff16d95547144d97cead6a8c5927660a91e6db0d16eb36b7b49a3525b54d1644e65599b032b7eb901a204533127a0110400bd3edaa09eff9809c4edc2c2a0ebe52e53c50a19c1e49ab78e6167bf61473bb08f2050d78a5cbbc6ed66aff7b42cd503f16b4a0b99fa1609681fca9b7ce2bbb1a5b3864d6cdda4d7ef7849d156d534dea30fb0efb9e4cf8959a2b2ce623905882d5430b995a15c3b9fe92906086788b891002924f94abe139b42cbbfaaabe42f00a0b65dc1a1ad27d798adbcb5b5ad02d2688c89477b03ff4eebb6f7b15a73b96a96bed201c0e5e4ea27e4c6e2dd1005b94d4b90137a5b1cf5e01c6226c070c4cc999938101578877ee76d296b9aab8246d57049caacf489e80a3f40589cade790a020b1ac146d6f7a6241184b8c7fcde680eae3188f5dcbe846d7f7bdad34f6fcfca08413e19c1d5df83fc7c7c627d493492e009c2f52a80400a2fe82de87136fd2e8845888c4431b032ba29d9a29a804277e31002a8201fb8591a3e55c7a0d0881496caf8b9fb07544a5a4879291d0dc026a0ea9e5bd88eb4aa4947bbd694b25012e208a250d65ddc6f1eea59d3aed3b4ec15fcab85e2afaa23a40ab1ef9ce3e11e1bc1c34a0e758e7aa64deb8739276df0af7d4121f834a9b88e70418010200090502533127a0021b02005209104ef7e4beccde97f047200419110200060502533127a0000a0910dbce4ee19529437fe045009c0b32f5ead48ee8a7e98fac0dea3d3e6c0e2c552500a0ad71fadc5007cfaf842d9b7db3335a8cdad15d3d1a6404009b08e2c68fe8f3b45c1bb72a4b3278cdf3012aa0f229883ad74aa1f6000bb90b18301b2f85372ca5d6b9bf478d235b733b1b197d19ccca48e9daf8e890cb64546b4ce1b178faccfff07003c172a2d4f5ebaba9f57153955f3f61a9b80a4f5cb959908f8b211b03b7026a8a82fc612bfedd3794969bcf458c4ce92be215a1176ab88d045331d144010400a5063000c5aaf34953c1aa3bfc95045b3aab9882b9a8027fecfe2142dc6b47ba8aca667399990244d513dd0504716908c17d92c65e74219e004f7b83fc125e575dd58efec3ab6dd22e3580106998523dea42ec75bf9aa111734c82df54630bebdff20fe981cfc36c76f865eb1c2fb62c9e85bc3a6e5015a361a2eb1c8431578d0011010001889f04280102000905025331d433021d03000a09104ef7e4beccde97f02e5503ff5e0630d1b65291f4882b6d40a29da4616bb5088717d469fbcc3648b8276de04a04988b1f1b9f3e18f52265c1f8b6c85861691c1a6b8a3a25a1809a0b32ad330aec5667cb4262f4450649184e8113849b05e5ad06a316ea80c001e8e71838190339a6e48bbde30647bcf245134b9a97fa875c1d83a9862cae87ffd7e2c4ce3a1b89013d04180102000905025331d144021b0200a809104ef7e4beccde97f09d2004190102000605025331d144000a0910677815e371c2fd23522203fe22ab62b8e7a151383cea3edd3a12995693911426f8ccf125e1f6426388c0010f88d9ca7da2224aee8d1c12135998640c5e1813d55a93df472faae75bef858457248db41b4505827590aeccf6f9eb646da7f980655dd3050c6897feddddaca90676dee856d66db8923477d251712bb9b3186b4d0114daf7d6b59272b53218dd1da94a03ff64006fcbe71211e5daecd9961fba66cdb6de3f914882c58ba5beddeba7dcb950c1156d7fba18c19ea880dccc800eae335deec34e3b84ac75ffa24864f782f87815cda1c0f634b3dd2fa67cea30811d21723d21d9551fa12ccbcfa62b6d3a15d01307b99925707992556d50065505b090aadb8579083a20fe65bd2a270da9b011\"\n\nconst missingCrossSignatureKey = `-----BEGIN PGP PUBLIC KEY BLOCK-----\nCharset: UTF-8\n\nmQENBFMYynYBCACVOZ3/e8Bm2b9KH9QyIlHGo/i1bnkpqsgXj8tpJ2MIUOnXMMAY\nztW7kKFLCmgVdLIC0vSoLA4yhaLcMojznh/2CcUglZeb6Ao8Gtelr//Rd5DRfPpG\nzqcfUo+m+eO1co2Orabw0tZDfGpg5p3AYl0hmxhUyYSc/xUq93xL1UJzBFgYXY54\nQsM8dgeQgFseSk/YvdP5SMx1ev+eraUyiiUtWzWrWC1TdyRa5p4UZg6Rkoppf+WJ\nQrW6BWrhAtqATHc8ozV7uJjeONjUEq24roRc/OFZdmQQGK6yrzKnnbA6MdHhqpdo\n9kWDcXYb7pSE63Lc+OBa5X2GUVvXJLS/3nrtABEBAAG0F2ludmFsaWQtc2lnbmlu\nZy1zdWJrZXlziQEoBBMBAgASBQJTnKB5AhsBAgsHAhUIAh4BAAoJEO3UDQUIHpI/\ndN4H/idX4FQ1LIZCnpHS/oxoWQWfpRgdKAEM0qCqjMgiipJeEwSQbqjTCynuh5/R\nJlODDz85ABR06aoF4l5ebGLQWFCYifPnJZ/Yf5OYcMGtb7dIbqxWVFL9iLMO/oDL\nioI3dotjPui5e+2hI9pVH1UHB/bZ/GvMGo6Zg0XxLPolKQODMVjpjLAQ0YJ3spew\nRAmOGre6tIvbDsMBnm8qREt7a07cBJ6XK7xjxYaZHQBiHVxyEWDa6gyANONx8duW\n/fhQ/zDTnyVM/ik6VO0Ty9BhPpcEYLFwh5c1ilFari1ta3e6qKo6ZGa9YMk/REhu\nyBHd9nTkI+0CiQUmbckUiVjDKKe5AQ0EUxjKdgEIAJcXQeP+NmuciE99YcJoffxv\n2gVLU4ZXBNHEaP0mgaJ1+tmMD089vUQAcyGRvw8jfsNsVZQIOAuRxY94aHQhIRHR\nbUzBN28ofo/AJJtfx62C15xt6fDKRV6HXYqAiygrHIpEoRLyiN69iScUsjIJeyFL\nC8wa72e8pSL6dkHoaV1N9ZH/xmrJ+k0vsgkQaAh9CzYufncDxcwkoP+aOlGtX1gP\nWwWoIbz0JwLEMPHBWvDDXQcQPQTYQyj+LGC9U6f9VZHN25E94subM1MjuT9OhN9Y\nMLfWaaIc5WyhLFyQKW2Upofn9wSFi8ubyBnv640Dfd0rVmaWv7LNTZpoZ/GbJAMA\nEQEAAYkBHwQYAQIACQUCU5ygeQIbAgAKCRDt1A0FCB6SP0zCB/sEzaVR38vpx+OQ\nMMynCBJrakiqDmUZv9xtplY7zsHSQjpd6xGflbU2n+iX99Q+nav0ETQZifNUEd4N\n1ljDGQejcTyKD6Pkg6wBL3x9/RJye7Zszazm4+toJXZ8xJ3800+BtaPoI39akYJm\n+ijzbskvN0v/j5GOFJwQO0pPRAFtdHqRs9Kf4YanxhedB4dIUblzlIJuKsxFit6N\nlgGRblagG3Vv2eBszbxzPbJjHCgVLR3RmrVezKOsZjr/2i7X+xLWIR0uD3IN1qOW\nCXQxLBizEEmSNVNxsp7KPGTLnqO3bPtqFirxS9PJLIMPTPLNBY7ZYuPNTMqVIUWF\n4artDmrG\n=7FfJ\n-----END PGP PUBLIC KEY BLOCK-----`\n\nconst invalidCrossSignatureKey = `-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQENBFMYynYBCACVOZ3/e8Bm2b9KH9QyIlHGo/i1bnkpqsgXj8tpJ2MIUOnXMMAY\nztW7kKFLCmgVdLIC0vSoLA4yhaLcMojznh/2CcUglZeb6Ao8Gtelr//Rd5DRfPpG\nzqcfUo+m+eO1co2Orabw0tZDfGpg5p3AYl0hmxhUyYSc/xUq93xL1UJzBFgYXY54\nQsM8dgeQgFseSk/YvdP5SMx1ev+eraUyiiUtWzWrWC1TdyRa5p4UZg6Rkoppf+WJ\nQrW6BWrhAtqATHc8ozV7uJjeONjUEq24roRc/OFZdmQQGK6yrzKnnbA6MdHhqpdo\n9kWDcXYb7pSE63Lc+OBa5X2GUVvXJLS/3nrtABEBAAG0F2ludmFsaWQtc2lnbmlu\nZy1zdWJrZXlziQEoBBMBAgASBQJTnKB5AhsBAgsHAhUIAh4BAAoJEO3UDQUIHpI/\ndN4H/idX4FQ1LIZCnpHS/oxoWQWfpRgdKAEM0qCqjMgiipJeEwSQbqjTCynuh5/R\nJlODDz85ABR06aoF4l5ebGLQWFCYifPnJZ/Yf5OYcMGtb7dIbqxWVFL9iLMO/oDL\nioI3dotjPui5e+2hI9pVH1UHB/bZ/GvMGo6Zg0XxLPolKQODMVjpjLAQ0YJ3spew\nRAmOGre6tIvbDsMBnm8qREt7a07cBJ6XK7xjxYaZHQBiHVxyEWDa6gyANONx8duW\n/fhQ/zDTnyVM/ik6VO0Ty9BhPpcEYLFwh5c1ilFari1ta3e6qKo6ZGa9YMk/REhu\nyBHd9nTkI+0CiQUmbckUiVjDKKe5AQ0EUxjKdgEIAIINDqlj7X6jYKc6DjwrOkjQ\nUIRWbQQar0LwmNilehmt70g5DCL1SYm9q4LcgJJ2Nhxj0/5qqsYib50OSWMcKeEe\niRXpXzv1ObpcQtI5ithp0gR53YPXBib80t3bUzomQ5UyZqAAHzMp3BKC54/vUrSK\nFeRaxDzNLrCeyI00+LHNUtwghAqHvdNcsIf8VRumK8oTm3RmDh0TyjASWYbrt9c8\nR1Um3zuoACOVy+mEIgIzsfHq0u7dwYwJB5+KeM7ZLx+HGIYdUYzHuUE1sLwVoELh\n+SHIGHI1HDicOjzqgajShuIjj5hZTyQySVprrsLKiXS6NEwHAP20+XjayJ/R3tEA\nEQEAAYkCPgQYAQIBKAUCU5ygeQIbAsBdIAQZAQIABgUCU5ygeQAKCRCpVlnFZmhO\n52RJB/9uD1MSa0wjY6tHOIgquZcP3bHBvHmrHNMw9HR2wRCMO91ZkhrpdS3ZHtgb\nu3/55etj0FdvDo1tb8P8FGSVtO5Vcwf5APM8sbbqoi8L951Q3i7qt847lfhu6sMl\nw0LWFvPTOLHrliZHItPRjOltS1WAWfr2jUYhsU9ytaDAJmvf9DujxEOsN5G1YJep\n54JCKVCkM/y585Zcnn+yxk/XwqoNQ0/iJUT9qRrZWvoeasxhl1PQcwihCwss44A+\nYXaAt3hbk+6LEQuZoYS73yR3WHj+42tfm7YxRGeubXfgCEz/brETEWXMh4pe0vCL\nbfWrmfSPq2rDegYcAybxRQz0lF8PAAoJEO3UDQUIHpI/exkH/0vQfdHA8g/N4T6E\ni6b1CUVBAkvtdJpCATZjWPhXmShOw62gkDw306vHPilL4SCvEEi4KzG72zkp6VsB\nDSRcpxCwT4mHue+duiy53/aRMtSJ+vDfiV1Vhq+3sWAck/yUtfDU9/u4eFaiNok1\n8/Gd7reyuZt5CiJnpdPpjCwelK21l2w7sHAnJF55ITXdOxI8oG3BRKufz0z5lyDY\ns2tXYmhhQIggdgelN8LbcMhWs/PBbtUr6uZlNJG2lW1yscD4aI529VjwJlCeo745\nU7pO4eF05VViUJ2mmfoivL3tkhoTUWhx8xs8xCUcCg8DoEoSIhxtOmoTPR22Z9BL\n6LCg2mg=\n=Dhm4\n-----END PGP PUBLIC KEY BLOCK-----`\n\nconst goodCrossSignatureKey = `-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v1\n\nmI0EVUqeVwEEAMufHRrMPWK3gyvi0O0tABCs/oON9zV9KDZlr1a1M91ShCSFwCPo\n7r80PxdWVWcj0V5h50/CJYtpN3eE/mUIgW2z1uDYQF1OzrQ8ubrksfsJvpAhENom\nlTQEppv9mV8qhcM278teb7TX0pgrUHLYF5CfPdp1L957JLLXoQR/lwLVABEBAAG0\nE2dvb2Qtc2lnbmluZy1zdWJrZXmIuAQTAQIAIgUCVUqeVwIbAwYLCQgHAwIGFQgC\nCQoLBBYCAwECHgECF4AACgkQNRjL95IRWP69XQQAlH6+eyXJN4DZTLX78KGjHrsw\n6FCvxxClEPtPUjcJy/1KCRQmtLAt9PbbA78dvgzjDeZMZqRAwdjyJhjyg/fkU2OH\n7wq4ktjUu+dLcOBb+BFMEY+YjKZhf6EJuVfxoTVr5f82XNPbYHfTho9/OABKH6kv\nX70PaKZhbwnwij8Nts65AaIEVUqftREEAJ3WxZfqAX0bTDbQPf2CMT2IVMGDfhK7\nGyubOZgDFFjwUJQvHNvsrbeGLZ0xOBumLINyPO1amIfTgJNm1iiWFWfmnHReGcDl\ny5mpYG60Mb79Whdcer7CMm3AqYh/dW4g6IB02NwZMKoUHo3PXmFLxMKXnWyJ0clw\nR0LI/Qn509yXAKDh1SO20rqrBM+EAP2c5bfI98kyNwQAi3buu94qo3RR1ZbvfxgW\nCKXDVm6N99jdZGNK7FbRifXqzJJDLcXZKLnstnC4Sd3uyfyf1uFhmDLIQRryn5m+\nLBYHfDBPN3kdm7bsZDDq9GbTHiFZUfm/tChVKXWxkhpAmHhU/tH6GGzNSMXuIWSO\naOz3Rqq0ED4NXyNKjdF9MiwD/i83S0ZBc0LmJYt4Z10jtH2B6tYdqnAK29uQaadx\nyZCX2scE09UIm32/w7pV77CKr1Cp/4OzAXS1tmFzQ+bX7DR+Gl8t4wxr57VeEMvl\nBGw4Vjh3X8//m3xynxycQU18Q1zJ6PkiMyPw2owZ/nss3hpSRKFJsxMLhW3fKmKr\nEy2KiOcEGAECAAkFAlVKn7UCGwIAUgkQNRjL95IRWP5HIAQZEQIABgUCVUqftQAK\nCRD98VjDN10SqkWrAKDTpEY8D8HC02E/KVC5YUI01B30wgCgurpILm20kXEDCeHp\nC5pygfXw1DJrhAP+NyPJ4um/bU1I+rXaHHJYroYJs8YSweiNcwiHDQn0Engh/mVZ\nSqLHvbKh2dL/RXymC3+rjPvQf5cup9bPxNMa6WagdYBNAfzWGtkVISeaQW+cTEp/\nMtgVijRGXR/lGLGETPg2X3Afwn9N9bLMBkBprKgbBqU7lpaoPupxT61bL70=\n=vtbN\n-----END PGP PUBLIC KEY BLOCK-----`\n\nconst revokedUserIDKey = `-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQENBFsgO5EBCADhREPmcjsPkXe1z7ctvyWL0S7oa9JaoGZ9oPDHFDlQxd0qlX2e\nDZJZDg0qYvVixmaULIulApq1puEsaJCn3lHUbHlb4PYKwLEywYXM28JN91KtLsz/\nuaEX2KC5WqeP40utmzkNLq+oRX/xnRMgwbO7yUNVG2UlEa6eI+xOXO3YtLdmJMBW\nClQ066ZnOIzEo1JxnIwha1CDBMWLLfOLrg6l8InUqaXbtEBbnaIYO6fXVXELUjkx\nnmk7t/QOk0tXCy8muH9UDqJkwDUESY2l79XwBAcx9riX8vY7vwC34pm22fAUVLCJ\nx1SJx0J8bkeNp38jKM2Zd9SUQqSbfBopQ4pPABEBAAG0I0dvbGFuZyBHb3BoZXIg\nPG5vLXJlcGx5QGdvbGFuZy5jb20+iQFUBBMBCgA+FiEE5Ik5JLcNx6l6rZfw1oFy\n9I6cUoMFAlsgO5ECGwMFCQPCZwAFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQ\n1oFy9I6cUoMIkwf8DNPeD23i4jRwd/pylbvxwZintZl1fSwTJW1xcOa1emXaEtX2\ndepuqhP04fjlRQGfsYAQh7X9jOJxAHjTmhqFBi5sD7QvKU00cPFYbJ/JTx0B41bl\naXnSbGhRPh63QtEZL7ACAs+shwvvojJqysx7kyVRu0EW2wqjXdHwR/SJO6nhNBa2\nDXzSiOU/SUA42mmG+5kjF8Aabq9wPwT9wjraHShEweNerNMmOqJExBOy3yFeyDpa\nXwEZFzBfOKoxFNkIaVf5GSdIUGhFECkGvBMB935khftmgR8APxdU4BE7XrXexFJU\n8RCuPXonm4WQOwTWR0vQg64pb2WKAzZ8HhwTGbQiR29sYW5nIEdvcGhlciA8cmV2\nb2tlZEBnb2xhbmcuY29tPokBNgQwAQoAIBYhBOSJOSS3Dcepeq2X8NaBcvSOnFKD\nBQJbIDv3Ah0AAAoJENaBcvSOnFKDfWMIAKhI/Tvu3h8fSUxp/gSAcduT6bC1JttG\n0lYQ5ilKB/58lBUA5CO3ZrKDKlzW3M8VEcvohVaqeTMKeoQd5rCZq8KxHn/KvN6N\ns85REfXfniCKfAbnGgVXX3kDmZ1g63pkxrFu0fDZjVDXC6vy+I0sGyI/Inro0Pzb\ntvn0QCsxjapKK15BtmSrpgHgzVqVg0cUp8vqZeKFxarYbYB2idtGRci4b9tObOK0\nBSTVFy26+I/mrFGaPrySYiy2Kz5NMEcRhjmTxJ8jSwEr2O2sUR0yjbgUAXbTxDVE\n/jg5fQZ1ACvBRQnB7LvMHcInbzjyeTM3FazkkSYQD6b97+dkWwb1iWG5AQ0EWyA7\nkQEIALkg04REDZo1JgdYV4x8HJKFS4xAYWbIva1ZPqvDNmZRUbQZR2+gpJGEwn7z\nVofGvnOYiGW56AS5j31SFf5kro1+1bZQ5iOONBng08OOo58/l1hRseIIVGB5TGSa\nPCdChKKHreJI6hS3mShxH6hdfFtiZuB45rwoaArMMsYcjaezLwKeLc396cpUwwcZ\nsnLUNd1Xu5EWEF2OdFkZ2a1qYdxBvAYdQf4+1Nr+NRIx1u1NS9c8jp3PuMOkrQEi\nbNtc1v6v0Jy52mKLG4y7mC/erIkvkQBYJdxPaP7LZVaPYc3/xskcyijrJ/5ufoD8\nK71/ShtsZUXSQn9jlRaYR0EbojMAEQEAAYkBPAQYAQoAJhYhBOSJOSS3Dcepeq2X\n8NaBcvSOnFKDBQJbIDuRAhsMBQkDwmcAAAoJENaBcvSOnFKDkFMIAIt64bVZ8x7+\nTitH1bR4pgcNkaKmgKoZz6FXu80+SnbuEt2NnDyf1cLOSimSTILpwLIuv9Uft5Pb\nOraQbYt3xi9yrqdKqGLv80bxqK0NuryNkvh9yyx5WoG1iKqMj9/FjGghuPrRaT4l\nQinNAghGVkEy1+aXGFrG2DsOC1FFI51CC2WVTzZ5RwR2GpiNRfESsU1rZAUqf/2V\nyJl9bD5R4SUNy8oQmhOxi+gbhD4Ao34e4W0ilibslI/uawvCiOwlu5NGd8zv5n+U\nheiQvzkApQup5c+BhH5zFDFdKJ2CBByxw9+7QjMFI/wgLixKuE0Ob2kAokXf7RlB\n7qTZOahrETw=\n=IKnw\n-----END PGP PUBLIC KEY BLOCK-----`\n\nconst keyWithFirstUserIDRevoked = `-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: OpenPGP.js v4.10.10\nComment: https://openpgpjs.org\n\nxsBNBFsgO5EBCADhREPmcjsPkXe1z7ctvyWL0S7oa9JaoGZ9oPDHFDlQxd0q\nlX2eDZJZDg0qYvVixmaULIulApq1puEsaJCn3lHUbHlb4PYKwLEywYXM28JN\n91KtLsz/uaEX2KC5WqeP40utmzkNLq+oRX/xnRMgwbO7yUNVG2UlEa6eI+xO\nXO3YtLdmJMBWClQ066ZnOIzEo1JxnIwha1CDBMWLLfOLrg6l8InUqaXbtEBb\nnaIYO6fXVXELUjkxnmk7t/QOk0tXCy8muH9UDqJkwDUESY2l79XwBAcx9riX\n8vY7vwC34pm22fAUVLCJx1SJx0J8bkeNp38jKM2Zd9SUQqSbfBopQ4pPABEB\nAAHNIkdvbGFuZyBHb3BoZXIgPHJldm9rZWRAZ29sYW5nLmNvbT7CwI0EMAEK\nACAWIQTkiTkktw3HqXqtl/DWgXL0jpxSgwUCWyA79wIdAAAhCRDWgXL0jpxS\ngxYhBOSJOSS3Dcepeq2X8NaBcvSOnFKDfWMIAKhI/Tvu3h8fSUxp/gSAcduT\n6bC1JttG0lYQ5ilKB/58lBUA5CO3ZrKDKlzW3M8VEcvohVaqeTMKeoQd5rCZ\nq8KxHn/KvN6Ns85REfXfniCKfAbnGgVXX3kDmZ1g63pkxrFu0fDZjVDXC6vy\n+I0sGyI/Inro0Pzbtvn0QCsxjapKK15BtmSrpgHgzVqVg0cUp8vqZeKFxarY\nbYB2idtGRci4b9tObOK0BSTVFy26+I/mrFGaPrySYiy2Kz5NMEcRhjmTxJ8j\nSwEr2O2sUR0yjbgUAXbTxDVE/jg5fQZ1ACvBRQnB7LvMHcInbzjyeTM3Fazk\nkSYQD6b97+dkWwb1iWHNI0dvbGFuZyBHb3BoZXIgPG5vLXJlcGx5QGdvbGFu\nZy5jb20+wsCrBBMBCgA+FiEE5Ik5JLcNx6l6rZfw1oFy9I6cUoMFAlsgO5EC\nGwMFCQPCZwAFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AAIQkQ1oFy9I6cUoMW\nIQTkiTkktw3HqXqtl/DWgXL0jpxSgwiTB/wM094PbeLiNHB3+nKVu/HBmKe1\nmXV9LBMlbXFw5rV6ZdoS1fZ16m6qE/Th+OVFAZ+xgBCHtf2M4nEAeNOaGoUG\nLmwPtC8pTTRw8Vhsn8lPHQHjVuVpedJsaFE+HrdC0RkvsAICz6yHC++iMmrK\nzHuTJVG7QRbbCqNd0fBH9Ik7qeE0FrYNfNKI5T9JQDjaaYb7mSMXwBpur3A/\nBP3COtodKETB416s0yY6okTEE7LfIV7IOlpfARkXMF84qjEU2QhpV/kZJ0hQ\naEUQKQa8EwH3fmSF+2aBHwA/F1TgETtetd7EUlTxEK49eiebhZA7BNZHS9CD\nrilvZYoDNnweHBMZzsBNBFsgO5EBCAC5INOERA2aNSYHWFeMfByShUuMQGFm\nyL2tWT6rwzZmUVG0GUdvoKSRhMJ+81aHxr5zmIhluegEuY99UhX+ZK6NftW2\nUOYjjjQZ4NPDjqOfP5dYUbHiCFRgeUxkmjwnQoSih63iSOoUt5kocR+oXXxb\nYmbgeOa8KGgKzDLGHI2nsy8Cni3N/enKVMMHGbJy1DXdV7uRFhBdjnRZGdmt\namHcQbwGHUH+PtTa/jUSMdbtTUvXPI6dz7jDpK0BImzbXNb+r9CcudpiixuM\nu5gv3qyJL5EAWCXcT2j+y2VWj2HN/8bJHMoo6yf+bn6A/Cu9f0obbGVF0kJ/\nY5UWmEdBG6IzABEBAAHCwJMEGAEKACYWIQTkiTkktw3HqXqtl/DWgXL0jpxS\ngwUCWyA7kQIbDAUJA8JnAAAhCRDWgXL0jpxSgxYhBOSJOSS3Dcepeq2X8NaB\ncvSOnFKDkFMIAIt64bVZ8x7+TitH1bR4pgcNkaKmgKoZz6FXu80+SnbuEt2N\nnDyf1cLOSimSTILpwLIuv9Uft5PbOraQbYt3xi9yrqdKqGLv80bxqK0NuryN\nkvh9yyx5WoG1iKqMj9/FjGghuPrRaT4lQinNAghGVkEy1+aXGFrG2DsOC1FF\nI51CC2WVTzZ5RwR2GpiNRfESsU1rZAUqf/2VyJl9bD5R4SUNy8oQmhOxi+gb\nhD4Ao34e4W0ilibslI/uawvCiOwlu5NGd8zv5n+UheiQvzkApQup5c+BhH5z\nFDFdKJ2CBByxw9+7QjMFI/wgLixKuE0Ob2kAokXf7RlB7qTZOahrETw=\n=+2T8\n-----END PGP PUBLIC KEY BLOCK-----\n`\n\nconst keyWithOnlyUserIDRevoked = `-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmDMEYYwB7RYJKwYBBAHaRw8BAQdARimqhPPzyGAXmfQJjcqM1QVPzLtURJSzNVll\nJV4tEaW0KVJldm9rZWQgUHJpbWFyeSBVc2VyIElEIDxyZXZva2VkQGtleS5jb20+\niHgEMBYIACAWIQSpyJZAXYqVEFkjyKutFcS0yeB0LQUCYYwCtgIdAAAKCRCtFcS0\nyeB0LbSsAQD8OYMaaBjrdzzpwIkP1stgmPd4/kzN/ZG28Ywl6a5F5QEA5Xg7aq4e\n/t6Fsb4F5iqB956kSPe6YJrikobD/tBbMwSIkAQTFggAOBYhBKnIlkBdipUQWSPI\nq60VxLTJ4HQtBQJhjAHtAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEK0V\nxLTJ4HQtBaoBAPZL7luTCji+Tqhn7XNfFE/0QIahCt8k9wfO1cGlB3inAQDf8Tzw\nZGR5fNluUcNoVxQT7bUSFStbaGo3k0BaOYPbCLg4BGGMAe0SCisGAQQBl1UBBQEB\nB0DLwSpveSrbIO/IVZD13yrs1XuB3FURZUnafGrRq7+jUAMBCAeIeAQYFggAIBYh\nBKnIlkBdipUQWSPIq60VxLTJ4HQtBQJhjAHtAhsMAAoJEK0VxLTJ4HQtZ1oA/j9u\n8+p3xTNzsmabTL6BkNbMeB/RUKCrlm6woM6AV+vxAQCcXTn3JC2sNoNrLoXuVzaA\nmcG3/TwG5GSQUUPkrDsGDA==\n=mFWy\n-----END PGP PUBLIC KEY BLOCK-----\n`\n\nconst keyWithSubKey = `-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmI0EWyKwKQEEALwXhKBnyaaNFeK3ljfc/qn9X/QFw+28EUfgZPHjRmHubuXLE2uR\ns3ZoSXY2z7Dkv+NyHYMt8p+X8q5fR7JvUjK2XbPyKoiJVnHINll83yl67DaWfKNL\nEjNoO0kIfbXfCkZ7EG6DL+iKtuxniGTcnGT47e+HJSqb/STpLMnWwXjBABEBAAG0\nI0dvbGFuZyBHb3BoZXIgPG5vLXJlcGx5QGdvbGFuZy5jb20+iM4EEwEKADgWIQQ/\nlRafP/p9PytHbwxMvYJsOQdOOAUCWyKwKQIbAwULCQgHAwUVCgkICwUWAgMBAAIe\nAQIXgAAKCRBMvYJsOQdOOOsFBAC62mXww8XuqvYLcVOvHkWLT6mhxrQOJXnlfpn7\n2uBV9CMhoG/Ycd43NONsJrB95Apr9TDIqWnVszNbqPCuBhZQSGLdbiDKjxnCWBk0\n69qv4RNtkpOhYB7jK4s8F5oQZqId6JasT/PmJTH92mhBYhhTQr0GYFuPX2UJdkw9\nSn9C67iNBFsisDUBBAC3A+Yo9lgCnxi/pfskyLrweYif6kIXWLAtLTsM6g/6jt7b\nwTrknuCPyTv0QKGXsAEe/cK/Xq3HvX9WfXPGIHc/X56ZIsHQ+RLowbZV/Lhok1IW\nFAuQm8axr/by80cRwFnzhfPc/ukkAq2Qyj4hLsGblu6mxeAhzcp8aqmWOO2H9QAR\nAQABiLYEKAEKACAWIQQ/lRafP/p9PytHbwxMvYJsOQdOOAUCWyK16gIdAAAKCRBM\nvYJsOQdOOB1vA/4u4uLONsE+2GVOyBsHyy7uTdkuxaR9b54A/cz6jT/tzUbeIzgx\n22neWhgvIEghnUZd0vEyK9k1wy5vbDlEo6nKzHso32N1QExGr5upRERAxweDxGOj\n7luDwNypI7QcifE64lS/JmlnunwRCdRWMKc0Fp+7jtRc5mpwyHN/Suf5RokBagQY\nAQoAIBYhBD+VFp8/+n0/K0dvDEy9gmw5B044BQJbIrA1AhsCAL8JEEy9gmw5B044\ntCAEGQEKAB0WIQSNdnkaWY6t62iX336UXbGvYdhXJwUCWyKwNQAKCRCUXbGvYdhX\nJxJSA/9fCPHP6sUtGF1o3G1a3yvOUDGr1JWcct9U+QpbCt1mZoNopCNDDQAJvDWl\nmvDgHfuogmgNJRjOMznvahbF+wpTXmB7LS0SK412gJzl1fFIpK4bgnhu0TwxNsO1\n8UkCZWqxRMgcNUn9z6XWONK8dgt5JNvHSHrwF4CxxwjL23AAtK+FA/UUoi3U4kbC\n0XnSr1Sl+mrzQi1+H7xyMe7zjqe+gGANtskqexHzwWPUJCPZ5qpIa2l8ghiUim6b\n4ymJ+N8/T8Yva1FaPEqfMzzqJr8McYFm0URioXJPvOAlRxdHPteZ0qUopt/Jawxl\nXt6B9h1YpeLoJwjwsvbi98UTRs0jXwoY\n=3fWu\n-----END PGP PUBLIC KEY BLOCK-----`\n\nconst keyWithSubKeyAndBadSelfSigOrder = `-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmI0EWyLLDQEEAOqIOpJ/ha1OYAGduu9tS3rBz5vyjbNgJO4sFveEM0mgsHQ0X9/L\nplonW+d0gRoO1dhJ8QICjDAc6+cna1DE3tEb5m6JtQ30teLZuqrR398Cf6w7NNVz\nr3lrlmnH9JaKRuXl7tZciwyovneBfZVCdtsRZjaLI1uMQCz/BToiYe3DABEBAAG0\nI0dvbGFuZyBHb3BoZXIgPG5vLXJlcGx5QGdvbGFuZy5jb20+iM4EEwEKADgWIQRZ\nsixZOfQcZdW0wUqmgmdsv1O9xgUCWyLLDQIbAwULCQgHAwUVCgkICwUWAgMBAAIe\nAQIXgAAKCRCmgmdsv1O9xql2A/4pix98NxjhdsXtazA9agpAKeADf9tG4Za27Gj+\n3DCww/E4iP2X35jZimSm/30QRB6j08uGCqd9vXkkJxtOt63y/IpVOtWX6vMWSTUm\nk8xKkaYMP0/IzKNJ1qC/qYEUYpwERBKg9Z+k99E2Ql4kRHdxXUHq6OzY79H18Y+s\nGdeM/riNBFsiyxsBBAC54Pxg/8ZWaZX1phGdwfe5mek27SOYpC0AxIDCSOdMeQ6G\nHPk38pywl1d+S+KmF/F4Tdi+kWro62O4eG2uc/T8JQuRDUhSjX0Qa51gPzJrUOVT\nCFyUkiZ/3ZDhtXkgfuso8ua2ChBgR9Ngr4v43tSqa9y6AK7v0qjxD1x+xMrjXQAR\nAQABiQFxBBgBCgAmAhsCFiEEWbIsWTn0HGXVtMFKpoJnbL9TvcYFAlsizTIFCQAN\nMRcAv7QgBBkBCgAdFiEEJcoVUVJIk5RWj1c/o62jUpRPICQFAlsiyxsACgkQo62j\nUpRPICQq5gQApoWIigZxXFoM0uw4uJBS5JFZtirTANvirZV5RhndwHeMN6JttaBS\nYnjyA4+n1D+zB2VqliD2QrsX12KJN6rGOehCtEIClQ1Hodo9nC6kMzzAwW1O8bZs\nnRJmXV+bsvD4sidLZLjdwOVa3Cxh6pvq4Uur6a7/UYx121hEY0Qx0s8JEKaCZ2y/\nU73GGi0D/i20VW8AWYAPACm2zMlzExKTOAV01YTQH/3vW0WLrOse53WcIVZga6es\nHuO4So0SOEAvxKMe5HpRIu2dJxTvd99Bo9xk9xJU0AoFrO0vNCRnL+5y68xMlODK\nlEw5/kl0jeaTBp6xX0HDQOEVOpPGUwWV4Ij2EnvfNDXaE1vK1kffiQFrBBgBCgAg\nAhsCFiEEWbIsWTn0HGXVtMFKpoJnbL9TvcYFAlsi0AYAv7QgBBkBCgAdFiEEJcoV\nUVJIk5RWj1c/o62jUpRPICQFAlsiyxsACgkQo62jUpRPICQq5gQApoWIigZxXFoM\n0uw4uJBS5JFZtirTANvirZV5RhndwHeMN6JttaBSYnjyA4+n1D+zB2VqliD2QrsX\n12KJN6rGOehCtEIClQ1Hodo9nC6kMzzAwW1O8bZsnRJmXV+bsvD4sidLZLjdwOVa\n3Cxh6pvq4Uur6a7/UYx121hEY0Qx0s8JEKaCZ2y/U73GRl0EAJokkXmy4zKDHWWi\nwvK9gi2gQgRkVnu2AiONxJb5vjeLhM/07BRmH6K1o+w3fOeEQp4FjXj1eQ5fPSM6\nHhwx2CTl9SDnPSBMiKXsEFRkmwQ2AAsQZLmQZvKBkLZYeBiwf+IY621eYDhZfo+G\n1dh1WoUCyREZsJQg2YoIpWIcvw+a\n=bNRo\n-----END PGP PUBLIC KEY BLOCK-----\n`\n\nconst onlySubkeyNoPrivateKey = `-----BEGIN PGP PRIVATE KEY BLOCK-----\nVersion: GnuPG v1\n\nlQCVBFggvocBBAC7vBsHn7MKmS6IiiZNTXdciplVgS9cqVd+RTdIAoyNTcsiV1H0\nGQ3QtodOPeDlQDNoqinqaobd7R9g3m3hS53Nor7yBZkCWQ5x9v9JxRtoAq0sklh1\nI1X2zEqZk2l6YrfBF/64zWrhjnW3j23szkrAIVu0faQXbQ4z56tmZrw11wARAQAB\n/gdlAkdOVQG0CUdOVSBEdW1teYi4BBMBAgAiBQJYIL6HAhsDBgsJCAcDAgYVCAIJ\nCgsEFgIDAQIeAQIXgAAKCRCd1xxWp1CYAnjGA/9synn6ZXJUKAXQzySgmCZvCIbl\nrqBfEpxwLG4Q/lONhm5vthAE0z49I8hj5Gc5e2tLYUtq0o0OCRdCrYHa/efOYWpJ\n6RsK99bePOisVzmOABLIgZkcr022kHoMCmkPgv9CUGKP1yqbGl+zzAwQfUjRUmvD\nZIcWLHi2ge4GzPMPi50B2ARYIL6cAQQAxWHnicKejAFcFcF1/3gUSgSH7eiwuBPX\nM7vDdgGzlve1o1jbV4tzrjN9jsCl6r0nJPDMfBSzgLr1auNTRG6HpJ4abcOx86ED\nAd+avDcQPZb7z3dPhH/gb2lQejZsHh7bbeOS8WMSzHV3RqCLd8J/xwWPNR5zKn1f\nyp4IGfopidMAEQEAAQAD+wQOelnR82+dxyM2IFmZdOB9wSXQeCVOvxSaNMh6Y3lk\nUOOkO8Nlic4x0ungQRvjoRs4wBmCuwFK/MII6jKui0B7dn/NDf51i7rGdNGuJXDH\ne676By1sEY/NGkc74jr74T+5GWNU64W0vkpfgVmjSAzsUtpmhJMXsc7beBhJdnVl\nAgDKCb8hZqj1alcdmLoNvb7ibA3K/V8J462CPD7bMySPBa/uayoFhNxibpoXml2r\noOtHa5izF3b0/9JY97F6rqkdAgD6GdTJ+xmlCoz1Sewoif1I6krq6xoa7gOYpIXo\nUL1Afr+LiJeyAnF/M34j/kjIVmPanZJjry0kkjHE5ILjH3uvAf4/6n9np+Th8ujS\nYDCIzKwR7639+H+qccOaddCep8Y6KGUMVdD/vTKEx1rMtK+hK/CDkkkxnFslifMJ\nkqoqv3WUqCWJAT0EGAECAAkFAlggvpwCGwIAqAkQndccVqdQmAKdIAQZAQIABgUC\nWCC+nAAKCRDmGUholQPwvQk+A/9latnSsR5s5/1A9TFki11GzSEnfLbx46FYOdkW\nn3YBxZoPQGxNA1vIn8GmouxZInw9CF4jdOJxEdzLlYQJ9YLTLtN5tQEMl/19/bR8\n/qLacAZ9IOezYRWxxZsyn6//jfl7A0Y+FV59d4YajKkEfItcIIlgVBSW6T+TNQT3\nR+EH5HJ/A/4/AN0CmBhhE2vGzTnVU0VPrE4V64pjn1rufFdclgpixNZCuuqpKpoE\nVVHn6mnBf4njKjZrAGPs5kfQ+H4NsM7v3Zz4yV6deu9FZc4O6E+V1WJ38rO8eBix\n7G2jko106CC6vtxsCPVIzY7aaG3H5pjRtomw+pX7SzrQ7FUg2PGumg==\n=F/T0\n-----END PGP PRIVATE KEY BLOCK-----`\n\nconst ecdsaPrivateKey = `-----BEGIN PGP PRIVATE KEY BLOCK-----\n\nxaUEX1KsSRMIKoZIzj0DAQcCAwTpYqJsnJiFhKKh+8TulWD+lVmerBFNS+Ii\nB+nlG3T0xQQ4Sy5eIjJ0CExIQQzi3EElF/Z2l4F3WC5taFA11NgA/gkDCHSS\nPThf1M2K4LN8F1MRcvR+sb7i0nH55ojkwuVB1DE6jqIT9m9i+mX1tzjSAS+6\nlPQiweCJvG7xTC7Hs3AzRapf/r1At4TB+v+5G2/CKynNFEJpbGwgPGJpbGxA\naG9tZS5jb20+wncEEBMIAB8FAl9SrEkGCwkHCAMCBBUICgIDFgIBAhkBAhsD\nAh4BAAoJEMpwT3+q3+xqw5UBAMebZN9isEZ1ML+R/jWAAWMwa/knMugrEZ1v\nBl9+ZwM0AQCZdf80/wYY4Nve01qSRFv8OmKswLli3TvDv6FKc4cLz8epBF9S\nrEkSCCqGSM49AwEHAgMEAjKnT9b5wY2bf9TpAV3d7OUfPOxKj9c4VzeVzSrH\nAtQgo/MuI1cdYVURicV4i76DNjFhQHQFTk7BrC+C2u1yqQMBCAf+CQMIHImA\niYfzQtjgQWSFZYUkCFpbbwhNF0ch+3HNaZkaHCnZRIsWsRnc6FCb6lRQyK9+\nDq59kHlduE5QgY40894jfmP2JdJHU6nBdYrivbEdbMJhBBgTCAAJBQJfUqxJ\nAhsMAAoJEMpwT3+q3+xqUI0BAMykhV08kQ4Ip9Qlbss6Jdufv7YrU0Vd5hou\nb5TmiPd0APoDBh3qIic+aLLUcAuG3+Gt1P1AbUlmqV61ozn1WfHxfw==\n=KLN8\n-----END PGP PRIVATE KEY BLOCK-----`\n\nconst dsaPrivateKeyWithElGamalSubkey = `-----BEGIN PGP PRIVATE KEY BLOCK-----\n\nlQOBBF9/MLsRCACeaF6BI0jTgDAs86t8/kXPfwlPvR2MCYzB0BCqAdcq1hV/GTYd\noNmJRna/ZJfsI/vf+d8Nv+EYOQkPheFS1MJVBitkAXjQPgm8i1tQWen1FCWZxqGk\n/vwZYF4yo8GhZ+Wxi3w09W9Cp9QM/CTmyE1Xe7wpPBGe+oD+me8Zxjyt8JBS4Qx+\ngvWbfHxfHnggh4pz7U8QkItlLsBNQEdX4R5+zwRN66g2ZSX/shaa/EkVnihUhD7r\nnjP9I51ORWucTQD6OvgooaNQZCkQ/Se9TzdakwWKS2XSIFXiY/e2E5ZgKI/pfKDU\niA/KessxddPb7nP/05OIJqg9AoDrD4vmehLzAQD+zsUS3LDU1m9/cG4LMsQbT2VK\nTe4HqbGIAle+eu/asQf8DDJMrbZpiJZvADum9j0TJ0oep6VdMbzo9RSDKvlLKT9m\nkG63H8oDWnCZm1a+HmGq9YIX+JHWmsLXXsFLeEouLzHO+mZo0X28eji3V2T87hyR\nMmUM0wFo4k7jK8uVmkDXv3XwNp2uByWxUKZd7EnWmcEZWqIiexJ7XpCS0Pg3tRaI\nzxve0SRe/dxfUPnTk/9KQ9hS6DWroBKquL182zx1Fggh4LIWWE2zq+UYn8BI0E8A\nrmIDFJdF8ymFQGRrEy6g79NnkPmkrZWsgMRYY65P6v4zLVmqohJKkpm3/Uxa6QAP\nCCoPh/JTOvPeCP2bOJH8z4Z9Py3ouMIjofQW8sXqRgf/RIHbh0KsINHrwwZ4gVIr\nMK3RofpaYxw1ztPIWb4cMWoWZHH1Pxh7ggTGSBpAhKXkiWw2Rxat8QF5aA7e962c\nbLvVv8dqsPrD/RnVJHag89cbPTzjn7gY9elE8EM8ithV3oQkwHTr4avYlpDZsgNd\nhUW3YgRwGo31tdzxoG04AcpV2t+07P8XMPr9hsfWs4rHohXPi38Hseu1Ji+dBoWQ\n3+1w/HH3o55s+jy4Ruaz78AIrjbmAJq+6rA2mIcCgrhw3DnzuwQAKeBvSeqn9zfS\nZC812osMBVmkycwelpaIh64WZ0vWL3GvdXDctV2kXM+qVpDTLEny0LuiXxrwCKQL\nEv4HAwK9uQBcreDEEud7pfRb8EYP5lzO2ZA7RaIvje6EWAGBvJGMRT0QQE5SGqc7\nFw5geigBdt+vVyRuNNhg3c2fdn/OBQaYu0J/8AiOogG8EaM8tCFlbGdhbWFsQGRz\nYS5jb20gPGVsZ2FtYWxAZHNhLmNvbT6IkAQTEQgAOBYhBI+gnfiHQxB35/Dp0XAQ\naE/rsWC5BQJffzC7AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEHAQaE/r\nsWC5A4EA/0GcJmyPtN+Klc7b9sVT3JgKTRnB/URxOJfYJofP0hZLAQCkqyMO+adV\nJvbgDH0zaITQWZSSXPqpgMpCA6juTrDsd50CawRffzC7EAgAxFFFSAAEQzWTgKU5\nEBtpxxoPzHqcChawTHRxHxjcELXzmUBS5PzfA1HXSPnNqK/x3Ut5ycC3CsW41Fnt\nGm3706Wu9VFbFZVn55F9lPiplUo61n5pqMvOr1gmuQsdXiTa0t5FRa4TZ2VSiHFw\nvdAVSPTUsT4ZxJ1rPyFYRtq1n3pQcvdZowd07r0JnzTMjLLMFYCKhwIowoOC4zqJ\niB8enjwOlpaqBATRm9xpVF7SJkroPF6/B1vdhj7E3c1aJyHlo0PYBAg756sSHWHg\nUuLyUQ4TA0hcCVenn/L/aSY2LnbdZB1EBhlYjA7dTCgwIqsQhfQmPkjz6g64A7+Y\nHbbrLwADBQgAk14QIEQ+J/VHetpQV/jt2pNsFK1kVK7mXK0spTExaC2yj2sXlHjL\nIe3bO5T/KqmIaBEB5db5fA5xK9cZt79qrQHDKsEqUetUeMUWLBx77zBsus3grIgy\nbwDZKseRzQ715pwxquxQlScGoDIBKEh08HpwHkq140eIj3w+MAIfndaZaSCNaxaP\nSnky7BQmJ7Wc7qrIwoQP6yrnUqyW2yNi81nJYUhxjChqaFSlwzLs/iNGryBKo0ic\nBqVIRjikKHBlwBng6WyrltQo/Vt9GG8w+lqaAVXbJRlaBZJUR+2NKi/YhP3qQse3\nv8fi4kns0gh5LK+2C01RvdX4T49QSExuIf4HAwLJqYIGwadA2uem5v7/765ZtFWV\noL0iZ0ueTJDby4wTFDpLVzzDi/uVcB0ZRFrGOp7w6OYcNYTtV8n3xmli2Q5Trw0c\nwZVzvg+ABKWiv7faBjMczIFF8y6WZKOIeAQYEQgAIBYhBI+gnfiHQxB35/Dp0XAQ\naE/rsWC5BQJffzC7AhsMAAoJEHAQaE/rsWC5ZmIA/jhS4r4lClbvjuPWt0Yqdn7R\nfss2SPMYvMrrDh42aE0OAQD8xn4G6CN8UtW9xihXOY6FpxiJ/sMc2VaneeUd34oa\n4g==\n=XZm8\n-----END PGP PRIVATE KEY BLOCK-----`\n\n// https://tests.sequoia-pgp.org/#Certificate_expiration\n// P _ U p\nconst expiringPrimaryUIDKey = `-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxsDNBF2lnPIBDAC5cL9PQoQLTMuhjbYvb4Ncuuo0bfmgPRFywX53jPhoFf4Zg6mv\n/seOXpgecTdOcVttfzC8ycIKrt3aQTiwOG/ctaR4Bk/t6ayNFfdUNxHWk4WCKzdz\n/56fW2O0F23qIRd8UUJp5IIlN4RDdRCtdhVQIAuzvp2oVy/LaS2kxQoKvph/5pQ/\n5whqsyroEWDJoSV0yOb25B/iwk/pLUFoyhDG9bj0kIzDxrEqW+7Ba8nocQlecMF3\nX5KMN5kp2zraLv9dlBBpWW43XktjcCZgMy20SouraVma8Je/ECwUWYUiAZxLIlMv\n9CurEOtxUw6N3RdOtLmYZS9uEnn5y1UkF88o8Nku890uk6BrewFzJyLAx5wRZ4F0\nqV/yq36UWQ0JB/AUGhHVPdFf6pl6eaxBwT5GXvbBUibtf8YI2og5RsgTWtXfU7eb\nSGXrl5ZMpbA6mbfhd0R8aPxWfmDWiIOhBufhMCvUHh1sApMKVZnvIff9/0Dca3wb\nvLIwa3T4CyshfT0AEQEAAc0hQm9iIEJhYmJhZ2UgPGJvYkBvcGVucGdwLmV4YW1w\nbGU+wsFcBBMBCgCQBYJhesp/BYkEWQPJBQsJCAcCCRD7/MgqAV5zMEcUAAAAAAAe\nACBzYWx0QG5vdGF0aW9ucy5zZXF1b2lhLXBncC5vcmeEOQlNyTLFkc9I/elp+BpY\n495V7KatqtDmsyDr+zDAdwYVCgkICwIEFgIDAQIXgAIbAwIeARYhBNGmbhojsYLJ\nmA94jPv8yCoBXnMwAABSCQv/av8hKyynMtXVKFuWOGJw0mR8auDm84WdhMFRZg8t\nyTJ1L88+Ny4WUAFeqo2j7DU2yPGrm5rmuvzlEedFYFeOWt+A4adz+oumgRd0nsgG\nLf3QYUWQhLWVlz+H7zubgKqSB2A2RqV65S7mTTVro42nb2Mng6rvGWiqeKG5nrXN\n/01p1mIBQGR/KnZSqYLzA2Pw2PiJoSkXT26PDz/kiEMXpjKMR6sicV4bKVlEdUvm\npIImIPBHZq1EsKXEyWtWC41w/pc+FofGE+uSFs2aef1vvEHFkj3BHSK8gRcH3kfR\neFroTET8C2q9V1AOELWm+Ys6PzGzF72URK1MKXlThuL4t4LjvXWGNA78IKW+/RQH\nDzK4U0jqSO0mL6qxqVS5Ij6jjL6OTrVEGdtDf5n0vI8tcUTBKtVqYAYk+t2YGT05\nayxALtb7viVKo8f10WEcCuKshn0gdsEFMRZQzJ89uQIY3R3FbsdRCaE6OEaDgKMQ\nUTFROyfhthgzRKbRxfcplMUCzsDNBF2lnPIBDADWML9cbGMrp12CtF9b2P6z9TTT\n74S8iyBOzaSvdGDQY/sUtZXRg21HWamXnn9sSXvIDEINOQ6A9QxdxoqWdCHrOuW3\nofneYXoG+zeKc4dC86wa1TR2q9vW+RMXSO4uImA+Uzula/6k1DogDf28qhCxMwG/\ni/m9g1c/0aApuDyKdQ1PXsHHNlgd/Dn6rrd5y2AObaifV7wIhEJnvqgFXDN2RXGj\nLeCOHV4Q2WTYPg/S4k1nMXVDwZXrvIsA0YwIMgIT86Rafp1qKlgPNbiIlC1g9RY/\niFaGN2b4Ir6GDohBQSfZW2+LXoPZuVE/wGlQ01rh827KVZW4lXvqsge+wtnWlszc\nselGATyzqOK9LdHPdZGzROZYI2e8c+paLNDdVPL6vdRBUnkCaEkOtl1mr2JpQi5n\nTU+gTX4IeInC7E+1a9UDF/Y85ybUz8XV8rUnR76UqVC7KidNepdHbZjjXCt8/Zo+\nTec9JNbYNQB/e9ExmDntmlHEsSEQzFwzj8sxH48AEQEAAcLA9gQYAQoAIBYhBNGm\nbhojsYLJmA94jPv8yCoBXnMwBQJdpZzyAhsMAAoJEPv8yCoBXnMw6f8L/26C34dk\njBffTzMj5Bdzm8MtF67OYneJ4TQMw7+41IL4rVcSKhIhk/3Ud5knaRtP2ef1+5F6\n6h9/RPQOJ5+tvBwhBAcUWSupKnUrdVaZQanYmtSxcVV2PL9+QEiNN3tzluhaWO//\nrACxJ+K/ZXQlIzwQVTpNhfGzAaMVV9zpf3u0k14itcv6alKY8+rLZvO1wIIeRZLm\nU0tZDD5HtWDvUV7rIFI1WuoLb+KZgbYn3OWjCPHVdTrdZ2CqnZbG3SXw6awH9bzR\nLV9EXkbhIMez0deCVdeo+wFFklh8/5VK2b0vk/+wqMJxfpa1lHvJLobzOP9fvrsw\nsr92MA2+k901WeISR7qEzcI0Fdg8AyFAExaEK6VyjP7SXGLwvfisw34OxuZr3qmx\n1Sufu4toH3XrB7QJN8XyqqbsGxUCBqWif9RSK4xjzRTe56iPeiSJJOIciMP9i2ld\nI+KgLycyeDvGoBj0HCLO3gVaBe4ubVrj5KjhX2PVNEJd3XZRzaXZE2aAMQ==\n=AmgT\n-----END PGP PUBLIC KEY BLOCK-----`\n\nconst rsa2048PrivateKey = `-----BEGIN PGP PRIVATE KEY BLOCK-----\nComment: gpg (GnuPG) 2.2.27 with libgcrypt 1.9.4\n\nlQPGBGL07P0BCADL0etN8efyAXA6sL2WfQvHe5wEKYXPWeN2+jiqSppfeRZAOlzP\nkZ3U+cloeJriplYvVJwI3ID2aw52Z/TRn8iKRP5eOUFrEgcgl06lazLtOndK7o7p\noBV5mLtHEirFHm6W61fNt10jzM0jx0PV6nseLhFB2J42F1cmU/aBgFo41wjLSZYr\nowR+v+O9S5sUXblQF6sEDcY01sBEu09zrIgT49VFwQ1Cvdh9XZEOTQBfdiugoj5a\nDS3fAqAka3r1VoQK4eR7/upnYSgSACGeaQ4pUelKku5rpm50gdWTY8ppq0k9e1eT\ny2x0OQcW3hWE+j4os1ca0ZEADMdqr/99MOxrABEBAAH+BwMCJWxU4VOZOJ7/I6vX\nFxdfBhIBEXlJ52FM3S/oYtXqLhkGyrtmZOeEazVvUtuCe3M3ScHI8xCthcmE8E0j\nbi+ZEHPS2NiBZtgHFF27BLn7zZuTc+oD5WKduZdK3463egnyThTqIIMl25WZBuab\nk5ycwYrWwBH0jfA4gwJ13ai4pufKC2RM8qIu6YAVPglYBKFLKGvvJHa5vI+LuA0E\nK+k35hIic7yVUcQneNnAF2598X5yWiieYnOZpmHlRw1zfbMwOJr3ZNj2v94u7b+L\nsTa/1Uv9887Vb6sJp0c2Sh4cwEccoPYkvMqFn3ZrJUr3UdDu1K2vWohPtswzhrYV\n+RdPZE5RLoCQufKvlPezk0Pzhzb3bBU7XjUbdGY1nH/EyQeBNp+Gw6qldKvzcBaB\ncyOK1c6hPSszpJX93m5UxCN55IeifmcNjmbDh8vGCCdajy6d56qV2n4F3k7vt1J1\n0UlxIGhqijJoaTCX66xjLMC6VXkSz6aHQ35rnXosm/cqPcQshsZTdlfSyWkorfdr\n4Hj8viBER26mjYurTMLBKDtUN724ZrR0Ev5jorX9uoKlgl87bDZHty2Ku2S+vR68\nVAvnj6Fi1BYNclnDoqxdRB2z5T9JbWE52HuG83/QsplhEqXxESDxriTyTHMbNxEe\n88soVCDh4tgflZFa2ucUr6gEKJKij7jgahARnyaXfPZlQBUAS1YUeILYmN+VR+M/\nsHENpwDWc7TInn8VN638nJV+ScZGMih3AwWZTIoiLju3MMt1K0YZ3NuiqwGH4Jwg\n/BbEdTWeCci9y3NEQHQ3uZZ5p6j2CwFVlK11idemCMvAiTVxF+gKdaLMkeCwKxru\nJ3YzhKEo+iDVYbPYBYizx/EHBn2U5kITQ5SBXzjTaaFMNZJEf9JYsL1ybPB6HOFY\nVNVB2KT8CGVwtCJHb2xhbmcgR29waGVyIDxnb2xhbmdAZXhhbXBsZS5vcmc+iQFO\nBBMBCgA4FiEEC6K7U7f4qesybTnqSkra7gHusm0FAmL07P0CGwMFCwkIBwIGFQoJ\nCAsCBBYCAwECHgECF4AACgkQSkra7gHusm1MvwgAxpClWkeSqIhMQfbiuz0+lOkE\n89y1DCFw8bHjZoUf4/4K8hFA3dGkk+q72XFgiyaCpfXxMt6Gi+dN47t+tTv9NIqC\nsukbaoJBmJDhN6+djmJOgOYy+FWsW2LAk2LOwKYulpnBZdcA5rlMAhBg7gevQpF+\nruSU69P7UUaFJl/DC7hDmaIcj+4cjBE/HO26SnVQjoTfjZT82rDh1Wsuf8LnkJUk\nb3wezBLpXKjDvdHikdv4gdlR4AputVM38aZntYYglh/EASo5TneyZ7ZscdLNRdcF\nr5O2fKqrOJLOdaoYRFZZWOvP5GtEVFDU7WGivOSVfiszBE0wZR3dgZRJipHCXJ0D\nxgRi9Oz9AQgAtMJcJqLLVANJHl90tWuoizDkm+Imcwq2ubQAjpclnNrODnDK+7o4\npBsWmXbZSdkC4gY+LhOQA6bPDD0JEHM58DOnrm49BddxXAyK0HPsk4sGGt2SS86B\nOawWNdfJVyqw4bAiHWDmQg4PcjBbt3ocOIxAR6I5kBSiQVxuGQs9T+Zvg3G1r3Or\nfS6DzlgY3HFUML5YsGH4lOxNSOoKAP68GIH/WNdUZ+feiRg9knIib6I3Hgtf5eO8\nJRH7aWE/TD7eNu36bLLjT5TZPq5r6xaD2plbtPOyXbNPWs9qI1yG+VnErfaLY0w8\nQo0aqzbgID+CTZVomXSOpOcQseaFKw8ZfQARAQAB/gcDArha6+/+d4OY/w9N32K9\nhFNYt4LufTETMQ+k/sBeaMuAVzmT47DlAXzkrZhGW4dZOtXMu1rXaUwHlqkhEyzL\nL4MYEWVXfD+LbZNEK3MEFss6RK+UAMeT/PTV9aA8cXQVPcSJYzfBXHQ1U1hnOgrO\napn92MN8RmkhX8wJLyeWTMMuP4lXByJMmmGo8WvifeRD2kFY4y0WVBDAXJAV4Ljf\nDi/bBiwoc5a+gxHuZT2W9ZSxBQJNXdt4Un2IlyZuo58s5MLx2N0EaNJ8PwRUE6fM\nRZYO8aZCEPUtINE4njbvsWOMCtrblsMPwZ1B0SiIaWmLaNyGdCNKea+fCIW7kasC\nJYMhnLumpUTXg5HNexkCsl7ABWj0PYBflOE61h8EjWpnQ7JBBVKS2ua4lMjwHRX7\n5o5yxym9k5UZNFdGoXVL7xpizCcdGawxTJvwhs3vBqu1ZWYCegOAZWDrOkCyhUpq\n8uKMROZFbn+FwE+7tjt+v2ed62FVEvD6g4V3ThCA6mQqeOARfJWN8GZY8BDm8lht\ncrOXriUkrx+FlrgGtm2CkwjW5/9Xd7AhFpHnQdFeozOHyq1asNSgJF9sNi9Lz94W\nskQSVRi0IExxSXYGI3Y0nnAZUe2BAQflYPJdEveSr3sKlUqXiETTA1VXsTPK3kOC\n92CbLzj/Hz199jZvywwyu53I+GKMpF42rMq7zxr2oa61YWY4YE/GDezwwys/wLx/\nQpCW4X3ppI7wJjCSSqEV0baYZSSli1ayheS6dxi8QnSpX1Bmpz6gU7m/M9Sns+hl\nJ7ZvgpjCAiV7KJTjtclr5/S02zP78LTVkoTWoz/6MOTROwaP63VBUXX8pbJhf/vu\nDLmNnDk8joMJxoDXWeNU0EnNl4hP7Z/jExRBOEO4oAnUf/Sf6gCWQhL5qcajtg6w\ntGv7vx3f2IkBNgQYAQoAIBYhBAuiu1O3+KnrMm056kpK2u4B7rJtBQJi9Oz9AhsM\nAAoJEEpK2u4B7rJt6lgIAMBWqP4BCOGnQXBbgJ0+ACVghpkFUXZTb/tXJc8UUvTM\n8uov6k/RsqDGZrvhhufD7Wwt7j9v7dD7VPp7bPyjVWyimglQzWguTUUqLDGlstYH\n5uYv1pzma0ZsAGNqFeGlTLsKOSGKFMH4rB2KfN2n51L8POvtp1y7GKZQbWIWneaB\ncZr3BINU5GMvYYU7pAYcoR+mJPdJx5Up3Ocn+bn8Tu1sy9C/ArtCQucazGnoE9u1\nHhNLrh0CdzzX7TNH6TQ8LwPOvq0K5l/WqbN9lE0WBBhMv2HydxhluO8AhU+A5GqC\nC+wET7nVDnhoOm/fstIeb7/LN7OYejKPeHdFBJEL9GA=\n=u442\n-----END PGP PRIVATE KEY BLOCK-----`\n\nconst curve25519PrivateKey = `-----BEGIN PGP PRIVATE KEY BLOCK-----\nComment: gpg (GnuPG) 2.2.27 with libgcrypt 1.9.4\n\nlFgEYvTtQBYJKwYBBAHaRw8BAQdAxsNXLbrk5xOjpO24VhOMvQ0/F+JcyIkckMDH\nX3FIGxcAAQDFOlunZWYuPsCx5JLp78vKqUTfgef9TGG4oD6I/Sa0zBMstCJHb2xh\nbmcgR29waGVyIDxnb2xhbmdAZXhhbXBsZS5vcmc+iJAEExYIADgWIQSFQHEOazmo\nh1ldII4MvfnLQ4JBNwUCYvTtQAIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAK\nCRAMvfnLQ4JBN5yeAQCKdry8B5ScCPrev2+UByMCss7Sdu5RhomCFsHdNPLcKAEA\n8ugei+1owHsV+3cGwWWzKk6sLa8ZN87i3SKuOGp9DQycXQRi9O1AEgorBgEEAZdV\nAQUBAQdA5CubPp8l7lrVQ25h7Hx5XN2C8xanRnnpcjzEooCaEA0DAQgHAAD/Rpc+\nsOZUXrFk9HOWB1XU41LoWbDBoG8sP8RWAVYwD5AQRYh4BBgWCAAgFiEEhUBxDms5\nqIdZXSCODL35y0OCQTcFAmL07UACGwwACgkQDL35y0OCQTcvdwEA7lb5g/YisrEf\niq660uwMGoepLUfvtqKzuQ6heYe83y0BAN65Ffg5HYOJzUEi0kZQRf7OhdtuL2kJ\nSRXn8DmCTfEB\n=cELM\n-----END PGP PRIVATE KEY BLOCK-----`\n\nconst curve448PrivateKey = `-----BEGIN PGP PRIVATE KEY BLOCK-----\nComment: C1DB 65D5 80D7 B922 7254  4B1E A699 9895 FABA CE52\n\nxYUEYV2UmRYDK2VxAc9AFyxgh5xnSbyt50TWl558mw9xdMN+/UBLr5+UMP8IsrvV\nMdXuTIE8CyaUQKSotHtH2RkYEXj5nsMAAAHPQIbTMSzjIWug8UFECzAex5FHgAgH\ngYF3RK+TS8D24wX8kOu2C/NoVxwGY+p+i0JHaB+7yljriSKAGxs6wsBEBB8WCgCD\nBYJhXZSZBYkFpI+9AwsJBwkQppmYlfq6zlJHFAAAAAAAHgAgc2FsdEBub3RhdGlv\nbnMuc2VxdW9pYS1wZ3Aub3Jn5wSpIutJ5HncJWk4ruUV8GzQF390rR5+qWEAnAoY\nakcDFQoIApsBAh4BFiEEwdtl1YDXuSJyVEseppmYlfq6zlIAALzdA5dA/fsgYg/J\nqaQriYKaPUkyHL7EB3BXhV2d1h/gk+qJLvXQuU2WEJ/XSs3GrsBRiiZwvPH4o+7b\nmleAxjy5wpS523vqrrBR2YZ5FwIku7WS4litSdn4AtVam/TlLdMNIf41CtFeZKBe\nc5R5VNdQy8y7qy8AAADNEUN1cnZlNDQ4IE9wdGlvbiA4wsBHBBMWCgCGBYJhXZSZ\nBYkFpI+9AwsJBwkQppmYlfq6zlJHFAAAAAAAHgAgc2FsdEBub3RhdGlvbnMuc2Vx\ndW9pYS1wZ3Aub3JnD55UsYMzE6OACP+mgw5zvT+BBgol8/uFQjHg4krjUCMDFQoI\nApkBApsBAh4BFiEEwdtl1YDXuSJyVEseppmYlfq6zlIAAPQJA5dA0Xqwzn/0uwCq\nRlsOVCB3f5NOj1exKnlBvRw0xT1VBee1yxvlUt5eIAoCxWoRlWBJob3TTkhm9AEA\n8dyhwPmyGfWHzPw5NFG3xsXrZdNXNvit9WMVAPcmsyR7teXuDlJItxRAdJJc/qfJ\nYVbBFoaNrhYAAADHhQRhXZSZFgMrZXEBz0BL7THZ9MnCLfSPJ1FMLim9eGkQ3Bfn\nM3he5rOwO3t14QI1LjI96OjkeJipMgcFAmEP1Bq/ZHGO7oAAAc9AFnE8iNBaT3OU\nEFtxkmWHXtdaYMmGGRdopw9JPXr/UxuunDln5o9dxPxf7q7z26zXrZen+qed/Isa\nHsDCwSwEGBYKAWsFgmFdlJkFiQWkj70JEKaZmJX6us5SRxQAAAAAAB4AIHNhbHRA\nbm90YXRpb25zLnNlcXVvaWEtcGdwLm9yZxREUizdTcepBzgSMOv2VWQCWbl++3CZ\nEbgAWDryvSsyApsCwDGgBBkWCgBvBYJhXZSZCRBKo3SL4S5djkcUAAAAAAAeACBz\nYWx0QG5vdGF0aW9ucy5zZXF1b2lhLXBncC5vcmemoGTDjmNQiIzw6HOEddvS0OB7\nUZ/P07jM/EVmnYxTlBYhBAxsnkGpx1UCiH6gUUqjdIvhLl2OAAALYQOXQAMB1oKq\nOWxSFmvmgCKNcbAAyA3piF5ERIqs4z07oJvqDYrOWt75UsEIH/04gU/vHc4EmfG2\nJDLJgOLlyTUPkL/08f0ydGZPofFQBhn8HkuFFjnNtJ5oz3GIP4cdWMQFaUw0uvjb\nPM9Tm3ptENGd6Ts1AAAAFiEEwdtl1YDXuSJyVEseppmYlfq6zlIAAGpTA5dATR6i\nU2GrpUcQgpG+JqfAsGmF4yAOhgFxc1UfidFk3nTup3fLgjipkYY170WLRNbyKkVO\nSodx93GAs58rizO1acDAWiLq3cyEPBFXbyFThbcNPcLl+/77Uk/mgkYrPQFAQWdK\n1kSRm4SizDBK37K8ChAAAADHhwRhXZSZEgMrZW8Bx0DMhzvhQo+OsXeqQ6QVw4sF\nCaexHh6rLohh7TzL3hQSjoJ27fV6JBkIWdn0LfrMlJIDbSv2SLdlgQMBCgkAAcdA\nMO7Dc1myF6Co1fAH+EuP+OxhxP/7V6ljuSCZENDfA49tQkzTta+PniG+pOVB2LHb\nhuyaKBkqiaogo8LAOQQYFgoAeAWCYV2UmQWJBaSPvQkQppmYlfq6zlJHFAAAAAAA\nHgAgc2FsdEBub3RhdGlvbnMuc2VxdW9pYS1wZ3Aub3JnEjBMQAmc/2u45u5FQGmB\nQAytjSG2LM3JQN+PPVl5vEkCmwwWIQTB22XVgNe5InJUSx6mmZiV+rrOUgAASdYD\nl0DXEHQ9ykNP2rZP35ET1dmiFagFtTj/hLQcWlg16LqvJNGqOgYXuqTerbiOOt02\nXLCBln+wdewpU4ChEffMUDRBfqfQco/YsMqWV7bHJHAO0eC/DMKCjyU90xdH7R/d\nQgqsfguR1PqPuJxpXV4bSr6CGAAAAA==\n=MSvh\n-----END PGP PRIVATE KEY BLOCK-----`\n\nconst keyWithNotation = `-----BEGIN PGP PRIVATE KEY BLOCK-----\n\nxVgEY9gIshYJKwYBBAHaRw8BAQdAF25fSM8OpFlXZhop4Qpqo5ywGZ4jgWlR\nppjhIKDthREAAQC+LFpzFcMJYcjxGKzBGHN0Px2jU4d04YSRnFAik+lVVQ6u\nzRdUZXN0IDx0ZXN0QGV4YW1wbGUuY29tPsLACgQQFgoAfAUCY9gIsgQLCQcI\nCRD/utJOCym8pR0UgAAAAAAQAAR0ZXh0QGV4YW1wbGUuY29tdGVzdB8UAAAA\nAAASAARiaW5hcnlAZXhhbXBsZS5jb20AAQIDAxUICgQWAAIBAhkBAhsDAh4B\nFiEEEMCQTUVGKgCX5rDQ/7rSTgspvKUAAPl5AP9Npz90LxzrB97Qr2DrGwfG\nwuYn4FSYwtuPfZHHeoIabwD/QEbvpQJ/NBb9EAZuow4Rirlt1yv19mmnF+j5\n8yUzhQjHXQRj2AiyEgorBgEEAZdVAQUBAQdARXAo30DmKcyUg6co7OUm0RNT\nz9iqFbDBzA8A47JEt1MDAQgHAAD/XKK3lBm0SqMR558HLWdBrNG6NqKuqb5X\njoCML987ZNgRD8J4BBgWCAAqBQJj2AiyCRD/utJOCym8pQIbDBYhBBDAkE1F\nRioAl+aw0P+60k4LKbylAADRxgEAg7UfBDiDPp5LHcW9D+SgFHk6+GyEU4ev\nVppQxdtxPvAA/34snHBX7Twnip1nMt7P4e2hDiw/hwQ7oqioOvc6jMkP\n=Z8YJ\n-----END PGP PRIVATE KEY BLOCK-----\n`\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_config.go",
    "content": "// Copyright (C) 2019 ProtonTech AG\n\npackage packet\n\nimport \"math/bits\"\n\n// CipherSuite contains a combination of Cipher and Mode\ntype CipherSuite struct {\n\t// The cipher function\n\tCipher CipherFunction\n\t// The AEAD mode of operation.\n\tMode AEADMode\n}\n\n// AEADConfig collects a number of AEAD parameters along with sensible defaults.\n// A nil AEADConfig is valid and results in all default values.\ntype AEADConfig struct {\n\t// The AEAD mode of operation.\n\tDefaultMode AEADMode\n\t// Amount of octets in each chunk of data\n\tChunkSize uint64\n}\n\n// Mode returns the AEAD mode of operation.\nfunc (conf *AEADConfig) Mode() AEADMode {\n\t// If no preference is specified, OCB is used (which is mandatory to implement).\n\tif conf == nil || conf.DefaultMode == 0 {\n\t\treturn AEADModeOCB\n\t}\n\n\tmode := conf.DefaultMode\n\tif mode != AEADModeEAX && mode != AEADModeOCB && mode != AEADModeGCM {\n\t\tpanic(\"AEAD mode unsupported\")\n\t}\n\treturn mode\n}\n\n// ChunkSizeByte returns the byte indicating the chunk size. The effective\n// chunk size is computed with the formula uint64(1) << (chunkSizeByte + 6)\n// limit chunkSizeByte to 16 which equals to 2^22 = 4 MiB\n// https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-5.13.2\nfunc (conf *AEADConfig) ChunkSizeByte() byte {\n\tif conf == nil || conf.ChunkSize == 0 {\n\t\treturn 12 // 1 << (12 + 6) == 262144 bytes\n\t}\n\n\tchunkSize := conf.ChunkSize\n\texponent := bits.Len64(chunkSize) - 1\n\tswitch {\n\tcase exponent < 6:\n\t\texponent = 6\n\tcase exponent > 22:\n\t\texponent = 22\n\t}\n\n\treturn byte(exponent - 6)\n}\n\n// decodeAEADChunkSize returns the effective chunk size. In 32-bit systems, the\n// maximum returned value is 1 << 30.\nfunc decodeAEADChunkSize(c byte) int {\n\tsize := uint64(1 << (c + 6))\n\tif size != uint64(int(size)) {\n\t\treturn 1 << 30\n\t}\n\treturn int(size)\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_crypter.go",
    "content": "// Copyright (C) 2019 ProtonTech AG\n\npackage packet\n\nimport (\n\t\"crypto/cipher\"\n\t\"encoding/binary\"\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n)\n\n// aeadCrypter is an AEAD opener/sealer, its configuration, and data for en/decryption.\ntype aeadCrypter struct {\n\taead           cipher.AEAD\n\tchunkSize      int\n\tnonce          []byte\n\tassociatedData []byte       // Chunk-independent associated data\n\tchunkIndex     []byte       // Chunk counter\n\tpacketTag      packetType   // SEIP packet (v2) or AEAD Encrypted Data packet\n\tbytesProcessed int          // Amount of plaintext bytes encrypted/decrypted\n}\n\n// computeNonce takes the incremental index and computes an eXclusive OR with\n// the least significant 8 bytes of the receivers' initial nonce (see sec.\n// 5.16.1 and 5.16.2). It returns the resulting nonce.\nfunc (wo *aeadCrypter) computeNextNonce() (nonce []byte) {\n\tif wo.packetTag == packetTypeSymmetricallyEncryptedIntegrityProtected {\n\t\treturn wo.nonce\n\t}\n\n\tnonce = make([]byte, len(wo.nonce))\n\tcopy(nonce, wo.nonce)\n\toffset := len(wo.nonce) - 8\n\tfor i := 0; i < 8; i++ {\n\t\tnonce[i+offset] ^= wo.chunkIndex[i]\n\t}\n\treturn\n}\n\n// incrementIndex performs an integer increment by 1 of the integer represented by the\n// slice, modifying it accordingly.\nfunc (wo *aeadCrypter) incrementIndex() error {\n\tindex := wo.chunkIndex\n\tif len(index) == 0 {\n\t\treturn errors.AEADError(\"Index has length 0\")\n\t}\n\tfor i := len(index) - 1; i >= 0; i-- {\n\t\tif index[i] < 255 {\n\t\t\tindex[i]++\n\t\t\treturn nil\n\t\t}\n\t\tindex[i] = 0\n\t}\n\treturn errors.AEADError(\"cannot further increment index\")\n}\n\n// aeadDecrypter reads and decrypts bytes. It buffers extra decrypted bytes when\n// necessary, similar to aeadEncrypter.\ntype aeadDecrypter struct {\n\taeadCrypter           // Embedded ciphertext opener\n\treader      io.Reader // 'reader' is a partialLengthReader\n\tchunkBytes  []byte\n\tpeekedBytes []byte    // Used to detect last chunk\n\tbuffer      []byte    // Buffered decrypted bytes\n}\n\n// Read decrypts bytes and reads them into dst. It decrypts when necessary and\n// buffers extra decrypted bytes. It returns the number of bytes copied into dst\n// and an error.\nfunc (ar *aeadDecrypter) Read(dst []byte) (n int, err error) {\n\t// Return buffered plaintext bytes from previous calls\n\tif len(ar.buffer) > 0 {\n\t\tn = copy(dst, ar.buffer)\n\t\tar.buffer = ar.buffer[n:]\n\t\treturn\n\t}\n\n\t// Read a chunk\n\ttagLen := ar.aead.Overhead()\n\tcopy(ar.chunkBytes, ar.peekedBytes) // Copy bytes peeked in previous chunk or in initialization\n\tbytesRead, errRead := io.ReadFull(ar.reader, ar.chunkBytes[tagLen:])\n\tif errRead != nil && errRead != io.EOF && errRead != io.ErrUnexpectedEOF {\n\t\treturn 0, errRead\n\t}\n\n\tif bytesRead > 0 {\n\t\tar.peekedBytes = ar.chunkBytes[bytesRead:bytesRead+tagLen]\n\n\t\tdecrypted, errChunk := ar.openChunk(ar.chunkBytes[:bytesRead])\n\t\tif errChunk != nil {\n\t\t\treturn 0, errChunk\n\t\t}\n\n\t\t// Return decrypted bytes, buffering if necessary\n\t\tn = copy(dst, decrypted)\n\t\tar.buffer = decrypted[n:]\n\t\treturn\n\t}\n\n\treturn 0, io.EOF\n}\n\n// Close checks the final authentication tag of the stream.\n// In the future, this function could also be used to wipe the reader\n// and peeked & decrypted bytes, if necessary.\nfunc (ar *aeadDecrypter) Close() (err error) {\n\terrChunk := ar.validateFinalTag(ar.peekedBytes)\n\tif errChunk != nil {\n\t\treturn errChunk\n\t}\n\treturn nil\n}\n\n// openChunk decrypts and checks integrity of an encrypted chunk, returning\n// the underlying plaintext and an error. It accesses peeked bytes from next\n// chunk, to identify the last chunk and decrypt/validate accordingly.\nfunc (ar *aeadDecrypter) openChunk(data []byte) ([]byte, error) {\n\tadata := ar.associatedData\n\tif ar.aeadCrypter.packetTag == packetTypeAEADEncrypted {\n\t\tadata = append(ar.associatedData, ar.chunkIndex...)\n\t}\n\n\tnonce := ar.computeNextNonce()\n\tplainChunk, err := ar.aead.Open(data[:0:len(data)], nonce, data, adata)\n\tif err != nil {\n\t\treturn nil, errors.ErrAEADTagVerification\n\t}\n\tar.bytesProcessed += len(plainChunk)\n\tif err = ar.aeadCrypter.incrementIndex(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn plainChunk, nil\n}\n\n// Checks the summary tag. It takes into account the total decrypted bytes into\n// the associated data. It returns an error, or nil if the tag is valid.\nfunc (ar *aeadDecrypter) validateFinalTag(tag []byte) error {\n\t// Associated: tag, version, cipher, aead, chunk size, ...\n\tamountBytes := make([]byte, 8)\n\tbinary.BigEndian.PutUint64(amountBytes, uint64(ar.bytesProcessed))\n\n\tadata := ar.associatedData\n\tif ar.aeadCrypter.packetTag == packetTypeAEADEncrypted {\n\t\t// ... index ...\n\t\tadata = append(ar.associatedData, ar.chunkIndex...)\n\t}\n\n\t// ... and total number of encrypted octets\n\tadata = append(adata, amountBytes...)\n\tnonce := ar.computeNextNonce()\n\tif _, err := ar.aead.Open(nil, nonce, tag, adata); err != nil {\n\t\treturn errors.ErrAEADTagVerification\n\t}\n\treturn nil\n}\n\n// aeadEncrypter encrypts and writes bytes. It encrypts when necessary according\n// to the AEAD block size, and buffers the extra encrypted bytes for next write.\ntype aeadEncrypter struct {\n\taeadCrypter                // Embedded plaintext sealer\n\twriter      io.WriteCloser // 'writer' is a partialLengthWriter\n\tchunkBytes  []byte\n\toffset      int\n}\n\n// Write encrypts and writes bytes. It encrypts when necessary and buffers extra\n// plaintext bytes for next call. When the stream is finished, Close() MUST be\n// called to append the final tag.\nfunc (aw *aeadEncrypter) Write(plaintextBytes []byte) (n int, err error) {\n\tfor n != len(plaintextBytes) {\n\t\tcopied := copy(aw.chunkBytes[aw.offset:aw.chunkSize], plaintextBytes[n:])\n\t\tn += copied\n\t\taw.offset += copied\n\n\t\tif aw.offset == aw.chunkSize {\n\t\t\tencryptedChunk, err := aw.sealChunk(aw.chunkBytes[:aw.offset])\n\t\t\tif err != nil {\n\t\t\t\treturn n, err\n\t\t\t}\n\t\t\t_, err = aw.writer.Write(encryptedChunk)\n\t\t\tif err != nil {\n\t\t\t\treturn n, err\n\t\t\t}\n\t\t\taw.offset = 0\n\t\t}\n\t}\n\treturn\n}\n\n// Close encrypts and writes the remaining buffered plaintext if any, appends\n// the final authentication tag, and closes the embedded writer. This function\n// MUST be called at the end of a stream.\nfunc (aw *aeadEncrypter) Close() (err error) {\n\t// Encrypt and write a chunk if there's buffered data left, or if we haven't\n\t// written any chunks yet.\n\tif aw.offset > 0 || aw.bytesProcessed == 0 {\n\t\tlastEncryptedChunk, err := aw.sealChunk(aw.chunkBytes[:aw.offset])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = aw.writer.Write(lastEncryptedChunk)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\t// Compute final tag (associated data: packet tag, version, cipher, aead,\n\t// chunk size...\n\tadata := aw.associatedData\n\n\tif aw.aeadCrypter.packetTag == packetTypeAEADEncrypted {\n\t\t// ... index ...\n\t\tadata = append(aw.associatedData, aw.chunkIndex...)\n\t}\n\n\t// ... and total number of encrypted octets\n\tamountBytes := make([]byte, 8)\n\tbinary.BigEndian.PutUint64(amountBytes, uint64(aw.bytesProcessed))\n\tadata = append(adata, amountBytes...)\n\n\tnonce := aw.computeNextNonce()\n\tfinalTag := aw.aead.Seal(nil, nonce, nil, adata)\n\t_, err = aw.writer.Write(finalTag)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn aw.writer.Close()\n}\n\n// sealChunk Encrypts and authenticates the given chunk.\nfunc (aw *aeadEncrypter) sealChunk(data []byte) ([]byte, error) {\n\tif len(data) > aw.chunkSize {\n\t\treturn nil, errors.AEADError(\"chunk exceeds maximum length\")\n\t}\n\tif aw.associatedData == nil {\n\t\treturn nil, errors.AEADError(\"can't seal without headers\")\n\t}\n\tadata := aw.associatedData\n\tif aw.aeadCrypter.packetTag == packetTypeAEADEncrypted {\n\t\tadata = append(aw.associatedData, aw.chunkIndex...)\n\t}\n\n\tnonce := aw.computeNextNonce()\n\tencrypted := aw.aead.Seal(data[:0], nonce, data, adata)\n\taw.bytesProcessed += len(data)\n\tif err := aw.aeadCrypter.incrementIndex(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn encrypted, nil\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_encrypted.go",
    "content": "// Copyright (C) 2019 ProtonTech AG\n\npackage packet\n\nimport (\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/algorithm\"\n)\n\n// AEADEncrypted represents an AEAD Encrypted Packet.\n// See https://www.ietf.org/archive/id/draft-koch-openpgp-2015-rfc4880bis-00.html#name-aead-encrypted-data-packet-t\ntype AEADEncrypted struct {\n\tcipher        CipherFunction\n\tmode          AEADMode\n\tchunkSizeByte byte\n\tContents      io.Reader // Encrypted chunks and tags\n\tinitialNonce  []byte    // Referred to as IV in RFC4880-bis\n}\n\n// Only currently defined version\nconst aeadEncryptedVersion = 1\n\nfunc (ae *AEADEncrypted) parse(buf io.Reader) error {\n\theaderData := make([]byte, 4)\n\tif n, err := io.ReadFull(buf, headerData); n < 4 {\n\t\treturn errors.AEADError(\"could not read aead header:\" + err.Error())\n\t}\n\t// Read initial nonce\n\tmode := AEADMode(headerData[2])\n\tnonceLen := mode.IvLength()\n\n\t// This packet supports only EAX and OCB\n\t// https://www.ietf.org/archive/id/draft-koch-openpgp-2015-rfc4880bis-00.html#name-aead-encrypted-data-packet-t\n\tif nonceLen == 0 || mode > AEADModeOCB {\n\t\treturn errors.AEADError(\"unknown mode\")\n\t}\n\n\tinitialNonce := make([]byte, nonceLen)\n\tif n, err := io.ReadFull(buf, initialNonce); n < nonceLen {\n\t\treturn errors.AEADError(\"could not read aead nonce:\" + err.Error())\n\t}\n\tae.Contents = buf\n\tae.initialNonce = initialNonce\n\tc := headerData[1]\n\tif _, ok := algorithm.CipherById[c]; !ok {\n\t\treturn errors.UnsupportedError(\"unknown cipher: \" + string(c))\n\t}\n\tae.cipher = CipherFunction(c)\n\tae.mode = mode\n\tae.chunkSizeByte = headerData[3]\n\treturn nil\n}\n\n// Decrypt returns a io.ReadCloser from which decrypted bytes can be read, or\n// an error.\nfunc (ae *AEADEncrypted) Decrypt(ciph CipherFunction, key []byte) (io.ReadCloser, error) {\n\treturn ae.decrypt(key)\n}\n\n// decrypt prepares an aeadCrypter and returns a ReadCloser from which\n// decrypted bytes can be read (see aeadDecrypter.Read()).\nfunc (ae *AEADEncrypted) decrypt(key []byte) (io.ReadCloser, error) {\n\tblockCipher := ae.cipher.new(key)\n\taead := ae.mode.new(blockCipher)\n\t// Carry the first tagLen bytes\n\tchunkSize := decodeAEADChunkSize(ae.chunkSizeByte)\n\ttagLen := ae.mode.TagLength()\n\tchunkBytes := make([]byte, chunkSize+tagLen*2)\n\tpeekedBytes := chunkBytes[chunkSize+tagLen:]\n\tn, err := io.ReadFull(ae.Contents, peekedBytes)\n\tif n < tagLen || (err != nil && err != io.EOF) {\n\t\treturn nil, errors.AEADError(\"Not enough data to decrypt:\" + err.Error())\n\t}\n\n\treturn &aeadDecrypter{\n\t\taeadCrypter: aeadCrypter{\n\t\t\taead:           aead,\n\t\t\tchunkSize:      chunkSize,\n\t\t\tnonce:          ae.initialNonce,\n\t\t\tassociatedData: ae.associatedData(),\n\t\t\tchunkIndex:     make([]byte, 8),\n\t\t\tpacketTag:      packetTypeAEADEncrypted,\n\t\t},\n\t\treader:      ae.Contents,\n\t\tchunkBytes:  chunkBytes,\n\t\tpeekedBytes: peekedBytes,\n\t}, nil\n}\n\n// associatedData for chunks: tag, version, cipher, mode, chunk size byte\nfunc (ae *AEADEncrypted) associatedData() []byte {\n\treturn []byte{\n\t\t0xD4,\n\t\taeadEncryptedVersion,\n\t\tbyte(ae.cipher),\n\t\tbyte(ae.mode),\n\t\tae.chunkSizeByte}\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/compressed.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"compress/bzip2\"\n\t\"compress/flate\"\n\t\"compress/zlib\"\n\t\"io\"\n\t\"strconv\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n)\n\n// Compressed represents a compressed OpenPGP packet. The decompressed contents\n// will contain more OpenPGP packets. See RFC 4880, section 5.6.\ntype Compressed struct {\n\tBody io.Reader\n}\n\nconst (\n\tNoCompression      = flate.NoCompression\n\tBestSpeed          = flate.BestSpeed\n\tBestCompression    = flate.BestCompression\n\tDefaultCompression = flate.DefaultCompression\n)\n\n// CompressionConfig contains compressor configuration settings.\ntype CompressionConfig struct {\n\t// Level is the compression level to use. It must be set to\n\t// between -1 and 9, with -1 causing the compressor to use the\n\t// default compression level, 0 causing the compressor to use\n\t// no compression and 1 to 9 representing increasing (better,\n\t// slower) compression levels. If Level is less than -1 or\n\t// more then 9, a non-nil error will be returned during\n\t// encryption. See the constants above for convenient common\n\t// settings for Level.\n\tLevel int\n}\n\n// decompressionReader ensures that the whole compression packet is read.\ntype decompressionReader struct {\n\tcompressed   io.Reader\n\tdecompressed io.ReadCloser\n\treadAll      bool\n}\n\nfunc newDecompressionReader(r io.Reader, decompressor io.ReadCloser) *decompressionReader {\n\treturn &decompressionReader{\n\t\tcompressed:   r,\n\t\tdecompressed: decompressor,\n\t}\n}\n\nfunc (dr *decompressionReader) Read(data []byte) (n int, err error) {\n\tif dr.readAll {\n\t\treturn 0, io.EOF\n\t}\n\tn, err = dr.decompressed.Read(data)\n\tif err == io.EOF {\n\t\tdr.readAll = true\n\t\t// Close the decompressor.\n\t\tif errDec := dr.decompressed.Close(); errDec != nil {\n\t\t\treturn n, errDec\n\t\t}\n\t\t// Consume all remaining data from the compressed packet.\n\t\tconsumeAll(dr.compressed)\n\t}\n\treturn n, err\n}\n\nfunc (c *Compressed) parse(r io.Reader) error {\n\tvar buf [1]byte\n\t_, err := readFull(r, buf[:])\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tswitch buf[0] {\n\tcase 0:\n\t\tc.Body = r\n\tcase 1:\n\t\tc.Body = newDecompressionReader(r, flate.NewReader(r))\n\tcase 2:\n\t\tdecompressor, err := zlib.NewReader(r)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tc.Body = newDecompressionReader(r, decompressor)\n\tcase 3:\n\t\tc.Body = newDecompressionReader(r, io.NopCloser(bzip2.NewReader(r)))\n\tdefault:\n\t\terr = errors.UnsupportedError(\"unknown compression algorithm: \" + strconv.Itoa(int(buf[0])))\n\t}\n\n\treturn err\n}\n\n// compressedWriterCloser represents the serialized compression stream\n// header and the compressor. Its Close() method ensures that both the\n// compressor and serialized stream header are closed. Its Write()\n// method writes to the compressor.\ntype compressedWriteCloser struct {\n\tsh io.Closer      // Stream Header\n\tc  io.WriteCloser // Compressor\n}\n\nfunc (cwc compressedWriteCloser) Write(p []byte) (int, error) {\n\treturn cwc.c.Write(p)\n}\n\nfunc (cwc compressedWriteCloser) Close() (err error) {\n\terr = cwc.c.Close()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn cwc.sh.Close()\n}\n\n// SerializeCompressed serializes a compressed data packet to w and\n// returns a WriteCloser to which the literal data packets themselves\n// can be written and which MUST be closed on completion. If cc is\n// nil, sensible defaults will be used to configure the compression\n// algorithm.\nfunc SerializeCompressed(w io.WriteCloser, algo CompressionAlgo, cc *CompressionConfig) (literaldata io.WriteCloser, err error) {\n\tcompressed, err := serializeStreamHeader(w, packetTypeCompressed)\n\tif err != nil {\n\t\treturn\n\t}\n\n\t_, err = compressed.Write([]byte{uint8(algo)})\n\tif err != nil {\n\t\treturn\n\t}\n\n\tlevel := DefaultCompression\n\tif cc != nil {\n\t\tlevel = cc.Level\n\t}\n\n\tvar compressor io.WriteCloser\n\tswitch algo {\n\tcase CompressionZIP:\n\t\tcompressor, err = flate.NewWriter(compressed, level)\n\tcase CompressionZLIB:\n\t\tcompressor, err = zlib.NewWriterLevel(compressed, level)\n\tdefault:\n\t\ts := strconv.Itoa(int(algo))\n\t\terr = errors.UnsupportedError(\"Unsupported compression algorithm: \" + s)\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\n\tliteraldata = compressedWriteCloser{compressed, compressor}\n\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/config.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"crypto\"\n\t\"crypto/rand\"\n\t\"io\"\n\t\"math/big\"\n\t\"time\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/s2k\"\n)\n\nvar (\n\tdefaultRejectPublicKeyAlgorithms = map[PublicKeyAlgorithm]bool{\n\t\tPubKeyAlgoElGamal: true,\n\t\tPubKeyAlgoDSA:     true,\n\t}\n\tdefaultRejectHashAlgorithms = map[crypto.Hash]bool{\n\t\tcrypto.MD5:       true,\n\t\tcrypto.RIPEMD160: true,\n\t}\n\tdefaultRejectMessageHashAlgorithms = map[crypto.Hash]bool{\n\t\tcrypto.SHA1:      true,\n\t\tcrypto.MD5:       true,\n\t\tcrypto.RIPEMD160: true,\n\t}\n\tdefaultRejectCurves = map[Curve]bool{\n\t\tCurveSecP256k1: true,\n\t}\n)\n\n// A global feature flag to indicate v5 support.\n// Can be set via a build tag, e.g.: `go build -tags v5 ./...`\n// If the build tag is missing config_v5.go will set it to true.\n//\n// Disables parsing of v5 keys and v5 signatures.\n// These are non-standard entities, which in the crypto-refresh have been superseded\n// by v6 keys, v6 signatures and SEIPDv2 encrypted data, respectively.\nvar V5Disabled = false\n\n// Config collects a number of parameters along with sensible defaults.\n// A nil *Config is valid and results in all default values.\ntype Config struct {\n\t// Rand provides the source of entropy.\n\t// If nil, the crypto/rand Reader is used.\n\tRand io.Reader\n\t// DefaultHash is the default hash function to be used.\n\t// If zero, SHA-256 is used.\n\tDefaultHash crypto.Hash\n\t// DefaultCipher is the cipher to be used.\n\t// If zero, AES-128 is used.\n\tDefaultCipher CipherFunction\n\t// Time returns the current time as the number of seconds since the\n\t// epoch. If Time is nil, time.Now is used.\n\tTime func() time.Time\n\t// DefaultCompressionAlgo is the compression algorithm to be\n\t// applied to the plaintext before encryption. If zero, no\n\t// compression is done.\n\tDefaultCompressionAlgo CompressionAlgo\n\t// CompressionConfig configures the compression settings.\n\tCompressionConfig *CompressionConfig\n\t// S2K (String to Key) config, used for key derivation in the context of secret key encryption\n\t// and password-encrypted data.\n\t// If nil, the default configuration is used\n\tS2KConfig *s2k.Config\n\t// Iteration count for Iterated S2K (String to Key).\n\t// Only used if sk2.Mode is nil.\n\t// This value is duplicated here from s2k.Config for backwards compatibility.\n\t// It determines the strength of the passphrase stretching when\n\t// the said passphrase is hashed to produce a key. S2KCount\n\t// should be between 65536 and 65011712, inclusive. If Config\n\t// is nil or S2KCount is 0, the value 16777216 used. Not all\n\t// values in the above range can be represented. S2KCount will\n\t// be rounded up to the next representable value if it cannot\n\t// be encoded exactly. When set, it is strongly encrouraged to\n\t// use a value that is at least 65536. See RFC 4880 Section\n\t// 3.7.1.3.\n\t//\n\t// Deprecated: SK2Count should be configured in S2KConfig instead.\n\tS2KCount int\n\t// RSABits is the number of bits in new RSA keys made with NewEntity.\n\t// If zero, then 2048 bit keys are created.\n\tRSABits int\n\t// The public key algorithm to use - will always create a signing primary\n\t// key and encryption subkey.\n\tAlgorithm PublicKeyAlgorithm\n\t// Some known primes that are optionally prepopulated by the caller\n\tRSAPrimes []*big.Int\n\t// Curve configures the desired packet.Curve if the Algorithm is PubKeyAlgoECDSA,\n\t// PubKeyAlgoEdDSA, or PubKeyAlgoECDH. If empty Curve25519 is used.\n\tCurve Curve\n\t// AEADConfig configures the use of the new AEAD Encrypted Data Packet,\n\t// defined in the draft of the next version of the OpenPGP specification.\n\t// If a non-nil AEADConfig is passed, usage of this packet is enabled. By\n\t// default, it is disabled. See the documentation of AEADConfig for more\n\t// configuration options related to AEAD.\n\t// **Note: using this option may break compatibility with other OpenPGP\n\t// implementations, as well as future versions of this library.**\n\tAEADConfig *AEADConfig\n\t// V6Keys configures version 6 key generation. If false, this package still\n\t// supports version 6 keys, but produces version 4 keys.\n\tV6Keys bool\n\t// Minimum RSA key size allowed for key generation and message signing, verification and encryption.\n\tMinRSABits uint16\n\t// Reject insecure algorithms, only works with v2 api\n\tRejectPublicKeyAlgorithms   map[PublicKeyAlgorithm]bool\n\tRejectHashAlgorithms        map[crypto.Hash]bool\n\tRejectMessageHashAlgorithms map[crypto.Hash]bool\n\tRejectCurves                map[Curve]bool\n\t// \"The validity period of the key.  This is the number of seconds after\n\t// the key creation time that the key expires.  If this is not present\n\t// or has a value of zero, the key never expires.  This is found only on\n\t// a self-signature.\"\"\n\t// https://tools.ietf.org/html/rfc4880#section-5.2.3.6\n\tKeyLifetimeSecs uint32\n\t// \"The validity period of the signature.  This is the number of seconds\n\t// after the signature creation time that the signature expires.  If\n\t// this is not present or has a value of zero, it never expires.\"\n\t// https://tools.ietf.org/html/rfc4880#section-5.2.3.10\n\tSigLifetimeSecs uint32\n\t// SigningKeyId is used to specify the signing key to use (by Key ID).\n\t// By default, the signing key is selected automatically, preferring\n\t// signing subkeys if available.\n\tSigningKeyId uint64\n\t// SigningIdentity is used to specify a user ID (packet Signer's User ID, type 28)\n\t// when producing a generic certification signature onto an existing user ID.\n\t// The identity must be present in the signer Entity.\n\tSigningIdentity string\n\t// InsecureAllowUnauthenticatedMessages controls, whether it is tolerated to read\n\t// encrypted messages without Modification Detection Code (MDC).\n\t// MDC is mandated by the IETF OpenPGP Crypto Refresh draft and has long been implemented\n\t// in most OpenPGP implementations. Messages without MDC are considered unnecessarily\n\t// insecure and should be prevented whenever possible.\n\t// In case one needs to deal with messages from very old OpenPGP implementations, there\n\t// might be no other way than to tolerate the missing MDC. Setting this flag, allows this\n\t// mode of operation. It should be considered a measure of last resort.\n\tInsecureAllowUnauthenticatedMessages bool\n\t// InsecureAllowDecryptionWithSigningKeys allows decryption with keys marked as signing keys in the v2 API.\n\t// This setting is potentially insecure, but it is needed as some libraries\n\t// ignored key flags when selecting a key for encryption.\n\t// Not relevant for the v1 API, as all keys were allowed in decryption.\n\tInsecureAllowDecryptionWithSigningKeys bool\n\t// KnownNotations is a map of Notation Data names to bools, which controls\n\t// the notation names that are allowed to be present in critical Notation Data\n\t// signature subpackets.\n\tKnownNotations map[string]bool\n\t// SignatureNotations is a list of Notations to be added to any signatures.\n\tSignatureNotations []*Notation\n\t// CheckIntendedRecipients controls, whether the OpenPGP Intended Recipient Fingerprint feature\n\t// should be enabled for encryption and decryption.\n\t// (See https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-12.html#name-intended-recipient-fingerpr).\n\t// When the flag is set, encryption produces Intended Recipient Fingerprint signature sub-packets and decryption\n\t// checks whether the key it was encrypted to is one of the included fingerprints in the signature.\n\t// If the flag is disabled, no Intended Recipient Fingerprint sub-packets are created or checked.\n\t// The default behavior, when the config or flag is nil, is to enable the feature.\n\tCheckIntendedRecipients *bool\n\t// CacheSessionKey controls if decryption should return the session key used for decryption.\n\t// If the flag is set, the session key is cached in the message details struct.\n\tCacheSessionKey bool\n\t// CheckPacketSequence is a flag that controls if the pgp message reader should strictly check\n\t// that the packet sequence conforms with the grammar mandated by rfc4880.\n\t// The default behavior, when the config or flag is nil, is to check the packet sequence.\n\tCheckPacketSequence *bool\n\t// NonDeterministicSignaturesViaNotation is a flag to enable randomization of signatures.\n\t// If true, a salt notation is used to randomize signatures generated by v4 and v5 keys\n\t// (v6 signatures are always non-deterministic, by design).\n\t// This protects EdDSA signatures from potentially leaking the secret key in case of faults (i.e. bitflips) which, in principle, could occur\n\t// during the signing computation. It is added to signatures of any algo for simplicity, and as it may also serve as protection in case of\n\t// weaknesses in the hash algo, potentially hindering e.g. some chosen-prefix attacks.\n\t// The default behavior, when the config or flag is nil, is to enable the feature.\n\tNonDeterministicSignaturesViaNotation *bool\n\n\t// InsecureAllowAllKeyFlagsWhenMissing determines how a key without valid key flags is handled.\n\t// When set to true, a key without flags is treated as if all flags are enabled.\n\t// This behavior is consistent with GPG.\n\tInsecureAllowAllKeyFlagsWhenMissing bool\n}\n\nfunc (c *Config) Random() io.Reader {\n\tif c == nil || c.Rand == nil {\n\t\treturn rand.Reader\n\t}\n\treturn c.Rand\n}\n\nfunc (c *Config) Hash() crypto.Hash {\n\tif c == nil || uint(c.DefaultHash) == 0 {\n\t\treturn crypto.SHA256\n\t}\n\treturn c.DefaultHash\n}\n\nfunc (c *Config) Cipher() CipherFunction {\n\tif c == nil || uint8(c.DefaultCipher) == 0 {\n\t\treturn CipherAES128\n\t}\n\treturn c.DefaultCipher\n}\n\nfunc (c *Config) Now() time.Time {\n\tif c == nil || c.Time == nil {\n\t\treturn time.Now().Truncate(time.Second)\n\t}\n\treturn c.Time().Truncate(time.Second)\n}\n\n// KeyLifetime returns the validity period of the key.\nfunc (c *Config) KeyLifetime() uint32 {\n\tif c == nil {\n\t\treturn 0\n\t}\n\treturn c.KeyLifetimeSecs\n}\n\n// SigLifetime returns the validity period of the signature.\nfunc (c *Config) SigLifetime() uint32 {\n\tif c == nil {\n\t\treturn 0\n\t}\n\treturn c.SigLifetimeSecs\n}\n\nfunc (c *Config) Compression() CompressionAlgo {\n\tif c == nil {\n\t\treturn CompressionNone\n\t}\n\treturn c.DefaultCompressionAlgo\n}\n\nfunc (c *Config) RSAModulusBits() int {\n\tif c == nil || c.RSABits == 0 {\n\t\treturn 2048\n\t}\n\treturn c.RSABits\n}\n\nfunc (c *Config) PublicKeyAlgorithm() PublicKeyAlgorithm {\n\tif c == nil || c.Algorithm == 0 {\n\t\treturn PubKeyAlgoRSA\n\t}\n\treturn c.Algorithm\n}\n\nfunc (c *Config) CurveName() Curve {\n\tif c == nil || c.Curve == \"\" {\n\t\treturn Curve25519\n\t}\n\treturn c.Curve\n}\n\n// Deprecated: The hash iterations should now be queried via the S2K() method.\nfunc (c *Config) PasswordHashIterations() int {\n\tif c == nil || c.S2KCount == 0 {\n\t\treturn 0\n\t}\n\treturn c.S2KCount\n}\n\nfunc (c *Config) S2K() *s2k.Config {\n\tif c == nil {\n\t\treturn nil\n\t}\n\t// for backwards compatibility\n\tif c.S2KCount > 0 && c.S2KConfig == nil {\n\t\treturn &s2k.Config{\n\t\t\tS2KCount: c.S2KCount,\n\t\t}\n\t}\n\treturn c.S2KConfig\n}\n\nfunc (c *Config) AEAD() *AEADConfig {\n\tif c == nil {\n\t\treturn nil\n\t}\n\treturn c.AEADConfig\n}\n\nfunc (c *Config) SigningKey() uint64 {\n\tif c == nil {\n\t\treturn 0\n\t}\n\treturn c.SigningKeyId\n}\n\nfunc (c *Config) SigningUserId() string {\n\tif c == nil {\n\t\treturn \"\"\n\t}\n\treturn c.SigningIdentity\n}\n\nfunc (c *Config) AllowUnauthenticatedMessages() bool {\n\tif c == nil {\n\t\treturn false\n\t}\n\treturn c.InsecureAllowUnauthenticatedMessages\n}\n\nfunc (c *Config) AllowDecryptionWithSigningKeys() bool {\n\tif c == nil {\n\t\treturn false\n\t}\n\treturn c.InsecureAllowDecryptionWithSigningKeys\n}\n\nfunc (c *Config) KnownNotation(notationName string) bool {\n\tif c == nil {\n\t\treturn false\n\t}\n\treturn c.KnownNotations[notationName]\n}\n\nfunc (c *Config) Notations() []*Notation {\n\tif c == nil {\n\t\treturn nil\n\t}\n\treturn c.SignatureNotations\n}\n\nfunc (c *Config) V6() bool {\n\tif c == nil {\n\t\treturn false\n\t}\n\treturn c.V6Keys\n}\n\nfunc (c *Config) IntendedRecipients() bool {\n\tif c == nil || c.CheckIntendedRecipients == nil {\n\t\treturn true\n\t}\n\treturn *c.CheckIntendedRecipients\n}\n\nfunc (c *Config) RetrieveSessionKey() bool {\n\tif c == nil {\n\t\treturn false\n\t}\n\treturn c.CacheSessionKey\n}\n\nfunc (c *Config) MinimumRSABits() uint16 {\n\tif c == nil || c.MinRSABits == 0 {\n\t\treturn 2047\n\t}\n\treturn c.MinRSABits\n}\n\nfunc (c *Config) RejectPublicKeyAlgorithm(alg PublicKeyAlgorithm) bool {\n\tvar rejectedAlgorithms map[PublicKeyAlgorithm]bool\n\tif c == nil || c.RejectPublicKeyAlgorithms == nil {\n\t\t// Default\n\t\trejectedAlgorithms = defaultRejectPublicKeyAlgorithms\n\t} else {\n\t\trejectedAlgorithms = c.RejectPublicKeyAlgorithms\n\t}\n\treturn rejectedAlgorithms[alg]\n}\n\nfunc (c *Config) RejectHashAlgorithm(hash crypto.Hash) bool {\n\tvar rejectedAlgorithms map[crypto.Hash]bool\n\tif c == nil || c.RejectHashAlgorithms == nil {\n\t\t// Default\n\t\trejectedAlgorithms = defaultRejectHashAlgorithms\n\t} else {\n\t\trejectedAlgorithms = c.RejectHashAlgorithms\n\t}\n\treturn rejectedAlgorithms[hash]\n}\n\nfunc (c *Config) RejectMessageHashAlgorithm(hash crypto.Hash) bool {\n\tvar rejectedAlgorithms map[crypto.Hash]bool\n\tif c == nil || c.RejectMessageHashAlgorithms == nil {\n\t\t// Default\n\t\trejectedAlgorithms = defaultRejectMessageHashAlgorithms\n\t} else {\n\t\trejectedAlgorithms = c.RejectMessageHashAlgorithms\n\t}\n\treturn rejectedAlgorithms[hash]\n}\n\nfunc (c *Config) RejectCurve(curve Curve) bool {\n\tvar rejectedCurve map[Curve]bool\n\tif c == nil || c.RejectCurves == nil {\n\t\t// Default\n\t\trejectedCurve = defaultRejectCurves\n\t} else {\n\t\trejectedCurve = c.RejectCurves\n\t}\n\treturn rejectedCurve[curve]\n}\n\nfunc (c *Config) StrictPacketSequence() bool {\n\tif c == nil || c.CheckPacketSequence == nil {\n\t\treturn true\n\t}\n\treturn *c.CheckPacketSequence\n}\n\nfunc (c *Config) RandomizeSignaturesViaNotation() bool {\n\tif c == nil || c.NonDeterministicSignaturesViaNotation == nil {\n\t\treturn true\n\t}\n\treturn *c.NonDeterministicSignaturesViaNotation\n}\n\nfunc (c *Config) AllowAllKeyFlagsWhenMissing() bool {\n\tif c == nil {\n\t\treturn false\n\t}\n\treturn c.InsecureAllowAllKeyFlagsWhenMissing\n}\n\n// BoolPointer is a helper function to set a boolean pointer in the Config.\n// e.g., config.CheckPacketSequence = BoolPointer(true)\nfunc BoolPointer(value bool) *bool {\n\treturn &value\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/config_v5.go",
    "content": "//go:build !v5\n\npackage packet\n\nfunc init() {\n\tV5Disabled = true\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/encrypted_key.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"bytes\"\n\t\"crypto\"\n\t\"crypto/rsa\"\n\t\"encoding/binary\"\n\t\"encoding/hex\"\n\t\"io\"\n\t\"math/big\"\n\t\"strconv\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/ecdh\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/elgamal\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/encoding\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/x25519\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/x448\"\n)\n\n// EncryptedKey represents a public-key encrypted session key. See RFC 4880,\n// section 5.1.\ntype EncryptedKey struct {\n\tVersion        int\n\tKeyId          uint64\n\tKeyVersion     int    // v6\n\tKeyFingerprint []byte // v6\n\tAlgo           PublicKeyAlgorithm\n\tCipherFunc     CipherFunction // only valid after a successful Decrypt for a v3 packet\n\tKey            []byte         // only valid after a successful Decrypt\n\n\tencryptedMPI1, encryptedMPI2 encoding.Field\n\tephemeralPublicX25519        *x25519.PublicKey // used for x25519\n\tephemeralPublicX448          *x448.PublicKey   // used for x448\n\tencryptedSession             []byte            // used for x25519 and x448\n}\n\nfunc (e *EncryptedKey) parse(r io.Reader) (err error) {\n\tvar buf [8]byte\n\t_, err = readFull(r, buf[:versionSize])\n\tif err != nil {\n\t\treturn\n\t}\n\te.Version = int(buf[0])\n\tif e.Version != 3 && e.Version != 6 {\n\t\treturn errors.UnsupportedError(\"unknown EncryptedKey version \" + strconv.Itoa(int(buf[0])))\n\t}\n\tif e.Version == 6 {\n\t\t//Read a one-octet size of the following two fields.\n\t\tif _, err = readFull(r, buf[:1]); err != nil {\n\t\t\treturn\n\t\t}\n\t\t// The size may also be zero, and the key version and\n\t\t// fingerprint omitted for an \"anonymous recipient\"\n\t\tif buf[0] != 0 {\n\t\t\t// non-anonymous case\n\t\t\t_, err = readFull(r, buf[:versionSize])\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\te.KeyVersion = int(buf[0])\n\t\t\tif e.KeyVersion != 4 && e.KeyVersion != 6 {\n\t\t\t\treturn errors.UnsupportedError(\"unknown public key version \" + strconv.Itoa(e.KeyVersion))\n\t\t\t}\n\t\t\tvar fingerprint []byte\n\t\t\tif e.KeyVersion == 6 {\n\t\t\t\tfingerprint = make([]byte, fingerprintSizeV6)\n\t\t\t} else if e.KeyVersion == 4 {\n\t\t\t\tfingerprint = make([]byte, fingerprintSize)\n\t\t\t}\n\t\t\t_, err = readFull(r, fingerprint)\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\te.KeyFingerprint = fingerprint\n\t\t\tif e.KeyVersion == 6 {\n\t\t\t\te.KeyId = binary.BigEndian.Uint64(e.KeyFingerprint[:keyIdSize])\n\t\t\t} else if e.KeyVersion == 4 {\n\t\t\t\te.KeyId = binary.BigEndian.Uint64(e.KeyFingerprint[fingerprintSize-keyIdSize : fingerprintSize])\n\t\t\t}\n\t\t}\n\t} else {\n\t\t_, err = readFull(r, buf[:8])\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\te.KeyId = binary.BigEndian.Uint64(buf[:keyIdSize])\n\t}\n\n\t_, err = readFull(r, buf[:1])\n\tif err != nil {\n\t\treturn\n\t}\n\te.Algo = PublicKeyAlgorithm(buf[0])\n\tvar cipherFunction byte\n\tswitch e.Algo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly:\n\t\te.encryptedMPI1 = new(encoding.MPI)\n\t\tif _, err = e.encryptedMPI1.ReadFrom(r); err != nil {\n\t\t\treturn\n\t\t}\n\tcase PubKeyAlgoElGamal:\n\t\te.encryptedMPI1 = new(encoding.MPI)\n\t\tif _, err = e.encryptedMPI1.ReadFrom(r); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\te.encryptedMPI2 = new(encoding.MPI)\n\t\tif _, err = e.encryptedMPI2.ReadFrom(r); err != nil {\n\t\t\treturn\n\t\t}\n\tcase PubKeyAlgoECDH:\n\t\te.encryptedMPI1 = new(encoding.MPI)\n\t\tif _, err = e.encryptedMPI1.ReadFrom(r); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\te.encryptedMPI2 = new(encoding.OID)\n\t\tif _, err = e.encryptedMPI2.ReadFrom(r); err != nil {\n\t\t\treturn\n\t\t}\n\tcase PubKeyAlgoX25519:\n\t\te.ephemeralPublicX25519, e.encryptedSession, cipherFunction, err = x25519.DecodeFields(r, e.Version == 6)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\tcase PubKeyAlgoX448:\n\t\te.ephemeralPublicX448, e.encryptedSession, cipherFunction, err = x448.DecodeFields(r, e.Version == 6)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\tif e.Version < 6 {\n\t\tswitch e.Algo {\n\t\tcase PubKeyAlgoX25519, PubKeyAlgoX448:\n\t\t\te.CipherFunc = CipherFunction(cipherFunction)\n\t\t\t// Check for validiy is in the Decrypt method\n\t\t}\n\t}\n\n\t_, err = consumeAll(r)\n\treturn\n}\n\n// Decrypt decrypts an encrypted session key with the given private key. The\n// private key must have been decrypted first.\n// If config is nil, sensible defaults will be used.\nfunc (e *EncryptedKey) Decrypt(priv *PrivateKey, config *Config) error {\n\tif e.Version < 6 && e.KeyId != 0 && e.KeyId != priv.KeyId {\n\t\treturn errors.InvalidArgumentError(\"cannot decrypt encrypted session key for key id \" + strconv.FormatUint(e.KeyId, 16) + \" with private key id \" + strconv.FormatUint(priv.KeyId, 16))\n\t}\n\tif e.Version == 6 && e.KeyVersion != 0 && !bytes.Equal(e.KeyFingerprint, priv.Fingerprint) {\n\t\treturn errors.InvalidArgumentError(\"cannot decrypt encrypted session key for key fingerprint \" + hex.EncodeToString(e.KeyFingerprint) + \" with private key fingerprint \" + hex.EncodeToString(priv.Fingerprint))\n\t}\n\tif e.Algo != priv.PubKeyAlgo {\n\t\treturn errors.InvalidArgumentError(\"cannot decrypt encrypted session key of type \" + strconv.Itoa(int(e.Algo)) + \" with private key of type \" + strconv.Itoa(int(priv.PubKeyAlgo)))\n\t}\n\tif priv.Dummy() {\n\t\treturn errors.ErrDummyPrivateKey(\"dummy key found\")\n\t}\n\n\tvar err error\n\tvar b []byte\n\n\t// TODO(agl): use session key decryption routines here to avoid\n\t// padding oracle attacks.\n\tswitch priv.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly:\n\t\t// Supports both *rsa.PrivateKey and crypto.Decrypter\n\t\tk := priv.PrivateKey.(crypto.Decrypter)\n\t\tb, err = k.Decrypt(config.Random(), padToKeySize(k.Public().(*rsa.PublicKey), e.encryptedMPI1.Bytes()), nil)\n\tcase PubKeyAlgoElGamal:\n\t\tc1 := new(big.Int).SetBytes(e.encryptedMPI1.Bytes())\n\t\tc2 := new(big.Int).SetBytes(e.encryptedMPI2.Bytes())\n\t\tb, err = elgamal.Decrypt(priv.PrivateKey.(*elgamal.PrivateKey), c1, c2)\n\tcase PubKeyAlgoECDH:\n\t\tvsG := e.encryptedMPI1.Bytes()\n\t\tm := e.encryptedMPI2.Bytes()\n\t\toid := priv.PublicKey.oid.EncodedBytes()\n\t\tfp := priv.PublicKey.Fingerprint[:]\n\t\tif priv.PublicKey.Version == 5 {\n\t\t\t// For v5 the, the fingerprint must be restricted to 20 bytes\n\t\t\tfp = fp[:20]\n\t\t}\n\t\tb, err = ecdh.Decrypt(priv.PrivateKey.(*ecdh.PrivateKey), vsG, m, oid, fp)\n\tcase PubKeyAlgoX25519:\n\t\tb, err = x25519.Decrypt(priv.PrivateKey.(*x25519.PrivateKey), e.ephemeralPublicX25519, e.encryptedSession)\n\tcase PubKeyAlgoX448:\n\t\tb, err = x448.Decrypt(priv.PrivateKey.(*x448.PrivateKey), e.ephemeralPublicX448, e.encryptedSession)\n\tdefault:\n\t\terr = errors.InvalidArgumentError(\"cannot decrypt encrypted session key with private key of type \" + strconv.Itoa(int(priv.PubKeyAlgo)))\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar key []byte\n\tswitch priv.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoElGamal, PubKeyAlgoECDH:\n\t\tkeyOffset := 0\n\t\tif e.Version < 6 {\n\t\t\te.CipherFunc = CipherFunction(b[0])\n\t\t\tkeyOffset = 1\n\t\t\tif !e.CipherFunc.IsSupported() {\n\t\t\t\treturn errors.UnsupportedError(\"unsupported encryption function\")\n\t\t\t}\n\t\t}\n\t\tkey, err = decodeChecksumKey(b[keyOffset:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\tcase PubKeyAlgoX25519, PubKeyAlgoX448:\n\t\tif e.Version < 6 {\n\t\t\tswitch e.CipherFunc {\n\t\t\tcase CipherAES128, CipherAES192, CipherAES256:\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\treturn errors.StructuralError(\"v3 PKESK mandates AES as cipher function for x25519 and x448\")\n\t\t\t}\n\t\t}\n\t\tkey = b[:]\n\tdefault:\n\t\treturn errors.UnsupportedError(\"unsupported algorithm for decryption\")\n\t}\n\te.Key = key\n\treturn nil\n}\n\n// Serialize writes the encrypted key packet, e, to w.\nfunc (e *EncryptedKey) Serialize(w io.Writer) error {\n\tvar encodedLength int\n\tswitch e.Algo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly:\n\t\tencodedLength = int(e.encryptedMPI1.EncodedLength())\n\tcase PubKeyAlgoElGamal:\n\t\tencodedLength = int(e.encryptedMPI1.EncodedLength()) + int(e.encryptedMPI2.EncodedLength())\n\tcase PubKeyAlgoECDH:\n\t\tencodedLength = int(e.encryptedMPI1.EncodedLength()) + int(e.encryptedMPI2.EncodedLength())\n\tcase PubKeyAlgoX25519:\n\t\tencodedLength = x25519.EncodedFieldsLength(e.encryptedSession, e.Version == 6)\n\tcase PubKeyAlgoX448:\n\t\tencodedLength = x448.EncodedFieldsLength(e.encryptedSession, e.Version == 6)\n\tdefault:\n\t\treturn errors.InvalidArgumentError(\"don't know how to serialize encrypted key type \" + strconv.Itoa(int(e.Algo)))\n\t}\n\n\tpacketLen := versionSize /* version */ + keyIdSize /* key id */ + algorithmSize /* algo */ + encodedLength\n\tif e.Version == 6 {\n\t\tpacketLen = versionSize /* version */ + algorithmSize /* algo */ + encodedLength + keyVersionSize /* key version */\n\t\tif e.KeyVersion == 6 {\n\t\t\tpacketLen += fingerprintSizeV6\n\t\t} else if e.KeyVersion == 4 {\n\t\t\tpacketLen += fingerprintSize\n\t\t}\n\t}\n\n\terr := serializeHeader(w, packetTypeEncryptedKey, packetLen)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t_, err = w.Write([]byte{byte(e.Version)})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif e.Version == 6 {\n\t\t_, err = w.Write([]byte{byte(e.KeyVersion)})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// The key version number may also be zero,\n\t\t// and the fingerprint omitted\n\t\tif e.KeyVersion != 0 {\n\t\t\t_, err = w.Write(e.KeyFingerprint)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Write KeyID\n\t\terr = binary.Write(w, binary.BigEndian, e.KeyId)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\t_, err = w.Write([]byte{byte(e.Algo)})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tswitch e.Algo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly:\n\t\t_, err := w.Write(e.encryptedMPI1.EncodedBytes())\n\t\treturn err\n\tcase PubKeyAlgoElGamal:\n\t\tif _, err := w.Write(e.encryptedMPI1.EncodedBytes()); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err := w.Write(e.encryptedMPI2.EncodedBytes())\n\t\treturn err\n\tcase PubKeyAlgoECDH:\n\t\tif _, err := w.Write(e.encryptedMPI1.EncodedBytes()); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err := w.Write(e.encryptedMPI2.EncodedBytes())\n\t\treturn err\n\tcase PubKeyAlgoX25519:\n\t\terr := x25519.EncodeFields(w, e.ephemeralPublicX25519, e.encryptedSession, byte(e.CipherFunc), e.Version == 6)\n\t\treturn err\n\tcase PubKeyAlgoX448:\n\t\terr := x448.EncodeFields(w, e.ephemeralPublicX448, e.encryptedSession, byte(e.CipherFunc), e.Version == 6)\n\t\treturn err\n\tdefault:\n\t\tpanic(\"internal error\")\n\t}\n}\n\n// SerializeEncryptedKeyAEAD serializes an encrypted key packet to w that contains\n// key, encrypted to pub.\n// If aeadSupported is set, PKESK v6 is used, otherwise v3.\n// Note: aeadSupported MUST match the value passed to SerializeSymmetricallyEncrypted.\n// If config is nil, sensible defaults will be used.\nfunc SerializeEncryptedKeyAEAD(w io.Writer, pub *PublicKey, cipherFunc CipherFunction, aeadSupported bool, key []byte, config *Config) error {\n\treturn SerializeEncryptedKeyAEADwithHiddenOption(w, pub, cipherFunc, aeadSupported, key, false, config)\n}\n\n// SerializeEncryptedKeyAEADwithHiddenOption serializes an encrypted key packet to w that contains\n// key, encrypted to pub.\n// Offers the hidden flag option to indicated if the PKESK packet should include a wildcard KeyID.\n// If aeadSupported is set, PKESK v6 is used, otherwise v3.\n// Note: aeadSupported MUST match the value passed to SerializeSymmetricallyEncrypted.\n// If config is nil, sensible defaults will be used.\nfunc SerializeEncryptedKeyAEADwithHiddenOption(w io.Writer, pub *PublicKey, cipherFunc CipherFunction, aeadSupported bool, key []byte, hidden bool, config *Config) error {\n\tvar buf [36]byte // max possible header size is v6\n\tlenHeaderWritten := versionSize\n\tversion := 3\n\n\tif aeadSupported {\n\t\tversion = 6\n\t}\n\t// An implementation MUST NOT generate ElGamal v6 PKESKs.\n\tif version == 6 && pub.PubKeyAlgo == PubKeyAlgoElGamal {\n\t\treturn errors.InvalidArgumentError(\"ElGamal v6 PKESK are not allowed\")\n\t}\n\t// In v3 PKESKs, for x25519 and x448, mandate using AES\n\tif version == 3 && (pub.PubKeyAlgo == PubKeyAlgoX25519 || pub.PubKeyAlgo == PubKeyAlgoX448) {\n\t\tswitch cipherFunc {\n\t\tcase CipherAES128, CipherAES192, CipherAES256:\n\t\t\tbreak\n\t\tdefault:\n\t\t\treturn errors.InvalidArgumentError(\"v3 PKESK mandates AES for x25519 and x448\")\n\t\t}\n\t}\n\n\tbuf[0] = byte(version)\n\n\t// If hidden is set, the key should be hidden\n\t// An implementation MAY accept or use a Key ID of all zeros,\n\t// or a key version of zero and no key fingerprint, to hide the intended decryption key.\n\t// See Section 5.1.8. in the open pgp crypto refresh\n\tif version == 6 {\n\t\tif !hidden {\n\t\t\t// A one-octet size of the following two fields.\n\t\t\tbuf[1] = byte(keyVersionSize + len(pub.Fingerprint))\n\t\t\t// A one octet key version number.\n\t\t\tbuf[2] = byte(pub.Version)\n\t\t\tlenHeaderWritten += keyVersionSize + 1\n\t\t\t// The fingerprint of the public key\n\t\t\tcopy(buf[lenHeaderWritten:lenHeaderWritten+len(pub.Fingerprint)], pub.Fingerprint)\n\t\t\tlenHeaderWritten += len(pub.Fingerprint)\n\t\t} else {\n\t\t\t// The size may also be zero, and the key version\n\t\t\t// and fingerprint omitted for an \"anonymous recipient\"\n\t\t\tbuf[1] = 0\n\t\t\tlenHeaderWritten += 1\n\t\t}\n\t} else {\n\t\tif !hidden {\n\t\t\tbinary.BigEndian.PutUint64(buf[versionSize:(versionSize+keyIdSize)], pub.KeyId)\n\t\t}\n\t\tlenHeaderWritten += keyIdSize\n\t}\n\tbuf[lenHeaderWritten] = byte(pub.PubKeyAlgo)\n\tlenHeaderWritten += algorithmSize\n\n\tvar keyBlock []byte\n\tswitch pub.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoElGamal, PubKeyAlgoECDH:\n\t\tlenKeyBlock := len(key) + 2\n\t\tif version < 6 {\n\t\t\tlenKeyBlock += 1 // cipher type included\n\t\t}\n\t\tkeyBlock = make([]byte, lenKeyBlock)\n\t\tkeyOffset := 0\n\t\tif version < 6 {\n\t\t\tkeyBlock[0] = byte(cipherFunc)\n\t\t\tkeyOffset = 1\n\t\t}\n\t\tencodeChecksumKey(keyBlock[keyOffset:], key)\n\tcase PubKeyAlgoX25519, PubKeyAlgoX448:\n\t\t// algorithm is added in plaintext below\n\t\tkeyBlock = key\n\t}\n\n\tswitch pub.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly:\n\t\treturn serializeEncryptedKeyRSA(w, config.Random(), buf[:lenHeaderWritten], pub.PublicKey.(*rsa.PublicKey), keyBlock)\n\tcase PubKeyAlgoElGamal:\n\t\treturn serializeEncryptedKeyElGamal(w, config.Random(), buf[:lenHeaderWritten], pub.PublicKey.(*elgamal.PublicKey), keyBlock)\n\tcase PubKeyAlgoECDH:\n\t\treturn serializeEncryptedKeyECDH(w, config.Random(), buf[:lenHeaderWritten], pub.PublicKey.(*ecdh.PublicKey), keyBlock, pub.oid, pub.Fingerprint)\n\tcase PubKeyAlgoX25519:\n\t\treturn serializeEncryptedKeyX25519(w, config.Random(), buf[:lenHeaderWritten], pub.PublicKey.(*x25519.PublicKey), keyBlock, byte(cipherFunc), version)\n\tcase PubKeyAlgoX448:\n\t\treturn serializeEncryptedKeyX448(w, config.Random(), buf[:lenHeaderWritten], pub.PublicKey.(*x448.PublicKey), keyBlock, byte(cipherFunc), version)\n\tcase PubKeyAlgoDSA, PubKeyAlgoRSASignOnly:\n\t\treturn errors.InvalidArgumentError(\"cannot encrypt to public key of type \" + strconv.Itoa(int(pub.PubKeyAlgo)))\n\t}\n\n\treturn errors.UnsupportedError(\"encrypting a key to public key of type \" + strconv.Itoa(int(pub.PubKeyAlgo)))\n}\n\n// SerializeEncryptedKey serializes an encrypted key packet to w that contains\n// key, encrypted to pub.\n// PKESKv6 is used if config.AEAD() is not nil.\n// If config is nil, sensible defaults will be used.\n// Deprecated: Use SerializeEncryptedKeyAEAD instead.\nfunc SerializeEncryptedKey(w io.Writer, pub *PublicKey, cipherFunc CipherFunction, key []byte, config *Config) error {\n\treturn SerializeEncryptedKeyAEAD(w, pub, cipherFunc, config.AEAD() != nil, key, config)\n}\n\n// SerializeEncryptedKeyWithHiddenOption serializes an encrypted key packet to w that contains\n// key, encrypted to pub. PKESKv6 is used if config.AEAD() is not nil.\n// The hidden option controls if the packet should be anonymous, i.e., omit key metadata.\n// If config is nil, sensible defaults will be used.\n// Deprecated: Use SerializeEncryptedKeyAEADwithHiddenOption instead.\nfunc SerializeEncryptedKeyWithHiddenOption(w io.Writer, pub *PublicKey, cipherFunc CipherFunction, key []byte, hidden bool, config *Config) error {\n\treturn SerializeEncryptedKeyAEADwithHiddenOption(w, pub, cipherFunc, config.AEAD() != nil, key, hidden, config)\n}\n\nfunc serializeEncryptedKeyRSA(w io.Writer, rand io.Reader, header []byte, pub *rsa.PublicKey, keyBlock []byte) error {\n\tcipherText, err := rsa.EncryptPKCS1v15(rand, pub, keyBlock)\n\tif err != nil {\n\t\treturn errors.InvalidArgumentError(\"RSA encryption failed: \" + err.Error())\n\t}\n\n\tcipherMPI := encoding.NewMPI(cipherText)\n\tpacketLen := len(header) /* header length */ + int(cipherMPI.EncodedLength())\n\n\terr = serializeHeader(w, packetTypeEncryptedKey, packetLen)\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, err = w.Write(header[:])\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, err = w.Write(cipherMPI.EncodedBytes())\n\treturn err\n}\n\nfunc serializeEncryptedKeyElGamal(w io.Writer, rand io.Reader, header []byte, pub *elgamal.PublicKey, keyBlock []byte) error {\n\tc1, c2, err := elgamal.Encrypt(rand, pub, keyBlock)\n\tif err != nil {\n\t\treturn errors.InvalidArgumentError(\"ElGamal encryption failed: \" + err.Error())\n\t}\n\n\tpacketLen := len(header) /* header length */\n\tpacketLen += 2 /* mpi size */ + (c1.BitLen()+7)/8\n\tpacketLen += 2 /* mpi size */ + (c2.BitLen()+7)/8\n\n\terr = serializeHeader(w, packetTypeEncryptedKey, packetLen)\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, err = w.Write(header[:])\n\tif err != nil {\n\t\treturn err\n\t}\n\tif _, err = w.Write(new(encoding.MPI).SetBig(c1).EncodedBytes()); err != nil {\n\t\treturn err\n\t}\n\t_, err = w.Write(new(encoding.MPI).SetBig(c2).EncodedBytes())\n\treturn err\n}\n\nfunc serializeEncryptedKeyECDH(w io.Writer, rand io.Reader, header []byte, pub *ecdh.PublicKey, keyBlock []byte, oid encoding.Field, fingerprint []byte) error {\n\tvsG, c, err := ecdh.Encrypt(rand, pub, keyBlock, oid.EncodedBytes(), fingerprint)\n\tif err != nil {\n\t\treturn errors.InvalidArgumentError(\"ECDH encryption failed: \" + err.Error())\n\t}\n\n\tg := encoding.NewMPI(vsG)\n\tm := encoding.NewOID(c)\n\n\tpacketLen := len(header) /* header length */\n\tpacketLen += int(g.EncodedLength()) + int(m.EncodedLength())\n\n\terr = serializeHeader(w, packetTypeEncryptedKey, packetLen)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t_, err = w.Write(header[:])\n\tif err != nil {\n\t\treturn err\n\t}\n\tif _, err = w.Write(g.EncodedBytes()); err != nil {\n\t\treturn err\n\t}\n\t_, err = w.Write(m.EncodedBytes())\n\treturn err\n}\n\nfunc serializeEncryptedKeyX25519(w io.Writer, rand io.Reader, header []byte, pub *x25519.PublicKey, keyBlock []byte, cipherFunc byte, version int) error {\n\tephemeralPublicX25519, ciphertext, err := x25519.Encrypt(rand, pub, keyBlock)\n\tif err != nil {\n\t\treturn errors.InvalidArgumentError(\"x25519 encryption failed: \" + err.Error())\n\t}\n\n\tpacketLen := len(header) /* header length */\n\tpacketLen += x25519.EncodedFieldsLength(ciphertext, version == 6)\n\n\terr = serializeHeader(w, packetTypeEncryptedKey, packetLen)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t_, err = w.Write(header[:])\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn x25519.EncodeFields(w, ephemeralPublicX25519, ciphertext, cipherFunc, version == 6)\n}\n\nfunc serializeEncryptedKeyX448(w io.Writer, rand io.Reader, header []byte, pub *x448.PublicKey, keyBlock []byte, cipherFunc byte, version int) error {\n\tephemeralPublicX448, ciphertext, err := x448.Encrypt(rand, pub, keyBlock)\n\tif err != nil {\n\t\treturn errors.InvalidArgumentError(\"x448 encryption failed: \" + err.Error())\n\t}\n\n\tpacketLen := len(header) /* header length */\n\tpacketLen += x448.EncodedFieldsLength(ciphertext, version == 6)\n\n\terr = serializeHeader(w, packetTypeEncryptedKey, packetLen)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t_, err = w.Write(header[:])\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn x448.EncodeFields(w, ephemeralPublicX448, ciphertext, cipherFunc, version == 6)\n}\n\nfunc checksumKeyMaterial(key []byte) uint16 {\n\tvar checksum uint16\n\tfor _, v := range key {\n\t\tchecksum += uint16(v)\n\t}\n\treturn checksum\n}\n\nfunc decodeChecksumKey(msg []byte) (key []byte, err error) {\n\tkey = msg[:len(msg)-2]\n\texpectedChecksum := uint16(msg[len(msg)-2])<<8 | uint16(msg[len(msg)-1])\n\tchecksum := checksumKeyMaterial(key)\n\tif checksum != expectedChecksum {\n\t\terr = errors.StructuralError(\"session key checksum is incorrect\")\n\t}\n\treturn\n}\n\nfunc encodeChecksumKey(buffer []byte, key []byte) {\n\tcopy(buffer, key)\n\tchecksum := checksumKeyMaterial(key)\n\tbuffer[len(key)] = byte(checksum >> 8)\n\tbuffer[len(key)+1] = byte(checksum)\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/literal.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"encoding/binary\"\n\t\"io\"\n)\n\n// LiteralData represents an encrypted file. See RFC 4880, section 5.9.\ntype LiteralData struct {\n\tFormat   uint8\n\tIsBinary bool\n\tFileName string\n\tTime     uint32 // Unix epoch time. Either creation time or modification time. 0 means undefined.\n\tBody     io.Reader\n}\n\n// ForEyesOnly returns whether the contents of the LiteralData have been marked\n// as especially sensitive.\nfunc (l *LiteralData) ForEyesOnly() bool {\n\treturn l.FileName == \"_CONSOLE\"\n}\n\nfunc (l *LiteralData) parse(r io.Reader) (err error) {\n\tvar buf [256]byte\n\n\t_, err = readFull(r, buf[:2])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tl.Format = buf[0]\n\tl.IsBinary = l.Format == 'b'\n\tfileNameLen := int(buf[1])\n\n\t_, err = readFull(r, buf[:fileNameLen])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tl.FileName = string(buf[:fileNameLen])\n\n\t_, err = readFull(r, buf[:4])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tl.Time = binary.BigEndian.Uint32(buf[:4])\n\tl.Body = r\n\treturn\n}\n\n// SerializeLiteral serializes a literal data packet to w and returns a\n// WriteCloser to which the data itself can be written and which MUST be closed\n// on completion. The fileName is truncated to 255 bytes.\nfunc SerializeLiteral(w io.WriteCloser, isBinary bool, fileName string, time uint32) (plaintext io.WriteCloser, err error) {\n\tvar buf [4]byte\n\tbuf[0] = 'b'\n\tif !isBinary {\n\t\tbuf[0] = 'u'\n\t}\n\tif len(fileName) > 255 {\n\t\tfileName = fileName[:255]\n\t}\n\tbuf[1] = byte(len(fileName))\n\n\tinner, err := serializeStreamHeader(w, packetTypeLiteralData)\n\tif err != nil {\n\t\treturn\n\t}\n\n\t_, err = inner.Write(buf[:2])\n\tif err != nil {\n\t\treturn\n\t}\n\t_, err = inner.Write([]byte(fileName))\n\tif err != nil {\n\t\treturn\n\t}\n\tbinary.BigEndian.PutUint32(buf[:], time)\n\t_, err = inner.Write(buf[:])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tplaintext = inner\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/marker.go",
    "content": "package packet\n\nimport (\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n)\n\ntype Marker struct{}\n\nconst markerString = \"PGP\"\n\n// parse just checks if the packet contains \"PGP\".\nfunc (m *Marker) parse(reader io.Reader) error {\n\tvar buffer [3]byte\n\tif _, err := io.ReadFull(reader, buffer[:]); err != nil {\n\t\treturn err\n\t}\n\tif string(buffer[:]) != markerString {\n\t\treturn errors.StructuralError(\"invalid marker packet\")\n\t}\n\treturn nil\n}\n\n// SerializeMarker writes a marker packet to writer.\nfunc SerializeMarker(writer io.Writer) error {\n\terr := serializeHeader(writer, packetTypeMarker, len(markerString))\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, err = writer.Write([]byte(markerString))\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/notation.go",
    "content": "package packet\n\n// Notation type represents a Notation Data subpacket\n// see https://tools.ietf.org/html/rfc4880#section-5.2.3.16\ntype Notation struct {\n\tName            string\n\tValue           []byte\n\tIsCritical      bool\n\tIsHumanReadable bool\n}\n\nfunc (notation *Notation) getData() []byte {\n\tnameData := []byte(notation.Name)\n\tnameLen := len(nameData)\n\tvalueLen := len(notation.Value)\n\n\tdata := make([]byte, 8+nameLen+valueLen)\n\tif notation.IsHumanReadable {\n\t\tdata[0] = 0x80\n\t}\n\n\tdata[4] = byte(nameLen >> 8)\n\tdata[5] = byte(nameLen)\n\tdata[6] = byte(valueLen >> 8)\n\tdata[7] = byte(valueLen)\n\tcopy(data[8:8+nameLen], nameData)\n\tcopy(data[8+nameLen:], notation.Value)\n\treturn data\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/ocfb.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// OpenPGP CFB Mode. http://tools.ietf.org/html/rfc4880#section-13.9\n\npackage packet\n\nimport (\n\t\"crypto/cipher\"\n)\n\ntype ocfbEncrypter struct {\n\tb       cipher.Block\n\tfre     []byte\n\toutUsed int\n}\n\n// An OCFBResyncOption determines if the \"resynchronization step\" of OCFB is\n// performed.\ntype OCFBResyncOption bool\n\nconst (\n\tOCFBResync   OCFBResyncOption = true\n\tOCFBNoResync OCFBResyncOption = false\n)\n\n// NewOCFBEncrypter returns a cipher.Stream which encrypts data with OpenPGP's\n// cipher feedback mode using the given cipher.Block, and an initial amount of\n// ciphertext.  randData must be random bytes and be the same length as the\n// cipher.Block's block size. Resync determines if the \"resynchronization step\"\n// from RFC 4880, 13.9 step 7 is performed. Different parts of OpenPGP vary on\n// this point.\nfunc NewOCFBEncrypter(block cipher.Block, randData []byte, resync OCFBResyncOption) (cipher.Stream, []byte) {\n\tblockSize := block.BlockSize()\n\tif len(randData) != blockSize {\n\t\treturn nil, nil\n\t}\n\n\tx := &ocfbEncrypter{\n\t\tb:       block,\n\t\tfre:     make([]byte, blockSize),\n\t\toutUsed: 0,\n\t}\n\tprefix := make([]byte, blockSize+2)\n\n\tblock.Encrypt(x.fre, x.fre)\n\tfor i := 0; i < blockSize; i++ {\n\t\tprefix[i] = randData[i] ^ x.fre[i]\n\t}\n\n\tblock.Encrypt(x.fre, prefix[:blockSize])\n\tprefix[blockSize] = x.fre[0] ^ randData[blockSize-2]\n\tprefix[blockSize+1] = x.fre[1] ^ randData[blockSize-1]\n\n\tif resync {\n\t\tblock.Encrypt(x.fre, prefix[2:])\n\t} else {\n\t\tx.fre[0] = prefix[blockSize]\n\t\tx.fre[1] = prefix[blockSize+1]\n\t\tx.outUsed = 2\n\t}\n\treturn x, prefix\n}\n\nfunc (x *ocfbEncrypter) XORKeyStream(dst, src []byte) {\n\tfor i := 0; i < len(src); i++ {\n\t\tif x.outUsed == len(x.fre) {\n\t\t\tx.b.Encrypt(x.fre, x.fre)\n\t\t\tx.outUsed = 0\n\t\t}\n\n\t\tx.fre[x.outUsed] ^= src[i]\n\t\tdst[i] = x.fre[x.outUsed]\n\t\tx.outUsed++\n\t}\n}\n\ntype ocfbDecrypter struct {\n\tb       cipher.Block\n\tfre     []byte\n\toutUsed int\n}\n\n// NewOCFBDecrypter returns a cipher.Stream which decrypts data with OpenPGP's\n// cipher feedback mode using the given cipher.Block. Prefix must be the first\n// blockSize + 2 bytes of the ciphertext, where blockSize is the cipher.Block's\n// block size. On successful exit, blockSize+2 bytes of decrypted data are written into\n// prefix. Resync determines if the \"resynchronization step\" from RFC 4880,\n// 13.9 step 7 is performed. Different parts of OpenPGP vary on this point.\nfunc NewOCFBDecrypter(block cipher.Block, prefix []byte, resync OCFBResyncOption) cipher.Stream {\n\tblockSize := block.BlockSize()\n\tif len(prefix) != blockSize+2 {\n\t\treturn nil\n\t}\n\n\tx := &ocfbDecrypter{\n\t\tb:       block,\n\t\tfre:     make([]byte, blockSize),\n\t\toutUsed: 0,\n\t}\n\tprefixCopy := make([]byte, len(prefix))\n\tcopy(prefixCopy, prefix)\n\n\tblock.Encrypt(x.fre, x.fre)\n\tfor i := 0; i < blockSize; i++ {\n\t\tprefixCopy[i] ^= x.fre[i]\n\t}\n\n\tblock.Encrypt(x.fre, prefix[:blockSize])\n\tprefixCopy[blockSize] ^= x.fre[0]\n\tprefixCopy[blockSize+1] ^= x.fre[1]\n\n\tif resync {\n\t\tblock.Encrypt(x.fre, prefix[2:])\n\t} else {\n\t\tx.fre[0] = prefix[blockSize]\n\t\tx.fre[1] = prefix[blockSize+1]\n\t\tx.outUsed = 2\n\t}\n\tcopy(prefix, prefixCopy)\n\treturn x\n}\n\nfunc (x *ocfbDecrypter) XORKeyStream(dst, src []byte) {\n\tfor i := 0; i < len(src); i++ {\n\t\tif x.outUsed == len(x.fre) {\n\t\t\tx.b.Encrypt(x.fre, x.fre)\n\t\t\tx.outUsed = 0\n\t\t}\n\n\t\tc := src[i]\n\t\tdst[i] = x.fre[x.outUsed] ^ src[i]\n\t\tx.fre[x.outUsed] = c\n\t\tx.outUsed++\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/one_pass_signature.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"crypto\"\n\t\"encoding/binary\"\n\t\"io\"\n\t\"strconv\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/algorithm\"\n)\n\n// OnePassSignature represents a one-pass signature packet. See RFC 4880,\n// section 5.4.\ntype OnePassSignature struct {\n\tVersion        int\n\tSigType        SignatureType\n\tHash           crypto.Hash\n\tPubKeyAlgo     PublicKeyAlgorithm\n\tKeyId          uint64\n\tIsLast         bool\n\tSalt           []byte // v6 only\n\tKeyFingerprint []byte // v6 only\n}\n\nfunc (ops *OnePassSignature) parse(r io.Reader) (err error) {\n\tvar buf [8]byte\n\t// Read: version | signature type | hash algorithm | public-key algorithm\n\t_, err = readFull(r, buf[:4])\n\tif err != nil {\n\t\treturn\n\t}\n\tif buf[0] != 3 && buf[0] != 6 {\n\t\treturn errors.UnsupportedError(\"one-pass-signature packet version \" + strconv.Itoa(int(buf[0])))\n\t}\n\tops.Version = int(buf[0])\n\n\tvar ok bool\n\tops.Hash, ok = algorithm.HashIdToHashWithSha1(buf[2])\n\tif !ok {\n\t\treturn errors.UnsupportedError(\"hash function: \" + strconv.Itoa(int(buf[2])))\n\t}\n\n\tops.SigType = SignatureType(buf[1])\n\tops.PubKeyAlgo = PublicKeyAlgorithm(buf[3])\n\n\tif ops.Version == 6 {\n\t\t// Only for v6, a variable-length field containing the salt\n\t\t_, err = readFull(r, buf[:1])\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tsaltLength := int(buf[0])\n\t\tvar expectedSaltLength int\n\t\texpectedSaltLength, err = SaltLengthForHash(ops.Hash)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tif saltLength != expectedSaltLength {\n\t\t\terr = errors.StructuralError(\"unexpected salt size for the given hash algorithm\")\n\t\t\treturn\n\t\t}\n\t\tsalt := make([]byte, expectedSaltLength)\n\t\t_, err = readFull(r, salt)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tops.Salt = salt\n\n\t\t// Only for v6 packets, 32 octets of the fingerprint of the signing key.\n\t\tfingerprint := make([]byte, 32)\n\t\t_, err = readFull(r, fingerprint)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tops.KeyFingerprint = fingerprint\n\t\tops.KeyId = binary.BigEndian.Uint64(ops.KeyFingerprint[:8])\n\t} else {\n\t\t_, err = readFull(r, buf[:8])\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tops.KeyId = binary.BigEndian.Uint64(buf[:8])\n\t}\n\n\t_, err = readFull(r, buf[:1])\n\tif err != nil {\n\t\treturn\n\t}\n\tops.IsLast = buf[0] != 0\n\treturn\n}\n\n// Serialize marshals the given OnePassSignature to w.\nfunc (ops *OnePassSignature) Serialize(w io.Writer) error {\n\t//v3 length 1+1+1+1+8+1 =\n\tpacketLength := 13\n\tif ops.Version == 6 {\n\t\t// v6 length 1+1+1+1+1+len(salt)+32+1 =\n\t\tpacketLength = 38 + len(ops.Salt)\n\t}\n\n\tif err := serializeHeader(w, packetTypeOnePassSignature, packetLength); err != nil {\n\t\treturn err\n\t}\n\n\tvar buf [8]byte\n\tbuf[0] = byte(ops.Version)\n\tbuf[1] = uint8(ops.SigType)\n\tvar ok bool\n\tbuf[2], ok = algorithm.HashToHashIdWithSha1(ops.Hash)\n\tif !ok {\n\t\treturn errors.UnsupportedError(\"hash type: \" + strconv.Itoa(int(ops.Hash)))\n\t}\n\tbuf[3] = uint8(ops.PubKeyAlgo)\n\n\t_, err := w.Write(buf[:4])\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif ops.Version == 6 {\n\t\t// write salt for v6 signatures\n\t\t_, err := w.Write([]byte{uint8(len(ops.Salt))})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = w.Write(ops.Salt)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// write fingerprint v6 signatures\n\t\t_, err = w.Write(ops.KeyFingerprint)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\tbinary.BigEndian.PutUint64(buf[:8], ops.KeyId)\n\t\t_, err := w.Write(buf[:8])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tisLast := []byte{byte(0)}\n\tif ops.IsLast {\n\t\tisLast[0] = 1\n\t}\n\n\t_, err = w.Write(isLast)\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/opaque.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n)\n\n// OpaquePacket represents an OpenPGP packet as raw, unparsed data. This is\n// useful for splitting and storing the original packet contents separately,\n// handling unsupported packet types or accessing parts of the packet not yet\n// implemented by this package.\ntype OpaquePacket struct {\n\t// Packet type\n\tTag uint8\n\t// Reason why the packet was parsed opaquely\n\tReason error\n\t// Binary contents of the packet data\n\tContents []byte\n}\n\nfunc (op *OpaquePacket) parse(r io.Reader) (err error) {\n\top.Contents, err = io.ReadAll(r)\n\treturn\n}\n\n// Serialize marshals the packet to a writer in its original form, including\n// the packet header.\nfunc (op *OpaquePacket) Serialize(w io.Writer) (err error) {\n\terr = serializeHeader(w, packetType(op.Tag), len(op.Contents))\n\tif err == nil {\n\t\t_, err = w.Write(op.Contents)\n\t}\n\treturn\n}\n\n// Parse attempts to parse the opaque contents into a structure supported by\n// this package. If the packet is not known then the result will be another\n// OpaquePacket.\nfunc (op *OpaquePacket) Parse() (p Packet, err error) {\n\thdr := bytes.NewBuffer(nil)\n\terr = serializeHeader(hdr, packetType(op.Tag), len(op.Contents))\n\tif err != nil {\n\t\top.Reason = err\n\t\treturn op, err\n\t}\n\tp, err = Read(io.MultiReader(hdr, bytes.NewBuffer(op.Contents)))\n\tif err != nil {\n\t\top.Reason = err\n\t\tp = op\n\t}\n\treturn\n}\n\n// OpaqueReader reads OpaquePackets from an io.Reader.\ntype OpaqueReader struct {\n\tr io.Reader\n}\n\nfunc NewOpaqueReader(r io.Reader) *OpaqueReader {\n\treturn &OpaqueReader{r: r}\n}\n\n// Read the next OpaquePacket.\nfunc (or *OpaqueReader) Next() (op *OpaquePacket, err error) {\n\ttag, _, contents, err := readHeader(or.r)\n\tif err != nil {\n\t\treturn\n\t}\n\top = &OpaquePacket{Tag: uint8(tag), Reason: err}\n\terr = op.parse(contents)\n\tif err != nil {\n\t\tconsumeAll(contents)\n\t}\n\treturn\n}\n\n// OpaqueSubpacket represents an unparsed OpenPGP subpacket,\n// as found in signature and user attribute packets.\ntype OpaqueSubpacket struct {\n\tSubType       uint8\n\tEncodedLength []byte // Store the original encoded length for signature verifications.\n\tContents      []byte\n}\n\n// OpaqueSubpackets extracts opaque, unparsed OpenPGP subpackets from\n// their byte representation.\nfunc OpaqueSubpackets(contents []byte) (result []*OpaqueSubpacket, err error) {\n\tvar (\n\t\tsubHeaderLen int\n\t\tsubPacket    *OpaqueSubpacket\n\t)\n\tfor len(contents) > 0 {\n\t\tsubHeaderLen, subPacket, err = nextSubpacket(contents)\n\t\tif err != nil {\n\t\t\tbreak\n\t\t}\n\t\tresult = append(result, subPacket)\n\t\tcontents = contents[subHeaderLen+len(subPacket.Contents):]\n\t}\n\treturn\n}\n\nfunc nextSubpacket(contents []byte) (subHeaderLen int, subPacket *OpaqueSubpacket, err error) {\n\t// RFC 4880, section 5.2.3.1\n\tvar subLen uint32\n\tvar encodedLength []byte\n\tif len(contents) < 1 {\n\t\tgoto Truncated\n\t}\n\tsubPacket = &OpaqueSubpacket{}\n\tswitch {\n\tcase contents[0] < 192:\n\t\tsubHeaderLen = 2 // 1 length byte, 1 subtype byte\n\t\tif len(contents) < subHeaderLen {\n\t\t\tgoto Truncated\n\t\t}\n\t\tencodedLength = contents[0:1]\n\t\tsubLen = uint32(contents[0])\n\t\tcontents = contents[1:]\n\tcase contents[0] < 255:\n\t\tsubHeaderLen = 3 // 2 length bytes, 1 subtype\n\t\tif len(contents) < subHeaderLen {\n\t\t\tgoto Truncated\n\t\t}\n\t\tencodedLength = contents[0:2]\n\t\tsubLen = uint32(contents[0]-192)<<8 + uint32(contents[1]) + 192\n\t\tcontents = contents[2:]\n\tdefault:\n\t\tsubHeaderLen = 6 // 5 length bytes, 1 subtype\n\t\tif len(contents) < subHeaderLen {\n\t\t\tgoto Truncated\n\t\t}\n\t\tencodedLength = contents[0:5]\n\t\tsubLen = uint32(contents[1])<<24 |\n\t\t\tuint32(contents[2])<<16 |\n\t\t\tuint32(contents[3])<<8 |\n\t\t\tuint32(contents[4])\n\t\tcontents = contents[5:]\n\n\t}\n\tif subLen > uint32(len(contents)) || subLen == 0 {\n\t\tgoto Truncated\n\t}\n\tsubPacket.SubType = contents[0]\n\tsubPacket.EncodedLength = encodedLength\n\tsubPacket.Contents = contents[1:subLen]\n\treturn\nTruncated:\n\terr = errors.StructuralError(\"subpacket truncated\")\n\treturn\n}\n\nfunc (osp *OpaqueSubpacket) Serialize(w io.Writer) (err error) {\n\tbuf := make([]byte, 6)\n\tcopy(buf, osp.EncodedLength)\n\tn := len(osp.EncodedLength)\n\n\tbuf[n] = osp.SubType\n\tif _, err = w.Write(buf[:n+1]); err != nil {\n\t\treturn\n\t}\n\t_, err = w.Write(osp.Contents)\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/packet.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package packet implements parsing and serialization of OpenPGP packets, as\n// specified in RFC 4880.\npackage packet // import \"github.com/ProtonMail/go-crypto/openpgp/packet\"\n\nimport (\n\t\"bytes\"\n\t\"crypto/cipher\"\n\t\"crypto/rsa\"\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/algorithm\"\n)\n\n// readFull is the same as io.ReadFull except that reading zero bytes returns\n// ErrUnexpectedEOF rather than EOF.\nfunc readFull(r io.Reader, buf []byte) (n int, err error) {\n\tn, err = io.ReadFull(r, buf)\n\tif err == io.EOF {\n\t\terr = io.ErrUnexpectedEOF\n\t}\n\treturn\n}\n\n// readLength reads an OpenPGP length from r. See RFC 4880, section 4.2.2.\nfunc readLength(r io.Reader) (length int64, isPartial bool, err error) {\n\tvar buf [4]byte\n\t_, err = readFull(r, buf[:1])\n\tif err != nil {\n\t\treturn\n\t}\n\tswitch {\n\tcase buf[0] < 192:\n\t\tlength = int64(buf[0])\n\tcase buf[0] < 224:\n\t\tlength = int64(buf[0]-192) << 8\n\t\t_, err = readFull(r, buf[0:1])\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tlength += int64(buf[0]) + 192\n\tcase buf[0] < 255:\n\t\tlength = int64(1) << (buf[0] & 0x1f)\n\t\tisPartial = true\n\tdefault:\n\t\t_, err = readFull(r, buf[0:4])\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tlength = int64(buf[0])<<24 |\n\t\t\tint64(buf[1])<<16 |\n\t\t\tint64(buf[2])<<8 |\n\t\t\tint64(buf[3])\n\t}\n\treturn\n}\n\n// partialLengthReader wraps an io.Reader and handles OpenPGP partial lengths.\n// The continuation lengths are parsed and removed from the stream and EOF is\n// returned at the end of the packet. See RFC 4880, section 4.2.2.4.\ntype partialLengthReader struct {\n\tr         io.Reader\n\tremaining int64\n\tisPartial bool\n}\n\nfunc (r *partialLengthReader) Read(p []byte) (n int, err error) {\n\tfor r.remaining == 0 {\n\t\tif !r.isPartial {\n\t\t\treturn 0, io.EOF\n\t\t}\n\t\tr.remaining, r.isPartial, err = readLength(r.r)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t}\n\n\ttoRead := int64(len(p))\n\tif toRead > r.remaining {\n\t\ttoRead = r.remaining\n\t}\n\n\tn, err = r.r.Read(p[:int(toRead)])\n\tr.remaining -= int64(n)\n\tif n < int(toRead) && err == io.EOF {\n\t\terr = io.ErrUnexpectedEOF\n\t}\n\treturn\n}\n\n// partialLengthWriter writes a stream of data using OpenPGP partial lengths.\n// See RFC 4880, section 4.2.2.4.\ntype partialLengthWriter struct {\n\tw          io.WriteCloser\n\tbuf        bytes.Buffer\n\tlengthByte [1]byte\n}\n\nfunc (w *partialLengthWriter) Write(p []byte) (n int, err error) {\n\tbufLen := w.buf.Len()\n\tif bufLen > 512 {\n\t\tfor power := uint(30); ; power-- {\n\t\t\tl := 1 << power\n\t\t\tif bufLen >= l {\n\t\t\t\tw.lengthByte[0] = 224 + uint8(power)\n\t\t\t\t_, err = w.w.Write(w.lengthByte[:])\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tvar m int\n\t\t\t\tm, err = w.w.Write(w.buf.Next(l))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif m != l {\n\t\t\t\t\treturn 0, io.ErrShortWrite\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn w.buf.Write(p)\n}\n\nfunc (w *partialLengthWriter) Close() (err error) {\n\tlen := w.buf.Len()\n\terr = serializeLength(w.w, len)\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, err = w.buf.WriteTo(w.w)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn w.w.Close()\n}\n\n// A spanReader is an io.LimitReader, but it returns ErrUnexpectedEOF if the\n// underlying Reader returns EOF before the limit has been reached.\ntype spanReader struct {\n\tr io.Reader\n\tn int64\n}\n\nfunc (l *spanReader) Read(p []byte) (n int, err error) {\n\tif l.n <= 0 {\n\t\treturn 0, io.EOF\n\t}\n\tif int64(len(p)) > l.n {\n\t\tp = p[0:l.n]\n\t}\n\tn, err = l.r.Read(p)\n\tl.n -= int64(n)\n\tif l.n > 0 && err == io.EOF {\n\t\terr = io.ErrUnexpectedEOF\n\t}\n\treturn\n}\n\n// readHeader parses a packet header and returns an io.Reader which will return\n// the contents of the packet. See RFC 4880, section 4.2.\nfunc readHeader(r io.Reader) (tag packetType, length int64, contents io.Reader, err error) {\n\tvar buf [4]byte\n\t_, err = io.ReadFull(r, buf[:1])\n\tif err != nil {\n\t\treturn\n\t}\n\tif buf[0]&0x80 == 0 {\n\t\terr = errors.StructuralError(\"tag byte does not have MSB set\")\n\t\treturn\n\t}\n\tif buf[0]&0x40 == 0 {\n\t\t// Old format packet\n\t\ttag = packetType((buf[0] & 0x3f) >> 2)\n\t\tlengthType := buf[0] & 3\n\t\tif lengthType == 3 {\n\t\t\tlength = -1\n\t\t\tcontents = r\n\t\t\treturn\n\t\t}\n\t\tlengthBytes := 1 << lengthType\n\t\t_, err = readFull(r, buf[0:lengthBytes])\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tfor i := 0; i < lengthBytes; i++ {\n\t\t\tlength <<= 8\n\t\t\tlength |= int64(buf[i])\n\t\t}\n\t\tcontents = &spanReader{r, length}\n\t\treturn\n\t}\n\n\t// New format packet\n\ttag = packetType(buf[0] & 0x3f)\n\tlength, isPartial, err := readLength(r)\n\tif err != nil {\n\t\treturn\n\t}\n\tif isPartial {\n\t\tcontents = &partialLengthReader{\n\t\t\tremaining: length,\n\t\t\tisPartial: true,\n\t\t\tr:         r,\n\t\t}\n\t\tlength = -1\n\t} else {\n\t\tcontents = &spanReader{r, length}\n\t}\n\treturn\n}\n\n// serializeHeader writes an OpenPGP packet header to w. See RFC 4880, section\n// 4.2.\nfunc serializeHeader(w io.Writer, ptype packetType, length int) (err error) {\n\terr = serializeType(w, ptype)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn serializeLength(w, length)\n}\n\n// serializeType writes an OpenPGP packet type to w. See RFC 4880, section\n// 4.2.\nfunc serializeType(w io.Writer, ptype packetType) (err error) {\n\tvar buf [1]byte\n\tbuf[0] = 0x80 | 0x40 | byte(ptype)\n\t_, err = w.Write(buf[:])\n\treturn\n}\n\n// serializeLength writes an OpenPGP packet length to w. See RFC 4880, section\n// 4.2.2.\nfunc serializeLength(w io.Writer, length int) (err error) {\n\tvar buf [5]byte\n\tvar n int\n\n\tif length < 192 {\n\t\tbuf[0] = byte(length)\n\t\tn = 1\n\t} else if length < 8384 {\n\t\tlength -= 192\n\t\tbuf[0] = 192 + byte(length>>8)\n\t\tbuf[1] = byte(length)\n\t\tn = 2\n\t} else {\n\t\tbuf[0] = 255\n\t\tbuf[1] = byte(length >> 24)\n\t\tbuf[2] = byte(length >> 16)\n\t\tbuf[3] = byte(length >> 8)\n\t\tbuf[4] = byte(length)\n\t\tn = 5\n\t}\n\n\t_, err = w.Write(buf[:n])\n\treturn\n}\n\n// serializeStreamHeader writes an OpenPGP packet header to w where the\n// length of the packet is unknown. It returns a io.WriteCloser which can be\n// used to write the contents of the packet. See RFC 4880, section 4.2.\nfunc serializeStreamHeader(w io.WriteCloser, ptype packetType) (out io.WriteCloser, err error) {\n\terr = serializeType(w, ptype)\n\tif err != nil {\n\t\treturn\n\t}\n\tout = &partialLengthWriter{w: w}\n\treturn\n}\n\n// Packet represents an OpenPGP packet. Users are expected to try casting\n// instances of this interface to specific packet types.\ntype Packet interface {\n\tparse(io.Reader) error\n}\n\n// consumeAll reads from the given Reader until error, returning the number of\n// bytes read.\nfunc consumeAll(r io.Reader) (n int64, err error) {\n\tvar m int\n\tvar buf [1024]byte\n\n\tfor {\n\t\tm, err = r.Read(buf[:])\n\t\tn += int64(m)\n\t\tif err == io.EOF {\n\t\t\terr = nil\n\t\t\treturn\n\t\t}\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// packetType represents the numeric ids of the different OpenPGP packet types. See\n// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-2\ntype packetType uint8\n\nconst (\n\tpacketTypeEncryptedKey                             packetType = 1\n\tpacketTypeSignature                                packetType = 2\n\tpacketTypeSymmetricKeyEncrypted                    packetType = 3\n\tpacketTypeOnePassSignature                         packetType = 4\n\tpacketTypePrivateKey                               packetType = 5\n\tpacketTypePublicKey                                packetType = 6\n\tpacketTypePrivateSubkey                            packetType = 7\n\tpacketTypeCompressed                               packetType = 8\n\tpacketTypeSymmetricallyEncrypted                   packetType = 9\n\tpacketTypeMarker                                   packetType = 10\n\tpacketTypeLiteralData                              packetType = 11\n\tpacketTypeTrust                                    packetType = 12\n\tpacketTypeUserId                                   packetType = 13\n\tpacketTypePublicSubkey                             packetType = 14\n\tpacketTypeUserAttribute                            packetType = 17\n\tpacketTypeSymmetricallyEncryptedIntegrityProtected packetType = 18\n\tpacketTypeAEADEncrypted                            packetType = 20\n\tpacketPadding                                      packetType = 21\n)\n\n// EncryptedDataPacket holds encrypted data. It is currently implemented by\n// SymmetricallyEncrypted and AEADEncrypted.\ntype EncryptedDataPacket interface {\n\tDecrypt(CipherFunction, []byte) (io.ReadCloser, error)\n}\n\n// Read reads a single OpenPGP packet from the given io.Reader. If there is an\n// error parsing a packet, the whole packet is consumed from the input.\nfunc Read(r io.Reader) (p Packet, err error) {\n\ttag, len, contents, err := readHeader(r)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tswitch tag {\n\tcase packetTypeEncryptedKey:\n\t\tp = new(EncryptedKey)\n\tcase packetTypeSignature:\n\t\tp = new(Signature)\n\tcase packetTypeSymmetricKeyEncrypted:\n\t\tp = new(SymmetricKeyEncrypted)\n\tcase packetTypeOnePassSignature:\n\t\tp = new(OnePassSignature)\n\tcase packetTypePrivateKey, packetTypePrivateSubkey:\n\t\tpk := new(PrivateKey)\n\t\tif tag == packetTypePrivateSubkey {\n\t\t\tpk.IsSubkey = true\n\t\t}\n\t\tp = pk\n\tcase packetTypePublicKey, packetTypePublicSubkey:\n\t\tisSubkey := tag == packetTypePublicSubkey\n\t\tp = &PublicKey{IsSubkey: isSubkey}\n\tcase packetTypeCompressed:\n\t\tp = new(Compressed)\n\tcase packetTypeSymmetricallyEncrypted:\n\t\tp = new(SymmetricallyEncrypted)\n\tcase packetTypeLiteralData:\n\t\tp = new(LiteralData)\n\tcase packetTypeUserId:\n\t\tp = new(UserId)\n\tcase packetTypeUserAttribute:\n\t\tp = new(UserAttribute)\n\tcase packetTypeSymmetricallyEncryptedIntegrityProtected:\n\t\tse := new(SymmetricallyEncrypted)\n\t\tse.IntegrityProtected = true\n\t\tp = se\n\tcase packetTypeAEADEncrypted:\n\t\tp = new(AEADEncrypted)\n\tcase packetPadding:\n\t\tp = Padding(len)\n\tcase packetTypeMarker:\n\t\tp = new(Marker)\n\tcase packetTypeTrust:\n\t\t// Not implemented, just consume\n\t\terr = errors.UnknownPacketTypeError(tag)\n\tdefault:\n\t\t// Packet Tags from 0 to 39 are critical.\n\t\t// Packet Tags from 40 to 63 are non-critical.\n\t\tif tag < 40 {\n\t\t\terr = errors.CriticalUnknownPacketTypeError(tag)\n\t\t} else {\n\t\t\terr = errors.UnknownPacketTypeError(tag)\n\t\t}\n\t}\n\tif p != nil {\n\t\terr = p.parse(contents)\n\t}\n\tif err != nil {\n\t\tconsumeAll(contents)\n\t}\n\treturn\n}\n\n// ReadWithCheck reads a single OpenPGP message packet from the given io.Reader. If there is an\n// error parsing a packet, the whole packet is consumed from the input.\n// ReadWithCheck additionally checks if the OpenPGP message packet sequence adheres\n// to the packet composition rules in rfc4880, if not throws an error.\nfunc ReadWithCheck(r io.Reader, sequence *SequenceVerifier) (p Packet, msgErr error, err error) {\n\ttag, len, contents, err := readHeader(r)\n\tif err != nil {\n\t\treturn\n\t}\n\tswitch tag {\n\tcase packetTypeEncryptedKey:\n\t\tmsgErr = sequence.Next(ESKSymbol)\n\t\tp = new(EncryptedKey)\n\tcase packetTypeSignature:\n\t\tmsgErr = sequence.Next(SigSymbol)\n\t\tp = new(Signature)\n\tcase packetTypeSymmetricKeyEncrypted:\n\t\tmsgErr = sequence.Next(ESKSymbol)\n\t\tp = new(SymmetricKeyEncrypted)\n\tcase packetTypeOnePassSignature:\n\t\tmsgErr = sequence.Next(OPSSymbol)\n\t\tp = new(OnePassSignature)\n\tcase packetTypeCompressed:\n\t\tmsgErr = sequence.Next(CompSymbol)\n\t\tp = new(Compressed)\n\tcase packetTypeSymmetricallyEncrypted:\n\t\tmsgErr = sequence.Next(EncSymbol)\n\t\tp = new(SymmetricallyEncrypted)\n\tcase packetTypeLiteralData:\n\t\tmsgErr = sequence.Next(LDSymbol)\n\t\tp = new(LiteralData)\n\tcase packetTypeSymmetricallyEncryptedIntegrityProtected:\n\t\tmsgErr = sequence.Next(EncSymbol)\n\t\tse := new(SymmetricallyEncrypted)\n\t\tse.IntegrityProtected = true\n\t\tp = se\n\tcase packetTypeAEADEncrypted:\n\t\tmsgErr = sequence.Next(EncSymbol)\n\t\tp = new(AEADEncrypted)\n\tcase packetPadding:\n\t\tp = Padding(len)\n\tcase packetTypeMarker:\n\t\tp = new(Marker)\n\tcase packetTypeTrust:\n\t\t// Not implemented, just consume\n\t\terr = errors.UnknownPacketTypeError(tag)\n\tcase packetTypePrivateKey,\n\t\tpacketTypePrivateSubkey,\n\t\tpacketTypePublicKey,\n\t\tpacketTypePublicSubkey,\n\t\tpacketTypeUserId,\n\t\tpacketTypeUserAttribute:\n\t\tmsgErr = sequence.Next(UnknownSymbol)\n\t\tconsumeAll(contents)\n\tdefault:\n\t\t// Packet Tags from 0 to 39 are critical.\n\t\t// Packet Tags from 40 to 63 are non-critical.\n\t\tif tag < 40 {\n\t\t\terr = errors.CriticalUnknownPacketTypeError(tag)\n\t\t} else {\n\t\t\terr = errors.UnknownPacketTypeError(tag)\n\t\t}\n\t}\n\tif p != nil {\n\t\terr = p.parse(contents)\n\t}\n\tif err != nil {\n\t\tconsumeAll(contents)\n\t}\n\treturn\n}\n\n// SignatureType represents the different semantic meanings of an OpenPGP\n// signature. See RFC 4880, section 5.2.1.\ntype SignatureType uint8\n\nconst (\n\tSigTypeBinary                  SignatureType = 0x00\n\tSigTypeText                    SignatureType = 0x01\n\tSigTypeGenericCert             SignatureType = 0x10\n\tSigTypePersonaCert             SignatureType = 0x11\n\tSigTypeCasualCert              SignatureType = 0x12\n\tSigTypePositiveCert            SignatureType = 0x13\n\tSigTypeSubkeyBinding           SignatureType = 0x18\n\tSigTypePrimaryKeyBinding       SignatureType = 0x19\n\tSigTypeDirectSignature         SignatureType = 0x1F\n\tSigTypeKeyRevocation           SignatureType = 0x20\n\tSigTypeSubkeyRevocation        SignatureType = 0x28\n\tSigTypeCertificationRevocation SignatureType = 0x30\n)\n\n// PublicKeyAlgorithm represents the different public key system specified for\n// OpenPGP. See\n// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-12\ntype PublicKeyAlgorithm uint8\n\nconst (\n\tPubKeyAlgoRSA     PublicKeyAlgorithm = 1\n\tPubKeyAlgoElGamal PublicKeyAlgorithm = 16\n\tPubKeyAlgoDSA     PublicKeyAlgorithm = 17\n\t// RFC 6637, Section 5.\n\tPubKeyAlgoECDH  PublicKeyAlgorithm = 18\n\tPubKeyAlgoECDSA PublicKeyAlgorithm = 19\n\t// https://www.ietf.org/archive/id/draft-koch-eddsa-for-openpgp-04.txt\n\tPubKeyAlgoEdDSA PublicKeyAlgorithm = 22\n\t// https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh\n\tPubKeyAlgoX25519  PublicKeyAlgorithm = 25\n\tPubKeyAlgoX448    PublicKeyAlgorithm = 26\n\tPubKeyAlgoEd25519 PublicKeyAlgorithm = 27\n\tPubKeyAlgoEd448   PublicKeyAlgorithm = 28\n\n\t// Deprecated in RFC 4880, Section 13.5. Use key flags instead.\n\tPubKeyAlgoRSAEncryptOnly PublicKeyAlgorithm = 2\n\tPubKeyAlgoRSASignOnly    PublicKeyAlgorithm = 3\n)\n\n// CanEncrypt returns true if it's possible to encrypt a message to a public\n// key of the given type.\nfunc (pka PublicKeyAlgorithm) CanEncrypt() bool {\n\tswitch pka {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoElGamal, PubKeyAlgoECDH, PubKeyAlgoX25519, PubKeyAlgoX448:\n\t\treturn true\n\t}\n\treturn false\n}\n\n// CanSign returns true if it's possible for a public key of the given type to\n// sign a message.\nfunc (pka PublicKeyAlgorithm) CanSign() bool {\n\tswitch pka {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoDSA, PubKeyAlgoECDSA, PubKeyAlgoEdDSA, PubKeyAlgoEd25519, PubKeyAlgoEd448:\n\t\treturn true\n\t}\n\treturn false\n}\n\n// CipherFunction represents the different block ciphers specified for OpenPGP. See\n// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-13\ntype CipherFunction algorithm.CipherFunction\n\nconst (\n\tCipher3DES   CipherFunction = 2\n\tCipherCAST5  CipherFunction = 3\n\tCipherAES128 CipherFunction = 7\n\tCipherAES192 CipherFunction = 8\n\tCipherAES256 CipherFunction = 9\n)\n\n// KeySize returns the key size, in bytes, of cipher.\nfunc (cipher CipherFunction) KeySize() int {\n\treturn algorithm.CipherFunction(cipher).KeySize()\n}\n\n// IsSupported returns true if the cipher is supported from the library\nfunc (cipher CipherFunction) IsSupported() bool {\n\treturn algorithm.CipherFunction(cipher).KeySize() > 0\n}\n\n// blockSize returns the block size, in bytes, of cipher.\nfunc (cipher CipherFunction) blockSize() int {\n\treturn algorithm.CipherFunction(cipher).BlockSize()\n}\n\n// new returns a fresh instance of the given cipher.\nfunc (cipher CipherFunction) new(key []byte) (block cipher.Block) {\n\treturn algorithm.CipherFunction(cipher).New(key)\n}\n\n// padToKeySize left-pads a MPI with zeroes to match the length of the\n// specified RSA public.\nfunc padToKeySize(pub *rsa.PublicKey, b []byte) []byte {\n\tk := (pub.N.BitLen() + 7) / 8\n\tif len(b) >= k {\n\t\treturn b\n\t}\n\tbb := make([]byte, k)\n\tcopy(bb[len(bb)-len(b):], b)\n\treturn bb\n}\n\n// CompressionAlgo Represents the different compression algorithms\n// supported by OpenPGP (except for BZIP2, which is not currently\n// supported). See Section 9.3 of RFC 4880.\ntype CompressionAlgo uint8\n\nconst (\n\tCompressionNone CompressionAlgo = 0\n\tCompressionZIP  CompressionAlgo = 1\n\tCompressionZLIB CompressionAlgo = 2\n)\n\n// AEADMode represents the different Authenticated Encryption with Associated\n// Data specified for OpenPGP.\n// See https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-9.6\ntype AEADMode algorithm.AEADMode\n\nconst (\n\tAEADModeEAX AEADMode = 1\n\tAEADModeOCB AEADMode = 2\n\tAEADModeGCM AEADMode = 3\n)\n\nfunc (mode AEADMode) IvLength() int {\n\treturn algorithm.AEADMode(mode).NonceLength()\n}\n\nfunc (mode AEADMode) TagLength() int {\n\treturn algorithm.AEADMode(mode).TagLength()\n}\n\n// IsSupported returns true if the aead mode is supported from the library\nfunc (mode AEADMode) IsSupported() bool {\n\treturn algorithm.AEADMode(mode).TagLength() > 0\n}\n\n// new returns a fresh instance of the given mode.\nfunc (mode AEADMode) new(block cipher.Block) cipher.AEAD {\n\treturn algorithm.AEADMode(mode).New(block)\n}\n\n// ReasonForRevocation represents a revocation reason code as per RFC4880\n// section 5.2.3.23.\ntype ReasonForRevocation uint8\n\nconst (\n\tNoReason       ReasonForRevocation = 0\n\tKeySuperseded  ReasonForRevocation = 1\n\tKeyCompromised ReasonForRevocation = 2\n\tKeyRetired     ReasonForRevocation = 3\n\tUserIDNotValid ReasonForRevocation = 32\n\tUnknown        ReasonForRevocation = 200\n)\n\nfunc NewReasonForRevocation(value byte) ReasonForRevocation {\n\tif value < 4 || value == 32 {\n\t\treturn ReasonForRevocation(value)\n\t}\n\treturn Unknown\n}\n\n// Curve is a mapping to supported ECC curves for key generation.\n// See https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-06.html#name-curve-specific-wire-formats\ntype Curve string\n\nconst (\n\tCurve25519         Curve = \"Curve25519\"\n\tCurve448           Curve = \"Curve448\"\n\tCurveNistP256      Curve = \"P256\"\n\tCurveNistP384      Curve = \"P384\"\n\tCurveNistP521      Curve = \"P521\"\n\tCurveSecP256k1     Curve = \"SecP256k1\"\n\tCurveBrainpoolP256 Curve = \"BrainpoolP256\"\n\tCurveBrainpoolP384 Curve = \"BrainpoolP384\"\n\tCurveBrainpoolP512 Curve = \"BrainpoolP512\"\n)\n\n// TrustLevel represents a trust level per RFC4880 5.2.3.13\ntype TrustLevel uint8\n\n// TrustAmount represents a trust amount per RFC4880 5.2.3.13\ntype TrustAmount uint8\n\nconst (\n\t// versionSize is the length in bytes of the version value.\n\tversionSize = 1\n\t// algorithmSize is the length in bytes of the key algorithm value.\n\talgorithmSize = 1\n\t// keyVersionSize is the length in bytes of the key version value\n\tkeyVersionSize = 1\n\t// keyIdSize is the length in bytes of the key identifier value.\n\tkeyIdSize = 8\n\t// timestampSize is the length in bytes of encoded timestamps.\n\ttimestampSize = 4\n\t// fingerprintSizeV6 is the length in bytes of the key fingerprint in v6.\n\tfingerprintSizeV6 = 32\n\t// fingerprintSize is the length in bytes of the key fingerprint.\n\tfingerprintSize = 20\n)\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/packet_sequence.go",
    "content": "package packet\n\n// This file implements the pushdown automata (PDA) from PGPainless (Paul Schaub)\n// to verify pgp packet sequences. See Paul's blogpost for more details:\n// https://blog.jabberhead.tk/2022/10/26/implementing-packet-sequence-validation-using-pushdown-automata/\nimport (\n\t\"fmt\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n)\n\nfunc NewErrMalformedMessage(from State, input InputSymbol, stackSymbol StackSymbol) errors.ErrMalformedMessage {\n\treturn errors.ErrMalformedMessage(fmt.Sprintf(\"state %d, input symbol %d, stack symbol %d \", from, input, stackSymbol))\n}\n\n// InputSymbol defines the input alphabet of the PDA\ntype InputSymbol uint8\n\nconst (\n\tLDSymbol InputSymbol = iota\n\tSigSymbol\n\tOPSSymbol\n\tCompSymbol\n\tESKSymbol\n\tEncSymbol\n\tEOSSymbol\n\tUnknownSymbol\n)\n\n// StackSymbol defines the stack alphabet of the PDA\ntype StackSymbol int8\n\nconst (\n\tMsgStackSymbol StackSymbol = iota\n\tOpsStackSymbol\n\tKeyStackSymbol\n\tEndStackSymbol\n\tEmptyStackSymbol\n)\n\n// State defines the states of the PDA\ntype State int8\n\nconst (\n\tOpenPGPMessage State = iota\n\tESKMessage\n\tLiteralMessage\n\tCompressedMessage\n\tEncryptedMessage\n\tValidMessage\n)\n\n// transition represents a state transition in the PDA\ntype transition func(input InputSymbol, stackSymbol StackSymbol) (State, []StackSymbol, bool, error)\n\n// SequenceVerifier is a pushdown automata to verify\n// PGP messages packet sequences according to rfc4880.\ntype SequenceVerifier struct {\n\tstack []StackSymbol\n\tstate State\n}\n\n// Next performs a state transition with the given input symbol.\n// If the transition fails a ErrMalformedMessage is returned.\nfunc (sv *SequenceVerifier) Next(input InputSymbol) error {\n\tfor {\n\t\tstackSymbol := sv.popStack()\n\t\ttransitionFunc := getTransition(sv.state)\n\t\tnextState, newStackSymbols, redo, err := transitionFunc(input, stackSymbol)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif redo {\n\t\t\tsv.pushStack(stackSymbol)\n\t\t}\n\t\tfor _, newStackSymbol := range newStackSymbols {\n\t\t\tsv.pushStack(newStackSymbol)\n\t\t}\n\t\tsv.state = nextState\n\t\tif !redo {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn nil\n}\n\n// Valid returns true if RDA is in a valid state.\nfunc (sv *SequenceVerifier) Valid() bool {\n\treturn sv.state == ValidMessage && len(sv.stack) == 0\n}\n\nfunc (sv *SequenceVerifier) AssertValid() error {\n\tif !sv.Valid() {\n\t\treturn errors.ErrMalformedMessage(\"invalid message\")\n\t}\n\treturn nil\n}\n\nfunc NewSequenceVerifier() *SequenceVerifier {\n\treturn &SequenceVerifier{\n\t\tstack: []StackSymbol{EndStackSymbol, MsgStackSymbol},\n\t\tstate: OpenPGPMessage,\n\t}\n}\n\nfunc (sv *SequenceVerifier) popStack() StackSymbol {\n\tif len(sv.stack) == 0 {\n\t\treturn EmptyStackSymbol\n\t}\n\telemIndex := len(sv.stack) - 1\n\tstackSymbol := sv.stack[elemIndex]\n\tsv.stack = sv.stack[:elemIndex]\n\treturn stackSymbol\n}\n\nfunc (sv *SequenceVerifier) pushStack(stackSymbol StackSymbol) {\n\tsv.stack = append(sv.stack, stackSymbol)\n}\n\nfunc getTransition(from State) transition {\n\tswitch from {\n\tcase OpenPGPMessage:\n\t\treturn fromOpenPGPMessage\n\tcase LiteralMessage:\n\t\treturn fromLiteralMessage\n\tcase CompressedMessage:\n\t\treturn fromCompressedMessage\n\tcase EncryptedMessage:\n\t\treturn fromEncryptedMessage\n\tcase ESKMessage:\n\t\treturn fromESKMessage\n\tcase ValidMessage:\n\t\treturn fromValidMessage\n\t}\n\treturn nil\n}\n\n// fromOpenPGPMessage is the transition for the state OpenPGPMessage.\nfunc fromOpenPGPMessage(input InputSymbol, stackSymbol StackSymbol) (State, []StackSymbol, bool, error) {\n\tif stackSymbol != MsgStackSymbol {\n\t\treturn 0, nil, false, NewErrMalformedMessage(OpenPGPMessage, input, stackSymbol)\n\t}\n\tswitch input {\n\tcase LDSymbol:\n\t\treturn LiteralMessage, nil, false, nil\n\tcase SigSymbol:\n\t\treturn OpenPGPMessage, []StackSymbol{MsgStackSymbol}, false, nil\n\tcase OPSSymbol:\n\t\treturn OpenPGPMessage, []StackSymbol{OpsStackSymbol, MsgStackSymbol}, false, nil\n\tcase CompSymbol:\n\t\treturn CompressedMessage, nil, false, nil\n\tcase ESKSymbol:\n\t\treturn ESKMessage, []StackSymbol{KeyStackSymbol}, false, nil\n\tcase EncSymbol:\n\t\treturn EncryptedMessage, nil, false, nil\n\t}\n\treturn 0, nil, false, NewErrMalformedMessage(OpenPGPMessage, input, stackSymbol)\n}\n\n// fromESKMessage is the transition for the state ESKMessage.\nfunc fromESKMessage(input InputSymbol, stackSymbol StackSymbol) (State, []StackSymbol, bool, error) {\n\tif stackSymbol != KeyStackSymbol {\n\t\treturn 0, nil, false, NewErrMalformedMessage(ESKMessage, input, stackSymbol)\n\t}\n\tswitch input {\n\tcase ESKSymbol:\n\t\treturn ESKMessage, []StackSymbol{KeyStackSymbol}, false, nil\n\tcase EncSymbol:\n\t\treturn EncryptedMessage, nil, false, nil\n\t}\n\treturn 0, nil, false, NewErrMalformedMessage(ESKMessage, input, stackSymbol)\n}\n\n// fromLiteralMessage is the transition for the state LiteralMessage.\nfunc fromLiteralMessage(input InputSymbol, stackSymbol StackSymbol) (State, []StackSymbol, bool, error) {\n\tswitch input {\n\tcase SigSymbol:\n\t\tif stackSymbol == OpsStackSymbol {\n\t\t\treturn LiteralMessage, nil, false, nil\n\t\t}\n\tcase EOSSymbol:\n\t\tif stackSymbol == EndStackSymbol {\n\t\t\treturn ValidMessage, nil, false, nil\n\t\t}\n\t}\n\treturn 0, nil, false, NewErrMalformedMessage(LiteralMessage, input, stackSymbol)\n}\n\n// fromLiteralMessage is the transition for the state CompressedMessage.\nfunc fromCompressedMessage(input InputSymbol, stackSymbol StackSymbol) (State, []StackSymbol, bool, error) {\n\tswitch input {\n\tcase SigSymbol:\n\t\tif stackSymbol == OpsStackSymbol {\n\t\t\treturn CompressedMessage, nil, false, nil\n\t\t}\n\tcase EOSSymbol:\n\t\tif stackSymbol == EndStackSymbol {\n\t\t\treturn ValidMessage, nil, false, nil\n\t\t}\n\t}\n\treturn OpenPGPMessage, []StackSymbol{MsgStackSymbol}, true, nil\n}\n\n// fromEncryptedMessage is the transition for the state EncryptedMessage.\nfunc fromEncryptedMessage(input InputSymbol, stackSymbol StackSymbol) (State, []StackSymbol, bool, error) {\n\tswitch input {\n\tcase SigSymbol:\n\t\tif stackSymbol == OpsStackSymbol {\n\t\t\treturn EncryptedMessage, nil, false, nil\n\t\t}\n\tcase EOSSymbol:\n\t\tif stackSymbol == EndStackSymbol {\n\t\t\treturn ValidMessage, nil, false, nil\n\t\t}\n\t}\n\treturn OpenPGPMessage, []StackSymbol{MsgStackSymbol}, true, nil\n}\n\n// fromValidMessage is the transition for the state ValidMessage.\nfunc fromValidMessage(input InputSymbol, stackSymbol StackSymbol) (State, []StackSymbol, bool, error) {\n\treturn 0, nil, false, NewErrMalformedMessage(ValidMessage, input, stackSymbol)\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/packet_unsupported.go",
    "content": "package packet\n\nimport (\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n)\n\n// UnsupportedPackage represents a OpenPGP packet with a known packet type\n// but with unsupported content.\ntype UnsupportedPacket struct {\n\tIncompletePacket Packet\n\tError            errors.UnsupportedError\n}\n\n// Implements the Packet interface\nfunc (up *UnsupportedPacket) parse(read io.Reader) error {\n\terr := up.IncompletePacket.parse(read)\n\tif castedErr, ok := err.(errors.UnsupportedError); ok {\n\t\tup.Error = castedErr\n\t\treturn nil\n\t}\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/padding.go",
    "content": "package packet\n\nimport (\n\t\"io\"\n)\n\n// Padding type represents a Padding Packet (Tag 21).\n// The padding type is represented by the length of its padding.\n// see https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh#name-padding-packet-tag-21\ntype Padding int\n\n// parse just ignores the padding content.\nfunc (pad Padding) parse(reader io.Reader) error {\n\t_, err := io.CopyN(io.Discard, reader, int64(pad))\n\treturn err\n}\n\n// SerializePadding writes the padding to writer.\nfunc (pad Padding) SerializePadding(writer io.Writer, rand io.Reader) error {\n\terr := serializeHeader(writer, packetPadding, int(pad))\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, err = io.CopyN(writer, rand, int64(pad))\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"bytes\"\n\t\"crypto\"\n\t\"crypto/cipher\"\n\t\"crypto/dsa\"\n\t\"crypto/rsa\"\n\t\"crypto/sha1\"\n\t\"crypto/sha256\"\n\t\"crypto/subtle\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/big\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/ecdh\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/ecdsa\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/ed25519\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/ed448\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/eddsa\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/elgamal\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/encoding\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/s2k\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/x25519\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/x448\"\n\t\"golang.org/x/crypto/hkdf\"\n)\n\n// PrivateKey represents a possibly encrypted private key. See RFC 4880,\n// section 5.5.3.\ntype PrivateKey struct {\n\tPublicKey\n\tEncrypted     bool // if true then the private key is unavailable until Decrypt has been called.\n\tencryptedData []byte\n\tcipher        CipherFunction\n\ts2k           func(out, in []byte)\n\taead          AEADMode // only relevant if S2KAEAD is enabled\n\t// An *{rsa|dsa|elgamal|ecdh|ecdsa|ed25519|ed448}.PrivateKey or\n\t// crypto.Signer/crypto.Decrypter (Decryptor RSA only).\n\tPrivateKey interface{}\n\tiv         []byte\n\n\t// Type of encryption of the S2K packet\n\t// Allowed values are 0 (Not encrypted), 253 (AEAD), 254 (SHA1), or\n\t// 255 (2-byte checksum)\n\ts2kType S2KType\n\t// Full parameters of the S2K packet\n\ts2kParams *s2k.Params\n}\n\n// S2KType s2k packet type\ntype S2KType uint8\n\nconst (\n\t// S2KNON unencrypt\n\tS2KNON S2KType = 0\n\t// S2KAEAD use authenticated encryption\n\tS2KAEAD S2KType = 253\n\t// S2KSHA1 sha1 sum check\n\tS2KSHA1 S2KType = 254\n\t// S2KCHECKSUM sum check\n\tS2KCHECKSUM S2KType = 255\n)\n\nfunc NewRSAPrivateKey(creationTime time.Time, priv *rsa.PrivateKey) *PrivateKey {\n\tpk := new(PrivateKey)\n\tpk.PublicKey = *NewRSAPublicKey(creationTime, &priv.PublicKey)\n\tpk.PrivateKey = priv\n\treturn pk\n}\n\nfunc NewDSAPrivateKey(creationTime time.Time, priv *dsa.PrivateKey) *PrivateKey {\n\tpk := new(PrivateKey)\n\tpk.PublicKey = *NewDSAPublicKey(creationTime, &priv.PublicKey)\n\tpk.PrivateKey = priv\n\treturn pk\n}\n\nfunc NewElGamalPrivateKey(creationTime time.Time, priv *elgamal.PrivateKey) *PrivateKey {\n\tpk := new(PrivateKey)\n\tpk.PublicKey = *NewElGamalPublicKey(creationTime, &priv.PublicKey)\n\tpk.PrivateKey = priv\n\treturn pk\n}\n\nfunc NewECDSAPrivateKey(creationTime time.Time, priv *ecdsa.PrivateKey) *PrivateKey {\n\tpk := new(PrivateKey)\n\tpk.PublicKey = *NewECDSAPublicKey(creationTime, &priv.PublicKey)\n\tpk.PrivateKey = priv\n\treturn pk\n}\n\nfunc NewEdDSAPrivateKey(creationTime time.Time, priv *eddsa.PrivateKey) *PrivateKey {\n\tpk := new(PrivateKey)\n\tpk.PublicKey = *NewEdDSAPublicKey(creationTime, &priv.PublicKey)\n\tpk.PrivateKey = priv\n\treturn pk\n}\n\nfunc NewECDHPrivateKey(creationTime time.Time, priv *ecdh.PrivateKey) *PrivateKey {\n\tpk := new(PrivateKey)\n\tpk.PublicKey = *NewECDHPublicKey(creationTime, &priv.PublicKey)\n\tpk.PrivateKey = priv\n\treturn pk\n}\n\nfunc NewX25519PrivateKey(creationTime time.Time, priv *x25519.PrivateKey) *PrivateKey {\n\tpk := new(PrivateKey)\n\tpk.PublicKey = *NewX25519PublicKey(creationTime, &priv.PublicKey)\n\tpk.PrivateKey = priv\n\treturn pk\n}\n\nfunc NewX448PrivateKey(creationTime time.Time, priv *x448.PrivateKey) *PrivateKey {\n\tpk := new(PrivateKey)\n\tpk.PublicKey = *NewX448PublicKey(creationTime, &priv.PublicKey)\n\tpk.PrivateKey = priv\n\treturn pk\n}\n\nfunc NewEd25519PrivateKey(creationTime time.Time, priv *ed25519.PrivateKey) *PrivateKey {\n\tpk := new(PrivateKey)\n\tpk.PublicKey = *NewEd25519PublicKey(creationTime, &priv.PublicKey)\n\tpk.PrivateKey = priv\n\treturn pk\n}\n\nfunc NewEd448PrivateKey(creationTime time.Time, priv *ed448.PrivateKey) *PrivateKey {\n\tpk := new(PrivateKey)\n\tpk.PublicKey = *NewEd448PublicKey(creationTime, &priv.PublicKey)\n\tpk.PrivateKey = priv\n\treturn pk\n}\n\n// NewSignerPrivateKey creates a PrivateKey from a crypto.Signer that\n// implements RSA, ECDSA or EdDSA.\nfunc NewSignerPrivateKey(creationTime time.Time, signer interface{}) *PrivateKey {\n\tpk := new(PrivateKey)\n\t// In general, the public Keys should be used as pointers. We still\n\t// type-switch on the values, for backwards-compatibility.\n\tswitch pubkey := signer.(type) {\n\tcase *rsa.PrivateKey:\n\t\tpk.PublicKey = *NewRSAPublicKey(creationTime, &pubkey.PublicKey)\n\tcase rsa.PrivateKey:\n\t\tpk.PublicKey = *NewRSAPublicKey(creationTime, &pubkey.PublicKey)\n\tcase *ecdsa.PrivateKey:\n\t\tpk.PublicKey = *NewECDSAPublicKey(creationTime, &pubkey.PublicKey)\n\tcase ecdsa.PrivateKey:\n\t\tpk.PublicKey = *NewECDSAPublicKey(creationTime, &pubkey.PublicKey)\n\tcase *eddsa.PrivateKey:\n\t\tpk.PublicKey = *NewEdDSAPublicKey(creationTime, &pubkey.PublicKey)\n\tcase eddsa.PrivateKey:\n\t\tpk.PublicKey = *NewEdDSAPublicKey(creationTime, &pubkey.PublicKey)\n\tcase *ed25519.PrivateKey:\n\t\tpk.PublicKey = *NewEd25519PublicKey(creationTime, &pubkey.PublicKey)\n\tcase ed25519.PrivateKey:\n\t\tpk.PublicKey = *NewEd25519PublicKey(creationTime, &pubkey.PublicKey)\n\tcase *ed448.PrivateKey:\n\t\tpk.PublicKey = *NewEd448PublicKey(creationTime, &pubkey.PublicKey)\n\tcase ed448.PrivateKey:\n\t\tpk.PublicKey = *NewEd448PublicKey(creationTime, &pubkey.PublicKey)\n\tdefault:\n\t\tpanic(\"openpgp: unknown signer type in NewSignerPrivateKey\")\n\t}\n\tpk.PrivateKey = signer\n\treturn pk\n}\n\n// NewDecrypterPrivateKey creates a PrivateKey from a *{rsa|elgamal|ecdh|x25519|x448}.PrivateKey.\nfunc NewDecrypterPrivateKey(creationTime time.Time, decrypter interface{}) *PrivateKey {\n\tpk := new(PrivateKey)\n\tswitch priv := decrypter.(type) {\n\tcase *rsa.PrivateKey:\n\t\tpk.PublicKey = *NewRSAPublicKey(creationTime, &priv.PublicKey)\n\tcase *elgamal.PrivateKey:\n\t\tpk.PublicKey = *NewElGamalPublicKey(creationTime, &priv.PublicKey)\n\tcase *ecdh.PrivateKey:\n\t\tpk.PublicKey = *NewECDHPublicKey(creationTime, &priv.PublicKey)\n\tcase *x25519.PrivateKey:\n\t\tpk.PublicKey = *NewX25519PublicKey(creationTime, &priv.PublicKey)\n\tcase *x448.PrivateKey:\n\t\tpk.PublicKey = *NewX448PublicKey(creationTime, &priv.PublicKey)\n\tdefault:\n\t\tpanic(\"openpgp: unknown decrypter type in NewDecrypterPrivateKey\")\n\t}\n\tpk.PrivateKey = decrypter\n\treturn pk\n}\n\nfunc (pk *PrivateKey) parse(r io.Reader) (err error) {\n\terr = (&pk.PublicKey).parse(r)\n\tif err != nil {\n\t\treturn\n\t}\n\tv5 := pk.PublicKey.Version == 5\n\tv6 := pk.PublicKey.Version == 6\n\n\tif V5Disabled && v5 {\n\t\treturn errors.UnsupportedError(\"support for parsing v5 entities is disabled; build with `-tags v5` if needed\")\n\t}\n\n\tvar buf [1]byte\n\t_, err = readFull(r, buf[:])\n\tif err != nil {\n\t\treturn\n\t}\n\tpk.s2kType = S2KType(buf[0])\n\tvar optCount [1]byte\n\tif v5 || (v6 && pk.s2kType != S2KNON) {\n\t\tif _, err = readFull(r, optCount[:]); err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\tswitch pk.s2kType {\n\tcase S2KNON:\n\t\tpk.s2k = nil\n\t\tpk.Encrypted = false\n\tcase S2KSHA1, S2KCHECKSUM, S2KAEAD:\n\t\tif (v5 || v6) && pk.s2kType == S2KCHECKSUM {\n\t\t\treturn errors.StructuralError(fmt.Sprintf(\"wrong s2k identifier for version %d\", pk.Version))\n\t\t}\n\t\t_, err = readFull(r, buf[:])\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tpk.cipher = CipherFunction(buf[0])\n\t\tif pk.cipher != 0 && !pk.cipher.IsSupported() {\n\t\t\treturn errors.UnsupportedError(\"unsupported cipher function in private key\")\n\t\t}\n\t\t// [Optional] If string-to-key usage octet was 253,\n\t\t// a one-octet AEAD algorithm.\n\t\tif pk.s2kType == S2KAEAD {\n\t\t\t_, err = readFull(r, buf[:])\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tpk.aead = AEADMode(buf[0])\n\t\t\tif !pk.aead.IsSupported() {\n\t\t\t\treturn errors.UnsupportedError(\"unsupported aead mode in private key\")\n\t\t\t}\n\t\t}\n\n\t\t// [Optional] Only for a version 6 packet,\n\t\t// and if string-to-key usage octet was 255, 254, or 253,\n\t\t// an one-octet count of the following field.\n\t\tif v6 {\n\t\t\t_, err = readFull(r, buf[:])\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tpk.s2kParams, err = s2k.ParseIntoParams(r)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tif pk.s2kParams.Dummy() {\n\t\t\treturn\n\t\t}\n\t\tif pk.s2kParams.Mode() == s2k.Argon2S2K && pk.s2kType != S2KAEAD {\n\t\t\treturn errors.StructuralError(\"using Argon2 S2K without AEAD is not allowed\")\n\t\t}\n\t\tif pk.s2kParams.Mode() == s2k.SimpleS2K && pk.Version == 6 {\n\t\t\treturn errors.StructuralError(\"using Simple S2K with version 6 keys is not allowed\")\n\t\t}\n\t\tpk.s2k, err = pk.s2kParams.Function()\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tpk.Encrypted = true\n\tdefault:\n\t\treturn errors.UnsupportedError(\"deprecated s2k function in private key\")\n\t}\n\n\tif pk.Encrypted {\n\t\tvar ivSize int\n\t\t// If the S2K usage octet was 253, the IV is of the size expected by the AEAD mode,\n\t\t// unless it's a version 5 key, in which case it's the size of the symmetric cipher's block size.\n\t\t// For all other S2K modes, it's always the block size.\n\t\tif !v5 && pk.s2kType == S2KAEAD {\n\t\t\tivSize = pk.aead.IvLength()\n\t\t} else {\n\t\t\tivSize = pk.cipher.blockSize()\n\t\t}\n\n\t\tif ivSize == 0 {\n\t\t\treturn errors.UnsupportedError(\"unsupported cipher in private key: \" + strconv.Itoa(int(pk.cipher)))\n\t\t}\n\t\tpk.iv = make([]byte, ivSize)\n\t\t_, err = readFull(r, pk.iv)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tif v5 && pk.s2kType == S2KAEAD {\n\t\t\tpk.iv = pk.iv[:pk.aead.IvLength()]\n\t\t}\n\t}\n\n\tvar privateKeyData []byte\n\tif v5 {\n\t\tvar n [4]byte /* secret material four octet count */\n\t\t_, err = readFull(r, n[:])\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tcount := uint32(uint32(n[0])<<24 | uint32(n[1])<<16 | uint32(n[2])<<8 | uint32(n[3]))\n\t\tif !pk.Encrypted {\n\t\t\tcount = count + 2 /* two octet checksum */\n\t\t}\n\t\tprivateKeyData = make([]byte, count)\n\t\t_, err = readFull(r, privateKeyData)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t} else {\n\t\tprivateKeyData, err = io.ReadAll(r)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\tif !pk.Encrypted {\n\t\tif len(privateKeyData) < 2 {\n\t\t\treturn errors.StructuralError(\"truncated private key data\")\n\t\t}\n\t\tif pk.Version != 6 {\n\t\t\t// checksum\n\t\t\tvar sum uint16\n\t\t\tfor i := 0; i < len(privateKeyData)-2; i++ {\n\t\t\t\tsum += uint16(privateKeyData[i])\n\t\t\t}\n\t\t\tif privateKeyData[len(privateKeyData)-2] != uint8(sum>>8) ||\n\t\t\t\tprivateKeyData[len(privateKeyData)-1] != uint8(sum) {\n\t\t\t\treturn errors.StructuralError(\"private key checksum failure\")\n\t\t\t}\n\t\t\tprivateKeyData = privateKeyData[:len(privateKeyData)-2]\n\t\t\treturn pk.parsePrivateKey(privateKeyData)\n\t\t} else {\n\t\t\t// No checksum\n\t\t\treturn pk.parsePrivateKey(privateKeyData)\n\t\t}\n\t}\n\n\tpk.encryptedData = privateKeyData\n\treturn\n}\n\n// Dummy returns true if the private key is a dummy key. This is a GNU extension.\nfunc (pk *PrivateKey) Dummy() bool {\n\treturn pk.s2kParams.Dummy()\n}\n\nfunc mod64kHash(d []byte) uint16 {\n\tvar h uint16\n\tfor _, b := range d {\n\t\th += uint16(b)\n\t}\n\treturn h\n}\n\nfunc (pk *PrivateKey) Serialize(w io.Writer) (err error) {\n\tcontents := bytes.NewBuffer(nil)\n\terr = pk.PublicKey.serializeWithoutHeaders(contents)\n\tif err != nil {\n\t\treturn\n\t}\n\tif _, err = contents.Write([]byte{uint8(pk.s2kType)}); err != nil {\n\t\treturn\n\t}\n\n\toptional := bytes.NewBuffer(nil)\n\tif pk.Encrypted || pk.Dummy() {\n\t\t// [Optional] If string-to-key usage octet was 255, 254, or 253,\n\t\t// a one-octet symmetric encryption algorithm.\n\t\tif _, err = optional.Write([]byte{uint8(pk.cipher)}); err != nil {\n\t\t\treturn\n\t\t}\n\t\t// [Optional] If string-to-key usage octet was 253,\n\t\t// a one-octet AEAD algorithm.\n\t\tif pk.s2kType == S2KAEAD {\n\t\t\tif _, err = optional.Write([]byte{uint8(pk.aead)}); err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\ts2kBuffer := bytes.NewBuffer(nil)\n\t\tif err := pk.s2kParams.Serialize(s2kBuffer); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// [Optional] Only for a version 6 packet, and if string-to-key\n\t\t// usage octet was 255, 254, or 253, an one-octet\n\t\t// count of the following field.\n\t\tif pk.Version == 6 {\n\t\t\tif _, err = optional.Write([]byte{uint8(s2kBuffer.Len())}); err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\t// [Optional] If string-to-key usage octet was 255, 254, or 253,\n\t\t// a string-to-key (S2K) specifier. The length of the string-to-key specifier\n\t\t// depends on its type\n\t\tif _, err = io.Copy(optional, s2kBuffer); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\t// IV\n\t\tif pk.Encrypted {\n\t\t\tif _, err = optional.Write(pk.iv); err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif pk.Version == 5 && pk.s2kType == S2KAEAD {\n\t\t\t\t// Add padding for version 5\n\t\t\t\tpadding := make([]byte, pk.cipher.blockSize()-len(pk.iv))\n\t\t\t\tif _, err = optional.Write(padding); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif pk.Version == 5 || (pk.Version == 6 && pk.s2kType != S2KNON) {\n\t\tcontents.Write([]byte{uint8(optional.Len())})\n\t}\n\n\tif _, err := io.Copy(contents, optional); err != nil {\n\t\treturn err\n\t}\n\n\tif !pk.Dummy() {\n\t\tl := 0\n\t\tvar priv []byte\n\t\tif !pk.Encrypted {\n\t\t\tbuf := bytes.NewBuffer(nil)\n\t\t\terr = pk.serializePrivateKey(buf)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tl = buf.Len()\n\t\t\tif pk.Version != 6 {\n\t\t\t\tchecksum := mod64kHash(buf.Bytes())\n\t\t\t\tbuf.Write([]byte{byte(checksum >> 8), byte(checksum)})\n\t\t\t}\n\t\t\tpriv = buf.Bytes()\n\t\t} else {\n\t\t\tpriv, l = pk.encryptedData, len(pk.encryptedData)\n\t\t}\n\n\t\tif pk.Version == 5 {\n\t\t\tcontents.Write([]byte{byte(l >> 24), byte(l >> 16), byte(l >> 8), byte(l)})\n\t\t}\n\t\tcontents.Write(priv)\n\t}\n\n\tptype := packetTypePrivateKey\n\tif pk.IsSubkey {\n\t\tptype = packetTypePrivateSubkey\n\t}\n\terr = serializeHeader(w, ptype, contents.Len())\n\tif err != nil {\n\t\treturn\n\t}\n\t_, err = io.Copy(w, contents)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn\n}\n\nfunc serializeRSAPrivateKey(w io.Writer, priv *rsa.PrivateKey) error {\n\tif _, err := w.Write(new(encoding.MPI).SetBig(priv.D).EncodedBytes()); err != nil {\n\t\treturn err\n\t}\n\tif _, err := w.Write(new(encoding.MPI).SetBig(priv.Primes[1]).EncodedBytes()); err != nil {\n\t\treturn err\n\t}\n\tif _, err := w.Write(new(encoding.MPI).SetBig(priv.Primes[0]).EncodedBytes()); err != nil {\n\t\treturn err\n\t}\n\t_, err := w.Write(new(encoding.MPI).SetBig(priv.Precomputed.Qinv).EncodedBytes())\n\treturn err\n}\n\nfunc serializeDSAPrivateKey(w io.Writer, priv *dsa.PrivateKey) error {\n\t_, err := w.Write(new(encoding.MPI).SetBig(priv.X).EncodedBytes())\n\treturn err\n}\n\nfunc serializeElGamalPrivateKey(w io.Writer, priv *elgamal.PrivateKey) error {\n\t_, err := w.Write(new(encoding.MPI).SetBig(priv.X).EncodedBytes())\n\treturn err\n}\n\nfunc serializeECDSAPrivateKey(w io.Writer, priv *ecdsa.PrivateKey) error {\n\t_, err := w.Write(encoding.NewMPI(priv.MarshalIntegerSecret()).EncodedBytes())\n\treturn err\n}\n\nfunc serializeEdDSAPrivateKey(w io.Writer, priv *eddsa.PrivateKey) error {\n\t_, err := w.Write(encoding.NewMPI(priv.MarshalByteSecret()).EncodedBytes())\n\treturn err\n}\n\nfunc serializeECDHPrivateKey(w io.Writer, priv *ecdh.PrivateKey) error {\n\t_, err := w.Write(encoding.NewMPI(priv.MarshalByteSecret()).EncodedBytes())\n\treturn err\n}\n\nfunc serializeX25519PrivateKey(w io.Writer, priv *x25519.PrivateKey) error {\n\t_, err := w.Write(priv.Secret)\n\treturn err\n}\n\nfunc serializeX448PrivateKey(w io.Writer, priv *x448.PrivateKey) error {\n\t_, err := w.Write(priv.Secret)\n\treturn err\n}\n\nfunc serializeEd25519PrivateKey(w io.Writer, priv *ed25519.PrivateKey) error {\n\t_, err := w.Write(priv.MarshalByteSecret())\n\treturn err\n}\n\nfunc serializeEd448PrivateKey(w io.Writer, priv *ed448.PrivateKey) error {\n\t_, err := w.Write(priv.MarshalByteSecret())\n\treturn err\n}\n\n// decrypt decrypts an encrypted private key using a decryption key.\nfunc (pk *PrivateKey) decrypt(decryptionKey []byte) error {\n\tif pk.Dummy() {\n\t\treturn errors.ErrDummyPrivateKey(\"dummy key found\")\n\t}\n\tif !pk.Encrypted {\n\t\treturn nil\n\t}\n\tblock := pk.cipher.new(decryptionKey)\n\tvar data []byte\n\tswitch pk.s2kType {\n\tcase S2KAEAD:\n\t\taead := pk.aead.new(block)\n\t\tadditionalData, err := pk.additionalData()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Decrypt the encrypted key material with aead\n\t\tdata, err = aead.Open(nil, pk.iv, pk.encryptedData, additionalData)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\tcase S2KSHA1, S2KCHECKSUM:\n\t\tcfb := cipher.NewCFBDecrypter(block, pk.iv)\n\t\tdata = make([]byte, len(pk.encryptedData))\n\t\tcfb.XORKeyStream(data, pk.encryptedData)\n\t\tif pk.s2kType == S2KSHA1 {\n\t\t\tif len(data) < sha1.Size {\n\t\t\t\treturn errors.StructuralError(\"truncated private key data\")\n\t\t\t}\n\t\t\th := sha1.New()\n\t\t\th.Write(data[:len(data)-sha1.Size])\n\t\t\tsum := h.Sum(nil)\n\t\t\tif !bytes.Equal(sum, data[len(data)-sha1.Size:]) {\n\t\t\t\treturn errors.StructuralError(\"private key checksum failure\")\n\t\t\t}\n\t\t\tdata = data[:len(data)-sha1.Size]\n\t\t} else {\n\t\t\tif len(data) < 2 {\n\t\t\t\treturn errors.StructuralError(\"truncated private key data\")\n\t\t\t}\n\t\t\tvar sum uint16\n\t\t\tfor i := 0; i < len(data)-2; i++ {\n\t\t\t\tsum += uint16(data[i])\n\t\t\t}\n\t\t\tif data[len(data)-2] != uint8(sum>>8) ||\n\t\t\t\tdata[len(data)-1] != uint8(sum) {\n\t\t\t\treturn errors.StructuralError(\"private key checksum failure\")\n\t\t\t}\n\t\t\tdata = data[:len(data)-2]\n\t\t}\n\tdefault:\n\t\treturn errors.InvalidArgumentError(\"invalid s2k type\")\n\t}\n\n\terr := pk.parsePrivateKey(data)\n\tif _, ok := err.(errors.KeyInvalidError); ok {\n\t\treturn errors.KeyInvalidError(\"invalid key parameters\")\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Mark key as unencrypted\n\tpk.s2kType = S2KNON\n\tpk.s2k = nil\n\tpk.Encrypted = false\n\tpk.encryptedData = nil\n\treturn nil\n}\n\nfunc (pk *PrivateKey) decryptWithCache(passphrase []byte, keyCache *s2k.Cache) error {\n\tif pk.Dummy() {\n\t\treturn errors.ErrDummyPrivateKey(\"dummy key found\")\n\t}\n\tif !pk.Encrypted {\n\t\treturn nil\n\t}\n\n\tkey, err := keyCache.GetOrComputeDerivedKey(passphrase, pk.s2kParams, pk.cipher.KeySize())\n\tif err != nil {\n\t\treturn err\n\t}\n\tif pk.s2kType == S2KAEAD {\n\t\tkey = pk.applyHKDF(key)\n\t}\n\treturn pk.decrypt(key)\n}\n\n// Decrypt decrypts an encrypted private key using a passphrase.\nfunc (pk *PrivateKey) Decrypt(passphrase []byte) error {\n\tif pk.Dummy() {\n\t\treturn errors.ErrDummyPrivateKey(\"dummy key found\")\n\t}\n\tif !pk.Encrypted {\n\t\treturn nil\n\t}\n\n\tkey := make([]byte, pk.cipher.KeySize())\n\tpk.s2k(key, passphrase)\n\tif pk.s2kType == S2KAEAD {\n\t\tkey = pk.applyHKDF(key)\n\t}\n\treturn pk.decrypt(key)\n}\n\n// DecryptPrivateKeys decrypts all encrypted keys with the given config and passphrase.\n// Avoids recomputation of similar s2k key derivations.\nfunc DecryptPrivateKeys(keys []*PrivateKey, passphrase []byte) error {\n\t// Create a cache to avoid recomputation of key derviations for the same passphrase.\n\ts2kCache := &s2k.Cache{}\n\tfor _, key := range keys {\n\t\tif key != nil && !key.Dummy() && key.Encrypted {\n\t\t\terr := key.decryptWithCache(passphrase, s2kCache)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\n// encrypt encrypts an unencrypted private key.\nfunc (pk *PrivateKey) encrypt(key []byte, params *s2k.Params, s2kType S2KType, cipherFunction CipherFunction, rand io.Reader) error {\n\tif pk.Dummy() {\n\t\treturn errors.ErrDummyPrivateKey(\"dummy key found\")\n\t}\n\tif pk.Encrypted {\n\t\treturn nil\n\t}\n\t// check if encryptionKey has the correct size\n\tif len(key) != cipherFunction.KeySize() {\n\t\treturn errors.InvalidArgumentError(\"supplied encryption key has the wrong size\")\n\t}\n\n\tif params.Mode() == s2k.Argon2S2K && s2kType != S2KAEAD {\n\t\treturn errors.InvalidArgumentError(\"using Argon2 S2K without AEAD is not allowed\")\n\t}\n\tif params.Mode() != s2k.Argon2S2K && params.Mode() != s2k.IteratedSaltedS2K &&\n\t\tparams.Mode() != s2k.SaltedS2K { // only allowed for high-entropy passphrases\n\t\treturn errors.InvalidArgumentError(\"insecure S2K mode\")\n\t}\n\n\tpriv := bytes.NewBuffer(nil)\n\terr := pk.serializePrivateKey(priv)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tpk.cipher = cipherFunction\n\tpk.s2kParams = params\n\tpk.s2k, err = pk.s2kParams.Function()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tprivateKeyBytes := priv.Bytes()\n\tpk.s2kType = s2kType\n\tblock := pk.cipher.new(key)\n\tswitch s2kType {\n\tcase S2KAEAD:\n\t\tif pk.aead == 0 {\n\t\t\treturn errors.StructuralError(\"aead mode is not set on key\")\n\t\t}\n\t\taead := pk.aead.new(block)\n\t\tadditionalData, err := pk.additionalData()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tpk.iv = make([]byte, aead.NonceSize())\n\t\t_, err = io.ReadFull(rand, pk.iv)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Decrypt the encrypted key material with aead\n\t\tpk.encryptedData = aead.Seal(nil, pk.iv, privateKeyBytes, additionalData)\n\tcase S2KSHA1, S2KCHECKSUM:\n\t\tpk.iv = make([]byte, pk.cipher.blockSize())\n\t\t_, err = io.ReadFull(rand, pk.iv)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcfb := cipher.NewCFBEncrypter(block, pk.iv)\n\t\tif s2kType == S2KSHA1 {\n\t\t\th := sha1.New()\n\t\t\th.Write(privateKeyBytes)\n\t\t\tsum := h.Sum(nil)\n\t\t\tprivateKeyBytes = append(privateKeyBytes, sum...)\n\t\t} else {\n\t\t\tvar sum uint16\n\t\t\tfor _, b := range privateKeyBytes {\n\t\t\t\tsum += uint16(b)\n\t\t\t}\n\t\t\tprivateKeyBytes = append(privateKeyBytes, []byte{uint8(sum >> 8), uint8(sum)}...)\n\t\t}\n\t\tpk.encryptedData = make([]byte, len(privateKeyBytes))\n\t\tcfb.XORKeyStream(pk.encryptedData, privateKeyBytes)\n\tdefault:\n\t\treturn errors.InvalidArgumentError(\"invalid s2k type for encryption\")\n\t}\n\n\tpk.Encrypted = true\n\tpk.PrivateKey = nil\n\treturn err\n}\n\n// EncryptWithConfig encrypts an unencrypted private key using the passphrase and the config.\nfunc (pk *PrivateKey) EncryptWithConfig(passphrase []byte, config *Config) error {\n\tparams, err := s2k.Generate(config.Random(), config.S2K())\n\tif err != nil {\n\t\treturn err\n\t}\n\t// Derive an encryption key with the configured s2k function.\n\tkey := make([]byte, config.Cipher().KeySize())\n\ts2k, err := params.Function()\n\tif err != nil {\n\t\treturn err\n\t}\n\ts2k(key, passphrase)\n\ts2kType := S2KSHA1\n\tif config.AEAD() != nil {\n\t\ts2kType = S2KAEAD\n\t\tpk.aead = config.AEAD().Mode()\n\t\tpk.cipher = config.Cipher()\n\t\tkey = pk.applyHKDF(key)\n\t}\n\t// Encrypt the private key with the derived encryption key.\n\treturn pk.encrypt(key, params, s2kType, config.Cipher(), config.Random())\n}\n\n// EncryptPrivateKeys encrypts all unencrypted keys with the given config and passphrase.\n// Only derives one key from the passphrase, which is then used to encrypt each key.\nfunc EncryptPrivateKeys(keys []*PrivateKey, passphrase []byte, config *Config) error {\n\tparams, err := s2k.Generate(config.Random(), config.S2K())\n\tif err != nil {\n\t\treturn err\n\t}\n\t// Derive an encryption key with the configured s2k function.\n\tencryptionKey := make([]byte, config.Cipher().KeySize())\n\ts2k, err := params.Function()\n\tif err != nil {\n\t\treturn err\n\t}\n\ts2k(encryptionKey, passphrase)\n\tfor _, key := range keys {\n\t\tif key != nil && !key.Dummy() && !key.Encrypted {\n\t\t\ts2kType := S2KSHA1\n\t\t\tif config.AEAD() != nil {\n\t\t\t\ts2kType = S2KAEAD\n\t\t\t\tkey.aead = config.AEAD().Mode()\n\t\t\t\tkey.cipher = config.Cipher()\n\t\t\t\tderivedKey := key.applyHKDF(encryptionKey)\n\t\t\t\terr = key.encrypt(derivedKey, params, s2kType, config.Cipher(), config.Random())\n\t\t\t} else {\n\t\t\t\terr = key.encrypt(encryptionKey, params, s2kType, config.Cipher(), config.Random())\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\n// Encrypt encrypts an unencrypted private key using a passphrase.\nfunc (pk *PrivateKey) Encrypt(passphrase []byte) error {\n\t// Default config of private key encryption\n\tconfig := &Config{\n\t\tS2KConfig: &s2k.Config{\n\t\t\tS2KMode:  s2k.IteratedSaltedS2K,\n\t\t\tS2KCount: 65536,\n\t\t\tHash:     crypto.SHA256,\n\t\t},\n\t\tDefaultCipher: CipherAES256,\n\t}\n\treturn pk.EncryptWithConfig(passphrase, config)\n}\n\nfunc (pk *PrivateKey) serializePrivateKey(w io.Writer) (err error) {\n\tswitch priv := pk.PrivateKey.(type) {\n\tcase *rsa.PrivateKey:\n\t\terr = serializeRSAPrivateKey(w, priv)\n\tcase *dsa.PrivateKey:\n\t\terr = serializeDSAPrivateKey(w, priv)\n\tcase *elgamal.PrivateKey:\n\t\terr = serializeElGamalPrivateKey(w, priv)\n\tcase *ecdsa.PrivateKey:\n\t\terr = serializeECDSAPrivateKey(w, priv)\n\tcase *eddsa.PrivateKey:\n\t\terr = serializeEdDSAPrivateKey(w, priv)\n\tcase *ecdh.PrivateKey:\n\t\terr = serializeECDHPrivateKey(w, priv)\n\tcase *x25519.PrivateKey:\n\t\terr = serializeX25519PrivateKey(w, priv)\n\tcase *x448.PrivateKey:\n\t\terr = serializeX448PrivateKey(w, priv)\n\tcase *ed25519.PrivateKey:\n\t\terr = serializeEd25519PrivateKey(w, priv)\n\tcase *ed448.PrivateKey:\n\t\terr = serializeEd448PrivateKey(w, priv)\n\tdefault:\n\t\terr = errors.InvalidArgumentError(\"unknown private key type\")\n\t}\n\treturn\n}\n\nfunc (pk *PrivateKey) parsePrivateKey(data []byte) (err error) {\n\tswitch pk.PublicKey.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoRSAEncryptOnly:\n\t\treturn pk.parseRSAPrivateKey(data)\n\tcase PubKeyAlgoDSA:\n\t\treturn pk.parseDSAPrivateKey(data)\n\tcase PubKeyAlgoElGamal:\n\t\treturn pk.parseElGamalPrivateKey(data)\n\tcase PubKeyAlgoECDSA:\n\t\treturn pk.parseECDSAPrivateKey(data)\n\tcase PubKeyAlgoECDH:\n\t\treturn pk.parseECDHPrivateKey(data)\n\tcase PubKeyAlgoEdDSA:\n\t\treturn pk.parseEdDSAPrivateKey(data)\n\tcase PubKeyAlgoX25519:\n\t\treturn pk.parseX25519PrivateKey(data)\n\tcase PubKeyAlgoX448:\n\t\treturn pk.parseX448PrivateKey(data)\n\tcase PubKeyAlgoEd25519:\n\t\treturn pk.parseEd25519PrivateKey(data)\n\tcase PubKeyAlgoEd448:\n\t\treturn pk.parseEd448PrivateKey(data)\n\tdefault:\n\t\terr = errors.StructuralError(\"unknown private key type\")\n\t\treturn\n\t}\n}\n\nfunc (pk *PrivateKey) parseRSAPrivateKey(data []byte) (err error) {\n\trsaPub := pk.PublicKey.PublicKey.(*rsa.PublicKey)\n\trsaPriv := new(rsa.PrivateKey)\n\trsaPriv.PublicKey = *rsaPub\n\n\tbuf := bytes.NewBuffer(data)\n\td := new(encoding.MPI)\n\tif _, err := d.ReadFrom(buf); err != nil {\n\t\treturn err\n\t}\n\n\tp := new(encoding.MPI)\n\tif _, err := p.ReadFrom(buf); err != nil {\n\t\treturn err\n\t}\n\n\tq := new(encoding.MPI)\n\tif _, err := q.ReadFrom(buf); err != nil {\n\t\treturn err\n\t}\n\n\trsaPriv.D = new(big.Int).SetBytes(d.Bytes())\n\trsaPriv.Primes = make([]*big.Int, 2)\n\trsaPriv.Primes[0] = new(big.Int).SetBytes(p.Bytes())\n\trsaPriv.Primes[1] = new(big.Int).SetBytes(q.Bytes())\n\tif err := rsaPriv.Validate(); err != nil {\n\t\treturn errors.KeyInvalidError(err.Error())\n\t}\n\trsaPriv.Precompute()\n\tpk.PrivateKey = rsaPriv\n\n\treturn nil\n}\n\nfunc (pk *PrivateKey) parseDSAPrivateKey(data []byte) (err error) {\n\tdsaPub := pk.PublicKey.PublicKey.(*dsa.PublicKey)\n\tdsaPriv := new(dsa.PrivateKey)\n\tdsaPriv.PublicKey = *dsaPub\n\n\tbuf := bytes.NewBuffer(data)\n\tx := new(encoding.MPI)\n\tif _, err := x.ReadFrom(buf); err != nil {\n\t\treturn err\n\t}\n\n\tdsaPriv.X = new(big.Int).SetBytes(x.Bytes())\n\tif err := validateDSAParameters(dsaPriv); err != nil {\n\t\treturn err\n\t}\n\tpk.PrivateKey = dsaPriv\n\n\treturn nil\n}\n\nfunc (pk *PrivateKey) parseElGamalPrivateKey(data []byte) (err error) {\n\tpub := pk.PublicKey.PublicKey.(*elgamal.PublicKey)\n\tpriv := new(elgamal.PrivateKey)\n\tpriv.PublicKey = *pub\n\n\tbuf := bytes.NewBuffer(data)\n\tx := new(encoding.MPI)\n\tif _, err := x.ReadFrom(buf); err != nil {\n\t\treturn err\n\t}\n\n\tpriv.X = new(big.Int).SetBytes(x.Bytes())\n\tif err := validateElGamalParameters(priv); err != nil {\n\t\treturn err\n\t}\n\tpk.PrivateKey = priv\n\n\treturn nil\n}\n\nfunc (pk *PrivateKey) parseECDSAPrivateKey(data []byte) (err error) {\n\tecdsaPub := pk.PublicKey.PublicKey.(*ecdsa.PublicKey)\n\tecdsaPriv := ecdsa.NewPrivateKey(*ecdsaPub)\n\n\tbuf := bytes.NewBuffer(data)\n\td := new(encoding.MPI)\n\tif _, err := d.ReadFrom(buf); err != nil {\n\t\treturn err\n\t}\n\n\tif err := ecdsaPriv.UnmarshalIntegerSecret(d.Bytes()); err != nil {\n\t\treturn err\n\t}\n\tif err := ecdsa.Validate(ecdsaPriv); err != nil {\n\t\treturn err\n\t}\n\tpk.PrivateKey = ecdsaPriv\n\n\treturn nil\n}\n\nfunc (pk *PrivateKey) parseECDHPrivateKey(data []byte) (err error) {\n\tecdhPub := pk.PublicKey.PublicKey.(*ecdh.PublicKey)\n\tecdhPriv := ecdh.NewPrivateKey(*ecdhPub)\n\n\tbuf := bytes.NewBuffer(data)\n\td := new(encoding.MPI)\n\tif _, err := d.ReadFrom(buf); err != nil {\n\t\treturn err\n\t}\n\n\tif err := ecdhPriv.UnmarshalByteSecret(d.Bytes()); err != nil {\n\t\treturn err\n\t}\n\n\tif err := ecdh.Validate(ecdhPriv); err != nil {\n\t\treturn err\n\t}\n\n\tpk.PrivateKey = ecdhPriv\n\n\treturn nil\n}\n\nfunc (pk *PrivateKey) parseX25519PrivateKey(data []byte) (err error) {\n\tpublicKey := pk.PublicKey.PublicKey.(*x25519.PublicKey)\n\tprivateKey := x25519.NewPrivateKey(*publicKey)\n\tprivateKey.PublicKey = *publicKey\n\n\tprivateKey.Secret = make([]byte, x25519.KeySize)\n\n\tif len(data) != x25519.KeySize {\n\t\terr = errors.StructuralError(\"wrong x25519 key size\")\n\t\treturn err\n\t}\n\tsubtle.ConstantTimeCopy(1, privateKey.Secret, data)\n\tif err = x25519.Validate(privateKey); err != nil {\n\t\treturn err\n\t}\n\tpk.PrivateKey = privateKey\n\treturn nil\n}\n\nfunc (pk *PrivateKey) parseX448PrivateKey(data []byte) (err error) {\n\tpublicKey := pk.PublicKey.PublicKey.(*x448.PublicKey)\n\tprivateKey := x448.NewPrivateKey(*publicKey)\n\tprivateKey.PublicKey = *publicKey\n\n\tprivateKey.Secret = make([]byte, x448.KeySize)\n\n\tif len(data) != x448.KeySize {\n\t\terr = errors.StructuralError(\"wrong x448 key size\")\n\t\treturn err\n\t}\n\tsubtle.ConstantTimeCopy(1, privateKey.Secret, data)\n\tif err = x448.Validate(privateKey); err != nil {\n\t\treturn err\n\t}\n\tpk.PrivateKey = privateKey\n\treturn nil\n}\n\nfunc (pk *PrivateKey) parseEd25519PrivateKey(data []byte) (err error) {\n\tpublicKey := pk.PublicKey.PublicKey.(*ed25519.PublicKey)\n\tprivateKey := ed25519.NewPrivateKey(*publicKey)\n\tprivateKey.PublicKey = *publicKey\n\n\tif len(data) != ed25519.SeedSize {\n\t\terr = errors.StructuralError(\"wrong ed25519 key size\")\n\t\treturn err\n\t}\n\terr = privateKey.UnmarshalByteSecret(data)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = ed25519.Validate(privateKey)\n\tif err != nil {\n\t\treturn err\n\t}\n\tpk.PrivateKey = privateKey\n\treturn nil\n}\n\nfunc (pk *PrivateKey) parseEd448PrivateKey(data []byte) (err error) {\n\tpublicKey := pk.PublicKey.PublicKey.(*ed448.PublicKey)\n\tprivateKey := ed448.NewPrivateKey(*publicKey)\n\tprivateKey.PublicKey = *publicKey\n\n\tif len(data) != ed448.SeedSize {\n\t\terr = errors.StructuralError(\"wrong ed448 key size\")\n\t\treturn err\n\t}\n\terr = privateKey.UnmarshalByteSecret(data)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = ed448.Validate(privateKey)\n\tif err != nil {\n\t\treturn err\n\t}\n\tpk.PrivateKey = privateKey\n\treturn nil\n}\n\nfunc (pk *PrivateKey) parseEdDSAPrivateKey(data []byte) (err error) {\n\teddsaPub := pk.PublicKey.PublicKey.(*eddsa.PublicKey)\n\teddsaPriv := eddsa.NewPrivateKey(*eddsaPub)\n\teddsaPriv.PublicKey = *eddsaPub\n\n\tbuf := bytes.NewBuffer(data)\n\td := new(encoding.MPI)\n\tif _, err := d.ReadFrom(buf); err != nil {\n\t\treturn err\n\t}\n\n\tif err = eddsaPriv.UnmarshalByteSecret(d.Bytes()); err != nil {\n\t\treturn err\n\t}\n\n\tif err := eddsa.Validate(eddsaPriv); err != nil {\n\t\treturn err\n\t}\n\n\tpk.PrivateKey = eddsaPriv\n\n\treturn nil\n}\n\nfunc (pk *PrivateKey) additionalData() ([]byte, error) {\n\tadditionalData := bytes.NewBuffer(nil)\n\t// Write additional data prefix based on packet type\n\tvar packetByte byte\n\tif pk.PublicKey.IsSubkey {\n\t\tpacketByte = 0xc7\n\t} else {\n\t\tpacketByte = 0xc5\n\t}\n\t// Write public key to additional data\n\t_, err := additionalData.Write([]byte{packetByte})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = pk.PublicKey.serializeWithoutHeaders(additionalData)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn additionalData.Bytes(), nil\n}\n\nfunc (pk *PrivateKey) applyHKDF(inputKey []byte) []byte {\n\tvar packetByte byte\n\tif pk.PublicKey.IsSubkey {\n\t\tpacketByte = 0xc7\n\t} else {\n\t\tpacketByte = 0xc5\n\t}\n\tassociatedData := []byte{packetByte, byte(pk.Version), byte(pk.cipher), byte(pk.aead)}\n\thkdfReader := hkdf.New(sha256.New, inputKey, []byte{}, associatedData)\n\tencryptionKey := make([]byte, pk.cipher.KeySize())\n\t_, _ = readFull(hkdfReader, encryptionKey)\n\treturn encryptionKey\n}\n\nfunc validateDSAParameters(priv *dsa.PrivateKey) error {\n\tp := priv.P // group prime\n\tq := priv.Q // subgroup order\n\tg := priv.G // g has order q mod p\n\tx := priv.X // secret\n\ty := priv.Y // y == g**x mod p\n\tone := big.NewInt(1)\n\t// expect g, y >= 2 and g < p\n\tif g.Cmp(one) <= 0 || y.Cmp(one) <= 0 || g.Cmp(p) > 0 {\n\t\treturn errors.KeyInvalidError(\"dsa: invalid group\")\n\t}\n\t// expect p > q\n\tif p.Cmp(q) <= 0 {\n\t\treturn errors.KeyInvalidError(\"dsa: invalid group prime\")\n\t}\n\t// q should be large enough and divide p-1\n\tpSub1 := new(big.Int).Sub(p, one)\n\tif q.BitLen() < 150 || new(big.Int).Mod(pSub1, q).Cmp(big.NewInt(0)) != 0 {\n\t\treturn errors.KeyInvalidError(\"dsa: invalid order\")\n\t}\n\t// confirm that g has order q mod p\n\tif !q.ProbablyPrime(32) || new(big.Int).Exp(g, q, p).Cmp(one) != 0 {\n\t\treturn errors.KeyInvalidError(\"dsa: invalid order\")\n\t}\n\t// check y\n\tif new(big.Int).Exp(g, x, p).Cmp(y) != 0 {\n\t\treturn errors.KeyInvalidError(\"dsa: mismatching values\")\n\t}\n\n\treturn nil\n}\n\nfunc validateElGamalParameters(priv *elgamal.PrivateKey) error {\n\tp := priv.P // group prime\n\tg := priv.G // g has order p-1 mod p\n\tx := priv.X // secret\n\ty := priv.Y // y == g**x mod p\n\tone := big.NewInt(1)\n\t// Expect g, y >= 2 and g < p\n\tif g.Cmp(one) <= 0 || y.Cmp(one) <= 0 || g.Cmp(p) > 0 {\n\t\treturn errors.KeyInvalidError(\"elgamal: invalid group\")\n\t}\n\tif p.BitLen() < 1024 {\n\t\treturn errors.KeyInvalidError(\"elgamal: group order too small\")\n\t}\n\tpSub1 := new(big.Int).Sub(p, one)\n\tif new(big.Int).Exp(g, pSub1, p).Cmp(one) != 0 {\n\t\treturn errors.KeyInvalidError(\"elgamal: invalid group\")\n\t}\n\t// Since p-1 is not prime, g might have a smaller order that divides p-1.\n\t// We cannot confirm the exact order of g, but we make sure it is not too small.\n\tgExpI := new(big.Int).Set(g)\n\ti := 1\n\tthreshold := 2 << 17 // we want order > threshold\n\tfor i < threshold {\n\t\ti++ // we check every order to make sure key validation is not easily bypassed by guessing y'\n\t\tgExpI.Mod(new(big.Int).Mul(gExpI, g), p)\n\t\tif gExpI.Cmp(one) == 0 {\n\t\t\treturn errors.KeyInvalidError(\"elgamal: order too small\")\n\t\t}\n\t}\n\t// Check y\n\tif new(big.Int).Exp(g, x, p).Cmp(y) != 0 {\n\t\treturn errors.KeyInvalidError(\"elgamal: mismatching values\")\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key_test_data.go",
    "content": "package packet\n\n// Generated with `gpg --export-secret-keys \"Test Key 2\"`\nconst privKeyRSAHex = \"9501fe044cc349a8010400b70ca0010e98c090008d45d1ee8f9113bd5861fd57b88bacb7c68658747663f1e1a3b5a98f32fda6472373c024b97359cd2efc88ff60f77751adfbf6af5e615e6a1408cfad8bf0cea30b0d5f53aa27ad59089ba9b15b7ebc2777a25d7b436144027e3bcd203909f147d0e332b240cf63d3395f5dfe0df0a6c04e8655af7eacdf0011010001fe0303024a252e7d475fd445607de39a265472aa74a9320ba2dac395faa687e9e0336aeb7e9a7397e511b5afd9dc84557c80ac0f3d4d7bfec5ae16f20d41c8c84a04552a33870b930420e230e179564f6d19bb153145e76c33ae993886c388832b0fa042ddda7f133924f3854481533e0ede31d51278c0519b29abc3bf53da673e13e3e1214b52413d179d7f66deee35cac8eacb060f78379d70ef4af8607e68131ff529439668fc39c9ce6dfef8a5ac234d234802cbfb749a26107db26406213ae5c06d4673253a3cbee1fcbae58d6ab77e38d6e2c0e7c6317c48e054edadb5a40d0d48acb44643d998139a8a66bb820be1f3f80185bc777d14b5954b60effe2448a036d565c6bc0b915fcea518acdd20ab07bc1529f561c58cd044f723109b93f6fd99f876ff891d64306b5d08f48bab59f38695e9109c4dec34013ba3153488ce070268381ba923ee1eb77125b36afcb4347ec3478c8f2735b06ef17351d872e577fa95d0c397c88c71b59629a36aec\"\n\n// Generated by `gpg --export-secret-keys` followed by a manual extraction of\n// the ElGamal subkey from the packets.\nconst privKeyElGamalHex = \"9d0157044df9ee1a100400eb8e136a58ec39b582629cdadf830bc64e0a94ed8103ca8bb247b27b11b46d1d25297ef4bcc3071785ba0c0bedfe89eabc5287fcc0edf81ab5896c1c8e4b20d27d79813c7aede75320b33eaeeaa586edc00fd1036c10133e6ba0ff277245d0d59d04b2b3421b7244aca5f4a8d870c6f1c1fbff9e1c26699a860b9504f35ca1d700030503fd1ededd3b840795be6d9ccbe3c51ee42e2f39233c432b831ddd9c4e72b7025a819317e47bf94f9ee316d7273b05d5fcf2999c3a681f519b1234bbfa6d359b4752bd9c3f77d6b6456cde152464763414ca130f4e91d91041432f90620fec0e6d6b5116076c2985d5aeaae13be492b9b329efcaf7ee25120159a0a30cd976b42d7afe030302dae7eb80db744d4960c4df930d57e87fe81412eaace9f900e6c839817a614ddb75ba6603b9417c33ea7b6c93967dfa2bcff3fa3c74a5ce2c962db65b03aece14c96cbd0038fc\"\n\n// pkcs1PrivKeyHex is a PKCS#1, RSA private key.\n// Generated by `openssl genrsa 1024 | openssl rsa -outform DER  | xxd -p`\nconst pkcs1PrivKeyHex = \"3082025d02010002818100e98edfa1c3b35884a54d0b36a6a603b0290fa85e49e30fa23fc94fef9c6790bc4849928607aa48d809da326fb42a969d06ad756b98b9c1a90f5d4a2b6d0ac05953c97f4da3120164a21a679793ce181c906dc01d235cc085ddcdf6ea06c389b6ab8885dfd685959e693138856a68a7e5db263337ff82a088d583a897cf2d59e9020301000102818100b6d5c9eb70b02d5369b3ee5b520a14490b5bde8a317d36f7e4c74b7460141311d1e5067735f8f01d6f5908b2b96fbd881f7a1ab9a84d82753e39e19e2d36856be960d05ac9ef8e8782ea1b6d65aee28fdfe1d61451e8cff0adfe84322f12cf455028b581cf60eb9e0e140ba5d21aeba6c2634d7c65318b9a665fc01c3191ca21024100fa5e818da3705b0fa33278bb28d4b6f6050388af2d4b75ec9375dd91ccf2e7d7068086a8b82a8f6282e4fbbdb8a7f2622eb97295249d87acea7f5f816f54d347024100eecf9406d7dc49cdfb95ab1eff4064de84c7a30f64b2798936a0d2018ba9eb52e4b636f82e96c49cc63b80b675e91e40d1b2e4017d4b9adaf33ab3d9cf1c214f024100c173704ace742c082323066226a4655226819a85304c542b9dacbeacbf5d1881ee863485fcf6f59f3a604f9b42289282067447f2b13dfeed3eab7851fc81e0550240741fc41f3fc002b382eed8730e33c5d8de40256e4accee846667f536832f711ab1d4590e7db91a8a116ac5bff3be13d3f9243ff2e976662aa9b395d907f8e9c9024046a5696c9ef882363e06c9fa4e2f5b580906452befba03f4a99d0f873697ef1f851d2226ca7934b30b7c3e80cb634a67172bbbf4781735fe3e09263e2dd723e7\"\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/public_key.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"crypto/dsa\"\n\t\"crypto/rsa\"\n\t\"crypto/sha1\"\n\t\"crypto/sha256\"\n\t_ \"crypto/sha512\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"hash\"\n\t\"io\"\n\t\"math/big\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/ecdh\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/ecdsa\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/ed25519\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/ed448\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/eddsa\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/elgamal\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/algorithm\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/ecc\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/encoding\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/x25519\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/x448\"\n)\n\n// PublicKey represents an OpenPGP public key. See RFC 4880, section 5.5.2.\ntype PublicKey struct {\n\tVersion      int\n\tCreationTime time.Time\n\tPubKeyAlgo   PublicKeyAlgorithm\n\tPublicKey    interface{} // *rsa.PublicKey, *dsa.PublicKey, *ecdsa.PublicKey or *eddsa.PublicKey, *x25519.PublicKey, *x448.PublicKey, *ed25519.PublicKey, *ed448.PublicKey\n\tFingerprint  []byte\n\tKeyId        uint64\n\tIsSubkey     bool\n\n\t// RFC 4880 fields\n\tn, e, p, q, g, y encoding.Field\n\n\t// RFC 6637 fields\n\t// oid contains the OID byte sequence identifying the elliptic curve used\n\toid encoding.Field\n\n\t// kdf stores key derivation function parameters\n\t// used for ECDH encryption. See RFC 6637, Section 9.\n\tkdf encoding.Field\n}\n\n// UpgradeToV5 updates the version of the key to v5, and updates all necessary\n// fields.\nfunc (pk *PublicKey) UpgradeToV5() {\n\tpk.Version = 5\n\tpk.setFingerprintAndKeyId()\n}\n\n// UpgradeToV6 updates the version of the key to v6, and updates all necessary\n// fields.\nfunc (pk *PublicKey) UpgradeToV6() error {\n\tpk.Version = 6\n\tpk.setFingerprintAndKeyId()\n\treturn pk.checkV6Compatibility()\n}\n\n// signingKey provides a convenient abstraction over signature verification\n// for v3 and v4 public keys.\ntype signingKey interface {\n\tSerializeForHash(io.Writer) error\n\tSerializeSignaturePrefix(io.Writer) error\n\tserializeWithoutHeaders(io.Writer) error\n}\n\n// NewRSAPublicKey returns a PublicKey that wraps the given rsa.PublicKey.\nfunc NewRSAPublicKey(creationTime time.Time, pub *rsa.PublicKey) *PublicKey {\n\tpk := &PublicKey{\n\t\tVersion:      4,\n\t\tCreationTime: creationTime,\n\t\tPubKeyAlgo:   PubKeyAlgoRSA,\n\t\tPublicKey:    pub,\n\t\tn:            new(encoding.MPI).SetBig(pub.N),\n\t\te:            new(encoding.MPI).SetBig(big.NewInt(int64(pub.E))),\n\t}\n\n\tpk.setFingerprintAndKeyId()\n\treturn pk\n}\n\n// NewDSAPublicKey returns a PublicKey that wraps the given dsa.PublicKey.\nfunc NewDSAPublicKey(creationTime time.Time, pub *dsa.PublicKey) *PublicKey {\n\tpk := &PublicKey{\n\t\tVersion:      4,\n\t\tCreationTime: creationTime,\n\t\tPubKeyAlgo:   PubKeyAlgoDSA,\n\t\tPublicKey:    pub,\n\t\tp:            new(encoding.MPI).SetBig(pub.P),\n\t\tq:            new(encoding.MPI).SetBig(pub.Q),\n\t\tg:            new(encoding.MPI).SetBig(pub.G),\n\t\ty:            new(encoding.MPI).SetBig(pub.Y),\n\t}\n\n\tpk.setFingerprintAndKeyId()\n\treturn pk\n}\n\n// NewElGamalPublicKey returns a PublicKey that wraps the given elgamal.PublicKey.\nfunc NewElGamalPublicKey(creationTime time.Time, pub *elgamal.PublicKey) *PublicKey {\n\tpk := &PublicKey{\n\t\tVersion:      4,\n\t\tCreationTime: creationTime,\n\t\tPubKeyAlgo:   PubKeyAlgoElGamal,\n\t\tPublicKey:    pub,\n\t\tp:            new(encoding.MPI).SetBig(pub.P),\n\t\tg:            new(encoding.MPI).SetBig(pub.G),\n\t\ty:            new(encoding.MPI).SetBig(pub.Y),\n\t}\n\n\tpk.setFingerprintAndKeyId()\n\treturn pk\n}\n\nfunc NewECDSAPublicKey(creationTime time.Time, pub *ecdsa.PublicKey) *PublicKey {\n\tpk := &PublicKey{\n\t\tVersion:      4,\n\t\tCreationTime: creationTime,\n\t\tPubKeyAlgo:   PubKeyAlgoECDSA,\n\t\tPublicKey:    pub,\n\t\tp:            encoding.NewMPI(pub.MarshalPoint()),\n\t}\n\n\tcurveInfo := ecc.FindByCurve(pub.GetCurve())\n\tif curveInfo == nil {\n\t\tpanic(\"unknown elliptic curve\")\n\t}\n\tpk.oid = curveInfo.Oid\n\tpk.setFingerprintAndKeyId()\n\treturn pk\n}\n\nfunc NewECDHPublicKey(creationTime time.Time, pub *ecdh.PublicKey) *PublicKey {\n\tvar pk *PublicKey\n\tvar kdf = encoding.NewOID([]byte{0x1, pub.Hash.Id(), pub.Cipher.Id()})\n\tpk = &PublicKey{\n\t\tVersion:      4,\n\t\tCreationTime: creationTime,\n\t\tPubKeyAlgo:   PubKeyAlgoECDH,\n\t\tPublicKey:    pub,\n\t\tp:            encoding.NewMPI(pub.MarshalPoint()),\n\t\tkdf:          kdf,\n\t}\n\n\tcurveInfo := ecc.FindByCurve(pub.GetCurve())\n\n\tif curveInfo == nil {\n\t\tpanic(\"unknown elliptic curve\")\n\t}\n\n\tpk.oid = curveInfo.Oid\n\tpk.setFingerprintAndKeyId()\n\treturn pk\n}\n\nfunc NewEdDSAPublicKey(creationTime time.Time, pub *eddsa.PublicKey) *PublicKey {\n\tcurveInfo := ecc.FindByCurve(pub.GetCurve())\n\tpk := &PublicKey{\n\t\tVersion:      4,\n\t\tCreationTime: creationTime,\n\t\tPubKeyAlgo:   PubKeyAlgoEdDSA,\n\t\tPublicKey:    pub,\n\t\toid:          curveInfo.Oid,\n\t\t// Native point format, see draft-koch-eddsa-for-openpgp-04, Appendix B\n\t\tp: encoding.NewMPI(pub.MarshalPoint()),\n\t}\n\n\tpk.setFingerprintAndKeyId()\n\treturn pk\n}\n\nfunc NewX25519PublicKey(creationTime time.Time, pub *x25519.PublicKey) *PublicKey {\n\tpk := &PublicKey{\n\t\tVersion:      4,\n\t\tCreationTime: creationTime,\n\t\tPubKeyAlgo:   PubKeyAlgoX25519,\n\t\tPublicKey:    pub,\n\t}\n\n\tpk.setFingerprintAndKeyId()\n\treturn pk\n}\n\nfunc NewX448PublicKey(creationTime time.Time, pub *x448.PublicKey) *PublicKey {\n\tpk := &PublicKey{\n\t\tVersion:      4,\n\t\tCreationTime: creationTime,\n\t\tPubKeyAlgo:   PubKeyAlgoX448,\n\t\tPublicKey:    pub,\n\t}\n\n\tpk.setFingerprintAndKeyId()\n\treturn pk\n}\n\nfunc NewEd25519PublicKey(creationTime time.Time, pub *ed25519.PublicKey) *PublicKey {\n\tpk := &PublicKey{\n\t\tVersion:      4,\n\t\tCreationTime: creationTime,\n\t\tPubKeyAlgo:   PubKeyAlgoEd25519,\n\t\tPublicKey:    pub,\n\t}\n\n\tpk.setFingerprintAndKeyId()\n\treturn pk\n}\n\nfunc NewEd448PublicKey(creationTime time.Time, pub *ed448.PublicKey) *PublicKey {\n\tpk := &PublicKey{\n\t\tVersion:      4,\n\t\tCreationTime: creationTime,\n\t\tPubKeyAlgo:   PubKeyAlgoEd448,\n\t\tPublicKey:    pub,\n\t}\n\n\tpk.setFingerprintAndKeyId()\n\treturn pk\n}\n\nfunc (pk *PublicKey) parse(r io.Reader) (err error) {\n\t// RFC 4880, section 5.5.2\n\tvar buf [6]byte\n\t_, err = readFull(r, buf[:])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tpk.Version = int(buf[0])\n\tif pk.Version != 4 && pk.Version != 5 && pk.Version != 6 {\n\t\treturn errors.UnsupportedError(\"public key version \" + strconv.Itoa(int(buf[0])))\n\t}\n\n\tif V5Disabled && pk.Version == 5 {\n\t\treturn errors.UnsupportedError(\"support for parsing v5 entities is disabled; build with `-tags v5` if needed\")\n\t}\n\n\tif pk.Version >= 5 {\n\t\t// Read the four-octet scalar octet count\n\t\t// The count is not used in this implementation\n\t\tvar n [4]byte\n\t\t_, err = readFull(r, n[:])\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\tpk.CreationTime = time.Unix(int64(uint32(buf[1])<<24|uint32(buf[2])<<16|uint32(buf[3])<<8|uint32(buf[4])), 0)\n\tpk.PubKeyAlgo = PublicKeyAlgorithm(buf[5])\n\t// Ignore four-ocet length\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:\n\t\terr = pk.parseRSA(r)\n\tcase PubKeyAlgoDSA:\n\t\terr = pk.parseDSA(r)\n\tcase PubKeyAlgoElGamal:\n\t\terr = pk.parseElGamal(r)\n\tcase PubKeyAlgoECDSA:\n\t\terr = pk.parseECDSA(r)\n\tcase PubKeyAlgoECDH:\n\t\terr = pk.parseECDH(r)\n\tcase PubKeyAlgoEdDSA:\n\t\terr = pk.parseEdDSA(r)\n\tcase PubKeyAlgoX25519:\n\t\terr = pk.parseX25519(r)\n\tcase PubKeyAlgoX448:\n\t\terr = pk.parseX448(r)\n\tcase PubKeyAlgoEd25519:\n\t\terr = pk.parseEd25519(r)\n\tcase PubKeyAlgoEd448:\n\t\terr = pk.parseEd448(r)\n\tdefault:\n\t\terr = errors.UnsupportedError(\"public key type: \" + strconv.Itoa(int(pk.PubKeyAlgo)))\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\n\tpk.setFingerprintAndKeyId()\n\treturn\n}\n\nfunc (pk *PublicKey) setFingerprintAndKeyId() {\n\t// RFC 4880, section 12.2\n\tif pk.Version >= 5 {\n\t\tfingerprint := sha256.New()\n\t\tif err := pk.SerializeForHash(fingerprint); err != nil {\n\t\t\t// Should not happen for a hash.\n\t\t\tpanic(err)\n\t\t}\n\t\tpk.Fingerprint = make([]byte, 32)\n\t\tcopy(pk.Fingerprint, fingerprint.Sum(nil))\n\t\tpk.KeyId = binary.BigEndian.Uint64(pk.Fingerprint[:8])\n\t} else {\n\t\tfingerprint := sha1.New()\n\t\tif err := pk.SerializeForHash(fingerprint); err != nil {\n\t\t\t// Should not happen for a hash.\n\t\t\tpanic(err)\n\t\t}\n\t\tpk.Fingerprint = make([]byte, 20)\n\t\tcopy(pk.Fingerprint, fingerprint.Sum(nil))\n\t\tpk.KeyId = binary.BigEndian.Uint64(pk.Fingerprint[12:20])\n\t}\n}\n\nfunc (pk *PublicKey) checkV6Compatibility() error {\n\t// Implementations MUST NOT accept or generate version 6 key material using the deprecated OIDs.\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoECDH:\n\t\tcurveInfo := ecc.FindByOid(pk.oid)\n\t\tif curveInfo == nil {\n\t\t\treturn errors.UnsupportedError(fmt.Sprintf(\"unknown oid: %x\", pk.oid))\n\t\t}\n\t\tif curveInfo.GenName == ecc.Curve25519GenName {\n\t\t\treturn errors.StructuralError(\"cannot generate v6 key with deprecated OID: Curve25519Legacy\")\n\t\t}\n\tcase PubKeyAlgoEdDSA:\n\t\treturn errors.StructuralError(\"cannot generate v6 key with deprecated algorithm: EdDSALegacy\")\n\t}\n\treturn nil\n}\n\n// parseRSA parses RSA public key material from the given Reader. See RFC 4880,\n// section 5.5.2.\nfunc (pk *PublicKey) parseRSA(r io.Reader) (err error) {\n\tpk.n = new(encoding.MPI)\n\tif _, err = pk.n.ReadFrom(r); err != nil {\n\t\treturn\n\t}\n\tpk.e = new(encoding.MPI)\n\tif _, err = pk.e.ReadFrom(r); err != nil {\n\t\treturn\n\t}\n\n\tif len(pk.e.Bytes()) > 3 {\n\t\terr = errors.UnsupportedError(\"large public exponent\")\n\t\treturn\n\t}\n\trsa := &rsa.PublicKey{\n\t\tN: new(big.Int).SetBytes(pk.n.Bytes()),\n\t\tE: 0,\n\t}\n\tfor i := 0; i < len(pk.e.Bytes()); i++ {\n\t\trsa.E <<= 8\n\t\trsa.E |= int(pk.e.Bytes()[i])\n\t}\n\tpk.PublicKey = rsa\n\treturn\n}\n\n// parseDSA parses DSA public key material from the given Reader. See RFC 4880,\n// section 5.5.2.\nfunc (pk *PublicKey) parseDSA(r io.Reader) (err error) {\n\tpk.p = new(encoding.MPI)\n\tif _, err = pk.p.ReadFrom(r); err != nil {\n\t\treturn\n\t}\n\tpk.q = new(encoding.MPI)\n\tif _, err = pk.q.ReadFrom(r); err != nil {\n\t\treturn\n\t}\n\tpk.g = new(encoding.MPI)\n\tif _, err = pk.g.ReadFrom(r); err != nil {\n\t\treturn\n\t}\n\tpk.y = new(encoding.MPI)\n\tif _, err = pk.y.ReadFrom(r); err != nil {\n\t\treturn\n\t}\n\n\tdsa := new(dsa.PublicKey)\n\tdsa.P = new(big.Int).SetBytes(pk.p.Bytes())\n\tdsa.Q = new(big.Int).SetBytes(pk.q.Bytes())\n\tdsa.G = new(big.Int).SetBytes(pk.g.Bytes())\n\tdsa.Y = new(big.Int).SetBytes(pk.y.Bytes())\n\tpk.PublicKey = dsa\n\treturn\n}\n\n// parseElGamal parses ElGamal public key material from the given Reader. See\n// RFC 4880, section 5.5.2.\nfunc (pk *PublicKey) parseElGamal(r io.Reader) (err error) {\n\tpk.p = new(encoding.MPI)\n\tif _, err = pk.p.ReadFrom(r); err != nil {\n\t\treturn\n\t}\n\tpk.g = new(encoding.MPI)\n\tif _, err = pk.g.ReadFrom(r); err != nil {\n\t\treturn\n\t}\n\tpk.y = new(encoding.MPI)\n\tif _, err = pk.y.ReadFrom(r); err != nil {\n\t\treturn\n\t}\n\n\telgamal := new(elgamal.PublicKey)\n\telgamal.P = new(big.Int).SetBytes(pk.p.Bytes())\n\telgamal.G = new(big.Int).SetBytes(pk.g.Bytes())\n\telgamal.Y = new(big.Int).SetBytes(pk.y.Bytes())\n\tpk.PublicKey = elgamal\n\treturn\n}\n\n// parseECDSA parses ECDSA public key material from the given Reader. See\n// RFC 6637, Section 9.\nfunc (pk *PublicKey) parseECDSA(r io.Reader) (err error) {\n\tpk.oid = new(encoding.OID)\n\tif _, err = pk.oid.ReadFrom(r); err != nil {\n\t\treturn\n\t}\n\n\tcurveInfo := ecc.FindByOid(pk.oid)\n\tif curveInfo == nil {\n\t\treturn errors.UnsupportedError(fmt.Sprintf(\"unknown oid: %x\", pk.oid))\n\t}\n\n\tpk.p = new(encoding.MPI)\n\tif _, err = pk.p.ReadFrom(r); err != nil {\n\t\treturn\n\t}\n\n\tc, ok := curveInfo.Curve.(ecc.ECDSACurve)\n\tif !ok {\n\t\treturn errors.UnsupportedError(fmt.Sprintf(\"unsupported oid: %x\", pk.oid))\n\t}\n\n\tecdsaKey := ecdsa.NewPublicKey(c)\n\terr = ecdsaKey.UnmarshalPoint(pk.p.Bytes())\n\tpk.PublicKey = ecdsaKey\n\n\treturn\n}\n\n// parseECDH parses ECDH public key material from the given Reader. See\n// RFC 6637, Section 9.\nfunc (pk *PublicKey) parseECDH(r io.Reader) (err error) {\n\tpk.oid = new(encoding.OID)\n\tif _, err = pk.oid.ReadFrom(r); err != nil {\n\t\treturn\n\t}\n\n\tcurveInfo := ecc.FindByOid(pk.oid)\n\tif curveInfo == nil {\n\t\treturn errors.UnsupportedError(fmt.Sprintf(\"unknown oid: %x\", pk.oid))\n\t}\n\n\tif pk.Version == 6 && curveInfo.GenName == ecc.Curve25519GenName {\n\t\t// Implementations MUST NOT accept or generate version 6 key material using the deprecated OIDs.\n\t\treturn errors.StructuralError(\"cannot read v6 key with deprecated OID: Curve25519Legacy\")\n\t}\n\n\tpk.p = new(encoding.MPI)\n\tif _, err = pk.p.ReadFrom(r); err != nil {\n\t\treturn\n\t}\n\tpk.kdf = new(encoding.OID)\n\tif _, err = pk.kdf.ReadFrom(r); err != nil {\n\t\treturn\n\t}\n\n\tc, ok := curveInfo.Curve.(ecc.ECDHCurve)\n\tif !ok {\n\t\treturn errors.UnsupportedError(fmt.Sprintf(\"unsupported oid: %x\", pk.oid))\n\t}\n\n\tif kdfLen := len(pk.kdf.Bytes()); kdfLen < 3 {\n\t\treturn errors.UnsupportedError(\"unsupported ECDH KDF length: \" + strconv.Itoa(kdfLen))\n\t}\n\tif reserved := pk.kdf.Bytes()[0]; reserved != 0x01 {\n\t\treturn errors.UnsupportedError(\"unsupported KDF reserved field: \" + strconv.Itoa(int(reserved)))\n\t}\n\tkdfHash, ok := algorithm.HashById[pk.kdf.Bytes()[1]]\n\tif !ok {\n\t\treturn errors.UnsupportedError(\"unsupported ECDH KDF hash: \" + strconv.Itoa(int(pk.kdf.Bytes()[1])))\n\t}\n\tkdfCipher, ok := algorithm.CipherById[pk.kdf.Bytes()[2]]\n\tif !ok {\n\t\treturn errors.UnsupportedError(\"unsupported ECDH KDF cipher: \" + strconv.Itoa(int(pk.kdf.Bytes()[2])))\n\t}\n\n\tecdhKey := ecdh.NewPublicKey(c, kdfHash, kdfCipher)\n\terr = ecdhKey.UnmarshalPoint(pk.p.Bytes())\n\tpk.PublicKey = ecdhKey\n\n\treturn\n}\n\nfunc (pk *PublicKey) parseEdDSA(r io.Reader) (err error) {\n\tif pk.Version == 6 {\n\t\t// Implementations MUST NOT accept or generate version 6 key material using the deprecated OIDs.\n\t\treturn errors.StructuralError(\"cannot generate v6 key with deprecated algorithm: EdDSALegacy\")\n\t}\n\n\tpk.oid = new(encoding.OID)\n\tif _, err = pk.oid.ReadFrom(r); err != nil {\n\t\treturn\n\t}\n\n\tcurveInfo := ecc.FindByOid(pk.oid)\n\tif curveInfo == nil {\n\t\treturn errors.UnsupportedError(fmt.Sprintf(\"unknown oid: %x\", pk.oid))\n\t}\n\n\tc, ok := curveInfo.Curve.(ecc.EdDSACurve)\n\tif !ok {\n\t\treturn errors.UnsupportedError(fmt.Sprintf(\"unsupported oid: %x\", pk.oid))\n\t}\n\n\tpk.p = new(encoding.MPI)\n\tif _, err = pk.p.ReadFrom(r); err != nil {\n\t\treturn\n\t}\n\n\tif len(pk.p.Bytes()) == 0 {\n\t\treturn errors.StructuralError(\"empty EdDSA public key\")\n\t}\n\n\tpub := eddsa.NewPublicKey(c)\n\n\tswitch flag := pk.p.Bytes()[0]; flag {\n\tcase 0x04:\n\t\t// TODO: see _grcy_ecc_eddsa_ensure_compact in grcypt\n\t\treturn errors.UnsupportedError(\"unsupported EdDSA compression: \" + strconv.Itoa(int(flag)))\n\tcase 0x40:\n\t\terr = pub.UnmarshalPoint(pk.p.Bytes())\n\tdefault:\n\t\treturn errors.UnsupportedError(\"unsupported EdDSA compression: \" + strconv.Itoa(int(flag)))\n\t}\n\n\tpk.PublicKey = pub\n\treturn\n}\n\nfunc (pk *PublicKey) parseX25519(r io.Reader) (err error) {\n\tpoint := make([]byte, x25519.KeySize)\n\t_, err = io.ReadFull(r, point)\n\tif err != nil {\n\t\treturn\n\t}\n\tpub := &x25519.PublicKey{\n\t\tPoint: point,\n\t}\n\tpk.PublicKey = pub\n\treturn\n}\n\nfunc (pk *PublicKey) parseX448(r io.Reader) (err error) {\n\tpoint := make([]byte, x448.KeySize)\n\t_, err = io.ReadFull(r, point)\n\tif err != nil {\n\t\treturn\n\t}\n\tpub := &x448.PublicKey{\n\t\tPoint: point,\n\t}\n\tpk.PublicKey = pub\n\treturn\n}\n\nfunc (pk *PublicKey) parseEd25519(r io.Reader) (err error) {\n\tpoint := make([]byte, ed25519.PublicKeySize)\n\t_, err = io.ReadFull(r, point)\n\tif err != nil {\n\t\treturn\n\t}\n\tpub := &ed25519.PublicKey{\n\t\tPoint: point,\n\t}\n\tpk.PublicKey = pub\n\treturn\n}\n\nfunc (pk *PublicKey) parseEd448(r io.Reader) (err error) {\n\tpoint := make([]byte, ed448.PublicKeySize)\n\t_, err = io.ReadFull(r, point)\n\tif err != nil {\n\t\treturn\n\t}\n\tpub := &ed448.PublicKey{\n\t\tPoint: point,\n\t}\n\tpk.PublicKey = pub\n\treturn\n}\n\n// SerializeForHash serializes the PublicKey to w with the special packet\n// header format needed for hashing.\nfunc (pk *PublicKey) SerializeForHash(w io.Writer) error {\n\tif err := pk.SerializeSignaturePrefix(w); err != nil {\n\t\treturn err\n\t}\n\treturn pk.serializeWithoutHeaders(w)\n}\n\n// SerializeSignaturePrefix writes the prefix for this public key to the given Writer.\n// The prefix is used when calculating a signature over this public key. See\n// RFC 4880, section 5.2.4.\nfunc (pk *PublicKey) SerializeSignaturePrefix(w io.Writer) error {\n\tvar pLength = pk.algorithmSpecificByteCount()\n\t// version, timestamp, algorithm\n\tpLength += versionSize + timestampSize + algorithmSize\n\tif pk.Version >= 5 {\n\t\t// key octet count (4).\n\t\tpLength += 4\n\t\t_, err := w.Write([]byte{\n\t\t\t// When a v4 signature is made over a key, the hash data starts with the octet 0x99, followed by a two-octet length\n\t\t\t// of the key, and then the body of the key packet. When a v6 signature is made over a key, the hash data starts\n\t\t\t// with the salt, then octet 0x9B, followed by a four-octet length of the key, and then the body of the key packet.\n\t\t\t0x95 + byte(pk.Version),\n\t\t\tbyte(pLength >> 24),\n\t\t\tbyte(pLength >> 16),\n\t\t\tbyte(pLength >> 8),\n\t\t\tbyte(pLength),\n\t\t})\n\t\treturn err\n\t}\n\tif _, err := w.Write([]byte{0x99, byte(pLength >> 8), byte(pLength)}); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (pk *PublicKey) Serialize(w io.Writer) (err error) {\n\tlength := uint32(versionSize + timestampSize + algorithmSize) // 6 byte header\n\tlength += pk.algorithmSpecificByteCount()\n\tif pk.Version >= 5 {\n\t\tlength += 4 // octet key count\n\t}\n\tpacketType := packetTypePublicKey\n\tif pk.IsSubkey {\n\t\tpacketType = packetTypePublicSubkey\n\t}\n\terr = serializeHeader(w, packetType, int(length))\n\tif err != nil {\n\t\treturn\n\t}\n\treturn pk.serializeWithoutHeaders(w)\n}\n\nfunc (pk *PublicKey) algorithmSpecificByteCount() uint32 {\n\tlength := uint32(0)\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:\n\t\tlength += uint32(pk.n.EncodedLength())\n\t\tlength += uint32(pk.e.EncodedLength())\n\tcase PubKeyAlgoDSA:\n\t\tlength += uint32(pk.p.EncodedLength())\n\t\tlength += uint32(pk.q.EncodedLength())\n\t\tlength += uint32(pk.g.EncodedLength())\n\t\tlength += uint32(pk.y.EncodedLength())\n\tcase PubKeyAlgoElGamal:\n\t\tlength += uint32(pk.p.EncodedLength())\n\t\tlength += uint32(pk.g.EncodedLength())\n\t\tlength += uint32(pk.y.EncodedLength())\n\tcase PubKeyAlgoECDSA:\n\t\tlength += uint32(pk.oid.EncodedLength())\n\t\tlength += uint32(pk.p.EncodedLength())\n\tcase PubKeyAlgoECDH:\n\t\tlength += uint32(pk.oid.EncodedLength())\n\t\tlength += uint32(pk.p.EncodedLength())\n\t\tlength += uint32(pk.kdf.EncodedLength())\n\tcase PubKeyAlgoEdDSA:\n\t\tlength += uint32(pk.oid.EncodedLength())\n\t\tlength += uint32(pk.p.EncodedLength())\n\tcase PubKeyAlgoX25519:\n\t\tlength += x25519.KeySize\n\tcase PubKeyAlgoX448:\n\t\tlength += x448.KeySize\n\tcase PubKeyAlgoEd25519:\n\t\tlength += ed25519.PublicKeySize\n\tcase PubKeyAlgoEd448:\n\t\tlength += ed448.PublicKeySize\n\tdefault:\n\t\tpanic(\"unknown public key algorithm\")\n\t}\n\treturn length\n}\n\n// serializeWithoutHeaders marshals the PublicKey to w in the form of an\n// OpenPGP public key packet, not including the packet header.\nfunc (pk *PublicKey) serializeWithoutHeaders(w io.Writer) (err error) {\n\tt := uint32(pk.CreationTime.Unix())\n\tif _, err = w.Write([]byte{\n\t\tbyte(pk.Version),\n\t\tbyte(t >> 24), byte(t >> 16), byte(t >> 8), byte(t),\n\t\tbyte(pk.PubKeyAlgo),\n\t}); err != nil {\n\t\treturn\n\t}\n\n\tif pk.Version >= 5 {\n\t\tn := pk.algorithmSpecificByteCount()\n\t\tif _, err = w.Write([]byte{\n\t\t\tbyte(n >> 24), byte(n >> 16), byte(n >> 8), byte(n),\n\t\t}); err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:\n\t\tif _, err = w.Write(pk.n.EncodedBytes()); err != nil {\n\t\t\treturn\n\t\t}\n\t\t_, err = w.Write(pk.e.EncodedBytes())\n\t\treturn\n\tcase PubKeyAlgoDSA:\n\t\tif _, err = w.Write(pk.p.EncodedBytes()); err != nil {\n\t\t\treturn\n\t\t}\n\t\tif _, err = w.Write(pk.q.EncodedBytes()); err != nil {\n\t\t\treturn\n\t\t}\n\t\tif _, err = w.Write(pk.g.EncodedBytes()); err != nil {\n\t\t\treturn\n\t\t}\n\t\t_, err = w.Write(pk.y.EncodedBytes())\n\t\treturn\n\tcase PubKeyAlgoElGamal:\n\t\tif _, err = w.Write(pk.p.EncodedBytes()); err != nil {\n\t\t\treturn\n\t\t}\n\t\tif _, err = w.Write(pk.g.EncodedBytes()); err != nil {\n\t\t\treturn\n\t\t}\n\t\t_, err = w.Write(pk.y.EncodedBytes())\n\t\treturn\n\tcase PubKeyAlgoECDSA:\n\t\tif _, err = w.Write(pk.oid.EncodedBytes()); err != nil {\n\t\t\treturn\n\t\t}\n\t\t_, err = w.Write(pk.p.EncodedBytes())\n\t\treturn\n\tcase PubKeyAlgoECDH:\n\t\tif _, err = w.Write(pk.oid.EncodedBytes()); err != nil {\n\t\t\treturn\n\t\t}\n\t\tif _, err = w.Write(pk.p.EncodedBytes()); err != nil {\n\t\t\treturn\n\t\t}\n\t\t_, err = w.Write(pk.kdf.EncodedBytes())\n\t\treturn\n\tcase PubKeyAlgoEdDSA:\n\t\tif _, err = w.Write(pk.oid.EncodedBytes()); err != nil {\n\t\t\treturn\n\t\t}\n\t\t_, err = w.Write(pk.p.EncodedBytes())\n\t\treturn\n\tcase PubKeyAlgoX25519:\n\t\tpublicKey := pk.PublicKey.(*x25519.PublicKey)\n\t\t_, err = w.Write(publicKey.Point)\n\t\treturn\n\tcase PubKeyAlgoX448:\n\t\tpublicKey := pk.PublicKey.(*x448.PublicKey)\n\t\t_, err = w.Write(publicKey.Point)\n\t\treturn\n\tcase PubKeyAlgoEd25519:\n\t\tpublicKey := pk.PublicKey.(*ed25519.PublicKey)\n\t\t_, err = w.Write(publicKey.Point)\n\t\treturn\n\tcase PubKeyAlgoEd448:\n\t\tpublicKey := pk.PublicKey.(*ed448.PublicKey)\n\t\t_, err = w.Write(publicKey.Point)\n\t\treturn\n\t}\n\treturn errors.InvalidArgumentError(\"bad public-key algorithm\")\n}\n\n// CanSign returns true iff this public key can generate signatures\nfunc (pk *PublicKey) CanSign() bool {\n\treturn pk.PubKeyAlgo != PubKeyAlgoRSAEncryptOnly && pk.PubKeyAlgo != PubKeyAlgoElGamal && pk.PubKeyAlgo != PubKeyAlgoECDH\n}\n\n// VerifyHashTag returns nil iff sig appears to be a plausible signature of the data\n// hashed into signed, based solely on its HashTag. signed is mutated by this call.\nfunc VerifyHashTag(signed hash.Hash, sig *Signature) (err error) {\n\tif sig.Version == 5 && (sig.SigType == 0x00 || sig.SigType == 0x01) {\n\t\tsig.AddMetadataToHashSuffix()\n\t}\n\tsigned.Write(sig.HashSuffix)\n\thashBytes := signed.Sum(nil)\n\tif hashBytes[0] != sig.HashTag[0] || hashBytes[1] != sig.HashTag[1] {\n\t\treturn errors.SignatureError(\"hash tag doesn't match\")\n\t}\n\treturn nil\n}\n\n// VerifySignature returns nil iff sig is a valid signature, made by this\n// public key, of the data hashed into signed. signed is mutated by this call.\nfunc (pk *PublicKey) VerifySignature(signed hash.Hash, sig *Signature) (err error) {\n\tif !pk.CanSign() {\n\t\treturn errors.InvalidArgumentError(\"public key cannot generate signatures\")\n\t}\n\tif sig.Version == 5 && (sig.SigType == 0x00 || sig.SigType == 0x01) {\n\t\tsig.AddMetadataToHashSuffix()\n\t}\n\tsigned.Write(sig.HashSuffix)\n\thashBytes := signed.Sum(nil)\n\t// see discussion https://github.com/ProtonMail/go-crypto/issues/107\n\tif sig.Version >= 5 && (hashBytes[0] != sig.HashTag[0] || hashBytes[1] != sig.HashTag[1]) {\n\t\treturn errors.SignatureError(\"hash tag doesn't match\")\n\t}\n\n\tif pk.PubKeyAlgo != sig.PubKeyAlgo {\n\t\treturn errors.InvalidArgumentError(\"public key and signature use different algorithms\")\n\t}\n\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly:\n\t\trsaPublicKey, _ := pk.PublicKey.(*rsa.PublicKey)\n\t\terr = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, padToKeySize(rsaPublicKey, sig.RSASignature.Bytes()))\n\t\tif err != nil {\n\t\t\treturn errors.SignatureError(\"RSA verification failure\")\n\t\t}\n\t\treturn nil\n\tcase PubKeyAlgoDSA:\n\t\tdsaPublicKey, _ := pk.PublicKey.(*dsa.PublicKey)\n\t\t// Need to truncate hashBytes to match FIPS 186-3 section 4.6.\n\t\tsubgroupSize := (dsaPublicKey.Q.BitLen() + 7) / 8\n\t\tif len(hashBytes) > subgroupSize {\n\t\t\thashBytes = hashBytes[:subgroupSize]\n\t\t}\n\t\tif !dsa.Verify(dsaPublicKey, hashBytes, new(big.Int).SetBytes(sig.DSASigR.Bytes()), new(big.Int).SetBytes(sig.DSASigS.Bytes())) {\n\t\t\treturn errors.SignatureError(\"DSA verification failure\")\n\t\t}\n\t\treturn nil\n\tcase PubKeyAlgoECDSA:\n\t\tecdsaPublicKey := pk.PublicKey.(*ecdsa.PublicKey)\n\t\tif !ecdsa.Verify(ecdsaPublicKey, hashBytes, new(big.Int).SetBytes(sig.ECDSASigR.Bytes()), new(big.Int).SetBytes(sig.ECDSASigS.Bytes())) {\n\t\t\treturn errors.SignatureError(\"ECDSA verification failure\")\n\t\t}\n\t\treturn nil\n\tcase PubKeyAlgoEdDSA:\n\t\teddsaPublicKey := pk.PublicKey.(*eddsa.PublicKey)\n\t\tif !eddsa.Verify(eddsaPublicKey, hashBytes, sig.EdDSASigR.Bytes(), sig.EdDSASigS.Bytes()) {\n\t\t\treturn errors.SignatureError(\"EdDSA verification failure\")\n\t\t}\n\t\treturn nil\n\tcase PubKeyAlgoEd25519:\n\t\ted25519PublicKey := pk.PublicKey.(*ed25519.PublicKey)\n\t\tif !ed25519.Verify(ed25519PublicKey, hashBytes, sig.EdSig) {\n\t\t\treturn errors.SignatureError(\"Ed25519 verification failure\")\n\t\t}\n\t\treturn nil\n\tcase PubKeyAlgoEd448:\n\t\ted448PublicKey := pk.PublicKey.(*ed448.PublicKey)\n\t\tif !ed448.Verify(ed448PublicKey, hashBytes, sig.EdSig) {\n\t\t\treturn errors.SignatureError(\"ed448 verification failure\")\n\t\t}\n\t\treturn nil\n\tdefault:\n\t\treturn errors.SignatureError(\"Unsupported public key algorithm used in signature\")\n\t}\n}\n\n// keySignatureHash returns a Hash of the message that needs to be signed for\n// pk to assert a subkey relationship to signed.\nfunc keySignatureHash(pk, signed signingKey, hashFunc hash.Hash) (h hash.Hash, err error) {\n\th = hashFunc\n\n\t// RFC 4880, section 5.2.4\n\terr = pk.SerializeForHash(h)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\terr = signed.SerializeForHash(h)\n\treturn\n}\n\n// VerifyKeyHashTag returns nil iff sig appears to be a plausible signature over this\n// primary key and subkey, based solely on its HashTag.\nfunc (pk *PublicKey) VerifyKeyHashTag(signed *PublicKey, sig *Signature) error {\n\tpreparedHash, err := sig.PrepareVerify()\n\tif err != nil {\n\t\treturn err\n\t}\n\th, err := keySignatureHash(pk, signed, preparedHash)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn VerifyHashTag(h, sig)\n}\n\n// VerifyKeySignature returns nil iff sig is a valid signature, made by this\n// public key, of signed.\nfunc (pk *PublicKey) VerifyKeySignature(signed *PublicKey, sig *Signature) error {\n\tpreparedHash, err := sig.PrepareVerify()\n\tif err != nil {\n\t\treturn err\n\t}\n\th, err := keySignatureHash(pk, signed, preparedHash)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err = pk.VerifySignature(h, sig); err != nil {\n\t\treturn err\n\t}\n\n\tif sig.FlagSign {\n\t\t// Signing subkeys must be cross-signed. See\n\t\t// https://www.gnupg.org/faq/subkey-cross-certify.html.\n\t\tif sig.EmbeddedSignature == nil {\n\t\t\treturn errors.StructuralError(\"signing subkey is missing cross-signature\")\n\t\t}\n\t\tpreparedHashEmbedded, err := sig.EmbeddedSignature.PrepareVerify()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Verify the cross-signature. This is calculated over the same\n\t\t// data as the main signature, so we cannot just recursively\n\t\t// call signed.VerifyKeySignature(...)\n\t\tif h, err = keySignatureHash(pk, signed, preparedHashEmbedded); err != nil {\n\t\t\treturn errors.StructuralError(\"error while hashing for cross-signature: \" + err.Error())\n\t\t}\n\t\tif err := signed.VerifySignature(h, sig.EmbeddedSignature); err != nil {\n\t\t\treturn errors.StructuralError(\"error while verifying cross-signature: \" + err.Error())\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc keyRevocationHash(pk signingKey, hashFunc hash.Hash) (err error) {\n\treturn pk.SerializeForHash(hashFunc)\n}\n\n// VerifyRevocationHashTag returns nil iff sig appears to be a plausible signature\n// over this public key, based solely on its HashTag.\nfunc (pk *PublicKey) VerifyRevocationHashTag(sig *Signature) (err error) {\n\tpreparedHash, err := sig.PrepareVerify()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err = keyRevocationHash(pk, preparedHash); err != nil {\n\t\treturn err\n\t}\n\treturn VerifyHashTag(preparedHash, sig)\n}\n\n// VerifyRevocationSignature returns nil iff sig is a valid signature, made by this\n// public key.\nfunc (pk *PublicKey) VerifyRevocationSignature(sig *Signature) (err error) {\n\tpreparedHash, err := sig.PrepareVerify()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err = keyRevocationHash(pk, preparedHash); err != nil {\n\t\treturn err\n\t}\n\treturn pk.VerifySignature(preparedHash, sig)\n}\n\n// VerifySubkeyRevocationSignature returns nil iff sig is a valid subkey revocation signature,\n// made by this public key, of signed.\nfunc (pk *PublicKey) VerifySubkeyRevocationSignature(sig *Signature, signed *PublicKey) (err error) {\n\tpreparedHash, err := sig.PrepareVerify()\n\tif err != nil {\n\t\treturn err\n\t}\n\th, err := keySignatureHash(pk, signed, preparedHash)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn pk.VerifySignature(h, sig)\n}\n\n// userIdSignatureHash returns a Hash of the message that needs to be signed\n// to assert that pk is a valid key for id.\nfunc userIdSignatureHash(id string, pk *PublicKey, h hash.Hash) (err error) {\n\n\t// RFC 4880, section 5.2.4\n\tif err := pk.SerializeSignaturePrefix(h); err != nil {\n\t\treturn err\n\t}\n\tif err := pk.serializeWithoutHeaders(h); err != nil {\n\t\treturn err\n\t}\n\n\tvar buf [5]byte\n\tbuf[0] = 0xb4\n\tbuf[1] = byte(len(id) >> 24)\n\tbuf[2] = byte(len(id) >> 16)\n\tbuf[3] = byte(len(id) >> 8)\n\tbuf[4] = byte(len(id))\n\th.Write(buf[:])\n\th.Write([]byte(id))\n\n\treturn nil\n}\n\n// directKeySignatureHash returns a Hash of the message that needs to be signed.\nfunc directKeySignatureHash(pk *PublicKey, h hash.Hash) (err error) {\n\treturn pk.SerializeForHash(h)\n}\n\n// VerifyUserIdHashTag returns nil iff sig appears to be a plausible signature over this\n// public key and UserId, based solely on its HashTag\nfunc (pk *PublicKey) VerifyUserIdHashTag(id string, sig *Signature) (err error) {\n\tpreparedHash, err := sig.PrepareVerify()\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = userIdSignatureHash(id, pk, preparedHash)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn VerifyHashTag(preparedHash, sig)\n}\n\n// VerifyUserIdSignature returns nil iff sig is a valid signature, made by this\n// public key, that id is the identity of pub.\nfunc (pk *PublicKey) VerifyUserIdSignature(id string, pub *PublicKey, sig *Signature) (err error) {\n\th, err := sig.PrepareVerify()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := userIdSignatureHash(id, pub, h); err != nil {\n\t\treturn err\n\t}\n\treturn pk.VerifySignature(h, sig)\n}\n\n// VerifyDirectKeySignature returns nil iff sig is a valid signature, made by this\n// public key.\nfunc (pk *PublicKey) VerifyDirectKeySignature(sig *Signature) (err error) {\n\th, err := sig.PrepareVerify()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := directKeySignatureHash(pk, h); err != nil {\n\t\treturn err\n\t}\n\treturn pk.VerifySignature(h, sig)\n}\n\n// KeyIdString returns the public key's fingerprint in capital hex\n// (e.g. \"6C7EE1B8621CC013\").\nfunc (pk *PublicKey) KeyIdString() string {\n\treturn fmt.Sprintf(\"%016X\", pk.KeyId)\n}\n\n// KeyIdShortString returns the short form of public key's fingerprint\n// in capital hex, as shown by gpg --list-keys (e.g. \"621CC013\").\n// This function will return the full key id for v5 and v6 keys\n// since the short key id is undefined for them.\nfunc (pk *PublicKey) KeyIdShortString() string {\n\tif pk.Version >= 5 {\n\t\treturn pk.KeyIdString()\n\t}\n\treturn fmt.Sprintf(\"%X\", pk.Fingerprint[16:20])\n}\n\n// BitLength returns the bit length for the given public key.\nfunc (pk *PublicKey) BitLength() (bitLength uint16, err error) {\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:\n\t\tbitLength = pk.n.BitLength()\n\tcase PubKeyAlgoDSA:\n\t\tbitLength = pk.p.BitLength()\n\tcase PubKeyAlgoElGamal:\n\t\tbitLength = pk.p.BitLength()\n\tcase PubKeyAlgoECDSA:\n\t\tbitLength = pk.p.BitLength()\n\tcase PubKeyAlgoECDH:\n\t\tbitLength = pk.p.BitLength()\n\tcase PubKeyAlgoEdDSA:\n\t\tbitLength = pk.p.BitLength()\n\tcase PubKeyAlgoX25519:\n\t\tbitLength = x25519.KeySize * 8\n\tcase PubKeyAlgoX448:\n\t\tbitLength = x448.KeySize * 8\n\tcase PubKeyAlgoEd25519:\n\t\tbitLength = ed25519.PublicKeySize * 8\n\tcase PubKeyAlgoEd448:\n\t\tbitLength = ed448.PublicKeySize * 8\n\tdefault:\n\t\terr = errors.InvalidArgumentError(\"bad public-key algorithm\")\n\t}\n\treturn\n}\n\n// Curve returns the used elliptic curve of this public key.\n// Returns an error if no elliptic curve is used.\nfunc (pk *PublicKey) Curve() (curve Curve, err error) {\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoECDSA, PubKeyAlgoECDH, PubKeyAlgoEdDSA:\n\t\tcurveInfo := ecc.FindByOid(pk.oid)\n\t\tif curveInfo == nil {\n\t\t\treturn \"\", errors.UnsupportedError(fmt.Sprintf(\"unknown oid: %x\", pk.oid))\n\t\t}\n\t\tcurve = Curve(curveInfo.GenName)\n\tcase PubKeyAlgoEd25519, PubKeyAlgoX25519:\n\t\tcurve = Curve25519\n\tcase PubKeyAlgoEd448, PubKeyAlgoX448:\n\t\tcurve = Curve448\n\tdefault:\n\t\terr = errors.InvalidArgumentError(\"public key does not operate with an elliptic curve\")\n\t}\n\treturn\n}\n\n// KeyExpired returns whether sig is a self-signature of a key that has\n// expired or is created in the future.\nfunc (pk *PublicKey) KeyExpired(sig *Signature, currentTime time.Time) bool {\n\tif pk.CreationTime.Unix() > currentTime.Unix() {\n\t\treturn true\n\t}\n\tif sig.KeyLifetimeSecs == nil || *sig.KeyLifetimeSecs == 0 {\n\t\treturn false\n\t}\n\texpiry := pk.CreationTime.Add(time.Duration(*sig.KeyLifetimeSecs) * time.Second)\n\treturn currentTime.Unix() > expiry.Unix()\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/public_key_test_data.go",
    "content": "package packet\n\nconst rsaFingerprintHex = \"5fb74b1d03b1e3cb31bc2f8aa34d7e18c20c31bb\"\n\nconst rsaPkDataHex = \"988d044d3c5c10010400b1d13382944bd5aba23a4312968b5095d14f947f600eb478e14a6fcb16b0e0cac764884909c020bc495cfcc39a935387c661507bdb236a0612fb582cac3af9b29cc2c8c70090616c41b662f4da4c1201e195472eb7f4ae1ccbcbf9940fe21d985e379a5563dde5b9a23d35f1cfaa5790da3b79db26f23695107bfaca8e7b5bcd0011010001\"\n\nconst dsaFingerprintHex = \"eece4c094db002103714c63c8e8fbe54062f19ed\"\n\nconst dsaPkDataHex = \"9901a2044d432f89110400cd581334f0d7a1e1bdc8b9d6d8c0baf68793632735d2bb0903224cbaa1dfbf35a60ee7a13b92643421e1eb41aa8d79bea19a115a677f6b8ba3c7818ce53a6c2a24a1608bd8b8d6e55c5090cbde09dd26e356267465ae25e69ec8bdd57c7bbb2623e4d73336f73a0a9098f7f16da2e25252130fd694c0e8070c55a812a423ae7f00a0ebf50e70c2f19c3520a551bd4b08d30f23530d3d03ff7d0bf4a53a64a09dc5e6e6e35854b7d70c882b0c60293401958b1bd9e40abec3ea05ba87cf64899299d4bd6aa7f459c201d3fbbd6c82004bdc5e8a9eb8082d12054cc90fa9d4ec251a843236a588bf49552441817436c4f43326966fe85447d4e6d0acf8fa1ef0f014730770603ad7634c3088dc52501c237328417c31c89ed70400b2f1a98b0bf42f11fefc430704bebbaa41d9f355600c3facee1e490f64208e0e094ea55e3a598a219a58500bf78ac677b670a14f4e47e9cf8eab4f368cc1ddcaa18cc59309d4cc62dd4f680e73e6cc3e1ce87a84d0925efbcb26c575c093fc42eecf45135fabf6403a25c2016e1774c0484e440a18319072c617cc97ac0a3bb0\"\n\nconst ecdsaFingerprintHex = \"9892270b38b8980b05c8d56d43fe956c542ca00b\"\n\nconst ecdsaPkDataHex = \"9893045071c29413052b8104002304230401f4867769cedfa52c325018896245443968e52e51d0c2df8d939949cb5b330f2921711fbee1c9b9dddb95d15cb0255e99badeddda7cc23d9ddcaacbc290969b9f24019375d61c2e4e3b36953a28d8b2bc95f78c3f1d592fb24499be348656a7b17e3963187b4361afe497bc5f9f81213f04069f8e1fb9e6a6290ae295ca1a92b894396cb4\"\n\nconst ecdhFingerprintHex = \"722354df2475a42164d1d49faa8b938f9a201946\"\n\nconst ecdhPkDataHex = \"b90073044d53059212052b810400220303042faa84024a20b6735c4897efa5bfb41bf85b7eefeab5ca0cb9ffc8ea04a46acb25534a577694f9e25340a4ab5223a9dd1eda530c8aa2e6718db10d7e672558c7736fe09369ea5739a2a3554bf16d41faa50562f11c6d39bbd5dffb6b9a9ec91803010909\"\n\nconst eddsaFingerprintHex = \"b2d5e5ec0e6deca6bc8eeeb00907e75e1dd99ad8\"\n\nconst eddsaPkDataHex = \"98330456e2132b16092b06010401da470f01010740bbda39266affa511a8c2d02edf690fb784b0499c4406185811a163539ef11dc1b41d74657374696e67203c74657374696e674074657374696e672e636f6d3e8879041316080021050256e2132b021b03050b09080702061508090a0b020416020301021e01021780000a09100907e75e1dd99ad86d0c00fe39d2008359352782bc9b61ac382584cd8eff3f57a18c2287e3afeeb05d1f04ba00fe2d0bc1ddf3ff8adb9afa3e7d9287244b4ec567f3db4d60b74a9b5465ed528203\"\n\n// Source: https://sites.google.com/site/brainhub/pgpecckeys#TOC-ECC-NIST-P-384-key\nconst ecc384PubHex = `99006f044d53059213052b81040022030304f6b8c5aced5b84ef9f4a209db2e4a9dfb70d28cb8c10ecd57674a9fa5a67389942b62d5e51367df4c7bfd3f8e500feecf07ed265a621a8ebbbe53e947ec78c677eba143bd1533c2b350e1c29f82313e1e1108eba063be1e64b10e6950e799c2db42465635f6473615f64685f333834203c6f70656e70677040627261696e6875622e6f72673e8900cb04101309005305024d530592301480000000002000077072656665727265642d656d61696c2d656e636f64696e67407067702e636f6d7067706d696d65040b090807021901051b03000000021602051e010000000415090a08000a0910098033880f54719fca2b0180aa37350968bd5f115afd8ce7bc7b103822152dbff06d0afcda835329510905b98cb469ba208faab87c7412b799e7b633017f58364ea480e8a1a3f253a0c5f22c446e8be9a9fce6210136ee30811abbd49139de28b5bdf8dc36d06ae748579e9ff503b90073044d53059212052b810400220303042faa84024a20b6735c4897efa5bfb41bf85b7eefeab5ca0cb9ffc8ea04a46acb25534a577694f9e25340a4ab5223a9dd1eda530c8aa2e6718db10d7e672558c7736fe09369ea5739a2a3554bf16d41faa50562f11c6d39bbd5dffb6b9a9ec9180301090989008404181309000c05024d530592051b0c000000000a0910098033880f54719f80970180eee7a6d8fcee41ee4f9289df17f9bcf9d955dca25c583b94336f3a2b2d4986dc5cf417b8d2dc86f741a9e1a6d236c0e3017d1c76575458a0cfb93ae8a2b274fcc65ceecd7a91eec83656ba13219969f06945b48c56bd04152c3a0553c5f2f4bd1267`\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/reader.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n)\n\ntype PacketReader interface {\n\tNext() (p Packet, err error)\n\tPush(reader io.Reader) (err error)\n\tUnread(p Packet)\n}\n\n// Reader reads packets from an io.Reader and allows packets to be 'unread' so\n// that they result from the next call to Next.\ntype Reader struct {\n\tq       []Packet\n\treaders []io.Reader\n}\n\n// New io.Readers are pushed when a compressed or encrypted packet is processed\n// and recursively treated as a new source of packets. However, a carefully\n// crafted packet can trigger an infinite recursive sequence of packets. See\n// http://mumble.net/~campbell/misc/pgp-quine\n// https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2013-4402\n// This constant limits the number of recursive packets that may be pushed.\nconst maxReaders = 32\n\n// Next returns the most recently unread Packet, or reads another packet from\n// the top-most io.Reader. Unknown/unsupported/Marker packet types are skipped.\nfunc (r *Reader) Next() (p Packet, err error) {\n\tfor {\n\t\tp, err := r.read()\n\t\tif err == io.EOF {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\tif _, ok := err.(errors.UnknownPacketTypeError); ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif _, ok := err.(errors.UnsupportedError); ok {\n\t\t\t\tswitch p.(type) {\n\t\t\t\tcase *SymmetricallyEncrypted, *AEADEncrypted, *Compressed, *LiteralData:\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn nil, err\n\t\t} else {\n\t\t\t//A marker packet MUST be ignored when received\n\t\t\tswitch p.(type) {\n\t\t\tcase *Marker:\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn p, nil\n\t\t}\n\t}\n\treturn nil, io.EOF\n}\n\n// Next returns the most recently unread Packet, or reads another packet from\n// the top-most io.Reader. Unknown/Marker packet types are skipped while unsupported\n// packets are returned as UnsupportedPacket type.\nfunc (r *Reader) NextWithUnsupported() (p Packet, err error) {\n\tfor {\n\t\tp, err = r.read()\n\t\tif err == io.EOF {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\tif _, ok := err.(errors.UnknownPacketTypeError); ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif casteErr, ok := err.(errors.UnsupportedError); ok {\n\t\t\t\treturn &UnsupportedPacket{\n\t\t\t\t\tIncompletePacket: p,\n\t\t\t\t\tError:            casteErr,\n\t\t\t\t}, nil\n\t\t\t}\n\t\t\treturn\n\t\t} else {\n\t\t\t//A marker packet MUST be ignored when received\n\t\t\tswitch p.(type) {\n\t\t\tcase *Marker:\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t}\n\treturn nil, io.EOF\n}\n\nfunc (r *Reader) read() (p Packet, err error) {\n\tif len(r.q) > 0 {\n\t\tp = r.q[len(r.q)-1]\n\t\tr.q = r.q[:len(r.q)-1]\n\t\treturn\n\t}\n\tfor len(r.readers) > 0 {\n\t\tp, err = Read(r.readers[len(r.readers)-1])\n\t\tif err == io.EOF {\n\t\t\tr.readers = r.readers[:len(r.readers)-1]\n\t\t\tcontinue\n\t\t}\n\t\treturn p, err\n\t}\n\treturn nil, io.EOF\n}\n\n// Push causes the Reader to start reading from a new io.Reader. When an EOF\n// error is seen from the new io.Reader, it is popped and the Reader continues\n// to read from the next most recent io.Reader. Push returns a StructuralError\n// if pushing the reader would exceed the maximum recursion level, otherwise it\n// returns nil.\nfunc (r *Reader) Push(reader io.Reader) (err error) {\n\tif len(r.readers) >= maxReaders {\n\t\treturn errors.StructuralError(\"too many layers of packets\")\n\t}\n\tr.readers = append(r.readers, reader)\n\treturn nil\n}\n\n// Unread causes the given Packet to be returned from the next call to Next.\nfunc (r *Reader) Unread(p Packet) {\n\tr.q = append(r.q, p)\n}\n\nfunc NewReader(r io.Reader) *Reader {\n\treturn &Reader{\n\t\tq:       nil,\n\t\treaders: []io.Reader{r},\n\t}\n}\n\n// CheckReader is similar to Reader but additionally\n// uses the pushdown automata to verify the read packet sequence.\ntype CheckReader struct {\n\tReader\n\tverifier  *SequenceVerifier\n\tfullyRead bool\n}\n\n// Next returns the most recently unread Packet, or reads another packet from\n// the top-most io.Reader. Unknown packet types are skipped.\n// If the read packet sequence does not conform to the packet composition\n// rules in rfc4880, it returns an error.\nfunc (r *CheckReader) Next() (p Packet, err error) {\n\tif r.fullyRead {\n\t\treturn nil, io.EOF\n\t}\n\tif len(r.q) > 0 {\n\t\tp = r.q[len(r.q)-1]\n\t\tr.q = r.q[:len(r.q)-1]\n\t\treturn\n\t}\n\tvar errMsg error\n\tfor len(r.readers) > 0 {\n\t\tp, errMsg, err = ReadWithCheck(r.readers[len(r.readers)-1], r.verifier)\n\t\tif errMsg != nil {\n\t\t\terr = errMsg\n\t\t\treturn\n\t\t}\n\t\tif err == nil {\n\t\t\treturn\n\t\t}\n\t\tif err == io.EOF {\n\t\t\tr.readers = r.readers[:len(r.readers)-1]\n\t\t\tcontinue\n\t\t}\n\t\t//A marker packet MUST be ignored when received\n\t\tswitch p.(type) {\n\t\tcase *Marker:\n\t\t\tcontinue\n\t\t}\n\t\tif _, ok := err.(errors.UnknownPacketTypeError); ok {\n\t\t\tcontinue\n\t\t}\n\t\tif _, ok := err.(errors.UnsupportedError); ok {\n\t\t\tswitch p.(type) {\n\t\t\tcase *SymmetricallyEncrypted, *AEADEncrypted, *Compressed, *LiteralData:\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\treturn nil, err\n\t}\n\tif errMsg = r.verifier.Next(EOSSymbol); errMsg != nil {\n\t\treturn nil, errMsg\n\t}\n\tif errMsg = r.verifier.AssertValid(); errMsg != nil {\n\t\treturn nil, errMsg\n\t}\n\tr.fullyRead = true\n\treturn nil, io.EOF\n}\n\nfunc NewCheckReader(r io.Reader) *CheckReader {\n\treturn &CheckReader{\n\t\tReader: Reader{\n\t\t\tq:       nil,\n\t\t\treaders: []io.Reader{r},\n\t\t},\n\t\tverifier:  NewSequenceVerifier(),\n\t\tfullyRead: false,\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/recipient.go",
    "content": "package packet\n\n// Recipient type represents a Intended Recipient Fingerprint subpacket\n// See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh#name-intended-recipient-fingerpr\ntype Recipient struct {\n\tKeyVersion  int\n\tFingerprint []byte\n}\n\nfunc (r *Recipient) Serialize() []byte {\n\tpacket := make([]byte, len(r.Fingerprint)+1)\n\tpacket[0] = byte(r.KeyVersion)\n\tcopy(packet[1:], r.Fingerprint)\n\treturn packet\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/signature.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"bytes\"\n\t\"crypto\"\n\t\"crypto/dsa\"\n\t\"encoding/asn1\"\n\t\"encoding/binary\"\n\t\"hash\"\n\t\"io\"\n\t\"math/big\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/ecdsa\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/ed25519\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/ed448\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/eddsa\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/algorithm\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/encoding\"\n)\n\nconst (\n\t// First octet of key flags.\n\t// See RFC 9580, section 5.2.3.29 for details.\n\tKeyFlagCertify = 1 << iota\n\tKeyFlagSign\n\tKeyFlagEncryptCommunications\n\tKeyFlagEncryptStorage\n\tKeyFlagSplitKey\n\tKeyFlagAuthenticate\n\t_\n\tKeyFlagGroupKey\n)\n\nconst (\n\t// First octet of keyserver preference flags.\n\t// See RFC 9580, section 5.2.3.25 for details.\n\t_ = 1 << iota\n\t_\n\t_\n\t_\n\t_\n\t_\n\t_\n\tKeyserverPrefNoModify\n)\n\nconst SaltNotationName = \"salt@notations.openpgpjs.org\"\n\n// Signature represents a signature. See RFC 9580, section 5.2.\ntype Signature struct {\n\tVersion    int\n\tSigType    SignatureType\n\tPubKeyAlgo PublicKeyAlgorithm\n\tHash       crypto.Hash\n\t// salt contains a random salt value for v6 signatures\n\t// See RFC 9580 Section 5.2.4.\n\tsalt []byte\n\n\t// HashSuffix is extra data that is hashed in after the signed data.\n\tHashSuffix []byte\n\t// HashTag contains the first two bytes of the hash for fast rejection\n\t// of bad signed data.\n\tHashTag [2]byte\n\n\t// Metadata includes format, filename and time, and is protected by v5\n\t// signatures of type 0x00 or 0x01. This metadata is included into the hash\n\t// computation; if nil, six 0x00 bytes are used instead. See section 5.2.4.\n\tMetadata *LiteralData\n\n\tCreationTime time.Time\n\n\tRSASignature         encoding.Field\n\tDSASigR, DSASigS     encoding.Field\n\tECDSASigR, ECDSASigS encoding.Field\n\tEdDSASigR, EdDSASigS encoding.Field\n\tEdSig                []byte\n\n\t// rawSubpackets contains the unparsed subpackets, in order.\n\trawSubpackets []outputSubpacket\n\n\t// The following are optional so are nil when not included in the\n\t// signature.\n\n\tSigLifetimeSecs, KeyLifetimeSecs                        *uint32\n\tPreferredSymmetric, PreferredHash, PreferredCompression []uint8\n\tPreferredCipherSuites                                   [][2]uint8\n\tIssuerKeyId                                             *uint64\n\tIssuerFingerprint                                       []byte\n\tSignerUserId                                            *string\n\tIsPrimaryId                                             *bool\n\tNotations                                               []*Notation\n\tIntendedRecipients                                      []*Recipient\n\n\t// TrustLevel and TrustAmount can be set by the signer to assert that\n\t// the key is not only valid but also trustworthy at the specified\n\t// level.\n\t// See RFC 9580, section 5.2.3.21 for details.\n\tTrustLevel  TrustLevel\n\tTrustAmount TrustAmount\n\n\t// TrustRegularExpression can be used in conjunction with trust Signature\n\t// packets to limit the scope of the trust that is extended.\n\t// See RFC 9580, section 5.2.3.22 for details.\n\tTrustRegularExpression *string\n\n\t// KeyserverPrefsValid is set if any keyserver preferences were given. See RFC 9580, section\n\t// 5.2.3.25 for details.\n\tKeyserverPrefsValid   bool\n\tKeyserverPrefNoModify bool\n\n\t// PreferredKeyserver can be set to a URI where the latest version of the\n\t// key that this signature is made over can be found. See RFC 9580, section\n\t// 5.2.3.26 for details.\n\tPreferredKeyserver string\n\n\t// PolicyURI can be set to the URI of a document that describes the\n\t// policy under which the signature was issued. See RFC 9580, section\n\t// 5.2.3.28 for details.\n\tPolicyURI string\n\n\t// FlagsValid is set if any flags were given. See RFC 9580, section\n\t// 5.2.3.29 for details.\n\tFlagsValid                                                                                                         bool\n\tFlagCertify, FlagSign, FlagEncryptCommunications, FlagEncryptStorage, FlagSplitKey, FlagAuthenticate, FlagGroupKey bool\n\n\t// RevocationReason is set if this signature has been revoked.\n\t// See RFC 9580, section 5.2.3.31 for details.\n\tRevocationReason     *ReasonForRevocation\n\tRevocationReasonText string\n\n\t// In a self-signature, these flags are set there is a features subpacket\n\t// indicating that the issuer implementation supports these features\n\t// see https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh#features-subpacket\n\tSEIPDv1, SEIPDv2 bool\n\n\t// EmbeddedSignature, if non-nil, is a signature of the parent key, by\n\t// this key. This prevents an attacker from claiming another's signing\n\t// subkey as their own.\n\tEmbeddedSignature *Signature\n\n\toutSubpackets []outputSubpacket\n}\n\n// VerifiableSignature internally keeps state if the\n// the signature has been verified before.\ntype VerifiableSignature struct {\n\tValid  *bool // nil if it has not been verified yet\n\tPacket *Signature\n}\n\n// NewVerifiableSig returns a struct of type VerifiableSignature referencing the input signature.\nfunc NewVerifiableSig(signature *Signature) *VerifiableSignature {\n\treturn &VerifiableSignature{\n\t\tPacket: signature,\n\t}\n}\n\n// Salt returns the signature salt for v6 signatures.\nfunc (sig *Signature) Salt() []byte {\n\tif sig == nil {\n\t\treturn nil\n\t}\n\treturn sig.salt\n}\n\nfunc (sig *Signature) parse(r io.Reader) (err error) {\n\t// RFC 9580, section 5.2.3\n\tvar buf [7]byte\n\t_, err = readFull(r, buf[:1])\n\tif err != nil {\n\t\treturn\n\t}\n\tsig.Version = int(buf[0])\n\tif sig.Version != 4 && sig.Version != 5 && sig.Version != 6 {\n\t\terr = errors.UnsupportedError(\"signature packet version \" + strconv.Itoa(int(buf[0])))\n\t\treturn\n\t}\n\n\tif V5Disabled && sig.Version == 5 {\n\t\treturn errors.UnsupportedError(\"support for parsing v5 entities is disabled; build with `-tags v5` if needed\")\n\t}\n\n\tif sig.Version == 6 {\n\t\t_, err = readFull(r, buf[:7])\n\t} else {\n\t\t_, err = readFull(r, buf[:5])\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\tsig.SigType = SignatureType(buf[0])\n\tsig.PubKeyAlgo = PublicKeyAlgorithm(buf[1])\n\tswitch sig.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoDSA, PubKeyAlgoECDSA, PubKeyAlgoEdDSA, PubKeyAlgoEd25519, PubKeyAlgoEd448:\n\tdefault:\n\t\terr = errors.UnsupportedError(\"public key algorithm \" + strconv.Itoa(int(sig.PubKeyAlgo)))\n\t\treturn\n\t}\n\n\tvar ok bool\n\n\tif sig.Version < 5 {\n\t\tsig.Hash, ok = algorithm.HashIdToHashWithSha1(buf[2])\n\t} else {\n\t\tsig.Hash, ok = algorithm.HashIdToHash(buf[2])\n\t}\n\n\tif !ok {\n\t\treturn errors.UnsupportedError(\"hash function \" + strconv.Itoa(int(buf[2])))\n\t}\n\n\tvar hashedSubpacketsLength int\n\tif sig.Version == 6 {\n\t\t// For a v6 signature, a four-octet length is used.\n\t\thashedSubpacketsLength =\n\t\t\tint(buf[3])<<24 |\n\t\t\t\tint(buf[4])<<16 |\n\t\t\t\tint(buf[5])<<8 |\n\t\t\t\tint(buf[6])\n\t} else {\n\t\thashedSubpacketsLength = int(buf[3])<<8 | int(buf[4])\n\t}\n\thashedSubpackets := make([]byte, hashedSubpacketsLength)\n\t_, err = readFull(r, hashedSubpackets)\n\tif err != nil {\n\t\treturn\n\t}\n\terr = sig.buildHashSuffix(hashedSubpackets)\n\tif err != nil {\n\t\treturn\n\t}\n\n\terr = parseSignatureSubpackets(sig, hashedSubpackets, true)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif sig.Version == 6 {\n\t\t_, err = readFull(r, buf[:4])\n\t} else {\n\t\t_, err = readFull(r, buf[:2])\n\t}\n\n\tif err != nil {\n\t\treturn\n\t}\n\tvar unhashedSubpacketsLength uint32\n\tif sig.Version == 6 {\n\t\tunhashedSubpacketsLength = uint32(buf[0])<<24 | uint32(buf[1])<<16 | uint32(buf[2])<<8 | uint32(buf[3])\n\t} else {\n\t\tunhashedSubpacketsLength = uint32(buf[0])<<8 | uint32(buf[1])\n\t}\n\tunhashedSubpackets := make([]byte, unhashedSubpacketsLength)\n\t_, err = readFull(r, unhashedSubpackets)\n\tif err != nil {\n\t\treturn\n\t}\n\terr = parseSignatureSubpackets(sig, unhashedSubpackets, false)\n\tif err != nil {\n\t\treturn\n\t}\n\n\t_, err = readFull(r, sig.HashTag[:2])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif sig.Version == 6 {\n\t\t// Only for v6 signatures, a variable-length field containing the salt\n\t\t_, err = readFull(r, buf[:1])\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tsaltLength := int(buf[0])\n\t\tvar expectedSaltLength int\n\t\texpectedSaltLength, err = SaltLengthForHash(sig.Hash)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tif saltLength != expectedSaltLength {\n\t\t\terr = errors.StructuralError(\"unexpected salt size for the given hash algorithm\")\n\t\t\treturn\n\t\t}\n\t\tsalt := make([]byte, expectedSaltLength)\n\t\t_, err = readFull(r, salt)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tsig.salt = salt\n\t}\n\n\tswitch sig.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly:\n\t\tsig.RSASignature = new(encoding.MPI)\n\t\t_, err = sig.RSASignature.ReadFrom(r)\n\tcase PubKeyAlgoDSA:\n\t\tsig.DSASigR = new(encoding.MPI)\n\t\tif _, err = sig.DSASigR.ReadFrom(r); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\tsig.DSASigS = new(encoding.MPI)\n\t\t_, err = sig.DSASigS.ReadFrom(r)\n\tcase PubKeyAlgoECDSA:\n\t\tsig.ECDSASigR = new(encoding.MPI)\n\t\tif _, err = sig.ECDSASigR.ReadFrom(r); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\tsig.ECDSASigS = new(encoding.MPI)\n\t\t_, err = sig.ECDSASigS.ReadFrom(r)\n\tcase PubKeyAlgoEdDSA:\n\t\tsig.EdDSASigR = new(encoding.MPI)\n\t\tif _, err = sig.EdDSASigR.ReadFrom(r); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\tsig.EdDSASigS = new(encoding.MPI)\n\t\tif _, err = sig.EdDSASigS.ReadFrom(r); err != nil {\n\t\t\treturn\n\t\t}\n\tcase PubKeyAlgoEd25519:\n\t\tsig.EdSig, err = ed25519.ReadSignature(r)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\tcase PubKeyAlgoEd448:\n\t\tsig.EdSig, err = ed448.ReadSignature(r)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\tdefault:\n\t\tpanic(\"unreachable\")\n\t}\n\treturn\n}\n\n// parseSignatureSubpackets parses subpackets of the main signature packet. See\n// RFC 9580, section 5.2.3.1.\nfunc parseSignatureSubpackets(sig *Signature, subpackets []byte, isHashed bool) (err error) {\n\tfor len(subpackets) > 0 {\n\t\tsubpackets, err = parseSignatureSubpacket(sig, subpackets, isHashed)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\tif sig.CreationTime.IsZero() {\n\t\terr = errors.StructuralError(\"no creation time in signature\")\n\t}\n\n\treturn\n}\n\ntype signatureSubpacketType uint8\n\nconst (\n\tcreationTimeSubpacket        signatureSubpacketType = 2\n\tsignatureExpirationSubpacket signatureSubpacketType = 3\n\texportableCertSubpacket      signatureSubpacketType = 4\n\ttrustSubpacket               signatureSubpacketType = 5\n\tregularExpressionSubpacket   signatureSubpacketType = 6\n\tkeyExpirationSubpacket       signatureSubpacketType = 9\n\tprefSymmetricAlgosSubpacket  signatureSubpacketType = 11\n\tissuerSubpacket              signatureSubpacketType = 16\n\tnotationDataSubpacket        signatureSubpacketType = 20\n\tprefHashAlgosSubpacket       signatureSubpacketType = 21\n\tprefCompressionSubpacket     signatureSubpacketType = 22\n\tkeyserverPrefsSubpacket      signatureSubpacketType = 23\n\tprefKeyserverSubpacket       signatureSubpacketType = 24\n\tprimaryUserIdSubpacket       signatureSubpacketType = 25\n\tpolicyUriSubpacket           signatureSubpacketType = 26\n\tkeyFlagsSubpacket            signatureSubpacketType = 27\n\tsignerUserIdSubpacket        signatureSubpacketType = 28\n\treasonForRevocationSubpacket signatureSubpacketType = 29\n\tfeaturesSubpacket            signatureSubpacketType = 30\n\tembeddedSignatureSubpacket   signatureSubpacketType = 32\n\tissuerFingerprintSubpacket   signatureSubpacketType = 33\n\tintendedRecipientSubpacket   signatureSubpacketType = 35\n\tprefCipherSuitesSubpacket    signatureSubpacketType = 39\n)\n\n// parseSignatureSubpacket parses a single subpacket. len(subpacket) is >= 1.\nfunc parseSignatureSubpacket(sig *Signature, subpacket []byte, isHashed bool) (rest []byte, err error) {\n\t// RFC 9580, section 5.2.3.7\n\tvar (\n\t\tlength     uint32\n\t\tpacketType signatureSubpacketType\n\t\tisCritical bool\n\t)\n\tif len(subpacket) == 0 {\n\t\terr = errors.StructuralError(\"zero length signature subpacket\")\n\t\treturn\n\t}\n\tswitch {\n\tcase subpacket[0] < 192:\n\t\tlength = uint32(subpacket[0])\n\t\tsubpacket = subpacket[1:]\n\tcase subpacket[0] < 255:\n\t\tif len(subpacket) < 2 {\n\t\t\tgoto Truncated\n\t\t}\n\t\tlength = uint32(subpacket[0]-192)<<8 + uint32(subpacket[1]) + 192\n\t\tsubpacket = subpacket[2:]\n\tdefault:\n\t\tif len(subpacket) < 5 {\n\t\t\tgoto Truncated\n\t\t}\n\t\tlength = uint32(subpacket[1])<<24 |\n\t\t\tuint32(subpacket[2])<<16 |\n\t\t\tuint32(subpacket[3])<<8 |\n\t\t\tuint32(subpacket[4])\n\t\tsubpacket = subpacket[5:]\n\t}\n\tif length > uint32(len(subpacket)) {\n\t\tgoto Truncated\n\t}\n\trest = subpacket[length:]\n\tsubpacket = subpacket[:length]\n\tif len(subpacket) == 0 {\n\t\terr = errors.StructuralError(\"zero length signature subpacket\")\n\t\treturn\n\t}\n\tpacketType = signatureSubpacketType(subpacket[0] & 0x7f)\n\tisCritical = subpacket[0]&0x80 == 0x80\n\tsubpacket = subpacket[1:]\n\tsig.rawSubpackets = append(sig.rawSubpackets, outputSubpacket{isHashed, packetType, isCritical, subpacket})\n\tif !isHashed &&\n\t\tpacketType != issuerSubpacket &&\n\t\tpacketType != issuerFingerprintSubpacket &&\n\t\tpacketType != embeddedSignatureSubpacket {\n\t\treturn\n\t}\n\tswitch packetType {\n\tcase creationTimeSubpacket:\n\t\tif len(subpacket) != 4 {\n\t\t\terr = errors.StructuralError(\"signature creation time not four bytes\")\n\t\t\treturn\n\t\t}\n\t\tt := binary.BigEndian.Uint32(subpacket)\n\t\tsig.CreationTime = time.Unix(int64(t), 0)\n\tcase signatureExpirationSubpacket:\n\t\t// Signature expiration time, section 5.2.3.18\n\t\tif len(subpacket) != 4 {\n\t\t\terr = errors.StructuralError(\"expiration subpacket with bad length\")\n\t\t\treturn\n\t\t}\n\t\tsig.SigLifetimeSecs = new(uint32)\n\t\t*sig.SigLifetimeSecs = binary.BigEndian.Uint32(subpacket)\n\tcase exportableCertSubpacket:\n\t\tif subpacket[0] == 0 {\n\t\t\terr = errors.UnsupportedError(\"signature with non-exportable certification\")\n\t\t\treturn\n\t\t}\n\tcase trustSubpacket:\n\t\tif len(subpacket) != 2 {\n\t\t\terr = errors.StructuralError(\"trust subpacket with bad length\")\n\t\t\treturn\n\t\t}\n\t\t// Trust level and amount, section 5.2.3.21\n\t\tsig.TrustLevel = TrustLevel(subpacket[0])\n\t\tsig.TrustAmount = TrustAmount(subpacket[1])\n\tcase regularExpressionSubpacket:\n\t\tif len(subpacket) == 0 {\n\t\t\terr = errors.StructuralError(\"regexp subpacket with bad length\")\n\t\t\treturn\n\t\t}\n\t\t// Trust regular expression, section 5.2.3.22\n\t\t// RFC specifies the string should be null-terminated; remove a null byte from the end\n\t\tif subpacket[len(subpacket)-1] != 0x00 {\n\t\t\terr = errors.StructuralError(\"expected regular expression to be null-terminated\")\n\t\t\treturn\n\t\t}\n\t\ttrustRegularExpression := string(subpacket[:len(subpacket)-1])\n\t\tsig.TrustRegularExpression = &trustRegularExpression\n\tcase keyExpirationSubpacket:\n\t\t// Key expiration time, section 5.2.3.13\n\t\tif len(subpacket) != 4 {\n\t\t\terr = errors.StructuralError(\"key expiration subpacket with bad length\")\n\t\t\treturn\n\t\t}\n\t\tsig.KeyLifetimeSecs = new(uint32)\n\t\t*sig.KeyLifetimeSecs = binary.BigEndian.Uint32(subpacket)\n\tcase prefSymmetricAlgosSubpacket:\n\t\t// Preferred symmetric algorithms, section 5.2.3.14\n\t\tsig.PreferredSymmetric = make([]byte, len(subpacket))\n\t\tcopy(sig.PreferredSymmetric, subpacket)\n\tcase issuerSubpacket:\n\t\t// Issuer, section 5.2.3.12\n\t\tif sig.Version > 4 && isHashed {\n\t\t\terr = errors.StructuralError(\"issuer subpacket found in v6 key\")\n\t\t\treturn\n\t\t}\n\t\tif len(subpacket) != 8 {\n\t\t\terr = errors.StructuralError(\"issuer subpacket with bad length\")\n\t\t\treturn\n\t\t}\n\t\tif sig.Version <= 4 {\n\t\t\tsig.IssuerKeyId = new(uint64)\n\t\t\t*sig.IssuerKeyId = binary.BigEndian.Uint64(subpacket)\n\t\t}\n\tcase notationDataSubpacket:\n\t\t// Notation data, section 5.2.3.24\n\t\tif len(subpacket) < 8 {\n\t\t\terr = errors.StructuralError(\"notation data subpacket with bad length\")\n\t\t\treturn\n\t\t}\n\n\t\tnameLength := uint32(subpacket[4])<<8 | uint32(subpacket[5])\n\t\tvalueLength := uint32(subpacket[6])<<8 | uint32(subpacket[7])\n\t\tif len(subpacket) != int(nameLength)+int(valueLength)+8 {\n\t\t\terr = errors.StructuralError(\"notation data subpacket with bad length\")\n\t\t\treturn\n\t\t}\n\n\t\tnotation := Notation{\n\t\t\tIsHumanReadable: (subpacket[0] & 0x80) == 0x80,\n\t\t\tName:            string(subpacket[8:(nameLength + 8)]),\n\t\t\tValue:           subpacket[(nameLength + 8):(valueLength + nameLength + 8)],\n\t\t\tIsCritical:      isCritical,\n\t\t}\n\n\t\tsig.Notations = append(sig.Notations, &notation)\n\tcase prefHashAlgosSubpacket:\n\t\t// Preferred hash algorithms, section 5.2.3.16\n\t\tsig.PreferredHash = make([]byte, len(subpacket))\n\t\tcopy(sig.PreferredHash, subpacket)\n\tcase prefCompressionSubpacket:\n\t\t// Preferred compression algorithms, section 5.2.3.17\n\t\tsig.PreferredCompression = make([]byte, len(subpacket))\n\t\tcopy(sig.PreferredCompression, subpacket)\n\tcase keyserverPrefsSubpacket:\n\t\t// Keyserver preferences, section 5.2.3.25\n\t\tsig.KeyserverPrefsValid = true\n\t\tif len(subpacket) == 0 {\n\t\t\treturn\n\t\t}\n\t\tif subpacket[0]&KeyserverPrefNoModify != 0 {\n\t\t\tsig.KeyserverPrefNoModify = true\n\t\t}\n\tcase prefKeyserverSubpacket:\n\t\t// Preferred keyserver, section 5.2.3.26\n\t\tsig.PreferredKeyserver = string(subpacket)\n\tcase primaryUserIdSubpacket:\n\t\t// Primary User ID, section 5.2.3.27\n\t\tif len(subpacket) != 1 {\n\t\t\terr = errors.StructuralError(\"primary user id subpacket with bad length\")\n\t\t\treturn\n\t\t}\n\t\tsig.IsPrimaryId = new(bool)\n\t\tif subpacket[0] > 0 {\n\t\t\t*sig.IsPrimaryId = true\n\t\t}\n\tcase keyFlagsSubpacket:\n\t\t// Key flags, section 5.2.3.29\n\t\tsig.FlagsValid = true\n\t\tif len(subpacket) == 0 {\n\t\t\treturn\n\t\t}\n\t\tif subpacket[0]&KeyFlagCertify != 0 {\n\t\t\tsig.FlagCertify = true\n\t\t}\n\t\tif subpacket[0]&KeyFlagSign != 0 {\n\t\t\tsig.FlagSign = true\n\t\t}\n\t\tif subpacket[0]&KeyFlagEncryptCommunications != 0 {\n\t\t\tsig.FlagEncryptCommunications = true\n\t\t}\n\t\tif subpacket[0]&KeyFlagEncryptStorage != 0 {\n\t\t\tsig.FlagEncryptStorage = true\n\t\t}\n\t\tif subpacket[0]&KeyFlagSplitKey != 0 {\n\t\t\tsig.FlagSplitKey = true\n\t\t}\n\t\tif subpacket[0]&KeyFlagAuthenticate != 0 {\n\t\t\tsig.FlagAuthenticate = true\n\t\t}\n\t\tif subpacket[0]&KeyFlagGroupKey != 0 {\n\t\t\tsig.FlagGroupKey = true\n\t\t}\n\tcase signerUserIdSubpacket:\n\t\tuserId := string(subpacket)\n\t\tsig.SignerUserId = &userId\n\tcase reasonForRevocationSubpacket:\n\t\t// Reason For Revocation, section 5.2.3.31\n\t\tif len(subpacket) == 0 {\n\t\t\terr = errors.StructuralError(\"empty revocation reason subpacket\")\n\t\t\treturn\n\t\t}\n\t\tsig.RevocationReason = new(ReasonForRevocation)\n\t\t*sig.RevocationReason = NewReasonForRevocation(subpacket[0])\n\t\tsig.RevocationReasonText = string(subpacket[1:])\n\tcase featuresSubpacket:\n\t\t// Features subpacket, section 5.2.3.32 specifies a very general\n\t\t// mechanism for OpenPGP implementations to signal support for new\n\t\t// features.\n\t\tif len(subpacket) > 0 {\n\t\t\tif subpacket[0]&0x01 != 0 {\n\t\t\t\tsig.SEIPDv1 = true\n\t\t\t}\n\t\t\t// 0x02 and 0x04 are reserved\n\t\t\tif subpacket[0]&0x08 != 0 {\n\t\t\t\tsig.SEIPDv2 = true\n\t\t\t}\n\t\t}\n\tcase embeddedSignatureSubpacket:\n\t\t// Only usage is in signatures that cross-certify\n\t\t// signing subkeys. section 5.2.3.34 describes the\n\t\t// format, with its usage described in section 11.1\n\t\tif sig.EmbeddedSignature != nil {\n\t\t\terr = errors.StructuralError(\"Cannot have multiple embedded signatures\")\n\t\t\treturn\n\t\t}\n\t\tsig.EmbeddedSignature = new(Signature)\n\t\tif err := sig.EmbeddedSignature.parse(bytes.NewBuffer(subpacket)); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif sigType := sig.EmbeddedSignature.SigType; sigType != SigTypePrimaryKeyBinding {\n\t\t\treturn nil, errors.StructuralError(\"cross-signature has unexpected type \" + strconv.Itoa(int(sigType)))\n\t\t}\n\tcase policyUriSubpacket:\n\t\t// Policy URI, section 5.2.3.28\n\t\tsig.PolicyURI = string(subpacket)\n\tcase issuerFingerprintSubpacket:\n\t\tif len(subpacket) == 0 {\n\t\t\terr = errors.StructuralError(\"empty issuer fingerprint subpacket\")\n\t\t\treturn\n\t\t}\n\t\tv, l := subpacket[0], len(subpacket[1:])\n\t\tif v >= 5 && l != 32 || v < 5 && l != 20 {\n\t\t\treturn nil, errors.StructuralError(\"bad fingerprint length\")\n\t\t}\n\t\tsig.IssuerFingerprint = make([]byte, l)\n\t\tcopy(sig.IssuerFingerprint, subpacket[1:])\n\t\tsig.IssuerKeyId = new(uint64)\n\t\tif v >= 5 {\n\t\t\t*sig.IssuerKeyId = binary.BigEndian.Uint64(subpacket[1:9])\n\t\t} else {\n\t\t\t*sig.IssuerKeyId = binary.BigEndian.Uint64(subpacket[13:21])\n\t\t}\n\tcase intendedRecipientSubpacket:\n\t\t// Intended Recipient Fingerprint, section 5.2.3.36\n\t\tif len(subpacket) < 1 {\n\t\t\treturn nil, errors.StructuralError(\"invalid intended recipient fingerpring length\")\n\t\t}\n\t\tversion, length := subpacket[0], len(subpacket[1:])\n\t\tif version >= 5 && length != 32 || version < 5 && length != 20 {\n\t\t\treturn nil, errors.StructuralError(\"invalid fingerprint length\")\n\t\t}\n\t\tfingerprint := make([]byte, length)\n\t\tcopy(fingerprint, subpacket[1:])\n\t\tsig.IntendedRecipients = append(sig.IntendedRecipients, &Recipient{int(version), fingerprint})\n\tcase prefCipherSuitesSubpacket:\n\t\t// Preferred AEAD cipher suites, section 5.2.3.15\n\t\tif len(subpacket)%2 != 0 {\n\t\t\terr = errors.StructuralError(\"invalid aead cipher suite length\")\n\t\t\treturn\n\t\t}\n\n\t\tsig.PreferredCipherSuites = make([][2]byte, len(subpacket)/2)\n\n\t\tfor i := 0; i < len(subpacket)/2; i++ {\n\t\t\tsig.PreferredCipherSuites[i] = [2]uint8{subpacket[2*i], subpacket[2*i+1]}\n\t\t}\n\tdefault:\n\t\tif isCritical {\n\t\t\terr = errors.UnsupportedError(\"unknown critical signature subpacket type \" + strconv.Itoa(int(packetType)))\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n\nTruncated:\n\terr = errors.StructuralError(\"signature subpacket truncated\")\n\treturn\n}\n\n// subpacketLengthLength returns the length, in bytes, of an encoded length value.\nfunc subpacketLengthLength(length int) int {\n\tif length < 192 {\n\t\treturn 1\n\t}\n\tif length < 16320 {\n\t\treturn 2\n\t}\n\treturn 5\n}\n\nfunc (sig *Signature) CheckKeyIdOrFingerprint(pk *PublicKey) bool {\n\tif sig.IssuerFingerprint != nil && len(sig.IssuerFingerprint) >= 20 {\n\t\treturn bytes.Equal(sig.IssuerFingerprint, pk.Fingerprint)\n\t}\n\treturn sig.IssuerKeyId != nil && *sig.IssuerKeyId == pk.KeyId\n}\n\nfunc (sig *Signature) CheckKeyIdOrFingerprintExplicit(fingerprint []byte, keyId uint64) bool {\n\tif sig.IssuerFingerprint != nil && len(sig.IssuerFingerprint) >= 20 && fingerprint != nil {\n\t\treturn bytes.Equal(sig.IssuerFingerprint, fingerprint)\n\t}\n\treturn sig.IssuerKeyId != nil && *sig.IssuerKeyId == keyId\n}\n\n// serializeSubpacketLength marshals the given length into to.\nfunc serializeSubpacketLength(to []byte, length int) int {\n\t// RFC 9580, Section 4.2.1.\n\tif length < 192 {\n\t\tto[0] = byte(length)\n\t\treturn 1\n\t}\n\tif length < 16320 {\n\t\tlength -= 192\n\t\tto[0] = byte((length >> 8) + 192)\n\t\tto[1] = byte(length)\n\t\treturn 2\n\t}\n\tto[0] = 255\n\tto[1] = byte(length >> 24)\n\tto[2] = byte(length >> 16)\n\tto[3] = byte(length >> 8)\n\tto[4] = byte(length)\n\treturn 5\n}\n\n// subpacketsLength returns the serialized length, in bytes, of the given\n// subpackets.\nfunc subpacketsLength(subpackets []outputSubpacket, hashed bool) (length int) {\n\tfor _, subpacket := range subpackets {\n\t\tif subpacket.hashed == hashed {\n\t\t\tlength += subpacketLengthLength(len(subpacket.contents) + 1)\n\t\t\tlength += 1 // type byte\n\t\t\tlength += len(subpacket.contents)\n\t\t}\n\t}\n\treturn\n}\n\n// serializeSubpackets marshals the given subpackets into to.\nfunc serializeSubpackets(to []byte, subpackets []outputSubpacket, hashed bool) {\n\tfor _, subpacket := range subpackets {\n\t\tif subpacket.hashed == hashed {\n\t\t\tn := serializeSubpacketLength(to, len(subpacket.contents)+1)\n\t\t\tto[n] = byte(subpacket.subpacketType)\n\t\t\tif subpacket.isCritical {\n\t\t\t\tto[n] |= 0x80\n\t\t\t}\n\t\t\tto = to[1+n:]\n\t\t\tn = copy(to, subpacket.contents)\n\t\t\tto = to[n:]\n\t\t}\n\t}\n}\n\n// SigExpired returns whether sig is a signature that has expired or is created\n// in the future.\nfunc (sig *Signature) SigExpired(currentTime time.Time) bool {\n\tif sig.CreationTime.Unix() > currentTime.Unix() {\n\t\treturn true\n\t}\n\tif sig.SigLifetimeSecs == nil || *sig.SigLifetimeSecs == 0 {\n\t\treturn false\n\t}\n\texpiry := sig.CreationTime.Add(time.Duration(*sig.SigLifetimeSecs) * time.Second)\n\treturn currentTime.Unix() > expiry.Unix()\n}\n\n// buildHashSuffix constructs the HashSuffix member of sig in preparation for signing.\nfunc (sig *Signature) buildHashSuffix(hashedSubpackets []byte) (err error) {\n\tvar hashId byte\n\tvar ok bool\n\n\tif sig.Version < 5 {\n\t\thashId, ok = algorithm.HashToHashIdWithSha1(sig.Hash)\n\t} else {\n\t\thashId, ok = algorithm.HashToHashId(sig.Hash)\n\t}\n\n\tif !ok {\n\t\tsig.HashSuffix = nil\n\t\treturn errors.InvalidArgumentError(\"hash cannot be represented in OpenPGP: \" + strconv.Itoa(int(sig.Hash)))\n\t}\n\n\thashedFields := bytes.NewBuffer([]byte{\n\t\tuint8(sig.Version),\n\t\tuint8(sig.SigType),\n\t\tuint8(sig.PubKeyAlgo),\n\t\tuint8(hashId),\n\t})\n\thashedSubpacketsLength := len(hashedSubpackets)\n\tif sig.Version == 6 {\n\t\t// v6 signatures store the length in 4 octets\n\t\thashedFields.Write([]byte{\n\t\t\tuint8(hashedSubpacketsLength >> 24),\n\t\t\tuint8(hashedSubpacketsLength >> 16),\n\t\t\tuint8(hashedSubpacketsLength >> 8),\n\t\t\tuint8(hashedSubpacketsLength),\n\t\t})\n\t} else {\n\t\thashedFields.Write([]byte{\n\t\t\tuint8(hashedSubpacketsLength >> 8),\n\t\t\tuint8(hashedSubpacketsLength),\n\t\t})\n\t}\n\tlenPrefix := hashedFields.Len()\n\thashedFields.Write(hashedSubpackets)\n\n\tvar l uint64 = uint64(lenPrefix + len(hashedSubpackets))\n\tif sig.Version == 5 {\n\t\t// v5 case\n\t\thashedFields.Write([]byte{0x05, 0xff})\n\t\thashedFields.Write([]byte{\n\t\t\tuint8(l >> 56), uint8(l >> 48), uint8(l >> 40), uint8(l >> 32),\n\t\t\tuint8(l >> 24), uint8(l >> 16), uint8(l >> 8), uint8(l),\n\t\t})\n\t} else {\n\t\t// v4 and v6 case\n\t\thashedFields.Write([]byte{byte(sig.Version), 0xff})\n\t\thashedFields.Write([]byte{\n\t\t\tuint8(l >> 24), uint8(l >> 16), uint8(l >> 8), uint8(l),\n\t\t})\n\t}\n\tsig.HashSuffix = make([]byte, hashedFields.Len())\n\tcopy(sig.HashSuffix, hashedFields.Bytes())\n\treturn\n}\n\nfunc (sig *Signature) signPrepareHash(h hash.Hash) (digest []byte, err error) {\n\thashedSubpacketsLen := subpacketsLength(sig.outSubpackets, true)\n\thashedSubpackets := make([]byte, hashedSubpacketsLen)\n\tserializeSubpackets(hashedSubpackets, sig.outSubpackets, true)\n\terr = sig.buildHashSuffix(hashedSubpackets)\n\tif err != nil {\n\t\treturn\n\t}\n\tif sig.Version == 5 && (sig.SigType == 0x00 || sig.SigType == 0x01) {\n\t\tsig.AddMetadataToHashSuffix()\n\t}\n\n\th.Write(sig.HashSuffix)\n\tdigest = h.Sum(nil)\n\tcopy(sig.HashTag[:], digest)\n\treturn\n}\n\n// PrepareSign must be called to create a hash object before Sign for v6 signatures.\n// The created hash object initially hashes a randomly generated salt\n// as required by v6 signatures. The generated salt is stored in sig. If the signature is not v6,\n// the method returns an empty hash object.\n// See RFC 9580 Section 5.2.4.\nfunc (sig *Signature) PrepareSign(config *Config) (hash.Hash, error) {\n\tif !sig.Hash.Available() {\n\t\treturn nil, errors.UnsupportedError(\"hash function\")\n\t}\n\thasher := sig.Hash.New()\n\tif sig.Version == 6 {\n\t\tif sig.salt == nil {\n\t\t\tvar err error\n\t\t\tsig.salt, err = SignatureSaltForHash(sig.Hash, config.Random())\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\thasher.Write(sig.salt)\n\t}\n\treturn hasher, nil\n}\n\n// SetSalt sets the signature salt for v6 signatures.\n// Assumes salt is generated correctly and checks if length matches.\n// If the signature is not v6, the method ignores the salt.\n// Use PrepareSign whenever possible instead of generating and\n// hashing the salt externally.\n// See RFC 9580 Section 5.2.4.\nfunc (sig *Signature) SetSalt(salt []byte) error {\n\tif sig.Version == 6 {\n\t\texpectedSaltLength, err := SaltLengthForHash(sig.Hash)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif salt == nil || len(salt) != expectedSaltLength {\n\t\t\treturn errors.InvalidArgumentError(\"unexpected salt size for the given hash algorithm\")\n\t\t}\n\t\tsig.salt = salt\n\t}\n\treturn nil\n}\n\n// PrepareVerify must be called to create a hash object before verifying v6 signatures.\n// The created hash object initially hashes the internally stored salt.\n// If the signature is not v6, the method returns an empty hash object.\n// See RFC 9580 Section 5.2.4.\nfunc (sig *Signature) PrepareVerify() (hash.Hash, error) {\n\tif !sig.Hash.Available() {\n\t\treturn nil, errors.UnsupportedError(\"hash function\")\n\t}\n\thasher := sig.Hash.New()\n\tif sig.Version == 6 {\n\t\tif sig.salt == nil {\n\t\t\treturn nil, errors.StructuralError(\"v6 requires a salt for the hash to be signed\")\n\t\t}\n\t\thasher.Write(sig.salt)\n\t}\n\treturn hasher, nil\n}\n\n// Sign signs a message with a private key. The hash, h, must contain\n// the hash of the message to be signed and will be mutated by this function.\n// On success, the signature is stored in sig. Call Serialize to write it out.\n// If config is nil, sensible defaults will be used.\nfunc (sig *Signature) Sign(h hash.Hash, priv *PrivateKey, config *Config) (err error) {\n\tif priv.Dummy() {\n\t\treturn errors.ErrDummyPrivateKey(\"dummy key found\")\n\t}\n\tsig.Version = priv.PublicKey.Version\n\tsig.IssuerFingerprint = priv.PublicKey.Fingerprint\n\tif sig.Version < 6 && config.RandomizeSignaturesViaNotation() {\n\t\tsig.removeNotationsWithName(SaltNotationName)\n\t\tsalt, err := SignatureSaltForHash(sig.Hash, config.Random())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tnotation := Notation{\n\t\t\tName:            SaltNotationName,\n\t\t\tValue:           salt,\n\t\t\tIsCritical:      false,\n\t\t\tIsHumanReadable: false,\n\t\t}\n\t\tsig.Notations = append(sig.Notations, &notation)\n\t}\n\tsig.outSubpackets, err = sig.buildSubpackets(priv.PublicKey)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdigest, err := sig.signPrepareHash(h)\n\tif err != nil {\n\t\treturn\n\t}\n\tswitch priv.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly:\n\t\t// supports both *rsa.PrivateKey and crypto.Signer\n\t\tsigdata, err := priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, sig.Hash)\n\t\tif err == nil {\n\t\t\tsig.RSASignature = encoding.NewMPI(sigdata)\n\t\t}\n\tcase PubKeyAlgoDSA:\n\t\tdsaPriv := priv.PrivateKey.(*dsa.PrivateKey)\n\n\t\t// Need to truncate hashBytes to match FIPS 186-3 section 4.6.\n\t\tsubgroupSize := (dsaPriv.Q.BitLen() + 7) / 8\n\t\tif len(digest) > subgroupSize {\n\t\t\tdigest = digest[:subgroupSize]\n\t\t}\n\t\tr, s, err := dsa.Sign(config.Random(), dsaPriv, digest)\n\t\tif err == nil {\n\t\t\tsig.DSASigR = new(encoding.MPI).SetBig(r)\n\t\t\tsig.DSASigS = new(encoding.MPI).SetBig(s)\n\t\t}\n\tcase PubKeyAlgoECDSA:\n\t\tvar r, s *big.Int\n\t\tif sk, ok := priv.PrivateKey.(*ecdsa.PrivateKey); ok {\n\t\t\tr, s, err = ecdsa.Sign(config.Random(), sk, digest)\n\t\t} else {\n\t\t\tvar b []byte\n\t\t\tb, err = priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, sig.Hash)\n\t\t\tif err == nil {\n\t\t\t\tr, s, err = unwrapECDSASig(b)\n\t\t\t}\n\t\t}\n\n\t\tif err == nil {\n\t\t\tsig.ECDSASigR = new(encoding.MPI).SetBig(r)\n\t\t\tsig.ECDSASigS = new(encoding.MPI).SetBig(s)\n\t\t}\n\tcase PubKeyAlgoEdDSA:\n\t\tsk := priv.PrivateKey.(*eddsa.PrivateKey)\n\t\tr, s, err := eddsa.Sign(sk, digest)\n\t\tif err == nil {\n\t\t\tsig.EdDSASigR = encoding.NewMPI(r)\n\t\t\tsig.EdDSASigS = encoding.NewMPI(s)\n\t\t}\n\tcase PubKeyAlgoEd25519:\n\t\tsk := priv.PrivateKey.(*ed25519.PrivateKey)\n\t\tsignature, err := ed25519.Sign(sk, digest)\n\t\tif err == nil {\n\t\t\tsig.EdSig = signature\n\t\t}\n\tcase PubKeyAlgoEd448:\n\t\tsk := priv.PrivateKey.(*ed448.PrivateKey)\n\t\tsignature, err := ed448.Sign(sk, digest)\n\t\tif err == nil {\n\t\t\tsig.EdSig = signature\n\t\t}\n\tdefault:\n\t\terr = errors.UnsupportedError(\"public key algorithm: \" + strconv.Itoa(int(sig.PubKeyAlgo)))\n\t}\n\n\treturn\n}\n\n// unwrapECDSASig parses the two integer components of an ASN.1-encoded ECDSA signature.\nfunc unwrapECDSASig(b []byte) (r, s *big.Int, err error) {\n\tvar ecsdaSig struct {\n\t\tR, S *big.Int\n\t}\n\t_, err = asn1.Unmarshal(b, &ecsdaSig)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn ecsdaSig.R, ecsdaSig.S, nil\n}\n\n// SignUserId computes a signature from priv, asserting that pub is a valid\n// key for the identity id.  On success, the signature is stored in sig. Call\n// Serialize to write it out.\n// If config is nil, sensible defaults will be used.\nfunc (sig *Signature) SignUserId(id string, pub *PublicKey, priv *PrivateKey, config *Config) error {\n\tif priv.Dummy() {\n\t\treturn errors.ErrDummyPrivateKey(\"dummy key found\")\n\t}\n\tprepareHash, err := sig.PrepareSign(config)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := userIdSignatureHash(id, pub, prepareHash); err != nil {\n\t\treturn err\n\t}\n\treturn sig.Sign(prepareHash, priv, config)\n}\n\n// SignDirectKeyBinding computes a signature from priv\n// On success, the signature is stored in sig.\n// Call Serialize to write it out.\n// If config is nil, sensible defaults will be used.\nfunc (sig *Signature) SignDirectKeyBinding(pub *PublicKey, priv *PrivateKey, config *Config) error {\n\tif priv.Dummy() {\n\t\treturn errors.ErrDummyPrivateKey(\"dummy key found\")\n\t}\n\tprepareHash, err := sig.PrepareSign(config)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := directKeySignatureHash(pub, prepareHash); err != nil {\n\t\treturn err\n\t}\n\treturn sig.Sign(prepareHash, priv, config)\n}\n\n// CrossSignKey computes a signature from signingKey on pub hashed using hashKey. On success,\n// the signature is stored in sig. Call Serialize to write it out.\n// If config is nil, sensible defaults will be used.\nfunc (sig *Signature) CrossSignKey(pub *PublicKey, hashKey *PublicKey, signingKey *PrivateKey,\n\tconfig *Config) error {\n\tprepareHash, err := sig.PrepareSign(config)\n\tif err != nil {\n\t\treturn err\n\t}\n\th, err := keySignatureHash(hashKey, pub, prepareHash)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn sig.Sign(h, signingKey, config)\n}\n\n// SignKey computes a signature from priv, asserting that pub is a subkey. On\n// success, the signature is stored in sig. Call Serialize to write it out.\n// If config is nil, sensible defaults will be used.\nfunc (sig *Signature) SignKey(pub *PublicKey, priv *PrivateKey, config *Config) error {\n\tif priv.Dummy() {\n\t\treturn errors.ErrDummyPrivateKey(\"dummy key found\")\n\t}\n\tprepareHash, err := sig.PrepareSign(config)\n\tif err != nil {\n\t\treturn err\n\t}\n\th, err := keySignatureHash(&priv.PublicKey, pub, prepareHash)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn sig.Sign(h, priv, config)\n}\n\n// RevokeKey computes a revocation signature of pub using priv. On success, the signature is\n// stored in sig. Call Serialize to write it out.\n// If config is nil, sensible defaults will be used.\nfunc (sig *Signature) RevokeKey(pub *PublicKey, priv *PrivateKey, config *Config) error {\n\tprepareHash, err := sig.PrepareSign(config)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := keyRevocationHash(pub, prepareHash); err != nil {\n\t\treturn err\n\t}\n\treturn sig.Sign(prepareHash, priv, config)\n}\n\n// RevokeSubkey computes a subkey revocation signature of pub using priv.\n// On success, the signature is stored in sig. Call Serialize to write it out.\n// If config is nil, sensible defaults will be used.\nfunc (sig *Signature) RevokeSubkey(pub *PublicKey, priv *PrivateKey, config *Config) error {\n\t// Identical to a subkey binding signature\n\treturn sig.SignKey(pub, priv, config)\n}\n\n// Serialize marshals sig to w. Sign, SignUserId or SignKey must have been\n// called first.\nfunc (sig *Signature) Serialize(w io.Writer) (err error) {\n\tif len(sig.outSubpackets) == 0 {\n\t\tsig.outSubpackets = sig.rawSubpackets\n\t}\n\tif sig.RSASignature == nil && sig.DSASigR == nil && sig.ECDSASigR == nil && sig.EdDSASigR == nil && sig.EdSig == nil {\n\t\treturn errors.InvalidArgumentError(\"Signature: need to call Sign, SignUserId or SignKey before Serialize\")\n\t}\n\n\tsigLength := 0\n\tswitch sig.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly:\n\t\tsigLength = int(sig.RSASignature.EncodedLength())\n\tcase PubKeyAlgoDSA:\n\t\tsigLength = int(sig.DSASigR.EncodedLength())\n\t\tsigLength += int(sig.DSASigS.EncodedLength())\n\tcase PubKeyAlgoECDSA:\n\t\tsigLength = int(sig.ECDSASigR.EncodedLength())\n\t\tsigLength += int(sig.ECDSASigS.EncodedLength())\n\tcase PubKeyAlgoEdDSA:\n\t\tsigLength = int(sig.EdDSASigR.EncodedLength())\n\t\tsigLength += int(sig.EdDSASigS.EncodedLength())\n\tcase PubKeyAlgoEd25519:\n\t\tsigLength = ed25519.SignatureSize\n\tcase PubKeyAlgoEd448:\n\t\tsigLength = ed448.SignatureSize\n\tdefault:\n\t\tpanic(\"impossible\")\n\t}\n\n\thashedSubpacketsLen := subpacketsLength(sig.outSubpackets, true)\n\tunhashedSubpacketsLen := subpacketsLength(sig.outSubpackets, false)\n\tlength := 4 + /* length of version|signature type|public-key algorithm|hash algorithm */\n\t\t2 /* length of hashed subpackets */ + hashedSubpacketsLen +\n\t\t2 /* length of unhashed subpackets */ + unhashedSubpacketsLen +\n\t\t2 /* hash tag */ + sigLength\n\tif sig.Version == 6 {\n\t\tlength += 4 + /* the two length fields are four-octet instead of two */\n\t\t\t1 + /* salt length */\n\t\t\tlen(sig.salt) /* length salt */\n\t}\n\terr = serializeHeader(w, packetTypeSignature, length)\n\tif err != nil {\n\t\treturn\n\t}\n\terr = sig.serializeBody(w)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn\n}\n\nfunc (sig *Signature) serializeBody(w io.Writer) (err error) {\n\tvar fields []byte\n\tif sig.Version == 6 {\n\t\t// v6 signatures use 4 octets for length\n\t\thashedSubpacketsLen :=\n\t\t\tuint32(uint32(sig.HashSuffix[4])<<24) |\n\t\t\t\tuint32(uint32(sig.HashSuffix[5])<<16) |\n\t\t\t\tuint32(uint32(sig.HashSuffix[6])<<8) |\n\t\t\t\tuint32(sig.HashSuffix[7])\n\t\tfields = sig.HashSuffix[:8+hashedSubpacketsLen]\n\t} else {\n\t\thashedSubpacketsLen := uint16(uint16(sig.HashSuffix[4])<<8) |\n\t\t\tuint16(sig.HashSuffix[5])\n\t\tfields = sig.HashSuffix[:6+hashedSubpacketsLen]\n\n\t}\n\t_, err = w.Write(fields)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tunhashedSubpacketsLen := subpacketsLength(sig.outSubpackets, false)\n\tvar unhashedSubpackets []byte\n\tif sig.Version == 6 {\n\t\tunhashedSubpackets = make([]byte, 4+unhashedSubpacketsLen)\n\t\tunhashedSubpackets[0] = byte(unhashedSubpacketsLen >> 24)\n\t\tunhashedSubpackets[1] = byte(unhashedSubpacketsLen >> 16)\n\t\tunhashedSubpackets[2] = byte(unhashedSubpacketsLen >> 8)\n\t\tunhashedSubpackets[3] = byte(unhashedSubpacketsLen)\n\t\tserializeSubpackets(unhashedSubpackets[4:], sig.outSubpackets, false)\n\t} else {\n\t\tunhashedSubpackets = make([]byte, 2+unhashedSubpacketsLen)\n\t\tunhashedSubpackets[0] = byte(unhashedSubpacketsLen >> 8)\n\t\tunhashedSubpackets[1] = byte(unhashedSubpacketsLen)\n\t\tserializeSubpackets(unhashedSubpackets[2:], sig.outSubpackets, false)\n\t}\n\n\t_, err = w.Write(unhashedSubpackets)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, err = w.Write(sig.HashTag[:])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif sig.Version == 6 {\n\t\t// write salt for v6 signatures\n\t\t_, err = w.Write([]byte{uint8(len(sig.salt))})\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\t_, err = w.Write(sig.salt)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\tswitch sig.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly:\n\t\t_, err = w.Write(sig.RSASignature.EncodedBytes())\n\tcase PubKeyAlgoDSA:\n\t\tif _, err = w.Write(sig.DSASigR.EncodedBytes()); err != nil {\n\t\t\treturn\n\t\t}\n\t\t_, err = w.Write(sig.DSASigS.EncodedBytes())\n\tcase PubKeyAlgoECDSA:\n\t\tif _, err = w.Write(sig.ECDSASigR.EncodedBytes()); err != nil {\n\t\t\treturn\n\t\t}\n\t\t_, err = w.Write(sig.ECDSASigS.EncodedBytes())\n\tcase PubKeyAlgoEdDSA:\n\t\tif _, err = w.Write(sig.EdDSASigR.EncodedBytes()); err != nil {\n\t\t\treturn\n\t\t}\n\t\t_, err = w.Write(sig.EdDSASigS.EncodedBytes())\n\tcase PubKeyAlgoEd25519:\n\t\terr = ed25519.WriteSignature(w, sig.EdSig)\n\tcase PubKeyAlgoEd448:\n\t\terr = ed448.WriteSignature(w, sig.EdSig)\n\tdefault:\n\t\tpanic(\"impossible\")\n\t}\n\treturn\n}\n\n// outputSubpacket represents a subpacket to be marshaled.\ntype outputSubpacket struct {\n\thashed        bool // true if this subpacket is in the hashed area.\n\tsubpacketType signatureSubpacketType\n\tisCritical    bool\n\tcontents      []byte\n}\n\nfunc (sig *Signature) buildSubpackets(issuer PublicKey) (subpackets []outputSubpacket, err error) {\n\tcreationTime := make([]byte, 4)\n\tbinary.BigEndian.PutUint32(creationTime, uint32(sig.CreationTime.Unix()))\n\t// Signature Creation Time\n\tsubpackets = append(subpackets, outputSubpacket{true, creationTimeSubpacket, true, creationTime})\n\t// Signature Expiration Time\n\tif sig.SigLifetimeSecs != nil && *sig.SigLifetimeSecs != 0 {\n\t\tsigLifetime := make([]byte, 4)\n\t\tbinary.BigEndian.PutUint32(sigLifetime, *sig.SigLifetimeSecs)\n\t\tsubpackets = append(subpackets, outputSubpacket{true, signatureExpirationSubpacket, true, sigLifetime})\n\t}\n\t// Trust Signature\n\tif sig.TrustLevel != 0 {\n\t\tsubpackets = append(subpackets, outputSubpacket{true, trustSubpacket, true, []byte{byte(sig.TrustLevel), byte(sig.TrustAmount)}})\n\t}\n\t// Regular Expression\n\tif sig.TrustRegularExpression != nil {\n\t\t// RFC specifies the string should be null-terminated; add a null byte to the end\n\t\tsubpackets = append(subpackets, outputSubpacket{true, regularExpressionSubpacket, true, []byte(*sig.TrustRegularExpression + \"\\000\")})\n\t}\n\t// Key Expiration Time\n\tif sig.KeyLifetimeSecs != nil && *sig.KeyLifetimeSecs != 0 {\n\t\tkeyLifetime := make([]byte, 4)\n\t\tbinary.BigEndian.PutUint32(keyLifetime, *sig.KeyLifetimeSecs)\n\t\tsubpackets = append(subpackets, outputSubpacket{true, keyExpirationSubpacket, true, keyLifetime})\n\t}\n\t// Preferred Symmetric Ciphers for v1 SEIPD\n\tif len(sig.PreferredSymmetric) > 0 {\n\t\tsubpackets = append(subpackets, outputSubpacket{true, prefSymmetricAlgosSubpacket, false, sig.PreferredSymmetric})\n\t}\n\t// Issuer Key ID\n\tif sig.IssuerKeyId != nil && sig.Version == 4 {\n\t\tkeyId := make([]byte, 8)\n\t\tbinary.BigEndian.PutUint64(keyId, *sig.IssuerKeyId)\n\t\t// Note: making this critical breaks RPM <=4.16.\n\t\t// See: https://github.com/ProtonMail/go-crypto/issues/263\n\t\tsubpackets = append(subpackets, outputSubpacket{true, issuerSubpacket, false, keyId})\n\t}\n\t// Notation Data\n\tfor _, notation := range sig.Notations {\n\t\tsubpackets = append(\n\t\t\tsubpackets,\n\t\t\toutputSubpacket{\n\t\t\t\ttrue,\n\t\t\t\tnotationDataSubpacket,\n\t\t\t\tnotation.IsCritical,\n\t\t\t\tnotation.getData(),\n\t\t\t})\n\t}\n\t// Preferred Hash Algorithms\n\tif len(sig.PreferredHash) > 0 {\n\t\tsubpackets = append(subpackets, outputSubpacket{true, prefHashAlgosSubpacket, false, sig.PreferredHash})\n\t}\n\t// Preferred Compression Algorithms\n\tif len(sig.PreferredCompression) > 0 {\n\t\tsubpackets = append(subpackets, outputSubpacket{true, prefCompressionSubpacket, false, sig.PreferredCompression})\n\t}\n\t// Keyserver Preferences\n\t// Keyserver preferences may only appear in self-signatures or certification signatures.\n\tif sig.KeyserverPrefsValid {\n\t\tvar prefs byte\n\t\tif sig.KeyserverPrefNoModify {\n\t\t\tprefs |= KeyserverPrefNoModify\n\t\t}\n\t\tsubpackets = append(subpackets, outputSubpacket{true, keyserverPrefsSubpacket, false, []byte{prefs}})\n\t}\n\t// Preferred Keyserver\n\tif len(sig.PreferredKeyserver) > 0 {\n\t\tsubpackets = append(subpackets, outputSubpacket{true, prefKeyserverSubpacket, false, []uint8(sig.PreferredKeyserver)})\n\t}\n\t// Primary User ID\n\tif sig.IsPrimaryId != nil && *sig.IsPrimaryId {\n\t\tsubpackets = append(subpackets, outputSubpacket{true, primaryUserIdSubpacket, false, []byte{1}})\n\t}\n\t// Policy URI\n\tif len(sig.PolicyURI) > 0 {\n\t\tsubpackets = append(subpackets, outputSubpacket{true, policyUriSubpacket, false, []uint8(sig.PolicyURI)})\n\t}\n\t// Key Flags\n\t// Key flags may only appear in self-signatures or certification signatures.\n\tif sig.FlagsValid {\n\t\tvar flags byte\n\t\tif sig.FlagCertify {\n\t\t\tflags |= KeyFlagCertify\n\t\t}\n\t\tif sig.FlagSign {\n\t\t\tflags |= KeyFlagSign\n\t\t}\n\t\tif sig.FlagEncryptCommunications {\n\t\t\tflags |= KeyFlagEncryptCommunications\n\t\t}\n\t\tif sig.FlagEncryptStorage {\n\t\t\tflags |= KeyFlagEncryptStorage\n\t\t}\n\t\tif sig.FlagSplitKey {\n\t\t\tflags |= KeyFlagSplitKey\n\t\t}\n\t\tif sig.FlagAuthenticate {\n\t\t\tflags |= KeyFlagAuthenticate\n\t\t}\n\t\tif sig.FlagGroupKey {\n\t\t\tflags |= KeyFlagGroupKey\n\t\t}\n\t\tsubpackets = append(subpackets, outputSubpacket{true, keyFlagsSubpacket, true, []byte{flags}})\n\t}\n\t// Signer's User ID\n\tif sig.SignerUserId != nil {\n\t\tsubpackets = append(subpackets, outputSubpacket{true, signerUserIdSubpacket, false, []byte(*sig.SignerUserId)})\n\t}\n\t// Reason for Revocation\n\t// Revocation reason appears only in revocation signatures and is serialized as per section 5.2.3.31.\n\tif sig.RevocationReason != nil {\n\t\tsubpackets = append(subpackets, outputSubpacket{true, reasonForRevocationSubpacket, true,\n\t\t\tappend([]uint8{uint8(*sig.RevocationReason)}, []uint8(sig.RevocationReasonText)...)})\n\t}\n\t// Features\n\tvar features = byte(0x00)\n\tif sig.SEIPDv1 {\n\t\tfeatures |= 0x01\n\t}\n\tif sig.SEIPDv2 {\n\t\tfeatures |= 0x08\n\t}\n\tif features != 0x00 {\n\t\tsubpackets = append(subpackets, outputSubpacket{true, featuresSubpacket, false, []byte{features}})\n\t}\n\t// Embedded Signature\n\t// EmbeddedSignature appears only in subkeys capable of signing and is serialized as per section 5.2.3.34.\n\tif sig.EmbeddedSignature != nil {\n\t\tvar buf bytes.Buffer\n\t\terr = sig.EmbeddedSignature.serializeBody(&buf)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tsubpackets = append(subpackets, outputSubpacket{true, embeddedSignatureSubpacket, true, buf.Bytes()})\n\t}\n\t// Issuer Fingerprint\n\tif sig.IssuerFingerprint != nil {\n\t\tcontents := append([]uint8{uint8(issuer.Version)}, sig.IssuerFingerprint...)\n\t\tsubpackets = append(subpackets, outputSubpacket{true, issuerFingerprintSubpacket, sig.Version >= 5, contents})\n\t}\n\t// Intended Recipient Fingerprint\n\tfor _, recipient := range sig.IntendedRecipients {\n\t\tsubpackets = append(\n\t\t\tsubpackets,\n\t\t\toutputSubpacket{\n\t\t\t\ttrue,\n\t\t\t\tintendedRecipientSubpacket,\n\t\t\t\tfalse,\n\t\t\t\trecipient.Serialize(),\n\t\t\t})\n\t}\n\t// Preferred AEAD Ciphersuites\n\tif len(sig.PreferredCipherSuites) > 0 {\n\t\tserialized := make([]byte, len(sig.PreferredCipherSuites)*2)\n\t\tfor i, cipherSuite := range sig.PreferredCipherSuites {\n\t\t\tserialized[2*i] = cipherSuite[0]\n\t\t\tserialized[2*i+1] = cipherSuite[1]\n\t\t}\n\t\tsubpackets = append(subpackets, outputSubpacket{true, prefCipherSuitesSubpacket, false, serialized})\n\t}\n\treturn\n}\n\n// AddMetadataToHashSuffix modifies the current hash suffix to include metadata\n// (format, filename, and time). Version 5 keys protect this data including it\n// in the hash computation. See section 5.2.4.\nfunc (sig *Signature) AddMetadataToHashSuffix() {\n\tif sig == nil || sig.Version != 5 {\n\t\treturn\n\t}\n\tif sig.SigType != 0x00 && sig.SigType != 0x01 {\n\t\treturn\n\t}\n\tlit := sig.Metadata\n\tif lit == nil {\n\t\t// This will translate into six 0x00 bytes.\n\t\tlit = &LiteralData{}\n\t}\n\n\t// Extract the current byte count\n\tn := sig.HashSuffix[len(sig.HashSuffix)-8:]\n\tl := uint64(\n\t\tuint64(n[0])<<56 | uint64(n[1])<<48 | uint64(n[2])<<40 | uint64(n[3])<<32 |\n\t\t\tuint64(n[4])<<24 | uint64(n[5])<<16 | uint64(n[6])<<8 | uint64(n[7]))\n\n\tsuffix := bytes.NewBuffer(nil)\n\tsuffix.Write(sig.HashSuffix[:l])\n\n\t// Add the metadata\n\tvar buf [4]byte\n\tbuf[0] = lit.Format\n\tfileName := lit.FileName\n\tif len(lit.FileName) > 255 {\n\t\tfileName = fileName[:255]\n\t}\n\tbuf[1] = byte(len(fileName))\n\tsuffix.Write(buf[:2])\n\tsuffix.Write([]byte(lit.FileName))\n\tbinary.BigEndian.PutUint32(buf[:], lit.Time)\n\tsuffix.Write(buf[:])\n\n\tsuffix.Write([]byte{0x05, 0xff})\n\tsuffix.Write([]byte{\n\t\tuint8(l >> 56), uint8(l >> 48), uint8(l >> 40), uint8(l >> 32),\n\t\tuint8(l >> 24), uint8(l >> 16), uint8(l >> 8), uint8(l),\n\t})\n\tsig.HashSuffix = suffix.Bytes()\n}\n\n// SaltLengthForHash selects the required salt length for the given hash algorithm,\n// as per Table 23 (Hash algorithm registry) of the crypto refresh.\n// See RFC 9580 Section 9.5.\nfunc SaltLengthForHash(hash crypto.Hash) (int, error) {\n\tswitch hash {\n\tcase crypto.SHA256, crypto.SHA224, crypto.SHA3_256:\n\t\treturn 16, nil\n\tcase crypto.SHA384:\n\t\treturn 24, nil\n\tcase crypto.SHA512, crypto.SHA3_512:\n\t\treturn 32, nil\n\tdefault:\n\t\treturn 0, errors.UnsupportedError(\"hash function not supported for V6 signatures\")\n\t}\n}\n\n// SignatureSaltForHash generates a random signature salt\n// with the length for the given hash algorithm.\n// See RFC 9580 Section 9.5.\nfunc SignatureSaltForHash(hash crypto.Hash, randReader io.Reader) ([]byte, error) {\n\tsaltLength, err := SaltLengthForHash(hash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsalt := make([]byte, saltLength)\n\t_, err = io.ReadFull(randReader, salt)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn salt, nil\n}\n\n// removeNotationsWithName removes all notations in this signature with the given name.\nfunc (sig *Signature) removeNotationsWithName(name string) {\n\tif sig == nil || sig.Notations == nil {\n\t\treturn\n\t}\n\tupdatedNotations := make([]*Notation, 0, len(sig.Notations))\n\tfor _, notation := range sig.Notations {\n\t\tif notation.Name != name {\n\t\t\tupdatedNotations = append(updatedNotations, notation)\n\t\t}\n\t}\n\tsig.Notations = updatedNotations\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetric_key_encrypted.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"bytes\"\n\t\"crypto/cipher\"\n\t\"crypto/sha256\"\n\t\"io\"\n\t\"strconv\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/s2k\"\n\t\"golang.org/x/crypto/hkdf\"\n)\n\n// This is the largest session key that we'll support. Since at most 256-bit cipher\n// is supported in OpenPGP, this is large enough to contain also the auth tag.\nconst maxSessionKeySizeInBytes = 64\n\n// SymmetricKeyEncrypted represents a passphrase protected session key. See RFC\n// 4880, section 5.3.\ntype SymmetricKeyEncrypted struct {\n\tVersion      int\n\tCipherFunc   CipherFunction\n\tMode         AEADMode\n\ts2k          func(out, in []byte)\n\tiv           []byte\n\tencryptedKey []byte // Contains also the authentication tag for AEAD\n}\n\n// parse parses an SymmetricKeyEncrypted packet as specified in\n// https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#name-symmetric-key-encrypted-ses\nfunc (ske *SymmetricKeyEncrypted) parse(r io.Reader) error {\n\tvar buf [1]byte\n\n\t// Version\n\tif _, err := readFull(r, buf[:]); err != nil {\n\t\treturn err\n\t}\n\tske.Version = int(buf[0])\n\tif ske.Version != 4 && ske.Version != 5 && ske.Version != 6 {\n\t\treturn errors.UnsupportedError(\"unknown SymmetricKeyEncrypted version\")\n\t}\n\n\tif V5Disabled && ske.Version == 5 {\n\t\treturn errors.UnsupportedError(\"support for parsing v5 entities is disabled; build with `-tags v5` if needed\")\n\t}\n\n\tif ske.Version > 5 {\n\t\t// Scalar octet count\n\t\tif _, err := readFull(r, buf[:]); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Cipher function\n\tif _, err := readFull(r, buf[:]); err != nil {\n\t\treturn err\n\t}\n\tske.CipherFunc = CipherFunction(buf[0])\n\tif !ske.CipherFunc.IsSupported() {\n\t\treturn errors.UnsupportedError(\"unknown cipher: \" + strconv.Itoa(int(buf[0])))\n\t}\n\n\tif ske.Version >= 5 {\n\t\t// AEAD mode\n\t\tif _, err := readFull(r, buf[:]); err != nil {\n\t\t\treturn errors.StructuralError(\"cannot read AEAD octet from packet\")\n\t\t}\n\t\tske.Mode = AEADMode(buf[0])\n\t}\n\n\tif ske.Version > 5 {\n\t\t// Scalar octet count\n\t\tif _, err := readFull(r, buf[:]); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tvar err error\n\tif ske.s2k, err = s2k.Parse(r); err != nil {\n\t\tif _, ok := err.(errors.ErrDummyPrivateKey); ok {\n\t\t\treturn errors.UnsupportedError(\"missing key GNU extension in session key\")\n\t\t}\n\t\treturn err\n\t}\n\n\tif ske.Version >= 5 {\n\t\t// AEAD IV\n\t\tiv := make([]byte, ske.Mode.IvLength())\n\t\t_, err := readFull(r, iv)\n\t\tif err != nil {\n\t\t\treturn errors.StructuralError(\"cannot read AEAD IV\")\n\t\t}\n\n\t\tske.iv = iv\n\t}\n\n\tencryptedKey := make([]byte, maxSessionKeySizeInBytes)\n\t// The session key may follow. We just have to try and read to find\n\t// out. If it exists then we limit it to maxSessionKeySizeInBytes.\n\tn, err := readFull(r, encryptedKey)\n\tif err != nil && err != io.ErrUnexpectedEOF {\n\t\treturn err\n\t}\n\n\tif n != 0 {\n\t\tif n == maxSessionKeySizeInBytes {\n\t\t\treturn errors.UnsupportedError(\"oversized encrypted session key\")\n\t\t}\n\t\tske.encryptedKey = encryptedKey[:n]\n\t}\n\treturn nil\n}\n\n// Decrypt attempts to decrypt an encrypted session key and returns the key and\n// the cipher to use when decrypting a subsequent Symmetrically Encrypted Data\n// packet.\nfunc (ske *SymmetricKeyEncrypted) Decrypt(passphrase []byte) ([]byte, CipherFunction, error) {\n\tkey := make([]byte, ske.CipherFunc.KeySize())\n\tske.s2k(key, passphrase)\n\tif len(ske.encryptedKey) == 0 {\n\t\treturn key, ske.CipherFunc, nil\n\t}\n\tswitch ske.Version {\n\tcase 4:\n\t\tplaintextKey, cipherFunc, err := ske.decryptV4(key)\n\t\treturn plaintextKey, cipherFunc, err\n\tcase 5, 6:\n\t\tplaintextKey, err := ske.aeadDecrypt(ske.Version, key)\n\t\treturn plaintextKey, CipherFunction(0), err\n\t}\n\terr := errors.UnsupportedError(\"unknown SymmetricKeyEncrypted version\")\n\treturn nil, CipherFunction(0), err\n}\n\nfunc (ske *SymmetricKeyEncrypted) decryptV4(key []byte) ([]byte, CipherFunction, error) {\n\t// the IV is all zeros\n\tiv := make([]byte, ske.CipherFunc.blockSize())\n\tc := cipher.NewCFBDecrypter(ske.CipherFunc.new(key), iv)\n\tplaintextKey := make([]byte, len(ske.encryptedKey))\n\tc.XORKeyStream(plaintextKey, ske.encryptedKey)\n\tcipherFunc := CipherFunction(plaintextKey[0])\n\tif cipherFunc.blockSize() == 0 {\n\t\treturn nil, ske.CipherFunc, errors.UnsupportedError(\n\t\t\t\"unknown cipher: \" + strconv.Itoa(int(cipherFunc)))\n\t}\n\tplaintextKey = plaintextKey[1:]\n\tif len(plaintextKey) != cipherFunc.KeySize() {\n\t\treturn nil, cipherFunc, errors.StructuralError(\n\t\t\t\"length of decrypted key not equal to cipher keysize\")\n\t}\n\treturn plaintextKey, cipherFunc, nil\n}\n\nfunc (ske *SymmetricKeyEncrypted) aeadDecrypt(version int, key []byte) ([]byte, error) {\n\tadata := []byte{0xc3, byte(version), byte(ske.CipherFunc), byte(ske.Mode)}\n\taead := getEncryptedKeyAeadInstance(ske.CipherFunc, ske.Mode, key, adata, version)\n\n\tplaintextKey, err := aead.Open(nil, ske.iv, ske.encryptedKey, adata)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn plaintextKey, nil\n}\n\n// SerializeSymmetricKeyEncrypted serializes a symmetric key packet to w.\n// The packet contains a random session key, encrypted by a key derived from\n// the given passphrase. The session key is returned and must be passed to\n// SerializeSymmetricallyEncrypted.\n// If config is nil, sensible defaults will be used.\nfunc SerializeSymmetricKeyEncrypted(w io.Writer, passphrase []byte, config *Config) (key []byte, err error) {\n\tcipherFunc := config.Cipher()\n\n\tsessionKey := make([]byte, cipherFunc.KeySize())\n\t_, err = io.ReadFull(config.Random(), sessionKey)\n\tif err != nil {\n\t\treturn\n\t}\n\n\terr = SerializeSymmetricKeyEncryptedReuseKey(w, sessionKey, passphrase, config)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tkey = sessionKey\n\treturn\n}\n\n// SerializeSymmetricKeyEncryptedReuseKey serializes a symmetric key packet to w.\n// The packet contains the given session key, encrypted by a key derived from\n// the given passphrase. The returned session key must be passed to\n// SerializeSymmetricallyEncrypted.\n// If config is nil, sensible defaults will be used.\n// Deprecated: Use SerializeSymmetricKeyEncryptedAEADReuseKey instead.\nfunc SerializeSymmetricKeyEncryptedReuseKey(w io.Writer, sessionKey []byte, passphrase []byte, config *Config) (err error) {\n\treturn SerializeSymmetricKeyEncryptedAEADReuseKey(w, sessionKey, passphrase, config.AEAD() != nil, config)\n}\n\n// SerializeSymmetricKeyEncryptedAEADReuseKey serializes a symmetric key packet to w.\n// The packet contains the given session key, encrypted by a key derived from\n// the given passphrase. The returned session key must be passed to\n// SerializeSymmetricallyEncrypted.\n// If aeadSupported is set, SKESK v6 is used, otherwise v4.\n// Note: aeadSupported MUST match the value passed to SerializeSymmetricallyEncrypted.\n// If config is nil, sensible defaults will be used.\nfunc SerializeSymmetricKeyEncryptedAEADReuseKey(w io.Writer, sessionKey []byte, passphrase []byte, aeadSupported bool, config *Config) (err error) {\n\tvar version int\n\tif aeadSupported {\n\t\tversion = 6\n\t} else {\n\t\tversion = 4\n\t}\n\tcipherFunc := config.Cipher()\n\t// cipherFunc must be AES\n\tif !cipherFunc.IsSupported() || cipherFunc < CipherAES128 || cipherFunc > CipherAES256 {\n\t\treturn errors.UnsupportedError(\"unsupported cipher: \" + strconv.Itoa(int(cipherFunc)))\n\t}\n\n\tkeySize := cipherFunc.KeySize()\n\ts2kBuf := new(bytes.Buffer)\n\tkeyEncryptingKey := make([]byte, keySize)\n\t// s2k.Serialize salts and stretches the passphrase, and writes the\n\t// resulting key to keyEncryptingKey and the s2k descriptor to s2kBuf.\n\terr = s2k.Serialize(s2kBuf, keyEncryptingKey, config.Random(), passphrase, config.S2K())\n\tif err != nil {\n\t\treturn\n\t}\n\ts2kBytes := s2kBuf.Bytes()\n\n\tvar packetLength int\n\tswitch version {\n\tcase 4:\n\t\tpacketLength = 2 /* header */ + len(s2kBytes) + 1 /* cipher type */ + keySize\n\tcase 5, 6:\n\t\tivLen := config.AEAD().Mode().IvLength()\n\t\ttagLen := config.AEAD().Mode().TagLength()\n\t\tpacketLength = 3 + len(s2kBytes) + ivLen + keySize + tagLen\n\t}\n\tif version > 5 {\n\t\tpacketLength += 2 // additional octet count fields\n\t}\n\n\terr = serializeHeader(w, packetTypeSymmetricKeyEncrypted, packetLength)\n\tif err != nil {\n\t\treturn\n\t}\n\n\t// Symmetric Key Encrypted Version\n\tbuf := []byte{byte(version)}\n\n\tif version > 5 {\n\t\t// Scalar octet count\n\t\tbuf = append(buf, byte(3+len(s2kBytes)+config.AEAD().Mode().IvLength()))\n\t}\n\n\t// Cipher function\n\tbuf = append(buf, byte(cipherFunc))\n\n\tif version >= 5 {\n\t\t// AEAD mode\n\t\tbuf = append(buf, byte(config.AEAD().Mode()))\n\t}\n\tif version > 5 {\n\t\t// Scalar octet count\n\t\tbuf = append(buf, byte(len(s2kBytes)))\n\t}\n\t_, err = w.Write(buf)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, err = w.Write(s2kBytes)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tswitch version {\n\tcase 4:\n\t\tiv := make([]byte, cipherFunc.blockSize())\n\t\tc := cipher.NewCFBEncrypter(cipherFunc.new(keyEncryptingKey), iv)\n\t\tencryptedCipherAndKey := make([]byte, keySize+1)\n\t\tc.XORKeyStream(encryptedCipherAndKey, buf[1:])\n\t\tc.XORKeyStream(encryptedCipherAndKey[1:], sessionKey)\n\t\t_, err = w.Write(encryptedCipherAndKey)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\tcase 5, 6:\n\t\tmode := config.AEAD().Mode()\n\t\tadata := []byte{0xc3, byte(version), byte(cipherFunc), byte(mode)}\n\t\taead := getEncryptedKeyAeadInstance(cipherFunc, mode, keyEncryptingKey, adata, version)\n\n\t\t// Sample iv using random reader\n\t\tiv := make([]byte, config.AEAD().Mode().IvLength())\n\t\t_, err = io.ReadFull(config.Random(), iv)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\t// Seal and write (encryptedData includes auth. tag)\n\n\t\tencryptedData := aead.Seal(nil, iv, sessionKey, adata)\n\t\t_, err = w.Write(iv)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\t_, err = w.Write(encryptedData)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc getEncryptedKeyAeadInstance(c CipherFunction, mode AEADMode, inputKey, associatedData []byte, version int) (aead cipher.AEAD) {\n\tvar blockCipher cipher.Block\n\tif version > 5 {\n\t\thkdfReader := hkdf.New(sha256.New, inputKey, []byte{}, associatedData)\n\n\t\tencryptionKey := make([]byte, c.KeySize())\n\t\t_, _ = readFull(hkdfReader, encryptionKey)\n\n\t\tblockCipher = c.new(encryptionKey)\n\t} else {\n\t\tblockCipher = c.new(inputKey)\n\t}\n\treturn mode.new(blockCipher)\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n)\n\nconst aeadSaltSize = 32\n\n// SymmetricallyEncrypted represents a symmetrically encrypted byte string. The\n// encrypted Contents will consist of more OpenPGP packets. See RFC 4880,\n// sections 5.7 and 5.13.\ntype SymmetricallyEncrypted struct {\n\tVersion            int\n\tContents           io.Reader // contains tag for version 2\n\tIntegrityProtected bool      // If true it is type 18 (with MDC or AEAD). False is packet type 9\n\n\t// Specific to version 1\n\tprefix []byte\n\n\t// Specific to version 2\n\tCipher        CipherFunction\n\tMode          AEADMode\n\tChunkSizeByte byte\n\tSalt          [aeadSaltSize]byte\n}\n\nconst (\n\tsymmetricallyEncryptedVersionMdc  = 1\n\tsymmetricallyEncryptedVersionAead = 2\n)\n\nfunc (se *SymmetricallyEncrypted) parse(r io.Reader) error {\n\tif se.IntegrityProtected {\n\t\t// See RFC 4880, section 5.13.\n\t\tvar buf [1]byte\n\t\t_, err := readFull(r, buf[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tswitch buf[0] {\n\t\tcase symmetricallyEncryptedVersionMdc:\n\t\t\tse.Version = symmetricallyEncryptedVersionMdc\n\t\tcase symmetricallyEncryptedVersionAead:\n\t\t\tse.Version = symmetricallyEncryptedVersionAead\n\t\t\tif err := se.parseAead(r); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\treturn errors.UnsupportedError(\"unknown SymmetricallyEncrypted version\")\n\t\t}\n\t}\n\tse.Contents = r\n\treturn nil\n}\n\n// Decrypt returns a ReadCloser, from which the decrypted Contents of the\n// packet can be read. An incorrect key will only be detected after trying\n// to decrypt the entire data.\nfunc (se *SymmetricallyEncrypted) Decrypt(c CipherFunction, key []byte) (io.ReadCloser, error) {\n\tif se.Version == symmetricallyEncryptedVersionAead {\n\t\treturn se.decryptAead(key)\n\t}\n\n\treturn se.decryptMdc(c, key)\n}\n\n// SerializeSymmetricallyEncrypted serializes a symmetrically encrypted packet\n// to w and returns a WriteCloser to which the to-be-encrypted packets can be\n// written.\n// If aeadSupported is set to true, SEIPDv2 is used with the indicated CipherSuite.\n// Otherwise, SEIPDv1 is used with the indicated CipherFunction.\n// Note: aeadSupported MUST match the value passed to SerializeEncryptedKeyAEAD\n// and/or SerializeSymmetricKeyEncryptedAEADReuseKey.\n// If config is nil, sensible defaults will be used.\nfunc SerializeSymmetricallyEncrypted(w io.Writer, c CipherFunction, aeadSupported bool, cipherSuite CipherSuite, key []byte, config *Config) (Contents io.WriteCloser, err error) {\n\twriteCloser := noOpCloser{w}\n\tciphertext, err := serializeStreamHeader(writeCloser, packetTypeSymmetricallyEncryptedIntegrityProtected)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif aeadSupported {\n\t\treturn serializeSymmetricallyEncryptedAead(ciphertext, cipherSuite, config.AEADConfig.ChunkSizeByte(), config.Random(), key)\n\t}\n\n\treturn serializeSymmetricallyEncryptedMdc(ciphertext, c, key, config)\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted_aead.go",
    "content": "// Copyright 2023 Proton AG. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"crypto/cipher\"\n\t\"crypto/sha256\"\n\t\"fmt\"\n\t\"io\"\n\t\"strconv\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\t\"golang.org/x/crypto/hkdf\"\n)\n\n// parseAead parses a V2 SEIPD packet (AEAD) as specified in\n// https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-5.13.2\nfunc (se *SymmetricallyEncrypted) parseAead(r io.Reader) error {\n\theaderData := make([]byte, 3)\n\tif n, err := io.ReadFull(r, headerData); n < 3 {\n\t\treturn errors.StructuralError(\"could not read aead header: \" + err.Error())\n\t}\n\n\t// Cipher\n\tse.Cipher = CipherFunction(headerData[0])\n\t// cipherFunc must have block size 16 to use AEAD\n\tif se.Cipher.blockSize() != 16 {\n\t\treturn errors.UnsupportedError(\"invalid aead cipher: \" + strconv.Itoa(int(se.Cipher)))\n\t}\n\n\t// Mode\n\tse.Mode = AEADMode(headerData[1])\n\tif se.Mode.TagLength() == 0 {\n\t\treturn errors.UnsupportedError(\"unknown aead mode: \" + strconv.Itoa(int(se.Mode)))\n\t}\n\n\t// Chunk size\n\tse.ChunkSizeByte = headerData[2]\n\tif se.ChunkSizeByte > 16 {\n\t\treturn errors.UnsupportedError(\"invalid aead chunk size byte: \" + strconv.Itoa(int(se.ChunkSizeByte)))\n\t}\n\n\t// Salt\n\tif n, err := io.ReadFull(r, se.Salt[:]); n < aeadSaltSize {\n\t\treturn errors.StructuralError(\"could not read aead salt: \" + err.Error())\n\t}\n\n\treturn nil\n}\n\n// associatedData for chunks: tag, version, cipher, mode, chunk size byte\nfunc (se *SymmetricallyEncrypted) associatedData() []byte {\n\treturn []byte{\n\t\t0xD2,\n\t\tsymmetricallyEncryptedVersionAead,\n\t\tbyte(se.Cipher),\n\t\tbyte(se.Mode),\n\t\tse.ChunkSizeByte,\n\t}\n}\n\n// decryptAead decrypts a V2 SEIPD packet (AEAD) as specified in\n// https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-5.13.2\nfunc (se *SymmetricallyEncrypted) decryptAead(inputKey []byte) (io.ReadCloser, error) {\n\tif se.Cipher.KeySize() != len(inputKey) {\n\t\treturn nil, errors.StructuralError(fmt.Sprintf(\"invalid session key length for cipher: got %d bytes, but expected %d bytes\", len(inputKey), se.Cipher.KeySize()))\n\t}\n\n\taead, nonce := getSymmetricallyEncryptedAeadInstance(se.Cipher, se.Mode, inputKey, se.Salt[:], se.associatedData())\n\t// Carry the first tagLen bytes\n\tchunkSize := decodeAEADChunkSize(se.ChunkSizeByte)\n\ttagLen := se.Mode.TagLength()\n\tchunkBytes := make([]byte, chunkSize+tagLen*2)\n\tpeekedBytes := chunkBytes[chunkSize+tagLen:]\n\tn, err := io.ReadFull(se.Contents, peekedBytes)\n\tif n < tagLen || (err != nil && err != io.EOF) {\n\t\treturn nil, errors.StructuralError(\"not enough data to decrypt:\" + err.Error())\n\t}\n\n\treturn &aeadDecrypter{\n\t\taeadCrypter: aeadCrypter{\n\t\t\taead:           aead,\n\t\t\tchunkSize:      decodeAEADChunkSize(se.ChunkSizeByte),\n\t\t\tnonce:          nonce,\n\t\t\tassociatedData: se.associatedData(),\n\t\t\tchunkIndex:     nonce[len(nonce)-8:],\n\t\t\tpacketTag:      packetTypeSymmetricallyEncryptedIntegrityProtected,\n\t\t},\n\t\treader:      se.Contents,\n\t\tchunkBytes:  chunkBytes,\n\t\tpeekedBytes: peekedBytes,\n\t}, nil\n}\n\n// serializeSymmetricallyEncryptedAead encrypts to a writer a V2 SEIPD packet (AEAD) as specified in\n// https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-5.13.2\nfunc serializeSymmetricallyEncryptedAead(ciphertext io.WriteCloser, cipherSuite CipherSuite, chunkSizeByte byte, rand io.Reader, inputKey []byte) (Contents io.WriteCloser, err error) {\n\t// cipherFunc must have block size 16 to use AEAD\n\tif cipherSuite.Cipher.blockSize() != 16 {\n\t\treturn nil, errors.InvalidArgumentError(\"invalid aead cipher function\")\n\t}\n\n\tif cipherSuite.Cipher.KeySize() != len(inputKey) {\n\t\treturn nil, errors.InvalidArgumentError(\"error in aead serialization: bad key length\")\n\t}\n\n\t// Data for en/decryption: tag, version, cipher, aead mode, chunk size\n\tprefix := []byte{\n\t\t0xD2,\n\t\tsymmetricallyEncryptedVersionAead,\n\t\tbyte(cipherSuite.Cipher),\n\t\tbyte(cipherSuite.Mode),\n\t\tchunkSizeByte,\n\t}\n\n\t// Write header (that correspond to prefix except first byte)\n\tn, err := ciphertext.Write(prefix[1:])\n\tif err != nil || n < 4 {\n\t\treturn nil, err\n\t}\n\n\t// Random salt\n\tsalt := make([]byte, aeadSaltSize)\n\tif _, err := io.ReadFull(rand, salt); err != nil {\n\t\treturn nil, err\n\t}\n\n\tif _, err := ciphertext.Write(salt); err != nil {\n\t\treturn nil, err\n\t}\n\n\taead, nonce := getSymmetricallyEncryptedAeadInstance(cipherSuite.Cipher, cipherSuite.Mode, inputKey, salt, prefix)\n\n\tchunkSize := decodeAEADChunkSize(chunkSizeByte)\n\ttagLen := aead.Overhead()\n\tchunkBytes := make([]byte, chunkSize+tagLen)\n\treturn &aeadEncrypter{\n\t\taeadCrypter: aeadCrypter{\n\t\t\taead:           aead,\n\t\t\tchunkSize:      chunkSize,\n\t\t\tassociatedData: prefix,\n\t\t\tnonce:          nonce,\n\t\t\tchunkIndex:     nonce[len(nonce)-8:],\n\t\t\tpacketTag:      packetTypeSymmetricallyEncryptedIntegrityProtected,\n\t\t},\n\t\twriter:     ciphertext,\n\t\tchunkBytes: chunkBytes,\n\t}, nil\n}\n\nfunc getSymmetricallyEncryptedAeadInstance(c CipherFunction, mode AEADMode, inputKey, salt, associatedData []byte) (aead cipher.AEAD, nonce []byte) {\n\thkdfReader := hkdf.New(sha256.New, inputKey, salt, associatedData)\n\n\tencryptionKey := make([]byte, c.KeySize())\n\t_, _ = readFull(hkdfReader, encryptionKey)\n\n\tnonce = make([]byte, mode.IvLength())\n\n\t// Last 64 bits of nonce are the counter\n\t_, _ = readFull(hkdfReader, nonce[:len(nonce)-8])\n\n\tblockCipher := c.new(encryptionKey)\n\taead = mode.new(blockCipher)\n\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted_mdc.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"crypto/cipher\"\n\t\"crypto/sha1\"\n\t\"crypto/subtle\"\n\t\"hash\"\n\t\"io\"\n\t\"strconv\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n)\n\n// seMdcReader wraps an io.Reader with a no-op Close method.\ntype seMdcReader struct {\n\tin io.Reader\n}\n\nfunc (ser seMdcReader) Read(buf []byte) (int, error) {\n\treturn ser.in.Read(buf)\n}\n\nfunc (ser seMdcReader) Close() error {\n\treturn nil\n}\n\nfunc (se *SymmetricallyEncrypted) decryptMdc(c CipherFunction, key []byte) (io.ReadCloser, error) {\n\tif !c.IsSupported() {\n\t\treturn nil, errors.UnsupportedError(\"unsupported cipher: \" + strconv.Itoa(int(c)))\n\t}\n\n\tif len(key) != c.KeySize() {\n\t\treturn nil, errors.InvalidArgumentError(\"SymmetricallyEncrypted: incorrect key length\")\n\t}\n\n\tif se.prefix == nil {\n\t\tse.prefix = make([]byte, c.blockSize()+2)\n\t\t_, err := readFull(se.Contents, se.prefix)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t} else if len(se.prefix) != c.blockSize()+2 {\n\t\treturn nil, errors.InvalidArgumentError(\"can't try ciphers with different block lengths\")\n\t}\n\n\tocfbResync := OCFBResync\n\tif se.IntegrityProtected {\n\t\t// MDC packets use a different form of OCFB mode.\n\t\tocfbResync = OCFBNoResync\n\t}\n\n\ts := NewOCFBDecrypter(c.new(key), se.prefix, ocfbResync)\n\n\tplaintext := cipher.StreamReader{S: s, R: se.Contents}\n\n\tif se.IntegrityProtected {\n\t\t// IntegrityProtected packets have an embedded hash that we need to check.\n\t\th := sha1.New()\n\t\th.Write(se.prefix)\n\t\treturn &seMDCReader{in: plaintext, h: h}, nil\n\t}\n\n\t// Otherwise, we just need to wrap plaintext so that it's a valid ReadCloser.\n\treturn seMdcReader{plaintext}, nil\n}\n\nconst mdcTrailerSize = 1 /* tag byte */ + 1 /* length byte */ + sha1.Size\n\n// An seMDCReader wraps an io.Reader, maintains a running hash and keeps hold\n// of the most recent 22 bytes (mdcTrailerSize). Upon EOF, those bytes form an\n// MDC packet containing a hash of the previous Contents which is checked\n// against the running hash. See RFC 4880, section 5.13.\ntype seMDCReader struct {\n\tin          io.Reader\n\th           hash.Hash\n\ttrailer     [mdcTrailerSize]byte\n\tscratch     [mdcTrailerSize]byte\n\ttrailerUsed int\n\terror       bool\n\teof         bool\n}\n\nfunc (ser *seMDCReader) Read(buf []byte) (n int, err error) {\n\tif ser.error {\n\t\terr = io.ErrUnexpectedEOF\n\t\treturn\n\t}\n\tif ser.eof {\n\t\terr = io.EOF\n\t\treturn\n\t}\n\n\t// If we haven't yet filled the trailer buffer then we must do that\n\t// first.\n\tfor ser.trailerUsed < mdcTrailerSize {\n\t\tn, err = ser.in.Read(ser.trailer[ser.trailerUsed:])\n\t\tser.trailerUsed += n\n\t\tif err == io.EOF {\n\t\t\tif ser.trailerUsed != mdcTrailerSize {\n\t\t\t\tn = 0\n\t\t\t\terr = io.ErrUnexpectedEOF\n\t\t\t\tser.error = true\n\t\t\t\treturn\n\t\t\t}\n\t\t\tser.eof = true\n\t\t\tn = 0\n\t\t\treturn\n\t\t}\n\n\t\tif err != nil {\n\t\t\tn = 0\n\t\t\treturn\n\t\t}\n\t}\n\n\t// If it's a short read then we read into a temporary buffer and shift\n\t// the data into the caller's buffer.\n\tif len(buf) <= mdcTrailerSize {\n\t\tn, err = readFull(ser.in, ser.scratch[:len(buf)])\n\t\tcopy(buf, ser.trailer[:n])\n\t\tser.h.Write(buf[:n])\n\t\tcopy(ser.trailer[:], ser.trailer[n:])\n\t\tcopy(ser.trailer[mdcTrailerSize-n:], ser.scratch[:])\n\t\tif n < len(buf) {\n\t\t\tser.eof = true\n\t\t\terr = io.EOF\n\t\t}\n\t\treturn\n\t}\n\n\tn, err = ser.in.Read(buf[mdcTrailerSize:])\n\tcopy(buf, ser.trailer[:])\n\tser.h.Write(buf[:n])\n\tcopy(ser.trailer[:], buf[n:])\n\n\tif err == io.EOF {\n\t\tser.eof = true\n\t}\n\treturn\n}\n\n// This is a new-format packet tag byte for a type 19 (Integrity Protected) packet.\nconst mdcPacketTagByte = byte(0x80) | 0x40 | 19\n\nfunc (ser *seMDCReader) Close() error {\n\tif ser.error {\n\t\treturn errors.ErrMDCHashMismatch\n\t}\n\n\tfor !ser.eof {\n\t\t// We haven't seen EOF so we need to read to the end\n\t\tvar buf [1024]byte\n\t\t_, err := ser.Read(buf[:])\n\t\tif err == io.EOF {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn errors.ErrMDCHashMismatch\n\t\t}\n\t}\n\n\tser.h.Write(ser.trailer[:2])\n\n\tfinal := ser.h.Sum(nil)\n\tif subtle.ConstantTimeCompare(final, ser.trailer[2:]) != 1 {\n\t\treturn errors.ErrMDCHashMismatch\n\t}\n\t// The hash already includes the MDC header, but we still check its value\n\t// to confirm encryption correctness\n\tif ser.trailer[0] != mdcPacketTagByte || ser.trailer[1] != sha1.Size {\n\t\treturn errors.ErrMDCHashMismatch\n\t}\n\treturn nil\n}\n\n// An seMDCWriter writes through to an io.WriteCloser while maintains a running\n// hash of the data written. On close, it emits an MDC packet containing the\n// running hash.\ntype seMDCWriter struct {\n\tw io.WriteCloser\n\th hash.Hash\n}\n\nfunc (w *seMDCWriter) Write(buf []byte) (n int, err error) {\n\tw.h.Write(buf)\n\treturn w.w.Write(buf)\n}\n\nfunc (w *seMDCWriter) Close() (err error) {\n\tvar buf [mdcTrailerSize]byte\n\n\tbuf[0] = mdcPacketTagByte\n\tbuf[1] = sha1.Size\n\tw.h.Write(buf[:2])\n\tdigest := w.h.Sum(nil)\n\tcopy(buf[2:], digest)\n\n\t_, err = w.w.Write(buf[:])\n\tif err != nil {\n\t\treturn\n\t}\n\treturn w.w.Close()\n}\n\n// noOpCloser is like an ioutil.NopCloser, but for an io.Writer.\ntype noOpCloser struct {\n\tw io.Writer\n}\n\nfunc (c noOpCloser) Write(data []byte) (n int, err error) {\n\treturn c.w.Write(data)\n}\n\nfunc (c noOpCloser) Close() error {\n\treturn nil\n}\n\nfunc serializeSymmetricallyEncryptedMdc(ciphertext io.WriteCloser, c CipherFunction, key []byte, config *Config) (Contents io.WriteCloser, err error) {\n\t// Disallow old cipher suites\n\tif !c.IsSupported() || c < CipherAES128 {\n\t\treturn nil, errors.InvalidArgumentError(\"invalid mdc cipher function\")\n\t}\n\n\tif c.KeySize() != len(key) {\n\t\treturn nil, errors.InvalidArgumentError(\"error in mdc serialization: bad key length\")\n\t}\n\n\t_, err = ciphertext.Write([]byte{symmetricallyEncryptedVersionMdc})\n\tif err != nil {\n\t\treturn\n\t}\n\n\tblock := c.new(key)\n\tblockSize := block.BlockSize()\n\tiv := make([]byte, blockSize)\n\t_, err = io.ReadFull(config.Random(), iv)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ts, prefix := NewOCFBEncrypter(block, iv, OCFBNoResync)\n\t_, err = ciphertext.Write(prefix)\n\tif err != nil {\n\t\treturn\n\t}\n\tplaintext := cipher.StreamWriter{S: s, W: ciphertext}\n\n\th := sha1.New()\n\th.Write(iv)\n\th.Write(iv[blockSize-2:])\n\tContents = &seMDCWriter{w: plaintext, h: h}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/userattribute.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"bytes\"\n\t\"image\"\n\t\"image/jpeg\"\n\t\"io\"\n)\n\nconst UserAttrImageSubpacket = 1\n\n// UserAttribute is capable of storing other types of data about a user\n// beyond name, email and a text comment. In practice, user attributes are typically used\n// to store a signed thumbnail photo JPEG image of the user.\n// See RFC 4880, section 5.12.\ntype UserAttribute struct {\n\tContents []*OpaqueSubpacket\n}\n\n// NewUserAttributePhoto creates a user attribute packet\n// containing the given images.\nfunc NewUserAttributePhoto(photos ...image.Image) (uat *UserAttribute, err error) {\n\tuat = new(UserAttribute)\n\tfor _, photo := range photos {\n\t\tvar buf bytes.Buffer\n\t\t// RFC 4880, Section 5.12.1.\n\t\tdata := []byte{\n\t\t\t0x10, 0x00, // Little-endian image header length (16 bytes)\n\t\t\t0x01,       // Image header version 1\n\t\t\t0x01,       // JPEG\n\t\t\t0, 0, 0, 0, // 12 reserved octets, must be all zero.\n\t\t\t0, 0, 0, 0,\n\t\t\t0, 0, 0, 0}\n\t\tif _, err = buf.Write(data); err != nil {\n\t\t\treturn\n\t\t}\n\t\tif err = jpeg.Encode(&buf, photo, nil); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\tlengthBuf := make([]byte, 5)\n\t\tn := serializeSubpacketLength(lengthBuf, len(buf.Bytes())+1)\n\t\tlengthBuf = lengthBuf[:n]\n\n\t\tuat.Contents = append(uat.Contents, &OpaqueSubpacket{\n\t\t\tSubType:       UserAttrImageSubpacket,\n\t\t\tEncodedLength: lengthBuf,\n\t\t\tContents:      buf.Bytes(),\n\t\t})\n\t}\n\treturn\n}\n\n// NewUserAttribute creates a new user attribute packet containing the given subpackets.\nfunc NewUserAttribute(contents ...*OpaqueSubpacket) *UserAttribute {\n\treturn &UserAttribute{Contents: contents}\n}\n\nfunc (uat *UserAttribute) parse(r io.Reader) (err error) {\n\t// RFC 4880, section 5.13\n\tb, err := io.ReadAll(r)\n\tif err != nil {\n\t\treturn\n\t}\n\tuat.Contents, err = OpaqueSubpackets(b)\n\treturn\n}\n\n// Serialize marshals the user attribute to w in the form of an OpenPGP packet, including\n// header.\nfunc (uat *UserAttribute) Serialize(w io.Writer) (err error) {\n\tvar buf bytes.Buffer\n\tfor _, sp := range uat.Contents {\n\t\terr = sp.Serialize(&buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err = serializeHeader(w, packetTypeUserAttribute, buf.Len()); err != nil {\n\t\treturn err\n\t}\n\t_, err = w.Write(buf.Bytes())\n\treturn\n}\n\n// ImageData returns zero or more byte slices, each containing\n// JPEG File Interchange Format (JFIF), for each photo in the\n// user attribute packet.\nfunc (uat *UserAttribute) ImageData() (imageData [][]byte) {\n\tfor _, sp := range uat.Contents {\n\t\tif sp.SubType == UserAttrImageSubpacket && len(sp.Contents) > 16 {\n\t\t\timageData = append(imageData, sp.Contents[16:])\n\t\t}\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/packet/userid.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"io\"\n\t\"strings\"\n)\n\n// UserId contains text that is intended to represent the name and email\n// address of the key holder. See RFC 4880, section 5.11. By convention, this\n// takes the form \"Full Name (Comment) <email@example.com>\"\ntype UserId struct {\n\tId string // By convention, this takes the form \"Full Name (Comment) <email@example.com>\" which is split out in the fields below.\n\n\tName, Comment, Email string\n}\n\nfunc hasInvalidCharacters(s string) bool {\n\tfor _, c := range s {\n\t\tswitch c {\n\t\tcase '(', ')', '<', '>', 0:\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// NewUserId returns a UserId or nil if any of the arguments contain invalid\n// characters. The invalid characters are '\\x00', '(', ')', '<' and '>'\nfunc NewUserId(name, comment, email string) *UserId {\n\t// RFC 4880 doesn't deal with the structure of userid strings; the\n\t// name, comment and email form is just a convention. However, there's\n\t// no convention about escaping the metacharacters and GPG just refuses\n\t// to create user ids where, say, the name contains a '('. We mirror\n\t// this behaviour.\n\n\tif hasInvalidCharacters(name) || hasInvalidCharacters(comment) || hasInvalidCharacters(email) {\n\t\treturn nil\n\t}\n\n\tuid := new(UserId)\n\tuid.Name, uid.Comment, uid.Email = name, comment, email\n\tuid.Id = name\n\tif len(comment) > 0 {\n\t\tif len(uid.Id) > 0 {\n\t\t\tuid.Id += \" \"\n\t\t}\n\t\tuid.Id += \"(\"\n\t\tuid.Id += comment\n\t\tuid.Id += \")\"\n\t}\n\tif len(email) > 0 {\n\t\tif len(uid.Id) > 0 {\n\t\t\tuid.Id += \" \"\n\t\t}\n\t\tuid.Id += \"<\"\n\t\tuid.Id += email\n\t\tuid.Id += \">\"\n\t}\n\treturn uid\n}\n\nfunc (uid *UserId) parse(r io.Reader) (err error) {\n\t// RFC 4880, section 5.11\n\tb, err := io.ReadAll(r)\n\tif err != nil {\n\t\treturn\n\t}\n\tuid.Id = string(b)\n\tuid.Name, uid.Comment, uid.Email = parseUserId(uid.Id)\n\treturn\n}\n\n// Serialize marshals uid to w in the form of an OpenPGP packet, including\n// header.\nfunc (uid *UserId) Serialize(w io.Writer) error {\n\terr := serializeHeader(w, packetTypeUserId, len(uid.Id))\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, err = w.Write([]byte(uid.Id))\n\treturn err\n}\n\n// parseUserId extracts the name, comment and email from a user id string that\n// is formatted as \"Full Name (Comment) <email@example.com>\".\nfunc parseUserId(id string) (name, comment, email string) {\n\tvar n, c, e struct {\n\t\tstart, end int\n\t}\n\tvar state int\n\n\tfor offset, rune := range id {\n\t\tswitch state {\n\t\tcase 0:\n\t\t\t// Entering name\n\t\t\tn.start = offset\n\t\t\tstate = 1\n\t\t\tfallthrough\n\t\tcase 1:\n\t\t\t// In name\n\t\t\tif rune == '(' {\n\t\t\t\tstate = 2\n\t\t\t\tn.end = offset\n\t\t\t} else if rune == '<' {\n\t\t\t\tstate = 5\n\t\t\t\tn.end = offset\n\t\t\t}\n\t\tcase 2:\n\t\t\t// Entering comment\n\t\t\tc.start = offset\n\t\t\tstate = 3\n\t\t\tfallthrough\n\t\tcase 3:\n\t\t\t// In comment\n\t\t\tif rune == ')' {\n\t\t\t\tstate = 4\n\t\t\t\tc.end = offset\n\t\t\t}\n\t\tcase 4:\n\t\t\t// Between comment and email\n\t\t\tif rune == '<' {\n\t\t\t\tstate = 5\n\t\t\t}\n\t\tcase 5:\n\t\t\t// Entering email\n\t\t\te.start = offset\n\t\t\tstate = 6\n\t\t\tfallthrough\n\t\tcase 6:\n\t\t\t// In email\n\t\t\tif rune == '>' {\n\t\t\t\tstate = 7\n\t\t\t\te.end = offset\n\t\t\t}\n\t\tdefault:\n\t\t\t// After email\n\t\t}\n\t}\n\tswitch state {\n\tcase 1:\n\t\t// ended in the name\n\t\tn.end = len(id)\n\tcase 3:\n\t\t// ended in comment\n\t\tc.end = len(id)\n\tcase 6:\n\t\t// ended in email\n\t\te.end = len(id)\n\t}\n\n\tname = strings.TrimSpace(id[n.start:n.end])\n\tcomment = strings.TrimSpace(id[c.start:c.end])\n\temail = strings.TrimSpace(id[e.start:e.end])\n\n\t// RFC 2822 3.4: alternate simple form of a mailbox\n\tif email == \"\" && strings.ContainsRune(name, '@') {\n\t\temail = name\n\t\tname = \"\"\n\t}\n\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/read.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package openpgp implements high level operations on OpenPGP messages.\npackage openpgp // import \"github.com/ProtonMail/go-crypto/openpgp\"\n\nimport (\n\t\"crypto\"\n\t_ \"crypto/sha256\"\n\t_ \"crypto/sha512\"\n\t\"hash\"\n\t\"io\"\n\t\"strconv\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/armor\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/algorithm\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/packet\"\n\t_ \"golang.org/x/crypto/sha3\"\n)\n\n// SignatureType is the armor type for a PGP signature.\nvar SignatureType = \"PGP SIGNATURE\"\n\n// readArmored reads an armored block with the given type.\nfunc readArmored(r io.Reader, expectedType string) (body io.Reader, err error) {\n\tblock, err := armor.Decode(r)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif block.Type != expectedType {\n\t\treturn nil, errors.InvalidArgumentError(\"expected '\" + expectedType + \"', got: \" + block.Type)\n\t}\n\n\treturn block.Body, nil\n}\n\n// MessageDetails contains the result of parsing an OpenPGP encrypted and/or\n// signed message.\ntype MessageDetails struct {\n\tIsEncrypted              bool                // true if the message was encrypted.\n\tEncryptedToKeyIds        []uint64            // the list of recipient key ids.\n\tIsSymmetricallyEncrypted bool                // true if a passphrase could have decrypted the message.\n\tDecryptedWith            Key                 // the private key used to decrypt the message, if any.\n\tIsSigned                 bool                // true if the message is signed.\n\tSignedByKeyId            uint64              // the key id of the signer, if any.\n\tSignedByFingerprint      []byte              // the key fingerprint of the signer, if any.\n\tSignedBy                 *Key                // the key of the signer, if available.\n\tLiteralData              *packet.LiteralData // the metadata of the contents\n\tUnverifiedBody           io.Reader           // the contents of the message.\n\n\t// If IsSigned is true and SignedBy is non-zero then the signature will\n\t// be verified as UnverifiedBody is read. The signature cannot be\n\t// checked until the whole of UnverifiedBody is read so UnverifiedBody\n\t// must be consumed until EOF before the data can be trusted. Even if a\n\t// message isn't signed (or the signer is unknown) the data may contain\n\t// an authentication code that is only checked once UnverifiedBody has\n\t// been consumed. Once EOF has been seen, the following fields are\n\t// valid. (An authentication code failure is reported as a\n\t// SignatureError error when reading from UnverifiedBody.)\n\tSignature            *packet.Signature   // the signature packet itself.\n\tSignatureError       error               // nil if the signature is good.\n\tUnverifiedSignatures []*packet.Signature // all other unverified signature packets.\n\n\tdecrypted io.ReadCloser\n}\n\n// A PromptFunction is used as a callback by functions that may need to decrypt\n// a private key, or prompt for a passphrase. It is called with a list of\n// acceptable, encrypted private keys and a boolean that indicates whether a\n// passphrase is usable. It should either decrypt a private key or return a\n// passphrase to try. If the decrypted private key or given passphrase isn't\n// correct, the function will be called again, forever. Any error returned will\n// be passed up.\ntype PromptFunction func(keys []Key, symmetric bool) ([]byte, error)\n\n// A keyEnvelopePair is used to store a private key with the envelope that\n// contains a symmetric key, encrypted with that key.\ntype keyEnvelopePair struct {\n\tkey          Key\n\tencryptedKey *packet.EncryptedKey\n}\n\n// ReadMessage parses an OpenPGP message that may be signed and/or encrypted.\n// The given KeyRing should contain both public keys (for signature\n// verification) and, possibly encrypted, private keys for decrypting.\n// If config is nil, sensible defaults will be used.\nfunc ReadMessage(r io.Reader, keyring KeyRing, prompt PromptFunction, config *packet.Config) (md *MessageDetails, err error) {\n\tvar p packet.Packet\n\n\tvar symKeys []*packet.SymmetricKeyEncrypted\n\tvar pubKeys []keyEnvelopePair\n\t// Integrity protected encrypted packet: SymmetricallyEncrypted or AEADEncrypted\n\tvar edp packet.EncryptedDataPacket\n\n\tpackets := packet.NewReader(r)\n\tmd = new(MessageDetails)\n\tmd.IsEncrypted = true\n\n\t// The message, if encrypted, starts with a number of packets\n\t// containing an encrypted decryption key. The decryption key is either\n\t// encrypted to a public key, or with a passphrase. This loop\n\t// collects these packets.\nParsePackets:\n\tfor {\n\t\tp, err = packets.Next()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tswitch p := p.(type) {\n\t\tcase *packet.SymmetricKeyEncrypted:\n\t\t\t// This packet contains the decryption key encrypted with a passphrase.\n\t\t\tmd.IsSymmetricallyEncrypted = true\n\t\t\tsymKeys = append(symKeys, p)\n\t\tcase *packet.EncryptedKey:\n\t\t\t// This packet contains the decryption key encrypted to a public key.\n\t\t\tmd.EncryptedToKeyIds = append(md.EncryptedToKeyIds, p.KeyId)\n\t\t\tswitch p.Algo {\n\t\t\tcase packet.PubKeyAlgoRSA, packet.PubKeyAlgoRSAEncryptOnly, packet.PubKeyAlgoElGamal, packet.PubKeyAlgoECDH, packet.PubKeyAlgoX25519, packet.PubKeyAlgoX448:\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif keyring != nil {\n\t\t\t\tvar keys []Key\n\t\t\t\tif p.KeyId == 0 {\n\t\t\t\t\tkeys = keyring.DecryptionKeys()\n\t\t\t\t} else {\n\t\t\t\t\tkeys = keyring.KeysById(p.KeyId)\n\t\t\t\t}\n\t\t\t\tfor _, k := range keys {\n\t\t\t\t\tpubKeys = append(pubKeys, keyEnvelopePair{k, p})\n\t\t\t\t}\n\t\t\t}\n\t\tcase *packet.SymmetricallyEncrypted:\n\t\t\tif !p.IntegrityProtected && !config.AllowUnauthenticatedMessages() {\n\t\t\t\treturn nil, errors.UnsupportedError(\"message is not integrity protected\")\n\t\t\t}\n\t\t\tedp = p\n\t\t\tbreak ParsePackets\n\t\tcase *packet.AEADEncrypted:\n\t\t\tedp = p\n\t\t\tbreak ParsePackets\n\t\tcase *packet.Compressed, *packet.LiteralData, *packet.OnePassSignature:\n\t\t\t// This message isn't encrypted.\n\t\t\tif len(symKeys) != 0 || len(pubKeys) != 0 {\n\t\t\t\treturn nil, errors.StructuralError(\"key material not followed by encrypted message\")\n\t\t\t}\n\t\t\tpackets.Unread(p)\n\t\t\treturn readSignedMessage(packets, nil, keyring, config)\n\t\t}\n\t}\n\n\tvar candidates []Key\n\tvar decrypted io.ReadCloser\n\n\t// Now that we have the list of encrypted keys we need to decrypt at\n\t// least one of them or, if we cannot, we need to call the prompt\n\t// function so that it can decrypt a key or give us a passphrase.\nFindKey:\n\tfor {\n\t\t// See if any of the keys already have a private key available\n\t\tcandidates = candidates[:0]\n\t\tcandidateFingerprints := make(map[string]bool)\n\n\t\tfor _, pk := range pubKeys {\n\t\t\tif pk.key.PrivateKey == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif !pk.key.PrivateKey.Encrypted {\n\t\t\t\tif len(pk.encryptedKey.Key) == 0 {\n\t\t\t\t\terrDec := pk.encryptedKey.Decrypt(pk.key.PrivateKey, config)\n\t\t\t\t\tif errDec != nil {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Try to decrypt symmetrically encrypted\n\t\t\t\tdecrypted, err = edp.Decrypt(pk.encryptedKey.CipherFunc, pk.encryptedKey.Key)\n\t\t\t\tif err != nil && err != errors.ErrKeyIncorrect {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tif decrypted != nil {\n\t\t\t\t\tmd.DecryptedWith = pk.key\n\t\t\t\t\tbreak FindKey\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfpr := string(pk.key.PublicKey.Fingerprint[:])\n\t\t\t\tif v := candidateFingerprints[fpr]; v {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tcandidates = append(candidates, pk.key)\n\t\t\t\tcandidateFingerprints[fpr] = true\n\t\t\t}\n\t\t}\n\n\t\tif len(candidates) == 0 && len(symKeys) == 0 {\n\t\t\treturn nil, errors.ErrKeyIncorrect\n\t\t}\n\n\t\tif prompt == nil {\n\t\t\treturn nil, errors.ErrKeyIncorrect\n\t\t}\n\n\t\tpassphrase, err := prompt(candidates, len(symKeys) != 0)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Try the symmetric passphrase first\n\t\tif len(symKeys) != 0 && passphrase != nil {\n\t\t\tfor _, s := range symKeys {\n\t\t\t\tkey, cipherFunc, err := s.Decrypt(passphrase)\n\t\t\t\t// In v4, on wrong passphrase, session key decryption is very likely to result in an invalid cipherFunc:\n\t\t\t\t// only for < 5% of cases we will proceed to decrypt the data\n\t\t\t\tif err == nil {\n\t\t\t\t\tdecrypted, err = edp.Decrypt(cipherFunc, key)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\tif decrypted != nil {\n\t\t\t\t\t\tbreak FindKey\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tmd.decrypted = decrypted\n\tif err := packets.Push(decrypted); err != nil {\n\t\treturn nil, err\n\t}\n\tmdFinal, sensitiveParsingErr := readSignedMessage(packets, md, keyring, config)\n\tif sensitiveParsingErr != nil {\n\t\treturn nil, errors.HandleSensitiveParsingError(sensitiveParsingErr, md.decrypted != nil)\n\t}\n\treturn mdFinal, nil\n}\n\n// readSignedMessage reads a possibly signed message if mdin is non-zero then\n// that structure is updated and returned. Otherwise a fresh MessageDetails is\n// used.\nfunc readSignedMessage(packets *packet.Reader, mdin *MessageDetails, keyring KeyRing, config *packet.Config) (md *MessageDetails, err error) {\n\tif mdin == nil {\n\t\tmdin = new(MessageDetails)\n\t}\n\tmd = mdin\n\n\tvar p packet.Packet\n\tvar h hash.Hash\n\tvar wrappedHash hash.Hash\n\tvar prevLast bool\nFindLiteralData:\n\tfor {\n\t\tp, err = packets.Next()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tswitch p := p.(type) {\n\t\tcase *packet.Compressed:\n\t\t\tif err := packets.Push(p.Body); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\tcase *packet.OnePassSignature:\n\t\t\tif prevLast {\n\t\t\t\treturn nil, errors.UnsupportedError(\"nested signature packets\")\n\t\t\t}\n\n\t\t\tif p.IsLast {\n\t\t\t\tprevLast = true\n\t\t\t}\n\n\t\t\th, wrappedHash, err = hashForSignature(p.Hash, p.SigType, p.Salt)\n\t\t\tif err != nil {\n\t\t\t\tmd.SignatureError = err\n\t\t\t}\n\n\t\t\tmd.IsSigned = true\n\t\t\tif p.Version == 6 {\n\t\t\t\tmd.SignedByFingerprint = p.KeyFingerprint\n\t\t\t}\n\t\t\tmd.SignedByKeyId = p.KeyId\n\n\t\t\tif keyring != nil {\n\t\t\t\tkeys := keyring.KeysByIdUsage(p.KeyId, packet.KeyFlagSign)\n\t\t\t\tif len(keys) > 0 {\n\t\t\t\t\tmd.SignedBy = &keys[0]\n\t\t\t\t}\n\t\t\t}\n\t\tcase *packet.LiteralData:\n\t\t\tmd.LiteralData = p\n\t\t\tbreak FindLiteralData\n\t\t}\n\t}\n\n\tif md.IsSigned && md.SignatureError == nil {\n\t\tmd.UnverifiedBody = &signatureCheckReader{packets, h, wrappedHash, md, config}\n\t} else if md.decrypted != nil {\n\t\tmd.UnverifiedBody = &checkReader{md, false}\n\t} else {\n\t\tmd.UnverifiedBody = md.LiteralData.Body\n\t}\n\n\treturn md, nil\n}\n\nfunc wrapHashForSignature(hashFunc hash.Hash, sigType packet.SignatureType) (hash.Hash, error) {\n\tswitch sigType {\n\tcase packet.SigTypeBinary:\n\t\treturn hashFunc, nil\n\tcase packet.SigTypeText:\n\t\treturn NewCanonicalTextHash(hashFunc), nil\n\t}\n\treturn nil, errors.UnsupportedError(\"unsupported signature type: \" + strconv.Itoa(int(sigType)))\n}\n\n// hashForSignature returns a pair of hashes that can be used to verify a\n// signature. The signature may specify that the contents of the signed message\n// should be preprocessed (i.e. to normalize line endings). Thus this function\n// returns two hashes. The second should be used to hash the message itself and\n// performs any needed preprocessing.\nfunc hashForSignature(hashFunc crypto.Hash, sigType packet.SignatureType, sigSalt []byte) (hash.Hash, hash.Hash, error) {\n\tif _, ok := algorithm.HashToHashIdWithSha1(hashFunc); !ok {\n\t\treturn nil, nil, errors.UnsupportedError(\"unsupported hash function\")\n\t}\n\tif !hashFunc.Available() {\n\t\treturn nil, nil, errors.UnsupportedError(\"hash not available: \" + strconv.Itoa(int(hashFunc)))\n\t}\n\th := hashFunc.New()\n\tif sigSalt != nil {\n\t\th.Write(sigSalt)\n\t}\n\twrappedHash, err := wrapHashForSignature(h, sigType)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tswitch sigType {\n\tcase packet.SigTypeBinary:\n\t\treturn h, wrappedHash, nil\n\tcase packet.SigTypeText:\n\t\treturn h, wrappedHash, nil\n\t}\n\treturn nil, nil, errors.UnsupportedError(\"unsupported signature type: \" + strconv.Itoa(int(sigType)))\n}\n\n// checkReader wraps an io.Reader from a LiteralData packet. When it sees EOF\n// it closes the ReadCloser from any SymmetricallyEncrypted packet to trigger\n// MDC checks.\ntype checkReader struct {\n\tmd      *MessageDetails\n\tchecked bool\n}\n\nfunc (cr *checkReader) Read(buf []byte) (int, error) {\n\tn, sensitiveParsingError := cr.md.LiteralData.Body.Read(buf)\n\tif sensitiveParsingError == io.EOF {\n\t\tif cr.checked {\n\t\t\t// Only check once\n\t\t\treturn n, io.EOF\n\t\t}\n\t\tmdcErr := cr.md.decrypted.Close()\n\t\tif mdcErr != nil {\n\t\t\treturn n, mdcErr\n\t\t}\n\t\tcr.checked = true\n\t\treturn n, io.EOF\n\t}\n\n\tif sensitiveParsingError != nil {\n\t\treturn n, errors.HandleSensitiveParsingError(sensitiveParsingError, true)\n\t}\n\n\treturn n, nil\n}\n\n// signatureCheckReader wraps an io.Reader from a LiteralData packet and hashes\n// the data as it is read. When it sees an EOF from the underlying io.Reader\n// it parses and checks a trailing Signature packet and triggers any MDC checks.\ntype signatureCheckReader struct {\n\tpackets        *packet.Reader\n\th, wrappedHash hash.Hash\n\tmd             *MessageDetails\n\tconfig         *packet.Config\n}\n\nfunc (scr *signatureCheckReader) Read(buf []byte) (int, error) {\n\tn, sensitiveParsingError := scr.md.LiteralData.Body.Read(buf)\n\n\t// Hash only if required\n\tif scr.md.SignedBy != nil {\n\t\tscr.wrappedHash.Write(buf[:n])\n\t}\n\n\treadsDecryptedData := scr.md.decrypted != nil\n\tif sensitiveParsingError == io.EOF {\n\t\tvar p packet.Packet\n\t\tvar readError error\n\t\tvar sig *packet.Signature\n\n\t\tp, readError = scr.packets.Next()\n\t\tfor readError == nil {\n\t\t\tvar ok bool\n\t\t\tif sig, ok = p.(*packet.Signature); ok {\n\t\t\t\tif sig.Version == 5 && (sig.SigType == 0x00 || sig.SigType == 0x01) {\n\t\t\t\t\tsig.Metadata = scr.md.LiteralData\n\t\t\t\t}\n\n\t\t\t\t// If signature KeyID matches\n\t\t\t\tif scr.md.SignedBy != nil && *sig.IssuerKeyId == scr.md.SignedByKeyId {\n\t\t\t\t\tkey := scr.md.SignedBy\n\t\t\t\t\tsignatureError := key.PublicKey.VerifySignature(scr.h, sig)\n\t\t\t\t\tif signatureError == nil {\n\t\t\t\t\t\tsignatureError = checkMessageSignatureDetails(key, sig, scr.config)\n\t\t\t\t\t}\n\t\t\t\t\tscr.md.Signature = sig\n\t\t\t\t\tscr.md.SignatureError = signatureError\n\t\t\t\t} else {\n\t\t\t\t\tscr.md.UnverifiedSignatures = append(scr.md.UnverifiedSignatures, sig)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tp, readError = scr.packets.Next()\n\t\t}\n\n\t\tif scr.md.SignedBy != nil && scr.md.Signature == nil {\n\t\t\tif scr.md.UnverifiedSignatures == nil {\n\t\t\t\tscr.md.SignatureError = errors.StructuralError(\"LiteralData not followed by signature\")\n\t\t\t} else {\n\t\t\t\tscr.md.SignatureError = errors.StructuralError(\"No matching signature found\")\n\t\t\t}\n\t\t}\n\n\t\t// The SymmetricallyEncrypted packet, if any, might have an\n\t\t// unsigned hash of its own. In order to check this we need to\n\t\t// close that Reader.\n\t\tif scr.md.decrypted != nil {\n\t\t\tif sensitiveParsingError := scr.md.decrypted.Close(); sensitiveParsingError != nil {\n\t\t\t\treturn n, errors.HandleSensitiveParsingError(sensitiveParsingError, true)\n\t\t\t}\n\t\t}\n\t\treturn n, io.EOF\n\t}\n\n\tif sensitiveParsingError != nil {\n\t\treturn n, errors.HandleSensitiveParsingError(sensitiveParsingError, readsDecryptedData)\n\t}\n\n\treturn n, nil\n}\n\n// VerifyDetachedSignature takes a signed file and a detached signature and\n// returns the signature packet and the entity the signature was signed by,\n// if any, and a possible signature verification error.\n// If the signer isn't known, ErrUnknownIssuer is returned.\nfunc VerifyDetachedSignature(keyring KeyRing, signed, signature io.Reader, config *packet.Config) (sig *packet.Signature, signer *Entity, err error) {\n\treturn verifyDetachedSignature(keyring, signed, signature, nil, false, config)\n}\n\n// VerifyDetachedSignatureAndHash performs the same actions as\n// VerifyDetachedSignature and checks that the expected hash functions were used.\nfunc VerifyDetachedSignatureAndHash(keyring KeyRing, signed, signature io.Reader, expectedHashes []crypto.Hash, config *packet.Config) (sig *packet.Signature, signer *Entity, err error) {\n\treturn verifyDetachedSignature(keyring, signed, signature, expectedHashes, true, config)\n}\n\n// CheckDetachedSignature takes a signed file and a detached signature and\n// returns the entity the signature was signed by, if any, and a possible\n// signature verification error. If the signer isn't known,\n// ErrUnknownIssuer is returned.\nfunc CheckDetachedSignature(keyring KeyRing, signed, signature io.Reader, config *packet.Config) (signer *Entity, err error) {\n\t_, signer, err = verifyDetachedSignature(keyring, signed, signature, nil, false, config)\n\treturn\n}\n\n// CheckDetachedSignatureAndHash performs the same actions as\n// CheckDetachedSignature and checks that the expected hash functions were used.\nfunc CheckDetachedSignatureAndHash(keyring KeyRing, signed, signature io.Reader, expectedHashes []crypto.Hash, config *packet.Config) (signer *Entity, err error) {\n\t_, signer, err = verifyDetachedSignature(keyring, signed, signature, expectedHashes, true, config)\n\treturn\n}\n\nfunc verifyDetachedSignature(keyring KeyRing, signed, signature io.Reader, expectedHashes []crypto.Hash, checkHashes bool, config *packet.Config) (sig *packet.Signature, signer *Entity, err error) {\n\tvar issuerKeyId uint64\n\tvar hashFunc crypto.Hash\n\tvar sigType packet.SignatureType\n\tvar keys []Key\n\tvar p packet.Packet\n\n\tpackets := packet.NewReader(signature)\n\tfor {\n\t\tp, err = packets.Next()\n\t\tif err == io.EOF {\n\t\t\treturn nil, nil, errors.ErrUnknownIssuer\n\t\t}\n\t\tif err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\n\t\tvar ok bool\n\t\tsig, ok = p.(*packet.Signature)\n\t\tif !ok {\n\t\t\treturn nil, nil, errors.StructuralError(\"non signature packet found\")\n\t\t}\n\t\tif sig.IssuerKeyId == nil {\n\t\t\treturn nil, nil, errors.StructuralError(\"signature doesn't have an issuer\")\n\t\t}\n\t\tissuerKeyId = *sig.IssuerKeyId\n\t\thashFunc = sig.Hash\n\t\tsigType = sig.SigType\n\t\tif checkHashes {\n\t\t\tmatchFound := false\n\t\t\t// check for hashes\n\t\t\tfor _, expectedHash := range expectedHashes {\n\t\t\t\tif hashFunc == expectedHash {\n\t\t\t\t\tmatchFound = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif !matchFound {\n\t\t\t\treturn nil, nil, errors.StructuralError(\"hash algorithm or salt mismatch with cleartext message headers\")\n\t\t\t}\n\t\t}\n\t\tkeys = keyring.KeysByIdUsage(issuerKeyId, packet.KeyFlagSign)\n\t\tif len(keys) > 0 {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif len(keys) == 0 {\n\t\tpanic(\"unreachable\")\n\t}\n\n\th, err := sig.PrepareVerify()\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\twrappedHash, err := wrapHashForSignature(h, sigType)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tif _, err := io.Copy(wrappedHash, signed); err != nil && err != io.EOF {\n\t\treturn nil, nil, err\n\t}\n\n\tfor _, key := range keys {\n\t\terr = key.PublicKey.VerifySignature(h, sig)\n\t\tif err == nil {\n\t\t\treturn sig, key.Entity, checkMessageSignatureDetails(&key, sig, config)\n\t\t}\n\t}\n\n\treturn nil, nil, err\n}\n\n// CheckArmoredDetachedSignature performs the same actions as\n// CheckDetachedSignature but expects the signature to be armored.\nfunc CheckArmoredDetachedSignature(keyring KeyRing, signed, signature io.Reader, config *packet.Config) (signer *Entity, err error) {\n\tbody, err := readArmored(signature, SignatureType)\n\tif err != nil {\n\t\treturn\n\t}\n\n\treturn CheckDetachedSignature(keyring, signed, body, config)\n}\n\n// checkMessageSignatureDetails returns an error if:\n//   - The signature (or one of the binding signatures mentioned below)\n//     has a unknown critical notation data subpacket\n//   - The primary key of the signing entity is revoked\n//   - The primary identity is revoked\n//   - The signature is expired\n//   - The primary key of the signing entity is expired according to the\n//     primary identity binding signature\n//\n// ... or, if the signature was signed by a subkey and:\n//   - The signing subkey is revoked\n//   - The signing subkey is expired according to the subkey binding signature\n//   - The signing subkey binding signature is expired\n//   - The signing subkey cross-signature is expired\n//\n// NOTE: The order of these checks is important, as the caller may choose to\n// ignore ErrSignatureExpired or ErrKeyExpired errors, but should never\n// ignore any other errors.\nfunc checkMessageSignatureDetails(key *Key, signature *packet.Signature, config *packet.Config) error {\n\tnow := config.Now()\n\tprimarySelfSignature, primaryIdentity := key.Entity.PrimarySelfSignature()\n\tsignedBySubKey := key.PublicKey != key.Entity.PrimaryKey\n\tsigsToCheck := []*packet.Signature{signature, primarySelfSignature}\n\tif signedBySubKey {\n\t\tsigsToCheck = append(sigsToCheck, key.SelfSignature, key.SelfSignature.EmbeddedSignature)\n\t}\n\tfor _, sig := range sigsToCheck {\n\t\tfor _, notation := range sig.Notations {\n\t\t\tif notation.IsCritical && !config.KnownNotation(notation.Name) {\n\t\t\t\treturn errors.SignatureError(\"unknown critical notation: \" + notation.Name)\n\t\t\t}\n\t\t}\n\t}\n\tif key.Entity.Revoked(now) || // primary key is revoked\n\t\t(signedBySubKey && key.Revoked(now)) || // subkey is revoked\n\t\t(primaryIdentity != nil && primaryIdentity.Revoked(now)) { // primary identity is revoked for v4\n\t\treturn errors.ErrKeyRevoked\n\t}\n\tif key.Entity.PrimaryKey.KeyExpired(primarySelfSignature, now) { // primary key is expired\n\t\treturn errors.ErrKeyExpired\n\t}\n\tif signedBySubKey {\n\t\tif key.PublicKey.KeyExpired(key.SelfSignature, now) { // subkey is expired\n\t\t\treturn errors.ErrKeyExpired\n\t\t}\n\t}\n\tfor _, sig := range sigsToCheck {\n\t\tif sig.SigExpired(now) { // any of the relevant signatures are expired\n\t\t\treturn errors.ErrSignatureExpired\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/read_write_test_data.go",
    "content": "package openpgp\n\nconst testKey1KeyId uint64 = 0xA34D7E18C20C31BB\nconst testKey3KeyId uint64 = 0x338934250CCC0360\nconst testKeyP256KeyId uint64 = 0xd44a2c495918513e\n\nconst signedInput = \"Signed message\\nline 2\\nline 3\\n\"\nconst signedTextInput = \"Signed message\\r\\nline 2\\r\\nline 3\\r\\n\"\n\nconst recipientUnspecifiedHex = \"848c0300000000000000000103ff62d4d578d03cf40c3da998dfe216c074fa6ddec5e31c197c9666ba292830d91d18716a80f699f9d897389a90e6d62d0238f5f07a5248073c0f24920e4bc4a30c2d17ee4e0cae7c3d4aaa4e8dced50e3010a80ee692175fa0385f62ecca4b56ee6e9980aa3ec51b61b077096ac9e800edaf161268593eedb6cc7027ff5cb32745d250010d407a6221ae22ef18469b444f2822478c4d190b24d36371a95cb40087cdd42d9399c3d06a53c0673349bfb607927f20d1e122bde1e2bf3aa6cae6edf489629bcaa0689539ae3b718914d88ededc3b\"\n\nconst detachedSignatureHex = \"889c04000102000605024d449cd1000a0910a34d7e18c20c31bb167603ff57718d09f28a519fdc7b5a68b6a3336da04df85e38c5cd5d5bd2092fa4629848a33d85b1729402a2aab39c3ac19f9d573f773cc62c264dc924c067a79dfd8a863ae06c7c8686120760749f5fd9b1e03a64d20a7df3446ddc8f0aeadeaeba7cbaee5c1e366d65b6a0c6cc749bcb912d2f15013f812795c2e29eb7f7b77f39ce77\"\n\nconst detachedSignatureTextHex = \"889c04010102000605024d449d21000a0910a34d7e18c20c31bbc8c60400a24fbef7342603a41cb1165767bd18985d015fb72fe05db42db36cfb2f1d455967f1e491194fbf6cf88146222b23bf6ffbd50d17598d976a0417d3192ff9cc0034fd00f287b02e90418bbefe609484b09231e4e7a5f3562e199bf39909ab5276c4d37382fe088f6b5c3426fc1052865da8b3ab158672d58b6264b10823dc4b39\"\n\nconst detachedSignatureDSAHex = \"884604001102000605024d6c4eac000a0910338934250ccc0360f18d00a087d743d6405ed7b87755476629600b8b694a39e900a0abff8126f46faf1547c1743c37b21b4ea15b8f83\"\n\nconst detachedSignatureP256Hex = \"885e0400130a0006050256e5bb00000a0910d44a2c495918513edef001009841a4f792beb0befccb35c8838a6a87d9b936beaa86db6745ddc7b045eee0cf00fd1ac1f78306b17e965935dd3f8bae4587a76587e4af231efe19cc4011a8434817\"\n\n// The plaintext is https://www.gutenberg.org/cache/epub/1080/pg1080.txt\nconst modestProposalSha512 = \"lbbrB1+WP3T9AaC9OQqBdOcCjgeEQadlulXsNPgVx0tyqPzDHwUugZ2gE7V0ESKAw6kAVfgkcuvfgxAAGaeHtw==\"\n\nconst testKeys1And2Hex = \"988d044d3c5c10010400b1d13382944bd5aba23a4312968b5095d14f947f600eb478e14a6fcb16b0e0cac764884909c020bc495cfcc39a935387c661507bdb236a0612fb582cac3af9b29cc2c8c70090616c41b662f4da4c1201e195472eb7f4ae1ccbcbf9940fe21d985e379a5563dde5b9a23d35f1cfaa5790da3b79db26f23695107bfaca8e7b5bcd0011010001b41054657374204b6579203120285253412988b804130102002205024d3c5c10021b03060b090807030206150802090a0b0416020301021e01021780000a0910a34d7e18c20c31bbb5b304009cc45fe610b641a2c146331be94dade0a396e73ca725e1b25c21708d9cab46ecca5ccebc23055879df8f99eea39b377962a400f2ebdc36a7c99c333d74aeba346315137c3ff9d0a09b0273299090343048afb8107cf94cbd1400e3026f0ccac7ecebbc4d78588eb3e478fe2754d3ca664bcf3eac96ca4a6b0c8d7df5102f60f6b0020003b88d044d3c5c10010400b201df61d67487301f11879d514f4248ade90c8f68c7af1284c161098de4c28c2850f1ec7b8e30f959793e571542ffc6532189409cb51c3d30dad78c4ad5165eda18b20d9826d8707d0f742e2ab492103a85bbd9ddf4f5720f6de7064feb0d39ee002219765bb07bcfb8b877f47abe270ddeda4f676108cecb6b9bb2ad484a4f0011010001889f04180102000905024d3c5c10021b0c000a0910a34d7e18c20c31bb1a03040085c8d62e16d05dc4e9dad64953c8a2eed8b6c12f92b1575eeaa6dcf7be9473dd5b24b37b6dffbb4e7c99ed1bd3cb11634be19b3e6e207bed7505c7ca111ccf47cb323bf1f8851eb6360e8034cbff8dd149993c959de89f8f77f38e7e98b8e3076323aa719328e2b408db5ec0d03936efd57422ba04f925cdc7b4c1af7590e40ab0020003988d044d3c5c33010400b488c3e5f83f4d561f317817538d9d0397981e9aef1321ca68ebfae1cf8b7d388e19f4b5a24a82e2fbbf1c6c26557a6c5845307a03d815756f564ac7325b02bc83e87d5480a8fae848f07cb891f2d51ce7df83dcafdc12324517c86d472cc0ee10d47a68fd1d9ae49a6c19bbd36d82af597a0d88cc9c49de9df4e696fc1f0b5d0011010001b42754657374204b6579203220285253412c20656e637279707465642070726976617465206b65792988b804130102002205024d3c5c33021b03060b090807030206150802090a0b0416020301021e01021780000a0910d4984f961e35246b98940400908a73b6a6169f700434f076c6c79015a49bee37130eaf23aaa3cfa9ce60bfe4acaa7bc95f1146ada5867e0079babb38804891f4f0b8ebca57a86b249dee786161a755b7a342e68ccf3f78ed6440a93a6626beb9a37aa66afcd4f888790cb4bb46d94a4ae3eb3d7d3e6b00f6bfec940303e89ec5b32a1eaaacce66497d539328b0020003b88d044d3c5c33010400a4e913f9442abcc7f1804ccab27d2f787ffa592077ca935a8bb23165bd8d57576acac647cc596b2c3f814518cc8c82953c7a4478f32e0cf645630a5ba38d9618ef2bc3add69d459ae3dece5cab778938d988239f8c5ae437807075e06c828019959c644ff05ef6a5a1dab72227c98e3a040b0cf219026640698d7a13d8538a570011010001889f04180102000905024d3c5c33021b0c000a0910d4984f961e35246b26c703ff7ee29ef53bc1ae1ead533c408fa136db508434e233d6e62be621e031e5940bbd4c08142aed0f82217e7c3e1ec8de574bc06ccf3c36633be41ad78a9eacd209f861cae7b064100758545cc9dd83db71806dc1cfd5fb9ae5c7474bba0c19c44034ae61bae5eca379383339dece94ff56ff7aa44a582f3e5c38f45763af577c0934b0020003\"\n\nconst testKeys1And2PrivateHex = \"9501d8044d3c5c10010400b1d13382944bd5aba23a4312968b5095d14f947f600eb478e14a6fcb16b0e0cac764884909c020bc495cfcc39a935387c661507bdb236a0612fb582cac3af9b29cc2c8c70090616c41b662f4da4c1201e195472eb7f4ae1ccbcbf9940fe21d985e379a5563dde5b9a23d35f1cfaa5790da3b79db26f23695107bfaca8e7b5bcd00110100010003ff4d91393b9a8e3430b14d6209df42f98dc927425b881f1209f319220841273a802a97c7bdb8b3a7740b3ab5866c4d1d308ad0d3a79bd1e883aacf1ac92dfe720285d10d08752a7efe3c609b1d00f17f2805b217be53999a7da7e493bfc3e9618fd17018991b8128aea70a05dbce30e4fbe626aa45775fa255dd9177aabf4df7cf0200c1ded12566e4bc2bb590455e5becfb2e2c9796482270a943343a7835de41080582c2be3caf5981aa838140e97afa40ad652a0b544f83eb1833b0957dce26e47b0200eacd6046741e9ce2ec5beb6fb5e6335457844fb09477f83b050a96be7da043e17f3a9523567ed40e7a521f818813a8b8a72209f1442844843ccc7eb9805442570200bdafe0438d97ac36e773c7162028d65844c4d463e2420aa2228c6e50dc2743c3d6c72d0d782a5173fe7be2169c8a9f4ef8a7cf3e37165e8c61b89c346cdc6c1799d2b41054657374204b6579203120285253412988b804130102002205024d3c5c10021b03060b090807030206150802090a0b0416020301021e01021780000a0910a34d7e18c20c31bbb5b304009cc45fe610b641a2c146331be94dade0a396e73ca725e1b25c21708d9cab46ecca5ccebc23055879df8f99eea39b377962a400f2ebdc36a7c99c333d74aeba346315137c3ff9d0a09b0273299090343048afb8107cf94cbd1400e3026f0ccac7ecebbc4d78588eb3e478fe2754d3ca664bcf3eac96ca4a6b0c8d7df5102f60f6b00200009d01d8044d3c5c10010400b201df61d67487301f11879d514f4248ade90c8f68c7af1284c161098de4c28c2850f1ec7b8e30f959793e571542ffc6532189409cb51c3d30dad78c4ad5165eda18b20d9826d8707d0f742e2ab492103a85bbd9ddf4f5720f6de7064feb0d39ee002219765bb07bcfb8b877f47abe270ddeda4f676108cecb6b9bb2ad484a4f00110100010003fd17a7490c22a79c59281fb7b20f5e6553ec0c1637ae382e8adaea295f50241037f8997cf42c1ce26417e015091451b15424b2c59eb8d4161b0975630408e394d3b00f88d4b4e18e2cc85e8251d4753a27c639c83f5ad4a571c4f19d7cd460b9b73c25ade730c99df09637bd173d8e3e981ac64432078263bb6dc30d3e974150dd0200d0ee05be3d4604d2146fb0457f31ba17c057560785aa804e8ca5530a7cd81d3440d0f4ba6851efcfd3954b7e68908fc0ba47f7ac37bf559c6c168b70d3a7c8cd0200da1c677c4bce06a068070f2b3733b0a714e88d62aa3f9a26c6f5216d48d5c2b5624144f3807c0df30be66b3268eeeca4df1fbded58faf49fc95dc3c35f134f8b01fd1396b6c0fc1b6c4f0eb8f5e44b8eace1e6073e20d0b8bc5385f86f1cf3f050f66af789f3ef1fc107b7f4421e19e0349c730c68f0a226981f4e889054fdb4dc149e8e889f04180102000905024d3c5c10021b0c000a0910a34d7e18c20c31bb1a03040085c8d62e16d05dc4e9dad64953c8a2eed8b6c12f92b1575eeaa6dcf7be9473dd5b24b37b6dffbb4e7c99ed1bd3cb11634be19b3e6e207bed7505c7ca111ccf47cb323bf1f8851eb6360e8034cbff8dd149993c959de89f8f77f38e7e98b8e3076323aa719328e2b408db5ec0d03936efd57422ba04f925cdc7b4c1af7590e40ab00200009501fe044d3c5c33010400b488c3e5f83f4d561f317817538d9d0397981e9aef1321ca68ebfae1cf8b7d388e19f4b5a24a82e2fbbf1c6c26557a6c5845307a03d815756f564ac7325b02bc83e87d5480a8fae848f07cb891f2d51ce7df83dcafdc12324517c86d472cc0ee10d47a68fd1d9ae49a6c19bbd36d82af597a0d88cc9c49de9df4e696fc1f0b5d0011010001fe030302e9030f3c783e14856063f16938530e148bc57a7aa3f3e4f90df9dceccdc779bc0835e1ad3d006e4a8d7b36d08b8e0de5a0d947254ecfbd22037e6572b426bcfdc517796b224b0036ff90bc574b5509bede85512f2eefb520fb4b02aa523ba739bff424a6fe81c5041f253f8d757e69a503d3563a104d0d49e9e890b9d0c26f96b55b743883b472caa7050c4acfd4a21f875bdf1258d88bd61224d303dc9df77f743137d51e6d5246b88c406780528fd9a3e15bab5452e5b93970d9dcc79f48b38651b9f15bfbcf6da452837e9cc70683d1bdca94507870f743e4ad902005812488dd342f836e72869afd00ce1850eea4cfa53ce10e3608e13d3c149394ee3cbd0e23d018fcbcb6e2ec5a1a22972d1d462ca05355d0d290dd2751e550d5efb38c6c89686344df64852bf4ff86638708f644e8ec6bd4af9b50d8541cb91891a431326ab2e332faa7ae86cfb6e0540aa63160c1e5cdd5a4add518b303fff0a20117c6bc77f7cfbaf36b04c865c6c2b42754657374204b6579203220285253412c20656e637279707465642070726976617465206b65792988b804130102002205024d3c5c33021b03060b090807030206150802090a0b0416020301021e01021780000a0910d4984f961e35246b98940400908a73b6a6169f700434f076c6c79015a49bee37130eaf23aaa3cfa9ce60bfe4acaa7bc95f1146ada5867e0079babb38804891f4f0b8ebca57a86b249dee786161a755b7a342e68ccf3f78ed6440a93a6626beb9a37aa66afcd4f888790cb4bb46d94a4ae3eb3d7d3e6b00f6bfec940303e89ec5b32a1eaaacce66497d539328b00200009d01fe044d3c5c33010400a4e913f9442abcc7f1804ccab27d2f787ffa592077ca935a8bb23165bd8d57576acac647cc596b2c3f814518cc8c82953c7a4478f32e0cf645630a5ba38d9618ef2bc3add69d459ae3dece5cab778938d988239f8c5ae437807075e06c828019959c644ff05ef6a5a1dab72227c98e3a040b0cf219026640698d7a13d8538a570011010001fe030302e9030f3c783e148560f936097339ae381d63116efcf802ff8b1c9360767db5219cc987375702a4123fd8657d3e22700f23f95020d1b261eda5257e9a72f9a918e8ef22dd5b3323ae03bbc1923dd224db988cadc16acc04b120a9f8b7e84da9716c53e0334d7b66586ddb9014df604b41be1e960dcfcbc96f4ed150a1a0dd070b9eb14276b9b6be413a769a75b519a53d3ecc0c220e85cd91ca354d57e7344517e64b43b6e29823cbd87eae26e2b2e78e6dedfbb76e3e9f77bcb844f9a8932eb3db2c3f9e44316e6f5d60e9e2a56e46b72abe6b06dc9a31cc63f10023d1f5e12d2a3ee93b675c96f504af0001220991c88db759e231b3320dcedf814dcf723fd9857e3d72d66a0f2af26950b915abdf56c1596f46a325bf17ad4810d3535fb02a259b247ac3dbd4cc3ecf9c51b6c07cebb009c1506fba0a89321ec8683e3fd009a6e551d50243e2d5092fefb3321083a4bad91320dc624bd6b5dddf93553e3d53924c05bfebec1fb4bd47e89a1a889f04180102000905024d3c5c33021b0c000a0910d4984f961e35246b26c703ff7ee29ef53bc1ae1ead533c408fa136db508434e233d6e62be621e031e5940bbd4c08142aed0f82217e7c3e1ec8de574bc06ccf3c36633be41ad78a9eacd209f861cae7b064100758545cc9dd83db71806dc1cfd5fb9ae5c7474bba0c19c44034ae61bae5eca379383339dece94ff56ff7aa44a582f3e5c38f45763af577c0934b0020000\"\n\nconst dsaElGamalTestKeysHex = \"9501e1044dfcb16a110400aa3e5c1a1f43dd28c2ffae8abf5cfce555ee874134d8ba0a0f7b868ce2214beddc74e5e1e21ded354a95d18acdaf69e5e342371a71fbb9093162e0c5f3427de413a7f2c157d83f5cd2f9d791256dc4f6f0e13f13c3302af27f2384075ab3021dff7a050e14854bbde0a1094174855fc02f0bae8e00a340d94a1f22b32e48485700a0cec672ac21258fb95f61de2ce1af74b2c4fa3e6703ff698edc9be22c02ae4d916e4fa223f819d46582c0516235848a77b577ea49018dcd5e9e15cff9dbb4663a1ae6dd7580fa40946d40c05f72814b0f88481207e6c0832c3bded4853ebba0a7e3bd8e8c66df33d5a537cd4acf946d1080e7a3dcea679cb2b11a72a33a2b6a9dc85f466ad2ddf4c3db6283fa645343286971e3dd700703fc0c4e290d45767f370831a90187e74e9972aae5bff488eeff7d620af0362bfb95c1a6c3413ab5d15a2e4139e5d07a54d72583914661ed6a87cce810be28a0aa8879a2dd39e52fb6fe800f4f181ac7e328f740cde3d09a05cecf9483e4cca4253e60d4429ffd679d9996a520012aad119878c941e3cf151459873bdfc2a9563472fe0303027a728f9feb3b864260a1babe83925ce794710cfd642ee4ae0e5b9d74cee49e9c67b6cd0ea5dfbb582132195a121356a1513e1bca73e5b80c58c7ccb4164453412f456c47616d616c2054657374204b65792031886204131102002205024dfcb16a021b03060b090807030206150802090a0b0416020301021e01021780000a091033af447ccd759b09fadd00a0b8fd6f5a790bad7e9f2dbb7632046dc4493588db009c087c6a9ba9f7f49fab221587a74788c00db4889ab00200009d0157044dfcb16a1004008dec3f9291205255ccff8c532318133a6840739dd68b03ba942676f9038612071447bf07d00d559c5c0875724ea16a4c774f80d8338b55fca691a0522e530e604215b467bbc9ccfd483a1da99d7bc2648b4318fdbd27766fc8bfad3fddb37c62b8ae7ccfe9577e9b8d1e77c1d417ed2c2ef02d52f4da11600d85d3229607943700030503ff506c94c87c8cab778e963b76cf63770f0a79bf48fb49d3b4e52234620fc9f7657f9f8d56c96a2b7c7826ae6b57ebb2221a3fe154b03b6637cea7e6d98e3e45d87cf8dc432f723d3d71f89c5192ac8d7290684d2c25ce55846a80c9a7823f6acd9bb29fa6cd71f20bc90eccfca20451d0c976e460e672b000df49466408d527affe0303027a728f9feb3b864260abd761730327bca2aaa4ea0525c175e92bf240682a0e83b226f97ecb2e935b62c9a133858ce31b271fa8eb41f6a1b3cd72a63025ce1a75ee4180dcc284884904181102000905024dfcb16a021b0c000a091033af447ccd759b09dd0b009e3c3e7296092c81bee5a19929462caaf2fff3ae26009e218c437a2340e7ea628149af1ec98ec091a43992b00200009501e1044dfcb1be1104009f61faa61aa43df75d128cbe53de528c4aec49ce9360c992e70c77072ad5623de0a3a6212771b66b39a30dad6781799e92608316900518ec01184a85d872365b7d2ba4bacfb5882ea3c2473d3750dc6178cc1cf82147fb58caa28b28e9f12f6d1efcb0534abed644156c91cca4ab78834268495160b2400bc422beb37d237c2300a0cac94911b6d493bda1e1fbc6feeca7cb7421d34b03fe22cec6ccb39675bb7b94a335c2b7be888fd3906a1125f33301d8aa6ec6ee6878f46f73961c8d57a3e9544d8ef2a2cbfd4d52da665b1266928cfe4cb347a58c412815f3b2d2369dec04b41ac9a71cc9547426d5ab941cccf3b18575637ccfb42df1a802df3cfe0a999f9e7109331170e3a221991bf868543960f8c816c28097e503fe319db10fb98049f3a57d7c80c420da66d56f3644371631fad3f0ff4040a19a4fedc2d07727a1b27576f75a4d28c47d8246f27071e12d7a8de62aad216ddbae6aa02efd6b8a3e2818cda48526549791ab277e447b3a36c57cefe9b592f5eab73959743fcc8e83cbefec03a329b55018b53eec196765ae40ef9e20521a603c551efe0303020950d53a146bf9c66034d00c23130cce95576a2ff78016ca471276e8227fb30b1ffbd92e61804fb0c3eff9e30b1a826ee8f3e4730b4d86273ca977b4164453412f456c47616d616c2054657374204b65792032886204131102002205024dfcb1be021b03060b090807030206150802090a0b0416020301021e01021780000a0910a86bf526325b21b22bd9009e34511620415c974750a20df5cb56b182f3b48e6600a0a9466cb1a1305a84953445f77d461593f1d42bc1b00200009d0157044dfcb1be1004009565a951da1ee87119d600c077198f1c1bceb0f7aa54552489298e41ff788fa8f0d43a69871f0f6f77ebdfb14a4260cf9fbeb65d5844b4272a1904dd95136d06c3da745dc46327dd44a0f16f60135914368c8039a34033862261806bb2c5ce1152e2840254697872c85441ccb7321431d75a747a4bfb1d2c66362b51ce76311700030503fc0ea76601c196768070b7365a200e6ddb09307f262d5f39eec467b5f5784e22abdf1aa49226f59ab37cb49969d8f5230ea65caf56015abda62604544ed526c5c522bf92bed178a078789f6c807b6d34885688024a5bed9e9f8c58d11d4b82487b44c5f470c5606806a0443b79cadb45e0f897a561a53f724e5349b9267c75ca17fe0303020950d53a146bf9c660bc5f4ce8f072465e2d2466434320c1e712272fafc20e342fe7608101580fa1a1a367e60486a7cd1246b7ef5586cf5e10b32762b710a30144f12dd17dd4884904181102000905024dfcb1be021b0c000a0910a86bf526325b21b2904c00a0b2b66b4b39ccffda1d10f3ea8d58f827e30a8b8e009f4255b2d8112a184e40cde43a34e8655ca7809370b0020000\"\n\nconst ed25519wX25519Key = \"c54b0663877fe31b00000020f94da7bb48d60a61e567706a6587d0331999bb9d891a08242ead84543df895a3001972817b12be707e8d5f586ce61361201d344eb266a2c82fde6835762b65b0b7c2b1061f1b0a00000042058263877fe3030b090705150a0e080c021600029b03021e09222106cb186c4f0609a697e4d52dfa6c722b0c1f1e27c18a56708f6525ec27bad9acc905270902070200000000ad2820103e2d7d227ec0e6d7ce4471db36bfc97083253690271498a7ef0576c07faae14585b3b903b0127ec4fda2f023045a2ec76bcb4f9571a9651e14aee1137a1d668442c88f951e33c4ffd33fb9a17d511eed758fc6d9cc50cb5fd793b2039d5804c74b0663877fe319000000208693248367f9e5015db922f8f48095dda784987f2d5985b12fbad16caf5e4435004d600a4f794d44775c57a26e0feefed558e9afffd6ad0d582d57fb2ba2dcedb8c29b06181b0a0000002c050263877fe322a106cb186c4f0609a697e4d52dfa6c722b0c1f1e27c18a56708f6525ec27bad9acc9021b0c00000000defa20a6e9186d9d5935fc8fe56314cdb527486a5a5120f9b762a235a729f039010a56b89c658568341fbef3b894e9834ad9bc72afae2f4c9c47a43855e65f1cb0a3f77bbc5f61085c1f8249fe4e7ca59af5f0bcee9398e0fa8d76e522e1d8ab42bb0d\"\n\nconst signedMessageHex = \"a3019bc0cbccc0c4b8d8b74ee2108fe16ec6d3ca490cbe362d3f8333d3f352531472538b8b13d353b97232f352158c20943157c71c16064626063656269052062e4e01987e9b6fccff4b7df3a34c534b23e679cbec3bc0f8f6e64dfb4b55fe3f8efa9ce110ddb5cd79faf1d753c51aecfa669f7e7aa043436596cccc3359cb7dd6bbe9ecaa69e5989d9e57209571edc0b2fa7f57b9b79a64ee6e99ce1371395fee92fec2796f7b15a77c386ff668ee27f6d38f0baa6c438b561657377bf6acff3c5947befd7bf4c196252f1d6e5c524d0300\"\n\nconst signedTextMessageHex = \"a3019bc0cbccc8c4b8d8b74ee2108fe16ec6d36a250cbece0c178233d3f352531472538b8b13d35379b97232f352158ca0b4312f57c71c1646462606365626906a062e4e019811591798ff99bf8afee860b0d8a8c2a85c3387e3bcf0bb3b17987f2bbcfab2aa526d930cbfd3d98757184df3995c9f3e7790e36e3e9779f06089d4c64e9e47dd6202cb6e9bc73c5d11bb59fbaf89d22d8dc7cf199ddf17af96e77c5f65f9bbed56f427bd8db7af37f6c9984bf9385efaf5f184f986fb3e6adb0ecfe35bbf92d16a7aa2a344fb0bc52fb7624f0200\"\n\nconst signedEncryptedMessageHex = \"c18c032a67d68660df41c70103ff5a84c9a72f80e74ef0384c2d6a9ebfe2b09e06a8f298394f6d2abf174e40934ab0ec01fb2d0ddf21211c6fe13eb238563663b017a6b44edca552eb4736c4b7dc6ed907dd9e12a21b51b64b46f902f76fb7aaf805c1db8070574d8d0431a23e324a750f77fb72340a17a42300ee4ca8207301e95a731da229a63ab9c6b44541fbd2c11d016d810b3b3b2b38f15b5b40f0a4910332829c2062f1f7cc61f5b03677d73c54cafa1004ced41f315d46444946faae571d6f426e6dbd45d9780eb466df042005298adabf7ce0ef766dfeb94cd449c7ed0046c880339599c4711af073ce649b1e237c40b50a5536283e03bdbb7afad78bd08707715c67fb43295f905b4c479178809d429a8e167a9a8c6dfd8ab20b4edebdc38d6dec879a3202e1b752690d9bb5b0c07c5a227c79cc200e713a99251a4219d62ad5556900cf69bd384b6c8e726c7be267471d0d23af956da165af4af757246c2ebcc302b39e8ef2fccb4971b234fcda22d759ddb20e27269ee7f7fe67898a9de721bfa02ab0becaa046d00ea16cb1afc4e2eab40d0ac17121c565686e5cbd0cbdfbd9d6db5c70278b9c9db5a83176d04f61fbfbc4471d721340ede2746e5c312ded4f26787985af92b64fae3f253dbdde97f6a5e1996fd4d865599e32ff76325d3e9abe93184c02988ee89a4504356a4ef3b9b7a57cbb9637ca90af34a7676b9ef559325c3cca4e29d69fec1887f5440bb101361d744ad292a8547f22b4f22b419a42aa836169b89190f46d9560824cb2ac6e8771de8223216a5e647e132ab9eebcba89569ab339cb1c3d70fe806b31f4f4c600b4103b8d7583ebff16e43dcda551e6530f975122eb8b29\"\n\nconst verifiedSignatureEncryptedMessageHex = \"c2b304000108000605026048f6d600210910a34d7e18c20c31bb1621045fb74b1d03b1e3cb31bc2f8aa34d7e18c20c31bb9a3b0400a32ddac1af259c1b0abab0041327ea04970944401978fb647dd1cf9aba4f164e43f0d8a9389501886474bdd4a6e77f6aea945c07dfbf87743835b44cc2c39a1f9aeecfa83135abc92e18e50396f2e6a06c44e0188b0081effbfb4160d28f118d4ff73dd199a102e47cffd8c7ff2bacd83ae72b5820c021a486766dd587b5da61\"\n\nconst unverifiedSignatureEncryptedMessageHex = \"c2b304000108000605026048f6d600210910a34d7e18c20c31bb1621045fb74b1d03b1e3cb31bc2f8aa34d7e18c20c31bb9a3b0400a32ddac1af259c1b0abab0041327ea04970944401978fb647dd1cf9aba4f164e43f0d8a9389501886474bdd4a6e77f6aea945c07dfbf87743835b44cc2c39a1f9aeecfa83135abc92e18e50396f2e6a06c44e0188b0081effbfb4160d28f118d4ff73dd199a102e47cffd8c7ff2bacd83ae72b5820c021a486766dd587b5da61\"\n\nconst signedEncryptedMessage2Hex = \"85010e03cf6a7abcd43e36731003fb057f5495b79db367e277cdbe4ab90d924ddee0c0381494112ff8c1238fb0184af35d1731573b01bc4c55ecacd2aafbe2003d36310487d1ecc9ac994f3fada7f9f7f5c3a64248ab7782906c82c6ff1303b69a84d9a9529c31ecafbcdb9ba87e05439897d87e8a2a3dec55e14df19bba7f7bd316291c002ae2efd24f83f9e3441203fc081c0c23dc3092a454ca8a082b27f631abf73aca341686982e8fbda7e0e7d863941d68f3de4a755c2964407f4b5e0477b3196b8c93d551dd23c8beef7d0f03fbb1b6066f78907faf4bf1677d8fcec72651124080e0b7feae6b476e72ab207d38d90b958759fdedfc3c6c35717c9dbfc979b3cfbbff0a76d24a5e57056bb88acbd2a901ef64bc6e4db02adc05b6250ff378de81dca18c1910ab257dff1b9771b85bb9bbe0a69f5989e6d1710a35e6dfcceb7d8fb5ccea8db3932b3d9ff3fe0d327597c68b3622aec8e3716c83a6c93f497543b459b58ba504ed6bcaa747d37d2ca746fe49ae0a6ce4a8b694234e941b5159ff8bd34b9023da2814076163b86f40eed7c9472f81b551452d5ab87004a373c0172ec87ea6ce42ccfa7dbdad66b745496c4873d8019e8c28d6b3\"\n\nconst signatureEncryptedMessage2Hex = \"c24604001102000605024dfd0166000a091033af447ccd759b09bae600a096ec5e63ecf0a403085e10f75cc3bab327663282009f51fad9df457ed8d2b70d8a73c76e0443eac0f377\"\n\nconst symmetricallyEncryptedCompressedHex = \"c32e040903085a357c1a7b5614ed00cc0d1d92f428162058b3f558a0fb0980d221ebac6c97d5eda4e0fe32f6e706e94dd263012d6ca1ef8c4bbd324098225e603a10c85ebf09cbf7b5aeeb5ce46381a52edc51038b76a8454483be74e6dcd1e50d5689a8ae7eceaeefed98a0023d49b22eb1f65c2aa1ef1783bb5e1995713b0457102ec3c3075fe871267ffa4b686ad5d52000d857\"\n\nconst dsaTestKeyHex = \"9901a2044d6c49de110400cb5ce438cf9250907ac2ba5bf6547931270b89f7c4b53d9d09f4d0213a5ef2ec1f26806d3d259960f872a4a102ef1581ea3f6d6882d15134f21ef6a84de933cc34c47cc9106efe3bd84c6aec12e78523661e29bc1a61f0aab17fa58a627fd5fd33f5149153fbe8cd70edf3d963bc287ef875270ff14b5bfdd1bca4483793923b00a0fe46d76cb6e4cbdc568435cd5480af3266d610d303fe33ae8273f30a96d4d34f42fa28ce1112d425b2e3bf7ea553d526e2db6b9255e9dc7419045ce817214d1a0056dbc8d5289956a4b1b69f20f1105124096e6a438f41f2e2495923b0f34b70642607d45559595c7fe94d7fa85fc41bf7d68c1fd509ebeaa5f315f6059a446b9369c277597e4f474a9591535354c7e7f4fd98a08aa60400b130c24ff20bdfbf683313f5daebf1c9b34b3bdadfc77f2ddd72ee1fb17e56c473664bc21d66467655dd74b9005e3a2bacce446f1920cd7017231ae447b67036c9b431b8179deacd5120262d894c26bc015bffe3d827ba7087ad9b700d2ca1f6d16cc1786581e5dd065f293c31209300f9b0afcc3f7c08dd26d0a22d87580b4db41054657374204b65792033202844534129886204131102002205024d6c49de021b03060b090807030206150802090a0b0416020301021e01021780000a0910338934250ccc03607e0400a0bdb9193e8a6b96fc2dfc108ae848914b504481f100a09c4dc148cb693293a67af24dd40d2b13a9e36794\"\n\nconst dsaTestKeyPrivateHex = \"9501bb044d6c49de110400cb5ce438cf9250907ac2ba5bf6547931270b89f7c4b53d9d09f4d0213a5ef2ec1f26806d3d259960f872a4a102ef1581ea3f6d6882d15134f21ef6a84de933cc34c47cc9106efe3bd84c6aec12e78523661e29bc1a61f0aab17fa58a627fd5fd33f5149153fbe8cd70edf3d963bc287ef875270ff14b5bfdd1bca4483793923b00a0fe46d76cb6e4cbdc568435cd5480af3266d610d303fe33ae8273f30a96d4d34f42fa28ce1112d425b2e3bf7ea553d526e2db6b9255e9dc7419045ce817214d1a0056dbc8d5289956a4b1b69f20f1105124096e6a438f41f2e2495923b0f34b70642607d45559595c7fe94d7fa85fc41bf7d68c1fd509ebeaa5f315f6059a446b9369c277597e4f474a9591535354c7e7f4fd98a08aa60400b130c24ff20bdfbf683313f5daebf1c9b34b3bdadfc77f2ddd72ee1fb17e56c473664bc21d66467655dd74b9005e3a2bacce446f1920cd7017231ae447b67036c9b431b8179deacd5120262d894c26bc015bffe3d827ba7087ad9b700d2ca1f6d16cc1786581e5dd065f293c31209300f9b0afcc3f7c08dd26d0a22d87580b4d00009f592e0619d823953577d4503061706843317e4fee083db41054657374204b65792033202844534129886204131102002205024d6c49de021b03060b090807030206150802090a0b0416020301021e01021780000a0910338934250ccc03607e0400a0bdb9193e8a6b96fc2dfc108ae848914b504481f100a09c4dc148cb693293a67af24dd40d2b13a9e36794\"\n\nconst p256TestKeyHex = \"98520456e5b83813082a8648ce3d030107020304a2072cd6d21321266c758cc5b83fab0510f751cb8d91897cddb7047d8d6f185546e2107111b0a95cb8ef063c33245502af7a65f004d5919d93ee74eb71a66253b424502d3235362054657374204b6579203c696e76616c6964406578616d706c652e636f6d3e8879041313080021050256e5b838021b03050b09080702061508090a0b020416020301021e01021780000a0910d44a2c495918513e54e50100dfa64f97d9b47766fc1943c6314ba3f2b2a103d71ad286dc5b1efb96a345b0c80100dbc8150b54241f559da6ef4baacea6d31902b4f4b1bdc09b34bf0502334b7754b8560456e5b83812082a8648ce3d030107020304bfe3cea9cee13486f8d518aa487fecab451f25467d2bf08e58f63e5fa525d5482133e6a79299c274b068ef0be448152ad65cf11cf764348588ca4f6a0bcf22b6030108078861041813080009050256e5b838021b0c000a0910d44a2c495918513e4a4800ff49d589fa64024ad30be363a032e3a0e0e6f5db56ba4c73db850518bf0121b8f20100fd78e065f4c70ea5be9df319ea67e493b936fc78da834a71828043d3154af56e\"\n\nconst p256TestKeyPrivateHex = \"94a50456e5b83813082a8648ce3d030107020304a2072cd6d21321266c758cc5b83fab0510f751cb8d91897cddb7047d8d6f185546e2107111b0a95cb8ef063c33245502af7a65f004d5919d93ee74eb71a66253fe070302f0c2bfb0b6c30f87ee1599472b8636477eab23ced13b271886a4b50ed34c9d8436af5af5b8f88921f0efba6ef8c37c459bbb88bc1c6a13bbd25c4ce9b1e97679569ee77645d469bf4b43de637f5561b424502d3235362054657374204b6579203c696e76616c6964406578616d706c652e636f6d3e8879041313080021050256e5b838021b03050b09080702061508090a0b020416020301021e01021780000a0910d44a2c495918513e54e50100dfa64f97d9b47766fc1943c6314ba3f2b2a103d71ad286dc5b1efb96a345b0c80100dbc8150b54241f559da6ef4baacea6d31902b4f4b1bdc09b34bf0502334b77549ca90456e5b83812082a8648ce3d030107020304bfe3cea9cee13486f8d518aa487fecab451f25467d2bf08e58f63e5fa525d5482133e6a79299c274b068ef0be448152ad65cf11cf764348588ca4f6a0bcf22b603010807fe0703027510012471a603cfee2968dce19f732721ddf03e966fd133b4e3c7a685b788705cbc46fb026dc94724b830c9edbaecd2fb2c662f23169516cacd1fe423f0475c364ecc10abcabcfd4bbbda1a36a1bd8861041813080009050256e5b838021b0c000a0910d44a2c495918513e4a4800ff49d589fa64024ad30be363a032e3a0e0e6f5db56ba4c73db850518bf0121b8f20100fd78e065f4c70ea5be9df319ea67e493b936fc78da834a71828043d3154af56e\"\n\nconst armoredPrivateKeyBlock = `-----BEGIN PGP PRIVATE KEY BLOCK-----\nVersion: GnuPG v1.4.10 (GNU/Linux)\n\nlQHYBE2rFNoBBADFwqWQIW/DSqcB4yCQqnAFTJ27qS5AnB46ccAdw3u4Greeu3Bp\nidpoHdjULy7zSKlwR1EA873dO/k/e11Ml3dlAFUinWeejWaK2ugFP6JjiieSsrKn\nvWNicdCS4HTWn0X4sjl0ZiAygw6GNhqEQ3cpLeL0g8E9hnYzJKQ0LWJa0QARAQAB\nAAP/TB81EIo2VYNmTq0pK1ZXwUpxCrvAAIG3hwKjEzHcbQznsjNvPUihZ+NZQ6+X\n0HCfPAdPkGDCLCb6NavcSW+iNnLTrdDnSI6+3BbIONqWWdRDYJhqZCkqmG6zqSfL\nIdkJgCw94taUg5BWP/AAeQrhzjChvpMQTVKQL5mnuZbUCeMCAN5qrYMP2S9iKdnk\nVANIFj7656ARKt/nf4CBzxcpHTyB8+d2CtPDKCmlJP6vL8t58Jmih+kHJMvC0dzn\ngr5f5+sCAOOe5gt9e0am7AvQWhdbHVfJU0TQJx+m2OiCJAqGTB1nvtBLHdJnfdC9\nTnXXQ6ZXibqLyBies/xeY2sCKL5qtTMCAKnX9+9d/5yQxRyrQUHt1NYhaXZnJbHx\nq4ytu0eWz+5i68IYUSK69jJ1NWPM0T6SkqpB3KCAIv68VFm9PxqG1KmhSrQIVGVz\ndCBLZXmIuAQTAQIAIgUCTasU2gIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AA\nCgkQO9o98PRieSoLhgQAkLEZex02Qt7vGhZzMwuN0R22w3VwyYyjBx+fM3JFETy1\nut4xcLJoJfIaF5ZS38UplgakHG0FQ+b49i8dMij0aZmDqGxrew1m4kBfjXw9B/v+\neIqpODryb6cOSwyQFH0lQkXC040pjq9YqDsO5w0WYNXYKDnzRV0p4H1pweo2VDid\nAdgETasU2gEEAN46UPeWRqKHvA99arOxee38fBt2CI08iiWyI8T3J6ivtFGixSqV\nbRcPxYO/qLpVe5l84Nb3X71GfVXlc9hyv7CD6tcowL59hg1E/DC5ydI8K8iEpUmK\n/UnHdIY5h8/kqgGxkY/T/hgp5fRQgW1ZoZxLajVlMRZ8W4tFtT0DeA+JABEBAAEA\nA/0bE1jaaZKj6ndqcw86jd+QtD1SF+Cf21CWRNeLKnUds4FRRvclzTyUMuWPkUeX\nTaNNsUOFqBsf6QQ2oHUBBK4VCHffHCW4ZEX2cd6umz7mpHW6XzN4DECEzOVksXtc\nlUC1j4UB91DC/RNQqwX1IV2QLSwssVotPMPqhOi0ZLNY7wIA3n7DWKInxYZZ4K+6\nrQ+POsz6brEoRHwr8x6XlHenq1Oki855pSa1yXIARoTrSJkBtn5oI+f8AzrnN0BN\noyeQAwIA/7E++3HDi5aweWrViiul9cd3rcsS0dEnksPhvS0ozCJiHsq/6GFmy7J8\nQSHZPteedBnZyNp5jR+H7cIfVN3KgwH/Skq4PsuPhDq5TKK6i8Pc1WW8MA6DXTdU\nnLkX7RGmMwjC0DBf7KWAlPjFaONAX3a8ndnz//fy1q7u2l9AZwrj1qa1iJ8EGAEC\nAAkFAk2rFNoCGwwACgkQO9o98PRieSo2/QP/WTzr4ioINVsvN1akKuekmEMI3LAp\nBfHwatufxxP1U+3Si/6YIk7kuPB9Hs+pRqCXzbvPRrI8NHZBmc8qIGthishdCYad\nAHcVnXjtxrULkQFGbGvhKURLvS9WnzD/m1K2zzwxzkPTzT9/Yf06O6Mal5AdugPL\nVrM0m72/jnpKo04=\n=zNCn\n-----END PGP PRIVATE KEY BLOCK-----`\n\nconst e2ePublicKey = `-----BEGIN PGP PUBLIC KEY BLOCK-----\nCharset: UTF-8\n\nxv8AAABSBAAAAAATCCqGSM49AwEHAgME1LRoXSpOxtHXDUdmuvzchyg6005qIBJ4\nsfaSxX7QgH9RV2ONUhC+WiayCNADq+UMzuR/vunSr4aQffXvuGnR383/AAAAFDxk\nZ2lsQHlhaG9vLWluYy5jb20+wv8AAACGBBATCAA4/wAAAAWCVGvAG/8AAAACiwn/\nAAAACZC2VkQCOjdvYf8AAAAFlQgJCgv/AAAAA5YBAv8AAAACngEAAE1BAP0X8veD\n24IjmI5/C6ZAfVNXxgZZFhTAACFX75jUA3oD6AEAzoSwKf1aqH6oq62qhCN/pekX\n+WAsVMBhNwzLpqtCRjLO/wAAAFYEAAAAABIIKoZIzj0DAQcCAwT50ain7vXiIRv8\nB1DO3x3cE/aattZ5sHNixJzRCXi2vQIA5QmOxZ6b5jjUekNbdHG3SZi1a2Ak5mfX\nfRxC/5VGAwEIB8L/AAAAZQQYEwgAGP8AAAAFglRrwBz/AAAACZC2VkQCOjdvYQAA\nFJAA9isX3xtGyMLYwp2F3nXm7QEdY5bq5VUcD/RJlj792VwA/1wH0pCzVLl4Q9F9\nex7En5r7rHR5xwX82Msc+Rq9dSyO\n=7MrZ\n-----END PGP PUBLIC KEY BLOCK-----`\n\nconst dsaKeyWithSHA512 = `9901a2044f04b07f110400db244efecc7316553ee08d179972aab87bb1214de7692593fcf5b6feb1c80fba268722dd464748539b85b81d574cd2d7ad0ca2444de4d849b8756bad7768c486c83a824f9bba4af773d11742bdfb4ac3b89ef8cc9452d4aad31a37e4b630d33927bff68e879284a1672659b8b298222fc68f370f3e24dccacc4a862442b9438b00a0ea444a24088dc23e26df7daf8f43cba3bffc4fe703fe3d6cd7fdca199d54ed8ae501c30e3ec7871ea9cdd4cf63cfe6fc82281d70a5b8bb493f922cd99fba5f088935596af087c8d818d5ec4d0b9afa7f070b3d7c1dd32a84fca08d8280b4890c8da1dde334de8e3cad8450eed2a4a4fcc2db7b8e5528b869a74a7f0189e11ef097ef1253582348de072bb07a9fa8ab838e993cef0ee203ff49298723e2d1f549b00559f886cd417a41692ce58d0ac1307dc71d85a8af21b0cf6eaa14baf2922d3a70389bedf17cc514ba0febbd107675a372fe84b90162a9e88b14d4b1c6be855b96b33fb198c46f058568817780435b6936167ebb3724b680f32bf27382ada2e37a879b3d9de2abe0c3f399350afd1ad438883f4791e2e3b4184453412068617368207472756e636174696f6e207465737488620413110a002205024f04b07f021b03060b090807030206150802090a0b0416020301021e01021780000a0910ef20e0cefca131581318009e2bf3bf047a44d75a9bacd00161ee04d435522397009a03a60d51bd8a568c6c021c8d7cf1be8d990d6417b0020003`\n\nconst unknownHashFunctionHex = `8a00000040040001990006050253863c24000a09103b4fe6acc0b21f32ffff0101010101010101010101010101010101010101010101010101010101010101010101010101`\n\nconst rsaSignatureBadMPIlength = `8a00000040040001030006050253863c24000a09103b4fe6acc0b21f32ffff0101010101010101010101010101010101010101010101010101010101010101010101010101`\n\nconst missingHashFunctionHex = `8a00000040040001030006050253863c24000a09103b4fe6acc0b21f32ffff0101010101010101010101010101010101010101010101010101010101010101010101010101`\n\nconst campbellQuine = `a0b001000300fcffa0b001000d00f2ff000300fcffa0b001000d00f2ff8270a01c00000500faff8270a01c00000500faff000500faff001400ebff8270a01c00000500faff000500faff001400ebff428821c400001400ebff428821c400001400ebff428821c400001400ebff428821c400001400ebff428821c400000000ffff000000ffff000b00f4ff428821c400000000ffff000000ffff000b00f4ff0233214c40000100feff000233214c40000100feff0000`\n\nconst keyV4forVerifyingSignedMessageV3 = `-----BEGIN PGP PUBLIC KEY BLOCK-----\nComment: GPGTools - https://gpgtools.org\n\nmI0EVfxoFQEEAMBIqmbDfYygcvP6Phr1wr1XI41IF7Qixqybs/foBF8qqblD9gIY\nBKpXjnBOtbkcVOJ0nljd3/sQIfH4E0vQwK5/4YRQSI59eKOqd6Fx+fWQOLG+uu6z\ntewpeCj9LLHvibx/Sc7VWRnrznia6ftrXxJ/wHMezSab3tnGC0YPVdGNABEBAAG0\nJEdvY3J5cHRvIFRlc3QgS2V5IDx0aGVtYXhAZ21haWwuY29tPoi5BBMBCgAjBQJV\n/GgVAhsDBwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQeXnQmhdGW9PFVAP+\nK7TU0qX5ArvIONIxh/WAweyOk884c5cE8f+3NOPOOCRGyVy0FId5A7MmD5GOQh4H\nJseOZVEVCqlmngEvtHZb3U1VYtVGE5WZ+6rQhGsMcWP5qaT4soYwMBlSYxgYwQcx\nYhN9qOr292f9j2Y//TTIJmZT4Oa+lMxhWdqTfX+qMgG4jQRV/GgVAQQArhFSiij1\nb+hT3dnapbEU+23Z1yTu1DfF6zsxQ4XQWEV3eR8v+8mEDDNcz8oyyF56k6UQ3rXi\nUMTIwRDg4V6SbZmaFbZYCOwp/EmXJ3rfhm7z7yzXj2OFN22luuqbyVhuL7LRdB0M\npxgmjXb4tTvfgKd26x34S+QqUJ7W6uprY4sAEQEAAYifBBgBCgAJBQJV/GgVAhsM\nAAoJEHl50JoXRlvT7y8D/02ckx4OMkKBZo7viyrBw0MLG92i+DC2bs35PooHR6zz\n786mitjOp5z2QWNLBvxC70S0qVfCIz8jKupO1J6rq6Z8CcbLF3qjm6h1omUBf8Nd\nEfXKD2/2HV6zMKVknnKzIEzauh+eCKS2CeJUSSSryap/QLVAjRnckaES/OsEWhNB\n=RZia\n-----END PGP PUBLIC KEY BLOCK-----\n`\n\nconst signedMessageV3 = `-----BEGIN PGP MESSAGE-----\nComment: GPGTools - https://gpgtools.org\n\nowGbwMvMwMVYWXlhlrhb9GXG03JJDKF/MtxDMjKLFYAoUaEktbhEITe1uDgxPVWP\nq5NhKjMrWAVcC9evD8z/bF/uWNjqtk/X3y5/38XGRQHm/57rrDRYuGnTw597Xqka\nuM3137/hH3Os+Jf2dc0fXOITKwJvXJvecPVs0ta+Vg7ZO1MLn8w58Xx+6L58mbka\nDGHyU9yTueZE8D+QF/Tz28Y78dqtF56R1VPn9Xw4uJqrWYdd7b3vIZ1V6R4Nh05d\niT57d/OhWwA=\n=hG7R\n-----END PGP MESSAGE-----\n`\n\n// https://mailarchive.ietf.org/arch/msg/openpgp/9SheW_LENE0Kxf7haNllovPyAdY/\nconst v5PrivKey = `-----BEGIN PGP PRIVATE KEY BLOCK-----\n\nlGEFXJH05BYAAAAtCSsGAQQB2kcPAQEHQFhZlVcVVtwf+21xNQPX+ecMJJBL0MPd\nfj75iux+my8QAAAAAAAiAQCHZ1SnSUmWqxEsoI6facIVZQu6mph3cBFzzTvcm5lA\nNg5ctBhlbW1hLmdvbGRtYW5AZXhhbXBsZS5uZXSIlgUTFggASCIhBRk0e8mHJGQC\nX5nfPsLgAA7ZiEiS4fez6kyUAJFZVptUBQJckfTkAhsDBQsJCAcCAyICAQYVCgkI\nCwIEFgIDAQIeBwIXgAAA9cAA/jiR3yMsZMeEQ40u6uzEoXa6UXeV/S3wwJAXRJy9\nM8s0AP9vuL/7AyTfFXwwzSjDnYmzS0qAhbLDQ643N+MXGBJ2BZxmBVyR9OQSAAAA\nMgorBgEEAZdVAQUBAQdA+nysrzml2UCweAqtpDuncSPlvrcBWKU0yfU0YvYWWAoD\nAQgHAAAAAAAiAP9OdAPppjU1WwpqjIItkxr+VPQRT8Zm/Riw7U3F6v3OiBFHiHoF\nGBYIACwiIQUZNHvJhyRkAl+Z3z7C4AAO2YhIkuH3s+pMlACRWVabVAUCXJH05AIb\nDAAAOSQBAP4BOOIR/sGLNMOfeb5fPs/02QMieoiSjIBnijhob2U5AQC+RtOHCHx7\nTcIYl5/Uyoi+FOvPLcNw4hOv2nwUzSSVAw==\n=IiS2\n-----END PGP PRIVATE KEY BLOCK-----`\n\n// See OpenPGP crypto refresh Section A.3.\nconst v6PrivKey = `-----BEGIN PGP PRIVATE KEY BLOCK-----\n\nxUsGY4d/4xsAAAAg+U2nu0jWCmHlZ3BqZYfQMxmZu52JGggkLq2EVD34laMAGXKB\nexK+cH6NX1hs5hNhIB00TrJmosgv3mg1ditlsLfCsQYfGwoAAABCBYJjh3/jAwsJ\nBwUVCg4IDAIWAAKbAwIeCSIhBssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce6\n2azJBScJAgcCAAAAAK0oIBA+LX0ifsDm185Ecds2v8lwgyU2kCcUmKfvBXbAf6rh\nRYWzuQOwEn7E/aLwIwRaLsdry0+VcallHhSu4RN6HWaEQsiPlR4zxP/TP7mhfVEe\n7XWPxtnMUMtf15OyA51YBMdLBmOHf+MZAAAAIIaTJINn+eUBXbki+PSAld2nhJh/\nLVmFsS+60WyvXkQ1AE1gCk95TUR3XFeibg/u/tVY6a//1q0NWC1X+yui3O24wpsG\nGBsKAAAALAWCY4d/4wKbDCIhBssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce6\n2azJAAAAAAQBIKbpGG2dWTX8j+VjFM21J0hqWlEg+bdiojWnKfA5AQpWUWtnNwDE\nM0g12vYxoWM8Y81W+bHBw805I8kWVkXU6vFOi+HWvv/ira7ofJu16NnoUkhclkUr\nk0mXubZvyl4GBg==\n-----END PGP PRIVATE KEY BLOCK-----`\n\n// See OpenPGP crypto refresh merge request:\n// https://gitlab.com/openpgp-wg/rfc4880bis/-/merge_requests/304\nconst v6PrivKeyMsg = `-----BEGIN PGP MESSAGE-----\n\nwV0GIQYSyD8ecG9jCP4VGkF3Q6HwM3kOk+mXhIjR2zeNqZMIhRmHzxjV8bU/gXzO\nWgBM85PMiVi93AZfJfhK9QmxfdNnZBjeo1VDeVZheQHgaVf7yopqR6W1FT6NOrfS\naQIHAgZhZBZTW+CwcW1g4FKlbExAf56zaw76/prQoN+bAzxpohup69LA7JW/Vp0l\nyZnuSj3hcFj0DfqLTGgr4/u717J+sPWbtQBfgMfG9AOIwwrUBqsFE9zW+f1zdlYo\nbhF30A+IitsxxA==\n-----END PGP MESSAGE-----`\n\n// See OpenPGP crypto refresh merge request:\n// https://gitlab.com/openpgp-wg/rfc4880bis/-/merge_requests/305\nconst v6PrivKeyInlineSignMsg = `-----BEGIN PGP MESSAGE-----\n\nwV0GIQYSyD8ecG9jCP4VGkF3Q6HwM3kOk+mXhIjR2zeNqZMIhRmHzxjV8bU/gXzO\nWgBM85PMiVi93AZfJfhK9QmxfdNnZBjeo1VDeVZheQHgaVf7yopqR6W1FT6NOrfS\naQIHAgZhZBZTW+CwcW1g4FKlbExAf56zaw76/prQoN+bAzxpohup69LA7JW/Vp0l\nyZnuSj3hcFj0DfqLTGgr4/u717J+sPWbtQBfgMfG9AOIwwrUBqsFE9zW+f1zdlYo\nbhF30A+IitsxxA==\n-----END PGP MESSAGE-----`\n\n// See https://gitlab.com/openpgp-wg/rfc4880bis/-/merge_requests/274\n// decryption password: \"correct horse battery staple\"\nconst v6ArgonSealedPrivKey = `-----BEGIN PGP PRIVATE KEY BLOCK-----\n\nxYIGY4d/4xsAAAAg+U2nu0jWCmHlZ3BqZYfQMxmZu52JGggkLq2EVD34laP9JgkC\nFARdb9ccngltHraRe25uHuyuAQQVtKipJ0+r5jL4dacGWSAheCWPpITYiyfyIOPS\n3gIDyg8f7strd1OB4+LZsUhcIjOMpVHgmiY/IutJkulneoBYwrEGHxsKAAAAQgWC\nY4d/4wMLCQcFFQoOCAwCFgACmwMCHgkiIQbLGGxPBgmml+TVLfpscisMHx4nwYpW\ncI9lJewnutmsyQUnCQIHAgAAAACtKCAQPi19In7A5tfORHHbNr/JcIMlNpAnFJin\n7wV2wH+q4UWFs7kDsBJ+xP2i8CMEWi7Ha8tPlXGpZR4UruETeh1mhELIj5UeM8T/\n0z+5oX1RHu11j8bZzFDLX9eTsgOdWATHggZjh3/jGQAAACCGkySDZ/nlAV25Ivj0\ngJXdp4SYfy1ZhbEvutFsr15ENf0mCQIUBA5hhGgp2oaavg6mFUXcFMwBBBUuE8qf\n9Ock+xwusd+GAglBr5LVyr/lup3xxQvHXFSjjA2haXfoN6xUGRdDEHI6+uevKjVR\nv5oAxgu7eJpaXNjCmwYYGwoAAAAsBYJjh3/jApsMIiEGyxhsTwYJppfk1S36bHIr\nDB8eJ8GKVnCPZSXsJ7rZrMkAAAAABAEgpukYbZ1ZNfyP5WMUzbUnSGpaUSD5t2Ki\nNacp8DkBClZRa2c3AMQzSDXa9jGhYzxjzVb5scHDzTkjyRZWRdTq8U6L4da+/+Kt\nruh8m7Xo2ehSSFyWRSuTSZe5tm/KXgYG\n-----END PGP PRIVATE KEY BLOCK-----`\n\nconst v4Key25519 = `-----BEGIN PGP PRIVATE KEY BLOCK-----\n\nxUkEZB3qzRto01j2k2pwN5ux9w70stPinAdXULLr20CRW7U7h2GSeACch0M+\nqzQg8yjFQ8VBvu3uwgKH9senoHmj72lLSCLTmhFKzQR0ZXN0wogEEBsIAD4F\ngmQd6s0ECwkHCAmQIf45+TuC+xMDFQgKBBYAAgECGQECmwMCHgEWIQSWEzMi\njJUHvyIbVKIh/jn5O4L7EwAAUhaHNlgudvxARdPPETUzVgjuWi+YIz8w1xIb\nlHQMvIrbe2sGCQIethpWofd0x7DHuv/ciHg+EoxJ/Td6h4pWtIoKx0kEZB3q\nzRm4CyA7quliq7yx08AoOqHTuuCgvpkSdEhpp3pEyejQOgBo0p6ywIiLPllY\n0t+jpNspHpAGfXID6oqjpYuJw3AfVRBlwnQEGBsIACoFgmQd6s0JkCH+Ofk7\ngvsTApsMFiEElhMzIoyVB78iG1SiIf45+TuC+xMAAGgQuN9G73446ykvJ/mL\nsCZ7zGFId2gBd1EnG0FTC4npfOKpck0X8dngByrCxU8LDSfvjsEp/xDAiKsQ\naU71tdtNBQ==\n=e7jT\n-----END PGP PRIVATE KEY BLOCK-----`\n\nconst keyWithExpiredCrossSig = `-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxsDNBF2lnPIBDAC5cL9PQoQLTMuhjbYvb4Ncuuo0bfmgPRFywX53jPhoFf4Zg6mv\n/seOXpgecTdOcVttfzC8ycIKrt3aQTiwOG/ctaR4Bk/t6ayNFfdUNxHWk4WCKzdz\n/56fW2O0F23qIRd8UUJp5IIlN4RDdRCtdhVQIAuzvp2oVy/LaS2kxQoKvph/5pQ/\n5whqsyroEWDJoSV0yOb25B/iwk/pLUFoyhDG9bj0kIzDxrEqW+7Ba8nocQlecMF3\nX5KMN5kp2zraLv9dlBBpWW43XktjcCZgMy20SouraVma8Je/ECwUWYUiAZxLIlMv\n9CurEOtxUw6N3RdOtLmYZS9uEnn5y1UkF88o8Nku890uk6BrewFzJyLAx5wRZ4F0\nqV/yq36UWQ0JB/AUGhHVPdFf6pl6eaxBwT5GXvbBUibtf8YI2og5RsgTWtXfU7eb\nSGXrl5ZMpbA6mbfhd0R8aPxWfmDWiIOhBufhMCvUHh1sApMKVZnvIff9/0Dca3wb\nvLIwa3T4CyshfT0AEQEAAc0hQm9iIEJhYmJhZ2UgPGJvYkBvcGVucGdwLmV4YW1w\nbGU+wsEABBMBCgATBYJeO2eVAgsJAxUICgKbAQIeAQAhCRD7/MgqAV5zMBYhBNGm\nbhojsYLJmA94jPv8yCoBXnMwKWUMAJ3FKZfJ2mXvh+GFqgymvK4NoKkDRPB0CbUN\naDdG7ZOizQrWXo7Da2MYIZ6eZUDqBKLdhZ5gZfVnisDfu/yeCgpENaKib1MPHpA8\nnZQjnPejbBDomNqY8HRzr5jvXNlwywBpjWGtegCKUY9xbSynjbfzIlMrWL4S+Rfl\n+bOOQKRyYJWXmECmVyqY8cz2VUYmETjNcwC8VCDUxQnhtcCJ7Aej22hfYwVEPb/J\nBsJBPq8WECCiGfJ9Y2y6TF+62KzG9Kfs5hqUeHhQy8V4TSi479ewwL7DH86XmIIK\nchSANBS+7iyMtctjNZfmF9zYdGJFvjI/mbBR/lK66E515Inuf75XnL8hqlXuwqvG\nni+i03Aet1DzULZEIio4uIU6ioc1lGO9h7K2Xn4S7QQH1QoISNMWqXibUR0RCGjw\nFsEDTt2QwJl8XXxoJCooM7BCcCQo+rMNVUHDjIwrdoQjPld3YZsUQQRcqH6bLuln\ncfn5ufl8zTGWKydoj/iTz8KcjZ7w187AzQRdpZzyAQwA1jC/XGxjK6ddgrRfW9j+\ns/U00++EvIsgTs2kr3Rg0GP7FLWV0YNtR1mpl55/bEl7yAxCDTkOgPUMXcaKlnQh\n6zrlt6H53mF6Bvs3inOHQvOsGtU0dqvb1vkTF0juLiJgPlM7pWv+pNQ6IA39vKoQ\nsTMBv4v5vYNXP9GgKbg8inUNT17BxzZYHfw5+q63ectgDm2on1e8CIRCZ76oBVwz\ndkVxoy3gjh1eENlk2D4P0uJNZzF1Q8GV67yLANGMCDICE/OkWn6daipYDzW4iJQt\nYPUWP4hWhjdm+CK+hg6IQUEn2Vtvi16D2blRP8BpUNNa4fNuylWVuJV76rIHvsLZ\n1pbM3LHpRgE8s6jivS3Rz3WRs0TmWCNnvHPqWizQ3VTy+r3UQVJ5AmhJDrZdZq9i\naUIuZ01PoE1+CHiJwuxPtWvVAxf2POcm1M/F1fK1J0e+lKlQuyonTXqXR22Y41wr\nfP2aPk3nPSTW2DUAf3vRMZg57ZpRxLEhEMxcM4/LMR+PABEBAAHCwrIEGAEKAAkF\ngl8sAVYCmwIB3QkQ+/zIKgFeczDA+qAEGQEKAAwFgl47Z5UFgwB4TOAAIQkQfC+q\nTfk8N7IWIQQd3OFfCSF87i87N2B8L6pN+Tw3st58C/0exp0X2U4LqicSHEOSqHZj\njiysdqIELHGyo5DSPv92UFPp36aqjF9OFgtNNwSa56fmAVCD4+hor/fKARRIeIjF\nqdIC5Y/9a4B10NQFJa5lsvB38x/d39LI2kEoglZnqWgdJskROo3vNQF4KlIcm6FH\ndn4WI8UkC5oUUcrpZVMSKoacIaxLwqnXT42nIVgYYuqrd/ZagZZjG5WlrTOd5+NI\nzi/l0fWProcPHGLjmAh4Thu8i7omtVw1nQaMnq9I77ffg3cPDgXknYrLL+q8xXh/\n0mEJyIhnmPwllWCSZuLv9DrD5pOexFfdlwXhf6cLzNpW6QhXD/Tf5KrqIPr9aOv8\n9xaEEXWh0vEby2kIsI2++ft+vfdIyxYw/wKqx0awTSnuBV1rG3z1dswX4BfoY66x\nBz3KOVqlz9+mG/FTRQwrgPvR+qgLCHbuotxoGN7fzW+PI75hQG5JQAqhsC9sHjQH\nUrI21/VUNwzfw3v5pYsWuFb5bdQ3ASJetICQiMy7IW8WIQTRpm4aI7GCyZgPeIz7\n/MgqAV5zMG6/C/wLpPl/9e6Hf5wmXIUwpZNQbNZvpiCcyx9sXsHXaycOQVxn3McZ\nnYOUP9/mobl1tIeDQyTNbkxWjU0zzJl8XQsDZerb5098pg+x7oGIL7M1vn5s5JMl\nowROourqF88JEtOBxLMxlAM7X4hB48xKQ3Hu9hS1GdnqLKki4MqRGl4l5FUwyGOM\nGjyS3TzkfiDJNwQxybQiC9n57ij20ieNyLfuWCMLcNNnZUgZtnF6wCctoq/0ZIWu\na7nvuA/XC2WW9YjEJJiWdy5109pqac+qWiY11HWy/nms4gpMdxVpT0RhrKGWq4o0\nM5q3ZElOoeN70UO3OSbU5EVrG7gB1GuwF9mTHUVlV0veSTw0axkta3FGT//XfSpD\nlRrCkyLzwq0M+UUHQAuYpAfobDlDdnxxOD2jm5GyTzak3GSVFfjW09QFVO6HlGp5\n01/jtzkUiS6nwoHHkfnyn0beZuR8X6KlcrzLB0VFgQFLmkSM9cSOgYhD0PTu9aHb\nhW1Hj9AO8lzggBQ=\n=Nt+N\n-----END PGP PUBLIC KEY BLOCK-----\n`\n\nconst sigFromKeyWithExpiredCrossSig = `-----BEGIN PGP SIGNATURE-----\n\nwsDzBAABCgAGBYJfLAFsACEJEHwvqk35PDeyFiEEHdzhXwkhfO4vOzdgfC+qTfk8\nN7KiqwwAts4QGB7v9bABCC2qkTxJhmStC0wQMcHRcjL/qAiVnmasQWmvE9KVsdm3\nAaXd8mIx4a37/RRvr9dYrY2eE4uw72cMqPxNja2tvVXkHQvk1oEUqfkvbXs4ypKI\nNyeTWjXNOTZEbg0hbm3nMy+Wv7zgB1CEvAsEboLDJlhGqPcD+X8a6CJGrBGUBUrv\nKVmZr3U6vEzClz3DBLpoddCQseJRhT4YM1nKmBlZ5quh2LFgTSpajv5OsZheqt9y\nEZAPbqmLhDmWRQwGzkWHKceKS7nZ/ox2WK6OS7Ob8ZGZkM64iPo6/EGj5Yc19vQN\nAGiIaPEGszBBWlOpHTPhNm0LB0nMWqqaT87oNYwP8CQuuxDb6rKJ2lffCmZH27Lb\nUbQZcH8J+0UhpeaiadPZxH5ATJAcenmVtVVMLVOFnm+eIlxzov9ntpgGYt8hLdXB\nITEG9mMgp3TGS9ZzSifMZ8UGtHdp9QdBg8NEVPFzDOMGxpc/Bftav7RRRuPiAER+\n7A5CBid5\n=aQkm\n-----END PGP SIGNATURE-----\n`\n\nconst signedMessageWithCriticalNotation = `-----BEGIN PGP MESSAGE-----\n\nowGbwMvMwMH4oOW7S46CznTG09xJDDE3Wl1KUotLuDousDAwcjBYiSmyXL+48d6x\nU1PSGUxcj8IUszKBVMpMaWAAAgEGZpAeh9SKxNyCnFS95PzcytRiBi5OAZjyXXzM\nf8WYLqv7TXP61Sa4rqT12CI3xaN73YS2pt089f96odCKaEPnWJ3iSGmzJaW/ug10\n2Zo8Wj2k4s7t8wt4H3HtTu+y5UZfV3VOO+l//sdE/o+Lsub8FZH7/eOq7OnbNp4n\nvwjE8mqJXetNMfj8r2SCyvkEnlVRYR+/mnge+ib56FdJ8uKtqSxyvgA=\n=fRXs\n-----END PGP MESSAGE-----`\n\nconst criticalNotationSigner = `-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmI0EUmEvTgEEANyWtQQMOybQ9JltDqmaX0WnNPJeLILIM36sw6zL0nfTQ5zXSS3+\nfIF6P29lJFxpblWk02PSID5zX/DYU9/zjM2xPO8Oa4xo0cVTOTLj++Ri5mtr//f5\nGLsIXxFrBJhD/ghFsL3Op0GXOeLJ9A5bsOn8th7x6JucNKuaRB6bQbSPABEBAAG0\nJFRlc3QgTWNUZXN0aW5ndG9uIDx0ZXN0QGV4YW1wbGUuY29tPoi5BBMBAgAjBQJS\nYS9OAhsvBwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQSmNhOk1uQJQwDAP6\nAgrTyqkRlJVqz2pb46TfbDM2TDF7o9CBnBzIGoxBhlRwpqALz7z2kxBDmwpQa+ki\nBq3jZN/UosY9y8bhwMAlnrDY9jP1gdCo+H0sD48CdXybblNwaYpwqC8VSpDdTndf\n9j2wE/weihGp/DAdy/2kyBCaiOY1sjhUfJ1GogF49rC4jQRSYS9OAQQA6R/PtBFa\nJaT4jq10yqASk4sqwVMsc6HcifM5lSdxzExFP74naUMMyEsKHP53QxTF0Grqusag\nQg/ZtgT0CN1HUM152y7ACOdp1giKjpMzOTQClqCoclyvWOFB+L/SwGEIJf7LSCEr\nwoBuJifJc8xAVr0XX0JthoW+uP91eTQ3XpsAEQEAAYkBPQQYAQIACQUCUmEvTgIb\nLgCoCRBKY2E6TW5AlJ0gBBkBAgAGBQJSYS9OAAoJEOCE90RsICyXuqIEANmmiRCA\nSF7YK7PvFkieJNwzeK0V3F2lGX+uu6Y3Q/Zxdtwc4xR+me/CSBmsURyXTO29OWhP\nGLszPH9zSJU9BdDi6v0yNprmFPX/1Ng0Abn/sCkwetvjxC1YIvTLFwtUL/7v6NS2\nbZpsUxRTg9+cSrMWWSNjiY9qUKajm1tuzPDZXAUEAMNmAN3xXN/Kjyvj2OK2ck0X\nW748sl/tc3qiKPMJ+0AkMF7Pjhmh9nxqE9+QCEl7qinFqqBLjuzgUhBU4QlwX1GD\nAtNTq6ihLMD5v1d82ZC7tNatdlDMGWnIdvEMCv2GZcuIqDQ9rXWs49e7tq1NncLY\nhz3tYjKhoFTKEIq3y3Pp\n=h/aX\n-----END PGP PUBLIC KEY BLOCK-----`\n\nconst keyv5Test = `-----BEGIN PGP PRIVATE KEY BLOCK-----\nComment: Bob's OpenPGP Transferable Secret Key\n\nlQVYBF2lnPIBDAC5cL9PQoQLTMuhjbYvb4Ncuuo0bfmgPRFywX53jPhoFf4Zg6mv\n/seOXpgecTdOcVttfzC8ycIKrt3aQTiwOG/ctaR4Bk/t6ayNFfdUNxHWk4WCKzdz\n/56fW2O0F23qIRd8UUJp5IIlN4RDdRCtdhVQIAuzvp2oVy/LaS2kxQoKvph/5pQ/\n5whqsyroEWDJoSV0yOb25B/iwk/pLUFoyhDG9bj0kIzDxrEqW+7Ba8nocQlecMF3\nX5KMN5kp2zraLv9dlBBpWW43XktjcCZgMy20SouraVma8Je/ECwUWYUiAZxLIlMv\n9CurEOtxUw6N3RdOtLmYZS9uEnn5y1UkF88o8Nku890uk6BrewFzJyLAx5wRZ4F0\nqV/yq36UWQ0JB/AUGhHVPdFf6pl6eaxBwT5GXvbBUibtf8YI2og5RsgTWtXfU7eb\nSGXrl5ZMpbA6mbfhd0R8aPxWfmDWiIOhBufhMCvUHh1sApMKVZnvIff9/0Dca3wb\nvLIwa3T4CyshfT0AEQEAAQAL/RZqbJW2IqQDCnJi4Ozm++gPqBPiX1RhTWSjwxfM\ncJKUZfzLj414rMKm6Jh1cwwGY9jekROhB9WmwaaKT8HtcIgrZNAlYzANGRCM4TLK\n3VskxfSwKKna8l+s+mZglqbAjUg3wmFuf9Tj2xcUZYmyRm1DEmcN2ZzpvRtHgX7z\nWn1mAKUlSDJZSQks0zjuMNbupcpyJokdlkUg2+wBznBOTKzgMxVNC9b2g5/tMPUs\nhGGWmF1UH+7AHMTaS6dlmr2ZBIyogdnfUqdNg5sZwsxSNrbglKP4sqe7X61uEAIQ\nbD7rT3LonLbhkrj3I8wilUD8usIwt5IecoHhd9HziqZjRCc1BUBkboUEoyedbDV4\ni4qfsFZ6CEWoLuD5pW7dEp0M+WeuHXO164Rc+LnH6i1VQrpb1Okl4qO6ejIpIjBI\n1t3GshtUu/mwGBBxs60KBX5g77mFQ9lLCRj8lSYqOsHRKBhUp4qM869VA+fD0BRP\nfqPT0I9IH4Oa/A3jYJcg622GwQYA1LhnP208Waf6PkQSJ6kyr8ymY1yVh9VBE/g6\nfRDYA+pkqKnw9wfH2Qho3ysAA+OmVOX8Hldg+Pc0Zs0e5pCavb0En8iFLvTA0Q2E\nLR5rLue9uD7aFuKFU/VdcddY9Ww/vo4k5p/tVGp7F8RYCFn9rSjIWbfvvZi1q5Tx\n+akoZbga+4qQ4WYzB/obdX6SCmi6BndcQ1QdjCCQU6gpYx0MddVERbIp9+2SXDyL\nhpxjSyz+RGsZi/9UAshT4txP4+MZBgDfK3ZqtW+h2/eMRxkANqOJpxSjMyLO/FXN\nWxzTDYeWtHNYiAlOwlQZEPOydZFty9IVzzNFQCIUCGjQ/nNyhw7adSgUk3+BXEx/\nMyJPYY0BYuhLxLYcrfQ9nrhaVKxRJj25SVHj2ASsiwGJRZW4CC3uw40OYxfKEvNC\nmer/VxM3kg8qqGf9KUzJ1dVdAvjyx2Hz6jY2qWCyRQ6IMjWHyd43C4r3jxooYKUC\nYnstRQyb/gCSKahveSEjo07CiXMr88UGALwzEr3npFAsPW3osGaFLj49y1oRe11E\nhe9gCHFm+fuzbXrWmdPjYU5/ZdqdojzDqfu4ThfnipknpVUM1o6MQqkjM896FHm8\nzbKVFSMhEP6DPHSCexMFrrSgN03PdwHTO6iBaIBBFqmGY01tmJ03SxvSpiBPON9P\nNVvy/6UZFedTq8A07OUAxO62YUSNtT5pmK2vzs3SAZJmbFbMh+NN204TRI72GlqT\nt5hcfkuv8hrmwPS/ZR6q312mKQ6w/1pqO9qitCFCb2IgQmFiYmFnZSA8Ym9iQG9w\nZW5wZ3AuZXhhbXBsZT6JAc4EEwEKADgCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC\nF4AWIQTRpm4aI7GCyZgPeIz7/MgqAV5zMAUCXaWe+gAKCRD7/MgqAV5zMG9sC/9U\n2T3RrqEbw533FPNfEflhEVRIZ8gDXKM8hU6cqqEzCmzZT6xYTe6sv4y+PJBGXJFX\nyhj0g6FDkSyboM5litOcTupURObVqMgA/Y4UKERznm4fzzH9qek85c4ljtLyNufe\ndoL2pp3vkGtn7eD0QFRaLLmnxPKQ/TlZKdLE1G3u8Uot8QHicaR6GnAdc5UXQJE3\nBiV7jZuDyWmZ1cUNwJkKL6oRtp+ZNDOQCrLNLecKHcgCqrpjSQG5oouba1I1Q6Vl\nsP44dhA1nkmLHtxlTOzpeHj4jnk1FaXmyasurrrI5CgU/L2Oi39DGKTH/A/cywDN\n4ZplIQ9zR8enkbXquUZvFDe+Xz+6xRXtb5MwQyWODB3nHw85HocLwRoIN9WdQEI+\nL8a/56AuOwhs8llkSuiITjR7r9SgKJC2WlAHl7E8lhJ3VDW3ELC56KH308d6mwOG\nZRAqIAKzM1T5FGjMBhq7ZV0eqdEntBh3EcOIfj2M8rg1MzJv+0mHZOIjByawikad\nBVgEXaWc8gEMANYwv1xsYyunXYK0X1vY/rP1NNPvhLyLIE7NpK90YNBj+xS1ldGD\nbUdZqZeef2xJe8gMQg05DoD1DF3GipZ0Ies65beh+d5hegb7N4pzh0LzrBrVNHar\n29b5ExdI7i4iYD5TO6Vr/qTUOiAN/byqELEzAb+L+b2DVz/RoCm4PIp1DU9ewcc2\nWB38Ofqut3nLYA5tqJ9XvAiEQme+qAVcM3ZFcaMt4I4dXhDZZNg+D9LiTWcxdUPB\nleu8iwDRjAgyAhPzpFp+nWoqWA81uIiULWD1Fj+IVoY3ZvgivoYOiEFBJ9lbb4te\ng9m5UT/AaVDTWuHzbspVlbiVe+qyB77C2daWzNyx6UYBPLOo4r0t0c91kbNE5lgj\nZ7xz6los0N1U8vq91EFSeQJoSQ62XWavYmlCLmdNT6BNfgh4icLsT7Vr1QMX9jzn\nJtTPxdXytSdHvpSpULsqJ016l0dtmONcK3z9mj5N5z0k1tg1AH970TGYOe2aUcSx\nIRDMXDOPyzEfjwARAQABAAv9F2CwsjS+Sjh1M1vegJbZjei4gF1HHpEM0K0PSXsp\nSfVvpR4AoSJ4He6CXSMWg0ot8XKtDuZoV9jnJaES5UL9pMAD7JwIOqZm/DYVJM5h\nOASCh1c356/wSbFbzRHPtUdZO9Q30WFNJM5pHbCJPjtNoRmRGkf71RxtvHBzy7np\nGa+W6U/NVKHw0i0CYwMI0YlKDakYW3Pm+QL+gHZFvngGweTod0f9l2VLLAmeQR/c\n+EZs7lNumhuZ8mXcwhUc9JQIhOkpO+wreDysEFkAcsKbkQP3UDUsA1gFx9pbMzT0\ntr1oZq2a4QBtxShHzP/ph7KLpN+6qtjks3xB/yjTgaGmtrwM8tSe0wD1RwXS+/1o\nBHpXTnQ7TfeOGUAu4KCoOQLv6ELpKWbRBLWuiPwMdbGpvVFALO8+kvKAg9/r+/ny\nzM2GQHY+J3Jh5JxPiJnHfXNZjIKLbFbIPdSKNyJBuazXW8xIa//mEHMI5OcvsZBK\nclAIp7LXzjEjKXIwHwDcTn9pBgDpdOKTHOtJ3JUKx0rWVsDH6wq6iKV/FTVSY5jl\nzN+puOEsskF1Lfxn9JsJihAVO3yNsp6RvkKtyNlFazaCVKtDAmkjoh60XNxcNRqr\ngCnwdpbgdHP6v/hvZY54ZaJjz6L2e8unNEkYLxDt8cmAyGPgH2XgL7giHIp9jrsQ\naS381gnYwNX6wE1aEikgtY91nqJjwPlibF9avSyYQoMtEqM/1UjTjB2KdD/MitK5\nfP0VpvuXpNYZedmyq4UOMwdkiNMGAOrfmOeT0olgLrTMT5H97Cn3Yxbk13uXHNu/\nZUZZNe8s+QtuLfUlKAJtLEUutN33TlWQY522FV0m17S+b80xJib3yZVJteVurrh5\nHSWHAM+zghQAvCesg5CLXa2dNMkTCmZKgCBvfDLZuZbjFwnwCI6u/NhOY9egKuUf\nSA/je/RXaT8m5VxLYMxwqQXKApzD87fv0tLPlVIEvjEsaf992tFEFSNPcG1l/jpd\n5AVXw6kKuf85UkJtYR1x2MkQDrqY1QX/XMw00kt8y9kMZUre19aCArcmor+hDhRJ\nE3Gt4QJrD9z/bICESw4b4z2DbgD/Xz9IXsA/r9cKiM1h5QMtXvuhyfVeM01enhxM\nGbOH3gjqqGNKysx0UODGEwr6AV9hAd8RWXMchJLaExK9J5SRawSg671ObAU24SdY\nvMQ9Z4kAQ2+1ReUZzf3ogSMRZtMT+d18gT6L90/y+APZIaoArLPhebIAGq39HLmJ\n26x3z0WAgrpA1kNsjXEXkoiZGPLKIGoe3hqJAbYEGAEKACAWIQTRpm4aI7GCyZgP\neIz7/MgqAV5zMAUCXaWc8gIbDAAKCRD7/MgqAV5zMOn/C/9ugt+HZIwX308zI+QX\nc5vDLReuzmJ3ieE0DMO/uNSC+K1XEioSIZP91HeZJ2kbT9nn9fuReuoff0T0Dief\nrbwcIQQHFFkrqSp1K3VWmUGp2JrUsXFVdjy/fkBIjTd7c5boWljv/6wAsSfiv2V0\nJSM8EFU6TYXxswGjFVfc6X97tJNeIrXL+mpSmPPqy2bztcCCHkWS5lNLWQw+R7Vg\n71Fe6yBSNVrqC2/imYG2J9zlowjx1XU63Wdgqp2Wxt0l8OmsB/W80S1fRF5G4SDH\ns9HXglXXqPsBRZJYfP+VStm9L5P/sKjCcX6WtZR7yS6G8zj/X767MLK/djANvpPd\nNVniEke6hM3CNBXYPAMhQBMWhCulcoz+0lxi8L34rMN+Dsbma96psdUrn7uLaB91\n6we0CTfF8qqm7BsVAgalon/UUiuMY80U3ueoj3okiSTiHIjD/YtpXSPioC8nMng7\nxqAY9Bwizt4FWgXuLm1a4+So4V9j1TRCXd12Uc2l2RNmgDE=\n=miES\n-----END PGP PRIVATE KEY BLOCK-----\n`\n\nconst certv5Test = `-----BEGIN PGP PRIVATE KEY BLOCK-----\n\nlGEFXJH05BYAAAAtCSsGAQQB2kcPAQEHQFhZlVcVVtwf+21xNQPX+ecMJJBL0MPd\nfj75iux+my8QAAAAAAAiAQCHZ1SnSUmWqxEsoI6facIVZQu6mph3cBFzzTvcm5lA\nNg5ctBhlbW1hLmdvbGRtYW5AZXhhbXBsZS5uZXSIlgUTFggASCIhBRk0e8mHJGQC\nX5nfPsLgAA7ZiEiS4fez6kyUAJFZVptUBQJckfTkAhsDBQsJCAcCAyICAQYVCgkI\nCwIEFgIDAQIeBwIXgAAA9cAA/jiR3yMsZMeEQ40u6uzEoXa6UXeV/S3wwJAXRJy9\nM8s0AP9vuL/7AyTfFXwwzSjDnYmzS0qAhbLDQ643N+MXGBJ2BZxmBVyR9OQSAAAA\nMgorBgEEAZdVAQUBAQdA+nysrzml2UCweAqtpDuncSPlvrcBWKU0yfU0YvYWWAoD\nAQgHAAAAAAAiAP9OdAPppjU1WwpqjIItkxr+VPQRT8Zm/Riw7U3F6v3OiBFHiHoF\nGBYIACwiIQUZNHvJhyRkAl+Z3z7C4AAO2YhIkuH3s+pMlACRWVabVAUCXJH05AIb\nDAAAOSQBAP4BOOIR/sGLNMOfeb5fPs/02QMieoiSjIBnijhob2U5AQC+RtOHCHx7\nTcIYl5/Uyoi+FOvPLcNw4hOv2nwUzSSVAw==\n=IiS2\n-----END PGP PRIVATE KEY BLOCK-----\n`\n\nconst msgv5Test = `-----BEGIN PGP MESSAGE-----\n\nwcDMA3wvqk35PDeyAQv+PcQiLsoYTH30nJYQh3j3cJaO2+jErtVCrIQRIU0+\nrmgMddERYST4A9mA0DQIiTI4FQ0Lp440D3BWCgpq3LlNWewGzduaWwym5rN6\ncwHz5ccDqOcqbd9X0GXXGy/ZH/ljSgzuVMIytMAXKdF/vrRrVgH/+I7cxvm9\nHwnhjMN5dF0j4aEt996H2T7cbtzSr2GN9SWGW8Gyu7I8Zx73hgrGUI7gDiJB\nAfaff+P6hfkkHSGOItr94dde8J/7AUF4VEwwxdVVPvsNEFyvv6gRIbYtOCa2\n6RE6h1V/QTxW2O7zZgzWALrE2ui0oaYr9QuqQSssd9CdgExLfdPbI+3/ZAnE\nv31Idzpk3/6ILiakYHtXkElPXvf46mCNpobty8ysT34irF+fy3C1p3oGwAsx\n5VDV9OSFU6z5U+UPbSPYAy9rkc5ZssuIKxCER2oTvZ2L8Q5cfUvEUiJtRGGn\nCJlHrVDdp3FssKv2tlKgLkvxJLyoOjuEkj44H1qRk+D02FzmmUT/0sAHAYYx\nlTir6mjHeLpcGjn4waUuWIAJyph8SxUexP60bic0L0NBa6Qp5SxxijKsPIDb\nFPHxWwfJSDZRrgUyYT7089YFB/ZM4FHyH9TZcnxn0f0xIB7NS6YNDsxzN2zT\nEVEYf+De4qT/dQTsdww78Chtcv9JY9r2kDm77dk2MUGHL2j7n8jasbLtgA7h\npn2DMIWLrGamMLWRmlwslolKr1sMV5x8w+5Ias6C33iBMl9phkg42an0gYmc\nbyVJHvLO/XErtC+GNIJeMg==\n=liRq\n-----END PGP MESSAGE-----\n`\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package s2k implements the various OpenPGP string-to-key transforms as\n// specified in RFC 4800 section 3.7.1, and Argon2 specified in\n// draft-ietf-openpgp-crypto-refresh-08 section 3.7.1.4.\npackage s2k // import \"github.com/ProtonMail/go-crypto/openpgp/s2k\"\n\nimport (\n\t\"crypto\"\n\t\"hash\"\n\t\"io\"\n\t\"strconv\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/algorithm\"\n\t\"golang.org/x/crypto/argon2\"\n)\n\ntype Mode uint8\n\n// Defines the default S2KMode constants\n//\n//\t0 (simple), 1(salted), 3(iterated), 4(argon2)\nconst (\n\tSimpleS2K         Mode = 0\n\tSaltedS2K         Mode = 1\n\tIteratedSaltedS2K Mode = 3\n\tArgon2S2K         Mode = 4\n\tGnuS2K            Mode = 101\n)\n\nconst Argon2SaltSize int = 16\n\n// Params contains all the parameters of the s2k packet\ntype Params struct {\n\t// mode is the mode of s2k function.\n\t// It can be 0 (simple), 1(salted), 3(iterated)\n\t// 2(reserved) 100-110(private/experimental).\n\tmode Mode\n\t// hashId is the ID of the hash function used in any of the modes\n\thashId byte\n\t// salt is a byte array to use as a salt in hashing process or argon2\n\tsaltBytes [Argon2SaltSize]byte\n\t// countByte is used to determine how many rounds of hashing are to\n\t// be performed in s2k mode 3. See RFC 4880 Section 3.7.1.3.\n\tcountByte byte\n\t// passes is a parameter in Argon2 to determine the number of iterations\n\t// See RFC the crypto refresh Section 3.7.1.4.\n\tpasses byte\n\t// parallelism is a parameter in Argon2 to determine the degree of paralellism\n\t// See RFC the crypto refresh Section 3.7.1.4.\n\tparallelism byte\n\t// memoryExp is a parameter in Argon2 to determine the memory usage\n\t// i.e., 2 ** memoryExp kibibytes\n\t// See RFC the crypto refresh Section 3.7.1.4.\n\tmemoryExp byte\n}\n\n// encodeCount converts an iterative \"count\" in the range 1024 to\n// 65011712, inclusive, to an encoded count. The return value is the\n// octet that is actually stored in the GPG file. encodeCount panics\n// if i is not in the above range (encodedCount above takes care to\n// pass i in the correct range). See RFC 4880 Section 3.7.7.1.\nfunc encodeCount(i int) uint8 {\n\tif i < 65536 || i > 65011712 {\n\t\tpanic(\"count arg i outside the required range\")\n\t}\n\n\tfor encoded := 96; encoded < 256; encoded++ {\n\t\tcount := decodeCount(uint8(encoded))\n\t\tif count >= i {\n\t\t\treturn uint8(encoded)\n\t\t}\n\t}\n\n\treturn 255\n}\n\n// decodeCount returns the s2k mode 3 iterative \"count\" corresponding to\n// the encoded octet c.\nfunc decodeCount(c uint8) int {\n\treturn (16 + int(c&15)) << (uint32(c>>4) + 6)\n}\n\n// encodeMemory converts the Argon2 \"memory\" in the range parallelism*8 to\n// 2**31, inclusive, to an encoded memory. The return value is the\n// octet that is actually stored in the GPG file. encodeMemory panics\n// if is not in the above range\n// See OpenPGP crypto refresh Section 3.7.1.4.\nfunc encodeMemory(memory uint32, parallelism uint8) uint8 {\n\tif memory < (8*uint32(parallelism)) || memory > uint32(2147483648) {\n\t\tpanic(\"Memory argument memory is outside the required range\")\n\t}\n\n\tfor exp := 3; exp < 31; exp++ {\n\t\tcompare := decodeMemory(uint8(exp))\n\t\tif compare >= memory {\n\t\t\treturn uint8(exp)\n\t\t}\n\t}\n\n\treturn 31\n}\n\n// decodeMemory computes the decoded memory in kibibytes as 2**memoryExponent\nfunc decodeMemory(memoryExponent uint8) uint32 {\n\treturn uint32(1) << memoryExponent\n}\n\n// Simple writes to out the result of computing the Simple S2K function (RFC\n// 4880, section 3.7.1.1) using the given hash and input passphrase.\nfunc Simple(out []byte, h hash.Hash, in []byte) {\n\tSalted(out, h, in, nil)\n}\n\nvar zero [1]byte\n\n// Salted writes to out the result of computing the Salted S2K function (RFC\n// 4880, section 3.7.1.2) using the given hash, input passphrase and salt.\nfunc Salted(out []byte, h hash.Hash, in []byte, salt []byte) {\n\tdone := 0\n\tvar digest []byte\n\n\tfor i := 0; done < len(out); i++ {\n\t\th.Reset()\n\t\tfor j := 0; j < i; j++ {\n\t\t\th.Write(zero[:])\n\t\t}\n\t\th.Write(salt)\n\t\th.Write(in)\n\t\tdigest = h.Sum(digest[:0])\n\t\tn := copy(out[done:], digest)\n\t\tdone += n\n\t}\n}\n\n// Iterated writes to out the result of computing the Iterated and Salted S2K\n// function (RFC 4880, section 3.7.1.3) using the given hash, input passphrase,\n// salt and iteration count.\nfunc Iterated(out []byte, h hash.Hash, in []byte, salt []byte, count int) {\n\tcombined := make([]byte, len(in)+len(salt))\n\tcopy(combined, salt)\n\tcopy(combined[len(salt):], in)\n\n\tif count < len(combined) {\n\t\tcount = len(combined)\n\t}\n\n\tdone := 0\n\tvar digest []byte\n\tfor i := 0; done < len(out); i++ {\n\t\th.Reset()\n\t\tfor j := 0; j < i; j++ {\n\t\t\th.Write(zero[:])\n\t\t}\n\t\twritten := 0\n\t\tfor written < count {\n\t\t\tif written+len(combined) > count {\n\t\t\t\ttodo := count - written\n\t\t\t\th.Write(combined[:todo])\n\t\t\t\twritten = count\n\t\t\t} else {\n\t\t\t\th.Write(combined)\n\t\t\t\twritten += len(combined)\n\t\t\t}\n\t\t}\n\t\tdigest = h.Sum(digest[:0])\n\t\tn := copy(out[done:], digest)\n\t\tdone += n\n\t}\n}\n\n// Argon2 writes to out the key derived from the password (in) with the Argon2\n// function (the crypto refresh, section 3.7.1.4)\nfunc Argon2(out []byte, in []byte, salt []byte, passes uint8, paralellism uint8, memoryExp uint8) {\n\tkey := argon2.IDKey(in, salt, uint32(passes), decodeMemory(memoryExp), paralellism, uint32(len(out)))\n\tcopy(out[:], key)\n}\n\n// Generate generates valid parameters from given configuration.\n// It will enforce the Iterated and Salted or Argon2 S2K method.\nfunc Generate(rand io.Reader, c *Config) (*Params, error) {\n\tvar params *Params\n\tif c != nil && c.Mode() == Argon2S2K {\n\t\t// handle Argon2 case\n\t\targonConfig := c.Argon2()\n\t\tparams = &Params{\n\t\t\tmode:        Argon2S2K,\n\t\t\tpasses:      argonConfig.Passes(),\n\t\t\tparallelism: argonConfig.Parallelism(),\n\t\t\tmemoryExp:   argonConfig.EncodedMemory(),\n\t\t}\n\t} else if c != nil && c.PassphraseIsHighEntropy && c.Mode() == SaltedS2K { // Allow SaltedS2K if PassphraseIsHighEntropy\n\t\thashId, ok := algorithm.HashToHashId(c.hash())\n\t\tif !ok {\n\t\t\treturn nil, errors.UnsupportedError(\"no such hash\")\n\t\t}\n\n\t\tparams = &Params{\n\t\t\tmode:   SaltedS2K,\n\t\t\thashId: hashId,\n\t\t}\n\t} else { // Enforce IteratedSaltedS2K method otherwise\n\t\thashId, ok := algorithm.HashToHashId(c.hash())\n\t\tif !ok {\n\t\t\treturn nil, errors.UnsupportedError(\"no such hash\")\n\t\t}\n\t\tif c != nil {\n\t\t\tc.S2KMode = IteratedSaltedS2K\n\t\t}\n\t\tparams = &Params{\n\t\t\tmode:      IteratedSaltedS2K,\n\t\t\thashId:    hashId,\n\t\t\tcountByte: c.EncodedCount(),\n\t\t}\n\t}\n\tif _, err := io.ReadFull(rand, params.salt()); err != nil {\n\t\treturn nil, err\n\t}\n\treturn params, nil\n}\n\n// Parse reads a binary specification for a string-to-key transformation from r\n// and returns a function which performs that transform. If the S2K is a special\n// GNU extension that indicates that the private key is missing, then the error\n// returned is errors.ErrDummyPrivateKey.\nfunc Parse(r io.Reader) (f func(out, in []byte), err error) {\n\tparams, err := ParseIntoParams(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn params.Function()\n}\n\n// ParseIntoParams reads a binary specification for a string-to-key\n// transformation from r and returns a struct describing the s2k parameters.\nfunc ParseIntoParams(r io.Reader) (params *Params, err error) {\n\tvar buf [Argon2SaltSize + 3]byte\n\n\t_, err = io.ReadFull(r, buf[:1])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tparams = &Params{\n\t\tmode: Mode(buf[0]),\n\t}\n\n\tswitch params.mode {\n\tcase SimpleS2K:\n\t\t_, err = io.ReadFull(r, buf[:1])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tparams.hashId = buf[0]\n\t\treturn params, nil\n\tcase SaltedS2K:\n\t\t_, err = io.ReadFull(r, buf[:9])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tparams.hashId = buf[0]\n\t\tcopy(params.salt(), buf[1:9])\n\t\treturn params, nil\n\tcase IteratedSaltedS2K:\n\t\t_, err = io.ReadFull(r, buf[:10])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tparams.hashId = buf[0]\n\t\tcopy(params.salt(), buf[1:9])\n\t\tparams.countByte = buf[9]\n\t\treturn params, nil\n\tcase Argon2S2K:\n\t\t_, err = io.ReadFull(r, buf[:Argon2SaltSize+3])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcopy(params.salt(), buf[:Argon2SaltSize])\n\t\tparams.passes = buf[Argon2SaltSize]\n\t\tparams.parallelism = buf[Argon2SaltSize+1]\n\t\tparams.memoryExp = buf[Argon2SaltSize+2]\n\t\tif err := validateArgon2Params(params); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn params, nil\n\tcase GnuS2K:\n\t\t// This is a GNU extension. See\n\t\t// https://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=blob;f=doc/DETAILS;h=fe55ae16ab4e26d8356dc574c9e8bc935e71aef1;hb=23191d7851eae2217ecdac6484349849a24fd94a#l1109\n\t\tif _, err = io.ReadFull(r, buf[:5]); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tparams.hashId = buf[0]\n\t\tif buf[1] == 'G' && buf[2] == 'N' && buf[3] == 'U' && buf[4] == 1 {\n\t\t\treturn params, nil\n\t\t}\n\t\treturn nil, errors.UnsupportedError(\"GNU S2K extension\")\n\t}\n\n\treturn nil, errors.UnsupportedError(\"S2K function\")\n}\n\nfunc (params *Params) Mode() Mode {\n\treturn params.mode\n}\n\nfunc (params *Params) Dummy() bool {\n\treturn params != nil && params.mode == GnuS2K\n}\n\nfunc (params *Params) salt() []byte {\n\tswitch params.mode {\n\tcase SaltedS2K, IteratedSaltedS2K:\n\t\treturn params.saltBytes[:8]\n\tcase Argon2S2K:\n\t\treturn params.saltBytes[:Argon2SaltSize]\n\tdefault:\n\t\treturn nil\n\t}\n}\n\nfunc (params *Params) Function() (f func(out, in []byte), err error) {\n\tif params.Dummy() {\n\t\treturn nil, errors.ErrDummyPrivateKey(\"dummy key found\")\n\t}\n\tvar hashObj crypto.Hash\n\tif params.mode != Argon2S2K {\n\t\tvar ok bool\n\t\thashObj, ok = algorithm.HashIdToHashWithSha1(params.hashId)\n\t\tif !ok {\n\t\t\treturn nil, errors.UnsupportedError(\"hash for S2K function: \" + strconv.Itoa(int(params.hashId)))\n\t\t}\n\t\tif !hashObj.Available() {\n\t\t\treturn nil, errors.UnsupportedError(\"hash not available: \" + strconv.Itoa(int(hashObj)))\n\t\t}\n\t}\n\n\tswitch params.mode {\n\tcase SimpleS2K:\n\t\tf := func(out, in []byte) {\n\t\t\tSimple(out, hashObj.New(), in)\n\t\t}\n\n\t\treturn f, nil\n\tcase SaltedS2K:\n\t\tf := func(out, in []byte) {\n\t\t\tSalted(out, hashObj.New(), in, params.salt())\n\t\t}\n\n\t\treturn f, nil\n\tcase IteratedSaltedS2K:\n\t\tf := func(out, in []byte) {\n\t\t\tIterated(out, hashObj.New(), in, params.salt(), decodeCount(params.countByte))\n\t\t}\n\n\t\treturn f, nil\n\tcase Argon2S2K:\n\t\tf := func(out, in []byte) {\n\t\t\tArgon2(out, in, params.salt(), params.passes, params.parallelism, params.memoryExp)\n\t\t}\n\t\treturn f, nil\n\t}\n\n\treturn nil, errors.UnsupportedError(\"S2K function\")\n}\n\nfunc (params *Params) Serialize(w io.Writer) (err error) {\n\tif _, err = w.Write([]byte{uint8(params.mode)}); err != nil {\n\t\treturn\n\t}\n\tif params.mode != Argon2S2K {\n\t\tif _, err = w.Write([]byte{params.hashId}); err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\tif params.Dummy() {\n\t\t_, err = w.Write(append([]byte(\"GNU\"), 1))\n\t\treturn\n\t}\n\tif params.mode > 0 {\n\t\tif _, err = w.Write(params.salt()); err != nil {\n\t\t\treturn\n\t\t}\n\t\tif params.mode == IteratedSaltedS2K {\n\t\t\t_, err = w.Write([]byte{params.countByte})\n\t\t}\n\t\tif params.mode == Argon2S2K {\n\t\t\t_, err = w.Write([]byte{params.passes, params.parallelism, params.memoryExp})\n\t\t}\n\t}\n\treturn\n}\n\n// Serialize salts and stretches the given passphrase and writes the\n// resulting key into key. It also serializes an S2K descriptor to\n// w. The key stretching can be configured with c, which may be\n// nil. In that case, sensible defaults will be used.\nfunc Serialize(w io.Writer, key []byte, rand io.Reader, passphrase []byte, c *Config) error {\n\tparams, err := Generate(rand, c)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = params.Serialize(w)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tf, err := params.Function()\n\tif err != nil {\n\t\treturn err\n\t}\n\tf(key, passphrase)\n\treturn nil\n}\n\n// validateArgon2Params checks that the argon2 parameters are valid according to RFC9580.\nfunc validateArgon2Params(params *Params) error {\n\t// The number of passes t and the degree of parallelism p MUST be non-zero.\n\tif params.parallelism == 0 {\n\t\treturn errors.StructuralError(\"invalid argon2 params: parallelism is 0\")\n\t}\n\tif params.passes == 0 {\n\t\treturn errors.StructuralError(\"invalid argon2 params: iterations is 0\")\n\t}\n\n\t// The encoded memory size MUST be a value from 3+ceil(log2(p)) to 31,\n\t// such that the decoded memory size m is a value from 8*p to 2^31.\n\tif params.memoryExp > 31 || decodeMemory(params.memoryExp) < 8*uint32(params.parallelism) {\n\t\treturn errors.StructuralError(\"invalid argon2 params: memory is out of bounds\")\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k_cache.go",
    "content": "package s2k\n\n// Cache stores keys derived with s2k functions from one passphrase\n// to avoid recomputation if multiple items are encrypted with\n// the same parameters.\ntype Cache map[Params][]byte\n\n// GetOrComputeDerivedKey tries to retrieve the key\n// for the given s2k parameters from the cache.\n// If there is no hit, it derives the key with the s2k function from the passphrase,\n// updates the cache, and returns the key.\nfunc (c *Cache) GetOrComputeDerivedKey(passphrase []byte, params *Params, expectedKeySize int) ([]byte, error) {\n\tkey, found := (*c)[*params]\n\tif !found || len(key) != expectedKeySize {\n\t\tvar err error\n\t\tderivedKey := make([]byte, expectedKeySize)\n\t\ts2k, err := params.Function()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ts2k(derivedKey, passphrase)\n\t\t(*c)[*params] = key\n\t\treturn derivedKey, nil\n\t}\n\treturn key, nil\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k_config.go",
    "content": "package s2k\n\nimport \"crypto\"\n\n// Config collects configuration parameters for s2k key-stretching\n// transformations. A nil *Config is valid and results in all default\n// values.\ntype Config struct {\n\t// S2K (String to Key) mode, used for key derivation in the context of secret key encryption\n\t// and passphrase-encrypted data. Either s2k.Argon2S2K or s2k.IteratedSaltedS2K may be used.\n\t// If the passphrase is a high-entropy key, indicated by setting PassphraseIsHighEntropy to true,\n\t// s2k.SaltedS2K can also be used.\n\t// Note: Argon2 is the strongest option but not all OpenPGP implementations are compatible with it\n\t//(pending standardisation).\n\t// 0 (simple), 1(salted), 3(iterated), 4(argon2)\n\t// 2(reserved) 100-110(private/experimental).\n\tS2KMode Mode\n\t// Only relevant if S2KMode is not set to s2k.Argon2S2K.\n\t// Hash is the default hash function to be used. If\n\t// nil, SHA256 is used.\n\tHash crypto.Hash\n\t// Argon2 parameters for S2K (String to Key).\n\t// Only relevant if S2KMode is set to s2k.Argon2S2K.\n\t// If nil, default parameters are used.\n\t// For more details on the choice of parameters, see https://tools.ietf.org/html/rfc9106#section-4.\n\tArgon2Config *Argon2Config\n\t// Only relevant if S2KMode is set to s2k.IteratedSaltedS2K.\n\t// Iteration count for Iterated S2K (String to Key). It\n\t// determines the strength of the passphrase stretching when\n\t// the said passphrase is hashed to produce a key. S2KCount\n\t// should be between 65536 and 65011712, inclusive. If Config\n\t// is nil or S2KCount is 0, the value 16777216 used. Not all\n\t// values in the above range can be represented. S2KCount will\n\t// be rounded up to the next representable value if it cannot\n\t// be encoded exactly. When set, it is strongly encrouraged to\n\t// use a value that is at least 65536. See RFC 4880 Section\n\t// 3.7.1.3.\n\tS2KCount int\n\t// Indicates whether the passphrase passed by the application is a\n\t// high-entropy key (e.g. it's randomly generated or derived from\n\t// another passphrase using a strong key derivation function).\n\t// When true, allows the S2KMode to be s2k.SaltedS2K.\n\t// When the passphrase is not a high-entropy key, using SaltedS2K is\n\t// insecure, and not allowed by draft-ietf-openpgp-crypto-refresh-08.\n\tPassphraseIsHighEntropy bool\n}\n\n// Argon2Config stores the Argon2 parameters\n// A nil *Argon2Config is valid and results in all default\ntype Argon2Config struct {\n\tNumberOfPasses      uint8\n\tDegreeOfParallelism uint8\n\t// Memory specifies the desired Argon2 memory usage in kibibytes.\n\t// For example memory=64*1024 sets the memory cost to ~64 MB.\n\tMemory uint32\n}\n\nfunc (c *Config) Mode() Mode {\n\tif c == nil {\n\t\treturn IteratedSaltedS2K\n\t}\n\treturn c.S2KMode\n}\n\nfunc (c *Config) hash() crypto.Hash {\n\tif c == nil || uint(c.Hash) == 0 {\n\t\treturn crypto.SHA256\n\t}\n\n\treturn c.Hash\n}\n\nfunc (c *Config) Argon2() *Argon2Config {\n\tif c == nil || c.Argon2Config == nil {\n\t\treturn nil\n\t}\n\treturn c.Argon2Config\n}\n\n// EncodedCount get encoded count\nfunc (c *Config) EncodedCount() uint8 {\n\tif c == nil || c.S2KCount == 0 {\n\t\treturn 224 // The common case. Corresponding to 16777216\n\t}\n\n\ti := c.S2KCount\n\n\tswitch {\n\tcase i < 65536:\n\t\ti = 65536\n\tcase i > 65011712:\n\t\ti = 65011712\n\t}\n\n\treturn encodeCount(i)\n}\n\nfunc (c *Argon2Config) Passes() uint8 {\n\tif c == nil || c.NumberOfPasses == 0 {\n\t\treturn 3\n\t}\n\treturn c.NumberOfPasses\n}\n\nfunc (c *Argon2Config) Parallelism() uint8 {\n\tif c == nil || c.DegreeOfParallelism == 0 {\n\t\treturn 4\n\t}\n\treturn c.DegreeOfParallelism\n}\n\nfunc (c *Argon2Config) EncodedMemory() uint8 {\n\tif c == nil || c.Memory == 0 {\n\t\treturn 16 // 64 MiB of RAM\n\t}\n\n\tmemory := c.Memory\n\tlowerBound := uint32(c.Parallelism()) * 8\n\tupperBound := uint32(2147483648)\n\n\tswitch {\n\tcase memory < lowerBound:\n\t\tmemory = lowerBound\n\tcase memory > upperBound:\n\t\tmemory = upperBound\n\t}\n\n\treturn encodeMemory(memory, c.Parallelism())\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/write.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage openpgp\n\nimport (\n\t\"crypto\"\n\t\"hash\"\n\t\"io\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/armor\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/internal/algorithm\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/packet\"\n)\n\n// DetachSign signs message with the private key from signer (which must\n// already have been decrypted) and writes the signature to w.\n// If config is nil, sensible defaults will be used.\nfunc DetachSign(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) error {\n\treturn detachSign(w, signer, message, packet.SigTypeBinary, config)\n}\n\n// ArmoredDetachSign signs message with the private key from signer (which\n// must already have been decrypted) and writes an armored signature to w.\n// If config is nil, sensible defaults will be used.\nfunc ArmoredDetachSign(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) (err error) {\n\treturn armoredDetachSign(w, signer, message, packet.SigTypeBinary, config)\n}\n\n// DetachSignText signs message (after canonicalising the line endings) with\n// the private key from signer (which must already have been decrypted) and\n// writes the signature to w.\n// If config is nil, sensible defaults will be used.\nfunc DetachSignText(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) error {\n\treturn detachSign(w, signer, message, packet.SigTypeText, config)\n}\n\n// ArmoredDetachSignText signs message (after canonicalising the line endings)\n// with the private key from signer (which must already have been decrypted)\n// and writes an armored signature to w.\n// If config is nil, sensible defaults will be used.\nfunc ArmoredDetachSignText(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) error {\n\treturn armoredDetachSign(w, signer, message, packet.SigTypeText, config)\n}\n\nfunc armoredDetachSign(w io.Writer, signer *Entity, message io.Reader, sigType packet.SignatureType, config *packet.Config) (err error) {\n\tout, err := armor.Encode(w, SignatureType, nil)\n\tif err != nil {\n\t\treturn\n\t}\n\terr = detachSign(out, signer, message, sigType, config)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn out.Close()\n}\n\nfunc detachSign(w io.Writer, signer *Entity, message io.Reader, sigType packet.SignatureType, config *packet.Config) (err error) {\n\tsigningKey, ok := signer.SigningKeyById(config.Now(), config.SigningKey())\n\tif !ok {\n\t\treturn errors.InvalidArgumentError(\"no valid signing keys\")\n\t}\n\tif signingKey.PrivateKey == nil {\n\t\treturn errors.InvalidArgumentError(\"signing key doesn't have a private key\")\n\t}\n\tif signingKey.PrivateKey.Encrypted {\n\t\treturn errors.InvalidArgumentError(\"signing key is encrypted\")\n\t}\n\tif _, ok := algorithm.HashToHashId(config.Hash()); !ok {\n\t\treturn errors.InvalidArgumentError(\"invalid hash function\")\n\t}\n\n\tsig := createSignaturePacket(signingKey.PublicKey, sigType, config)\n\n\th, err := sig.PrepareSign(config)\n\tif err != nil {\n\t\treturn\n\t}\n\twrappedHash, err := wrapHashForSignature(h, sig.SigType)\n\tif err != nil {\n\t\treturn\n\t}\n\tif _, err = io.Copy(wrappedHash, message); err != nil {\n\t\treturn err\n\t}\n\n\terr = sig.Sign(h, signingKey.PrivateKey, config)\n\tif err != nil {\n\t\treturn\n\t}\n\n\treturn sig.Serialize(w)\n}\n\n// FileHints contains metadata about encrypted files. This metadata is, itself,\n// encrypted.\ntype FileHints struct {\n\t// IsBinary can be set to hint that the contents are binary data.\n\tIsBinary bool\n\t// FileName hints at the name of the file that should be written. It's\n\t// truncated to 255 bytes if longer. It may be empty to suggest that the\n\t// file should not be written to disk. It may be equal to \"_CONSOLE\" to\n\t// suggest the data should not be written to disk.\n\tFileName string\n\t// ModTime contains the modification time of the file, or the zero time if not applicable.\n\tModTime time.Time\n}\n\n// SymmetricallyEncrypt acts like gpg -c: it encrypts a file with a passphrase.\n// The resulting WriteCloser must be closed after the contents of the file have\n// been written.\n// If config is nil, sensible defaults will be used.\nfunc SymmetricallyEncrypt(ciphertext io.Writer, passphrase []byte, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) {\n\tif hints == nil {\n\t\thints = &FileHints{}\n\t}\n\n\tkey, err := packet.SerializeSymmetricKeyEncrypted(ciphertext, passphrase, config)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tvar w io.WriteCloser\n\tcipherSuite := packet.CipherSuite{\n\t\tCipher: config.Cipher(),\n\t\tMode:   config.AEAD().Mode(),\n\t}\n\tw, err = packet.SerializeSymmetricallyEncrypted(ciphertext, config.Cipher(), config.AEAD() != nil, cipherSuite, key, config)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tliteralData := w\n\tif algo := config.Compression(); algo != packet.CompressionNone {\n\t\tvar compConfig *packet.CompressionConfig\n\t\tif config != nil {\n\t\t\tcompConfig = config.CompressionConfig\n\t\t}\n\t\tliteralData, err = packet.SerializeCompressed(w, algo, compConfig)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\tvar epochSeconds uint32\n\tif !hints.ModTime.IsZero() {\n\t\tepochSeconds = uint32(hints.ModTime.Unix())\n\t}\n\treturn packet.SerializeLiteral(literalData, hints.IsBinary, hints.FileName, epochSeconds)\n}\n\n// intersectPreferences mutates and returns a prefix of a that contains only\n// the values in the intersection of a and b. The order of a is preserved.\nfunc intersectPreferences(a []uint8, b []uint8) (intersection []uint8) {\n\tvar j int\n\tfor _, v := range a {\n\t\tfor _, v2 := range b {\n\t\t\tif v == v2 {\n\t\t\t\ta[j] = v\n\t\t\t\tj++\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a[:j]\n}\n\n// intersectPreferences mutates and returns a prefix of a that contains only\n// the values in the intersection of a and b. The order of a is preserved.\nfunc intersectCipherSuites(a [][2]uint8, b [][2]uint8) (intersection [][2]uint8) {\n\tvar j int\n\tfor _, v := range a {\n\t\tfor _, v2 := range b {\n\t\t\tif v[0] == v2[0] && v[1] == v2[1] {\n\t\t\t\ta[j] = v\n\t\t\t\tj++\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a[:j]\n}\n\nfunc hashToHashId(h crypto.Hash) uint8 {\n\tv, ok := algorithm.HashToHashId(h)\n\tif !ok {\n\t\tpanic(\"tried to convert unknown hash\")\n\t}\n\treturn v\n}\n\n// EncryptText encrypts a message to a number of recipients and, optionally,\n// signs it. Optional information is contained in 'hints', also encrypted, that\n// aids the recipients in processing the message. The resulting WriteCloser\n// must be closed after the contents of the file have been written. If config\n// is nil, sensible defaults will be used. The signing is done in text mode.\nfunc EncryptText(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) {\n\treturn encrypt(ciphertext, ciphertext, to, signed, hints, packet.SigTypeText, config)\n}\n\n// Encrypt encrypts a message to a number of recipients and, optionally, signs\n// it. hints contains optional information, that is also encrypted, that aids\n// the recipients in processing the message. The resulting WriteCloser must\n// be closed after the contents of the file have been written.\n// If config is nil, sensible defaults will be used.\nfunc Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) {\n\treturn encrypt(ciphertext, ciphertext, to, signed, hints, packet.SigTypeBinary, config)\n}\n\n// EncryptSplit encrypts a message to a number of recipients and, optionally, signs\n// it. hints contains optional information, that is also encrypted, that aids\n// the recipients in processing the message. The resulting WriteCloser must\n// be closed after the contents of the file have been written.\n// If config is nil, sensible defaults will be used.\nfunc EncryptSplit(keyWriter io.Writer, dataWriter io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) {\n\treturn encrypt(keyWriter, dataWriter, to, signed, hints, packet.SigTypeBinary, config)\n}\n\n// EncryptTextSplit encrypts a message to a number of recipients and, optionally, signs\n// it. hints contains optional information, that is also encrypted, that aids\n// the recipients in processing the message. The resulting WriteCloser must\n// be closed after the contents of the file have been written.\n// If config is nil, sensible defaults will be used.\nfunc EncryptTextSplit(keyWriter io.Writer, dataWriter io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) {\n\treturn encrypt(keyWriter, dataWriter, to, signed, hints, packet.SigTypeText, config)\n}\n\n// writeAndSign writes the data as a payload package and, optionally, signs\n// it. hints contains optional information, that is also encrypted,\n// that aids the recipients in processing the message. The resulting\n// WriteCloser must be closed after the contents of the file have been\n// written. If config is nil, sensible defaults will be used.\nfunc writeAndSign(payload io.WriteCloser, candidateHashes []uint8, signed *Entity, hints *FileHints, sigType packet.SignatureType, config *packet.Config) (plaintext io.WriteCloser, err error) {\n\tvar signer *packet.PrivateKey\n\tif signed != nil {\n\t\tsignKey, ok := signed.SigningKeyById(config.Now(), config.SigningKey())\n\t\tif !ok {\n\t\t\treturn nil, errors.InvalidArgumentError(\"no valid signing keys\")\n\t\t}\n\t\tsigner = signKey.PrivateKey\n\t\tif signer == nil {\n\t\t\treturn nil, errors.InvalidArgumentError(\"no private key in signing key\")\n\t\t}\n\t\tif signer.Encrypted {\n\t\t\treturn nil, errors.InvalidArgumentError(\"signing key must be decrypted\")\n\t\t}\n\t}\n\n\tvar hash crypto.Hash\n\tfor _, hashId := range candidateHashes {\n\t\tif h, ok := algorithm.HashIdToHash(hashId); ok && h.Available() {\n\t\t\thash = h\n\t\t\tbreak\n\t\t}\n\t}\n\n\t// If the hash specified by config is a candidate, we'll use that.\n\tif configuredHash := config.Hash(); configuredHash.Available() {\n\t\tfor _, hashId := range candidateHashes {\n\t\t\tif h, ok := algorithm.HashIdToHash(hashId); ok && h == configuredHash {\n\t\t\t\thash = h\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tif hash == 0 {\n\t\thashId := candidateHashes[0]\n\t\tname, ok := algorithm.HashIdToString(hashId)\n\t\tif !ok {\n\t\t\tname = \"#\" + strconv.Itoa(int(hashId))\n\t\t}\n\t\treturn nil, errors.InvalidArgumentError(\"cannot encrypt because no candidate hash functions are compiled in. (Wanted \" + name + \" in this case.)\")\n\t}\n\n\tvar salt []byte\n\tif signer != nil {\n\t\tvar opsVersion = 3\n\t\tif signer.Version == 6 {\n\t\t\topsVersion = signer.Version\n\t\t}\n\t\tops := &packet.OnePassSignature{\n\t\t\tVersion:    opsVersion,\n\t\t\tSigType:    sigType,\n\t\t\tHash:       hash,\n\t\t\tPubKeyAlgo: signer.PubKeyAlgo,\n\t\t\tKeyId:      signer.KeyId,\n\t\t\tIsLast:     true,\n\t\t}\n\t\tif opsVersion == 6 {\n\t\t\tops.KeyFingerprint = signer.Fingerprint\n\t\t\tsalt, err = packet.SignatureSaltForHash(hash, config.Random())\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tops.Salt = salt\n\t\t}\n\t\tif err := ops.Serialize(payload); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tif hints == nil {\n\t\thints = &FileHints{}\n\t}\n\n\tw := payload\n\tif signer != nil {\n\t\t// If we need to write a signature packet after the literal\n\t\t// data then we need to stop literalData from closing\n\t\t// encryptedData.\n\t\tw = noOpCloser{w}\n\n\t}\n\tvar epochSeconds uint32\n\tif !hints.ModTime.IsZero() {\n\t\tepochSeconds = uint32(hints.ModTime.Unix())\n\t}\n\tliteralData, err := packet.SerializeLiteral(w, hints.IsBinary, hints.FileName, epochSeconds)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif signer != nil {\n\t\th, wrappedHash, err := hashForSignature(hash, sigType, salt)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tmetadata := &packet.LiteralData{\n\t\t\tFormat:   'u',\n\t\t\tFileName: hints.FileName,\n\t\t\tTime:     epochSeconds,\n\t\t}\n\t\tif hints.IsBinary {\n\t\t\tmetadata.Format = 'b'\n\t\t}\n\t\treturn signatureWriter{payload, literalData, hash, wrappedHash, h, salt, signer, sigType, config, metadata}, nil\n\t}\n\treturn literalData, nil\n}\n\n// encrypt encrypts a message to a number of recipients and, optionally, signs\n// it. hints contains optional information, that is also encrypted, that aids\n// the recipients in processing the message. The resulting WriteCloser must\n// be closed after the contents of the file have been written.\n// If config is nil, sensible defaults will be used.\nfunc encrypt(keyWriter io.Writer, dataWriter io.Writer, to []*Entity, signed *Entity, hints *FileHints, sigType packet.SignatureType, config *packet.Config) (plaintext io.WriteCloser, err error) {\n\tif len(to) == 0 {\n\t\treturn nil, errors.InvalidArgumentError(\"no encryption recipient provided\")\n\t}\n\n\t// These are the possible ciphers that we'll use for the message.\n\tcandidateCiphers := []uint8{\n\t\tuint8(packet.CipherAES256),\n\t\tuint8(packet.CipherAES128),\n\t}\n\n\t// These are the possible hash functions that we'll use for the signature.\n\tcandidateHashes := []uint8{\n\t\thashToHashId(crypto.SHA256),\n\t\thashToHashId(crypto.SHA384),\n\t\thashToHashId(crypto.SHA512),\n\t\thashToHashId(crypto.SHA3_256),\n\t\thashToHashId(crypto.SHA3_512),\n\t}\n\n\t// Prefer GCM if everyone supports it\n\tcandidateCipherSuites := [][2]uint8{\n\t\t{uint8(packet.CipherAES256), uint8(packet.AEADModeGCM)},\n\t\t{uint8(packet.CipherAES256), uint8(packet.AEADModeEAX)},\n\t\t{uint8(packet.CipherAES256), uint8(packet.AEADModeOCB)},\n\t\t{uint8(packet.CipherAES128), uint8(packet.AEADModeGCM)},\n\t\t{uint8(packet.CipherAES128), uint8(packet.AEADModeEAX)},\n\t\t{uint8(packet.CipherAES128), uint8(packet.AEADModeOCB)},\n\t}\n\n\tcandidateCompression := []uint8{\n\t\tuint8(packet.CompressionNone),\n\t\tuint8(packet.CompressionZIP),\n\t\tuint8(packet.CompressionZLIB),\n\t}\n\n\tencryptKeys := make([]Key, len(to))\n\n\t// AEAD is used only if config enables it and every key supports it\n\taeadSupported := config.AEAD() != nil\n\n\tfor i := range to {\n\t\tvar ok bool\n\t\tencryptKeys[i], ok = to[i].EncryptionKey(config.Now())\n\t\tif !ok {\n\t\t\treturn nil, errors.InvalidArgumentError(\"cannot encrypt a message to key id \" + strconv.FormatUint(to[i].PrimaryKey.KeyId, 16) + \" because it has no valid encryption keys\")\n\t\t}\n\n\t\tprimarySelfSignature, _ := to[i].PrimarySelfSignature()\n\t\tif primarySelfSignature == nil {\n\t\t\treturn nil, errors.InvalidArgumentError(\"entity without a self-signature\")\n\t\t}\n\n\t\tif !primarySelfSignature.SEIPDv2 {\n\t\t\taeadSupported = false\n\t\t}\n\n\t\tcandidateCiphers = intersectPreferences(candidateCiphers, primarySelfSignature.PreferredSymmetric)\n\t\tcandidateHashes = intersectPreferences(candidateHashes, primarySelfSignature.PreferredHash)\n\t\tcandidateCipherSuites = intersectCipherSuites(candidateCipherSuites, primarySelfSignature.PreferredCipherSuites)\n\t\tcandidateCompression = intersectPreferences(candidateCompression, primarySelfSignature.PreferredCompression)\n\t}\n\n\t// In the event that the intersection of supported algorithms is empty we use the ones\n\t// labelled as MUST that every implementation supports.\n\tif len(candidateCiphers) == 0 {\n\t\t// https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-9.3\n\t\tcandidateCiphers = []uint8{uint8(packet.CipherAES128)}\n\t}\n\tif len(candidateHashes) == 0 {\n\t\t// https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#hash-algos\n\t\tcandidateHashes = []uint8{hashToHashId(crypto.SHA256)}\n\t}\n\tif len(candidateCipherSuites) == 0 {\n\t\t// https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-9.6\n\t\tcandidateCipherSuites = [][2]uint8{{uint8(packet.CipherAES128), uint8(packet.AEADModeOCB)}}\n\t}\n\n\tcipher := packet.CipherFunction(candidateCiphers[0])\n\taeadCipherSuite := packet.CipherSuite{\n\t\tCipher: packet.CipherFunction(candidateCipherSuites[0][0]),\n\t\tMode:   packet.AEADMode(candidateCipherSuites[0][1]),\n\t}\n\n\t// If the cipher specified by config is a candidate, we'll use that.\n\tconfiguredCipher := config.Cipher()\n\tfor _, c := range candidateCiphers {\n\t\tcipherFunc := packet.CipherFunction(c)\n\t\tif cipherFunc == configuredCipher {\n\t\t\tcipher = cipherFunc\n\t\t\tbreak\n\t\t}\n\t}\n\n\tvar symKey []byte\n\tif aeadSupported {\n\t\tsymKey = make([]byte, aeadCipherSuite.Cipher.KeySize())\n\t} else {\n\t\tsymKey = make([]byte, cipher.KeySize())\n\t}\n\n\tif _, err := io.ReadFull(config.Random(), symKey); err != nil {\n\t\treturn nil, err\n\t}\n\n\tfor _, key := range encryptKeys {\n\t\tif err := packet.SerializeEncryptedKeyAEAD(keyWriter, key.PublicKey, cipher, aeadSupported, symKey, config); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tvar payload io.WriteCloser\n\tpayload, err = packet.SerializeSymmetricallyEncrypted(dataWriter, cipher, aeadSupported, aeadCipherSuite, symKey, config)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tpayload, err = handleCompression(payload, candidateCompression, config)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn writeAndSign(payload, candidateHashes, signed, hints, sigType, config)\n}\n\n// Sign signs a message. The resulting WriteCloser must be closed after the\n// contents of the file have been written.  hints contains optional information\n// that aids the recipients in processing the message.\n// If config is nil, sensible defaults will be used.\nfunc Sign(output io.Writer, signed *Entity, hints *FileHints, config *packet.Config) (input io.WriteCloser, err error) {\n\tif signed == nil {\n\t\treturn nil, errors.InvalidArgumentError(\"no signer provided\")\n\t}\n\n\t// These are the possible hash functions that we'll use for the signature.\n\tcandidateHashes := []uint8{\n\t\thashToHashId(crypto.SHA256),\n\t\thashToHashId(crypto.SHA384),\n\t\thashToHashId(crypto.SHA512),\n\t\thashToHashId(crypto.SHA3_256),\n\t\thashToHashId(crypto.SHA3_512),\n\t}\n\tdefaultHashes := candidateHashes[0:1]\n\tprimarySelfSignature, _ := signed.PrimarySelfSignature()\n\tif primarySelfSignature == nil {\n\t\treturn nil, errors.StructuralError(\"signed entity has no self-signature\")\n\t}\n\tpreferredHashes := primarySelfSignature.PreferredHash\n\tif len(preferredHashes) == 0 {\n\t\tpreferredHashes = defaultHashes\n\t}\n\tcandidateHashes = intersectPreferences(candidateHashes, preferredHashes)\n\tif len(candidateHashes) == 0 {\n\t\treturn nil, errors.StructuralError(\"cannot sign because signing key shares no common algorithms with candidate hashes\")\n\t}\n\n\treturn writeAndSign(noOpCloser{output}, candidateHashes, signed, hints, packet.SigTypeBinary, config)\n}\n\n// signatureWriter hashes the contents of a message while passing it along to\n// literalData. When closed, it closes literalData, writes a signature packet\n// to encryptedData and then also closes encryptedData.\ntype signatureWriter struct {\n\tencryptedData io.WriteCloser\n\tliteralData   io.WriteCloser\n\thashType      crypto.Hash\n\twrappedHash   hash.Hash\n\th             hash.Hash\n\tsalt          []byte // v6 only\n\tsigner        *packet.PrivateKey\n\tsigType       packet.SignatureType\n\tconfig        *packet.Config\n\tmetadata      *packet.LiteralData // V5 signatures protect document metadata\n}\n\nfunc (s signatureWriter) Write(data []byte) (int, error) {\n\ts.wrappedHash.Write(data)\n\tswitch s.sigType {\n\tcase packet.SigTypeBinary:\n\t\treturn s.literalData.Write(data)\n\tcase packet.SigTypeText:\n\t\tflag := 0\n\t\treturn writeCanonical(s.literalData, data, &flag)\n\t}\n\treturn 0, errors.UnsupportedError(\"unsupported signature type: \" + strconv.Itoa(int(s.sigType)))\n}\n\nfunc (s signatureWriter) Close() error {\n\tsig := createSignaturePacket(&s.signer.PublicKey, s.sigType, s.config)\n\tsig.Hash = s.hashType\n\tsig.Metadata = s.metadata\n\n\tif err := sig.SetSalt(s.salt); err != nil {\n\t\treturn err\n\t}\n\n\tif err := sig.Sign(s.h, s.signer, s.config); err != nil {\n\t\treturn err\n\t}\n\tif err := s.literalData.Close(); err != nil {\n\t\treturn err\n\t}\n\tif err := sig.Serialize(s.encryptedData); err != nil {\n\t\treturn err\n\t}\n\treturn s.encryptedData.Close()\n}\n\nfunc createSignaturePacket(signer *packet.PublicKey, sigType packet.SignatureType, config *packet.Config) *packet.Signature {\n\tsigLifetimeSecs := config.SigLifetime()\n\treturn &packet.Signature{\n\t\tVersion:           signer.Version,\n\t\tSigType:           sigType,\n\t\tPubKeyAlgo:        signer.PubKeyAlgo,\n\t\tHash:              config.Hash(),\n\t\tCreationTime:      config.Now(),\n\t\tIssuerKeyId:       &signer.KeyId,\n\t\tIssuerFingerprint: signer.Fingerprint,\n\t\tNotations:         config.Notations(),\n\t\tSigLifetimeSecs:   &sigLifetimeSecs,\n\t}\n}\n\n// noOpCloser is like an ioutil.NopCloser, but for an io.Writer.\n// TODO: we have two of these in OpenPGP packages alone. This probably needs\n// to be promoted somewhere more common.\ntype noOpCloser struct {\n\tw io.Writer\n}\n\nfunc (c noOpCloser) Write(data []byte) (n int, err error) {\n\treturn c.w.Write(data)\n}\n\nfunc (c noOpCloser) Close() error {\n\treturn nil\n}\n\nfunc handleCompression(compressed io.WriteCloser, candidateCompression []uint8, config *packet.Config) (data io.WriteCloser, err error) {\n\tdata = compressed\n\tconfAlgo := config.Compression()\n\tif confAlgo == packet.CompressionNone {\n\t\treturn\n\t}\n\n\t// Set algorithm labelled as MUST as fallback\n\t// https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-9.4\n\tfinalAlgo := packet.CompressionNone\n\t// if compression specified by config available we will use it\n\tfor _, c := range candidateCompression {\n\t\tif uint8(confAlgo) == c {\n\t\t\tfinalAlgo = confAlgo\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif finalAlgo != packet.CompressionNone {\n\t\tvar compConfig *packet.CompressionConfig\n\t\tif config != nil {\n\t\t\tcompConfig = config.CompressionConfig\n\t\t}\n\t\tdata, err = packet.SerializeCompressed(compressed, finalAlgo, compConfig)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\treturn data, nil\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/x25519/x25519.go",
    "content": "package x25519\n\nimport (\n\t\"crypto/sha256\"\n\t\"crypto/subtle\"\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/aes/keywrap\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\tx25519lib \"github.com/cloudflare/circl/dh/x25519\"\n\t\"golang.org/x/crypto/hkdf\"\n)\n\nconst (\n\thkdfInfo      = \"OpenPGP X25519\"\n\taes128KeySize = 16\n\t// The size of a public or private key in bytes.\n\tKeySize = x25519lib.Size\n)\n\ntype PublicKey struct {\n\t// Point represents the encoded elliptic curve point of the public key.\n\tPoint []byte\n}\n\ntype PrivateKey struct {\n\tPublicKey\n\t// Secret represents the secret of the private key.\n\tSecret []byte\n}\n\n// NewPrivateKey creates a new empty private key including the public key.\nfunc NewPrivateKey(key PublicKey) *PrivateKey {\n\treturn &PrivateKey{\n\t\tPublicKey: key,\n\t}\n}\n\n// Validate validates that the provided public key matches the private key.\nfunc Validate(pk *PrivateKey) (err error) {\n\tvar expectedPublicKey, privateKey x25519lib.Key\n\tsubtle.ConstantTimeCopy(1, privateKey[:], pk.Secret)\n\tx25519lib.KeyGen(&expectedPublicKey, &privateKey)\n\tif subtle.ConstantTimeCompare(expectedPublicKey[:], pk.PublicKey.Point) == 0 {\n\t\treturn errors.KeyInvalidError(\"x25519: invalid key\")\n\t}\n\treturn nil\n}\n\n// GenerateKey generates a new x25519 key pair.\nfunc GenerateKey(rand io.Reader) (*PrivateKey, error) {\n\tvar privateKey, publicKey x25519lib.Key\n\tprivateKeyOut := new(PrivateKey)\n\terr := generateKey(rand, &privateKey, &publicKey)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tprivateKeyOut.PublicKey.Point = publicKey[:]\n\tprivateKeyOut.Secret = privateKey[:]\n\treturn privateKeyOut, nil\n}\n\nfunc generateKey(rand io.Reader, privateKey *x25519lib.Key, publicKey *x25519lib.Key) error {\n\tmaxRounds := 10\n\tisZero := true\n\tfor round := 0; isZero; round++ {\n\t\tif round == maxRounds {\n\t\t\treturn errors.InvalidArgumentError(\"x25519: zero keys only, randomness source might be corrupt\")\n\t\t}\n\t\t_, err := io.ReadFull(rand, privateKey[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tisZero = constantTimeIsZero(privateKey[:])\n\t}\n\tx25519lib.KeyGen(publicKey, privateKey)\n\treturn nil\n}\n\n// Encrypt encrypts a sessionKey with x25519 according to\n// the OpenPGP crypto refresh specification section 5.1.6. The function assumes that the\n// sessionKey has the correct format and padding according to the specification.\nfunc Encrypt(rand io.Reader, publicKey *PublicKey, sessionKey []byte) (ephemeralPublicKey *PublicKey, encryptedSessionKey []byte, err error) {\n\tvar ephemeralPrivate, ephemeralPublic, staticPublic, shared x25519lib.Key\n\t// Check that the input static public key has 32 bytes\n\tif len(publicKey.Point) != KeySize {\n\t\terr = errors.KeyInvalidError(\"x25519: the public key has the wrong size\")\n\t\treturn\n\t}\n\tcopy(staticPublic[:], publicKey.Point)\n\t// Generate ephemeral keyPair\n\terr = generateKey(rand, &ephemeralPrivate, &ephemeralPublic)\n\tif err != nil {\n\t\treturn\n\t}\n\t// Compute shared key\n\tok := x25519lib.Shared(&shared, &ephemeralPrivate, &staticPublic)\n\tif !ok {\n\t\terr = errors.KeyInvalidError(\"x25519: the public key is a low order point\")\n\t\treturn\n\t}\n\t// Derive the encryption key from the shared secret\n\tencryptionKey := applyHKDF(ephemeralPublic[:], publicKey.Point[:], shared[:])\n\tephemeralPublicKey = &PublicKey{\n\t\tPoint: ephemeralPublic[:],\n\t}\n\t// Encrypt the sessionKey with aes key wrapping\n\tencryptedSessionKey, err = keywrap.Wrap(encryptionKey, sessionKey)\n\treturn\n}\n\n// Decrypt decrypts a session key stored in ciphertext with the provided x25519\n// private key and ephemeral public key.\nfunc Decrypt(privateKey *PrivateKey, ephemeralPublicKey *PublicKey, ciphertext []byte) (encodedSessionKey []byte, err error) {\n\tvar ephemeralPublic, staticPrivate, shared x25519lib.Key\n\t// Check that the input ephemeral public key has 32 bytes\n\tif len(ephemeralPublicKey.Point) != KeySize {\n\t\terr = errors.KeyInvalidError(\"x25519: the public key has the wrong size\")\n\t\treturn\n\t}\n\tcopy(ephemeralPublic[:], ephemeralPublicKey.Point)\n\tsubtle.ConstantTimeCopy(1, staticPrivate[:], privateKey.Secret)\n\t// Compute shared key\n\tok := x25519lib.Shared(&shared, &staticPrivate, &ephemeralPublic)\n\tif !ok {\n\t\terr = errors.KeyInvalidError(\"x25519: the ephemeral public key is a low order point\")\n\t\treturn\n\t}\n\t// Derive the encryption key from the shared secret\n\tencryptionKey := applyHKDF(ephemeralPublicKey.Point[:], privateKey.PublicKey.Point[:], shared[:])\n\t// Decrypt the session key with aes key wrapping\n\tencodedSessionKey, err = keywrap.Unwrap(encryptionKey, ciphertext)\n\treturn\n}\n\nfunc applyHKDF(ephemeralPublicKey []byte, publicKey []byte, sharedSecret []byte) []byte {\n\tinputKey := make([]byte, 3*KeySize)\n\t// ephemeral public key | recipient public key | shared secret\n\tsubtle.ConstantTimeCopy(1, inputKey[:KeySize], ephemeralPublicKey)\n\tsubtle.ConstantTimeCopy(1, inputKey[KeySize:2*KeySize], publicKey)\n\tsubtle.ConstantTimeCopy(1, inputKey[2*KeySize:], sharedSecret)\n\thkdfReader := hkdf.New(sha256.New, inputKey, []byte{}, []byte(hkdfInfo))\n\tencryptionKey := make([]byte, aes128KeySize)\n\t_, _ = io.ReadFull(hkdfReader, encryptionKey)\n\treturn encryptionKey\n}\n\nfunc constantTimeIsZero(bytes []byte) bool {\n\tisZero := byte(0)\n\tfor _, b := range bytes {\n\t\tisZero |= b\n\t}\n\treturn isZero == 0\n}\n\n// ENCODING/DECODING ciphertexts:\n\n// EncodeFieldsLength returns the length of the ciphertext encoding\n// given the encrypted session key.\nfunc EncodedFieldsLength(encryptedSessionKey []byte, v6 bool) int {\n\tlenCipherFunction := 0\n\tif !v6 {\n\t\tlenCipherFunction = 1\n\t}\n\treturn KeySize + 1 + len(encryptedSessionKey) + lenCipherFunction\n}\n\n// EncodeField encodes x25519 session key encryption fields as\n// ephemeral x25519 public key | follow byte length | cipherFunction (v3 only) | encryptedSessionKey\n// and writes it to writer.\nfunc EncodeFields(writer io.Writer, ephemeralPublicKey *PublicKey, encryptedSessionKey []byte, cipherFunction byte, v6 bool) (err error) {\n\tlenAlgorithm := 0\n\tif !v6 {\n\t\tlenAlgorithm = 1\n\t}\n\tif _, err = writer.Write(ephemeralPublicKey.Point); err != nil {\n\t\treturn err\n\t}\n\tif _, err = writer.Write([]byte{byte(len(encryptedSessionKey) + lenAlgorithm)}); err != nil {\n\t\treturn err\n\t}\n\tif !v6 {\n\t\tif _, err = writer.Write([]byte{cipherFunction}); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\t_, err = writer.Write(encryptedSessionKey)\n\treturn err\n}\n\n// DecodeField decodes a x25519 session key encryption as\n// ephemeral x25519 public key | follow byte length | cipherFunction (v3 only) | encryptedSessionKey.\nfunc DecodeFields(reader io.Reader, v6 bool) (ephemeralPublicKey *PublicKey, encryptedSessionKey []byte, cipherFunction byte, err error) {\n\tvar buf [1]byte\n\tephemeralPublicKey = &PublicKey{\n\t\tPoint: make([]byte, KeySize),\n\t}\n\t// 32 octets representing an ephemeral x25519 public key.\n\tif _, err = io.ReadFull(reader, ephemeralPublicKey.Point); err != nil {\n\t\treturn nil, nil, 0, err\n\t}\n\t// A one-octet size of the following fields.\n\tif _, err = io.ReadFull(reader, buf[:]); err != nil {\n\t\treturn nil, nil, 0, err\n\t}\n\tfollowingLen := buf[0]\n\t// The one-octet algorithm identifier, if it was passed (in the case of a v3 PKESK packet).\n\tif !v6 {\n\t\tif _, err = io.ReadFull(reader, buf[:]); err != nil {\n\t\t\treturn nil, nil, 0, err\n\t\t}\n\t\tcipherFunction = buf[0]\n\t\tfollowingLen -= 1\n\t}\n\t// The encrypted session key.\n\tencryptedSessionKey = make([]byte, followingLen)\n\tif _, err = io.ReadFull(reader, encryptedSessionKey); err != nil {\n\t\treturn nil, nil, 0, err\n\t}\n\treturn ephemeralPublicKey, encryptedSessionKey, cipherFunction, nil\n}\n"
  },
  {
    "path": "vendor/github.com/ProtonMail/go-crypto/openpgp/x448/x448.go",
    "content": "package x448\n\nimport (\n\t\"crypto/sha512\"\n\t\"crypto/subtle\"\n\t\"io\"\n\n\t\"github.com/ProtonMail/go-crypto/openpgp/aes/keywrap\"\n\t\"github.com/ProtonMail/go-crypto/openpgp/errors\"\n\tx448lib \"github.com/cloudflare/circl/dh/x448\"\n\t\"golang.org/x/crypto/hkdf\"\n)\n\nconst (\n\thkdfInfo      = \"OpenPGP X448\"\n\taes256KeySize = 32\n\t// The size of a public or private key in bytes.\n\tKeySize = x448lib.Size\n)\n\ntype PublicKey struct {\n\t// Point represents the encoded elliptic curve point of the public key.\n\tPoint []byte\n}\n\ntype PrivateKey struct {\n\tPublicKey\n\t// Secret represents the secret of the private key.\n\tSecret []byte\n}\n\n// NewPrivateKey creates a new empty private key including the public key.\nfunc NewPrivateKey(key PublicKey) *PrivateKey {\n\treturn &PrivateKey{\n\t\tPublicKey: key,\n\t}\n}\n\n// Validate validates that the provided public key matches\n// the private key.\nfunc Validate(pk *PrivateKey) (err error) {\n\tvar expectedPublicKey, privateKey x448lib.Key\n\tsubtle.ConstantTimeCopy(1, privateKey[:], pk.Secret)\n\tx448lib.KeyGen(&expectedPublicKey, &privateKey)\n\tif subtle.ConstantTimeCompare(expectedPublicKey[:], pk.PublicKey.Point) == 0 {\n\t\treturn errors.KeyInvalidError(\"x448: invalid key\")\n\t}\n\treturn nil\n}\n\n// GenerateKey generates a new x448 key pair.\nfunc GenerateKey(rand io.Reader) (*PrivateKey, error) {\n\tvar privateKey, publicKey x448lib.Key\n\tprivateKeyOut := new(PrivateKey)\n\terr := generateKey(rand, &privateKey, &publicKey)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tprivateKeyOut.PublicKey.Point = publicKey[:]\n\tprivateKeyOut.Secret = privateKey[:]\n\treturn privateKeyOut, nil\n}\n\nfunc generateKey(rand io.Reader, privateKey *x448lib.Key, publicKey *x448lib.Key) error {\n\tmaxRounds := 10\n\tisZero := true\n\tfor round := 0; isZero; round++ {\n\t\tif round == maxRounds {\n\t\t\treturn errors.InvalidArgumentError(\"x448: zero keys only, randomness source might be corrupt\")\n\t\t}\n\t\t_, err := io.ReadFull(rand, privateKey[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tisZero = constantTimeIsZero(privateKey[:])\n\t}\n\tx448lib.KeyGen(publicKey, privateKey)\n\treturn nil\n}\n\n// Encrypt encrypts a sessionKey with x448 according to\n// the OpenPGP crypto refresh specification section 5.1.7. The function assumes that the\n// sessionKey has the correct format and padding according to the specification.\nfunc Encrypt(rand io.Reader, publicKey *PublicKey, sessionKey []byte) (ephemeralPublicKey *PublicKey, encryptedSessionKey []byte, err error) {\n\tvar ephemeralPrivate, ephemeralPublic, staticPublic, shared x448lib.Key\n\t// Check that the input static public key has 56 bytes.\n\tif len(publicKey.Point) != KeySize {\n\t\terr = errors.KeyInvalidError(\"x448: the public key has the wrong size\")\n\t\treturn nil, nil, err\n\t}\n\tcopy(staticPublic[:], publicKey.Point)\n\t// Generate ephemeral keyPair.\n\tif err = generateKey(rand, &ephemeralPrivate, &ephemeralPublic); err != nil {\n\t\treturn nil, nil, err\n\t}\n\t// Compute shared key.\n\tok := x448lib.Shared(&shared, &ephemeralPrivate, &staticPublic)\n\tif !ok {\n\t\terr = errors.KeyInvalidError(\"x448: the public key is a low order point\")\n\t\treturn nil, nil, err\n\t}\n\t// Derive the encryption key from the shared secret.\n\tencryptionKey := applyHKDF(ephemeralPublic[:], publicKey.Point[:], shared[:])\n\tephemeralPublicKey = &PublicKey{\n\t\tPoint: ephemeralPublic[:],\n\t}\n\t// Encrypt the sessionKey with aes key wrapping.\n\tencryptedSessionKey, err = keywrap.Wrap(encryptionKey, sessionKey)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\treturn ephemeralPublicKey, encryptedSessionKey, nil\n}\n\n// Decrypt decrypts a session key stored in ciphertext with the provided x448\n// private key and ephemeral public key.\nfunc Decrypt(privateKey *PrivateKey, ephemeralPublicKey *PublicKey, ciphertext []byte) (encodedSessionKey []byte, err error) {\n\tvar ephemeralPublic, staticPrivate, shared x448lib.Key\n\t// Check that the input ephemeral public key has 56 bytes.\n\tif len(ephemeralPublicKey.Point) != KeySize {\n\t\terr = errors.KeyInvalidError(\"x448: the public key has the wrong size\")\n\t\treturn nil, err\n\t}\n\tcopy(ephemeralPublic[:], ephemeralPublicKey.Point)\n\tsubtle.ConstantTimeCopy(1, staticPrivate[:], privateKey.Secret)\n\t// Compute shared key.\n\tok := x448lib.Shared(&shared, &staticPrivate, &ephemeralPublic)\n\tif !ok {\n\t\terr = errors.KeyInvalidError(\"x448: the ephemeral public key is a low order point\")\n\t\treturn nil, err\n\t}\n\t// Derive the encryption key from the shared secret.\n\tencryptionKey := applyHKDF(ephemeralPublicKey.Point[:], privateKey.PublicKey.Point[:], shared[:])\n\t// Decrypt the session key with aes key wrapping.\n\tencodedSessionKey, err = keywrap.Unwrap(encryptionKey, ciphertext)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn encodedSessionKey, nil\n}\n\nfunc applyHKDF(ephemeralPublicKey []byte, publicKey []byte, sharedSecret []byte) []byte {\n\tinputKey := make([]byte, 3*KeySize)\n\t// ephemeral public key | recipient public key | shared secret.\n\tsubtle.ConstantTimeCopy(1, inputKey[:KeySize], ephemeralPublicKey)\n\tsubtle.ConstantTimeCopy(1, inputKey[KeySize:2*KeySize], publicKey)\n\tsubtle.ConstantTimeCopy(1, inputKey[2*KeySize:], sharedSecret)\n\thkdfReader := hkdf.New(sha512.New, inputKey, []byte{}, []byte(hkdfInfo))\n\tencryptionKey := make([]byte, aes256KeySize)\n\t_, _ = io.ReadFull(hkdfReader, encryptionKey)\n\treturn encryptionKey\n}\n\nfunc constantTimeIsZero(bytes []byte) bool {\n\tisZero := byte(0)\n\tfor _, b := range bytes {\n\t\tisZero |= b\n\t}\n\treturn isZero == 0\n}\n\n// ENCODING/DECODING ciphertexts:\n\n// EncodeFieldsLength returns the length of the ciphertext encoding\n// given the encrypted session key.\nfunc EncodedFieldsLength(encryptedSessionKey []byte, v6 bool) int {\n\tlenCipherFunction := 0\n\tif !v6 {\n\t\tlenCipherFunction = 1\n\t}\n\treturn KeySize + 1 + len(encryptedSessionKey) + lenCipherFunction\n}\n\n// EncodeField encodes x448 session key encryption fields as\n// ephemeral x448 public key | follow byte length | cipherFunction (v3 only) | encryptedSessionKey\n// and writes it to writer.\nfunc EncodeFields(writer io.Writer, ephemeralPublicKey *PublicKey, encryptedSessionKey []byte, cipherFunction byte, v6 bool) (err error) {\n\tlenAlgorithm := 0\n\tif !v6 {\n\t\tlenAlgorithm = 1\n\t}\n\tif _, err = writer.Write(ephemeralPublicKey.Point); err != nil {\n\t\treturn err\n\t}\n\tif _, err = writer.Write([]byte{byte(len(encryptedSessionKey) + lenAlgorithm)}); err != nil {\n\t\treturn err\n\t}\n\tif !v6 {\n\t\tif _, err = writer.Write([]byte{cipherFunction}); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif _, err = writer.Write(encryptedSessionKey); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// DecodeField decodes a x448 session key encryption as\n// ephemeral x448 public key | follow byte length | cipherFunction (v3 only) | encryptedSessionKey.\nfunc DecodeFields(reader io.Reader, v6 bool) (ephemeralPublicKey *PublicKey, encryptedSessionKey []byte, cipherFunction byte, err error) {\n\tvar buf [1]byte\n\tephemeralPublicKey = &PublicKey{\n\t\tPoint: make([]byte, KeySize),\n\t}\n\t// 56 octets representing an ephemeral x448 public key.\n\tif _, err = io.ReadFull(reader, ephemeralPublicKey.Point); err != nil {\n\t\treturn nil, nil, 0, err\n\t}\n\t// A one-octet size of the following fields.\n\tif _, err = io.ReadFull(reader, buf[:]); err != nil {\n\t\treturn nil, nil, 0, err\n\t}\n\tfollowingLen := buf[0]\n\t// The one-octet algorithm identifier, if it was passed (in the case of a v3 PKESK packet).\n\tif !v6 {\n\t\tif _, err = io.ReadFull(reader, buf[:]); err != nil {\n\t\t\treturn nil, nil, 0, err\n\t\t}\n\t\tcipherFunction = buf[0]\n\t\tfollowingLen -= 1\n\t}\n\t// The encrypted session key.\n\tencryptedSessionKey = make([]byte, followingLen)\n\tif _, err = io.ReadFull(reader, encryptedSessionKey); err != nil {\n\t\treturn nil, nil, 0, err\n\t}\n\treturn ephemeralPublicKey, encryptedSessionKey, cipherFunction, nil\n}\n"
  },
  {
    "path": "vendor/github.com/agext/levenshtein/.gitignore",
    "content": "# Ignore docs files\n_gh_pages\n_site\n\n# Ignore temporary files\nREADME.html\ncoverage.out\n.tmp\n\n# Numerous always-ignore extensions\n*.diff\n*.err\n*.log\n*.orig\n*.rej\n*.swo\n*.swp\n*.vi\n*.zip\n*~\n\n# OS or Editor folders\n._*\n.cache\n.DS_Store\n.idea\n.project\n.settings\n.tmproj\n*.esproj\n*.sublime-project\n*.sublime-workspace\nnbproject\nThumbs.db\n\n# Komodo\n.komodotools\n*.komodoproject\n\n# SCSS-Lint\nscss-lint-report.xml\n\n# grunt-contrib-sass cache\n.sass-cache\n\n# Jekyll metadata\ndocs/.jekyll-metadata\n\n# Folders to ignore\n.build\n.test\nbower_components\nnode_modules\n"
  },
  {
    "path": "vendor/github.com/agext/levenshtein/.travis.yml",
    "content": "language: go\nsudo: false\nmatrix:\n  fast_finish: true\n  include:\n    - go: 1.14.x\n      env: TEST_METHOD=goveralls\n    - go: 1.13.x\n    - go: 1.12.x\n    - go: 1.11.x\n    - go: 1.10.x\n    - go: tip\n    - go: 1.9.x\n    - go: 1.8.x\n    - go: 1.7.x\n    - go: 1.6.x\n    - go: 1.5.x\n  allow_failures:\n    - go: tip\n    - go: 1.11.x\n    - go: 1.10.x\n    - go: 1.9.x\n    - go: 1.8.x\n    - go: 1.7.x\n    - go: 1.6.x\n    - go: 1.5.x\nscript: ./test.sh $TEST_METHOD\nnotifications:\n  email:\n    on_success: never\n"
  },
  {
    "path": "vendor/github.com/agext/levenshtein/DCO",
    "content": "Developer Certificate of Origin\nVersion 1.1\n\nCopyright (C) 2004, 2006 The Linux Foundation and its contributors.\n660 York Street, Suite 102,\nSan Francisco, CA 94110 USA\n\nEveryone is permitted to copy and distribute verbatim copies of this\nlicense document, but changing it is not allowed.\n\n\nDeveloper's Certificate of Origin 1.1\n\nBy making a contribution to this project, I certify that:\n\n(a) The contribution was created in whole or in part by me and I\n    have the right to submit it under the open source license\n    indicated in the file; or\n\n(b) The contribution is based upon previous work that, to the best\n    of my knowledge, is covered under an appropriate open source\n    license and I have the right under that license to submit that\n    work with modifications, whether created in whole or in part\n    by me, under the same open source license (unless I am\n    permitted to submit under a different license), as indicated\n    in the file; or\n\n(c) The contribution was provided directly to me by some other\n    person who certified (a), (b) or (c) and I have not modified\n    it.\n\n(d) I understand and agree that this project and the contribution\n    are public and that a record of the contribution (including all\n    personal information I submit with it, including my sign-off) is\n    maintained indefinitely and may be redistributed consistent with\n    this project or the open source license(s) involved.\n"
  },
  {
    "path": "vendor/github.com/agext/levenshtein/LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/agext/levenshtein/MAINTAINERS",
    "content": "Alex Bucataru <alex@alrux.com> (@AlexBucataru)\n"
  },
  {
    "path": "vendor/github.com/agext/levenshtein/NOTICE",
    "content": "Alrux Go EXTensions (AGExt) - package levenshtein\nCopyright 2016 ALRUX Inc.\n\nThis product includes software developed at ALRUX Inc.\n(http://www.alrux.com/).\n"
  },
  {
    "path": "vendor/github.com/agext/levenshtein/README.md",
    "content": "# A Go package for calculating the Levenshtein distance between two strings\n\n[![Release](https://img.shields.io/github/release/agext/levenshtein.svg?style=flat)](https://github.com/agext/levenshtein/releases/latest)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/agext/levenshtein) \n[![Build Status](https://travis-ci.org/agext/levenshtein.svg?branch=master&style=flat)](https://travis-ci.org/agext/levenshtein)\n[![Coverage Status](https://coveralls.io/repos/github/agext/levenshtein/badge.svg?style=flat)](https://coveralls.io/github/agext/levenshtein)\n[![Go Report Card](https://goreportcard.com/badge/github.com/agext/levenshtein?style=flat)](https://goreportcard.com/report/github.com/agext/levenshtein)\n\n\nThis package implements distance and similarity metrics for strings, based on the Levenshtein measure, in [Go](http://golang.org).\n\n## Project Status\n\nv1.2.3 Stable: Guaranteed no breaking changes to the API in future v1.x releases. Probably safe to use in production, though provided on \"AS IS\" basis.\n\nThis package is being actively maintained. If you encounter any problems or have any suggestions for improvement, please [open an issue](https://github.com/agext/levenshtein/issues). Pull requests are welcome.\n\n## Overview\n\nThe Levenshtein `Distance` between two strings is the minimum total cost of edits that would convert the first string into the second. The allowed edit operations are insertions, deletions, and substitutions, all at character (one UTF-8 code point) level. Each operation has a default cost of 1, but each can be assigned its own cost equal to or greater than 0.\n\nA `Distance` of 0 means the two strings are identical, and the higher the value the more different the strings. Since in practice we are interested in finding if the two strings are \"close enough\", it often does not make sense to continue the calculation once the result is mathematically guaranteed to exceed a desired threshold. Providing this value to the `Distance` function allows it to take a shortcut and return a lower bound instead of an exact cost when the threshold is exceeded.\n\nThe `Similarity` function calculates the distance, then converts it into a normalized metric within the range 0..1, with 1 meaning the strings are identical, and 0 that they have nothing in common. A minimum similarity threshold can be provided to speed up the calculation of the metric for strings that are far too dissimilar for the purpose at hand. All values under this threshold are rounded down to 0.\n\nThe `Match` function provides a similarity metric, with the same range and meaning as `Similarity`, but with a bonus for string pairs that share a common prefix and have a similarity above a \"bonus threshold\". It uses the same method as proposed by Winkler for the Jaro distance, and the reasoning behind it is that these string pairs are very likely spelling variations or errors, and they are more closely linked than the edit distance alone would suggest.\n\nThe underlying `Calculate` function is also exported, to allow the building of other derivative metrics, if needed.\n\n## Installation\n\n```\ngo get github.com/agext/levenshtein\n```\n\n## License\n\nPackage levenshtein is released under the Apache 2.0 license. See the [LICENSE](LICENSE) file for details.\n"
  },
  {
    "path": "vendor/github.com/agext/levenshtein/levenshtein.go",
    "content": "// Copyright 2016 ALRUX Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//    http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/*\nPackage levenshtein implements distance and similarity metrics for strings, based on the Levenshtein measure.\n\nThe Levenshtein `Distance` between two strings is the minimum total cost of edits that would convert the first string into the second. The allowed edit operations are insertions, deletions, and substitutions, all at character (one UTF-8 code point) level. Each operation has a default cost of 1, but each can be assigned its own cost equal to or greater than 0.\n\nA `Distance` of 0 means the two strings are identical, and the higher the value the more different the strings. Since in practice we are interested in finding if the two strings are \"close enough\", it often does not make sense to continue the calculation once the result is mathematically guaranteed to exceed a desired threshold. Providing this value to the `Distance` function allows it to take a shortcut and return a lower bound instead of an exact cost when the threshold is exceeded.\n\nThe `Similarity` function calculates the distance, then converts it into a normalized metric within the range 0..1, with 1 meaning the strings are identical, and 0 that they have nothing in common. A minimum similarity threshold can be provided to speed up the calculation of the metric for strings that are far too dissimilar for the purpose at hand. All values under this threshold are rounded down to 0.\n\nThe `Match` function provides a similarity metric, with the same range and meaning as `Similarity`, but with a bonus for string pairs that share a common prefix and have a similarity above a \"bonus threshold\". It uses the same method as proposed by Winkler for the Jaro distance, and the reasoning behind it is that these string pairs are very likely spelling variations or errors, and they are more closely linked than the edit distance alone would suggest.\n\nThe underlying `Calculate` function is also exported, to allow the building of other derivative metrics, if needed.\n*/\npackage levenshtein\n\n// Calculate determines the Levenshtein distance between two strings, using\n// the given costs for each edit operation. It returns the distance along with\n// the lengths of the longest common prefix and suffix.\n//\n// If maxCost is non-zero, the calculation stops as soon as the distance is determined\n// to be greater than maxCost. Therefore, any return value higher than maxCost is a\n// lower bound for the actual distance.\nfunc Calculate(str1, str2 []rune, maxCost, insCost, subCost, delCost int) (dist, prefixLen, suffixLen int) {\n\tl1, l2 := len(str1), len(str2)\n\t// trim common prefix, if any, as it doesn't affect the distance\n\tfor ; prefixLen < l1 && prefixLen < l2; prefixLen++ {\n\t\tif str1[prefixLen] != str2[prefixLen] {\n\t\t\tbreak\n\t\t}\n\t}\n\tstr1, str2 = str1[prefixLen:], str2[prefixLen:]\n\tl1 -= prefixLen\n\tl2 -= prefixLen\n\t// trim common suffix, if any, as it doesn't affect the distance\n\tfor 0 < l1 && 0 < l2 {\n\t\tif str1[l1-1] != str2[l2-1] {\n\t\t\tstr1, str2 = str1[:l1], str2[:l2]\n\t\t\tbreak\n\t\t}\n\t\tl1--\n\t\tl2--\n\t\tsuffixLen++\n\t}\n\t// if the first string is empty, the distance is the length of the second string times the cost of insertion\n\tif l1 == 0 {\n\t\tdist = l2 * insCost\n\t\treturn\n\t}\n\t// if the second string is empty, the distance is the length of the first string times the cost of deletion\n\tif l2 == 0 {\n\t\tdist = l1 * delCost\n\t\treturn\n\t}\n\n\t// variables used in inner \"for\" loops\n\tvar y, dy, c, l int\n\n\t// if maxCost is greater than or equal to the maximum possible distance, it's equivalent to 'unlimited'\n\tif maxCost > 0 {\n\t\tif subCost < delCost+insCost {\n\t\t\tif maxCost >= l1*subCost+(l2-l1)*insCost {\n\t\t\t\tmaxCost = 0\n\t\t\t}\n\t\t} else {\n\t\t\tif maxCost >= l1*delCost+l2*insCost {\n\t\t\t\tmaxCost = 0\n\t\t\t}\n\t\t}\n\t}\n\n\tif maxCost > 0 {\n\t\t// prefer the longer string first, to minimize time;\n\t\t// a swap also transposes the meanings of insertion and deletion.\n\t\tif l1 < l2 {\n\t\t\tstr1, str2, l1, l2, insCost, delCost = str2, str1, l2, l1, delCost, insCost\n\t\t}\n\n\t\t// the length differential times cost of deletion is a lower bound for the cost;\n\t\t// if it is higher than the maxCost, there is no point going into the main calculation.\n\t\tif dist = (l1 - l2) * delCost; dist > maxCost {\n\t\t\treturn\n\t\t}\n\n\t\td := make([]int, l1+1)\n\n\t\t// offset and length of d in the current row\n\t\tdoff, dlen := 0, 1\n\t\tfor y, dy = 1, delCost; y <= l1 && dy <= maxCost; dlen++ {\n\t\t\td[y] = dy\n\t\t\ty++\n\t\t\tdy = y * delCost\n\t\t}\n\t\t// fmt.Printf(\"%q -> %q: init doff=%d dlen=%d d[%d:%d]=%v\\n\", str1, str2, doff, dlen, doff, doff+dlen, d[doff:doff+dlen])\n\n\t\tfor x := 0; x < l2; x++ {\n\t\t\tdy, d[doff] = d[doff], d[doff]+insCost\n\t\t\tfor doff < l1 && d[doff] > maxCost && dlen > 0 {\n\t\t\t\tif str1[doff] != str2[x] {\n\t\t\t\t\tdy += subCost\n\t\t\t\t}\n\t\t\t\tdoff++\n\t\t\t\tdlen--\n\t\t\t\tif c = d[doff] + insCost; c < dy {\n\t\t\t\t\tdy = c\n\t\t\t\t}\n\t\t\t\tdy, d[doff] = d[doff], dy\n\t\t\t}\n\t\t\tfor y, l = doff, doff+dlen-1; y < l; dy, d[y] = d[y], dy {\n\t\t\t\tif str1[y] != str2[x] {\n\t\t\t\t\tdy += subCost\n\t\t\t\t}\n\t\t\t\tif c = d[y] + delCost; c < dy {\n\t\t\t\t\tdy = c\n\t\t\t\t}\n\t\t\t\ty++\n\t\t\t\tif c = d[y] + insCost; c < dy {\n\t\t\t\t\tdy = c\n\t\t\t\t}\n\t\t\t}\n\t\t\tif y < l1 {\n\t\t\t\tif str1[y] != str2[x] {\n\t\t\t\t\tdy += subCost\n\t\t\t\t}\n\t\t\t\tif c = d[y] + delCost; c < dy {\n\t\t\t\t\tdy = c\n\t\t\t\t}\n\t\t\t\tfor ; dy <= maxCost && y < l1; dy, d[y] = dy+delCost, dy {\n\t\t\t\t\ty++\n\t\t\t\t\tdlen++\n\t\t\t\t}\n\t\t\t}\n\t\t\t// fmt.Printf(\"%q -> %q: x=%d doff=%d dlen=%d d[%d:%d]=%v\\n\", str1, str2, x, doff, dlen, doff, doff+dlen, d[doff:doff+dlen])\n\t\t\tif dlen == 0 {\n\t\t\t\tdist = maxCost + 1\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tif doff+dlen-1 < l1 {\n\t\t\tdist = maxCost + 1\n\t\t\treturn\n\t\t}\n\t\tdist = d[l1]\n\t} else {\n\t\t// ToDo: This is O(l1*l2) time and O(min(l1,l2)) space; investigate if it is\n\t\t// worth to implement diagonal approach - O(l1*(1+dist)) time, up to O(l1*l2) space\n\t\t// http://www.csse.monash.edu.au/~lloyd/tildeStrings/Alignment/92.IPL.html\n\n\t\t// prefer the shorter string first, to minimize space; time is O(l1*l2) anyway;\n\t\t// a swap also transposes the meanings of insertion and deletion.\n\t\tif l1 > l2 {\n\t\t\tstr1, str2, l1, l2, insCost, delCost = str2, str1, l2, l1, delCost, insCost\n\t\t}\n\t\td := make([]int, l1+1)\n\n\t\tfor y = 1; y <= l1; y++ {\n\t\t\td[y] = y * delCost\n\t\t}\n\t\tfor x := 0; x < l2; x++ {\n\t\t\tdy, d[0] = d[0], d[0]+insCost\n\t\t\tfor y = 0; y < l1; dy, d[y] = d[y], dy {\n\t\t\t\tif str1[y] != str2[x] {\n\t\t\t\t\tdy += subCost\n\t\t\t\t}\n\t\t\t\tif c = d[y] + delCost; c < dy {\n\t\t\t\t\tdy = c\n\t\t\t\t}\n\t\t\t\ty++\n\t\t\t\tif c = d[y] + insCost; c < dy {\n\t\t\t\t\tdy = c\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdist = d[l1]\n\t}\n\n\treturn\n}\n\n// Distance returns the Levenshtein distance between str1 and str2, using the\n// default or provided cost values. Pass nil for the third argument to use the\n// default cost of 1 for all three operations, with no maximum.\nfunc Distance(str1, str2 string, p *Params) int {\n\tif p == nil {\n\t\tp = defaultParams\n\t}\n\tdist, _, _ := Calculate([]rune(str1), []rune(str2), p.maxCost, p.insCost, p.subCost, p.delCost)\n\treturn dist\n}\n\n// Similarity returns a score in the range of 0..1 for how similar the two strings are.\n// A score of 1 means the strings are identical, and 0 means they have nothing in common.\n//\n// A nil third argument uses the default cost of 1 for all three operations.\n//\n// If a non-zero MinScore value is provided in the parameters, scores lower than it\n// will be returned as 0.\nfunc Similarity(str1, str2 string, p *Params) float64 {\n\treturn Match(str1, str2, p.Clone().BonusThreshold(1.1)) // guaranteed no bonus\n}\n\n// Match returns a similarity score adjusted by the same method as proposed by Winkler for\n// the Jaro distance - giving a bonus to string pairs that share a common prefix, only if their\n// similarity score is already over a threshold.\n//\n// The score is in the range of 0..1, with 1 meaning the strings are identical,\n// and 0 meaning they have nothing in common.\n//\n// A nil third argument uses the default cost of 1 for all three operations, maximum length of\n// common prefix to consider for bonus of 4, scaling factor of 0.1, and bonus threshold of 0.7.\n//\n// If a non-zero MinScore value is provided in the parameters, scores lower than it\n// will be returned as 0.\nfunc Match(str1, str2 string, p *Params) float64 {\n\ts1, s2 := []rune(str1), []rune(str2)\n\tl1, l2 := len(s1), len(s2)\n\t// two empty strings are identical; shortcut also avoids divByZero issues later on.\n\tif l1 == 0 && l2 == 0 {\n\t\treturn 1\n\t}\n\n\tif p == nil {\n\t\tp = defaultParams\n\t}\n\n\t// a min over 1 can never be satisfied, so the score is 0.\n\tif p.minScore > 1 {\n\t\treturn 0\n\t}\n\n\tinsCost, delCost, maxDist, max := p.insCost, p.delCost, 0, 0\n\tif l1 > l2 {\n\t\tl1, l2, insCost, delCost = l2, l1, delCost, insCost\n\t}\n\n\tif p.subCost < delCost+insCost {\n\t\tmaxDist = l1*p.subCost + (l2-l1)*insCost\n\t} else {\n\t\tmaxDist = l1*delCost + l2*insCost\n\t}\n\n\t// a zero min is always satisfied, so no need to set a max cost.\n\tif p.minScore > 0 {\n\t\t// if p.minScore is lower than p.bonusThreshold, we can use a simplified formula\n\t\t// for the max cost, because a sim score below min cannot receive a bonus.\n\t\tif p.minScore < p.bonusThreshold {\n\t\t\t// round down the max - a cost equal to a rounded up max would already be under min.\n\t\t\tmax = int((1 - p.minScore) * float64(maxDist))\n\t\t} else {\n\t\t\t// p.minScore <= sim + p.bonusPrefix*p.bonusScale*(1-sim)\n\t\t\t// p.minScore <= (1-dist/maxDist) + p.bonusPrefix*p.bonusScale*(1-(1-dist/maxDist))\n\t\t\t// p.minScore <= 1 - dist/maxDist + p.bonusPrefix*p.bonusScale*dist/maxDist\n\t\t\t// 1 - p.minScore >= dist/maxDist - p.bonusPrefix*p.bonusScale*dist/maxDist\n\t\t\t// (1-p.minScore)*maxDist/(1-p.bonusPrefix*p.bonusScale) >= dist\n\t\t\tmax = int((1 - p.minScore) * float64(maxDist) / (1 - float64(p.bonusPrefix)*p.bonusScale))\n\t\t}\n\t}\n\n\tdist, pl, _ := Calculate(s1, s2, max, p.insCost, p.subCost, p.delCost)\n\tif max > 0 && dist > max {\n\t\treturn 0\n\t}\n\tsim := 1 - float64(dist)/float64(maxDist)\n\n\tif sim >= p.bonusThreshold && sim < 1 && p.bonusPrefix > 0 && p.bonusScale > 0 {\n\t\tif pl > p.bonusPrefix {\n\t\t\tpl = p.bonusPrefix\n\t\t}\n\t\tsim += float64(pl) * p.bonusScale * (1 - sim)\n\t}\n\n\tif sim < p.minScore {\n\t\treturn 0\n\t}\n\n\treturn sim\n}\n"
  },
  {
    "path": "vendor/github.com/agext/levenshtein/params.go",
    "content": "// Copyright 2016 ALRUX Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//    http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\npackage levenshtein\n\n// Params represents a set of parameter values for the various formulas involved\n// in the calculation of the Levenshtein string metrics.\ntype Params struct {\n\tinsCost        int\n\tsubCost        int\n\tdelCost        int\n\tmaxCost        int\n\tminScore       float64\n\tbonusPrefix    int\n\tbonusScale     float64\n\tbonusThreshold float64\n}\n\nvar (\n\tdefaultParams = NewParams()\n)\n\n// NewParams creates a new set of parameters and initializes it with the default values.\nfunc NewParams() *Params {\n\treturn &Params{\n\t\tinsCost:        1,\n\t\tsubCost:        1,\n\t\tdelCost:        1,\n\t\tmaxCost:        0,\n\t\tminScore:       0,\n\t\tbonusPrefix:    4,\n\t\tbonusScale:     .1,\n\t\tbonusThreshold: .7,\n\t}\n}\n\n// Clone returns a pointer to a copy of the receiver parameter set, or of a new\n// default parameter set if the receiver is nil.\nfunc (p *Params) Clone() *Params {\n\tif p == nil {\n\t\treturn NewParams()\n\t}\n\treturn &Params{\n\t\tinsCost:        p.insCost,\n\t\tsubCost:        p.subCost,\n\t\tdelCost:        p.delCost,\n\t\tmaxCost:        p.maxCost,\n\t\tminScore:       p.minScore,\n\t\tbonusPrefix:    p.bonusPrefix,\n\t\tbonusScale:     p.bonusScale,\n\t\tbonusThreshold: p.bonusThreshold,\n\t}\n}\n\n// InsCost overrides the default value of 1 for the cost of insertion.\n// The new value must be zero or positive.\nfunc (p *Params) InsCost(v int) *Params {\n\tif v >= 0 {\n\t\tp.insCost = v\n\t}\n\treturn p\n}\n\n// SubCost overrides the default value of 1 for the cost of substitution.\n// The new value must be zero or positive.\nfunc (p *Params) SubCost(v int) *Params {\n\tif v >= 0 {\n\t\tp.subCost = v\n\t}\n\treturn p\n}\n\n// DelCost overrides the default value of 1 for the cost of deletion.\n// The new value must be zero or positive.\nfunc (p *Params) DelCost(v int) *Params {\n\tif v >= 0 {\n\t\tp.delCost = v\n\t}\n\treturn p\n}\n\n// MaxCost overrides the default value of 0 (meaning unlimited) for the maximum cost.\n// The calculation of Distance() stops when the result is guaranteed to exceed\n// this maximum, returning a lower-bound rather than exact value.\n// The new value must be zero or positive.\nfunc (p *Params) MaxCost(v int) *Params {\n\tif v >= 0 {\n\t\tp.maxCost = v\n\t}\n\treturn p\n}\n\n// MinScore overrides the default value of 0 for the minimum similarity score.\n// Scores below this threshold are returned as 0 by Similarity() and Match().\n// The new value must be zero or positive. Note that a minimum greater than 1\n// can never be satisfied, resulting in a score of 0 for any pair of strings.\nfunc (p *Params) MinScore(v float64) *Params {\n\tif v >= 0 {\n\t\tp.minScore = v\n\t}\n\treturn p\n}\n\n// BonusPrefix overrides the default value for the maximum length of\n// common prefix to be considered for bonus by Match().\n// The new value must be zero or positive.\nfunc (p *Params) BonusPrefix(v int) *Params {\n\tif v >= 0 {\n\t\tp.bonusPrefix = v\n\t}\n\treturn p\n}\n\n// BonusScale overrides the default value for the scaling factor used by Match()\n// in calculating the bonus.\n// The new value must be zero or positive. To guarantee that the similarity score\n// remains in the interval 0..1, this scaling factor is not allowed to exceed\n// 1 / BonusPrefix.\nfunc (p *Params) BonusScale(v float64) *Params {\n\tif v >= 0 {\n\t\tp.bonusScale = v\n\t}\n\n\t// the bonus cannot exceed (1-sim), or the score may become greater than 1.\n\tif float64(p.bonusPrefix)*p.bonusScale > 1 {\n\t\tp.bonusScale = 1 / float64(p.bonusPrefix)\n\t}\n\n\treturn p\n}\n\n// BonusThreshold overrides the default value for the minimum similarity score\n// for which Match() can assign a bonus.\n// The new value must be zero or positive. Note that a threshold greater than 1\n// effectively makes Match() become the equivalent of Similarity().\nfunc (p *Params) BonusThreshold(v float64) *Params {\n\tif v >= 0 {\n\t\tp.bonusThreshold = v\n\t}\n\treturn p\n}\n"
  },
  {
    "path": "vendor/github.com/agext/levenshtein/test.sh",
    "content": "set -ev\n\nif [[ \"$1\" == \"goveralls\" ]]; then\n\techo \"Testing with goveralls...\"\n\tgo get github.com/mattn/goveralls\n\t$HOME/gopath/bin/goveralls -service=travis-ci\nelse\n\techo \"Testing with go test...\"\n\tgo test -v ./...\nfi\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/NOTICE.txt",
    "content": "AWS SDK for Go\nCopyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.\nCopyright 2014-2015 Stripe, Inc.\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/accountid_endpoint_mode.go",
    "content": "package aws\n\n// AccountIDEndpointMode controls how a resolved AWS account ID is handled for endpoint routing.\ntype AccountIDEndpointMode string\n\nconst (\n\t// AccountIDEndpointModeUnset indicates the AWS account ID will not be used for endpoint routing\n\tAccountIDEndpointModeUnset AccountIDEndpointMode = \"\"\n\n\t// AccountIDEndpointModePreferred indicates the AWS account ID will be used for endpoint routing if present\n\tAccountIDEndpointModePreferred = \"preferred\"\n\n\t// AccountIDEndpointModeRequired indicates an error will be returned if the AWS account ID is not resolved from identity\n\tAccountIDEndpointModeRequired = \"required\"\n\n\t// AccountIDEndpointModeDisabled indicates the AWS account ID will be ignored during endpoint routing\n\tAccountIDEndpointModeDisabled = \"disabled\"\n)\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/arn/arn.go",
    "content": "// Package arn provides a parser for interacting with Amazon Resource Names.\npackage arn\n\nimport (\n\t\"errors\"\n\t\"strings\"\n)\n\nconst (\n\tarnDelimiter = \":\"\n\tarnSections  = 6\n\tarnPrefix    = \"arn:\"\n\n\t// zero-indexed\n\tsectionPartition = 1\n\tsectionService   = 2\n\tsectionRegion    = 3\n\tsectionAccountID = 4\n\tsectionResource  = 5\n\n\t// errors\n\tinvalidPrefix   = \"arn: invalid prefix\"\n\tinvalidSections = \"arn: not enough sections\"\n)\n\n// ARN captures the individual fields of an Amazon Resource Name.\n// See http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html for more information.\ntype ARN struct {\n\t// The partition that the resource is in. For standard AWS regions, the partition is \"aws\". If you have resources in\n\t// other partitions, the partition is \"aws-partitionname\". For example, the partition for resources in the China\n\t// (Beijing) region is \"aws-cn\".\n\tPartition string\n\n\t// The service namespace that identifies the AWS product (for example, Amazon S3, IAM, or Amazon RDS). For a list of\n\t// namespaces, see\n\t// http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#genref-aws-service-namespaces.\n\tService string\n\n\t// The region the resource resides in. Note that the ARNs for some resources do not require a region, so this\n\t// component might be omitted.\n\tRegion string\n\n\t// The ID of the AWS account that owns the resource, without the hyphens. For example, 123456789012. Note that the\n\t// ARNs for some resources don't require an account number, so this component might be omitted.\n\tAccountID string\n\n\t// The content of this part of the ARN varies by service. It often includes an indicator of the type of resource —\n\t// for example, an IAM user or Amazon RDS database - followed by a slash (/) or a colon (:), followed by the\n\t// resource name itself. Some services allows paths for resource names, as described in\n\t// http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arns-paths.\n\tResource string\n}\n\n// Parse parses an ARN into its constituent parts.\n//\n// Some example ARNs:\n// arn:aws:elasticbeanstalk:us-east-1:123456789012:environment/My App/MyEnvironment\n// arn:aws:iam::123456789012:user/David\n// arn:aws:rds:eu-west-1:123456789012:db:mysql-db\n// arn:aws:s3:::my_corporate_bucket/exampleobject.png\nfunc Parse(arn string) (ARN, error) {\n\tif !strings.HasPrefix(arn, arnPrefix) {\n\t\treturn ARN{}, errors.New(invalidPrefix)\n\t}\n\tsections := strings.SplitN(arn, arnDelimiter, arnSections)\n\tif len(sections) != arnSections {\n\t\treturn ARN{}, errors.New(invalidSections)\n\t}\n\treturn ARN{\n\t\tPartition: sections[sectionPartition],\n\t\tService:   sections[sectionService],\n\t\tRegion:    sections[sectionRegion],\n\t\tAccountID: sections[sectionAccountID],\n\t\tResource:  sections[sectionResource],\n\t}, nil\n}\n\n// IsARN returns whether the given string is an arn\n// by looking for whether the string starts with arn:\nfunc IsARN(arn string) bool {\n\treturn strings.HasPrefix(arn, arnPrefix) && strings.Count(arn, \":\") >= arnSections-1\n}\n\n// String returns the canonical representation of the ARN\nfunc (arn ARN) String() string {\n\treturn arnPrefix +\n\t\tarn.Partition + arnDelimiter +\n\t\tarn.Service + arnDelimiter +\n\t\tarn.Region + arnDelimiter +\n\t\tarn.AccountID + arnDelimiter +\n\t\tarn.Resource\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/checksum.go",
    "content": "package aws\n\n// RequestChecksumCalculation controls request checksum calculation workflow\ntype RequestChecksumCalculation int\n\nconst (\n\t// RequestChecksumCalculationUnset is the unset value for RequestChecksumCalculation\n\tRequestChecksumCalculationUnset RequestChecksumCalculation = iota\n\n\t// RequestChecksumCalculationWhenSupported indicates request checksum will be calculated\n\t// if the operation supports input checksums\n\tRequestChecksumCalculationWhenSupported\n\n\t// RequestChecksumCalculationWhenRequired indicates request checksum will be calculated\n\t// if required by the operation or if user elects to set a checksum algorithm in request\n\tRequestChecksumCalculationWhenRequired\n)\n\n// ResponseChecksumValidation controls response checksum validation workflow\ntype ResponseChecksumValidation int\n\nconst (\n\t// ResponseChecksumValidationUnset is the unset value for ResponseChecksumValidation\n\tResponseChecksumValidationUnset ResponseChecksumValidation = iota\n\n\t// ResponseChecksumValidationWhenSupported indicates response checksum will be validated\n\t// if the operation supports output checksums\n\tResponseChecksumValidationWhenSupported\n\n\t// ResponseChecksumValidationWhenRequired indicates response checksum will only\n\t// be validated if the operation requires output checksum validation\n\tResponseChecksumValidationWhenRequired\n)\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/config.go",
    "content": "package aws\n\nimport (\n\t\"net/http\"\n\n\tsmithybearer \"github.com/aws/smithy-go/auth/bearer\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\n// HTTPClient provides the interface to provide custom HTTPClients. Generally\n// *http.Client is sufficient for most use cases. The HTTPClient should not\n// follow 301 or 302 redirects.\ntype HTTPClient interface {\n\tDo(*http.Request) (*http.Response, error)\n}\n\n// A Config provides service configuration for service clients.\ntype Config struct {\n\t// The region to send requests to. This parameter is required and must\n\t// be configured globally or on a per-client basis unless otherwise\n\t// noted. A full list of regions is found in the \"Regions and Endpoints\"\n\t// document.\n\t//\n\t// See http://docs.aws.amazon.com/general/latest/gr/rande.html for\n\t// information on AWS regions.\n\tRegion string\n\n\t// The credentials object to use when signing requests.\n\t// Use the LoadDefaultConfig to load configuration from all the SDK's supported\n\t// sources, and resolve credentials using the SDK's default credential chain.\n\tCredentials CredentialsProvider\n\n\t// The Bearer Authentication token provider to use for authenticating API\n\t// operation calls with a Bearer Authentication token. The API clients and\n\t// operation must support Bearer Authentication scheme in order for the\n\t// token provider to be used. API clients created with NewFromConfig will\n\t// automatically be configured with this option, if the API client support\n\t// Bearer Authentication.\n\t//\n\t// The SDK's config.LoadDefaultConfig can automatically populate this\n\t// option for external configuration options such as SSO session.\n\t// https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html\n\tBearerAuthTokenProvider smithybearer.TokenProvider\n\n\t// The HTTP Client the SDK's API clients will use to invoke HTTP requests.\n\t// The SDK defaults to a BuildableClient allowing API clients to create\n\t// copies of the HTTP Client for service specific customizations.\n\t//\n\t// Use a (*http.Client) for custom behavior. Using a custom http.Client\n\t// will prevent the SDK from modifying the HTTP client.\n\tHTTPClient HTTPClient\n\n\t// An endpoint resolver that can be used to provide or override an endpoint\n\t// for the given service and region.\n\t//\n\t// See the `aws.EndpointResolver` documentation for additional usage\n\t// information.\n\t//\n\t// Deprecated: See Config.EndpointResolverWithOptions\n\tEndpointResolver EndpointResolver\n\n\t// An endpoint resolver that can be used to provide or override an endpoint\n\t// for the given service and region.\n\t//\n\t// When EndpointResolverWithOptions is specified, it will be used by a\n\t// service client rather than using EndpointResolver if also specified.\n\t//\n\t// See the `aws.EndpointResolverWithOptions` documentation for additional\n\t// usage information.\n\t//\n\t// Deprecated: with the release of endpoint resolution v2 in API clients,\n\t// EndpointResolver and EndpointResolverWithOptions are deprecated.\n\t// Providing a value for this field will likely prevent you from using\n\t// newer endpoint-related service features. See API client options\n\t// EndpointResolverV2 and BaseEndpoint.\n\tEndpointResolverWithOptions EndpointResolverWithOptions\n\n\t// RetryMaxAttempts specifies the maximum number attempts an API client\n\t// will call an operation that fails with a retryable error.\n\t//\n\t// API Clients will only use this value to construct a retryer if the\n\t// Config.Retryer member is not nil. This value will be ignored if\n\t// Retryer is not nil.\n\tRetryMaxAttempts int\n\n\t// RetryMode specifies the retry model the API client will be created with.\n\t//\n\t// API Clients will only use this value to construct a retryer if the\n\t// Config.Retryer member is not nil. This value will be ignored if\n\t// Retryer is not nil.\n\tRetryMode RetryMode\n\n\t// Retryer is a function that provides a Retryer implementation. A Retryer\n\t// guides how HTTP requests should be retried in case of recoverable\n\t// failures. When nil the API client will use a default retryer.\n\t//\n\t// In general, the provider function should return a new instance of a\n\t// Retryer if you are attempting to provide a consistent Retryer\n\t// configuration across all clients. This will ensure that each client will\n\t// be provided a new instance of the Retryer implementation, and will avoid\n\t// issues such as sharing the same retry token bucket across services.\n\t//\n\t// If not nil, RetryMaxAttempts, and RetryMode will be ignored by API\n\t// clients.\n\tRetryer func() Retryer\n\n\t// ConfigSources are the sources that were used to construct the Config.\n\t// Allows for additional configuration to be loaded by clients.\n\tConfigSources []interface{}\n\n\t// APIOptions provides the set of middleware mutations modify how the API\n\t// client requests will be handled. This is useful for adding additional\n\t// tracing data to a request, or changing behavior of the SDK's client.\n\tAPIOptions []func(*middleware.Stack) error\n\n\t// The logger writer interface to write logging messages to. Defaults to\n\t// standard error.\n\tLogger logging.Logger\n\n\t// Configures the events that will be sent to the configured logger. This\n\t// can be used to configure the logging of signing, retries, request, and\n\t// responses of the SDK clients.\n\t//\n\t// See the ClientLogMode type documentation for the complete set of logging\n\t// modes and available configuration.\n\tClientLogMode ClientLogMode\n\n\t// The configured DefaultsMode. If not specified, service clients will\n\t// default to legacy.\n\t//\n\t// Supported modes are: auto, cross-region, in-region, legacy, mobile,\n\t// standard\n\tDefaultsMode DefaultsMode\n\n\t// The RuntimeEnvironment configuration, only populated if the DefaultsMode\n\t// is set to DefaultsModeAuto and is initialized by\n\t// `config.LoadDefaultConfig`. You should not populate this structure\n\t// programmatically, or rely on the values here within your applications.\n\tRuntimeEnvironment RuntimeEnvironment\n\n\t// AppId is an optional application specific identifier that can be set.\n\t// When set it will be appended to the User-Agent header of every request\n\t// in the form of App/{AppId}. This variable is sourced from environment\n\t// variable AWS_SDK_UA_APP_ID or the shared config profile attribute sdk_ua_app_id.\n\t// See https://docs.aws.amazon.com/sdkref/latest/guide/settings-reference.html for\n\t// more information on environment variables and shared config settings.\n\tAppID string\n\n\t// BaseEndpoint is an intermediary transfer location to a service specific\n\t// BaseEndpoint on a service's Options.\n\tBaseEndpoint *string\n\n\t// DisableRequestCompression toggles if an operation request could be\n\t// compressed or not. Will be set to false by default. This variable is sourced from\n\t// environment variable AWS_DISABLE_REQUEST_COMPRESSION or the shared config profile attribute\n\t// disable_request_compression\n\tDisableRequestCompression bool\n\n\t// RequestMinCompressSizeBytes sets the inclusive min bytes of a request body that could be\n\t// compressed. Will be set to 10240 by default and must be within 0 and 10485760 bytes inclusively.\n\t// This variable is sourced from environment variable AWS_REQUEST_MIN_COMPRESSION_SIZE_BYTES or\n\t// the shared config profile attribute request_min_compression_size_bytes\n\tRequestMinCompressSizeBytes int64\n\n\t// Controls how a resolved AWS account ID is handled for endpoint routing.\n\tAccountIDEndpointMode AccountIDEndpointMode\n\n\t// RequestChecksumCalculation determines when request checksum calculation is performed.\n\t//\n\t// There are two possible values for this setting:\n\t//\n\t// 1. RequestChecksumCalculationWhenSupported (default): The checksum is always calculated\n\t//    if the operation supports it, regardless of whether the user sets an algorithm in the request.\n\t//\n\t// 2. RequestChecksumCalculationWhenRequired: The checksum is only calculated if the user\n\t//    explicitly sets a checksum algorithm in the request.\n\t//\n\t// This setting is sourced from the environment variable AWS_REQUEST_CHECKSUM_CALCULATION\n\t// or the shared config profile attribute \"request_checksum_calculation\".\n\tRequestChecksumCalculation RequestChecksumCalculation\n\n\t// ResponseChecksumValidation determines when response checksum validation is performed\n\t//\n\t// There are two possible values for this setting:\n\t//\n\t// 1. ResponseChecksumValidationWhenSupported (default): The checksum is always validated\n\t//    if the operation supports it, regardless of whether the user sets the validation mode to ENABLED in request.\n\t//\n\t// 2. ResponseChecksumValidationWhenRequired: The checksum is only validated if the user\n\t//    explicitly sets the validation mode to ENABLED in the request\n\t// This variable is sourced from environment variable AWS_RESPONSE_CHECKSUM_VALIDATION or\n\t// the shared config profile attribute \"response_checksum_validation\".\n\tResponseChecksumValidation ResponseChecksumValidation\n}\n\n// NewConfig returns a new Config pointer that can be chained with builder\n// methods to set multiple configuration values inline without using pointers.\nfunc NewConfig() *Config {\n\treturn &Config{}\n}\n\n// Copy will return a shallow copy of the Config object.\nfunc (c Config) Copy() Config {\n\tcp := c\n\treturn cp\n}\n\n// EndpointDiscoveryEnableState indicates if endpoint discovery is\n// enabled, disabled, auto or unset state.\n//\n// Default behavior (Auto or Unset) indicates operations that require endpoint\n// discovery will use Endpoint Discovery by default. Operations that\n// optionally use Endpoint Discovery will not use Endpoint Discovery\n// unless EndpointDiscovery is explicitly enabled.\ntype EndpointDiscoveryEnableState uint\n\n// Enumeration values for EndpointDiscoveryEnableState\nconst (\n\t// EndpointDiscoveryUnset represents EndpointDiscoveryEnableState is unset.\n\t// Users do not need to use this value explicitly. The behavior for unset\n\t// is the same as for EndpointDiscoveryAuto.\n\tEndpointDiscoveryUnset EndpointDiscoveryEnableState = iota\n\n\t// EndpointDiscoveryAuto represents an AUTO state that allows endpoint\n\t// discovery only when required by the api. This is the default\n\t// configuration resolved by the client if endpoint discovery is neither\n\t// enabled or disabled.\n\tEndpointDiscoveryAuto // default state\n\n\t// EndpointDiscoveryDisabled indicates client MUST not perform endpoint\n\t// discovery even when required.\n\tEndpointDiscoveryDisabled\n\n\t// EndpointDiscoveryEnabled indicates client MUST always perform endpoint\n\t// discovery if supported for the operation.\n\tEndpointDiscoveryEnabled\n)\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/context.go",
    "content": "package aws\n\nimport (\n\t\"context\"\n\t\"time\"\n)\n\ntype suppressedContext struct {\n\tcontext.Context\n}\n\nfunc (s *suppressedContext) Deadline() (deadline time.Time, ok bool) {\n\treturn time.Time{}, false\n}\n\nfunc (s *suppressedContext) Done() <-chan struct{} {\n\treturn nil\n}\n\nfunc (s *suppressedContext) Err() error {\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/credential_cache.go",
    "content": "package aws\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\tsdkrand \"github.com/aws/aws-sdk-go-v2/internal/rand\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/sync/singleflight\"\n)\n\n// CredentialsCacheOptions are the options\ntype CredentialsCacheOptions struct {\n\n\t// ExpiryWindow will allow the credentials to trigger refreshing prior to\n\t// the credentials actually expiring. This is beneficial so race conditions\n\t// with expiring credentials do not cause request to fail unexpectedly\n\t// due to ExpiredTokenException exceptions.\n\t//\n\t// An ExpiryWindow of 10s would cause calls to IsExpired() to return true\n\t// 10 seconds before the credentials are actually expired. This can cause an\n\t// increased number of requests to refresh the credentials to occur.\n\t//\n\t// If ExpiryWindow is 0 or less it will be ignored.\n\tExpiryWindow time.Duration\n\n\t// ExpiryWindowJitterFrac provides a mechanism for randomizing the\n\t// expiration of credentials within the configured ExpiryWindow by a random\n\t// percentage. Valid values are between 0.0 and 1.0.\n\t//\n\t// As an example if ExpiryWindow is 60 seconds and ExpiryWindowJitterFrac\n\t// is 0.5 then credentials will be set to expire between 30 to 60 seconds\n\t// prior to their actual expiration time.\n\t//\n\t// If ExpiryWindow is 0 or less then ExpiryWindowJitterFrac is ignored.\n\t// If ExpiryWindowJitterFrac is 0 then no randomization will be applied to the window.\n\t// If ExpiryWindowJitterFrac < 0 the value will be treated as 0.\n\t// If ExpiryWindowJitterFrac > 1 the value will be treated as 1.\n\tExpiryWindowJitterFrac float64\n}\n\n// CredentialsCache provides caching and concurrency safe credentials retrieval\n// via the provider's retrieve method.\n//\n// CredentialsCache will look for optional interfaces on the Provider to adjust\n// how the credential cache handles credentials caching.\n//\n//   - HandleFailRefreshCredentialsCacheStrategy - Allows provider to handle\n//     credential refresh failures. This could return an updated Credentials\n//     value, or attempt another means of retrieving credentials.\n//\n//   - AdjustExpiresByCredentialsCacheStrategy - Allows provider to adjust how\n//     credentials Expires is modified. This could modify how the Credentials\n//     Expires is adjusted based on the CredentialsCache ExpiryWindow option.\n//     Such as providing a floor not to reduce the Expires below.\ntype CredentialsCache struct {\n\tprovider CredentialsProvider\n\n\toptions CredentialsCacheOptions\n\tcreds   atomic.Value\n\tsf      singleflight.Group\n}\n\n// NewCredentialsCache returns a CredentialsCache that wraps provider. Provider\n// is expected to not be nil. A variadic list of one or more functions can be\n// provided to modify the CredentialsCache configuration. This allows for\n// configuration of credential expiry window and jitter.\nfunc NewCredentialsCache(provider CredentialsProvider, optFns ...func(options *CredentialsCacheOptions)) *CredentialsCache {\n\toptions := CredentialsCacheOptions{}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tif options.ExpiryWindow < 0 {\n\t\toptions.ExpiryWindow = 0\n\t}\n\n\tif options.ExpiryWindowJitterFrac < 0 {\n\t\toptions.ExpiryWindowJitterFrac = 0\n\t} else if options.ExpiryWindowJitterFrac > 1 {\n\t\toptions.ExpiryWindowJitterFrac = 1\n\t}\n\n\treturn &CredentialsCache{\n\t\tprovider: provider,\n\t\toptions:  options,\n\t}\n}\n\n// Retrieve returns the credentials. If the credentials have already been\n// retrieved, and not expired the cached credentials will be returned. If the\n// credentials have not been retrieved yet, or expired the provider's Retrieve\n// method will be called.\n//\n// Returns and error if the provider's retrieve method returns an error.\nfunc (p *CredentialsCache) Retrieve(ctx context.Context) (Credentials, error) {\n\tif creds, ok := p.getCreds(); ok && !creds.Expired() {\n\t\treturn creds, nil\n\t}\n\n\tresCh := p.sf.DoChan(\"\", func() (interface{}, error) {\n\t\treturn p.singleRetrieve(&suppressedContext{ctx})\n\t})\n\tselect {\n\tcase res := <-resCh:\n\t\treturn res.Val.(Credentials), res.Err\n\tcase <-ctx.Done():\n\t\treturn Credentials{}, &RequestCanceledError{Err: ctx.Err()}\n\t}\n}\n\nfunc (p *CredentialsCache) singleRetrieve(ctx context.Context) (interface{}, error) {\n\tcurrCreds, ok := p.getCreds()\n\tif ok && !currCreds.Expired() {\n\t\treturn currCreds, nil\n\t}\n\n\tnewCreds, err := p.provider.Retrieve(ctx)\n\tif err != nil {\n\t\thandleFailToRefresh := defaultHandleFailToRefresh\n\t\tif cs, ok := p.provider.(HandleFailRefreshCredentialsCacheStrategy); ok {\n\t\t\thandleFailToRefresh = cs.HandleFailToRefresh\n\t\t}\n\t\tnewCreds, err = handleFailToRefresh(ctx, currCreds, err)\n\t\tif err != nil {\n\t\t\treturn Credentials{}, fmt.Errorf(\"failed to refresh cached credentials, %w\", err)\n\t\t}\n\t}\n\n\tif newCreds.CanExpire && p.options.ExpiryWindow > 0 {\n\t\tadjustExpiresBy := defaultAdjustExpiresBy\n\t\tif cs, ok := p.provider.(AdjustExpiresByCredentialsCacheStrategy); ok {\n\t\t\tadjustExpiresBy = cs.AdjustExpiresBy\n\t\t}\n\n\t\trandFloat64, err := sdkrand.CryptoRandFloat64()\n\t\tif err != nil {\n\t\t\treturn Credentials{}, fmt.Errorf(\"failed to get random provider, %w\", err)\n\t\t}\n\n\t\tvar jitter time.Duration\n\t\tif p.options.ExpiryWindowJitterFrac > 0 {\n\t\t\tjitter = time.Duration(randFloat64 *\n\t\t\t\tp.options.ExpiryWindowJitterFrac * float64(p.options.ExpiryWindow))\n\t\t}\n\n\t\tnewCreds, err = adjustExpiresBy(newCreds, -(p.options.ExpiryWindow - jitter))\n\t\tif err != nil {\n\t\t\treturn Credentials{}, fmt.Errorf(\"failed to adjust credentials expires, %w\", err)\n\t\t}\n\t}\n\n\tp.creds.Store(&newCreds)\n\treturn newCreds, nil\n}\n\n// getCreds returns the currently stored credentials and true. Returning false\n// if no credentials were stored.\nfunc (p *CredentialsCache) getCreds() (Credentials, bool) {\n\tv := p.creds.Load()\n\tif v == nil {\n\t\treturn Credentials{}, false\n\t}\n\n\tc := v.(*Credentials)\n\tif c == nil || !c.HasKeys() {\n\t\treturn Credentials{}, false\n\t}\n\n\treturn *c, true\n}\n\n// ProviderSources returns a list of where the underlying credential provider\n// has been sourced, if available. Returns empty if the provider doesn't implement\n// the interface\nfunc (p *CredentialsCache) ProviderSources() []CredentialSource {\n\tasSource, ok := p.provider.(CredentialProviderSource)\n\tif !ok {\n\t\treturn []CredentialSource{}\n\t}\n\treturn asSource.ProviderSources()\n}\n\n// Invalidate will invalidate the cached credentials. The next call to Retrieve\n// will cause the provider's Retrieve method to be called.\nfunc (p *CredentialsCache) Invalidate() {\n\tp.creds.Store((*Credentials)(nil))\n}\n\n// IsCredentialsProvider returns whether credential provider wrapped by CredentialsCache\n// matches the target provider type.\nfunc (p *CredentialsCache) IsCredentialsProvider(target CredentialsProvider) bool {\n\treturn IsCredentialsProvider(p.provider, target)\n}\n\n// HandleFailRefreshCredentialsCacheStrategy is an interface for\n// CredentialsCache to allow CredentialsProvider  how failed to refresh\n// credentials is handled.\ntype HandleFailRefreshCredentialsCacheStrategy interface {\n\t// Given the previously cached Credentials, if any, and refresh error, may\n\t// returns new or modified set of Credentials, or error.\n\t//\n\t// Credential caches may use default implementation if nil.\n\tHandleFailToRefresh(context.Context, Credentials, error) (Credentials, error)\n}\n\n// defaultHandleFailToRefresh returns the passed in error.\nfunc defaultHandleFailToRefresh(ctx context.Context, _ Credentials, err error) (Credentials, error) {\n\treturn Credentials{}, err\n}\n\n// AdjustExpiresByCredentialsCacheStrategy is an interface for CredentialCache\n// to allow CredentialsProvider to intercept adjustments to Credentials expiry\n// based on expectations and use cases of CredentialsProvider.\n//\n// Credential caches may use default implementation if nil.\ntype AdjustExpiresByCredentialsCacheStrategy interface {\n\t// Given a Credentials as input, applying any mutations and\n\t// returning the potentially updated Credentials, or error.\n\tAdjustExpiresBy(Credentials, time.Duration) (Credentials, error)\n}\n\n// defaultAdjustExpiresBy adds the duration to the passed in credentials Expires,\n// and returns the updated credentials value. If Credentials value's CanExpire\n// is false, the passed in credentials are returned unchanged.\nfunc defaultAdjustExpiresBy(creds Credentials, dur time.Duration) (Credentials, error) {\n\tif !creds.CanExpire {\n\t\treturn creds, nil\n\t}\n\n\tcreds.Expires = creds.Expires.Add(dur)\n\treturn creds, nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/credentials.go",
    "content": "package aws\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/internal/sdk\"\n)\n\n// AnonymousCredentials provides a sentinel CredentialsProvider that should be\n// used to instruct the SDK's signing middleware to not sign the request.\n//\n// Using `nil` credentials when configuring an API client will achieve the same\n// result. The AnonymousCredentials type allows you to configure the SDK's\n// external config loading to not attempt to source credentials from the shared\n// config or environment.\n//\n// For example you can use this CredentialsProvider with an API client's\n// Options to instruct the client not to sign a request for accessing public\n// S3 bucket objects.\n//\n// The following example demonstrates using the AnonymousCredentials to prevent\n// SDK's external config loading attempt to resolve credentials.\n//\n//\tcfg, err := config.LoadDefaultConfig(context.TODO(),\n//\t     config.WithCredentialsProvider(aws.AnonymousCredentials{}),\n//\t)\n//\tif err != nil {\n//\t     log.Fatalf(\"failed to load config, %v\", err)\n//\t}\n//\n//\tclient := s3.NewFromConfig(cfg)\n//\n// Alternatively you can leave the API client Option's `Credential` member to\n// nil. If using the `NewFromConfig` constructor you'll need to explicitly set\n// the `Credentials` member to nil, if the external config resolved a\n// credential provider.\n//\n//\tclient := s3.New(s3.Options{\n//\t     // Credentials defaults to a nil value.\n//\t})\n//\n// This can also be configured for specific operations calls too.\n//\n//\tcfg, err := config.LoadDefaultConfig(context.TODO())\n//\tif err != nil {\n//\t     log.Fatalf(\"failed to load config, %v\", err)\n//\t}\n//\n//\tclient := s3.NewFromConfig(config)\n//\n//\tresult, err := client.GetObject(context.TODO(), s3.GetObject{\n//\t     Bucket: aws.String(\"example-bucket\"),\n//\t     Key: aws.String(\"example-key\"),\n//\t}, func(o *s3.Options) {\n//\t     o.Credentials = nil\n//\t     // Or\n//\t     o.Credentials = aws.AnonymousCredentials{}\n//\t})\ntype AnonymousCredentials struct{}\n\n// Retrieve implements the CredentialsProvider interface, but will always\n// return error, and cannot be used to sign a request. The AnonymousCredentials\n// type is used as a sentinel type instructing the AWS request signing\n// middleware to not sign a request.\nfunc (AnonymousCredentials) Retrieve(context.Context) (Credentials, error) {\n\treturn Credentials{Source: \"AnonymousCredentials\"},\n\t\tfmt.Errorf(\"the AnonymousCredentials is not a valid credential provider, and cannot be used to sign AWS requests with\")\n}\n\n// CredentialSource is the source of the credential provider.\n// A provider can have multiple credential sources: For example, a provider that reads a profile, calls ECS to\n// get credentials and then assumes a role using STS will have all these as part of its provider chain.\ntype CredentialSource int\n\nconst (\n\t// CredentialSourceUndefined is the sentinel zero value\n\tCredentialSourceUndefined CredentialSource = iota\n\t// CredentialSourceCode credentials resolved from code, cli parameters, session object, or client instance\n\tCredentialSourceCode\n\t// CredentialSourceEnvVars credentials resolved from environment variables\n\tCredentialSourceEnvVars\n\t// CredentialSourceEnvVarsSTSWebIDToken credentials resolved from environment variables for assuming a role with STS using a web identity token\n\tCredentialSourceEnvVarsSTSWebIDToken\n\t// CredentialSourceSTSAssumeRole credentials resolved from STS using AssumeRole\n\tCredentialSourceSTSAssumeRole\n\t// CredentialSourceSTSAssumeRoleSaml credentials resolved from STS using assume role with SAML\n\tCredentialSourceSTSAssumeRoleSaml\n\t// CredentialSourceSTSAssumeRoleWebID credentials resolved from STS using assume role with web identity\n\tCredentialSourceSTSAssumeRoleWebID\n\t// CredentialSourceSTSFederationToken credentials resolved from STS using a federation token\n\tCredentialSourceSTSFederationToken\n\t// CredentialSourceSTSSessionToken credentials resolved from STS using a session token \tS\n\tCredentialSourceSTSSessionToken\n\t// CredentialSourceProfile  credentials resolved from a config file(s) profile with static credentials\n\tCredentialSourceProfile\n\t// CredentialSourceProfileSourceProfile credentials resolved from a source profile in a config file(s) profile\n\tCredentialSourceProfileSourceProfile\n\t// CredentialSourceProfileNamedProvider credentials resolved from a named provider in a config file(s) profile (like EcsContainer)\n\tCredentialSourceProfileNamedProvider\n\t// CredentialSourceProfileSTSWebIDToken  credentials resolved from configuration for assuming a role with STS using web identity token in a config file(s) profile\n\tCredentialSourceProfileSTSWebIDToken\n\t// CredentialSourceProfileSSO credentials resolved from an SSO session in a config file(s) profile\n\tCredentialSourceProfileSSO\n\t// CredentialSourceSSO credentials resolved from an SSO session\n\tCredentialSourceSSO\n\t// CredentialSourceProfileSSOLegacy credentials resolved from an SSO session in a config file(s) profile using legacy format\n\tCredentialSourceProfileSSOLegacy\n\t// CredentialSourceSSOLegacy credentials resolved from an SSO session using legacy format\n\tCredentialSourceSSOLegacy\n\t// CredentialSourceProfileProcess credentials resolved from a process in a config file(s) profile\n\tCredentialSourceProfileProcess\n\t// CredentialSourceProcess credentials resolved from a process\n\tCredentialSourceProcess\n\t// CredentialSourceHTTP credentials resolved from an HTTP endpoint\n\tCredentialSourceHTTP\n\t// CredentialSourceIMDS credentials resolved from the instance metadata service (IMDS)\n\tCredentialSourceIMDS\n)\n\n// A Credentials is the AWS credentials value for individual credential fields.\ntype Credentials struct {\n\t// AWS Access key ID\n\tAccessKeyID string\n\n\t// AWS Secret Access Key\n\tSecretAccessKey string\n\n\t// AWS Session Token\n\tSessionToken string\n\n\t// Source of the credentials\n\tSource string\n\n\t// States if the credentials can expire or not.\n\tCanExpire bool\n\n\t// The time the credentials will expire at. Should be ignored if CanExpire\n\t// is false.\n\tExpires time.Time\n\n\t// The ID of the account for the credentials.\n\tAccountID string\n}\n\n// Expired returns if the credentials have expired.\nfunc (v Credentials) Expired() bool {\n\tif v.CanExpire {\n\t\t// Calling Round(0) on the current time will truncate the monotonic\n\t\t// reading only. Ensures credential expiry time is always based on\n\t\t// reported wall-clock time.\n\t\treturn !v.Expires.After(sdk.NowTime().Round(0))\n\t}\n\n\treturn false\n}\n\n// HasKeys returns if the credentials keys are set.\nfunc (v Credentials) HasKeys() bool {\n\treturn len(v.AccessKeyID) > 0 && len(v.SecretAccessKey) > 0\n}\n\n// A CredentialsProvider is the interface for any component which will provide\n// credentials Credentials. A CredentialsProvider is required to manage its own\n// Expired state, and what to be expired means.\n//\n// A credentials provider implementation can be wrapped with a CredentialCache\n// to cache the credential value retrieved. Without the cache the SDK will\n// attempt to retrieve the credentials for every request.\ntype CredentialsProvider interface {\n\t// Retrieve returns nil if it successfully retrieved the value.\n\t// Error is returned if the value were not obtainable, or empty.\n\tRetrieve(ctx context.Context) (Credentials, error)\n}\n\n// CredentialProviderSource allows any credential provider to track\n// all providers where a credential provider were sourced. For example, if the credentials came from a\n// call to a role specified in the profile, this method will give the whole breadcrumb trail\ntype CredentialProviderSource interface {\n\tProviderSources() []CredentialSource\n}\n\n// CredentialsProviderFunc provides a helper wrapping a function value to\n// satisfy the CredentialsProvider interface.\ntype CredentialsProviderFunc func(context.Context) (Credentials, error)\n\n// Retrieve delegates to the function value the CredentialsProviderFunc wraps.\nfunc (fn CredentialsProviderFunc) Retrieve(ctx context.Context) (Credentials, error) {\n\treturn fn(ctx)\n}\n\ntype isCredentialsProvider interface {\n\tIsCredentialsProvider(CredentialsProvider) bool\n}\n\n// IsCredentialsProvider returns whether the target CredentialProvider is the same type as provider when comparing the\n// implementation type.\n//\n// If provider has a method IsCredentialsProvider(CredentialsProvider) bool it will be responsible for validating\n// whether target matches the credential provider type.\n//\n// When comparing the CredentialProvider implementations provider and target for equality, the following rules are used:\n//\n//\tIf provider is of type T and target is of type V, true if type *T is the same as type *V, otherwise false\n//\tIf provider is of type *T and target is of type V, true if type *T is the same as type *V, otherwise false\n//\tIf provider is of type T and target is of type *V, true if type *T is the same as type *V, otherwise false\n//\tIf provider is of type *T and target is of type *V,true if type *T is the same as type *V, otherwise false\nfunc IsCredentialsProvider(provider, target CredentialsProvider) bool {\n\tif target == nil || provider == nil {\n\t\treturn provider == target\n\t}\n\n\tif x, ok := provider.(isCredentialsProvider); ok {\n\t\treturn x.IsCredentialsProvider(target)\n\t}\n\n\ttargetType := reflect.TypeOf(target)\n\tif targetType.Kind() != reflect.Ptr {\n\t\ttargetType = reflect.PtrTo(targetType)\n\t}\n\n\tproviderType := reflect.TypeOf(provider)\n\tif providerType.Kind() != reflect.Ptr {\n\t\tproviderType = reflect.PtrTo(providerType)\n\t}\n\n\treturn targetType.AssignableTo(providerType)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/auto.go",
    "content": "package defaults\n\nimport (\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"runtime\"\n\t\"strings\"\n)\n\nvar getGOOS = func() string {\n\treturn runtime.GOOS\n}\n\n// ResolveDefaultsModeAuto is used to determine the effective aws.DefaultsMode when the mode\n// is set to aws.DefaultsModeAuto.\nfunc ResolveDefaultsModeAuto(region string, environment aws.RuntimeEnvironment) aws.DefaultsMode {\n\tgoos := getGOOS()\n\tif goos == \"android\" || goos == \"ios\" {\n\t\treturn aws.DefaultsModeMobile\n\t}\n\n\tvar currentRegion string\n\tif len(environment.EnvironmentIdentifier) > 0 {\n\t\tcurrentRegion = environment.Region\n\t}\n\n\tif len(currentRegion) == 0 && len(environment.EC2InstanceMetadataRegion) > 0 {\n\t\tcurrentRegion = environment.EC2InstanceMetadataRegion\n\t}\n\n\tif len(region) > 0 && len(currentRegion) > 0 {\n\t\tif strings.EqualFold(region, currentRegion) {\n\t\t\treturn aws.DefaultsModeInRegion\n\t\t}\n\t\treturn aws.DefaultsModeCrossRegion\n\t}\n\n\treturn aws.DefaultsModeStandard\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/configuration.go",
    "content": "package defaults\n\nimport (\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n)\n\n// Configuration is the set of SDK configuration options that are determined based\n// on the configured DefaultsMode.\ntype Configuration struct {\n\t// RetryMode is the configuration's default retry mode API clients should\n\t// use for constructing a Retryer.\n\tRetryMode aws.RetryMode\n\n\t// ConnectTimeout is the maximum amount of time a dial will wait for\n\t// a connect to complete.\n\t//\n\t// See https://pkg.go.dev/net#Dialer.Timeout\n\tConnectTimeout *time.Duration\n\n\t// TLSNegotiationTimeout specifies the maximum amount of time waiting to\n\t// wait for a TLS handshake.\n\t//\n\t// See https://pkg.go.dev/net/http#Transport.TLSHandshakeTimeout\n\tTLSNegotiationTimeout *time.Duration\n}\n\n// GetConnectTimeout returns the ConnectTimeout value, returns false if the value is not set.\nfunc (c *Configuration) GetConnectTimeout() (time.Duration, bool) {\n\tif c.ConnectTimeout == nil {\n\t\treturn 0, false\n\t}\n\treturn *c.ConnectTimeout, true\n}\n\n// GetTLSNegotiationTimeout returns the TLSNegotiationTimeout value, returns false if the value is not set.\nfunc (c *Configuration) GetTLSNegotiationTimeout() (time.Duration, bool) {\n\tif c.TLSNegotiationTimeout == nil {\n\t\treturn 0, false\n\t}\n\treturn *c.TLSNegotiationTimeout, true\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/defaults.go",
    "content": "// Code generated by github.com/aws/aws-sdk-go-v2/internal/codegen/cmd/defaultsconfig. DO NOT EDIT.\n\npackage defaults\n\nimport (\n\t\"fmt\"\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"time\"\n)\n\n// GetModeConfiguration returns the default Configuration descriptor for the given mode.\n//\n// Supports the following modes: cross-region, in-region, mobile, standard\nfunc GetModeConfiguration(mode aws.DefaultsMode) (Configuration, error) {\n\tvar mv aws.DefaultsMode\n\tmv.SetFromString(string(mode))\n\n\tswitch mv {\n\tcase aws.DefaultsModeCrossRegion:\n\t\tsettings := Configuration{\n\t\t\tConnectTimeout:        aws.Duration(3100 * time.Millisecond),\n\t\t\tRetryMode:             aws.RetryMode(\"standard\"),\n\t\t\tTLSNegotiationTimeout: aws.Duration(3100 * time.Millisecond),\n\t\t}\n\t\treturn settings, nil\n\tcase aws.DefaultsModeInRegion:\n\t\tsettings := Configuration{\n\t\t\tConnectTimeout:        aws.Duration(1100 * time.Millisecond),\n\t\t\tRetryMode:             aws.RetryMode(\"standard\"),\n\t\t\tTLSNegotiationTimeout: aws.Duration(1100 * time.Millisecond),\n\t\t}\n\t\treturn settings, nil\n\tcase aws.DefaultsModeMobile:\n\t\tsettings := Configuration{\n\t\t\tConnectTimeout:        aws.Duration(30000 * time.Millisecond),\n\t\t\tRetryMode:             aws.RetryMode(\"standard\"),\n\t\t\tTLSNegotiationTimeout: aws.Duration(30000 * time.Millisecond),\n\t\t}\n\t\treturn settings, nil\n\tcase aws.DefaultsModeStandard:\n\t\tsettings := Configuration{\n\t\t\tConnectTimeout:        aws.Duration(3100 * time.Millisecond),\n\t\t\tRetryMode:             aws.RetryMode(\"standard\"),\n\t\t\tTLSNegotiationTimeout: aws.Duration(3100 * time.Millisecond),\n\t\t}\n\t\treturn settings, nil\n\tdefault:\n\t\treturn Configuration{}, fmt.Errorf(\"unsupported defaults mode: %v\", mode)\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/doc.go",
    "content": "// Package defaults provides recommended configuration values for AWS SDKs and CLIs.\npackage defaults\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/defaultsmode.go",
    "content": "// Code generated by github.com/aws/aws-sdk-go-v2/internal/codegen/cmd/defaultsmode. DO NOT EDIT.\n\npackage aws\n\nimport (\n\t\"strings\"\n)\n\n// DefaultsMode is the SDK defaults mode setting.\ntype DefaultsMode string\n\n// The DefaultsMode constants.\nconst (\n\t// DefaultsModeAuto is an experimental mode that builds on the standard mode.\n\t// The SDK will attempt to discover the execution environment to determine the\n\t// appropriate settings automatically.\n\t//\n\t// Note that the auto detection is heuristics-based and does not guarantee 100%\n\t// accuracy. STANDARD mode will be used if the execution environment cannot\n\t// be determined. The auto detection might query EC2 Instance Metadata service\n\t// (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html),\n\t// which might introduce latency. Therefore we recommend choosing an explicit\n\t// defaults_mode instead if startup latency is critical to your application\n\tDefaultsModeAuto DefaultsMode = \"auto\"\n\n\t// DefaultsModeCrossRegion builds on the standard mode and includes optimization\n\t// tailored for applications which call AWS services in a different region\n\t//\n\t// Note that the default values vended from this mode might change as best practices\n\t// may evolve. As a result, it is encouraged to perform tests when upgrading\n\t// the SDK\n\tDefaultsModeCrossRegion DefaultsMode = \"cross-region\"\n\n\t// DefaultsModeInRegion builds on the standard mode and includes optimization\n\t// tailored for applications which call AWS services from within the same AWS\n\t// region\n\t//\n\t// Note that the default values vended from this mode might change as best practices\n\t// may evolve. As a result, it is encouraged to perform tests when upgrading\n\t// the SDK\n\tDefaultsModeInRegion DefaultsMode = \"in-region\"\n\n\t// DefaultsModeLegacy provides default settings that vary per SDK and were used\n\t// prior to establishment of defaults_mode\n\tDefaultsModeLegacy DefaultsMode = \"legacy\"\n\n\t// DefaultsModeMobile builds on the standard mode and includes optimization\n\t// tailored for mobile applications\n\t//\n\t// Note that the default values vended from this mode might change as best practices\n\t// may evolve. As a result, it is encouraged to perform tests when upgrading\n\t// the SDK\n\tDefaultsModeMobile DefaultsMode = \"mobile\"\n\n\t// DefaultsModeStandard provides the latest recommended default values that\n\t// should be safe to run in most scenarios\n\t//\n\t// Note that the default values vended from this mode might change as best practices\n\t// may evolve. As a result, it is encouraged to perform tests when upgrading\n\t// the SDK\n\tDefaultsModeStandard DefaultsMode = \"standard\"\n)\n\n// SetFromString sets the DefaultsMode value to one of the pre-defined constants that matches\n// the provided string when compared using EqualFold. If the value does not match a known\n// constant it will be set to as-is and the function will return false. As a special case, if the\n// provided value is a zero-length string, the mode will be set to LegacyDefaultsMode.\nfunc (d *DefaultsMode) SetFromString(v string) (ok bool) {\n\tswitch {\n\tcase strings.EqualFold(v, string(DefaultsModeAuto)):\n\t\t*d = DefaultsModeAuto\n\t\tok = true\n\tcase strings.EqualFold(v, string(DefaultsModeCrossRegion)):\n\t\t*d = DefaultsModeCrossRegion\n\t\tok = true\n\tcase strings.EqualFold(v, string(DefaultsModeInRegion)):\n\t\t*d = DefaultsModeInRegion\n\t\tok = true\n\tcase strings.EqualFold(v, string(DefaultsModeLegacy)):\n\t\t*d = DefaultsModeLegacy\n\t\tok = true\n\tcase strings.EqualFold(v, string(DefaultsModeMobile)):\n\t\t*d = DefaultsModeMobile\n\t\tok = true\n\tcase strings.EqualFold(v, string(DefaultsModeStandard)):\n\t\t*d = DefaultsModeStandard\n\t\tok = true\n\tcase len(v) == 0:\n\t\t*d = DefaultsModeLegacy\n\t\tok = true\n\tdefault:\n\t\t*d = DefaultsMode(v)\n\t}\n\treturn ok\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/doc.go",
    "content": "// Package aws provides the core SDK's utilities and shared types. Use this package's\n// utilities to simplify setting and reading API operations parameters.\n//\n// # Value and Pointer Conversion Utilities\n//\n// This package includes a helper conversion utility for each scalar type the SDK's\n// API use. These utilities make getting a pointer of the scalar, and dereferencing\n// a pointer easier.\n//\n// Each conversion utility comes in two forms. Value to Pointer and Pointer to Value.\n// The Pointer to value will safely dereference the pointer and return its value.\n// If the pointer was nil, the scalar's zero value will be returned.\n//\n// The value to pointer functions will be named after the scalar type. So get a\n// *string from a string value use the \"String\" function. This makes it easy to\n// to get pointer of a literal string value, because getting the address of a\n// literal requires assigning the value to a variable first.\n//\n//\tvar strPtr *string\n//\n//\t// Without the SDK's conversion functions\n//\tstr := \"my string\"\n//\tstrPtr = &str\n//\n//\t// With the SDK's conversion functions\n//\tstrPtr = aws.String(\"my string\")\n//\n//\t// Convert *string to string value\n//\tstr = aws.ToString(strPtr)\n//\n// In addition to scalars the aws package also includes conversion utilities for\n// map and slice for commonly types used in API parameters. The map and slice\n// conversion functions use similar naming pattern as the scalar conversion\n// functions.\n//\n//\tvar strPtrs []*string\n//\tvar strs []string = []string{\"Go\", \"Gophers\", \"Go\"}\n//\n//\t// Convert []string to []*string\n//\tstrPtrs = aws.StringSlice(strs)\n//\n//\t// Convert []*string to []string\n//\tstrs = aws.ToStringSlice(strPtrs)\n//\n// # SDK Default HTTP Client\n//\n// The SDK will use the http.DefaultClient if a HTTP client is not provided to\n// the SDK's Session, or service client constructor. This means that if the\n// http.DefaultClient is modified by other components of your application the\n// modifications will be picked up by the SDK as well.\n//\n// In some cases this might be intended, but it is a better practice to create\n// a custom HTTP Client to share explicitly through your application. You can\n// configure the SDK to use the custom HTTP Client by setting the HTTPClient\n// value of the SDK's Config type when creating a Session or service client.\npackage aws\n\n// generate.go uses a build tag of \"ignore\", go run doesn't need to specify\n// this because go run ignores all build flags when running a go file directly.\n//go:generate go run -tags codegen generate.go\n//go:generate go run -tags codegen logging_generate.go\n//go:generate gofmt -w -s .\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/endpoints.go",
    "content": "package aws\n\nimport (\n\t\"fmt\"\n)\n\n// DualStackEndpointState is a constant to describe the dual-stack endpoint resolution behavior.\ntype DualStackEndpointState uint\n\nconst (\n\t// DualStackEndpointStateUnset is the default value behavior for dual-stack endpoint resolution.\n\tDualStackEndpointStateUnset DualStackEndpointState = iota\n\n\t// DualStackEndpointStateEnabled enables dual-stack endpoint resolution for service endpoints.\n\tDualStackEndpointStateEnabled\n\n\t// DualStackEndpointStateDisabled disables dual-stack endpoint resolution for endpoints.\n\tDualStackEndpointStateDisabled\n)\n\n// GetUseDualStackEndpoint takes a service's EndpointResolverOptions and returns the UseDualStackEndpoint value.\n// Returns boolean false if the provided options does not have a method to retrieve the DualStackEndpointState.\nfunc GetUseDualStackEndpoint(options ...interface{}) (value DualStackEndpointState, found bool) {\n\ttype iface interface {\n\t\tGetUseDualStackEndpoint() DualStackEndpointState\n\t}\n\tfor _, option := range options {\n\t\tif i, ok := option.(iface); ok {\n\t\t\tvalue = i.GetUseDualStackEndpoint()\n\t\t\tfound = true\n\t\t\tbreak\n\t\t}\n\t}\n\treturn value, found\n}\n\n// FIPSEndpointState is a constant to describe the FIPS endpoint resolution behavior.\ntype FIPSEndpointState uint\n\nconst (\n\t// FIPSEndpointStateUnset is the default value behavior for FIPS endpoint resolution.\n\tFIPSEndpointStateUnset FIPSEndpointState = iota\n\n\t// FIPSEndpointStateEnabled enables FIPS endpoint resolution for service endpoints.\n\tFIPSEndpointStateEnabled\n\n\t// FIPSEndpointStateDisabled disables FIPS endpoint resolution for endpoints.\n\tFIPSEndpointStateDisabled\n)\n\n// GetUseFIPSEndpoint takes a service's EndpointResolverOptions and returns the UseDualStackEndpoint value.\n// Returns boolean false if the provided options does not have a method to retrieve the DualStackEndpointState.\nfunc GetUseFIPSEndpoint(options ...interface{}) (value FIPSEndpointState, found bool) {\n\ttype iface interface {\n\t\tGetUseFIPSEndpoint() FIPSEndpointState\n\t}\n\tfor _, option := range options {\n\t\tif i, ok := option.(iface); ok {\n\t\t\tvalue = i.GetUseFIPSEndpoint()\n\t\t\tfound = true\n\t\t\tbreak\n\t\t}\n\t}\n\treturn value, found\n}\n\n// Endpoint represents the endpoint a service client should make API operation\n// calls to.\n//\n// The SDK will automatically resolve these endpoints per API client using an\n// internal endpoint resolvers. If you'd like to provide custom endpoint\n// resolving behavior you can implement the EndpointResolver interface.\n//\n// Deprecated: This structure was used with the global [EndpointResolver]\n// interface, which has been deprecated in favor of service-specific endpoint\n// resolution. See the deprecation docs on that interface for more information.\ntype Endpoint struct {\n\t// The base URL endpoint the SDK API clients will use to make API calls to.\n\t// The SDK will suffix URI path and query elements to this endpoint.\n\tURL string\n\n\t// Specifies if the endpoint's hostname can be modified by the SDK's API\n\t// client.\n\t//\n\t// If the hostname is mutable the SDK API clients may modify any part of\n\t// the hostname based on the requirements of the API, (e.g. adding, or\n\t// removing content in the hostname). Such as, Amazon S3 API client\n\t// prefixing \"bucketname\" to the hostname, or changing the\n\t// hostname service name component from \"s3.\" to \"s3-accesspoint.dualstack.\"\n\t// for the dualstack endpoint of an S3 Accesspoint resource.\n\t//\n\t// Care should be taken when providing a custom endpoint for an API. If the\n\t// endpoint hostname is mutable, and the client cannot modify the endpoint\n\t// correctly, the operation call will most likely fail, or have undefined\n\t// behavior.\n\t//\n\t// If hostname is immutable, the SDK API clients will not modify the\n\t// hostname of the URL. This may cause the API client not to function\n\t// correctly if the API requires the operation specific hostname values\n\t// to be used by the client.\n\t//\n\t// This flag does not modify the API client's behavior if this endpoint\n\t// will be used instead of Endpoint Discovery, or if the endpoint will be\n\t// used to perform Endpoint Discovery. That behavior is configured via the\n\t// API Client's Options.\n\tHostnameImmutable bool\n\n\t// The AWS partition the endpoint belongs to.\n\tPartitionID string\n\n\t// The service name that should be used for signing the requests to the\n\t// endpoint.\n\tSigningName string\n\n\t// The region that should be used for signing the request to the endpoint.\n\tSigningRegion string\n\n\t// The signing method that should be used for signing the requests to the\n\t// endpoint.\n\tSigningMethod string\n\n\t// The source of the Endpoint. By default, this will be EndpointSourceServiceMetadata.\n\t// When providing a custom endpoint, you should set the source as EndpointSourceCustom.\n\t// If source is not provided when providing a custom endpoint, the SDK may not\n\t// perform required host mutations correctly. Source should be used along with\n\t// HostnameImmutable property as per the usage requirement.\n\tSource EndpointSource\n}\n\n// EndpointSource is the endpoint source type.\n//\n// Deprecated: The global [Endpoint] structure is deprecated.\ntype EndpointSource int\n\nconst (\n\t// EndpointSourceServiceMetadata denotes service modeled endpoint metadata is used as Endpoint Source.\n\tEndpointSourceServiceMetadata EndpointSource = iota\n\n\t// EndpointSourceCustom denotes endpoint is a custom endpoint. This source should be used when\n\t// user provides a custom endpoint to be used by the SDK.\n\tEndpointSourceCustom\n)\n\n// EndpointNotFoundError is a sentinel error to indicate that the\n// EndpointResolver implementation was unable to resolve an endpoint for the\n// given service and region. Resolvers should use this to indicate that an API\n// client should fallback and attempt to use it's internal default resolver to\n// resolve the endpoint.\ntype EndpointNotFoundError struct {\n\tErr error\n}\n\n// Error is the error message.\nfunc (e *EndpointNotFoundError) Error() string {\n\treturn fmt.Sprintf(\"endpoint not found, %v\", e.Err)\n}\n\n// Unwrap returns the underlying error.\nfunc (e *EndpointNotFoundError) Unwrap() error {\n\treturn e.Err\n}\n\n// EndpointResolver is an endpoint resolver that can be used to provide or\n// override an endpoint for the given service and region. API clients will\n// attempt to use the EndpointResolver first to resolve an endpoint if\n// available. If the EndpointResolver returns an EndpointNotFoundError error,\n// API clients will fallback to attempting to resolve the endpoint using its\n// internal default endpoint resolver.\n//\n// Deprecated: The global endpoint resolution interface is deprecated. The API\n// for endpoint resolution is now unique to each service and is set via the\n// EndpointResolverV2 field on service client options. Setting a value for\n// EndpointResolver on aws.Config or service client options will prevent you\n// from using any endpoint-related service features released after the\n// introduction of EndpointResolverV2. You may also encounter broken or\n// unexpected behavior when using the old global interface with services that\n// use many endpoint-related customizations such as S3.\ntype EndpointResolver interface {\n\tResolveEndpoint(service, region string) (Endpoint, error)\n}\n\n// EndpointResolverFunc wraps a function to satisfy the EndpointResolver interface.\n//\n// Deprecated: The global endpoint resolution interface is deprecated. See\n// deprecation docs on [EndpointResolver].\ntype EndpointResolverFunc func(service, region string) (Endpoint, error)\n\n// ResolveEndpoint calls the wrapped function and returns the results.\nfunc (e EndpointResolverFunc) ResolveEndpoint(service, region string) (Endpoint, error) {\n\treturn e(service, region)\n}\n\n// EndpointResolverWithOptions is an endpoint resolver that can be used to provide or\n// override an endpoint for the given service, region, and the service client's EndpointOptions. API clients will\n// attempt to use the EndpointResolverWithOptions first to resolve an endpoint if\n// available. If the EndpointResolverWithOptions returns an EndpointNotFoundError error,\n// API clients will fallback to attempting to resolve the endpoint using its\n// internal default endpoint resolver.\n//\n// Deprecated: The global endpoint resolution interface is deprecated. See\n// deprecation docs on [EndpointResolver].\ntype EndpointResolverWithOptions interface {\n\tResolveEndpoint(service, region string, options ...interface{}) (Endpoint, error)\n}\n\n// EndpointResolverWithOptionsFunc wraps a function to satisfy the EndpointResolverWithOptions interface.\n//\n// Deprecated: The global endpoint resolution interface is deprecated. See\n// deprecation docs on [EndpointResolver].\ntype EndpointResolverWithOptionsFunc func(service, region string, options ...interface{}) (Endpoint, error)\n\n// ResolveEndpoint calls the wrapped function and returns the results.\nfunc (e EndpointResolverWithOptionsFunc) ResolveEndpoint(service, region string, options ...interface{}) (Endpoint, error) {\n\treturn e(service, region, options...)\n}\n\n// GetDisableHTTPS takes a service's EndpointResolverOptions and returns the DisableHTTPS value.\n// Returns boolean false if the provided options does not have a method to retrieve the DisableHTTPS.\nfunc GetDisableHTTPS(options ...interface{}) (value bool, found bool) {\n\ttype iface interface {\n\t\tGetDisableHTTPS() bool\n\t}\n\tfor _, option := range options {\n\t\tif i, ok := option.(iface); ok {\n\t\t\tvalue = i.GetDisableHTTPS()\n\t\t\tfound = true\n\t\t\tbreak\n\t\t}\n\t}\n\treturn value, found\n}\n\n// GetResolvedRegion takes a service's EndpointResolverOptions and returns the ResolvedRegion value.\n// Returns boolean false if the provided options does not have a method to retrieve the ResolvedRegion.\nfunc GetResolvedRegion(options ...interface{}) (value string, found bool) {\n\ttype iface interface {\n\t\tGetResolvedRegion() string\n\t}\n\tfor _, option := range options {\n\t\tif i, ok := option.(iface); ok {\n\t\t\tvalue = i.GetResolvedRegion()\n\t\t\tfound = true\n\t\t\tbreak\n\t\t}\n\t}\n\treturn value, found\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/errors.go",
    "content": "package aws\n\n// MissingRegionError is an error that is returned if region configuration\n// value was not found.\ntype MissingRegionError struct{}\n\nfunc (*MissingRegionError) Error() string {\n\treturn \"an AWS region is required, but was not found\"\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/from_ptr.go",
    "content": "// Code generated by aws/generate.go DO NOT EDIT.\n\npackage aws\n\nimport (\n\t\"github.com/aws/smithy-go/ptr\"\n\t\"time\"\n)\n\n// ToBool returns bool value dereferenced if the passed\n// in pointer was not nil. Returns a bool zero value if the\n// pointer was nil.\nfunc ToBool(p *bool) (v bool) {\n\treturn ptr.ToBool(p)\n}\n\n// ToBoolSlice returns a slice of bool values, that are\n// dereferenced if the passed in pointer was not nil. Returns a bool\n// zero value if the pointer was nil.\nfunc ToBoolSlice(vs []*bool) []bool {\n\treturn ptr.ToBoolSlice(vs)\n}\n\n// ToBoolMap returns a map of bool values, that are\n// dereferenced if the passed in pointer was not nil. The bool\n// zero value is used if the pointer was nil.\nfunc ToBoolMap(vs map[string]*bool) map[string]bool {\n\treturn ptr.ToBoolMap(vs)\n}\n\n// ToByte returns byte value dereferenced if the passed\n// in pointer was not nil. Returns a byte zero value if the\n// pointer was nil.\nfunc ToByte(p *byte) (v byte) {\n\treturn ptr.ToByte(p)\n}\n\n// ToByteSlice returns a slice of byte values, that are\n// dereferenced if the passed in pointer was not nil. Returns a byte\n// zero value if the pointer was nil.\nfunc ToByteSlice(vs []*byte) []byte {\n\treturn ptr.ToByteSlice(vs)\n}\n\n// ToByteMap returns a map of byte values, that are\n// dereferenced if the passed in pointer was not nil. The byte\n// zero value is used if the pointer was nil.\nfunc ToByteMap(vs map[string]*byte) map[string]byte {\n\treturn ptr.ToByteMap(vs)\n}\n\n// ToString returns string value dereferenced if the passed\n// in pointer was not nil. Returns a string zero value if the\n// pointer was nil.\nfunc ToString(p *string) (v string) {\n\treturn ptr.ToString(p)\n}\n\n// ToStringSlice returns a slice of string values, that are\n// dereferenced if the passed in pointer was not nil. Returns a string\n// zero value if the pointer was nil.\nfunc ToStringSlice(vs []*string) []string {\n\treturn ptr.ToStringSlice(vs)\n}\n\n// ToStringMap returns a map of string values, that are\n// dereferenced if the passed in pointer was not nil. The string\n// zero value is used if the pointer was nil.\nfunc ToStringMap(vs map[string]*string) map[string]string {\n\treturn ptr.ToStringMap(vs)\n}\n\n// ToInt returns int value dereferenced if the passed\n// in pointer was not nil. Returns a int zero value if the\n// pointer was nil.\nfunc ToInt(p *int) (v int) {\n\treturn ptr.ToInt(p)\n}\n\n// ToIntSlice returns a slice of int values, that are\n// dereferenced if the passed in pointer was not nil. Returns a int\n// zero value if the pointer was nil.\nfunc ToIntSlice(vs []*int) []int {\n\treturn ptr.ToIntSlice(vs)\n}\n\n// ToIntMap returns a map of int values, that are\n// dereferenced if the passed in pointer was not nil. The int\n// zero value is used if the pointer was nil.\nfunc ToIntMap(vs map[string]*int) map[string]int {\n\treturn ptr.ToIntMap(vs)\n}\n\n// ToInt8 returns int8 value dereferenced if the passed\n// in pointer was not nil. Returns a int8 zero value if the\n// pointer was nil.\nfunc ToInt8(p *int8) (v int8) {\n\treturn ptr.ToInt8(p)\n}\n\n// ToInt8Slice returns a slice of int8 values, that are\n// dereferenced if the passed in pointer was not nil. Returns a int8\n// zero value if the pointer was nil.\nfunc ToInt8Slice(vs []*int8) []int8 {\n\treturn ptr.ToInt8Slice(vs)\n}\n\n// ToInt8Map returns a map of int8 values, that are\n// dereferenced if the passed in pointer was not nil. The int8\n// zero value is used if the pointer was nil.\nfunc ToInt8Map(vs map[string]*int8) map[string]int8 {\n\treturn ptr.ToInt8Map(vs)\n}\n\n// ToInt16 returns int16 value dereferenced if the passed\n// in pointer was not nil. Returns a int16 zero value if the\n// pointer was nil.\nfunc ToInt16(p *int16) (v int16) {\n\treturn ptr.ToInt16(p)\n}\n\n// ToInt16Slice returns a slice of int16 values, that are\n// dereferenced if the passed in pointer was not nil. Returns a int16\n// zero value if the pointer was nil.\nfunc ToInt16Slice(vs []*int16) []int16 {\n\treturn ptr.ToInt16Slice(vs)\n}\n\n// ToInt16Map returns a map of int16 values, that are\n// dereferenced if the passed in pointer was not nil. The int16\n// zero value is used if the pointer was nil.\nfunc ToInt16Map(vs map[string]*int16) map[string]int16 {\n\treturn ptr.ToInt16Map(vs)\n}\n\n// ToInt32 returns int32 value dereferenced if the passed\n// in pointer was not nil. Returns a int32 zero value if the\n// pointer was nil.\nfunc ToInt32(p *int32) (v int32) {\n\treturn ptr.ToInt32(p)\n}\n\n// ToInt32Slice returns a slice of int32 values, that are\n// dereferenced if the passed in pointer was not nil. Returns a int32\n// zero value if the pointer was nil.\nfunc ToInt32Slice(vs []*int32) []int32 {\n\treturn ptr.ToInt32Slice(vs)\n}\n\n// ToInt32Map returns a map of int32 values, that are\n// dereferenced if the passed in pointer was not nil. The int32\n// zero value is used if the pointer was nil.\nfunc ToInt32Map(vs map[string]*int32) map[string]int32 {\n\treturn ptr.ToInt32Map(vs)\n}\n\n// ToInt64 returns int64 value dereferenced if the passed\n// in pointer was not nil. Returns a int64 zero value if the\n// pointer was nil.\nfunc ToInt64(p *int64) (v int64) {\n\treturn ptr.ToInt64(p)\n}\n\n// ToInt64Slice returns a slice of int64 values, that are\n// dereferenced if the passed in pointer was not nil. Returns a int64\n// zero value if the pointer was nil.\nfunc ToInt64Slice(vs []*int64) []int64 {\n\treturn ptr.ToInt64Slice(vs)\n}\n\n// ToInt64Map returns a map of int64 values, that are\n// dereferenced if the passed in pointer was not nil. The int64\n// zero value is used if the pointer was nil.\nfunc ToInt64Map(vs map[string]*int64) map[string]int64 {\n\treturn ptr.ToInt64Map(vs)\n}\n\n// ToUint returns uint value dereferenced if the passed\n// in pointer was not nil. Returns a uint zero value if the\n// pointer was nil.\nfunc ToUint(p *uint) (v uint) {\n\treturn ptr.ToUint(p)\n}\n\n// ToUintSlice returns a slice of uint values, that are\n// dereferenced if the passed in pointer was not nil. Returns a uint\n// zero value if the pointer was nil.\nfunc ToUintSlice(vs []*uint) []uint {\n\treturn ptr.ToUintSlice(vs)\n}\n\n// ToUintMap returns a map of uint values, that are\n// dereferenced if the passed in pointer was not nil. The uint\n// zero value is used if the pointer was nil.\nfunc ToUintMap(vs map[string]*uint) map[string]uint {\n\treturn ptr.ToUintMap(vs)\n}\n\n// ToUint8 returns uint8 value dereferenced if the passed\n// in pointer was not nil. Returns a uint8 zero value if the\n// pointer was nil.\nfunc ToUint8(p *uint8) (v uint8) {\n\treturn ptr.ToUint8(p)\n}\n\n// ToUint8Slice returns a slice of uint8 values, that are\n// dereferenced if the passed in pointer was not nil. Returns a uint8\n// zero value if the pointer was nil.\nfunc ToUint8Slice(vs []*uint8) []uint8 {\n\treturn ptr.ToUint8Slice(vs)\n}\n\n// ToUint8Map returns a map of uint8 values, that are\n// dereferenced if the passed in pointer was not nil. The uint8\n// zero value is used if the pointer was nil.\nfunc ToUint8Map(vs map[string]*uint8) map[string]uint8 {\n\treturn ptr.ToUint8Map(vs)\n}\n\n// ToUint16 returns uint16 value dereferenced if the passed\n// in pointer was not nil. Returns a uint16 zero value if the\n// pointer was nil.\nfunc ToUint16(p *uint16) (v uint16) {\n\treturn ptr.ToUint16(p)\n}\n\n// ToUint16Slice returns a slice of uint16 values, that are\n// dereferenced if the passed in pointer was not nil. Returns a uint16\n// zero value if the pointer was nil.\nfunc ToUint16Slice(vs []*uint16) []uint16 {\n\treturn ptr.ToUint16Slice(vs)\n}\n\n// ToUint16Map returns a map of uint16 values, that are\n// dereferenced if the passed in pointer was not nil. The uint16\n// zero value is used if the pointer was nil.\nfunc ToUint16Map(vs map[string]*uint16) map[string]uint16 {\n\treturn ptr.ToUint16Map(vs)\n}\n\n// ToUint32 returns uint32 value dereferenced if the passed\n// in pointer was not nil. Returns a uint32 zero value if the\n// pointer was nil.\nfunc ToUint32(p *uint32) (v uint32) {\n\treturn ptr.ToUint32(p)\n}\n\n// ToUint32Slice returns a slice of uint32 values, that are\n// dereferenced if the passed in pointer was not nil. Returns a uint32\n// zero value if the pointer was nil.\nfunc ToUint32Slice(vs []*uint32) []uint32 {\n\treturn ptr.ToUint32Slice(vs)\n}\n\n// ToUint32Map returns a map of uint32 values, that are\n// dereferenced if the passed in pointer was not nil. The uint32\n// zero value is used if the pointer was nil.\nfunc ToUint32Map(vs map[string]*uint32) map[string]uint32 {\n\treturn ptr.ToUint32Map(vs)\n}\n\n// ToUint64 returns uint64 value dereferenced if the passed\n// in pointer was not nil. Returns a uint64 zero value if the\n// pointer was nil.\nfunc ToUint64(p *uint64) (v uint64) {\n\treturn ptr.ToUint64(p)\n}\n\n// ToUint64Slice returns a slice of uint64 values, that are\n// dereferenced if the passed in pointer was not nil. Returns a uint64\n// zero value if the pointer was nil.\nfunc ToUint64Slice(vs []*uint64) []uint64 {\n\treturn ptr.ToUint64Slice(vs)\n}\n\n// ToUint64Map returns a map of uint64 values, that are\n// dereferenced if the passed in pointer was not nil. The uint64\n// zero value is used if the pointer was nil.\nfunc ToUint64Map(vs map[string]*uint64) map[string]uint64 {\n\treturn ptr.ToUint64Map(vs)\n}\n\n// ToFloat32 returns float32 value dereferenced if the passed\n// in pointer was not nil. Returns a float32 zero value if the\n// pointer was nil.\nfunc ToFloat32(p *float32) (v float32) {\n\treturn ptr.ToFloat32(p)\n}\n\n// ToFloat32Slice returns a slice of float32 values, that are\n// dereferenced if the passed in pointer was not nil. Returns a float32\n// zero value if the pointer was nil.\nfunc ToFloat32Slice(vs []*float32) []float32 {\n\treturn ptr.ToFloat32Slice(vs)\n}\n\n// ToFloat32Map returns a map of float32 values, that are\n// dereferenced if the passed in pointer was not nil. The float32\n// zero value is used if the pointer was nil.\nfunc ToFloat32Map(vs map[string]*float32) map[string]float32 {\n\treturn ptr.ToFloat32Map(vs)\n}\n\n// ToFloat64 returns float64 value dereferenced if the passed\n// in pointer was not nil. Returns a float64 zero value if the\n// pointer was nil.\nfunc ToFloat64(p *float64) (v float64) {\n\treturn ptr.ToFloat64(p)\n}\n\n// ToFloat64Slice returns a slice of float64 values, that are\n// dereferenced if the passed in pointer was not nil. Returns a float64\n// zero value if the pointer was nil.\nfunc ToFloat64Slice(vs []*float64) []float64 {\n\treturn ptr.ToFloat64Slice(vs)\n}\n\n// ToFloat64Map returns a map of float64 values, that are\n// dereferenced if the passed in pointer was not nil. The float64\n// zero value is used if the pointer was nil.\nfunc ToFloat64Map(vs map[string]*float64) map[string]float64 {\n\treturn ptr.ToFloat64Map(vs)\n}\n\n// ToTime returns time.Time value dereferenced if the passed\n// in pointer was not nil. Returns a time.Time zero value if the\n// pointer was nil.\nfunc ToTime(p *time.Time) (v time.Time) {\n\treturn ptr.ToTime(p)\n}\n\n// ToTimeSlice returns a slice of time.Time values, that are\n// dereferenced if the passed in pointer was not nil. Returns a time.Time\n// zero value if the pointer was nil.\nfunc ToTimeSlice(vs []*time.Time) []time.Time {\n\treturn ptr.ToTimeSlice(vs)\n}\n\n// ToTimeMap returns a map of time.Time values, that are\n// dereferenced if the passed in pointer was not nil. The time.Time\n// zero value is used if the pointer was nil.\nfunc ToTimeMap(vs map[string]*time.Time) map[string]time.Time {\n\treturn ptr.ToTimeMap(vs)\n}\n\n// ToDuration returns time.Duration value dereferenced if the passed\n// in pointer was not nil. Returns a time.Duration zero value if the\n// pointer was nil.\nfunc ToDuration(p *time.Duration) (v time.Duration) {\n\treturn ptr.ToDuration(p)\n}\n\n// ToDurationSlice returns a slice of time.Duration values, that are\n// dereferenced if the passed in pointer was not nil. Returns a time.Duration\n// zero value if the pointer was nil.\nfunc ToDurationSlice(vs []*time.Duration) []time.Duration {\n\treturn ptr.ToDurationSlice(vs)\n}\n\n// ToDurationMap returns a map of time.Duration values, that are\n// dereferenced if the passed in pointer was not nil. The time.Duration\n// zero value is used if the pointer was nil.\nfunc ToDurationMap(vs map[string]*time.Duration) map[string]time.Duration {\n\treturn ptr.ToDurationMap(vs)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go",
    "content": "// Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT.\n\npackage aws\n\n// goModuleVersion is the tagged release for this module\nconst goModuleVersion = \"1.36.3\"\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/logging.go",
    "content": "// Code generated by aws/logging_generate.go DO NOT EDIT.\n\npackage aws\n\n// ClientLogMode represents the logging mode of SDK clients. The client logging mode is a bit-field where\n// each bit is a flag that describes the logging behavior for one or more client components.\n// The entire 64-bit group is reserved for later expansion by the SDK.\n//\n// Example: Setting ClientLogMode to enable logging of retries and requests\n//\n//\tclientLogMode := aws.LogRetries | aws.LogRequest\n//\n// Example: Adding an additional log mode to an existing ClientLogMode value\n//\n//\tclientLogMode |= aws.LogResponse\ntype ClientLogMode uint64\n\n// Supported ClientLogMode bits that can be configured to toggle logging of specific SDK events.\nconst (\n\tLogSigning ClientLogMode = 1 << (64 - 1 - iota)\n\tLogRetries\n\tLogRequest\n\tLogRequestWithBody\n\tLogResponse\n\tLogResponseWithBody\n\tLogDeprecatedUsage\n\tLogRequestEventMessage\n\tLogResponseEventMessage\n)\n\n// IsSigning returns whether the Signing logging mode bit is set\nfunc (m ClientLogMode) IsSigning() bool {\n\treturn m&LogSigning != 0\n}\n\n// IsRetries returns whether the Retries logging mode bit is set\nfunc (m ClientLogMode) IsRetries() bool {\n\treturn m&LogRetries != 0\n}\n\n// IsRequest returns whether the Request logging mode bit is set\nfunc (m ClientLogMode) IsRequest() bool {\n\treturn m&LogRequest != 0\n}\n\n// IsRequestWithBody returns whether the RequestWithBody logging mode bit is set\nfunc (m ClientLogMode) IsRequestWithBody() bool {\n\treturn m&LogRequestWithBody != 0\n}\n\n// IsResponse returns whether the Response logging mode bit is set\nfunc (m ClientLogMode) IsResponse() bool {\n\treturn m&LogResponse != 0\n}\n\n// IsResponseWithBody returns whether the ResponseWithBody logging mode bit is set\nfunc (m ClientLogMode) IsResponseWithBody() bool {\n\treturn m&LogResponseWithBody != 0\n}\n\n// IsDeprecatedUsage returns whether the DeprecatedUsage logging mode bit is set\nfunc (m ClientLogMode) IsDeprecatedUsage() bool {\n\treturn m&LogDeprecatedUsage != 0\n}\n\n// IsRequestEventMessage returns whether the RequestEventMessage logging mode bit is set\nfunc (m ClientLogMode) IsRequestEventMessage() bool {\n\treturn m&LogRequestEventMessage != 0\n}\n\n// IsResponseEventMessage returns whether the ResponseEventMessage logging mode bit is set\nfunc (m ClientLogMode) IsResponseEventMessage() bool {\n\treturn m&LogResponseEventMessage != 0\n}\n\n// ClearSigning clears the Signing logging mode bit\nfunc (m *ClientLogMode) ClearSigning() {\n\t*m &^= LogSigning\n}\n\n// ClearRetries clears the Retries logging mode bit\nfunc (m *ClientLogMode) ClearRetries() {\n\t*m &^= LogRetries\n}\n\n// ClearRequest clears the Request logging mode bit\nfunc (m *ClientLogMode) ClearRequest() {\n\t*m &^= LogRequest\n}\n\n// ClearRequestWithBody clears the RequestWithBody logging mode bit\nfunc (m *ClientLogMode) ClearRequestWithBody() {\n\t*m &^= LogRequestWithBody\n}\n\n// ClearResponse clears the Response logging mode bit\nfunc (m *ClientLogMode) ClearResponse() {\n\t*m &^= LogResponse\n}\n\n// ClearResponseWithBody clears the ResponseWithBody logging mode bit\nfunc (m *ClientLogMode) ClearResponseWithBody() {\n\t*m &^= LogResponseWithBody\n}\n\n// ClearDeprecatedUsage clears the DeprecatedUsage logging mode bit\nfunc (m *ClientLogMode) ClearDeprecatedUsage() {\n\t*m &^= LogDeprecatedUsage\n}\n\n// ClearRequestEventMessage clears the RequestEventMessage logging mode bit\nfunc (m *ClientLogMode) ClearRequestEventMessage() {\n\t*m &^= LogRequestEventMessage\n}\n\n// ClearResponseEventMessage clears the ResponseEventMessage logging mode bit\nfunc (m *ClientLogMode) ClearResponseEventMessage() {\n\t*m &^= LogResponseEventMessage\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/logging_generate.go",
    "content": "//go:build clientlogmode\n// +build clientlogmode\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"strings\"\n\t\"text/template\"\n)\n\nvar config = struct {\n\tModeBits []string\n}{\n\t// Items should be appended only to keep bit-flag positions stable\n\tModeBits: []string{\n\t\t\"Signing\",\n\t\t\"Retries\",\n\t\t\"Request\",\n\t\t\"RequestWithBody\",\n\t\t\"Response\",\n\t\t\"ResponseWithBody\",\n\t\t\"DeprecatedUsage\",\n\t\t\"RequestEventMessage\",\n\t\t\"ResponseEventMessage\",\n\t},\n}\n\nfunc bitName(name string) string {\n\treturn strings.ToUpper(name[:1]) + name[1:]\n}\n\nvar tmpl = template.Must(template.New(\"ClientLogMode\").Funcs(map[string]interface{}{\n\t\"symbolName\": func(name string) string {\n\t\treturn \"Log\" + bitName(name)\n\t},\n\t\"bitName\": bitName,\n}).Parse(`// Code generated by aws/logging_generate.go DO NOT EDIT.\n\npackage aws\n\n// ClientLogMode represents the logging mode of SDK clients. The client logging mode is a bit-field where\n// each bit is a flag that describes the logging behavior for one or more client components.\n// The entire 64-bit group is reserved for later expansion by the SDK.\n//\n// Example: Setting ClientLogMode to enable logging of retries and requests\n//  clientLogMode := aws.LogRetries | aws.LogRequest\n//\n// Example: Adding an additional log mode to an existing ClientLogMode value\n//  clientLogMode |= aws.LogResponse\ntype ClientLogMode uint64\n\n// Supported ClientLogMode bits that can be configured to toggle logging of specific SDK events.\nconst (\n{{- range $index, $field := .ModeBits }}\n\t{{ (symbolName $field) }}{{- if (eq 0 $index) }} ClientLogMode = 1 << (64 - 1 - iota){{- end }}\n{{- end }}\n)\n{{ range $_, $field := .ModeBits }}\n// Is{{- bitName $field }} returns whether the {{ bitName $field }} logging mode bit is set\nfunc (m ClientLogMode) Is{{- bitName $field }}() bool {\n\treturn m&{{- (symbolName $field) }} != 0\n}\n{{ end }}\n{{- range $_, $field := .ModeBits }}\n// Clear{{- bitName $field }} clears the {{ bitName $field }} logging mode bit\nfunc (m *ClientLogMode) Clear{{- bitName $field }}() {\n\t*m &^= {{ (symbolName $field) }}\n}\n{{ end -}}\n`))\n\nfunc main() {\n\tuniqueBitFields := make(map[string]struct{})\n\n\tfor _, bitName := range config.ModeBits {\n\t\tif _, ok := uniqueBitFields[strings.ToLower(bitName)]; ok {\n\t\t\tpanic(fmt.Sprintf(\"duplicate bit field: %s\", bitName))\n\t\t}\n\t\tuniqueBitFields[bitName] = struct{}{}\n\t}\n\n\tfile, err := os.Create(\"logging.go\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer file.Close()\n\n\terr = tmpl.Execute(file, config)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/metadata.go",
    "content": "package middleware\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\n// RegisterServiceMetadata registers metadata about the service and operation into the middleware context\n// so that it is available at runtime for other middleware to introspect.\ntype RegisterServiceMetadata struct {\n\tServiceID     string\n\tSigningName   string\n\tRegion        string\n\tOperationName string\n}\n\n// ID returns the middleware identifier.\nfunc (s *RegisterServiceMetadata) ID() string {\n\treturn \"RegisterServiceMetadata\"\n}\n\n// HandleInitialize registers service metadata information into the middleware context, allowing for introspection.\nfunc (s RegisterServiceMetadata) HandleInitialize(\n\tctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler,\n) (out middleware.InitializeOutput, metadata middleware.Metadata, err error) {\n\tif len(s.ServiceID) > 0 {\n\t\tctx = SetServiceID(ctx, s.ServiceID)\n\t}\n\tif len(s.SigningName) > 0 {\n\t\tctx = SetSigningName(ctx, s.SigningName)\n\t}\n\tif len(s.Region) > 0 {\n\t\tctx = setRegion(ctx, s.Region)\n\t}\n\tif len(s.OperationName) > 0 {\n\t\tctx = setOperationName(ctx, s.OperationName)\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\n// service metadata keys for storing and lookup of runtime stack information.\ntype (\n\tserviceIDKey               struct{}\n\tsigningNameKey             struct{}\n\tsigningRegionKey           struct{}\n\tregionKey                  struct{}\n\toperationNameKey           struct{}\n\tpartitionIDKey             struct{}\n\trequiresLegacyEndpointsKey struct{}\n)\n\n// GetServiceID retrieves the service id from the context.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc GetServiceID(ctx context.Context) (v string) {\n\tv, _ = middleware.GetStackValue(ctx, serviceIDKey{}).(string)\n\treturn v\n}\n\n// GetSigningName retrieves the service signing name from the context.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\n//\n// Deprecated: This value is unstable. The resolved signing name is available\n// in the signer properties object passed to the signer.\nfunc GetSigningName(ctx context.Context) (v string) {\n\tv, _ = middleware.GetStackValue(ctx, signingNameKey{}).(string)\n\treturn v\n}\n\n// GetSigningRegion retrieves the region from the context.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\n//\n// Deprecated: This value is unstable. The resolved signing region is available\n// in the signer properties object passed to the signer.\nfunc GetSigningRegion(ctx context.Context) (v string) {\n\tv, _ = middleware.GetStackValue(ctx, signingRegionKey{}).(string)\n\treturn v\n}\n\n// GetRegion retrieves the endpoint region from the context.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc GetRegion(ctx context.Context) (v string) {\n\tv, _ = middleware.GetStackValue(ctx, regionKey{}).(string)\n\treturn v\n}\n\n// GetOperationName retrieves the service operation metadata from the context.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc GetOperationName(ctx context.Context) (v string) {\n\tv, _ = middleware.GetStackValue(ctx, operationNameKey{}).(string)\n\treturn v\n}\n\n// GetPartitionID retrieves the endpoint partition id from the context.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc GetPartitionID(ctx context.Context) string {\n\tv, _ := middleware.GetStackValue(ctx, partitionIDKey{}).(string)\n\treturn v\n}\n\n// GetRequiresLegacyEndpoints the flag used to indicate if legacy endpoint\n// customizations need to be executed.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc GetRequiresLegacyEndpoints(ctx context.Context) bool {\n\tv, _ := middleware.GetStackValue(ctx, requiresLegacyEndpointsKey{}).(bool)\n\treturn v\n}\n\n// SetRequiresLegacyEndpoints set or modifies the flag indicated that\n// legacy endpoint customizations are needed.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc SetRequiresLegacyEndpoints(ctx context.Context, value bool) context.Context {\n\treturn middleware.WithStackValue(ctx, requiresLegacyEndpointsKey{}, value)\n}\n\n// SetSigningName set or modifies the sigv4 or sigv4a signing name on the context.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\n//\n// Deprecated: This value is unstable. Use WithSigV4SigningName client option\n// funcs instead.\nfunc SetSigningName(ctx context.Context, value string) context.Context {\n\treturn middleware.WithStackValue(ctx, signingNameKey{}, value)\n}\n\n// SetSigningRegion sets or modifies the region on the context.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\n//\n// Deprecated: This value is unstable. Use WithSigV4SigningRegion client option\n// funcs instead.\nfunc SetSigningRegion(ctx context.Context, value string) context.Context {\n\treturn middleware.WithStackValue(ctx, signingRegionKey{}, value)\n}\n\n// SetServiceID sets the service id on the context.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc SetServiceID(ctx context.Context, value string) context.Context {\n\treturn middleware.WithStackValue(ctx, serviceIDKey{}, value)\n}\n\n// setRegion sets the endpoint region on the context.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc setRegion(ctx context.Context, value string) context.Context {\n\treturn middleware.WithStackValue(ctx, regionKey{}, value)\n}\n\n// setOperationName sets the service operation on the context.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc setOperationName(ctx context.Context, value string) context.Context {\n\treturn middleware.WithStackValue(ctx, operationNameKey{}, value)\n}\n\n// SetPartitionID sets the partition id of a resolved region on the context\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc SetPartitionID(ctx context.Context, value string) context.Context {\n\treturn middleware.WithStackValue(ctx, partitionIDKey{}, value)\n}\n\n// EndpointSource key\ntype endpointSourceKey struct{}\n\n// GetEndpointSource returns an endpoint source if set on context\nfunc GetEndpointSource(ctx context.Context) (v aws.EndpointSource) {\n\tv, _ = middleware.GetStackValue(ctx, endpointSourceKey{}).(aws.EndpointSource)\n\treturn v\n}\n\n// SetEndpointSource sets endpoint source on context\nfunc SetEndpointSource(ctx context.Context, value aws.EndpointSource) context.Context {\n\treturn middleware.WithStackValue(ctx, endpointSourceKey{}, value)\n}\n\ntype signingCredentialsKey struct{}\n\n// GetSigningCredentials returns the credentials that were used for signing if set on context.\nfunc GetSigningCredentials(ctx context.Context) (v aws.Credentials) {\n\tv, _ = middleware.GetStackValue(ctx, signingCredentialsKey{}).(aws.Credentials)\n\treturn v\n}\n\n// SetSigningCredentials sets the credentails used for signing on the context.\nfunc SetSigningCredentials(ctx context.Context, value aws.Credentials) context.Context {\n\treturn middleware.WithStackValue(ctx, signingCredentialsKey{}, value)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/middleware.go",
    "content": "package middleware\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/internal/rand\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/sdk\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyrand \"github.com/aws/smithy-go/rand\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// ClientRequestID is a Smithy BuildMiddleware that will generate a unique ID for logical API operation\n// invocation.\ntype ClientRequestID struct{}\n\n// ID the identifier for the ClientRequestID\nfunc (r *ClientRequestID) ID() string {\n\treturn \"ClientRequestID\"\n}\n\n// HandleBuild attaches a unique operation invocation id for the operation to the request\nfunc (r ClientRequestID) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (\n\tout middleware.BuildOutput, metadata middleware.Metadata, err error,\n) {\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type %T\", req)\n\t}\n\n\tinvocationID, err := smithyrand.NewUUID(rand.Reader).GetUUID()\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\tconst invocationIDHeader = \"Amz-Sdk-Invocation-Id\"\n\treq.Header[invocationIDHeader] = append(req.Header[invocationIDHeader][:0], invocationID)\n\n\treturn next.HandleBuild(ctx, in)\n}\n\n// RecordResponseTiming records the response timing for the SDK client requests.\ntype RecordResponseTiming struct{}\n\n// ID is the middleware identifier\nfunc (a *RecordResponseTiming) ID() string {\n\treturn \"RecordResponseTiming\"\n}\n\n// HandleDeserialize calculates response metadata and clock skew\nfunc (a RecordResponseTiming) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tresponseAt := sdk.NowTime()\n\tsetResponseAt(&metadata, responseAt)\n\n\tvar serverTime time.Time\n\n\tswitch resp := out.RawResponse.(type) {\n\tcase *smithyhttp.Response:\n\t\trespDateHeader := resp.Header.Get(\"Date\")\n\t\tif len(respDateHeader) == 0 {\n\t\t\tbreak\n\t\t}\n\t\tvar parseErr error\n\t\tserverTime, parseErr = smithyhttp.ParseTime(respDateHeader)\n\t\tif parseErr != nil {\n\t\t\tlogger := middleware.GetLogger(ctx)\n\t\t\tlogger.Logf(logging.Warn, \"failed to parse response Date header value, got %v\",\n\t\t\t\tparseErr.Error())\n\t\t\tbreak\n\t\t}\n\t\tsetServerTime(&metadata, serverTime)\n\t}\n\n\tif !serverTime.IsZero() {\n\t\tattemptSkew := serverTime.Sub(responseAt)\n\t\tsetAttemptSkew(&metadata, attemptSkew)\n\t}\n\n\treturn out, metadata, err\n}\n\ntype responseAtKey struct{}\n\n// GetResponseAt returns the time response was received at.\nfunc GetResponseAt(metadata middleware.Metadata) (v time.Time, ok bool) {\n\tv, ok = metadata.Get(responseAtKey{}).(time.Time)\n\treturn v, ok\n}\n\n// setResponseAt sets the response time on the metadata.\nfunc setResponseAt(metadata *middleware.Metadata, v time.Time) {\n\tmetadata.Set(responseAtKey{}, v)\n}\n\ntype serverTimeKey struct{}\n\n// GetServerTime returns the server time for response.\nfunc GetServerTime(metadata middleware.Metadata) (v time.Time, ok bool) {\n\tv, ok = metadata.Get(serverTimeKey{}).(time.Time)\n\treturn v, ok\n}\n\n// setServerTime sets the server time on the metadata.\nfunc setServerTime(metadata *middleware.Metadata, v time.Time) {\n\tmetadata.Set(serverTimeKey{}, v)\n}\n\ntype attemptSkewKey struct{}\n\n// GetAttemptSkew returns Attempt clock skew for response from metadata.\nfunc GetAttemptSkew(metadata middleware.Metadata) (v time.Duration, ok bool) {\n\tv, ok = metadata.Get(attemptSkewKey{}).(time.Duration)\n\treturn v, ok\n}\n\n// setAttemptSkew sets the attempt clock skew on the metadata.\nfunc setAttemptSkew(metadata *middleware.Metadata, v time.Duration) {\n\tmetadata.Set(attemptSkewKey{}, v)\n}\n\n// AddClientRequestIDMiddleware adds ClientRequestID to the middleware stack\nfunc AddClientRequestIDMiddleware(stack *middleware.Stack) error {\n\treturn stack.Build.Add(&ClientRequestID{}, middleware.After)\n}\n\n// AddRecordResponseTiming adds RecordResponseTiming middleware to the\n// middleware stack.\nfunc AddRecordResponseTiming(stack *middleware.Stack) error {\n\treturn stack.Deserialize.Add(&RecordResponseTiming{}, middleware.After)\n}\n\n// rawResponseKey is the accessor key used to store and access the\n// raw response within the response metadata.\ntype rawResponseKey struct{}\n\n// AddRawResponse middleware adds raw response on to the metadata\ntype AddRawResponse struct{}\n\n// ID the identifier for the ClientRequestID\nfunc (m *AddRawResponse) ID() string {\n\treturn \"AddRawResponseToMetadata\"\n}\n\n// HandleDeserialize adds raw response on the middleware metadata\nfunc (m AddRawResponse) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tmetadata.Set(rawResponseKey{}, out.RawResponse)\n\treturn out, metadata, err\n}\n\n// AddRawResponseToMetadata adds middleware to the middleware stack that\n// store raw response on to the metadata.\nfunc AddRawResponseToMetadata(stack *middleware.Stack) error {\n\treturn stack.Deserialize.Add(&AddRawResponse{}, middleware.Before)\n}\n\n// GetRawResponse returns raw response set on metadata\nfunc GetRawResponse(metadata middleware.Metadata) interface{} {\n\treturn metadata.Get(rawResponseKey{})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/osname.go",
    "content": "//go:build go1.16\n// +build go1.16\n\npackage middleware\n\nimport \"runtime\"\n\nfunc getNormalizedOSName() (os string) {\n\tswitch runtime.GOOS {\n\tcase \"android\":\n\t\tos = \"android\"\n\tcase \"linux\":\n\t\tos = \"linux\"\n\tcase \"windows\":\n\t\tos = \"windows\"\n\tcase \"darwin\":\n\t\tos = \"macos\"\n\tcase \"ios\":\n\t\tos = \"ios\"\n\tdefault:\n\t\tos = \"other\"\n\t}\n\treturn os\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/osname_go115.go",
    "content": "//go:build !go1.16\n// +build !go1.16\n\npackage middleware\n\nimport \"runtime\"\n\nfunc getNormalizedOSName() (os string) {\n\tswitch runtime.GOOS {\n\tcase \"android\":\n\t\tos = \"android\"\n\tcase \"linux\":\n\t\tos = \"linux\"\n\tcase \"windows\":\n\t\tos = \"windows\"\n\tcase \"darwin\":\n\t\t// Due to Apple M1 we can't distinguish between macOS and iOS when GOOS/GOARCH is darwin/amd64\n\t\t// For now declare this as \"other\" until we have a better detection mechanism.\n\t\tfallthrough\n\tdefault:\n\t\tos = \"other\"\n\t}\n\treturn os\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/recursion_detection.go",
    "content": "package middleware\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"os\"\n)\n\nconst envAwsLambdaFunctionName = \"AWS_LAMBDA_FUNCTION_NAME\"\nconst envAmznTraceID = \"_X_AMZN_TRACE_ID\"\nconst amznTraceIDHeader = \"X-Amzn-Trace-Id\"\n\n// AddRecursionDetection adds recursionDetection to the middleware stack\nfunc AddRecursionDetection(stack *middleware.Stack) error {\n\treturn stack.Build.Add(&RecursionDetection{}, middleware.After)\n}\n\n// RecursionDetection detects Lambda environment and sets its X-Ray trace ID to request header if absent\n// to avoid recursion invocation in Lambda\ntype RecursionDetection struct{}\n\n// ID returns the middleware identifier\nfunc (m *RecursionDetection) ID() string {\n\treturn \"RecursionDetection\"\n}\n\n// HandleBuild detects Lambda environment and adds its trace ID to request header if absent\nfunc (m *RecursionDetection) HandleBuild(\n\tctx context.Context, in middleware.BuildInput, next middleware.BuildHandler,\n) (\n\tout middleware.BuildOutput, metadata middleware.Metadata, err error,\n) {\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown request type %T\", req)\n\t}\n\n\t_, hasLambdaEnv := os.LookupEnv(envAwsLambdaFunctionName)\n\txAmznTraceID, hasTraceID := os.LookupEnv(envAmznTraceID)\n\tvalue := req.Header.Get(amznTraceIDHeader)\n\t// only set the X-Amzn-Trace-Id header when it is not set initially, the\n\t// current environment is Lambda and the _X_AMZN_TRACE_ID env variable exists\n\tif value != \"\" || !hasLambdaEnv || !hasTraceID {\n\t\treturn next.HandleBuild(ctx, in)\n\t}\n\n\treq.Header.Set(amznTraceIDHeader, percentEncode(xAmznTraceID))\n\treturn next.HandleBuild(ctx, in)\n}\n\nfunc percentEncode(s string) string {\n\tupperhex := \"0123456789ABCDEF\"\n\thexCount := 0\n\tfor i := 0; i < len(s); i++ {\n\t\tc := s[i]\n\t\tif shouldEncode(c) {\n\t\t\thexCount++\n\t\t}\n\t}\n\n\tif hexCount == 0 {\n\t\treturn s\n\t}\n\n\trequired := len(s) + 2*hexCount\n\tt := make([]byte, required)\n\tj := 0\n\tfor i := 0; i < len(s); i++ {\n\t\tif c := s[i]; shouldEncode(c) {\n\t\t\tt[j] = '%'\n\t\t\tt[j+1] = upperhex[c>>4]\n\t\t\tt[j+2] = upperhex[c&15]\n\t\t\tj += 3\n\t\t} else {\n\t\t\tt[j] = c\n\t\t\tj++\n\t\t}\n\t}\n\treturn string(t)\n}\n\nfunc shouldEncode(c byte) bool {\n\tif 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' {\n\t\treturn false\n\t}\n\tswitch c {\n\tcase '-', '=', ';', ':', '+', '&', '[', ']', '{', '}', '\"', '\\'', ',':\n\t\treturn false\n\tdefault:\n\t\treturn true\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/request_id.go",
    "content": "package middleware\n\nimport (\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\n// requestIDKey is used to retrieve request id from response metadata\ntype requestIDKey struct{}\n\n// SetRequestIDMetadata sets the provided request id over middleware metadata\nfunc SetRequestIDMetadata(metadata *middleware.Metadata, id string) {\n\tmetadata.Set(requestIDKey{}, id)\n}\n\n// GetRequestIDMetadata retrieves the request id from middleware metadata\n// returns string and bool indicating value of request id, whether request id was set.\nfunc GetRequestIDMetadata(metadata middleware.Metadata) (string, bool) {\n\tif !metadata.Has(requestIDKey{}) {\n\t\treturn \"\", false\n\t}\n\n\tv, ok := metadata.Get(requestIDKey{}).(string)\n\tif !ok {\n\t\treturn \"\", true\n\t}\n\treturn v, true\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/request_id_retriever.go",
    "content": "package middleware\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// AddRequestIDRetrieverMiddleware adds request id retriever middleware\nfunc AddRequestIDRetrieverMiddleware(stack *middleware.Stack) error {\n\t// add error wrapper middleware before operation deserializers so that it can wrap the error response\n\t// returned by operation deserializers\n\treturn stack.Deserialize.Insert(&RequestIDRetriever{}, \"OperationDeserializer\", middleware.Before)\n}\n\n// RequestIDRetriever middleware captures the AWS service request ID from the\n// raw response.\ntype RequestIDRetriever struct {\n}\n\n// ID returns the middleware identifier\nfunc (m *RequestIDRetriever) ID() string {\n\treturn \"RequestIDRetriever\"\n}\n\n// HandleDeserialize pulls the AWS request ID from the response, storing it in\n// operation metadata.\nfunc (m *RequestIDRetriever) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\n\tresp, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\t// No raw response to wrap with.\n\t\treturn out, metadata, err\n\t}\n\n\t// Different header which can map to request id\n\trequestIDHeaderList := []string{\"X-Amzn-Requestid\", \"X-Amz-RequestId\"}\n\n\tfor _, h := range requestIDHeaderList {\n\t\t// check for headers known to contain Request id\n\t\tif v := resp.Header.Get(h); len(v) != 0 {\n\t\t\t// set reqID on metadata for successful responses.\n\t\t\tSetRequestIDMetadata(&metadata, v)\n\n\t\t\tspan, _ := tracing.GetSpan(ctx)\n\t\t\tspan.SetProperty(\"aws.request_id\", v)\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn out, metadata, err\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/user_agent.go",
    "content": "package middleware\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"runtime\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nvar languageVersion = strings.TrimPrefix(runtime.Version(), \"go\")\n\n// SDKAgentKeyType is the metadata type to add to the SDK agent string\ntype SDKAgentKeyType int\n\n// The set of valid SDKAgentKeyType constants. If an unknown value is assigned for SDKAgentKeyType it will\n// be mapped to AdditionalMetadata.\nconst (\n\t_ SDKAgentKeyType = iota\n\tAPIMetadata\n\tOperatingSystemMetadata\n\tLanguageMetadata\n\tEnvironmentMetadata\n\tFeatureMetadata\n\tConfigMetadata\n\tFrameworkMetadata\n\tAdditionalMetadata\n\tApplicationIdentifier\n\tFeatureMetadata2\n)\n\n// Hardcoded value to specify which version of the user agent we're using\nconst uaMetadata = \"ua/2.1\"\n\nfunc (k SDKAgentKeyType) string() string {\n\tswitch k {\n\tcase APIMetadata:\n\t\treturn \"api\"\n\tcase OperatingSystemMetadata:\n\t\treturn \"os\"\n\tcase LanguageMetadata:\n\t\treturn \"lang\"\n\tcase EnvironmentMetadata:\n\t\treturn \"exec-env\"\n\tcase FeatureMetadata:\n\t\treturn \"ft\"\n\tcase ConfigMetadata:\n\t\treturn \"cfg\"\n\tcase FrameworkMetadata:\n\t\treturn \"lib\"\n\tcase ApplicationIdentifier:\n\t\treturn \"app\"\n\tcase FeatureMetadata2:\n\t\treturn \"m\"\n\tcase AdditionalMetadata:\n\t\tfallthrough\n\tdefault:\n\t\treturn \"md\"\n\t}\n}\n\nconst execEnvVar = `AWS_EXECUTION_ENV`\n\nvar validChars = map[rune]bool{\n\t'!': true, '#': true, '$': true, '%': true, '&': true, '\\'': true, '*': true, '+': true,\n\t'-': true, '.': true, '^': true, '_': true, '`': true, '|': true, '~': true,\n}\n\n// UserAgentFeature enumerates tracked SDK features.\ntype UserAgentFeature string\n\n// Enumerates UserAgentFeature.\nconst (\n\tUserAgentFeatureResourceModel UserAgentFeature = \"A\" // n/a (we don't generate separate resource types)\n\n\tUserAgentFeatureWaiter    = \"B\"\n\tUserAgentFeaturePaginator = \"C\"\n\n\tUserAgentFeatureRetryModeLegacy   = \"D\" // n/a (equivalent to standard)\n\tUserAgentFeatureRetryModeStandard = \"E\"\n\tUserAgentFeatureRetryModeAdaptive = \"F\"\n\n\tUserAgentFeatureS3Transfer      = \"G\"\n\tUserAgentFeatureS3CryptoV1N     = \"H\" // n/a (crypto client is external)\n\tUserAgentFeatureS3CryptoV2      = \"I\" // n/a\n\tUserAgentFeatureS3ExpressBucket = \"J\"\n\tUserAgentFeatureS3AccessGrants  = \"K\" // not yet implemented\n\n\tUserAgentFeatureGZIPRequestCompression = \"L\"\n\n\tUserAgentFeatureProtocolRPCV2CBOR = \"M\"\n\n\tUserAgentFeatureAccountIDEndpoint      = \"O\" // DO NOT IMPLEMENT: rules output is not currently defined. SDKs should not parse endpoints for feature information.\n\tUserAgentFeatureAccountIDModePreferred = \"P\"\n\tUserAgentFeatureAccountIDModeDisabled  = \"Q\"\n\tUserAgentFeatureAccountIDModeRequired  = \"R\"\n\n\tUserAgentFeatureRequestChecksumCRC32          = \"U\"\n\tUserAgentFeatureRequestChecksumCRC32C         = \"V\"\n\tUserAgentFeatureRequestChecksumCRC64          = \"W\"\n\tUserAgentFeatureRequestChecksumSHA1           = \"X\"\n\tUserAgentFeatureRequestChecksumSHA256         = \"Y\"\n\tUserAgentFeatureRequestChecksumWhenSupported  = \"Z\"\n\tUserAgentFeatureRequestChecksumWhenRequired   = \"a\"\n\tUserAgentFeatureResponseChecksumWhenSupported = \"b\"\n\tUserAgentFeatureResponseChecksumWhenRequired  = \"c\"\n\n\tUserAgentFeatureDynamoDBUserAgent = \"d\" // not yet implemented\n\n\tUserAgentFeatureCredentialsCode                 = \"e\"\n\tUserAgentFeatureCredentialsJvmSystemProperties  = \"f\" // n/a (this is not a JVM sdk)\n\tUserAgentFeatureCredentialsEnvVars              = \"g\"\n\tUserAgentFeatureCredentialsEnvVarsStsWebIDToken = \"h\"\n\tUserAgentFeatureCredentialsStsAssumeRole        = \"i\"\n\tUserAgentFeatureCredentialsStsAssumeRoleSaml    = \"j\" // not yet implemented\n\tUserAgentFeatureCredentialsStsAssumeRoleWebID   = \"k\"\n\tUserAgentFeatureCredentialsStsFederationToken   = \"l\" // not yet implemented\n\tUserAgentFeatureCredentialsStsSessionToken      = \"m\" // not yet implemented\n\tUserAgentFeatureCredentialsProfile              = \"n\"\n\tUserAgentFeatureCredentialsProfileSourceProfile = \"o\"\n\tUserAgentFeatureCredentialsProfileNamedProvider = \"p\"\n\tUserAgentFeatureCredentialsProfileStsWebIDToken = \"q\"\n\tUserAgentFeatureCredentialsProfileSso           = \"r\"\n\tUserAgentFeatureCredentialsSso                  = \"s\"\n\tUserAgentFeatureCredentialsProfileSsoLegacy     = \"t\"\n\tUserAgentFeatureCredentialsSsoLegacy            = \"u\"\n\tUserAgentFeatureCredentialsProfileProcess       = \"v\"\n\tUserAgentFeatureCredentialsProcess              = \"w\"\n\tUserAgentFeatureCredentialsBoto2ConfigFile      = \"x\" // n/a (this is not boto/Python)\n\tUserAgentFeatureCredentialsAwsSdkStore          = \"y\" // n/a (this is used by .NET based sdk)\n\tUserAgentFeatureCredentialsHTTP                 = \"z\"\n\tUserAgentFeatureCredentialsIMDS                 = \"0\"\n)\n\nvar credentialSourceToFeature = map[aws.CredentialSource]UserAgentFeature{\n\taws.CredentialSourceCode:                 UserAgentFeatureCredentialsCode,\n\taws.CredentialSourceEnvVars:              UserAgentFeatureCredentialsEnvVars,\n\taws.CredentialSourceEnvVarsSTSWebIDToken: UserAgentFeatureCredentialsEnvVarsStsWebIDToken,\n\taws.CredentialSourceSTSAssumeRole:        UserAgentFeatureCredentialsStsAssumeRole,\n\taws.CredentialSourceSTSAssumeRoleSaml:    UserAgentFeatureCredentialsStsAssumeRoleSaml,\n\taws.CredentialSourceSTSAssumeRoleWebID:   UserAgentFeatureCredentialsStsAssumeRoleWebID,\n\taws.CredentialSourceSTSFederationToken:   UserAgentFeatureCredentialsStsFederationToken,\n\taws.CredentialSourceSTSSessionToken:      UserAgentFeatureCredentialsStsSessionToken,\n\taws.CredentialSourceProfile:              UserAgentFeatureCredentialsProfile,\n\taws.CredentialSourceProfileSourceProfile: UserAgentFeatureCredentialsProfileSourceProfile,\n\taws.CredentialSourceProfileNamedProvider: UserAgentFeatureCredentialsProfileNamedProvider,\n\taws.CredentialSourceProfileSTSWebIDToken: UserAgentFeatureCredentialsProfileStsWebIDToken,\n\taws.CredentialSourceProfileSSO:           UserAgentFeatureCredentialsProfileSso,\n\taws.CredentialSourceSSO:                  UserAgentFeatureCredentialsSso,\n\taws.CredentialSourceProfileSSOLegacy:     UserAgentFeatureCredentialsProfileSsoLegacy,\n\taws.CredentialSourceSSOLegacy:            UserAgentFeatureCredentialsSsoLegacy,\n\taws.CredentialSourceProfileProcess:       UserAgentFeatureCredentialsProfileProcess,\n\taws.CredentialSourceProcess:              UserAgentFeatureCredentialsProcess,\n\taws.CredentialSourceHTTP:                 UserAgentFeatureCredentialsHTTP,\n\taws.CredentialSourceIMDS:                 UserAgentFeatureCredentialsIMDS,\n}\n\n// RequestUserAgent is a build middleware that set the User-Agent for the request.\ntype RequestUserAgent struct {\n\tsdkAgent, userAgent *smithyhttp.UserAgentBuilder\n\tfeatures            map[UserAgentFeature]struct{}\n}\n\n// NewRequestUserAgent returns a new requestUserAgent which will set the User-Agent and X-Amz-User-Agent for the\n// request.\n//\n// User-Agent example:\n//\n//\taws-sdk-go-v2/1.2.3\n//\n// X-Amz-User-Agent example:\n//\n//\taws-sdk-go-v2/1.2.3 md/GOOS/linux md/GOARCH/amd64 lang/go/1.15\nfunc NewRequestUserAgent() *RequestUserAgent {\n\tuserAgent, sdkAgent := smithyhttp.NewUserAgentBuilder(), smithyhttp.NewUserAgentBuilder()\n\taddProductName(userAgent)\n\taddUserAgentMetadata(userAgent)\n\taddProductName(sdkAgent)\n\n\tr := &RequestUserAgent{\n\t\tsdkAgent:  sdkAgent,\n\t\tuserAgent: userAgent,\n\t\tfeatures:  map[UserAgentFeature]struct{}{},\n\t}\n\n\taddSDKMetadata(r)\n\n\treturn r\n}\n\nfunc addSDKMetadata(r *RequestUserAgent) {\n\tr.AddSDKAgentKey(OperatingSystemMetadata, getNormalizedOSName())\n\tr.AddSDKAgentKeyValue(LanguageMetadata, \"go\", languageVersion)\n\tr.AddSDKAgentKeyValue(AdditionalMetadata, \"GOOS\", runtime.GOOS)\n\tr.AddSDKAgentKeyValue(AdditionalMetadata, \"GOARCH\", runtime.GOARCH)\n\tif ev := os.Getenv(execEnvVar); len(ev) > 0 {\n\t\tr.AddSDKAgentKey(EnvironmentMetadata, ev)\n\t}\n}\n\nfunc addProductName(builder *smithyhttp.UserAgentBuilder) {\n\tbuilder.AddKeyValue(aws.SDKName, aws.SDKVersion)\n}\n\nfunc addUserAgentMetadata(builder *smithyhttp.UserAgentBuilder) {\n\tbuilder.AddKey(uaMetadata)\n}\n\n// AddUserAgentKey retrieves a requestUserAgent from the provided stack, or initializes one.\nfunc AddUserAgentKey(key string) func(*middleware.Stack) error {\n\treturn func(stack *middleware.Stack) error {\n\t\trequestUserAgent, err := getOrAddRequestUserAgent(stack)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trequestUserAgent.AddUserAgentKey(key)\n\t\treturn nil\n\t}\n}\n\n// AddUserAgentKeyValue retrieves a requestUserAgent from the provided stack, or initializes one.\nfunc AddUserAgentKeyValue(key, value string) func(*middleware.Stack) error {\n\treturn func(stack *middleware.Stack) error {\n\t\trequestUserAgent, err := getOrAddRequestUserAgent(stack)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trequestUserAgent.AddUserAgentKeyValue(key, value)\n\t\treturn nil\n\t}\n}\n\n// AddSDKAgentKey retrieves a requestUserAgent from the provided stack, or initializes one.\nfunc AddSDKAgentKey(keyType SDKAgentKeyType, key string) func(*middleware.Stack) error {\n\treturn func(stack *middleware.Stack) error {\n\t\trequestUserAgent, err := getOrAddRequestUserAgent(stack)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trequestUserAgent.AddSDKAgentKey(keyType, key)\n\t\treturn nil\n\t}\n}\n\n// AddSDKAgentKeyValue retrieves a requestUserAgent from the provided stack, or initializes one.\nfunc AddSDKAgentKeyValue(keyType SDKAgentKeyType, key, value string) func(*middleware.Stack) error {\n\treturn func(stack *middleware.Stack) error {\n\t\trequestUserAgent, err := getOrAddRequestUserAgent(stack)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trequestUserAgent.AddSDKAgentKeyValue(keyType, key, value)\n\t\treturn nil\n\t}\n}\n\n// AddRequestUserAgentMiddleware registers a requestUserAgent middleware on the stack if not present.\nfunc AddRequestUserAgentMiddleware(stack *middleware.Stack) error {\n\t_, err := getOrAddRequestUserAgent(stack)\n\treturn err\n}\n\nfunc getOrAddRequestUserAgent(stack *middleware.Stack) (*RequestUserAgent, error) {\n\tid := (*RequestUserAgent)(nil).ID()\n\tbm, ok := stack.Build.Get(id)\n\tif !ok {\n\t\tbm = NewRequestUserAgent()\n\t\terr := stack.Build.Add(bm, middleware.After)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\trequestUserAgent, ok := bm.(*RequestUserAgent)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"%T for %s middleware did not match expected type\", bm, id)\n\t}\n\n\treturn requestUserAgent, nil\n}\n\n// AddUserAgentKey adds the component identified by name to the User-Agent string.\nfunc (u *RequestUserAgent) AddUserAgentKey(key string) {\n\tu.userAgent.AddKey(strings.Map(rules, key))\n}\n\n// AddUserAgentKeyValue adds the key identified by the given name and value to the User-Agent string.\nfunc (u *RequestUserAgent) AddUserAgentKeyValue(key, value string) {\n\tu.userAgent.AddKeyValue(strings.Map(rules, key), strings.Map(rules, value))\n}\n\n// AddUserAgentFeature adds the feature ID to the tracking list to be emitted\n// in the final User-Agent string.\nfunc (u *RequestUserAgent) AddUserAgentFeature(feature UserAgentFeature) {\n\tu.features[feature] = struct{}{}\n}\n\n// AddSDKAgentKey adds the component identified by name to the User-Agent string.\nfunc (u *RequestUserAgent) AddSDKAgentKey(keyType SDKAgentKeyType, key string) {\n\t// TODO: should target sdkAgent\n\tu.userAgent.AddKey(keyType.string() + \"/\" + strings.Map(rules, key))\n}\n\n// AddSDKAgentKeyValue adds the key identified by the given name and value to the User-Agent string.\nfunc (u *RequestUserAgent) AddSDKAgentKeyValue(keyType SDKAgentKeyType, key, value string) {\n\t// TODO: should target sdkAgent\n\tu.userAgent.AddKeyValue(keyType.string(), strings.Map(rules, key)+\"#\"+strings.Map(rules, value))\n}\n\n// AddCredentialsSource adds the credential source as a feature on the User-Agent string\nfunc (u *RequestUserAgent) AddCredentialsSource(source aws.CredentialSource) {\n\tx, ok := credentialSourceToFeature[source]\n\tif ok {\n\t\tu.AddUserAgentFeature(x)\n\t}\n}\n\n// ID the name of the middleware.\nfunc (u *RequestUserAgent) ID() string {\n\treturn \"UserAgent\"\n}\n\n// HandleBuild adds or appends the constructed user agent to the request.\nfunc (u *RequestUserAgent) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (\n\tout middleware.BuildOutput, metadata middleware.Metadata, err error,\n) {\n\tswitch req := in.Request.(type) {\n\tcase *smithyhttp.Request:\n\t\tu.addHTTPUserAgent(req)\n\t\t// TODO: To be re-enabled\n\t\t// u.addHTTPSDKAgent(req)\n\tdefault:\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type %T\", in)\n\t}\n\n\treturn next.HandleBuild(ctx, in)\n}\n\nfunc (u *RequestUserAgent) addHTTPUserAgent(request *smithyhttp.Request) {\n\tconst userAgent = \"User-Agent\"\n\tif len(u.features) > 0 {\n\t\tupdateHTTPHeader(request, userAgent, buildFeatureMetrics(u.features))\n\t}\n\tupdateHTTPHeader(request, userAgent, u.userAgent.Build())\n}\n\nfunc (u *RequestUserAgent) addHTTPSDKAgent(request *smithyhttp.Request) {\n\tconst sdkAgent = \"X-Amz-User-Agent\"\n\tupdateHTTPHeader(request, sdkAgent, u.sdkAgent.Build())\n}\n\nfunc updateHTTPHeader(request *smithyhttp.Request, header string, value string) {\n\tvar current string\n\tif v := request.Header[header]; len(v) > 0 {\n\t\tcurrent = v[0]\n\t}\n\tif len(current) > 0 {\n\t\tcurrent = value + \" \" + current\n\t} else {\n\t\tcurrent = value\n\t}\n\trequest.Header[header] = append(request.Header[header][:0], current)\n}\n\nfunc rules(r rune) rune {\n\tswitch {\n\tcase r >= '0' && r <= '9':\n\t\treturn r\n\tcase r >= 'A' && r <= 'Z' || r >= 'a' && r <= 'z':\n\t\treturn r\n\tcase validChars[r]:\n\t\treturn r\n\tdefault:\n\t\treturn '-'\n\t}\n}\n\nfunc buildFeatureMetrics(features map[UserAgentFeature]struct{}) string {\n\tfs := make([]string, 0, len(features))\n\tfor f := range features {\n\t\tfs = append(fs, string(f))\n\t}\n\n\tsort.Strings(fs)\n\treturn fmt.Sprintf(\"%s/%s\", FeatureMetadata2.string(), strings.Join(fs, \",\"))\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/CHANGELOG.md",
    "content": "# v1.6.10 (2025-02-18)\n\n* **Bug Fix**: Bump go version to 1.22\n\n# v1.6.9 (2025-02-14)\n\n* **Bug Fix**: Remove max limit on event stream messages\n\n# v1.6.8 (2025-01-24)\n\n* **Dependency Update**: Upgrade to smithy-go v1.22.2.\n\n# v1.6.7 (2024-11-18)\n\n* **Dependency Update**: Update to smithy-go v1.22.1.\n\n# v1.6.6 (2024-10-04)\n\n* No change notes available for this release.\n\n# v1.6.5 (2024-09-20)\n\n* No change notes available for this release.\n\n# v1.6.4 (2024-08-15)\n\n* **Dependency Update**: Bump minimum Go version to 1.21.\n\n# v1.6.3 (2024-06-28)\n\n* No change notes available for this release.\n\n# v1.6.2 (2024-03-29)\n\n* No change notes available for this release.\n\n# v1.6.1 (2024-02-21)\n\n* No change notes available for this release.\n\n# v1.6.0 (2024-02-13)\n\n* **Feature**: Bump minimum Go version to 1.20 per our language support policy.\n\n# v1.5.4 (2023-12-07)\n\n* No change notes available for this release.\n\n# v1.5.3 (2023-11-30)\n\n* No change notes available for this release.\n\n# v1.5.2 (2023-11-29)\n\n* No change notes available for this release.\n\n# v1.5.1 (2023-11-15)\n\n* No change notes available for this release.\n\n# v1.5.0 (2023-10-31)\n\n* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).\n\n# v1.4.14 (2023-10-06)\n\n* No change notes available for this release.\n\n# v1.4.13 (2023-08-18)\n\n* No change notes available for this release.\n\n# v1.4.12 (2023-08-07)\n\n* No change notes available for this release.\n\n# v1.4.11 (2023-07-31)\n\n* No change notes available for this release.\n\n# v1.4.10 (2022-12-02)\n\n* No change notes available for this release.\n\n# v1.4.9 (2022-10-24)\n\n* No change notes available for this release.\n\n# v1.4.8 (2022-09-14)\n\n* No change notes available for this release.\n\n# v1.4.7 (2022-09-02)\n\n* No change notes available for this release.\n\n# v1.4.6 (2022-08-31)\n\n* No change notes available for this release.\n\n# v1.4.5 (2022-08-29)\n\n* No change notes available for this release.\n\n# v1.4.4 (2022-08-09)\n\n* No change notes available for this release.\n\n# v1.4.3 (2022-06-29)\n\n* No change notes available for this release.\n\n# v1.4.2 (2022-06-07)\n\n* No change notes available for this release.\n\n# v1.4.1 (2022-03-24)\n\n* No change notes available for this release.\n\n# v1.4.0 (2022-03-08)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n\n# v1.3.0 (2022-02-24)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n\n# v1.2.0 (2022-01-14)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n\n# v1.1.0 (2022-01-07)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n\n# v1.0.0 (2021-11-06)\n\n* **Announcement**: Support has been added for AWS EventStream APIs for Kinesis, S3, and Transcribe Streaming. Support for the Lex Runtime V2 EventStream API will be added in a future release.\n* **Release**: Protocol support has been added for AWS event stream.\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/debug.go",
    "content": "package eventstream\n\nimport (\n\t\"bytes\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"strconv\"\n)\n\ntype decodedMessage struct {\n\trawMessage\n\tHeaders decodedHeaders `json:\"headers\"`\n}\ntype jsonMessage struct {\n\tLength     json.Number    `json:\"total_length\"`\n\tHeadersLen json.Number    `json:\"headers_length\"`\n\tPreludeCRC json.Number    `json:\"prelude_crc\"`\n\tHeaders    decodedHeaders `json:\"headers\"`\n\tPayload    []byte         `json:\"payload\"`\n\tCRC        json.Number    `json:\"message_crc\"`\n}\n\nfunc (d *decodedMessage) UnmarshalJSON(b []byte) (err error) {\n\tvar jsonMsg jsonMessage\n\tif err = json.Unmarshal(b, &jsonMsg); err != nil {\n\t\treturn err\n\t}\n\n\td.Length, err = numAsUint32(jsonMsg.Length)\n\tif err != nil {\n\t\treturn err\n\t}\n\td.HeadersLen, err = numAsUint32(jsonMsg.HeadersLen)\n\tif err != nil {\n\t\treturn err\n\t}\n\td.PreludeCRC, err = numAsUint32(jsonMsg.PreludeCRC)\n\tif err != nil {\n\t\treturn err\n\t}\n\td.Headers = jsonMsg.Headers\n\td.Payload = jsonMsg.Payload\n\td.CRC, err = numAsUint32(jsonMsg.CRC)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (d *decodedMessage) MarshalJSON() ([]byte, error) {\n\tjsonMsg := jsonMessage{\n\t\tLength:     json.Number(strconv.Itoa(int(d.Length))),\n\t\tHeadersLen: json.Number(strconv.Itoa(int(d.HeadersLen))),\n\t\tPreludeCRC: json.Number(strconv.Itoa(int(d.PreludeCRC))),\n\t\tHeaders:    d.Headers,\n\t\tPayload:    d.Payload,\n\t\tCRC:        json.Number(strconv.Itoa(int(d.CRC))),\n\t}\n\n\treturn json.Marshal(jsonMsg)\n}\n\nfunc numAsUint32(n json.Number) (uint32, error) {\n\tv, err := n.Int64()\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"failed to get int64 json number, %v\", err)\n\t}\n\n\treturn uint32(v), nil\n}\n\nfunc (d decodedMessage) Message() Message {\n\treturn Message{\n\t\tHeaders: Headers(d.Headers),\n\t\tPayload: d.Payload,\n\t}\n}\n\ntype decodedHeaders Headers\n\nfunc (hs *decodedHeaders) UnmarshalJSON(b []byte) error {\n\tvar jsonHeaders []struct {\n\t\tName  string      `json:\"name\"`\n\t\tType  valueType   `json:\"type\"`\n\t\tValue interface{} `json:\"value\"`\n\t}\n\n\tdecoder := json.NewDecoder(bytes.NewReader(b))\n\tdecoder.UseNumber()\n\tif err := decoder.Decode(&jsonHeaders); err != nil {\n\t\treturn err\n\t}\n\n\tvar headers Headers\n\tfor _, h := range jsonHeaders {\n\t\tvalue, err := valueFromType(h.Type, h.Value)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\theaders.Set(h.Name, value)\n\t}\n\t*hs = decodedHeaders(headers)\n\n\treturn nil\n}\n\nfunc valueFromType(typ valueType, val interface{}) (Value, error) {\n\tswitch typ {\n\tcase trueValueType:\n\t\treturn BoolValue(true), nil\n\tcase falseValueType:\n\t\treturn BoolValue(false), nil\n\tcase int8ValueType:\n\t\tv, err := val.(json.Number).Int64()\n\t\treturn Int8Value(int8(v)), err\n\tcase int16ValueType:\n\t\tv, err := val.(json.Number).Int64()\n\t\treturn Int16Value(int16(v)), err\n\tcase int32ValueType:\n\t\tv, err := val.(json.Number).Int64()\n\t\treturn Int32Value(int32(v)), err\n\tcase int64ValueType:\n\t\tv, err := val.(json.Number).Int64()\n\t\treturn Int64Value(v), err\n\tcase bytesValueType:\n\t\tv, err := base64.StdEncoding.DecodeString(val.(string))\n\t\treturn BytesValue(v), err\n\tcase stringValueType:\n\t\tv, err := base64.StdEncoding.DecodeString(val.(string))\n\t\treturn StringValue(string(v)), err\n\tcase timestampValueType:\n\t\tv, err := val.(json.Number).Int64()\n\t\treturn TimestampValue(timeFromEpochMilli(v)), err\n\tcase uuidValueType:\n\t\tv, err := base64.StdEncoding.DecodeString(val.(string))\n\t\tvar tv UUIDValue\n\t\tcopy(tv[:], v)\n\t\treturn tv, err\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"unknown type, %s, %T\", typ.String(), val))\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/decode.go",
    "content": "package eventstream\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"hash\"\n\t\"hash/crc32\"\n\t\"io\"\n)\n\n// DecoderOptions is the Decoder configuration options.\ntype DecoderOptions struct {\n\tLogger      logging.Logger\n\tLogMessages bool\n}\n\n// Decoder provides decoding of an Event Stream messages.\ntype Decoder struct {\n\toptions DecoderOptions\n}\n\n// NewDecoder initializes and returns a Decoder for decoding event\n// stream messages from the reader provided.\nfunc NewDecoder(optFns ...func(*DecoderOptions)) *Decoder {\n\toptions := DecoderOptions{}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &Decoder{\n\t\toptions: options,\n\t}\n}\n\n// Decode attempts to decode a single message from the event stream reader.\n// Will return the event stream message, or error if decodeMessage fails to read\n// the message from the stream.\n//\n// payloadBuf is a byte slice that will be used in the returned Message.Payload. Callers\n// must ensure that the Message.Payload from a previous decode has been consumed before passing in the same underlying\n// payloadBuf byte slice.\nfunc (d *Decoder) Decode(reader io.Reader, payloadBuf []byte) (m Message, err error) {\n\tif d.options.Logger != nil && d.options.LogMessages {\n\t\tdebugMsgBuf := bytes.NewBuffer(nil)\n\t\treader = io.TeeReader(reader, debugMsgBuf)\n\t\tdefer func() {\n\t\t\tlogMessageDecode(d.options.Logger, debugMsgBuf, m, err)\n\t\t}()\n\t}\n\n\tm, err = decodeMessage(reader, payloadBuf)\n\n\treturn m, err\n}\n\n// decodeMessage attempts to decode a single message from the event stream reader.\n// Will return the event stream message, or error if decodeMessage fails to read\n// the message from the reader.\nfunc decodeMessage(reader io.Reader, payloadBuf []byte) (m Message, err error) {\n\tcrc := crc32.New(crc32IEEETable)\n\thashReader := io.TeeReader(reader, crc)\n\n\tprelude, err := decodePrelude(hashReader, crc)\n\tif err != nil {\n\t\treturn Message{}, err\n\t}\n\n\tif prelude.HeadersLen > 0 {\n\t\tlr := io.LimitReader(hashReader, int64(prelude.HeadersLen))\n\t\tm.Headers, err = decodeHeaders(lr)\n\t\tif err != nil {\n\t\t\treturn Message{}, err\n\t\t}\n\t}\n\n\tif payloadLen := prelude.PayloadLen(); payloadLen > 0 {\n\t\tbuf, err := decodePayload(payloadBuf, io.LimitReader(hashReader, int64(payloadLen)))\n\t\tif err != nil {\n\t\t\treturn Message{}, err\n\t\t}\n\t\tm.Payload = buf\n\t}\n\n\tmsgCRC := crc.Sum32()\n\tif err := validateCRC(reader, msgCRC); err != nil {\n\t\treturn Message{}, err\n\t}\n\n\treturn m, nil\n}\n\nfunc logMessageDecode(logger logging.Logger, msgBuf *bytes.Buffer, msg Message, decodeErr error) {\n\tw := bytes.NewBuffer(nil)\n\tdefer func() { logger.Logf(logging.Debug, w.String()) }()\n\n\tfmt.Fprintf(w, \"Raw message:\\n%s\\n\",\n\t\thex.Dump(msgBuf.Bytes()))\n\n\tif decodeErr != nil {\n\t\tfmt.Fprintf(w, \"decodeMessage error: %v\\n\", decodeErr)\n\t\treturn\n\t}\n\n\trawMsg, err := msg.rawMessage()\n\tif err != nil {\n\t\tfmt.Fprintf(w, \"failed to create raw message, %v\\n\", err)\n\t\treturn\n\t}\n\n\tdecodedMsg := decodedMessage{\n\t\trawMessage: rawMsg,\n\t\tHeaders:    decodedHeaders(msg.Headers),\n\t}\n\n\tfmt.Fprintf(w, \"Decoded message:\\n\")\n\tencoder := json.NewEncoder(w)\n\tif err := encoder.Encode(decodedMsg); err != nil {\n\t\tfmt.Fprintf(w, \"failed to generate decoded message, %v\\n\", err)\n\t}\n}\n\nfunc decodePrelude(r io.Reader, crc hash.Hash32) (messagePrelude, error) {\n\tvar p messagePrelude\n\n\tvar err error\n\tp.Length, err = decodeUint32(r)\n\tif err != nil {\n\t\treturn messagePrelude{}, err\n\t}\n\n\tp.HeadersLen, err = decodeUint32(r)\n\tif err != nil {\n\t\treturn messagePrelude{}, err\n\t}\n\n\tif err := p.ValidateLens(); err != nil {\n\t\treturn messagePrelude{}, err\n\t}\n\n\tpreludeCRC := crc.Sum32()\n\tif err := validateCRC(r, preludeCRC); err != nil {\n\t\treturn messagePrelude{}, err\n\t}\n\n\tp.PreludeCRC = preludeCRC\n\n\treturn p, nil\n}\n\nfunc decodePayload(buf []byte, r io.Reader) ([]byte, error) {\n\tw := bytes.NewBuffer(buf[0:0])\n\n\t_, err := io.Copy(w, r)\n\treturn w.Bytes(), err\n}\n\nfunc decodeUint8(r io.Reader) (uint8, error) {\n\ttype byteReader interface {\n\t\tReadByte() (byte, error)\n\t}\n\n\tif br, ok := r.(byteReader); ok {\n\t\tv, err := br.ReadByte()\n\t\treturn v, err\n\t}\n\n\tvar b [1]byte\n\t_, err := io.ReadFull(r, b[:])\n\treturn b[0], err\n}\n\nfunc decodeUint16(r io.Reader) (uint16, error) {\n\tvar b [2]byte\n\tbs := b[:]\n\t_, err := io.ReadFull(r, bs)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn binary.BigEndian.Uint16(bs), nil\n}\n\nfunc decodeUint32(r io.Reader) (uint32, error) {\n\tvar b [4]byte\n\tbs := b[:]\n\t_, err := io.ReadFull(r, bs)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn binary.BigEndian.Uint32(bs), nil\n}\n\nfunc decodeUint64(r io.Reader) (uint64, error) {\n\tvar b [8]byte\n\tbs := b[:]\n\t_, err := io.ReadFull(r, bs)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn binary.BigEndian.Uint64(bs), nil\n}\n\nfunc validateCRC(r io.Reader, expect uint32) error {\n\tmsgCRC, err := decodeUint32(r)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif msgCRC != expect {\n\t\treturn ChecksumError{}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/encode.go",
    "content": "package eventstream\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"hash\"\n\t\"hash/crc32\"\n\t\"io\"\n)\n\n// EncoderOptions is the configuration options for Encoder.\ntype EncoderOptions struct {\n\tLogger      logging.Logger\n\tLogMessages bool\n}\n\n// Encoder provides EventStream message encoding.\ntype Encoder struct {\n\toptions EncoderOptions\n\n\theadersBuf *bytes.Buffer\n\tmessageBuf *bytes.Buffer\n}\n\n// NewEncoder initializes and returns an Encoder to encode Event Stream\n// messages.\nfunc NewEncoder(optFns ...func(*EncoderOptions)) *Encoder {\n\to := EncoderOptions{}\n\n\tfor _, fn := range optFns {\n\t\tfn(&o)\n\t}\n\n\treturn &Encoder{\n\t\toptions:    o,\n\t\theadersBuf: bytes.NewBuffer(nil),\n\t\tmessageBuf: bytes.NewBuffer(nil),\n\t}\n}\n\n// Encode encodes a single EventStream message to the io.Writer the Encoder\n// was created with. An error is returned if writing the message fails.\nfunc (e *Encoder) Encode(w io.Writer, msg Message) (err error) {\n\te.headersBuf.Reset()\n\te.messageBuf.Reset()\n\n\tvar writer io.Writer = e.messageBuf\n\tif e.options.Logger != nil && e.options.LogMessages {\n\t\tencodeMsgBuf := bytes.NewBuffer(nil)\n\t\twriter = io.MultiWriter(writer, encodeMsgBuf)\n\t\tdefer func() {\n\t\t\tlogMessageEncode(e.options.Logger, encodeMsgBuf, msg, err)\n\t\t}()\n\t}\n\n\tif err = EncodeHeaders(e.headersBuf, msg.Headers); err != nil {\n\t\treturn err\n\t}\n\n\tcrc := crc32.New(crc32IEEETable)\n\thashWriter := io.MultiWriter(writer, crc)\n\n\theadersLen := uint32(e.headersBuf.Len())\n\tpayloadLen := uint32(len(msg.Payload))\n\n\tif err = encodePrelude(hashWriter, crc, headersLen, payloadLen); err != nil {\n\t\treturn err\n\t}\n\n\tif headersLen > 0 {\n\t\tif _, err = io.Copy(hashWriter, e.headersBuf); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif payloadLen > 0 {\n\t\tif _, err = hashWriter.Write(msg.Payload); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tmsgCRC := crc.Sum32()\n\tif err := binary.Write(writer, binary.BigEndian, msgCRC); err != nil {\n\t\treturn err\n\t}\n\n\t_, err = io.Copy(w, e.messageBuf)\n\n\treturn err\n}\n\nfunc logMessageEncode(logger logging.Logger, msgBuf *bytes.Buffer, msg Message, encodeErr error) {\n\tw := bytes.NewBuffer(nil)\n\tdefer func() { logger.Logf(logging.Debug, w.String()) }()\n\n\tfmt.Fprintf(w, \"Message to encode:\\n\")\n\tencoder := json.NewEncoder(w)\n\tif err := encoder.Encode(msg); err != nil {\n\t\tfmt.Fprintf(w, \"Failed to get encoded message, %v\\n\", err)\n\t}\n\n\tif encodeErr != nil {\n\t\tfmt.Fprintf(w, \"Encode error: %v\\n\", encodeErr)\n\t\treturn\n\t}\n\n\tfmt.Fprintf(w, \"Raw message:\\n%s\\n\", hex.Dump(msgBuf.Bytes()))\n}\n\nfunc encodePrelude(w io.Writer, crc hash.Hash32, headersLen, payloadLen uint32) error {\n\tp := messagePrelude{\n\t\tLength:     minMsgLen + headersLen + payloadLen,\n\t\tHeadersLen: headersLen,\n\t}\n\tif err := p.ValidateLens(); err != nil {\n\t\treturn err\n\t}\n\n\terr := binaryWriteFields(w, binary.BigEndian,\n\t\tp.Length,\n\t\tp.HeadersLen,\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tp.PreludeCRC = crc.Sum32()\n\terr = binary.Write(w, binary.BigEndian, p.PreludeCRC)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// EncodeHeaders writes the header values to the writer encoded in the event\n// stream format. Returns an error if a header fails to encode.\nfunc EncodeHeaders(w io.Writer, headers Headers) error {\n\tfor _, h := range headers {\n\t\thn := headerName{\n\t\t\tLen: uint8(len(h.Name)),\n\t\t}\n\t\tcopy(hn.Name[:hn.Len], h.Name)\n\t\tif err := hn.encode(w); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := h.Value.encode(w); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc binaryWriteFields(w io.Writer, order binary.ByteOrder, vs ...interface{}) error {\n\tfor _, v := range vs {\n\t\tif err := binary.Write(w, order, v); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/error.go",
    "content": "package eventstream\n\nimport \"fmt\"\n\n// LengthError provides the error for items being larger than a maximum length.\ntype LengthError struct {\n\tPart  string\n\tWant  int\n\tHave  int\n\tValue interface{}\n}\n\nfunc (e LengthError) Error() string {\n\treturn fmt.Sprintf(\"%s length invalid, %d/%d, %v\",\n\t\te.Part, e.Want, e.Have, e.Value)\n}\n\n// ChecksumError provides the error for message checksum invalidation errors.\ntype ChecksumError struct{}\n\nfunc (e ChecksumError) Error() string {\n\treturn \"message checksum mismatch\"\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi/headers.go",
    "content": "package eventstreamapi\n\n// EventStream headers with specific meaning to async API functionality.\nconst (\n\tChunkSignatureHeader = `:chunk-signature` // chunk signature for message\n\tDateHeader           = `:date`            // Date header for signature\n\tContentTypeHeader    = \":content-type\"    // message payload content-type\n\n\t// Message header and values\n\tMessageTypeHeader    = `:message-type` // Identifies type of message.\n\tEventMessageType     = `event`\n\tErrorMessageType     = `error`\n\tExceptionMessageType = `exception`\n\n\t// Message Events\n\tEventTypeHeader = `:event-type` // Identifies message event type e.g. \"Stats\".\n\n\t// Message Error\n\tErrorCodeHeader    = `:error-code`\n\tErrorMessageHeader = `:error-message`\n\n\t// Message Exception\n\tExceptionTypeHeader = `:exception-type`\n)\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi/middleware.go",
    "content": "package eventstreamapi\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"io\"\n)\n\ntype eventStreamWriterKey struct{}\n\n// GetInputStreamWriter returns EventTypeHeader io.PipeWriter used for the operation's input event stream.\nfunc GetInputStreamWriter(ctx context.Context) io.WriteCloser {\n\twriteCloser, _ := middleware.GetStackValue(ctx, eventStreamWriterKey{}).(io.WriteCloser)\n\treturn writeCloser\n}\n\nfunc setInputStreamWriter(ctx context.Context, writeCloser io.WriteCloser) context.Context {\n\treturn middleware.WithStackValue(ctx, eventStreamWriterKey{}, writeCloser)\n}\n\n// InitializeStreamWriter is a Finalize middleware initializes an in-memory pipe for sending event stream messages\n// via the HTTP request body.\ntype InitializeStreamWriter struct{}\n\n// AddInitializeStreamWriter adds the InitializeStreamWriter middleware to the provided stack.\nfunc AddInitializeStreamWriter(stack *middleware.Stack) error {\n\treturn stack.Finalize.Add(&InitializeStreamWriter{}, middleware.After)\n}\n\n// ID returns the identifier for the middleware.\nfunc (i *InitializeStreamWriter) ID() string {\n\treturn \"InitializeStreamWriter\"\n}\n\n// HandleFinalize is the middleware implementation.\nfunc (i *InitializeStreamWriter) HandleFinalize(\n\tctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,\n) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type: %T\", in.Request)\n\t}\n\n\tinputReader, inputWriter := io.Pipe()\n\tdefer func() {\n\t\tif err == nil {\n\t\t\treturn\n\t\t}\n\t\t_ = inputReader.Close()\n\t\t_ = inputWriter.Close()\n\t}()\n\n\trequest, err = request.SetStream(inputReader)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\tin.Request = request\n\n\tctx = setInputStreamWriter(ctx, inputWriter)\n\n\tout, metadata, err = next.HandleFinalize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi/transport.go",
    "content": "//go:build go1.18\n// +build go1.18\n\npackage eventstreamapi\n\nimport smithyhttp \"github.com/aws/smithy-go/transport/http\"\n\n// ApplyHTTPTransportFixes applies fixes to the HTTP request for proper event stream functionality.\n//\n// This operation is a no-op for Go 1.18 and above.\nfunc ApplyHTTPTransportFixes(r *smithyhttp.Request) error {\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi/transport_go117.go",
    "content": "//go:build !go1.18\n// +build !go1.18\n\npackage eventstreamapi\n\nimport smithyhttp \"github.com/aws/smithy-go/transport/http\"\n\n// ApplyHTTPTransportFixes applies fixes to the HTTP request for proper event stream functionality.\nfunc ApplyHTTPTransportFixes(r *smithyhttp.Request) error {\n\tr.Header.Set(\"Expect\", \"100-continue\")\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/go_module_metadata.go",
    "content": "// Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT.\n\npackage eventstream\n\n// goModuleVersion is the tagged release for this module\nconst goModuleVersion = \"1.6.10\"\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/header.go",
    "content": "package eventstream\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n)\n\n// Headers are a collection of EventStream header values.\ntype Headers []Header\n\n// Header is a single EventStream Key Value header pair.\ntype Header struct {\n\tName  string\n\tValue Value\n}\n\n// Set associates the name with a value. If the header name already exists in\n// the Headers the value will be replaced with the new one.\nfunc (hs *Headers) Set(name string, value Value) {\n\tvar i int\n\tfor ; i < len(*hs); i++ {\n\t\tif (*hs)[i].Name == name {\n\t\t\t(*hs)[i].Value = value\n\t\t\treturn\n\t\t}\n\t}\n\n\t*hs = append(*hs, Header{\n\t\tName: name, Value: value,\n\t})\n}\n\n// Get returns the Value associated with the header. Nil is returned if the\n// value does not exist.\nfunc (hs Headers) Get(name string) Value {\n\tfor i := 0; i < len(hs); i++ {\n\t\tif h := hs[i]; h.Name == name {\n\t\t\treturn h.Value\n\t\t}\n\t}\n\treturn nil\n}\n\n// Del deletes the value in the Headers if it exists.\nfunc (hs *Headers) Del(name string) {\n\tfor i := 0; i < len(*hs); i++ {\n\t\tif (*hs)[i].Name == name {\n\t\t\tcopy((*hs)[i:], (*hs)[i+1:])\n\t\t\t(*hs) = (*hs)[:len(*hs)-1]\n\t\t}\n\t}\n}\n\n// Clone returns a deep copy of the headers\nfunc (hs Headers) Clone() Headers {\n\to := make(Headers, 0, len(hs))\n\tfor _, h := range hs {\n\t\to.Set(h.Name, h.Value)\n\t}\n\treturn o\n}\n\nfunc decodeHeaders(r io.Reader) (Headers, error) {\n\ths := Headers{}\n\n\tfor {\n\t\tname, err := decodeHeaderName(r)\n\t\tif err != nil {\n\t\t\tif err == io.EOF {\n\t\t\t\t// EOF while getting header name means no more headers\n\t\t\t\tbreak\n\t\t\t}\n\t\t\treturn nil, err\n\t\t}\n\n\t\tvalue, err := decodeHeaderValue(r)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\ths.Set(name, value)\n\t}\n\n\treturn hs, nil\n}\n\nfunc decodeHeaderName(r io.Reader) (string, error) {\n\tvar n headerName\n\n\tvar err error\n\tn.Len, err = decodeUint8(r)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tname := n.Name[:n.Len]\n\tif _, err := io.ReadFull(r, name); err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn string(name), nil\n}\n\nfunc decodeHeaderValue(r io.Reader) (Value, error) {\n\tvar raw rawValue\n\n\ttyp, err := decodeUint8(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\traw.Type = valueType(typ)\n\n\tvar v Value\n\n\tswitch raw.Type {\n\tcase trueValueType:\n\t\tv = BoolValue(true)\n\tcase falseValueType:\n\t\tv = BoolValue(false)\n\tcase int8ValueType:\n\t\tvar tv Int8Value\n\t\terr = tv.decode(r)\n\t\tv = tv\n\tcase int16ValueType:\n\t\tvar tv Int16Value\n\t\terr = tv.decode(r)\n\t\tv = tv\n\tcase int32ValueType:\n\t\tvar tv Int32Value\n\t\terr = tv.decode(r)\n\t\tv = tv\n\tcase int64ValueType:\n\t\tvar tv Int64Value\n\t\terr = tv.decode(r)\n\t\tv = tv\n\tcase bytesValueType:\n\t\tvar tv BytesValue\n\t\terr = tv.decode(r)\n\t\tv = tv\n\tcase stringValueType:\n\t\tvar tv StringValue\n\t\terr = tv.decode(r)\n\t\tv = tv\n\tcase timestampValueType:\n\t\tvar tv TimestampValue\n\t\terr = tv.decode(r)\n\t\tv = tv\n\tcase uuidValueType:\n\t\tvar tv UUIDValue\n\t\terr = tv.decode(r)\n\t\tv = tv\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"unknown value type %d\", raw.Type))\n\t}\n\n\t// Error could be EOF, let caller deal with it\n\treturn v, err\n}\n\nconst maxHeaderNameLen = 255\n\ntype headerName struct {\n\tLen  uint8\n\tName [maxHeaderNameLen]byte\n}\n\nfunc (v headerName) encode(w io.Writer) error {\n\tif err := binary.Write(w, binary.BigEndian, v.Len); err != nil {\n\t\treturn err\n\t}\n\n\t_, err := w.Write(v.Name[:v.Len])\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/header_value.go",
    "content": "package eventstream\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/binary\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"io\"\n\t\"strconv\"\n\t\"time\"\n)\n\nconst maxHeaderValueLen = 1<<15 - 1 // 2^15-1 or 32KB - 1\n\n// valueType is the EventStream header value type.\ntype valueType uint8\n\n// Header value types\nconst (\n\ttrueValueType valueType = iota\n\tfalseValueType\n\tint8ValueType  // Byte\n\tint16ValueType // Short\n\tint32ValueType // Integer\n\tint64ValueType // Long\n\tbytesValueType\n\tstringValueType\n\ttimestampValueType\n\tuuidValueType\n)\n\nfunc (t valueType) String() string {\n\tswitch t {\n\tcase trueValueType:\n\t\treturn \"bool\"\n\tcase falseValueType:\n\t\treturn \"bool\"\n\tcase int8ValueType:\n\t\treturn \"int8\"\n\tcase int16ValueType:\n\t\treturn \"int16\"\n\tcase int32ValueType:\n\t\treturn \"int32\"\n\tcase int64ValueType:\n\t\treturn \"int64\"\n\tcase bytesValueType:\n\t\treturn \"byte_array\"\n\tcase stringValueType:\n\t\treturn \"string\"\n\tcase timestampValueType:\n\t\treturn \"timestamp\"\n\tcase uuidValueType:\n\t\treturn \"uuid\"\n\tdefault:\n\t\treturn fmt.Sprintf(\"unknown value type %d\", uint8(t))\n\t}\n}\n\ntype rawValue struct {\n\tType  valueType\n\tLen   uint16 // Only set for variable length slices\n\tValue []byte // byte representation of value, BigEndian encoding.\n}\n\nfunc (r rawValue) encodeScalar(w io.Writer, v interface{}) error {\n\treturn binaryWriteFields(w, binary.BigEndian,\n\t\tr.Type,\n\t\tv,\n\t)\n}\n\nfunc (r rawValue) encodeFixedSlice(w io.Writer, v []byte) error {\n\tbinary.Write(w, binary.BigEndian, r.Type)\n\n\t_, err := w.Write(v)\n\treturn err\n}\n\nfunc (r rawValue) encodeBytes(w io.Writer, v []byte) error {\n\tif len(v) > maxHeaderValueLen {\n\t\treturn LengthError{\n\t\t\tPart: \"header value\",\n\t\t\tWant: maxHeaderValueLen, Have: len(v),\n\t\t\tValue: v,\n\t\t}\n\t}\n\tr.Len = uint16(len(v))\n\n\terr := binaryWriteFields(w, binary.BigEndian,\n\t\tr.Type,\n\t\tr.Len,\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t_, err = w.Write(v)\n\treturn err\n}\n\nfunc (r rawValue) encodeString(w io.Writer, v string) error {\n\tif len(v) > maxHeaderValueLen {\n\t\treturn LengthError{\n\t\t\tPart: \"header value\",\n\t\t\tWant: maxHeaderValueLen, Have: len(v),\n\t\t\tValue: v,\n\t\t}\n\t}\n\tr.Len = uint16(len(v))\n\n\ttype stringWriter interface {\n\t\tWriteString(string) (int, error)\n\t}\n\n\terr := binaryWriteFields(w, binary.BigEndian,\n\t\tr.Type,\n\t\tr.Len,\n\t)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif sw, ok := w.(stringWriter); ok {\n\t\t_, err = sw.WriteString(v)\n\t} else {\n\t\t_, err = w.Write([]byte(v))\n\t}\n\n\treturn err\n}\n\nfunc decodeFixedBytesValue(r io.Reader, buf []byte) error {\n\t_, err := io.ReadFull(r, buf)\n\treturn err\n}\n\nfunc decodeBytesValue(r io.Reader) ([]byte, error) {\n\tvar raw rawValue\n\tvar err error\n\traw.Len, err = decodeUint16(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tbuf := make([]byte, raw.Len)\n\t_, err = io.ReadFull(r, buf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn buf, nil\n}\n\nfunc decodeStringValue(r io.Reader) (string, error) {\n\tv, err := decodeBytesValue(r)\n\treturn string(v), err\n}\n\n// Value represents the abstract header value.\ntype Value interface {\n\tGet() interface{}\n\tString() string\n\tvalueType() valueType\n\tencode(io.Writer) error\n}\n\n// An BoolValue provides eventstream encoding, and representation\n// of a Go bool value.\ntype BoolValue bool\n\n// Get returns the underlying type\nfunc (v BoolValue) Get() interface{} {\n\treturn bool(v)\n}\n\n// valueType returns the EventStream header value type value.\nfunc (v BoolValue) valueType() valueType {\n\tif v {\n\t\treturn trueValueType\n\t}\n\treturn falseValueType\n}\n\nfunc (v BoolValue) String() string {\n\treturn strconv.FormatBool(bool(v))\n}\n\n// encode encodes the BoolValue into an eventstream binary value\n// representation.\nfunc (v BoolValue) encode(w io.Writer) error {\n\treturn binary.Write(w, binary.BigEndian, v.valueType())\n}\n\n// An Int8Value provides eventstream encoding, and representation of a Go\n// int8 value.\ntype Int8Value int8\n\n// Get returns the underlying value.\nfunc (v Int8Value) Get() interface{} {\n\treturn int8(v)\n}\n\n// valueType returns the EventStream header value type value.\nfunc (Int8Value) valueType() valueType {\n\treturn int8ValueType\n}\n\nfunc (v Int8Value) String() string {\n\treturn fmt.Sprintf(\"0x%02x\", int8(v))\n}\n\n// encode encodes the Int8Value into an eventstream binary value\n// representation.\nfunc (v Int8Value) encode(w io.Writer) error {\n\traw := rawValue{\n\t\tType: v.valueType(),\n\t}\n\n\treturn raw.encodeScalar(w, v)\n}\n\nfunc (v *Int8Value) decode(r io.Reader) error {\n\tn, err := decodeUint8(r)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t*v = Int8Value(n)\n\treturn nil\n}\n\n// An Int16Value provides eventstream encoding, and representation of a Go\n// int16 value.\ntype Int16Value int16\n\n// Get returns the underlying value.\nfunc (v Int16Value) Get() interface{} {\n\treturn int16(v)\n}\n\n// valueType returns the EventStream header value type value.\nfunc (Int16Value) valueType() valueType {\n\treturn int16ValueType\n}\n\nfunc (v Int16Value) String() string {\n\treturn fmt.Sprintf(\"0x%04x\", int16(v))\n}\n\n// encode encodes the Int16Value into an eventstream binary value\n// representation.\nfunc (v Int16Value) encode(w io.Writer) error {\n\traw := rawValue{\n\t\tType: v.valueType(),\n\t}\n\treturn raw.encodeScalar(w, v)\n}\n\nfunc (v *Int16Value) decode(r io.Reader) error {\n\tn, err := decodeUint16(r)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t*v = Int16Value(n)\n\treturn nil\n}\n\n// An Int32Value provides eventstream encoding, and representation of a Go\n// int32 value.\ntype Int32Value int32\n\n// Get returns the underlying value.\nfunc (v Int32Value) Get() interface{} {\n\treturn int32(v)\n}\n\n// valueType returns the EventStream header value type value.\nfunc (Int32Value) valueType() valueType {\n\treturn int32ValueType\n}\n\nfunc (v Int32Value) String() string {\n\treturn fmt.Sprintf(\"0x%08x\", int32(v))\n}\n\n// encode encodes the Int32Value into an eventstream binary value\n// representation.\nfunc (v Int32Value) encode(w io.Writer) error {\n\traw := rawValue{\n\t\tType: v.valueType(),\n\t}\n\treturn raw.encodeScalar(w, v)\n}\n\nfunc (v *Int32Value) decode(r io.Reader) error {\n\tn, err := decodeUint32(r)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t*v = Int32Value(n)\n\treturn nil\n}\n\n// An Int64Value provides eventstream encoding, and representation of a Go\n// int64 value.\ntype Int64Value int64\n\n// Get returns the underlying value.\nfunc (v Int64Value) Get() interface{} {\n\treturn int64(v)\n}\n\n// valueType returns the EventStream header value type value.\nfunc (Int64Value) valueType() valueType {\n\treturn int64ValueType\n}\n\nfunc (v Int64Value) String() string {\n\treturn fmt.Sprintf(\"0x%016x\", int64(v))\n}\n\n// encode encodes the Int64Value into an eventstream binary value\n// representation.\nfunc (v Int64Value) encode(w io.Writer) error {\n\traw := rawValue{\n\t\tType: v.valueType(),\n\t}\n\treturn raw.encodeScalar(w, v)\n}\n\nfunc (v *Int64Value) decode(r io.Reader) error {\n\tn, err := decodeUint64(r)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t*v = Int64Value(n)\n\treturn nil\n}\n\n// An BytesValue provides eventstream encoding, and representation of a Go\n// byte slice.\ntype BytesValue []byte\n\n// Get returns the underlying value.\nfunc (v BytesValue) Get() interface{} {\n\treturn []byte(v)\n}\n\n// valueType returns the EventStream header value type value.\nfunc (BytesValue) valueType() valueType {\n\treturn bytesValueType\n}\n\nfunc (v BytesValue) String() string {\n\treturn base64.StdEncoding.EncodeToString([]byte(v))\n}\n\n// encode encodes the BytesValue into an eventstream binary value\n// representation.\nfunc (v BytesValue) encode(w io.Writer) error {\n\traw := rawValue{\n\t\tType: v.valueType(),\n\t}\n\n\treturn raw.encodeBytes(w, []byte(v))\n}\n\nfunc (v *BytesValue) decode(r io.Reader) error {\n\tbuf, err := decodeBytesValue(r)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t*v = BytesValue(buf)\n\treturn nil\n}\n\n// An StringValue provides eventstream encoding, and representation of a Go\n// string.\ntype StringValue string\n\n// Get returns the underlying value.\nfunc (v StringValue) Get() interface{} {\n\treturn string(v)\n}\n\n// valueType returns the EventStream header value type value.\nfunc (StringValue) valueType() valueType {\n\treturn stringValueType\n}\n\nfunc (v StringValue) String() string {\n\treturn string(v)\n}\n\n// encode encodes the StringValue into an eventstream binary value\n// representation.\nfunc (v StringValue) encode(w io.Writer) error {\n\traw := rawValue{\n\t\tType: v.valueType(),\n\t}\n\n\treturn raw.encodeString(w, string(v))\n}\n\nfunc (v *StringValue) decode(r io.Reader) error {\n\ts, err := decodeStringValue(r)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t*v = StringValue(s)\n\treturn nil\n}\n\n// An TimestampValue provides eventstream encoding, and representation of a Go\n// timestamp.\ntype TimestampValue time.Time\n\n// Get returns the underlying value.\nfunc (v TimestampValue) Get() interface{} {\n\treturn time.Time(v)\n}\n\n// valueType returns the EventStream header value type value.\nfunc (TimestampValue) valueType() valueType {\n\treturn timestampValueType\n}\n\nfunc (v TimestampValue) epochMilli() int64 {\n\tnano := time.Time(v).UnixNano()\n\tmsec := nano / int64(time.Millisecond)\n\treturn msec\n}\n\nfunc (v TimestampValue) String() string {\n\tmsec := v.epochMilli()\n\treturn strconv.FormatInt(msec, 10)\n}\n\n// encode encodes the TimestampValue into an eventstream binary value\n// representation.\nfunc (v TimestampValue) encode(w io.Writer) error {\n\traw := rawValue{\n\t\tType: v.valueType(),\n\t}\n\n\tmsec := v.epochMilli()\n\treturn raw.encodeScalar(w, msec)\n}\n\nfunc (v *TimestampValue) decode(r io.Reader) error {\n\tn, err := decodeUint64(r)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t*v = TimestampValue(timeFromEpochMilli(int64(n)))\n\treturn nil\n}\n\n// MarshalJSON implements the json.Marshaler interface\nfunc (v TimestampValue) MarshalJSON() ([]byte, error) {\n\treturn []byte(v.String()), nil\n}\n\nfunc timeFromEpochMilli(t int64) time.Time {\n\tsecs := t / 1e3\n\tmsec := t % 1e3\n\treturn time.Unix(secs, msec*int64(time.Millisecond)).UTC()\n}\n\n// An UUIDValue provides eventstream encoding, and representation of a UUID\n// value.\ntype UUIDValue [16]byte\n\n// Get returns the underlying value.\nfunc (v UUIDValue) Get() interface{} {\n\treturn v[:]\n}\n\n// valueType returns the EventStream header value type value.\nfunc (UUIDValue) valueType() valueType {\n\treturn uuidValueType\n}\n\nfunc (v UUIDValue) String() string {\n\tvar scratch [36]byte\n\n\tconst dash = '-'\n\n\thex.Encode(scratch[:8], v[0:4])\n\tscratch[8] = dash\n\thex.Encode(scratch[9:13], v[4:6])\n\tscratch[13] = dash\n\thex.Encode(scratch[14:18], v[6:8])\n\tscratch[18] = dash\n\thex.Encode(scratch[19:23], v[8:10])\n\tscratch[23] = dash\n\thex.Encode(scratch[24:], v[10:])\n\n\treturn string(scratch[:])\n}\n\n// encode encodes the UUIDValue into an eventstream binary value\n// representation.\nfunc (v UUIDValue) encode(w io.Writer) error {\n\traw := rawValue{\n\t\tType: v.valueType(),\n\t}\n\n\treturn raw.encodeFixedSlice(w, v[:])\n}\n\nfunc (v *UUIDValue) decode(r io.Reader) error {\n\ttv := (*v)[:]\n\treturn decodeFixedBytesValue(r, tv)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/message.go",
    "content": "package eventstream\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"hash/crc32\"\n)\n\nconst preludeLen = 8\nconst preludeCRCLen = 4\nconst msgCRCLen = 4\nconst minMsgLen = preludeLen + preludeCRCLen + msgCRCLen\n\nvar crc32IEEETable = crc32.MakeTable(crc32.IEEE)\n\n// A Message provides the eventstream message representation.\ntype Message struct {\n\tHeaders Headers\n\tPayload []byte\n}\n\nfunc (m *Message) rawMessage() (rawMessage, error) {\n\tvar raw rawMessage\n\n\tif len(m.Headers) > 0 {\n\t\tvar headers bytes.Buffer\n\t\tif err := EncodeHeaders(&headers, m.Headers); err != nil {\n\t\t\treturn rawMessage{}, err\n\t\t}\n\t\traw.Headers = headers.Bytes()\n\t\traw.HeadersLen = uint32(len(raw.Headers))\n\t}\n\n\traw.Length = raw.HeadersLen + uint32(len(m.Payload)) + minMsgLen\n\n\thash := crc32.New(crc32IEEETable)\n\tbinaryWriteFields(hash, binary.BigEndian, raw.Length, raw.HeadersLen)\n\traw.PreludeCRC = hash.Sum32()\n\n\tbinaryWriteFields(hash, binary.BigEndian, raw.PreludeCRC)\n\n\tif raw.HeadersLen > 0 {\n\t\thash.Write(raw.Headers)\n\t}\n\n\t// Read payload bytes and update hash for it as well.\n\tif len(m.Payload) > 0 {\n\t\traw.Payload = m.Payload\n\t\thash.Write(raw.Payload)\n\t}\n\n\traw.CRC = hash.Sum32()\n\n\treturn raw, nil\n}\n\n// Clone returns a deep copy of the message.\nfunc (m Message) Clone() Message {\n\tvar payload []byte\n\tif m.Payload != nil {\n\t\tpayload = make([]byte, len(m.Payload))\n\t\tcopy(payload, m.Payload)\n\t}\n\n\treturn Message{\n\t\tHeaders: m.Headers.Clone(),\n\t\tPayload: payload,\n\t}\n}\n\ntype messagePrelude struct {\n\tLength     uint32\n\tHeadersLen uint32\n\tPreludeCRC uint32\n}\n\nfunc (p messagePrelude) PayloadLen() uint32 {\n\treturn p.Length - p.HeadersLen - minMsgLen\n}\n\nfunc (p messagePrelude) ValidateLens() error {\n\tif p.Length == 0 {\n\t\treturn LengthError{\n\t\t\tPart: \"message prelude\",\n\t\t\tWant: minMsgLen,\n\t\t\tHave: int(p.Length),\n\t\t}\n\t}\n\treturn nil\n}\n\ntype rawMessage struct {\n\tmessagePrelude\n\n\tHeaders []byte\n\tPayload []byte\n\n\tCRC uint32\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/array.go",
    "content": "package query\n\nimport (\n\t\"net/url\"\n\t\"strconv\"\n)\n\n// Array represents the encoding of Query lists and sets. A Query array is a\n// representation of a list of values of a fixed type. A serialized array might\n// look like the following:\n//\n//\tListName.member.1=foo\n//\t&ListName.member.2=bar\n//\t&Listname.member.3=baz\ntype Array struct {\n\t// The query values to add the array to.\n\tvalues url.Values\n\t// The array's prefix, which includes the names of all parent structures\n\t// and ends with the name of the list. For example, the prefix might be\n\t// \"ParentStructure.ListName\". This prefix will be used to form the full\n\t// keys for each element in the list. For example, an entry might have the\n\t// key \"ParentStructure.ListName.member.MemberName.1\".\n\t//\n\t// When the array is not flat the prefix will contain the memberName otherwise the memberName is ignored\n\tprefix string\n\t// Elements are stored in values, so we keep track of the list size here.\n\tsize int32\n\t// Empty lists are encoded as \"<prefix>=\", if we add a value later we will\n\t// remove this encoding\n\temptyValue Value\n}\n\nfunc newArray(values url.Values, prefix string, flat bool, memberName string) *Array {\n\temptyValue := newValue(values, prefix, flat)\n\temptyValue.String(\"\")\n\n\tif !flat {\n\t\t// This uses string concatenation in place of fmt.Sprintf as fmt.Sprintf has a much higher resource overhead\n\t\tprefix = prefix + keySeparator + memberName\n\t}\n\n\treturn &Array{\n\t\tvalues:     values,\n\t\tprefix:     prefix,\n\t\temptyValue: emptyValue,\n\t}\n}\n\n// Value adds a new element to the Query Array. Returns a Value type used to\n// encode the array element.\nfunc (a *Array) Value() Value {\n\tif a.size == 0 {\n\t\tdelete(a.values, a.emptyValue.key)\n\t}\n\n\t// Query lists start a 1, so adjust the size first\n\ta.size++\n\t// Lists can't have flat members\n\t// This uses string concatenation in place of fmt.Sprintf as fmt.Sprintf has a much higher resource overhead\n\treturn newValue(a.values, a.prefix+keySeparator+strconv.FormatInt(int64(a.size), 10), false)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/encoder.go",
    "content": "package query\n\nimport (\n\t\"io\"\n\t\"net/url\"\n\t\"sort\"\n)\n\n// Encoder is a Query encoder that supports construction of Query body\n// values using methods.\ntype Encoder struct {\n\t// The query values that will be built up to manage encoding.\n\tvalues url.Values\n\t// The writer that the encoded body will be written to.\n\twriter io.Writer\n\tValue\n}\n\n// NewEncoder returns a new Query body encoder\nfunc NewEncoder(writer io.Writer) *Encoder {\n\tvalues := url.Values{}\n\treturn &Encoder{\n\t\tvalues: values,\n\t\twriter: writer,\n\t\tValue:  newBaseValue(values),\n\t}\n}\n\n// Encode returns the []byte slice representing the current\n// state of the Query encoder.\nfunc (e Encoder) Encode() error {\n\tws, ok := e.writer.(interface{ WriteString(string) (int, error) })\n\tif !ok {\n\t\t// Fall back to less optimal byte slice casting if WriteString isn't available.\n\t\tws = &wrapWriteString{writer: e.writer}\n\t}\n\n\t// Get the keys and sort them to have a stable output\n\tkeys := make([]string, 0, len(e.values))\n\tfor k := range e.values {\n\t\tkeys = append(keys, k)\n\t}\n\tsort.Strings(keys)\n\tisFirstEntry := true\n\tfor _, key := range keys {\n\t\tqueryValues := e.values[key]\n\t\tescapedKey := url.QueryEscape(key)\n\t\tfor _, value := range queryValues {\n\t\t\tif !isFirstEntry {\n\t\t\t\tif _, err := ws.WriteString(`&`); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tisFirstEntry = false\n\t\t\t}\n\t\t\tif _, err := ws.WriteString(escapedKey); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif _, err := ws.WriteString(`=`); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif _, err := ws.WriteString(url.QueryEscape(value)); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\n// wrapWriteString wraps an io.Writer to provide a WriteString method\n// where one is not available.\ntype wrapWriteString struct {\n\twriter io.Writer\n}\n\n// WriteString writes a string to the wrapped writer by casting it to\n// a byte array first.\nfunc (w wrapWriteString) WriteString(v string) (int, error) {\n\treturn w.writer.Write([]byte(v))\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/map.go",
    "content": "package query\n\nimport (\n\t\"fmt\"\n\t\"net/url\"\n)\n\n// Map represents the encoding of Query maps. A Query map is a representation\n// of a mapping of arbitrary string keys to arbitrary values of a fixed type.\n// A Map differs from an Object in that the set of keys is not fixed, in that\n// the values must all be of the same type, and that map entries are ordered.\n// A serialized map might look like the following:\n//\n//\tMapName.entry.1.key=Foo\n//\t&MapName.entry.1.value=spam\n//\t&MapName.entry.2.key=Bar\n//\t&MapName.entry.2.value=eggs\ntype Map struct {\n\t// The query values to add the map to.\n\tvalues url.Values\n\t// The map's prefix, which includes the names of all parent structures\n\t// and ends with the name of the object. For example, the prefix might be\n\t// \"ParentStructure.MapName\". This prefix will be used to form the full\n\t// keys for each key-value pair of the map. For example, a value might have\n\t// the key \"ParentStructure.MapName.1.value\".\n\t//\n\t// While this is currently represented as a string that gets added to, it\n\t// could also be represented as a stack that only gets condensed into a\n\t// string when a finalized key is created. This could potentially reduce\n\t// allocations.\n\tprefix string\n\t// Whether the map is flat or not. A map that is not flat will produce the\n\t// following entries to the url.Values for a given key-value pair:\n\t//     MapName.entry.1.KeyLocationName=mykey\n\t//     MapName.entry.1.ValueLocationName=myvalue\n\t// A map that is flat will produce the following:\n\t//     MapName.1.KeyLocationName=mykey\n\t//     MapName.1.ValueLocationName=myvalue\n\tflat bool\n\t// The location name of the key. In most cases this should be \"key\".\n\tkeyLocationName string\n\t// The location name of the value. In most cases this should be \"value\".\n\tvalueLocationName string\n\t// Elements are stored in values, so we keep track of the list size here.\n\tsize int32\n}\n\nfunc newMap(values url.Values, prefix string, flat bool, keyLocationName string, valueLocationName string) *Map {\n\treturn &Map{\n\t\tvalues:            values,\n\t\tprefix:            prefix,\n\t\tflat:              flat,\n\t\tkeyLocationName:   keyLocationName,\n\t\tvalueLocationName: valueLocationName,\n\t}\n}\n\n// Key adds the given named key to the Query map.\n// Returns a Value encoder that should be used to encode a Query value type.\nfunc (m *Map) Key(name string) Value {\n\t// Query lists start a 1, so adjust the size first\n\tm.size++\n\tvar key string\n\tvar value string\n\tif m.flat {\n\t\tkey = fmt.Sprintf(\"%s.%d.%s\", m.prefix, m.size, m.keyLocationName)\n\t\tvalue = fmt.Sprintf(\"%s.%d.%s\", m.prefix, m.size, m.valueLocationName)\n\t} else {\n\t\tkey = fmt.Sprintf(\"%s.entry.%d.%s\", m.prefix, m.size, m.keyLocationName)\n\t\tvalue = fmt.Sprintf(\"%s.entry.%d.%s\", m.prefix, m.size, m.valueLocationName)\n\t}\n\n\t// The key can only be a string, so we just go ahead and set it here\n\tnewValue(m.values, key, false).String(name)\n\n\t// Maps can't have flat members\n\treturn newValue(m.values, value, false)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/middleware.go",
    "content": "package query\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// AddAsGetRequestMiddleware adds a middleware to the Serialize stack after the\n// operation serializer that will convert the query request body to a GET\n// operation with the query message in the HTTP request querystring.\nfunc AddAsGetRequestMiddleware(stack *middleware.Stack) error {\n\treturn stack.Serialize.Insert(&asGetRequest{}, \"OperationSerializer\", middleware.After)\n}\n\ntype asGetRequest struct{}\n\nfunc (*asGetRequest) ID() string { return \"Query:AsGetRequest\" }\n\nfunc (m *asGetRequest) HandleSerialize(\n\tctx context.Context, input middleware.SerializeInput, next middleware.SerializeHandler,\n) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\treq, ok := input.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"expect smithy HTTP Request, got %T\", input.Request)\n\t}\n\n\treq.Method = \"GET\"\n\n\t// If the stream is not set, nothing else to do.\n\tstream := req.GetStream()\n\tif stream == nil {\n\t\treturn next.HandleSerialize(ctx, input)\n\t}\n\n\t// Clear the stream since there will not be any body.\n\treq.Header.Del(\"Content-Type\")\n\treq, err = req.SetStream(nil)\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"unable update request body %w\", err)\n\t}\n\tinput.Request = req\n\n\t// Update request query with the body's query string value.\n\tdelim := \"\"\n\tif len(req.URL.RawQuery) != 0 {\n\t\tdelim = \"&\"\n\t}\n\n\tb, err := ioutil.ReadAll(stream)\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"unable to get request body %w\", err)\n\t}\n\treq.URL.RawQuery += delim + string(b)\n\n\treturn next.HandleSerialize(ctx, input)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/object.go",
    "content": "package query\n\nimport \"net/url\"\n\n// Object represents the encoding of Query structures and unions. A Query\n// object is a representation of a mapping of string keys to arbitrary\n// values where there is a fixed set of keys whose values each have their\n// own known type. A serialized object might look like the following:\n//\n//\tObjectName.Foo=value\n//\t&ObjectName.Bar=5\ntype Object struct {\n\t// The query values to add the object to.\n\tvalues url.Values\n\t// The object's prefix, which includes the names of all parent structures\n\t// and ends with the name of the object. For example, the prefix might be\n\t// \"ParentStructure.ObjectName\". This prefix will be used to form the full\n\t// keys for each member of the object. For example, a member might have the\n\t// key \"ParentStructure.ObjectName.MemberName\".\n\t//\n\t// While this is currently represented as a string that gets added to, it\n\t// could also be represented as a stack that only gets condensed into a\n\t// string when a finalized key is created. This could potentially reduce\n\t// allocations.\n\tprefix string\n}\n\nfunc newObject(values url.Values, prefix string) *Object {\n\treturn &Object{\n\t\tvalues: values,\n\t\tprefix: prefix,\n\t}\n}\n\n// Key adds the given named key to the Query object.\n// Returns a Value encoder that should be used to encode a Query value type.\nfunc (o *Object) Key(name string) Value {\n\treturn o.key(name, false)\n}\n\n// KeyWithValues adds the given named key to the Query object.\n// Returns a Value encoder that should be used to encode a Query list of values.\nfunc (o *Object) KeyWithValues(name string) Value {\n\treturn o.keyWithValues(name, false)\n}\n\n// FlatKey adds the given named key to the Query object.\n// Returns a Value encoder that should be used to encode a Query value type. The\n// value will be flattened if it is a map or array.\nfunc (o *Object) FlatKey(name string) Value {\n\treturn o.key(name, true)\n}\n\nfunc (o *Object) key(name string, flatValue bool) Value {\n\tif o.prefix != \"\" {\n\t\t// This uses string concatenation in place of fmt.Sprintf as fmt.Sprintf has a much higher resource overhead\n\t\treturn newValue(o.values, o.prefix+keySeparator+name, flatValue)\n\t}\n\treturn newValue(o.values, name, flatValue)\n}\n\nfunc (o *Object) keyWithValues(name string, flatValue bool) Value {\n\tif o.prefix != \"\" {\n\t\t// This uses string concatenation in place of fmt.Sprintf as fmt.Sprintf has a much higher resource overhead\n\t\treturn newAppendValue(o.values, o.prefix+keySeparator+name, flatValue)\n\t}\n\treturn newAppendValue(o.values, name, flatValue)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/value.go",
    "content": "package query\n\nimport (\n\t\"math/big\"\n\t\"net/url\"\n\n\t\"github.com/aws/smithy-go/encoding/httpbinding\"\n)\n\nconst keySeparator = \".\"\n\n// Value represents a Query Value type.\ntype Value struct {\n\t// The query values to add the value to.\n\tvalues url.Values\n\t// The value's key, which will form the prefix for complex types.\n\tkey string\n\t// Whether the value should be flattened or not if it's a flattenable type.\n\tflat       bool\n\tqueryValue httpbinding.QueryValue\n}\n\nfunc newValue(values url.Values, key string, flat bool) Value {\n\treturn Value{\n\t\tvalues:     values,\n\t\tkey:        key,\n\t\tflat:       flat,\n\t\tqueryValue: httpbinding.NewQueryValue(values, key, false),\n\t}\n}\n\nfunc newAppendValue(values url.Values, key string, flat bool) Value {\n\treturn Value{\n\t\tvalues:     values,\n\t\tkey:        key,\n\t\tflat:       flat,\n\t\tqueryValue: httpbinding.NewQueryValue(values, key, true),\n\t}\n}\n\nfunc newBaseValue(values url.Values) Value {\n\treturn Value{\n\t\tvalues:     values,\n\t\tqueryValue: httpbinding.NewQueryValue(nil, \"\", false),\n\t}\n}\n\n// Array returns a new Array encoder.\nfunc (qv Value) Array(locationName string) *Array {\n\treturn newArray(qv.values, qv.key, qv.flat, locationName)\n}\n\n// Object returns a new Object encoder.\nfunc (qv Value) Object() *Object {\n\treturn newObject(qv.values, qv.key)\n}\n\n// Map returns a new Map encoder.\nfunc (qv Value) Map(keyLocationName string, valueLocationName string) *Map {\n\treturn newMap(qv.values, qv.key, qv.flat, keyLocationName, valueLocationName)\n}\n\n// Base64EncodeBytes encodes v as a base64 query string value.\n// This is intended to enable compatibility with the JSON encoder.\nfunc (qv Value) Base64EncodeBytes(v []byte) {\n\tqv.queryValue.Blob(v)\n}\n\n// Boolean encodes v as a query string value\nfunc (qv Value) Boolean(v bool) {\n\tqv.queryValue.Boolean(v)\n}\n\n// String encodes v as a query string value\nfunc (qv Value) String(v string) {\n\tqv.queryValue.String(v)\n}\n\n// Byte encodes v as a query string value\nfunc (qv Value) Byte(v int8) {\n\tqv.queryValue.Byte(v)\n}\n\n// Short encodes v as a query string value\nfunc (qv Value) Short(v int16) {\n\tqv.queryValue.Short(v)\n}\n\n// Integer encodes v as a query string value\nfunc (qv Value) Integer(v int32) {\n\tqv.queryValue.Integer(v)\n}\n\n// Long encodes v as a query string value\nfunc (qv Value) Long(v int64) {\n\tqv.queryValue.Long(v)\n}\n\n// Float encodes v as a query string value\nfunc (qv Value) Float(v float32) {\n\tqv.queryValue.Float(v)\n}\n\n// Double encodes v as a query string value\nfunc (qv Value) Double(v float64) {\n\tqv.queryValue.Double(v)\n}\n\n// BigInteger encodes v as a query string value\nfunc (qv Value) BigInteger(v *big.Int) {\n\tqv.queryValue.BigInteger(v)\n}\n\n// BigDecimal encodes v as a query string value\nfunc (qv Value) BigDecimal(v *big.Float) {\n\tqv.queryValue.BigDecimal(v)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/restjson/decoder_util.go",
    "content": "package restjson\n\nimport (\n\t\"encoding/json\"\n\t\"io\"\n\t\"strings\"\n\n\t\"github.com/aws/smithy-go\"\n)\n\n// GetErrorInfo util looks for code, __type, and message members in the\n// json body. These members are optionally available, and the function\n// returns the value of member if it is available. This function is useful to\n// identify the error code, msg in a REST JSON error response.\nfunc GetErrorInfo(decoder *json.Decoder) (errorType string, message string, err error) {\n\tvar errInfo struct {\n\t\tCode    string\n\t\tType    string `json:\"__type\"`\n\t\tMessage string\n\t}\n\n\terr = decoder.Decode(&errInfo)\n\tif err != nil {\n\t\tif err == io.EOF {\n\t\t\treturn errorType, message, nil\n\t\t}\n\t\treturn errorType, message, err\n\t}\n\n\t// assign error type\n\tif len(errInfo.Code) != 0 {\n\t\terrorType = errInfo.Code\n\t} else if len(errInfo.Type) != 0 {\n\t\terrorType = errInfo.Type\n\t}\n\n\t// assign error message\n\tif len(errInfo.Message) != 0 {\n\t\tmessage = errInfo.Message\n\t}\n\n\t// sanitize error\n\tif len(errorType) != 0 {\n\t\terrorType = SanitizeErrorCode(errorType)\n\t}\n\n\treturn errorType, message, nil\n}\n\n// SanitizeErrorCode sanitizes the errorCode string .\n// The rule for sanitizing is if a `:` character is present, then take only the\n// contents before the first : character in the value.\n// If a # character is present, then take only the contents after the\n// first # character in the value.\nfunc SanitizeErrorCode(errorCode string) string {\n\tif strings.ContainsAny(errorCode, \":\") {\n\t\terrorCode = strings.SplitN(errorCode, \":\", 2)[0]\n\t}\n\n\tif strings.ContainsAny(errorCode, \"#\") {\n\t\terrorCode = strings.SplitN(errorCode, \"#\", 2)[1]\n\t}\n\n\treturn errorCode\n}\n\n// GetSmithyGenericAPIError returns smithy generic api error and an error interface.\n// Takes in json decoder, and error Code string as args. The function retrieves error message\n// and error code from the decoder body. If errorCode of length greater than 0 is passed in as\n// an argument, it is used instead.\nfunc GetSmithyGenericAPIError(decoder *json.Decoder, errorCode string) (*smithy.GenericAPIError, error) {\n\terrorType, message, err := GetErrorInfo(decoder)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif len(errorCode) == 0 {\n\t\terrorCode = errorType\n\t}\n\n\treturn &smithy.GenericAPIError{\n\t\tCode:    errorCode,\n\t\tMessage: message,\n\t}, nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/xml/error_utils.go",
    "content": "package xml\n\nimport (\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"io\"\n)\n\n// ErrorComponents represents the error response fields\n// that will be deserialized from an xml error response body\ntype ErrorComponents struct {\n\tCode      string\n\tMessage   string\n\tRequestID string\n}\n\n// GetErrorResponseComponents returns the error fields from an xml error response body\nfunc GetErrorResponseComponents(r io.Reader, noErrorWrapping bool) (ErrorComponents, error) {\n\tif noErrorWrapping {\n\t\tvar errResponse noWrappedErrorResponse\n\t\tif err := xml.NewDecoder(r).Decode(&errResponse); err != nil && err != io.EOF {\n\t\t\treturn ErrorComponents{}, fmt.Errorf(\"error while deserializing xml error response: %w\", err)\n\t\t}\n\t\treturn ErrorComponents(errResponse), nil\n\t}\n\n\tvar errResponse wrappedErrorResponse\n\tif err := xml.NewDecoder(r).Decode(&errResponse); err != nil && err != io.EOF {\n\t\treturn ErrorComponents{}, fmt.Errorf(\"error while deserializing xml error response: %w\", err)\n\t}\n\treturn ErrorComponents(errResponse), nil\n}\n\n// noWrappedErrorResponse represents the error response body with\n// no internal Error wrapping\ntype noWrappedErrorResponse struct {\n\tCode      string `xml:\"Code\"`\n\tMessage   string `xml:\"Message\"`\n\tRequestID string `xml:\"RequestId\"`\n}\n\n// wrappedErrorResponse represents the error response body\n// wrapped within Error\ntype wrappedErrorResponse struct {\n\tCode      string `xml:\"Error>Code\"`\n\tMessage   string `xml:\"Error>Message\"`\n\tRequestID string `xml:\"RequestId\"`\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/ratelimit/none.go",
    "content": "package ratelimit\n\nimport \"context\"\n\n// None implements a no-op rate limiter which effectively disables client-side\n// rate limiting (also known as \"retry quotas\").\n//\n// GetToken does nothing and always returns a nil error. The returned\n// token-release function does nothing, and always returns a nil error.\n//\n// AddTokens does nothing and always returns a nil error.\nvar None = &none{}\n\ntype none struct{}\n\nfunc (*none) GetToken(ctx context.Context, cost uint) (func() error, error) {\n\treturn func() error { return nil }, nil\n}\n\nfunc (*none) AddTokens(v uint) error { return nil }\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/ratelimit/token_bucket.go",
    "content": "package ratelimit\n\nimport (\n\t\"sync\"\n)\n\n// TokenBucket provides a concurrency safe utility for adding and removing\n// tokens from the available token bucket.\ntype TokenBucket struct {\n\tremainingTokens uint\n\tmaxCapacity     uint\n\tminCapacity     uint\n\tmu              sync.Mutex\n}\n\n// NewTokenBucket returns an initialized TokenBucket with the capacity\n// specified.\nfunc NewTokenBucket(i uint) *TokenBucket {\n\treturn &TokenBucket{\n\t\tremainingTokens: i,\n\t\tmaxCapacity:     i,\n\t\tminCapacity:     1,\n\t}\n}\n\n// Retrieve attempts to reduce the available tokens by the amount requested. If\n// there are tokens available true will be returned along with the number of\n// available tokens remaining. If amount requested is larger than the available\n// capacity, false will be returned along with the available capacity. If the\n// amount is less than the available capacity, the capacity will be reduced by\n// that amount, and the remaining capacity and true will be returned.\nfunc (t *TokenBucket) Retrieve(amount uint) (available uint, retrieved bool) {\n\tt.mu.Lock()\n\tdefer t.mu.Unlock()\n\n\tif amount > t.remainingTokens {\n\t\treturn t.remainingTokens, false\n\t}\n\n\tt.remainingTokens -= amount\n\treturn t.remainingTokens, true\n}\n\n// Refund returns the amount of tokens back to the available token bucket, up\n// to the initial capacity.\nfunc (t *TokenBucket) Refund(amount uint) {\n\tt.mu.Lock()\n\tdefer t.mu.Unlock()\n\n\t// Capacity cannot exceed max capacity.\n\tt.remainingTokens = uintMin(t.remainingTokens+amount, t.maxCapacity)\n}\n\n// Capacity returns the maximum capacity of tokens that the bucket could\n// contain.\nfunc (t *TokenBucket) Capacity() uint {\n\tt.mu.Lock()\n\tdefer t.mu.Unlock()\n\n\treturn t.maxCapacity\n}\n\n// Remaining returns the number of tokens that remaining in the bucket.\nfunc (t *TokenBucket) Remaining() uint {\n\tt.mu.Lock()\n\tdefer t.mu.Unlock()\n\n\treturn t.remainingTokens\n}\n\n// Resize adjusts the size of the token bucket. Returns the capacity remaining.\nfunc (t *TokenBucket) Resize(size uint) uint {\n\tt.mu.Lock()\n\tdefer t.mu.Unlock()\n\n\tt.maxCapacity = uintMax(size, t.minCapacity)\n\n\t// Capacity needs to be capped at max capacity, if max size reduced.\n\tt.remainingTokens = uintMin(t.remainingTokens, t.maxCapacity)\n\n\treturn t.remainingTokens\n}\n\nfunc uintMin(a, b uint) uint {\n\tif a < b {\n\t\treturn a\n\t}\n\treturn b\n}\n\nfunc uintMax(a, b uint) uint {\n\tif a > b {\n\t\treturn a\n\t}\n\treturn b\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/ratelimit/token_rate_limit.go",
    "content": "package ratelimit\n\nimport (\n\t\"context\"\n\t\"fmt\"\n)\n\ntype rateToken struct {\n\ttokenCost uint\n\tbucket    *TokenBucket\n}\n\nfunc (t rateToken) release() error {\n\tt.bucket.Refund(t.tokenCost)\n\treturn nil\n}\n\n// TokenRateLimit provides a Token Bucket RateLimiter implementation\n// that limits the overall number of retry attempts that can be made across\n// operation invocations.\ntype TokenRateLimit struct {\n\tbucket *TokenBucket\n}\n\n// NewTokenRateLimit returns an TokenRateLimit with default values.\n// Functional options can configure the retry rate limiter.\nfunc NewTokenRateLimit(tokens uint) *TokenRateLimit {\n\treturn &TokenRateLimit{\n\t\tbucket: NewTokenBucket(tokens),\n\t}\n}\n\ntype canceledError struct {\n\tErr error\n}\n\nfunc (c canceledError) CanceledError() bool { return true }\nfunc (c canceledError) Unwrap() error       { return c.Err }\nfunc (c canceledError) Error() string {\n\treturn fmt.Sprintf(\"canceled, %v\", c.Err)\n}\n\n// GetToken may cause a available pool of retry quota to be\n// decremented. Will return an error if the decremented value can not be\n// reduced from the retry quota.\nfunc (l *TokenRateLimit) GetToken(ctx context.Context, cost uint) (func() error, error) {\n\tselect {\n\tcase <-ctx.Done():\n\t\treturn nil, canceledError{Err: ctx.Err()}\n\tdefault:\n\t}\n\tif avail, ok := l.bucket.Retrieve(cost); !ok {\n\t\treturn nil, QuotaExceededError{Available: avail, Requested: cost}\n\t}\n\n\treturn rateToken{\n\t\ttokenCost: cost,\n\t\tbucket:    l.bucket,\n\t}.release, nil\n}\n\n// AddTokens increments the token bucket by a fixed amount.\nfunc (l *TokenRateLimit) AddTokens(v uint) error {\n\tl.bucket.Refund(v)\n\treturn nil\n}\n\n// Remaining returns the number of remaining tokens in the bucket.\nfunc (l *TokenRateLimit) Remaining() uint {\n\treturn l.bucket.Remaining()\n}\n\n// QuotaExceededError provides the SDK error when the retries for a given\n// token bucket have been exhausted.\ntype QuotaExceededError struct {\n\tAvailable uint\n\tRequested uint\n}\n\nfunc (e QuotaExceededError) Error() string {\n\treturn fmt.Sprintf(\"retry quota exceeded, %d available, %d requested\",\n\t\te.Available, e.Requested)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/request.go",
    "content": "package aws\n\nimport (\n\t\"fmt\"\n)\n\n// TODO remove replace with smithy.CanceledError\n\n// RequestCanceledError is the error that will be returned by an API request\n// that was canceled. Requests given a Context may return this error when\n// canceled.\ntype RequestCanceledError struct {\n\tErr error\n}\n\n// CanceledError returns true to satisfy interfaces checking for canceled errors.\nfunc (*RequestCanceledError) CanceledError() bool { return true }\n\n// Unwrap returns the underlying error, if there was one.\nfunc (e *RequestCanceledError) Unwrap() error {\n\treturn e.Err\n}\nfunc (e *RequestCanceledError) Error() string {\n\treturn fmt.Sprintf(\"request canceled, %v\", e.Err)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/retry/adaptive.go",
    "content": "package retry\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/sdk\"\n)\n\nconst (\n\t// DefaultRequestCost is the cost of a single request from the adaptive\n\t// rate limited token bucket.\n\tDefaultRequestCost uint = 1\n)\n\n// DefaultThrottles provides the set of errors considered throttle errors that\n// are checked by default.\nvar DefaultThrottles = []IsErrorThrottle{\n\tThrottleErrorCode{\n\t\tCodes: DefaultThrottleErrorCodes,\n\t},\n}\n\n// AdaptiveModeOptions provides the functional options for configuring the\n// adaptive retry mode, and delay behavior.\ntype AdaptiveModeOptions struct {\n\t// If the adaptive token bucket is empty, when an attempt will be made\n\t// AdaptiveMode will sleep until a token is available. This can occur when\n\t// attempts fail with throttle errors. Use this option to disable the sleep\n\t// until token is available, and return error immediately.\n\tFailOnNoAttemptTokens bool\n\n\t// The cost of an attempt from the AdaptiveMode's adaptive token bucket.\n\tRequestCost uint\n\n\t// Set of strategies to determine if the attempt failed due to a throttle\n\t// error.\n\t//\n\t// It is safe to append to this list in NewAdaptiveMode's functional options.\n\tThrottles []IsErrorThrottle\n\n\t// Set of options for standard retry mode that AdaptiveMode is built on top\n\t// of. AdaptiveMode may apply its own defaults to Standard retry mode that\n\t// are different than the defaults of NewStandard. Use these options to\n\t// override the default options.\n\tStandardOptions []func(*StandardOptions)\n}\n\n// AdaptiveMode provides an experimental retry strategy that expands on the\n// Standard retry strategy, adding client attempt rate limits. The attempt rate\n// limit is initially unrestricted, but becomes restricted when the attempt\n// fails with for a throttle error. When restricted AdaptiveMode may need to\n// sleep before an attempt is made, if too many throttles have been received.\n// AdaptiveMode's sleep can be canceled with context cancel. Set\n// AdaptiveModeOptions FailOnNoAttemptTokens to change the behavior from sleep,\n// to fail fast.\n//\n// Eventually unrestricted attempt rate limit will be restored once attempts no\n// longer are failing due to throttle errors.\ntype AdaptiveMode struct {\n\toptions   AdaptiveModeOptions\n\tthrottles IsErrorThrottles\n\n\tretryer   aws.RetryerV2\n\trateLimit *adaptiveRateLimit\n}\n\n// NewAdaptiveMode returns an initialized AdaptiveMode retry strategy.\nfunc NewAdaptiveMode(optFns ...func(*AdaptiveModeOptions)) *AdaptiveMode {\n\to := AdaptiveModeOptions{\n\t\tRequestCost: DefaultRequestCost,\n\t\tThrottles:   append([]IsErrorThrottle{}, DefaultThrottles...),\n\t}\n\tfor _, fn := range optFns {\n\t\tfn(&o)\n\t}\n\n\treturn &AdaptiveMode{\n\t\toptions:   o,\n\t\tthrottles: IsErrorThrottles(o.Throttles),\n\t\tretryer:   NewStandard(o.StandardOptions...),\n\t\trateLimit: newAdaptiveRateLimit(),\n\t}\n}\n\n// IsErrorRetryable returns if the failed attempt is retryable. This check\n// should determine if the error can be retried, or if the error is\n// terminal.\nfunc (a *AdaptiveMode) IsErrorRetryable(err error) bool {\n\treturn a.retryer.IsErrorRetryable(err)\n}\n\n// MaxAttempts returns the maximum number of attempts that can be made for\n// an attempt before failing. A value of 0 implies that the attempt should\n// be retried until it succeeds if the errors are retryable.\nfunc (a *AdaptiveMode) MaxAttempts() int {\n\treturn a.retryer.MaxAttempts()\n}\n\n// RetryDelay returns the delay that should be used before retrying the\n// attempt. Will return error if the if the delay could not be determined.\nfunc (a *AdaptiveMode) RetryDelay(attempt int, opErr error) (\n\ttime.Duration, error,\n) {\n\treturn a.retryer.RetryDelay(attempt, opErr)\n}\n\n// GetRetryToken attempts to deduct the retry cost from the retry token pool.\n// Returning the token release function, or error.\nfunc (a *AdaptiveMode) GetRetryToken(ctx context.Context, opErr error) (\n\treleaseToken func(error) error, err error,\n) {\n\treturn a.retryer.GetRetryToken(ctx, opErr)\n}\n\n// GetInitialToken returns the initial attempt token that can increment the\n// retry token pool if the attempt is successful.\n//\n// Deprecated: This method does not provide a way to block using Context,\n// nor can it return an error. Use RetryerV2, and GetAttemptToken instead. Only\n// present to implement Retryer interface.\nfunc (a *AdaptiveMode) GetInitialToken() (releaseToken func(error) error) {\n\treturn nopRelease\n}\n\n// GetAttemptToken returns the attempt token that can be used to rate limit\n// attempt calls. Will be used by the SDK's retry package's Attempt\n// middleware to get an attempt token prior to calling the temp and releasing\n// the attempt token after the attempt has been made.\nfunc (a *AdaptiveMode) GetAttemptToken(ctx context.Context) (func(error) error, error) {\n\tfor {\n\t\tacquiredToken, waitTryAgain := a.rateLimit.AcquireToken(a.options.RequestCost)\n\t\tif acquiredToken {\n\t\t\tbreak\n\t\t}\n\t\tif a.options.FailOnNoAttemptTokens {\n\t\t\treturn nil, fmt.Errorf(\n\t\t\t\t\"unable to get attempt token, and FailOnNoAttemptTokens enables\")\n\t\t}\n\n\t\tif err := sdk.SleepWithContext(ctx, waitTryAgain); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to wait for token to be available, %w\", err)\n\t\t}\n\t}\n\n\treturn a.handleResponse, nil\n}\n\nfunc (a *AdaptiveMode) handleResponse(opErr error) error {\n\tthrottled := a.throttles.IsErrorThrottle(opErr).Bool()\n\n\ta.rateLimit.Update(throttled)\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/retry/adaptive_ratelimit.go",
    "content": "package retry\n\nimport (\n\t\"math\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/internal/sdk\"\n)\n\ntype adaptiveRateLimit struct {\n\ttokenBucketEnabled bool\n\n\tsmooth        float64\n\tbeta          float64\n\tscaleConstant float64\n\tminFillRate   float64\n\n\tfillRate         float64\n\tcalculatedRate   float64\n\tlastRefilled     time.Time\n\tmeasuredTxRate   float64\n\tlastTxRateBucket float64\n\trequestCount     int64\n\tlastMaxRate      float64\n\tlastThrottleTime time.Time\n\ttimeWindow       float64\n\n\ttokenBucket *adaptiveTokenBucket\n\n\tmu sync.Mutex\n}\n\nfunc newAdaptiveRateLimit() *adaptiveRateLimit {\n\tnow := sdk.NowTime()\n\treturn &adaptiveRateLimit{\n\t\tsmooth:        0.8,\n\t\tbeta:          0.7,\n\t\tscaleConstant: 0.4,\n\n\t\tminFillRate: 0.5,\n\n\t\tlastTxRateBucket: math.Floor(timeFloat64Seconds(now)),\n\t\tlastThrottleTime: now,\n\n\t\ttokenBucket: newAdaptiveTokenBucket(0),\n\t}\n}\n\nfunc (a *adaptiveRateLimit) Enable(v bool) {\n\ta.mu.Lock()\n\tdefer a.mu.Unlock()\n\n\ta.tokenBucketEnabled = v\n}\n\nfunc (a *adaptiveRateLimit) AcquireToken(amount uint) (\n\ttokenAcquired bool, waitTryAgain time.Duration,\n) {\n\ta.mu.Lock()\n\tdefer a.mu.Unlock()\n\n\tif !a.tokenBucketEnabled {\n\t\treturn true, 0\n\t}\n\n\ta.tokenBucketRefill()\n\n\tavailable, ok := a.tokenBucket.Retrieve(float64(amount))\n\tif !ok {\n\t\twaitDur := float64Seconds((float64(amount) - available) / a.fillRate)\n\t\treturn false, waitDur\n\t}\n\n\treturn true, 0\n}\n\nfunc (a *adaptiveRateLimit) Update(throttled bool) {\n\ta.mu.Lock()\n\tdefer a.mu.Unlock()\n\n\ta.updateMeasuredRate()\n\n\tif throttled {\n\t\trateToUse := a.measuredTxRate\n\t\tif a.tokenBucketEnabled {\n\t\t\trateToUse = math.Min(a.measuredTxRate, a.fillRate)\n\t\t}\n\n\t\ta.lastMaxRate = rateToUse\n\t\ta.calculateTimeWindow()\n\t\ta.lastThrottleTime = sdk.NowTime()\n\t\ta.calculatedRate = a.cubicThrottle(rateToUse)\n\t\ta.tokenBucketEnabled = true\n\t} else {\n\t\ta.calculateTimeWindow()\n\t\ta.calculatedRate = a.cubicSuccess(sdk.NowTime())\n\t}\n\n\tnewRate := math.Min(a.calculatedRate, 2*a.measuredTxRate)\n\ta.tokenBucketUpdateRate(newRate)\n}\n\nfunc (a *adaptiveRateLimit) cubicSuccess(t time.Time) float64 {\n\tdt := secondsFloat64(t.Sub(a.lastThrottleTime))\n\treturn (a.scaleConstant * math.Pow(dt-a.timeWindow, 3)) + a.lastMaxRate\n}\n\nfunc (a *adaptiveRateLimit) cubicThrottle(rateToUse float64) float64 {\n\treturn rateToUse * a.beta\n}\n\nfunc (a *adaptiveRateLimit) calculateTimeWindow() {\n\ta.timeWindow = math.Pow((a.lastMaxRate*(1.-a.beta))/a.scaleConstant, 1./3.)\n}\n\nfunc (a *adaptiveRateLimit) tokenBucketUpdateRate(newRPS float64) {\n\ta.tokenBucketRefill()\n\ta.fillRate = math.Max(newRPS, a.minFillRate)\n\ta.tokenBucket.Resize(newRPS)\n}\n\nfunc (a *adaptiveRateLimit) updateMeasuredRate() {\n\tnow := sdk.NowTime()\n\ttimeBucket := math.Floor(timeFloat64Seconds(now)*2.) / 2.\n\ta.requestCount++\n\n\tif timeBucket > a.lastTxRateBucket {\n\t\tcurrentRate := float64(a.requestCount) / (timeBucket - a.lastTxRateBucket)\n\t\ta.measuredTxRate = (currentRate * a.smooth) + (a.measuredTxRate * (1. - a.smooth))\n\t\ta.requestCount = 0\n\t\ta.lastTxRateBucket = timeBucket\n\t}\n}\n\nfunc (a *adaptiveRateLimit) tokenBucketRefill() {\n\tnow := sdk.NowTime()\n\tif a.lastRefilled.IsZero() {\n\t\ta.lastRefilled = now\n\t\treturn\n\t}\n\n\tfillAmount := secondsFloat64(now.Sub(a.lastRefilled)) * a.fillRate\n\ta.tokenBucket.Refund(fillAmount)\n\ta.lastRefilled = now\n}\n\nfunc float64Seconds(v float64) time.Duration {\n\treturn time.Duration(v * float64(time.Second))\n}\n\nfunc secondsFloat64(v time.Duration) float64 {\n\treturn float64(v) / float64(time.Second)\n}\n\nfunc timeFloat64Seconds(v time.Time) float64 {\n\treturn float64(v.UnixNano()) / float64(time.Second)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/retry/adaptive_token_bucket.go",
    "content": "package retry\n\nimport (\n\t\"math\"\n\t\"sync\"\n)\n\n// adaptiveTokenBucket provides a concurrency safe utility for adding and\n// removing tokens from the available token bucket.\ntype adaptiveTokenBucket struct {\n\tremainingTokens float64\n\tmaxCapacity     float64\n\tminCapacity     float64\n\tmu              sync.Mutex\n}\n\n// newAdaptiveTokenBucket returns an initialized adaptiveTokenBucket with the\n// capacity specified.\nfunc newAdaptiveTokenBucket(i float64) *adaptiveTokenBucket {\n\treturn &adaptiveTokenBucket{\n\t\tremainingTokens: i,\n\t\tmaxCapacity:     i,\n\t\tminCapacity:     1,\n\t}\n}\n\n// Retrieve attempts to reduce the available tokens by the amount requested. If\n// there are tokens available true will be returned along with the number of\n// available tokens remaining. If amount requested is larger than the available\n// capacity, false will be returned along with the available capacity. If the\n// amount is less than the available capacity, the capacity will be reduced by\n// that amount, and the remaining capacity and true will be returned.\nfunc (t *adaptiveTokenBucket) Retrieve(amount float64) (available float64, retrieved bool) {\n\tt.mu.Lock()\n\tdefer t.mu.Unlock()\n\n\tif amount > t.remainingTokens {\n\t\treturn t.remainingTokens, false\n\t}\n\n\tt.remainingTokens -= amount\n\treturn t.remainingTokens, true\n}\n\n// Refund returns the amount of tokens back to the available token bucket, up\n// to the initial capacity.\nfunc (t *adaptiveTokenBucket) Refund(amount float64) {\n\tt.mu.Lock()\n\tdefer t.mu.Unlock()\n\n\t// Capacity cannot exceed max capacity.\n\tt.remainingTokens = math.Min(t.remainingTokens+amount, t.maxCapacity)\n}\n\n// Capacity returns the maximum capacity of tokens that the bucket could\n// contain.\nfunc (t *adaptiveTokenBucket) Capacity() float64 {\n\tt.mu.Lock()\n\tdefer t.mu.Unlock()\n\n\treturn t.maxCapacity\n}\n\n// Remaining returns the number of tokens that remaining in the bucket.\nfunc (t *adaptiveTokenBucket) Remaining() float64 {\n\tt.mu.Lock()\n\tdefer t.mu.Unlock()\n\n\treturn t.remainingTokens\n}\n\n// Resize adjusts the size of the token bucket. Returns the capacity remaining.\nfunc (t *adaptiveTokenBucket) Resize(size float64) float64 {\n\tt.mu.Lock()\n\tdefer t.mu.Unlock()\n\n\tt.maxCapacity = math.Max(size, t.minCapacity)\n\n\t// Capacity needs to be capped at max capacity, if max size reduced.\n\tt.remainingTokens = math.Min(t.remainingTokens, t.maxCapacity)\n\n\treturn t.remainingTokens\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/retry/attempt_metrics.go",
    "content": "package retry\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/smithy-go/metrics\"\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\ntype attemptMetrics struct {\n\tAttempts metrics.Int64Counter\n\tErrors   metrics.Int64Counter\n\n\tAttemptDuration metrics.Float64Histogram\n}\n\nfunc newAttemptMetrics(meter metrics.Meter) (*attemptMetrics, error) {\n\tm := &attemptMetrics{}\n\tvar err error\n\n\tm.Attempts, err = meter.Int64Counter(\"client.call.attempts\", func(o *metrics.InstrumentOptions) {\n\t\to.UnitLabel = \"{attempt}\"\n\t\to.Description = \"The number of attempts for an individual operation\"\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tm.Errors, err = meter.Int64Counter(\"client.call.errors\", func(o *metrics.InstrumentOptions) {\n\t\to.UnitLabel = \"{error}\"\n\t\to.Description = \"The number of errors for an operation\"\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tm.AttemptDuration, err = meter.Float64Histogram(\"client.call.attempt_duration\", func(o *metrics.InstrumentOptions) {\n\t\to.UnitLabel = \"s\"\n\t\to.Description = \"The time it takes to connect to the service, send the request, and get back HTTP status code and headers (including time queued waiting to be sent)\"\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn m, nil\n}\n\nfunc withOperationMetadata(ctx context.Context) metrics.RecordMetricOption {\n\treturn func(o *metrics.RecordMetricOptions) {\n\t\to.Properties.Set(\"rpc.service\", middleware.GetServiceID(ctx))\n\t\to.Properties.Set(\"rpc.method\", middleware.GetOperationName(ctx))\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/retry/doc.go",
    "content": "// Package retry provides interfaces and implementations for SDK request retry behavior.\n//\n// # Retryer Interface and Implementations\n//\n// This package defines Retryer interface that is used to either implement custom retry behavior\n// or to extend the existing retry implementations provided by the SDK. This package provides a single\n// retry implementation: Standard.\n//\n// # Standard\n//\n// Standard is the default retryer implementation used by service clients. The standard retryer is a rate limited\n// retryer that has a configurable max attempts to limit the number of retry attempts when a retryable error occurs.\n// In addition, the retryer uses a configurable token bucket to rate limit the retry attempts across the client,\n// and uses an additional delay policy to limit the time between a requests subsequent attempts.\n//\n// By default the standard retryer uses the DefaultRetryables slice of IsErrorRetryable types to determine whether\n// a given error is retryable. By default this list of retryables includes the following:\n//   - Retrying errors that implement the RetryableError method, and return true.\n//   - Connection Errors\n//   - Errors that implement a ConnectionError, Temporary, or Timeout method that return true.\n//   - Connection Reset Errors.\n//   - net.OpErr types that are dialing errors or are temporary.\n//   - HTTP Status Codes: 500, 502, 503, and 504.\n//   - API Error Codes\n//   - RequestTimeout, RequestTimeoutException\n//   - Throttling, ThrottlingException, ThrottledException, RequestThrottledException, TooManyRequestsException,\n//     RequestThrottled, SlowDown, EC2ThrottledException\n//   - ProvisionedThroughputExceededException, RequestLimitExceeded, BandwidthLimitExceeded, LimitExceededException\n//   - TransactionInProgressException, PriorRequestNotComplete\n//\n// The standard retryer will not retry a request in the event if the context associated with the request\n// has been cancelled. Applications must handle this case explicitly if they wish to retry with a different context\n// value.\n//\n// You can configure the standard retryer implementation to fit your applications by constructing a standard retryer\n// using the NewStandard function, and providing one more functional argument that mutate the StandardOptions\n// structure. StandardOptions provides the ability to modify the token bucket rate limiter, retryable error conditions,\n// and the retry delay policy.\n//\n// For example to modify the default retry attempts for the standard retryer:\n//\n//\t// configure the custom retryer\n//\tcustomRetry := retry.NewStandard(func(o *retry.StandardOptions) {\n//\t    o.MaxAttempts = 5\n//\t})\n//\n//\t// create a service client with the retryer\n//\ts3.NewFromConfig(cfg, func(o *s3.Options) {\n//\t    o.Retryer = customRetry\n//\t})\n//\n// # Utilities\n//\n// A number of package functions have been provided to easily wrap retryer implementations in an implementation agnostic\n// way. These are:\n//\n//\tAddWithErrorCodes      - Provides the ability to add additional API error codes that should be considered retryable\n//\t                        in addition to those considered retryable by the provided retryer.\n//\n//\tAddWithMaxAttempts     - Provides the ability to set the max number of attempts for retrying a request by wrapping\n//\t                         a retryer implementation.\n//\n//\tAddWithMaxBackoffDelay - Provides the ability to set the max back off delay that can occur before retrying a\n//\t                         request by wrapping a retryer implementation.\n//\n// The following package functions have been provided to easily satisfy different retry interfaces to further customize\n// a given retryer's behavior:\n//\n//\tBackoffDelayerFunc   - Can be used to wrap a function to satisfy the BackoffDelayer interface. For example,\n//\t                       you can use this method to easily create custom back off policies to be used with the\n//\t                       standard retryer.\n//\n//\tIsErrorRetryableFunc - Can be used to wrap a function to satisfy the IsErrorRetryable interface. For example,\n//\t                       this can be used to extend the standard retryer to add additional logic to determine if an\n//\t                       error should be retried.\n//\n//\tIsErrorTimeoutFunc   - Can be used to wrap a function to satisfy IsErrorTimeout interface. For example,\n//\t                       this can be used to extend the standard retryer to add additional logic to determine if an\n//\t                        error should be considered a timeout.\npackage retry\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/retry/errors.go",
    "content": "package retry\n\nimport \"fmt\"\n\n// MaxAttemptsError provides the error when the maximum number of attempts have\n// been exceeded.\ntype MaxAttemptsError struct {\n\tAttempt int\n\tErr     error\n}\n\nfunc (e *MaxAttemptsError) Error() string {\n\treturn fmt.Sprintf(\"exceeded maximum number of attempts, %d, %v\", e.Attempt, e.Err)\n}\n\n// Unwrap returns the nested error causing the max attempts error. Provides the\n// implementation for errors.Is and errors.As to unwrap nested errors.\nfunc (e *MaxAttemptsError) Unwrap() error {\n\treturn e.Err\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/retry/jitter_backoff.go",
    "content": "package retry\n\nimport (\n\t\"math\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/internal/rand\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/timeconv\"\n)\n\n// ExponentialJitterBackoff provides backoff delays with jitter based on the\n// number of attempts.\ntype ExponentialJitterBackoff struct {\n\tmaxBackoff time.Duration\n\t// precomputed number of attempts needed to reach max backoff.\n\tmaxBackoffAttempts float64\n\n\trandFloat64 func() (float64, error)\n}\n\n// NewExponentialJitterBackoff returns an ExponentialJitterBackoff configured\n// for the max backoff.\nfunc NewExponentialJitterBackoff(maxBackoff time.Duration) *ExponentialJitterBackoff {\n\treturn &ExponentialJitterBackoff{\n\t\tmaxBackoff: maxBackoff,\n\t\tmaxBackoffAttempts: math.Log2(\n\t\t\tfloat64(maxBackoff) / float64(time.Second)),\n\t\trandFloat64: rand.CryptoRandFloat64,\n\t}\n}\n\n// BackoffDelay returns the duration to wait before the next attempt should be\n// made. Returns an error if unable get a duration.\nfunc (j *ExponentialJitterBackoff) BackoffDelay(attempt int, err error) (time.Duration, error) {\n\tif attempt > int(j.maxBackoffAttempts) {\n\t\treturn j.maxBackoff, nil\n\t}\n\n\tb, err := j.randFloat64()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// [0.0, 1.0) * 2 ^ attempts\n\tri := int64(1 << uint64(attempt))\n\tdelaySeconds := b * float64(ri)\n\n\treturn timeconv.FloatSecondsDur(delaySeconds), nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/retry/metadata.go",
    "content": "package retry\n\nimport (\n\tawsmiddle \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\n// attemptResultsKey is a metadata accessor key to retrieve metadata\n// for all request attempts.\ntype attemptResultsKey struct {\n}\n\n// GetAttemptResults retrieves attempts results from middleware metadata.\nfunc GetAttemptResults(metadata middleware.Metadata) (AttemptResults, bool) {\n\tm, ok := metadata.Get(attemptResultsKey{}).(AttemptResults)\n\treturn m, ok\n}\n\n// AttemptResults represents struct containing metadata returned by all request attempts.\ntype AttemptResults struct {\n\n\t// Results is a slice consisting attempt result from all request attempts.\n\t// Results are stored in order request attempt is made.\n\tResults []AttemptResult\n}\n\n// AttemptResult represents attempt result returned by a single request attempt.\ntype AttemptResult struct {\n\n\t// Err is the error if received for the request attempt.\n\tErr error\n\n\t// Retryable denotes if request may be retried. This states if an\n\t// error is considered retryable.\n\tRetryable bool\n\n\t// Retried indicates if this request was retried.\n\tRetried bool\n\n\t// ResponseMetadata is any existing metadata passed via the response middlewares.\n\tResponseMetadata middleware.Metadata\n}\n\n// addAttemptResults adds attempt results to middleware metadata\nfunc addAttemptResults(metadata *middleware.Metadata, v AttemptResults) {\n\tmetadata.Set(attemptResultsKey{}, v)\n}\n\n// GetRawResponse returns raw response recorded for the attempt result\nfunc (a AttemptResult) GetRawResponse() interface{} {\n\treturn awsmiddle.GetRawResponse(a.ResponseMetadata)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/retry/middleware.go",
    "content": "package retry\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\tinternalcontext \"github.com/aws/aws-sdk-go-v2/internal/context\"\n\t\"github.com/aws/smithy-go\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\tawsmiddle \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/sdk\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"github.com/aws/smithy-go/metrics\"\n\tsmithymiddle \"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/tracing\"\n\t\"github.com/aws/smithy-go/transport/http\"\n)\n\n// RequestCloner is a function that can take an input request type and clone\n// the request for use in a subsequent retry attempt.\ntype RequestCloner func(interface{}) interface{}\n\ntype retryMetadata struct {\n\tAttemptNum       int\n\tAttemptTime      time.Time\n\tMaxAttempts      int\n\tAttemptClockSkew time.Duration\n}\n\n// Attempt is a Smithy Finalize middleware that handles retry attempts using\n// the provided Retryer implementation.\ntype Attempt struct {\n\t// Enable the logging of retry attempts performed by the SDK. This will\n\t// include logging retry attempts, unretryable errors, and when max\n\t// attempts are reached.\n\tLogAttempts bool\n\n\t// A Meter instance for recording retry-related metrics.\n\tOperationMeter metrics.Meter\n\n\tretryer       aws.RetryerV2\n\trequestCloner RequestCloner\n}\n\n// define the threshold at which we will consider certain kind of errors to be probably\n// caused by clock skew\nconst skewThreshold = 4 * time.Minute\n\n// NewAttemptMiddleware returns a new Attempt retry middleware.\nfunc NewAttemptMiddleware(retryer aws.Retryer, requestCloner RequestCloner, optFns ...func(*Attempt)) *Attempt {\n\tm := &Attempt{\n\t\tretryer:       wrapAsRetryerV2(retryer),\n\t\trequestCloner: requestCloner,\n\t}\n\tfor _, fn := range optFns {\n\t\tfn(m)\n\t}\n\tif m.OperationMeter == nil {\n\t\tm.OperationMeter = metrics.NopMeterProvider{}.Meter(\"\")\n\t}\n\n\treturn m\n}\n\n// ID returns the middleware identifier\nfunc (r *Attempt) ID() string { return \"Retry\" }\n\nfunc (r Attempt) logf(logger logging.Logger, classification logging.Classification, format string, v ...interface{}) {\n\tif !r.LogAttempts {\n\t\treturn\n\t}\n\tlogger.Logf(classification, format, v...)\n}\n\n// HandleFinalize utilizes the provider Retryer implementation to attempt\n// retries over the next handler\nfunc (r *Attempt) HandleFinalize(ctx context.Context, in smithymiddle.FinalizeInput, next smithymiddle.FinalizeHandler) (\n\tout smithymiddle.FinalizeOutput, metadata smithymiddle.Metadata, err error,\n) {\n\tvar attemptNum int\n\tvar attemptClockSkew time.Duration\n\tvar attemptResults AttemptResults\n\n\tmaxAttempts := r.retryer.MaxAttempts()\n\treleaseRetryToken := nopRelease\n\n\tretryMetrics, err := newAttemptMetrics(r.OperationMeter)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\tfor {\n\t\tattemptNum++\n\t\tattemptInput := in\n\t\tattemptInput.Request = r.requestCloner(attemptInput.Request)\n\n\t\t// Record the metadata for the for attempt being started.\n\t\tattemptCtx := setRetryMetadata(ctx, retryMetadata{\n\t\t\tAttemptNum:       attemptNum,\n\t\t\tAttemptTime:      sdk.NowTime().UTC(),\n\t\t\tMaxAttempts:      maxAttempts,\n\t\t\tAttemptClockSkew: attemptClockSkew,\n\t\t})\n\n\t\t// Setting clock skew to be used on other context (like signing)\n\t\tctx = internalcontext.SetAttemptSkewContext(ctx, attemptClockSkew)\n\n\t\tvar attemptResult AttemptResult\n\n\t\tattemptCtx, span := tracing.StartSpan(attemptCtx, \"Attempt\", func(o *tracing.SpanOptions) {\n\t\t\to.Properties.Set(\"operation.attempt\", attemptNum)\n\t\t})\n\t\tretryMetrics.Attempts.Add(ctx, 1, withOperationMetadata(ctx))\n\n\t\tstart := sdk.NowTime()\n\t\tout, attemptResult, releaseRetryToken, err = r.handleAttempt(attemptCtx, attemptInput, releaseRetryToken, next)\n\t\telapsed := sdk.NowTime().Sub(start)\n\n\t\tretryMetrics.AttemptDuration.Record(ctx, float64(elapsed)/1e9, withOperationMetadata(ctx))\n\t\tif err != nil {\n\t\t\tretryMetrics.Errors.Add(ctx, 1, withOperationMetadata(ctx), func(o *metrics.RecordMetricOptions) {\n\t\t\t\to.Properties.Set(\"exception.type\", errorType(err))\n\t\t\t})\n\t\t}\n\n\t\tspan.End()\n\n\t\tattemptClockSkew, _ = awsmiddle.GetAttemptSkew(attemptResult.ResponseMetadata)\n\n\t\t// AttemptResult Retried states that the attempt was not successful, and\n\t\t// should be retried.\n\t\tshouldRetry := attemptResult.Retried\n\n\t\t// Add attempt metadata to list of all attempt metadata\n\t\tattemptResults.Results = append(attemptResults.Results, attemptResult)\n\n\t\tif !shouldRetry {\n\t\t\t// Ensure the last response's metadata is used as the bases for result\n\t\t\t// metadata returned by the stack. The Slice of attempt results\n\t\t\t// will be added to this cloned metadata.\n\t\t\tmetadata = attemptResult.ResponseMetadata.Clone()\n\n\t\t\tbreak\n\t\t}\n\t}\n\n\taddAttemptResults(&metadata, attemptResults)\n\treturn out, metadata, err\n}\n\n// handleAttempt handles an individual request attempt.\nfunc (r *Attempt) handleAttempt(\n\tctx context.Context, in smithymiddle.FinalizeInput, releaseRetryToken func(error) error, next smithymiddle.FinalizeHandler,\n) (\n\tout smithymiddle.FinalizeOutput, attemptResult AttemptResult, _ func(error) error, err error,\n) {\n\tdefer func() {\n\t\tattemptResult.Err = err\n\t}()\n\n\t// Short circuit if this attempt never can succeed because the context is\n\t// canceled. This reduces the chance of token pools being modified for\n\t// attempts that will not be made\n\tselect {\n\tcase <-ctx.Done():\n\t\treturn out, attemptResult, nopRelease, ctx.Err()\n\tdefault:\n\t}\n\n\t//------------------------------\n\t// Get Attempt Token\n\t//------------------------------\n\treleaseAttemptToken, err := r.retryer.GetAttemptToken(ctx)\n\tif err != nil {\n\t\treturn out, attemptResult, nopRelease, fmt.Errorf(\n\t\t\t\"failed to get retry Send token, %w\", err)\n\t}\n\n\t//------------------------------\n\t// Send Attempt\n\t//------------------------------\n\tlogger := smithymiddle.GetLogger(ctx)\n\tservice, operation := awsmiddle.GetServiceID(ctx), awsmiddle.GetOperationName(ctx)\n\tretryMetadata, _ := getRetryMetadata(ctx)\n\tattemptNum := retryMetadata.AttemptNum\n\tmaxAttempts := retryMetadata.MaxAttempts\n\n\t// Following attempts must ensure the request payload stream starts in a\n\t// rewound state.\n\tif attemptNum > 1 {\n\t\tif rewindable, ok := in.Request.(interface{ RewindStream() error }); ok {\n\t\t\tif rewindErr := rewindable.RewindStream(); rewindErr != nil {\n\t\t\t\treturn out, attemptResult, nopRelease, fmt.Errorf(\n\t\t\t\t\t\"failed to rewind transport stream for retry, %w\", rewindErr)\n\t\t\t}\n\t\t}\n\n\t\tr.logf(logger, logging.Debug, \"retrying request %s/%s, attempt %d\",\n\t\t\tservice, operation, attemptNum)\n\t}\n\n\tvar metadata smithymiddle.Metadata\n\tout, metadata, err = next.HandleFinalize(ctx, in)\n\tattemptResult.ResponseMetadata = metadata\n\n\t//------------------------------\n\t// Bookkeeping\n\t//------------------------------\n\t// Release the retry token based on the state of the attempt's error (if any).\n\tif releaseError := releaseRetryToken(err); releaseError != nil && err != nil {\n\t\treturn out, attemptResult, nopRelease, fmt.Errorf(\n\t\t\t\"failed to release retry token after request error, %w\", err)\n\t}\n\t// Release the attempt token based on the state of the attempt's error (if any).\n\tif releaseError := releaseAttemptToken(err); releaseError != nil && err != nil {\n\t\treturn out, attemptResult, nopRelease, fmt.Errorf(\n\t\t\t\"failed to release initial token after request error, %w\", err)\n\t}\n\t// If there was no error making the attempt, nothing further to do. There\n\t// will be nothing to retry.\n\tif err == nil {\n\t\treturn out, attemptResult, nopRelease, err\n\t}\n\n\terr = wrapAsClockSkew(ctx, err)\n\n\t//------------------------------\n\t// Is Retryable and Should Retry\n\t//------------------------------\n\t// If the attempt failed with an unretryable error, nothing further to do\n\t// but return, and inform the caller about the terminal failure.\n\tretryable := r.retryer.IsErrorRetryable(err)\n\tif !retryable {\n\t\tr.logf(logger, logging.Debug, \"request failed with unretryable error %v\", err)\n\t\treturn out, attemptResult, nopRelease, err\n\t}\n\n\t// set retryable to true\n\tattemptResult.Retryable = true\n\n\t// Once the maximum number of attempts have been exhausted there is nothing\n\t// further to do other than inform the caller about the terminal failure.\n\tif maxAttempts > 0 && attemptNum >= maxAttempts {\n\t\tr.logf(logger, logging.Debug, \"max retry attempts exhausted, max %d\", maxAttempts)\n\t\terr = &MaxAttemptsError{\n\t\t\tAttempt: attemptNum,\n\t\t\tErr:     err,\n\t\t}\n\t\treturn out, attemptResult, nopRelease, err\n\t}\n\n\t//------------------------------\n\t// Get Retry (aka Retry Quota) Token\n\t//------------------------------\n\t// Get a retry token that will be released after the\n\treleaseRetryToken, retryTokenErr := r.retryer.GetRetryToken(ctx, err)\n\tif retryTokenErr != nil {\n\t\treturn out, attemptResult, nopRelease, retryTokenErr\n\t}\n\n\t//------------------------------\n\t// Retry Delay and Sleep\n\t//------------------------------\n\t// Get the retry delay before another attempt can be made, and sleep for\n\t// that time. Potentially early exist if the sleep is canceled via the\n\t// context.\n\tretryDelay, reqErr := r.retryer.RetryDelay(attemptNum, err)\n\tif reqErr != nil {\n\t\treturn out, attemptResult, releaseRetryToken, reqErr\n\t}\n\tif reqErr = sdk.SleepWithContext(ctx, retryDelay); reqErr != nil {\n\t\terr = &aws.RequestCanceledError{Err: reqErr}\n\t\treturn out, attemptResult, releaseRetryToken, err\n\t}\n\n\t// The request should be re-attempted.\n\tattemptResult.Retried = true\n\n\treturn out, attemptResult, releaseRetryToken, err\n}\n\n// errors that, if detected when we know there's a clock skew,\n// can be retried and have a high chance of success\nvar possibleSkewCodes = map[string]struct{}{\n\t\"InvalidSignatureException\": {},\n\t\"SignatureDoesNotMatch\":     {},\n\t\"AuthFailure\":               {},\n}\n\nvar definiteSkewCodes = map[string]struct{}{\n\t\"RequestExpired\":       {},\n\t\"RequestInTheFuture\":   {},\n\t\"RequestTimeTooSkewed\": {},\n}\n\n// wrapAsClockSkew checks if this error could be related to a clock skew\n// error and if so, wrap the error.\nfunc wrapAsClockSkew(ctx context.Context, err error) error {\n\tvar v interface{ ErrorCode() string }\n\tif !errors.As(err, &v) {\n\t\treturn err\n\t}\n\tif _, ok := definiteSkewCodes[v.ErrorCode()]; ok {\n\t\treturn &retryableClockSkewError{Err: err}\n\t}\n\t_, isPossibleSkewCode := possibleSkewCodes[v.ErrorCode()]\n\tif skew := internalcontext.GetAttemptSkewContext(ctx); skew > skewThreshold && isPossibleSkewCode {\n\t\treturn &retryableClockSkewError{Err: err}\n\t}\n\treturn err\n}\n\n// MetricsHeader attaches SDK request metric header for retries to the transport\ntype MetricsHeader struct{}\n\n// ID returns the middleware identifier\nfunc (r *MetricsHeader) ID() string {\n\treturn \"RetryMetricsHeader\"\n}\n\n// HandleFinalize attaches the SDK request metric header to the transport layer\nfunc (r MetricsHeader) HandleFinalize(ctx context.Context, in smithymiddle.FinalizeInput, next smithymiddle.FinalizeHandler) (\n\tout smithymiddle.FinalizeOutput, metadata smithymiddle.Metadata, err error,\n) {\n\tretryMetadata, _ := getRetryMetadata(ctx)\n\n\tconst retryMetricHeader = \"Amz-Sdk-Request\"\n\tvar parts []string\n\n\tparts = append(parts, \"attempt=\"+strconv.Itoa(retryMetadata.AttemptNum))\n\tif retryMetadata.MaxAttempts != 0 {\n\t\tparts = append(parts, \"max=\"+strconv.Itoa(retryMetadata.MaxAttempts))\n\t}\n\n\tvar ttl time.Time\n\tif deadline, ok := ctx.Deadline(); ok {\n\t\tttl = deadline\n\t}\n\n\t// Only append the TTL if it can be determined.\n\tif !ttl.IsZero() && retryMetadata.AttemptClockSkew > 0 {\n\t\tconst unixTimeFormat = \"20060102T150405Z\"\n\t\tttl = ttl.Add(retryMetadata.AttemptClockSkew)\n\t\tparts = append(parts, \"ttl=\"+ttl.Format(unixTimeFormat))\n\t}\n\n\tswitch req := in.Request.(type) {\n\tcase *http.Request:\n\t\treq.Header[retryMetricHeader] = append(req.Header[retryMetricHeader][:0], strings.Join(parts, \"; \"))\n\tdefault:\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type %T\", req)\n\t}\n\n\treturn next.HandleFinalize(ctx, in)\n}\n\ntype retryMetadataKey struct{}\n\n// getRetryMetadata retrieves retryMetadata from the context and a bool\n// indicating if it was set.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc getRetryMetadata(ctx context.Context) (metadata retryMetadata, ok bool) {\n\tmetadata, ok = smithymiddle.GetStackValue(ctx, retryMetadataKey{}).(retryMetadata)\n\treturn metadata, ok\n}\n\n// setRetryMetadata sets the retryMetadata on the context.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc setRetryMetadata(ctx context.Context, metadata retryMetadata) context.Context {\n\treturn smithymiddle.WithStackValue(ctx, retryMetadataKey{}, metadata)\n}\n\n// AddRetryMiddlewaresOptions is the set of options that can be passed to\n// AddRetryMiddlewares for configuring retry associated middleware.\ntype AddRetryMiddlewaresOptions struct {\n\tRetryer aws.Retryer\n\n\t// Enable the logging of retry attempts performed by the SDK. This will\n\t// include logging retry attempts, unretryable errors, and when max\n\t// attempts are reached.\n\tLogRetryAttempts bool\n}\n\n// AddRetryMiddlewares adds retry middleware to operation middleware stack\nfunc AddRetryMiddlewares(stack *smithymiddle.Stack, options AddRetryMiddlewaresOptions) error {\n\tattempt := NewAttemptMiddleware(options.Retryer, http.RequestCloner, func(middleware *Attempt) {\n\t\tmiddleware.LogAttempts = options.LogRetryAttempts\n\t})\n\n\t// index retry to before signing, if signing exists\n\tif err := stack.Finalize.Insert(attempt, \"Signing\", smithymiddle.Before); err != nil {\n\t\treturn err\n\t}\n\n\tif err := stack.Finalize.Insert(&MetricsHeader{}, attempt.ID(), smithymiddle.After); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Determines the value of exception.type for metrics purposes. We prefer an\n// API-specific error code, otherwise it's just the Go type for the value.\nfunc errorType(err error) string {\n\tvar terr smithy.APIError\n\tif errors.As(err, &terr) {\n\t\treturn terr.ErrorCode()\n\t}\n\treturn fmt.Sprintf(\"%T\", err)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/retry/retry.go",
    "content": "package retry\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n)\n\n// AddWithErrorCodes returns a Retryer with additional error codes considered\n// for determining if the error should be retried.\nfunc AddWithErrorCodes(r aws.Retryer, codes ...string) aws.Retryer {\n\tretryable := &RetryableErrorCode{\n\t\tCodes: map[string]struct{}{},\n\t}\n\tfor _, c := range codes {\n\t\tretryable.Codes[c] = struct{}{}\n\t}\n\n\treturn &withIsErrorRetryable{\n\t\tRetryerV2: wrapAsRetryerV2(r),\n\t\tRetryable: retryable,\n\t}\n}\n\ntype withIsErrorRetryable struct {\n\taws.RetryerV2\n\tRetryable IsErrorRetryable\n}\n\nfunc (r *withIsErrorRetryable) IsErrorRetryable(err error) bool {\n\tif v := r.Retryable.IsErrorRetryable(err); v != aws.UnknownTernary {\n\t\treturn v.Bool()\n\t}\n\treturn r.RetryerV2.IsErrorRetryable(err)\n}\n\n// AddWithMaxAttempts returns a Retryer with MaxAttempts set to the value\n// specified.\nfunc AddWithMaxAttempts(r aws.Retryer, max int) aws.Retryer {\n\treturn &withMaxAttempts{\n\t\tRetryerV2: wrapAsRetryerV2(r),\n\t\tMax:       max,\n\t}\n}\n\ntype withMaxAttempts struct {\n\taws.RetryerV2\n\tMax int\n}\n\nfunc (w *withMaxAttempts) MaxAttempts() int {\n\treturn w.Max\n}\n\n// AddWithMaxBackoffDelay returns a retryer wrapping the passed in retryer\n// overriding the RetryDelay behavior for a alternate minimum initial backoff\n// delay.\nfunc AddWithMaxBackoffDelay(r aws.Retryer, delay time.Duration) aws.Retryer {\n\treturn &withMaxBackoffDelay{\n\t\tRetryerV2: wrapAsRetryerV2(r),\n\t\tbackoff:   NewExponentialJitterBackoff(delay),\n\t}\n}\n\ntype withMaxBackoffDelay struct {\n\taws.RetryerV2\n\tbackoff *ExponentialJitterBackoff\n}\n\nfunc (r *withMaxBackoffDelay) RetryDelay(attempt int, err error) (time.Duration, error) {\n\treturn r.backoff.BackoffDelay(attempt, err)\n}\n\ntype wrappedAsRetryerV2 struct {\n\taws.Retryer\n}\n\nfunc wrapAsRetryerV2(r aws.Retryer) aws.RetryerV2 {\n\tv, ok := r.(aws.RetryerV2)\n\tif !ok {\n\t\tv = wrappedAsRetryerV2{Retryer: r}\n\t}\n\n\treturn v\n}\n\nfunc (w wrappedAsRetryerV2) GetAttemptToken(context.Context) (func(error) error, error) {\n\treturn w.Retryer.GetInitialToken(), nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/retry/retryable_error.go",
    "content": "package retry\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/url\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n)\n\n// IsErrorRetryable provides the interface of an implementation to determine if\n// a error as the result of an operation is retryable.\ntype IsErrorRetryable interface {\n\tIsErrorRetryable(error) aws.Ternary\n}\n\n// IsErrorRetryables is a collection of checks to determine of the error is\n// retryable.  Iterates through the checks and returns the state of retryable\n// if any check returns something other than unknown.\ntype IsErrorRetryables []IsErrorRetryable\n\n// IsErrorRetryable returns if the error is retryable if any of the checks in\n// the list return a value other than unknown.\nfunc (r IsErrorRetryables) IsErrorRetryable(err error) aws.Ternary {\n\tfor _, re := range r {\n\t\tif v := re.IsErrorRetryable(err); v != aws.UnknownTernary {\n\t\t\treturn v\n\t\t}\n\t}\n\treturn aws.UnknownTernary\n}\n\n// IsErrorRetryableFunc wraps a function with the IsErrorRetryable interface.\ntype IsErrorRetryableFunc func(error) aws.Ternary\n\n// IsErrorRetryable returns if the error is retryable.\nfunc (fn IsErrorRetryableFunc) IsErrorRetryable(err error) aws.Ternary {\n\treturn fn(err)\n}\n\n// RetryableError is an IsErrorRetryable implementation which uses the\n// optional interface Retryable on the error value to determine if the error is\n// retryable.\ntype RetryableError struct{}\n\n// IsErrorRetryable returns if the error is retryable if it satisfies the\n// Retryable interface, and returns if the attempt should be retried.\nfunc (RetryableError) IsErrorRetryable(err error) aws.Ternary {\n\tvar v interface{ RetryableError() bool }\n\n\tif !errors.As(err, &v) {\n\t\treturn aws.UnknownTernary\n\t}\n\n\treturn aws.BoolTernary(v.RetryableError())\n}\n\n// NoRetryCanceledError detects if the error was an request canceled error and\n// returns if so.\ntype NoRetryCanceledError struct{}\n\n// IsErrorRetryable returns the error is not retryable if the request was\n// canceled.\nfunc (NoRetryCanceledError) IsErrorRetryable(err error) aws.Ternary {\n\tvar v interface{ CanceledError() bool }\n\n\tif !errors.As(err, &v) {\n\t\treturn aws.UnknownTernary\n\t}\n\n\tif v.CanceledError() {\n\t\treturn aws.FalseTernary\n\t}\n\treturn aws.UnknownTernary\n}\n\n// RetryableConnectionError determines if the underlying error is an HTTP\n// connection and returns if it should be retried.\n//\n// Includes errors such as connection reset, connection refused, net dial,\n// temporary, and timeout errors.\ntype RetryableConnectionError struct{}\n\n// IsErrorRetryable returns if the error is caused by and HTTP connection\n// error, and should be retried.\nfunc (r RetryableConnectionError) IsErrorRetryable(err error) aws.Ternary {\n\tif err == nil {\n\t\treturn aws.UnknownTernary\n\t}\n\tvar retryable bool\n\n\tvar conErr interface{ ConnectionError() bool }\n\tvar tempErr interface{ Temporary() bool }\n\tvar timeoutErr interface{ Timeout() bool }\n\tvar urlErr *url.Error\n\tvar netOpErr *net.OpError\n\tvar dnsError *net.DNSError\n\n\tif errors.As(err, &dnsError) {\n\t\t// NXDOMAIN errors should not be retried\n\t\tif dnsError.IsNotFound {\n\t\t\treturn aws.BoolTernary(false)\n\t\t}\n\n\t\t// if !dnsError.Temporary(), error may or may not be temporary,\n\t\t// (i.e. !Temporary() =/=> !retryable) so we should fall through to\n\t\t// remaining checks\n\t\tif dnsError.Temporary() {\n\t\t\treturn aws.BoolTernary(true)\n\t\t}\n\t}\n\n\tswitch {\n\tcase errors.As(err, &conErr) && conErr.ConnectionError():\n\t\tretryable = true\n\n\tcase strings.Contains(err.Error(), \"use of closed network connection\"):\n\t\tfallthrough\n\tcase strings.Contains(err.Error(), \"connection reset\"):\n\t\t// The errors \"connection reset\" and \"use of closed network connection\"\n\t\t// are effectively the same. It appears to be the difference between\n\t\t// sync and async read of TCP RST in the stdlib's net.Conn read loop.\n\t\t// see #2737\n\t\tretryable = true\n\n\tcase errors.As(err, &urlErr):\n\t\t// Refused connections should be retried as the service may not yet be\n\t\t// running on the port. Go TCP dial considers refused connections as\n\t\t// not temporary.\n\t\tif strings.Contains(urlErr.Error(), \"connection refused\") {\n\t\t\tretryable = true\n\t\t} else {\n\t\t\treturn r.IsErrorRetryable(errors.Unwrap(urlErr))\n\t\t}\n\n\tcase errors.As(err, &netOpErr):\n\t\t// Network dial, or temporary network errors are always retryable.\n\t\tif strings.EqualFold(netOpErr.Op, \"dial\") || netOpErr.Temporary() {\n\t\t\tretryable = true\n\t\t} else {\n\t\t\treturn r.IsErrorRetryable(errors.Unwrap(netOpErr))\n\t\t}\n\n\tcase errors.As(err, &tempErr) && tempErr.Temporary():\n\t\t// Fallback to the generic temporary check, with temporary errors\n\t\t// retryable.\n\t\tretryable = true\n\n\tcase errors.As(err, &timeoutErr) && timeoutErr.Timeout():\n\t\t// Fallback to the generic timeout check, with timeout errors\n\t\t// retryable.\n\t\tretryable = true\n\n\tdefault:\n\t\treturn aws.UnknownTernary\n\t}\n\n\treturn aws.BoolTernary(retryable)\n\n}\n\n// RetryableHTTPStatusCode provides a IsErrorRetryable based on HTTP status\n// codes.\ntype RetryableHTTPStatusCode struct {\n\tCodes map[int]struct{}\n}\n\n// IsErrorRetryable return if the passed in error is retryable based on the\n// HTTP status code.\nfunc (r RetryableHTTPStatusCode) IsErrorRetryable(err error) aws.Ternary {\n\tvar v interface{ HTTPStatusCode() int }\n\n\tif !errors.As(err, &v) {\n\t\treturn aws.UnknownTernary\n\t}\n\n\t_, ok := r.Codes[v.HTTPStatusCode()]\n\tif !ok {\n\t\treturn aws.UnknownTernary\n\t}\n\n\treturn aws.TrueTernary\n}\n\n// RetryableErrorCode determines if an attempt should be retried based on the\n// API error code.\ntype RetryableErrorCode struct {\n\tCodes map[string]struct{}\n}\n\n// IsErrorRetryable return if the error is retryable based on the error codes.\n// Returns unknown if the error doesn't have a code or it is unknown.\nfunc (r RetryableErrorCode) IsErrorRetryable(err error) aws.Ternary {\n\tvar v interface{ ErrorCode() string }\n\n\tif !errors.As(err, &v) {\n\t\treturn aws.UnknownTernary\n\t}\n\n\t_, ok := r.Codes[v.ErrorCode()]\n\tif !ok {\n\t\treturn aws.UnknownTernary\n\t}\n\n\treturn aws.TrueTernary\n}\n\n// retryableClockSkewError marks errors that can be caused by clock skew\n// (difference between server time and client time).\n// This is returned when there's certain confidence that adjusting the client time\n// could allow a retry to succeed\ntype retryableClockSkewError struct{ Err error }\n\nfunc (e *retryableClockSkewError) Error() string {\n\treturn fmt.Sprintf(\"Probable clock skew error: %v\", e.Err)\n}\n\n// Unwrap returns the wrapped error.\nfunc (e *retryableClockSkewError) Unwrap() error {\n\treturn e.Err\n}\n\n// RetryableError allows the retryer to retry this request\nfunc (e *retryableClockSkewError) RetryableError() bool {\n\treturn true\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/retry/standard.go",
    "content": "package retry\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws/ratelimit\"\n)\n\n// BackoffDelayer provides the interface for determining the delay to before\n// another request attempt, that previously failed.\ntype BackoffDelayer interface {\n\tBackoffDelay(attempt int, err error) (time.Duration, error)\n}\n\n// BackoffDelayerFunc provides a wrapper around a function to determine the\n// backoff delay of an attempt retry.\ntype BackoffDelayerFunc func(int, error) (time.Duration, error)\n\n// BackoffDelay returns the delay before attempt to retry a request.\nfunc (fn BackoffDelayerFunc) BackoffDelay(attempt int, err error) (time.Duration, error) {\n\treturn fn(attempt, err)\n}\n\nconst (\n\t// DefaultMaxAttempts is the maximum of attempts for an API request\n\tDefaultMaxAttempts int = 3\n\n\t// DefaultMaxBackoff is the maximum back off delay between attempts\n\tDefaultMaxBackoff time.Duration = 20 * time.Second\n)\n\n// Default retry token quota values.\nconst (\n\tDefaultRetryRateTokens  uint = 500\n\tDefaultRetryCost        uint = 5\n\tDefaultRetryTimeoutCost uint = 10\n\tDefaultNoRetryIncrement uint = 1\n)\n\n// DefaultRetryableHTTPStatusCodes is the default set of HTTP status codes the SDK\n// should consider as retryable errors.\nvar DefaultRetryableHTTPStatusCodes = map[int]struct{}{\n\t500: {},\n\t502: {},\n\t503: {},\n\t504: {},\n}\n\n// DefaultRetryableErrorCodes provides the set of API error codes that should\n// be retried.\nvar DefaultRetryableErrorCodes = map[string]struct{}{\n\t\"RequestTimeout\":          {},\n\t\"RequestTimeoutException\": {},\n}\n\n// DefaultThrottleErrorCodes provides the set of API error codes that are\n// considered throttle errors.\nvar DefaultThrottleErrorCodes = map[string]struct{}{\n\t\"Throttling\":                             {},\n\t\"ThrottlingException\":                    {},\n\t\"ThrottledException\":                     {},\n\t\"RequestThrottledException\":              {},\n\t\"TooManyRequestsException\":               {},\n\t\"ProvisionedThroughputExceededException\": {},\n\t\"TransactionInProgressException\":         {},\n\t\"RequestLimitExceeded\":                   {},\n\t\"BandwidthLimitExceeded\":                 {},\n\t\"LimitExceededException\":                 {},\n\t\"RequestThrottled\":                       {},\n\t\"SlowDown\":                               {},\n\t\"PriorRequestNotComplete\":                {},\n\t\"EC2ThrottledException\":                  {},\n}\n\n// DefaultRetryables provides the set of retryable checks that are used by\n// default.\nvar DefaultRetryables = []IsErrorRetryable{\n\tNoRetryCanceledError{},\n\tRetryableError{},\n\tRetryableConnectionError{},\n\tRetryableHTTPStatusCode{\n\t\tCodes: DefaultRetryableHTTPStatusCodes,\n\t},\n\tRetryableErrorCode{\n\t\tCodes: DefaultRetryableErrorCodes,\n\t},\n\tRetryableErrorCode{\n\t\tCodes: DefaultThrottleErrorCodes,\n\t},\n}\n\n// DefaultTimeouts provides the set of timeout checks that are used by default.\nvar DefaultTimeouts = []IsErrorTimeout{\n\tTimeouterError{},\n}\n\n// StandardOptions provides the functional options for configuring the standard\n// retryable, and delay behavior.\ntype StandardOptions struct {\n\t// Maximum number of attempts that should be made.\n\tMaxAttempts int\n\n\t// MaxBackoff duration between retried attempts.\n\tMaxBackoff time.Duration\n\n\t// Provides the backoff strategy the retryer will use to determine the\n\t// delay between retry attempts.\n\tBackoff BackoffDelayer\n\n\t// Set of strategies to determine if the attempt should be retried based on\n\t// the error response received.\n\t//\n\t// It is safe to append to this list in NewStandard's functional options.\n\tRetryables []IsErrorRetryable\n\n\t// Set of strategies to determine if the attempt failed due to a timeout\n\t// error.\n\t//\n\t// It is safe to append to this list in NewStandard's functional options.\n\tTimeouts []IsErrorTimeout\n\n\t// Provides the rate limiting strategy for rate limiting attempt retries\n\t// across all attempts the retryer is being used with.\n\t//\n\t// A RateLimiter operates as a token bucket with a set capacity, where\n\t// attempt failures events consume tokens. A retry attempt that attempts to\n\t// consume more tokens than what's available results in operation failure.\n\t// The default implementation is parameterized as follows:\n\t//   - a capacity of 500 (DefaultRetryRateTokens)\n\t//   - a retry caused by a timeout costs 10 tokens (DefaultRetryCost)\n\t//   - a retry caused by other errors costs 5 tokens (DefaultRetryTimeoutCost)\n\t//   - an operation that succeeds on the 1st attempt adds 1 token (DefaultNoRetryIncrement)\n\t//\n\t// You can disable rate limiting by setting this field to ratelimit.None.\n\tRateLimiter RateLimiter\n\n\t// The cost to deduct from the RateLimiter's token bucket per retry.\n\tRetryCost uint\n\n\t// The cost to deduct from the RateLimiter's token bucket per retry caused\n\t// by timeout error.\n\tRetryTimeoutCost uint\n\n\t// The cost to payback to the RateLimiter's token bucket for successful\n\t// attempts.\n\tNoRetryIncrement uint\n}\n\n// RateLimiter provides the interface for limiting the rate of attempt retries\n// allowed by the retryer.\ntype RateLimiter interface {\n\tGetToken(ctx context.Context, cost uint) (releaseToken func() error, err error)\n\tAddTokens(uint) error\n}\n\n// Standard is the standard retry pattern for the SDK. It uses a set of\n// retryable checks to determine of the failed attempt should be retried, and\n// what retry delay should be used.\ntype Standard struct {\n\toptions StandardOptions\n\n\ttimeout   IsErrorTimeout\n\tretryable IsErrorRetryable\n\tbackoff   BackoffDelayer\n}\n\n// NewStandard initializes a standard retry behavior with defaults that can be\n// overridden via functional options.\nfunc NewStandard(fnOpts ...func(*StandardOptions)) *Standard {\n\to := StandardOptions{\n\t\tMaxAttempts: DefaultMaxAttempts,\n\t\tMaxBackoff:  DefaultMaxBackoff,\n\t\tRetryables:  append([]IsErrorRetryable{}, DefaultRetryables...),\n\t\tTimeouts:    append([]IsErrorTimeout{}, DefaultTimeouts...),\n\n\t\tRateLimiter:      ratelimit.NewTokenRateLimit(DefaultRetryRateTokens),\n\t\tRetryCost:        DefaultRetryCost,\n\t\tRetryTimeoutCost: DefaultRetryTimeoutCost,\n\t\tNoRetryIncrement: DefaultNoRetryIncrement,\n\t}\n\tfor _, fn := range fnOpts {\n\t\tfn(&o)\n\t}\n\tif o.MaxAttempts <= 0 {\n\t\to.MaxAttempts = DefaultMaxAttempts\n\t}\n\n\tbackoff := o.Backoff\n\tif backoff == nil {\n\t\tbackoff = NewExponentialJitterBackoff(o.MaxBackoff)\n\t}\n\n\treturn &Standard{\n\t\toptions:   o,\n\t\tbackoff:   backoff,\n\t\tretryable: IsErrorRetryables(o.Retryables),\n\t\ttimeout:   IsErrorTimeouts(o.Timeouts),\n\t}\n}\n\n// MaxAttempts returns the maximum number of attempts that can be made for a\n// request before failing.\nfunc (s *Standard) MaxAttempts() int {\n\treturn s.options.MaxAttempts\n}\n\n// IsErrorRetryable returns if the error is can be retried or not. Should not\n// consider the number of attempts made.\nfunc (s *Standard) IsErrorRetryable(err error) bool {\n\treturn s.retryable.IsErrorRetryable(err).Bool()\n}\n\n// RetryDelay returns the delay to use before another request attempt is made.\nfunc (s *Standard) RetryDelay(attempt int, err error) (time.Duration, error) {\n\treturn s.backoff.BackoffDelay(attempt, err)\n}\n\n// GetAttemptToken returns the token to be released after then attempt completes.\n// The release token will add NoRetryIncrement to the RateLimiter token pool if\n// the attempt was successful. If the attempt failed, nothing will be done.\nfunc (s *Standard) GetAttemptToken(context.Context) (func(error) error, error) {\n\treturn s.GetInitialToken(), nil\n}\n\n// GetInitialToken returns a token for adding the NoRetryIncrement to the\n// RateLimiter token if the attempt completed successfully without error.\n//\n// InitialToken applies to result of the each attempt, including the first.\n// Whereas the RetryToken applies to the result of subsequent attempts.\n//\n// Deprecated: use GetAttemptToken instead.\nfunc (s *Standard) GetInitialToken() func(error) error {\n\treturn releaseToken(s.noRetryIncrement).release\n}\n\nfunc (s *Standard) noRetryIncrement() error {\n\treturn s.options.RateLimiter.AddTokens(s.options.NoRetryIncrement)\n}\n\n// GetRetryToken attempts to deduct the retry cost from the retry token pool.\n// Returning the token release function, or error.\nfunc (s *Standard) GetRetryToken(ctx context.Context, opErr error) (func(error) error, error) {\n\tcost := s.options.RetryCost\n\n\tif s.timeout.IsErrorTimeout(opErr).Bool() {\n\t\tcost = s.options.RetryTimeoutCost\n\t}\n\n\tfn, err := s.options.RateLimiter.GetToken(ctx, cost)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get rate limit token, %w\", err)\n\t}\n\n\treturn releaseToken(fn).release, nil\n}\n\nfunc nopRelease(error) error { return nil }\n\ntype releaseToken func() error\n\nfunc (f releaseToken) release(err error) error {\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\treturn f()\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/retry/throttle_error.go",
    "content": "package retry\n\nimport (\n\t\"errors\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n)\n\n// IsErrorThrottle provides the interface of an implementation to determine if\n// a error response from an operation is a throttling error.\ntype IsErrorThrottle interface {\n\tIsErrorThrottle(error) aws.Ternary\n}\n\n// IsErrorThrottles is a collection of checks to determine of the error a\n// throttle error. Iterates through the checks and returns the state of\n// throttle if any check returns something other than unknown.\ntype IsErrorThrottles []IsErrorThrottle\n\n// IsErrorThrottle returns if the error is a throttle error if any of the\n// checks in the list return a value other than unknown.\nfunc (r IsErrorThrottles) IsErrorThrottle(err error) aws.Ternary {\n\tfor _, re := range r {\n\t\tif v := re.IsErrorThrottle(err); v != aws.UnknownTernary {\n\t\t\treturn v\n\t\t}\n\t}\n\treturn aws.UnknownTernary\n}\n\n// IsErrorThrottleFunc wraps a function with the IsErrorThrottle interface.\ntype IsErrorThrottleFunc func(error) aws.Ternary\n\n// IsErrorThrottle returns if the error is a throttle error.\nfunc (fn IsErrorThrottleFunc) IsErrorThrottle(err error) aws.Ternary {\n\treturn fn(err)\n}\n\n// ThrottleErrorCode determines if an attempt should be retried based on the\n// API error code.\ntype ThrottleErrorCode struct {\n\tCodes map[string]struct{}\n}\n\n// IsErrorThrottle return if the error is a throttle error based on the error\n// codes. Returns unknown if the error doesn't have a code or it is unknown.\nfunc (r ThrottleErrorCode) IsErrorThrottle(err error) aws.Ternary {\n\tvar v interface{ ErrorCode() string }\n\n\tif !errors.As(err, &v) {\n\t\treturn aws.UnknownTernary\n\t}\n\n\t_, ok := r.Codes[v.ErrorCode()]\n\tif !ok {\n\t\treturn aws.UnknownTernary\n\t}\n\n\treturn aws.TrueTernary\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/retry/timeout_error.go",
    "content": "package retry\n\nimport (\n\t\"errors\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n)\n\n// IsErrorTimeout provides the interface of an implementation to determine if\n// a error matches.\ntype IsErrorTimeout interface {\n\tIsErrorTimeout(err error) aws.Ternary\n}\n\n// IsErrorTimeouts is a collection of checks to determine of the error is\n// retryable. Iterates through the checks and returns the state of retryable\n// if any check returns something other than unknown.\ntype IsErrorTimeouts []IsErrorTimeout\n\n// IsErrorTimeout returns if the error is retryable if any of the checks in\n// the list return a value other than unknown.\nfunc (ts IsErrorTimeouts) IsErrorTimeout(err error) aws.Ternary {\n\tfor _, t := range ts {\n\t\tif v := t.IsErrorTimeout(err); v != aws.UnknownTernary {\n\t\t\treturn v\n\t\t}\n\t}\n\treturn aws.UnknownTernary\n}\n\n// IsErrorTimeoutFunc wraps a function with the IsErrorTimeout interface.\ntype IsErrorTimeoutFunc func(error) aws.Ternary\n\n// IsErrorTimeout returns if the error is retryable.\nfunc (fn IsErrorTimeoutFunc) IsErrorTimeout(err error) aws.Ternary {\n\treturn fn(err)\n}\n\n// TimeouterError provides the IsErrorTimeout implementation for determining if\n// an error is a timeout based on type with the Timeout method.\ntype TimeouterError struct{}\n\n// IsErrorTimeout returns if the error is a timeout error.\nfunc (t TimeouterError) IsErrorTimeout(err error) aws.Ternary {\n\tvar v interface{ Timeout() bool }\n\n\tif !errors.As(err, &v) {\n\t\treturn aws.UnknownTernary\n\t}\n\n\treturn aws.BoolTernary(v.Timeout())\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/retryer.go",
    "content": "package aws\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n)\n\n// RetryMode provides the mode the API client will use to create a retryer\n// based on.\ntype RetryMode string\n\nconst (\n\t// RetryModeStandard model provides rate limited retry attempts with\n\t// exponential backoff delay.\n\tRetryModeStandard RetryMode = \"standard\"\n\n\t// RetryModeAdaptive model provides attempt send rate limiting on throttle\n\t// responses in addition to standard mode's retry rate limiting.\n\t//\n\t// Adaptive retry mode is experimental and is subject to change in the\n\t// future.\n\tRetryModeAdaptive RetryMode = \"adaptive\"\n)\n\n// ParseRetryMode attempts to parse a RetryMode from the given string.\n// Returning error if the value is not a known RetryMode.\nfunc ParseRetryMode(v string) (mode RetryMode, err error) {\n\tswitch v {\n\tcase \"standard\":\n\t\treturn RetryModeStandard, nil\n\tcase \"adaptive\":\n\t\treturn RetryModeAdaptive, nil\n\tdefault:\n\t\treturn mode, fmt.Errorf(\"unknown RetryMode, %v\", v)\n\t}\n}\n\nfunc (m RetryMode) String() string { return string(m) }\n\n// Retryer is an interface to determine if a given error from a\n// attempt should be retried, and if so what backoff delay to apply. The\n// default implementation used by most services is the retry package's Standard\n// type. Which contains basic retry logic using exponential backoff.\ntype Retryer interface {\n\t// IsErrorRetryable returns if the failed attempt is retryable. This check\n\t// should determine if the error can be retried, or if the error is\n\t// terminal.\n\tIsErrorRetryable(error) bool\n\n\t// MaxAttempts returns the maximum number of attempts that can be made for\n\t// an attempt before failing. A value of 0 implies that the attempt should\n\t// be retried until it succeeds if the errors are retryable.\n\tMaxAttempts() int\n\n\t// RetryDelay returns the delay that should be used before retrying the\n\t// attempt. Will return error if the delay could not be determined.\n\tRetryDelay(attempt int, opErr error) (time.Duration, error)\n\n\t// GetRetryToken attempts to deduct the retry cost from the retry token pool.\n\t// Returning the token release function, or error.\n\tGetRetryToken(ctx context.Context, opErr error) (releaseToken func(error) error, err error)\n\n\t// GetInitialToken returns the initial attempt token that can increment the\n\t// retry token pool if the attempt is successful.\n\tGetInitialToken() (releaseToken func(error) error)\n}\n\n// RetryerV2 is an interface to determine if a given error from an attempt\n// should be retried, and if so what backoff delay to apply. The default\n// implementation used by most services is the retry package's Standard type.\n// Which contains basic retry logic using exponential backoff.\n//\n// RetryerV2 replaces the Retryer interface, deprecating the GetInitialToken\n// method in favor of GetAttemptToken which takes a context, and can return an error.\n//\n// The SDK's retry package's Attempt middleware, and utilities will always\n// wrap a Retryer as a RetryerV2. Delegating to GetInitialToken, only if\n// GetAttemptToken is not implemented.\ntype RetryerV2 interface {\n\tRetryer\n\n\t// GetInitialToken returns the initial attempt token that can increment the\n\t// retry token pool if the attempt is successful.\n\t//\n\t// Deprecated: This method does not provide a way to block using Context,\n\t// nor can it return an error. Use RetryerV2, and GetAttemptToken instead.\n\tGetInitialToken() (releaseToken func(error) error)\n\n\t// GetAttemptToken returns the send token that can be used to rate limit\n\t// attempt calls. Will be used by the SDK's retry package's Attempt\n\t// middleware to get a send token prior to calling the temp and releasing\n\t// the send token after the attempt has been made.\n\tGetAttemptToken(context.Context) (func(error) error, error)\n}\n\n// NopRetryer provides a RequestRetryDecider implementation that will flag\n// all attempt errors as not retryable, with a max attempts of 1.\ntype NopRetryer struct{}\n\n// IsErrorRetryable returns false for all error values.\nfunc (NopRetryer) IsErrorRetryable(error) bool { return false }\n\n// MaxAttempts always returns 1 for the original attempt.\nfunc (NopRetryer) MaxAttempts() int { return 1 }\n\n// RetryDelay is not valid for the NopRetryer. Will always return error.\nfunc (NopRetryer) RetryDelay(int, error) (time.Duration, error) {\n\treturn 0, fmt.Errorf(\"not retrying any attempt errors\")\n}\n\n// GetRetryToken returns a stub function that does nothing.\nfunc (NopRetryer) GetRetryToken(context.Context, error) (func(error) error, error) {\n\treturn nopReleaseToken, nil\n}\n\n// GetInitialToken returns a stub function that does nothing.\nfunc (NopRetryer) GetInitialToken() func(error) error {\n\treturn nopReleaseToken\n}\n\n// GetAttemptToken returns a stub function that does nothing.\nfunc (NopRetryer) GetAttemptToken(context.Context) (func(error) error, error) {\n\treturn nopReleaseToken, nil\n}\n\nfunc nopReleaseToken(error) error { return nil }\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/runtime.go",
    "content": "package aws\n\n// ExecutionEnvironmentID is the AWS execution environment runtime identifier.\ntype ExecutionEnvironmentID string\n\n// RuntimeEnvironment is a collection of values that are determined at runtime\n// based on the environment that the SDK is executing in. Some of these values\n// may or may not be present based on the executing environment and certain SDK\n// configuration properties that drive whether these values are populated..\ntype RuntimeEnvironment struct {\n\tEnvironmentIdentifier     ExecutionEnvironmentID\n\tRegion                    string\n\tEC2InstanceMetadataRegion string\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/cache.go",
    "content": "package v4\n\nimport (\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n)\n\nfunc lookupKey(service, region string) string {\n\tvar s strings.Builder\n\ts.Grow(len(region) + len(service) + 3)\n\ts.WriteString(region)\n\ts.WriteRune('/')\n\ts.WriteString(service)\n\treturn s.String()\n}\n\ntype derivedKey struct {\n\tAccessKey  string\n\tDate       time.Time\n\tCredential []byte\n}\n\ntype derivedKeyCache struct {\n\tvalues map[string]derivedKey\n\tmutex  sync.RWMutex\n}\n\nfunc newDerivedKeyCache() derivedKeyCache {\n\treturn derivedKeyCache{\n\t\tvalues: make(map[string]derivedKey),\n\t}\n}\n\nfunc (s *derivedKeyCache) Get(credentials aws.Credentials, service, region string, signingTime SigningTime) []byte {\n\tkey := lookupKey(service, region)\n\ts.mutex.RLock()\n\tif cred, ok := s.get(key, credentials, signingTime.Time); ok {\n\t\ts.mutex.RUnlock()\n\t\treturn cred\n\t}\n\ts.mutex.RUnlock()\n\n\ts.mutex.Lock()\n\tif cred, ok := s.get(key, credentials, signingTime.Time); ok {\n\t\ts.mutex.Unlock()\n\t\treturn cred\n\t}\n\tcred := deriveKey(credentials.SecretAccessKey, service, region, signingTime)\n\tentry := derivedKey{\n\t\tAccessKey:  credentials.AccessKeyID,\n\t\tDate:       signingTime.Time,\n\t\tCredential: cred,\n\t}\n\ts.values[key] = entry\n\ts.mutex.Unlock()\n\n\treturn cred\n}\n\nfunc (s *derivedKeyCache) get(key string, credentials aws.Credentials, signingTime time.Time) ([]byte, bool) {\n\tcacheEntry, ok := s.retrieveFromCache(key)\n\tif ok && cacheEntry.AccessKey == credentials.AccessKeyID && isSameDay(signingTime, cacheEntry.Date) {\n\t\treturn cacheEntry.Credential, true\n\t}\n\treturn nil, false\n}\n\nfunc (s *derivedKeyCache) retrieveFromCache(key string) (derivedKey, bool) {\n\tif v, ok := s.values[key]; ok {\n\t\treturn v, true\n\t}\n\treturn derivedKey{}, false\n}\n\n// SigningKeyDeriver derives a signing key from a set of credentials\ntype SigningKeyDeriver struct {\n\tcache derivedKeyCache\n}\n\n// NewSigningKeyDeriver returns a new SigningKeyDeriver\nfunc NewSigningKeyDeriver() *SigningKeyDeriver {\n\treturn &SigningKeyDeriver{\n\t\tcache: newDerivedKeyCache(),\n\t}\n}\n\n// DeriveKey returns a derived signing key from the given credentials to be used with SigV4 signing.\nfunc (k *SigningKeyDeriver) DeriveKey(credential aws.Credentials, service, region string, signingTime SigningTime) []byte {\n\treturn k.cache.Get(credential, service, region, signingTime)\n}\n\nfunc deriveKey(secret, service, region string, t SigningTime) []byte {\n\thmacDate := HMACSHA256([]byte(\"AWS4\"+secret), []byte(t.ShortTimeFormat()))\n\thmacRegion := HMACSHA256(hmacDate, []byte(region))\n\thmacService := HMACSHA256(hmacRegion, []byte(service))\n\treturn HMACSHA256(hmacService, []byte(\"aws4_request\"))\n}\n\nfunc isSameDay(x, y time.Time) bool {\n\txYear, xMonth, xDay := x.Date()\n\tyYear, yMonth, yDay := y.Date()\n\n\tif xYear != yYear {\n\t\treturn false\n\t}\n\n\tif xMonth != yMonth {\n\t\treturn false\n\t}\n\n\treturn xDay == yDay\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/const.go",
    "content": "package v4\n\n// Signature Version 4 (SigV4) Constants\nconst (\n\t// EmptyStringSHA256 is the hex encoded sha256 value of an empty string\n\tEmptyStringSHA256 = `e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855`\n\n\t// UnsignedPayload indicates that the request payload body is unsigned\n\tUnsignedPayload = \"UNSIGNED-PAYLOAD\"\n\n\t// AmzAlgorithmKey indicates the signing algorithm\n\tAmzAlgorithmKey = \"X-Amz-Algorithm\"\n\n\t// AmzSecurityTokenKey indicates the security token to be used with temporary credentials\n\tAmzSecurityTokenKey = \"X-Amz-Security-Token\"\n\n\t// AmzDateKey is the UTC timestamp for the request in the format YYYYMMDD'T'HHMMSS'Z'\n\tAmzDateKey = \"X-Amz-Date\"\n\n\t// AmzCredentialKey is the access key ID and credential scope\n\tAmzCredentialKey = \"X-Amz-Credential\"\n\n\t// AmzSignedHeadersKey is the set of headers signed for the request\n\tAmzSignedHeadersKey = \"X-Amz-SignedHeaders\"\n\n\t// AmzSignatureKey is the query parameter to store the SigV4 signature\n\tAmzSignatureKey = \"X-Amz-Signature\"\n\n\t// TimeFormat is the time format to be used in the X-Amz-Date header or query parameter\n\tTimeFormat = \"20060102T150405Z\"\n\n\t// ShortTimeFormat is the shorten time format used in the credential scope\n\tShortTimeFormat = \"20060102\"\n\n\t// ContentSHAKey is the SHA256 of request body\n\tContentSHAKey = \"X-Amz-Content-Sha256\"\n\n\t// StreamingEventsPayload indicates that the request payload body is a signed event stream.\n\tStreamingEventsPayload = \"STREAMING-AWS4-HMAC-SHA256-EVENTS\"\n)\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/header_rules.go",
    "content": "package v4\n\nimport (\n\tsdkstrings \"github.com/aws/aws-sdk-go-v2/internal/strings\"\n)\n\n// Rules houses a set of Rule needed for validation of a\n// string value\ntype Rules []Rule\n\n// Rule interface allows for more flexible rules and just simply\n// checks whether or not a value adheres to that Rule\ntype Rule interface {\n\tIsValid(value string) bool\n}\n\n// IsValid will iterate through all rules and see if any rules\n// apply to the value and supports nested rules\nfunc (r Rules) IsValid(value string) bool {\n\tfor _, rule := range r {\n\t\tif rule.IsValid(value) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// MapRule generic Rule for maps\ntype MapRule map[string]struct{}\n\n// IsValid for the map Rule satisfies whether it exists in the map\nfunc (m MapRule) IsValid(value string) bool {\n\t_, ok := m[value]\n\treturn ok\n}\n\n// AllowList is a generic Rule for include listing\ntype AllowList struct {\n\tRule\n}\n\n// IsValid for AllowList checks if the value is within the AllowList\nfunc (w AllowList) IsValid(value string) bool {\n\treturn w.Rule.IsValid(value)\n}\n\n// ExcludeList is a generic Rule for exclude listing\ntype ExcludeList struct {\n\tRule\n}\n\n// IsValid for AllowList checks if the value is within the AllowList\nfunc (b ExcludeList) IsValid(value string) bool {\n\treturn !b.Rule.IsValid(value)\n}\n\n// Patterns is a list of strings to match against\ntype Patterns []string\n\n// IsValid for Patterns checks each pattern and returns if a match has\n// been found\nfunc (p Patterns) IsValid(value string) bool {\n\tfor _, pattern := range p {\n\t\tif sdkstrings.HasPrefixFold(value, pattern) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// InclusiveRules rules allow for rules to depend on one another\ntype InclusiveRules []Rule\n\n// IsValid will return true if all rules are true\nfunc (r InclusiveRules) IsValid(value string) bool {\n\tfor _, rule := range r {\n\t\tif !rule.IsValid(value) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/headers.go",
    "content": "package v4\n\n// IgnoredHeaders is a list of headers that are ignored during signing\nvar IgnoredHeaders = Rules{\n\tExcludeList{\n\t\tMapRule{\n\t\t\t\"Authorization\":     struct{}{},\n\t\t\t\"User-Agent\":        struct{}{},\n\t\t\t\"X-Amzn-Trace-Id\":   struct{}{},\n\t\t\t\"Expect\":            struct{}{},\n\t\t\t\"Transfer-Encoding\": struct{}{},\n\t\t},\n\t},\n}\n\n// RequiredSignedHeaders is a allow list for Build canonical headers.\nvar RequiredSignedHeaders = Rules{\n\tAllowList{\n\t\tMapRule{\n\t\t\t\"Cache-Control\":                         struct{}{},\n\t\t\t\"Content-Disposition\":                   struct{}{},\n\t\t\t\"Content-Encoding\":                      struct{}{},\n\t\t\t\"Content-Language\":                      struct{}{},\n\t\t\t\"Content-Md5\":                           struct{}{},\n\t\t\t\"Content-Type\":                          struct{}{},\n\t\t\t\"Expires\":                               struct{}{},\n\t\t\t\"If-Match\":                              struct{}{},\n\t\t\t\"If-Modified-Since\":                     struct{}{},\n\t\t\t\"If-None-Match\":                         struct{}{},\n\t\t\t\"If-Unmodified-Since\":                   struct{}{},\n\t\t\t\"Range\":                                 struct{}{},\n\t\t\t\"X-Amz-Acl\":                             struct{}{},\n\t\t\t\"X-Amz-Copy-Source\":                     struct{}{},\n\t\t\t\"X-Amz-Copy-Source-If-Match\":            struct{}{},\n\t\t\t\"X-Amz-Copy-Source-If-Modified-Since\":   struct{}{},\n\t\t\t\"X-Amz-Copy-Source-If-None-Match\":       struct{}{},\n\t\t\t\"X-Amz-Copy-Source-If-Unmodified-Since\": struct{}{},\n\t\t\t\"X-Amz-Copy-Source-Range\":               struct{}{},\n\t\t\t\"X-Amz-Copy-Source-Server-Side-Encryption-Customer-Algorithm\": struct{}{},\n\t\t\t\"X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key\":       struct{}{},\n\t\t\t\"X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key-Md5\":   struct{}{},\n\t\t\t\"X-Amz-Grant-Full-control\":                                    struct{}{},\n\t\t\t\"X-Amz-Grant-Read\":                                            struct{}{},\n\t\t\t\"X-Amz-Grant-Read-Acp\":                                        struct{}{},\n\t\t\t\"X-Amz-Grant-Write\":                                           struct{}{},\n\t\t\t\"X-Amz-Grant-Write-Acp\":                                       struct{}{},\n\t\t\t\"X-Amz-Metadata-Directive\":                                    struct{}{},\n\t\t\t\"X-Amz-Mfa\":                                                   struct{}{},\n\t\t\t\"X-Amz-Server-Side-Encryption\":                                struct{}{},\n\t\t\t\"X-Amz-Server-Side-Encryption-Aws-Kms-Key-Id\":                 struct{}{},\n\t\t\t\"X-Amz-Server-Side-Encryption-Context\":                        struct{}{},\n\t\t\t\"X-Amz-Server-Side-Encryption-Customer-Algorithm\":             struct{}{},\n\t\t\t\"X-Amz-Server-Side-Encryption-Customer-Key\":                   struct{}{},\n\t\t\t\"X-Amz-Server-Side-Encryption-Customer-Key-Md5\":               struct{}{},\n\t\t\t\"X-Amz-Storage-Class\":                                         struct{}{},\n\t\t\t\"X-Amz-Website-Redirect-Location\":                             struct{}{},\n\t\t\t\"X-Amz-Content-Sha256\":                                        struct{}{},\n\t\t\t\"X-Amz-Tagging\":                                               struct{}{},\n\t\t},\n\t},\n\tPatterns{\"X-Amz-Object-Lock-\"},\n\tPatterns{\"X-Amz-Meta-\"},\n}\n\n// AllowedQueryHoisting is a allowed list for Build query headers. The boolean value\n// represents whether or not it is a pattern.\nvar AllowedQueryHoisting = InclusiveRules{\n\tExcludeList{RequiredSignedHeaders},\n\tPatterns{\"X-Amz-\"},\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/hmac.go",
    "content": "package v4\n\nimport (\n\t\"crypto/hmac\"\n\t\"crypto/sha256\"\n)\n\n// HMACSHA256 computes a HMAC-SHA256 of data given the provided key.\nfunc HMACSHA256(key []byte, data []byte) []byte {\n\thash := hmac.New(sha256.New, key)\n\thash.Write(data)\n\treturn hash.Sum(nil)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/host.go",
    "content": "package v4\n\nimport (\n\t\"net/http\"\n\t\"strings\"\n)\n\n// SanitizeHostForHeader removes default port from host and updates request.Host\nfunc SanitizeHostForHeader(r *http.Request) {\n\thost := getHost(r)\n\tport := portOnly(host)\n\tif port != \"\" && isDefaultPort(r.URL.Scheme, port) {\n\t\tr.Host = stripPort(host)\n\t}\n}\n\n// Returns host from request\nfunc getHost(r *http.Request) string {\n\tif r.Host != \"\" {\n\t\treturn r.Host\n\t}\n\n\treturn r.URL.Host\n}\n\n// Hostname returns u.Host, without any port number.\n//\n// If Host is an IPv6 literal with a port number, Hostname returns the\n// IPv6 literal without the square brackets. IPv6 literals may include\n// a zone identifier.\n//\n// Copied from the Go 1.8 standard library (net/url)\nfunc stripPort(hostport string) string {\n\tcolon := strings.IndexByte(hostport, ':')\n\tif colon == -1 {\n\t\treturn hostport\n\t}\n\tif i := strings.IndexByte(hostport, ']'); i != -1 {\n\t\treturn strings.TrimPrefix(hostport[:i], \"[\")\n\t}\n\treturn hostport[:colon]\n}\n\n// Port returns the port part of u.Host, without the leading colon.\n// If u.Host doesn't contain a port, Port returns an empty string.\n//\n// Copied from the Go 1.8 standard library (net/url)\nfunc portOnly(hostport string) string {\n\tcolon := strings.IndexByte(hostport, ':')\n\tif colon == -1 {\n\t\treturn \"\"\n\t}\n\tif i := strings.Index(hostport, \"]:\"); i != -1 {\n\t\treturn hostport[i+len(\"]:\"):]\n\t}\n\tif strings.Contains(hostport, \"]\") {\n\t\treturn \"\"\n\t}\n\treturn hostport[colon+len(\":\"):]\n}\n\n// Returns true if the specified URI is using the standard port\n// (i.e. port 80 for HTTP URIs or 443 for HTTPS URIs)\nfunc isDefaultPort(scheme, port string) bool {\n\tif port == \"\" {\n\t\treturn true\n\t}\n\n\tlowerCaseScheme := strings.ToLower(scheme)\n\tif (lowerCaseScheme == \"http\" && port == \"80\") || (lowerCaseScheme == \"https\" && port == \"443\") {\n\t\treturn true\n\t}\n\n\treturn false\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/scope.go",
    "content": "package v4\n\nimport \"strings\"\n\n// BuildCredentialScope builds the Signature Version 4 (SigV4) signing scope\nfunc BuildCredentialScope(signingTime SigningTime, region, service string) string {\n\treturn strings.Join([]string{\n\t\tsigningTime.ShortTimeFormat(),\n\t\tregion,\n\t\tservice,\n\t\t\"aws4_request\",\n\t}, \"/\")\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/time.go",
    "content": "package v4\n\nimport \"time\"\n\n// SigningTime provides a wrapper around a time.Time which provides cached values for SigV4 signing.\ntype SigningTime struct {\n\ttime.Time\n\ttimeFormat      string\n\tshortTimeFormat string\n}\n\n// NewSigningTime creates a new SigningTime given a time.Time\nfunc NewSigningTime(t time.Time) SigningTime {\n\treturn SigningTime{\n\t\tTime: t,\n\t}\n}\n\n// TimeFormat provides a time formatted in the X-Amz-Date format.\nfunc (m *SigningTime) TimeFormat() string {\n\treturn m.format(&m.timeFormat, TimeFormat)\n}\n\n// ShortTimeFormat provides a time formatted of 20060102.\nfunc (m *SigningTime) ShortTimeFormat() string {\n\treturn m.format(&m.shortTimeFormat, ShortTimeFormat)\n}\n\nfunc (m *SigningTime) format(target *string, format string) string {\n\tif len(*target) > 0 {\n\t\treturn *target\n\t}\n\tv := m.Time.Format(format)\n\t*target = v\n\treturn v\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/util.go",
    "content": "package v4\n\nimport (\n\t\"net/url\"\n\t\"strings\"\n)\n\nconst doubleSpace = \"  \"\n\n// StripExcessSpaces will rewrite the passed in slice's string values to not\n// contain multiple side-by-side spaces.\nfunc StripExcessSpaces(str string) string {\n\tvar j, k, l, m, spaces int\n\t// Trim trailing spaces\n\tfor j = len(str) - 1; j >= 0 && str[j] == ' '; j-- {\n\t}\n\n\t// Trim leading spaces\n\tfor k = 0; k < j && str[k] == ' '; k++ {\n\t}\n\tstr = str[k : j+1]\n\n\t// Strip multiple spaces.\n\tj = strings.Index(str, doubleSpace)\n\tif j < 0 {\n\t\treturn str\n\t}\n\n\tbuf := []byte(str)\n\tfor k, m, l = j, j, len(buf); k < l; k++ {\n\t\tif buf[k] == ' ' {\n\t\t\tif spaces == 0 {\n\t\t\t\t// First space.\n\t\t\t\tbuf[m] = buf[k]\n\t\t\t\tm++\n\t\t\t}\n\t\t\tspaces++\n\t\t} else {\n\t\t\t// End of multiple spaces.\n\t\t\tspaces = 0\n\t\t\tbuf[m] = buf[k]\n\t\t\tm++\n\t\t}\n\t}\n\n\treturn string(buf[:m])\n}\n\n// GetURIPath returns the escaped URI component from the provided URL.\nfunc GetURIPath(u *url.URL) string {\n\tvar uriPath string\n\n\tif len(u.Opaque) > 0 {\n\t\tconst schemeSep, pathSep, queryStart = \"//\", \"/\", \"?\"\n\n\t\topaque := u.Opaque\n\t\t// Cut off the query string if present.\n\t\tif idx := strings.Index(opaque, queryStart); idx >= 0 {\n\t\t\topaque = opaque[:idx]\n\t\t}\n\n\t\t// Cutout the scheme separator if present.\n\t\tif strings.Index(opaque, schemeSep) == 0 {\n\t\t\topaque = opaque[len(schemeSep):]\n\t\t}\n\n\t\t// capture URI path starting with first path separator.\n\t\tif idx := strings.Index(opaque, pathSep); idx >= 0 {\n\t\t\turiPath = opaque[idx:]\n\t\t}\n\t} else {\n\t\turiPath = u.EscapedPath()\n\t}\n\n\tif len(uriPath) == 0 {\n\t\turiPath = \"/\"\n\t}\n\n\treturn uriPath\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/signer/v4/middleware.go",
    "content": "package v4\n\nimport (\n\t\"context\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\tv4Internal \"github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4\"\n\tinternalauth \"github.com/aws/aws-sdk-go-v2/internal/auth\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/sdk\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nconst computePayloadHashMiddlewareID = \"ComputePayloadHash\"\n\n// HashComputationError indicates an error occurred while computing the signing hash\ntype HashComputationError struct {\n\tErr error\n}\n\n// Error is the error message\nfunc (e *HashComputationError) Error() string {\n\treturn fmt.Sprintf(\"failed to compute payload hash: %v\", e.Err)\n}\n\n// Unwrap returns the underlying error if one is set\nfunc (e *HashComputationError) Unwrap() error {\n\treturn e.Err\n}\n\n// SigningError indicates an error condition occurred while performing SigV4 signing\ntype SigningError struct {\n\tErr error\n}\n\nfunc (e *SigningError) Error() string {\n\treturn fmt.Sprintf(\"failed to sign request: %v\", e.Err)\n}\n\n// Unwrap returns the underlying error cause\nfunc (e *SigningError) Unwrap() error {\n\treturn e.Err\n}\n\n// UseDynamicPayloadSigningMiddleware swaps the compute payload sha256 middleware with a resolver middleware that\n// switches between unsigned and signed payload based on TLS state for request.\n// This middleware should not be used for AWS APIs that do not support unsigned payload signing auth.\n// By default, SDK uses this middleware for known AWS APIs that support such TLS based auth selection .\n//\n// Usage example -\n// S3 PutObject API allows unsigned payload signing auth usage when TLS is enabled, and uses this middleware to\n// dynamically switch between unsigned and signed payload based on TLS state for request.\nfunc UseDynamicPayloadSigningMiddleware(stack *middleware.Stack) error {\n\t_, err := stack.Finalize.Swap(computePayloadHashMiddlewareID, &dynamicPayloadSigningMiddleware{})\n\treturn err\n}\n\n// dynamicPayloadSigningMiddleware dynamically resolves the middleware that computes and set payload sha256 middleware.\ntype dynamicPayloadSigningMiddleware struct {\n}\n\n// ID returns the resolver identifier\nfunc (m *dynamicPayloadSigningMiddleware) ID() string {\n\treturn computePayloadHashMiddlewareID\n}\n\n// HandleFinalize delegates SHA256 computation according to whether the request\n// is TLS-enabled.\nfunc (m *dynamicPayloadSigningMiddleware) HandleFinalize(\n\tctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,\n) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type %T\", in.Request)\n\t}\n\n\tif req.IsHTTPS() {\n\t\treturn (&UnsignedPayload{}).HandleFinalize(ctx, in, next)\n\t}\n\treturn (&ComputePayloadSHA256{}).HandleFinalize(ctx, in, next)\n}\n\n// UnsignedPayload sets the SigV4 request payload hash to unsigned.\n//\n// Will not set the Unsigned Payload magic SHA value, if a SHA has already been\n// stored in the context. (e.g. application pre-computed SHA256 before making\n// API call).\n//\n// This middleware does not check the X-Amz-Content-Sha256 header, if that\n// header is serialized a middleware must translate it into the context.\ntype UnsignedPayload struct{}\n\n// AddUnsignedPayloadMiddleware adds unsignedPayload to the operation\n// middleware stack\nfunc AddUnsignedPayloadMiddleware(stack *middleware.Stack) error {\n\treturn stack.Finalize.Insert(&UnsignedPayload{}, \"ResolveEndpointV2\", middleware.After)\n}\n\n// ID returns the unsignedPayload identifier\nfunc (m *UnsignedPayload) ID() string {\n\treturn computePayloadHashMiddlewareID\n}\n\n// HandleFinalize sets the payload hash magic value to the unsigned sentinel.\nfunc (m *UnsignedPayload) HandleFinalize(\n\tctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,\n) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\tif GetPayloadHash(ctx) == \"\" {\n\t\tctx = SetPayloadHash(ctx, v4Internal.UnsignedPayload)\n\t}\n\treturn next.HandleFinalize(ctx, in)\n}\n\n// ComputePayloadSHA256 computes SHA256 payload hash to sign.\n//\n// Will not set the Unsigned Payload magic SHA value, if a SHA has already been\n// stored in the context. (e.g. application pre-computed SHA256 before making\n// API call).\n//\n// This middleware does not check the X-Amz-Content-Sha256 header, if that\n// header is serialized a middleware must translate it into the context.\ntype ComputePayloadSHA256 struct{}\n\n// AddComputePayloadSHA256Middleware adds computePayloadSHA256 to the\n// operation middleware stack\nfunc AddComputePayloadSHA256Middleware(stack *middleware.Stack) error {\n\treturn stack.Finalize.Insert(&ComputePayloadSHA256{}, \"ResolveEndpointV2\", middleware.After)\n}\n\n// RemoveComputePayloadSHA256Middleware removes computePayloadSHA256 from the\n// operation middleware stack\nfunc RemoveComputePayloadSHA256Middleware(stack *middleware.Stack) error {\n\t_, err := stack.Finalize.Remove(computePayloadHashMiddlewareID)\n\treturn err\n}\n\n// ID is the middleware name\nfunc (m *ComputePayloadSHA256) ID() string {\n\treturn computePayloadHashMiddlewareID\n}\n\n// HandleFinalize computes the payload hash for the request, storing it to the\n// context. This is a no-op if a caller has previously set that value.\nfunc (m *ComputePayloadSHA256) HandleFinalize(\n\tctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,\n) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\tif GetPayloadHash(ctx) != \"\" {\n\t\treturn next.HandleFinalize(ctx, in)\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"ComputePayloadSHA256\")\n\tdefer span.End()\n\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &HashComputationError{\n\t\t\tErr: fmt.Errorf(\"unexpected request middleware type %T\", in.Request),\n\t\t}\n\t}\n\n\thash := sha256.New()\n\tif stream := req.GetStream(); stream != nil {\n\t\t_, err = io.Copy(hash, stream)\n\t\tif err != nil {\n\t\t\treturn out, metadata, &HashComputationError{\n\t\t\t\tErr: fmt.Errorf(\"failed to compute payload hash, %w\", err),\n\t\t\t}\n\t\t}\n\n\t\tif err := req.RewindStream(); err != nil {\n\t\t\treturn out, metadata, &HashComputationError{\n\t\t\t\tErr: fmt.Errorf(\"failed to seek body to start, %w\", err),\n\t\t\t}\n\t\t}\n\t}\n\n\tctx = SetPayloadHash(ctx, hex.EncodeToString(hash.Sum(nil)))\n\n\tspan.End()\n\treturn next.HandleFinalize(ctx, in)\n}\n\n// SwapComputePayloadSHA256ForUnsignedPayloadMiddleware replaces the\n// ComputePayloadSHA256 middleware with the UnsignedPayload middleware.\n//\n// Use this to disable computing the Payload SHA256 checksum and instead use\n// UNSIGNED-PAYLOAD for the SHA256 value.\nfunc SwapComputePayloadSHA256ForUnsignedPayloadMiddleware(stack *middleware.Stack) error {\n\t_, err := stack.Finalize.Swap(computePayloadHashMiddlewareID, &UnsignedPayload{})\n\treturn err\n}\n\n// ContentSHA256Header sets the X-Amz-Content-Sha256 header value to\n// the Payload hash stored in the context.\ntype ContentSHA256Header struct{}\n\n// AddContentSHA256HeaderMiddleware adds ContentSHA256Header to the\n// operation middleware stack\nfunc AddContentSHA256HeaderMiddleware(stack *middleware.Stack) error {\n\treturn stack.Finalize.Insert(&ContentSHA256Header{}, computePayloadHashMiddlewareID, middleware.After)\n}\n\n// RemoveContentSHA256HeaderMiddleware removes contentSHA256Header middleware\n// from the operation middleware stack\nfunc RemoveContentSHA256HeaderMiddleware(stack *middleware.Stack) error {\n\t_, err := stack.Finalize.Remove((*ContentSHA256Header)(nil).ID())\n\treturn err\n}\n\n// ID returns the ContentSHA256HeaderMiddleware identifier\nfunc (m *ContentSHA256Header) ID() string {\n\treturn \"SigV4ContentSHA256Header\"\n}\n\n// HandleFinalize sets the X-Amz-Content-Sha256 header value to the Payload hash\n// stored in the context.\nfunc (m *ContentSHA256Header) HandleFinalize(\n\tctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,\n) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &HashComputationError{Err: fmt.Errorf(\"unexpected request middleware type %T\", in.Request)}\n\t}\n\n\treq.Header.Set(v4Internal.ContentSHAKey, GetPayloadHash(ctx))\n\treturn next.HandleFinalize(ctx, in)\n}\n\n// SignHTTPRequestMiddlewareOptions is the configuration options for\n// [SignHTTPRequestMiddleware].\n//\n// Deprecated: [SignHTTPRequestMiddleware] is deprecated.\ntype SignHTTPRequestMiddlewareOptions struct {\n\tCredentialsProvider aws.CredentialsProvider\n\tSigner              HTTPSigner\n\tLogSigning          bool\n}\n\n// SignHTTPRequestMiddleware is a `FinalizeMiddleware` implementation for SigV4\n// HTTP Signing.\n//\n// Deprecated: AWS service clients no longer use this middleware. Signing as an\n// SDK operation is now performed through an internal per-service middleware\n// which opaquely selects and uses the signer from the resolved auth scheme.\ntype SignHTTPRequestMiddleware struct {\n\tcredentialsProvider aws.CredentialsProvider\n\tsigner              HTTPSigner\n\tlogSigning          bool\n}\n\n// NewSignHTTPRequestMiddleware constructs a [SignHTTPRequestMiddleware] using\n// the given [Signer] for signing requests.\n//\n// Deprecated: SignHTTPRequestMiddleware is deprecated.\nfunc NewSignHTTPRequestMiddleware(options SignHTTPRequestMiddlewareOptions) *SignHTTPRequestMiddleware {\n\treturn &SignHTTPRequestMiddleware{\n\t\tcredentialsProvider: options.CredentialsProvider,\n\t\tsigner:              options.Signer,\n\t\tlogSigning:          options.LogSigning,\n\t}\n}\n\n// ID is the SignHTTPRequestMiddleware identifier.\n//\n// Deprecated: SignHTTPRequestMiddleware is deprecated.\nfunc (s *SignHTTPRequestMiddleware) ID() string {\n\treturn \"Signing\"\n}\n\n// HandleFinalize will take the provided input and sign the request using the\n// SigV4 authentication scheme.\n//\n// Deprecated: SignHTTPRequestMiddleware is deprecated.\nfunc (s *SignHTTPRequestMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\tif !haveCredentialProvider(s.credentialsProvider) {\n\t\treturn next.HandleFinalize(ctx, in)\n\t}\n\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &SigningError{Err: fmt.Errorf(\"unexpected request middleware type %T\", in.Request)}\n\t}\n\n\tsigningName, signingRegion := awsmiddleware.GetSigningName(ctx), awsmiddleware.GetSigningRegion(ctx)\n\tpayloadHash := GetPayloadHash(ctx)\n\tif len(payloadHash) == 0 {\n\t\treturn out, metadata, &SigningError{Err: fmt.Errorf(\"computed payload hash missing from context\")}\n\t}\n\n\tcredentials, err := s.credentialsProvider.Retrieve(ctx)\n\tif err != nil {\n\t\treturn out, metadata, &SigningError{Err: fmt.Errorf(\"failed to retrieve credentials: %w\", err)}\n\t}\n\n\tsignerOptions := []func(o *SignerOptions){\n\t\tfunc(o *SignerOptions) {\n\t\t\to.Logger = middleware.GetLogger(ctx)\n\t\t\to.LogSigning = s.logSigning\n\t\t},\n\t}\n\n\t// existing DisableURIPathEscaping is equivalent in purpose\n\t// to authentication scheme property DisableDoubleEncoding\n\tdisableDoubleEncoding, overridden := internalauth.GetDisableDoubleEncoding(ctx)\n\tif overridden {\n\t\tsignerOptions = append(signerOptions, func(o *SignerOptions) {\n\t\t\to.DisableURIPathEscaping = disableDoubleEncoding\n\t\t})\n\t}\n\n\terr = s.signer.SignHTTP(ctx, credentials, req.Request, payloadHash, signingName, signingRegion, sdk.NowTime(), signerOptions...)\n\tif err != nil {\n\t\treturn out, metadata, &SigningError{Err: fmt.Errorf(\"failed to sign http request, %w\", err)}\n\t}\n\n\tctx = awsmiddleware.SetSigningCredentials(ctx, credentials)\n\n\treturn next.HandleFinalize(ctx, in)\n}\n\n// StreamingEventsPayload signs input event stream messages.\ntype StreamingEventsPayload struct{}\n\n// AddStreamingEventsPayload adds the streamingEventsPayload middleware to the stack.\nfunc AddStreamingEventsPayload(stack *middleware.Stack) error {\n\treturn stack.Finalize.Add(&StreamingEventsPayload{}, middleware.Before)\n}\n\n// ID identifies the middleware.\nfunc (s *StreamingEventsPayload) ID() string {\n\treturn computePayloadHashMiddlewareID\n}\n\n// HandleFinalize marks the input stream to be signed with SigV4.\nfunc (s *StreamingEventsPayload) HandleFinalize(\n\tctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,\n) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\tcontentSHA := GetPayloadHash(ctx)\n\tif len(contentSHA) == 0 {\n\t\tcontentSHA = v4Internal.StreamingEventsPayload\n\t}\n\n\tctx = SetPayloadHash(ctx, contentSHA)\n\n\treturn next.HandleFinalize(ctx, in)\n}\n\n// GetSignedRequestSignature attempts to extract the signature of the request.\n// Returning an error if the request is unsigned, or unable to extract the\n// signature.\nfunc GetSignedRequestSignature(r *http.Request) ([]byte, error) {\n\tconst authHeaderSignatureElem = \"Signature=\"\n\n\tif auth := r.Header.Get(authorizationHeader); len(auth) != 0 {\n\t\tps := strings.Split(auth, \",\")\n\t\tfor _, p := range ps {\n\t\t\tp = strings.TrimSpace(p)\n\t\t\tif idx := strings.Index(p, authHeaderSignatureElem); idx >= 0 {\n\t\t\t\tsig := p[len(authHeaderSignatureElem):]\n\t\t\t\tif len(sig) == 0 {\n\t\t\t\t\treturn nil, fmt.Errorf(\"invalid request signature authorization header\")\n\t\t\t\t}\n\t\t\t\treturn hex.DecodeString(sig)\n\t\t\t}\n\t\t}\n\t}\n\n\tif sig := r.URL.Query().Get(\"X-Amz-Signature\"); len(sig) != 0 {\n\t\treturn hex.DecodeString(sig)\n\t}\n\n\treturn nil, fmt.Errorf(\"request not signed\")\n}\n\nfunc haveCredentialProvider(p aws.CredentialsProvider) bool {\n\tif p == nil {\n\t\treturn false\n\t}\n\n\treturn !aws.IsCredentialsProvider(p, (*aws.AnonymousCredentials)(nil))\n}\n\ntype payloadHashKey struct{}\n\n// GetPayloadHash retrieves the payload hash to use for signing\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc GetPayloadHash(ctx context.Context) (v string) {\n\tv, _ = middleware.GetStackValue(ctx, payloadHashKey{}).(string)\n\treturn v\n}\n\n// SetPayloadHash sets the payload hash to be used for signing the request\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc SetPayloadHash(ctx context.Context, hash string) context.Context {\n\treturn middleware.WithStackValue(ctx, payloadHashKey{}, hash)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/signer/v4/presign_middleware.go",
    "content": "package v4\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/sdk\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyHTTP \"github.com/aws/smithy-go/transport/http\"\n)\n\n// HTTPPresigner is an interface to a SigV4 signer that can sign create a\n// presigned URL for a HTTP requests.\ntype HTTPPresigner interface {\n\tPresignHTTP(\n\t\tctx context.Context, credentials aws.Credentials, r *http.Request,\n\t\tpayloadHash string, service string, region string, signingTime time.Time,\n\t\toptFns ...func(*SignerOptions),\n\t) (url string, signedHeader http.Header, err error)\n}\n\n// PresignedHTTPRequest provides the URL and signed headers that are included\n// in the presigned URL.\ntype PresignedHTTPRequest struct {\n\tURL          string\n\tMethod       string\n\tSignedHeader http.Header\n}\n\n// PresignHTTPRequestMiddlewareOptions is the options for the PresignHTTPRequestMiddleware middleware.\ntype PresignHTTPRequestMiddlewareOptions struct {\n\tCredentialsProvider aws.CredentialsProvider\n\tPresigner           HTTPPresigner\n\tLogSigning          bool\n}\n\n// PresignHTTPRequestMiddleware provides the Finalize middleware for creating a\n// presigned URL for an HTTP request.\n//\n// Will short circuit the middleware stack and not forward onto the next\n// Finalize handler.\ntype PresignHTTPRequestMiddleware struct {\n\tcredentialsProvider aws.CredentialsProvider\n\tpresigner           HTTPPresigner\n\tlogSigning          bool\n}\n\n// NewPresignHTTPRequestMiddleware returns a new PresignHTTPRequestMiddleware\n// initialized with the presigner.\nfunc NewPresignHTTPRequestMiddleware(options PresignHTTPRequestMiddlewareOptions) *PresignHTTPRequestMiddleware {\n\treturn &PresignHTTPRequestMiddleware{\n\t\tcredentialsProvider: options.CredentialsProvider,\n\t\tpresigner:           options.Presigner,\n\t\tlogSigning:          options.LogSigning,\n\t}\n}\n\n// ID provides the middleware ID.\nfunc (*PresignHTTPRequestMiddleware) ID() string { return \"PresignHTTPRequest\" }\n\n// HandleFinalize will take the provided input and create a presigned url for\n// the http request using the SigV4 presign authentication scheme.\n//\n// Since the signed request is not a valid HTTP request\nfunc (s *PresignHTTPRequestMiddleware) HandleFinalize(\n\tctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,\n) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\treq, ok := in.Request.(*smithyHTTP.Request)\n\tif !ok {\n\t\treturn out, metadata, &SigningError{\n\t\t\tErr: fmt.Errorf(\"unexpected request middleware type %T\", in.Request),\n\t\t}\n\t}\n\n\thttpReq := req.Build(ctx)\n\tif !haveCredentialProvider(s.credentialsProvider) {\n\t\tout.Result = &PresignedHTTPRequest{\n\t\t\tURL:          httpReq.URL.String(),\n\t\t\tMethod:       httpReq.Method,\n\t\t\tSignedHeader: http.Header{},\n\t\t}\n\n\t\treturn out, metadata, nil\n\t}\n\n\tsigningName := awsmiddleware.GetSigningName(ctx)\n\tsigningRegion := awsmiddleware.GetSigningRegion(ctx)\n\tpayloadHash := GetPayloadHash(ctx)\n\tif len(payloadHash) == 0 {\n\t\treturn out, metadata, &SigningError{\n\t\t\tErr: fmt.Errorf(\"computed payload hash missing from context\"),\n\t\t}\n\t}\n\n\tcredentials, err := s.credentialsProvider.Retrieve(ctx)\n\tif err != nil {\n\t\treturn out, metadata, &SigningError{\n\t\t\tErr: fmt.Errorf(\"failed to retrieve credentials: %w\", err),\n\t\t}\n\t}\n\n\tu, h, err := s.presigner.PresignHTTP(ctx, credentials,\n\t\thttpReq, payloadHash, signingName, signingRegion, sdk.NowTime(),\n\t\tfunc(o *SignerOptions) {\n\t\t\to.Logger = middleware.GetLogger(ctx)\n\t\t\to.LogSigning = s.logSigning\n\t\t})\n\tif err != nil {\n\t\treturn out, metadata, &SigningError{\n\t\t\tErr: fmt.Errorf(\"failed to sign http request, %w\", err),\n\t\t}\n\t}\n\n\tout.Result = &PresignedHTTPRequest{\n\t\tURL:          u,\n\t\tMethod:       httpReq.Method,\n\t\tSignedHeader: h,\n\t}\n\n\treturn out, metadata, nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/signer/v4/stream.go",
    "content": "package v4\n\nimport (\n\t\"context\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\tv4Internal \"github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4\"\n\t\"strings\"\n\t\"time\"\n)\n\n// EventStreamSigner is an AWS EventStream protocol signer.\ntype EventStreamSigner interface {\n\tGetSignature(ctx context.Context, headers, payload []byte, signingTime time.Time, optFns ...func(*StreamSignerOptions)) ([]byte, error)\n}\n\n// StreamSignerOptions is the configuration options for StreamSigner.\ntype StreamSignerOptions struct{}\n\n// StreamSigner implements Signature Version 4 (SigV4) signing of event stream encoded payloads.\ntype StreamSigner struct {\n\toptions StreamSignerOptions\n\n\tcredentials aws.Credentials\n\tservice     string\n\tregion      string\n\n\tprevSignature []byte\n\n\tsigningKeyDeriver *v4Internal.SigningKeyDeriver\n}\n\n// NewStreamSigner returns a new AWS EventStream protocol signer.\nfunc NewStreamSigner(credentials aws.Credentials, service, region string, seedSignature []byte, optFns ...func(*StreamSignerOptions)) *StreamSigner {\n\to := StreamSignerOptions{}\n\n\tfor _, fn := range optFns {\n\t\tfn(&o)\n\t}\n\n\treturn &StreamSigner{\n\t\toptions:           o,\n\t\tcredentials:       credentials,\n\t\tservice:           service,\n\t\tregion:            region,\n\t\tsigningKeyDeriver: v4Internal.NewSigningKeyDeriver(),\n\t\tprevSignature:     seedSignature,\n\t}\n}\n\n// GetSignature signs the provided header and payload bytes.\nfunc (s *StreamSigner) GetSignature(ctx context.Context, headers, payload []byte, signingTime time.Time, optFns ...func(*StreamSignerOptions)) ([]byte, error) {\n\toptions := s.options\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tprevSignature := s.prevSignature\n\n\tst := v4Internal.NewSigningTime(signingTime)\n\n\tsigKey := s.signingKeyDeriver.DeriveKey(s.credentials, s.service, s.region, st)\n\n\tscope := v4Internal.BuildCredentialScope(st, s.region, s.service)\n\n\tstringToSign := s.buildEventStreamStringToSign(headers, payload, prevSignature, scope, &st)\n\n\tsignature := v4Internal.HMACSHA256(sigKey, []byte(stringToSign))\n\ts.prevSignature = signature\n\n\treturn signature, nil\n}\n\nfunc (s *StreamSigner) buildEventStreamStringToSign(headers, payload, previousSignature []byte, credentialScope string, signingTime *v4Internal.SigningTime) string {\n\thash := sha256.New()\n\treturn strings.Join([]string{\n\t\t\"AWS4-HMAC-SHA256-PAYLOAD\",\n\t\tsigningTime.TimeFormat(),\n\t\tcredentialScope,\n\t\thex.EncodeToString(previousSignature),\n\t\thex.EncodeToString(makeHash(hash, headers)),\n\t\thex.EncodeToString(makeHash(hash, payload)),\n\t}, \"\\n\")\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/signer/v4/v4.go",
    "content": "// Package v4 implements the AWS signature version 4 algorithm (commonly known\n// as SigV4).\n//\n// For more information about SigV4, see [Signing AWS API requests] in the IAM\n// user guide.\n//\n// While this implementation CAN work in an external context, it is developed\n// primarily for SDK use and you may encounter fringe behaviors around header\n// canonicalization.\n//\n// # Pre-escaping a request URI\n//\n// AWS v4 signature validation requires that the canonical string's URI path\n// component must be the escaped form of the HTTP request's path.\n//\n// The Go HTTP client will perform escaping automatically on the HTTP request.\n// This may cause signature validation errors because the request differs from\n// the URI path or query from which the signature was generated.\n//\n// Because of this, we recommend that you explicitly escape the request when\n// using this signer outside of the SDK to prevent possible signature mismatch.\n// This can be done by setting URL.Opaque on the request. The signer will\n// prefer that value, falling back to the return of URL.EscapedPath if unset.\n//\n// When setting URL.Opaque you must do so in the form of:\n//\n//\t\"//<hostname>/<path>\"\n//\n//\t// e.g.\n//\t\"//example.com/some/path\"\n//\n// The leading \"//\" and hostname are required or the escaping will not work\n// correctly.\n//\n// The TestStandaloneSign unit test provides a complete example of using the\n// signer outside of the SDK and pre-escaping the URI path.\n//\n// [Signing AWS API requests]: https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-signing.html\npackage v4\n\nimport (\n\t\"context\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"hash\"\n\t\"net/http\"\n\t\"net/textproto\"\n\t\"net/url\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\tv4Internal \"github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4\"\n\t\"github.com/aws/smithy-go/encoding/httpbinding\"\n\t\"github.com/aws/smithy-go/logging\"\n)\n\nconst (\n\tsigningAlgorithm    = \"AWS4-HMAC-SHA256\"\n\tauthorizationHeader = \"Authorization\"\n\n\t// Version of signing v4\n\tVersion = \"SigV4\"\n)\n\n// HTTPSigner is an interface to a SigV4 signer that can sign HTTP requests\ntype HTTPSigner interface {\n\tSignHTTP(ctx context.Context, credentials aws.Credentials, r *http.Request, payloadHash string, service string, region string, signingTime time.Time, optFns ...func(*SignerOptions)) error\n}\n\ntype keyDerivator interface {\n\tDeriveKey(credential aws.Credentials, service, region string, signingTime v4Internal.SigningTime) []byte\n}\n\n// SignerOptions is the SigV4 Signer options.\ntype SignerOptions struct {\n\t// Disables the Signer's moving HTTP header key/value pairs from the HTTP\n\t// request header to the request's query string. This is most commonly used\n\t// with pre-signed requests preventing headers from being added to the\n\t// request's query string.\n\tDisableHeaderHoisting bool\n\n\t// Disables the automatic escaping of the URI path of the request for the\n\t// siganture's canonical string's path. For services that do not need additional\n\t// escaping then use this to disable the signer escaping the path.\n\t//\n\t// S3 is an example of a service that does not need additional escaping.\n\t//\n\t// http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n\tDisableURIPathEscaping bool\n\n\t// The logger to send log messages to.\n\tLogger logging.Logger\n\n\t// Enable logging of signed requests.\n\t// This will enable logging of the canonical request, the string to sign, and for presigning the subsequent\n\t// presigned URL.\n\tLogSigning bool\n\n\t// Disables setting the session token on the request as part of signing\n\t// through X-Amz-Security-Token. This is needed for variations of v4 that\n\t// present the token elsewhere.\n\tDisableSessionToken bool\n}\n\n// Signer applies AWS v4 signing to given request. Use this to sign requests\n// that need to be signed with AWS V4 Signatures.\ntype Signer struct {\n\toptions      SignerOptions\n\tkeyDerivator keyDerivator\n}\n\n// NewSigner returns a new SigV4 Signer\nfunc NewSigner(optFns ...func(signer *SignerOptions)) *Signer {\n\toptions := SignerOptions{}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &Signer{options: options, keyDerivator: v4Internal.NewSigningKeyDeriver()}\n}\n\ntype httpSigner struct {\n\tRequest      *http.Request\n\tServiceName  string\n\tRegion       string\n\tTime         v4Internal.SigningTime\n\tCredentials  aws.Credentials\n\tKeyDerivator keyDerivator\n\tIsPreSign    bool\n\n\tPayloadHash string\n\n\tDisableHeaderHoisting  bool\n\tDisableURIPathEscaping bool\n\tDisableSessionToken    bool\n}\n\nfunc (s *httpSigner) Build() (signedRequest, error) {\n\treq := s.Request\n\n\tquery := req.URL.Query()\n\theaders := req.Header\n\n\ts.setRequiredSigningFields(headers, query)\n\n\t// Sort Each Query Key's Values\n\tfor key := range query {\n\t\tsort.Strings(query[key])\n\t}\n\n\tv4Internal.SanitizeHostForHeader(req)\n\n\tcredentialScope := s.buildCredentialScope()\n\tcredentialStr := s.Credentials.AccessKeyID + \"/\" + credentialScope\n\tif s.IsPreSign {\n\t\tquery.Set(v4Internal.AmzCredentialKey, credentialStr)\n\t}\n\n\tunsignedHeaders := headers\n\tif s.IsPreSign && !s.DisableHeaderHoisting {\n\t\tvar urlValues url.Values\n\t\turlValues, unsignedHeaders = buildQuery(v4Internal.AllowedQueryHoisting, headers)\n\t\tfor k := range urlValues {\n\t\t\tquery[k] = urlValues[k]\n\t\t}\n\t}\n\n\thost := req.URL.Host\n\tif len(req.Host) > 0 {\n\t\thost = req.Host\n\t}\n\n\tsignedHeaders, signedHeadersStr, canonicalHeaderStr := s.buildCanonicalHeaders(host, v4Internal.IgnoredHeaders, unsignedHeaders, s.Request.ContentLength)\n\n\tif s.IsPreSign {\n\t\tquery.Set(v4Internal.AmzSignedHeadersKey, signedHeadersStr)\n\t}\n\n\tvar rawQuery strings.Builder\n\trawQuery.WriteString(strings.Replace(query.Encode(), \"+\", \"%20\", -1))\n\n\tcanonicalURI := v4Internal.GetURIPath(req.URL)\n\tif !s.DisableURIPathEscaping {\n\t\tcanonicalURI = httpbinding.EscapePath(canonicalURI, false)\n\t}\n\n\tcanonicalString := s.buildCanonicalString(\n\t\treq.Method,\n\t\tcanonicalURI,\n\t\trawQuery.String(),\n\t\tsignedHeadersStr,\n\t\tcanonicalHeaderStr,\n\t)\n\n\tstrToSign := s.buildStringToSign(credentialScope, canonicalString)\n\tsigningSignature, err := s.buildSignature(strToSign)\n\tif err != nil {\n\t\treturn signedRequest{}, err\n\t}\n\n\tif s.IsPreSign {\n\t\trawQuery.WriteString(\"&X-Amz-Signature=\")\n\t\trawQuery.WriteString(signingSignature)\n\t} else {\n\t\theaders[authorizationHeader] = append(headers[authorizationHeader][:0], buildAuthorizationHeader(credentialStr, signedHeadersStr, signingSignature))\n\t}\n\n\treq.URL.RawQuery = rawQuery.String()\n\n\treturn signedRequest{\n\t\tRequest:         req,\n\t\tSignedHeaders:   signedHeaders,\n\t\tCanonicalString: canonicalString,\n\t\tStringToSign:    strToSign,\n\t\tPreSigned:       s.IsPreSign,\n\t}, nil\n}\n\nfunc buildAuthorizationHeader(credentialStr, signedHeadersStr, signingSignature string) string {\n\tconst credential = \"Credential=\"\n\tconst signedHeaders = \"SignedHeaders=\"\n\tconst signature = \"Signature=\"\n\tconst commaSpace = \", \"\n\n\tvar parts strings.Builder\n\tparts.Grow(len(signingAlgorithm) + 1 +\n\t\tlen(credential) + len(credentialStr) + 2 +\n\t\tlen(signedHeaders) + len(signedHeadersStr) + 2 +\n\t\tlen(signature) + len(signingSignature),\n\t)\n\tparts.WriteString(signingAlgorithm)\n\tparts.WriteRune(' ')\n\tparts.WriteString(credential)\n\tparts.WriteString(credentialStr)\n\tparts.WriteString(commaSpace)\n\tparts.WriteString(signedHeaders)\n\tparts.WriteString(signedHeadersStr)\n\tparts.WriteString(commaSpace)\n\tparts.WriteString(signature)\n\tparts.WriteString(signingSignature)\n\treturn parts.String()\n}\n\n// SignHTTP signs AWS v4 requests with the provided payload hash, service name, region the\n// request is made to, and time the request is signed at. The signTime allows\n// you to specify that a request is signed for the future, and cannot be\n// used until then.\n//\n// The payloadHash is the hex encoded SHA-256 hash of the request payload, and\n// must be provided. Even if the request has no payload (aka body). If the\n// request has no payload you should use the hex encoded SHA-256 of an empty\n// string as the payloadHash value.\n//\n//\t\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n//\n// Some services such as Amazon S3 accept alternative values for the payload\n// hash, such as \"UNSIGNED-PAYLOAD\" for requests where the body will not be\n// included in the request signature.\n//\n// https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html\n//\n// Sign differs from Presign in that it will sign the request using HTTP\n// header values. This type of signing is intended for http.Request values that\n// will not be shared, or are shared in a way the header values on the request\n// will not be lost.\n//\n// The passed in request will be modified in place.\nfunc (s Signer) SignHTTP(ctx context.Context, credentials aws.Credentials, r *http.Request, payloadHash string, service string, region string, signingTime time.Time, optFns ...func(options *SignerOptions)) error {\n\toptions := s.options\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tsigner := &httpSigner{\n\t\tRequest:                r,\n\t\tPayloadHash:            payloadHash,\n\t\tServiceName:            service,\n\t\tRegion:                 region,\n\t\tCredentials:            credentials,\n\t\tTime:                   v4Internal.NewSigningTime(signingTime.UTC()),\n\t\tDisableHeaderHoisting:  options.DisableHeaderHoisting,\n\t\tDisableURIPathEscaping: options.DisableURIPathEscaping,\n\t\tDisableSessionToken:    options.DisableSessionToken,\n\t\tKeyDerivator:           s.keyDerivator,\n\t}\n\n\tsignedRequest, err := signer.Build()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tlogSigningInfo(ctx, options, &signedRequest, false)\n\n\treturn nil\n}\n\n// PresignHTTP signs AWS v4 requests with the payload hash, service name, region\n// the request is made to, and time the request is signed at. The signTime\n// allows you to specify that a request is signed for the future, and cannot\n// be used until then.\n//\n// Returns the signed URL and the map of HTTP headers that were included in the\n// signature or an error if signing the request failed. For presigned requests\n// these headers and their values must be included on the HTTP request when it\n// is made. This is helpful to know what header values need to be shared with\n// the party the presigned request will be distributed to.\n//\n// The payloadHash is the hex encoded SHA-256 hash of the request payload, and\n// must be provided. Even if the request has no payload (aka body). If the\n// request has no payload you should use the hex encoded SHA-256 of an empty\n// string as the payloadHash value.\n//\n//\t\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n//\n// Some services such as Amazon S3 accept alternative values for the payload\n// hash, such as \"UNSIGNED-PAYLOAD\" for requests where the body will not be\n// included in the request signature.\n//\n// https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html\n//\n// PresignHTTP differs from SignHTTP in that it will sign the request using\n// query string instead of header values. This allows you to share the\n// Presigned Request's URL with third parties, or distribute it throughout your\n// system with minimal dependencies.\n//\n// PresignHTTP will not set the expires time of the presigned request\n// automatically. To specify the expire duration for a request add the\n// \"X-Amz-Expires\" query parameter on the request with the value as the\n// duration in seconds the presigned URL should be considered valid for. This\n// parameter is not used by all AWS services, and is most notable used by\n// Amazon S3 APIs.\n//\n//\texpires := 20 * time.Minute\n//\tquery := req.URL.Query()\n//\tquery.Set(\"X-Amz-Expires\", strconv.FormatInt(int64(expires/time.Second), 10))\n//\treq.URL.RawQuery = query.Encode()\n//\n// This method does not modify the provided request.\nfunc (s *Signer) PresignHTTP(\n\tctx context.Context, credentials aws.Credentials, r *http.Request,\n\tpayloadHash string, service string, region string, signingTime time.Time,\n\toptFns ...func(*SignerOptions),\n) (signedURI string, signedHeaders http.Header, err error) {\n\toptions := s.options\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tsigner := &httpSigner{\n\t\tRequest:                r.Clone(r.Context()),\n\t\tPayloadHash:            payloadHash,\n\t\tServiceName:            service,\n\t\tRegion:                 region,\n\t\tCredentials:            credentials,\n\t\tTime:                   v4Internal.NewSigningTime(signingTime.UTC()),\n\t\tIsPreSign:              true,\n\t\tDisableHeaderHoisting:  options.DisableHeaderHoisting,\n\t\tDisableURIPathEscaping: options.DisableURIPathEscaping,\n\t\tDisableSessionToken:    options.DisableSessionToken,\n\t\tKeyDerivator:           s.keyDerivator,\n\t}\n\n\tsignedRequest, err := signer.Build()\n\tif err != nil {\n\t\treturn \"\", nil, err\n\t}\n\n\tlogSigningInfo(ctx, options, &signedRequest, true)\n\n\tsignedHeaders = make(http.Header)\n\n\t// For the signed headers we canonicalize the header keys in the returned map.\n\t// This avoids situations where can standard library double headers like host header. For example the standard\n\t// library will set the Host header, even if it is present in lower-case form.\n\tfor k, v := range signedRequest.SignedHeaders {\n\t\tkey := textproto.CanonicalMIMEHeaderKey(k)\n\t\tsignedHeaders[key] = append(signedHeaders[key], v...)\n\t}\n\n\treturn signedRequest.Request.URL.String(), signedHeaders, nil\n}\n\nfunc (s *httpSigner) buildCredentialScope() string {\n\treturn v4Internal.BuildCredentialScope(s.Time, s.Region, s.ServiceName)\n}\n\nfunc buildQuery(r v4Internal.Rule, header http.Header) (url.Values, http.Header) {\n\tquery := url.Values{}\n\tunsignedHeaders := http.Header{}\n\n\t// A list of headers to be converted to lower case to mitigate a limitation from S3\n\tlowerCaseHeaders := map[string]string{\n\t\t\"X-Amz-Expected-Bucket-Owner\": \"x-amz-expected-bucket-owner\", // see #2508\n\t\t\"X-Amz-Request-Payer\":         \"x-amz-request-payer\",         // see #2764\n\t}\n\n\tfor k, h := range header {\n\t\tif newKey, ok := lowerCaseHeaders[k]; ok {\n\t\t\tk = newKey\n\t\t}\n\n\t\tif r.IsValid(k) {\n\t\t\tquery[k] = h\n\t\t} else {\n\t\t\tunsignedHeaders[k] = h\n\t\t}\n\t}\n\n\treturn query, unsignedHeaders\n}\n\nfunc (s *httpSigner) buildCanonicalHeaders(host string, rule v4Internal.Rule, header http.Header, length int64) (signed http.Header, signedHeaders, canonicalHeadersStr string) {\n\tsigned = make(http.Header)\n\n\tvar headers []string\n\tconst hostHeader = \"host\"\n\theaders = append(headers, hostHeader)\n\tsigned[hostHeader] = append(signed[hostHeader], host)\n\n\tconst contentLengthHeader = \"content-length\"\n\tif length > 0 {\n\t\theaders = append(headers, contentLengthHeader)\n\t\tsigned[contentLengthHeader] = append(signed[contentLengthHeader], strconv.FormatInt(length, 10))\n\t}\n\n\tfor k, v := range header {\n\t\tif !rule.IsValid(k) {\n\t\t\tcontinue // ignored header\n\t\t}\n\t\tif strings.EqualFold(k, contentLengthHeader) {\n\t\t\t// prevent signing already handled content-length header.\n\t\t\tcontinue\n\t\t}\n\n\t\tlowerCaseKey := strings.ToLower(k)\n\t\tif _, ok := signed[lowerCaseKey]; ok {\n\t\t\t// include additional values\n\t\t\tsigned[lowerCaseKey] = append(signed[lowerCaseKey], v...)\n\t\t\tcontinue\n\t\t}\n\n\t\theaders = append(headers, lowerCaseKey)\n\t\tsigned[lowerCaseKey] = v\n\t}\n\tsort.Strings(headers)\n\n\tsignedHeaders = strings.Join(headers, \";\")\n\n\tvar canonicalHeaders strings.Builder\n\tn := len(headers)\n\tconst colon = ':'\n\tfor i := 0; i < n; i++ {\n\t\tif headers[i] == hostHeader {\n\t\t\tcanonicalHeaders.WriteString(hostHeader)\n\t\t\tcanonicalHeaders.WriteRune(colon)\n\t\t\tcanonicalHeaders.WriteString(v4Internal.StripExcessSpaces(host))\n\t\t} else {\n\t\t\tcanonicalHeaders.WriteString(headers[i])\n\t\t\tcanonicalHeaders.WriteRune(colon)\n\t\t\t// Trim out leading, trailing, and dedup inner spaces from signed header values.\n\t\t\tvalues := signed[headers[i]]\n\t\t\tfor j, v := range values {\n\t\t\t\tcleanedValue := strings.TrimSpace(v4Internal.StripExcessSpaces(v))\n\t\t\t\tcanonicalHeaders.WriteString(cleanedValue)\n\t\t\t\tif j < len(values)-1 {\n\t\t\t\t\tcanonicalHeaders.WriteRune(',')\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcanonicalHeaders.WriteRune('\\n')\n\t}\n\tcanonicalHeadersStr = canonicalHeaders.String()\n\n\treturn signed, signedHeaders, canonicalHeadersStr\n}\n\nfunc (s *httpSigner) buildCanonicalString(method, uri, query, signedHeaders, canonicalHeaders string) string {\n\treturn strings.Join([]string{\n\t\tmethod,\n\t\turi,\n\t\tquery,\n\t\tcanonicalHeaders,\n\t\tsignedHeaders,\n\t\ts.PayloadHash,\n\t}, \"\\n\")\n}\n\nfunc (s *httpSigner) buildStringToSign(credentialScope, canonicalRequestString string) string {\n\treturn strings.Join([]string{\n\t\tsigningAlgorithm,\n\t\ts.Time.TimeFormat(),\n\t\tcredentialScope,\n\t\thex.EncodeToString(makeHash(sha256.New(), []byte(canonicalRequestString))),\n\t}, \"\\n\")\n}\n\nfunc makeHash(hash hash.Hash, b []byte) []byte {\n\thash.Reset()\n\thash.Write(b)\n\treturn hash.Sum(nil)\n}\n\nfunc (s *httpSigner) buildSignature(strToSign string) (string, error) {\n\tkey := s.KeyDerivator.DeriveKey(s.Credentials, s.ServiceName, s.Region, s.Time)\n\treturn hex.EncodeToString(v4Internal.HMACSHA256(key, []byte(strToSign))), nil\n}\n\nfunc (s *httpSigner) setRequiredSigningFields(headers http.Header, query url.Values) {\n\tamzDate := s.Time.TimeFormat()\n\n\tif s.IsPreSign {\n\t\tquery.Set(v4Internal.AmzAlgorithmKey, signingAlgorithm)\n\t\tsessionToken := s.Credentials.SessionToken\n\t\tif !s.DisableSessionToken && len(sessionToken) > 0 {\n\t\t\tquery.Set(\"X-Amz-Security-Token\", sessionToken)\n\t\t}\n\n\t\tquery.Set(v4Internal.AmzDateKey, amzDate)\n\t\treturn\n\t}\n\n\theaders[v4Internal.AmzDateKey] = append(headers[v4Internal.AmzDateKey][:0], amzDate)\n\n\tif !s.DisableSessionToken && len(s.Credentials.SessionToken) > 0 {\n\t\theaders[v4Internal.AmzSecurityTokenKey] = append(headers[v4Internal.AmzSecurityTokenKey][:0], s.Credentials.SessionToken)\n\t}\n}\n\nfunc logSigningInfo(ctx context.Context, options SignerOptions, request *signedRequest, isPresign bool) {\n\tif !options.LogSigning {\n\t\treturn\n\t}\n\tsignedURLMsg := \"\"\n\tif isPresign {\n\t\tsignedURLMsg = fmt.Sprintf(logSignedURLMsg, request.Request.URL.String())\n\t}\n\tlogger := logging.WithContext(ctx, options.Logger)\n\tlogger.Logf(logging.Debug, logSignInfoMsg, request.CanonicalString, request.StringToSign, signedURLMsg)\n}\n\ntype signedRequest struct {\n\tRequest         *http.Request\n\tSignedHeaders   http.Header\n\tCanonicalString string\n\tStringToSign    string\n\tPreSigned       bool\n}\n\nconst logSignInfoMsg = `Request Signature:\n---[ CANONICAL STRING  ]-----------------------------\n%s\n---[ STRING TO SIGN ]--------------------------------\n%s%s\n-----------------------------------------------------`\nconst logSignedURLMsg = `\n---[ SIGNED URL ]------------------------------------\n%s`\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/to_ptr.go",
    "content": "// Code generated by aws/generate.go DO NOT EDIT.\n\npackage aws\n\nimport (\n\t\"github.com/aws/smithy-go/ptr\"\n\t\"time\"\n)\n\n// Bool returns a pointer value for the bool value passed in.\nfunc Bool(v bool) *bool {\n\treturn ptr.Bool(v)\n}\n\n// BoolSlice returns a slice of bool pointers from the values\n// passed in.\nfunc BoolSlice(vs []bool) []*bool {\n\treturn ptr.BoolSlice(vs)\n}\n\n// BoolMap returns a map of bool pointers from the values\n// passed in.\nfunc BoolMap(vs map[string]bool) map[string]*bool {\n\treturn ptr.BoolMap(vs)\n}\n\n// Byte returns a pointer value for the byte value passed in.\nfunc Byte(v byte) *byte {\n\treturn ptr.Byte(v)\n}\n\n// ByteSlice returns a slice of byte pointers from the values\n// passed in.\nfunc ByteSlice(vs []byte) []*byte {\n\treturn ptr.ByteSlice(vs)\n}\n\n// ByteMap returns a map of byte pointers from the values\n// passed in.\nfunc ByteMap(vs map[string]byte) map[string]*byte {\n\treturn ptr.ByteMap(vs)\n}\n\n// String returns a pointer value for the string value passed in.\nfunc String(v string) *string {\n\treturn ptr.String(v)\n}\n\n// StringSlice returns a slice of string pointers from the values\n// passed in.\nfunc StringSlice(vs []string) []*string {\n\treturn ptr.StringSlice(vs)\n}\n\n// StringMap returns a map of string pointers from the values\n// passed in.\nfunc StringMap(vs map[string]string) map[string]*string {\n\treturn ptr.StringMap(vs)\n}\n\n// Int returns a pointer value for the int value passed in.\nfunc Int(v int) *int {\n\treturn ptr.Int(v)\n}\n\n// IntSlice returns a slice of int pointers from the values\n// passed in.\nfunc IntSlice(vs []int) []*int {\n\treturn ptr.IntSlice(vs)\n}\n\n// IntMap returns a map of int pointers from the values\n// passed in.\nfunc IntMap(vs map[string]int) map[string]*int {\n\treturn ptr.IntMap(vs)\n}\n\n// Int8 returns a pointer value for the int8 value passed in.\nfunc Int8(v int8) *int8 {\n\treturn ptr.Int8(v)\n}\n\n// Int8Slice returns a slice of int8 pointers from the values\n// passed in.\nfunc Int8Slice(vs []int8) []*int8 {\n\treturn ptr.Int8Slice(vs)\n}\n\n// Int8Map returns a map of int8 pointers from the values\n// passed in.\nfunc Int8Map(vs map[string]int8) map[string]*int8 {\n\treturn ptr.Int8Map(vs)\n}\n\n// Int16 returns a pointer value for the int16 value passed in.\nfunc Int16(v int16) *int16 {\n\treturn ptr.Int16(v)\n}\n\n// Int16Slice returns a slice of int16 pointers from the values\n// passed in.\nfunc Int16Slice(vs []int16) []*int16 {\n\treturn ptr.Int16Slice(vs)\n}\n\n// Int16Map returns a map of int16 pointers from the values\n// passed in.\nfunc Int16Map(vs map[string]int16) map[string]*int16 {\n\treturn ptr.Int16Map(vs)\n}\n\n// Int32 returns a pointer value for the int32 value passed in.\nfunc Int32(v int32) *int32 {\n\treturn ptr.Int32(v)\n}\n\n// Int32Slice returns a slice of int32 pointers from the values\n// passed in.\nfunc Int32Slice(vs []int32) []*int32 {\n\treturn ptr.Int32Slice(vs)\n}\n\n// Int32Map returns a map of int32 pointers from the values\n// passed in.\nfunc Int32Map(vs map[string]int32) map[string]*int32 {\n\treturn ptr.Int32Map(vs)\n}\n\n// Int64 returns a pointer value for the int64 value passed in.\nfunc Int64(v int64) *int64 {\n\treturn ptr.Int64(v)\n}\n\n// Int64Slice returns a slice of int64 pointers from the values\n// passed in.\nfunc Int64Slice(vs []int64) []*int64 {\n\treturn ptr.Int64Slice(vs)\n}\n\n// Int64Map returns a map of int64 pointers from the values\n// passed in.\nfunc Int64Map(vs map[string]int64) map[string]*int64 {\n\treturn ptr.Int64Map(vs)\n}\n\n// Uint returns a pointer value for the uint value passed in.\nfunc Uint(v uint) *uint {\n\treturn ptr.Uint(v)\n}\n\n// UintSlice returns a slice of uint pointers from the values\n// passed in.\nfunc UintSlice(vs []uint) []*uint {\n\treturn ptr.UintSlice(vs)\n}\n\n// UintMap returns a map of uint pointers from the values\n// passed in.\nfunc UintMap(vs map[string]uint) map[string]*uint {\n\treturn ptr.UintMap(vs)\n}\n\n// Uint8 returns a pointer value for the uint8 value passed in.\nfunc Uint8(v uint8) *uint8 {\n\treturn ptr.Uint8(v)\n}\n\n// Uint8Slice returns a slice of uint8 pointers from the values\n// passed in.\nfunc Uint8Slice(vs []uint8) []*uint8 {\n\treturn ptr.Uint8Slice(vs)\n}\n\n// Uint8Map returns a map of uint8 pointers from the values\n// passed in.\nfunc Uint8Map(vs map[string]uint8) map[string]*uint8 {\n\treturn ptr.Uint8Map(vs)\n}\n\n// Uint16 returns a pointer value for the uint16 value passed in.\nfunc Uint16(v uint16) *uint16 {\n\treturn ptr.Uint16(v)\n}\n\n// Uint16Slice returns a slice of uint16 pointers from the values\n// passed in.\nfunc Uint16Slice(vs []uint16) []*uint16 {\n\treturn ptr.Uint16Slice(vs)\n}\n\n// Uint16Map returns a map of uint16 pointers from the values\n// passed in.\nfunc Uint16Map(vs map[string]uint16) map[string]*uint16 {\n\treturn ptr.Uint16Map(vs)\n}\n\n// Uint32 returns a pointer value for the uint32 value passed in.\nfunc Uint32(v uint32) *uint32 {\n\treturn ptr.Uint32(v)\n}\n\n// Uint32Slice returns a slice of uint32 pointers from the values\n// passed in.\nfunc Uint32Slice(vs []uint32) []*uint32 {\n\treturn ptr.Uint32Slice(vs)\n}\n\n// Uint32Map returns a map of uint32 pointers from the values\n// passed in.\nfunc Uint32Map(vs map[string]uint32) map[string]*uint32 {\n\treturn ptr.Uint32Map(vs)\n}\n\n// Uint64 returns a pointer value for the uint64 value passed in.\nfunc Uint64(v uint64) *uint64 {\n\treturn ptr.Uint64(v)\n}\n\n// Uint64Slice returns a slice of uint64 pointers from the values\n// passed in.\nfunc Uint64Slice(vs []uint64) []*uint64 {\n\treturn ptr.Uint64Slice(vs)\n}\n\n// Uint64Map returns a map of uint64 pointers from the values\n// passed in.\nfunc Uint64Map(vs map[string]uint64) map[string]*uint64 {\n\treturn ptr.Uint64Map(vs)\n}\n\n// Float32 returns a pointer value for the float32 value passed in.\nfunc Float32(v float32) *float32 {\n\treturn ptr.Float32(v)\n}\n\n// Float32Slice returns a slice of float32 pointers from the values\n// passed in.\nfunc Float32Slice(vs []float32) []*float32 {\n\treturn ptr.Float32Slice(vs)\n}\n\n// Float32Map returns a map of float32 pointers from the values\n// passed in.\nfunc Float32Map(vs map[string]float32) map[string]*float32 {\n\treturn ptr.Float32Map(vs)\n}\n\n// Float64 returns a pointer value for the float64 value passed in.\nfunc Float64(v float64) *float64 {\n\treturn ptr.Float64(v)\n}\n\n// Float64Slice returns a slice of float64 pointers from the values\n// passed in.\nfunc Float64Slice(vs []float64) []*float64 {\n\treturn ptr.Float64Slice(vs)\n}\n\n// Float64Map returns a map of float64 pointers from the values\n// passed in.\nfunc Float64Map(vs map[string]float64) map[string]*float64 {\n\treturn ptr.Float64Map(vs)\n}\n\n// Time returns a pointer value for the time.Time value passed in.\nfunc Time(v time.Time) *time.Time {\n\treturn ptr.Time(v)\n}\n\n// TimeSlice returns a slice of time.Time pointers from the values\n// passed in.\nfunc TimeSlice(vs []time.Time) []*time.Time {\n\treturn ptr.TimeSlice(vs)\n}\n\n// TimeMap returns a map of time.Time pointers from the values\n// passed in.\nfunc TimeMap(vs map[string]time.Time) map[string]*time.Time {\n\treturn ptr.TimeMap(vs)\n}\n\n// Duration returns a pointer value for the time.Duration value passed in.\nfunc Duration(v time.Duration) *time.Duration {\n\treturn ptr.Duration(v)\n}\n\n// DurationSlice returns a slice of time.Duration pointers from the values\n// passed in.\nfunc DurationSlice(vs []time.Duration) []*time.Duration {\n\treturn ptr.DurationSlice(vs)\n}\n\n// DurationMap returns a map of time.Duration pointers from the values\n// passed in.\nfunc DurationMap(vs map[string]time.Duration) map[string]*time.Duration {\n\treturn ptr.DurationMap(vs)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/client.go",
    "content": "package http\n\nimport (\n\t\"context\"\n\t\"crypto/tls\"\n\t\"net\"\n\t\"net/http\"\n\t\"reflect\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/smithy-go/tracing\"\n)\n\n// Defaults for the HTTPTransportBuilder.\nvar (\n\t// Default connection pool options\n\tDefaultHTTPTransportMaxIdleConns        = 100\n\tDefaultHTTPTransportMaxIdleConnsPerHost = 10\n\n\t// Default connection timeouts\n\tDefaultHTTPTransportIdleConnTimeout       = 90 * time.Second\n\tDefaultHTTPTransportTLSHandleshakeTimeout = 10 * time.Second\n\tDefaultHTTPTransportExpectContinueTimeout = 1 * time.Second\n\n\t// Default to TLS 1.2 for all HTTPS requests.\n\tDefaultHTTPTransportTLSMinVersion uint16 = tls.VersionTLS12\n)\n\n// Timeouts for net.Dialer's network connection.\nvar (\n\tDefaultDialConnectTimeout   = 30 * time.Second\n\tDefaultDialKeepAliveTimeout = 30 * time.Second\n)\n\n// BuildableClient provides a HTTPClient implementation with options to\n// create copies of the HTTPClient when additional configuration is provided.\n//\n// The client's methods will not share the http.Transport value between copies\n// of the BuildableClient. Only exported member values of the Transport and\n// optional Dialer will be copied between copies of BuildableClient.\ntype BuildableClient struct {\n\ttransport *http.Transport\n\tdialer    *net.Dialer\n\n\tinitOnce sync.Once\n\n\tclientTimeout time.Duration\n\tclient        *http.Client\n}\n\n// NewBuildableClient returns an initialized client for invoking HTTP\n// requests.\nfunc NewBuildableClient() *BuildableClient {\n\treturn &BuildableClient{}\n}\n\n// Do implements the HTTPClient interface's Do method to invoke a HTTP request,\n// and receive the response. Uses the BuildableClient's current\n// configuration to invoke the http.Request.\n//\n// If connection pooling is enabled (aka HTTP KeepAlive) the client will only\n// share pooled connections with its own instance. Copies of the\n// BuildableClient will have their own connection pools.\n//\n// Redirect (3xx) responses will not be followed, the HTTP response received\n// will returned instead.\nfunc (b *BuildableClient) Do(req *http.Request) (*http.Response, error) {\n\tb.initOnce.Do(b.build)\n\n\treturn b.client.Do(req)\n}\n\n// Freeze returns a frozen aws.HTTPClient implementation that is no longer a BuildableClient.\n// Use this to prevent the SDK from applying DefaultMode configuration values to a buildable client.\nfunc (b *BuildableClient) Freeze() aws.HTTPClient {\n\tcpy := b.clone()\n\tcpy.build()\n\treturn cpy.client\n}\n\nfunc (b *BuildableClient) build() {\n\tb.client = wrapWithLimitedRedirect(&http.Client{\n\t\tTimeout:   b.clientTimeout,\n\t\tTransport: b.GetTransport(),\n\t})\n}\n\nfunc (b *BuildableClient) clone() *BuildableClient {\n\tcpy := NewBuildableClient()\n\tcpy.transport = b.GetTransport()\n\tcpy.dialer = b.GetDialer()\n\tcpy.clientTimeout = b.clientTimeout\n\n\treturn cpy\n}\n\n// WithTransportOptions copies the BuildableClient and returns it with the\n// http.Transport options applied.\n//\n// If a non (*http.Transport) was set as the round tripper, the round tripper\n// will be replaced with a default Transport value before invoking the option\n// functions.\nfunc (b *BuildableClient) WithTransportOptions(opts ...func(*http.Transport)) *BuildableClient {\n\tcpy := b.clone()\n\n\ttr := cpy.GetTransport()\n\tfor _, opt := range opts {\n\t\topt(tr)\n\t}\n\tcpy.transport = tr\n\n\treturn cpy\n}\n\n// WithDialerOptions copies the BuildableClient and returns it with the\n// net.Dialer options applied. Will set the client's http.Transport DialContext\n// member.\nfunc (b *BuildableClient) WithDialerOptions(opts ...func(*net.Dialer)) *BuildableClient {\n\tcpy := b.clone()\n\n\tdialer := cpy.GetDialer()\n\tfor _, opt := range opts {\n\t\topt(dialer)\n\t}\n\tcpy.dialer = dialer\n\n\ttr := cpy.GetTransport()\n\ttr.DialContext = cpy.dialer.DialContext\n\tcpy.transport = tr\n\n\treturn cpy\n}\n\n// WithTimeout Sets the timeout used by the client for all requests.\nfunc (b *BuildableClient) WithTimeout(timeout time.Duration) *BuildableClient {\n\tcpy := b.clone()\n\tcpy.clientTimeout = timeout\n\treturn cpy\n}\n\n// GetTransport returns a copy of the client's HTTP Transport.\nfunc (b *BuildableClient) GetTransport() *http.Transport {\n\tvar tr *http.Transport\n\tif b.transport != nil {\n\t\ttr = b.transport.Clone()\n\t} else {\n\t\ttr = defaultHTTPTransport()\n\t}\n\n\treturn tr\n}\n\n// GetDialer returns a copy of the client's network dialer.\nfunc (b *BuildableClient) GetDialer() *net.Dialer {\n\tvar dialer *net.Dialer\n\tif b.dialer != nil {\n\t\tdialer = shallowCopyStruct(b.dialer).(*net.Dialer)\n\t} else {\n\t\tdialer = defaultDialer()\n\t}\n\n\treturn dialer\n}\n\n// GetTimeout returns a copy of the client's timeout to cancel requests with.\nfunc (b *BuildableClient) GetTimeout() time.Duration {\n\treturn b.clientTimeout\n}\n\nfunc defaultDialer() *net.Dialer {\n\treturn &net.Dialer{\n\t\tTimeout:   DefaultDialConnectTimeout,\n\t\tKeepAlive: DefaultDialKeepAliveTimeout,\n\t\tDualStack: true,\n\t}\n}\n\nfunc defaultHTTPTransport() *http.Transport {\n\tdialer := defaultDialer()\n\n\ttr := &http.Transport{\n\t\tProxy:                 http.ProxyFromEnvironment,\n\t\tDialContext:           traceDialContext(dialer.DialContext),\n\t\tTLSHandshakeTimeout:   DefaultHTTPTransportTLSHandleshakeTimeout,\n\t\tMaxIdleConns:          DefaultHTTPTransportMaxIdleConns,\n\t\tMaxIdleConnsPerHost:   DefaultHTTPTransportMaxIdleConnsPerHost,\n\t\tIdleConnTimeout:       DefaultHTTPTransportIdleConnTimeout,\n\t\tExpectContinueTimeout: DefaultHTTPTransportExpectContinueTimeout,\n\t\tForceAttemptHTTP2:     true,\n\t\tTLSClientConfig: &tls.Config{\n\t\t\tMinVersion: DefaultHTTPTransportTLSMinVersion,\n\t\t},\n\t}\n\n\treturn tr\n}\n\ntype dialContext func(ctx context.Context, network, addr string) (net.Conn, error)\n\nfunc traceDialContext(dc dialContext) dialContext {\n\treturn func(ctx context.Context, network, addr string) (net.Conn, error) {\n\t\tspan, _ := tracing.GetSpan(ctx)\n\t\tspan.SetProperty(\"net.peer.name\", addr)\n\n\t\tconn, err := dc(ctx, network, addr)\n\t\tif err != nil {\n\t\t\treturn conn, err\n\t\t}\n\n\t\traddr := conn.RemoteAddr()\n\t\tif raddr == nil {\n\t\t\treturn conn, err\n\t\t}\n\n\t\thost, port, err := net.SplitHostPort(raddr.String())\n\t\tif err != nil { // don't blow up just because we couldn't parse\n\t\t\tspan.SetProperty(\"net.peer.addr\", raddr.String())\n\t\t} else {\n\t\t\tspan.SetProperty(\"net.peer.host\", host)\n\t\t\tspan.SetProperty(\"net.peer.port\", port)\n\t\t}\n\n\t\treturn conn, err\n\t}\n}\n\n// shallowCopyStruct creates a shallow copy of the passed in source struct, and\n// returns that copy of the same struct type.\nfunc shallowCopyStruct(src interface{}) interface{} {\n\tsrcVal := reflect.ValueOf(src)\n\tsrcValType := srcVal.Type()\n\n\tvar returnAsPtr bool\n\tif srcValType.Kind() == reflect.Ptr {\n\t\tsrcVal = srcVal.Elem()\n\t\tsrcValType = srcValType.Elem()\n\t\treturnAsPtr = true\n\t}\n\tdstVal := reflect.New(srcValType).Elem()\n\n\tfor i := 0; i < srcValType.NumField(); i++ {\n\t\tft := srcValType.Field(i)\n\t\tif len(ft.PkgPath) != 0 {\n\t\t\t// unexported fields have a PkgPath\n\t\t\tcontinue\n\t\t}\n\n\t\tdstVal.Field(i).Set(srcVal.Field(i))\n\t}\n\n\tif returnAsPtr {\n\t\tdstVal = dstVal.Addr()\n\t}\n\n\treturn dstVal.Interface()\n}\n\n// wrapWithLimitedRedirect updates the Client's Transport and CheckRedirect to\n// not follow any redirect other than 307 and 308. No other redirect will be\n// followed.\n//\n// If the client does not have a Transport defined will use a new SDK default\n// http.Transport configuration.\nfunc wrapWithLimitedRedirect(c *http.Client) *http.Client {\n\ttr := c.Transport\n\tif tr == nil {\n\t\ttr = defaultHTTPTransport()\n\t}\n\n\tcc := *c\n\tcc.CheckRedirect = limitedRedirect\n\tcc.Transport = suppressBadHTTPRedirectTransport{\n\t\ttr: tr,\n\t}\n\n\treturn &cc\n}\n\n// limitedRedirect is a CheckRedirect that prevents the client from following\n// any non 307/308 HTTP status code redirects.\n//\n// The 307 and 308 redirects are allowed because the client must use the\n// original HTTP method for the redirected to location. Whereas 301 and 302\n// allow the client to switch to GET for the redirect.\n//\n// Suppresses all redirect requests with a URL of badHTTPRedirectLocation.\nfunc limitedRedirect(r *http.Request, via []*http.Request) error {\n\t// Request.Response, in CheckRedirect is the response that is triggering\n\t// the redirect.\n\tresp := r.Response\n\tif r.URL.String() == badHTTPRedirectLocation {\n\t\tresp.Header.Del(badHTTPRedirectLocation)\n\t\treturn http.ErrUseLastResponse\n\t}\n\n\tswitch resp.StatusCode {\n\tcase 307, 308:\n\t\t// Only allow 307 and 308 redirects as they preserve the method.\n\t\treturn nil\n\t}\n\n\treturn http.ErrUseLastResponse\n}\n\n// suppressBadHTTPRedirectTransport provides an http.RoundTripper\n// implementation that wraps another http.RoundTripper to prevent HTTP client\n// receiving 301 and 302 HTTP responses redirects without the required location\n// header.\n//\n// Clients using this utility must have a CheckRedirect, e.g. limitedRedirect,\n// that check for responses with having a URL of baseHTTPRedirectLocation, and\n// suppress the redirect.\ntype suppressBadHTTPRedirectTransport struct {\n\ttr http.RoundTripper\n}\n\nconst badHTTPRedirectLocation = `https://amazonaws.com/badhttpredirectlocation`\n\n// RoundTrip backfills a stub location when a 301/302 response is received\n// without a location. This stub location is used by limitedRedirect to prevent\n// the HTTP client from failing attempting to use follow a redirect without a\n// location value.\nfunc (t suppressBadHTTPRedirectTransport) RoundTrip(r *http.Request) (*http.Response, error) {\n\tresp, err := t.tr.RoundTrip(r)\n\tif err != nil {\n\t\treturn resp, err\n\t}\n\n\t// S3 is the only known service to return 301 without location header.\n\t// The Go standard library HTTP client will return an opaque error if it\n\t// tries to follow a 301/302 response missing the location header.\n\tswitch resp.StatusCode {\n\tcase 301, 302:\n\t\tif v := resp.Header.Get(\"Location\"); len(v) == 0 {\n\t\t\tresp.Header.Set(\"Location\", badHTTPRedirectLocation)\n\t\t}\n\t}\n\n\treturn resp, err\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/content_type.go",
    "content": "package http\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// removeContentTypeHeader is a build middleware that removes\n// content type header if content-length header is unset or\n// is set to zero,\ntype removeContentTypeHeader struct {\n}\n\n// ID the name of the middleware.\nfunc (m *removeContentTypeHeader) ID() string {\n\treturn \"RemoveContentTypeHeader\"\n}\n\n// HandleBuild adds or appends the constructed user agent to the request.\nfunc (m *removeContentTypeHeader) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (\n\tout middleware.BuildOutput, metadata middleware.Metadata, err error,\n) {\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type %T\", in)\n\t}\n\n\t// remove contentTypeHeader when content-length is zero\n\tif req.ContentLength == 0 {\n\t\treq.Header.Del(\"content-type\")\n\t}\n\n\treturn next.HandleBuild(ctx, in)\n}\n\n// RemoveContentTypeHeader removes content-type header if\n// content length is unset or equal to zero.\nfunc RemoveContentTypeHeader(stack *middleware.Stack) error {\n\treturn stack.Build.Add(&removeContentTypeHeader{}, middleware.After)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/response_error.go",
    "content": "package http\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// ResponseError provides the HTTP centric error type wrapping the underlying error\n// with the HTTP response value and the deserialized RequestID.\ntype ResponseError struct {\n\t*smithyhttp.ResponseError\n\n\t// RequestID associated with response error\n\tRequestID string\n}\n\n// ServiceRequestID returns the request id associated with Response Error\nfunc (e *ResponseError) ServiceRequestID() string { return e.RequestID }\n\n// Error returns the formatted error\nfunc (e *ResponseError) Error() string {\n\treturn fmt.Sprintf(\n\t\t\"https response error StatusCode: %d, RequestID: %s, %v\",\n\t\te.Response.StatusCode, e.RequestID, e.Err)\n}\n\n// As populates target and returns true if the type of target is a error type that\n// the ResponseError embeds, (e.g.AWS HTTP ResponseError)\nfunc (e *ResponseError) As(target interface{}) bool {\n\treturn errors.As(e.ResponseError, target)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/response_error_middleware.go",
    "content": "package http\n\nimport (\n\t\"context\"\n\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// AddResponseErrorMiddleware adds response error wrapper middleware\nfunc AddResponseErrorMiddleware(stack *middleware.Stack) error {\n\t// add error wrapper middleware before request id retriever middleware so that it can wrap the error response\n\t// returned by operation deserializers\n\treturn stack.Deserialize.Insert(&ResponseErrorWrapper{}, \"RequestIDRetriever\", middleware.Before)\n}\n\n// ResponseErrorWrapper wraps operation errors with ResponseError.\ntype ResponseErrorWrapper struct {\n}\n\n// ID returns the middleware identifier\nfunc (m *ResponseErrorWrapper) ID() string {\n\treturn \"ResponseErrorWrapper\"\n}\n\n// HandleDeserialize wraps the stack error with smithyhttp.ResponseError.\nfunc (m *ResponseErrorWrapper) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err == nil {\n\t\t// Nothing to do when there is no error.\n\t\treturn out, metadata, err\n\t}\n\n\tresp, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\t// No raw response to wrap with.\n\t\treturn out, metadata, err\n\t}\n\n\t// look for request id in metadata\n\treqID, _ := awsmiddleware.GetRequestIDMetadata(metadata)\n\n\t// Wrap the returned smithy error with the request id retrieved from the metadata\n\terr = &ResponseError{\n\t\tResponseError: &smithyhttp.ResponseError{\n\t\t\tResponse: resp,\n\t\t\tErr:      err,\n\t\t},\n\t\tRequestID: reqID,\n\t}\n\n\treturn out, metadata, err\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/timeout_read_closer.go",
    "content": "package http\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"time\"\n\n\t\"github.com/aws/smithy-go\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\ntype readResult struct {\n\tn   int\n\terr error\n}\n\n// ResponseTimeoutError is an error when the reads from the response are\n// delayed longer than the timeout the read was configured for.\ntype ResponseTimeoutError struct {\n\tTimeoutDur time.Duration\n}\n\n// Timeout returns that the error is was caused by a timeout, and can be\n// retried.\nfunc (*ResponseTimeoutError) Timeout() bool { return true }\n\nfunc (e *ResponseTimeoutError) Error() string {\n\treturn fmt.Sprintf(\"read on body reach timeout limit, %v\", e.TimeoutDur)\n}\n\n// timeoutReadCloser will handle body reads that take too long.\n// We will return a ErrReadTimeout error if a timeout occurs.\ntype timeoutReadCloser struct {\n\treader   io.ReadCloser\n\tduration time.Duration\n}\n\n// Read will spin off a goroutine to call the reader's Read method. We will\n// select on the timer's channel or the read's channel. Whoever completes first\n// will be returned.\nfunc (r *timeoutReadCloser) Read(b []byte) (int, error) {\n\ttimer := time.NewTimer(r.duration)\n\tc := make(chan readResult, 1)\n\n\tgo func() {\n\t\tn, err := r.reader.Read(b)\n\t\ttimer.Stop()\n\t\tc <- readResult{n: n, err: err}\n\t}()\n\n\tselect {\n\tcase data := <-c:\n\t\treturn data.n, data.err\n\tcase <-timer.C:\n\t\treturn 0, &ResponseTimeoutError{TimeoutDur: r.duration}\n\t}\n}\n\nfunc (r *timeoutReadCloser) Close() error {\n\treturn r.reader.Close()\n}\n\n// AddResponseReadTimeoutMiddleware adds a middleware to the stack that wraps the\n// response body so that a read that takes too long will return an error.\nfunc AddResponseReadTimeoutMiddleware(stack *middleware.Stack, duration time.Duration) error {\n\treturn stack.Deserialize.Add(&readTimeout{duration: duration}, middleware.After)\n}\n\n// readTimeout wraps the response body with a timeoutReadCloser\ntype readTimeout struct {\n\tduration time.Duration\n}\n\n// ID returns the id of the middleware\nfunc (*readTimeout) ID() string {\n\treturn \"ReadResponseTimeout\"\n}\n\n// HandleDeserialize implements the DeserializeMiddleware interface\nfunc (m *readTimeout) HandleDeserialize(\n\tctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler,\n) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tresponse.Body = &timeoutReadCloser{\n\t\treader:   response.Body,\n\t\tduration: m.duration,\n\t}\n\tout.RawResponse = response\n\n\treturn out, metadata, err\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/types.go",
    "content": "package aws\n\nimport (\n\t\"fmt\"\n)\n\n// Ternary is an enum allowing an unknown or none state in addition to a bool's\n// true and false.\ntype Ternary int\n\nfunc (t Ternary) String() string {\n\tswitch t {\n\tcase UnknownTernary:\n\t\treturn \"unknown\"\n\tcase FalseTernary:\n\t\treturn \"false\"\n\tcase TrueTernary:\n\t\treturn \"true\"\n\tdefault:\n\t\treturn fmt.Sprintf(\"unknown value, %d\", int(t))\n\t}\n}\n\n// Bool returns true if the value is TrueTernary, false otherwise.\nfunc (t Ternary) Bool() bool {\n\treturn t == TrueTernary\n}\n\n// Enumerations for the values of the Ternary type.\nconst (\n\tUnknownTernary Ternary = iota\n\tFalseTernary\n\tTrueTernary\n)\n\n// BoolTernary returns a true or false Ternary value for the bool provided.\nfunc BoolTernary(v bool) Ternary {\n\tif v {\n\t\treturn TrueTernary\n\t}\n\treturn FalseTernary\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/aws/version.go",
    "content": "// Package aws provides core functionality for making requests to AWS services.\npackage aws\n\n// SDKName is the name of this AWS SDK\nconst SDKName = \"aws-sdk-go-v2\"\n\n// SDKVersion is the version of this SDK\nconst SDKVersion = goModuleVersion\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md",
    "content": "# v1.29.14 (2025-04-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.13 (2025-04-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.12 (2025-03-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.11 (2025-03-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.10 (2025-03-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.9 (2025-03-04.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.8 (2025-02-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.7 (2025-02-18)\n\n* **Bug Fix**: Bump go version to 1.22\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.6 (2025-02-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.5 (2025-02-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.4 (2025-01-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.3 (2025-01-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.2 (2025-01-24)\n\n* **Bug Fix**: Fix env config naming and usage of deprecated ioutil\n* **Dependency Update**: Updated to the latest SDK module versions\n* **Dependency Update**: Upgrade to smithy-go v1.22.2.\n\n# v1.29.1 (2025-01-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.0 (2025-01-15)\n\n* **Feature**: S3 client behavior is updated to always calculate a checksum by default for operations that support it (such as PutObject or UploadPart), or require it (such as DeleteObjects). The checksum algorithm used by default now becomes CRC32. Checksum behavior can be configured using `when_supported` and `when_required` options - in code using RequestChecksumCalculation, in shared config using request_checksum_calculation, or as env variable using AWS_REQUEST_CHECKSUM_CALCULATION. The S3 client attempts to validate response checksums for all S3 API operations that support checksums. However, if the SDK has not implemented the specified checksum algorithm then this validation is skipped. Checksum validation behavior can be configured using `when_supported` and `when_required` options - in code using ResponseChecksumValidation, in shared config using response_checksum_validation, or as env variable using AWS_RESPONSE_CHECKSUM_VALIDATION.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.11 (2025-01-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.10 (2025-01-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.9 (2025-01-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.8 (2025-01-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.7 (2024-12-19)\n\n* **Bug Fix**: Fix improper use of printf-style functions.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.6 (2024-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.5 (2024-11-18)\n\n* **Dependency Update**: Update to smithy-go v1.22.1.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.4 (2024-11-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.3 (2024-11-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.2 (2024-11-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.1 (2024-10-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.0 (2024-10-16)\n\n* **Feature**: Adds the LoadOptions hook `WithBaseEndpoint` for setting global endpoint override in-code.\n\n# v1.27.43 (2024-10-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.42 (2024-10-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.41 (2024-10-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.40 (2024-10-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.39 (2024-09-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.38 (2024-09-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.37 (2024-09-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.36 (2024-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.35 (2024-09-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.34 (2024-09-16)\n\n* **Bug Fix**: Read `AWS_CONTAINER_CREDENTIALS_FULL_URI` env variable if set when reading a profile with `credential_source`. Also ensure `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` is always read before it\n\n# v1.27.33 (2024-09-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.32 (2024-09-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.31 (2024-08-26)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.30 (2024-08-23)\n\n* **Bug Fix**: Don't fail credentials unit tests if credentials are found on a file\n\n# v1.27.29 (2024-08-22)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.28 (2024-08-15)\n\n* **Dependency Update**: Bump minimum Go version to 1.21.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.27 (2024-07-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.26 (2024-07-10.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.25 (2024-07-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.24 (2024-07-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.23 (2024-06-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.22 (2024-06-26)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.21 (2024-06-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.20 (2024-06-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.19 (2024-06-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.18 (2024-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.17 (2024-06-03)\n\n* **Documentation**: Add deprecation docs to global endpoint resolution interfaces. These APIs were previously deprecated with the introduction of service-specific endpoint resolution (EndpointResolverV2 and BaseEndpoint on service client options).\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.16 (2024-05-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.15 (2024-05-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.14 (2024-05-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.13 (2024-05-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.12 (2024-05-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.11 (2024-04-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.10 (2024-03-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.9 (2024-03-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.8 (2024-03-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.7 (2024-03-07)\n\n* **Bug Fix**: Remove dependency on go-cmp.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.6 (2024-03-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.5 (2024-03-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.4 (2024-02-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.3 (2024-02-22)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.2 (2024-02-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.1 (2024-02-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.0 (2024-02-13)\n\n* **Feature**: Bump minimum Go version to 1.20 per our language support policy.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.26.6 (2024-01-22)\n\n* **Bug Fix**: Remove invalid escaping of shared config values. All values in the shared config file will now be interpreted literally, save for fully-quoted strings which are unwrapped for legacy reasons.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.26.5 (2024-01-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.26.4 (2024-01-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.26.3 (2024-01-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.26.2 (2023-12-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.26.1 (2023-12-08)\n\n* **Bug Fix**: Correct loading of [services *] sections into shared config.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.26.0 (2023-12-07)\n\n* **Feature**: Support modeled request compression. The only algorithm supported at this time is `gzip`.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.12 (2023-12-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.11 (2023-12-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.10 (2023-11-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.9 (2023-11-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.8 (2023-11-28.3)\n\n* **Bug Fix**: Correct resolution of S3Express auth disable toggle.\n\n# v1.25.7 (2023-11-28.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.6 (2023-11-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.5 (2023-11-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.4 (2023-11-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.3 (2023-11-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.2 (2023-11-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.1 (2023-11-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.0 (2023-11-14)\n\n* **Feature**: Add support for dynamic auth token from file and EKS container host in absolute/relative URIs in the HTTP credential provider.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.24.0 (2023-11-13)\n\n* **Feature**: Replace the legacy config parser with a modern, less-strict implementation. Parsing failures within a section will now simply ignore the invalid line rather than silently drop the entire section.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.23.0 (2023-11-09.2)\n\n* **Feature**: BREAKFIX: In order to support subproperty parsing, invalid property definitions must not be ignored\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.22.3 (2023-11-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.22.2 (2023-11-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.22.1 (2023-11-06)\n\n* No change notes available for this release.\n\n# v1.22.0 (2023-11-02)\n\n* **Feature**: Add env and shared config settings for disabling IMDSv1 fallback.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.21.0 (2023-11-01)\n\n* **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.20.0 (2023-10-31)\n\n* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.19.1 (2023-10-24)\n\n* No change notes available for this release.\n\n# v1.19.0 (2023-10-16)\n\n* **Feature**: Modify logic of retrieving user agent appID from env config\n\n# v1.18.45 (2023-10-12)\n\n* **Bug Fix**: Fail to load config if an explicitly provided profile doesn't exist.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.44 (2023-10-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.43 (2023-10-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.42 (2023-09-22)\n\n* **Bug Fix**: Fixed a bug where merging `max_attempts` or `duration_seconds` fields across shared config files with invalid values would silently default them to 0.\n* **Bug Fix**: Move type assertion of config values out of the parsing stage, which resolves an issue where the contents of a profile would silently be dropped with certain numeric formats.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.41 (2023-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.40 (2023-09-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.39 (2023-09-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.38 (2023-08-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.37 (2023-08-23)\n\n* No change notes available for this release.\n\n# v1.18.36 (2023-08-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.35 (2023-08-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.34 (2023-08-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.33 (2023-08-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.32 (2023-08-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.31 (2023-07-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.30 (2023-07-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.29 (2023-07-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.28 (2023-07-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.27 (2023-06-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.26 (2023-06-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.25 (2023-05-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.24 (2023-05-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.23 (2023-05-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.22 (2023-04-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.21 (2023-04-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.20 (2023-04-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.19 (2023-03-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.18 (2023-03-16)\n\n* **Bug Fix**: Allow RoleARN to be set as functional option on STS WebIdentityRoleOptions. Fixes aws/aws-sdk-go-v2#2015.\n\n# v1.18.17 (2023-03-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.16 (2023-03-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.15 (2023-02-22)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.14 (2023-02-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.13 (2023-02-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.12 (2023-02-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.11 (2023-02-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.10 (2023-01-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.9 (2023-01-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.8 (2023-01-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.7 (2022-12-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.6 (2022-12-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.5 (2022-12-15)\n\n* **Bug Fix**: Unify logic between shared config and in finding home directory\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.4 (2022-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.3 (2022-11-22)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.2 (2022-11-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.1 (2022-11-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.0 (2022-11-11)\n\n* **Announcement**: When using the SSOTokenProvider, a previous implementation incorrectly compensated for invalid SSOTokenProvider configurations in the shared profile. This has been fixed via PR #1903 and tracked in issue #1846\n* **Feature**: Adds token refresh support (via SSOTokenProvider) when using the SSOCredentialProvider\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.11 (2022-11-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.10 (2022-10-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.9 (2022-10-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.8 (2022-09-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.7 (2022-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.6 (2022-09-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.5 (2022-09-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.4 (2022-08-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.3 (2022-08-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.2 (2022-08-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.1 (2022-08-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.0 (2022-08-14)\n\n* **Feature**: Add alternative mechanism for determning the users `$HOME` or `%USERPROFILE%` location when the environment variables are not present.\n\n# v1.16.1 (2022-08-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.0 (2022-08-10)\n\n* **Feature**: Adds support for the following settings in the `~/.aws/credentials` file: `sso_account_id`, `sso_region`, `sso_role_name`, `sso_start_url`, and `ca_bundle`.\n\n# v1.15.17 (2022-08-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.16 (2022-08-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.15 (2022-08-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.14 (2022-07-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.13 (2022-07-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.12 (2022-06-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.11 (2022-06-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.10 (2022-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.9 (2022-05-26)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.8 (2022-05-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.7 (2022-05-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.6 (2022-05-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.5 (2022-05-09)\n\n* **Bug Fix**: Fixes a bug in LoadDefaultConfig to correctly assign ConfigSources so all config resolvers have access to the config sources. This fixes the feature/ec2/imds client not having configuration applied via config.LoadOptions such as EC2IMDSClientEnableState. PR [#1682](https://github.com/aws/aws-sdk-go-v2/pull/1682)\n\n# v1.15.4 (2022-04-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.3 (2022-03-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.2 (2022-03-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.1 (2022-03-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.0 (2022-03-08)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.0 (2022-02-24)\n\n* **Feature**: Adds support for loading RetryMaxAttempts and RetryMod from the environment and shared configuration files. These parameters drive how the SDK's API client will initialize its default retryer, if custome retryer has not been specified. See [config](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/config) module and [aws.Config](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws#Config) for more information about and how to use these new options.\n* **Feature**: Adds support for the `ca_bundle` parameter in shared config and credentials files. The usage of the file is the same as environment variable, `AWS_CA_BUNDLE`, but sourced from shared config. Fixes [#1589](https://github.com/aws/aws-sdk-go-v2/issues/1589)\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.1 (2022-01-28)\n\n* **Bug Fix**: Fixes LoadDefaultConfig handling of errors returned by passed in functional options. Previously errors returned from the LoadOptions passed into LoadDefaultConfig were incorrectly ignored. [#1562](https://github.com/aws/aws-sdk-go-v2/pull/1562). Thanks to [Pinglei Guo](https://github.com/pingleig) for submitting this PR.\n* **Bug Fix**: Fixes the SDK's handling of `duration_sections` in the shared credentials file or specified in multiple shared config and shared credentials files under the same profile. [#1568](https://github.com/aws/aws-sdk-go-v2/pull/1568). Thanks to [Amir Szekely](https://github.com/kichik) for help reproduce this bug.\n* **Bug Fix**: Updates `config` module to use os.UserHomeDir instead of hard coded environment variable for OS. [#1563](https://github.com/aws/aws-sdk-go-v2/pull/1563)\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.0 (2022-01-14)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.0 (2022-01-07)\n\n* **Feature**: Add load option for CredentialCache. Adds a new member to the LoadOptions struct, CredentialsCacheOptions. This member allows specifying a function that will be used to configure the CredentialsCache. The CredentialsCacheOptions will only be used if the configuration loader will wrap the underlying credential provider in the CredentialsCache.\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.1 (2021-12-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.0 (2021-12-02)\n\n* **Feature**: Add support for specifying `EndpointResolverWithOptions` on `LoadOptions`, and associated `WithEndpointResolverWithOptions`.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.3 (2021-11-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.2 (2021-11-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.1 (2021-11-12)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.0 (2021-11-06)\n\n* **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically.\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.0 (2021-10-21)\n\n* **Feature**: Updated  to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.8.3 (2021-10-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.8.2 (2021-09-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.8.1 (2021-09-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.8.0 (2021-09-02)\n\n* **Feature**: Add support for S3 Multi-Region Access Point ARNs.\n\n# v1.7.0 (2021-08-27)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.6.1 (2021-08-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.6.0 (2021-08-04)\n\n* **Feature**: adds error handling for defered close calls\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.0 (2021-07-15)\n\n* **Feature**: Support has been added for EC2 IPv6-enabled Instance Metadata Service Endpoints.\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.1 (2021-07-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.0 (2021-06-25)\n\n* **Feature**: Adds configuration setting for enabling endpoint discovery.\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.0 (2021-05-20)\n\n* **Feature**: SSO credentials can now be defined alongside other credential providers within the same configuration profile.\n* **Bug Fix**: Profile names were incorrectly normalized to lower-case, which could result in unexpected profile configurations.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.0 (2021-05-14)\n\n* **Feature**: Constant has been added to modules to enable runtime version inspection for reporting.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/config/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/config/config.go",
    "content": "package config\n\nimport (\n\t\"context\"\n\t\"os\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n)\n\n// defaultAWSConfigResolvers are a slice of functions that will resolve external\n// configuration values into AWS configuration values.\n//\n// This will setup the AWS configuration's Region,\nvar defaultAWSConfigResolvers = []awsConfigResolver{\n\t// Resolves the default configuration the SDK's aws.Config will be\n\t// initialized with.\n\tresolveDefaultAWSConfig,\n\n\t// Sets the logger to be used. Could be user provided logger, and client\n\t// logging mode.\n\tresolveLogger,\n\tresolveClientLogMode,\n\n\t// Sets the HTTP client and configuration to use for making requests using\n\t// the HTTP transport.\n\tresolveHTTPClient,\n\tresolveCustomCABundle,\n\n\t// Sets the endpoint resolving behavior the API Clients will use for making\n\t// requests to. Clients default to their own clients this allows overrides\n\t// to be specified. The resolveEndpointResolver option is deprecated, but\n\t// we still need to set it for backwards compatibility on config\n\t// construction.\n\tresolveEndpointResolver,\n\tresolveEndpointResolverWithOptions,\n\n\t// Sets the retry behavior API clients will use within their retry attempt\n\t// middleware. Defaults to unset, allowing API clients to define their own\n\t// retry behavior.\n\tresolveRetryer,\n\n\t// Sets the region the API Clients should use for making requests to.\n\tresolveRegion,\n\tresolveEC2IMDSRegion,\n\tresolveDefaultRegion,\n\n\t// Sets the additional set of middleware stack mutators that will custom\n\t// API client request pipeline middleware.\n\tresolveAPIOptions,\n\n\t// Resolves the DefaultsMode that should be used by SDK clients. If this\n\t// mode is set to DefaultsModeAuto.\n\t//\n\t// Comes after HTTPClient and CustomCABundle to ensure the HTTP client is\n\t// configured if provided before invoking IMDS if mode is auto. Comes\n\t// before resolving credentials so that those subsequent clients use the\n\t// configured auto mode.\n\tresolveDefaultsModeOptions,\n\n\t// Sets the resolved credentials the API clients will use for\n\t// authentication. Provides the SDK's default credential chain.\n\t//\n\t// Should probably be the last step in the resolve chain to ensure that all\n\t// other configurations are resolved first in case downstream credentials\n\t// implementations depend on or can be configured with earlier resolved\n\t// configuration options.\n\tresolveCredentials,\n\n\t// Sets the resolved bearer authentication token API clients will use for\n\t// httpBearerAuth authentication scheme.\n\tresolveBearerAuthToken,\n\n\t// Sets the sdk app ID if present in env var or shared config profile\n\tresolveAppID,\n\n\tresolveBaseEndpoint,\n\n\t// Sets the DisableRequestCompression if present in env var or shared config profile\n\tresolveDisableRequestCompression,\n\n\t// Sets the RequestMinCompressSizeBytes if present in env var or shared config profile\n\tresolveRequestMinCompressSizeBytes,\n\n\t// Sets the AccountIDEndpointMode if present in env var or shared config profile\n\tresolveAccountIDEndpointMode,\n\n\t// Sets the RequestChecksumCalculation if present in env var or shared config profile\n\tresolveRequestChecksumCalculation,\n\n\t// Sets the ResponseChecksumValidation if present in env var or shared config profile\n\tresolveResponseChecksumValidation,\n}\n\n// A Config represents a generic configuration value or set of values. This type\n// will be used by the AWSConfigResolvers to extract\n//\n// General the Config type will use type assertion against the Provider interfaces\n// to extract specific data from the Config.\ntype Config interface{}\n\n// A loader is used to load external configuration data and returns it as\n// a generic Config type.\n//\n// The loader should return an error if it fails to load the external configuration\n// or the configuration data is malformed, or required components missing.\ntype loader func(context.Context, configs) (Config, error)\n\n// An awsConfigResolver will extract configuration data from the configs slice\n// using the provider interfaces to extract specific functionality. The extracted\n// configuration values will be written to the AWS Config value.\n//\n// The resolver should return an error if it it fails to extract the data, the\n// data is malformed, or incomplete.\ntype awsConfigResolver func(ctx context.Context, cfg *aws.Config, configs configs) error\n\n// configs is a slice of Config values. These values will be used by the\n// AWSConfigResolvers to extract external configuration values to populate the\n// AWS Config type.\n//\n// Use AppendFromLoaders to add additional external Config values that are\n// loaded from external sources.\n//\n// Use ResolveAWSConfig after external Config values have been added or loaded\n// to extract the loaded configuration values into the AWS Config.\ntype configs []Config\n\n// AppendFromLoaders iterates over the slice of loaders passed in calling each\n// loader function in order. The external config value returned by the loader\n// will be added to the returned configs slice.\n//\n// If a loader returns an error this method will stop iterating and return\n// that error.\nfunc (cs configs) AppendFromLoaders(ctx context.Context, loaders []loader) (configs, error) {\n\tfor _, fn := range loaders {\n\t\tcfg, err := fn(ctx, cs)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tcs = append(cs, cfg)\n\t}\n\n\treturn cs, nil\n}\n\n// ResolveAWSConfig returns a AWS configuration populated with values by calling\n// the resolvers slice passed in. Each resolver is called in order. Any resolver\n// may overwrite the AWS Configuration value of a previous resolver.\n//\n// If an resolver returns an error this method will return that error, and stop\n// iterating over the resolvers.\nfunc (cs configs) ResolveAWSConfig(ctx context.Context, resolvers []awsConfigResolver) (aws.Config, error) {\n\tvar cfg aws.Config\n\n\tfor _, fn := range resolvers {\n\t\tif err := fn(ctx, &cfg, cs); err != nil {\n\t\t\treturn aws.Config{}, err\n\t\t}\n\t}\n\n\treturn cfg, nil\n}\n\n// ResolveConfig calls the provide function passing slice of configuration sources.\n// This implements the aws.ConfigResolver interface.\nfunc (cs configs) ResolveConfig(f func(configs []interface{}) error) error {\n\tvar cfgs []interface{}\n\tfor i := range cs {\n\t\tcfgs = append(cfgs, cs[i])\n\t}\n\treturn f(cfgs)\n}\n\n// LoadDefaultConfig reads the SDK's default external configurations, and\n// populates an AWS Config with the values from the external configurations.\n//\n// An optional variadic set of additional Config values can be provided as input\n// that will be prepended to the configs slice. Use this to add custom configuration.\n// The custom configurations must satisfy the respective providers for their data\n// or the custom data will be ignored by the resolvers and config loaders.\n//\n//\tcfg, err := config.LoadDefaultConfig( context.TODO(),\n//\t   config.WithSharedConfigProfile(\"test-profile\"),\n//\t)\n//\tif err != nil {\n//\t   panic(fmt.Sprintf(\"failed loading config, %v\", err))\n//\t}\n//\n// The default configuration sources are:\n// * Environment Variables\n// * Shared Configuration and Shared Credentials files.\nfunc LoadDefaultConfig(ctx context.Context, optFns ...func(*LoadOptions) error) (cfg aws.Config, err error) {\n\tvar options LoadOptions\n\tfor _, optFn := range optFns {\n\t\tif err := optFn(&options); err != nil {\n\t\t\treturn aws.Config{}, err\n\t\t}\n\t}\n\n\t// assign Load Options to configs\n\tvar cfgCpy = configs{options}\n\n\tcfgCpy, err = cfgCpy.AppendFromLoaders(ctx, resolveConfigLoaders(&options))\n\tif err != nil {\n\t\treturn aws.Config{}, err\n\t}\n\n\tcfg, err = cfgCpy.ResolveAWSConfig(ctx, defaultAWSConfigResolvers)\n\tif err != nil {\n\t\treturn aws.Config{}, err\n\t}\n\n\treturn cfg, nil\n}\n\nfunc resolveConfigLoaders(options *LoadOptions) []loader {\n\tloaders := make([]loader, 2)\n\tloaders[0] = loadEnvConfig\n\n\t// specification of a profile should cause a load failure if it doesn't exist\n\tif os.Getenv(awsProfileEnv) != \"\" || options.SharedConfigProfile != \"\" {\n\t\tloaders[1] = loadSharedConfig\n\t} else {\n\t\tloaders[1] = loadSharedConfigIgnoreNotExist\n\t}\n\n\treturn loaders\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/config/defaultsmode.go",
    "content": "package config\n\nimport (\n\t\"context\"\n\t\"os\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/feature/ec2/imds\"\n)\n\nconst execEnvVar = \"AWS_EXECUTION_ENV\"\n\n// DefaultsModeOptions is the set of options that are used to configure\ntype DefaultsModeOptions struct {\n\t// The SDK configuration defaults mode. Defaults to legacy if not specified.\n\t//\n\t// Supported modes are: auto, cross-region, in-region, legacy, mobile, standard\n\tMode aws.DefaultsMode\n\n\t// The EC2 Instance Metadata Client that should be used when performing environment\n\t// discovery when aws.DefaultsModeAuto is set.\n\t//\n\t// If not specified the SDK will construct a client if the instance metadata service has not been disabled by\n\t// the AWS_EC2_METADATA_DISABLED environment variable.\n\tIMDSClient *imds.Client\n}\n\nfunc resolveDefaultsModeRuntimeEnvironment(ctx context.Context, envConfig *EnvConfig, client *imds.Client) (aws.RuntimeEnvironment, error) {\n\tgetRegionOutput, err := client.GetRegion(ctx, &imds.GetRegionInput{})\n\t// honor context timeouts, but if we couldn't talk to IMDS don't fail runtime environment introspection.\n\tselect {\n\tcase <-ctx.Done():\n\t\treturn aws.RuntimeEnvironment{}, err\n\tdefault:\n\t}\n\n\tvar imdsRegion string\n\tif err == nil {\n\t\timdsRegion = getRegionOutput.Region\n\t}\n\n\treturn aws.RuntimeEnvironment{\n\t\tEnvironmentIdentifier:     aws.ExecutionEnvironmentID(os.Getenv(execEnvVar)),\n\t\tRegion:                    envConfig.Region,\n\t\tEC2InstanceMetadataRegion: imdsRegion,\n\t}, nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/config/doc.go",
    "content": "// Package config provides utilities for loading configuration from multiple\n// sources that can be used to configure the SDK's API clients, and utilities.\n//\n// The config package will load configuration from environment variables, AWS\n// shared configuration file (~/.aws/config), and AWS shared credentials file\n// (~/.aws/credentials).\n//\n// Use the LoadDefaultConfig to load configuration from all the SDK's supported\n// sources, and resolve credentials using the SDK's default credential chain.\n//\n// LoadDefaultConfig allows for a variadic list of additional Config sources that can\n// provide one or more configuration values which can be used to programmatically control the resolution\n// of a specific value, or allow for broader range of additional configuration sources not supported by the SDK.\n// A Config source implements one or more provider interfaces defined in this package. Config sources passed in will\n// take precedence over the default environment and shared config sources used by the SDK. If one or more Config sources\n// implement the same provider interface, priority will be handled by the order in which the sources were passed in.\n//\n// A number of helpers (prefixed by “With“)  are provided in this package that implement their respective provider\n// interface. These helpers should be used for overriding configuration programmatically at runtime.\npackage config\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/config/env_config.go",
    "content": "package config\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/feature/ec2/imds\"\n\tsmithyrequestcompression \"github.com/aws/smithy-go/private/requestcompression\"\n)\n\n// CredentialsSourceName provides a name of the provider when config is\n// loaded from environment.\nconst CredentialsSourceName = \"EnvConfigCredentials\"\n\n// Environment variables that will be read for configuration values.\nconst (\n\tawsAccessKeyIDEnv = \"AWS_ACCESS_KEY_ID\"\n\tawsAccessKeyEnv   = \"AWS_ACCESS_KEY\"\n\n\tawsSecretAccessKeyEnv = \"AWS_SECRET_ACCESS_KEY\"\n\tawsSecretKeyEnv       = \"AWS_SECRET_KEY\"\n\n\tawsSessionTokenEnv = \"AWS_SESSION_TOKEN\"\n\n\tawsContainerCredentialsFullURIEnv     = \"AWS_CONTAINER_CREDENTIALS_FULL_URI\"\n\tawsContainerCredentialsRelativeURIEnv = \"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\"\n\tawsContainerAuthorizationTokenEnv     = \"AWS_CONTAINER_AUTHORIZATION_TOKEN\"\n\n\tawsRegionEnv        = \"AWS_REGION\"\n\tawsDefaultRegionEnv = \"AWS_DEFAULT_REGION\"\n\n\tawsProfileEnv        = \"AWS_PROFILE\"\n\tawsDefaultProfileEnv = \"AWS_DEFAULT_PROFILE\"\n\n\tawsSharedCredentialsFileEnv = \"AWS_SHARED_CREDENTIALS_FILE\"\n\n\tawsConfigFileEnv = \"AWS_CONFIG_FILE\"\n\n\tawsCABundleEnv = \"AWS_CA_BUNDLE\"\n\n\tawsWebIdentityTokenFileEnv = \"AWS_WEB_IDENTITY_TOKEN_FILE\"\n\n\tawsRoleARNEnv         = \"AWS_ROLE_ARN\"\n\tawsRoleSessionNameEnv = \"AWS_ROLE_SESSION_NAME\"\n\n\tawsEnableEndpointDiscoveryEnv = \"AWS_ENABLE_ENDPOINT_DISCOVERY\"\n\n\tawsS3UseARNRegionEnv = \"AWS_S3_USE_ARN_REGION\"\n\n\tawsEc2MetadataServiceEndpointModeEnv = \"AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE\"\n\n\tawsEc2MetadataServiceEndpointEnv = \"AWS_EC2_METADATA_SERVICE_ENDPOINT\"\n\n\tawsEc2MetadataDisabledEnv   = \"AWS_EC2_METADATA_DISABLED\"\n\tawsEc2MetadataV1DisabledEnv = \"AWS_EC2_METADATA_V1_DISABLED\"\n\n\tawsS3DisableMultiRegionAccessPointsEnv = \"AWS_S3_DISABLE_MULTIREGION_ACCESS_POINTS\"\n\n\tawsUseDualStackEndpointEnv = \"AWS_USE_DUALSTACK_ENDPOINT\"\n\n\tawsUseFIPSEndpointEnv = \"AWS_USE_FIPS_ENDPOINT\"\n\n\tawsDefaultsModeEnv = \"AWS_DEFAULTS_MODE\"\n\n\tawsMaxAttemptsEnv = \"AWS_MAX_ATTEMPTS\"\n\tawsRetryModeEnv   = \"AWS_RETRY_MODE\"\n\tawsSdkUaAppIDEnv  = \"AWS_SDK_UA_APP_ID\"\n\n\tawsIgnoreConfiguredEndpointURLEnv = \"AWS_IGNORE_CONFIGURED_ENDPOINT_URLS\"\n\tawsEndpointURLEnv                 = \"AWS_ENDPOINT_URL\"\n\n\tawsDisableRequestCompressionEnv      = \"AWS_DISABLE_REQUEST_COMPRESSION\"\n\tawsRequestMinCompressionSizeBytesEnv = \"AWS_REQUEST_MIN_COMPRESSION_SIZE_BYTES\"\n\n\tawsS3DisableExpressSessionAuthEnv = \"AWS_S3_DISABLE_EXPRESS_SESSION_AUTH\"\n\n\tawsAccountIDEnv             = \"AWS_ACCOUNT_ID\"\n\tawsAccountIDEndpointModeEnv = \"AWS_ACCOUNT_ID_ENDPOINT_MODE\"\n\n\tawsRequestChecksumCalculation = \"AWS_REQUEST_CHECKSUM_CALCULATION\"\n\tawsResponseChecksumValidation = \"AWS_RESPONSE_CHECKSUM_VALIDATION\"\n)\n\nvar (\n\tcredAccessEnvKeys = []string{\n\t\tawsAccessKeyIDEnv,\n\t\tawsAccessKeyEnv,\n\t}\n\tcredSecretEnvKeys = []string{\n\t\tawsSecretAccessKeyEnv,\n\t\tawsSecretKeyEnv,\n\t}\n\tregionEnvKeys = []string{\n\t\tawsRegionEnv,\n\t\tawsDefaultRegionEnv,\n\t}\n\tprofileEnvKeys = []string{\n\t\tawsProfileEnv,\n\t\tawsDefaultProfileEnv,\n\t}\n)\n\n// EnvConfig is a collection of environment values the SDK will read\n// setup config from. All environment values are optional. But some values\n// such as credentials require multiple values to be complete or the values\n// will be ignored.\ntype EnvConfig struct {\n\t// Environment configuration values. If set both Access Key ID and Secret Access\n\t// Key must be provided. Session Token and optionally also be provided, but is\n\t// not required.\n\t//\n\t//\t# Access Key ID\n\t//\tAWS_ACCESS_KEY_ID=AKID\n\t//\tAWS_ACCESS_KEY=AKID # only read if AWS_ACCESS_KEY_ID is not set.\n\t//\n\t//\t# Secret Access Key\n\t//\tAWS_SECRET_ACCESS_KEY=SECRET\n\t//\tAWS_SECRET_KEY=SECRET # only read if AWS_SECRET_ACCESS_KEY is not set.\n\t//\n\t//\t# Session Token\n\t//\tAWS_SESSION_TOKEN=TOKEN\n\tCredentials aws.Credentials\n\n\t// ContainerCredentialsEndpoint value is the HTTP enabled endpoint to retrieve credentials\n\t// using the endpointcreds.Provider\n\tContainerCredentialsEndpoint string\n\n\t// ContainerCredentialsRelativePath is the relative URI path that will be used when attempting to retrieve\n\t// credentials from the container endpoint.\n\tContainerCredentialsRelativePath string\n\n\t// ContainerAuthorizationToken is the authorization token that will be included in the HTTP Authorization\n\t// header when attempting to retrieve credentials from the container credentials endpoint.\n\tContainerAuthorizationToken string\n\n\t// Region value will instruct the SDK where to make service API requests to. If is\n\t// not provided in the environment the region must be provided before a service\n\t// client request is made.\n\t//\n\t//\tAWS_REGION=us-west-2\n\t//\tAWS_DEFAULT_REGION=us-west-2\n\tRegion string\n\n\t// Profile name the SDK should load use when loading shared configuration from the\n\t// shared configuration files. If not provided \"default\" will be used as the\n\t// profile name.\n\t//\n\t//\tAWS_PROFILE=my_profile\n\t//\tAWS_DEFAULT_PROFILE=my_profile\n\tSharedConfigProfile string\n\n\t// Shared credentials file path can be set to instruct the SDK to use an alternate\n\t// file for the shared credentials. If not set the file will be loaded from\n\t// $HOME/.aws/credentials on Linux/Unix based systems, and\n\t// %USERPROFILE%\\.aws\\credentials on Windows.\n\t//\n\t//\tAWS_SHARED_CREDENTIALS_FILE=$HOME/my_shared_credentials\n\tSharedCredentialsFile string\n\n\t// Shared config file path can be set to instruct the SDK to use an alternate\n\t// file for the shared config. If not set the file will be loaded from\n\t// $HOME/.aws/config on Linux/Unix based systems, and\n\t// %USERPROFILE%\\.aws\\config on Windows.\n\t//\n\t//\tAWS_CONFIG_FILE=$HOME/my_shared_config\n\tSharedConfigFile string\n\n\t// Sets the path to a custom Credentials Authority (CA) Bundle PEM file\n\t// that the SDK will use instead of the system's root CA bundle.\n\t// Only use this if you want to configure the SDK to use a custom set\n\t// of CAs.\n\t//\n\t// Enabling this option will attempt to merge the Transport\n\t// into the SDK's HTTP client. If the client's Transport is\n\t// not a http.Transport an error will be returned. If the\n\t// Transport's TLS config is set this option will cause the\n\t// SDK to overwrite the Transport's TLS config's  RootCAs value.\n\t//\n\t// Setting a custom HTTPClient in the aws.Config options will override this setting.\n\t// To use this option and custom HTTP client, the HTTP client needs to be provided\n\t// when creating the config. Not the service client.\n\t//\n\t//  AWS_CA_BUNDLE=$HOME/my_custom_ca_bundle\n\tCustomCABundle string\n\n\t// Enables endpoint discovery via environment variables.\n\t//\n\t//\tAWS_ENABLE_ENDPOINT_DISCOVERY=true\n\tEnableEndpointDiscovery aws.EndpointDiscoveryEnableState\n\n\t// Specifies the WebIdentity token the SDK should use to assume a role\n\t// with.\n\t//\n\t//  AWS_WEB_IDENTITY_TOKEN_FILE=file_path\n\tWebIdentityTokenFilePath string\n\n\t// Specifies the IAM role arn to use when assuming an role.\n\t//\n\t//  AWS_ROLE_ARN=role_arn\n\tRoleARN string\n\n\t// Specifies the IAM role session name to use when assuming a role.\n\t//\n\t//  AWS_ROLE_SESSION_NAME=session_name\n\tRoleSessionName string\n\n\t// Specifies if the S3 service should allow ARNs to direct the region\n\t// the client's requests are sent to.\n\t//\n\t// AWS_S3_USE_ARN_REGION=true\n\tS3UseARNRegion *bool\n\n\t// Specifies if the EC2 IMDS service client is enabled.\n\t//\n\t// AWS_EC2_METADATA_DISABLED=true\n\tEC2IMDSClientEnableState imds.ClientEnableState\n\n\t// Specifies if EC2 IMDSv1 fallback is disabled.\n\t//\n\t// AWS_EC2_METADATA_V1_DISABLED=true\n\tEC2IMDSv1Disabled *bool\n\n\t// Specifies the EC2 Instance Metadata Service default endpoint selection mode (IPv4 or IPv6)\n\t//\n\t// AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE=IPv6\n\tEC2IMDSEndpointMode imds.EndpointModeState\n\n\t// Specifies the EC2 Instance Metadata Service endpoint to use. If specified it overrides EC2IMDSEndpointMode.\n\t//\n\t// AWS_EC2_METADATA_SERVICE_ENDPOINT=http://fd00:ec2::254\n\tEC2IMDSEndpoint string\n\n\t// Specifies if the S3 service should disable multi-region access points\n\t// support.\n\t//\n\t// AWS_S3_DISABLE_MULTIREGION_ACCESS_POINTS=true\n\tS3DisableMultiRegionAccessPoints *bool\n\n\t// Specifies that SDK clients must resolve a dual-stack endpoint for\n\t// services.\n\t//\n\t// AWS_USE_DUALSTACK_ENDPOINT=true\n\tUseDualStackEndpoint aws.DualStackEndpointState\n\n\t// Specifies that SDK clients must resolve a FIPS endpoint for\n\t// services.\n\t//\n\t// AWS_USE_FIPS_ENDPOINT=true\n\tUseFIPSEndpoint aws.FIPSEndpointState\n\n\t// Specifies the SDK Defaults Mode used by services.\n\t//\n\t// AWS_DEFAULTS_MODE=standard\n\tDefaultsMode aws.DefaultsMode\n\n\t// Specifies the maximum number attempts an API client will call an\n\t// operation that fails with a retryable error.\n\t//\n\t// AWS_MAX_ATTEMPTS=3\n\tRetryMaxAttempts int\n\n\t// Specifies the retry model the API client will be created with.\n\t//\n\t// aws_retry_mode=standard\n\tRetryMode aws.RetryMode\n\n\t// aws sdk app ID that can be added to user agent header string\n\tAppID string\n\n\t// Flag used to disable configured endpoints.\n\tIgnoreConfiguredEndpoints *bool\n\n\t// Value to contain configured endpoints to be propagated to\n\t// corresponding endpoint resolution field.\n\tBaseEndpoint string\n\n\t// determine if request compression is allowed, default to false\n\t// retrieved from env var AWS_DISABLE_REQUEST_COMPRESSION\n\tDisableRequestCompression *bool\n\n\t// inclusive threshold request body size to trigger compression,\n\t// default to 10240 and must be within 0 and 10485760 bytes inclusive\n\t// retrieved from env var AWS_REQUEST_MIN_COMPRESSION_SIZE_BYTES\n\tRequestMinCompressSizeBytes *int64\n\n\t// Whether S3Express auth is disabled.\n\t//\n\t// This will NOT prevent requests from being made to S3Express buckets, it\n\t// will only bypass the modified endpoint routing and signing behaviors\n\t// associated with the feature.\n\tS3DisableExpressAuth *bool\n\n\t// Indicates whether account ID will be required/ignored in endpoint2.0 routing\n\tAccountIDEndpointMode aws.AccountIDEndpointMode\n\n\t// Indicates whether request checksum should be calculated\n\tRequestChecksumCalculation aws.RequestChecksumCalculation\n\n\t// Indicates whether response checksum should be validated\n\tResponseChecksumValidation aws.ResponseChecksumValidation\n}\n\n// loadEnvConfig reads configuration values from the OS's environment variables.\n// Returning the a Config typed EnvConfig to satisfy the ConfigLoader func type.\nfunc loadEnvConfig(ctx context.Context, cfgs configs) (Config, error) {\n\treturn NewEnvConfig()\n}\n\n// NewEnvConfig retrieves the SDK's environment configuration.\n// See `EnvConfig` for the values that will be retrieved.\nfunc NewEnvConfig() (EnvConfig, error) {\n\tvar cfg EnvConfig\n\n\tcreds := aws.Credentials{\n\t\tSource: CredentialsSourceName,\n\t}\n\tsetStringFromEnvVal(&creds.AccessKeyID, credAccessEnvKeys)\n\tsetStringFromEnvVal(&creds.SecretAccessKey, credSecretEnvKeys)\n\tif creds.HasKeys() {\n\t\tcreds.AccountID = os.Getenv(awsAccountIDEnv)\n\t\tcreds.SessionToken = os.Getenv(awsSessionTokenEnv)\n\t\tcfg.Credentials = creds\n\t}\n\n\tcfg.ContainerCredentialsEndpoint = os.Getenv(awsContainerCredentialsFullURIEnv)\n\tcfg.ContainerCredentialsRelativePath = os.Getenv(awsContainerCredentialsRelativeURIEnv)\n\tcfg.ContainerAuthorizationToken = os.Getenv(awsContainerAuthorizationTokenEnv)\n\n\tsetStringFromEnvVal(&cfg.Region, regionEnvKeys)\n\tsetStringFromEnvVal(&cfg.SharedConfigProfile, profileEnvKeys)\n\n\tcfg.SharedCredentialsFile = os.Getenv(awsSharedCredentialsFileEnv)\n\tcfg.SharedConfigFile = os.Getenv(awsConfigFileEnv)\n\n\tcfg.CustomCABundle = os.Getenv(awsCABundleEnv)\n\n\tcfg.WebIdentityTokenFilePath = os.Getenv(awsWebIdentityTokenFileEnv)\n\n\tcfg.RoleARN = os.Getenv(awsRoleARNEnv)\n\tcfg.RoleSessionName = os.Getenv(awsRoleSessionNameEnv)\n\n\tcfg.AppID = os.Getenv(awsSdkUaAppIDEnv)\n\n\tif err := setBoolPtrFromEnvVal(&cfg.DisableRequestCompression, []string{awsDisableRequestCompressionEnv}); err != nil {\n\t\treturn cfg, err\n\t}\n\tif err := setInt64PtrFromEnvVal(&cfg.RequestMinCompressSizeBytes, []string{awsRequestMinCompressionSizeBytesEnv}, smithyrequestcompression.MaxRequestMinCompressSizeBytes); err != nil {\n\t\treturn cfg, err\n\t}\n\n\tif err := setEndpointDiscoveryTypeFromEnvVal(&cfg.EnableEndpointDiscovery, []string{awsEnableEndpointDiscoveryEnv}); err != nil {\n\t\treturn cfg, err\n\t}\n\n\tif err := setBoolPtrFromEnvVal(&cfg.S3UseARNRegion, []string{awsS3UseARNRegionEnv}); err != nil {\n\t\treturn cfg, err\n\t}\n\n\tsetEC2IMDSClientEnableState(&cfg.EC2IMDSClientEnableState, []string{awsEc2MetadataDisabledEnv})\n\tif err := setEC2IMDSEndpointMode(&cfg.EC2IMDSEndpointMode, []string{awsEc2MetadataServiceEndpointModeEnv}); err != nil {\n\t\treturn cfg, err\n\t}\n\tcfg.EC2IMDSEndpoint = os.Getenv(awsEc2MetadataServiceEndpointEnv)\n\tif err := setBoolPtrFromEnvVal(&cfg.EC2IMDSv1Disabled, []string{awsEc2MetadataV1DisabledEnv}); err != nil {\n\t\treturn cfg, err\n\t}\n\n\tif err := setBoolPtrFromEnvVal(&cfg.S3DisableMultiRegionAccessPoints, []string{awsS3DisableMultiRegionAccessPointsEnv}); err != nil {\n\t\treturn cfg, err\n\t}\n\n\tif err := setUseDualStackEndpointFromEnvVal(&cfg.UseDualStackEndpoint, []string{awsUseDualStackEndpointEnv}); err != nil {\n\t\treturn cfg, err\n\t}\n\n\tif err := setUseFIPSEndpointFromEnvVal(&cfg.UseFIPSEndpoint, []string{awsUseFIPSEndpointEnv}); err != nil {\n\t\treturn cfg, err\n\t}\n\n\tif err := setDefaultsModeFromEnvVal(&cfg.DefaultsMode, []string{awsDefaultsModeEnv}); err != nil {\n\t\treturn cfg, err\n\t}\n\n\tif err := setIntFromEnvVal(&cfg.RetryMaxAttempts, []string{awsMaxAttemptsEnv}); err != nil {\n\t\treturn cfg, err\n\t}\n\tif err := setRetryModeFromEnvVal(&cfg.RetryMode, []string{awsRetryModeEnv}); err != nil {\n\t\treturn cfg, err\n\t}\n\n\tsetStringFromEnvVal(&cfg.BaseEndpoint, []string{awsEndpointURLEnv})\n\n\tif err := setBoolPtrFromEnvVal(&cfg.IgnoreConfiguredEndpoints, []string{awsIgnoreConfiguredEndpointURLEnv}); err != nil {\n\t\treturn cfg, err\n\t}\n\n\tif err := setBoolPtrFromEnvVal(&cfg.S3DisableExpressAuth, []string{awsS3DisableExpressSessionAuthEnv}); err != nil {\n\t\treturn cfg, err\n\t}\n\n\tif err := setAIDEndPointModeFromEnvVal(&cfg.AccountIDEndpointMode, []string{awsAccountIDEndpointModeEnv}); err != nil {\n\t\treturn cfg, err\n\t}\n\n\tif err := setRequestChecksumCalculationFromEnvVal(&cfg.RequestChecksumCalculation, []string{awsRequestChecksumCalculation}); err != nil {\n\t\treturn cfg, err\n\t}\n\tif err := setResponseChecksumValidationFromEnvVal(&cfg.ResponseChecksumValidation, []string{awsResponseChecksumValidation}); err != nil {\n\t\treturn cfg, err\n\t}\n\n\treturn cfg, nil\n}\n\nfunc (c EnvConfig) getDefaultsMode(ctx context.Context) (aws.DefaultsMode, bool, error) {\n\tif len(c.DefaultsMode) == 0 {\n\t\treturn \"\", false, nil\n\t}\n\treturn c.DefaultsMode, true, nil\n}\n\nfunc (c EnvConfig) getAppID(context.Context) (string, bool, error) {\n\treturn c.AppID, len(c.AppID) > 0, nil\n}\n\nfunc (c EnvConfig) getDisableRequestCompression(context.Context) (bool, bool, error) {\n\tif c.DisableRequestCompression == nil {\n\t\treturn false, false, nil\n\t}\n\treturn *c.DisableRequestCompression, true, nil\n}\n\nfunc (c EnvConfig) getRequestMinCompressSizeBytes(context.Context) (int64, bool, error) {\n\tif c.RequestMinCompressSizeBytes == nil {\n\t\treturn 0, false, nil\n\t}\n\treturn *c.RequestMinCompressSizeBytes, true, nil\n}\n\nfunc (c EnvConfig) getAccountIDEndpointMode(context.Context) (aws.AccountIDEndpointMode, bool, error) {\n\treturn c.AccountIDEndpointMode, len(c.AccountIDEndpointMode) > 0, nil\n}\n\nfunc (c EnvConfig) getRequestChecksumCalculation(context.Context) (aws.RequestChecksumCalculation, bool, error) {\n\treturn c.RequestChecksumCalculation, c.RequestChecksumCalculation > 0, nil\n}\n\nfunc (c EnvConfig) getResponseChecksumValidation(context.Context) (aws.ResponseChecksumValidation, bool, error) {\n\treturn c.ResponseChecksumValidation, c.ResponseChecksumValidation > 0, nil\n}\n\n// GetRetryMaxAttempts returns the value of AWS_MAX_ATTEMPTS if was specified,\n// and not 0.\nfunc (c EnvConfig) GetRetryMaxAttempts(ctx context.Context) (int, bool, error) {\n\tif c.RetryMaxAttempts == 0 {\n\t\treturn 0, false, nil\n\t}\n\treturn c.RetryMaxAttempts, true, nil\n}\n\n// GetRetryMode returns the RetryMode of AWS_RETRY_MODE if was specified, and a\n// valid value.\nfunc (c EnvConfig) GetRetryMode(ctx context.Context) (aws.RetryMode, bool, error) {\n\tif len(c.RetryMode) == 0 {\n\t\treturn \"\", false, nil\n\t}\n\treturn c.RetryMode, true, nil\n}\n\nfunc setEC2IMDSClientEnableState(state *imds.ClientEnableState, keys []string) {\n\tfor _, k := range keys {\n\t\tvalue := os.Getenv(k)\n\t\tif len(value) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(value, \"true\"):\n\t\t\t*state = imds.ClientDisabled\n\t\tcase strings.EqualFold(value, \"false\"):\n\t\t\t*state = imds.ClientEnabled\n\t\tdefault:\n\t\t\tcontinue\n\t\t}\n\t\tbreak\n\t}\n}\n\nfunc setDefaultsModeFromEnvVal(mode *aws.DefaultsMode, keys []string) error {\n\tfor _, k := range keys {\n\t\tif value := os.Getenv(k); len(value) > 0 {\n\t\t\tif ok := mode.SetFromString(value); !ok {\n\t\t\t\treturn fmt.Errorf(\"invalid %s value: %s\", k, value)\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc setRetryModeFromEnvVal(mode *aws.RetryMode, keys []string) (err error) {\n\tfor _, k := range keys {\n\t\tif value := os.Getenv(k); len(value) > 0 {\n\t\t\t*mode, err = aws.ParseRetryMode(value)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"invalid %s value, %w\", k, err)\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc setEC2IMDSEndpointMode(mode *imds.EndpointModeState, keys []string) error {\n\tfor _, k := range keys {\n\t\tvalue := os.Getenv(k)\n\t\tif len(value) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tif err := mode.SetFromString(value); err != nil {\n\t\t\treturn fmt.Errorf(\"invalid value for environment variable, %s=%s, %v\", k, value, err)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc setAIDEndPointModeFromEnvVal(m *aws.AccountIDEndpointMode, keys []string) error {\n\tfor _, k := range keys {\n\t\tvalue := os.Getenv(k)\n\t\tif len(value) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tswitch value {\n\t\tcase \"preferred\":\n\t\t\t*m = aws.AccountIDEndpointModePreferred\n\t\tcase \"required\":\n\t\t\t*m = aws.AccountIDEndpointModeRequired\n\t\tcase \"disabled\":\n\t\t\t*m = aws.AccountIDEndpointModeDisabled\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"invalid value for environment variable, %s=%s, must be preferred/required/disabled\", k, value)\n\t\t}\n\t\tbreak\n\t}\n\treturn nil\n}\n\nfunc setRequestChecksumCalculationFromEnvVal(m *aws.RequestChecksumCalculation, keys []string) error {\n\tfor _, k := range keys {\n\t\tvalue := os.Getenv(k)\n\t\tif len(value) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tswitch strings.ToLower(value) {\n\t\tcase checksumWhenSupported:\n\t\t\t*m = aws.RequestChecksumCalculationWhenSupported\n\t\tcase checksumWhenRequired:\n\t\t\t*m = aws.RequestChecksumCalculationWhenRequired\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"invalid value for environment variable, %s=%s, must be when_supported/when_required\", k, value)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc setResponseChecksumValidationFromEnvVal(m *aws.ResponseChecksumValidation, keys []string) error {\n\tfor _, k := range keys {\n\t\tvalue := os.Getenv(k)\n\t\tif len(value) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tswitch strings.ToLower(value) {\n\t\tcase checksumWhenSupported:\n\t\t\t*m = aws.ResponseChecksumValidationWhenSupported\n\t\tcase checksumWhenRequired:\n\t\t\t*m = aws.ResponseChecksumValidationWhenRequired\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"invalid value for environment variable, %s=%s, must be when_supported/when_required\", k, value)\n\t\t}\n\n\t}\n\treturn nil\n}\n\n// GetRegion returns the AWS Region if set in the environment. Returns an empty\n// string if not set.\nfunc (c EnvConfig) getRegion(ctx context.Context) (string, bool, error) {\n\tif len(c.Region) == 0 {\n\t\treturn \"\", false, nil\n\t}\n\treturn c.Region, true, nil\n}\n\n// GetSharedConfigProfile returns the shared config profile if set in the\n// environment. Returns an empty string if not set.\nfunc (c EnvConfig) getSharedConfigProfile(ctx context.Context) (string, bool, error) {\n\tif len(c.SharedConfigProfile) == 0 {\n\t\treturn \"\", false, nil\n\t}\n\n\treturn c.SharedConfigProfile, true, nil\n}\n\n// getSharedConfigFiles returns a slice of filenames set in the environment.\n//\n// Will return the filenames in the order of:\n// * Shared Config\nfunc (c EnvConfig) getSharedConfigFiles(context.Context) ([]string, bool, error) {\n\tvar files []string\n\tif v := c.SharedConfigFile; len(v) > 0 {\n\t\tfiles = append(files, v)\n\t}\n\n\tif len(files) == 0 {\n\t\treturn nil, false, nil\n\t}\n\treturn files, true, nil\n}\n\n// getSharedCredentialsFiles returns a slice of filenames set in the environment.\n//\n// Will return the filenames in the order of:\n// * Shared Credentials\nfunc (c EnvConfig) getSharedCredentialsFiles(context.Context) ([]string, bool, error) {\n\tvar files []string\n\tif v := c.SharedCredentialsFile; len(v) > 0 {\n\t\tfiles = append(files, v)\n\t}\n\tif len(files) == 0 {\n\t\treturn nil, false, nil\n\t}\n\treturn files, true, nil\n}\n\n// GetCustomCABundle returns the custom CA bundle's PEM bytes if the file was\nfunc (c EnvConfig) getCustomCABundle(context.Context) (io.Reader, bool, error) {\n\tif len(c.CustomCABundle) == 0 {\n\t\treturn nil, false, nil\n\t}\n\n\tb, err := os.ReadFile(c.CustomCABundle)\n\tif err != nil {\n\t\treturn nil, false, err\n\t}\n\treturn bytes.NewReader(b), true, nil\n}\n\n// GetIgnoreConfiguredEndpoints is used in knowing when to disable configured\n// endpoints feature.\nfunc (c EnvConfig) GetIgnoreConfiguredEndpoints(context.Context) (bool, bool, error) {\n\tif c.IgnoreConfiguredEndpoints == nil {\n\t\treturn false, false, nil\n\t}\n\n\treturn *c.IgnoreConfiguredEndpoints, true, nil\n}\n\nfunc (c EnvConfig) getBaseEndpoint(context.Context) (string, bool, error) {\n\treturn c.BaseEndpoint, len(c.BaseEndpoint) > 0, nil\n}\n\n// GetServiceBaseEndpoint is used to retrieve a normalized SDK ID for use\n// with configured endpoints.\nfunc (c EnvConfig) GetServiceBaseEndpoint(ctx context.Context, sdkID string) (string, bool, error) {\n\tif endpt := os.Getenv(fmt.Sprintf(\"%s_%s\", awsEndpointURLEnv, normalizeEnv(sdkID))); endpt != \"\" {\n\t\treturn endpt, true, nil\n\t}\n\treturn \"\", false, nil\n}\n\nfunc normalizeEnv(sdkID string) string {\n\tupper := strings.ToUpper(sdkID)\n\treturn strings.ReplaceAll(upper, \" \", \"_\")\n}\n\n// GetS3UseARNRegion returns whether to allow ARNs to direct the region\n// the S3 client's requests are sent to.\nfunc (c EnvConfig) GetS3UseARNRegion(ctx context.Context) (value, ok bool, err error) {\n\tif c.S3UseARNRegion == nil {\n\t\treturn false, false, nil\n\t}\n\n\treturn *c.S3UseARNRegion, true, nil\n}\n\n// GetS3DisableMultiRegionAccessPoints returns whether to disable multi-region access point\n// support for the S3 client.\nfunc (c EnvConfig) GetS3DisableMultiRegionAccessPoints(ctx context.Context) (value, ok bool, err error) {\n\tif c.S3DisableMultiRegionAccessPoints == nil {\n\t\treturn false, false, nil\n\t}\n\n\treturn *c.S3DisableMultiRegionAccessPoints, true, nil\n}\n\n// GetUseDualStackEndpoint returns whether the service's dual-stack endpoint should be\n// used for requests.\nfunc (c EnvConfig) GetUseDualStackEndpoint(ctx context.Context) (value aws.DualStackEndpointState, found bool, err error) {\n\tif c.UseDualStackEndpoint == aws.DualStackEndpointStateUnset {\n\t\treturn aws.DualStackEndpointStateUnset, false, nil\n\t}\n\n\treturn c.UseDualStackEndpoint, true, nil\n}\n\n// GetUseFIPSEndpoint returns whether the service's FIPS endpoint should be\n// used for requests.\nfunc (c EnvConfig) GetUseFIPSEndpoint(ctx context.Context) (value aws.FIPSEndpointState, found bool, err error) {\n\tif c.UseFIPSEndpoint == aws.FIPSEndpointStateUnset {\n\t\treturn aws.FIPSEndpointStateUnset, false, nil\n\t}\n\n\treturn c.UseFIPSEndpoint, true, nil\n}\n\nfunc setStringFromEnvVal(dst *string, keys []string) {\n\tfor _, k := range keys {\n\t\tif v := os.Getenv(k); len(v) > 0 {\n\t\t\t*dst = v\n\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunc setIntFromEnvVal(dst *int, keys []string) error {\n\tfor _, k := range keys {\n\t\tif v := os.Getenv(k); len(v) > 0 {\n\t\t\ti, err := strconv.ParseInt(v, 10, 64)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"invalid value %s=%s, %w\", k, v, err)\n\t\t\t}\n\t\t\t*dst = int(i)\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc setBoolPtrFromEnvVal(dst **bool, keys []string) error {\n\tfor _, k := range keys {\n\t\tvalue := os.Getenv(k)\n\t\tif len(value) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tif *dst == nil {\n\t\t\t*dst = new(bool)\n\t\t}\n\n\t\tswitch {\n\t\tcase strings.EqualFold(value, \"false\"):\n\t\t\t**dst = false\n\t\tcase strings.EqualFold(value, \"true\"):\n\t\t\t**dst = true\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\n\t\t\t\t\"invalid value for environment variable, %s=%s, need true or false\",\n\t\t\t\tk, value)\n\t\t}\n\t\tbreak\n\t}\n\n\treturn nil\n}\n\nfunc setInt64PtrFromEnvVal(dst **int64, keys []string, max int64) error {\n\tfor _, k := range keys {\n\t\tvalue := os.Getenv(k)\n\t\tif len(value) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tv, err := strconv.ParseInt(value, 10, 64)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"invalid value for env var, %s=%s, need int64\", k, value)\n\t\t} else if v < 0 || v > max {\n\t\t\treturn fmt.Errorf(\"invalid range for env var min request compression size bytes %q, must be within 0 and 10485760 inclusively\", v)\n\t\t}\n\t\tif *dst == nil {\n\t\t\t*dst = new(int64)\n\t\t}\n\n\t\t**dst = v\n\t\tbreak\n\t}\n\n\treturn nil\n}\n\nfunc setEndpointDiscoveryTypeFromEnvVal(dst *aws.EndpointDiscoveryEnableState, keys []string) error {\n\tfor _, k := range keys {\n\t\tvalue := os.Getenv(k)\n\t\tif len(value) == 0 {\n\t\t\tcontinue // skip if empty\n\t\t}\n\n\t\tswitch {\n\t\tcase strings.EqualFold(value, endpointDiscoveryDisabled):\n\t\t\t*dst = aws.EndpointDiscoveryDisabled\n\t\tcase strings.EqualFold(value, endpointDiscoveryEnabled):\n\t\t\t*dst = aws.EndpointDiscoveryEnabled\n\t\tcase strings.EqualFold(value, endpointDiscoveryAuto):\n\t\t\t*dst = aws.EndpointDiscoveryAuto\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\n\t\t\t\t\"invalid value for environment variable, %s=%s, need true, false or auto\",\n\t\t\t\tk, value)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc setUseDualStackEndpointFromEnvVal(dst *aws.DualStackEndpointState, keys []string) error {\n\tfor _, k := range keys {\n\t\tvalue := os.Getenv(k)\n\t\tif len(value) == 0 {\n\t\t\tcontinue // skip if empty\n\t\t}\n\n\t\tswitch {\n\t\tcase strings.EqualFold(value, \"true\"):\n\t\t\t*dst = aws.DualStackEndpointStateEnabled\n\t\tcase strings.EqualFold(value, \"false\"):\n\t\t\t*dst = aws.DualStackEndpointStateDisabled\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\n\t\t\t\t\"invalid value for environment variable, %s=%s, need true, false\",\n\t\t\t\tk, value)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc setUseFIPSEndpointFromEnvVal(dst *aws.FIPSEndpointState, keys []string) error {\n\tfor _, k := range keys {\n\t\tvalue := os.Getenv(k)\n\t\tif len(value) == 0 {\n\t\t\tcontinue // skip if empty\n\t\t}\n\n\t\tswitch {\n\t\tcase strings.EqualFold(value, \"true\"):\n\t\t\t*dst = aws.FIPSEndpointStateEnabled\n\t\tcase strings.EqualFold(value, \"false\"):\n\t\t\t*dst = aws.FIPSEndpointStateDisabled\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\n\t\t\t\t\"invalid value for environment variable, %s=%s, need true, false\",\n\t\t\t\tk, value)\n\t\t}\n\t}\n\treturn nil\n}\n\n// GetEnableEndpointDiscovery returns resolved value for EnableEndpointDiscovery env variable setting.\nfunc (c EnvConfig) GetEnableEndpointDiscovery(ctx context.Context) (value aws.EndpointDiscoveryEnableState, found bool, err error) {\n\tif c.EnableEndpointDiscovery == aws.EndpointDiscoveryUnset {\n\t\treturn aws.EndpointDiscoveryUnset, false, nil\n\t}\n\n\treturn c.EnableEndpointDiscovery, true, nil\n}\n\n// GetEC2IMDSClientEnableState implements a EC2IMDSClientEnableState options resolver interface.\nfunc (c EnvConfig) GetEC2IMDSClientEnableState() (imds.ClientEnableState, bool, error) {\n\tif c.EC2IMDSClientEnableState == imds.ClientDefaultEnableState {\n\t\treturn imds.ClientDefaultEnableState, false, nil\n\t}\n\n\treturn c.EC2IMDSClientEnableState, true, nil\n}\n\n// GetEC2IMDSEndpointMode implements a EC2IMDSEndpointMode option resolver interface.\nfunc (c EnvConfig) GetEC2IMDSEndpointMode() (imds.EndpointModeState, bool, error) {\n\tif c.EC2IMDSEndpointMode == imds.EndpointModeStateUnset {\n\t\treturn imds.EndpointModeStateUnset, false, nil\n\t}\n\n\treturn c.EC2IMDSEndpointMode, true, nil\n}\n\n// GetEC2IMDSEndpoint implements a EC2IMDSEndpoint option resolver interface.\nfunc (c EnvConfig) GetEC2IMDSEndpoint() (string, bool, error) {\n\tif len(c.EC2IMDSEndpoint) == 0 {\n\t\treturn \"\", false, nil\n\t}\n\n\treturn c.EC2IMDSEndpoint, true, nil\n}\n\n// GetEC2IMDSV1FallbackDisabled implements an EC2IMDSV1FallbackDisabled option\n// resolver interface.\nfunc (c EnvConfig) GetEC2IMDSV1FallbackDisabled() (bool, bool) {\n\tif c.EC2IMDSv1Disabled == nil {\n\t\treturn false, false\n\t}\n\n\treturn *c.EC2IMDSv1Disabled, true\n}\n\n// GetS3DisableExpressAuth returns the configured value for\n// [EnvConfig.S3DisableExpressAuth].\nfunc (c EnvConfig) GetS3DisableExpressAuth() (value, ok bool) {\n\tif c.S3DisableExpressAuth == nil {\n\t\treturn false, false\n\t}\n\n\treturn *c.S3DisableExpressAuth, true\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/config/generate.go",
    "content": "package config\n\n//go:generate go run -tags codegen ./codegen -output=provider_assert_test.go\n//go:generate gofmt -s -w ./\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go",
    "content": "// Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT.\n\npackage config\n\n// goModuleVersion is the tagged release for this module\nconst goModuleVersion = \"1.29.14\"\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/config/load_options.go",
    "content": "package config\n\nimport (\n\t\"context\"\n\t\"io\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials/endpointcreds\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials/processcreds\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials/ssocreds\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials/stscreds\"\n\t\"github.com/aws/aws-sdk-go-v2/feature/ec2/imds\"\n\tsmithybearer \"github.com/aws/smithy-go/auth/bearer\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\n// LoadOptionsFunc is a type alias for LoadOptions functional option\ntype LoadOptionsFunc func(*LoadOptions) error\n\n// LoadOptions are discrete set of options that are valid for loading the\n// configuration\ntype LoadOptions struct {\n\n\t// Region is the region to send requests to.\n\tRegion string\n\n\t// Credentials object to use when signing requests.\n\tCredentials aws.CredentialsProvider\n\n\t// Token provider for authentication operations with bearer authentication.\n\tBearerAuthTokenProvider smithybearer.TokenProvider\n\n\t// HTTPClient the SDK's API clients will use to invoke HTTP requests.\n\tHTTPClient HTTPClient\n\n\t// EndpointResolver that can be used to provide or override an endpoint for\n\t// the given service and region.\n\t//\n\t// See the `aws.EndpointResolver` documentation on usage.\n\t//\n\t// Deprecated: See EndpointResolverWithOptions\n\tEndpointResolver aws.EndpointResolver\n\n\t// EndpointResolverWithOptions that can be used to provide or override an\n\t// endpoint for the given service and region.\n\t//\n\t// See the `aws.EndpointResolverWithOptions` documentation on usage.\n\tEndpointResolverWithOptions aws.EndpointResolverWithOptions\n\n\t// RetryMaxAttempts specifies the maximum number attempts an API client\n\t// will call an operation that fails with a retryable error.\n\t//\n\t// This value will only be used if Retryer option is nil.\n\tRetryMaxAttempts int\n\n\t// RetryMode specifies the retry model the API client will be created with.\n\t//\n\t// This value will only be used if Retryer option is nil.\n\tRetryMode aws.RetryMode\n\n\t// Retryer is a function that provides a Retryer implementation. A Retryer\n\t// guides how HTTP requests should be retried in case of recoverable\n\t// failures.\n\t//\n\t// If not nil, RetryMaxAttempts, and RetryMode will be ignored.\n\tRetryer func() aws.Retryer\n\n\t// APIOptions provides the set of middleware mutations modify how the API\n\t// client requests will be handled. This is useful for adding additional\n\t// tracing data to a request, or changing behavior of the SDK's client.\n\tAPIOptions []func(*middleware.Stack) error\n\n\t// Logger writer interface to write logging messages to.\n\tLogger logging.Logger\n\n\t// ClientLogMode is used to configure the events that will be sent to the\n\t// configured logger. This can be used to configure the logging of signing,\n\t// retries, request, and responses of the SDK clients.\n\t//\n\t// See the ClientLogMode type documentation for the complete set of logging\n\t// modes and available configuration.\n\tClientLogMode *aws.ClientLogMode\n\n\t// SharedConfigProfile is the profile to be used when loading the SharedConfig\n\tSharedConfigProfile string\n\n\t// SharedConfigFiles is the slice of custom shared config files to use when\n\t// loading the SharedConfig. A non-default profile used within config file\n\t// must have name defined with prefix 'profile '. eg [profile xyz]\n\t// indicates a profile with name 'xyz'. To read more on the format of the\n\t// config file, please refer the documentation at\n\t// https://docs.aws.amazon.com/credref/latest/refdocs/file-format.html#file-format-config\n\t//\n\t// If duplicate profiles are provided within the same, or across multiple\n\t// shared config files, the next parsed profile will override only the\n\t// properties that conflict with the previously defined profile. Note that\n\t// if duplicate profiles are provided within the SharedCredentialsFiles and\n\t// SharedConfigFiles, the properties defined in shared credentials file\n\t// take precedence.\n\tSharedConfigFiles []string\n\n\t// SharedCredentialsFile is the slice of custom shared credentials files to\n\t// use when loading the SharedConfig. The profile name used within\n\t// credentials file must not prefix 'profile '. eg [xyz] indicates a\n\t// profile with name 'xyz'. Profile declared as [profile xyz] will be\n\t// ignored. To read more on the format of the credentials file, please\n\t// refer the documentation at\n\t// https://docs.aws.amazon.com/credref/latest/refdocs/file-format.html#file-format-creds\n\t//\n\t// If duplicate profiles are provided with a same, or across multiple\n\t// shared credentials files, the next parsed profile will override only\n\t// properties that conflict with the previously defined profile. Note that\n\t// if duplicate profiles are provided within the SharedCredentialsFiles and\n\t// SharedConfigFiles, the properties defined in shared credentials file\n\t// take precedence.\n\tSharedCredentialsFiles []string\n\n\t// CustomCABundle is CA bundle PEM bytes reader\n\tCustomCABundle io.Reader\n\n\t// DefaultRegion is the fall back region, used if a region was not resolved\n\t// from other sources\n\tDefaultRegion string\n\n\t// UseEC2IMDSRegion indicates if SDK should retrieve the region\n\t// from the EC2 Metadata service\n\tUseEC2IMDSRegion *UseEC2IMDSRegion\n\n\t// CredentialsCacheOptions is a function for setting the\n\t// aws.CredentialsCacheOptions\n\tCredentialsCacheOptions func(*aws.CredentialsCacheOptions)\n\n\t// BearerAuthTokenCacheOptions is a function for setting the smithy-go\n\t// auth/bearer#TokenCacheOptions\n\tBearerAuthTokenCacheOptions func(*smithybearer.TokenCacheOptions)\n\n\t// SSOTokenProviderOptions is a function for setting the\n\t// credentials/ssocreds.SSOTokenProviderOptions\n\tSSOTokenProviderOptions func(*ssocreds.SSOTokenProviderOptions)\n\n\t// ProcessCredentialOptions is a function for setting\n\t// the processcreds.Options\n\tProcessCredentialOptions func(*processcreds.Options)\n\n\t// EC2RoleCredentialOptions is a function for setting\n\t// the ec2rolecreds.Options\n\tEC2RoleCredentialOptions func(*ec2rolecreds.Options)\n\n\t// EndpointCredentialOptions is a function for setting\n\t// the endpointcreds.Options\n\tEndpointCredentialOptions func(*endpointcreds.Options)\n\n\t// WebIdentityRoleCredentialOptions is a function for setting\n\t// the stscreds.WebIdentityRoleOptions\n\tWebIdentityRoleCredentialOptions func(*stscreds.WebIdentityRoleOptions)\n\n\t// AssumeRoleCredentialOptions is a function for setting the\n\t// stscreds.AssumeRoleOptions\n\tAssumeRoleCredentialOptions func(*stscreds.AssumeRoleOptions)\n\n\t// SSOProviderOptions is a function for setting\n\t// the ssocreds.Options\n\tSSOProviderOptions func(options *ssocreds.Options)\n\n\t// LogConfigurationWarnings when set to true, enables logging\n\t// configuration warnings\n\tLogConfigurationWarnings *bool\n\n\t// S3UseARNRegion specifies if the S3 service should allow ARNs to direct\n\t// the region, the client's requests are sent to.\n\tS3UseARNRegion *bool\n\n\t// S3DisableMultiRegionAccessPoints specifies if the S3 service should disable\n\t// the S3 Multi-Region access points feature.\n\tS3DisableMultiRegionAccessPoints *bool\n\n\t// EnableEndpointDiscovery specifies if endpoint discovery is enable for\n\t// the client.\n\tEnableEndpointDiscovery aws.EndpointDiscoveryEnableState\n\n\t// Specifies if the EC2 IMDS service client is enabled.\n\t//\n\t// AWS_EC2_METADATA_DISABLED=true\n\tEC2IMDSClientEnableState imds.ClientEnableState\n\n\t// Specifies the EC2 Instance Metadata Service default endpoint selection\n\t// mode (IPv4 or IPv6)\n\tEC2IMDSEndpointMode imds.EndpointModeState\n\n\t// Specifies the EC2 Instance Metadata Service endpoint to use. If\n\t// specified it overrides EC2IMDSEndpointMode.\n\tEC2IMDSEndpoint string\n\n\t// Specifies that SDK clients must resolve a dual-stack endpoint for\n\t// services.\n\tUseDualStackEndpoint aws.DualStackEndpointState\n\n\t// Specifies that SDK clients must resolve a FIPS endpoint for\n\t// services.\n\tUseFIPSEndpoint aws.FIPSEndpointState\n\n\t// Specifies the SDK configuration mode for defaults.\n\tDefaultsModeOptions DefaultsModeOptions\n\n\t// The sdk app ID retrieved from env var or shared config to be added to request user agent header\n\tAppID string\n\n\t// Specifies whether an operation request could be compressed\n\tDisableRequestCompression *bool\n\n\t// The inclusive min bytes of a request body that could be compressed\n\tRequestMinCompressSizeBytes *int64\n\n\t// Whether S3 Express auth is disabled.\n\tS3DisableExpressAuth *bool\n\n\t// Whether account id should be built into endpoint resolution\n\tAccountIDEndpointMode aws.AccountIDEndpointMode\n\n\t// Specify if request checksum should be calculated\n\tRequestChecksumCalculation aws.RequestChecksumCalculation\n\n\t// Specifies if response checksum should be validated\n\tResponseChecksumValidation aws.ResponseChecksumValidation\n\n\t// Service endpoint override. This value is not necessarily final and is\n\t// passed to the service's EndpointResolverV2 for further delegation.\n\tBaseEndpoint string\n}\n\nfunc (o LoadOptions) getDefaultsMode(ctx context.Context) (aws.DefaultsMode, bool, error) {\n\tif len(o.DefaultsModeOptions.Mode) == 0 {\n\t\treturn \"\", false, nil\n\t}\n\treturn o.DefaultsModeOptions.Mode, true, nil\n}\n\n// GetRetryMaxAttempts returns the RetryMaxAttempts if specified in the\n// LoadOptions and not 0.\nfunc (o LoadOptions) GetRetryMaxAttempts(ctx context.Context) (int, bool, error) {\n\tif o.RetryMaxAttempts == 0 {\n\t\treturn 0, false, nil\n\t}\n\treturn o.RetryMaxAttempts, true, nil\n}\n\n// GetRetryMode returns the RetryMode specified in the LoadOptions.\nfunc (o LoadOptions) GetRetryMode(ctx context.Context) (aws.RetryMode, bool, error) {\n\tif len(o.RetryMode) == 0 {\n\t\treturn \"\", false, nil\n\t}\n\treturn o.RetryMode, true, nil\n}\n\nfunc (o LoadOptions) getDefaultsModeIMDSClient(ctx context.Context) (*imds.Client, bool, error) {\n\tif o.DefaultsModeOptions.IMDSClient == nil {\n\t\treturn nil, false, nil\n\t}\n\treturn o.DefaultsModeOptions.IMDSClient, true, nil\n}\n\n// getRegion returns Region from config's LoadOptions\nfunc (o LoadOptions) getRegion(ctx context.Context) (string, bool, error) {\n\tif len(o.Region) == 0 {\n\t\treturn \"\", false, nil\n\t}\n\n\treturn o.Region, true, nil\n}\n\n// getAppID returns AppID from config's LoadOptions\nfunc (o LoadOptions) getAppID(ctx context.Context) (string, bool, error) {\n\treturn o.AppID, len(o.AppID) > 0, nil\n}\n\n// getDisableRequestCompression returns DisableRequestCompression from config's LoadOptions\nfunc (o LoadOptions) getDisableRequestCompression(ctx context.Context) (bool, bool, error) {\n\tif o.DisableRequestCompression == nil {\n\t\treturn false, false, nil\n\t}\n\treturn *o.DisableRequestCompression, true, nil\n}\n\n// getRequestMinCompressSizeBytes returns RequestMinCompressSizeBytes from config's LoadOptions\nfunc (o LoadOptions) getRequestMinCompressSizeBytes(ctx context.Context) (int64, bool, error) {\n\tif o.RequestMinCompressSizeBytes == nil {\n\t\treturn 0, false, nil\n\t}\n\treturn *o.RequestMinCompressSizeBytes, true, nil\n}\n\nfunc (o LoadOptions) getAccountIDEndpointMode(ctx context.Context) (aws.AccountIDEndpointMode, bool, error) {\n\treturn o.AccountIDEndpointMode, len(o.AccountIDEndpointMode) > 0, nil\n}\n\nfunc (o LoadOptions) getRequestChecksumCalculation(ctx context.Context) (aws.RequestChecksumCalculation, bool, error) {\n\treturn o.RequestChecksumCalculation, o.RequestChecksumCalculation > 0, nil\n}\n\nfunc (o LoadOptions) getResponseChecksumValidation(ctx context.Context) (aws.ResponseChecksumValidation, bool, error) {\n\treturn o.ResponseChecksumValidation, o.ResponseChecksumValidation > 0, nil\n}\n\nfunc (o LoadOptions) getBaseEndpoint(context.Context) (string, bool, error) {\n\treturn o.BaseEndpoint, o.BaseEndpoint != \"\", nil\n}\n\n// GetServiceBaseEndpoint satisfies (internal/configsources).ServiceBaseEndpointProvider.\n//\n// The sdkID value is unused because LoadOptions only supports setting a GLOBAL\n// endpoint override. In-code, per-service endpoint overrides are performed via\n// functional options in service client space.\nfunc (o LoadOptions) GetServiceBaseEndpoint(context.Context, string) (string, bool, error) {\n\treturn o.BaseEndpoint, o.BaseEndpoint != \"\", nil\n}\n\n// WithRegion is a helper function to construct functional options\n// that sets Region on config's LoadOptions. Setting the region to\n// an empty string, will result in the region value being ignored.\n// If multiple WithRegion calls are made, the last call overrides\n// the previous call values.\nfunc WithRegion(v string) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.Region = v\n\t\treturn nil\n\t}\n}\n\n// WithAppID is a helper function to construct functional options\n// that sets AppID on config's LoadOptions.\nfunc WithAppID(ID string) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.AppID = ID\n\t\treturn nil\n\t}\n}\n\n// WithDisableRequestCompression is a helper function to construct functional options\n// that sets DisableRequestCompression on config's LoadOptions.\nfunc WithDisableRequestCompression(DisableRequestCompression *bool) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\tif DisableRequestCompression == nil {\n\t\t\treturn nil\n\t\t}\n\t\to.DisableRequestCompression = DisableRequestCompression\n\t\treturn nil\n\t}\n}\n\n// WithRequestMinCompressSizeBytes is a helper function to construct functional options\n// that sets RequestMinCompressSizeBytes on config's LoadOptions.\nfunc WithRequestMinCompressSizeBytes(RequestMinCompressSizeBytes *int64) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\tif RequestMinCompressSizeBytes == nil {\n\t\t\treturn nil\n\t\t}\n\t\to.RequestMinCompressSizeBytes = RequestMinCompressSizeBytes\n\t\treturn nil\n\t}\n}\n\n// WithAccountIDEndpointMode is a helper function to construct functional options\n// that sets AccountIDEndpointMode on config's LoadOptions\nfunc WithAccountIDEndpointMode(m aws.AccountIDEndpointMode) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\tif m != \"\" {\n\t\t\to.AccountIDEndpointMode = m\n\t\t}\n\t\treturn nil\n\t}\n}\n\n// WithRequestChecksumCalculation is a helper function to construct functional options\n// that sets RequestChecksumCalculation on config's LoadOptions\nfunc WithRequestChecksumCalculation(c aws.RequestChecksumCalculation) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\tif c > 0 {\n\t\t\to.RequestChecksumCalculation = c\n\t\t}\n\t\treturn nil\n\t}\n}\n\n// WithResponseChecksumValidation is a helper function to construct functional options\n// that sets ResponseChecksumValidation on config's LoadOptions\nfunc WithResponseChecksumValidation(v aws.ResponseChecksumValidation) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.ResponseChecksumValidation = v\n\t\treturn nil\n\t}\n}\n\n// getDefaultRegion returns DefaultRegion from config's LoadOptions\nfunc (o LoadOptions) getDefaultRegion(ctx context.Context) (string, bool, error) {\n\tif len(o.DefaultRegion) == 0 {\n\t\treturn \"\", false, nil\n\t}\n\n\treturn o.DefaultRegion, true, nil\n}\n\n// WithDefaultRegion is a helper function to construct functional options\n// that sets a DefaultRegion on config's LoadOptions. Setting the default\n// region to an empty string, will result in the default region value\n// being ignored. If multiple WithDefaultRegion calls are made, the last\n// call overrides the previous call values. Note that both WithRegion and\n// WithEC2IMDSRegion call takes precedence over WithDefaultRegion call\n// when resolving region.\nfunc WithDefaultRegion(v string) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.DefaultRegion = v\n\t\treturn nil\n\t}\n}\n\n// getSharedConfigProfile returns SharedConfigProfile from config's LoadOptions\nfunc (o LoadOptions) getSharedConfigProfile(ctx context.Context) (string, bool, error) {\n\tif len(o.SharedConfigProfile) == 0 {\n\t\treturn \"\", false, nil\n\t}\n\n\treturn o.SharedConfigProfile, true, nil\n}\n\n// WithSharedConfigProfile is a helper function to construct functional options\n// that sets SharedConfigProfile on config's LoadOptions. Setting the shared\n// config profile to an empty string, will result in the shared config profile\n// value being ignored.\n// If multiple WithSharedConfigProfile calls are made, the last call overrides\n// the previous call values.\nfunc WithSharedConfigProfile(v string) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.SharedConfigProfile = v\n\t\treturn nil\n\t}\n}\n\n// getSharedConfigFiles returns SharedConfigFiles set on config's LoadOptions\nfunc (o LoadOptions) getSharedConfigFiles(ctx context.Context) ([]string, bool, error) {\n\tif o.SharedConfigFiles == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.SharedConfigFiles, true, nil\n}\n\n// WithSharedConfigFiles is a helper function to construct functional options\n// that sets slice of SharedConfigFiles on config's LoadOptions.\n// Setting the shared config files to an nil string slice, will result in the\n// shared config files value being ignored.\n// If multiple WithSharedConfigFiles calls are made, the last call overrides\n// the previous call values.\nfunc WithSharedConfigFiles(v []string) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.SharedConfigFiles = v\n\t\treturn nil\n\t}\n}\n\n// getSharedCredentialsFiles returns SharedCredentialsFiles set on config's LoadOptions\nfunc (o LoadOptions) getSharedCredentialsFiles(ctx context.Context) ([]string, bool, error) {\n\tif o.SharedCredentialsFiles == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.SharedCredentialsFiles, true, nil\n}\n\n// WithSharedCredentialsFiles is a helper function to construct functional options\n// that sets slice of SharedCredentialsFiles on config's LoadOptions.\n// Setting the shared credentials files to an nil string slice, will result in the\n// shared credentials files value being ignored.\n// If multiple WithSharedCredentialsFiles calls are made, the last call overrides\n// the previous call values.\nfunc WithSharedCredentialsFiles(v []string) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.SharedCredentialsFiles = v\n\t\treturn nil\n\t}\n}\n\n// getCustomCABundle returns CustomCABundle from LoadOptions\nfunc (o LoadOptions) getCustomCABundle(ctx context.Context) (io.Reader, bool, error) {\n\tif o.CustomCABundle == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.CustomCABundle, true, nil\n}\n\n// WithCustomCABundle is a helper function to construct functional options\n// that sets CustomCABundle on config's LoadOptions. Setting the custom CA Bundle\n// to nil will result in custom CA Bundle value being ignored.\n// If multiple WithCustomCABundle calls are made, the last call overrides the\n// previous call values.\nfunc WithCustomCABundle(v io.Reader) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.CustomCABundle = v\n\t\treturn nil\n\t}\n}\n\n// UseEC2IMDSRegion provides a regionProvider that retrieves the region\n// from the EC2 Metadata service.\ntype UseEC2IMDSRegion struct {\n\t// If unset will default to generic EC2 IMDS client.\n\tClient *imds.Client\n}\n\n// getRegion attempts to retrieve the region from EC2 Metadata service.\nfunc (p *UseEC2IMDSRegion) getRegion(ctx context.Context) (string, bool, error) {\n\tif ctx == nil {\n\t\tctx = context.Background()\n\t}\n\n\tclient := p.Client\n\tif client == nil {\n\t\tclient = imds.New(imds.Options{})\n\t}\n\n\tresult, err := client.GetRegion(ctx, nil)\n\tif err != nil {\n\t\treturn \"\", false, err\n\t}\n\tif len(result.Region) != 0 {\n\t\treturn result.Region, true, nil\n\t}\n\treturn \"\", false, nil\n}\n\n// getEC2IMDSRegion returns the value of EC2 IMDS region.\nfunc (o LoadOptions) getEC2IMDSRegion(ctx context.Context) (string, bool, error) {\n\tif o.UseEC2IMDSRegion == nil {\n\t\treturn \"\", false, nil\n\t}\n\n\treturn o.UseEC2IMDSRegion.getRegion(ctx)\n}\n\n// WithEC2IMDSRegion is a helper function to construct functional options\n// that enables resolving EC2IMDS region. The function takes\n// in a UseEC2IMDSRegion functional option, and can be used to set the\n// EC2IMDS client which will be used to resolve EC2IMDSRegion.\n// If no functional option is provided, an EC2IMDS client is built and used\n// by the resolver. If multiple WithEC2IMDSRegion calls are made, the last\n// call overrides the previous call values. Note that the WithRegion calls takes\n// precedence over WithEC2IMDSRegion when resolving region.\nfunc WithEC2IMDSRegion(fnOpts ...func(o *UseEC2IMDSRegion)) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.UseEC2IMDSRegion = &UseEC2IMDSRegion{}\n\n\t\tfor _, fn := range fnOpts {\n\t\t\tfn(o.UseEC2IMDSRegion)\n\t\t}\n\t\treturn nil\n\t}\n}\n\n// getCredentialsProvider returns the credentials value\nfunc (o LoadOptions) getCredentialsProvider(ctx context.Context) (aws.CredentialsProvider, bool, error) {\n\tif o.Credentials == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.Credentials, true, nil\n}\n\n// WithCredentialsProvider is a helper function to construct functional options\n// that sets Credential provider value on config's LoadOptions. If credentials\n// provider is set to nil, the credentials provider value will be ignored.\n// If multiple WithCredentialsProvider calls are made, the last call overrides\n// the previous call values.\nfunc WithCredentialsProvider(v aws.CredentialsProvider) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.Credentials = v\n\t\treturn nil\n\t}\n}\n\n// getCredentialsCacheOptionsProvider returns the wrapped function to set aws.CredentialsCacheOptions\nfunc (o LoadOptions) getCredentialsCacheOptions(ctx context.Context) (func(*aws.CredentialsCacheOptions), bool, error) {\n\tif o.CredentialsCacheOptions == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.CredentialsCacheOptions, true, nil\n}\n\n// WithCredentialsCacheOptions is a helper function to construct functional\n// options that sets a function to modify the aws.CredentialsCacheOptions the\n// aws.CredentialsCache will be configured with, if the CredentialsCache is used\n// by the configuration loader.\n//\n// If multiple WithCredentialsCacheOptions calls are made, the last call\n// overrides the previous call values.\nfunc WithCredentialsCacheOptions(v func(*aws.CredentialsCacheOptions)) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.CredentialsCacheOptions = v\n\t\treturn nil\n\t}\n}\n\n// getBearerAuthTokenProvider returns the credentials value\nfunc (o LoadOptions) getBearerAuthTokenProvider(ctx context.Context) (smithybearer.TokenProvider, bool, error) {\n\tif o.BearerAuthTokenProvider == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.BearerAuthTokenProvider, true, nil\n}\n\n// WithBearerAuthTokenProvider is a helper function to construct functional options\n// that sets Credential provider value on config's LoadOptions. If credentials\n// provider is set to nil, the credentials provider value will be ignored.\n// If multiple WithBearerAuthTokenProvider calls are made, the last call overrides\n// the previous call values.\nfunc WithBearerAuthTokenProvider(v smithybearer.TokenProvider) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.BearerAuthTokenProvider = v\n\t\treturn nil\n\t}\n}\n\n// getBearerAuthTokenCacheOptionsProvider returns the wrapped function to set smithybearer.TokenCacheOptions\nfunc (o LoadOptions) getBearerAuthTokenCacheOptions(ctx context.Context) (func(*smithybearer.TokenCacheOptions), bool, error) {\n\tif o.BearerAuthTokenCacheOptions == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.BearerAuthTokenCacheOptions, true, nil\n}\n\n// WithBearerAuthTokenCacheOptions is a helper function to construct functional options\n// that sets a function to modify the TokenCacheOptions the smithy-go\n// auth/bearer#TokenCache will be configured with, if the TokenCache is used by\n// the configuration loader.\n//\n// If multiple WithBearerAuthTokenCacheOptions calls are made, the last call overrides\n// the previous call values.\nfunc WithBearerAuthTokenCacheOptions(v func(*smithybearer.TokenCacheOptions)) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.BearerAuthTokenCacheOptions = v\n\t\treturn nil\n\t}\n}\n\n// getSSOTokenProviderOptionsProvider returns the wrapped function to set smithybearer.TokenCacheOptions\nfunc (o LoadOptions) getSSOTokenProviderOptions(ctx context.Context) (func(*ssocreds.SSOTokenProviderOptions), bool, error) {\n\tif o.SSOTokenProviderOptions == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.SSOTokenProviderOptions, true, nil\n}\n\n// WithSSOTokenProviderOptions is a helper function to construct functional\n// options that sets a function to modify the SSOtokenProviderOptions the SDK's\n// credentials/ssocreds#SSOProvider will be configured with, if the\n// SSOTokenProvider is used by the configuration loader.\n//\n// If multiple WithSSOTokenProviderOptions calls are made, the last call overrides\n// the previous call values.\nfunc WithSSOTokenProviderOptions(v func(*ssocreds.SSOTokenProviderOptions)) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.SSOTokenProviderOptions = v\n\t\treturn nil\n\t}\n}\n\n// getProcessCredentialOptions returns the wrapped function to set processcreds.Options\nfunc (o LoadOptions) getProcessCredentialOptions(ctx context.Context) (func(*processcreds.Options), bool, error) {\n\tif o.ProcessCredentialOptions == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.ProcessCredentialOptions, true, nil\n}\n\n// WithProcessCredentialOptions is a helper function to construct functional options\n// that sets a function to use processcreds.Options on config's LoadOptions.\n// If process credential options is set to nil, the process credential value will\n// be ignored. If multiple WithProcessCredentialOptions calls are made, the last call\n// overrides the previous call values.\nfunc WithProcessCredentialOptions(v func(*processcreds.Options)) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.ProcessCredentialOptions = v\n\t\treturn nil\n\t}\n}\n\n// getEC2RoleCredentialOptions returns the wrapped function to set the ec2rolecreds.Options\nfunc (o LoadOptions) getEC2RoleCredentialOptions(ctx context.Context) (func(*ec2rolecreds.Options), bool, error) {\n\tif o.EC2RoleCredentialOptions == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.EC2RoleCredentialOptions, true, nil\n}\n\n// WithEC2RoleCredentialOptions is a helper function to construct functional options\n// that sets a function to use ec2rolecreds.Options on config's LoadOptions. If\n// EC2 role credential options is set to nil, the EC2 role credential options value\n// will be ignored. If multiple WithEC2RoleCredentialOptions calls are made,\n// the last call overrides the previous call values.\nfunc WithEC2RoleCredentialOptions(v func(*ec2rolecreds.Options)) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.EC2RoleCredentialOptions = v\n\t\treturn nil\n\t}\n}\n\n// getEndpointCredentialOptions returns the wrapped function to set endpointcreds.Options\nfunc (o LoadOptions) getEndpointCredentialOptions(context.Context) (func(*endpointcreds.Options), bool, error) {\n\tif o.EndpointCredentialOptions == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.EndpointCredentialOptions, true, nil\n}\n\n// WithEndpointCredentialOptions is a helper function to construct functional options\n// that sets a function to use endpointcreds.Options on config's LoadOptions. If\n// endpoint credential options is set to nil, the endpoint credential options\n// value will be ignored. If multiple WithEndpointCredentialOptions calls are made,\n// the last call overrides the previous call values.\nfunc WithEndpointCredentialOptions(v func(*endpointcreds.Options)) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.EndpointCredentialOptions = v\n\t\treturn nil\n\t}\n}\n\n// getWebIdentityRoleCredentialOptions returns the wrapped function\nfunc (o LoadOptions) getWebIdentityRoleCredentialOptions(context.Context) (func(*stscreds.WebIdentityRoleOptions), bool, error) {\n\tif o.WebIdentityRoleCredentialOptions == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.WebIdentityRoleCredentialOptions, true, nil\n}\n\n// WithWebIdentityRoleCredentialOptions is a helper function to construct\n// functional options that sets a function to use stscreds.WebIdentityRoleOptions\n// on config's LoadOptions. If web identity role credentials options is set to nil,\n// the web identity role credentials value will be ignored. If multiple\n// WithWebIdentityRoleCredentialOptions calls are made, the last call\n// overrides the previous call values.\nfunc WithWebIdentityRoleCredentialOptions(v func(*stscreds.WebIdentityRoleOptions)) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.WebIdentityRoleCredentialOptions = v\n\t\treturn nil\n\t}\n}\n\n// getAssumeRoleCredentialOptions returns AssumeRoleCredentialOptions from LoadOptions\nfunc (o LoadOptions) getAssumeRoleCredentialOptions(context.Context) (func(options *stscreds.AssumeRoleOptions), bool, error) {\n\tif o.AssumeRoleCredentialOptions == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.AssumeRoleCredentialOptions, true, nil\n}\n\n// WithAssumeRoleCredentialOptions  is a helper function to construct\n// functional options that sets a function to use stscreds.AssumeRoleOptions\n// on config's LoadOptions. If assume role credentials options is set to nil,\n// the assume role credentials value will be ignored. If multiple\n// WithAssumeRoleCredentialOptions calls are made, the last call overrides\n// the previous call values.\nfunc WithAssumeRoleCredentialOptions(v func(*stscreds.AssumeRoleOptions)) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.AssumeRoleCredentialOptions = v\n\t\treturn nil\n\t}\n}\n\nfunc (o LoadOptions) getHTTPClient(ctx context.Context) (HTTPClient, bool, error) {\n\tif o.HTTPClient == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.HTTPClient, true, nil\n}\n\n// WithHTTPClient is a helper function to construct functional options\n// that sets HTTPClient on LoadOptions. If HTTPClient is set to nil,\n// the HTTPClient value will be ignored.\n// If multiple WithHTTPClient calls are made, the last call overrides\n// the previous call values.\nfunc WithHTTPClient(v HTTPClient) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.HTTPClient = v\n\t\treturn nil\n\t}\n}\n\nfunc (o LoadOptions) getAPIOptions(ctx context.Context) ([]func(*middleware.Stack) error, bool, error) {\n\tif o.APIOptions == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.APIOptions, true, nil\n}\n\n// WithAPIOptions is a helper function to construct functional options\n// that sets APIOptions on LoadOptions. If APIOptions is set to nil, the\n// APIOptions value is ignored. If multiple WithAPIOptions calls are\n// made, the last call overrides the previous call values.\nfunc WithAPIOptions(v []func(*middleware.Stack) error) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\tif v == nil {\n\t\t\treturn nil\n\t\t}\n\n\t\to.APIOptions = append(o.APIOptions, v...)\n\t\treturn nil\n\t}\n}\n\nfunc (o LoadOptions) getRetryMaxAttempts(ctx context.Context) (int, bool, error) {\n\tif o.RetryMaxAttempts == 0 {\n\t\treturn 0, false, nil\n\t}\n\n\treturn o.RetryMaxAttempts, true, nil\n}\n\n// WithRetryMaxAttempts is a helper function to construct functional options that sets\n// RetryMaxAttempts on LoadOptions. If RetryMaxAttempts is unset, the RetryMaxAttempts value is\n// ignored. If multiple WithRetryMaxAttempts calls are made, the last call overrides\n// the previous call values.\n//\n// Will be ignored of LoadOptions.Retryer or WithRetryer are used.\nfunc WithRetryMaxAttempts(v int) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.RetryMaxAttempts = v\n\t\treturn nil\n\t}\n}\n\nfunc (o LoadOptions) getRetryMode(ctx context.Context) (aws.RetryMode, bool, error) {\n\tif o.RetryMode == \"\" {\n\t\treturn \"\", false, nil\n\t}\n\n\treturn o.RetryMode, true, nil\n}\n\n// WithRetryMode is a helper function to construct functional options that sets\n// RetryMode on LoadOptions. If RetryMode is unset, the RetryMode value is\n// ignored. If multiple WithRetryMode calls are made, the last call overrides\n// the previous call values.\n//\n// Will be ignored of LoadOptions.Retryer or WithRetryer are used.\nfunc WithRetryMode(v aws.RetryMode) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.RetryMode = v\n\t\treturn nil\n\t}\n}\n\nfunc (o LoadOptions) getRetryer(ctx context.Context) (func() aws.Retryer, bool, error) {\n\tif o.Retryer == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.Retryer, true, nil\n}\n\n// WithRetryer is a helper function to construct functional options\n// that sets Retryer on LoadOptions. If Retryer is set to nil, the\n// Retryer value is ignored. If multiple WithRetryer calls are\n// made, the last call overrides the previous call values.\nfunc WithRetryer(v func() aws.Retryer) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.Retryer = v\n\t\treturn nil\n\t}\n}\n\nfunc (o LoadOptions) getEndpointResolver(ctx context.Context) (aws.EndpointResolver, bool, error) {\n\tif o.EndpointResolver == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.EndpointResolver, true, nil\n}\n\n// WithEndpointResolver is a helper function to construct functional options\n// that sets the EndpointResolver on LoadOptions. If the EndpointResolver is set to nil,\n// the EndpointResolver value is ignored. If multiple WithEndpointResolver calls\n// are made, the last call overrides the previous call values.\n//\n// Deprecated: The global endpoint resolution interface is deprecated. The API\n// for endpoint resolution is now unique to each service and is set via the\n// EndpointResolverV2 field on service client options. Use of\n// WithEndpointResolver or WithEndpointResolverWithOptions will prevent you\n// from using any endpoint-related service features released after the\n// introduction of EndpointResolverV2. You may also encounter broken or\n// unexpected behavior when using the old global interface with services that\n// use many endpoint-related customizations such as S3.\nfunc WithEndpointResolver(v aws.EndpointResolver) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.EndpointResolver = v\n\t\treturn nil\n\t}\n}\n\nfunc (o LoadOptions) getEndpointResolverWithOptions(ctx context.Context) (aws.EndpointResolverWithOptions, bool, error) {\n\tif o.EndpointResolverWithOptions == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.EndpointResolverWithOptions, true, nil\n}\n\n// WithEndpointResolverWithOptions is a helper function to construct functional options\n// that sets the EndpointResolverWithOptions on LoadOptions. If the EndpointResolverWithOptions is set to nil,\n// the EndpointResolver value is ignored. If multiple WithEndpointResolver calls\n// are made, the last call overrides the previous call values.\n//\n// Deprecated: The global endpoint resolution interface is deprecated. See\n// deprecation docs on [WithEndpointResolver].\nfunc WithEndpointResolverWithOptions(v aws.EndpointResolverWithOptions) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.EndpointResolverWithOptions = v\n\t\treturn nil\n\t}\n}\n\nfunc (o LoadOptions) getLogger(ctx context.Context) (logging.Logger, bool, error) {\n\tif o.Logger == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.Logger, true, nil\n}\n\n// WithLogger is a helper function to construct functional options\n// that sets Logger on LoadOptions. If Logger is set to nil, the\n// Logger value will be ignored. If multiple WithLogger calls are made,\n// the last call overrides the previous call values.\nfunc WithLogger(v logging.Logger) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.Logger = v\n\t\treturn nil\n\t}\n}\n\nfunc (o LoadOptions) getClientLogMode(ctx context.Context) (aws.ClientLogMode, bool, error) {\n\tif o.ClientLogMode == nil {\n\t\treturn 0, false, nil\n\t}\n\n\treturn *o.ClientLogMode, true, nil\n}\n\n// WithClientLogMode is a helper function to construct functional options\n// that sets client log mode on LoadOptions. If client log mode is set to nil,\n// the client log mode value will be ignored. If multiple WithClientLogMode calls are made,\n// the last call overrides the previous call values.\nfunc WithClientLogMode(v aws.ClientLogMode) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.ClientLogMode = &v\n\t\treturn nil\n\t}\n}\n\nfunc (o LoadOptions) getLogConfigurationWarnings(ctx context.Context) (v bool, found bool, err error) {\n\tif o.LogConfigurationWarnings == nil {\n\t\treturn false, false, nil\n\t}\n\treturn *o.LogConfigurationWarnings, true, nil\n}\n\n// WithLogConfigurationWarnings is a helper function to construct\n// functional options that can be used to set LogConfigurationWarnings\n// on LoadOptions.\n//\n// If multiple WithLogConfigurationWarnings calls are made, the last call\n// overrides the previous call values.\nfunc WithLogConfigurationWarnings(v bool) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.LogConfigurationWarnings = &v\n\t\treturn nil\n\t}\n}\n\n// GetS3UseARNRegion returns whether to allow ARNs to direct the region\n// the S3 client's requests are sent to.\nfunc (o LoadOptions) GetS3UseARNRegion(ctx context.Context) (v bool, found bool, err error) {\n\tif o.S3UseARNRegion == nil {\n\t\treturn false, false, nil\n\t}\n\treturn *o.S3UseARNRegion, true, nil\n}\n\n// WithS3UseARNRegion is a helper function to construct functional options\n// that can be used to set S3UseARNRegion on LoadOptions.\n// If multiple WithS3UseARNRegion calls are made, the last call overrides\n// the previous call values.\nfunc WithS3UseARNRegion(v bool) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.S3UseARNRegion = &v\n\t\treturn nil\n\t}\n}\n\n// GetS3DisableMultiRegionAccessPoints returns whether to disable\n// the S3 multi-region access points feature.\nfunc (o LoadOptions) GetS3DisableMultiRegionAccessPoints(ctx context.Context) (v bool, found bool, err error) {\n\tif o.S3DisableMultiRegionAccessPoints == nil {\n\t\treturn false, false, nil\n\t}\n\treturn *o.S3DisableMultiRegionAccessPoints, true, nil\n}\n\n// WithS3DisableMultiRegionAccessPoints is a helper function to construct functional options\n// that can be used to set S3DisableMultiRegionAccessPoints on LoadOptions.\n// If multiple WithS3DisableMultiRegionAccessPoints calls are made, the last call overrides\n// the previous call values.\nfunc WithS3DisableMultiRegionAccessPoints(v bool) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.S3DisableMultiRegionAccessPoints = &v\n\t\treturn nil\n\t}\n}\n\n// GetEnableEndpointDiscovery returns if the EnableEndpointDiscovery flag is set.\nfunc (o LoadOptions) GetEnableEndpointDiscovery(ctx context.Context) (value aws.EndpointDiscoveryEnableState, ok bool, err error) {\n\tif o.EnableEndpointDiscovery == aws.EndpointDiscoveryUnset {\n\t\treturn aws.EndpointDiscoveryUnset, false, nil\n\t}\n\treturn o.EnableEndpointDiscovery, true, nil\n}\n\n// WithEndpointDiscovery is a helper function to construct functional options\n// that can be used to enable endpoint discovery on LoadOptions for supported clients.\n// If multiple WithEndpointDiscovery calls are made, the last call overrides\n// the previous call values.\nfunc WithEndpointDiscovery(v aws.EndpointDiscoveryEnableState) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.EnableEndpointDiscovery = v\n\t\treturn nil\n\t}\n}\n\n// getSSOProviderOptions returns AssumeRoleCredentialOptions from LoadOptions\nfunc (o LoadOptions) getSSOProviderOptions(context.Context) (func(options *ssocreds.Options), bool, error) {\n\tif o.SSOProviderOptions == nil {\n\t\treturn nil, false, nil\n\t}\n\n\treturn o.SSOProviderOptions, true, nil\n}\n\n// WithSSOProviderOptions is a helper function to construct\n// functional options that sets a function to use ssocreds.Options\n// on config's LoadOptions. If the SSO credential provider options is set to nil,\n// the sso provider options value will be ignored. If multiple\n// WithSSOProviderOptions calls are made, the last call overrides\n// the previous call values.\nfunc WithSSOProviderOptions(v func(*ssocreds.Options)) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.SSOProviderOptions = v\n\t\treturn nil\n\t}\n}\n\n// GetEC2IMDSClientEnableState implements a EC2IMDSClientEnableState options resolver interface.\nfunc (o LoadOptions) GetEC2IMDSClientEnableState() (imds.ClientEnableState, bool, error) {\n\tif o.EC2IMDSClientEnableState == imds.ClientDefaultEnableState {\n\t\treturn imds.ClientDefaultEnableState, false, nil\n\t}\n\n\treturn o.EC2IMDSClientEnableState, true, nil\n}\n\n// GetEC2IMDSEndpointMode implements a EC2IMDSEndpointMode option resolver interface.\nfunc (o LoadOptions) GetEC2IMDSEndpointMode() (imds.EndpointModeState, bool, error) {\n\tif o.EC2IMDSEndpointMode == imds.EndpointModeStateUnset {\n\t\treturn imds.EndpointModeStateUnset, false, nil\n\t}\n\n\treturn o.EC2IMDSEndpointMode, true, nil\n}\n\n// GetEC2IMDSEndpoint implements a EC2IMDSEndpoint option resolver interface.\nfunc (o LoadOptions) GetEC2IMDSEndpoint() (string, bool, error) {\n\tif len(o.EC2IMDSEndpoint) == 0 {\n\t\treturn \"\", false, nil\n\t}\n\n\treturn o.EC2IMDSEndpoint, true, nil\n}\n\n// WithEC2IMDSClientEnableState is a helper function to construct functional options that sets the EC2IMDSClientEnableState.\nfunc WithEC2IMDSClientEnableState(v imds.ClientEnableState) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.EC2IMDSClientEnableState = v\n\t\treturn nil\n\t}\n}\n\n// WithEC2IMDSEndpointMode is a helper function to construct functional options that sets the EC2IMDSEndpointMode.\nfunc WithEC2IMDSEndpointMode(v imds.EndpointModeState) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.EC2IMDSEndpointMode = v\n\t\treturn nil\n\t}\n}\n\n// WithEC2IMDSEndpoint is a helper function to construct functional options that sets the EC2IMDSEndpoint.\nfunc WithEC2IMDSEndpoint(v string) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.EC2IMDSEndpoint = v\n\t\treturn nil\n\t}\n}\n\n// WithUseDualStackEndpoint is a helper function to construct\n// functional options that can be used to set UseDualStackEndpoint on LoadOptions.\nfunc WithUseDualStackEndpoint(v aws.DualStackEndpointState) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.UseDualStackEndpoint = v\n\t\treturn nil\n\t}\n}\n\n// GetUseDualStackEndpoint returns whether the service's dual-stack endpoint should be\n// used for requests.\nfunc (o LoadOptions) GetUseDualStackEndpoint(ctx context.Context) (value aws.DualStackEndpointState, found bool, err error) {\n\tif o.UseDualStackEndpoint == aws.DualStackEndpointStateUnset {\n\t\treturn aws.DualStackEndpointStateUnset, false, nil\n\t}\n\treturn o.UseDualStackEndpoint, true, nil\n}\n\n// WithUseFIPSEndpoint is a helper function to construct\n// functional options that can be used to set UseFIPSEndpoint on LoadOptions.\nfunc WithUseFIPSEndpoint(v aws.FIPSEndpointState) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.UseFIPSEndpoint = v\n\t\treturn nil\n\t}\n}\n\n// GetUseFIPSEndpoint returns whether the service's FIPS endpoint should be\n// used for requests.\nfunc (o LoadOptions) GetUseFIPSEndpoint(ctx context.Context) (value aws.FIPSEndpointState, found bool, err error) {\n\tif o.UseFIPSEndpoint == aws.FIPSEndpointStateUnset {\n\t\treturn aws.FIPSEndpointStateUnset, false, nil\n\t}\n\treturn o.UseFIPSEndpoint, true, nil\n}\n\n// WithDefaultsMode sets the SDK defaults configuration mode to the value provided.\n//\n// Zero or more functional options can be provided to provide configuration options for performing\n// environment discovery when using aws.DefaultsModeAuto.\nfunc WithDefaultsMode(mode aws.DefaultsMode, optFns ...func(options *DefaultsModeOptions)) LoadOptionsFunc {\n\tdo := DefaultsModeOptions{\n\t\tMode: mode,\n\t}\n\tfor _, fn := range optFns {\n\t\tfn(&do)\n\t}\n\treturn func(options *LoadOptions) error {\n\t\toptions.DefaultsModeOptions = do\n\t\treturn nil\n\t}\n}\n\n// GetS3DisableExpressAuth returns the configured value for\n// [EnvConfig.S3DisableExpressAuth].\nfunc (o LoadOptions) GetS3DisableExpressAuth() (value, ok bool) {\n\tif o.S3DisableExpressAuth == nil {\n\t\treturn false, false\n\t}\n\n\treturn *o.S3DisableExpressAuth, true\n}\n\n// WithS3DisableExpressAuth sets [LoadOptions.S3DisableExpressAuth]\n// to the value provided.\nfunc WithS3DisableExpressAuth(v bool) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.S3DisableExpressAuth = &v\n\t\treturn nil\n\t}\n}\n\n// WithBaseEndpoint is a helper function to construct functional options that\n// sets BaseEndpoint on config's LoadOptions. Empty values have no effect, and\n// subsequent calls to this API override previous ones.\n//\n// This is an in-code setting, therefore, any value set using this hook takes\n// precedence over and will override ALL environment and shared config\n// directives that set endpoint URLs. Functional options on service clients\n// have higher specificity, and functional options that modify the value of\n// BaseEndpoint on a client will take precedence over this setting.\nfunc WithBaseEndpoint(v string) LoadOptionsFunc {\n\treturn func(o *LoadOptions) error {\n\t\to.BaseEndpoint = v\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/config/local.go",
    "content": "package config\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"net/url\"\n)\n\nvar lookupHostFn = net.LookupHost\n\nfunc isLoopbackHost(host string) (bool, error) {\n\tip := net.ParseIP(host)\n\tif ip != nil {\n\t\treturn ip.IsLoopback(), nil\n\t}\n\n\t// Host is not an ip, perform lookup\n\taddrs, err := lookupHostFn(host)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif len(addrs) == 0 {\n\t\treturn false, fmt.Errorf(\"no addrs found for host, %s\", host)\n\t}\n\n\tfor _, addr := range addrs {\n\t\tif !net.ParseIP(addr).IsLoopback() {\n\t\t\treturn false, nil\n\t\t}\n\t}\n\n\treturn true, nil\n}\n\nfunc validateLocalURL(v string) error {\n\tu, err := url.Parse(v)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\thost := u.Hostname()\n\tif len(host) == 0 {\n\t\treturn fmt.Errorf(\"unable to parse host from local HTTP cred provider URL\")\n\t} else if isLoopback, err := isLoopbackHost(host); err != nil {\n\t\treturn fmt.Errorf(\"failed to resolve host %q, %v\", host, err)\n\t} else if !isLoopback {\n\t\treturn fmt.Errorf(\"invalid endpoint host, %q, only host resolving to loopback addresses are allowed\", host)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/config/provider.go",
    "content": "package config\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"net/http\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials/endpointcreds\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials/processcreds\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials/ssocreds\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials/stscreds\"\n\t\"github.com/aws/aws-sdk-go-v2/feature/ec2/imds\"\n\tsmithybearer \"github.com/aws/smithy-go/auth/bearer\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\n// sharedConfigProfileProvider provides access to the shared config profile\n// name external configuration value.\ntype sharedConfigProfileProvider interface {\n\tgetSharedConfigProfile(ctx context.Context) (string, bool, error)\n}\n\n// getSharedConfigProfile searches the configs for a sharedConfigProfileProvider\n// and returns the value if found. Returns an error if a provider fails before a\n// value is found.\nfunc getSharedConfigProfile(ctx context.Context, configs configs) (value string, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(sharedConfigProfileProvider); ok {\n\t\t\tvalue, found, err = p.getSharedConfigProfile(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// sharedConfigFilesProvider provides access to the shared config filesnames\n// external configuration value.\ntype sharedConfigFilesProvider interface {\n\tgetSharedConfigFiles(ctx context.Context) ([]string, bool, error)\n}\n\n// getSharedConfigFiles searches the configs for a sharedConfigFilesProvider\n// and returns the value if found. Returns an error if a provider fails before a\n// value is found.\nfunc getSharedConfigFiles(ctx context.Context, configs configs) (value []string, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(sharedConfigFilesProvider); ok {\n\t\t\tvalue, found, err = p.getSharedConfigFiles(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\treturn\n}\n\n// sharedCredentialsFilesProvider provides access to the shared credentials filesnames\n// external configuration value.\ntype sharedCredentialsFilesProvider interface {\n\tgetSharedCredentialsFiles(ctx context.Context) ([]string, bool, error)\n}\n\n// getSharedCredentialsFiles searches the configs for a sharedCredentialsFilesProvider\n// and returns the value if found. Returns an error if a provider fails before a\n// value is found.\nfunc getSharedCredentialsFiles(ctx context.Context, configs configs) (value []string, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(sharedCredentialsFilesProvider); ok {\n\t\t\tvalue, found, err = p.getSharedCredentialsFiles(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\treturn\n}\n\n// customCABundleProvider provides access to the custom CA bundle PEM bytes.\ntype customCABundleProvider interface {\n\tgetCustomCABundle(ctx context.Context) (io.Reader, bool, error)\n}\n\n// getCustomCABundle searches the configs for a customCABundleProvider\n// and returns the value if found. Returns an error if a provider fails before a\n// value is found.\nfunc getCustomCABundle(ctx context.Context, configs configs) (value io.Reader, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(customCABundleProvider); ok {\n\t\t\tvalue, found, err = p.getCustomCABundle(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\treturn\n}\n\n// regionProvider provides access to the region external configuration value.\ntype regionProvider interface {\n\tgetRegion(ctx context.Context) (string, bool, error)\n}\n\n// getRegion searches the configs for a regionProvider and returns the value\n// if found. Returns an error if a provider fails before a value is found.\nfunc getRegion(ctx context.Context, configs configs) (value string, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(regionProvider); ok {\n\t\t\tvalue, found, err = p.getRegion(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// IgnoreConfiguredEndpointsProvider is needed to search for all providers\n// that provide a flag to disable configured endpoints.\ntype IgnoreConfiguredEndpointsProvider interface {\n\tGetIgnoreConfiguredEndpoints(ctx context.Context) (bool, bool, error)\n}\n\n// GetIgnoreConfiguredEndpoints is used in knowing when to disable configured\n// endpoints feature.\nfunc GetIgnoreConfiguredEndpoints(ctx context.Context, configs []interface{}) (value bool, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(IgnoreConfiguredEndpointsProvider); ok {\n\t\t\tvalue, found, err = p.GetIgnoreConfiguredEndpoints(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\ntype baseEndpointProvider interface {\n\tgetBaseEndpoint(ctx context.Context) (string, bool, error)\n}\n\nfunc getBaseEndpoint(ctx context.Context, configs configs) (value string, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(baseEndpointProvider); ok {\n\t\t\tvalue, found, err = p.getBaseEndpoint(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\ntype servicesObjectProvider interface {\n\tgetServicesObject(ctx context.Context) (map[string]map[string]string, bool, error)\n}\n\nfunc getServicesObject(ctx context.Context, configs configs) (value map[string]map[string]string, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(servicesObjectProvider); ok {\n\t\t\tvalue, found, err = p.getServicesObject(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// appIDProvider provides access to the sdk app ID value\ntype appIDProvider interface {\n\tgetAppID(ctx context.Context) (string, bool, error)\n}\n\nfunc getAppID(ctx context.Context, configs configs) (value string, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(appIDProvider); ok {\n\t\t\tvalue, found, err = p.getAppID(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// disableRequestCompressionProvider provides access to the DisableRequestCompression\ntype disableRequestCompressionProvider interface {\n\tgetDisableRequestCompression(context.Context) (bool, bool, error)\n}\n\nfunc getDisableRequestCompression(ctx context.Context, configs configs) (value bool, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(disableRequestCompressionProvider); ok {\n\t\t\tvalue, found, err = p.getDisableRequestCompression(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// requestMinCompressSizeBytesProvider provides access to the MinCompressSizeBytes\ntype requestMinCompressSizeBytesProvider interface {\n\tgetRequestMinCompressSizeBytes(context.Context) (int64, bool, error)\n}\n\nfunc getRequestMinCompressSizeBytes(ctx context.Context, configs configs) (value int64, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(requestMinCompressSizeBytesProvider); ok {\n\t\t\tvalue, found, err = p.getRequestMinCompressSizeBytes(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// accountIDEndpointModeProvider provides access to the AccountIDEndpointMode\ntype accountIDEndpointModeProvider interface {\n\tgetAccountIDEndpointMode(context.Context) (aws.AccountIDEndpointMode, bool, error)\n}\n\nfunc getAccountIDEndpointMode(ctx context.Context, configs configs) (value aws.AccountIDEndpointMode, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(accountIDEndpointModeProvider); ok {\n\t\t\tvalue, found, err = p.getAccountIDEndpointMode(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// requestChecksumCalculationProvider provides access to the RequestChecksumCalculation\ntype requestChecksumCalculationProvider interface {\n\tgetRequestChecksumCalculation(context.Context) (aws.RequestChecksumCalculation, bool, error)\n}\n\nfunc getRequestChecksumCalculation(ctx context.Context, configs configs) (value aws.RequestChecksumCalculation, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(requestChecksumCalculationProvider); ok {\n\t\t\tvalue, found, err = p.getRequestChecksumCalculation(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// responseChecksumValidationProvider provides access to the ResponseChecksumValidation\ntype responseChecksumValidationProvider interface {\n\tgetResponseChecksumValidation(context.Context) (aws.ResponseChecksumValidation, bool, error)\n}\n\nfunc getResponseChecksumValidation(ctx context.Context, configs configs) (value aws.ResponseChecksumValidation, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(responseChecksumValidationProvider); ok {\n\t\t\tvalue, found, err = p.getResponseChecksumValidation(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// ec2IMDSRegionProvider provides access to the ec2 imds region\n// configuration value\ntype ec2IMDSRegionProvider interface {\n\tgetEC2IMDSRegion(ctx context.Context) (string, bool, error)\n}\n\n// getEC2IMDSRegion searches the configs for a ec2IMDSRegionProvider and\n// returns the value if found. Returns an error if a provider fails before\n// a value is found.\nfunc getEC2IMDSRegion(ctx context.Context, configs configs) (region string, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif provider, ok := cfg.(ec2IMDSRegionProvider); ok {\n\t\t\tregion, found, err = provider.getEC2IMDSRegion(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// credentialsProviderProvider provides access to the credentials external\n// configuration value.\ntype credentialsProviderProvider interface {\n\tgetCredentialsProvider(ctx context.Context) (aws.CredentialsProvider, bool, error)\n}\n\n// getCredentialsProvider searches the configs for a credentialsProviderProvider\n// and returns the value if found. Returns an error if a provider fails before a\n// value is found.\nfunc getCredentialsProvider(ctx context.Context, configs configs) (p aws.CredentialsProvider, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif provider, ok := cfg.(credentialsProviderProvider); ok {\n\t\t\tp, found, err = provider.getCredentialsProvider(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// credentialsCacheOptionsProvider is an interface for retrieving a function for setting\n// the aws.CredentialsCacheOptions.\ntype credentialsCacheOptionsProvider interface {\n\tgetCredentialsCacheOptions(ctx context.Context) (func(*aws.CredentialsCacheOptions), bool, error)\n}\n\n// getCredentialsCacheOptionsProvider is an interface for retrieving a function for setting\n// the aws.CredentialsCacheOptions.\nfunc getCredentialsCacheOptionsProvider(ctx context.Context, configs configs) (\n\tf func(*aws.CredentialsCacheOptions), found bool, err error,\n) {\n\tfor _, config := range configs {\n\t\tif p, ok := config.(credentialsCacheOptionsProvider); ok {\n\t\t\tf, found, err = p.getCredentialsCacheOptions(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// bearerAuthTokenProviderProvider provides access to the bearer authentication\n// token external configuration value.\ntype bearerAuthTokenProviderProvider interface {\n\tgetBearerAuthTokenProvider(context.Context) (smithybearer.TokenProvider, bool, error)\n}\n\n// getBearerAuthTokenProvider searches the config sources for a\n// bearerAuthTokenProviderProvider and returns the value if found. Returns an\n// error if a provider fails before a value is found.\nfunc getBearerAuthTokenProvider(ctx context.Context, configs configs) (p smithybearer.TokenProvider, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif provider, ok := cfg.(bearerAuthTokenProviderProvider); ok {\n\t\t\tp, found, err = provider.getBearerAuthTokenProvider(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// bearerAuthTokenCacheOptionsProvider is an interface for retrieving a function for\n// setting the smithy-go auth/bearer#TokenCacheOptions.\ntype bearerAuthTokenCacheOptionsProvider interface {\n\tgetBearerAuthTokenCacheOptions(context.Context) (func(*smithybearer.TokenCacheOptions), bool, error)\n}\n\n// getBearerAuthTokenCacheOptionsProvider is an interface for retrieving a function for\n// setting the smithy-go auth/bearer#TokenCacheOptions.\nfunc getBearerAuthTokenCacheOptions(ctx context.Context, configs configs) (\n\tf func(*smithybearer.TokenCacheOptions), found bool, err error,\n) {\n\tfor _, config := range configs {\n\t\tif p, ok := config.(bearerAuthTokenCacheOptionsProvider); ok {\n\t\t\tf, found, err = p.getBearerAuthTokenCacheOptions(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// ssoTokenProviderOptionsProvider is an interface for retrieving a function for\n// setting the SDK's credentials/ssocreds#SSOTokenProviderOptions.\ntype ssoTokenProviderOptionsProvider interface {\n\tgetSSOTokenProviderOptions(context.Context) (func(*ssocreds.SSOTokenProviderOptions), bool, error)\n}\n\n// getSSOTokenProviderOptions is an interface for retrieving a function for\n// setting the SDK's credentials/ssocreds#SSOTokenProviderOptions.\nfunc getSSOTokenProviderOptions(ctx context.Context, configs configs) (\n\tf func(*ssocreds.SSOTokenProviderOptions), found bool, err error,\n) {\n\tfor _, config := range configs {\n\t\tif p, ok := config.(ssoTokenProviderOptionsProvider); ok {\n\t\t\tf, found, err = p.getSSOTokenProviderOptions(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// ssoTokenProviderOptionsProvider\n\n// processCredentialOptions is an interface for retrieving a function for setting\n// the processcreds.Options.\ntype processCredentialOptions interface {\n\tgetProcessCredentialOptions(ctx context.Context) (func(*processcreds.Options), bool, error)\n}\n\n// getProcessCredentialOptions searches the slice of configs and returns the first function found\nfunc getProcessCredentialOptions(ctx context.Context, configs configs) (f func(*processcreds.Options), found bool, err error) {\n\tfor _, config := range configs {\n\t\tif p, ok := config.(processCredentialOptions); ok {\n\t\t\tf, found, err = p.getProcessCredentialOptions(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// ec2RoleCredentialOptionsProvider is an interface for retrieving a function\n// for setting the ec2rolecreds.Provider options.\ntype ec2RoleCredentialOptionsProvider interface {\n\tgetEC2RoleCredentialOptions(ctx context.Context) (func(*ec2rolecreds.Options), bool, error)\n}\n\n// getEC2RoleCredentialProviderOptions searches the slice of configs and returns the first function found\nfunc getEC2RoleCredentialProviderOptions(ctx context.Context, configs configs) (f func(*ec2rolecreds.Options), found bool, err error) {\n\tfor _, config := range configs {\n\t\tif p, ok := config.(ec2RoleCredentialOptionsProvider); ok {\n\t\t\tf, found, err = p.getEC2RoleCredentialOptions(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// defaultRegionProvider is an interface for retrieving a default region if a region was not resolved from other sources\ntype defaultRegionProvider interface {\n\tgetDefaultRegion(ctx context.Context) (string, bool, error)\n}\n\n// getDefaultRegion searches the slice of configs and returns the first fallback region found\nfunc getDefaultRegion(ctx context.Context, configs configs) (value string, found bool, err error) {\n\tfor _, config := range configs {\n\t\tif p, ok := config.(defaultRegionProvider); ok {\n\t\t\tvalue, found, err = p.getDefaultRegion(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// endpointCredentialOptionsProvider is an interface for retrieving a function for setting\n// the endpointcreds.ProviderOptions.\ntype endpointCredentialOptionsProvider interface {\n\tgetEndpointCredentialOptions(ctx context.Context) (func(*endpointcreds.Options), bool, error)\n}\n\n// getEndpointCredentialProviderOptions searches the slice of configs and returns the first function found\nfunc getEndpointCredentialProviderOptions(ctx context.Context, configs configs) (f func(*endpointcreds.Options), found bool, err error) {\n\tfor _, config := range configs {\n\t\tif p, ok := config.(endpointCredentialOptionsProvider); ok {\n\t\t\tf, found, err = p.getEndpointCredentialOptions(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// webIdentityRoleCredentialOptionsProvider is an interface for retrieving a function for setting\n// the stscreds.WebIdentityRoleProvider.\ntype webIdentityRoleCredentialOptionsProvider interface {\n\tgetWebIdentityRoleCredentialOptions(ctx context.Context) (func(*stscreds.WebIdentityRoleOptions), bool, error)\n}\n\n// getWebIdentityCredentialProviderOptions searches the slice of configs and returns the first function found\nfunc getWebIdentityCredentialProviderOptions(ctx context.Context, configs configs) (f func(*stscreds.WebIdentityRoleOptions), found bool, err error) {\n\tfor _, config := range configs {\n\t\tif p, ok := config.(webIdentityRoleCredentialOptionsProvider); ok {\n\t\t\tf, found, err = p.getWebIdentityRoleCredentialOptions(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// assumeRoleCredentialOptionsProvider is an interface for retrieving a function for setting\n// the stscreds.AssumeRoleOptions.\ntype assumeRoleCredentialOptionsProvider interface {\n\tgetAssumeRoleCredentialOptions(ctx context.Context) (func(*stscreds.AssumeRoleOptions), bool, error)\n}\n\n// getAssumeRoleCredentialProviderOptions searches the slice of configs and returns the first function found\nfunc getAssumeRoleCredentialProviderOptions(ctx context.Context, configs configs) (f func(*stscreds.AssumeRoleOptions), found bool, err error) {\n\tfor _, config := range configs {\n\t\tif p, ok := config.(assumeRoleCredentialOptionsProvider); ok {\n\t\t\tf, found, err = p.getAssumeRoleCredentialOptions(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// HTTPClient is an HTTP client implementation\ntype HTTPClient interface {\n\tDo(*http.Request) (*http.Response, error)\n}\n\n// httpClientProvider is an interface for retrieving HTTPClient\ntype httpClientProvider interface {\n\tgetHTTPClient(ctx context.Context) (HTTPClient, bool, error)\n}\n\n// getHTTPClient searches the slice of configs and returns the HTTPClient set on configs\nfunc getHTTPClient(ctx context.Context, configs configs) (client HTTPClient, found bool, err error) {\n\tfor _, config := range configs {\n\t\tif p, ok := config.(httpClientProvider); ok {\n\t\t\tclient, found, err = p.getHTTPClient(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// apiOptionsProvider is an interface for retrieving APIOptions\ntype apiOptionsProvider interface {\n\tgetAPIOptions(ctx context.Context) ([]func(*middleware.Stack) error, bool, error)\n}\n\n// getAPIOptions searches the slice of configs and returns the APIOptions set on configs\nfunc getAPIOptions(ctx context.Context, configs configs) (apiOptions []func(*middleware.Stack) error, found bool, err error) {\n\tfor _, config := range configs {\n\t\tif p, ok := config.(apiOptionsProvider); ok {\n\t\t\t// retrieve APIOptions from configs and set it on cfg\n\t\t\tapiOptions, found, err = p.getAPIOptions(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// endpointResolverProvider is an interface for retrieving an aws.EndpointResolver from a configuration source\ntype endpointResolverProvider interface {\n\tgetEndpointResolver(ctx context.Context) (aws.EndpointResolver, bool, error)\n}\n\n// getEndpointResolver searches the provided config sources for a EndpointResolverFunc that can be used\n// to configure the aws.Config.EndpointResolver value.\nfunc getEndpointResolver(ctx context.Context, configs configs) (f aws.EndpointResolver, found bool, err error) {\n\tfor _, c := range configs {\n\t\tif p, ok := c.(endpointResolverProvider); ok {\n\t\t\tf, found, err = p.getEndpointResolver(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// endpointResolverWithOptionsProvider is an interface for retrieving an aws.EndpointResolverWithOptions from a configuration source\ntype endpointResolverWithOptionsProvider interface {\n\tgetEndpointResolverWithOptions(ctx context.Context) (aws.EndpointResolverWithOptions, bool, error)\n}\n\n// getEndpointResolver searches the provided config sources for a EndpointResolverFunc that can be used\n// to configure the aws.Config.EndpointResolver value.\nfunc getEndpointResolverWithOptions(ctx context.Context, configs configs) (f aws.EndpointResolverWithOptions, found bool, err error) {\n\tfor _, c := range configs {\n\t\tif p, ok := c.(endpointResolverWithOptionsProvider); ok {\n\t\t\tf, found, err = p.getEndpointResolverWithOptions(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// loggerProvider is an interface for retrieving a logging.Logger from a configuration source.\ntype loggerProvider interface {\n\tgetLogger(ctx context.Context) (logging.Logger, bool, error)\n}\n\n// getLogger searches the provided config sources for a logging.Logger that can be used\n// to configure the aws.Config.Logger value.\nfunc getLogger(ctx context.Context, configs configs) (l logging.Logger, found bool, err error) {\n\tfor _, c := range configs {\n\t\tif p, ok := c.(loggerProvider); ok {\n\t\t\tl, found, err = p.getLogger(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// clientLogModeProvider is an interface for retrieving the aws.ClientLogMode from a configuration source.\ntype clientLogModeProvider interface {\n\tgetClientLogMode(ctx context.Context) (aws.ClientLogMode, bool, error)\n}\n\nfunc getClientLogMode(ctx context.Context, configs configs) (m aws.ClientLogMode, found bool, err error) {\n\tfor _, c := range configs {\n\t\tif p, ok := c.(clientLogModeProvider); ok {\n\t\t\tm, found, err = p.getClientLogMode(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// retryProvider is an configuration provider for custom Retryer.\ntype retryProvider interface {\n\tgetRetryer(ctx context.Context) (func() aws.Retryer, bool, error)\n}\n\nfunc getRetryer(ctx context.Context, configs configs) (v func() aws.Retryer, found bool, err error) {\n\tfor _, c := range configs {\n\t\tif p, ok := c.(retryProvider); ok {\n\t\t\tv, found, err = p.getRetryer(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// logConfigurationWarningsProvider is an configuration provider for\n// retrieving a boolean indicating whether configuration issues should\n// be logged when loading from config sources\ntype logConfigurationWarningsProvider interface {\n\tgetLogConfigurationWarnings(ctx context.Context) (bool, bool, error)\n}\n\nfunc getLogConfigurationWarnings(ctx context.Context, configs configs) (v bool, found bool, err error) {\n\tfor _, c := range configs {\n\t\tif p, ok := c.(logConfigurationWarningsProvider); ok {\n\t\t\tv, found, err = p.getLogConfigurationWarnings(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// ssoCredentialOptionsProvider is an interface for retrieving a function for setting\n// the ssocreds.Options.\ntype ssoCredentialOptionsProvider interface {\n\tgetSSOProviderOptions(context.Context) (func(*ssocreds.Options), bool, error)\n}\n\nfunc getSSOProviderOptions(ctx context.Context, configs configs) (v func(options *ssocreds.Options), found bool, err error) {\n\tfor _, c := range configs {\n\t\tif p, ok := c.(ssoCredentialOptionsProvider); ok {\n\t\t\tv, found, err = p.getSSOProviderOptions(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn v, found, err\n}\n\ntype defaultsModeIMDSClientProvider interface {\n\tgetDefaultsModeIMDSClient(context.Context) (*imds.Client, bool, error)\n}\n\nfunc getDefaultsModeIMDSClient(ctx context.Context, configs configs) (v *imds.Client, found bool, err error) {\n\tfor _, c := range configs {\n\t\tif p, ok := c.(defaultsModeIMDSClientProvider); ok {\n\t\t\tv, found, err = p.getDefaultsModeIMDSClient(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn v, found, err\n}\n\ntype defaultsModeProvider interface {\n\tgetDefaultsMode(context.Context) (aws.DefaultsMode, bool, error)\n}\n\nfunc getDefaultsMode(ctx context.Context, configs configs) (v aws.DefaultsMode, found bool, err error) {\n\tfor _, c := range configs {\n\t\tif p, ok := c.(defaultsModeProvider); ok {\n\t\t\tv, found, err = p.getDefaultsMode(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn v, found, err\n}\n\ntype retryMaxAttemptsProvider interface {\n\tGetRetryMaxAttempts(context.Context) (int, bool, error)\n}\n\nfunc getRetryMaxAttempts(ctx context.Context, configs configs) (v int, found bool, err error) {\n\tfor _, c := range configs {\n\t\tif p, ok := c.(retryMaxAttemptsProvider); ok {\n\t\t\tv, found, err = p.GetRetryMaxAttempts(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn v, found, err\n}\n\ntype retryModeProvider interface {\n\tGetRetryMode(context.Context) (aws.RetryMode, bool, error)\n}\n\nfunc getRetryMode(ctx context.Context, configs configs) (v aws.RetryMode, found bool, err error) {\n\tfor _, c := range configs {\n\t\tif p, ok := c.(retryModeProvider); ok {\n\t\t\tv, found, err = p.GetRetryMode(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn v, found, err\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/config/resolve.go",
    "content": "package config\n\nimport (\n\t\"context\"\n\t\"crypto/tls\"\n\t\"crypto/x509\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"os\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\tawshttp \"github.com/aws/aws-sdk-go-v2/aws/transport/http\"\n\t\"github.com/aws/aws-sdk-go-v2/feature/ec2/imds\"\n\t\"github.com/aws/smithy-go/logging\"\n)\n\n// resolveDefaultAWSConfig will write default configuration values into the cfg\n// value. It will write the default values, overwriting any previous value.\n//\n// This should be used as the first resolver in the slice of resolvers when\n// resolving external configuration.\nfunc resolveDefaultAWSConfig(ctx context.Context, cfg *aws.Config, cfgs configs) error {\n\tvar sources []interface{}\n\tfor _, s := range cfgs {\n\t\tsources = append(sources, s)\n\t}\n\n\t*cfg = aws.Config{\n\t\tLogger:        logging.NewStandardLogger(os.Stderr),\n\t\tConfigSources: sources,\n\t}\n\treturn nil\n}\n\n// resolveCustomCABundle extracts the first instance of a custom CA bundle filename\n// from the external configurations. It will update the HTTP Client's builder\n// to be configured with the custom CA bundle.\n//\n// Config provider used:\n// * customCABundleProvider\nfunc resolveCustomCABundle(ctx context.Context, cfg *aws.Config, cfgs configs) error {\n\tpemCerts, found, err := getCustomCABundle(ctx, cfgs)\n\tif err != nil {\n\t\t// TODO error handling, What is the best way to handle this?\n\t\t// capture previous errors continue. error out if all errors\n\t\treturn err\n\t}\n\tif !found {\n\t\treturn nil\n\t}\n\n\tif cfg.HTTPClient == nil {\n\t\tcfg.HTTPClient = awshttp.NewBuildableClient()\n\t}\n\n\ttrOpts, ok := cfg.HTTPClient.(*awshttp.BuildableClient)\n\tif !ok {\n\t\treturn fmt.Errorf(\"unable to add custom RootCAs HTTPClient, \"+\n\t\t\t\"has no WithTransportOptions, %T\", cfg.HTTPClient)\n\t}\n\n\tvar appendErr error\n\tclient := trOpts.WithTransportOptions(func(tr *http.Transport) {\n\t\tif tr.TLSClientConfig == nil {\n\t\t\ttr.TLSClientConfig = &tls.Config{}\n\t\t}\n\t\tif tr.TLSClientConfig.RootCAs == nil {\n\t\t\ttr.TLSClientConfig.RootCAs = x509.NewCertPool()\n\t\t}\n\n\t\tb, err := ioutil.ReadAll(pemCerts)\n\t\tif err != nil {\n\t\t\tappendErr = fmt.Errorf(\"failed to read custom CA bundle PEM file\")\n\t\t}\n\n\t\tif !tr.TLSClientConfig.RootCAs.AppendCertsFromPEM(b) {\n\t\t\tappendErr = fmt.Errorf(\"failed to load custom CA bundle PEM file\")\n\t\t}\n\t})\n\tif appendErr != nil {\n\t\treturn appendErr\n\t}\n\n\tcfg.HTTPClient = client\n\treturn err\n}\n\n// resolveRegion extracts the first instance of a Region from the configs slice.\n//\n// Config providers used:\n// * regionProvider\nfunc resolveRegion(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tv, found, err := getRegion(ctx, configs)\n\tif err != nil {\n\t\t// TODO error handling, What is the best way to handle this?\n\t\t// capture previous errors continue. error out if all errors\n\t\treturn err\n\t}\n\tif !found {\n\t\treturn nil\n\t}\n\n\tcfg.Region = v\n\treturn nil\n}\n\nfunc resolveBaseEndpoint(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tvar downcastCfgSources []interface{}\n\tfor _, cs := range configs {\n\t\tdowncastCfgSources = append(downcastCfgSources, interface{}(cs))\n\t}\n\n\tif val, found, err := GetIgnoreConfiguredEndpoints(ctx, downcastCfgSources); found && val && err == nil {\n\t\tcfg.BaseEndpoint = nil\n\t\treturn nil\n\t}\n\n\tv, found, err := getBaseEndpoint(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif !found {\n\t\treturn nil\n\t}\n\tcfg.BaseEndpoint = aws.String(v)\n\treturn nil\n}\n\n// resolveAppID extracts the sdk app ID from the configs slice's SharedConfig or env var\nfunc resolveAppID(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tID, _, err := getAppID(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tcfg.AppID = ID\n\treturn nil\n}\n\n// resolveDisableRequestCompression extracts the DisableRequestCompression from the configs slice's\n// SharedConfig or EnvConfig\nfunc resolveDisableRequestCompression(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tdisable, _, err := getDisableRequestCompression(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tcfg.DisableRequestCompression = disable\n\treturn nil\n}\n\n// resolveRequestMinCompressSizeBytes extracts the RequestMinCompressSizeBytes from the configs slice's\n// SharedConfig or EnvConfig\nfunc resolveRequestMinCompressSizeBytes(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tminBytes, found, err := getRequestMinCompressSizeBytes(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// must set a default min size 10240 if not configured\n\tif !found {\n\t\tminBytes = 10240\n\t}\n\tcfg.RequestMinCompressSizeBytes = minBytes\n\treturn nil\n}\n\n// resolveAccountIDEndpointMode extracts the AccountIDEndpointMode from the configs slice's\n// SharedConfig or EnvConfig\nfunc resolveAccountIDEndpointMode(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tm, found, err := getAccountIDEndpointMode(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif !found {\n\t\tm = aws.AccountIDEndpointModePreferred\n\t}\n\n\tcfg.AccountIDEndpointMode = m\n\treturn nil\n}\n\n// resolveRequestChecksumCalculation extracts the RequestChecksumCalculation from the configs slice's\n// SharedConfig or EnvConfig\nfunc resolveRequestChecksumCalculation(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tc, found, err := getRequestChecksumCalculation(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif !found {\n\t\tc = aws.RequestChecksumCalculationWhenSupported\n\t}\n\tcfg.RequestChecksumCalculation = c\n\treturn nil\n}\n\n// resolveResponseValidation extracts the ResponseChecksumValidation from the configs slice's\n// SharedConfig or EnvConfig\nfunc resolveResponseChecksumValidation(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tc, found, err := getResponseChecksumValidation(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif !found {\n\t\tc = aws.ResponseChecksumValidationWhenSupported\n\t}\n\tcfg.ResponseChecksumValidation = c\n\treturn nil\n}\n\n// resolveDefaultRegion extracts the first instance of a default region and sets `aws.Config.Region` to the default\n// region if region had not been resolved from other sources.\nfunc resolveDefaultRegion(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tif len(cfg.Region) > 0 {\n\t\treturn nil\n\t}\n\n\tv, found, err := getDefaultRegion(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !found {\n\t\treturn nil\n\t}\n\n\tcfg.Region = v\n\n\treturn nil\n}\n\n// resolveHTTPClient extracts the first instance of a HTTPClient and sets `aws.Config.HTTPClient` to the HTTPClient instance\n// if one has not been resolved from other sources.\nfunc resolveHTTPClient(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tc, found, err := getHTTPClient(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !found {\n\t\treturn nil\n\t}\n\n\tcfg.HTTPClient = c\n\treturn nil\n}\n\n// resolveAPIOptions extracts the first instance of APIOptions and sets `aws.Config.APIOptions` to the resolved API options\n// if one has not been resolved from other sources.\nfunc resolveAPIOptions(ctx context.Context, cfg *aws.Config, configs configs) error {\n\to, found, err := getAPIOptions(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !found {\n\t\treturn nil\n\t}\n\n\tcfg.APIOptions = o\n\n\treturn nil\n}\n\n// resolveEndpointResolver extracts the first instance of a EndpointResolverFunc from the config slice\n// and sets the functions result on the aws.Config.EndpointResolver\nfunc resolveEndpointResolver(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tendpointResolver, found, err := getEndpointResolver(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !found {\n\t\treturn nil\n\t}\n\n\tcfg.EndpointResolver = endpointResolver\n\n\treturn nil\n}\n\n// resolveEndpointResolver extracts the first instance of a EndpointResolverFunc from the config slice\n// and sets the functions result on the aws.Config.EndpointResolver\nfunc resolveEndpointResolverWithOptions(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tendpointResolver, found, err := getEndpointResolverWithOptions(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !found {\n\t\treturn nil\n\t}\n\n\tcfg.EndpointResolverWithOptions = endpointResolver\n\n\treturn nil\n}\n\nfunc resolveLogger(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tlogger, found, err := getLogger(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !found {\n\t\treturn nil\n\t}\n\n\tcfg.Logger = logger\n\n\treturn nil\n}\n\nfunc resolveClientLogMode(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tmode, found, err := getClientLogMode(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !found {\n\t\treturn nil\n\t}\n\n\tcfg.ClientLogMode = mode\n\n\treturn nil\n}\n\nfunc resolveRetryer(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tretryer, found, err := getRetryer(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif found {\n\t\tcfg.Retryer = retryer\n\t\treturn nil\n\t}\n\n\t// Only load the retry options if a custom retryer has not be specified.\n\tif err = resolveRetryMaxAttempts(ctx, cfg, configs); err != nil {\n\t\treturn err\n\t}\n\treturn resolveRetryMode(ctx, cfg, configs)\n}\n\nfunc resolveEC2IMDSRegion(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tif len(cfg.Region) > 0 {\n\t\treturn nil\n\t}\n\n\tregion, found, err := getEC2IMDSRegion(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !found {\n\t\treturn nil\n\t}\n\n\tcfg.Region = region\n\n\treturn nil\n}\n\nfunc resolveDefaultsModeOptions(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tdefaultsMode, found, err := getDefaultsMode(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !found {\n\t\tdefaultsMode = aws.DefaultsModeLegacy\n\t}\n\n\tvar environment aws.RuntimeEnvironment\n\tif defaultsMode == aws.DefaultsModeAuto {\n\t\tenvConfig, _, _ := getAWSConfigSources(configs)\n\n\t\tclient, found, err := getDefaultsModeIMDSClient(ctx, configs)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif !found {\n\t\t\tclient = imds.NewFromConfig(*cfg)\n\t\t}\n\n\t\tenvironment, err = resolveDefaultsModeRuntimeEnvironment(ctx, envConfig, client)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tcfg.DefaultsMode = defaultsMode\n\tcfg.RuntimeEnvironment = environment\n\n\treturn nil\n}\n\nfunc resolveRetryMaxAttempts(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tmaxAttempts, found, err := getRetryMaxAttempts(ctx, configs)\n\tif err != nil || !found {\n\t\treturn err\n\t}\n\tcfg.RetryMaxAttempts = maxAttempts\n\n\treturn nil\n}\n\nfunc resolveRetryMode(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tretryMode, found, err := getRetryMode(ctx, configs)\n\tif err != nil || !found {\n\t\treturn err\n\t}\n\tcfg.RetryMode = retryMode\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/config/resolve_bearer_token.go",
    "content": "package config\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials/ssocreds\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ssooidc\"\n\tsmithybearer \"github.com/aws/smithy-go/auth/bearer\"\n)\n\n// resolveBearerAuthToken extracts a token provider from the config sources.\n//\n// If an explicit bearer authentication token provider is not found the\n// resolver will fallback to resolving token provider via other config sources\n// such as SharedConfig.\nfunc resolveBearerAuthToken(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tfound, err := resolveBearerAuthTokenProvider(ctx, cfg, configs)\n\tif found || err != nil {\n\t\treturn err\n\t}\n\n\treturn resolveBearerAuthTokenProviderChain(ctx, cfg, configs)\n}\n\n// resolveBearerAuthTokenProvider extracts the first instance of\n// BearerAuthTokenProvider from the config sources.\n//\n// The resolved BearerAuthTokenProvider will be wrapped in a cache to ensure\n// the Token is only refreshed when needed. This also protects the\n// TokenProvider so it can be used concurrently.\n//\n// Config providers used:\n// * bearerAuthTokenProviderProvider\nfunc resolveBearerAuthTokenProvider(ctx context.Context, cfg *aws.Config, configs configs) (bool, error) {\n\ttokenProvider, found, err := getBearerAuthTokenProvider(ctx, configs)\n\tif !found || err != nil {\n\t\treturn false, err\n\t}\n\n\tcfg.BearerAuthTokenProvider, err = wrapWithBearerAuthTokenCache(\n\t\tctx, configs, tokenProvider)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\treturn true, nil\n}\n\nfunc resolveBearerAuthTokenProviderChain(ctx context.Context, cfg *aws.Config, configs configs) (err error) {\n\t_, sharedConfig, _ := getAWSConfigSources(configs)\n\n\tvar provider smithybearer.TokenProvider\n\n\tif sharedConfig.SSOSession != nil {\n\t\tprovider, err = resolveBearerAuthSSOTokenProvider(\n\t\t\tctx, cfg, sharedConfig.SSOSession, configs)\n\t}\n\n\tif err == nil && provider != nil {\n\t\tcfg.BearerAuthTokenProvider, err = wrapWithBearerAuthTokenCache(\n\t\t\tctx, configs, provider)\n\t}\n\n\treturn err\n}\n\nfunc resolveBearerAuthSSOTokenProvider(ctx context.Context, cfg *aws.Config, session *SSOSession, configs configs) (*ssocreds.SSOTokenProvider, error) {\n\tssoTokenProviderOptionsFn, found, err := getSSOTokenProviderOptions(ctx, configs)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get SSOTokenProviderOptions from config sources, %w\", err)\n\t}\n\n\tvar optFns []func(*ssocreds.SSOTokenProviderOptions)\n\tif found {\n\t\toptFns = append(optFns, ssoTokenProviderOptionsFn)\n\t}\n\n\tcachePath, err := ssocreds.StandardCachedTokenFilepath(session.Name)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get SSOTokenProvider's cache path, %w\", err)\n\t}\n\n\tclient := ssooidc.NewFromConfig(*cfg)\n\tprovider := ssocreds.NewSSOTokenProvider(client, cachePath, optFns...)\n\n\treturn provider, nil\n}\n\n// wrapWithBearerAuthTokenCache will wrap provider with an smithy-go\n// bearer/auth#TokenCache with the provided options if the provider is not\n// already a TokenCache.\nfunc wrapWithBearerAuthTokenCache(\n\tctx context.Context,\n\tcfgs configs,\n\tprovider smithybearer.TokenProvider,\n\toptFns ...func(*smithybearer.TokenCacheOptions),\n) (smithybearer.TokenProvider, error) {\n\t_, ok := provider.(*smithybearer.TokenCache)\n\tif ok {\n\t\treturn provider, nil\n\t}\n\n\ttokenCacheConfigOptions, optionsFound, err := getBearerAuthTokenCacheOptions(ctx, cfgs)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\topts := make([]func(*smithybearer.TokenCacheOptions), 0, 2+len(optFns))\n\topts = append(opts, func(o *smithybearer.TokenCacheOptions) {\n\t\to.RefreshBeforeExpires = 5 * time.Minute\n\t\to.RetrieveBearerTokenTimeout = 30 * time.Second\n\t})\n\topts = append(opts, optFns...)\n\tif optionsFound {\n\t\topts = append(opts, tokenCacheConfigOptions)\n\t}\n\n\treturn smithybearer.NewTokenCache(provider, opts...), nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/config/resolve_credentials.go",
    "content": "package config\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net\"\n\t\"net/url\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials/endpointcreds\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials/processcreds\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials/ssocreds\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials/stscreds\"\n\t\"github.com/aws/aws-sdk-go-v2/feature/ec2/imds\"\n\t\"github.com/aws/aws-sdk-go-v2/service/sso\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ssooidc\"\n\t\"github.com/aws/aws-sdk-go-v2/service/sts\"\n)\n\nconst (\n\t// valid credential source values\n\tcredSourceEc2Metadata      = \"Ec2InstanceMetadata\"\n\tcredSourceEnvironment      = \"Environment\"\n\tcredSourceECSContainer     = \"EcsContainer\"\n\thttpProviderAuthFileEnvVar = \"AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE\"\n)\n\n// direct representation of the IPv4 address for the ECS container\n// \"169.254.170.2\"\nvar ecsContainerIPv4 net.IP = []byte{\n\t169, 254, 170, 2,\n}\n\n// direct representation of the IPv4 address for the EKS container\n// \"169.254.170.23\"\nvar eksContainerIPv4 net.IP = []byte{\n\t169, 254, 170, 23,\n}\n\n// direct representation of the IPv6 address for the EKS container\n// \"fd00:ec2::23\"\nvar eksContainerIPv6 net.IP = []byte{\n\t0xFD, 0, 0xE, 0xC2,\n\t0, 0, 0, 0,\n\t0, 0, 0, 0,\n\t0, 0, 0, 0x23,\n}\n\nvar (\n\tecsContainerEndpoint = \"http://169.254.170.2\" // not constant to allow for swapping during unit-testing\n)\n\n// resolveCredentials extracts a credential provider from slice of config\n// sources.\n//\n// If an explicit credential provider is not found the resolver will fallback\n// to resolving credentials by extracting a credential provider from EnvConfig\n// and SharedConfig.\nfunc resolveCredentials(ctx context.Context, cfg *aws.Config, configs configs) error {\n\tfound, err := resolveCredentialProvider(ctx, cfg, configs)\n\tif found || err != nil {\n\t\treturn err\n\t}\n\n\treturn resolveCredentialChain(ctx, cfg, configs)\n}\n\n// resolveCredentialProvider extracts the first instance of Credentials from the\n// config slices.\n//\n// The resolved CredentialProvider will be wrapped in a cache to ensure the\n// credentials are only refreshed when needed. This also protects the\n// credential provider to be used concurrently.\n//\n// Config providers used:\n// * credentialsProviderProvider\nfunc resolveCredentialProvider(ctx context.Context, cfg *aws.Config, configs configs) (bool, error) {\n\tcredProvider, found, err := getCredentialsProvider(ctx, configs)\n\tif !found || err != nil {\n\t\treturn false, err\n\t}\n\n\tcfg.Credentials, err = wrapWithCredentialsCache(ctx, configs, credProvider)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\treturn true, nil\n}\n\n// resolveCredentialChain resolves a credential provider chain using EnvConfig\n// and SharedConfig if present in the slice of provided configs.\n//\n// The resolved CredentialProvider will be wrapped in a cache to ensure the\n// credentials are only refreshed when needed. This also protects the\n// credential provider to be used concurrently.\nfunc resolveCredentialChain(ctx context.Context, cfg *aws.Config, configs configs) (err error) {\n\tenvConfig, sharedConfig, other := getAWSConfigSources(configs)\n\n\t// When checking if a profile was specified programmatically we should only consider the \"other\"\n\t// configuration sources that have been provided. This ensures we correctly honor the expected credential\n\t// hierarchy.\n\t_, sharedProfileSet, err := getSharedConfigProfile(ctx, other)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tswitch {\n\tcase sharedProfileSet:\n\t\tctx, err = resolveCredsFromProfile(ctx, cfg, envConfig, sharedConfig, other)\n\tcase envConfig.Credentials.HasKeys():\n\t\tctx = addCredentialSource(ctx, aws.CredentialSourceEnvVars)\n\t\tcfg.Credentials = credentials.StaticCredentialsProvider{Value: envConfig.Credentials, Source: getCredentialSources(ctx)}\n\tcase len(envConfig.WebIdentityTokenFilePath) > 0:\n\t\tctx = addCredentialSource(ctx, aws.CredentialSourceEnvVarsSTSWebIDToken)\n\t\terr = assumeWebIdentity(ctx, cfg, envConfig.WebIdentityTokenFilePath, envConfig.RoleARN, envConfig.RoleSessionName, configs)\n\tdefault:\n\t\tctx, err = resolveCredsFromProfile(ctx, cfg, envConfig, sharedConfig, other)\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Wrap the resolved provider in a cache so the SDK will cache credentials.\n\tcfg.Credentials, err = wrapWithCredentialsCache(ctx, configs, cfg.Credentials)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc resolveCredsFromProfile(ctx context.Context, cfg *aws.Config, envConfig *EnvConfig, sharedConfig *SharedConfig, configs configs) (ctx2 context.Context, err error) {\n\tswitch {\n\tcase sharedConfig.Source != nil:\n\t\tctx = addCredentialSource(ctx, aws.CredentialSourceProfileSourceProfile)\n\t\t// Assume IAM role with credentials source from a different profile.\n\t\tctx, err = resolveCredsFromProfile(ctx, cfg, envConfig, sharedConfig.Source, configs)\n\n\tcase sharedConfig.Credentials.HasKeys():\n\t\t// Static Credentials from Shared Config/Credentials file.\n\t\tctx = addCredentialSource(ctx, aws.CredentialSourceProfile)\n\t\tcfg.Credentials = credentials.StaticCredentialsProvider{\n\t\t\tValue:  sharedConfig.Credentials,\n\t\t\tSource: getCredentialSources(ctx),\n\t\t}\n\n\tcase len(sharedConfig.CredentialSource) != 0:\n\t\tctx = addCredentialSource(ctx, aws.CredentialSourceProfileNamedProvider)\n\t\tctx, err = resolveCredsFromSource(ctx, cfg, envConfig, sharedConfig, configs)\n\n\tcase len(sharedConfig.WebIdentityTokenFile) != 0:\n\t\t// Credentials from Assume Web Identity token require an IAM Role, and\n\t\t// that roll will be assumed. May be wrapped with another assume role\n\t\t// via SourceProfile.\n\t\tctx = addCredentialSource(ctx, aws.CredentialSourceProfileSTSWebIDToken)\n\t\treturn ctx, assumeWebIdentity(ctx, cfg, sharedConfig.WebIdentityTokenFile, sharedConfig.RoleARN, sharedConfig.RoleSessionName, configs)\n\n\tcase sharedConfig.hasSSOConfiguration():\n\t\tif sharedConfig.hasLegacySSOConfiguration() {\n\t\t\tctx = addCredentialSource(ctx, aws.CredentialSourceProfileSSOLegacy)\n\t\t\tctx = addCredentialSource(ctx, aws.CredentialSourceSSOLegacy)\n\t\t} else {\n\t\t\tctx = addCredentialSource(ctx, aws.CredentialSourceSSO)\n\t\t}\n\t\tif sharedConfig.SSOSession != nil {\n\t\t\tctx = addCredentialSource(ctx, aws.CredentialSourceProfileSSO)\n\t\t}\n\t\terr = resolveSSOCredentials(ctx, cfg, sharedConfig, configs)\n\n\tcase len(sharedConfig.CredentialProcess) != 0:\n\t\t// Get credentials from CredentialProcess\n\t\tctx = addCredentialSource(ctx, aws.CredentialSourceProfileProcess)\n\t\tctx = addCredentialSource(ctx, aws.CredentialSourceProcess)\n\t\terr = processCredentials(ctx, cfg, sharedConfig, configs)\n\n\tcase len(envConfig.ContainerCredentialsRelativePath) != 0:\n\t\tctx = addCredentialSource(ctx, aws.CredentialSourceHTTP)\n\t\terr = resolveHTTPCredProvider(ctx, cfg, ecsContainerURI(envConfig.ContainerCredentialsRelativePath), envConfig.ContainerAuthorizationToken, configs)\n\n\tcase len(envConfig.ContainerCredentialsEndpoint) != 0:\n\t\tctx = addCredentialSource(ctx, aws.CredentialSourceHTTP)\n\t\terr = resolveLocalHTTPCredProvider(ctx, cfg, envConfig.ContainerCredentialsEndpoint, envConfig.ContainerAuthorizationToken, configs)\n\n\tdefault:\n\t\tctx = addCredentialSource(ctx, aws.CredentialSourceIMDS)\n\t\terr = resolveEC2RoleCredentials(ctx, cfg, configs)\n\t}\n\tif err != nil {\n\t\treturn ctx, err\n\t}\n\n\tif len(sharedConfig.RoleARN) > 0 {\n\t\treturn ctx, credsFromAssumeRole(ctx, cfg, sharedConfig, configs)\n\t}\n\n\treturn ctx, nil\n}\n\nfunc resolveSSOCredentials(ctx context.Context, cfg *aws.Config, sharedConfig *SharedConfig, configs configs) error {\n\tif err := sharedConfig.validateSSOConfiguration(); err != nil {\n\t\treturn err\n\t}\n\n\tvar options []func(*ssocreds.Options)\n\tv, found, err := getSSOProviderOptions(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif found {\n\t\toptions = append(options, v)\n\t}\n\n\tcfgCopy := cfg.Copy()\n\n\toptions = append(options, func(o *ssocreds.Options) {\n\t\to.CredentialSources = getCredentialSources(ctx)\n\t})\n\n\tif sharedConfig.SSOSession != nil {\n\t\tssoTokenProviderOptionsFn, found, err := getSSOTokenProviderOptions(ctx, configs)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to get SSOTokenProviderOptions from config sources, %w\", err)\n\t\t}\n\t\tvar optFns []func(*ssocreds.SSOTokenProviderOptions)\n\t\tif found {\n\t\t\toptFns = append(optFns, ssoTokenProviderOptionsFn)\n\t\t}\n\t\tcfgCopy.Region = sharedConfig.SSOSession.SSORegion\n\t\tcachedPath, err := ssocreds.StandardCachedTokenFilepath(sharedConfig.SSOSession.Name)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\toidcClient := ssooidc.NewFromConfig(cfgCopy)\n\t\ttokenProvider := ssocreds.NewSSOTokenProvider(oidcClient, cachedPath, optFns...)\n\t\toptions = append(options, func(o *ssocreds.Options) {\n\t\t\to.SSOTokenProvider = tokenProvider\n\t\t\to.CachedTokenFilepath = cachedPath\n\t\t})\n\t} else {\n\t\tcfgCopy.Region = sharedConfig.SSORegion\n\t}\n\n\tcfg.Credentials = ssocreds.New(sso.NewFromConfig(cfgCopy), sharedConfig.SSOAccountID, sharedConfig.SSORoleName, sharedConfig.SSOStartURL, options...)\n\n\treturn nil\n}\n\nfunc ecsContainerURI(path string) string {\n\treturn fmt.Sprintf(\"%s%s\", ecsContainerEndpoint, path)\n}\n\nfunc processCredentials(ctx context.Context, cfg *aws.Config, sharedConfig *SharedConfig, configs configs) error {\n\tvar opts []func(*processcreds.Options)\n\n\toptions, found, err := getProcessCredentialOptions(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif found {\n\t\topts = append(opts, options)\n\t}\n\n\topts = append(opts, func(o *processcreds.Options) {\n\t\to.CredentialSources = getCredentialSources(ctx)\n\t})\n\n\tcfg.Credentials = processcreds.NewProvider(sharedConfig.CredentialProcess, opts...)\n\n\treturn nil\n}\n\n// isAllowedHost allows host to be loopback or known ECS/EKS container IPs\n//\n// host can either be an IP address OR an unresolved hostname - resolution will\n// be automatically performed in the latter case\nfunc isAllowedHost(host string) (bool, error) {\n\tif ip := net.ParseIP(host); ip != nil {\n\t\treturn isIPAllowed(ip), nil\n\t}\n\n\taddrs, err := lookupHostFn(host)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\tfor _, addr := range addrs {\n\t\tif ip := net.ParseIP(addr); ip == nil || !isIPAllowed(ip) {\n\t\t\treturn false, nil\n\t\t}\n\t}\n\n\treturn true, nil\n}\n\nfunc isIPAllowed(ip net.IP) bool {\n\treturn ip.IsLoopback() ||\n\t\tip.Equal(ecsContainerIPv4) ||\n\t\tip.Equal(eksContainerIPv4) ||\n\t\tip.Equal(eksContainerIPv6)\n}\n\nfunc resolveLocalHTTPCredProvider(ctx context.Context, cfg *aws.Config, endpointURL, authToken string, configs configs) error {\n\tvar resolveErr error\n\n\tparsed, err := url.Parse(endpointURL)\n\tif err != nil {\n\t\tresolveErr = fmt.Errorf(\"invalid URL, %w\", err)\n\t} else {\n\t\thost := parsed.Hostname()\n\t\tif len(host) == 0 {\n\t\t\tresolveErr = fmt.Errorf(\"unable to parse host from local HTTP cred provider URL\")\n\t\t} else if parsed.Scheme == \"http\" {\n\t\t\tif isAllowedHost, allowHostErr := isAllowedHost(host); allowHostErr != nil {\n\t\t\t\tresolveErr = fmt.Errorf(\"failed to resolve host %q, %v\", host, allowHostErr)\n\t\t\t} else if !isAllowedHost {\n\t\t\t\tresolveErr = fmt.Errorf(\"invalid endpoint host, %q, only loopback/ecs/eks hosts are allowed\", host)\n\t\t\t}\n\t\t}\n\t}\n\n\tif resolveErr != nil {\n\t\treturn resolveErr\n\t}\n\n\treturn resolveHTTPCredProvider(ctx, cfg, endpointURL, authToken, configs)\n}\n\nfunc resolveHTTPCredProvider(ctx context.Context, cfg *aws.Config, url, authToken string, configs configs) error {\n\toptFns := []func(*endpointcreds.Options){\n\t\tfunc(options *endpointcreds.Options) {\n\t\t\tif len(authToken) != 0 {\n\t\t\t\toptions.AuthorizationToken = authToken\n\t\t\t}\n\t\t\tif authFilePath := os.Getenv(httpProviderAuthFileEnvVar); authFilePath != \"\" {\n\t\t\t\toptions.AuthorizationTokenProvider = endpointcreds.TokenProviderFunc(func() (string, error) {\n\t\t\t\t\tvar contents []byte\n\t\t\t\t\tvar err error\n\t\t\t\t\tif contents, err = ioutil.ReadFile(authFilePath); err != nil {\n\t\t\t\t\t\treturn \"\", fmt.Errorf(\"failed to read authorization token from %v: %v\", authFilePath, err)\n\t\t\t\t\t}\n\t\t\t\t\treturn string(contents), nil\n\t\t\t\t})\n\t\t\t}\n\t\t\toptions.APIOptions = cfg.APIOptions\n\t\t\tif cfg.Retryer != nil {\n\t\t\t\toptions.Retryer = cfg.Retryer()\n\t\t\t}\n\t\t\toptions.CredentialSources = getCredentialSources(ctx)\n\t\t},\n\t}\n\n\toptFn, found, err := getEndpointCredentialProviderOptions(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif found {\n\t\toptFns = append(optFns, optFn)\n\t}\n\n\tprovider := endpointcreds.New(url, optFns...)\n\n\tcfg.Credentials, err = wrapWithCredentialsCache(ctx, configs, provider, func(options *aws.CredentialsCacheOptions) {\n\t\toptions.ExpiryWindow = 5 * time.Minute\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc resolveCredsFromSource(ctx context.Context, cfg *aws.Config, envConfig *EnvConfig, sharedCfg *SharedConfig, configs configs) (context.Context, error) {\n\tswitch sharedCfg.CredentialSource {\n\tcase credSourceEc2Metadata:\n\t\tctx = addCredentialSource(ctx, aws.CredentialSourceIMDS)\n\t\treturn ctx, resolveEC2RoleCredentials(ctx, cfg, configs)\n\n\tcase credSourceEnvironment:\n\t\tctx = addCredentialSource(ctx, aws.CredentialSourceHTTP)\n\t\tcfg.Credentials = credentials.StaticCredentialsProvider{Value: envConfig.Credentials, Source: getCredentialSources(ctx)}\n\n\tcase credSourceECSContainer:\n\t\tctx = addCredentialSource(ctx, aws.CredentialSourceHTTP)\n\t\tif len(envConfig.ContainerCredentialsRelativePath) != 0 {\n\t\t\treturn ctx, resolveHTTPCredProvider(ctx, cfg, ecsContainerURI(envConfig.ContainerCredentialsRelativePath), envConfig.ContainerAuthorizationToken, configs)\n\t\t}\n\t\tif len(envConfig.ContainerCredentialsEndpoint) != 0 {\n\t\t\treturn ctx, resolveLocalHTTPCredProvider(ctx, cfg, envConfig.ContainerCredentialsEndpoint, envConfig.ContainerAuthorizationToken, configs)\n\t\t}\n\t\treturn ctx, fmt.Errorf(\"EcsContainer was specified as the credential_source, but neither 'AWS_CONTAINER_CREDENTIALS_RELATIVE_URI' or AWS_CONTAINER_CREDENTIALS_FULL_URI' was set\")\n\n\tdefault:\n\t\treturn ctx, fmt.Errorf(\"credential_source values must be EcsContainer, Ec2InstanceMetadata, or Environment\")\n\t}\n\n\treturn ctx, nil\n}\n\nfunc resolveEC2RoleCredentials(ctx context.Context, cfg *aws.Config, configs configs) error {\n\toptFns := make([]func(*ec2rolecreds.Options), 0, 2)\n\n\toptFn, found, err := getEC2RoleCredentialProviderOptions(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif found {\n\t\toptFns = append(optFns, optFn)\n\t}\n\n\toptFns = append(optFns, func(o *ec2rolecreds.Options) {\n\t\t// Only define a client from config if not already defined.\n\t\tif o.Client == nil {\n\t\t\to.Client = imds.NewFromConfig(*cfg)\n\t\t}\n\t\to.CredentialSources = getCredentialSources(ctx)\n\t})\n\n\tprovider := ec2rolecreds.New(optFns...)\n\n\tcfg.Credentials, err = wrapWithCredentialsCache(ctx, configs, provider)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc getAWSConfigSources(cfgs configs) (*EnvConfig, *SharedConfig, configs) {\n\tvar (\n\t\tenvConfig    *EnvConfig\n\t\tsharedConfig *SharedConfig\n\t\tother        configs\n\t)\n\n\tfor i := range cfgs {\n\t\tswitch c := cfgs[i].(type) {\n\t\tcase EnvConfig:\n\t\t\tif envConfig == nil {\n\t\t\t\tenvConfig = &c\n\t\t\t}\n\t\tcase *EnvConfig:\n\t\t\tif envConfig == nil {\n\t\t\t\tenvConfig = c\n\t\t\t}\n\t\tcase SharedConfig:\n\t\t\tif sharedConfig == nil {\n\t\t\t\tsharedConfig = &c\n\t\t\t}\n\t\tcase *SharedConfig:\n\t\t\tif envConfig == nil {\n\t\t\t\tsharedConfig = c\n\t\t\t}\n\t\tdefault:\n\t\t\tother = append(other, c)\n\t\t}\n\t}\n\n\tif envConfig == nil {\n\t\tenvConfig = &EnvConfig{}\n\t}\n\n\tif sharedConfig == nil {\n\t\tsharedConfig = &SharedConfig{}\n\t}\n\n\treturn envConfig, sharedConfig, other\n}\n\n// AssumeRoleTokenProviderNotSetError is an error returned when creating a\n// session when the MFAToken option is not set when shared config is configured\n// load assume a role with an MFA token.\ntype AssumeRoleTokenProviderNotSetError struct{}\n\n// Error is the error message\nfunc (e AssumeRoleTokenProviderNotSetError) Error() string {\n\treturn fmt.Sprintf(\"assume role with MFA enabled, but AssumeRoleTokenProvider session option not set.\")\n}\n\nfunc assumeWebIdentity(ctx context.Context, cfg *aws.Config, filepath string, roleARN, sessionName string, configs configs) error {\n\tif len(filepath) == 0 {\n\t\treturn fmt.Errorf(\"token file path is not set\")\n\t}\n\n\toptFns := []func(*stscreds.WebIdentityRoleOptions){\n\t\tfunc(options *stscreds.WebIdentityRoleOptions) {\n\t\t\toptions.RoleSessionName = sessionName\n\t\t},\n\t}\n\n\toptFn, found, err := getWebIdentityCredentialProviderOptions(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif found {\n\t\toptFns = append(optFns, optFn)\n\t}\n\n\topts := stscreds.WebIdentityRoleOptions{\n\t\tRoleARN: roleARN,\n\t}\n\n\toptFns = append(optFns, func(options *stscreds.WebIdentityRoleOptions) {\n\t\toptions.CredentialSources = getCredentialSources(ctx)\n\t})\n\n\tfor _, fn := range optFns {\n\t\tfn(&opts)\n\t}\n\n\tif len(opts.RoleARN) == 0 {\n\t\treturn fmt.Errorf(\"role ARN is not set\")\n\t}\n\n\tclient := opts.Client\n\tif client == nil {\n\t\tclient = sts.NewFromConfig(*cfg)\n\t}\n\n\tprovider := stscreds.NewWebIdentityRoleProvider(client, roleARN, stscreds.IdentityTokenFile(filepath), optFns...)\n\n\tcfg.Credentials = provider\n\n\treturn nil\n}\n\nfunc credsFromAssumeRole(ctx context.Context, cfg *aws.Config, sharedCfg *SharedConfig, configs configs) (err error) {\n\t// resolve credentials early\n\tcredentialSources := getCredentialSources(ctx)\n\toptFns := []func(*stscreds.AssumeRoleOptions){\n\t\tfunc(options *stscreds.AssumeRoleOptions) {\n\t\t\toptions.RoleSessionName = sharedCfg.RoleSessionName\n\t\t\tif sharedCfg.RoleDurationSeconds != nil {\n\t\t\t\tif *sharedCfg.RoleDurationSeconds/time.Minute > 15 {\n\t\t\t\t\toptions.Duration = *sharedCfg.RoleDurationSeconds\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Assume role with external ID\n\t\t\tif len(sharedCfg.ExternalID) > 0 {\n\t\t\t\toptions.ExternalID = aws.String(sharedCfg.ExternalID)\n\t\t\t}\n\n\t\t\t// Assume role with MFA\n\t\t\tif len(sharedCfg.MFASerial) != 0 {\n\t\t\t\toptions.SerialNumber = aws.String(sharedCfg.MFASerial)\n\t\t\t}\n\n\t\t\t// add existing credential chain\n\t\t\toptions.CredentialSources = credentialSources\n\t\t},\n\t}\n\n\toptFn, found, err := getAssumeRoleCredentialProviderOptions(ctx, configs)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif found {\n\t\toptFns = append(optFns, optFn)\n\t}\n\n\t{\n\t\t// Synthesize options early to validate configuration errors sooner to ensure a token provider\n\t\t// is present if the SerialNumber was set.\n\t\tvar o stscreds.AssumeRoleOptions\n\t\tfor _, fn := range optFns {\n\t\t\tfn(&o)\n\t\t}\n\t\tif o.TokenProvider == nil && o.SerialNumber != nil {\n\t\t\treturn AssumeRoleTokenProviderNotSetError{}\n\t\t}\n\t}\n\tcfg.Credentials = stscreds.NewAssumeRoleProvider(sts.NewFromConfig(*cfg), sharedCfg.RoleARN, optFns...)\n\n\treturn nil\n}\n\n// wrapWithCredentialsCache will wrap provider with an aws.CredentialsCache\n// with the provided options if the provider is not already a\n// aws.CredentialsCache.\nfunc wrapWithCredentialsCache(\n\tctx context.Context,\n\tcfgs configs,\n\tprovider aws.CredentialsProvider,\n\toptFns ...func(options *aws.CredentialsCacheOptions),\n) (aws.CredentialsProvider, error) {\n\t_, ok := provider.(*aws.CredentialsCache)\n\tif ok {\n\t\treturn provider, nil\n\t}\n\n\tcredCacheOptions, optionsFound, err := getCredentialsCacheOptionsProvider(ctx, cfgs)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// force allocation of a new slice if the additional options are\n\t// needed, to prevent overwriting the passed in slice of options.\n\toptFns = optFns[:len(optFns):len(optFns)]\n\tif optionsFound {\n\t\toptFns = append(optFns, credCacheOptions)\n\t}\n\n\treturn aws.NewCredentialsCache(provider, optFns...), nil\n}\n\n// credentialSource stores the chain of providers that was used to create an instance of\n// a credentials provider on the context\ntype credentialSource struct{}\n\nfunc addCredentialSource(ctx context.Context, source aws.CredentialSource) context.Context {\n\texisting, ok := ctx.Value(credentialSource{}).([]aws.CredentialSource)\n\tif !ok {\n\t\texisting = []aws.CredentialSource{source}\n\t} else {\n\t\texisting = append(existing, source)\n\t}\n\treturn context.WithValue(ctx, credentialSource{}, existing)\n}\n\nfunc getCredentialSources(ctx context.Context) []aws.CredentialSource {\n\treturn ctx.Value(credentialSource{}).([]aws.CredentialSource)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/config/shared_config.go",
    "content": "package config\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/feature/ec2/imds\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/ini\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/shareddefaults\"\n\t\"github.com/aws/smithy-go/logging\"\n\tsmithyrequestcompression \"github.com/aws/smithy-go/private/requestcompression\"\n)\n\nconst (\n\t// Prefix to use for filtering profiles. The profile prefix should only\n\t// exist in the shared config file, not the credentials file.\n\tprofilePrefix = `profile `\n\n\t// Prefix to be used for SSO sections. These are supposed to only exist in\n\t// the shared config file, not the credentials file.\n\tssoSectionPrefix = `sso-session `\n\n\t// Prefix for services section. It is referenced in profile via the services\n\t// parameter to configure clients for service-specific parameters.\n\tservicesPrefix = `services `\n\n\t// string equivalent for boolean\n\tendpointDiscoveryDisabled = `false`\n\tendpointDiscoveryEnabled  = `true`\n\tendpointDiscoveryAuto     = `auto`\n\n\t// Static Credentials group\n\taccessKeyIDKey  = `aws_access_key_id`     // group required\n\tsecretAccessKey = `aws_secret_access_key` // group required\n\tsessionTokenKey = `aws_session_token`     // optional\n\n\t// Assume Role Credentials group\n\troleArnKey             = `role_arn`          // group required\n\tsourceProfileKey       = `source_profile`    // group required\n\tcredentialSourceKey    = `credential_source` // group required (or source_profile)\n\texternalIDKey          = `external_id`       // optional\n\tmfaSerialKey           = `mfa_serial`        // optional\n\troleSessionNameKey     = `role_session_name` // optional\n\troleDurationSecondsKey = \"duration_seconds\"  // optional\n\n\t// AWS Single Sign-On (AWS SSO) group\n\tssoSessionNameKey = \"sso_session\"\n\n\tssoRegionKey   = \"sso_region\"\n\tssoStartURLKey = \"sso_start_url\"\n\n\tssoAccountIDKey = \"sso_account_id\"\n\tssoRoleNameKey  = \"sso_role_name\"\n\n\t// Additional Config fields\n\tregionKey = `region`\n\n\t// endpoint discovery group\n\tenableEndpointDiscoveryKey = `endpoint_discovery_enabled` // optional\n\n\t// External Credential process\n\tcredentialProcessKey = `credential_process` // optional\n\n\t// Web Identity Token File\n\twebIdentityTokenFileKey = `web_identity_token_file` // optional\n\n\t// S3 ARN Region Usage\n\ts3UseARNRegionKey = \"s3_use_arn_region\"\n\n\tec2MetadataServiceEndpointModeKey = \"ec2_metadata_service_endpoint_mode\"\n\n\tec2MetadataServiceEndpointKey = \"ec2_metadata_service_endpoint\"\n\n\tec2MetadataV1DisabledKey = \"ec2_metadata_v1_disabled\"\n\n\t// Use DualStack Endpoint Resolution\n\tuseDualStackEndpoint = \"use_dualstack_endpoint\"\n\n\t// DefaultSharedConfigProfile is the default profile to be used when\n\t// loading configuration from the config files if another profile name\n\t// is not provided.\n\tDefaultSharedConfigProfile = `default`\n\n\t// S3 Disable Multi-Region AccessPoints\n\ts3DisableMultiRegionAccessPointsKey = `s3_disable_multiregion_access_points`\n\n\tuseFIPSEndpointKey = \"use_fips_endpoint\"\n\n\tdefaultsModeKey = \"defaults_mode\"\n\n\t// Retry options\n\tretryMaxAttemptsKey = \"max_attempts\"\n\tretryModeKey        = \"retry_mode\"\n\n\tcaBundleKey = \"ca_bundle\"\n\n\tsdkAppID = \"sdk_ua_app_id\"\n\n\tignoreConfiguredEndpoints = \"ignore_configured_endpoint_urls\"\n\n\tendpointURL = \"endpoint_url\"\n\n\tservicesSectionKey = \"services\"\n\n\tdisableRequestCompression      = \"disable_request_compression\"\n\trequestMinCompressionSizeBytes = \"request_min_compression_size_bytes\"\n\n\ts3DisableExpressSessionAuthKey = \"s3_disable_express_session_auth\"\n\n\taccountIDKey          = \"aws_account_id\"\n\taccountIDEndpointMode = \"account_id_endpoint_mode\"\n\n\trequestChecksumCalculationKey = \"request_checksum_calculation\"\n\tresponseChecksumValidationKey = \"response_checksum_validation\"\n\tchecksumWhenSupported         = \"when_supported\"\n\tchecksumWhenRequired          = \"when_required\"\n)\n\n// defaultSharedConfigProfile allows for swapping the default profile for testing\nvar defaultSharedConfigProfile = DefaultSharedConfigProfile\n\n// DefaultSharedCredentialsFilename returns the SDK's default file path\n// for the shared credentials file.\n//\n// Builds the shared config file path based on the OS's platform.\n//\n//   - Linux/Unix: $HOME/.aws/credentials\n//   - Windows: %USERPROFILE%\\.aws\\credentials\nfunc DefaultSharedCredentialsFilename() string {\n\treturn filepath.Join(shareddefaults.UserHomeDir(), \".aws\", \"credentials\")\n}\n\n// DefaultSharedConfigFilename returns the SDK's default file path for\n// the shared config file.\n//\n// Builds the shared config file path based on the OS's platform.\n//\n//   - Linux/Unix: $HOME/.aws/config\n//   - Windows: %USERPROFILE%\\.aws\\config\nfunc DefaultSharedConfigFilename() string {\n\treturn filepath.Join(shareddefaults.UserHomeDir(), \".aws\", \"config\")\n}\n\n// DefaultSharedConfigFiles is a slice of the default shared config files that\n// the will be used in order to load the SharedConfig.\nvar DefaultSharedConfigFiles = []string{\n\tDefaultSharedConfigFilename(),\n}\n\n// DefaultSharedCredentialsFiles is a slice of the default shared credentials\n// files that the will be used in order to load the SharedConfig.\nvar DefaultSharedCredentialsFiles = []string{\n\tDefaultSharedCredentialsFilename(),\n}\n\n// SSOSession provides the shared configuration parameters of the sso-session\n// section.\ntype SSOSession struct {\n\tName        string\n\tSSORegion   string\n\tSSOStartURL string\n}\n\nfunc (s *SSOSession) setFromIniSection(section ini.Section) {\n\tupdateString(&s.Name, section, ssoSessionNameKey)\n\tupdateString(&s.SSORegion, section, ssoRegionKey)\n\tupdateString(&s.SSOStartURL, section, ssoStartURLKey)\n}\n\n// Services contains values configured in the services section\n// of the AWS configuration file.\ntype Services struct {\n\t// Services section values\n\t// {\"serviceId\": {\"key\": \"value\"}}\n\t// e.g. {\"s3\": {\"endpoint_url\": \"example.com\"}}\n\tServiceValues map[string]map[string]string\n}\n\nfunc (s *Services) setFromIniSection(section ini.Section) {\n\tif s.ServiceValues == nil {\n\t\ts.ServiceValues = make(map[string]map[string]string)\n\t}\n\tfor _, service := range section.List() {\n\t\ts.ServiceValues[service] = section.Map(service)\n\t}\n}\n\n// SharedConfig represents the configuration fields of the SDK config files.\ntype SharedConfig struct {\n\tProfile string\n\n\t// Credentials values from the config file. Both aws_access_key_id\n\t// and aws_secret_access_key must be provided together in the same file\n\t// to be considered valid. The values will be ignored if not a complete group.\n\t// aws_session_token is an optional field that can be provided if both of the\n\t// other two fields are also provided.\n\t//\n\t//\taws_access_key_id\n\t//\taws_secret_access_key\n\t//\taws_session_token\n\tCredentials aws.Credentials\n\n\tCredentialSource     string\n\tCredentialProcess    string\n\tWebIdentityTokenFile string\n\n\t// SSO session options\n\tSSOSessionName string\n\tSSOSession     *SSOSession\n\n\t// Legacy SSO session options\n\tSSORegion   string\n\tSSOStartURL string\n\n\t// SSO fields not used\n\tSSOAccountID string\n\tSSORoleName  string\n\n\tRoleARN             string\n\tExternalID          string\n\tMFASerial           string\n\tRoleSessionName     string\n\tRoleDurationSeconds *time.Duration\n\n\tSourceProfileName string\n\tSource            *SharedConfig\n\n\t// Region is the region the SDK should use for looking up AWS service endpoints\n\t// and signing requests.\n\t//\n\t//\tregion = us-west-2\n\tRegion string\n\n\t// EnableEndpointDiscovery can be enabled or disabled in the shared config\n\t// by setting endpoint_discovery_enabled to true, or false respectively.\n\t//\n\t//\tendpoint_discovery_enabled = true\n\tEnableEndpointDiscovery aws.EndpointDiscoveryEnableState\n\n\t// Specifies if the S3 service should allow ARNs to direct the region\n\t// the client's requests are sent to.\n\t//\n\t// s3_use_arn_region=true\n\tS3UseARNRegion *bool\n\n\t// Specifies the EC2 Instance Metadata Service default endpoint selection\n\t// mode (IPv4 or IPv6)\n\t//\n\t// ec2_metadata_service_endpoint_mode=IPv6\n\tEC2IMDSEndpointMode imds.EndpointModeState\n\n\t// Specifies the EC2 Instance Metadata Service endpoint to use. If\n\t// specified it overrides EC2IMDSEndpointMode.\n\t//\n\t// ec2_metadata_service_endpoint=http://fd00:ec2::254\n\tEC2IMDSEndpoint string\n\n\t// Specifies that IMDS clients should not fallback to IMDSv1 if token\n\t// requests fail.\n\t//\n\t// ec2_metadata_v1_disabled=true\n\tEC2IMDSv1Disabled *bool\n\n\t// Specifies if the S3 service should disable support for Multi-Region\n\t// access-points\n\t//\n\t// s3_disable_multiregion_access_points=true\n\tS3DisableMultiRegionAccessPoints *bool\n\n\t// Specifies that SDK clients must resolve a dual-stack endpoint for\n\t// services.\n\t//\n\t// use_dualstack_endpoint=true\n\tUseDualStackEndpoint aws.DualStackEndpointState\n\n\t// Specifies that SDK clients must resolve a FIPS endpoint for\n\t// services.\n\t//\n\t// use_fips_endpoint=true\n\tUseFIPSEndpoint aws.FIPSEndpointState\n\n\t// Specifies which defaults mode should be used by services.\n\t//\n\t// defaults_mode=standard\n\tDefaultsMode aws.DefaultsMode\n\n\t// Specifies the maximum number attempts an API client will call an\n\t// operation that fails with a retryable error.\n\t//\n\t// max_attempts=3\n\tRetryMaxAttempts int\n\n\t// Specifies the retry model the API client will be created with.\n\t//\n\t// retry_mode=standard\n\tRetryMode aws.RetryMode\n\n\t// Sets the path to a custom Credentials Authority (CA) Bundle PEM file\n\t// that the SDK will use instead of the system's root CA bundle. Only use\n\t// this if you want to configure the SDK to use a custom set of CAs.\n\t//\n\t// Enabling this option will attempt to merge the Transport into the SDK's\n\t// HTTP client. If the client's Transport is not a http.Transport an error\n\t// will be returned. If the Transport's TLS config is set this option will\n\t// cause the SDK to overwrite the Transport's TLS config's  RootCAs value.\n\t//\n\t// Setting a custom HTTPClient in the aws.Config options will override this\n\t// setting. To use this option and custom HTTP client, the HTTP client\n\t// needs to be provided when creating the config. Not the service client.\n\t//\n\t//  ca_bundle=$HOME/my_custom_ca_bundle\n\tCustomCABundle string\n\n\t// aws sdk app ID that can be added to user agent header string\n\tAppID string\n\n\t// Flag used to disable configured endpoints.\n\tIgnoreConfiguredEndpoints *bool\n\n\t// Value to contain configured endpoints to be propagated to\n\t// corresponding endpoint resolution field.\n\tBaseEndpoint string\n\n\t// Services section config.\n\tServicesSectionName string\n\tServices            Services\n\n\t// determine if request compression is allowed, default to false\n\t// retrieved from config file's profile field disable_request_compression\n\tDisableRequestCompression *bool\n\n\t// inclusive threshold request body size to trigger compression,\n\t// default to 10240 and must be within 0 and 10485760 bytes inclusive\n\t// retrieved from config file's profile field request_min_compression_size_bytes\n\tRequestMinCompressSizeBytes *int64\n\n\t// Whether S3Express auth is disabled.\n\t//\n\t// This will NOT prevent requests from being made to S3Express buckets, it\n\t// will only bypass the modified endpoint routing and signing behaviors\n\t// associated with the feature.\n\tS3DisableExpressAuth *bool\n\n\tAccountIDEndpointMode aws.AccountIDEndpointMode\n\n\t// RequestChecksumCalculation indicates if the request checksum should be calculated\n\tRequestChecksumCalculation aws.RequestChecksumCalculation\n\n\t// ResponseChecksumValidation indicates if the response checksum should be validated\n\tResponseChecksumValidation aws.ResponseChecksumValidation\n}\n\nfunc (c SharedConfig) getDefaultsMode(ctx context.Context) (value aws.DefaultsMode, ok bool, err error) {\n\tif len(c.DefaultsMode) == 0 {\n\t\treturn \"\", false, nil\n\t}\n\n\treturn c.DefaultsMode, true, nil\n}\n\n// GetRetryMaxAttempts returns the maximum number of attempts an API client\n// created Retryer should attempt an operation call before failing.\nfunc (c SharedConfig) GetRetryMaxAttempts(ctx context.Context) (value int, ok bool, err error) {\n\tif c.RetryMaxAttempts == 0 {\n\t\treturn 0, false, nil\n\t}\n\n\treturn c.RetryMaxAttempts, true, nil\n}\n\n// GetRetryMode returns the model the API client should create its Retryer in.\nfunc (c SharedConfig) GetRetryMode(ctx context.Context) (value aws.RetryMode, ok bool, err error) {\n\tif len(c.RetryMode) == 0 {\n\t\treturn \"\", false, nil\n\t}\n\n\treturn c.RetryMode, true, nil\n}\n\n// GetS3UseARNRegion returns if the S3 service should allow ARNs to direct the region\n// the client's requests are sent to.\nfunc (c SharedConfig) GetS3UseARNRegion(ctx context.Context) (value, ok bool, err error) {\n\tif c.S3UseARNRegion == nil {\n\t\treturn false, false, nil\n\t}\n\n\treturn *c.S3UseARNRegion, true, nil\n}\n\n// GetEnableEndpointDiscovery returns if the enable_endpoint_discovery is set.\nfunc (c SharedConfig) GetEnableEndpointDiscovery(ctx context.Context) (value aws.EndpointDiscoveryEnableState, ok bool, err error) {\n\tif c.EnableEndpointDiscovery == aws.EndpointDiscoveryUnset {\n\t\treturn aws.EndpointDiscoveryUnset, false, nil\n\t}\n\n\treturn c.EnableEndpointDiscovery, true, nil\n}\n\n// GetS3DisableMultiRegionAccessPoints returns if the S3 service should disable support for Multi-Region\n// access-points.\nfunc (c SharedConfig) GetS3DisableMultiRegionAccessPoints(ctx context.Context) (value, ok bool, err error) {\n\tif c.S3DisableMultiRegionAccessPoints == nil {\n\t\treturn false, false, nil\n\t}\n\n\treturn *c.S3DisableMultiRegionAccessPoints, true, nil\n}\n\n// GetRegion returns the region for the profile if a region is set.\nfunc (c SharedConfig) getRegion(ctx context.Context) (string, bool, error) {\n\tif len(c.Region) == 0 {\n\t\treturn \"\", false, nil\n\t}\n\treturn c.Region, true, nil\n}\n\n// GetCredentialsProvider returns the credentials for a profile if they were set.\nfunc (c SharedConfig) getCredentialsProvider() (aws.Credentials, bool, error) {\n\treturn c.Credentials, true, nil\n}\n\n// GetEC2IMDSEndpointMode implements a EC2IMDSEndpointMode option resolver interface.\nfunc (c SharedConfig) GetEC2IMDSEndpointMode() (imds.EndpointModeState, bool, error) {\n\tif c.EC2IMDSEndpointMode == imds.EndpointModeStateUnset {\n\t\treturn imds.EndpointModeStateUnset, false, nil\n\t}\n\n\treturn c.EC2IMDSEndpointMode, true, nil\n}\n\n// GetEC2IMDSEndpoint implements a EC2IMDSEndpoint option resolver interface.\nfunc (c SharedConfig) GetEC2IMDSEndpoint() (string, bool, error) {\n\tif len(c.EC2IMDSEndpoint) == 0 {\n\t\treturn \"\", false, nil\n\t}\n\n\treturn c.EC2IMDSEndpoint, true, nil\n}\n\n// GetEC2IMDSV1FallbackDisabled implements an EC2IMDSV1FallbackDisabled option\n// resolver interface.\nfunc (c SharedConfig) GetEC2IMDSV1FallbackDisabled() (bool, bool) {\n\tif c.EC2IMDSv1Disabled == nil {\n\t\treturn false, false\n\t}\n\n\treturn *c.EC2IMDSv1Disabled, true\n}\n\n// GetUseDualStackEndpoint returns whether the service's dual-stack endpoint should be\n// used for requests.\nfunc (c SharedConfig) GetUseDualStackEndpoint(ctx context.Context) (value aws.DualStackEndpointState, found bool, err error) {\n\tif c.UseDualStackEndpoint == aws.DualStackEndpointStateUnset {\n\t\treturn aws.DualStackEndpointStateUnset, false, nil\n\t}\n\n\treturn c.UseDualStackEndpoint, true, nil\n}\n\n// GetUseFIPSEndpoint returns whether the service's FIPS endpoint should be\n// used for requests.\nfunc (c SharedConfig) GetUseFIPSEndpoint(ctx context.Context) (value aws.FIPSEndpointState, found bool, err error) {\n\tif c.UseFIPSEndpoint == aws.FIPSEndpointStateUnset {\n\t\treturn aws.FIPSEndpointStateUnset, false, nil\n\t}\n\n\treturn c.UseFIPSEndpoint, true, nil\n}\n\n// GetS3DisableExpressAuth returns the configured value for\n// [SharedConfig.S3DisableExpressAuth].\nfunc (c SharedConfig) GetS3DisableExpressAuth() (value, ok bool) {\n\tif c.S3DisableExpressAuth == nil {\n\t\treturn false, false\n\t}\n\n\treturn *c.S3DisableExpressAuth, true\n}\n\n// GetCustomCABundle returns the custom CA bundle's PEM bytes if the file was\nfunc (c SharedConfig) getCustomCABundle(context.Context) (io.Reader, bool, error) {\n\tif len(c.CustomCABundle) == 0 {\n\t\treturn nil, false, nil\n\t}\n\n\tb, err := ioutil.ReadFile(c.CustomCABundle)\n\tif err != nil {\n\t\treturn nil, false, err\n\t}\n\treturn bytes.NewReader(b), true, nil\n}\n\n// getAppID returns the sdk app ID if set in shared config profile\nfunc (c SharedConfig) getAppID(context.Context) (string, bool, error) {\n\treturn c.AppID, len(c.AppID) > 0, nil\n}\n\n// GetIgnoreConfiguredEndpoints is used in knowing when to disable configured\n// endpoints feature.\nfunc (c SharedConfig) GetIgnoreConfiguredEndpoints(context.Context) (bool, bool, error) {\n\tif c.IgnoreConfiguredEndpoints == nil {\n\t\treturn false, false, nil\n\t}\n\n\treturn *c.IgnoreConfiguredEndpoints, true, nil\n}\n\nfunc (c SharedConfig) getBaseEndpoint(context.Context) (string, bool, error) {\n\treturn c.BaseEndpoint, len(c.BaseEndpoint) > 0, nil\n}\n\n// GetServiceBaseEndpoint is used to retrieve a normalized SDK ID for use\n// with configured endpoints.\nfunc (c SharedConfig) GetServiceBaseEndpoint(ctx context.Context, sdkID string) (string, bool, error) {\n\tif service, ok := c.Services.ServiceValues[normalizeShared(sdkID)]; ok {\n\t\tif endpt, ok := service[endpointURL]; ok {\n\t\t\treturn endpt, true, nil\n\t\t}\n\t}\n\treturn \"\", false, nil\n}\n\nfunc normalizeShared(sdkID string) string {\n\tlower := strings.ToLower(sdkID)\n\treturn strings.ReplaceAll(lower, \" \", \"_\")\n}\n\nfunc (c SharedConfig) getServicesObject(context.Context) (map[string]map[string]string, bool, error) {\n\treturn c.Services.ServiceValues, c.Services.ServiceValues != nil, nil\n}\n\n// loadSharedConfigIgnoreNotExist is an alias for loadSharedConfig with the\n// addition of ignoring when none of the files exist or when the profile\n// is not found in any of the files.\nfunc loadSharedConfigIgnoreNotExist(ctx context.Context, configs configs) (Config, error) {\n\tcfg, err := loadSharedConfig(ctx, configs)\n\tif err != nil {\n\t\tif _, ok := err.(SharedConfigProfileNotExistError); ok {\n\t\t\treturn SharedConfig{}, nil\n\t\t}\n\t\treturn nil, err\n\t}\n\n\treturn cfg, nil\n}\n\n// loadSharedConfig uses the configs passed in to load the SharedConfig from file\n// The file names and profile name are sourced from the configs.\n//\n// If profile name is not provided DefaultSharedConfigProfile (default) will\n// be used.\n//\n// If shared config filenames are not provided DefaultSharedConfigFiles will\n// be used.\n//\n// Config providers used:\n// * sharedConfigProfileProvider\n// * sharedConfigFilesProvider\nfunc loadSharedConfig(ctx context.Context, configs configs) (Config, error) {\n\tvar profile string\n\tvar configFiles []string\n\tvar credentialsFiles []string\n\tvar ok bool\n\tvar err error\n\n\tprofile, ok, err = getSharedConfigProfile(ctx, configs)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif !ok {\n\t\tprofile = defaultSharedConfigProfile\n\t}\n\n\tconfigFiles, ok, err = getSharedConfigFiles(ctx, configs)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tcredentialsFiles, ok, err = getSharedCredentialsFiles(ctx, configs)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// setup logger if log configuration warning is seti\n\tvar logger logging.Logger\n\tlogWarnings, found, err := getLogConfigurationWarnings(ctx, configs)\n\tif err != nil {\n\t\treturn SharedConfig{}, err\n\t}\n\tif found && logWarnings {\n\t\tlogger, found, err = getLogger(ctx, configs)\n\t\tif err != nil {\n\t\t\treturn SharedConfig{}, err\n\t\t}\n\t\tif !found {\n\t\t\tlogger = logging.NewStandardLogger(os.Stderr)\n\t\t}\n\t}\n\n\treturn LoadSharedConfigProfile(ctx, profile,\n\t\tfunc(o *LoadSharedConfigOptions) {\n\t\t\to.Logger = logger\n\t\t\to.ConfigFiles = configFiles\n\t\t\to.CredentialsFiles = credentialsFiles\n\t\t},\n\t)\n}\n\n// LoadSharedConfigOptions struct contains optional values that can be used to load the config.\ntype LoadSharedConfigOptions struct {\n\n\t// CredentialsFiles are the shared credentials files\n\tCredentialsFiles []string\n\n\t// ConfigFiles are the shared config files\n\tConfigFiles []string\n\n\t// Logger is the logger used to log shared config behavior\n\tLogger logging.Logger\n}\n\n// LoadSharedConfigProfile retrieves the configuration from the list of files\n// using the profile provided. The order the files are listed will determine\n// precedence. Values in subsequent files will overwrite values defined in\n// earlier files.\n//\n// For example, given two files A and B. Both define credentials. If the order\n// of the files are A then B, B's credential values will be used instead of A's.\n//\n// If config files are not set, SDK will default to using a file at location `.aws/config` if present.\n// If credentials files are not set, SDK will default to using a file at location `.aws/credentials` if present.\n// No default files are set, if files set to an empty slice.\n//\n// You can read more about shared config and credentials file location at\n// https://docs.aws.amazon.com/credref/latest/refdocs/file-location.html#file-location\nfunc LoadSharedConfigProfile(ctx context.Context, profile string, optFns ...func(*LoadSharedConfigOptions)) (SharedConfig, error) {\n\tvar option LoadSharedConfigOptions\n\tfor _, fn := range optFns {\n\t\tfn(&option)\n\t}\n\n\tif option.ConfigFiles == nil {\n\t\toption.ConfigFiles = DefaultSharedConfigFiles\n\t}\n\n\tif option.CredentialsFiles == nil {\n\t\toption.CredentialsFiles = DefaultSharedCredentialsFiles\n\t}\n\n\t// load shared configuration sections from shared configuration INI options\n\tconfigSections, err := loadIniFiles(option.ConfigFiles)\n\tif err != nil {\n\t\treturn SharedConfig{}, err\n\t}\n\n\t// check for profile prefix and drop duplicates or invalid profiles\n\terr = processConfigSections(ctx, &configSections, option.Logger)\n\tif err != nil {\n\t\treturn SharedConfig{}, err\n\t}\n\n\t// load shared credentials sections from shared credentials INI options\n\tcredentialsSections, err := loadIniFiles(option.CredentialsFiles)\n\tif err != nil {\n\t\treturn SharedConfig{}, err\n\t}\n\n\t// check for profile prefix and drop duplicates or invalid profiles\n\terr = processCredentialsSections(ctx, &credentialsSections, option.Logger)\n\tif err != nil {\n\t\treturn SharedConfig{}, err\n\t}\n\n\terr = mergeSections(&configSections, credentialsSections)\n\tif err != nil {\n\t\treturn SharedConfig{}, err\n\t}\n\n\tcfg := SharedConfig{}\n\tprofiles := map[string]struct{}{}\n\n\tif err = cfg.setFromIniSections(profiles, profile, configSections, option.Logger); err != nil {\n\t\treturn SharedConfig{}, err\n\t}\n\n\treturn cfg, nil\n}\n\nfunc processConfigSections(ctx context.Context, sections *ini.Sections, logger logging.Logger) error {\n\tskipSections := map[string]struct{}{}\n\n\tfor _, section := range sections.List() {\n\t\tif _, ok := skipSections[section]; ok {\n\t\t\tcontinue\n\t\t}\n\n\t\t// drop sections from config file that do not have expected prefixes.\n\t\tswitch {\n\t\tcase strings.HasPrefix(section, profilePrefix):\n\t\t\t// Rename sections to remove \"profile \" prefixing to match with\n\t\t\t// credentials file. If default is already present, it will be\n\t\t\t// dropped.\n\t\t\tnewName, err := renameProfileSection(section, sections, logger)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to rename profile section, %w\", err)\n\t\t\t}\n\t\t\tskipSections[newName] = struct{}{}\n\n\t\tcase strings.HasPrefix(section, ssoSectionPrefix):\n\t\tcase strings.HasPrefix(section, servicesPrefix):\n\t\tcase strings.EqualFold(section, \"default\"):\n\t\tdefault:\n\t\t\t// drop this section, as invalid profile name\n\t\t\tsections.DeleteSection(section)\n\n\t\t\tif logger != nil {\n\t\t\t\tlogger.Logf(logging.Debug, \"A profile defined with name `%v` is ignored. \"+\n\t\t\t\t\t\"For use within a shared configuration file, \"+\n\t\t\t\t\t\"a non-default profile must have `profile ` \"+\n\t\t\t\t\t\"prefixed to the profile name.\",\n\t\t\t\t\tsection,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc renameProfileSection(section string, sections *ini.Sections, logger logging.Logger) (string, error) {\n\tv, ok := sections.GetSection(section)\n\tif !ok {\n\t\treturn \"\", fmt.Errorf(\"error processing profiles within the shared configuration files\")\n\t}\n\n\t// delete section with profile as prefix\n\tsections.DeleteSection(section)\n\n\t// set the value to non-prefixed name in sections.\n\tsection = strings.TrimPrefix(section, profilePrefix)\n\tif sections.HasSection(section) {\n\t\toldSection, _ := sections.GetSection(section)\n\t\tv.Logs = append(v.Logs,\n\t\t\tfmt.Sprintf(\"A non-default profile not prefixed with `profile ` found in %s, \"+\n\t\t\t\t\"overriding non-default profile from %s\",\n\t\t\t\tv.SourceFile, oldSection.SourceFile))\n\t\tsections.DeleteSection(section)\n\t}\n\n\t// assign non-prefixed name to section\n\tv.Name = section\n\tsections.SetSection(section, v)\n\n\treturn section, nil\n}\n\nfunc processCredentialsSections(ctx context.Context, sections *ini.Sections, logger logging.Logger) error {\n\tfor _, section := range sections.List() {\n\t\t// drop profiles with prefix for credential files\n\t\tif strings.HasPrefix(section, profilePrefix) {\n\t\t\t// drop this section, as invalid profile name\n\t\t\tsections.DeleteSection(section)\n\n\t\t\tif logger != nil {\n\t\t\t\tlogger.Logf(logging.Debug,\n\t\t\t\t\t\"The profile defined with name `%v` is ignored. A profile with the `profile ` prefix is invalid \"+\n\t\t\t\t\t\t\"for the shared credentials file.\\n\",\n\t\t\t\t\tsection,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc loadIniFiles(filenames []string) (ini.Sections, error) {\n\tmergedSections := ini.NewSections()\n\n\tfor _, filename := range filenames {\n\t\tsections, err := ini.OpenFile(filename)\n\t\tvar v *ini.UnableToReadFile\n\t\tif ok := errors.As(err, &v); ok {\n\t\t\t// Skip files which can't be opened and read for whatever reason.\n\t\t\t// We treat such files as empty, and do not fall back to other locations.\n\t\t\tcontinue\n\t\t} else if err != nil {\n\t\t\treturn ini.Sections{}, SharedConfigLoadError{Filename: filename, Err: err}\n\t\t}\n\n\t\t// mergeSections into mergedSections\n\t\terr = mergeSections(&mergedSections, sections)\n\t\tif err != nil {\n\t\t\treturn ini.Sections{}, SharedConfigLoadError{Filename: filename, Err: err}\n\t\t}\n\t}\n\n\treturn mergedSections, nil\n}\n\n// mergeSections merges source section properties into destination section properties\nfunc mergeSections(dst *ini.Sections, src ini.Sections) error {\n\tfor _, sectionName := range src.List() {\n\t\tsrcSection, _ := src.GetSection(sectionName)\n\n\t\tif (!srcSection.Has(accessKeyIDKey) && srcSection.Has(secretAccessKey)) ||\n\t\t\t(srcSection.Has(accessKeyIDKey) && !srcSection.Has(secretAccessKey)) {\n\t\t\tsrcSection.Errors = append(srcSection.Errors,\n\t\t\t\tfmt.Errorf(\"partial credentials found for profile %v\", sectionName))\n\t\t}\n\n\t\tif !dst.HasSection(sectionName) {\n\t\t\tdst.SetSection(sectionName, srcSection)\n\t\t\tcontinue\n\t\t}\n\n\t\t// merge with destination srcSection\n\t\tdstSection, _ := dst.GetSection(sectionName)\n\n\t\t// errors should be overriden if any\n\t\tdstSection.Errors = srcSection.Errors\n\n\t\t// Access key id update\n\t\tif srcSection.Has(accessKeyIDKey) && srcSection.Has(secretAccessKey) {\n\t\t\taccessKey := srcSection.String(accessKeyIDKey)\n\t\t\tsecretKey := srcSection.String(secretAccessKey)\n\n\t\t\tif dstSection.Has(accessKeyIDKey) {\n\t\t\t\tdstSection.Logs = append(dstSection.Logs, newMergeKeyLogMessage(sectionName, accessKeyIDKey,\n\t\t\t\t\tdstSection.SourceFile[accessKeyIDKey], srcSection.SourceFile[accessKeyIDKey]))\n\t\t\t}\n\n\t\t\t// update access key\n\t\t\tv, err := ini.NewStringValue(accessKey)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"error merging access key, %w\", err)\n\t\t\t}\n\t\t\tdstSection.UpdateValue(accessKeyIDKey, v)\n\n\t\t\t// update secret key\n\t\t\tv, err = ini.NewStringValue(secretKey)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"error merging secret key, %w\", err)\n\t\t\t}\n\t\t\tdstSection.UpdateValue(secretAccessKey, v)\n\n\t\t\t// update session token\n\t\t\tif err = mergeStringKey(&srcSection, &dstSection, sectionName, sessionTokenKey); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// update source file to reflect where the static creds came from\n\t\t\tdstSection.UpdateSourceFile(accessKeyIDKey, srcSection.SourceFile[accessKeyIDKey])\n\t\t\tdstSection.UpdateSourceFile(secretAccessKey, srcSection.SourceFile[secretAccessKey])\n\t\t}\n\n\t\tstringKeys := []string{\n\t\t\troleArnKey,\n\t\t\tsourceProfileKey,\n\t\t\tcredentialSourceKey,\n\t\t\texternalIDKey,\n\t\t\tmfaSerialKey,\n\t\t\troleSessionNameKey,\n\t\t\tregionKey,\n\t\t\tenableEndpointDiscoveryKey,\n\t\t\tcredentialProcessKey,\n\t\t\twebIdentityTokenFileKey,\n\t\t\ts3UseARNRegionKey,\n\t\t\ts3DisableMultiRegionAccessPointsKey,\n\t\t\tec2MetadataServiceEndpointModeKey,\n\t\t\tec2MetadataServiceEndpointKey,\n\t\t\tec2MetadataV1DisabledKey,\n\t\t\tuseDualStackEndpoint,\n\t\t\tuseFIPSEndpointKey,\n\t\t\tdefaultsModeKey,\n\t\t\tretryModeKey,\n\t\t\tcaBundleKey,\n\t\t\troleDurationSecondsKey,\n\t\t\tretryMaxAttemptsKey,\n\n\t\t\tssoSessionNameKey,\n\t\t\tssoAccountIDKey,\n\t\t\tssoRegionKey,\n\t\t\tssoRoleNameKey,\n\t\t\tssoStartURLKey,\n\t\t}\n\t\tfor i := range stringKeys {\n\t\t\tif err := mergeStringKey(&srcSection, &dstSection, sectionName, stringKeys[i]); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\t// set srcSection on dst srcSection\n\t\t*dst = dst.SetSection(sectionName, dstSection)\n\t}\n\n\treturn nil\n}\n\nfunc mergeStringKey(srcSection *ini.Section, dstSection *ini.Section, sectionName, key string) error {\n\tif srcSection.Has(key) {\n\t\tsrcValue := srcSection.String(key)\n\t\tval, err := ini.NewStringValue(srcValue)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error merging %s, %w\", key, err)\n\t\t}\n\n\t\tif dstSection.Has(key) {\n\t\t\tdstSection.Logs = append(dstSection.Logs, newMergeKeyLogMessage(sectionName, key,\n\t\t\t\tdstSection.SourceFile[key], srcSection.SourceFile[key]))\n\t\t}\n\n\t\tdstSection.UpdateValue(key, val)\n\t\tdstSection.UpdateSourceFile(key, srcSection.SourceFile[key])\n\t}\n\treturn nil\n}\n\nfunc newMergeKeyLogMessage(sectionName, key, dstSourceFile, srcSourceFile string) string {\n\treturn fmt.Sprintf(\"For profile: %v, overriding %v value, defined in %v \"+\n\t\t\"with a %v value found in a duplicate profile defined at file %v. \\n\",\n\t\tsectionName, key, dstSourceFile, key, srcSourceFile)\n}\n\n// Returns an error if all of the files fail to load. If at least one file is\n// successfully loaded and contains the profile, no error will be returned.\nfunc (c *SharedConfig) setFromIniSections(profiles map[string]struct{}, profile string,\n\tsections ini.Sections, logger logging.Logger) error {\n\tc.Profile = profile\n\n\tsection, ok := sections.GetSection(profile)\n\tif !ok {\n\t\treturn SharedConfigProfileNotExistError{\n\t\t\tProfile: profile,\n\t\t}\n\t}\n\n\t// if logs are appended to the section, log them\n\tif section.Logs != nil && logger != nil {\n\t\tfor _, log := range section.Logs {\n\t\t\tlogger.Logf(logging.Debug, log)\n\t\t}\n\t}\n\n\t// set config from the provided INI section\n\terr := c.setFromIniSection(profile, section)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error fetching config from profile, %v, %w\", profile, err)\n\t}\n\n\tif _, ok := profiles[profile]; ok {\n\t\t// if this is the second instance of the profile the Assume Role\n\t\t// options must be cleared because they are only valid for the\n\t\t// first reference of a profile. The self linked instance of the\n\t\t// profile only have credential provider options.\n\t\tc.clearAssumeRoleOptions()\n\t} else {\n\t\t// First time a profile has been seen. Assert if the credential type\n\t\t// requires a role ARN, the ARN is also set\n\t\tif err := c.validateCredentialsConfig(profile); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// if not top level profile and has credentials, return with credentials.\n\tif len(profiles) != 0 && c.Credentials.HasKeys() {\n\t\treturn nil\n\t}\n\n\tprofiles[profile] = struct{}{}\n\n\t// validate no colliding credentials type are present\n\tif err := c.validateCredentialType(); err != nil {\n\t\treturn err\n\t}\n\n\t// Link source profiles for assume roles\n\tif len(c.SourceProfileName) != 0 {\n\t\t// Linked profile via source_profile ignore credential provider\n\t\t// options, the source profile must provide the credentials.\n\t\tc.clearCredentialOptions()\n\n\t\tsrcCfg := &SharedConfig{}\n\t\terr := srcCfg.setFromIniSections(profiles, c.SourceProfileName, sections, logger)\n\t\tif err != nil {\n\t\t\t// SourceProfileName that doesn't exist is an error in configuration.\n\t\t\tif _, ok := err.(SharedConfigProfileNotExistError); ok {\n\t\t\t\terr = SharedConfigAssumeRoleError{\n\t\t\t\t\tRoleARN: c.RoleARN,\n\t\t\t\t\tProfile: c.SourceProfileName,\n\t\t\t\t\tErr:     err,\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\n\t\tif !srcCfg.hasCredentials() {\n\t\t\treturn SharedConfigAssumeRoleError{\n\t\t\t\tRoleARN: c.RoleARN,\n\t\t\t\tProfile: c.SourceProfileName,\n\t\t\t}\n\t\t}\n\n\t\tc.Source = srcCfg\n\t}\n\n\t// If the profile contains an SSO session parameter, the session MUST exist\n\t// as a section in the config file. Load the SSO session using the name\n\t// provided. If the session section is not found or incomplete an error\n\t// will be returned.\n\tif c.hasSSOTokenProviderConfiguration() {\n\t\tsection, ok := sections.GetSection(ssoSectionPrefix + strings.TrimSpace(c.SSOSessionName))\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"failed to find SSO session section, %v\", c.SSOSessionName)\n\t\t}\n\t\tvar ssoSession SSOSession\n\t\tssoSession.setFromIniSection(section)\n\t\tssoSession.Name = c.SSOSessionName\n\t\tc.SSOSession = &ssoSession\n\t}\n\n\tif len(c.ServicesSectionName) > 0 {\n\t\tif section, ok := sections.GetSection(servicesPrefix + c.ServicesSectionName); ok {\n\t\t\tvar svcs Services\n\t\t\tsvcs.setFromIniSection(section)\n\t\t\tc.Services = svcs\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// setFromIniSection loads the configuration from the profile section defined in\n// the provided INI file. A SharedConfig pointer type value is used so that\n// multiple config file loadings can be chained.\n//\n// Only loads complete logically grouped values, and will not set fields in cfg\n// for incomplete grouped values in the config. Such as credentials. For example\n// if a config file only includes aws_access_key_id but no aws_secret_access_key\n// the aws_access_key_id will be ignored.\nfunc (c *SharedConfig) setFromIniSection(profile string, section ini.Section) error {\n\tif len(section.Name) == 0 {\n\t\tsources := make([]string, 0)\n\t\tfor _, v := range section.SourceFile {\n\t\t\tsources = append(sources, v)\n\t\t}\n\n\t\treturn fmt.Errorf(\"parsing error : could not find profile section name after processing files: %v\", sources)\n\t}\n\n\tif len(section.Errors) != 0 {\n\t\tvar errStatement string\n\t\tfor i, e := range section.Errors {\n\t\t\terrStatement = fmt.Sprintf(\"%d, %v\\n\", i+1, e.Error())\n\t\t}\n\t\treturn fmt.Errorf(\"Error using profile: \\n %v\", errStatement)\n\t}\n\n\t// Assume Role\n\tupdateString(&c.RoleARN, section, roleArnKey)\n\tupdateString(&c.ExternalID, section, externalIDKey)\n\tupdateString(&c.MFASerial, section, mfaSerialKey)\n\tupdateString(&c.RoleSessionName, section, roleSessionNameKey)\n\tupdateString(&c.SourceProfileName, section, sourceProfileKey)\n\tupdateString(&c.CredentialSource, section, credentialSourceKey)\n\tupdateString(&c.Region, section, regionKey)\n\n\t// AWS Single Sign-On (AWS SSO)\n\t// SSO session options\n\tupdateString(&c.SSOSessionName, section, ssoSessionNameKey)\n\n\t// Legacy SSO session options\n\tupdateString(&c.SSORegion, section, ssoRegionKey)\n\tupdateString(&c.SSOStartURL, section, ssoStartURLKey)\n\n\t// SSO fields not used\n\tupdateString(&c.SSOAccountID, section, ssoAccountIDKey)\n\tupdateString(&c.SSORoleName, section, ssoRoleNameKey)\n\n\t// we're retaining a behavioral quirk with this field that existed before\n\t// the removal of literal parsing for #2276:\n\t//   - if the key is missing, the config field will not be set\n\t//   - if the key is set to a non-numeric, the config field will be set to 0\n\tif section.Has(roleDurationSecondsKey) {\n\t\tif v, ok := section.Int(roleDurationSecondsKey); ok {\n\t\t\tc.RoleDurationSeconds = aws.Duration(time.Duration(v) * time.Second)\n\t\t} else {\n\t\t\tc.RoleDurationSeconds = aws.Duration(time.Duration(0))\n\t\t}\n\t}\n\n\tupdateString(&c.CredentialProcess, section, credentialProcessKey)\n\tupdateString(&c.WebIdentityTokenFile, section, webIdentityTokenFileKey)\n\n\tupdateEndpointDiscoveryType(&c.EnableEndpointDiscovery, section, enableEndpointDiscoveryKey)\n\tupdateBoolPtr(&c.S3UseARNRegion, section, s3UseARNRegionKey)\n\tupdateBoolPtr(&c.S3DisableMultiRegionAccessPoints, section, s3DisableMultiRegionAccessPointsKey)\n\tupdateBoolPtr(&c.S3DisableExpressAuth, section, s3DisableExpressSessionAuthKey)\n\n\tif err := updateEC2MetadataServiceEndpointMode(&c.EC2IMDSEndpointMode, section, ec2MetadataServiceEndpointModeKey); err != nil {\n\t\treturn fmt.Errorf(\"failed to load %s from shared config, %v\", ec2MetadataServiceEndpointModeKey, err)\n\t}\n\tupdateString(&c.EC2IMDSEndpoint, section, ec2MetadataServiceEndpointKey)\n\tupdateBoolPtr(&c.EC2IMDSv1Disabled, section, ec2MetadataV1DisabledKey)\n\n\tupdateUseDualStackEndpoint(&c.UseDualStackEndpoint, section, useDualStackEndpoint)\n\tupdateUseFIPSEndpoint(&c.UseFIPSEndpoint, section, useFIPSEndpointKey)\n\n\tif err := updateDefaultsMode(&c.DefaultsMode, section, defaultsModeKey); err != nil {\n\t\treturn fmt.Errorf(\"failed to load %s from shared config, %w\", defaultsModeKey, err)\n\t}\n\n\tif err := updateInt(&c.RetryMaxAttempts, section, retryMaxAttemptsKey); err != nil {\n\t\treturn fmt.Errorf(\"failed to load %s from shared config, %w\", retryMaxAttemptsKey, err)\n\t}\n\tif err := updateRetryMode(&c.RetryMode, section, retryModeKey); err != nil {\n\t\treturn fmt.Errorf(\"failed to load %s from shared config, %w\", retryModeKey, err)\n\t}\n\n\tupdateString(&c.CustomCABundle, section, caBundleKey)\n\n\t// user agent app ID added to request User-Agent header\n\tupdateString(&c.AppID, section, sdkAppID)\n\n\tupdateBoolPtr(&c.IgnoreConfiguredEndpoints, section, ignoreConfiguredEndpoints)\n\n\tupdateString(&c.BaseEndpoint, section, endpointURL)\n\n\tif err := updateDisableRequestCompression(&c.DisableRequestCompression, section, disableRequestCompression); err != nil {\n\t\treturn fmt.Errorf(\"failed to load %s from shared config, %w\", disableRequestCompression, err)\n\t}\n\tif err := updateRequestMinCompressSizeBytes(&c.RequestMinCompressSizeBytes, section, requestMinCompressionSizeBytes); err != nil {\n\t\treturn fmt.Errorf(\"failed to load %s from shared config, %w\", requestMinCompressionSizeBytes, err)\n\t}\n\n\tif err := updateAIDEndpointMode(&c.AccountIDEndpointMode, section, accountIDEndpointMode); err != nil {\n\t\treturn fmt.Errorf(\"failed to load %s from shared config, %w\", accountIDEndpointMode, err)\n\t}\n\n\tif err := updateRequestChecksumCalculation(&c.RequestChecksumCalculation, section, requestChecksumCalculationKey); err != nil {\n\t\treturn fmt.Errorf(\"failed to load %s from shared config, %w\", requestChecksumCalculationKey, err)\n\t}\n\tif err := updateResponseChecksumValidation(&c.ResponseChecksumValidation, section, responseChecksumValidationKey); err != nil {\n\t\treturn fmt.Errorf(\"failed to load %s from shared config, %w\", responseChecksumValidationKey, err)\n\t}\n\n\t// Shared Credentials\n\tcreds := aws.Credentials{\n\t\tAccessKeyID:     section.String(accessKeyIDKey),\n\t\tSecretAccessKey: section.String(secretAccessKey),\n\t\tSessionToken:    section.String(sessionTokenKey),\n\t\tSource:          fmt.Sprintf(\"SharedConfigCredentials: %s\", section.SourceFile[accessKeyIDKey]),\n\t\tAccountID:       section.String(accountIDKey),\n\t}\n\n\tif creds.HasKeys() {\n\t\tc.Credentials = creds\n\t}\n\n\tupdateString(&c.ServicesSectionName, section, servicesSectionKey)\n\n\treturn nil\n}\n\nfunc updateRequestMinCompressSizeBytes(bytes **int64, sec ini.Section, key string) error {\n\tif !sec.Has(key) {\n\t\treturn nil\n\t}\n\n\tv, ok := sec.Int(key)\n\tif !ok {\n\t\treturn fmt.Errorf(\"invalid value for min request compression size bytes %s, need int64\", sec.String(key))\n\t}\n\tif v < 0 || v > smithyrequestcompression.MaxRequestMinCompressSizeBytes {\n\t\treturn fmt.Errorf(\"invalid range for min request compression size bytes %d, must be within 0 and 10485760 inclusively\", v)\n\t}\n\t*bytes = new(int64)\n\t**bytes = v\n\treturn nil\n}\n\nfunc updateDisableRequestCompression(disable **bool, sec ini.Section, key string) error {\n\tif !sec.Has(key) {\n\t\treturn nil\n\t}\n\n\tv := sec.String(key)\n\tswitch {\n\tcase v == \"true\":\n\t\t*disable = new(bool)\n\t\t**disable = true\n\tcase v == \"false\":\n\t\t*disable = new(bool)\n\t\t**disable = false\n\tdefault:\n\t\treturn fmt.Errorf(\"invalid value for shared config profile field, %s=%s, need true or false\", key, v)\n\t}\n\treturn nil\n}\n\nfunc updateAIDEndpointMode(m *aws.AccountIDEndpointMode, sec ini.Section, key string) error {\n\tif !sec.Has(key) {\n\t\treturn nil\n\t}\n\n\tv := sec.String(key)\n\tswitch v {\n\tcase \"preferred\":\n\t\t*m = aws.AccountIDEndpointModePreferred\n\tcase \"required\":\n\t\t*m = aws.AccountIDEndpointModeRequired\n\tcase \"disabled\":\n\t\t*m = aws.AccountIDEndpointModeDisabled\n\tdefault:\n\t\treturn fmt.Errorf(\"invalid value for shared config profile field, %s=%s, must be preferred/required/disabled\", key, v)\n\t}\n\n\treturn nil\n}\n\nfunc updateRequestChecksumCalculation(m *aws.RequestChecksumCalculation, sec ini.Section, key string) error {\n\tif !sec.Has(key) {\n\t\treturn nil\n\t}\n\n\tv := sec.String(key)\n\tswitch strings.ToLower(v) {\n\tcase checksumWhenSupported:\n\t\t*m = aws.RequestChecksumCalculationWhenSupported\n\tcase checksumWhenRequired:\n\t\t*m = aws.RequestChecksumCalculationWhenRequired\n\tdefault:\n\t\treturn fmt.Errorf(\"invalid value for shared config profile field, %s=%s, must be when_supported/when_required\", key, v)\n\t}\n\n\treturn nil\n}\n\nfunc updateResponseChecksumValidation(m *aws.ResponseChecksumValidation, sec ini.Section, key string) error {\n\tif !sec.Has(key) {\n\t\treturn nil\n\t}\n\n\tv := sec.String(key)\n\tswitch strings.ToLower(v) {\n\tcase checksumWhenSupported:\n\t\t*m = aws.ResponseChecksumValidationWhenSupported\n\tcase checksumWhenRequired:\n\t\t*m = aws.ResponseChecksumValidationWhenRequired\n\tdefault:\n\t\treturn fmt.Errorf(\"invalid value for shared config profile field, %s=%s, must be when_supported/when_required\", key, v)\n\t}\n\n\treturn nil\n}\n\nfunc (c SharedConfig) getRequestMinCompressSizeBytes(ctx context.Context) (int64, bool, error) {\n\tif c.RequestMinCompressSizeBytes == nil {\n\t\treturn 0, false, nil\n\t}\n\treturn *c.RequestMinCompressSizeBytes, true, nil\n}\n\nfunc (c SharedConfig) getDisableRequestCompression(ctx context.Context) (bool, bool, error) {\n\tif c.DisableRequestCompression == nil {\n\t\treturn false, false, nil\n\t}\n\treturn *c.DisableRequestCompression, true, nil\n}\n\nfunc (c SharedConfig) getAccountIDEndpointMode(ctx context.Context) (aws.AccountIDEndpointMode, bool, error) {\n\treturn c.AccountIDEndpointMode, len(c.AccountIDEndpointMode) > 0, nil\n}\n\nfunc (c SharedConfig) getRequestChecksumCalculation(ctx context.Context) (aws.RequestChecksumCalculation, bool, error) {\n\treturn c.RequestChecksumCalculation, c.RequestChecksumCalculation > 0, nil\n}\n\nfunc (c SharedConfig) getResponseChecksumValidation(ctx context.Context) (aws.ResponseChecksumValidation, bool, error) {\n\treturn c.ResponseChecksumValidation, c.ResponseChecksumValidation > 0, nil\n}\n\nfunc updateDefaultsMode(mode *aws.DefaultsMode, section ini.Section, key string) error {\n\tif !section.Has(key) {\n\t\treturn nil\n\t}\n\tvalue := section.String(key)\n\tif ok := mode.SetFromString(value); !ok {\n\t\treturn fmt.Errorf(\"invalid value: %s\", value)\n\t}\n\treturn nil\n}\n\nfunc updateRetryMode(mode *aws.RetryMode, section ini.Section, key string) (err error) {\n\tif !section.Has(key) {\n\t\treturn nil\n\t}\n\tvalue := section.String(key)\n\tif *mode, err = aws.ParseRetryMode(value); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc updateEC2MetadataServiceEndpointMode(endpointMode *imds.EndpointModeState, section ini.Section, key string) error {\n\tif !section.Has(key) {\n\t\treturn nil\n\t}\n\tvalue := section.String(key)\n\treturn endpointMode.SetFromString(value)\n}\n\nfunc (c *SharedConfig) validateCredentialsConfig(profile string) error {\n\tif err := c.validateCredentialsRequireARN(profile); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (c *SharedConfig) validateCredentialsRequireARN(profile string) error {\n\tvar credSource string\n\n\tswitch {\n\tcase len(c.SourceProfileName) != 0:\n\t\tcredSource = sourceProfileKey\n\tcase len(c.CredentialSource) != 0:\n\t\tcredSource = credentialSourceKey\n\tcase len(c.WebIdentityTokenFile) != 0:\n\t\tcredSource = webIdentityTokenFileKey\n\t}\n\n\tif len(credSource) != 0 && len(c.RoleARN) == 0 {\n\t\treturn CredentialRequiresARNError{\n\t\t\tType:    credSource,\n\t\t\tProfile: profile,\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (c *SharedConfig) validateCredentialType() error {\n\t// Only one or no credential type can be defined.\n\tif !oneOrNone(\n\t\tlen(c.SourceProfileName) != 0,\n\t\tlen(c.CredentialSource) != 0,\n\t\tlen(c.CredentialProcess) != 0,\n\t\tlen(c.WebIdentityTokenFile) != 0,\n\t) {\n\t\treturn fmt.Errorf(\"only one credential type may be specified per profile: source profile, credential source, credential process, web identity token\")\n\t}\n\n\treturn nil\n}\n\nfunc (c *SharedConfig) validateSSOConfiguration() error {\n\tif c.hasSSOTokenProviderConfiguration() {\n\t\terr := c.validateSSOTokenProviderConfiguration()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t}\n\n\tif c.hasLegacySSOConfiguration() {\n\t\terr := c.validateLegacySSOConfiguration()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (c *SharedConfig) validateSSOTokenProviderConfiguration() error {\n\tvar missing []string\n\n\tif len(c.SSOSessionName) == 0 {\n\t\tmissing = append(missing, ssoSessionNameKey)\n\t}\n\n\tif c.SSOSession == nil {\n\t\tmissing = append(missing, ssoSectionPrefix)\n\t} else {\n\t\tif len(c.SSOSession.SSORegion) == 0 {\n\t\t\tmissing = append(missing, ssoRegionKey)\n\t\t}\n\n\t\tif len(c.SSOSession.SSOStartURL) == 0 {\n\t\t\tmissing = append(missing, ssoStartURLKey)\n\t\t}\n\t}\n\n\tif len(missing) > 0 {\n\t\treturn fmt.Errorf(\"profile %q is configured to use SSO but is missing required configuration: %s\",\n\t\t\tc.Profile, strings.Join(missing, \", \"))\n\t}\n\n\tif len(c.SSORegion) > 0 && c.SSORegion != c.SSOSession.SSORegion {\n\t\treturn fmt.Errorf(\"%s in profile %q must match %s in %s\", ssoRegionKey, c.Profile, ssoRegionKey, ssoSectionPrefix)\n\t}\n\n\tif len(c.SSOStartURL) > 0 && c.SSOStartURL != c.SSOSession.SSOStartURL {\n\t\treturn fmt.Errorf(\"%s in profile %q must match %s in %s\", ssoStartURLKey, c.Profile, ssoStartURLKey, ssoSectionPrefix)\n\t}\n\n\treturn nil\n}\n\nfunc (c *SharedConfig) validateLegacySSOConfiguration() error {\n\tvar missing []string\n\n\tif len(c.SSORegion) == 0 {\n\t\tmissing = append(missing, ssoRegionKey)\n\t}\n\n\tif len(c.SSOStartURL) == 0 {\n\t\tmissing = append(missing, ssoStartURLKey)\n\t}\n\n\tif len(c.SSOAccountID) == 0 {\n\t\tmissing = append(missing, ssoAccountIDKey)\n\t}\n\n\tif len(c.SSORoleName) == 0 {\n\t\tmissing = append(missing, ssoRoleNameKey)\n\t}\n\n\tif len(missing) > 0 {\n\t\treturn fmt.Errorf(\"profile %q is configured to use SSO but is missing required configuration: %s\",\n\t\t\tc.Profile, strings.Join(missing, \", \"))\n\t}\n\treturn nil\n}\n\nfunc (c *SharedConfig) hasCredentials() bool {\n\tswitch {\n\tcase len(c.SourceProfileName) != 0:\n\tcase len(c.CredentialSource) != 0:\n\tcase len(c.CredentialProcess) != 0:\n\tcase len(c.WebIdentityTokenFile) != 0:\n\tcase c.hasSSOConfiguration():\n\tcase c.Credentials.HasKeys():\n\tdefault:\n\t\treturn false\n\t}\n\n\treturn true\n}\n\nfunc (c *SharedConfig) hasSSOConfiguration() bool {\n\treturn c.hasSSOTokenProviderConfiguration() || c.hasLegacySSOConfiguration()\n}\n\nfunc (c *SharedConfig) hasSSOTokenProviderConfiguration() bool {\n\treturn len(c.SSOSessionName) > 0\n}\n\nfunc (c *SharedConfig) hasLegacySSOConfiguration() bool {\n\treturn len(c.SSORegion) > 0 || len(c.SSOAccountID) > 0 || len(c.SSOStartURL) > 0 || len(c.SSORoleName) > 0\n}\n\nfunc (c *SharedConfig) clearAssumeRoleOptions() {\n\tc.RoleARN = \"\"\n\tc.ExternalID = \"\"\n\tc.MFASerial = \"\"\n\tc.RoleSessionName = \"\"\n\tc.SourceProfileName = \"\"\n}\n\nfunc (c *SharedConfig) clearCredentialOptions() {\n\tc.CredentialSource = \"\"\n\tc.CredentialProcess = \"\"\n\tc.WebIdentityTokenFile = \"\"\n\tc.Credentials = aws.Credentials{}\n\tc.SSOAccountID = \"\"\n\tc.SSORegion = \"\"\n\tc.SSORoleName = \"\"\n\tc.SSOStartURL = \"\"\n}\n\n// SharedConfigLoadError is an error for the shared config file failed to load.\ntype SharedConfigLoadError struct {\n\tFilename string\n\tErr      error\n}\n\n// Unwrap returns the underlying error that caused the failure.\nfunc (e SharedConfigLoadError) Unwrap() error {\n\treturn e.Err\n}\n\nfunc (e SharedConfigLoadError) Error() string {\n\treturn fmt.Sprintf(\"failed to load shared config file, %s, %v\", e.Filename, e.Err)\n}\n\n// SharedConfigProfileNotExistError is an error for the shared config when\n// the profile was not find in the config file.\ntype SharedConfigProfileNotExistError struct {\n\tFilename []string\n\tProfile  string\n\tErr      error\n}\n\n// Unwrap returns the underlying error that caused the failure.\nfunc (e SharedConfigProfileNotExistError) Unwrap() error {\n\treturn e.Err\n}\n\nfunc (e SharedConfigProfileNotExistError) Error() string {\n\treturn fmt.Sprintf(\"failed to get shared config profile, %s\", e.Profile)\n}\n\n// SharedConfigAssumeRoleError is an error for the shared config when the\n// profile contains assume role information, but that information is invalid\n// or not complete.\ntype SharedConfigAssumeRoleError struct {\n\tProfile string\n\tRoleARN string\n\tErr     error\n}\n\n// Unwrap returns the underlying error that caused the failure.\nfunc (e SharedConfigAssumeRoleError) Unwrap() error {\n\treturn e.Err\n}\n\nfunc (e SharedConfigAssumeRoleError) Error() string {\n\treturn fmt.Sprintf(\"failed to load assume role %s, of profile %s, %v\",\n\t\te.RoleARN, e.Profile, e.Err)\n}\n\n// CredentialRequiresARNError provides the error for shared config credentials\n// that are incorrectly configured in the shared config or credentials file.\ntype CredentialRequiresARNError struct {\n\t// type of credentials that were configured.\n\tType string\n\n\t// Profile name the credentials were in.\n\tProfile string\n}\n\n// Error satisfies the error interface.\nfunc (e CredentialRequiresARNError) Error() string {\n\treturn fmt.Sprintf(\n\t\t\"credential type %s requires role_arn, profile %s\",\n\t\te.Type, e.Profile,\n\t)\n}\n\nfunc oneOrNone(bs ...bool) bool {\n\tvar count int\n\n\tfor _, b := range bs {\n\t\tif b {\n\t\t\tcount++\n\t\t\tif count > 1 {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true\n}\n\n// updateString will only update the dst with the value in the section key, key\n// is present in the section.\nfunc updateString(dst *string, section ini.Section, key string) {\n\tif !section.Has(key) {\n\t\treturn\n\t}\n\t*dst = section.String(key)\n}\n\n// updateInt will only update the dst with the value in the section key, key\n// is present in the section.\n//\n// Down casts the INI integer value from a int64 to an int, which could be\n// different bit size depending on platform.\nfunc updateInt(dst *int, section ini.Section, key string) error {\n\tif !section.Has(key) {\n\t\treturn nil\n\t}\n\n\tv, ok := section.Int(key)\n\tif !ok {\n\t\treturn fmt.Errorf(\"invalid value %s=%s, expect integer\", key, section.String(key))\n\t}\n\n\t*dst = int(v)\n\treturn nil\n}\n\n// updateBool will only update the dst with the value in the section key, key\n// is present in the section.\nfunc updateBool(dst *bool, section ini.Section, key string) {\n\tif !section.Has(key) {\n\t\treturn\n\t}\n\n\t// retains pre-#2276 behavior where non-bool value would resolve to false\n\tv, _ := section.Bool(key)\n\t*dst = v\n}\n\n// updateBoolPtr will only update the dst with the value in the section key,\n// key is present in the section.\nfunc updateBoolPtr(dst **bool, section ini.Section, key string) {\n\tif !section.Has(key) {\n\t\treturn\n\t}\n\n\t// retains pre-#2276 behavior where non-bool value would resolve to false\n\tv, _ := section.Bool(key)\n\t*dst = new(bool)\n\t**dst = v\n}\n\n// updateEndpointDiscoveryType will only update the dst with the value in the section, if\n// a valid key and corresponding EndpointDiscoveryType is found.\nfunc updateEndpointDiscoveryType(dst *aws.EndpointDiscoveryEnableState, section ini.Section, key string) {\n\tif !section.Has(key) {\n\t\treturn\n\t}\n\n\tvalue := section.String(key)\n\tif len(value) == 0 {\n\t\treturn\n\t}\n\n\tswitch {\n\tcase strings.EqualFold(value, endpointDiscoveryDisabled):\n\t\t*dst = aws.EndpointDiscoveryDisabled\n\tcase strings.EqualFold(value, endpointDiscoveryEnabled):\n\t\t*dst = aws.EndpointDiscoveryEnabled\n\tcase strings.EqualFold(value, endpointDiscoveryAuto):\n\t\t*dst = aws.EndpointDiscoveryAuto\n\t}\n}\n\n// updateEndpointDiscoveryType will only update the dst with the value in the section, if\n// a valid key and corresponding EndpointDiscoveryType is found.\nfunc updateUseDualStackEndpoint(dst *aws.DualStackEndpointState, section ini.Section, key string) {\n\tif !section.Has(key) {\n\t\treturn\n\t}\n\n\t// retains pre-#2276 behavior where non-bool value would resolve to false\n\tif v, _ := section.Bool(key); v {\n\t\t*dst = aws.DualStackEndpointStateEnabled\n\t} else {\n\t\t*dst = aws.DualStackEndpointStateDisabled\n\t}\n\n\treturn\n}\n\n// updateEndpointDiscoveryType will only update the dst with the value in the section, if\n// a valid key and corresponding EndpointDiscoveryType is found.\nfunc updateUseFIPSEndpoint(dst *aws.FIPSEndpointState, section ini.Section, key string) {\n\tif !section.Has(key) {\n\t\treturn\n\t}\n\n\t// retains pre-#2276 behavior where non-bool value would resolve to false\n\tif v, _ := section.Bool(key); v {\n\t\t*dst = aws.FIPSEndpointStateEnabled\n\t} else {\n\t\t*dst = aws.FIPSEndpointStateDisabled\n\t}\n\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md",
    "content": "# v1.17.67 (2025-04-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.66 (2025-04-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.65 (2025-03-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.64 (2025-03-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.63 (2025-03-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.62 (2025-03-04.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.61 (2025-02-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.60 (2025-02-18)\n\n* **Bug Fix**: Bump go version to 1.22\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.59 (2025-02-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.58 (2025-02-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.57 (2025-01-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.56 (2025-01-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.55 (2025-01-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n* **Dependency Update**: Upgrade to smithy-go v1.22.2.\n\n# v1.17.54 (2025-01-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.53 (2025-01-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.52 (2025-01-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.51 (2025-01-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.50 (2025-01-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.49 (2025-01-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.48 (2024-12-19)\n\n* **Bug Fix**: Fix improper use of printf-style functions.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.47 (2024-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.46 (2024-11-18)\n\n* **Dependency Update**: Update to smithy-go v1.22.1.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.45 (2024-11-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.44 (2024-11-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.43 (2024-11-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.42 (2024-10-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.41 (2024-10-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.40 (2024-10-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.39 (2024-10-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.38 (2024-10-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.37 (2024-09-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.36 (2024-09-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.35 (2024-09-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.34 (2024-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.33 (2024-09-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.32 (2024-09-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.31 (2024-09-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.30 (2024-08-26)\n\n* **Bug Fix**: Save SSO cached token expiry in UTC to ensure cross-SDK compatibility.\n\n# v1.17.29 (2024-08-22)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.28 (2024-08-15)\n\n* **Dependency Update**: Bump minimum Go version to 1.21.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.27 (2024-07-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.26 (2024-07-10.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.25 (2024-07-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.24 (2024-07-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.23 (2024-06-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.22 (2024-06-26)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.21 (2024-06-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.20 (2024-06-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.19 (2024-06-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.18 (2024-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.17 (2024-06-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.16 (2024-05-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.15 (2024-05-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.14 (2024-05-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.13 (2024-05-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.12 (2024-05-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.11 (2024-04-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.10 (2024-03-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.9 (2024-03-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.8 (2024-03-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.7 (2024-03-07)\n\n* **Bug Fix**: Remove dependency on go-cmp.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.6 (2024-03-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.5 (2024-03-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.4 (2024-02-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.3 (2024-02-22)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.2 (2024-02-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.1 (2024-02-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.0 (2024-02-13)\n\n* **Feature**: Bump minimum Go version to 1.20 per our language support policy.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.16 (2024-01-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.15 (2024-01-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.14 (2024-01-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.13 (2023-12-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.12 (2023-12-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.11 (2023-12-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.10 (2023-12-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.9 (2023-12-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.8 (2023-11-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.7 (2023-11-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.6 (2023-11-28.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.5 (2023-11-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.4 (2023-11-21)\n\n* **Bug Fix**: Don't expect error responses to have a JSON payload in the endpointcreds provider.\n\n# v1.16.3 (2023-11-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.2 (2023-11-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.1 (2023-11-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.0 (2023-11-14)\n\n* **Feature**: Add support for dynamic auth token from file and EKS container host in absolute/relative URIs in the HTTP credential provider.\n\n# v1.15.2 (2023-11-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.1 (2023-11-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.0 (2023-11-01)\n\n* **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.0 (2023-10-31)\n\n* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.43 (2023-10-12)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.42 (2023-10-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.41 (2023-10-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.40 (2023-09-22)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.39 (2023-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.38 (2023-09-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.37 (2023-09-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.36 (2023-08-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.35 (2023-08-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.34 (2023-08-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.33 (2023-08-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.32 (2023-08-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.31 (2023-08-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.30 (2023-07-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.29 (2023-07-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.28 (2023-07-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.27 (2023-07-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.26 (2023-06-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.25 (2023-06-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.24 (2023-05-09)\n\n* No change notes available for this release.\n\n# v1.13.23 (2023-05-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.22 (2023-05-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.21 (2023-04-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.20 (2023-04-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.19 (2023-04-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.18 (2023-03-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.17 (2023-03-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.16 (2023-03-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.15 (2023-02-22)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.14 (2023-02-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.13 (2023-02-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.12 (2023-02-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.11 (2023-02-01)\n\n* No change notes available for this release.\n\n# v1.13.10 (2023-01-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.9 (2023-01-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.8 (2023-01-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.7 (2022-12-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.6 (2022-12-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.5 (2022-12-15)\n\n* **Bug Fix**: Unify logic between shared config and in finding home directory\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.4 (2022-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.3 (2022-11-22)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.2 (2022-11-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.1 (2022-11-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.0 (2022-11-11)\n\n* **Announcement**: When using the SSOTokenProvider, a previous implementation incorrectly compensated for invalid SSOTokenProvider configurations in the shared profile. This has been fixed via PR #1903 and tracked in issue #1846\n* **Feature**: Adds token refresh support (via SSOTokenProvider) when using the SSOCredentialProvider\n\n# v1.12.24 (2022-11-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.23 (2022-10-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.22 (2022-10-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.21 (2022-09-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.20 (2022-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.19 (2022-09-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.18 (2022-09-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.17 (2022-08-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.16 (2022-08-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.15 (2022-08-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.14 (2022-08-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.13 (2022-08-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.12 (2022-08-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.11 (2022-08-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.10 (2022-08-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.9 (2022-07-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.8 (2022-07-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.7 (2022-06-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.6 (2022-06-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.5 (2022-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.4 (2022-05-26)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.3 (2022-05-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.2 (2022-05-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.1 (2022-05-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.0 (2022-04-25)\n\n* **Feature**: Adds Duration and Policy options that can be used when creating stscreds.WebIdentityRoleProvider credentials provider.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.2 (2022-03-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.1 (2022-03-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.0 (2022-03-23)\n\n* **Feature**: Update `ec2rolecreds` package's `Provider` to implememnt support for CredentialsCache new optional caching strategy interfaces, HandleFailRefreshCredentialsCacheStrategy and AdjustExpiresByCredentialsCacheStrategy.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.0 (2022-03-08)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.0 (2022-02-24)\n\n* **Feature**: Adds support for `SourceIdentity` to `stscreds.AssumeRoleProvider` [#1588](https://github.com/aws/aws-sdk-go-v2/pull/1588). Fixes [#1575](https://github.com/aws/aws-sdk-go-v2/issues/1575)\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.8.0 (2022-01-14)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.7.0 (2022-01-07)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.6.5 (2021-12-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.6.4 (2021-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.6.3 (2021-11-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.6.2 (2021-11-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.6.1 (2021-11-12)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.6.0 (2021-11-06)\n\n* **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically.\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.0 (2021-10-21)\n\n* **Feature**: Updated  to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.3 (2021-10-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.2 (2021-09-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.1 (2021-09-10)\n\n* **Documentation**: Fixes the AssumeRoleProvider's documentation for using custom TokenProviders.\n\n# v1.4.0 (2021-08-27)\n\n* **Feature**: Adds support for Tags and TransitiveTagKeys to stscreds.AssumeRoleProvider. Closes https://github.com/aws/aws-sdk-go-v2/issues/723\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.3 (2021-08-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.2 (2021-08-04)\n\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.1 (2021-07-15)\n\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.0 (2021-06-25)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Bug Fix**: Fixed example usages of aws.CredentialsCache ([#1275](https://github.com/aws/aws-sdk-go-v2/pull/1275))\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.1 (2021-05-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.0 (2021-05-14)\n\n* **Feature**: Constant has been added to modules to enable runtime version inspection for reporting.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/doc.go",
    "content": "/*\nPackage credentials provides types for retrieving credentials from credentials sources.\n*/\npackage credentials\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds/doc.go",
    "content": "// Package ec2rolecreds provides the credentials provider implementation for\n// retrieving AWS credentials from Amazon EC2 Instance Roles via Amazon EC2 IMDS.\n//\n// # Concurrency and caching\n//\n// The Provider is not safe to be used concurrently, and does not provide any\n// caching of credentials retrieved. You should wrap the Provider with a\n// `aws.CredentialsCache` to provide concurrency safety, and caching of\n// credentials.\n//\n// # Loading credentials with the SDK's AWS Config\n//\n// The EC2 Instance role credentials provider will automatically be the resolved\n// credential provider in the credential chain if no other credential provider is\n// resolved first.\n//\n// To explicitly instruct the SDK's credentials resolving to use the EC2 Instance\n// role for credentials, you specify a `credentials_source` property in the config\n// profile the SDK will load.\n//\n//\t[default]\n//\tcredential_source = Ec2InstanceMetadata\n//\n// # Loading credentials with the Provider directly\n//\n// Another way to use the EC2 Instance role credentials provider is to create it\n// directly and assign it as the credentials provider for an API client.\n//\n// The following example creates a credentials provider for a command, and wraps\n// it with the CredentialsCache before assigning the provider to the Amazon S3 API\n// client's Credentials option.\n//\n//\tprovider := imds.New(imds.Options{})\n//\n//\t// Create the service client value configured for credentials.\n//\tsvc := s3.New(s3.Options{\n//\t  Credentials: aws.NewCredentialsCache(provider),\n//\t})\n//\n// If you need more control, you can set the configuration options on the\n// credentials provider using the imds.Options type to configure the EC2 IMDS\n// API Client and ExpiryWindow of the retrieved credentials.\n//\n//\tprovider := imds.New(imds.Options{\n//\t\t// See imds.Options type's documentation for more options available.\n//\t\tClient: imds.New(Options{\n//\t\t\tHTTPClient: customHTTPClient,\n//\t\t}),\n//\n//\t\t// Modify how soon credentials expire prior to their original expiry time.\n//\t\tExpiryWindow: 5 * time.Minute,\n//\t})\n//\n// # EC2 IMDS API Client\n//\n// See the github.com/aws/aws-sdk-go-v2/feature/ec2/imds module for more details on\n// configuring the client, and options available.\npackage ec2rolecreds\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds/provider.go",
    "content": "package ec2rolecreds\n\nimport (\n\t\"bufio\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"math\"\n\t\"path\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/feature/ec2/imds\"\n\tsdkrand \"github.com/aws/aws-sdk-go-v2/internal/rand\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/sdk\"\n\t\"github.com/aws/smithy-go\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\n// ProviderName provides a name of EC2Role provider\nconst ProviderName = \"EC2RoleProvider\"\n\n// GetMetadataAPIClient provides the interface for an EC2 IMDS API client for the\n// GetMetadata operation.\ntype GetMetadataAPIClient interface {\n\tGetMetadata(context.Context, *imds.GetMetadataInput, ...func(*imds.Options)) (*imds.GetMetadataOutput, error)\n}\n\n// A Provider retrieves credentials from the EC2 service, and keeps track if\n// those credentials are expired.\n//\n// The New function must be used to create the with a custom EC2 IMDS client.\n//\n//\tp := &ec2rolecreds.New(func(o *ec2rolecreds.Options{\n//\t     o.Client = imds.New(imds.Options{/* custom options */})\n//\t})\ntype Provider struct {\n\toptions Options\n}\n\n// Options is a list of user settable options for setting the behavior of the Provider.\ntype Options struct {\n\t// The API client that will be used by the provider to make GetMetadata API\n\t// calls to EC2 IMDS.\n\t//\n\t// If nil, the provider will default to the EC2 IMDS client.\n\tClient GetMetadataAPIClient\n\n\t// The chain of providers that was used to create this provider\n\t// These values are for reporting purposes and are not meant to be set up directly\n\tCredentialSources []aws.CredentialSource\n}\n\n// New returns an initialized Provider value configured to retrieve\n// credentials from EC2 Instance Metadata service.\nfunc New(optFns ...func(*Options)) *Provider {\n\toptions := Options{}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tif options.Client == nil {\n\t\toptions.Client = imds.New(imds.Options{})\n\t}\n\n\treturn &Provider{\n\t\toptions: options,\n\t}\n}\n\n// Retrieve retrieves credentials from the EC2 service. Error will be returned\n// if the request fails, or unable to extract the desired credentials.\nfunc (p *Provider) Retrieve(ctx context.Context) (aws.Credentials, error) {\n\tcredsList, err := requestCredList(ctx, p.options.Client)\n\tif err != nil {\n\t\treturn aws.Credentials{Source: ProviderName}, err\n\t}\n\n\tif len(credsList) == 0 {\n\t\treturn aws.Credentials{Source: ProviderName},\n\t\t\tfmt.Errorf(\"unexpected empty EC2 IMDS role list\")\n\t}\n\tcredsName := credsList[0]\n\n\troleCreds, err := requestCred(ctx, p.options.Client, credsName)\n\tif err != nil {\n\t\treturn aws.Credentials{Source: ProviderName}, err\n\t}\n\n\tcreds := aws.Credentials{\n\t\tAccessKeyID:     roleCreds.AccessKeyID,\n\t\tSecretAccessKey: roleCreds.SecretAccessKey,\n\t\tSessionToken:    roleCreds.Token,\n\t\tSource:          ProviderName,\n\n\t\tCanExpire: true,\n\t\tExpires:   roleCreds.Expiration,\n\t}\n\n\t// Cap role credentials Expires to 1 hour so they can be refreshed more\n\t// often. Jitter will be applied credentials cache if being used.\n\tif anHour := sdk.NowTime().Add(1 * time.Hour); creds.Expires.After(anHour) {\n\t\tcreds.Expires = anHour\n\t}\n\n\treturn creds, nil\n}\n\n// HandleFailToRefresh will extend the credentials Expires time if it it is\n// expired. If the credentials will not expire within the minimum time, they\n// will be returned.\n//\n// If the credentials cannot expire, the original error will be returned.\nfunc (p *Provider) HandleFailToRefresh(ctx context.Context, prevCreds aws.Credentials, err error) (\n\taws.Credentials, error,\n) {\n\tif !prevCreds.CanExpire {\n\t\treturn aws.Credentials{}, err\n\t}\n\n\tif prevCreds.Expires.After(sdk.NowTime().Add(5 * time.Minute)) {\n\t\treturn prevCreds, nil\n\t}\n\n\tnewCreds := prevCreds\n\trandFloat64, err := sdkrand.CryptoRandFloat64()\n\tif err != nil {\n\t\treturn aws.Credentials{}, fmt.Errorf(\"failed to get random float, %w\", err)\n\t}\n\n\t// Random distribution of [5,15) minutes.\n\texpireOffset := time.Duration(randFloat64*float64(10*time.Minute)) + 5*time.Minute\n\tnewCreds.Expires = sdk.NowTime().Add(expireOffset)\n\n\tlogger := middleware.GetLogger(ctx)\n\tlogger.Logf(logging.Warn, \"Attempting credential expiration extension due to a credential service availability issue. A refresh of these credentials will be attempted again in %v minutes.\", math.Floor(expireOffset.Minutes()))\n\n\treturn newCreds, nil\n}\n\n// AdjustExpiresBy will adds the passed in duration to the passed in\n// credential's Expires time, unless the time until Expires is less than 15\n// minutes. Returns the credentials, even if not updated.\nfunc (p *Provider) AdjustExpiresBy(creds aws.Credentials, dur time.Duration) (\n\taws.Credentials, error,\n) {\n\tif !creds.CanExpire {\n\t\treturn creds, nil\n\t}\n\tif creds.Expires.Before(sdk.NowTime().Add(15 * time.Minute)) {\n\t\treturn creds, nil\n\t}\n\n\tcreds.Expires = creds.Expires.Add(dur)\n\treturn creds, nil\n}\n\n// ec2RoleCredRespBody provides the shape for unmarshaling credential\n// request responses.\ntype ec2RoleCredRespBody struct {\n\t// Success State\n\tExpiration      time.Time\n\tAccessKeyID     string\n\tSecretAccessKey string\n\tToken           string\n\n\t// Error state\n\tCode    string\n\tMessage string\n}\n\nconst iamSecurityCredsPath = \"/iam/security-credentials/\"\n\n// requestCredList requests a list of credentials from the EC2 service. If\n// there are no credentials, or there is an error making or receiving the\n// request\nfunc requestCredList(ctx context.Context, client GetMetadataAPIClient) ([]string, error) {\n\tresp, err := client.GetMetadata(ctx, &imds.GetMetadataInput{\n\t\tPath: iamSecurityCredsPath,\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"no EC2 IMDS role found, %w\", err)\n\t}\n\tdefer resp.Content.Close()\n\n\tcredsList := []string{}\n\ts := bufio.NewScanner(resp.Content)\n\tfor s.Scan() {\n\t\tcredsList = append(credsList, s.Text())\n\t}\n\n\tif err := s.Err(); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to read EC2 IMDS role, %w\", err)\n\t}\n\n\treturn credsList, nil\n}\n\n// requestCred requests the credentials for a specific credentials from the EC2 service.\n//\n// If the credentials cannot be found, or there is an error reading the response\n// and error will be returned.\nfunc requestCred(ctx context.Context, client GetMetadataAPIClient, credsName string) (ec2RoleCredRespBody, error) {\n\tresp, err := client.GetMetadata(ctx, &imds.GetMetadataInput{\n\t\tPath: path.Join(iamSecurityCredsPath, credsName),\n\t})\n\tif err != nil {\n\t\treturn ec2RoleCredRespBody{},\n\t\t\tfmt.Errorf(\"failed to get %s EC2 IMDS role credentials, %w\",\n\t\t\t\tcredsName, err)\n\t}\n\tdefer resp.Content.Close()\n\n\tvar respCreds ec2RoleCredRespBody\n\tif err := json.NewDecoder(resp.Content).Decode(&respCreds); err != nil {\n\t\treturn ec2RoleCredRespBody{},\n\t\t\tfmt.Errorf(\"failed to decode %s EC2 IMDS role credentials, %w\",\n\t\t\t\tcredsName, err)\n\t}\n\n\tif !strings.EqualFold(respCreds.Code, \"Success\") {\n\t\t// If an error code was returned something failed requesting the role.\n\t\treturn ec2RoleCredRespBody{},\n\t\t\tfmt.Errorf(\"failed to get %s EC2 IMDS role credentials, %w\",\n\t\t\t\tcredsName,\n\t\t\t\t&smithy.GenericAPIError{Code: respCreds.Code, Message: respCreds.Message})\n\t}\n\n\treturn respCreds, nil\n}\n\n// ProviderSources returns the credential chain that was used to construct this provider\nfunc (p *Provider) ProviderSources() []aws.CredentialSource {\n\tif p.options.CredentialSources == nil {\n\t\treturn []aws.CredentialSource{aws.CredentialSourceIMDS}\n\t} // If no source has been set, assume this is used directly which means just call to assume role\n\treturn p.options.CredentialSources\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client/auth.go",
    "content": "package client\n\nimport (\n\t\"context\"\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\ntype getIdentityMiddleware struct {\n\toptions Options\n}\n\nfunc (*getIdentityMiddleware) ID() string {\n\treturn \"GetIdentity\"\n}\n\nfunc (m *getIdentityMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\treturn next.HandleFinalize(ctx, in)\n}\n\ntype signRequestMiddleware struct {\n}\n\nfunc (*signRequestMiddleware) ID() string {\n\treturn \"Signing\"\n}\n\nfunc (m *signRequestMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\treturn next.HandleFinalize(ctx, in)\n}\n\ntype resolveAuthSchemeMiddleware struct {\n\toperation string\n\toptions   Options\n}\n\nfunc (*resolveAuthSchemeMiddleware) ID() string {\n\treturn \"ResolveAuthScheme\"\n}\n\nfunc (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\treturn next.HandleFinalize(ctx, in)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client/client.go",
    "content": "package client\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/retry\"\n\tawshttp \"github.com/aws/aws-sdk-go-v2/aws/transport/http\"\n\t\"github.com/aws/smithy-go\"\n\tsmithymiddleware \"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// ServiceID is the client identifer\nconst ServiceID = \"endpoint-credentials\"\n\n// HTTPClient is a client for sending HTTP requests\ntype HTTPClient interface {\n\tDo(*http.Request) (*http.Response, error)\n}\n\n// Options is the endpoint client configurable options\ntype Options struct {\n\t// The endpoint to retrieve credentials from\n\tEndpoint string\n\n\t// The HTTP client to invoke API calls with. Defaults to client's default HTTP\n\t// implementation if nil.\n\tHTTPClient HTTPClient\n\n\t// Retryer guides how HTTP requests should be retried in case of recoverable\n\t// failures. When nil the API client will use a default retryer.\n\tRetryer aws.Retryer\n\n\t// Set of options to modify how the credentials operation is invoked.\n\tAPIOptions []func(*smithymiddleware.Stack) error\n}\n\n// Copy creates a copy of the API options.\nfunc (o Options) Copy() Options {\n\tto := o\n\tto.APIOptions = make([]func(*smithymiddleware.Stack) error, len(o.APIOptions))\n\tcopy(to.APIOptions, o.APIOptions)\n\treturn to\n}\n\n// Client is an client for retrieving AWS credentials from an endpoint\ntype Client struct {\n\toptions Options\n}\n\n// New constructs a new Client from the given options\nfunc New(options Options, optFns ...func(*Options)) *Client {\n\toptions = options.Copy()\n\n\tif options.HTTPClient == nil {\n\t\toptions.HTTPClient = awshttp.NewBuildableClient()\n\t}\n\n\tif options.Retryer == nil {\n\t\t// Amazon-owned implementations of this endpoint are known to sometimes\n\t\t// return plaintext responses (i.e. no Code) like normal, add a few\n\t\t// additional status codes\n\t\toptions.Retryer = retry.NewStandard(func(o *retry.StandardOptions) {\n\t\t\to.Retryables = append(o.Retryables, retry.RetryableHTTPStatusCode{\n\t\t\t\tCodes: map[int]struct{}{\n\t\t\t\t\thttp.StatusTooManyRequests: {},\n\t\t\t\t},\n\t\t\t})\n\t\t})\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tclient := &Client{\n\t\toptions: options,\n\t}\n\n\treturn client\n}\n\n// GetCredentialsInput is the input to send with the endpoint service to receive credentials.\ntype GetCredentialsInput struct {\n\tAuthorizationToken string\n}\n\n// GetCredentials retrieves credentials from credential endpoint\nfunc (c *Client) GetCredentials(ctx context.Context, params *GetCredentialsInput, optFns ...func(*Options)) (*GetCredentialsOutput, error) {\n\tstack := smithymiddleware.NewStack(\"GetCredentials\", smithyhttp.NewStackRequest)\n\toptions := c.options.Copy()\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tstack.Serialize.Add(&serializeOpGetCredential{}, smithymiddleware.After)\n\tstack.Build.Add(&buildEndpoint{Endpoint: options.Endpoint}, smithymiddleware.After)\n\tstack.Deserialize.Add(&deserializeOpGetCredential{}, smithymiddleware.After)\n\taddProtocolFinalizerMiddlewares(stack, options, \"GetCredentials\")\n\tretry.AddRetryMiddlewares(stack, retry.AddRetryMiddlewaresOptions{Retryer: options.Retryer})\n\tmiddleware.AddSDKAgentKey(middleware.FeatureMetadata, ServiceID)\n\tsmithyhttp.AddErrorCloseResponseBodyMiddleware(stack)\n\tsmithyhttp.AddCloseResponseBodyMiddleware(stack)\n\n\tfor _, fn := range options.APIOptions {\n\t\tif err := fn(stack); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\thandler := smithymiddleware.DecorateHandler(smithyhttp.NewClientHandler(options.HTTPClient), stack)\n\tresult, _, err := handler.Handle(ctx, params)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn result.(*GetCredentialsOutput), err\n}\n\n// GetCredentialsOutput is the response from the credential endpoint\ntype GetCredentialsOutput struct {\n\tExpiration      *time.Time\n\tAccessKeyID     string\n\tSecretAccessKey string\n\tToken           string\n\tAccountID       string\n}\n\n// EndpointError is an error returned from the endpoint service\ntype EndpointError struct {\n\tCode       string            `json:\"code\"`\n\tMessage    string            `json:\"message\"`\n\tFault      smithy.ErrorFault `json:\"-\"`\n\tstatusCode int               `json:\"-\"`\n}\n\n// Error is the error mesage string\nfunc (e *EndpointError) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.Code, e.Message)\n}\n\n// ErrorCode is the error code returned by the endpoint\nfunc (e *EndpointError) ErrorCode() string {\n\treturn e.Code\n}\n\n// ErrorMessage is the error message returned by the endpoint\nfunc (e *EndpointError) ErrorMessage() string {\n\treturn e.Message\n}\n\n// ErrorFault indicates error fault classification\nfunc (e *EndpointError) ErrorFault() smithy.ErrorFault {\n\treturn e.Fault\n}\n\n// HTTPStatusCode implements retry.HTTPStatusCode.\nfunc (e *EndpointError) HTTPStatusCode() int {\n\treturn e.statusCode\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client/endpoints.go",
    "content": "package client\n\nimport (\n\t\"context\"\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\ntype resolveEndpointV2Middleware struct {\n\toptions Options\n}\n\nfunc (*resolveEndpointV2Middleware) ID() string {\n\treturn \"ResolveEndpointV2\"\n}\n\nfunc (m *resolveEndpointV2Middleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\treturn next.HandleFinalize(ctx, in)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client/middleware.go",
    "content": "package client\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/url\"\n\n\t\"github.com/aws/smithy-go\"\n\tsmithymiddleware \"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\ntype buildEndpoint struct {\n\tEndpoint string\n}\n\nfunc (b *buildEndpoint) ID() string {\n\treturn \"BuildEndpoint\"\n}\n\nfunc (b *buildEndpoint) HandleBuild(ctx context.Context, in smithymiddleware.BuildInput, next smithymiddleware.BuildHandler) (\n\tout smithymiddleware.BuildOutput, metadata smithymiddleware.Metadata, err error,\n) {\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport, %T\", in.Request)\n\t}\n\n\tif len(b.Endpoint) == 0 {\n\t\treturn out, metadata, fmt.Errorf(\"endpoint not provided\")\n\t}\n\n\tparsed, err := url.Parse(b.Endpoint)\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"failed to parse endpoint, %w\", err)\n\t}\n\n\trequest.URL = parsed\n\n\treturn next.HandleBuild(ctx, in)\n}\n\ntype serializeOpGetCredential struct{}\n\nfunc (s *serializeOpGetCredential) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (s *serializeOpGetCredential) HandleSerialize(ctx context.Context, in smithymiddleware.SerializeInput, next smithymiddleware.SerializeHandler) (\n\tout smithymiddleware.SerializeOutput, metadata smithymiddleware.Metadata, err error,\n) {\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type, %T\", in.Request)\n\t}\n\n\tparams, ok := in.Parameters.(*GetCredentialsInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters, %T\", in.Parameters)\n\t}\n\n\tconst acceptHeader = \"Accept\"\n\trequest.Header[acceptHeader] = append(request.Header[acceptHeader][:0], \"application/json\")\n\n\tif len(params.AuthorizationToken) > 0 {\n\t\tconst authHeader = \"Authorization\"\n\t\trequest.Header[authHeader] = append(request.Header[authHeader][:0], params.AuthorizationToken)\n\t}\n\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype deserializeOpGetCredential struct{}\n\nfunc (d *deserializeOpGetCredential) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (d *deserializeOpGetCredential) HandleDeserialize(ctx context.Context, in smithymiddleware.DeserializeInput, next smithymiddleware.DeserializeHandler) (\n\tout smithymiddleware.DeserializeOutput, metadata smithymiddleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, deserializeError(response)\n\t}\n\n\tvar shape *GetCredentialsOutput\n\tif err = json.NewDecoder(response.Body).Decode(&shape); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to deserialize json response, %w\", err)}\n\t}\n\n\tout.Result = shape\n\treturn out, metadata, err\n}\n\nfunc deserializeError(response *smithyhttp.Response) error {\n\t// we could be talking to anything, json isn't guaranteed\n\t// see https://github.com/aws/aws-sdk-go-v2/issues/2316\n\tif response.Header.Get(\"Content-Type\") == \"application/json\" {\n\t\treturn deserializeJSONError(response)\n\t}\n\n\tmsg, err := io.ReadAll(response.Body)\n\tif err != nil {\n\t\treturn &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"read response, %w\", err),\n\t\t}\n\t}\n\n\treturn &EndpointError{\n\t\t// no sensible value for Code\n\t\tMessage:    string(msg),\n\t\tFault:      stof(response.StatusCode),\n\t\tstatusCode: response.StatusCode,\n\t}\n}\n\nfunc deserializeJSONError(response *smithyhttp.Response) error {\n\tvar errShape *EndpointError\n\tif err := json.NewDecoder(response.Body).Decode(&errShape); err != nil {\n\t\treturn &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to decode error message, %w\", err),\n\t\t}\n\t}\n\n\terrShape.Fault = stof(response.StatusCode)\n\terrShape.statusCode = response.StatusCode\n\treturn errShape\n}\n\n// maps HTTP status code to smithy ErrorFault\nfunc stof(code int) smithy.ErrorFault {\n\tif code >= 500 {\n\t\treturn smithy.FaultServer\n\t}\n\treturn smithy.FaultClient\n}\n\nfunc addProtocolFinalizerMiddlewares(stack *smithymiddleware.Stack, options Options, operation string) error {\n\tif err := stack.Finalize.Add(&resolveAuthSchemeMiddleware{operation: operation, options: options}, smithymiddleware.Before); err != nil {\n\t\treturn fmt.Errorf(\"add ResolveAuthScheme: %w\", err)\n\t}\n\tif err := stack.Finalize.Insert(&getIdentityMiddleware{options: options}, \"ResolveAuthScheme\", smithymiddleware.After); err != nil {\n\t\treturn fmt.Errorf(\"add GetIdentity: %w\", err)\n\t}\n\tif err := stack.Finalize.Insert(&resolveEndpointV2Middleware{options: options}, \"GetIdentity\", smithymiddleware.After); err != nil {\n\t\treturn fmt.Errorf(\"add ResolveEndpointV2: %w\", err)\n\t}\n\tif err := stack.Finalize.Insert(&signRequestMiddleware{}, \"ResolveEndpointV2\", smithymiddleware.After); err != nil {\n\t\treturn fmt.Errorf(\"add Signing: %w\", err)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/provider.go",
    "content": "// Package endpointcreds provides support for retrieving credentials from an\n// arbitrary HTTP endpoint.\n//\n// The credentials endpoint Provider can receive both static and refreshable\n// credentials that will expire. Credentials are static when an \"Expiration\"\n// value is not provided in the endpoint's response.\n//\n// Static credentials will never expire once they have been retrieved. The format\n// of the static credentials response:\n//\n//\t{\n//\t    \"AccessKeyId\" : \"MUA...\",\n//\t    \"SecretAccessKey\" : \"/7PC5om....\",\n//\t}\n//\n// Refreshable credentials will expire within the \"ExpiryWindow\" of the Expiration\n// value in the response. The format of the refreshable credentials response:\n//\n//\t{\n//\t    \"AccessKeyId\" : \"MUA...\",\n//\t    \"SecretAccessKey\" : \"/7PC5om....\",\n//\t    \"Token\" : \"AQoDY....=\",\n//\t    \"Expiration\" : \"2016-02-25T06:03:31Z\"\n//\t}\n//\n// Errors should be returned in the following format and only returned with 400\n// or 500 HTTP status codes.\n//\n//\t{\n//\t    \"code\": \"ErrorCode\",\n//\t    \"message\": \"Helpful error message.\"\n//\t}\npackage endpointcreds\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client\"\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\n// ProviderName is the name of the credentials provider.\nconst ProviderName = `CredentialsEndpointProvider`\n\ntype getCredentialsAPIClient interface {\n\tGetCredentials(context.Context, *client.GetCredentialsInput, ...func(*client.Options)) (*client.GetCredentialsOutput, error)\n}\n\n// Provider satisfies the aws.CredentialsProvider interface, and is a client to\n// retrieve credentials from an arbitrary endpoint.\ntype Provider struct {\n\t// The AWS Client to make HTTP requests to the endpoint with. The endpoint\n\t// the request will be made to is provided by the aws.Config's\n\t// EndpointResolver.\n\tclient getCredentialsAPIClient\n\n\toptions Options\n}\n\n// HTTPClient is a client for sending HTTP requests\ntype HTTPClient interface {\n\tDo(*http.Request) (*http.Response, error)\n}\n\n// Options is structure of configurable options for Provider\ntype Options struct {\n\t// Endpoint to retrieve credentials from. Required\n\tEndpoint string\n\n\t// HTTPClient to handle sending HTTP requests to the target endpoint.\n\tHTTPClient HTTPClient\n\n\t// Set of options to modify how the credentials operation is invoked.\n\tAPIOptions []func(*middleware.Stack) error\n\n\t// The Retryer to be used for determining whether a failed requested should be retried\n\tRetryer aws.Retryer\n\n\t// Optional authorization token value if set will be used as the value of\n\t// the Authorization header of the endpoint credential request.\n\t//\n\t// When constructed from environment, the provider will use the value of\n\t// AWS_CONTAINER_AUTHORIZATION_TOKEN environment variable as the token\n\t//\n\t// Will be overridden if AuthorizationTokenProvider is configured\n\tAuthorizationToken string\n\n\t// Optional auth provider func to dynamically load the auth token from a file\n\t// everytime a credential is retrieved\n\t//\n\t// When constructed from environment, the provider will read and use the content\n\t// of the file pointed to by AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE environment variable\n\t// as the auth token everytime credentials are retrieved\n\t//\n\t// Will override AuthorizationToken if configured\n\tAuthorizationTokenProvider AuthTokenProvider\n\n\t// The chain of providers that was used to create this provider\n\t// These values are for reporting purposes and are not meant to be set up directly\n\tCredentialSources []aws.CredentialSource\n}\n\n// AuthTokenProvider defines an interface to dynamically load a value to be passed\n// for the Authorization header of a credentials request.\ntype AuthTokenProvider interface {\n\tGetToken() (string, error)\n}\n\n// TokenProviderFunc is a func type implementing AuthTokenProvider interface\n// and enables customizing token provider behavior\ntype TokenProviderFunc func() (string, error)\n\n// GetToken func retrieves auth token according to TokenProviderFunc implementation\nfunc (p TokenProviderFunc) GetToken() (string, error) {\n\treturn p()\n}\n\n// New returns a credentials Provider for retrieving AWS credentials\n// from arbitrary endpoint.\nfunc New(endpoint string, optFns ...func(*Options)) *Provider {\n\to := Options{\n\t\tEndpoint: endpoint,\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&o)\n\t}\n\n\tp := &Provider{\n\t\tclient: client.New(client.Options{\n\t\t\tHTTPClient: o.HTTPClient,\n\t\t\tEndpoint:   o.Endpoint,\n\t\t\tAPIOptions: o.APIOptions,\n\t\t\tRetryer:    o.Retryer,\n\t\t}),\n\t\toptions: o,\n\t}\n\n\treturn p\n}\n\n// Retrieve will attempt to request the credentials from the endpoint the Provider\n// was configured for. And error will be returned if the retrieval fails.\nfunc (p *Provider) Retrieve(ctx context.Context) (aws.Credentials, error) {\n\tresp, err := p.getCredentials(ctx)\n\tif err != nil {\n\t\treturn aws.Credentials{}, fmt.Errorf(\"failed to load credentials, %w\", err)\n\t}\n\n\tcreds := aws.Credentials{\n\t\tAccessKeyID:     resp.AccessKeyID,\n\t\tSecretAccessKey: resp.SecretAccessKey,\n\t\tSessionToken:    resp.Token,\n\t\tSource:          ProviderName,\n\t\tAccountID:       resp.AccountID,\n\t}\n\n\tif resp.Expiration != nil {\n\t\tcreds.CanExpire = true\n\t\tcreds.Expires = *resp.Expiration\n\t}\n\n\treturn creds, nil\n}\n\nfunc (p *Provider) getCredentials(ctx context.Context) (*client.GetCredentialsOutput, error) {\n\tauthToken, err := p.resolveAuthToken()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"resolve auth token: %v\", err)\n\t}\n\n\treturn p.client.GetCredentials(ctx, &client.GetCredentialsInput{\n\t\tAuthorizationToken: authToken,\n\t})\n}\n\nfunc (p *Provider) resolveAuthToken() (string, error) {\n\tauthToken := p.options.AuthorizationToken\n\n\tvar err error\n\tif p.options.AuthorizationTokenProvider != nil {\n\t\tauthToken, err = p.options.AuthorizationTokenProvider.GetToken()\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t}\n\n\tif strings.ContainsAny(authToken, \"\\r\\n\") {\n\t\treturn \"\", fmt.Errorf(\"authorization token contains invalid newline sequence\")\n\t}\n\n\treturn authToken, nil\n}\n\nvar _ aws.CredentialProviderSource = (*Provider)(nil)\n\n// ProviderSources returns the credential chain that was used to construct this provider\nfunc (p *Provider) ProviderSources() []aws.CredentialSource {\n\tif p.options.CredentialSources == nil {\n\t\treturn []aws.CredentialSource{aws.CredentialSourceHTTP}\n\t}\n\treturn p.options.CredentialSources\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go",
    "content": "// Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT.\n\npackage credentials\n\n// goModuleVersion is the tagged release for this module\nconst goModuleVersion = \"1.17.67\"\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/processcreds/doc.go",
    "content": "// Package processcreds is a credentials provider to retrieve credentials from a\n// external CLI invoked process.\n//\n// WARNING: The following describes a method of sourcing credentials from an external\n// process. This can potentially be dangerous, so proceed with caution. Other\n// credential providers should be preferred if at all possible. If using this\n// option, you should make sure that the config file is as locked down as possible\n// using security best practices for your operating system.\n//\n// # Concurrency and caching\n//\n// The Provider is not safe to be used concurrently, and does not provide any\n// caching of credentials retrieved. You should wrap the Provider with a\n// `aws.CredentialsCache` to provide concurrency safety, and caching of\n// credentials.\n//\n// # Loading credentials with the SDKs AWS Config\n//\n// You can use credentials from a AWS shared config `credential_process` in a\n// variety of ways.\n//\n// One way is to setup your shared config file, located in the default\n// location, with the `credential_process` key and the command you want to be\n// called. You also need to set the AWS_SDK_LOAD_CONFIG environment variable\n// (e.g., `export AWS_SDK_LOAD_CONFIG=1`) to use the shared config file.\n//\n//\t[default]\n//\tcredential_process = /command/to/call\n//\n// Loading configuration using external will use the credential process to\n// retrieve credentials. NOTE: If there are credentials in the profile you are\n// using, the credential process will not be used.\n//\n//\t// Initialize a session to load credentials.\n//\tcfg, _ := config.LoadDefaultConfig(context.TODO())\n//\n//\t// Create S3 service client to use the credentials.\n//\tsvc := s3.NewFromConfig(cfg)\n//\n// # Loading credentials with the Provider directly\n//\n// Another way to use the credentials process provider is by using the\n// `NewProvider` constructor to create the provider and providing a it with a\n// command to be executed to retrieve credentials.\n//\n// The following example creates a credentials provider for a command, and wraps\n// it with the CredentialsCache before assigning the provider to the Amazon S3 API\n// client's Credentials option.\n//\n//\t // Create credentials using the Provider.\n//\t\tprovider := processcreds.NewProvider(\"/path/to/command\")\n//\n//\t // Create the service client value configured for credentials.\n//\t svc := s3.New(s3.Options{\n//\t   Credentials: aws.NewCredentialsCache(provider),\n//\t })\n//\n// If you need more control, you can set any configurable options in the\n// credentials using one or more option functions.\n//\n//\tprovider := processcreds.NewProvider(\"/path/to/command\",\n//\t    func(o *processcreds.Options) {\n//\t      // Override the provider's default timeout\n//\t      o.Timeout = 2 * time.Minute\n//\t    })\n//\n// You can also use your own `exec.Cmd` value by satisfying a value that satisfies\n// the `NewCommandBuilder` interface and use the `NewProviderCommand` constructor.\n//\n//\t// Create an exec.Cmd\n//\tcmdBuilder := processcreds.NewCommandBuilderFunc(\n//\t\tfunc(ctx context.Context) (*exec.Cmd, error) {\n//\t\t\tcmd := exec.CommandContext(ctx,\n//\t\t\t\t\"customCLICommand\",\n//\t\t\t\t\"-a\", \"argument\",\n//\t\t\t)\n//\t\t\tcmd.Env = []string{\n//\t\t\t\t\"ENV_VAR_FOO=value\",\n//\t\t\t\t\"ENV_VAR_BAR=other_value\",\n//\t\t\t}\n//\n//\t\t\treturn cmd, nil\n//\t\t},\n//\t)\n//\n//\t// Create credentials using your exec.Cmd and custom timeout\n//\tprovider := processcreds.NewProviderCommand(cmdBuilder,\n//\t\tfunc(opt *processcreds.Provider) {\n//\t\t\t// optionally override the provider's default timeout\n//\t\t\topt.Timeout = 1 * time.Second\n//\t\t})\npackage processcreds\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/processcreds/provider.go",
    "content": "package processcreds\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"os/exec\"\n\t\"runtime\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/sdkio\"\n)\n\nconst (\n\t// ProviderName is the name this credentials provider will label any\n\t// returned credentials Value with.\n\tProviderName = `ProcessProvider`\n\n\t// DefaultTimeout default limit on time a process can run.\n\tDefaultTimeout = time.Duration(1) * time.Minute\n)\n\n// ProviderError is an error indicating failure initializing or executing the\n// process credentials provider\ntype ProviderError struct {\n\tErr error\n}\n\n// Error returns the error message.\nfunc (e *ProviderError) Error() string {\n\treturn fmt.Sprintf(\"process provider error: %v\", e.Err)\n}\n\n// Unwrap returns the underlying error the provider error wraps.\nfunc (e *ProviderError) Unwrap() error {\n\treturn e.Err\n}\n\n// Provider satisfies the credentials.Provider interface, and is a\n// client to retrieve credentials from a process.\ntype Provider struct {\n\t// Provides a constructor for exec.Cmd that are invoked by the provider for\n\t// retrieving credentials. Use this to provide custom creation of exec.Cmd\n\t// with things like environment variables, or other configuration.\n\t//\n\t// The provider defaults to the DefaultNewCommand function.\n\tcommandBuilder NewCommandBuilder\n\n\toptions Options\n}\n\n// Options is the configuration options for configuring the Provider.\ntype Options struct {\n\t// Timeout limits the time a process can run.\n\tTimeout time.Duration\n\t// The chain of providers that was used to create this provider\n\t// These values are for reporting purposes and are not meant to be set up directly\n\tCredentialSources []aws.CredentialSource\n}\n\n// NewCommandBuilder provides the interface for specifying how command will be\n// created that the Provider will use to retrieve credentials with.\ntype NewCommandBuilder interface {\n\tNewCommand(context.Context) (*exec.Cmd, error)\n}\n\n// NewCommandBuilderFunc provides a wrapper type around a function pointer to\n// satisfy the NewCommandBuilder interface.\ntype NewCommandBuilderFunc func(context.Context) (*exec.Cmd, error)\n\n// NewCommand calls the underlying function pointer the builder was initialized with.\nfunc (fn NewCommandBuilderFunc) NewCommand(ctx context.Context) (*exec.Cmd, error) {\n\treturn fn(ctx)\n}\n\n// DefaultNewCommandBuilder provides the default NewCommandBuilder\n// implementation used by the provider. It takes a command and arguments to\n// invoke. The command will also be initialized with the current process\n// environment variables, stderr, and stdin pipes.\ntype DefaultNewCommandBuilder struct {\n\tArgs []string\n}\n\n// NewCommand returns an initialized exec.Cmd with the builder's initialized\n// Args. The command is also initialized current process environment variables,\n// stderr, and stdin pipes.\nfunc (b DefaultNewCommandBuilder) NewCommand(ctx context.Context) (*exec.Cmd, error) {\n\tvar cmdArgs []string\n\tif runtime.GOOS == \"windows\" {\n\t\tcmdArgs = []string{\"cmd.exe\", \"/C\"}\n\t} else {\n\t\tcmdArgs = []string{\"sh\", \"-c\"}\n\t}\n\n\tif len(b.Args) == 0 {\n\t\treturn nil, &ProviderError{\n\t\t\tErr: fmt.Errorf(\"failed to prepare command: command must not be empty\"),\n\t\t}\n\t}\n\n\tcmdArgs = append(cmdArgs, b.Args...)\n\tcmd := exec.CommandContext(ctx, cmdArgs[0], cmdArgs[1:]...)\n\tcmd.Env = os.Environ()\n\n\tcmd.Stderr = os.Stderr // display stderr on console for MFA\n\tcmd.Stdin = os.Stdin   // enable stdin for MFA\n\n\treturn cmd, nil\n}\n\n// NewProvider returns a pointer to a new Credentials object wrapping the\n// Provider.\n//\n// The provider defaults to the DefaultNewCommandBuilder for creating command\n// the Provider will use to retrieve credentials with.\nfunc NewProvider(command string, options ...func(*Options)) *Provider {\n\tvar args []string\n\n\t// Ensure that the command arguments are not set if the provided command is\n\t// empty. This will error out when the command is executed since no\n\t// arguments are specified.\n\tif len(command) > 0 {\n\t\targs = []string{command}\n\t}\n\n\tcommanBuilder := DefaultNewCommandBuilder{\n\t\tArgs: args,\n\t}\n\treturn NewProviderCommand(commanBuilder, options...)\n}\n\n// NewProviderCommand returns a pointer to a new Credentials object with the\n// specified command, and default timeout duration. Use this to provide custom\n// creation of exec.Cmd for options like environment variables, or other\n// configuration.\nfunc NewProviderCommand(builder NewCommandBuilder, options ...func(*Options)) *Provider {\n\tp := &Provider{\n\t\tcommandBuilder: builder,\n\t\toptions: Options{\n\t\t\tTimeout: DefaultTimeout,\n\t\t},\n\t}\n\n\tfor _, option := range options {\n\t\toption(&p.options)\n\t}\n\n\treturn p\n}\n\n// A CredentialProcessResponse is the AWS credentials format that must be\n// returned when executing an external credential_process.\ntype CredentialProcessResponse struct {\n\t// As of this writing, the Version key must be set to 1. This might\n\t// increment over time as the structure evolves.\n\tVersion int\n\n\t// The access key ID that identifies the temporary security credentials.\n\tAccessKeyID string `json:\"AccessKeyId\"`\n\n\t// The secret access key that can be used to sign requests.\n\tSecretAccessKey string\n\n\t// The token that users must pass to the service API to use the temporary credentials.\n\tSessionToken string\n\n\t// The date on which the current credentials expire.\n\tExpiration *time.Time\n\n\t// The ID of the account for credentials\n\tAccountID string `json:\"AccountId\"`\n}\n\n// Retrieve executes the credential process command and returns the\n// credentials, or error if the command fails.\nfunc (p *Provider) Retrieve(ctx context.Context) (aws.Credentials, error) {\n\tout, err := p.executeCredentialProcess(ctx)\n\tif err != nil {\n\t\treturn aws.Credentials{Source: ProviderName}, err\n\t}\n\n\t// Serialize and validate response\n\tresp := &CredentialProcessResponse{}\n\tif err = json.Unmarshal(out, resp); err != nil {\n\t\treturn aws.Credentials{Source: ProviderName}, &ProviderError{\n\t\t\tErr: fmt.Errorf(\"parse failed of process output: %s, error: %w\", out, err),\n\t\t}\n\t}\n\n\tif resp.Version != 1 {\n\t\treturn aws.Credentials{Source: ProviderName}, &ProviderError{\n\t\t\tErr: fmt.Errorf(\"wrong version in process output (not 1)\"),\n\t\t}\n\t}\n\n\tif len(resp.AccessKeyID) == 0 {\n\t\treturn aws.Credentials{Source: ProviderName}, &ProviderError{\n\t\t\tErr: fmt.Errorf(\"missing AccessKeyId in process output\"),\n\t\t}\n\t}\n\n\tif len(resp.SecretAccessKey) == 0 {\n\t\treturn aws.Credentials{Source: ProviderName}, &ProviderError{\n\t\t\tErr: fmt.Errorf(\"missing SecretAccessKey in process output\"),\n\t\t}\n\t}\n\n\tcreds := aws.Credentials{\n\t\tSource:          ProviderName,\n\t\tAccessKeyID:     resp.AccessKeyID,\n\t\tSecretAccessKey: resp.SecretAccessKey,\n\t\tSessionToken:    resp.SessionToken,\n\t\tAccountID:       resp.AccountID,\n\t}\n\n\t// Handle expiration\n\tif resp.Expiration != nil {\n\t\tcreds.CanExpire = true\n\t\tcreds.Expires = *resp.Expiration\n\t}\n\n\treturn creds, nil\n}\n\n// executeCredentialProcess starts the credential process on the OS and\n// returns the results or an error.\nfunc (p *Provider) executeCredentialProcess(ctx context.Context) ([]byte, error) {\n\tif p.options.Timeout >= 0 {\n\t\tvar cancelFunc func()\n\t\tctx, cancelFunc = context.WithTimeout(ctx, p.options.Timeout)\n\t\tdefer cancelFunc()\n\t}\n\n\tcmd, err := p.commandBuilder.NewCommand(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// get creds json on process's stdout\n\toutput := bytes.NewBuffer(make([]byte, 0, int(8*sdkio.KibiByte)))\n\tif cmd.Stdout != nil {\n\t\tcmd.Stdout = io.MultiWriter(cmd.Stdout, output)\n\t} else {\n\t\tcmd.Stdout = output\n\t}\n\n\texecCh := make(chan error, 1)\n\tgo executeCommand(cmd, execCh)\n\n\tselect {\n\tcase execError := <-execCh:\n\t\tif execError == nil {\n\t\t\tbreak\n\t\t}\n\t\tselect {\n\t\tcase <-ctx.Done():\n\t\t\treturn output.Bytes(), &ProviderError{\n\t\t\t\tErr: fmt.Errorf(\"credential process timed out: %w\", execError),\n\t\t\t}\n\t\tdefault:\n\t\t\treturn output.Bytes(), &ProviderError{\n\t\t\t\tErr: fmt.Errorf(\"error in credential_process: %w\", execError),\n\t\t\t}\n\t\t}\n\t}\n\n\tout := output.Bytes()\n\tif runtime.GOOS == \"windows\" {\n\t\t// windows adds slashes to quotes\n\t\tout = bytes.ReplaceAll(out, []byte(`\\\"`), []byte(`\"`))\n\t}\n\n\treturn out, nil\n}\n\n// ProviderSources returns the credential chain that was used to construct this provider\nfunc (p *Provider) ProviderSources() []aws.CredentialSource {\n\tif p.options.CredentialSources == nil {\n\t\treturn []aws.CredentialSource{aws.CredentialSourceProcess}\n\t}\n\treturn p.options.CredentialSources\n}\n\nfunc executeCommand(cmd *exec.Cmd, exec chan error) {\n\t// Start the command\n\terr := cmd.Start()\n\tif err == nil {\n\t\terr = cmd.Wait()\n\t}\n\n\texec <- err\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/doc.go",
    "content": "// Package ssocreds provides a credential provider for retrieving temporary AWS\n// credentials using an SSO access token.\n//\n// IMPORTANT: The provider in this package does not initiate or perform the AWS\n// SSO login flow. The SDK provider expects that you have already performed the\n// SSO login flow using AWS CLI using the \"aws sso login\" command, or by some\n// other mechanism. The provider must find a valid non-expired access token for\n// the AWS SSO user portal URL in ~/.aws/sso/cache. If a cached token is not\n// found, it is expired, or the file is malformed an error will be returned.\n//\n// # Loading AWS SSO credentials with the AWS shared configuration file\n//\n// You can use configure AWS SSO credentials from the AWS shared configuration file by\n// specifying the required keys in the profile and referencing an sso-session:\n//\n//\tsso_session\n//\tsso_account_id\n//\tsso_role_name\n//\n// For example, the following defines a profile \"devsso\" and specifies the AWS\n// SSO parameters that defines the target account, role, sign-on portal, and\n// the region where the user portal is located. Note: all SSO arguments must be\n// provided, or an error will be returned.\n//\n//\t[profile devsso]\n//\tsso_session = dev-session\n//\tsso_role_name = SSOReadOnlyRole\n//\tsso_account_id = 123456789012\n//\n//\t[sso-session dev-session]\n//\tsso_start_url = https://my-sso-portal.awsapps.com/start\n//\tsso_region = us-east-1\n//\tsso_registration_scopes = sso:account:access\n//\n// Using the config module, you can load the AWS SDK shared configuration, and\n// specify that this profile be used to retrieve credentials. For example:\n//\n//\tconfig, err := config.LoadDefaultConfig(context.TODO(), config.WithSharedConfigProfile(\"devsso\"))\n//\tif err != nil {\n//\t    return err\n//\t}\n//\n// # Programmatically loading AWS SSO credentials directly\n//\n// You can programmatically construct the AWS SSO Provider in your application,\n// and provide the necessary information to load and retrieve temporary\n// credentials using an access token from ~/.aws/sso/cache.\n//\n//\tssoClient := sso.NewFromConfig(cfg)\n//\tssoOidcClient := ssooidc.NewFromConfig(cfg)\n//\ttokenPath, err := ssocreds.StandardCachedTokenFilepath(\"dev-session\")\n//\tif err != nil {\n//\t    return err\n//\t}\n//\n//\tvar provider aws.CredentialsProvider\n//\tprovider = ssocreds.New(ssoClient, \"123456789012\", \"SSOReadOnlyRole\", \"https://my-sso-portal.awsapps.com/start\", func(options *ssocreds.Options) {\n//\t  options.SSOTokenProvider = ssocreds.NewSSOTokenProvider(ssoOidcClient, tokenPath)\n//\t})\n//\n//\t// Wrap the provider with aws.CredentialsCache to cache the credentials until their expire time\n//\tprovider = aws.NewCredentialsCache(provider)\n//\n//\tcredentials, err := provider.Retrieve(context.TODO())\n//\tif err != nil {\n//\t    return err\n//\t}\n//\n// It is important that you wrap the Provider with aws.CredentialsCache if you\n// are programmatically constructing the provider directly. This prevents your\n// application from accessing the cached access token and requesting new\n// credentials each time the credentials are used.\n//\n// # Additional Resources\n//\n// Configuring the AWS CLI to use AWS Single Sign-On:\n// https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html\n//\n// AWS Single Sign-On User Guide:\n// https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html\npackage ssocreds\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/sso_cached_token.go",
    "content": "package ssocreds\n\nimport (\n\t\"crypto/sha1\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/internal/sdk\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/shareddefaults\"\n)\n\nvar osUserHomeDur = shareddefaults.UserHomeDir\n\n// StandardCachedTokenFilepath returns the filepath for the cached SSO token file, or\n// error if unable get derive the path. Key that will be used to compute a SHA1\n// value that is hex encoded.\n//\n// Derives the filepath using the Key as:\n//\n//\t~/.aws/sso/cache/<sha1-hex-encoded-key>.json\nfunc StandardCachedTokenFilepath(key string) (string, error) {\n\thomeDir := osUserHomeDur()\n\tif len(homeDir) == 0 {\n\t\treturn \"\", fmt.Errorf(\"unable to get USER's home directory for cached token\")\n\t}\n\thash := sha1.New()\n\tif _, err := hash.Write([]byte(key)); err != nil {\n\t\treturn \"\", fmt.Errorf(\"unable to compute cached token filepath key SHA1 hash, %w\", err)\n\t}\n\n\tcacheFilename := strings.ToLower(hex.EncodeToString(hash.Sum(nil))) + \".json\"\n\n\treturn filepath.Join(homeDir, \".aws\", \"sso\", \"cache\", cacheFilename), nil\n}\n\ntype tokenKnownFields struct {\n\tAccessToken string   `json:\"accessToken,omitempty\"`\n\tExpiresAt   *rfc3339 `json:\"expiresAt,omitempty\"`\n\n\tRefreshToken string `json:\"refreshToken,omitempty\"`\n\tClientID     string `json:\"clientId,omitempty\"`\n\tClientSecret string `json:\"clientSecret,omitempty\"`\n}\n\ntype token struct {\n\ttokenKnownFields\n\tUnknownFields map[string]interface{} `json:\"-\"`\n}\n\nfunc (t token) MarshalJSON() ([]byte, error) {\n\tfields := map[string]interface{}{}\n\n\tsetTokenFieldString(fields, \"accessToken\", t.AccessToken)\n\tsetTokenFieldRFC3339(fields, \"expiresAt\", t.ExpiresAt)\n\n\tsetTokenFieldString(fields, \"refreshToken\", t.RefreshToken)\n\tsetTokenFieldString(fields, \"clientId\", t.ClientID)\n\tsetTokenFieldString(fields, \"clientSecret\", t.ClientSecret)\n\n\tfor k, v := range t.UnknownFields {\n\t\tif _, ok := fields[k]; ok {\n\t\t\treturn nil, fmt.Errorf(\"unknown token field %v, duplicates known field\", k)\n\t\t}\n\t\tfields[k] = v\n\t}\n\n\treturn json.Marshal(fields)\n}\n\nfunc setTokenFieldString(fields map[string]interface{}, key, value string) {\n\tif value == \"\" {\n\t\treturn\n\t}\n\tfields[key] = value\n}\nfunc setTokenFieldRFC3339(fields map[string]interface{}, key string, value *rfc3339) {\n\tif value == nil {\n\t\treturn\n\t}\n\tfields[key] = value\n}\n\nfunc (t *token) UnmarshalJSON(b []byte) error {\n\tvar fields map[string]interface{}\n\tif err := json.Unmarshal(b, &fields); err != nil {\n\t\treturn nil\n\t}\n\n\tt.UnknownFields = map[string]interface{}{}\n\n\tfor k, v := range fields {\n\t\tvar err error\n\t\tswitch k {\n\t\tcase \"accessToken\":\n\t\t\terr = getTokenFieldString(v, &t.AccessToken)\n\t\tcase \"expiresAt\":\n\t\t\terr = getTokenFieldRFC3339(v, &t.ExpiresAt)\n\t\tcase \"refreshToken\":\n\t\t\terr = getTokenFieldString(v, &t.RefreshToken)\n\t\tcase \"clientId\":\n\t\t\terr = getTokenFieldString(v, &t.ClientID)\n\t\tcase \"clientSecret\":\n\t\t\terr = getTokenFieldString(v, &t.ClientSecret)\n\t\tdefault:\n\t\t\tt.UnknownFields[k] = v\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"field %q, %w\", k, err)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc getTokenFieldString(v interface{}, value *string) error {\n\tvar ok bool\n\t*value, ok = v.(string)\n\tif !ok {\n\t\treturn fmt.Errorf(\"expect value to be string, got %T\", v)\n\t}\n\treturn nil\n}\n\nfunc getTokenFieldRFC3339(v interface{}, value **rfc3339) error {\n\tvar stringValue string\n\tif err := getTokenFieldString(v, &stringValue); err != nil {\n\t\treturn err\n\t}\n\n\ttimeValue, err := parseRFC3339(stringValue)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t*value = &timeValue\n\treturn nil\n}\n\nfunc loadCachedToken(filename string) (token, error) {\n\tfileBytes, err := ioutil.ReadFile(filename)\n\tif err != nil {\n\t\treturn token{}, fmt.Errorf(\"failed to read cached SSO token file, %w\", err)\n\t}\n\n\tvar t token\n\tif err := json.Unmarshal(fileBytes, &t); err != nil {\n\t\treturn token{}, fmt.Errorf(\"failed to parse cached SSO token file, %w\", err)\n\t}\n\n\tif len(t.AccessToken) == 0 || t.ExpiresAt == nil || time.Time(*t.ExpiresAt).IsZero() {\n\t\treturn token{}, fmt.Errorf(\n\t\t\t\"cached SSO token must contain accessToken and expiresAt fields\")\n\t}\n\n\treturn t, nil\n}\n\nfunc storeCachedToken(filename string, t token, fileMode os.FileMode) (err error) {\n\ttmpFilename := filename + \".tmp-\" + strconv.FormatInt(sdk.NowTime().UnixNano(), 10)\n\tif err := writeCacheFile(tmpFilename, fileMode, t); err != nil {\n\t\treturn err\n\t}\n\n\tif err := os.Rename(tmpFilename, filename); err != nil {\n\t\treturn fmt.Errorf(\"failed to replace old cached SSO token file, %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc writeCacheFile(filename string, fileMode os.FileMode, t token) (err error) {\n\tvar f *os.File\n\tf, err = os.OpenFile(filename, os.O_CREATE|os.O_TRUNC|os.O_RDWR, fileMode)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create cached SSO token file %w\", err)\n\t}\n\n\tdefer func() {\n\t\tcloseErr := f.Close()\n\t\tif err == nil && closeErr != nil {\n\t\t\terr = fmt.Errorf(\"failed to close cached SSO token file, %w\", closeErr)\n\t\t}\n\t}()\n\n\tencoder := json.NewEncoder(f)\n\n\tif err = encoder.Encode(t); err != nil {\n\t\treturn fmt.Errorf(\"failed to serialize cached SSO token, %w\", err)\n\t}\n\n\treturn nil\n}\n\ntype rfc3339 time.Time\n\nfunc parseRFC3339(v string) (rfc3339, error) {\n\tparsed, err := time.Parse(time.RFC3339, v)\n\tif err != nil {\n\t\treturn rfc3339{}, fmt.Errorf(\"expected RFC3339 timestamp: %w\", err)\n\t}\n\n\treturn rfc3339(parsed), nil\n}\n\nfunc (r *rfc3339) UnmarshalJSON(bytes []byte) (err error) {\n\tvar value string\n\n\t// Use JSON unmarshal to unescape the quoted value making use of JSON's\n\t// unquoting rules.\n\tif err = json.Unmarshal(bytes, &value); err != nil {\n\t\treturn err\n\t}\n\n\t*r, err = parseRFC3339(value)\n\n\treturn nil\n}\n\nfunc (r *rfc3339) MarshalJSON() ([]byte, error) {\n\tvalue := time.Time(*r).UTC().Format(time.RFC3339)\n\n\t// Use JSON unmarshal to unescape the quoted value making use of JSON's\n\t// quoting rules.\n\treturn json.Marshal(value)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/sso_credentials_provider.go",
    "content": "package ssocreds\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/sdk\"\n\t\"github.com/aws/aws-sdk-go-v2/service/sso\"\n)\n\n// ProviderName is the name of the provider used to specify the source of\n// credentials.\nconst ProviderName = \"SSOProvider\"\n\n// GetRoleCredentialsAPIClient is a API client that implements the\n// GetRoleCredentials operation.\ntype GetRoleCredentialsAPIClient interface {\n\tGetRoleCredentials(context.Context, *sso.GetRoleCredentialsInput, ...func(*sso.Options)) (\n\t\t*sso.GetRoleCredentialsOutput, error,\n\t)\n}\n\n// Options is the Provider options structure.\ntype Options struct {\n\t// The Client which is configured for the AWS Region where the AWS SSO user\n\t// portal is located.\n\tClient GetRoleCredentialsAPIClient\n\n\t// The AWS account that is assigned to the user.\n\tAccountID string\n\n\t// The role name that is assigned to the user.\n\tRoleName string\n\n\t// The URL that points to the organization's AWS Single Sign-On (AWS SSO)\n\t// user portal.\n\tStartURL string\n\n\t// The filepath the cached token will be retrieved from. If unset Provider will\n\t// use the startURL to determine the filepath at.\n\t//\n\t//    ~/.aws/sso/cache/<sha1-hex-encoded-startURL>.json\n\t//\n\t// If custom cached token filepath is used, the Provider's startUrl\n\t// parameter will be ignored.\n\tCachedTokenFilepath string\n\n\t// Used by the SSOCredentialProvider if a token configuration\n\t// profile is used in the shared config\n\tSSOTokenProvider *SSOTokenProvider\n\n\t// The chain of providers that was used to create this provider.\n\t// These values are for reporting purposes and are not meant to be set up directly\n\tCredentialSources []aws.CredentialSource\n}\n\n// Provider is an AWS credential provider that retrieves temporary AWS\n// credentials by exchanging an SSO login token.\ntype Provider struct {\n\toptions Options\n\n\tcachedTokenFilepath string\n}\n\n// New returns a new AWS Single Sign-On (AWS SSO) credential provider. The\n// provided client is expected to be configured for the AWS Region where the\n// AWS SSO user portal is located.\nfunc New(client GetRoleCredentialsAPIClient, accountID, roleName, startURL string, optFns ...func(options *Options)) *Provider {\n\toptions := Options{\n\t\tClient:    client,\n\t\tAccountID: accountID,\n\t\tRoleName:  roleName,\n\t\tStartURL:  startURL,\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &Provider{\n\t\toptions:             options,\n\t\tcachedTokenFilepath: options.CachedTokenFilepath,\n\t}\n}\n\n// Retrieve retrieves temporary AWS credentials from the configured Amazon\n// Single Sign-On (AWS SSO) user portal by exchanging the accessToken present\n// in ~/.aws/sso/cache. However, if a token provider configuration exists\n// in the shared config, then we ought to use the token provider rather then\n// direct access on the cached token.\nfunc (p *Provider) Retrieve(ctx context.Context) (aws.Credentials, error) {\n\tvar accessToken *string\n\tif p.options.SSOTokenProvider != nil {\n\t\ttoken, err := p.options.SSOTokenProvider.RetrieveBearerToken(ctx)\n\t\tif err != nil {\n\t\t\treturn aws.Credentials{}, err\n\t\t}\n\t\taccessToken = &token.Value\n\t} else {\n\t\tif p.cachedTokenFilepath == \"\" {\n\t\t\tcachedTokenFilepath, err := StandardCachedTokenFilepath(p.options.StartURL)\n\t\t\tif err != nil {\n\t\t\t\treturn aws.Credentials{}, &InvalidTokenError{Err: err}\n\t\t\t}\n\t\t\tp.cachedTokenFilepath = cachedTokenFilepath\n\t\t}\n\n\t\ttokenFile, err := loadCachedToken(p.cachedTokenFilepath)\n\t\tif err != nil {\n\t\t\treturn aws.Credentials{}, &InvalidTokenError{Err: err}\n\t\t}\n\n\t\tif tokenFile.ExpiresAt == nil || sdk.NowTime().After(time.Time(*tokenFile.ExpiresAt)) {\n\t\t\treturn aws.Credentials{}, &InvalidTokenError{}\n\t\t}\n\t\taccessToken = &tokenFile.AccessToken\n\t}\n\n\toutput, err := p.options.Client.GetRoleCredentials(ctx, &sso.GetRoleCredentialsInput{\n\t\tAccessToken: accessToken,\n\t\tAccountId:   &p.options.AccountID,\n\t\tRoleName:    &p.options.RoleName,\n\t})\n\tif err != nil {\n\t\treturn aws.Credentials{}, err\n\t}\n\n\treturn aws.Credentials{\n\t\tAccessKeyID:     aws.ToString(output.RoleCredentials.AccessKeyId),\n\t\tSecretAccessKey: aws.ToString(output.RoleCredentials.SecretAccessKey),\n\t\tSessionToken:    aws.ToString(output.RoleCredentials.SessionToken),\n\t\tCanExpire:       true,\n\t\tExpires:         time.Unix(0, output.RoleCredentials.Expiration*int64(time.Millisecond)).UTC(),\n\t\tSource:          ProviderName,\n\t\tAccountID:       p.options.AccountID,\n\t}, nil\n}\n\n// ProviderSources returns the credential chain that was used to construct this provider\nfunc (p *Provider) ProviderSources() []aws.CredentialSource {\n\tif p.options.CredentialSources == nil {\n\t\treturn []aws.CredentialSource{aws.CredentialSourceSSO}\n\t}\n\treturn p.options.CredentialSources\n}\n\n// InvalidTokenError is the error type that is returned if loaded token has\n// expired or is otherwise invalid. To refresh the SSO session run AWS SSO\n// login with the corresponding profile.\ntype InvalidTokenError struct {\n\tErr error\n}\n\nfunc (i *InvalidTokenError) Unwrap() error {\n\treturn i.Err\n}\n\nfunc (i *InvalidTokenError) Error() string {\n\tconst msg = \"the SSO session has expired or is invalid\"\n\tif i.Err == nil {\n\t\treturn msg\n\t}\n\treturn msg + \": \" + i.Err.Error()\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/sso_token_provider.go",
    "content": "package ssocreds\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/sdk\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ssooidc\"\n\t\"github.com/aws/smithy-go/auth/bearer\"\n)\n\n// CreateTokenAPIClient provides the interface for the SSOTokenProvider's API\n// client for calling CreateToken operation to refresh the SSO token.\ntype CreateTokenAPIClient interface {\n\tCreateToken(context.Context, *ssooidc.CreateTokenInput, ...func(*ssooidc.Options)) (\n\t\t*ssooidc.CreateTokenOutput, error,\n\t)\n}\n\n// SSOTokenProviderOptions provides the options for configuring the\n// SSOTokenProvider.\ntype SSOTokenProviderOptions struct {\n\t// Client that can be overridden\n\tClient CreateTokenAPIClient\n\n\t// The set of API Client options to be applied when invoking the\n\t// CreateToken operation.\n\tClientOptions []func(*ssooidc.Options)\n\n\t// The path the file containing the cached SSO token will be read from.\n\t// Initialized the NewSSOTokenProvider's cachedTokenFilepath parameter.\n\tCachedTokenFilepath string\n}\n\n// SSOTokenProvider provides an utility for refreshing SSO AccessTokens for\n// Bearer Authentication. The SSOTokenProvider can only be used to refresh\n// already cached SSO Tokens. This utility cannot perform the initial SSO\n// create token.\n//\n// The SSOTokenProvider is not safe to use concurrently. It must be wrapped in\n// a utility such as smithy-go's auth/bearer#TokenCache. The SDK's\n// config.LoadDefaultConfig will automatically wrap the SSOTokenProvider with\n// the smithy-go TokenCache, if the external configuration loaded configured\n// for an SSO session.\n//\n// The initial SSO create token should be preformed with the AWS CLI before the\n// Go application using the SSOTokenProvider will need to retrieve the SSO\n// token. If the AWS CLI has not created the token cache file, this provider\n// will return an error when attempting to retrieve the cached token.\n//\n// This provider will attempt to refresh the cached SSO token periodically if\n// needed when RetrieveBearerToken is called.\n//\n// A utility such as the AWS CLI must be used to initially create the SSO\n// session and cached token file.\n// https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html\ntype SSOTokenProvider struct {\n\toptions SSOTokenProviderOptions\n}\n\nvar _ bearer.TokenProvider = (*SSOTokenProvider)(nil)\n\n// NewSSOTokenProvider returns an initialized SSOTokenProvider that will\n// periodically refresh the SSO token cached stored in the cachedTokenFilepath.\n// The cachedTokenFilepath file's content will be rewritten by the token\n// provider when the token is refreshed.\n//\n// The client must be configured for the AWS region the SSO token was created for.\nfunc NewSSOTokenProvider(client CreateTokenAPIClient, cachedTokenFilepath string, optFns ...func(o *SSOTokenProviderOptions)) *SSOTokenProvider {\n\toptions := SSOTokenProviderOptions{\n\t\tClient:              client,\n\t\tCachedTokenFilepath: cachedTokenFilepath,\n\t}\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tprovider := &SSOTokenProvider{\n\t\toptions: options,\n\t}\n\n\treturn provider\n}\n\n// RetrieveBearerToken returns the SSO token stored in the cachedTokenFilepath\n// the SSOTokenProvider was created with. If the token has expired\n// RetrieveBearerToken will attempt to refresh it. If the token cannot be\n// refreshed or is not present an error will be returned.\n//\n// A utility such as the AWS CLI must be used to initially create the SSO\n// session and cached token file. https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html\nfunc (p SSOTokenProvider) RetrieveBearerToken(ctx context.Context) (bearer.Token, error) {\n\tcachedToken, err := loadCachedToken(p.options.CachedTokenFilepath)\n\tif err != nil {\n\t\treturn bearer.Token{}, err\n\t}\n\n\tif cachedToken.ExpiresAt != nil && sdk.NowTime().After(time.Time(*cachedToken.ExpiresAt)) {\n\t\tcachedToken, err = p.refreshToken(ctx, cachedToken)\n\t\tif err != nil {\n\t\t\treturn bearer.Token{}, fmt.Errorf(\"refresh cached SSO token failed, %w\", err)\n\t\t}\n\t}\n\n\texpiresAt := aws.ToTime((*time.Time)(cachedToken.ExpiresAt))\n\treturn bearer.Token{\n\t\tValue:     cachedToken.AccessToken,\n\t\tCanExpire: !expiresAt.IsZero(),\n\t\tExpires:   expiresAt,\n\t}, nil\n}\n\nfunc (p SSOTokenProvider) refreshToken(ctx context.Context, cachedToken token) (token, error) {\n\tif cachedToken.ClientSecret == \"\" || cachedToken.ClientID == \"\" || cachedToken.RefreshToken == \"\" {\n\t\treturn token{}, fmt.Errorf(\"cached SSO token is expired, or not present, and cannot be refreshed\")\n\t}\n\n\tcreateResult, err := p.options.Client.CreateToken(ctx, &ssooidc.CreateTokenInput{\n\t\tClientId:     &cachedToken.ClientID,\n\t\tClientSecret: &cachedToken.ClientSecret,\n\t\tRefreshToken: &cachedToken.RefreshToken,\n\t\tGrantType:    aws.String(\"refresh_token\"),\n\t}, p.options.ClientOptions...)\n\tif err != nil {\n\t\treturn token{}, fmt.Errorf(\"unable to refresh SSO token, %w\", err)\n\t}\n\n\texpiresAt := sdk.NowTime().Add(time.Duration(createResult.ExpiresIn) * time.Second)\n\n\tcachedToken.AccessToken = aws.ToString(createResult.AccessToken)\n\tcachedToken.ExpiresAt = (*rfc3339)(&expiresAt)\n\tcachedToken.RefreshToken = aws.ToString(createResult.RefreshToken)\n\n\tfileInfo, err := os.Stat(p.options.CachedTokenFilepath)\n\tif err != nil {\n\t\treturn token{}, fmt.Errorf(\"failed to stat cached SSO token file %w\", err)\n\t}\n\n\tif err = storeCachedToken(p.options.CachedTokenFilepath, cachedToken, fileInfo.Mode()); err != nil {\n\t\treturn token{}, fmt.Errorf(\"unable to cache refreshed SSO token, %w\", err)\n\t}\n\n\treturn cachedToken, nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/static_provider.go",
    "content": "package credentials\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n)\n\nconst (\n\t// StaticCredentialsName provides a name of Static provider\n\tStaticCredentialsName = \"StaticCredentials\"\n)\n\n// StaticCredentialsEmptyError is emitted when static credentials are empty.\ntype StaticCredentialsEmptyError struct{}\n\nfunc (*StaticCredentialsEmptyError) Error() string {\n\treturn \"static credentials are empty\"\n}\n\n// A StaticCredentialsProvider is a set of credentials which are set, and will\n// never expire.\ntype StaticCredentialsProvider struct {\n\tValue aws.Credentials\n\t// These values are for reporting purposes and are not meant to be set up directly\n\tSource []aws.CredentialSource\n}\n\n// ProviderSources returns the credential chain that was used to construct this provider\nfunc (s StaticCredentialsProvider) ProviderSources() []aws.CredentialSource {\n\tif s.Source == nil {\n\t\treturn []aws.CredentialSource{aws.CredentialSourceCode} // If no source has been set, assume this is used directly which means hardcoded creds\n\t}\n\treturn s.Source\n}\n\n// NewStaticCredentialsProvider return a StaticCredentialsProvider initialized with the AWS\n// credentials passed in.\nfunc NewStaticCredentialsProvider(key, secret, session string) StaticCredentialsProvider {\n\treturn StaticCredentialsProvider{\n\t\tValue: aws.Credentials{\n\t\t\tAccessKeyID:     key,\n\t\t\tSecretAccessKey: secret,\n\t\t\tSessionToken:    session,\n\t\t},\n\t}\n}\n\n// Retrieve returns the credentials or error if the credentials are invalid.\nfunc (s StaticCredentialsProvider) Retrieve(_ context.Context) (aws.Credentials, error) {\n\tv := s.Value\n\tif v.AccessKeyID == \"\" || v.SecretAccessKey == \"\" {\n\t\treturn aws.Credentials{\n\t\t\tSource: StaticCredentialsName,\n\t\t}, &StaticCredentialsEmptyError{}\n\t}\n\n\tif len(v.Source) == 0 {\n\t\tv.Source = StaticCredentialsName\n\t}\n\n\treturn v, nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/stscreds/assume_role_provider.go",
    "content": "// Package stscreds are credential Providers to retrieve STS AWS credentials.\n//\n// STS provides multiple ways to retrieve credentials which can be used when making\n// future AWS service API operation calls.\n//\n// The SDK will ensure that per instance of credentials.Credentials all requests\n// to refresh the credentials will be synchronized. But, the SDK is unable to\n// ensure synchronous usage of the AssumeRoleProvider if the value is shared\n// between multiple Credentials or service clients.\n//\n// # Assume Role\n//\n// To assume an IAM role using STS with the SDK you can create a new Credentials\n// with the SDKs's stscreds package.\n//\n//\t// Initial credentials loaded from SDK's default credential chain. Such as\n//\t// the environment, shared credentials (~/.aws/credentials), or EC2 Instance\n//\t// Role. These credentials will be used to to make the STS Assume Role API.\n//\tcfg, err := config.LoadDefaultConfig(context.TODO())\n//\tif err != nil {\n//\t\tpanic(err)\n//\t}\n//\n//\t// Create the credentials from AssumeRoleProvider to assume the role\n//\t// referenced by the \"myRoleARN\" ARN.\n//\tstsSvc := sts.NewFromConfig(cfg)\n//\tcreds := stscreds.NewAssumeRoleProvider(stsSvc, \"myRoleArn\")\n//\n//\tcfg.Credentials = aws.NewCredentialsCache(creds)\n//\n//\t// Create service client value configured for credentials\n//\t// from assumed role.\n//\tsvc := s3.NewFromConfig(cfg)\n//\n// # Assume Role with custom MFA Token provider\n//\n// To assume an IAM role with a MFA token you can either specify a custom MFA\n// token provider or use the SDK's built in StdinTokenProvider that will prompt\n// the user for a token code each time the credentials need to to be refreshed.\n// Specifying a custom token provider allows you to control where the token\n// code is retrieved from, and how it is refreshed.\n//\n// With a custom token provider, the provider is responsible for refreshing the\n// token code when called.\n//\n//\t\tcfg, err := config.LoadDefaultConfig(context.TODO())\n//\t\tif err != nil {\n//\t\t\tpanic(err)\n//\t\t}\n//\n//\t staticTokenProvider := func() (string, error) {\n//\t     return someTokenCode, nil\n//\t }\n//\n//\t\t// Create the credentials from AssumeRoleProvider to assume the role\n//\t\t// referenced by the \"myRoleARN\" ARN using the MFA token code provided.\n//\t\tcreds := stscreds.NewAssumeRoleProvider(sts.NewFromConfig(cfg), \"myRoleArn\", func(o *stscreds.AssumeRoleOptions) {\n//\t\t\to.SerialNumber = aws.String(\"myTokenSerialNumber\")\n//\t\t\to.TokenProvider = staticTokenProvider\n//\t\t})\n//\n//\t\tcfg.Credentials = aws.NewCredentialsCache(creds)\n//\n//\t\t// Create service client value configured for credentials\n//\t\t// from assumed role.\n//\t\tsvc := s3.NewFromConfig(cfg)\n//\n// # Assume Role with MFA Token Provider\n//\n// To assume an IAM role with MFA for longer running tasks where the credentials\n// may need to be refreshed setting the TokenProvider field of AssumeRoleProvider\n// will allow the credential provider to prompt for new MFA token code when the\n// role's credentials need to be refreshed.\n//\n// The StdinTokenProvider function is available to prompt on stdin to retrieve\n// the MFA token code from the user. You can also implement custom prompts by\n// satisfying the TokenProvider function signature.\n//\n// Using StdinTokenProvider with multiple AssumeRoleProviders, or Credentials will\n// have undesirable results as the StdinTokenProvider will not be synchronized. A\n// single Credentials with an AssumeRoleProvider can be shared safely.\n//\n//\tcfg, err := config.LoadDefaultConfig(context.TODO())\n//\tif err != nil {\n//\t\tpanic(err)\n//\t}\n//\n//\t// Create the credentials from AssumeRoleProvider to assume the role\n//\t// referenced by the \"myRoleARN\" ARN using the MFA token code provided.\n//\tcreds := stscreds.NewAssumeRoleProvider(sts.NewFromConfig(cfg), \"myRoleArn\", func(o *stscreds.AssumeRoleOptions) {\n//\t\to.SerialNumber = aws.String(\"myTokenSerialNumber\")\n//\t\to.TokenProvider = stscreds.StdinTokenProvider\n//\t})\n//\n//\tcfg.Credentials = aws.NewCredentialsCache(creds)\n//\n//\t// Create service client value configured for credentials\n//\t// from assumed role.\n//\tsvc := s3.NewFromConfig(cfg)\npackage stscreds\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/service/sts\"\n\t\"github.com/aws/aws-sdk-go-v2/service/sts/types\"\n)\n\n// StdinTokenProvider will prompt on stdout and read from stdin for a string value.\n// An error is returned if reading from stdin fails.\n//\n// Use this function go read MFA tokens from stdin. The function makes no attempt\n// to make atomic prompts from stdin across multiple gorouties.\n//\n// Using StdinTokenProvider with multiple AssumeRoleProviders, or Credentials will\n// have undesirable results as the StdinTokenProvider will not be synchronized. A\n// single Credentials with an AssumeRoleProvider can be shared safely\n//\n// Will wait forever until something is provided on the stdin.\nfunc StdinTokenProvider() (string, error) {\n\tvar v string\n\tfmt.Printf(\"Assume Role MFA token code: \")\n\t_, err := fmt.Scanln(&v)\n\n\treturn v, err\n}\n\n// ProviderName provides a name of AssumeRole provider\nconst ProviderName = \"AssumeRoleProvider\"\n\n// AssumeRoleAPIClient is a client capable of the STS AssumeRole operation.\ntype AssumeRoleAPIClient interface {\n\tAssumeRole(ctx context.Context, params *sts.AssumeRoleInput, optFns ...func(*sts.Options)) (*sts.AssumeRoleOutput, error)\n}\n\n// DefaultDuration is the default amount of time in minutes that the\n// credentials will be valid for. This value is only used by AssumeRoleProvider\n// for specifying the default expiry duration of an assume role.\n//\n// Other providers such as WebIdentityRoleProvider do not use this value, and\n// instead rely on STS API's default parameter handing to assign a default\n// value.\nvar DefaultDuration = time.Duration(15) * time.Minute\n\n// AssumeRoleProvider retrieves temporary credentials from the STS service, and\n// keeps track of their expiration time.\n//\n// This credential provider will be used by the SDKs default credential change\n// when shared configuration is enabled, and the shared config or shared credentials\n// file configure assume role. See Session docs for how to do this.\n//\n// AssumeRoleProvider does not provide any synchronization and it is not safe\n// to share this value across multiple Credentials, Sessions, or service clients\n// without also sharing the same Credentials instance.\ntype AssumeRoleProvider struct {\n\toptions AssumeRoleOptions\n}\n\n// AssumeRoleOptions is the configurable options for AssumeRoleProvider\ntype AssumeRoleOptions struct {\n\t// Client implementation of the AssumeRole operation. Required\n\tClient AssumeRoleAPIClient\n\n\t// IAM Role ARN to be assumed. Required\n\tRoleARN string\n\n\t// Session name, if you wish to uniquely identify this session.\n\tRoleSessionName string\n\n\t// Expiry duration of the STS credentials. Defaults to 15 minutes if not set.\n\tDuration time.Duration\n\n\t// Optional ExternalID to pass along, defaults to nil if not set.\n\tExternalID *string\n\n\t// The policy plain text must be 2048 bytes or shorter. However, an internal\n\t// conversion compresses it into a packed binary format with a separate limit.\n\t// The PackedPolicySize response element indicates by percentage how close to\n\t// the upper size limit the policy is, with 100% equaling the maximum allowed\n\t// size.\n\tPolicy *string\n\n\t// The ARNs of IAM managed policies you want to use as managed session policies.\n\t// The policies must exist in the same account as the role.\n\t//\n\t// This parameter is optional. You can provide up to 10 managed policy ARNs.\n\t// However, the plain text that you use for both inline and managed session\n\t// policies can't exceed 2,048 characters.\n\t//\n\t// An AWS conversion compresses the passed session policies and session tags\n\t// into a packed binary format that has a separate limit. Your request can fail\n\t// for this limit even if your plain text meets the other requirements. The\n\t// PackedPolicySize response element indicates by percentage how close the policies\n\t// and tags for your request are to the upper size limit.\n\t//\n\t// Passing policies to this operation returns new temporary credentials. The\n\t// resulting session's permissions are the intersection of the role's identity-based\n\t// policy and the session policies. You can use the role's temporary credentials\n\t// in subsequent AWS API calls to access resources in the account that owns\n\t// the role. You cannot use session policies to grant more permissions than\n\t// those allowed by the identity-based policy of the role that is being assumed.\n\t// For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)\n\t// in the IAM User Guide.\n\tPolicyARNs []types.PolicyDescriptorType\n\n\t// The identification number of the MFA device that is associated with the user\n\t// who is making the AssumeRole call. Specify this value if the trust policy\n\t// of the role being assumed includes a condition that requires MFA authentication.\n\t// The value is either the serial number for a hardware device (such as GAHT12345678)\n\t// or an Amazon Resource Name (ARN) for a virtual device (such as arn:aws:iam::123456789012:mfa/user).\n\tSerialNumber *string\n\n\t// The source identity specified by the principal that is calling the AssumeRole\n\t// operation. You can require users to specify a source identity when they assume a\n\t// role. You do this by using the sts:SourceIdentity condition key in a role trust\n\t// policy. You can use source identity information in CloudTrail logs to determine\n\t// who took actions with a role. You can use the aws:SourceIdentity condition key\n\t// to further control access to Amazon Web Services resources based on the value of\n\t// source identity. For more information about using source identity, see Monitor\n\t// and control actions taken with assumed roles\n\t// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html)\n\t// in the IAM User Guide.\n\tSourceIdentity *string\n\n\t// Async method of providing MFA token code for assuming an IAM role with MFA.\n\t// The value returned by the function will be used as the TokenCode in the Retrieve\n\t// call. See StdinTokenProvider for a provider that prompts and reads from stdin.\n\t//\n\t// This token provider will be called when ever the assumed role's\n\t// credentials need to be refreshed when SerialNumber is set.\n\tTokenProvider func() (string, error)\n\n\t// A list of session tags that you want to pass. Each session tag consists of a key\n\t// name and an associated value. For more information about session tags, see\n\t// Tagging STS Sessions\n\t// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) in the\n\t// IAM User Guide. This parameter is optional. You can pass up to 50 session tags.\n\tTags []types.Tag\n\n\t// A list of keys for session tags that you want to set as transitive. If you set a\n\t// tag key as transitive, the corresponding key and value passes to subsequent\n\t// sessions in a role chain. For more information, see Chaining Roles with Session\n\t// Tags\n\t// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining)\n\t// in the IAM User Guide. This parameter is optional.\n\tTransitiveTagKeys []string\n\n\t// The chain of providers that was used to create this provider\n\t// These values are for reporting purposes and are not meant to be set up directly\n\tCredentialSources []aws.CredentialSource\n}\n\n// NewAssumeRoleProvider constructs and returns a credentials provider that\n// will retrieve credentials by assuming a IAM role using STS.\nfunc NewAssumeRoleProvider(client AssumeRoleAPIClient, roleARN string, optFns ...func(*AssumeRoleOptions)) *AssumeRoleProvider {\n\to := AssumeRoleOptions{\n\t\tClient:  client,\n\t\tRoleARN: roleARN,\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&o)\n\t}\n\n\treturn &AssumeRoleProvider{\n\t\toptions: o,\n\t}\n}\n\n// Retrieve generates a new set of temporary credentials using STS.\nfunc (p *AssumeRoleProvider) Retrieve(ctx context.Context) (aws.Credentials, error) {\n\t// Apply defaults where parameters are not set.\n\tif len(p.options.RoleSessionName) == 0 {\n\t\t// Try to work out a role name that will hopefully end up unique.\n\t\tp.options.RoleSessionName = fmt.Sprintf(\"aws-go-sdk-%d\", time.Now().UTC().UnixNano())\n\t}\n\tif p.options.Duration == 0 {\n\t\t// Expire as often as AWS permits.\n\t\tp.options.Duration = DefaultDuration\n\t}\n\tinput := &sts.AssumeRoleInput{\n\t\tDurationSeconds:   aws.Int32(int32(p.options.Duration / time.Second)),\n\t\tPolicyArns:        p.options.PolicyARNs,\n\t\tRoleArn:           aws.String(p.options.RoleARN),\n\t\tRoleSessionName:   aws.String(p.options.RoleSessionName),\n\t\tExternalId:        p.options.ExternalID,\n\t\tSourceIdentity:    p.options.SourceIdentity,\n\t\tTags:              p.options.Tags,\n\t\tTransitiveTagKeys: p.options.TransitiveTagKeys,\n\t}\n\tif p.options.Policy != nil {\n\t\tinput.Policy = p.options.Policy\n\t}\n\tif p.options.SerialNumber != nil {\n\t\tif p.options.TokenProvider != nil {\n\t\t\tinput.SerialNumber = p.options.SerialNumber\n\t\t\tcode, err := p.options.TokenProvider()\n\t\t\tif err != nil {\n\t\t\t\treturn aws.Credentials{}, err\n\t\t\t}\n\t\t\tinput.TokenCode = aws.String(code)\n\t\t} else {\n\t\t\treturn aws.Credentials{}, fmt.Errorf(\"assume role with MFA enabled, but TokenProvider is not set\")\n\t\t}\n\t}\n\n\tresp, err := p.options.Client.AssumeRole(ctx, input)\n\tif err != nil {\n\t\treturn aws.Credentials{Source: ProviderName}, err\n\t}\n\n\tvar accountID string\n\tif resp.AssumedRoleUser != nil {\n\t\taccountID = getAccountID(resp.AssumedRoleUser)\n\t}\n\n\treturn aws.Credentials{\n\t\tAccessKeyID:     *resp.Credentials.AccessKeyId,\n\t\tSecretAccessKey: *resp.Credentials.SecretAccessKey,\n\t\tSessionToken:    *resp.Credentials.SessionToken,\n\t\tSource:          ProviderName,\n\n\t\tCanExpire: true,\n\t\tExpires:   *resp.Credentials.Expiration,\n\t\tAccountID: accountID,\n\t}, nil\n}\n\n// ProviderSources returns the credential chain that was used to construct this provider\nfunc (p *AssumeRoleProvider) ProviderSources() []aws.CredentialSource {\n\tif p.options.CredentialSources == nil {\n\t\treturn []aws.CredentialSource{aws.CredentialSourceSTSAssumeRole}\n\t} // If no source has been set, assume this is used directly which means just call to assume role\n\treturn append(p.options.CredentialSources, aws.CredentialSourceSTSAssumeRole)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/credentials/stscreds/web_identity_provider.go",
    "content": "package stscreds\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/retry\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/sdk\"\n\t\"github.com/aws/aws-sdk-go-v2/service/sts\"\n\t\"github.com/aws/aws-sdk-go-v2/service/sts/types\"\n)\n\nvar invalidIdentityTokenExceptionCode = (&types.InvalidIdentityTokenException{}).ErrorCode()\n\nconst (\n\t// WebIdentityProviderName is the web identity provider name\n\tWebIdentityProviderName = \"WebIdentityCredentials\"\n)\n\n// AssumeRoleWithWebIdentityAPIClient is a client capable of the STS AssumeRoleWithWebIdentity operation.\ntype AssumeRoleWithWebIdentityAPIClient interface {\n\tAssumeRoleWithWebIdentity(ctx context.Context, params *sts.AssumeRoleWithWebIdentityInput, optFns ...func(*sts.Options)) (*sts.AssumeRoleWithWebIdentityOutput, error)\n}\n\n// WebIdentityRoleProvider is used to retrieve credentials using\n// an OIDC token.\ntype WebIdentityRoleProvider struct {\n\toptions WebIdentityRoleOptions\n}\n\n// WebIdentityRoleOptions is a structure of configurable options for WebIdentityRoleProvider\ntype WebIdentityRoleOptions struct {\n\t// Client implementation of the AssumeRoleWithWebIdentity operation. Required\n\tClient AssumeRoleWithWebIdentityAPIClient\n\n\t// JWT Token Provider. Required\n\tTokenRetriever IdentityTokenRetriever\n\n\t// IAM Role ARN to assume. Required\n\tRoleARN string\n\n\t// Session name, if you wish to uniquely identify this session.\n\tRoleSessionName string\n\n\t// Expiry duration of the STS credentials. STS will assign a default expiry\n\t// duration if this value is unset. This is different from the Duration\n\t// option of AssumeRoleProvider, which automatically assigns 15 minutes if\n\t// Duration is unset.\n\t//\n\t// See the STS AssumeRoleWithWebIdentity API reference guide for more\n\t// information on defaults.\n\t// https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html\n\tDuration time.Duration\n\n\t// An IAM policy in JSON format that you want to use as an inline session policy.\n\tPolicy *string\n\n\t// The Amazon Resource Names (ARNs) of the IAM managed policies that you\n\t// want to use as managed session policies.  The policies must exist in the\n\t// same account as the role.\n\tPolicyARNs []types.PolicyDescriptorType\n\n\t// The chain of providers that was used to create this provider\n\t// These values are for reporting purposes and are not meant to be set up directly\n\tCredentialSources []aws.CredentialSource\n}\n\n// IdentityTokenRetriever is an interface for retrieving a JWT\ntype IdentityTokenRetriever interface {\n\tGetIdentityToken() ([]byte, error)\n}\n\n// IdentityTokenFile is for retrieving an identity token from the given file name\ntype IdentityTokenFile string\n\n// GetIdentityToken retrieves the JWT token from the file and returns the contents as a []byte\nfunc (j IdentityTokenFile) GetIdentityToken() ([]byte, error) {\n\tb, err := ioutil.ReadFile(string(j))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"unable to read file at %s: %v\", string(j), err)\n\t}\n\n\treturn b, nil\n}\n\n// NewWebIdentityRoleProvider will return a new WebIdentityRoleProvider with the\n// provided stsiface.ClientAPI\nfunc NewWebIdentityRoleProvider(client AssumeRoleWithWebIdentityAPIClient, roleARN string, tokenRetriever IdentityTokenRetriever, optFns ...func(*WebIdentityRoleOptions)) *WebIdentityRoleProvider {\n\to := WebIdentityRoleOptions{\n\t\tClient:         client,\n\t\tRoleARN:        roleARN,\n\t\tTokenRetriever: tokenRetriever,\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&o)\n\t}\n\n\treturn &WebIdentityRoleProvider{options: o}\n}\n\n// Retrieve will attempt to assume a role from a token which is located at\n// 'WebIdentityTokenFilePath' specified destination and if that is empty an\n// error will be returned.\nfunc (p *WebIdentityRoleProvider) Retrieve(ctx context.Context) (aws.Credentials, error) {\n\tb, err := p.options.TokenRetriever.GetIdentityToken()\n\tif err != nil {\n\t\treturn aws.Credentials{}, fmt.Errorf(\"failed to retrieve jwt from provide source, %w\", err)\n\t}\n\n\tsessionName := p.options.RoleSessionName\n\tif len(sessionName) == 0 {\n\t\t// session name is used to uniquely identify a session. This simply\n\t\t// uses unix time in nanoseconds to uniquely identify sessions.\n\t\tsessionName = strconv.FormatInt(sdk.NowTime().UnixNano(), 10)\n\t}\n\tinput := &sts.AssumeRoleWithWebIdentityInput{\n\t\tPolicyArns:       p.options.PolicyARNs,\n\t\tRoleArn:          &p.options.RoleARN,\n\t\tRoleSessionName:  &sessionName,\n\t\tWebIdentityToken: aws.String(string(b)),\n\t}\n\tif p.options.Duration != 0 {\n\t\t// If set use the value, otherwise STS will assign a default expiration duration.\n\t\tinput.DurationSeconds = aws.Int32(int32(p.options.Duration / time.Second))\n\t}\n\tif p.options.Policy != nil {\n\t\tinput.Policy = p.options.Policy\n\t}\n\n\tresp, err := p.options.Client.AssumeRoleWithWebIdentity(ctx, input, func(options *sts.Options) {\n\t\toptions.Retryer = retry.AddWithErrorCodes(options.Retryer, invalidIdentityTokenExceptionCode)\n\t})\n\tif err != nil {\n\t\treturn aws.Credentials{}, fmt.Errorf(\"failed to retrieve credentials, %w\", err)\n\t}\n\n\tvar accountID string\n\tif resp.AssumedRoleUser != nil {\n\t\taccountID = getAccountID(resp.AssumedRoleUser)\n\t}\n\n\t// InvalidIdentityToken error is a temporary error that can occur\n\t// when assuming an Role with a JWT web identity token.\n\n\tvalue := aws.Credentials{\n\t\tAccessKeyID:     aws.ToString(resp.Credentials.AccessKeyId),\n\t\tSecretAccessKey: aws.ToString(resp.Credentials.SecretAccessKey),\n\t\tSessionToken:    aws.ToString(resp.Credentials.SessionToken),\n\t\tSource:          WebIdentityProviderName,\n\t\tCanExpire:       true,\n\t\tExpires:         *resp.Credentials.Expiration,\n\t\tAccountID:       accountID,\n\t}\n\treturn value, nil\n}\n\n// extract accountID from arn with format \"arn:partition:service:region:account-id:[resource-section]\"\nfunc getAccountID(u *types.AssumedRoleUser) string {\n\tif u.Arn == nil {\n\t\treturn \"\"\n\t}\n\tparts := strings.Split(*u.Arn, \":\")\n\tif len(parts) < 5 {\n\t\treturn \"\"\n\t}\n\treturn parts[4]\n}\n\n// ProviderSources returns the credential chain that was used to construct this provider\nfunc (p *WebIdentityRoleProvider) ProviderSources() []aws.CredentialSource {\n\tif p.options.CredentialSources == nil {\n\t\treturn []aws.CredentialSource{aws.CredentialSourceSTSAssumeRoleWebID}\n\t}\n\treturn p.options.CredentialSources\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md",
    "content": "# v1.16.30 (2025-02-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.29 (2025-02-18)\n\n* **Bug Fix**: Bump go version to 1.22\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.28 (2025-02-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.27 (2025-01-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.26 (2025-01-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.25 (2025-01-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n* **Dependency Update**: Upgrade to smithy-go v1.22.2.\n\n# v1.16.24 (2025-01-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.23 (2025-01-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.22 (2024-12-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.21 (2024-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.20 (2024-11-18)\n\n* **Dependency Update**: Update to smithy-go v1.22.1.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.19 (2024-11-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.18 (2024-10-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.17 (2024-10-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.16 (2024-10-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.15 (2024-10-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.14 (2024-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.13 (2024-09-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.12 (2024-08-15)\n\n* **Dependency Update**: Bump minimum Go version to 1.21.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.11 (2024-07-10.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.10 (2024-07-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.9 (2024-06-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.8 (2024-06-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.7 (2024-06-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.6 (2024-06-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.5 (2024-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.4 (2024-06-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.3 (2024-05-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.2 (2024-05-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.1 (2024-03-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.0 (2024-03-21)\n\n* **Feature**: Add config switch `DisableDefaultTimeout` that allows you to disable the default operation timeout (5 seconds) for IMDS calls.\n\n# v1.15.4 (2024-03-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.3 (2024-03-07)\n\n* **Bug Fix**: Remove dependency on go-cmp.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.2 (2024-02-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.1 (2024-02-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.0 (2024-02-13)\n\n* **Feature**: Bump minimum Go version to 1.20 per our language support policy.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.11 (2024-01-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.10 (2023-12-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.9 (2023-12-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.8 (2023-11-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.7 (2023-11-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.6 (2023-11-28.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.5 (2023-11-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.4 (2023-11-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.3 (2023-11-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.2 (2023-11-02)\n\n* No change notes available for this release.\n\n# v1.14.1 (2023-11-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.0 (2023-10-31)\n\n* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.13 (2023-10-12)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.12 (2023-10-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.11 (2023-08-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.10 (2023-08-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.9 (2023-08-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.8 (2023-08-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.7 (2023-07-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.6 (2023-07-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.5 (2023-07-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.4 (2023-06-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.3 (2023-04-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.2 (2023-04-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.1 (2023-03-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.0 (2023-03-14)\n\n* **Feature**: Add flag to disable IMDSv1 fallback\n\n# v1.12.24 (2023-03-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.23 (2023-02-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.22 (2023-02-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.21 (2022-12-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.20 (2022-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.19 (2022-10-24)\n\n* **Bug Fix**: Fixes an issue that prevented logging of the API request or responses when the respective log modes were enabled.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.18 (2022-10-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.17 (2022-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.16 (2022-09-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.15 (2022-09-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.14 (2022-08-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.13 (2022-08-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.12 (2022-08-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.11 (2022-08-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.10 (2022-08-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.9 (2022-08-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.8 (2022-07-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.7 (2022-06-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.6 (2022-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.5 (2022-05-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.4 (2022-04-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.3 (2022-03-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.2 (2022-03-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.1 (2022-03-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.0 (2022-03-08)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.0 (2022-02-24)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.0 (2022-01-14)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.0 (2022-01-07)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.8.2 (2021-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.8.1 (2021-11-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.8.0 (2021-11-06)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.7.0 (2021-10-21)\n\n* **Feature**: Updated  to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.6.0 (2021-10-11)\n\n* **Feature**: Respect passed in Context Deadline/Timeout. Updates the IMDS Client operations to not override the passed in Context's Deadline or Timeout options. If an Client operation is called with a Context with a Deadline or Timeout, the client will no longer override it with the client's default timeout.\n* **Bug Fix**: Fix IMDS client's response handling and operation timeout race. Fixes #1253\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.1 (2021-09-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.0 (2021-08-27)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.1 (2021-08-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.0 (2021-08-04)\n\n* **Feature**: adds error handling for defered close calls\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.0 (2021-07-15)\n\n* **Feature**: Support has been added for EC2 IPv6-enabled Instance Metadata Service Endpoints.\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.0 (2021-06-25)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.1 (2021-05-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.0 (2021-05-14)\n\n* **Feature**: Constant has been added to modules to enable runtime version inspection for reporting.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_client.go",
    "content": "package imds\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\"\n\t\"os\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/retry\"\n\tawshttp \"github.com/aws/aws-sdk-go-v2/aws/transport/http\"\n\tinternalconfig \"github.com/aws/aws-sdk-go-v2/feature/ec2/imds/internal/config\"\n\t\"github.com/aws/smithy-go\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// ServiceID provides the unique name of this API client\nconst ServiceID = \"ec2imds\"\n\n// Client provides the API client for interacting with the Amazon EC2 Instance\n// Metadata Service API.\ntype Client struct {\n\toptions Options\n}\n\n// ClientEnableState provides an enumeration if the client is enabled,\n// disabled, or default behavior.\ntype ClientEnableState = internalconfig.ClientEnableState\n\n// Enumeration values for ClientEnableState\nconst (\n\tClientDefaultEnableState ClientEnableState = internalconfig.ClientDefaultEnableState // default behavior\n\tClientDisabled           ClientEnableState = internalconfig.ClientDisabled           // client disabled\n\tClientEnabled            ClientEnableState = internalconfig.ClientEnabled            // client enabled\n)\n\n// EndpointModeState is an enum configuration variable describing the client endpoint mode.\n// Not configurable directly, but used when using the NewFromConfig.\ntype EndpointModeState = internalconfig.EndpointModeState\n\n// Enumeration values for EndpointModeState\nconst (\n\tEndpointModeStateUnset EndpointModeState = internalconfig.EndpointModeStateUnset\n\tEndpointModeStateIPv4  EndpointModeState = internalconfig.EndpointModeStateIPv4\n\tEndpointModeStateIPv6  EndpointModeState = internalconfig.EndpointModeStateIPv6\n)\n\nconst (\n\tdisableClientEnvVar = \"AWS_EC2_METADATA_DISABLED\"\n\n\t// Client endpoint options\n\tendpointEnvVar = \"AWS_EC2_METADATA_SERVICE_ENDPOINT\"\n\n\tdefaultIPv4Endpoint = \"http://169.254.169.254\"\n\tdefaultIPv6Endpoint = \"http://[fd00:ec2::254]\"\n)\n\n// New returns an initialized Client based on the functional options. Provide\n// additional functional options to further configure the behavior of the client,\n// such as changing the client's endpoint or adding custom middleware behavior.\nfunc New(options Options, optFns ...func(*Options)) *Client {\n\toptions = options.Copy()\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\toptions.HTTPClient = resolveHTTPClient(options.HTTPClient)\n\n\tif options.Retryer == nil {\n\t\toptions.Retryer = retry.NewStandard()\n\t}\n\toptions.Retryer = retry.AddWithMaxBackoffDelay(options.Retryer, 1*time.Second)\n\n\tif options.ClientEnableState == ClientDefaultEnableState {\n\t\tif v := os.Getenv(disableClientEnvVar); strings.EqualFold(v, \"true\") {\n\t\t\toptions.ClientEnableState = ClientDisabled\n\t\t}\n\t}\n\n\tif len(options.Endpoint) == 0 {\n\t\tif v := os.Getenv(endpointEnvVar); len(v) != 0 {\n\t\t\toptions.Endpoint = v\n\t\t}\n\t}\n\n\tclient := &Client{\n\t\toptions: options,\n\t}\n\n\tif client.options.tokenProvider == nil && !client.options.disableAPIToken {\n\t\tclient.options.tokenProvider = newTokenProvider(client, defaultTokenTTL)\n\t}\n\n\treturn client\n}\n\n// NewFromConfig returns an initialized Client based the AWS SDK config, and\n// functional options. Provide additional functional options to further\n// configure the behavior of the client, such as changing the client's endpoint\n// or adding custom middleware behavior.\nfunc NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client {\n\topts := Options{\n\t\tAPIOptions:    append([]func(*middleware.Stack) error{}, cfg.APIOptions...),\n\t\tHTTPClient:    cfg.HTTPClient,\n\t\tClientLogMode: cfg.ClientLogMode,\n\t\tLogger:        cfg.Logger,\n\t}\n\n\tif cfg.Retryer != nil {\n\t\topts.Retryer = cfg.Retryer()\n\t}\n\n\tresolveClientEnableState(cfg, &opts)\n\tresolveEndpointConfig(cfg, &opts)\n\tresolveEndpointModeConfig(cfg, &opts)\n\tresolveEnableFallback(cfg, &opts)\n\n\treturn New(opts, optFns...)\n}\n\n// Options provides the fields for configuring the API client's behavior.\ntype Options struct {\n\t// Set of options to modify how an operation is invoked. These apply to all\n\t// operations invoked for this client. Use functional options on operation\n\t// call to modify this list for per operation behavior.\n\tAPIOptions []func(*middleware.Stack) error\n\n\t// The endpoint the client will use to retrieve EC2 instance metadata.\n\t//\n\t// Specifies the EC2 Instance Metadata Service endpoint to use. If specified it overrides EndpointMode.\n\t//\n\t// If unset, and the environment variable AWS_EC2_METADATA_SERVICE_ENDPOINT\n\t// has a value the client will use the value of the environment variable as\n\t// the endpoint for operation calls.\n\t//\n\t//    AWS_EC2_METADATA_SERVICE_ENDPOINT=http://[::1]\n\tEndpoint string\n\n\t// The endpoint selection mode the client will use if no explicit endpoint is provided using the Endpoint field.\n\t//\n\t// Setting EndpointMode to EndpointModeStateIPv4 will configure the client to use the default EC2 IPv4 endpoint.\n\t// Setting EndpointMode to EndpointModeStateIPv6 will configure the client to use the default EC2 IPv6 endpoint.\n\t//\n\t// By default if EndpointMode is not set (EndpointModeStateUnset) than the default endpoint selection mode EndpointModeStateIPv4.\n\tEndpointMode EndpointModeState\n\n\t// The HTTP client to invoke API calls with. Defaults to client's default\n\t// HTTP implementation if nil.\n\tHTTPClient HTTPClient\n\n\t// Retryer guides how HTTP requests should be retried in case of recoverable\n\t// failures. When nil the API client will use a default retryer.\n\tRetryer aws.Retryer\n\n\t// Changes if the EC2 Instance Metadata client is enabled or not. Client\n\t// will default to enabled if not set to ClientDisabled. When the client is\n\t// disabled it will return an error for all operation calls.\n\t//\n\t// If ClientEnableState value is ClientDefaultEnableState (default value),\n\t// and the environment variable \"AWS_EC2_METADATA_DISABLED\" is set to\n\t// \"true\", the client will be disabled.\n\t//\n\t//    AWS_EC2_METADATA_DISABLED=true\n\tClientEnableState ClientEnableState\n\n\t// Configures the events that will be sent to the configured logger.\n\tClientLogMode aws.ClientLogMode\n\n\t// The logger writer interface to write logging messages to.\n\tLogger logging.Logger\n\n\t// Configure IMDSv1 fallback behavior. By default, the client will attempt\n\t// to fall back to IMDSv1 as needed for backwards compatibility. When set to [aws.FalseTernary]\n\t// the client will return any errors encountered from attempting to fetch a token\n\t// instead of silently using the insecure data flow of IMDSv1.\n\t//\n\t// See [configuring IMDS] for more information.\n\t//\n\t// [configuring IMDS]: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html\n\tEnableFallback aws.Ternary\n\n\t// By default, all IMDS client operations enforce a 5-second timeout. You\n\t// can disable that behavior with this setting.\n\tDisableDefaultTimeout bool\n\n\t// provides the caching of API tokens used for operation calls. If unset,\n\t// the API token will not be retrieved for the operation.\n\ttokenProvider *tokenProvider\n\n\t// option to disable the API token provider for testing.\n\tdisableAPIToken bool\n}\n\n// HTTPClient provides the interface for a client making HTTP requests with the\n// API.\ntype HTTPClient interface {\n\tDo(*http.Request) (*http.Response, error)\n}\n\n// Copy creates a copy of the API options.\nfunc (o Options) Copy() Options {\n\tto := o\n\tto.APIOptions = append([]func(*middleware.Stack) error{}, o.APIOptions...)\n\treturn to\n}\n\n// WithAPIOptions wraps the API middleware functions, as a functional option\n// for the API Client Options. Use this helper to add additional functional\n// options to the API client, or operation calls.\nfunc WithAPIOptions(optFns ...func(*middleware.Stack) error) func(*Options) {\n\treturn func(o *Options) {\n\t\to.APIOptions = append(o.APIOptions, optFns...)\n\t}\n}\n\nfunc (c *Client) invokeOperation(\n\tctx context.Context, opID string, params interface{}, optFns []func(*Options),\n\tstackFns ...func(*middleware.Stack, Options) error,\n) (\n\tresult interface{}, metadata middleware.Metadata, err error,\n) {\n\tstack := middleware.NewStack(opID, smithyhttp.NewStackRequest)\n\toptions := c.options.Copy()\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tif options.ClientEnableState == ClientDisabled {\n\t\treturn nil, metadata, &smithy.OperationError{\n\t\t\tServiceID:     ServiceID,\n\t\t\tOperationName: opID,\n\t\t\tErr: fmt.Errorf(\n\t\t\t\t\"access disabled to EC2 IMDS via client option, or %q environment variable\",\n\t\t\t\tdisableClientEnvVar),\n\t\t}\n\t}\n\n\tfor _, fn := range stackFns {\n\t\tif err := fn(stack, options); err != nil {\n\t\t\treturn nil, metadata, err\n\t\t}\n\t}\n\n\tfor _, fn := range options.APIOptions {\n\t\tif err := fn(stack); err != nil {\n\t\t\treturn nil, metadata, err\n\t\t}\n\t}\n\n\thandler := middleware.DecorateHandler(smithyhttp.NewClientHandler(options.HTTPClient), stack)\n\tresult, metadata, err = handler.Handle(ctx, params)\n\tif err != nil {\n\t\treturn nil, metadata, &smithy.OperationError{\n\t\t\tServiceID:     ServiceID,\n\t\t\tOperationName: opID,\n\t\t\tErr:           err,\n\t\t}\n\t}\n\n\treturn result, metadata, err\n}\n\nconst (\n\t// HTTP client constants\n\tdefaultDialerTimeout         = 250 * time.Millisecond\n\tdefaultResponseHeaderTimeout = 500 * time.Millisecond\n)\n\nfunc resolveHTTPClient(client HTTPClient) HTTPClient {\n\tif client == nil {\n\t\tclient = awshttp.NewBuildableClient()\n\t}\n\n\tif c, ok := client.(*awshttp.BuildableClient); ok {\n\t\tclient = c.\n\t\t\tWithDialerOptions(func(d *net.Dialer) {\n\t\t\t\t// Use a custom Dial timeout for the EC2 Metadata service to account\n\t\t\t\t// for the possibility the application might not be running in an\n\t\t\t\t// environment with the service present. The client should fail fast in\n\t\t\t\t// this case.\n\t\t\t\td.Timeout = defaultDialerTimeout\n\t\t\t}).\n\t\t\tWithTransportOptions(func(tr *http.Transport) {\n\t\t\t\t// Use a custom Transport timeout for the EC2 Metadata service to\n\t\t\t\t// account for the possibility that the application might be running in\n\t\t\t\t// a container, and EC2Metadata service drops the connection after a\n\t\t\t\t// single IP Hop. The client should fail fast in this case.\n\t\t\t\ttr.ResponseHeaderTimeout = defaultResponseHeaderTimeout\n\t\t\t})\n\t}\n\n\treturn client\n}\n\nfunc resolveClientEnableState(cfg aws.Config, options *Options) error {\n\tif options.ClientEnableState != ClientDefaultEnableState {\n\t\treturn nil\n\t}\n\tvalue, found, err := internalconfig.ResolveClientEnableState(cfg.ConfigSources)\n\tif err != nil || !found {\n\t\treturn err\n\t}\n\toptions.ClientEnableState = value\n\treturn nil\n}\n\nfunc resolveEndpointModeConfig(cfg aws.Config, options *Options) error {\n\tif options.EndpointMode != EndpointModeStateUnset {\n\t\treturn nil\n\t}\n\tvalue, found, err := internalconfig.ResolveEndpointModeConfig(cfg.ConfigSources)\n\tif err != nil || !found {\n\t\treturn err\n\t}\n\toptions.EndpointMode = value\n\treturn nil\n}\n\nfunc resolveEndpointConfig(cfg aws.Config, options *Options) error {\n\tif len(options.Endpoint) != 0 {\n\t\treturn nil\n\t}\n\tvalue, found, err := internalconfig.ResolveEndpointConfig(cfg.ConfigSources)\n\tif err != nil || !found {\n\t\treturn err\n\t}\n\toptions.Endpoint = value\n\treturn nil\n}\n\nfunc resolveEnableFallback(cfg aws.Config, options *Options) {\n\tif options.EnableFallback != aws.UnknownTernary {\n\t\treturn\n\t}\n\n\tdisabled, ok := internalconfig.ResolveV1FallbackDisabled(cfg.ConfigSources)\n\tif !ok {\n\t\treturn\n\t}\n\n\tif disabled {\n\t\toptions.EnableFallback = aws.FalseTernary\n\t} else {\n\t\toptions.EnableFallback = aws.TrueTernary\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetDynamicData.go",
    "content": "package imds\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nconst getDynamicDataPath = \"/latest/dynamic\"\n\n// GetDynamicData uses the path provided to request information from the EC2\n// instance metadata service for dynamic data. The content will be returned\n// as a string, or error if the request failed.\nfunc (c *Client) GetDynamicData(ctx context.Context, params *GetDynamicDataInput, optFns ...func(*Options)) (*GetDynamicDataOutput, error) {\n\tif params == nil {\n\t\tparams = &GetDynamicDataInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetDynamicData\", params, optFns,\n\t\taddGetDynamicDataMiddleware,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetDynamicDataOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\n// GetDynamicDataInput provides the input parameters for the GetDynamicData\n// operation.\ntype GetDynamicDataInput struct {\n\t// The relative dynamic data path to retrieve. Can be empty string to\n\t// retrieve a response containing a new line separated list of dynamic data\n\t// resources available.\n\t//\n\t// Must not include the dynamic data base path.\n\t//\n\t// May include leading slash. If Path includes trailing slash the trailing\n\t// slash will be included in the request for the resource.\n\tPath string\n}\n\n// GetDynamicDataOutput provides the output parameters for the GetDynamicData\n// operation.\ntype GetDynamicDataOutput struct {\n\tContent io.ReadCloser\n\n\tResultMetadata middleware.Metadata\n}\n\nfunc addGetDynamicDataMiddleware(stack *middleware.Stack, options Options) error {\n\treturn addAPIRequestMiddleware(stack,\n\t\toptions,\n\t\t\"GetDynamicData\",\n\t\tbuildGetDynamicDataPath,\n\t\tbuildGetDynamicDataOutput)\n}\n\nfunc buildGetDynamicDataPath(params interface{}) (string, error) {\n\tp, ok := params.(*GetDynamicDataInput)\n\tif !ok {\n\t\treturn \"\", fmt.Errorf(\"unknown parameter type %T\", params)\n\t}\n\n\treturn appendURIPath(getDynamicDataPath, p.Path), nil\n}\n\nfunc buildGetDynamicDataOutput(resp *smithyhttp.Response) (interface{}, error) {\n\treturn &GetDynamicDataOutput{\n\t\tContent: resp.Body,\n\t}, nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetIAMInfo.go",
    "content": "package imds\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/aws/smithy-go\"\n\tsmithyio \"github.com/aws/smithy-go/io\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nconst getIAMInfoPath = getMetadataPath + \"/iam/info\"\n\n// GetIAMInfo retrieves an identity document describing an\n// instance. Error is returned if the request fails or is unable to parse\n// the response.\nfunc (c *Client) GetIAMInfo(\n\tctx context.Context, params *GetIAMInfoInput, optFns ...func(*Options),\n) (\n\t*GetIAMInfoOutput, error,\n) {\n\tif params == nil {\n\t\tparams = &GetIAMInfoInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetIAMInfo\", params, optFns,\n\t\taddGetIAMInfoMiddleware,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetIAMInfoOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\n// GetIAMInfoInput provides the input parameters for GetIAMInfo operation.\ntype GetIAMInfoInput struct{}\n\n// GetIAMInfoOutput provides the output parameters for GetIAMInfo operation.\ntype GetIAMInfoOutput struct {\n\tIAMInfo\n\n\tResultMetadata middleware.Metadata\n}\n\nfunc addGetIAMInfoMiddleware(stack *middleware.Stack, options Options) error {\n\treturn addAPIRequestMiddleware(stack,\n\t\toptions,\n\t\t\"GetIAMInfo\",\n\t\tbuildGetIAMInfoPath,\n\t\tbuildGetIAMInfoOutput,\n\t)\n}\n\nfunc buildGetIAMInfoPath(params interface{}) (string, error) {\n\treturn getIAMInfoPath, nil\n}\n\nfunc buildGetIAMInfoOutput(resp *smithyhttp.Response) (v interface{}, err error) {\n\tdefer func() {\n\t\tcloseErr := resp.Body.Close()\n\t\tif err == nil {\n\t\t\terr = closeErr\n\t\t} else if closeErr != nil {\n\t\t\terr = fmt.Errorf(\"response body close error: %v, original error: %w\", closeErr, err)\n\t\t}\n\t}()\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(resp.Body, ringBuffer)\n\n\timdsResult := &GetIAMInfoOutput{}\n\tif err = json.NewDecoder(body).Decode(&imdsResult.IAMInfo); err != nil {\n\t\treturn nil, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode instance identity document, %w\", err),\n\t\t\tSnapshot: ringBuffer.Bytes(),\n\t\t}\n\t}\n\t// Any code other success is an error\n\tif !strings.EqualFold(imdsResult.Code, \"success\") {\n\t\treturn nil, fmt.Errorf(\"failed to get EC2 IMDS IAM info, %s\",\n\t\t\timdsResult.Code)\n\t}\n\n\treturn imdsResult, nil\n}\n\n// IAMInfo provides the shape for unmarshaling an IAM info from the metadata\n// API.\ntype IAMInfo struct {\n\tCode               string\n\tLastUpdated        time.Time\n\tInstanceProfileArn string\n\tInstanceProfileID  string\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetInstanceIdentityDocument.go",
    "content": "package imds\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"time\"\n\n\t\"github.com/aws/smithy-go\"\n\tsmithyio \"github.com/aws/smithy-go/io\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nconst getInstanceIdentityDocumentPath = getDynamicDataPath + \"/instance-identity/document\"\n\n// GetInstanceIdentityDocument retrieves an identity document describing an\n// instance. Error is returned if the request fails or is unable to parse\n// the response.\nfunc (c *Client) GetInstanceIdentityDocument(\n\tctx context.Context, params *GetInstanceIdentityDocumentInput, optFns ...func(*Options),\n) (\n\t*GetInstanceIdentityDocumentOutput, error,\n) {\n\tif params == nil {\n\t\tparams = &GetInstanceIdentityDocumentInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetInstanceIdentityDocument\", params, optFns,\n\t\taddGetInstanceIdentityDocumentMiddleware,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetInstanceIdentityDocumentOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\n// GetInstanceIdentityDocumentInput provides the input parameters for\n// GetInstanceIdentityDocument operation.\ntype GetInstanceIdentityDocumentInput struct{}\n\n// GetInstanceIdentityDocumentOutput provides the output parameters for\n// GetInstanceIdentityDocument operation.\ntype GetInstanceIdentityDocumentOutput struct {\n\tInstanceIdentityDocument\n\n\tResultMetadata middleware.Metadata\n}\n\nfunc addGetInstanceIdentityDocumentMiddleware(stack *middleware.Stack, options Options) error {\n\treturn addAPIRequestMiddleware(stack,\n\t\toptions,\n\t\t\"GetInstanceIdentityDocument\",\n\t\tbuildGetInstanceIdentityDocumentPath,\n\t\tbuildGetInstanceIdentityDocumentOutput,\n\t)\n}\n\nfunc buildGetInstanceIdentityDocumentPath(params interface{}) (string, error) {\n\treturn getInstanceIdentityDocumentPath, nil\n}\n\nfunc buildGetInstanceIdentityDocumentOutput(resp *smithyhttp.Response) (v interface{}, err error) {\n\tdefer func() {\n\t\tcloseErr := resp.Body.Close()\n\t\tif err == nil {\n\t\t\terr = closeErr\n\t\t} else if closeErr != nil {\n\t\t\terr = fmt.Errorf(\"response body close error: %v, original error: %w\", closeErr, err)\n\t\t}\n\t}()\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(resp.Body, ringBuffer)\n\n\toutput := &GetInstanceIdentityDocumentOutput{}\n\tif err = json.NewDecoder(body).Decode(&output.InstanceIdentityDocument); err != nil {\n\t\treturn nil, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode instance identity document, %w\", err),\n\t\t\tSnapshot: ringBuffer.Bytes(),\n\t\t}\n\t}\n\n\treturn output, nil\n}\n\n// InstanceIdentityDocument provides the shape for unmarshaling\n// an instance identity document\ntype InstanceIdentityDocument struct {\n\tDevpayProductCodes      []string  `json:\"devpayProductCodes\"`\n\tMarketplaceProductCodes []string  `json:\"marketplaceProductCodes\"`\n\tAvailabilityZone        string    `json:\"availabilityZone\"`\n\tPrivateIP               string    `json:\"privateIp\"`\n\tVersion                 string    `json:\"version\"`\n\tRegion                  string    `json:\"region\"`\n\tInstanceID              string    `json:\"instanceId\"`\n\tBillingProducts         []string  `json:\"billingProducts\"`\n\tInstanceType            string    `json:\"instanceType\"`\n\tAccountID               string    `json:\"accountId\"`\n\tPendingTime             time.Time `json:\"pendingTime\"`\n\tImageID                 string    `json:\"imageId\"`\n\tKernelID                string    `json:\"kernelId\"`\n\tRamdiskID               string    `json:\"ramdiskId\"`\n\tArchitecture            string    `json:\"architecture\"`\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetMetadata.go",
    "content": "package imds\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nconst getMetadataPath = \"/latest/meta-data\"\n\n// GetMetadata uses the path provided to request information from the Amazon\n// EC2 Instance Metadata Service. The content will be returned as a string, or\n// error if the request failed.\nfunc (c *Client) GetMetadata(ctx context.Context, params *GetMetadataInput, optFns ...func(*Options)) (*GetMetadataOutput, error) {\n\tif params == nil {\n\t\tparams = &GetMetadataInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetMetadata\", params, optFns,\n\t\taddGetMetadataMiddleware,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetMetadataOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\n// GetMetadataInput provides the input parameters for the GetMetadata\n// operation.\ntype GetMetadataInput struct {\n\t// The relative metadata path to retrieve. Can be empty string to retrieve\n\t// a response containing a new line separated list of metadata resources\n\t// available.\n\t//\n\t// Must not include the metadata base path.\n\t//\n\t// May include leading slash. If Path includes trailing slash the trailing slash\n\t// will be included in the request for the resource.\n\tPath string\n}\n\n// GetMetadataOutput provides the output parameters for the GetMetadata\n// operation.\ntype GetMetadataOutput struct {\n\tContent io.ReadCloser\n\n\tResultMetadata middleware.Metadata\n}\n\nfunc addGetMetadataMiddleware(stack *middleware.Stack, options Options) error {\n\treturn addAPIRequestMiddleware(stack,\n\t\toptions,\n\t\t\"GetMetadata\",\n\t\tbuildGetMetadataPath,\n\t\tbuildGetMetadataOutput)\n}\n\nfunc buildGetMetadataPath(params interface{}) (string, error) {\n\tp, ok := params.(*GetMetadataInput)\n\tif !ok {\n\t\treturn \"\", fmt.Errorf(\"unknown parameter type %T\", params)\n\t}\n\n\treturn appendURIPath(getMetadataPath, p.Path), nil\n}\n\nfunc buildGetMetadataOutput(resp *smithyhttp.Response) (interface{}, error) {\n\treturn &GetMetadataOutput{\n\t\tContent: resp.Body,\n\t}, nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetRegion.go",
    "content": "package imds\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// GetRegion retrieves an identity document describing an\n// instance. Error is returned if the request fails or is unable to parse\n// the response.\nfunc (c *Client) GetRegion(\n\tctx context.Context, params *GetRegionInput, optFns ...func(*Options),\n) (\n\t*GetRegionOutput, error,\n) {\n\tif params == nil {\n\t\tparams = &GetRegionInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetRegion\", params, optFns,\n\t\taddGetRegionMiddleware,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetRegionOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\n// GetRegionInput provides the input parameters for GetRegion operation.\ntype GetRegionInput struct{}\n\n// GetRegionOutput provides the output parameters for GetRegion operation.\ntype GetRegionOutput struct {\n\tRegion string\n\n\tResultMetadata middleware.Metadata\n}\n\nfunc addGetRegionMiddleware(stack *middleware.Stack, options Options) error {\n\treturn addAPIRequestMiddleware(stack,\n\t\toptions,\n\t\t\"GetRegion\",\n\t\tbuildGetInstanceIdentityDocumentPath,\n\t\tbuildGetRegionOutput,\n\t)\n}\n\nfunc buildGetRegionOutput(resp *smithyhttp.Response) (interface{}, error) {\n\tout, err := buildGetInstanceIdentityDocumentOutput(resp)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tresult, ok := out.(*GetInstanceIdentityDocumentOutput)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"unexpected instance identity document type, %T\", out)\n\t}\n\n\tregion := result.Region\n\tif len(region) == 0 {\n\t\treturn \"\", fmt.Errorf(\"instance metadata did not return a region value\")\n\t}\n\n\treturn &GetRegionOutput{\n\t\tRegion: region,\n\t}, nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetToken.go",
    "content": "package imds\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nconst getTokenPath = \"/latest/api/token\"\nconst tokenTTLHeader = \"X-Aws-Ec2-Metadata-Token-Ttl-Seconds\"\n\n// getToken uses the duration to return a token for EC2 IMDS, or an error if\n// the request failed.\nfunc (c *Client) getToken(ctx context.Context, params *getTokenInput, optFns ...func(*Options)) (*getTokenOutput, error) {\n\tif params == nil {\n\t\tparams = &getTokenInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"getToken\", params, optFns,\n\t\taddGetTokenMiddleware,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*getTokenOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype getTokenInput struct {\n\tTokenTTL time.Duration\n}\n\ntype getTokenOutput struct {\n\tToken    string\n\tTokenTTL time.Duration\n\n\tResultMetadata middleware.Metadata\n}\n\nfunc addGetTokenMiddleware(stack *middleware.Stack, options Options) error {\n\terr := addRequestMiddleware(stack,\n\t\toptions,\n\t\t\"PUT\",\n\t\t\"GetToken\",\n\t\tbuildGetTokenPath,\n\t\tbuildGetTokenOutput)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = stack.Serialize.Add(&tokenTTLRequestHeader{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc buildGetTokenPath(interface{}) (string, error) {\n\treturn getTokenPath, nil\n}\n\nfunc buildGetTokenOutput(resp *smithyhttp.Response) (v interface{}, err error) {\n\tdefer func() {\n\t\tcloseErr := resp.Body.Close()\n\t\tif err == nil {\n\t\t\terr = closeErr\n\t\t} else if closeErr != nil {\n\t\t\terr = fmt.Errorf(\"response body close error: %v, original error: %w\", closeErr, err)\n\t\t}\n\t}()\n\n\tttlHeader := resp.Header.Get(tokenTTLHeader)\n\ttokenTTL, err := strconv.ParseInt(ttlHeader, 10, 64)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"unable to parse API token, %w\", err)\n\t}\n\n\tvar token strings.Builder\n\tif _, err = io.Copy(&token, resp.Body); err != nil {\n\t\treturn nil, fmt.Errorf(\"unable to read API token, %w\", err)\n\t}\n\n\treturn &getTokenOutput{\n\t\tToken:    token.String(),\n\t\tTokenTTL: time.Duration(tokenTTL) * time.Second,\n\t}, nil\n}\n\ntype tokenTTLRequestHeader struct{}\n\nfunc (*tokenTTLRequestHeader) ID() string { return \"tokenTTLRequestHeader\" }\nfunc (*tokenTTLRequestHeader) HandleSerialize(\n\tctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler,\n) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"expect HTTP transport, got %T\", in.Request)\n\t}\n\n\tinput, ok := in.Parameters.(*getTokenInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"expect getTokenInput, got %T\", in.Parameters)\n\t}\n\n\treq.Header.Set(tokenTTLHeader, strconv.Itoa(int(input.TokenTTL/time.Second)))\n\n\treturn next.HandleSerialize(ctx, in)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetUserData.go",
    "content": "package imds\n\nimport (\n\t\"context\"\n\t\"io\"\n\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nconst getUserDataPath = \"/latest/user-data\"\n\n// GetUserData uses the path provided to request information from the EC2\n// instance metadata service for dynamic data. The content will be returned\n// as a string, or error if the request failed.\nfunc (c *Client) GetUserData(ctx context.Context, params *GetUserDataInput, optFns ...func(*Options)) (*GetUserDataOutput, error) {\n\tif params == nil {\n\t\tparams = &GetUserDataInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetUserData\", params, optFns,\n\t\taddGetUserDataMiddleware,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetUserDataOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\n// GetUserDataInput provides the input parameters for the GetUserData\n// operation.\ntype GetUserDataInput struct{}\n\n// GetUserDataOutput provides the output parameters for the GetUserData\n// operation.\ntype GetUserDataOutput struct {\n\tContent io.ReadCloser\n\n\tResultMetadata middleware.Metadata\n}\n\nfunc addGetUserDataMiddleware(stack *middleware.Stack, options Options) error {\n\treturn addAPIRequestMiddleware(stack,\n\t\toptions,\n\t\t\"GetUserData\",\n\t\tbuildGetUserDataPath,\n\t\tbuildGetUserDataOutput)\n}\n\nfunc buildGetUserDataPath(params interface{}) (string, error) {\n\treturn getUserDataPath, nil\n}\n\nfunc buildGetUserDataOutput(resp *smithyhttp.Response) (interface{}, error) {\n\treturn &GetUserDataOutput{\n\t\tContent: resp.Body,\n\t}, nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/auth.go",
    "content": "package imds\n\nimport (\n\t\"context\"\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\ntype getIdentityMiddleware struct {\n\toptions Options\n}\n\nfunc (*getIdentityMiddleware) ID() string {\n\treturn \"GetIdentity\"\n}\n\nfunc (m *getIdentityMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\treturn next.HandleFinalize(ctx, in)\n}\n\ntype signRequestMiddleware struct {\n}\n\nfunc (*signRequestMiddleware) ID() string {\n\treturn \"Signing\"\n}\n\nfunc (m *signRequestMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\treturn next.HandleFinalize(ctx, in)\n}\n\ntype resolveAuthSchemeMiddleware struct {\n\toperation string\n\toptions   Options\n}\n\nfunc (*resolveAuthSchemeMiddleware) ID() string {\n\treturn \"ResolveAuthScheme\"\n}\n\nfunc (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\treturn next.HandleFinalize(ctx, in)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/doc.go",
    "content": "// Package imds provides the API client for interacting with the Amazon EC2\n// Instance Metadata Service.\n//\n// All Client operation calls have a default timeout. If the operation is not\n// completed before this timeout expires, the operation will be canceled. This\n// timeout can be overridden through the following:\n//   - Set the options flag DisableDefaultTimeout\n//   - Provide a Context with a timeout or deadline with calling the client's operations.\n//\n// See the EC2 IMDS user guide for more information on using the API.\n// https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html\npackage imds\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/endpoints.go",
    "content": "package imds\n\nimport (\n\t\"context\"\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\ntype resolveEndpointV2Middleware struct {\n\toptions Options\n}\n\nfunc (*resolveEndpointV2Middleware) ID() string {\n\treturn \"ResolveEndpointV2\"\n}\n\nfunc (m *resolveEndpointV2Middleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\treturn next.HandleFinalize(ctx, in)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go",
    "content": "// Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT.\n\npackage imds\n\n// goModuleVersion is the tagged release for this module\nconst goModuleVersion = \"1.16.30\"\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/internal/config/resolvers.go",
    "content": "package config\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\n// ClientEnableState provides an enumeration if the client is enabled,\n// disabled, or default behavior.\ntype ClientEnableState uint\n\n// Enumeration values for ClientEnableState\nconst (\n\tClientDefaultEnableState ClientEnableState = iota\n\tClientDisabled\n\tClientEnabled\n)\n\n// EndpointModeState is the EC2 IMDS Endpoint Configuration Mode\ntype EndpointModeState uint\n\n// Enumeration values for ClientEnableState\nconst (\n\tEndpointModeStateUnset EndpointModeState = iota\n\tEndpointModeStateIPv4\n\tEndpointModeStateIPv6\n)\n\n// SetFromString sets the EndpointModeState based on the provided string value. Unknown values will default to EndpointModeStateUnset\nfunc (e *EndpointModeState) SetFromString(v string) error {\n\tv = strings.TrimSpace(v)\n\n\tswitch {\n\tcase len(v) == 0:\n\t\t*e = EndpointModeStateUnset\n\tcase strings.EqualFold(v, \"IPv6\"):\n\t\t*e = EndpointModeStateIPv6\n\tcase strings.EqualFold(v, \"IPv4\"):\n\t\t*e = EndpointModeStateIPv4\n\tdefault:\n\t\treturn fmt.Errorf(\"unknown EC2 IMDS endpoint mode, must be either IPv6 or IPv4\")\n\t}\n\treturn nil\n}\n\n// ClientEnableStateResolver is a config resolver interface for retrieving whether the IMDS client is disabled.\ntype ClientEnableStateResolver interface {\n\tGetEC2IMDSClientEnableState() (ClientEnableState, bool, error)\n}\n\n// EndpointModeResolver is a config resolver interface for retrieving the EndpointModeState configuration.\ntype EndpointModeResolver interface {\n\tGetEC2IMDSEndpointMode() (EndpointModeState, bool, error)\n}\n\n// EndpointResolver is a config resolver interface for retrieving the endpoint.\ntype EndpointResolver interface {\n\tGetEC2IMDSEndpoint() (string, bool, error)\n}\n\ntype v1FallbackDisabledResolver interface {\n\tGetEC2IMDSV1FallbackDisabled() (bool, bool)\n}\n\n// ResolveClientEnableState resolves the ClientEnableState from a list of configuration sources.\nfunc ResolveClientEnableState(sources []interface{}) (value ClientEnableState, found bool, err error) {\n\tfor _, source := range sources {\n\t\tif resolver, ok := source.(ClientEnableStateResolver); ok {\n\t\t\tvalue, found, err = resolver.GetEC2IMDSClientEnableState()\n\t\t\tif err != nil || found {\n\t\t\t\treturn value, found, err\n\t\t\t}\n\t\t}\n\t}\n\treturn value, found, err\n}\n\n// ResolveEndpointModeConfig resolves the EndpointModeState from a list of configuration sources.\nfunc ResolveEndpointModeConfig(sources []interface{}) (value EndpointModeState, found bool, err error) {\n\tfor _, source := range sources {\n\t\tif resolver, ok := source.(EndpointModeResolver); ok {\n\t\t\tvalue, found, err = resolver.GetEC2IMDSEndpointMode()\n\t\t\tif err != nil || found {\n\t\t\t\treturn value, found, err\n\t\t\t}\n\t\t}\n\t}\n\treturn value, found, err\n}\n\n// ResolveEndpointConfig resolves the endpoint from a list of configuration sources.\nfunc ResolveEndpointConfig(sources []interface{}) (value string, found bool, err error) {\n\tfor _, source := range sources {\n\t\tif resolver, ok := source.(EndpointResolver); ok {\n\t\t\tvalue, found, err = resolver.GetEC2IMDSEndpoint()\n\t\t\tif err != nil || found {\n\t\t\t\treturn value, found, err\n\t\t\t}\n\t\t}\n\t}\n\treturn value, found, err\n}\n\n// ResolveV1FallbackDisabled ...\nfunc ResolveV1FallbackDisabled(sources []interface{}) (bool, bool) {\n\tfor _, source := range sources {\n\t\tif resolver, ok := source.(v1FallbackDisabledResolver); ok {\n\t\t\tif v, found := resolver.GetEC2IMDSV1FallbackDisabled(); found {\n\t\t\t\treturn v, true\n\t\t\t}\n\t\t}\n\t}\n\treturn false, false\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/request_middleware.go",
    "content": "package imds\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/url\"\n\t\"path\"\n\t\"time\"\n\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/retry\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nfunc addAPIRequestMiddleware(stack *middleware.Stack,\n\toptions Options,\n\toperation string,\n\tgetPath func(interface{}) (string, error),\n\tgetOutput func(*smithyhttp.Response) (interface{}, error),\n) (err error) {\n\terr = addRequestMiddleware(stack, options, \"GET\", operation, getPath, getOutput)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Token Serializer build and state management.\n\tif !options.disableAPIToken {\n\t\terr = stack.Finalize.Insert(options.tokenProvider, (*retry.Attempt)(nil).ID(), middleware.After)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\terr = stack.Deserialize.Insert(options.tokenProvider, \"OperationDeserializer\", middleware.Before)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc addRequestMiddleware(stack *middleware.Stack,\n\toptions Options,\n\tmethod string,\n\toperation string,\n\tgetPath func(interface{}) (string, error),\n\tgetOutput func(*smithyhttp.Response) (interface{}, error),\n) (err error) {\n\terr = awsmiddleware.AddSDKAgentKey(awsmiddleware.FeatureMetadata, \"ec2-imds\")(stack)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Operation timeout\n\terr = stack.Initialize.Add(&operationTimeout{\n\t\tDisabled:       options.DisableDefaultTimeout,\n\t\tDefaultTimeout: defaultOperationTimeout,\n\t}, middleware.Before)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Operation Serializer\n\terr = stack.Serialize.Add(&serializeRequest{\n\t\tGetPath: getPath,\n\t\tMethod:  method,\n\t}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Operation endpoint resolver\n\terr = stack.Serialize.Insert(&resolveEndpoint{\n\t\tEndpoint:     options.Endpoint,\n\t\tEndpointMode: options.EndpointMode,\n\t}, \"OperationSerializer\", middleware.Before)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Operation Deserializer\n\terr = stack.Deserialize.Add(&deserializeResponse{\n\t\tGetOutput: getOutput,\n\t}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = stack.Deserialize.Add(&smithyhttp.RequestResponseLogger{\n\t\tLogRequest:          options.ClientLogMode.IsRequest(),\n\t\tLogRequestWithBody:  options.ClientLogMode.IsRequestWithBody(),\n\t\tLogResponse:         options.ClientLogMode.IsResponse(),\n\t\tLogResponseWithBody: options.ClientLogMode.IsResponseWithBody(),\n\t}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = addSetLoggerMiddleware(stack, options)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := addProtocolFinalizerMiddlewares(stack, options, operation); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %w\", err)\n\t}\n\n\t// Retry support\n\treturn retry.AddRetryMiddlewares(stack, retry.AddRetryMiddlewaresOptions{\n\t\tRetryer:          options.Retryer,\n\t\tLogRetryAttempts: options.ClientLogMode.IsRetries(),\n\t})\n}\n\nfunc addSetLoggerMiddleware(stack *middleware.Stack, o Options) error {\n\treturn middleware.AddSetLoggerMiddleware(stack, o.Logger)\n}\n\ntype serializeRequest struct {\n\tGetPath func(interface{}) (string, error)\n\tMethod  string\n}\n\nfunc (*serializeRequest) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *serializeRequest) HandleSerialize(\n\tctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler,\n) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type %T\", in.Request)\n\t}\n\n\treqPath, err := m.GetPath(in.Parameters)\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"unable to get request URL path, %w\", err)\n\t}\n\n\trequest.Request.URL.Path = reqPath\n\trequest.Request.Method = m.Method\n\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype deserializeResponse struct {\n\tGetOutput func(*smithyhttp.Response) (interface{}, error)\n}\n\nfunc (*deserializeResponse) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *deserializeResponse) HandleDeserialize(\n\tctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler,\n) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\tresp, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\n\t\t\t\"unexpected transport response type, %T, want %T\", out.RawResponse, resp)\n\t}\n\tdefer resp.Body.Close()\n\n\t// read the full body so that any operation timeouts cleanup will not race\n\t// the body being read.\n\tbody, err := ioutil.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"read response body failed, %w\", err)\n\t}\n\tresp.Body = ioutil.NopCloser(bytes.NewReader(body))\n\n\t// Anything that's not 200 |< 300 is error\n\tif resp.StatusCode < 200 || resp.StatusCode >= 300 {\n\t\treturn out, metadata, &smithyhttp.ResponseError{\n\t\t\tResponse: resp,\n\t\t\tErr:      fmt.Errorf(\"request to EC2 IMDS failed\"),\n\t\t}\n\t}\n\n\tresult, err := m.GetOutput(resp)\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\n\t\t\t\"unable to get deserialized result for response, %w\", err,\n\t\t)\n\t}\n\tout.Result = result\n\n\treturn out, metadata, err\n}\n\ntype resolveEndpoint struct {\n\tEndpoint     string\n\tEndpointMode EndpointModeState\n}\n\nfunc (*resolveEndpoint) ID() string {\n\treturn \"ResolveEndpoint\"\n}\n\nfunc (m *resolveEndpoint) HandleSerialize(\n\tctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler,\n) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type %T\", in.Request)\n\t}\n\n\tvar endpoint string\n\tif len(m.Endpoint) > 0 {\n\t\tendpoint = m.Endpoint\n\t} else {\n\t\tswitch m.EndpointMode {\n\t\tcase EndpointModeStateIPv6:\n\t\t\tendpoint = defaultIPv6Endpoint\n\t\tcase EndpointModeStateIPv4:\n\t\t\tfallthrough\n\t\tcase EndpointModeStateUnset:\n\t\t\tendpoint = defaultIPv4Endpoint\n\t\tdefault:\n\t\t\treturn out, metadata, fmt.Errorf(\"unsupported IMDS endpoint mode\")\n\t\t}\n\t}\n\n\treq.URL, err = url.Parse(endpoint)\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"failed to parse endpoint URL: %w\", err)\n\t}\n\n\treturn next.HandleSerialize(ctx, in)\n}\n\nconst (\n\tdefaultOperationTimeout = 5 * time.Second\n)\n\n// operationTimeout adds a timeout on the middleware stack if the Context the\n// stack was called with does not have a deadline. The next middleware must\n// complete before the timeout, or the context will be canceled.\n//\n// If DefaultTimeout is zero, no default timeout will be used if the Context\n// does not have a timeout.\n//\n// The next middleware must also ensure that any resources that are also\n// canceled by the stack's context are completely consumed before returning.\n// Otherwise the timeout cleanup will race the resource being consumed\n// upstream.\ntype operationTimeout struct {\n\tDisabled       bool\n\tDefaultTimeout time.Duration\n}\n\nfunc (*operationTimeout) ID() string { return \"OperationTimeout\" }\n\nfunc (m *operationTimeout) HandleInitialize(\n\tctx context.Context, input middleware.InitializeInput, next middleware.InitializeHandler,\n) (\n\toutput middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tif m.Disabled {\n\t\treturn next.HandleInitialize(ctx, input)\n\t}\n\n\tif _, ok := ctx.Deadline(); !ok && m.DefaultTimeout != 0 {\n\t\tvar cancelFn func()\n\t\tctx, cancelFn = context.WithTimeout(ctx, m.DefaultTimeout)\n\t\tdefer cancelFn()\n\t}\n\n\treturn next.HandleInitialize(ctx, input)\n}\n\n// appendURIPath joins a URI path component to the existing path with `/`\n// separators between the path components. If the path being added ends with a\n// trailing `/` that slash will be maintained.\nfunc appendURIPath(base, add string) string {\n\treqPath := path.Join(base, add)\n\tif len(add) != 0 && add[len(add)-1] == '/' {\n\t\treqPath += \"/\"\n\t}\n\treturn reqPath\n}\n\nfunc addProtocolFinalizerMiddlewares(stack *middleware.Stack, options Options, operation string) error {\n\tif err := stack.Finalize.Add(&resolveAuthSchemeMiddleware{operation: operation, options: options}, middleware.Before); err != nil {\n\t\treturn fmt.Errorf(\"add ResolveAuthScheme: %w\", err)\n\t}\n\tif err := stack.Finalize.Insert(&getIdentityMiddleware{options: options}, \"ResolveAuthScheme\", middleware.After); err != nil {\n\t\treturn fmt.Errorf(\"add GetIdentity: %w\", err)\n\t}\n\tif err := stack.Finalize.Insert(&resolveEndpointV2Middleware{options: options}, \"GetIdentity\", middleware.After); err != nil {\n\t\treturn fmt.Errorf(\"add ResolveEndpointV2: %w\", err)\n\t}\n\tif err := stack.Finalize.Insert(&signRequestMiddleware{}, \"ResolveEndpointV2\", middleware.After); err != nil {\n\t\treturn fmt.Errorf(\"add Signing: %w\", err)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/token_provider.go",
    "content": "package imds\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/smithy-go\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"net/http\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nconst (\n\t// Headers for Token and TTL\n\ttokenHeader     = \"x-aws-ec2-metadata-token\"\n\tdefaultTokenTTL = 5 * time.Minute\n)\n\ntype tokenProvider struct {\n\tclient   *Client\n\ttokenTTL time.Duration\n\n\ttoken    *apiToken\n\ttokenMux sync.RWMutex\n\n\tdisabled uint32 // Atomic updated\n}\n\nfunc newTokenProvider(client *Client, ttl time.Duration) *tokenProvider {\n\treturn &tokenProvider{\n\t\tclient:   client,\n\t\ttokenTTL: ttl,\n\t}\n}\n\n// apiToken provides the API token used by all operation calls for th EC2\n// Instance metadata service.\ntype apiToken struct {\n\ttoken   string\n\texpires time.Time\n}\n\nvar timeNow = time.Now\n\n// Expired returns if the token is expired.\nfunc (t *apiToken) Expired() bool {\n\t// Calling Round(0) on the current time will truncate the monotonic reading only. Ensures credential expiry\n\t// time is always based on reported wall-clock time.\n\treturn timeNow().Round(0).After(t.expires)\n}\n\nfunc (t *tokenProvider) ID() string { return \"APITokenProvider\" }\n\n// HandleFinalize is the finalize stack middleware, that if the token provider is\n// enabled, will attempt to add the cached API token to the request. If the API\n// token is not cached, it will be retrieved in a separate API call, getToken.\n//\n// For retry attempts, handler must be added after attempt retryer.\n//\n// If request for getToken fails the token provider may be disabled from future\n// requests, depending on the response status code.\nfunc (t *tokenProvider) HandleFinalize(\n\tctx context.Context, input middleware.FinalizeInput, next middleware.FinalizeHandler,\n) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\tif t.fallbackEnabled() && !t.enabled() {\n\t\t// short-circuits to insecure data flow if token provider is disabled.\n\t\treturn next.HandleFinalize(ctx, input)\n\t}\n\n\treq, ok := input.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unexpected transport request type %T\", input.Request)\n\t}\n\n\ttok, err := t.getToken(ctx)\n\tif err != nil {\n\t\t// If the error allows the token to downgrade to insecure flow allow that.\n\t\tvar bypassErr *bypassTokenRetrievalError\n\t\tif errors.As(err, &bypassErr) {\n\t\t\treturn next.HandleFinalize(ctx, input)\n\t\t}\n\n\t\treturn out, metadata, fmt.Errorf(\"failed to get API token, %w\", err)\n\t}\n\n\treq.Header.Set(tokenHeader, tok.token)\n\n\treturn next.HandleFinalize(ctx, input)\n}\n\n// HandleDeserialize is the deserialize stack middleware for determining if the\n// operation the token provider is decorating failed because of a 401\n// unauthorized status code. If the operation failed for that reason the token\n// provider needs to be re-enabled so that it can start adding the API token to\n// operation calls.\nfunc (t *tokenProvider) HandleDeserialize(\n\tctx context.Context, input middleware.DeserializeInput, next middleware.DeserializeHandler,\n) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, input)\n\tif err == nil {\n\t\treturn out, metadata, err\n\t}\n\n\tresp, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"expect HTTP transport, got %T\", out.RawResponse)\n\t}\n\n\tif resp.StatusCode == http.StatusUnauthorized { // unauthorized\n\t\tt.enable()\n\t\terr = &retryableError{Err: err, isRetryable: true}\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc (t *tokenProvider) getToken(ctx context.Context) (tok *apiToken, err error) {\n\tif t.fallbackEnabled() && !t.enabled() {\n\t\treturn nil, &bypassTokenRetrievalError{\n\t\t\tErr: fmt.Errorf(\"cannot get API token, provider disabled\"),\n\t\t}\n\t}\n\n\tt.tokenMux.RLock()\n\ttok = t.token\n\tt.tokenMux.RUnlock()\n\n\tif tok != nil && !tok.Expired() {\n\t\treturn tok, nil\n\t}\n\n\ttok, err = t.updateToken(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn tok, nil\n}\n\nfunc (t *tokenProvider) updateToken(ctx context.Context) (*apiToken, error) {\n\tt.tokenMux.Lock()\n\tdefer t.tokenMux.Unlock()\n\n\t// Prevent multiple requests to update retrieving the token.\n\tif t.token != nil && !t.token.Expired() {\n\t\ttok := t.token\n\t\treturn tok, nil\n\t}\n\n\tresult, err := t.client.getToken(ctx, &getTokenInput{\n\t\tTokenTTL: t.tokenTTL,\n\t})\n\tif err != nil {\n\t\tvar statusErr interface{ HTTPStatusCode() int }\n\t\tif errors.As(err, &statusErr) {\n\t\t\tswitch statusErr.HTTPStatusCode() {\n\t\t\t// Disable future get token if failed because of 403, 404, or 405\n\t\t\tcase http.StatusForbidden,\n\t\t\t\thttp.StatusNotFound,\n\t\t\t\thttp.StatusMethodNotAllowed:\n\n\t\t\t\tif t.fallbackEnabled() {\n\t\t\t\t\tlogger := middleware.GetLogger(ctx)\n\t\t\t\t\tlogger.Logf(logging.Warn, \"falling back to IMDSv1: %v\", err)\n\t\t\t\t\tt.disable()\n\t\t\t\t}\n\n\t\t\t// 400 errors are terminal, and need to be upstreamed\n\t\t\tcase http.StatusBadRequest:\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\n\t\t// Disable if request send failed or timed out getting response\n\t\tvar re *smithyhttp.RequestSendError\n\t\tvar ce *smithy.CanceledError\n\t\tif errors.As(err, &re) || errors.As(err, &ce) {\n\t\t\tatomic.StoreUint32(&t.disabled, 1)\n\t\t}\n\n\t\tif !t.fallbackEnabled() {\n\t\t\t// NOTE: getToken() is an implementation detail of some outer operation\n\t\t\t// (e.g. GetMetadata). It has its own retries that have already been exhausted.\n\t\t\t// Mark the underlying error as a terminal error.\n\t\t\terr = &retryableError{Err: err, isRetryable: false}\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Token couldn't be retrieved, fallback to IMDSv1 insecure flow for this request\n\t\t// and allow the request to proceed. Future requests _may_ re-attempt fetching a\n\t\t// token if not disabled.\n\t\treturn nil, &bypassTokenRetrievalError{Err: err}\n\t}\n\n\ttok := &apiToken{\n\t\ttoken:   result.Token,\n\t\texpires: timeNow().Add(result.TokenTTL),\n\t}\n\tt.token = tok\n\n\treturn tok, nil\n}\n\n// enabled returns if the token provider is current enabled or not.\nfunc (t *tokenProvider) enabled() bool {\n\treturn atomic.LoadUint32(&t.disabled) == 0\n}\n\n// fallbackEnabled returns false if EnableFallback is [aws.FalseTernary], true otherwise\nfunc (t *tokenProvider) fallbackEnabled() bool {\n\tswitch t.client.options.EnableFallback {\n\tcase aws.FalseTernary:\n\t\treturn false\n\tdefault:\n\t\treturn true\n\t}\n}\n\n// disable disables the token provider and it will no longer attempt to inject\n// the token, nor request updates.\nfunc (t *tokenProvider) disable() {\n\tatomic.StoreUint32(&t.disabled, 1)\n}\n\n// enable enables the token provide to start refreshing tokens, and adding them\n// to the pending request.\nfunc (t *tokenProvider) enable() {\n\tt.tokenMux.Lock()\n\tt.token = nil\n\tt.tokenMux.Unlock()\n\tatomic.StoreUint32(&t.disabled, 0)\n}\n\ntype bypassTokenRetrievalError struct {\n\tErr error\n}\n\nfunc (e *bypassTokenRetrievalError) Error() string {\n\treturn fmt.Sprintf(\"bypass token retrieval, %v\", e.Err)\n}\n\nfunc (e *bypassTokenRetrievalError) Unwrap() error { return e.Err }\n\ntype retryableError struct {\n\tErr         error\n\tisRetryable bool\n}\n\nfunc (e *retryableError) RetryableError() bool { return e.isRetryable }\n\nfunc (e *retryableError) Error() string { return e.Err.Error() }\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/CHANGELOG.md",
    "content": "# v1.17.75 (2025-05-05)\n\n* **Bug Fix**: Enable user to call GetBucketRegion without credential config\n\n# v1.17.74 (2025-04-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.73 (2025-04-23)\n\n* **Bug Fix**: Abort multi part download if the object is modified during download\n\n# v1.17.72 (2025-04-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.71 (2025-04-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.70 (2025-03-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.69 (2025-03-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.68 (2025-03-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.67 (2025-03-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.66 (2025-03-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.65 (2025-03-04.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.64 (2025-02-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.63 (2025-02-18)\n\n* **Bug Fix**: Bump go version to 1.22\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.62 (2025-02-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.61 (2025-02-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.60 (2025-02-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.59 (2025-02-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.58 (2025-02-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.57 (2025-01-31)\n\n* **Bug Fix**: Fix incorrect reference to old s3manager in comments.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.56 (2025-01-30)\n\n* **Bug Fix**: Fix incorrect reference to old s3manager in comments.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.55 (2025-01-29)\n\n* **Bug Fix**: Fix incorrect reference to old s3manager in comments.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.54 (2025-01-24)\n\n* **Bug Fix**: Fix incorrect reference to old s3manager in comments.\n* **Dependency Update**: Updated to the latest SDK module versions\n* **Dependency Update**: Upgrade to smithy-go v1.22.2.\n\n# v1.17.53 (2025-01-22)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.52 (2025-01-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.51 (2025-01-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.50 (2025-01-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.49 (2025-01-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.48 (2025-01-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.47 (2025-01-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.46 (2025-01-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.45 (2025-01-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.44 (2024-12-19)\n\n* **Bug Fix**: Fix improper use of printf-style functions.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.43 (2024-12-03.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.42 (2024-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.41 (2024-11-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.40 (2024-11-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.39 (2024-11-18)\n\n* **Dependency Update**: Update to smithy-go v1.22.1.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.38 (2024-11-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.37 (2024-11-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.36 (2024-11-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.35 (2024-10-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.34 (2024-10-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.33 (2024-10-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.32 (2024-10-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.31 (2024-10-09)\n\n* **Bug Fix**: Fixup some integration tests.\n\n# v1.17.30 (2024-10-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.29 (2024-10-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.28 (2024-10-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.27 (2024-10-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.26 (2024-10-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.25 (2024-09-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.24 (2024-09-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.23 (2024-09-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.22 (2024-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.21 (2024-09-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.20 (2024-09-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.19 (2024-09-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.18 (2024-09-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.17 (2024-09-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.16 (2024-08-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.15 (2024-08-26)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.14 (2024-08-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.13 (2024-08-22)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.12 (2024-08-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.11 (2024-08-15)\n\n* **Dependency Update**: Bump minimum Go version to 1.21.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.10 (2024-08-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.9 (2024-07-24)\n\n* **Documentation**: Clarify region hint and credential usage in HeadBucketRegion.\n\n# v1.17.8 (2024-07-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.7 (2024-07-10.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.6 (2024-07-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.5 (2024-07-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.4 (2024-07-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.3 (2024-06-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.2 (2024-06-26)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.1 (2024-06-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.0 (2024-06-18)\n\n* **Feature**: Track usage of various AWS SDK features in user-agent string.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.25 (2024-06-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.24 (2024-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.23 (2024-06-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.22 (2024-06-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.21 (2024-05-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.20 (2024-05-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.19 (2024-05-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.18 (2024-05-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.17 (2024-05-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.16 (2024-05-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.15 (2024-04-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.14 (2024-03-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.13 (2024-03-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.12 (2024-03-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.11 (2024-03-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.10 (2024-03-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.9 (2024-03-07)\n\n* **Bug Fix**: Remove dependency on go-cmp.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.8 (2024-03-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.7 (2024-03-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.6 (2024-02-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.5 (2024-02-22)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.4 (2024-02-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.3 (2024-02-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.2 (2024-02-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.1 (2024-02-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.0 (2024-02-13)\n\n* **Feature**: Bump minimum Go version to 1.20 per our language support policy.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.15 (2024-01-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.14 (2024-01-22)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.13 (2024-01-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.12 (2024-01-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.11 (2024-01-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.10 (2024-01-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.9 (2023-12-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.8 (2023-12-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.7 (2023-12-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.6 (2023-12-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.5 (2023-12-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.4 (2023-12-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.3 (2023-11-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.2 (2023-11-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.1 (2023-11-28.3)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.0 (2023-11-28.2)\n\n* **Feature**: Add S3Express support.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.4 (2023-11-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.3 (2023-11-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.2 (2023-11-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.1 (2023-11-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.0 (2023-11-17)\n\n* **Feature**: **BREAKING CHANGE** Correct nullability of a large number of S3 structure fields. See https://github.com/aws/aws-sdk-go-v2/issues/2162.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.9 (2023-11-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.8 (2023-11-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.7 (2023-11-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.6 (2023-11-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.5 (2023-11-09.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.4 (2023-11-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.3 (2023-11-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.2 (2023-11-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.1 (2023-11-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.0 (2023-11-01)\n\n* **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.0 (2023-10-31)\n\n* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.92 (2023-10-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.91 (2023-10-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.90 (2023-10-12)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.89 (2023-10-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.88 (2023-10-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.87 (2023-09-26)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.86 (2023-09-22)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.85 (2023-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.84 (2023-09-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.83 (2023-09-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.82 (2023-08-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.81 (2023-08-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.80 (2023-08-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.79 (2023-08-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.78 (2023-08-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.77 (2023-08-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.76 (2023-08-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.75 (2023-07-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.74 (2023-07-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.73 (2023-07-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.72 (2023-07-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.71 (2023-06-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.70 (2023-06-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.69 (2023-06-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.68 (2023-06-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.67 (2023-05-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.66 (2023-05-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.65 (2023-05-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.64 (2023-04-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.63 (2023-04-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.62 (2023-04-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.61 (2023-04-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.60 (2023-03-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.59 (2023-03-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.58 (2023-03-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.57 (2023-03-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.56 (2023-03-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.55 (2023-02-22)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.54 (2023-02-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.53 (2023-02-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.52 (2023-02-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.51 (2023-02-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.50 (2023-02-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.49 (2023-01-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.48 (2023-01-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.47 (2023-01-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.46 (2022-12-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.45 (2022-12-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.44 (2022-12-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.43 (2022-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.42 (2022-11-22)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.41 (2022-11-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.40 (2022-11-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.39 (2022-11-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.38 (2022-11-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.37 (2022-10-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.36 (2022-10-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.35 (2022-10-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.34 (2022-09-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.33 (2022-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.32 (2022-09-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.31 (2022-09-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.30 (2022-08-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.29 (2022-08-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.28 (2022-08-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.27 (2022-08-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.26 (2022-08-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.25 (2022-08-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.24 (2022-08-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.23 (2022-08-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.22 (2022-08-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.21 (2022-08-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.20 (2022-07-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.19 (2022-07-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.18 (2022-07-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.17 (2022-06-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.16 (2022-06-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.15 (2022-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.14 (2022-05-26)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.13 (2022-05-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.12 (2022-05-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.11 (2022-05-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.10 (2022-05-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.9 (2022-05-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.8 (2022-05-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.7 (2022-04-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.6 (2022-04-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.5 (2022-04-12)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.4 (2022-04-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.3 (2022-03-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.2 (2022-03-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.1 (2022-03-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.0 (2022-03-08)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.0 (2022-02-24)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.1 (2022-01-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.0 (2022-01-14)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.8.0 (2022-01-07)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.7.5 (2021-12-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.7.4 (2021-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.7.3 (2021-11-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.7.2 (2021-11-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.7.1 (2021-11-12)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.7.0 (2021-11-06)\n\n* **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically.\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.6.0 (2021-10-21)\n\n* **Feature**: Updated  to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.4 (2021-10-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.3 (2021-09-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.2 (2021-09-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.1 (2021-09-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.0 (2021-08-27)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.1 (2021-08-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.0 (2021-08-04)\n\n* **Feature**: adds error handling for defered close calls\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.2 (2021-07-15)\n\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.1 (2021-07-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.0 (2021-06-25)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.3 (2021-06-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.2 (2021-05-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.1 (2021-05-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.0 (2021-05-14)\n\n* **Feature**: Constant has been added to modules to enable runtime version inspection for reporting.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/api.go",
    "content": "package manager\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/s3\"\n)\n\n// DeleteObjectsAPIClient is an S3 API client that can invoke the DeleteObjects operation.\ntype DeleteObjectsAPIClient interface {\n\tDeleteObjects(context.Context, *s3.DeleteObjectsInput, ...func(*s3.Options)) (*s3.DeleteObjectsOutput, error)\n}\n\n// DownloadAPIClient is an S3 API client that can invoke the GetObject operation.\ntype DownloadAPIClient interface {\n\tGetObject(context.Context, *s3.GetObjectInput, ...func(*s3.Options)) (*s3.GetObjectOutput, error)\n}\n\n// HeadBucketAPIClient is an S3 API client that can invoke the HeadBucket operation.\ntype HeadBucketAPIClient interface {\n\tHeadBucket(context.Context, *s3.HeadBucketInput, ...func(*s3.Options)) (*s3.HeadBucketOutput, error)\n}\n\n// ListObjectsV2APIClient is an S3 API client that can invoke the ListObjectV2 operation.\ntype ListObjectsV2APIClient interface {\n\tListObjectsV2(context.Context, *s3.ListObjectsV2Input, ...func(*s3.Options)) (*s3.ListObjectsV2Output, error)\n}\n\n// UploadAPIClient is an S3 API client that can invoke PutObject, UploadPart, CreateMultipartUpload,\n// CompleteMultipartUpload, and AbortMultipartUpload operations.\ntype UploadAPIClient interface {\n\tPutObject(context.Context, *s3.PutObjectInput, ...func(*s3.Options)) (*s3.PutObjectOutput, error)\n\tUploadPart(context.Context, *s3.UploadPartInput, ...func(*s3.Options)) (*s3.UploadPartOutput, error)\n\tCreateMultipartUpload(context.Context, *s3.CreateMultipartUploadInput, ...func(*s3.Options)) (*s3.CreateMultipartUploadOutput, error)\n\tCompleteMultipartUpload(context.Context, *s3.CompleteMultipartUploadInput, ...func(*s3.Options)) (*s3.CompleteMultipartUploadOutput, error)\n\tAbortMultipartUpload(context.Context, *s3.AbortMultipartUploadInput, ...func(*s3.Options)) (*s3.AbortMultipartUploadOutput, error)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/arn.go",
    "content": "package manager\n\nimport (\n\t\"fmt\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/arn\"\n)\n\nfunc validateSupportedARNType(bucket string) error {\n\tif !arn.IsARN(bucket) {\n\t\treturn nil\n\t}\n\n\tparsedARN, err := arn.Parse(bucket)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif parsedARN.Service == \"s3-object-lambda\" {\n\t\treturn fmt.Errorf(\"manager does not support s3-object-lambda service ARNs\")\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/bucket_region.go",
    "content": "package manager\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nconst bucketRegionHeader = \"X-Amz-Bucket-Region\"\n\n// GetBucketRegion will attempt to get the region for a bucket using the\n// client's configured region to determine which AWS partition to perform the query on.\n//\n// A BucketNotFound error will be returned if the bucket does not exist in the\n// AWS partition the client region belongs to.\n//\n// For example to get the region of a bucket which exists in \"eu-central-1\"\n// you could provide a region hint of \"us-west-2\".\n//\n//\tcfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion(\"us-west-2\"))\n//\tif err != nil {\n//\t\tlog.Println(\"error:\", err)\n//\t\treturn\n//\t}\n//\n//\tbucket := \"my-bucket\"\n//\tregion, err := manager.GetBucketRegion(ctx, s3.NewFromConfig(cfg), bucket)\n//\tif err != nil {\n//\t\tvar bnf manager.BucketNotFound\n//\t\tif errors.As(err, &bnf) {\n//\t\t\tfmt.Fprintf(os.Stderr, \"unable to find bucket %s's region\\n\", bucket)\n//\t\t}\n//\t\treturn\n//\t}\n//\tfmt.Printf(\"Bucket %s is in %s region\\n\", bucket, region)\n//\n// By default the request will be made to the Amazon S3 endpoint using the virtual-hosted-style addressing.\n//\n//\tbucketname.s3.us-west-2.amazonaws.com/\n//\n// To configure the GetBucketRegion to make a request via the Amazon\n// S3 FIPS endpoints directly when a FIPS region name is not available, (e.g.\n// fips-us-gov-west-1) set the EndpointResolver on the config or client the\n// utility is called with.\n//\n//\tcfg, err := config.LoadDefaultConfig(context.TODO(),\n//\t\tconfig.WithEndpointResolver(\n//\t\t\taws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) {\n//\t\t\t\treturn aws.Endpoint{URL: \"https://s3-fips.us-west-2.amazonaws.com\"}, nil\n//\t\t\t}),\n//\t)\n//\tif err != nil {\n//\t\tpanic(err)\n//\t}\n//\n// If buckets are public, you may use anonymous credential like so.\n//\n//\tmanager.GetBucketRegion(ctx, s3.NewFromConfig(cfg), bucket, func(o *s3.Options) {\n//\t     o.Credentials = nil\n//\t})\n//\n// The request with anonymous credentials will not be signed.\n// Otherwise credentials would be required for private buckets.\nfunc GetBucketRegion(ctx context.Context, client HeadBucketAPIClient, bucket string, optFns ...func(*s3.Options)) (string, error) {\n\tvar captureBucketRegion deserializeBucketRegion\n\n\tclientOptionFns := make([]func(*s3.Options), len(optFns)+2)\n\tclientOptionFns[0] = func(options *s3.Options) {\n\t\toptions.APIOptions = append(options.APIOptions, captureBucketRegion.RegisterMiddleware)\n\t}\n\tclientOptionFns[1] = func(options *s3.Options) {\n\t\toptions.Credentials = nil\n\t}\n\tcopy(clientOptionFns[2:], optFns)\n\n\t_, err := client.HeadBucket(ctx, &s3.HeadBucketInput{\n\t\tBucket: aws.String(bucket),\n\t}, clientOptionFns...)\n\tif len(captureBucketRegion.BucketRegion) == 0 && err != nil {\n\t\tvar httpStatusErr interface {\n\t\t\tHTTPStatusCode() int\n\t\t}\n\t\tif !errors.As(err, &httpStatusErr) {\n\t\t\treturn \"\", err\n\t\t}\n\n\t\tif httpStatusErr.HTTPStatusCode() == http.StatusNotFound {\n\t\t\treturn \"\", &bucketNotFound{}\n\t\t}\n\n\t\treturn \"\", err\n\t}\n\n\treturn captureBucketRegion.BucketRegion, nil\n}\n\ntype deserializeBucketRegion struct {\n\tBucketRegion string\n}\n\nfunc (d *deserializeBucketRegion) RegisterMiddleware(stack *middleware.Stack) error {\n\treturn stack.Deserialize.Add(d, middleware.After)\n}\n\nfunc (d *deserializeBucketRegion) ID() string {\n\treturn \"DeserializeBucketRegion\"\n}\n\nfunc (d *deserializeBucketRegion) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\tresp, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type %T\", out.RawResponse)\n\t}\n\n\td.BucketRegion = resp.Header.Get(bucketRegionHeader)\n\n\treturn out, metadata, err\n}\n\n// BucketNotFound indicates the bucket was not found in the partition when calling GetBucketRegion.\ntype BucketNotFound interface {\n\terror\n\n\tisBucketNotFound()\n}\n\ntype bucketNotFound struct{}\n\nfunc (b *bucketNotFound) Error() string {\n\treturn \"bucket not found\"\n}\n\nfunc (b *bucketNotFound) isBucketNotFound() {}\n\nvar _ BucketNotFound = (*bucketNotFound)(nil)\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/buffered_read_seeker.go",
    "content": "package manager\n\nimport (\n\t\"io\"\n)\n\n// BufferedReadSeeker is buffered io.ReadSeeker\ntype BufferedReadSeeker struct {\n\tr                 io.ReadSeeker\n\tbuffer            []byte\n\treadIdx, writeIdx int\n}\n\n// NewBufferedReadSeeker returns a new BufferedReadSeeker\n// if len(b) == 0 then the buffer will be initialized to 64 KiB.\nfunc NewBufferedReadSeeker(r io.ReadSeeker, b []byte) *BufferedReadSeeker {\n\tif len(b) == 0 {\n\t\tb = make([]byte, 64*1024)\n\t}\n\treturn &BufferedReadSeeker{r: r, buffer: b}\n}\n\nfunc (b *BufferedReadSeeker) reset(r io.ReadSeeker) {\n\tb.r = r\n\tb.readIdx, b.writeIdx = 0, 0\n}\n\n// Read will read up len(p) bytes into p and will return\n// the number of bytes read and any error that occurred.\n// If the len(p) > the buffer size then a single read request\n// will be issued to the underlying io.ReadSeeker for len(p) bytes.\n// A Read request will at most perform a single Read to the underlying\n// io.ReadSeeker, and may return < len(p) if serviced from the buffer.\nfunc (b *BufferedReadSeeker) Read(p []byte) (n int, err error) {\n\tif len(p) == 0 {\n\t\treturn n, err\n\t}\n\n\tif b.readIdx == b.writeIdx {\n\t\tif len(p) >= len(b.buffer) {\n\t\t\tn, err = b.r.Read(p)\n\t\t\treturn n, err\n\t\t}\n\t\tb.readIdx, b.writeIdx = 0, 0\n\n\t\tn, err = b.r.Read(b.buffer)\n\t\tif n == 0 {\n\t\t\treturn n, err\n\t\t}\n\n\t\tb.writeIdx += n\n\t}\n\n\tn = copy(p, b.buffer[b.readIdx:b.writeIdx])\n\tb.readIdx += n\n\n\treturn n, err\n}\n\n// Seek will position then underlying io.ReadSeeker to the given offset\n// and will clear the buffer.\nfunc (b *BufferedReadSeeker) Seek(offset int64, whence int) (int64, error) {\n\tn, err := b.r.Seek(offset, whence)\n\n\tb.reset(b.r)\n\n\treturn n, err\n}\n\n// ReadAt will read up to len(p) bytes at the given file offset.\n// This will result in the buffer being cleared.\nfunc (b *BufferedReadSeeker) ReadAt(p []byte, off int64) (int, error) {\n\t_, err := b.Seek(off, io.SeekStart)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn b.Read(p)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/default_read_seeker_write_to.go",
    "content": "//go:build !windows\n// +build !windows\n\npackage manager\n\nfunc defaultUploadBufferProvider() ReadSeekerWriteToProvider {\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/default_read_seeker_write_to_windows.go",
    "content": "package manager\n\nfunc defaultUploadBufferProvider() ReadSeekerWriteToProvider {\n\treturn NewBufferedReadSeekerWriteToPool(1024 * 1024)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/default_writer_read_from.go",
    "content": "//go:build !windows\n// +build !windows\n\npackage manager\n\nfunc defaultDownloadBufferProvider() WriterReadFromProvider {\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/default_writer_read_from_windows.go",
    "content": "package manager\n\nfunc defaultDownloadBufferProvider() WriterReadFromProvider {\n\treturn NewPooledBufferedWriterReadFromProvider(1024 * 1024)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/doc.go",
    "content": "// Package manager provides utilities to upload and download objects from\n// S3 concurrently. Helpful for when working with large objects.\npackage manager\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/download.go",
    "content": "package manager\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/awsutil\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3\"\n\t\"github.com/aws/smithy-go/logging\"\n)\n\nconst userAgentKey = \"s3-transfer\"\n\n// DefaultDownloadPartSize is the default range of bytes to get at a time when\n// using Download().\nconst DefaultDownloadPartSize = 1024 * 1024 * 5\n\n// DefaultDownloadConcurrency is the default number of goroutines to spin up\n// when using Download().\nconst DefaultDownloadConcurrency = 5\n\n// DefaultPartBodyMaxRetries is the default number of retries to make when a part fails to download.\nconst DefaultPartBodyMaxRetries = 3\n\ntype errReadingBody struct {\n\terr error\n}\n\nfunc (e *errReadingBody) Error() string {\n\treturn fmt.Sprintf(\"failed to read part body: %v\", e.err)\n}\n\nfunc (e *errReadingBody) Unwrap() error {\n\treturn e.err\n}\n\n// The Downloader structure that calls Download(). It is safe to call Download()\n// on this structure for multiple objects and across concurrent goroutines.\n// Mutating the Downloader's properties is not safe to be done concurrently.\ntype Downloader struct {\n\t// The size (in bytes) to request from S3 for each part.\n\t// The minimum allowed part size is 5MB, and  if this value is set to zero,\n\t// the DefaultDownloadPartSize value will be used.\n\t//\n\t// PartSize is ignored if the Range input parameter is provided.\n\tPartSize int64\n\n\t// PartBodyMaxRetries is the number of retry attempts to make for failed part downloads.\n\tPartBodyMaxRetries int\n\n\t// Logger to send logging messages to\n\tLogger logging.Logger\n\n\t// Enable Logging of part download retry attempts\n\tLogInterruptedDownloads bool\n\n\t// The number of goroutines to spin up in parallel when sending parts.\n\t// If this is set to zero, the DefaultDownloadConcurrency value will be used.\n\t//\n\t// Concurrency of 1 will download the parts sequentially.\n\t//\n\t// Concurrency is ignored if the Range input parameter is provided.\n\tConcurrency int\n\n\t// An S3 client to use when performing downloads.\n\tS3 DownloadAPIClient\n\n\t// List of client options that will be passed down to individual API\n\t// operation requests made by the downloader.\n\tClientOptions []func(*s3.Options)\n\n\t// Defines the buffer strategy used when downloading a part.\n\t//\n\t// If a WriterReadFromProvider is given the Download manager\n\t// will pass the io.WriterAt of the Download request to the provider\n\t// and will use the returned WriterReadFrom from the provider as the\n\t// destination writer when copying from http response body.\n\tBufferProvider WriterReadFromProvider\n}\n\n// WithDownloaderClientOptions appends to the Downloader's API request options.\nfunc WithDownloaderClientOptions(opts ...func(*s3.Options)) func(*Downloader) {\n\treturn func(d *Downloader) {\n\t\td.ClientOptions = append(d.ClientOptions, opts...)\n\t}\n}\n\n// NewDownloader creates a new Downloader instance to downloads objects from\n// S3 in concurrent chunks. Pass in additional functional options  to customize\n// the downloader behavior. Requires a client.ConfigProvider in order to create\n// a S3 service client. The session.Session satisfies the client.ConfigProvider\n// interface.\n//\n// Example:\n//\n//\t// Load AWS Config\n//\tcfg, err := config.LoadDefaultConfig(context.TODO())\n//\tif err != nil {\n//\t\tpanic(err)\n//\t}\n//\n//\t// Create an S3 client using the loaded configuration\n//\ts3.NewFromConfig(cfg)\n//\n//\t// Create a downloader passing it the S3 client\n//\tdownloader := manager.NewDownloader(s3.NewFromConfig(cfg))\n//\n//\t// Create a downloader with the client and custom downloader options\n//\tdownloader := manager.NewDownloader(client, func(d *manager.Downloader) {\n//\t\td.PartSize = 64 * 1024 * 1024 // 64MB per part\n//\t})\nfunc NewDownloader(c DownloadAPIClient, options ...func(*Downloader)) *Downloader {\n\td := &Downloader{\n\t\tS3:                 c,\n\t\tPartSize:           DefaultDownloadPartSize,\n\t\tPartBodyMaxRetries: DefaultPartBodyMaxRetries,\n\t\tConcurrency:        DefaultDownloadConcurrency,\n\t\tBufferProvider:     defaultDownloadBufferProvider(),\n\t}\n\tfor _, option := range options {\n\t\toption(d)\n\t}\n\n\treturn d\n}\n\n// Download downloads an object in S3 and writes the payload into w\n// using concurrent GET requests. The n int64 returned is the size of the object downloaded\n// in bytes.\n//\n// DownloadWithContext is the same as Download with the additional support for\n// Context input parameters. The Context must not be nil. A nil Context will\n// cause a panic. Use the Context to add deadlining, timeouts, etc. The\n// DownloadWithContext may create sub-contexts for individual underlying\n// requests.\n//\n// Additional functional options can be provided to configure the individual\n// download. These options are copies of the Downloader instance Download is\n// called from. Modifying the options will not impact the original Downloader\n// instance. Use the WithDownloaderClientOptions helper function to pass in request\n// options that will be applied to all API operations made with this downloader.\n//\n// The w io.WriterAt can be satisfied by an os.File to do multipart concurrent\n// downloads, or in memory []byte wrapper using aws.WriteAtBuffer. In case you download\n// files into memory do not forget to pre-allocate memory to avoid additional allocations\n// and GC runs.\n//\n// Example:\n//\n//\t// pre-allocate in memory buffer, where headObject type is *s3.HeadObjectOutput\n//\tbuf := make([]byte, int(headObject.ContentLength))\n//\t// wrap with aws.WriteAtBuffer\n//\tw := manager.NewWriteAtBuffer(buf)\n//\t// download file into the memory\n//\tnumBytesDownloaded, err := downloader.Download(ctx, w, &s3.GetObjectInput{\n//\t\tBucket: aws.String(bucket),\n//\t\tKey:    aws.String(item),\n//\t})\n//\n// Specifying a Downloader.Concurrency of 1 will cause the Downloader to\n// download the parts from S3 sequentially.\n//\n// It is safe to call this method concurrently across goroutines.\n//\n// If the GetObjectInput's Range value is provided that will cause the downloader\n// to perform a single GetObjectInput request for that object's range. This will\n// caused the part size, and concurrency configurations to be ignored.\nfunc (d Downloader) Download(ctx context.Context, w io.WriterAt, input *s3.GetObjectInput, options ...func(*Downloader)) (n int64, err error) {\n\tif err := validateSupportedARNType(aws.ToString(input.Bucket)); err != nil {\n\t\treturn 0, err\n\t}\n\n\timpl := downloader{w: w, in: input, cfg: d, ctx: ctx}\n\n\t// Copy ClientOptions\n\tclientOptions := make([]func(*s3.Options), 0, len(impl.cfg.ClientOptions)+1)\n\tclientOptions = append(clientOptions, func(o *s3.Options) {\n\t\to.APIOptions = append(o.APIOptions,\n\t\t\tmiddleware.AddSDKAgentKey(middleware.FeatureMetadata, userAgentKey),\n\t\t\taddFeatureUserAgent, // yes, there are two of these\n\t\t)\n\t})\n\tclientOptions = append(clientOptions, impl.cfg.ClientOptions...)\n\timpl.cfg.ClientOptions = clientOptions\n\n\tfor _, option := range options {\n\t\toption(&impl.cfg)\n\t}\n\n\t// Ensures we don't need nil checks later on\n\timpl.cfg.Logger = logging.WithContext(ctx, impl.cfg.Logger)\n\n\timpl.partBodyMaxRetries = d.PartBodyMaxRetries\n\n\timpl.totalBytes = -1\n\tif impl.cfg.Concurrency == 0 {\n\t\timpl.cfg.Concurrency = DefaultDownloadConcurrency\n\t}\n\n\tif impl.cfg.PartSize == 0 {\n\t\timpl.cfg.PartSize = DefaultDownloadPartSize\n\t}\n\n\treturn impl.download()\n}\n\n// downloader is the implementation structure used internally by Downloader.\ntype downloader struct {\n\tctx context.Context\n\tcfg Downloader\n\n\tin *s3.GetObjectInput\n\tw  io.WriterAt\n\n\twg   sync.WaitGroup\n\tm    sync.Mutex\n\tonce sync.Once\n\n\tpos                int64\n\ttotalBytes         int64\n\twritten            int64\n\terr                error\n\tetag               string\n\tpartBodyMaxRetries int\n}\n\n// download performs the implementation of the object download across ranged\n// GETs.\nfunc (d *downloader) download() (n int64, err error) {\n\t// If range is specified fall back to single download of that range\n\t// this enables the functionality of ranged gets with the downloader but\n\t// at the cost of no multipart downloads.\n\tif rng := aws.ToString(d.in.Range); len(rng) > 0 {\n\t\td.downloadRange(rng)\n\t\treturn d.written, d.err\n\t}\n\n\t// Spin off first worker to check additional header information\n\td.getChunk()\n\n\tif total := d.getTotalBytes(); total >= 0 {\n\t\t// Spin up workers\n\t\tch := make(chan dlchunk, d.cfg.Concurrency)\n\n\t\tfor i := 0; i < d.cfg.Concurrency; i++ {\n\t\t\td.wg.Add(1)\n\t\t\tgo d.downloadPart(ch)\n\t\t}\n\n\t\t// Assign work\n\t\tfor d.getErr() == nil {\n\t\t\tif d.pos >= total {\n\t\t\t\tbreak // We're finished queuing chunks\n\t\t\t}\n\n\t\t\t// Queue the next range of bytes to read.\n\t\t\tch <- dlchunk{w: d.w, start: d.pos, size: d.cfg.PartSize}\n\t\t\td.pos += d.cfg.PartSize\n\t\t}\n\n\t\t// Wait for completion\n\t\tclose(ch)\n\t\td.wg.Wait()\n\t} else {\n\t\t// Checking if we read anything new\n\t\tfor d.err == nil {\n\t\t\td.getChunk()\n\t\t}\n\n\t\t// We expect a 416 error letting us know we are done downloading the\n\t\t// total bytes. Since we do not know the content's length, this will\n\t\t// keep grabbing chunks of data until the range of bytes specified in\n\t\t// the request is out of range of the content. Once, this happens, a\n\t\t// 416 should occur.\n\t\tvar responseError interface {\n\t\t\tHTTPStatusCode() int\n\t\t}\n\t\tif errors.As(d.err, &responseError) {\n\t\t\tif responseError.HTTPStatusCode() == http.StatusRequestedRangeNotSatisfiable {\n\t\t\t\td.err = nil\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return error\n\treturn d.written, d.err\n}\n\n// downloadPart is an individual goroutine worker reading from the ch channel\n// and performing a GetObject request on the data with a given byte range.\n//\n// If this is the first worker, this operation also resolves the total number\n// of bytes to be read so that the worker manager knows when it is finished.\nfunc (d *downloader) downloadPart(ch chan dlchunk) {\n\tdefer d.wg.Done()\n\tfor {\n\t\tchunk, ok := <-ch\n\t\tif !ok {\n\t\t\tbreak\n\t\t}\n\t\tif d.getErr() != nil {\n\t\t\t// Drain the channel if there is an error, to prevent deadlocking\n\t\t\t// of download producer.\n\t\t\tcontinue\n\t\t}\n\n\t\tif err := d.downloadChunk(chunk); err != nil {\n\t\t\td.setErr(err)\n\t\t}\n\t}\n}\n\n// getChunk grabs a chunk of data from the body.\n// Not thread safe. Should only used when grabbing data on a single thread.\nfunc (d *downloader) getChunk() {\n\tif d.getErr() != nil {\n\t\treturn\n\t}\n\n\tchunk := dlchunk{w: d.w, start: d.pos, size: d.cfg.PartSize}\n\td.pos += d.cfg.PartSize\n\n\tif err := d.downloadChunk(chunk); err != nil {\n\t\td.setErr(err)\n\t}\n}\n\n// downloadRange downloads an Object given the passed in Byte-Range value.\n// The chunk used down download the range will be configured for that range.\nfunc (d *downloader) downloadRange(rng string) {\n\tif d.getErr() != nil {\n\t\treturn\n\t}\n\n\tchunk := dlchunk{w: d.w, start: d.pos}\n\t// Ranges specified will short circuit the multipart download\n\tchunk.withRange = rng\n\n\tif err := d.downloadChunk(chunk); err != nil {\n\t\td.setErr(err)\n\t}\n\n\t// Update the position based on the amount of data received.\n\td.pos = d.written\n}\n\n// downloadChunk downloads the chunk from s3\nfunc (d *downloader) downloadChunk(chunk dlchunk) error {\n\tvar params s3.GetObjectInput\n\tawsutil.Copy(&params, d.in)\n\n\t// Get the next byte range of data\n\tparams.Range = aws.String(chunk.ByteRange())\n\tif params.VersionId == nil && d.etag != \"\" {\n\t\tparams.IfMatch = aws.String(d.etag)\n\t}\n\n\tvar n int64\n\tvar err error\n\tfor retry := 0; retry <= d.partBodyMaxRetries; retry++ {\n\t\tn, err = d.tryDownloadChunk(&params, &chunk)\n\t\tif err == nil {\n\t\t\tbreak\n\t\t}\n\t\t// Check if the returned error is an errReadingBody.\n\t\t// If err is errReadingBody this indicates that an error\n\t\t// occurred while copying the http response body.\n\t\t// If this occurs we unwrap the err to set the underlying error\n\t\t// and attempt any remaining retries.\n\t\tif bodyErr, ok := err.(*errReadingBody); ok {\n\t\t\terr = bodyErr.Unwrap()\n\t\t} else {\n\t\t\treturn err\n\t\t}\n\n\t\tchunk.cur = 0\n\n\t\td.cfg.Logger.Logf(logging.Debug,\n\t\t\t\"object part body download interrupted %s, err, %v, retrying attempt %d\",\n\t\t\taws.ToString(params.Key), err, retry)\n\t}\n\n\td.incrWritten(n)\n\n\treturn err\n}\n\nfunc (d *downloader) tryDownloadChunk(params *s3.GetObjectInput, w io.Writer) (int64, error) {\n\tcleanup := func() {}\n\tif d.cfg.BufferProvider != nil {\n\t\tw, cleanup = d.cfg.BufferProvider.GetReadFrom(w)\n\t}\n\tdefer cleanup()\n\n\tresp, err := d.cfg.S3.GetObject(d.ctx, params, d.cfg.ClientOptions...)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\td.setTotalBytes(resp) // Set total if not yet set.\n\td.once.Do(func() {\n\t\td.etag = aws.ToString(resp.ETag)\n\t})\n\n\tvar src io.Reader = resp.Body\n\tif d.cfg.BufferProvider != nil {\n\t\tsrc = &suppressWriterAt{suppressed: src}\n\t}\n\tn, err := io.Copy(w, src)\n\tresp.Body.Close()\n\tif err != nil {\n\t\treturn n, &errReadingBody{err: err}\n\t}\n\n\treturn n, nil\n}\n\n// getTotalBytes is a thread-safe getter for retrieving the total byte status.\nfunc (d *downloader) getTotalBytes() int64 {\n\td.m.Lock()\n\tdefer d.m.Unlock()\n\n\treturn d.totalBytes\n}\n\n// setTotalBytes is a thread-safe setter for setting the total byte status.\n// Will extract the object's total bytes from the Content-Range if the file\n// will be chunked, or Content-Length. Content-Length is used when the response\n// does not include a Content-Range. Meaning the object was not chunked. This\n// occurs when the full file fits within the PartSize directive.\nfunc (d *downloader) setTotalBytes(resp *s3.GetObjectOutput) {\n\td.m.Lock()\n\tdefer d.m.Unlock()\n\n\tif d.totalBytes >= 0 {\n\t\treturn\n\t}\n\n\tif resp.ContentRange == nil {\n\t\t// ContentRange is nil when the full file contents is provided, and\n\t\t// is not chunked. Use ContentLength instead.\n\t\tif aws.ToInt64(resp.ContentLength) > 0 {\n\t\t\td.totalBytes = aws.ToInt64(resp.ContentLength)\n\t\t\treturn\n\t\t}\n\t} else {\n\t\tparts := strings.Split(*resp.ContentRange, \"/\")\n\n\t\ttotal := int64(-1)\n\t\tvar err error\n\t\t// Checking for whether or not a numbered total exists\n\t\t// If one does not exist, we will assume the total to be -1, undefined,\n\t\t// and sequentially download each chunk until hitting a 416 error\n\t\ttotalStr := parts[len(parts)-1]\n\t\tif totalStr != \"*\" {\n\t\t\ttotal, err = strconv.ParseInt(totalStr, 10, 64)\n\t\t\tif err != nil {\n\t\t\t\td.err = err\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\td.totalBytes = total\n\t}\n}\n\nfunc (d *downloader) incrWritten(n int64) {\n\td.m.Lock()\n\tdefer d.m.Unlock()\n\n\td.written += n\n}\n\n// getErr is a thread-safe getter for the error object\nfunc (d *downloader) getErr() error {\n\td.m.Lock()\n\tdefer d.m.Unlock()\n\n\treturn d.err\n}\n\n// setErr is a thread-safe setter for the error object\nfunc (d *downloader) setErr(e error) {\n\td.m.Lock()\n\tdefer d.m.Unlock()\n\n\td.err = e\n}\n\n// dlchunk represents a single chunk of data to write by the worker routine.\n// This structure also implements an io.SectionReader style interface for\n// io.WriterAt, effectively making it an io.SectionWriter (which does not\n// exist).\ntype dlchunk struct {\n\tw     io.WriterAt\n\tstart int64\n\tsize  int64\n\tcur   int64\n\n\t// specifies the byte range the chunk should be downloaded with.\n\twithRange string\n}\n\n// Write wraps io.WriterAt for the dlchunk, writing from the dlchunk's start\n// position to its end (or EOF).\n//\n// If a range is specified on the dlchunk the size will be ignored when writing.\n// as the total size may not of be known ahead of time.\nfunc (c *dlchunk) Write(p []byte) (n int, err error) {\n\tif c.cur >= c.size && len(c.withRange) == 0 {\n\t\treturn 0, io.EOF\n\t}\n\n\tn, err = c.w.WriteAt(p, c.start+c.cur)\n\tc.cur += int64(n)\n\n\treturn\n}\n\n// ByteRange returns a HTTP Byte-Range header value that should be used by the\n// client to request the chunk's range.\nfunc (c *dlchunk) ByteRange() string {\n\tif len(c.withRange) != 0 {\n\t\treturn c.withRange\n\t}\n\n\treturn fmt.Sprintf(\"bytes=%d-%d\", c.start, c.start+c.size-1)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/go_module_metadata.go",
    "content": "// Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT.\n\npackage manager\n\n// goModuleVersion is the tagged release for this module\nconst goModuleVersion = \"1.17.75\"\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/pool.go",
    "content": "package manager\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"sync\"\n)\n\ntype byteSlicePool interface {\n\tGet(context.Context) (*[]byte, error)\n\tPut(*[]byte)\n\tModifyCapacity(int)\n\tSliceSize() int64\n\tClose()\n}\n\ntype maxSlicePool struct {\n\t// allocator is defined as a function pointer to allow\n\t// for test cases to instrument custom tracers when allocations\n\t// occur.\n\tallocator sliceAllocator\n\n\tslices         chan *[]byte\n\tallocations    chan struct{}\n\tcapacityChange chan struct{}\n\n\tmax       int\n\tsliceSize int64\n\n\tmtx sync.RWMutex\n}\n\nfunc newMaxSlicePool(sliceSize int64) *maxSlicePool {\n\tp := &maxSlicePool{sliceSize: sliceSize}\n\tp.allocator = p.newSlice\n\n\treturn p\n}\n\nvar errZeroCapacity = fmt.Errorf(\"get called on zero capacity pool\")\n\nfunc (p *maxSlicePool) Get(ctx context.Context) (*[]byte, error) {\n\t// check if context is canceled before attempting to get a slice\n\t// this ensures priority is given to the cancel case first\n\tselect {\n\tcase <-ctx.Done():\n\t\treturn nil, ctx.Err()\n\tdefault:\n\t}\n\n\tp.mtx.RLock()\n\n\tfor {\n\t\tselect {\n\t\tcase bs, ok := <-p.slices:\n\t\t\tp.mtx.RUnlock()\n\t\t\tif !ok {\n\t\t\t\t// attempt to get on a zero capacity pool\n\t\t\t\treturn nil, errZeroCapacity\n\t\t\t}\n\t\t\treturn bs, nil\n\t\tcase <-ctx.Done():\n\t\t\tp.mtx.RUnlock()\n\t\t\treturn nil, ctx.Err()\n\t\tdefault:\n\t\t\t// pass\n\t\t}\n\n\t\tselect {\n\t\tcase _, ok := <-p.allocations:\n\t\t\tp.mtx.RUnlock()\n\t\t\tif !ok {\n\t\t\t\t// attempt to get on a zero capacity pool\n\t\t\t\treturn nil, errZeroCapacity\n\t\t\t}\n\t\t\treturn p.allocator(), nil\n\t\tcase <-ctx.Done():\n\t\t\tp.mtx.RUnlock()\n\t\t\treturn nil, ctx.Err()\n\t\tdefault:\n\t\t\t// In the event that there are no slices or allocations available\n\t\t\t// This prevents some deadlock situations that can occur around sync.RWMutex\n\t\t\t// When a lock request occurs on ModifyCapacity, no new readers are allowed to acquire a read lock.\n\t\t\t// By releasing the read lock here and waiting for a notification, we prevent a deadlock situation where\n\t\t\t// Get could hold the read lock indefinitely waiting for capacity, ModifyCapacity is waiting for a write lock,\n\t\t\t// and a Put is blocked trying to get a read-lock which is blocked by ModifyCapacity.\n\n\t\t\t// Short-circuit if the pool capacity is zero.\n\t\t\tif p.max == 0 {\n\t\t\t\tp.mtx.RUnlock()\n\t\t\t\treturn nil, errZeroCapacity\n\t\t\t}\n\n\t\t\t// Since we will be releasing the read-lock we need to take the reference to the channel.\n\t\t\t// Since channels are references we will still get notified if slices are added, or if\n\t\t\t// the channel is closed due to a capacity modification. This specifically avoids a data race condition\n\t\t\t// where ModifyCapacity both closes a channel and initializes a new one while we don't have a read-lock.\n\t\t\tc := p.capacityChange\n\n\t\t\tp.mtx.RUnlock()\n\n\t\t\tselect {\n\t\t\tcase _ = <-c:\n\t\t\t\tp.mtx.RLock()\n\t\t\tcase <-ctx.Done():\n\t\t\t\treturn nil, ctx.Err()\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (p *maxSlicePool) Put(bs *[]byte) {\n\tp.mtx.RLock()\n\tdefer p.mtx.RUnlock()\n\n\tif p.max == 0 {\n\t\treturn\n\t}\n\n\tselect {\n\tcase p.slices <- bs:\n\t\tp.notifyCapacity()\n\tdefault:\n\t\t// If the new channel when attempting to add the slice then we drop the slice.\n\t\t// The logic here is to prevent a deadlock situation if channel is already at max capacity.\n\t\t// Allows us to reap allocations that are returned and are no longer needed.\n\t}\n}\n\nfunc (p *maxSlicePool) ModifyCapacity(delta int) {\n\tif delta == 0 {\n\t\treturn\n\t}\n\n\tp.mtx.Lock()\n\tdefer p.mtx.Unlock()\n\n\tp.max += delta\n\n\tif p.max == 0 {\n\t\tp.empty()\n\t\treturn\n\t}\n\n\tif p.capacityChange != nil {\n\t\tclose(p.capacityChange)\n\t}\n\tp.capacityChange = make(chan struct{}, p.max)\n\n\torigAllocations := p.allocations\n\tp.allocations = make(chan struct{}, p.max)\n\n\tnewAllocs := len(origAllocations) + delta\n\tfor i := 0; i < newAllocs; i++ {\n\t\tp.allocations <- struct{}{}\n\t}\n\n\tif origAllocations != nil {\n\t\tclose(origAllocations)\n\t}\n\n\torigSlices := p.slices\n\tp.slices = make(chan *[]byte, p.max)\n\tif origSlices == nil {\n\t\treturn\n\t}\n\n\tclose(origSlices)\n\tfor bs := range origSlices {\n\t\tselect {\n\t\tcase p.slices <- bs:\n\t\tdefault:\n\t\t\t// If the new channel blocks while adding slices from the old channel\n\t\t\t// then we drop the slice. The logic here is to prevent a deadlock situation\n\t\t\t// if the new channel has a smaller capacity then the old.\n\t\t}\n\t}\n}\n\nfunc (p *maxSlicePool) notifyCapacity() {\n\tselect {\n\tcase p.capacityChange <- struct{}{}:\n\tdefault:\n\t\t// This *shouldn't* happen as the channel is both buffered to the max pool capacity size and is resized\n\t\t// on capacity modifications. This is just a safety to ensure that a blocking situation can't occur.\n\t}\n}\n\nfunc (p *maxSlicePool) SliceSize() int64 {\n\treturn p.sliceSize\n}\n\nfunc (p *maxSlicePool) Close() {\n\tp.mtx.Lock()\n\tdefer p.mtx.Unlock()\n\tp.empty()\n}\n\nfunc (p *maxSlicePool) empty() {\n\tp.max = 0\n\n\tif p.capacityChange != nil {\n\t\tclose(p.capacityChange)\n\t\tp.capacityChange = nil\n\t}\n\n\tif p.allocations != nil {\n\t\tclose(p.allocations)\n\t\tfor range p.allocations {\n\t\t\t// drain channel\n\t\t}\n\t\tp.allocations = nil\n\t}\n\n\tif p.slices != nil {\n\t\tclose(p.slices)\n\t\tfor range p.slices {\n\t\t\t// drain channel\n\t\t}\n\t\tp.slices = nil\n\t}\n}\n\nfunc (p *maxSlicePool) newSlice() *[]byte {\n\tbs := make([]byte, p.sliceSize)\n\treturn &bs\n}\n\ntype returnCapacityPoolCloser struct {\n\tbyteSlicePool\n\treturnCapacity int\n}\n\nfunc (n *returnCapacityPoolCloser) ModifyCapacity(delta int) {\n\tif delta > 0 {\n\t\tn.returnCapacity = -1 * delta\n\t}\n\tn.byteSlicePool.ModifyCapacity(delta)\n}\n\nfunc (n *returnCapacityPoolCloser) Close() {\n\tif n.returnCapacity < 0 {\n\t\tn.byteSlicePool.ModifyCapacity(n.returnCapacity)\n\t}\n}\n\ntype sliceAllocator func() *[]byte\n\nvar newByteSlicePool = func(sliceSize int64) byteSlicePool {\n\treturn newMaxSlicePool(sliceSize)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/read_seeker_write_to.go",
    "content": "package manager\n\nimport (\n\t\"io\"\n\t\"sync\"\n)\n\n// ReadSeekerWriteTo defines an interface implementing io.WriteTo and io.ReadSeeker\ntype ReadSeekerWriteTo interface {\n\tio.ReadSeeker\n\tio.WriterTo\n}\n\n// BufferedReadSeekerWriteTo wraps a BufferedReadSeeker with an io.WriteAt\n// implementation.\ntype BufferedReadSeekerWriteTo struct {\n\t*BufferedReadSeeker\n}\n\n// WriteTo writes to the given io.Writer from BufferedReadSeeker until there's no more data to write or\n// an error occurs. Returns the number of bytes written and any error encountered during the write.\nfunc (b *BufferedReadSeekerWriteTo) WriteTo(writer io.Writer) (int64, error) {\n\treturn io.Copy(writer, b.BufferedReadSeeker)\n}\n\n// ReadSeekerWriteToProvider provides an implementation of io.WriteTo for an io.ReadSeeker\ntype ReadSeekerWriteToProvider interface {\n\tGetWriteTo(seeker io.ReadSeeker) (r ReadSeekerWriteTo, cleanup func())\n}\n\n// BufferedReadSeekerWriteToPool uses a sync.Pool to create and reuse\n// []byte slices for buffering parts in memory\ntype BufferedReadSeekerWriteToPool struct {\n\tpool sync.Pool\n}\n\n// NewBufferedReadSeekerWriteToPool will return a new BufferedReadSeekerWriteToPool that will create\n// a pool of reusable buffers . If size is less then < 64 KiB then the buffer\n// will default to 64 KiB. Reason: io.Copy from writers or readers that don't support io.WriteTo or io.ReadFrom\n// respectively will default to copying 32 KiB.\nfunc NewBufferedReadSeekerWriteToPool(size int) *BufferedReadSeekerWriteToPool {\n\tif size < 65536 {\n\t\tsize = 65536\n\t}\n\n\treturn &BufferedReadSeekerWriteToPool{\n\t\tpool: sync.Pool{New: func() interface{} {\n\t\t\treturn make([]byte, size)\n\t\t}},\n\t}\n}\n\n// GetWriteTo will wrap the provided io.ReadSeeker with a BufferedReadSeekerWriteTo.\n// The provided cleanup must be called after operations have been completed on the\n// returned io.ReadSeekerWriteTo in order to signal the return of resources to the pool.\nfunc (p *BufferedReadSeekerWriteToPool) GetWriteTo(seeker io.ReadSeeker) (r ReadSeekerWriteTo, cleanup func()) {\n\tbuffer := p.pool.Get().([]byte)\n\n\tr = &BufferedReadSeekerWriteTo{BufferedReadSeeker: NewBufferedReadSeeker(seeker, buffer)}\n\tcleanup = func() {\n\t\tp.pool.Put(buffer)\n\t}\n\n\treturn r, cleanup\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/types.go",
    "content": "package manager\n\nimport (\n\t\"io\"\n\t\"sync\"\n)\n\n// ReadSeekCloser wraps a io.Reader returning a ReaderSeekerCloser. Allows the\n// SDK to accept an io.Reader that is not also an io.Seeker for unsigned\n// streaming payload API operations.\n//\n// A readSeekCloser wrapping an nonseekable io.Reader used in an API operation's\n// input will prevent that operation being retried in the case of\n// network errors, and cause operation requests to fail if yhe operation\n// requires payload signing.\n//\n// Note: If using with S3 PutObject to stream an object upload. The SDK's S3\n// Upload Manager(manager.Uploader) provides support for streaming\n// with the ability to retry network errors.\nfunc ReadSeekCloser(r io.Reader) *ReaderSeekerCloser {\n\treturn &ReaderSeekerCloser{r}\n}\n\n// ReaderSeekerCloser represents a reader that can also delegate io.Seeker and\n// io.Closer interfaces to the underlying object if they are available.\ntype ReaderSeekerCloser struct {\n\tr io.Reader\n}\n\n// seekerLen attempts to get the number of bytes remaining at the seeker's\n// current position.  Returns the number of bytes remaining or error.\nfunc seekerLen(s io.Seeker) (int64, error) {\n\t// Determine if the seeker is actually seekable. ReaderSeekerCloser\n\t// hides the fact that a io.Readers might not actually be seekable.\n\tswitch v := s.(type) {\n\tcase *ReaderSeekerCloser:\n\t\treturn v.GetLen()\n\t}\n\n\treturn computeSeekerLength(s)\n}\n\n// GetLen returns the length of the bytes remaining in the underlying reader.\n// Checks first for Len(), then io.Seeker to determine the size of the\n// underlying reader.\n//\n// Will return -1 if the length cannot be determined.\nfunc (r *ReaderSeekerCloser) GetLen() (int64, error) {\n\tif l, ok := r.HasLen(); ok {\n\t\treturn int64(l), nil\n\t}\n\n\tif s, ok := r.r.(io.Seeker); ok {\n\t\treturn computeSeekerLength(s)\n\t}\n\n\treturn -1, nil\n}\n\nfunc computeSeekerLength(s io.Seeker) (int64, error) {\n\tcurOffset, err := s.Seek(0, io.SeekCurrent)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tendOffset, err := s.Seek(0, io.SeekEnd)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t_, err = s.Seek(curOffset, io.SeekStart)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn endOffset - curOffset, nil\n}\n\n// HasLen returns the length of the underlying reader if the value implements\n// the Len() int method.\nfunc (r *ReaderSeekerCloser) HasLen() (int, bool) {\n\ttype lenner interface {\n\t\tLen() int\n\t}\n\n\tif lr, ok := r.r.(lenner); ok {\n\t\treturn lr.Len(), true\n\t}\n\n\treturn 0, false\n}\n\n// Read reads from the reader up to size of p. The number of bytes read, and\n// error if it occurred will be returned.\n//\n// If the reader is not an io.Reader zero bytes read, and nil error will be\n// returned.\n//\n// Performs the same functionality as io.Reader Read\nfunc (r *ReaderSeekerCloser) Read(p []byte) (int, error) {\n\tswitch t := r.r.(type) {\n\tcase io.Reader:\n\t\treturn t.Read(p)\n\t}\n\treturn 0, nil\n}\n\n// Seek sets the offset for the next Read to offset, interpreted according to\n// whence: 0 means relative to the origin of the file, 1 means relative to the\n// current offset, and 2 means relative to the end. Seek returns the new offset\n// and an error, if any.\n//\n// If the ReaderSeekerCloser is not an io.Seeker nothing will be done.\nfunc (r *ReaderSeekerCloser) Seek(offset int64, whence int) (int64, error) {\n\tswitch t := r.r.(type) {\n\tcase io.Seeker:\n\t\treturn t.Seek(offset, whence)\n\t}\n\treturn int64(0), nil\n}\n\n// IsSeeker returns if the underlying reader is also a seeker.\nfunc (r *ReaderSeekerCloser) IsSeeker() bool {\n\t_, ok := r.r.(io.Seeker)\n\treturn ok\n}\n\n// Close closes the ReaderSeekerCloser.\n//\n// If the ReaderSeekerCloser is not an io.Closer nothing will be done.\nfunc (r *ReaderSeekerCloser) Close() error {\n\tswitch t := r.r.(type) {\n\tcase io.Closer:\n\t\treturn t.Close()\n\t}\n\treturn nil\n}\n\n// A WriteAtBuffer provides a in memory buffer supporting the io.WriterAt interface\n// Can be used with the manager.Downloader to download content to a buffer\n// in memory. Safe to use concurrently.\ntype WriteAtBuffer struct {\n\tbuf []byte\n\tm   sync.Mutex\n\n\t// GrowthCoeff defines the growth rate of the internal buffer. By\n\t// default, the growth rate is 1, where expanding the internal\n\t// buffer will allocate only enough capacity to fit the new expected\n\t// length.\n\tGrowthCoeff float64\n}\n\n// NewWriteAtBuffer creates a WriteAtBuffer with an internal buffer\n// provided by buf.\nfunc NewWriteAtBuffer(buf []byte) *WriteAtBuffer {\n\treturn &WriteAtBuffer{buf: buf}\n}\n\n// WriteAt writes a slice of bytes to a buffer starting at the position provided\n// The number of bytes written will be returned, or error. Can overwrite previous\n// written slices if the write ats overlap.\nfunc (b *WriteAtBuffer) WriteAt(p []byte, pos int64) (n int, err error) {\n\tpLen := len(p)\n\texpLen := pos + int64(pLen)\n\tb.m.Lock()\n\tdefer b.m.Unlock()\n\tif int64(len(b.buf)) < expLen {\n\t\tif int64(cap(b.buf)) < expLen {\n\t\t\tif b.GrowthCoeff < 1 {\n\t\t\t\tb.GrowthCoeff = 1\n\t\t\t}\n\t\t\tnewBuf := make([]byte, expLen, int64(b.GrowthCoeff*float64(expLen)))\n\t\t\tcopy(newBuf, b.buf)\n\t\t\tb.buf = newBuf\n\t\t}\n\t\tb.buf = b.buf[:expLen]\n\t}\n\tcopy(b.buf[pos:], p)\n\treturn pLen, nil\n}\n\n// Bytes returns a slice of bytes written to the buffer.\nfunc (b *WriteAtBuffer) Bytes() []byte {\n\tb.m.Lock()\n\tdefer b.m.Unlock()\n\treturn b.buf\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/upload.go",
    "content": "package manager\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"sort\"\n\t\"sync\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/awsutil\"\n\tinternalcontext \"github.com/aws/aws-sdk-go-v2/internal/context\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\tsmithymiddleware \"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// MaxUploadParts is the maximum allowed number of parts in a multi-part upload\n// on Amazon S3.\nconst MaxUploadParts int32 = 10000\n\n// MinUploadPartSize is the minimum allowed part size when uploading a part to\n// Amazon S3.\nconst MinUploadPartSize int64 = 1024 * 1024 * 5\n\n// DefaultUploadPartSize is the default part size to buffer chunks of a\n// payload into.\nconst DefaultUploadPartSize = MinUploadPartSize\n\n// DefaultUploadConcurrency is the default number of goroutines to spin up when\n// using Upload().\nconst DefaultUploadConcurrency = 5\n\n// A MultiUploadFailure wraps a failed S3 multipart upload. An error returned\n// will satisfy this interface when a multi part upload failed to upload all\n// chucks to S3. In the case of a failure the UploadID is needed to operate on\n// the chunks, if any, which were uploaded.\n//\n// Example:\n//\n//\tu := manager.NewUploader(client)\n//\toutput, err := u.upload(context.Background(), input)\n//\tif err != nil {\n//\t\tvar multierr manager.MultiUploadFailure\n//\t\tif errors.As(err, &multierr) {\n//\t\t\tfmt.Printf(\"upload failure UploadID=%s, %s\\n\", multierr.UploadID(), multierr.Error())\n//\t\t} else {\n//\t\t\tfmt.Printf(\"upload failure, %s\\n\", err.Error())\n//\t\t}\n//\t}\ntype MultiUploadFailure interface {\n\terror\n\n\t// UploadID returns the upload id for the S3 multipart upload that failed.\n\tUploadID() string\n}\n\n// A multiUploadError wraps the upload ID of a failed s3 multipart upload.\n// Composed of BaseError for code, message, and original error\n//\n// Should be used for an error that occurred failing a S3 multipart upload,\n// and a upload ID is available. If an uploadID is not available a more relevant\ntype multiUploadError struct {\n\terr error\n\n\t// ID for multipart upload which failed.\n\tuploadID string\n}\n\n// batchItemError returns the string representation of the error.\n//\n// # See apierr.BaseError ErrorWithExtra for output format\n//\n// Satisfies the error interface.\nfunc (m *multiUploadError) Error() string {\n\tvar extra string\n\tif m.err != nil {\n\t\textra = fmt.Sprintf(\", cause: %s\", m.err.Error())\n\t}\n\treturn fmt.Sprintf(\"upload multipart failed, upload id: %s%s\", m.uploadID, extra)\n}\n\n// Unwrap returns the underlying error that cause the upload failure\nfunc (m *multiUploadError) Unwrap() error {\n\treturn m.err\n}\n\n// UploadID returns the id of the S3 upload which failed.\nfunc (m *multiUploadError) UploadID() string {\n\treturn m.uploadID\n}\n\n// UploadOutput represents a response from the Upload() call.\ntype UploadOutput struct {\n\t// The URL where the object was uploaded to.\n\tLocation string\n\n\t// The ID for a multipart upload to S3. In the case of an error the error\n\t// can be cast to the MultiUploadFailure interface to extract the upload ID.\n\t// Will be empty string if multipart upload was not used, and the object\n\t// was uploaded as a single PutObject call.\n\tUploadID string\n\n\t// The list of parts that were uploaded and their checksums. Will be empty\n\t// if multipart upload was not used, and the object was uploaded as a\n\t// single PutObject call.\n\tCompletedParts []types.CompletedPart\n\n\t// Indicates whether the uploaded object uses an S3 Bucket Key for server-side\n\t// encryption with Amazon Web Services KMS (SSE-KMS).\n\tBucketKeyEnabled bool\n\n\t// The base64-encoded, 32-bit CRC32 checksum of the object.\n\tChecksumCRC32 *string\n\n\t// The base64-encoded, 32-bit CRC32C checksum of the object.\n\tChecksumCRC32C *string\n\n\t// The base64-encoded, 64-bit CRC64NVME checksum of the object.\n\tChecksumCRC64NVME *string\n\n\t// The base64-encoded, 160-bit SHA-1 digest of the object.\n\tChecksumSHA1 *string\n\n\t// The base64-encoded, 256-bit SHA-256 digest of the object.\n\tChecksumSHA256 *string\n\n\t// Entity tag for the uploaded object.\n\tETag *string\n\n\t// If the object expiration is configured, this will contain the expiration date\n\t// (expiry-date) and rule ID (rule-id). The value of rule-id is URL encoded.\n\tExpiration *string\n\n\t// The object key of the newly created object.\n\tKey *string\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\tRequestCharged types.RequestCharged\n\n\t// If present, specifies the ID of the Amazon Web Services Key Management Service\n\t// (Amazon Web Services KMS) symmetric customer managed customer master key (CMK)\n\t// that was used for the object.\n\tSSEKMSKeyId *string\n\n\t// If you specified server-side encryption either with an Amazon S3-managed\n\t// encryption key or an Amazon Web Services KMS customer master key (CMK) in your\n\t// initiate multipart upload request, the response includes this header. It\n\t// confirms the encryption algorithm that Amazon S3 used to encrypt the object.\n\tServerSideEncryption types.ServerSideEncryption\n\n\t// The version of the object that was uploaded. Will only be populated if\n\t// the S3 Bucket is versioned. If the bucket is not versioned this field\n\t// will not be set.\n\tVersionID *string\n}\n\n// WithUploaderRequestOptions appends to the Uploader's API client options.\nfunc WithUploaderRequestOptions(opts ...func(*s3.Options)) func(*Uploader) {\n\treturn func(u *Uploader) {\n\t\tu.ClientOptions = append(u.ClientOptions, opts...)\n\t}\n}\n\n// The Uploader structure that calls Upload(). It is safe to call Upload()\n// on this structure for multiple objects and across concurrent goroutines.\n// Mutating the Uploader's properties is not safe to be done concurrently.\n//\n// # Pre-computed Checksums\n//\n// Care must be taken when using pre-computed checksums the transfer upload\n// manager. The format and value of the checksum differs based on if the upload\n// will preformed as a single or multipart upload.\n//\n// Uploads that are smaller than the Uploader's PartSize will be uploaded using\n// the PutObject API operation. Pre-computed checksum of the uploaded object's\n// content are valid for these single part uploads. If the checksum provided\n// does not match the uploaded content the upload will fail.\n//\n// Uploads that are larger than the Uploader's PartSize will be uploaded using\n// multi-part upload. The Pre-computed checksums for these uploads are a\n// checksum of checksums of each part. Not a checksum of the full uploaded\n// bytes. With the format of \"<checksum of checksum>-<numberParts>\", (e.g.\n// \"DUoRhQ==-3\"). If a pre-computed checksum is provided that does not match\n// this format, as matches the content uploaded, the upload will fail.\n//\n// ContentMD5 for multipart upload is explicitly ignored for multipart upload,\n// and its value is suppressed.\n//\n// # Automatically Computed Checksums\n//\n// When the ChecksumAlgorithm member of Upload's input parameter PutObjectInput\n// is set to a valid value, the SDK will automatically compute the checksum of\n// the individual uploaded parts. The UploadOutput result from Upload will\n// include the checksum of part checksums provided by S3\n// CompleteMultipartUpload API call.\ntype Uploader struct {\n\t// The buffer size (in bytes) to use when buffering data into chunks and\n\t// sending them as parts to S3. The minimum allowed part size is 5MB, and\n\t// if this value is set to zero, the DefaultUploadPartSize value will be used.\n\tPartSize int64\n\n\t// The number of goroutines to spin up in parallel per call to Upload when\n\t// sending parts. If this is set to zero, the DefaultUploadConcurrency value\n\t// will be used.\n\t//\n\t// The concurrency pool is not shared between calls to Upload.\n\tConcurrency int\n\n\t// Setting this value to true will cause the SDK to avoid calling\n\t// AbortMultipartUpload on a failure, leaving all successfully uploaded\n\t// parts on S3 for manual recovery.\n\t//\n\t// Note that storing parts of an incomplete multipart upload counts towards\n\t// space usage on S3 and will add additional costs if not cleaned up.\n\tLeavePartsOnError bool\n\n\t// MaxUploadParts is the max number of parts which will be uploaded to S3.\n\t// Will be used to calculate the partsize of the object to be uploaded.\n\t// E.g: 5GB file, with MaxUploadParts set to 100, will upload the file\n\t// as 100, 50MB parts. With a limited of s3.MaxUploadParts (10,000 parts).\n\t//\n\t// MaxUploadParts must not be used to limit the total number of bytes uploaded.\n\t// Use a type like to io.LimitReader (https://golang.org/pkg/io/#LimitedReader)\n\t// instead. An io.LimitReader is helpful when uploading an unbounded reader\n\t// to S3, and you know its maximum size. Otherwise the reader's io.EOF returned\n\t// error must be used to signal end of stream.\n\t//\n\t// Defaults to package const's MaxUploadParts value.\n\tMaxUploadParts int32\n\n\t// The client to use when uploading to S3.\n\tS3 UploadAPIClient\n\n\t// List of request options that will be passed down to individual API\n\t// operation requests made by the uploader.\n\tClientOptions []func(*s3.Options)\n\n\t// Defines the buffer strategy used when uploading a part\n\tBufferProvider ReadSeekerWriteToProvider\n\n\t// partPool allows for the re-usage of streaming payload part buffers between upload calls\n\tpartPool byteSlicePool\n}\n\n// NewUploader creates a new Uploader instance to upload objects to S3. Pass In\n// additional functional options to customize the uploader's behavior. Requires a\n// client.ConfigProvider in order to create a S3 service client. The session.Session\n// satisfies the client.ConfigProvider interface.\n//\n// Example:\n//\n//\t// Load AWS Config\n//\tcfg, err := config.LoadDefaultConfig(context.TODO())\n//\tif err != nil {\n//\t\tpanic(err)\n//\t}\n//\n//\t// Create an S3 Client with the config\n//\tclient := s3.NewFromConfig(cfg)\n//\n//\t// Create an uploader passing it the client\n//\tuploader := manager.NewUploader(client)\n//\n//\t// Create an uploader with the client and custom options\n//\tuploader := manager.NewUploader(client, func(u *manager.Uploader) {\n//\t\tu.PartSize = 64 * 1024 * 1024 // 64MB per part\n//\t})\nfunc NewUploader(client UploadAPIClient, options ...func(*Uploader)) *Uploader {\n\tu := &Uploader{\n\t\tS3:                client,\n\t\tPartSize:          DefaultUploadPartSize,\n\t\tConcurrency:       DefaultUploadConcurrency,\n\t\tLeavePartsOnError: false,\n\t\tMaxUploadParts:    MaxUploadParts,\n\t\tBufferProvider:    defaultUploadBufferProvider(),\n\t}\n\n\tfor _, option := range options {\n\t\toption(u)\n\t}\n\n\tu.partPool = newByteSlicePool(u.PartSize)\n\n\treturn u\n}\n\n// Upload uploads an object to S3, intelligently buffering large\n// files into smaller chunks and sending them in parallel across multiple\n// goroutines. You can configure the buffer size and concurrency through the\n// Uploader parameters.\n//\n// Additional functional options can be provided to configure the individual\n// upload. These options are copies of the Uploader instance Upload is called from.\n// Modifying the options will not impact the original Uploader instance.\n//\n// Use the WithUploaderRequestOptions helper function to pass in request\n// options that will be applied to all API operations made with this uploader.\n//\n// It is safe to call this method concurrently across goroutines.\nfunc (u Uploader) Upload(ctx context.Context, input *s3.PutObjectInput, opts ...func(*Uploader)) (\n\t*UploadOutput, error,\n) {\n\ti := uploader{in: input, cfg: u, ctx: ctx}\n\n\t// Copy ClientOptions\n\tclientOptions := make([]func(*s3.Options), 0, len(i.cfg.ClientOptions)+1)\n\tclientOptions = append(clientOptions, func(o *s3.Options) {\n\t\to.APIOptions = append(o.APIOptions,\n\t\t\tmiddleware.AddSDKAgentKey(middleware.FeatureMetadata, userAgentKey),\n\t\t\taddFeatureUserAgent, // yes, there are two of these\n\t\t\tfunc(s *smithymiddleware.Stack) error {\n\t\t\t\treturn s.Finalize.Insert(&setS3ExpressDefaultChecksum{}, \"ResolveEndpointV2\", smithymiddleware.After)\n\t\t\t},\n\t\t)\n\t})\n\tclientOptions = append(clientOptions, i.cfg.ClientOptions...)\n\ti.cfg.ClientOptions = clientOptions\n\n\tfor _, opt := range opts {\n\t\topt(&i.cfg)\n\t}\n\n\treturn i.upload()\n}\n\n// internal structure to manage an upload to S3.\ntype uploader struct {\n\tctx context.Context\n\tcfg Uploader\n\n\tin *s3.PutObjectInput\n\n\treaderPos int64 // current reader position\n\ttotalSize int64 // set to -1 if the size is not known\n}\n\n// internal logic for deciding whether to upload a single part or use a\n// multipart upload.\nfunc (u *uploader) upload() (*UploadOutput, error) {\n\tif err := u.init(); err != nil {\n\t\treturn nil, fmt.Errorf(\"unable to initialize upload: %w\", err)\n\t}\n\tdefer u.cfg.partPool.Close()\n\n\tif u.cfg.PartSize < MinUploadPartSize {\n\t\treturn nil, fmt.Errorf(\"part size must be at least %d bytes\", MinUploadPartSize)\n\t}\n\n\t// Do one read to determine if we have more than one part\n\treader, _, cleanup, err := u.nextReader()\n\tif err == io.EOF { // single part\n\t\treturn u.singlePart(reader, cleanup)\n\t} else if err != nil {\n\t\tcleanup()\n\t\treturn nil, fmt.Errorf(\"read upload data failed: %w\", err)\n\t}\n\n\tmu := multiuploader{uploader: u}\n\treturn mu.upload(reader, cleanup)\n}\n\n// init will initialize all default options.\nfunc (u *uploader) init() error {\n\tif err := validateSupportedARNType(aws.ToString(u.in.Bucket)); err != nil {\n\t\treturn err\n\t}\n\n\tif u.cfg.Concurrency == 0 {\n\t\tu.cfg.Concurrency = DefaultUploadConcurrency\n\t}\n\tif u.cfg.PartSize == 0 {\n\t\tu.cfg.PartSize = DefaultUploadPartSize\n\t}\n\tif u.cfg.MaxUploadParts == 0 {\n\t\tu.cfg.MaxUploadParts = MaxUploadParts\n\t}\n\n\t// Try to get the total size for some optimizations\n\tif err := u.initSize(); err != nil {\n\t\treturn err\n\t}\n\n\t// If PartSize was changed or partPool was never setup then we need to allocated a new pool\n\t// so that we return []byte slices of the correct size\n\tpoolCap := u.cfg.Concurrency + 1\n\tif u.cfg.partPool == nil || u.cfg.partPool.SliceSize() != u.cfg.PartSize {\n\t\tu.cfg.partPool = newByteSlicePool(u.cfg.PartSize)\n\t\tu.cfg.partPool.ModifyCapacity(poolCap)\n\t} else {\n\t\tu.cfg.partPool = &returnCapacityPoolCloser{byteSlicePool: u.cfg.partPool}\n\t\tu.cfg.partPool.ModifyCapacity(poolCap)\n\t}\n\n\treturn nil\n}\n\n// initSize tries to detect the total stream size, setting u.totalSize. If\n// the size is not known, totalSize is set to -1.\nfunc (u *uploader) initSize() error {\n\tu.totalSize = -1\n\n\tswitch r := u.in.Body.(type) {\n\tcase io.Seeker:\n\t\tn, err := seekerLen(r)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tu.totalSize = n\n\n\t\t// Try to adjust partSize if it is too small and account for\n\t\t// integer division truncation.\n\t\tif u.totalSize/u.cfg.PartSize >= int64(u.cfg.MaxUploadParts) {\n\t\t\t// Add one to the part size to account for remainders\n\t\t\t// during the size calculation. e.g odd number of bytes.\n\t\t\tu.cfg.PartSize = (u.totalSize / int64(u.cfg.MaxUploadParts)) + 1\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// nextReader returns a seekable reader representing the next packet of data.\n// This operation increases the shared u.readerPos counter, but note that it\n// does not need to be wrapped in a mutex because nextReader is only called\n// from the main thread.\nfunc (u *uploader) nextReader() (io.ReadSeeker, int, func(), error) {\n\tswitch r := u.in.Body.(type) {\n\tcase readerAtSeeker:\n\t\tvar err error\n\n\t\tn := u.cfg.PartSize\n\t\tif u.totalSize >= 0 {\n\t\t\tbytesLeft := u.totalSize - u.readerPos\n\n\t\t\tif bytesLeft <= u.cfg.PartSize {\n\t\t\t\terr = io.EOF\n\t\t\t\tn = bytesLeft\n\t\t\t}\n\t\t}\n\n\t\tvar (\n\t\t\treader  io.ReadSeeker\n\t\t\tcleanup func()\n\t\t)\n\n\t\treader = io.NewSectionReader(r, u.readerPos, n)\n\t\tif u.cfg.BufferProvider != nil {\n\t\t\treader, cleanup = u.cfg.BufferProvider.GetWriteTo(reader)\n\t\t} else {\n\t\t\tcleanup = func() {}\n\t\t}\n\n\t\tu.readerPos += n\n\n\t\treturn reader, int(n), cleanup, err\n\n\tdefault:\n\t\tpart, err := u.cfg.partPool.Get(u.ctx)\n\t\tif err != nil {\n\t\t\treturn nil, 0, func() {}, err\n\t\t}\n\n\t\tn, err := readFillBuf(r, *part)\n\t\tu.readerPos += int64(n)\n\n\t\tcleanup := func() {\n\t\t\tu.cfg.partPool.Put(part)\n\t\t}\n\n\t\treturn bytes.NewReader((*part)[0:n]), n, cleanup, err\n\t}\n}\n\nfunc readFillBuf(r io.Reader, b []byte) (offset int, err error) {\n\tfor offset < len(b) && err == nil {\n\t\tvar n int\n\t\tn, err = r.Read(b[offset:])\n\t\toffset += n\n\t}\n\n\treturn offset, err\n}\n\n// singlePart contains upload logic for uploading a single chunk via\n// a regular PutObject request. Multipart requests require at least two\n// parts, or at least 5MB of data.\nfunc (u *uploader) singlePart(r io.ReadSeeker, cleanup func()) (*UploadOutput, error) {\n\tdefer cleanup()\n\n\tvar params s3.PutObjectInput\n\tawsutil.Copy(&params, u.in)\n\tparams.Body = r\n\n\t// Need to use request form because URL generated in request is\n\t// used in return.\n\n\tvar locationRecorder recordLocationClient\n\tout, err := u.cfg.S3.PutObject(u.ctx, &params,\n\t\tappend(u.cfg.ClientOptions, locationRecorder.WrapClient())...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &UploadOutput{\n\t\tLocation: locationRecorder.location,\n\n\t\tBucketKeyEnabled:     aws.ToBool(out.BucketKeyEnabled),\n\t\tChecksumCRC32:        out.ChecksumCRC32,\n\t\tChecksumCRC32C:       out.ChecksumCRC32C,\n\t\tChecksumCRC64NVME:    out.ChecksumCRC64NVME,\n\t\tChecksumSHA1:         out.ChecksumSHA1,\n\t\tChecksumSHA256:       out.ChecksumSHA256,\n\t\tETag:                 out.ETag,\n\t\tExpiration:           out.Expiration,\n\t\tKey:                  params.Key,\n\t\tRequestCharged:       out.RequestCharged,\n\t\tSSEKMSKeyId:          out.SSEKMSKeyId,\n\t\tServerSideEncryption: out.ServerSideEncryption,\n\t\tVersionID:            out.VersionId,\n\t}, nil\n}\n\ntype httpClient interface {\n\tDo(r *http.Request) (*http.Response, error)\n}\n\ntype recordLocationClient struct {\n\thttpClient\n\tlocation string\n}\n\nfunc (c *recordLocationClient) WrapClient() func(o *s3.Options) {\n\treturn func(o *s3.Options) {\n\t\tc.httpClient = o.HTTPClient\n\t\to.HTTPClient = c\n\t}\n}\n\nfunc (c *recordLocationClient) Do(r *http.Request) (resp *http.Response, err error) {\n\tresp, err = c.httpClient.Do(r)\n\tif err != nil {\n\t\treturn resp, err\n\t}\n\n\tif resp.Request != nil && resp.Request.URL != nil {\n\t\turl := *resp.Request.URL\n\t\turl.RawQuery = \"\"\n\t\tc.location = url.String()\n\t}\n\n\treturn resp, err\n}\n\n// internal structure to manage a specific multipart upload to S3.\ntype multiuploader struct {\n\t*uploader\n\twg       sync.WaitGroup\n\tm        sync.Mutex\n\terr      error\n\tuploadID string\n\tparts    completedParts\n}\n\n// keeps track of a single chunk of data being sent to S3.\ntype chunk struct {\n\tbuf     io.ReadSeeker\n\tnum     int32\n\tcleanup func()\n}\n\n// completedParts is a wrapper to make parts sortable by their part number,\n// since S3 required this list to be sent in sorted order.\ntype completedParts []types.CompletedPart\n\nfunc (a completedParts) Len() int      { return len(a) }\nfunc (a completedParts) Swap(i, j int) { a[i], a[j] = a[j], a[i] }\nfunc (a completedParts) Less(i, j int) bool {\n\treturn aws.ToInt32(a[i].PartNumber) < aws.ToInt32(a[j].PartNumber)\n}\n\n// upload will perform a multipart upload using the firstBuf buffer containing\n// the first chunk of data.\nfunc (u *multiuploader) upload(firstBuf io.ReadSeeker, cleanup func()) (*UploadOutput, error) {\n\tu.initChecksumAlgorithm()\n\n\tvar params s3.CreateMultipartUploadInput\n\tawsutil.Copy(&params, u.in)\n\n\t// Create the multipart\n\tvar locationRecorder recordLocationClient\n\tresp, err := u.cfg.S3.CreateMultipartUpload(u.ctx, &params,\n\t\tappend(u.cfg.ClientOptions, locationRecorder.WrapClient())...)\n\tif err != nil {\n\t\tcleanup()\n\t\treturn nil, err\n\t}\n\tu.uploadID = *resp.UploadId\n\n\t// Create the workers\n\tch := make(chan chunk, u.cfg.Concurrency)\n\tfor i := 0; i < u.cfg.Concurrency; i++ {\n\t\tu.wg.Add(1)\n\t\tgo u.readChunk(ch)\n\t}\n\n\t// Send part 1 to the workers\n\tvar num int32 = 1\n\tch <- chunk{buf: firstBuf, num: num, cleanup: cleanup}\n\n\t// Read and queue the rest of the parts\n\tfor u.geterr() == nil && err == nil {\n\t\tvar (\n\t\t\treader       io.ReadSeeker\n\t\t\tnextChunkLen int\n\t\t\tok           bool\n\t\t)\n\n\t\treader, nextChunkLen, cleanup, err = u.nextReader()\n\t\tok, err = u.shouldContinue(num, nextChunkLen, err)\n\t\tif !ok {\n\t\t\tcleanup()\n\t\t\tif err != nil {\n\t\t\t\tu.seterr(err)\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\n\t\tnum++\n\n\t\tch <- chunk{buf: reader, num: num, cleanup: cleanup}\n\t}\n\n\t// Close the channel, wait for workers, and complete upload\n\tclose(ch)\n\tu.wg.Wait()\n\tcompleteOut := u.complete()\n\n\tif err := u.geterr(); err != nil {\n\t\treturn nil, &multiUploadError{\n\t\t\terr:      err,\n\t\t\tuploadID: u.uploadID,\n\t\t}\n\t}\n\n\treturn &UploadOutput{\n\t\tLocation:       locationRecorder.location,\n\t\tUploadID:       u.uploadID,\n\t\tCompletedParts: u.parts,\n\n\t\tBucketKeyEnabled:     aws.ToBool(completeOut.BucketKeyEnabled),\n\t\tChecksumCRC32:        completeOut.ChecksumCRC32,\n\t\tChecksumCRC32C:       completeOut.ChecksumCRC32C,\n\t\tChecksumCRC64NVME:    completeOut.ChecksumCRC64NVME,\n\t\tChecksumSHA1:         completeOut.ChecksumSHA1,\n\t\tChecksumSHA256:       completeOut.ChecksumSHA256,\n\t\tETag:                 completeOut.ETag,\n\t\tExpiration:           completeOut.Expiration,\n\t\tKey:                  completeOut.Key,\n\t\tRequestCharged:       completeOut.RequestCharged,\n\t\tSSEKMSKeyId:          completeOut.SSEKMSKeyId,\n\t\tServerSideEncryption: completeOut.ServerSideEncryption,\n\t\tVersionID:            completeOut.VersionId,\n\t}, nil\n}\n\nfunc (u *multiuploader) shouldContinue(part int32, nextChunkLen int, err error) (bool, error) {\n\tif err != nil && err != io.EOF {\n\t\treturn false, fmt.Errorf(\"read multipart upload data failed, %w\", err)\n\t}\n\n\tif nextChunkLen == 0 {\n\t\t// No need to upload empty part, if file was empty to start\n\t\t// with empty single part would of been created and never\n\t\t// started multipart upload.\n\t\treturn false, nil\n\t}\n\n\tpart++\n\t// This upload exceeded maximum number of supported parts, error now.\n\tif part > u.cfg.MaxUploadParts || part > MaxUploadParts {\n\t\tvar msg string\n\t\tif part > u.cfg.MaxUploadParts {\n\t\t\tmsg = fmt.Sprintf(\"exceeded total allowed configured MaxUploadParts (%d). Adjust PartSize to fit in this limit\",\n\t\t\t\tu.cfg.MaxUploadParts)\n\t\t} else {\n\t\t\tmsg = fmt.Sprintf(\"exceeded total allowed S3 limit MaxUploadParts (%d). Adjust PartSize to fit in this limit\",\n\t\t\t\tMaxUploadParts)\n\t\t}\n\t\treturn false, errors.New(msg)\n\t}\n\n\treturn true, err\n}\n\n// readChunk runs in worker goroutines to pull chunks off of the ch channel\n// and send() them as UploadPart requests.\nfunc (u *multiuploader) readChunk(ch chan chunk) {\n\tdefer u.wg.Done()\n\tfor {\n\t\tdata, ok := <-ch\n\n\t\tif !ok {\n\t\t\tbreak\n\t\t}\n\n\t\tif u.geterr() == nil {\n\t\t\tif err := u.send(data); err != nil {\n\t\t\t\tu.seterr(err)\n\t\t\t}\n\t\t}\n\n\t\tdata.cleanup()\n\t}\n}\n\n// send performs an UploadPart request and keeps track of the completed\n// part information.\nfunc (u *multiuploader) send(c chunk) error {\n\tparams := &s3.UploadPartInput{\n\t\tBucket:               u.in.Bucket,\n\t\tKey:                  u.in.Key,\n\t\tBody:                 c.buf,\n\t\tSSECustomerAlgorithm: u.in.SSECustomerAlgorithm,\n\t\tSSECustomerKey:       u.in.SSECustomerKey,\n\t\tSSECustomerKeyMD5:    u.in.SSECustomerKeyMD5,\n\t\tExpectedBucketOwner:  u.in.ExpectedBucketOwner,\n\t\tRequestPayer:         u.in.RequestPayer,\n\n\t\tChecksumAlgorithm: u.in.ChecksumAlgorithm,\n\t\t// Invalid to set any of the individual ChecksumXXX members from\n\t\t// PutObject as they are never valid for individual parts of a\n\t\t// multipart upload.\n\n\t\tPartNumber: aws.Int32(c.num),\n\t\tUploadId:   &u.uploadID,\n\t}\n\t// TODO should do copy then clear?\n\n\tresp, err := u.cfg.S3.UploadPart(u.ctx, params, u.cfg.ClientOptions...)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar completed types.CompletedPart\n\tawsutil.Copy(&completed, resp)\n\tcompleted.PartNumber = aws.Int32(c.num)\n\n\tu.m.Lock()\n\tu.parts = append(u.parts, completed)\n\tu.m.Unlock()\n\n\treturn nil\n}\n\nfunc (u *multiuploader) initChecksumAlgorithm() {\n\tif u.in.ChecksumAlgorithm != \"\" {\n\t\treturn\n\t}\n\n\tswitch {\n\tcase u.in.ChecksumCRC32 != nil:\n\t\tu.in.ChecksumAlgorithm = types.ChecksumAlgorithmCrc32\n\tcase u.in.ChecksumCRC32C != nil:\n\t\tu.in.ChecksumAlgorithm = types.ChecksumAlgorithmCrc32c\n\tcase u.in.ChecksumCRC64NVME != nil:\n\t\tu.in.ChecksumAlgorithm = types.ChecksumAlgorithmCrc64nvme\n\tcase u.in.ChecksumSHA1 != nil:\n\t\tu.in.ChecksumAlgorithm = types.ChecksumAlgorithmSha1\n\tcase u.in.ChecksumSHA256 != nil:\n\t\tu.in.ChecksumAlgorithm = types.ChecksumAlgorithmSha256\n\tdefault:\n\t\tu.in.ChecksumAlgorithm = types.ChecksumAlgorithmCrc32\n\t}\n}\n\n// geterr is a thread-safe getter for the error object\nfunc (u *multiuploader) geterr() error {\n\tu.m.Lock()\n\tdefer u.m.Unlock()\n\n\treturn u.err\n}\n\n// seterr is a thread-safe setter for the error object\nfunc (u *multiuploader) seterr(e error) {\n\tu.m.Lock()\n\tdefer u.m.Unlock()\n\n\tu.err = e\n}\n\n// fail will abort the multipart unless LeavePartsOnError is set to true.\nfunc (u *multiuploader) fail() {\n\tif u.cfg.LeavePartsOnError {\n\t\treturn\n\t}\n\n\tparams := &s3.AbortMultipartUploadInput{\n\t\tBucket:   u.in.Bucket,\n\t\tKey:      u.in.Key,\n\t\tUploadId: &u.uploadID,\n\t}\n\t_, err := u.cfg.S3.AbortMultipartUpload(u.ctx, params, u.cfg.ClientOptions...)\n\tif err != nil {\n\t\t// TODO: Add logging\n\t\t//logMessage(u.cfg.S3, aws.LogDebug, fmt.Sprintf(\"failed to abort multipart upload, %v\", err))\n\t\t_ = err\n\t}\n}\n\n// complete successfully completes a multipart upload and returns the response.\nfunc (u *multiuploader) complete() *s3.CompleteMultipartUploadOutput {\n\tif u.geterr() != nil {\n\t\tu.fail()\n\t\treturn nil\n\t}\n\n\t// Parts must be sorted in PartNumber order.\n\tsort.Sort(u.parts)\n\n\tvar params s3.CompleteMultipartUploadInput\n\tawsutil.Copy(&params, u.in)\n\tparams.UploadId = &u.uploadID\n\tparams.MultipartUpload = &types.CompletedMultipartUpload{Parts: u.parts}\n\n\tresp, err := u.cfg.S3.CompleteMultipartUpload(u.ctx, &params, u.cfg.ClientOptions...)\n\tif err != nil {\n\t\tu.seterr(err)\n\t\tu.fail()\n\t}\n\n\treturn resp\n}\n\ntype readerAtSeeker interface {\n\tio.ReaderAt\n\tio.ReadSeeker\n}\n\n// setS3ExpressDefaultChecksum defaults to CRC32 for S3Express buckets,\n// which is required when uploading to those through transfer manager.\ntype setS3ExpressDefaultChecksum struct{}\n\nfunc (*setS3ExpressDefaultChecksum) ID() string {\n\treturn \"setS3ExpressDefaultChecksum\"\n}\n\nfunc (*setS3ExpressDefaultChecksum) HandleFinalize(\n\tctx context.Context, in smithymiddleware.FinalizeInput, next smithymiddleware.FinalizeHandler,\n) (\n\tout smithymiddleware.FinalizeOutput, metadata smithymiddleware.Metadata, err error,\n) {\n\tconst checksumHeader = \"x-amz-checksum-algorithm\"\n\n\tif internalcontext.GetS3Backend(ctx) != internalcontext.S3BackendS3Express {\n\t\treturn next.HandleFinalize(ctx, in)\n\t}\n\n\t// If this is CreateMultipartUpload we need to ensure the checksum\n\t// algorithm header is present. Otherwise everything is driven off the\n\t// context setting and we can let it flow from there.\n\tif middleware.GetOperationName(ctx) == \"CreateMultipartUpload\" {\n\t\tr, ok := in.Request.(*smithyhttp.Request)\n\t\tif !ok {\n\t\t\treturn out, metadata, fmt.Errorf(\"unknown transport type %T\", in.Request)\n\t\t}\n\n\t\tif internalcontext.GetChecksumInputAlgorithm(ctx) == \"\" {\n\t\t\tr.Header.Set(checksumHeader, \"CRC32\")\n\t\t}\n\t\treturn next.HandleFinalize(ctx, in)\n\t} else if internalcontext.GetChecksumInputAlgorithm(ctx) == \"\" {\n\t\tctx = internalcontext.SetChecksumInputAlgorithm(ctx, string(types.ChecksumAlgorithmCrc32))\n\t}\n\n\treturn next.HandleFinalize(ctx, in)\n}\n\nfunc addFeatureUserAgent(stack *smithymiddleware.Stack) error {\n\tua, err := getOrAddRequestUserAgent(stack)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tua.AddUserAgentFeature(middleware.UserAgentFeatureS3Transfer)\n\treturn nil\n}\n\nfunc getOrAddRequestUserAgent(stack *smithymiddleware.Stack) (*middleware.RequestUserAgent, error) {\n\tid := (*middleware.RequestUserAgent)(nil).ID()\n\tmw, ok := stack.Build.Get(id)\n\tif !ok {\n\t\tmw = middleware.NewRequestUserAgent()\n\t\tif err := stack.Build.Add(mw, smithymiddleware.After); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tua, ok := mw.(*middleware.RequestUserAgent)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"%T for %s middleware did not match expected type\", mw, id)\n\t}\n\n\treturn ua, nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/writer_read_from.go",
    "content": "package manager\n\nimport (\n\t\"bufio\"\n\t\"io\"\n\t\"sync\"\n\n\t\"github.com/aws/aws-sdk-go-v2/internal/sdkio\"\n)\n\n// WriterReadFrom defines an interface implementing io.Writer and io.ReaderFrom\ntype WriterReadFrom interface {\n\tio.Writer\n\tio.ReaderFrom\n}\n\n// WriterReadFromProvider provides an implementation of io.ReadFrom for the given io.Writer\ntype WriterReadFromProvider interface {\n\tGetReadFrom(writer io.Writer) (w WriterReadFrom, cleanup func())\n}\n\ntype bufferedWriter interface {\n\tWriterReadFrom\n\tFlush() error\n\tReset(io.Writer)\n}\n\ntype bufferedReadFrom struct {\n\tbufferedWriter\n}\n\nfunc (b *bufferedReadFrom) ReadFrom(r io.Reader) (int64, error) {\n\tn, err := b.bufferedWriter.ReadFrom(r)\n\tif flushErr := b.Flush(); flushErr != nil && err == nil {\n\t\terr = flushErr\n\t}\n\treturn n, err\n}\n\n// PooledBufferedReadFromProvider is a WriterReadFromProvider that uses a sync.Pool\n// to manage allocation and reuse of *bufio.Writer structures.\ntype PooledBufferedReadFromProvider struct {\n\tpool sync.Pool\n}\n\n// NewPooledBufferedWriterReadFromProvider returns a new PooledBufferedReadFromProvider\n// Size is used to control the size of the underlying *bufio.Writer created for\n// calls to GetReadFrom.\nfunc NewPooledBufferedWriterReadFromProvider(size int) *PooledBufferedReadFromProvider {\n\tif size < int(32*sdkio.KibiByte) {\n\t\tsize = int(64 * sdkio.KibiByte)\n\t}\n\n\treturn &PooledBufferedReadFromProvider{\n\t\tpool: sync.Pool{\n\t\t\tNew: func() interface{} {\n\t\t\t\treturn &bufferedReadFrom{bufferedWriter: bufio.NewWriterSize(nil, size)}\n\t\t\t},\n\t\t},\n\t}\n}\n\n// GetReadFrom takes an io.Writer and wraps it with a type which satisfies the WriterReadFrom\n// interface/ Additionally a cleanup function is provided which must be called after usage of the WriterReadFrom\n// has been completed in order to allow the reuse of the *bufio.Writer\nfunc (p *PooledBufferedReadFromProvider) GetReadFrom(writer io.Writer) (r WriterReadFrom, cleanup func()) {\n\tbuffer := p.pool.Get().(*bufferedReadFrom)\n\tbuffer.Reset(writer)\n\tr = buffer\n\tcleanup = func() {\n\t\tbuffer.Reset(nil) // Reset to nil writer to release reference\n\t\tp.pool.Put(buffer)\n\t}\n\treturn r, cleanup\n}\n\ntype suppressWriterAt struct {\n\tsuppressed io.Reader\n}\n\nfunc (s *suppressWriterAt) Read(p []byte) (n int, err error) {\n\treturn s.suppressed.Read(p)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/auth/auth.go",
    "content": "package auth\n\nimport (\n\t\"github.com/aws/smithy-go/auth\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// HTTPAuthScheme is the SDK's internal implementation of smithyhttp.AuthScheme\n// for pre-existing implementations where the signer was added to client\n// config. SDK clients will key off of this type and ensure per-operation\n// updates to those signers persist on the scheme itself.\ntype HTTPAuthScheme struct {\n\tschemeID string\n\tsigner   smithyhttp.Signer\n}\n\nvar _ smithyhttp.AuthScheme = (*HTTPAuthScheme)(nil)\n\n// NewHTTPAuthScheme returns an auth scheme instance with the given config.\nfunc NewHTTPAuthScheme(schemeID string, signer smithyhttp.Signer) *HTTPAuthScheme {\n\treturn &HTTPAuthScheme{\n\t\tschemeID: schemeID,\n\t\tsigner:   signer,\n\t}\n}\n\n// SchemeID identifies the auth scheme.\nfunc (s *HTTPAuthScheme) SchemeID() string {\n\treturn s.schemeID\n}\n\n// IdentityResolver gets the identity resolver for the auth scheme.\nfunc (s *HTTPAuthScheme) IdentityResolver(o auth.IdentityResolverOptions) auth.IdentityResolver {\n\treturn o.GetIdentityResolver(s.schemeID)\n}\n\n// Signer gets the signer for the auth scheme.\nfunc (s *HTTPAuthScheme) Signer() smithyhttp.Signer {\n\treturn s.signer\n}\n\n// WithSigner returns a new instance of the auth scheme with the updated signer.\nfunc (s *HTTPAuthScheme) WithSigner(signer smithyhttp.Signer) *HTTPAuthScheme {\n\treturn NewHTTPAuthScheme(s.schemeID, signer)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/auth/scheme.go",
    "content": "package auth\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tsmithy \"github.com/aws/smithy-go\"\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\n// SigV4 is a constant representing\n// Authentication Scheme Signature Version 4\nconst SigV4 = \"sigv4\"\n\n// SigV4A is a constant representing\n// Authentication Scheme Signature Version 4A\nconst SigV4A = \"sigv4a\"\n\n// SigV4S3Express identifies the S3 S3Express auth scheme.\nconst SigV4S3Express = \"sigv4-s3express\"\n\n// None is a constant representing the\n// None Authentication Scheme\nconst None = \"none\"\n\n// SupportedSchemes is a data structure\n// that indicates the list of supported AWS\n// authentication schemes\nvar SupportedSchemes = map[string]bool{\n\tSigV4:          true,\n\tSigV4A:         true,\n\tSigV4S3Express: true,\n\tNone:           true,\n}\n\n// AuthenticationScheme is a representation of\n// AWS authentication schemes\ntype AuthenticationScheme interface {\n\tisAuthenticationScheme()\n}\n\n// AuthenticationSchemeV4 is a AWS SigV4 representation\ntype AuthenticationSchemeV4 struct {\n\tName                  string\n\tSigningName           *string\n\tSigningRegion         *string\n\tDisableDoubleEncoding *bool\n}\n\nfunc (a *AuthenticationSchemeV4) isAuthenticationScheme() {}\n\n// AuthenticationSchemeV4A is a AWS SigV4A representation\ntype AuthenticationSchemeV4A struct {\n\tName                  string\n\tSigningName           *string\n\tSigningRegionSet      []string\n\tDisableDoubleEncoding *bool\n}\n\nfunc (a *AuthenticationSchemeV4A) isAuthenticationScheme() {}\n\n// AuthenticationSchemeNone is a representation for the none auth scheme\ntype AuthenticationSchemeNone struct{}\n\nfunc (a *AuthenticationSchemeNone) isAuthenticationScheme() {}\n\n// NoAuthenticationSchemesFoundError is used in signaling\n// that no authentication schemes have been specified.\ntype NoAuthenticationSchemesFoundError struct{}\n\nfunc (e *NoAuthenticationSchemesFoundError) Error() string {\n\treturn fmt.Sprint(\"No authentication schemes specified.\")\n}\n\n// UnSupportedAuthenticationSchemeSpecifiedError is used in\n// signaling that only unsupported authentication schemes\n// were specified.\ntype UnSupportedAuthenticationSchemeSpecifiedError struct {\n\tUnsupportedSchemes []string\n}\n\nfunc (e *UnSupportedAuthenticationSchemeSpecifiedError) Error() string {\n\treturn fmt.Sprint(\"Unsupported authentication scheme specified.\")\n}\n\n// GetAuthenticationSchemes extracts the relevant authentication scheme data\n// into a custom strongly typed Go data structure.\nfunc GetAuthenticationSchemes(p *smithy.Properties) ([]AuthenticationScheme, error) {\n\tvar result []AuthenticationScheme\n\tif !p.Has(\"authSchemes\") {\n\t\treturn nil, &NoAuthenticationSchemesFoundError{}\n\t}\n\n\tauthSchemes, _ := p.Get(\"authSchemes\").([]interface{})\n\n\tvar unsupportedSchemes []string\n\tfor _, scheme := range authSchemes {\n\t\tauthScheme, _ := scheme.(map[string]interface{})\n\n\t\tversion := authScheme[\"name\"].(string)\n\t\tswitch version {\n\t\tcase SigV4, SigV4S3Express:\n\t\t\tv4Scheme := AuthenticationSchemeV4{\n\t\t\t\tName:                  version,\n\t\t\t\tSigningName:           getSigningName(authScheme),\n\t\t\t\tSigningRegion:         getSigningRegion(authScheme),\n\t\t\t\tDisableDoubleEncoding: getDisableDoubleEncoding(authScheme),\n\t\t\t}\n\t\t\tresult = append(result, AuthenticationScheme(&v4Scheme))\n\t\tcase SigV4A:\n\t\t\tv4aScheme := AuthenticationSchemeV4A{\n\t\t\t\tName:                  SigV4A,\n\t\t\t\tSigningName:           getSigningName(authScheme),\n\t\t\t\tSigningRegionSet:      getSigningRegionSet(authScheme),\n\t\t\t\tDisableDoubleEncoding: getDisableDoubleEncoding(authScheme),\n\t\t\t}\n\t\t\tresult = append(result, AuthenticationScheme(&v4aScheme))\n\t\tcase None:\n\t\t\tnoneScheme := AuthenticationSchemeNone{}\n\t\t\tresult = append(result, AuthenticationScheme(&noneScheme))\n\t\tdefault:\n\t\t\tunsupportedSchemes = append(unsupportedSchemes, authScheme[\"name\"].(string))\n\t\t\tcontinue\n\t\t}\n\t}\n\n\tif len(result) == 0 {\n\t\treturn nil, &UnSupportedAuthenticationSchemeSpecifiedError{\n\t\t\tUnsupportedSchemes: unsupportedSchemes,\n\t\t}\n\t}\n\n\treturn result, nil\n}\n\ntype disableDoubleEncoding struct{}\n\n// SetDisableDoubleEncoding sets or modifies the disable double encoding option\n// on the context.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc SetDisableDoubleEncoding(ctx context.Context, value bool) context.Context {\n\treturn middleware.WithStackValue(ctx, disableDoubleEncoding{}, value)\n}\n\n// GetDisableDoubleEncoding retrieves the disable double encoding option\n// from the context.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc GetDisableDoubleEncoding(ctx context.Context) (value bool, ok bool) {\n\tvalue, ok = middleware.GetStackValue(ctx, disableDoubleEncoding{}).(bool)\n\treturn value, ok\n}\n\nfunc getSigningName(authScheme map[string]interface{}) *string {\n\tsigningName, ok := authScheme[\"signingName\"].(string)\n\tif !ok || signingName == \"\" {\n\t\treturn nil\n\t}\n\treturn &signingName\n}\n\nfunc getSigningRegionSet(authScheme map[string]interface{}) []string {\n\tuntypedSigningRegionSet, ok := authScheme[\"signingRegionSet\"].([]interface{})\n\tif !ok {\n\t\treturn nil\n\t}\n\tsigningRegionSet := []string{}\n\tfor _, item := range untypedSigningRegionSet {\n\t\tsigningRegionSet = append(signingRegionSet, item.(string))\n\t}\n\treturn signingRegionSet\n}\n\nfunc getSigningRegion(authScheme map[string]interface{}) *string {\n\tsigningRegion, ok := authScheme[\"signingRegion\"].(string)\n\tif !ok || signingRegion == \"\" {\n\t\treturn nil\n\t}\n\treturn &signingRegion\n}\n\nfunc getDisableDoubleEncoding(authScheme map[string]interface{}) *bool {\n\tdisableDoubleEncoding, ok := authScheme[\"disableDoubleEncoding\"].(bool)\n\tif !ok {\n\t\treturn nil\n\t}\n\treturn &disableDoubleEncoding\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/bearer_token_adapter.go",
    "content": "package smithy\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/aws/smithy-go\"\n\t\"github.com/aws/smithy-go/auth\"\n\t\"github.com/aws/smithy-go/auth/bearer\"\n)\n\n// BearerTokenAdapter adapts smithy bearer.Token to smithy auth.Identity.\ntype BearerTokenAdapter struct {\n\tToken bearer.Token\n}\n\nvar _ auth.Identity = (*BearerTokenAdapter)(nil)\n\n// Expiration returns the time of expiration for the token.\nfunc (v *BearerTokenAdapter) Expiration() time.Time {\n\treturn v.Token.Expires\n}\n\n// BearerTokenProviderAdapter adapts smithy bearer.TokenProvider to smithy\n// auth.IdentityResolver.\ntype BearerTokenProviderAdapter struct {\n\tProvider bearer.TokenProvider\n}\n\nvar _ (auth.IdentityResolver) = (*BearerTokenProviderAdapter)(nil)\n\n// GetIdentity retrieves a bearer token using the underlying provider.\nfunc (v *BearerTokenProviderAdapter) GetIdentity(ctx context.Context, _ smithy.Properties) (\n\tauth.Identity, error,\n) {\n\ttoken, err := v.Provider.RetrieveBearerToken(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"get token: %w\", err)\n\t}\n\n\treturn &BearerTokenAdapter{Token: token}, nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/bearer_token_signer_adapter.go",
    "content": "package smithy\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/aws/smithy-go\"\n\t\"github.com/aws/smithy-go/auth\"\n\t\"github.com/aws/smithy-go/auth/bearer\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// BearerTokenSignerAdapter adapts smithy bearer.Signer to smithy http\n// auth.Signer.\ntype BearerTokenSignerAdapter struct {\n\tSigner bearer.Signer\n}\n\nvar _ (smithyhttp.Signer) = (*BearerTokenSignerAdapter)(nil)\n\n// SignRequest signs the request with the provided bearer token.\nfunc (v *BearerTokenSignerAdapter) SignRequest(ctx context.Context, r *smithyhttp.Request, identity auth.Identity, _ smithy.Properties) error {\n\tca, ok := identity.(*BearerTokenAdapter)\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected identity type: %T\", identity)\n\t}\n\n\tsigned, err := v.Signer.SignWithBearerToken(ctx, ca.Token, r)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"sign request: %w\", err)\n\t}\n\n\t*r = *signed.(*smithyhttp.Request)\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/credentials_adapter.go",
    "content": "package smithy\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/smithy-go\"\n\t\"github.com/aws/smithy-go/auth\"\n)\n\n// CredentialsAdapter adapts aws.Credentials to auth.Identity.\ntype CredentialsAdapter struct {\n\tCredentials aws.Credentials\n}\n\nvar _ auth.Identity = (*CredentialsAdapter)(nil)\n\n// Expiration returns the time of expiration for the credentials.\nfunc (v *CredentialsAdapter) Expiration() time.Time {\n\treturn v.Credentials.Expires\n}\n\n// CredentialsProviderAdapter adapts aws.CredentialsProvider to auth.IdentityResolver.\ntype CredentialsProviderAdapter struct {\n\tProvider aws.CredentialsProvider\n}\n\nvar _ (auth.IdentityResolver) = (*CredentialsProviderAdapter)(nil)\n\n// GetIdentity retrieves AWS credentials using the underlying provider.\nfunc (v *CredentialsProviderAdapter) GetIdentity(ctx context.Context, _ smithy.Properties) (\n\tauth.Identity, error,\n) {\n\tif v.Provider == nil {\n\t\treturn &CredentialsAdapter{Credentials: aws.Credentials{}}, nil\n\t}\n\n\tcreds, err := v.Provider.Retrieve(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"get credentials: %w\", err)\n\t}\n\n\treturn &CredentialsAdapter{Credentials: creds}, nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/smithy.go",
    "content": "// Package smithy adapts concrete AWS auth and signing types to the generic smithy versions.\npackage smithy\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/v4signer_adapter.go",
    "content": "package smithy\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tv4 \"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalcontext \"github.com/aws/aws-sdk-go-v2/internal/context\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/sdk\"\n\t\"github.com/aws/smithy-go\"\n\t\"github.com/aws/smithy-go/auth\"\n\t\"github.com/aws/smithy-go/logging\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// V4SignerAdapter adapts v4.HTTPSigner to smithy http.Signer.\ntype V4SignerAdapter struct {\n\tSigner     v4.HTTPSigner\n\tLogger     logging.Logger\n\tLogSigning bool\n}\n\nvar _ (smithyhttp.Signer) = (*V4SignerAdapter)(nil)\n\n// SignRequest signs the request with the provided identity.\nfunc (v *V4SignerAdapter) SignRequest(ctx context.Context, r *smithyhttp.Request, identity auth.Identity, props smithy.Properties) error {\n\tca, ok := identity.(*CredentialsAdapter)\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected identity type: %T\", identity)\n\t}\n\n\tname, ok := smithyhttp.GetSigV4SigningName(&props)\n\tif !ok {\n\t\treturn fmt.Errorf(\"sigv4 signing name is required\")\n\t}\n\n\tregion, ok := smithyhttp.GetSigV4SigningRegion(&props)\n\tif !ok {\n\t\treturn fmt.Errorf(\"sigv4 signing region is required\")\n\t}\n\n\thash := v4.GetPayloadHash(ctx)\n\tsigningTime := sdk.NowTime()\n\tskew := internalcontext.GetAttemptSkewContext(ctx)\n\tsigningTime = signingTime.Add(skew)\n\terr := v.Signer.SignHTTP(ctx, ca.Credentials, r.Request, hash, name, region, signingTime, func(o *v4.SignerOptions) {\n\t\to.DisableURIPathEscaping, _ = smithyhttp.GetDisableDoubleEncoding(&props)\n\n\t\to.Logger = v.Logger\n\t\to.LogSigning = v.LogSigning\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"sign http: %w\", err)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/awsutil/copy.go",
    "content": "package awsutil\n\nimport (\n\t\"io\"\n\t\"reflect\"\n\t\"time\"\n)\n\n// Copy deeply copies a src structure to dst. Useful for copying request and\n// response structures.\n//\n// Can copy between structs of different type, but will only copy fields which\n// are assignable, and exist in both structs. Fields which are not assignable,\n// or do not exist in both structs are ignored.\nfunc Copy(dst, src interface{}) {\n\tdstval := reflect.ValueOf(dst)\n\tif !dstval.IsValid() {\n\t\tpanic(\"Copy dst cannot be nil\")\n\t}\n\n\trcopy(dstval, reflect.ValueOf(src), true)\n}\n\n// CopyOf returns a copy of src while also allocating the memory for dst.\n// src must be a pointer type or this operation will fail.\nfunc CopyOf(src interface{}) (dst interface{}) {\n\tdsti := reflect.New(reflect.TypeOf(src).Elem())\n\tdst = dsti.Interface()\n\trcopy(dsti, reflect.ValueOf(src), true)\n\treturn\n}\n\n// rcopy performs a recursive copy of values from the source to destination.\n//\n// root is used to skip certain aspects of the copy which are not valid\n// for the root node of a object.\nfunc rcopy(dst, src reflect.Value, root bool) {\n\tif !src.IsValid() {\n\t\treturn\n\t}\n\n\tswitch src.Kind() {\n\tcase reflect.Ptr:\n\t\tif _, ok := src.Interface().(io.Reader); ok {\n\t\t\tif dst.Kind() == reflect.Ptr && dst.Elem().CanSet() {\n\t\t\t\tdst.Elem().Set(src)\n\t\t\t} else if dst.CanSet() {\n\t\t\t\tdst.Set(src)\n\t\t\t}\n\t\t} else {\n\t\t\te := src.Type().Elem()\n\t\t\tif dst.CanSet() && !src.IsNil() {\n\t\t\t\tif _, ok := src.Interface().(*time.Time); !ok {\n\t\t\t\t\tif dst.Kind() == reflect.String {\n\t\t\t\t\t\tdst.SetString(e.String())\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdst.Set(reflect.New(e))\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttempValue := reflect.New(e)\n\t\t\t\t\ttempValue.Elem().Set(src.Elem())\n\t\t\t\t\t// Sets time.Time's unexported values\n\t\t\t\t\tdst.Set(tempValue)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif dst.Kind() != reflect.String && src.Elem().IsValid() {\n\t\t\t\t// Keep the current root state since the depth hasn't changed\n\t\t\t\trcopy(dst.Elem(), src.Elem(), root)\n\t\t\t}\n\t\t}\n\tcase reflect.Struct:\n\t\tt := dst.Type()\n\t\tfor i := 0; i < t.NumField(); i++ {\n\t\t\tname := t.Field(i).Name\n\t\t\tsrcVal := src.FieldByName(name)\n\t\t\tdstVal := dst.FieldByName(name)\n\t\t\tif srcVal.IsValid() && dstVal.CanSet() {\n\t\t\t\trcopy(dstVal, srcVal, false)\n\t\t\t}\n\t\t}\n\tcase reflect.Slice:\n\t\tif src.IsNil() {\n\t\t\tbreak\n\t\t}\n\n\t\ts := reflect.MakeSlice(src.Type(), src.Len(), src.Cap())\n\t\tdst.Set(s)\n\t\tfor i := 0; i < src.Len(); i++ {\n\t\t\trcopy(dst.Index(i), src.Index(i), false)\n\t\t}\n\tcase reflect.Map:\n\t\tif src.IsNil() {\n\t\t\tbreak\n\t\t}\n\n\t\ts := reflect.MakeMap(src.Type())\n\t\tdst.Set(s)\n\t\tfor _, k := range src.MapKeys() {\n\t\t\tv := src.MapIndex(k)\n\t\t\tv2 := reflect.New(v.Type()).Elem()\n\t\t\trcopy(v2, v, false)\n\t\t\tdst.SetMapIndex(k, v2)\n\t\t}\n\tdefault:\n\t\t// Assign the value if possible. If its not assignable, the value would\n\t\t// need to be converted and the impact of that may be unexpected, or is\n\t\t// not compatible with the dst type.\n\t\tif src.Type().AssignableTo(dst.Type()) {\n\t\t\tdst.Set(src)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/awsutil/equal.go",
    "content": "package awsutil\n\nimport (\n\t\"reflect\"\n)\n\n// DeepEqual returns if the two values are deeply equal like reflect.DeepEqual.\n// In addition to this, this method will also dereference the input values if\n// possible so the DeepEqual performed will not fail if one parameter is a\n// pointer and the other is not.\n//\n// DeepEqual will not perform indirection of nested values of the input parameters.\nfunc DeepEqual(a, b interface{}) bool {\n\tra := reflect.Indirect(reflect.ValueOf(a))\n\trb := reflect.Indirect(reflect.ValueOf(b))\n\n\tif raValid, rbValid := ra.IsValid(), rb.IsValid(); !raValid && !rbValid {\n\t\t// If the elements are both nil, and of the same type the are equal\n\t\t// If they are of different types they are not equal\n\t\treturn reflect.TypeOf(a) == reflect.TypeOf(b)\n\t} else if raValid != rbValid {\n\t\t// Both values must be valid to be equal\n\t\treturn false\n\t}\n\n\t// Special casing for strings as typed enumerations are string aliases\n\t// but are not deep equal.\n\tif ra.Kind() == reflect.String && rb.Kind() == reflect.String {\n\t\treturn ra.String() == rb.String()\n\t}\n\n\treturn reflect.DeepEqual(ra.Interface(), rb.Interface())\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/awsutil/prettify.go",
    "content": "package awsutil\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"reflect\"\n\t\"strings\"\n)\n\n// Prettify returns the string representation of a value.\nfunc Prettify(i interface{}) string {\n\tvar buf bytes.Buffer\n\tprettify(reflect.ValueOf(i), 0, &buf)\n\treturn buf.String()\n}\n\n// prettify will recursively walk value v to build a textual\n// representation of the value.\nfunc prettify(v reflect.Value, indent int, buf *bytes.Buffer) {\n\tisPtr := false\n\tfor v.Kind() == reflect.Ptr {\n\t\tisPtr = true\n\t\tv = v.Elem()\n\t}\n\n\tswitch v.Kind() {\n\tcase reflect.Struct:\n\t\tstrtype := v.Type().String()\n\t\tif strtype == \"time.Time\" {\n\t\t\tfmt.Fprintf(buf, \"%s\", v.Interface())\n\t\t\tbreak\n\t\t} else if strings.HasPrefix(strtype, \"io.\") {\n\t\t\tbuf.WriteString(\"<buffer>\")\n\t\t\tbreak\n\t\t}\n\n\t\tif isPtr {\n\t\t\tbuf.WriteRune('&')\n\t\t}\n\t\tbuf.WriteString(\"{\\n\")\n\n\t\tnames := []string{}\n\t\tfor i := 0; i < v.Type().NumField(); i++ {\n\t\t\tname := v.Type().Field(i).Name\n\t\t\tf := v.Field(i)\n\t\t\tif name[0:1] == strings.ToLower(name[0:1]) {\n\t\t\t\tcontinue // ignore unexported fields\n\t\t\t}\n\t\t\tif (f.Kind() == reflect.Ptr || f.Kind() == reflect.Slice || f.Kind() == reflect.Map) && f.IsNil() {\n\t\t\t\tcontinue // ignore unset fields\n\t\t\t}\n\t\t\tnames = append(names, name)\n\t\t}\n\n\t\tfor i, n := range names {\n\t\t\tval := v.FieldByName(n)\n\t\t\tbuf.WriteString(strings.Repeat(\" \", indent+2))\n\t\t\tbuf.WriteString(n + \": \")\n\t\t\tprettify(val, indent+2, buf)\n\n\t\t\tif i < len(names)-1 {\n\t\t\t\tbuf.WriteString(\",\\n\")\n\t\t\t}\n\t\t}\n\n\t\tbuf.WriteString(\"\\n\" + strings.Repeat(\" \", indent) + \"}\")\n\tcase reflect.Slice:\n\t\tstrtype := v.Type().String()\n\t\tif strtype == \"[]uint8\" {\n\t\t\tfmt.Fprintf(buf, \"<binary> len %d\", v.Len())\n\t\t\tbreak\n\t\t}\n\n\t\tnl, id, id2 := \"\\n\", strings.Repeat(\" \", indent), strings.Repeat(\" \", indent+2)\n\t\tif isPtr {\n\t\t\tbuf.WriteRune('&')\n\t\t}\n\t\tbuf.WriteString(\"[\" + nl)\n\t\tfor i := 0; i < v.Len(); i++ {\n\t\t\tbuf.WriteString(id2)\n\t\t\tprettify(v.Index(i), indent+2, buf)\n\n\t\t\tif i < v.Len()-1 {\n\t\t\t\tbuf.WriteString(\",\" + nl)\n\t\t\t}\n\t\t}\n\n\t\tbuf.WriteString(nl + id + \"]\")\n\tcase reflect.Map:\n\t\tif isPtr {\n\t\t\tbuf.WriteRune('&')\n\t\t}\n\t\tbuf.WriteString(\"{\\n\")\n\n\t\tfor i, k := range v.MapKeys() {\n\t\t\tbuf.WriteString(strings.Repeat(\" \", indent+2))\n\t\t\tbuf.WriteString(k.String() + \": \")\n\t\t\tprettify(v.MapIndex(k), indent+2, buf)\n\n\t\t\tif i < v.Len()-1 {\n\t\t\t\tbuf.WriteString(\",\\n\")\n\t\t\t}\n\t\t}\n\n\t\tbuf.WriteString(\"\\n\" + strings.Repeat(\" \", indent) + \"}\")\n\tdefault:\n\t\tif !v.IsValid() {\n\t\t\tfmt.Fprint(buf, \"<invalid value>\")\n\t\t\treturn\n\t\t}\n\n\t\tfor v.Kind() == reflect.Interface && !v.IsNil() {\n\t\t\tv = v.Elem()\n\t\t}\n\n\t\tif v.Kind() == reflect.Ptr || v.Kind() == reflect.Struct || v.Kind() == reflect.Map || v.Kind() == reflect.Slice {\n\t\t\tprettify(v, indent, buf)\n\t\t\treturn\n\t\t}\n\n\t\tformat := \"%v\"\n\t\tswitch v.Interface().(type) {\n\t\tcase string:\n\t\t\tformat = \"%q\"\n\t\tcase io.ReadSeeker, io.Reader:\n\t\t\tformat = \"buffer(%p)\"\n\t\t}\n\t\tfmt.Fprintf(buf, format, v.Interface())\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/awsutil/string_value.go",
    "content": "package awsutil\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n)\n\n// StringValue returns the string representation of a value.\nfunc StringValue(i interface{}) string {\n\tvar buf bytes.Buffer\n\tstringValue(reflect.ValueOf(i), 0, &buf)\n\treturn buf.String()\n}\n\nfunc stringValue(v reflect.Value, indent int, buf *bytes.Buffer) {\n\tfor v.Kind() == reflect.Ptr {\n\t\tv = v.Elem()\n\t}\n\n\tswitch v.Kind() {\n\tcase reflect.Struct:\n\t\tbuf.WriteString(\"{\\n\")\n\n\t\tfor i := 0; i < v.Type().NumField(); i++ {\n\t\t\tft := v.Type().Field(i)\n\t\t\tfv := v.Field(i)\n\n\t\t\tif ft.Name[0:1] == strings.ToLower(ft.Name[0:1]) {\n\t\t\t\tcontinue // ignore unexported fields\n\t\t\t}\n\t\t\tif (fv.Kind() == reflect.Ptr || fv.Kind() == reflect.Slice) && fv.IsNil() {\n\t\t\t\tcontinue // ignore unset fields\n\t\t\t}\n\n\t\t\tbuf.WriteString(strings.Repeat(\" \", indent+2))\n\t\t\tbuf.WriteString(ft.Name + \": \")\n\n\t\t\tif tag := ft.Tag.Get(\"sensitive\"); tag == \"true\" {\n\t\t\t\tbuf.WriteString(\"<sensitive>\")\n\t\t\t} else {\n\t\t\t\tstringValue(fv, indent+2, buf)\n\t\t\t}\n\n\t\t\tbuf.WriteString(\",\\n\")\n\t\t}\n\n\t\tbuf.WriteString(\"\\n\" + strings.Repeat(\" \", indent) + \"}\")\n\tcase reflect.Slice:\n\t\tnl, id, id2 := \"\", \"\", \"\"\n\t\tif v.Len() > 3 {\n\t\t\tnl, id, id2 = \"\\n\", strings.Repeat(\" \", indent), strings.Repeat(\" \", indent+2)\n\t\t}\n\t\tbuf.WriteString(\"[\" + nl)\n\t\tfor i := 0; i < v.Len(); i++ {\n\t\t\tbuf.WriteString(id2)\n\t\t\tstringValue(v.Index(i), indent+2, buf)\n\n\t\t\tif i < v.Len()-1 {\n\t\t\t\tbuf.WriteString(\",\" + nl)\n\t\t\t}\n\t\t}\n\n\t\tbuf.WriteString(nl + id + \"]\")\n\tcase reflect.Map:\n\t\tbuf.WriteString(\"{\\n\")\n\n\t\tfor i, k := range v.MapKeys() {\n\t\t\tbuf.WriteString(strings.Repeat(\" \", indent+2))\n\t\t\tbuf.WriteString(k.String() + \": \")\n\t\t\tstringValue(v.MapIndex(k), indent+2, buf)\n\n\t\t\tif i < v.Len()-1 {\n\t\t\t\tbuf.WriteString(\",\\n\")\n\t\t\t}\n\t\t}\n\n\t\tbuf.WriteString(\"\\n\" + strings.Repeat(\" \", indent) + \"}\")\n\tdefault:\n\t\tformat := \"%v\"\n\t\tswitch v.Interface().(type) {\n\t\tcase string:\n\t\t\tformat = \"%q\"\n\t\t}\n\t\tfmt.Fprintf(buf, format, v.Interface())\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md",
    "content": "# v1.3.34 (2025-02-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.33 (2025-02-18)\n\n* **Bug Fix**: Bump go version to 1.22\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.32 (2025-02-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.31 (2025-01-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.30 (2025-01-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.29 (2025-01-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n* **Dependency Update**: Upgrade to smithy-go v1.22.2.\n\n# v1.3.28 (2025-01-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.27 (2025-01-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.26 (2024-12-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.25 (2024-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.24 (2024-11-18)\n\n* **Dependency Update**: Update to smithy-go v1.22.1.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.23 (2024-11-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.22 (2024-10-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.21 (2024-10-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.20 (2024-10-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.19 (2024-10-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.18 (2024-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.17 (2024-09-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.16 (2024-08-15)\n\n* **Dependency Update**: Bump minimum Go version to 1.21.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.15 (2024-07-10.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.14 (2024-07-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.13 (2024-06-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.12 (2024-06-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.11 (2024-06-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.10 (2024-06-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.9 (2024-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.8 (2024-06-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.7 (2024-05-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.6 (2024-05-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.5 (2024-03-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.4 (2024-03-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.3 (2024-03-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.2 (2024-02-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.1 (2024-02-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.0 (2024-02-13)\n\n* **Feature**: Bump minimum Go version to 1.20 per our language support policy.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.10 (2024-01-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.9 (2023-12-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.8 (2023-12-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.7 (2023-11-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.6 (2023-11-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.5 (2023-11-28.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.4 (2023-11-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.3 (2023-11-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.2 (2023-11-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.1 (2023-11-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.0 (2023-10-31)\n\n* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.43 (2023-10-12)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.42 (2023-10-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.41 (2023-08-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.40 (2023-08-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.39 (2023-08-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.38 (2023-08-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.37 (2023-07-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.36 (2023-07-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.35 (2023-07-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.34 (2023-06-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.33 (2023-04-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.32 (2023-04-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.31 (2023-03-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.30 (2023-03-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.29 (2023-02-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.28 (2023-02-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.27 (2022-12-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.26 (2022-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.25 (2022-10-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.24 (2022-10-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.23 (2022-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.22 (2022-09-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.21 (2022-09-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.20 (2022-08-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.19 (2022-08-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.18 (2022-08-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.17 (2022-08-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.16 (2022-08-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.15 (2022-08-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.14 (2022-07-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.13 (2022-06-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.12 (2022-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.11 (2022-05-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.10 (2022-04-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.9 (2022-03-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.8 (2022-03-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.7 (2022-03-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.6 (2022-03-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.5 (2022-02-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.4 (2022-01-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.3 (2022-01-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.2 (2021-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.1 (2021-11-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.0 (2021-11-06)\n\n* **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.7 (2021-10-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.6 (2021-10-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.5 (2021-09-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.4 (2021-08-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.3 (2021-08-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.2 (2021-08-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.1 (2021-07-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.0 (2021-06-25)\n\n* **Release**: Release new modules\n* **Dependency Update**: Updated to the latest SDK module versions\n\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/config.go",
    "content": "package configsources\n\nimport (\n\t\"context\"\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n)\n\n// EnableEndpointDiscoveryProvider is an interface for retrieving external configuration value\n// for Enable Endpoint Discovery\ntype EnableEndpointDiscoveryProvider interface {\n\tGetEnableEndpointDiscovery(ctx context.Context) (value aws.EndpointDiscoveryEnableState, found bool, err error)\n}\n\n// ResolveEnableEndpointDiscovery extracts the first instance of a EnableEndpointDiscoveryProvider from the config slice.\n// Additionally returns a aws.EndpointDiscoveryEnableState to indicate if the value was found in provided configs,\n// and error if one is encountered.\nfunc ResolveEnableEndpointDiscovery(ctx context.Context, configs []interface{}) (value aws.EndpointDiscoveryEnableState, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(EnableEndpointDiscoveryProvider); ok {\n\t\t\tvalue, found, err = p.GetEnableEndpointDiscovery(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// UseDualStackEndpointProvider is an interface for retrieving external configuration values for UseDualStackEndpoint\ntype UseDualStackEndpointProvider interface {\n\tGetUseDualStackEndpoint(context.Context) (value aws.DualStackEndpointState, found bool, err error)\n}\n\n// ResolveUseDualStackEndpoint extracts the first instance of a UseDualStackEndpoint from the config slice.\n// Additionally returns a boolean to indicate if the value was found in provided configs, and error if one is encountered.\nfunc ResolveUseDualStackEndpoint(ctx context.Context, configs []interface{}) (value aws.DualStackEndpointState, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(UseDualStackEndpointProvider); ok {\n\t\t\tvalue, found, err = p.GetUseDualStackEndpoint(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// UseFIPSEndpointProvider is an interface for retrieving external configuration values for UseFIPSEndpoint\ntype UseFIPSEndpointProvider interface {\n\tGetUseFIPSEndpoint(context.Context) (value aws.FIPSEndpointState, found bool, err error)\n}\n\n// ResolveUseFIPSEndpoint extracts the first instance of a UseFIPSEndpointProvider from the config slice.\n// Additionally, returns a boolean to indicate if the value was found in provided configs, and error if one is encountered.\nfunc ResolveUseFIPSEndpoint(ctx context.Context, configs []interface{}) (value aws.FIPSEndpointState, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(UseFIPSEndpointProvider); ok {\n\t\t\tvalue, found, err = p.GetUseFIPSEndpoint(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/endpoints.go",
    "content": "package configsources\n\nimport (\n\t\"context\"\n)\n\n// ServiceBaseEndpointProvider is needed to search for all providers\n// that provide a configured service endpoint\ntype ServiceBaseEndpointProvider interface {\n\tGetServiceBaseEndpoint(ctx context.Context, sdkID string) (string, bool, error)\n}\n\n// IgnoreConfiguredEndpointsProvider is needed to search for all providers\n// that provide a flag to disable configured endpoints.\n//\n// Currently duplicated from github.com/aws/aws-sdk-go-v2/config because\n// service packages cannot import github.com/aws/aws-sdk-go-v2/config\n// due to result import cycle error.\ntype IgnoreConfiguredEndpointsProvider interface {\n\tGetIgnoreConfiguredEndpoints(ctx context.Context) (bool, bool, error)\n}\n\n// GetIgnoreConfiguredEndpoints is used in knowing when to disable configured\n// endpoints feature.\n//\n// Currently duplicated from github.com/aws/aws-sdk-go-v2/config because\n// service packages cannot import github.com/aws/aws-sdk-go-v2/config\n// due to result import cycle error.\nfunc GetIgnoreConfiguredEndpoints(ctx context.Context, configs []interface{}) (value bool, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(IgnoreConfiguredEndpointsProvider); ok {\n\t\t\tvalue, found, err = p.GetIgnoreConfiguredEndpoints(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// ResolveServiceBaseEndpoint is used to retrieve service endpoints from configured sources\n// while allowing for configured endpoints to be disabled\nfunc ResolveServiceBaseEndpoint(ctx context.Context, sdkID string, configs []interface{}) (value string, found bool, err error) {\n\tif val, found, _ := GetIgnoreConfiguredEndpoints(ctx, configs); found && val {\n\t\treturn \"\", false, nil\n\t}\n\n\tfor _, cs := range configs {\n\t\tif p, ok := cs.(ServiceBaseEndpointProvider); ok {\n\t\t\tvalue, found, err = p.GetServiceBaseEndpoint(context.Background(), sdkID)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go",
    "content": "// Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT.\n\npackage configsources\n\n// goModuleVersion is the tagged release for this module\nconst goModuleVersion = \"1.3.34\"\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/context/context.go",
    "content": "package context\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\ntype s3BackendKey struct{}\ntype checksumInputAlgorithmKey struct{}\ntype clockSkew struct{}\n\nconst (\n\t// S3BackendS3Express identifies the S3Express backend\n\tS3BackendS3Express = \"S3Express\"\n)\n\n// SetS3Backend stores the resolved endpoint backend within the request\n// context, which is required for a variety of custom S3 behaviors.\nfunc SetS3Backend(ctx context.Context, typ string) context.Context {\n\treturn middleware.WithStackValue(ctx, s3BackendKey{}, typ)\n}\n\n// GetS3Backend retrieves the stored endpoint backend within the context.\nfunc GetS3Backend(ctx context.Context) string {\n\tv, _ := middleware.GetStackValue(ctx, s3BackendKey{}).(string)\n\treturn v\n}\n\n// SetChecksumInputAlgorithm sets the request checksum algorithm on the\n// context.\nfunc SetChecksumInputAlgorithm(ctx context.Context, value string) context.Context {\n\treturn middleware.WithStackValue(ctx, checksumInputAlgorithmKey{}, value)\n}\n\n// GetChecksumInputAlgorithm returns the checksum algorithm from the context.\nfunc GetChecksumInputAlgorithm(ctx context.Context) string {\n\tv, _ := middleware.GetStackValue(ctx, checksumInputAlgorithmKey{}).(string)\n\treturn v\n}\n\n// SetAttemptSkewContext sets the clock skew value on the context\nfunc SetAttemptSkewContext(ctx context.Context, v time.Duration) context.Context {\n\treturn middleware.WithStackValue(ctx, clockSkew{}, v)\n}\n\n// GetAttemptSkewContext gets the clock skew value from the context\nfunc GetAttemptSkewContext(ctx context.Context) time.Duration {\n\tx, _ := middleware.GetStackValue(ctx, clockSkew{}).(time.Duration)\n\treturn x\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/arn.go",
    "content": "package awsrulesfn\n\nimport (\n\t\"strings\"\n)\n\n// ARN provides AWS ARN components broken out into a data structure.\ntype ARN struct {\n\tPartition  string\n\tService    string\n\tRegion     string\n\tAccountId  string\n\tResourceId OptionalStringSlice\n}\n\nconst (\n\tarnDelimiters      = \":\"\n\tresourceDelimiters = \"/:\"\n\tarnSections        = 6\n\tarnPrefix          = \"arn:\"\n\n\t// zero-indexed\n\tsectionPartition = 1\n\tsectionService   = 2\n\tsectionRegion    = 3\n\tsectionAccountID = 4\n\tsectionResource  = 5\n)\n\n// ParseARN returns an [ARN] value parsed from the input string provided. If\n// the ARN cannot be parsed nil will be returned, and error added to\n// [ErrorCollector].\nfunc ParseARN(input string) *ARN {\n\tif !strings.HasPrefix(input, arnPrefix) {\n\t\treturn nil\n\t}\n\n\tsections := strings.SplitN(input, arnDelimiters, arnSections)\n\tif numSections := len(sections); numSections != arnSections {\n\t\treturn nil\n\t}\n\n\tif sections[sectionPartition] == \"\" {\n\t\treturn nil\n\t}\n\tif sections[sectionService] == \"\" {\n\t\treturn nil\n\t}\n\tif sections[sectionResource] == \"\" {\n\t\treturn nil\n\t}\n\n\treturn &ARN{\n\t\tPartition:  sections[sectionPartition],\n\t\tService:    sections[sectionService],\n\t\tRegion:     sections[sectionRegion],\n\t\tAccountId:  sections[sectionAccountID],\n\t\tResourceId: splitResource(sections[sectionResource]),\n\t}\n}\n\n// splitResource splits the resource components by the ARN resource delimiters.\nfunc splitResource(v string) []string {\n\tvar parts []string\n\tvar offset int\n\n\tfor offset <= len(v) {\n\t\tidx := strings.IndexAny(v[offset:], \"/:\")\n\t\tif idx < 0 {\n\t\t\tparts = append(parts, v[offset:])\n\t\t\tbreak\n\t\t}\n\t\tparts = append(parts, v[offset:idx+offset])\n\t\toffset += idx + 1\n\t}\n\n\treturn parts\n}\n\n// OptionalStringSlice provides a helper to safely get the index of a string\n// slice that may be out of bounds. Returns pointer to string if index is\n// valid. Otherwise returns nil.\ntype OptionalStringSlice []string\n\n// Get returns a string pointer of the string at index i if the index is valid.\n// Otherwise returns nil.\nfunc (s OptionalStringSlice) Get(i int) *string {\n\tif i < 0 || i >= len(s) {\n\t\treturn nil\n\t}\n\n\tv := s[i]\n\treturn &v\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/doc.go",
    "content": "// Package awsrulesfn provides AWS focused endpoint rule functions for\n// evaluating endpoint resolution rules.\npackage awsrulesfn\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/generate.go",
    "content": "//go:build codegen\n// +build codegen\n\npackage awsrulesfn\n\n//go:generate go run -tags codegen ./internal/partition/codegen.go -model partitions.json -output partitions.go\n//go:generate gofmt -w -s .\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/host.go",
    "content": "package awsrulesfn\n\nimport (\n\t\"net\"\n\t\"strings\"\n\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// IsVirtualHostableS3Bucket returns if the input is a DNS compatible bucket\n// name and can be used with Amazon S3 virtual hosted style addressing. Similar\n// to [rulesfn.IsValidHostLabel] with the added restriction that the length of label\n// must be [3:63] characters long, all lowercase, and not formatted as an IP\n// address.\nfunc IsVirtualHostableS3Bucket(input string, allowSubDomains bool) bool {\n\t// input should not be formatted as an IP address\n\t// NOTE: this will technically trip up on IPv6 hosts with zone IDs, but\n\t// validation further down will catch that anyway (it's guaranteed to have\n\t// unfriendly characters % and : if that's the case)\n\tif net.ParseIP(input) != nil {\n\t\treturn false\n\t}\n\n\tvar labels []string\n\tif allowSubDomains {\n\t\tlabels = strings.Split(input, \".\")\n\t} else {\n\t\tlabels = []string{input}\n\t}\n\n\tfor _, label := range labels {\n\t\t// validate special length constraints\n\t\tif l := len(label); l < 3 || l > 63 {\n\t\t\treturn false\n\t\t}\n\n\t\t// Validate no capital letters\n\t\tfor _, r := range label {\n\t\t\tif r >= 'A' && r <= 'Z' {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\t// Validate valid host label\n\t\tif !smithyhttp.ValidHostLabel(label) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partition.go",
    "content": "package awsrulesfn\n\nimport \"regexp\"\n\n// Partition provides the metadata describing an AWS partition.\ntype Partition struct {\n\tID            string                     `json:\"id\"`\n\tRegions       map[string]RegionOverrides `json:\"regions\"`\n\tRegionRegex   string                     `json:\"regionRegex\"`\n\tDefaultConfig PartitionConfig            `json:\"outputs\"`\n}\n\n// PartitionConfig provides the endpoint metadata for an AWS region or partition.\ntype PartitionConfig struct {\n\tName                 string `json:\"name\"`\n\tDnsSuffix            string `json:\"dnsSuffix\"`\n\tDualStackDnsSuffix   string `json:\"dualStackDnsSuffix\"`\n\tSupportsFIPS         bool   `json:\"supportsFIPS\"`\n\tSupportsDualStack    bool   `json:\"supportsDualStack\"`\n\tImplicitGlobalRegion string `json:\"implicitGlobalRegion\"`\n}\n\ntype RegionOverrides struct {\n\tName               *string `json:\"name\"`\n\tDnsSuffix          *string `json:\"dnsSuffix\"`\n\tDualStackDnsSuffix *string `json:\"dualStackDnsSuffix\"`\n\tSupportsFIPS       *bool   `json:\"supportsFIPS\"`\n\tSupportsDualStack  *bool   `json:\"supportsDualStack\"`\n}\n\nconst defaultPartition = \"aws\"\n\nfunc getPartition(partitions []Partition, region string) *PartitionConfig {\n\tfor _, partition := range partitions {\n\t\tif v, ok := partition.Regions[region]; ok {\n\t\t\tp := mergeOverrides(partition.DefaultConfig, v)\n\t\t\treturn &p\n\t\t}\n\t}\n\n\tfor _, partition := range partitions {\n\t\tregionRegex := regexp.MustCompile(partition.RegionRegex)\n\t\tif regionRegex.MatchString(region) {\n\t\t\tv := partition.DefaultConfig\n\t\t\treturn &v\n\t\t}\n\t}\n\n\tfor _, partition := range partitions {\n\t\tif partition.ID == defaultPartition {\n\t\t\tv := partition.DefaultConfig\n\t\t\treturn &v\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc mergeOverrides(into PartitionConfig, from RegionOverrides) PartitionConfig {\n\tif from.Name != nil {\n\t\tinto.Name = *from.Name\n\t}\n\tif from.DnsSuffix != nil {\n\t\tinto.DnsSuffix = *from.DnsSuffix\n\t}\n\tif from.DualStackDnsSuffix != nil {\n\t\tinto.DualStackDnsSuffix = *from.DualStackDnsSuffix\n\t}\n\tif from.SupportsFIPS != nil {\n\t\tinto.SupportsFIPS = *from.SupportsFIPS\n\t}\n\tif from.SupportsDualStack != nil {\n\t\tinto.SupportsDualStack = *from.SupportsDualStack\n\t}\n\treturn into\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partitions.go",
    "content": "// Code generated by endpoint/awsrulesfn/internal/partition. DO NOT EDIT.\n\npackage awsrulesfn\n\n// GetPartition returns an AWS [Partition] for the region provided. If the\n// partition cannot be determined nil will be returned.\nfunc GetPartition(region string) *PartitionConfig {\n\treturn getPartition(partitions, region)\n}\n\nvar partitions = []Partition{\n\t{\n\t\tID:          \"aws\",\n\t\tRegionRegex: \"^(us|eu|ap|sa|ca|me|af|il)\\\\-\\\\w+\\\\-\\\\d+$\",\n\t\tDefaultConfig: PartitionConfig{\n\t\t\tName:                 \"aws\",\n\t\t\tDnsSuffix:            \"amazonaws.com\",\n\t\t\tDualStackDnsSuffix:   \"api.aws\",\n\t\t\tSupportsFIPS:         true,\n\t\t\tSupportsDualStack:    true,\n\t\t\tImplicitGlobalRegion: \"us-east-1\",\n\t\t},\n\t\tRegions: map[string]RegionOverrides{\n\t\t\t\"af-south-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"ap-east-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"ap-northeast-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"ap-northeast-2\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"ap-northeast-3\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"ap-south-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"ap-south-2\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"ap-southeast-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"ap-southeast-2\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"ap-southeast-3\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"ap-southeast-4\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"aws-global\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"ca-central-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"ca-west-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"eu-central-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"eu-central-2\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"eu-north-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"eu-south-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"eu-south-2\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"eu-west-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"eu-west-2\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"eu-west-3\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"il-central-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"me-central-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"me-south-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"sa-east-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"us-east-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"us-east-2\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"us-west-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"us-west-2\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tID:          \"aws-cn\",\n\t\tRegionRegex: \"^cn\\\\-\\\\w+\\\\-\\\\d+$\",\n\t\tDefaultConfig: PartitionConfig{\n\t\t\tName:                 \"aws-cn\",\n\t\t\tDnsSuffix:            \"amazonaws.com.cn\",\n\t\t\tDualStackDnsSuffix:   \"api.amazonwebservices.com.cn\",\n\t\t\tSupportsFIPS:         true,\n\t\t\tSupportsDualStack:    true,\n\t\t\tImplicitGlobalRegion: \"cn-northwest-1\",\n\t\t},\n\t\tRegions: map[string]RegionOverrides{\n\t\t\t\"aws-cn-global\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"cn-north-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"cn-northwest-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tID:          \"aws-us-gov\",\n\t\tRegionRegex: \"^us\\\\-gov\\\\-\\\\w+\\\\-\\\\d+$\",\n\t\tDefaultConfig: PartitionConfig{\n\t\t\tName:                 \"aws-us-gov\",\n\t\t\tDnsSuffix:            \"amazonaws.com\",\n\t\t\tDualStackDnsSuffix:   \"api.aws\",\n\t\t\tSupportsFIPS:         true,\n\t\t\tSupportsDualStack:    true,\n\t\t\tImplicitGlobalRegion: \"us-gov-west-1\",\n\t\t},\n\t\tRegions: map[string]RegionOverrides{\n\t\t\t\"aws-us-gov-global\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"us-gov-east-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"us-gov-west-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tID:          \"aws-iso\",\n\t\tRegionRegex: \"^us\\\\-iso\\\\-\\\\w+\\\\-\\\\d+$\",\n\t\tDefaultConfig: PartitionConfig{\n\t\t\tName:                 \"aws-iso\",\n\t\t\tDnsSuffix:            \"c2s.ic.gov\",\n\t\t\tDualStackDnsSuffix:   \"c2s.ic.gov\",\n\t\t\tSupportsFIPS:         true,\n\t\t\tSupportsDualStack:    false,\n\t\t\tImplicitGlobalRegion: \"us-iso-east-1\",\n\t\t},\n\t\tRegions: map[string]RegionOverrides{\n\t\t\t\"aws-iso-global\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"us-iso-east-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"us-iso-west-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tID:          \"aws-iso-b\",\n\t\tRegionRegex: \"^us\\\\-isob\\\\-\\\\w+\\\\-\\\\d+$\",\n\t\tDefaultConfig: PartitionConfig{\n\t\t\tName:                 \"aws-iso-b\",\n\t\t\tDnsSuffix:            \"sc2s.sgov.gov\",\n\t\t\tDualStackDnsSuffix:   \"sc2s.sgov.gov\",\n\t\t\tSupportsFIPS:         true,\n\t\t\tSupportsDualStack:    false,\n\t\t\tImplicitGlobalRegion: \"us-isob-east-1\",\n\t\t},\n\t\tRegions: map[string]RegionOverrides{\n\t\t\t\"aws-iso-b-global\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t\t\"us-isob-east-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tID:          \"aws-iso-e\",\n\t\tRegionRegex: \"^eu\\\\-isoe\\\\-\\\\w+\\\\-\\\\d+$\",\n\t\tDefaultConfig: PartitionConfig{\n\t\t\tName:                 \"aws-iso-e\",\n\t\t\tDnsSuffix:            \"cloud.adc-e.uk\",\n\t\t\tDualStackDnsSuffix:   \"cloud.adc-e.uk\",\n\t\t\tSupportsFIPS:         true,\n\t\t\tSupportsDualStack:    false,\n\t\t\tImplicitGlobalRegion: \"eu-isoe-west-1\",\n\t\t},\n\t\tRegions: map[string]RegionOverrides{\n\t\t\t\"eu-isoe-west-1\": {\n\t\t\t\tName:               nil,\n\t\t\t\tDnsSuffix:          nil,\n\t\t\t\tDualStackDnsSuffix: nil,\n\t\t\t\tSupportsFIPS:       nil,\n\t\t\t\tSupportsDualStack:  nil,\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tID:          \"aws-iso-f\",\n\t\tRegionRegex: \"^us\\\\-isof\\\\-\\\\w+\\\\-\\\\d+$\",\n\t\tDefaultConfig: PartitionConfig{\n\t\t\tName:                 \"aws-iso-f\",\n\t\t\tDnsSuffix:            \"csp.hci.ic.gov\",\n\t\t\tDualStackDnsSuffix:   \"csp.hci.ic.gov\",\n\t\t\tSupportsFIPS:         true,\n\t\t\tSupportsDualStack:    false,\n\t\t\tImplicitGlobalRegion: \"us-isof-south-1\",\n\t\t},\n\t\tRegions: map[string]RegionOverrides{},\n\t},\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partitions.json",
    "content": "{\n  \"partitions\" : [ {\n    \"id\" : \"aws\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"amazonaws.com\",\n      \"dualStackDnsSuffix\" : \"api.aws\",\n      \"implicitGlobalRegion\" : \"us-east-1\",\n      \"name\" : \"aws\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^(us|eu|ap|sa|ca|me|af|il|mx)\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"af-south-1\" : {\n        \"description\" : \"Africa (Cape Town)\"\n      },\n      \"ap-east-1\" : {\n        \"description\" : \"Asia Pacific (Hong Kong)\"\n      },\n      \"ap-northeast-1\" : {\n        \"description\" : \"Asia Pacific (Tokyo)\"\n      },\n      \"ap-northeast-2\" : {\n        \"description\" : \"Asia Pacific (Seoul)\"\n      },\n      \"ap-northeast-3\" : {\n        \"description\" : \"Asia Pacific (Osaka)\"\n      },\n      \"ap-south-1\" : {\n        \"description\" : \"Asia Pacific (Mumbai)\"\n      },\n      \"ap-south-2\" : {\n        \"description\" : \"Asia Pacific (Hyderabad)\"\n      },\n      \"ap-southeast-1\" : {\n        \"description\" : \"Asia Pacific (Singapore)\"\n      },\n      \"ap-southeast-2\" : {\n        \"description\" : \"Asia Pacific (Sydney)\"\n      },\n      \"ap-southeast-3\" : {\n        \"description\" : \"Asia Pacific (Jakarta)\"\n      },\n      \"ap-southeast-4\" : {\n        \"description\" : \"Asia Pacific (Melbourne)\"\n      },\n      \"ap-southeast-5\" : {\n        \"description\" : \"Asia Pacific (Malaysia)\"\n      },\n      \"ap-southeast-7\" : {\n        \"description\" : \"Asia Pacific (Thailand)\"\n      },\n      \"aws-global\" : {\n        \"description\" : \"AWS Standard global region\"\n      },\n      \"ca-central-1\" : {\n        \"description\" : \"Canada (Central)\"\n      },\n      \"ca-west-1\" : {\n        \"description\" : \"Canada West (Calgary)\"\n      },\n      \"eu-central-1\" : {\n        \"description\" : \"Europe (Frankfurt)\"\n      },\n      \"eu-central-2\" : {\n        \"description\" : \"Europe (Zurich)\"\n      },\n      \"eu-north-1\" : {\n        \"description\" : \"Europe (Stockholm)\"\n      },\n      \"eu-south-1\" : {\n        \"description\" : \"Europe (Milan)\"\n      },\n      \"eu-south-2\" : {\n        \"description\" : \"Europe (Spain)\"\n      },\n      \"eu-west-1\" : {\n        \"description\" : \"Europe (Ireland)\"\n      },\n      \"eu-west-2\" : {\n        \"description\" : \"Europe (London)\"\n      },\n      \"eu-west-3\" : {\n        \"description\" : \"Europe (Paris)\"\n      },\n      \"il-central-1\" : {\n        \"description\" : \"Israel (Tel Aviv)\"\n      },\n      \"me-central-1\" : {\n        \"description\" : \"Middle East (UAE)\"\n      },\n      \"me-south-1\" : {\n        \"description\" : \"Middle East (Bahrain)\"\n      },\n      \"mx-central-1\" : {\n        \"description\" : \"Mexico (Central)\"\n      },\n      \"sa-east-1\" : {\n        \"description\" : \"South America (Sao Paulo)\"\n      },\n      \"us-east-1\" : {\n        \"description\" : \"US East (N. Virginia)\"\n      },\n      \"us-east-2\" : {\n        \"description\" : \"US East (Ohio)\"\n      },\n      \"us-west-1\" : {\n        \"description\" : \"US West (N. California)\"\n      },\n      \"us-west-2\" : {\n        \"description\" : \"US West (Oregon)\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-cn\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"amazonaws.com.cn\",\n      \"dualStackDnsSuffix\" : \"api.amazonwebservices.com.cn\",\n      \"implicitGlobalRegion\" : \"cn-northwest-1\",\n      \"name\" : \"aws-cn\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^cn\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"aws-cn-global\" : {\n        \"description\" : \"AWS China global region\"\n      },\n      \"cn-north-1\" : {\n        \"description\" : \"China (Beijing)\"\n      },\n      \"cn-northwest-1\" : {\n        \"description\" : \"China (Ningxia)\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-us-gov\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"amazonaws.com\",\n      \"dualStackDnsSuffix\" : \"api.aws\",\n      \"implicitGlobalRegion\" : \"us-gov-west-1\",\n      \"name\" : \"aws-us-gov\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^us\\\\-gov\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"aws-us-gov-global\" : {\n        \"description\" : \"AWS GovCloud (US) global region\"\n      },\n      \"us-gov-east-1\" : {\n        \"description\" : \"AWS GovCloud (US-East)\"\n      },\n      \"us-gov-west-1\" : {\n        \"description\" : \"AWS GovCloud (US-West)\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-iso\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"c2s.ic.gov\",\n      \"dualStackDnsSuffix\" : \"c2s.ic.gov\",\n      \"implicitGlobalRegion\" : \"us-iso-east-1\",\n      \"name\" : \"aws-iso\",\n      \"supportsDualStack\" : false,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^us\\\\-iso\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"aws-iso-global\" : {\n        \"description\" : \"AWS ISO (US) global region\"\n      },\n      \"us-iso-east-1\" : {\n        \"description\" : \"US ISO East\"\n      },\n      \"us-iso-west-1\" : {\n        \"description\" : \"US ISO WEST\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-iso-b\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"sc2s.sgov.gov\",\n      \"dualStackDnsSuffix\" : \"sc2s.sgov.gov\",\n      \"implicitGlobalRegion\" : \"us-isob-east-1\",\n      \"name\" : \"aws-iso-b\",\n      \"supportsDualStack\" : false,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^us\\\\-isob\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"aws-iso-b-global\" : {\n        \"description\" : \"AWS ISOB (US) global region\"\n      },\n      \"us-isob-east-1\" : {\n        \"description\" : \"US ISOB East (Ohio)\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-iso-e\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"cloud.adc-e.uk\",\n      \"dualStackDnsSuffix\" : \"cloud.adc-e.uk\",\n      \"implicitGlobalRegion\" : \"eu-isoe-west-1\",\n      \"name\" : \"aws-iso-e\",\n      \"supportsDualStack\" : false,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^eu\\\\-isoe\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"eu-isoe-west-1\" : {\n        \"description\" : \"EU ISOE West\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-iso-f\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"csp.hci.ic.gov\",\n      \"dualStackDnsSuffix\" : \"csp.hci.ic.gov\",\n      \"implicitGlobalRegion\" : \"us-isof-south-1\",\n      \"name\" : \"aws-iso-f\",\n      \"supportsDualStack\" : false,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^us\\\\-isof\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"aws-iso-f-global\" : {\n        \"description\" : \"AWS ISOF global region\"\n      },\n      \"us-isof-east-1\" : {\n        \"description\" : \"US ISOF EAST\"\n      },\n      \"us-isof-south-1\" : {\n        \"description\" : \"US ISOF SOUTH\"\n      }\n    }\n  } ],\n  \"version\" : \"1.1\"\n}"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/endpoints.go",
    "content": "package endpoints\n\nimport (\n\t\"fmt\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n)\n\nconst (\n\tdefaultProtocol = \"https\"\n\tdefaultSigner   = \"v4\"\n)\n\nvar (\n\tprotocolPriority = []string{\"https\", \"http\"}\n\tsignerPriority   = []string{\"v4\"}\n)\n\n// Options provide configuration needed to direct how endpoints are resolved.\ntype Options struct {\n\t// Disable usage of HTTPS (TLS / SSL)\n\tDisableHTTPS bool\n}\n\n// Partitions is a slice of partition\ntype Partitions []Partition\n\n// ResolveEndpoint resolves a service endpoint for the given region and options.\nfunc (ps Partitions) ResolveEndpoint(region string, opts Options) (aws.Endpoint, error) {\n\tif len(ps) == 0 {\n\t\treturn aws.Endpoint{}, fmt.Errorf(\"no partitions found\")\n\t}\n\n\tfor i := 0; i < len(ps); i++ {\n\t\tif !ps[i].canResolveEndpoint(region) {\n\t\t\tcontinue\n\t\t}\n\n\t\treturn ps[i].ResolveEndpoint(region, opts)\n\t}\n\n\t// fallback to first partition format to use when resolving the endpoint.\n\treturn ps[0].ResolveEndpoint(region, opts)\n}\n\n// Partition is an AWS partition description for a service and its' region endpoints.\ntype Partition struct {\n\tID                string\n\tRegionRegex       *regexp.Regexp\n\tPartitionEndpoint string\n\tIsRegionalized    bool\n\tDefaults          Endpoint\n\tEndpoints         Endpoints\n}\n\nfunc (p Partition) canResolveEndpoint(region string) bool {\n\t_, ok := p.Endpoints[region]\n\treturn ok || p.RegionRegex.MatchString(region)\n}\n\n// ResolveEndpoint resolves and service endpoint for the given region and options.\nfunc (p Partition) ResolveEndpoint(region string, options Options) (resolved aws.Endpoint, err error) {\n\tif len(region) == 0 && len(p.PartitionEndpoint) != 0 {\n\t\tregion = p.PartitionEndpoint\n\t}\n\n\te, _ := p.endpointForRegion(region)\n\n\treturn e.resolve(p.ID, region, p.Defaults, options), nil\n}\n\nfunc (p Partition) endpointForRegion(region string) (Endpoint, bool) {\n\tif e, ok := p.Endpoints[region]; ok {\n\t\treturn e, true\n\t}\n\n\tif !p.IsRegionalized {\n\t\treturn p.Endpoints[p.PartitionEndpoint], region == p.PartitionEndpoint\n\t}\n\n\t// Unable to find any matching endpoint, return\n\t// blank that will be used for generic endpoint creation.\n\treturn Endpoint{}, false\n}\n\n// Endpoints is a map of service config regions to endpoints\ntype Endpoints map[string]Endpoint\n\n// CredentialScope is the credential scope of a region and service\ntype CredentialScope struct {\n\tRegion  string\n\tService string\n}\n\n// Endpoint is a service endpoint description\ntype Endpoint struct {\n\t// True if the endpoint cannot be resolved for this partition/region/service\n\tUnresolveable aws.Ternary\n\n\tHostname  string\n\tProtocols []string\n\n\tCredentialScope CredentialScope\n\n\tSignatureVersions []string `json:\"signatureVersions\"`\n}\n\nfunc (e Endpoint) resolve(partition, region string, def Endpoint, options Options) aws.Endpoint {\n\tvar merged Endpoint\n\tmerged.mergeIn(def)\n\tmerged.mergeIn(e)\n\te = merged\n\n\tvar u string\n\tif e.Unresolveable != aws.TrueTernary {\n\t\t// Only attempt to resolve the endpoint if it can be resolved.\n\t\thostname := strings.Replace(e.Hostname, \"{region}\", region, 1)\n\n\t\tscheme := getEndpointScheme(e.Protocols, options.DisableHTTPS)\n\t\tu = scheme + \"://\" + hostname\n\t}\n\n\tsigningRegion := e.CredentialScope.Region\n\tif len(signingRegion) == 0 {\n\t\tsigningRegion = region\n\t}\n\tsigningName := e.CredentialScope.Service\n\n\treturn aws.Endpoint{\n\t\tURL:           u,\n\t\tPartitionID:   partition,\n\t\tSigningRegion: signingRegion,\n\t\tSigningName:   signingName,\n\t\tSigningMethod: getByPriority(e.SignatureVersions, signerPriority, defaultSigner),\n\t}\n}\n\nfunc (e *Endpoint) mergeIn(other Endpoint) {\n\tif other.Unresolveable != aws.UnknownTernary {\n\t\te.Unresolveable = other.Unresolveable\n\t}\n\tif len(other.Hostname) > 0 {\n\t\te.Hostname = other.Hostname\n\t}\n\tif len(other.Protocols) > 0 {\n\t\te.Protocols = other.Protocols\n\t}\n\tif len(other.CredentialScope.Region) > 0 {\n\t\te.CredentialScope.Region = other.CredentialScope.Region\n\t}\n\tif len(other.CredentialScope.Service) > 0 {\n\t\te.CredentialScope.Service = other.CredentialScope.Service\n\t}\n\tif len(other.SignatureVersions) > 0 {\n\t\te.SignatureVersions = other.SignatureVersions\n\t}\n}\n\nfunc getEndpointScheme(protocols []string, disableHTTPS bool) string {\n\tif disableHTTPS {\n\t\treturn \"http\"\n\t}\n\n\treturn getByPriority(protocols, protocolPriority, defaultProtocol)\n}\n\nfunc getByPriority(s []string, p []string, def string) string {\n\tif len(s) == 0 {\n\t\treturn def\n\t}\n\n\tfor i := 0; i < len(p); i++ {\n\t\tfor j := 0; j < len(s); j++ {\n\t\t\tif s[j] == p[i] {\n\t\t\t\treturn s[j]\n\t\t\t}\n\t\t}\n\t}\n\n\treturn s[0]\n}\n\n// MapFIPSRegion extracts the intrinsic AWS region from one that may have an\n// embedded FIPS microformat.\nfunc MapFIPSRegion(region string) string {\n\tconst fipsInfix = \"-fips-\"\n\tconst fipsPrefix = \"fips-\"\n\tconst fipsSuffix = \"-fips\"\n\n\tif strings.Contains(region, fipsInfix) ||\n\t\tstrings.Contains(region, fipsPrefix) ||\n\t\tstrings.Contains(region, fipsSuffix) {\n\t\tregion = strings.ReplaceAll(region, fipsInfix, \"-\")\n\t\tregion = strings.ReplaceAll(region, fipsPrefix, \"\")\n\t\tregion = strings.ReplaceAll(region, fipsSuffix, \"\")\n\t}\n\n\treturn region\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md",
    "content": "# v2.6.34 (2025-02-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.33 (2025-02-18)\n\n* **Bug Fix**: Bump go version to 1.22\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.32 (2025-02-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.31 (2025-01-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.30 (2025-01-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.29 (2025-01-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n* **Dependency Update**: Upgrade to smithy-go v1.22.2.\n\n# v2.6.28 (2025-01-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.27 (2025-01-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.26 (2024-12-19)\n\n* **Bug Fix**: Fix improper use of printf-style functions.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.25 (2024-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.24 (2024-11-18)\n\n* **Dependency Update**: Update to smithy-go v1.22.1.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.23 (2024-11-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.22 (2024-10-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.21 (2024-10-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.20 (2024-10-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.19 (2024-10-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.18 (2024-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.17 (2024-09-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.16 (2024-08-15)\n\n* **Dependency Update**: Bump minimum Go version to 1.21.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.15 (2024-07-10.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.14 (2024-07-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.13 (2024-06-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.12 (2024-06-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.11 (2024-06-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.10 (2024-06-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.9 (2024-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.8 (2024-06-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.7 (2024-05-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.6 (2024-05-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.5 (2024-03-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.4 (2024-03-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.3 (2024-03-07)\n\n* **Bug Fix**: Remove dependency on go-cmp.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.2 (2024-02-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.1 (2024-02-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.6.0 (2024-02-13)\n\n* **Feature**: Bump minimum Go version to 1.20 per our language support policy.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.5.10 (2024-01-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.5.9 (2023-12-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.5.8 (2023-12-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.5.7 (2023-11-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.5.6 (2023-11-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.5.5 (2023-11-28.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.5.4 (2023-11-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.5.3 (2023-11-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.5.2 (2023-11-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.5.1 (2023-11-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.5.0 (2023-10-31)\n\n* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.37 (2023-10-12)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.36 (2023-10-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.35 (2023-08-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.34 (2023-08-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.33 (2023-08-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.32 (2023-08-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.31 (2023-07-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.30 (2023-07-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.29 (2023-07-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.28 (2023-06-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.27 (2023-04-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.26 (2023-04-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.25 (2023-03-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.24 (2023-03-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.23 (2023-02-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.22 (2023-02-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.21 (2022-12-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.20 (2022-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.19 (2022-10-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.18 (2022-10-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.17 (2022-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.16 (2022-09-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.15 (2022-09-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.14 (2022-08-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.13 (2022-08-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.12 (2022-08-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.11 (2022-08-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.10 (2022-08-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.9 (2022-08-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.8 (2022-07-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.7 (2022-06-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.6 (2022-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.5 (2022-05-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.4 (2022-04-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.3 (2022-03-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.2 (2022-03-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.1 (2022-03-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.4.0 (2022-03-08)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.3.0 (2022-02-24)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.2.0 (2022-01-14)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.1.0 (2022-01-07)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.0.2 (2021-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.0.1 (2021-11-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v2.0.0 (2021-11-06)\n\n* **Release**: Endpoint Variant Model Support\n* **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically.\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/endpoints.go",
    "content": "package endpoints\n\nimport (\n\t\"fmt\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n)\n\n// DefaultKey is a compound map key of a variant and other values.\ntype DefaultKey struct {\n\tVariant        EndpointVariant\n\tServiceVariant ServiceVariant\n}\n\n// EndpointKey is a compound map key of a region and associated variant value.\ntype EndpointKey struct {\n\tRegion         string\n\tVariant        EndpointVariant\n\tServiceVariant ServiceVariant\n}\n\n// EndpointVariant is a bit field to describe the endpoints attributes.\ntype EndpointVariant uint64\n\nconst (\n\t// FIPSVariant indicates that the endpoint is FIPS capable.\n\tFIPSVariant EndpointVariant = 1 << (64 - 1 - iota)\n\n\t// DualStackVariant indicates that the endpoint is DualStack capable.\n\tDualStackVariant\n)\n\n// ServiceVariant is a bit field to describe the service endpoint attributes.\ntype ServiceVariant uint64\n\nconst (\n\tdefaultProtocol = \"https\"\n\tdefaultSigner   = \"v4\"\n)\n\nvar (\n\tprotocolPriority = []string{\"https\", \"http\"}\n\tsignerPriority   = []string{\"v4\", \"s3v4\"}\n)\n\n// Options provide configuration needed to direct how endpoints are resolved.\ntype Options struct {\n\t// Logger is a logging implementation that log events should be sent to.\n\tLogger logging.Logger\n\n\t// LogDeprecated indicates that deprecated endpoints should be logged to the provided logger.\n\tLogDeprecated bool\n\n\t// ResolvedRegion is the resolved region string. If provided (non-zero length) it takes priority\n\t// over the region name passed to the ResolveEndpoint call.\n\tResolvedRegion string\n\n\t// Disable usage of HTTPS (TLS / SSL)\n\tDisableHTTPS bool\n\n\t// Instruct the resolver to use a service endpoint that supports dual-stack.\n\t// If a service does not have a dual-stack endpoint an error will be returned by the resolver.\n\tUseDualStackEndpoint aws.DualStackEndpointState\n\n\t// Instruct the resolver to use a service endpoint that supports FIPS.\n\t// If a service does not have a FIPS endpoint an error will be returned by the resolver.\n\tUseFIPSEndpoint aws.FIPSEndpointState\n\n\t// ServiceVariant is a bitfield of service specified endpoint variant data.\n\tServiceVariant ServiceVariant\n}\n\n// GetEndpointVariant returns the EndpointVariant for the variant associated options.\nfunc (o Options) GetEndpointVariant() (v EndpointVariant) {\n\tif o.UseDualStackEndpoint == aws.DualStackEndpointStateEnabled {\n\t\tv |= DualStackVariant\n\t}\n\tif o.UseFIPSEndpoint == aws.FIPSEndpointStateEnabled {\n\t\tv |= FIPSVariant\n\t}\n\treturn v\n}\n\n// Partitions is a slice of partition\ntype Partitions []Partition\n\n// ResolveEndpoint resolves a service endpoint for the given region and options.\nfunc (ps Partitions) ResolveEndpoint(region string, opts Options) (aws.Endpoint, error) {\n\tif len(ps) == 0 {\n\t\treturn aws.Endpoint{}, fmt.Errorf(\"no partitions found\")\n\t}\n\n\tif opts.Logger == nil {\n\t\topts.Logger = logging.Nop{}\n\t}\n\n\tif len(opts.ResolvedRegion) > 0 {\n\t\tregion = opts.ResolvedRegion\n\t}\n\n\tfor i := 0; i < len(ps); i++ {\n\t\tif !ps[i].canResolveEndpoint(region, opts) {\n\t\t\tcontinue\n\t\t}\n\n\t\treturn ps[i].ResolveEndpoint(region, opts)\n\t}\n\n\t// fallback to first partition format to use when resolving the endpoint.\n\treturn ps[0].ResolveEndpoint(region, opts)\n}\n\n// Partition is an AWS partition description for a service and its' region endpoints.\ntype Partition struct {\n\tID                string\n\tRegionRegex       *regexp.Regexp\n\tPartitionEndpoint string\n\tIsRegionalized    bool\n\tDefaults          map[DefaultKey]Endpoint\n\tEndpoints         Endpoints\n}\n\nfunc (p Partition) canResolveEndpoint(region string, opts Options) bool {\n\t_, ok := p.Endpoints[EndpointKey{\n\t\tRegion:  region,\n\t\tVariant: opts.GetEndpointVariant(),\n\t}]\n\treturn ok || p.RegionRegex.MatchString(region)\n}\n\n// ResolveEndpoint resolves and service endpoint for the given region and options.\nfunc (p Partition) ResolveEndpoint(region string, options Options) (resolved aws.Endpoint, err error) {\n\tif len(region) == 0 && len(p.PartitionEndpoint) != 0 {\n\t\tregion = p.PartitionEndpoint\n\t}\n\n\tendpoints := p.Endpoints\n\n\tvariant := options.GetEndpointVariant()\n\tserviceVariant := options.ServiceVariant\n\n\tdefaults := p.Defaults[DefaultKey{\n\t\tVariant:        variant,\n\t\tServiceVariant: serviceVariant,\n\t}]\n\n\treturn p.endpointForRegion(region, variant, serviceVariant, endpoints).resolve(p.ID, region, defaults, options)\n}\n\nfunc (p Partition) endpointForRegion(region string, variant EndpointVariant, serviceVariant ServiceVariant, endpoints Endpoints) Endpoint {\n\tkey := EndpointKey{\n\t\tRegion:  region,\n\t\tVariant: variant,\n\t}\n\n\tif e, ok := endpoints[key]; ok {\n\t\treturn e\n\t}\n\n\tif !p.IsRegionalized {\n\t\treturn endpoints[EndpointKey{\n\t\t\tRegion:         p.PartitionEndpoint,\n\t\t\tVariant:        variant,\n\t\t\tServiceVariant: serviceVariant,\n\t\t}]\n\t}\n\n\t// Unable to find any matching endpoint, return\n\t// blank that will be used for generic endpoint creation.\n\treturn Endpoint{}\n}\n\n// Endpoints is a map of service config regions to endpoints\ntype Endpoints map[EndpointKey]Endpoint\n\n// CredentialScope is the credential scope of a region and service\ntype CredentialScope struct {\n\tRegion  string\n\tService string\n}\n\n// Endpoint is a service endpoint description\ntype Endpoint struct {\n\t// True if the endpoint cannot be resolved for this partition/region/service\n\tUnresolveable aws.Ternary\n\n\tHostname  string\n\tProtocols []string\n\n\tCredentialScope CredentialScope\n\n\tSignatureVersions []string\n\n\t// Indicates that this endpoint is deprecated.\n\tDeprecated aws.Ternary\n}\n\n// IsZero returns whether the endpoint structure is an empty (zero) value.\nfunc (e Endpoint) IsZero() bool {\n\tswitch {\n\tcase e.Unresolveable != aws.UnknownTernary:\n\t\treturn false\n\tcase len(e.Hostname) != 0:\n\t\treturn false\n\tcase len(e.Protocols) != 0:\n\t\treturn false\n\tcase e.CredentialScope != (CredentialScope{}):\n\t\treturn false\n\tcase len(e.SignatureVersions) != 0:\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (e Endpoint) resolve(partition, region string, def Endpoint, options Options) (aws.Endpoint, error) {\n\tvar merged Endpoint\n\tmerged.mergeIn(def)\n\tmerged.mergeIn(e)\n\te = merged\n\n\tif e.IsZero() {\n\t\treturn aws.Endpoint{}, fmt.Errorf(\"unable to resolve endpoint for region: %v\", region)\n\t}\n\n\tvar u string\n\tif e.Unresolveable != aws.TrueTernary {\n\t\t// Only attempt to resolve the endpoint if it can be resolved.\n\t\thostname := strings.Replace(e.Hostname, \"{region}\", region, 1)\n\n\t\tscheme := getEndpointScheme(e.Protocols, options.DisableHTTPS)\n\t\tu = scheme + \"://\" + hostname\n\t}\n\n\tsigningRegion := e.CredentialScope.Region\n\tif len(signingRegion) == 0 {\n\t\tsigningRegion = region\n\t}\n\tsigningName := e.CredentialScope.Service\n\n\tif e.Deprecated == aws.TrueTernary && options.LogDeprecated {\n\t\toptions.Logger.Logf(logging.Warn, \"endpoint identifier %q, url %q marked as deprecated\", region, u)\n\t}\n\n\treturn aws.Endpoint{\n\t\tURL:           u,\n\t\tPartitionID:   partition,\n\t\tSigningRegion: signingRegion,\n\t\tSigningName:   signingName,\n\t\tSigningMethod: getByPriority(e.SignatureVersions, signerPriority, defaultSigner),\n\t}, nil\n}\n\nfunc (e *Endpoint) mergeIn(other Endpoint) {\n\tif other.Unresolveable != aws.UnknownTernary {\n\t\te.Unresolveable = other.Unresolveable\n\t}\n\tif len(other.Hostname) > 0 {\n\t\te.Hostname = other.Hostname\n\t}\n\tif len(other.Protocols) > 0 {\n\t\te.Protocols = other.Protocols\n\t}\n\tif len(other.CredentialScope.Region) > 0 {\n\t\te.CredentialScope.Region = other.CredentialScope.Region\n\t}\n\tif len(other.CredentialScope.Service) > 0 {\n\t\te.CredentialScope.Service = other.CredentialScope.Service\n\t}\n\tif len(other.SignatureVersions) > 0 {\n\t\te.SignatureVersions = other.SignatureVersions\n\t}\n\tif other.Deprecated != aws.UnknownTernary {\n\t\te.Deprecated = other.Deprecated\n\t}\n}\n\nfunc getEndpointScheme(protocols []string, disableHTTPS bool) string {\n\tif disableHTTPS {\n\t\treturn \"http\"\n\t}\n\n\treturn getByPriority(protocols, protocolPriority, defaultProtocol)\n}\n\nfunc getByPriority(s []string, p []string, def string) string {\n\tif len(s) == 0 {\n\t\treturn def\n\t}\n\n\tfor i := 0; i < len(p); i++ {\n\t\tfor j := 0; j < len(s); j++ {\n\t\t\tif s[j] == p[i] {\n\t\t\t\treturn s[j]\n\t\t\t}\n\t\t}\n\t}\n\n\treturn s[0]\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go",
    "content": "// Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT.\n\npackage endpoints\n\n// goModuleVersion is the tagged release for this module\nconst goModuleVersion = \"2.6.34\"\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md",
    "content": "# v1.8.3 (2025-02-18)\n\n* **Bug Fix**: Bump go version to 1.22\n\n# v1.8.2 (2025-01-24)\n\n* **Bug Fix**: Refactor filepath.Walk to filepath.WalkDir\n\n# v1.8.1 (2024-08-15)\n\n* **Dependency Update**: Bump minimum Go version to 1.21.\n\n# v1.8.0 (2024-02-13)\n\n* **Feature**: Bump minimum Go version to 1.20 per our language support policy.\n\n# v1.7.3 (2024-01-22)\n\n* **Bug Fix**: Remove invalid escaping of shared config values. All values in the shared config file will now be interpreted literally, save for fully-quoted strings which are unwrapped for legacy reasons.\n\n# v1.7.2 (2023-12-08)\n\n* **Bug Fix**: Correct loading of [services *] sections into shared config.\n\n# v1.7.1 (2023-11-16)\n\n* **Bug Fix**: Fix recognition of trailing comments in shared config properties. # or ; separators that aren't preceded by whitespace at the end of a property value should be considered part of it.\n\n# v1.7.0 (2023-11-13)\n\n* **Feature**: Replace the legacy config parser with a modern, less-strict implementation. Parsing failures within a section will now simply ignore the invalid line rather than silently drop the entire section.\n\n# v1.6.0 (2023-11-09.2)\n\n* **Feature**: BREAKFIX: In order to support subproperty parsing, invalid property definitions must not be ignored\n\n# v1.5.2 (2023-11-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.1 (2023-11-07)\n\n* **Bug Fix**: Fix subproperty performance regression\n\n# v1.5.0 (2023-11-01)\n\n* **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.0 (2023-10-31)\n\n* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.45 (2023-10-12)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.44 (2023-10-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.43 (2023-09-22)\n\n* **Bug Fix**: Fixed a bug where merging `max_attempts` or `duration_seconds` fields across shared config files with invalid values would silently default them to 0.\n* **Bug Fix**: Move type assertion of config values out of the parsing stage, which resolves an issue where the contents of a profile would silently be dropped with certain numeric formats.\n\n# v1.3.42 (2023-08-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.41 (2023-08-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.40 (2023-08-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.39 (2023-08-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.38 (2023-07-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.37 (2023-07-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.36 (2023-07-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.35 (2023-06-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.34 (2023-04-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.33 (2023-04-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.32 (2023-03-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.31 (2023-03-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.30 (2023-02-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.29 (2023-02-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.28 (2022-12-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.27 (2022-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.26 (2022-10-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.25 (2022-10-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.24 (2022-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.23 (2022-09-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.22 (2022-09-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.21 (2022-08-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.20 (2022-08-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.19 (2022-08-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.18 (2022-08-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.17 (2022-08-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.16 (2022-08-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.15 (2022-07-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.14 (2022-06-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.13 (2022-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.12 (2022-05-17)\n\n* **Bug Fix**: Removes the fuzz testing files from the module, as they are invalid and not used.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.11 (2022-04-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.10 (2022-03-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.9 (2022-03-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.8 (2022-03-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.7 (2022-03-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.6 (2022-02-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.5 (2022-01-28)\n\n* **Bug Fix**: Fixes the SDK's handling of `duration_sections` in the shared credentials file or specified in multiple shared config and shared credentials files under the same profile. [#1568](https://github.com/aws/aws-sdk-go-v2/pull/1568). Thanks to [Amir Szekely](https://github.com/kichik) for help reproduce this bug.\n\n# v1.3.4 (2022-01-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.3 (2022-01-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.2 (2021-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.1 (2021-11-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.0 (2021-11-06)\n\n* **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.5 (2021-10-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.4 (2021-10-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.3 (2021-09-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.2 (2021-08-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.1 (2021-08-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.0 (2021-08-04)\n\n* **Feature**: adds error handling for defered close calls\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.1 (2021-07-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.0 (2021-07-01)\n\n* **Feature**: Support for `:`, `=`, `[`, `]` being present in expression values.\n\n# v1.0.1 (2021-06-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.0 (2021-05-20)\n\n* **Release**: The `github.com/aws/aws-sdk-go-v2/internal/ini` package is now a Go Module.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/ini/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/ini/errors.go",
    "content": "package ini\n\nimport \"fmt\"\n\n// UnableToReadFile is an error indicating that a ini file could not be read\ntype UnableToReadFile struct {\n\tErr error\n}\n\n// Error returns an error message and the underlying error message if present\nfunc (e *UnableToReadFile) Error() string {\n\tbase := \"unable to read file\"\n\tif e.Err == nil {\n\t\treturn base\n\t}\n\treturn fmt.Sprintf(\"%s: %v\", base, e.Err)\n}\n\n// Unwrap returns the underlying error\nfunc (e *UnableToReadFile) Unwrap() error {\n\treturn e.Err\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go",
    "content": "// Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT.\n\npackage ini\n\n// goModuleVersion is the tagged release for this module\nconst goModuleVersion = \"1.8.3\"\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/ini/ini.go",
    "content": "// Package ini implements parsing of the AWS shared config file.\n//\n//\tExample:\n//\tsections, err := ini.OpenFile(\"/path/to/file\")\n//\tif err != nil {\n//\t\tpanic(err)\n//\t}\n//\n//\tprofile := \"foo\"\n//\tsection, ok := sections.GetSection(profile)\n//\tif !ok {\n//\t\tfmt.Printf(\"section %q could not be found\", profile)\n//\t}\npackage ini\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n)\n\n// OpenFile parses shared config from the given file path.\nfunc OpenFile(path string) (sections Sections, err error) {\n\tf, oerr := os.Open(path)\n\tif oerr != nil {\n\t\treturn Sections{}, &UnableToReadFile{Err: oerr}\n\t}\n\n\tdefer func() {\n\t\tcloseErr := f.Close()\n\t\tif err == nil {\n\t\t\terr = closeErr\n\t\t} else if closeErr != nil {\n\t\t\terr = fmt.Errorf(\"close error: %v, original error: %w\", closeErr, err)\n\t\t}\n\t}()\n\n\treturn Parse(f, path)\n}\n\n// Parse parses shared config from the given reader.\nfunc Parse(r io.Reader, path string) (Sections, error) {\n\tcontents, err := io.ReadAll(r)\n\tif err != nil {\n\t\treturn Sections{}, fmt.Errorf(\"read all: %v\", err)\n\t}\n\n\tlines := strings.Split(string(contents), \"\\n\")\n\ttokens, err := tokenize(lines)\n\tif err != nil {\n\t\treturn Sections{}, fmt.Errorf(\"tokenize: %v\", err)\n\t}\n\n\treturn parse(tokens, path), nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/ini/parse.go",
    "content": "package ini\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\nfunc parse(tokens []lineToken, path string) Sections {\n\tparser := &parser{\n\t\tpath:     path,\n\t\tsections: NewSections(),\n\t}\n\tparser.parse(tokens)\n\treturn parser.sections\n}\n\ntype parser struct {\n\tcsection, ckey string   // current state\n\tpath           string   // source file path\n\tsections       Sections // parse result\n}\n\nfunc (p *parser) parse(tokens []lineToken) {\n\tfor _, otok := range tokens {\n\t\tswitch tok := otok.(type) {\n\t\tcase *lineTokenProfile:\n\t\t\tp.handleProfile(tok)\n\t\tcase *lineTokenProperty:\n\t\t\tp.handleProperty(tok)\n\t\tcase *lineTokenSubProperty:\n\t\t\tp.handleSubProperty(tok)\n\t\tcase *lineTokenContinuation:\n\t\t\tp.handleContinuation(tok)\n\t\t}\n\t}\n}\n\nfunc (p *parser) handleProfile(tok *lineTokenProfile) {\n\tname := tok.Name\n\tif tok.Type != \"\" {\n\t\tname = fmt.Sprintf(\"%s %s\", tok.Type, tok.Name)\n\t}\n\tp.ckey = \"\"\n\tp.csection = name\n\tif _, ok := p.sections.container[name]; !ok {\n\t\tp.sections.container[name] = NewSection(name)\n\t}\n}\n\nfunc (p *parser) handleProperty(tok *lineTokenProperty) {\n\tif p.csection == \"\" {\n\t\treturn // LEGACY: don't error on \"global\" properties\n\t}\n\n\tp.ckey = tok.Key\n\tif _, ok := p.sections.container[p.csection].values[tok.Key]; ok {\n\t\tsection := p.sections.container[p.csection]\n\t\tsection.Logs = append(p.sections.container[p.csection].Logs,\n\t\t\tfmt.Sprintf(\n\t\t\t\t\"For profile: %v, overriding %v value, with a %v value found in a duplicate profile defined later in the same file %v. \\n\",\n\t\t\t\tp.csection, tok.Key, tok.Key, p.path,\n\t\t\t),\n\t\t)\n\t\tp.sections.container[p.csection] = section\n\t}\n\n\tp.sections.container[p.csection].values[tok.Key] = Value{\n\t\tstr: tok.Value,\n\t}\n\tp.sections.container[p.csection].SourceFile[tok.Key] = p.path\n}\n\nfunc (p *parser) handleSubProperty(tok *lineTokenSubProperty) {\n\tif p.csection == \"\" {\n\t\treturn // LEGACY: don't error on \"global\" properties\n\t}\n\n\tif p.ckey == \"\" || p.sections.container[p.csection].values[p.ckey].str != \"\" {\n\t\t// This is an \"orphaned\" subproperty, either because it's at\n\t\t// the beginning of a section or because the last property's\n\t\t// value isn't empty. Either way we're lenient here and\n\t\t// \"promote\" this to a normal property.\n\t\tp.handleProperty(&lineTokenProperty{\n\t\t\tKey:   tok.Key,\n\t\t\tValue: strings.TrimSpace(trimPropertyComment(tok.Value)),\n\t\t})\n\t\treturn\n\t}\n\n\tif p.sections.container[p.csection].values[p.ckey].mp == nil {\n\t\tp.sections.container[p.csection].values[p.ckey] = Value{\n\t\t\tmp: map[string]string{},\n\t\t}\n\t}\n\tp.sections.container[p.csection].values[p.ckey].mp[tok.Key] = tok.Value\n}\n\nfunc (p *parser) handleContinuation(tok *lineTokenContinuation) {\n\tif p.ckey == \"\" {\n\t\treturn\n\t}\n\n\tvalue, _ := p.sections.container[p.csection].values[p.ckey]\n\tif value.str != \"\" && value.mp == nil {\n\t\tvalue.str = fmt.Sprintf(\"%s\\n%s\", value.str, tok.Value)\n\t}\n\n\tp.sections.container[p.csection].values[p.ckey] = value\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/ini/sections.go",
    "content": "package ini\n\nimport (\n\t\"sort\"\n)\n\n// Sections is a map of Section structures that represent\n// a configuration.\ntype Sections struct {\n\tcontainer map[string]Section\n}\n\n// NewSections returns empty ini Sections\nfunc NewSections() Sections {\n\treturn Sections{\n\t\tcontainer: make(map[string]Section, 0),\n\t}\n}\n\n// GetSection will return section p. If section p does not exist,\n// false will be returned in the second parameter.\nfunc (t Sections) GetSection(p string) (Section, bool) {\n\tv, ok := t.container[p]\n\treturn v, ok\n}\n\n// HasSection denotes if Sections consist of a section with\n// provided name.\nfunc (t Sections) HasSection(p string) bool {\n\t_, ok := t.container[p]\n\treturn ok\n}\n\n// SetSection sets a section value for provided section name.\nfunc (t Sections) SetSection(p string, v Section) Sections {\n\tt.container[p] = v\n\treturn t\n}\n\n// DeleteSection deletes a section entry/value for provided section name./\nfunc (t Sections) DeleteSection(p string) {\n\tdelete(t.container, p)\n}\n\n// values represents a map of union values.\ntype values map[string]Value\n\n// List will return a list of all sections that were successfully\n// parsed.\nfunc (t Sections) List() []string {\n\tkeys := make([]string, len(t.container))\n\ti := 0\n\tfor k := range t.container {\n\t\tkeys[i] = k\n\t\ti++\n\t}\n\n\tsort.Strings(keys)\n\treturn keys\n}\n\n// Section contains a name and values. This represent\n// a sectioned entry in a configuration file.\ntype Section struct {\n\t// Name is the Section profile name\n\tName string\n\n\t// values are the values within parsed profile\n\tvalues values\n\n\t// Errors is the list of errors\n\tErrors []error\n\n\t// Logs is the list of logs\n\tLogs []string\n\n\t// SourceFile is the INI Source file from where this section\n\t// was retrieved. They key is the property, value is the\n\t// source file the property was retrieved from.\n\tSourceFile map[string]string\n}\n\n// NewSection returns an initialize section for the name\nfunc NewSection(name string) Section {\n\treturn Section{\n\t\tName:       name,\n\t\tvalues:     values{},\n\t\tSourceFile: map[string]string{},\n\t}\n}\n\n// List will return a list of all\n// services in values\nfunc (t Section) List() []string {\n\tkeys := make([]string, len(t.values))\n\ti := 0\n\tfor k := range t.values {\n\t\tkeys[i] = k\n\t\ti++\n\t}\n\n\tsort.Strings(keys)\n\treturn keys\n}\n\n// UpdateSourceFile updates source file for a property to provided filepath.\nfunc (t Section) UpdateSourceFile(property string, filepath string) {\n\tt.SourceFile[property] = filepath\n}\n\n// UpdateValue updates value for a provided key with provided value\nfunc (t Section) UpdateValue(k string, v Value) error {\n\tt.values[k] = v\n\treturn nil\n}\n\n// Has will return whether or not an entry exists in a given section\nfunc (t Section) Has(k string) bool {\n\t_, ok := t.values[k]\n\treturn ok\n}\n\n// ValueType will returned what type the union is set to. If\n// k was not found, the NoneType will be returned.\nfunc (t Section) ValueType(k string) (ValueType, bool) {\n\tv, ok := t.values[k]\n\treturn v.Type, ok\n}\n\n// Bool returns a bool value at k\nfunc (t Section) Bool(k string) (bool, bool) {\n\treturn t.values[k].BoolValue()\n}\n\n// Int returns an integer value at k\nfunc (t Section) Int(k string) (int64, bool) {\n\treturn t.values[k].IntValue()\n}\n\n// Map returns a map value at k\nfunc (t Section) Map(k string) map[string]string {\n\treturn t.values[k].MapValue()\n}\n\n// Float64 returns a float value at k\nfunc (t Section) Float64(k string) (float64, bool) {\n\treturn t.values[k].FloatValue()\n}\n\n// String returns the string value at k\nfunc (t Section) String(k string) string {\n\t_, ok := t.values[k]\n\tif !ok {\n\t\treturn \"\"\n\t}\n\treturn t.values[k].StringValue()\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/ini/strings.go",
    "content": "package ini\n\nimport (\n\t\"strings\"\n)\n\nfunc trimProfileComment(s string) string {\n\tr, _, _ := strings.Cut(s, \"#\")\n\tr, _, _ = strings.Cut(r, \";\")\n\treturn r\n}\n\nfunc trimPropertyComment(s string) string {\n\tr, _, _ := strings.Cut(s, \" #\")\n\tr, _, _ = strings.Cut(r, \" ;\")\n\tr, _, _ = strings.Cut(r, \"\\t#\")\n\tr, _, _ = strings.Cut(r, \"\\t;\")\n\treturn r\n}\n\n// assumes no surrounding comment\nfunc splitProperty(s string) (string, string, bool) {\n\tequalsi := strings.Index(s, \"=\")\n\tcoloni := strings.Index(s, \":\") // LEGACY: also supported for property assignment\n\tsep := \"=\"\n\tif equalsi == -1 || coloni != -1 && coloni < equalsi {\n\t\tsep = \":\"\n\t}\n\n\tk, v, ok := strings.Cut(s, sep)\n\tif !ok {\n\t\treturn \"\", \"\", false\n\t}\n\treturn strings.TrimSpace(k), strings.TrimSpace(v), true\n}\n\n// assumes no surrounding comment, whitespace, or profile brackets\nfunc splitProfile(s string) (string, string) {\n\tvar first int\n\tfor i, r := range s {\n\t\tif isLineSpace(r) {\n\t\t\tif first == 0 {\n\t\t\t\tfirst = i\n\t\t\t}\n\t\t} else {\n\t\t\tif first != 0 {\n\t\t\t\treturn s[:first], s[i:]\n\t\t\t}\n\t\t}\n\t}\n\tif first == 0 {\n\t\treturn \"\", s // type component is effectively blank\n\t}\n\treturn \"\", \"\"\n}\n\nfunc isLineSpace(r rune) bool {\n\treturn r == ' ' || r == '\\t'\n}\n\nfunc unquote(s string) string {\n\tif isSingleQuoted(s) || isDoubleQuoted(s) {\n\t\treturn s[1 : len(s)-1]\n\t}\n\treturn s\n}\n\n// applies various legacy conversions to property values:\n//   - remote wrapping single/doublequotes\nfunc legacyStrconv(s string) string {\n\ts = unquote(s)\n\treturn s\n}\n\nfunc isSingleQuoted(s string) bool {\n\treturn hasAffixes(s, \"'\", \"'\")\n}\n\nfunc isDoubleQuoted(s string) bool {\n\treturn hasAffixes(s, `\"`, `\"`)\n}\n\nfunc isBracketed(s string) bool {\n\treturn hasAffixes(s, \"[\", \"]\")\n}\n\nfunc hasAffixes(s, left, right string) bool {\n\treturn strings.HasPrefix(s, left) && strings.HasSuffix(s, right)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/ini/token.go",
    "content": "package ini\n\ntype lineToken interface {\n\tisLineToken()\n}\n\ntype lineTokenProfile struct {\n\tType string\n\tName string\n}\n\nfunc (*lineTokenProfile) isLineToken() {}\n\ntype lineTokenProperty struct {\n\tKey   string\n\tValue string\n}\n\nfunc (*lineTokenProperty) isLineToken() {}\n\ntype lineTokenContinuation struct {\n\tValue string\n}\n\nfunc (*lineTokenContinuation) isLineToken() {}\n\ntype lineTokenSubProperty struct {\n\tKey   string\n\tValue string\n}\n\nfunc (*lineTokenSubProperty) isLineToken() {}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/ini/tokenize.go",
    "content": "package ini\n\nimport (\n\t\"strings\"\n)\n\nfunc tokenize(lines []string) ([]lineToken, error) {\n\ttokens := make([]lineToken, 0, len(lines))\n\tfor _, line := range lines {\n\t\tif len(strings.TrimSpace(line)) == 0 || isLineComment(line) {\n\t\t\tcontinue\n\t\t}\n\n\t\tif tok := asProfile(line); tok != nil {\n\t\t\ttokens = append(tokens, tok)\n\t\t} else if tok := asProperty(line); tok != nil {\n\t\t\ttokens = append(tokens, tok)\n\t\t} else if tok := asSubProperty(line); tok != nil {\n\t\t\ttokens = append(tokens, tok)\n\t\t} else if tok := asContinuation(line); tok != nil {\n\t\t\ttokens = append(tokens, tok)\n\t\t} // unrecognized tokens are effectively ignored\n\t}\n\treturn tokens, nil\n}\n\nfunc isLineComment(line string) bool {\n\ttrimmed := strings.TrimLeft(line, \" \\t\")\n\treturn strings.HasPrefix(trimmed, \"#\") || strings.HasPrefix(trimmed, \";\")\n}\n\nfunc asProfile(line string) *lineTokenProfile { // \" [ type name ] ; comment\"\n\ttrimmed := strings.TrimSpace(trimProfileComment(line)) // \"[ type name ]\"\n\tif !isBracketed(trimmed) {\n\t\treturn nil\n\t}\n\ttrimmed = trimmed[1 : len(trimmed)-1] // \" type name \" (or just \" name \")\n\ttrimmed = strings.TrimSpace(trimmed)  // \"type name\" / \"name\"\n\ttyp, name := splitProfile(trimmed)\n\treturn &lineTokenProfile{\n\t\tType: typ,\n\t\tName: name,\n\t}\n}\n\nfunc asProperty(line string) *lineTokenProperty {\n\tif isLineSpace(rune(line[0])) {\n\t\treturn nil\n\t}\n\n\ttrimmed := trimPropertyComment(line)\n\ttrimmed = strings.TrimRight(trimmed, \" \\t\")\n\tk, v, ok := splitProperty(trimmed)\n\tif !ok {\n\t\treturn nil\n\t}\n\n\treturn &lineTokenProperty{\n\t\tKey:   strings.ToLower(k), // LEGACY: normalize key case\n\t\tValue: legacyStrconv(v),   // LEGACY: see func docs\n\t}\n}\n\nfunc asSubProperty(line string) *lineTokenSubProperty {\n\tif !isLineSpace(rune(line[0])) {\n\t\treturn nil\n\t}\n\n\t// comments on sub-properties are included in the value\n\ttrimmed := strings.TrimLeft(line, \" \\t\")\n\tk, v, ok := splitProperty(trimmed)\n\tif !ok {\n\t\treturn nil\n\t}\n\n\treturn &lineTokenSubProperty{ // same LEGACY constraints as in normal property\n\t\tKey:   strings.ToLower(k),\n\t\tValue: legacyStrconv(v),\n\t}\n}\n\nfunc asContinuation(line string) *lineTokenContinuation {\n\tif !isLineSpace(rune(line[0])) {\n\t\treturn nil\n\t}\n\n\t// includes comments like sub-properties\n\ttrimmed := strings.TrimLeft(line, \" \\t\")\n\treturn &lineTokenContinuation{\n\t\tValue: trimmed,\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/ini/value.go",
    "content": "package ini\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n)\n\n// ValueType is an enum that will signify what type\n// the Value is\ntype ValueType int\n\nfunc (v ValueType) String() string {\n\tswitch v {\n\tcase NoneType:\n\t\treturn \"NONE\"\n\tcase StringType:\n\t\treturn \"STRING\"\n\t}\n\n\treturn \"\"\n}\n\n// ValueType enums\nconst (\n\tNoneType = ValueType(iota)\n\tStringType\n\tQuotedStringType\n)\n\n// Value is a union container\ntype Value struct {\n\tType ValueType\n\n\tstr string\n\tmp  map[string]string\n}\n\n// NewStringValue returns a Value type generated using a string input.\nfunc NewStringValue(str string) (Value, error) {\n\treturn Value{str: str}, nil\n}\n\nfunc (v Value) String() string {\n\tswitch v.Type {\n\tcase StringType:\n\t\treturn fmt.Sprintf(\"string: %s\", string(v.str))\n\tcase QuotedStringType:\n\t\treturn fmt.Sprintf(\"quoted string: %s\", string(v.str))\n\tdefault:\n\t\treturn \"union not set\"\n\t}\n}\n\n// MapValue returns a map value for sub properties\nfunc (v Value) MapValue() map[string]string {\n\treturn v.mp\n}\n\n// IntValue returns an integer value\nfunc (v Value) IntValue() (int64, bool) {\n\ti, err := strconv.ParseInt(string(v.str), 0, 64)\n\tif err != nil {\n\t\treturn 0, false\n\t}\n\treturn i, true\n}\n\n// FloatValue returns a float value\nfunc (v Value) FloatValue() (float64, bool) {\n\tf, err := strconv.ParseFloat(string(v.str), 64)\n\tif err != nil {\n\t\treturn 0, false\n\t}\n\treturn f, true\n}\n\n// BoolValue returns a bool value\nfunc (v Value) BoolValue() (bool, bool) {\n\t// we don't use ParseBool as it recognizes more than what we've\n\t// historically supported\n\tif strings.EqualFold(v.str, \"true\") {\n\t\treturn true, true\n\t} else if strings.EqualFold(v.str, \"false\") {\n\t\treturn false, true\n\t}\n\treturn false, false\n}\n\n// StringValue returns the string value\nfunc (v Value) StringValue() string {\n\treturn v.str\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/middleware/middleware.go",
    "content": "package middleware\n\nimport (\n\t\"context\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\tinternalcontext \"github.com/aws/aws-sdk-go-v2/internal/context\"\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\n// AddTimeOffsetMiddleware sets a value representing clock skew on the request context.\n// This can be read by other operations (such as signing) to correct the date value they send\n// on the request\ntype AddTimeOffsetMiddleware struct {\n\tOffset *atomic.Int64\n}\n\n// ID the identifier for AddTimeOffsetMiddleware\nfunc (m *AddTimeOffsetMiddleware) ID() string { return \"AddTimeOffsetMiddleware\" }\n\n// HandleBuild sets a value for attemptSkew on the request context if one is set on the client.\nfunc (m AddTimeOffsetMiddleware) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (\n\tout middleware.BuildOutput, metadata middleware.Metadata, err error,\n) {\n\tif m.Offset != nil {\n\t\toffset := time.Duration(m.Offset.Load())\n\t\tctx = internalcontext.SetAttemptSkewContext(ctx, offset)\n\t}\n\treturn next.HandleBuild(ctx, in)\n}\n\n// HandleDeserialize gets the clock skew context from the context, and if set, sets it on the pointer\n// held by AddTimeOffsetMiddleware\nfunc (m *AddTimeOffsetMiddleware) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tif v := internalcontext.GetAttemptSkewContext(ctx); v != 0 {\n\t\tm.Offset.Store(v.Nanoseconds())\n\t}\n\treturn next.HandleDeserialize(ctx, in)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/rand/rand.go",
    "content": "package rand\n\nimport (\n\t\"crypto/rand\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/big\"\n)\n\nfunc init() {\n\tReader = rand.Reader\n}\n\n// Reader provides a random reader that can reset during testing.\nvar Reader io.Reader\n\nvar floatMaxBigInt = big.NewInt(1 << 53)\n\n// Float64 returns a float64 read from an io.Reader source. The returned float will be between [0.0, 1.0).\nfunc Float64(reader io.Reader) (float64, error) {\n\tbi, err := rand.Int(reader, floatMaxBigInt)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"failed to read random value, %v\", err)\n\t}\n\n\treturn float64(bi.Int64()) / (1 << 53), nil\n}\n\n// CryptoRandFloat64 returns a random float64 obtained from the crypto rand\n// source.\nfunc CryptoRandFloat64() (float64, error) {\n\treturn Float64(Reader)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/sdk/interfaces.go",
    "content": "package sdk\n\n// Invalidator provides access to a type's invalidate method to make it\n// invalidate it cache.\n//\n// e.g aws.SafeCredentialsProvider's Invalidate method.\ntype Invalidator interface {\n\tInvalidate()\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/sdk/time.go",
    "content": "package sdk\n\nimport (\n\t\"context\"\n\t\"time\"\n)\n\nfunc init() {\n\tNowTime = time.Now\n\tSleep = time.Sleep\n\tSleepWithContext = sleepWithContext\n}\n\n// NowTime is a value for getting the current time. This value can be overridden\n// for testing mocking out current time.\nvar NowTime func() time.Time\n\n// Sleep is a value for sleeping for a duration. This value can be overridden\n// for testing and mocking out sleep duration.\nvar Sleep func(time.Duration)\n\n// SleepWithContext will wait for the timer duration to expire, or the context\n// is canceled. Which ever happens first. If the context is canceled the Context's\n// error will be returned.\n//\n// This value can be overridden for testing and mocking out sleep duration.\nvar SleepWithContext func(context.Context, time.Duration) error\n\n// sleepWithContext will wait for the timer duration to expire, or the context\n// is canceled. Which ever happens first. If the context is canceled the\n// Context's error will be returned.\nfunc sleepWithContext(ctx context.Context, dur time.Duration) error {\n\tt := time.NewTimer(dur)\n\tdefer t.Stop()\n\n\tselect {\n\tcase <-t.C:\n\t\tbreak\n\tcase <-ctx.Done():\n\t\treturn ctx.Err()\n\t}\n\n\treturn nil\n}\n\n// noOpSleepWithContext does nothing, returns immediately.\nfunc noOpSleepWithContext(context.Context, time.Duration) error {\n\treturn nil\n}\n\nfunc noOpSleep(time.Duration) {}\n\n// TestingUseNopSleep is a utility for disabling sleep across the SDK for\n// testing.\nfunc TestingUseNopSleep() func() {\n\tSleepWithContext = noOpSleepWithContext\n\tSleep = noOpSleep\n\n\treturn func() {\n\t\tSleepWithContext = sleepWithContext\n\t\tSleep = time.Sleep\n\t}\n}\n\n// TestingUseReferenceTime is a utility for swapping the time function across the SDK to return a specific reference time\n// for testing purposes.\nfunc TestingUseReferenceTime(referenceTime time.Time) func() {\n\tNowTime = func() time.Time {\n\t\treturn referenceTime\n\t}\n\treturn func() {\n\t\tNowTime = time.Now\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/sdkio/byte.go",
    "content": "package sdkio\n\nconst (\n\t// Byte is 8 bits\n\tByte int64 = 1\n\t// KibiByte (KiB) is 1024 Bytes\n\tKibiByte = Byte * 1024\n\t// MebiByte (MiB) is 1024 KiB\n\tMebiByte = KibiByte * 1024\n\t// GibiByte (GiB) is 1024 MiB\n\tGibiByte = MebiByte * 1024\n)\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/shareddefaults/shared_config.go",
    "content": "package shareddefaults\n\nimport (\n\t\"os\"\n\t\"os/user\"\n\t\"path/filepath\"\n)\n\n// SharedCredentialsFilename returns the SDK's default file path\n// for the shared credentials file.\n//\n// Builds the shared config file path based on the OS's platform.\n//\n//   - Linux/Unix: $HOME/.aws/credentials\n//   - Windows: %USERPROFILE%\\.aws\\credentials\nfunc SharedCredentialsFilename() string {\n\treturn filepath.Join(UserHomeDir(), \".aws\", \"credentials\")\n}\n\n// SharedConfigFilename returns the SDK's default file path for\n// the shared config file.\n//\n// Builds the shared config file path based on the OS's platform.\n//\n//   - Linux/Unix: $HOME/.aws/config\n//   - Windows: %USERPROFILE%\\.aws\\config\nfunc SharedConfigFilename() string {\n\treturn filepath.Join(UserHomeDir(), \".aws\", \"config\")\n}\n\n// UserHomeDir returns the home directory for the user the process is\n// running under.\nfunc UserHomeDir() string {\n\t// Ignore errors since we only care about Windows and *nix.\n\thome, _ := os.UserHomeDir()\n\n\tif len(home) > 0 {\n\t\treturn home\n\t}\n\n\tcurrUser, _ := user.Current()\n\tif currUser != nil {\n\t\thome = currUser.HomeDir\n\t}\n\n\treturn home\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/strings/strings.go",
    "content": "package strings\n\nimport (\n\t\"strings\"\n)\n\n// HasPrefixFold tests whether the string s begins with prefix, interpreted as UTF-8 strings,\n// under Unicode case-folding.\nfunc HasPrefixFold(s, prefix string) bool {\n\treturn len(s) >= len(prefix) && strings.EqualFold(s[0:len(prefix)], prefix)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/sync/singleflight/LICENSE",
    "content": "Copyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/sync/singleflight/docs.go",
    "content": "// Package singleflight provides a duplicate function call suppression\n// mechanism. This package is a fork of the Go golang.org/x/sync/singleflight\n// package. The package is forked, because the package a part of the unstable\n// and unversioned golang.org/x/sync module.\n//\n// https://github.com/golang/sync/tree/67f06af15bc961c363a7260195bcd53487529a21/singleflight\npackage singleflight\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/sync/singleflight/singleflight.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage singleflight\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"runtime\"\n\t\"runtime/debug\"\n\t\"sync\"\n)\n\n// errGoexit indicates the runtime.Goexit was called in\n// the user given function.\nvar errGoexit = errors.New(\"runtime.Goexit was called\")\n\n// A panicError is an arbitrary value recovered from a panic\n// with the stack trace during the execution of given function.\ntype panicError struct {\n\tvalue interface{}\n\tstack []byte\n}\n\n// Error implements error interface.\nfunc (p *panicError) Error() string {\n\treturn fmt.Sprintf(\"%v\\n\\n%s\", p.value, p.stack)\n}\n\nfunc newPanicError(v interface{}) error {\n\tstack := debug.Stack()\n\n\t// The first line of the stack trace is of the form \"goroutine N [status]:\"\n\t// but by the time the panic reaches Do the goroutine may no longer exist\n\t// and its status will have changed. Trim out the misleading line.\n\tif line := bytes.IndexByte(stack[:], '\\n'); line >= 0 {\n\t\tstack = stack[line+1:]\n\t}\n\treturn &panicError{value: v, stack: stack}\n}\n\n// call is an in-flight or completed singleflight.Do call\ntype call struct {\n\twg sync.WaitGroup\n\n\t// These fields are written once before the WaitGroup is done\n\t// and are only read after the WaitGroup is done.\n\tval interface{}\n\terr error\n\n\t// forgotten indicates whether Forget was called with this call's key\n\t// while the call was still in flight.\n\tforgotten bool\n\n\t// These fields are read and written with the singleflight\n\t// mutex held before the WaitGroup is done, and are read but\n\t// not written after the WaitGroup is done.\n\tdups  int\n\tchans []chan<- Result\n}\n\n// Group represents a class of work and forms a namespace in\n// which units of work can be executed with duplicate suppression.\ntype Group struct {\n\tmu sync.Mutex       // protects m\n\tm  map[string]*call // lazily initialized\n}\n\n// Result holds the results of Do, so they can be passed\n// on a channel.\ntype Result struct {\n\tVal    interface{}\n\tErr    error\n\tShared bool\n}\n\n// Do executes and returns the results of the given function, making\n// sure that only one execution is in-flight for a given key at a\n// time. If a duplicate comes in, the duplicate caller waits for the\n// original to complete and receives the same results.\n// The return value shared indicates whether v was given to multiple callers.\nfunc (g *Group) Do(key string, fn func() (interface{}, error)) (v interface{}, err error, shared bool) {\n\tg.mu.Lock()\n\tif g.m == nil {\n\t\tg.m = make(map[string]*call)\n\t}\n\tif c, ok := g.m[key]; ok {\n\t\tc.dups++\n\t\tg.mu.Unlock()\n\t\tc.wg.Wait()\n\n\t\tif e, ok := c.err.(*panicError); ok {\n\t\t\tpanic(e)\n\t\t} else if c.err == errGoexit {\n\t\t\truntime.Goexit()\n\t\t}\n\t\treturn c.val, c.err, true\n\t}\n\tc := new(call)\n\tc.wg.Add(1)\n\tg.m[key] = c\n\tg.mu.Unlock()\n\n\tg.doCall(c, key, fn)\n\treturn c.val, c.err, c.dups > 0\n}\n\n// DoChan is like Do but returns a channel that will receive the\n// results when they are ready.\n//\n// The returned channel will not be closed.\nfunc (g *Group) DoChan(key string, fn func() (interface{}, error)) <-chan Result {\n\tch := make(chan Result, 1)\n\tg.mu.Lock()\n\tif g.m == nil {\n\t\tg.m = make(map[string]*call)\n\t}\n\tif c, ok := g.m[key]; ok {\n\t\tc.dups++\n\t\tc.chans = append(c.chans, ch)\n\t\tg.mu.Unlock()\n\t\treturn ch\n\t}\n\tc := &call{chans: []chan<- Result{ch}}\n\tc.wg.Add(1)\n\tg.m[key] = c\n\tg.mu.Unlock()\n\n\tgo g.doCall(c, key, fn)\n\n\treturn ch\n}\n\n// doCall handles the single call for a key.\nfunc (g *Group) doCall(c *call, key string, fn func() (interface{}, error)) {\n\tnormalReturn := false\n\trecovered := false\n\n\t// use double-defer to distinguish panic from runtime.Goexit,\n\t// more details see https://golang.org/cl/134395\n\tdefer func() {\n\t\t// the given function invoked runtime.Goexit\n\t\tif !normalReturn && !recovered {\n\t\t\tc.err = errGoexit\n\t\t}\n\n\t\tc.wg.Done()\n\t\tg.mu.Lock()\n\t\tdefer g.mu.Unlock()\n\t\tif !c.forgotten {\n\t\t\tdelete(g.m, key)\n\t\t}\n\n\t\tif e, ok := c.err.(*panicError); ok {\n\t\t\t// In order to prevent the waiting channels from being blocked forever,\n\t\t\t// needs to ensure that this panic cannot be recovered.\n\t\t\tif len(c.chans) > 0 {\n\t\t\t\tgo panic(e)\n\t\t\t\tselect {} // Keep this goroutine around so that it will appear in the crash dump.\n\t\t\t} else {\n\t\t\t\tpanic(e)\n\t\t\t}\n\t\t} else if c.err == errGoexit {\n\t\t\t// Already in the process of goexit, no need to call again\n\t\t} else {\n\t\t\t// Normal return\n\t\t\tfor _, ch := range c.chans {\n\t\t\t\tch <- Result{c.val, c.err, c.dups > 0}\n\t\t\t}\n\t\t}\n\t}()\n\n\tfunc() {\n\t\tdefer func() {\n\t\t\tif !normalReturn {\n\t\t\t\t// Ideally, we would wait to take a stack trace until we've determined\n\t\t\t\t// whether this is a panic or a runtime.Goexit.\n\t\t\t\t//\n\t\t\t\t// Unfortunately, the only way we can distinguish the two is to see\n\t\t\t\t// whether the recover stopped the goroutine from terminating, and by\n\t\t\t\t// the time we know that, the part of the stack trace relevant to the\n\t\t\t\t// panic has been discarded.\n\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\tc.err = newPanicError(r)\n\t\t\t\t}\n\t\t\t}\n\t\t}()\n\n\t\tc.val, c.err = fn()\n\t\tnormalReturn = true\n\t}()\n\n\tif !normalReturn {\n\t\trecovered = true\n\t}\n}\n\n// Forget tells the singleflight to forget about a key.  Future calls\n// to Do for this key will call the function rather than waiting for\n// an earlier call to complete.\nfunc (g *Group) Forget(key string) {\n\tg.mu.Lock()\n\tif c, ok := g.m[key]; ok {\n\t\tc.forgotten = true\n\t}\n\tdelete(g.m, key)\n\tg.mu.Unlock()\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/timeconv/duration.go",
    "content": "package timeconv\n\nimport \"time\"\n\n// FloatSecondsDur converts a fractional seconds to duration.\nfunc FloatSecondsDur(v float64) time.Duration {\n\treturn time.Duration(v * float64(time.Second))\n}\n\n// DurSecondsFloat converts a duration into fractional seconds.\nfunc DurSecondsFloat(d time.Duration) float64 {\n\treturn float64(d) / float64(time.Second)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/CHANGELOG.md",
    "content": "# v1.3.34 (2025-02-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.33 (2025-02-18)\n\n* **Bug Fix**: Bump go version to 1.22\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.32 (2025-02-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.31 (2025-01-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.30 (2025-01-30)\n\n* **Bug Fix**: Do not sign Transfer-Encoding header in Sigv4[a]. Fixes a signer mismatch issue with S3 Accelerate.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.29 (2025-01-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n* **Dependency Update**: Upgrade to smithy-go v1.22.2.\n\n# v1.3.28 (2025-01-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.27 (2025-01-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.26 (2024-12-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.25 (2024-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.24 (2024-11-18)\n\n* **Dependency Update**: Update to smithy-go v1.22.1.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.23 (2024-11-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.22 (2024-10-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.21 (2024-10-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.20 (2024-10-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.19 (2024-10-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.18 (2024-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.17 (2024-09-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.16 (2024-08-15)\n\n* **Dependency Update**: Bump minimum Go version to 1.21.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.15 (2024-07-10.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.14 (2024-07-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.13 (2024-06-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.12 (2024-06-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.11 (2024-06-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.10 (2024-06-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.9 (2024-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.8 (2024-06-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.7 (2024-05-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.6 (2024-05-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.5 (2024-03-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.4 (2024-03-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.3 (2024-03-07)\n\n* **Bug Fix**: Remove dependency on go-cmp.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.2 (2024-02-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.1 (2024-02-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.0 (2024-02-13)\n\n* **Feature**: Bump minimum Go version to 1.20 per our language support policy.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.10 (2024-01-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.9 (2023-12-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.8 (2023-12-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.7 (2023-11-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.6 (2023-11-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.5 (2023-11-28.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.4 (2023-11-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.3 (2023-11-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.2 (2023-11-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.1 (2023-11-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.0 (2023-10-31)\n\n* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.6 (2023-10-12)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.5 (2023-10-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.4 (2023-08-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.3 (2023-08-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.2 (2023-08-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.1 (2023-08-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.0 (2023-07-31)\n\n* **Feature**: Adds support for smithy-modeled endpoint resolution. A new rules-based endpoint resolution will be added to the SDK which will supercede and deprecate existing endpoint resolution. Specifically, EndpointResolver will be deprecated while BaseEndpoint and EndpointResolverV2 will take its place. For more information, please see the Endpoints section in our Developer Guide.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.28 (2023-07-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.27 (2023-07-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.26 (2023-06-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.25 (2023-04-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.24 (2023-04-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.23 (2023-03-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.22 (2023-03-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.21 (2023-02-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.20 (2023-02-14)\n\n* No change notes available for this release.\n\n# v1.0.19 (2023-02-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.18 (2022-12-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.17 (2022-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.16 (2022-10-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.15 (2022-10-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.14 (2022-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.13 (2022-09-14)\n\n* **Bug Fix**: Fixes an issues where an error from an underlying SigV4 credential provider would not be surfaced from the SigV4a credential provider. Contribution by [sakthipriyan-aqfer](https://github.com/sakthipriyan-aqfer).\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.12 (2022-09-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.11 (2022-08-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.10 (2022-08-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.9 (2022-08-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.8 (2022-08-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.7 (2022-08-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.6 (2022-08-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.5 (2022-07-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.4 (2022-06-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.3 (2022-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.2 (2022-05-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.1 (2022-04-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.0 (2022-04-07)\n\n* **Release**: New internal v4a signing module location.\n\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/credentials.go",
    "content": "package v4a\n\nimport (\n\t\"context\"\n\t\"crypto/ecdsa\"\n\t\"fmt\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/sdk\"\n)\n\n// Credentials is Context, ECDSA, and Optional Session Token that can be used\n// to sign requests using SigV4a\ntype Credentials struct {\n\tContext      string\n\tPrivateKey   *ecdsa.PrivateKey\n\tSessionToken string\n\n\t// Time the credentials will expire.\n\tCanExpire bool\n\tExpires   time.Time\n}\n\n// Expired returns if the credentials have expired.\nfunc (v Credentials) Expired() bool {\n\tif v.CanExpire {\n\t\treturn !v.Expires.After(sdk.NowTime())\n\t}\n\n\treturn false\n}\n\n// HasKeys returns if the credentials keys are set.\nfunc (v Credentials) HasKeys() bool {\n\treturn len(v.Context) > 0 && v.PrivateKey != nil\n}\n\n// SymmetricCredentialAdaptor wraps a SigV4 AccessKey/SecretKey provider and adapts the credentials\n// to a ECDSA PrivateKey for signing with SiV4a\ntype SymmetricCredentialAdaptor struct {\n\tSymmetricProvider aws.CredentialsProvider\n\n\tasymmetric atomic.Value\n\tm          sync.Mutex\n}\n\n// Retrieve retrieves symmetric credentials from the underlying provider.\nfunc (s *SymmetricCredentialAdaptor) Retrieve(ctx context.Context) (aws.Credentials, error) {\n\tsymCreds, err := s.retrieveFromSymmetricProvider(ctx)\n\tif err != nil {\n\t\treturn aws.Credentials{}, err\n\t}\n\n\tif asymCreds := s.getCreds(); asymCreds == nil {\n\t\treturn symCreds, nil\n\t}\n\n\ts.m.Lock()\n\tdefer s.m.Unlock()\n\n\tasymCreds := s.getCreds()\n\tif asymCreds == nil {\n\t\treturn symCreds, nil\n\t}\n\n\t// if the context does not match the access key id clear it\n\tif asymCreds.Context != symCreds.AccessKeyID {\n\t\ts.asymmetric.Store((*Credentials)(nil))\n\t}\n\n\treturn symCreds, nil\n}\n\n// RetrievePrivateKey returns credentials suitable for SigV4a signing\nfunc (s *SymmetricCredentialAdaptor) RetrievePrivateKey(ctx context.Context) (Credentials, error) {\n\tif asymCreds := s.getCreds(); asymCreds != nil {\n\t\treturn *asymCreds, nil\n\t}\n\n\ts.m.Lock()\n\tdefer s.m.Unlock()\n\n\tif asymCreds := s.getCreds(); asymCreds != nil {\n\t\treturn *asymCreds, nil\n\t}\n\n\tsymmetricCreds, err := s.retrieveFromSymmetricProvider(ctx)\n\tif err != nil {\n\t\treturn Credentials{}, fmt.Errorf(\"failed to retrieve symmetric credentials: %v\", err)\n\t}\n\n\tprivateKey, err := deriveKeyFromAccessKeyPair(symmetricCreds.AccessKeyID, symmetricCreds.SecretAccessKey)\n\tif err != nil {\n\t\treturn Credentials{}, fmt.Errorf(\"failed to derive assymetric key from credentials\")\n\t}\n\n\tcreds := Credentials{\n\t\tContext:      symmetricCreds.AccessKeyID,\n\t\tPrivateKey:   privateKey,\n\t\tSessionToken: symmetricCreds.SessionToken,\n\t\tCanExpire:    symmetricCreds.CanExpire,\n\t\tExpires:      symmetricCreds.Expires,\n\t}\n\n\ts.asymmetric.Store(&creds)\n\n\treturn creds, nil\n}\n\nfunc (s *SymmetricCredentialAdaptor) getCreds() *Credentials {\n\tv := s.asymmetric.Load()\n\n\tif v == nil {\n\t\treturn nil\n\t}\n\n\tc := v.(*Credentials)\n\tif c != nil && c.HasKeys() && !c.Expired() {\n\t\treturn c\n\t}\n\n\treturn nil\n}\n\nfunc (s *SymmetricCredentialAdaptor) retrieveFromSymmetricProvider(ctx context.Context) (aws.Credentials, error) {\n\tcredentials, err := s.SymmetricProvider.Retrieve(ctx)\n\tif err != nil {\n\t\treturn aws.Credentials{}, err\n\t}\n\n\treturn credentials, nil\n}\n\n// CredentialsProvider is the interface for a provider to retrieve credentials\n// to sign requests with.\ntype CredentialsProvider interface {\n\tRetrievePrivateKey(context.Context) (Credentials, error)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/error.go",
    "content": "package v4a\n\nimport \"fmt\"\n\n// SigningError indicates an error condition occurred while performing SigV4a signing\ntype SigningError struct {\n\tErr error\n}\n\nfunc (e *SigningError) Error() string {\n\treturn fmt.Sprintf(\"failed to sign request: %v\", e.Err)\n}\n\n// Unwrap returns the underlying error cause\nfunc (e *SigningError) Unwrap() error {\n\treturn e.Err\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/go_module_metadata.go",
    "content": "// Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT.\n\npackage v4a\n\n// goModuleVersion is the tagged release for this module\nconst goModuleVersion = \"1.3.34\"\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto/compare.go",
    "content": "package crypto\n\nimport \"fmt\"\n\n// ConstantTimeByteCompare is a constant-time byte comparison of x and y. This function performs an absolute comparison\n// if the two byte slices assuming they represent a big-endian number.\n//\n//\t\t error if len(x) != len(y)\n//\t  -1 if x <  y\n//\t   0 if x == y\n//\t  +1 if x >  y\nfunc ConstantTimeByteCompare(x, y []byte) (int, error) {\n\tif len(x) != len(y) {\n\t\treturn 0, fmt.Errorf(\"slice lengths do not match\")\n\t}\n\n\txLarger, yLarger := 0, 0\n\n\tfor i := 0; i < len(x); i++ {\n\t\txByte, yByte := int(x[i]), int(y[i])\n\n\t\tx := ((yByte - xByte) >> 8) & 1\n\t\ty := ((xByte - yByte) >> 8) & 1\n\n\t\txLarger |= x &^ yLarger\n\t\tyLarger |= y &^ xLarger\n\t}\n\n\treturn xLarger - yLarger, nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto/ecc.go",
    "content": "package crypto\n\nimport (\n\t\"bytes\"\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"crypto/hmac\"\n\t\"encoding/asn1\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"hash\"\n\t\"math\"\n\t\"math/big\"\n)\n\ntype ecdsaSignature struct {\n\tR, S *big.Int\n}\n\n// ECDSAKey takes the given elliptic curve, and private key (d) byte slice\n// and returns the private ECDSA key.\nfunc ECDSAKey(curve elliptic.Curve, d []byte) *ecdsa.PrivateKey {\n\treturn ECDSAKeyFromPoint(curve, (&big.Int{}).SetBytes(d))\n}\n\n// ECDSAKeyFromPoint takes the given elliptic curve and point and returns the\n// private and public keypair\nfunc ECDSAKeyFromPoint(curve elliptic.Curve, d *big.Int) *ecdsa.PrivateKey {\n\tpX, pY := curve.ScalarBaseMult(d.Bytes())\n\n\tprivKey := &ecdsa.PrivateKey{\n\t\tPublicKey: ecdsa.PublicKey{\n\t\t\tCurve: curve,\n\t\t\tX:     pX,\n\t\t\tY:     pY,\n\t\t},\n\t\tD: d,\n\t}\n\n\treturn privKey\n}\n\n// ECDSAPublicKey takes the provide curve and (x, y) coordinates and returns\n// *ecdsa.PublicKey. Returns an error if the given points are not on the curve.\nfunc ECDSAPublicKey(curve elliptic.Curve, x, y []byte) (*ecdsa.PublicKey, error) {\n\txPoint := (&big.Int{}).SetBytes(x)\n\tyPoint := (&big.Int{}).SetBytes(y)\n\n\tif !curve.IsOnCurve(xPoint, yPoint) {\n\t\treturn nil, fmt.Errorf(\"point(%v, %v) is not on the given curve\", xPoint.String(), yPoint.String())\n\t}\n\n\treturn &ecdsa.PublicKey{\n\t\tCurve: curve,\n\t\tX:     xPoint,\n\t\tY:     yPoint,\n\t}, nil\n}\n\n// VerifySignature takes the provided public key, hash, and asn1 encoded signature and returns\n// whether the given signature is valid.\nfunc VerifySignature(key *ecdsa.PublicKey, hash []byte, signature []byte) (bool, error) {\n\tvar ecdsaSignature ecdsaSignature\n\n\t_, err := asn1.Unmarshal(signature, &ecdsaSignature)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\treturn ecdsa.Verify(key, hash, ecdsaSignature.R, ecdsaSignature.S), nil\n}\n\n// HMACKeyDerivation provides an implementation of a NIST-800-108 of a KDF (Key Derivation Function) in Counter Mode.\n// For the purposes of this implantation HMAC is used as the PRF (Pseudorandom function), where the value of\n// `r` is defined as a 4 byte counter.\nfunc HMACKeyDerivation(hash func() hash.Hash, bitLen int, key []byte, label, context []byte) ([]byte, error) {\n\t// verify that we won't overflow the counter\n\tn := int64(math.Ceil((float64(bitLen) / 8) / float64(hash().Size())))\n\tif n > 0x7FFFFFFF {\n\t\treturn nil, fmt.Errorf(\"unable to derive key of size %d using 32-bit counter\", bitLen)\n\t}\n\n\t// verify the requested bit length is not larger then the length encoding size\n\tif int64(bitLen) > 0x7FFFFFFF {\n\t\treturn nil, fmt.Errorf(\"bitLen is greater than 32-bits\")\n\t}\n\n\tfixedInput := bytes.NewBuffer(nil)\n\tfixedInput.Write(label)\n\tfixedInput.WriteByte(0x00)\n\tfixedInput.Write(context)\n\tif err := binary.Write(fixedInput, binary.BigEndian, int32(bitLen)); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to write bit length to fixed input string: %v\", err)\n\t}\n\n\tvar output []byte\n\n\th := hmac.New(hash, key)\n\n\tfor i := int64(1); i <= n; i++ {\n\t\th.Reset()\n\t\tif err := binary.Write(h, binary.BigEndian, int32(i)); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t_, err := h.Write(fixedInput.Bytes())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\toutput = append(output, h.Sum(nil)...)\n\t}\n\n\treturn output[:bitLen/8], nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/const.go",
    "content": "package v4\n\nconst (\n\t// EmptyStringSHA256 is the hex encoded sha256 value of an empty string\n\tEmptyStringSHA256 = `e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855`\n\n\t// UnsignedPayload indicates that the request payload body is unsigned\n\tUnsignedPayload = \"UNSIGNED-PAYLOAD\"\n\n\t// AmzAlgorithmKey indicates the signing algorithm\n\tAmzAlgorithmKey = \"X-Amz-Algorithm\"\n\n\t// AmzSecurityTokenKey indicates the security token to be used with temporary credentials\n\tAmzSecurityTokenKey = \"X-Amz-Security-Token\"\n\n\t// AmzDateKey is the UTC timestamp for the request in the format YYYYMMDD'T'HHMMSS'Z'\n\tAmzDateKey = \"X-Amz-Date\"\n\n\t// AmzCredentialKey is the access key ID and credential scope\n\tAmzCredentialKey = \"X-Amz-Credential\"\n\n\t// AmzSignedHeadersKey is the set of headers signed for the request\n\tAmzSignedHeadersKey = \"X-Amz-SignedHeaders\"\n\n\t// AmzSignatureKey is the query parameter to store the SigV4 signature\n\tAmzSignatureKey = \"X-Amz-Signature\"\n\n\t// TimeFormat is the time format to be used in the X-Amz-Date header or query parameter\n\tTimeFormat = \"20060102T150405Z\"\n\n\t// ShortTimeFormat is the shorten time format used in the credential scope\n\tShortTimeFormat = \"20060102\"\n\n\t// ContentSHAKey is the SHA256 of request body\n\tContentSHAKey = \"X-Amz-Content-Sha256\"\n)\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/header_rules.go",
    "content": "package v4\n\nimport (\n\tsdkstrings \"github.com/aws/aws-sdk-go-v2/internal/strings\"\n)\n\n// Rules houses a set of Rule needed for validation of a\n// string value\ntype Rules []Rule\n\n// Rule interface allows for more flexible rules and just simply\n// checks whether or not a value adheres to that Rule\ntype Rule interface {\n\tIsValid(value string) bool\n}\n\n// IsValid will iterate through all rules and see if any rules\n// apply to the value and supports nested rules\nfunc (r Rules) IsValid(value string) bool {\n\tfor _, rule := range r {\n\t\tif rule.IsValid(value) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// MapRule generic Rule for maps\ntype MapRule map[string]struct{}\n\n// IsValid for the map Rule satisfies whether it exists in the map\nfunc (m MapRule) IsValid(value string) bool {\n\t_, ok := m[value]\n\treturn ok\n}\n\n// AllowList is a generic Rule for whitelisting\ntype AllowList struct {\n\tRule\n}\n\n// IsValid for AllowList checks if the value is within the AllowList\nfunc (w AllowList) IsValid(value string) bool {\n\treturn w.Rule.IsValid(value)\n}\n\n// DenyList is a generic Rule for blacklisting\ntype DenyList struct {\n\tRule\n}\n\n// IsValid for AllowList checks if the value is within the AllowList\nfunc (b DenyList) IsValid(value string) bool {\n\treturn !b.Rule.IsValid(value)\n}\n\n// Patterns is a list of strings to match against\ntype Patterns []string\n\n// IsValid for Patterns checks each pattern and returns if a match has\n// been found\nfunc (p Patterns) IsValid(value string) bool {\n\tfor _, pattern := range p {\n\t\tif sdkstrings.HasPrefixFold(value, pattern) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// InclusiveRules rules allow for rules to depend on one another\ntype InclusiveRules []Rule\n\n// IsValid will return true if all rules are true\nfunc (r InclusiveRules) IsValid(value string) bool {\n\tfor _, rule := range r {\n\t\tif !rule.IsValid(value) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/headers.go",
    "content": "package v4\n\n// IgnoredHeaders is a list of headers that are ignored during signing\nvar IgnoredHeaders = Rules{\n\tDenyList{\n\t\tMapRule{\n\t\t\t\"Authorization\":     struct{}{},\n\t\t\t\"User-Agent\":        struct{}{},\n\t\t\t\"X-Amzn-Trace-Id\":   struct{}{},\n\t\t\t\"Transfer-Encoding\": struct{}{},\n\t\t},\n\t},\n}\n\n// RequiredSignedHeaders is a whitelist for Build canonical headers.\nvar RequiredSignedHeaders = Rules{\n\tAllowList{\n\t\tMapRule{\n\t\t\t\"Cache-Control\":                         struct{}{},\n\t\t\t\"Content-Disposition\":                   struct{}{},\n\t\t\t\"Content-Encoding\":                      struct{}{},\n\t\t\t\"Content-Language\":                      struct{}{},\n\t\t\t\"Content-Md5\":                           struct{}{},\n\t\t\t\"Content-Type\":                          struct{}{},\n\t\t\t\"Expires\":                               struct{}{},\n\t\t\t\"If-Match\":                              struct{}{},\n\t\t\t\"If-Modified-Since\":                     struct{}{},\n\t\t\t\"If-None-Match\":                         struct{}{},\n\t\t\t\"If-Unmodified-Since\":                   struct{}{},\n\t\t\t\"Range\":                                 struct{}{},\n\t\t\t\"X-Amz-Acl\":                             struct{}{},\n\t\t\t\"X-Amz-Copy-Source\":                     struct{}{},\n\t\t\t\"X-Amz-Copy-Source-If-Match\":            struct{}{},\n\t\t\t\"X-Amz-Copy-Source-If-Modified-Since\":   struct{}{},\n\t\t\t\"X-Amz-Copy-Source-If-None-Match\":       struct{}{},\n\t\t\t\"X-Amz-Copy-Source-If-Unmodified-Since\": struct{}{},\n\t\t\t\"X-Amz-Copy-Source-Range\":               struct{}{},\n\t\t\t\"X-Amz-Copy-Source-Server-Side-Encryption-Customer-Algorithm\": struct{}{},\n\t\t\t\"X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key\":       struct{}{},\n\t\t\t\"X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key-Md5\":   struct{}{},\n\t\t\t\"X-Amz-Grant-Full-control\":                                    struct{}{},\n\t\t\t\"X-Amz-Grant-Read\":                                            struct{}{},\n\t\t\t\"X-Amz-Grant-Read-Acp\":                                        struct{}{},\n\t\t\t\"X-Amz-Grant-Write\":                                           struct{}{},\n\t\t\t\"X-Amz-Grant-Write-Acp\":                                       struct{}{},\n\t\t\t\"X-Amz-Metadata-Directive\":                                    struct{}{},\n\t\t\t\"X-Amz-Mfa\":                                                   struct{}{},\n\t\t\t\"X-Amz-Request-Payer\":                                         struct{}{},\n\t\t\t\"X-Amz-Server-Side-Encryption\":                                struct{}{},\n\t\t\t\"X-Amz-Server-Side-Encryption-Aws-Kms-Key-Id\":                 struct{}{},\n\t\t\t\"X-Amz-Server-Side-Encryption-Customer-Algorithm\":             struct{}{},\n\t\t\t\"X-Amz-Server-Side-Encryption-Customer-Key\":                   struct{}{},\n\t\t\t\"X-Amz-Server-Side-Encryption-Customer-Key-Md5\":               struct{}{},\n\t\t\t\"X-Amz-Storage-Class\":                                         struct{}{},\n\t\t\t\"X-Amz-Website-Redirect-Location\":                             struct{}{},\n\t\t\t\"X-Amz-Content-Sha256\":                                        struct{}{},\n\t\t\t\"X-Amz-Tagging\":                                               struct{}{},\n\t\t},\n\t},\n\tPatterns{\"X-Amz-Meta-\"},\n}\n\n// AllowedQueryHoisting is a whitelist for Build query headers. The boolean value\n// represents whether or not it is a pattern.\nvar AllowedQueryHoisting = InclusiveRules{\n\tDenyList{RequiredSignedHeaders},\n\tPatterns{\"X-Amz-\"},\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/hmac.go",
    "content": "package v4\n\nimport (\n\t\"crypto/hmac\"\n\t\"crypto/sha256\"\n)\n\n// HMACSHA256 computes a HMAC-SHA256 of data given the provided key.\nfunc HMACSHA256(key []byte, data []byte) []byte {\n\thash := hmac.New(sha256.New, key)\n\thash.Write(data)\n\treturn hash.Sum(nil)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/host.go",
    "content": "package v4\n\nimport (\n\t\"net/http\"\n\t\"strings\"\n)\n\n// SanitizeHostForHeader removes default port from host and updates request.Host\nfunc SanitizeHostForHeader(r *http.Request) {\n\thost := getHost(r)\n\tport := portOnly(host)\n\tif port != \"\" && isDefaultPort(r.URL.Scheme, port) {\n\t\tr.Host = stripPort(host)\n\t}\n}\n\n// Returns host from request\nfunc getHost(r *http.Request) string {\n\tif r.Host != \"\" {\n\t\treturn r.Host\n\t}\n\n\treturn r.URL.Host\n}\n\n// Hostname returns u.Host, without any port number.\n//\n// If Host is an IPv6 literal with a port number, Hostname returns the\n// IPv6 literal without the square brackets. IPv6 literals may include\n// a zone identifier.\n//\n// Copied from the Go 1.8 standard library (net/url)\nfunc stripPort(hostport string) string {\n\tcolon := strings.IndexByte(hostport, ':')\n\tif colon == -1 {\n\t\treturn hostport\n\t}\n\tif i := strings.IndexByte(hostport, ']'); i != -1 {\n\t\treturn strings.TrimPrefix(hostport[:i], \"[\")\n\t}\n\treturn hostport[:colon]\n}\n\n// Port returns the port part of u.Host, without the leading colon.\n// If u.Host doesn't contain a port, Port returns an empty string.\n//\n// Copied from the Go 1.8 standard library (net/url)\nfunc portOnly(hostport string) string {\n\tcolon := strings.IndexByte(hostport, ':')\n\tif colon == -1 {\n\t\treturn \"\"\n\t}\n\tif i := strings.Index(hostport, \"]:\"); i != -1 {\n\t\treturn hostport[i+len(\"]:\"):]\n\t}\n\tif strings.Contains(hostport, \"]\") {\n\t\treturn \"\"\n\t}\n\treturn hostport[colon+len(\":\"):]\n}\n\n// Returns true if the specified URI is using the standard port\n// (i.e. port 80 for HTTP URIs or 443 for HTTPS URIs)\nfunc isDefaultPort(scheme, port string) bool {\n\tif port == \"\" {\n\t\treturn true\n\t}\n\n\tlowerCaseScheme := strings.ToLower(scheme)\n\tif (lowerCaseScheme == \"http\" && port == \"80\") || (lowerCaseScheme == \"https\" && port == \"443\") {\n\t\treturn true\n\t}\n\n\treturn false\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/time.go",
    "content": "package v4\n\nimport \"time\"\n\n// SigningTime provides a wrapper around a time.Time which provides cached values for SigV4 signing.\ntype SigningTime struct {\n\ttime.Time\n\ttimeFormat      string\n\tshortTimeFormat string\n}\n\n// NewSigningTime creates a new SigningTime given a time.Time\nfunc NewSigningTime(t time.Time) SigningTime {\n\treturn SigningTime{\n\t\tTime: t,\n\t}\n}\n\n// TimeFormat provides a time formatted in the X-Amz-Date format.\nfunc (m *SigningTime) TimeFormat() string {\n\treturn m.format(&m.timeFormat, TimeFormat)\n}\n\n// ShortTimeFormat provides a time formatted of 20060102.\nfunc (m *SigningTime) ShortTimeFormat() string {\n\treturn m.format(&m.shortTimeFormat, ShortTimeFormat)\n}\n\nfunc (m *SigningTime) format(target *string, format string) string {\n\tif len(*target) > 0 {\n\t\treturn *target\n\t}\n\tv := m.Time.Format(format)\n\t*target = v\n\treturn v\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/util.go",
    "content": "package v4\n\nimport (\n\t\"net/url\"\n\t\"strings\"\n)\n\nconst doubleSpace = \"  \"\n\n// StripExcessSpaces will rewrite the passed in slice's string values to not\n// contain muliple side-by-side spaces.\nfunc StripExcessSpaces(str string) string {\n\tvar j, k, l, m, spaces int\n\t// Trim trailing spaces\n\tfor j = len(str) - 1; j >= 0 && str[j] == ' '; j-- {\n\t}\n\n\t// Trim leading spaces\n\tfor k = 0; k < j && str[k] == ' '; k++ {\n\t}\n\tstr = str[k : j+1]\n\n\t// Strip multiple spaces.\n\tj = strings.Index(str, doubleSpace)\n\tif j < 0 {\n\t\treturn str\n\t}\n\n\tbuf := []byte(str)\n\tfor k, m, l = j, j, len(buf); k < l; k++ {\n\t\tif buf[k] == ' ' {\n\t\t\tif spaces == 0 {\n\t\t\t\t// First space.\n\t\t\t\tbuf[m] = buf[k]\n\t\t\t\tm++\n\t\t\t}\n\t\t\tspaces++\n\t\t} else {\n\t\t\t// End of multiple spaces.\n\t\t\tspaces = 0\n\t\t\tbuf[m] = buf[k]\n\t\t\tm++\n\t\t}\n\t}\n\n\treturn string(buf[:m])\n}\n\n// GetURIPath returns the escaped URI component from the provided URL\nfunc GetURIPath(u *url.URL) string {\n\tvar uri string\n\n\tif len(u.Opaque) > 0 {\n\t\turi = \"/\" + strings.Join(strings.Split(u.Opaque, \"/\")[3:], \"/\")\n\t} else {\n\t\turi = u.EscapedPath()\n\t}\n\n\tif len(uri) == 0 {\n\t\turi = \"/\"\n\t}\n\n\treturn uri\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/middleware.go",
    "content": "package v4a\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\tv4 \"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalauth \"github.com/aws/aws-sdk-go-v2/internal/auth\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"net/http\"\n\t\"time\"\n)\n\n// HTTPSigner is SigV4a HTTP signer implementation\ntype HTTPSigner interface {\n\tSignHTTP(ctx context.Context, credentials Credentials, r *http.Request, payloadHash string, service string, regionSet []string, signingTime time.Time, optfns ...func(*SignerOptions)) error\n}\n\n// SignHTTPRequestMiddlewareOptions is the middleware options for constructing a SignHTTPRequestMiddleware.\ntype SignHTTPRequestMiddlewareOptions struct {\n\tCredentials CredentialsProvider\n\tSigner      HTTPSigner\n\tLogSigning  bool\n}\n\n// SignHTTPRequestMiddleware is a middleware for signing an HTTP request using SigV4a.\ntype SignHTTPRequestMiddleware struct {\n\tcredentials CredentialsProvider\n\tsigner      HTTPSigner\n\tlogSigning  bool\n}\n\n// NewSignHTTPRequestMiddleware constructs a SignHTTPRequestMiddleware using the given SignHTTPRequestMiddlewareOptions.\nfunc NewSignHTTPRequestMiddleware(options SignHTTPRequestMiddlewareOptions) *SignHTTPRequestMiddleware {\n\treturn &SignHTTPRequestMiddleware{\n\t\tcredentials: options.Credentials,\n\t\tsigner:      options.Signer,\n\t\tlogSigning:  options.LogSigning,\n\t}\n}\n\n// ID the middleware identifier.\nfunc (s *SignHTTPRequestMiddleware) ID() string {\n\treturn \"Signing\"\n}\n\n// HandleFinalize signs an HTTP request using SigV4a.\nfunc (s *SignHTTPRequestMiddleware) HandleFinalize(\n\tctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,\n) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\tif !hasCredentialProvider(s.credentials) {\n\t\treturn next.HandleFinalize(ctx, in)\n\t}\n\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unexpected request middleware type %T\", in.Request)\n\t}\n\n\tsigningName, signingRegion := awsmiddleware.GetSigningName(ctx), awsmiddleware.GetSigningRegion(ctx)\n\tpayloadHash := v4.GetPayloadHash(ctx)\n\tif len(payloadHash) == 0 {\n\t\treturn out, metadata, &SigningError{Err: fmt.Errorf(\"computed payload hash missing from context\")}\n\t}\n\n\tcredentials, err := s.credentials.RetrievePrivateKey(ctx)\n\tif err != nil {\n\t\treturn out, metadata, &SigningError{Err: fmt.Errorf(\"failed to retrieve credentials: %w\", err)}\n\t}\n\n\tsignerOptions := []func(o *SignerOptions){\n\t\tfunc(o *SignerOptions) {\n\t\t\to.Logger = middleware.GetLogger(ctx)\n\t\t\to.LogSigning = s.logSigning\n\t\t},\n\t}\n\n\t// existing DisableURIPathEscaping is equivalent in purpose\n\t// to authentication scheme property DisableDoubleEncoding\n\tdisableDoubleEncoding, overridden := internalauth.GetDisableDoubleEncoding(ctx)\n\tif overridden {\n\t\tsignerOptions = append(signerOptions, func(o *SignerOptions) {\n\t\t\to.DisableURIPathEscaping = disableDoubleEncoding\n\t\t})\n\t}\n\n\terr = s.signer.SignHTTP(ctx, credentials, req.Request, payloadHash, signingName, []string{signingRegion}, time.Now().UTC(), signerOptions...)\n\tif err != nil {\n\t\treturn out, metadata, &SigningError{Err: fmt.Errorf(\"failed to sign http request, %w\", err)}\n\t}\n\n\treturn next.HandleFinalize(ctx, in)\n}\n\nfunc hasCredentialProvider(p CredentialsProvider) bool {\n\tif p == nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// RegisterSigningMiddleware registers the SigV4a signing middleware to the stack. If a signing middleware is already\n// present, this provided middleware will be swapped. Otherwise the middleware will be added at the tail of the\n// finalize step.\nfunc RegisterSigningMiddleware(stack *middleware.Stack, signingMiddleware *SignHTTPRequestMiddleware) (err error) {\n\tconst signedID = \"Signing\"\n\t_, present := stack.Finalize.Get(signedID)\n\tif present {\n\t\t_, err = stack.Finalize.Swap(signedID, signingMiddleware)\n\t} else {\n\t\terr = stack.Finalize.Add(signingMiddleware, middleware.After)\n\t}\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/presign_middleware.go",
    "content": "package v4a\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"time\"\n\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\tv4 \"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/sdk\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyHTTP \"github.com/aws/smithy-go/transport/http\"\n)\n\n// HTTPPresigner is an interface to a SigV4a signer that can sign create a\n// presigned URL for a HTTP requests.\ntype HTTPPresigner interface {\n\tPresignHTTP(\n\t\tctx context.Context, credentials Credentials, r *http.Request,\n\t\tpayloadHash string, service string, regionSet []string, signingTime time.Time,\n\t\toptFns ...func(*SignerOptions),\n\t) (url string, signedHeader http.Header, err error)\n}\n\n// PresignHTTPRequestMiddlewareOptions is the options for the PresignHTTPRequestMiddleware middleware.\ntype PresignHTTPRequestMiddlewareOptions struct {\n\tCredentialsProvider CredentialsProvider\n\tPresigner           HTTPPresigner\n\tLogSigning          bool\n}\n\n// PresignHTTPRequestMiddleware provides the Finalize middleware for creating a\n// presigned URL for an HTTP request.\n//\n// Will short circuit the middleware stack and not forward onto the next\n// Finalize handler.\ntype PresignHTTPRequestMiddleware struct {\n\tcredentialsProvider CredentialsProvider\n\tpresigner           HTTPPresigner\n\tlogSigning          bool\n}\n\n// NewPresignHTTPRequestMiddleware returns a new PresignHTTPRequestMiddleware\n// initialized with the presigner.\nfunc NewPresignHTTPRequestMiddleware(options PresignHTTPRequestMiddlewareOptions) *PresignHTTPRequestMiddleware {\n\treturn &PresignHTTPRequestMiddleware{\n\t\tcredentialsProvider: options.CredentialsProvider,\n\t\tpresigner:           options.Presigner,\n\t\tlogSigning:          options.LogSigning,\n\t}\n}\n\n// ID provides the middleware ID.\nfunc (*PresignHTTPRequestMiddleware) ID() string { return \"PresignHTTPRequest\" }\n\n// HandleFinalize will take the provided input and create a presigned url for\n// the http request using the SigV4 presign authentication scheme.\nfunc (s *PresignHTTPRequestMiddleware) HandleFinalize(\n\tctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,\n) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\treq, ok := in.Request.(*smithyHTTP.Request)\n\tif !ok {\n\t\treturn out, metadata, &SigningError{\n\t\t\tErr: fmt.Errorf(\"unexpected request middleware type %T\", in.Request),\n\t\t}\n\t}\n\n\thttpReq := req.Build(ctx)\n\tif !hasCredentialProvider(s.credentialsProvider) {\n\t\tout.Result = &v4.PresignedHTTPRequest{\n\t\t\tURL:          httpReq.URL.String(),\n\t\t\tMethod:       httpReq.Method,\n\t\t\tSignedHeader: http.Header{},\n\t\t}\n\n\t\treturn out, metadata, nil\n\t}\n\n\tsigningName := awsmiddleware.GetSigningName(ctx)\n\tsigningRegion := awsmiddleware.GetSigningRegion(ctx)\n\tpayloadHash := v4.GetPayloadHash(ctx)\n\tif len(payloadHash) == 0 {\n\t\treturn out, metadata, &SigningError{\n\t\t\tErr: fmt.Errorf(\"computed payload hash missing from context\"),\n\t\t}\n\t}\n\n\tcredentials, err := s.credentialsProvider.RetrievePrivateKey(ctx)\n\tif err != nil {\n\t\treturn out, metadata, &SigningError{\n\t\t\tErr: fmt.Errorf(\"failed to retrieve credentials: %w\", err),\n\t\t}\n\t}\n\n\tu, h, err := s.presigner.PresignHTTP(ctx, credentials,\n\t\thttpReq, payloadHash, signingName, []string{signingRegion}, sdk.NowTime(),\n\t\tfunc(o *SignerOptions) {\n\t\t\to.Logger = middleware.GetLogger(ctx)\n\t\t\to.LogSigning = s.logSigning\n\t\t})\n\tif err != nil {\n\t\treturn out, metadata, &SigningError{\n\t\t\tErr: fmt.Errorf(\"failed to sign http request, %w\", err),\n\t\t}\n\t}\n\n\tout.Result = &v4.PresignedHTTPRequest{\n\t\tURL:          u,\n\t\tMethod:       httpReq.Method,\n\t\tSignedHeader: h,\n\t}\n\n\treturn out, metadata, nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/smithy.go",
    "content": "package v4a\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\tinternalcontext \"github.com/aws/aws-sdk-go-v2/internal/context\"\n\n\tv4 \"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/sdk\"\n\t\"github.com/aws/smithy-go\"\n\t\"github.com/aws/smithy-go/auth\"\n\t\"github.com/aws/smithy-go/logging\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// CredentialsAdapter adapts v4a.Credentials to smithy auth.Identity.\ntype CredentialsAdapter struct {\n\tCredentials Credentials\n}\n\nvar _ auth.Identity = (*CredentialsAdapter)(nil)\n\n// Expiration returns the time of expiration for the credentials.\nfunc (v *CredentialsAdapter) Expiration() time.Time {\n\treturn v.Credentials.Expires\n}\n\n// CredentialsProviderAdapter adapts v4a.CredentialsProvider to\n// auth.IdentityResolver.\ntype CredentialsProviderAdapter struct {\n\tProvider CredentialsProvider\n}\n\nvar _ (auth.IdentityResolver) = (*CredentialsProviderAdapter)(nil)\n\n// GetIdentity retrieves v4a credentials using the underlying provider.\nfunc (v *CredentialsProviderAdapter) GetIdentity(ctx context.Context, _ smithy.Properties) (\n\tauth.Identity, error,\n) {\n\tcreds, err := v.Provider.RetrievePrivateKey(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"get credentials: %w\", err)\n\t}\n\n\treturn &CredentialsAdapter{Credentials: creds}, nil\n}\n\n// SignerAdapter adapts v4a.HTTPSigner to smithy http.Signer.\ntype SignerAdapter struct {\n\tSigner     HTTPSigner\n\tLogger     logging.Logger\n\tLogSigning bool\n}\n\nvar _ (smithyhttp.Signer) = (*SignerAdapter)(nil)\n\n// SignRequest signs the request with the provided identity.\nfunc (v *SignerAdapter) SignRequest(ctx context.Context, r *smithyhttp.Request, identity auth.Identity, props smithy.Properties) error {\n\tca, ok := identity.(*CredentialsAdapter)\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected identity type: %T\", identity)\n\t}\n\n\tname, ok := smithyhttp.GetSigV4SigningName(&props)\n\tif !ok {\n\t\treturn fmt.Errorf(\"sigv4a signing name is required\")\n\t}\n\n\tregions, ok := smithyhttp.GetSigV4ASigningRegions(&props)\n\tif !ok {\n\t\treturn fmt.Errorf(\"sigv4a signing region is required\")\n\t}\n\n\thash := v4.GetPayloadHash(ctx)\n\tsigningTime := sdk.NowTime()\n\tif skew := internalcontext.GetAttemptSkewContext(ctx); skew != 0 {\n\t\tsigningTime.Add(skew)\n\t}\n\terr := v.Signer.SignHTTP(ctx, ca.Credentials, r.Request, hash, name, regions, signingTime, func(o *SignerOptions) {\n\t\to.DisableURIPathEscaping, _ = smithyhttp.GetDisableDoubleEncoding(&props)\n\n\t\to.Logger = v.Logger\n\t\to.LogSigning = v.LogSigning\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"sign http: %w\", err)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/v4a.go",
    "content": "package v4a\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto\"\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"crypto/rand\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"hash\"\n\t\"math/big\"\n\t\"net/http\"\n\t\"net/textproto\"\n\t\"net/url\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\tsignerCrypto \"github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto\"\n\tv4Internal \"github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4\"\n\t\"github.com/aws/smithy-go/encoding/httpbinding\"\n\t\"github.com/aws/smithy-go/logging\"\n)\n\nconst (\n\t// AmzRegionSetKey represents the region set header used for sigv4a\n\tAmzRegionSetKey     = \"X-Amz-Region-Set\"\n\tamzAlgorithmKey     = v4Internal.AmzAlgorithmKey\n\tamzSecurityTokenKey = v4Internal.AmzSecurityTokenKey\n\tamzDateKey          = v4Internal.AmzDateKey\n\tamzCredentialKey    = v4Internal.AmzCredentialKey\n\tamzSignedHeadersKey = v4Internal.AmzSignedHeadersKey\n\tauthorizationHeader = \"Authorization\"\n\n\tsigningAlgorithm = \"AWS4-ECDSA-P256-SHA256\"\n\n\ttimeFormat      = \"20060102T150405Z\"\n\tshortTimeFormat = \"20060102\"\n\n\t// EmptyStringSHA256 is a hex encoded SHA-256 hash of an empty string\n\tEmptyStringSHA256 = v4Internal.EmptyStringSHA256\n\n\t// Version of signing v4a\n\tVersion = \"SigV4A\"\n)\n\nvar (\n\tp256          elliptic.Curve\n\tnMinusTwoP256 *big.Int\n\n\tone = new(big.Int).SetInt64(1)\n)\n\nfunc init() {\n\t// Ensure the elliptic curve parameters are initialized on package import rather then on first usage\n\tp256 = elliptic.P256()\n\n\tnMinusTwoP256 = new(big.Int).SetBytes(p256.Params().N.Bytes())\n\tnMinusTwoP256 = nMinusTwoP256.Sub(nMinusTwoP256, new(big.Int).SetInt64(2))\n}\n\n// SignerOptions is the SigV4a signing options for constructing a Signer.\ntype SignerOptions struct {\n\tLogger     logging.Logger\n\tLogSigning bool\n\n\t// Disables the Signer's moving HTTP header key/value pairs from the HTTP\n\t// request header to the request's query string. This is most commonly used\n\t// with pre-signed requests preventing headers from being added to the\n\t// request's query string.\n\tDisableHeaderHoisting bool\n\n\t// Disables the automatic escaping of the URI path of the request for the\n\t// siganture's canonical string's path. For services that do not need additional\n\t// escaping then use this to disable the signer escaping the path.\n\t//\n\t// S3 is an example of a service that does not need additional escaping.\n\t//\n\t// http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n\tDisableURIPathEscaping bool\n}\n\n// Signer is a SigV4a HTTP signing implementation\ntype Signer struct {\n\toptions SignerOptions\n}\n\n// NewSigner constructs a SigV4a Signer.\nfunc NewSigner(optFns ...func(*SignerOptions)) *Signer {\n\toptions := SignerOptions{}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &Signer{options: options}\n}\n\n// deriveKeyFromAccessKeyPair derives a NIST P-256 PrivateKey from the given\n// IAM AccessKey and SecretKey pair.\n//\n// Based on FIPS.186-4 Appendix B.4.2\nfunc deriveKeyFromAccessKeyPair(accessKey, secretKey string) (*ecdsa.PrivateKey, error) {\n\tparams := p256.Params()\n\tbitLen := params.BitSize // Testing random candidates does not require an additional 64 bits\n\tcounter := 0x01\n\n\tbuffer := make([]byte, 1+len(accessKey)) // 1 byte counter + len(accessKey)\n\tkdfContext := bytes.NewBuffer(buffer)\n\n\tinputKey := append([]byte(\"AWS4A\"), []byte(secretKey)...)\n\n\td := new(big.Int)\n\tfor {\n\t\tkdfContext.Reset()\n\t\tkdfContext.WriteString(accessKey)\n\t\tkdfContext.WriteByte(byte(counter))\n\n\t\tkey, err := signerCrypto.HMACKeyDerivation(sha256.New, bitLen, inputKey, []byte(signingAlgorithm), kdfContext.Bytes())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Check key first before calling SetBytes if key key is in fact a valid candidate.\n\t\t// This ensures the byte slice is the correct length (32-bytes) to compare in constant-time\n\t\tcmp, err := signerCrypto.ConstantTimeByteCompare(key, nMinusTwoP256.Bytes())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif cmp == -1 {\n\t\t\td.SetBytes(key)\n\t\t\tbreak\n\t\t}\n\n\t\tcounter++\n\t\tif counter > 0xFF {\n\t\t\treturn nil, fmt.Errorf(\"exhausted single byte external counter\")\n\t\t}\n\t}\n\td = d.Add(d, one)\n\n\tpriv := new(ecdsa.PrivateKey)\n\tpriv.PublicKey.Curve = p256\n\tpriv.D = d\n\tpriv.PublicKey.X, priv.PublicKey.Y = p256.ScalarBaseMult(d.Bytes())\n\n\treturn priv, nil\n}\n\ntype httpSigner struct {\n\tRequest     *http.Request\n\tServiceName string\n\tRegionSet   []string\n\tTime        time.Time\n\tCredentials Credentials\n\tIsPreSign   bool\n\n\tLogger logging.Logger\n\tDebug  bool\n\n\t// PayloadHash is the hex encoded SHA-256 hash of the request payload\n\t// If len(PayloadHash) == 0 the signer will attempt to send the request\n\t// as an unsigned payload. Note: Unsigned payloads only work for a subset of services.\n\tPayloadHash string\n\n\tDisableHeaderHoisting  bool\n\tDisableURIPathEscaping bool\n}\n\n// SignHTTP takes the provided http.Request, payload hash, service, regionSet, and time and signs using SigV4a.\n// The passed in request will be modified in place.\nfunc (s *Signer) SignHTTP(ctx context.Context, credentials Credentials, r *http.Request, payloadHash string, service string, regionSet []string, signingTime time.Time, optFns ...func(*SignerOptions)) error {\n\toptions := s.options\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tsigner := &httpSigner{\n\t\tRequest:                r,\n\t\tPayloadHash:            payloadHash,\n\t\tServiceName:            service,\n\t\tRegionSet:              regionSet,\n\t\tCredentials:            credentials,\n\t\tTime:                   signingTime.UTC(),\n\t\tDisableHeaderHoisting:  options.DisableHeaderHoisting,\n\t\tDisableURIPathEscaping: options.DisableURIPathEscaping,\n\t}\n\n\tsignedRequest, err := signer.Build()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tlogHTTPSigningInfo(ctx, options, signedRequest)\n\n\treturn nil\n}\n\n// PresignHTTP takes the provided http.Request, payload hash, service, regionSet, and time and presigns using SigV4a\n// Returns the presigned URL along with the headers that were signed with the request.\n//\n// PresignHTTP will not set the expires time of the presigned request\n// automatically. To specify the expire duration for a request add the\n// \"X-Amz-Expires\" query parameter on the request with the value as the\n// duration in seconds the presigned URL should be considered valid for. This\n// parameter is not used by all AWS services, and is most notable used by\n// Amazon S3 APIs.\nfunc (s *Signer) PresignHTTP(ctx context.Context, credentials Credentials, r *http.Request, payloadHash string, service string, regionSet []string, signingTime time.Time, optFns ...func(*SignerOptions)) (signedURI string, signedHeaders http.Header, err error) {\n\toptions := s.options\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tsigner := &httpSigner{\n\t\tRequest:                r,\n\t\tPayloadHash:            payloadHash,\n\t\tServiceName:            service,\n\t\tRegionSet:              regionSet,\n\t\tCredentials:            credentials,\n\t\tTime:                   signingTime.UTC(),\n\t\tIsPreSign:              true,\n\t\tDisableHeaderHoisting:  options.DisableHeaderHoisting,\n\t\tDisableURIPathEscaping: options.DisableURIPathEscaping,\n\t}\n\n\tsignedRequest, err := signer.Build()\n\tif err != nil {\n\t\treturn \"\", nil, err\n\t}\n\n\tlogHTTPSigningInfo(ctx, options, signedRequest)\n\n\tsignedHeaders = make(http.Header)\n\n\t// For the signed headers we canonicalize the header keys in the returned map.\n\t// This avoids situations where can standard library double headers like host header. For example the standard\n\t// library will set the Host header, even if it is present in lower-case form.\n\tfor k, v := range signedRequest.SignedHeaders {\n\t\tkey := textproto.CanonicalMIMEHeaderKey(k)\n\t\tsignedHeaders[key] = append(signedHeaders[key], v...)\n\t}\n\n\treturn signedRequest.Request.URL.String(), signedHeaders, nil\n}\n\nfunc (s *httpSigner) setRequiredSigningFields(headers http.Header, query url.Values) {\n\tamzDate := s.Time.Format(timeFormat)\n\n\tif s.IsPreSign {\n\t\tquery.Set(AmzRegionSetKey, strings.Join(s.RegionSet, \",\"))\n\t\tquery.Set(amzDateKey, amzDate)\n\t\tquery.Set(amzAlgorithmKey, signingAlgorithm)\n\t\tif len(s.Credentials.SessionToken) > 0 {\n\t\t\tquery.Set(amzSecurityTokenKey, s.Credentials.SessionToken)\n\t\t}\n\t\treturn\n\t}\n\n\theaders.Set(AmzRegionSetKey, strings.Join(s.RegionSet, \",\"))\n\theaders.Set(amzDateKey, amzDate)\n\tif len(s.Credentials.SessionToken) > 0 {\n\t\theaders.Set(amzSecurityTokenKey, s.Credentials.SessionToken)\n\t}\n}\n\nfunc (s *httpSigner) Build() (signedRequest, error) {\n\treq := s.Request\n\n\tquery := req.URL.Query()\n\theaders := req.Header\n\n\ts.setRequiredSigningFields(headers, query)\n\n\t// Sort Each Query Key's Values\n\tfor key := range query {\n\t\tsort.Strings(query[key])\n\t}\n\n\tv4Internal.SanitizeHostForHeader(req)\n\n\tcredentialScope := s.buildCredentialScope()\n\tcredentialStr := s.Credentials.Context + \"/\" + credentialScope\n\tif s.IsPreSign {\n\t\tquery.Set(amzCredentialKey, credentialStr)\n\t}\n\n\tunsignedHeaders := headers\n\tif s.IsPreSign && !s.DisableHeaderHoisting {\n\t\turlValues := url.Values{}\n\t\turlValues, unsignedHeaders = buildQuery(v4Internal.AllowedQueryHoisting, unsignedHeaders)\n\t\tfor k := range urlValues {\n\t\t\tquery[k] = urlValues[k]\n\t\t}\n\t}\n\n\thost := req.URL.Host\n\tif len(req.Host) > 0 {\n\t\thost = req.Host\n\t}\n\n\tsignedHeaders, signedHeadersStr, canonicalHeaderStr := s.buildCanonicalHeaders(host, v4Internal.IgnoredHeaders, unsignedHeaders, s.Request.ContentLength)\n\n\tif s.IsPreSign {\n\t\tquery.Set(amzSignedHeadersKey, signedHeadersStr)\n\t}\n\n\trawQuery := strings.Replace(query.Encode(), \"+\", \"%20\", -1)\n\n\tcanonicalURI := v4Internal.GetURIPath(req.URL)\n\tif !s.DisableURIPathEscaping {\n\t\tcanonicalURI = httpbinding.EscapePath(canonicalURI, false)\n\t}\n\n\tcanonicalString := s.buildCanonicalString(\n\t\treq.Method,\n\t\tcanonicalURI,\n\t\trawQuery,\n\t\tsignedHeadersStr,\n\t\tcanonicalHeaderStr,\n\t)\n\n\tstrToSign := s.buildStringToSign(credentialScope, canonicalString)\n\tsigningSignature, err := s.buildSignature(strToSign)\n\tif err != nil {\n\t\treturn signedRequest{}, err\n\t}\n\n\tif s.IsPreSign {\n\t\trawQuery += \"&X-Amz-Signature=\" + signingSignature\n\t} else {\n\t\theaders[authorizationHeader] = append(headers[authorizationHeader][:0], buildAuthorizationHeader(credentialStr, signedHeadersStr, signingSignature))\n\t}\n\n\treq.URL.RawQuery = rawQuery\n\n\treturn signedRequest{\n\t\tRequest:         req,\n\t\tSignedHeaders:   signedHeaders,\n\t\tCanonicalString: canonicalString,\n\t\tStringToSign:    strToSign,\n\t\tPreSigned:       s.IsPreSign,\n\t}, nil\n}\n\nfunc buildAuthorizationHeader(credentialStr, signedHeadersStr, signingSignature string) string {\n\tconst credential = \"Credential=\"\n\tconst signedHeaders = \"SignedHeaders=\"\n\tconst signature = \"Signature=\"\n\tconst commaSpace = \", \"\n\n\tvar parts strings.Builder\n\tparts.Grow(len(signingAlgorithm) + 1 +\n\t\tlen(credential) + len(credentialStr) + len(commaSpace) +\n\t\tlen(signedHeaders) + len(signedHeadersStr) + len(commaSpace) +\n\t\tlen(signature) + len(signingSignature),\n\t)\n\tparts.WriteString(signingAlgorithm)\n\tparts.WriteRune(' ')\n\tparts.WriteString(credential)\n\tparts.WriteString(credentialStr)\n\tparts.WriteString(commaSpace)\n\tparts.WriteString(signedHeaders)\n\tparts.WriteString(signedHeadersStr)\n\tparts.WriteString(commaSpace)\n\tparts.WriteString(signature)\n\tparts.WriteString(signingSignature)\n\treturn parts.String()\n}\n\nfunc (s *httpSigner) buildCredentialScope() string {\n\treturn strings.Join([]string{\n\t\ts.Time.Format(shortTimeFormat),\n\t\ts.ServiceName,\n\t\t\"aws4_request\",\n\t}, \"/\")\n\n}\n\nfunc buildQuery(r v4Internal.Rule, header http.Header) (url.Values, http.Header) {\n\tquery := url.Values{}\n\tunsignedHeaders := http.Header{}\n\tfor k, h := range header {\n\t\tif r.IsValid(k) {\n\t\t\tquery[k] = h\n\t\t} else {\n\t\t\tunsignedHeaders[k] = h\n\t\t}\n\t}\n\n\treturn query, unsignedHeaders\n}\n\nfunc (s *httpSigner) buildCanonicalHeaders(host string, rule v4Internal.Rule, header http.Header, length int64) (signed http.Header, signedHeaders, canonicalHeadersStr string) {\n\tsigned = make(http.Header)\n\n\tvar headers []string\n\tconst hostHeader = \"host\"\n\theaders = append(headers, hostHeader)\n\tsigned[hostHeader] = append(signed[hostHeader], host)\n\n\tif length > 0 {\n\t\tconst contentLengthHeader = \"content-length\"\n\t\theaders = append(headers, contentLengthHeader)\n\t\tsigned[contentLengthHeader] = append(signed[contentLengthHeader], strconv.FormatInt(length, 10))\n\t}\n\n\tfor k, v := range header {\n\t\tif !rule.IsValid(k) {\n\t\t\tcontinue // ignored header\n\t\t}\n\n\t\tlowerCaseKey := strings.ToLower(k)\n\t\tif _, ok := signed[lowerCaseKey]; ok {\n\t\t\t// include additional values\n\t\t\tsigned[lowerCaseKey] = append(signed[lowerCaseKey], v...)\n\t\t\tcontinue\n\t\t}\n\n\t\theaders = append(headers, lowerCaseKey)\n\t\tsigned[lowerCaseKey] = v\n\t}\n\tsort.Strings(headers)\n\n\tsignedHeaders = strings.Join(headers, \";\")\n\n\tvar canonicalHeaders strings.Builder\n\tn := len(headers)\n\tconst colon = ':'\n\tfor i := 0; i < n; i++ {\n\t\tif headers[i] == hostHeader {\n\t\t\tcanonicalHeaders.WriteString(hostHeader)\n\t\t\tcanonicalHeaders.WriteRune(colon)\n\t\t\tcanonicalHeaders.WriteString(v4Internal.StripExcessSpaces(host))\n\t\t} else {\n\t\t\tcanonicalHeaders.WriteString(headers[i])\n\t\t\tcanonicalHeaders.WriteRune(colon)\n\t\t\t// Trim out leading, trailing, and dedup inner spaces from signed header values.\n\t\t\tvalues := signed[headers[i]]\n\t\t\tfor j, v := range values {\n\t\t\t\tcleanedValue := strings.TrimSpace(v4Internal.StripExcessSpaces(v))\n\t\t\t\tcanonicalHeaders.WriteString(cleanedValue)\n\t\t\t\tif j < len(values)-1 {\n\t\t\t\t\tcanonicalHeaders.WriteRune(',')\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcanonicalHeaders.WriteRune('\\n')\n\t}\n\tcanonicalHeadersStr = canonicalHeaders.String()\n\n\treturn signed, signedHeaders, canonicalHeadersStr\n}\n\nfunc (s *httpSigner) buildCanonicalString(method, uri, query, signedHeaders, canonicalHeaders string) string {\n\treturn strings.Join([]string{\n\t\tmethod,\n\t\turi,\n\t\tquery,\n\t\tcanonicalHeaders,\n\t\tsignedHeaders,\n\t\ts.PayloadHash,\n\t}, \"\\n\")\n}\n\nfunc (s *httpSigner) buildStringToSign(credentialScope, canonicalRequestString string) string {\n\treturn strings.Join([]string{\n\t\tsigningAlgorithm,\n\t\ts.Time.Format(timeFormat),\n\t\tcredentialScope,\n\t\thex.EncodeToString(makeHash(sha256.New(), []byte(canonicalRequestString))),\n\t}, \"\\n\")\n}\n\nfunc makeHash(hash hash.Hash, b []byte) []byte {\n\thash.Reset()\n\thash.Write(b)\n\treturn hash.Sum(nil)\n}\n\nfunc (s *httpSigner) buildSignature(strToSign string) (string, error) {\n\tsig, err := s.Credentials.PrivateKey.Sign(rand.Reader, makeHash(sha256.New(), []byte(strToSign)), crypto.SHA256)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn hex.EncodeToString(sig), nil\n}\n\nconst logSignInfoMsg = `Request Signature:\n---[ CANONICAL STRING  ]-----------------------------\n%s\n---[ STRING TO SIGN ]--------------------------------\n%s%s\n-----------------------------------------------------`\nconst logSignedURLMsg = `\n---[ SIGNED URL ]------------------------------------\n%s`\n\nfunc logHTTPSigningInfo(ctx context.Context, options SignerOptions, r signedRequest) {\n\tif !options.LogSigning {\n\t\treturn\n\t}\n\tsignedURLMsg := \"\"\n\tif r.PreSigned {\n\t\tsignedURLMsg = fmt.Sprintf(logSignedURLMsg, r.Request.URL.String())\n\t}\n\tlogger := logging.WithContext(ctx, options.Logger)\n\tlogger.Logf(logging.Debug, logSignInfoMsg, r.CanonicalString, r.StringToSign, signedURLMsg)\n}\n\ntype signedRequest struct {\n\tRequest         *http.Request\n\tSignedHeaders   http.Header\n\tCanonicalString string\n\tStringToSign    string\n\tPreSigned       bool\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/CHANGELOG.md",
    "content": "# v1.44.0 (2025-04-30)\n\n* **Feature**: Adds dualstack support for Amazon Elastic Container Registry (Amazon ECR).\n\n# v1.43.3 (2025-04-10)\n\n* No change notes available for this release.\n\n# v1.43.2 (2025-04-03)\n\n* No change notes available for this release.\n\n# v1.43.1 (2025-04-02)\n\n* **Documentation**: Fix for customer issues related to AWS account ID and size limitation for token.\n\n# v1.43.0 (2025-03-11)\n\n* **Feature**: This release adds Amazon ECR to Amazon ECR pull through cache rules support.\n\n# v1.42.1 (2025-03-04.2)\n\n* **Bug Fix**: Add assurance test for operation order.\n\n# v1.42.0 (2025-02-27)\n\n* **Feature**: Track credential providers via User-Agent Feature ids\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.41.1 (2025-02-18)\n\n* **Bug Fix**: Bump go version to 1.22\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.41.0 (2025-02-07)\n\n* **Feature**: Adds support to handle the new basic scanning daily quota.\n\n# v1.40.3 (2025-02-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.40.2 (2025-02-04)\n\n* No change notes available for this release.\n\n# v1.40.1 (2025-01-31)\n\n* **Dependency Update**: Switch to code-generated waiter matchers, removing the dependency on go-jmespath.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.40.0 (2025-01-30)\n\n* **Feature**: Temporarily updating dualstack endpoint support\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.39.0 (2025-01-29)\n\n* **Feature**: Add support for Dualstack and Dualstack-with-FIPS Endpoints\n\n# v1.38.7 (2025-01-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n* **Dependency Update**: Upgrade to smithy-go v1.22.2.\n\n# v1.38.6 (2025-01-17)\n\n* **Bug Fix**: Fix bug where credentials weren't refreshed during retry loop.\n\n# v1.38.5 (2025-01-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.38.4 (2025-01-14)\n\n* **Bug Fix**: Fix issue where waiters were not failing on unmatched errors as they should. This may have breaking behavioral changes for users in fringe cases. See [this announcement](https://github.com/aws/aws-sdk-go-v2/discussions/2954) for more information.\n\n# v1.38.3 (2025-01-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.38.2 (2025-01-08)\n\n* No change notes available for this release.\n\n# v1.38.1 (2025-01-03)\n\n* No change notes available for this release.\n\n# v1.38.0 (2024-12-28)\n\n* **Feature**: Restoring custom endpoint functionality for ECR\n\n# v1.37.0 (2024-12-26)\n\n* **Feature**: Add support for Dualstack Endpoints\n\n# v1.36.9 (2024-12-23)\n\n* **Documentation**: Documentation update for ECR GetAccountSetting and PutAccountSetting APIs.\n\n# v1.36.8 (2024-12-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.36.7 (2024-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.36.6 (2024-11-18)\n\n* **Dependency Update**: Update to smithy-go v1.22.1.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.36.5 (2024-11-07)\n\n* **Bug Fix**: Adds case-insensitive handling of error message fields in service responses\n\n# v1.36.4 (2024-11-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.36.3 (2024-10-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.36.2 (2024-10-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.36.1 (2024-10-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.36.0 (2024-10-04)\n\n* **Feature**: Add support for HTTP client metrics.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.35.4 (2024-10-03)\n\n* No change notes available for this release.\n\n# v1.35.3 (2024-09-27)\n\n* No change notes available for this release.\n\n# v1.35.2 (2024-09-25)\n\n* No change notes available for this release.\n\n# v1.35.1 (2024-09-23)\n\n* No change notes available for this release.\n\n# v1.35.0 (2024-09-20)\n\n* **Feature**: Add tracing and metrics support to service clients.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.34.0 (2024-09-17)\n\n* **Feature**: The `DescribeImageScanning` API now includes `fixAvailable`, `exploitAvailable`, and `fixedInVersion` fields to provide more detailed information about the availability of fixes, exploits, and fixed versions for identified image vulnerabilities.\n* **Bug Fix**: **BREAKFIX**: Only generate AccountIDEndpointMode config for services that use it. This is a compiler break, but removes no actual functionality, as no services currently use the account ID in endpoint resolution.\n\n# v1.33.0 (2024-09-11)\n\n* **Feature**: Added KMS_DSSE to EncryptionType\n\n# v1.32.4 (2024-09-04)\n\n* No change notes available for this release.\n\n# v1.32.3 (2024-09-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.32.2 (2024-08-22)\n\n* No change notes available for this release.\n\n# v1.32.1 (2024-08-15)\n\n* **Dependency Update**: Bump minimum Go version to 1.21.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.32.0 (2024-08-05)\n\n* **Feature**: Released two new APIs along with documentation updates. The GetAccountSetting API is used to view the current basic scan type version setting for your registry, while the PutAccountSetting API is used to update the basic scan type version for your registry.\n\n# v1.31.0 (2024-07-25)\n\n* **Feature**: API and documentation updates for Amazon ECR, adding support for creating, updating, describing and deleting ECR Repository Creation Template.\n\n# v1.30.3 (2024-07-10.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.30.2 (2024-07-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.30.1 (2024-06-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.30.0 (2024-06-26)\n\n* **Feature**: Support list-of-string endpoint parameter.\n\n# v1.29.1 (2024-06-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.0 (2024-06-18)\n\n* **Feature**: Track usage of various AWS SDK features in user-agent string.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.6 (2024-06-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.5 (2024-06-07)\n\n* **Bug Fix**: Add clock skew correction on all service clients\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.4 (2024-06-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.3 (2024-05-23)\n\n* No change notes available for this release.\n\n# v1.28.2 (2024-05-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.1 (2024-05-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.0 (2024-05-08)\n\n* **Feature**: This release adds pull through cache rules support for GitLab container registry in Amazon ECR.\n* **Bug Fix**: GoDoc improvement\n\n# v1.27.4 (2024-03-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.3 (2024-03-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.2 (2024-03-07)\n\n* **Bug Fix**: Remove dependency on go-cmp.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.1 (2024-02-23)\n\n* **Bug Fix**: Move all common, SDK-side middleware stack ops into the service client module to prevent cross-module compatibility issues in the future.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.0 (2024-02-22)\n\n* **Feature**: Add middleware stack snapshot tests.\n\n# v1.26.2 (2024-02-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.26.1 (2024-02-20)\n\n* **Bug Fix**: When sourcing values for a service's `EndpointParameters`, the lack of a configured region (i.e. `options.Region == \"\"`) will now translate to a `nil` value for `EndpointParameters.Region` instead of a pointer to the empty string `\"\"`. This will result in a much more explicit error when calling an operation instead of an obscure hostname lookup failure.\n\n# v1.26.0 (2024-02-16)\n\n* **Feature**: Add new ClientOptions field to waiter config which allows you to extend the config for operation calls made by waiters.\n\n# v1.25.1 (2024-02-15)\n\n* **Bug Fix**: Correct failure to determine the error type in awsJson services that could occur when errors were modeled with a non-string `code` field.\n\n# v1.25.0 (2024-02-13)\n\n* **Feature**: Bump minimum Go version to 1.20 per our language support policy.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.24.7 (2024-01-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.24.6 (2023-12-20)\n\n* No change notes available for this release.\n\n# v1.24.5 (2023-12-08)\n\n* **Bug Fix**: Reinstate presence of default Retryer in functional options, but still respect max attempts set therein.\n\n# v1.24.4 (2023-12-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.24.3 (2023-12-06)\n\n* **Bug Fix**: Restore pre-refactor auth behavior where all operations could technically be performed anonymously.\n\n# v1.24.2 (2023-12-01)\n\n* **Bug Fix**: Correct wrapping of errors in authentication workflow.\n* **Bug Fix**: Correctly recognize cache-wrapped instances of AnonymousCredentials at client construction.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.24.1 (2023-11-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.24.0 (2023-11-29)\n\n* **Feature**: Expose Options() accessor on service clients.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.23.3 (2023-11-28.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.23.2 (2023-11-28)\n\n* **Bug Fix**: Respect setting RetryMaxAttempts in functional options at client construction.\n\n# v1.23.1 (2023-11-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.23.0 (2023-11-17)\n\n* **Feature**: Documentation and operational updates for Amazon ECR, adding support for pull through cache rules for upstream registries that require authentication.\n\n# v1.22.2 (2023-11-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.22.1 (2023-11-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.22.0 (2023-11-01)\n\n* **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.21.0 (2023-10-31)\n\n* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.20.2 (2023-10-12)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.20.1 (2023-10-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.20.0 (2023-09-11)\n\n* **Feature**: This release will have ValidationException be thrown from ECR LifecyclePolicy APIs in regions LifecyclePolicy is not supported, this includes existing Amazon Dedicated Cloud (ADC) regions. This release will also change Tag: TagValue and Tag: TagKey to required.\n\n# v1.19.5 (2023-08-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.19.4 (2023-08-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.19.3 (2023-08-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.19.2 (2023-08-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.19.1 (2023-08-01)\n\n* No change notes available for this release.\n\n# v1.19.0 (2023-07-31)\n\n* **Feature**: Adds support for smithy-modeled endpoint resolution. A new rules-based endpoint resolution will be added to the SDK which will supercede and deprecate existing endpoint resolution. Specifically, EndpointResolver will be deprecated while BaseEndpoint and EndpointResolverV2 will take its place. For more information, please see the Endpoints section in our Developer Guide.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.15 (2023-07-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.14 (2023-07-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.13 (2023-06-15)\n\n* No change notes available for this release.\n\n# v1.18.12 (2023-06-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.11 (2023-05-04)\n\n* No change notes available for this release.\n\n# v1.18.10 (2023-04-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.9 (2023-04-10)\n\n* No change notes available for this release.\n\n# v1.18.8 (2023-04-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.7 (2023-03-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.6 (2023-03-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.5 (2023-02-22)\n\n* **Bug Fix**: Prevent nil pointer dereference when retrieving error codes.\n\n# v1.18.4 (2023-02-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.3 (2023-02-15)\n\n* **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910.\n* **Bug Fix**: Correct error type parsing for restJson services.\n\n# v1.18.2 (2023-02-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.1 (2023-01-23)\n\n* No change notes available for this release.\n\n# v1.18.0 (2023-01-05)\n\n* **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401).\n\n# v1.17.25 (2022-12-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.24 (2022-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.23 (2022-11-22)\n\n* No change notes available for this release.\n\n# v1.17.22 (2022-11-16)\n\n* No change notes available for this release.\n\n# v1.17.21 (2022-11-10)\n\n* No change notes available for this release.\n\n# v1.17.20 (2022-10-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.19 (2022-10-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.18 (2022-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.17 (2022-09-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.16 (2022-09-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.15 (2022-08-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.14 (2022-08-30)\n\n* No change notes available for this release.\n\n# v1.17.13 (2022-08-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.12 (2022-08-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.11 (2022-08-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.10 (2022-08-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.9 (2022-08-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.8 (2022-07-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.7 (2022-06-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.6 (2022-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.5 (2022-05-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.4 (2022-04-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.3 (2022-03-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.2 (2022-03-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.1 (2022-03-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.0 (2022-03-21)\n\n* **Feature**: This release includes a fix in the DescribeImageScanFindings paginated output.\n\n# v1.16.0 (2022-03-08)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Feature**: Updated service client model to latest release.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.0 (2022-02-24)\n\n* **Feature**: API client updated\n* **Feature**: Adds RetryMaxAttempts and RetryMod to API client Options. This allows the API clients' default Retryer to be configured from the shared configuration files or environment variables. Adding a new Retry mode of `Adaptive`. `Adaptive` retry mode is an experimental mode, adding client rate limiting when throttles reponses are received from an API. See [retry.AdaptiveMode](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/retry#AdaptiveMode) for more details, and configuration options.\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.0 (2022-01-14)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.0 (2022-01-07)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.0 (2021-12-21)\n\n* **Feature**: API Paginators now support specifying the initial starting token, and support stopping on empty string tokens.\n* **Feature**: Updated to latest service endpoints\n\n# v1.11.1 (2021-12-02)\n\n* **Bug Fix**: Fixes a bug that prevented aws.EndpointResolverWithOptions from being used by the service client. ([#1514](https://github.com/aws/aws-sdk-go-v2/pull/1514))\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.0 (2021-11-30)\n\n* **Feature**: API client updated\n\n# v1.10.1 (2021-11-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.0 (2021-11-12)\n\n* **Feature**: Service clients now support custom endpoints that have an initial URI path defined.\n* **Feature**: Waiters now have a `WaitForOutput` method, which can be used to retrieve the output of the successful wait operation. Thank you to [Andrew Haines](https://github.com/haines) for contributing this feature.\n\n# v1.9.0 (2021-11-06)\n\n* **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically.\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Feature**: Updated service to latest API model.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.8.0 (2021-10-21)\n\n* **Feature**: API client updated\n* **Feature**: Updated  to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.7.1 (2021-10-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.7.0 (2021-09-24)\n\n* **Feature**: API client updated\n\n# v1.6.0 (2021-09-17)\n\n* **Feature**: Updated API client and endpoints to latest revision.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.0 (2021-08-27)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.3 (2021-08-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.2 (2021-08-04)\n\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.1 (2021-07-15)\n\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.0 (2021-06-25)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.1 (2021-05-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.0 (2021-05-14)\n\n* **Feature**: Constant has been added to modules to enable runtime version inspection for reporting.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_client.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/defaults\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/retry\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tawshttp \"github.com/aws/aws-sdk-go-v2/aws/transport/http\"\n\tinternalauth \"github.com/aws/aws-sdk-go-v2/internal/auth\"\n\tinternalauthsmithy \"github.com/aws/aws-sdk-go-v2/internal/auth/smithy\"\n\tinternalConfig \"github.com/aws/aws-sdk-go-v2/internal/configsources\"\n\tinternalmiddleware \"github.com/aws/aws-sdk-go-v2/internal/middleware\"\n\tsmithy \"github.com/aws/smithy-go\"\n\tsmithyauth \"github.com/aws/smithy-go/auth\"\n\tsmithydocument \"github.com/aws/smithy-go/document\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"github.com/aws/smithy-go/metrics\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"net\"\n\t\"net/http\"\n\t\"sync/atomic\"\n\t\"time\"\n)\n\nconst ServiceID = \"ECR\"\nconst ServiceAPIVersion = \"2015-09-21\"\n\ntype operationMetrics struct {\n\tDuration                metrics.Float64Histogram\n\tSerializeDuration       metrics.Float64Histogram\n\tResolveIdentityDuration metrics.Float64Histogram\n\tResolveEndpointDuration metrics.Float64Histogram\n\tSignRequestDuration     metrics.Float64Histogram\n\tDeserializeDuration     metrics.Float64Histogram\n}\n\nfunc (m *operationMetrics) histogramFor(name string) metrics.Float64Histogram {\n\tswitch name {\n\tcase \"client.call.duration\":\n\t\treturn m.Duration\n\tcase \"client.call.serialization_duration\":\n\t\treturn m.SerializeDuration\n\tcase \"client.call.resolve_identity_duration\":\n\t\treturn m.ResolveIdentityDuration\n\tcase \"client.call.resolve_endpoint_duration\":\n\t\treturn m.ResolveEndpointDuration\n\tcase \"client.call.signing_duration\":\n\t\treturn m.SignRequestDuration\n\tcase \"client.call.deserialization_duration\":\n\t\treturn m.DeserializeDuration\n\tdefault:\n\t\tpanic(\"unrecognized operation metric\")\n\t}\n}\n\nfunc timeOperationMetric[T any](\n\tctx context.Context, metric string, fn func() (T, error),\n\topts ...metrics.RecordMetricOption,\n) (T, error) {\n\tinstr := getOperationMetrics(ctx).histogramFor(metric)\n\topts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...)\n\n\tstart := time.Now()\n\tv, err := fn()\n\tend := time.Now()\n\n\telapsed := end.Sub(start)\n\tinstr.Record(ctx, float64(elapsed)/1e9, opts...)\n\treturn v, err\n}\n\nfunc startMetricTimer(ctx context.Context, metric string, opts ...metrics.RecordMetricOption) func() {\n\tinstr := getOperationMetrics(ctx).histogramFor(metric)\n\topts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...)\n\n\tvar ended bool\n\tstart := time.Now()\n\treturn func() {\n\t\tif ended {\n\t\t\treturn\n\t\t}\n\t\tended = true\n\n\t\tend := time.Now()\n\n\t\telapsed := end.Sub(start)\n\t\tinstr.Record(ctx, float64(elapsed)/1e9, opts...)\n\t}\n}\n\nfunc withOperationMetadata(ctx context.Context) metrics.RecordMetricOption {\n\treturn func(o *metrics.RecordMetricOptions) {\n\t\to.Properties.Set(\"rpc.service\", middleware.GetServiceID(ctx))\n\t\to.Properties.Set(\"rpc.method\", middleware.GetOperationName(ctx))\n\t}\n}\n\ntype operationMetricsKey struct{}\n\nfunc withOperationMetrics(parent context.Context, mp metrics.MeterProvider) (context.Context, error) {\n\tmeter := mp.Meter(\"github.com/aws/aws-sdk-go-v2/service/ecr\")\n\tom := &operationMetrics{}\n\n\tvar err error\n\n\tom.Duration, err = operationMetricTimer(meter, \"client.call.duration\",\n\t\t\"Overall call duration (including retries and time to send or receive request and response body)\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tom.SerializeDuration, err = operationMetricTimer(meter, \"client.call.serialization_duration\",\n\t\t\"The time it takes to serialize a message body\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tom.ResolveIdentityDuration, err = operationMetricTimer(meter, \"client.call.auth.resolve_identity_duration\",\n\t\t\"The time taken to acquire an identity (AWS credentials, bearer token, etc) from an Identity Provider\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tom.ResolveEndpointDuration, err = operationMetricTimer(meter, \"client.call.resolve_endpoint_duration\",\n\t\t\"The time it takes to resolve an endpoint (endpoint resolver, not DNS) for the request\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tom.SignRequestDuration, err = operationMetricTimer(meter, \"client.call.auth.signing_duration\",\n\t\t\"The time it takes to sign a request\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tom.DeserializeDuration, err = operationMetricTimer(meter, \"client.call.deserialization_duration\",\n\t\t\"The time it takes to deserialize a message body\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn context.WithValue(parent, operationMetricsKey{}, om), nil\n}\n\nfunc operationMetricTimer(m metrics.Meter, name, desc string) (metrics.Float64Histogram, error) {\n\treturn m.Float64Histogram(name, func(o *metrics.InstrumentOptions) {\n\t\to.UnitLabel = \"s\"\n\t\to.Description = desc\n\t})\n}\n\nfunc getOperationMetrics(ctx context.Context) *operationMetrics {\n\treturn ctx.Value(operationMetricsKey{}).(*operationMetrics)\n}\n\nfunc operationTracer(p tracing.TracerProvider) tracing.Tracer {\n\treturn p.Tracer(\"github.com/aws/aws-sdk-go-v2/service/ecr\")\n}\n\n// Client provides the API client to make operations call for Amazon Elastic\n// Container Registry.\ntype Client struct {\n\toptions Options\n\n\t// Difference between the time reported by the server and the client\n\ttimeOffset *atomic.Int64\n}\n\n// New returns an initialized Client based on the functional options. Provide\n// additional functional options to further configure the behavior of the client,\n// such as changing the client's endpoint or adding custom middleware behavior.\nfunc New(options Options, optFns ...func(*Options)) *Client {\n\toptions = options.Copy()\n\n\tresolveDefaultLogger(&options)\n\n\tsetResolvedDefaultsMode(&options)\n\n\tresolveRetryer(&options)\n\n\tresolveHTTPClient(&options)\n\n\tresolveHTTPSignerV4(&options)\n\n\tresolveEndpointResolverV2(&options)\n\n\tresolveTracerProvider(&options)\n\n\tresolveMeterProvider(&options)\n\n\tresolveAuthSchemeResolver(&options)\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tfinalizeRetryMaxAttempts(&options)\n\n\tignoreAnonymousAuth(&options)\n\n\twrapWithAnonymousAuth(&options)\n\n\tresolveAuthSchemes(&options)\n\n\tclient := &Client{\n\t\toptions: options,\n\t}\n\n\tinitializeTimeOffsetResolver(client)\n\n\treturn client\n}\n\n// Options returns a copy of the client configuration.\n//\n// Callers SHOULD NOT perform mutations on any inner structures within client\n// config. Config overrides should instead be made on a per-operation basis through\n// functional options.\nfunc (c *Client) Options() Options {\n\treturn c.options.Copy()\n}\n\nfunc (c *Client) invokeOperation(\n\tctx context.Context, opID string, params interface{}, optFns []func(*Options), stackFns ...func(*middleware.Stack, Options) error,\n) (\n\tresult interface{}, metadata middleware.Metadata, err error,\n) {\n\tctx = middleware.ClearStackValues(ctx)\n\tctx = middleware.WithServiceID(ctx, ServiceID)\n\tctx = middleware.WithOperationName(ctx, opID)\n\n\tstack := middleware.NewStack(opID, smithyhttp.NewStackRequest)\n\toptions := c.options.Copy()\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tfinalizeOperationRetryMaxAttempts(&options, *c)\n\n\tfinalizeClientEndpointResolverOptions(&options)\n\n\tfor _, fn := range stackFns {\n\t\tif err := fn(stack, options); err != nil {\n\t\t\treturn nil, metadata, err\n\t\t}\n\t}\n\n\tfor _, fn := range options.APIOptions {\n\t\tif err := fn(stack); err != nil {\n\t\t\treturn nil, metadata, err\n\t\t}\n\t}\n\n\tctx, err = withOperationMetrics(ctx, options.MeterProvider)\n\tif err != nil {\n\t\treturn nil, metadata, err\n\t}\n\n\ttracer := operationTracer(options.TracerProvider)\n\tspanName := fmt.Sprintf(\"%s.%s\", ServiceID, opID)\n\n\tctx = tracing.WithOperationTracer(ctx, tracer)\n\n\tctx, span := tracer.StartSpan(ctx, spanName, func(o *tracing.SpanOptions) {\n\t\to.Kind = tracing.SpanKindClient\n\t\to.Properties.Set(\"rpc.system\", \"aws-api\")\n\t\to.Properties.Set(\"rpc.method\", opID)\n\t\to.Properties.Set(\"rpc.service\", ServiceID)\n\t})\n\tendTimer := startMetricTimer(ctx, \"client.call.duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\n\thandler := smithyhttp.NewClientHandlerWithOptions(options.HTTPClient, func(o *smithyhttp.ClientHandler) {\n\t\to.Meter = options.MeterProvider.Meter(\"github.com/aws/aws-sdk-go-v2/service/ecr\")\n\t})\n\tdecorated := middleware.DecorateHandler(handler, stack)\n\tresult, metadata, err = decorated.Handle(ctx, params)\n\tif err != nil {\n\t\tspan.SetProperty(\"exception.type\", fmt.Sprintf(\"%T\", err))\n\t\tspan.SetProperty(\"exception.message\", err.Error())\n\n\t\tvar aerr smithy.APIError\n\t\tif errors.As(err, &aerr) {\n\t\t\tspan.SetProperty(\"api.error_code\", aerr.ErrorCode())\n\t\t\tspan.SetProperty(\"api.error_message\", aerr.ErrorMessage())\n\t\t\tspan.SetProperty(\"api.error_fault\", aerr.ErrorFault().String())\n\t\t}\n\n\t\terr = &smithy.OperationError{\n\t\t\tServiceID:     ServiceID,\n\t\t\tOperationName: opID,\n\t\t\tErr:           err,\n\t\t}\n\t}\n\n\tspan.SetProperty(\"error\", err != nil)\n\tif err == nil {\n\t\tspan.SetStatus(tracing.SpanStatusOK)\n\t} else {\n\t\tspan.SetStatus(tracing.SpanStatusError)\n\t}\n\n\treturn result, metadata, err\n}\n\ntype operationInputKey struct{}\n\nfunc setOperationInput(ctx context.Context, input interface{}) context.Context {\n\treturn middleware.WithStackValue(ctx, operationInputKey{}, input)\n}\n\nfunc getOperationInput(ctx context.Context) interface{} {\n\treturn middleware.GetStackValue(ctx, operationInputKey{})\n}\n\ntype setOperationInputMiddleware struct {\n}\n\nfunc (*setOperationInputMiddleware) ID() string {\n\treturn \"setOperationInput\"\n}\n\nfunc (m *setOperationInputMiddleware) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\tctx = setOperationInput(ctx, in.Parameters)\n\treturn next.HandleSerialize(ctx, in)\n}\n\nfunc addProtocolFinalizerMiddlewares(stack *middleware.Stack, options Options, operation string) error {\n\tif err := stack.Finalize.Add(&resolveAuthSchemeMiddleware{operation: operation, options: options}, middleware.Before); err != nil {\n\t\treturn fmt.Errorf(\"add ResolveAuthScheme: %w\", err)\n\t}\n\tif err := stack.Finalize.Insert(&getIdentityMiddleware{options: options}, \"ResolveAuthScheme\", middleware.After); err != nil {\n\t\treturn fmt.Errorf(\"add GetIdentity: %v\", err)\n\t}\n\tif err := stack.Finalize.Insert(&resolveEndpointV2Middleware{options: options}, \"GetIdentity\", middleware.After); err != nil {\n\t\treturn fmt.Errorf(\"add ResolveEndpointV2: %v\", err)\n\t}\n\tif err := stack.Finalize.Insert(&signRequestMiddleware{options: options}, \"ResolveEndpointV2\", middleware.After); err != nil {\n\t\treturn fmt.Errorf(\"add Signing: %w\", err)\n\t}\n\treturn nil\n}\nfunc resolveAuthSchemeResolver(options *Options) {\n\tif options.AuthSchemeResolver == nil {\n\t\toptions.AuthSchemeResolver = &defaultAuthSchemeResolver{}\n\t}\n}\n\nfunc resolveAuthSchemes(options *Options) {\n\tif options.AuthSchemes == nil {\n\t\toptions.AuthSchemes = []smithyhttp.AuthScheme{\n\t\t\tinternalauth.NewHTTPAuthScheme(\"aws.auth#sigv4\", &internalauthsmithy.V4SignerAdapter{\n\t\t\t\tSigner:     options.HTTPSignerV4,\n\t\t\t\tLogger:     options.Logger,\n\t\t\t\tLogSigning: options.ClientLogMode.IsSigning(),\n\t\t\t}),\n\t\t}\n\t}\n}\n\ntype noSmithyDocumentSerde = smithydocument.NoSerde\n\ntype legacyEndpointContextSetter struct {\n\tLegacyResolver EndpointResolver\n}\n\nfunc (*legacyEndpointContextSetter) ID() string {\n\treturn \"legacyEndpointContextSetter\"\n}\n\nfunc (m *legacyEndpointContextSetter) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tif m.LegacyResolver != nil {\n\t\tctx = awsmiddleware.SetRequiresLegacyEndpoints(ctx, true)\n\t}\n\n\treturn next.HandleInitialize(ctx, in)\n\n}\nfunc addlegacyEndpointContextSetter(stack *middleware.Stack, o Options) error {\n\treturn stack.Initialize.Add(&legacyEndpointContextSetter{\n\t\tLegacyResolver: o.EndpointResolver,\n\t}, middleware.Before)\n}\n\nfunc resolveDefaultLogger(o *Options) {\n\tif o.Logger != nil {\n\t\treturn\n\t}\n\to.Logger = logging.Nop{}\n}\n\nfunc addSetLoggerMiddleware(stack *middleware.Stack, o Options) error {\n\treturn middleware.AddSetLoggerMiddleware(stack, o.Logger)\n}\n\nfunc setResolvedDefaultsMode(o *Options) {\n\tif len(o.resolvedDefaultsMode) > 0 {\n\t\treturn\n\t}\n\n\tvar mode aws.DefaultsMode\n\tmode.SetFromString(string(o.DefaultsMode))\n\n\tif mode == aws.DefaultsModeAuto {\n\t\tmode = defaults.ResolveDefaultsModeAuto(o.Region, o.RuntimeEnvironment)\n\t}\n\n\to.resolvedDefaultsMode = mode\n}\n\n// NewFromConfig returns a new client from the provided config.\nfunc NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client {\n\topts := Options{\n\t\tRegion:             cfg.Region,\n\t\tDefaultsMode:       cfg.DefaultsMode,\n\t\tRuntimeEnvironment: cfg.RuntimeEnvironment,\n\t\tHTTPClient:         cfg.HTTPClient,\n\t\tCredentials:        cfg.Credentials,\n\t\tAPIOptions:         cfg.APIOptions,\n\t\tLogger:             cfg.Logger,\n\t\tClientLogMode:      cfg.ClientLogMode,\n\t\tAppID:              cfg.AppID,\n\t}\n\tresolveAWSRetryerProvider(cfg, &opts)\n\tresolveAWSRetryMaxAttempts(cfg, &opts)\n\tresolveAWSRetryMode(cfg, &opts)\n\tresolveAWSEndpointResolver(cfg, &opts)\n\tresolveUseDualStackEndpoint(cfg, &opts)\n\tresolveUseFIPSEndpoint(cfg, &opts)\n\tresolveBaseEndpoint(cfg, &opts)\n\treturn New(opts, optFns...)\n}\n\nfunc resolveHTTPClient(o *Options) {\n\tvar buildable *awshttp.BuildableClient\n\n\tif o.HTTPClient != nil {\n\t\tvar ok bool\n\t\tbuildable, ok = o.HTTPClient.(*awshttp.BuildableClient)\n\t\tif !ok {\n\t\t\treturn\n\t\t}\n\t} else {\n\t\tbuildable = awshttp.NewBuildableClient()\n\t}\n\n\tmodeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode)\n\tif err == nil {\n\t\tbuildable = buildable.WithDialerOptions(func(dialer *net.Dialer) {\n\t\t\tif dialerTimeout, ok := modeConfig.GetConnectTimeout(); ok {\n\t\t\t\tdialer.Timeout = dialerTimeout\n\t\t\t}\n\t\t})\n\n\t\tbuildable = buildable.WithTransportOptions(func(transport *http.Transport) {\n\t\t\tif tlsHandshakeTimeout, ok := modeConfig.GetTLSNegotiationTimeout(); ok {\n\t\t\t\ttransport.TLSHandshakeTimeout = tlsHandshakeTimeout\n\t\t\t}\n\t\t})\n\t}\n\n\to.HTTPClient = buildable\n}\n\nfunc resolveRetryer(o *Options) {\n\tif o.Retryer != nil {\n\t\treturn\n\t}\n\n\tif len(o.RetryMode) == 0 {\n\t\tmodeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode)\n\t\tif err == nil {\n\t\t\to.RetryMode = modeConfig.RetryMode\n\t\t}\n\t}\n\tif len(o.RetryMode) == 0 {\n\t\to.RetryMode = aws.RetryModeStandard\n\t}\n\n\tvar standardOptions []func(*retry.StandardOptions)\n\tif v := o.RetryMaxAttempts; v != 0 {\n\t\tstandardOptions = append(standardOptions, func(so *retry.StandardOptions) {\n\t\t\tso.MaxAttempts = v\n\t\t})\n\t}\n\n\tswitch o.RetryMode {\n\tcase aws.RetryModeAdaptive:\n\t\tvar adaptiveOptions []func(*retry.AdaptiveModeOptions)\n\t\tif len(standardOptions) != 0 {\n\t\t\tadaptiveOptions = append(adaptiveOptions, func(ao *retry.AdaptiveModeOptions) {\n\t\t\t\tao.StandardOptions = append(ao.StandardOptions, standardOptions...)\n\t\t\t})\n\t\t}\n\t\to.Retryer = retry.NewAdaptiveMode(adaptiveOptions...)\n\n\tdefault:\n\t\to.Retryer = retry.NewStandard(standardOptions...)\n\t}\n}\n\nfunc resolveAWSRetryerProvider(cfg aws.Config, o *Options) {\n\tif cfg.Retryer == nil {\n\t\treturn\n\t}\n\to.Retryer = cfg.Retryer()\n}\n\nfunc resolveAWSRetryMode(cfg aws.Config, o *Options) {\n\tif len(cfg.RetryMode) == 0 {\n\t\treturn\n\t}\n\to.RetryMode = cfg.RetryMode\n}\nfunc resolveAWSRetryMaxAttempts(cfg aws.Config, o *Options) {\n\tif cfg.RetryMaxAttempts == 0 {\n\t\treturn\n\t}\n\to.RetryMaxAttempts = cfg.RetryMaxAttempts\n}\n\nfunc finalizeRetryMaxAttempts(o *Options) {\n\tif o.RetryMaxAttempts == 0 {\n\t\treturn\n\t}\n\n\to.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts)\n}\n\nfunc finalizeOperationRetryMaxAttempts(o *Options, client Client) {\n\tif v := o.RetryMaxAttempts; v == 0 || v == client.options.RetryMaxAttempts {\n\t\treturn\n\t}\n\n\to.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts)\n}\n\nfunc resolveAWSEndpointResolver(cfg aws.Config, o *Options) {\n\tif cfg.EndpointResolver == nil && cfg.EndpointResolverWithOptions == nil {\n\t\treturn\n\t}\n\to.EndpointResolver = withEndpointResolver(cfg.EndpointResolver, cfg.EndpointResolverWithOptions)\n}\n\nfunc addClientUserAgent(stack *middleware.Stack, options Options) error {\n\tua, err := getOrAddRequestUserAgent(stack)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tua.AddSDKAgentKeyValue(awsmiddleware.APIMetadata, \"ecr\", goModuleVersion)\n\tif len(options.AppID) > 0 {\n\t\tua.AddSDKAgentKey(awsmiddleware.ApplicationIdentifier, options.AppID)\n\t}\n\n\treturn nil\n}\n\nfunc getOrAddRequestUserAgent(stack *middleware.Stack) (*awsmiddleware.RequestUserAgent, error) {\n\tid := (*awsmiddleware.RequestUserAgent)(nil).ID()\n\tmw, ok := stack.Build.Get(id)\n\tif !ok {\n\t\tmw = awsmiddleware.NewRequestUserAgent()\n\t\tif err := stack.Build.Add(mw, middleware.After); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tua, ok := mw.(*awsmiddleware.RequestUserAgent)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"%T for %s middleware did not match expected type\", mw, id)\n\t}\n\n\treturn ua, nil\n}\n\ntype HTTPSignerV4 interface {\n\tSignHTTP(ctx context.Context, credentials aws.Credentials, r *http.Request, payloadHash string, service string, region string, signingTime time.Time, optFns ...func(*v4.SignerOptions)) error\n}\n\nfunc resolveHTTPSignerV4(o *Options) {\n\tif o.HTTPSignerV4 != nil {\n\t\treturn\n\t}\n\to.HTTPSignerV4 = newDefaultV4Signer(*o)\n}\n\nfunc newDefaultV4Signer(o Options) *v4.Signer {\n\treturn v4.NewSigner(func(so *v4.SignerOptions) {\n\t\tso.Logger = o.Logger\n\t\tso.LogSigning = o.ClientLogMode.IsSigning()\n\t})\n}\n\nfunc addClientRequestID(stack *middleware.Stack) error {\n\treturn stack.Build.Add(&awsmiddleware.ClientRequestID{}, middleware.After)\n}\n\nfunc addComputeContentLength(stack *middleware.Stack) error {\n\treturn stack.Build.Add(&smithyhttp.ComputeContentLength{}, middleware.After)\n}\n\nfunc addRawResponseToMetadata(stack *middleware.Stack) error {\n\treturn stack.Deserialize.Add(&awsmiddleware.AddRawResponse{}, middleware.Before)\n}\n\nfunc addRecordResponseTiming(stack *middleware.Stack) error {\n\treturn stack.Deserialize.Add(&awsmiddleware.RecordResponseTiming{}, middleware.After)\n}\n\nfunc addSpanRetryLoop(stack *middleware.Stack, options Options) error {\n\treturn stack.Finalize.Insert(&spanRetryLoop{options: options}, \"Retry\", middleware.Before)\n}\n\ntype spanRetryLoop struct {\n\toptions Options\n}\n\nfunc (*spanRetryLoop) ID() string {\n\treturn \"spanRetryLoop\"\n}\n\nfunc (m *spanRetryLoop) HandleFinalize(\n\tctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,\n) (\n\tmiddleware.FinalizeOutput, middleware.Metadata, error,\n) {\n\ttracer := operationTracer(m.options.TracerProvider)\n\tctx, span := tracer.StartSpan(ctx, \"RetryLoop\")\n\tdefer span.End()\n\n\treturn next.HandleFinalize(ctx, in)\n}\nfunc addStreamingEventsPayload(stack *middleware.Stack) error {\n\treturn stack.Finalize.Add(&v4.StreamingEventsPayload{}, middleware.Before)\n}\n\nfunc addUnsignedPayload(stack *middleware.Stack) error {\n\treturn stack.Finalize.Insert(&v4.UnsignedPayload{}, \"ResolveEndpointV2\", middleware.After)\n}\n\nfunc addComputePayloadSHA256(stack *middleware.Stack) error {\n\treturn stack.Finalize.Insert(&v4.ComputePayloadSHA256{}, \"ResolveEndpointV2\", middleware.After)\n}\n\nfunc addContentSHA256Header(stack *middleware.Stack) error {\n\treturn stack.Finalize.Insert(&v4.ContentSHA256Header{}, (*v4.ComputePayloadSHA256)(nil).ID(), middleware.After)\n}\n\nfunc addIsWaiterUserAgent(o *Options) {\n\to.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error {\n\t\tua, err := getOrAddRequestUserAgent(stack)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureWaiter)\n\t\treturn nil\n\t})\n}\n\nfunc addIsPaginatorUserAgent(o *Options) {\n\to.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error {\n\t\tua, err := getOrAddRequestUserAgent(stack)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tua.AddUserAgentFeature(awsmiddleware.UserAgentFeaturePaginator)\n\t\treturn nil\n\t})\n}\n\nfunc addRetry(stack *middleware.Stack, o Options) error {\n\tattempt := retry.NewAttemptMiddleware(o.Retryer, smithyhttp.RequestCloner, func(m *retry.Attempt) {\n\t\tm.LogAttempts = o.ClientLogMode.IsRetries()\n\t\tm.OperationMeter = o.MeterProvider.Meter(\"github.com/aws/aws-sdk-go-v2/service/ecr\")\n\t})\n\tif err := stack.Finalize.Insert(attempt, \"ResolveAuthScheme\", middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err := stack.Finalize.Insert(&retry.MetricsHeader{}, attempt.ID(), middleware.After); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// resolves dual-stack endpoint configuration\nfunc resolveUseDualStackEndpoint(cfg aws.Config, o *Options) error {\n\tif len(cfg.ConfigSources) == 0 {\n\t\treturn nil\n\t}\n\tvalue, found, err := internalConfig.ResolveUseDualStackEndpoint(context.Background(), cfg.ConfigSources)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif found {\n\t\to.EndpointOptions.UseDualStackEndpoint = value\n\t}\n\treturn nil\n}\n\n// resolves FIPS endpoint configuration\nfunc resolveUseFIPSEndpoint(cfg aws.Config, o *Options) error {\n\tif len(cfg.ConfigSources) == 0 {\n\t\treturn nil\n\t}\n\tvalue, found, err := internalConfig.ResolveUseFIPSEndpoint(context.Background(), cfg.ConfigSources)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif found {\n\t\to.EndpointOptions.UseFIPSEndpoint = value\n\t}\n\treturn nil\n}\n\nfunc resolveAccountID(identity smithyauth.Identity, mode aws.AccountIDEndpointMode) *string {\n\tif mode == aws.AccountIDEndpointModeDisabled {\n\t\treturn nil\n\t}\n\n\tif ca, ok := identity.(*internalauthsmithy.CredentialsAdapter); ok && ca.Credentials.AccountID != \"\" {\n\t\treturn aws.String(ca.Credentials.AccountID)\n\t}\n\n\treturn nil\n}\n\nfunc addTimeOffsetBuild(stack *middleware.Stack, c *Client) error {\n\tmw := internalmiddleware.AddTimeOffsetMiddleware{Offset: c.timeOffset}\n\tif err := stack.Build.Add(&mw, middleware.After); err != nil {\n\t\treturn err\n\t}\n\treturn stack.Deserialize.Insert(&mw, \"RecordResponseTiming\", middleware.Before)\n}\nfunc initializeTimeOffsetResolver(c *Client) {\n\tc.timeOffset = new(atomic.Int64)\n}\n\nfunc addUserAgentRetryMode(stack *middleware.Stack, options Options) error {\n\tua, err := getOrAddRequestUserAgent(stack)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tswitch options.Retryer.(type) {\n\tcase *retry.Standard:\n\t\tua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRetryModeStandard)\n\tcase *retry.AdaptiveMode:\n\t\tua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRetryModeAdaptive)\n\t}\n\treturn nil\n}\n\ntype setCredentialSourceMiddleware struct {\n\tua      *awsmiddleware.RequestUserAgent\n\toptions Options\n}\n\nfunc (m setCredentialSourceMiddleware) ID() string { return \"SetCredentialSourceMiddleware\" }\n\nfunc (m setCredentialSourceMiddleware) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (\n\tout middleware.BuildOutput, metadata middleware.Metadata, err error,\n) {\n\tasProviderSource, ok := m.options.Credentials.(aws.CredentialProviderSource)\n\tif !ok {\n\t\treturn next.HandleBuild(ctx, in)\n\t}\n\tproviderSources := asProviderSource.ProviderSources()\n\tfor _, source := range providerSources {\n\t\tm.ua.AddCredentialsSource(source)\n\t}\n\treturn next.HandleBuild(ctx, in)\n}\n\nfunc addCredentialSource(stack *middleware.Stack, options Options) error {\n\tua, err := getOrAddRequestUserAgent(stack)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tmw := setCredentialSourceMiddleware{ua: ua, options: options}\n\treturn stack.Build.Insert(&mw, \"UserAgent\", middleware.Before)\n}\n\nfunc resolveTracerProvider(options *Options) {\n\tif options.TracerProvider == nil {\n\t\toptions.TracerProvider = &tracing.NopTracerProvider{}\n\t}\n}\n\nfunc resolveMeterProvider(options *Options) {\n\tif options.MeterProvider == nil {\n\t\toptions.MeterProvider = metrics.NopMeterProvider{}\n\t}\n}\n\nfunc addRecursionDetection(stack *middleware.Stack) error {\n\treturn stack.Build.Add(&awsmiddleware.RecursionDetection{}, middleware.After)\n}\n\nfunc addRequestIDRetrieverMiddleware(stack *middleware.Stack) error {\n\treturn stack.Deserialize.Insert(&awsmiddleware.RequestIDRetriever{}, \"OperationDeserializer\", middleware.Before)\n\n}\n\nfunc addResponseErrorMiddleware(stack *middleware.Stack) error {\n\treturn stack.Deserialize.Insert(&awshttp.ResponseErrorWrapper{}, \"RequestIDRetriever\", middleware.Before)\n\n}\n\nfunc addRequestResponseLogging(stack *middleware.Stack, o Options) error {\n\treturn stack.Deserialize.Add(&smithyhttp.RequestResponseLogger{\n\t\tLogRequest:          o.ClientLogMode.IsRequest(),\n\t\tLogRequestWithBody:  o.ClientLogMode.IsRequestWithBody(),\n\t\tLogResponse:         o.ClientLogMode.IsResponse(),\n\t\tLogResponseWithBody: o.ClientLogMode.IsResponseWithBody(),\n\t}, middleware.After)\n}\n\ntype disableHTTPSMiddleware struct {\n\tDisableHTTPS bool\n}\n\nfunc (*disableHTTPSMiddleware) ID() string {\n\treturn \"disableHTTPS\"\n}\n\nfunc (m *disableHTTPSMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type %T\", in.Request)\n\t}\n\n\tif m.DisableHTTPS && !smithyhttp.GetHostnameImmutable(ctx) {\n\t\treq.URL.Scheme = \"http\"\n\t}\n\n\treturn next.HandleFinalize(ctx, in)\n}\n\nfunc addDisableHTTPSMiddleware(stack *middleware.Stack, o Options) error {\n\treturn stack.Finalize.Insert(&disableHTTPSMiddleware{\n\t\tDisableHTTPS: o.EndpointOptions.DisableHTTPS,\n\t}, \"ResolveEndpointV2\", middleware.After)\n}\n\ntype spanInitializeStart struct {\n}\n\nfunc (*spanInitializeStart) ID() string {\n\treturn \"spanInitializeStart\"\n}\n\nfunc (m *spanInitializeStart) HandleInitialize(\n\tctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler,\n) (\n\tmiddleware.InitializeOutput, middleware.Metadata, error,\n) {\n\tctx, _ = tracing.StartSpan(ctx, \"Initialize\")\n\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype spanInitializeEnd struct {\n}\n\nfunc (*spanInitializeEnd) ID() string {\n\treturn \"spanInitializeEnd\"\n}\n\nfunc (m *spanInitializeEnd) HandleInitialize(\n\tctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler,\n) (\n\tmiddleware.InitializeOutput, middleware.Metadata, error,\n) {\n\tctx, span := tracing.PopSpan(ctx)\n\tspan.End()\n\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype spanBuildRequestStart struct {\n}\n\nfunc (*spanBuildRequestStart) ID() string {\n\treturn \"spanBuildRequestStart\"\n}\n\nfunc (m *spanBuildRequestStart) HandleSerialize(\n\tctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler,\n) (\n\tmiddleware.SerializeOutput, middleware.Metadata, error,\n) {\n\tctx, _ = tracing.StartSpan(ctx, \"BuildRequest\")\n\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype spanBuildRequestEnd struct {\n}\n\nfunc (*spanBuildRequestEnd) ID() string {\n\treturn \"spanBuildRequestEnd\"\n}\n\nfunc (m *spanBuildRequestEnd) HandleBuild(\n\tctx context.Context, in middleware.BuildInput, next middleware.BuildHandler,\n) (\n\tmiddleware.BuildOutput, middleware.Metadata, error,\n) {\n\tctx, span := tracing.PopSpan(ctx)\n\tspan.End()\n\n\treturn next.HandleBuild(ctx, in)\n}\n\nfunc addSpanInitializeStart(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&spanInitializeStart{}, middleware.Before)\n}\n\nfunc addSpanInitializeEnd(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&spanInitializeEnd{}, middleware.After)\n}\n\nfunc addSpanBuildRequestStart(stack *middleware.Stack) error {\n\treturn stack.Serialize.Add(&spanBuildRequestStart{}, middleware.Before)\n}\n\nfunc addSpanBuildRequestEnd(stack *middleware.Stack) error {\n\treturn stack.Build.Add(&spanBuildRequestEnd{}, middleware.After)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchCheckLayerAvailability.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Checks the availability of one or more image layers in a repository.\n//\n// When an image is pushed to a repository, each image layer is checked to verify\n// if it has been uploaded before. If it has been uploaded, then the image layer is\n// skipped.\n//\n// This operation is used by the Amazon ECR proxy and is not generally used by\n// customers for pulling and pushing images. In most cases, you should use the\n// docker CLI to pull, tag, and push images.\nfunc (c *Client) BatchCheckLayerAvailability(ctx context.Context, params *BatchCheckLayerAvailabilityInput, optFns ...func(*Options)) (*BatchCheckLayerAvailabilityOutput, error) {\n\tif params == nil {\n\t\tparams = &BatchCheckLayerAvailabilityInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"BatchCheckLayerAvailability\", params, optFns, c.addOperationBatchCheckLayerAvailabilityMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*BatchCheckLayerAvailabilityOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype BatchCheckLayerAvailabilityInput struct {\n\n\t// The digests of the image layers to check.\n\t//\n\t// This member is required.\n\tLayerDigests []string\n\n\t// The name of the repository that is associated with the image layers to check.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the image layers to check. If you do not specify a registry, the default\n\t// registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype BatchCheckLayerAvailabilityOutput struct {\n\n\t// Any failures associated with the call.\n\tFailures []types.LayerFailure\n\n\t// A list of image layer objects corresponding to the image layer references in\n\t// the request.\n\tLayers []types.Layer\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationBatchCheckLayerAvailabilityMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpBatchCheckLayerAvailability{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpBatchCheckLayerAvailability{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"BatchCheckLayerAvailability\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpBatchCheckLayerAvailabilityValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opBatchCheckLayerAvailability(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opBatchCheckLayerAvailability(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"BatchCheckLayerAvailability\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchDeleteImage.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Deletes a list of specified images within a repository. Images are specified\n// with either an imageTag or imageDigest .\n//\n// You can remove a tag from an image by specifying the image's tag in your\n// request. When you remove the last tag from an image, the image is deleted from\n// your repository.\n//\n// You can completely delete an image (and all of its tags) by specifying the\n// image's digest in your request.\nfunc (c *Client) BatchDeleteImage(ctx context.Context, params *BatchDeleteImageInput, optFns ...func(*Options)) (*BatchDeleteImageOutput, error) {\n\tif params == nil {\n\t\tparams = &BatchDeleteImageInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"BatchDeleteImage\", params, optFns, c.addOperationBatchDeleteImageMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*BatchDeleteImageOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\n// Deletes specified images within a specified repository. Images are specified\n// with either the imageTag or imageDigest .\ntype BatchDeleteImageInput struct {\n\n\t// A list of image ID references that correspond to images to delete. The format\n\t// of the imageIds reference is imageTag=tag or imageDigest=digest .\n\t//\n\t// This member is required.\n\tImageIds []types.ImageIdentifier\n\n\t// The repository that contains the image to delete.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the image to delete. If you do not specify a registry, the default registry is\n\t// assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype BatchDeleteImageOutput struct {\n\n\t// Any failures associated with the call.\n\tFailures []types.ImageFailure\n\n\t// The image IDs of the deleted images.\n\tImageIds []types.ImageIdentifier\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationBatchDeleteImageMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpBatchDeleteImage{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpBatchDeleteImage{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"BatchDeleteImage\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpBatchDeleteImageValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opBatchDeleteImage(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opBatchDeleteImage(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"BatchDeleteImage\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchGetImage.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Gets detailed information for an image. Images are specified with either an\n// imageTag or imageDigest .\n//\n// When an image is pulled, the BatchGetImage API is called once to retrieve the\n// image manifest.\nfunc (c *Client) BatchGetImage(ctx context.Context, params *BatchGetImageInput, optFns ...func(*Options)) (*BatchGetImageOutput, error) {\n\tif params == nil {\n\t\tparams = &BatchGetImageInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"BatchGetImage\", params, optFns, c.addOperationBatchGetImageMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*BatchGetImageOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype BatchGetImageInput struct {\n\n\t// A list of image ID references that correspond to images to describe. The format\n\t// of the imageIds reference is imageTag=tag or imageDigest=digest .\n\t//\n\t// This member is required.\n\tImageIds []types.ImageIdentifier\n\n\t// The repository that contains the images to describe.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The accepted media types for the request.\n\t//\n\t// Valid values: application/vnd.docker.distribution.manifest.v1+json |\n\t// application/vnd.docker.distribution.manifest.v2+json |\n\t// application/vnd.oci.image.manifest.v1+json\n\tAcceptedMediaTypes []string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the images to describe. If you do not specify a registry, the default registry\n\t// is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype BatchGetImageOutput struct {\n\n\t// Any failures associated with the call.\n\tFailures []types.ImageFailure\n\n\t// A list of image objects corresponding to the image references in the request.\n\tImages []types.Image\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationBatchGetImageMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpBatchGetImage{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpBatchGetImage{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"BatchGetImage\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpBatchGetImageValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opBatchGetImage(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opBatchGetImage(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"BatchGetImage\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchGetRepositoryScanningConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Gets the scanning configuration for one or more repositories.\nfunc (c *Client) BatchGetRepositoryScanningConfiguration(ctx context.Context, params *BatchGetRepositoryScanningConfigurationInput, optFns ...func(*Options)) (*BatchGetRepositoryScanningConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &BatchGetRepositoryScanningConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"BatchGetRepositoryScanningConfiguration\", params, optFns, c.addOperationBatchGetRepositoryScanningConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*BatchGetRepositoryScanningConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype BatchGetRepositoryScanningConfigurationInput struct {\n\n\t// One or more repository names to get the scanning configuration for.\n\t//\n\t// This member is required.\n\tRepositoryNames []string\n\n\tnoSmithyDocumentSerde\n}\n\ntype BatchGetRepositoryScanningConfigurationOutput struct {\n\n\t// Any failures associated with the call.\n\tFailures []types.RepositoryScanningConfigurationFailure\n\n\t// The scanning configuration for the requested repositories.\n\tScanningConfigurations []types.RepositoryScanningConfiguration\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationBatchGetRepositoryScanningConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpBatchGetRepositoryScanningConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpBatchGetRepositoryScanningConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"BatchGetRepositoryScanningConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpBatchGetRepositoryScanningConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opBatchGetRepositoryScanningConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opBatchGetRepositoryScanningConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"BatchGetRepositoryScanningConfiguration\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CompleteLayerUpload.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Informs Amazon ECR that the image layer upload has completed for a specified\n// registry, repository name, and upload ID. You can optionally provide a sha256\n// digest of the image layer for data validation purposes.\n//\n// When an image is pushed, the CompleteLayerUpload API is called once per each\n// new image layer to verify that the upload has completed.\n//\n// This operation is used by the Amazon ECR proxy and is not generally used by\n// customers for pulling and pushing images. In most cases, you should use the\n// docker CLI to pull, tag, and push images.\nfunc (c *Client) CompleteLayerUpload(ctx context.Context, params *CompleteLayerUploadInput, optFns ...func(*Options)) (*CompleteLayerUploadOutput, error) {\n\tif params == nil {\n\t\tparams = &CompleteLayerUploadInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"CompleteLayerUpload\", params, optFns, c.addOperationCompleteLayerUploadMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*CompleteLayerUploadOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype CompleteLayerUploadInput struct {\n\n\t// The sha256 digest of the image layer.\n\t//\n\t// This member is required.\n\tLayerDigests []string\n\n\t// The name of the repository to associate with the image layer.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The upload ID from a previous InitiateLayerUpload operation to associate with the image layer.\n\t//\n\t// This member is required.\n\tUploadId *string\n\n\t// The Amazon Web Services account ID associated with the registry to which to\n\t// upload layers. If you do not specify a registry, the default registry is\n\t// assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype CompleteLayerUploadOutput struct {\n\n\t// The sha256 digest of the image layer.\n\tLayerDigest *string\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The repository name associated with the request.\n\tRepositoryName *string\n\n\t// The upload ID associated with the layer.\n\tUploadId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationCompleteLayerUploadMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpCompleteLayerUpload{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpCompleteLayerUpload{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"CompleteLayerUpload\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpCompleteLayerUploadValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opCompleteLayerUpload(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opCompleteLayerUpload(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"CompleteLayerUpload\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CreatePullThroughCacheRule.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"time\"\n)\n\n// Creates a pull through cache rule. A pull through cache rule provides a way to\n// cache images from an upstream registry source in your Amazon ECR private\n// registry. For more information, see [Using pull through cache rules]in the Amazon Elastic Container Registry\n// User Guide.\n//\n// [Using pull through cache rules]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/pull-through-cache.html\nfunc (c *Client) CreatePullThroughCacheRule(ctx context.Context, params *CreatePullThroughCacheRuleInput, optFns ...func(*Options)) (*CreatePullThroughCacheRuleOutput, error) {\n\tif params == nil {\n\t\tparams = &CreatePullThroughCacheRuleInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"CreatePullThroughCacheRule\", params, optFns, c.addOperationCreatePullThroughCacheRuleMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*CreatePullThroughCacheRuleOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype CreatePullThroughCacheRuleInput struct {\n\n\t// The repository name prefix to use when caching images from the source registry.\n\t//\n\t// There is always an assumed / applied to the end of the prefix. If you specify\n\t// ecr-public as the prefix, Amazon ECR treats that as ecr-public/ .\n\t//\n\t// This member is required.\n\tEcrRepositoryPrefix *string\n\n\t// The registry URL of the upstream public registry to use as the source for the\n\t// pull through cache rule. The following is the syntax to use for each supported\n\t// upstream registry.\n\t//\n\t//   - Amazon ECR ( ecr ) – dkr.ecr..amazonaws.com\n\t//\n\t//   - Amazon ECR Public ( ecr-public ) – public.ecr.aws\n\t//\n\t//   - Docker Hub ( docker-hub ) – registry-1.docker.io\n\t//\n\t//   - GitHub Container Registry ( github-container-registry ) – ghcr.io\n\t//\n\t//   - GitLab Container Registry ( gitlab-container-registry ) –\n\t//   registry.gitlab.com\n\t//\n\t//   - Kubernetes ( k8s ) – registry.k8s.io\n\t//\n\t//   - Microsoft Azure Container Registry ( azure-container-registry ) –\n\t//   .azurecr.io\n\t//\n\t//   - Quay ( quay ) – quay.io\n\t//\n\t// This member is required.\n\tUpstreamRegistryUrl *string\n\n\t// The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager\n\t// secret that identifies the credentials to authenticate to the upstream registry.\n\tCredentialArn *string\n\n\t// Amazon Resource Name (ARN) of the IAM role to be assumed by Amazon ECR to\n\t// authenticate to the ECR upstream registry. This role must be in the same account\n\t// as the registry that you are configuring.\n\tCustomRoleArn *string\n\n\t// The Amazon Web Services account ID associated with the registry to create the\n\t// pull through cache rule for. If you do not specify a registry, the default\n\t// registry is assumed.\n\tRegistryId *string\n\n\t// The name of the upstream registry.\n\tUpstreamRegistry types.UpstreamRegistry\n\n\t// The repository name prefix of the upstream registry to match with the upstream\n\t// repository name. When this field isn't specified, Amazon ECR will use the ROOT .\n\tUpstreamRepositoryPrefix *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype CreatePullThroughCacheRuleOutput struct {\n\n\t// The date and time, in JavaScript date format, when the pull through cache rule\n\t// was created.\n\tCreatedAt *time.Time\n\n\t// The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager\n\t// secret associated with the pull through cache rule.\n\tCredentialArn *string\n\n\t// The ARN of the IAM role associated with the pull through cache rule.\n\tCustomRoleArn *string\n\n\t// The Amazon ECR repository prefix associated with the pull through cache rule.\n\tEcrRepositoryPrefix *string\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The name of the upstream registry associated with the pull through cache rule.\n\tUpstreamRegistry types.UpstreamRegistry\n\n\t// The upstream registry URL associated with the pull through cache rule.\n\tUpstreamRegistryUrl *string\n\n\t// The upstream repository prefix associated with the pull through cache rule.\n\tUpstreamRepositoryPrefix *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationCreatePullThroughCacheRuleMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpCreatePullThroughCacheRule{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpCreatePullThroughCacheRule{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"CreatePullThroughCacheRule\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpCreatePullThroughCacheRuleValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreatePullThroughCacheRule(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opCreatePullThroughCacheRule(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"CreatePullThroughCacheRule\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CreateRepository.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Creates a repository. For more information, see [Amazon ECR repositories] in the Amazon Elastic\n// Container Registry User Guide.\n//\n// [Amazon ECR repositories]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/Repositories.html\nfunc (c *Client) CreateRepository(ctx context.Context, params *CreateRepositoryInput, optFns ...func(*Options)) (*CreateRepositoryOutput, error) {\n\tif params == nil {\n\t\tparams = &CreateRepositoryInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"CreateRepository\", params, optFns, c.addOperationCreateRepositoryMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*CreateRepositoryOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype CreateRepositoryInput struct {\n\n\t// The name to use for the repository. The repository name may be specified on its\n\t// own (such as nginx-web-app ) or it can be prepended with a namespace to group\n\t// the repository into a category (such as project-a/nginx-web-app ).\n\t//\n\t// The repository name must start with a letter and can only contain lowercase\n\t// letters, numbers, hyphens, underscores, and forward slashes.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The encryption configuration for the repository. This determines how the\n\t// contents of your repository are encrypted at rest.\n\tEncryptionConfiguration *types.EncryptionConfiguration\n\n\t// The image scanning configuration for the repository. This determines whether\n\t// images are scanned for known vulnerabilities after being pushed to the\n\t// repository.\n\tImageScanningConfiguration *types.ImageScanningConfiguration\n\n\t// The tag mutability setting for the repository. If this parameter is omitted,\n\t// the default setting of MUTABLE will be used which will allow image tags to be\n\t// overwritten. If IMMUTABLE is specified, all image tags within the repository\n\t// will be immutable which will prevent them from being overwritten.\n\tImageTagMutability types.ImageTagMutability\n\n\t// The Amazon Web Services account ID associated with the registry to create the\n\t// repository. If you do not specify a registry, the default registry is assumed.\n\tRegistryId *string\n\n\t// The metadata that you apply to the repository to help you categorize and\n\t// organize them. Each tag consists of a key and an optional value, both of which\n\t// you define. Tag keys can have a maximum character length of 128 characters, and\n\t// tag values can have a maximum length of 256 characters.\n\tTags []types.Tag\n\n\tnoSmithyDocumentSerde\n}\n\ntype CreateRepositoryOutput struct {\n\n\t// The repository that was created.\n\tRepository *types.Repository\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationCreateRepositoryMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpCreateRepository{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpCreateRepository{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"CreateRepository\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpCreateRepositoryValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateRepository(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opCreateRepository(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"CreateRepository\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CreateRepositoryCreationTemplate.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Creates a repository creation template. This template is used to define the\n// settings for repositories created by Amazon ECR on your behalf. For example,\n// repositories created through pull through cache actions. For more information,\n// see [Private repository creation templates]in the Amazon Elastic Container Registry User Guide.\n//\n// [Private repository creation templates]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-creation-templates.html\nfunc (c *Client) CreateRepositoryCreationTemplate(ctx context.Context, params *CreateRepositoryCreationTemplateInput, optFns ...func(*Options)) (*CreateRepositoryCreationTemplateOutput, error) {\n\tif params == nil {\n\t\tparams = &CreateRepositoryCreationTemplateInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"CreateRepositoryCreationTemplate\", params, optFns, c.addOperationCreateRepositoryCreationTemplateMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*CreateRepositoryCreationTemplateOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype CreateRepositoryCreationTemplateInput struct {\n\n\t// A list of enumerable strings representing the Amazon ECR repository creation\n\t// scenarios that this template will apply towards. The two supported scenarios are\n\t// PULL_THROUGH_CACHE and REPLICATION\n\t//\n\t// This member is required.\n\tAppliedFor []types.RCTAppliedFor\n\n\t// The repository namespace prefix to associate with the template. All\n\t// repositories created using this namespace prefix will have the settings defined\n\t// in this template applied. For example, a prefix of prod would apply to all\n\t// repositories beginning with prod/ . Similarly, a prefix of prod/team would\n\t// apply to all repositories beginning with prod/team/ .\n\t//\n\t// To apply a template to all repositories in your registry that don't have an\n\t// associated creation template, you can use ROOT as the prefix.\n\t//\n\t// There is always an assumed / applied to the end of the prefix. If you specify\n\t// ecr-public as the prefix, Amazon ECR treats that as ecr-public/ . When using a\n\t// pull through cache rule, the repository prefix you specify during rule creation\n\t// is what you should specify as your repository creation template prefix as well.\n\t//\n\t// This member is required.\n\tPrefix *string\n\n\t// The ARN of the role to be assumed by Amazon ECR. This role must be in the same\n\t// account as the registry that you are configuring. Amazon ECR will assume your\n\t// supplied role when the customRoleArn is specified. When this field isn't\n\t// specified, Amazon ECR will use the service-linked role for the repository\n\t// creation template.\n\tCustomRoleArn *string\n\n\t// A description for the repository creation template.\n\tDescription *string\n\n\t// The encryption configuration to use for repositories created using the template.\n\tEncryptionConfiguration *types.EncryptionConfigurationForRepositoryCreationTemplate\n\n\t// The tag mutability setting for the repository. If this parameter is omitted,\n\t// the default setting of MUTABLE will be used which will allow image tags to be\n\t// overwritten. If IMMUTABLE is specified, all image tags within the repository\n\t// will be immutable which will prevent them from being overwritten.\n\tImageTagMutability types.ImageTagMutability\n\n\t// The lifecycle policy to use for repositories created using the template.\n\tLifecyclePolicy *string\n\n\t// The repository policy to apply to repositories created using the template. A\n\t// repository policy is a permissions policy associated with a repository to\n\t// control access permissions.\n\tRepositoryPolicy *string\n\n\t// The metadata to apply to the repository to help you categorize and organize.\n\t// Each tag consists of a key and an optional value, both of which you define. Tag\n\t// keys can have a maximum character length of 128 characters, and tag values can\n\t// have a maximum length of 256 characters.\n\tResourceTags []types.Tag\n\n\tnoSmithyDocumentSerde\n}\n\ntype CreateRepositoryCreationTemplateOutput struct {\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The details of the repository creation template associated with the request.\n\tRepositoryCreationTemplate *types.RepositoryCreationTemplate\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationCreateRepositoryCreationTemplateMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpCreateRepositoryCreationTemplate{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpCreateRepositoryCreationTemplate{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"CreateRepositoryCreationTemplate\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpCreateRepositoryCreationTemplateValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateRepositoryCreationTemplate(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opCreateRepositoryCreationTemplate(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"CreateRepositoryCreationTemplate\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteLifecyclePolicy.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"time\"\n)\n\n// Deletes the lifecycle policy associated with the specified repository.\nfunc (c *Client) DeleteLifecyclePolicy(ctx context.Context, params *DeleteLifecyclePolicyInput, optFns ...func(*Options)) (*DeleteLifecyclePolicyOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteLifecyclePolicyInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteLifecyclePolicy\", params, optFns, c.addOperationDeleteLifecyclePolicyMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteLifecyclePolicyOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteLifecyclePolicyInput struct {\n\n\t// The name of the repository.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the repository. If you do not specify a registry, the default registry is\n\t// assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype DeleteLifecyclePolicyOutput struct {\n\n\t// The time stamp of the last time that the lifecycle policy was run.\n\tLastEvaluatedAt *time.Time\n\n\t// The JSON lifecycle policy text.\n\tLifecyclePolicyText *string\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The repository name associated with the request.\n\tRepositoryName *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteLifecyclePolicyMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDeleteLifecyclePolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDeleteLifecyclePolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteLifecyclePolicy\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteLifecyclePolicyValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteLifecyclePolicy(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opDeleteLifecyclePolicy(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteLifecyclePolicy\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeletePullThroughCacheRule.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"time\"\n)\n\n// Deletes a pull through cache rule.\nfunc (c *Client) DeletePullThroughCacheRule(ctx context.Context, params *DeletePullThroughCacheRuleInput, optFns ...func(*Options)) (*DeletePullThroughCacheRuleOutput, error) {\n\tif params == nil {\n\t\tparams = &DeletePullThroughCacheRuleInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeletePullThroughCacheRule\", params, optFns, c.addOperationDeletePullThroughCacheRuleMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeletePullThroughCacheRuleOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeletePullThroughCacheRuleInput struct {\n\n\t// The Amazon ECR repository prefix associated with the pull through cache rule to\n\t// delete.\n\t//\n\t// This member is required.\n\tEcrRepositoryPrefix *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the pull through cache rule. If you do not specify a registry, the default\n\t// registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype DeletePullThroughCacheRuleOutput struct {\n\n\t// The timestamp associated with the pull through cache rule.\n\tCreatedAt *time.Time\n\n\t// The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager\n\t// secret associated with the pull through cache rule.\n\tCredentialArn *string\n\n\t// The ARN of the IAM role associated with the pull through cache rule.\n\tCustomRoleArn *string\n\n\t// The Amazon ECR repository prefix associated with the request.\n\tEcrRepositoryPrefix *string\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The upstream registry URL associated with the pull through cache rule.\n\tUpstreamRegistryUrl *string\n\n\t// The upstream repository prefix associated with the pull through cache rule.\n\tUpstreamRepositoryPrefix *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeletePullThroughCacheRuleMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDeletePullThroughCacheRule{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDeletePullThroughCacheRule{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeletePullThroughCacheRule\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeletePullThroughCacheRuleValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeletePullThroughCacheRule(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opDeletePullThroughCacheRule(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeletePullThroughCacheRule\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRegistryPolicy.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Deletes the registry permissions policy.\nfunc (c *Client) DeleteRegistryPolicy(ctx context.Context, params *DeleteRegistryPolicyInput, optFns ...func(*Options)) (*DeleteRegistryPolicyOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteRegistryPolicyInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteRegistryPolicy\", params, optFns, c.addOperationDeleteRegistryPolicyMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteRegistryPolicyOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteRegistryPolicyInput struct {\n\tnoSmithyDocumentSerde\n}\n\ntype DeleteRegistryPolicyOutput struct {\n\n\t// The contents of the registry permissions policy that was deleted.\n\tPolicyText *string\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteRegistryPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDeleteRegistryPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDeleteRegistryPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteRegistryPolicy\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteRegistryPolicy(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opDeleteRegistryPolicy(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteRegistryPolicy\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRepository.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Deletes a repository. If the repository isn't empty, you must either delete the\n// contents of the repository or use the force option to delete the repository and\n// have Amazon ECR delete all of its contents on your behalf.\nfunc (c *Client) DeleteRepository(ctx context.Context, params *DeleteRepositoryInput, optFns ...func(*Options)) (*DeleteRepositoryOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteRepositoryInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteRepository\", params, optFns, c.addOperationDeleteRepositoryMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteRepositoryOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteRepositoryInput struct {\n\n\t// The name of the repository to delete.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// If true, deleting the repository force deletes the contents of the repository.\n\t// If false, the repository must be empty before attempting to delete it.\n\tForce bool\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the repository to delete. If you do not specify a registry, the default registry\n\t// is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype DeleteRepositoryOutput struct {\n\n\t// The repository that was deleted.\n\tRepository *types.Repository\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteRepositoryMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDeleteRepository{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDeleteRepository{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteRepository\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteRepositoryValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteRepository(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opDeleteRepository(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteRepository\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRepositoryCreationTemplate.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Deletes a repository creation template.\nfunc (c *Client) DeleteRepositoryCreationTemplate(ctx context.Context, params *DeleteRepositoryCreationTemplateInput, optFns ...func(*Options)) (*DeleteRepositoryCreationTemplateOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteRepositoryCreationTemplateInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteRepositoryCreationTemplate\", params, optFns, c.addOperationDeleteRepositoryCreationTemplateMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteRepositoryCreationTemplateOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteRepositoryCreationTemplateInput struct {\n\n\t// The repository namespace prefix associated with the repository creation\n\t// template.\n\t//\n\t// This member is required.\n\tPrefix *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype DeleteRepositoryCreationTemplateOutput struct {\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The details of the repository creation template that was deleted.\n\tRepositoryCreationTemplate *types.RepositoryCreationTemplate\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteRepositoryCreationTemplateMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDeleteRepositoryCreationTemplate{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDeleteRepositoryCreationTemplate{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteRepositoryCreationTemplate\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteRepositoryCreationTemplateValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteRepositoryCreationTemplate(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opDeleteRepositoryCreationTemplate(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteRepositoryCreationTemplate\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRepositoryPolicy.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Deletes the repository policy associated with the specified repository.\nfunc (c *Client) DeleteRepositoryPolicy(ctx context.Context, params *DeleteRepositoryPolicyInput, optFns ...func(*Options)) (*DeleteRepositoryPolicyOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteRepositoryPolicyInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteRepositoryPolicy\", params, optFns, c.addOperationDeleteRepositoryPolicyMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteRepositoryPolicyOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteRepositoryPolicyInput struct {\n\n\t// The name of the repository that is associated with the repository policy to\n\t// delete.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the repository policy to delete. If you do not specify a registry, the default\n\t// registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype DeleteRepositoryPolicyOutput struct {\n\n\t// The JSON repository policy that was deleted from the repository.\n\tPolicyText *string\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The repository name associated with the request.\n\tRepositoryName *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteRepositoryPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDeleteRepositoryPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDeleteRepositoryPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteRepositoryPolicy\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteRepositoryPolicyValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteRepositoryPolicy(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opDeleteRepositoryPolicy(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteRepositoryPolicy\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeImageReplicationStatus.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Returns the replication status for a specified image.\nfunc (c *Client) DescribeImageReplicationStatus(ctx context.Context, params *DescribeImageReplicationStatusInput, optFns ...func(*Options)) (*DescribeImageReplicationStatusOutput, error) {\n\tif params == nil {\n\t\tparams = &DescribeImageReplicationStatusInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DescribeImageReplicationStatus\", params, optFns, c.addOperationDescribeImageReplicationStatusMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DescribeImageReplicationStatusOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DescribeImageReplicationStatusInput struct {\n\n\t// An object with identifying information for an image in an Amazon ECR repository.\n\t//\n\t// This member is required.\n\tImageId *types.ImageIdentifier\n\n\t// The name of the repository that the image is in.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID associated with the registry. If you do not\n\t// specify a registry, the default registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype DescribeImageReplicationStatusOutput struct {\n\n\t// An object with identifying information for an image in an Amazon ECR repository.\n\tImageId *types.ImageIdentifier\n\n\t// The replication status details for the images in the specified repository.\n\tReplicationStatuses []types.ImageReplicationStatus\n\n\t// The repository name associated with the request.\n\tRepositoryName *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDescribeImageReplicationStatusMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeImageReplicationStatus{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeImageReplicationStatus{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DescribeImageReplicationStatus\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDescribeImageReplicationStatusValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeImageReplicationStatus(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opDescribeImageReplicationStatus(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DescribeImageReplicationStatus\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeImageScanFindings.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithytime \"github.com/aws/smithy-go/time\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\tsmithywaiter \"github.com/aws/smithy-go/waiter\"\n\t\"time\"\n)\n\n// Returns the scan findings for the specified image.\nfunc (c *Client) DescribeImageScanFindings(ctx context.Context, params *DescribeImageScanFindingsInput, optFns ...func(*Options)) (*DescribeImageScanFindingsOutput, error) {\n\tif params == nil {\n\t\tparams = &DescribeImageScanFindingsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DescribeImageScanFindings\", params, optFns, c.addOperationDescribeImageScanFindingsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DescribeImageScanFindingsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DescribeImageScanFindingsInput struct {\n\n\t// An object with identifying information for an image in an Amazon ECR repository.\n\t//\n\t// This member is required.\n\tImageId *types.ImageIdentifier\n\n\t// The repository for the image for which to describe the scan findings.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The maximum number of image scan results returned by DescribeImageScanFindings\n\t// in paginated output. When this parameter is used, DescribeImageScanFindings\n\t// only returns maxResults results in a single page along with a nextToken\n\t// response element. The remaining results of the initial request can be seen by\n\t// sending another DescribeImageScanFindings request with the returned nextToken\n\t// value. This value can be between 1 and 1000. If this parameter is not used, then\n\t// DescribeImageScanFindings returns up to 100 results and a nextToken value, if\n\t// applicable.\n\tMaxResults *int32\n\n\t// The nextToken value returned from a previous paginated DescribeImageScanFindings\n\t// request where maxResults was used and the results exceeded the value of that\n\t// parameter. Pagination continues from the end of the previous results that\n\t// returned the nextToken value. This value is null when there are no more results\n\t// to return.\n\tNextToken *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the repository in which to describe the image scan findings for. If you do not\n\t// specify a registry, the default registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype DescribeImageScanFindingsOutput struct {\n\n\t// An object with identifying information for an image in an Amazon ECR repository.\n\tImageId *types.ImageIdentifier\n\n\t// The information contained in the image scan findings.\n\tImageScanFindings *types.ImageScanFindings\n\n\t// The current state of the scan.\n\tImageScanStatus *types.ImageScanStatus\n\n\t// The nextToken value to include in a future DescribeImageScanFindings request.\n\t// When the results of a DescribeImageScanFindings request exceed maxResults , this\n\t// value can be used to retrieve the next page of results. This value is null when\n\t// there are no more results to return.\n\tNextToken *string\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The repository name associated with the request.\n\tRepositoryName *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDescribeImageScanFindingsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeImageScanFindings{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeImageScanFindings{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DescribeImageScanFindings\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDescribeImageScanFindingsValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeImageScanFindings(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// ImageScanCompleteWaiterOptions are waiter options for ImageScanCompleteWaiter\ntype ImageScanCompleteWaiterOptions struct {\n\n\t// Set of options to modify how an operation is invoked. These apply to all\n\t// operations invoked for this client. Use functional options on operation call to\n\t// modify this list for per operation behavior.\n\t//\n\t// Passing options here is functionally equivalent to passing values to this\n\t// config's ClientOptions field that extend the inner client's APIOptions directly.\n\tAPIOptions []func(*middleware.Stack) error\n\n\t// Functional options to be passed to all operations invoked by this client.\n\t//\n\t// Function values that modify the inner APIOptions are applied after the waiter\n\t// config's own APIOptions modifiers.\n\tClientOptions []func(*Options)\n\n\t// MinDelay is the minimum amount of time to delay between retries. If unset,\n\t// ImageScanCompleteWaiter will use default minimum delay of 5 seconds. Note that\n\t// MinDelay must resolve to a value lesser than or equal to the MaxDelay.\n\tMinDelay time.Duration\n\n\t// MaxDelay is the maximum amount of time to delay between retries. If unset or\n\t// set to zero, ImageScanCompleteWaiter will use default max delay of 120 seconds.\n\t// Note that MaxDelay must resolve to value greater than or equal to the MinDelay.\n\tMaxDelay time.Duration\n\n\t// LogWaitAttempts is used to enable logging for waiter retry attempts\n\tLogWaitAttempts bool\n\n\t// Retryable is function that can be used to override the service defined\n\t// waiter-behavior based on operation output, or returned error. This function is\n\t// used by the waiter to decide if a state is retryable or a terminal state.\n\t//\n\t// By default service-modeled logic will populate this option. This option can\n\t// thus be used to define a custom waiter state with fall-back to service-modeled\n\t// waiter state mutators.The function returns an error in case of a failure state.\n\t// In case of retry state, this function returns a bool value of true and nil\n\t// error, while in case of success it returns a bool value of false and nil error.\n\tRetryable func(context.Context, *DescribeImageScanFindingsInput, *DescribeImageScanFindingsOutput, error) (bool, error)\n}\n\n// ImageScanCompleteWaiter defines the waiters for ImageScanComplete\ntype ImageScanCompleteWaiter struct {\n\tclient DescribeImageScanFindingsAPIClient\n\n\toptions ImageScanCompleteWaiterOptions\n}\n\n// NewImageScanCompleteWaiter constructs a ImageScanCompleteWaiter.\nfunc NewImageScanCompleteWaiter(client DescribeImageScanFindingsAPIClient, optFns ...func(*ImageScanCompleteWaiterOptions)) *ImageScanCompleteWaiter {\n\toptions := ImageScanCompleteWaiterOptions{}\n\toptions.MinDelay = 5 * time.Second\n\toptions.MaxDelay = 120 * time.Second\n\toptions.Retryable = imageScanCompleteStateRetryable\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\treturn &ImageScanCompleteWaiter{\n\t\tclient:  client,\n\t\toptions: options,\n\t}\n}\n\n// Wait calls the waiter function for ImageScanComplete waiter. The maxWaitDur is\n// the maximum wait duration the waiter will wait. The maxWaitDur is required and\n// must be greater than zero.\nfunc (w *ImageScanCompleteWaiter) Wait(ctx context.Context, params *DescribeImageScanFindingsInput, maxWaitDur time.Duration, optFns ...func(*ImageScanCompleteWaiterOptions)) error {\n\t_, err := w.WaitForOutput(ctx, params, maxWaitDur, optFns...)\n\treturn err\n}\n\n// WaitForOutput calls the waiter function for ImageScanComplete waiter and\n// returns the output of the successful operation. The maxWaitDur is the maximum\n// wait duration the waiter will wait. The maxWaitDur is required and must be\n// greater than zero.\nfunc (w *ImageScanCompleteWaiter) WaitForOutput(ctx context.Context, params *DescribeImageScanFindingsInput, maxWaitDur time.Duration, optFns ...func(*ImageScanCompleteWaiterOptions)) (*DescribeImageScanFindingsOutput, error) {\n\tif maxWaitDur <= 0 {\n\t\treturn nil, fmt.Errorf(\"maximum wait time for waiter must be greater than zero\")\n\t}\n\n\toptions := w.options\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tif options.MaxDelay <= 0 {\n\t\toptions.MaxDelay = 120 * time.Second\n\t}\n\n\tif options.MinDelay > options.MaxDelay {\n\t\treturn nil, fmt.Errorf(\"minimum waiter delay %v must be lesser than or equal to maximum waiter delay of %v.\", options.MinDelay, options.MaxDelay)\n\t}\n\n\tctx, cancelFn := context.WithTimeout(ctx, maxWaitDur)\n\tdefer cancelFn()\n\n\tlogger := smithywaiter.Logger{}\n\tremainingTime := maxWaitDur\n\n\tvar attempt int64\n\tfor {\n\n\t\tattempt++\n\t\tapiOptions := options.APIOptions\n\t\tstart := time.Now()\n\n\t\tif options.LogWaitAttempts {\n\t\t\tlogger.Attempt = attempt\n\t\t\tapiOptions = append([]func(*middleware.Stack) error{}, options.APIOptions...)\n\t\t\tapiOptions = append(apiOptions, logger.AddLogger)\n\t\t}\n\n\t\tout, err := w.client.DescribeImageScanFindings(ctx, params, func(o *Options) {\n\t\t\tbaseOpts := []func(*Options){\n\t\t\t\taddIsWaiterUserAgent,\n\t\t\t}\n\t\t\to.APIOptions = append(o.APIOptions, apiOptions...)\n\t\t\tfor _, opt := range baseOpts {\n\t\t\t\topt(o)\n\t\t\t}\n\t\t\tfor _, opt := range options.ClientOptions {\n\t\t\t\topt(o)\n\t\t\t}\n\t\t})\n\n\t\tretryable, err := options.Retryable(ctx, params, out, err)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif !retryable {\n\t\t\treturn out, nil\n\t\t}\n\n\t\tremainingTime -= time.Since(start)\n\t\tif remainingTime < options.MinDelay || remainingTime <= 0 {\n\t\t\tbreak\n\t\t}\n\n\t\t// compute exponential backoff between waiter retries\n\t\tdelay, err := smithywaiter.ComputeDelay(\n\t\t\tattempt, options.MinDelay, options.MaxDelay, remainingTime,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error computing waiter delay, %w\", err)\n\t\t}\n\n\t\tremainingTime -= delay\n\t\t// sleep for the delay amount before invoking a request\n\t\tif err := smithytime.SleepWithContext(ctx, delay); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"request cancelled while waiting, %w\", err)\n\t\t}\n\t}\n\treturn nil, fmt.Errorf(\"exceeded max wait time for ImageScanComplete waiter\")\n}\n\nfunc imageScanCompleteStateRetryable(ctx context.Context, input *DescribeImageScanFindingsInput, output *DescribeImageScanFindingsOutput, err error) (bool, error) {\n\n\tif err == nil {\n\t\tv1 := output.ImageScanStatus\n\t\tvar v2 types.ScanStatus\n\t\tif v1 != nil {\n\t\t\tv3 := v1.Status\n\t\t\tv2 = v3\n\t\t}\n\t\texpectedValue := \"COMPLETE\"\n\t\tvar pathValue string\n\t\tpathValue = string(v2)\n\t\tif pathValue == expectedValue {\n\t\t\treturn false, nil\n\t\t}\n\t}\n\n\tif err == nil {\n\t\tv1 := output.ImageScanStatus\n\t\tvar v2 types.ScanStatus\n\t\tif v1 != nil {\n\t\t\tv3 := v1.Status\n\t\t\tv2 = v3\n\t\t}\n\t\texpectedValue := \"FAILED\"\n\t\tvar pathValue string\n\t\tpathValue = string(v2)\n\t\tif pathValue == expectedValue {\n\t\t\treturn false, fmt.Errorf(\"waiter state transitioned to Failure\")\n\t\t}\n\t}\n\n\tif err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n\n// DescribeImageScanFindingsPaginatorOptions is the paginator options for\n// DescribeImageScanFindings\ntype DescribeImageScanFindingsPaginatorOptions struct {\n\t// The maximum number of image scan results returned by DescribeImageScanFindings\n\t// in paginated output. When this parameter is used, DescribeImageScanFindings\n\t// only returns maxResults results in a single page along with a nextToken\n\t// response element. The remaining results of the initial request can be seen by\n\t// sending another DescribeImageScanFindings request with the returned nextToken\n\t// value. This value can be between 1 and 1000. If this parameter is not used, then\n\t// DescribeImageScanFindings returns up to 100 results and a nextToken value, if\n\t// applicable.\n\tLimit int32\n\n\t// Set to true if pagination should stop if the service returns a pagination token\n\t// that matches the most recent token provided to the service.\n\tStopOnDuplicateToken bool\n}\n\n// DescribeImageScanFindingsPaginator is a paginator for DescribeImageScanFindings\ntype DescribeImageScanFindingsPaginator struct {\n\toptions   DescribeImageScanFindingsPaginatorOptions\n\tclient    DescribeImageScanFindingsAPIClient\n\tparams    *DescribeImageScanFindingsInput\n\tnextToken *string\n\tfirstPage bool\n}\n\n// NewDescribeImageScanFindingsPaginator returns a new\n// DescribeImageScanFindingsPaginator\nfunc NewDescribeImageScanFindingsPaginator(client DescribeImageScanFindingsAPIClient, params *DescribeImageScanFindingsInput, optFns ...func(*DescribeImageScanFindingsPaginatorOptions)) *DescribeImageScanFindingsPaginator {\n\tif params == nil {\n\t\tparams = &DescribeImageScanFindingsInput{}\n\t}\n\n\toptions := DescribeImageScanFindingsPaginatorOptions{}\n\tif params.MaxResults != nil {\n\t\toptions.Limit = *params.MaxResults\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &DescribeImageScanFindingsPaginator{\n\t\toptions:   options,\n\t\tclient:    client,\n\t\tparams:    params,\n\t\tfirstPage: true,\n\t\tnextToken: params.NextToken,\n\t}\n}\n\n// HasMorePages returns a boolean indicating whether more pages are available\nfunc (p *DescribeImageScanFindingsPaginator) HasMorePages() bool {\n\treturn p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0)\n}\n\n// NextPage retrieves the next DescribeImageScanFindings page.\nfunc (p *DescribeImageScanFindingsPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribeImageScanFindingsOutput, error) {\n\tif !p.HasMorePages() {\n\t\treturn nil, fmt.Errorf(\"no more pages available\")\n\t}\n\n\tparams := *p.params\n\tparams.NextToken = p.nextToken\n\n\tvar limit *int32\n\tif p.options.Limit > 0 {\n\t\tlimit = &p.options.Limit\n\t}\n\tparams.MaxResults = limit\n\n\toptFns = append([]func(*Options){\n\t\taddIsPaginatorUserAgent,\n\t}, optFns...)\n\tresult, err := p.client.DescribeImageScanFindings(ctx, &params, optFns...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.firstPage = false\n\n\tprevToken := p.nextToken\n\tp.nextToken = result.NextToken\n\n\tif p.options.StopOnDuplicateToken &&\n\t\tprevToken != nil &&\n\t\tp.nextToken != nil &&\n\t\t*prevToken == *p.nextToken {\n\t\tp.nextToken = nil\n\t}\n\n\treturn result, nil\n}\n\n// DescribeImageScanFindingsAPIClient is a client that implements the\n// DescribeImageScanFindings operation.\ntype DescribeImageScanFindingsAPIClient interface {\n\tDescribeImageScanFindings(context.Context, *DescribeImageScanFindingsInput, ...func(*Options)) (*DescribeImageScanFindingsOutput, error)\n}\n\nvar _ DescribeImageScanFindingsAPIClient = (*Client)(nil)\n\nfunc newServiceMetadataMiddleware_opDescribeImageScanFindings(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DescribeImageScanFindings\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeImages.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Returns metadata about the images in a repository.\n//\n// Beginning with Docker version 1.9, the Docker client compresses image layers\n// before pushing them to a V2 Docker registry. The output of the docker images\n// command shows the uncompressed image size, so it may return a larger image size\n// than the image sizes returned by DescribeImages.\nfunc (c *Client) DescribeImages(ctx context.Context, params *DescribeImagesInput, optFns ...func(*Options)) (*DescribeImagesOutput, error) {\n\tif params == nil {\n\t\tparams = &DescribeImagesInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DescribeImages\", params, optFns, c.addOperationDescribeImagesMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DescribeImagesOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DescribeImagesInput struct {\n\n\t// The repository that contains the images to describe.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The filter key and value with which to filter your DescribeImages results.\n\tFilter *types.DescribeImagesFilter\n\n\t// The list of image IDs for the requested repository.\n\tImageIds []types.ImageIdentifier\n\n\t// The maximum number of repository results returned by DescribeImages in\n\t// paginated output. When this parameter is used, DescribeImages only returns\n\t// maxResults results in a single page along with a nextToken response element.\n\t// The remaining results of the initial request can be seen by sending another\n\t// DescribeImages request with the returned nextToken value. This value can be\n\t// between 1 and 1000. If this parameter is not used, then DescribeImages returns\n\t// up to 100 results and a nextToken value, if applicable. This option cannot be\n\t// used when you specify images with imageIds .\n\tMaxResults *int32\n\n\t// The nextToken value returned from a previous paginated DescribeImages request\n\t// where maxResults was used and the results exceeded the value of that parameter.\n\t// Pagination continues from the end of the previous results that returned the\n\t// nextToken value. This value is null when there are no more results to return.\n\t// This option cannot be used when you specify images with imageIds .\n\tNextToken *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the repository in which to describe images. If you do not specify a registry,\n\t// the default registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype DescribeImagesOutput struct {\n\n\t// A list of ImageDetail objects that contain data about the image.\n\tImageDetails []types.ImageDetail\n\n\t// The nextToken value to include in a future DescribeImages request. When the\n\t// results of a DescribeImages request exceed maxResults , this value can be used\n\t// to retrieve the next page of results. This value is null when there are no more\n\t// results to return.\n\tNextToken *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDescribeImagesMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeImages{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeImages{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DescribeImages\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDescribeImagesValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeImages(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// DescribeImagesPaginatorOptions is the paginator options for DescribeImages\ntype DescribeImagesPaginatorOptions struct {\n\t// The maximum number of repository results returned by DescribeImages in\n\t// paginated output. When this parameter is used, DescribeImages only returns\n\t// maxResults results in a single page along with a nextToken response element.\n\t// The remaining results of the initial request can be seen by sending another\n\t// DescribeImages request with the returned nextToken value. This value can be\n\t// between 1 and 1000. If this parameter is not used, then DescribeImages returns\n\t// up to 100 results and a nextToken value, if applicable. This option cannot be\n\t// used when you specify images with imageIds .\n\tLimit int32\n\n\t// Set to true if pagination should stop if the service returns a pagination token\n\t// that matches the most recent token provided to the service.\n\tStopOnDuplicateToken bool\n}\n\n// DescribeImagesPaginator is a paginator for DescribeImages\ntype DescribeImagesPaginator struct {\n\toptions   DescribeImagesPaginatorOptions\n\tclient    DescribeImagesAPIClient\n\tparams    *DescribeImagesInput\n\tnextToken *string\n\tfirstPage bool\n}\n\n// NewDescribeImagesPaginator returns a new DescribeImagesPaginator\nfunc NewDescribeImagesPaginator(client DescribeImagesAPIClient, params *DescribeImagesInput, optFns ...func(*DescribeImagesPaginatorOptions)) *DescribeImagesPaginator {\n\tif params == nil {\n\t\tparams = &DescribeImagesInput{}\n\t}\n\n\toptions := DescribeImagesPaginatorOptions{}\n\tif params.MaxResults != nil {\n\t\toptions.Limit = *params.MaxResults\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &DescribeImagesPaginator{\n\t\toptions:   options,\n\t\tclient:    client,\n\t\tparams:    params,\n\t\tfirstPage: true,\n\t\tnextToken: params.NextToken,\n\t}\n}\n\n// HasMorePages returns a boolean indicating whether more pages are available\nfunc (p *DescribeImagesPaginator) HasMorePages() bool {\n\treturn p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0)\n}\n\n// NextPage retrieves the next DescribeImages page.\nfunc (p *DescribeImagesPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribeImagesOutput, error) {\n\tif !p.HasMorePages() {\n\t\treturn nil, fmt.Errorf(\"no more pages available\")\n\t}\n\n\tparams := *p.params\n\tparams.NextToken = p.nextToken\n\n\tvar limit *int32\n\tif p.options.Limit > 0 {\n\t\tlimit = &p.options.Limit\n\t}\n\tparams.MaxResults = limit\n\n\toptFns = append([]func(*Options){\n\t\taddIsPaginatorUserAgent,\n\t}, optFns...)\n\tresult, err := p.client.DescribeImages(ctx, &params, optFns...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.firstPage = false\n\n\tprevToken := p.nextToken\n\tp.nextToken = result.NextToken\n\n\tif p.options.StopOnDuplicateToken &&\n\t\tprevToken != nil &&\n\t\tp.nextToken != nil &&\n\t\t*prevToken == *p.nextToken {\n\t\tp.nextToken = nil\n\t}\n\n\treturn result, nil\n}\n\n// DescribeImagesAPIClient is a client that implements the DescribeImages\n// operation.\ntype DescribeImagesAPIClient interface {\n\tDescribeImages(context.Context, *DescribeImagesInput, ...func(*Options)) (*DescribeImagesOutput, error)\n}\n\nvar _ DescribeImagesAPIClient = (*Client)(nil)\n\nfunc newServiceMetadataMiddleware_opDescribeImages(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DescribeImages\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribePullThroughCacheRules.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Returns the pull through cache rules for a registry.\nfunc (c *Client) DescribePullThroughCacheRules(ctx context.Context, params *DescribePullThroughCacheRulesInput, optFns ...func(*Options)) (*DescribePullThroughCacheRulesOutput, error) {\n\tif params == nil {\n\t\tparams = &DescribePullThroughCacheRulesInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DescribePullThroughCacheRules\", params, optFns, c.addOperationDescribePullThroughCacheRulesMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DescribePullThroughCacheRulesOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DescribePullThroughCacheRulesInput struct {\n\n\t// The Amazon ECR repository prefixes associated with the pull through cache rules\n\t// to return. If no repository prefix value is specified, all pull through cache\n\t// rules are returned.\n\tEcrRepositoryPrefixes []string\n\n\t// The maximum number of pull through cache rules returned by\n\t// DescribePullThroughCacheRulesRequest in paginated output. When this parameter is\n\t// used, DescribePullThroughCacheRulesRequest only returns maxResults results in a\n\t// single page along with a nextToken response element. The remaining results of\n\t// the initial request can be seen by sending another\n\t// DescribePullThroughCacheRulesRequest request with the returned nextToken value.\n\t// This value can be between 1 and 1000. If this parameter is not used, then\n\t// DescribePullThroughCacheRulesRequest returns up to 100 results and a nextToken\n\t// value, if applicable.\n\tMaxResults *int32\n\n\t// The nextToken value returned from a previous paginated\n\t// DescribePullThroughCacheRulesRequest request where maxResults was used and the\n\t// results exceeded the value of that parameter. Pagination continues from the end\n\t// of the previous results that returned the nextToken value. This value is null\n\t// when there are no more results to return.\n\tNextToken *string\n\n\t// The Amazon Web Services account ID associated with the registry to return the\n\t// pull through cache rules for. If you do not specify a registry, the default\n\t// registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype DescribePullThroughCacheRulesOutput struct {\n\n\t// The nextToken value to include in a future DescribePullThroughCacheRulesRequest\n\t// request. When the results of a DescribePullThroughCacheRulesRequest request\n\t// exceed maxResults , this value can be used to retrieve the next page of results.\n\t// This value is null when there are no more results to return.\n\tNextToken *string\n\n\t// The details of the pull through cache rules.\n\tPullThroughCacheRules []types.PullThroughCacheRule\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDescribePullThroughCacheRulesMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribePullThroughCacheRules{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribePullThroughCacheRules{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DescribePullThroughCacheRules\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribePullThroughCacheRules(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// DescribePullThroughCacheRulesPaginatorOptions is the paginator options for\n// DescribePullThroughCacheRules\ntype DescribePullThroughCacheRulesPaginatorOptions struct {\n\t// The maximum number of pull through cache rules returned by\n\t// DescribePullThroughCacheRulesRequest in paginated output. When this parameter is\n\t// used, DescribePullThroughCacheRulesRequest only returns maxResults results in a\n\t// single page along with a nextToken response element. The remaining results of\n\t// the initial request can be seen by sending another\n\t// DescribePullThroughCacheRulesRequest request with the returned nextToken value.\n\t// This value can be between 1 and 1000. If this parameter is not used, then\n\t// DescribePullThroughCacheRulesRequest returns up to 100 results and a nextToken\n\t// value, if applicable.\n\tLimit int32\n\n\t// Set to true if pagination should stop if the service returns a pagination token\n\t// that matches the most recent token provided to the service.\n\tStopOnDuplicateToken bool\n}\n\n// DescribePullThroughCacheRulesPaginator is a paginator for\n// DescribePullThroughCacheRules\ntype DescribePullThroughCacheRulesPaginator struct {\n\toptions   DescribePullThroughCacheRulesPaginatorOptions\n\tclient    DescribePullThroughCacheRulesAPIClient\n\tparams    *DescribePullThroughCacheRulesInput\n\tnextToken *string\n\tfirstPage bool\n}\n\n// NewDescribePullThroughCacheRulesPaginator returns a new\n// DescribePullThroughCacheRulesPaginator\nfunc NewDescribePullThroughCacheRulesPaginator(client DescribePullThroughCacheRulesAPIClient, params *DescribePullThroughCacheRulesInput, optFns ...func(*DescribePullThroughCacheRulesPaginatorOptions)) *DescribePullThroughCacheRulesPaginator {\n\tif params == nil {\n\t\tparams = &DescribePullThroughCacheRulesInput{}\n\t}\n\n\toptions := DescribePullThroughCacheRulesPaginatorOptions{}\n\tif params.MaxResults != nil {\n\t\toptions.Limit = *params.MaxResults\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &DescribePullThroughCacheRulesPaginator{\n\t\toptions:   options,\n\t\tclient:    client,\n\t\tparams:    params,\n\t\tfirstPage: true,\n\t\tnextToken: params.NextToken,\n\t}\n}\n\n// HasMorePages returns a boolean indicating whether more pages are available\nfunc (p *DescribePullThroughCacheRulesPaginator) HasMorePages() bool {\n\treturn p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0)\n}\n\n// NextPage retrieves the next DescribePullThroughCacheRules page.\nfunc (p *DescribePullThroughCacheRulesPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribePullThroughCacheRulesOutput, error) {\n\tif !p.HasMorePages() {\n\t\treturn nil, fmt.Errorf(\"no more pages available\")\n\t}\n\n\tparams := *p.params\n\tparams.NextToken = p.nextToken\n\n\tvar limit *int32\n\tif p.options.Limit > 0 {\n\t\tlimit = &p.options.Limit\n\t}\n\tparams.MaxResults = limit\n\n\toptFns = append([]func(*Options){\n\t\taddIsPaginatorUserAgent,\n\t}, optFns...)\n\tresult, err := p.client.DescribePullThroughCacheRules(ctx, &params, optFns...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.firstPage = false\n\n\tprevToken := p.nextToken\n\tp.nextToken = result.NextToken\n\n\tif p.options.StopOnDuplicateToken &&\n\t\tprevToken != nil &&\n\t\tp.nextToken != nil &&\n\t\t*prevToken == *p.nextToken {\n\t\tp.nextToken = nil\n\t}\n\n\treturn result, nil\n}\n\n// DescribePullThroughCacheRulesAPIClient is a client that implements the\n// DescribePullThroughCacheRules operation.\ntype DescribePullThroughCacheRulesAPIClient interface {\n\tDescribePullThroughCacheRules(context.Context, *DescribePullThroughCacheRulesInput, ...func(*Options)) (*DescribePullThroughCacheRulesOutput, error)\n}\n\nvar _ DescribePullThroughCacheRulesAPIClient = (*Client)(nil)\n\nfunc newServiceMetadataMiddleware_opDescribePullThroughCacheRules(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DescribePullThroughCacheRules\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeRegistry.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Describes the settings for a registry. The replication configuration for a\n// repository can be created or updated with the PutReplicationConfigurationAPI action.\nfunc (c *Client) DescribeRegistry(ctx context.Context, params *DescribeRegistryInput, optFns ...func(*Options)) (*DescribeRegistryOutput, error) {\n\tif params == nil {\n\t\tparams = &DescribeRegistryInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DescribeRegistry\", params, optFns, c.addOperationDescribeRegistryMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DescribeRegistryOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DescribeRegistryInput struct {\n\tnoSmithyDocumentSerde\n}\n\ntype DescribeRegistryOutput struct {\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The replication configuration for the registry.\n\tReplicationConfiguration *types.ReplicationConfiguration\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDescribeRegistryMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeRegistry{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeRegistry{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DescribeRegistry\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeRegistry(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opDescribeRegistry(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DescribeRegistry\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeRepositories.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Describes image repositories in a registry.\nfunc (c *Client) DescribeRepositories(ctx context.Context, params *DescribeRepositoriesInput, optFns ...func(*Options)) (*DescribeRepositoriesOutput, error) {\n\tif params == nil {\n\t\tparams = &DescribeRepositoriesInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DescribeRepositories\", params, optFns, c.addOperationDescribeRepositoriesMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DescribeRepositoriesOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DescribeRepositoriesInput struct {\n\n\t// The maximum number of repository results returned by DescribeRepositories in\n\t// paginated output. When this parameter is used, DescribeRepositories only\n\t// returns maxResults results in a single page along with a nextToken response\n\t// element. The remaining results of the initial request can be seen by sending\n\t// another DescribeRepositories request with the returned nextToken value. This\n\t// value can be between 1 and 1000. If this parameter is not used, then\n\t// DescribeRepositories returns up to 100 results and a nextToken value, if\n\t// applicable. This option cannot be used when you specify repositories with\n\t// repositoryNames .\n\tMaxResults *int32\n\n\t// The nextToken value returned from a previous paginated DescribeRepositories\n\t// request where maxResults was used and the results exceeded the value of that\n\t// parameter. Pagination continues from the end of the previous results that\n\t// returned the nextToken value. This value is null when there are no more results\n\t// to return. This option cannot be used when you specify repositories with\n\t// repositoryNames .\n\t//\n\t// This token should be treated as an opaque identifier that is only used to\n\t// retrieve the next items in a list and not for other programmatic purposes.\n\tNextToken *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the repositories to be described. If you do not specify a registry, the default\n\t// registry is assumed.\n\tRegistryId *string\n\n\t// A list of repositories to describe. If this parameter is omitted, then all\n\t// repositories in a registry are described.\n\tRepositoryNames []string\n\n\tnoSmithyDocumentSerde\n}\n\ntype DescribeRepositoriesOutput struct {\n\n\t// The nextToken value to include in a future DescribeRepositories request. When\n\t// the results of a DescribeRepositories request exceed maxResults , this value can\n\t// be used to retrieve the next page of results. This value is null when there are\n\t// no more results to return.\n\tNextToken *string\n\n\t// A list of repository objects corresponding to valid repositories.\n\tRepositories []types.Repository\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDescribeRepositoriesMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeRepositories{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeRepositories{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DescribeRepositories\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeRepositories(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// DescribeRepositoriesPaginatorOptions is the paginator options for\n// DescribeRepositories\ntype DescribeRepositoriesPaginatorOptions struct {\n\t// The maximum number of repository results returned by DescribeRepositories in\n\t// paginated output. When this parameter is used, DescribeRepositories only\n\t// returns maxResults results in a single page along with a nextToken response\n\t// element. The remaining results of the initial request can be seen by sending\n\t// another DescribeRepositories request with the returned nextToken value. This\n\t// value can be between 1 and 1000. If this parameter is not used, then\n\t// DescribeRepositories returns up to 100 results and a nextToken value, if\n\t// applicable. This option cannot be used when you specify repositories with\n\t// repositoryNames .\n\tLimit int32\n\n\t// Set to true if pagination should stop if the service returns a pagination token\n\t// that matches the most recent token provided to the service.\n\tStopOnDuplicateToken bool\n}\n\n// DescribeRepositoriesPaginator is a paginator for DescribeRepositories\ntype DescribeRepositoriesPaginator struct {\n\toptions   DescribeRepositoriesPaginatorOptions\n\tclient    DescribeRepositoriesAPIClient\n\tparams    *DescribeRepositoriesInput\n\tnextToken *string\n\tfirstPage bool\n}\n\n// NewDescribeRepositoriesPaginator returns a new DescribeRepositoriesPaginator\nfunc NewDescribeRepositoriesPaginator(client DescribeRepositoriesAPIClient, params *DescribeRepositoriesInput, optFns ...func(*DescribeRepositoriesPaginatorOptions)) *DescribeRepositoriesPaginator {\n\tif params == nil {\n\t\tparams = &DescribeRepositoriesInput{}\n\t}\n\n\toptions := DescribeRepositoriesPaginatorOptions{}\n\tif params.MaxResults != nil {\n\t\toptions.Limit = *params.MaxResults\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &DescribeRepositoriesPaginator{\n\t\toptions:   options,\n\t\tclient:    client,\n\t\tparams:    params,\n\t\tfirstPage: true,\n\t\tnextToken: params.NextToken,\n\t}\n}\n\n// HasMorePages returns a boolean indicating whether more pages are available\nfunc (p *DescribeRepositoriesPaginator) HasMorePages() bool {\n\treturn p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0)\n}\n\n// NextPage retrieves the next DescribeRepositories page.\nfunc (p *DescribeRepositoriesPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribeRepositoriesOutput, error) {\n\tif !p.HasMorePages() {\n\t\treturn nil, fmt.Errorf(\"no more pages available\")\n\t}\n\n\tparams := *p.params\n\tparams.NextToken = p.nextToken\n\n\tvar limit *int32\n\tif p.options.Limit > 0 {\n\t\tlimit = &p.options.Limit\n\t}\n\tparams.MaxResults = limit\n\n\toptFns = append([]func(*Options){\n\t\taddIsPaginatorUserAgent,\n\t}, optFns...)\n\tresult, err := p.client.DescribeRepositories(ctx, &params, optFns...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.firstPage = false\n\n\tprevToken := p.nextToken\n\tp.nextToken = result.NextToken\n\n\tif p.options.StopOnDuplicateToken &&\n\t\tprevToken != nil &&\n\t\tp.nextToken != nil &&\n\t\t*prevToken == *p.nextToken {\n\t\tp.nextToken = nil\n\t}\n\n\treturn result, nil\n}\n\n// DescribeRepositoriesAPIClient is a client that implements the\n// DescribeRepositories operation.\ntype DescribeRepositoriesAPIClient interface {\n\tDescribeRepositories(context.Context, *DescribeRepositoriesInput, ...func(*Options)) (*DescribeRepositoriesOutput, error)\n}\n\nvar _ DescribeRepositoriesAPIClient = (*Client)(nil)\n\nfunc newServiceMetadataMiddleware_opDescribeRepositories(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DescribeRepositories\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeRepositoryCreationTemplates.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Returns details about the repository creation templates in a registry. The\n// prefixes request parameter can be used to return the details for a specific\n// repository creation template.\nfunc (c *Client) DescribeRepositoryCreationTemplates(ctx context.Context, params *DescribeRepositoryCreationTemplatesInput, optFns ...func(*Options)) (*DescribeRepositoryCreationTemplatesOutput, error) {\n\tif params == nil {\n\t\tparams = &DescribeRepositoryCreationTemplatesInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DescribeRepositoryCreationTemplates\", params, optFns, c.addOperationDescribeRepositoryCreationTemplatesMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DescribeRepositoryCreationTemplatesOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DescribeRepositoryCreationTemplatesInput struct {\n\n\t// The maximum number of repository results returned by\n\t// DescribeRepositoryCreationTemplatesRequest in paginated output. When this\n\t// parameter is used, DescribeRepositoryCreationTemplatesRequest only returns\n\t// maxResults results in a single page along with a nextToken response element.\n\t// The remaining results of the initial request can be seen by sending another\n\t// DescribeRepositoryCreationTemplatesRequest request with the returned nextToken\n\t// value. This value can be between 1 and 1000. If this parameter is not used, then\n\t// DescribeRepositoryCreationTemplatesRequest returns up to 100 results and a\n\t// nextToken value, if applicable.\n\tMaxResults *int32\n\n\t// The nextToken value returned from a previous paginated\n\t// DescribeRepositoryCreationTemplates request where maxResults was used and the\n\t// results exceeded the value of that parameter. Pagination continues from the end\n\t// of the previous results that returned the nextToken value. This value is null\n\t// when there are no more results to return.\n\t//\n\t// This token should be treated as an opaque identifier that is only used to\n\t// retrieve the next items in a list and not for other programmatic purposes.\n\tNextToken *string\n\n\t// The repository namespace prefixes associated with the repository creation\n\t// templates to describe. If this value is not specified, all repository creation\n\t// templates are returned.\n\tPrefixes []string\n\n\tnoSmithyDocumentSerde\n}\n\ntype DescribeRepositoryCreationTemplatesOutput struct {\n\n\t// The nextToken value to include in a future DescribeRepositoryCreationTemplates\n\t// request. When the results of a DescribeRepositoryCreationTemplates request\n\t// exceed maxResults , this value can be used to retrieve the next page of results.\n\t// This value is null when there are no more results to return.\n\tNextToken *string\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The details of the repository creation templates.\n\tRepositoryCreationTemplates []types.RepositoryCreationTemplate\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDescribeRepositoryCreationTemplatesMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeRepositoryCreationTemplates{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeRepositoryCreationTemplates{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DescribeRepositoryCreationTemplates\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeRepositoryCreationTemplates(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// DescribeRepositoryCreationTemplatesPaginatorOptions is the paginator options\n// for DescribeRepositoryCreationTemplates\ntype DescribeRepositoryCreationTemplatesPaginatorOptions struct {\n\t// The maximum number of repository results returned by\n\t// DescribeRepositoryCreationTemplatesRequest in paginated output. When this\n\t// parameter is used, DescribeRepositoryCreationTemplatesRequest only returns\n\t// maxResults results in a single page along with a nextToken response element.\n\t// The remaining results of the initial request can be seen by sending another\n\t// DescribeRepositoryCreationTemplatesRequest request with the returned nextToken\n\t// value. This value can be between 1 and 1000. If this parameter is not used, then\n\t// DescribeRepositoryCreationTemplatesRequest returns up to 100 results and a\n\t// nextToken value, if applicable.\n\tLimit int32\n\n\t// Set to true if pagination should stop if the service returns a pagination token\n\t// that matches the most recent token provided to the service.\n\tStopOnDuplicateToken bool\n}\n\n// DescribeRepositoryCreationTemplatesPaginator is a paginator for\n// DescribeRepositoryCreationTemplates\ntype DescribeRepositoryCreationTemplatesPaginator struct {\n\toptions   DescribeRepositoryCreationTemplatesPaginatorOptions\n\tclient    DescribeRepositoryCreationTemplatesAPIClient\n\tparams    *DescribeRepositoryCreationTemplatesInput\n\tnextToken *string\n\tfirstPage bool\n}\n\n// NewDescribeRepositoryCreationTemplatesPaginator returns a new\n// DescribeRepositoryCreationTemplatesPaginator\nfunc NewDescribeRepositoryCreationTemplatesPaginator(client DescribeRepositoryCreationTemplatesAPIClient, params *DescribeRepositoryCreationTemplatesInput, optFns ...func(*DescribeRepositoryCreationTemplatesPaginatorOptions)) *DescribeRepositoryCreationTemplatesPaginator {\n\tif params == nil {\n\t\tparams = &DescribeRepositoryCreationTemplatesInput{}\n\t}\n\n\toptions := DescribeRepositoryCreationTemplatesPaginatorOptions{}\n\tif params.MaxResults != nil {\n\t\toptions.Limit = *params.MaxResults\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &DescribeRepositoryCreationTemplatesPaginator{\n\t\toptions:   options,\n\t\tclient:    client,\n\t\tparams:    params,\n\t\tfirstPage: true,\n\t\tnextToken: params.NextToken,\n\t}\n}\n\n// HasMorePages returns a boolean indicating whether more pages are available\nfunc (p *DescribeRepositoryCreationTemplatesPaginator) HasMorePages() bool {\n\treturn p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0)\n}\n\n// NextPage retrieves the next DescribeRepositoryCreationTemplates page.\nfunc (p *DescribeRepositoryCreationTemplatesPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribeRepositoryCreationTemplatesOutput, error) {\n\tif !p.HasMorePages() {\n\t\treturn nil, fmt.Errorf(\"no more pages available\")\n\t}\n\n\tparams := *p.params\n\tparams.NextToken = p.nextToken\n\n\tvar limit *int32\n\tif p.options.Limit > 0 {\n\t\tlimit = &p.options.Limit\n\t}\n\tparams.MaxResults = limit\n\n\toptFns = append([]func(*Options){\n\t\taddIsPaginatorUserAgent,\n\t}, optFns...)\n\tresult, err := p.client.DescribeRepositoryCreationTemplates(ctx, &params, optFns...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.firstPage = false\n\n\tprevToken := p.nextToken\n\tp.nextToken = result.NextToken\n\n\tif p.options.StopOnDuplicateToken &&\n\t\tprevToken != nil &&\n\t\tp.nextToken != nil &&\n\t\t*prevToken == *p.nextToken {\n\t\tp.nextToken = nil\n\t}\n\n\treturn result, nil\n}\n\n// DescribeRepositoryCreationTemplatesAPIClient is a client that implements the\n// DescribeRepositoryCreationTemplates operation.\ntype DescribeRepositoryCreationTemplatesAPIClient interface {\n\tDescribeRepositoryCreationTemplates(context.Context, *DescribeRepositoryCreationTemplatesInput, ...func(*Options)) (*DescribeRepositoryCreationTemplatesOutput, error)\n}\n\nvar _ DescribeRepositoryCreationTemplatesAPIClient = (*Client)(nil)\n\nfunc newServiceMetadataMiddleware_opDescribeRepositoryCreationTemplates(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DescribeRepositoryCreationTemplates\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetAccountSetting.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Retrieves the account setting value for the specified setting name.\nfunc (c *Client) GetAccountSetting(ctx context.Context, params *GetAccountSettingInput, optFns ...func(*Options)) (*GetAccountSettingOutput, error) {\n\tif params == nil {\n\t\tparams = &GetAccountSettingInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetAccountSetting\", params, optFns, c.addOperationGetAccountSettingMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetAccountSettingOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetAccountSettingInput struct {\n\n\t// The name of the account setting, such as BASIC_SCAN_TYPE_VERSION or\n\t// REGISTRY_POLICY_SCOPE .\n\t//\n\t// This member is required.\n\tName *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype GetAccountSettingOutput struct {\n\n\t// Retrieves the name of the account setting.\n\tName *string\n\n\t// The setting value for the setting name. The following are valid values for the\n\t// basic scan type being used: AWS_NATIVE or CLAIR . The following are valid values\n\t// for the registry policy scope being used: V1 or V2 .\n\tValue *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetAccountSettingMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpGetAccountSetting{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetAccountSetting{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetAccountSetting\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetAccountSettingValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetAccountSetting(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opGetAccountSetting(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetAccountSetting\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetAuthorizationToken.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Retrieves an authorization token. An authorization token represents your IAM\n// authentication credentials and can be used to access any Amazon ECR registry\n// that your IAM principal has access to. The authorization token is valid for 12\n// hours.\n//\n// The authorizationToken returned is a base64 encoded string that can be decoded\n// and used in a docker login command to authenticate to a registry. The CLI\n// offers an get-login-password command that simplifies the login process. For\n// more information, see [Registry authentication]in the Amazon Elastic Container Registry User Guide.\n//\n// [Registry authentication]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth\nfunc (c *Client) GetAuthorizationToken(ctx context.Context, params *GetAuthorizationTokenInput, optFns ...func(*Options)) (*GetAuthorizationTokenOutput, error) {\n\tif params == nil {\n\t\tparams = &GetAuthorizationTokenInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetAuthorizationToken\", params, optFns, c.addOperationGetAuthorizationTokenMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetAuthorizationTokenOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetAuthorizationTokenInput struct {\n\n\t// A list of Amazon Web Services account IDs that are associated with the\n\t// registries for which to get AuthorizationData objects. If you do not specify a\n\t// registry, the default registry is assumed.\n\t//\n\t// Deprecated: This field is deprecated. The returned authorization token can be\n\t// used to access any Amazon ECR registry that the IAM principal has access to,\n\t// specifying a registry ID doesn't change the permissions scope of the\n\t// authorization token.\n\tRegistryIds []string\n\n\tnoSmithyDocumentSerde\n}\n\ntype GetAuthorizationTokenOutput struct {\n\n\t// A list of authorization token data objects that correspond to the registryIds\n\t// values in the request.\n\tAuthorizationData []types.AuthorizationData\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetAuthorizationTokenMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpGetAuthorizationToken{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetAuthorizationToken{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetAuthorizationToken\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetAuthorizationToken(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opGetAuthorizationToken(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetAuthorizationToken\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetDownloadUrlForLayer.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Retrieves the pre-signed Amazon S3 download URL corresponding to an image\n// layer. You can only get URLs for image layers that are referenced in an image.\n//\n// When an image is pulled, the GetDownloadUrlForLayer API is called once per\n// image layer that is not already cached.\n//\n// This operation is used by the Amazon ECR proxy and is not generally used by\n// customers for pulling and pushing images. In most cases, you should use the\n// docker CLI to pull, tag, and push images.\nfunc (c *Client) GetDownloadUrlForLayer(ctx context.Context, params *GetDownloadUrlForLayerInput, optFns ...func(*Options)) (*GetDownloadUrlForLayerOutput, error) {\n\tif params == nil {\n\t\tparams = &GetDownloadUrlForLayerInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetDownloadUrlForLayer\", params, optFns, c.addOperationGetDownloadUrlForLayerMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetDownloadUrlForLayerOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetDownloadUrlForLayerInput struct {\n\n\t// The digest of the image layer to download.\n\t//\n\t// This member is required.\n\tLayerDigest *string\n\n\t// The name of the repository that is associated with the image layer to download.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the image layer to download. If you do not specify a registry, the default\n\t// registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype GetDownloadUrlForLayerOutput struct {\n\n\t// The pre-signed Amazon S3 download URL for the requested layer.\n\tDownloadUrl *string\n\n\t// The digest of the image layer to download.\n\tLayerDigest *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetDownloadUrlForLayerMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpGetDownloadUrlForLayer{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetDownloadUrlForLayer{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetDownloadUrlForLayer\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetDownloadUrlForLayerValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetDownloadUrlForLayer(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opGetDownloadUrlForLayer(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetDownloadUrlForLayer\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetLifecyclePolicy.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"time\"\n)\n\n// Retrieves the lifecycle policy for the specified repository.\nfunc (c *Client) GetLifecyclePolicy(ctx context.Context, params *GetLifecyclePolicyInput, optFns ...func(*Options)) (*GetLifecyclePolicyOutput, error) {\n\tif params == nil {\n\t\tparams = &GetLifecyclePolicyInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetLifecyclePolicy\", params, optFns, c.addOperationGetLifecyclePolicyMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetLifecyclePolicyOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetLifecyclePolicyInput struct {\n\n\t// The name of the repository.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the repository. If you do not specify a registry, the default registry is\n\t// assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype GetLifecyclePolicyOutput struct {\n\n\t// The time stamp of the last time that the lifecycle policy was run.\n\tLastEvaluatedAt *time.Time\n\n\t// The JSON lifecycle policy text.\n\tLifecyclePolicyText *string\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The repository name associated with the request.\n\tRepositoryName *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetLifecyclePolicyMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpGetLifecyclePolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetLifecyclePolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetLifecyclePolicy\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetLifecyclePolicyValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetLifecyclePolicy(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opGetLifecyclePolicy(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetLifecyclePolicy\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetLifecyclePolicyPreview.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithytime \"github.com/aws/smithy-go/time\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\tsmithywaiter \"github.com/aws/smithy-go/waiter\"\n\t\"time\"\n)\n\n// Retrieves the results of the lifecycle policy preview request for the specified\n// repository.\nfunc (c *Client) GetLifecyclePolicyPreview(ctx context.Context, params *GetLifecyclePolicyPreviewInput, optFns ...func(*Options)) (*GetLifecyclePolicyPreviewOutput, error) {\n\tif params == nil {\n\t\tparams = &GetLifecyclePolicyPreviewInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetLifecyclePolicyPreview\", params, optFns, c.addOperationGetLifecyclePolicyPreviewMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetLifecyclePolicyPreviewOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetLifecyclePolicyPreviewInput struct {\n\n\t// The name of the repository.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// An optional parameter that filters results based on image tag status and all\n\t// tags, if tagged.\n\tFilter *types.LifecyclePolicyPreviewFilter\n\n\t// The list of imageIDs to be included.\n\tImageIds []types.ImageIdentifier\n\n\t// The maximum number of repository results returned by\n\t// GetLifecyclePolicyPreviewRequest in  paginated output. When this parameter is\n\t// used, GetLifecyclePolicyPreviewRequest only returns  maxResults results in a\n\t// single page along with a nextToken   response element. The remaining results of\n\t// the initial request can be seen by sending  another\n\t// GetLifecyclePolicyPreviewRequest request with the returned nextToken   value.\n\t// This value can be between 1 and 1000. If this  parameter is not used, then\n\t// GetLifecyclePolicyPreviewRequest returns up to  100 results and a nextToken\n\t// value, if  applicable. This option cannot be used when you specify images with\n\t// imageIds .\n\tMaxResults *int32\n\n\t// The nextToken value returned from a previous paginated\n\t// GetLifecyclePolicyPreviewRequest request where maxResults was used and the\n\t// results exceeded the value of that parameter. Pagination continues from the end\n\t// of the  previous results that returned the nextToken value. This value is  null\n\t// when there are no more results to return. This option cannot be used when you\n\t// specify images with imageIds .\n\tNextToken *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the repository. If you do not specify a registry, the default registry is\n\t// assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype GetLifecyclePolicyPreviewOutput struct {\n\n\t// The JSON lifecycle policy text.\n\tLifecyclePolicyText *string\n\n\t// The nextToken value to include in a future GetLifecyclePolicyPreview request.\n\t// When the results of a GetLifecyclePolicyPreview request exceed maxResults , this\n\t// value can be used to retrieve the next page of results. This value is null when\n\t// there are no more results to return.\n\tNextToken *string\n\n\t// The results of the lifecycle policy preview request.\n\tPreviewResults []types.LifecyclePolicyPreviewResult\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The repository name associated with the request.\n\tRepositoryName *string\n\n\t// The status of the lifecycle policy preview request.\n\tStatus types.LifecyclePolicyPreviewStatus\n\n\t// The list of images that is returned as a result of the action.\n\tSummary *types.LifecyclePolicyPreviewSummary\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetLifecyclePolicyPreviewMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpGetLifecyclePolicyPreview{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetLifecyclePolicyPreview{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetLifecyclePolicyPreview\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetLifecyclePolicyPreviewValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetLifecyclePolicyPreview(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// LifecyclePolicyPreviewCompleteWaiterOptions are waiter options for\n// LifecyclePolicyPreviewCompleteWaiter\ntype LifecyclePolicyPreviewCompleteWaiterOptions struct {\n\n\t// Set of options to modify how an operation is invoked. These apply to all\n\t// operations invoked for this client. Use functional options on operation call to\n\t// modify this list for per operation behavior.\n\t//\n\t// Passing options here is functionally equivalent to passing values to this\n\t// config's ClientOptions field that extend the inner client's APIOptions directly.\n\tAPIOptions []func(*middleware.Stack) error\n\n\t// Functional options to be passed to all operations invoked by this client.\n\t//\n\t// Function values that modify the inner APIOptions are applied after the waiter\n\t// config's own APIOptions modifiers.\n\tClientOptions []func(*Options)\n\n\t// MinDelay is the minimum amount of time to delay between retries. If unset,\n\t// LifecyclePolicyPreviewCompleteWaiter will use default minimum delay of 5\n\t// seconds. Note that MinDelay must resolve to a value lesser than or equal to the\n\t// MaxDelay.\n\tMinDelay time.Duration\n\n\t// MaxDelay is the maximum amount of time to delay between retries. If unset or\n\t// set to zero, LifecyclePolicyPreviewCompleteWaiter will use default max delay of\n\t// 120 seconds. Note that MaxDelay must resolve to value greater than or equal to\n\t// the MinDelay.\n\tMaxDelay time.Duration\n\n\t// LogWaitAttempts is used to enable logging for waiter retry attempts\n\tLogWaitAttempts bool\n\n\t// Retryable is function that can be used to override the service defined\n\t// waiter-behavior based on operation output, or returned error. This function is\n\t// used by the waiter to decide if a state is retryable or a terminal state.\n\t//\n\t// By default service-modeled logic will populate this option. This option can\n\t// thus be used to define a custom waiter state with fall-back to service-modeled\n\t// waiter state mutators.The function returns an error in case of a failure state.\n\t// In case of retry state, this function returns a bool value of true and nil\n\t// error, while in case of success it returns a bool value of false and nil error.\n\tRetryable func(context.Context, *GetLifecyclePolicyPreviewInput, *GetLifecyclePolicyPreviewOutput, error) (bool, error)\n}\n\n// LifecyclePolicyPreviewCompleteWaiter defines the waiters for\n// LifecyclePolicyPreviewComplete\ntype LifecyclePolicyPreviewCompleteWaiter struct {\n\tclient GetLifecyclePolicyPreviewAPIClient\n\n\toptions LifecyclePolicyPreviewCompleteWaiterOptions\n}\n\n// NewLifecyclePolicyPreviewCompleteWaiter constructs a\n// LifecyclePolicyPreviewCompleteWaiter.\nfunc NewLifecyclePolicyPreviewCompleteWaiter(client GetLifecyclePolicyPreviewAPIClient, optFns ...func(*LifecyclePolicyPreviewCompleteWaiterOptions)) *LifecyclePolicyPreviewCompleteWaiter {\n\toptions := LifecyclePolicyPreviewCompleteWaiterOptions{}\n\toptions.MinDelay = 5 * time.Second\n\toptions.MaxDelay = 120 * time.Second\n\toptions.Retryable = lifecyclePolicyPreviewCompleteStateRetryable\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\treturn &LifecyclePolicyPreviewCompleteWaiter{\n\t\tclient:  client,\n\t\toptions: options,\n\t}\n}\n\n// Wait calls the waiter function for LifecyclePolicyPreviewComplete waiter. The\n// maxWaitDur is the maximum wait duration the waiter will wait. The maxWaitDur is\n// required and must be greater than zero.\nfunc (w *LifecyclePolicyPreviewCompleteWaiter) Wait(ctx context.Context, params *GetLifecyclePolicyPreviewInput, maxWaitDur time.Duration, optFns ...func(*LifecyclePolicyPreviewCompleteWaiterOptions)) error {\n\t_, err := w.WaitForOutput(ctx, params, maxWaitDur, optFns...)\n\treturn err\n}\n\n// WaitForOutput calls the waiter function for LifecyclePolicyPreviewComplete\n// waiter and returns the output of the successful operation. The maxWaitDur is the\n// maximum wait duration the waiter will wait. The maxWaitDur is required and must\n// be greater than zero.\nfunc (w *LifecyclePolicyPreviewCompleteWaiter) WaitForOutput(ctx context.Context, params *GetLifecyclePolicyPreviewInput, maxWaitDur time.Duration, optFns ...func(*LifecyclePolicyPreviewCompleteWaiterOptions)) (*GetLifecyclePolicyPreviewOutput, error) {\n\tif maxWaitDur <= 0 {\n\t\treturn nil, fmt.Errorf(\"maximum wait time for waiter must be greater than zero\")\n\t}\n\n\toptions := w.options\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tif options.MaxDelay <= 0 {\n\t\toptions.MaxDelay = 120 * time.Second\n\t}\n\n\tif options.MinDelay > options.MaxDelay {\n\t\treturn nil, fmt.Errorf(\"minimum waiter delay %v must be lesser than or equal to maximum waiter delay of %v.\", options.MinDelay, options.MaxDelay)\n\t}\n\n\tctx, cancelFn := context.WithTimeout(ctx, maxWaitDur)\n\tdefer cancelFn()\n\n\tlogger := smithywaiter.Logger{}\n\tremainingTime := maxWaitDur\n\n\tvar attempt int64\n\tfor {\n\n\t\tattempt++\n\t\tapiOptions := options.APIOptions\n\t\tstart := time.Now()\n\n\t\tif options.LogWaitAttempts {\n\t\t\tlogger.Attempt = attempt\n\t\t\tapiOptions = append([]func(*middleware.Stack) error{}, options.APIOptions...)\n\t\t\tapiOptions = append(apiOptions, logger.AddLogger)\n\t\t}\n\n\t\tout, err := w.client.GetLifecyclePolicyPreview(ctx, params, func(o *Options) {\n\t\t\tbaseOpts := []func(*Options){\n\t\t\t\taddIsWaiterUserAgent,\n\t\t\t}\n\t\t\to.APIOptions = append(o.APIOptions, apiOptions...)\n\t\t\tfor _, opt := range baseOpts {\n\t\t\t\topt(o)\n\t\t\t}\n\t\t\tfor _, opt := range options.ClientOptions {\n\t\t\t\topt(o)\n\t\t\t}\n\t\t})\n\n\t\tretryable, err := options.Retryable(ctx, params, out, err)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif !retryable {\n\t\t\treturn out, nil\n\t\t}\n\n\t\tremainingTime -= time.Since(start)\n\t\tif remainingTime < options.MinDelay || remainingTime <= 0 {\n\t\t\tbreak\n\t\t}\n\n\t\t// compute exponential backoff between waiter retries\n\t\tdelay, err := smithywaiter.ComputeDelay(\n\t\t\tattempt, options.MinDelay, options.MaxDelay, remainingTime,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error computing waiter delay, %w\", err)\n\t\t}\n\n\t\tremainingTime -= delay\n\t\t// sleep for the delay amount before invoking a request\n\t\tif err := smithytime.SleepWithContext(ctx, delay); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"request cancelled while waiting, %w\", err)\n\t\t}\n\t}\n\treturn nil, fmt.Errorf(\"exceeded max wait time for LifecyclePolicyPreviewComplete waiter\")\n}\n\nfunc lifecyclePolicyPreviewCompleteStateRetryable(ctx context.Context, input *GetLifecyclePolicyPreviewInput, output *GetLifecyclePolicyPreviewOutput, err error) (bool, error) {\n\n\tif err == nil {\n\t\tv1 := output.Status\n\t\texpectedValue := \"COMPLETE\"\n\t\tvar pathValue string\n\t\tpathValue = string(v1)\n\t\tif pathValue == expectedValue {\n\t\t\treturn false, nil\n\t\t}\n\t}\n\n\tif err == nil {\n\t\tv1 := output.Status\n\t\texpectedValue := \"FAILED\"\n\t\tvar pathValue string\n\t\tpathValue = string(v1)\n\t\tif pathValue == expectedValue {\n\t\t\treturn false, fmt.Errorf(\"waiter state transitioned to Failure\")\n\t\t}\n\t}\n\n\tif err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n\n// GetLifecyclePolicyPreviewPaginatorOptions is the paginator options for\n// GetLifecyclePolicyPreview\ntype GetLifecyclePolicyPreviewPaginatorOptions struct {\n\t// The maximum number of repository results returned by\n\t// GetLifecyclePolicyPreviewRequest in  paginated output. When this parameter is\n\t// used, GetLifecyclePolicyPreviewRequest only returns  maxResults results in a\n\t// single page along with a nextToken   response element. The remaining results of\n\t// the initial request can be seen by sending  another\n\t// GetLifecyclePolicyPreviewRequest request with the returned nextToken   value.\n\t// This value can be between 1 and 1000. If this  parameter is not used, then\n\t// GetLifecyclePolicyPreviewRequest returns up to  100 results and a nextToken\n\t// value, if  applicable. This option cannot be used when you specify images with\n\t// imageIds .\n\tLimit int32\n\n\t// Set to true if pagination should stop if the service returns a pagination token\n\t// that matches the most recent token provided to the service.\n\tStopOnDuplicateToken bool\n}\n\n// GetLifecyclePolicyPreviewPaginator is a paginator for GetLifecyclePolicyPreview\ntype GetLifecyclePolicyPreviewPaginator struct {\n\toptions   GetLifecyclePolicyPreviewPaginatorOptions\n\tclient    GetLifecyclePolicyPreviewAPIClient\n\tparams    *GetLifecyclePolicyPreviewInput\n\tnextToken *string\n\tfirstPage bool\n}\n\n// NewGetLifecyclePolicyPreviewPaginator returns a new\n// GetLifecyclePolicyPreviewPaginator\nfunc NewGetLifecyclePolicyPreviewPaginator(client GetLifecyclePolicyPreviewAPIClient, params *GetLifecyclePolicyPreviewInput, optFns ...func(*GetLifecyclePolicyPreviewPaginatorOptions)) *GetLifecyclePolicyPreviewPaginator {\n\tif params == nil {\n\t\tparams = &GetLifecyclePolicyPreviewInput{}\n\t}\n\n\toptions := GetLifecyclePolicyPreviewPaginatorOptions{}\n\tif params.MaxResults != nil {\n\t\toptions.Limit = *params.MaxResults\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &GetLifecyclePolicyPreviewPaginator{\n\t\toptions:   options,\n\t\tclient:    client,\n\t\tparams:    params,\n\t\tfirstPage: true,\n\t\tnextToken: params.NextToken,\n\t}\n}\n\n// HasMorePages returns a boolean indicating whether more pages are available\nfunc (p *GetLifecyclePolicyPreviewPaginator) HasMorePages() bool {\n\treturn p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0)\n}\n\n// NextPage retrieves the next GetLifecyclePolicyPreview page.\nfunc (p *GetLifecyclePolicyPreviewPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*GetLifecyclePolicyPreviewOutput, error) {\n\tif !p.HasMorePages() {\n\t\treturn nil, fmt.Errorf(\"no more pages available\")\n\t}\n\n\tparams := *p.params\n\tparams.NextToken = p.nextToken\n\n\tvar limit *int32\n\tif p.options.Limit > 0 {\n\t\tlimit = &p.options.Limit\n\t}\n\tparams.MaxResults = limit\n\n\toptFns = append([]func(*Options){\n\t\taddIsPaginatorUserAgent,\n\t}, optFns...)\n\tresult, err := p.client.GetLifecyclePolicyPreview(ctx, &params, optFns...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.firstPage = false\n\n\tprevToken := p.nextToken\n\tp.nextToken = result.NextToken\n\n\tif p.options.StopOnDuplicateToken &&\n\t\tprevToken != nil &&\n\t\tp.nextToken != nil &&\n\t\t*prevToken == *p.nextToken {\n\t\tp.nextToken = nil\n\t}\n\n\treturn result, nil\n}\n\n// GetLifecyclePolicyPreviewAPIClient is a client that implements the\n// GetLifecyclePolicyPreview operation.\ntype GetLifecyclePolicyPreviewAPIClient interface {\n\tGetLifecyclePolicyPreview(context.Context, *GetLifecyclePolicyPreviewInput, ...func(*Options)) (*GetLifecyclePolicyPreviewOutput, error)\n}\n\nvar _ GetLifecyclePolicyPreviewAPIClient = (*Client)(nil)\n\nfunc newServiceMetadataMiddleware_opGetLifecyclePolicyPreview(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetLifecyclePolicyPreview\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetRegistryPolicy.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Retrieves the permissions policy for a registry.\nfunc (c *Client) GetRegistryPolicy(ctx context.Context, params *GetRegistryPolicyInput, optFns ...func(*Options)) (*GetRegistryPolicyOutput, error) {\n\tif params == nil {\n\t\tparams = &GetRegistryPolicyInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetRegistryPolicy\", params, optFns, c.addOperationGetRegistryPolicyMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetRegistryPolicyOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetRegistryPolicyInput struct {\n\tnoSmithyDocumentSerde\n}\n\ntype GetRegistryPolicyOutput struct {\n\n\t// The JSON text of the permissions policy for a registry.\n\tPolicyText *string\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetRegistryPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpGetRegistryPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetRegistryPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetRegistryPolicy\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRegistryPolicy(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opGetRegistryPolicy(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetRegistryPolicy\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetRegistryScanningConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Retrieves the scanning configuration for a registry.\nfunc (c *Client) GetRegistryScanningConfiguration(ctx context.Context, params *GetRegistryScanningConfigurationInput, optFns ...func(*Options)) (*GetRegistryScanningConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &GetRegistryScanningConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetRegistryScanningConfiguration\", params, optFns, c.addOperationGetRegistryScanningConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetRegistryScanningConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetRegistryScanningConfigurationInput struct {\n\tnoSmithyDocumentSerde\n}\n\ntype GetRegistryScanningConfigurationOutput struct {\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The scanning configuration for the registry.\n\tScanningConfiguration *types.RegistryScanningConfiguration\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetRegistryScanningConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpGetRegistryScanningConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetRegistryScanningConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetRegistryScanningConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRegistryScanningConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opGetRegistryScanningConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetRegistryScanningConfiguration\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetRepositoryPolicy.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Retrieves the repository policy for the specified repository.\nfunc (c *Client) GetRepositoryPolicy(ctx context.Context, params *GetRepositoryPolicyInput, optFns ...func(*Options)) (*GetRepositoryPolicyOutput, error) {\n\tif params == nil {\n\t\tparams = &GetRepositoryPolicyInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetRepositoryPolicy\", params, optFns, c.addOperationGetRepositoryPolicyMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetRepositoryPolicyOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetRepositoryPolicyInput struct {\n\n\t// The name of the repository with the policy to retrieve.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the repository. If you do not specify a registry, the default registry is\n\t// assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype GetRepositoryPolicyOutput struct {\n\n\t// The JSON repository policy text associated with the repository.\n\tPolicyText *string\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The repository name associated with the request.\n\tRepositoryName *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetRepositoryPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpGetRepositoryPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetRepositoryPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetRepositoryPolicy\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetRepositoryPolicyValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRepositoryPolicy(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opGetRepositoryPolicy(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetRepositoryPolicy\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_InitiateLayerUpload.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Notifies Amazon ECR that you intend to upload an image layer.\n//\n// When an image is pushed, the InitiateLayerUpload API is called once per image\n// layer that has not already been uploaded. Whether or not an image layer has been\n// uploaded is determined by the BatchCheckLayerAvailability API action.\n//\n// This operation is used by the Amazon ECR proxy and is not generally used by\n// customers for pulling and pushing images. In most cases, you should use the\n// docker CLI to pull, tag, and push images.\nfunc (c *Client) InitiateLayerUpload(ctx context.Context, params *InitiateLayerUploadInput, optFns ...func(*Options)) (*InitiateLayerUploadOutput, error) {\n\tif params == nil {\n\t\tparams = &InitiateLayerUploadInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"InitiateLayerUpload\", params, optFns, c.addOperationInitiateLayerUploadMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*InitiateLayerUploadOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype InitiateLayerUploadInput struct {\n\n\t// The name of the repository to which you intend to upload layers.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID associated with the registry to which you\n\t// intend to upload layers. If you do not specify a registry, the default registry\n\t// is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype InitiateLayerUploadOutput struct {\n\n\t// The size, in bytes, that Amazon ECR expects future layer part uploads to be.\n\tPartSize *int64\n\n\t// The upload ID for the layer upload. This parameter is passed to further UploadLayerPart and CompleteLayerUpload\n\t// operations.\n\tUploadId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationInitiateLayerUploadMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpInitiateLayerUpload{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpInitiateLayerUpload{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"InitiateLayerUpload\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpInitiateLayerUploadValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opInitiateLayerUpload(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opInitiateLayerUpload(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"InitiateLayerUpload\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_ListImages.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Lists all the image IDs for the specified repository.\n//\n// You can filter images based on whether or not they are tagged by using the\n// tagStatus filter and specifying either TAGGED , UNTAGGED or ANY . For example,\n// you can filter your results to return only UNTAGGED images and then pipe that\n// result to a BatchDeleteImageoperation to delete them. Or, you can filter your results to return\n// only TAGGED images to list all of the tags in your repository.\nfunc (c *Client) ListImages(ctx context.Context, params *ListImagesInput, optFns ...func(*Options)) (*ListImagesOutput, error) {\n\tif params == nil {\n\t\tparams = &ListImagesInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"ListImages\", params, optFns, c.addOperationListImagesMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*ListImagesOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype ListImagesInput struct {\n\n\t// The repository with image IDs to be listed.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The filter key and value with which to filter your ListImages results.\n\tFilter *types.ListImagesFilter\n\n\t// The maximum number of image results returned by ListImages in paginated output.\n\t// When this parameter is used, ListImages only returns maxResults results in a\n\t// single page along with a nextToken response element. The remaining results of\n\t// the initial request can be seen by sending another ListImages request with the\n\t// returned nextToken value. This value can be between 1 and 1000. If this\n\t// parameter is not used, then ListImages returns up to 100 results and a nextToken\n\t// value, if applicable.\n\tMaxResults *int32\n\n\t// The nextToken value returned from a previous paginated ListImages request where\n\t// maxResults was used and the results exceeded the value of that parameter.\n\t// Pagination continues from the end of the previous results that returned the\n\t// nextToken value. This value is null when there are no more results to return.\n\t//\n\t// This token should be treated as an opaque identifier that is only used to\n\t// retrieve the next items in a list and not for other programmatic purposes.\n\tNextToken *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the repository in which to list images. If you do not specify a registry, the\n\t// default registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype ListImagesOutput struct {\n\n\t// The list of image IDs for the requested repository.\n\tImageIds []types.ImageIdentifier\n\n\t// The nextToken value to include in a future ListImages request. When the results\n\t// of a ListImages request exceed maxResults , this value can be used to retrieve\n\t// the next page of results. This value is null when there are no more results to\n\t// return.\n\tNextToken *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationListImagesMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpListImages{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpListImages{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"ListImages\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpListImagesValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opListImages(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// ListImagesPaginatorOptions is the paginator options for ListImages\ntype ListImagesPaginatorOptions struct {\n\t// The maximum number of image results returned by ListImages in paginated output.\n\t// When this parameter is used, ListImages only returns maxResults results in a\n\t// single page along with a nextToken response element. The remaining results of\n\t// the initial request can be seen by sending another ListImages request with the\n\t// returned nextToken value. This value can be between 1 and 1000. If this\n\t// parameter is not used, then ListImages returns up to 100 results and a nextToken\n\t// value, if applicable.\n\tLimit int32\n\n\t// Set to true if pagination should stop if the service returns a pagination token\n\t// that matches the most recent token provided to the service.\n\tStopOnDuplicateToken bool\n}\n\n// ListImagesPaginator is a paginator for ListImages\ntype ListImagesPaginator struct {\n\toptions   ListImagesPaginatorOptions\n\tclient    ListImagesAPIClient\n\tparams    *ListImagesInput\n\tnextToken *string\n\tfirstPage bool\n}\n\n// NewListImagesPaginator returns a new ListImagesPaginator\nfunc NewListImagesPaginator(client ListImagesAPIClient, params *ListImagesInput, optFns ...func(*ListImagesPaginatorOptions)) *ListImagesPaginator {\n\tif params == nil {\n\t\tparams = &ListImagesInput{}\n\t}\n\n\toptions := ListImagesPaginatorOptions{}\n\tif params.MaxResults != nil {\n\t\toptions.Limit = *params.MaxResults\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &ListImagesPaginator{\n\t\toptions:   options,\n\t\tclient:    client,\n\t\tparams:    params,\n\t\tfirstPage: true,\n\t\tnextToken: params.NextToken,\n\t}\n}\n\n// HasMorePages returns a boolean indicating whether more pages are available\nfunc (p *ListImagesPaginator) HasMorePages() bool {\n\treturn p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0)\n}\n\n// NextPage retrieves the next ListImages page.\nfunc (p *ListImagesPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*ListImagesOutput, error) {\n\tif !p.HasMorePages() {\n\t\treturn nil, fmt.Errorf(\"no more pages available\")\n\t}\n\n\tparams := *p.params\n\tparams.NextToken = p.nextToken\n\n\tvar limit *int32\n\tif p.options.Limit > 0 {\n\t\tlimit = &p.options.Limit\n\t}\n\tparams.MaxResults = limit\n\n\toptFns = append([]func(*Options){\n\t\taddIsPaginatorUserAgent,\n\t}, optFns...)\n\tresult, err := p.client.ListImages(ctx, &params, optFns...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.firstPage = false\n\n\tprevToken := p.nextToken\n\tp.nextToken = result.NextToken\n\n\tif p.options.StopOnDuplicateToken &&\n\t\tprevToken != nil &&\n\t\tp.nextToken != nil &&\n\t\t*prevToken == *p.nextToken {\n\t\tp.nextToken = nil\n\t}\n\n\treturn result, nil\n}\n\n// ListImagesAPIClient is a client that implements the ListImages operation.\ntype ListImagesAPIClient interface {\n\tListImages(context.Context, *ListImagesInput, ...func(*Options)) (*ListImagesOutput, error)\n}\n\nvar _ ListImagesAPIClient = (*Client)(nil)\n\nfunc newServiceMetadataMiddleware_opListImages(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"ListImages\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_ListTagsForResource.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// List the tags for an Amazon ECR resource.\nfunc (c *Client) ListTagsForResource(ctx context.Context, params *ListTagsForResourceInput, optFns ...func(*Options)) (*ListTagsForResourceOutput, error) {\n\tif params == nil {\n\t\tparams = &ListTagsForResourceInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"ListTagsForResource\", params, optFns, c.addOperationListTagsForResourceMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*ListTagsForResourceOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype ListTagsForResourceInput struct {\n\n\t// The Amazon Resource Name (ARN) that identifies the resource for which to list\n\t// the tags. Currently, the only supported resource is an Amazon ECR repository.\n\t//\n\t// This member is required.\n\tResourceArn *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype ListTagsForResourceOutput struct {\n\n\t// The tags for the resource.\n\tTags []types.Tag\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationListTagsForResourceMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpListTagsForResource{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpListTagsForResource{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"ListTagsForResource\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpListTagsForResourceValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opListTagsForResource(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opListTagsForResource(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"ListTagsForResource\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutAccountSetting.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Allows you to change the basic scan type version or registry policy scope.\nfunc (c *Client) PutAccountSetting(ctx context.Context, params *PutAccountSettingInput, optFns ...func(*Options)) (*PutAccountSettingOutput, error) {\n\tif params == nil {\n\t\tparams = &PutAccountSettingInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutAccountSetting\", params, optFns, c.addOperationPutAccountSettingMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutAccountSettingOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutAccountSettingInput struct {\n\n\t// The name of the account setting, such as BASIC_SCAN_TYPE_VERSION or\n\t// REGISTRY_POLICY_SCOPE .\n\t//\n\t// This member is required.\n\tName *string\n\n\t// Setting value that is specified. The following are valid values for the basic\n\t// scan type being used: AWS_NATIVE or CLAIR . The following are valid values for\n\t// the registry policy scope being used: V1 or V2 .\n\t//\n\t// This member is required.\n\tValue *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype PutAccountSettingOutput struct {\n\n\t// Retrieves the name of the account setting.\n\tName *string\n\n\t// Retrieves the value of the specified account setting.\n\tValue *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutAccountSettingMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpPutAccountSetting{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutAccountSetting{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutAccountSetting\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutAccountSettingValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutAccountSetting(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opPutAccountSetting(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutAccountSetting\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutImage.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Creates or updates the image manifest and tags associated with an image.\n//\n// When an image is pushed and all new image layers have been uploaded, the\n// PutImage API is called once to create or update the image manifest and the tags\n// associated with the image.\n//\n// This operation is used by the Amazon ECR proxy and is not generally used by\n// customers for pulling and pushing images. In most cases, you should use the\n// docker CLI to pull, tag, and push images.\nfunc (c *Client) PutImage(ctx context.Context, params *PutImageInput, optFns ...func(*Options)) (*PutImageOutput, error) {\n\tif params == nil {\n\t\tparams = &PutImageInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutImage\", params, optFns, c.addOperationPutImageMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutImageOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutImageInput struct {\n\n\t// The image manifest corresponding to the image to be uploaded.\n\t//\n\t// This member is required.\n\tImageManifest *string\n\n\t// The name of the repository in which to put the image.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The image digest of the image manifest corresponding to the image.\n\tImageDigest *string\n\n\t// The media type of the image manifest. If you push an image manifest that does\n\t// not contain the mediaType field, you must specify the imageManifestMediaType in\n\t// the request.\n\tImageManifestMediaType *string\n\n\t// The tag to associate with the image. This parameter is required for images that\n\t// use the Docker Image Manifest V2 Schema 2 or Open Container Initiative (OCI)\n\t// formats.\n\tImageTag *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the repository in which to put the image. If you do not specify a registry, the\n\t// default registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype PutImageOutput struct {\n\n\t// Details of the image uploaded.\n\tImage *types.Image\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutImageMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpPutImage{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutImage{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutImage\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutImageValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutImage(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opPutImage(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutImage\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutImageScanningConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// The PutImageScanningConfiguration API is being deprecated, in favor of\n// specifying the image scanning configuration at the registry level. For more\n// information, see PutRegistryScanningConfiguration.\n//\n// Updates the image scanning configuration for the specified repository.\nfunc (c *Client) PutImageScanningConfiguration(ctx context.Context, params *PutImageScanningConfigurationInput, optFns ...func(*Options)) (*PutImageScanningConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &PutImageScanningConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutImageScanningConfiguration\", params, optFns, c.addOperationPutImageScanningConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutImageScanningConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutImageScanningConfigurationInput struct {\n\n\t// The image scanning configuration for the repository. This setting determines\n\t// whether images are scanned for known vulnerabilities after being pushed to the\n\t// repository.\n\t//\n\t// This member is required.\n\tImageScanningConfiguration *types.ImageScanningConfiguration\n\n\t// The name of the repository in which to update the image scanning configuration\n\t// setting.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the repository in which to update the image scanning configuration setting. If\n\t// you do not specify a registry, the default registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype PutImageScanningConfigurationOutput struct {\n\n\t// The image scanning configuration setting for the repository.\n\tImageScanningConfiguration *types.ImageScanningConfiguration\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The repository name associated with the request.\n\tRepositoryName *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutImageScanningConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpPutImageScanningConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutImageScanningConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutImageScanningConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutImageScanningConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutImageScanningConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opPutImageScanningConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutImageScanningConfiguration\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutImageTagMutability.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Updates the image tag mutability settings for the specified repository. For\n// more information, see [Image tag mutability]in the Amazon Elastic Container Registry User Guide.\n//\n// [Image tag mutability]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-tag-mutability.html\nfunc (c *Client) PutImageTagMutability(ctx context.Context, params *PutImageTagMutabilityInput, optFns ...func(*Options)) (*PutImageTagMutabilityOutput, error) {\n\tif params == nil {\n\t\tparams = &PutImageTagMutabilityInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutImageTagMutability\", params, optFns, c.addOperationPutImageTagMutabilityMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutImageTagMutabilityOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutImageTagMutabilityInput struct {\n\n\t// The tag mutability setting for the repository. If MUTABLE is specified, image\n\t// tags can be overwritten. If IMMUTABLE is specified, all image tags within the\n\t// repository will be immutable which will prevent them from being overwritten.\n\t//\n\t// This member is required.\n\tImageTagMutability types.ImageTagMutability\n\n\t// The name of the repository in which to update the image tag mutability settings.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the repository in which to update the image tag mutability settings. If you do\n\t// not specify a registry, the default registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype PutImageTagMutabilityOutput struct {\n\n\t// The image tag mutability setting for the repository.\n\tImageTagMutability types.ImageTagMutability\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The repository name associated with the request.\n\tRepositoryName *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutImageTagMutabilityMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpPutImageTagMutability{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutImageTagMutability{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutImageTagMutability\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutImageTagMutabilityValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutImageTagMutability(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opPutImageTagMutability(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutImageTagMutability\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutLifecyclePolicy.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Creates or updates the lifecycle policy for the specified repository. For more\n// information, see [Lifecycle policy template].\n//\n// [Lifecycle policy template]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/LifecyclePolicies.html\nfunc (c *Client) PutLifecyclePolicy(ctx context.Context, params *PutLifecyclePolicyInput, optFns ...func(*Options)) (*PutLifecyclePolicyOutput, error) {\n\tif params == nil {\n\t\tparams = &PutLifecyclePolicyInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutLifecyclePolicy\", params, optFns, c.addOperationPutLifecyclePolicyMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutLifecyclePolicyOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutLifecyclePolicyInput struct {\n\n\t// The JSON repository policy text to apply to the repository.\n\t//\n\t// This member is required.\n\tLifecyclePolicyText *string\n\n\t// The name of the repository to receive the policy.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the repository. If you do  not specify a registry, the default registry is\n\t// assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype PutLifecyclePolicyOutput struct {\n\n\t// The JSON repository policy text.\n\tLifecyclePolicyText *string\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The repository name associated with the request.\n\tRepositoryName *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutLifecyclePolicyMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpPutLifecyclePolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutLifecyclePolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutLifecyclePolicy\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutLifecyclePolicyValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutLifecyclePolicy(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opPutLifecyclePolicy(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutLifecyclePolicy\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutRegistryPolicy.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Creates or updates the permissions policy for your registry.\n//\n// A registry policy is used to specify permissions for another Amazon Web\n// Services account and is used when configuring cross-account replication. For\n// more information, see [Registry permissions]in the Amazon Elastic Container Registry User Guide.\n//\n// [Registry permissions]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry-permissions.html\nfunc (c *Client) PutRegistryPolicy(ctx context.Context, params *PutRegistryPolicyInput, optFns ...func(*Options)) (*PutRegistryPolicyOutput, error) {\n\tif params == nil {\n\t\tparams = &PutRegistryPolicyInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutRegistryPolicy\", params, optFns, c.addOperationPutRegistryPolicyMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutRegistryPolicyOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutRegistryPolicyInput struct {\n\n\t// The JSON policy text to apply to your registry. The policy text follows the\n\t// same format as IAM policy text. For more information, see [Registry permissions]in the Amazon Elastic\n\t// Container Registry User Guide.\n\t//\n\t// [Registry permissions]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry-permissions.html\n\t//\n\t// This member is required.\n\tPolicyText *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype PutRegistryPolicyOutput struct {\n\n\t// The JSON policy text for your registry.\n\tPolicyText *string\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutRegistryPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpPutRegistryPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutRegistryPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutRegistryPolicy\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutRegistryPolicyValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutRegistryPolicy(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opPutRegistryPolicy(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutRegistryPolicy\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutRegistryScanningConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Creates or updates the scanning configuration for your private registry.\nfunc (c *Client) PutRegistryScanningConfiguration(ctx context.Context, params *PutRegistryScanningConfigurationInput, optFns ...func(*Options)) (*PutRegistryScanningConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &PutRegistryScanningConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutRegistryScanningConfiguration\", params, optFns, c.addOperationPutRegistryScanningConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutRegistryScanningConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutRegistryScanningConfigurationInput struct {\n\n\t// The scanning rules to use for the registry. A scanning rule is used to\n\t// determine which repository filters are used and at what frequency scanning will\n\t// occur.\n\tRules []types.RegistryScanningRule\n\n\t// The scanning type to set for the registry.\n\t//\n\t// When a registry scanning configuration is not defined, by default the BASIC\n\t// scan type is used. When basic scanning is used, you may specify filters to\n\t// determine which individual repositories, or all repositories, are scanned when\n\t// new images are pushed to those repositories. Alternatively, you can do manual\n\t// scans of images with basic scanning.\n\t//\n\t// When the ENHANCED scan type is set, Amazon Inspector provides automated\n\t// vulnerability scanning. You may choose between continuous scanning or scan on\n\t// push and you may specify filters to determine which individual repositories, or\n\t// all repositories, are scanned.\n\tScanType types.ScanType\n\n\tnoSmithyDocumentSerde\n}\n\ntype PutRegistryScanningConfigurationOutput struct {\n\n\t// The scanning configuration for your registry.\n\tRegistryScanningConfiguration *types.RegistryScanningConfiguration\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutRegistryScanningConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpPutRegistryScanningConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutRegistryScanningConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutRegistryScanningConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutRegistryScanningConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutRegistryScanningConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opPutRegistryScanningConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutRegistryScanningConfiguration\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutReplicationConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Creates or updates the replication configuration for a registry. The existing\n// replication configuration for a repository can be retrieved with the DescribeRegistryAPI\n// action. The first time the PutReplicationConfiguration API is called, a\n// service-linked IAM role is created in your account for the replication process.\n// For more information, see [Using service-linked roles for Amazon ECR]in the Amazon Elastic Container Registry User Guide.\n// For more information on the custom role for replication, see [Creating an IAM role for replication].\n//\n// When configuring cross-account replication, the destination account must grant\n// the source account permission to replicate. This permission is controlled using\n// a registry permissions policy. For more information, see PutRegistryPolicy.\n//\n// [Creating an IAM role for replication]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/replication-creation-templates.html#roles-creatingrole-user-console\n// [Using service-linked roles for Amazon ECR]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/using-service-linked-roles.html\nfunc (c *Client) PutReplicationConfiguration(ctx context.Context, params *PutReplicationConfigurationInput, optFns ...func(*Options)) (*PutReplicationConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &PutReplicationConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutReplicationConfiguration\", params, optFns, c.addOperationPutReplicationConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutReplicationConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutReplicationConfigurationInput struct {\n\n\t// An object representing the replication configuration for a registry.\n\t//\n\t// This member is required.\n\tReplicationConfiguration *types.ReplicationConfiguration\n\n\tnoSmithyDocumentSerde\n}\n\ntype PutReplicationConfigurationOutput struct {\n\n\t// The contents of the replication configuration for the registry.\n\tReplicationConfiguration *types.ReplicationConfiguration\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutReplicationConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpPutReplicationConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutReplicationConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutReplicationConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutReplicationConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutReplicationConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opPutReplicationConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutReplicationConfiguration\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_SetRepositoryPolicy.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Applies a repository policy to the specified repository to control access\n// permissions. For more information, see [Amazon ECR Repository policies]in the Amazon Elastic Container Registry\n// User Guide.\n//\n// [Amazon ECR Repository policies]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policies.html\nfunc (c *Client) SetRepositoryPolicy(ctx context.Context, params *SetRepositoryPolicyInput, optFns ...func(*Options)) (*SetRepositoryPolicyOutput, error) {\n\tif params == nil {\n\t\tparams = &SetRepositoryPolicyInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"SetRepositoryPolicy\", params, optFns, c.addOperationSetRepositoryPolicyMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*SetRepositoryPolicyOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype SetRepositoryPolicyInput struct {\n\n\t// The JSON repository policy text to apply to the repository. For more\n\t// information, see [Amazon ECR repository policies]in the Amazon Elastic Container Registry User Guide.\n\t//\n\t// [Amazon ECR repository policies]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html\n\t//\n\t// This member is required.\n\tPolicyText *string\n\n\t// The name of the repository to receive the policy.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// If the policy you are attempting to set on a repository policy would prevent\n\t// you from setting another policy in the future, you must force the SetRepositoryPolicyoperation.\n\t// This is intended to prevent accidental repository lock outs.\n\tForce bool\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the repository. If you do not specify a registry, the default registry is\n\t// assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype SetRepositoryPolicyOutput struct {\n\n\t// The JSON repository policy text applied to the repository.\n\tPolicyText *string\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The repository name associated with the request.\n\tRepositoryName *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationSetRepositoryPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpSetRepositoryPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpSetRepositoryPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"SetRepositoryPolicy\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpSetRepositoryPolicyValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opSetRepositoryPolicy(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opSetRepositoryPolicy(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"SetRepositoryPolicy\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_StartImageScan.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Starts a basic image vulnerability scan.\n//\n// A basic image scan can only be started once per 24 hours on an individual\n// image. This limit includes if an image was scanned on initial push. You can\n// start up to 100,000 basic scans per 24 hours. This limit includes both scans on\n// initial push and scans initiated by the StartImageScan API. For more\n// information, see [Basic scanning]in the Amazon Elastic Container Registry User Guide.\n//\n// [Basic scanning]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-scanning-basic.html\nfunc (c *Client) StartImageScan(ctx context.Context, params *StartImageScanInput, optFns ...func(*Options)) (*StartImageScanOutput, error) {\n\tif params == nil {\n\t\tparams = &StartImageScanInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"StartImageScan\", params, optFns, c.addOperationStartImageScanMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*StartImageScanOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype StartImageScanInput struct {\n\n\t// An object with identifying information for an image in an Amazon ECR repository.\n\t//\n\t// This member is required.\n\tImageId *types.ImageIdentifier\n\n\t// The name of the repository that contains the images to scan.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the repository in which to start an image scan request. If you do not specify a\n\t// registry, the default registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype StartImageScanOutput struct {\n\n\t// An object with identifying information for an image in an Amazon ECR repository.\n\tImageId *types.ImageIdentifier\n\n\t// The current state of the scan.\n\tImageScanStatus *types.ImageScanStatus\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The repository name associated with the request.\n\tRepositoryName *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationStartImageScanMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpStartImageScan{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpStartImageScan{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"StartImageScan\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpStartImageScanValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opStartImageScan(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opStartImageScan(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"StartImageScan\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_StartLifecyclePolicyPreview.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Starts a preview of a lifecycle policy for the specified repository. This\n// allows you to see the results before associating the lifecycle policy with the\n// repository.\nfunc (c *Client) StartLifecyclePolicyPreview(ctx context.Context, params *StartLifecyclePolicyPreviewInput, optFns ...func(*Options)) (*StartLifecyclePolicyPreviewOutput, error) {\n\tif params == nil {\n\t\tparams = &StartLifecyclePolicyPreviewInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"StartLifecyclePolicyPreview\", params, optFns, c.addOperationStartLifecyclePolicyPreviewMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*StartLifecyclePolicyPreviewOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype StartLifecyclePolicyPreviewInput struct {\n\n\t// The name of the repository to be evaluated.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The policy to be evaluated against. If you do not specify a policy, the current\n\t// policy for the repository is used.\n\tLifecyclePolicyText *string\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the repository. If you do not specify a registry, the default registry is\n\t// assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype StartLifecyclePolicyPreviewOutput struct {\n\n\t// The JSON repository policy text.\n\tLifecyclePolicyText *string\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The repository name associated with the request.\n\tRepositoryName *string\n\n\t// The status of the lifecycle policy preview request.\n\tStatus types.LifecyclePolicyPreviewStatus\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationStartLifecyclePolicyPreviewMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpStartLifecyclePolicyPreview{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpStartLifecyclePolicyPreview{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"StartLifecyclePolicyPreview\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpStartLifecyclePolicyPreviewValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opStartLifecyclePolicyPreview(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opStartLifecyclePolicyPreview(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"StartLifecyclePolicyPreview\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_TagResource.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Adds specified tags to a resource with the specified ARN. Existing tags on a\n// resource are not changed if they are not specified in the request parameters.\nfunc (c *Client) TagResource(ctx context.Context, params *TagResourceInput, optFns ...func(*Options)) (*TagResourceOutput, error) {\n\tif params == nil {\n\t\tparams = &TagResourceInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"TagResource\", params, optFns, c.addOperationTagResourceMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*TagResourceOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype TagResourceInput struct {\n\n\t// The Amazon Resource Name (ARN) of the the resource to which to add tags.\n\t// Currently, the only supported resource is an Amazon ECR repository.\n\t//\n\t// This member is required.\n\tResourceArn *string\n\n\t// The tags to add to the resource. A tag is an array of key-value pairs. Tag keys\n\t// can have a maximum character length of 128 characters, and tag values can have a\n\t// maximum length of 256 characters.\n\t//\n\t// This member is required.\n\tTags []types.Tag\n\n\tnoSmithyDocumentSerde\n}\n\ntype TagResourceOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationTagResourceMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpTagResource{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpTagResource{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"TagResource\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpTagResourceValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opTagResource(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opTagResource(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"TagResource\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_UntagResource.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Deletes specified tags from a resource.\nfunc (c *Client) UntagResource(ctx context.Context, params *UntagResourceInput, optFns ...func(*Options)) (*UntagResourceOutput, error) {\n\tif params == nil {\n\t\tparams = &UntagResourceInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"UntagResource\", params, optFns, c.addOperationUntagResourceMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*UntagResourceOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype UntagResourceInput struct {\n\n\t// The Amazon Resource Name (ARN) of the resource from which to remove tags.\n\t// Currently, the only supported resource is an Amazon ECR repository.\n\t//\n\t// This member is required.\n\tResourceArn *string\n\n\t// The keys of the tags to be removed.\n\t//\n\t// This member is required.\n\tTagKeys []string\n\n\tnoSmithyDocumentSerde\n}\n\ntype UntagResourceOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationUntagResourceMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpUntagResource{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpUntagResource{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"UntagResource\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpUntagResourceValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opUntagResource(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opUntagResource(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"UntagResource\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_UpdatePullThroughCacheRule.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"time\"\n)\n\n// Updates an existing pull through cache rule.\nfunc (c *Client) UpdatePullThroughCacheRule(ctx context.Context, params *UpdatePullThroughCacheRuleInput, optFns ...func(*Options)) (*UpdatePullThroughCacheRuleOutput, error) {\n\tif params == nil {\n\t\tparams = &UpdatePullThroughCacheRuleInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"UpdatePullThroughCacheRule\", params, optFns, c.addOperationUpdatePullThroughCacheRuleMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*UpdatePullThroughCacheRuleOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype UpdatePullThroughCacheRuleInput struct {\n\n\t// The repository name prefix to use when caching images from the source registry.\n\t//\n\t// This member is required.\n\tEcrRepositoryPrefix *string\n\n\t// The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager\n\t// secret that identifies the credentials to authenticate to the upstream registry.\n\tCredentialArn *string\n\n\t// Amazon Resource Name (ARN) of the IAM role to be assumed by Amazon ECR to\n\t// authenticate to the ECR upstream registry. This role must be in the same account\n\t// as the registry that you are configuring.\n\tCustomRoleArn *string\n\n\t// The Amazon Web Services account ID associated with the registry associated with\n\t// the pull through cache rule. If you do not specify a registry, the default\n\t// registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype UpdatePullThroughCacheRuleOutput struct {\n\n\t// The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager\n\t// secret associated with the pull through cache rule.\n\tCredentialArn *string\n\n\t// The ARN of the IAM role associated with the pull through cache rule.\n\tCustomRoleArn *string\n\n\t// The Amazon ECR repository prefix associated with the pull through cache rule.\n\tEcrRepositoryPrefix *string\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The date and time, in JavaScript date format, when the pull through cache rule\n\t// was updated.\n\tUpdatedAt *time.Time\n\n\t// The upstream repository prefix associated with the pull through cache rule.\n\tUpstreamRepositoryPrefix *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationUpdatePullThroughCacheRuleMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpUpdatePullThroughCacheRule{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpUpdatePullThroughCacheRule{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"UpdatePullThroughCacheRule\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpUpdatePullThroughCacheRuleValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opUpdatePullThroughCacheRule(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opUpdatePullThroughCacheRule(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"UpdatePullThroughCacheRule\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_UpdateRepositoryCreationTemplate.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Updates an existing repository creation template.\nfunc (c *Client) UpdateRepositoryCreationTemplate(ctx context.Context, params *UpdateRepositoryCreationTemplateInput, optFns ...func(*Options)) (*UpdateRepositoryCreationTemplateOutput, error) {\n\tif params == nil {\n\t\tparams = &UpdateRepositoryCreationTemplateInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"UpdateRepositoryCreationTemplate\", params, optFns, c.addOperationUpdateRepositoryCreationTemplateMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*UpdateRepositoryCreationTemplateOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype UpdateRepositoryCreationTemplateInput struct {\n\n\t// The repository namespace prefix that matches an existing repository creation\n\t// template in the registry. All repositories created using this namespace prefix\n\t// will have the settings defined in this template applied. For example, a prefix\n\t// of prod would apply to all repositories beginning with prod/ . This includes a\n\t// repository named prod/team1 as well as a repository named prod/repository1 .\n\t//\n\t// To apply a template to all repositories in your registry that don't have an\n\t// associated creation template, you can use ROOT as the prefix.\n\t//\n\t// This member is required.\n\tPrefix *string\n\n\t// Updates the list of enumerable strings representing the Amazon ECR repository\n\t// creation scenarios that this template will apply towards. The two supported\n\t// scenarios are PULL_THROUGH_CACHE and REPLICATION\n\tAppliedFor []types.RCTAppliedFor\n\n\t// The ARN of the role to be assumed by Amazon ECR. This role must be in the same\n\t// account as the registry that you are configuring. Amazon ECR will assume your\n\t// supplied role when the customRoleArn is specified. When this field isn't\n\t// specified, Amazon ECR will use the service-linked role for the repository\n\t// creation template.\n\tCustomRoleArn *string\n\n\t// A description for the repository creation template.\n\tDescription *string\n\n\t// The encryption configuration to associate with the repository creation template.\n\tEncryptionConfiguration *types.EncryptionConfigurationForRepositoryCreationTemplate\n\n\t// Updates the tag mutability setting for the repository. If this parameter is\n\t// omitted, the default setting of MUTABLE will be used which will allow image\n\t// tags to be overwritten. If IMMUTABLE is specified, all image tags within the\n\t// repository will be immutable which will prevent them from being overwritten.\n\tImageTagMutability types.ImageTagMutability\n\n\t// Updates the lifecycle policy associated with the specified repository creation\n\t// template.\n\tLifecyclePolicy *string\n\n\t// Updates the repository policy created using the template. A repository policy\n\t// is a permissions policy associated with a repository to control access\n\t// permissions.\n\tRepositoryPolicy *string\n\n\t// The metadata to apply to the repository to help you categorize and organize.\n\t// Each tag consists of a key and an optional value, both of which you define. Tag\n\t// keys can have a maximum character length of 128 characters, and tag values can\n\t// have a maximum length of 256 characters.\n\tResourceTags []types.Tag\n\n\tnoSmithyDocumentSerde\n}\n\ntype UpdateRepositoryCreationTemplateOutput struct {\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The details of the repository creation template associated with the request.\n\tRepositoryCreationTemplate *types.RepositoryCreationTemplate\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationUpdateRepositoryCreationTemplateMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpUpdateRepositoryCreationTemplate{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpUpdateRepositoryCreationTemplate{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"UpdateRepositoryCreationTemplate\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpUpdateRepositoryCreationTemplateValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opUpdateRepositoryCreationTemplate(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opUpdateRepositoryCreationTemplate(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"UpdateRepositoryCreationTemplate\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_UploadLayerPart.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Uploads an image layer part to Amazon ECR.\n//\n// When an image is pushed, each new image layer is uploaded in parts. The maximum\n// size of each image layer part can be 20971520 bytes (or about 20MB). The\n// UploadLayerPart API is called once per each new image layer part.\n//\n// This operation is used by the Amazon ECR proxy and is not generally used by\n// customers for pulling and pushing images. In most cases, you should use the\n// docker CLI to pull, tag, and push images.\nfunc (c *Client) UploadLayerPart(ctx context.Context, params *UploadLayerPartInput, optFns ...func(*Options)) (*UploadLayerPartOutput, error) {\n\tif params == nil {\n\t\tparams = &UploadLayerPartInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"UploadLayerPart\", params, optFns, c.addOperationUploadLayerPartMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*UploadLayerPartOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype UploadLayerPartInput struct {\n\n\t// The base64-encoded layer part payload.\n\t//\n\t// This member is required.\n\tLayerPartBlob []byte\n\n\t// The position of the first byte of the layer part witin the overall image layer.\n\t//\n\t// This member is required.\n\tPartFirstByte *int64\n\n\t// The position of the last byte of the layer part within the overall image layer.\n\t//\n\t// This member is required.\n\tPartLastByte *int64\n\n\t// The name of the repository to which you are uploading layer parts.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The upload ID from a previous InitiateLayerUpload operation to associate with the layer part\n\t// upload.\n\t//\n\t// This member is required.\n\tUploadId *string\n\n\t// The Amazon Web Services account ID associated with the registry to which you\n\t// are uploading layer parts. If you do not specify a registry, the default\n\t// registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype UploadLayerPartOutput struct {\n\n\t// The integer value of the last byte received in the request.\n\tLastByteReceived *int64\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The repository name associated with the request.\n\tRepositoryName *string\n\n\t// The upload ID associated with the request.\n\tUploadId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationUploadLayerPartMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpUploadLayerPart{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpUploadLayerPart{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"UploadLayerPart\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpUploadLayerPartValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opUploadLayerPart(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opUploadLayerPart(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"UploadLayerPart\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_ValidatePullThroughCacheRule.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Validates an existing pull through cache rule for an upstream registry that\n// requires authentication. This will retrieve the contents of the Amazon Web\n// Services Secrets Manager secret, verify the syntax, and then validate that\n// authentication to the upstream registry is successful.\nfunc (c *Client) ValidatePullThroughCacheRule(ctx context.Context, params *ValidatePullThroughCacheRuleInput, optFns ...func(*Options)) (*ValidatePullThroughCacheRuleOutput, error) {\n\tif params == nil {\n\t\tparams = &ValidatePullThroughCacheRuleInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"ValidatePullThroughCacheRule\", params, optFns, c.addOperationValidatePullThroughCacheRuleMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*ValidatePullThroughCacheRuleOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype ValidatePullThroughCacheRuleInput struct {\n\n\t// The repository name prefix associated with the pull through cache rule.\n\t//\n\t// This member is required.\n\tEcrRepositoryPrefix *string\n\n\t// The registry ID associated with the pull through cache rule. If you do not\n\t// specify a registry, the default registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype ValidatePullThroughCacheRuleOutput struct {\n\n\t// The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager\n\t// secret associated with the pull through cache rule.\n\tCredentialArn *string\n\n\t// The ARN of the IAM role associated with the pull through cache rule.\n\tCustomRoleArn *string\n\n\t// The Amazon ECR repository prefix associated with the pull through cache rule.\n\tEcrRepositoryPrefix *string\n\n\t// The reason the validation failed. For more details about possible causes and\n\t// how to address them, see [Using pull through cache rules]in the Amazon Elastic Container Registry User Guide.\n\t//\n\t// [Using pull through cache rules]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/pull-through-cache.html\n\tFailure *string\n\n\t// Whether or not the pull through cache rule was validated. If true , Amazon ECR\n\t// was able to reach the upstream registry and authentication was successful. If\n\t// false , there was an issue and validation failed. The failure reason indicates\n\t// the cause.\n\tIsValid bool\n\n\t// The registry ID associated with the request.\n\tRegistryId *string\n\n\t// The upstream registry URL associated with the pull through cache rule.\n\tUpstreamRegistryUrl *string\n\n\t// The upstream repository prefix associated with the pull through cache rule.\n\tUpstreamRepositoryPrefix *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationValidatePullThroughCacheRuleMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpValidatePullThroughCacheRule{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpValidatePullThroughCacheRule{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"ValidatePullThroughCacheRule\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpValidatePullThroughCacheRuleValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opValidatePullThroughCacheRule(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opValidatePullThroughCacheRule(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"ValidatePullThroughCacheRule\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/auth.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\tsmithy \"github.com/aws/smithy-go\"\n\tsmithyauth \"github.com/aws/smithy-go/auth\"\n\t\"github.com/aws/smithy-go/metrics\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nfunc bindAuthParamsRegion(_ interface{}, params *AuthResolverParameters, _ interface{}, options Options) {\n\tparams.Region = options.Region\n}\n\ntype setLegacyContextSigningOptionsMiddleware struct {\n}\n\nfunc (*setLegacyContextSigningOptionsMiddleware) ID() string {\n\treturn \"setLegacyContextSigningOptions\"\n}\n\nfunc (m *setLegacyContextSigningOptionsMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\trscheme := getResolvedAuthScheme(ctx)\n\tschemeID := rscheme.Scheme.SchemeID()\n\n\tif sn := awsmiddleware.GetSigningName(ctx); sn != \"\" {\n\t\tif schemeID == \"aws.auth#sigv4\" {\n\t\t\tsmithyhttp.SetSigV4SigningName(&rscheme.SignerProperties, sn)\n\t\t} else if schemeID == \"aws.auth#sigv4a\" {\n\t\t\tsmithyhttp.SetSigV4ASigningName(&rscheme.SignerProperties, sn)\n\t\t}\n\t}\n\n\tif sr := awsmiddleware.GetSigningRegion(ctx); sr != \"\" {\n\t\tif schemeID == \"aws.auth#sigv4\" {\n\t\t\tsmithyhttp.SetSigV4SigningRegion(&rscheme.SignerProperties, sr)\n\t\t} else if schemeID == \"aws.auth#sigv4a\" {\n\t\t\tsmithyhttp.SetSigV4ASigningRegions(&rscheme.SignerProperties, []string{sr})\n\t\t}\n\t}\n\n\treturn next.HandleFinalize(ctx, in)\n}\n\nfunc addSetLegacyContextSigningOptionsMiddleware(stack *middleware.Stack) error {\n\treturn stack.Finalize.Insert(&setLegacyContextSigningOptionsMiddleware{}, \"Signing\", middleware.Before)\n}\n\ntype withAnonymous struct {\n\tresolver AuthSchemeResolver\n}\n\nvar _ AuthSchemeResolver = (*withAnonymous)(nil)\n\nfunc (v *withAnonymous) ResolveAuthSchemes(ctx context.Context, params *AuthResolverParameters) ([]*smithyauth.Option, error) {\n\topts, err := v.resolver.ResolveAuthSchemes(ctx, params)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\topts = append(opts, &smithyauth.Option{\n\t\tSchemeID: smithyauth.SchemeIDAnonymous,\n\t})\n\treturn opts, nil\n}\n\nfunc wrapWithAnonymousAuth(options *Options) {\n\tif _, ok := options.AuthSchemeResolver.(*defaultAuthSchemeResolver); !ok {\n\t\treturn\n\t}\n\n\toptions.AuthSchemeResolver = &withAnonymous{\n\t\tresolver: options.AuthSchemeResolver,\n\t}\n}\n\n// AuthResolverParameters contains the set of inputs necessary for auth scheme\n// resolution.\ntype AuthResolverParameters struct {\n\t// The name of the operation being invoked.\n\tOperation string\n\n\t// The region in which the operation is being invoked.\n\tRegion string\n}\n\nfunc bindAuthResolverParams(ctx context.Context, operation string, input interface{}, options Options) *AuthResolverParameters {\n\tparams := &AuthResolverParameters{\n\t\tOperation: operation,\n\t}\n\n\tbindAuthParamsRegion(ctx, params, input, options)\n\n\treturn params\n}\n\n// AuthSchemeResolver returns a set of possible authentication options for an\n// operation.\ntype AuthSchemeResolver interface {\n\tResolveAuthSchemes(context.Context, *AuthResolverParameters) ([]*smithyauth.Option, error)\n}\n\ntype defaultAuthSchemeResolver struct{}\n\nvar _ AuthSchemeResolver = (*defaultAuthSchemeResolver)(nil)\n\nfunc (*defaultAuthSchemeResolver) ResolveAuthSchemes(ctx context.Context, params *AuthResolverParameters) ([]*smithyauth.Option, error) {\n\tif overrides, ok := operationAuthOptions[params.Operation]; ok {\n\t\treturn overrides(params), nil\n\t}\n\treturn serviceAuthOptions(params), nil\n}\n\nvar operationAuthOptions = map[string]func(*AuthResolverParameters) []*smithyauth.Option{}\n\nfunc serviceAuthOptions(params *AuthResolverParameters) []*smithyauth.Option {\n\treturn []*smithyauth.Option{\n\t\t{\n\t\t\tSchemeID: smithyauth.SchemeIDSigV4,\n\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\tvar props smithy.Properties\n\t\t\t\tsmithyhttp.SetSigV4SigningName(&props, \"ecr\")\n\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&props, params.Region)\n\t\t\t\treturn props\n\t\t\t}(),\n\t\t},\n\t}\n}\n\ntype resolveAuthSchemeMiddleware struct {\n\toperation string\n\toptions   Options\n}\n\nfunc (*resolveAuthSchemeMiddleware) ID() string {\n\treturn \"ResolveAuthScheme\"\n}\n\nfunc (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"ResolveAuthScheme\")\n\tdefer span.End()\n\n\tparams := bindAuthResolverParams(ctx, m.operation, getOperationInput(ctx), m.options)\n\toptions, err := m.options.AuthSchemeResolver.ResolveAuthSchemes(ctx, params)\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"resolve auth scheme: %w\", err)\n\t}\n\n\tscheme, ok := m.selectScheme(options)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"could not select an auth scheme\")\n\t}\n\n\tctx = setResolvedAuthScheme(ctx, scheme)\n\n\tspan.SetProperty(\"auth.scheme_id\", scheme.Scheme.SchemeID())\n\tspan.End()\n\treturn next.HandleFinalize(ctx, in)\n}\n\nfunc (m *resolveAuthSchemeMiddleware) selectScheme(options []*smithyauth.Option) (*resolvedAuthScheme, bool) {\n\tfor _, option := range options {\n\t\tif option.SchemeID == smithyauth.SchemeIDAnonymous {\n\t\t\treturn newResolvedAuthScheme(smithyhttp.NewAnonymousScheme(), option), true\n\t\t}\n\n\t\tfor _, scheme := range m.options.AuthSchemes {\n\t\t\tif scheme.SchemeID() != option.SchemeID {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif scheme.IdentityResolver(m.options) != nil {\n\t\t\t\treturn newResolvedAuthScheme(scheme, option), true\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil, false\n}\n\ntype resolvedAuthSchemeKey struct{}\n\ntype resolvedAuthScheme struct {\n\tScheme             smithyhttp.AuthScheme\n\tIdentityProperties smithy.Properties\n\tSignerProperties   smithy.Properties\n}\n\nfunc newResolvedAuthScheme(scheme smithyhttp.AuthScheme, option *smithyauth.Option) *resolvedAuthScheme {\n\treturn &resolvedAuthScheme{\n\t\tScheme:             scheme,\n\t\tIdentityProperties: option.IdentityProperties,\n\t\tSignerProperties:   option.SignerProperties,\n\t}\n}\n\nfunc setResolvedAuthScheme(ctx context.Context, scheme *resolvedAuthScheme) context.Context {\n\treturn middleware.WithStackValue(ctx, resolvedAuthSchemeKey{}, scheme)\n}\n\nfunc getResolvedAuthScheme(ctx context.Context) *resolvedAuthScheme {\n\tv, _ := middleware.GetStackValue(ctx, resolvedAuthSchemeKey{}).(*resolvedAuthScheme)\n\treturn v\n}\n\ntype getIdentityMiddleware struct {\n\toptions Options\n}\n\nfunc (*getIdentityMiddleware) ID() string {\n\treturn \"GetIdentity\"\n}\n\nfunc (m *getIdentityMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\tinnerCtx, span := tracing.StartSpan(ctx, \"GetIdentity\")\n\tdefer span.End()\n\n\trscheme := getResolvedAuthScheme(innerCtx)\n\tif rscheme == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no resolved auth scheme\")\n\t}\n\n\tresolver := rscheme.Scheme.IdentityResolver(m.options)\n\tif resolver == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no identity resolver\")\n\t}\n\n\tidentity, err := timeOperationMetric(ctx, \"client.call.resolve_identity_duration\",\n\t\tfunc() (smithyauth.Identity, error) {\n\t\t\treturn resolver.GetIdentity(innerCtx, rscheme.IdentityProperties)\n\t\t},\n\t\tfunc(o *metrics.RecordMetricOptions) {\n\t\t\to.Properties.Set(\"auth.scheme_id\", rscheme.Scheme.SchemeID())\n\t\t})\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"get identity: %w\", err)\n\t}\n\n\tctx = setIdentity(ctx, identity)\n\n\tspan.End()\n\treturn next.HandleFinalize(ctx, in)\n}\n\ntype identityKey struct{}\n\nfunc setIdentity(ctx context.Context, identity smithyauth.Identity) context.Context {\n\treturn middleware.WithStackValue(ctx, identityKey{}, identity)\n}\n\nfunc getIdentity(ctx context.Context) smithyauth.Identity {\n\tv, _ := middleware.GetStackValue(ctx, identityKey{}).(smithyauth.Identity)\n\treturn v\n}\n\ntype signRequestMiddleware struct {\n\toptions Options\n}\n\nfunc (*signRequestMiddleware) ID() string {\n\treturn \"Signing\"\n}\n\nfunc (m *signRequestMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"SignRequest\")\n\tdefer span.End()\n\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unexpected transport type %T\", in.Request)\n\t}\n\n\trscheme := getResolvedAuthScheme(ctx)\n\tif rscheme == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no resolved auth scheme\")\n\t}\n\n\tidentity := getIdentity(ctx)\n\tif identity == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no identity\")\n\t}\n\n\tsigner := rscheme.Scheme.Signer()\n\tif signer == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no signer\")\n\t}\n\n\t_, err = timeOperationMetric(ctx, \"client.call.signing_duration\", func() (any, error) {\n\t\treturn nil, signer.SignRequest(ctx, req, identity, rscheme.SignerProperties)\n\t}, func(o *metrics.RecordMetricOptions) {\n\t\to.Properties.Set(\"auth.scheme_id\", rscheme.Scheme.SchemeID())\n\t})\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"sign request: %w\", err)\n\t}\n\n\tspan.End()\n\treturn next.HandleFinalize(ctx, in)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/deserializers.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/protocol/restjson\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\tsmithy \"github.com/aws/smithy-go\"\n\tsmithyio \"github.com/aws/smithy-go/io\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithytime \"github.com/aws/smithy-go/time\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"io\"\n\t\"math\"\n\t\"strings\"\n\t\"time\"\n)\n\nfunc deserializeS3Expires(v string) (*time.Time, error) {\n\tt, err := smithytime.ParseHTTPDate(v)\n\tif err != nil {\n\t\treturn nil, nil\n\t}\n\treturn &t, nil\n}\n\ntype awsAwsjson11_deserializeOpBatchCheckLayerAvailability struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpBatchCheckLayerAvailability) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpBatchCheckLayerAvailability) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorBatchCheckLayerAvailability(response, &metadata)\n\t}\n\toutput := &BatchCheckLayerAvailabilityOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentBatchCheckLayerAvailabilityOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorBatchCheckLayerAvailability(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpBatchDeleteImage struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpBatchDeleteImage) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpBatchDeleteImage) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorBatchDeleteImage(response, &metadata)\n\t}\n\toutput := &BatchDeleteImageOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentBatchDeleteImageOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorBatchDeleteImage(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpBatchGetImage struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpBatchGetImage) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpBatchGetImage) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorBatchGetImage(response, &metadata)\n\t}\n\toutput := &BatchGetImageOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentBatchGetImageOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorBatchGetImage(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"LimitExceededException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnableToGetUpstreamImageException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnableToGetUpstreamImageException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpBatchGetRepositoryScanningConfiguration struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpBatchGetRepositoryScanningConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpBatchGetRepositoryScanningConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorBatchGetRepositoryScanningConfiguration(response, &metadata)\n\t}\n\toutput := &BatchGetRepositoryScanningConfigurationOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentBatchGetRepositoryScanningConfigurationOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorBatchGetRepositoryScanningConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpCompleteLayerUpload struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpCompleteLayerUpload) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpCompleteLayerUpload) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorCompleteLayerUpload(response, &metadata)\n\t}\n\toutput := &CompleteLayerUploadOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentCompleteLayerUploadOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorCompleteLayerUpload(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"EmptyUploadException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorEmptyUploadException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidLayerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidLayerException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"KmsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorKmsException(response, errorBody)\n\n\tcase strings.EqualFold(\"LayerAlreadyExistsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLayerAlreadyExistsException(response, errorBody)\n\n\tcase strings.EqualFold(\"LayerPartTooSmallException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLayerPartTooSmallException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UploadNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUploadNotFoundException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpCreatePullThroughCacheRule struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpCreatePullThroughCacheRule) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpCreatePullThroughCacheRule) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorCreatePullThroughCacheRule(response, &metadata)\n\t}\n\toutput := &CreatePullThroughCacheRuleOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentCreatePullThroughCacheRuleOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorCreatePullThroughCacheRule(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"LimitExceededException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody)\n\n\tcase strings.EqualFold(\"PullThroughCacheRuleAlreadyExistsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorPullThroughCacheRuleAlreadyExistsException(response, errorBody)\n\n\tcase strings.EqualFold(\"SecretNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorSecretNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnableToAccessSecretException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnableToAccessSecretException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnableToDecryptSecretValueException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnableToDecryptSecretValueException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedUpstreamRegistryException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedUpstreamRegistryException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpCreateRepository struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpCreateRepository) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpCreateRepository) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorCreateRepository(response, &metadata)\n\t}\n\toutput := &CreateRepositoryOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentCreateRepositoryOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorCreateRepository(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidTagParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidTagParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"KmsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorKmsException(response, errorBody)\n\n\tcase strings.EqualFold(\"LimitExceededException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryAlreadyExistsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryAlreadyExistsException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"TooManyTagsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorTooManyTagsException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpCreateRepositoryCreationTemplate struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpCreateRepositoryCreationTemplate) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpCreateRepositoryCreationTemplate) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorCreateRepositoryCreationTemplate(response, &metadata)\n\t}\n\toutput := &CreateRepositoryCreationTemplateOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentCreateRepositoryCreationTemplateOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorCreateRepositoryCreationTemplate(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"LimitExceededException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"TemplateAlreadyExistsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorTemplateAlreadyExistsException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDeleteLifecyclePolicy struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDeleteLifecyclePolicy) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDeleteLifecyclePolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDeleteLifecyclePolicy(response, &metadata)\n\t}\n\toutput := &DeleteLifecyclePolicyOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDeleteLifecyclePolicyOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDeleteLifecyclePolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"LifecyclePolicyNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLifecyclePolicyNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDeletePullThroughCacheRule struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDeletePullThroughCacheRule) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDeletePullThroughCacheRule) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDeletePullThroughCacheRule(response, &metadata)\n\t}\n\toutput := &DeletePullThroughCacheRuleOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDeletePullThroughCacheRuleOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDeletePullThroughCacheRule(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"PullThroughCacheRuleNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorPullThroughCacheRuleNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDeleteRegistryPolicy struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDeleteRegistryPolicy) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDeleteRegistryPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDeleteRegistryPolicy(response, &metadata)\n\t}\n\toutput := &DeleteRegistryPolicyOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDeleteRegistryPolicyOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDeleteRegistryPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RegistryPolicyNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRegistryPolicyNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDeleteRepository struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDeleteRepository) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDeleteRepository) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDeleteRepository(response, &metadata)\n\t}\n\toutput := &DeleteRepositoryOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDeleteRepositoryOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDeleteRepository(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"KmsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorKmsException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotEmptyException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotEmptyException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDeleteRepositoryCreationTemplate struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDeleteRepositoryCreationTemplate) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDeleteRepositoryCreationTemplate) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDeleteRepositoryCreationTemplate(response, &metadata)\n\t}\n\toutput := &DeleteRepositoryCreationTemplateOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDeleteRepositoryCreationTemplateOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDeleteRepositoryCreationTemplate(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"TemplateNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorTemplateNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDeleteRepositoryPolicy struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDeleteRepositoryPolicy) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDeleteRepositoryPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDeleteRepositoryPolicy(response, &metadata)\n\t}\n\toutput := &DeleteRepositoryPolicyOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDeleteRepositoryPolicyOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDeleteRepositoryPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryPolicyNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryPolicyNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDescribeImageReplicationStatus struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDescribeImageReplicationStatus) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDescribeImageReplicationStatus) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDescribeImageReplicationStatus(response, &metadata)\n\t}\n\toutput := &DescribeImageReplicationStatusOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDescribeImageReplicationStatusOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDescribeImageReplicationStatus(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"ImageNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorImageNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDescribeImages struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDescribeImages) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDescribeImages) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDescribeImages(response, &metadata)\n\t}\n\toutput := &DescribeImagesOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDescribeImagesOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDescribeImages(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"ImageNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorImageNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDescribeImageScanFindings struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDescribeImageScanFindings) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDescribeImageScanFindings) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDescribeImageScanFindings(response, &metadata)\n\t}\n\toutput := &DescribeImageScanFindingsOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDescribeImageScanFindingsOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDescribeImageScanFindings(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"ImageNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorImageNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ScanNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorScanNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDescribePullThroughCacheRules struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDescribePullThroughCacheRules) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDescribePullThroughCacheRules) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDescribePullThroughCacheRules(response, &metadata)\n\t}\n\toutput := &DescribePullThroughCacheRulesOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDescribePullThroughCacheRulesOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDescribePullThroughCacheRules(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"PullThroughCacheRuleNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorPullThroughCacheRuleNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDescribeRegistry struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDescribeRegistry) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDescribeRegistry) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDescribeRegistry(response, &metadata)\n\t}\n\toutput := &DescribeRegistryOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDescribeRegistryOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDescribeRegistry(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDescribeRepositories struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDescribeRepositories) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDescribeRepositories) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDescribeRepositories(response, &metadata)\n\t}\n\toutput := &DescribeRepositoriesOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDescribeRepositoriesOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDescribeRepositories(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDescribeRepositoryCreationTemplates struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDescribeRepositoryCreationTemplates) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDescribeRepositoryCreationTemplates) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDescribeRepositoryCreationTemplates(response, &metadata)\n\t}\n\toutput := &DescribeRepositoryCreationTemplatesOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDescribeRepositoryCreationTemplatesOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDescribeRepositoryCreationTemplates(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpGetAccountSetting struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpGetAccountSetting) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpGetAccountSetting) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorGetAccountSetting(response, &metadata)\n\t}\n\toutput := &GetAccountSettingOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentGetAccountSettingOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorGetAccountSetting(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpGetAuthorizationToken struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpGetAuthorizationToken) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpGetAuthorizationToken) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorGetAuthorizationToken(response, &metadata)\n\t}\n\toutput := &GetAuthorizationTokenOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentGetAuthorizationTokenOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorGetAuthorizationToken(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpGetDownloadUrlForLayer struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpGetDownloadUrlForLayer) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpGetDownloadUrlForLayer) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorGetDownloadUrlForLayer(response, &metadata)\n\t}\n\toutput := &GetDownloadUrlForLayerOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentGetDownloadUrlForLayerOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorGetDownloadUrlForLayer(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"LayerInaccessibleException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLayerInaccessibleException(response, errorBody)\n\n\tcase strings.EqualFold(\"LayersNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLayersNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnableToGetUpstreamLayerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnableToGetUpstreamLayerException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpGetLifecyclePolicy struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpGetLifecyclePolicy) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpGetLifecyclePolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorGetLifecyclePolicy(response, &metadata)\n\t}\n\toutput := &GetLifecyclePolicyOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentGetLifecyclePolicyOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorGetLifecyclePolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"LifecyclePolicyNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLifecyclePolicyNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpGetLifecyclePolicyPreview struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpGetLifecyclePolicyPreview) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpGetLifecyclePolicyPreview) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorGetLifecyclePolicyPreview(response, &metadata)\n\t}\n\toutput := &GetLifecyclePolicyPreviewOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentGetLifecyclePolicyPreviewOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorGetLifecyclePolicyPreview(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"LifecyclePolicyPreviewNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLifecyclePolicyPreviewNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpGetRegistryPolicy struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpGetRegistryPolicy) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpGetRegistryPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorGetRegistryPolicy(response, &metadata)\n\t}\n\toutput := &GetRegistryPolicyOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentGetRegistryPolicyOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorGetRegistryPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RegistryPolicyNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRegistryPolicyNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpGetRegistryScanningConfiguration struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpGetRegistryScanningConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpGetRegistryScanningConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorGetRegistryScanningConfiguration(response, &metadata)\n\t}\n\toutput := &GetRegistryScanningConfigurationOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentGetRegistryScanningConfigurationOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorGetRegistryScanningConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpGetRepositoryPolicy struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpGetRepositoryPolicy) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpGetRepositoryPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorGetRepositoryPolicy(response, &metadata)\n\t}\n\toutput := &GetRepositoryPolicyOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentGetRepositoryPolicyOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorGetRepositoryPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryPolicyNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryPolicyNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpInitiateLayerUpload struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpInitiateLayerUpload) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpInitiateLayerUpload) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorInitiateLayerUpload(response, &metadata)\n\t}\n\toutput := &InitiateLayerUploadOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentInitiateLayerUploadOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorInitiateLayerUpload(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"KmsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorKmsException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpListImages struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpListImages) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpListImages) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorListImages(response, &metadata)\n\t}\n\toutput := &ListImagesOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentListImagesOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorListImages(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpListTagsForResource struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpListTagsForResource) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpListTagsForResource) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorListTagsForResource(response, &metadata)\n\t}\n\toutput := &ListTagsForResourceOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentListTagsForResourceOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorListTagsForResource(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpPutAccountSetting struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpPutAccountSetting) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpPutAccountSetting) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorPutAccountSetting(response, &metadata)\n\t}\n\toutput := &PutAccountSettingOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentPutAccountSettingOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorPutAccountSetting(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"LimitExceededException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpPutImage struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpPutImage) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpPutImage) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorPutImage(response, &metadata)\n\t}\n\toutput := &PutImageOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentPutImageOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorPutImage(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"ImageAlreadyExistsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorImageAlreadyExistsException(response, errorBody)\n\n\tcase strings.EqualFold(\"ImageDigestDoesNotMatchException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorImageDigestDoesNotMatchException(response, errorBody)\n\n\tcase strings.EqualFold(\"ImageTagAlreadyExistsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorImageTagAlreadyExistsException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"KmsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorKmsException(response, errorBody)\n\n\tcase strings.EqualFold(\"LayersNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLayersNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"LimitExceededException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody)\n\n\tcase strings.EqualFold(\"ReferencedImagesNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorReferencedImagesNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpPutImageScanningConfiguration struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpPutImageScanningConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpPutImageScanningConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorPutImageScanningConfiguration(response, &metadata)\n\t}\n\toutput := &PutImageScanningConfigurationOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentPutImageScanningConfigurationOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorPutImageScanningConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpPutImageTagMutability struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpPutImageTagMutability) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpPutImageTagMutability) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorPutImageTagMutability(response, &metadata)\n\t}\n\toutput := &PutImageTagMutabilityOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentPutImageTagMutabilityOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorPutImageTagMutability(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpPutLifecyclePolicy struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpPutLifecyclePolicy) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpPutLifecyclePolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorPutLifecyclePolicy(response, &metadata)\n\t}\n\toutput := &PutLifecyclePolicyOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentPutLifecyclePolicyOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorPutLifecyclePolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpPutRegistryPolicy struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpPutRegistryPolicy) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpPutRegistryPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorPutRegistryPolicy(response, &metadata)\n\t}\n\toutput := &PutRegistryPolicyOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentPutRegistryPolicyOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorPutRegistryPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpPutRegistryScanningConfiguration struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpPutRegistryScanningConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpPutRegistryScanningConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorPutRegistryScanningConfiguration(response, &metadata)\n\t}\n\toutput := &PutRegistryScanningConfigurationOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentPutRegistryScanningConfigurationOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorPutRegistryScanningConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpPutReplicationConfiguration struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpPutReplicationConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpPutReplicationConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorPutReplicationConfiguration(response, &metadata)\n\t}\n\toutput := &PutReplicationConfigurationOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentPutReplicationConfigurationOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorPutReplicationConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpSetRepositoryPolicy struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpSetRepositoryPolicy) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpSetRepositoryPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorSetRepositoryPolicy(response, &metadata)\n\t}\n\toutput := &SetRepositoryPolicyOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentSetRepositoryPolicyOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorSetRepositoryPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpStartImageScan struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpStartImageScan) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpStartImageScan) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorStartImageScan(response, &metadata)\n\t}\n\toutput := &StartImageScanOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentStartImageScanOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorStartImageScan(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"ImageNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorImageNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"LimitExceededException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedImageTypeException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedImageTypeException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpStartLifecyclePolicyPreview struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpStartLifecyclePolicyPreview) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpStartLifecyclePolicyPreview) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorStartLifecyclePolicyPreview(response, &metadata)\n\t}\n\toutput := &StartLifecyclePolicyPreviewOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentStartLifecyclePolicyPreviewOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorStartLifecyclePolicyPreview(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"LifecyclePolicyNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLifecyclePolicyNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"LifecyclePolicyPreviewInProgressException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLifecyclePolicyPreviewInProgressException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpTagResource struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpTagResource) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpTagResource) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorTagResource(response, &metadata)\n\t}\n\toutput := &TagResourceOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentTagResourceOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorTagResource(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidTagParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidTagParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"TooManyTagsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorTooManyTagsException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpUntagResource struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpUntagResource) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpUntagResource) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorUntagResource(response, &metadata)\n\t}\n\toutput := &UntagResourceOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentUntagResourceOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorUntagResource(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidTagParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidTagParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"TooManyTagsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorTooManyTagsException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpUpdatePullThroughCacheRule struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpUpdatePullThroughCacheRule) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpUpdatePullThroughCacheRule) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorUpdatePullThroughCacheRule(response, &metadata)\n\t}\n\toutput := &UpdatePullThroughCacheRuleOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentUpdatePullThroughCacheRuleOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorUpdatePullThroughCacheRule(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"PullThroughCacheRuleNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorPullThroughCacheRuleNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"SecretNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorSecretNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnableToAccessSecretException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnableToAccessSecretException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnableToDecryptSecretValueException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnableToDecryptSecretValueException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpUpdateRepositoryCreationTemplate struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpUpdateRepositoryCreationTemplate) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpUpdateRepositoryCreationTemplate) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorUpdateRepositoryCreationTemplate(response, &metadata)\n\t}\n\toutput := &UpdateRepositoryCreationTemplateOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentUpdateRepositoryCreationTemplateOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorUpdateRepositoryCreationTemplate(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"TemplateNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorTemplateNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpUploadLayerPart struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpUploadLayerPart) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpUploadLayerPart) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorUploadLayerPart(response, &metadata)\n\t}\n\toutput := &UploadLayerPartOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentUploadLayerPartOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorUploadLayerPart(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidLayerPartException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidLayerPartException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"KmsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorKmsException(response, errorBody)\n\n\tcase strings.EqualFold(\"LimitExceededException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UploadNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUploadNotFoundException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpValidatePullThroughCacheRule struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpValidatePullThroughCacheRule) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpValidatePullThroughCacheRule) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorValidatePullThroughCacheRule(response, &metadata)\n\t}\n\toutput := &ValidatePullThroughCacheRuleOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentValidatePullThroughCacheRuleOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorValidatePullThroughCacheRule(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"PullThroughCacheRuleNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorPullThroughCacheRuleNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"ValidationException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorValidationException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsAwsjson11_deserializeErrorEmptyUploadException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.EmptyUploadException{}\n\terr := awsAwsjson11_deserializeDocumentEmptyUploadException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorImageAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.ImageAlreadyExistsException{}\n\terr := awsAwsjson11_deserializeDocumentImageAlreadyExistsException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorImageDigestDoesNotMatchException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.ImageDigestDoesNotMatchException{}\n\terr := awsAwsjson11_deserializeDocumentImageDigestDoesNotMatchException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorImageNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.ImageNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentImageNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorImageTagAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.ImageTagAlreadyExistsException{}\n\terr := awsAwsjson11_deserializeDocumentImageTagAlreadyExistsException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorInvalidLayerException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.InvalidLayerException{}\n\terr := awsAwsjson11_deserializeDocumentInvalidLayerException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorInvalidLayerPartException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.InvalidLayerPartException{}\n\terr := awsAwsjson11_deserializeDocumentInvalidLayerPartException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorInvalidParameterException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.InvalidParameterException{}\n\terr := awsAwsjson11_deserializeDocumentInvalidParameterException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorInvalidTagParameterException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.InvalidTagParameterException{}\n\terr := awsAwsjson11_deserializeDocumentInvalidTagParameterException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorKmsException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.KmsException{}\n\terr := awsAwsjson11_deserializeDocumentKmsException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorLayerAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.LayerAlreadyExistsException{}\n\terr := awsAwsjson11_deserializeDocumentLayerAlreadyExistsException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorLayerInaccessibleException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.LayerInaccessibleException{}\n\terr := awsAwsjson11_deserializeDocumentLayerInaccessibleException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorLayerPartTooSmallException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.LayerPartTooSmallException{}\n\terr := awsAwsjson11_deserializeDocumentLayerPartTooSmallException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorLayersNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.LayersNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentLayersNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorLifecyclePolicyNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.LifecyclePolicyNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentLifecyclePolicyNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorLifecyclePolicyPreviewInProgressException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.LifecyclePolicyPreviewInProgressException{}\n\terr := awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewInProgressException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorLifecyclePolicyPreviewNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.LifecyclePolicyPreviewNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorLimitExceededException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.LimitExceededException{}\n\terr := awsAwsjson11_deserializeDocumentLimitExceededException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorPullThroughCacheRuleAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.PullThroughCacheRuleAlreadyExistsException{}\n\terr := awsAwsjson11_deserializeDocumentPullThroughCacheRuleAlreadyExistsException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorPullThroughCacheRuleNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.PullThroughCacheRuleNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentPullThroughCacheRuleNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorReferencedImagesNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.ReferencedImagesNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentReferencedImagesNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorRegistryPolicyNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.RegistryPolicyNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentRegistryPolicyNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorRepositoryAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.RepositoryAlreadyExistsException{}\n\terr := awsAwsjson11_deserializeDocumentRepositoryAlreadyExistsException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorRepositoryNotEmptyException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.RepositoryNotEmptyException{}\n\terr := awsAwsjson11_deserializeDocumentRepositoryNotEmptyException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorRepositoryNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.RepositoryNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentRepositoryNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorRepositoryPolicyNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.RepositoryPolicyNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentRepositoryPolicyNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorScanNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.ScanNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentScanNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorSecretNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.SecretNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentSecretNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorServerException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.ServerException{}\n\terr := awsAwsjson11_deserializeDocumentServerException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorTemplateAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.TemplateAlreadyExistsException{}\n\terr := awsAwsjson11_deserializeDocumentTemplateAlreadyExistsException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorTemplateNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.TemplateNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentTemplateNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorTooManyTagsException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.TooManyTagsException{}\n\terr := awsAwsjson11_deserializeDocumentTooManyTagsException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorUnableToAccessSecretException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.UnableToAccessSecretException{}\n\terr := awsAwsjson11_deserializeDocumentUnableToAccessSecretException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorUnableToDecryptSecretValueException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.UnableToDecryptSecretValueException{}\n\terr := awsAwsjson11_deserializeDocumentUnableToDecryptSecretValueException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorUnableToGetUpstreamImageException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.UnableToGetUpstreamImageException{}\n\terr := awsAwsjson11_deserializeDocumentUnableToGetUpstreamImageException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorUnableToGetUpstreamLayerException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.UnableToGetUpstreamLayerException{}\n\terr := awsAwsjson11_deserializeDocumentUnableToGetUpstreamLayerException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorUnsupportedImageTypeException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.UnsupportedImageTypeException{}\n\terr := awsAwsjson11_deserializeDocumentUnsupportedImageTypeException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorUnsupportedUpstreamRegistryException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.UnsupportedUpstreamRegistryException{}\n\terr := awsAwsjson11_deserializeDocumentUnsupportedUpstreamRegistryException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorUploadNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.UploadNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentUploadNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorValidationException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.ValidationException{}\n\terr := awsAwsjson11_deserializeDocumentValidationException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeDocumentAttribute(v **types.Attribute, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.Attribute\n\tif *v == nil {\n\t\tsv = &types.Attribute{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"key\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected AttributeKey to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Key = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"value\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected AttributeValue to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Value = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentAttributeList(v *[]types.Attribute, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.Attribute\n\tif *v == nil {\n\t\tcv = []types.Attribute{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.Attribute\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentAttribute(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentAuthorizationData(v **types.AuthorizationData, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.AuthorizationData\n\tif *v == nil {\n\t\tsv = &types.AuthorizationData{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"authorizationToken\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Base64 to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.AuthorizationToken = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"expiresAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.ExpiresAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected ExpirationTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"proxyEndpoint\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ProxyEndpoint to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ProxyEndpoint = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentAuthorizationDataList(v *[]types.AuthorizationData, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.AuthorizationData\n\tif *v == nil {\n\t\tcv = []types.AuthorizationData{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.AuthorizationData\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentAuthorizationData(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentAwsEcrContainerImageDetails(v **types.AwsEcrContainerImageDetails, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.AwsEcrContainerImageDetails\n\tif *v == nil {\n\t\tsv = &types.AwsEcrContainerImageDetails{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"architecture\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Arch to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Architecture = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"author\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Author to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Author = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"imageHash\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageDigest to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageHash = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"imageTags\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageTagsList(&sv.ImageTags, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"platform\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Platform to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Platform = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"pushedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.PushedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected Date to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"registry\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Registry = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentCvssScore(v **types.CvssScore, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.CvssScore\n\tif *v == nil {\n\t\tsv = &types.CvssScore{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"baseScore\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.BaseScore = f64\n\n\t\t\t\tcase string:\n\t\t\t\t\tvar f64 float64\n\t\t\t\t\tswitch {\n\t\t\t\t\tcase strings.EqualFold(jtv, \"NaN\"):\n\t\t\t\t\t\tf64 = math.NaN()\n\n\t\t\t\t\tcase strings.EqualFold(jtv, \"Infinity\"):\n\t\t\t\t\t\tf64 = math.Inf(1)\n\n\t\t\t\t\tcase strings.EqualFold(jtv, \"-Infinity\"):\n\t\t\t\t\t\tf64 = math.Inf(-1)\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn fmt.Errorf(\"unknown JSON number value: %s\", jtv)\n\n\t\t\t\t\t}\n\t\t\t\t\tsv.BaseScore = f64\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected BaseScore to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"scoringVector\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ScoringVector to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ScoringVector = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"source\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Source to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Source = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"version\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Version to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Version = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentCvssScoreAdjustment(v **types.CvssScoreAdjustment, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.CvssScoreAdjustment\n\tif *v == nil {\n\t\tsv = &types.CvssScoreAdjustment{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"metric\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Metric to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Metric = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"reason\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Reason to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Reason = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentCvssScoreAdjustmentList(v *[]types.CvssScoreAdjustment, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.CvssScoreAdjustment\n\tif *v == nil {\n\t\tcv = []types.CvssScoreAdjustment{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.CvssScoreAdjustment\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentCvssScoreAdjustment(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentCvssScoreDetails(v **types.CvssScoreDetails, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.CvssScoreDetails\n\tif *v == nil {\n\t\tsv = &types.CvssScoreDetails{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"adjustments\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentCvssScoreAdjustmentList(&sv.Adjustments, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"score\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.Score = f64\n\n\t\t\t\tcase string:\n\t\t\t\t\tvar f64 float64\n\t\t\t\t\tswitch {\n\t\t\t\t\tcase strings.EqualFold(jtv, \"NaN\"):\n\t\t\t\t\t\tf64 = math.NaN()\n\n\t\t\t\t\tcase strings.EqualFold(jtv, \"Infinity\"):\n\t\t\t\t\t\tf64 = math.Inf(1)\n\n\t\t\t\t\tcase strings.EqualFold(jtv, \"-Infinity\"):\n\t\t\t\t\t\tf64 = math.Inf(-1)\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn fmt.Errorf(\"unknown JSON number value: %s\", jtv)\n\n\t\t\t\t\t}\n\t\t\t\t\tsv.Score = f64\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected Score to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"scoreSource\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Source to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ScoreSource = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"scoringVector\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ScoringVector to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ScoringVector = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"version\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Version to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Version = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentCvssScoreList(v *[]types.CvssScore, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.CvssScore\n\tif *v == nil {\n\t\tcv = []types.CvssScore{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.CvssScore\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentCvssScore(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentEmptyUploadException(v **types.EmptyUploadException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.EmptyUploadException\n\tif *v == nil {\n\t\tsv = &types.EmptyUploadException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentEncryptionConfiguration(v **types.EncryptionConfiguration, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.EncryptionConfiguration\n\tif *v == nil {\n\t\tsv = &types.EncryptionConfiguration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"encryptionType\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected EncryptionType to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.EncryptionType = types.EncryptionType(jtv)\n\t\t\t}\n\n\t\tcase \"kmsKey\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected KmsKey to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.KmsKey = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentEncryptionConfigurationForRepositoryCreationTemplate(v **types.EncryptionConfigurationForRepositoryCreationTemplate, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.EncryptionConfigurationForRepositoryCreationTemplate\n\tif *v == nil {\n\t\tsv = &types.EncryptionConfigurationForRepositoryCreationTemplate{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"encryptionType\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected EncryptionType to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.EncryptionType = types.EncryptionType(jtv)\n\t\t\t}\n\n\t\tcase \"kmsKey\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected KmsKeyForRepositoryCreationTemplate to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.KmsKey = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentEnhancedImageScanFinding(v **types.EnhancedImageScanFinding, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.EnhancedImageScanFinding\n\tif *v == nil {\n\t\tsv = &types.EnhancedImageScanFinding{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"awsAccountId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.AwsAccountId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"description\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected FindingDescription to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Description = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"exploitAvailable\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExploitAvailable to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ExploitAvailable = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"findingArn\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected FindingArn to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.FindingArn = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"firstObservedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.FirstObservedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected Date to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"fixAvailable\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected FixAvailable to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.FixAvailable = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"lastObservedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.LastObservedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected Date to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"packageVulnerabilityDetails\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentPackageVulnerabilityDetails(&sv.PackageVulnerabilityDetails, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"remediation\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRemediation(&sv.Remediation, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"resources\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentResourceList(&sv.Resources, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"score\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.Score = f64\n\n\t\t\t\tcase string:\n\t\t\t\t\tvar f64 float64\n\t\t\t\t\tswitch {\n\t\t\t\t\tcase strings.EqualFold(jtv, \"NaN\"):\n\t\t\t\t\t\tf64 = math.NaN()\n\n\t\t\t\t\tcase strings.EqualFold(jtv, \"Infinity\"):\n\t\t\t\t\t\tf64 = math.Inf(1)\n\n\t\t\t\t\tcase strings.EqualFold(jtv, \"-Infinity\"):\n\t\t\t\t\t\tf64 = math.Inf(-1)\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn fmt.Errorf(\"unknown JSON number value: %s\", jtv)\n\n\t\t\t\t\t}\n\t\t\t\t\tsv.Score = f64\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected Score to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"scoreDetails\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentScoreDetails(&sv.ScoreDetails, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"severity\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Severity to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Severity = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"status\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Status to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Status = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"title\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Title to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Title = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"type\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Type to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Type = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"updatedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.UpdatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected Date to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentEnhancedImageScanFindingList(v *[]types.EnhancedImageScanFinding, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.EnhancedImageScanFinding\n\tif *v == nil {\n\t\tcv = []types.EnhancedImageScanFinding{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.EnhancedImageScanFinding\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentEnhancedImageScanFinding(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentFindingSeverityCounts(v *map[string]int32, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar mv map[string]int32\n\tif *v == nil {\n\t\tmv = map[string]int32{}\n\t} else {\n\t\tmv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tvar parsedVal int32\n\t\tif value != nil {\n\t\t\tjtv, ok := value.(json.Number)\n\t\t\tif !ok {\n\t\t\t\treturn fmt.Errorf(\"expected SeverityCount to be json.Number, got %T instead\", value)\n\t\t\t}\n\t\t\ti64, err := jtv.Int64()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tparsedVal = int32(i64)\n\t\t}\n\t\tmv[key] = parsedVal\n\n\t}\n\t*v = mv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImage(v **types.Image, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.Image\n\tif *v == nil {\n\t\tsv = &types.Image{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"imageId\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageIdentifier(&sv.ImageId, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"imageManifest\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageManifest to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageManifest = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"imageManifestMediaType\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected MediaType to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageManifestMediaType = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageAlreadyExistsException(v **types.ImageAlreadyExistsException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageAlreadyExistsException\n\tif *v == nil {\n\t\tsv = &types.ImageAlreadyExistsException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageDetail(v **types.ImageDetail, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageDetail\n\tif *v == nil {\n\t\tsv = &types.ImageDetail{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"artifactMediaType\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected MediaType to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ArtifactMediaType = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"imageDigest\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageDigest to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageDigest = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"imageManifestMediaType\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected MediaType to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageManifestMediaType = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"imagePushedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.ImagePushedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected PushTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"imageScanFindingsSummary\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageScanFindingsSummary(&sv.ImageScanFindingsSummary, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"imageScanStatus\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageScanStatus(&sv.ImageScanStatus, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"imageSizeInBytes\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(json.Number)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageSizeInBytes to be json.Number, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\ti64, err := jtv.Int64()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.ImageSizeInBytes = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase \"imageTags\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageTagList(&sv.ImageTags, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"lastRecordedPullTime\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.LastRecordedPullTime = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected RecordedPullTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageDetailList(v *[]types.ImageDetail, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.ImageDetail\n\tif *v == nil {\n\t\tcv = []types.ImageDetail{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.ImageDetail\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentImageDetail(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageDigestDoesNotMatchException(v **types.ImageDigestDoesNotMatchException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageDigestDoesNotMatchException\n\tif *v == nil {\n\t\tsv = &types.ImageDigestDoesNotMatchException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageFailure(v **types.ImageFailure, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageFailure\n\tif *v == nil {\n\t\tsv = &types.ImageFailure{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"failureCode\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageFailureCode to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.FailureCode = types.ImageFailureCode(jtv)\n\t\t\t}\n\n\t\tcase \"failureReason\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageFailureReason to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.FailureReason = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"imageId\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageIdentifier(&sv.ImageId, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageFailureList(v *[]types.ImageFailure, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.ImageFailure\n\tif *v == nil {\n\t\tcv = []types.ImageFailure{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.ImageFailure\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentImageFailure(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageIdentifier(v **types.ImageIdentifier, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageIdentifier\n\tif *v == nil {\n\t\tsv = &types.ImageIdentifier{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"imageDigest\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageDigest to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageDigest = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"imageTag\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageTag to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageTag = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageIdentifierList(v *[]types.ImageIdentifier, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.ImageIdentifier\n\tif *v == nil {\n\t\tcv = []types.ImageIdentifier{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.ImageIdentifier\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentImageIdentifier(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageList(v *[]types.Image, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.Image\n\tif *v == nil {\n\t\tcv = []types.Image{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.Image\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentImage(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageNotFoundException(v **types.ImageNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageNotFoundException\n\tif *v == nil {\n\t\tsv = &types.ImageNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageReplicationStatus(v **types.ImageReplicationStatus, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageReplicationStatus\n\tif *v == nil {\n\t\tsv = &types.ImageReplicationStatus{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"failureCode\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ReplicationError to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.FailureCode = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"region\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Region to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Region = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"status\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ReplicationStatus to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Status = types.ReplicationStatus(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageReplicationStatusList(v *[]types.ImageReplicationStatus, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.ImageReplicationStatus\n\tif *v == nil {\n\t\tcv = []types.ImageReplicationStatus{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.ImageReplicationStatus\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentImageReplicationStatus(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageScanFinding(v **types.ImageScanFinding, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageScanFinding\n\tif *v == nil {\n\t\tsv = &types.ImageScanFinding{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"attributes\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentAttributeList(&sv.Attributes, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"description\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected FindingDescription to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Description = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"name\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected FindingName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Name = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"severity\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected FindingSeverity to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Severity = types.FindingSeverity(jtv)\n\t\t\t}\n\n\t\tcase \"uri\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Url to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Uri = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageScanFindingList(v *[]types.ImageScanFinding, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.ImageScanFinding\n\tif *v == nil {\n\t\tcv = []types.ImageScanFinding{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.ImageScanFinding\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentImageScanFinding(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageScanFindings(v **types.ImageScanFindings, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageScanFindings\n\tif *v == nil {\n\t\tsv = &types.ImageScanFindings{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"enhancedFindings\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentEnhancedImageScanFindingList(&sv.EnhancedFindings, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"findings\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageScanFindingList(&sv.Findings, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"findingSeverityCounts\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentFindingSeverityCounts(&sv.FindingSeverityCounts, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"imageScanCompletedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.ImageScanCompletedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected ScanTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"vulnerabilitySourceUpdatedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.VulnerabilitySourceUpdatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected VulnerabilitySourceUpdateTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageScanFindingsSummary(v **types.ImageScanFindingsSummary, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageScanFindingsSummary\n\tif *v == nil {\n\t\tsv = &types.ImageScanFindingsSummary{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"findingSeverityCounts\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentFindingSeverityCounts(&sv.FindingSeverityCounts, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"imageScanCompletedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.ImageScanCompletedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected ScanTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"vulnerabilitySourceUpdatedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.VulnerabilitySourceUpdatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected VulnerabilitySourceUpdateTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageScanningConfiguration(v **types.ImageScanningConfiguration, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageScanningConfiguration\n\tif *v == nil {\n\t\tsv = &types.ImageScanningConfiguration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"scanOnPush\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ScanOnPushFlag to be of type *bool, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ScanOnPush = jtv\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageScanStatus(v **types.ImageScanStatus, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageScanStatus\n\tif *v == nil {\n\t\tsv = &types.ImageScanStatus{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"description\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ScanStatusDescription to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Description = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"status\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ScanStatus to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Status = types.ScanStatus(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageTagAlreadyExistsException(v **types.ImageTagAlreadyExistsException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageTagAlreadyExistsException\n\tif *v == nil {\n\t\tsv = &types.ImageTagAlreadyExistsException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageTagList(v *[]string, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []string\n\tif *v == nil {\n\t\tcv = []string{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col string\n\t\tif value != nil {\n\t\t\tjtv, ok := value.(string)\n\t\t\tif !ok {\n\t\t\t\treturn fmt.Errorf(\"expected ImageTag to be of type string, got %T instead\", value)\n\t\t\t}\n\t\t\tcol = jtv\n\t\t}\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageTagsList(v *[]string, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []string\n\tif *v == nil {\n\t\tcv = []string{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col string\n\t\tif value != nil {\n\t\t\tjtv, ok := value.(string)\n\t\t\tif !ok {\n\t\t\t\treturn fmt.Errorf(\"expected ImageTag to be of type string, got %T instead\", value)\n\t\t\t}\n\t\t\tcol = jtv\n\t\t}\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentInvalidLayerException(v **types.InvalidLayerException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.InvalidLayerException\n\tif *v == nil {\n\t\tsv = &types.InvalidLayerException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentInvalidLayerPartException(v **types.InvalidLayerPartException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.InvalidLayerPartException\n\tif *v == nil {\n\t\tsv = &types.InvalidLayerPartException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"lastValidByteReceived\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(json.Number)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PartSize to be json.Number, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\ti64, err := jtv.Int64()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.LastValidByteReceived = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"uploadId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected UploadId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UploadId = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentInvalidParameterException(v **types.InvalidParameterException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.InvalidParameterException\n\tif *v == nil {\n\t\tsv = &types.InvalidParameterException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentInvalidTagParameterException(v **types.InvalidTagParameterException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.InvalidTagParameterException\n\tif *v == nil {\n\t\tsv = &types.InvalidTagParameterException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentKmsException(v **types.KmsException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.KmsException\n\tif *v == nil {\n\t\tsv = &types.KmsException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"kmsError\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected KmsError to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.KmsError = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLayer(v **types.Layer, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.Layer\n\tif *v == nil {\n\t\tsv = &types.Layer{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"layerAvailability\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LayerAvailability to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.LayerAvailability = types.LayerAvailability(jtv)\n\t\t\t}\n\n\t\tcase \"layerDigest\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LayerDigest to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.LayerDigest = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"layerSize\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(json.Number)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LayerSizeInBytes to be json.Number, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\ti64, err := jtv.Int64()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.LayerSize = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase \"mediaType\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected MediaType to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.MediaType = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLayerAlreadyExistsException(v **types.LayerAlreadyExistsException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.LayerAlreadyExistsException\n\tif *v == nil {\n\t\tsv = &types.LayerAlreadyExistsException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLayerFailure(v **types.LayerFailure, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.LayerFailure\n\tif *v == nil {\n\t\tsv = &types.LayerFailure{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"failureCode\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LayerFailureCode to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.FailureCode = types.LayerFailureCode(jtv)\n\t\t\t}\n\n\t\tcase \"failureReason\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LayerFailureReason to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.FailureReason = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"layerDigest\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected BatchedOperationLayerDigest to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.LayerDigest = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLayerFailureList(v *[]types.LayerFailure, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.LayerFailure\n\tif *v == nil {\n\t\tcv = []types.LayerFailure{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.LayerFailure\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentLayerFailure(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLayerInaccessibleException(v **types.LayerInaccessibleException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.LayerInaccessibleException\n\tif *v == nil {\n\t\tsv = &types.LayerInaccessibleException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLayerList(v *[]types.Layer, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.Layer\n\tif *v == nil {\n\t\tcv = []types.Layer{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.Layer\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentLayer(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLayerPartTooSmallException(v **types.LayerPartTooSmallException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.LayerPartTooSmallException\n\tif *v == nil {\n\t\tsv = &types.LayerPartTooSmallException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLayersNotFoundException(v **types.LayersNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.LayersNotFoundException\n\tif *v == nil {\n\t\tsv = &types.LayersNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLifecyclePolicyNotFoundException(v **types.LifecyclePolicyNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.LifecyclePolicyNotFoundException\n\tif *v == nil {\n\t\tsv = &types.LifecyclePolicyNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewInProgressException(v **types.LifecyclePolicyPreviewInProgressException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.LifecyclePolicyPreviewInProgressException\n\tif *v == nil {\n\t\tsv = &types.LifecyclePolicyPreviewInProgressException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewNotFoundException(v **types.LifecyclePolicyPreviewNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.LifecyclePolicyPreviewNotFoundException\n\tif *v == nil {\n\t\tsv = &types.LifecyclePolicyPreviewNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewResult(v **types.LifecyclePolicyPreviewResult, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.LifecyclePolicyPreviewResult\n\tif *v == nil {\n\t\tsv = &types.LifecyclePolicyPreviewResult{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"action\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentLifecyclePolicyRuleAction(&sv.Action, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"appliedRulePriority\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(json.Number)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LifecyclePolicyRulePriority to be json.Number, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\ti64, err := jtv.Int64()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.AppliedRulePriority = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tcase \"imageDigest\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageDigest to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageDigest = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"imagePushedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.ImagePushedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected PushTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"imageTags\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageTagList(&sv.ImageTags, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewResultList(v *[]types.LifecyclePolicyPreviewResult, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.LifecyclePolicyPreviewResult\n\tif *v == nil {\n\t\tcv = []types.LifecyclePolicyPreviewResult{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.LifecyclePolicyPreviewResult\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewResult(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewSummary(v **types.LifecyclePolicyPreviewSummary, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.LifecyclePolicyPreviewSummary\n\tif *v == nil {\n\t\tsv = &types.LifecyclePolicyPreviewSummary{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"expiringImageTotalCount\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(json.Number)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageCount to be json.Number, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\ti64, err := jtv.Int64()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.ExpiringImageTotalCount = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLifecyclePolicyRuleAction(v **types.LifecyclePolicyRuleAction, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.LifecyclePolicyRuleAction\n\tif *v == nil {\n\t\tsv = &types.LifecyclePolicyRuleAction{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"type\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageActionType to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Type = types.ImageActionType(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLimitExceededException(v **types.LimitExceededException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.LimitExceededException\n\tif *v == nil {\n\t\tsv = &types.LimitExceededException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentPackageVulnerabilityDetails(v **types.PackageVulnerabilityDetails, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.PackageVulnerabilityDetails\n\tif *v == nil {\n\t\tsv = &types.PackageVulnerabilityDetails{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"cvss\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentCvssScoreList(&sv.Cvss, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"referenceUrls\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentReferenceUrlsList(&sv.ReferenceUrls, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"relatedVulnerabilities\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRelatedVulnerabilitiesList(&sv.RelatedVulnerabilities, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"source\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Source to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Source = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"sourceUrl\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Url to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.SourceUrl = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"vendorCreatedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.VendorCreatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected Date to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"vendorSeverity\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Severity to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.VendorSeverity = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"vendorUpdatedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.VendorUpdatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected Date to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"vulnerabilityId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected VulnerabilityId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.VulnerabilityId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"vulnerablePackages\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentVulnerablePackagesList(&sv.VulnerablePackages, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentPullThroughCacheRule(v **types.PullThroughCacheRule, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.PullThroughCacheRule\n\tif *v == nil {\n\t\tsv = &types.PullThroughCacheRule{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"createdAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.CreatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected CreationTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"credentialArn\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected CredentialArn to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.CredentialArn = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"customRoleArn\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected CustomRoleArn to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.CustomRoleArn = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"ecrRepositoryPrefix\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.EcrRepositoryPrefix = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"updatedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.UpdatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected UpdatedTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"upstreamRegistry\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected UpstreamRegistry to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UpstreamRegistry = types.UpstreamRegistry(jtv)\n\t\t\t}\n\n\t\tcase \"upstreamRegistryUrl\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Url to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UpstreamRegistryUrl = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"upstreamRepositoryPrefix\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UpstreamRepositoryPrefix = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentPullThroughCacheRuleAlreadyExistsException(v **types.PullThroughCacheRuleAlreadyExistsException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.PullThroughCacheRuleAlreadyExistsException\n\tif *v == nil {\n\t\tsv = &types.PullThroughCacheRuleAlreadyExistsException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentPullThroughCacheRuleList(v *[]types.PullThroughCacheRule, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.PullThroughCacheRule\n\tif *v == nil {\n\t\tcv = []types.PullThroughCacheRule{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.PullThroughCacheRule\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentPullThroughCacheRule(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentPullThroughCacheRuleNotFoundException(v **types.PullThroughCacheRuleNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.PullThroughCacheRuleNotFoundException\n\tif *v == nil {\n\t\tsv = &types.PullThroughCacheRuleNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRCTAppliedForList(v *[]types.RCTAppliedFor, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.RCTAppliedFor\n\tif *v == nil {\n\t\tcv = []types.RCTAppliedFor{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.RCTAppliedFor\n\t\tif value != nil {\n\t\t\tjtv, ok := value.(string)\n\t\t\tif !ok {\n\t\t\t\treturn fmt.Errorf(\"expected RCTAppliedFor to be of type string, got %T instead\", value)\n\t\t\t}\n\t\t\tcol = types.RCTAppliedFor(jtv)\n\t\t}\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRecommendation(v **types.Recommendation, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.Recommendation\n\tif *v == nil {\n\t\tsv = &types.Recommendation{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"text\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RecommendationText to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Text = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"url\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Url to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Url = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentReferencedImagesNotFoundException(v **types.ReferencedImagesNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ReferencedImagesNotFoundException\n\tif *v == nil {\n\t\tsv = &types.ReferencedImagesNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentReferenceUrlsList(v *[]string, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []string\n\tif *v == nil {\n\t\tcv = []string{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col string\n\t\tif value != nil {\n\t\t\tjtv, ok := value.(string)\n\t\t\tif !ok {\n\t\t\t\treturn fmt.Errorf(\"expected Url to be of type string, got %T instead\", value)\n\t\t\t}\n\t\t\tcol = jtv\n\t\t}\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRegistryPolicyNotFoundException(v **types.RegistryPolicyNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RegistryPolicyNotFoundException\n\tif *v == nil {\n\t\tsv = &types.RegistryPolicyNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRegistryScanningConfiguration(v **types.RegistryScanningConfiguration, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RegistryScanningConfiguration\n\tif *v == nil {\n\t\tsv = &types.RegistryScanningConfiguration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"rules\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRegistryScanningRuleList(&sv.Rules, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"scanType\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ScanType to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ScanType = types.ScanType(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRegistryScanningRule(v **types.RegistryScanningRule, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RegistryScanningRule\n\tif *v == nil {\n\t\tsv = &types.RegistryScanningRule{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"repositoryFilters\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentScanningRepositoryFilterList(&sv.RepositoryFilters, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"scanFrequency\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ScanFrequency to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ScanFrequency = types.ScanFrequency(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRegistryScanningRuleList(v *[]types.RegistryScanningRule, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.RegistryScanningRule\n\tif *v == nil {\n\t\tcv = []types.RegistryScanningRule{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.RegistryScanningRule\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentRegistryScanningRule(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRelatedVulnerabilitiesList(v *[]string, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []string\n\tif *v == nil {\n\t\tcv = []string{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col string\n\t\tif value != nil {\n\t\t\tjtv, ok := value.(string)\n\t\t\tif !ok {\n\t\t\t\treturn fmt.Errorf(\"expected RelatedVulnerability to be of type string, got %T instead\", value)\n\t\t\t}\n\t\t\tcol = jtv\n\t\t}\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRemediation(v **types.Remediation, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.Remediation\n\tif *v == nil {\n\t\tsv = &types.Remediation{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"recommendation\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRecommendation(&sv.Recommendation, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentReplicationConfiguration(v **types.ReplicationConfiguration, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ReplicationConfiguration\n\tif *v == nil {\n\t\tsv = &types.ReplicationConfiguration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"rules\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentReplicationRuleList(&sv.Rules, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentReplicationDestination(v **types.ReplicationDestination, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ReplicationDestination\n\tif *v == nil {\n\t\tsv = &types.ReplicationDestination{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"region\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Region to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Region = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentReplicationDestinationList(v *[]types.ReplicationDestination, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.ReplicationDestination\n\tif *v == nil {\n\t\tcv = []types.ReplicationDestination{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.ReplicationDestination\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentReplicationDestination(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentReplicationRule(v **types.ReplicationRule, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ReplicationRule\n\tif *v == nil {\n\t\tsv = &types.ReplicationRule{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"destinations\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentReplicationDestinationList(&sv.Destinations, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"repositoryFilters\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRepositoryFilterList(&sv.RepositoryFilters, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentReplicationRuleList(v *[]types.ReplicationRule, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.ReplicationRule\n\tif *v == nil {\n\t\tcv = []types.ReplicationRule{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.ReplicationRule\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentReplicationRule(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepository(v **types.Repository, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.Repository\n\tif *v == nil {\n\t\tsv = &types.Repository{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"createdAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.CreatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected CreationTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"encryptionConfiguration\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentEncryptionConfiguration(&sv.EncryptionConfiguration, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"imageScanningConfiguration\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageScanningConfiguration(&sv.ImageScanningConfiguration, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"imageTagMutability\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageTagMutability to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageTagMutability = types.ImageTagMutability(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryArn\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Arn to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryArn = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryUri\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Url to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryUri = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryAlreadyExistsException(v **types.RepositoryAlreadyExistsException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RepositoryAlreadyExistsException\n\tif *v == nil {\n\t\tsv = &types.RepositoryAlreadyExistsException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryCreationTemplate(v **types.RepositoryCreationTemplate, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RepositoryCreationTemplate\n\tif *v == nil {\n\t\tsv = &types.RepositoryCreationTemplate{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"appliedFor\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRCTAppliedForList(&sv.AppliedFor, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"createdAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.CreatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected Date to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"customRoleArn\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected CustomRoleArn to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.CustomRoleArn = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"description\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryTemplateDescription to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Description = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"encryptionConfiguration\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentEncryptionConfigurationForRepositoryCreationTemplate(&sv.EncryptionConfiguration, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"imageTagMutability\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageTagMutability to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageTagMutability = types.ImageTagMutability(jtv)\n\t\t\t}\n\n\t\tcase \"lifecyclePolicy\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LifecyclePolicyTextForRepositoryCreationTemplate to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.LifecyclePolicy = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"prefix\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Prefix to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Prefix = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryPolicy\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryPolicyText to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryPolicy = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"resourceTags\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentTagList(&sv.ResourceTags, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"updatedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.UpdatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected Date to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryCreationTemplateList(v *[]types.RepositoryCreationTemplate, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.RepositoryCreationTemplate\n\tif *v == nil {\n\t\tcv = []types.RepositoryCreationTemplate{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.RepositoryCreationTemplate\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentRepositoryCreationTemplate(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryFilter(v **types.RepositoryFilter, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RepositoryFilter\n\tif *v == nil {\n\t\tsv = &types.RepositoryFilter{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"filter\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryFilterValue to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Filter = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"filterType\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryFilterType to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.FilterType = types.RepositoryFilterType(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryFilterList(v *[]types.RepositoryFilter, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.RepositoryFilter\n\tif *v == nil {\n\t\tcv = []types.RepositoryFilter{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.RepositoryFilter\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentRepositoryFilter(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryList(v *[]types.Repository, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.Repository\n\tif *v == nil {\n\t\tcv = []types.Repository{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.Repository\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentRepository(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryNotEmptyException(v **types.RepositoryNotEmptyException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RepositoryNotEmptyException\n\tif *v == nil {\n\t\tsv = &types.RepositoryNotEmptyException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryNotFoundException(v **types.RepositoryNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RepositoryNotFoundException\n\tif *v == nil {\n\t\tsv = &types.RepositoryNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryPolicyNotFoundException(v **types.RepositoryPolicyNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RepositoryPolicyNotFoundException\n\tif *v == nil {\n\t\tsv = &types.RepositoryPolicyNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryScanningConfiguration(v **types.RepositoryScanningConfiguration, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RepositoryScanningConfiguration\n\tif *v == nil {\n\t\tsv = &types.RepositoryScanningConfiguration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"appliedScanFilters\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentScanningRepositoryFilterList(&sv.AppliedScanFilters, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"repositoryArn\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Arn to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryArn = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"scanFrequency\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ScanFrequency to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ScanFrequency = types.ScanFrequency(jtv)\n\t\t\t}\n\n\t\tcase \"scanOnPush\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ScanOnPushFlag to be of type *bool, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ScanOnPush = jtv\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryScanningConfigurationFailure(v **types.RepositoryScanningConfigurationFailure, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RepositoryScanningConfigurationFailure\n\tif *v == nil {\n\t\tsv = &types.RepositoryScanningConfigurationFailure{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"failureCode\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ScanningConfigurationFailureCode to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.FailureCode = types.ScanningConfigurationFailureCode(jtv)\n\t\t\t}\n\n\t\tcase \"failureReason\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ScanningConfigurationFailureReason to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.FailureReason = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryScanningConfigurationFailureList(v *[]types.RepositoryScanningConfigurationFailure, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.RepositoryScanningConfigurationFailure\n\tif *v == nil {\n\t\tcv = []types.RepositoryScanningConfigurationFailure{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.RepositoryScanningConfigurationFailure\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentRepositoryScanningConfigurationFailure(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryScanningConfigurationList(v *[]types.RepositoryScanningConfiguration, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.RepositoryScanningConfiguration\n\tif *v == nil {\n\t\tcv = []types.RepositoryScanningConfiguration{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.RepositoryScanningConfiguration\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentRepositoryScanningConfiguration(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentResource(v **types.Resource, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.Resource\n\tif *v == nil {\n\t\tsv = &types.Resource{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"details\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentResourceDetails(&sv.Details, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"id\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ResourceId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Id = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"tags\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentTags(&sv.Tags, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"type\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Type to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Type = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentResourceDetails(v **types.ResourceDetails, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ResourceDetails\n\tif *v == nil {\n\t\tsv = &types.ResourceDetails{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"awsEcrContainerImage\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentAwsEcrContainerImageDetails(&sv.AwsEcrContainerImage, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentResourceList(v *[]types.Resource, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.Resource\n\tif *v == nil {\n\t\tcv = []types.Resource{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.Resource\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentResource(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentScanningRepositoryFilter(v **types.ScanningRepositoryFilter, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ScanningRepositoryFilter\n\tif *v == nil {\n\t\tsv = &types.ScanningRepositoryFilter{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"filter\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ScanningRepositoryFilterValue to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Filter = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"filterType\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ScanningRepositoryFilterType to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.FilterType = types.ScanningRepositoryFilterType(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentScanningRepositoryFilterList(v *[]types.ScanningRepositoryFilter, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.ScanningRepositoryFilter\n\tif *v == nil {\n\t\tcv = []types.ScanningRepositoryFilter{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.ScanningRepositoryFilter\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentScanningRepositoryFilter(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentScanNotFoundException(v **types.ScanNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ScanNotFoundException\n\tif *v == nil {\n\t\tsv = &types.ScanNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentScoreDetails(v **types.ScoreDetails, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ScoreDetails\n\tif *v == nil {\n\t\tsv = &types.ScoreDetails{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"cvss\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentCvssScoreDetails(&sv.Cvss, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentSecretNotFoundException(v **types.SecretNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.SecretNotFoundException\n\tif *v == nil {\n\t\tsv = &types.SecretNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentServerException(v **types.ServerException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ServerException\n\tif *v == nil {\n\t\tsv = &types.ServerException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentTag(v **types.Tag, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.Tag\n\tif *v == nil {\n\t\tsv = &types.Tag{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"Key\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected TagKey to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Key = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"Value\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected TagValue to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Value = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentTagList(v *[]types.Tag, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.Tag\n\tif *v == nil {\n\t\tcv = []types.Tag{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.Tag\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentTag(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentTags(v *map[string]string, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar mv map[string]string\n\tif *v == nil {\n\t\tmv = map[string]string{}\n\t} else {\n\t\tmv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tvar parsedVal string\n\t\tif value != nil {\n\t\t\tjtv, ok := value.(string)\n\t\t\tif !ok {\n\t\t\t\treturn fmt.Errorf(\"expected TagValue to be of type string, got %T instead\", value)\n\t\t\t}\n\t\t\tparsedVal = jtv\n\t\t}\n\t\tmv[key] = parsedVal\n\n\t}\n\t*v = mv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentTemplateAlreadyExistsException(v **types.TemplateAlreadyExistsException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.TemplateAlreadyExistsException\n\tif *v == nil {\n\t\tsv = &types.TemplateAlreadyExistsException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentTemplateNotFoundException(v **types.TemplateNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.TemplateNotFoundException\n\tif *v == nil {\n\t\tsv = &types.TemplateNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentTooManyTagsException(v **types.TooManyTagsException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.TooManyTagsException\n\tif *v == nil {\n\t\tsv = &types.TooManyTagsException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentUnableToAccessSecretException(v **types.UnableToAccessSecretException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.UnableToAccessSecretException\n\tif *v == nil {\n\t\tsv = &types.UnableToAccessSecretException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentUnableToDecryptSecretValueException(v **types.UnableToDecryptSecretValueException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.UnableToDecryptSecretValueException\n\tif *v == nil {\n\t\tsv = &types.UnableToDecryptSecretValueException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentUnableToGetUpstreamImageException(v **types.UnableToGetUpstreamImageException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.UnableToGetUpstreamImageException\n\tif *v == nil {\n\t\tsv = &types.UnableToGetUpstreamImageException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentUnableToGetUpstreamLayerException(v **types.UnableToGetUpstreamLayerException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.UnableToGetUpstreamLayerException\n\tif *v == nil {\n\t\tsv = &types.UnableToGetUpstreamLayerException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentUnsupportedImageTypeException(v **types.UnsupportedImageTypeException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.UnsupportedImageTypeException\n\tif *v == nil {\n\t\tsv = &types.UnsupportedImageTypeException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentUnsupportedUpstreamRegistryException(v **types.UnsupportedUpstreamRegistryException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.UnsupportedUpstreamRegistryException\n\tif *v == nil {\n\t\tsv = &types.UnsupportedUpstreamRegistryException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentUploadNotFoundException(v **types.UploadNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.UploadNotFoundException\n\tif *v == nil {\n\t\tsv = &types.UploadNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentValidationException(v **types.ValidationException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ValidationException\n\tif *v == nil {\n\t\tsv = &types.ValidationException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentVulnerablePackage(v **types.VulnerablePackage, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.VulnerablePackage\n\tif *v == nil {\n\t\tsv = &types.VulnerablePackage{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"arch\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Arch to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Arch = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"epoch\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(json.Number)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Epoch to be json.Number, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\ti64, err := jtv.Int64()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.Epoch = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tcase \"filePath\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected FilePath to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.FilePath = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"fixedInVersion\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected FixedInVersion to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.FixedInVersion = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"name\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected VulnerablePackageName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Name = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"packageManager\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PackageManager to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.PackageManager = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"release\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Release to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Release = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"sourceLayerHash\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected SourceLayerHash to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.SourceLayerHash = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"version\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Version to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Version = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentVulnerablePackagesList(v *[]types.VulnerablePackage, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.VulnerablePackage\n\tif *v == nil {\n\t\tcv = []types.VulnerablePackage{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.VulnerablePackage\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentVulnerablePackage(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentBatchCheckLayerAvailabilityOutput(v **BatchCheckLayerAvailabilityOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *BatchCheckLayerAvailabilityOutput\n\tif *v == nil {\n\t\tsv = &BatchCheckLayerAvailabilityOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"failures\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentLayerFailureList(&sv.Failures, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"layers\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentLayerList(&sv.Layers, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentBatchDeleteImageOutput(v **BatchDeleteImageOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *BatchDeleteImageOutput\n\tif *v == nil {\n\t\tsv = &BatchDeleteImageOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"failures\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageFailureList(&sv.Failures, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"imageIds\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageIdentifierList(&sv.ImageIds, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentBatchGetImageOutput(v **BatchGetImageOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *BatchGetImageOutput\n\tif *v == nil {\n\t\tsv = &BatchGetImageOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"failures\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageFailureList(&sv.Failures, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"images\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageList(&sv.Images, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentBatchGetRepositoryScanningConfigurationOutput(v **BatchGetRepositoryScanningConfigurationOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *BatchGetRepositoryScanningConfigurationOutput\n\tif *v == nil {\n\t\tsv = &BatchGetRepositoryScanningConfigurationOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"failures\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRepositoryScanningConfigurationFailureList(&sv.Failures, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"scanningConfigurations\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRepositoryScanningConfigurationList(&sv.ScanningConfigurations, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentCompleteLayerUploadOutput(v **CompleteLayerUploadOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *CompleteLayerUploadOutput\n\tif *v == nil {\n\t\tsv = &CompleteLayerUploadOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"layerDigest\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LayerDigest to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.LayerDigest = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"uploadId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected UploadId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UploadId = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentCreatePullThroughCacheRuleOutput(v **CreatePullThroughCacheRuleOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *CreatePullThroughCacheRuleOutput\n\tif *v == nil {\n\t\tsv = &CreatePullThroughCacheRuleOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"createdAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.CreatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected CreationTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"credentialArn\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected CredentialArn to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.CredentialArn = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"customRoleArn\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected CustomRoleArn to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.CustomRoleArn = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"ecrRepositoryPrefix\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.EcrRepositoryPrefix = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"upstreamRegistry\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected UpstreamRegistry to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UpstreamRegistry = types.UpstreamRegistry(jtv)\n\t\t\t}\n\n\t\tcase \"upstreamRegistryUrl\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Url to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UpstreamRegistryUrl = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"upstreamRepositoryPrefix\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UpstreamRepositoryPrefix = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentCreateRepositoryCreationTemplateOutput(v **CreateRepositoryCreationTemplateOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *CreateRepositoryCreationTemplateOutput\n\tif *v == nil {\n\t\tsv = &CreateRepositoryCreationTemplateOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryCreationTemplate\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRepositoryCreationTemplate(&sv.RepositoryCreationTemplate, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentCreateRepositoryOutput(v **CreateRepositoryOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *CreateRepositoryOutput\n\tif *v == nil {\n\t\tsv = &CreateRepositoryOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"repository\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRepository(&sv.Repository, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDeleteLifecyclePolicyOutput(v **DeleteLifecyclePolicyOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DeleteLifecyclePolicyOutput\n\tif *v == nil {\n\t\tsv = &DeleteLifecyclePolicyOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"lastEvaluatedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.LastEvaluatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected EvaluationTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"lifecyclePolicyText\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LifecyclePolicyText to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.LifecyclePolicyText = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDeletePullThroughCacheRuleOutput(v **DeletePullThroughCacheRuleOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DeletePullThroughCacheRuleOutput\n\tif *v == nil {\n\t\tsv = &DeletePullThroughCacheRuleOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"createdAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.CreatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected CreationTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"credentialArn\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected CredentialArn to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.CredentialArn = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"customRoleArn\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected CustomRoleArn to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.CustomRoleArn = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"ecrRepositoryPrefix\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.EcrRepositoryPrefix = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"upstreamRegistryUrl\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Url to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UpstreamRegistryUrl = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"upstreamRepositoryPrefix\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UpstreamRepositoryPrefix = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDeleteRegistryPolicyOutput(v **DeleteRegistryPolicyOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DeleteRegistryPolicyOutput\n\tif *v == nil {\n\t\tsv = &DeleteRegistryPolicyOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"policyText\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryPolicyText to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.PolicyText = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDeleteRepositoryCreationTemplateOutput(v **DeleteRepositoryCreationTemplateOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DeleteRepositoryCreationTemplateOutput\n\tif *v == nil {\n\t\tsv = &DeleteRepositoryCreationTemplateOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryCreationTemplate\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRepositoryCreationTemplate(&sv.RepositoryCreationTemplate, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDeleteRepositoryOutput(v **DeleteRepositoryOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DeleteRepositoryOutput\n\tif *v == nil {\n\t\tsv = &DeleteRepositoryOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"repository\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRepository(&sv.Repository, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDeleteRepositoryPolicyOutput(v **DeleteRepositoryPolicyOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DeleteRepositoryPolicyOutput\n\tif *v == nil {\n\t\tsv = &DeleteRepositoryPolicyOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"policyText\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryPolicyText to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.PolicyText = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDescribeImageReplicationStatusOutput(v **DescribeImageReplicationStatusOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DescribeImageReplicationStatusOutput\n\tif *v == nil {\n\t\tsv = &DescribeImageReplicationStatusOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"imageId\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageIdentifier(&sv.ImageId, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"replicationStatuses\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageReplicationStatusList(&sv.ReplicationStatuses, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDescribeImageScanFindingsOutput(v **DescribeImageScanFindingsOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DescribeImageScanFindingsOutput\n\tif *v == nil {\n\t\tsv = &DescribeImageScanFindingsOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"imageId\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageIdentifier(&sv.ImageId, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"imageScanFindings\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageScanFindings(&sv.ImageScanFindings, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"imageScanStatus\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageScanStatus(&sv.ImageScanStatus, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"nextToken\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected NextToken to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.NextToken = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDescribeImagesOutput(v **DescribeImagesOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DescribeImagesOutput\n\tif *v == nil {\n\t\tsv = &DescribeImagesOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"imageDetails\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageDetailList(&sv.ImageDetails, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"nextToken\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected NextToken to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.NextToken = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDescribePullThroughCacheRulesOutput(v **DescribePullThroughCacheRulesOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DescribePullThroughCacheRulesOutput\n\tif *v == nil {\n\t\tsv = &DescribePullThroughCacheRulesOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"nextToken\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected NextToken to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.NextToken = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"pullThroughCacheRules\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentPullThroughCacheRuleList(&sv.PullThroughCacheRules, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDescribeRegistryOutput(v **DescribeRegistryOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DescribeRegistryOutput\n\tif *v == nil {\n\t\tsv = &DescribeRegistryOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"replicationConfiguration\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentReplicationConfiguration(&sv.ReplicationConfiguration, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDescribeRepositoriesOutput(v **DescribeRepositoriesOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DescribeRepositoriesOutput\n\tif *v == nil {\n\t\tsv = &DescribeRepositoriesOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"nextToken\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected NextToken to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.NextToken = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositories\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRepositoryList(&sv.Repositories, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDescribeRepositoryCreationTemplatesOutput(v **DescribeRepositoryCreationTemplatesOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DescribeRepositoryCreationTemplatesOutput\n\tif *v == nil {\n\t\tsv = &DescribeRepositoryCreationTemplatesOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"nextToken\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected NextToken to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.NextToken = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryCreationTemplates\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRepositoryCreationTemplateList(&sv.RepositoryCreationTemplates, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentGetAccountSettingOutput(v **GetAccountSettingOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *GetAccountSettingOutput\n\tif *v == nil {\n\t\tsv = &GetAccountSettingOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"name\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected AccountSettingName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Name = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"value\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected AccountSettingName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Value = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentGetAuthorizationTokenOutput(v **GetAuthorizationTokenOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *GetAuthorizationTokenOutput\n\tif *v == nil {\n\t\tsv = &GetAuthorizationTokenOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"authorizationData\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentAuthorizationDataList(&sv.AuthorizationData, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentGetDownloadUrlForLayerOutput(v **GetDownloadUrlForLayerOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *GetDownloadUrlForLayerOutput\n\tif *v == nil {\n\t\tsv = &GetDownloadUrlForLayerOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"downloadUrl\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Url to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.DownloadUrl = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"layerDigest\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LayerDigest to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.LayerDigest = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentGetLifecyclePolicyOutput(v **GetLifecyclePolicyOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *GetLifecyclePolicyOutput\n\tif *v == nil {\n\t\tsv = &GetLifecyclePolicyOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"lastEvaluatedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.LastEvaluatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected EvaluationTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"lifecyclePolicyText\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LifecyclePolicyText to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.LifecyclePolicyText = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentGetLifecyclePolicyPreviewOutput(v **GetLifecyclePolicyPreviewOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *GetLifecyclePolicyPreviewOutput\n\tif *v == nil {\n\t\tsv = &GetLifecyclePolicyPreviewOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"lifecyclePolicyText\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LifecyclePolicyText to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.LifecyclePolicyText = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"nextToken\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected NextToken to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.NextToken = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"previewResults\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewResultList(&sv.PreviewResults, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"status\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LifecyclePolicyPreviewStatus to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Status = types.LifecyclePolicyPreviewStatus(jtv)\n\t\t\t}\n\n\t\tcase \"summary\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewSummary(&sv.Summary, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentGetRegistryPolicyOutput(v **GetRegistryPolicyOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *GetRegistryPolicyOutput\n\tif *v == nil {\n\t\tsv = &GetRegistryPolicyOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"policyText\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryPolicyText to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.PolicyText = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentGetRegistryScanningConfigurationOutput(v **GetRegistryScanningConfigurationOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *GetRegistryScanningConfigurationOutput\n\tif *v == nil {\n\t\tsv = &GetRegistryScanningConfigurationOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"scanningConfiguration\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRegistryScanningConfiguration(&sv.ScanningConfiguration, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentGetRepositoryPolicyOutput(v **GetRepositoryPolicyOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *GetRepositoryPolicyOutput\n\tif *v == nil {\n\t\tsv = &GetRepositoryPolicyOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"policyText\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryPolicyText to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.PolicyText = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentInitiateLayerUploadOutput(v **InitiateLayerUploadOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *InitiateLayerUploadOutput\n\tif *v == nil {\n\t\tsv = &InitiateLayerUploadOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"partSize\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(json.Number)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PartSize to be json.Number, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\ti64, err := jtv.Int64()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.PartSize = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase \"uploadId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected UploadId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UploadId = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentListImagesOutput(v **ListImagesOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *ListImagesOutput\n\tif *v == nil {\n\t\tsv = &ListImagesOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"imageIds\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageIdentifierList(&sv.ImageIds, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"nextToken\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected NextToken to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.NextToken = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentListTagsForResourceOutput(v **ListTagsForResourceOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *ListTagsForResourceOutput\n\tif *v == nil {\n\t\tsv = &ListTagsForResourceOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"tags\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentTagList(&sv.Tags, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentPutAccountSettingOutput(v **PutAccountSettingOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *PutAccountSettingOutput\n\tif *v == nil {\n\t\tsv = &PutAccountSettingOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"name\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected AccountSettingName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Name = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"value\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected AccountSettingValue to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Value = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentPutImageOutput(v **PutImageOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *PutImageOutput\n\tif *v == nil {\n\t\tsv = &PutImageOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"image\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImage(&sv.Image, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentPutImageScanningConfigurationOutput(v **PutImageScanningConfigurationOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *PutImageScanningConfigurationOutput\n\tif *v == nil {\n\t\tsv = &PutImageScanningConfigurationOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"imageScanningConfiguration\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageScanningConfiguration(&sv.ImageScanningConfiguration, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentPutImageTagMutabilityOutput(v **PutImageTagMutabilityOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *PutImageTagMutabilityOutput\n\tif *v == nil {\n\t\tsv = &PutImageTagMutabilityOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"imageTagMutability\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageTagMutability to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageTagMutability = types.ImageTagMutability(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentPutLifecyclePolicyOutput(v **PutLifecyclePolicyOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *PutLifecyclePolicyOutput\n\tif *v == nil {\n\t\tsv = &PutLifecyclePolicyOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"lifecyclePolicyText\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LifecyclePolicyText to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.LifecyclePolicyText = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentPutRegistryPolicyOutput(v **PutRegistryPolicyOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *PutRegistryPolicyOutput\n\tif *v == nil {\n\t\tsv = &PutRegistryPolicyOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"policyText\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryPolicyText to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.PolicyText = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentPutRegistryScanningConfigurationOutput(v **PutRegistryScanningConfigurationOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *PutRegistryScanningConfigurationOutput\n\tif *v == nil {\n\t\tsv = &PutRegistryScanningConfigurationOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"registryScanningConfiguration\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRegistryScanningConfiguration(&sv.RegistryScanningConfiguration, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentPutReplicationConfigurationOutput(v **PutReplicationConfigurationOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *PutReplicationConfigurationOutput\n\tif *v == nil {\n\t\tsv = &PutReplicationConfigurationOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"replicationConfiguration\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentReplicationConfiguration(&sv.ReplicationConfiguration, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentSetRepositoryPolicyOutput(v **SetRepositoryPolicyOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *SetRepositoryPolicyOutput\n\tif *v == nil {\n\t\tsv = &SetRepositoryPolicyOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"policyText\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryPolicyText to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.PolicyText = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentStartImageScanOutput(v **StartImageScanOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *StartImageScanOutput\n\tif *v == nil {\n\t\tsv = &StartImageScanOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"imageId\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageIdentifier(&sv.ImageId, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"imageScanStatus\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageScanStatus(&sv.ImageScanStatus, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentStartLifecyclePolicyPreviewOutput(v **StartLifecyclePolicyPreviewOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *StartLifecyclePolicyPreviewOutput\n\tif *v == nil {\n\t\tsv = &StartLifecyclePolicyPreviewOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"lifecyclePolicyText\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LifecyclePolicyText to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.LifecyclePolicyText = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"status\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LifecyclePolicyPreviewStatus to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Status = types.LifecyclePolicyPreviewStatus(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentTagResourceOutput(v **TagResourceOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *TagResourceOutput\n\tif *v == nil {\n\t\tsv = &TagResourceOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentUntagResourceOutput(v **UntagResourceOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *UntagResourceOutput\n\tif *v == nil {\n\t\tsv = &UntagResourceOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentUpdatePullThroughCacheRuleOutput(v **UpdatePullThroughCacheRuleOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *UpdatePullThroughCacheRuleOutput\n\tif *v == nil {\n\t\tsv = &UpdatePullThroughCacheRuleOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"credentialArn\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected CredentialArn to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.CredentialArn = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"customRoleArn\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected CustomRoleArn to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.CustomRoleArn = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"ecrRepositoryPrefix\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.EcrRepositoryPrefix = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"updatedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.UpdatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected UpdatedTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"upstreamRepositoryPrefix\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UpstreamRepositoryPrefix = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentUpdateRepositoryCreationTemplateOutput(v **UpdateRepositoryCreationTemplateOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *UpdateRepositoryCreationTemplateOutput\n\tif *v == nil {\n\t\tsv = &UpdateRepositoryCreationTemplateOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryCreationTemplate\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRepositoryCreationTemplate(&sv.RepositoryCreationTemplate, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentUploadLayerPartOutput(v **UploadLayerPartOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *UploadLayerPartOutput\n\tif *v == nil {\n\t\tsv = &UploadLayerPartOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"lastByteReceived\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(json.Number)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PartSize to be json.Number, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\ti64, err := jtv.Int64()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.LastByteReceived = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"uploadId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected UploadId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UploadId = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentValidatePullThroughCacheRuleOutput(v **ValidatePullThroughCacheRuleOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *ValidatePullThroughCacheRuleOutput\n\tif *v == nil {\n\t\tsv = &ValidatePullThroughCacheRuleOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"credentialArn\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected CredentialArn to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.CredentialArn = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"customRoleArn\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected CustomRoleArn to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.CustomRoleArn = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"ecrRepositoryPrefix\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.EcrRepositoryPrefix = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"failure\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PTCValidateFailure to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Failure = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"isValid\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected IsPTCRuleValid to be of type *bool, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.IsValid = jtv\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"upstreamRegistryUrl\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Url to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UpstreamRegistryUrl = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"upstreamRepositoryPrefix\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UpstreamRepositoryPrefix = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype protocolErrorInfo struct {\n\tType    string `json:\"__type\"`\n\tMessage string\n\tCode    any // nonstandard for awsjson but some services do present the type here\n}\n\nfunc getProtocolErrorInfo(decoder *json.Decoder) (protocolErrorInfo, error) {\n\tvar errInfo protocolErrorInfo\n\tif err := decoder.Decode(&errInfo); err != nil {\n\t\tif err == io.EOF {\n\t\t\treturn errInfo, nil\n\t\t}\n\t\treturn errInfo, err\n\t}\n\n\treturn errInfo, nil\n}\n\nfunc resolveProtocolErrorType(headerType string, bodyInfo protocolErrorInfo) (string, bool) {\n\tif len(headerType) != 0 {\n\t\treturn headerType, true\n\t} else if len(bodyInfo.Type) != 0 {\n\t\treturn bodyInfo.Type, true\n\t} else if code, ok := bodyInfo.Code.(string); ok && len(code) != 0 {\n\t\treturn code, true\n\t}\n\treturn \"\", false\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/doc.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\n// Package ecr provides the API client, operations, and parameter types for Amazon\n// Elastic Container Registry.\n//\n// # Amazon Elastic Container Registry\n//\n// Amazon Elastic Container Registry (Amazon ECR) is a managed container image\n// registry service. Customers can use the familiar Docker CLI, or their preferred\n// client, to push, pull, and manage images. Amazon ECR provides a secure,\n// scalable, and reliable registry for your Docker or Open Container Initiative\n// (OCI) images. Amazon ECR supports private repositories with resource-based\n// permissions using IAM so that specific users or Amazon EC2 instances can access\n// repositories and images.\n//\n// Amazon ECR has service endpoints in each supported Region. For more\n// information, see [Amazon ECR endpoints]in the Amazon Web Services General Reference.\n//\n// [Amazon ECR endpoints]: https://docs.aws.amazon.com/general/latest/gr/ecr.html\npackage ecr\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/endpoints.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\tinternalConfig \"github.com/aws/aws-sdk-go-v2/internal/configsources\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/endpoints\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn\"\n\tinternalendpoints \"github.com/aws/aws-sdk-go-v2/service/ecr/internal/endpoints\"\n\tsmithyauth \"github.com/aws/smithy-go/auth\"\n\tsmithyendpoints \"github.com/aws/smithy-go/endpoints\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"strings\"\n)\n\n// EndpointResolverOptions is the service endpoint resolver options\ntype EndpointResolverOptions = internalendpoints.Options\n\n// EndpointResolver interface for resolving service endpoints.\ntype EndpointResolver interface {\n\tResolveEndpoint(region string, options EndpointResolverOptions) (aws.Endpoint, error)\n}\n\nvar _ EndpointResolver = &internalendpoints.Resolver{}\n\n// NewDefaultEndpointResolver constructs a new service endpoint resolver\nfunc NewDefaultEndpointResolver() *internalendpoints.Resolver {\n\treturn internalendpoints.New()\n}\n\n// EndpointResolverFunc is a helper utility that wraps a function so it satisfies\n// the EndpointResolver interface. This is useful when you want to add additional\n// endpoint resolving logic, or stub out specific endpoints with custom values.\ntype EndpointResolverFunc func(region string, options EndpointResolverOptions) (aws.Endpoint, error)\n\nfunc (fn EndpointResolverFunc) ResolveEndpoint(region string, options EndpointResolverOptions) (endpoint aws.Endpoint, err error) {\n\treturn fn(region, options)\n}\n\n// EndpointResolverFromURL returns an EndpointResolver configured using the\n// provided endpoint url. By default, the resolved endpoint resolver uses the\n// client region as signing region, and the endpoint source is set to\n// EndpointSourceCustom.You can provide functional options to configure endpoint\n// values for the resolved endpoint.\nfunc EndpointResolverFromURL(url string, optFns ...func(*aws.Endpoint)) EndpointResolver {\n\te := aws.Endpoint{URL: url, Source: aws.EndpointSourceCustom}\n\tfor _, fn := range optFns {\n\t\tfn(&e)\n\t}\n\n\treturn EndpointResolverFunc(\n\t\tfunc(region string, options EndpointResolverOptions) (aws.Endpoint, error) {\n\t\t\tif len(e.SigningRegion) == 0 {\n\t\t\t\te.SigningRegion = region\n\t\t\t}\n\t\t\treturn e, nil\n\t\t},\n\t)\n}\n\ntype ResolveEndpoint struct {\n\tResolver EndpointResolver\n\tOptions  EndpointResolverOptions\n}\n\nfunc (*ResolveEndpoint) ID() string {\n\treturn \"ResolveEndpoint\"\n}\n\nfunc (m *ResolveEndpoint) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\tif !awsmiddleware.GetRequiresLegacyEndpoints(ctx) {\n\t\treturn next.HandleSerialize(ctx, in)\n\t}\n\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type %T\", in.Request)\n\t}\n\n\tif m.Resolver == nil {\n\t\treturn out, metadata, fmt.Errorf(\"expected endpoint resolver to not be nil\")\n\t}\n\n\teo := m.Options\n\teo.Logger = middleware.GetLogger(ctx)\n\n\tvar endpoint aws.Endpoint\n\tendpoint, err = m.Resolver.ResolveEndpoint(awsmiddleware.GetRegion(ctx), eo)\n\tif err != nil {\n\t\tnf := (&aws.EndpointNotFoundError{})\n\t\tif errors.As(err, &nf) {\n\t\t\tctx = awsmiddleware.SetRequiresLegacyEndpoints(ctx, false)\n\t\t\treturn next.HandleSerialize(ctx, in)\n\t\t}\n\t\treturn out, metadata, fmt.Errorf(\"failed to resolve service endpoint, %w\", err)\n\t}\n\n\treq.URL, err = url.Parse(endpoint.URL)\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"failed to parse endpoint URL: %w\", err)\n\t}\n\n\tif len(awsmiddleware.GetSigningName(ctx)) == 0 {\n\t\tsigningName := endpoint.SigningName\n\t\tif len(signingName) == 0 {\n\t\t\tsigningName = \"ecr\"\n\t\t}\n\t\tctx = awsmiddleware.SetSigningName(ctx, signingName)\n\t}\n\tctx = awsmiddleware.SetEndpointSource(ctx, endpoint.Source)\n\tctx = smithyhttp.SetHostnameImmutable(ctx, endpoint.HostnameImmutable)\n\tctx = awsmiddleware.SetSigningRegion(ctx, endpoint.SigningRegion)\n\tctx = awsmiddleware.SetPartitionID(ctx, endpoint.PartitionID)\n\treturn next.HandleSerialize(ctx, in)\n}\nfunc addResolveEndpointMiddleware(stack *middleware.Stack, o Options) error {\n\treturn stack.Serialize.Insert(&ResolveEndpoint{\n\t\tResolver: o.EndpointResolver,\n\t\tOptions:  o.EndpointOptions,\n\t}, \"OperationSerializer\", middleware.Before)\n}\n\nfunc removeResolveEndpointMiddleware(stack *middleware.Stack) error {\n\t_, err := stack.Serialize.Remove((&ResolveEndpoint{}).ID())\n\treturn err\n}\n\ntype wrappedEndpointResolver struct {\n\tawsResolver aws.EndpointResolverWithOptions\n}\n\nfunc (w *wrappedEndpointResolver) ResolveEndpoint(region string, options EndpointResolverOptions) (endpoint aws.Endpoint, err error) {\n\treturn w.awsResolver.ResolveEndpoint(ServiceID, region, options)\n}\n\ntype awsEndpointResolverAdaptor func(service, region string) (aws.Endpoint, error)\n\nfunc (a awsEndpointResolverAdaptor) ResolveEndpoint(service, region string, options ...interface{}) (aws.Endpoint, error) {\n\treturn a(service, region)\n}\n\nvar _ aws.EndpointResolverWithOptions = awsEndpointResolverAdaptor(nil)\n\n// withEndpointResolver returns an aws.EndpointResolverWithOptions that first delegates endpoint resolution to the awsResolver.\n// If awsResolver returns aws.EndpointNotFoundError error, the v1 resolver middleware will swallow the error,\n// and set an appropriate context flag such that fallback will occur when EndpointResolverV2 is invoked\n// via its middleware.\n//\n// If another error (besides aws.EndpointNotFoundError) is returned, then that error will be propagated.\nfunc withEndpointResolver(awsResolver aws.EndpointResolver, awsResolverWithOptions aws.EndpointResolverWithOptions) EndpointResolver {\n\tvar resolver aws.EndpointResolverWithOptions\n\n\tif awsResolverWithOptions != nil {\n\t\tresolver = awsResolverWithOptions\n\t} else if awsResolver != nil {\n\t\tresolver = awsEndpointResolverAdaptor(awsResolver.ResolveEndpoint)\n\t}\n\n\treturn &wrappedEndpointResolver{\n\t\tawsResolver: resolver,\n\t}\n}\n\nfunc finalizeClientEndpointResolverOptions(options *Options) {\n\toptions.EndpointOptions.LogDeprecated = options.ClientLogMode.IsDeprecatedUsage()\n\n\tif len(options.EndpointOptions.ResolvedRegion) == 0 {\n\t\tconst fipsInfix = \"-fips-\"\n\t\tconst fipsPrefix = \"fips-\"\n\t\tconst fipsSuffix = \"-fips\"\n\n\t\tif strings.Contains(options.Region, fipsInfix) ||\n\t\t\tstrings.Contains(options.Region, fipsPrefix) ||\n\t\t\tstrings.Contains(options.Region, fipsSuffix) {\n\t\t\toptions.EndpointOptions.ResolvedRegion = strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(\n\t\t\t\toptions.Region, fipsInfix, \"-\"), fipsPrefix, \"\"), fipsSuffix, \"\")\n\t\t\toptions.EndpointOptions.UseFIPSEndpoint = aws.FIPSEndpointStateEnabled\n\t\t}\n\t}\n\n}\n\nfunc resolveEndpointResolverV2(options *Options) {\n\tif options.EndpointResolverV2 == nil {\n\t\toptions.EndpointResolverV2 = NewDefaultEndpointResolverV2()\n\t}\n}\n\nfunc resolveBaseEndpoint(cfg aws.Config, o *Options) {\n\tif cfg.BaseEndpoint != nil {\n\t\to.BaseEndpoint = cfg.BaseEndpoint\n\t}\n\n\t_, g := os.LookupEnv(\"AWS_ENDPOINT_URL\")\n\t_, s := os.LookupEnv(\"AWS_ENDPOINT_URL_ECR\")\n\n\tif g && !s {\n\t\treturn\n\t}\n\n\tvalue, found, err := internalConfig.ResolveServiceBaseEndpoint(context.Background(), \"ECR\", cfg.ConfigSources)\n\tif found && err == nil {\n\t\to.BaseEndpoint = &value\n\t}\n}\n\nfunc bindRegion(region string) *string {\n\tif region == \"\" {\n\t\treturn nil\n\t}\n\treturn aws.String(endpoints.MapFIPSRegion(region))\n}\n\n// EndpointParameters provides the parameters that influence how endpoints are\n// resolved.\ntype EndpointParameters struct {\n\t// The AWS region used to dispatch the request.\n\t//\n\t// Parameter is\n\t// required.\n\t//\n\t// AWS::Region\n\tRegion *string\n\n\t// When true, use the dual-stack endpoint. If the configured endpoint does not\n\t// support dual-stack, dispatching the request MAY return an error.\n\t//\n\t// Defaults to\n\t// false if no value is provided.\n\t//\n\t// AWS::UseDualStack\n\tUseDualStack *bool\n\n\t// When true, send this request to the FIPS-compliant regional endpoint. If the\n\t// configured endpoint does not have a FIPS compliant endpoint, dispatching the\n\t// request will return an error.\n\t//\n\t// Defaults to false if no value is\n\t// provided.\n\t//\n\t// AWS::UseFIPS\n\tUseFIPS *bool\n\n\t// Override the endpoint used to send this request\n\t//\n\t// Parameter is\n\t// required.\n\t//\n\t// SDK::Endpoint\n\tEndpoint *string\n}\n\n// ValidateRequired validates required parameters are set.\nfunc (p EndpointParameters) ValidateRequired() error {\n\tif p.UseDualStack == nil {\n\t\treturn fmt.Errorf(\"parameter UseDualStack is required\")\n\t}\n\n\tif p.UseFIPS == nil {\n\t\treturn fmt.Errorf(\"parameter UseFIPS is required\")\n\t}\n\n\treturn nil\n}\n\n// WithDefaults returns a shallow copy of EndpointParameterswith default values\n// applied to members where applicable.\nfunc (p EndpointParameters) WithDefaults() EndpointParameters {\n\tif p.UseDualStack == nil {\n\t\tp.UseDualStack = ptr.Bool(false)\n\t}\n\n\tif p.UseFIPS == nil {\n\t\tp.UseFIPS = ptr.Bool(false)\n\t}\n\treturn p\n}\n\ntype stringSlice []string\n\nfunc (s stringSlice) Get(i int) *string {\n\tif i < 0 || i >= len(s) {\n\t\treturn nil\n\t}\n\n\tv := s[i]\n\treturn &v\n}\n\n// EndpointResolverV2 provides the interface for resolving service endpoints.\ntype EndpointResolverV2 interface {\n\t// ResolveEndpoint attempts to resolve the endpoint with the provided options,\n\t// returning the endpoint if found. Otherwise an error is returned.\n\tResolveEndpoint(ctx context.Context, params EndpointParameters) (\n\t\tsmithyendpoints.Endpoint, error,\n\t)\n}\n\n// resolver provides the implementation for resolving endpoints.\ntype resolver struct{}\n\nfunc NewDefaultEndpointResolverV2() EndpointResolverV2 {\n\treturn &resolver{}\n}\n\n// ResolveEndpoint attempts to resolve the endpoint with the provided options,\n// returning the endpoint if found. Otherwise an error is returned.\nfunc (r *resolver) ResolveEndpoint(\n\tctx context.Context, params EndpointParameters,\n) (\n\tendpoint smithyendpoints.Endpoint, err error,\n) {\n\tparams = params.WithDefaults()\n\tif err = params.ValidateRequired(); err != nil {\n\t\treturn endpoint, fmt.Errorf(\"endpoint parameters are not valid, %w\", err)\n\t}\n\t_UseDualStack := *params.UseDualStack\n\t_UseFIPS := *params.UseFIPS\n\n\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t_Endpoint := *exprVal\n\t\t_ = _Endpoint\n\t\tif _UseFIPS == true {\n\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid Configuration: FIPS and custom endpoint are not supported\")\n\t\t}\n\t\tif _UseDualStack == true {\n\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid Configuration: Dualstack and custom endpoint are not supported\")\n\t\t}\n\t\turiString := _Endpoint\n\n\t\turi, err := url.Parse(uriString)\n\t\tif err != nil {\n\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t}\n\n\t\treturn smithyendpoints.Endpoint{\n\t\t\tURI:     *uri,\n\t\t\tHeaders: http.Header{},\n\t\t}, nil\n\t}\n\tif exprVal := params.Region; exprVal != nil {\n\t\t_Region := *exprVal\n\t\t_ = _Region\n\t\tif exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil {\n\t\t\t_PartitionResult := *exprVal\n\t\t\t_ = _PartitionResult\n\t\t\tif _UseFIPS == true {\n\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\tif true == _PartitionResult.SupportsFIPS {\n\t\t\t\t\t\tif true == _PartitionResult.SupportsDualStack {\n\t\t\t\t\t\t\tif \"aws\" == _PartitionResult.Name {\n\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\tout.WriteString(\"https://ecr-fips.\")\n\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\tout.WriteString(\".api.aws\")\n\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif \"aws-us-gov\" == _PartitionResult.Name {\n\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\tout.WriteString(\"https://ecr-fips.\")\n\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\tout.WriteString(\".api.aws\")\n\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\tout.WriteString(\"https://api.ecr-fips.\")\n\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\tout.WriteString(_PartitionResult.DualStackDnsSuffix)\n\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"FIPS and DualStack are enabled, but this partition does not support one or both\")\n\t\t\t\t}\n\t\t\t}\n\t\t\tif _UseFIPS == true {\n\t\t\t\tif _PartitionResult.SupportsFIPS == true {\n\t\t\t\t\tif _PartitionResult.Name == \"aws\" {\n\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\tout.WriteString(\"https://ecr-fips.\")\n\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\tout.WriteString(\".amazonaws.com\")\n\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t}()\n\n\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t}, nil\n\t\t\t\t\t}\n\t\t\t\t\tif _PartitionResult.Name == \"aws-us-gov\" {\n\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\tout.WriteString(\"https://ecr-fips.\")\n\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\tout.WriteString(\".amazonaws.com\")\n\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t}()\n\n\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t}, nil\n\t\t\t\t\t}\n\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\tout.WriteString(\"https://api.ecr-fips.\")\n\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\tout.WriteString(_PartitionResult.DnsSuffix)\n\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t}()\n\n\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t}, nil\n\t\t\t\t}\n\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"FIPS is enabled but this partition does not support FIPS\")\n\t\t\t}\n\t\t\tif _UseDualStack == true {\n\t\t\t\tif true == _PartitionResult.SupportsDualStack {\n\t\t\t\t\tif \"aws\" == _PartitionResult.Name {\n\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\tout.WriteString(\"https://ecr.\")\n\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\tout.WriteString(\".api.aws\")\n\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t}()\n\n\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t}, nil\n\t\t\t\t\t}\n\t\t\t\t\tif \"aws-cn\" == _PartitionResult.Name {\n\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\tout.WriteString(\"https://ecr.\")\n\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\tout.WriteString(\".api.amazonwebservices.com.cn\")\n\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t}()\n\n\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t}, nil\n\t\t\t\t\t}\n\t\t\t\t\tif \"aws-us-gov\" == _PartitionResult.Name {\n\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\tout.WriteString(\"https://ecr.\")\n\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\tout.WriteString(\".api.aws\")\n\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t}()\n\n\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t}, nil\n\t\t\t\t\t}\n\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\tout.WriteString(\"https://api.ecr.\")\n\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\tout.WriteString(_PartitionResult.DualStackDnsSuffix)\n\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t}()\n\n\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t}, nil\n\t\t\t\t}\n\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"DualStack is enabled but this partition does not support DualStack\")\n\t\t\t}\n\t\t\turiString := func() string {\n\t\t\t\tvar out strings.Builder\n\t\t\t\tout.WriteString(\"https://api.ecr.\")\n\t\t\t\tout.WriteString(_Region)\n\t\t\t\tout.WriteString(\".\")\n\t\t\t\tout.WriteString(_PartitionResult.DnsSuffix)\n\t\t\t\treturn out.String()\n\t\t\t}()\n\n\t\t\turi, err := url.Parse(uriString)\n\t\t\tif err != nil {\n\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t}\n\n\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\tURI:     *uri,\n\t\t\t\tHeaders: http.Header{},\n\t\t\t}, nil\n\t\t}\n\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t}\n\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid Configuration: Missing Region\")\n}\n\ntype endpointParamsBinder interface {\n\tbindEndpointParams(*EndpointParameters)\n}\n\nfunc bindEndpointParams(ctx context.Context, input interface{}, options Options) *EndpointParameters {\n\tparams := &EndpointParameters{}\n\n\tparams.Region = bindRegion(options.Region)\n\tparams.UseDualStack = aws.Bool(options.EndpointOptions.UseDualStackEndpoint == aws.DualStackEndpointStateEnabled)\n\tparams.UseFIPS = aws.Bool(options.EndpointOptions.UseFIPSEndpoint == aws.FIPSEndpointStateEnabled)\n\tparams.Endpoint = options.BaseEndpoint\n\n\tif b, ok := input.(endpointParamsBinder); ok {\n\t\tb.bindEndpointParams(params)\n\t}\n\n\treturn params\n}\n\ntype resolveEndpointV2Middleware struct {\n\toptions Options\n}\n\nfunc (*resolveEndpointV2Middleware) ID() string {\n\treturn \"ResolveEndpointV2\"\n}\n\nfunc (m *resolveEndpointV2Middleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"ResolveEndpoint\")\n\tdefer span.End()\n\n\tif awsmiddleware.GetRequiresLegacyEndpoints(ctx) {\n\t\treturn next.HandleFinalize(ctx, in)\n\t}\n\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type %T\", in.Request)\n\t}\n\n\tif m.options.EndpointResolverV2 == nil {\n\t\treturn out, metadata, fmt.Errorf(\"expected endpoint resolver to not be nil\")\n\t}\n\n\tparams := bindEndpointParams(ctx, getOperationInput(ctx), m.options)\n\tendpt, err := timeOperationMetric(ctx, \"client.call.resolve_endpoint_duration\",\n\t\tfunc() (smithyendpoints.Endpoint, error) {\n\t\t\treturn m.options.EndpointResolverV2.ResolveEndpoint(ctx, *params)\n\t\t})\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"failed to resolve service endpoint, %w\", err)\n\t}\n\n\tspan.SetProperty(\"client.call.resolved_endpoint\", endpt.URI.String())\n\n\tif endpt.URI.RawPath == \"\" && req.URL.RawPath != \"\" {\n\t\tendpt.URI.RawPath = endpt.URI.Path\n\t}\n\treq.URL.Scheme = endpt.URI.Scheme\n\treq.URL.Host = endpt.URI.Host\n\treq.URL.Path = smithyhttp.JoinPath(endpt.URI.Path, req.URL.Path)\n\treq.URL.RawPath = smithyhttp.JoinPath(endpt.URI.RawPath, req.URL.RawPath)\n\tfor k := range endpt.Headers {\n\t\treq.Header.Set(k, endpt.Headers.Get(k))\n\t}\n\n\trscheme := getResolvedAuthScheme(ctx)\n\tif rscheme == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no resolved auth scheme\")\n\t}\n\n\topts, _ := smithyauth.GetAuthOptions(&endpt.Properties)\n\tfor _, o := range opts {\n\t\trscheme.SignerProperties.SetAll(&o.SignerProperties)\n\t}\n\n\tspan.End()\n\treturn next.HandleFinalize(ctx, in)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/generated.json",
    "content": "{\n    \"dependencies\": {\n        \"github.com/aws/aws-sdk-go-v2\": \"v1.4.0\",\n        \"github.com/aws/aws-sdk-go-v2/internal/configsources\": \"v0.0.0-00010101000000-000000000000\",\n        \"github.com/aws/aws-sdk-go-v2/internal/endpoints/v2\": \"v2.0.0-00010101000000-000000000000\",\n        \"github.com/aws/smithy-go\": \"v1.4.0\"\n    },\n    \"files\": [\n        \"api_client.go\",\n        \"api_client_test.go\",\n        \"api_op_BatchCheckLayerAvailability.go\",\n        \"api_op_BatchDeleteImage.go\",\n        \"api_op_BatchGetImage.go\",\n        \"api_op_BatchGetRepositoryScanningConfiguration.go\",\n        \"api_op_CompleteLayerUpload.go\",\n        \"api_op_CreatePullThroughCacheRule.go\",\n        \"api_op_CreateRepository.go\",\n        \"api_op_CreateRepositoryCreationTemplate.go\",\n        \"api_op_DeleteLifecyclePolicy.go\",\n        \"api_op_DeletePullThroughCacheRule.go\",\n        \"api_op_DeleteRegistryPolicy.go\",\n        \"api_op_DeleteRepository.go\",\n        \"api_op_DeleteRepositoryCreationTemplate.go\",\n        \"api_op_DeleteRepositoryPolicy.go\",\n        \"api_op_DescribeImageReplicationStatus.go\",\n        \"api_op_DescribeImageScanFindings.go\",\n        \"api_op_DescribeImages.go\",\n        \"api_op_DescribePullThroughCacheRules.go\",\n        \"api_op_DescribeRegistry.go\",\n        \"api_op_DescribeRepositories.go\",\n        \"api_op_DescribeRepositoryCreationTemplates.go\",\n        \"api_op_GetAccountSetting.go\",\n        \"api_op_GetAuthorizationToken.go\",\n        \"api_op_GetDownloadUrlForLayer.go\",\n        \"api_op_GetLifecyclePolicy.go\",\n        \"api_op_GetLifecyclePolicyPreview.go\",\n        \"api_op_GetRegistryPolicy.go\",\n        \"api_op_GetRegistryScanningConfiguration.go\",\n        \"api_op_GetRepositoryPolicy.go\",\n        \"api_op_InitiateLayerUpload.go\",\n        \"api_op_ListImages.go\",\n        \"api_op_ListTagsForResource.go\",\n        \"api_op_PutAccountSetting.go\",\n        \"api_op_PutImage.go\",\n        \"api_op_PutImageScanningConfiguration.go\",\n        \"api_op_PutImageTagMutability.go\",\n        \"api_op_PutLifecyclePolicy.go\",\n        \"api_op_PutRegistryPolicy.go\",\n        \"api_op_PutRegistryScanningConfiguration.go\",\n        \"api_op_PutReplicationConfiguration.go\",\n        \"api_op_SetRepositoryPolicy.go\",\n        \"api_op_StartImageScan.go\",\n        \"api_op_StartLifecyclePolicyPreview.go\",\n        \"api_op_TagResource.go\",\n        \"api_op_UntagResource.go\",\n        \"api_op_UpdatePullThroughCacheRule.go\",\n        \"api_op_UpdateRepositoryCreationTemplate.go\",\n        \"api_op_UploadLayerPart.go\",\n        \"api_op_ValidatePullThroughCacheRule.go\",\n        \"auth.go\",\n        \"deserializers.go\",\n        \"doc.go\",\n        \"endpoints.go\",\n        \"endpoints_config_test.go\",\n        \"endpoints_test.go\",\n        \"generated.json\",\n        \"internal/endpoints/endpoints.go\",\n        \"internal/endpoints/endpoints_test.go\",\n        \"options.go\",\n        \"protocol_test.go\",\n        \"serializers.go\",\n        \"snapshot_test.go\",\n        \"sra_operation_order_test.go\",\n        \"types/enums.go\",\n        \"types/errors.go\",\n        \"types/types.go\",\n        \"validators.go\"\n    ],\n    \"go\": \"1.22\",\n    \"module\": \"github.com/aws/aws-sdk-go-v2/service/ecr\",\n    \"unstable\": false\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/go_module_metadata.go",
    "content": "// Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT.\n\npackage ecr\n\n// goModuleVersion is the tagged release for this module\nconst goModuleVersion = \"1.44.0\"\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/internal/endpoints/endpoints.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage endpoints\n\nimport (\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\tendpoints \"github.com/aws/aws-sdk-go-v2/internal/endpoints/v2\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"regexp\"\n)\n\n// Options is the endpoint resolver configuration options\ntype Options struct {\n\t// Logger is a logging implementation that log events should be sent to.\n\tLogger logging.Logger\n\n\t// LogDeprecated indicates that deprecated endpoints should be logged to the\n\t// provided logger.\n\tLogDeprecated bool\n\n\t// ResolvedRegion is used to override the region to be resolved, rather then the\n\t// using the value passed to the ResolveEndpoint method. This value is used by the\n\t// SDK to translate regions like fips-us-east-1 or us-east-1-fips to an alternative\n\t// name. You must not set this value directly in your application.\n\tResolvedRegion string\n\n\t// DisableHTTPS informs the resolver to return an endpoint that does not use the\n\t// HTTPS scheme.\n\tDisableHTTPS bool\n\n\t// UseDualStackEndpoint specifies the resolver must resolve a dual-stack endpoint.\n\tUseDualStackEndpoint aws.DualStackEndpointState\n\n\t// UseFIPSEndpoint specifies the resolver must resolve a FIPS endpoint.\n\tUseFIPSEndpoint aws.FIPSEndpointState\n}\n\nfunc (o Options) GetResolvedRegion() string {\n\treturn o.ResolvedRegion\n}\n\nfunc (o Options) GetDisableHTTPS() bool {\n\treturn o.DisableHTTPS\n}\n\nfunc (o Options) GetUseDualStackEndpoint() aws.DualStackEndpointState {\n\treturn o.UseDualStackEndpoint\n}\n\nfunc (o Options) GetUseFIPSEndpoint() aws.FIPSEndpointState {\n\treturn o.UseFIPSEndpoint\n}\n\nfunc transformToSharedOptions(options Options) endpoints.Options {\n\treturn endpoints.Options{\n\t\tLogger:               options.Logger,\n\t\tLogDeprecated:        options.LogDeprecated,\n\t\tResolvedRegion:       options.ResolvedRegion,\n\t\tDisableHTTPS:         options.DisableHTTPS,\n\t\tUseDualStackEndpoint: options.UseDualStackEndpoint,\n\t\tUseFIPSEndpoint:      options.UseFIPSEndpoint,\n\t}\n}\n\n// Resolver ECR endpoint resolver\ntype Resolver struct {\n\tpartitions endpoints.Partitions\n}\n\n// ResolveEndpoint resolves the service endpoint for the given region and options\nfunc (r *Resolver) ResolveEndpoint(region string, options Options) (endpoint aws.Endpoint, err error) {\n\tif len(region) == 0 {\n\t\treturn endpoint, &aws.MissingRegionError{}\n\t}\n\n\topt := transformToSharedOptions(options)\n\treturn r.partitions.ResolveEndpoint(region, opt)\n}\n\n// New returns a new Resolver\nfunc New() *Resolver {\n\treturn &Resolver{\n\t\tpartitions: defaultPartitions,\n\t}\n}\n\nvar partitionRegexp = struct {\n\tAws      *regexp.Regexp\n\tAwsCn    *regexp.Regexp\n\tAwsEusc  *regexp.Regexp\n\tAwsIso   *regexp.Regexp\n\tAwsIsoB  *regexp.Regexp\n\tAwsIsoE  *regexp.Regexp\n\tAwsIsoF  *regexp.Regexp\n\tAwsUsGov *regexp.Regexp\n}{\n\n\tAws:      regexp.MustCompile(\"^(us|eu|ap|sa|ca|me|af|il|mx)\\\\-\\\\w+\\\\-\\\\d+$\"),\n\tAwsCn:    regexp.MustCompile(\"^cn\\\\-\\\\w+\\\\-\\\\d+$\"),\n\tAwsEusc:  regexp.MustCompile(\"^eusc\\\\-(de)\\\\-\\\\w+\\\\-\\\\d+$\"),\n\tAwsIso:   regexp.MustCompile(\"^us\\\\-iso\\\\-\\\\w+\\\\-\\\\d+$\"),\n\tAwsIsoB:  regexp.MustCompile(\"^us\\\\-isob\\\\-\\\\w+\\\\-\\\\d+$\"),\n\tAwsIsoE:  regexp.MustCompile(\"^eu\\\\-isoe\\\\-\\\\w+\\\\-\\\\d+$\"),\n\tAwsIsoF:  regexp.MustCompile(\"^us\\\\-isof\\\\-\\\\w+\\\\-\\\\d+$\"),\n\tAwsUsGov: regexp.MustCompile(\"^us\\\\-gov\\\\-\\\\w+\\\\-\\\\d+$\"),\n}\n\nvar defaultPartitions = endpoints.Partitions{\n\t{\n\t\tID: \"aws\",\n\t\tDefaults: map[endpoints.DefaultKey]endpoints.Endpoint{\n\t\t\t{\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr.{region}.api.aws\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"ecr-fips.{region}.amazonaws.com\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant | endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-fips.{region}.api.aws\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: 0,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr.{region}.amazonaws.com\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t},\n\t\tRegionRegex:    partitionRegexp.Aws,\n\t\tIsRegionalized: true,\n\t\tEndpoints: endpoints.Endpoints{\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"af-south-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.af-south-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"af-south-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"af-south-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.af-south-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"af-south-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"ap-east-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.ap-east-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-east-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"ap-east-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.ap-east-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-east-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"ap-northeast-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.ap-northeast-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-northeast-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"ap-northeast-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.ap-northeast-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-northeast-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"ap-northeast-2\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.ap-northeast-2.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-northeast-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"ap-northeast-2\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.ap-northeast-2.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-northeast-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"ap-northeast-3\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.ap-northeast-3.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-northeast-3\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"ap-northeast-3\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.ap-northeast-3.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-northeast-3\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"ap-south-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.ap-south-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-south-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"ap-south-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.ap-south-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-south-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"ap-south-2\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.ap-south-2.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-south-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"ap-south-2\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.ap-south-2.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-south-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"ap-southeast-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.ap-southeast-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-southeast-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"ap-southeast-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.ap-southeast-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-southeast-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"ap-southeast-2\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.ap-southeast-2.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-southeast-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"ap-southeast-2\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.ap-southeast-2.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-southeast-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"ap-southeast-3\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.ap-southeast-3.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-southeast-3\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"ap-southeast-3\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.ap-southeast-3.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-southeast-3\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"ap-southeast-4\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.ap-southeast-4.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-southeast-4\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"ap-southeast-4\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.ap-southeast-4.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-southeast-4\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"ap-southeast-5\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.ap-southeast-5.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-southeast-5\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"ap-southeast-5\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.ap-southeast-5.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-southeast-5\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"ap-southeast-7\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.ap-southeast-7.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-southeast-7\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"ap-southeast-7\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.ap-southeast-7.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ap-southeast-7\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"ca-central-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.ca-central-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ca-central-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"ca-central-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.ca-central-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ca-central-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"ca-west-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.ca-west-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ca-west-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"ca-west-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.ca-west-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"ca-west-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"dkr-us-east-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-east-1\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"dkr-us-east-1\",\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-fips.us-east-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-east-1\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"dkr-us-east-2\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-east-2\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"dkr-us-east-2\",\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-fips.us-east-2.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-east-2\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"dkr-us-west-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-west-1\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"dkr-us-west-1\",\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-fips.us-west-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-west-1\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"dkr-us-west-2\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-west-2\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"dkr-us-west-2\",\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-fips.us-west-2.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-west-2\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"eu-central-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.eu-central-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"eu-central-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"eu-central-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.eu-central-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"eu-central-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"eu-central-2\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.eu-central-2.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"eu-central-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"eu-central-2\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.eu-central-2.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"eu-central-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"eu-north-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.eu-north-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"eu-north-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"eu-north-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.eu-north-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"eu-north-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"eu-south-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.eu-south-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"eu-south-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"eu-south-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.eu-south-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"eu-south-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"eu-south-2\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.eu-south-2.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"eu-south-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"eu-south-2\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.eu-south-2.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"eu-south-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"eu-west-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.eu-west-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"eu-west-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"eu-west-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.eu-west-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"eu-west-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"eu-west-2\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.eu-west-2.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"eu-west-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"eu-west-2\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.eu-west-2.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"eu-west-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"eu-west-3\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.eu-west-3.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"eu-west-3\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"eu-west-3\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.eu-west-3.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"eu-west-3\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"fips-dkr-us-east-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"ecr-fips.us-east-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-east-1\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"fips-dkr-us-east-2\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"ecr-fips.us-east-2.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-east-2\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"fips-dkr-us-west-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"ecr-fips.us-west-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-west-1\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"fips-dkr-us-west-2\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"ecr-fips.us-west-2.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-west-2\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"fips-us-east-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"ecr-fips.us-east-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-east-1\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"fips-us-east-2\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"ecr-fips.us-east-2.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-east-2\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"fips-us-west-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"ecr-fips.us-west-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-west-1\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"fips-us-west-2\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"ecr-fips.us-west-2.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-west-2\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"il-central-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.il-central-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"il-central-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"il-central-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.il-central-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"il-central-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"me-central-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.me-central-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"me-central-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"me-central-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.me-central-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"me-central-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"me-south-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.me-south-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"me-south-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"me-south-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.me-south-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"me-south-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"mx-central-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.mx-central-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"mx-central-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"mx-central-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.mx-central-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"mx-central-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"sa-east-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.sa-east-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"sa-east-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"sa-east-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.sa-east-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"sa-east-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"us-east-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.us-east-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-east-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-east-1\",\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-fips.us-east-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-east-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-east-1\",\n\t\t\t\tVariant: endpoints.FIPSVariant | endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-fips.us-east-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-east-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-east-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.us-east-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-east-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"us-east-2\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.us-east-2.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-east-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-east-2\",\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-fips.us-east-2.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-east-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-east-2\",\n\t\t\t\tVariant: endpoints.FIPSVariant | endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-fips.us-east-2.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-east-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-east-2\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.us-east-2.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-east-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"us-west-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.us-west-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-west-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-west-1\",\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-fips.us-west-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-west-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-west-1\",\n\t\t\t\tVariant: endpoints.FIPSVariant | endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-fips.us-west-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-west-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-west-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.us-west-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-west-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"us-west-2\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.us-west-2.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-west-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-west-2\",\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-fips.us-west-2.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-west-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-west-2\",\n\t\t\t\tVariant: endpoints.FIPSVariant | endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-fips.us-west-2.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-west-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-west-2\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.us-west-2.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-west-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tID: \"aws-cn\",\n\t\tDefaults: map[endpoints.DefaultKey]endpoints.Endpoint{\n\t\t\t{\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr.{region}.api.amazonwebservices.com.cn\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-fips.{region}.amazonaws.com.cn\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant | endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-fips.{region}.api.amazonwebservices.com.cn\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: 0,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr.{region}.amazonaws.com.cn\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t},\n\t\tRegionRegex:    partitionRegexp.AwsCn,\n\t\tIsRegionalized: true,\n\t\tEndpoints: endpoints.Endpoints{\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"cn-north-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.cn-north-1.amazonaws.com.cn\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"cn-north-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"cn-north-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.cn-north-1.api.amazonwebservices.com.cn\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"cn-north-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"cn-northwest-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.cn-northwest-1.amazonaws.com.cn\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"cn-northwest-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"cn-northwest-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.cn-northwest-1.api.amazonwebservices.com.cn\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"cn-northwest-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tID: \"aws-eusc\",\n\t\tDefaults: map[endpoints.DefaultKey]endpoints.Endpoint{\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-fips.{region}.amazonaws.eu\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: 0,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr.{region}.amazonaws.eu\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t},\n\t\tRegionRegex:    partitionRegexp.AwsEusc,\n\t\tIsRegionalized: true,\n\t},\n\t{\n\t\tID: \"aws-iso\",\n\t\tDefaults: map[endpoints.DefaultKey]endpoints.Endpoint{\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-fips.{region}.c2s.ic.gov\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: 0,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr.{region}.c2s.ic.gov\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t},\n\t\tRegionRegex:    partitionRegexp.AwsIso,\n\t\tIsRegionalized: true,\n\t\tEndpoints: endpoints.Endpoints{\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"us-iso-east-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.us-iso-east-1.c2s.ic.gov\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-iso-east-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"us-iso-west-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.us-iso-west-1.c2s.ic.gov\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-iso-west-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tID: \"aws-iso-b\",\n\t\tDefaults: map[endpoints.DefaultKey]endpoints.Endpoint{\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-fips.{region}.sc2s.sgov.gov\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: 0,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr.{region}.sc2s.sgov.gov\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t},\n\t\tRegionRegex:    partitionRegexp.AwsIsoB,\n\t\tIsRegionalized: true,\n\t\tEndpoints: endpoints.Endpoints{\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"us-isob-east-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.us-isob-east-1.sc2s.sgov.gov\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-isob-east-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tID: \"aws-iso-e\",\n\t\tDefaults: map[endpoints.DefaultKey]endpoints.Endpoint{\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-fips.{region}.cloud.adc-e.uk\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: 0,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr.{region}.cloud.adc-e.uk\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t},\n\t\tRegionRegex:    partitionRegexp.AwsIsoE,\n\t\tIsRegionalized: true,\n\t\tEndpoints: endpoints.Endpoints{\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"eu-isoe-west-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.eu-isoe-west-1.cloud.adc-e.uk\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"eu-isoe-west-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tID: \"aws-iso-f\",\n\t\tDefaults: map[endpoints.DefaultKey]endpoints.Endpoint{\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-fips.{region}.csp.hci.ic.gov\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: 0,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr.{region}.csp.hci.ic.gov\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t},\n\t\tRegionRegex:    partitionRegexp.AwsIsoF,\n\t\tIsRegionalized: true,\n\t\tEndpoints: endpoints.Endpoints{\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"us-isof-east-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.us-isof-east-1.csp.hci.ic.gov\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-isof-east-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"us-isof-south-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.us-isof-south-1.csp.hci.ic.gov\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-isof-south-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tID: \"aws-us-gov\",\n\t\tDefaults: map[endpoints.DefaultKey]endpoints.Endpoint{\n\t\t\t{\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr.{region}.api.aws\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"ecr-fips.{region}.amazonaws.com\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant | endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-fips.{region}.api.aws\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: 0,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr.{region}.amazonaws.com\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t},\n\t\tRegionRegex:    partitionRegexp.AwsUsGov,\n\t\tIsRegionalized: true,\n\t\tEndpoints: endpoints.Endpoints{\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"dkr-us-gov-east-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-gov-east-1\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"dkr-us-gov-east-1\",\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-fips.us-gov-east-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-gov-east-1\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"dkr-us-gov-west-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-gov-west-1\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"dkr-us-gov-west-1\",\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-fips.us-gov-west-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-gov-west-1\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"fips-dkr-us-gov-east-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"ecr-fips.us-gov-east-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-gov-east-1\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"fips-dkr-us-gov-west-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"ecr-fips.us-gov-west-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-gov-west-1\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"fips-us-gov-east-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"ecr-fips.us-gov-east-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-gov-east-1\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"fips-us-gov-west-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"ecr-fips.us-gov-west-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-gov-west-1\",\n\t\t\t\t},\n\t\t\t\tDeprecated: aws.TrueTernary,\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"us-gov-east-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.us-gov-east-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-gov-east-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-gov-east-1\",\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-fips.us-gov-east-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-gov-east-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-gov-east-1\",\n\t\t\t\tVariant: endpoints.FIPSVariant | endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-fips.us-gov-east-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-gov-east-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-gov-east-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.us-gov-east-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-gov-east-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"us-gov-west-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr.us-gov-west-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-gov-west-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-gov-west-1\",\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-fips.us-gov-west-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-gov-west-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-gov-west-1\",\n\t\t\t\tVariant: endpoints.FIPSVariant | endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-fips.us-gov-west-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-gov-west-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-gov-west-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr.us-gov-west-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-gov-west-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/options.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\tinternalauthsmithy \"github.com/aws/aws-sdk-go-v2/internal/auth/smithy\"\n\tsmithyauth \"github.com/aws/smithy-go/auth\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"github.com/aws/smithy-go/metrics\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"net/http\"\n)\n\ntype HTTPClient interface {\n\tDo(*http.Request) (*http.Response, error)\n}\n\ntype Options struct {\n\t// Set of options to modify how an operation is invoked. These apply to all\n\t// operations invoked for this client. Use functional options on operation call to\n\t// modify this list for per operation behavior.\n\tAPIOptions []func(*middleware.Stack) error\n\n\t// The optional application specific identifier appended to the User-Agent header.\n\tAppID string\n\n\t// This endpoint will be given as input to an EndpointResolverV2. It is used for\n\t// providing a custom base endpoint that is subject to modifications by the\n\t// processing EndpointResolverV2.\n\tBaseEndpoint *string\n\n\t// Configures the events that will be sent to the configured logger.\n\tClientLogMode aws.ClientLogMode\n\n\t// The credentials object to use when signing requests.\n\tCredentials aws.CredentialsProvider\n\n\t// The configuration DefaultsMode that the SDK should use when constructing the\n\t// clients initial default settings.\n\tDefaultsMode aws.DefaultsMode\n\n\t// The endpoint options to be used when attempting to resolve an endpoint.\n\tEndpointOptions EndpointResolverOptions\n\n\t// The service endpoint resolver.\n\t//\n\t// Deprecated: Deprecated: EndpointResolver and WithEndpointResolver. Providing a\n\t// value for this field will likely prevent you from using any endpoint-related\n\t// service features released after the introduction of EndpointResolverV2 and\n\t// BaseEndpoint.\n\t//\n\t// To migrate an EndpointResolver implementation that uses a custom endpoint, set\n\t// the client option BaseEndpoint instead.\n\tEndpointResolver EndpointResolver\n\n\t// Resolves the endpoint used for a particular service operation. This should be\n\t// used over the deprecated EndpointResolver.\n\tEndpointResolverV2 EndpointResolverV2\n\n\t// Signature Version 4 (SigV4) Signer\n\tHTTPSignerV4 HTTPSignerV4\n\n\t// The logger writer interface to write logging messages to.\n\tLogger logging.Logger\n\n\t// The client meter provider.\n\tMeterProvider metrics.MeterProvider\n\n\t// The region to send requests to. (Required)\n\tRegion string\n\n\t// RetryMaxAttempts specifies the maximum number attempts an API client will call\n\t// an operation that fails with a retryable error. A value of 0 is ignored, and\n\t// will not be used to configure the API client created default retryer, or modify\n\t// per operation call's retry max attempts.\n\t//\n\t// If specified in an operation call's functional options with a value that is\n\t// different than the constructed client's Options, the Client's Retryer will be\n\t// wrapped to use the operation's specific RetryMaxAttempts value.\n\tRetryMaxAttempts int\n\n\t// RetryMode specifies the retry mode the API client will be created with, if\n\t// Retryer option is not also specified.\n\t//\n\t// When creating a new API Clients this member will only be used if the Retryer\n\t// Options member is nil. This value will be ignored if Retryer is not nil.\n\t//\n\t// Currently does not support per operation call overrides, may in the future.\n\tRetryMode aws.RetryMode\n\n\t// Retryer guides how HTTP requests should be retried in case of recoverable\n\t// failures. When nil the API client will use a default retryer. The kind of\n\t// default retry created by the API client can be changed with the RetryMode\n\t// option.\n\tRetryer aws.Retryer\n\n\t// The RuntimeEnvironment configuration, only populated if the DefaultsMode is set\n\t// to DefaultsModeAuto and is initialized using config.LoadDefaultConfig . You\n\t// should not populate this structure programmatically, or rely on the values here\n\t// within your applications.\n\tRuntimeEnvironment aws.RuntimeEnvironment\n\n\t// The client tracer provider.\n\tTracerProvider tracing.TracerProvider\n\n\t// The initial DefaultsMode used when the client options were constructed. If the\n\t// DefaultsMode was set to aws.DefaultsModeAuto this will store what the resolved\n\t// value was at that point in time.\n\t//\n\t// Currently does not support per operation call overrides, may in the future.\n\tresolvedDefaultsMode aws.DefaultsMode\n\n\t// The HTTP client to invoke API calls with. Defaults to client's default HTTP\n\t// implementation if nil.\n\tHTTPClient HTTPClient\n\n\t// The auth scheme resolver which determines how to authenticate for each\n\t// operation.\n\tAuthSchemeResolver AuthSchemeResolver\n\n\t// The list of auth schemes supported by the client.\n\tAuthSchemes []smithyhttp.AuthScheme\n}\n\n// Copy creates a clone where the APIOptions list is deep copied.\nfunc (o Options) Copy() Options {\n\tto := o\n\tto.APIOptions = make([]func(*middleware.Stack) error, len(o.APIOptions))\n\tcopy(to.APIOptions, o.APIOptions)\n\n\treturn to\n}\n\nfunc (o Options) GetIdentityResolver(schemeID string) smithyauth.IdentityResolver {\n\tif schemeID == \"aws.auth#sigv4\" {\n\t\treturn getSigV4IdentityResolver(o)\n\t}\n\tif schemeID == \"smithy.api#noAuth\" {\n\t\treturn &smithyauth.AnonymousIdentityResolver{}\n\t}\n\treturn nil\n}\n\n// WithAPIOptions returns a functional option for setting the Client's APIOptions\n// option.\nfunc WithAPIOptions(optFns ...func(*middleware.Stack) error) func(*Options) {\n\treturn func(o *Options) {\n\t\to.APIOptions = append(o.APIOptions, optFns...)\n\t}\n}\n\n// Deprecated: EndpointResolver and WithEndpointResolver. Providing a value for\n// this field will likely prevent you from using any endpoint-related service\n// features released after the introduction of EndpointResolverV2 and BaseEndpoint.\n//\n// To migrate an EndpointResolver implementation that uses a custom endpoint, set\n// the client option BaseEndpoint instead.\nfunc WithEndpointResolver(v EndpointResolver) func(*Options) {\n\treturn func(o *Options) {\n\t\to.EndpointResolver = v\n\t}\n}\n\n// WithEndpointResolverV2 returns a functional option for setting the Client's\n// EndpointResolverV2 option.\nfunc WithEndpointResolverV2(v EndpointResolverV2) func(*Options) {\n\treturn func(o *Options) {\n\t\to.EndpointResolverV2 = v\n\t}\n}\n\nfunc getSigV4IdentityResolver(o Options) smithyauth.IdentityResolver {\n\tif o.Credentials != nil {\n\t\treturn &internalauthsmithy.CredentialsProviderAdapter{Provider: o.Credentials}\n\t}\n\treturn nil\n}\n\n// WithSigV4SigningName applies an override to the authentication workflow to\n// use the given signing name for SigV4-authenticated operations.\n//\n// This is an advanced setting. The value here is FINAL, taking precedence over\n// the resolved signing name from both auth scheme resolution and endpoint\n// resolution.\nfunc WithSigV4SigningName(name string) func(*Options) {\n\tfn := func(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\t\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n\t) {\n\t\treturn next.HandleInitialize(awsmiddleware.SetSigningName(ctx, name), in)\n\t}\n\treturn func(o *Options) {\n\t\to.APIOptions = append(o.APIOptions, func(s *middleware.Stack) error {\n\t\t\treturn s.Initialize.Add(\n\t\t\t\tmiddleware.InitializeMiddlewareFunc(\"withSigV4SigningName\", fn),\n\t\t\t\tmiddleware.Before,\n\t\t\t)\n\t\t})\n\t}\n}\n\n// WithSigV4SigningRegion applies an override to the authentication workflow to\n// use the given signing region for SigV4-authenticated operations.\n//\n// This is an advanced setting. The value here is FINAL, taking precedence over\n// the resolved signing region from both auth scheme resolution and endpoint\n// resolution.\nfunc WithSigV4SigningRegion(region string) func(*Options) {\n\tfn := func(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\t\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n\t) {\n\t\treturn next.HandleInitialize(awsmiddleware.SetSigningRegion(ctx, region), in)\n\t}\n\treturn func(o *Options) {\n\t\to.APIOptions = append(o.APIOptions, func(s *middleware.Stack) error {\n\t\t\treturn s.Initialize.Add(\n\t\t\t\tmiddleware.InitializeMiddlewareFunc(\"withSigV4SigningRegion\", fn),\n\t\t\t\tmiddleware.Before,\n\t\t\t)\n\t\t})\n\t}\n}\n\nfunc ignoreAnonymousAuth(options *Options) {\n\tif aws.IsCredentialsProvider(options.Credentials, (*aws.AnonymousCredentials)(nil)) {\n\t\toptions.Credentials = nil\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/serializers.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\tsmithy \"github.com/aws/smithy-go\"\n\t\"github.com/aws/smithy-go/encoding/httpbinding\"\n\tsmithyjson \"github.com/aws/smithy-go/encoding/json\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"path\"\n)\n\ntype awsAwsjson11_serializeOpBatchCheckLayerAvailability struct {\n}\n\nfunc (*awsAwsjson11_serializeOpBatchCheckLayerAvailability) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpBatchCheckLayerAvailability) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*BatchCheckLayerAvailabilityInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.BatchCheckLayerAvailability\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentBatchCheckLayerAvailabilityInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpBatchDeleteImage struct {\n}\n\nfunc (*awsAwsjson11_serializeOpBatchDeleteImage) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpBatchDeleteImage) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*BatchDeleteImageInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.BatchDeleteImage\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentBatchDeleteImageInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpBatchGetImage struct {\n}\n\nfunc (*awsAwsjson11_serializeOpBatchGetImage) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpBatchGetImage) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*BatchGetImageInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.BatchGetImage\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentBatchGetImageInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpBatchGetRepositoryScanningConfiguration struct {\n}\n\nfunc (*awsAwsjson11_serializeOpBatchGetRepositoryScanningConfiguration) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpBatchGetRepositoryScanningConfiguration) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*BatchGetRepositoryScanningConfigurationInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.BatchGetRepositoryScanningConfiguration\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentBatchGetRepositoryScanningConfigurationInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpCompleteLayerUpload struct {\n}\n\nfunc (*awsAwsjson11_serializeOpCompleteLayerUpload) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpCompleteLayerUpload) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*CompleteLayerUploadInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.CompleteLayerUpload\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentCompleteLayerUploadInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpCreatePullThroughCacheRule struct {\n}\n\nfunc (*awsAwsjson11_serializeOpCreatePullThroughCacheRule) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpCreatePullThroughCacheRule) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*CreatePullThroughCacheRuleInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.CreatePullThroughCacheRule\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentCreatePullThroughCacheRuleInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpCreateRepository struct {\n}\n\nfunc (*awsAwsjson11_serializeOpCreateRepository) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpCreateRepository) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*CreateRepositoryInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.CreateRepository\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentCreateRepositoryInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpCreateRepositoryCreationTemplate struct {\n}\n\nfunc (*awsAwsjson11_serializeOpCreateRepositoryCreationTemplate) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpCreateRepositoryCreationTemplate) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*CreateRepositoryCreationTemplateInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.CreateRepositoryCreationTemplate\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentCreateRepositoryCreationTemplateInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDeleteLifecyclePolicy struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDeleteLifecyclePolicy) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDeleteLifecyclePolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DeleteLifecyclePolicyInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.DeleteLifecyclePolicy\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDeleteLifecyclePolicyInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDeletePullThroughCacheRule struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDeletePullThroughCacheRule) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDeletePullThroughCacheRule) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DeletePullThroughCacheRuleInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.DeletePullThroughCacheRule\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDeletePullThroughCacheRuleInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDeleteRegistryPolicy struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDeleteRegistryPolicy) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDeleteRegistryPolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DeleteRegistryPolicyInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.DeleteRegistryPolicy\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDeleteRegistryPolicyInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDeleteRepository struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDeleteRepository) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDeleteRepository) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DeleteRepositoryInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.DeleteRepository\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDeleteRepositoryInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDeleteRepositoryCreationTemplate struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDeleteRepositoryCreationTemplate) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDeleteRepositoryCreationTemplate) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DeleteRepositoryCreationTemplateInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.DeleteRepositoryCreationTemplate\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDeleteRepositoryCreationTemplateInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDeleteRepositoryPolicy struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDeleteRepositoryPolicy) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDeleteRepositoryPolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DeleteRepositoryPolicyInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.DeleteRepositoryPolicy\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDeleteRepositoryPolicyInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDescribeImageReplicationStatus struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDescribeImageReplicationStatus) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDescribeImageReplicationStatus) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DescribeImageReplicationStatusInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.DescribeImageReplicationStatus\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDescribeImageReplicationStatusInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDescribeImages struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDescribeImages) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDescribeImages) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DescribeImagesInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.DescribeImages\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDescribeImagesInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDescribeImageScanFindings struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDescribeImageScanFindings) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDescribeImageScanFindings) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DescribeImageScanFindingsInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.DescribeImageScanFindings\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDescribeImageScanFindingsInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDescribePullThroughCacheRules struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDescribePullThroughCacheRules) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDescribePullThroughCacheRules) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DescribePullThroughCacheRulesInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.DescribePullThroughCacheRules\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDescribePullThroughCacheRulesInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDescribeRegistry struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDescribeRegistry) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDescribeRegistry) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DescribeRegistryInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.DescribeRegistry\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDescribeRegistryInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDescribeRepositories struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDescribeRepositories) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDescribeRepositories) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DescribeRepositoriesInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.DescribeRepositories\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDescribeRepositoriesInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDescribeRepositoryCreationTemplates struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDescribeRepositoryCreationTemplates) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDescribeRepositoryCreationTemplates) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DescribeRepositoryCreationTemplatesInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.DescribeRepositoryCreationTemplates\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDescribeRepositoryCreationTemplatesInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpGetAccountSetting struct {\n}\n\nfunc (*awsAwsjson11_serializeOpGetAccountSetting) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpGetAccountSetting) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*GetAccountSettingInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.GetAccountSetting\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentGetAccountSettingInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpGetAuthorizationToken struct {\n}\n\nfunc (*awsAwsjson11_serializeOpGetAuthorizationToken) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpGetAuthorizationToken) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*GetAuthorizationTokenInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.GetAuthorizationToken\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentGetAuthorizationTokenInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpGetDownloadUrlForLayer struct {\n}\n\nfunc (*awsAwsjson11_serializeOpGetDownloadUrlForLayer) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpGetDownloadUrlForLayer) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*GetDownloadUrlForLayerInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.GetDownloadUrlForLayer\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentGetDownloadUrlForLayerInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpGetLifecyclePolicy struct {\n}\n\nfunc (*awsAwsjson11_serializeOpGetLifecyclePolicy) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpGetLifecyclePolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*GetLifecyclePolicyInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.GetLifecyclePolicy\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentGetLifecyclePolicyInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpGetLifecyclePolicyPreview struct {\n}\n\nfunc (*awsAwsjson11_serializeOpGetLifecyclePolicyPreview) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpGetLifecyclePolicyPreview) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*GetLifecyclePolicyPreviewInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.GetLifecyclePolicyPreview\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentGetLifecyclePolicyPreviewInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpGetRegistryPolicy struct {\n}\n\nfunc (*awsAwsjson11_serializeOpGetRegistryPolicy) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpGetRegistryPolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*GetRegistryPolicyInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.GetRegistryPolicy\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentGetRegistryPolicyInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpGetRegistryScanningConfiguration struct {\n}\n\nfunc (*awsAwsjson11_serializeOpGetRegistryScanningConfiguration) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpGetRegistryScanningConfiguration) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*GetRegistryScanningConfigurationInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.GetRegistryScanningConfiguration\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentGetRegistryScanningConfigurationInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpGetRepositoryPolicy struct {\n}\n\nfunc (*awsAwsjson11_serializeOpGetRepositoryPolicy) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpGetRepositoryPolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*GetRepositoryPolicyInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.GetRepositoryPolicy\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentGetRepositoryPolicyInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpInitiateLayerUpload struct {\n}\n\nfunc (*awsAwsjson11_serializeOpInitiateLayerUpload) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpInitiateLayerUpload) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*InitiateLayerUploadInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.InitiateLayerUpload\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentInitiateLayerUploadInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpListImages struct {\n}\n\nfunc (*awsAwsjson11_serializeOpListImages) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpListImages) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*ListImagesInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.ListImages\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentListImagesInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpListTagsForResource struct {\n}\n\nfunc (*awsAwsjson11_serializeOpListTagsForResource) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpListTagsForResource) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*ListTagsForResourceInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.ListTagsForResource\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentListTagsForResourceInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpPutAccountSetting struct {\n}\n\nfunc (*awsAwsjson11_serializeOpPutAccountSetting) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpPutAccountSetting) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*PutAccountSettingInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.PutAccountSetting\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentPutAccountSettingInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpPutImage struct {\n}\n\nfunc (*awsAwsjson11_serializeOpPutImage) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpPutImage) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*PutImageInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.PutImage\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentPutImageInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpPutImageScanningConfiguration struct {\n}\n\nfunc (*awsAwsjson11_serializeOpPutImageScanningConfiguration) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpPutImageScanningConfiguration) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*PutImageScanningConfigurationInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.PutImageScanningConfiguration\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentPutImageScanningConfigurationInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpPutImageTagMutability struct {\n}\n\nfunc (*awsAwsjson11_serializeOpPutImageTagMutability) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpPutImageTagMutability) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*PutImageTagMutabilityInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.PutImageTagMutability\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentPutImageTagMutabilityInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpPutLifecyclePolicy struct {\n}\n\nfunc (*awsAwsjson11_serializeOpPutLifecyclePolicy) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpPutLifecyclePolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*PutLifecyclePolicyInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.PutLifecyclePolicy\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentPutLifecyclePolicyInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpPutRegistryPolicy struct {\n}\n\nfunc (*awsAwsjson11_serializeOpPutRegistryPolicy) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpPutRegistryPolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*PutRegistryPolicyInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.PutRegistryPolicy\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentPutRegistryPolicyInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpPutRegistryScanningConfiguration struct {\n}\n\nfunc (*awsAwsjson11_serializeOpPutRegistryScanningConfiguration) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpPutRegistryScanningConfiguration) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*PutRegistryScanningConfigurationInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.PutRegistryScanningConfiguration\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentPutRegistryScanningConfigurationInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpPutReplicationConfiguration struct {\n}\n\nfunc (*awsAwsjson11_serializeOpPutReplicationConfiguration) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpPutReplicationConfiguration) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*PutReplicationConfigurationInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.PutReplicationConfiguration\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentPutReplicationConfigurationInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpSetRepositoryPolicy struct {\n}\n\nfunc (*awsAwsjson11_serializeOpSetRepositoryPolicy) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpSetRepositoryPolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*SetRepositoryPolicyInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.SetRepositoryPolicy\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentSetRepositoryPolicyInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpStartImageScan struct {\n}\n\nfunc (*awsAwsjson11_serializeOpStartImageScan) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpStartImageScan) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*StartImageScanInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.StartImageScan\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentStartImageScanInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpStartLifecyclePolicyPreview struct {\n}\n\nfunc (*awsAwsjson11_serializeOpStartLifecyclePolicyPreview) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpStartLifecyclePolicyPreview) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*StartLifecyclePolicyPreviewInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.StartLifecyclePolicyPreview\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentStartLifecyclePolicyPreviewInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpTagResource struct {\n}\n\nfunc (*awsAwsjson11_serializeOpTagResource) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpTagResource) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*TagResourceInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.TagResource\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentTagResourceInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpUntagResource struct {\n}\n\nfunc (*awsAwsjson11_serializeOpUntagResource) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpUntagResource) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*UntagResourceInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.UntagResource\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentUntagResourceInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpUpdatePullThroughCacheRule struct {\n}\n\nfunc (*awsAwsjson11_serializeOpUpdatePullThroughCacheRule) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpUpdatePullThroughCacheRule) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*UpdatePullThroughCacheRuleInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.UpdatePullThroughCacheRule\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentUpdatePullThroughCacheRuleInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpUpdateRepositoryCreationTemplate struct {\n}\n\nfunc (*awsAwsjson11_serializeOpUpdateRepositoryCreationTemplate) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpUpdateRepositoryCreationTemplate) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*UpdateRepositoryCreationTemplateInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.UpdateRepositoryCreationTemplate\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentUpdateRepositoryCreationTemplateInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpUploadLayerPart struct {\n}\n\nfunc (*awsAwsjson11_serializeOpUploadLayerPart) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpUploadLayerPart) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*UploadLayerPartInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.UploadLayerPart\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentUploadLayerPartInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpValidatePullThroughCacheRule struct {\n}\n\nfunc (*awsAwsjson11_serializeOpValidatePullThroughCacheRule) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpValidatePullThroughCacheRule) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*ValidatePullThroughCacheRuleInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"AmazonEC2ContainerRegistry_V20150921.ValidatePullThroughCacheRule\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentValidatePullThroughCacheRuleInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\nfunc awsAwsjson11_serializeDocumentBatchedOperationLayerDigestList(v []string, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tav.String(v[i])\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentDescribeImagesFilter(v *types.DescribeImagesFilter, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif len(v.TagStatus) > 0 {\n\t\tok := object.Key(\"tagStatus\")\n\t\tok.String(string(v.TagStatus))\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentEncryptionConfiguration(v *types.EncryptionConfiguration, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif len(v.EncryptionType) > 0 {\n\t\tok := object.Key(\"encryptionType\")\n\t\tok.String(string(v.EncryptionType))\n\t}\n\n\tif v.KmsKey != nil {\n\t\tok := object.Key(\"kmsKey\")\n\t\tok.String(*v.KmsKey)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentEncryptionConfigurationForRepositoryCreationTemplate(v *types.EncryptionConfigurationForRepositoryCreationTemplate, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif len(v.EncryptionType) > 0 {\n\t\tok := object.Key(\"encryptionType\")\n\t\tok.String(string(v.EncryptionType))\n\t}\n\n\tif v.KmsKey != nil {\n\t\tok := object.Key(\"kmsKey\")\n\t\tok.String(*v.KmsKey)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentGetAuthorizationTokenRegistryIdList(v []string, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tav.String(v[i])\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentImageIdentifier(v *types.ImageIdentifier, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ImageDigest != nil {\n\t\tok := object.Key(\"imageDigest\")\n\t\tok.String(*v.ImageDigest)\n\t}\n\n\tif v.ImageTag != nil {\n\t\tok := object.Key(\"imageTag\")\n\t\tok.String(*v.ImageTag)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentImageIdentifierList(v []types.ImageIdentifier, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tif err := awsAwsjson11_serializeDocumentImageIdentifier(&v[i], av); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentImageScanningConfiguration(v *types.ImageScanningConfiguration, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ScanOnPush {\n\t\tok := object.Key(\"scanOnPush\")\n\t\tok.Boolean(v.ScanOnPush)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentLayerDigestList(v []string, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tav.String(v[i])\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentLifecyclePolicyPreviewFilter(v *types.LifecyclePolicyPreviewFilter, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif len(v.TagStatus) > 0 {\n\t\tok := object.Key(\"tagStatus\")\n\t\tok.String(string(v.TagStatus))\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentListImagesFilter(v *types.ListImagesFilter, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif len(v.TagStatus) > 0 {\n\t\tok := object.Key(\"tagStatus\")\n\t\tok.String(string(v.TagStatus))\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentMediaTypeList(v []string, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tav.String(v[i])\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentPrefixList(v []string, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tav.String(v[i])\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentPullThroughCacheRuleRepositoryPrefixList(v []string, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tav.String(v[i])\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentRCTAppliedForList(v []types.RCTAppliedFor, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tav.String(string(v[i]))\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentRegistryScanningRule(v *types.RegistryScanningRule, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.RepositoryFilters != nil {\n\t\tok := object.Key(\"repositoryFilters\")\n\t\tif err := awsAwsjson11_serializeDocumentScanningRepositoryFilterList(v.RepositoryFilters, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif len(v.ScanFrequency) > 0 {\n\t\tok := object.Key(\"scanFrequency\")\n\t\tok.String(string(v.ScanFrequency))\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentRegistryScanningRuleList(v []types.RegistryScanningRule, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tif err := awsAwsjson11_serializeDocumentRegistryScanningRule(&v[i], av); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentReplicationConfiguration(v *types.ReplicationConfiguration, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.Rules != nil {\n\t\tok := object.Key(\"rules\")\n\t\tif err := awsAwsjson11_serializeDocumentReplicationRuleList(v.Rules, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentReplicationDestination(v *types.ReplicationDestination, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.Region != nil {\n\t\tok := object.Key(\"region\")\n\t\tok.String(*v.Region)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentReplicationDestinationList(v []types.ReplicationDestination, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tif err := awsAwsjson11_serializeDocumentReplicationDestination(&v[i], av); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentReplicationRule(v *types.ReplicationRule, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.Destinations != nil {\n\t\tok := object.Key(\"destinations\")\n\t\tif err := awsAwsjson11_serializeDocumentReplicationDestinationList(v.Destinations, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.RepositoryFilters != nil {\n\t\tok := object.Key(\"repositoryFilters\")\n\t\tif err := awsAwsjson11_serializeDocumentRepositoryFilterList(v.RepositoryFilters, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentReplicationRuleList(v []types.ReplicationRule, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tif err := awsAwsjson11_serializeDocumentReplicationRule(&v[i], av); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentRepositoryFilter(v *types.RepositoryFilter, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.Filter != nil {\n\t\tok := object.Key(\"filter\")\n\t\tok.String(*v.Filter)\n\t}\n\n\tif len(v.FilterType) > 0 {\n\t\tok := object.Key(\"filterType\")\n\t\tok.String(string(v.FilterType))\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentRepositoryFilterList(v []types.RepositoryFilter, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tif err := awsAwsjson11_serializeDocumentRepositoryFilter(&v[i], av); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentRepositoryNameList(v []string, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tav.String(v[i])\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentScanningConfigurationRepositoryNameList(v []string, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tav.String(v[i])\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentScanningRepositoryFilter(v *types.ScanningRepositoryFilter, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.Filter != nil {\n\t\tok := object.Key(\"filter\")\n\t\tok.String(*v.Filter)\n\t}\n\n\tif len(v.FilterType) > 0 {\n\t\tok := object.Key(\"filterType\")\n\t\tok.String(string(v.FilterType))\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentScanningRepositoryFilterList(v []types.ScanningRepositoryFilter, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tif err := awsAwsjson11_serializeDocumentScanningRepositoryFilter(&v[i], av); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentTag(v *types.Tag, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.Key != nil {\n\t\tok := object.Key(\"Key\")\n\t\tok.String(*v.Key)\n\t}\n\n\tif v.Value != nil {\n\t\tok := object.Key(\"Value\")\n\t\tok.String(*v.Value)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentTagKeyList(v []string, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tav.String(v[i])\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentTagList(v []types.Tag, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tif err := awsAwsjson11_serializeDocumentTag(&v[i], av); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentBatchCheckLayerAvailabilityInput(v *BatchCheckLayerAvailabilityInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.LayerDigests != nil {\n\t\tok := object.Key(\"layerDigests\")\n\t\tif err := awsAwsjson11_serializeDocumentBatchedOperationLayerDigestList(v.LayerDigests, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentBatchDeleteImageInput(v *BatchDeleteImageInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ImageIds != nil {\n\t\tok := object.Key(\"imageIds\")\n\t\tif err := awsAwsjson11_serializeDocumentImageIdentifierList(v.ImageIds, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentBatchGetImageInput(v *BatchGetImageInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.AcceptedMediaTypes != nil {\n\t\tok := object.Key(\"acceptedMediaTypes\")\n\t\tif err := awsAwsjson11_serializeDocumentMediaTypeList(v.AcceptedMediaTypes, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.ImageIds != nil {\n\t\tok := object.Key(\"imageIds\")\n\t\tif err := awsAwsjson11_serializeDocumentImageIdentifierList(v.ImageIds, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentBatchGetRepositoryScanningConfigurationInput(v *BatchGetRepositoryScanningConfigurationInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.RepositoryNames != nil {\n\t\tok := object.Key(\"repositoryNames\")\n\t\tif err := awsAwsjson11_serializeDocumentScanningConfigurationRepositoryNameList(v.RepositoryNames, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentCompleteLayerUploadInput(v *CompleteLayerUploadInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.LayerDigests != nil {\n\t\tok := object.Key(\"layerDigests\")\n\t\tif err := awsAwsjson11_serializeDocumentLayerDigestList(v.LayerDigests, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\tif v.UploadId != nil {\n\t\tok := object.Key(\"uploadId\")\n\t\tok.String(*v.UploadId)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentCreatePullThroughCacheRuleInput(v *CreatePullThroughCacheRuleInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.CredentialArn != nil {\n\t\tok := object.Key(\"credentialArn\")\n\t\tok.String(*v.CredentialArn)\n\t}\n\n\tif v.CustomRoleArn != nil {\n\t\tok := object.Key(\"customRoleArn\")\n\t\tok.String(*v.CustomRoleArn)\n\t}\n\n\tif v.EcrRepositoryPrefix != nil {\n\t\tok := object.Key(\"ecrRepositoryPrefix\")\n\t\tok.String(*v.EcrRepositoryPrefix)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif len(v.UpstreamRegistry) > 0 {\n\t\tok := object.Key(\"upstreamRegistry\")\n\t\tok.String(string(v.UpstreamRegistry))\n\t}\n\n\tif v.UpstreamRegistryUrl != nil {\n\t\tok := object.Key(\"upstreamRegistryUrl\")\n\t\tok.String(*v.UpstreamRegistryUrl)\n\t}\n\n\tif v.UpstreamRepositoryPrefix != nil {\n\t\tok := object.Key(\"upstreamRepositoryPrefix\")\n\t\tok.String(*v.UpstreamRepositoryPrefix)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentCreateRepositoryCreationTemplateInput(v *CreateRepositoryCreationTemplateInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.AppliedFor != nil {\n\t\tok := object.Key(\"appliedFor\")\n\t\tif err := awsAwsjson11_serializeDocumentRCTAppliedForList(v.AppliedFor, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.CustomRoleArn != nil {\n\t\tok := object.Key(\"customRoleArn\")\n\t\tok.String(*v.CustomRoleArn)\n\t}\n\n\tif v.Description != nil {\n\t\tok := object.Key(\"description\")\n\t\tok.String(*v.Description)\n\t}\n\n\tif v.EncryptionConfiguration != nil {\n\t\tok := object.Key(\"encryptionConfiguration\")\n\t\tif err := awsAwsjson11_serializeDocumentEncryptionConfigurationForRepositoryCreationTemplate(v.EncryptionConfiguration, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif len(v.ImageTagMutability) > 0 {\n\t\tok := object.Key(\"imageTagMutability\")\n\t\tok.String(string(v.ImageTagMutability))\n\t}\n\n\tif v.LifecyclePolicy != nil {\n\t\tok := object.Key(\"lifecyclePolicy\")\n\t\tok.String(*v.LifecyclePolicy)\n\t}\n\n\tif v.Prefix != nil {\n\t\tok := object.Key(\"prefix\")\n\t\tok.String(*v.Prefix)\n\t}\n\n\tif v.RepositoryPolicy != nil {\n\t\tok := object.Key(\"repositoryPolicy\")\n\t\tok.String(*v.RepositoryPolicy)\n\t}\n\n\tif v.ResourceTags != nil {\n\t\tok := object.Key(\"resourceTags\")\n\t\tif err := awsAwsjson11_serializeDocumentTagList(v.ResourceTags, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentCreateRepositoryInput(v *CreateRepositoryInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.EncryptionConfiguration != nil {\n\t\tok := object.Key(\"encryptionConfiguration\")\n\t\tif err := awsAwsjson11_serializeDocumentEncryptionConfiguration(v.EncryptionConfiguration, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.ImageScanningConfiguration != nil {\n\t\tok := object.Key(\"imageScanningConfiguration\")\n\t\tif err := awsAwsjson11_serializeDocumentImageScanningConfiguration(v.ImageScanningConfiguration, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif len(v.ImageTagMutability) > 0 {\n\t\tok := object.Key(\"imageTagMutability\")\n\t\tok.String(string(v.ImageTagMutability))\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\tif v.Tags != nil {\n\t\tok := object.Key(\"tags\")\n\t\tif err := awsAwsjson11_serializeDocumentTagList(v.Tags, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDeleteLifecyclePolicyInput(v *DeleteLifecyclePolicyInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDeletePullThroughCacheRuleInput(v *DeletePullThroughCacheRuleInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.EcrRepositoryPrefix != nil {\n\t\tok := object.Key(\"ecrRepositoryPrefix\")\n\t\tok.String(*v.EcrRepositoryPrefix)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDeleteRegistryPolicyInput(v *DeleteRegistryPolicyInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDeleteRepositoryCreationTemplateInput(v *DeleteRepositoryCreationTemplateInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.Prefix != nil {\n\t\tok := object.Key(\"prefix\")\n\t\tok.String(*v.Prefix)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDeleteRepositoryInput(v *DeleteRepositoryInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.Force {\n\t\tok := object.Key(\"force\")\n\t\tok.Boolean(v.Force)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDeleteRepositoryPolicyInput(v *DeleteRepositoryPolicyInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDescribeImageReplicationStatusInput(v *DescribeImageReplicationStatusInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ImageId != nil {\n\t\tok := object.Key(\"imageId\")\n\t\tif err := awsAwsjson11_serializeDocumentImageIdentifier(v.ImageId, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDescribeImageScanFindingsInput(v *DescribeImageScanFindingsInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ImageId != nil {\n\t\tok := object.Key(\"imageId\")\n\t\tif err := awsAwsjson11_serializeDocumentImageIdentifier(v.ImageId, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.MaxResults != nil {\n\t\tok := object.Key(\"maxResults\")\n\t\tok.Integer(*v.MaxResults)\n\t}\n\n\tif v.NextToken != nil {\n\t\tok := object.Key(\"nextToken\")\n\t\tok.String(*v.NextToken)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDescribeImagesInput(v *DescribeImagesInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.Filter != nil {\n\t\tok := object.Key(\"filter\")\n\t\tif err := awsAwsjson11_serializeDocumentDescribeImagesFilter(v.Filter, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.ImageIds != nil {\n\t\tok := object.Key(\"imageIds\")\n\t\tif err := awsAwsjson11_serializeDocumentImageIdentifierList(v.ImageIds, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.MaxResults != nil {\n\t\tok := object.Key(\"maxResults\")\n\t\tok.Integer(*v.MaxResults)\n\t}\n\n\tif v.NextToken != nil {\n\t\tok := object.Key(\"nextToken\")\n\t\tok.String(*v.NextToken)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDescribePullThroughCacheRulesInput(v *DescribePullThroughCacheRulesInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.EcrRepositoryPrefixes != nil {\n\t\tok := object.Key(\"ecrRepositoryPrefixes\")\n\t\tif err := awsAwsjson11_serializeDocumentPullThroughCacheRuleRepositoryPrefixList(v.EcrRepositoryPrefixes, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.MaxResults != nil {\n\t\tok := object.Key(\"maxResults\")\n\t\tok.Integer(*v.MaxResults)\n\t}\n\n\tif v.NextToken != nil {\n\t\tok := object.Key(\"nextToken\")\n\t\tok.String(*v.NextToken)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDescribeRegistryInput(v *DescribeRegistryInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDescribeRepositoriesInput(v *DescribeRepositoriesInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.MaxResults != nil {\n\t\tok := object.Key(\"maxResults\")\n\t\tok.Integer(*v.MaxResults)\n\t}\n\n\tif v.NextToken != nil {\n\t\tok := object.Key(\"nextToken\")\n\t\tok.String(*v.NextToken)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryNames != nil {\n\t\tok := object.Key(\"repositoryNames\")\n\t\tif err := awsAwsjson11_serializeDocumentRepositoryNameList(v.RepositoryNames, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDescribeRepositoryCreationTemplatesInput(v *DescribeRepositoryCreationTemplatesInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.MaxResults != nil {\n\t\tok := object.Key(\"maxResults\")\n\t\tok.Integer(*v.MaxResults)\n\t}\n\n\tif v.NextToken != nil {\n\t\tok := object.Key(\"nextToken\")\n\t\tok.String(*v.NextToken)\n\t}\n\n\tif v.Prefixes != nil {\n\t\tok := object.Key(\"prefixes\")\n\t\tif err := awsAwsjson11_serializeDocumentPrefixList(v.Prefixes, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentGetAccountSettingInput(v *GetAccountSettingInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.Name != nil {\n\t\tok := object.Key(\"name\")\n\t\tok.String(*v.Name)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentGetAuthorizationTokenInput(v *GetAuthorizationTokenInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.RegistryIds != nil {\n\t\tok := object.Key(\"registryIds\")\n\t\tif err := awsAwsjson11_serializeDocumentGetAuthorizationTokenRegistryIdList(v.RegistryIds, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentGetDownloadUrlForLayerInput(v *GetDownloadUrlForLayerInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.LayerDigest != nil {\n\t\tok := object.Key(\"layerDigest\")\n\t\tok.String(*v.LayerDigest)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentGetLifecyclePolicyInput(v *GetLifecyclePolicyInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentGetLifecyclePolicyPreviewInput(v *GetLifecyclePolicyPreviewInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.Filter != nil {\n\t\tok := object.Key(\"filter\")\n\t\tif err := awsAwsjson11_serializeDocumentLifecyclePolicyPreviewFilter(v.Filter, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.ImageIds != nil {\n\t\tok := object.Key(\"imageIds\")\n\t\tif err := awsAwsjson11_serializeDocumentImageIdentifierList(v.ImageIds, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.MaxResults != nil {\n\t\tok := object.Key(\"maxResults\")\n\t\tok.Integer(*v.MaxResults)\n\t}\n\n\tif v.NextToken != nil {\n\t\tok := object.Key(\"nextToken\")\n\t\tok.String(*v.NextToken)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentGetRegistryPolicyInput(v *GetRegistryPolicyInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentGetRegistryScanningConfigurationInput(v *GetRegistryScanningConfigurationInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentGetRepositoryPolicyInput(v *GetRepositoryPolicyInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentInitiateLayerUploadInput(v *InitiateLayerUploadInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentListImagesInput(v *ListImagesInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.Filter != nil {\n\t\tok := object.Key(\"filter\")\n\t\tif err := awsAwsjson11_serializeDocumentListImagesFilter(v.Filter, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.MaxResults != nil {\n\t\tok := object.Key(\"maxResults\")\n\t\tok.Integer(*v.MaxResults)\n\t}\n\n\tif v.NextToken != nil {\n\t\tok := object.Key(\"nextToken\")\n\t\tok.String(*v.NextToken)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentListTagsForResourceInput(v *ListTagsForResourceInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ResourceArn != nil {\n\t\tok := object.Key(\"resourceArn\")\n\t\tok.String(*v.ResourceArn)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentPutAccountSettingInput(v *PutAccountSettingInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.Name != nil {\n\t\tok := object.Key(\"name\")\n\t\tok.String(*v.Name)\n\t}\n\n\tif v.Value != nil {\n\t\tok := object.Key(\"value\")\n\t\tok.String(*v.Value)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentPutImageInput(v *PutImageInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ImageDigest != nil {\n\t\tok := object.Key(\"imageDigest\")\n\t\tok.String(*v.ImageDigest)\n\t}\n\n\tif v.ImageManifest != nil {\n\t\tok := object.Key(\"imageManifest\")\n\t\tok.String(*v.ImageManifest)\n\t}\n\n\tif v.ImageManifestMediaType != nil {\n\t\tok := object.Key(\"imageManifestMediaType\")\n\t\tok.String(*v.ImageManifestMediaType)\n\t}\n\n\tif v.ImageTag != nil {\n\t\tok := object.Key(\"imageTag\")\n\t\tok.String(*v.ImageTag)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentPutImageScanningConfigurationInput(v *PutImageScanningConfigurationInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ImageScanningConfiguration != nil {\n\t\tok := object.Key(\"imageScanningConfiguration\")\n\t\tif err := awsAwsjson11_serializeDocumentImageScanningConfiguration(v.ImageScanningConfiguration, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentPutImageTagMutabilityInput(v *PutImageTagMutabilityInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif len(v.ImageTagMutability) > 0 {\n\t\tok := object.Key(\"imageTagMutability\")\n\t\tok.String(string(v.ImageTagMutability))\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentPutLifecyclePolicyInput(v *PutLifecyclePolicyInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.LifecyclePolicyText != nil {\n\t\tok := object.Key(\"lifecyclePolicyText\")\n\t\tok.String(*v.LifecyclePolicyText)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentPutRegistryPolicyInput(v *PutRegistryPolicyInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.PolicyText != nil {\n\t\tok := object.Key(\"policyText\")\n\t\tok.String(*v.PolicyText)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentPutRegistryScanningConfigurationInput(v *PutRegistryScanningConfigurationInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.Rules != nil {\n\t\tok := object.Key(\"rules\")\n\t\tif err := awsAwsjson11_serializeDocumentRegistryScanningRuleList(v.Rules, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif len(v.ScanType) > 0 {\n\t\tok := object.Key(\"scanType\")\n\t\tok.String(string(v.ScanType))\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentPutReplicationConfigurationInput(v *PutReplicationConfigurationInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ReplicationConfiguration != nil {\n\t\tok := object.Key(\"replicationConfiguration\")\n\t\tif err := awsAwsjson11_serializeDocumentReplicationConfiguration(v.ReplicationConfiguration, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentSetRepositoryPolicyInput(v *SetRepositoryPolicyInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.Force {\n\t\tok := object.Key(\"force\")\n\t\tok.Boolean(v.Force)\n\t}\n\n\tif v.PolicyText != nil {\n\t\tok := object.Key(\"policyText\")\n\t\tok.String(*v.PolicyText)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentStartImageScanInput(v *StartImageScanInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ImageId != nil {\n\t\tok := object.Key(\"imageId\")\n\t\tif err := awsAwsjson11_serializeDocumentImageIdentifier(v.ImageId, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentStartLifecyclePolicyPreviewInput(v *StartLifecyclePolicyPreviewInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.LifecyclePolicyText != nil {\n\t\tok := object.Key(\"lifecyclePolicyText\")\n\t\tok.String(*v.LifecyclePolicyText)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentTagResourceInput(v *TagResourceInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ResourceArn != nil {\n\t\tok := object.Key(\"resourceArn\")\n\t\tok.String(*v.ResourceArn)\n\t}\n\n\tif v.Tags != nil {\n\t\tok := object.Key(\"tags\")\n\t\tif err := awsAwsjson11_serializeDocumentTagList(v.Tags, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentUntagResourceInput(v *UntagResourceInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ResourceArn != nil {\n\t\tok := object.Key(\"resourceArn\")\n\t\tok.String(*v.ResourceArn)\n\t}\n\n\tif v.TagKeys != nil {\n\t\tok := object.Key(\"tagKeys\")\n\t\tif err := awsAwsjson11_serializeDocumentTagKeyList(v.TagKeys, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentUpdatePullThroughCacheRuleInput(v *UpdatePullThroughCacheRuleInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.CredentialArn != nil {\n\t\tok := object.Key(\"credentialArn\")\n\t\tok.String(*v.CredentialArn)\n\t}\n\n\tif v.CustomRoleArn != nil {\n\t\tok := object.Key(\"customRoleArn\")\n\t\tok.String(*v.CustomRoleArn)\n\t}\n\n\tif v.EcrRepositoryPrefix != nil {\n\t\tok := object.Key(\"ecrRepositoryPrefix\")\n\t\tok.String(*v.EcrRepositoryPrefix)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentUpdateRepositoryCreationTemplateInput(v *UpdateRepositoryCreationTemplateInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.AppliedFor != nil {\n\t\tok := object.Key(\"appliedFor\")\n\t\tif err := awsAwsjson11_serializeDocumentRCTAppliedForList(v.AppliedFor, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.CustomRoleArn != nil {\n\t\tok := object.Key(\"customRoleArn\")\n\t\tok.String(*v.CustomRoleArn)\n\t}\n\n\tif v.Description != nil {\n\t\tok := object.Key(\"description\")\n\t\tok.String(*v.Description)\n\t}\n\n\tif v.EncryptionConfiguration != nil {\n\t\tok := object.Key(\"encryptionConfiguration\")\n\t\tif err := awsAwsjson11_serializeDocumentEncryptionConfigurationForRepositoryCreationTemplate(v.EncryptionConfiguration, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif len(v.ImageTagMutability) > 0 {\n\t\tok := object.Key(\"imageTagMutability\")\n\t\tok.String(string(v.ImageTagMutability))\n\t}\n\n\tif v.LifecyclePolicy != nil {\n\t\tok := object.Key(\"lifecyclePolicy\")\n\t\tok.String(*v.LifecyclePolicy)\n\t}\n\n\tif v.Prefix != nil {\n\t\tok := object.Key(\"prefix\")\n\t\tok.String(*v.Prefix)\n\t}\n\n\tif v.RepositoryPolicy != nil {\n\t\tok := object.Key(\"repositoryPolicy\")\n\t\tok.String(*v.RepositoryPolicy)\n\t}\n\n\tif v.ResourceTags != nil {\n\t\tok := object.Key(\"resourceTags\")\n\t\tif err := awsAwsjson11_serializeDocumentTagList(v.ResourceTags, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentUploadLayerPartInput(v *UploadLayerPartInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.LayerPartBlob != nil {\n\t\tok := object.Key(\"layerPartBlob\")\n\t\tok.Base64EncodeBytes(v.LayerPartBlob)\n\t}\n\n\tif v.PartFirstByte != nil {\n\t\tok := object.Key(\"partFirstByte\")\n\t\tok.Long(*v.PartFirstByte)\n\t}\n\n\tif v.PartLastByte != nil {\n\t\tok := object.Key(\"partLastByte\")\n\t\tok.Long(*v.PartLastByte)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\tif v.UploadId != nil {\n\t\tok := object.Key(\"uploadId\")\n\t\tok.String(*v.UploadId)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentValidatePullThroughCacheRuleInput(v *ValidatePullThroughCacheRuleInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.EcrRepositoryPrefix != nil {\n\t\tok := object.Key(\"ecrRepositoryPrefix\")\n\t\tok.String(*v.EcrRepositoryPrefix)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/types/enums.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage types\n\ntype EncryptionType string\n\n// Enum values for EncryptionType\nconst (\n\tEncryptionTypeAes256  EncryptionType = \"AES256\"\n\tEncryptionTypeKms     EncryptionType = \"KMS\"\n\tEncryptionTypeKmsDsse EncryptionType = \"KMS_DSSE\"\n)\n\n// Values returns all known values for EncryptionType. Note that this can be\n// expanded in the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (EncryptionType) Values() []EncryptionType {\n\treturn []EncryptionType{\n\t\t\"AES256\",\n\t\t\"KMS\",\n\t\t\"KMS_DSSE\",\n\t}\n}\n\ntype FindingSeverity string\n\n// Enum values for FindingSeverity\nconst (\n\tFindingSeverityInformational FindingSeverity = \"INFORMATIONAL\"\n\tFindingSeverityLow           FindingSeverity = \"LOW\"\n\tFindingSeverityMedium        FindingSeverity = \"MEDIUM\"\n\tFindingSeverityHigh          FindingSeverity = \"HIGH\"\n\tFindingSeverityCritical      FindingSeverity = \"CRITICAL\"\n\tFindingSeverityUndefined     FindingSeverity = \"UNDEFINED\"\n)\n\n// Values returns all known values for FindingSeverity. Note that this can be\n// expanded in the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (FindingSeverity) Values() []FindingSeverity {\n\treturn []FindingSeverity{\n\t\t\"INFORMATIONAL\",\n\t\t\"LOW\",\n\t\t\"MEDIUM\",\n\t\t\"HIGH\",\n\t\t\"CRITICAL\",\n\t\t\"UNDEFINED\",\n\t}\n}\n\ntype ImageActionType string\n\n// Enum values for ImageActionType\nconst (\n\tImageActionTypeExpire ImageActionType = \"EXPIRE\"\n)\n\n// Values returns all known values for ImageActionType. Note that this can be\n// expanded in the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (ImageActionType) Values() []ImageActionType {\n\treturn []ImageActionType{\n\t\t\"EXPIRE\",\n\t}\n}\n\ntype ImageFailureCode string\n\n// Enum values for ImageFailureCode\nconst (\n\tImageFailureCodeInvalidImageDigest            ImageFailureCode = \"InvalidImageDigest\"\n\tImageFailureCodeInvalidImageTag               ImageFailureCode = \"InvalidImageTag\"\n\tImageFailureCodeImageTagDoesNotMatchDigest    ImageFailureCode = \"ImageTagDoesNotMatchDigest\"\n\tImageFailureCodeImageNotFound                 ImageFailureCode = \"ImageNotFound\"\n\tImageFailureCodeMissingDigestAndTag           ImageFailureCode = \"MissingDigestAndTag\"\n\tImageFailureCodeImageReferencedByManifestList ImageFailureCode = \"ImageReferencedByManifestList\"\n\tImageFailureCodeKmsError                      ImageFailureCode = \"KmsError\"\n\tImageFailureCodeUpstreamAccessDenied          ImageFailureCode = \"UpstreamAccessDenied\"\n\tImageFailureCodeUpstreamTooManyRequests       ImageFailureCode = \"UpstreamTooManyRequests\"\n\tImageFailureCodeUpstreamUnavailable           ImageFailureCode = \"UpstreamUnavailable\"\n)\n\n// Values returns all known values for ImageFailureCode. Note that this can be\n// expanded in the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (ImageFailureCode) Values() []ImageFailureCode {\n\treturn []ImageFailureCode{\n\t\t\"InvalidImageDigest\",\n\t\t\"InvalidImageTag\",\n\t\t\"ImageTagDoesNotMatchDigest\",\n\t\t\"ImageNotFound\",\n\t\t\"MissingDigestAndTag\",\n\t\t\"ImageReferencedByManifestList\",\n\t\t\"KmsError\",\n\t\t\"UpstreamAccessDenied\",\n\t\t\"UpstreamTooManyRequests\",\n\t\t\"UpstreamUnavailable\",\n\t}\n}\n\ntype ImageTagMutability string\n\n// Enum values for ImageTagMutability\nconst (\n\tImageTagMutabilityMutable   ImageTagMutability = \"MUTABLE\"\n\tImageTagMutabilityImmutable ImageTagMutability = \"IMMUTABLE\"\n)\n\n// Values returns all known values for ImageTagMutability. Note that this can be\n// expanded in the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (ImageTagMutability) Values() []ImageTagMutability {\n\treturn []ImageTagMutability{\n\t\t\"MUTABLE\",\n\t\t\"IMMUTABLE\",\n\t}\n}\n\ntype LayerAvailability string\n\n// Enum values for LayerAvailability\nconst (\n\tLayerAvailabilityAvailable   LayerAvailability = \"AVAILABLE\"\n\tLayerAvailabilityUnavailable LayerAvailability = \"UNAVAILABLE\"\n)\n\n// Values returns all known values for LayerAvailability. Note that this can be\n// expanded in the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (LayerAvailability) Values() []LayerAvailability {\n\treturn []LayerAvailability{\n\t\t\"AVAILABLE\",\n\t\t\"UNAVAILABLE\",\n\t}\n}\n\ntype LayerFailureCode string\n\n// Enum values for LayerFailureCode\nconst (\n\tLayerFailureCodeInvalidLayerDigest LayerFailureCode = \"InvalidLayerDigest\"\n\tLayerFailureCodeMissingLayerDigest LayerFailureCode = \"MissingLayerDigest\"\n)\n\n// Values returns all known values for LayerFailureCode. Note that this can be\n// expanded in the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (LayerFailureCode) Values() []LayerFailureCode {\n\treturn []LayerFailureCode{\n\t\t\"InvalidLayerDigest\",\n\t\t\"MissingLayerDigest\",\n\t}\n}\n\ntype LifecyclePolicyPreviewStatus string\n\n// Enum values for LifecyclePolicyPreviewStatus\nconst (\n\tLifecyclePolicyPreviewStatusInProgress LifecyclePolicyPreviewStatus = \"IN_PROGRESS\"\n\tLifecyclePolicyPreviewStatusComplete   LifecyclePolicyPreviewStatus = \"COMPLETE\"\n\tLifecyclePolicyPreviewStatusExpired    LifecyclePolicyPreviewStatus = \"EXPIRED\"\n\tLifecyclePolicyPreviewStatusFailed     LifecyclePolicyPreviewStatus = \"FAILED\"\n)\n\n// Values returns all known values for LifecyclePolicyPreviewStatus. Note that\n// this can be expanded in the future, and so it is only as up to date as the\n// client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (LifecyclePolicyPreviewStatus) Values() []LifecyclePolicyPreviewStatus {\n\treturn []LifecyclePolicyPreviewStatus{\n\t\t\"IN_PROGRESS\",\n\t\t\"COMPLETE\",\n\t\t\"EXPIRED\",\n\t\t\"FAILED\",\n\t}\n}\n\ntype RCTAppliedFor string\n\n// Enum values for RCTAppliedFor\nconst (\n\tRCTAppliedForReplication      RCTAppliedFor = \"REPLICATION\"\n\tRCTAppliedForPullThroughCache RCTAppliedFor = \"PULL_THROUGH_CACHE\"\n)\n\n// Values returns all known values for RCTAppliedFor. Note that this can be\n// expanded in the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (RCTAppliedFor) Values() []RCTAppliedFor {\n\treturn []RCTAppliedFor{\n\t\t\"REPLICATION\",\n\t\t\"PULL_THROUGH_CACHE\",\n\t}\n}\n\ntype ReplicationStatus string\n\n// Enum values for ReplicationStatus\nconst (\n\tReplicationStatusInProgress ReplicationStatus = \"IN_PROGRESS\"\n\tReplicationStatusComplete   ReplicationStatus = \"COMPLETE\"\n\tReplicationStatusFailed     ReplicationStatus = \"FAILED\"\n)\n\n// Values returns all known values for ReplicationStatus. Note that this can be\n// expanded in the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (ReplicationStatus) Values() []ReplicationStatus {\n\treturn []ReplicationStatus{\n\t\t\"IN_PROGRESS\",\n\t\t\"COMPLETE\",\n\t\t\"FAILED\",\n\t}\n}\n\ntype RepositoryFilterType string\n\n// Enum values for RepositoryFilterType\nconst (\n\tRepositoryFilterTypePrefixMatch RepositoryFilterType = \"PREFIX_MATCH\"\n)\n\n// Values returns all known values for RepositoryFilterType. Note that this can be\n// expanded in the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (RepositoryFilterType) Values() []RepositoryFilterType {\n\treturn []RepositoryFilterType{\n\t\t\"PREFIX_MATCH\",\n\t}\n}\n\ntype ScanFrequency string\n\n// Enum values for ScanFrequency\nconst (\n\tScanFrequencyScanOnPush     ScanFrequency = \"SCAN_ON_PUSH\"\n\tScanFrequencyContinuousScan ScanFrequency = \"CONTINUOUS_SCAN\"\n\tScanFrequencyManual         ScanFrequency = \"MANUAL\"\n)\n\n// Values returns all known values for ScanFrequency. Note that this can be\n// expanded in the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (ScanFrequency) Values() []ScanFrequency {\n\treturn []ScanFrequency{\n\t\t\"SCAN_ON_PUSH\",\n\t\t\"CONTINUOUS_SCAN\",\n\t\t\"MANUAL\",\n\t}\n}\n\ntype ScanningConfigurationFailureCode string\n\n// Enum values for ScanningConfigurationFailureCode\nconst (\n\tScanningConfigurationFailureCodeRepositoryNotFound ScanningConfigurationFailureCode = \"REPOSITORY_NOT_FOUND\"\n)\n\n// Values returns all known values for ScanningConfigurationFailureCode. Note that\n// this can be expanded in the future, and so it is only as up to date as the\n// client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (ScanningConfigurationFailureCode) Values() []ScanningConfigurationFailureCode {\n\treturn []ScanningConfigurationFailureCode{\n\t\t\"REPOSITORY_NOT_FOUND\",\n\t}\n}\n\ntype ScanningRepositoryFilterType string\n\n// Enum values for ScanningRepositoryFilterType\nconst (\n\tScanningRepositoryFilterTypeWildcard ScanningRepositoryFilterType = \"WILDCARD\"\n)\n\n// Values returns all known values for ScanningRepositoryFilterType. Note that\n// this can be expanded in the future, and so it is only as up to date as the\n// client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (ScanningRepositoryFilterType) Values() []ScanningRepositoryFilterType {\n\treturn []ScanningRepositoryFilterType{\n\t\t\"WILDCARD\",\n\t}\n}\n\ntype ScanStatus string\n\n// Enum values for ScanStatus\nconst (\n\tScanStatusInProgress             ScanStatus = \"IN_PROGRESS\"\n\tScanStatusComplete               ScanStatus = \"COMPLETE\"\n\tScanStatusFailed                 ScanStatus = \"FAILED\"\n\tScanStatusUnsupportedImage       ScanStatus = \"UNSUPPORTED_IMAGE\"\n\tScanStatusActive                 ScanStatus = \"ACTIVE\"\n\tScanStatusPending                ScanStatus = \"PENDING\"\n\tScanStatusScanEligibilityExpired ScanStatus = \"SCAN_ELIGIBILITY_EXPIRED\"\n\tScanStatusFindingsUnavailable    ScanStatus = \"FINDINGS_UNAVAILABLE\"\n\tScanStatusLimitExceeded          ScanStatus = \"LIMIT_EXCEEDED\"\n)\n\n// Values returns all known values for ScanStatus. Note that this can be expanded\n// in the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (ScanStatus) Values() []ScanStatus {\n\treturn []ScanStatus{\n\t\t\"IN_PROGRESS\",\n\t\t\"COMPLETE\",\n\t\t\"FAILED\",\n\t\t\"UNSUPPORTED_IMAGE\",\n\t\t\"ACTIVE\",\n\t\t\"PENDING\",\n\t\t\"SCAN_ELIGIBILITY_EXPIRED\",\n\t\t\"FINDINGS_UNAVAILABLE\",\n\t\t\"LIMIT_EXCEEDED\",\n\t}\n}\n\ntype ScanType string\n\n// Enum values for ScanType\nconst (\n\tScanTypeBasic    ScanType = \"BASIC\"\n\tScanTypeEnhanced ScanType = \"ENHANCED\"\n)\n\n// Values returns all known values for ScanType. Note that this can be expanded in\n// the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (ScanType) Values() []ScanType {\n\treturn []ScanType{\n\t\t\"BASIC\",\n\t\t\"ENHANCED\",\n\t}\n}\n\ntype TagStatus string\n\n// Enum values for TagStatus\nconst (\n\tTagStatusTagged   TagStatus = \"TAGGED\"\n\tTagStatusUntagged TagStatus = \"UNTAGGED\"\n\tTagStatusAny      TagStatus = \"ANY\"\n)\n\n// Values returns all known values for TagStatus. Note that this can be expanded\n// in the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (TagStatus) Values() []TagStatus {\n\treturn []TagStatus{\n\t\t\"TAGGED\",\n\t\t\"UNTAGGED\",\n\t\t\"ANY\",\n\t}\n}\n\ntype UpstreamRegistry string\n\n// Enum values for UpstreamRegistry\nconst (\n\tUpstreamRegistryEcr                     UpstreamRegistry = \"ecr\"\n\tUpstreamRegistryEcrPublic               UpstreamRegistry = \"ecr-public\"\n\tUpstreamRegistryQuay                    UpstreamRegistry = \"quay\"\n\tUpstreamRegistryK8s                     UpstreamRegistry = \"k8s\"\n\tUpstreamRegistryDockerHub               UpstreamRegistry = \"docker-hub\"\n\tUpstreamRegistryGitHubContainerRegistry UpstreamRegistry = \"github-container-registry\"\n\tUpstreamRegistryAzureContainerRegistry  UpstreamRegistry = \"azure-container-registry\"\n\tUpstreamRegistryGitLabContainerRegistry UpstreamRegistry = \"gitlab-container-registry\"\n)\n\n// Values returns all known values for UpstreamRegistry. Note that this can be\n// expanded in the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (UpstreamRegistry) Values() []UpstreamRegistry {\n\treturn []UpstreamRegistry{\n\t\t\"ecr\",\n\t\t\"ecr-public\",\n\t\t\"quay\",\n\t\t\"k8s\",\n\t\t\"docker-hub\",\n\t\t\"github-container-registry\",\n\t\t\"azure-container-registry\",\n\t\t\"gitlab-container-registry\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/types/errors.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage types\n\nimport (\n\t\"fmt\"\n\tsmithy \"github.com/aws/smithy-go\"\n)\n\n// The specified layer upload does not contain any layer parts.\ntype EmptyUploadException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *EmptyUploadException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *EmptyUploadException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *EmptyUploadException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"EmptyUploadException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *EmptyUploadException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified image has already been pushed, and there were no changes to the\n// manifest or image tag after the last push.\ntype ImageAlreadyExistsException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *ImageAlreadyExistsException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *ImageAlreadyExistsException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *ImageAlreadyExistsException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"ImageAlreadyExistsException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *ImageAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified image digest does not match the digest that Amazon ECR calculated\n// for the image.\ntype ImageDigestDoesNotMatchException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *ImageDigestDoesNotMatchException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *ImageDigestDoesNotMatchException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *ImageDigestDoesNotMatchException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"ImageDigestDoesNotMatchException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *ImageDigestDoesNotMatchException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The image requested does not exist in the specified repository.\ntype ImageNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *ImageNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *ImageNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *ImageNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"ImageNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *ImageNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified image is tagged with a tag that already exists. The repository is\n// configured for tag immutability.\ntype ImageTagAlreadyExistsException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *ImageTagAlreadyExistsException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *ImageTagAlreadyExistsException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *ImageTagAlreadyExistsException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"ImageTagAlreadyExistsException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *ImageTagAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The layer digest calculation performed by Amazon ECR upon receipt of the image\n// layer does not match the digest specified.\ntype InvalidLayerException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *InvalidLayerException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *InvalidLayerException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *InvalidLayerException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"InvalidLayerException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *InvalidLayerException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The layer part size is not valid, or the first byte specified is not\n// consecutive to the last byte of a previous layer part upload.\ntype InvalidLayerPartException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tRegistryId            *string\n\tRepositoryName        *string\n\tUploadId              *string\n\tLastValidByteReceived *int64\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *InvalidLayerPartException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *InvalidLayerPartException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *InvalidLayerPartException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"InvalidLayerPartException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *InvalidLayerPartException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified parameter is invalid. Review the available parameters for the API\n// request.\ntype InvalidParameterException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *InvalidParameterException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *InvalidParameterException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *InvalidParameterException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"InvalidParameterException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *InvalidParameterException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// An invalid parameter has been specified. Tag keys can have a maximum character\n// length of 128 characters, and tag values can have a maximum length of 256\n// characters.\ntype InvalidTagParameterException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *InvalidTagParameterException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *InvalidTagParameterException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *InvalidTagParameterException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"InvalidTagParameterException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *InvalidTagParameterException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The operation failed due to a KMS exception.\ntype KmsException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tKmsError *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *KmsException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *KmsException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *KmsException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"KmsException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *KmsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The image layer already exists in the associated repository.\ntype LayerAlreadyExistsException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *LayerAlreadyExistsException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *LayerAlreadyExistsException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *LayerAlreadyExistsException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"LayerAlreadyExistsException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *LayerAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified layer is not available because it is not associated with an\n// image. Unassociated image layers may be cleaned up at any time.\ntype LayerInaccessibleException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *LayerInaccessibleException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *LayerInaccessibleException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *LayerInaccessibleException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"LayerInaccessibleException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *LayerInaccessibleException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// Layer parts must be at least 5 MiB in size.\ntype LayerPartTooSmallException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *LayerPartTooSmallException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *LayerPartTooSmallException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *LayerPartTooSmallException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"LayerPartTooSmallException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *LayerPartTooSmallException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified layers could not be found, or the specified layer is not valid\n// for this repository.\ntype LayersNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *LayersNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *LayersNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *LayersNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"LayersNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *LayersNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The lifecycle policy could not be found, and no policy is set to the repository.\ntype LifecyclePolicyNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *LifecyclePolicyNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *LifecyclePolicyNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *LifecyclePolicyNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"LifecyclePolicyNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *LifecyclePolicyNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The previous lifecycle policy preview request has not completed. Wait and try\n// again.\ntype LifecyclePolicyPreviewInProgressException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *LifecyclePolicyPreviewInProgressException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *LifecyclePolicyPreviewInProgressException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *LifecyclePolicyPreviewInProgressException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"LifecyclePolicyPreviewInProgressException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *LifecyclePolicyPreviewInProgressException) ErrorFault() smithy.ErrorFault {\n\treturn smithy.FaultClient\n}\n\n// There is no dry run for this repository.\ntype LifecyclePolicyPreviewNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *LifecyclePolicyPreviewNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *LifecyclePolicyPreviewNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *LifecyclePolicyPreviewNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"LifecyclePolicyPreviewNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *LifecyclePolicyPreviewNotFoundException) ErrorFault() smithy.ErrorFault {\n\treturn smithy.FaultClient\n}\n\n// The operation did not succeed because it would have exceeded a service limit\n// for your account. For more information, see [Amazon ECR service quotas]in the Amazon Elastic Container\n// Registry User Guide.\n//\n// [Amazon ECR service quotas]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/service-quotas.html\ntype LimitExceededException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *LimitExceededException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *LimitExceededException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *LimitExceededException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"LimitExceededException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *LimitExceededException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// A pull through cache rule with these settings already exists for the private\n// registry.\ntype PullThroughCacheRuleAlreadyExistsException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *PullThroughCacheRuleAlreadyExistsException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *PullThroughCacheRuleAlreadyExistsException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *PullThroughCacheRuleAlreadyExistsException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"PullThroughCacheRuleAlreadyExistsException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *PullThroughCacheRuleAlreadyExistsException) ErrorFault() smithy.ErrorFault {\n\treturn smithy.FaultClient\n}\n\n// The pull through cache rule was not found. Specify a valid pull through cache\n// rule and try again.\ntype PullThroughCacheRuleNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *PullThroughCacheRuleNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *PullThroughCacheRuleNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *PullThroughCacheRuleNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"PullThroughCacheRuleNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *PullThroughCacheRuleNotFoundException) ErrorFault() smithy.ErrorFault {\n\treturn smithy.FaultClient\n}\n\n// The manifest list is referencing an image that does not exist.\ntype ReferencedImagesNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *ReferencedImagesNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *ReferencedImagesNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *ReferencedImagesNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"ReferencedImagesNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *ReferencedImagesNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The registry doesn't have an associated registry policy.\ntype RegistryPolicyNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *RegistryPolicyNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *RegistryPolicyNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *RegistryPolicyNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"RegistryPolicyNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *RegistryPolicyNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified repository already exists in the specified registry.\ntype RepositoryAlreadyExistsException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *RepositoryAlreadyExistsException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *RepositoryAlreadyExistsException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *RepositoryAlreadyExistsException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"RepositoryAlreadyExistsException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *RepositoryAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified repository contains images. To delete a repository that contains\n// images, you must force the deletion with the force parameter.\ntype RepositoryNotEmptyException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *RepositoryNotEmptyException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *RepositoryNotEmptyException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *RepositoryNotEmptyException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"RepositoryNotEmptyException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *RepositoryNotEmptyException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified repository could not be found. Check the spelling of the\n// specified repository and ensure that you are performing operations on the\n// correct registry.\ntype RepositoryNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *RepositoryNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *RepositoryNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *RepositoryNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"RepositoryNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *RepositoryNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified repository and registry combination does not have an associated\n// repository policy.\ntype RepositoryPolicyNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *RepositoryPolicyNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *RepositoryPolicyNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *RepositoryPolicyNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"RepositoryPolicyNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *RepositoryPolicyNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified image scan could not be found. Ensure that image scanning is\n// enabled on the repository and try again.\ntype ScanNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *ScanNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *ScanNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *ScanNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"ScanNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *ScanNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The ARN of the secret specified in the pull through cache rule was not found.\n// Update the pull through cache rule with a valid secret ARN and try again.\ntype SecretNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *SecretNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *SecretNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *SecretNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"SecretNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *SecretNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// These errors are usually caused by a server-side issue.\ntype ServerException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *ServerException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *ServerException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *ServerException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"ServerException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *ServerException) ErrorFault() smithy.ErrorFault { return smithy.FaultServer }\n\n// The repository creation template already exists. Specify a unique prefix and\n// try again.\ntype TemplateAlreadyExistsException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *TemplateAlreadyExistsException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *TemplateAlreadyExistsException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *TemplateAlreadyExistsException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"TemplateAlreadyExistsException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *TemplateAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified repository creation template can't be found. Verify the registry\n// ID and prefix and try again.\ntype TemplateNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *TemplateNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *TemplateNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *TemplateNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"TemplateNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *TemplateNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The list of tags on the repository is over the limit. The maximum number of\n// tags that can be applied to a repository is 50.\ntype TooManyTagsException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *TooManyTagsException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *TooManyTagsException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *TooManyTagsException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"TooManyTagsException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *TooManyTagsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The secret is unable to be accessed. Verify the resource permissions for the\n// secret and try again.\ntype UnableToAccessSecretException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *UnableToAccessSecretException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *UnableToAccessSecretException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *UnableToAccessSecretException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"UnableToAccessSecretException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *UnableToAccessSecretException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The secret is accessible but is unable to be decrypted. Verify the resource\n// permisisons and try again.\ntype UnableToDecryptSecretValueException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *UnableToDecryptSecretValueException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *UnableToDecryptSecretValueException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *UnableToDecryptSecretValueException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"UnableToDecryptSecretValueException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *UnableToDecryptSecretValueException) ErrorFault() smithy.ErrorFault {\n\treturn smithy.FaultClient\n}\n\n// The image or images were unable to be pulled using the pull through cache rule.\n// This is usually caused because of an issue with the Secrets Manager secret\n// containing the credentials for the upstream registry.\ntype UnableToGetUpstreamImageException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *UnableToGetUpstreamImageException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *UnableToGetUpstreamImageException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *UnableToGetUpstreamImageException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"UnableToGetUpstreamImageException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *UnableToGetUpstreamImageException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// There was an issue getting the upstream layer matching the pull through cache\n// rule.\ntype UnableToGetUpstreamLayerException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *UnableToGetUpstreamLayerException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *UnableToGetUpstreamLayerException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *UnableToGetUpstreamLayerException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"UnableToGetUpstreamLayerException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *UnableToGetUpstreamLayerException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The image is of a type that cannot be scanned.\ntype UnsupportedImageTypeException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *UnsupportedImageTypeException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *UnsupportedImageTypeException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *UnsupportedImageTypeException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"UnsupportedImageTypeException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *UnsupportedImageTypeException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified upstream registry isn't supported.\ntype UnsupportedUpstreamRegistryException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *UnsupportedUpstreamRegistryException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *UnsupportedUpstreamRegistryException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *UnsupportedUpstreamRegistryException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"UnsupportedUpstreamRegistryException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *UnsupportedUpstreamRegistryException) ErrorFault() smithy.ErrorFault {\n\treturn smithy.FaultClient\n}\n\n// The upload could not be found, or the specified upload ID is not valid for this\n// repository.\ntype UploadNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *UploadNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *UploadNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *UploadNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"UploadNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *UploadNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// There was an exception validating this request.\ntype ValidationException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *ValidationException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *ValidationException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *ValidationException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"ValidationException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *ValidationException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/types/types.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage types\n\nimport (\n\tsmithydocument \"github.com/aws/smithy-go/document\"\n\t\"time\"\n)\n\n// This data type is used in the ImageScanFinding data type.\ntype Attribute struct {\n\n\t// The attribute key.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// The value assigned to the attribute key.\n\tValue *string\n\n\tnoSmithyDocumentSerde\n}\n\n// An object representing authorization data for an Amazon ECR registry.\ntype AuthorizationData struct {\n\n\t// A base64-encoded string that contains authorization data for the specified\n\t// Amazon ECR registry. When the string is decoded, it is presented in the format\n\t// user:password for private registry authentication using docker login .\n\tAuthorizationToken *string\n\n\t// The Unix time in seconds and milliseconds when the authorization token expires.\n\t// Authorization tokens are valid for 12 hours.\n\tExpiresAt *time.Time\n\n\t// The registry URL to use for this authorization token in a docker login command.\n\t// The Amazon ECR registry URL format is\n\t// https://aws_account_id.dkr.ecr.region.amazonaws.com . For example,\n\t// https://012345678910.dkr.ecr.us-east-1.amazonaws.com ..\n\tProxyEndpoint *string\n\n\tnoSmithyDocumentSerde\n}\n\n// The image details of the Amazon ECR container image.\ntype AwsEcrContainerImageDetails struct {\n\n\t// The architecture of the Amazon ECR container image.\n\tArchitecture *string\n\n\t// The image author of the Amazon ECR container image.\n\tAuthor *string\n\n\t// The image hash of the Amazon ECR container image.\n\tImageHash *string\n\n\t// The image tags attached to the Amazon ECR container image.\n\tImageTags []string\n\n\t// The platform of the Amazon ECR container image.\n\tPlatform *string\n\n\t// The date and time the Amazon ECR container image was pushed.\n\tPushedAt *time.Time\n\n\t// The registry the Amazon ECR container image belongs to.\n\tRegistry *string\n\n\t// The name of the repository the Amazon ECR container image resides in.\n\tRepositoryName *string\n\n\tnoSmithyDocumentSerde\n}\n\n// The CVSS score for a finding.\ntype CvssScore struct {\n\n\t// The base CVSS score used for the finding.\n\tBaseScore float64\n\n\t// The vector string of the CVSS score.\n\tScoringVector *string\n\n\t// The source of the CVSS score.\n\tSource *string\n\n\t// The version of CVSS used for the score.\n\tVersion *string\n\n\tnoSmithyDocumentSerde\n}\n\n// Details on adjustments Amazon Inspector made to the CVSS score for a finding.\ntype CvssScoreAdjustment struct {\n\n\t// The metric used to adjust the CVSS score.\n\tMetric *string\n\n\t// The reason the CVSS score has been adjustment.\n\tReason *string\n\n\tnoSmithyDocumentSerde\n}\n\n// Information about the CVSS score.\ntype CvssScoreDetails struct {\n\n\t// An object that contains details about adjustment Amazon Inspector made to the\n\t// CVSS score.\n\tAdjustments []CvssScoreAdjustment\n\n\t// The CVSS score.\n\tScore float64\n\n\t// The source for the CVSS score.\n\tScoreSource *string\n\n\t// The vector for the CVSS score.\n\tScoringVector *string\n\n\t// The CVSS version used in scoring.\n\tVersion *string\n\n\tnoSmithyDocumentSerde\n}\n\n// An object representing a filter on a DescribeImages operation.\ntype DescribeImagesFilter struct {\n\n\t// The tag status with which to filter your DescribeImages results. You can filter results based\n\t// on whether they are TAGGED or UNTAGGED .\n\tTagStatus TagStatus\n\n\tnoSmithyDocumentSerde\n}\n\n// The encryption configuration for the repository. This determines how the\n// contents of your repository are encrypted at rest.\n//\n// By default, when no encryption configuration is set or the AES256 encryption\n// type is used, Amazon ECR uses server-side encryption with Amazon S3-managed\n// encryption keys which encrypts your data at rest using an AES256 encryption\n// algorithm. This does not require any action on your part.\n//\n// For more control over the encryption of the contents of your repository, you\n// can use server-side encryption with Key Management Service key stored in Key\n// Management Service (KMS) to encrypt your images. For more information, see [Amazon ECR encryption at rest]in\n// the Amazon Elastic Container Registry User Guide.\n//\n// [Amazon ECR encryption at rest]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/encryption-at-rest.html\ntype EncryptionConfiguration struct {\n\n\t// The encryption type to use.\n\t//\n\t// If you use the KMS encryption type, the contents of the repository will be\n\t// encrypted using server-side encryption with Key Management Service key stored in\n\t// KMS. When you use KMS to encrypt your data, you can either use the default\n\t// Amazon Web Services managed KMS key for Amazon ECR, or specify your own KMS key,\n\t// which you already created.\n\t//\n\t// If you use the KMS_DSSE encryption type, the contents of the repository will be\n\t// encrypted with two layers of encryption using server-side encryption with the\n\t// KMS Management Service key stored in KMS. Similar to the KMS encryption type,\n\t// you can either use the default Amazon Web Services managed KMS key for Amazon\n\t// ECR, or specify your own KMS key, which you've already created.\n\t//\n\t// If you use the AES256 encryption type, Amazon ECR uses server-side encryption\n\t// with Amazon S3-managed encryption keys which encrypts the images in the\n\t// repository using an AES256 encryption algorithm.\n\t//\n\t// For more information, see [Amazon ECR encryption at rest] in the Amazon Elastic Container Registry User Guide.\n\t//\n\t// [Amazon ECR encryption at rest]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/encryption-at-rest.html\n\t//\n\t// This member is required.\n\tEncryptionType EncryptionType\n\n\t// If you use the KMS encryption type, specify the KMS key to use for encryption.\n\t// The alias, key ID, or full ARN of the KMS key can be specified. The key must\n\t// exist in the same Region as the repository. If no key is specified, the default\n\t// Amazon Web Services managed KMS key for Amazon ECR will be used.\n\tKmsKey *string\n\n\tnoSmithyDocumentSerde\n}\n\n// The encryption configuration to associate with the repository creation template.\ntype EncryptionConfigurationForRepositoryCreationTemplate struct {\n\n\t// The encryption type to use.\n\t//\n\t// If you use the KMS encryption type, the contents of the repository will be\n\t// encrypted using server-side encryption with Key Management Service key stored in\n\t// KMS. When you use KMS to encrypt your data, you can either use the default\n\t// Amazon Web Services managed KMS key for Amazon ECR, or specify your own KMS key,\n\t// which you already created. For more information, see [Protecting data using server-side encryption with an KMS key stored in Key Management Service (SSE-KMS)]in the Amazon Simple\n\t// Storage Service Console Developer Guide.\n\t//\n\t// If you use the AES256 encryption type, Amazon ECR uses server-side encryption\n\t// with Amazon S3-managed encryption keys which encrypts the images in the\n\t// repository using an AES256 encryption algorithm. For more information, see [Protecting data using server-side encryption with Amazon S3-managed encryption keys (SSE-S3)]in\n\t// the Amazon Simple Storage Service Console Developer Guide.\n\t//\n\t// [Protecting data using server-side encryption with Amazon S3-managed encryption keys (SSE-S3)]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html\n\t// [Protecting data using server-side encryption with an KMS key stored in Key Management Service (SSE-KMS)]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html\n\t//\n\t// This member is required.\n\tEncryptionType EncryptionType\n\n\t// If you use the KMS encryption type, specify the KMS key to use for encryption.\n\t// The full ARN of the KMS key must be specified. The key must exist in the same\n\t// Region as the repository. If no key is specified, the default Amazon Web\n\t// Services managed KMS key for Amazon ECR will be used.\n\tKmsKey *string\n\n\tnoSmithyDocumentSerde\n}\n\n// The details of an enhanced image scan. This is returned when enhanced scanning\n// is enabled for your private registry.\ntype EnhancedImageScanFinding struct {\n\n\t// The Amazon Web Services account ID associated with the image.\n\tAwsAccountId *string\n\n\t// The description of the finding.\n\tDescription *string\n\n\t// If a finding discovered in your environment has an exploit available.\n\tExploitAvailable *string\n\n\t// The Amazon Resource Number (ARN) of the finding.\n\tFindingArn *string\n\n\t// The date and time that the finding was first observed.\n\tFirstObservedAt *time.Time\n\n\t// Details on whether a fix is available through a version update. This value can\n\t// be YES , NO , or PARTIAL . A PARTIAL fix means that some, but not all, of the\n\t// packages identified in the finding have fixes available through updated\n\t// versions.\n\tFixAvailable *string\n\n\t// The date and time that the finding was last observed.\n\tLastObservedAt *time.Time\n\n\t// An object that contains the details of a package vulnerability finding.\n\tPackageVulnerabilityDetails *PackageVulnerabilityDetails\n\n\t// An object that contains the details about how to remediate a finding.\n\tRemediation *Remediation\n\n\t// Contains information on the resources involved in a finding.\n\tResources []Resource\n\n\t// The Amazon Inspector score given to the finding.\n\tScore float64\n\n\t// An object that contains details of the Amazon Inspector score.\n\tScoreDetails *ScoreDetails\n\n\t// The severity of the finding.\n\tSeverity *string\n\n\t// The status of the finding.\n\tStatus *string\n\n\t// The title of the finding.\n\tTitle *string\n\n\t// The type of the finding.\n\tType *string\n\n\t// The date and time the finding was last updated at.\n\tUpdatedAt *time.Time\n\n\tnoSmithyDocumentSerde\n}\n\n// An object representing an Amazon ECR image.\ntype Image struct {\n\n\t// An object containing the image tag and image digest associated with an image.\n\tImageId *ImageIdentifier\n\n\t// The image manifest associated with the image.\n\tImageManifest *string\n\n\t// The manifest media type of the image.\n\tImageManifestMediaType *string\n\n\t// The Amazon Web Services account ID associated with the registry containing the\n\t// image.\n\tRegistryId *string\n\n\t// The name of the repository associated with the image.\n\tRepositoryName *string\n\n\tnoSmithyDocumentSerde\n}\n\n// An object that describes an image returned by a DescribeImages operation.\ntype ImageDetail struct {\n\n\t// The artifact media type of the image.\n\tArtifactMediaType *string\n\n\t// The sha256 digest of the image manifest.\n\tImageDigest *string\n\n\t// The media type of the image manifest.\n\tImageManifestMediaType *string\n\n\t// The date and time, expressed in standard JavaScript date format, at which the\n\t// current image was pushed to the repository.\n\tImagePushedAt *time.Time\n\n\t// A summary of the last completed image scan.\n\tImageScanFindingsSummary *ImageScanFindingsSummary\n\n\t// The current state of the scan.\n\tImageScanStatus *ImageScanStatus\n\n\t// The size, in bytes, of the image in the repository.\n\t//\n\t// If the image is a manifest list, this will be the max size of all manifests in\n\t// the list.\n\t//\n\t// Starting with Docker version 1.9, the Docker client compresses image layers\n\t// before pushing them to a V2 Docker registry. The output of the docker images\n\t// command shows the uncompressed image size. Therefore, Docker might return a\n\t// larger image than the image sizes returned by DescribeImages.\n\tImageSizeInBytes *int64\n\n\t// The list of tags associated with this image.\n\tImageTags []string\n\n\t// The date and time, expressed in standard JavaScript date format, when Amazon\n\t// ECR recorded the last image pull.\n\t//\n\t// Amazon ECR refreshes the last image pull timestamp at least once every 24\n\t// hours. For example, if you pull an image once a day then the\n\t// lastRecordedPullTime timestamp will indicate the exact time that the image was\n\t// last pulled. However, if you pull an image once an hour, because Amazon ECR\n\t// refreshes the lastRecordedPullTime timestamp at least once every 24 hours, the\n\t// result may not be the exact time that the image was last pulled.\n\tLastRecordedPullTime *time.Time\n\n\t// The Amazon Web Services account ID associated with the registry to which this\n\t// image belongs.\n\tRegistryId *string\n\n\t// The name of the repository to which this image belongs.\n\tRepositoryName *string\n\n\tnoSmithyDocumentSerde\n}\n\n// An object representing an Amazon ECR image failure.\ntype ImageFailure struct {\n\n\t// The code associated with the failure.\n\tFailureCode ImageFailureCode\n\n\t// The reason for the failure.\n\tFailureReason *string\n\n\t// The image ID associated with the failure.\n\tImageId *ImageIdentifier\n\n\tnoSmithyDocumentSerde\n}\n\n// An object with identifying information for an image in an Amazon ECR repository.\ntype ImageIdentifier struct {\n\n\t// The sha256 digest of the image manifest.\n\tImageDigest *string\n\n\t// The tag used for the image.\n\tImageTag *string\n\n\tnoSmithyDocumentSerde\n}\n\n// The status of the replication process for an image.\ntype ImageReplicationStatus struct {\n\n\t// The failure code for a replication that has failed.\n\tFailureCode *string\n\n\t// The destination Region for the image replication.\n\tRegion *string\n\n\t// The Amazon Web Services account ID associated with the registry to which the\n\t// image belongs.\n\tRegistryId *string\n\n\t// The image replication status.\n\tStatus ReplicationStatus\n\n\tnoSmithyDocumentSerde\n}\n\n// Contains information about an image scan finding.\ntype ImageScanFinding struct {\n\n\t// A collection of attributes of the host from which the finding is generated.\n\tAttributes []Attribute\n\n\t// The description of the finding.\n\tDescription *string\n\n\t// The name associated with the finding, usually a CVE number.\n\tName *string\n\n\t// The finding severity.\n\tSeverity FindingSeverity\n\n\t// A link containing additional details about the security vulnerability.\n\tUri *string\n\n\tnoSmithyDocumentSerde\n}\n\n// The details of an image scan.\ntype ImageScanFindings struct {\n\n\t// Details about the enhanced scan findings from Amazon Inspector.\n\tEnhancedFindings []EnhancedImageScanFinding\n\n\t// The image vulnerability counts, sorted by severity.\n\tFindingSeverityCounts map[string]int32\n\n\t// The findings from the image scan.\n\tFindings []ImageScanFinding\n\n\t// The time of the last completed image scan.\n\tImageScanCompletedAt *time.Time\n\n\t// The time when the vulnerability data was last scanned.\n\tVulnerabilitySourceUpdatedAt *time.Time\n\n\tnoSmithyDocumentSerde\n}\n\n// A summary of the last completed image scan.\ntype ImageScanFindingsSummary struct {\n\n\t// The image vulnerability counts, sorted by severity.\n\tFindingSeverityCounts map[string]int32\n\n\t// The time of the last completed image scan.\n\tImageScanCompletedAt *time.Time\n\n\t// The time when the vulnerability data was last scanned.\n\tVulnerabilitySourceUpdatedAt *time.Time\n\n\tnoSmithyDocumentSerde\n}\n\n// The image scanning configuration for a repository.\ntype ImageScanningConfiguration struct {\n\n\t// The setting that determines whether images are scanned after being pushed to a\n\t// repository. If set to true , images will be scanned after being pushed. If this\n\t// parameter is not specified, it will default to false and images will not be\n\t// scanned unless a scan is manually started with the [API_StartImageScan]API.\n\t//\n\t// [API_StartImageScan]: https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_StartImageScan.html\n\tScanOnPush bool\n\n\tnoSmithyDocumentSerde\n}\n\n// The current status of an image scan.\ntype ImageScanStatus struct {\n\n\t// The description of the image scan status.\n\tDescription *string\n\n\t// The current state of an image scan.\n\tStatus ScanStatus\n\n\tnoSmithyDocumentSerde\n}\n\n// An object representing an Amazon ECR image layer.\ntype Layer struct {\n\n\t// The availability status of the image layer.\n\tLayerAvailability LayerAvailability\n\n\t// The sha256 digest of the image layer.\n\tLayerDigest *string\n\n\t// The size, in bytes, of the image layer.\n\tLayerSize *int64\n\n\t// The media type of the layer, such as\n\t// application/vnd.docker.image.rootfs.diff.tar.gzip or\n\t// application/vnd.oci.image.layer.v1.tar+gzip .\n\tMediaType *string\n\n\tnoSmithyDocumentSerde\n}\n\n// An object representing an Amazon ECR image layer failure.\ntype LayerFailure struct {\n\n\t// The failure code associated with the failure.\n\tFailureCode LayerFailureCode\n\n\t// The reason for the failure.\n\tFailureReason *string\n\n\t// The layer digest associated with the failure.\n\tLayerDigest *string\n\n\tnoSmithyDocumentSerde\n}\n\n// The filter for the lifecycle policy preview.\ntype LifecyclePolicyPreviewFilter struct {\n\n\t// The tag status of the image.\n\tTagStatus TagStatus\n\n\tnoSmithyDocumentSerde\n}\n\n// The result of the lifecycle policy preview.\ntype LifecyclePolicyPreviewResult struct {\n\n\t// The type of action to be taken.\n\tAction *LifecyclePolicyRuleAction\n\n\t// The priority of the applied rule.\n\tAppliedRulePriority *int32\n\n\t// The sha256 digest of the image manifest.\n\tImageDigest *string\n\n\t// The date and time, expressed in standard JavaScript date format, at which the\n\t// current image was pushed to the repository.\n\tImagePushedAt *time.Time\n\n\t// The list of tags associated with this image.\n\tImageTags []string\n\n\tnoSmithyDocumentSerde\n}\n\n// The summary of the lifecycle policy preview request.\ntype LifecyclePolicyPreviewSummary struct {\n\n\t// The number of expiring images.\n\tExpiringImageTotalCount *int32\n\n\tnoSmithyDocumentSerde\n}\n\n// The type of action to be taken.\ntype LifecyclePolicyRuleAction struct {\n\n\t// The type of action to be taken.\n\tType ImageActionType\n\n\tnoSmithyDocumentSerde\n}\n\n// An object representing a filter on a ListImages operation.\ntype ListImagesFilter struct {\n\n\t// The tag status with which to filter your ListImages results. You can filter results based\n\t// on whether they are TAGGED or UNTAGGED .\n\tTagStatus TagStatus\n\n\tnoSmithyDocumentSerde\n}\n\n// Information about a package vulnerability finding.\ntype PackageVulnerabilityDetails struct {\n\n\t// An object that contains details about the CVSS score of a finding.\n\tCvss []CvssScore\n\n\t// One or more URLs that contain details about this vulnerability type.\n\tReferenceUrls []string\n\n\t// One or more vulnerabilities related to the one identified in this finding.\n\tRelatedVulnerabilities []string\n\n\t// The source of the vulnerability information.\n\tSource *string\n\n\t// A URL to the source of the vulnerability information.\n\tSourceUrl *string\n\n\t// The date and time that this vulnerability was first added to the vendor's\n\t// database.\n\tVendorCreatedAt *time.Time\n\n\t// The severity the vendor has given to this vulnerability type.\n\tVendorSeverity *string\n\n\t// The date and time the vendor last updated this vulnerability in their database.\n\tVendorUpdatedAt *time.Time\n\n\t// The ID given to this vulnerability.\n\tVulnerabilityId *string\n\n\t// The packages impacted by this vulnerability.\n\tVulnerablePackages []VulnerablePackage\n\n\tnoSmithyDocumentSerde\n}\n\n// The details of a pull through cache rule.\ntype PullThroughCacheRule struct {\n\n\t// The date and time the pull through cache was created.\n\tCreatedAt *time.Time\n\n\t// The ARN of the Secrets Manager secret associated with the pull through cache\n\t// rule.\n\tCredentialArn *string\n\n\t// The ARN of the IAM role associated with the pull through cache rule.\n\tCustomRoleArn *string\n\n\t// The Amazon ECR repository prefix associated with the pull through cache rule.\n\tEcrRepositoryPrefix *string\n\n\t// The Amazon Web Services account ID associated with the registry the pull\n\t// through cache rule is associated with.\n\tRegistryId *string\n\n\t// The date and time, in JavaScript date format, when the pull through cache rule\n\t// was last updated.\n\tUpdatedAt *time.Time\n\n\t// The name of the upstream source registry associated with the pull through cache\n\t// rule.\n\tUpstreamRegistry UpstreamRegistry\n\n\t// The upstream registry URL associated with the pull through cache rule.\n\tUpstreamRegistryUrl *string\n\n\t// The upstream repository prefix associated with the pull through cache rule.\n\tUpstreamRepositoryPrefix *string\n\n\tnoSmithyDocumentSerde\n}\n\n// Details about the recommended course of action to remediate the finding.\ntype Recommendation struct {\n\n\t// The recommended course of action to remediate the finding.\n\tText *string\n\n\t// The URL address to the CVE remediation recommendations.\n\tUrl *string\n\n\tnoSmithyDocumentSerde\n}\n\n// The scanning configuration for a private registry.\ntype RegistryScanningConfiguration struct {\n\n\t// The scanning rules associated with the registry.\n\tRules []RegistryScanningRule\n\n\t// The type of scanning configured for the registry.\n\tScanType ScanType\n\n\tnoSmithyDocumentSerde\n}\n\n// The details of a scanning rule for a private registry.\ntype RegistryScanningRule struct {\n\n\t// The repository filters associated with the scanning configuration for a private\n\t// registry.\n\t//\n\t// This member is required.\n\tRepositoryFilters []ScanningRepositoryFilter\n\n\t// The frequency that scans are performed at for a private registry. When the\n\t// ENHANCED scan type is specified, the supported scan frequencies are\n\t// CONTINUOUS_SCAN and SCAN_ON_PUSH . When the BASIC scan type is specified, the\n\t// SCAN_ON_PUSH scan frequency is supported. If scan on push is not specified, then\n\t// the MANUAL scan frequency is set by default.\n\t//\n\t// This member is required.\n\tScanFrequency ScanFrequency\n\n\tnoSmithyDocumentSerde\n}\n\n// Information on how to remediate a finding.\ntype Remediation struct {\n\n\t// An object that contains information about the recommended course of action to\n\t// remediate the finding.\n\tRecommendation *Recommendation\n\n\tnoSmithyDocumentSerde\n}\n\n// The replication configuration for a registry.\ntype ReplicationConfiguration struct {\n\n\t// An array of objects representing the replication destinations and repository\n\t// filters for a replication configuration.\n\t//\n\t// This member is required.\n\tRules []ReplicationRule\n\n\tnoSmithyDocumentSerde\n}\n\n// An array of objects representing the destination for a replication rule.\ntype ReplicationDestination struct {\n\n\t// The Region to replicate to.\n\t//\n\t// This member is required.\n\tRegion *string\n\n\t// The Amazon Web Services account ID of the Amazon ECR private registry to\n\t// replicate to. When configuring cross-Region replication within your own\n\t// registry, specify your own account ID.\n\t//\n\t// This member is required.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\n// An array of objects representing the replication destinations and repository\n// filters for a replication configuration.\ntype ReplicationRule struct {\n\n\t// An array of objects representing the destination for a replication rule.\n\t//\n\t// This member is required.\n\tDestinations []ReplicationDestination\n\n\t// An array of objects representing the filters for a replication rule. Specifying\n\t// a repository filter for a replication rule provides a method for controlling\n\t// which repositories in a private registry are replicated.\n\tRepositoryFilters []RepositoryFilter\n\n\tnoSmithyDocumentSerde\n}\n\n// An object representing a repository.\ntype Repository struct {\n\n\t// The date and time, in JavaScript date format, when the repository was created.\n\tCreatedAt *time.Time\n\n\t// The encryption configuration for the repository. This determines how the\n\t// contents of your repository are encrypted at rest.\n\tEncryptionConfiguration *EncryptionConfiguration\n\n\t// The image scanning configuration for a repository.\n\tImageScanningConfiguration *ImageScanningConfiguration\n\n\t// The tag mutability setting for the repository.\n\tImageTagMutability ImageTagMutability\n\n\t// The Amazon Web Services account ID associated with the registry that contains\n\t// the repository.\n\tRegistryId *string\n\n\t// The Amazon Resource Name (ARN) that identifies the repository. The ARN contains\n\t// the arn:aws:ecr namespace, followed by the region of the repository, Amazon Web\n\t// Services account ID of the repository owner, repository namespace, and\n\t// repository name. For example,\n\t// arn:aws:ecr:region:012345678910:repository-namespace/repository-name .\n\tRepositoryArn *string\n\n\t// The name of the repository.\n\tRepositoryName *string\n\n\t// The URI for the repository. You can use this URI for container image push and\n\t// pull operations.\n\tRepositoryUri *string\n\n\tnoSmithyDocumentSerde\n}\n\n// The details of the repository creation template associated with the request.\ntype RepositoryCreationTemplate struct {\n\n\t// A list of enumerable Strings representing the repository creation scenarios\n\t// that this template will apply towards. The two supported scenarios are\n\t// PULL_THROUGH_CACHE and REPLICATION\n\tAppliedFor []RCTAppliedFor\n\n\t// The date and time, in JavaScript date format, when the repository creation\n\t// template was created.\n\tCreatedAt *time.Time\n\n\t// The ARN of the role to be assumed by Amazon ECR. Amazon ECR will assume your\n\t// supplied role when the customRoleArn is specified. When this field isn't\n\t// specified, Amazon ECR will use the service-linked role for the repository\n\t// creation template.\n\tCustomRoleArn *string\n\n\t// The description associated with the repository creation template.\n\tDescription *string\n\n\t// The encryption configuration associated with the repository creation template.\n\tEncryptionConfiguration *EncryptionConfigurationForRepositoryCreationTemplate\n\n\t// The tag mutability setting for the repository. If this parameter is omitted,\n\t// the default setting of MUTABLE will be used which will allow image tags to be\n\t// overwritten. If IMMUTABLE is specified, all image tags within the repository\n\t// will be immutable which will prevent them from being overwritten.\n\tImageTagMutability ImageTagMutability\n\n\t// The lifecycle policy to use for repositories created using the template.\n\tLifecyclePolicy *string\n\n\t// The repository namespace prefix associated with the repository creation\n\t// template.\n\tPrefix *string\n\n\t// The repository policy to apply to repositories created using the template. A\n\t// repository policy is a permissions policy associated with a repository to\n\t// control access permissions.\n\tRepositoryPolicy *string\n\n\t// The metadata to apply to the repository to help you categorize and organize.\n\t// Each tag consists of a key and an optional value, both of which you define. Tag\n\t// keys can have a maximum character length of 128 characters, and tag values can\n\t// have a maximum length of 256 characters.\n\tResourceTags []Tag\n\n\t// The date and time, in JavaScript date format, when the repository creation\n\t// template was last updated.\n\tUpdatedAt *time.Time\n\n\tnoSmithyDocumentSerde\n}\n\n// The filter settings used with image replication. Specifying a repository filter\n// to a replication rule provides a method for controlling which repositories in a\n// private registry are replicated. If no filters are added, the contents of all\n// repositories are replicated.\ntype RepositoryFilter struct {\n\n\t// The repository filter details. When the PREFIX_MATCH filter type is specified,\n\t// this value is required and should be the repository name prefix to configure\n\t// replication for.\n\t//\n\t// This member is required.\n\tFilter *string\n\n\t// The repository filter type. The only supported value is PREFIX_MATCH , which is\n\t// a repository name prefix specified with the filter parameter.\n\t//\n\t// This member is required.\n\tFilterType RepositoryFilterType\n\n\tnoSmithyDocumentSerde\n}\n\n// The details of the scanning configuration for a repository.\ntype RepositoryScanningConfiguration struct {\n\n\t// The scan filters applied to the repository.\n\tAppliedScanFilters []ScanningRepositoryFilter\n\n\t// The ARN of the repository.\n\tRepositoryArn *string\n\n\t// The name of the repository.\n\tRepositoryName *string\n\n\t// The scan frequency for the repository.\n\tScanFrequency ScanFrequency\n\n\t// Whether or not scan on push is configured for the repository.\n\tScanOnPush bool\n\n\tnoSmithyDocumentSerde\n}\n\n// The details about any failures associated with the scanning configuration of a\n// repository.\ntype RepositoryScanningConfigurationFailure struct {\n\n\t// The failure code.\n\tFailureCode ScanningConfigurationFailureCode\n\n\t// The reason for the failure.\n\tFailureReason *string\n\n\t// The name of the repository.\n\tRepositoryName *string\n\n\tnoSmithyDocumentSerde\n}\n\n// Details about the resource involved in a finding.\ntype Resource struct {\n\n\t// An object that contains details about the resource involved in a finding.\n\tDetails *ResourceDetails\n\n\t// The ID of the resource.\n\tId *string\n\n\t// The tags attached to the resource.\n\tTags map[string]string\n\n\t// The type of resource.\n\tType *string\n\n\tnoSmithyDocumentSerde\n}\n\n// Contains details about the resource involved in the finding.\ntype ResourceDetails struct {\n\n\t// An object that contains details about the Amazon ECR container image involved\n\t// in the finding.\n\tAwsEcrContainerImage *AwsEcrContainerImageDetails\n\n\tnoSmithyDocumentSerde\n}\n\n// The details of a scanning repository filter. For more information on how to use\n// filters, see [Using filters]in the Amazon Elastic Container Registry User Guide.\n//\n// [Using filters]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-scanning.html#image-scanning-filters\ntype ScanningRepositoryFilter struct {\n\n\t// The filter to use when scanning.\n\t//\n\t// This member is required.\n\tFilter *string\n\n\t// The type associated with the filter.\n\t//\n\t// This member is required.\n\tFilterType ScanningRepositoryFilterType\n\n\tnoSmithyDocumentSerde\n}\n\n// Information about the Amazon Inspector score given to a finding.\ntype ScoreDetails struct {\n\n\t// An object that contains details about the CVSS score given to a finding.\n\tCvss *CvssScoreDetails\n\n\tnoSmithyDocumentSerde\n}\n\n// The metadata to apply to a resource to help you categorize and organize them.\n// Each tag consists of a key and a value, both of which you define. Tag keys can\n// have a maximum character length of 128 characters, and tag values can have a\n// maximum length of 256 characters.\ntype Tag struct {\n\n\t// One part of a key-value pair that make up a tag. A key is a general label that\n\t// acts like a category for more specific tag values.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// A value acts as a descriptor within a tag category (key).\n\t//\n\t// This member is required.\n\tValue *string\n\n\tnoSmithyDocumentSerde\n}\n\n// Information on the vulnerable package identified by a finding.\ntype VulnerablePackage struct {\n\n\t// The architecture of the vulnerable package.\n\tArch *string\n\n\t// The epoch of the vulnerable package.\n\tEpoch *int32\n\n\t// The file path of the vulnerable package.\n\tFilePath *string\n\n\t// The version of the package that contains the vulnerability fix.\n\tFixedInVersion *string\n\n\t// The name of the vulnerable package.\n\tName *string\n\n\t// The package manager of the vulnerable package.\n\tPackageManager *string\n\n\t// The release of the vulnerable package.\n\tRelease *string\n\n\t// The source layer hash of the vulnerable package.\n\tSourceLayerHash *string\n\n\t// The version of the vulnerable package.\n\tVersion *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype noSmithyDocumentSerde = smithydocument.NoSerde\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecr/validators.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecr\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecr/types\"\n\tsmithy \"github.com/aws/smithy-go\"\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\ntype validateOpBatchCheckLayerAvailability struct {\n}\n\nfunc (*validateOpBatchCheckLayerAvailability) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpBatchCheckLayerAvailability) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*BatchCheckLayerAvailabilityInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpBatchCheckLayerAvailabilityInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpBatchDeleteImage struct {\n}\n\nfunc (*validateOpBatchDeleteImage) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpBatchDeleteImage) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*BatchDeleteImageInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpBatchDeleteImageInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpBatchGetImage struct {\n}\n\nfunc (*validateOpBatchGetImage) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpBatchGetImage) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*BatchGetImageInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpBatchGetImageInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpBatchGetRepositoryScanningConfiguration struct {\n}\n\nfunc (*validateOpBatchGetRepositoryScanningConfiguration) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpBatchGetRepositoryScanningConfiguration) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*BatchGetRepositoryScanningConfigurationInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpBatchGetRepositoryScanningConfigurationInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpCompleteLayerUpload struct {\n}\n\nfunc (*validateOpCompleteLayerUpload) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpCompleteLayerUpload) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*CompleteLayerUploadInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpCompleteLayerUploadInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpCreatePullThroughCacheRule struct {\n}\n\nfunc (*validateOpCreatePullThroughCacheRule) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpCreatePullThroughCacheRule) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*CreatePullThroughCacheRuleInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpCreatePullThroughCacheRuleInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpCreateRepositoryCreationTemplate struct {\n}\n\nfunc (*validateOpCreateRepositoryCreationTemplate) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpCreateRepositoryCreationTemplate) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*CreateRepositoryCreationTemplateInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpCreateRepositoryCreationTemplateInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpCreateRepository struct {\n}\n\nfunc (*validateOpCreateRepository) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpCreateRepository) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*CreateRepositoryInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpCreateRepositoryInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpDeleteLifecyclePolicy struct {\n}\n\nfunc (*validateOpDeleteLifecyclePolicy) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpDeleteLifecyclePolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*DeleteLifecyclePolicyInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpDeleteLifecyclePolicyInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpDeletePullThroughCacheRule struct {\n}\n\nfunc (*validateOpDeletePullThroughCacheRule) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpDeletePullThroughCacheRule) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*DeletePullThroughCacheRuleInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpDeletePullThroughCacheRuleInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpDeleteRepositoryCreationTemplate struct {\n}\n\nfunc (*validateOpDeleteRepositoryCreationTemplate) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpDeleteRepositoryCreationTemplate) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*DeleteRepositoryCreationTemplateInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpDeleteRepositoryCreationTemplateInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpDeleteRepository struct {\n}\n\nfunc (*validateOpDeleteRepository) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpDeleteRepository) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*DeleteRepositoryInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpDeleteRepositoryInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpDeleteRepositoryPolicy struct {\n}\n\nfunc (*validateOpDeleteRepositoryPolicy) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpDeleteRepositoryPolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*DeleteRepositoryPolicyInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpDeleteRepositoryPolicyInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpDescribeImageReplicationStatus struct {\n}\n\nfunc (*validateOpDescribeImageReplicationStatus) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpDescribeImageReplicationStatus) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*DescribeImageReplicationStatusInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpDescribeImageReplicationStatusInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpDescribeImageScanFindings struct {\n}\n\nfunc (*validateOpDescribeImageScanFindings) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpDescribeImageScanFindings) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*DescribeImageScanFindingsInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpDescribeImageScanFindingsInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpDescribeImages struct {\n}\n\nfunc (*validateOpDescribeImages) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpDescribeImages) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*DescribeImagesInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpDescribeImagesInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpGetAccountSetting struct {\n}\n\nfunc (*validateOpGetAccountSetting) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpGetAccountSetting) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*GetAccountSettingInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpGetAccountSettingInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpGetDownloadUrlForLayer struct {\n}\n\nfunc (*validateOpGetDownloadUrlForLayer) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpGetDownloadUrlForLayer) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*GetDownloadUrlForLayerInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpGetDownloadUrlForLayerInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpGetLifecyclePolicy struct {\n}\n\nfunc (*validateOpGetLifecyclePolicy) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpGetLifecyclePolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*GetLifecyclePolicyInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpGetLifecyclePolicyInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpGetLifecyclePolicyPreview struct {\n}\n\nfunc (*validateOpGetLifecyclePolicyPreview) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpGetLifecyclePolicyPreview) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*GetLifecyclePolicyPreviewInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpGetLifecyclePolicyPreviewInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpGetRepositoryPolicy struct {\n}\n\nfunc (*validateOpGetRepositoryPolicy) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpGetRepositoryPolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*GetRepositoryPolicyInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpGetRepositoryPolicyInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpInitiateLayerUpload struct {\n}\n\nfunc (*validateOpInitiateLayerUpload) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpInitiateLayerUpload) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*InitiateLayerUploadInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpInitiateLayerUploadInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpListImages struct {\n}\n\nfunc (*validateOpListImages) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpListImages) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*ListImagesInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpListImagesInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpListTagsForResource struct {\n}\n\nfunc (*validateOpListTagsForResource) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpListTagsForResource) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*ListTagsForResourceInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpListTagsForResourceInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpPutAccountSetting struct {\n}\n\nfunc (*validateOpPutAccountSetting) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpPutAccountSetting) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*PutAccountSettingInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpPutAccountSettingInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpPutImage struct {\n}\n\nfunc (*validateOpPutImage) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpPutImage) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*PutImageInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpPutImageInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpPutImageScanningConfiguration struct {\n}\n\nfunc (*validateOpPutImageScanningConfiguration) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpPutImageScanningConfiguration) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*PutImageScanningConfigurationInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpPutImageScanningConfigurationInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpPutImageTagMutability struct {\n}\n\nfunc (*validateOpPutImageTagMutability) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpPutImageTagMutability) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*PutImageTagMutabilityInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpPutImageTagMutabilityInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpPutLifecyclePolicy struct {\n}\n\nfunc (*validateOpPutLifecyclePolicy) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpPutLifecyclePolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*PutLifecyclePolicyInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpPutLifecyclePolicyInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpPutRegistryPolicy struct {\n}\n\nfunc (*validateOpPutRegistryPolicy) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpPutRegistryPolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*PutRegistryPolicyInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpPutRegistryPolicyInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpPutRegistryScanningConfiguration struct {\n}\n\nfunc (*validateOpPutRegistryScanningConfiguration) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpPutRegistryScanningConfiguration) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*PutRegistryScanningConfigurationInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpPutRegistryScanningConfigurationInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpPutReplicationConfiguration struct {\n}\n\nfunc (*validateOpPutReplicationConfiguration) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpPutReplicationConfiguration) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*PutReplicationConfigurationInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpPutReplicationConfigurationInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpSetRepositoryPolicy struct {\n}\n\nfunc (*validateOpSetRepositoryPolicy) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpSetRepositoryPolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*SetRepositoryPolicyInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpSetRepositoryPolicyInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpStartImageScan struct {\n}\n\nfunc (*validateOpStartImageScan) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpStartImageScan) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*StartImageScanInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpStartImageScanInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpStartLifecyclePolicyPreview struct {\n}\n\nfunc (*validateOpStartLifecyclePolicyPreview) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpStartLifecyclePolicyPreview) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*StartLifecyclePolicyPreviewInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpStartLifecyclePolicyPreviewInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpTagResource struct {\n}\n\nfunc (*validateOpTagResource) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpTagResource) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*TagResourceInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpTagResourceInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpUntagResource struct {\n}\n\nfunc (*validateOpUntagResource) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpUntagResource) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*UntagResourceInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpUntagResourceInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpUpdatePullThroughCacheRule struct {\n}\n\nfunc (*validateOpUpdatePullThroughCacheRule) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpUpdatePullThroughCacheRule) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*UpdatePullThroughCacheRuleInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpUpdatePullThroughCacheRuleInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpUpdateRepositoryCreationTemplate struct {\n}\n\nfunc (*validateOpUpdateRepositoryCreationTemplate) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpUpdateRepositoryCreationTemplate) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*UpdateRepositoryCreationTemplateInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpUpdateRepositoryCreationTemplateInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpUploadLayerPart struct {\n}\n\nfunc (*validateOpUploadLayerPart) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpUploadLayerPart) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*UploadLayerPartInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpUploadLayerPartInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpValidatePullThroughCacheRule struct {\n}\n\nfunc (*validateOpValidatePullThroughCacheRule) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpValidatePullThroughCacheRule) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*ValidatePullThroughCacheRuleInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpValidatePullThroughCacheRuleInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\nfunc addOpBatchCheckLayerAvailabilityValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpBatchCheckLayerAvailability{}, middleware.After)\n}\n\nfunc addOpBatchDeleteImageValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpBatchDeleteImage{}, middleware.After)\n}\n\nfunc addOpBatchGetImageValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpBatchGetImage{}, middleware.After)\n}\n\nfunc addOpBatchGetRepositoryScanningConfigurationValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpBatchGetRepositoryScanningConfiguration{}, middleware.After)\n}\n\nfunc addOpCompleteLayerUploadValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpCompleteLayerUpload{}, middleware.After)\n}\n\nfunc addOpCreatePullThroughCacheRuleValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpCreatePullThroughCacheRule{}, middleware.After)\n}\n\nfunc addOpCreateRepositoryCreationTemplateValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpCreateRepositoryCreationTemplate{}, middleware.After)\n}\n\nfunc addOpCreateRepositoryValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpCreateRepository{}, middleware.After)\n}\n\nfunc addOpDeleteLifecyclePolicyValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpDeleteLifecyclePolicy{}, middleware.After)\n}\n\nfunc addOpDeletePullThroughCacheRuleValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpDeletePullThroughCacheRule{}, middleware.After)\n}\n\nfunc addOpDeleteRepositoryCreationTemplateValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpDeleteRepositoryCreationTemplate{}, middleware.After)\n}\n\nfunc addOpDeleteRepositoryValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpDeleteRepository{}, middleware.After)\n}\n\nfunc addOpDeleteRepositoryPolicyValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpDeleteRepositoryPolicy{}, middleware.After)\n}\n\nfunc addOpDescribeImageReplicationStatusValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpDescribeImageReplicationStatus{}, middleware.After)\n}\n\nfunc addOpDescribeImageScanFindingsValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpDescribeImageScanFindings{}, middleware.After)\n}\n\nfunc addOpDescribeImagesValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpDescribeImages{}, middleware.After)\n}\n\nfunc addOpGetAccountSettingValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpGetAccountSetting{}, middleware.After)\n}\n\nfunc addOpGetDownloadUrlForLayerValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpGetDownloadUrlForLayer{}, middleware.After)\n}\n\nfunc addOpGetLifecyclePolicyValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpGetLifecyclePolicy{}, middleware.After)\n}\n\nfunc addOpGetLifecyclePolicyPreviewValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpGetLifecyclePolicyPreview{}, middleware.After)\n}\n\nfunc addOpGetRepositoryPolicyValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpGetRepositoryPolicy{}, middleware.After)\n}\n\nfunc addOpInitiateLayerUploadValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpInitiateLayerUpload{}, middleware.After)\n}\n\nfunc addOpListImagesValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpListImages{}, middleware.After)\n}\n\nfunc addOpListTagsForResourceValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpListTagsForResource{}, middleware.After)\n}\n\nfunc addOpPutAccountSettingValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpPutAccountSetting{}, middleware.After)\n}\n\nfunc addOpPutImageValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpPutImage{}, middleware.After)\n}\n\nfunc addOpPutImageScanningConfigurationValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpPutImageScanningConfiguration{}, middleware.After)\n}\n\nfunc addOpPutImageTagMutabilityValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpPutImageTagMutability{}, middleware.After)\n}\n\nfunc addOpPutLifecyclePolicyValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpPutLifecyclePolicy{}, middleware.After)\n}\n\nfunc addOpPutRegistryPolicyValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpPutRegistryPolicy{}, middleware.After)\n}\n\nfunc addOpPutRegistryScanningConfigurationValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpPutRegistryScanningConfiguration{}, middleware.After)\n}\n\nfunc addOpPutReplicationConfigurationValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpPutReplicationConfiguration{}, middleware.After)\n}\n\nfunc addOpSetRepositoryPolicyValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpSetRepositoryPolicy{}, middleware.After)\n}\n\nfunc addOpStartImageScanValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpStartImageScan{}, middleware.After)\n}\n\nfunc addOpStartLifecyclePolicyPreviewValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpStartLifecyclePolicyPreview{}, middleware.After)\n}\n\nfunc addOpTagResourceValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpTagResource{}, middleware.After)\n}\n\nfunc addOpUntagResourceValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpUntagResource{}, middleware.After)\n}\n\nfunc addOpUpdatePullThroughCacheRuleValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpUpdatePullThroughCacheRule{}, middleware.After)\n}\n\nfunc addOpUpdateRepositoryCreationTemplateValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpUpdateRepositoryCreationTemplate{}, middleware.After)\n}\n\nfunc addOpUploadLayerPartValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpUploadLayerPart{}, middleware.After)\n}\n\nfunc addOpValidatePullThroughCacheRuleValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpValidatePullThroughCacheRule{}, middleware.After)\n}\n\nfunc validateEncryptionConfiguration(v *types.EncryptionConfiguration) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"EncryptionConfiguration\"}\n\tif len(v.EncryptionType) == 0 {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"EncryptionType\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateEncryptionConfigurationForRepositoryCreationTemplate(v *types.EncryptionConfigurationForRepositoryCreationTemplate) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"EncryptionConfigurationForRepositoryCreationTemplate\"}\n\tif len(v.EncryptionType) == 0 {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"EncryptionType\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateRegistryScanningRule(v *types.RegistryScanningRule) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"RegistryScanningRule\"}\n\tif len(v.ScanFrequency) == 0 {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"ScanFrequency\"))\n\t}\n\tif v.RepositoryFilters == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryFilters\"))\n\t} else if v.RepositoryFilters != nil {\n\t\tif err := validateScanningRepositoryFilterList(v.RepositoryFilters); err != nil {\n\t\t\tinvalidParams.AddNested(\"RepositoryFilters\", err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateRegistryScanningRuleList(v []types.RegistryScanningRule) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"RegistryScanningRuleList\"}\n\tfor i := range v {\n\t\tif err := validateRegistryScanningRule(&v[i]); err != nil {\n\t\t\tinvalidParams.AddNested(fmt.Sprintf(\"[%d]\", i), err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateReplicationConfiguration(v *types.ReplicationConfiguration) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"ReplicationConfiguration\"}\n\tif v.Rules == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"Rules\"))\n\t} else if v.Rules != nil {\n\t\tif err := validateReplicationRuleList(v.Rules); err != nil {\n\t\t\tinvalidParams.AddNested(\"Rules\", err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateReplicationDestination(v *types.ReplicationDestination) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"ReplicationDestination\"}\n\tif v.Region == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"Region\"))\n\t}\n\tif v.RegistryId == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RegistryId\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateReplicationDestinationList(v []types.ReplicationDestination) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"ReplicationDestinationList\"}\n\tfor i := range v {\n\t\tif err := validateReplicationDestination(&v[i]); err != nil {\n\t\t\tinvalidParams.AddNested(fmt.Sprintf(\"[%d]\", i), err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateReplicationRule(v *types.ReplicationRule) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"ReplicationRule\"}\n\tif v.Destinations == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"Destinations\"))\n\t} else if v.Destinations != nil {\n\t\tif err := validateReplicationDestinationList(v.Destinations); err != nil {\n\t\t\tinvalidParams.AddNested(\"Destinations\", err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif v.RepositoryFilters != nil {\n\t\tif err := validateRepositoryFilterList(v.RepositoryFilters); err != nil {\n\t\t\tinvalidParams.AddNested(\"RepositoryFilters\", err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateReplicationRuleList(v []types.ReplicationRule) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"ReplicationRuleList\"}\n\tfor i := range v {\n\t\tif err := validateReplicationRule(&v[i]); err != nil {\n\t\t\tinvalidParams.AddNested(fmt.Sprintf(\"[%d]\", i), err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateRepositoryFilter(v *types.RepositoryFilter) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"RepositoryFilter\"}\n\tif v.Filter == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"Filter\"))\n\t}\n\tif len(v.FilterType) == 0 {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"FilterType\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateRepositoryFilterList(v []types.RepositoryFilter) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"RepositoryFilterList\"}\n\tfor i := range v {\n\t\tif err := validateRepositoryFilter(&v[i]); err != nil {\n\t\t\tinvalidParams.AddNested(fmt.Sprintf(\"[%d]\", i), err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateScanningRepositoryFilter(v *types.ScanningRepositoryFilter) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"ScanningRepositoryFilter\"}\n\tif v.Filter == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"Filter\"))\n\t}\n\tif len(v.FilterType) == 0 {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"FilterType\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateScanningRepositoryFilterList(v []types.ScanningRepositoryFilter) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"ScanningRepositoryFilterList\"}\n\tfor i := range v {\n\t\tif err := validateScanningRepositoryFilter(&v[i]); err != nil {\n\t\t\tinvalidParams.AddNested(fmt.Sprintf(\"[%d]\", i), err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateTag(v *types.Tag) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"Tag\"}\n\tif v.Key == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"Key\"))\n\t}\n\tif v.Value == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"Value\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateTagList(v []types.Tag) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"TagList\"}\n\tfor i := range v {\n\t\tif err := validateTag(&v[i]); err != nil {\n\t\t\tinvalidParams.AddNested(fmt.Sprintf(\"[%d]\", i), err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpBatchCheckLayerAvailabilityInput(v *BatchCheckLayerAvailabilityInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"BatchCheckLayerAvailabilityInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.LayerDigests == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"LayerDigests\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpBatchDeleteImageInput(v *BatchDeleteImageInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"BatchDeleteImageInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.ImageIds == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"ImageIds\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpBatchGetImageInput(v *BatchGetImageInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"BatchGetImageInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.ImageIds == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"ImageIds\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpBatchGetRepositoryScanningConfigurationInput(v *BatchGetRepositoryScanningConfigurationInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"BatchGetRepositoryScanningConfigurationInput\"}\n\tif v.RepositoryNames == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryNames\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpCompleteLayerUploadInput(v *CompleteLayerUploadInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"CompleteLayerUploadInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.UploadId == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"UploadId\"))\n\t}\n\tif v.LayerDigests == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"LayerDigests\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpCreatePullThroughCacheRuleInput(v *CreatePullThroughCacheRuleInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"CreatePullThroughCacheRuleInput\"}\n\tif v.EcrRepositoryPrefix == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"EcrRepositoryPrefix\"))\n\t}\n\tif v.UpstreamRegistryUrl == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"UpstreamRegistryUrl\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpCreateRepositoryCreationTemplateInput(v *CreateRepositoryCreationTemplateInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"CreateRepositoryCreationTemplateInput\"}\n\tif v.Prefix == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"Prefix\"))\n\t}\n\tif v.EncryptionConfiguration != nil {\n\t\tif err := validateEncryptionConfigurationForRepositoryCreationTemplate(v.EncryptionConfiguration); err != nil {\n\t\t\tinvalidParams.AddNested(\"EncryptionConfiguration\", err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif v.ResourceTags != nil {\n\t\tif err := validateTagList(v.ResourceTags); err != nil {\n\t\t\tinvalidParams.AddNested(\"ResourceTags\", err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif v.AppliedFor == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"AppliedFor\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpCreateRepositoryInput(v *CreateRepositoryInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"CreateRepositoryInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.Tags != nil {\n\t\tif err := validateTagList(v.Tags); err != nil {\n\t\t\tinvalidParams.AddNested(\"Tags\", err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif v.EncryptionConfiguration != nil {\n\t\tif err := validateEncryptionConfiguration(v.EncryptionConfiguration); err != nil {\n\t\t\tinvalidParams.AddNested(\"EncryptionConfiguration\", err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpDeleteLifecyclePolicyInput(v *DeleteLifecyclePolicyInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"DeleteLifecyclePolicyInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpDeletePullThroughCacheRuleInput(v *DeletePullThroughCacheRuleInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"DeletePullThroughCacheRuleInput\"}\n\tif v.EcrRepositoryPrefix == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"EcrRepositoryPrefix\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpDeleteRepositoryCreationTemplateInput(v *DeleteRepositoryCreationTemplateInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"DeleteRepositoryCreationTemplateInput\"}\n\tif v.Prefix == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"Prefix\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpDeleteRepositoryInput(v *DeleteRepositoryInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"DeleteRepositoryInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpDeleteRepositoryPolicyInput(v *DeleteRepositoryPolicyInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"DeleteRepositoryPolicyInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpDescribeImageReplicationStatusInput(v *DescribeImageReplicationStatusInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"DescribeImageReplicationStatusInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.ImageId == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"ImageId\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpDescribeImageScanFindingsInput(v *DescribeImageScanFindingsInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"DescribeImageScanFindingsInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.ImageId == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"ImageId\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpDescribeImagesInput(v *DescribeImagesInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"DescribeImagesInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpGetAccountSettingInput(v *GetAccountSettingInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"GetAccountSettingInput\"}\n\tif v.Name == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"Name\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpGetDownloadUrlForLayerInput(v *GetDownloadUrlForLayerInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"GetDownloadUrlForLayerInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.LayerDigest == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"LayerDigest\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpGetLifecyclePolicyInput(v *GetLifecyclePolicyInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"GetLifecyclePolicyInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpGetLifecyclePolicyPreviewInput(v *GetLifecyclePolicyPreviewInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"GetLifecyclePolicyPreviewInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpGetRepositoryPolicyInput(v *GetRepositoryPolicyInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"GetRepositoryPolicyInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpInitiateLayerUploadInput(v *InitiateLayerUploadInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"InitiateLayerUploadInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpListImagesInput(v *ListImagesInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"ListImagesInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpListTagsForResourceInput(v *ListTagsForResourceInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"ListTagsForResourceInput\"}\n\tif v.ResourceArn == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"ResourceArn\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpPutAccountSettingInput(v *PutAccountSettingInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"PutAccountSettingInput\"}\n\tif v.Name == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"Name\"))\n\t}\n\tif v.Value == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"Value\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpPutImageInput(v *PutImageInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"PutImageInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.ImageManifest == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"ImageManifest\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpPutImageScanningConfigurationInput(v *PutImageScanningConfigurationInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"PutImageScanningConfigurationInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.ImageScanningConfiguration == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"ImageScanningConfiguration\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpPutImageTagMutabilityInput(v *PutImageTagMutabilityInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"PutImageTagMutabilityInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif len(v.ImageTagMutability) == 0 {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"ImageTagMutability\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpPutLifecyclePolicyInput(v *PutLifecyclePolicyInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"PutLifecyclePolicyInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.LifecyclePolicyText == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"LifecyclePolicyText\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpPutRegistryPolicyInput(v *PutRegistryPolicyInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"PutRegistryPolicyInput\"}\n\tif v.PolicyText == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"PolicyText\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpPutRegistryScanningConfigurationInput(v *PutRegistryScanningConfigurationInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"PutRegistryScanningConfigurationInput\"}\n\tif v.Rules != nil {\n\t\tif err := validateRegistryScanningRuleList(v.Rules); err != nil {\n\t\t\tinvalidParams.AddNested(\"Rules\", err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpPutReplicationConfigurationInput(v *PutReplicationConfigurationInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"PutReplicationConfigurationInput\"}\n\tif v.ReplicationConfiguration == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"ReplicationConfiguration\"))\n\t} else if v.ReplicationConfiguration != nil {\n\t\tif err := validateReplicationConfiguration(v.ReplicationConfiguration); err != nil {\n\t\t\tinvalidParams.AddNested(\"ReplicationConfiguration\", err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpSetRepositoryPolicyInput(v *SetRepositoryPolicyInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"SetRepositoryPolicyInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.PolicyText == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"PolicyText\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpStartImageScanInput(v *StartImageScanInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"StartImageScanInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.ImageId == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"ImageId\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpStartLifecyclePolicyPreviewInput(v *StartLifecyclePolicyPreviewInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"StartLifecyclePolicyPreviewInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpTagResourceInput(v *TagResourceInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"TagResourceInput\"}\n\tif v.ResourceArn == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"ResourceArn\"))\n\t}\n\tif v.Tags == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"Tags\"))\n\t} else if v.Tags != nil {\n\t\tif err := validateTagList(v.Tags); err != nil {\n\t\t\tinvalidParams.AddNested(\"Tags\", err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpUntagResourceInput(v *UntagResourceInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"UntagResourceInput\"}\n\tif v.ResourceArn == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"ResourceArn\"))\n\t}\n\tif v.TagKeys == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"TagKeys\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpUpdatePullThroughCacheRuleInput(v *UpdatePullThroughCacheRuleInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"UpdatePullThroughCacheRuleInput\"}\n\tif v.EcrRepositoryPrefix == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"EcrRepositoryPrefix\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpUpdateRepositoryCreationTemplateInput(v *UpdateRepositoryCreationTemplateInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"UpdateRepositoryCreationTemplateInput\"}\n\tif v.Prefix == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"Prefix\"))\n\t}\n\tif v.EncryptionConfiguration != nil {\n\t\tif err := validateEncryptionConfigurationForRepositoryCreationTemplate(v.EncryptionConfiguration); err != nil {\n\t\t\tinvalidParams.AddNested(\"EncryptionConfiguration\", err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif v.ResourceTags != nil {\n\t\tif err := validateTagList(v.ResourceTags); err != nil {\n\t\t\tinvalidParams.AddNested(\"ResourceTags\", err.(smithy.InvalidParamsError))\n\t\t}\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpUploadLayerPartInput(v *UploadLayerPartInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"UploadLayerPartInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.UploadId == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"UploadId\"))\n\t}\n\tif v.PartFirstByte == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"PartFirstByte\"))\n\t}\n\tif v.PartLastByte == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"PartLastByte\"))\n\t}\n\tif v.LayerPartBlob == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"LayerPartBlob\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpValidatePullThroughCacheRuleInput(v *ValidatePullThroughCacheRuleInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"ValidatePullThroughCacheRuleInput\"}\n\tif v.EcrRepositoryPrefix == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"EcrRepositoryPrefix\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/CHANGELOG.md",
    "content": "# v1.33.0 (2025-04-30)\n\n* **Feature**: Adds dualstack support for Amazon Elastic Container Registry Public (Amazon ECR Public).\n\n# v1.32.2 (2025-04-03)\n\n* No change notes available for this release.\n\n# v1.32.1 (2025-03-04.2)\n\n* **Bug Fix**: Add assurance test for operation order.\n\n# v1.32.0 (2025-02-27)\n\n* **Feature**: Track credential providers via User-Agent Feature ids\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.31.3 (2025-02-18)\n\n* **Bug Fix**: Bump go version to 1.22\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.31.2 (2025-02-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.31.1 (2025-01-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.31.0 (2025-01-30)\n\n* **Feature**: Temporarily updating dualstack endpoint support\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.30.0 (2025-01-29)\n\n* **Feature**: Add support for Dualstack Endpoints\n\n# v1.29.5 (2025-01-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n* **Dependency Update**: Upgrade to smithy-go v1.22.2.\n\n# v1.29.4 (2025-01-17)\n\n* **Bug Fix**: Fix bug where credentials weren't refreshed during retry loop.\n\n# v1.29.3 (2025-01-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.2 (2025-01-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.1 (2025-01-03)\n\n* No change notes available for this release.\n\n# v1.29.0 (2024-12-28)\n\n* **Feature**: Restoring custom endpoint functionality for ECR Public\n\n# v1.28.1 (2024-12-26)\n\n* No change notes available for this release.\n\n# v1.28.0 (2024-12-23)\n\n* **Feature**: Add support for Dualstack endpoints\n\n# v1.27.8 (2024-12-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.7 (2024-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.6 (2024-11-18)\n\n* **Dependency Update**: Update to smithy-go v1.22.1.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.5 (2024-11-07)\n\n* **Bug Fix**: Adds case-insensitive handling of error message fields in service responses\n\n# v1.27.4 (2024-11-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.3 (2024-10-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.2 (2024-10-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.1 (2024-10-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.0 (2024-10-04)\n\n* **Feature**: Add support for HTTP client metrics.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.26.4 (2024-10-03)\n\n* No change notes available for this release.\n\n# v1.26.3 (2024-09-27)\n\n* No change notes available for this release.\n\n# v1.26.2 (2024-09-25)\n\n* No change notes available for this release.\n\n# v1.26.1 (2024-09-23)\n\n* No change notes available for this release.\n\n# v1.26.0 (2024-09-20)\n\n* **Feature**: Add tracing and metrics support to service clients.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.7 (2024-09-17)\n\n* **Bug Fix**: **BREAKFIX**: Only generate AccountIDEndpointMode config for services that use it. This is a compiler break, but removes no actual functionality, as no services currently use the account ID in endpoint resolution.\n\n# v1.25.6 (2024-09-04)\n\n* No change notes available for this release.\n\n# v1.25.5 (2024-09-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.4 (2024-08-15)\n\n* **Dependency Update**: Bump minimum Go version to 1.21.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.3 (2024-07-10.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.2 (2024-07-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.1 (2024-06-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.0 (2024-06-26)\n\n* **Feature**: Support list-of-string endpoint parameter.\n\n# v1.24.1 (2024-06-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.24.0 (2024-06-18)\n\n* **Feature**: Track usage of various AWS SDK features in user-agent string.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.23.11 (2024-06-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.23.10 (2024-06-07)\n\n* **Bug Fix**: Add clock skew correction on all service clients\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.23.9 (2024-06-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.23.8 (2024-05-23)\n\n* No change notes available for this release.\n\n# v1.23.7 (2024-05-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.23.6 (2024-05-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.23.5 (2024-05-08)\n\n* **Bug Fix**: GoDoc improvement\n\n# v1.23.4 (2024-03-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.23.3 (2024-03-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.23.2 (2024-03-07)\n\n* **Bug Fix**: Remove dependency on go-cmp.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.23.1 (2024-02-23)\n\n* **Bug Fix**: Move all common, SDK-side middleware stack ops into the service client module to prevent cross-module compatibility issues in the future.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.23.0 (2024-02-22)\n\n* **Feature**: Add middleware stack snapshot tests.\n\n# v1.22.3 (2024-02-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.22.2 (2024-02-20)\n\n* **Bug Fix**: When sourcing values for a service's `EndpointParameters`, the lack of a configured region (i.e. `options.Region == \"\"`) will now translate to a `nil` value for `EndpointParameters.Region` instead of a pointer to the empty string `\"\"`. This will result in a much more explicit error when calling an operation instead of an obscure hostname lookup failure.\n\n# v1.22.1 (2024-02-15)\n\n* **Bug Fix**: Correct failure to determine the error type in awsJson services that could occur when errors were modeled with a non-string `code` field.\n\n# v1.22.0 (2024-02-13)\n\n* **Feature**: Bump minimum Go version to 1.20 per our language support policy.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.21.6 (2024-01-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.21.5 (2023-12-08)\n\n* **Bug Fix**: Reinstate presence of default Retryer in functional options, but still respect max attempts set therein.\n\n# v1.21.4 (2023-12-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.21.3 (2023-12-06)\n\n* **Bug Fix**: Restore pre-refactor auth behavior where all operations could technically be performed anonymously.\n\n# v1.21.2 (2023-12-01)\n\n* **Bug Fix**: Correct wrapping of errors in authentication workflow.\n* **Bug Fix**: Correctly recognize cache-wrapped instances of AnonymousCredentials at client construction.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.21.1 (2023-11-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.21.0 (2023-11-29)\n\n* **Feature**: Expose Options() accessor on service clients.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.20.5 (2023-11-28.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.20.4 (2023-11-28)\n\n* **Bug Fix**: Respect setting RetryMaxAttempts in functional options at client construction.\n\n# v1.20.3 (2023-11-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.20.2 (2023-11-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.20.1 (2023-11-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.20.0 (2023-11-01)\n\n* **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.19.0 (2023-10-31)\n\n* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.2 (2023-10-12)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.1 (2023-10-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.0 (2023-09-18)\n\n* **Announcement**: [BREAKFIX] Change in MaxResults datatype from value to pointer type in cognito-sync service.\n* **Feature**: Adds several endpoint ruleset changes across all models: smaller rulesets, removed non-unique regional endpoints, fixes FIPS and DualStack endpoints, and make region not required in SDK::Endpoint. Additional breakfix to cognito-sync field.\n\n# v1.17.5 (2023-08-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.4 (2023-08-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.3 (2023-08-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.2 (2023-08-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.1 (2023-08-01)\n\n* No change notes available for this release.\n\n# v1.17.0 (2023-07-31)\n\n* **Feature**: Adds support for smithy-modeled endpoint resolution. A new rules-based endpoint resolution will be added to the SDK which will supercede and deprecate existing endpoint resolution. Specifically, EndpointResolver will be deprecated while BaseEndpoint and EndpointResolverV2 will take its place. For more information, please see the Endpoints section in our Developer Guide.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.6 (2023-07-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.5 (2023-07-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.4 (2023-06-15)\n\n* No change notes available for this release.\n\n# v1.16.3 (2023-06-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.2 (2023-05-04)\n\n* No change notes available for this release.\n\n# v1.16.1 (2023-04-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.0 (2023-04-11)\n\n* **Feature**: This release will allow using registry alias as registryId in BatchDeleteImage request.\n\n# v1.15.8 (2023-04-10)\n\n* No change notes available for this release.\n\n# v1.15.7 (2023-04-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.6 (2023-03-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.5 (2023-03-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.4 (2023-02-22)\n\n* **Bug Fix**: Prevent nil pointer dereference when retrieving error codes.\n\n# v1.15.3 (2023-02-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.2 (2023-02-15)\n\n* **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910.\n* **Bug Fix**: Correct error type parsing for restJson services.\n\n# v1.15.1 (2023-02-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.0 (2023-01-09)\n\n* **Feature**: This release for Amazon ECR Public makes several change to bring the SDK into sync with the API.\n\n# v1.14.0 (2023-01-05)\n\n* **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401).\n\n# v1.13.22 (2022-12-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.21 (2022-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.20 (2022-11-30)\n\n* No change notes available for this release.\n\n# v1.13.19 (2022-10-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.18 (2022-10-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.17 (2022-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.16 (2022-09-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.15 (2022-09-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.14 (2022-08-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.13 (2022-08-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.12 (2022-08-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.11 (2022-08-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.10 (2022-08-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.9 (2022-08-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.8 (2022-07-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.7 (2022-06-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.6 (2022-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.5 (2022-05-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.4 (2022-04-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.3 (2022-03-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.2 (2022-03-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.1 (2022-03-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.0 (2022-03-08)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.0 (2022-02-24)\n\n* **Feature**: API client updated\n* **Feature**: Adds RetryMaxAttempts and RetryMod to API client Options. This allows the API clients' default Retryer to be configured from the shared configuration files or environment variables. Adding a new Retry mode of `Adaptive`. `Adaptive` retry mode is an experimental mode, adding client rate limiting when throttles reponses are received from an API. See [retry.AdaptiveMode](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/retry#AdaptiveMode) for more details, and configuration options.\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.0 (2022-01-14)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.0 (2022-01-07)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.0 (2021-12-21)\n\n* **Feature**: API Paginators now support specifying the initial starting token, and support stopping on empty string tokens.\n\n# v1.8.2 (2021-12-02)\n\n* **Bug Fix**: Fixes a bug that prevented aws.EndpointResolverWithOptions from being used by the service client. ([#1514](https://github.com/aws/aws-sdk-go-v2/pull/1514))\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.8.1 (2021-11-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.8.0 (2021-11-12)\n\n* **Feature**: Service clients now support custom endpoints that have an initial URI path defined.\n\n# v1.7.0 (2021-11-06)\n\n* **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically.\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.6.0 (2021-10-21)\n\n* **Feature**: Updated  to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.2 (2021-10-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.1 (2021-09-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.0 (2021-08-27)\n\n* **Feature**: Updated API model to latest revision.\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.3 (2021-08-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.2 (2021-08-04)\n\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.1 (2021-07-15)\n\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.0 (2021-06-25)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.1 (2021-05-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.0 (2021-05-14)\n\n* **Feature**: Constant has been added to modules to enable runtime version inspection for reporting.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_client.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/defaults\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/retry\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tawshttp \"github.com/aws/aws-sdk-go-v2/aws/transport/http\"\n\tinternalauth \"github.com/aws/aws-sdk-go-v2/internal/auth\"\n\tinternalauthsmithy \"github.com/aws/aws-sdk-go-v2/internal/auth/smithy\"\n\tinternalConfig \"github.com/aws/aws-sdk-go-v2/internal/configsources\"\n\tinternalmiddleware \"github.com/aws/aws-sdk-go-v2/internal/middleware\"\n\tsmithy \"github.com/aws/smithy-go\"\n\tsmithyauth \"github.com/aws/smithy-go/auth\"\n\tsmithydocument \"github.com/aws/smithy-go/document\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"github.com/aws/smithy-go/metrics\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"net\"\n\t\"net/http\"\n\t\"sync/atomic\"\n\t\"time\"\n)\n\nconst ServiceID = \"ECR PUBLIC\"\nconst ServiceAPIVersion = \"2020-10-30\"\n\ntype operationMetrics struct {\n\tDuration                metrics.Float64Histogram\n\tSerializeDuration       metrics.Float64Histogram\n\tResolveIdentityDuration metrics.Float64Histogram\n\tResolveEndpointDuration metrics.Float64Histogram\n\tSignRequestDuration     metrics.Float64Histogram\n\tDeserializeDuration     metrics.Float64Histogram\n}\n\nfunc (m *operationMetrics) histogramFor(name string) metrics.Float64Histogram {\n\tswitch name {\n\tcase \"client.call.duration\":\n\t\treturn m.Duration\n\tcase \"client.call.serialization_duration\":\n\t\treturn m.SerializeDuration\n\tcase \"client.call.resolve_identity_duration\":\n\t\treturn m.ResolveIdentityDuration\n\tcase \"client.call.resolve_endpoint_duration\":\n\t\treturn m.ResolveEndpointDuration\n\tcase \"client.call.signing_duration\":\n\t\treturn m.SignRequestDuration\n\tcase \"client.call.deserialization_duration\":\n\t\treturn m.DeserializeDuration\n\tdefault:\n\t\tpanic(\"unrecognized operation metric\")\n\t}\n}\n\nfunc timeOperationMetric[T any](\n\tctx context.Context, metric string, fn func() (T, error),\n\topts ...metrics.RecordMetricOption,\n) (T, error) {\n\tinstr := getOperationMetrics(ctx).histogramFor(metric)\n\topts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...)\n\n\tstart := time.Now()\n\tv, err := fn()\n\tend := time.Now()\n\n\telapsed := end.Sub(start)\n\tinstr.Record(ctx, float64(elapsed)/1e9, opts...)\n\treturn v, err\n}\n\nfunc startMetricTimer(ctx context.Context, metric string, opts ...metrics.RecordMetricOption) func() {\n\tinstr := getOperationMetrics(ctx).histogramFor(metric)\n\topts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...)\n\n\tvar ended bool\n\tstart := time.Now()\n\treturn func() {\n\t\tif ended {\n\t\t\treturn\n\t\t}\n\t\tended = true\n\n\t\tend := time.Now()\n\n\t\telapsed := end.Sub(start)\n\t\tinstr.Record(ctx, float64(elapsed)/1e9, opts...)\n\t}\n}\n\nfunc withOperationMetadata(ctx context.Context) metrics.RecordMetricOption {\n\treturn func(o *metrics.RecordMetricOptions) {\n\t\to.Properties.Set(\"rpc.service\", middleware.GetServiceID(ctx))\n\t\to.Properties.Set(\"rpc.method\", middleware.GetOperationName(ctx))\n\t}\n}\n\ntype operationMetricsKey struct{}\n\nfunc withOperationMetrics(parent context.Context, mp metrics.MeterProvider) (context.Context, error) {\n\tmeter := mp.Meter(\"github.com/aws/aws-sdk-go-v2/service/ecrpublic\")\n\tom := &operationMetrics{}\n\n\tvar err error\n\n\tom.Duration, err = operationMetricTimer(meter, \"client.call.duration\",\n\t\t\"Overall call duration (including retries and time to send or receive request and response body)\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tom.SerializeDuration, err = operationMetricTimer(meter, \"client.call.serialization_duration\",\n\t\t\"The time it takes to serialize a message body\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tom.ResolveIdentityDuration, err = operationMetricTimer(meter, \"client.call.auth.resolve_identity_duration\",\n\t\t\"The time taken to acquire an identity (AWS credentials, bearer token, etc) from an Identity Provider\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tom.ResolveEndpointDuration, err = operationMetricTimer(meter, \"client.call.resolve_endpoint_duration\",\n\t\t\"The time it takes to resolve an endpoint (endpoint resolver, not DNS) for the request\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tom.SignRequestDuration, err = operationMetricTimer(meter, \"client.call.auth.signing_duration\",\n\t\t\"The time it takes to sign a request\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tom.DeserializeDuration, err = operationMetricTimer(meter, \"client.call.deserialization_duration\",\n\t\t\"The time it takes to deserialize a message body\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn context.WithValue(parent, operationMetricsKey{}, om), nil\n}\n\nfunc operationMetricTimer(m metrics.Meter, name, desc string) (metrics.Float64Histogram, error) {\n\treturn m.Float64Histogram(name, func(o *metrics.InstrumentOptions) {\n\t\to.UnitLabel = \"s\"\n\t\to.Description = desc\n\t})\n}\n\nfunc getOperationMetrics(ctx context.Context) *operationMetrics {\n\treturn ctx.Value(operationMetricsKey{}).(*operationMetrics)\n}\n\nfunc operationTracer(p tracing.TracerProvider) tracing.Tracer {\n\treturn p.Tracer(\"github.com/aws/aws-sdk-go-v2/service/ecrpublic\")\n}\n\n// Client provides the API client to make operations call for Amazon Elastic\n// Container Registry Public.\ntype Client struct {\n\toptions Options\n\n\t// Difference between the time reported by the server and the client\n\ttimeOffset *atomic.Int64\n}\n\n// New returns an initialized Client based on the functional options. Provide\n// additional functional options to further configure the behavior of the client,\n// such as changing the client's endpoint or adding custom middleware behavior.\nfunc New(options Options, optFns ...func(*Options)) *Client {\n\toptions = options.Copy()\n\n\tresolveDefaultLogger(&options)\n\n\tsetResolvedDefaultsMode(&options)\n\n\tresolveRetryer(&options)\n\n\tresolveHTTPClient(&options)\n\n\tresolveHTTPSignerV4(&options)\n\n\tresolveEndpointResolverV2(&options)\n\n\tresolveTracerProvider(&options)\n\n\tresolveMeterProvider(&options)\n\n\tresolveAuthSchemeResolver(&options)\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tfinalizeRetryMaxAttempts(&options)\n\n\tignoreAnonymousAuth(&options)\n\n\twrapWithAnonymousAuth(&options)\n\n\tresolveAuthSchemes(&options)\n\n\tclient := &Client{\n\t\toptions: options,\n\t}\n\n\tinitializeTimeOffsetResolver(client)\n\n\treturn client\n}\n\n// Options returns a copy of the client configuration.\n//\n// Callers SHOULD NOT perform mutations on any inner structures within client\n// config. Config overrides should instead be made on a per-operation basis through\n// functional options.\nfunc (c *Client) Options() Options {\n\treturn c.options.Copy()\n}\n\nfunc (c *Client) invokeOperation(\n\tctx context.Context, opID string, params interface{}, optFns []func(*Options), stackFns ...func(*middleware.Stack, Options) error,\n) (\n\tresult interface{}, metadata middleware.Metadata, err error,\n) {\n\tctx = middleware.ClearStackValues(ctx)\n\tctx = middleware.WithServiceID(ctx, ServiceID)\n\tctx = middleware.WithOperationName(ctx, opID)\n\n\tstack := middleware.NewStack(opID, smithyhttp.NewStackRequest)\n\toptions := c.options.Copy()\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tfinalizeOperationRetryMaxAttempts(&options, *c)\n\n\tfinalizeClientEndpointResolverOptions(&options)\n\n\tfor _, fn := range stackFns {\n\t\tif err := fn(stack, options); err != nil {\n\t\t\treturn nil, metadata, err\n\t\t}\n\t}\n\n\tfor _, fn := range options.APIOptions {\n\t\tif err := fn(stack); err != nil {\n\t\t\treturn nil, metadata, err\n\t\t}\n\t}\n\n\tctx, err = withOperationMetrics(ctx, options.MeterProvider)\n\tif err != nil {\n\t\treturn nil, metadata, err\n\t}\n\n\ttracer := operationTracer(options.TracerProvider)\n\tspanName := fmt.Sprintf(\"%s.%s\", ServiceID, opID)\n\n\tctx = tracing.WithOperationTracer(ctx, tracer)\n\n\tctx, span := tracer.StartSpan(ctx, spanName, func(o *tracing.SpanOptions) {\n\t\to.Kind = tracing.SpanKindClient\n\t\to.Properties.Set(\"rpc.system\", \"aws-api\")\n\t\to.Properties.Set(\"rpc.method\", opID)\n\t\to.Properties.Set(\"rpc.service\", ServiceID)\n\t})\n\tendTimer := startMetricTimer(ctx, \"client.call.duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\n\thandler := smithyhttp.NewClientHandlerWithOptions(options.HTTPClient, func(o *smithyhttp.ClientHandler) {\n\t\to.Meter = options.MeterProvider.Meter(\"github.com/aws/aws-sdk-go-v2/service/ecrpublic\")\n\t})\n\tdecorated := middleware.DecorateHandler(handler, stack)\n\tresult, metadata, err = decorated.Handle(ctx, params)\n\tif err != nil {\n\t\tspan.SetProperty(\"exception.type\", fmt.Sprintf(\"%T\", err))\n\t\tspan.SetProperty(\"exception.message\", err.Error())\n\n\t\tvar aerr smithy.APIError\n\t\tif errors.As(err, &aerr) {\n\t\t\tspan.SetProperty(\"api.error_code\", aerr.ErrorCode())\n\t\t\tspan.SetProperty(\"api.error_message\", aerr.ErrorMessage())\n\t\t\tspan.SetProperty(\"api.error_fault\", aerr.ErrorFault().String())\n\t\t}\n\n\t\terr = &smithy.OperationError{\n\t\t\tServiceID:     ServiceID,\n\t\t\tOperationName: opID,\n\t\t\tErr:           err,\n\t\t}\n\t}\n\n\tspan.SetProperty(\"error\", err != nil)\n\tif err == nil {\n\t\tspan.SetStatus(tracing.SpanStatusOK)\n\t} else {\n\t\tspan.SetStatus(tracing.SpanStatusError)\n\t}\n\n\treturn result, metadata, err\n}\n\ntype operationInputKey struct{}\n\nfunc setOperationInput(ctx context.Context, input interface{}) context.Context {\n\treturn middleware.WithStackValue(ctx, operationInputKey{}, input)\n}\n\nfunc getOperationInput(ctx context.Context) interface{} {\n\treturn middleware.GetStackValue(ctx, operationInputKey{})\n}\n\ntype setOperationInputMiddleware struct {\n}\n\nfunc (*setOperationInputMiddleware) ID() string {\n\treturn \"setOperationInput\"\n}\n\nfunc (m *setOperationInputMiddleware) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\tctx = setOperationInput(ctx, in.Parameters)\n\treturn next.HandleSerialize(ctx, in)\n}\n\nfunc addProtocolFinalizerMiddlewares(stack *middleware.Stack, options Options, operation string) error {\n\tif err := stack.Finalize.Add(&resolveAuthSchemeMiddleware{operation: operation, options: options}, middleware.Before); err != nil {\n\t\treturn fmt.Errorf(\"add ResolveAuthScheme: %w\", err)\n\t}\n\tif err := stack.Finalize.Insert(&getIdentityMiddleware{options: options}, \"ResolveAuthScheme\", middleware.After); err != nil {\n\t\treturn fmt.Errorf(\"add GetIdentity: %v\", err)\n\t}\n\tif err := stack.Finalize.Insert(&resolveEndpointV2Middleware{options: options}, \"GetIdentity\", middleware.After); err != nil {\n\t\treturn fmt.Errorf(\"add ResolveEndpointV2: %v\", err)\n\t}\n\tif err := stack.Finalize.Insert(&signRequestMiddleware{options: options}, \"ResolveEndpointV2\", middleware.After); err != nil {\n\t\treturn fmt.Errorf(\"add Signing: %w\", err)\n\t}\n\treturn nil\n}\nfunc resolveAuthSchemeResolver(options *Options) {\n\tif options.AuthSchemeResolver == nil {\n\t\toptions.AuthSchemeResolver = &defaultAuthSchemeResolver{}\n\t}\n}\n\nfunc resolveAuthSchemes(options *Options) {\n\tif options.AuthSchemes == nil {\n\t\toptions.AuthSchemes = []smithyhttp.AuthScheme{\n\t\t\tinternalauth.NewHTTPAuthScheme(\"aws.auth#sigv4\", &internalauthsmithy.V4SignerAdapter{\n\t\t\t\tSigner:     options.HTTPSignerV4,\n\t\t\t\tLogger:     options.Logger,\n\t\t\t\tLogSigning: options.ClientLogMode.IsSigning(),\n\t\t\t}),\n\t\t}\n\t}\n}\n\ntype noSmithyDocumentSerde = smithydocument.NoSerde\n\ntype legacyEndpointContextSetter struct {\n\tLegacyResolver EndpointResolver\n}\n\nfunc (*legacyEndpointContextSetter) ID() string {\n\treturn \"legacyEndpointContextSetter\"\n}\n\nfunc (m *legacyEndpointContextSetter) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tif m.LegacyResolver != nil {\n\t\tctx = awsmiddleware.SetRequiresLegacyEndpoints(ctx, true)\n\t}\n\n\treturn next.HandleInitialize(ctx, in)\n\n}\nfunc addlegacyEndpointContextSetter(stack *middleware.Stack, o Options) error {\n\treturn stack.Initialize.Add(&legacyEndpointContextSetter{\n\t\tLegacyResolver: o.EndpointResolver,\n\t}, middleware.Before)\n}\n\nfunc resolveDefaultLogger(o *Options) {\n\tif o.Logger != nil {\n\t\treturn\n\t}\n\to.Logger = logging.Nop{}\n}\n\nfunc addSetLoggerMiddleware(stack *middleware.Stack, o Options) error {\n\treturn middleware.AddSetLoggerMiddleware(stack, o.Logger)\n}\n\nfunc setResolvedDefaultsMode(o *Options) {\n\tif len(o.resolvedDefaultsMode) > 0 {\n\t\treturn\n\t}\n\n\tvar mode aws.DefaultsMode\n\tmode.SetFromString(string(o.DefaultsMode))\n\n\tif mode == aws.DefaultsModeAuto {\n\t\tmode = defaults.ResolveDefaultsModeAuto(o.Region, o.RuntimeEnvironment)\n\t}\n\n\to.resolvedDefaultsMode = mode\n}\n\n// NewFromConfig returns a new client from the provided config.\nfunc NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client {\n\topts := Options{\n\t\tRegion:             cfg.Region,\n\t\tDefaultsMode:       cfg.DefaultsMode,\n\t\tRuntimeEnvironment: cfg.RuntimeEnvironment,\n\t\tHTTPClient:         cfg.HTTPClient,\n\t\tCredentials:        cfg.Credentials,\n\t\tAPIOptions:         cfg.APIOptions,\n\t\tLogger:             cfg.Logger,\n\t\tClientLogMode:      cfg.ClientLogMode,\n\t\tAppID:              cfg.AppID,\n\t}\n\tresolveAWSRetryerProvider(cfg, &opts)\n\tresolveAWSRetryMaxAttempts(cfg, &opts)\n\tresolveAWSRetryMode(cfg, &opts)\n\tresolveAWSEndpointResolver(cfg, &opts)\n\tresolveUseDualStackEndpoint(cfg, &opts)\n\tresolveUseFIPSEndpoint(cfg, &opts)\n\tresolveBaseEndpoint(cfg, &opts)\n\treturn New(opts, optFns...)\n}\n\nfunc resolveHTTPClient(o *Options) {\n\tvar buildable *awshttp.BuildableClient\n\n\tif o.HTTPClient != nil {\n\t\tvar ok bool\n\t\tbuildable, ok = o.HTTPClient.(*awshttp.BuildableClient)\n\t\tif !ok {\n\t\t\treturn\n\t\t}\n\t} else {\n\t\tbuildable = awshttp.NewBuildableClient()\n\t}\n\n\tmodeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode)\n\tif err == nil {\n\t\tbuildable = buildable.WithDialerOptions(func(dialer *net.Dialer) {\n\t\t\tif dialerTimeout, ok := modeConfig.GetConnectTimeout(); ok {\n\t\t\t\tdialer.Timeout = dialerTimeout\n\t\t\t}\n\t\t})\n\n\t\tbuildable = buildable.WithTransportOptions(func(transport *http.Transport) {\n\t\t\tif tlsHandshakeTimeout, ok := modeConfig.GetTLSNegotiationTimeout(); ok {\n\t\t\t\ttransport.TLSHandshakeTimeout = tlsHandshakeTimeout\n\t\t\t}\n\t\t})\n\t}\n\n\to.HTTPClient = buildable\n}\n\nfunc resolveRetryer(o *Options) {\n\tif o.Retryer != nil {\n\t\treturn\n\t}\n\n\tif len(o.RetryMode) == 0 {\n\t\tmodeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode)\n\t\tif err == nil {\n\t\t\to.RetryMode = modeConfig.RetryMode\n\t\t}\n\t}\n\tif len(o.RetryMode) == 0 {\n\t\to.RetryMode = aws.RetryModeStandard\n\t}\n\n\tvar standardOptions []func(*retry.StandardOptions)\n\tif v := o.RetryMaxAttempts; v != 0 {\n\t\tstandardOptions = append(standardOptions, func(so *retry.StandardOptions) {\n\t\t\tso.MaxAttempts = v\n\t\t})\n\t}\n\n\tswitch o.RetryMode {\n\tcase aws.RetryModeAdaptive:\n\t\tvar adaptiveOptions []func(*retry.AdaptiveModeOptions)\n\t\tif len(standardOptions) != 0 {\n\t\t\tadaptiveOptions = append(adaptiveOptions, func(ao *retry.AdaptiveModeOptions) {\n\t\t\t\tao.StandardOptions = append(ao.StandardOptions, standardOptions...)\n\t\t\t})\n\t\t}\n\t\to.Retryer = retry.NewAdaptiveMode(adaptiveOptions...)\n\n\tdefault:\n\t\to.Retryer = retry.NewStandard(standardOptions...)\n\t}\n}\n\nfunc resolveAWSRetryerProvider(cfg aws.Config, o *Options) {\n\tif cfg.Retryer == nil {\n\t\treturn\n\t}\n\to.Retryer = cfg.Retryer()\n}\n\nfunc resolveAWSRetryMode(cfg aws.Config, o *Options) {\n\tif len(cfg.RetryMode) == 0 {\n\t\treturn\n\t}\n\to.RetryMode = cfg.RetryMode\n}\nfunc resolveAWSRetryMaxAttempts(cfg aws.Config, o *Options) {\n\tif cfg.RetryMaxAttempts == 0 {\n\t\treturn\n\t}\n\to.RetryMaxAttempts = cfg.RetryMaxAttempts\n}\n\nfunc finalizeRetryMaxAttempts(o *Options) {\n\tif o.RetryMaxAttempts == 0 {\n\t\treturn\n\t}\n\n\to.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts)\n}\n\nfunc finalizeOperationRetryMaxAttempts(o *Options, client Client) {\n\tif v := o.RetryMaxAttempts; v == 0 || v == client.options.RetryMaxAttempts {\n\t\treturn\n\t}\n\n\to.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts)\n}\n\nfunc resolveAWSEndpointResolver(cfg aws.Config, o *Options) {\n\tif cfg.EndpointResolver == nil && cfg.EndpointResolverWithOptions == nil {\n\t\treturn\n\t}\n\to.EndpointResolver = withEndpointResolver(cfg.EndpointResolver, cfg.EndpointResolverWithOptions)\n}\n\nfunc addClientUserAgent(stack *middleware.Stack, options Options) error {\n\tua, err := getOrAddRequestUserAgent(stack)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tua.AddSDKAgentKeyValue(awsmiddleware.APIMetadata, \"ecrpublic\", goModuleVersion)\n\tif len(options.AppID) > 0 {\n\t\tua.AddSDKAgentKey(awsmiddleware.ApplicationIdentifier, options.AppID)\n\t}\n\n\treturn nil\n}\n\nfunc getOrAddRequestUserAgent(stack *middleware.Stack) (*awsmiddleware.RequestUserAgent, error) {\n\tid := (*awsmiddleware.RequestUserAgent)(nil).ID()\n\tmw, ok := stack.Build.Get(id)\n\tif !ok {\n\t\tmw = awsmiddleware.NewRequestUserAgent()\n\t\tif err := stack.Build.Add(mw, middleware.After); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tua, ok := mw.(*awsmiddleware.RequestUserAgent)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"%T for %s middleware did not match expected type\", mw, id)\n\t}\n\n\treturn ua, nil\n}\n\ntype HTTPSignerV4 interface {\n\tSignHTTP(ctx context.Context, credentials aws.Credentials, r *http.Request, payloadHash string, service string, region string, signingTime time.Time, optFns ...func(*v4.SignerOptions)) error\n}\n\nfunc resolveHTTPSignerV4(o *Options) {\n\tif o.HTTPSignerV4 != nil {\n\t\treturn\n\t}\n\to.HTTPSignerV4 = newDefaultV4Signer(*o)\n}\n\nfunc newDefaultV4Signer(o Options) *v4.Signer {\n\treturn v4.NewSigner(func(so *v4.SignerOptions) {\n\t\tso.Logger = o.Logger\n\t\tso.LogSigning = o.ClientLogMode.IsSigning()\n\t})\n}\n\nfunc addClientRequestID(stack *middleware.Stack) error {\n\treturn stack.Build.Add(&awsmiddleware.ClientRequestID{}, middleware.After)\n}\n\nfunc addComputeContentLength(stack *middleware.Stack) error {\n\treturn stack.Build.Add(&smithyhttp.ComputeContentLength{}, middleware.After)\n}\n\nfunc addRawResponseToMetadata(stack *middleware.Stack) error {\n\treturn stack.Deserialize.Add(&awsmiddleware.AddRawResponse{}, middleware.Before)\n}\n\nfunc addRecordResponseTiming(stack *middleware.Stack) error {\n\treturn stack.Deserialize.Add(&awsmiddleware.RecordResponseTiming{}, middleware.After)\n}\n\nfunc addSpanRetryLoop(stack *middleware.Stack, options Options) error {\n\treturn stack.Finalize.Insert(&spanRetryLoop{options: options}, \"Retry\", middleware.Before)\n}\n\ntype spanRetryLoop struct {\n\toptions Options\n}\n\nfunc (*spanRetryLoop) ID() string {\n\treturn \"spanRetryLoop\"\n}\n\nfunc (m *spanRetryLoop) HandleFinalize(\n\tctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,\n) (\n\tmiddleware.FinalizeOutput, middleware.Metadata, error,\n) {\n\ttracer := operationTracer(m.options.TracerProvider)\n\tctx, span := tracer.StartSpan(ctx, \"RetryLoop\")\n\tdefer span.End()\n\n\treturn next.HandleFinalize(ctx, in)\n}\nfunc addStreamingEventsPayload(stack *middleware.Stack) error {\n\treturn stack.Finalize.Add(&v4.StreamingEventsPayload{}, middleware.Before)\n}\n\nfunc addUnsignedPayload(stack *middleware.Stack) error {\n\treturn stack.Finalize.Insert(&v4.UnsignedPayload{}, \"ResolveEndpointV2\", middleware.After)\n}\n\nfunc addComputePayloadSHA256(stack *middleware.Stack) error {\n\treturn stack.Finalize.Insert(&v4.ComputePayloadSHA256{}, \"ResolveEndpointV2\", middleware.After)\n}\n\nfunc addContentSHA256Header(stack *middleware.Stack) error {\n\treturn stack.Finalize.Insert(&v4.ContentSHA256Header{}, (*v4.ComputePayloadSHA256)(nil).ID(), middleware.After)\n}\n\nfunc addIsWaiterUserAgent(o *Options) {\n\to.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error {\n\t\tua, err := getOrAddRequestUserAgent(stack)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureWaiter)\n\t\treturn nil\n\t})\n}\n\nfunc addIsPaginatorUserAgent(o *Options) {\n\to.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error {\n\t\tua, err := getOrAddRequestUserAgent(stack)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tua.AddUserAgentFeature(awsmiddleware.UserAgentFeaturePaginator)\n\t\treturn nil\n\t})\n}\n\nfunc addRetry(stack *middleware.Stack, o Options) error {\n\tattempt := retry.NewAttemptMiddleware(o.Retryer, smithyhttp.RequestCloner, func(m *retry.Attempt) {\n\t\tm.LogAttempts = o.ClientLogMode.IsRetries()\n\t\tm.OperationMeter = o.MeterProvider.Meter(\"github.com/aws/aws-sdk-go-v2/service/ecrpublic\")\n\t})\n\tif err := stack.Finalize.Insert(attempt, \"ResolveAuthScheme\", middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err := stack.Finalize.Insert(&retry.MetricsHeader{}, attempt.ID(), middleware.After); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// resolves dual-stack endpoint configuration\nfunc resolveUseDualStackEndpoint(cfg aws.Config, o *Options) error {\n\tif len(cfg.ConfigSources) == 0 {\n\t\treturn nil\n\t}\n\tvalue, found, err := internalConfig.ResolveUseDualStackEndpoint(context.Background(), cfg.ConfigSources)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif found {\n\t\to.EndpointOptions.UseDualStackEndpoint = value\n\t}\n\treturn nil\n}\n\n// resolves FIPS endpoint configuration\nfunc resolveUseFIPSEndpoint(cfg aws.Config, o *Options) error {\n\tif len(cfg.ConfigSources) == 0 {\n\t\treturn nil\n\t}\n\tvalue, found, err := internalConfig.ResolveUseFIPSEndpoint(context.Background(), cfg.ConfigSources)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif found {\n\t\to.EndpointOptions.UseFIPSEndpoint = value\n\t}\n\treturn nil\n}\n\nfunc resolveAccountID(identity smithyauth.Identity, mode aws.AccountIDEndpointMode) *string {\n\tif mode == aws.AccountIDEndpointModeDisabled {\n\t\treturn nil\n\t}\n\n\tif ca, ok := identity.(*internalauthsmithy.CredentialsAdapter); ok && ca.Credentials.AccountID != \"\" {\n\t\treturn aws.String(ca.Credentials.AccountID)\n\t}\n\n\treturn nil\n}\n\nfunc addTimeOffsetBuild(stack *middleware.Stack, c *Client) error {\n\tmw := internalmiddleware.AddTimeOffsetMiddleware{Offset: c.timeOffset}\n\tif err := stack.Build.Add(&mw, middleware.After); err != nil {\n\t\treturn err\n\t}\n\treturn stack.Deserialize.Insert(&mw, \"RecordResponseTiming\", middleware.Before)\n}\nfunc initializeTimeOffsetResolver(c *Client) {\n\tc.timeOffset = new(atomic.Int64)\n}\n\nfunc addUserAgentRetryMode(stack *middleware.Stack, options Options) error {\n\tua, err := getOrAddRequestUserAgent(stack)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tswitch options.Retryer.(type) {\n\tcase *retry.Standard:\n\t\tua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRetryModeStandard)\n\tcase *retry.AdaptiveMode:\n\t\tua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRetryModeAdaptive)\n\t}\n\treturn nil\n}\n\ntype setCredentialSourceMiddleware struct {\n\tua      *awsmiddleware.RequestUserAgent\n\toptions Options\n}\n\nfunc (m setCredentialSourceMiddleware) ID() string { return \"SetCredentialSourceMiddleware\" }\n\nfunc (m setCredentialSourceMiddleware) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (\n\tout middleware.BuildOutput, metadata middleware.Metadata, err error,\n) {\n\tasProviderSource, ok := m.options.Credentials.(aws.CredentialProviderSource)\n\tif !ok {\n\t\treturn next.HandleBuild(ctx, in)\n\t}\n\tproviderSources := asProviderSource.ProviderSources()\n\tfor _, source := range providerSources {\n\t\tm.ua.AddCredentialsSource(source)\n\t}\n\treturn next.HandleBuild(ctx, in)\n}\n\nfunc addCredentialSource(stack *middleware.Stack, options Options) error {\n\tua, err := getOrAddRequestUserAgent(stack)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tmw := setCredentialSourceMiddleware{ua: ua, options: options}\n\treturn stack.Build.Insert(&mw, \"UserAgent\", middleware.Before)\n}\n\nfunc resolveTracerProvider(options *Options) {\n\tif options.TracerProvider == nil {\n\t\toptions.TracerProvider = &tracing.NopTracerProvider{}\n\t}\n}\n\nfunc resolveMeterProvider(options *Options) {\n\tif options.MeterProvider == nil {\n\t\toptions.MeterProvider = metrics.NopMeterProvider{}\n\t}\n}\n\nfunc addRecursionDetection(stack *middleware.Stack) error {\n\treturn stack.Build.Add(&awsmiddleware.RecursionDetection{}, middleware.After)\n}\n\nfunc addRequestIDRetrieverMiddleware(stack *middleware.Stack) error {\n\treturn stack.Deserialize.Insert(&awsmiddleware.RequestIDRetriever{}, \"OperationDeserializer\", middleware.Before)\n\n}\n\nfunc addResponseErrorMiddleware(stack *middleware.Stack) error {\n\treturn stack.Deserialize.Insert(&awshttp.ResponseErrorWrapper{}, \"RequestIDRetriever\", middleware.Before)\n\n}\n\nfunc addRequestResponseLogging(stack *middleware.Stack, o Options) error {\n\treturn stack.Deserialize.Add(&smithyhttp.RequestResponseLogger{\n\t\tLogRequest:          o.ClientLogMode.IsRequest(),\n\t\tLogRequestWithBody:  o.ClientLogMode.IsRequestWithBody(),\n\t\tLogResponse:         o.ClientLogMode.IsResponse(),\n\t\tLogResponseWithBody: o.ClientLogMode.IsResponseWithBody(),\n\t}, middleware.After)\n}\n\ntype disableHTTPSMiddleware struct {\n\tDisableHTTPS bool\n}\n\nfunc (*disableHTTPSMiddleware) ID() string {\n\treturn \"disableHTTPS\"\n}\n\nfunc (m *disableHTTPSMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type %T\", in.Request)\n\t}\n\n\tif m.DisableHTTPS && !smithyhttp.GetHostnameImmutable(ctx) {\n\t\treq.URL.Scheme = \"http\"\n\t}\n\n\treturn next.HandleFinalize(ctx, in)\n}\n\nfunc addDisableHTTPSMiddleware(stack *middleware.Stack, o Options) error {\n\treturn stack.Finalize.Insert(&disableHTTPSMiddleware{\n\t\tDisableHTTPS: o.EndpointOptions.DisableHTTPS,\n\t}, \"ResolveEndpointV2\", middleware.After)\n}\n\ntype spanInitializeStart struct {\n}\n\nfunc (*spanInitializeStart) ID() string {\n\treturn \"spanInitializeStart\"\n}\n\nfunc (m *spanInitializeStart) HandleInitialize(\n\tctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler,\n) (\n\tmiddleware.InitializeOutput, middleware.Metadata, error,\n) {\n\tctx, _ = tracing.StartSpan(ctx, \"Initialize\")\n\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype spanInitializeEnd struct {\n}\n\nfunc (*spanInitializeEnd) ID() string {\n\treturn \"spanInitializeEnd\"\n}\n\nfunc (m *spanInitializeEnd) HandleInitialize(\n\tctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler,\n) (\n\tmiddleware.InitializeOutput, middleware.Metadata, error,\n) {\n\tctx, span := tracing.PopSpan(ctx)\n\tspan.End()\n\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype spanBuildRequestStart struct {\n}\n\nfunc (*spanBuildRequestStart) ID() string {\n\treturn \"spanBuildRequestStart\"\n}\n\nfunc (m *spanBuildRequestStart) HandleSerialize(\n\tctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler,\n) (\n\tmiddleware.SerializeOutput, middleware.Metadata, error,\n) {\n\tctx, _ = tracing.StartSpan(ctx, \"BuildRequest\")\n\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype spanBuildRequestEnd struct {\n}\n\nfunc (*spanBuildRequestEnd) ID() string {\n\treturn \"spanBuildRequestEnd\"\n}\n\nfunc (m *spanBuildRequestEnd) HandleBuild(\n\tctx context.Context, in middleware.BuildInput, next middleware.BuildHandler,\n) (\n\tmiddleware.BuildOutput, middleware.Metadata, error,\n) {\n\tctx, span := tracing.PopSpan(ctx)\n\tspan.End()\n\n\treturn next.HandleBuild(ctx, in)\n}\n\nfunc addSpanInitializeStart(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&spanInitializeStart{}, middleware.Before)\n}\n\nfunc addSpanInitializeEnd(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&spanInitializeEnd{}, middleware.After)\n}\n\nfunc addSpanBuildRequestStart(stack *middleware.Stack) error {\n\treturn stack.Serialize.Add(&spanBuildRequestStart{}, middleware.Before)\n}\n\nfunc addSpanBuildRequestEnd(stack *middleware.Stack) error {\n\treturn stack.Build.Add(&spanBuildRequestEnd{}, middleware.After)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_BatchCheckLayerAvailability.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecrpublic/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Checks the availability of one or more image layers that are within a\n// repository in a public registry. When an image is pushed to a repository, each\n// image layer is checked to verify if it has been uploaded before. If it has been\n// uploaded, then the image layer is skipped.\n//\n// This operation is used by the Amazon ECR proxy and is not generally used by\n// customers for pulling and pushing images. In most cases, you should use the\n// docker CLI to pull, tag, and push images.\nfunc (c *Client) BatchCheckLayerAvailability(ctx context.Context, params *BatchCheckLayerAvailabilityInput, optFns ...func(*Options)) (*BatchCheckLayerAvailabilityOutput, error) {\n\tif params == nil {\n\t\tparams = &BatchCheckLayerAvailabilityInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"BatchCheckLayerAvailability\", params, optFns, c.addOperationBatchCheckLayerAvailabilityMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*BatchCheckLayerAvailabilityOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype BatchCheckLayerAvailabilityInput struct {\n\n\t// The digests of the image layers to check.\n\t//\n\t// This member is required.\n\tLayerDigests []string\n\n\t// The name of the repository that's associated with the image layers to check.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID, or registry alias, associated with the\n\t// public registry that contains the image layers to check. If you do not specify a\n\t// registry, the default public registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype BatchCheckLayerAvailabilityOutput struct {\n\n\t// Any failures associated with the call.\n\tFailures []types.LayerFailure\n\n\t// A list of image layer objects that correspond to the image layer references in\n\t// the request.\n\tLayers []types.Layer\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationBatchCheckLayerAvailabilityMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpBatchCheckLayerAvailability{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpBatchCheckLayerAvailability{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"BatchCheckLayerAvailability\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpBatchCheckLayerAvailabilityValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opBatchCheckLayerAvailability(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opBatchCheckLayerAvailability(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"BatchCheckLayerAvailability\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_BatchDeleteImage.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecrpublic/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Deletes a list of specified images that are within a repository in a public\n// registry. Images are specified with either an imageTag or imageDigest .\n//\n// You can remove a tag from an image by specifying the image's tag in your\n// request. When you remove the last tag from an image, the image is deleted from\n// your repository.\n//\n// You can completely delete an image (and all of its tags) by specifying the\n// digest of the image in your request.\nfunc (c *Client) BatchDeleteImage(ctx context.Context, params *BatchDeleteImageInput, optFns ...func(*Options)) (*BatchDeleteImageOutput, error) {\n\tif params == nil {\n\t\tparams = &BatchDeleteImageInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"BatchDeleteImage\", params, optFns, c.addOperationBatchDeleteImageMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*BatchDeleteImageOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype BatchDeleteImageInput struct {\n\n\t// A list of image ID references that correspond to images to delete. The format\n\t// of the imageIds reference is imageTag=tag or imageDigest=digest .\n\t//\n\t// This member is required.\n\tImageIds []types.ImageIdentifier\n\n\t// The repository in a public registry that contains the image to delete.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID, or registry alias, that's associated with\n\t// the registry that contains the image to delete. If you do not specify a\n\t// registry, the default public registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype BatchDeleteImageOutput struct {\n\n\t// Any failures associated with the call.\n\tFailures []types.ImageFailure\n\n\t// The image IDs of the deleted images.\n\tImageIds []types.ImageIdentifier\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationBatchDeleteImageMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpBatchDeleteImage{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpBatchDeleteImage{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"BatchDeleteImage\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpBatchDeleteImageValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opBatchDeleteImage(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opBatchDeleteImage(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"BatchDeleteImage\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_CompleteLayerUpload.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Informs Amazon ECR that the image layer upload is complete for a specified\n// public registry, repository name, and upload ID. You can optionally provide a\n// sha256 digest of the image layer for data validation purposes.\n//\n// When an image is pushed, the CompleteLayerUpload API is called once for each\n// new image layer to verify that the upload is complete.\n//\n// This operation is used by the Amazon ECR proxy and is not generally used by\n// customers for pulling and pushing images. In most cases, you should use the\n// docker CLI to pull, tag, and push images.\nfunc (c *Client) CompleteLayerUpload(ctx context.Context, params *CompleteLayerUploadInput, optFns ...func(*Options)) (*CompleteLayerUploadOutput, error) {\n\tif params == nil {\n\t\tparams = &CompleteLayerUploadInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"CompleteLayerUpload\", params, optFns, c.addOperationCompleteLayerUploadMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*CompleteLayerUploadOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype CompleteLayerUploadInput struct {\n\n\t// The sha256 digest of the image layer.\n\t//\n\t// This member is required.\n\tLayerDigests []string\n\n\t// The name of the repository in a public registry to associate with the image\n\t// layer.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The upload ID from a previous InitiateLayerUpload operation to associate with the image layer.\n\t//\n\t// This member is required.\n\tUploadId *string\n\n\t// The Amazon Web Services account ID, or registry alias, associated with the\n\t// registry where layers are uploaded. If you do not specify a registry, the\n\t// default public registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype CompleteLayerUploadOutput struct {\n\n\t// The sha256 digest of the image layer.\n\tLayerDigest *string\n\n\t// The public registry ID that's associated with the request.\n\tRegistryId *string\n\n\t// The repository name that's associated with the request.\n\tRepositoryName *string\n\n\t// The upload ID that's associated with the layer.\n\tUploadId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationCompleteLayerUploadMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpCompleteLayerUpload{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpCompleteLayerUpload{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"CompleteLayerUpload\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpCompleteLayerUploadValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opCompleteLayerUpload(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opCompleteLayerUpload(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"CompleteLayerUpload\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_CreateRepository.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecrpublic/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Creates a repository in a public registry. For more information, see [Amazon ECR repositories] in the\n// Amazon Elastic Container Registry User Guide.\n//\n// [Amazon ECR repositories]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/Repositories.html\nfunc (c *Client) CreateRepository(ctx context.Context, params *CreateRepositoryInput, optFns ...func(*Options)) (*CreateRepositoryOutput, error) {\n\tif params == nil {\n\t\tparams = &CreateRepositoryInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"CreateRepository\", params, optFns, c.addOperationCreateRepositoryMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*CreateRepositoryOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype CreateRepositoryInput struct {\n\n\t// The name to use for the repository. This appears publicly in the Amazon ECR\n\t// Public Gallery. The repository name can be specified on its own (for example\n\t// nginx-web-app ) or prepended with a namespace to group the repository into a\n\t// category (for example project-a/nginx-web-app ).\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The details about the repository that are publicly visible in the Amazon ECR\n\t// Public Gallery.\n\tCatalogData *types.RepositoryCatalogDataInput\n\n\t// The metadata that you apply to each repository to help categorize and organize\n\t// your repositories. Each tag consists of a key and an optional value. You define\n\t// both of them. Tag keys can have a maximum character length of 128 characters,\n\t// and tag values can have a maximum length of 256 characters.\n\tTags []types.Tag\n\n\tnoSmithyDocumentSerde\n}\n\ntype CreateRepositoryOutput struct {\n\n\t// The catalog data for a repository. This data is publicly visible in the Amazon\n\t// ECR Public Gallery.\n\tCatalogData *types.RepositoryCatalogData\n\n\t// The repository that was created.\n\tRepository *types.Repository\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationCreateRepositoryMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpCreateRepository{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpCreateRepository{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"CreateRepository\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpCreateRepositoryValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateRepository(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opCreateRepository(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"CreateRepository\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DeleteRepository.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecrpublic/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Deletes a repository in a public registry. If the repository contains images,\n// you must either manually delete all images in the repository or use the force\n// option. This option deletes all images on your behalf before deleting the\n// repository.\nfunc (c *Client) DeleteRepository(ctx context.Context, params *DeleteRepositoryInput, optFns ...func(*Options)) (*DeleteRepositoryOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteRepositoryInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteRepository\", params, optFns, c.addOperationDeleteRepositoryMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteRepositoryOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteRepositoryInput struct {\n\n\t// The name of the repository to delete.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t//  The force option can be used to delete a repository that contains images. If\n\t// the force option is not used, the repository must be empty prior to deletion.\n\tForce bool\n\n\t// The Amazon Web Services account ID that's associated with the public registry\n\t// that contains the repository to delete. If you do not specify a registry, the\n\t// default public registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype DeleteRepositoryOutput struct {\n\n\t// The repository that was deleted.\n\tRepository *types.Repository\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteRepositoryMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDeleteRepository{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDeleteRepository{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteRepository\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteRepositoryValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteRepository(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opDeleteRepository(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteRepository\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DeleteRepositoryPolicy.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Deletes the repository policy that's associated with the specified repository.\nfunc (c *Client) DeleteRepositoryPolicy(ctx context.Context, params *DeleteRepositoryPolicyInput, optFns ...func(*Options)) (*DeleteRepositoryPolicyOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteRepositoryPolicyInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteRepositoryPolicy\", params, optFns, c.addOperationDeleteRepositoryPolicyMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteRepositoryPolicyOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteRepositoryPolicyInput struct {\n\n\t// The name of the repository that's associated with the repository policy to\n\t// delete.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID that's associated with the public registry\n\t// that contains the repository policy to delete. If you do not specify a registry,\n\t// the default public registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype DeleteRepositoryPolicyOutput struct {\n\n\t// The JSON repository policy that was deleted from the repository.\n\tPolicyText *string\n\n\t// The registry ID that's associated with the request.\n\tRegistryId *string\n\n\t// The repository name that's associated with the request.\n\tRepositoryName *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteRepositoryPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDeleteRepositoryPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDeleteRepositoryPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteRepositoryPolicy\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteRepositoryPolicyValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteRepositoryPolicy(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opDeleteRepositoryPolicy(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteRepositoryPolicy\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeImageTags.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecrpublic/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Returns the image tag details for a repository in a public registry.\nfunc (c *Client) DescribeImageTags(ctx context.Context, params *DescribeImageTagsInput, optFns ...func(*Options)) (*DescribeImageTagsOutput, error) {\n\tif params == nil {\n\t\tparams = &DescribeImageTagsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DescribeImageTags\", params, optFns, c.addOperationDescribeImageTagsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DescribeImageTagsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DescribeImageTagsInput struct {\n\n\t// The name of the repository that contains the image tag details to describe.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The maximum number of repository results that's returned by DescribeImageTags\n\t// in paginated output. When this parameter is used, DescribeImageTags only\n\t// returns maxResults results in a single page along with a nextToken response\n\t// element. You can see the remaining results of the initial request by sending\n\t// another DescribeImageTags request with the returned nextToken value. This value\n\t// can be between 1 and 1000. If this parameter isn't used, then DescribeImageTags\n\t// returns up to 100 results and a nextToken value, if applicable. If you specify\n\t// images with imageIds , you can't use this option.\n\tMaxResults *int32\n\n\t// The nextToken value that's returned from a previous paginated DescribeImageTags\n\t// request where maxResults was used and the results exceeded the value of that\n\t// parameter. Pagination continues from the end of the previous results that\n\t// returned the nextToken value. If there are no more results to return, this\n\t// value is null . If you specify images with imageIds , you can't use this option.\n\tNextToken *string\n\n\t// The Amazon Web Services account ID that's associated with the public registry\n\t// that contains the repository where images are described. If you do not specify a\n\t// registry, the default public registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype DescribeImageTagsOutput struct {\n\n\t// The image tag details for the images in the requested repository.\n\tImageTagDetails []types.ImageTagDetail\n\n\t// The nextToken value to include in a future DescribeImageTags request. When the\n\t// results of a DescribeImageTags request exceed maxResults , you can use this\n\t// value to retrieve the next page of results. If there are no more results to\n\t// return, this value is null .\n\tNextToken *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDescribeImageTagsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeImageTags{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeImageTags{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DescribeImageTags\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDescribeImageTagsValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeImageTags(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// DescribeImageTagsPaginatorOptions is the paginator options for DescribeImageTags\ntype DescribeImageTagsPaginatorOptions struct {\n\t// The maximum number of repository results that's returned by DescribeImageTags\n\t// in paginated output. When this parameter is used, DescribeImageTags only\n\t// returns maxResults results in a single page along with a nextToken response\n\t// element. You can see the remaining results of the initial request by sending\n\t// another DescribeImageTags request with the returned nextToken value. This value\n\t// can be between 1 and 1000. If this parameter isn't used, then DescribeImageTags\n\t// returns up to 100 results and a nextToken value, if applicable. If you specify\n\t// images with imageIds , you can't use this option.\n\tLimit int32\n\n\t// Set to true if pagination should stop if the service returns a pagination token\n\t// that matches the most recent token provided to the service.\n\tStopOnDuplicateToken bool\n}\n\n// DescribeImageTagsPaginator is a paginator for DescribeImageTags\ntype DescribeImageTagsPaginator struct {\n\toptions   DescribeImageTagsPaginatorOptions\n\tclient    DescribeImageTagsAPIClient\n\tparams    *DescribeImageTagsInput\n\tnextToken *string\n\tfirstPage bool\n}\n\n// NewDescribeImageTagsPaginator returns a new DescribeImageTagsPaginator\nfunc NewDescribeImageTagsPaginator(client DescribeImageTagsAPIClient, params *DescribeImageTagsInput, optFns ...func(*DescribeImageTagsPaginatorOptions)) *DescribeImageTagsPaginator {\n\tif params == nil {\n\t\tparams = &DescribeImageTagsInput{}\n\t}\n\n\toptions := DescribeImageTagsPaginatorOptions{}\n\tif params.MaxResults != nil {\n\t\toptions.Limit = *params.MaxResults\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &DescribeImageTagsPaginator{\n\t\toptions:   options,\n\t\tclient:    client,\n\t\tparams:    params,\n\t\tfirstPage: true,\n\t\tnextToken: params.NextToken,\n\t}\n}\n\n// HasMorePages returns a boolean indicating whether more pages are available\nfunc (p *DescribeImageTagsPaginator) HasMorePages() bool {\n\treturn p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0)\n}\n\n// NextPage retrieves the next DescribeImageTags page.\nfunc (p *DescribeImageTagsPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribeImageTagsOutput, error) {\n\tif !p.HasMorePages() {\n\t\treturn nil, fmt.Errorf(\"no more pages available\")\n\t}\n\n\tparams := *p.params\n\tparams.NextToken = p.nextToken\n\n\tvar limit *int32\n\tif p.options.Limit > 0 {\n\t\tlimit = &p.options.Limit\n\t}\n\tparams.MaxResults = limit\n\n\toptFns = append([]func(*Options){\n\t\taddIsPaginatorUserAgent,\n\t}, optFns...)\n\tresult, err := p.client.DescribeImageTags(ctx, &params, optFns...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.firstPage = false\n\n\tprevToken := p.nextToken\n\tp.nextToken = result.NextToken\n\n\tif p.options.StopOnDuplicateToken &&\n\t\tprevToken != nil &&\n\t\tp.nextToken != nil &&\n\t\t*prevToken == *p.nextToken {\n\t\tp.nextToken = nil\n\t}\n\n\treturn result, nil\n}\n\n// DescribeImageTagsAPIClient is a client that implements the DescribeImageTags\n// operation.\ntype DescribeImageTagsAPIClient interface {\n\tDescribeImageTags(context.Context, *DescribeImageTagsInput, ...func(*Options)) (*DescribeImageTagsOutput, error)\n}\n\nvar _ DescribeImageTagsAPIClient = (*Client)(nil)\n\nfunc newServiceMetadataMiddleware_opDescribeImageTags(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DescribeImageTags\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeImages.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecrpublic/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Returns metadata that's related to the images in a repository in a public\n// registry.\n//\n// Beginning with Docker version 1.9, the Docker client compresses image layers\n// before pushing them to a V2 Docker registry. The output of the docker images\n// command shows the uncompressed image size. Therefore, it might return a larger\n// image size than the image sizes that are returned by DescribeImages.\nfunc (c *Client) DescribeImages(ctx context.Context, params *DescribeImagesInput, optFns ...func(*Options)) (*DescribeImagesOutput, error) {\n\tif params == nil {\n\t\tparams = &DescribeImagesInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DescribeImages\", params, optFns, c.addOperationDescribeImagesMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DescribeImagesOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DescribeImagesInput struct {\n\n\t// The repository that contains the images to describe.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The list of image IDs for the requested repository.\n\tImageIds []types.ImageIdentifier\n\n\t// The maximum number of repository results that's returned by DescribeImages in\n\t// paginated output. When this parameter is used, DescribeImages only returns\n\t// maxResults results in a single page along with a nextToken response element.\n\t// You can see the remaining results of the initial request by sending another\n\t// DescribeImages request with the returned nextToken value. This value can be\n\t// between 1 and 1000. If this parameter isn't used, then DescribeImages returns\n\t// up to 100 results and a nextToken value, if applicable. If you specify images\n\t// with imageIds , you can't use this option.\n\tMaxResults *int32\n\n\t// The nextToken value that's returned from a previous paginated DescribeImages\n\t// request where maxResults was used and the results exceeded the value of that\n\t// parameter. Pagination continues from the end of the previous results that\n\t// returned the nextToken value. If there are no more results to return, this\n\t// value is null . If you specify images with imageIds , you can't use this option.\n\tNextToken *string\n\n\t// The Amazon Web Services account ID that's associated with the public registry\n\t// that contains the repository where images are described. If you do not specify a\n\t// registry, the default public registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype DescribeImagesOutput struct {\n\n\t// A list of ImageDetail objects that contain data about the image.\n\tImageDetails []types.ImageDetail\n\n\t// The nextToken value to include in a future DescribeImages request. When the\n\t// results of a DescribeImages request exceed maxResults , you can use this value\n\t// to retrieve the next page of results. If there are no more results to return,\n\t// this value is null .\n\tNextToken *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDescribeImagesMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeImages{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeImages{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DescribeImages\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDescribeImagesValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeImages(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// DescribeImagesPaginatorOptions is the paginator options for DescribeImages\ntype DescribeImagesPaginatorOptions struct {\n\t// The maximum number of repository results that's returned by DescribeImages in\n\t// paginated output. When this parameter is used, DescribeImages only returns\n\t// maxResults results in a single page along with a nextToken response element.\n\t// You can see the remaining results of the initial request by sending another\n\t// DescribeImages request with the returned nextToken value. This value can be\n\t// between 1 and 1000. If this parameter isn't used, then DescribeImages returns\n\t// up to 100 results and a nextToken value, if applicable. If you specify images\n\t// with imageIds , you can't use this option.\n\tLimit int32\n\n\t// Set to true if pagination should stop if the service returns a pagination token\n\t// that matches the most recent token provided to the service.\n\tStopOnDuplicateToken bool\n}\n\n// DescribeImagesPaginator is a paginator for DescribeImages\ntype DescribeImagesPaginator struct {\n\toptions   DescribeImagesPaginatorOptions\n\tclient    DescribeImagesAPIClient\n\tparams    *DescribeImagesInput\n\tnextToken *string\n\tfirstPage bool\n}\n\n// NewDescribeImagesPaginator returns a new DescribeImagesPaginator\nfunc NewDescribeImagesPaginator(client DescribeImagesAPIClient, params *DescribeImagesInput, optFns ...func(*DescribeImagesPaginatorOptions)) *DescribeImagesPaginator {\n\tif params == nil {\n\t\tparams = &DescribeImagesInput{}\n\t}\n\n\toptions := DescribeImagesPaginatorOptions{}\n\tif params.MaxResults != nil {\n\t\toptions.Limit = *params.MaxResults\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &DescribeImagesPaginator{\n\t\toptions:   options,\n\t\tclient:    client,\n\t\tparams:    params,\n\t\tfirstPage: true,\n\t\tnextToken: params.NextToken,\n\t}\n}\n\n// HasMorePages returns a boolean indicating whether more pages are available\nfunc (p *DescribeImagesPaginator) HasMorePages() bool {\n\treturn p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0)\n}\n\n// NextPage retrieves the next DescribeImages page.\nfunc (p *DescribeImagesPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribeImagesOutput, error) {\n\tif !p.HasMorePages() {\n\t\treturn nil, fmt.Errorf(\"no more pages available\")\n\t}\n\n\tparams := *p.params\n\tparams.NextToken = p.nextToken\n\n\tvar limit *int32\n\tif p.options.Limit > 0 {\n\t\tlimit = &p.options.Limit\n\t}\n\tparams.MaxResults = limit\n\n\toptFns = append([]func(*Options){\n\t\taddIsPaginatorUserAgent,\n\t}, optFns...)\n\tresult, err := p.client.DescribeImages(ctx, &params, optFns...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.firstPage = false\n\n\tprevToken := p.nextToken\n\tp.nextToken = result.NextToken\n\n\tif p.options.StopOnDuplicateToken &&\n\t\tprevToken != nil &&\n\t\tp.nextToken != nil &&\n\t\t*prevToken == *p.nextToken {\n\t\tp.nextToken = nil\n\t}\n\n\treturn result, nil\n}\n\n// DescribeImagesAPIClient is a client that implements the DescribeImages\n// operation.\ntype DescribeImagesAPIClient interface {\n\tDescribeImages(context.Context, *DescribeImagesInput, ...func(*Options)) (*DescribeImagesOutput, error)\n}\n\nvar _ DescribeImagesAPIClient = (*Client)(nil)\n\nfunc newServiceMetadataMiddleware_opDescribeImages(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DescribeImages\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeRegistries.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecrpublic/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Returns details for a public registry.\nfunc (c *Client) DescribeRegistries(ctx context.Context, params *DescribeRegistriesInput, optFns ...func(*Options)) (*DescribeRegistriesOutput, error) {\n\tif params == nil {\n\t\tparams = &DescribeRegistriesInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DescribeRegistries\", params, optFns, c.addOperationDescribeRegistriesMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DescribeRegistriesOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DescribeRegistriesInput struct {\n\n\t// The maximum number of repository results that's returned by DescribeRegistries\n\t// in paginated output. When this parameter is used, DescribeRegistries only\n\t// returns maxResults results in a single page along with a nextToken response\n\t// element. The remaining results of the initial request can be seen by sending\n\t// another DescribeRegistries request with the returned nextToken value. This\n\t// value can be between 1 and 1000. If this parameter isn't used, then\n\t// DescribeRegistries returns up to 100 results and a nextToken value, if\n\t// applicable.\n\tMaxResults *int32\n\n\t// The nextToken value that's returned from a previous paginated DescribeRegistries\n\t// request where maxResults was used and the results exceeded the value of that\n\t// parameter. Pagination continues from the end of the previous results that\n\t// returned the nextToken value. If there are no more results to return, this\n\t// value is null .\n\t//\n\t// This token should be treated as an opaque identifier that is only used to\n\t// retrieve the next items in a list and not for other programmatic purposes.\n\tNextToken *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype DescribeRegistriesOutput struct {\n\n\t// An object that contains the details for a public registry.\n\t//\n\t// This member is required.\n\tRegistries []types.Registry\n\n\t// The nextToken value to include in a future DescribeRepositories request. If the\n\t// results of a DescribeRepositories request exceed maxResults , you can use this\n\t// value to retrieve the next page of results. If there are no more results, this\n\t// value is null .\n\tNextToken *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDescribeRegistriesMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeRegistries{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeRegistries{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DescribeRegistries\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeRegistries(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// DescribeRegistriesPaginatorOptions is the paginator options for\n// DescribeRegistries\ntype DescribeRegistriesPaginatorOptions struct {\n\t// The maximum number of repository results that's returned by DescribeRegistries\n\t// in paginated output. When this parameter is used, DescribeRegistries only\n\t// returns maxResults results in a single page along with a nextToken response\n\t// element. The remaining results of the initial request can be seen by sending\n\t// another DescribeRegistries request with the returned nextToken value. This\n\t// value can be between 1 and 1000. If this parameter isn't used, then\n\t// DescribeRegistries returns up to 100 results and a nextToken value, if\n\t// applicable.\n\tLimit int32\n\n\t// Set to true if pagination should stop if the service returns a pagination token\n\t// that matches the most recent token provided to the service.\n\tStopOnDuplicateToken bool\n}\n\n// DescribeRegistriesPaginator is a paginator for DescribeRegistries\ntype DescribeRegistriesPaginator struct {\n\toptions   DescribeRegistriesPaginatorOptions\n\tclient    DescribeRegistriesAPIClient\n\tparams    *DescribeRegistriesInput\n\tnextToken *string\n\tfirstPage bool\n}\n\n// NewDescribeRegistriesPaginator returns a new DescribeRegistriesPaginator\nfunc NewDescribeRegistriesPaginator(client DescribeRegistriesAPIClient, params *DescribeRegistriesInput, optFns ...func(*DescribeRegistriesPaginatorOptions)) *DescribeRegistriesPaginator {\n\tif params == nil {\n\t\tparams = &DescribeRegistriesInput{}\n\t}\n\n\toptions := DescribeRegistriesPaginatorOptions{}\n\tif params.MaxResults != nil {\n\t\toptions.Limit = *params.MaxResults\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &DescribeRegistriesPaginator{\n\t\toptions:   options,\n\t\tclient:    client,\n\t\tparams:    params,\n\t\tfirstPage: true,\n\t\tnextToken: params.NextToken,\n\t}\n}\n\n// HasMorePages returns a boolean indicating whether more pages are available\nfunc (p *DescribeRegistriesPaginator) HasMorePages() bool {\n\treturn p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0)\n}\n\n// NextPage retrieves the next DescribeRegistries page.\nfunc (p *DescribeRegistriesPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribeRegistriesOutput, error) {\n\tif !p.HasMorePages() {\n\t\treturn nil, fmt.Errorf(\"no more pages available\")\n\t}\n\n\tparams := *p.params\n\tparams.NextToken = p.nextToken\n\n\tvar limit *int32\n\tif p.options.Limit > 0 {\n\t\tlimit = &p.options.Limit\n\t}\n\tparams.MaxResults = limit\n\n\toptFns = append([]func(*Options){\n\t\taddIsPaginatorUserAgent,\n\t}, optFns...)\n\tresult, err := p.client.DescribeRegistries(ctx, &params, optFns...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.firstPage = false\n\n\tprevToken := p.nextToken\n\tp.nextToken = result.NextToken\n\n\tif p.options.StopOnDuplicateToken &&\n\t\tprevToken != nil &&\n\t\tp.nextToken != nil &&\n\t\t*prevToken == *p.nextToken {\n\t\tp.nextToken = nil\n\t}\n\n\treturn result, nil\n}\n\n// DescribeRegistriesAPIClient is a client that implements the DescribeRegistries\n// operation.\ntype DescribeRegistriesAPIClient interface {\n\tDescribeRegistries(context.Context, *DescribeRegistriesInput, ...func(*Options)) (*DescribeRegistriesOutput, error)\n}\n\nvar _ DescribeRegistriesAPIClient = (*Client)(nil)\n\nfunc newServiceMetadataMiddleware_opDescribeRegistries(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DescribeRegistries\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeRepositories.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecrpublic/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Describes repositories that are in a public registry.\nfunc (c *Client) DescribeRepositories(ctx context.Context, params *DescribeRepositoriesInput, optFns ...func(*Options)) (*DescribeRepositoriesOutput, error) {\n\tif params == nil {\n\t\tparams = &DescribeRepositoriesInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DescribeRepositories\", params, optFns, c.addOperationDescribeRepositoriesMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DescribeRepositoriesOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DescribeRepositoriesInput struct {\n\n\t// The maximum number of repository results that's returned by DescribeRepositories\n\t// in paginated output. When this parameter is used, DescribeRepositories only\n\t// returns maxResults results in a single page along with a nextToken response\n\t// element. You can see the remaining results of the initial request by sending\n\t// another DescribeRepositories request with the returned nextToken value. This\n\t// value can be between 1 and 1000. If this parameter isn't used, then\n\t// DescribeRepositories returns up to 100 results and a nextToken value, if\n\t// applicable. If you specify repositories with repositoryNames , you can't use\n\t// this option.\n\tMaxResults *int32\n\n\t// The nextToken value that's returned from a previous paginated\n\t// DescribeRepositories request where maxResults was used and the results exceeded\n\t// the value of that parameter. Pagination continues from the end of the previous\n\t// results that returned the nextToken value. If there are no more results to\n\t// return, this value is null . If you specify repositories with repositoryNames ,\n\t// you can't use this option.\n\t//\n\t// This token should be treated as an opaque identifier that is only used to\n\t// retrieve the next items in a list and not for other programmatic purposes.\n\tNextToken *string\n\n\t// The Amazon Web Services account ID that's associated with the registry that\n\t// contains the repositories to be described. If you do not specify a registry, the\n\t// default public registry is assumed.\n\tRegistryId *string\n\n\t// A list of repositories to describe. If this parameter is omitted, then all\n\t// repositories in a registry are described.\n\tRepositoryNames []string\n\n\tnoSmithyDocumentSerde\n}\n\ntype DescribeRepositoriesOutput struct {\n\n\t// The nextToken value to include in a future DescribeRepositories request. When\n\t// the results of a DescribeRepositories request exceed maxResults , this value can\n\t// be used to retrieve the next page of results. If there are no more results to\n\t// return, this value is null .\n\tNextToken *string\n\n\t// A list of repository objects corresponding to valid repositories.\n\tRepositories []types.Repository\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDescribeRepositoriesMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeRepositories{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeRepositories{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DescribeRepositories\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeRepositories(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// DescribeRepositoriesPaginatorOptions is the paginator options for\n// DescribeRepositories\ntype DescribeRepositoriesPaginatorOptions struct {\n\t// The maximum number of repository results that's returned by DescribeRepositories\n\t// in paginated output. When this parameter is used, DescribeRepositories only\n\t// returns maxResults results in a single page along with a nextToken response\n\t// element. You can see the remaining results of the initial request by sending\n\t// another DescribeRepositories request with the returned nextToken value. This\n\t// value can be between 1 and 1000. If this parameter isn't used, then\n\t// DescribeRepositories returns up to 100 results and a nextToken value, if\n\t// applicable. If you specify repositories with repositoryNames , you can't use\n\t// this option.\n\tLimit int32\n\n\t// Set to true if pagination should stop if the service returns a pagination token\n\t// that matches the most recent token provided to the service.\n\tStopOnDuplicateToken bool\n}\n\n// DescribeRepositoriesPaginator is a paginator for DescribeRepositories\ntype DescribeRepositoriesPaginator struct {\n\toptions   DescribeRepositoriesPaginatorOptions\n\tclient    DescribeRepositoriesAPIClient\n\tparams    *DescribeRepositoriesInput\n\tnextToken *string\n\tfirstPage bool\n}\n\n// NewDescribeRepositoriesPaginator returns a new DescribeRepositoriesPaginator\nfunc NewDescribeRepositoriesPaginator(client DescribeRepositoriesAPIClient, params *DescribeRepositoriesInput, optFns ...func(*DescribeRepositoriesPaginatorOptions)) *DescribeRepositoriesPaginator {\n\tif params == nil {\n\t\tparams = &DescribeRepositoriesInput{}\n\t}\n\n\toptions := DescribeRepositoriesPaginatorOptions{}\n\tif params.MaxResults != nil {\n\t\toptions.Limit = *params.MaxResults\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &DescribeRepositoriesPaginator{\n\t\toptions:   options,\n\t\tclient:    client,\n\t\tparams:    params,\n\t\tfirstPage: true,\n\t\tnextToken: params.NextToken,\n\t}\n}\n\n// HasMorePages returns a boolean indicating whether more pages are available\nfunc (p *DescribeRepositoriesPaginator) HasMorePages() bool {\n\treturn p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0)\n}\n\n// NextPage retrieves the next DescribeRepositories page.\nfunc (p *DescribeRepositoriesPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribeRepositoriesOutput, error) {\n\tif !p.HasMorePages() {\n\t\treturn nil, fmt.Errorf(\"no more pages available\")\n\t}\n\n\tparams := *p.params\n\tparams.NextToken = p.nextToken\n\n\tvar limit *int32\n\tif p.options.Limit > 0 {\n\t\tlimit = &p.options.Limit\n\t}\n\tparams.MaxResults = limit\n\n\toptFns = append([]func(*Options){\n\t\taddIsPaginatorUserAgent,\n\t}, optFns...)\n\tresult, err := p.client.DescribeRepositories(ctx, &params, optFns...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.firstPage = false\n\n\tprevToken := p.nextToken\n\tp.nextToken = result.NextToken\n\n\tif p.options.StopOnDuplicateToken &&\n\t\tprevToken != nil &&\n\t\tp.nextToken != nil &&\n\t\t*prevToken == *p.nextToken {\n\t\tp.nextToken = nil\n\t}\n\n\treturn result, nil\n}\n\n// DescribeRepositoriesAPIClient is a client that implements the\n// DescribeRepositories operation.\ntype DescribeRepositoriesAPIClient interface {\n\tDescribeRepositories(context.Context, *DescribeRepositoriesInput, ...func(*Options)) (*DescribeRepositoriesOutput, error)\n}\n\nvar _ DescribeRepositoriesAPIClient = (*Client)(nil)\n\nfunc newServiceMetadataMiddleware_opDescribeRepositories(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DescribeRepositories\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetAuthorizationToken.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecrpublic/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Retrieves an authorization token. An authorization token represents your IAM\n// authentication credentials. You can use it to access any Amazon ECR registry\n// that your IAM principal has access to. The authorization token is valid for 12\n// hours. This API requires the ecr-public:GetAuthorizationToken and\n// sts:GetServiceBearerToken permissions.\nfunc (c *Client) GetAuthorizationToken(ctx context.Context, params *GetAuthorizationTokenInput, optFns ...func(*Options)) (*GetAuthorizationTokenOutput, error) {\n\tif params == nil {\n\t\tparams = &GetAuthorizationTokenInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetAuthorizationToken\", params, optFns, c.addOperationGetAuthorizationTokenMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetAuthorizationTokenOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetAuthorizationTokenInput struct {\n\tnoSmithyDocumentSerde\n}\n\ntype GetAuthorizationTokenOutput struct {\n\n\t// An authorization token data object that corresponds to a public registry.\n\tAuthorizationData *types.AuthorizationData\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetAuthorizationTokenMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpGetAuthorizationToken{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetAuthorizationToken{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetAuthorizationToken\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetAuthorizationToken(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opGetAuthorizationToken(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetAuthorizationToken\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetRegistryCatalogData.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecrpublic/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Retrieves catalog metadata for a public registry.\nfunc (c *Client) GetRegistryCatalogData(ctx context.Context, params *GetRegistryCatalogDataInput, optFns ...func(*Options)) (*GetRegistryCatalogDataOutput, error) {\n\tif params == nil {\n\t\tparams = &GetRegistryCatalogDataInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetRegistryCatalogData\", params, optFns, c.addOperationGetRegistryCatalogDataMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetRegistryCatalogDataOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetRegistryCatalogDataInput struct {\n\tnoSmithyDocumentSerde\n}\n\ntype GetRegistryCatalogDataOutput struct {\n\n\t// The catalog metadata for the public registry.\n\t//\n\t// This member is required.\n\tRegistryCatalogData *types.RegistryCatalogData\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetRegistryCatalogDataMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpGetRegistryCatalogData{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetRegistryCatalogData{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetRegistryCatalogData\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRegistryCatalogData(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opGetRegistryCatalogData(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetRegistryCatalogData\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetRepositoryCatalogData.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecrpublic/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Retrieve catalog metadata for a repository in a public registry. This metadata\n// is displayed publicly in the Amazon ECR Public Gallery.\nfunc (c *Client) GetRepositoryCatalogData(ctx context.Context, params *GetRepositoryCatalogDataInput, optFns ...func(*Options)) (*GetRepositoryCatalogDataOutput, error) {\n\tif params == nil {\n\t\tparams = &GetRepositoryCatalogDataInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetRepositoryCatalogData\", params, optFns, c.addOperationGetRepositoryCatalogDataMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetRepositoryCatalogDataOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetRepositoryCatalogDataInput struct {\n\n\t// The name of the repository to retrieve the catalog metadata for.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID that's associated with the registry that\n\t// contains the repositories to be described. If you do not specify a registry, the\n\t// default public registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype GetRepositoryCatalogDataOutput struct {\n\n\t// The catalog metadata for the repository.\n\tCatalogData *types.RepositoryCatalogData\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetRepositoryCatalogDataMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpGetRepositoryCatalogData{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetRepositoryCatalogData{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetRepositoryCatalogData\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetRepositoryCatalogDataValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRepositoryCatalogData(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opGetRepositoryCatalogData(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetRepositoryCatalogData\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetRepositoryPolicy.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Retrieves the repository policy for the specified repository.\nfunc (c *Client) GetRepositoryPolicy(ctx context.Context, params *GetRepositoryPolicyInput, optFns ...func(*Options)) (*GetRepositoryPolicyOutput, error) {\n\tif params == nil {\n\t\tparams = &GetRepositoryPolicyInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetRepositoryPolicy\", params, optFns, c.addOperationGetRepositoryPolicyMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetRepositoryPolicyOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetRepositoryPolicyInput struct {\n\n\t// The name of the repository with the policy to retrieve.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID that's associated with the public registry\n\t// that contains the repository. If you do not specify a registry, the default\n\t// public registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype GetRepositoryPolicyOutput struct {\n\n\t// The repository policy text that's associated with the repository. The policy\n\t// text will be in JSON format.\n\tPolicyText *string\n\n\t// The registry ID that's associated with the request.\n\tRegistryId *string\n\n\t// The repository name that's associated with the request.\n\tRepositoryName *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetRepositoryPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpGetRepositoryPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetRepositoryPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetRepositoryPolicy\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetRepositoryPolicyValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRepositoryPolicy(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opGetRepositoryPolicy(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetRepositoryPolicy\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_InitiateLayerUpload.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Notifies Amazon ECR that you intend to upload an image layer.\n//\n// When an image is pushed, the InitiateLayerUpload API is called once for each\n// image layer that hasn't already been uploaded. Whether an image layer uploads is\n// determined by the BatchCheckLayerAvailability API action.\n//\n// This operation is used by the Amazon ECR proxy and is not generally used by\n// customers for pulling and pushing images. In most cases, you should use the\n// docker CLI to pull, tag, and push images.\nfunc (c *Client) InitiateLayerUpload(ctx context.Context, params *InitiateLayerUploadInput, optFns ...func(*Options)) (*InitiateLayerUploadOutput, error) {\n\tif params == nil {\n\t\tparams = &InitiateLayerUploadInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"InitiateLayerUpload\", params, optFns, c.addOperationInitiateLayerUploadMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*InitiateLayerUploadOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype InitiateLayerUploadInput struct {\n\n\t// The name of the repository that you want to upload layers to.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID, or registry alias, that's associated with\n\t// the registry to which you intend to upload layers. If you do not specify a\n\t// registry, the default public registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype InitiateLayerUploadOutput struct {\n\n\t// The size, in bytes, that Amazon ECR expects future layer part uploads to be.\n\tPartSize *int64\n\n\t// The upload ID for the layer upload. This parameter is passed to further UploadLayerPart and CompleteLayerUpload\n\t// operations.\n\tUploadId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationInitiateLayerUploadMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpInitiateLayerUpload{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpInitiateLayerUpload{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"InitiateLayerUpload\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpInitiateLayerUploadValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opInitiateLayerUpload(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opInitiateLayerUpload(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"InitiateLayerUpload\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_ListTagsForResource.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecrpublic/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// List the tags for an Amazon ECR Public resource.\nfunc (c *Client) ListTagsForResource(ctx context.Context, params *ListTagsForResourceInput, optFns ...func(*Options)) (*ListTagsForResourceOutput, error) {\n\tif params == nil {\n\t\tparams = &ListTagsForResourceInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"ListTagsForResource\", params, optFns, c.addOperationListTagsForResourceMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*ListTagsForResourceOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype ListTagsForResourceInput struct {\n\n\t// The Amazon Resource Name (ARN) that identifies the resource to list the tags\n\t// for. Currently, the supported resource is an Amazon ECR Public repository.\n\t//\n\t// This member is required.\n\tResourceArn *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype ListTagsForResourceOutput struct {\n\n\t// The tags for the resource.\n\tTags []types.Tag\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationListTagsForResourceMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpListTagsForResource{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpListTagsForResource{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"ListTagsForResource\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpListTagsForResourceValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opListTagsForResource(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opListTagsForResource(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"ListTagsForResource\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_PutImage.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecrpublic/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Creates or updates the image manifest and tags that are associated with an\n// image.\n//\n// When an image is pushed and all new image layers have been uploaded, the\n// PutImage API is called once to create or update the image manifest and the tags\n// that are associated with the image.\n//\n// This operation is used by the Amazon ECR proxy and is not generally used by\n// customers for pulling and pushing images. In most cases, you should use the\n// docker CLI to pull, tag, and push images.\nfunc (c *Client) PutImage(ctx context.Context, params *PutImageInput, optFns ...func(*Options)) (*PutImageOutput, error) {\n\tif params == nil {\n\t\tparams = &PutImageInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutImage\", params, optFns, c.addOperationPutImageMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutImageOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutImageInput struct {\n\n\t// The image manifest that corresponds to the image to be uploaded.\n\t//\n\t// This member is required.\n\tImageManifest *string\n\n\t// The name of the repository where the image is put.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The image digest of the image manifest that corresponds to the image.\n\tImageDigest *string\n\n\t// The media type of the image manifest. If you push an image manifest that\n\t// doesn't contain the mediaType field, you must specify the imageManifestMediaType\n\t// in the request.\n\tImageManifestMediaType *string\n\n\t// The tag to associate with the image. This parameter is required for images that\n\t// use the Docker Image Manifest V2 Schema 2 or Open Container Initiative (OCI)\n\t// formats.\n\tImageTag *string\n\n\t// The Amazon Web Services account ID, or registry alias, that's associated with\n\t// the public registry that contains the repository where the image is put. If you\n\t// do not specify a registry, the default public registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype PutImageOutput struct {\n\n\t// Details of the image uploaded.\n\tImage *types.Image\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutImageMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpPutImage{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutImage{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutImage\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutImageValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutImage(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opPutImage(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutImage\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_PutRegistryCatalogData.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecrpublic/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Create or update the catalog data for a public registry.\nfunc (c *Client) PutRegistryCatalogData(ctx context.Context, params *PutRegistryCatalogDataInput, optFns ...func(*Options)) (*PutRegistryCatalogDataOutput, error) {\n\tif params == nil {\n\t\tparams = &PutRegistryCatalogDataInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutRegistryCatalogData\", params, optFns, c.addOperationPutRegistryCatalogDataMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutRegistryCatalogDataOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutRegistryCatalogDataInput struct {\n\n\t// The display name for a public registry. The display name is shown as the\n\t// repository author in the Amazon ECR Public Gallery.\n\t//\n\t// The registry display name is only publicly visible in the Amazon ECR Public\n\t// Gallery for verified accounts.\n\tDisplayName *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype PutRegistryCatalogDataOutput struct {\n\n\t// The catalog data for the public registry.\n\t//\n\t// This member is required.\n\tRegistryCatalogData *types.RegistryCatalogData\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutRegistryCatalogDataMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpPutRegistryCatalogData{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutRegistryCatalogData{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutRegistryCatalogData\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutRegistryCatalogData(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opPutRegistryCatalogData(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutRegistryCatalogData\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_PutRepositoryCatalogData.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecrpublic/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Creates or updates the catalog data for a repository in a public registry.\nfunc (c *Client) PutRepositoryCatalogData(ctx context.Context, params *PutRepositoryCatalogDataInput, optFns ...func(*Options)) (*PutRepositoryCatalogDataOutput, error) {\n\tif params == nil {\n\t\tparams = &PutRepositoryCatalogDataInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutRepositoryCatalogData\", params, optFns, c.addOperationPutRepositoryCatalogDataMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutRepositoryCatalogDataOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutRepositoryCatalogDataInput struct {\n\n\t// An object containing the catalog data for a repository. This data is publicly\n\t// visible in the Amazon ECR Public Gallery.\n\t//\n\t// This member is required.\n\tCatalogData *types.RepositoryCatalogDataInput\n\n\t// The name of the repository to create or update the catalog data for.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The Amazon Web Services account ID that's associated with the public registry\n\t// the repository is in. If you do not specify a registry, the default public\n\t// registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype PutRepositoryCatalogDataOutput struct {\n\n\t// The catalog data for the repository.\n\tCatalogData *types.RepositoryCatalogData\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutRepositoryCatalogDataMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpPutRepositoryCatalogData{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutRepositoryCatalogData{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutRepositoryCatalogData\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutRepositoryCatalogDataValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutRepositoryCatalogData(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opPutRepositoryCatalogData(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutRepositoryCatalogData\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_SetRepositoryPolicy.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Applies a repository policy to the specified public repository to control\n// access permissions. For more information, see [Amazon ECR Repository Policies]in the Amazon Elastic Container\n// Registry User Guide.\n//\n// [Amazon ECR Repository Policies]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policies.html\nfunc (c *Client) SetRepositoryPolicy(ctx context.Context, params *SetRepositoryPolicyInput, optFns ...func(*Options)) (*SetRepositoryPolicyOutput, error) {\n\tif params == nil {\n\t\tparams = &SetRepositoryPolicyInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"SetRepositoryPolicy\", params, optFns, c.addOperationSetRepositoryPolicyMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*SetRepositoryPolicyOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype SetRepositoryPolicyInput struct {\n\n\t// The JSON repository policy text to apply to the repository. For more\n\t// information, see [Amazon ECR Repository Policies]in the Amazon Elastic Container Registry User Guide.\n\t//\n\t// [Amazon ECR Repository Policies]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html\n\t//\n\t// This member is required.\n\tPolicyText *string\n\n\t// The name of the repository to receive the policy.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// If the policy that you want to set on a repository policy would prevent you\n\t// from setting another policy in the future, you must force the SetRepositoryPolicyoperation. This\n\t// prevents accidental repository lockouts.\n\tForce bool\n\n\t// The Amazon Web Services account ID that's associated with the registry that\n\t// contains the repository. If you do not specify a registry, the default public\n\t// registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype SetRepositoryPolicyOutput struct {\n\n\t// The JSON repository policy text that's applied to the repository.\n\tPolicyText *string\n\n\t// The registry ID that's associated with the request.\n\tRegistryId *string\n\n\t// The repository name that's associated with the request.\n\tRepositoryName *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationSetRepositoryPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpSetRepositoryPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpSetRepositoryPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"SetRepositoryPolicy\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpSetRepositoryPolicyValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opSetRepositoryPolicy(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opSetRepositoryPolicy(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"SetRepositoryPolicy\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_TagResource.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecrpublic/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Associates the specified tags to a resource with the specified resourceArn . If\n// existing tags on a resource aren't specified in the request parameters, they\n// aren't changed. When a resource is deleted, the tags associated with that\n// resource are also deleted.\nfunc (c *Client) TagResource(ctx context.Context, params *TagResourceInput, optFns ...func(*Options)) (*TagResourceOutput, error) {\n\tif params == nil {\n\t\tparams = &TagResourceInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"TagResource\", params, optFns, c.addOperationTagResourceMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*TagResourceOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype TagResourceInput struct {\n\n\t// The Amazon Resource Name (ARN) of the resource to add tags to. Currently, the\n\t// supported resource is an Amazon ECR Public repository.\n\t//\n\t// This member is required.\n\tResourceArn *string\n\n\t// The tags to add to the resource. A tag is an array of key-value pairs. Tag keys\n\t// can have a maximum character length of 128 characters, and tag values can have a\n\t// maximum length of 256 characters.\n\t//\n\t// This member is required.\n\tTags []types.Tag\n\n\tnoSmithyDocumentSerde\n}\n\ntype TagResourceOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationTagResourceMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpTagResource{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpTagResource{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"TagResource\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpTagResourceValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opTagResource(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opTagResource(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"TagResource\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_UntagResource.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Deletes specified tags from a resource.\nfunc (c *Client) UntagResource(ctx context.Context, params *UntagResourceInput, optFns ...func(*Options)) (*UntagResourceOutput, error) {\n\tif params == nil {\n\t\tparams = &UntagResourceInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"UntagResource\", params, optFns, c.addOperationUntagResourceMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*UntagResourceOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype UntagResourceInput struct {\n\n\t// The Amazon Resource Name (ARN) of the resource to delete tags from. Currently,\n\t// the supported resource is an Amazon ECR Public repository.\n\t//\n\t// This member is required.\n\tResourceArn *string\n\n\t// The keys of the tags to be removed.\n\t//\n\t// This member is required.\n\tTagKeys []string\n\n\tnoSmithyDocumentSerde\n}\n\ntype UntagResourceOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationUntagResourceMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpUntagResource{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpUntagResource{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"UntagResource\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpUntagResourceValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opUntagResource(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opUntagResource(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"UntagResource\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_UploadLayerPart.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Uploads an image layer part to Amazon ECR.\n//\n// When an image is pushed, each new image layer is uploaded in parts. The maximum\n// size of each image layer part can be 20971520 bytes (about 20MB). The\n// UploadLayerPart API is called once for each new image layer part.\n//\n// This operation is used by the Amazon ECR proxy and is not generally used by\n// customers for pulling and pushing images. In most cases, you should use the\n// docker CLI to pull, tag, and push images.\nfunc (c *Client) UploadLayerPart(ctx context.Context, params *UploadLayerPartInput, optFns ...func(*Options)) (*UploadLayerPartOutput, error) {\n\tif params == nil {\n\t\tparams = &UploadLayerPartInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"UploadLayerPart\", params, optFns, c.addOperationUploadLayerPartMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*UploadLayerPartOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype UploadLayerPartInput struct {\n\n\t// The base64-encoded layer part payload.\n\t//\n\t// This member is required.\n\tLayerPartBlob []byte\n\n\t// The position of the first byte of the layer part witin the overall image layer.\n\t//\n\t// This member is required.\n\tPartFirstByte *int64\n\n\t// The position of the last byte of the layer part within the overall image layer.\n\t//\n\t// This member is required.\n\tPartLastByte *int64\n\n\t// The name of the repository that you're uploading layer parts to.\n\t//\n\t// This member is required.\n\tRepositoryName *string\n\n\t// The upload ID from a previous InitiateLayerUpload operation to associate with the layer part\n\t// upload.\n\t//\n\t// This member is required.\n\tUploadId *string\n\n\t// The Amazon Web Services account ID, or registry alias, that's associated with\n\t// the registry that you're uploading layer parts to. If you do not specify a\n\t// registry, the default public registry is assumed.\n\tRegistryId *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype UploadLayerPartOutput struct {\n\n\t// The integer value of the last byte that's received in the request.\n\tLastByteReceived *int64\n\n\t// The registry ID that's associated with the request.\n\tRegistryId *string\n\n\t// The repository name that's associated with the request.\n\tRepositoryName *string\n\n\t// The upload ID that's associated with the request.\n\tUploadId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationUploadLayerPartMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsAwsjson11_serializeOpUploadLayerPart{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsAwsjson11_deserializeOpUploadLayerPart{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"UploadLayerPart\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpUploadLayerPartValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opUploadLayerPart(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestIDRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc newServiceMetadataMiddleware_opUploadLayerPart(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"UploadLayerPart\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/auth.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\tsmithy \"github.com/aws/smithy-go\"\n\tsmithyauth \"github.com/aws/smithy-go/auth\"\n\t\"github.com/aws/smithy-go/metrics\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nfunc bindAuthParamsRegion(_ interface{}, params *AuthResolverParameters, _ interface{}, options Options) {\n\tparams.Region = options.Region\n}\n\ntype setLegacyContextSigningOptionsMiddleware struct {\n}\n\nfunc (*setLegacyContextSigningOptionsMiddleware) ID() string {\n\treturn \"setLegacyContextSigningOptions\"\n}\n\nfunc (m *setLegacyContextSigningOptionsMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\trscheme := getResolvedAuthScheme(ctx)\n\tschemeID := rscheme.Scheme.SchemeID()\n\n\tif sn := awsmiddleware.GetSigningName(ctx); sn != \"\" {\n\t\tif schemeID == \"aws.auth#sigv4\" {\n\t\t\tsmithyhttp.SetSigV4SigningName(&rscheme.SignerProperties, sn)\n\t\t} else if schemeID == \"aws.auth#sigv4a\" {\n\t\t\tsmithyhttp.SetSigV4ASigningName(&rscheme.SignerProperties, sn)\n\t\t}\n\t}\n\n\tif sr := awsmiddleware.GetSigningRegion(ctx); sr != \"\" {\n\t\tif schemeID == \"aws.auth#sigv4\" {\n\t\t\tsmithyhttp.SetSigV4SigningRegion(&rscheme.SignerProperties, sr)\n\t\t} else if schemeID == \"aws.auth#sigv4a\" {\n\t\t\tsmithyhttp.SetSigV4ASigningRegions(&rscheme.SignerProperties, []string{sr})\n\t\t}\n\t}\n\n\treturn next.HandleFinalize(ctx, in)\n}\n\nfunc addSetLegacyContextSigningOptionsMiddleware(stack *middleware.Stack) error {\n\treturn stack.Finalize.Insert(&setLegacyContextSigningOptionsMiddleware{}, \"Signing\", middleware.Before)\n}\n\ntype withAnonymous struct {\n\tresolver AuthSchemeResolver\n}\n\nvar _ AuthSchemeResolver = (*withAnonymous)(nil)\n\nfunc (v *withAnonymous) ResolveAuthSchemes(ctx context.Context, params *AuthResolverParameters) ([]*smithyauth.Option, error) {\n\topts, err := v.resolver.ResolveAuthSchemes(ctx, params)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\topts = append(opts, &smithyauth.Option{\n\t\tSchemeID: smithyauth.SchemeIDAnonymous,\n\t})\n\treturn opts, nil\n}\n\nfunc wrapWithAnonymousAuth(options *Options) {\n\tif _, ok := options.AuthSchemeResolver.(*defaultAuthSchemeResolver); !ok {\n\t\treturn\n\t}\n\n\toptions.AuthSchemeResolver = &withAnonymous{\n\t\tresolver: options.AuthSchemeResolver,\n\t}\n}\n\n// AuthResolverParameters contains the set of inputs necessary for auth scheme\n// resolution.\ntype AuthResolverParameters struct {\n\t// The name of the operation being invoked.\n\tOperation string\n\n\t// The region in which the operation is being invoked.\n\tRegion string\n}\n\nfunc bindAuthResolverParams(ctx context.Context, operation string, input interface{}, options Options) *AuthResolverParameters {\n\tparams := &AuthResolverParameters{\n\t\tOperation: operation,\n\t}\n\n\tbindAuthParamsRegion(ctx, params, input, options)\n\n\treturn params\n}\n\n// AuthSchemeResolver returns a set of possible authentication options for an\n// operation.\ntype AuthSchemeResolver interface {\n\tResolveAuthSchemes(context.Context, *AuthResolverParameters) ([]*smithyauth.Option, error)\n}\n\ntype defaultAuthSchemeResolver struct{}\n\nvar _ AuthSchemeResolver = (*defaultAuthSchemeResolver)(nil)\n\nfunc (*defaultAuthSchemeResolver) ResolveAuthSchemes(ctx context.Context, params *AuthResolverParameters) ([]*smithyauth.Option, error) {\n\tif overrides, ok := operationAuthOptions[params.Operation]; ok {\n\t\treturn overrides(params), nil\n\t}\n\treturn serviceAuthOptions(params), nil\n}\n\nvar operationAuthOptions = map[string]func(*AuthResolverParameters) []*smithyauth.Option{}\n\nfunc serviceAuthOptions(params *AuthResolverParameters) []*smithyauth.Option {\n\treturn []*smithyauth.Option{\n\t\t{\n\t\t\tSchemeID: smithyauth.SchemeIDSigV4,\n\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\tvar props smithy.Properties\n\t\t\t\tsmithyhttp.SetSigV4SigningName(&props, \"ecr-public\")\n\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&props, params.Region)\n\t\t\t\treturn props\n\t\t\t}(),\n\t\t},\n\t}\n}\n\ntype resolveAuthSchemeMiddleware struct {\n\toperation string\n\toptions   Options\n}\n\nfunc (*resolveAuthSchemeMiddleware) ID() string {\n\treturn \"ResolveAuthScheme\"\n}\n\nfunc (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"ResolveAuthScheme\")\n\tdefer span.End()\n\n\tparams := bindAuthResolverParams(ctx, m.operation, getOperationInput(ctx), m.options)\n\toptions, err := m.options.AuthSchemeResolver.ResolveAuthSchemes(ctx, params)\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"resolve auth scheme: %w\", err)\n\t}\n\n\tscheme, ok := m.selectScheme(options)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"could not select an auth scheme\")\n\t}\n\n\tctx = setResolvedAuthScheme(ctx, scheme)\n\n\tspan.SetProperty(\"auth.scheme_id\", scheme.Scheme.SchemeID())\n\tspan.End()\n\treturn next.HandleFinalize(ctx, in)\n}\n\nfunc (m *resolveAuthSchemeMiddleware) selectScheme(options []*smithyauth.Option) (*resolvedAuthScheme, bool) {\n\tfor _, option := range options {\n\t\tif option.SchemeID == smithyauth.SchemeIDAnonymous {\n\t\t\treturn newResolvedAuthScheme(smithyhttp.NewAnonymousScheme(), option), true\n\t\t}\n\n\t\tfor _, scheme := range m.options.AuthSchemes {\n\t\t\tif scheme.SchemeID() != option.SchemeID {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif scheme.IdentityResolver(m.options) != nil {\n\t\t\t\treturn newResolvedAuthScheme(scheme, option), true\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil, false\n}\n\ntype resolvedAuthSchemeKey struct{}\n\ntype resolvedAuthScheme struct {\n\tScheme             smithyhttp.AuthScheme\n\tIdentityProperties smithy.Properties\n\tSignerProperties   smithy.Properties\n}\n\nfunc newResolvedAuthScheme(scheme smithyhttp.AuthScheme, option *smithyauth.Option) *resolvedAuthScheme {\n\treturn &resolvedAuthScheme{\n\t\tScheme:             scheme,\n\t\tIdentityProperties: option.IdentityProperties,\n\t\tSignerProperties:   option.SignerProperties,\n\t}\n}\n\nfunc setResolvedAuthScheme(ctx context.Context, scheme *resolvedAuthScheme) context.Context {\n\treturn middleware.WithStackValue(ctx, resolvedAuthSchemeKey{}, scheme)\n}\n\nfunc getResolvedAuthScheme(ctx context.Context) *resolvedAuthScheme {\n\tv, _ := middleware.GetStackValue(ctx, resolvedAuthSchemeKey{}).(*resolvedAuthScheme)\n\treturn v\n}\n\ntype getIdentityMiddleware struct {\n\toptions Options\n}\n\nfunc (*getIdentityMiddleware) ID() string {\n\treturn \"GetIdentity\"\n}\n\nfunc (m *getIdentityMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\tinnerCtx, span := tracing.StartSpan(ctx, \"GetIdentity\")\n\tdefer span.End()\n\n\trscheme := getResolvedAuthScheme(innerCtx)\n\tif rscheme == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no resolved auth scheme\")\n\t}\n\n\tresolver := rscheme.Scheme.IdentityResolver(m.options)\n\tif resolver == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no identity resolver\")\n\t}\n\n\tidentity, err := timeOperationMetric(ctx, \"client.call.resolve_identity_duration\",\n\t\tfunc() (smithyauth.Identity, error) {\n\t\t\treturn resolver.GetIdentity(innerCtx, rscheme.IdentityProperties)\n\t\t},\n\t\tfunc(o *metrics.RecordMetricOptions) {\n\t\t\to.Properties.Set(\"auth.scheme_id\", rscheme.Scheme.SchemeID())\n\t\t})\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"get identity: %w\", err)\n\t}\n\n\tctx = setIdentity(ctx, identity)\n\n\tspan.End()\n\treturn next.HandleFinalize(ctx, in)\n}\n\ntype identityKey struct{}\n\nfunc setIdentity(ctx context.Context, identity smithyauth.Identity) context.Context {\n\treturn middleware.WithStackValue(ctx, identityKey{}, identity)\n}\n\nfunc getIdentity(ctx context.Context) smithyauth.Identity {\n\tv, _ := middleware.GetStackValue(ctx, identityKey{}).(smithyauth.Identity)\n\treturn v\n}\n\ntype signRequestMiddleware struct {\n\toptions Options\n}\n\nfunc (*signRequestMiddleware) ID() string {\n\treturn \"Signing\"\n}\n\nfunc (m *signRequestMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"SignRequest\")\n\tdefer span.End()\n\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unexpected transport type %T\", in.Request)\n\t}\n\n\trscheme := getResolvedAuthScheme(ctx)\n\tif rscheme == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no resolved auth scheme\")\n\t}\n\n\tidentity := getIdentity(ctx)\n\tif identity == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no identity\")\n\t}\n\n\tsigner := rscheme.Scheme.Signer()\n\tif signer == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no signer\")\n\t}\n\n\t_, err = timeOperationMetric(ctx, \"client.call.signing_duration\", func() (any, error) {\n\t\treturn nil, signer.SignRequest(ctx, req, identity, rscheme.SignerProperties)\n\t}, func(o *metrics.RecordMetricOptions) {\n\t\to.Properties.Set(\"auth.scheme_id\", rscheme.Scheme.SchemeID())\n\t})\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"sign request: %w\", err)\n\t}\n\n\tspan.End()\n\treturn next.HandleFinalize(ctx, in)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/deserializers.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/protocol/restjson\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecrpublic/types\"\n\tsmithy \"github.com/aws/smithy-go\"\n\tsmithyio \"github.com/aws/smithy-go/io\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithytime \"github.com/aws/smithy-go/time\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"io\"\n\t\"strings\"\n\t\"time\"\n)\n\nfunc deserializeS3Expires(v string) (*time.Time, error) {\n\tt, err := smithytime.ParseHTTPDate(v)\n\tif err != nil {\n\t\treturn nil, nil\n\t}\n\treturn &t, nil\n}\n\ntype awsAwsjson11_deserializeOpBatchCheckLayerAvailability struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpBatchCheckLayerAvailability) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpBatchCheckLayerAvailability) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorBatchCheckLayerAvailability(response, &metadata)\n\t}\n\toutput := &BatchCheckLayerAvailabilityOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentBatchCheckLayerAvailabilityOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorBatchCheckLayerAvailability(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RegistryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRegistryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpBatchDeleteImage struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpBatchDeleteImage) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpBatchDeleteImage) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorBatchDeleteImage(response, &metadata)\n\t}\n\toutput := &BatchDeleteImageOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentBatchDeleteImageOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorBatchDeleteImage(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpCompleteLayerUpload struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpCompleteLayerUpload) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpCompleteLayerUpload) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorCompleteLayerUpload(response, &metadata)\n\t}\n\toutput := &CompleteLayerUploadOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentCompleteLayerUploadOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorCompleteLayerUpload(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"EmptyUploadException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorEmptyUploadException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidLayerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidLayerException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"LayerAlreadyExistsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLayerAlreadyExistsException(response, errorBody)\n\n\tcase strings.EqualFold(\"LayerPartTooSmallException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLayerPartTooSmallException(response, errorBody)\n\n\tcase strings.EqualFold(\"RegistryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRegistryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tcase strings.EqualFold(\"UploadNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUploadNotFoundException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpCreateRepository struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpCreateRepository) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpCreateRepository) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorCreateRepository(response, &metadata)\n\t}\n\toutput := &CreateRepositoryOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentCreateRepositoryOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorCreateRepository(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidTagParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidTagParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"LimitExceededException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryAlreadyExistsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryAlreadyExistsException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"TooManyTagsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorTooManyTagsException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDeleteRepository struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDeleteRepository) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDeleteRepository) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDeleteRepository(response, &metadata)\n\t}\n\toutput := &DeleteRepositoryOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDeleteRepositoryOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDeleteRepository(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotEmptyException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotEmptyException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDeleteRepositoryPolicy struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDeleteRepositoryPolicy) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDeleteRepositoryPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDeleteRepositoryPolicy(response, &metadata)\n\t}\n\toutput := &DeleteRepositoryPolicyOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDeleteRepositoryPolicyOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDeleteRepositoryPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryPolicyNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryPolicyNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDescribeImages struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDescribeImages) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDescribeImages) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDescribeImages(response, &metadata)\n\t}\n\toutput := &DescribeImagesOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDescribeImagesOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDescribeImages(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"ImageNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorImageNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDescribeImageTags struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDescribeImageTags) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDescribeImageTags) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDescribeImageTags(response, &metadata)\n\t}\n\toutput := &DescribeImageTagsOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDescribeImageTagsOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDescribeImageTags(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDescribeRegistries struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDescribeRegistries) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDescribeRegistries) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDescribeRegistries(response, &metadata)\n\t}\n\toutput := &DescribeRegistriesOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDescribeRegistriesOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDescribeRegistries(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpDescribeRepositories struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpDescribeRepositories) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpDescribeRepositories) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorDescribeRepositories(response, &metadata)\n\t}\n\toutput := &DescribeRepositoriesOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentDescribeRepositoriesOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorDescribeRepositories(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpGetAuthorizationToken struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpGetAuthorizationToken) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpGetAuthorizationToken) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorGetAuthorizationToken(response, &metadata)\n\t}\n\toutput := &GetAuthorizationTokenOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentGetAuthorizationTokenOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorGetAuthorizationToken(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpGetRegistryCatalogData struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpGetRegistryCatalogData) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpGetRegistryCatalogData) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorGetRegistryCatalogData(response, &metadata)\n\t}\n\toutput := &GetRegistryCatalogDataOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentGetRegistryCatalogDataOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorGetRegistryCatalogData(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpGetRepositoryCatalogData struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpGetRepositoryCatalogData) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpGetRepositoryCatalogData) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorGetRepositoryCatalogData(response, &metadata)\n\t}\n\toutput := &GetRepositoryCatalogDataOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentGetRepositoryCatalogDataOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorGetRepositoryCatalogData(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryCatalogDataNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryCatalogDataNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpGetRepositoryPolicy struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpGetRepositoryPolicy) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpGetRepositoryPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorGetRepositoryPolicy(response, &metadata)\n\t}\n\toutput := &GetRepositoryPolicyOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentGetRepositoryPolicyOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorGetRepositoryPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryPolicyNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryPolicyNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpInitiateLayerUpload struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpInitiateLayerUpload) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpInitiateLayerUpload) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorInitiateLayerUpload(response, &metadata)\n\t}\n\toutput := &InitiateLayerUploadOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentInitiateLayerUploadOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorInitiateLayerUpload(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RegistryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRegistryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpListTagsForResource struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpListTagsForResource) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpListTagsForResource) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorListTagsForResource(response, &metadata)\n\t}\n\toutput := &ListTagsForResourceOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentListTagsForResourceOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorListTagsForResource(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpPutImage struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpPutImage) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpPutImage) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorPutImage(response, &metadata)\n\t}\n\toutput := &PutImageOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentPutImageOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorPutImage(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"ImageAlreadyExistsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorImageAlreadyExistsException(response, errorBody)\n\n\tcase strings.EqualFold(\"ImageDigestDoesNotMatchException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorImageDigestDoesNotMatchException(response, errorBody)\n\n\tcase strings.EqualFold(\"ImageTagAlreadyExistsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorImageTagAlreadyExistsException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"LayersNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLayersNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"LimitExceededException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody)\n\n\tcase strings.EqualFold(\"ReferencedImagesNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorReferencedImagesNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"RegistryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRegistryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpPutRegistryCatalogData struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpPutRegistryCatalogData) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpPutRegistryCatalogData) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorPutRegistryCatalogData(response, &metadata)\n\t}\n\toutput := &PutRegistryCatalogDataOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentPutRegistryCatalogDataOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorPutRegistryCatalogData(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpPutRepositoryCatalogData struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpPutRepositoryCatalogData) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpPutRepositoryCatalogData) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorPutRepositoryCatalogData(response, &metadata)\n\t}\n\toutput := &PutRepositoryCatalogDataOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentPutRepositoryCatalogDataOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorPutRepositoryCatalogData(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpSetRepositoryPolicy struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpSetRepositoryPolicy) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpSetRepositoryPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorSetRepositoryPolicy(response, &metadata)\n\t}\n\toutput := &SetRepositoryPolicyOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentSetRepositoryPolicyOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorSetRepositoryPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpTagResource struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpTagResource) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpTagResource) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorTagResource(response, &metadata)\n\t}\n\toutput := &TagResourceOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentTagResourceOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorTagResource(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidTagParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidTagParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"TooManyTagsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorTooManyTagsException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpUntagResource struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpUntagResource) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpUntagResource) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorUntagResource(response, &metadata)\n\t}\n\toutput := &UntagResourceOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentUntagResourceOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorUntagResource(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidTagParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidTagParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"TooManyTagsException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorTooManyTagsException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsAwsjson11_deserializeOpUploadLayerPart struct {\n}\n\nfunc (*awsAwsjson11_deserializeOpUploadLayerPart) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsAwsjson11_deserializeOpUploadLayerPart) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsAwsjson11_deserializeOpErrorUploadLayerPart(response, &metadata)\n\t}\n\toutput := &UploadLayerPartOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\terr = awsAwsjson11_deserializeOpDocumentUploadLayerPartOutput(&output, shape)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn out, metadata, err\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc awsAwsjson11_deserializeOpErrorUploadLayerPart(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\theaderCode := response.Header.Get(\"X-Amzn-ErrorType\")\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tbodyInfo, err := getProtocolErrorInfo(decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\tif typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok {\n\t\terrorCode = restjson.SanitizeErrorCode(typ)\n\t}\n\tif len(bodyInfo.Message) != 0 {\n\t\terrorMessage = bodyInfo.Message\n\t}\n\tswitch {\n\tcase strings.EqualFold(\"InvalidLayerPartException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidLayerPartException(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidParameterException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody)\n\n\tcase strings.EqualFold(\"LimitExceededException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody)\n\n\tcase strings.EqualFold(\"RegistryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRegistryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"RepositoryNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody)\n\n\tcase strings.EqualFold(\"ServerException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorServerException(response, errorBody)\n\n\tcase strings.EqualFold(\"UnsupportedCommandException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody)\n\n\tcase strings.EqualFold(\"UploadNotFoundException\", errorCode):\n\t\treturn awsAwsjson11_deserializeErrorUploadNotFoundException(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsAwsjson11_deserializeErrorEmptyUploadException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.EmptyUploadException{}\n\terr := awsAwsjson11_deserializeDocumentEmptyUploadException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorImageAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.ImageAlreadyExistsException{}\n\terr := awsAwsjson11_deserializeDocumentImageAlreadyExistsException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorImageDigestDoesNotMatchException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.ImageDigestDoesNotMatchException{}\n\terr := awsAwsjson11_deserializeDocumentImageDigestDoesNotMatchException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorImageNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.ImageNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentImageNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorImageTagAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.ImageTagAlreadyExistsException{}\n\terr := awsAwsjson11_deserializeDocumentImageTagAlreadyExistsException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorInvalidLayerException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.InvalidLayerException{}\n\terr := awsAwsjson11_deserializeDocumentInvalidLayerException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorInvalidLayerPartException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.InvalidLayerPartException{}\n\terr := awsAwsjson11_deserializeDocumentInvalidLayerPartException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorInvalidParameterException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.InvalidParameterException{}\n\terr := awsAwsjson11_deserializeDocumentInvalidParameterException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorInvalidTagParameterException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.InvalidTagParameterException{}\n\terr := awsAwsjson11_deserializeDocumentInvalidTagParameterException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorLayerAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.LayerAlreadyExistsException{}\n\terr := awsAwsjson11_deserializeDocumentLayerAlreadyExistsException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorLayerPartTooSmallException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.LayerPartTooSmallException{}\n\terr := awsAwsjson11_deserializeDocumentLayerPartTooSmallException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorLayersNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.LayersNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentLayersNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorLimitExceededException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.LimitExceededException{}\n\terr := awsAwsjson11_deserializeDocumentLimitExceededException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorReferencedImagesNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.ReferencedImagesNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentReferencedImagesNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorRegistryNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.RegistryNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentRegistryNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorRepositoryAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.RepositoryAlreadyExistsException{}\n\terr := awsAwsjson11_deserializeDocumentRepositoryAlreadyExistsException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorRepositoryCatalogDataNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.RepositoryCatalogDataNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentRepositoryCatalogDataNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorRepositoryNotEmptyException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.RepositoryNotEmptyException{}\n\terr := awsAwsjson11_deserializeDocumentRepositoryNotEmptyException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorRepositoryNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.RepositoryNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentRepositoryNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorRepositoryPolicyNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.RepositoryPolicyNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentRepositoryPolicyNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorServerException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.ServerException{}\n\terr := awsAwsjson11_deserializeDocumentServerException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorTooManyTagsException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.TooManyTagsException{}\n\terr := awsAwsjson11_deserializeDocumentTooManyTagsException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorUnsupportedCommandException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.UnsupportedCommandException{}\n\terr := awsAwsjson11_deserializeDocumentUnsupportedCommandException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeErrorUploadNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\tdecoder := json.NewDecoder(body)\n\tdecoder.UseNumber()\n\tvar shape interface{}\n\tif err := decoder.Decode(&shape); err != nil && err != io.EOF {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\toutput := &types.UploadNotFoundException{}\n\terr := awsAwsjson11_deserializeDocumentUploadNotFoundException(&output, shape)\n\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\terr = &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t\treturn err\n\t}\n\n\terrorBody.Seek(0, io.SeekStart)\n\treturn output\n}\n\nfunc awsAwsjson11_deserializeDocumentArchitectureList(v *[]string, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []string\n\tif *v == nil {\n\t\tcv = []string{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col string\n\t\tif value != nil {\n\t\t\tjtv, ok := value.(string)\n\t\t\tif !ok {\n\t\t\t\treturn fmt.Errorf(\"expected Architecture to be of type string, got %T instead\", value)\n\t\t\t}\n\t\t\tcol = jtv\n\t\t}\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentAuthorizationData(v **types.AuthorizationData, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.AuthorizationData\n\tif *v == nil {\n\t\tsv = &types.AuthorizationData{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"authorizationToken\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Base64 to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.AuthorizationToken = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"expiresAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.ExpiresAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected ExpirationTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentEmptyUploadException(v **types.EmptyUploadException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.EmptyUploadException\n\tif *v == nil {\n\t\tsv = &types.EmptyUploadException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImage(v **types.Image, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.Image\n\tif *v == nil {\n\t\tsv = &types.Image{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"imageId\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageIdentifier(&sv.ImageId, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"imageManifest\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageManifest to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageManifest = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"imageManifestMediaType\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected MediaType to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageManifestMediaType = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryIdOrAlias to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageAlreadyExistsException(v **types.ImageAlreadyExistsException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageAlreadyExistsException\n\tif *v == nil {\n\t\tsv = &types.ImageAlreadyExistsException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageDetail(v **types.ImageDetail, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageDetail\n\tif *v == nil {\n\t\tsv = &types.ImageDetail{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"artifactMediaType\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected MediaType to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ArtifactMediaType = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"imageDigest\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageDigest to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageDigest = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"imageManifestMediaType\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected MediaType to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageManifestMediaType = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"imagePushedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.ImagePushedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected PushTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"imageSizeInBytes\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(json.Number)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageSizeInBytes to be json.Number, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\ti64, err := jtv.Int64()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.ImageSizeInBytes = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase \"imageTags\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageTagList(&sv.ImageTags, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageDetailList(v *[]types.ImageDetail, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.ImageDetail\n\tif *v == nil {\n\t\tcv = []types.ImageDetail{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.ImageDetail\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentImageDetail(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageDigestDoesNotMatchException(v **types.ImageDigestDoesNotMatchException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageDigestDoesNotMatchException\n\tif *v == nil {\n\t\tsv = &types.ImageDigestDoesNotMatchException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageFailure(v **types.ImageFailure, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageFailure\n\tif *v == nil {\n\t\tsv = &types.ImageFailure{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"failureCode\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageFailureCode to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.FailureCode = types.ImageFailureCode(jtv)\n\t\t\t}\n\n\t\tcase \"failureReason\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageFailureReason to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.FailureReason = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"imageId\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageIdentifier(&sv.ImageId, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageFailureList(v *[]types.ImageFailure, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.ImageFailure\n\tif *v == nil {\n\t\tcv = []types.ImageFailure{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.ImageFailure\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentImageFailure(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageIdentifier(v **types.ImageIdentifier, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageIdentifier\n\tif *v == nil {\n\t\tsv = &types.ImageIdentifier{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"imageDigest\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageDigest to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageDigest = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"imageTag\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageTag to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageTag = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageIdentifierList(v *[]types.ImageIdentifier, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.ImageIdentifier\n\tif *v == nil {\n\t\tcv = []types.ImageIdentifier{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.ImageIdentifier\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentImageIdentifier(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageNotFoundException(v **types.ImageNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageNotFoundException\n\tif *v == nil {\n\t\tsv = &types.ImageNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageTagAlreadyExistsException(v **types.ImageTagAlreadyExistsException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageTagAlreadyExistsException\n\tif *v == nil {\n\t\tsv = &types.ImageTagAlreadyExistsException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageTagDetail(v **types.ImageTagDetail, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ImageTagDetail\n\tif *v == nil {\n\t\tsv = &types.ImageTagDetail{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"createdAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.CreatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected CreationTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"imageDetail\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentReferencedImageDetail(&sv.ImageDetail, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"imageTag\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageTag to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageTag = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageTagDetailList(v *[]types.ImageTagDetail, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.ImageTagDetail\n\tif *v == nil {\n\t\tcv = []types.ImageTagDetail{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.ImageTagDetail\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentImageTagDetail(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentImageTagList(v *[]string, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []string\n\tif *v == nil {\n\t\tcv = []string{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col string\n\t\tif value != nil {\n\t\t\tjtv, ok := value.(string)\n\t\t\tif !ok {\n\t\t\t\treturn fmt.Errorf(\"expected ImageTag to be of type string, got %T instead\", value)\n\t\t\t}\n\t\t\tcol = jtv\n\t\t}\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentInvalidLayerException(v **types.InvalidLayerException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.InvalidLayerException\n\tif *v == nil {\n\t\tsv = &types.InvalidLayerException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentInvalidLayerPartException(v **types.InvalidLayerPartException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.InvalidLayerPartException\n\tif *v == nil {\n\t\tsv = &types.InvalidLayerPartException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"lastValidByteReceived\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(json.Number)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PartSize to be json.Number, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\ti64, err := jtv.Int64()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.LastValidByteReceived = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"uploadId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected UploadId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UploadId = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentInvalidParameterException(v **types.InvalidParameterException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.InvalidParameterException\n\tif *v == nil {\n\t\tsv = &types.InvalidParameterException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentInvalidTagParameterException(v **types.InvalidTagParameterException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.InvalidTagParameterException\n\tif *v == nil {\n\t\tsv = &types.InvalidTagParameterException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLayer(v **types.Layer, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.Layer\n\tif *v == nil {\n\t\tsv = &types.Layer{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"layerAvailability\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LayerAvailability to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.LayerAvailability = types.LayerAvailability(jtv)\n\t\t\t}\n\n\t\tcase \"layerDigest\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LayerDigest to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.LayerDigest = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"layerSize\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(json.Number)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LayerSizeInBytes to be json.Number, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\ti64, err := jtv.Int64()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.LayerSize = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase \"mediaType\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected MediaType to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.MediaType = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLayerAlreadyExistsException(v **types.LayerAlreadyExistsException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.LayerAlreadyExistsException\n\tif *v == nil {\n\t\tsv = &types.LayerAlreadyExistsException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLayerFailure(v **types.LayerFailure, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.LayerFailure\n\tif *v == nil {\n\t\tsv = &types.LayerFailure{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"failureCode\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LayerFailureCode to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.FailureCode = types.LayerFailureCode(jtv)\n\t\t\t}\n\n\t\tcase \"failureReason\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LayerFailureReason to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.FailureReason = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"layerDigest\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected BatchedOperationLayerDigest to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.LayerDigest = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLayerFailureList(v *[]types.LayerFailure, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.LayerFailure\n\tif *v == nil {\n\t\tcv = []types.LayerFailure{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.LayerFailure\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentLayerFailure(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLayerList(v *[]types.Layer, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.Layer\n\tif *v == nil {\n\t\tcv = []types.Layer{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.Layer\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentLayer(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLayerPartTooSmallException(v **types.LayerPartTooSmallException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.LayerPartTooSmallException\n\tif *v == nil {\n\t\tsv = &types.LayerPartTooSmallException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLayersNotFoundException(v **types.LayersNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.LayersNotFoundException\n\tif *v == nil {\n\t\tsv = &types.LayersNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentLimitExceededException(v **types.LimitExceededException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.LimitExceededException\n\tif *v == nil {\n\t\tsv = &types.LimitExceededException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentOperatingSystemList(v *[]string, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []string\n\tif *v == nil {\n\t\tcv = []string{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col string\n\t\tif value != nil {\n\t\t\tjtv, ok := value.(string)\n\t\t\tif !ok {\n\t\t\t\treturn fmt.Errorf(\"expected OperatingSystem to be of type string, got %T instead\", value)\n\t\t\t}\n\t\t\tcol = jtv\n\t\t}\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentReferencedImageDetail(v **types.ReferencedImageDetail, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ReferencedImageDetail\n\tif *v == nil {\n\t\tsv = &types.ReferencedImageDetail{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"artifactMediaType\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected MediaType to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ArtifactMediaType = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"imageDigest\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageDigest to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageDigest = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"imageManifestMediaType\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected MediaType to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.ImageManifestMediaType = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"imagePushedAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.ImagePushedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected PushTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"imageSizeInBytes\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(json.Number)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ImageSizeInBytes to be json.Number, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\ti64, err := jtv.Int64()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.ImageSizeInBytes = ptr.Int64(i64)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentReferencedImagesNotFoundException(v **types.ReferencedImagesNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ReferencedImagesNotFoundException\n\tif *v == nil {\n\t\tsv = &types.ReferencedImagesNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRegistry(v **types.Registry, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.Registry\n\tif *v == nil {\n\t\tsv = &types.Registry{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"aliases\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRegistryAliasList(&sv.Aliases, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"registryArn\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Arn to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryArn = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryUri\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Url to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryUri = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"verified\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryVerified to be of type *bool, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Verified = ptr.Bool(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRegistryAlias(v **types.RegistryAlias, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RegistryAlias\n\tif *v == nil {\n\t\tsv = &types.RegistryAlias{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"defaultRegistryAlias\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected DefaultRegistryAliasFlag to be of type *bool, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.DefaultRegistryAlias = jtv\n\t\t\t}\n\n\t\tcase \"name\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryAliasName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Name = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"primaryRegistryAlias\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PrimaryRegistryAliasFlag to be of type *bool, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.PrimaryRegistryAlias = jtv\n\t\t\t}\n\n\t\tcase \"status\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryAliasStatus to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Status = types.RegistryAliasStatus(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRegistryAliasList(v *[]types.RegistryAlias, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.RegistryAlias\n\tif *v == nil {\n\t\tcv = []types.RegistryAlias{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.RegistryAlias\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentRegistryAlias(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRegistryCatalogData(v **types.RegistryCatalogData, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RegistryCatalogData\n\tif *v == nil {\n\t\tsv = &types.RegistryCatalogData{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"displayName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryDisplayName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.DisplayName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRegistryList(v *[]types.Registry, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.Registry\n\tif *v == nil {\n\t\tcv = []types.Registry{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.Registry\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentRegistry(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRegistryNotFoundException(v **types.RegistryNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RegistryNotFoundException\n\tif *v == nil {\n\t\tsv = &types.RegistryNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepository(v **types.Repository, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.Repository\n\tif *v == nil {\n\t\tsv = &types.Repository{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"createdAt\":\n\t\t\tif value != nil {\n\t\t\t\tswitch jtv := value.(type) {\n\t\t\t\tcase json.Number:\n\t\t\t\t\tf64, err := jtv.Float64()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsv.CreatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"expected CreationTimestamp to be a JSON Number, got %T instead\", value)\n\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryArn\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Arn to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryArn = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryUri\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected Url to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryUri = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryAlreadyExistsException(v **types.RepositoryAlreadyExistsException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RepositoryAlreadyExistsException\n\tif *v == nil {\n\t\tsv = &types.RepositoryAlreadyExistsException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryCatalogData(v **types.RepositoryCatalogData, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RepositoryCatalogData\n\tif *v == nil {\n\t\tsv = &types.RepositoryCatalogData{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"aboutText\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected AboutText to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.AboutText = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"architectures\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentArchitectureList(&sv.Architectures, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"description\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryDescription to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Description = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"logoUrl\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ResourceUrl to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.LogoUrl = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"marketplaceCertified\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(bool)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected MarketplaceCertified to be of type *bool, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.MarketplaceCertified = ptr.Bool(jtv)\n\t\t\t}\n\n\t\tcase \"operatingSystems\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentOperatingSystemList(&sv.OperatingSystems, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"usageText\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected UsageText to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UsageText = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryCatalogDataNotFoundException(v **types.RepositoryCatalogDataNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RepositoryCatalogDataNotFoundException\n\tif *v == nil {\n\t\tsv = &types.RepositoryCatalogDataNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryList(v *[]types.Repository, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.Repository\n\tif *v == nil {\n\t\tcv = []types.Repository{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.Repository\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentRepository(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryNotEmptyException(v **types.RepositoryNotEmptyException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RepositoryNotEmptyException\n\tif *v == nil {\n\t\tsv = &types.RepositoryNotEmptyException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryNotFoundException(v **types.RepositoryNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RepositoryNotFoundException\n\tif *v == nil {\n\t\tsv = &types.RepositoryNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentRepositoryPolicyNotFoundException(v **types.RepositoryPolicyNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.RepositoryPolicyNotFoundException\n\tif *v == nil {\n\t\tsv = &types.RepositoryPolicyNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentServerException(v **types.ServerException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.ServerException\n\tif *v == nil {\n\t\tsv = &types.ServerException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentTag(v **types.Tag, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.Tag\n\tif *v == nil {\n\t\tsv = &types.Tag{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"Key\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected TagKey to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Key = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"Value\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected TagValue to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Value = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentTagList(v *[]types.Tag, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.([]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar cv []types.Tag\n\tif *v == nil {\n\t\tcv = []types.Tag{}\n\t} else {\n\t\tcv = *v\n\t}\n\n\tfor _, value := range shape {\n\t\tvar col types.Tag\n\t\tdestAddr := &col\n\t\tif err := awsAwsjson11_deserializeDocumentTag(&destAddr, value); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tcol = *destAddr\n\t\tcv = append(cv, col)\n\n\t}\n\t*v = cv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentTooManyTagsException(v **types.TooManyTagsException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.TooManyTagsException\n\tif *v == nil {\n\t\tsv = &types.TooManyTagsException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentUnsupportedCommandException(v **types.UnsupportedCommandException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.UnsupportedCommandException\n\tif *v == nil {\n\t\tsv = &types.UnsupportedCommandException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeDocumentUploadNotFoundException(v **types.UploadNotFoundException, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *types.UploadNotFoundException\n\tif *v == nil {\n\t\tsv = &types.UploadNotFoundException{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"message\", \"Message\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExceptionMessage to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.Message = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentBatchCheckLayerAvailabilityOutput(v **BatchCheckLayerAvailabilityOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *BatchCheckLayerAvailabilityOutput\n\tif *v == nil {\n\t\tsv = &BatchCheckLayerAvailabilityOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"failures\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentLayerFailureList(&sv.Failures, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"layers\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentLayerList(&sv.Layers, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentBatchDeleteImageOutput(v **BatchDeleteImageOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *BatchDeleteImageOutput\n\tif *v == nil {\n\t\tsv = &BatchDeleteImageOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"failures\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageFailureList(&sv.Failures, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"imageIds\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageIdentifierList(&sv.ImageIds, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentCompleteLayerUploadOutput(v **CompleteLayerUploadOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *CompleteLayerUploadOutput\n\tif *v == nil {\n\t\tsv = &CompleteLayerUploadOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"layerDigest\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected LayerDigest to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.LayerDigest = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"uploadId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected UploadId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UploadId = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentCreateRepositoryOutput(v **CreateRepositoryOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *CreateRepositoryOutput\n\tif *v == nil {\n\t\tsv = &CreateRepositoryOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"catalogData\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRepositoryCatalogData(&sv.CatalogData, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"repository\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRepository(&sv.Repository, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDeleteRepositoryOutput(v **DeleteRepositoryOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DeleteRepositoryOutput\n\tif *v == nil {\n\t\tsv = &DeleteRepositoryOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"repository\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRepository(&sv.Repository, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDeleteRepositoryPolicyOutput(v **DeleteRepositoryPolicyOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DeleteRepositoryPolicyOutput\n\tif *v == nil {\n\t\tsv = &DeleteRepositoryPolicyOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"policyText\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryPolicyText to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.PolicyText = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDescribeImagesOutput(v **DescribeImagesOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DescribeImagesOutput\n\tif *v == nil {\n\t\tsv = &DescribeImagesOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"imageDetails\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageDetailList(&sv.ImageDetails, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"nextToken\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected NextToken to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.NextToken = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDescribeImageTagsOutput(v **DescribeImageTagsOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DescribeImageTagsOutput\n\tif *v == nil {\n\t\tsv = &DescribeImageTagsOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"imageTagDetails\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImageTagDetailList(&sv.ImageTagDetails, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase \"nextToken\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected NextToken to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.NextToken = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDescribeRegistriesOutput(v **DescribeRegistriesOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DescribeRegistriesOutput\n\tif *v == nil {\n\t\tsv = &DescribeRegistriesOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"nextToken\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected NextToken to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.NextToken = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registries\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRegistryList(&sv.Registries, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentDescribeRepositoriesOutput(v **DescribeRepositoriesOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *DescribeRepositoriesOutput\n\tif *v == nil {\n\t\tsv = &DescribeRepositoriesOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"nextToken\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected NextToken to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.NextToken = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositories\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRepositoryList(&sv.Repositories, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentGetAuthorizationTokenOutput(v **GetAuthorizationTokenOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *GetAuthorizationTokenOutput\n\tif *v == nil {\n\t\tsv = &GetAuthorizationTokenOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"authorizationData\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentAuthorizationData(&sv.AuthorizationData, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentGetRegistryCatalogDataOutput(v **GetRegistryCatalogDataOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *GetRegistryCatalogDataOutput\n\tif *v == nil {\n\t\tsv = &GetRegistryCatalogDataOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"registryCatalogData\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRegistryCatalogData(&sv.RegistryCatalogData, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentGetRepositoryCatalogDataOutput(v **GetRepositoryCatalogDataOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *GetRepositoryCatalogDataOutput\n\tif *v == nil {\n\t\tsv = &GetRepositoryCatalogDataOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"catalogData\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRepositoryCatalogData(&sv.CatalogData, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentGetRepositoryPolicyOutput(v **GetRepositoryPolicyOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *GetRepositoryPolicyOutput\n\tif *v == nil {\n\t\tsv = &GetRepositoryPolicyOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"policyText\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryPolicyText to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.PolicyText = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentInitiateLayerUploadOutput(v **InitiateLayerUploadOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *InitiateLayerUploadOutput\n\tif *v == nil {\n\t\tsv = &InitiateLayerUploadOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"partSize\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(json.Number)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PartSize to be json.Number, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\ti64, err := jtv.Int64()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.PartSize = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase \"uploadId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected UploadId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UploadId = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentListTagsForResourceOutput(v **ListTagsForResourceOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *ListTagsForResourceOutput\n\tif *v == nil {\n\t\tsv = &ListTagsForResourceOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"tags\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentTagList(&sv.Tags, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentPutImageOutput(v **PutImageOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *PutImageOutput\n\tif *v == nil {\n\t\tsv = &PutImageOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"image\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentImage(&sv.Image, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentPutRegistryCatalogDataOutput(v **PutRegistryCatalogDataOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *PutRegistryCatalogDataOutput\n\tif *v == nil {\n\t\tsv = &PutRegistryCatalogDataOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"registryCatalogData\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRegistryCatalogData(&sv.RegistryCatalogData, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentPutRepositoryCatalogDataOutput(v **PutRepositoryCatalogDataOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *PutRepositoryCatalogDataOutput\n\tif *v == nil {\n\t\tsv = &PutRepositoryCatalogDataOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"catalogData\":\n\t\t\tif err := awsAwsjson11_deserializeDocumentRepositoryCatalogData(&sv.CatalogData, value); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentSetRepositoryPolicyOutput(v **SetRepositoryPolicyOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *SetRepositoryPolicyOutput\n\tif *v == nil {\n\t\tsv = &SetRepositoryPolicyOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"policyText\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryPolicyText to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.PolicyText = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentTagResourceOutput(v **TagResourceOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *TagResourceOutput\n\tif *v == nil {\n\t\tsv = &TagResourceOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentUntagResourceOutput(v **UntagResourceOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *UntagResourceOutput\n\tif *v == nil {\n\t\tsv = &UntagResourceOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsAwsjson11_deserializeOpDocumentUploadLayerPartOutput(v **UploadLayerPartOutput, value interface{}) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tif value == nil {\n\t\treturn nil\n\t}\n\n\tshape, ok := value.(map[string]interface{})\n\tif !ok {\n\t\treturn fmt.Errorf(\"unexpected JSON type %v\", value)\n\t}\n\n\tvar sv *UploadLayerPartOutput\n\tif *v == nil {\n\t\tsv = &UploadLayerPartOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor key, value := range shape {\n\t\tswitch key {\n\t\tcase \"lastByteReceived\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(json.Number)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected PartSize to be json.Number, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\ti64, err := jtv.Int64()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.LastByteReceived = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase \"registryId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RegistryId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RegistryId = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"repositoryName\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected RepositoryName to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.RepositoryName = ptr.String(jtv)\n\t\t\t}\n\n\t\tcase \"uploadId\":\n\t\t\tif value != nil {\n\t\t\t\tjtv, ok := value.(string)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn fmt.Errorf(\"expected UploadId to be of type string, got %T instead\", value)\n\t\t\t\t}\n\t\t\t\tsv.UploadId = ptr.String(jtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t_, _ = key, value\n\n\t\t}\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype protocolErrorInfo struct {\n\tType    string `json:\"__type\"`\n\tMessage string\n\tCode    any // nonstandard for awsjson but some services do present the type here\n}\n\nfunc getProtocolErrorInfo(decoder *json.Decoder) (protocolErrorInfo, error) {\n\tvar errInfo protocolErrorInfo\n\tif err := decoder.Decode(&errInfo); err != nil {\n\t\tif err == io.EOF {\n\t\t\treturn errInfo, nil\n\t\t}\n\t\treturn errInfo, err\n\t}\n\n\treturn errInfo, nil\n}\n\nfunc resolveProtocolErrorType(headerType string, bodyInfo protocolErrorInfo) (string, bool) {\n\tif len(headerType) != 0 {\n\t\treturn headerType, true\n\t} else if len(bodyInfo.Type) != 0 {\n\t\treturn bodyInfo.Type, true\n\t} else if code, ok := bodyInfo.Code.(string); ok && len(code) != 0 {\n\t\treturn code, true\n\t}\n\treturn \"\", false\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/doc.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\n// Package ecrpublic provides the API client, operations, and parameter types for\n// Amazon Elastic Container Registry Public.\n//\n// # Amazon Elastic Container Registry Public\n//\n// Amazon Elastic Container Registry Public (Amazon ECR Public) is a managed\n// container image registry service. Amazon ECR provides both public and private\n// registries to host your container images. You can use the Docker CLI or your\n// preferred client to push, pull, and manage images. Amazon ECR provides a secure,\n// scalable, and reliable registry for your Docker or Open Container Initiative\n// (OCI) images. Amazon ECR supports public repositories with this API. For\n// information about the Amazon ECR API for private repositories, see [Amazon Elastic Container Registry API Reference].\n//\n// [Amazon Elastic Container Registry API Reference]: https://docs.aws.amazon.com/AmazonECR/latest/APIReference/Welcome.html\npackage ecrpublic\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/endpoints.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\tinternalConfig \"github.com/aws/aws-sdk-go-v2/internal/configsources\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/endpoints\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn\"\n\tinternalendpoints \"github.com/aws/aws-sdk-go-v2/service/ecrpublic/internal/endpoints\"\n\tsmithyauth \"github.com/aws/smithy-go/auth\"\n\tsmithyendpoints \"github.com/aws/smithy-go/endpoints\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"strings\"\n)\n\n// EndpointResolverOptions is the service endpoint resolver options\ntype EndpointResolverOptions = internalendpoints.Options\n\n// EndpointResolver interface for resolving service endpoints.\ntype EndpointResolver interface {\n\tResolveEndpoint(region string, options EndpointResolverOptions) (aws.Endpoint, error)\n}\n\nvar _ EndpointResolver = &internalendpoints.Resolver{}\n\n// NewDefaultEndpointResolver constructs a new service endpoint resolver\nfunc NewDefaultEndpointResolver() *internalendpoints.Resolver {\n\treturn internalendpoints.New()\n}\n\n// EndpointResolverFunc is a helper utility that wraps a function so it satisfies\n// the EndpointResolver interface. This is useful when you want to add additional\n// endpoint resolving logic, or stub out specific endpoints with custom values.\ntype EndpointResolverFunc func(region string, options EndpointResolverOptions) (aws.Endpoint, error)\n\nfunc (fn EndpointResolverFunc) ResolveEndpoint(region string, options EndpointResolverOptions) (endpoint aws.Endpoint, err error) {\n\treturn fn(region, options)\n}\n\n// EndpointResolverFromURL returns an EndpointResolver configured using the\n// provided endpoint url. By default, the resolved endpoint resolver uses the\n// client region as signing region, and the endpoint source is set to\n// EndpointSourceCustom.You can provide functional options to configure endpoint\n// values for the resolved endpoint.\nfunc EndpointResolverFromURL(url string, optFns ...func(*aws.Endpoint)) EndpointResolver {\n\te := aws.Endpoint{URL: url, Source: aws.EndpointSourceCustom}\n\tfor _, fn := range optFns {\n\t\tfn(&e)\n\t}\n\n\treturn EndpointResolverFunc(\n\t\tfunc(region string, options EndpointResolverOptions) (aws.Endpoint, error) {\n\t\t\tif len(e.SigningRegion) == 0 {\n\t\t\t\te.SigningRegion = region\n\t\t\t}\n\t\t\treturn e, nil\n\t\t},\n\t)\n}\n\ntype ResolveEndpoint struct {\n\tResolver EndpointResolver\n\tOptions  EndpointResolverOptions\n}\n\nfunc (*ResolveEndpoint) ID() string {\n\treturn \"ResolveEndpoint\"\n}\n\nfunc (m *ResolveEndpoint) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\tif !awsmiddleware.GetRequiresLegacyEndpoints(ctx) {\n\t\treturn next.HandleSerialize(ctx, in)\n\t}\n\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type %T\", in.Request)\n\t}\n\n\tif m.Resolver == nil {\n\t\treturn out, metadata, fmt.Errorf(\"expected endpoint resolver to not be nil\")\n\t}\n\n\teo := m.Options\n\teo.Logger = middleware.GetLogger(ctx)\n\n\tvar endpoint aws.Endpoint\n\tendpoint, err = m.Resolver.ResolveEndpoint(awsmiddleware.GetRegion(ctx), eo)\n\tif err != nil {\n\t\tnf := (&aws.EndpointNotFoundError{})\n\t\tif errors.As(err, &nf) {\n\t\t\tctx = awsmiddleware.SetRequiresLegacyEndpoints(ctx, false)\n\t\t\treturn next.HandleSerialize(ctx, in)\n\t\t}\n\t\treturn out, metadata, fmt.Errorf(\"failed to resolve service endpoint, %w\", err)\n\t}\n\n\treq.URL, err = url.Parse(endpoint.URL)\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"failed to parse endpoint URL: %w\", err)\n\t}\n\n\tif len(awsmiddleware.GetSigningName(ctx)) == 0 {\n\t\tsigningName := endpoint.SigningName\n\t\tif len(signingName) == 0 {\n\t\t\tsigningName = \"ecr-public\"\n\t\t}\n\t\tctx = awsmiddleware.SetSigningName(ctx, signingName)\n\t}\n\tctx = awsmiddleware.SetEndpointSource(ctx, endpoint.Source)\n\tctx = smithyhttp.SetHostnameImmutable(ctx, endpoint.HostnameImmutable)\n\tctx = awsmiddleware.SetSigningRegion(ctx, endpoint.SigningRegion)\n\tctx = awsmiddleware.SetPartitionID(ctx, endpoint.PartitionID)\n\treturn next.HandleSerialize(ctx, in)\n}\nfunc addResolveEndpointMiddleware(stack *middleware.Stack, o Options) error {\n\treturn stack.Serialize.Insert(&ResolveEndpoint{\n\t\tResolver: o.EndpointResolver,\n\t\tOptions:  o.EndpointOptions,\n\t}, \"OperationSerializer\", middleware.Before)\n}\n\nfunc removeResolveEndpointMiddleware(stack *middleware.Stack) error {\n\t_, err := stack.Serialize.Remove((&ResolveEndpoint{}).ID())\n\treturn err\n}\n\ntype wrappedEndpointResolver struct {\n\tawsResolver aws.EndpointResolverWithOptions\n}\n\nfunc (w *wrappedEndpointResolver) ResolveEndpoint(region string, options EndpointResolverOptions) (endpoint aws.Endpoint, err error) {\n\treturn w.awsResolver.ResolveEndpoint(ServiceID, region, options)\n}\n\ntype awsEndpointResolverAdaptor func(service, region string) (aws.Endpoint, error)\n\nfunc (a awsEndpointResolverAdaptor) ResolveEndpoint(service, region string, options ...interface{}) (aws.Endpoint, error) {\n\treturn a(service, region)\n}\n\nvar _ aws.EndpointResolverWithOptions = awsEndpointResolverAdaptor(nil)\n\n// withEndpointResolver returns an aws.EndpointResolverWithOptions that first delegates endpoint resolution to the awsResolver.\n// If awsResolver returns aws.EndpointNotFoundError error, the v1 resolver middleware will swallow the error,\n// and set an appropriate context flag such that fallback will occur when EndpointResolverV2 is invoked\n// via its middleware.\n//\n// If another error (besides aws.EndpointNotFoundError) is returned, then that error will be propagated.\nfunc withEndpointResolver(awsResolver aws.EndpointResolver, awsResolverWithOptions aws.EndpointResolverWithOptions) EndpointResolver {\n\tvar resolver aws.EndpointResolverWithOptions\n\n\tif awsResolverWithOptions != nil {\n\t\tresolver = awsResolverWithOptions\n\t} else if awsResolver != nil {\n\t\tresolver = awsEndpointResolverAdaptor(awsResolver.ResolveEndpoint)\n\t}\n\n\treturn &wrappedEndpointResolver{\n\t\tawsResolver: resolver,\n\t}\n}\n\nfunc finalizeClientEndpointResolverOptions(options *Options) {\n\toptions.EndpointOptions.LogDeprecated = options.ClientLogMode.IsDeprecatedUsage()\n\n\tif len(options.EndpointOptions.ResolvedRegion) == 0 {\n\t\tconst fipsInfix = \"-fips-\"\n\t\tconst fipsPrefix = \"fips-\"\n\t\tconst fipsSuffix = \"-fips\"\n\n\t\tif strings.Contains(options.Region, fipsInfix) ||\n\t\t\tstrings.Contains(options.Region, fipsPrefix) ||\n\t\t\tstrings.Contains(options.Region, fipsSuffix) {\n\t\t\toptions.EndpointOptions.ResolvedRegion = strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(\n\t\t\t\toptions.Region, fipsInfix, \"-\"), fipsPrefix, \"\"), fipsSuffix, \"\")\n\t\t\toptions.EndpointOptions.UseFIPSEndpoint = aws.FIPSEndpointStateEnabled\n\t\t}\n\t}\n\n}\n\nfunc resolveEndpointResolverV2(options *Options) {\n\tif options.EndpointResolverV2 == nil {\n\t\toptions.EndpointResolverV2 = NewDefaultEndpointResolverV2()\n\t}\n}\n\nfunc resolveBaseEndpoint(cfg aws.Config, o *Options) {\n\tif cfg.BaseEndpoint != nil {\n\t\to.BaseEndpoint = cfg.BaseEndpoint\n\t}\n\n\t_, g := os.LookupEnv(\"AWS_ENDPOINT_URL\")\n\t_, s := os.LookupEnv(\"AWS_ENDPOINT_URL_ECR_PUBLIC\")\n\n\tif g && !s {\n\t\treturn\n\t}\n\n\tvalue, found, err := internalConfig.ResolveServiceBaseEndpoint(context.Background(), \"ECR PUBLIC\", cfg.ConfigSources)\n\tif found && err == nil {\n\t\to.BaseEndpoint = &value\n\t}\n}\n\nfunc bindRegion(region string) *string {\n\tif region == \"\" {\n\t\treturn nil\n\t}\n\treturn aws.String(endpoints.MapFIPSRegion(region))\n}\n\n// EndpointParameters provides the parameters that influence how endpoints are\n// resolved.\ntype EndpointParameters struct {\n\t// The AWS region used to dispatch the request.\n\t//\n\t// Parameter is\n\t// required.\n\t//\n\t// AWS::Region\n\tRegion *string\n\n\t// When true, use the dual-stack endpoint. If the configured endpoint does not\n\t// support dual-stack, dispatching the request MAY return an error.\n\t//\n\t// Defaults to\n\t// false if no value is provided.\n\t//\n\t// AWS::UseDualStack\n\tUseDualStack *bool\n\n\t// When true, send this request to the FIPS-compliant regional endpoint. If the\n\t// configured endpoint does not have a FIPS compliant endpoint, dispatching the\n\t// request will return an error.\n\t//\n\t// Defaults to false if no value is\n\t// provided.\n\t//\n\t// AWS::UseFIPS\n\tUseFIPS *bool\n\n\t// Override the endpoint used to send this request\n\t//\n\t// Parameter is\n\t// required.\n\t//\n\t// SDK::Endpoint\n\tEndpoint *string\n}\n\n// ValidateRequired validates required parameters are set.\nfunc (p EndpointParameters) ValidateRequired() error {\n\tif p.UseDualStack == nil {\n\t\treturn fmt.Errorf(\"parameter UseDualStack is required\")\n\t}\n\n\tif p.UseFIPS == nil {\n\t\treturn fmt.Errorf(\"parameter UseFIPS is required\")\n\t}\n\n\treturn nil\n}\n\n// WithDefaults returns a shallow copy of EndpointParameterswith default values\n// applied to members where applicable.\nfunc (p EndpointParameters) WithDefaults() EndpointParameters {\n\tif p.UseDualStack == nil {\n\t\tp.UseDualStack = ptr.Bool(false)\n\t}\n\n\tif p.UseFIPS == nil {\n\t\tp.UseFIPS = ptr.Bool(false)\n\t}\n\treturn p\n}\n\ntype stringSlice []string\n\nfunc (s stringSlice) Get(i int) *string {\n\tif i < 0 || i >= len(s) {\n\t\treturn nil\n\t}\n\n\tv := s[i]\n\treturn &v\n}\n\n// EndpointResolverV2 provides the interface for resolving service endpoints.\ntype EndpointResolverV2 interface {\n\t// ResolveEndpoint attempts to resolve the endpoint with the provided options,\n\t// returning the endpoint if found. Otherwise an error is returned.\n\tResolveEndpoint(ctx context.Context, params EndpointParameters) (\n\t\tsmithyendpoints.Endpoint, error,\n\t)\n}\n\n// resolver provides the implementation for resolving endpoints.\ntype resolver struct{}\n\nfunc NewDefaultEndpointResolverV2() EndpointResolverV2 {\n\treturn &resolver{}\n}\n\n// ResolveEndpoint attempts to resolve the endpoint with the provided options,\n// returning the endpoint if found. Otherwise an error is returned.\nfunc (r *resolver) ResolveEndpoint(\n\tctx context.Context, params EndpointParameters,\n) (\n\tendpoint smithyendpoints.Endpoint, err error,\n) {\n\tparams = params.WithDefaults()\n\tif err = params.ValidateRequired(); err != nil {\n\t\treturn endpoint, fmt.Errorf(\"endpoint parameters are not valid, %w\", err)\n\t}\n\t_UseDualStack := *params.UseDualStack\n\t_UseFIPS := *params.UseFIPS\n\n\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t_Endpoint := *exprVal\n\t\t_ = _Endpoint\n\t\tif _UseFIPS == true {\n\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid Configuration: FIPS and custom endpoint are not supported\")\n\t\t}\n\t\tif _UseDualStack == true {\n\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid Configuration: Dualstack and custom endpoint are not supported\")\n\t\t}\n\t\turiString := _Endpoint\n\n\t\turi, err := url.Parse(uriString)\n\t\tif err != nil {\n\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t}\n\n\t\treturn smithyendpoints.Endpoint{\n\t\t\tURI:     *uri,\n\t\t\tHeaders: http.Header{},\n\t\t}, nil\n\t}\n\tif exprVal := params.Region; exprVal != nil {\n\t\t_Region := *exprVal\n\t\t_ = _Region\n\t\tif exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil {\n\t\t\t_PartitionResult := *exprVal\n\t\t\t_ = _PartitionResult\n\t\t\tif _UseFIPS == true {\n\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\tif true == _PartitionResult.SupportsFIPS {\n\t\t\t\t\t\tif true == _PartitionResult.SupportsDualStack {\n\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\tout.WriteString(\"https://api.ecr-public-fips.\")\n\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\tout.WriteString(_PartitionResult.DualStackDnsSuffix)\n\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"FIPS and DualStack are enabled, but this partition does not support one or both\")\n\t\t\t\t}\n\t\t\t}\n\t\t\tif _UseFIPS == true {\n\t\t\t\tif _PartitionResult.SupportsFIPS == true {\n\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\tout.WriteString(\"https://api.ecr-public-fips.\")\n\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\tout.WriteString(_PartitionResult.DnsSuffix)\n\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t}()\n\n\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t}, nil\n\t\t\t\t}\n\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"FIPS is enabled but this partition does not support FIPS\")\n\t\t\t}\n\t\t\tif _UseDualStack == true {\n\t\t\t\tif true == _PartitionResult.SupportsDualStack {\n\t\t\t\t\tif \"aws\" == _PartitionResult.Name {\n\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\tout.WriteString(\"https://ecr-public.\")\n\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\tout.WriteString(\".api.aws\")\n\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t}()\n\n\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t}, nil\n\t\t\t\t\t}\n\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\tout.WriteString(\"https://api.ecr-public.\")\n\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\tout.WriteString(_PartitionResult.DualStackDnsSuffix)\n\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t}()\n\n\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t}, nil\n\t\t\t\t}\n\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"DualStack is enabled but this partition does not support DualStack\")\n\t\t\t}\n\t\t\turiString := func() string {\n\t\t\t\tvar out strings.Builder\n\t\t\t\tout.WriteString(\"https://api.ecr-public.\")\n\t\t\t\tout.WriteString(_Region)\n\t\t\t\tout.WriteString(\".\")\n\t\t\t\tout.WriteString(_PartitionResult.DnsSuffix)\n\t\t\t\treturn out.String()\n\t\t\t}()\n\n\t\t\turi, err := url.Parse(uriString)\n\t\t\tif err != nil {\n\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t}\n\n\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\tURI:     *uri,\n\t\t\t\tHeaders: http.Header{},\n\t\t\t}, nil\n\t\t}\n\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t}\n\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid Configuration: Missing Region\")\n}\n\ntype endpointParamsBinder interface {\n\tbindEndpointParams(*EndpointParameters)\n}\n\nfunc bindEndpointParams(ctx context.Context, input interface{}, options Options) *EndpointParameters {\n\tparams := &EndpointParameters{}\n\n\tparams.Region = bindRegion(options.Region)\n\tparams.UseDualStack = aws.Bool(options.EndpointOptions.UseDualStackEndpoint == aws.DualStackEndpointStateEnabled)\n\tparams.UseFIPS = aws.Bool(options.EndpointOptions.UseFIPSEndpoint == aws.FIPSEndpointStateEnabled)\n\tparams.Endpoint = options.BaseEndpoint\n\n\tif b, ok := input.(endpointParamsBinder); ok {\n\t\tb.bindEndpointParams(params)\n\t}\n\n\treturn params\n}\n\ntype resolveEndpointV2Middleware struct {\n\toptions Options\n}\n\nfunc (*resolveEndpointV2Middleware) ID() string {\n\treturn \"ResolveEndpointV2\"\n}\n\nfunc (m *resolveEndpointV2Middleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"ResolveEndpoint\")\n\tdefer span.End()\n\n\tif awsmiddleware.GetRequiresLegacyEndpoints(ctx) {\n\t\treturn next.HandleFinalize(ctx, in)\n\t}\n\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type %T\", in.Request)\n\t}\n\n\tif m.options.EndpointResolverV2 == nil {\n\t\treturn out, metadata, fmt.Errorf(\"expected endpoint resolver to not be nil\")\n\t}\n\n\tparams := bindEndpointParams(ctx, getOperationInput(ctx), m.options)\n\tendpt, err := timeOperationMetric(ctx, \"client.call.resolve_endpoint_duration\",\n\t\tfunc() (smithyendpoints.Endpoint, error) {\n\t\t\treturn m.options.EndpointResolverV2.ResolveEndpoint(ctx, *params)\n\t\t})\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"failed to resolve service endpoint, %w\", err)\n\t}\n\n\tspan.SetProperty(\"client.call.resolved_endpoint\", endpt.URI.String())\n\n\tif endpt.URI.RawPath == \"\" && req.URL.RawPath != \"\" {\n\t\tendpt.URI.RawPath = endpt.URI.Path\n\t}\n\treq.URL.Scheme = endpt.URI.Scheme\n\treq.URL.Host = endpt.URI.Host\n\treq.URL.Path = smithyhttp.JoinPath(endpt.URI.Path, req.URL.Path)\n\treq.URL.RawPath = smithyhttp.JoinPath(endpt.URI.RawPath, req.URL.RawPath)\n\tfor k := range endpt.Headers {\n\t\treq.Header.Set(k, endpt.Headers.Get(k))\n\t}\n\n\trscheme := getResolvedAuthScheme(ctx)\n\tif rscheme == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no resolved auth scheme\")\n\t}\n\n\topts, _ := smithyauth.GetAuthOptions(&endpt.Properties)\n\tfor _, o := range opts {\n\t\trscheme.SignerProperties.SetAll(&o.SignerProperties)\n\t}\n\n\tspan.End()\n\treturn next.HandleFinalize(ctx, in)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/generated.json",
    "content": "{\n    \"dependencies\": {\n        \"github.com/aws/aws-sdk-go-v2\": \"v1.4.0\",\n        \"github.com/aws/aws-sdk-go-v2/internal/configsources\": \"v0.0.0-00010101000000-000000000000\",\n        \"github.com/aws/aws-sdk-go-v2/internal/endpoints/v2\": \"v2.0.0-00010101000000-000000000000\",\n        \"github.com/aws/smithy-go\": \"v1.4.0\"\n    },\n    \"files\": [\n        \"api_client.go\",\n        \"api_client_test.go\",\n        \"api_op_BatchCheckLayerAvailability.go\",\n        \"api_op_BatchDeleteImage.go\",\n        \"api_op_CompleteLayerUpload.go\",\n        \"api_op_CreateRepository.go\",\n        \"api_op_DeleteRepository.go\",\n        \"api_op_DeleteRepositoryPolicy.go\",\n        \"api_op_DescribeImageTags.go\",\n        \"api_op_DescribeImages.go\",\n        \"api_op_DescribeRegistries.go\",\n        \"api_op_DescribeRepositories.go\",\n        \"api_op_GetAuthorizationToken.go\",\n        \"api_op_GetRegistryCatalogData.go\",\n        \"api_op_GetRepositoryCatalogData.go\",\n        \"api_op_GetRepositoryPolicy.go\",\n        \"api_op_InitiateLayerUpload.go\",\n        \"api_op_ListTagsForResource.go\",\n        \"api_op_PutImage.go\",\n        \"api_op_PutRegistryCatalogData.go\",\n        \"api_op_PutRepositoryCatalogData.go\",\n        \"api_op_SetRepositoryPolicy.go\",\n        \"api_op_TagResource.go\",\n        \"api_op_UntagResource.go\",\n        \"api_op_UploadLayerPart.go\",\n        \"auth.go\",\n        \"deserializers.go\",\n        \"doc.go\",\n        \"endpoints.go\",\n        \"endpoints_config_test.go\",\n        \"endpoints_test.go\",\n        \"generated.json\",\n        \"internal/endpoints/endpoints.go\",\n        \"internal/endpoints/endpoints_test.go\",\n        \"options.go\",\n        \"protocol_test.go\",\n        \"serializers.go\",\n        \"snapshot_test.go\",\n        \"sra_operation_order_test.go\",\n        \"types/enums.go\",\n        \"types/errors.go\",\n        \"types/types.go\",\n        \"validators.go\"\n    ],\n    \"go\": \"1.22\",\n    \"module\": \"github.com/aws/aws-sdk-go-v2/service/ecrpublic\",\n    \"unstable\": false\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/go_module_metadata.go",
    "content": "// Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT.\n\npackage ecrpublic\n\n// goModuleVersion is the tagged release for this module\nconst goModuleVersion = \"1.33.0\"\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/internal/endpoints/endpoints.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage endpoints\n\nimport (\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\tendpoints \"github.com/aws/aws-sdk-go-v2/internal/endpoints/v2\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"regexp\"\n)\n\n// Options is the endpoint resolver configuration options\ntype Options struct {\n\t// Logger is a logging implementation that log events should be sent to.\n\tLogger logging.Logger\n\n\t// LogDeprecated indicates that deprecated endpoints should be logged to the\n\t// provided logger.\n\tLogDeprecated bool\n\n\t// ResolvedRegion is used to override the region to be resolved, rather then the\n\t// using the value passed to the ResolveEndpoint method. This value is used by the\n\t// SDK to translate regions like fips-us-east-1 or us-east-1-fips to an alternative\n\t// name. You must not set this value directly in your application.\n\tResolvedRegion string\n\n\t// DisableHTTPS informs the resolver to return an endpoint that does not use the\n\t// HTTPS scheme.\n\tDisableHTTPS bool\n\n\t// UseDualStackEndpoint specifies the resolver must resolve a dual-stack endpoint.\n\tUseDualStackEndpoint aws.DualStackEndpointState\n\n\t// UseFIPSEndpoint specifies the resolver must resolve a FIPS endpoint.\n\tUseFIPSEndpoint aws.FIPSEndpointState\n}\n\nfunc (o Options) GetResolvedRegion() string {\n\treturn o.ResolvedRegion\n}\n\nfunc (o Options) GetDisableHTTPS() bool {\n\treturn o.DisableHTTPS\n}\n\nfunc (o Options) GetUseDualStackEndpoint() aws.DualStackEndpointState {\n\treturn o.UseDualStackEndpoint\n}\n\nfunc (o Options) GetUseFIPSEndpoint() aws.FIPSEndpointState {\n\treturn o.UseFIPSEndpoint\n}\n\nfunc transformToSharedOptions(options Options) endpoints.Options {\n\treturn endpoints.Options{\n\t\tLogger:               options.Logger,\n\t\tLogDeprecated:        options.LogDeprecated,\n\t\tResolvedRegion:       options.ResolvedRegion,\n\t\tDisableHTTPS:         options.DisableHTTPS,\n\t\tUseDualStackEndpoint: options.UseDualStackEndpoint,\n\t\tUseFIPSEndpoint:      options.UseFIPSEndpoint,\n\t}\n}\n\n// Resolver ECR PUBLIC endpoint resolver\ntype Resolver struct {\n\tpartitions endpoints.Partitions\n}\n\n// ResolveEndpoint resolves the service endpoint for the given region and options\nfunc (r *Resolver) ResolveEndpoint(region string, options Options) (endpoint aws.Endpoint, err error) {\n\tif len(region) == 0 {\n\t\treturn endpoint, &aws.MissingRegionError{}\n\t}\n\n\topt := transformToSharedOptions(options)\n\treturn r.partitions.ResolveEndpoint(region, opt)\n}\n\n// New returns a new Resolver\nfunc New() *Resolver {\n\treturn &Resolver{\n\t\tpartitions: defaultPartitions,\n\t}\n}\n\nvar partitionRegexp = struct {\n\tAws      *regexp.Regexp\n\tAwsCn    *regexp.Regexp\n\tAwsEusc  *regexp.Regexp\n\tAwsIso   *regexp.Regexp\n\tAwsIsoB  *regexp.Regexp\n\tAwsIsoE  *regexp.Regexp\n\tAwsIsoF  *regexp.Regexp\n\tAwsUsGov *regexp.Regexp\n}{\n\n\tAws:      regexp.MustCompile(\"^(us|eu|ap|sa|ca|me|af|il|mx)\\\\-\\\\w+\\\\-\\\\d+$\"),\n\tAwsCn:    regexp.MustCompile(\"^cn\\\\-\\\\w+\\\\-\\\\d+$\"),\n\tAwsEusc:  regexp.MustCompile(\"^eusc\\\\-(de)\\\\-\\\\w+\\\\-\\\\d+$\"),\n\tAwsIso:   regexp.MustCompile(\"^us\\\\-iso\\\\-\\\\w+\\\\-\\\\d+$\"),\n\tAwsIsoB:  regexp.MustCompile(\"^us\\\\-isob\\\\-\\\\w+\\\\-\\\\d+$\"),\n\tAwsIsoE:  regexp.MustCompile(\"^eu\\\\-isoe\\\\-\\\\w+\\\\-\\\\d+$\"),\n\tAwsIsoF:  regexp.MustCompile(\"^us\\\\-isof\\\\-\\\\w+\\\\-\\\\d+$\"),\n\tAwsUsGov: regexp.MustCompile(\"^us\\\\-gov\\\\-\\\\w+\\\\-\\\\d+$\"),\n}\n\nvar defaultPartitions = endpoints.Partitions{\n\t{\n\t\tID: \"aws\",\n\t\tDefaults: map[endpoints.DefaultKey]endpoints.Endpoint{\n\t\t\t{\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public.{region}.api.aws\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public-fips.{region}.amazonaws.com\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant | endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public-fips.{region}.api.aws\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: 0,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public.{region}.amazonaws.com\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t},\n\t\tRegionRegex:    partitionRegexp.Aws,\n\t\tIsRegionalized: true,\n\t\tEndpoints: endpoints.Endpoints{\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"us-east-1\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr-public.us-east-1.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-east-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion:  \"us-east-1\",\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname: \"ecr-public.us-east-1.api.aws\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-east-1\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendpoints.EndpointKey{\n\t\t\t\tRegion: \"us-west-2\",\n\t\t\t}: endpoints.Endpoint{\n\t\t\t\tHostname: \"api.ecr-public.us-west-2.amazonaws.com\",\n\t\t\t\tCredentialScope: endpoints.CredentialScope{\n\t\t\t\t\tRegion: \"us-west-2\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\tID: \"aws-cn\",\n\t\tDefaults: map[endpoints.DefaultKey]endpoints.Endpoint{\n\t\t\t{\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public.{region}.api.amazonwebservices.com.cn\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public-fips.{region}.amazonaws.com.cn\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant | endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public-fips.{region}.api.amazonwebservices.com.cn\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: 0,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public.{region}.amazonaws.com.cn\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t},\n\t\tRegionRegex:    partitionRegexp.AwsCn,\n\t\tIsRegionalized: true,\n\t},\n\t{\n\t\tID: \"aws-eusc\",\n\t\tDefaults: map[endpoints.DefaultKey]endpoints.Endpoint{\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public-fips.{region}.amazonaws.eu\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: 0,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public.{region}.amazonaws.eu\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t},\n\t\tRegionRegex:    partitionRegexp.AwsEusc,\n\t\tIsRegionalized: true,\n\t},\n\t{\n\t\tID: \"aws-iso\",\n\t\tDefaults: map[endpoints.DefaultKey]endpoints.Endpoint{\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public-fips.{region}.c2s.ic.gov\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: 0,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public.{region}.c2s.ic.gov\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t},\n\t\tRegionRegex:    partitionRegexp.AwsIso,\n\t\tIsRegionalized: true,\n\t},\n\t{\n\t\tID: \"aws-iso-b\",\n\t\tDefaults: map[endpoints.DefaultKey]endpoints.Endpoint{\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public-fips.{region}.sc2s.sgov.gov\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: 0,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public.{region}.sc2s.sgov.gov\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t},\n\t\tRegionRegex:    partitionRegexp.AwsIsoB,\n\t\tIsRegionalized: true,\n\t},\n\t{\n\t\tID: \"aws-iso-e\",\n\t\tDefaults: map[endpoints.DefaultKey]endpoints.Endpoint{\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public-fips.{region}.cloud.adc-e.uk\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: 0,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public.{region}.cloud.adc-e.uk\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t},\n\t\tRegionRegex:    partitionRegexp.AwsIsoE,\n\t\tIsRegionalized: true,\n\t},\n\t{\n\t\tID: \"aws-iso-f\",\n\t\tDefaults: map[endpoints.DefaultKey]endpoints.Endpoint{\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public-fips.{region}.csp.hci.ic.gov\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: 0,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public.{region}.csp.hci.ic.gov\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t},\n\t\tRegionRegex:    partitionRegexp.AwsIsoF,\n\t\tIsRegionalized: true,\n\t},\n\t{\n\t\tID: \"aws-us-gov\",\n\t\tDefaults: map[endpoints.DefaultKey]endpoints.Endpoint{\n\t\t\t{\n\t\t\t\tVariant: endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public.{region}.api.aws\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public-fips.{region}.amazonaws.com\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: endpoints.FIPSVariant | endpoints.DualStackVariant,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public-fips.{region}.api.aws\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t\t{\n\t\t\t\tVariant: 0,\n\t\t\t}: {\n\t\t\t\tHostname:          \"api.ecr-public.{region}.amazonaws.com\",\n\t\t\t\tProtocols:         []string{\"https\"},\n\t\t\t\tSignatureVersions: []string{\"v4\"},\n\t\t\t},\n\t\t},\n\t\tRegionRegex:    partitionRegexp.AwsUsGov,\n\t\tIsRegionalized: true,\n\t},\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/options.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\tinternalauthsmithy \"github.com/aws/aws-sdk-go-v2/internal/auth/smithy\"\n\tsmithyauth \"github.com/aws/smithy-go/auth\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"github.com/aws/smithy-go/metrics\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"net/http\"\n)\n\ntype HTTPClient interface {\n\tDo(*http.Request) (*http.Response, error)\n}\n\ntype Options struct {\n\t// Set of options to modify how an operation is invoked. These apply to all\n\t// operations invoked for this client. Use functional options on operation call to\n\t// modify this list for per operation behavior.\n\tAPIOptions []func(*middleware.Stack) error\n\n\t// The optional application specific identifier appended to the User-Agent header.\n\tAppID string\n\n\t// This endpoint will be given as input to an EndpointResolverV2. It is used for\n\t// providing a custom base endpoint that is subject to modifications by the\n\t// processing EndpointResolverV2.\n\tBaseEndpoint *string\n\n\t// Configures the events that will be sent to the configured logger.\n\tClientLogMode aws.ClientLogMode\n\n\t// The credentials object to use when signing requests.\n\tCredentials aws.CredentialsProvider\n\n\t// The configuration DefaultsMode that the SDK should use when constructing the\n\t// clients initial default settings.\n\tDefaultsMode aws.DefaultsMode\n\n\t// The endpoint options to be used when attempting to resolve an endpoint.\n\tEndpointOptions EndpointResolverOptions\n\n\t// The service endpoint resolver.\n\t//\n\t// Deprecated: Deprecated: EndpointResolver and WithEndpointResolver. Providing a\n\t// value for this field will likely prevent you from using any endpoint-related\n\t// service features released after the introduction of EndpointResolverV2 and\n\t// BaseEndpoint.\n\t//\n\t// To migrate an EndpointResolver implementation that uses a custom endpoint, set\n\t// the client option BaseEndpoint instead.\n\tEndpointResolver EndpointResolver\n\n\t// Resolves the endpoint used for a particular service operation. This should be\n\t// used over the deprecated EndpointResolver.\n\tEndpointResolverV2 EndpointResolverV2\n\n\t// Signature Version 4 (SigV4) Signer\n\tHTTPSignerV4 HTTPSignerV4\n\n\t// The logger writer interface to write logging messages to.\n\tLogger logging.Logger\n\n\t// The client meter provider.\n\tMeterProvider metrics.MeterProvider\n\n\t// The region to send requests to. (Required)\n\tRegion string\n\n\t// RetryMaxAttempts specifies the maximum number attempts an API client will call\n\t// an operation that fails with a retryable error. A value of 0 is ignored, and\n\t// will not be used to configure the API client created default retryer, or modify\n\t// per operation call's retry max attempts.\n\t//\n\t// If specified in an operation call's functional options with a value that is\n\t// different than the constructed client's Options, the Client's Retryer will be\n\t// wrapped to use the operation's specific RetryMaxAttempts value.\n\tRetryMaxAttempts int\n\n\t// RetryMode specifies the retry mode the API client will be created with, if\n\t// Retryer option is not also specified.\n\t//\n\t// When creating a new API Clients this member will only be used if the Retryer\n\t// Options member is nil. This value will be ignored if Retryer is not nil.\n\t//\n\t// Currently does not support per operation call overrides, may in the future.\n\tRetryMode aws.RetryMode\n\n\t// Retryer guides how HTTP requests should be retried in case of recoverable\n\t// failures. When nil the API client will use a default retryer. The kind of\n\t// default retry created by the API client can be changed with the RetryMode\n\t// option.\n\tRetryer aws.Retryer\n\n\t// The RuntimeEnvironment configuration, only populated if the DefaultsMode is set\n\t// to DefaultsModeAuto and is initialized using config.LoadDefaultConfig . You\n\t// should not populate this structure programmatically, or rely on the values here\n\t// within your applications.\n\tRuntimeEnvironment aws.RuntimeEnvironment\n\n\t// The client tracer provider.\n\tTracerProvider tracing.TracerProvider\n\n\t// The initial DefaultsMode used when the client options were constructed. If the\n\t// DefaultsMode was set to aws.DefaultsModeAuto this will store what the resolved\n\t// value was at that point in time.\n\t//\n\t// Currently does not support per operation call overrides, may in the future.\n\tresolvedDefaultsMode aws.DefaultsMode\n\n\t// The HTTP client to invoke API calls with. Defaults to client's default HTTP\n\t// implementation if nil.\n\tHTTPClient HTTPClient\n\n\t// The auth scheme resolver which determines how to authenticate for each\n\t// operation.\n\tAuthSchemeResolver AuthSchemeResolver\n\n\t// The list of auth schemes supported by the client.\n\tAuthSchemes []smithyhttp.AuthScheme\n}\n\n// Copy creates a clone where the APIOptions list is deep copied.\nfunc (o Options) Copy() Options {\n\tto := o\n\tto.APIOptions = make([]func(*middleware.Stack) error, len(o.APIOptions))\n\tcopy(to.APIOptions, o.APIOptions)\n\n\treturn to\n}\n\nfunc (o Options) GetIdentityResolver(schemeID string) smithyauth.IdentityResolver {\n\tif schemeID == \"aws.auth#sigv4\" {\n\t\treturn getSigV4IdentityResolver(o)\n\t}\n\tif schemeID == \"smithy.api#noAuth\" {\n\t\treturn &smithyauth.AnonymousIdentityResolver{}\n\t}\n\treturn nil\n}\n\n// WithAPIOptions returns a functional option for setting the Client's APIOptions\n// option.\nfunc WithAPIOptions(optFns ...func(*middleware.Stack) error) func(*Options) {\n\treturn func(o *Options) {\n\t\to.APIOptions = append(o.APIOptions, optFns...)\n\t}\n}\n\n// Deprecated: EndpointResolver and WithEndpointResolver. Providing a value for\n// this field will likely prevent you from using any endpoint-related service\n// features released after the introduction of EndpointResolverV2 and BaseEndpoint.\n//\n// To migrate an EndpointResolver implementation that uses a custom endpoint, set\n// the client option BaseEndpoint instead.\nfunc WithEndpointResolver(v EndpointResolver) func(*Options) {\n\treturn func(o *Options) {\n\t\to.EndpointResolver = v\n\t}\n}\n\n// WithEndpointResolverV2 returns a functional option for setting the Client's\n// EndpointResolverV2 option.\nfunc WithEndpointResolverV2(v EndpointResolverV2) func(*Options) {\n\treturn func(o *Options) {\n\t\to.EndpointResolverV2 = v\n\t}\n}\n\nfunc getSigV4IdentityResolver(o Options) smithyauth.IdentityResolver {\n\tif o.Credentials != nil {\n\t\treturn &internalauthsmithy.CredentialsProviderAdapter{Provider: o.Credentials}\n\t}\n\treturn nil\n}\n\n// WithSigV4SigningName applies an override to the authentication workflow to\n// use the given signing name for SigV4-authenticated operations.\n//\n// This is an advanced setting. The value here is FINAL, taking precedence over\n// the resolved signing name from both auth scheme resolution and endpoint\n// resolution.\nfunc WithSigV4SigningName(name string) func(*Options) {\n\tfn := func(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\t\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n\t) {\n\t\treturn next.HandleInitialize(awsmiddleware.SetSigningName(ctx, name), in)\n\t}\n\treturn func(o *Options) {\n\t\to.APIOptions = append(o.APIOptions, func(s *middleware.Stack) error {\n\t\t\treturn s.Initialize.Add(\n\t\t\t\tmiddleware.InitializeMiddlewareFunc(\"withSigV4SigningName\", fn),\n\t\t\t\tmiddleware.Before,\n\t\t\t)\n\t\t})\n\t}\n}\n\n// WithSigV4SigningRegion applies an override to the authentication workflow to\n// use the given signing region for SigV4-authenticated operations.\n//\n// This is an advanced setting. The value here is FINAL, taking precedence over\n// the resolved signing region from both auth scheme resolution and endpoint\n// resolution.\nfunc WithSigV4SigningRegion(region string) func(*Options) {\n\tfn := func(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\t\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n\t) {\n\t\treturn next.HandleInitialize(awsmiddleware.SetSigningRegion(ctx, region), in)\n\t}\n\treturn func(o *Options) {\n\t\to.APIOptions = append(o.APIOptions, func(s *middleware.Stack) error {\n\t\t\treturn s.Initialize.Add(\n\t\t\t\tmiddleware.InitializeMiddlewareFunc(\"withSigV4SigningRegion\", fn),\n\t\t\t\tmiddleware.Before,\n\t\t\t)\n\t\t})\n\t}\n}\n\nfunc ignoreAnonymousAuth(options *Options) {\n\tif aws.IsCredentialsProvider(options.Credentials, (*aws.AnonymousCredentials)(nil)) {\n\t\toptions.Credentials = nil\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/serializers.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/aws/aws-sdk-go-v2/service/ecrpublic/types\"\n\tsmithy \"github.com/aws/smithy-go\"\n\t\"github.com/aws/smithy-go/encoding/httpbinding\"\n\tsmithyjson \"github.com/aws/smithy-go/encoding/json\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"path\"\n)\n\ntype awsAwsjson11_serializeOpBatchCheckLayerAvailability struct {\n}\n\nfunc (*awsAwsjson11_serializeOpBatchCheckLayerAvailability) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpBatchCheckLayerAvailability) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*BatchCheckLayerAvailabilityInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.BatchCheckLayerAvailability\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentBatchCheckLayerAvailabilityInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpBatchDeleteImage struct {\n}\n\nfunc (*awsAwsjson11_serializeOpBatchDeleteImage) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpBatchDeleteImage) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*BatchDeleteImageInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.BatchDeleteImage\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentBatchDeleteImageInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpCompleteLayerUpload struct {\n}\n\nfunc (*awsAwsjson11_serializeOpCompleteLayerUpload) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpCompleteLayerUpload) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*CompleteLayerUploadInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.CompleteLayerUpload\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentCompleteLayerUploadInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpCreateRepository struct {\n}\n\nfunc (*awsAwsjson11_serializeOpCreateRepository) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpCreateRepository) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*CreateRepositoryInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.CreateRepository\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentCreateRepositoryInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDeleteRepository struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDeleteRepository) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDeleteRepository) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DeleteRepositoryInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.DeleteRepository\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDeleteRepositoryInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDeleteRepositoryPolicy struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDeleteRepositoryPolicy) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDeleteRepositoryPolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DeleteRepositoryPolicyInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.DeleteRepositoryPolicy\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDeleteRepositoryPolicyInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDescribeImages struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDescribeImages) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDescribeImages) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DescribeImagesInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.DescribeImages\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDescribeImagesInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDescribeImageTags struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDescribeImageTags) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDescribeImageTags) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DescribeImageTagsInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.DescribeImageTags\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDescribeImageTagsInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDescribeRegistries struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDescribeRegistries) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDescribeRegistries) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DescribeRegistriesInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.DescribeRegistries\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDescribeRegistriesInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpDescribeRepositories struct {\n}\n\nfunc (*awsAwsjson11_serializeOpDescribeRepositories) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpDescribeRepositories) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*DescribeRepositoriesInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.DescribeRepositories\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentDescribeRepositoriesInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpGetAuthorizationToken struct {\n}\n\nfunc (*awsAwsjson11_serializeOpGetAuthorizationToken) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpGetAuthorizationToken) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*GetAuthorizationTokenInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.GetAuthorizationToken\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentGetAuthorizationTokenInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpGetRegistryCatalogData struct {\n}\n\nfunc (*awsAwsjson11_serializeOpGetRegistryCatalogData) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpGetRegistryCatalogData) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*GetRegistryCatalogDataInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.GetRegistryCatalogData\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentGetRegistryCatalogDataInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpGetRepositoryCatalogData struct {\n}\n\nfunc (*awsAwsjson11_serializeOpGetRepositoryCatalogData) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpGetRepositoryCatalogData) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*GetRepositoryCatalogDataInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.GetRepositoryCatalogData\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentGetRepositoryCatalogDataInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpGetRepositoryPolicy struct {\n}\n\nfunc (*awsAwsjson11_serializeOpGetRepositoryPolicy) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpGetRepositoryPolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*GetRepositoryPolicyInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.GetRepositoryPolicy\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentGetRepositoryPolicyInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpInitiateLayerUpload struct {\n}\n\nfunc (*awsAwsjson11_serializeOpInitiateLayerUpload) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpInitiateLayerUpload) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*InitiateLayerUploadInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.InitiateLayerUpload\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentInitiateLayerUploadInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpListTagsForResource struct {\n}\n\nfunc (*awsAwsjson11_serializeOpListTagsForResource) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpListTagsForResource) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*ListTagsForResourceInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.ListTagsForResource\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentListTagsForResourceInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpPutImage struct {\n}\n\nfunc (*awsAwsjson11_serializeOpPutImage) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpPutImage) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*PutImageInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.PutImage\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentPutImageInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpPutRegistryCatalogData struct {\n}\n\nfunc (*awsAwsjson11_serializeOpPutRegistryCatalogData) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpPutRegistryCatalogData) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*PutRegistryCatalogDataInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.PutRegistryCatalogData\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentPutRegistryCatalogDataInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpPutRepositoryCatalogData struct {\n}\n\nfunc (*awsAwsjson11_serializeOpPutRepositoryCatalogData) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpPutRepositoryCatalogData) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*PutRepositoryCatalogDataInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.PutRepositoryCatalogData\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentPutRepositoryCatalogDataInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpSetRepositoryPolicy struct {\n}\n\nfunc (*awsAwsjson11_serializeOpSetRepositoryPolicy) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpSetRepositoryPolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*SetRepositoryPolicyInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.SetRepositoryPolicy\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentSetRepositoryPolicyInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpTagResource struct {\n}\n\nfunc (*awsAwsjson11_serializeOpTagResource) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpTagResource) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*TagResourceInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.TagResource\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentTagResourceInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpUntagResource struct {\n}\n\nfunc (*awsAwsjson11_serializeOpUntagResource) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpUntagResource) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*UntagResourceInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.UntagResource\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentUntagResourceInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype awsAwsjson11_serializeOpUploadLayerPart struct {\n}\n\nfunc (*awsAwsjson11_serializeOpUploadLayerPart) ID() string {\n\treturn \"OperationSerializer\"\n}\n\nfunc (m *awsAwsjson11_serializeOpUploadLayerPart) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"OperationSerializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.serialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown transport type %T\", in.Request)}\n\t}\n\n\tinput, ok := in.Parameters.(*UploadLayerPartInput)\n\t_ = input\n\tif !ok {\n\t\treturn out, metadata, &smithy.SerializationError{Err: fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)}\n\t}\n\n\toperationPath := \"/\"\n\tif len(request.Request.URL.Path) == 0 {\n\t\trequest.Request.URL.Path = operationPath\n\t} else {\n\t\trequest.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath)\n\t\tif request.Request.URL.Path != \"/\" && operationPath[len(operationPath)-1] == '/' {\n\t\t\trequest.Request.URL.Path += \"/\"\n\t\t}\n\t}\n\trequest.Request.Method = \"POST\"\n\thttpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\thttpBindingEncoder.SetHeader(\"Content-Type\").String(\"application/x-amz-json-1.1\")\n\thttpBindingEncoder.SetHeader(\"X-Amz-Target\").String(\"SpencerFrontendService.UploadLayerPart\")\n\n\tjsonEncoder := smithyjson.NewEncoder()\n\tif err := awsAwsjson11_serializeOpDocumentUploadLayerPartInput(input, jsonEncoder.Value); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\n\tif request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil {\n\t\treturn out, metadata, &smithy.SerializationError{Err: err}\n\t}\n\tin.Request = request\n\n\tendTimer()\n\tspan.End()\n\treturn next.HandleSerialize(ctx, in)\n}\nfunc awsAwsjson11_serializeDocumentArchitectureList(v []string, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tav.String(v[i])\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentBatchedOperationLayerDigestList(v []string, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tav.String(v[i])\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentImageIdentifier(v *types.ImageIdentifier, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ImageDigest != nil {\n\t\tok := object.Key(\"imageDigest\")\n\t\tok.String(*v.ImageDigest)\n\t}\n\n\tif v.ImageTag != nil {\n\t\tok := object.Key(\"imageTag\")\n\t\tok.String(*v.ImageTag)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentImageIdentifierList(v []types.ImageIdentifier, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tif err := awsAwsjson11_serializeDocumentImageIdentifier(&v[i], av); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentLayerDigestList(v []string, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tav.String(v[i])\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentOperatingSystemList(v []string, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tav.String(v[i])\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentRepositoryCatalogDataInput(v *types.RepositoryCatalogDataInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.AboutText != nil {\n\t\tok := object.Key(\"aboutText\")\n\t\tok.String(*v.AboutText)\n\t}\n\n\tif v.Architectures != nil {\n\t\tok := object.Key(\"architectures\")\n\t\tif err := awsAwsjson11_serializeDocumentArchitectureList(v.Architectures, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.Description != nil {\n\t\tok := object.Key(\"description\")\n\t\tok.String(*v.Description)\n\t}\n\n\tif v.LogoImageBlob != nil {\n\t\tok := object.Key(\"logoImageBlob\")\n\t\tok.Base64EncodeBytes(v.LogoImageBlob)\n\t}\n\n\tif v.OperatingSystems != nil {\n\t\tok := object.Key(\"operatingSystems\")\n\t\tif err := awsAwsjson11_serializeDocumentOperatingSystemList(v.OperatingSystems, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.UsageText != nil {\n\t\tok := object.Key(\"usageText\")\n\t\tok.String(*v.UsageText)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentRepositoryNameList(v []string, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tav.String(v[i])\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentTag(v *types.Tag, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.Key != nil {\n\t\tok := object.Key(\"Key\")\n\t\tok.String(*v.Key)\n\t}\n\n\tif v.Value != nil {\n\t\tok := object.Key(\"Value\")\n\t\tok.String(*v.Value)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentTagKeyList(v []string, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tav.String(v[i])\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeDocumentTagList(v []types.Tag, value smithyjson.Value) error {\n\tarray := value.Array()\n\tdefer array.Close()\n\n\tfor i := range v {\n\t\tav := array.Value()\n\t\tif err := awsAwsjson11_serializeDocumentTag(&v[i], av); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentBatchCheckLayerAvailabilityInput(v *BatchCheckLayerAvailabilityInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.LayerDigests != nil {\n\t\tok := object.Key(\"layerDigests\")\n\t\tif err := awsAwsjson11_serializeDocumentBatchedOperationLayerDigestList(v.LayerDigests, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentBatchDeleteImageInput(v *BatchDeleteImageInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ImageIds != nil {\n\t\tok := object.Key(\"imageIds\")\n\t\tif err := awsAwsjson11_serializeDocumentImageIdentifierList(v.ImageIds, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentCompleteLayerUploadInput(v *CompleteLayerUploadInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.LayerDigests != nil {\n\t\tok := object.Key(\"layerDigests\")\n\t\tif err := awsAwsjson11_serializeDocumentLayerDigestList(v.LayerDigests, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\tif v.UploadId != nil {\n\t\tok := object.Key(\"uploadId\")\n\t\tok.String(*v.UploadId)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentCreateRepositoryInput(v *CreateRepositoryInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.CatalogData != nil {\n\t\tok := object.Key(\"catalogData\")\n\t\tif err := awsAwsjson11_serializeDocumentRepositoryCatalogDataInput(v.CatalogData, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\tif v.Tags != nil {\n\t\tok := object.Key(\"tags\")\n\t\tif err := awsAwsjson11_serializeDocumentTagList(v.Tags, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDeleteRepositoryInput(v *DeleteRepositoryInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.Force {\n\t\tok := object.Key(\"force\")\n\t\tok.Boolean(v.Force)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDeleteRepositoryPolicyInput(v *DeleteRepositoryPolicyInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDescribeImagesInput(v *DescribeImagesInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ImageIds != nil {\n\t\tok := object.Key(\"imageIds\")\n\t\tif err := awsAwsjson11_serializeDocumentImageIdentifierList(v.ImageIds, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.MaxResults != nil {\n\t\tok := object.Key(\"maxResults\")\n\t\tok.Integer(*v.MaxResults)\n\t}\n\n\tif v.NextToken != nil {\n\t\tok := object.Key(\"nextToken\")\n\t\tok.String(*v.NextToken)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDescribeImageTagsInput(v *DescribeImageTagsInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.MaxResults != nil {\n\t\tok := object.Key(\"maxResults\")\n\t\tok.Integer(*v.MaxResults)\n\t}\n\n\tif v.NextToken != nil {\n\t\tok := object.Key(\"nextToken\")\n\t\tok.String(*v.NextToken)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDescribeRegistriesInput(v *DescribeRegistriesInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.MaxResults != nil {\n\t\tok := object.Key(\"maxResults\")\n\t\tok.Integer(*v.MaxResults)\n\t}\n\n\tif v.NextToken != nil {\n\t\tok := object.Key(\"nextToken\")\n\t\tok.String(*v.NextToken)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentDescribeRepositoriesInput(v *DescribeRepositoriesInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.MaxResults != nil {\n\t\tok := object.Key(\"maxResults\")\n\t\tok.Integer(*v.MaxResults)\n\t}\n\n\tif v.NextToken != nil {\n\t\tok := object.Key(\"nextToken\")\n\t\tok.String(*v.NextToken)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryNames != nil {\n\t\tok := object.Key(\"repositoryNames\")\n\t\tif err := awsAwsjson11_serializeDocumentRepositoryNameList(v.RepositoryNames, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentGetAuthorizationTokenInput(v *GetAuthorizationTokenInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentGetRegistryCatalogDataInput(v *GetRegistryCatalogDataInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentGetRepositoryCatalogDataInput(v *GetRepositoryCatalogDataInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentGetRepositoryPolicyInput(v *GetRepositoryPolicyInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentInitiateLayerUploadInput(v *InitiateLayerUploadInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentListTagsForResourceInput(v *ListTagsForResourceInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ResourceArn != nil {\n\t\tok := object.Key(\"resourceArn\")\n\t\tok.String(*v.ResourceArn)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentPutImageInput(v *PutImageInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ImageDigest != nil {\n\t\tok := object.Key(\"imageDigest\")\n\t\tok.String(*v.ImageDigest)\n\t}\n\n\tif v.ImageManifest != nil {\n\t\tok := object.Key(\"imageManifest\")\n\t\tok.String(*v.ImageManifest)\n\t}\n\n\tif v.ImageManifestMediaType != nil {\n\t\tok := object.Key(\"imageManifestMediaType\")\n\t\tok.String(*v.ImageManifestMediaType)\n\t}\n\n\tif v.ImageTag != nil {\n\t\tok := object.Key(\"imageTag\")\n\t\tok.String(*v.ImageTag)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentPutRegistryCatalogDataInput(v *PutRegistryCatalogDataInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.DisplayName != nil {\n\t\tok := object.Key(\"displayName\")\n\t\tok.String(*v.DisplayName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentPutRepositoryCatalogDataInput(v *PutRepositoryCatalogDataInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.CatalogData != nil {\n\t\tok := object.Key(\"catalogData\")\n\t\tif err := awsAwsjson11_serializeDocumentRepositoryCatalogDataInput(v.CatalogData, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentSetRepositoryPolicyInput(v *SetRepositoryPolicyInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.Force {\n\t\tok := object.Key(\"force\")\n\t\tok.Boolean(v.Force)\n\t}\n\n\tif v.PolicyText != nil {\n\t\tok := object.Key(\"policyText\")\n\t\tok.String(*v.PolicyText)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentTagResourceInput(v *TagResourceInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ResourceArn != nil {\n\t\tok := object.Key(\"resourceArn\")\n\t\tok.String(*v.ResourceArn)\n\t}\n\n\tif v.Tags != nil {\n\t\tok := object.Key(\"tags\")\n\t\tif err := awsAwsjson11_serializeDocumentTagList(v.Tags, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentUntagResourceInput(v *UntagResourceInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.ResourceArn != nil {\n\t\tok := object.Key(\"resourceArn\")\n\t\tok.String(*v.ResourceArn)\n\t}\n\n\tif v.TagKeys != nil {\n\t\tok := object.Key(\"tagKeys\")\n\t\tif err := awsAwsjson11_serializeDocumentTagKeyList(v.TagKeys, ok); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsAwsjson11_serializeOpDocumentUploadLayerPartInput(v *UploadLayerPartInput, value smithyjson.Value) error {\n\tobject := value.Object()\n\tdefer object.Close()\n\n\tif v.LayerPartBlob != nil {\n\t\tok := object.Key(\"layerPartBlob\")\n\t\tok.Base64EncodeBytes(v.LayerPartBlob)\n\t}\n\n\tif v.PartFirstByte != nil {\n\t\tok := object.Key(\"partFirstByte\")\n\t\tok.Long(*v.PartFirstByte)\n\t}\n\n\tif v.PartLastByte != nil {\n\t\tok := object.Key(\"partLastByte\")\n\t\tok.Long(*v.PartLastByte)\n\t}\n\n\tif v.RegistryId != nil {\n\t\tok := object.Key(\"registryId\")\n\t\tok.String(*v.RegistryId)\n\t}\n\n\tif v.RepositoryName != nil {\n\t\tok := object.Key(\"repositoryName\")\n\t\tok.String(*v.RepositoryName)\n\t}\n\n\tif v.UploadId != nil {\n\t\tok := object.Key(\"uploadId\")\n\t\tok.String(*v.UploadId)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/types/enums.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage types\n\ntype ImageFailureCode string\n\n// Enum values for ImageFailureCode\nconst (\n\tImageFailureCodeInvalidImageDigest            ImageFailureCode = \"InvalidImageDigest\"\n\tImageFailureCodeInvalidImageTag               ImageFailureCode = \"InvalidImageTag\"\n\tImageFailureCodeImageTagDoesNotMatchDigest    ImageFailureCode = \"ImageTagDoesNotMatchDigest\"\n\tImageFailureCodeImageNotFound                 ImageFailureCode = \"ImageNotFound\"\n\tImageFailureCodeMissingDigestAndTag           ImageFailureCode = \"MissingDigestAndTag\"\n\tImageFailureCodeImageReferencedByManifestList ImageFailureCode = \"ImageReferencedByManifestList\"\n\tImageFailureCodeKmsError                      ImageFailureCode = \"KmsError\"\n)\n\n// Values returns all known values for ImageFailureCode. Note that this can be\n// expanded in the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (ImageFailureCode) Values() []ImageFailureCode {\n\treturn []ImageFailureCode{\n\t\t\"InvalidImageDigest\",\n\t\t\"InvalidImageTag\",\n\t\t\"ImageTagDoesNotMatchDigest\",\n\t\t\"ImageNotFound\",\n\t\t\"MissingDigestAndTag\",\n\t\t\"ImageReferencedByManifestList\",\n\t\t\"KmsError\",\n\t}\n}\n\ntype LayerAvailability string\n\n// Enum values for LayerAvailability\nconst (\n\tLayerAvailabilityAvailable   LayerAvailability = \"AVAILABLE\"\n\tLayerAvailabilityUnavailable LayerAvailability = \"UNAVAILABLE\"\n)\n\n// Values returns all known values for LayerAvailability. Note that this can be\n// expanded in the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (LayerAvailability) Values() []LayerAvailability {\n\treturn []LayerAvailability{\n\t\t\"AVAILABLE\",\n\t\t\"UNAVAILABLE\",\n\t}\n}\n\ntype LayerFailureCode string\n\n// Enum values for LayerFailureCode\nconst (\n\tLayerFailureCodeInvalidLayerDigest LayerFailureCode = \"InvalidLayerDigest\"\n\tLayerFailureCodeMissingLayerDigest LayerFailureCode = \"MissingLayerDigest\"\n)\n\n// Values returns all known values for LayerFailureCode. Note that this can be\n// expanded in the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (LayerFailureCode) Values() []LayerFailureCode {\n\treturn []LayerFailureCode{\n\t\t\"InvalidLayerDigest\",\n\t\t\"MissingLayerDigest\",\n\t}\n}\n\ntype RegistryAliasStatus string\n\n// Enum values for RegistryAliasStatus\nconst (\n\tRegistryAliasStatusActive   RegistryAliasStatus = \"ACTIVE\"\n\tRegistryAliasStatusPending  RegistryAliasStatus = \"PENDING\"\n\tRegistryAliasStatusRejected RegistryAliasStatus = \"REJECTED\"\n)\n\n// Values returns all known values for RegistryAliasStatus. Note that this can be\n// expanded in the future, and so it is only as up to date as the client.\n//\n// The ordering of this slice is not guaranteed to be stable across updates.\nfunc (RegistryAliasStatus) Values() []RegistryAliasStatus {\n\treturn []RegistryAliasStatus{\n\t\t\"ACTIVE\",\n\t\t\"PENDING\",\n\t\t\"REJECTED\",\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/types/errors.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage types\n\nimport (\n\t\"fmt\"\n\tsmithy \"github.com/aws/smithy-go\"\n)\n\n// The specified layer upload doesn't contain any layer parts.\ntype EmptyUploadException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *EmptyUploadException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *EmptyUploadException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *EmptyUploadException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"EmptyUploadException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *EmptyUploadException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified image has already been pushed, and there were no changes to the\n// manifest or image tag after the last push.\ntype ImageAlreadyExistsException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *ImageAlreadyExistsException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *ImageAlreadyExistsException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *ImageAlreadyExistsException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"ImageAlreadyExistsException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *ImageAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified image digest doesn't match the digest that Amazon ECR calculated\n// for the image.\ntype ImageDigestDoesNotMatchException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *ImageDigestDoesNotMatchException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *ImageDigestDoesNotMatchException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *ImageDigestDoesNotMatchException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"ImageDigestDoesNotMatchException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *ImageDigestDoesNotMatchException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The image requested doesn't exist in the specified repository.\ntype ImageNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *ImageNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *ImageNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *ImageNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"ImageNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *ImageNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified image is tagged with a tag that already exists. The repository is\n// configured for tag immutability.\ntype ImageTagAlreadyExistsException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *ImageTagAlreadyExistsException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *ImageTagAlreadyExistsException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *ImageTagAlreadyExistsException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"ImageTagAlreadyExistsException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *ImageTagAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The layer digest calculation performed by Amazon ECR when the image layer\n// doesn't match the digest specified.\ntype InvalidLayerException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *InvalidLayerException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *InvalidLayerException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *InvalidLayerException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"InvalidLayerException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *InvalidLayerException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The layer part size isn't valid, or the first byte specified isn't consecutive\n// to the last byte of a previous layer part upload.\ntype InvalidLayerPartException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tRegistryId            *string\n\tRepositoryName        *string\n\tUploadId              *string\n\tLastValidByteReceived *int64\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *InvalidLayerPartException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *InvalidLayerPartException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *InvalidLayerPartException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"InvalidLayerPartException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *InvalidLayerPartException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified parameter is invalid. Review the available parameters for the API\n// request.\ntype InvalidParameterException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *InvalidParameterException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *InvalidParameterException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *InvalidParameterException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"InvalidParameterException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *InvalidParameterException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// An invalid parameter has been specified. Tag keys can have a maximum character\n// length of 128 characters, and tag values can have a maximum length of 256\n// characters.\ntype InvalidTagParameterException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *InvalidTagParameterException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *InvalidTagParameterException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *InvalidTagParameterException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"InvalidTagParameterException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *InvalidTagParameterException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The image layer already exists in the associated repository.\ntype LayerAlreadyExistsException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *LayerAlreadyExistsException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *LayerAlreadyExistsException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *LayerAlreadyExistsException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"LayerAlreadyExistsException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *LayerAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// Layer parts must be at least 5 MiB in size.\ntype LayerPartTooSmallException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *LayerPartTooSmallException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *LayerPartTooSmallException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *LayerPartTooSmallException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"LayerPartTooSmallException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *LayerPartTooSmallException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified layers can't be found, or the specified layer isn't valid for\n// this repository.\ntype LayersNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *LayersNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *LayersNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *LayersNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"LayersNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *LayersNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The operation didn't succeed because it would have exceeded a service limit for\n// your account. For more information, see [Amazon ECR Service Quotas]in the Amazon Elastic Container\n// Registry User Guide.\n//\n// [Amazon ECR Service Quotas]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/service-quotas.html\ntype LimitExceededException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *LimitExceededException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *LimitExceededException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *LimitExceededException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"LimitExceededException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *LimitExceededException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The manifest list is referencing an image that doesn't exist.\ntype ReferencedImagesNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *ReferencedImagesNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *ReferencedImagesNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *ReferencedImagesNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"ReferencedImagesNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *ReferencedImagesNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The registry doesn't exist.\ntype RegistryNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *RegistryNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *RegistryNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *RegistryNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"RegistryNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *RegistryNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified repository already exists in the specified registry.\ntype RepositoryAlreadyExistsException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *RepositoryAlreadyExistsException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *RepositoryAlreadyExistsException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *RepositoryAlreadyExistsException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"RepositoryAlreadyExistsException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *RepositoryAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The repository catalog data doesn't exist.\ntype RepositoryCatalogDataNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *RepositoryCatalogDataNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *RepositoryCatalogDataNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *RepositoryCatalogDataNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"RepositoryCatalogDataNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *RepositoryCatalogDataNotFoundException) ErrorFault() smithy.ErrorFault {\n\treturn smithy.FaultClient\n}\n\n// The specified repository contains images. To delete a repository that contains\n// images, you must force the deletion with the force parameter.\ntype RepositoryNotEmptyException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *RepositoryNotEmptyException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *RepositoryNotEmptyException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *RepositoryNotEmptyException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"RepositoryNotEmptyException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *RepositoryNotEmptyException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified repository can't be found. Check the spelling of the specified\n// repository and ensure that you're performing operations on the correct registry.\ntype RepositoryNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *RepositoryNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *RepositoryNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *RepositoryNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"RepositoryNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *RepositoryNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The specified repository and registry combination doesn't have an associated\n// repository policy.\ntype RepositoryPolicyNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *RepositoryPolicyNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *RepositoryPolicyNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *RepositoryPolicyNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"RepositoryPolicyNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *RepositoryPolicyNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// These errors are usually caused by a server-side issue.\ntype ServerException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *ServerException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *ServerException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *ServerException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"ServerException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *ServerException) ErrorFault() smithy.ErrorFault { return smithy.FaultServer }\n\n// The list of tags on the repository is over the limit. The maximum number of\n// tags that can be applied to a repository is 50.\ntype TooManyTagsException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *TooManyTagsException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *TooManyTagsException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *TooManyTagsException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"TooManyTagsException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *TooManyTagsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The action isn't supported in this Region.\ntype UnsupportedCommandException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *UnsupportedCommandException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *UnsupportedCommandException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *UnsupportedCommandException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"UnsupportedCommandException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *UnsupportedCommandException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n\n// The upload can't be found, or the specified upload ID isn't valid for this\n// repository.\ntype UploadNotFoundException struct {\n\tMessage *string\n\n\tErrorCodeOverride *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (e *UploadNotFoundException) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.ErrorCode(), e.ErrorMessage())\n}\nfunc (e *UploadNotFoundException) ErrorMessage() string {\n\tif e.Message == nil {\n\t\treturn \"\"\n\t}\n\treturn *e.Message\n}\nfunc (e *UploadNotFoundException) ErrorCode() string {\n\tif e == nil || e.ErrorCodeOverride == nil {\n\t\treturn \"UploadNotFoundException\"\n\t}\n\treturn *e.ErrorCodeOverride\n}\nfunc (e *UploadNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient }\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/types/types.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage types\n\nimport (\n\tsmithydocument \"github.com/aws/smithy-go/document\"\n\t\"time\"\n)\n\n// An authorization token data object that corresponds to a public registry.\ntype AuthorizationData struct {\n\n\t// A base64-encoded string that contains authorization data for a public Amazon\n\t// ECR registry. When the string is decoded, it's presented in the format\n\t// user:password for public registry authentication using docker login .\n\tAuthorizationToken *string\n\n\t// The Unix time in seconds and milliseconds when the authorization token expires.\n\t// Authorization tokens are valid for 12 hours.\n\tExpiresAt *time.Time\n\n\tnoSmithyDocumentSerde\n}\n\n// An object that represents an Amazon ECR image.\ntype Image struct {\n\n\t// An object that contains the image tag and image digest associated with an image.\n\tImageId *ImageIdentifier\n\n\t// The image manifest that's associated with the image.\n\tImageManifest *string\n\n\t// The manifest media type of the image.\n\tImageManifestMediaType *string\n\n\t// The Amazon Web Services account ID that's associated with the registry\n\t// containing the image.\n\tRegistryId *string\n\n\t// The name of the repository that's associated with the image.\n\tRepositoryName *string\n\n\tnoSmithyDocumentSerde\n}\n\n// An object that describes an image that's returned by a DescribeImages operation.\ntype ImageDetail struct {\n\n\t// The artifact media type of the image.\n\tArtifactMediaType *string\n\n\t// The sha256 digest of the image manifest.\n\tImageDigest *string\n\n\t// The media type of the image manifest.\n\tImageManifestMediaType *string\n\n\t// The date and time, expressed in standard JavaScript date format, that the\n\t// current image was pushed to the repository at.\n\tImagePushedAt *time.Time\n\n\t// The size, in bytes, of the image in the repository.\n\t//\n\t// If the image is a manifest list, this is the max size of all manifests in the\n\t// list.\n\t//\n\t// Beginning with Docker version 1.9, the Docker client compresses image layers\n\t// before pushing them to a V2 Docker registry. The output of the docker images\n\t// command shows the uncompressed image size, so it might return a larger image\n\t// size than the image sizes that are returned by DescribeImages.\n\tImageSizeInBytes *int64\n\n\t// The list of tags that's associated with this image.\n\tImageTags []string\n\n\t// The Amazon Web Services account ID that's associated with the public registry\n\t// where this image belongs.\n\tRegistryId *string\n\n\t// The name of the repository where this image belongs.\n\tRepositoryName *string\n\n\tnoSmithyDocumentSerde\n}\n\n// An object that represents an Amazon ECR image failure.\ntype ImageFailure struct {\n\n\t// The code that's associated with the failure.\n\tFailureCode ImageFailureCode\n\n\t// The reason for the failure.\n\tFailureReason *string\n\n\t// The image ID that's associated with the failure.\n\tImageId *ImageIdentifier\n\n\tnoSmithyDocumentSerde\n}\n\n// An object with identifying information for an Amazon ECR image.\ntype ImageIdentifier struct {\n\n\t// The sha256 digest of the image manifest.\n\tImageDigest *string\n\n\t// The tag that's used for the image.\n\tImageTag *string\n\n\tnoSmithyDocumentSerde\n}\n\n// An object that represents the image tag details for an image.\ntype ImageTagDetail struct {\n\n\t// The time stamp that indicates when the image tag was created.\n\tCreatedAt *time.Time\n\n\t// An object that describes the details of an image.\n\tImageDetail *ReferencedImageDetail\n\n\t// The tag that's associated with the image.\n\tImageTag *string\n\n\tnoSmithyDocumentSerde\n}\n\n// An object that represents an Amazon ECR image layer.\ntype Layer struct {\n\n\t// The availability status of the image layer.\n\tLayerAvailability LayerAvailability\n\n\t// The sha256 digest of the image layer.\n\tLayerDigest *string\n\n\t// The size, in bytes, of the image layer.\n\tLayerSize *int64\n\n\t// The media type of the layer, such as\n\t// application/vnd.docker.image.rootfs.diff.tar.gzip or\n\t// application/vnd.oci.image.layer.v1.tar+gzip .\n\tMediaType *string\n\n\tnoSmithyDocumentSerde\n}\n\n// An object that represents an Amazon ECR image layer failure.\ntype LayerFailure struct {\n\n\t// The failure code that's associated with the failure.\n\tFailureCode LayerFailureCode\n\n\t// The reason for the failure.\n\tFailureReason *string\n\n\t// The layer digest that's associated with the failure.\n\tLayerDigest *string\n\n\tnoSmithyDocumentSerde\n}\n\n// An object that describes the image tag details that are returned by a DescribeImageTags action.\ntype ReferencedImageDetail struct {\n\n\t// The artifact media type of the image.\n\tArtifactMediaType *string\n\n\t// The sha256 digest of the image manifest.\n\tImageDigest *string\n\n\t// The media type of the image manifest.\n\tImageManifestMediaType *string\n\n\t// The date and time, expressed in standard JavaScript date format, which the\n\t// current image tag was pushed to the repository at.\n\tImagePushedAt *time.Time\n\n\t// The size, in bytes, of the image in the repository.\n\t//\n\t// If the image is a manifest list, this is the max size of all manifests in the\n\t// list.\n\t//\n\t// Beginning with Docker version 1.9, the Docker client compresses image layers\n\t// before pushing them to a V2 Docker registry. The output of the docker images\n\t// command shows the uncompressed image size, so it might return a larger image\n\t// size than the image sizes that are returned by DescribeImages.\n\tImageSizeInBytes *int64\n\n\tnoSmithyDocumentSerde\n}\n\n// The details of a public registry.\ntype Registry struct {\n\n\t// An array of objects that represents the aliases for a public registry.\n\t//\n\t// This member is required.\n\tAliases []RegistryAlias\n\n\t// The Amazon Resource Name (ARN) of the public registry.\n\t//\n\t// This member is required.\n\tRegistryArn *string\n\n\t// The Amazon Web Services account ID that's associated with the registry. If you\n\t// do not specify a registry, the default public registry is assumed.\n\t//\n\t// This member is required.\n\tRegistryId *string\n\n\t// The URI of a public registry. The URI contains a universal prefix and the\n\t// registry alias.\n\t//\n\t// This member is required.\n\tRegistryUri *string\n\n\t// Indicates whether the account is a verified Amazon Web Services Marketplace\n\t// vendor. If an account is verified, each public repository receives a verified\n\t// account badge on the Amazon ECR Public Gallery.\n\t//\n\t// This member is required.\n\tVerified *bool\n\n\tnoSmithyDocumentSerde\n}\n\n// An object representing the aliases for a public registry. A public registry is\n// given an alias when it's created. However, a custom alias can be set using the\n// Amazon ECR console. For more information, see [Registries]in the Amazon Elastic Container\n// Registry User Guide.\n//\n// [Registries]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html\ntype RegistryAlias struct {\n\n\t// Indicates whether the registry alias is the default alias for the registry.\n\t// When the first public repository is created, your public registry is assigned a\n\t// default registry alias.\n\t//\n\t// This member is required.\n\tDefaultRegistryAlias bool\n\n\t// The name of the registry alias.\n\t//\n\t// This member is required.\n\tName *string\n\n\t// Indicates whether the registry alias is the primary alias for the registry. If\n\t// true, the alias is the primary registry alias and is displayed in both the\n\t// repository URL and the image URI used in the docker pull commands on the Amazon\n\t// ECR Public Gallery.\n\t//\n\t// A registry alias that isn't the primary registry alias can be used in the\n\t// repository URI in a docker pull command.\n\t//\n\t// This member is required.\n\tPrimaryRegistryAlias bool\n\n\t// The status of the registry alias.\n\t//\n\t// This member is required.\n\tStatus RegistryAliasStatus\n\n\tnoSmithyDocumentSerde\n}\n\n// The metadata for a public registry.\ntype RegistryCatalogData struct {\n\n\t// The display name for a public registry. This appears on the Amazon ECR Public\n\t// Gallery.\n\t//\n\t// Only accounts that have the verified account badge can have a registry display\n\t// name.\n\tDisplayName *string\n\n\tnoSmithyDocumentSerde\n}\n\n// An object representing a repository.\ntype Repository struct {\n\n\t// The date and time, in JavaScript date format, when the repository was created.\n\tCreatedAt *time.Time\n\n\t// The Amazon Web Services account ID that's associated with the public registry\n\t// that contains the repository.\n\tRegistryId *string\n\n\t// The Amazon Resource Name (ARN) that identifies the repository. The ARN contains\n\t// the arn:aws:ecr namespace, followed by the region of the repository, Amazon Web\n\t// Services account ID of the repository owner, repository namespace, and\n\t// repository name. For example, arn:aws:ecr:region:012345678910:repository/test .\n\tRepositoryArn *string\n\n\t// The name of the repository.\n\tRepositoryName *string\n\n\t// The URI for the repository. You can use this URI for container image push and\n\t// pull operations.\n\tRepositoryUri *string\n\n\tnoSmithyDocumentSerde\n}\n\n// The catalog data for a repository. This data is publicly visible in the Amazon\n// ECR Public Gallery.\ntype RepositoryCatalogData struct {\n\n\t// The longform description of the contents of the repository. This text appears\n\t// in the repository details on the Amazon ECR Public Gallery.\n\tAboutText *string\n\n\t// The architecture tags that are associated with the repository.\n\t//\n\t// Only supported operating system tags appear publicly in the Amazon ECR Public\n\t// Gallery. For more information, see RepositoryCatalogDataInput.\n\tArchitectures []string\n\n\t// The short description of the repository.\n\tDescription *string\n\n\t// The URL that contains the logo that's associated with the repository.\n\tLogoUrl *string\n\n\t// Indicates whether the repository is certified by Amazon Web Services\n\t// Marketplace.\n\tMarketplaceCertified *bool\n\n\t// The operating system tags that are associated with the repository.\n\t//\n\t// Only supported operating system tags appear publicly in the Amazon ECR Public\n\t// Gallery. For more information, see RepositoryCatalogDataInput.\n\tOperatingSystems []string\n\n\t// The longform usage details of the contents of the repository. The usage text\n\t// provides context for users of the repository.\n\tUsageText *string\n\n\tnoSmithyDocumentSerde\n}\n\n// An object that contains the catalog data for a repository. This data is\n// publicly visible in the Amazon ECR Public Gallery.\ntype RepositoryCatalogDataInput struct {\n\n\t// A detailed description of the contents of the repository. It's publicly visible\n\t// in the Amazon ECR Public Gallery. The text must be in markdown format.\n\tAboutText *string\n\n\t// The system architecture that the images in the repository are compatible with.\n\t// On the Amazon ECR Public Gallery, the following supported architectures appear\n\t// as badges on the repository and are used as search filters.\n\t//\n\t// If an unsupported tag is added to your repository catalog data, it's associated\n\t// with the repository and can be retrieved using the API but isn't discoverable in\n\t// the Amazon ECR Public Gallery.\n\t//\n\t//   - ARM\n\t//\n\t//   - ARM 64\n\t//\n\t//   - x86\n\t//\n\t//   - x86-64\n\tArchitectures []string\n\n\t// A short description of the contents of the repository. This text appears in\n\t// both the image details and also when searching for repositories on the Amazon\n\t// ECR Public Gallery.\n\tDescription *string\n\n\t// The base64-encoded repository logo payload.\n\t//\n\t// The repository logo is only publicly visible in the Amazon ECR Public Gallery\n\t// for verified accounts.\n\tLogoImageBlob []byte\n\n\t// The operating systems that the images in the repository are compatible with. On\n\t// the Amazon ECR Public Gallery, the following supported operating systems appear\n\t// as badges on the repository and are used as search filters.\n\t//\n\t// If an unsupported tag is added to your repository catalog data, it's associated\n\t// with the repository and can be retrieved using the API but isn't discoverable in\n\t// the Amazon ECR Public Gallery.\n\t//\n\t//   - Linux\n\t//\n\t//   - Windows\n\tOperatingSystems []string\n\n\t// Detailed information about how to use the contents of the repository. It's\n\t// publicly visible in the Amazon ECR Public Gallery. The usage text provides\n\t// context, support information, and additional usage details for users of the\n\t// repository. The text must be in markdown format.\n\tUsageText *string\n\n\tnoSmithyDocumentSerde\n}\n\n// The metadata that you apply to a resource to help you categorize and organize\n// them. Each tag consists of a key and an optional value. You define both. Tag\n// keys can have a maximum character length of 128 characters, and tag values can\n// have a maximum length of 256 characters.\ntype Tag struct {\n\n\t// One part of a key-value pair that make up a tag. A key is a general label that\n\t// acts like a category for more specific tag values.\n\tKey *string\n\n\t// The optional part of a key-value pair that make up a tag. A value acts as a\n\t// descriptor within a tag category (key).\n\tValue *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype noSmithyDocumentSerde = smithydocument.NoSerde\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/validators.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage ecrpublic\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tsmithy \"github.com/aws/smithy-go\"\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\ntype validateOpBatchCheckLayerAvailability struct {\n}\n\nfunc (*validateOpBatchCheckLayerAvailability) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpBatchCheckLayerAvailability) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*BatchCheckLayerAvailabilityInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpBatchCheckLayerAvailabilityInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpBatchDeleteImage struct {\n}\n\nfunc (*validateOpBatchDeleteImage) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpBatchDeleteImage) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*BatchDeleteImageInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpBatchDeleteImageInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpCompleteLayerUpload struct {\n}\n\nfunc (*validateOpCompleteLayerUpload) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpCompleteLayerUpload) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*CompleteLayerUploadInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpCompleteLayerUploadInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpCreateRepository struct {\n}\n\nfunc (*validateOpCreateRepository) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpCreateRepository) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*CreateRepositoryInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpCreateRepositoryInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpDeleteRepository struct {\n}\n\nfunc (*validateOpDeleteRepository) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpDeleteRepository) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*DeleteRepositoryInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpDeleteRepositoryInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpDeleteRepositoryPolicy struct {\n}\n\nfunc (*validateOpDeleteRepositoryPolicy) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpDeleteRepositoryPolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*DeleteRepositoryPolicyInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpDeleteRepositoryPolicyInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpDescribeImages struct {\n}\n\nfunc (*validateOpDescribeImages) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpDescribeImages) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*DescribeImagesInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpDescribeImagesInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpDescribeImageTags struct {\n}\n\nfunc (*validateOpDescribeImageTags) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpDescribeImageTags) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*DescribeImageTagsInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpDescribeImageTagsInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpGetRepositoryCatalogData struct {\n}\n\nfunc (*validateOpGetRepositoryCatalogData) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpGetRepositoryCatalogData) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*GetRepositoryCatalogDataInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpGetRepositoryCatalogDataInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpGetRepositoryPolicy struct {\n}\n\nfunc (*validateOpGetRepositoryPolicy) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpGetRepositoryPolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*GetRepositoryPolicyInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpGetRepositoryPolicyInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpInitiateLayerUpload struct {\n}\n\nfunc (*validateOpInitiateLayerUpload) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpInitiateLayerUpload) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*InitiateLayerUploadInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpInitiateLayerUploadInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpListTagsForResource struct {\n}\n\nfunc (*validateOpListTagsForResource) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpListTagsForResource) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*ListTagsForResourceInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpListTagsForResourceInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpPutImage struct {\n}\n\nfunc (*validateOpPutImage) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpPutImage) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*PutImageInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpPutImageInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpPutRepositoryCatalogData struct {\n}\n\nfunc (*validateOpPutRepositoryCatalogData) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpPutRepositoryCatalogData) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*PutRepositoryCatalogDataInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpPutRepositoryCatalogDataInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpSetRepositoryPolicy struct {\n}\n\nfunc (*validateOpSetRepositoryPolicy) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpSetRepositoryPolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*SetRepositoryPolicyInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpSetRepositoryPolicyInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpTagResource struct {\n}\n\nfunc (*validateOpTagResource) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpTagResource) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*TagResourceInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpTagResourceInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpUntagResource struct {\n}\n\nfunc (*validateOpUntagResource) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpUntagResource) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*UntagResourceInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpUntagResourceInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype validateOpUploadLayerPart struct {\n}\n\nfunc (*validateOpUploadLayerPart) ID() string {\n\treturn \"OperationInputValidation\"\n}\n\nfunc (m *validateOpUploadLayerPart) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*UploadLayerPartInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown input parameters type %T\", in.Parameters)\n\t}\n\tif err := validateOpUploadLayerPartInput(input); err != nil {\n\t\treturn out, metadata, err\n\t}\n\treturn next.HandleInitialize(ctx, in)\n}\n\nfunc addOpBatchCheckLayerAvailabilityValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpBatchCheckLayerAvailability{}, middleware.After)\n}\n\nfunc addOpBatchDeleteImageValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpBatchDeleteImage{}, middleware.After)\n}\n\nfunc addOpCompleteLayerUploadValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpCompleteLayerUpload{}, middleware.After)\n}\n\nfunc addOpCreateRepositoryValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpCreateRepository{}, middleware.After)\n}\n\nfunc addOpDeleteRepositoryValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpDeleteRepository{}, middleware.After)\n}\n\nfunc addOpDeleteRepositoryPolicyValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpDeleteRepositoryPolicy{}, middleware.After)\n}\n\nfunc addOpDescribeImagesValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpDescribeImages{}, middleware.After)\n}\n\nfunc addOpDescribeImageTagsValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpDescribeImageTags{}, middleware.After)\n}\n\nfunc addOpGetRepositoryCatalogDataValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpGetRepositoryCatalogData{}, middleware.After)\n}\n\nfunc addOpGetRepositoryPolicyValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpGetRepositoryPolicy{}, middleware.After)\n}\n\nfunc addOpInitiateLayerUploadValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpInitiateLayerUpload{}, middleware.After)\n}\n\nfunc addOpListTagsForResourceValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpListTagsForResource{}, middleware.After)\n}\n\nfunc addOpPutImageValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpPutImage{}, middleware.After)\n}\n\nfunc addOpPutRepositoryCatalogDataValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpPutRepositoryCatalogData{}, middleware.After)\n}\n\nfunc addOpSetRepositoryPolicyValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpSetRepositoryPolicy{}, middleware.After)\n}\n\nfunc addOpTagResourceValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpTagResource{}, middleware.After)\n}\n\nfunc addOpUntagResourceValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpUntagResource{}, middleware.After)\n}\n\nfunc addOpUploadLayerPartValidationMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&validateOpUploadLayerPart{}, middleware.After)\n}\n\nfunc validateOpBatchCheckLayerAvailabilityInput(v *BatchCheckLayerAvailabilityInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"BatchCheckLayerAvailabilityInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.LayerDigests == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"LayerDigests\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpBatchDeleteImageInput(v *BatchDeleteImageInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"BatchDeleteImageInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.ImageIds == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"ImageIds\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpCompleteLayerUploadInput(v *CompleteLayerUploadInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"CompleteLayerUploadInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.UploadId == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"UploadId\"))\n\t}\n\tif v.LayerDigests == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"LayerDigests\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpCreateRepositoryInput(v *CreateRepositoryInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"CreateRepositoryInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpDeleteRepositoryInput(v *DeleteRepositoryInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"DeleteRepositoryInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpDeleteRepositoryPolicyInput(v *DeleteRepositoryPolicyInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"DeleteRepositoryPolicyInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpDescribeImagesInput(v *DescribeImagesInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"DescribeImagesInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpDescribeImageTagsInput(v *DescribeImageTagsInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"DescribeImageTagsInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpGetRepositoryCatalogDataInput(v *GetRepositoryCatalogDataInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"GetRepositoryCatalogDataInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpGetRepositoryPolicyInput(v *GetRepositoryPolicyInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"GetRepositoryPolicyInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpInitiateLayerUploadInput(v *InitiateLayerUploadInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"InitiateLayerUploadInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpListTagsForResourceInput(v *ListTagsForResourceInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"ListTagsForResourceInput\"}\n\tif v.ResourceArn == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"ResourceArn\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpPutImageInput(v *PutImageInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"PutImageInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.ImageManifest == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"ImageManifest\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpPutRepositoryCatalogDataInput(v *PutRepositoryCatalogDataInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"PutRepositoryCatalogDataInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.CatalogData == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"CatalogData\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpSetRepositoryPolicyInput(v *SetRepositoryPolicyInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"SetRepositoryPolicyInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.PolicyText == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"PolicyText\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpTagResourceInput(v *TagResourceInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"TagResourceInput\"}\n\tif v.ResourceArn == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"ResourceArn\"))\n\t}\n\tif v.Tags == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"Tags\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpUntagResourceInput(v *UntagResourceInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"UntagResourceInput\"}\n\tif v.ResourceArn == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"ResourceArn\"))\n\t}\n\tif v.TagKeys == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"TagKeys\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc validateOpUploadLayerPartInput(v *UploadLayerPartInput) error {\n\tif v == nil {\n\t\treturn nil\n\t}\n\tinvalidParams := smithy.InvalidParamsError{Context: \"UploadLayerPartInput\"}\n\tif v.RepositoryName == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"RepositoryName\"))\n\t}\n\tif v.UploadId == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"UploadId\"))\n\t}\n\tif v.PartFirstByte == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"PartFirstByte\"))\n\t}\n\tif v.PartLastByte == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"PartLastByte\"))\n\t}\n\tif v.LayerPartBlob == nil {\n\t\tinvalidParams.Add(smithy.NewErrParamRequired(\"LayerPartBlob\"))\n\t}\n\tif invalidParams.Len() > 0 {\n\t\treturn invalidParams\n\t} else {\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md",
    "content": "# v1.12.3 (2025-02-18)\n\n* **Bug Fix**: Bump go version to 1.22\n\n# v1.12.2 (2025-01-24)\n\n* **Dependency Update**: Upgrade to smithy-go v1.22.2.\n\n# v1.12.1 (2024-11-18)\n\n* **Dependency Update**: Update to smithy-go v1.22.1.\n\n# v1.12.0 (2024-10-04)\n\n* **Feature**: Add support for HTTP client metrics.\n\n# v1.11.5 (2024-09-20)\n\n* No change notes available for this release.\n\n# v1.11.4 (2024-08-15)\n\n* **Dependency Update**: Bump minimum Go version to 1.21.\n\n# v1.11.3 (2024-06-28)\n\n* No change notes available for this release.\n\n# v1.11.2 (2024-03-29)\n\n* No change notes available for this release.\n\n# v1.11.1 (2024-02-21)\n\n* No change notes available for this release.\n\n# v1.11.0 (2024-02-13)\n\n* **Feature**: Bump minimum Go version to 1.20 per our language support policy.\n\n# v1.10.4 (2023-12-07)\n\n* No change notes available for this release.\n\n# v1.10.3 (2023-11-30)\n\n* No change notes available for this release.\n\n# v1.10.2 (2023-11-29)\n\n* No change notes available for this release.\n\n# v1.10.1 (2023-11-15)\n\n* No change notes available for this release.\n\n# v1.10.0 (2023-10-31)\n\n* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).\n\n# v1.9.15 (2023-10-06)\n\n* No change notes available for this release.\n\n# v1.9.14 (2023-08-18)\n\n* No change notes available for this release.\n\n# v1.9.13 (2023-08-07)\n\n* No change notes available for this release.\n\n# v1.9.12 (2023-07-31)\n\n* No change notes available for this release.\n\n# v1.9.11 (2022-12-02)\n\n* No change notes available for this release.\n\n# v1.9.10 (2022-10-24)\n\n* No change notes available for this release.\n\n# v1.9.9 (2022-09-14)\n\n* No change notes available for this release.\n\n# v1.9.8 (2022-09-02)\n\n* No change notes available for this release.\n\n# v1.9.7 (2022-08-31)\n\n* No change notes available for this release.\n\n# v1.9.6 (2022-08-29)\n\n* No change notes available for this release.\n\n# v1.9.5 (2022-08-11)\n\n* No change notes available for this release.\n\n# v1.9.4 (2022-08-09)\n\n* No change notes available for this release.\n\n# v1.9.3 (2022-06-29)\n\n* No change notes available for this release.\n\n# v1.9.2 (2022-06-07)\n\n* No change notes available for this release.\n\n# v1.9.1 (2022-03-24)\n\n* No change notes available for this release.\n\n# v1.9.0 (2022-03-08)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n\n# v1.8.0 (2022-02-24)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n\n# v1.7.0 (2022-01-14)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n\n# v1.6.0 (2022-01-07)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n\n# v1.5.0 (2021-11-06)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n\n# v1.4.0 (2021-10-21)\n\n* **Feature**: Updated  to latest version\n\n# v1.3.0 (2021-08-27)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n\n# v1.2.2 (2021-08-04)\n\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version.\n\n# v1.2.1 (2021-07-15)\n\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version\n\n# v1.2.0 (2021-06-25)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n\n# v1.1.0 (2021-05-14)\n\n* **Feature**: Constant has been added to modules to enable runtime version inspection for reporting.\n\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/accept_encoding_gzip.go",
    "content": "package acceptencoding\n\nimport (\n\t\"compress/gzip\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/aws/smithy-go\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nconst acceptEncodingHeaderKey = \"Accept-Encoding\"\nconst contentEncodingHeaderKey = \"Content-Encoding\"\n\n// AddAcceptEncodingGzipOptions provides the options for the\n// AddAcceptEncodingGzip middleware setup.\ntype AddAcceptEncodingGzipOptions struct {\n\tEnable bool\n}\n\n// AddAcceptEncodingGzip explicitly adds handling for accept-encoding GZIP\n// middleware to the operation stack. This allows checksums to be correctly\n// computed without disabling GZIP support.\nfunc AddAcceptEncodingGzip(stack *middleware.Stack, options AddAcceptEncodingGzipOptions) error {\n\tif options.Enable {\n\t\tif err := stack.Finalize.Add(&EnableGzip{}, middleware.Before); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := stack.Deserialize.Insert(&DecompressGzip{}, \"OperationDeserializer\", middleware.After); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t}\n\n\treturn stack.Finalize.Add(&DisableGzip{}, middleware.Before)\n}\n\n// DisableGzip provides the middleware that will\n// disable the underlying http client automatically enabling for gzip\n// decompress content-encoding support.\ntype DisableGzip struct{}\n\n// ID returns the id for the middleware.\nfunc (*DisableGzip) ID() string {\n\treturn \"DisableAcceptEncodingGzip\"\n}\n\n// HandleFinalize implements the FinalizeMiddleware interface.\nfunc (*DisableGzip) HandleFinalize(\n\tctx context.Context, input middleware.FinalizeInput, next middleware.FinalizeHandler,\n) (\n\toutput middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\treq, ok := input.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn output, metadata, &smithy.SerializationError{\n\t\t\tErr: fmt.Errorf(\"unknown request type %T\", input.Request),\n\t\t}\n\t}\n\n\t// Explicitly enable gzip support, this will prevent the http client from\n\t// auto extracting the zipped content.\n\treq.Header.Set(acceptEncodingHeaderKey, \"identity\")\n\n\treturn next.HandleFinalize(ctx, input)\n}\n\n// EnableGzip provides a middleware to enable support for\n// gzip responses, with manual decompression. This prevents the underlying HTTP\n// client from performing the gzip decompression automatically.\ntype EnableGzip struct{}\n\n// ID returns the id for the middleware.\nfunc (*EnableGzip) ID() string {\n\treturn \"AcceptEncodingGzip\"\n}\n\n// HandleFinalize implements the FinalizeMiddleware interface.\nfunc (*EnableGzip) HandleFinalize(\n\tctx context.Context, input middleware.FinalizeInput, next middleware.FinalizeHandler,\n) (\n\toutput middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\treq, ok := input.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn output, metadata, &smithy.SerializationError{\n\t\t\tErr: fmt.Errorf(\"unknown request type %T\", input.Request),\n\t\t}\n\t}\n\n\t// Explicitly enable gzip support, this will prevent the http client from\n\t// auto extracting the zipped content.\n\treq.Header.Set(acceptEncodingHeaderKey, \"gzip\")\n\n\treturn next.HandleFinalize(ctx, input)\n}\n\n// DecompressGzip provides the middleware for decompressing a gzip\n// response from the service.\ntype DecompressGzip struct{}\n\n// ID returns the id for the middleware.\nfunc (*DecompressGzip) ID() string {\n\treturn \"DecompressGzip\"\n}\n\n// HandleDeserialize implements the DeserializeMiddlware interface.\nfunc (*DecompressGzip) HandleDeserialize(\n\tctx context.Context, input middleware.DeserializeInput, next middleware.DeserializeHandler,\n) (\n\toutput middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\toutput, metadata, err = next.HandleDeserialize(ctx, input)\n\tif err != nil {\n\t\treturn output, metadata, err\n\t}\n\n\tresp, ok := output.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn output, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"unknown response type %T\", output.RawResponse),\n\t\t}\n\t}\n\tif v := resp.Header.Get(contentEncodingHeaderKey); v != \"gzip\" {\n\t\treturn output, metadata, err\n\t}\n\n\t// Clear content length since it will no longer be valid once the response\n\t// body is decompressed.\n\tresp.Header.Del(\"Content-Length\")\n\tresp.ContentLength = -1\n\n\tresp.Body = wrapGzipReader(resp.Body)\n\n\treturn output, metadata, err\n}\n\ntype gzipReader struct {\n\treader io.ReadCloser\n\tgzip   *gzip.Reader\n}\n\nfunc wrapGzipReader(reader io.ReadCloser) *gzipReader {\n\treturn &gzipReader{\n\t\treader: reader,\n\t}\n}\n\n// Read wraps the gzip reader around the underlying io.Reader to extract the\n// response bytes on the fly.\nfunc (g *gzipReader) Read(b []byte) (n int, err error) {\n\tif g.gzip == nil {\n\t\tg.gzip, err = gzip.NewReader(g.reader)\n\t\tif err != nil {\n\t\t\tg.gzip = nil // ensure uninitialized gzip value isn't used in close.\n\t\t\treturn 0, fmt.Errorf(\"failed to decompress gzip response, %w\", err)\n\t\t}\n\t}\n\n\treturn g.gzip.Read(b)\n}\n\nfunc (g *gzipReader) Close() error {\n\tif g.gzip == nil {\n\t\treturn nil\n\t}\n\n\tif err := g.gzip.Close(); err != nil {\n\t\tg.reader.Close()\n\t\treturn fmt.Errorf(\"failed to decompress gzip response, %w\", err)\n\t}\n\n\treturn g.reader.Close()\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/doc.go",
    "content": "/*\nPackage acceptencoding provides customizations associated with Accept Encoding Header.\n\n# Accept encoding gzip\n\nThe Go HTTP client automatically supports accept-encoding and content-encoding\ngzip by default. This default behavior is not desired by the SDK, and prevents\nvalidating the response body's checksum. To prevent this the SDK must manually\ncontrol usage of content-encoding gzip.\n\nTo control content-encoding, the SDK must always set the `Accept-Encoding`\nheader to a value. This prevents the HTTP client from using gzip automatically.\nWhen gzip is enabled on the API client, the SDK's customization will control\ndecompressing the gzip data in order to not break the checksum validation. When\ngzip is disabled, the API client will disable gzip, preventing the HTTP\nclient's default behavior.\n\nAn `EnableAcceptEncodingGzip` option may or may not be present depending on the client using\nthe below middleware. The option if present can be used to enable auto decompressing\ngzip by the SDK.\n*/\npackage acceptencoding\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go",
    "content": "// Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT.\n\npackage acceptencoding\n\n// goModuleVersion is the tagged release for this module\nconst goModuleVersion = \"1.12.3\"\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/CHANGELOG.md",
    "content": "# v1.7.1 (2025-04-28)\n\n* **Bug Fix**: Don't emit warnings about lack of checksum validation for non-200 responses.\n\n# v1.7.0 (2025-03-11)\n\n* **Feature**: Add extra check during output checksum validation so the validation skip warning would not be logged if object is not fetched from s3\n\n# v1.6.2 (2025-02-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.6.1 (2025-02-18)\n\n* **Bug Fix**: Bump go version to 1.22\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.6.0 (2025-02-10)\n\n* **Feature**: Support CRC64NVME flex checksums.\n\n# v1.5.6 (2025-02-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.5 (2025-01-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.4 (2025-01-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.3 (2025-01-24)\n\n* **Bug Fix**: Enable request checksum validation mode by default\n* **Dependency Update**: Updated to the latest SDK module versions\n* **Dependency Update**: Upgrade to smithy-go v1.22.2.\n\n# v1.5.2 (2025-01-17)\n\n* **Bug Fix**: Fix bug where credentials weren't refreshed during retry loop.\n\n# v1.5.1 (2025-01-16)\n\n* **Bug Fix**: Fix nil dereference panic for operations that require checksums, but do not have an input setting for which algorithm to use.\n\n# v1.5.0 (2025-01-15)\n\n* **Feature**: S3 client behavior is updated to always calculate a checksum by default for operations that support it (such as PutObject or UploadPart), or require it (such as DeleteObjects). The checksum algorithm used by default now becomes CRC32. Checksum behavior can be configured using `when_supported` and `when_required` options - in code using RequestChecksumCalculation, in shared config using request_checksum_calculation, or as env variable using AWS_REQUEST_CHECKSUM_CALCULATION. The S3 client attempts to validate response checksums for all S3 API operations that support checksums. However, if the SDK has not implemented the specified checksum algorithm then this validation is skipped. Checksum validation behavior can be configured using `when_supported` and `when_required` options - in code using ResponseChecksumValidation, in shared config using response_checksum_validation, or as env variable using AWS_RESPONSE_CHECKSUM_VALIDATION.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.8 (2025-01-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.7 (2024-12-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.6 (2024-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.5 (2024-11-18)\n\n* **Dependency Update**: Update to smithy-go v1.22.1.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.4 (2024-11-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.3 (2024-10-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.2 (2024-10-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.1 (2024-10-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.0 (2024-10-04)\n\n* **Feature**: Add support for HTTP client metrics.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.20 (2024-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.19 (2024-09-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.18 (2024-08-15)\n\n* **Dependency Update**: Bump minimum Go version to 1.21.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.17 (2024-07-10.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.16 (2024-07-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.15 (2024-06-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.14 (2024-06-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.13 (2024-06-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.12 (2024-06-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.11 (2024-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.10 (2024-06-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.9 (2024-05-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.8 (2024-05-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.7 (2024-03-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.6 (2024-03-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.5 (2024-03-07)\n\n* **Bug Fix**: Remove dependency on go-cmp.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.4 (2024-03-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.3 (2024-03-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.2 (2024-02-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.1 (2024-02-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.0 (2024-02-13)\n\n* **Feature**: Bump minimum Go version to 1.20 per our language support policy.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.10 (2024-01-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.9 (2023-12-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.8 (2023-12-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.7 (2023-11-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.6 (2023-11-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.5 (2023-11-28.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.4 (2023-11-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.3 (2023-11-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.2 (2023-11-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.1 (2023-11-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.0 (2023-10-31)\n\n* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.38 (2023-10-12)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.37 (2023-10-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.36 (2023-08-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.35 (2023-08-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.34 (2023-08-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.33 (2023-08-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.32 (2023-07-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.31 (2023-07-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.30 (2023-07-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.29 (2023-06-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.28 (2023-04-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.27 (2023-04-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.26 (2023-03-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.25 (2023-03-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.24 (2023-02-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.23 (2023-02-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.22 (2022-12-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.21 (2022-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.20 (2022-10-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.19 (2022-10-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.18 (2022-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.17 (2022-09-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.16 (2022-09-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.15 (2022-08-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.14 (2022-08-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.13 (2022-08-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.12 (2022-08-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.11 (2022-08-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.10 (2022-08-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.9 (2022-07-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.8 (2022-06-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.7 (2022-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.6 (2022-05-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.5 (2022-04-27)\n\n* **Bug Fix**: Fixes a bug that could cause the SigV4 payload hash to be incorrectly encoded, leading to signing errors.\n\n# v1.1.4 (2022-04-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.3 (2022-03-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.2 (2022-03-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.1 (2022-03-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.0 (2022-03-08)\n\n* **Feature**:  Updates the SDK's checksum validation logic to require opt-in to output response payload validation. The SDK was always preforming output response payload checksum validation, not respecting the output validation model option. Fixes [#1606](https://github.com/aws/aws-sdk-go-v2/issues/1606)\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.0.0 (2022-02-24)\n\n* **Release**: New module for computing checksums\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/algorithms.go",
    "content": "package checksum\n\nimport (\n\t\"crypto/md5\"\n\t\"crypto/sha1\"\n\t\"crypto/sha256\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"hash\"\n\t\"hash/crc32\"\n\t\"hash/crc64\"\n\t\"io\"\n\t\"strings\"\n\t\"sync\"\n)\n\n// Algorithm represents the checksum algorithms supported\ntype Algorithm string\n\n// Enumeration values for supported checksum Algorithms.\nconst (\n\t// AlgorithmCRC32C represents CRC32C hash algorithm\n\tAlgorithmCRC32C Algorithm = \"CRC32C\"\n\n\t// AlgorithmCRC32 represents CRC32 hash algorithm\n\tAlgorithmCRC32 Algorithm = \"CRC32\"\n\n\t// AlgorithmSHA1 represents SHA1 hash algorithm\n\tAlgorithmSHA1 Algorithm = \"SHA1\"\n\n\t// AlgorithmSHA256 represents SHA256 hash algorithm\n\tAlgorithmSHA256 Algorithm = \"SHA256\"\n\n\t// AlgorithmCRC64NVME represents CRC64NVME hash algorithm\n\tAlgorithmCRC64NVME Algorithm = \"CRC64NVME\"\n)\n\n// inverted NVME polynomial as required by crc64.MakeTable\nconst crc64NVME = 0x9a6c_9329_ac4b_c9b5\n\nvar supportedAlgorithms = []Algorithm{\n\tAlgorithmCRC32C,\n\tAlgorithmCRC32,\n\tAlgorithmSHA1,\n\tAlgorithmSHA256,\n\tAlgorithmCRC64NVME,\n}\n\nfunc (a Algorithm) String() string { return string(a) }\n\n// ParseAlgorithm attempts to parse the provided value into a checksum\n// algorithm, matching without case. Returns the algorithm matched, or an error\n// if the algorithm wasn't matched.\nfunc ParseAlgorithm(v string) (Algorithm, error) {\n\tfor _, a := range supportedAlgorithms {\n\t\tif strings.EqualFold(string(a), v) {\n\t\t\treturn a, nil\n\t\t}\n\t}\n\treturn \"\", fmt.Errorf(\"unknown checksum algorithm, %v\", v)\n}\n\n// FilterSupportedAlgorithms filters the set of algorithms, returning a slice\n// of algorithms that are supported.\nfunc FilterSupportedAlgorithms(vs []string) []Algorithm {\n\tfound := map[Algorithm]struct{}{}\n\n\tsupported := make([]Algorithm, 0, len(supportedAlgorithms))\n\tfor _, v := range vs {\n\t\tfor _, a := range supportedAlgorithms {\n\t\t\t// Only consider algorithms that are supported\n\t\t\tif !strings.EqualFold(v, string(a)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Ignore duplicate algorithms in list.\n\t\t\tif _, ok := found[a]; ok {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tsupported = append(supported, a)\n\t\t\tfound[a] = struct{}{}\n\t\t}\n\t}\n\treturn supported\n}\n\n// NewAlgorithmHash returns a hash.Hash for the checksum algorithm. Error is\n// returned if the algorithm is unknown.\nfunc NewAlgorithmHash(v Algorithm) (hash.Hash, error) {\n\tswitch v {\n\tcase AlgorithmSHA1:\n\t\treturn sha1.New(), nil\n\tcase AlgorithmSHA256:\n\t\treturn sha256.New(), nil\n\tcase AlgorithmCRC32:\n\t\treturn crc32.NewIEEE(), nil\n\tcase AlgorithmCRC32C:\n\t\treturn crc32.New(crc32.MakeTable(crc32.Castagnoli)), nil\n\tcase AlgorithmCRC64NVME:\n\t\treturn crc64.New(crc64.MakeTable(crc64NVME)), nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unknown checksum algorithm, %v\", v)\n\t}\n}\n\n// AlgorithmChecksumLength returns the length of the algorithm's checksum in\n// bytes. If the algorithm is not known, an error is returned.\nfunc AlgorithmChecksumLength(v Algorithm) (int, error) {\n\tswitch v {\n\tcase AlgorithmSHA1:\n\t\treturn sha1.Size, nil\n\tcase AlgorithmSHA256:\n\t\treturn sha256.Size, nil\n\tcase AlgorithmCRC32:\n\t\treturn crc32.Size, nil\n\tcase AlgorithmCRC32C:\n\t\treturn crc32.Size, nil\n\tcase AlgorithmCRC64NVME:\n\t\treturn crc64.Size, nil\n\tdefault:\n\t\treturn 0, fmt.Errorf(\"unknown checksum algorithm, %v\", v)\n\t}\n}\n\nconst awsChecksumHeaderPrefix = \"x-amz-checksum-\"\n\n// AlgorithmHTTPHeader returns the HTTP header for the algorithm's hash.\nfunc AlgorithmHTTPHeader(v Algorithm) string {\n\treturn awsChecksumHeaderPrefix + strings.ToLower(string(v))\n}\n\n// base64EncodeHashSum computes base64 encoded checksum of a given running\n// hash. The running hash must already have content written to it. Returns the\n// byte slice of checksum and an error\nfunc base64EncodeHashSum(h hash.Hash) []byte {\n\tsum := h.Sum(nil)\n\tsum64 := make([]byte, base64.StdEncoding.EncodedLen(len(sum)))\n\tbase64.StdEncoding.Encode(sum64, sum)\n\treturn sum64\n}\n\n// hexEncodeHashSum computes hex encoded checksum of a given running hash. The\n// running hash must already have content written to it. Returns the byte slice\n// of checksum and an error\nfunc hexEncodeHashSum(h hash.Hash) []byte {\n\tsum := h.Sum(nil)\n\tsumHex := make([]byte, hex.EncodedLen(len(sum)))\n\thex.Encode(sumHex, sum)\n\treturn sumHex\n}\n\n// computeMD5Checksum computes base64 MD5 checksum of an io.Reader's contents.\n// Returns the byte slice of MD5 checksum and an error.\nfunc computeMD5Checksum(r io.Reader) ([]byte, error) {\n\th := md5.New()\n\n\t// Copy errors may be assumed to be from the body.\n\tif _, err := io.Copy(h, r); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed compute MD5 hash of reader, %w\", err)\n\t}\n\n\t// Encode the MD5 checksum in base64.\n\treturn base64EncodeHashSum(h), nil\n}\n\n// computeChecksumReader provides a reader wrapping an underlying io.Reader to\n// compute the checksum of the stream's bytes.\ntype computeChecksumReader struct {\n\tstream            io.Reader\n\talgorithm         Algorithm\n\thasher            hash.Hash\n\tbase64ChecksumLen int\n\n\tmux            sync.RWMutex\n\tlockedChecksum string\n\tlockedErr      error\n}\n\n// newComputeChecksumReader returns a computeChecksumReader for the stream and\n// algorithm specified. Returns error if unable to create the reader, or\n// algorithm is unknown.\nfunc newComputeChecksumReader(stream io.Reader, algorithm Algorithm) (*computeChecksumReader, error) {\n\thasher, err := NewAlgorithmHash(algorithm)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tchecksumLength, err := AlgorithmChecksumLength(algorithm)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &computeChecksumReader{\n\t\tstream:            io.TeeReader(stream, hasher),\n\t\talgorithm:         algorithm,\n\t\thasher:            hasher,\n\t\tbase64ChecksumLen: base64.StdEncoding.EncodedLen(checksumLength),\n\t}, nil\n}\n\n// Read wraps the underlying reader. When the underlying reader returns EOF,\n// the checksum of the reader will be computed, and can be retrieved with\n// ChecksumBase64String.\nfunc (r *computeChecksumReader) Read(p []byte) (int, error) {\n\tn, err := r.stream.Read(p)\n\tif err == nil {\n\t\treturn n, nil\n\t} else if err != io.EOF {\n\t\tr.mux.Lock()\n\t\tdefer r.mux.Unlock()\n\n\t\tr.lockedErr = err\n\t\treturn n, err\n\t}\n\n\tb := base64EncodeHashSum(r.hasher)\n\n\tr.mux.Lock()\n\tdefer r.mux.Unlock()\n\n\tr.lockedChecksum = string(b)\n\n\treturn n, err\n}\n\nfunc (r *computeChecksumReader) Algorithm() Algorithm {\n\treturn r.algorithm\n}\n\n// Base64ChecksumLength returns the base64 encoded length of the checksum for\n// algorithm.\nfunc (r *computeChecksumReader) Base64ChecksumLength() int {\n\treturn r.base64ChecksumLen\n}\n\n// Base64Checksum returns the base64 checksum for the algorithm, or error if\n// the underlying reader returned a non-EOF error.\n//\n// Safe to be called concurrently, but will return an error until after the\n// underlying reader is returns EOF.\nfunc (r *computeChecksumReader) Base64Checksum() (string, error) {\n\tr.mux.RLock()\n\tdefer r.mux.RUnlock()\n\n\tif r.lockedErr != nil {\n\t\treturn \"\", r.lockedErr\n\t}\n\n\tif r.lockedChecksum == \"\" {\n\t\treturn \"\", fmt.Errorf(\n\t\t\t\"checksum not available yet, called before reader returns EOF\",\n\t\t)\n\t}\n\n\treturn r.lockedChecksum, nil\n}\n\n// validateChecksumReader implements io.ReadCloser interface. The wrapper\n// performs checksum validation when the underlying reader has been fully read.\ntype validateChecksumReader struct {\n\toriginalBody   io.ReadCloser\n\tbody           io.Reader\n\thasher         hash.Hash\n\talgorithm      Algorithm\n\texpectChecksum string\n}\n\n// newValidateChecksumReader returns a configured io.ReadCloser that performs\n// checksum validation when the underlying reader has been fully read.\nfunc newValidateChecksumReader(\n\tbody io.ReadCloser,\n\talgorithm Algorithm,\n\texpectChecksum string,\n) (*validateChecksumReader, error) {\n\thasher, err := NewAlgorithmHash(algorithm)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &validateChecksumReader{\n\t\toriginalBody:   body,\n\t\tbody:           io.TeeReader(body, hasher),\n\t\thasher:         hasher,\n\t\talgorithm:      algorithm,\n\t\texpectChecksum: expectChecksum,\n\t}, nil\n}\n\n// Read attempts to read from the underlying stream while also updating the\n// running hash. If the underlying stream returns with an EOF error, the\n// checksum of the stream will be collected, and compared against the expected\n// checksum. If the checksums do not match, an error will be returned.\n//\n// If a non-EOF error occurs when reading the underlying stream, that error\n// will be returned and the checksum for the stream will be discarded.\nfunc (c *validateChecksumReader) Read(p []byte) (n int, err error) {\n\tn, err = c.body.Read(p)\n\tif err == io.EOF {\n\t\tif checksumErr := c.validateChecksum(); checksumErr != nil {\n\t\t\treturn n, checksumErr\n\t\t}\n\t}\n\n\treturn n, err\n}\n\n// Close closes the underlying reader, returning any error that occurred in the\n// underlying reader.\nfunc (c *validateChecksumReader) Close() (err error) {\n\treturn c.originalBody.Close()\n}\n\nfunc (c *validateChecksumReader) validateChecksum() error {\n\t// Compute base64 encoded checksum hash of the payload's read bytes.\n\tv := base64EncodeHashSum(c.hasher)\n\tif e, a := c.expectChecksum, string(v); !strings.EqualFold(e, a) {\n\t\treturn validationError{\n\t\t\tAlgorithm: c.algorithm, Expect: e, Actual: a,\n\t\t}\n\t}\n\n\treturn nil\n}\n\ntype validationError struct {\n\tAlgorithm Algorithm\n\tExpect    string\n\tActual    string\n}\n\nfunc (v validationError) Error() string {\n\treturn fmt.Sprintf(\"checksum did not match: algorithm %v, expect %v, actual %v\",\n\t\tv.Algorithm, v.Expect, v.Actual)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/aws_chunked_encoding.go",
    "content": "package checksum\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"strconv\"\n\t\"strings\"\n)\n\nconst (\n\tcrlf = \"\\r\\n\"\n\n\t// https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html\n\tdefaultChunkLength = 1024 * 64\n\n\tawsTrailerHeaderName           = \"x-amz-trailer\"\n\tdecodedContentLengthHeaderName = \"x-amz-decoded-content-length\"\n\n\tcontentEncodingHeaderName            = \"content-encoding\"\n\tawsChunkedContentEncodingHeaderValue = \"aws-chunked\"\n\n\ttrailerKeyValueSeparator = \":\"\n)\n\nvar (\n\tcrlfBytes       = []byte(crlf)\n\tfinalChunkBytes = []byte(\"0\" + crlf)\n)\n\ntype awsChunkedEncodingOptions struct {\n\t// The total size of the stream. For unsigned encoding this implies that\n\t// there will only be a single chunk containing the underlying payload,\n\t// unless ChunkLength is also specified.\n\tStreamLength int64\n\n\t// Set of trailer key:value pairs that will be appended to the end of the\n\t// payload after the end chunk has been written.\n\tTrailers map[string]awsChunkedTrailerValue\n\n\t// The maximum size of each chunk to be sent. Default value of -1, signals\n\t// that optimal chunk length will be used automatically. ChunkSize must be\n\t// at least 8KB.\n\t//\n\t// If ChunkLength and StreamLength are both specified, the stream will be\n\t// broken up into ChunkLength chunks. The encoded length of the aws-chunked\n\t// encoding can still be determined as long as all trailers, if any, have a\n\t// fixed length.\n\tChunkLength int\n}\n\ntype awsChunkedTrailerValue struct {\n\t// Function to retrieve the value of the trailer. Will only be called after\n\t// the underlying stream returns EOF error.\n\tGet func() (string, error)\n\n\t// If the length of the value can be pre-determined, and is constant\n\t// specify the length. A value of -1 means the length is unknown, or\n\t// cannot be pre-determined.\n\tLength int\n}\n\n// awsChunkedEncoding provides a reader that wraps the payload such that\n// payload is read as a single aws-chunk payload. This reader can only be used\n// if the content length of payload is known. Content-Length is used as size of\n// the single payload chunk. The final chunk and trailing checksum is appended\n// at the end.\n//\n// https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html#sigv4-chunked-body-definition\n//\n// Here is the aws-chunked payload stream as read from the awsChunkedEncoding\n// if original request stream is \"Hello world\", and checksum hash used is SHA256\n//\n//\t<b>\\r\\n\n//\tHello world\\r\\n\n//\t0\\r\\n\n//\tx-amz-checksum-sha256:ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw=\\r\\n\n//\t\\r\\n\ntype awsChunkedEncoding struct {\n\toptions awsChunkedEncodingOptions\n\n\tencodedStream        io.Reader\n\ttrailerEncodedLength int\n}\n\n// newUnsignedAWSChunkedEncoding returns a new awsChunkedEncoding configured\n// for unsigned aws-chunked content encoding. Any additional trailers that need\n// to be appended after the end chunk must be included as via Trailer\n// callbacks.\nfunc newUnsignedAWSChunkedEncoding(\n\tstream io.Reader,\n\toptFns ...func(*awsChunkedEncodingOptions),\n) *awsChunkedEncoding {\n\toptions := awsChunkedEncodingOptions{\n\t\tTrailers:     map[string]awsChunkedTrailerValue{},\n\t\tStreamLength: -1,\n\t\tChunkLength:  -1,\n\t}\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tvar chunkReader io.Reader\n\tif options.ChunkLength != -1 || options.StreamLength == -1 {\n\t\tif options.ChunkLength == -1 {\n\t\t\toptions.ChunkLength = defaultChunkLength\n\t\t}\n\t\tchunkReader = newBufferedAWSChunkReader(stream, options.ChunkLength)\n\t} else {\n\t\tchunkReader = newUnsignedChunkReader(stream, options.StreamLength)\n\t}\n\n\ttrailerReader := newAWSChunkedTrailerReader(options.Trailers)\n\n\treturn &awsChunkedEncoding{\n\t\toptions: options,\n\t\tencodedStream: io.MultiReader(chunkReader,\n\t\t\ttrailerReader,\n\t\t\tbytes.NewBuffer(crlfBytes),\n\t\t),\n\t\ttrailerEncodedLength: trailerReader.EncodedLength(),\n\t}\n}\n\n// EncodedLength returns the final length of the aws-chunked content encoded\n// stream if it can be determined without reading the underlying stream or lazy\n// header values, otherwise -1 is returned.\nfunc (e *awsChunkedEncoding) EncodedLength() int64 {\n\tvar length int64\n\tif e.options.StreamLength == -1 || e.trailerEncodedLength == -1 {\n\t\treturn -1\n\t}\n\n\tif e.options.StreamLength != 0 {\n\t\t// If the stream length is known, and there is no chunk length specified,\n\t\t// only a single chunk will be used. Otherwise the stream length needs to\n\t\t// include the multiple chunk padding content.\n\t\tif e.options.ChunkLength == -1 {\n\t\t\tlength += getUnsignedChunkBytesLength(e.options.StreamLength)\n\n\t\t} else {\n\t\t\t// Compute chunk header and payload length\n\t\t\tnumChunks := e.options.StreamLength / int64(e.options.ChunkLength)\n\t\t\tlength += numChunks * getUnsignedChunkBytesLength(int64(e.options.ChunkLength))\n\t\t\tif remainder := e.options.StreamLength % int64(e.options.ChunkLength); remainder != 0 {\n\t\t\t\tlength += getUnsignedChunkBytesLength(remainder)\n\t\t\t}\n\t\t}\n\t}\n\n\t// End chunk\n\tlength += int64(len(finalChunkBytes))\n\n\t// Trailers\n\tlength += int64(e.trailerEncodedLength)\n\n\t// Encoding terminator\n\tlength += int64(len(crlf))\n\n\treturn length\n}\n\nfunc getUnsignedChunkBytesLength(payloadLength int64) int64 {\n\tpayloadLengthStr := strconv.FormatInt(payloadLength, 16)\n\treturn int64(len(payloadLengthStr)) + int64(len(crlf)) + payloadLength + int64(len(crlf))\n}\n\n// HTTPHeaders returns the set of headers that must be included the request for\n// aws-chunked to work. This includes the content-encoding: aws-chunked header.\n//\n// If there are multiple layered content encoding, the aws-chunked encoding\n// must be appended to the previous layers the stream's encoding. The best way\n// to do this is to append all header values returned to the HTTP request's set\n// of headers.\nfunc (e *awsChunkedEncoding) HTTPHeaders() map[string][]string {\n\theaders := map[string][]string{\n\t\tcontentEncodingHeaderName: {\n\t\t\tawsChunkedContentEncodingHeaderValue,\n\t\t},\n\t}\n\n\tif len(e.options.Trailers) != 0 {\n\t\ttrailers := make([]string, 0, len(e.options.Trailers))\n\t\tfor name := range e.options.Trailers {\n\t\t\ttrailers = append(trailers, strings.ToLower(name))\n\t\t}\n\t\theaders[awsTrailerHeaderName] = trailers\n\t}\n\n\treturn headers\n}\n\nfunc (e *awsChunkedEncoding) Read(b []byte) (n int, err error) {\n\treturn e.encodedStream.Read(b)\n}\n\n// awsChunkedTrailerReader provides a lazy reader for reading of aws-chunked\n// content encoded trailers. The trailer values will not be retrieved until the\n// reader is read from.\ntype awsChunkedTrailerReader struct {\n\treader               *bytes.Buffer\n\ttrailers             map[string]awsChunkedTrailerValue\n\ttrailerEncodedLength int\n}\n\n// newAWSChunkedTrailerReader returns an initialized awsChunkedTrailerReader to\n// lazy reading aws-chunk content encoded trailers.\nfunc newAWSChunkedTrailerReader(trailers map[string]awsChunkedTrailerValue) *awsChunkedTrailerReader {\n\treturn &awsChunkedTrailerReader{\n\t\ttrailers:             trailers,\n\t\ttrailerEncodedLength: trailerEncodedLength(trailers),\n\t}\n}\n\nfunc trailerEncodedLength(trailers map[string]awsChunkedTrailerValue) (length int) {\n\tfor name, trailer := range trailers {\n\t\tlength += len(name) + len(trailerKeyValueSeparator)\n\t\tl := trailer.Length\n\t\tif l == -1 {\n\t\t\treturn -1\n\t\t}\n\t\tlength += l + len(crlf)\n\t}\n\n\treturn length\n}\n\n// EncodedLength returns the length of the encoded trailers if the length could\n// be determined without retrieving the header values. Returns -1 if length is\n// unknown.\nfunc (r *awsChunkedTrailerReader) EncodedLength() (length int) {\n\treturn r.trailerEncodedLength\n}\n\n// Read populates the passed in byte slice with bytes from the encoded\n// trailers. Will lazy read header values first time Read is called.\nfunc (r *awsChunkedTrailerReader) Read(p []byte) (int, error) {\n\tif r.trailerEncodedLength == 0 {\n\t\treturn 0, io.EOF\n\t}\n\n\tif r.reader == nil {\n\t\ttrailerLen := r.trailerEncodedLength\n\t\tif r.trailerEncodedLength == -1 {\n\t\t\ttrailerLen = 0\n\t\t}\n\t\tr.reader = bytes.NewBuffer(make([]byte, 0, trailerLen))\n\t\tfor name, trailer := range r.trailers {\n\t\t\tr.reader.WriteString(name)\n\t\t\tr.reader.WriteString(trailerKeyValueSeparator)\n\t\t\tv, err := trailer.Get()\n\t\t\tif err != nil {\n\t\t\t\treturn 0, fmt.Errorf(\"failed to get trailer value, %w\", err)\n\t\t\t}\n\t\t\tr.reader.WriteString(v)\n\t\t\tr.reader.WriteString(crlf)\n\t\t}\n\t}\n\n\treturn r.reader.Read(p)\n}\n\n// newUnsignedChunkReader returns an io.Reader encoding the underlying reader\n// as unsigned aws-chunked chunks. The returned reader will also include the\n// end chunk, but not the aws-chunked final `crlf` segment so trailers can be\n// added.\n//\n// If the payload size is -1 for unknown length the content will be buffered in\n// defaultChunkLength chunks before wrapped in aws-chunked chunk encoding.\nfunc newUnsignedChunkReader(reader io.Reader, payloadSize int64) io.Reader {\n\tif payloadSize == -1 {\n\t\treturn newBufferedAWSChunkReader(reader, defaultChunkLength)\n\t}\n\n\tvar endChunk bytes.Buffer\n\tif payloadSize == 0 {\n\t\tendChunk.Write(finalChunkBytes)\n\t\treturn &endChunk\n\t}\n\n\tendChunk.WriteString(crlf)\n\tendChunk.Write(finalChunkBytes)\n\n\tvar header bytes.Buffer\n\theader.WriteString(strconv.FormatInt(payloadSize, 16))\n\theader.WriteString(crlf)\n\treturn io.MultiReader(\n\t\t&header,\n\t\treader,\n\t\t&endChunk,\n\t)\n}\n\n// Provides a buffered aws-chunked chunk encoder of an underlying io.Reader.\n// Will include end chunk, but not the aws-chunked final `crlf` segment so\n// trailers can be added.\n//\n// Note does not implement support for chunk extensions, e.g. chunk signing.\ntype bufferedAWSChunkReader struct {\n\treader       io.Reader\n\tchunkSize    int\n\tchunkSizeStr string\n\n\theaderBuffer *bytes.Buffer\n\tchunkBuffer  *bytes.Buffer\n\n\tmultiReader    io.Reader\n\tmultiReaderLen int\n\tendChunkDone   bool\n}\n\n// newBufferedAWSChunkReader returns an bufferedAWSChunkReader for reading\n// aws-chunked encoded chunks.\nfunc newBufferedAWSChunkReader(reader io.Reader, chunkSize int) *bufferedAWSChunkReader {\n\treturn &bufferedAWSChunkReader{\n\t\treader:       reader,\n\t\tchunkSize:    chunkSize,\n\t\tchunkSizeStr: strconv.FormatInt(int64(chunkSize), 16),\n\n\t\theaderBuffer: bytes.NewBuffer(make([]byte, 0, 64)),\n\t\tchunkBuffer:  bytes.NewBuffer(make([]byte, 0, chunkSize+len(crlf))),\n\t}\n}\n\n// Read attempts to read from the underlying io.Reader writing aws-chunked\n// chunk encoded bytes to p. When the underlying io.Reader has been completed\n// read the end chunk will be available. Once the end chunk is read, the reader\n// will return EOF.\nfunc (r *bufferedAWSChunkReader) Read(p []byte) (n int, err error) {\n\tif r.multiReaderLen == 0 && r.endChunkDone {\n\t\treturn 0, io.EOF\n\t}\n\tif r.multiReader == nil || r.multiReaderLen == 0 {\n\t\tr.multiReader, r.multiReaderLen, err = r.newMultiReader()\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t}\n\n\tn, err = r.multiReader.Read(p)\n\tr.multiReaderLen -= n\n\n\tif err == io.EOF && !r.endChunkDone {\n\t\t// Edge case handling when the multi-reader has been completely read,\n\t\t// and returned an EOF, make sure that EOF only gets returned if the\n\t\t// end chunk was included in the multi-reader. Otherwise, the next call\n\t\t// to read will initialize the next chunk's multi-reader.\n\t\terr = nil\n\t}\n\treturn n, err\n}\n\n// newMultiReader returns a new io.Reader for wrapping the next chunk. Will\n// return an error if the underlying reader can not be read from. Will never\n// return io.EOF.\nfunc (r *bufferedAWSChunkReader) newMultiReader() (io.Reader, int, error) {\n\t// io.Copy eats the io.EOF returned by io.LimitReader. Any error that\n\t// occurs here is due to an actual read error.\n\tn, err := io.Copy(r.chunkBuffer, io.LimitReader(r.reader, int64(r.chunkSize)))\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\tif n == 0 {\n\t\t// Early exit writing out only the end chunk. This does not include\n\t\t// aws-chunk's final `crlf` so that trailers can still be added by\n\t\t// upstream reader.\n\t\tr.headerBuffer.Reset()\n\t\tr.headerBuffer.WriteString(\"0\")\n\t\tr.headerBuffer.WriteString(crlf)\n\t\tr.endChunkDone = true\n\n\t\treturn r.headerBuffer, r.headerBuffer.Len(), nil\n\t}\n\tr.chunkBuffer.WriteString(crlf)\n\n\tchunkSizeStr := r.chunkSizeStr\n\tif int(n) != r.chunkSize {\n\t\tchunkSizeStr = strconv.FormatInt(n, 16)\n\t}\n\n\tr.headerBuffer.Reset()\n\tr.headerBuffer.WriteString(chunkSizeStr)\n\tr.headerBuffer.WriteString(crlf)\n\n\treturn io.MultiReader(\n\t\tr.headerBuffer,\n\t\tr.chunkBuffer,\n\t), r.headerBuffer.Len() + r.chunkBuffer.Len(), nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/go_module_metadata.go",
    "content": "// Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT.\n\npackage checksum\n\n// goModuleVersion is the tagged release for this module\nconst goModuleVersion = \"1.7.1\"\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/middleware_add.go",
    "content": "package checksum\n\nimport (\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\n// InputMiddlewareOptions provides the options for the request\n// checksum middleware setup.\ntype InputMiddlewareOptions struct {\n\t// GetAlgorithm is a function to get the checksum algorithm of the\n\t// input payload from the input parameters.\n\t//\n\t// Given the input parameter value, the function must return the algorithm\n\t// and true, or false if no algorithm is specified.\n\tGetAlgorithm func(interface{}) (string, bool)\n\n\t// RequireChecksum indicates whether operation model forces middleware to compute the input payload's checksum.\n\t// If RequireChecksum is set to true, checksum will be calculated and RequestChecksumCalculation will be ignored,\n\t// otherwise RequestChecksumCalculation will be used to indicate if checksum will be calculated\n\tRequireChecksum bool\n\n\t// RequestChecksumCalculation is the user config to opt-in/out request checksum calculation. If RequireChecksum is\n\t// set to true, checksum will be calculated and this field will be ignored, otherwise\n\t// RequestChecksumCalculation will be used to indicate if checksum will be calculated\n\tRequestChecksumCalculation aws.RequestChecksumCalculation\n\n\t// Enables support for wrapping the serialized input payload with a\n\t// content-encoding: aws-check wrapper, and including a trailer for the\n\t// algorithm's checksum value.\n\t//\n\t// The checksum will not be computed, nor added as trailing checksum, if\n\t// the Algorithm's header is already set on the request.\n\tEnableTrailingChecksum bool\n\n\t// Enables support for computing the SHA256 checksum of input payloads\n\t// along with the algorithm specified checksum. Prevents downstream\n\t// middleware handlers (computePayloadSHA256) re-reading the payload.\n\t//\n\t// The SHA256 payload checksum will only be used for computed for requests\n\t// that are not TLS, or do not enable trailing checksums.\n\t//\n\t// The SHA256 payload hash will not be computed, if the Algorithm's header\n\t// is already set on the request.\n\tEnableComputeSHA256PayloadHash bool\n\n\t// Enables support for setting the aws-chunked decoded content length\n\t// header for the decoded length of the underlying stream. Will only be set\n\t// when used with trailing checksums, and aws-chunked content-encoding.\n\tEnableDecodedContentLengthHeader bool\n}\n\n// AddInputMiddleware adds the middleware for performing checksum computing\n// of request payloads, and checksum validation of response payloads.\n//\n// Deprecated: This internal-only runtime API is frozen. Do not call or modify\n// it in new code. Checksum-enabled service operations now generate this\n// middleware setup code inline per #2507.\nfunc AddInputMiddleware(stack *middleware.Stack, options InputMiddlewareOptions) (err error) {\n\t// Initial checksum configuration look up middleware\n\terr = stack.Initialize.Add(&SetupInputContext{\n\t\tGetAlgorithm:               options.GetAlgorithm,\n\t\tRequireChecksum:            options.RequireChecksum,\n\t\tRequestChecksumCalculation: options.RequestChecksumCalculation,\n\t}, middleware.Before)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tstack.Build.Remove(\"ContentChecksum\")\n\n\tinputChecksum := &ComputeInputPayloadChecksum{\n\t\tEnableTrailingChecksum:           options.EnableTrailingChecksum,\n\t\tEnableComputePayloadHash:         options.EnableComputeSHA256PayloadHash,\n\t\tEnableDecodedContentLengthHeader: options.EnableDecodedContentLengthHeader,\n\t}\n\tif err := stack.Finalize.Insert(inputChecksum, \"ResolveEndpointV2\", middleware.After); err != nil {\n\t\treturn err\n\t}\n\n\t// If trailing checksum is not supported no need for finalize handler to be added.\n\tif options.EnableTrailingChecksum {\n\t\ttrailerMiddleware := &AddInputChecksumTrailer{\n\t\t\tEnableTrailingChecksum:           inputChecksum.EnableTrailingChecksum,\n\t\t\tEnableComputePayloadHash:         inputChecksum.EnableComputePayloadHash,\n\t\t\tEnableDecodedContentLengthHeader: inputChecksum.EnableDecodedContentLengthHeader,\n\t\t}\n\t\tif err := stack.Finalize.Insert(trailerMiddleware, \"Retry\", middleware.After); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// RemoveInputMiddleware Removes the compute input payload checksum middleware\n// handlers from the stack.\nfunc RemoveInputMiddleware(stack *middleware.Stack) {\n\tid := (*SetupInputContext)(nil).ID()\n\tstack.Initialize.Remove(id)\n\n\tid = (*ComputeInputPayloadChecksum)(nil).ID()\n\tstack.Finalize.Remove(id)\n}\n\n// OutputMiddlewareOptions provides options for configuring output checksum\n// validation middleware.\ntype OutputMiddlewareOptions struct {\n\t// GetValidationMode is a function to get the checksum validation\n\t// mode of the output payload from the input parameters.\n\t//\n\t// Given the input parameter value, the function must return the validation\n\t// mode and true, or false if no mode is specified.\n\tGetValidationMode func(interface{}) (string, bool)\n\n\t// SetValidationMode is a function to set the checksum validation mode of input parameters\n\tSetValidationMode func(interface{}, string)\n\n\t// ResponseChecksumValidation is the user config to opt-in/out response checksum validation\n\tResponseChecksumValidation aws.ResponseChecksumValidation\n\n\t// The set of checksum algorithms that should be used for response payload\n\t// checksum validation. The algorithm(s) used will be a union of the\n\t// output's returned algorithms and this set.\n\t//\n\t// Only the first algorithm in the union is currently used.\n\tValidationAlgorithms []string\n\n\t// If set the middleware will ignore output multipart checksums. Otherwise\n\t// a checksum format error will be returned by the middleware.\n\tIgnoreMultipartValidation bool\n\n\t// When set the middleware will log when output does not have checksum or\n\t// algorithm to validate.\n\tLogValidationSkipped bool\n\n\t// When set the middleware will log when the output contains a multipart\n\t// checksum that was, skipped and not validated.\n\tLogMultipartValidationSkipped bool\n}\n\n// AddOutputMiddleware adds the middleware for validating response payload's\n// checksum.\nfunc AddOutputMiddleware(stack *middleware.Stack, options OutputMiddlewareOptions) error {\n\terr := stack.Initialize.Add(&setupOutputContext{\n\t\tGetValidationMode:          options.GetValidationMode,\n\t\tSetValidationMode:          options.SetValidationMode,\n\t\tResponseChecksumValidation: options.ResponseChecksumValidation,\n\t}, middleware.Before)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Resolve a supported priority order list of algorithms to validate.\n\talgorithms := FilterSupportedAlgorithms(options.ValidationAlgorithms)\n\n\tm := &validateOutputPayloadChecksum{\n\t\tAlgorithms:                    algorithms,\n\t\tIgnoreMultipartValidation:     options.IgnoreMultipartValidation,\n\t\tLogMultipartValidationSkipped: options.LogMultipartValidationSkipped,\n\t\tLogValidationSkipped:          options.LogValidationSkipped,\n\t}\n\n\treturn stack.Deserialize.Add(m, middleware.After)\n}\n\n// RemoveOutputMiddleware Removes the compute input payload checksum middleware\n// handlers from the stack.\nfunc RemoveOutputMiddleware(stack *middleware.Stack) {\n\tid := (*setupOutputContext)(nil).ID()\n\tstack.Initialize.Remove(id)\n\n\tid = (*validateOutputPayloadChecksum)(nil).ID()\n\tstack.Deserialize.Remove(id)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/middleware_checksum_metrics_tracking.go",
    "content": "package checksum\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nvar supportedChecksumFeatures = map[Algorithm]awsmiddleware.UserAgentFeature{\n\tAlgorithmCRC32:     awsmiddleware.UserAgentFeatureRequestChecksumCRC32,\n\tAlgorithmCRC32C:    awsmiddleware.UserAgentFeatureRequestChecksumCRC32C,\n\tAlgorithmSHA1:      awsmiddleware.UserAgentFeatureRequestChecksumSHA1,\n\tAlgorithmSHA256:    awsmiddleware.UserAgentFeatureRequestChecksumSHA256,\n\tAlgorithmCRC64NVME: awsmiddleware.UserAgentFeatureRequestChecksumCRC64,\n}\n\n// RequestChecksumMetricsTracking is the middleware to track operation request's checksum usage\ntype RequestChecksumMetricsTracking struct {\n\tRequestChecksumCalculation aws.RequestChecksumCalculation\n\tUserAgent                  *awsmiddleware.RequestUserAgent\n}\n\n// ID provides the middleware identifier\nfunc (m *RequestChecksumMetricsTracking) ID() string {\n\treturn \"AWSChecksum:RequestMetricsTracking\"\n}\n\n// HandleBuild checks request checksum config and checksum value sent\n// and sends corresponding feature id to user agent\nfunc (m *RequestChecksumMetricsTracking) HandleBuild(\n\tctx context.Context, in middleware.BuildInput, next middleware.BuildHandler,\n) (\n\tout middleware.BuildOutput, metadata middleware.Metadata, err error,\n) {\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown request type %T\", req)\n\t}\n\n\tswitch m.RequestChecksumCalculation {\n\tcase aws.RequestChecksumCalculationWhenSupported:\n\t\tm.UserAgent.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRequestChecksumWhenSupported)\n\tcase aws.RequestChecksumCalculationWhenRequired:\n\t\tm.UserAgent.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRequestChecksumWhenRequired)\n\t}\n\n\tfor algo, feat := range supportedChecksumFeatures {\n\t\tchecksumHeader := AlgorithmHTTPHeader(algo)\n\t\tif checksum := req.Header.Get(checksumHeader); checksum != \"\" {\n\t\t\tm.UserAgent.AddUserAgentFeature(feat)\n\t\t}\n\t}\n\n\treturn next.HandleBuild(ctx, in)\n}\n\n// ResponseChecksumMetricsTracking is the middleware to track operation response's checksum usage\ntype ResponseChecksumMetricsTracking struct {\n\tResponseChecksumValidation aws.ResponseChecksumValidation\n\tUserAgent                  *awsmiddleware.RequestUserAgent\n}\n\n// ID provides the middleware identifier\nfunc (m *ResponseChecksumMetricsTracking) ID() string {\n\treturn \"AWSChecksum:ResponseMetricsTracking\"\n}\n\n// HandleBuild checks the response checksum config and sends corresponding feature id to user agent\nfunc (m *ResponseChecksumMetricsTracking) HandleBuild(\n\tctx context.Context, in middleware.BuildInput, next middleware.BuildHandler,\n) (\n\tout middleware.BuildOutput, metadata middleware.Metadata, err error,\n) {\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown request type %T\", req)\n\t}\n\n\tswitch m.ResponseChecksumValidation {\n\tcase aws.ResponseChecksumValidationWhenSupported:\n\t\tm.UserAgent.AddUserAgentFeature(awsmiddleware.UserAgentFeatureResponseChecksumWhenSupported)\n\tcase aws.ResponseChecksumValidationWhenRequired:\n\t\tm.UserAgent.AddUserAgentFeature(awsmiddleware.UserAgentFeatureResponseChecksumWhenRequired)\n\t}\n\n\treturn next.HandleBuild(ctx, in)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/middleware_compute_input_checksum.go",
    "content": "package checksum\n\nimport (\n\t\"context\"\n\t\"crypto/sha256\"\n\t\"fmt\"\n\t\"hash\"\n\t\"io\"\n\t\"strconv\"\n\t\"strings\"\n\n\tv4 \"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalcontext \"github.com/aws/aws-sdk-go-v2/internal/context\"\n\tpresignedurlcust \"github.com/aws/aws-sdk-go-v2/service/internal/presigned-url\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nconst (\n\tstreamingUnsignedPayloadTrailerPayloadHash = \"STREAMING-UNSIGNED-PAYLOAD-TRAILER\"\n)\n\n// computedInputChecksumsKey is the metadata key for recording the algorithm the\n// checksum was computed for and the checksum value.\ntype computedInputChecksumsKey struct{}\n\n// GetComputedInputChecksums returns the map of checksum algorithm to their\n// computed value stored in the middleware Metadata. Returns false if no values\n// were stored in the Metadata.\nfunc GetComputedInputChecksums(m middleware.Metadata) (map[string]string, bool) {\n\tvs, ok := m.Get(computedInputChecksumsKey{}).(map[string]string)\n\treturn vs, ok\n}\n\n// SetComputedInputChecksums stores the map of checksum algorithm to their\n// computed value in the middleware Metadata. Overwrites any values that\n// currently exist in the metadata.\nfunc SetComputedInputChecksums(m *middleware.Metadata, vs map[string]string) {\n\tm.Set(computedInputChecksumsKey{}, vs)\n}\n\n// ComputeInputPayloadChecksum middleware computes payload checksum\ntype ComputeInputPayloadChecksum struct {\n\t// Enables support for wrapping the serialized input payload with a\n\t// content-encoding: aws-check wrapper, and including a trailer for the\n\t// algorithm's checksum value.\n\t//\n\t// The checksum will not be computed, nor added as trailing checksum, if\n\t// the Algorithm's header is already set on the request.\n\tEnableTrailingChecksum bool\n\n\t// Enables support for computing the SHA256 checksum of input payloads\n\t// along with the algorithm specified checksum. Prevents downstream\n\t// middleware handlers (computePayloadSHA256) re-reading the payload.\n\t//\n\t// The SHA256 payload hash will only be used for computed for requests\n\t// that are not TLS, or do not enable trailing checksums.\n\t//\n\t// The SHA256 payload hash will not be computed, if the Algorithm's header\n\t// is already set on the request.\n\tEnableComputePayloadHash bool\n\n\t// Enables support for setting the aws-chunked decoded content length\n\t// header for the decoded length of the underlying stream. Will only be set\n\t// when used with trailing checksums, and aws-chunked content-encoding.\n\tEnableDecodedContentLengthHeader bool\n\n\tuseTrailer bool\n}\n\ntype useTrailer struct{}\n\n// ID provides the middleware's identifier.\nfunc (m *ComputeInputPayloadChecksum) ID() string {\n\treturn \"AWSChecksum:ComputeInputPayloadChecksum\"\n}\n\ntype computeInputHeaderChecksumError struct {\n\tMsg string\n\tErr error\n}\n\nfunc (e computeInputHeaderChecksumError) Error() string {\n\tconst intro = \"compute input header checksum failed\"\n\n\tif e.Err != nil {\n\t\treturn fmt.Sprintf(\"%s, %s, %v\", intro, e.Msg, e.Err)\n\t}\n\n\treturn fmt.Sprintf(\"%s, %s\", intro, e.Msg)\n}\nfunc (e computeInputHeaderChecksumError) Unwrap() error { return e.Err }\n\n// HandleFinalize handles computing the payload's checksum, in the following cases:\n//   - Is HTTP, not HTTPS\n//   - RequireChecksum is true, and no checksums were specified via the Input\n//   - Trailing checksums are not supported\n//\n// The build handler must be inserted in the stack before ContentPayloadHash\n// and after ComputeContentLength.\nfunc (m *ComputeInputPayloadChecksum) HandleFinalize(\n\tctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,\n) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\tvar checksum string\n\talgorithm, ok, err := getInputAlgorithm(ctx)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\tif !ok {\n\t\treturn next.HandleFinalize(ctx, in)\n\t}\n\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, computeInputHeaderChecksumError{\n\t\t\tMsg: fmt.Sprintf(\"unknown request type %T\", req),\n\t\t}\n\t}\n\n\tdefer func() {\n\t\tif algorithm == \"\" || checksum == \"\" || err != nil {\n\t\t\treturn\n\t\t}\n\n\t\t// Record the checksum and algorithm that was computed\n\t\tSetComputedInputChecksums(&metadata, map[string]string{\n\t\t\tstring(algorithm): checksum,\n\t\t})\n\t}()\n\n\t// If any checksum header is already set nothing to do.\n\tfor header := range req.Header {\n\t\th := strings.ToUpper(header)\n\t\tif strings.HasPrefix(h, \"X-AMZ-CHECKSUM-\") {\n\t\t\talgorithm = Algorithm(strings.TrimPrefix(h, \"X-AMZ-CHECKSUM-\"))\n\t\t\tchecksum = req.Header.Get(header)\n\t\t\treturn next.HandleFinalize(ctx, in)\n\t\t}\n\t}\n\n\tcomputePayloadHash := m.EnableComputePayloadHash\n\tif v := v4.GetPayloadHash(ctx); v != \"\" {\n\t\tcomputePayloadHash = false\n\t}\n\n\tstream := req.GetStream()\n\tstreamLength, err := getRequestStreamLength(req)\n\tif err != nil {\n\t\treturn out, metadata, computeInputHeaderChecksumError{\n\t\t\tMsg: \"failed to determine stream length\",\n\t\t\tErr: err,\n\t\t}\n\t}\n\n\t// If trailing checksums are supported, the request is HTTPS, and the\n\t// stream is not nil or empty, instead switch to a trailing checksum.\n\t//\n\t// Nil and empty streams will always be handled as a request header,\n\t// regardless if the operation supports trailing checksums or not.\n\tif req.IsHTTPS() && !presignedurlcust.GetIsPresigning(ctx) {\n\t\tif stream != nil && streamLength != 0 && m.EnableTrailingChecksum {\n\t\t\tif m.EnableComputePayloadHash {\n\t\t\t\t// ContentSHA256Header middleware handles the header\n\t\t\t\tctx = v4.SetPayloadHash(ctx, streamingUnsignedPayloadTrailerPayloadHash)\n\t\t\t}\n\t\t\tm.useTrailer = true\n\t\t\tctx = middleware.WithStackValue(ctx, useTrailer{}, true)\n\t\t\treturn next.HandleFinalize(ctx, in)\n\t\t}\n\n\t\t// If trailing checksums are not enabled but protocol is still HTTPS\n\t\t// disabling computing the payload hash. Downstream middleware  handler\n\t\t// (ComputetPayloadHash) will set the payload hash to unsigned payload,\n\t\t// if signing was used.\n\t\tcomputePayloadHash = false\n\t}\n\n\t// Only seekable streams are supported for non-trailing checksums, because\n\t// the stream needs to be rewound before the handler can continue.\n\tif stream != nil && !req.IsStreamSeekable() {\n\t\treturn out, metadata, computeInputHeaderChecksumError{\n\t\t\tMsg: \"unseekable stream is not supported without TLS and trailing checksum\",\n\t\t}\n\t}\n\n\tvar sha256Checksum string\n\tchecksum, sha256Checksum, err = computeStreamChecksum(\n\t\talgorithm, stream, computePayloadHash)\n\tif err != nil {\n\t\treturn out, metadata, computeInputHeaderChecksumError{\n\t\t\tMsg: \"failed to compute stream checksum\",\n\t\t\tErr: err,\n\t\t}\n\t}\n\n\tif err := req.RewindStream(); err != nil {\n\t\treturn out, metadata, computeInputHeaderChecksumError{\n\t\t\tMsg: \"failed to rewind stream\",\n\t\t\tErr: err,\n\t\t}\n\t}\n\n\tchecksumHeader := AlgorithmHTTPHeader(algorithm)\n\treq.Header.Set(checksumHeader, checksum)\n\n\tif computePayloadHash {\n\t\tctx = v4.SetPayloadHash(ctx, sha256Checksum)\n\t}\n\n\treturn next.HandleFinalize(ctx, in)\n}\n\ntype computeInputTrailingChecksumError struct {\n\tMsg string\n\tErr error\n}\n\nfunc (e computeInputTrailingChecksumError) Error() string {\n\tconst intro = \"compute input trailing checksum failed\"\n\n\tif e.Err != nil {\n\t\treturn fmt.Sprintf(\"%s, %s, %v\", intro, e.Msg, e.Err)\n\t}\n\n\treturn fmt.Sprintf(\"%s, %s\", intro, e.Msg)\n}\nfunc (e computeInputTrailingChecksumError) Unwrap() error { return e.Err }\n\n// AddInputChecksumTrailer adds HTTP checksum when\n//   - Is HTTPS, not HTTP\n//   - A checksum was specified via the Input\n//   - Trailing checksums are supported.\ntype AddInputChecksumTrailer struct {\n\tEnableTrailingChecksum           bool\n\tEnableComputePayloadHash         bool\n\tEnableDecodedContentLengthHeader bool\n}\n\n// ID identifies this middleware.\nfunc (*AddInputChecksumTrailer) ID() string {\n\treturn \"addInputChecksumTrailer\"\n}\n\n// HandleFinalize wraps the request body to write the trailing checksum.\nfunc (m *AddInputChecksumTrailer) HandleFinalize(\n\tctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,\n) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\talgorithm, ok, err := getInputAlgorithm(ctx)\n\tif err != nil {\n\t\treturn out, metadata, computeInputTrailingChecksumError{\n\t\t\tMsg: \"failed to get algorithm\",\n\t\t\tErr: err,\n\t\t}\n\t} else if !ok {\n\t\treturn next.HandleFinalize(ctx, in)\n\t}\n\n\tif enabled, _ := middleware.GetStackValue(ctx, useTrailer{}).(bool); !enabled {\n\t\treturn next.HandleFinalize(ctx, in)\n\t}\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, computeInputTrailingChecksumError{\n\t\t\tMsg: fmt.Sprintf(\"unknown request type %T\", req),\n\t\t}\n\t}\n\n\t// Trailing checksums are only supported when TLS is enabled.\n\tif !req.IsHTTPS() {\n\t\treturn out, metadata, computeInputTrailingChecksumError{\n\t\t\tMsg: \"HTTPS required\",\n\t\t}\n\t}\n\n\t// If any checksum header is already set nothing to do.\n\tfor header := range req.Header {\n\t\tif strings.HasPrefix(strings.ToLower(header), \"x-amz-checksum-\") {\n\t\t\treturn next.HandleFinalize(ctx, in)\n\t\t}\n\t}\n\n\tstream := req.GetStream()\n\tstreamLength, err := getRequestStreamLength(req)\n\tif err != nil {\n\t\treturn out, metadata, computeInputTrailingChecksumError{\n\t\t\tMsg: \"failed to determine stream length\",\n\t\t\tErr: err,\n\t\t}\n\t}\n\n\tif stream == nil || streamLength == 0 {\n\t\t// Nil and empty streams are handled by the Build handler. They are not\n\t\t// supported by the trailing checksums finalize handler. There is no\n\t\t// benefit to sending them as trailers compared to headers.\n\t\treturn out, metadata, computeInputTrailingChecksumError{\n\t\t\tMsg: \"nil or empty streams are not supported\",\n\t\t}\n\t}\n\n\tchecksumReader, err := newComputeChecksumReader(stream, algorithm)\n\tif err != nil {\n\t\treturn out, metadata, computeInputTrailingChecksumError{\n\t\t\tMsg: \"failed to created checksum reader\",\n\t\t\tErr: err,\n\t\t}\n\t}\n\n\tawsChunkedReader := newUnsignedAWSChunkedEncoding(checksumReader,\n\t\tfunc(o *awsChunkedEncodingOptions) {\n\t\t\to.Trailers[AlgorithmHTTPHeader(checksumReader.Algorithm())] = awsChunkedTrailerValue{\n\t\t\t\tGet:    checksumReader.Base64Checksum,\n\t\t\t\tLength: checksumReader.Base64ChecksumLength(),\n\t\t\t}\n\t\t\to.StreamLength = streamLength\n\t\t})\n\n\tfor key, values := range awsChunkedReader.HTTPHeaders() {\n\t\tfor _, value := range values {\n\t\t\treq.Header.Add(key, value)\n\t\t}\n\t}\n\n\t// Setting the stream on the request will create a copy. The content length\n\t// is not updated until after the request is copied to prevent impacting\n\t// upstream middleware.\n\treq, err = req.SetStream(awsChunkedReader)\n\tif err != nil {\n\t\treturn out, metadata, computeInputTrailingChecksumError{\n\t\t\tMsg: \"failed updating request to trailing checksum wrapped stream\",\n\t\t\tErr: err,\n\t\t}\n\t}\n\treq.ContentLength = awsChunkedReader.EncodedLength()\n\tin.Request = req\n\n\t// Add decoded content length header if original stream's content length is known.\n\tif streamLength != -1 && m.EnableDecodedContentLengthHeader {\n\t\treq.Header.Set(decodedContentLengthHeaderName, strconv.FormatInt(streamLength, 10))\n\t}\n\n\tout, metadata, err = next.HandleFinalize(ctx, in)\n\tif err == nil {\n\t\tchecksum, err := checksumReader.Base64Checksum()\n\t\tif err != nil {\n\t\t\treturn out, metadata, fmt.Errorf(\"failed to get computed checksum, %w\", err)\n\t\t}\n\n\t\t// Record the checksum and algorithm that was computed\n\t\tSetComputedInputChecksums(&metadata, map[string]string{\n\t\t\tstring(algorithm): checksum,\n\t\t})\n\t}\n\n\treturn out, metadata, err\n}\n\nfunc getInputAlgorithm(ctx context.Context) (Algorithm, bool, error) {\n\tctxAlgorithm := internalcontext.GetChecksumInputAlgorithm(ctx)\n\tif ctxAlgorithm == \"\" {\n\t\treturn \"\", false, nil\n\t}\n\n\talgorithm, err := ParseAlgorithm(ctxAlgorithm)\n\tif err != nil {\n\t\treturn \"\", false, fmt.Errorf(\n\t\t\t\"failed to parse algorithm, %w\", err)\n\t}\n\n\treturn algorithm, true, nil\n}\n\nfunc computeStreamChecksum(algorithm Algorithm, stream io.Reader, computePayloadHash bool) (\n\tchecksum string, sha256Checksum string, err error,\n) {\n\thasher, err := NewAlgorithmHash(algorithm)\n\tif err != nil {\n\t\treturn \"\", \"\", fmt.Errorf(\n\t\t\t\"failed to get hasher for checksum algorithm, %w\", err)\n\t}\n\n\tvar sha256Hasher hash.Hash\n\tvar batchHasher io.Writer = hasher\n\n\t// Compute payload hash for the protocol. To prevent another handler\n\t// (computePayloadSHA256) re-reading body also compute the SHA256 for\n\t// request signing. If configured checksum algorithm is SHA256, don't\n\t// double wrap stream with another SHA256 hasher.\n\tif computePayloadHash && algorithm != AlgorithmSHA256 {\n\t\tsha256Hasher = sha256.New()\n\t\tbatchHasher = io.MultiWriter(hasher, sha256Hasher)\n\t}\n\n\tif stream != nil {\n\t\tif _, err = io.Copy(batchHasher, stream); err != nil {\n\t\t\treturn \"\", \"\", fmt.Errorf(\n\t\t\t\t\"failed to read stream to compute hash, %w\", err)\n\t\t}\n\t}\n\n\tchecksum = string(base64EncodeHashSum(hasher))\n\tif computePayloadHash {\n\t\tif algorithm != AlgorithmSHA256 {\n\t\t\tsha256Checksum = string(hexEncodeHashSum(sha256Hasher))\n\t\t} else {\n\t\t\tsha256Checksum = string(hexEncodeHashSum(hasher))\n\t\t}\n\t}\n\n\treturn checksum, sha256Checksum, nil\n}\n\nfunc getRequestStreamLength(req *smithyhttp.Request) (int64, error) {\n\tif v := req.ContentLength; v > 0 {\n\t\treturn v, nil\n\t}\n\n\tif length, ok, err := req.StreamLength(); err != nil {\n\t\treturn 0, fmt.Errorf(\"failed getting request stream's length, %w\", err)\n\t} else if ok {\n\t\treturn length, nil\n\t}\n\n\treturn -1, nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/middleware_setup_context.go",
    "content": "package checksum\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\n\tinternalcontext \"github.com/aws/aws-sdk-go-v2/internal/context\"\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\nconst (\n\tchecksumValidationModeEnabled = \"ENABLED\"\n)\n\n// SetupInputContext is the initial middleware that looks up the input\n// used to configure checksum behavior. This middleware must be executed before\n// input validation step or any other checksum middleware.\ntype SetupInputContext struct {\n\t// GetAlgorithm is a function to get the checksum algorithm of the\n\t// input payload from the input parameters.\n\t//\n\t// Given the input parameter value, the function must return the algorithm\n\t// and true, or false if no algorithm is specified.\n\tGetAlgorithm func(interface{}) (string, bool)\n\n\t// RequireChecksum indicates whether operation model forces middleware to compute the input payload's checksum.\n\t// If RequireChecksum is set to true, checksum will be calculated and RequestChecksumCalculation will be ignored,\n\t// otherwise RequestChecksumCalculation will be used to indicate if checksum will be calculated\n\tRequireChecksum bool\n\n\t// RequestChecksumCalculation is the user config to opt-in/out request checksum calculation. If RequireChecksum is\n\t// set to true, checksum will be calculated and this field will be ignored, otherwise\n\t// RequestChecksumCalculation will be used to indicate if checksum will be calculated\n\tRequestChecksumCalculation aws.RequestChecksumCalculation\n}\n\n// ID for the middleware\nfunc (m *SetupInputContext) ID() string {\n\treturn \"AWSChecksum:SetupInputContext\"\n}\n\n// HandleInitialize initialization middleware that setups up the checksum\n// context based on the input parameters provided in the stack.\nfunc (m *SetupInputContext) HandleInitialize(\n\tctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler,\n) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\t// nil check here is for operations that require checksum but do not have input algorithm setting\n\tif m.GetAlgorithm != nil {\n\t\tif algorithm, ok := m.GetAlgorithm(in.Parameters); ok {\n\t\t\tctx = internalcontext.SetChecksumInputAlgorithm(ctx, algorithm)\n\t\t\treturn next.HandleInitialize(ctx, in)\n\t\t}\n\t}\n\n\tif m.RequireChecksum || m.RequestChecksumCalculation == aws.RequestChecksumCalculationWhenSupported {\n\t\tctx = internalcontext.SetChecksumInputAlgorithm(ctx, string(AlgorithmCRC32))\n\t}\n\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype setupOutputContext struct {\n\t// GetValidationMode is a function to get the checksum validation\n\t// mode of the output payload from the input parameters.\n\t//\n\t// Given the input parameter value, the function must return the validation\n\t// mode and true, or false if no mode is specified.\n\tGetValidationMode func(interface{}) (string, bool)\n\n\t// SetValidationMode is a function to set the checksum validation mode of input parameters\n\tSetValidationMode func(interface{}, string)\n\n\t// ResponseChecksumValidation states user config to opt-in/out checksum validation\n\tResponseChecksumValidation aws.ResponseChecksumValidation\n}\n\n// ID for the middleware\nfunc (m *setupOutputContext) ID() string {\n\treturn \"AWSChecksum:SetupOutputContext\"\n}\n\n// HandleInitialize initialization middleware that setups up the checksum\n// context based on the input parameters provided in the stack.\nfunc (m *setupOutputContext) HandleInitialize(\n\tctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler,\n) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\n\tmode, _ := m.GetValidationMode(in.Parameters)\n\n\tif m.ResponseChecksumValidation == aws.ResponseChecksumValidationWhenSupported || mode == checksumValidationModeEnabled {\n\t\tm.SetValidationMode(in.Parameters, checksumValidationModeEnabled)\n\t\tctx = setContextOutputValidationMode(ctx, checksumValidationModeEnabled)\n\t}\n\n\treturn next.HandleInitialize(ctx, in)\n}\n\n// outputValidationModeKey is the key set on context used to identify if\n// output checksum validation is enabled.\ntype outputValidationModeKey struct{}\n\n// setContextOutputValidationMode sets the request checksum\n// algorithm on the context.\n//\n// Scoped to stack values.\nfunc setContextOutputValidationMode(ctx context.Context, value string) context.Context {\n\treturn middleware.WithStackValue(ctx, outputValidationModeKey{}, value)\n}\n\n// getContextOutputValidationMode returns response checksum validation state,\n// if one was specified. Empty string is returned if one is not specified.\n//\n// Scoped to stack values.\nfunc getContextOutputValidationMode(ctx context.Context) (v string) {\n\tv, _ = middleware.GetStackValue(ctx, outputValidationModeKey{}).(string)\n\treturn v\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/middleware_validate_output.go",
    "content": "package checksum\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/aws/smithy-go\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// outputValidationAlgorithmsUsedKey is the metadata key for indexing the algorithms\n// that were used, by the middleware's validation.\ntype outputValidationAlgorithmsUsedKey struct{}\n\n// GetOutputValidationAlgorithmsUsed returns the checksum algorithms used\n// stored in the middleware Metadata. Returns false if no algorithms were\n// stored in the Metadata.\nfunc GetOutputValidationAlgorithmsUsed(m middleware.Metadata) ([]string, bool) {\n\tvs, ok := m.Get(outputValidationAlgorithmsUsedKey{}).([]string)\n\treturn vs, ok\n}\n\n// SetOutputValidationAlgorithmsUsed stores the checksum algorithms used in the\n// middleware Metadata.\nfunc SetOutputValidationAlgorithmsUsed(m *middleware.Metadata, vs []string) {\n\tm.Set(outputValidationAlgorithmsUsedKey{}, vs)\n}\n\n// validateOutputPayloadChecksum middleware computes payload checksum of the\n// received response and validates with checksum returned by the service.\ntype validateOutputPayloadChecksum struct {\n\t// Algorithms represents a priority-ordered list of valid checksum\n\t// algorithm that should be validated when present in HTTP response\n\t// headers.\n\tAlgorithms []Algorithm\n\n\t// IgnoreMultipartValidation indicates multipart checksums ending with \"-#\"\n\t// will be ignored.\n\tIgnoreMultipartValidation bool\n\n\t// When set the middleware will log when output does not have checksum or\n\t// algorithm to validate.\n\tLogValidationSkipped bool\n\n\t// When set the middleware will log when the output contains a multipart\n\t// checksum that was, skipped and not validated.\n\tLogMultipartValidationSkipped bool\n}\n\nfunc (m *validateOutputPayloadChecksum) ID() string {\n\treturn \"AWSChecksum:ValidateOutputPayloadChecksum\"\n}\n\n// HandleDeserialize is a Deserialize middleware that wraps the HTTP response\n// body with an io.ReadCloser that will validate its checksum.\nfunc (m *validateOutputPayloadChecksum) HandleDeserialize(\n\tctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler,\n) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\tif mode := getContextOutputValidationMode(ctx); mode != checksumValidationModeEnabled {\n\t\treturn out, metadata, err\n\t}\n\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"unknown transport type %T\", out.RawResponse),\n\t\t}\n\t}\n\n\t// this runs BEFORE the deserializer, so we have to preemptively check for\n\t// non-200, in which case there is no checksum to validate\n\tif response.StatusCode != 200 {\n\t\treturn out, metadata, err\n\t}\n\n\tvar expectedChecksum string\n\tvar algorithmToUse Algorithm\n\tfor _, algorithm := range m.Algorithms {\n\t\tvalue := response.Header.Get(AlgorithmHTTPHeader(algorithm))\n\t\tif len(value) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\texpectedChecksum = value\n\t\talgorithmToUse = algorithm\n\t}\n\n\tlogger := middleware.GetLogger(ctx)\n\n\t// Skip validation if no checksum algorithm or checksum is available.\n\tif len(expectedChecksum) == 0 || len(algorithmToUse) == 0 {\n\t\tif response.Body != http.NoBody && m.LogValidationSkipped {\n\t\t\t// TODO this probably should have more information about the\n\t\t\t// operation output that won't be validated.\n\t\t\tlogger.Logf(logging.Warn,\n\t\t\t\t\"Response has no supported checksum. Not validating response payload.\")\n\t\t}\n\t\treturn out, metadata, nil\n\t}\n\n\t// Ignore multipart validation\n\tif m.IgnoreMultipartValidation && strings.Contains(expectedChecksum, \"-\") {\n\t\tif m.LogMultipartValidationSkipped {\n\t\t\t// TODO this probably should have more information about the\n\t\t\t// operation output that won't be validated.\n\t\t\tlogger.Logf(logging.Warn, \"Skipped validation of multipart checksum.\")\n\t\t}\n\t\treturn out, metadata, nil\n\t}\n\n\tbody, err := newValidateChecksumReader(response.Body, algorithmToUse, expectedChecksum)\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"failed to create checksum validation reader, %w\", err)\n\t}\n\tresponse.Body = body\n\n\t// Update the metadata to include the set of the checksum algorithms that\n\t// will be validated.\n\tSetOutputValidationAlgorithmsUsed(&metadata, []string{\n\t\tstring(algorithmToUse),\n\t})\n\n\treturn out, metadata, nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md",
    "content": "# v1.12.15 (2025-02-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.14 (2025-02-18)\n\n* **Bug Fix**: Bump go version to 1.22\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.13 (2025-02-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.12 (2025-01-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.11 (2025-01-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.10 (2025-01-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n* **Dependency Update**: Upgrade to smithy-go v1.22.2.\n\n# v1.12.9 (2025-01-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.8 (2025-01-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.7 (2024-12-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.6 (2024-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.5 (2024-11-18)\n\n* **Dependency Update**: Update to smithy-go v1.22.1.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.4 (2024-11-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.3 (2024-10-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.2 (2024-10-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.1 (2024-10-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.0 (2024-10-04)\n\n* **Feature**: Add support for HTTP client metrics.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.20 (2024-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.19 (2024-09-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.18 (2024-08-15)\n\n* **Dependency Update**: Bump minimum Go version to 1.21.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.17 (2024-07-10.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.16 (2024-07-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.15 (2024-06-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.14 (2024-06-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.13 (2024-06-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.12 (2024-06-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.11 (2024-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.10 (2024-06-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.9 (2024-05-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.8 (2024-05-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.7 (2024-03-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.6 (2024-03-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.5 (2024-03-07)\n\n* **Bug Fix**: Remove dependency on go-cmp.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.4 (2024-03-05)\n\n* **Bug Fix**: Restore typo'd API `AddAsIsInternalPresigingMiddleware` as an alias for backwards compatibility.\n\n# v1.11.3 (2024-03-04)\n\n* **Bug Fix**: Correct a typo in internal AddAsIsPresigningMiddleware API.\n\n# v1.11.2 (2024-02-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.1 (2024-02-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.0 (2024-02-13)\n\n* **Feature**: Bump minimum Go version to 1.20 per our language support policy.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.10 (2024-01-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.9 (2023-12-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.8 (2023-12-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.7 (2023-11-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.6 (2023-11-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.5 (2023-11-28.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.4 (2023-11-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.3 (2023-11-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.2 (2023-11-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.1 (2023-11-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.0 (2023-10-31)\n\n* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.37 (2023-10-12)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.36 (2023-10-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.35 (2023-08-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.34 (2023-08-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.33 (2023-08-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.32 (2023-08-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.31 (2023-07-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.30 (2023-07-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.29 (2023-07-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.28 (2023-06-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.27 (2023-04-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.26 (2023-04-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.25 (2023-03-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.24 (2023-03-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.23 (2023-02-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.22 (2023-02-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.21 (2022-12-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.20 (2022-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.19 (2022-10-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.18 (2022-10-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.17 (2022-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.16 (2022-09-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.15 (2022-09-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.14 (2022-08-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.13 (2022-08-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.12 (2022-08-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.11 (2022-08-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.10 (2022-08-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.9 (2022-08-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.8 (2022-07-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.7 (2022-06-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.6 (2022-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.5 (2022-05-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.4 (2022-04-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.3 (2022-03-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.2 (2022-03-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.1 (2022-03-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.0 (2022-03-08)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.8.0 (2022-02-24)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.7.0 (2022-01-14)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.6.0 (2022-01-07)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.2 (2021-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.1 (2021-11-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.0 (2021-11-06)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.0 (2021-10-21)\n\n* **Feature**: Updated  to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.2 (2021-10-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.1 (2021-09-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.0 (2021-08-27)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.3 (2021-08-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.2 (2021-08-04)\n\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.1 (2021-07-15)\n\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.2.0 (2021-06-25)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.1 (2021-05-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.1.0 (2021-05-14)\n\n* **Feature**: Constant has been added to modules to enable runtime version inspection for reporting.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/context.go",
    "content": "package presignedurl\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\n// WithIsPresigning adds the isPresigning sentinel value to a context to signal\n// that the middleware stack is using the presign flow.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc WithIsPresigning(ctx context.Context) context.Context {\n\treturn middleware.WithStackValue(ctx, isPresigningKey{}, true)\n}\n\n// GetIsPresigning returns if the context contains the isPresigning sentinel\n// value for presigning flows.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc GetIsPresigning(ctx context.Context) bool {\n\tv, _ := middleware.GetStackValue(ctx, isPresigningKey{}).(bool)\n\treturn v\n}\n\ntype isPresigningKey struct{}\n\n// AddAsIsPresigningMiddleware adds a middleware to the head of the stack that\n// will update the stack's context to be flagged as being invoked for the\n// purpose of presigning.\nfunc AddAsIsPresigningMiddleware(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(asIsPresigningMiddleware{}, middleware.Before)\n}\n\n// AddAsIsPresigingMiddleware is an alias for backwards compatibility.\n//\n// Deprecated: This API was released with a typo. Use\n// [AddAsIsPresigningMiddleware] instead.\nfunc AddAsIsPresigingMiddleware(stack *middleware.Stack) error {\n\treturn AddAsIsPresigningMiddleware(stack)\n}\n\ntype asIsPresigningMiddleware struct{}\n\nfunc (asIsPresigningMiddleware) ID() string { return \"AsIsPresigningMiddleware\" }\n\nfunc (asIsPresigningMiddleware) HandleInitialize(\n\tctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler,\n) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tctx = WithIsPresigning(ctx)\n\treturn next.HandleInitialize(ctx, in)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/doc.go",
    "content": "// Package presignedurl provides the customizations for API clients to fill in\n// presigned URLs into input parameters.\npackage presignedurl\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go",
    "content": "// Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT.\n\npackage presignedurl\n\n// goModuleVersion is the tagged release for this module\nconst goModuleVersion = \"1.12.15\"\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/middleware.go",
    "content": "package presignedurl\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\tv4 \"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\n// URLPresigner provides the interface to presign the input parameters in to a\n// presigned URL.\ntype URLPresigner interface {\n\t// PresignURL presigns a URL.\n\tPresignURL(ctx context.Context, srcRegion string, params interface{}) (*v4.PresignedHTTPRequest, error)\n}\n\n// ParameterAccessor provides an collection of accessor to for retrieving and\n// setting the values needed to PresignedURL generation\ntype ParameterAccessor struct {\n\t// GetPresignedURL accessor points to a function that retrieves a presigned url if present\n\tGetPresignedURL func(interface{}) (string, bool, error)\n\n\t// GetSourceRegion accessor points to a function that retrieves source region for presigned url\n\tGetSourceRegion func(interface{}) (string, bool, error)\n\n\t// CopyInput accessor points to a function that takes in an input, and returns a copy.\n\tCopyInput func(interface{}) (interface{}, error)\n\n\t// SetDestinationRegion accessor points to a function that sets destination region on api input struct\n\tSetDestinationRegion func(interface{}, string) error\n\n\t// SetPresignedURL accessor points to a function that sets presigned url on api input struct\n\tSetPresignedURL func(interface{}, string) error\n}\n\n// Options provides the set of options needed by the presigned URL middleware.\ntype Options struct {\n\t// Accessor are the parameter accessors used by this middleware\n\tAccessor ParameterAccessor\n\n\t// Presigner is the URLPresigner used by the middleware\n\tPresigner URLPresigner\n}\n\n// AddMiddleware adds the Presign URL middleware to the middleware stack.\nfunc AddMiddleware(stack *middleware.Stack, opts Options) error {\n\treturn stack.Initialize.Add(&presign{options: opts}, middleware.Before)\n}\n\n// RemoveMiddleware removes the Presign URL middleware from the stack.\nfunc RemoveMiddleware(stack *middleware.Stack) error {\n\t_, err := stack.Initialize.Remove((*presign)(nil).ID())\n\treturn err\n}\n\ntype presign struct {\n\toptions Options\n}\n\nfunc (m *presign) ID() string { return \"Presign\" }\n\nfunc (m *presign) HandleInitialize(\n\tctx context.Context, input middleware.InitializeInput, next middleware.InitializeHandler,\n) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\t// If PresignedURL is already set ignore middleware.\n\tif _, ok, err := m.options.Accessor.GetPresignedURL(input.Parameters); err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"presign middleware failed, %w\", err)\n\t} else if ok {\n\t\treturn next.HandleInitialize(ctx, input)\n\t}\n\n\t// If have source region is not set ignore middleware.\n\tsrcRegion, ok, err := m.options.Accessor.GetSourceRegion(input.Parameters)\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"presign middleware failed, %w\", err)\n\t} else if !ok || len(srcRegion) == 0 {\n\t\treturn next.HandleInitialize(ctx, input)\n\t}\n\n\t// Create a copy of the original input so the destination region value can\n\t// be added. This ensures that value does not leak into the original\n\t// request parameters.\n\tparamCpy, err := m.options.Accessor.CopyInput(input.Parameters)\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"unable to create presigned URL, %w\", err)\n\t}\n\n\t// Destination region is the API client's configured region.\n\tdstRegion := awsmiddleware.GetRegion(ctx)\n\tif err = m.options.Accessor.SetDestinationRegion(paramCpy, dstRegion); err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"presign middleware failed, %w\", err)\n\t}\n\n\tpresignedReq, err := m.options.Presigner.PresignURL(ctx, srcRegion, paramCpy)\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"unable to create presigned URL, %w\", err)\n\t}\n\n\t// Update the original input with the presigned URL value.\n\tif err = m.options.Accessor.SetPresignedURL(input.Parameters, presignedReq.URL); err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"presign middleware failed, %w\", err)\n\t}\n\n\treturn next.HandleInitialize(ctx, input)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/CHANGELOG.md",
    "content": "# v1.18.15 (2025-02-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.14 (2025-02-18)\n\n* **Bug Fix**: Bump go version to 1.22\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.13 (2025-02-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.12 (2025-01-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.11 (2025-01-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.10 (2025-01-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n* **Dependency Update**: Upgrade to smithy-go v1.22.2.\n\n# v1.18.9 (2025-01-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.8 (2025-01-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.7 (2024-12-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.6 (2024-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.5 (2024-11-18)\n\n* **Dependency Update**: Update to smithy-go v1.22.1.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.4 (2024-11-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.3 (2024-10-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.2 (2024-10-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.1 (2024-10-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.18.0 (2024-10-04)\n\n* **Feature**: Add support for HTTP client metrics.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.18 (2024-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.17 (2024-09-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.16 (2024-08-15)\n\n* **Dependency Update**: Bump minimum Go version to 1.21.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.15 (2024-07-10.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.14 (2024-07-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.13 (2024-06-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.12 (2024-06-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.11 (2024-06-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.10 (2024-06-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.9 (2024-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.8 (2024-06-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.7 (2024-05-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.6 (2024-05-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.5 (2024-03-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.4 (2024-03-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.3 (2024-03-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.2 (2024-02-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.1 (2024-02-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.0 (2024-02-13)\n\n* **Feature**: Bump minimum Go version to 1.20 per our language support policy.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.10 (2024-01-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.9 (2023-12-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.8 (2023-12-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.7 (2023-11-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.6 (2023-11-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.5 (2023-11-28.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.4 (2023-11-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.3 (2023-11-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.2 (2023-11-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.1 (2023-11-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.0 (2023-10-31)\n\n* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.6 (2023-10-12)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.5 (2023-10-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.4 (2023-08-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.3 (2023-08-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.2 (2023-08-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.1 (2023-08-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.0 (2023-07-31)\n\n* **Feature**: Adds support for smithy-modeled endpoint resolution. A new rules-based endpoint resolution will be added to the SDK which will supercede and deprecate existing endpoint resolution. Specifically, EndpointResolver will be deprecated while BaseEndpoint and EndpointResolverV2 will take its place. For more information, please see the Endpoints section in our Developer Guide.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.5 (2023-07-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.4 (2023-07-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.3 (2023-06-13)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.2 (2023-04-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.1 (2023-04-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.0 (2023-03-21)\n\n* **Feature**: port v1 sdk 100-continue http header customization for s3 PutObject/UploadPart request and enable user config\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.24 (2023-03-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.23 (2023-02-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.22 (2023-02-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.21 (2022-12-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.20 (2022-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.19 (2022-10-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.18 (2022-10-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.17 (2022-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.16 (2022-09-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.15 (2022-09-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.14 (2022-08-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.13 (2022-08-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.12 (2022-08-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.11 (2022-08-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.10 (2022-08-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.9 (2022-08-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.8 (2022-07-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.7 (2022-06-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.6 (2022-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.5 (2022-05-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.4 (2022-04-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.3 (2022-03-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.2 (2022-03-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.1 (2022-03-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.0 (2022-03-08)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.0 (2022-02-24)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.0 (2022-01-14)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.0 (2022-01-07)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.2 (2021-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.1 (2021-11-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.0 (2021-11-06)\n\n* **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically.\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.8.0 (2021-10-21)\n\n* **Feature**: Updated  to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.7.2 (2021-10-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.7.1 (2021-09-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.7.0 (2021-09-02)\n\n* **Feature**: Add support for S3 Multi-Region Access Point ARNs.\n\n# v1.6.0 (2021-08-27)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.3 (2021-08-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.2 (2021-08-04)\n\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.1 (2021-07-15)\n\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.5.0 (2021-06-25)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.4.0 (2021-06-04)\n\n* **Feature**: The handling of AccessPoint and Outpost ARNs have been updated.\n\n# v1.3.1 (2021-05-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.3.0 (2021-05-14)\n\n* **Feature**: Constant has been added to modules to enable runtime version inspection for reporting.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/arn/accesspoint_arn.go",
    "content": "package arn\n\nimport (\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws/arn\"\n)\n\n// AccessPointARN provides representation\ntype AccessPointARN struct {\n\tarn.ARN\n\tAccessPointName string\n}\n\n// GetARN returns the base ARN for the Access Point resource\nfunc (a AccessPointARN) GetARN() arn.ARN {\n\treturn a.ARN\n}\n\n// ParseAccessPointResource attempts to parse the ARN's resource as an\n// AccessPoint resource.\n//\n// Supported Access point resource format:\n//   - Access point format: arn:{partition}:s3:{region}:{accountId}:accesspoint/{accesspointName}\n//   - example: arn:aws:s3:us-west-2:012345678901:accesspoint/myaccesspoint\nfunc ParseAccessPointResource(a arn.ARN, resParts []string) (AccessPointARN, error) {\n\tif isFIPS(a.Region) {\n\t\treturn AccessPointARN{}, InvalidARNError{ARN: a, Reason: \"FIPS region not allowed in ARN\"}\n\t}\n\tif len(a.AccountID) == 0 {\n\t\treturn AccessPointARN{}, InvalidARNError{ARN: a, Reason: \"account-id not set\"}\n\t}\n\tif len(resParts) == 0 {\n\t\treturn AccessPointARN{}, InvalidARNError{ARN: a, Reason: \"resource-id not set\"}\n\t}\n\tif len(resParts) > 1 {\n\t\treturn AccessPointARN{}, InvalidARNError{ARN: a, Reason: \"sub resource not supported\"}\n\t}\n\n\tresID := resParts[0]\n\tif len(strings.TrimSpace(resID)) == 0 {\n\t\treturn AccessPointARN{}, InvalidARNError{ARN: a, Reason: \"resource-id not set\"}\n\t}\n\n\treturn AccessPointARN{\n\t\tARN:             a,\n\t\tAccessPointName: resID,\n\t}, nil\n}\n\nfunc isFIPS(region string) bool {\n\treturn strings.HasPrefix(region, \"fips-\") || strings.HasSuffix(region, \"-fips\")\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/arn/arn.go",
    "content": "package arn\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws/arn\"\n)\n\nvar supportedServiceARN = []string{\n\t\"s3\",\n\t\"s3-outposts\",\n\t\"s3-object-lambda\",\n}\n\nfunc isSupportedServiceARN(service string) bool {\n\tfor _, name := range supportedServiceARN {\n\t\tif name == service {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// Resource provides the interfaces abstracting ARNs of specific resource\n// types.\ntype Resource interface {\n\tGetARN() arn.ARN\n\tString() string\n}\n\n// ResourceParser provides the function for parsing an ARN's resource\n// component into a typed resource.\ntype ResourceParser func(arn.ARN) (Resource, error)\n\n// ParseResource parses an AWS ARN into a typed resource for the S3 API.\nfunc ParseResource(a arn.ARN, resParser ResourceParser) (resARN Resource, err error) {\n\tif len(a.Partition) == 0 {\n\t\treturn nil, InvalidARNError{ARN: a, Reason: \"partition not set\"}\n\t}\n\n\tif !isSupportedServiceARN(a.Service) {\n\t\treturn nil, InvalidARNError{ARN: a, Reason: \"service is not supported\"}\n\t}\n\n\tif len(a.Resource) == 0 {\n\t\treturn nil, InvalidARNError{ARN: a, Reason: \"resource not set\"}\n\t}\n\n\treturn resParser(a)\n}\n\n// SplitResource splits the resource components by the ARN resource delimiters.\nfunc SplitResource(v string) []string {\n\tvar parts []string\n\tvar offset int\n\n\tfor offset <= len(v) {\n\t\tidx := strings.IndexAny(v[offset:], \"/:\")\n\t\tif idx < 0 {\n\t\t\tparts = append(parts, v[offset:])\n\t\t\tbreak\n\t\t}\n\t\tparts = append(parts, v[offset:idx+offset])\n\t\toffset += idx + 1\n\t}\n\n\treturn parts\n}\n\n// IsARN returns whether the given string is an ARN\nfunc IsARN(s string) bool {\n\treturn arn.IsARN(s)\n}\n\n// InvalidARNError provides the error for an invalid ARN error.\ntype InvalidARNError struct {\n\tARN    arn.ARN\n\tReason string\n}\n\n// Error returns a string denoting the occurred InvalidARNError\nfunc (e InvalidARNError) Error() string {\n\treturn fmt.Sprintf(\"invalid Amazon %s ARN, %s, %s\", e.ARN.Service, e.Reason, e.ARN.String())\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/arn/arn_member.go",
    "content": "package arn\n\nimport \"fmt\"\n\n// arnable is implemented by the relevant S3/S3Control\n// operations which have members that may need ARN\n// processing.\ntype arnable interface {\n\tSetARNMember(string) error\n\tGetARNMember() (*string, bool)\n}\n\n// GetARNField would be called during middleware execution\n// to retrieve a member value that is an ARN in need of\n// processing.\nfunc GetARNField(input interface{}) (*string, bool) {\n\tv, ok := input.(arnable)\n\tif !ok {\n\t\treturn nil, false\n\t}\n\treturn v.GetARNMember()\n}\n\n// SetARNField would called during middleware exeuction\n// to set a member value that required ARN processing.\nfunc SetARNField(input interface{}, v string) error {\n\tparams, ok := input.(arnable)\n\tif !ok {\n\t\treturn fmt.Errorf(\"Params does not contain arn field member\")\n\t}\n\treturn params.SetARNMember(v)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/arn/outpost_arn.go",
    "content": "package arn\n\nimport (\n\t\"strings\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws/arn\"\n)\n\n// OutpostARN interface that should be satisfied by outpost ARNs\ntype OutpostARN interface {\n\tResource\n\tGetOutpostID() string\n}\n\n// ParseOutpostARNResource will parse a provided ARNs resource using the appropriate ARN format\n// and return a specific OutpostARN type\n//\n// Currently supported outpost ARN formats:\n// * Outpost AccessPoint ARN format:\n//   - ARN format: arn:{partition}:s3-outposts:{region}:{accountId}:outpost/{outpostId}/accesspoint/{accesspointName}\n//   - example: arn:aws:s3-outposts:us-west-2:012345678901:outpost/op-1234567890123456/accesspoint/myaccesspoint\n//\n// * Outpost Bucket ARN format:\n//   - ARN format: arn:{partition}:s3-outposts:{region}:{accountId}:outpost/{outpostId}/bucket/{bucketName}\n//   - example: arn:aws:s3-outposts:us-west-2:012345678901:outpost/op-1234567890123456/bucket/mybucket\n//\n// Other outpost ARN formats may be supported and added in the future.\nfunc ParseOutpostARNResource(a arn.ARN, resParts []string) (OutpostARN, error) {\n\tif len(a.Region) == 0 {\n\t\treturn nil, InvalidARNError{ARN: a, Reason: \"region not set\"}\n\t}\n\n\tif isFIPS(a.Region) {\n\t\treturn nil, InvalidARNError{ARN: a, Reason: \"FIPS region not allowed in ARN\"}\n\t}\n\n\tif len(a.AccountID) == 0 {\n\t\treturn nil, InvalidARNError{ARN: a, Reason: \"account-id not set\"}\n\t}\n\n\t// verify if outpost id is present and valid\n\tif len(resParts) == 0 || len(strings.TrimSpace(resParts[0])) == 0 {\n\t\treturn nil, InvalidARNError{ARN: a, Reason: \"outpost resource-id not set\"}\n\t}\n\n\t// verify possible resource type exists\n\tif len(resParts) < 3 {\n\t\treturn nil, InvalidARNError{\n\t\t\tARN: a, Reason: \"incomplete outpost resource type. Expected bucket or access-point resource to be present\",\n\t\t}\n\t}\n\n\t// Since we know this is a OutpostARN fetch outpostID\n\toutpostID := strings.TrimSpace(resParts[0])\n\n\tswitch resParts[1] {\n\tcase \"accesspoint\":\n\t\taccesspointARN, err := ParseAccessPointResource(a, resParts[2:])\n\t\tif err != nil {\n\t\t\treturn OutpostAccessPointARN{}, err\n\t\t}\n\t\treturn OutpostAccessPointARN{\n\t\t\tAccessPointARN: accesspointARN,\n\t\t\tOutpostID:      outpostID,\n\t\t}, nil\n\n\tcase \"bucket\":\n\t\tbucketName, err := parseBucketResource(a, resParts[2:])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn OutpostBucketARN{\n\t\t\tARN:        a,\n\t\t\tBucketName: bucketName,\n\t\t\tOutpostID:  outpostID,\n\t\t}, nil\n\n\tdefault:\n\t\treturn nil, InvalidARNError{ARN: a, Reason: \"unknown resource set for outpost ARN\"}\n\t}\n}\n\n// OutpostAccessPointARN represents outpost access point ARN.\ntype OutpostAccessPointARN struct {\n\tAccessPointARN\n\tOutpostID string\n}\n\n// GetOutpostID returns the outpost id of outpost access point arn\nfunc (o OutpostAccessPointARN) GetOutpostID() string {\n\treturn o.OutpostID\n}\n\n// OutpostBucketARN represents the outpost bucket ARN.\ntype OutpostBucketARN struct {\n\tarn.ARN\n\tBucketName string\n\tOutpostID  string\n}\n\n// GetOutpostID returns the outpost id of outpost bucket arn\nfunc (o OutpostBucketARN) GetOutpostID() string {\n\treturn o.OutpostID\n}\n\n// GetARN retrives the base ARN from outpost bucket ARN resource\nfunc (o OutpostBucketARN) GetARN() arn.ARN {\n\treturn o.ARN\n}\n\n// parseBucketResource attempts to parse the ARN's bucket resource and retrieve the\n// bucket resource id.\n//\n// parseBucketResource only parses the bucket resource id.\nfunc parseBucketResource(a arn.ARN, resParts []string) (bucketName string, err error) {\n\tif len(resParts) == 0 {\n\t\treturn bucketName, InvalidARNError{ARN: a, Reason: \"bucket resource-id not set\"}\n\t}\n\tif len(resParts) > 1 {\n\t\treturn bucketName, InvalidARNError{ARN: a, Reason: \"sub resource not supported\"}\n\t}\n\n\tbucketName = strings.TrimSpace(resParts[0])\n\tif len(bucketName) == 0 {\n\t\treturn bucketName, InvalidARNError{ARN: a, Reason: \"bucket resource-id not set\"}\n\t}\n\treturn bucketName, err\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/arn/s3_object_lambda_arn.go",
    "content": "package arn\n\n// S3ObjectLambdaARN represents an ARN for the s3-object-lambda service\ntype S3ObjectLambdaARN interface {\n\tResource\n\n\tisS3ObjectLambdasARN()\n}\n\n// S3ObjectLambdaAccessPointARN is an S3ObjectLambdaARN for the Access Point resource type\ntype S3ObjectLambdaAccessPointARN struct {\n\tAccessPointARN\n}\n\nfunc (s S3ObjectLambdaAccessPointARN) isS3ObjectLambdasARN() {}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/arn_lookup.go",
    "content": "package s3shared\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/aws/smithy-go/middleware\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws/arn\"\n)\n\n// ARNLookup is the initial middleware that looks up if an arn is provided.\n// This middleware is responsible for fetching ARN from a arnable field, and registering the ARN on\n// middleware context. This middleware must be executed before input validation step or any other\n// arn processing middleware.\ntype ARNLookup struct {\n\n\t// GetARNValue takes in a input interface and returns a ptr to string and a bool\n\tGetARNValue func(interface{}) (*string, bool)\n}\n\n// ID for the middleware\nfunc (m *ARNLookup) ID() string {\n\treturn \"S3Shared:ARNLookup\"\n}\n\n// HandleInitialize handles the behavior of this initialize step\nfunc (m *ARNLookup) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\t// check if GetARNValue is supported\n\tif m.GetARNValue == nil {\n\t\treturn next.HandleInitialize(ctx, in)\n\t}\n\n\t// check is input resource is an ARN; if not go to next\n\tv, ok := m.GetARNValue(in.Parameters)\n\tif !ok || v == nil || !arn.IsARN(*v) {\n\t\treturn next.HandleInitialize(ctx, in)\n\t}\n\n\t// if ARN process ResourceRequest and put it on ctx\n\tav, err := arn.Parse(*v)\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"error parsing arn: %w\", err)\n\t}\n\t// set parsed arn on context\n\tctx = setARNResourceOnContext(ctx, av)\n\n\treturn next.HandleInitialize(ctx, in)\n}\n\n// arnResourceKey is the key set on context used to identify, retrive an ARN resource\n// if present on the context.\ntype arnResourceKey struct{}\n\n// SetARNResourceOnContext sets the S3 ARN on the context.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc setARNResourceOnContext(ctx context.Context, value arn.ARN) context.Context {\n\treturn middleware.WithStackValue(ctx, arnResourceKey{}, value)\n}\n\n// GetARNResourceFromContext returns an ARN from context and a bool indicating\n// presence of ARN on ctx.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc GetARNResourceFromContext(ctx context.Context) (arn.ARN, bool) {\n\tv, ok := middleware.GetStackValue(ctx, arnResourceKey{}).(arn.ARN)\n\treturn v, ok\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/config/config.go",
    "content": "package config\n\nimport \"context\"\n\n// UseARNRegionProvider is an interface for retrieving external configuration value for UseARNRegion\ntype UseARNRegionProvider interface {\n\tGetS3UseARNRegion(ctx context.Context) (value bool, found bool, err error)\n}\n\n// DisableMultiRegionAccessPointsProvider is an interface for retrieving external configuration value for DisableMultiRegionAccessPoints\ntype DisableMultiRegionAccessPointsProvider interface {\n\tGetS3DisableMultiRegionAccessPoints(ctx context.Context) (value bool, found bool, err error)\n}\n\n// ResolveUseARNRegion extracts the first instance of a UseARNRegion from the config slice.\n// Additionally returns a boolean to indicate if the value was found in provided configs, and error if one is encountered.\nfunc ResolveUseARNRegion(ctx context.Context, configs []interface{}) (value bool, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(UseARNRegionProvider); ok {\n\t\t\tvalue, found, err = p.GetS3UseARNRegion(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// ResolveDisableMultiRegionAccessPoints extracts the first instance of a DisableMultiRegionAccessPoints from the config slice.\n// Additionally returns a boolean to indicate if the value was found in provided configs, and error if one is encountered.\nfunc ResolveDisableMultiRegionAccessPoints(ctx context.Context, configs []interface{}) (value bool, found bool, err error) {\n\tfor _, cfg := range configs {\n\t\tif p, ok := cfg.(DisableMultiRegionAccessPointsProvider); ok {\n\t\t\tvalue, found, err = p.GetS3DisableMultiRegionAccessPoints(ctx)\n\t\t\tif err != nil || found {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/endpoint_error.go",
    "content": "package s3shared\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/aws/aws-sdk-go-v2/service/internal/s3shared/arn\"\n)\n\n// TODO: fix these error statements to be relevant to v2 sdk\n\nconst (\n\tinvalidARNErrorErrCode    = \"InvalidARNError\"\n\tconfigurationErrorErrCode = \"ConfigurationError\"\n)\n\n// InvalidARNError denotes the error for Invalid ARN\ntype InvalidARNError struct {\n\tmessage  string\n\tresource arn.Resource\n\torigErr  error\n}\n\n// Error returns the InvalidARN error string\nfunc (e InvalidARNError) Error() string {\n\tvar extra string\n\tif e.resource != nil {\n\t\textra = \"ARN: \" + e.resource.String()\n\t}\n\tmsg := invalidARNErrorErrCode + \" : \" + e.message\n\tif extra != \"\" {\n\t\tmsg = msg + \"\\n\\t\" + extra\n\t}\n\n\treturn msg\n}\n\n// OrigErr is the original error wrapped by Invalid ARN Error\nfunc (e InvalidARNError) Unwrap() error {\n\treturn e.origErr\n}\n\n// NewInvalidARNError denotes invalid arn error\nfunc NewInvalidARNError(resource arn.Resource, err error) InvalidARNError {\n\treturn InvalidARNError{\n\t\tmessage:  \"invalid ARN\",\n\t\torigErr:  err,\n\t\tresource: resource,\n\t}\n}\n\n// NewInvalidARNWithUnsupportedPartitionError ARN not supported for the target partition\nfunc NewInvalidARNWithUnsupportedPartitionError(resource arn.Resource, err error) InvalidARNError {\n\treturn InvalidARNError{\n\t\tmessage:  \"resource ARN not supported for the target ARN partition\",\n\t\torigErr:  err,\n\t\tresource: resource,\n\t}\n}\n\n// NewInvalidARNWithFIPSError ARN not supported for FIPS region\n//\n// Deprecated: FIPS will not appear in the ARN region component.\nfunc NewInvalidARNWithFIPSError(resource arn.Resource, err error) InvalidARNError {\n\treturn InvalidARNError{\n\t\tmessage:  \"resource ARN not supported for FIPS region\",\n\t\tresource: resource,\n\t\torigErr:  err,\n\t}\n}\n\n// ConfigurationError is used to denote a client configuration error\ntype ConfigurationError struct {\n\tmessage           string\n\tresource          arn.Resource\n\tclientPartitionID string\n\tclientRegion      string\n\torigErr           error\n}\n\n// Error returns the Configuration error string\nfunc (e ConfigurationError) Error() string {\n\textra := fmt.Sprintf(\"ARN: %s, client partition: %s, client region: %s\",\n\t\te.resource, e.clientPartitionID, e.clientRegion)\n\n\tmsg := configurationErrorErrCode + \" : \" + e.message\n\tif extra != \"\" {\n\t\tmsg = msg + \"\\n\\t\" + extra\n\t}\n\treturn msg\n}\n\n// OrigErr is the original error wrapped by Configuration Error\nfunc (e ConfigurationError) Unwrap() error {\n\treturn e.origErr\n}\n\n// NewClientPartitionMismatchError  stub\nfunc NewClientPartitionMismatchError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError {\n\treturn ConfigurationError{\n\t\tmessage:           \"client partition does not match provided ARN partition\",\n\t\torigErr:           err,\n\t\tresource:          resource,\n\t\tclientPartitionID: clientPartitionID,\n\t\tclientRegion:      clientRegion,\n\t}\n}\n\n// NewClientRegionMismatchError denotes cross region access error\nfunc NewClientRegionMismatchError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError {\n\treturn ConfigurationError{\n\t\tmessage:           \"client region does not match provided ARN region\",\n\t\torigErr:           err,\n\t\tresource:          resource,\n\t\tclientPartitionID: clientPartitionID,\n\t\tclientRegion:      clientRegion,\n\t}\n}\n\n// NewFailedToResolveEndpointError denotes endpoint resolving error\nfunc NewFailedToResolveEndpointError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError {\n\treturn ConfigurationError{\n\t\tmessage:           \"endpoint resolver failed to find an endpoint for the provided ARN region\",\n\t\torigErr:           err,\n\t\tresource:          resource,\n\t\tclientPartitionID: clientPartitionID,\n\t\tclientRegion:      clientRegion,\n\t}\n}\n\n// NewClientConfiguredForFIPSError denotes client config error for unsupported cross region FIPS access\nfunc NewClientConfiguredForFIPSError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError {\n\treturn ConfigurationError{\n\t\tmessage:           \"client configured for fips but cross-region resource ARN provided\",\n\t\torigErr:           err,\n\t\tresource:          resource,\n\t\tclientPartitionID: clientPartitionID,\n\t\tclientRegion:      clientRegion,\n\t}\n}\n\n// NewFIPSConfigurationError denotes a configuration error when a client or request is configured for FIPS\nfunc NewFIPSConfigurationError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError {\n\treturn ConfigurationError{\n\t\tmessage:           \"use of ARN is not supported when client or request is configured for FIPS\",\n\t\torigErr:           err,\n\t\tresource:          resource,\n\t\tclientPartitionID: clientPartitionID,\n\t\tclientRegion:      clientRegion,\n\t}\n}\n\n// NewClientConfiguredForAccelerateError denotes client config error for unsupported S3 accelerate\nfunc NewClientConfiguredForAccelerateError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError {\n\treturn ConfigurationError{\n\t\tmessage:           \"client configured for S3 Accelerate but is not supported with resource ARN\",\n\t\torigErr:           err,\n\t\tresource:          resource,\n\t\tclientPartitionID: clientPartitionID,\n\t\tclientRegion:      clientRegion,\n\t}\n}\n\n// NewClientConfiguredForCrossRegionFIPSError denotes client config error for unsupported cross region FIPS request\nfunc NewClientConfiguredForCrossRegionFIPSError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError {\n\treturn ConfigurationError{\n\t\tmessage:           \"client configured for FIPS with cross-region enabled but is supported with cross-region resource ARN\",\n\t\torigErr:           err,\n\t\tresource:          resource,\n\t\tclientPartitionID: clientPartitionID,\n\t\tclientRegion:      clientRegion,\n\t}\n}\n\n// NewClientConfiguredForDualStackError denotes client config error for unsupported S3 Dual-stack\nfunc NewClientConfiguredForDualStackError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError {\n\treturn ConfigurationError{\n\t\tmessage:           \"client configured for S3 Dual-stack but is not supported with resource ARN\",\n\t\torigErr:           err,\n\t\tresource:          resource,\n\t\tclientPartitionID: clientPartitionID,\n\t\tclientRegion:      clientRegion,\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/go_module_metadata.go",
    "content": "// Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT.\n\npackage s3shared\n\n// goModuleVersion is the tagged release for this module\nconst goModuleVersion = \"1.18.15\"\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/host_id.go",
    "content": "package s3shared\n\nimport (\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\n// hostID is used to retrieve host id from response metadata\ntype hostID struct {\n}\n\n// SetHostIDMetadata sets the provided host id over middleware metadata\nfunc SetHostIDMetadata(metadata *middleware.Metadata, id string) {\n\tmetadata.Set(hostID{}, id)\n}\n\n// GetHostIDMetadata retrieves the host id from middleware metadata\n// returns host id as string along with a boolean indicating presence of\n// hostId on middleware metadata.\nfunc GetHostIDMetadata(metadata middleware.Metadata) (string, bool) {\n\tif !metadata.Has(hostID{}) {\n\t\treturn \"\", false\n\t}\n\n\tv, ok := metadata.Get(hostID{}).(string)\n\tif !ok {\n\t\treturn \"\", true\n\t}\n\treturn v, true\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/metadata.go",
    "content": "package s3shared\n\nimport (\n\t\"context\"\n\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\n// clonedInputKey used to denote if request input was cloned.\ntype clonedInputKey struct{}\n\n// SetClonedInputKey sets a key on context to denote input was cloned previously.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc SetClonedInputKey(ctx context.Context, value bool) context.Context {\n\treturn middleware.WithStackValue(ctx, clonedInputKey{}, value)\n}\n\n// IsClonedInput retrieves if context key for cloned input was set.\n// If set, we can infer that the reuqest input was cloned previously.\n//\n// Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues\n// to clear all stack values.\nfunc IsClonedInput(ctx context.Context) bool {\n\tv, _ := middleware.GetStackValue(ctx, clonedInputKey{}).(bool)\n\treturn v\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/metadata_retriever.go",
    "content": "package s3shared\n\nimport (\n\t\"context\"\n\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nconst metadataRetrieverID = \"S3MetadataRetriever\"\n\n// AddMetadataRetrieverMiddleware adds request id, host id retriever middleware\nfunc AddMetadataRetrieverMiddleware(stack *middleware.Stack) error {\n\t// add metadata retriever middleware before operation deserializers so that it can retrieve metadata such as\n\t// host id, request id from response header returned by operation deserializers\n\treturn stack.Deserialize.Insert(&metadataRetriever{}, \"OperationDeserializer\", middleware.Before)\n}\n\ntype metadataRetriever struct {\n}\n\n// ID returns the middleware identifier\nfunc (m *metadataRetriever) ID() string {\n\treturn metadataRetrieverID\n}\n\nfunc (m *metadataRetriever) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\n\tspan, _ := tracing.GetSpan(ctx)\n\n\tresp, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\t// No raw response to wrap with.\n\t\treturn out, metadata, err\n\t}\n\n\t// check for header for Request id\n\tif v := resp.Header.Get(\"X-Amz-Request-Id\"); len(v) != 0 {\n\t\t// set reqID on metadata for successful responses.\n\t\tawsmiddleware.SetRequestIDMetadata(&metadata, v)\n\t\tspan.SetProperty(\"aws.request_id\", v)\n\t}\n\n\t// look up host-id\n\tif v := resp.Header.Get(\"X-Amz-Id-2\"); len(v) != 0 {\n\t\t// set reqID on metadata for successful responses.\n\t\tSetHostIDMetadata(&metadata, v)\n\t\tspan.SetProperty(\"aws.extended_request_id\", v)\n\t}\n\n\treturn out, metadata, err\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/resource_request.go",
    "content": "package s3shared\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\tawsarn \"github.com/aws/aws-sdk-go-v2/aws/arn\"\n\t\"github.com/aws/aws-sdk-go-v2/service/internal/s3shared/arn\"\n)\n\n// ResourceRequest represents an ARN resource and api request metadata\ntype ResourceRequest struct {\n\tResource arn.Resource\n\t// RequestRegion is the region configured on the request config\n\tRequestRegion string\n\n\t// SigningRegion is the signing region resolved for the request\n\tSigningRegion string\n\n\t// PartitionID is the resolved partition id for the provided request region\n\tPartitionID string\n\n\t// UseARNRegion indicates if client should use the region provided in an ARN resource\n\tUseARNRegion bool\n\n\t// UseFIPS indicates if te client is configured for FIPS\n\tUseFIPS bool\n}\n\n// ARN returns the resource ARN\nfunc (r ResourceRequest) ARN() awsarn.ARN {\n\treturn r.Resource.GetARN()\n}\n\n// ResourceConfiguredForFIPS returns true if resource ARNs region is FIPS\n//\n// Deprecated: FIPS will not be present in the ARN region\nfunc (r ResourceRequest) ResourceConfiguredForFIPS() bool {\n\treturn IsFIPS(r.ARN().Region)\n}\n\n// AllowCrossRegion returns a bool value to denote if S3UseARNRegion flag is set\nfunc (r ResourceRequest) AllowCrossRegion() bool {\n\treturn r.UseARNRegion\n}\n\n// IsCrossPartition returns true if request is configured for region of another partition, than\n// the partition that resource ARN region resolves to. IsCrossPartition will not return an error,\n// if request is not configured with a specific partition id. This might happen if customer provides\n// custom endpoint url, but does not associate a partition id with it.\nfunc (r ResourceRequest) IsCrossPartition() (bool, error) {\n\trv := r.PartitionID\n\tif len(rv) == 0 {\n\t\treturn false, nil\n\t}\n\n\tav := r.Resource.GetARN().Partition\n\tif len(av) == 0 {\n\t\treturn false, fmt.Errorf(\"no partition id for provided ARN\")\n\t}\n\n\treturn !strings.EqualFold(rv, av), nil\n}\n\n// IsCrossRegion returns true if request signing region is not same as arn region\nfunc (r ResourceRequest) IsCrossRegion() bool {\n\tv := r.SigningRegion\n\treturn !strings.EqualFold(v, r.Resource.GetARN().Region)\n}\n\n// IsFIPS returns true if region is a fips pseudo-region\n//\n// Deprecated: FIPS should be specified via EndpointOptions.\nfunc IsFIPS(region string) bool {\n\treturn strings.HasPrefix(region, \"fips-\") ||\n\t\tstrings.HasSuffix(region, \"-fips\")\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/response_error.go",
    "content": "package s3shared\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\tawshttp \"github.com/aws/aws-sdk-go-v2/aws/transport/http\"\n)\n\n// ResponseError provides the HTTP centric error type wrapping the underlying error\n// with the HTTP response value and the deserialized RequestID.\ntype ResponseError struct {\n\t*awshttp.ResponseError\n\n\t// HostID associated with response error\n\tHostID string\n}\n\n// ServiceHostID returns the host id associated with Response Error\nfunc (e *ResponseError) ServiceHostID() string { return e.HostID }\n\n// Error returns the formatted error\nfunc (e *ResponseError) Error() string {\n\treturn fmt.Sprintf(\n\t\t\"https response error StatusCode: %d, RequestID: %s, HostID: %s, %v\",\n\t\te.Response.StatusCode, e.RequestID, e.HostID, e.Err)\n}\n\n// As populates target and returns true if the type of target is a error type that\n// the ResponseError embeds, (e.g.S3 HTTP ResponseError)\nfunc (e *ResponseError) As(target interface{}) bool {\n\treturn errors.As(e.ResponseError, target)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/response_error_middleware.go",
    "content": "package s3shared\n\nimport (\n\t\"context\"\n\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\tawshttp \"github.com/aws/aws-sdk-go-v2/aws/transport/http\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// AddResponseErrorMiddleware adds response error wrapper middleware\nfunc AddResponseErrorMiddleware(stack *middleware.Stack) error {\n\t// add error wrapper middleware before request id retriever middleware so that it can wrap the error response\n\t// returned by operation deserializers\n\treturn stack.Deserialize.Insert(&errorWrapper{}, metadataRetrieverID, middleware.Before)\n}\n\ntype errorWrapper struct {\n}\n\n// ID returns the middleware identifier\nfunc (m *errorWrapper) ID() string {\n\treturn \"ResponseErrorWrapper\"\n}\n\nfunc (m *errorWrapper) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err == nil {\n\t\t// Nothing to do when there is no error.\n\t\treturn out, metadata, err\n\t}\n\n\tresp, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\t// No raw response to wrap with.\n\t\treturn out, metadata, err\n\t}\n\n\t// look for request id in metadata\n\treqID, _ := awsmiddleware.GetRequestIDMetadata(metadata)\n\t// look for host id in metadata\n\thostID, _ := GetHostIDMetadata(metadata)\n\n\t// Wrap the returned smithy error with the request id retrieved from the metadata\n\terr = &ResponseError{\n\t\tResponseError: &awshttp.ResponseError{\n\t\t\tResponseError: &smithyhttp.ResponseError{\n\t\t\t\tResponse: resp,\n\t\t\t\tErr:      err,\n\t\t\t},\n\t\t\tRequestID: reqID,\n\t\t},\n\t\tHostID: hostID,\n\t}\n\n\treturn out, metadata, err\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/s3100continue.go",
    "content": "package s3shared\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nconst s3100ContinueID = \"S3100Continue\"\nconst default100ContinueThresholdBytes int64 = 1024 * 1024 * 2\n\n// Add100Continue add middleware, which adds {Expect: 100-continue} header for s3 client HTTP PUT request larger than 2MB\n// or with unknown size streaming bodies, during operation builder step\nfunc Add100Continue(stack *middleware.Stack, continueHeaderThresholdBytes int64) error {\n\treturn stack.Build.Add(&s3100Continue{\n\t\tcontinueHeaderThresholdBytes: continueHeaderThresholdBytes,\n\t}, middleware.After)\n}\n\ntype s3100Continue struct {\n\tcontinueHeaderThresholdBytes int64\n}\n\n// ID returns the middleware identifier\nfunc (m *s3100Continue) ID() string {\n\treturn s3100ContinueID\n}\n\nfunc (m *s3100Continue) HandleBuild(\n\tctx context.Context, in middleware.BuildInput, next middleware.BuildHandler,\n) (\n\tout middleware.BuildOutput, metadata middleware.Metadata, err error,\n) {\n\tsizeLimit := default100ContinueThresholdBytes\n\tswitch {\n\tcase m.continueHeaderThresholdBytes == -1:\n\t\treturn next.HandleBuild(ctx, in)\n\tcase m.continueHeaderThresholdBytes > 0:\n\t\tsizeLimit = m.continueHeaderThresholdBytes\n\tdefault:\n\t}\n\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown request type %T\", req)\n\t}\n\n\tif req.ContentLength == -1 || (req.ContentLength == 0 && req.Body != nil) || req.ContentLength >= sizeLimit {\n\t\treq.Header.Set(\"Expect\", \"100-continue\")\n\t}\n\n\treturn next.HandleBuild(ctx, in)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/update_endpoint.go",
    "content": "package s3shared\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\n\tawsmiddle \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n)\n\n// EnableDualstack represents middleware struct for enabling dualstack support\n//\n// Deprecated:  See EndpointResolverOptions' UseDualStackEndpoint support\ntype EnableDualstack struct {\n\t// UseDualstack indicates if dualstack endpoint resolving is to be enabled\n\tUseDualstack bool\n\n\t// DefaultServiceID is the service id prefix used in endpoint resolving\n\t// by default service-id is 's3' and 's3-control' for service s3, s3control.\n\tDefaultServiceID string\n}\n\n// ID returns the middleware ID.\nfunc (*EnableDualstack) ID() string {\n\treturn \"EnableDualstack\"\n}\n\n// HandleSerialize handles serializer middleware behavior when middleware is executed\nfunc (u *EnableDualstack) HandleSerialize(\n\tctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler,\n) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\n\t// check for host name immutable property\n\tif smithyhttp.GetHostnameImmutable(ctx) {\n\t\treturn next.HandleSerialize(ctx, in)\n\t}\n\n\tserviceID := awsmiddle.GetServiceID(ctx)\n\n\t// s3-control may be represented as `S3 Control` as in model\n\tif serviceID == \"S3 Control\" {\n\t\tserviceID = \"s3-control\"\n\t}\n\n\tif len(serviceID) == 0 {\n\t\t// default service id\n\t\tserviceID = u.DefaultServiceID\n\t}\n\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown request type %T\", req)\n\t}\n\n\tif u.UseDualstack {\n\t\tparts := strings.Split(req.URL.Host, \".\")\n\t\tif len(parts) < 3 {\n\t\t\treturn out, metadata, fmt.Errorf(\"unable to update endpoint host for dualstack, hostname invalid, %s\", req.URL.Host)\n\t\t}\n\n\t\tfor i := 0; i+1 < len(parts); i++ {\n\t\t\tif strings.EqualFold(parts[i], serviceID) {\n\t\t\t\tparts[i] = parts[i] + \".dualstack\"\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\t// construct the url host\n\t\treq.URL.Host = strings.Join(parts, \".\")\n\t}\n\n\treturn next.HandleSerialize(ctx, in)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/xml_utils.go",
    "content": "package s3shared\n\nimport (\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"strings\"\n)\n\n// ErrorComponents represents the error response fields\n// that will be deserialized from an xml error response body\ntype ErrorComponents struct {\n\tCode      string `xml:\"Code\"`\n\tMessage   string `xml:\"Message\"`\n\tRequestID string `xml:\"RequestId\"`\n\tHostID    string `xml:\"HostId\"`\n}\n\n// GetUnwrappedErrorResponseComponents returns the error fields from an xml error response body\nfunc GetUnwrappedErrorResponseComponents(r io.Reader) (ErrorComponents, error) {\n\tvar errComponents ErrorComponents\n\tif err := xml.NewDecoder(r).Decode(&errComponents); err != nil && err != io.EOF {\n\t\treturn ErrorComponents{}, fmt.Errorf(\"error while deserializing xml error response : %w\", err)\n\t}\n\treturn errComponents, nil\n}\n\n// GetWrappedErrorResponseComponents returns the error fields from an xml error response body\n// in which error code, and message are wrapped by a <Error> tag\nfunc GetWrappedErrorResponseComponents(r io.Reader) (ErrorComponents, error) {\n\tvar errComponents struct {\n\t\tCode      string `xml:\"Error>Code\"`\n\t\tMessage   string `xml:\"Error>Message\"`\n\t\tRequestID string `xml:\"RequestId\"`\n\t\tHostID    string `xml:\"HostId\"`\n\t}\n\n\tif err := xml.NewDecoder(r).Decode(&errComponents); err != nil && err != io.EOF {\n\t\treturn ErrorComponents{}, fmt.Errorf(\"error while deserializing xml error response : %w\", err)\n\t}\n\n\treturn ErrorComponents{\n\t\tCode:      errComponents.Code,\n\t\tMessage:   errComponents.Message,\n\t\tRequestID: errComponents.RequestID,\n\t\tHostID:    errComponents.HostID,\n\t}, nil\n}\n\n// GetErrorResponseComponents retrieves error components according to passed in options\nfunc GetErrorResponseComponents(r io.Reader, options ErrorResponseDeserializerOptions) (ErrorComponents, error) {\n\tvar errComponents ErrorComponents\n\tvar err error\n\n\tif options.IsWrappedWithErrorTag {\n\t\terrComponents, err = GetWrappedErrorResponseComponents(r)\n\t} else {\n\t\terrComponents, err = GetUnwrappedErrorResponseComponents(r)\n\t}\n\n\tif err != nil {\n\t\treturn ErrorComponents{}, err\n\t}\n\n\t// If an error code or message is not retrieved, it is derived from the http status code\n\t// eg, for S3 service, we derive err code and message, if none is found\n\tif options.UseStatusCode && len(errComponents.Code) == 0 &&\n\t\tlen(errComponents.Message) == 0 {\n\t\t// derive code and message from status code\n\t\tstatusText := http.StatusText(options.StatusCode)\n\t\terrComponents.Code = strings.Replace(statusText, \" \", \"\", -1)\n\t\terrComponents.Message = statusText\n\t}\n\treturn errComponents, nil\n}\n\n// ErrorResponseDeserializerOptions represents error response deserializer options for s3 and s3-control service\ntype ErrorResponseDeserializerOptions struct {\n\t// UseStatusCode denotes if status code should be used to retrieve error code, msg\n\tUseStatusCode bool\n\n\t// StatusCode is status code of error response\n\tStatusCode int\n\n\t//IsWrappedWithErrorTag represents if error response's code, msg is wrapped within an\n\t// additional <Error> tag\n\tIsWrappedWithErrorTag bool\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/CHANGELOG.md",
    "content": "# v1.79.3 (2025-04-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.79.2 (2025-04-10)\n\n* No change notes available for this release.\n\n# v1.79.1 (2025-04-03)\n\n* No change notes available for this release.\n\n# v1.79.0 (2025-03-31)\n\n* **Feature**: Amazon S3 adds support for S3 Access Points for directory buckets in AWS Dedicated Local Zones\n\n# v1.78.2 (2025-03-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.78.1 (2025-03-04.2)\n\n* **Bug Fix**: Add assurance test for operation order.\n\n# v1.78.0 (2025-02-27)\n\n* **Feature**: Track credential providers via User-Agent Feature ids\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.77.1 (2025-02-18)\n\n* **Bug Fix**: Bump go version to 1.22\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.77.0 (2025-02-14)\n\n* **Feature**: Added support for Content-Range header in HeadObject response.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.76.1 (2025-02-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.76.0 (2025-02-06)\n\n* **Feature**: Updated list of the valid AWS Region values for the LocationConstraint parameter for general purpose buckets.\n\n# v1.75.4 (2025-02-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.75.3 (2025-02-04)\n\n* No change notes available for this release.\n\n# v1.75.2 (2025-01-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.75.1 (2025-01-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.75.0 (2025-01-29)\n\n* **Feature**: Change the type of MpuObjectSize in CompleteMultipartUploadRequest from int to long.\n\n# v1.74.1 (2025-01-24)\n\n* **Bug Fix**: Enable request checksum validation mode by default\n* **Dependency Update**: Updated to the latest SDK module versions\n* **Dependency Update**: Upgrade to smithy-go v1.22.2.\n\n# v1.74.0 (2025-01-22)\n\n* **Feature**: Add a client config option to disable logging when output checksum validation is skipped due to an unsupported algorithm.\n\n# v1.73.2 (2025-01-17)\n\n* **Bug Fix**: Fix bug where credentials weren't refreshed during retry loop.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.73.1 (2025-01-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.73.0 (2025-01-15)\n\n* **Feature**: S3 client behavior is updated to always calculate a checksum by default for operations that support it (such as PutObject or UploadPart), or require it (such as DeleteObjects). The checksum algorithm used by default now becomes CRC32. Checksum behavior can be configured using `when_supported` and `when_required` options - in code using RequestChecksumCalculation, in shared config using request_checksum_calculation, or as env variable using AWS_REQUEST_CHECKSUM_CALCULATION. The S3 client attempts to validate response checksums for all S3 API operations that support checksums. However, if the SDK has not implemented the specified checksum algorithm then this validation is skipped. Checksum validation behavior can be configured using `when_supported` and `when_required` options - in code using ResponseChecksumValidation, in shared config using response_checksum_validation, or as env variable using AWS_RESPONSE_CHECKSUM_VALIDATION.\n* **Feature**: This change enhances integrity protections for new SDK requests to S3. S3 SDKs now support the CRC64NVME checksum algorithm, full object checksums for multipart S3 objects, and new default integrity protections for S3 requests.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.72.3 (2025-01-14)\n\n* **Bug Fix**: Fix issue where waiters were not failing on unmatched errors as they should. This may have breaking behavioral changes for users in fringe cases. See [this announcement](https://github.com/aws/aws-sdk-go-v2/discussions/2954) for more information.\n\n# v1.72.2 (2025-01-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.72.1 (2025-01-08)\n\n* No change notes available for this release.\n\n# v1.72.0 (2025-01-03)\n\n* **Feature**: This change is only for updating the model regexp of CopySource which is not for validation but only for documentation and user guide change.\n\n# v1.71.1 (2024-12-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.71.0 (2024-12-03.2)\n\n* **Feature**: Amazon S3 Metadata stores object metadata in read-only, fully managed Apache Iceberg metadata tables that you can query. You can create metadata table configurations for S3 general purpose buckets.\n\n# v1.70.0 (2024-12-02)\n\n* **Feature**: Amazon S3 introduces support for AWS Dedicated Local Zones\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.69.0 (2024-11-25)\n\n* **Feature**: Amazon Simple Storage Service / Features: Add support for ETag based conditional writes in PutObject and CompleteMultiPartUpload APIs to prevent unintended object modifications.\n\n# v1.68.0 (2024-11-21)\n\n* **Feature**: Add support for conditional deletes for the S3 DeleteObject and DeleteObjects APIs. Add support for write offset bytes option used to append to objects with the S3 PutObject API.\n\n# v1.67.1 (2024-11-18)\n\n* **Dependency Update**: Update to smithy-go v1.22.1.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.67.0 (2024-11-14)\n\n* **Feature**: This release updates the ListBuckets API Reference documentation in support of the new 10,000 general purpose bucket default quota on all AWS accounts. To increase your bucket quota from 10,000 to up to 1 million buckets, simply request a quota increase via Service Quotas.\n\n# v1.66.3 (2024-11-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.66.2 (2024-10-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.66.1 (2024-10-25)\n\n* **Bug Fix**: Update presign post URL resolution to use the exact result from EndpointResolverV2\n\n# v1.66.0 (2024-10-16)\n\n* **Feature**: Add support for the new optional bucket-region and prefix query parameters in the ListBuckets API. For ListBuckets requests that express pagination, Amazon S3 will now return both the bucket names and associated AWS regions in the response.\n\n# v1.65.3 (2024-10-11)\n\n* **Bug Fix**: **BREAKING CHANGE**: S3 ReplicationRuleFilter and LifecycleRuleFilter shapes are being changed from union to structure types\n\n# v1.65.2 (2024-10-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.65.1 (2024-10-07)\n\n* **Bug Fix**: **CHANGE IN BEHAVIOR**: Allow serialization of headers with empty string for prefix headers. We are deploying this fix because the behavior is actively preventing users from transmitting keys with empty values to the service. If you were setting metadata keys with empty values before this change, they will now actually be sent to the service.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.65.0 (2024-10-04)\n\n* **Feature**: Add support for HTTP client metrics.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.64.1 (2024-10-03)\n\n* No change notes available for this release.\n\n# v1.64.0 (2024-10-02)\n\n* **Feature**: This release introduces a header representing the minimum object size limit for Lifecycle transitions.\n\n# v1.63.3 (2024-09-27)\n\n* No change notes available for this release.\n\n# v1.63.2 (2024-09-25)\n\n* No change notes available for this release.\n\n# v1.63.1 (2024-09-23)\n\n* No change notes available for this release.\n\n# v1.63.0 (2024-09-20)\n\n* **Feature**: Add tracing and metrics support to service clients.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.62.0 (2024-09-18)\n\n* **Feature**: Added SSE-KMS support for directory buckets.\n\n# v1.61.3 (2024-09-17)\n\n* **Bug Fix**: **BREAKFIX**: Only generate AccountIDEndpointMode config for services that use it. This is a compiler break, but removes no actual functionality, as no services currently use the account ID in endpoint resolution.\n\n# v1.61.2 (2024-09-04)\n\n* No change notes available for this release.\n\n# v1.61.1 (2024-09-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.61.0 (2024-08-28)\n\n* **Feature**: Add presignPost for s3 PutObject\n\n# v1.60.1 (2024-08-22)\n\n* No change notes available for this release.\n\n# v1.60.0 (2024-08-20)\n\n* **Feature**: Amazon Simple Storage Service / Features : Add support for conditional writes for PutObject and CompleteMultipartUpload APIs.\n\n# v1.59.0 (2024-08-15)\n\n* **Feature**: Amazon Simple Storage Service / Features  : Adds support for pagination in the S3 ListBuckets API.\n* **Dependency Update**: Bump minimum Go version to 1.21.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.58.3 (2024-08-02)\n\n* **Bug Fix**: Add assurance tests for auth scheme selection logic.\n\n# v1.58.2 (2024-07-10.2)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.58.1 (2024-07-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.58.0 (2024-07-02)\n\n* **Feature**: Added response overrides to Head Object requests.\n\n# v1.57.1 (2024-06-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.57.0 (2024-06-26)\n\n* **Feature**: Support list-of-string endpoint parameter.\n\n# v1.56.1 (2024-06-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.56.0 (2024-06-18)\n\n* **Feature**: Track usage of various AWS SDK features in user-agent string.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.55.2 (2024-06-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.55.1 (2024-06-07)\n\n* **Bug Fix**: Add clock skew correction on all service clients\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.55.0 (2024-06-05)\n\n* **Feature**: Added new params copySource and key to copyObject API for supporting S3 Access Grants plugin. These changes will not change any of the existing S3 API functionality.\n* **Bug Fix**: Add S3-specific smithy protocol tests.\n\n# v1.54.4 (2024-06-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.54.3 (2024-05-23)\n\n* **Bug Fix**: Prevent parsing failures for nonstandard `Expires` values in responses. If the SDK cannot parse the value set in the response header for this field it will now be returned as `nil`. A new field, `ExpiresString`, has been added that will retain the unparsed value from the response (regardless of whether it came back in a format recognized by the SDK).\n\n# v1.54.2 (2024-05-16)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.54.1 (2024-05-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.54.0 (2024-05-14)\n\n* **Feature**: Updated a few x-id in the http uri traits\n\n# v1.53.2 (2024-05-08)\n\n* **Bug Fix**: GoDoc improvement\n\n# v1.53.1 (2024-03-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.53.0 (2024-03-18)\n\n* **Feature**: Fix two issues with response root node names.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.52.1 (2024-03-15)\n\n* **Documentation**: Documentation updates for Amazon S3.\n\n# v1.52.0 (2024-03-13)\n\n* **Feature**: This release makes the default option for S3 on Outposts request signing to use the SigV4A algorithm when using AWS Common Runtime (CRT).\n\n# v1.51.4 (2024-03-07)\n\n* **Bug Fix**: Remove dependency on go-cmp.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.51.3 (2024-03-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.51.2 (2024-03-04)\n\n* **Bug Fix**: Update internal/presigned-url dependency for corrected API name.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.51.1 (2024-02-23)\n\n* **Bug Fix**: Move all common, SDK-side middleware stack ops into the service client module to prevent cross-module compatibility issues in the future.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.51.0 (2024-02-22)\n\n* **Feature**: Add middleware stack snapshot tests.\n\n# v1.50.3 (2024-02-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.50.2 (2024-02-20)\n\n* **Bug Fix**: When sourcing values for a service's `EndpointParameters`, the lack of a configured region (i.e. `options.Region == \"\"`) will now translate to a `nil` value for `EndpointParameters.Region` instead of a pointer to the empty string `\"\"`. This will result in a much more explicit error when calling an operation instead of an obscure hostname lookup failure.\n\n# v1.50.1 (2024-02-19)\n\n* **Bug Fix**: Prevent potential panic caused by invalid comparison of credentials.\n\n# v1.50.0 (2024-02-16)\n\n* **Feature**: Add new ClientOptions field to waiter config which allows you to extend the config for operation calls made by waiters.\n\n# v1.49.0 (2024-02-13)\n\n* **Feature**: Bump minimum Go version to 1.20 per our language support policy.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.48.1 (2024-01-24)\n\n* No change notes available for this release.\n\n# v1.48.0 (2024-01-05)\n\n* **Feature**: Support smithy sigv4a trait for codegen.\n\n# v1.47.8 (2024-01-04)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.47.7 (2023-12-20)\n\n* No change notes available for this release.\n\n# v1.47.6 (2023-12-18)\n\n* No change notes available for this release.\n\n# v1.47.5 (2023-12-08)\n\n* **Bug Fix**: Add non-vhostable buckets to request path when using legacy V1 endpoint resolver.\n* **Bug Fix**: Improve uniqueness of default S3Express sesssion credentials cache keying to prevent collision in multi-credential scenarios.\n* **Bug Fix**: Reinstate presence of default Retryer in functional options, but still respect max attempts set therein.\n\n# v1.47.4 (2023-12-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.47.3 (2023-12-06)\n\n* **Bug Fix**: Restore pre-refactor auth behavior where all operations could technically be performed anonymously.\n\n# v1.47.2 (2023-12-01)\n\n* **Bug Fix**: Correct wrapping of errors in authentication workflow.\n* **Bug Fix**: Correctly recognize cache-wrapped instances of AnonymousCredentials at client construction.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.47.1 (2023-11-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.47.0 (2023-11-29)\n\n* **Feature**: Expose Options() accessor on service clients.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.46.0 (2023-11-28.2)\n\n* **Feature**: Add S3Express support.\n* **Feature**: Adds support for S3 Express One Zone.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.45.1 (2023-11-28)\n\n* **Bug Fix**: Respect setting RetryMaxAttempts in functional options at client construction.\n\n# v1.45.0 (2023-11-27)\n\n* **Feature**: Adding new params - Key and Prefix, to S3 API operations for supporting S3 Access Grants. Note - These updates will not change any of the existing S3 API functionality.\n\n# v1.44.0 (2023-11-21)\n\n* **Feature**: Add support for automatic date based partitioning in S3 Server Access Logs.\n* **Bug Fix**: Don't send MaxKeys/MaxUploads=0 when unspecified in ListObjectVersions and ListMultipartUploads paginators.\n\n# v1.43.1 (2023-11-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.43.0 (2023-11-17)\n\n* **Feature**: **BREAKING CHANGE** Correct nullability of a large number of S3 structure fields. See https://github.com/aws/aws-sdk-go-v2/issues/2162.\n* **Feature**: Removes all default 0 values for numbers and false values for booleans\n\n# v1.42.2 (2023-11-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.42.1 (2023-11-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.42.0 (2023-11-01)\n\n* **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.41.0 (2023-10-31)\n\n* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.40.2 (2023-10-12)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.40.1 (2023-10-06)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.40.0 (2023-09-26)\n\n* **Feature**: This release adds a new field COMPLETED to the ReplicationStatus Enum. You can now use this field to validate the replication status of S3 objects using the AWS SDK.\n\n# v1.39.0 (2023-09-20)\n\n* **Feature**: Fix an issue where the SDK can fail to unmarshall response due to NumberFormatException\n\n# v1.38.5 (2023-08-21)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.38.4 (2023-08-18)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.38.3 (2023-08-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.38.2 (2023-08-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.38.1 (2023-08-01)\n\n* No change notes available for this release.\n\n# v1.38.0 (2023-07-31)\n\n* **Feature**: Adds support for smithy-modeled endpoint resolution. A new rules-based endpoint resolution will be added to the SDK which will supercede and deprecate existing endpoint resolution. Specifically, EndpointResolver will be deprecated while BaseEndpoint and EndpointResolverV2 will take its place. For more information, please see the Endpoints section in our Developer Guide.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.37.1 (2023-07-28)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.37.0 (2023-07-13)\n\n* **Feature**: S3 Inventory now supports Object Access Control List and Object Owner as available object metadata fields in inventory reports.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.36.0 (2023-06-28)\n\n* **Feature**: The S3 LISTObjects, ListObjectsV2 and ListObjectVersions API now supports a new optional header x-amz-optional-object-attributes. If header contains RestoreStatus as the value, then S3 will include Glacier restore status i.e. isRestoreInProgress and RestoreExpiryDate in List response.\n\n# v1.35.0 (2023-06-16)\n\n* **Feature**: This release adds SDK support for request-payer request header and request-charged response header in the \"GetBucketAccelerateConfiguration\", \"ListMultipartUploads\", \"ListObjects\", \"ListObjectsV2\" and \"ListObjectVersions\" S3 APIs.\n\n# v1.34.1 (2023-06-15)\n\n* No change notes available for this release.\n\n# v1.34.0 (2023-06-13)\n\n* **Feature**: Integrate double encryption feature to SDKs.\n* **Bug Fix**: Fix HeadObject to return types.Nound when an object does not exist. Fixes [2084](https://github.com/aws/aws-sdk-go-v2/issues/2084)\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.33.1 (2023-05-04)\n\n* **Documentation**: Documentation updates for Amazon S3\n\n# v1.33.0 (2023-04-24)\n\n* **Feature**: added custom paginators for listMultipartUploads and ListObjectVersions\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.32.0 (2023-04-19)\n\n* **Feature**: Provides support for \"Snow\" Storage class.\n\n# v1.31.3 (2023-04-10)\n\n* No change notes available for this release.\n\n# v1.31.2 (2023-04-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.31.1 (2023-03-31)\n\n* **Documentation**: Documentation updates for Amazon S3\n\n# v1.31.0 (2023-03-21)\n\n* **Feature**: port v1 sdk 100-continue http header customization for s3 PutObject/UploadPart request and enable user config\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.30.6 (2023-03-10)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.30.5 (2023-02-22)\n\n* **Bug Fix**: Prevent nil pointer dereference when retrieving error codes.\n\n# v1.30.4 (2023-02-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.30.3 (2023-02-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.30.2 (2023-02-03)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.30.1 (2023-01-23)\n\n* No change notes available for this release.\n\n# v1.30.0 (2023-01-05)\n\n* **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401).\n\n# v1.29.6 (2022-12-15)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.5 (2022-12-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.4 (2022-11-22)\n\n* No change notes available for this release.\n\n# v1.29.3 (2022-11-16)\n\n* No change notes available for this release.\n\n# v1.29.2 (2022-11-10)\n\n* No change notes available for this release.\n\n# v1.29.1 (2022-10-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.29.0 (2022-10-21)\n\n* **Feature**: S3 on Outposts launches support for automatic bucket-style alias. You can use the automatic access point alias instead of an access point ARN for any object-level operation in an Outposts bucket.\n* **Bug Fix**: The SDK client has been updated to utilize the `aws.IsCredentialsProvider` function for determining if `aws.AnonymousCredentials` has been configured for the `CredentialProvider`.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.28.0 (2022-10-19)\n\n* **Feature**: Updates internal logic for constructing API endpoints. We have added rule-based endpoints and internal model parameters.\n\n# v1.27.11 (2022-09-20)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.10 (2022-09-14)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.9 (2022-09-02)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.8 (2022-08-31)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.7 (2022-08-30)\n\n* No change notes available for this release.\n\n# v1.27.6 (2022-08-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.5 (2022-08-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.4 (2022-08-09)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.3 (2022-08-08)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.2 (2022-08-01)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.1 (2022-07-05)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.27.0 (2022-07-01)\n\n* **Feature**: Add presign support for HeadBucket, DeleteObject, and DeleteBucket. Fixes [#1076](https://github.com/aws/aws-sdk-go-v2/issues/1076).\n\n# v1.26.12 (2022-06-29)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.26.11 (2022-06-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.26.10 (2022-05-17)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.26.9 (2022-05-06)\n\n* No change notes available for this release.\n\n# v1.26.8 (2022-05-03)\n\n* **Documentation**: Documentation only update for doc bug fixes for the S3 API docs.\n\n# v1.26.7 (2022-04-27)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.26.6 (2022-04-25)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.26.5 (2022-04-12)\n\n* **Bug Fix**: Fixes an issue that caused the unexported constructor function names for EventStream types to be swapped for the event reader and writer respectivly.\n\n# v1.26.4 (2022-04-07)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.26.3 (2022-03-30)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.26.2 (2022-03-24)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.26.1 (2022-03-23)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.26.0 (2022-03-08)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.25.0 (2022-02-24)\n\n* **Feature**: API client updated\n* **Feature**: Adds RetryMaxAttempts and RetryMod to API client Options. This allows the API clients' default Retryer to be configured from the shared configuration files or environment variables. Adding a new Retry mode of `Adaptive`. `Adaptive` retry mode is an experimental mode, adding client rate limiting when throttles reponses are received from an API. See [retry.AdaptiveMode](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/retry#AdaptiveMode) for more details, and configuration options.\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Bug Fix**: Fixes the AWS Sigv4 signer to trim header value's whitespace when computing the canonical headers block of the string to sign.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.24.1 (2022-01-28)\n\n* **Bug Fix**: Updates SDK API client deserialization to pre-allocate byte slice and string response payloads, [#1565](https://github.com/aws/aws-sdk-go-v2/pull/1565). Thanks to [Tyson Mote](https://github.com/tysonmote) for submitting this PR.\n\n# v1.24.0 (2022-01-14)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.23.0 (2022-01-07)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Documentation**: API client updated\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.22.0 (2021-12-21)\n\n* **Feature**: API Paginators now support specifying the initial starting token, and support stopping on empty string tokens.\n* **Feature**: Updated to latest service endpoints\n\n# v1.21.0 (2021-12-02)\n\n* **Feature**: API client updated\n* **Bug Fix**: Fixes a bug that prevented aws.EndpointResolverWithOptions from being used by the service client. ([#1514](https://github.com/aws/aws-sdk-go-v2/pull/1514))\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.20.0 (2021-11-30)\n\n* **Feature**: API client updated\n\n# v1.19.1 (2021-11-19)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.19.0 (2021-11-12)\n\n* **Feature**: Waiters now have a `WaitForOutput` method, which can be used to retrieve the output of the successful wait operation. Thank you to [Andrew Haines](https://github.com/haines) for contributing this feature.\n\n# v1.18.0 (2021-11-06)\n\n* **Feature**: Support has been added for the SelectObjectContent API.\n* **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically.\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Feature**: Updated service to latest API model.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.17.0 (2021-10-21)\n\n* **Feature**: Updated  to latest version\n* **Feature**: Updates S3 streaming operations - PutObject, UploadPart, WriteGetObjectResponse to use unsigned payload signing auth when TLS is enabled.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.1 (2021-10-11)\n\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.16.0 (2021-09-17)\n\n* **Feature**: Updated API client and endpoints to latest revision.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.15.1 (2021-09-10)\n\n* No change notes available for this release.\n\n# v1.15.0 (2021-09-02)\n\n* **Feature**: API client updated\n* **Feature**: Add support for S3 Multi-Region Access Point ARNs.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.14.0 (2021-08-27)\n\n* **Feature**: Updated API model to latest revision.\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.13.0 (2021-08-19)\n\n* **Feature**: API client updated\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.12.0 (2021-08-04)\n\n* **Feature**: Add `HeadObject` presign support. ([#1346](https://github.com/aws/aws-sdk-go-v2/pull/1346))\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.1 (2021-07-15)\n\n* **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.11.0 (2021-06-25)\n\n* **Feature**: Updated `github.com/aws/smithy-go` to latest version\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.10.0 (2021-06-04)\n\n* **Feature**: The handling of AccessPoint and Outpost ARNs have been updated.\n* **Feature**: Updated service client to latest API model.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.9.0 (2021-05-25)\n\n* **Feature**: API client updated\n\n# v1.8.0 (2021-05-20)\n\n* **Feature**: API client updated\n* **Dependency Update**: Updated to the latest SDK module versions\n\n# v1.7.0 (2021-05-14)\n\n* **Feature**: Constant has been added to modules to enable runtime version inspection for reporting.\n* **Feature**: Updated to latest service API model.\n* **Dependency Update**: Updated to the latest SDK module versions\n\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/LICENSE.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_client.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/defaults\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/retry\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tawshttp \"github.com/aws/aws-sdk-go-v2/aws/transport/http\"\n\tinternalauth \"github.com/aws/aws-sdk-go-v2/internal/auth\"\n\tinternalauthsmithy \"github.com/aws/aws-sdk-go-v2/internal/auth/smithy\"\n\tinternalConfig \"github.com/aws/aws-sdk-go-v2/internal/configsources\"\n\tinternalmiddleware \"github.com/aws/aws-sdk-go-v2/internal/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/v4a\"\n\tacceptencodingcust \"github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\tpresignedurlcust \"github.com/aws/aws-sdk-go-v2/service/internal/presigned-url\"\n\t\"github.com/aws/aws-sdk-go-v2/service/internal/s3shared\"\n\ts3sharedconfig \"github.com/aws/aws-sdk-go-v2/service/internal/s3shared/config\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\tsmithy \"github.com/aws/smithy-go\"\n\tsmithyauth \"github.com/aws/smithy-go/auth\"\n\tsmithydocument \"github.com/aws/smithy-go/document\"\n\t\"github.com/aws/smithy-go/logging\"\n\t\"github.com/aws/smithy-go/metrics\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"net\"\n\t\"net/http\"\n\t\"sync/atomic\"\n\t\"time\"\n)\n\nconst ServiceID = \"S3\"\nconst ServiceAPIVersion = \"2006-03-01\"\n\ntype operationMetrics struct {\n\tDuration                metrics.Float64Histogram\n\tSerializeDuration       metrics.Float64Histogram\n\tResolveIdentityDuration metrics.Float64Histogram\n\tResolveEndpointDuration metrics.Float64Histogram\n\tSignRequestDuration     metrics.Float64Histogram\n\tDeserializeDuration     metrics.Float64Histogram\n}\n\nfunc (m *operationMetrics) histogramFor(name string) metrics.Float64Histogram {\n\tswitch name {\n\tcase \"client.call.duration\":\n\t\treturn m.Duration\n\tcase \"client.call.serialization_duration\":\n\t\treturn m.SerializeDuration\n\tcase \"client.call.resolve_identity_duration\":\n\t\treturn m.ResolveIdentityDuration\n\tcase \"client.call.resolve_endpoint_duration\":\n\t\treturn m.ResolveEndpointDuration\n\tcase \"client.call.signing_duration\":\n\t\treturn m.SignRequestDuration\n\tcase \"client.call.deserialization_duration\":\n\t\treturn m.DeserializeDuration\n\tdefault:\n\t\tpanic(\"unrecognized operation metric\")\n\t}\n}\n\nfunc timeOperationMetric[T any](\n\tctx context.Context, metric string, fn func() (T, error),\n\topts ...metrics.RecordMetricOption,\n) (T, error) {\n\tinstr := getOperationMetrics(ctx).histogramFor(metric)\n\topts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...)\n\n\tstart := time.Now()\n\tv, err := fn()\n\tend := time.Now()\n\n\telapsed := end.Sub(start)\n\tinstr.Record(ctx, float64(elapsed)/1e9, opts...)\n\treturn v, err\n}\n\nfunc startMetricTimer(ctx context.Context, metric string, opts ...metrics.RecordMetricOption) func() {\n\tinstr := getOperationMetrics(ctx).histogramFor(metric)\n\topts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...)\n\n\tvar ended bool\n\tstart := time.Now()\n\treturn func() {\n\t\tif ended {\n\t\t\treturn\n\t\t}\n\t\tended = true\n\n\t\tend := time.Now()\n\n\t\telapsed := end.Sub(start)\n\t\tinstr.Record(ctx, float64(elapsed)/1e9, opts...)\n\t}\n}\n\nfunc withOperationMetadata(ctx context.Context) metrics.RecordMetricOption {\n\treturn func(o *metrics.RecordMetricOptions) {\n\t\to.Properties.Set(\"rpc.service\", middleware.GetServiceID(ctx))\n\t\to.Properties.Set(\"rpc.method\", middleware.GetOperationName(ctx))\n\t}\n}\n\ntype operationMetricsKey struct{}\n\nfunc withOperationMetrics(parent context.Context, mp metrics.MeterProvider) (context.Context, error) {\n\tmeter := mp.Meter(\"github.com/aws/aws-sdk-go-v2/service/s3\")\n\tom := &operationMetrics{}\n\n\tvar err error\n\n\tom.Duration, err = operationMetricTimer(meter, \"client.call.duration\",\n\t\t\"Overall call duration (including retries and time to send or receive request and response body)\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tom.SerializeDuration, err = operationMetricTimer(meter, \"client.call.serialization_duration\",\n\t\t\"The time it takes to serialize a message body\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tom.ResolveIdentityDuration, err = operationMetricTimer(meter, \"client.call.auth.resolve_identity_duration\",\n\t\t\"The time taken to acquire an identity (AWS credentials, bearer token, etc) from an Identity Provider\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tom.ResolveEndpointDuration, err = operationMetricTimer(meter, \"client.call.resolve_endpoint_duration\",\n\t\t\"The time it takes to resolve an endpoint (endpoint resolver, not DNS) for the request\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tom.SignRequestDuration, err = operationMetricTimer(meter, \"client.call.auth.signing_duration\",\n\t\t\"The time it takes to sign a request\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tom.DeserializeDuration, err = operationMetricTimer(meter, \"client.call.deserialization_duration\",\n\t\t\"The time it takes to deserialize a message body\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn context.WithValue(parent, operationMetricsKey{}, om), nil\n}\n\nfunc operationMetricTimer(m metrics.Meter, name, desc string) (metrics.Float64Histogram, error) {\n\treturn m.Float64Histogram(name, func(o *metrics.InstrumentOptions) {\n\t\to.UnitLabel = \"s\"\n\t\to.Description = desc\n\t})\n}\n\nfunc getOperationMetrics(ctx context.Context) *operationMetrics {\n\treturn ctx.Value(operationMetricsKey{}).(*operationMetrics)\n}\n\nfunc operationTracer(p tracing.TracerProvider) tracing.Tracer {\n\treturn p.Tracer(\"github.com/aws/aws-sdk-go-v2/service/s3\")\n}\n\n// Client provides the API client to make operations call for Amazon Simple\n// Storage Service.\ntype Client struct {\n\toptions Options\n\n\t// Difference between the time reported by the server and the client\n\ttimeOffset *atomic.Int64\n}\n\n// New returns an initialized Client based on the functional options. Provide\n// additional functional options to further configure the behavior of the client,\n// such as changing the client's endpoint or adding custom middleware behavior.\nfunc New(options Options, optFns ...func(*Options)) *Client {\n\toptions = options.Copy()\n\n\tresolveDefaultLogger(&options)\n\n\tsetResolvedDefaultsMode(&options)\n\n\tresolveRetryer(&options)\n\n\tresolveHTTPClient(&options)\n\n\tresolveHTTPSignerV4(&options)\n\n\tresolveEndpointResolverV2(&options)\n\n\tresolveHTTPSignerV4a(&options)\n\n\tresolveTracerProvider(&options)\n\n\tresolveMeterProvider(&options)\n\n\tresolveAuthSchemeResolver(&options)\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tfinalizeRetryMaxAttempts(&options)\n\n\tignoreAnonymousAuth(&options)\n\n\tresolveExpressCredentials(&options)\n\n\tfinalizeServiceEndpointAuthResolver(&options)\n\n\tresolveAuthSchemes(&options)\n\n\tclient := &Client{\n\t\toptions: options,\n\t}\n\n\tfinalizeExpressCredentials(&options, client)\n\n\tinitializeTimeOffsetResolver(client)\n\n\treturn client\n}\n\n// Options returns a copy of the client configuration.\n//\n// Callers SHOULD NOT perform mutations on any inner structures within client\n// config. Config overrides should instead be made on a per-operation basis through\n// functional options.\nfunc (c *Client) Options() Options {\n\treturn c.options.Copy()\n}\n\nfunc (c *Client) invokeOperation(\n\tctx context.Context, opID string, params interface{}, optFns []func(*Options), stackFns ...func(*middleware.Stack, Options) error,\n) (\n\tresult interface{}, metadata middleware.Metadata, err error,\n) {\n\tctx = middleware.ClearStackValues(ctx)\n\tctx = middleware.WithServiceID(ctx, ServiceID)\n\tctx = middleware.WithOperationName(ctx, opID)\n\n\tstack := middleware.NewStack(opID, smithyhttp.NewStackRequest)\n\toptions := c.options.Copy()\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tsetSafeEventStreamClientLogMode(&options, opID)\n\n\tfinalizeOperationRetryMaxAttempts(&options, *c)\n\n\tfinalizeClientEndpointResolverOptions(&options)\n\n\tfinalizeOperationExpressCredentials(&options, *c)\n\n\tfinalizeOperationEndpointAuthResolver(&options)\n\n\tfor _, fn := range stackFns {\n\t\tif err := fn(stack, options); err != nil {\n\t\t\treturn nil, metadata, err\n\t\t}\n\t}\n\n\tfor _, fn := range options.APIOptions {\n\t\tif err := fn(stack); err != nil {\n\t\t\treturn nil, metadata, err\n\t\t}\n\t}\n\n\tctx, err = withOperationMetrics(ctx, options.MeterProvider)\n\tif err != nil {\n\t\treturn nil, metadata, err\n\t}\n\n\ttracer := operationTracer(options.TracerProvider)\n\tspanName := fmt.Sprintf(\"%s.%s\", ServiceID, opID)\n\n\tctx = tracing.WithOperationTracer(ctx, tracer)\n\n\tctx, span := tracer.StartSpan(ctx, spanName, func(o *tracing.SpanOptions) {\n\t\to.Kind = tracing.SpanKindClient\n\t\to.Properties.Set(\"rpc.system\", \"aws-api\")\n\t\to.Properties.Set(\"rpc.method\", opID)\n\t\to.Properties.Set(\"rpc.service\", ServiceID)\n\t})\n\tendTimer := startMetricTimer(ctx, \"client.call.duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\n\thandler := smithyhttp.NewClientHandlerWithOptions(options.HTTPClient, func(o *smithyhttp.ClientHandler) {\n\t\to.Meter = options.MeterProvider.Meter(\"github.com/aws/aws-sdk-go-v2/service/s3\")\n\t})\n\tdecorated := middleware.DecorateHandler(handler, stack)\n\tresult, metadata, err = decorated.Handle(ctx, params)\n\tif err != nil {\n\t\tspan.SetProperty(\"exception.type\", fmt.Sprintf(\"%T\", err))\n\t\tspan.SetProperty(\"exception.message\", err.Error())\n\n\t\tvar aerr smithy.APIError\n\t\tif errors.As(err, &aerr) {\n\t\t\tspan.SetProperty(\"api.error_code\", aerr.ErrorCode())\n\t\t\tspan.SetProperty(\"api.error_message\", aerr.ErrorMessage())\n\t\t\tspan.SetProperty(\"api.error_fault\", aerr.ErrorFault().String())\n\t\t}\n\n\t\terr = &smithy.OperationError{\n\t\t\tServiceID:     ServiceID,\n\t\t\tOperationName: opID,\n\t\t\tErr:           err,\n\t\t}\n\t}\n\n\tspan.SetProperty(\"error\", err != nil)\n\tif err == nil {\n\t\tspan.SetStatus(tracing.SpanStatusOK)\n\t} else {\n\t\tspan.SetStatus(tracing.SpanStatusError)\n\t}\n\n\treturn result, metadata, err\n}\n\ntype operationInputKey struct{}\n\nfunc setOperationInput(ctx context.Context, input interface{}) context.Context {\n\treturn middleware.WithStackValue(ctx, operationInputKey{}, input)\n}\n\nfunc getOperationInput(ctx context.Context) interface{} {\n\treturn middleware.GetStackValue(ctx, operationInputKey{})\n}\n\ntype setOperationInputMiddleware struct {\n}\n\nfunc (*setOperationInputMiddleware) ID() string {\n\treturn \"setOperationInput\"\n}\n\nfunc (m *setOperationInputMiddleware) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\tctx = setOperationInput(ctx, in.Parameters)\n\treturn next.HandleSerialize(ctx, in)\n}\n\nfunc addProtocolFinalizerMiddlewares(stack *middleware.Stack, options Options, operation string) error {\n\tif err := stack.Finalize.Add(&resolveAuthSchemeMiddleware{operation: operation, options: options}, middleware.Before); err != nil {\n\t\treturn fmt.Errorf(\"add ResolveAuthScheme: %w\", err)\n\t}\n\tif err := stack.Finalize.Insert(&getIdentityMiddleware{options: options}, \"ResolveAuthScheme\", middleware.After); err != nil {\n\t\treturn fmt.Errorf(\"add GetIdentity: %v\", err)\n\t}\n\tif err := stack.Finalize.Insert(&resolveEndpointV2Middleware{options: options}, \"GetIdentity\", middleware.After); err != nil {\n\t\treturn fmt.Errorf(\"add ResolveEndpointV2: %v\", err)\n\t}\n\tif err := stack.Finalize.Insert(&signRequestMiddleware{options: options}, \"ResolveEndpointV2\", middleware.After); err != nil {\n\t\treturn fmt.Errorf(\"add Signing: %w\", err)\n\t}\n\treturn nil\n}\nfunc resolveAuthSchemeResolver(options *Options) {\n\tif options.AuthSchemeResolver == nil {\n\t\toptions.AuthSchemeResolver = &defaultAuthSchemeResolver{}\n\t}\n}\n\nfunc resolveAuthSchemes(options *Options) {\n\tif options.AuthSchemes == nil {\n\t\toptions.AuthSchemes = []smithyhttp.AuthScheme{\n\t\t\tinternalauth.NewHTTPAuthScheme(\"aws.auth#sigv4\", &internalauthsmithy.V4SignerAdapter{\n\t\t\t\tSigner:     options.HTTPSignerV4,\n\t\t\t\tLogger:     options.Logger,\n\t\t\t\tLogSigning: options.ClientLogMode.IsSigning(),\n\t\t\t}),\n\t\t\tinternalauth.NewHTTPAuthScheme(\"com.amazonaws.s3#sigv4express\", &s3cust.ExpressSigner{\n\t\t\t\tSigner:     options.HTTPSignerV4,\n\t\t\t\tLogger:     options.Logger,\n\t\t\t\tLogSigning: options.ClientLogMode.IsSigning(),\n\t\t\t}),\n\t\t\tinternalauth.NewHTTPAuthScheme(\"aws.auth#sigv4a\", &v4a.SignerAdapter{\n\t\t\t\tSigner:     options.httpSignerV4a,\n\t\t\t\tLogger:     options.Logger,\n\t\t\t\tLogSigning: options.ClientLogMode.IsSigning(),\n\t\t\t}),\n\t\t}\n\t}\n}\n\ntype noSmithyDocumentSerde = smithydocument.NoSerde\n\ntype legacyEndpointContextSetter struct {\n\tLegacyResolver EndpointResolver\n}\n\nfunc (*legacyEndpointContextSetter) ID() string {\n\treturn \"legacyEndpointContextSetter\"\n}\n\nfunc (m *legacyEndpointContextSetter) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (\n\tout middleware.InitializeOutput, metadata middleware.Metadata, err error,\n) {\n\tif m.LegacyResolver != nil {\n\t\tctx = awsmiddleware.SetRequiresLegacyEndpoints(ctx, true)\n\t}\n\n\treturn next.HandleInitialize(ctx, in)\n\n}\nfunc addlegacyEndpointContextSetter(stack *middleware.Stack, o Options) error {\n\treturn stack.Initialize.Add(&legacyEndpointContextSetter{\n\t\tLegacyResolver: o.EndpointResolver,\n\t}, middleware.Before)\n}\n\nfunc resolveDefaultLogger(o *Options) {\n\tif o.Logger != nil {\n\t\treturn\n\t}\n\to.Logger = logging.Nop{}\n}\n\nfunc addSetLoggerMiddleware(stack *middleware.Stack, o Options) error {\n\treturn middleware.AddSetLoggerMiddleware(stack, o.Logger)\n}\n\nfunc setResolvedDefaultsMode(o *Options) {\n\tif len(o.resolvedDefaultsMode) > 0 {\n\t\treturn\n\t}\n\n\tvar mode aws.DefaultsMode\n\tmode.SetFromString(string(o.DefaultsMode))\n\n\tif mode == aws.DefaultsModeAuto {\n\t\tmode = defaults.ResolveDefaultsModeAuto(o.Region, o.RuntimeEnvironment)\n\t}\n\n\to.resolvedDefaultsMode = mode\n}\n\n// NewFromConfig returns a new client from the provided config.\nfunc NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client {\n\topts := Options{\n\t\tRegion:                     cfg.Region,\n\t\tDefaultsMode:               cfg.DefaultsMode,\n\t\tRuntimeEnvironment:         cfg.RuntimeEnvironment,\n\t\tHTTPClient:                 cfg.HTTPClient,\n\t\tCredentials:                cfg.Credentials,\n\t\tAPIOptions:                 cfg.APIOptions,\n\t\tLogger:                     cfg.Logger,\n\t\tClientLogMode:              cfg.ClientLogMode,\n\t\tAppID:                      cfg.AppID,\n\t\tRequestChecksumCalculation: cfg.RequestChecksumCalculation,\n\t\tResponseChecksumValidation: cfg.ResponseChecksumValidation,\n\t}\n\tresolveAWSRetryerProvider(cfg, &opts)\n\tresolveAWSRetryMaxAttempts(cfg, &opts)\n\tresolveAWSRetryMode(cfg, &opts)\n\tresolveAWSEndpointResolver(cfg, &opts)\n\tresolveUseARNRegion(cfg, &opts)\n\tresolveDisableMultiRegionAccessPoints(cfg, &opts)\n\tresolveDisableExpressAuth(cfg, &opts)\n\tresolveUseDualStackEndpoint(cfg, &opts)\n\tresolveUseFIPSEndpoint(cfg, &opts)\n\tresolveBaseEndpoint(cfg, &opts)\n\treturn New(opts, optFns...)\n}\n\nfunc resolveHTTPClient(o *Options) {\n\tvar buildable *awshttp.BuildableClient\n\n\tif o.HTTPClient != nil {\n\t\tvar ok bool\n\t\tbuildable, ok = o.HTTPClient.(*awshttp.BuildableClient)\n\t\tif !ok {\n\t\t\treturn\n\t\t}\n\t} else {\n\t\tbuildable = awshttp.NewBuildableClient()\n\t}\n\n\tmodeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode)\n\tif err == nil {\n\t\tbuildable = buildable.WithDialerOptions(func(dialer *net.Dialer) {\n\t\t\tif dialerTimeout, ok := modeConfig.GetConnectTimeout(); ok {\n\t\t\t\tdialer.Timeout = dialerTimeout\n\t\t\t}\n\t\t})\n\n\t\tbuildable = buildable.WithTransportOptions(func(transport *http.Transport) {\n\t\t\tif tlsHandshakeTimeout, ok := modeConfig.GetTLSNegotiationTimeout(); ok {\n\t\t\t\ttransport.TLSHandshakeTimeout = tlsHandshakeTimeout\n\t\t\t}\n\t\t})\n\t}\n\n\to.HTTPClient = buildable\n}\n\nfunc resolveRetryer(o *Options) {\n\tif o.Retryer != nil {\n\t\treturn\n\t}\n\n\tif len(o.RetryMode) == 0 {\n\t\tmodeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode)\n\t\tif err == nil {\n\t\t\to.RetryMode = modeConfig.RetryMode\n\t\t}\n\t}\n\tif len(o.RetryMode) == 0 {\n\t\to.RetryMode = aws.RetryModeStandard\n\t}\n\n\tvar standardOptions []func(*retry.StandardOptions)\n\tif v := o.RetryMaxAttempts; v != 0 {\n\t\tstandardOptions = append(standardOptions, func(so *retry.StandardOptions) {\n\t\t\tso.MaxAttempts = v\n\t\t})\n\t}\n\n\tswitch o.RetryMode {\n\tcase aws.RetryModeAdaptive:\n\t\tvar adaptiveOptions []func(*retry.AdaptiveModeOptions)\n\t\tif len(standardOptions) != 0 {\n\t\t\tadaptiveOptions = append(adaptiveOptions, func(ao *retry.AdaptiveModeOptions) {\n\t\t\t\tao.StandardOptions = append(ao.StandardOptions, standardOptions...)\n\t\t\t})\n\t\t}\n\t\to.Retryer = retry.NewAdaptiveMode(adaptiveOptions...)\n\n\tdefault:\n\t\to.Retryer = retry.NewStandard(standardOptions...)\n\t}\n}\n\nfunc resolveAWSRetryerProvider(cfg aws.Config, o *Options) {\n\tif cfg.Retryer == nil {\n\t\treturn\n\t}\n\to.Retryer = cfg.Retryer()\n}\n\nfunc resolveAWSRetryMode(cfg aws.Config, o *Options) {\n\tif len(cfg.RetryMode) == 0 {\n\t\treturn\n\t}\n\to.RetryMode = cfg.RetryMode\n}\nfunc resolveAWSRetryMaxAttempts(cfg aws.Config, o *Options) {\n\tif cfg.RetryMaxAttempts == 0 {\n\t\treturn\n\t}\n\to.RetryMaxAttempts = cfg.RetryMaxAttempts\n}\n\nfunc finalizeRetryMaxAttempts(o *Options) {\n\tif o.RetryMaxAttempts == 0 {\n\t\treturn\n\t}\n\n\to.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts)\n}\n\nfunc finalizeOperationRetryMaxAttempts(o *Options, client Client) {\n\tif v := o.RetryMaxAttempts; v == 0 || v == client.options.RetryMaxAttempts {\n\t\treturn\n\t}\n\n\to.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts)\n}\n\nfunc resolveAWSEndpointResolver(cfg aws.Config, o *Options) {\n\tif cfg.EndpointResolver == nil && cfg.EndpointResolverWithOptions == nil {\n\t\treturn\n\t}\n\to.EndpointResolver = withEndpointResolver(cfg.EndpointResolver, cfg.EndpointResolverWithOptions)\n}\n\nfunc addClientUserAgent(stack *middleware.Stack, options Options) error {\n\tua, err := getOrAddRequestUserAgent(stack)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tua.AddSDKAgentKeyValue(awsmiddleware.APIMetadata, \"s3\", goModuleVersion)\n\tif len(options.AppID) > 0 {\n\t\tua.AddSDKAgentKey(awsmiddleware.ApplicationIdentifier, options.AppID)\n\t}\n\n\treturn nil\n}\n\nfunc getOrAddRequestUserAgent(stack *middleware.Stack) (*awsmiddleware.RequestUserAgent, error) {\n\tid := (*awsmiddleware.RequestUserAgent)(nil).ID()\n\tmw, ok := stack.Build.Get(id)\n\tif !ok {\n\t\tmw = awsmiddleware.NewRequestUserAgent()\n\t\tif err := stack.Build.Add(mw, middleware.After); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tua, ok := mw.(*awsmiddleware.RequestUserAgent)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"%T for %s middleware did not match expected type\", mw, id)\n\t}\n\n\treturn ua, nil\n}\n\ntype HTTPSignerV4 interface {\n\tSignHTTP(ctx context.Context, credentials aws.Credentials, r *http.Request, payloadHash string, service string, region string, signingTime time.Time, optFns ...func(*v4.SignerOptions)) error\n}\n\nfunc resolveHTTPSignerV4(o *Options) {\n\tif o.HTTPSignerV4 != nil {\n\t\treturn\n\t}\n\to.HTTPSignerV4 = newDefaultV4Signer(*o)\n}\n\nfunc newDefaultV4Signer(o Options) *v4.Signer {\n\treturn v4.NewSigner(func(so *v4.SignerOptions) {\n\t\tso.Logger = o.Logger\n\t\tso.LogSigning = o.ClientLogMode.IsSigning()\n\t\tso.DisableURIPathEscaping = true\n\t})\n}\n\nfunc addClientRequestID(stack *middleware.Stack) error {\n\treturn stack.Build.Add(&awsmiddleware.ClientRequestID{}, middleware.After)\n}\n\nfunc addComputeContentLength(stack *middleware.Stack) error {\n\treturn stack.Build.Add(&smithyhttp.ComputeContentLength{}, middleware.After)\n}\n\nfunc addRawResponseToMetadata(stack *middleware.Stack) error {\n\treturn stack.Deserialize.Add(&awsmiddleware.AddRawResponse{}, middleware.Before)\n}\n\nfunc addRecordResponseTiming(stack *middleware.Stack) error {\n\treturn stack.Deserialize.Add(&awsmiddleware.RecordResponseTiming{}, middleware.After)\n}\n\nfunc addSpanRetryLoop(stack *middleware.Stack, options Options) error {\n\treturn stack.Finalize.Insert(&spanRetryLoop{options: options}, \"Retry\", middleware.Before)\n}\n\ntype spanRetryLoop struct {\n\toptions Options\n}\n\nfunc (*spanRetryLoop) ID() string {\n\treturn \"spanRetryLoop\"\n}\n\nfunc (m *spanRetryLoop) HandleFinalize(\n\tctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,\n) (\n\tmiddleware.FinalizeOutput, middleware.Metadata, error,\n) {\n\ttracer := operationTracer(m.options.TracerProvider)\n\tctx, span := tracer.StartSpan(ctx, \"RetryLoop\")\n\tdefer span.End()\n\n\treturn next.HandleFinalize(ctx, in)\n}\nfunc addStreamingEventsPayload(stack *middleware.Stack) error {\n\treturn stack.Finalize.Add(&v4.StreamingEventsPayload{}, middleware.Before)\n}\n\nfunc addUnsignedPayload(stack *middleware.Stack) error {\n\treturn stack.Finalize.Insert(&v4.UnsignedPayload{}, \"ResolveEndpointV2\", middleware.After)\n}\n\nfunc addComputePayloadSHA256(stack *middleware.Stack) error {\n\treturn stack.Finalize.Insert(&v4.ComputePayloadSHA256{}, \"ResolveEndpointV2\", middleware.After)\n}\n\nfunc addContentSHA256Header(stack *middleware.Stack) error {\n\treturn stack.Finalize.Insert(&v4.ContentSHA256Header{}, (*v4.ComputePayloadSHA256)(nil).ID(), middleware.After)\n}\n\nfunc addIsWaiterUserAgent(o *Options) {\n\to.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error {\n\t\tua, err := getOrAddRequestUserAgent(stack)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureWaiter)\n\t\treturn nil\n\t})\n}\n\nfunc addIsPaginatorUserAgent(o *Options) {\n\to.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error {\n\t\tua, err := getOrAddRequestUserAgent(stack)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tua.AddUserAgentFeature(awsmiddleware.UserAgentFeaturePaginator)\n\t\treturn nil\n\t})\n}\n\nfunc addRetry(stack *middleware.Stack, o Options) error {\n\tattempt := retry.NewAttemptMiddleware(o.Retryer, smithyhttp.RequestCloner, func(m *retry.Attempt) {\n\t\tm.LogAttempts = o.ClientLogMode.IsRetries()\n\t\tm.OperationMeter = o.MeterProvider.Meter(\"github.com/aws/aws-sdk-go-v2/service/s3\")\n\t})\n\tif err := stack.Finalize.Insert(attempt, \"ResolveAuthScheme\", middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err := stack.Finalize.Insert(&retry.MetricsHeader{}, attempt.ID(), middleware.After); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// resolves UseARNRegion S3 configuration\nfunc resolveUseARNRegion(cfg aws.Config, o *Options) error {\n\tif len(cfg.ConfigSources) == 0 {\n\t\treturn nil\n\t}\n\tvalue, found, err := s3sharedconfig.ResolveUseARNRegion(context.Background(), cfg.ConfigSources)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif found {\n\t\to.UseARNRegion = value\n\t}\n\treturn nil\n}\n\n// resolves DisableMultiRegionAccessPoints S3 configuration\nfunc resolveDisableMultiRegionAccessPoints(cfg aws.Config, o *Options) error {\n\tif len(cfg.ConfigSources) == 0 {\n\t\treturn nil\n\t}\n\tvalue, found, err := s3sharedconfig.ResolveDisableMultiRegionAccessPoints(context.Background(), cfg.ConfigSources)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif found {\n\t\to.DisableMultiRegionAccessPoints = value\n\t}\n\treturn nil\n}\n\n// resolves dual-stack endpoint configuration\nfunc resolveUseDualStackEndpoint(cfg aws.Config, o *Options) error {\n\tif len(cfg.ConfigSources) == 0 {\n\t\treturn nil\n\t}\n\tvalue, found, err := internalConfig.ResolveUseDualStackEndpoint(context.Background(), cfg.ConfigSources)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif found {\n\t\to.EndpointOptions.UseDualStackEndpoint = value\n\t}\n\treturn nil\n}\n\n// resolves FIPS endpoint configuration\nfunc resolveUseFIPSEndpoint(cfg aws.Config, o *Options) error {\n\tif len(cfg.ConfigSources) == 0 {\n\t\treturn nil\n\t}\n\tvalue, found, err := internalConfig.ResolveUseFIPSEndpoint(context.Background(), cfg.ConfigSources)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif found {\n\t\to.EndpointOptions.UseFIPSEndpoint = value\n\t}\n\treturn nil\n}\n\nfunc resolveAccountID(identity smithyauth.Identity, mode aws.AccountIDEndpointMode) *string {\n\tif mode == aws.AccountIDEndpointModeDisabled {\n\t\treturn nil\n\t}\n\n\tif ca, ok := identity.(*internalauthsmithy.CredentialsAdapter); ok && ca.Credentials.AccountID != \"\" {\n\t\treturn aws.String(ca.Credentials.AccountID)\n\t}\n\n\treturn nil\n}\n\ntype httpSignerV4a interface {\n\tSignHTTP(ctx context.Context, credentials v4a.Credentials, r *http.Request, payloadHash,\n\t\tservice string, regionSet []string, signingTime time.Time,\n\t\toptFns ...func(*v4a.SignerOptions)) error\n}\n\nfunc resolveHTTPSignerV4a(o *Options) {\n\tif o.httpSignerV4a != nil {\n\t\treturn\n\t}\n\to.httpSignerV4a = newDefaultV4aSigner(*o)\n}\n\nfunc newDefaultV4aSigner(o Options) *v4a.Signer {\n\treturn v4a.NewSigner(func(so *v4a.SignerOptions) {\n\t\tso.Logger = o.Logger\n\t\tso.LogSigning = o.ClientLogMode.IsSigning()\n\t})\n}\n\nfunc addTimeOffsetBuild(stack *middleware.Stack, c *Client) error {\n\tmw := internalmiddleware.AddTimeOffsetMiddleware{Offset: c.timeOffset}\n\tif err := stack.Build.Add(&mw, middleware.After); err != nil {\n\t\treturn err\n\t}\n\treturn stack.Deserialize.Insert(&mw, \"RecordResponseTiming\", middleware.Before)\n}\nfunc initializeTimeOffsetResolver(c *Client) {\n\tc.timeOffset = new(atomic.Int64)\n}\n\nfunc addUserAgentRetryMode(stack *middleware.Stack, options Options) error {\n\tua, err := getOrAddRequestUserAgent(stack)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tswitch options.Retryer.(type) {\n\tcase *retry.Standard:\n\t\tua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRetryModeStandard)\n\tcase *retry.AdaptiveMode:\n\t\tua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRetryModeAdaptive)\n\t}\n\treturn nil\n}\n\nfunc addRequestChecksumMetricsTracking(stack *middleware.Stack, options Options) error {\n\tua, err := getOrAddRequestUserAgent(stack)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn stack.Build.Insert(&internalChecksum.RequestChecksumMetricsTracking{\n\t\tRequestChecksumCalculation: options.RequestChecksumCalculation,\n\t\tUserAgent:                  ua,\n\t}, \"UserAgent\", middleware.Before)\n}\n\nfunc addResponseChecksumMetricsTracking(stack *middleware.Stack, options Options) error {\n\tua, err := getOrAddRequestUserAgent(stack)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn stack.Build.Insert(&internalChecksum.ResponseChecksumMetricsTracking{\n\t\tResponseChecksumValidation: options.ResponseChecksumValidation,\n\t\tUserAgent:                  ua,\n\t}, \"UserAgent\", middleware.Before)\n}\n\ntype setCredentialSourceMiddleware struct {\n\tua      *awsmiddleware.RequestUserAgent\n\toptions Options\n}\n\nfunc (m setCredentialSourceMiddleware) ID() string { return \"SetCredentialSourceMiddleware\" }\n\nfunc (m setCredentialSourceMiddleware) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (\n\tout middleware.BuildOutput, metadata middleware.Metadata, err error,\n) {\n\tasProviderSource, ok := m.options.Credentials.(aws.CredentialProviderSource)\n\tif !ok {\n\t\treturn next.HandleBuild(ctx, in)\n\t}\n\tproviderSources := asProviderSource.ProviderSources()\n\tfor _, source := range providerSources {\n\t\tm.ua.AddCredentialsSource(source)\n\t}\n\treturn next.HandleBuild(ctx, in)\n}\n\nfunc addCredentialSource(stack *middleware.Stack, options Options) error {\n\tua, err := getOrAddRequestUserAgent(stack)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tmw := setCredentialSourceMiddleware{ua: ua, options: options}\n\treturn stack.Build.Insert(&mw, \"UserAgent\", middleware.Before)\n}\n\nfunc resolveTracerProvider(options *Options) {\n\tif options.TracerProvider == nil {\n\t\toptions.TracerProvider = &tracing.NopTracerProvider{}\n\t}\n}\n\nfunc resolveMeterProvider(options *Options) {\n\tif options.MeterProvider == nil {\n\t\toptions.MeterProvider = metrics.NopMeterProvider{}\n\t}\n}\n\nfunc addMetadataRetrieverMiddleware(stack *middleware.Stack) error {\n\treturn s3shared.AddMetadataRetrieverMiddleware(stack)\n}\n\nfunc add100Continue(stack *middleware.Stack, options Options) error {\n\treturn s3shared.Add100Continue(stack, options.ContinueHeaderThresholdBytes)\n}\n\nfunc addRecursionDetection(stack *middleware.Stack) error {\n\treturn stack.Build.Add(&awsmiddleware.RecursionDetection{}, middleware.After)\n}\n\n// ComputedInputChecksumsMetadata provides information about the algorithms used\n// to compute the checksum(s) of the input payload.\ntype ComputedInputChecksumsMetadata struct {\n\t// ComputedChecksums is a map of algorithm name to checksum value of the computed\n\t// input payload's checksums.\n\tComputedChecksums map[string]string\n}\n\n// GetComputedInputChecksumsMetadata retrieves from the result metadata the map of\n// algorithms and input payload checksums values.\nfunc GetComputedInputChecksumsMetadata(m middleware.Metadata) (ComputedInputChecksumsMetadata, bool) {\n\tvalues, ok := internalChecksum.GetComputedInputChecksums(m)\n\tif !ok {\n\t\treturn ComputedInputChecksumsMetadata{}, false\n\t}\n\treturn ComputedInputChecksumsMetadata{\n\t\tComputedChecksums: values,\n\t}, true\n\n}\n\nfunc addInputChecksumMiddleware(stack *middleware.Stack, options internalChecksum.InputMiddlewareOptions) (err error) {\n\terr = stack.Initialize.Add(&internalChecksum.SetupInputContext{\n\t\tGetAlgorithm:               options.GetAlgorithm,\n\t\tRequireChecksum:            options.RequireChecksum,\n\t\tRequestChecksumCalculation: options.RequestChecksumCalculation,\n\t}, middleware.Before)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tstack.Build.Remove(\"ContentChecksum\")\n\n\tinputChecksum := &internalChecksum.ComputeInputPayloadChecksum{\n\t\tEnableTrailingChecksum:           options.EnableTrailingChecksum,\n\t\tEnableComputePayloadHash:         options.EnableComputeSHA256PayloadHash,\n\t\tEnableDecodedContentLengthHeader: options.EnableDecodedContentLengthHeader,\n\t}\n\tif err := stack.Finalize.Insert(inputChecksum, \"ResolveEndpointV2\", middleware.After); err != nil {\n\t\treturn err\n\t}\n\n\tif options.EnableTrailingChecksum {\n\t\ttrailerMiddleware := &internalChecksum.AddInputChecksumTrailer{\n\t\t\tEnableTrailingChecksum:           inputChecksum.EnableTrailingChecksum,\n\t\t\tEnableComputePayloadHash:         inputChecksum.EnableComputePayloadHash,\n\t\t\tEnableDecodedContentLengthHeader: inputChecksum.EnableDecodedContentLengthHeader,\n\t\t}\n\t\tif err := stack.Finalize.Insert(trailerMiddleware, inputChecksum.ID(), middleware.After); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// ChecksumValidationMetadata contains metadata such as the checksum algorithm\n// used for data integrity validation.\ntype ChecksumValidationMetadata struct {\n\t// AlgorithmsUsed is the set of the checksum algorithms used to validate the\n\t// response payload. The response payload must be completely read in order for the\n\t// checksum validation to be performed. An error is returned by the operation\n\t// output's response io.ReadCloser if the computed checksums are invalid.\n\tAlgorithmsUsed []string\n}\n\n// GetChecksumValidationMetadata returns the set of algorithms that will be used\n// to validate the response payload with. The response payload must be completely\n// read in order for the checksum validation to be performed. An error is returned\n// by the operation output's response io.ReadCloser if the computed checksums are\n// invalid. Returns false if no checksum algorithm used metadata was found.\nfunc GetChecksumValidationMetadata(m middleware.Metadata) (ChecksumValidationMetadata, bool) {\n\tvalues, ok := internalChecksum.GetOutputValidationAlgorithmsUsed(m)\n\tif !ok {\n\t\treturn ChecksumValidationMetadata{}, false\n\t}\n\treturn ChecksumValidationMetadata{\n\t\tAlgorithmsUsed: append(make([]string, 0, len(values)), values...),\n\t}, true\n\n}\n\n// nopGetBucketAccessor is no-op accessor for operation that don't support bucket\n// member as input\nfunc nopGetBucketAccessor(input interface{}) (*string, bool) {\n\treturn nil, false\n}\n\nfunc addResponseErrorMiddleware(stack *middleware.Stack) error {\n\treturn s3shared.AddResponseErrorMiddleware(stack)\n}\n\nfunc disableAcceptEncodingGzip(stack *middleware.Stack) error {\n\treturn acceptencodingcust.AddAcceptEncodingGzip(stack, acceptencodingcust.AddAcceptEncodingGzipOptions{})\n}\n\n// ResponseError provides the HTTP centric error type wrapping the underlying\n// error with the HTTP response value and the deserialized RequestID.\ntype ResponseError interface {\n\terror\n\n\tServiceHostID() string\n\tServiceRequestID() string\n}\n\nvar _ ResponseError = (*s3shared.ResponseError)(nil)\n\n// GetHostIDMetadata retrieves the host id from middleware metadata returns host\n// id as string along with a boolean indicating presence of hostId on middleware\n// metadata.\nfunc GetHostIDMetadata(metadata middleware.Metadata) (string, bool) {\n\treturn s3shared.GetHostIDMetadata(metadata)\n}\n\n// HTTPPresignerV4 represents presigner interface used by presign url client\ntype HTTPPresignerV4 interface {\n\tPresignHTTP(\n\t\tctx context.Context, credentials aws.Credentials, r *http.Request,\n\t\tpayloadHash string, service string, region string, signingTime time.Time,\n\t\toptFns ...func(*v4.SignerOptions),\n\t) (url string, signedHeader http.Header, err error)\n}\n\n// httpPresignerV4a represents sigv4a presigner interface used by presign url\n// client\ntype httpPresignerV4a interface {\n\tPresignHTTP(\n\t\tctx context.Context, credentials v4a.Credentials, r *http.Request,\n\t\tpayloadHash string, service string, regionSet []string, signingTime time.Time,\n\t\toptFns ...func(*v4a.SignerOptions),\n\t) (url string, signedHeader http.Header, err error)\n}\n\n// PresignOptions represents the presign client options\ntype PresignOptions struct {\n\n\t// ClientOptions are list of functional options to mutate client options used by\n\t// the presign client.\n\tClientOptions []func(*Options)\n\n\t// Presigner is the presigner used by the presign url client\n\tPresigner HTTPPresignerV4\n\n\t// Expires sets the expiration duration for the generated presign url. This should\n\t// be the duration in seconds the presigned URL should be considered valid for. If\n\t// not set or set to zero, presign url would default to expire after 900 seconds.\n\tExpires time.Duration\n\n\t// presignerV4a is the presigner used by the presign url client\n\tpresignerV4a httpPresignerV4a\n}\n\nfunc (o PresignOptions) copy() PresignOptions {\n\tclientOptions := make([]func(*Options), len(o.ClientOptions))\n\tcopy(clientOptions, o.ClientOptions)\n\to.ClientOptions = clientOptions\n\treturn o\n}\n\n// WithPresignClientFromClientOptions is a helper utility to retrieve a function\n// that takes PresignOption as input\nfunc WithPresignClientFromClientOptions(optFns ...func(*Options)) func(*PresignOptions) {\n\treturn withPresignClientFromClientOptions(optFns).options\n}\n\ntype withPresignClientFromClientOptions []func(*Options)\n\nfunc (w withPresignClientFromClientOptions) options(o *PresignOptions) {\n\to.ClientOptions = append(o.ClientOptions, w...)\n}\n\n// WithPresignExpires is a helper utility to append Expires value on presign\n// options optional function\nfunc WithPresignExpires(dur time.Duration) func(*PresignOptions) {\n\treturn withPresignExpires(dur).options\n}\n\ntype withPresignExpires time.Duration\n\nfunc (w withPresignExpires) options(o *PresignOptions) {\n\to.Expires = time.Duration(w)\n}\n\n// PresignClient represents the presign url client\ntype PresignClient struct {\n\tclient  *Client\n\toptions PresignOptions\n}\n\n// NewPresignClient generates a presign client using provided API Client and\n// presign options\nfunc NewPresignClient(c *Client, optFns ...func(*PresignOptions)) *PresignClient {\n\tvar options PresignOptions\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\tif len(options.ClientOptions) != 0 {\n\t\tc = New(c.options, options.ClientOptions...)\n\t}\n\n\tif options.Presigner == nil {\n\t\toptions.Presigner = newDefaultV4Signer(c.options)\n\t}\n\n\tif options.presignerV4a == nil {\n\t\toptions.presignerV4a = newDefaultV4aSigner(c.options)\n\t}\n\n\treturn &PresignClient{\n\t\tclient:  c,\n\t\toptions: options,\n\t}\n}\n\nfunc withNopHTTPClientAPIOption(o *Options) {\n\to.HTTPClient = smithyhttp.NopClient{}\n}\n\ntype presignContextPolyfillMiddleware struct {\n}\n\nfunc (*presignContextPolyfillMiddleware) ID() string {\n\treturn \"presignContextPolyfill\"\n}\n\nfunc (m *presignContextPolyfillMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\trscheme := getResolvedAuthScheme(ctx)\n\tif rscheme == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no resolved auth scheme\")\n\t}\n\n\tschemeID := rscheme.Scheme.SchemeID()\n\tctx = s3cust.SetSignerVersion(ctx, schemeID)\n\tif schemeID == \"aws.auth#sigv4\" || schemeID == \"com.amazonaws.s3#sigv4express\" {\n\t\tif sn, ok := smithyhttp.GetSigV4SigningName(&rscheme.SignerProperties); ok {\n\t\t\tctx = awsmiddleware.SetSigningName(ctx, sn)\n\t\t}\n\t\tif sr, ok := smithyhttp.GetSigV4SigningRegion(&rscheme.SignerProperties); ok {\n\t\t\tctx = awsmiddleware.SetSigningRegion(ctx, sr)\n\t\t}\n\t} else if schemeID == \"aws.auth#sigv4a\" {\n\t\tif sn, ok := smithyhttp.GetSigV4ASigningName(&rscheme.SignerProperties); ok {\n\t\t\tctx = awsmiddleware.SetSigningName(ctx, sn)\n\t\t}\n\t\tif sr, ok := smithyhttp.GetSigV4ASigningRegions(&rscheme.SignerProperties); ok {\n\t\t\tctx = awsmiddleware.SetSigningRegion(ctx, sr[0])\n\t\t}\n\t}\n\n\treturn next.HandleFinalize(ctx, in)\n}\n\ntype presignConverter PresignOptions\n\nfunc (c presignConverter) convertToPresignMiddleware(stack *middleware.Stack, options Options) (err error) {\n\tif _, ok := stack.Finalize.Get((*acceptencodingcust.DisableGzip)(nil).ID()); ok {\n\t\tstack.Finalize.Remove((*acceptencodingcust.DisableGzip)(nil).ID())\n\t}\n\tif _, ok := stack.Finalize.Get((*retry.Attempt)(nil).ID()); ok {\n\t\tstack.Finalize.Remove((*retry.Attempt)(nil).ID())\n\t}\n\tif _, ok := stack.Finalize.Get((*retry.MetricsHeader)(nil).ID()); ok {\n\t\tstack.Finalize.Remove((*retry.MetricsHeader)(nil).ID())\n\t}\n\tstack.Deserialize.Clear()\n\tstack.Build.Remove((*awsmiddleware.ClientRequestID)(nil).ID())\n\tstack.Build.Remove(\"UserAgent\")\n\tif err := stack.Finalize.Insert(&presignContextPolyfillMiddleware{}, \"Signing\", middleware.Before); err != nil {\n\t\treturn err\n\t}\n\n\tpmw := v4.NewPresignHTTPRequestMiddleware(v4.PresignHTTPRequestMiddlewareOptions{\n\t\tCredentialsProvider: options.Credentials,\n\t\tPresigner:           c.Presigner,\n\t\tLogSigning:          options.ClientLogMode.IsSigning(),\n\t})\n\tif _, err := stack.Finalize.Swap(\"Signing\", pmw); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddNoPayloadDefaultContentTypeRemover(stack); err != nil {\n\t\treturn err\n\t}\n\n\t// extended s3 presigning\n\tsignermv := s3cust.NewPresignHTTPRequestMiddleware(s3cust.PresignHTTPRequestMiddlewareOptions{\n\t\tCredentialsProvider: options.Credentials,\n\t\tExpressCredentials:  options.ExpressCredentials,\n\t\tV4Presigner:         c.Presigner,\n\t\tV4aPresigner:        c.presignerV4a,\n\t\tLogSigning:          options.ClientLogMode.IsSigning(),\n\t})\n\terr = s3cust.RegisterPreSigningMiddleware(stack, signermv)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif c.Expires < 0 {\n\t\treturn fmt.Errorf(\"presign URL duration must be 0 or greater, %v\", c.Expires)\n\t}\n\t// add middleware to set expiration for s3 presigned url, if expiration is set to\n\t// 0, this middleware sets a default expiration of 900 seconds\n\terr = stack.Build.Add(&s3cust.AddExpiresOnPresignedURL{Expires: c.Expires}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = presignedurlcust.AddAsIsPresigningMiddleware(stack)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc withNoDefaultChecksumAPIOption(options *Options) {\n\toptions.RequestChecksumCalculation = aws.RequestChecksumCalculationWhenRequired\n}\n\nfunc addRequestResponseLogging(stack *middleware.Stack, o Options) error {\n\treturn stack.Deserialize.Add(&smithyhttp.RequestResponseLogger{\n\t\tLogRequest:          o.ClientLogMode.IsRequest(),\n\t\tLogRequestWithBody:  o.ClientLogMode.IsRequestWithBody(),\n\t\tLogResponse:         o.ClientLogMode.IsResponse(),\n\t\tLogResponseWithBody: o.ClientLogMode.IsResponseWithBody(),\n\t}, middleware.After)\n}\n\ntype disableHTTPSMiddleware struct {\n\tDisableHTTPS bool\n}\n\nfunc (*disableHTTPSMiddleware) ID() string {\n\treturn \"disableHTTPS\"\n}\n\nfunc (m *disableHTTPSMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type %T\", in.Request)\n\t}\n\n\tif m.DisableHTTPS && !smithyhttp.GetHostnameImmutable(ctx) {\n\t\treq.URL.Scheme = \"http\"\n\t}\n\n\treturn next.HandleFinalize(ctx, in)\n}\n\nfunc addDisableHTTPSMiddleware(stack *middleware.Stack, o Options) error {\n\treturn stack.Finalize.Insert(&disableHTTPSMiddleware{\n\t\tDisableHTTPS: o.EndpointOptions.DisableHTTPS,\n\t}, \"ResolveEndpointV2\", middleware.After)\n}\n\ntype spanInitializeStart struct {\n}\n\nfunc (*spanInitializeStart) ID() string {\n\treturn \"spanInitializeStart\"\n}\n\nfunc (m *spanInitializeStart) HandleInitialize(\n\tctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler,\n) (\n\tmiddleware.InitializeOutput, middleware.Metadata, error,\n) {\n\tctx, _ = tracing.StartSpan(ctx, \"Initialize\")\n\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype spanInitializeEnd struct {\n}\n\nfunc (*spanInitializeEnd) ID() string {\n\treturn \"spanInitializeEnd\"\n}\n\nfunc (m *spanInitializeEnd) HandleInitialize(\n\tctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler,\n) (\n\tmiddleware.InitializeOutput, middleware.Metadata, error,\n) {\n\tctx, span := tracing.PopSpan(ctx)\n\tspan.End()\n\n\treturn next.HandleInitialize(ctx, in)\n}\n\ntype spanBuildRequestStart struct {\n}\n\nfunc (*spanBuildRequestStart) ID() string {\n\treturn \"spanBuildRequestStart\"\n}\n\nfunc (m *spanBuildRequestStart) HandleSerialize(\n\tctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler,\n) (\n\tmiddleware.SerializeOutput, middleware.Metadata, error,\n) {\n\tctx, _ = tracing.StartSpan(ctx, \"BuildRequest\")\n\n\treturn next.HandleSerialize(ctx, in)\n}\n\ntype spanBuildRequestEnd struct {\n}\n\nfunc (*spanBuildRequestEnd) ID() string {\n\treturn \"spanBuildRequestEnd\"\n}\n\nfunc (m *spanBuildRequestEnd) HandleBuild(\n\tctx context.Context, in middleware.BuildInput, next middleware.BuildHandler,\n) (\n\tmiddleware.BuildOutput, middleware.Metadata, error,\n) {\n\tctx, span := tracing.PopSpan(ctx)\n\tspan.End()\n\n\treturn next.HandleBuild(ctx, in)\n}\n\nfunc addSpanInitializeStart(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&spanInitializeStart{}, middleware.Before)\n}\n\nfunc addSpanInitializeEnd(stack *middleware.Stack) error {\n\treturn stack.Initialize.Add(&spanInitializeEnd{}, middleware.After)\n}\n\nfunc addSpanBuildRequestStart(stack *middleware.Stack) error {\n\treturn stack.Serialize.Add(&spanBuildRequestStart{}, middleware.Before)\n}\n\nfunc addSpanBuildRequestEnd(stack *middleware.Stack) error {\n\treturn stack.Build.Add(&spanBuildRequestEnd{}, middleware.After)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_AbortMultipartUpload.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"time\"\n)\n\n// This operation aborts a multipart upload. After a multipart upload is aborted,\n// no additional parts can be uploaded using that upload ID. The storage consumed\n// by any previously uploaded parts will be freed. However, if any part uploads are\n// currently in progress, those part uploads might or might not succeed. As a\n// result, it might be necessary to abort a given multipart upload multiple times\n// in order to completely free all storage consumed by all parts.\n//\n// To verify that all parts have been removed and prevent getting charged for the\n// part storage, you should call the [ListParts]API operation and ensure that the parts list\n// is empty.\n//\n//   - Directory buckets - If multipart uploads in a directory bucket are in\n//     progress, you can't delete the bucket until all the in-progress multipart\n//     uploads are aborted or completed. To delete these in-progress multipart uploads,\n//     use the ListMultipartUploads operation to list the in-progress multipart\n//     uploads in the bucket and use the AbortMultipartUpload operation to abort all\n//     the in-progress multipart uploads.\n//\n//   - Directory buckets - For directory buckets, you must make requests for this\n//     API operation to the Zonal endpoint. These endpoints support\n//     virtual-hosted-style requests in the format\n//     https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name\n//     . Path-style requests are not supported. For more information about endpoints\n//     in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information\n//     about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// Permissions\n//\n//   - General purpose bucket permissions - For information about permissions\n//     required to use the multipart upload, see [Multipart Upload and Permissions]in the Amazon S3 User Guide.\n//\n//   - Directory bucket permissions - To grant access to this API operation on a\n//     directory bucket, we recommend that you use the [CreateSession]CreateSession API operation\n//     for session-based authorization. Specifically, you grant the\n//     s3express:CreateSession permission to the directory bucket in a bucket policy\n//     or an IAM identity-based policy. Then, you make the CreateSession API call on\n//     the bucket to obtain a session token. With the session token in your request\n//     header, you can make API requests to this operation. After the session token\n//     expires, you make another CreateSession API call to generate a new session\n//     token for use. Amazon Web Services CLI or SDKs create session and refresh the\n//     session token automatically to avoid service interruptions when a session\n//     expires. For more information about authorization, see [CreateSession]CreateSession .\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// Bucket-name.s3express-zone-id.region-code.amazonaws.com .\n//\n// The following operations are related to AbortMultipartUpload :\n//\n// [CreateMultipartUpload]\n//\n// [UploadPart]\n//\n// [CompleteMultipartUpload]\n//\n// [ListParts]\n//\n// [ListMultipartUploads]\n//\n// [ListParts]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [UploadPart]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\n// [ListMultipartUploads]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html\n// [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\n// [Multipart Upload and Permissions]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html\n// [CompleteMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n// [CreateMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html\nfunc (c *Client) AbortMultipartUpload(ctx context.Context, params *AbortMultipartUploadInput, optFns ...func(*Options)) (*AbortMultipartUploadOutput, error) {\n\tif params == nil {\n\t\tparams = &AbortMultipartUploadInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"AbortMultipartUpload\", params, optFns, c.addOperationAbortMultipartUploadMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*AbortMultipartUploadOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype AbortMultipartUploadInput struct {\n\n\t// The bucket name to which the upload was taking place.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use virtual-hosted-style requests in the format\n\t// Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests\n\t// are not supported. Directory bucket names must be unique in the chosen Zone\n\t// (Availability Zone or Local Zone). Bucket names must follow the format\n\t// bucket-base-name--zone-id--x-s3 (for example,\n\t// amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// Object Lambda access points are not supported by directory buckets.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Key of the object for which the multipart upload was initiated.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// Upload ID that identifies the multipart upload.\n\t//\n\t// This member is required.\n\tUploadId *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// If present, this header aborts an in progress multipart upload only if it was\n\t// initiated on the provided timestamp. If the initiated timestamp of the multipart\n\t// upload does not match the provided value, the operation returns a 412\n\t// Precondition Failed error. If the initiated timestamp matches or if the\n\t// multipart upload doesn’t exist, the operation returns a 204 Success (No Content)\n\t// response.\n\t//\n\t// This functionality is only supported for directory buckets.\n\tIfMatchInitiatedTime *time.Time\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *AbortMultipartUploadInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.Key = in.Key\n\n}\n\ntype AbortMultipartUploadOutput struct {\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationAbortMultipartUploadMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpAbortMultipartUpload{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpAbortMultipartUpload{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"AbortMultipartUpload\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpAbortMultipartUploadValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opAbortMultipartUpload(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addAbortMultipartUploadUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *AbortMultipartUploadInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opAbortMultipartUpload(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"AbortMultipartUpload\",\n\t}\n}\n\n// getAbortMultipartUploadBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getAbortMultipartUploadBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*AbortMultipartUploadInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addAbortMultipartUploadUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getAbortMultipartUploadBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_CompleteMultipartUpload.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Completes a multipart upload by assembling previously uploaded parts.\n//\n// You first initiate the multipart upload and then upload all parts using the [UploadPart]\n// operation or the [UploadPartCopy]operation. After successfully uploading all relevant parts of\n// an upload, you call this CompleteMultipartUpload operation to complete the\n// upload. Upon receiving this request, Amazon S3 concatenates all the parts in\n// ascending order by part number to create a new object. In the\n// CompleteMultipartUpload request, you must provide the parts list and ensure that\n// the parts list is complete. The CompleteMultipartUpload API operation\n// concatenates the parts that you provide in the list. For each part in the list,\n// you must provide the PartNumber value and the ETag value that are returned\n// after that part was uploaded.\n//\n// The processing of a CompleteMultipartUpload request could take several minutes\n// to finalize. After Amazon S3 begins processing the request, it sends an HTTP\n// response header that specifies a 200 OK response. While processing is in\n// progress, Amazon S3 periodically sends white space characters to keep the\n// connection from timing out. A request could fail after the initial 200 OK\n// response has been sent. This means that a 200 OK response can contain either a\n// success or an error. The error response might be embedded in the 200 OK\n// response. If you call this API operation directly, make sure to design your\n// application to parse the contents of the response and handle it appropriately.\n// If you use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect\n// the embedded error and apply error handling per your configuration settings\n// (including automatically retrying the request as appropriate). If the condition\n// persists, the SDKs throw an exception (or, for the SDKs that don't use\n// exceptions, they return an error).\n//\n// Note that if CompleteMultipartUpload fails, applications should be prepared to\n// retry any failed requests (including 500 error responses). For more information,\n// see [Amazon S3 Error Best Practices].\n//\n// You can't use Content-Type: application/x-www-form-urlencoded for the\n// CompleteMultipartUpload requests. Also, if you don't provide a Content-Type\n// header, CompleteMultipartUpload can still return a 200 OK response.\n//\n// For more information about multipart uploads, see [Uploading Objects Using Multipart Upload] in the Amazon S3 User Guide.\n//\n// Directory buckets - For directory buckets, you must make requests for this API\n// operation to the Zonal endpoint. These endpoints support virtual-hosted-style\n// requests in the format\n// https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name\n// . Path-style requests are not supported. For more information about endpoints\n// in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information\n// about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// Permissions\n//   - General purpose bucket permissions - For information about permissions\n//     required to use the multipart upload API, see [Multipart Upload and Permissions]in the Amazon S3 User Guide.\n//\n// If you provide an [additional checksum value]in your MultipartUpload requests and the object is encrypted\n//\n//\twith Key Management Service, you must have permission to use the kms:Decrypt\n//\taction for the CompleteMultipartUpload request to succeed.\n//\n//\t- Directory bucket permissions - To grant access to this API operation on a\n//\tdirectory bucket, we recommend that you use the [CreateSession]CreateSession API operation\n//\tfor session-based authorization. Specifically, you grant the\n//\ts3express:CreateSession permission to the directory bucket in a bucket policy\n//\tor an IAM identity-based policy. Then, you make the CreateSession API call on\n//\tthe bucket to obtain a session token. With the session token in your request\n//\theader, you can make API requests to this operation. After the session token\n//\texpires, you make another CreateSession API call to generate a new session\n//\ttoken for use. Amazon Web Services CLI or SDKs create session and refresh the\n//\tsession token automatically to avoid service interruptions when a session\n//\texpires. For more information about authorization, see [CreateSession]CreateSession .\n//\n// If the object is encrypted with SSE-KMS, you must also have the\n//\n//\tkms:GenerateDataKey and kms:Decrypt permissions in IAM identity-based policies\n//\tand KMS key policies for the KMS key.\n//\n// Special errors\n//\n//   - Error Code: EntityTooSmall\n//\n//   - Description: Your proposed upload is smaller than the minimum allowed\n//     object size. Each part must be at least 5 MB in size, except the last part.\n//\n//   - HTTP Status Code: 400 Bad Request\n//\n//   - Error Code: InvalidPart\n//\n//   - Description: One or more of the specified parts could not be found. The\n//     part might not have been uploaded, or the specified ETag might not have matched\n//     the uploaded part's ETag.\n//\n//   - HTTP Status Code: 400 Bad Request\n//\n//   - Error Code: InvalidPartOrder\n//\n//   - Description: The list of parts was not in ascending order. The parts list\n//     must be specified in order by part number.\n//\n//   - HTTP Status Code: 400 Bad Request\n//\n//   - Error Code: NoSuchUpload\n//\n//   - Description: The specified multipart upload does not exist. The upload ID\n//     might be invalid, or the multipart upload might have been aborted or completed.\n//\n//   - HTTP Status Code: 404 Not Found\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// Bucket-name.s3express-zone-id.region-code.amazonaws.com .\n//\n// The following operations are related to CompleteMultipartUpload :\n//\n// [CreateMultipartUpload]\n//\n// [UploadPart]\n//\n// [AbortMultipartUpload]\n//\n// [ListParts]\n//\n// [ListMultipartUploads]\n//\n// [Uploading Objects Using Multipart Upload]: https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html\n// [Amazon S3 Error Best Practices]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ErrorBestPractices.html\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [ListParts]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html\n// [UploadPart]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\n// [additional checksum value]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_Checksum.html\n// [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\n// [CreateMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html\n// [AbortMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html\n// [ListMultipartUploads]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html\n// [Multipart Upload and Permissions]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n//\n// [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\nfunc (c *Client) CompleteMultipartUpload(ctx context.Context, params *CompleteMultipartUploadInput, optFns ...func(*Options)) (*CompleteMultipartUploadOutput, error) {\n\tif params == nil {\n\t\tparams = &CompleteMultipartUploadInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"CompleteMultipartUpload\", params, optFns, c.addOperationCompleteMultipartUploadMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*CompleteMultipartUploadOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype CompleteMultipartUploadInput struct {\n\n\t// Name of the bucket to which the multipart upload was initiated.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use virtual-hosted-style requests in the format\n\t// Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests\n\t// are not supported. Directory bucket names must be unique in the chosen Zone\n\t// (Availability Zone or Local Zone). Bucket names must follow the format\n\t// bucket-base-name--zone-id--x-s3 (for example,\n\t// amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// Object Lambda access points are not supported by directory buckets.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Object key for which the multipart upload was initiated.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// ID for the initiated multipart upload.\n\t//\n\t// This member is required.\n\tUploadId *string\n\n\t// This header can be used as a data integrity check to verify that the data\n\t// received is the same data that was originally sent. This header specifies the\n\t// Base64 encoded, 32-bit CRC32 checksum of the object. For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumCRC32 *string\n\n\t// This header can be used as a data integrity check to verify that the data\n\t// received is the same data that was originally sent. This header specifies the\n\t// Base64 encoded, 32-bit CRC32C checksum of the object. For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumCRC32C *string\n\n\t// This header can be used as a data integrity check to verify that the data\n\t// received is the same data that was originally sent. This header specifies the\n\t// Base64 encoded, 64-bit CRC64NVME checksum of the object. The CRC64NVME checksum\n\t// is always a full object checksum. For more information, see [Checking object integrity in the Amazon S3 User Guide].\n\t//\n\t// [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumCRC64NVME *string\n\n\t// This header can be used as a data integrity check to verify that the data\n\t// received is the same data that was originally sent. This header specifies the\n\t// Base64 encoded, 160-bit SHA1 digest of the object. For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumSHA1 *string\n\n\t// This header can be used as a data integrity check to verify that the data\n\t// received is the same data that was originally sent. This header specifies the\n\t// Base64 encoded, 256-bit SHA256 digest of the object. For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumSHA256 *string\n\n\t// This header specifies the checksum type of the object, which determines how\n\t// part-level checksums are combined to create an object-level checksum for\n\t// multipart objects. You can use this header as a data integrity check to verify\n\t// that the checksum type that is received is the same checksum that was specified.\n\t// If the checksum type doesn’t match the checksum type that was specified for the\n\t// object during the CreateMultipartUpload request, it’ll result in a BadDigest\n\t// error. For more information, see Checking object integrity in the Amazon S3 User\n\t// Guide.\n\tChecksumType types.ChecksumType\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Uploads the object only if the ETag (entity tag) value provided during the\n\t// WRITE operation matches the ETag of the object in S3. If the ETag values do not\n\t// match, the operation returns a 412 Precondition Failed error.\n\t//\n\t// If a conflicting operation occurs during the upload S3 returns a 409\n\t// ConditionalRequestConflict response. On a 409 failure you should fetch the\n\t// object's ETag, re-initiate the multipart upload with CreateMultipartUpload , and\n\t// re-upload each part.\n\t//\n\t// Expects the ETag value as a string.\n\t//\n\t// For more information about conditional requests, see [RFC 7232], or [Conditional requests] in the Amazon S3\n\t// User Guide.\n\t//\n\t// [Conditional requests]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-requests.html\n\t// [RFC 7232]: https://tools.ietf.org/html/rfc7232\n\tIfMatch *string\n\n\t// Uploads the object only if the object key name does not already exist in the\n\t// bucket specified. Otherwise, Amazon S3 returns a 412 Precondition Failed error.\n\t//\n\t// If a conflicting operation occurs during the upload S3 returns a 409\n\t// ConditionalRequestConflict response. On a 409 failure you should re-initiate the\n\t// multipart upload with CreateMultipartUpload and re-upload each part.\n\t//\n\t// Expects the '*' (asterisk) character.\n\t//\n\t// For more information about conditional requests, see [RFC 7232], or [Conditional requests] in the Amazon S3\n\t// User Guide.\n\t//\n\t// [Conditional requests]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-requests.html\n\t// [RFC 7232]: https://tools.ietf.org/html/rfc7232\n\tIfNoneMatch *string\n\n\t//  The expected total object size of the multipart upload request. If there’s a\n\t// mismatch between the specified object size value and the actual object size\n\t// value, it results in an HTTP 400 InvalidRequest error.\n\tMpuObjectSize *int64\n\n\t// The container for the multipart upload request information.\n\tMultipartUpload *types.CompletedMultipartUpload\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// The server-side encryption (SSE) algorithm used to encrypt the object. This\n\t// parameter is required only when the object was created using a checksum\n\t// algorithm or if your bucket policy requires the use of SSE-C. For more\n\t// information, see [Protecting data using SSE-C keys]in the Amazon S3 User Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Protecting data using SSE-C keys]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerSideEncryptionCustomerKeys.html#ssec-require-condition-key\n\tSSECustomerAlgorithm *string\n\n\t// The server-side encryption (SSE) customer managed key. This parameter is needed\n\t// only when the object was created using a checksum algorithm. For more\n\t// information, see [Protecting data using SSE-C keys]in the Amazon S3 User Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Protecting data using SSE-C keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\n\tSSECustomerKey *string\n\n\t// The MD5 server-side encryption (SSE) customer managed key. This parameter is\n\t// needed only when the object was created using a checksum algorithm. For more\n\t// information, see [Protecting data using SSE-C keys]in the Amazon S3 User Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Protecting data using SSE-C keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\n\tSSECustomerKeyMD5 *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *CompleteMultipartUploadInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.Key = in.Key\n\n}\n\ntype CompleteMultipartUploadOutput struct {\n\n\t// The name of the bucket that contains the newly created object. Does not return\n\t// the access point ARN or access point alias if used.\n\t//\n\t// Access points are not supported by directory buckets.\n\tBucket *string\n\n\t// Indicates whether the multipart upload uses an S3 Bucket Key for server-side\n\t// encryption with Key Management Service (KMS) keys (SSE-KMS).\n\tBucketKeyEnabled *bool\n\n\t// The Base64 encoded, 32-bit CRC32 checksum of the object. This checksum is only\n\t// be present if the checksum was uploaded with the object. When you use an API\n\t// operation on an object that was uploaded using multipart uploads, this value may\n\t// not be a direct checksum value of the full object. Instead, it's a calculation\n\t// based on the checksum values of each individual part. For more information about\n\t// how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\n\tChecksumCRC32 *string\n\n\t// The Base64 encoded, 32-bit CRC32C checksum of the object. This checksum is only\n\t// present if the checksum was uploaded with the object. When you use an API\n\t// operation on an object that was uploaded using multipart uploads, this value may\n\t// not be a direct checksum value of the full object. Instead, it's a calculation\n\t// based on the checksum values of each individual part. For more information about\n\t// how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\n\tChecksumCRC32C *string\n\n\t// This header can be used as a data integrity check to verify that the data\n\t// received is the same data that was originally sent. This header specifies the\n\t// Base64 encoded, 64-bit CRC64NVME checksum of the object. The CRC64NVME checksum\n\t// is always a full object checksum. For more information, see [Checking object integrity in the Amazon S3 User Guide].\n\t//\n\t// [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumCRC64NVME *string\n\n\t// The Base64 encoded, 160-bit SHA1 digest of the object. This will only be\n\t// present if the object was uploaded with the object. When you use the API\n\t// operation on an object that was uploaded using multipart uploads, this value may\n\t// not be a direct checksum value of the full object. Instead, it's a calculation\n\t// based on the checksum values of each individual part. For more information about\n\t// how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\n\tChecksumSHA1 *string\n\n\t// The Base64 encoded, 256-bit SHA256 digest of the object. This will only be\n\t// present if the object was uploaded with the object. When you use an API\n\t// operation on an object that was uploaded using multipart uploads, this value may\n\t// not be a direct checksum value of the full object. Instead, it's a calculation\n\t// based on the checksum values of each individual part. For more information about\n\t// how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\n\tChecksumSHA256 *string\n\n\t// The checksum type, which determines how part-level checksums are combined to\n\t// create an object-level checksum for multipart objects. You can use this header\n\t// as a data integrity check to verify that the checksum type that is received is\n\t// the same checksum type that was specified during the CreateMultipartUpload\n\t// request. For more information, see [Checking object integrity in the Amazon S3 User Guide].\n\t//\n\t// [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumType types.ChecksumType\n\n\t// Entity tag that identifies the newly created object's data. Objects with\n\t// different object data will have different entity tags. The entity tag is an\n\t// opaque string. The entity tag may or may not be an MD5 digest of the object\n\t// data. If the entity tag is not an MD5 digest of the object data, it will contain\n\t// one or more nonhexadecimal characters and/or will consist of less than 32 or\n\t// more than 32 hexadecimal digits. For more information about how the entity tag\n\t// is calculated, see [Checking object integrity]in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tETag *string\n\n\t// If the object expiration is configured, this will contain the expiration date (\n\t// expiry-date ) and rule ID ( rule-id ). The value of rule-id is URL-encoded.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tExpiration *string\n\n\t// The object key of the newly created object.\n\tKey *string\n\n\t// The URI that identifies the newly created object.\n\tLocation *string\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// If present, indicates the ID of the KMS key that was used for object encryption.\n\tSSEKMSKeyId *string\n\n\t// The server-side encryption algorithm used when storing this object in Amazon S3\n\t// (for example, AES256 , aws:kms ).\n\tServerSideEncryption types.ServerSideEncryption\n\n\t// Version ID of the newly created object, in case the bucket has versioning\n\t// turned on.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tVersionId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationCompleteMultipartUploadMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpCompleteMultipartUpload{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpCompleteMultipartUpload{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"CompleteMultipartUpload\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpCompleteMultipartUploadValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opCompleteMultipartUpload(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCompleteMultipartUploadUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.HandleResponseErrorWith200Status(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *CompleteMultipartUploadInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opCompleteMultipartUpload(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"CompleteMultipartUpload\",\n\t}\n}\n\n// getCompleteMultipartUploadBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getCompleteMultipartUploadBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*CompleteMultipartUploadInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addCompleteMultipartUploadUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getCompleteMultipartUploadBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_CopyObject.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"time\"\n)\n\n// Creates a copy of an object that is already stored in Amazon S3.\n//\n// You can store individual objects of up to 5 TB in Amazon S3. You create a copy\n// of your object up to 5 GB in size in a single atomic action using this API.\n// However, to copy an object greater than 5 GB, you must use the multipart upload\n// Upload Part - Copy (UploadPartCopy) API. For more information, see [Copy Object Using the REST Multipart Upload API].\n//\n// You can copy individual objects between general purpose buckets, between\n// directory buckets, and between general purpose buckets and directory buckets.\n//\n//   - Amazon S3 supports copy operations using Multi-Region Access Points only as\n//     a destination when using the Multi-Region Access Point ARN.\n//\n//   - Directory buckets - For directory buckets, you must make requests for this\n//     API operation to the Zonal endpoint. These endpoints support\n//     virtual-hosted-style requests in the format\n//     https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name\n//     . Path-style requests are not supported. For more information about endpoints\n//     in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information\n//     about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n//   - VPC endpoints don't support cross-Region requests (including copies). If\n//     you're using VPC endpoints, your source and destination buckets should be in the\n//     same Amazon Web Services Region as your VPC endpoint.\n//\n// Both the Region that you want to copy the object from and the Region that you\n// want to copy the object to must be enabled for your account. For more\n// information about how to enable a Region for your account, see [Enable or disable a Region for standalone accounts]in the Amazon\n// Web Services Account Management Guide.\n//\n// Amazon S3 transfer acceleration does not support cross-Region copies. If you\n// request a cross-Region copy using a transfer acceleration endpoint, you get a\n// 400 Bad Request error. For more information, see [Transfer Acceleration].\n//\n// Authentication and authorization All CopyObject requests must be authenticated\n// and signed by using IAM credentials (access key ID and secret access key for the\n// IAM identities). All headers with the x-amz- prefix, including x-amz-copy-source\n// , must be signed. For more information, see [REST Authentication].\n//\n// Directory buckets - You must use the IAM credentials to authenticate and\n// authorize your access to the CopyObject API operation, instead of using the\n// temporary security credentials through the CreateSession API operation.\n//\n// Amazon Web Services CLI or SDKs handles authentication and authorization on\n// your behalf.\n//\n// Permissions You must have read access to the source object and write access to\n// the destination bucket.\n//\n//   - General purpose bucket permissions - You must have permissions in an IAM\n//     policy based on the source and destination bucket types in a CopyObject\n//     operation.\n//\n//   - If the source object is in a general purpose bucket, you must have\n//     s3:GetObject permission to read the source object that is being copied.\n//\n//   - If the destination bucket is a general purpose bucket, you must have\n//     s3:PutObject permission to write the object copy to the destination bucket.\n//\n//   - Directory bucket permissions - You must have permissions in a bucket policy\n//     or an IAM identity-based policy based on the source and destination bucket types\n//     in a CopyObject operation.\n//\n//   - If the source object that you want to copy is in a directory bucket, you\n//     must have the s3express:CreateSession permission in the Action element of a\n//     policy to read the object. By default, the session is in the ReadWrite mode.\n//     If you want to restrict the access, you can explicitly set the\n//     s3express:SessionMode condition key to ReadOnly on the copy source bucket.\n//\n//   - If the copy destination is a directory bucket, you must have the\n//     s3express:CreateSession permission in the Action element of a policy to write\n//     the object to the destination. The s3express:SessionMode condition key can't\n//     be set to ReadOnly on the copy destination bucket.\n//\n// If the object is encrypted with SSE-KMS, you must also have the\n//\n//\tkms:GenerateDataKey and kms:Decrypt permissions in IAM identity-based policies\n//\tand KMS key policies for the KMS key.\n//\n// For example policies, see [Example bucket policies for S3 Express One Zone]and [Amazon Web Services Identity and Access Management (IAM) identity-based policies for S3 Express One Zone]in the Amazon S3 User Guide.\n//\n// Response and special errors When the request is an HTTP 1.1 request, the\n// response is chunk encoded. When the request is not an HTTP 1.1 request, the\n// response would not contain the Content-Length . You always need to read the\n// entire response body to check if the copy succeeds.\n//\n//   - If the copy is successful, you receive a response with information about\n//     the copied object.\n//\n//   - A copy request might return an error when Amazon S3 receives the copy\n//     request or while Amazon S3 is copying the files. A 200 OK response can contain\n//     either a success or an error.\n//\n//   - If the error occurs before the copy action starts, you receive a standard\n//     Amazon S3 error.\n//\n//   - If the error occurs during the copy operation, the error response is\n//     embedded in the 200 OK response. For example, in a cross-region copy, you may\n//     encounter throttling and receive a 200 OK response. For more information, see [Resolve the Error 200 response when copying objects to Amazon S3]\n//     . The 200 OK status code means the copy was accepted, but it doesn't mean the\n//     copy is complete. Another example is when you disconnect from Amazon S3 before\n//     the copy is complete, Amazon S3 might cancel the copy and you may receive a\n//     200 OK response. You must stay connected to Amazon S3 until the entire\n//     response is successfully received and processed.\n//\n// If you call this API operation directly, make sure to design your application\n//\n//\tto parse the content of the response and handle it appropriately. If you use\n//\tAmazon Web Services SDKs, SDKs handle this condition. The SDKs detect the\n//\tembedded error and apply error handling per your configuration settings\n//\t(including automatically retrying the request as appropriate). If the condition\n//\tpersists, the SDKs throw an exception (or, for the SDKs that don't use\n//\texceptions, they return an error).\n//\n// Charge The copy request charge is based on the storage class and Region that\n// you specify for the destination object. The request can also result in a data\n// retrieval charge for the source if the source storage class bills for data\n// retrieval. If the copy source is in a different region, the data transfer is\n// billed to the copy source account. For pricing information, see [Amazon S3 pricing].\n//\n// HTTP Host header syntax\n//\n//   - Directory buckets - The HTTP Host header syntax is\n//     Bucket-name.s3express-zone-id.region-code.amazonaws.com .\n//\n//   - Amazon S3 on Outposts - When you use this action with S3 on Outposts\n//     through the REST API, you must direct requests to the S3 on Outposts hostname.\n//     The S3 on Outposts hostname takes the form\n//     AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . The\n//     hostname isn't required when you use the Amazon Web Services CLI or SDKs.\n//\n// The following operations are related to CopyObject :\n//\n// [PutObject]\n//\n// [GetObject]\n//\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [Amazon Web Services Identity and Access Management (IAM) identity-based policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-identity-policies.html\n// [Resolve the Error 200 response when copying objects to Amazon S3]: https://repost.aws/knowledge-center/s3-resolve-200-internalerror\n// [Copy Object Using the REST Multipart Upload API]: https://docs.aws.amazon.com/AmazonS3/latest/dev/CopyingObjctsUsingRESTMPUapi.html\n// [REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n// [Example bucket policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-example-bucket-policies.html\n// [Enable or disable a Region for standalone accounts]: https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html#manage-acct-regions-enable-standalone\n// [Transfer Acceleration]: https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html\n// [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\n// [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n// [Amazon S3 pricing]: http://aws.amazon.com/s3/pricing/\nfunc (c *Client) CopyObject(ctx context.Context, params *CopyObjectInput, optFns ...func(*Options)) (*CopyObjectOutput, error) {\n\tif params == nil {\n\t\tparams = &CopyObjectInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"CopyObject\", params, optFns, c.addOperationCopyObjectMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*CopyObjectOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype CopyObjectInput struct {\n\n\t// The name of the destination bucket.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use virtual-hosted-style requests in the format\n\t// Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests\n\t// are not supported. Directory bucket names must be unique in the chosen Zone\n\t// (Availability Zone or Local Zone). Bucket names must follow the format\n\t// bucket-base-name--zone-id--x-s3 (for example,\n\t// amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide.\n\t//\n\t// Copying objects across different Amazon Web Services Regions isn't supported\n\t// when the source or destination bucket is in Amazon Web Services Local Zones. The\n\t// source and destination buckets must have the same parent Amazon Web Services\n\t// Region. Otherwise, you get an HTTP 400 Bad Request error with the error code\n\t// InvalidRequest .\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// Object Lambda access points are not supported by directory buckets.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must use the\n\t// Outpost bucket access point ARN or the access point alias for the destination\n\t// bucket.\n\t//\n\t// You can only copy objects within the same Outpost bucket. It's not supported to\n\t// copy objects across different Amazon Web Services Outposts, between buckets on\n\t// the same Outposts, or between Outposts buckets and any other bucket types. For\n\t// more information about S3 on Outposts, see [What is S3 on Outposts?]in the S3 on Outposts guide. When\n\t// you use this action with S3 on Outposts through the REST API, you must direct\n\t// requests to the S3 on Outposts hostname, in the format\n\t// AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . The\n\t// hostname isn't required when you use the Amazon Web Services CLI or SDKs.\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Specifies the source object for the copy operation. The source object can be up\n\t// to 5 GB. If the source object is an object that was uploaded by using a\n\t// multipart upload, the object copy will be a single part object after the source\n\t// object is copied to the destination bucket.\n\t//\n\t// You specify the value of the copy source in one of two formats, depending on\n\t// whether you want to access the source object through an [access point]:\n\t//\n\t//   - For objects not accessed through an access point, specify the name of the\n\t//   source bucket and the key of the source object, separated by a slash (/). For\n\t//   example, to copy the object reports/january.pdf from the general purpose\n\t//   bucket awsexamplebucket , use awsexamplebucket/reports/january.pdf . The value\n\t//   must be URL-encoded. To copy the object reports/january.pdf from the directory\n\t//   bucket awsexamplebucket--use1-az5--x-s3 , use\n\t//   awsexamplebucket--use1-az5--x-s3/reports/january.pdf . The value must be\n\t//   URL-encoded.\n\t//\n\t//   - For objects accessed through access points, specify the Amazon Resource\n\t//   Name (ARN) of the object as accessed through the access point, in the format\n\t//   arn:aws:s3:::accesspoint//object/ . For example, to copy the object\n\t//   reports/january.pdf through access point my-access-point owned by account\n\t//   123456789012 in Region us-west-2 , use the URL encoding of\n\t//   arn:aws:s3:us-west-2:123456789012:accesspoint/my-access-point/object/reports/january.pdf\n\t//   . The value must be URL encoded.\n\t//\n\t//   - Amazon S3 supports copy operations using Access points only when the source\n\t//   and destination buckets are in the same Amazon Web Services Region.\n\t//\n\t//   - Access points are not supported by directory buckets.\n\t//\n\t// Alternatively, for objects accessed through Amazon S3 on Outposts, specify the\n\t//   ARN of the object as accessed in the format\n\t//   arn:aws:s3-outposts:::outpost//object/ . For example, to copy the object\n\t//   reports/january.pdf through outpost my-outpost owned by account 123456789012\n\t//   in Region us-west-2 , use the URL encoding of\n\t//   arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/object/reports/january.pdf\n\t//   . The value must be URL-encoded.\n\t//\n\t// If your source bucket versioning is enabled, the x-amz-copy-source header by\n\t// default identifies the current version of an object to copy. If the current\n\t// version is a delete marker, Amazon S3 behaves as if the object was deleted. To\n\t// copy a different version, use the versionId query parameter. Specifically,\n\t// append ?versionId= to the value (for example,\n\t// awsexamplebucket/reports/january.pdf?versionId=QUpfdndhfd8438MNFDN93jdnJFkdmqnh893\n\t// ). If you don't specify a version ID, Amazon S3 copies the latest version of the\n\t// source object.\n\t//\n\t// If you enable versioning on the destination bucket, Amazon S3 generates a\n\t// unique version ID for the copied object. This version ID is different from the\n\t// version ID of the source object. Amazon S3 returns the version ID of the copied\n\t// object in the x-amz-version-id response header in the response.\n\t//\n\t// If you do not enable versioning or suspend it on the destination bucket, the\n\t// version ID that Amazon S3 generates in the x-amz-version-id response header is\n\t// always null.\n\t//\n\t// Directory buckets - S3 Versioning isn't enabled and supported for directory\n\t// buckets.\n\t//\n\t// [access point]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points.html\n\t//\n\t// This member is required.\n\tCopySource *string\n\n\t// The key of the destination object.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// The canned access control list (ACL) to apply to the object.\n\t//\n\t// When you copy an object, the ACL metadata is not preserved and is set to private\n\t// by default. Only the owner has full access control. To override the default ACL\n\t// setting, specify a new ACL when you generate a copy request. For more\n\t// information, see [Using ACLs].\n\t//\n\t// If the destination bucket that you're copying objects to uses the bucket owner\n\t// enforced setting for S3 Object Ownership, ACLs are disabled and no longer affect\n\t// permissions. Buckets that use this setting only accept PUT requests that don't\n\t// specify an ACL or PUT requests that specify bucket owner full control ACLs,\n\t// such as the bucket-owner-full-control canned ACL or an equivalent form of this\n\t// ACL expressed in the XML format. For more information, see [Controlling ownership of objects and disabling ACLs]in the Amazon S3\n\t// User Guide.\n\t//\n\t//   - If your destination bucket uses the bucket owner enforced setting for\n\t//   Object Ownership, all objects written to the bucket by any account will be owned\n\t//   by the bucket owner.\n\t//\n\t//   - This functionality is not supported for directory buckets.\n\t//\n\t//   - This functionality is not supported for Amazon S3 on Outposts.\n\t//\n\t// [Using ACLs]: https://docs.aws.amazon.com/AmazonS3/latest/dev/S3_ACLs_UsingACLs.html\n\t// [Controlling ownership of objects and disabling ACLs]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html\n\tACL types.ObjectCannedACL\n\n\t// Specifies whether Amazon S3 should use an S3 Bucket Key for object encryption\n\t// with server-side encryption using Key Management Service (KMS) keys (SSE-KMS).\n\t// If a target object uses SSE-KMS, you can enable an S3 Bucket Key for the object.\n\t//\n\t// Setting this header to true causes Amazon S3 to use an S3 Bucket Key for object\n\t// encryption with SSE-KMS. Specifying this header with a COPY action doesn’t\n\t// affect bucket-level settings for S3 Bucket Key.\n\t//\n\t// For more information, see [Amazon S3 Bucket Keys] in the Amazon S3 User Guide.\n\t//\n\t// Directory buckets - S3 Bucket Keys aren't supported, when you copy SSE-KMS\n\t// encrypted objects from general purpose buckets to directory buckets, from\n\t// directory buckets to general purpose buckets, or between directory buckets,\n\t// through [CopyObject]. In this case, Amazon S3 makes a call to KMS every time a copy request\n\t// is made for a KMS-encrypted object.\n\t//\n\t// [Amazon S3 Bucket Keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-key.html\n\t// [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\n\tBucketKeyEnabled *bool\n\n\t// Specifies the caching behavior along the request/reply chain.\n\tCacheControl *string\n\n\t// Indicates the algorithm that you want Amazon S3 to use to create the checksum\n\t// for the object. For more information, see [Checking object integrity]in the Amazon S3 User Guide.\n\t//\n\t// When you copy an object, if the source object has a checksum, that checksum\n\t// value will be copied to the new object by default. If the CopyObject request\n\t// does not include this x-amz-checksum-algorithm header, the checksum algorithm\n\t// will be copied from the source object to the destination object (if it's present\n\t// on the source object). You can optionally specify a different checksum algorithm\n\t// to use with the x-amz-checksum-algorithm header. Unrecognized or unsupported\n\t// values will respond with the HTTP status code 400 Bad Request .\n\t//\n\t// For directory buckets, when you use Amazon Web Services SDKs, CRC32 is the\n\t// default checksum algorithm that's used for performance.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// Specifies presentational information for the object. Indicates whether an\n\t// object should be displayed in a web browser or downloaded as a file. It allows\n\t// specifying the desired filename for the downloaded file.\n\tContentDisposition *string\n\n\t// Specifies what content encodings have been applied to the object and thus what\n\t// decoding mechanisms must be applied to obtain the media-type referenced by the\n\t// Content-Type header field.\n\t//\n\t// For directory buckets, only the aws-chunked value is supported in this header\n\t// field.\n\tContentEncoding *string\n\n\t// The language the content is in.\n\tContentLanguage *string\n\n\t// A standard MIME type that describes the format of the object data.\n\tContentType *string\n\n\t// Copies the object if its entity tag (ETag) matches the specified tag.\n\t//\n\t// If both the x-amz-copy-source-if-match and x-amz-copy-source-if-unmodified-since\n\t// headers are present in the request and evaluate as follows, Amazon S3 returns\n\t// 200 OK and copies the data:\n\t//\n\t//   - x-amz-copy-source-if-match condition evaluates to true\n\t//\n\t//   - x-amz-copy-source-if-unmodified-since condition evaluates to false\n\tCopySourceIfMatch *string\n\n\t// Copies the object if it has been modified since the specified time.\n\t//\n\t// If both the x-amz-copy-source-if-none-match and\n\t// x-amz-copy-source-if-modified-since headers are present in the request and\n\t// evaluate as follows, Amazon S3 returns the 412 Precondition Failed response\n\t// code:\n\t//\n\t//   - x-amz-copy-source-if-none-match condition evaluates to false\n\t//\n\t//   - x-amz-copy-source-if-modified-since condition evaluates to true\n\tCopySourceIfModifiedSince *time.Time\n\n\t// Copies the object if its entity tag (ETag) is different than the specified ETag.\n\t//\n\t// If both the x-amz-copy-source-if-none-match and\n\t// x-amz-copy-source-if-modified-since headers are present in the request and\n\t// evaluate as follows, Amazon S3 returns the 412 Precondition Failed response\n\t// code:\n\t//\n\t//   - x-amz-copy-source-if-none-match condition evaluates to false\n\t//\n\t//   - x-amz-copy-source-if-modified-since condition evaluates to true\n\tCopySourceIfNoneMatch *string\n\n\t// Copies the object if it hasn't been modified since the specified time.\n\t//\n\t// If both the x-amz-copy-source-if-match and x-amz-copy-source-if-unmodified-since\n\t// headers are present in the request and evaluate as follows, Amazon S3 returns\n\t// 200 OK and copies the data:\n\t//\n\t//   - x-amz-copy-source-if-match condition evaluates to true\n\t//\n\t//   - x-amz-copy-source-if-unmodified-since condition evaluates to false\n\tCopySourceIfUnmodifiedSince *time.Time\n\n\t// Specifies the algorithm to use when decrypting the source object (for example,\n\t// AES256 ).\n\t//\n\t// If the source object for the copy is stored in Amazon S3 using SSE-C, you must\n\t// provide the necessary encryption information in your request so that Amazon S3\n\t// can decrypt the object for copying.\n\t//\n\t// This functionality is not supported when the source object is in a directory\n\t// bucket.\n\tCopySourceSSECustomerAlgorithm *string\n\n\t// Specifies the customer-provided encryption key for Amazon S3 to use to decrypt\n\t// the source object. The encryption key provided in this header must be the same\n\t// one that was used when the source object was created.\n\t//\n\t// If the source object for the copy is stored in Amazon S3 using SSE-C, you must\n\t// provide the necessary encryption information in your request so that Amazon S3\n\t// can decrypt the object for copying.\n\t//\n\t// This functionality is not supported when the source object is in a directory\n\t// bucket.\n\tCopySourceSSECustomerKey *string\n\n\t// Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321.\n\t// Amazon S3 uses this header for a message integrity check to ensure that the\n\t// encryption key was transmitted without error.\n\t//\n\t// If the source object for the copy is stored in Amazon S3 using SSE-C, you must\n\t// provide the necessary encryption information in your request so that Amazon S3\n\t// can decrypt the object for copying.\n\t//\n\t// This functionality is not supported when the source object is in a directory\n\t// bucket.\n\tCopySourceSSECustomerKeyMD5 *string\n\n\t// The account ID of the expected destination bucket owner. If the account ID that\n\t// you provide does not match the actual owner of the destination bucket, the\n\t// request fails with the HTTP status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// The account ID of the expected source bucket owner. If the account ID that you\n\t// provide does not match the actual owner of the source bucket, the request fails\n\t// with the HTTP status code 403 Forbidden (access denied).\n\tExpectedSourceBucketOwner *string\n\n\t// The date and time at which the object is no longer cacheable.\n\tExpires *time.Time\n\n\t// Gives the grantee READ, READ_ACP, and WRITE_ACP permissions on the object.\n\t//\n\t//   - This functionality is not supported for directory buckets.\n\t//\n\t//   - This functionality is not supported for Amazon S3 on Outposts.\n\tGrantFullControl *string\n\n\t// Allows grantee to read the object data and its metadata.\n\t//\n\t//   - This functionality is not supported for directory buckets.\n\t//\n\t//   - This functionality is not supported for Amazon S3 on Outposts.\n\tGrantRead *string\n\n\t// Allows grantee to read the object ACL.\n\t//\n\t//   - This functionality is not supported for directory buckets.\n\t//\n\t//   - This functionality is not supported for Amazon S3 on Outposts.\n\tGrantReadACP *string\n\n\t// Allows grantee to write the ACL for the applicable object.\n\t//\n\t//   - This functionality is not supported for directory buckets.\n\t//\n\t//   - This functionality is not supported for Amazon S3 on Outposts.\n\tGrantWriteACP *string\n\n\t// A map of metadata to store with the object in S3.\n\tMetadata map[string]string\n\n\t// Specifies whether the metadata is copied from the source object or replaced\n\t// with metadata that's provided in the request. When copying an object, you can\n\t// preserve all metadata (the default) or specify new metadata. If this header\n\t// isn’t specified, COPY is the default behavior.\n\t//\n\t// General purpose bucket - For general purpose buckets, when you grant\n\t// permissions, you can use the s3:x-amz-metadata-directive condition key to\n\t// enforce certain metadata behavior when objects are uploaded. For more\n\t// information, see [Amazon S3 condition key examples]in the Amazon S3 User Guide.\n\t//\n\t// x-amz-website-redirect-location is unique to each object and is not copied when\n\t// using the x-amz-metadata-directive header. To copy the value, you must specify\n\t// x-amz-website-redirect-location in the request header.\n\t//\n\t// [Amazon S3 condition key examples]: https://docs.aws.amazon.com/AmazonS3/latest/dev/amazon-s3-policy-keys.html\n\tMetadataDirective types.MetadataDirective\n\n\t// Specifies whether you want to apply a legal hold to the object copy.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tObjectLockLegalHoldStatus types.ObjectLockLegalHoldStatus\n\n\t// The Object Lock mode that you want to apply to the object copy.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tObjectLockMode types.ObjectLockMode\n\n\t// The date and time when you want the Object Lock of the object copy to expire.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tObjectLockRetainUntilDate *time.Time\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// Specifies the algorithm to use when encrypting the object (for example, AES256 ).\n\t//\n\t// When you perform a CopyObject operation, if you want to use a different type of\n\t// encryption setting for the target object, you can specify appropriate\n\t// encryption-related headers to encrypt the target object with an Amazon S3\n\t// managed key, a KMS key, or a customer-provided key. If the encryption setting in\n\t// your request is different from the default encryption configuration of the\n\t// destination bucket, the encryption setting in your request takes precedence.\n\t//\n\t// This functionality is not supported when the destination bucket is a directory\n\t// bucket.\n\tSSECustomerAlgorithm *string\n\n\t// Specifies the customer-provided encryption key for Amazon S3 to use in\n\t// encrypting data. This value is used to store the object and then it is\n\t// discarded. Amazon S3 does not store the encryption key. The key must be\n\t// appropriate for use with the algorithm specified in the\n\t// x-amz-server-side-encryption-customer-algorithm header.\n\t//\n\t// This functionality is not supported when the destination bucket is a directory\n\t// bucket.\n\tSSECustomerKey *string\n\n\t// Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321.\n\t// Amazon S3 uses this header for a message integrity check to ensure that the\n\t// encryption key was transmitted without error.\n\t//\n\t// This functionality is not supported when the destination bucket is a directory\n\t// bucket.\n\tSSECustomerKeyMD5 *string\n\n\t// Specifies the Amazon Web Services KMS Encryption Context as an additional\n\t// encryption context to use for the destination object encryption. The value of\n\t// this header is a base64-encoded UTF-8 string holding JSON with the encryption\n\t// context key-value pairs.\n\t//\n\t// General purpose buckets - This value must be explicitly added to specify\n\t// encryption context for CopyObject requests if you want an additional encryption\n\t// context for your destination object. The additional encryption context of the\n\t// source object won't be copied to the destination object. For more information,\n\t// see [Encryption context]in the Amazon S3 User Guide.\n\t//\n\t// Directory buckets - You can optionally provide an explicit encryption context\n\t// value. The value must match the default encryption context - the bucket Amazon\n\t// Resource Name (ARN). An additional encryption context value is not supported.\n\t//\n\t// [Encryption context]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html#encryption-context\n\tSSEKMSEncryptionContext *string\n\n\t// Specifies the KMS key ID (Key ID, Key ARN, or Key Alias) to use for object\n\t// encryption. All GET and PUT requests for an object protected by KMS will fail if\n\t// they're not made via SSL or using SigV4. For information about configuring any\n\t// of the officially supported Amazon Web Services SDKs and Amazon Web Services\n\t// CLI, see [Specifying the Signature Version in Request Authentication]in the Amazon S3 User Guide.\n\t//\n\t// Directory buckets - To encrypt data using SSE-KMS, it's recommended to specify\n\t// the x-amz-server-side-encryption header to aws:kms . Then, the\n\t// x-amz-server-side-encryption-aws-kms-key-id header implicitly uses the bucket's\n\t// default KMS customer managed key ID. If you want to explicitly set the\n\t// x-amz-server-side-encryption-aws-kms-key-id header, it must match the bucket's\n\t// default customer managed key (using key ID or ARN, not alias). Your SSE-KMS\n\t// configuration can only support 1 [customer managed key]per directory bucket's lifetime. The [Amazon Web Services managed key] ( aws/s3\n\t// ) isn't supported.\n\t//\n\t// Incorrect key specification results in an HTTP 400 Bad Request error.\n\t//\n\t// [customer managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\n\t// [Specifying the Signature Version in Request Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html#specify-signature-version\n\t// [Amazon Web Services managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\n\tSSEKMSKeyId *string\n\n\t// The server-side encryption algorithm used when storing this object in Amazon\n\t// S3. Unrecognized or unsupported values won’t write a destination object and will\n\t// receive a 400 Bad Request response.\n\t//\n\t// Amazon S3 automatically encrypts all new objects that are copied to an S3\n\t// bucket. When copying an object, if you don't specify encryption information in\n\t// your copy request, the encryption setting of the target object is set to the\n\t// default encryption configuration of the destination bucket. By default, all\n\t// buckets have a base level of encryption configuration that uses server-side\n\t// encryption with Amazon S3 managed keys (SSE-S3). If the destination bucket has a\n\t// different default encryption configuration, Amazon S3 uses the corresponding\n\t// encryption key to encrypt the target object copy.\n\t//\n\t// With server-side encryption, Amazon S3 encrypts your data as it writes your\n\t// data to disks in its data centers and decrypts the data when you access it. For\n\t// more information about server-side encryption, see [Using Server-Side Encryption]in the Amazon S3 User Guide.\n\t//\n\t// General purpose buckets\n\t//\n\t//   - For general purpose buckets, there are the following supported options for\n\t//   server-side encryption: server-side encryption with Key Management Service (KMS)\n\t//   keys (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS\n\t//   keys (DSSE-KMS), and server-side encryption with customer-provided encryption\n\t//   keys (SSE-C). Amazon S3 uses the corresponding KMS key, or a customer-provided\n\t//   key to encrypt the target object copy.\n\t//\n\t//   - When you perform a CopyObject operation, if you want to use a different type\n\t//   of encryption setting for the target object, you can specify appropriate\n\t//   encryption-related headers to encrypt the target object with an Amazon S3\n\t//   managed key, a KMS key, or a customer-provided key. If the encryption setting in\n\t//   your request is different from the default encryption configuration of the\n\t//   destination bucket, the encryption setting in your request takes precedence.\n\t//\n\t// Directory buckets\n\t//\n\t//   - For directory buckets, there are only two supported options for server-side\n\t//   encryption: server-side encryption with Amazon S3 managed keys (SSE-S3) (\n\t//   AES256 ) and server-side encryption with KMS keys (SSE-KMS) ( aws:kms ). We\n\t//   recommend that the bucket's default encryption uses the desired encryption\n\t//   configuration and you don't override the bucket default encryption in your\n\t//   CreateSession requests or PUT object requests. Then, new objects are\n\t//   automatically encrypted with the desired encryption settings. For more\n\t//   information, see [Protecting data with server-side encryption]in the Amazon S3 User Guide. For more information about the\n\t//   encryption overriding behaviors in directory buckets, see [Specifying server-side encryption with KMS for new object uploads].\n\t//\n\t//   - To encrypt new object copies to a directory bucket with SSE-KMS, we\n\t//   recommend you specify SSE-KMS as the directory bucket's default encryption\n\t//   configuration with a KMS key (specifically, a [customer managed key]). The [Amazon Web Services managed key]( aws/s3 ) isn't\n\t//   supported. Your SSE-KMS configuration can only support 1 [customer managed key]per directory bucket\n\t//   for the lifetime of the bucket. After you specify a customer managed key for\n\t//   SSE-KMS, you can't override the customer managed key for the bucket's SSE-KMS\n\t//   configuration. Then, when you perform a CopyObject operation and want to\n\t//   specify server-side encryption settings for new object copies with SSE-KMS in\n\t//   the encryption-related request headers, you must ensure the encryption key is\n\t//   the same customer managed key that you specified for the directory bucket's\n\t//   default encryption configuration.\n\t//\n\t// [Using Server-Side Encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/serv-side-encryption.html\n\t// [Specifying server-side encryption with KMS for new object uploads]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html\n\t// [customer managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\n\t// [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\n\t// [Amazon Web Services managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\n\tServerSideEncryption types.ServerSideEncryption\n\n\t// If the x-amz-storage-class header is not used, the copied object will be stored\n\t// in the STANDARD Storage Class by default. The STANDARD storage class provides\n\t// high durability and high availability. Depending on performance needs, you can\n\t// specify a different Storage Class.\n\t//\n\t//   - Directory buckets - Directory buckets only support EXPRESS_ONEZONE (the S3\n\t//   Express One Zone storage class) in Availability Zones and ONEZONE_IA (the S3\n\t//   One Zone-Infrequent Access storage class) in Dedicated Local Zones. Unsupported\n\t//   storage class values won't write a destination object and will respond with the\n\t//   HTTP status code 400 Bad Request .\n\t//\n\t//   - Amazon S3 on Outposts - S3 on Outposts only uses the OUTPOSTS Storage Class.\n\t//\n\t// You can use the CopyObject action to change the storage class of an object that\n\t// is already stored in Amazon S3 by using the x-amz-storage-class header. For\n\t// more information, see [Storage Classes]in the Amazon S3 User Guide.\n\t//\n\t// Before using an object as a source object for the copy operation, you must\n\t// restore a copy of it if it meets any of the following conditions:\n\t//\n\t//   - The storage class of the source object is GLACIER or DEEP_ARCHIVE .\n\t//\n\t//   - The storage class of the source object is INTELLIGENT_TIERING and it's [S3 Intelligent-Tiering access tier]is\n\t//   Archive Access or Deep Archive Access .\n\t//\n\t// For more information, see [RestoreObject] and [Copying Objects] in the Amazon S3 User Guide.\n\t//\n\t// [Storage Classes]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html\n\t// [RestoreObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_RestoreObject.html\n\t// [Copying Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/CopyingObjectsExamples.html\n\t// [S3 Intelligent-Tiering access tier]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/intelligent-tiering-overview.html#intel-tiering-tier-definition\n\tStorageClass types.StorageClass\n\n\t// The tag-set for the object copy in the destination bucket. This value must be\n\t// used in conjunction with the x-amz-tagging-directive if you choose REPLACE for\n\t// the x-amz-tagging-directive . If you choose COPY for the x-amz-tagging-directive\n\t// , you don't need to set the x-amz-tagging header, because the tag-set will be\n\t// copied from the source object directly. The tag-set must be encoded as URL Query\n\t// parameters.\n\t//\n\t// The default value is the empty value.\n\t//\n\t// Directory buckets - For directory buckets in a CopyObject operation, only the\n\t// empty tag-set is supported. Any requests that attempt to write non-empty tags\n\t// into directory buckets will receive a 501 Not Implemented status code. When the\n\t// destination bucket is a directory bucket, you will receive a 501 Not Implemented\n\t// response in any of the following situations:\n\t//\n\t//   - When you attempt to COPY the tag-set from an S3 source object that has\n\t//   non-empty tags.\n\t//\n\t//   - When you attempt to REPLACE the tag-set of a source object and set a\n\t//   non-empty value to x-amz-tagging .\n\t//\n\t//   - When you don't set the x-amz-tagging-directive header and the source object\n\t//   has non-empty tags. This is because the default value of\n\t//   x-amz-tagging-directive is COPY .\n\t//\n\t// Because only the empty tag-set is supported for directory buckets in a\n\t// CopyObject operation, the following situations are allowed:\n\t//\n\t//   - When you attempt to COPY the tag-set from a directory bucket source object\n\t//   that has no tags to a general purpose bucket. It copies an empty tag-set to the\n\t//   destination object.\n\t//\n\t//   - When you attempt to REPLACE the tag-set of a directory bucket source object\n\t//   and set the x-amz-tagging value of the directory bucket destination object to\n\t//   empty.\n\t//\n\t//   - When you attempt to REPLACE the tag-set of a general purpose bucket source\n\t//   object that has non-empty tags and set the x-amz-tagging value of the\n\t//   directory bucket destination object to empty.\n\t//\n\t//   - When you attempt to REPLACE the tag-set of a directory bucket source object\n\t//   and don't set the x-amz-tagging value of the directory bucket destination\n\t//   object. This is because the default value of x-amz-tagging is the empty value.\n\tTagging *string\n\n\t// Specifies whether the object tag-set is copied from the source object or\n\t// replaced with the tag-set that's provided in the request.\n\t//\n\t// The default value is COPY .\n\t//\n\t// Directory buckets - For directory buckets in a CopyObject operation, only the\n\t// empty tag-set is supported. Any requests that attempt to write non-empty tags\n\t// into directory buckets will receive a 501 Not Implemented status code. When the\n\t// destination bucket is a directory bucket, you will receive a 501 Not Implemented\n\t// response in any of the following situations:\n\t//\n\t//   - When you attempt to COPY the tag-set from an S3 source object that has\n\t//   non-empty tags.\n\t//\n\t//   - When you attempt to REPLACE the tag-set of a source object and set a\n\t//   non-empty value to x-amz-tagging .\n\t//\n\t//   - When you don't set the x-amz-tagging-directive header and the source object\n\t//   has non-empty tags. This is because the default value of\n\t//   x-amz-tagging-directive is COPY .\n\t//\n\t// Because only the empty tag-set is supported for directory buckets in a\n\t// CopyObject operation, the following situations are allowed:\n\t//\n\t//   - When you attempt to COPY the tag-set from a directory bucket source object\n\t//   that has no tags to a general purpose bucket. It copies an empty tag-set to the\n\t//   destination object.\n\t//\n\t//   - When you attempt to REPLACE the tag-set of a directory bucket source object\n\t//   and set the x-amz-tagging value of the directory bucket destination object to\n\t//   empty.\n\t//\n\t//   - When you attempt to REPLACE the tag-set of a general purpose bucket source\n\t//   object that has non-empty tags and set the x-amz-tagging value of the\n\t//   directory bucket destination object to empty.\n\t//\n\t//   - When you attempt to REPLACE the tag-set of a directory bucket source object\n\t//   and don't set the x-amz-tagging value of the directory bucket destination\n\t//   object. This is because the default value of x-amz-tagging is the empty value.\n\tTaggingDirective types.TaggingDirective\n\n\t// If the destination bucket is configured as a website, redirects requests for\n\t// this object copy to another object in the same bucket or to an external URL.\n\t// Amazon S3 stores the value of this header in the object metadata. This value is\n\t// unique to each object and is not copied when using the x-amz-metadata-directive\n\t// header. Instead, you may opt to provide this header in combination with the\n\t// x-amz-metadata-directive header.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tWebsiteRedirectLocation *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *CopyObjectInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.CopySource = in.CopySource\n\tp.Key = in.Key\n\tp.DisableS3ExpressSessionAuth = ptr.Bool(true)\n}\n\ntype CopyObjectOutput struct {\n\n\t// Indicates whether the copied object uses an S3 Bucket Key for server-side\n\t// encryption with Key Management Service (KMS) keys (SSE-KMS).\n\tBucketKeyEnabled *bool\n\n\t// Container for all response elements.\n\tCopyObjectResult *types.CopyObjectResult\n\n\t// Version ID of the source object that was copied.\n\t//\n\t// This functionality is not supported when the source object is in a directory\n\t// bucket.\n\tCopySourceVersionId *string\n\n\t// If the object expiration is configured, the response includes this header.\n\t//\n\t// Object expiration information is not returned in directory buckets and this\n\t// header returns the value \" NotImplemented \" in all responses for directory\n\t// buckets.\n\tExpiration *string\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// If server-side encryption with a customer-provided encryption key was\n\t// requested, the response will include this header to confirm the encryption\n\t// algorithm that's used.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerAlgorithm *string\n\n\t// If server-side encryption with a customer-provided encryption key was\n\t// requested, the response will include this header to provide the round-trip\n\t// message integrity verification of the customer-provided encryption key.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerKeyMD5 *string\n\n\t// If present, indicates the Amazon Web Services KMS Encryption Context to use for\n\t// object encryption. The value of this header is a Base64 encoded UTF-8 string\n\t// holding JSON with the encryption context key-value pairs.\n\tSSEKMSEncryptionContext *string\n\n\t// If present, indicates the ID of the KMS key that was used for object encryption.\n\tSSEKMSKeyId *string\n\n\t// The server-side encryption algorithm used when you store this object in Amazon\n\t// S3 (for example, AES256 , aws:kms , aws:kms:dsse ).\n\tServerSideEncryption types.ServerSideEncryption\n\n\t// Version ID of the newly created copy.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tVersionId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationCopyObjectMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpCopyObject{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpCopyObject{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"CopyObject\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpCopyObjectValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opCopyObject(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCopyObjectUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.HandleResponseErrorWith200Status(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *CopyObjectInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opCopyObject(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"CopyObject\",\n\t}\n}\n\n// getCopyObjectBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getCopyObjectBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*CopyObjectInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addCopyObjectUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getCopyObjectBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_CreateBucket.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This action creates an Amazon S3 bucket. To create an Amazon S3 on Outposts\n// bucket, see [CreateBucket]CreateBucket .\n//\n// Creates a new S3 bucket. To create a bucket, you must set up Amazon S3 and have\n// a valid Amazon Web Services Access Key ID to authenticate requests. Anonymous\n// requests are never allowed to create buckets. By creating the bucket, you become\n// the bucket owner.\n//\n// There are two types of buckets: general purpose buckets and directory buckets.\n// For more information about these bucket types, see [Creating, configuring, and working with Amazon S3 buckets]in the Amazon S3 User Guide.\n//\n//   - General purpose buckets - If you send your CreateBucket request to the\n//     s3.amazonaws.com global endpoint, the request goes to the us-east-1 Region. So\n//     the signature calculations in Signature Version 4 must use us-east-1 as the\n//     Region, even if the location constraint in the request specifies another Region\n//     where the bucket is to be created. If you create a bucket in a Region other than\n//     US East (N. Virginia), your application must be able to handle 307 redirect. For\n//     more information, see [Virtual hosting of buckets]in the Amazon S3 User Guide.\n//\n//   - Directory buckets - For directory buckets, you must make requests for this\n//     API operation to the Regional endpoint. These endpoints support path-style\n//     requests in the format\n//     https://s3express-control.region-code.amazonaws.com/bucket-name .\n//     Virtual-hosted-style requests aren't supported. For more information about\n//     endpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more\n//     information about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// Permissions\n//\n//   - General purpose bucket permissions - In addition to the s3:CreateBucket\n//     permission, the following permissions are required in a policy when your\n//     CreateBucket request includes specific headers:\n//\n//   - Access control lists (ACLs) - In your CreateBucket request, if you specify\n//     an access control list (ACL) and set it to public-read , public-read-write ,\n//     authenticated-read , or if you explicitly specify any other custom ACLs, both\n//     s3:CreateBucket and s3:PutBucketAcl permissions are required. In your\n//     CreateBucket request, if you set the ACL to private , or if you don't specify\n//     any ACLs, only the s3:CreateBucket permission is required.\n//\n//   - Object Lock - In your CreateBucket request, if you set\n//     x-amz-bucket-object-lock-enabled to true, the\n//     s3:PutBucketObjectLockConfiguration and s3:PutBucketVersioning permissions are\n//     required.\n//\n//   - S3 Object Ownership - If your CreateBucket request includes the\n//     x-amz-object-ownership header, then the s3:PutBucketOwnershipControls\n//     permission is required.\n//\n// To set an ACL on a bucket as part of a CreateBucket request, you must explicitly\n//\n//\tset S3 Object Ownership for the bucket to a different value than the default,\n//\tBucketOwnerEnforced . Additionally, if your desired bucket ACL grants public\n//\taccess, you must first create the bucket (without the bucket ACL) and then\n//\texplicitly disable Block Public Access on the bucket before using PutBucketAcl\n//\tto set the ACL. If you try to create a bucket with a public ACL, the request\n//\twill fail.\n//\n// For the majority of modern use cases in S3, we recommend that you keep all\n//\n//\tBlock Public Access settings enabled and keep ACLs disabled. If you would like\n//\tto share data with users outside of your account, you can use bucket policies as\n//\tneeded. For more information, see [Controlling ownership of objects and disabling ACLs for your bucket]and [Blocking public access to your Amazon S3 storage]in the Amazon S3 User Guide.\n//\n//\t- S3 Block Public Access - If your specific use case requires granting public\n//\taccess to your S3 resources, you can disable Block Public Access. Specifically,\n//\tyou can create a new bucket with Block Public Access enabled, then separately\n//\tcall the [DeletePublicAccessBlock]DeletePublicAccessBlock API. To use this operation, you must have the\n//\ts3:PutBucketPublicAccessBlock permission. For more information about S3 Block\n//\tPublic Access, see [Blocking public access to your Amazon S3 storage]in the Amazon S3 User Guide.\n//\n//\t- Directory bucket permissions - You must have the s3express:CreateBucket\n//\tpermission in an IAM identity-based policy instead of a bucket policy.\n//\tCross-account access to this API operation isn't supported. This operation can\n//\tonly be performed by the Amazon Web Services account that owns the resource. For\n//\tmore information about directory bucket policies and permissions, see [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]in the\n//\tAmazon S3 User Guide.\n//\n// The permissions for ACLs, Object Lock, S3 Object Ownership, and S3 Block Public\n//\n//\tAccess are not supported for directory buckets. For directory buckets, all Block\n//\tPublic Access settings are enabled at the bucket level and S3 Object Ownership\n//\tis set to Bucket owner enforced (ACLs disabled). These settings can't be\n//\tmodified.\n//\n// For more information about permissions for creating and working with directory\n//\n//\tbuckets, see [Directory buckets]in the Amazon S3 User Guide. For more information about\n//\tsupported S3 features for directory buckets, see [Features of S3 Express One Zone]in the Amazon S3 User Guide.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// s3express-control.region-code.amazonaws.com .\n//\n// The following operations are related to CreateBucket :\n//\n// [PutObject]\n//\n// [DeleteBucket]\n//\n// [Creating, configuring, and working with Amazon S3 buckets]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-buckets-s3.html\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\n// [DeleteBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html\n// [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateBucket.html\n// [Virtual hosting of buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n//\n// [DeletePublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeletePublicAccessBlock.html\n// [Directory buckets]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html\n// [Features of S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-one-zone.html#s3-express-features\n// [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\n// [Controlling ownership of objects and disabling ACLs for your bucket]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html\n// [Blocking public access to your Amazon S3 storage]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html\nfunc (c *Client) CreateBucket(ctx context.Context, params *CreateBucketInput, optFns ...func(*Options)) (*CreateBucketOutput, error) {\n\tif params == nil {\n\t\tparams = &CreateBucketInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"CreateBucket\", params, optFns, c.addOperationCreateBucketMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*CreateBucketOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype CreateBucketInput struct {\n\n\t// The name of the bucket to create.\n\t//\n\t// General purpose buckets - For information about bucket naming restrictions, see [Bucket naming rules]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use path-style requests in the format\n\t// https://s3express-control.region-code.amazonaws.com/bucket-name .\n\t// Virtual-hosted-style requests aren't supported. Directory bucket names must be\n\t// unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must\n\t// also follow the format bucket-base-name--zone-id--x-s3 (for example,\n\t// DOC-EXAMPLE-BUCKET--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [Bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The canned ACL to apply to the bucket.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tACL types.BucketCannedACL\n\n\t// The configuration information for the bucket.\n\tCreateBucketConfiguration *types.CreateBucketConfiguration\n\n\t// Allows grantee the read, write, read ACP, and write ACP permissions on the\n\t// bucket.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tGrantFullControl *string\n\n\t// Allows grantee to list the objects in the bucket.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tGrantRead *string\n\n\t// Allows grantee to read the bucket ACL.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tGrantReadACP *string\n\n\t// Allows grantee to create new objects in the bucket.\n\t//\n\t// For the bucket and object owners of existing objects, also allows deletions and\n\t// overwrites of those objects.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tGrantWrite *string\n\n\t// Allows grantee to write the ACL for the applicable bucket.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tGrantWriteACP *string\n\n\t// Specifies whether you want S3 Object Lock to be enabled for the new bucket.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tObjectLockEnabledForBucket *bool\n\n\t// The container element for object ownership for a bucket's ownership controls.\n\t//\n\t// BucketOwnerPreferred - Objects uploaded to the bucket change ownership to the\n\t// bucket owner if the objects are uploaded with the bucket-owner-full-control\n\t// canned ACL.\n\t//\n\t// ObjectWriter - The uploading account will own the object if the object is\n\t// uploaded with the bucket-owner-full-control canned ACL.\n\t//\n\t// BucketOwnerEnforced - Access control lists (ACLs) are disabled and no longer\n\t// affect permissions. The bucket owner automatically owns and has full control\n\t// over every object in the bucket. The bucket only accepts PUT requests that don't\n\t// specify an ACL or specify bucket owner full control ACLs (such as the predefined\n\t// bucket-owner-full-control canned ACL or a custom ACL in XML format that grants\n\t// the same permissions).\n\t//\n\t// By default, ObjectOwnership is set to BucketOwnerEnforced and ACLs are\n\t// disabled. We recommend keeping ACLs disabled, except in uncommon use cases where\n\t// you must control access for each object individually. For more information about\n\t// S3 Object Ownership, see [Controlling ownership of objects and disabling ACLs for your bucket]in the Amazon S3 User Guide.\n\t//\n\t// This functionality is not supported for directory buckets. Directory buckets\n\t// use the bucket owner enforced setting for S3 Object Ownership.\n\t//\n\t// [Controlling ownership of objects and disabling ACLs for your bucket]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html\n\tObjectOwnership types.ObjectOwnership\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *CreateBucketInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n\tp.DisableAccessPoints = ptr.Bool(true)\n}\n\ntype CreateBucketOutput struct {\n\n\t// A forward slash followed by the name of the bucket.\n\tLocation *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationCreateBucketMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpCreateBucket{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpCreateBucket{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"CreateBucket\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpCreateBucketValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateBucket(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCreateBucketUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *CreateBucketInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opCreateBucket(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"CreateBucket\",\n\t}\n}\n\n// getCreateBucketBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getCreateBucketBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*CreateBucketInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addCreateBucketUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getCreateBucketBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             false,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_CreateBucketMetadataTableConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Creates a metadata table configuration for a general purpose bucket. For more\n// information, see [Accelerating data discovery with S3 Metadata]in the Amazon S3 User Guide.\n//\n// Permissions To use this operation, you must have the following permissions. For\n// more information, see [Setting up permissions for configuring metadata tables]in the Amazon S3 User Guide.\n//\n// If you also want to integrate your table bucket with Amazon Web Services\n// analytics services so that you can query your metadata table, you need\n// additional permissions. For more information, see [Integrating Amazon S3 Tables with Amazon Web Services analytics services]in the Amazon S3 User Guide.\n//\n//   - s3:CreateBucketMetadataTableConfiguration\n//\n//   - s3tables:CreateNamespace\n//\n//   - s3tables:GetTable\n//\n//   - s3tables:CreateTable\n//\n//   - s3tables:PutTablePolicy\n//\n// The following operations are related to CreateBucketMetadataTableConfiguration :\n//\n// [DeleteBucketMetadataTableConfiguration]\n//\n// [GetBucketMetadataTableConfiguration]\n//\n// [Setting up permissions for configuring metadata tables]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-permissions.html\n// [GetBucketMetadataTableConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetadataTableConfiguration.html\n// [DeleteBucketMetadataTableConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetadataTableConfiguration.html\n// [Accelerating data discovery with S3 Metadata]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-overview.html\n// [Integrating Amazon S3 Tables with Amazon Web Services analytics services]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html\nfunc (c *Client) CreateBucketMetadataTableConfiguration(ctx context.Context, params *CreateBucketMetadataTableConfigurationInput, optFns ...func(*Options)) (*CreateBucketMetadataTableConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &CreateBucketMetadataTableConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"CreateBucketMetadataTableConfiguration\", params, optFns, c.addOperationCreateBucketMetadataTableConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*CreateBucketMetadataTableConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype CreateBucketMetadataTableConfigurationInput struct {\n\n\t//  The general purpose bucket that you want to create the metadata table\n\t// configuration in.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t//  The contents of your metadata table configuration.\n\t//\n\t// This member is required.\n\tMetadataTableConfiguration *types.MetadataTableConfiguration\n\n\t//  The checksum algorithm to use with your metadata table configuration.\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t//  The Content-MD5 header for the metadata table configuration.\n\tContentMD5 *string\n\n\t//  The expected owner of the general purpose bucket that contains your metadata\n\t// table configuration.\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *CreateBucketMetadataTableConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype CreateBucketMetadataTableConfigurationOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationCreateBucketMetadataTableConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpCreateBucketMetadataTableConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpCreateBucketMetadataTableConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"CreateBucketMetadataTableConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpCreateBucketMetadataTableConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateBucketMetadataTableConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCreateBucketMetadataTableConfigurationInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCreateBucketMetadataTableConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *CreateBucketMetadataTableConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opCreateBucketMetadataTableConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"CreateBucketMetadataTableConfiguration\",\n\t}\n}\n\n// getCreateBucketMetadataTableConfigurationRequestAlgorithmMember gets the\n// request checksum algorithm value provided as input.\nfunc getCreateBucketMetadataTableConfigurationRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*CreateBucketMetadataTableConfigurationInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addCreateBucketMetadataTableConfigurationInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getCreateBucketMetadataTableConfigurationRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getCreateBucketMetadataTableConfigurationBucketMember returns a pointer to\n// string denoting a provided bucket member valueand a boolean indicating if the\n// input has a modeled bucket name,\nfunc getCreateBucketMetadataTableConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*CreateBucketMetadataTableConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addCreateBucketMetadataTableConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getCreateBucketMetadataTableConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_CreateMultipartUpload.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"time\"\n)\n\n// This action initiates a multipart upload and returns an upload ID. This upload\n// ID is used to associate all of the parts in the specific multipart upload. You\n// specify this upload ID in each of your subsequent upload part requests (see [UploadPart]).\n// You also include this upload ID in the final request to either complete or abort\n// the multipart upload request. For more information about multipart uploads, see [Multipart Upload Overview]\n// in the Amazon S3 User Guide.\n//\n// After you initiate a multipart upload and upload one or more parts, to stop\n// being charged for storing the uploaded parts, you must either complete or abort\n// the multipart upload. Amazon S3 frees up the space used to store the parts and\n// stops charging you for storing them only after you either complete or abort a\n// multipart upload.\n//\n// If you have configured a lifecycle rule to abort incomplete multipart uploads,\n// the created multipart upload must be completed within the number of days\n// specified in the bucket lifecycle configuration. Otherwise, the incomplete\n// multipart upload becomes eligible for an abort action and Amazon S3 aborts the\n// multipart upload. For more information, see [Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration].\n//\n//   - Directory buckets - S3 Lifecycle is not supported by directory buckets.\n//\n//   - Directory buckets - For directory buckets, you must make requests for this\n//     API operation to the Zonal endpoint. These endpoints support\n//     virtual-hosted-style requests in the format\n//     https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name\n//     . Path-style requests are not supported. For more information about endpoints\n//     in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information\n//     about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// Request signing For request signing, multipart upload is just a series of\n// regular requests. You initiate a multipart upload, send one or more requests to\n// upload parts, and then complete the multipart upload process. You sign each\n// request individually. There is nothing special about signing multipart upload\n// requests. For more information about signing, see [Authenticating Requests (Amazon Web Services Signature Version 4)]in the Amazon S3 User Guide.\n//\n// Permissions\n//\n//   - General purpose bucket permissions - To perform a multipart upload with\n//     encryption using an Key Management Service (KMS) KMS key, the requester must\n//     have permission to the kms:Decrypt and kms:GenerateDataKey actions on the key.\n//     The requester must also have permissions for the kms:GenerateDataKey action\n//     for the CreateMultipartUpload API. Then, the requester needs permissions for\n//     the kms:Decrypt action on the UploadPart and UploadPartCopy APIs. These\n//     permissions are required because Amazon S3 must decrypt and read data from the\n//     encrypted file parts before it completes the multipart upload. For more\n//     information, see [Multipart upload API and permissions]and [Protecting data using server-side encryption with Amazon Web Services KMS]in the Amazon S3 User Guide.\n//\n//   - Directory bucket permissions - To grant access to this API operation on a\n//     directory bucket, we recommend that you use the [CreateSession]CreateSession API operation\n//     for session-based authorization. Specifically, you grant the\n//     s3express:CreateSession permission to the directory bucket in a bucket policy\n//     or an IAM identity-based policy. Then, you make the CreateSession API call on\n//     the bucket to obtain a session token. With the session token in your request\n//     header, you can make API requests to this operation. After the session token\n//     expires, you make another CreateSession API call to generate a new session\n//     token for use. Amazon Web Services CLI or SDKs create session and refresh the\n//     session token automatically to avoid service interruptions when a session\n//     expires. For more information about authorization, see [CreateSession]CreateSession .\n//\n// Encryption\n//\n//   - General purpose buckets - Server-side encryption is for data encryption at\n//     rest. Amazon S3 encrypts your data as it writes it to disks in its data centers\n//     and decrypts it when you access it. Amazon S3 automatically encrypts all new\n//     objects that are uploaded to an S3 bucket. When doing a multipart upload, if you\n//     don't specify encryption information in your request, the encryption setting of\n//     the uploaded parts is set to the default encryption configuration of the\n//     destination bucket. By default, all buckets have a base level of encryption\n//     configuration that uses server-side encryption with Amazon S3 managed keys\n//     (SSE-S3). If the destination bucket has a default encryption configuration that\n//     uses server-side encryption with an Key Management Service (KMS) key (SSE-KMS),\n//     or a customer-provided encryption key (SSE-C), Amazon S3 uses the corresponding\n//     KMS key, or a customer-provided key to encrypt the uploaded parts. When you\n//     perform a CreateMultipartUpload operation, if you want to use a different type\n//     of encryption setting for the uploaded parts, you can request that Amazon S3\n//     encrypts the object with a different encryption key (such as an Amazon S3\n//     managed key, a KMS key, or a customer-provided key). When the encryption setting\n//     in your request is different from the default encryption configuration of the\n//     destination bucket, the encryption setting in your request takes precedence. If\n//     you choose to provide your own encryption key, the request headers you provide\n//     in [UploadPart]and [UploadPartCopy]requests must match the headers you used in the CreateMultipartUpload\n//     request.\n//\n//   - Use KMS keys (SSE-KMS) that include the Amazon Web Services managed key (\n//     aws/s3 ) and KMS customer managed keys stored in Key Management Service (KMS)\n//     – If you want Amazon Web Services to manage the keys used to encrypt data,\n//     specify the following headers in the request.\n//\n//   - x-amz-server-side-encryption\n//\n//   - x-amz-server-side-encryption-aws-kms-key-id\n//\n//   - x-amz-server-side-encryption-context\n//\n//   - If you specify x-amz-server-side-encryption:aws:kms , but don't provide\n//     x-amz-server-side-encryption-aws-kms-key-id , Amazon S3 uses the Amazon Web\n//     Services managed key ( aws/s3 key) in KMS to protect the data.\n//\n//   - To perform a multipart upload with encryption by using an Amazon Web\n//     Services KMS key, the requester must have permission to the kms:Decrypt and\n//     kms:GenerateDataKey* actions on the key. These permissions are required\n//     because Amazon S3 must decrypt and read data from the encrypted file parts\n//     before it completes the multipart upload. For more information, see [Multipart upload API and permissions]and [Protecting data using server-side encryption with Amazon Web Services KMS]in\n//     the Amazon S3 User Guide.\n//\n//   - If your Identity and Access Management (IAM) user or role is in the same\n//     Amazon Web Services account as the KMS key, then you must have these permissions\n//     on the key policy. If your IAM user or role is in a different account from the\n//     key, then you must have the permissions on both the key policy and your IAM user\n//     or role.\n//\n//   - All GET and PUT requests for an object protected by KMS fail if you don't\n//     make them by using Secure Sockets Layer (SSL), Transport Layer Security (TLS),\n//     or Signature Version 4. For information about configuring any of the officially\n//     supported Amazon Web Services SDKs and Amazon Web Services CLI, see [Specifying the Signature Version in Request Authentication]in the\n//     Amazon S3 User Guide.\n//\n// For more information about server-side encryption with KMS keys (SSE-KMS), see [Protecting Data Using Server-Side Encryption with KMS keys]\n//\n//\tin the Amazon S3 User Guide.\n//\n//\t- Use customer-provided encryption keys (SSE-C) – If you want to manage your\n//\town encryption keys, provide all the following headers in the request.\n//\n//\t- x-amz-server-side-encryption-customer-algorithm\n//\n//\t- x-amz-server-side-encryption-customer-key\n//\n//\t- x-amz-server-side-encryption-customer-key-MD5\n//\n// For more information about server-side encryption with customer-provided\n//\n//\tencryption keys (SSE-C), see [Protecting data using server-side encryption with customer-provided encryption keys (SSE-C)]in the Amazon S3 User Guide.\n//\n//\t- Directory buckets - For directory buckets, there are only two supported\n//\toptions for server-side encryption: server-side encryption with Amazon S3\n//\tmanaged keys (SSE-S3) ( AES256 ) and server-side encryption with KMS keys\n//\t(SSE-KMS) ( aws:kms ). We recommend that the bucket's default encryption uses\n//\tthe desired encryption configuration and you don't override the bucket default\n//\tencryption in your CreateSession requests or PUT object requests. Then, new\n//\tobjects are automatically encrypted with the desired encryption settings. For\n//\tmore information, see [Protecting data with server-side encryption]in the Amazon S3 User Guide. For more information about\n//\tthe encryption overriding behaviors in directory buckets, see [Specifying server-side encryption with KMS for new object uploads].\n//\n// In the Zonal endpoint API calls (except [CopyObject]and [UploadPartCopy]) using the REST API, the\n//\n//\tencryption request headers must match the encryption settings that are specified\n//\tin the CreateSession request. You can't override the values of the encryption\n//\tsettings ( x-amz-server-side-encryption ,\n//\tx-amz-server-side-encryption-aws-kms-key-id ,\n//\tx-amz-server-side-encryption-context , and\n//\tx-amz-server-side-encryption-bucket-key-enabled ) that are specified in the\n//\tCreateSession request. You don't need to explicitly specify these encryption\n//\tsettings values in Zonal endpoint API calls, and Amazon S3 will use the\n//\tencryption settings values from the CreateSession request to protect new\n//\tobjects in the directory bucket.\n//\n// When you use the CLI or the Amazon Web Services SDKs, for CreateSession , the\n//\n//\tsession token refreshes automatically to avoid service interruptions when a\n//\tsession expires. The CLI or the Amazon Web Services SDKs use the bucket's\n//\tdefault encryption configuration for the CreateSession request. It's not\n//\tsupported to override the encryption settings values in the CreateSession\n//\trequest. So in the Zonal endpoint API calls (except [CopyObject]and [UploadPartCopy]), the encryption\n//\trequest headers must match the default encryption configuration of the directory\n//\tbucket.\n//\n// For directory buckets, when you perform a CreateMultipartUpload operation and an\n//\n//\tUploadPartCopy operation, the request headers you provide in the\n//\tCreateMultipartUpload request must match the default encryption configuration\n//\tof the destination bucket.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// Bucket-name.s3express-zone-id.region-code.amazonaws.com .\n//\n// The following operations are related to CreateMultipartUpload :\n//\n// [UploadPart]\n//\n// [CompleteMultipartUpload]\n//\n// [AbortMultipartUpload]\n//\n// [ListParts]\n//\n// [ListMultipartUploads]\n//\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [ListParts]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html\n// [UploadPart]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\n// [Protecting Data Using Server-Side Encryption with KMS keys]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html\n// [Specifying the Signature Version in Request Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html#specify-signature-version\n// [Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config\n// [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\n// [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\n// [Multipart upload API and permissions]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpuAndPermissions\n// [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\n// [CompleteMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html\n// [Authenticating Requests (Amazon Web Services Signature Version 4)]: https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html\n// [AbortMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html\n// [Multipart Upload Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html\n// [Protecting data using server-side encryption with Amazon Web Services KMS]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html\n// [ListMultipartUploads]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n//\n// [Specifying server-side encryption with KMS for new object uploads]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html\n// [Protecting data using server-side encryption with customer-provided encryption keys (SSE-C)]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerSideEncryptionCustomerKeys.html\n// [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\nfunc (c *Client) CreateMultipartUpload(ctx context.Context, params *CreateMultipartUploadInput, optFns ...func(*Options)) (*CreateMultipartUploadOutput, error) {\n\tif params == nil {\n\t\tparams = &CreateMultipartUploadInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"CreateMultipartUpload\", params, optFns, c.addOperationCreateMultipartUploadMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*CreateMultipartUploadOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype CreateMultipartUploadInput struct {\n\n\t// The name of the bucket where the multipart upload is initiated and where the\n\t// object is uploaded.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use virtual-hosted-style requests in the format\n\t// Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests\n\t// are not supported. Directory bucket names must be unique in the chosen Zone\n\t// (Availability Zone or Local Zone). Bucket names must follow the format\n\t// bucket-base-name--zone-id--x-s3 (for example,\n\t// amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// Object Lambda access points are not supported by directory buckets.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Object key for which the multipart upload is to be initiated.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// The canned ACL to apply to the object. Amazon S3 supports a set of predefined\n\t// ACLs, known as canned ACLs. Each canned ACL has a predefined set of grantees and\n\t// permissions. For more information, see [Canned ACL]in the Amazon S3 User Guide.\n\t//\n\t// By default, all objects are private. Only the owner has full access control.\n\t// When uploading an object, you can grant access permissions to individual Amazon\n\t// Web Services accounts or to predefined groups defined by Amazon S3. These\n\t// permissions are then added to the access control list (ACL) on the new object.\n\t// For more information, see [Using ACLs]. One way to grant the permissions using the request\n\t// headers is to specify a canned ACL with the x-amz-acl request header.\n\t//\n\t//   - This functionality is not supported for directory buckets.\n\t//\n\t//   - This functionality is not supported for Amazon S3 on Outposts.\n\t//\n\t// [Canned ACL]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#CannedACL\n\t// [Using ACLs]: https://docs.aws.amazon.com/AmazonS3/latest/dev/S3_ACLs_UsingACLs.html\n\tACL types.ObjectCannedACL\n\n\t// Specifies whether Amazon S3 should use an S3 Bucket Key for object encryption\n\t// with server-side encryption using Key Management Service (KMS) keys (SSE-KMS).\n\t//\n\t// General purpose buckets - Setting this header to true causes Amazon S3 to use\n\t// an S3 Bucket Key for object encryption with SSE-KMS. Also, specifying this\n\t// header with a PUT action doesn't affect bucket-level settings for S3 Bucket Key.\n\t//\n\t// Directory buckets - S3 Bucket Keys are always enabled for GET and PUT\n\t// operations in a directory bucket and can’t be disabled. S3 Bucket Keys aren't\n\t// supported, when you copy SSE-KMS encrypted objects from general purpose buckets\n\t// to directory buckets, from directory buckets to general purpose buckets, or\n\t// between directory buckets, through [CopyObject], [UploadPartCopy], [the Copy operation in Batch Operations], or [the import jobs]. In this case, Amazon S3 makes a\n\t// call to KMS every time a copy request is made for a KMS-encrypted object.\n\t//\n\t// [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\n\t// [the import jobs]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-import-job\n\t// [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\n\t// [the Copy operation in Batch Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-Batch-Ops\n\tBucketKeyEnabled *bool\n\n\t// Specifies caching behavior along the request/reply chain.\n\tCacheControl *string\n\n\t// Indicates the algorithm that you want Amazon S3 to use to create the checksum\n\t// for the object. For more information, see [Checking object integrity]in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// Indicates the checksum type that you want Amazon S3 to use to calculate the\n\t// object’s checksum value. For more information, see [Checking object integrity in the Amazon S3 User Guide].\n\t//\n\t// [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumType types.ChecksumType\n\n\t// Specifies presentational information for the object.\n\tContentDisposition *string\n\n\t// Specifies what content encodings have been applied to the object and thus what\n\t// decoding mechanisms must be applied to obtain the media-type referenced by the\n\t// Content-Type header field.\n\t//\n\t// For directory buckets, only the aws-chunked value is supported in this header\n\t// field.\n\tContentEncoding *string\n\n\t// The language that the content is in.\n\tContentLanguage *string\n\n\t// A standard MIME type describing the format of the object data.\n\tContentType *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// The date and time at which the object is no longer cacheable.\n\tExpires *time.Time\n\n\t// Specify access permissions explicitly to give the grantee READ, READ_ACP, and\n\t// WRITE_ACP permissions on the object.\n\t//\n\t// By default, all objects are private. Only the owner has full access control.\n\t// When uploading an object, you can use this header to explicitly grant access\n\t// permissions to specific Amazon Web Services accounts or groups. This header maps\n\t// to specific permissions that Amazon S3 supports in an ACL. For more information,\n\t// see [Access Control List (ACL) Overview]in the Amazon S3 User Guide.\n\t//\n\t// You specify each grantee as a type=value pair, where the type is one of the\n\t// following:\n\t//\n\t//   - id – if the value specified is the canonical user ID of an Amazon Web\n\t//   Services account\n\t//\n\t//   - uri – if you are granting permissions to a predefined group\n\t//\n\t//   - emailAddress – if the value specified is the email address of an Amazon Web\n\t//   Services account\n\t//\n\t// Using email addresses to specify a grantee is only supported in the following\n\t//   Amazon Web Services Regions:\n\t//\n\t//   - US East (N. Virginia)\n\t//\n\t//   - US West (N. California)\n\t//\n\t//   - US West (Oregon)\n\t//\n\t//   - Asia Pacific (Singapore)\n\t//\n\t//   - Asia Pacific (Sydney)\n\t//\n\t//   - Asia Pacific (Tokyo)\n\t//\n\t//   - Europe (Ireland)\n\t//\n\t//   - South America (São Paulo)\n\t//\n\t// For a list of all the Amazon S3 supported Regions and endpoints, see [Regions and Endpoints]in the\n\t//   Amazon Web Services General Reference.\n\t//\n\t// For example, the following x-amz-grant-read header grants the Amazon Web\n\t// Services accounts identified by account IDs permissions to read object data and\n\t// its metadata:\n\t//\n\t//     x-amz-grant-read: id=\"11112222333\", id=\"444455556666\"\n\t//\n\t//   - This functionality is not supported for directory buckets.\n\t//\n\t//   - This functionality is not supported for Amazon S3 on Outposts.\n\t//\n\t// [Regions and Endpoints]: https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\n\t// [Access Control List (ACL) Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html\n\tGrantFullControl *string\n\n\t// Specify access permissions explicitly to allow grantee to read the object data\n\t// and its metadata.\n\t//\n\t// By default, all objects are private. Only the owner has full access control.\n\t// When uploading an object, you can use this header to explicitly grant access\n\t// permissions to specific Amazon Web Services accounts or groups. This header maps\n\t// to specific permissions that Amazon S3 supports in an ACL. For more information,\n\t// see [Access Control List (ACL) Overview]in the Amazon S3 User Guide.\n\t//\n\t// You specify each grantee as a type=value pair, where the type is one of the\n\t// following:\n\t//\n\t//   - id – if the value specified is the canonical user ID of an Amazon Web\n\t//   Services account\n\t//\n\t//   - uri – if you are granting permissions to a predefined group\n\t//\n\t//   - emailAddress – if the value specified is the email address of an Amazon Web\n\t//   Services account\n\t//\n\t// Using email addresses to specify a grantee is only supported in the following\n\t//   Amazon Web Services Regions:\n\t//\n\t//   - US East (N. Virginia)\n\t//\n\t//   - US West (N. California)\n\t//\n\t//   - US West (Oregon)\n\t//\n\t//   - Asia Pacific (Singapore)\n\t//\n\t//   - Asia Pacific (Sydney)\n\t//\n\t//   - Asia Pacific (Tokyo)\n\t//\n\t//   - Europe (Ireland)\n\t//\n\t//   - South America (São Paulo)\n\t//\n\t// For a list of all the Amazon S3 supported Regions and endpoints, see [Regions and Endpoints]in the\n\t//   Amazon Web Services General Reference.\n\t//\n\t// For example, the following x-amz-grant-read header grants the Amazon Web\n\t// Services accounts identified by account IDs permissions to read object data and\n\t// its metadata:\n\t//\n\t//     x-amz-grant-read: id=\"11112222333\", id=\"444455556666\"\n\t//\n\t//   - This functionality is not supported for directory buckets.\n\t//\n\t//   - This functionality is not supported for Amazon S3 on Outposts.\n\t//\n\t// [Regions and Endpoints]: https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\n\t// [Access Control List (ACL) Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html\n\tGrantRead *string\n\n\t// Specify access permissions explicitly to allows grantee to read the object ACL.\n\t//\n\t// By default, all objects are private. Only the owner has full access control.\n\t// When uploading an object, you can use this header to explicitly grant access\n\t// permissions to specific Amazon Web Services accounts or groups. This header maps\n\t// to specific permissions that Amazon S3 supports in an ACL. For more information,\n\t// see [Access Control List (ACL) Overview]in the Amazon S3 User Guide.\n\t//\n\t// You specify each grantee as a type=value pair, where the type is one of the\n\t// following:\n\t//\n\t//   - id – if the value specified is the canonical user ID of an Amazon Web\n\t//   Services account\n\t//\n\t//   - uri – if you are granting permissions to a predefined group\n\t//\n\t//   - emailAddress – if the value specified is the email address of an Amazon Web\n\t//   Services account\n\t//\n\t// Using email addresses to specify a grantee is only supported in the following\n\t//   Amazon Web Services Regions:\n\t//\n\t//   - US East (N. Virginia)\n\t//\n\t//   - US West (N. California)\n\t//\n\t//   - US West (Oregon)\n\t//\n\t//   - Asia Pacific (Singapore)\n\t//\n\t//   - Asia Pacific (Sydney)\n\t//\n\t//   - Asia Pacific (Tokyo)\n\t//\n\t//   - Europe (Ireland)\n\t//\n\t//   - South America (São Paulo)\n\t//\n\t// For a list of all the Amazon S3 supported Regions and endpoints, see [Regions and Endpoints]in the\n\t//   Amazon Web Services General Reference.\n\t//\n\t// For example, the following x-amz-grant-read header grants the Amazon Web\n\t// Services accounts identified by account IDs permissions to read object data and\n\t// its metadata:\n\t//\n\t//     x-amz-grant-read: id=\"11112222333\", id=\"444455556666\"\n\t//\n\t//   - This functionality is not supported for directory buckets.\n\t//\n\t//   - This functionality is not supported for Amazon S3 on Outposts.\n\t//\n\t// [Regions and Endpoints]: https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\n\t// [Access Control List (ACL) Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html\n\tGrantReadACP *string\n\n\t// Specify access permissions explicitly to allows grantee to allow grantee to\n\t// write the ACL for the applicable object.\n\t//\n\t// By default, all objects are private. Only the owner has full access control.\n\t// When uploading an object, you can use this header to explicitly grant access\n\t// permissions to specific Amazon Web Services accounts or groups. This header maps\n\t// to specific permissions that Amazon S3 supports in an ACL. For more information,\n\t// see [Access Control List (ACL) Overview]in the Amazon S3 User Guide.\n\t//\n\t// You specify each grantee as a type=value pair, where the type is one of the\n\t// following:\n\t//\n\t//   - id – if the value specified is the canonical user ID of an Amazon Web\n\t//   Services account\n\t//\n\t//   - uri – if you are granting permissions to a predefined group\n\t//\n\t//   - emailAddress – if the value specified is the email address of an Amazon Web\n\t//   Services account\n\t//\n\t// Using email addresses to specify a grantee is only supported in the following\n\t//   Amazon Web Services Regions:\n\t//\n\t//   - US East (N. Virginia)\n\t//\n\t//   - US West (N. California)\n\t//\n\t//   - US West (Oregon)\n\t//\n\t//   - Asia Pacific (Singapore)\n\t//\n\t//   - Asia Pacific (Sydney)\n\t//\n\t//   - Asia Pacific (Tokyo)\n\t//\n\t//   - Europe (Ireland)\n\t//\n\t//   - South America (São Paulo)\n\t//\n\t// For a list of all the Amazon S3 supported Regions and endpoints, see [Regions and Endpoints]in the\n\t//   Amazon Web Services General Reference.\n\t//\n\t// For example, the following x-amz-grant-read header grants the Amazon Web\n\t// Services accounts identified by account IDs permissions to read object data and\n\t// its metadata:\n\t//\n\t//     x-amz-grant-read: id=\"11112222333\", id=\"444455556666\"\n\t//\n\t//   - This functionality is not supported for directory buckets.\n\t//\n\t//   - This functionality is not supported for Amazon S3 on Outposts.\n\t//\n\t// [Regions and Endpoints]: https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\n\t// [Access Control List (ACL) Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html\n\tGrantWriteACP *string\n\n\t// A map of metadata to store with the object in S3.\n\tMetadata map[string]string\n\n\t// Specifies whether you want to apply a legal hold to the uploaded object.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tObjectLockLegalHoldStatus types.ObjectLockLegalHoldStatus\n\n\t// Specifies the Object Lock mode that you want to apply to the uploaded object.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tObjectLockMode types.ObjectLockMode\n\n\t// Specifies the date and time when you want the Object Lock to expire.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tObjectLockRetainUntilDate *time.Time\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// Specifies the algorithm to use when encrypting the object (for example, AES256).\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerAlgorithm *string\n\n\t// Specifies the customer-provided encryption key for Amazon S3 to use in\n\t// encrypting data. This value is used to store the object and then it is\n\t// discarded; Amazon S3 does not store the encryption key. The key must be\n\t// appropriate for use with the algorithm specified in the\n\t// x-amz-server-side-encryption-customer-algorithm header.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerKey *string\n\n\t// Specifies the 128-bit MD5 digest of the customer-provided encryption key\n\t// according to RFC 1321. Amazon S3 uses this header for a message integrity check\n\t// to ensure that the encryption key was transmitted without error.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerKeyMD5 *string\n\n\t// Specifies the Amazon Web Services KMS Encryption Context to use for object\n\t// encryption. The value of this header is a Base64 encoded string of a UTF-8\n\t// encoded JSON, which contains the encryption context as key-value pairs.\n\t//\n\t// Directory buckets - You can optionally provide an explicit encryption context\n\t// value. The value must match the default encryption context - the bucket Amazon\n\t// Resource Name (ARN). An additional encryption context value is not supported.\n\tSSEKMSEncryptionContext *string\n\n\t// Specifies the KMS key ID (Key ID, Key ARN, or Key Alias) to use for object\n\t// encryption. If the KMS key doesn't exist in the same account that's issuing the\n\t// command, you must use the full Key ARN not the Key ID.\n\t//\n\t// General purpose buckets - If you specify x-amz-server-side-encryption with\n\t// aws:kms or aws:kms:dsse , this header specifies the ID (Key ID, Key ARN, or Key\n\t// Alias) of the KMS key to use. If you specify\n\t// x-amz-server-side-encryption:aws:kms or\n\t// x-amz-server-side-encryption:aws:kms:dsse , but do not provide\n\t// x-amz-server-side-encryption-aws-kms-key-id , Amazon S3 uses the Amazon Web\n\t// Services managed key ( aws/s3 ) to protect the data.\n\t//\n\t// Directory buckets - To encrypt data using SSE-KMS, it's recommended to specify\n\t// the x-amz-server-side-encryption header to aws:kms . Then, the\n\t// x-amz-server-side-encryption-aws-kms-key-id header implicitly uses the bucket's\n\t// default KMS customer managed key ID. If you want to explicitly set the\n\t// x-amz-server-side-encryption-aws-kms-key-id header, it must match the bucket's\n\t// default customer managed key (using key ID or ARN, not alias). Your SSE-KMS\n\t// configuration can only support 1 [customer managed key]per directory bucket's lifetime. The [Amazon Web Services managed key] ( aws/s3\n\t// ) isn't supported.\n\t//\n\t// Incorrect key specification results in an HTTP 400 Bad Request error.\n\t//\n\t// [customer managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\n\t// [Amazon Web Services managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\n\tSSEKMSKeyId *string\n\n\t// The server-side encryption algorithm used when you store this object in Amazon\n\t// S3 (for example, AES256 , aws:kms ).\n\t//\n\t//   - Directory buckets - For directory buckets, there are only two supported\n\t//   options for server-side encryption: server-side encryption with Amazon S3\n\t//   managed keys (SSE-S3) ( AES256 ) and server-side encryption with KMS keys\n\t//   (SSE-KMS) ( aws:kms ). We recommend that the bucket's default encryption uses\n\t//   the desired encryption configuration and you don't override the bucket default\n\t//   encryption in your CreateSession requests or PUT object requests. Then, new\n\t//   objects are automatically encrypted with the desired encryption settings. For\n\t//   more information, see [Protecting data with server-side encryption]in the Amazon S3 User Guide. For more information about\n\t//   the encryption overriding behaviors in directory buckets, see [Specifying server-side encryption with KMS for new object uploads].\n\t//\n\t// In the Zonal endpoint API calls (except [CopyObject]and [UploadPartCopy]) using the REST API, the\n\t//   encryption request headers must match the encryption settings that are specified\n\t//   in the CreateSession request. You can't override the values of the encryption\n\t//   settings ( x-amz-server-side-encryption ,\n\t//   x-amz-server-side-encryption-aws-kms-key-id ,\n\t//   x-amz-server-side-encryption-context , and\n\t//   x-amz-server-side-encryption-bucket-key-enabled ) that are specified in the\n\t//   CreateSession request. You don't need to explicitly specify these encryption\n\t//   settings values in Zonal endpoint API calls, and Amazon S3 will use the\n\t//   encryption settings values from the CreateSession request to protect new\n\t//   objects in the directory bucket.\n\t//\n\t// When you use the CLI or the Amazon Web Services SDKs, for CreateSession , the\n\t//   session token refreshes automatically to avoid service interruptions when a\n\t//   session expires. The CLI or the Amazon Web Services SDKs use the bucket's\n\t//   default encryption configuration for the CreateSession request. It's not\n\t//   supported to override the encryption settings values in the CreateSession\n\t//   request. So in the Zonal endpoint API calls (except [CopyObject]and [UploadPartCopy]), the encryption\n\t//   request headers must match the default encryption configuration of the directory\n\t//   bucket.\n\t//\n\t// [Specifying server-side encryption with KMS for new object uploads]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html\n\t// [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\n\t// [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\n\t// [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\n\tServerSideEncryption types.ServerSideEncryption\n\n\t// By default, Amazon S3 uses the STANDARD Storage Class to store newly created\n\t// objects. The STANDARD storage class provides high durability and high\n\t// availability. Depending on performance needs, you can specify a different\n\t// Storage Class. For more information, see [Storage Classes]in the Amazon S3 User Guide.\n\t//\n\t//   - Directory buckets only support EXPRESS_ONEZONE (the S3 Express One Zone\n\t//   storage class) in Availability Zones and ONEZONE_IA (the S3 One\n\t//   Zone-Infrequent Access storage class) in Dedicated Local Zones.\n\t//\n\t//   - Amazon S3 on Outposts only uses the OUTPOSTS Storage Class.\n\t//\n\t// [Storage Classes]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html\n\tStorageClass types.StorageClass\n\n\t// The tag-set for the object. The tag-set must be encoded as URL Query parameters.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tTagging *string\n\n\t// If the bucket is configured as a website, redirects requests for this object to\n\t// another object in the same bucket or to an external URL. Amazon S3 stores the\n\t// value of this header in the object metadata.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tWebsiteRedirectLocation *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *CreateMultipartUploadInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.Key = in.Key\n\n}\n\ntype CreateMultipartUploadOutput struct {\n\n\t// If the bucket has a lifecycle rule configured with an action to abort\n\t// incomplete multipart uploads and the prefix in the lifecycle rule matches the\n\t// object name in the request, the response includes this header. The header\n\t// indicates when the initiated multipart upload becomes eligible for an abort\n\t// operation. For more information, see [Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration]in the Amazon S3 User Guide.\n\t//\n\t// The response also includes the x-amz-abort-rule-id header that provides the ID\n\t// of the lifecycle configuration rule that defines the abort action.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config\n\tAbortDate *time.Time\n\n\t// This header is returned along with the x-amz-abort-date header. It identifies\n\t// the applicable lifecycle configuration rule that defines the action to abort\n\t// incomplete multipart uploads.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tAbortRuleId *string\n\n\t// The name of the bucket to which the multipart upload was initiated. Does not\n\t// return the access point ARN or access point alias if used.\n\t//\n\t// Access points are not supported by directory buckets.\n\tBucket *string\n\n\t// Indicates whether the multipart upload uses an S3 Bucket Key for server-side\n\t// encryption with Key Management Service (KMS) keys (SSE-KMS).\n\tBucketKeyEnabled *bool\n\n\t// The algorithm that was used to create a checksum of the object.\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t//  Indicates the checksum type that you want Amazon S3 to use to calculate the\n\t// object’s checksum value. For more information, see [Checking object integrity in the Amazon S3 User Guide].\n\t//\n\t// [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumType types.ChecksumType\n\n\t// Object key for which the multipart upload was initiated.\n\tKey *string\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// If server-side encryption with a customer-provided encryption key was\n\t// requested, the response will include this header to confirm the encryption\n\t// algorithm that's used.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerAlgorithm *string\n\n\t// If server-side encryption with a customer-provided encryption key was\n\t// requested, the response will include this header to provide the round-trip\n\t// message integrity verification of the customer-provided encryption key.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerKeyMD5 *string\n\n\t// If present, indicates the Amazon Web Services KMS Encryption Context to use for\n\t// object encryption. The value of this header is a Base64 encoded string of a\n\t// UTF-8 encoded JSON, which contains the encryption context as key-value pairs.\n\tSSEKMSEncryptionContext *string\n\n\t// If present, indicates the ID of the KMS key that was used for object encryption.\n\tSSEKMSKeyId *string\n\n\t// The server-side encryption algorithm used when you store this object in Amazon\n\t// S3 (for example, AES256 , aws:kms ).\n\tServerSideEncryption types.ServerSideEncryption\n\n\t// ID for the initiated multipart upload.\n\tUploadId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationCreateMultipartUploadMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpCreateMultipartUpload{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpCreateMultipartUpload{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"CreateMultipartUpload\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpCreateMultipartUploadValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateMultipartUpload(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCreateMultipartUploadUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetCreateMPUChecksumAlgorithm(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *CreateMultipartUploadInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opCreateMultipartUpload(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"CreateMultipartUpload\",\n\t}\n}\n\n// getCreateMultipartUploadBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getCreateMultipartUploadBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*CreateMultipartUploadInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addCreateMultipartUploadUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getCreateMultipartUploadBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_CreateSession.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Creates a session that establishes temporary security credentials to support\n// fast authentication and authorization for the Zonal endpoint API operations on\n// directory buckets. For more information about Zonal endpoint API operations that\n// include the Availability Zone in the request endpoint, see [S3 Express One Zone APIs]in the Amazon S3\n// User Guide.\n//\n// To make Zonal endpoint API requests on a directory bucket, use the CreateSession\n// API operation. Specifically, you grant s3express:CreateSession permission to a\n// bucket in a bucket policy or an IAM identity-based policy. Then, you use IAM\n// credentials to make the CreateSession API request on the bucket, which returns\n// temporary security credentials that include the access key ID, secret access\n// key, session token, and expiration. These credentials have associated\n// permissions to access the Zonal endpoint API operations. After the session is\n// created, you don’t need to use other policies to grant permissions to each Zonal\n// endpoint API individually. Instead, in your Zonal endpoint API requests, you\n// sign your requests by applying the temporary security credentials of the session\n// to the request headers and following the SigV4 protocol for authentication. You\n// also apply the session token to the x-amz-s3session-token request header for\n// authorization. Temporary security credentials are scoped to the bucket and\n// expire after 5 minutes. After the expiration time, any calls that you make with\n// those credentials will fail. You must use IAM credentials again to make a\n// CreateSession API request that generates a new set of temporary credentials for\n// use. Temporary credentials cannot be extended or refreshed beyond the original\n// specified interval.\n//\n// If you use Amazon Web Services SDKs, SDKs handle the session token refreshes\n// automatically to avoid service interruptions when a session expires. We\n// recommend that you use the Amazon Web Services SDKs to initiate and manage\n// requests to the CreateSession API. For more information, see [Performance guidelines and design patterns]in the Amazon S3\n// User Guide.\n//\n//   - You must make requests for this API operation to the Zonal endpoint. These\n//     endpoints support virtual-hosted-style requests in the format\n//     https://bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style\n//     requests are not supported. For more information about endpoints in Availability\n//     Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information about endpoints\n//     in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n//   - CopyObject API operation - Unlike other Zonal endpoint API operations, the\n//     CopyObject API operation doesn't use the temporary security credentials\n//     returned from the CreateSession API operation for authentication and\n//     authorization. For information about authentication and authorization of the\n//     CopyObject API operation on directory buckets, see [CopyObject].\n//\n//   - HeadBucket API operation - Unlike other Zonal endpoint API operations, the\n//     HeadBucket API operation doesn't use the temporary security credentials\n//     returned from the CreateSession API operation for authentication and\n//     authorization. For information about authentication and authorization of the\n//     HeadBucket API operation on directory buckets, see [HeadBucket].\n//\n// Permissions To obtain temporary security credentials, you must create a bucket\n// policy or an IAM identity-based policy that grants s3express:CreateSession\n// permission to the bucket. In a policy, you can have the s3express:SessionMode\n// condition key to control who can create a ReadWrite or ReadOnly session. For\n// more information about ReadWrite or ReadOnly sessions, see [x-amz-create-session-mode]\n// x-amz-create-session-mode . For example policies, see [Example bucket policies for S3 Express One Zone] and [Amazon Web Services Identity and Access Management (IAM) identity-based policies for S3 Express One Zone] in the Amazon S3\n// User Guide.\n//\n// To grant cross-account access to Zonal endpoint API operations, the bucket\n// policy should also grant both accounts the s3express:CreateSession permission.\n//\n// If you want to encrypt objects with SSE-KMS, you must also have the\n// kms:GenerateDataKey and the kms:Decrypt permissions in IAM identity-based\n// policies and KMS key policies for the target KMS key.\n//\n// Encryption For directory buckets, there are only two supported options for\n// server-side encryption: server-side encryption with Amazon S3 managed keys\n// (SSE-S3) ( AES256 ) and server-side encryption with KMS keys (SSE-KMS) ( aws:kms\n// ). We recommend that the bucket's default encryption uses the desired encryption\n// configuration and you don't override the bucket default encryption in your\n// CreateSession requests or PUT object requests. Then, new objects are\n// automatically encrypted with the desired encryption settings. For more\n// information, see [Protecting data with server-side encryption]in the Amazon S3 User Guide. For more information about the\n// encryption overriding behaviors in directory buckets, see [Specifying server-side encryption with KMS for new object uploads].\n//\n// For [Zonal endpoint (object-level) API operations] except [CopyObject] and [UploadPartCopy], you authenticate and authorize requests through [CreateSession] for low\n// latency. To encrypt new objects in a directory bucket with SSE-KMS, you must\n// specify SSE-KMS as the directory bucket's default encryption configuration with\n// a KMS key (specifically, a [customer managed key]). Then, when a session is created for Zonal\n// endpoint API operations, new objects are automatically encrypted and decrypted\n// with SSE-KMS and S3 Bucket Keys during the session.\n//\n// Only 1 [customer managed key] is supported per directory bucket for the lifetime of the bucket. The [Amazon Web Services managed key] (\n// aws/s3 ) isn't supported. After you specify SSE-KMS as your bucket's default\n// encryption configuration with a customer managed key, you can't change the\n// customer managed key for the bucket's SSE-KMS configuration.\n//\n// In the Zonal endpoint API calls (except [CopyObject] and [UploadPartCopy]) using the REST API, you can't\n// override the values of the encryption settings ( x-amz-server-side-encryption ,\n// x-amz-server-side-encryption-aws-kms-key-id ,\n// x-amz-server-side-encryption-context , and\n// x-amz-server-side-encryption-bucket-key-enabled ) from the CreateSession\n// request. You don't need to explicitly specify these encryption settings values\n// in Zonal endpoint API calls, and Amazon S3 will use the encryption settings\n// values from the CreateSession request to protect new objects in the directory\n// bucket.\n//\n// When you use the CLI or the Amazon Web Services SDKs, for CreateSession , the\n// session token refreshes automatically to avoid service interruptions when a\n// session expires. The CLI or the Amazon Web Services SDKs use the bucket's\n// default encryption configuration for the CreateSession request. It's not\n// supported to override the encryption settings values in the CreateSession\n// request. Also, in the Zonal endpoint API calls (except [CopyObject]and [UploadPartCopy]), it's not\n// supported to override the values of the encryption settings from the\n// CreateSession request.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// Bucket-name.s3express-zone-id.region-code.amazonaws.com .\n//\n// [Specifying server-side encryption with KMS for new object uploads]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [Performance guidelines and design patterns]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-optimizing-performance-guidelines-design-patterns.html#s3-express-optimizing-performance-session-authentication\n// [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\n// [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\n// [S3 Express One Zone APIs]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-APIs.html\n// [HeadBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadBucket.html\n// [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\n// [Amazon Web Services managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\n// [Amazon Web Services Identity and Access Management (IAM) identity-based policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-identity-policies.html\n// [Example bucket policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-example-bucket-policies.html\n// [customer managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\n// [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\n// [x-amz-create-session-mode]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html#API_CreateSession_RequestParameters\n// [Zonal endpoint (object-level) API operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-differences.html#s3-express-differences-api-operations\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\nfunc (c *Client) CreateSession(ctx context.Context, params *CreateSessionInput, optFns ...func(*Options)) (*CreateSessionOutput, error) {\n\tif params == nil {\n\t\tparams = &CreateSessionInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"CreateSession\", params, optFns, c.addOperationCreateSessionMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*CreateSessionOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype CreateSessionInput struct {\n\n\t// The name of the bucket that you create a session for.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Specifies whether Amazon S3 should use an S3 Bucket Key for object encryption\n\t// with server-side encryption using KMS keys (SSE-KMS).\n\t//\n\t// S3 Bucket Keys are always enabled for GET and PUT operations in a directory\n\t// bucket and can’t be disabled. S3 Bucket Keys aren't supported, when you copy\n\t// SSE-KMS encrypted objects from general purpose buckets to directory buckets,\n\t// from directory buckets to general purpose buckets, or between directory buckets,\n\t// through [CopyObject], [UploadPartCopy], [the Copy operation in Batch Operations], or [the import jobs]. In this case, Amazon S3 makes a call to KMS every time a\n\t// copy request is made for a KMS-encrypted object.\n\t//\n\t// [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\n\t// [the import jobs]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-import-job\n\t// [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\n\t// [the Copy operation in Batch Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-Batch-Ops\n\tBucketKeyEnabled *bool\n\n\t// Specifies the Amazon Web Services KMS Encryption Context as an additional\n\t// encryption context to use for object encryption. The value of this header is a\n\t// Base64 encoded string of a UTF-8 encoded JSON, which contains the encryption\n\t// context as key-value pairs. This value is stored as object metadata and\n\t// automatically gets passed on to Amazon Web Services KMS for future GetObject\n\t// operations on this object.\n\t//\n\t// General purpose buckets - This value must be explicitly added during CopyObject\n\t// operations if you want an additional encryption context for your object. For\n\t// more information, see [Encryption context]in the Amazon S3 User Guide.\n\t//\n\t// Directory buckets - You can optionally provide an explicit encryption context\n\t// value. The value must match the default encryption context - the bucket Amazon\n\t// Resource Name (ARN). An additional encryption context value is not supported.\n\t//\n\t// [Encryption context]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html#encryption-context\n\tSSEKMSEncryptionContext *string\n\n\t// If you specify x-amz-server-side-encryption with aws:kms , you must specify the\n\t// x-amz-server-side-encryption-aws-kms-key-id header with the ID (Key ID or Key\n\t// ARN) of the KMS symmetric encryption customer managed key to use. Otherwise, you\n\t// get an HTTP 400 Bad Request error. Only use the key ID or key ARN. The key\n\t// alias format of the KMS key isn't supported. Also, if the KMS key doesn't exist\n\t// in the same account that't issuing the command, you must use the full Key ARN\n\t// not the Key ID.\n\t//\n\t// Your SSE-KMS configuration can only support 1 [customer managed key] per directory bucket's lifetime.\n\t// The [Amazon Web Services managed key]( aws/s3 ) isn't supported.\n\t//\n\t// [customer managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\n\t// [Amazon Web Services managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\n\tSSEKMSKeyId *string\n\n\t// The server-side encryption algorithm to use when you store objects in the\n\t// directory bucket.\n\t//\n\t// For directory buckets, there are only two supported options for server-side\n\t// encryption: server-side encryption with Amazon S3 managed keys (SSE-S3) ( AES256\n\t// ) and server-side encryption with KMS keys (SSE-KMS) ( aws:kms ). By default,\n\t// Amazon S3 encrypts data with SSE-S3. For more information, see [Protecting data with server-side encryption]in the Amazon S3\n\t// User Guide.\n\t//\n\t// [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html\n\tServerSideEncryption types.ServerSideEncryption\n\n\t// Specifies the mode of the session that will be created, either ReadWrite or\n\t// ReadOnly . By default, a ReadWrite session is created. A ReadWrite session is\n\t// capable of executing all the Zonal endpoint API operations on a directory\n\t// bucket. A ReadOnly session is constrained to execute the following Zonal\n\t// endpoint API operations: GetObject , HeadObject , ListObjectsV2 ,\n\t// GetObjectAttributes , ListParts , and ListMultipartUploads .\n\tSessionMode types.SessionMode\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *CreateSessionInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.DisableS3ExpressSessionAuth = ptr.Bool(true)\n}\n\ntype CreateSessionOutput struct {\n\n\t// The established temporary security credentials for the created session.\n\t//\n\t// This member is required.\n\tCredentials *types.SessionCredentials\n\n\t// Indicates whether to use an S3 Bucket Key for server-side encryption with KMS\n\t// keys (SSE-KMS).\n\tBucketKeyEnabled *bool\n\n\t// If present, indicates the Amazon Web Services KMS Encryption Context to use for\n\t// object encryption. The value of this header is a Base64 encoded string of a\n\t// UTF-8 encoded JSON, which contains the encryption context as key-value pairs.\n\t// This value is stored as object metadata and automatically gets passed on to\n\t// Amazon Web Services KMS for future GetObject operations on this object.\n\tSSEKMSEncryptionContext *string\n\n\t// If you specify x-amz-server-side-encryption with aws:kms , this header indicates\n\t// the ID of the KMS symmetric encryption customer managed key that was used for\n\t// object encryption.\n\tSSEKMSKeyId *string\n\n\t// The server-side encryption algorithm used when you store objects in the\n\t// directory bucket.\n\tServerSideEncryption types.ServerSideEncryption\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationCreateSessionMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpCreateSession{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpCreateSession{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"CreateSession\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpCreateSessionValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateSession(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCreateSessionUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *CreateSessionInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opCreateSession(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"CreateSession\",\n\t}\n}\n\n// getCreateSessionBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getCreateSessionBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*CreateSessionInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addCreateSessionUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getCreateSessionBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucket.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Deletes the S3 bucket. All objects (including all object versions and delete\n// markers) in the bucket must be deleted before the bucket itself can be deleted.\n//\n//   - Directory buckets - If multipart uploads in a directory bucket are in\n//     progress, you can't delete the bucket until all the in-progress multipart\n//     uploads are aborted or completed.\n//\n//   - Directory buckets - For directory buckets, you must make requests for this\n//     API operation to the Regional endpoint. These endpoints support path-style\n//     requests in the format\n//     https://s3express-control.region-code.amazonaws.com/bucket-name .\n//     Virtual-hosted-style requests aren't supported. For more information about\n//     endpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more\n//     information about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// Permissions\n//\n//   - General purpose bucket permissions - You must have the s3:DeleteBucket\n//     permission on the specified bucket in a policy.\n//\n//   - Directory bucket permissions - You must have the s3express:DeleteBucket\n//     permission in an IAM identity-based policy instead of a bucket policy.\n//     Cross-account access to this API operation isn't supported. This operation can\n//     only be performed by the Amazon Web Services account that owns the resource. For\n//     more information about directory bucket policies and permissions, see [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]in the\n//     Amazon S3 User Guide.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// s3express-control.region-code.amazonaws.com .\n//\n// The following operations are related to DeleteBucket :\n//\n// [CreateBucket]\n//\n// [DeleteObject]\n//\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [DeleteObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html\n// [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n// [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\nfunc (c *Client) DeleteBucket(ctx context.Context, params *DeleteBucketInput, optFns ...func(*Options)) (*DeleteBucketOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteBucketInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteBucket\", params, optFns, c.addOperationDeleteBucketMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteBucketOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteBucketInput struct {\n\n\t// Specifies the bucket being deleted.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use path-style requests in the format\n\t// https://s3express-control.region-code.amazonaws.com/bucket-name .\n\t// Virtual-hosted-style requests aren't supported. Directory bucket names must be\n\t// unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must\n\t// also follow the format bucket-base-name--zone-id--x-s3 (for example,\n\t// DOC-EXAMPLE-BUCKET--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\t//\n\t// For directory buckets, this header is not supported in this API operation. If\n\t// you specify this header, the request fails with the HTTP status code 501 Not\n\t// Implemented .\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *DeleteBucketInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype DeleteBucketOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteBucketMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucket{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucket{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteBucket\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteBucketValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucket(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeleteBucketUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *DeleteBucketInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opDeleteBucket(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteBucket\",\n\t}\n}\n\n// getDeleteBucketBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getDeleteBucketBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*DeleteBucketInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addDeleteBucketUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getDeleteBucketBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             false,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n\n// PresignDeleteBucket is used to generate a presigned HTTP Request which contains\n// presigned URL, signed headers and HTTP method used.\nfunc (c *PresignClient) PresignDeleteBucket(ctx context.Context, params *DeleteBucketInput, optFns ...func(*PresignOptions)) (*v4.PresignedHTTPRequest, error) {\n\tif params == nil {\n\t\tparams = &DeleteBucketInput{}\n\t}\n\toptions := c.options.copy()\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\tclientOptFns := append(options.ClientOptions, withNopHTTPClientAPIOption)\n\n\tresult, _, err := c.client.invokeOperation(ctx, \"DeleteBucket\", params, clientOptFns,\n\t\tc.client.addOperationDeleteBucketMiddlewares,\n\t\tpresignConverter(options).convertToPresignMiddleware,\n\t\taddDeleteBucketPayloadAsUnsigned,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*v4.PresignedHTTPRequest)\n\treturn out, nil\n}\n\nfunc addDeleteBucketPayloadAsUnsigned(stack *middleware.Stack, options Options) error {\n\tv4.RemoveContentSHA256HeaderMiddleware(stack)\n\tv4.RemoveComputePayloadSHA256Middleware(stack)\n\treturn v4.AddUnsignedPayloadMiddleware(stack)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketAnalyticsConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Deletes an analytics configuration for the bucket (specified by the analytics\n// configuration ID).\n//\n// To use this operation, you must have permissions to perform the\n// s3:PutAnalyticsConfiguration action. The bucket owner has this permission by\n// default. The bucket owner can grant this permission to others. For more\n// information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources].\n//\n// For information about the Amazon S3 analytics feature, see [Amazon S3 Analytics – Storage Class Analysis].\n//\n// The following operations are related to DeleteBucketAnalyticsConfiguration :\n//\n// [GetBucketAnalyticsConfiguration]\n//\n// [ListBucketAnalyticsConfigurations]\n//\n// [PutBucketAnalyticsConfiguration]\n//\n// [Amazon S3 Analytics – Storage Class Analysis]: https://docs.aws.amazon.com/AmazonS3/latest/dev/analytics-storage-class.html\n// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [GetBucketAnalyticsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketAnalyticsConfiguration.html\n// [ListBucketAnalyticsConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketAnalyticsConfigurations.html\n// [PutBucketAnalyticsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAnalyticsConfiguration.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\nfunc (c *Client) DeleteBucketAnalyticsConfiguration(ctx context.Context, params *DeleteBucketAnalyticsConfigurationInput, optFns ...func(*Options)) (*DeleteBucketAnalyticsConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteBucketAnalyticsConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteBucketAnalyticsConfiguration\", params, optFns, c.addOperationDeleteBucketAnalyticsConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteBucketAnalyticsConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteBucketAnalyticsConfigurationInput struct {\n\n\t// The name of the bucket from which an analytics configuration is deleted.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The ID that identifies the analytics configuration.\n\t//\n\t// This member is required.\n\tId *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *DeleteBucketAnalyticsConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype DeleteBucketAnalyticsConfigurationOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteBucketAnalyticsConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketAnalyticsConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketAnalyticsConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteBucketAnalyticsConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteBucketAnalyticsConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketAnalyticsConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeleteBucketAnalyticsConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *DeleteBucketAnalyticsConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opDeleteBucketAnalyticsConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteBucketAnalyticsConfiguration\",\n\t}\n}\n\n// getDeleteBucketAnalyticsConfigurationBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getDeleteBucketAnalyticsConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*DeleteBucketAnalyticsConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addDeleteBucketAnalyticsConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getDeleteBucketAnalyticsConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketCors.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Deletes the cors configuration information set for the bucket.\n//\n// To use this operation, you must have permission to perform the s3:PutBucketCORS\n// action. The bucket owner has this permission by default and can grant this\n// permission to others.\n//\n// For information about cors , see [Enabling Cross-Origin Resource Sharing] in the Amazon S3 User Guide.\n//\n// # Related Resources\n//\n// [PutBucketCors]\n//\n// [RESTOPTIONSobject]\n//\n// [PutBucketCors]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketCors.html\n// [Enabling Cross-Origin Resource Sharing]: https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html\n// [RESTOPTIONSobject]: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTOPTIONSobject.html\nfunc (c *Client) DeleteBucketCors(ctx context.Context, params *DeleteBucketCorsInput, optFns ...func(*Options)) (*DeleteBucketCorsOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteBucketCorsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteBucketCors\", params, optFns, c.addOperationDeleteBucketCorsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteBucketCorsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteBucketCorsInput struct {\n\n\t// Specifies the bucket whose cors configuration is being deleted.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *DeleteBucketCorsInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype DeleteBucketCorsOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteBucketCorsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketCors{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketCors{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteBucketCors\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteBucketCorsValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketCors(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeleteBucketCorsUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *DeleteBucketCorsInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opDeleteBucketCors(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteBucketCors\",\n\t}\n}\n\n// getDeleteBucketCorsBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getDeleteBucketCorsBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*DeleteBucketCorsInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addDeleteBucketCorsUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getDeleteBucketCorsBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketEncryption.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This implementation of the DELETE action resets the default encryption for the\n// bucket as server-side encryption with Amazon S3 managed keys (SSE-S3).\n//\n//   - General purpose buckets - For information about the bucket default\n//     encryption feature, see [Amazon S3 Bucket Default Encryption]in the Amazon S3 User Guide.\n//\n//   - Directory buckets - For directory buckets, there are only two supported\n//     options for server-side encryption: SSE-S3 and SSE-KMS. For information about\n//     the default encryption configuration in directory buckets, see [Setting default server-side encryption behavior for directory buckets].\n//\n// Permissions\n//\n//   - General purpose bucket permissions - The s3:PutEncryptionConfiguration\n//     permission is required in a policy. The bucket owner has this permission by\n//     default. The bucket owner can grant this permission to others. For more\n//     information about permissions, see [Permissions Related to Bucket Operations]and [Managing Access Permissions to Your Amazon S3 Resources].\n//\n//   - Directory bucket permissions - To grant access to this API operation, you\n//     must have the s3express:PutEncryptionConfiguration permission in an IAM\n//     identity-based policy instead of a bucket policy. Cross-account access to this\n//     API operation isn't supported. This operation can only be performed by the\n//     Amazon Web Services account that owns the resource. For more information about\n//     directory bucket policies and permissions, see [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]in the Amazon S3 User Guide.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// s3express-control.region-code.amazonaws.com .\n//\n// The following operations are related to DeleteBucketEncryption :\n//\n// [PutBucketEncryption]\n//\n// [GetBucketEncryption]\n//\n// [GetBucketEncryption]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketEncryption.html\n// [PutBucketEncryption]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html\n// [Setting default server-side encryption behavior for directory buckets]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-bucket-encryption.html\n// [Amazon S3 Bucket Default Encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\n// [Permissions Related to Bucket Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\nfunc (c *Client) DeleteBucketEncryption(ctx context.Context, params *DeleteBucketEncryptionInput, optFns ...func(*Options)) (*DeleteBucketEncryptionOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteBucketEncryptionInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteBucketEncryption\", params, optFns, c.addOperationDeleteBucketEncryptionMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteBucketEncryptionOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteBucketEncryptionInput struct {\n\n\t// The name of the bucket containing the server-side encryption configuration to\n\t// delete.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use path-style requests in the format\n\t// https://s3express-control.region-code.amazonaws.com/bucket-name .\n\t// Virtual-hosted-style requests aren't supported. Directory bucket names must be\n\t// unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must\n\t// also follow the format bucket-base-name--zone-id--x-s3 (for example,\n\t// DOC-EXAMPLE-BUCKET--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\t//\n\t// For directory buckets, this header is not supported in this API operation. If\n\t// you specify this header, the request fails with the HTTP status code 501 Not\n\t// Implemented .\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *DeleteBucketEncryptionInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype DeleteBucketEncryptionOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteBucketEncryptionMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketEncryption{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketEncryption{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteBucketEncryption\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteBucketEncryptionValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketEncryption(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeleteBucketEncryptionUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *DeleteBucketEncryptionInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opDeleteBucketEncryption(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteBucketEncryption\",\n\t}\n}\n\n// getDeleteBucketEncryptionBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getDeleteBucketEncryptionBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*DeleteBucketEncryptionInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addDeleteBucketEncryptionUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getDeleteBucketEncryptionBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketIntelligentTieringConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Deletes the S3 Intelligent-Tiering configuration from the specified bucket.\n//\n// The S3 Intelligent-Tiering storage class is designed to optimize storage costs\n// by automatically moving data to the most cost-effective storage access tier,\n// without performance impact or operational overhead. S3 Intelligent-Tiering\n// delivers automatic cost savings in three low latency and high throughput access\n// tiers. To get the lowest storage cost on data that can be accessed in minutes to\n// hours, you can choose to activate additional archiving capabilities.\n//\n// The S3 Intelligent-Tiering storage class is the ideal storage class for data\n// with unknown, changing, or unpredictable access patterns, independent of object\n// size or retention period. If the size of an object is less than 128 KB, it is\n// not monitored and not eligible for auto-tiering. Smaller objects can be stored,\n// but they are always charged at the Frequent Access tier rates in the S3\n// Intelligent-Tiering storage class.\n//\n// For more information, see [Storage class for automatically optimizing frequently and infrequently accessed objects].\n//\n// Operations related to DeleteBucketIntelligentTieringConfiguration include:\n//\n// [GetBucketIntelligentTieringConfiguration]\n//\n// [PutBucketIntelligentTieringConfiguration]\n//\n// [ListBucketIntelligentTieringConfigurations]\n//\n// [ListBucketIntelligentTieringConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketIntelligentTieringConfigurations.html\n// [GetBucketIntelligentTieringConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketIntelligentTieringConfiguration.html\n// [PutBucketIntelligentTieringConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketIntelligentTieringConfiguration.html\n// [Storage class for automatically optimizing frequently and infrequently accessed objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html#sc-dynamic-data-access\nfunc (c *Client) DeleteBucketIntelligentTieringConfiguration(ctx context.Context, params *DeleteBucketIntelligentTieringConfigurationInput, optFns ...func(*Options)) (*DeleteBucketIntelligentTieringConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteBucketIntelligentTieringConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteBucketIntelligentTieringConfiguration\", params, optFns, c.addOperationDeleteBucketIntelligentTieringConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteBucketIntelligentTieringConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteBucketIntelligentTieringConfigurationInput struct {\n\n\t// The name of the Amazon S3 bucket whose configuration you want to modify or\n\t// retrieve.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The ID used to identify the S3 Intelligent-Tiering configuration.\n\t//\n\t// This member is required.\n\tId *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *DeleteBucketIntelligentTieringConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype DeleteBucketIntelligentTieringConfigurationOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteBucketIntelligentTieringConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketIntelligentTieringConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketIntelligentTieringConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteBucketIntelligentTieringConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteBucketIntelligentTieringConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketIntelligentTieringConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeleteBucketIntelligentTieringConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *DeleteBucketIntelligentTieringConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opDeleteBucketIntelligentTieringConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteBucketIntelligentTieringConfiguration\",\n\t}\n}\n\n// getDeleteBucketIntelligentTieringConfigurationBucketMember returns a pointer to\n// string denoting a provided bucket member valueand a boolean indicating if the\n// input has a modeled bucket name,\nfunc getDeleteBucketIntelligentTieringConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*DeleteBucketIntelligentTieringConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addDeleteBucketIntelligentTieringConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getDeleteBucketIntelligentTieringConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketInventoryConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Deletes an inventory configuration (identified by the inventory ID) from the\n// bucket.\n//\n// To use this operation, you must have permissions to perform the\n// s3:PutInventoryConfiguration action. The bucket owner has this permission by\n// default. The bucket owner can grant this permission to others. For more\n// information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources].\n//\n// For information about the Amazon S3 inventory feature, see [Amazon S3 Inventory].\n//\n// Operations related to DeleteBucketInventoryConfiguration include:\n//\n// [GetBucketInventoryConfiguration]\n//\n// [PutBucketInventoryConfiguration]\n//\n// [ListBucketInventoryConfigurations]\n//\n// [Amazon S3 Inventory]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-inventory.html\n// [ListBucketInventoryConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketInventoryConfigurations.html\n// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\n// [PutBucketInventoryConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketInventoryConfiguration.html\n// [GetBucketInventoryConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketInventoryConfiguration.html\nfunc (c *Client) DeleteBucketInventoryConfiguration(ctx context.Context, params *DeleteBucketInventoryConfigurationInput, optFns ...func(*Options)) (*DeleteBucketInventoryConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteBucketInventoryConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteBucketInventoryConfiguration\", params, optFns, c.addOperationDeleteBucketInventoryConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteBucketInventoryConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteBucketInventoryConfigurationInput struct {\n\n\t// The name of the bucket containing the inventory configuration to delete.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The ID used to identify the inventory configuration.\n\t//\n\t// This member is required.\n\tId *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *DeleteBucketInventoryConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype DeleteBucketInventoryConfigurationOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteBucketInventoryConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketInventoryConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketInventoryConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteBucketInventoryConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteBucketInventoryConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketInventoryConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeleteBucketInventoryConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *DeleteBucketInventoryConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opDeleteBucketInventoryConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteBucketInventoryConfiguration\",\n\t}\n}\n\n// getDeleteBucketInventoryConfigurationBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getDeleteBucketInventoryConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*DeleteBucketInventoryConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addDeleteBucketInventoryConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getDeleteBucketInventoryConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketLifecycle.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Deletes the lifecycle configuration from the specified bucket. Amazon S3\n// removes all the lifecycle configuration rules in the lifecycle subresource\n// associated with the bucket. Your objects never expire, and Amazon S3 no longer\n// automatically deletes any objects on the basis of rules contained in the deleted\n// lifecycle configuration.\n//\n// Permissions\n//   - General purpose bucket permissions - By default, all Amazon S3 resources\n//     are private, including buckets, objects, and related subresources (for example,\n//     lifecycle configuration and website configuration). Only the resource owner\n//     (that is, the Amazon Web Services account that created it) can access the\n//     resource. The resource owner can optionally grant access permissions to others\n//     by writing an access policy. For this operation, a user must have the\n//     s3:PutLifecycleConfiguration permission.\n//\n// For more information about permissions, see [Managing Access Permissions to Your Amazon S3 Resources].\n//\n//   - Directory bucket permissions - You must have the\n//     s3express:PutLifecycleConfiguration permission in an IAM identity-based policy\n//     to use this operation. Cross-account access to this API operation isn't\n//     supported. The resource owner can optionally grant access permissions to others\n//     by creating a role or user for them as long as they are within the same account\n//     as the owner and resource.\n//\n// For more information about directory bucket policies and permissions, see [Authorizing Regional endpoint APIs with IAM]in\n//\n//\tthe Amazon S3 User Guide.\n//\n// Directory buckets - For directory buckets, you must make requests for this API\n//\n//\toperation to the Regional endpoint. These endpoints support path-style requests\n//\tin the format https://s3express-control.region-code.amazonaws.com/bucket-name\n//\t. Virtual-hosted-style requests aren't supported. For more information about\n//\tendpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more\n//\tinformation about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// s3express-control.region.amazonaws.com .\n//\n// For more information about the object expiration, see [Elements to Describe Lifecycle Actions].\n//\n// Related actions include:\n//\n// [PutBucketLifecycleConfiguration]\n//\n// [GetBucketLifecycleConfiguration]\n//\n// [PutBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html\n// [Elements to Describe Lifecycle Actions]: https://docs.aws.amazon.com/AmazonS3/latest/dev/intro-lifecycle-rules.html#intro-lifecycle-rules-actions\n// [GetBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html\n// [Authorizing Regional endpoint APIs with IAM]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\n//\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\nfunc (c *Client) DeleteBucketLifecycle(ctx context.Context, params *DeleteBucketLifecycleInput, optFns ...func(*Options)) (*DeleteBucketLifecycleOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteBucketLifecycleInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteBucketLifecycle\", params, optFns, c.addOperationDeleteBucketLifecycleMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteBucketLifecycleOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteBucketLifecycleInput struct {\n\n\t// The bucket name of the lifecycle to delete.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\t//\n\t// This parameter applies to general purpose buckets only. It is not supported for\n\t// directory bucket lifecycle configurations.\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *DeleteBucketLifecycleInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype DeleteBucketLifecycleOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteBucketLifecycleMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketLifecycle{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketLifecycle{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteBucketLifecycle\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteBucketLifecycleValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketLifecycle(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeleteBucketLifecycleUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *DeleteBucketLifecycleInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opDeleteBucketLifecycle(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteBucketLifecycle\",\n\t}\n}\n\n// getDeleteBucketLifecycleBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getDeleteBucketLifecycleBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*DeleteBucketLifecycleInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addDeleteBucketLifecycleUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getDeleteBucketLifecycleBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketMetadataTableConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n//\tDeletes a metadata table configuration from a general purpose bucket. For more\n//\n// information, see [Accelerating data discovery with S3 Metadata]in the Amazon S3 User Guide.\n//\n// Permissions To use this operation, you must have the\n// s3:DeleteBucketMetadataTableConfiguration permission. For more information, see [Setting up permissions for configuring metadata tables]\n// in the Amazon S3 User Guide.\n//\n// The following operations are related to DeleteBucketMetadataTableConfiguration :\n//\n// [CreateBucketMetadataTableConfiguration]\n//\n// [GetBucketMetadataTableConfiguration]\n//\n// [Setting up permissions for configuring metadata tables]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-permissions.html\n// [GetBucketMetadataTableConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetadataTableConfiguration.html\n// [CreateBucketMetadataTableConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataTableConfiguration.html\n// [Accelerating data discovery with S3 Metadata]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-overview.html\nfunc (c *Client) DeleteBucketMetadataTableConfiguration(ctx context.Context, params *DeleteBucketMetadataTableConfigurationInput, optFns ...func(*Options)) (*DeleteBucketMetadataTableConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteBucketMetadataTableConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteBucketMetadataTableConfiguration\", params, optFns, c.addOperationDeleteBucketMetadataTableConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteBucketMetadataTableConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteBucketMetadataTableConfigurationInput struct {\n\n\t//  The general purpose bucket that you want to remove the metadata table\n\t// configuration from.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t//  The expected bucket owner of the general purpose bucket that you want to\n\t// remove the metadata table configuration from.\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *DeleteBucketMetadataTableConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype DeleteBucketMetadataTableConfigurationOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteBucketMetadataTableConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketMetadataTableConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketMetadataTableConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteBucketMetadataTableConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteBucketMetadataTableConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketMetadataTableConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeleteBucketMetadataTableConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *DeleteBucketMetadataTableConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opDeleteBucketMetadataTableConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteBucketMetadataTableConfiguration\",\n\t}\n}\n\n// getDeleteBucketMetadataTableConfigurationBucketMember returns a pointer to\n// string denoting a provided bucket member valueand a boolean indicating if the\n// input has a modeled bucket name,\nfunc getDeleteBucketMetadataTableConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*DeleteBucketMetadataTableConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addDeleteBucketMetadataTableConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getDeleteBucketMetadataTableConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketMetricsConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Deletes a metrics configuration for the Amazon CloudWatch request metrics\n// (specified by the metrics configuration ID) from the bucket. Note that this\n// doesn't include the daily storage metrics.\n//\n// To use this operation, you must have permissions to perform the\n// s3:PutMetricsConfiguration action. The bucket owner has this permission by\n// default. The bucket owner can grant this permission to others. For more\n// information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources].\n//\n// For information about CloudWatch request metrics for Amazon S3, see [Monitoring Metrics with Amazon CloudWatch].\n//\n// The following operations are related to DeleteBucketMetricsConfiguration :\n//\n// [GetBucketMetricsConfiguration]\n//\n// [PutBucketMetricsConfiguration]\n//\n// [ListBucketMetricsConfigurations]\n//\n// [Monitoring Metrics with Amazon CloudWatch]\n//\n// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [Monitoring Metrics with Amazon CloudWatch]: https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html\n// [GetBucketMetricsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetricsConfiguration.html\n// [ListBucketMetricsConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketMetricsConfigurations.html\n// [PutBucketMetricsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketMetricsConfiguration.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\nfunc (c *Client) DeleteBucketMetricsConfiguration(ctx context.Context, params *DeleteBucketMetricsConfigurationInput, optFns ...func(*Options)) (*DeleteBucketMetricsConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteBucketMetricsConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteBucketMetricsConfiguration\", params, optFns, c.addOperationDeleteBucketMetricsConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteBucketMetricsConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteBucketMetricsConfigurationInput struct {\n\n\t// The name of the bucket containing the metrics configuration to delete.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The ID used to identify the metrics configuration. The ID has a 64 character\n\t// limit and can only contain letters, numbers, periods, dashes, and underscores.\n\t//\n\t// This member is required.\n\tId *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *DeleteBucketMetricsConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype DeleteBucketMetricsConfigurationOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteBucketMetricsConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketMetricsConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketMetricsConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteBucketMetricsConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteBucketMetricsConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketMetricsConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeleteBucketMetricsConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *DeleteBucketMetricsConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opDeleteBucketMetricsConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteBucketMetricsConfiguration\",\n\t}\n}\n\n// getDeleteBucketMetricsConfigurationBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getDeleteBucketMetricsConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*DeleteBucketMetricsConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addDeleteBucketMetricsConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getDeleteBucketMetricsConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketOwnershipControls.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Removes OwnershipControls for an Amazon S3 bucket. To use this operation, you\n// must have the s3:PutBucketOwnershipControls permission. For more information\n// about Amazon S3 permissions, see [Specifying Permissions in a Policy].\n//\n// For information about Amazon S3 Object Ownership, see [Using Object Ownership].\n//\n// The following operations are related to DeleteBucketOwnershipControls :\n//\n// # GetBucketOwnershipControls\n//\n// # PutBucketOwnershipControls\n//\n// [Using Object Ownership]: https://docs.aws.amazon.com/AmazonS3/latest/dev/about-object-ownership.html\n// [Specifying Permissions in a Policy]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html\nfunc (c *Client) DeleteBucketOwnershipControls(ctx context.Context, params *DeleteBucketOwnershipControlsInput, optFns ...func(*Options)) (*DeleteBucketOwnershipControlsOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteBucketOwnershipControlsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteBucketOwnershipControls\", params, optFns, c.addOperationDeleteBucketOwnershipControlsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteBucketOwnershipControlsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteBucketOwnershipControlsInput struct {\n\n\t// The Amazon S3 bucket whose OwnershipControls you want to delete.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *DeleteBucketOwnershipControlsInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype DeleteBucketOwnershipControlsOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteBucketOwnershipControlsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketOwnershipControls{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketOwnershipControls{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteBucketOwnershipControls\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteBucketOwnershipControlsValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketOwnershipControls(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeleteBucketOwnershipControlsUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *DeleteBucketOwnershipControlsInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opDeleteBucketOwnershipControls(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteBucketOwnershipControls\",\n\t}\n}\n\n// getDeleteBucketOwnershipControlsBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getDeleteBucketOwnershipControlsBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*DeleteBucketOwnershipControlsInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addDeleteBucketOwnershipControlsUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getDeleteBucketOwnershipControlsBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketPolicy.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Deletes the policy of a specified bucket.\n//\n// Directory buckets - For directory buckets, you must make requests for this API\n// operation to the Regional endpoint. These endpoints support path-style requests\n// in the format https://s3express-control.region-code.amazonaws.com/bucket-name .\n// Virtual-hosted-style requests aren't supported. For more information about\n// endpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more\n// information about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// Permissions If you are using an identity other than the root user of the Amazon\n// Web Services account that owns the bucket, the calling identity must both have\n// the DeleteBucketPolicy permissions on the specified bucket and belong to the\n// bucket owner's account in order to use this operation.\n//\n// If you don't have DeleteBucketPolicy permissions, Amazon S3 returns a 403\n// Access Denied error. If you have the correct permissions, but you're not using\n// an identity that belongs to the bucket owner's account, Amazon S3 returns a 405\n// Method Not Allowed error.\n//\n// To ensure that bucket owners don't inadvertently lock themselves out of their\n// own buckets, the root principal in a bucket owner's Amazon Web Services account\n// can perform the GetBucketPolicy , PutBucketPolicy , and DeleteBucketPolicy API\n// actions, even if their bucket policy explicitly denies the root principal's\n// access. Bucket owner root principals can only be blocked from performing these\n// API actions by VPC endpoint policies and Amazon Web Services Organizations\n// policies.\n//\n//   - General purpose bucket permissions - The s3:DeleteBucketPolicy permission is\n//     required in a policy. For more information about general purpose buckets bucket\n//     policies, see [Using Bucket Policies and User Policies]in the Amazon S3 User Guide.\n//\n//   - Directory bucket permissions - To grant access to this API operation, you\n//     must have the s3express:DeleteBucketPolicy permission in an IAM identity-based\n//     policy instead of a bucket policy. Cross-account access to this API operation\n//     isn't supported. This operation can only be performed by the Amazon Web Services\n//     account that owns the resource. For more information about directory bucket\n//     policies and permissions, see [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]in the Amazon S3 User Guide.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// s3express-control.region-code.amazonaws.com .\n//\n// # The following operations are related to DeleteBucketPolicy\n//\n// [CreateBucket]\n//\n// [DeleteObject]\n//\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [DeleteObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html\n// [Using Bucket Policies and User Policies]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html\n// [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n// [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\nfunc (c *Client) DeleteBucketPolicy(ctx context.Context, params *DeleteBucketPolicyInput, optFns ...func(*Options)) (*DeleteBucketPolicyOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteBucketPolicyInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteBucketPolicy\", params, optFns, c.addOperationDeleteBucketPolicyMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteBucketPolicyOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteBucketPolicyInput struct {\n\n\t// The bucket name.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use path-style requests in the format\n\t// https://s3express-control.region-code.amazonaws.com/bucket-name .\n\t// Virtual-hosted-style requests aren't supported. Directory bucket names must be\n\t// unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must\n\t// also follow the format bucket-base-name--zone-id--x-s3 (for example,\n\t// DOC-EXAMPLE-BUCKET--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\t//\n\t// For directory buckets, this header is not supported in this API operation. If\n\t// you specify this header, the request fails with the HTTP status code 501 Not\n\t// Implemented .\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *DeleteBucketPolicyInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype DeleteBucketPolicyOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteBucketPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteBucketPolicy\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteBucketPolicyValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketPolicy(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeleteBucketPolicyUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *DeleteBucketPolicyInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opDeleteBucketPolicy(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteBucketPolicy\",\n\t}\n}\n\n// getDeleteBucketPolicyBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getDeleteBucketPolicyBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*DeleteBucketPolicyInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addDeleteBucketPolicyUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getDeleteBucketPolicyBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketReplication.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Deletes the replication configuration from the bucket.\n//\n// To use this operation, you must have permissions to perform the\n// s3:PutReplicationConfiguration action. The bucket owner has these permissions by\n// default and can grant it to others. For more information about permissions, see [Permissions Related to Bucket Subresource Operations]\n// and [Managing Access Permissions to Your Amazon S3 Resources].\n//\n// It can take a while for the deletion of a replication configuration to fully\n// propagate.\n//\n// For information about replication configuration, see [Replication] in the Amazon S3 User\n// Guide.\n//\n// The following operations are related to DeleteBucketReplication :\n//\n// [PutBucketReplication]\n//\n// [GetBucketReplication]\n//\n// [GetBucketReplication]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketReplication.html\n// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [PutBucketReplication]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketReplication.html\n// [Replication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/replication.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\nfunc (c *Client) DeleteBucketReplication(ctx context.Context, params *DeleteBucketReplicationInput, optFns ...func(*Options)) (*DeleteBucketReplicationOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteBucketReplicationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteBucketReplication\", params, optFns, c.addOperationDeleteBucketReplicationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteBucketReplicationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteBucketReplicationInput struct {\n\n\t//  The bucket name.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *DeleteBucketReplicationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype DeleteBucketReplicationOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteBucketReplicationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketReplication{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketReplication{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteBucketReplication\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteBucketReplicationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketReplication(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeleteBucketReplicationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *DeleteBucketReplicationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opDeleteBucketReplication(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteBucketReplication\",\n\t}\n}\n\n// getDeleteBucketReplicationBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getDeleteBucketReplicationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*DeleteBucketReplicationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addDeleteBucketReplicationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getDeleteBucketReplicationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketTagging.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Deletes the tags from the bucket.\n//\n// To use this operation, you must have permission to perform the\n// s3:PutBucketTagging action. By default, the bucket owner has this permission and\n// can grant this permission to others.\n//\n// The following operations are related to DeleteBucketTagging :\n//\n// [GetBucketTagging]\n//\n// [PutBucketTagging]\n//\n// [GetBucketTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketTagging.html\n// [PutBucketTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketTagging.html\nfunc (c *Client) DeleteBucketTagging(ctx context.Context, params *DeleteBucketTaggingInput, optFns ...func(*Options)) (*DeleteBucketTaggingOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteBucketTaggingInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteBucketTagging\", params, optFns, c.addOperationDeleteBucketTaggingMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteBucketTaggingOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteBucketTaggingInput struct {\n\n\t// The bucket that has the tag set to be removed.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *DeleteBucketTaggingInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype DeleteBucketTaggingOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteBucketTaggingMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketTagging{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketTagging{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteBucketTagging\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteBucketTaggingValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketTagging(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeleteBucketTaggingUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *DeleteBucketTaggingInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opDeleteBucketTagging(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteBucketTagging\",\n\t}\n}\n\n// getDeleteBucketTaggingBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getDeleteBucketTaggingBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*DeleteBucketTaggingInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addDeleteBucketTaggingUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getDeleteBucketTaggingBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketWebsite.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// This action removes the website configuration for a bucket. Amazon S3 returns a\n// 200 OK response upon successfully deleting a website configuration on the\n// specified bucket. You will get a 200 OK response if the website configuration\n// you are trying to delete does not exist on the bucket. Amazon S3 returns a 404\n// response if the bucket specified in the request does not exist.\n//\n// This DELETE action requires the S3:DeleteBucketWebsite permission. By default,\n// only the bucket owner can delete the website configuration attached to a bucket.\n// However, bucket owners can grant other users permission to delete the website\n// configuration by writing a bucket policy granting them the\n// S3:DeleteBucketWebsite permission.\n//\n// For more information about hosting websites, see [Hosting Websites on Amazon S3].\n//\n// The following operations are related to DeleteBucketWebsite :\n//\n// [GetBucketWebsite]\n//\n// [PutBucketWebsite]\n//\n// [GetBucketWebsite]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketWebsite.html\n// [PutBucketWebsite]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketWebsite.html\n// [Hosting Websites on Amazon S3]: https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html\nfunc (c *Client) DeleteBucketWebsite(ctx context.Context, params *DeleteBucketWebsiteInput, optFns ...func(*Options)) (*DeleteBucketWebsiteOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteBucketWebsiteInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteBucketWebsite\", params, optFns, c.addOperationDeleteBucketWebsiteMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteBucketWebsiteOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteBucketWebsiteInput struct {\n\n\t// The bucket name for which you want to remove the website configuration.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *DeleteBucketWebsiteInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype DeleteBucketWebsiteOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteBucketWebsiteMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketWebsite{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketWebsite{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteBucketWebsite\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteBucketWebsiteValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketWebsite(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeleteBucketWebsiteUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *DeleteBucketWebsiteInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opDeleteBucketWebsite(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteBucketWebsite\",\n\t}\n}\n\n// getDeleteBucketWebsiteBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getDeleteBucketWebsiteBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*DeleteBucketWebsiteInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addDeleteBucketWebsiteUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getDeleteBucketWebsiteBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteObject.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"time\"\n)\n\n// Removes an object from a bucket. The behavior depends on the bucket's\n// versioning state:\n//\n//   - If bucket versioning is not enabled, the operation permanently deletes the\n//     object.\n//\n//   - If bucket versioning is enabled, the operation inserts a delete marker,\n//     which becomes the current version of the object. To permanently delete an object\n//     in a versioned bucket, you must include the object’s versionId in the request.\n//     For more information about versioning-enabled buckets, see [Deleting object versions from a versioning-enabled bucket].\n//\n//   - If bucket versioning is suspended, the operation removes the object that\n//     has a null versionId , if there is one, and inserts a delete marker that\n//     becomes the current version of the object. If there isn't an object with a null\n//     versionId , and all versions of the object have a versionId , Amazon S3 does\n//     not remove the object and only inserts a delete marker. To permanently delete an\n//     object that has a versionId , you must include the object’s versionId in the\n//     request. For more information about versioning-suspended buckets, see [Deleting objects from versioning-suspended buckets].\n//\n//   - Directory buckets - S3 Versioning isn't enabled and supported for directory\n//     buckets. For this API operation, only the null value of the version ID is\n//     supported by directory buckets. You can only specify null to the versionId\n//     query parameter in the request.\n//\n//   - Directory buckets - For directory buckets, you must make requests for this\n//     API operation to the Zonal endpoint. These endpoints support\n//     virtual-hosted-style requests in the format\n//     https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name\n//     . Path-style requests are not supported. For more information about endpoints\n//     in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information\n//     about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// To remove a specific version, you must use the versionId query parameter. Using\n// this query parameter permanently deletes the version. If the object deleted is a\n// delete marker, Amazon S3 sets the response header x-amz-delete-marker to true.\n//\n// If the object you want to delete is in a bucket where the bucket versioning\n// configuration is MFA Delete enabled, you must include the x-amz-mfa request\n// header in the DELETE versionId request. Requests that include x-amz-mfa must\n// use HTTPS. For more information about MFA Delete, see [Using MFA Delete]in the Amazon S3 User\n// Guide. To see sample requests that use versioning, see [Sample Request].\n//\n// Directory buckets - MFA delete is not supported by directory buckets.\n//\n// You can delete objects by explicitly calling DELETE Object or calling ([PutBucketLifecycle] ) to\n// enable Amazon S3 to remove them for you. If you want to block users or accounts\n// from removing or deleting objects from your bucket, you must deny them the\n// s3:DeleteObject , s3:DeleteObjectVersion , and s3:PutLifeCycleConfiguration\n// actions.\n//\n// Directory buckets - S3 Lifecycle is not supported by directory buckets.\n//\n// Permissions\n//\n//   - General purpose bucket permissions - The following permissions are required\n//     in your policies when your DeleteObjects request includes specific headers.\n//\n//   - s3:DeleteObject - To delete an object from a bucket, you must always have\n//     the s3:DeleteObject permission.\n//\n//   - s3:DeleteObjectVersion - To delete a specific version of an object from a\n//     versioning-enabled bucket, you must have the s3:DeleteObjectVersion permission.\n//\n//   - Directory bucket permissions - To grant access to this API operation on a\n//     directory bucket, we recommend that you use the [CreateSession]CreateSession API operation\n//     for session-based authorization. Specifically, you grant the\n//     s3express:CreateSession permission to the directory bucket in a bucket policy\n//     or an IAM identity-based policy. Then, you make the CreateSession API call on\n//     the bucket to obtain a session token. With the session token in your request\n//     header, you can make API requests to this operation. After the session token\n//     expires, you make another CreateSession API call to generate a new session\n//     token for use. Amazon Web Services CLI or SDKs create session and refresh the\n//     session token automatically to avoid service interruptions when a session\n//     expires. For more information about authorization, see [CreateSession]CreateSession .\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// Bucket-name.s3express-zone-id.region-code.amazonaws.com .\n//\n// The following action is related to DeleteObject :\n//\n// [PutObject]\n//\n// [Sample Request]: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETE.html#ExampleVersionObjectDelete\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [Deleting objects from versioning-suspended buckets]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeletingObjectsfromVersioningSuspendedBuckets.html\n// [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\n// [PutBucketLifecycle]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycle.html\n// [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\n// [Deleting object versions from a versioning-enabled bucket]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeletingObjectVersions.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n// [Using MFA Delete]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMFADelete.html\nfunc (c *Client) DeleteObject(ctx context.Context, params *DeleteObjectInput, optFns ...func(*Options)) (*DeleteObjectOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteObjectInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteObject\", params, optFns, c.addOperationDeleteObjectMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteObjectOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteObjectInput struct {\n\n\t// The bucket name of the bucket containing the object.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use virtual-hosted-style requests in the format\n\t// Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests\n\t// are not supported. Directory bucket names must be unique in the chosen Zone\n\t// (Availability Zone or Local Zone). Bucket names must follow the format\n\t// bucket-base-name--zone-id--x-s3 (for example,\n\t// amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// Object Lambda access points are not supported by directory buckets.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Key name of the object to delete.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// Indicates whether S3 Object Lock should bypass Governance-mode restrictions to\n\t// process this operation. To use this header, you must have the\n\t// s3:BypassGovernanceRetention permission.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tBypassGovernanceRetention *bool\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// The If-Match header field makes the request method conditional on ETags. If the\n\t// ETag value does not match, the operation returns a 412 Precondition Failed\n\t// error. If the ETag matches or if the object doesn't exist, the operation will\n\t// return a 204 Success (No Content) response .\n\t//\n\t// For more information about conditional requests, see [RFC 7232].\n\t//\n\t// This functionality is only supported for directory buckets.\n\t//\n\t// [RFC 7232]: https://tools.ietf.org/html/rfc7232\n\tIfMatch *string\n\n\t// If present, the object is deleted only if its modification times matches the\n\t// provided Timestamp . If the Timestamp values do not match, the operation\n\t// returns a 412 Precondition Failed error. If the Timestamp matches or if the\n\t// object doesn’t exist, the operation returns a 204 Success (No Content) response.\n\t//\n\t// This functionality is only supported for directory buckets.\n\tIfMatchLastModifiedTime *time.Time\n\n\t// If present, the object is deleted only if its size matches the provided size in\n\t// bytes. If the Size value does not match, the operation returns a 412\n\t// Precondition Failed error. If the Size matches or if the object doesn’t exist,\n\t// the operation returns a 204 Success (No Content) response.\n\t//\n\t// This functionality is only supported for directory buckets.\n\t//\n\t// You can use the If-Match , x-amz-if-match-last-modified-time and\n\t// x-amz-if-match-size conditional headers in conjunction with each-other or\n\t// individually.\n\tIfMatchSize *int64\n\n\t// The concatenation of the authentication device's serial number, a space, and\n\t// the value that is displayed on your authentication device. Required to\n\t// permanently delete a versioned object if versioning is configured with MFA\n\t// delete enabled.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tMFA *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// Version ID used to reference a specific version of the object.\n\t//\n\t// For directory buckets in this API operation, only the null value of the version\n\t// ID is supported.\n\tVersionId *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *DeleteObjectInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.Key = in.Key\n\n}\n\ntype DeleteObjectOutput struct {\n\n\t// Indicates whether the specified object version that was permanently deleted was\n\t// (true) or was not (false) a delete marker before deletion. In a simple DELETE,\n\t// this header indicates whether (true) or not (false) the current version of the\n\t// object is a delete marker. To learn more about delete markers, see [Working with delete markers].\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Working with delete markers]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeleteMarker.html\n\tDeleteMarker *bool\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// Returns the version ID of the delete marker created as a result of the DELETE\n\t// operation.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tVersionId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteObjectMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpDeleteObject{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteObject{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteObject\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteObjectValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteObject(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeleteObjectUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *DeleteObjectInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opDeleteObject(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteObject\",\n\t}\n}\n\n// getDeleteObjectBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getDeleteObjectBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*DeleteObjectInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addDeleteObjectUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getDeleteObjectBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n\n// PresignDeleteObject is used to generate a presigned HTTP Request which contains\n// presigned URL, signed headers and HTTP method used.\nfunc (c *PresignClient) PresignDeleteObject(ctx context.Context, params *DeleteObjectInput, optFns ...func(*PresignOptions)) (*v4.PresignedHTTPRequest, error) {\n\tif params == nil {\n\t\tparams = &DeleteObjectInput{}\n\t}\n\toptions := c.options.copy()\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\tclientOptFns := append(options.ClientOptions, withNopHTTPClientAPIOption)\n\n\tresult, _, err := c.client.invokeOperation(ctx, \"DeleteObject\", params, clientOptFns,\n\t\tc.client.addOperationDeleteObjectMiddlewares,\n\t\tpresignConverter(options).convertToPresignMiddleware,\n\t\taddDeleteObjectPayloadAsUnsigned,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*v4.PresignedHTTPRequest)\n\treturn out, nil\n}\n\nfunc addDeleteObjectPayloadAsUnsigned(stack *middleware.Stack, options Options) error {\n\tv4.RemoveContentSHA256HeaderMiddleware(stack)\n\tv4.RemoveComputePayloadSHA256Middleware(stack)\n\treturn v4.AddUnsignedPayloadMiddleware(stack)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteObjectTagging.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Removes the entire tag set from the specified object. For more information\n// about managing object tags, see [Object Tagging].\n//\n// To use this operation, you must have permission to perform the\n// s3:DeleteObjectTagging action.\n//\n// To delete tags of a specific object version, add the versionId query parameter\n// in the request. You will need permission for the s3:DeleteObjectVersionTagging\n// action.\n//\n// The following operations are related to DeleteObjectTagging :\n//\n// [PutObjectTagging]\n//\n// [GetObjectTagging]\n//\n// [PutObjectTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html\n// [Object Tagging]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-tagging.html\n// [GetObjectTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html\nfunc (c *Client) DeleteObjectTagging(ctx context.Context, params *DeleteObjectTaggingInput, optFns ...func(*Options)) (*DeleteObjectTaggingOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteObjectTaggingInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteObjectTagging\", params, optFns, c.addOperationDeleteObjectTaggingMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteObjectTaggingOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteObjectTaggingInput struct {\n\n\t// The bucket name containing the objects from which to remove the tags.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The key that identifies the object in the bucket from which to remove all tags.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// The versionId of the object that the tag-set will be removed from.\n\tVersionId *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *DeleteObjectTaggingInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\n}\n\ntype DeleteObjectTaggingOutput struct {\n\n\t// The versionId of the object the tag-set was removed from.\n\tVersionId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteObjectTaggingMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpDeleteObjectTagging{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteObjectTagging{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteObjectTagging\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteObjectTaggingValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteObjectTagging(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeleteObjectTaggingUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *DeleteObjectTaggingInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opDeleteObjectTagging(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteObjectTagging\",\n\t}\n}\n\n// getDeleteObjectTaggingBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getDeleteObjectTaggingBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*DeleteObjectTaggingInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addDeleteObjectTaggingUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getDeleteObjectTaggingBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteObjects.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation enables you to delete multiple objects from a bucket using a\n// single HTTP request. If you know the object keys that you want to delete, then\n// this operation provides a suitable alternative to sending individual delete\n// requests, reducing per-request overhead.\n//\n// The request can contain a list of up to 1,000 keys that you want to delete. In\n// the XML, you provide the object key names, and optionally, version IDs if you\n// want to delete a specific version of the object from a versioning-enabled\n// bucket. For each key, Amazon S3 performs a delete operation and returns the\n// result of that delete, success or failure, in the response. If the object\n// specified in the request isn't found, Amazon S3 confirms the deletion by\n// returning the result as deleted.\n//\n//   - Directory buckets - S3 Versioning isn't enabled and supported for directory\n//     buckets.\n//\n//   - Directory buckets - For directory buckets, you must make requests for this\n//     API operation to the Zonal endpoint. These endpoints support\n//     virtual-hosted-style requests in the format\n//     https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name\n//     . Path-style requests are not supported. For more information about endpoints\n//     in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information\n//     about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// The operation supports two modes for the response: verbose and quiet. By\n// default, the operation uses verbose mode in which the response includes the\n// result of deletion of each key in your request. In quiet mode the response\n// includes only keys where the delete operation encountered an error. For a\n// successful deletion in a quiet mode, the operation does not return any\n// information about the delete in the response body.\n//\n// When performing this action on an MFA Delete enabled bucket, that attempts to\n// delete any versioned objects, you must include an MFA token. If you do not\n// provide one, the entire request will fail, even if there are non-versioned\n// objects you are trying to delete. If you provide an invalid token, whether there\n// are versioned keys in the request or not, the entire Multi-Object Delete request\n// will fail. For information about MFA Delete, see [MFA Delete]in the Amazon S3 User Guide.\n//\n// Directory buckets - MFA delete is not supported by directory buckets.\n//\n// Permissions\n//\n//   - General purpose bucket permissions - The following permissions are required\n//     in your policies when your DeleteObjects request includes specific headers.\n//\n//   - s3:DeleteObject - To delete an object from a bucket, you must always specify\n//     the s3:DeleteObject permission.\n//\n//   - s3:DeleteObjectVersion - To delete a specific version of an object from a\n//     versioning-enabled bucket, you must specify the s3:DeleteObjectVersion\n//     permission.\n//\n//   - Directory bucket permissions - To grant access to this API operation on a\n//     directory bucket, we recommend that you use the [CreateSession]CreateSession API operation\n//     for session-based authorization. Specifically, you grant the\n//     s3express:CreateSession permission to the directory bucket in a bucket policy\n//     or an IAM identity-based policy. Then, you make the CreateSession API call on\n//     the bucket to obtain a session token. With the session token in your request\n//     header, you can make API requests to this operation. After the session token\n//     expires, you make another CreateSession API call to generate a new session\n//     token for use. Amazon Web Services CLI or SDKs create session and refresh the\n//     session token automatically to avoid service interruptions when a session\n//     expires. For more information about authorization, see [CreateSession]CreateSession .\n//\n// Content-MD5 request header\n//\n//   - General purpose bucket - The Content-MD5 request header is required for all\n//     Multi-Object Delete requests. Amazon S3 uses the header value to ensure that\n//     your request body has not been altered in transit.\n//\n//   - Directory bucket - The Content-MD5 request header or a additional checksum\n//     request header (including x-amz-checksum-crc32 , x-amz-checksum-crc32c ,\n//     x-amz-checksum-sha1 , or x-amz-checksum-sha256 ) is required for all\n//     Multi-Object Delete requests.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// Bucket-name.s3express-zone-id.region-code.amazonaws.com .\n//\n// The following operations are related to DeleteObjects :\n//\n// [CreateMultipartUpload]\n//\n// [UploadPart]\n//\n// [CompleteMultipartUpload]\n//\n// [ListParts]\n//\n// [AbortMultipartUpload]\n//\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [ListParts]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html\n// [AbortMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html\n// [UploadPart]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\n// [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\n// [CompleteMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n// [MFA Delete]: https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html#MultiFactorAuthenticationDelete\n// [CreateMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html\nfunc (c *Client) DeleteObjects(ctx context.Context, params *DeleteObjectsInput, optFns ...func(*Options)) (*DeleteObjectsOutput, error) {\n\tif params == nil {\n\t\tparams = &DeleteObjectsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeleteObjects\", params, optFns, c.addOperationDeleteObjectsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeleteObjectsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeleteObjectsInput struct {\n\n\t// The bucket name containing the objects to delete.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use virtual-hosted-style requests in the format\n\t// Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests\n\t// are not supported. Directory bucket names must be unique in the chosen Zone\n\t// (Availability Zone or Local Zone). Bucket names must follow the format\n\t// bucket-base-name--zone-id--x-s3 (for example,\n\t// amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// Object Lambda access points are not supported by directory buckets.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Container for the request.\n\t//\n\t// This member is required.\n\tDelete *types.Delete\n\n\t// Specifies whether you want to delete this object even if it has a\n\t// Governance-type Object Lock in place. To use this header, you must have the\n\t// s3:BypassGovernanceRetention permission.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tBypassGovernanceRetention *bool\n\n\t// Indicates the algorithm used to create the checksum for the object when you use\n\t// the SDK. This header will not provide any additional functionality if you don't\n\t// use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum-algorithm or x-amz-trailer header sent. Otherwise, Amazon S3\n\t// fails the request with the HTTP status code 400 Bad Request .\n\t//\n\t// For the x-amz-checksum-algorithm  header, replace  algorithm  with the\n\t// supported algorithm from the following list:\n\t//\n\t//   - CRC32\n\t//\n\t//   - CRC32C\n\t//\n\t//   - CRC64NVME\n\t//\n\t//   - SHA1\n\t//\n\t//   - SHA256\n\t//\n\t// For more information, see [Checking object integrity] in the Amazon S3 User Guide.\n\t//\n\t// If the individual checksum value you provide through x-amz-checksum-algorithm\n\t// doesn't match the checksum algorithm you set through\n\t// x-amz-sdk-checksum-algorithm , Amazon S3 fails the request with a BadDigest\n\t// error.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// The concatenation of the authentication device's serial number, a space, and\n\t// the value that is displayed on your authentication device. Required to\n\t// permanently delete a versioned object if versioning is configured with MFA\n\t// delete enabled.\n\t//\n\t// When performing the DeleteObjects operation on an MFA delete enabled bucket,\n\t// which attempts to delete the specified versioned objects, you must include an\n\t// MFA token. If you don't provide an MFA token, the entire request will fail, even\n\t// if there are non-versioned objects that you are trying to delete. If you provide\n\t// an invalid token, whether there are versioned object keys in the request or not,\n\t// the entire Multi-Object Delete request will fail. For information about MFA\n\t// Delete, see [MFA Delete]in the Amazon S3 User Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [MFA Delete]: https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html#MultiFactorAuthenticationDelete\n\tMFA *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *DeleteObjectsInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\n}\n\ntype DeleteObjectsOutput struct {\n\n\t// Container element for a successful delete. It identifies the object that was\n\t// successfully deleted.\n\tDeleted []types.DeletedObject\n\n\t// Container for a failed delete action that describes the object that Amazon S3\n\t// attempted to delete and the error it encountered.\n\tErrors []types.Error\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeleteObjectsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpDeleteObjects{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteObjects{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeleteObjects\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeleteObjectsValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteObjects(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeleteObjectsInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeleteObjectsUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *DeleteObjectsInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opDeleteObjects(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeleteObjects\",\n\t}\n}\n\n// getDeleteObjectsRequestAlgorithmMember gets the request checksum algorithm\n// value provided as input.\nfunc getDeleteObjectsRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*DeleteObjectsInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addDeleteObjectsInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getDeleteObjectsRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getDeleteObjectsBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getDeleteObjectsBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*DeleteObjectsInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addDeleteObjectsUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getDeleteObjectsBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeletePublicAccessBlock.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Removes the PublicAccessBlock configuration for an Amazon S3 bucket. To use\n// this operation, you must have the s3:PutBucketPublicAccessBlock permission. For\n// more information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources].\n//\n// The following operations are related to DeletePublicAccessBlock :\n//\n// [Using Amazon S3 Block Public Access]\n//\n// [GetPublicAccessBlock]\n//\n// [PutPublicAccessBlock]\n//\n// [GetBucketPolicyStatus]\n//\n// [GetPublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetPublicAccessBlock.html\n// [PutPublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutPublicAccessBlock.html\n// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [Using Amazon S3 Block Public Access]: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\n// [GetBucketPolicyStatus]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketPolicyStatus.html\nfunc (c *Client) DeletePublicAccessBlock(ctx context.Context, params *DeletePublicAccessBlockInput, optFns ...func(*Options)) (*DeletePublicAccessBlockOutput, error) {\n\tif params == nil {\n\t\tparams = &DeletePublicAccessBlockInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"DeletePublicAccessBlock\", params, optFns, c.addOperationDeletePublicAccessBlockMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*DeletePublicAccessBlockOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype DeletePublicAccessBlockInput struct {\n\n\t// The Amazon S3 bucket whose PublicAccessBlock configuration you want to delete.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *DeletePublicAccessBlockInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype DeletePublicAccessBlockOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationDeletePublicAccessBlockMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpDeletePublicAccessBlock{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpDeletePublicAccessBlock{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"DeletePublicAccessBlock\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpDeletePublicAccessBlockValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeletePublicAccessBlock(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addDeletePublicAccessBlockUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *DeletePublicAccessBlockInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opDeletePublicAccessBlock(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"DeletePublicAccessBlock\",\n\t}\n}\n\n// getDeletePublicAccessBlockBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getDeletePublicAccessBlockBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*DeletePublicAccessBlockInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addDeletePublicAccessBlockUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getDeletePublicAccessBlockBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketAccelerateConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// This implementation of the GET action uses the accelerate subresource to return\n// the Transfer Acceleration state of a bucket, which is either Enabled or\n// Suspended . Amazon S3 Transfer Acceleration is a bucket-level feature that\n// enables you to perform faster data transfers to and from Amazon S3.\n//\n// To use this operation, you must have permission to perform the\n// s3:GetAccelerateConfiguration action. The bucket owner has this permission by\n// default. The bucket owner can grant this permission to others. For more\n// information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to your Amazon S3 Resources] in the Amazon S3 User Guide.\n//\n// You set the Transfer Acceleration state of an existing bucket to Enabled or\n// Suspended by using the [PutBucketAccelerateConfiguration] operation.\n//\n// A GET accelerate request does not return a state value for a bucket that has no\n// transfer acceleration state. A bucket has no Transfer Acceleration state if a\n// state has never been set on the bucket.\n//\n// For more information about transfer acceleration, see [Transfer Acceleration] in the Amazon S3 User\n// Guide.\n//\n// The following operations are related to GetBucketAccelerateConfiguration :\n//\n// [PutBucketAccelerateConfiguration]\n//\n// [PutBucketAccelerateConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAccelerateConfiguration.html\n// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [Managing Access Permissions to your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\n// [Transfer Acceleration]: https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html\nfunc (c *Client) GetBucketAccelerateConfiguration(ctx context.Context, params *GetBucketAccelerateConfigurationInput, optFns ...func(*Options)) (*GetBucketAccelerateConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketAccelerateConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketAccelerateConfiguration\", params, optFns, c.addOperationGetBucketAccelerateConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketAccelerateConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketAccelerateConfigurationInput struct {\n\n\t// The name of the bucket for which the accelerate configuration is retrieved.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketAccelerateConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketAccelerateConfigurationOutput struct {\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// The accelerate configuration of the bucket.\n\tStatus types.BucketAccelerateStatus\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketAccelerateConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketAccelerateConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketAccelerateConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketAccelerateConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketAccelerateConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketAccelerateConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketAccelerateConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketAccelerateConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketAccelerateConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketAccelerateConfiguration\",\n\t}\n}\n\n// getGetBucketAccelerateConfigurationBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getGetBucketAccelerateConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketAccelerateConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketAccelerateConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketAccelerateConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketAcl.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// This implementation of the GET action uses the acl subresource to return the\n// access control list (ACL) of a bucket. To use GET to return the ACL of the\n// bucket, you must have the READ_ACP access to the bucket. If READ_ACP permission\n// is granted to the anonymous user, you can return the ACL of the bucket without\n// using an authorization header.\n//\n// When you use this API operation with an access point, provide the alias of the\n// access point in place of the bucket name.\n//\n// When you use this API operation with an Object Lambda access point, provide the\n// alias of the Object Lambda access point in place of the bucket name. If the\n// Object Lambda access point alias in a request is not valid, the error code\n// InvalidAccessPointAliasError is returned. For more information about\n// InvalidAccessPointAliasError , see [List of Error Codes].\n//\n// If your bucket uses the bucket owner enforced setting for S3 Object Ownership,\n// requests to read ACLs are still supported and return the\n// bucket-owner-full-control ACL with the owner being the account that created the\n// bucket. For more information, see [Controlling object ownership and disabling ACLs]in the Amazon S3 User Guide.\n//\n// The following operations are related to GetBucketAcl :\n//\n// [ListObjects]\n//\n// [ListObjects]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html\n// [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\n// [Controlling object ownership and disabling ACLs]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html\nfunc (c *Client) GetBucketAcl(ctx context.Context, params *GetBucketAclInput, optFns ...func(*Options)) (*GetBucketAclOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketAclInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketAcl\", params, optFns, c.addOperationGetBucketAclMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketAclOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketAclInput struct {\n\n\t// Specifies the S3 bucket whose ACL is being requested.\n\t//\n\t// When you use this API operation with an access point, provide the alias of the\n\t// access point in place of the bucket name.\n\t//\n\t// When you use this API operation with an Object Lambda access point, provide the\n\t// alias of the Object Lambda access point in place of the bucket name. If the\n\t// Object Lambda access point alias in a request is not valid, the error code\n\t// InvalidAccessPointAliasError is returned. For more information about\n\t// InvalidAccessPointAliasError , see [List of Error Codes].\n\t//\n\t// [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketAclInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketAclOutput struct {\n\n\t// A list of grants.\n\tGrants []types.Grant\n\n\t// Container for the bucket owner's display name and ID.\n\tOwner *types.Owner\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketAclMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketAcl{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketAcl{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketAcl\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketAclValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketAcl(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketAclUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketAclInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketAcl(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketAcl\",\n\t}\n}\n\n// getGetBucketAclBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getGetBucketAclBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketAclInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketAclUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketAclBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketAnalyticsConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// This implementation of the GET action returns an analytics configuration\n// (identified by the analytics configuration ID) from the bucket.\n//\n// To use this operation, you must have permissions to perform the\n// s3:GetAnalyticsConfiguration action. The bucket owner has this permission by\n// default. The bucket owner can grant this permission to others. For more\n// information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources] in the Amazon S3 User Guide.\n//\n// For information about Amazon S3 analytics feature, see [Amazon S3 Analytics – Storage Class Analysis] in the Amazon S3 User\n// Guide.\n//\n// The following operations are related to GetBucketAnalyticsConfiguration :\n//\n// [DeleteBucketAnalyticsConfiguration]\n//\n// [ListBucketAnalyticsConfigurations]\n//\n// [PutBucketAnalyticsConfiguration]\n//\n// [Amazon S3 Analytics – Storage Class Analysis]: https://docs.aws.amazon.com/AmazonS3/latest/dev/analytics-storage-class.html\n// [DeleteBucketAnalyticsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketAnalyticsConfiguration.html\n// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [ListBucketAnalyticsConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketAnalyticsConfigurations.html\n// [PutBucketAnalyticsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAnalyticsConfiguration.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\nfunc (c *Client) GetBucketAnalyticsConfiguration(ctx context.Context, params *GetBucketAnalyticsConfigurationInput, optFns ...func(*Options)) (*GetBucketAnalyticsConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketAnalyticsConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketAnalyticsConfiguration\", params, optFns, c.addOperationGetBucketAnalyticsConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketAnalyticsConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketAnalyticsConfigurationInput struct {\n\n\t// The name of the bucket from which an analytics configuration is retrieved.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The ID that identifies the analytics configuration.\n\t//\n\t// This member is required.\n\tId *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketAnalyticsConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketAnalyticsConfigurationOutput struct {\n\n\t// The configuration and any analyses for the analytics filter.\n\tAnalyticsConfiguration *types.AnalyticsConfiguration\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketAnalyticsConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketAnalyticsConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketAnalyticsConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketAnalyticsConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketAnalyticsConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketAnalyticsConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketAnalyticsConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketAnalyticsConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketAnalyticsConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketAnalyticsConfiguration\",\n\t}\n}\n\n// getGetBucketAnalyticsConfigurationBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getGetBucketAnalyticsConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketAnalyticsConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketAnalyticsConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketAnalyticsConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketCors.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Returns the Cross-Origin Resource Sharing (CORS) configuration information set\n// for the bucket.\n//\n// To use this operation, you must have permission to perform the s3:GetBucketCORS\n// action. By default, the bucket owner has this permission and can grant it to\n// others.\n//\n// When you use this API operation with an access point, provide the alias of the\n// access point in place of the bucket name.\n//\n// When you use this API operation with an Object Lambda access point, provide the\n// alias of the Object Lambda access point in place of the bucket name. If the\n// Object Lambda access point alias in a request is not valid, the error code\n// InvalidAccessPointAliasError is returned. For more information about\n// InvalidAccessPointAliasError , see [List of Error Codes].\n//\n// For more information about CORS, see [Enabling Cross-Origin Resource Sharing].\n//\n// The following operations are related to GetBucketCors :\n//\n// [PutBucketCors]\n//\n// [DeleteBucketCors]\n//\n// [PutBucketCors]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketCors.html\n// [Enabling Cross-Origin Resource Sharing]: https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html\n// [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\n// [DeleteBucketCors]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketCors.html\nfunc (c *Client) GetBucketCors(ctx context.Context, params *GetBucketCorsInput, optFns ...func(*Options)) (*GetBucketCorsOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketCorsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketCors\", params, optFns, c.addOperationGetBucketCorsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketCorsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketCorsInput struct {\n\n\t// The bucket name for which to get the cors configuration.\n\t//\n\t// When you use this API operation with an access point, provide the alias of the\n\t// access point in place of the bucket name.\n\t//\n\t// When you use this API operation with an Object Lambda access point, provide the\n\t// alias of the Object Lambda access point in place of the bucket name. If the\n\t// Object Lambda access point alias in a request is not valid, the error code\n\t// InvalidAccessPointAliasError is returned. For more information about\n\t// InvalidAccessPointAliasError , see [List of Error Codes].\n\t//\n\t// [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketCorsInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketCorsOutput struct {\n\n\t// A set of origins and methods (cross-origin access that you want to allow). You\n\t// can add up to 100 rules to the configuration.\n\tCORSRules []types.CORSRule\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketCorsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketCors{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketCors{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketCors\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketCorsValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketCors(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketCorsUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketCorsInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketCors(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketCors\",\n\t}\n}\n\n// getGetBucketCorsBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getGetBucketCorsBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketCorsInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketCorsUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketCorsBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketEncryption.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Returns the default encryption configuration for an Amazon S3 bucket. By\n// default, all buckets have a default encryption configuration that uses\n// server-side encryption with Amazon S3 managed keys (SSE-S3).\n//\n//   - General purpose buckets - For information about the bucket default\n//     encryption feature, see [Amazon S3 Bucket Default Encryption]in the Amazon S3 User Guide.\n//\n//   - Directory buckets - For directory buckets, there are only two supported\n//     options for server-side encryption: SSE-S3 and SSE-KMS. For information about\n//     the default encryption configuration in directory buckets, see [Setting default server-side encryption behavior for directory buckets].\n//\n// Permissions\n//\n//   - General purpose bucket permissions - The s3:GetEncryptionConfiguration\n//     permission is required in a policy. The bucket owner has this permission by\n//     default. The bucket owner can grant this permission to others. For more\n//     information about permissions, see [Permissions Related to Bucket Operations]and [Managing Access Permissions to Your Amazon S3 Resources].\n//\n//   - Directory bucket permissions - To grant access to this API operation, you\n//     must have the s3express:GetEncryptionConfiguration permission in an IAM\n//     identity-based policy instead of a bucket policy. Cross-account access to this\n//     API operation isn't supported. This operation can only be performed by the\n//     Amazon Web Services account that owns the resource. For more information about\n//     directory bucket policies and permissions, see [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]in the Amazon S3 User Guide.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// s3express-control.region-code.amazonaws.com .\n//\n// The following operations are related to GetBucketEncryption :\n//\n// [PutBucketEncryption]\n//\n// [DeleteBucketEncryption]\n//\n// [DeleteBucketEncryption]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketEncryption.html\n// [PutBucketEncryption]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html\n// [Setting default server-side encryption behavior for directory buckets]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-bucket-encryption.html\n// [Amazon S3 Bucket Default Encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\n// [Permissions Related to Bucket Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\nfunc (c *Client) GetBucketEncryption(ctx context.Context, params *GetBucketEncryptionInput, optFns ...func(*Options)) (*GetBucketEncryptionOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketEncryptionInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketEncryption\", params, optFns, c.addOperationGetBucketEncryptionMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketEncryptionOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketEncryptionInput struct {\n\n\t// The name of the bucket from which the server-side encryption configuration is\n\t// retrieved.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use path-style requests in the format\n\t// https://s3express-control.region-code.amazonaws.com/bucket-name .\n\t// Virtual-hosted-style requests aren't supported. Directory bucket names must be\n\t// unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must\n\t// also follow the format bucket-base-name--zone-id--x-s3 (for example,\n\t// DOC-EXAMPLE-BUCKET--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\t//\n\t// For directory buckets, this header is not supported in this API operation. If\n\t// you specify this header, the request fails with the HTTP status code 501 Not\n\t// Implemented .\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketEncryptionInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketEncryptionOutput struct {\n\n\t// Specifies the default server-side-encryption configuration.\n\tServerSideEncryptionConfiguration *types.ServerSideEncryptionConfiguration\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketEncryptionMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketEncryption{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketEncryption{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketEncryption\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketEncryptionValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketEncryption(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketEncryptionUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketEncryptionInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketEncryption(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketEncryption\",\n\t}\n}\n\n// getGetBucketEncryptionBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getGetBucketEncryptionBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketEncryptionInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketEncryptionUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketEncryptionBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketIntelligentTieringConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Gets the S3 Intelligent-Tiering configuration from the specified bucket.\n//\n// The S3 Intelligent-Tiering storage class is designed to optimize storage costs\n// by automatically moving data to the most cost-effective storage access tier,\n// without performance impact or operational overhead. S3 Intelligent-Tiering\n// delivers automatic cost savings in three low latency and high throughput access\n// tiers. To get the lowest storage cost on data that can be accessed in minutes to\n// hours, you can choose to activate additional archiving capabilities.\n//\n// The S3 Intelligent-Tiering storage class is the ideal storage class for data\n// with unknown, changing, or unpredictable access patterns, independent of object\n// size or retention period. If the size of an object is less than 128 KB, it is\n// not monitored and not eligible for auto-tiering. Smaller objects can be stored,\n// but they are always charged at the Frequent Access tier rates in the S3\n// Intelligent-Tiering storage class.\n//\n// For more information, see [Storage class for automatically optimizing frequently and infrequently accessed objects].\n//\n// Operations related to GetBucketIntelligentTieringConfiguration include:\n//\n// [DeleteBucketIntelligentTieringConfiguration]\n//\n// [PutBucketIntelligentTieringConfiguration]\n//\n// [ListBucketIntelligentTieringConfigurations]\n//\n// [ListBucketIntelligentTieringConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketIntelligentTieringConfigurations.html\n// [PutBucketIntelligentTieringConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketIntelligentTieringConfiguration.html\n// [Storage class for automatically optimizing frequently and infrequently accessed objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html#sc-dynamic-data-access\n// [DeleteBucketIntelligentTieringConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketIntelligentTieringConfiguration.html\nfunc (c *Client) GetBucketIntelligentTieringConfiguration(ctx context.Context, params *GetBucketIntelligentTieringConfigurationInput, optFns ...func(*Options)) (*GetBucketIntelligentTieringConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketIntelligentTieringConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketIntelligentTieringConfiguration\", params, optFns, c.addOperationGetBucketIntelligentTieringConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketIntelligentTieringConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketIntelligentTieringConfigurationInput struct {\n\n\t// The name of the Amazon S3 bucket whose configuration you want to modify or\n\t// retrieve.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The ID used to identify the S3 Intelligent-Tiering configuration.\n\t//\n\t// This member is required.\n\tId *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketIntelligentTieringConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketIntelligentTieringConfigurationOutput struct {\n\n\t// Container for S3 Intelligent-Tiering configuration.\n\tIntelligentTieringConfiguration *types.IntelligentTieringConfiguration\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketIntelligentTieringConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketIntelligentTieringConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketIntelligentTieringConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketIntelligentTieringConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketIntelligentTieringConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketIntelligentTieringConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketIntelligentTieringConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketIntelligentTieringConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketIntelligentTieringConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketIntelligentTieringConfiguration\",\n\t}\n}\n\n// getGetBucketIntelligentTieringConfigurationBucketMember returns a pointer to\n// string denoting a provided bucket member valueand a boolean indicating if the\n// input has a modeled bucket name,\nfunc getGetBucketIntelligentTieringConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketIntelligentTieringConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketIntelligentTieringConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketIntelligentTieringConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketInventoryConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Returns an inventory configuration (identified by the inventory configuration\n// ID) from the bucket.\n//\n// To use this operation, you must have permissions to perform the\n// s3:GetInventoryConfiguration action. The bucket owner has this permission by\n// default and can grant this permission to others. For more information about\n// permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources].\n//\n// For information about the Amazon S3 inventory feature, see [Amazon S3 Inventory].\n//\n// The following operations are related to GetBucketInventoryConfiguration :\n//\n// [DeleteBucketInventoryConfiguration]\n//\n// [ListBucketInventoryConfigurations]\n//\n// [PutBucketInventoryConfiguration]\n//\n// [Amazon S3 Inventory]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-inventory.html\n// [ListBucketInventoryConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketInventoryConfigurations.html\n// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [DeleteBucketInventoryConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketInventoryConfiguration.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\n// [PutBucketInventoryConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketInventoryConfiguration.html\nfunc (c *Client) GetBucketInventoryConfiguration(ctx context.Context, params *GetBucketInventoryConfigurationInput, optFns ...func(*Options)) (*GetBucketInventoryConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketInventoryConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketInventoryConfiguration\", params, optFns, c.addOperationGetBucketInventoryConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketInventoryConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketInventoryConfigurationInput struct {\n\n\t// The name of the bucket containing the inventory configuration to retrieve.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The ID used to identify the inventory configuration.\n\t//\n\t// This member is required.\n\tId *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketInventoryConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketInventoryConfigurationOutput struct {\n\n\t// Specifies the inventory configuration.\n\tInventoryConfiguration *types.InventoryConfiguration\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketInventoryConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketInventoryConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketInventoryConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketInventoryConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketInventoryConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketInventoryConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketInventoryConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketInventoryConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketInventoryConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketInventoryConfiguration\",\n\t}\n}\n\n// getGetBucketInventoryConfigurationBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getGetBucketInventoryConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketInventoryConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketInventoryConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketInventoryConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketLifecycleConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Returns the lifecycle configuration information set on the bucket. For\n// information about lifecycle configuration, see [Object Lifecycle Management].\n//\n// Bucket lifecycle configuration now supports specifying a lifecycle rule using\n// an object key name prefix, one or more object tags, object size, or any\n// combination of these. Accordingly, this section describes the latest API, which\n// is compatible with the new functionality. The previous version of the API\n// supported filtering based only on an object key name prefix, which is supported\n// for general purpose buckets for backward compatibility. For the related API\n// description, see [GetBucketLifecycle].\n//\n// Lifecyle configurations for directory buckets only support expiring objects and\n// cancelling multipart uploads. Expiring of versioned objects, transitions and tag\n// filters are not supported.\n//\n// Permissions\n//   - General purpose bucket permissions - By default, all Amazon S3 resources\n//     are private, including buckets, objects, and related subresources (for example,\n//     lifecycle configuration and website configuration). Only the resource owner\n//     (that is, the Amazon Web Services account that created it) can access the\n//     resource. The resource owner can optionally grant access permissions to others\n//     by writing an access policy. For this operation, a user must have the\n//     s3:GetLifecycleConfiguration permission.\n//\n// For more information about permissions, see [Managing Access Permissions to Your Amazon S3 Resources].\n//\n//   - Directory bucket permissions - You must have the\n//     s3express:GetLifecycleConfiguration permission in an IAM identity-based policy\n//     to use this operation. Cross-account access to this API operation isn't\n//     supported. The resource owner can optionally grant access permissions to others\n//     by creating a role or user for them as long as they are within the same account\n//     as the owner and resource.\n//\n// For more information about directory bucket policies and permissions, see [Authorizing Regional endpoint APIs with IAM]in\n//\n//\tthe Amazon S3 User Guide.\n//\n// Directory buckets - For directory buckets, you must make requests for this API\n//\n//\toperation to the Regional endpoint. These endpoints support path-style requests\n//\tin the format https://s3express-control.region-code.amazonaws.com/bucket-name\n//\t. Virtual-hosted-style requests aren't supported. For more information about\n//\tendpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more\n//\tinformation about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// s3express-control.region.amazonaws.com .\n//\n// GetBucketLifecycleConfiguration has the following special error:\n//\n//   - Error code: NoSuchLifecycleConfiguration\n//\n//   - Description: The lifecycle configuration does not exist.\n//\n//   - HTTP Status Code: 404 Not Found\n//\n//   - SOAP Fault Code Prefix: Client\n//\n// The following operations are related to GetBucketLifecycleConfiguration :\n//\n// [GetBucketLifecycle]\n//\n// [PutBucketLifecycle]\n//\n// [DeleteBucketLifecycle]\n//\n// [GetBucketLifecycle]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycle.html\n// [Object Lifecycle Management]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html\n// [Authorizing Regional endpoint APIs with IAM]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\n// [PutBucketLifecycle]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycle.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\n// [DeleteBucketLifecycle]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketLifecycle.html\n//\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\nfunc (c *Client) GetBucketLifecycleConfiguration(ctx context.Context, params *GetBucketLifecycleConfigurationInput, optFns ...func(*Options)) (*GetBucketLifecycleConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketLifecycleConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketLifecycleConfiguration\", params, optFns, c.addOperationGetBucketLifecycleConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketLifecycleConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketLifecycleConfigurationInput struct {\n\n\t// The name of the bucket for which to get the lifecycle information.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\t//\n\t// This parameter applies to general purpose buckets only. It is not supported for\n\t// directory bucket lifecycle configurations.\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketLifecycleConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketLifecycleConfigurationOutput struct {\n\n\t// Container for a lifecycle rule.\n\tRules []types.LifecycleRule\n\n\t// Indicates which default minimum object size behavior is applied to the\n\t// lifecycle configuration.\n\t//\n\t// This parameter applies to general purpose buckets only. It isn't supported for\n\t// directory bucket lifecycle configurations.\n\t//\n\t//   - all_storage_classes_128K - Objects smaller than 128 KB will not transition\n\t//   to any storage class by default.\n\t//\n\t//   - varies_by_storage_class - Objects smaller than 128 KB will transition to\n\t//   Glacier Flexible Retrieval or Glacier Deep Archive storage classes. By default,\n\t//   all other storage classes will prevent transitions smaller than 128 KB.\n\t//\n\t// To customize the minimum object size for any transition you can add a filter\n\t// that specifies a custom ObjectSizeGreaterThan or ObjectSizeLessThan in the body\n\t// of your transition rule. Custom filters always take precedence over the default\n\t// transition behavior.\n\tTransitionDefaultMinimumObjectSize types.TransitionDefaultMinimumObjectSize\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketLifecycleConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketLifecycleConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketLifecycleConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketLifecycleConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketLifecycleConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketLifecycleConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketLifecycleConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketLifecycleConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketLifecycleConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketLifecycleConfiguration\",\n\t}\n}\n\n// getGetBucketLifecycleConfigurationBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getGetBucketLifecycleConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketLifecycleConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketLifecycleConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketLifecycleConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketLocation.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/xml\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\tsmithy \"github.com/aws/smithy-go\"\n\tsmithyxml \"github.com/aws/smithy-go/encoding/xml\"\n\tsmithyio \"github.com/aws/smithy-go/io\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"io\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Returns the Region the bucket resides in. You set the bucket's Region using the\n// LocationConstraint request parameter in a CreateBucket request. For more\n// information, see [CreateBucket].\n//\n// When you use this API operation with an access point, provide the alias of the\n// access point in place of the bucket name.\n//\n// When you use this API operation with an Object Lambda access point, provide the\n// alias of the Object Lambda access point in place of the bucket name. If the\n// Object Lambda access point alias in a request is not valid, the error code\n// InvalidAccessPointAliasError is returned. For more information about\n// InvalidAccessPointAliasError , see [List of Error Codes].\n//\n// We recommend that you use [HeadBucket] to return the Region that a bucket resides in. For\n// backward compatibility, Amazon S3 continues to support GetBucketLocation.\n//\n// The following operations are related to GetBucketLocation :\n//\n// [GetObject]\n//\n// [CreateBucket]\n//\n// [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\n// [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\n// [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\n// [HeadBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadBucket.html\nfunc (c *Client) GetBucketLocation(ctx context.Context, params *GetBucketLocationInput, optFns ...func(*Options)) (*GetBucketLocationOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketLocationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketLocation\", params, optFns, c.addOperationGetBucketLocationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketLocationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketLocationInput struct {\n\n\t// The name of the bucket for which to get the location.\n\t//\n\t// When you use this API operation with an access point, provide the alias of the\n\t// access point in place of the bucket name.\n\t//\n\t// When you use this API operation with an Object Lambda access point, provide the\n\t// alias of the Object Lambda access point in place of the bucket name. If the\n\t// Object Lambda access point alias in a request is not valid, the error code\n\t// InvalidAccessPointAliasError is returned. For more information about\n\t// InvalidAccessPointAliasError , see [List of Error Codes].\n\t//\n\t// [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketLocationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketLocationOutput struct {\n\n\t// Specifies the Region where the bucket resides. For a list of all the Amazon S3\n\t// supported location constraints by Region, see [Regions and Endpoints].\n\t//\n\t// Buckets in Region us-east-1 have a LocationConstraint of null . Buckets with a\n\t// LocationConstraint of EU reside in eu-west-1 .\n\t//\n\t// [Regions and Endpoints]: https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\n\tLocationConstraint types.BucketLocationConstraint\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketLocationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketLocation{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketLocation{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketLocation\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = swapDeserializerHelper(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketLocationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketLocation(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketLocationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketLocation_custom struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketLocation_custom) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketLocation_custom) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketLocation(response, &metadata)\n\t}\n\toutput := &GetBucketLocationOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, xml.StartElement{})\n\terr = awsRestxml_deserializeOpDocumentGetBucketLocationOutput(&output, decoder)\n\tif err == io.EOF {\n\t\terr = nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\treturn out, metadata, err\n}\n\n// Helper to swap in a custom deserializer\nfunc swapDeserializerHelper(stack *middleware.Stack) error {\n\t_, err := stack.Deserialize.Swap(\"OperationDeserializer\", &awsRestxml_deserializeOpGetBucketLocation_custom{})\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketLocationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketLocation(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketLocation\",\n\t}\n}\n\n// getGetBucketLocationBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getGetBucketLocationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketLocationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketLocationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketLocationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketLogging.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Returns the logging status of a bucket and the permissions users have to view\n// and modify that status.\n//\n// The following operations are related to GetBucketLogging :\n//\n// [CreateBucket]\n//\n// [PutBucketLogging]\n//\n// [PutBucketLogging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLogging.html\n// [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\nfunc (c *Client) GetBucketLogging(ctx context.Context, params *GetBucketLoggingInput, optFns ...func(*Options)) (*GetBucketLoggingOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketLoggingInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketLogging\", params, optFns, c.addOperationGetBucketLoggingMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketLoggingOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketLoggingInput struct {\n\n\t// The bucket name for which to get the logging information.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketLoggingInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketLoggingOutput struct {\n\n\t// Describes where logs are stored and the prefix that Amazon S3 assigns to all\n\t// log object keys for a bucket. For more information, see [PUT Bucket logging]in the Amazon S3 API\n\t// Reference.\n\t//\n\t// [PUT Bucket logging]: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlogging.html\n\tLoggingEnabled *types.LoggingEnabled\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketLoggingMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketLogging{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketLogging{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketLogging\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketLoggingValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketLogging(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketLoggingUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketLoggingInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketLogging(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketLogging\",\n\t}\n}\n\n// getGetBucketLoggingBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getGetBucketLoggingBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketLoggingInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketLoggingUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketLoggingBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketMetadataTableConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n//\tRetrieves the metadata table configuration for a general purpose bucket. For\n//\n// more information, see [Accelerating data discovery with S3 Metadata]in the Amazon S3 User Guide.\n//\n// Permissions To use this operation, you must have the\n// s3:GetBucketMetadataTableConfiguration permission. For more information, see [Setting up permissions for configuring metadata tables]\n// in the Amazon S3 User Guide.\n//\n// The following operations are related to GetBucketMetadataTableConfiguration :\n//\n// [CreateBucketMetadataTableConfiguration]\n//\n// [DeleteBucketMetadataTableConfiguration]\n//\n// [Setting up permissions for configuring metadata tables]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-permissions.html\n// [CreateBucketMetadataTableConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataTableConfiguration.html\n// [DeleteBucketMetadataTableConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetadataTableConfiguration.html\n// [Accelerating data discovery with S3 Metadata]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-overview.html\nfunc (c *Client) GetBucketMetadataTableConfiguration(ctx context.Context, params *GetBucketMetadataTableConfigurationInput, optFns ...func(*Options)) (*GetBucketMetadataTableConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketMetadataTableConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketMetadataTableConfiguration\", params, optFns, c.addOperationGetBucketMetadataTableConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketMetadataTableConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketMetadataTableConfigurationInput struct {\n\n\t//  The general purpose bucket that contains the metadata table configuration that\n\t// you want to retrieve.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t//  The expected owner of the general purpose bucket that you want to retrieve the\n\t// metadata table configuration from.\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketMetadataTableConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketMetadataTableConfigurationOutput struct {\n\n\t//  The metadata table configuration for the general purpose bucket.\n\tGetBucketMetadataTableConfigurationResult *types.GetBucketMetadataTableConfigurationResult\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketMetadataTableConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketMetadataTableConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketMetadataTableConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketMetadataTableConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketMetadataTableConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketMetadataTableConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketMetadataTableConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketMetadataTableConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketMetadataTableConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketMetadataTableConfiguration\",\n\t}\n}\n\n// getGetBucketMetadataTableConfigurationBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getGetBucketMetadataTableConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketMetadataTableConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketMetadataTableConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketMetadataTableConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketMetricsConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Gets a metrics configuration (specified by the metrics configuration ID) from\n// the bucket. Note that this doesn't include the daily storage metrics.\n//\n// To use this operation, you must have permissions to perform the\n// s3:GetMetricsConfiguration action. The bucket owner has this permission by\n// default. The bucket owner can grant this permission to others. For more\n// information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources].\n//\n// For information about CloudWatch request metrics for Amazon S3, see [Monitoring Metrics with Amazon CloudWatch].\n//\n// The following operations are related to GetBucketMetricsConfiguration :\n//\n// [PutBucketMetricsConfiguration]\n//\n// [DeleteBucketMetricsConfiguration]\n//\n// [ListBucketMetricsConfigurations]\n//\n// [Monitoring Metrics with Amazon CloudWatch]\n//\n// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [Monitoring Metrics with Amazon CloudWatch]: https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html\n// [ListBucketMetricsConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketMetricsConfigurations.html\n// [PutBucketMetricsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketMetricsConfiguration.html\n// [DeleteBucketMetricsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetricsConfiguration.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\nfunc (c *Client) GetBucketMetricsConfiguration(ctx context.Context, params *GetBucketMetricsConfigurationInput, optFns ...func(*Options)) (*GetBucketMetricsConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketMetricsConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketMetricsConfiguration\", params, optFns, c.addOperationGetBucketMetricsConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketMetricsConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketMetricsConfigurationInput struct {\n\n\t// The name of the bucket containing the metrics configuration to retrieve.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The ID used to identify the metrics configuration. The ID has a 64 character\n\t// limit and can only contain letters, numbers, periods, dashes, and underscores.\n\t//\n\t// This member is required.\n\tId *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketMetricsConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketMetricsConfigurationOutput struct {\n\n\t// Specifies the metrics configuration.\n\tMetricsConfiguration *types.MetricsConfiguration\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketMetricsConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketMetricsConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketMetricsConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketMetricsConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketMetricsConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketMetricsConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketMetricsConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketMetricsConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketMetricsConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketMetricsConfiguration\",\n\t}\n}\n\n// getGetBucketMetricsConfigurationBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getGetBucketMetricsConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketMetricsConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketMetricsConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketMetricsConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketNotificationConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Returns the notification configuration of a bucket.\n//\n// If notifications are not enabled on the bucket, the action returns an empty\n// NotificationConfiguration element.\n//\n// By default, you must be the bucket owner to read the notification configuration\n// of a bucket. However, the bucket owner can use a bucket policy to grant\n// permission to other users to read this configuration with the\n// s3:GetBucketNotification permission.\n//\n// When you use this API operation with an access point, provide the alias of the\n// access point in place of the bucket name.\n//\n// When you use this API operation with an Object Lambda access point, provide the\n// alias of the Object Lambda access point in place of the bucket name. If the\n// Object Lambda access point alias in a request is not valid, the error code\n// InvalidAccessPointAliasError is returned. For more information about\n// InvalidAccessPointAliasError , see [List of Error Codes].\n//\n// For more information about setting and reading the notification configuration\n// on a bucket, see [Setting Up Notification of Bucket Events]. For more information about bucket policies, see [Using Bucket Policies].\n//\n// The following action is related to GetBucketNotification :\n//\n// [PutBucketNotification]\n//\n// [Using Bucket Policies]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html\n// [Setting Up Notification of Bucket Events]: https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html\n// [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\n// [PutBucketNotification]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketNotification.html\nfunc (c *Client) GetBucketNotificationConfiguration(ctx context.Context, params *GetBucketNotificationConfigurationInput, optFns ...func(*Options)) (*GetBucketNotificationConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketNotificationConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketNotificationConfiguration\", params, optFns, c.addOperationGetBucketNotificationConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketNotificationConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketNotificationConfigurationInput struct {\n\n\t// The name of the bucket for which to get the notification configuration.\n\t//\n\t// When you use this API operation with an access point, provide the alias of the\n\t// access point in place of the bucket name.\n\t//\n\t// When you use this API operation with an Object Lambda access point, provide the\n\t// alias of the Object Lambda access point in place of the bucket name. If the\n\t// Object Lambda access point alias in a request is not valid, the error code\n\t// InvalidAccessPointAliasError is returned. For more information about\n\t// InvalidAccessPointAliasError , see [List of Error Codes].\n\t//\n\t// [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketNotificationConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\n// A container for specifying the notification configuration of the bucket. If\n// this element is empty, notifications are turned off for the bucket.\ntype GetBucketNotificationConfigurationOutput struct {\n\n\t// Enables delivery of events to Amazon EventBridge.\n\tEventBridgeConfiguration *types.EventBridgeConfiguration\n\n\t// Describes the Lambda functions to invoke and the events for which to invoke\n\t// them.\n\tLambdaFunctionConfigurations []types.LambdaFunctionConfiguration\n\n\t// The Amazon Simple Queue Service queues to publish messages to and the events\n\t// for which to publish messages.\n\tQueueConfigurations []types.QueueConfiguration\n\n\t// The topic to which notifications are sent and the events for which\n\t// notifications are generated.\n\tTopicConfigurations []types.TopicConfiguration\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketNotificationConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketNotificationConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketNotificationConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketNotificationConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketNotificationConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketNotificationConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketNotificationConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketNotificationConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketNotificationConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketNotificationConfiguration\",\n\t}\n}\n\n// getGetBucketNotificationConfigurationBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getGetBucketNotificationConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketNotificationConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketNotificationConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketNotificationConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketOwnershipControls.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Retrieves OwnershipControls for an Amazon S3 bucket. To use this operation, you\n// must have the s3:GetBucketOwnershipControls permission. For more information\n// about Amazon S3 permissions, see [Specifying permissions in a policy].\n//\n// For information about Amazon S3 Object Ownership, see [Using Object Ownership].\n//\n// The following operations are related to GetBucketOwnershipControls :\n//\n// # PutBucketOwnershipControls\n//\n// # DeleteBucketOwnershipControls\n//\n// [Using Object Ownership]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html\n// [Specifying permissions in a policy]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html\nfunc (c *Client) GetBucketOwnershipControls(ctx context.Context, params *GetBucketOwnershipControlsInput, optFns ...func(*Options)) (*GetBucketOwnershipControlsOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketOwnershipControlsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketOwnershipControls\", params, optFns, c.addOperationGetBucketOwnershipControlsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketOwnershipControlsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketOwnershipControlsInput struct {\n\n\t// The name of the Amazon S3 bucket whose OwnershipControls you want to retrieve.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketOwnershipControlsInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketOwnershipControlsOutput struct {\n\n\t// The OwnershipControls (BucketOwnerEnforced, BucketOwnerPreferred, or\n\t// ObjectWriter) currently in effect for this Amazon S3 bucket.\n\tOwnershipControls *types.OwnershipControls\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketOwnershipControlsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketOwnershipControls{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketOwnershipControls{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketOwnershipControls\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketOwnershipControlsValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketOwnershipControls(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketOwnershipControlsUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketOwnershipControlsInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketOwnershipControls(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketOwnershipControls\",\n\t}\n}\n\n// getGetBucketOwnershipControlsBucketMember returns a pointer to string denoting\n// a provided bucket member valueand a boolean indicating if the input has a\n// modeled bucket name,\nfunc getGetBucketOwnershipControlsBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketOwnershipControlsInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketOwnershipControlsUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketOwnershipControlsBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketPolicy.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Returns the policy of a specified bucket.\n//\n// Directory buckets - For directory buckets, you must make requests for this API\n// operation to the Regional endpoint. These endpoints support path-style requests\n// in the format https://s3express-control.region-code.amazonaws.com/bucket-name .\n// Virtual-hosted-style requests aren't supported. For more information about\n// endpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more\n// information about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// Permissions If you are using an identity other than the root user of the Amazon\n// Web Services account that owns the bucket, the calling identity must both have\n// the GetBucketPolicy permissions on the specified bucket and belong to the\n// bucket owner's account in order to use this operation.\n//\n// If you don't have GetBucketPolicy permissions, Amazon S3 returns a 403 Access\n// Denied error. If you have the correct permissions, but you're not using an\n// identity that belongs to the bucket owner's account, Amazon S3 returns a 405\n// Method Not Allowed error.\n//\n// To ensure that bucket owners don't inadvertently lock themselves out of their\n// own buckets, the root principal in a bucket owner's Amazon Web Services account\n// can perform the GetBucketPolicy , PutBucketPolicy , and DeleteBucketPolicy API\n// actions, even if their bucket policy explicitly denies the root principal's\n// access. Bucket owner root principals can only be blocked from performing these\n// API actions by VPC endpoint policies and Amazon Web Services Organizations\n// policies.\n//\n//   - General purpose bucket permissions - The s3:GetBucketPolicy permission is\n//     required in a policy. For more information about general purpose buckets bucket\n//     policies, see [Using Bucket Policies and User Policies]in the Amazon S3 User Guide.\n//\n//   - Directory bucket permissions - To grant access to this API operation, you\n//     must have the s3express:GetBucketPolicy permission in an IAM identity-based\n//     policy instead of a bucket policy. Cross-account access to this API operation\n//     isn't supported. This operation can only be performed by the Amazon Web Services\n//     account that owns the resource. For more information about directory bucket\n//     policies and permissions, see [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]in the Amazon S3 User Guide.\n//\n// Example bucket policies  General purpose buckets example bucket policies - See [Bucket policy examples]\n// in the Amazon S3 User Guide.\n//\n// Directory bucket example bucket policies - See [Example bucket policies for S3 Express One Zone] in the Amazon S3 User Guide.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// s3express-control.region-code.amazonaws.com .\n//\n// The following action is related to GetBucketPolicy :\n//\n// [GetObject]\n//\n// [Bucket policy examples]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [Example bucket policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-example-bucket-policies.html\n// [Using Bucket Policies and User Policies]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html\n// [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n// [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\nfunc (c *Client) GetBucketPolicy(ctx context.Context, params *GetBucketPolicyInput, optFns ...func(*Options)) (*GetBucketPolicyOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketPolicyInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketPolicy\", params, optFns, c.addOperationGetBucketPolicyMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketPolicyOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketPolicyInput struct {\n\n\t// The bucket name to get the bucket policy for.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use path-style requests in the format\n\t// https://s3express-control.region-code.amazonaws.com/bucket-name .\n\t// Virtual-hosted-style requests aren't supported. Directory bucket names must be\n\t// unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must\n\t// also follow the format bucket-base-name--zone-id--x-s3 (for example,\n\t// DOC-EXAMPLE-BUCKET--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide\n\t//\n\t// Access points - When you use this API operation with an access point, provide\n\t// the alias of the access point in place of the bucket name.\n\t//\n\t// Object Lambda access points - When you use this API operation with an Object\n\t// Lambda access point, provide the alias of the Object Lambda access point in\n\t// place of the bucket name. If the Object Lambda access point alias in a request\n\t// is not valid, the error code InvalidAccessPointAliasError is returned. For more\n\t// information about InvalidAccessPointAliasError , see [List of Error Codes].\n\t//\n\t// Object Lambda access points are not supported by directory buckets.\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\t//\n\t// For directory buckets, this header is not supported in this API operation. If\n\t// you specify this header, the request fails with the HTTP status code 501 Not\n\t// Implemented .\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketPolicyInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketPolicyOutput struct {\n\n\t// The bucket policy as a JSON document.\n\tPolicy *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketPolicy\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketPolicyValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketPolicy(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketPolicyUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketPolicyInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketPolicy(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketPolicy\",\n\t}\n}\n\n// getGetBucketPolicyBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getGetBucketPolicyBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketPolicyInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketPolicyUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketPolicyBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketPolicyStatus.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Retrieves the policy status for an Amazon S3 bucket, indicating whether the\n// bucket is public. In order to use this operation, you must have the\n// s3:GetBucketPolicyStatus permission. For more information about Amazon S3\n// permissions, see [Specifying Permissions in a Policy].\n//\n// For more information about when Amazon S3 considers a bucket public, see [The Meaning of \"Public\"].\n//\n// The following operations are related to GetBucketPolicyStatus :\n//\n// [Using Amazon S3 Block Public Access]\n//\n// [GetPublicAccessBlock]\n//\n// [PutPublicAccessBlock]\n//\n// [DeletePublicAccessBlock]\n//\n// [GetPublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetPublicAccessBlock.html\n// [PutPublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutPublicAccessBlock.html\n// [DeletePublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeletePublicAccessBlock.html\n// [Using Amazon S3 Block Public Access]: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html\n// [Specifying Permissions in a Policy]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html\n// [The Meaning of \"Public\"]: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status\nfunc (c *Client) GetBucketPolicyStatus(ctx context.Context, params *GetBucketPolicyStatusInput, optFns ...func(*Options)) (*GetBucketPolicyStatusOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketPolicyStatusInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketPolicyStatus\", params, optFns, c.addOperationGetBucketPolicyStatusMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketPolicyStatusOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketPolicyStatusInput struct {\n\n\t// The name of the Amazon S3 bucket whose policy status you want to retrieve.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketPolicyStatusInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketPolicyStatusOutput struct {\n\n\t// The policy status for the specified bucket.\n\tPolicyStatus *types.PolicyStatus\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketPolicyStatusMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketPolicyStatus{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketPolicyStatus{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketPolicyStatus\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketPolicyStatusValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketPolicyStatus(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketPolicyStatusUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketPolicyStatusInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketPolicyStatus(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketPolicyStatus\",\n\t}\n}\n\n// getGetBucketPolicyStatusBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getGetBucketPolicyStatusBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketPolicyStatusInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketPolicyStatusUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketPolicyStatusBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketReplication.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Returns the replication configuration of a bucket.\n//\n// It can take a while to propagate the put or delete a replication configuration\n// to all Amazon S3 systems. Therefore, a get request soon after put or delete can\n// return a wrong result.\n//\n// For information about replication configuration, see [Replication] in the Amazon S3 User\n// Guide.\n//\n// This action requires permissions for the s3:GetReplicationConfiguration action.\n// For more information about permissions, see [Using Bucket Policies and User Policies].\n//\n// If you include the Filter element in a replication configuration, you must also\n// include the DeleteMarkerReplication and Priority elements. The response also\n// returns those elements.\n//\n// For information about GetBucketReplication errors, see [List of replication-related error codes]\n//\n// The following operations are related to GetBucketReplication :\n//\n// [PutBucketReplication]\n//\n// [DeleteBucketReplication]\n//\n// [PutBucketReplication]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketReplication.html\n// [Using Bucket Policies and User Policies]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html\n// [Replication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/replication.html\n// [List of replication-related error codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ReplicationErrorCodeList\n// [DeleteBucketReplication]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketReplication.html\nfunc (c *Client) GetBucketReplication(ctx context.Context, params *GetBucketReplicationInput, optFns ...func(*Options)) (*GetBucketReplicationOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketReplicationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketReplication\", params, optFns, c.addOperationGetBucketReplicationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketReplicationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketReplicationInput struct {\n\n\t// The bucket name for which to get the replication information.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketReplicationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketReplicationOutput struct {\n\n\t// A container for replication rules. You can add up to 1,000 rules. The maximum\n\t// size of a replication configuration is 2 MB.\n\tReplicationConfiguration *types.ReplicationConfiguration\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketReplicationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketReplication{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketReplication{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketReplication\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketReplicationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketReplication(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketReplicationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketReplicationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketReplication(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketReplication\",\n\t}\n}\n\n// getGetBucketReplicationBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getGetBucketReplicationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketReplicationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketReplicationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketReplicationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketRequestPayment.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Returns the request payment configuration of a bucket. To use this version of\n// the operation, you must be the bucket owner. For more information, see [Requester Pays Buckets].\n//\n// The following operations are related to GetBucketRequestPayment :\n//\n// [ListObjects]\n//\n// [ListObjects]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html\n// [Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RequesterPaysBuckets.html\nfunc (c *Client) GetBucketRequestPayment(ctx context.Context, params *GetBucketRequestPaymentInput, optFns ...func(*Options)) (*GetBucketRequestPaymentOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketRequestPaymentInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketRequestPayment\", params, optFns, c.addOperationGetBucketRequestPaymentMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketRequestPaymentOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketRequestPaymentInput struct {\n\n\t// The name of the bucket for which to get the payment request configuration\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketRequestPaymentInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketRequestPaymentOutput struct {\n\n\t// Specifies who pays for the download and request fees.\n\tPayer types.Payer\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketRequestPaymentMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketRequestPayment{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketRequestPayment{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketRequestPayment\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketRequestPaymentValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketRequestPayment(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketRequestPaymentUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketRequestPaymentInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketRequestPayment(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketRequestPayment\",\n\t}\n}\n\n// getGetBucketRequestPaymentBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getGetBucketRequestPaymentBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketRequestPaymentInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketRequestPaymentUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketRequestPaymentBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketTagging.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Returns the tag set associated with the bucket.\n//\n// To use this operation, you must have permission to perform the\n// s3:GetBucketTagging action. By default, the bucket owner has this permission and\n// can grant this permission to others.\n//\n// GetBucketTagging has the following special error:\n//\n//   - Error code: NoSuchTagSet\n//\n//   - Description: There is no tag set associated with the bucket.\n//\n// The following operations are related to GetBucketTagging :\n//\n// [PutBucketTagging]\n//\n// [DeleteBucketTagging]\n//\n// [PutBucketTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketTagging.html\n// [DeleteBucketTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketTagging.html\nfunc (c *Client) GetBucketTagging(ctx context.Context, params *GetBucketTaggingInput, optFns ...func(*Options)) (*GetBucketTaggingOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketTaggingInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketTagging\", params, optFns, c.addOperationGetBucketTaggingMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketTaggingOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketTaggingInput struct {\n\n\t// The name of the bucket for which to get the tagging information.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketTaggingInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketTaggingOutput struct {\n\n\t// Contains the tag set.\n\t//\n\t// This member is required.\n\tTagSet []types.Tag\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketTaggingMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketTagging{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketTagging{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketTagging\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketTaggingValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketTagging(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketTaggingUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketTaggingInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketTagging(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketTagging\",\n\t}\n}\n\n// getGetBucketTaggingBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getGetBucketTaggingBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketTaggingInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketTaggingUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketTaggingBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketVersioning.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Returns the versioning state of a bucket.\n//\n// To retrieve the versioning state of a bucket, you must be the bucket owner.\n//\n// This implementation also returns the MFA Delete status of the versioning state.\n// If the MFA Delete status is enabled , the bucket owner must use an\n// authentication device to change the versioning state of the bucket.\n//\n// The following operations are related to GetBucketVersioning :\n//\n// [GetObject]\n//\n// [PutObject]\n//\n// [DeleteObject]\n//\n// [DeleteObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html\n// [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\n// [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\nfunc (c *Client) GetBucketVersioning(ctx context.Context, params *GetBucketVersioningInput, optFns ...func(*Options)) (*GetBucketVersioningOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketVersioningInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketVersioning\", params, optFns, c.addOperationGetBucketVersioningMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketVersioningOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketVersioningInput struct {\n\n\t// The name of the bucket for which to get the versioning information.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketVersioningInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketVersioningOutput struct {\n\n\t// Specifies whether MFA delete is enabled in the bucket versioning configuration.\n\t// This element is only returned if the bucket has been configured with MFA delete.\n\t// If the bucket has never been so configured, this element is not returned.\n\tMFADelete types.MFADeleteStatus\n\n\t// The versioning state of the bucket.\n\tStatus types.BucketVersioningStatus\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketVersioningMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketVersioning{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketVersioning{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketVersioning\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketVersioningValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketVersioning(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketVersioningUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketVersioningInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketVersioning(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketVersioning\",\n\t}\n}\n\n// getGetBucketVersioningBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getGetBucketVersioningBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketVersioningInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketVersioningUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketVersioningBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketWebsite.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Returns the website configuration for a bucket. To host website on Amazon S3,\n// you can configure a bucket as website by adding a website configuration. For\n// more information about hosting websites, see [Hosting Websites on Amazon S3].\n//\n// This GET action requires the S3:GetBucketWebsite permission. By default, only\n// the bucket owner can read the bucket website configuration. However, bucket\n// owners can allow other users to read the website configuration by writing a\n// bucket policy granting them the S3:GetBucketWebsite permission.\n//\n// The following operations are related to GetBucketWebsite :\n//\n// [DeleteBucketWebsite]\n//\n// [PutBucketWebsite]\n//\n// [PutBucketWebsite]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketWebsite.html\n// [Hosting Websites on Amazon S3]: https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html\n// [DeleteBucketWebsite]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketWebsite.html\nfunc (c *Client) GetBucketWebsite(ctx context.Context, params *GetBucketWebsiteInput, optFns ...func(*Options)) (*GetBucketWebsiteOutput, error) {\n\tif params == nil {\n\t\tparams = &GetBucketWebsiteInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetBucketWebsite\", params, optFns, c.addOperationGetBucketWebsiteMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetBucketWebsiteOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetBucketWebsiteInput struct {\n\n\t// The bucket name for which to get the website configuration.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetBucketWebsiteInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetBucketWebsiteOutput struct {\n\n\t// The object key name of the website error document to use for 4XX class errors.\n\tErrorDocument *types.ErrorDocument\n\n\t// The name of the index document for the website (for example index.html ).\n\tIndexDocument *types.IndexDocument\n\n\t// Specifies the redirect behavior of all requests to a website endpoint of an\n\t// Amazon S3 bucket.\n\tRedirectAllRequestsTo *types.RedirectAllRequestsTo\n\n\t// Rules that define when a redirect is applied and the redirect behavior.\n\tRoutingRules []types.RoutingRule\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetBucketWebsiteMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketWebsite{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketWebsite{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetBucketWebsite\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetBucketWebsiteValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketWebsite(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetBucketWebsiteUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetBucketWebsiteInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetBucketWebsite(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetBucketWebsite\",\n\t}\n}\n\n// getGetBucketWebsiteBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getGetBucketWebsiteBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetBucketWebsiteInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetBucketWebsiteUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetBucketWebsiteBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetObject.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"io\"\n\t\"time\"\n)\n\n// Retrieves an object from Amazon S3.\n//\n// In the GetObject request, specify the full key name for the object.\n//\n// General purpose buckets - Both the virtual-hosted-style requests and the\n// path-style requests are supported. For a virtual hosted-style request example,\n// if you have the object photos/2006/February/sample.jpg , specify the object key\n// name as /photos/2006/February/sample.jpg . For a path-style request example, if\n// you have the object photos/2006/February/sample.jpg in the bucket named\n// examplebucket , specify the object key name as\n// /examplebucket/photos/2006/February/sample.jpg . For more information about\n// request types, see [HTTP Host Header Bucket Specification]in the Amazon S3 User Guide.\n//\n// Directory buckets - Only virtual-hosted-style requests are supported. For a\n// virtual hosted-style request example, if you have the object\n// photos/2006/February/sample.jpg in the bucket named\n// amzn-s3-demo-bucket--usw2-az1--x-s3 , specify the object key name as\n// /photos/2006/February/sample.jpg . Also, when you make requests to this API\n// operation, your requests are sent to the Zonal endpoint. These endpoints support\n// virtual-hosted-style requests in the format\n// https://bucket-name.s3express-zone-id.region-code.amazonaws.com/key-name .\n// Path-style requests are not supported. For more information about endpoints in\n// Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information about\n// endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// Permissions\n//   - General purpose bucket permissions - You must have the required permissions\n//     in a policy. To use GetObject , you must have the READ access to the object\n//     (or version). If you grant READ access to the anonymous user, the GetObject\n//     operation returns the object without using an authorization header. For more\n//     information, see [Specifying permissions in a policy]in the Amazon S3 User Guide.\n//\n// If you include a versionId in your request header, you must have the\n//\n//\ts3:GetObjectVersion permission to access a specific version of an object. The\n//\ts3:GetObject permission is not required in this scenario.\n//\n// If you request the current version of an object without a specific versionId in\n//\n//\tthe request header, only the s3:GetObject permission is required. The\n//\ts3:GetObjectVersion permission is not required in this scenario.\n//\n// If the object that you request doesn’t exist, the error that Amazon S3 returns\n//\n//\tdepends on whether you also have the s3:ListBucket permission.\n//\n//\t- If you have the s3:ListBucket permission on the bucket, Amazon S3 returns an\n//\tHTTP status code 404 Not Found error.\n//\n//\t- If you don’t have the s3:ListBucket permission, Amazon S3 returns an HTTP\n//\tstatus code 403 Access Denied error.\n//\n//\t- Directory bucket permissions - To grant access to this API operation on a\n//\tdirectory bucket, we recommend that you use the [CreateSession]CreateSession API operation\n//\tfor session-based authorization. Specifically, you grant the\n//\ts3express:CreateSession permission to the directory bucket in a bucket policy\n//\tor an IAM identity-based policy. Then, you make the CreateSession API call on\n//\tthe bucket to obtain a session token. With the session token in your request\n//\theader, you can make API requests to this operation. After the session token\n//\texpires, you make another CreateSession API call to generate a new session\n//\ttoken for use. Amazon Web Services CLI or SDKs create session and refresh the\n//\tsession token automatically to avoid service interruptions when a session\n//\texpires. For more information about authorization, see [CreateSession]CreateSession .\n//\n// If the object is encrypted using SSE-KMS, you must also have the\n//\n//\tkms:GenerateDataKey and kms:Decrypt permissions in IAM identity-based policies\n//\tand KMS key policies for the KMS key.\n//\n// Storage classes If the object you are retrieving is stored in the S3 Glacier\n// Flexible Retrieval storage class, the S3 Glacier Deep Archive storage class, the\n// S3 Intelligent-Tiering Archive Access tier, or the S3 Intelligent-Tiering Deep\n// Archive Access tier, before you can retrieve the object you must first restore a\n// copy using [RestoreObject]. Otherwise, this operation returns an InvalidObjectState error. For\n// information about restoring archived objects, see [Restoring Archived Objects]in the Amazon S3 User Guide.\n//\n// Directory buckets - Directory buckets only support EXPRESS_ONEZONE (the S3\n// Express One Zone storage class) in Availability Zones and ONEZONE_IA (the S3\n// One Zone-Infrequent Access storage class) in Dedicated Local Zones. Unsupported\n// storage class values won't write a destination object and will respond with the\n// HTTP status code 400 Bad Request .\n//\n// Encryption Encryption request headers, like x-amz-server-side-encryption ,\n// should not be sent for the GetObject requests, if your object uses server-side\n// encryption with Amazon S3 managed encryption keys (SSE-S3), server-side\n// encryption with Key Management Service (KMS) keys (SSE-KMS), or dual-layer\n// server-side encryption with Amazon Web Services KMS keys (DSSE-KMS). If you\n// include the header in your GetObject requests for the object that uses these\n// types of keys, you’ll get an HTTP 400 Bad Request error.\n//\n// Directory buckets - For directory buckets, there are only two supported options\n// for server-side encryption: SSE-S3 and SSE-KMS. SSE-C isn't supported. For more\n// information, see [Protecting data with server-side encryption]in the Amazon S3 User Guide.\n//\n// Overriding response header values through the request There are times when you\n// want to override certain response header values of a GetObject response. For\n// example, you might override the Content-Disposition response header value\n// through your GetObject request.\n//\n// You can override values for a set of response headers. These modified response\n// header values are included only in a successful response, that is, when the HTTP\n// status code 200 OK is returned. The headers you can override using the\n// following query parameters in the request are a subset of the headers that\n// Amazon S3 accepts when you create an object.\n//\n// The response headers that you can override for the GetObject response are\n// Cache-Control , Content-Disposition , Content-Encoding , Content-Language ,\n// Content-Type , and Expires .\n//\n// To override values for a set of response headers in the GetObject response, you\n// can use the following query parameters in the request.\n//\n//   - response-cache-control\n//\n//   - response-content-disposition\n//\n//   - response-content-encoding\n//\n//   - response-content-language\n//\n//   - response-content-type\n//\n//   - response-expires\n//\n// When you use these parameters, you must sign the request by using either an\n// Authorization header or a presigned URL. These parameters cannot be used with an\n// unsigned (anonymous) request.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// Bucket-name.s3express-zone-id.region-code.amazonaws.com .\n//\n// The following operations are related to GetObject :\n//\n// [ListBuckets]\n//\n// [GetObjectAcl]\n//\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [RestoreObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_RestoreObject.html\n// [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\n// [ListBuckets]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html\n// [HTTP Host Header Bucket Specification]: https://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html#VirtualHostingSpecifyBucket\n// [Restoring Archived Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/restoring-objects.html\n// [GetObjectAcl]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAcl.html\n// [Specifying permissions in a policy]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n//\n// [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\nfunc (c *Client) GetObject(ctx context.Context, params *GetObjectInput, optFns ...func(*Options)) (*GetObjectOutput, error) {\n\tif params == nil {\n\t\tparams = &GetObjectInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetObject\", params, optFns, c.addOperationGetObjectMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetObjectOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetObjectInput struct {\n\n\t// The bucket name containing the object.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use virtual-hosted-style requests in the format\n\t// Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests\n\t// are not supported. Directory bucket names must be unique in the chosen Zone\n\t// (Availability Zone or Local Zone). Bucket names must follow the format\n\t// bucket-base-name--zone-id--x-s3 (for example,\n\t// amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// Object Lambda access points - When you use this action with an Object Lambda\n\t// access point, you must direct requests to the Object Lambda access point\n\t// hostname. The Object Lambda access point hostname takes the form\n\t// AccessPointName-AccountId.s3-object-lambda.Region.amazonaws.com.\n\t//\n\t// Object Lambda access points are not supported by directory buckets.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Key of the object to get.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// To retrieve the checksum, this mode must be enabled.\n\tChecksumMode types.ChecksumMode\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Return the object only if its entity tag (ETag) is the same as the one\n\t// specified in this header; otherwise, return a 412 Precondition Failed error.\n\t//\n\t// If both of the If-Match and If-Unmodified-Since headers are present in the\n\t// request as follows: If-Match condition evaluates to true , and;\n\t// If-Unmodified-Since condition evaluates to false ; then, S3 returns 200 OK and\n\t// the data requested.\n\t//\n\t// For more information about conditional requests, see [RFC 7232].\n\t//\n\t// [RFC 7232]: https://tools.ietf.org/html/rfc7232\n\tIfMatch *string\n\n\t// Return the object only if it has been modified since the specified time;\n\t// otherwise, return a 304 Not Modified error.\n\t//\n\t// If both of the If-None-Match and If-Modified-Since headers are present in the\n\t// request as follows: If-None-Match condition evaluates to false , and;\n\t// If-Modified-Since condition evaluates to true ; then, S3 returns 304 Not\n\t// Modified status code.\n\t//\n\t// For more information about conditional requests, see [RFC 7232].\n\t//\n\t// [RFC 7232]: https://tools.ietf.org/html/rfc7232\n\tIfModifiedSince *time.Time\n\n\t// Return the object only if its entity tag (ETag) is different from the one\n\t// specified in this header; otherwise, return a 304 Not Modified error.\n\t//\n\t// If both of the If-None-Match and If-Modified-Since headers are present in the\n\t// request as follows: If-None-Match condition evaluates to false , and;\n\t// If-Modified-Since condition evaluates to true ; then, S3 returns 304 Not\n\t// Modified HTTP status code.\n\t//\n\t// For more information about conditional requests, see [RFC 7232].\n\t//\n\t// [RFC 7232]: https://tools.ietf.org/html/rfc7232\n\tIfNoneMatch *string\n\n\t// Return the object only if it has not been modified since the specified time;\n\t// otherwise, return a 412 Precondition Failed error.\n\t//\n\t// If both of the If-Match and If-Unmodified-Since headers are present in the\n\t// request as follows: If-Match condition evaluates to true , and;\n\t// If-Unmodified-Since condition evaluates to false ; then, S3 returns 200 OK and\n\t// the data requested.\n\t//\n\t// For more information about conditional requests, see [RFC 7232].\n\t//\n\t// [RFC 7232]: https://tools.ietf.org/html/rfc7232\n\tIfUnmodifiedSince *time.Time\n\n\t// Part number of the object being read. This is a positive integer between 1 and\n\t// 10,000. Effectively performs a 'ranged' GET request for the part specified.\n\t// Useful for downloading just a part of an object.\n\tPartNumber *int32\n\n\t// Downloads the specified byte range of an object. For more information about the\n\t// HTTP Range header, see [https://www.rfc-editor.org/rfc/rfc9110.html#name-range].\n\t//\n\t// Amazon S3 doesn't support retrieving multiple ranges of data per GET request.\n\t//\n\t// [https://www.rfc-editor.org/rfc/rfc9110.html#name-range]: https://www.rfc-editor.org/rfc/rfc9110.html#name-range\n\tRange *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// Sets the Cache-Control header of the response.\n\tResponseCacheControl *string\n\n\t// Sets the Content-Disposition header of the response.\n\tResponseContentDisposition *string\n\n\t// Sets the Content-Encoding header of the response.\n\tResponseContentEncoding *string\n\n\t// Sets the Content-Language header of the response.\n\tResponseContentLanguage *string\n\n\t// Sets the Content-Type header of the response.\n\tResponseContentType *string\n\n\t// Sets the Expires header of the response.\n\tResponseExpires *time.Time\n\n\t// Specifies the algorithm to use when decrypting the object (for example, AES256 ).\n\t//\n\t// If you encrypt an object by using server-side encryption with customer-provided\n\t// encryption keys (SSE-C) when you store the object in Amazon S3, then when you\n\t// GET the object, you must use the following headers:\n\t//\n\t//   - x-amz-server-side-encryption-customer-algorithm\n\t//\n\t//   - x-amz-server-side-encryption-customer-key\n\t//\n\t//   - x-amz-server-side-encryption-customer-key-MD5\n\t//\n\t// For more information about SSE-C, see [Server-Side Encryption (Using Customer-Provided Encryption Keys)] in the Amazon S3 User Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Server-Side Encryption (Using Customer-Provided Encryption Keys)]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\n\tSSECustomerAlgorithm *string\n\n\t// Specifies the customer-provided encryption key that you originally provided for\n\t// Amazon S3 to encrypt the data before storing it. This value is used to decrypt\n\t// the object when recovering it and must match the one used when storing the data.\n\t// The key must be appropriate for use with the algorithm specified in the\n\t// x-amz-server-side-encryption-customer-algorithm header.\n\t//\n\t// If you encrypt an object by using server-side encryption with customer-provided\n\t// encryption keys (SSE-C) when you store the object in Amazon S3, then when you\n\t// GET the object, you must use the following headers:\n\t//\n\t//   - x-amz-server-side-encryption-customer-algorithm\n\t//\n\t//   - x-amz-server-side-encryption-customer-key\n\t//\n\t//   - x-amz-server-side-encryption-customer-key-MD5\n\t//\n\t// For more information about SSE-C, see [Server-Side Encryption (Using Customer-Provided Encryption Keys)] in the Amazon S3 User Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Server-Side Encryption (Using Customer-Provided Encryption Keys)]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\n\tSSECustomerKey *string\n\n\t// Specifies the 128-bit MD5 digest of the customer-provided encryption key\n\t// according to RFC 1321. Amazon S3 uses this header for a message integrity check\n\t// to ensure that the encryption key was transmitted without error.\n\t//\n\t// If you encrypt an object by using server-side encryption with customer-provided\n\t// encryption keys (SSE-C) when you store the object in Amazon S3, then when you\n\t// GET the object, you must use the following headers:\n\t//\n\t//   - x-amz-server-side-encryption-customer-algorithm\n\t//\n\t//   - x-amz-server-side-encryption-customer-key\n\t//\n\t//   - x-amz-server-side-encryption-customer-key-MD5\n\t//\n\t// For more information about SSE-C, see [Server-Side Encryption (Using Customer-Provided Encryption Keys)] in the Amazon S3 User Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Server-Side Encryption (Using Customer-Provided Encryption Keys)]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\n\tSSECustomerKeyMD5 *string\n\n\t// Version ID used to reference a specific version of the object.\n\t//\n\t// By default, the GetObject operation returns the current version of an object.\n\t// To return a different version, use the versionId subresource.\n\t//\n\t//   - If you include a versionId in your request header, you must have the\n\t//   s3:GetObjectVersion permission to access a specific version of an object. The\n\t//   s3:GetObject permission is not required in this scenario.\n\t//\n\t//   - If you request the current version of an object without a specific versionId\n\t//   in the request header, only the s3:GetObject permission is required. The\n\t//   s3:GetObjectVersion permission is not required in this scenario.\n\t//\n\t//   - Directory buckets - S3 Versioning isn't enabled and supported for directory\n\t//   buckets. For this API operation, only the null value of the version ID is\n\t//   supported by directory buckets. You can only specify null to the versionId\n\t//   query parameter in the request.\n\t//\n\t// For more information about versioning, see [PutBucketVersioning].\n\t//\n\t// [PutBucketVersioning]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketVersioning.html\n\tVersionId *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetObjectInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.Key = in.Key\n\n}\n\ntype GetObjectOutput struct {\n\n\t// Indicates that a range of bytes was specified in the request.\n\tAcceptRanges *string\n\n\t// Object data.\n\tBody io.ReadCloser\n\n\t// Indicates whether the object uses an S3 Bucket Key for server-side encryption\n\t// with Key Management Service (KMS) keys (SSE-KMS).\n\tBucketKeyEnabled *bool\n\n\t// Specifies caching behavior along the request/reply chain.\n\tCacheControl *string\n\n\t// The Base64 encoded, 32-bit CRC32 checksum of the object. This checksum is only\n\t// present if the object was uploaded with the object. For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumCRC32 *string\n\n\t// The Base64 encoded, 32-bit CRC32C checksum of the object. This will only be\n\t// present if the object was uploaded with the object. For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumCRC32C *string\n\n\t// The Base64 encoded, 64-bit CRC64NVME checksum of the object. For more\n\t// information, see [Checking object integrity in the Amazon S3 User Guide].\n\t//\n\t// [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumCRC64NVME *string\n\n\t// The Base64 encoded, 160-bit SHA1 digest of the object. This will only be\n\t// present if the object was uploaded with the object. For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumSHA1 *string\n\n\t// The Base64 encoded, 256-bit SHA256 digest of the object. This will only be\n\t// present if the object was uploaded with the object. For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumSHA256 *string\n\n\t// The checksum type, which determines how part-level checksums are combined to\n\t// create an object-level checksum for multipart objects. You can use this header\n\t// response to verify that the checksum type that is received is the same checksum\n\t// type that was specified in the CreateMultipartUpload request. For more\n\t// information, see [Checking object integrity]in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumType types.ChecksumType\n\n\t// Specifies presentational information for the object.\n\tContentDisposition *string\n\n\t// Indicates what content encodings have been applied to the object and thus what\n\t// decoding mechanisms must be applied to obtain the media-type referenced by the\n\t// Content-Type header field.\n\tContentEncoding *string\n\n\t// The language the content is in.\n\tContentLanguage *string\n\n\t// Size of the body in bytes.\n\tContentLength *int64\n\n\t// The portion of the object returned in the response.\n\tContentRange *string\n\n\t// A standard MIME type describing the format of the object data.\n\tContentType *string\n\n\t// Indicates whether the object retrieved was (true) or was not (false) a Delete\n\t// Marker. If false, this response header does not appear in the response.\n\t//\n\t//   - If the current version of the object is a delete marker, Amazon S3 behaves\n\t//   as if the object was deleted and includes x-amz-delete-marker: true in the\n\t//   response.\n\t//\n\t//   - If the specified version in the request is a delete marker, the response\n\t//   returns a 405 Method Not Allowed error and the Last-Modified: timestamp\n\t//   response header.\n\tDeleteMarker *bool\n\n\t// An entity tag (ETag) is an opaque identifier assigned by a web server to a\n\t// specific version of a resource found at a URL.\n\tETag *string\n\n\t// If the object expiration is configured (see [PutBucketLifecycleConfiguration]PutBucketLifecycleConfiguration ),\n\t// the response includes this header. It includes the expiry-date and rule-id\n\t// key-value pairs providing object expiration information. The value of the\n\t// rule-id is URL-encoded.\n\t//\n\t// Object expiration information is not returned in directory buckets and this\n\t// header returns the value \" NotImplemented \" in all responses for directory\n\t// buckets.\n\t//\n\t// [PutBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html\n\tExpiration *string\n\n\t// The date and time at which the object is no longer cacheable.\n\t//\n\t// Deprecated: This field is handled inconsistently across AWS SDKs. Prefer using\n\t// the ExpiresString field which contains the unparsed value from the service\n\t// response.\n\tExpires *time.Time\n\n\t// The unparsed value of the Expires field from the service response. Prefer use\n\t// of this value over the normal Expires response field where possible.\n\tExpiresString *string\n\n\t// Date and time when the object was last modified.\n\t//\n\t// General purpose buckets - When you specify a versionId of the object in your\n\t// request, if the specified version in the request is a delete marker, the\n\t// response returns a 405 Method Not Allowed error and the Last-Modified: timestamp\n\t// response header.\n\tLastModified *time.Time\n\n\t// A map of metadata to store with the object in S3.\n\t//\n\t// Map keys will be normalized to lower-case.\n\tMetadata map[string]string\n\n\t// This is set to the number of metadata entries not returned in the headers that\n\t// are prefixed with x-amz-meta- . This can happen if you create metadata using an\n\t// API like SOAP that supports more flexible metadata than the REST API. For\n\t// example, using SOAP, you can create metadata whose values are not legal HTTP\n\t// headers.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tMissingMeta *int32\n\n\t// Indicates whether this object has an active legal hold. This field is only\n\t// returned if you have permission to view an object's legal hold status.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tObjectLockLegalHoldStatus types.ObjectLockLegalHoldStatus\n\n\t// The Object Lock mode that's currently in place for this object.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tObjectLockMode types.ObjectLockMode\n\n\t// The date and time when this object's Object Lock will expire.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tObjectLockRetainUntilDate *time.Time\n\n\t// The count of parts this object has. This value is only returned if you specify\n\t// partNumber in your request and the object was uploaded as a multipart upload.\n\tPartsCount *int32\n\n\t// Amazon S3 can return this if your request involves a bucket that is either a\n\t// source or destination in a replication rule.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tReplicationStatus types.ReplicationStatus\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// Provides information about object restoration action and expiration time of the\n\t// restored object copy.\n\t//\n\t// This functionality is not supported for directory buckets. Directory buckets\n\t// only support EXPRESS_ONEZONE (the S3 Express One Zone storage class) in\n\t// Availability Zones and ONEZONE_IA (the S3 One Zone-Infrequent Access storage\n\t// class) in Dedicated Local Zones.\n\tRestore *string\n\n\t// If server-side encryption with a customer-provided encryption key was\n\t// requested, the response will include this header to confirm the encryption\n\t// algorithm that's used.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerAlgorithm *string\n\n\t// If server-side encryption with a customer-provided encryption key was\n\t// requested, the response will include this header to provide the round-trip\n\t// message integrity verification of the customer-provided encryption key.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerKeyMD5 *string\n\n\t// If present, indicates the ID of the KMS key that was used for object encryption.\n\tSSEKMSKeyId *string\n\n\t// The server-side encryption algorithm used when you store this object in Amazon\n\t// S3.\n\tServerSideEncryption types.ServerSideEncryption\n\n\t// Provides storage class information of the object. Amazon S3 returns this header\n\t// for all objects except for S3 Standard storage class objects.\n\t//\n\t// Directory buckets - Directory buckets only support EXPRESS_ONEZONE (the S3\n\t// Express One Zone storage class) in Availability Zones and ONEZONE_IA (the S3\n\t// One Zone-Infrequent Access storage class) in Dedicated Local Zones.\n\tStorageClass types.StorageClass\n\n\t// The number of tags, if any, on the object, when you have the relevant\n\t// permission to read object tags.\n\t//\n\t// You can use [GetObjectTagging] to retrieve the tag set associated with an object.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [GetObjectTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html\n\tTagCount *int32\n\n\t// Version ID of the object.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tVersionId *string\n\n\t// If the bucket is configured as a website, redirects requests for this object to\n\t// another object in the same bucket or to an external URL. Amazon S3 stores the\n\t// value of this header in the object metadata.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tWebsiteRedirectLocation *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetObjectMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetObject{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetObject{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetObject\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetObjectValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetObject(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetObjectOutputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetObjectUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetObjectInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetObject(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetObject\",\n\t}\n}\n\n// getGetObjectRequestValidationModeMember gets the request checksum validation\n// mode provided as input.\nfunc getGetObjectRequestValidationModeMember(input interface{}) (string, bool) {\n\tin := input.(*GetObjectInput)\n\tif len(in.ChecksumMode) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumMode), true\n}\n\nfunc setGetObjectRequestValidationModeMember(input interface{}, mode string) {\n\tin := input.(*GetObjectInput)\n\tin.ChecksumMode = types.ChecksumMode(mode)\n}\n\nfunc addGetObjectOutputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn internalChecksum.AddOutputMiddleware(stack, internalChecksum.OutputMiddlewareOptions{\n\t\tGetValidationMode:             getGetObjectRequestValidationModeMember,\n\t\tSetValidationMode:             setGetObjectRequestValidationModeMember,\n\t\tResponseChecksumValidation:    options.ResponseChecksumValidation,\n\t\tValidationAlgorithms:          []string{\"CRC64NVME\", \"CRC32\", \"CRC32C\", \"SHA256\", \"SHA1\"},\n\t\tIgnoreMultipartValidation:     true,\n\t\tLogValidationSkipped:          !options.DisableLogOutputChecksumValidationSkipped,\n\t\tLogMultipartValidationSkipped: !options.DisableLogOutputChecksumValidationSkipped,\n\t})\n}\n\n// getGetObjectBucketMember returns a pointer to string denoting a provided bucket\n// member valueand a boolean indicating if the input has a modeled bucket name,\nfunc getGetObjectBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetObjectInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetObjectUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetObjectBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n\n// PresignGetObject is used to generate a presigned HTTP Request which contains\n// presigned URL, signed headers and HTTP method used.\nfunc (c *PresignClient) PresignGetObject(ctx context.Context, params *GetObjectInput, optFns ...func(*PresignOptions)) (*v4.PresignedHTTPRequest, error) {\n\tif params == nil {\n\t\tparams = &GetObjectInput{}\n\t}\n\toptions := c.options.copy()\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\tclientOptFns := append(options.ClientOptions, withNopHTTPClientAPIOption)\n\n\tresult, _, err := c.client.invokeOperation(ctx, \"GetObject\", params, clientOptFns,\n\t\tc.client.addOperationGetObjectMiddlewares,\n\t\tpresignConverter(options).convertToPresignMiddleware,\n\t\taddGetObjectPayloadAsUnsigned,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*v4.PresignedHTTPRequest)\n\treturn out, nil\n}\n\nfunc addGetObjectPayloadAsUnsigned(stack *middleware.Stack, options Options) error {\n\tv4.RemoveContentSHA256HeaderMiddleware(stack)\n\tv4.RemoveComputePayloadSHA256Middleware(stack)\n\treturn v4.AddUnsignedPayloadMiddleware(stack)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetObjectAcl.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Returns the access control list (ACL) of an object. To use this operation, you\n// must have s3:GetObjectAcl permissions or READ_ACP access to the object. For\n// more information, see [Mapping of ACL permissions and access policy permissions]in the Amazon S3 User Guide\n//\n// This functionality is not supported for Amazon S3 on Outposts.\n//\n// By default, GET returns ACL information about the current version of an object.\n// To return ACL information about a different version, use the versionId\n// subresource.\n//\n// If your bucket uses the bucket owner enforced setting for S3 Object Ownership,\n// requests to read ACLs are still supported and return the\n// bucket-owner-full-control ACL with the owner being the account that created the\n// bucket. For more information, see [Controlling object ownership and disabling ACLs]in the Amazon S3 User Guide.\n//\n// The following operations are related to GetObjectAcl :\n//\n// [GetObject]\n//\n// [GetObjectAttributes]\n//\n// [DeleteObject]\n//\n// [PutObject]\n//\n// [DeleteObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html\n// [Mapping of ACL permissions and access policy permissions]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#acl-access-policy-permission-mapping\n// [GetObjectAttributes]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html\n// [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\n// [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\n// [Controlling object ownership and disabling ACLs]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html\nfunc (c *Client) GetObjectAcl(ctx context.Context, params *GetObjectAclInput, optFns ...func(*Options)) (*GetObjectAclOutput, error) {\n\tif params == nil {\n\t\tparams = &GetObjectAclInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetObjectAcl\", params, optFns, c.addOperationGetObjectAclMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetObjectAclOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetObjectAclInput struct {\n\n\t// The bucket name that contains the object for which to get the ACL information.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The key of the object for which to get the ACL information.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// Version ID used to reference a specific version of the object.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tVersionId *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetObjectAclInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.Key = in.Key\n\n}\n\ntype GetObjectAclOutput struct {\n\n\t// A list of grants.\n\tGrants []types.Grant\n\n\t//  Container for the bucket owner's display name and ID.\n\tOwner *types.Owner\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetObjectAclMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetObjectAcl{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetObjectAcl{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetObjectAcl\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetObjectAclValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetObjectAcl(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetObjectAclUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetObjectAclInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetObjectAcl(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetObjectAcl\",\n\t}\n}\n\n// getGetObjectAclBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getGetObjectAclBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetObjectAclInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetObjectAclUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetObjectAclBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetObjectAttributes.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"time\"\n)\n\n// Retrieves all the metadata from an object without returning the object itself.\n// This operation is useful if you're interested only in an object's metadata.\n//\n// GetObjectAttributes combines the functionality of HeadObject and ListParts . All\n// of the data returned with each of those individual calls can be returned with a\n// single call to GetObjectAttributes .\n//\n// Directory buckets - For directory buckets, you must make requests for this API\n// operation to the Zonal endpoint. These endpoints support virtual-hosted-style\n// requests in the format\n// https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name\n// . Path-style requests are not supported. For more information about endpoints\n// in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information\n// about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// Permissions\n//\n//   - General purpose bucket permissions - To use GetObjectAttributes , you must\n//     have READ access to the object. The permissions that you need to use this\n//     operation depend on whether the bucket is versioned. If the bucket is versioned,\n//     you need both the s3:GetObjectVersion and s3:GetObjectVersionAttributes\n//     permissions for this operation. If the bucket is not versioned, you need the\n//     s3:GetObject and s3:GetObjectAttributes permissions. For more information, see [Specifying Permissions in a Policy]\n//     in the Amazon S3 User Guide. If the object that you request does not exist, the\n//     error Amazon S3 returns depends on whether you also have the s3:ListBucket\n//     permission.\n//\n//   - If you have the s3:ListBucket permission on the bucket, Amazon S3 returns an\n//     HTTP status code 404 Not Found (\"no such key\") error.\n//\n//   - If you don't have the s3:ListBucket permission, Amazon S3 returns an HTTP\n//     status code 403 Forbidden (\"access denied\") error.\n//\n//   - Directory bucket permissions - To grant access to this API operation on a\n//     directory bucket, we recommend that you use the [CreateSession]CreateSession API operation\n//     for session-based authorization. Specifically, you grant the\n//     s3express:CreateSession permission to the directory bucket in a bucket policy\n//     or an IAM identity-based policy. Then, you make the CreateSession API call on\n//     the bucket to obtain a session token. With the session token in your request\n//     header, you can make API requests to this operation. After the session token\n//     expires, you make another CreateSession API call to generate a new session\n//     token for use. Amazon Web Services CLI or SDKs create session and refresh the\n//     session token automatically to avoid service interruptions when a session\n//     expires. For more information about authorization, see [CreateSession]CreateSession .\n//\n// If the object is encrypted with SSE-KMS, you must also have the\n//\n//\tkms:GenerateDataKey and kms:Decrypt permissions in IAM identity-based policies\n//\tand KMS key policies for the KMS key.\n//\n// Encryption Encryption request headers, like x-amz-server-side-encryption ,\n// should not be sent for HEAD requests if your object uses server-side encryption\n// with Key Management Service (KMS) keys (SSE-KMS), dual-layer server-side\n// encryption with Amazon Web Services KMS keys (DSSE-KMS), or server-side\n// encryption with Amazon S3 managed encryption keys (SSE-S3). The\n// x-amz-server-side-encryption header is used when you PUT an object to S3 and\n// want to specify the encryption method. If you include this header in a GET\n// request for an object that uses these types of keys, you’ll get an HTTP 400 Bad\n// Request error. It's because the encryption method can't be changed when you\n// retrieve the object.\n//\n// If you encrypt an object by using server-side encryption with customer-provided\n// encryption keys (SSE-C) when you store the object in Amazon S3, then when you\n// retrieve the metadata from the object, you must use the following headers to\n// provide the encryption key for the server to be able to retrieve the object's\n// metadata. The headers are:\n//\n//   - x-amz-server-side-encryption-customer-algorithm\n//\n//   - x-amz-server-side-encryption-customer-key\n//\n//   - x-amz-server-side-encryption-customer-key-MD5\n//\n// For more information about SSE-C, see [Server-Side Encryption (Using Customer-Provided Encryption Keys)] in the Amazon S3 User Guide.\n//\n// Directory bucket permissions - For directory buckets, there are only two\n// supported options for server-side encryption: server-side encryption with Amazon\n// S3 managed keys (SSE-S3) ( AES256 ) and server-side encryption with KMS keys\n// (SSE-KMS) ( aws:kms ). We recommend that the bucket's default encryption uses\n// the desired encryption configuration and you don't override the bucket default\n// encryption in your CreateSession requests or PUT object requests. Then, new\n// objects are automatically encrypted with the desired encryption settings. For\n// more information, see [Protecting data with server-side encryption]in the Amazon S3 User Guide. For more information about\n// the encryption overriding behaviors in directory buckets, see [Specifying server-side encryption with KMS for new object uploads].\n//\n// Versioning  Directory buckets - S3 Versioning isn't enabled and supported for\n// directory buckets. For this API operation, only the null value of the version\n// ID is supported by directory buckets. You can only specify null to the versionId\n// query parameter in the request.\n//\n// Conditional request headers Consider the following when using request headers:\n//\n//   - If both of the If-Match and If-Unmodified-Since headers are present in the\n//     request as follows, then Amazon S3 returns the HTTP status code 200 OK and the\n//     data requested:\n//\n//   - If-Match condition evaluates to true .\n//\n//   - If-Unmodified-Since condition evaluates to false .\n//\n// For more information about conditional requests, see [RFC 7232].\n//\n//   - If both of the If-None-Match and If-Modified-Since headers are present in\n//     the request as follows, then Amazon S3 returns the HTTP status code 304 Not\n//     Modified :\n//\n//   - If-None-Match condition evaluates to false .\n//\n//   - If-Modified-Since condition evaluates to true .\n//\n// For more information about conditional requests, see [RFC 7232].\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// Bucket-name.s3express-zone-id.region-code.amazonaws.com .\n//\n// The following actions are related to GetObjectAttributes :\n//\n// [GetObject]\n//\n// [GetObjectAcl]\n//\n// [GetObjectLegalHold]\n//\n// [GetObjectLockConfiguration]\n//\n// [GetObjectRetention]\n//\n// [GetObjectTagging]\n//\n// [HeadObject]\n//\n// [ListParts]\n//\n// [Specifying server-side encryption with KMS for new object uploads]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html\n// [GetObjectLegalHold]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectLegalHold.html\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [ListParts]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html\n// [Server-Side Encryption (Using Customer-Provided Encryption Keys)]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\n// [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\n// [GetObjectTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html\n// [Specifying Permissions in a Policy]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html\n// [RFC 7232]: https://tools.ietf.org/html/rfc7232\n// [HeadObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html\n// [GetObjectLockConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectLockConfiguration.html\n// [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\n// [GetObjectAcl]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAcl.html\n// [GetObjectRetention]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectRetention.html\n// [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\nfunc (c *Client) GetObjectAttributes(ctx context.Context, params *GetObjectAttributesInput, optFns ...func(*Options)) (*GetObjectAttributesOutput, error) {\n\tif params == nil {\n\t\tparams = &GetObjectAttributesInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetObjectAttributes\", params, optFns, c.addOperationGetObjectAttributesMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetObjectAttributesOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetObjectAttributesInput struct {\n\n\t// The name of the bucket that contains the object.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use virtual-hosted-style requests in the format\n\t// Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests\n\t// are not supported. Directory bucket names must be unique in the chosen Zone\n\t// (Availability Zone or Local Zone). Bucket names must follow the format\n\t// bucket-base-name--zone-id--x-s3 (for example,\n\t// amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// Object Lambda access points are not supported by directory buckets.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The object key.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// Specifies the fields at the root level that you want returned in the response.\n\t// Fields that you do not specify are not returned.\n\t//\n\t// This member is required.\n\tObjectAttributes []types.ObjectAttributes\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Sets the maximum number of parts to return.\n\tMaxParts *int32\n\n\t// Specifies the part after which listing should begin. Only parts with higher\n\t// part numbers will be listed.\n\tPartNumberMarker *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// Specifies the algorithm to use when encrypting the object (for example, AES256).\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerAlgorithm *string\n\n\t// Specifies the customer-provided encryption key for Amazon S3 to use in\n\t// encrypting data. This value is used to store the object and then it is\n\t// discarded; Amazon S3 does not store the encryption key. The key must be\n\t// appropriate for use with the algorithm specified in the\n\t// x-amz-server-side-encryption-customer-algorithm header.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerKey *string\n\n\t// Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321.\n\t// Amazon S3 uses this header for a message integrity check to ensure that the\n\t// encryption key was transmitted without error.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerKeyMD5 *string\n\n\t// The version ID used to reference a specific version of the object.\n\t//\n\t// S3 Versioning isn't enabled and supported for directory buckets. For this API\n\t// operation, only the null value of the version ID is supported by directory\n\t// buckets. You can only specify null to the versionId query parameter in the\n\t// request.\n\tVersionId *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetObjectAttributesInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\n}\n\ntype GetObjectAttributesOutput struct {\n\n\t// The checksum or digest of the object.\n\tChecksum *types.Checksum\n\n\t// Specifies whether the object retrieved was ( true ) or was not ( false ) a\n\t// delete marker. If false , this response header does not appear in the response.\n\t// To learn more about delete markers, see [Working with delete markers].\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Working with delete markers]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeleteMarker.html\n\tDeleteMarker *bool\n\n\t// An ETag is an opaque identifier assigned by a web server to a specific version\n\t// of a resource found at a URL.\n\tETag *string\n\n\t// Date and time when the object was last modified.\n\tLastModified *time.Time\n\n\t// A collection of parts associated with a multipart upload.\n\tObjectParts *types.GetObjectAttributesParts\n\n\t// The size of the object in bytes.\n\tObjectSize *int64\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// Provides the storage class information of the object. Amazon S3 returns this\n\t// header for all objects except for S3 Standard storage class objects.\n\t//\n\t// For more information, see [Storage Classes].\n\t//\n\t// Directory buckets - Directory buckets only support EXPRESS_ONEZONE (the S3\n\t// Express One Zone storage class) in Availability Zones and ONEZONE_IA (the S3\n\t// One Zone-Infrequent Access storage class) in Dedicated Local Zones.\n\t//\n\t// [Storage Classes]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html\n\tStorageClass types.StorageClass\n\n\t// The version ID of the object.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tVersionId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetObjectAttributesMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetObjectAttributes{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetObjectAttributes{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetObjectAttributes\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetObjectAttributesValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetObjectAttributes(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetObjectAttributesUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetObjectAttributesInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetObjectAttributes(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetObjectAttributes\",\n\t}\n}\n\n// getGetObjectAttributesBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getGetObjectAttributesBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetObjectAttributesInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetObjectAttributesUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetObjectAttributesBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetObjectLegalHold.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Gets an object's current legal hold status. For more information, see [Locking Objects].\n//\n// This functionality is not supported for Amazon S3 on Outposts.\n//\n// The following action is related to GetObjectLegalHold :\n//\n// [GetObjectAttributes]\n//\n// [GetObjectAttributes]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html\n// [Locking Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html\nfunc (c *Client) GetObjectLegalHold(ctx context.Context, params *GetObjectLegalHoldInput, optFns ...func(*Options)) (*GetObjectLegalHoldOutput, error) {\n\tif params == nil {\n\t\tparams = &GetObjectLegalHoldInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetObjectLegalHold\", params, optFns, c.addOperationGetObjectLegalHoldMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetObjectLegalHoldOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetObjectLegalHoldInput struct {\n\n\t// The bucket name containing the object whose legal hold status you want to\n\t// retrieve.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The key name for the object whose legal hold status you want to retrieve.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// The version ID of the object whose legal hold status you want to retrieve.\n\tVersionId *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetObjectLegalHoldInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\n}\n\ntype GetObjectLegalHoldOutput struct {\n\n\t// The current legal hold status for the specified object.\n\tLegalHold *types.ObjectLockLegalHold\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetObjectLegalHoldMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetObjectLegalHold{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetObjectLegalHold{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetObjectLegalHold\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetObjectLegalHoldValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetObjectLegalHold(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetObjectLegalHoldUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetObjectLegalHoldInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetObjectLegalHold(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetObjectLegalHold\",\n\t}\n}\n\n// getGetObjectLegalHoldBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getGetObjectLegalHoldBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetObjectLegalHoldInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetObjectLegalHoldUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetObjectLegalHoldBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetObjectLockConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Gets the Object Lock configuration for a bucket. The rule specified in the\n// Object Lock configuration will be applied by default to every new object placed\n// in the specified bucket. For more information, see [Locking Objects].\n//\n// The following action is related to GetObjectLockConfiguration :\n//\n// [GetObjectAttributes]\n//\n// [GetObjectAttributes]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html\n// [Locking Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html\nfunc (c *Client) GetObjectLockConfiguration(ctx context.Context, params *GetObjectLockConfigurationInput, optFns ...func(*Options)) (*GetObjectLockConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &GetObjectLockConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetObjectLockConfiguration\", params, optFns, c.addOperationGetObjectLockConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetObjectLockConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetObjectLockConfigurationInput struct {\n\n\t// The bucket whose Object Lock configuration you want to retrieve.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetObjectLockConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\n}\n\ntype GetObjectLockConfigurationOutput struct {\n\n\t// The specified bucket's Object Lock configuration.\n\tObjectLockConfiguration *types.ObjectLockConfiguration\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetObjectLockConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetObjectLockConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetObjectLockConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetObjectLockConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetObjectLockConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetObjectLockConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetObjectLockConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetObjectLockConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetObjectLockConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetObjectLockConfiguration\",\n\t}\n}\n\n// getGetObjectLockConfigurationBucketMember returns a pointer to string denoting\n// a provided bucket member valueand a boolean indicating if the input has a\n// modeled bucket name,\nfunc getGetObjectLockConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetObjectLockConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetObjectLockConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetObjectLockConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetObjectRetention.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Retrieves an object's retention settings. For more information, see [Locking Objects].\n//\n// This functionality is not supported for Amazon S3 on Outposts.\n//\n// The following action is related to GetObjectRetention :\n//\n// [GetObjectAttributes]\n//\n// [GetObjectAttributes]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html\n// [Locking Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html\nfunc (c *Client) GetObjectRetention(ctx context.Context, params *GetObjectRetentionInput, optFns ...func(*Options)) (*GetObjectRetentionOutput, error) {\n\tif params == nil {\n\t\tparams = &GetObjectRetentionInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetObjectRetention\", params, optFns, c.addOperationGetObjectRetentionMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetObjectRetentionOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetObjectRetentionInput struct {\n\n\t// The bucket name containing the object whose retention settings you want to\n\t// retrieve.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The key name for the object whose retention settings you want to retrieve.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// The version ID for the object whose retention settings you want to retrieve.\n\tVersionId *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetObjectRetentionInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\n}\n\ntype GetObjectRetentionOutput struct {\n\n\t// The container element for an object's retention settings.\n\tRetention *types.ObjectLockRetention\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetObjectRetentionMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetObjectRetention{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetObjectRetention{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetObjectRetention\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetObjectRetentionValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetObjectRetention(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetObjectRetentionUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetObjectRetentionInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetObjectRetention(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetObjectRetention\",\n\t}\n}\n\n// getGetObjectRetentionBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getGetObjectRetentionBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetObjectRetentionInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetObjectRetentionUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetObjectRetentionBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetObjectTagging.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Returns the tag-set of an object. You send the GET request against the tagging\n// subresource associated with the object.\n//\n// To use this operation, you must have permission to perform the\n// s3:GetObjectTagging action. By default, the GET action returns information about\n// current version of an object. For a versioned bucket, you can have multiple\n// versions of an object in your bucket. To retrieve tags of any other version, use\n// the versionId query parameter. You also need permission for the\n// s3:GetObjectVersionTagging action.\n//\n// By default, the bucket owner has this permission and can grant this permission\n// to others.\n//\n// For information about the Amazon S3 object tagging feature, see [Object Tagging].\n//\n// The following actions are related to GetObjectTagging :\n//\n// [DeleteObjectTagging]\n//\n// [GetObjectAttributes]\n//\n// [PutObjectTagging]\n//\n// [DeleteObjectTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html\n// [PutObjectTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html\n// [GetObjectAttributes]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html\n// [Object Tagging]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-tagging.html\nfunc (c *Client) GetObjectTagging(ctx context.Context, params *GetObjectTaggingInput, optFns ...func(*Options)) (*GetObjectTaggingOutput, error) {\n\tif params == nil {\n\t\tparams = &GetObjectTaggingInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetObjectTagging\", params, optFns, c.addOperationGetObjectTaggingMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetObjectTaggingOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetObjectTaggingInput struct {\n\n\t// The bucket name containing the object for which to get the tagging information.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Object key for which to get the tagging information.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// The versionId of the object for which to get the tagging information.\n\tVersionId *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetObjectTaggingInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\n}\n\ntype GetObjectTaggingOutput struct {\n\n\t// Contains the tag set.\n\t//\n\t// This member is required.\n\tTagSet []types.Tag\n\n\t// The versionId of the object for which you got the tagging information.\n\tVersionId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetObjectTaggingMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetObjectTagging{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetObjectTagging{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetObjectTagging\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetObjectTaggingValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetObjectTagging(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetObjectTaggingUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetObjectTaggingInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetObjectTagging(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetObjectTagging\",\n\t}\n}\n\n// getGetObjectTaggingBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getGetObjectTaggingBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetObjectTaggingInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetObjectTaggingUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetObjectTaggingBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetObjectTorrent.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"io\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Returns torrent files from a bucket. BitTorrent can save you bandwidth when\n// you're distributing large files.\n//\n// You can get torrent only for objects that are less than 5 GB in size, and that\n// are not encrypted using server-side encryption with a customer-provided\n// encryption key.\n//\n// To use GET, you must have READ access to the object.\n//\n// This functionality is not supported for Amazon S3 on Outposts.\n//\n// The following action is related to GetObjectTorrent :\n//\n// [GetObject]\n//\n// [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\nfunc (c *Client) GetObjectTorrent(ctx context.Context, params *GetObjectTorrentInput, optFns ...func(*Options)) (*GetObjectTorrentOutput, error) {\n\tif params == nil {\n\t\tparams = &GetObjectTorrentInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetObjectTorrent\", params, optFns, c.addOperationGetObjectTorrentMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetObjectTorrentOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetObjectTorrentInput struct {\n\n\t// The name of the bucket containing the object for which to get the torrent files.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The object key for which to get the information.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetObjectTorrentInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\n}\n\ntype GetObjectTorrentOutput struct {\n\n\t// A Bencoded dictionary as defined by the BitTorrent specification\n\tBody io.ReadCloser\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetObjectTorrentMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetObjectTorrent{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetObjectTorrent{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetObjectTorrent\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetObjectTorrentValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetObjectTorrent(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetObjectTorrentUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetObjectTorrentInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetObjectTorrent(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetObjectTorrent\",\n\t}\n}\n\n// getGetObjectTorrentBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getGetObjectTorrentBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetObjectTorrentInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetObjectTorrentUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetObjectTorrentBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetPublicAccessBlock.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Retrieves the PublicAccessBlock configuration for an Amazon S3 bucket. To use\n// this operation, you must have the s3:GetBucketPublicAccessBlock permission. For\n// more information about Amazon S3 permissions, see [Specifying Permissions in a Policy].\n//\n// When Amazon S3 evaluates the PublicAccessBlock configuration for a bucket or an\n// object, it checks the PublicAccessBlock configuration for both the bucket (or\n// the bucket that contains the object) and the bucket owner's account. If the\n// PublicAccessBlock settings are different between the bucket and the account,\n// Amazon S3 uses the most restrictive combination of the bucket-level and\n// account-level settings.\n//\n// For more information about when Amazon S3 considers a bucket or an object\n// public, see [The Meaning of \"Public\"].\n//\n// The following operations are related to GetPublicAccessBlock :\n//\n// [Using Amazon S3 Block Public Access]\n//\n// [PutPublicAccessBlock]\n//\n// [GetPublicAccessBlock]\n//\n// [DeletePublicAccessBlock]\n//\n// [GetPublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetPublicAccessBlock.html\n// [PutPublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutPublicAccessBlock.html\n// [DeletePublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeletePublicAccessBlock.html\n// [Using Amazon S3 Block Public Access]: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html\n// [Specifying Permissions in a Policy]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html\n// [The Meaning of \"Public\"]: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status\nfunc (c *Client) GetPublicAccessBlock(ctx context.Context, params *GetPublicAccessBlockInput, optFns ...func(*Options)) (*GetPublicAccessBlockOutput, error) {\n\tif params == nil {\n\t\tparams = &GetPublicAccessBlockInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"GetPublicAccessBlock\", params, optFns, c.addOperationGetPublicAccessBlockMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*GetPublicAccessBlockOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype GetPublicAccessBlockInput struct {\n\n\t// The name of the Amazon S3 bucket whose PublicAccessBlock configuration you want\n\t// to retrieve.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *GetPublicAccessBlockInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype GetPublicAccessBlockOutput struct {\n\n\t// The PublicAccessBlock configuration currently in effect for this Amazon S3\n\t// bucket.\n\tPublicAccessBlockConfiguration *types.PublicAccessBlockConfiguration\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationGetPublicAccessBlockMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpGetPublicAccessBlock{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpGetPublicAccessBlock{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"GetPublicAccessBlock\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpGetPublicAccessBlockValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetPublicAccessBlock(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addGetPublicAccessBlockUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *GetPublicAccessBlockInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opGetPublicAccessBlock(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"GetPublicAccessBlock\",\n\t}\n}\n\n// getGetPublicAccessBlockBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getGetPublicAccessBlockBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*GetPublicAccessBlockInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addGetPublicAccessBlockUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getGetPublicAccessBlockBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_HeadBucket.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithytime \"github.com/aws/smithy-go/time\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\tsmithywaiter \"github.com/aws/smithy-go/waiter\"\n\t\"time\"\n)\n\n// You can use this operation to determine if a bucket exists and if you have\n// permission to access it. The action returns a 200 OK if the bucket exists and\n// you have permission to access it.\n//\n// If the bucket does not exist or you do not have permission to access it, the\n// HEAD request returns a generic 400 Bad Request , 403 Forbidden or 404 Not Found\n// code. A message body is not included, so you cannot determine the exception\n// beyond these HTTP response codes.\n//\n// Authentication and authorization  General purpose buckets - Request to public\n// buckets that grant the s3:ListBucket permission publicly do not need to be\n// signed. All other HeadBucket requests must be authenticated and signed by using\n// IAM credentials (access key ID and secret access key for the IAM identities).\n// All headers with the x-amz- prefix, including x-amz-copy-source , must be\n// signed. For more information, see [REST Authentication].\n//\n// Directory buckets - You must use IAM credentials to authenticate and authorize\n// your access to the HeadBucket API operation, instead of using the temporary\n// security credentials through the CreateSession API operation.\n//\n// Amazon Web Services CLI or SDKs handles authentication and authorization on\n// your behalf.\n//\n// Permissions\n//\n//   - General purpose bucket permissions - To use this operation, you must have\n//     permissions to perform the s3:ListBucket action. The bucket owner has this\n//     permission by default and can grant this permission to others. For more\n//     information about permissions, see [Managing access permissions to your Amazon S3 resources]in the Amazon S3 User Guide.\n//\n//   - Directory bucket permissions - You must have the s3express:CreateSession\n//     permission in the Action element of a policy. By default, the session is in\n//     the ReadWrite mode. If you want to restrict the access, you can explicitly set\n//     the s3express:SessionMode condition key to ReadOnly on the bucket.\n//\n// For more information about example bucket policies, see [Example bucket policies for S3 Express One Zone]and [Amazon Web Services Identity and Access Management (IAM) identity-based policies for S3 Express One Zone]in the Amazon S3\n//\n//\tUser Guide.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// Bucket-name.s3express-zone-id.region-code.amazonaws.com .\n//\n// You must make requests for this API operation to the Zonal endpoint. These\n// endpoints support virtual-hosted-style requests in the format\n// https://bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style\n// requests are not supported. For more information about endpoints in Availability\n// Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information about endpoints in\n// Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// [Amazon Web Services Identity and Access Management (IAM) identity-based policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-identity-policies.html\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n// [Example bucket policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-example-bucket-policies.html\n// [Managing access permissions to your Amazon S3 resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\nfunc (c *Client) HeadBucket(ctx context.Context, params *HeadBucketInput, optFns ...func(*Options)) (*HeadBucketOutput, error) {\n\tif params == nil {\n\t\tparams = &HeadBucketInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"HeadBucket\", params, optFns, c.addOperationHeadBucketMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*HeadBucketOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype HeadBucketInput struct {\n\n\t// The bucket name.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use virtual-hosted-style requests in the format\n\t// Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests\n\t// are not supported. Directory bucket names must be unique in the chosen Zone\n\t// (Availability Zone or Local Zone). Bucket names must follow the format\n\t// bucket-base-name--zone-id--x-s3 (for example,\n\t// amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// Object Lambda access points - When you use this API operation with an Object\n\t// Lambda access point, provide the alias of the Object Lambda access point in\n\t// place of the bucket name. If the Object Lambda access point alias in a request\n\t// is not valid, the error code InvalidAccessPointAliasError is returned. For more\n\t// information about InvalidAccessPointAliasError , see [List of Error Codes].\n\t//\n\t// Object Lambda access points are not supported by directory buckets.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t// [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *HeadBucketInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\n}\n\ntype HeadBucketOutput struct {\n\n\t// Indicates whether the bucket name used in the request is an access point alias.\n\t//\n\t// For directory buckets, the value of this field is false .\n\tAccessPointAlias *bool\n\n\t// The name of the location where the bucket will be created.\n\t//\n\t// For directory buckets, the Zone ID of the Availability Zone or the Local Zone\n\t// where the bucket is created. An example Zone ID value for an Availability Zone\n\t// is usw2-az1 .\n\t//\n\t// This functionality is only supported by directory buckets.\n\tBucketLocationName *string\n\n\t// The type of location where the bucket is created.\n\t//\n\t// This functionality is only supported by directory buckets.\n\tBucketLocationType types.LocationType\n\n\t// The Region that the bucket is located.\n\tBucketRegion *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationHeadBucketMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpHeadBucket{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpHeadBucket{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"HeadBucket\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpHeadBucketValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opHeadBucket(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addHeadBucketUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// BucketExistsWaiterOptions are waiter options for BucketExistsWaiter\ntype BucketExistsWaiterOptions struct {\n\n\t// Set of options to modify how an operation is invoked. These apply to all\n\t// operations invoked for this client. Use functional options on operation call to\n\t// modify this list for per operation behavior.\n\t//\n\t// Passing options here is functionally equivalent to passing values to this\n\t// config's ClientOptions field that extend the inner client's APIOptions directly.\n\tAPIOptions []func(*middleware.Stack) error\n\n\t// Functional options to be passed to all operations invoked by this client.\n\t//\n\t// Function values that modify the inner APIOptions are applied after the waiter\n\t// config's own APIOptions modifiers.\n\tClientOptions []func(*Options)\n\n\t// MinDelay is the minimum amount of time to delay between retries. If unset,\n\t// BucketExistsWaiter will use default minimum delay of 5 seconds. Note that\n\t// MinDelay must resolve to a value lesser than or equal to the MaxDelay.\n\tMinDelay time.Duration\n\n\t// MaxDelay is the maximum amount of time to delay between retries. If unset or\n\t// set to zero, BucketExistsWaiter will use default max delay of 120 seconds. Note\n\t// that MaxDelay must resolve to value greater than or equal to the MinDelay.\n\tMaxDelay time.Duration\n\n\t// LogWaitAttempts is used to enable logging for waiter retry attempts\n\tLogWaitAttempts bool\n\n\t// Retryable is function that can be used to override the service defined\n\t// waiter-behavior based on operation output, or returned error. This function is\n\t// used by the waiter to decide if a state is retryable or a terminal state.\n\t//\n\t// By default service-modeled logic will populate this option. This option can\n\t// thus be used to define a custom waiter state with fall-back to service-modeled\n\t// waiter state mutators.The function returns an error in case of a failure state.\n\t// In case of retry state, this function returns a bool value of true and nil\n\t// error, while in case of success it returns a bool value of false and nil error.\n\tRetryable func(context.Context, *HeadBucketInput, *HeadBucketOutput, error) (bool, error)\n}\n\n// BucketExistsWaiter defines the waiters for BucketExists\ntype BucketExistsWaiter struct {\n\tclient HeadBucketAPIClient\n\n\toptions BucketExistsWaiterOptions\n}\n\n// NewBucketExistsWaiter constructs a BucketExistsWaiter.\nfunc NewBucketExistsWaiter(client HeadBucketAPIClient, optFns ...func(*BucketExistsWaiterOptions)) *BucketExistsWaiter {\n\toptions := BucketExistsWaiterOptions{}\n\toptions.MinDelay = 5 * time.Second\n\toptions.MaxDelay = 120 * time.Second\n\toptions.Retryable = bucketExistsStateRetryable\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\treturn &BucketExistsWaiter{\n\t\tclient:  client,\n\t\toptions: options,\n\t}\n}\n\n// Wait calls the waiter function for BucketExists waiter. The maxWaitDur is the\n// maximum wait duration the waiter will wait. The maxWaitDur is required and must\n// be greater than zero.\nfunc (w *BucketExistsWaiter) Wait(ctx context.Context, params *HeadBucketInput, maxWaitDur time.Duration, optFns ...func(*BucketExistsWaiterOptions)) error {\n\t_, err := w.WaitForOutput(ctx, params, maxWaitDur, optFns...)\n\treturn err\n}\n\n// WaitForOutput calls the waiter function for BucketExists waiter and returns the\n// output of the successful operation. The maxWaitDur is the maximum wait duration\n// the waiter will wait. The maxWaitDur is required and must be greater than zero.\nfunc (w *BucketExistsWaiter) WaitForOutput(ctx context.Context, params *HeadBucketInput, maxWaitDur time.Duration, optFns ...func(*BucketExistsWaiterOptions)) (*HeadBucketOutput, error) {\n\tif maxWaitDur <= 0 {\n\t\treturn nil, fmt.Errorf(\"maximum wait time for waiter must be greater than zero\")\n\t}\n\n\toptions := w.options\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tif options.MaxDelay <= 0 {\n\t\toptions.MaxDelay = 120 * time.Second\n\t}\n\n\tif options.MinDelay > options.MaxDelay {\n\t\treturn nil, fmt.Errorf(\"minimum waiter delay %v must be lesser than or equal to maximum waiter delay of %v.\", options.MinDelay, options.MaxDelay)\n\t}\n\n\tctx, cancelFn := context.WithTimeout(ctx, maxWaitDur)\n\tdefer cancelFn()\n\n\tlogger := smithywaiter.Logger{}\n\tremainingTime := maxWaitDur\n\n\tvar attempt int64\n\tfor {\n\n\t\tattempt++\n\t\tapiOptions := options.APIOptions\n\t\tstart := time.Now()\n\n\t\tif options.LogWaitAttempts {\n\t\t\tlogger.Attempt = attempt\n\t\t\tapiOptions = append([]func(*middleware.Stack) error{}, options.APIOptions...)\n\t\t\tapiOptions = append(apiOptions, logger.AddLogger)\n\t\t}\n\n\t\tout, err := w.client.HeadBucket(ctx, params, func(o *Options) {\n\t\t\tbaseOpts := []func(*Options){\n\t\t\t\taddIsWaiterUserAgent,\n\t\t\t}\n\t\t\to.APIOptions = append(o.APIOptions, apiOptions...)\n\t\t\tfor _, opt := range baseOpts {\n\t\t\t\topt(o)\n\t\t\t}\n\t\t\tfor _, opt := range options.ClientOptions {\n\t\t\t\topt(o)\n\t\t\t}\n\t\t})\n\n\t\tretryable, err := options.Retryable(ctx, params, out, err)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif !retryable {\n\t\t\treturn out, nil\n\t\t}\n\n\t\tremainingTime -= time.Since(start)\n\t\tif remainingTime < options.MinDelay || remainingTime <= 0 {\n\t\t\tbreak\n\t\t}\n\n\t\t// compute exponential backoff between waiter retries\n\t\tdelay, err := smithywaiter.ComputeDelay(\n\t\t\tattempt, options.MinDelay, options.MaxDelay, remainingTime,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error computing waiter delay, %w\", err)\n\t\t}\n\n\t\tremainingTime -= delay\n\t\t// sleep for the delay amount before invoking a request\n\t\tif err := smithytime.SleepWithContext(ctx, delay); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"request cancelled while waiting, %w\", err)\n\t\t}\n\t}\n\treturn nil, fmt.Errorf(\"exceeded max wait time for BucketExists waiter\")\n}\n\nfunc bucketExistsStateRetryable(ctx context.Context, input *HeadBucketInput, output *HeadBucketOutput, err error) (bool, error) {\n\n\tif err == nil {\n\t\treturn false, nil\n\t}\n\n\tif err != nil {\n\t\tvar errorType *types.NotFound\n\t\tif errors.As(err, &errorType) {\n\t\t\treturn true, nil\n\t\t}\n\t}\n\n\tif err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n\n// BucketNotExistsWaiterOptions are waiter options for BucketNotExistsWaiter\ntype BucketNotExistsWaiterOptions struct {\n\n\t// Set of options to modify how an operation is invoked. These apply to all\n\t// operations invoked for this client. Use functional options on operation call to\n\t// modify this list for per operation behavior.\n\t//\n\t// Passing options here is functionally equivalent to passing values to this\n\t// config's ClientOptions field that extend the inner client's APIOptions directly.\n\tAPIOptions []func(*middleware.Stack) error\n\n\t// Functional options to be passed to all operations invoked by this client.\n\t//\n\t// Function values that modify the inner APIOptions are applied after the waiter\n\t// config's own APIOptions modifiers.\n\tClientOptions []func(*Options)\n\n\t// MinDelay is the minimum amount of time to delay between retries. If unset,\n\t// BucketNotExistsWaiter will use default minimum delay of 5 seconds. Note that\n\t// MinDelay must resolve to a value lesser than or equal to the MaxDelay.\n\tMinDelay time.Duration\n\n\t// MaxDelay is the maximum amount of time to delay between retries. If unset or\n\t// set to zero, BucketNotExistsWaiter will use default max delay of 120 seconds.\n\t// Note that MaxDelay must resolve to value greater than or equal to the MinDelay.\n\tMaxDelay time.Duration\n\n\t// LogWaitAttempts is used to enable logging for waiter retry attempts\n\tLogWaitAttempts bool\n\n\t// Retryable is function that can be used to override the service defined\n\t// waiter-behavior based on operation output, or returned error. This function is\n\t// used by the waiter to decide if a state is retryable or a terminal state.\n\t//\n\t// By default service-modeled logic will populate this option. This option can\n\t// thus be used to define a custom waiter state with fall-back to service-modeled\n\t// waiter state mutators.The function returns an error in case of a failure state.\n\t// In case of retry state, this function returns a bool value of true and nil\n\t// error, while in case of success it returns a bool value of false and nil error.\n\tRetryable func(context.Context, *HeadBucketInput, *HeadBucketOutput, error) (bool, error)\n}\n\n// BucketNotExistsWaiter defines the waiters for BucketNotExists\ntype BucketNotExistsWaiter struct {\n\tclient HeadBucketAPIClient\n\n\toptions BucketNotExistsWaiterOptions\n}\n\n// NewBucketNotExistsWaiter constructs a BucketNotExistsWaiter.\nfunc NewBucketNotExistsWaiter(client HeadBucketAPIClient, optFns ...func(*BucketNotExistsWaiterOptions)) *BucketNotExistsWaiter {\n\toptions := BucketNotExistsWaiterOptions{}\n\toptions.MinDelay = 5 * time.Second\n\toptions.MaxDelay = 120 * time.Second\n\toptions.Retryable = bucketNotExistsStateRetryable\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\treturn &BucketNotExistsWaiter{\n\t\tclient:  client,\n\t\toptions: options,\n\t}\n}\n\n// Wait calls the waiter function for BucketNotExists waiter. The maxWaitDur is\n// the maximum wait duration the waiter will wait. The maxWaitDur is required and\n// must be greater than zero.\nfunc (w *BucketNotExistsWaiter) Wait(ctx context.Context, params *HeadBucketInput, maxWaitDur time.Duration, optFns ...func(*BucketNotExistsWaiterOptions)) error {\n\t_, err := w.WaitForOutput(ctx, params, maxWaitDur, optFns...)\n\treturn err\n}\n\n// WaitForOutput calls the waiter function for BucketNotExists waiter and returns\n// the output of the successful operation. The maxWaitDur is the maximum wait\n// duration the waiter will wait. The maxWaitDur is required and must be greater\n// than zero.\nfunc (w *BucketNotExistsWaiter) WaitForOutput(ctx context.Context, params *HeadBucketInput, maxWaitDur time.Duration, optFns ...func(*BucketNotExistsWaiterOptions)) (*HeadBucketOutput, error) {\n\tif maxWaitDur <= 0 {\n\t\treturn nil, fmt.Errorf(\"maximum wait time for waiter must be greater than zero\")\n\t}\n\n\toptions := w.options\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tif options.MaxDelay <= 0 {\n\t\toptions.MaxDelay = 120 * time.Second\n\t}\n\n\tif options.MinDelay > options.MaxDelay {\n\t\treturn nil, fmt.Errorf(\"minimum waiter delay %v must be lesser than or equal to maximum waiter delay of %v.\", options.MinDelay, options.MaxDelay)\n\t}\n\n\tctx, cancelFn := context.WithTimeout(ctx, maxWaitDur)\n\tdefer cancelFn()\n\n\tlogger := smithywaiter.Logger{}\n\tremainingTime := maxWaitDur\n\n\tvar attempt int64\n\tfor {\n\n\t\tattempt++\n\t\tapiOptions := options.APIOptions\n\t\tstart := time.Now()\n\n\t\tif options.LogWaitAttempts {\n\t\t\tlogger.Attempt = attempt\n\t\t\tapiOptions = append([]func(*middleware.Stack) error{}, options.APIOptions...)\n\t\t\tapiOptions = append(apiOptions, logger.AddLogger)\n\t\t}\n\n\t\tout, err := w.client.HeadBucket(ctx, params, func(o *Options) {\n\t\t\tbaseOpts := []func(*Options){\n\t\t\t\taddIsWaiterUserAgent,\n\t\t\t}\n\t\t\to.APIOptions = append(o.APIOptions, apiOptions...)\n\t\t\tfor _, opt := range baseOpts {\n\t\t\t\topt(o)\n\t\t\t}\n\t\t\tfor _, opt := range options.ClientOptions {\n\t\t\t\topt(o)\n\t\t\t}\n\t\t})\n\n\t\tretryable, err := options.Retryable(ctx, params, out, err)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif !retryable {\n\t\t\treturn out, nil\n\t\t}\n\n\t\tremainingTime -= time.Since(start)\n\t\tif remainingTime < options.MinDelay || remainingTime <= 0 {\n\t\t\tbreak\n\t\t}\n\n\t\t// compute exponential backoff between waiter retries\n\t\tdelay, err := smithywaiter.ComputeDelay(\n\t\t\tattempt, options.MinDelay, options.MaxDelay, remainingTime,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error computing waiter delay, %w\", err)\n\t\t}\n\n\t\tremainingTime -= delay\n\t\t// sleep for the delay amount before invoking a request\n\t\tif err := smithytime.SleepWithContext(ctx, delay); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"request cancelled while waiting, %w\", err)\n\t\t}\n\t}\n\treturn nil, fmt.Errorf(\"exceeded max wait time for BucketNotExists waiter\")\n}\n\nfunc bucketNotExistsStateRetryable(ctx context.Context, input *HeadBucketInput, output *HeadBucketOutput, err error) (bool, error) {\n\n\tif err != nil {\n\t\tvar errorType *types.NotFound\n\t\tif errors.As(err, &errorType) {\n\t\t\treturn false, nil\n\t\t}\n\t}\n\n\tif err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n\nfunc (v *HeadBucketInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\n// HeadBucketAPIClient is a client that implements the HeadBucket operation.\ntype HeadBucketAPIClient interface {\n\tHeadBucket(context.Context, *HeadBucketInput, ...func(*Options)) (*HeadBucketOutput, error)\n}\n\nvar _ HeadBucketAPIClient = (*Client)(nil)\n\nfunc newServiceMetadataMiddleware_opHeadBucket(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"HeadBucket\",\n\t}\n}\n\n// getHeadBucketBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getHeadBucketBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*HeadBucketInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addHeadBucketUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getHeadBucketBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n\n// PresignHeadBucket is used to generate a presigned HTTP Request which contains\n// presigned URL, signed headers and HTTP method used.\nfunc (c *PresignClient) PresignHeadBucket(ctx context.Context, params *HeadBucketInput, optFns ...func(*PresignOptions)) (*v4.PresignedHTTPRequest, error) {\n\tif params == nil {\n\t\tparams = &HeadBucketInput{}\n\t}\n\toptions := c.options.copy()\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\tclientOptFns := append(options.ClientOptions, withNopHTTPClientAPIOption)\n\n\tresult, _, err := c.client.invokeOperation(ctx, \"HeadBucket\", params, clientOptFns,\n\t\tc.client.addOperationHeadBucketMiddlewares,\n\t\tpresignConverter(options).convertToPresignMiddleware,\n\t\taddHeadBucketPayloadAsUnsigned,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*v4.PresignedHTTPRequest)\n\treturn out, nil\n}\n\nfunc addHeadBucketPayloadAsUnsigned(stack *middleware.Stack, options Options) error {\n\tv4.RemoveContentSHA256HeaderMiddleware(stack)\n\tv4.RemoveComputePayloadSHA256Middleware(stack)\n\treturn v4.AddUnsignedPayloadMiddleware(stack)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_HeadObject.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithytime \"github.com/aws/smithy-go/time\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\tsmithywaiter \"github.com/aws/smithy-go/waiter\"\n\t\"time\"\n)\n\n// The HEAD operation retrieves metadata from an object without returning the\n// object itself. This operation is useful if you're interested only in an object's\n// metadata.\n//\n// A HEAD request has the same options as a GET operation on an object. The\n// response is identical to the GET response except that there is no response\n// body. Because of this, if the HEAD request generates an error, it returns a\n// generic code, such as 400 Bad Request , 403 Forbidden , 404 Not Found , 405\n// Method Not Allowed , 412 Precondition Failed , or 304 Not Modified . It's not\n// possible to retrieve the exact exception of these error codes.\n//\n// Request headers are limited to 8 KB in size. For more information, see [Common Request Headers].\n//\n// Permissions\n//\n//   - General purpose bucket permissions - To use HEAD , you must have the\n//     s3:GetObject permission. You need the relevant read object (or version)\n//     permission for this operation. For more information, see [Actions, resources, and condition keys for Amazon S3]in the Amazon S3\n//     User Guide. For more information about the permissions to S3 API operations by\n//     S3 resource types, see Required permissions for Amazon S3 API operationsin the Amazon S3 User Guide.\n//\n// If the object you request doesn't exist, the error that Amazon S3 returns\n//\n//\tdepends on whether you also have the s3:ListBucket permission.\n//\n//\t- If you have the s3:ListBucket permission on the bucket, Amazon S3 returns an\n//\tHTTP status code 404 Not Found error.\n//\n//\t- If you don’t have the s3:ListBucket permission, Amazon S3 returns an HTTP\n//\tstatus code 403 Forbidden error.\n//\n//\t- Directory bucket permissions - To grant access to this API operation on a\n//\tdirectory bucket, we recommend that you use the [CreateSession]CreateSession API operation\n//\tfor session-based authorization. Specifically, you grant the\n//\ts3express:CreateSession permission to the directory bucket in a bucket policy\n//\tor an IAM identity-based policy. Then, you make the CreateSession API call on\n//\tthe bucket to obtain a session token. With the session token in your request\n//\theader, you can make API requests to this operation. After the session token\n//\texpires, you make another CreateSession API call to generate a new session\n//\ttoken for use. Amazon Web Services CLI or SDKs create session and refresh the\n//\tsession token automatically to avoid service interruptions when a session\n//\texpires. For more information about authorization, see [CreateSession]CreateSession .\n//\n// If you enable x-amz-checksum-mode in the request and the object is encrypted\n//\n//\twith Amazon Web Services Key Management Service (Amazon Web Services KMS), you\n//\tmust also have the kms:GenerateDataKey and kms:Decrypt permissions in IAM\n//\tidentity-based policies and KMS key policies for the KMS key to retrieve the\n//\tchecksum of the object.\n//\n// Encryption Encryption request headers, like x-amz-server-side-encryption ,\n// should not be sent for HEAD requests if your object uses server-side encryption\n// with Key Management Service (KMS) keys (SSE-KMS), dual-layer server-side\n// encryption with Amazon Web Services KMS keys (DSSE-KMS), or server-side\n// encryption with Amazon S3 managed encryption keys (SSE-S3). The\n// x-amz-server-side-encryption header is used when you PUT an object to S3 and\n// want to specify the encryption method. If you include this header in a HEAD\n// request for an object that uses these types of keys, you’ll get an HTTP 400 Bad\n// Request error. It's because the encryption method can't be changed when you\n// retrieve the object.\n//\n// If you encrypt an object by using server-side encryption with customer-provided\n// encryption keys (SSE-C) when you store the object in Amazon S3, then when you\n// retrieve the metadata from the object, you must use the following headers to\n// provide the encryption key for the server to be able to retrieve the object's\n// metadata. The headers are:\n//\n//   - x-amz-server-side-encryption-customer-algorithm\n//\n//   - x-amz-server-side-encryption-customer-key\n//\n//   - x-amz-server-side-encryption-customer-key-MD5\n//\n// For more information about SSE-C, see [Server-Side Encryption (Using Customer-Provided Encryption Keys)] in the Amazon S3 User Guide.\n//\n// Directory bucket - For directory buckets, there are only two supported options\n// for server-side encryption: SSE-S3 and SSE-KMS. SSE-C isn't supported. For more\n// information, see [Protecting data with server-side encryption]in the Amazon S3 User Guide.\n//\n// Versioning\n//\n//   - If the current version of the object is a delete marker, Amazon S3 behaves\n//     as if the object was deleted and includes x-amz-delete-marker: true in the\n//     response.\n//\n//   - If the specified version is a delete marker, the response returns a 405\n//     Method Not Allowed error and the Last-Modified: timestamp response header.\n//\n//   - Directory buckets - Delete marker is not supported for directory buckets.\n//\n//   - Directory buckets - S3 Versioning isn't enabled and supported for directory\n//     buckets. For this API operation, only the null value of the version ID is\n//     supported by directory buckets. You can only specify null to the versionId\n//     query parameter in the request.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// Bucket-name.s3express-zone-id.region-code.amazonaws.com .\n//\n// For directory buckets, you must make requests for this API operation to the\n// Zonal endpoint. These endpoints support virtual-hosted-style requests in the\n// format\n// https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name\n// . Path-style requests are not supported. For more information about endpoints\n// in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information\n// about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// The following actions are related to HeadObject :\n//\n// [GetObject]\n//\n// [GetObjectAttributes]\n//\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [Server-Side Encryption (Using Customer-Provided Encryption Keys)]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\n// [GetObjectAttributes]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html\n// [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\n// [Actions, resources, and condition keys for Amazon S3]: https://docs.aws.amazon.com/AmazonS3/latest/dev/list_amazons3.html\n// [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\n// [Common Request Headers]: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTCommonRequestHeaders.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n//\n// [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\nfunc (c *Client) HeadObject(ctx context.Context, params *HeadObjectInput, optFns ...func(*Options)) (*HeadObjectOutput, error) {\n\tif params == nil {\n\t\tparams = &HeadObjectInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"HeadObject\", params, optFns, c.addOperationHeadObjectMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*HeadObjectOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype HeadObjectInput struct {\n\n\t// The name of the bucket that contains the object.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use virtual-hosted-style requests in the format\n\t// Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests\n\t// are not supported. Directory bucket names must be unique in the chosen Zone\n\t// (Availability Zone or Local Zone). Bucket names must follow the format\n\t// bucket-base-name--zone-id--x-s3 (for example,\n\t// amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// Object Lambda access points are not supported by directory buckets.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The object key.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// To retrieve the checksum, this parameter must be enabled.\n\t//\n\t// General purpose buckets - If you enable checksum mode and the object is\n\t// uploaded with a [checksum]and encrypted with an Key Management Service (KMS) key, you\n\t// must have permission to use the kms:Decrypt action to retrieve the checksum.\n\t//\n\t// Directory buckets - If you enable ChecksumMode and the object is encrypted with\n\t// Amazon Web Services Key Management Service (Amazon Web Services KMS), you must\n\t// also have the kms:GenerateDataKey and kms:Decrypt permissions in IAM\n\t// identity-based policies and KMS key policies for the KMS key to retrieve the\n\t// checksum of the object.\n\t//\n\t// [checksum]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_Checksum.html\n\tChecksumMode types.ChecksumMode\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Return the object only if its entity tag (ETag) is the same as the one\n\t// specified; otherwise, return a 412 (precondition failed) error.\n\t//\n\t// If both of the If-Match and If-Unmodified-Since headers are present in the\n\t// request as follows:\n\t//\n\t//   - If-Match condition evaluates to true , and;\n\t//\n\t//   - If-Unmodified-Since condition evaluates to false ;\n\t//\n\t// Then Amazon S3 returns 200 OK and the data requested.\n\t//\n\t// For more information about conditional requests, see [RFC 7232].\n\t//\n\t// [RFC 7232]: https://tools.ietf.org/html/rfc7232\n\tIfMatch *string\n\n\t// Return the object only if it has been modified since the specified time;\n\t// otherwise, return a 304 (not modified) error.\n\t//\n\t// If both of the If-None-Match and If-Modified-Since headers are present in the\n\t// request as follows:\n\t//\n\t//   - If-None-Match condition evaluates to false , and;\n\t//\n\t//   - If-Modified-Since condition evaluates to true ;\n\t//\n\t// Then Amazon S3 returns the 304 Not Modified response code.\n\t//\n\t// For more information about conditional requests, see [RFC 7232].\n\t//\n\t// [RFC 7232]: https://tools.ietf.org/html/rfc7232\n\tIfModifiedSince *time.Time\n\n\t// Return the object only if its entity tag (ETag) is different from the one\n\t// specified; otherwise, return a 304 (not modified) error.\n\t//\n\t// If both of the If-None-Match and If-Modified-Since headers are present in the\n\t// request as follows:\n\t//\n\t//   - If-None-Match condition evaluates to false , and;\n\t//\n\t//   - If-Modified-Since condition evaluates to true ;\n\t//\n\t// Then Amazon S3 returns the 304 Not Modified response code.\n\t//\n\t// For more information about conditional requests, see [RFC 7232].\n\t//\n\t// [RFC 7232]: https://tools.ietf.org/html/rfc7232\n\tIfNoneMatch *string\n\n\t// Return the object only if it has not been modified since the specified time;\n\t// otherwise, return a 412 (precondition failed) error.\n\t//\n\t// If both of the If-Match and If-Unmodified-Since headers are present in the\n\t// request as follows:\n\t//\n\t//   - If-Match condition evaluates to true , and;\n\t//\n\t//   - If-Unmodified-Since condition evaluates to false ;\n\t//\n\t// Then Amazon S3 returns 200 OK and the data requested.\n\t//\n\t// For more information about conditional requests, see [RFC 7232].\n\t//\n\t// [RFC 7232]: https://tools.ietf.org/html/rfc7232\n\tIfUnmodifiedSince *time.Time\n\n\t// Part number of the object being read. This is a positive integer between 1 and\n\t// 10,000. Effectively performs a 'ranged' HEAD request for the part specified.\n\t// Useful querying about the size of the part and the number of parts in this\n\t// object.\n\tPartNumber *int32\n\n\t// HeadObject returns only the metadata for an object. If the Range is\n\t// satisfiable, only the ContentLength is affected in the response. If the Range\n\t// is not satisfiable, S3 returns a 416 - Requested Range Not Satisfiable error.\n\tRange *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// Sets the Cache-Control header of the response.\n\tResponseCacheControl *string\n\n\t// Sets the Content-Disposition header of the response.\n\tResponseContentDisposition *string\n\n\t// Sets the Content-Encoding header of the response.\n\tResponseContentEncoding *string\n\n\t// Sets the Content-Language header of the response.\n\tResponseContentLanguage *string\n\n\t// Sets the Content-Type header of the response.\n\tResponseContentType *string\n\n\t// Sets the Expires header of the response.\n\tResponseExpires *time.Time\n\n\t// Specifies the algorithm to use when encrypting the object (for example, AES256).\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerAlgorithm *string\n\n\t// Specifies the customer-provided encryption key for Amazon S3 to use in\n\t// encrypting data. This value is used to store the object and then it is\n\t// discarded; Amazon S3 does not store the encryption key. The key must be\n\t// appropriate for use with the algorithm specified in the\n\t// x-amz-server-side-encryption-customer-algorithm header.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerKey *string\n\n\t// Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321.\n\t// Amazon S3 uses this header for a message integrity check to ensure that the\n\t// encryption key was transmitted without error.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerKeyMD5 *string\n\n\t// Version ID used to reference a specific version of the object.\n\t//\n\t// For directory buckets in this API operation, only the null value of the version\n\t// ID is supported.\n\tVersionId *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *HeadObjectInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.Key = in.Key\n\n}\n\ntype HeadObjectOutput struct {\n\n\t// Indicates that a range of bytes was specified.\n\tAcceptRanges *string\n\n\t// The archive state of the head object.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tArchiveStatus types.ArchiveStatus\n\n\t// Indicates whether the object uses an S3 Bucket Key for server-side encryption\n\t// with Key Management Service (KMS) keys (SSE-KMS).\n\tBucketKeyEnabled *bool\n\n\t// Specifies caching behavior along the request/reply chain.\n\tCacheControl *string\n\n\t// The Base64 encoded, 32-bit CRC32 checksum of the object. This checksum is only\n\t// be present if the checksum was uploaded with the object. When you use an API\n\t// operation on an object that was uploaded using multipart uploads, this value may\n\t// not be a direct checksum value of the full object. Instead, it's a calculation\n\t// based on the checksum values of each individual part. For more information about\n\t// how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\n\tChecksumCRC32 *string\n\n\t// The Base64 encoded, 32-bit CRC32C checksum of the object. This checksum is only\n\t// present if the checksum was uploaded with the object. When you use an API\n\t// operation on an object that was uploaded using multipart uploads, this value may\n\t// not be a direct checksum value of the full object. Instead, it's a calculation\n\t// based on the checksum values of each individual part. For more information about\n\t// how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\n\tChecksumCRC32C *string\n\n\t// The Base64 encoded, 64-bit CRC64NVME checksum of the object. For more\n\t// information, see [Checking object integrity in the Amazon S3 User Guide].\n\t//\n\t// [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumCRC64NVME *string\n\n\t// The Base64 encoded, 160-bit SHA1 digest of the object. This will only be\n\t// present if the object was uploaded with the object. When you use the API\n\t// operation on an object that was uploaded using multipart uploads, this value may\n\t// not be a direct checksum value of the full object. Instead, it's a calculation\n\t// based on the checksum values of each individual part. For more information about\n\t// how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\n\tChecksumSHA1 *string\n\n\t// The Base64 encoded, 256-bit SHA256 digest of the object. This will only be\n\t// present if the object was uploaded with the object. When you use an API\n\t// operation on an object that was uploaded using multipart uploads, this value may\n\t// not be a direct checksum value of the full object. Instead, it's a calculation\n\t// based on the checksum values of each individual part. For more information about\n\t// how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\n\tChecksumSHA256 *string\n\n\t// The checksum type, which determines how part-level checksums are combined to\n\t// create an object-level checksum for multipart objects. You can use this header\n\t// response to verify that the checksum type that is received is the same checksum\n\t// type that was specified in CreateMultipartUpload request. For more information,\n\t// see [Checking object integrity in the Amazon S3 User Guide].\n\t//\n\t// [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumType types.ChecksumType\n\n\t// Specifies presentational information for the object.\n\tContentDisposition *string\n\n\t// Indicates what content encodings have been applied to the object and thus what\n\t// decoding mechanisms must be applied to obtain the media-type referenced by the\n\t// Content-Type header field.\n\tContentEncoding *string\n\n\t// The language the content is in.\n\tContentLanguage *string\n\n\t// Size of the body in bytes.\n\tContentLength *int64\n\n\t// The portion of the object returned in the response for a GET request.\n\tContentRange *string\n\n\t// A standard MIME type describing the format of the object data.\n\tContentType *string\n\n\t// Specifies whether the object retrieved was (true) or was not (false) a Delete\n\t// Marker. If false, this response header does not appear in the response.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tDeleteMarker *bool\n\n\t// An entity tag (ETag) is an opaque identifier assigned by a web server to a\n\t// specific version of a resource found at a URL.\n\tETag *string\n\n\t// If the object expiration is configured (see [PutBucketLifecycleConfiguration]PutBucketLifecycleConfiguration ),\n\t// the response includes this header. It includes the expiry-date and rule-id\n\t// key-value pairs providing object expiration information. The value of the\n\t// rule-id is URL-encoded.\n\t//\n\t// Object expiration information is not returned in directory buckets and this\n\t// header returns the value \" NotImplemented \" in all responses for directory\n\t// buckets.\n\t//\n\t// [PutBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html\n\tExpiration *string\n\n\t// The date and time at which the object is no longer cacheable.\n\t//\n\t// Deprecated: This field is handled inconsistently across AWS SDKs. Prefer using\n\t// the ExpiresString field which contains the unparsed value from the service\n\t// response.\n\tExpires *time.Time\n\n\t// The unparsed value of the Expires field from the service response. Prefer use\n\t// of this value over the normal Expires response field where possible.\n\tExpiresString *string\n\n\t// Date and time when the object was last modified.\n\tLastModified *time.Time\n\n\t// A map of metadata to store with the object in S3.\n\t//\n\t// Map keys will be normalized to lower-case.\n\tMetadata map[string]string\n\n\t// This is set to the number of metadata entries not returned in x-amz-meta\n\t// headers. This can happen if you create metadata using an API like SOAP that\n\t// supports more flexible metadata than the REST API. For example, using SOAP, you\n\t// can create metadata whose values are not legal HTTP headers.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tMissingMeta *int32\n\n\t// Specifies whether a legal hold is in effect for this object. This header is\n\t// only returned if the requester has the s3:GetObjectLegalHold permission. This\n\t// header is not returned if the specified version of this object has never had a\n\t// legal hold applied. For more information about S3 Object Lock, see [Object Lock].\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Object Lock]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html\n\tObjectLockLegalHoldStatus types.ObjectLockLegalHoldStatus\n\n\t// The Object Lock mode, if any, that's in effect for this object. This header is\n\t// only returned if the requester has the s3:GetObjectRetention permission. For\n\t// more information about S3 Object Lock, see [Object Lock].\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Object Lock]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html\n\tObjectLockMode types.ObjectLockMode\n\n\t// The date and time when the Object Lock retention period expires. This header is\n\t// only returned if the requester has the s3:GetObjectRetention permission.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tObjectLockRetainUntilDate *time.Time\n\n\t// The count of parts this object has. This value is only returned if you specify\n\t// partNumber in your request and the object was uploaded as a multipart upload.\n\tPartsCount *int32\n\n\t// Amazon S3 can return this header if your request involves a bucket that is\n\t// either a source or a destination in a replication rule.\n\t//\n\t// In replication, you have a source bucket on which you configure replication and\n\t// destination bucket or buckets where Amazon S3 stores object replicas. When you\n\t// request an object ( GetObject ) or object metadata ( HeadObject ) from these\n\t// buckets, Amazon S3 will return the x-amz-replication-status header in the\n\t// response as follows:\n\t//\n\t//   - If requesting an object from the source bucket, Amazon S3 will return the\n\t//   x-amz-replication-status header if the object in your request is eligible for\n\t//   replication.\n\t//\n\t// For example, suppose that in your replication configuration, you specify object\n\t//   prefix TaxDocs requesting Amazon S3 to replicate objects with key prefix\n\t//   TaxDocs . Any objects you upload with this key name prefix, for example\n\t//   TaxDocs/document1.pdf , are eligible for replication. For any object request\n\t//   with this key name prefix, Amazon S3 will return the x-amz-replication-status\n\t//   header with value PENDING, COMPLETED or FAILED indicating object replication\n\t//   status.\n\t//\n\t//   - If requesting an object from a destination bucket, Amazon S3 will return\n\t//   the x-amz-replication-status header with value REPLICA if the object in your\n\t//   request is a replica that Amazon S3 created and there is no replica modification\n\t//   replication in progress.\n\t//\n\t//   - When replicating objects to multiple destination buckets, the\n\t//   x-amz-replication-status header acts differently. The header of the source\n\t//   object will only return a value of COMPLETED when replication is successful to\n\t//   all destinations. The header will remain at value PENDING until replication has\n\t//   completed for all destinations. If one or more destinations fails replication\n\t//   the header will return FAILED.\n\t//\n\t// For more information, see [Replication].\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Replication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html\n\tReplicationStatus types.ReplicationStatus\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// If the object is an archived object (an object whose storage class is GLACIER),\n\t// the response includes this header if either the archive restoration is in\n\t// progress (see [RestoreObject]or an archive copy is already restored.\n\t//\n\t// If an archive copy is already restored, the header value indicates when Amazon\n\t// S3 is scheduled to delete the object copy. For example:\n\t//\n\t//     x-amz-restore: ongoing-request=\"false\", expiry-date=\"Fri, 21 Dec 2012 00:00:00\n\t//     GMT\"\n\t//\n\t// If the object restoration is in progress, the header returns the value\n\t// ongoing-request=\"true\" .\n\t//\n\t// For more information about archiving objects, see [Transitioning Objects: General Considerations].\n\t//\n\t// This functionality is not supported for directory buckets. Directory buckets\n\t// only support EXPRESS_ONEZONE (the S3 Express One Zone storage class) in\n\t// Availability Zones and ONEZONE_IA (the S3 One Zone-Infrequent Access storage\n\t// class) in Dedicated Local Zones.\n\t//\n\t// [Transitioning Objects: General Considerations]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html#lifecycle-transition-general-considerations\n\t// [RestoreObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_RestoreObject.html\n\tRestore *string\n\n\t// If server-side encryption with a customer-provided encryption key was\n\t// requested, the response will include this header to confirm the encryption\n\t// algorithm that's used.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerAlgorithm *string\n\n\t// If server-side encryption with a customer-provided encryption key was\n\t// requested, the response will include this header to provide the round-trip\n\t// message integrity verification of the customer-provided encryption key.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerKeyMD5 *string\n\n\t// If present, indicates the ID of the KMS key that was used for object encryption.\n\tSSEKMSKeyId *string\n\n\t// The server-side encryption algorithm used when you store this object in Amazon\n\t// S3 (for example, AES256 , aws:kms , aws:kms:dsse ).\n\tServerSideEncryption types.ServerSideEncryption\n\n\t// Provides storage class information of the object. Amazon S3 returns this header\n\t// for all objects except for S3 Standard storage class objects.\n\t//\n\t// For more information, see [Storage Classes].\n\t//\n\t// Directory buckets - Directory buckets only support EXPRESS_ONEZONE (the S3\n\t// Express One Zone storage class) in Availability Zones and ONEZONE_IA (the S3\n\t// One Zone-Infrequent Access storage class) in Dedicated Local Zones.\n\t//\n\t// [Storage Classes]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html\n\tStorageClass types.StorageClass\n\n\t// Version ID of the object.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tVersionId *string\n\n\t// If the bucket is configured as a website, redirects requests for this object to\n\t// another object in the same bucket or to an external URL. Amazon S3 stores the\n\t// value of this header in the object metadata.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tWebsiteRedirectLocation *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationHeadObjectMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpHeadObject{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpHeadObject{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"HeadObject\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpHeadObjectValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opHeadObject(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addHeadObjectUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// ObjectExistsWaiterOptions are waiter options for ObjectExistsWaiter\ntype ObjectExistsWaiterOptions struct {\n\n\t// Set of options to modify how an operation is invoked. These apply to all\n\t// operations invoked for this client. Use functional options on operation call to\n\t// modify this list for per operation behavior.\n\t//\n\t// Passing options here is functionally equivalent to passing values to this\n\t// config's ClientOptions field that extend the inner client's APIOptions directly.\n\tAPIOptions []func(*middleware.Stack) error\n\n\t// Functional options to be passed to all operations invoked by this client.\n\t//\n\t// Function values that modify the inner APIOptions are applied after the waiter\n\t// config's own APIOptions modifiers.\n\tClientOptions []func(*Options)\n\n\t// MinDelay is the minimum amount of time to delay between retries. If unset,\n\t// ObjectExistsWaiter will use default minimum delay of 5 seconds. Note that\n\t// MinDelay must resolve to a value lesser than or equal to the MaxDelay.\n\tMinDelay time.Duration\n\n\t// MaxDelay is the maximum amount of time to delay between retries. If unset or\n\t// set to zero, ObjectExistsWaiter will use default max delay of 120 seconds. Note\n\t// that MaxDelay must resolve to value greater than or equal to the MinDelay.\n\tMaxDelay time.Duration\n\n\t// LogWaitAttempts is used to enable logging for waiter retry attempts\n\tLogWaitAttempts bool\n\n\t// Retryable is function that can be used to override the service defined\n\t// waiter-behavior based on operation output, or returned error. This function is\n\t// used by the waiter to decide if a state is retryable or a terminal state.\n\t//\n\t// By default service-modeled logic will populate this option. This option can\n\t// thus be used to define a custom waiter state with fall-back to service-modeled\n\t// waiter state mutators.The function returns an error in case of a failure state.\n\t// In case of retry state, this function returns a bool value of true and nil\n\t// error, while in case of success it returns a bool value of false and nil error.\n\tRetryable func(context.Context, *HeadObjectInput, *HeadObjectOutput, error) (bool, error)\n}\n\n// ObjectExistsWaiter defines the waiters for ObjectExists\ntype ObjectExistsWaiter struct {\n\tclient HeadObjectAPIClient\n\n\toptions ObjectExistsWaiterOptions\n}\n\n// NewObjectExistsWaiter constructs a ObjectExistsWaiter.\nfunc NewObjectExistsWaiter(client HeadObjectAPIClient, optFns ...func(*ObjectExistsWaiterOptions)) *ObjectExistsWaiter {\n\toptions := ObjectExistsWaiterOptions{}\n\toptions.MinDelay = 5 * time.Second\n\toptions.MaxDelay = 120 * time.Second\n\toptions.Retryable = objectExistsStateRetryable\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\treturn &ObjectExistsWaiter{\n\t\tclient:  client,\n\t\toptions: options,\n\t}\n}\n\n// Wait calls the waiter function for ObjectExists waiter. The maxWaitDur is the\n// maximum wait duration the waiter will wait. The maxWaitDur is required and must\n// be greater than zero.\nfunc (w *ObjectExistsWaiter) Wait(ctx context.Context, params *HeadObjectInput, maxWaitDur time.Duration, optFns ...func(*ObjectExistsWaiterOptions)) error {\n\t_, err := w.WaitForOutput(ctx, params, maxWaitDur, optFns...)\n\treturn err\n}\n\n// WaitForOutput calls the waiter function for ObjectExists waiter and returns the\n// output of the successful operation. The maxWaitDur is the maximum wait duration\n// the waiter will wait. The maxWaitDur is required and must be greater than zero.\nfunc (w *ObjectExistsWaiter) WaitForOutput(ctx context.Context, params *HeadObjectInput, maxWaitDur time.Duration, optFns ...func(*ObjectExistsWaiterOptions)) (*HeadObjectOutput, error) {\n\tif maxWaitDur <= 0 {\n\t\treturn nil, fmt.Errorf(\"maximum wait time for waiter must be greater than zero\")\n\t}\n\n\toptions := w.options\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tif options.MaxDelay <= 0 {\n\t\toptions.MaxDelay = 120 * time.Second\n\t}\n\n\tif options.MinDelay > options.MaxDelay {\n\t\treturn nil, fmt.Errorf(\"minimum waiter delay %v must be lesser than or equal to maximum waiter delay of %v.\", options.MinDelay, options.MaxDelay)\n\t}\n\n\tctx, cancelFn := context.WithTimeout(ctx, maxWaitDur)\n\tdefer cancelFn()\n\n\tlogger := smithywaiter.Logger{}\n\tremainingTime := maxWaitDur\n\n\tvar attempt int64\n\tfor {\n\n\t\tattempt++\n\t\tapiOptions := options.APIOptions\n\t\tstart := time.Now()\n\n\t\tif options.LogWaitAttempts {\n\t\t\tlogger.Attempt = attempt\n\t\t\tapiOptions = append([]func(*middleware.Stack) error{}, options.APIOptions...)\n\t\t\tapiOptions = append(apiOptions, logger.AddLogger)\n\t\t}\n\n\t\tout, err := w.client.HeadObject(ctx, params, func(o *Options) {\n\t\t\tbaseOpts := []func(*Options){\n\t\t\t\taddIsWaiterUserAgent,\n\t\t\t}\n\t\t\to.APIOptions = append(o.APIOptions, apiOptions...)\n\t\t\tfor _, opt := range baseOpts {\n\t\t\t\topt(o)\n\t\t\t}\n\t\t\tfor _, opt := range options.ClientOptions {\n\t\t\t\topt(o)\n\t\t\t}\n\t\t})\n\n\t\tretryable, err := options.Retryable(ctx, params, out, err)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif !retryable {\n\t\t\treturn out, nil\n\t\t}\n\n\t\tremainingTime -= time.Since(start)\n\t\tif remainingTime < options.MinDelay || remainingTime <= 0 {\n\t\t\tbreak\n\t\t}\n\n\t\t// compute exponential backoff between waiter retries\n\t\tdelay, err := smithywaiter.ComputeDelay(\n\t\t\tattempt, options.MinDelay, options.MaxDelay, remainingTime,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error computing waiter delay, %w\", err)\n\t\t}\n\n\t\tremainingTime -= delay\n\t\t// sleep for the delay amount before invoking a request\n\t\tif err := smithytime.SleepWithContext(ctx, delay); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"request cancelled while waiting, %w\", err)\n\t\t}\n\t}\n\treturn nil, fmt.Errorf(\"exceeded max wait time for ObjectExists waiter\")\n}\n\nfunc objectExistsStateRetryable(ctx context.Context, input *HeadObjectInput, output *HeadObjectOutput, err error) (bool, error) {\n\n\tif err == nil {\n\t\treturn false, nil\n\t}\n\n\tif err != nil {\n\t\tvar errorType *types.NotFound\n\t\tif errors.As(err, &errorType) {\n\t\t\treturn true, nil\n\t\t}\n\t}\n\n\tif err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n\n// ObjectNotExistsWaiterOptions are waiter options for ObjectNotExistsWaiter\ntype ObjectNotExistsWaiterOptions struct {\n\n\t// Set of options to modify how an operation is invoked. These apply to all\n\t// operations invoked for this client. Use functional options on operation call to\n\t// modify this list for per operation behavior.\n\t//\n\t// Passing options here is functionally equivalent to passing values to this\n\t// config's ClientOptions field that extend the inner client's APIOptions directly.\n\tAPIOptions []func(*middleware.Stack) error\n\n\t// Functional options to be passed to all operations invoked by this client.\n\t//\n\t// Function values that modify the inner APIOptions are applied after the waiter\n\t// config's own APIOptions modifiers.\n\tClientOptions []func(*Options)\n\n\t// MinDelay is the minimum amount of time to delay between retries. If unset,\n\t// ObjectNotExistsWaiter will use default minimum delay of 5 seconds. Note that\n\t// MinDelay must resolve to a value lesser than or equal to the MaxDelay.\n\tMinDelay time.Duration\n\n\t// MaxDelay is the maximum amount of time to delay between retries. If unset or\n\t// set to zero, ObjectNotExistsWaiter will use default max delay of 120 seconds.\n\t// Note that MaxDelay must resolve to value greater than or equal to the MinDelay.\n\tMaxDelay time.Duration\n\n\t// LogWaitAttempts is used to enable logging for waiter retry attempts\n\tLogWaitAttempts bool\n\n\t// Retryable is function that can be used to override the service defined\n\t// waiter-behavior based on operation output, or returned error. This function is\n\t// used by the waiter to decide if a state is retryable or a terminal state.\n\t//\n\t// By default service-modeled logic will populate this option. This option can\n\t// thus be used to define a custom waiter state with fall-back to service-modeled\n\t// waiter state mutators.The function returns an error in case of a failure state.\n\t// In case of retry state, this function returns a bool value of true and nil\n\t// error, while in case of success it returns a bool value of false and nil error.\n\tRetryable func(context.Context, *HeadObjectInput, *HeadObjectOutput, error) (bool, error)\n}\n\n// ObjectNotExistsWaiter defines the waiters for ObjectNotExists\ntype ObjectNotExistsWaiter struct {\n\tclient HeadObjectAPIClient\n\n\toptions ObjectNotExistsWaiterOptions\n}\n\n// NewObjectNotExistsWaiter constructs a ObjectNotExistsWaiter.\nfunc NewObjectNotExistsWaiter(client HeadObjectAPIClient, optFns ...func(*ObjectNotExistsWaiterOptions)) *ObjectNotExistsWaiter {\n\toptions := ObjectNotExistsWaiterOptions{}\n\toptions.MinDelay = 5 * time.Second\n\toptions.MaxDelay = 120 * time.Second\n\toptions.Retryable = objectNotExistsStateRetryable\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\treturn &ObjectNotExistsWaiter{\n\t\tclient:  client,\n\t\toptions: options,\n\t}\n}\n\n// Wait calls the waiter function for ObjectNotExists waiter. The maxWaitDur is\n// the maximum wait duration the waiter will wait. The maxWaitDur is required and\n// must be greater than zero.\nfunc (w *ObjectNotExistsWaiter) Wait(ctx context.Context, params *HeadObjectInput, maxWaitDur time.Duration, optFns ...func(*ObjectNotExistsWaiterOptions)) error {\n\t_, err := w.WaitForOutput(ctx, params, maxWaitDur, optFns...)\n\treturn err\n}\n\n// WaitForOutput calls the waiter function for ObjectNotExists waiter and returns\n// the output of the successful operation. The maxWaitDur is the maximum wait\n// duration the waiter will wait. The maxWaitDur is required and must be greater\n// than zero.\nfunc (w *ObjectNotExistsWaiter) WaitForOutput(ctx context.Context, params *HeadObjectInput, maxWaitDur time.Duration, optFns ...func(*ObjectNotExistsWaiterOptions)) (*HeadObjectOutput, error) {\n\tif maxWaitDur <= 0 {\n\t\treturn nil, fmt.Errorf(\"maximum wait time for waiter must be greater than zero\")\n\t}\n\n\toptions := w.options\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\tif options.MaxDelay <= 0 {\n\t\toptions.MaxDelay = 120 * time.Second\n\t}\n\n\tif options.MinDelay > options.MaxDelay {\n\t\treturn nil, fmt.Errorf(\"minimum waiter delay %v must be lesser than or equal to maximum waiter delay of %v.\", options.MinDelay, options.MaxDelay)\n\t}\n\n\tctx, cancelFn := context.WithTimeout(ctx, maxWaitDur)\n\tdefer cancelFn()\n\n\tlogger := smithywaiter.Logger{}\n\tremainingTime := maxWaitDur\n\n\tvar attempt int64\n\tfor {\n\n\t\tattempt++\n\t\tapiOptions := options.APIOptions\n\t\tstart := time.Now()\n\n\t\tif options.LogWaitAttempts {\n\t\t\tlogger.Attempt = attempt\n\t\t\tapiOptions = append([]func(*middleware.Stack) error{}, options.APIOptions...)\n\t\t\tapiOptions = append(apiOptions, logger.AddLogger)\n\t\t}\n\n\t\tout, err := w.client.HeadObject(ctx, params, func(o *Options) {\n\t\t\tbaseOpts := []func(*Options){\n\t\t\t\taddIsWaiterUserAgent,\n\t\t\t}\n\t\t\to.APIOptions = append(o.APIOptions, apiOptions...)\n\t\t\tfor _, opt := range baseOpts {\n\t\t\t\topt(o)\n\t\t\t}\n\t\t\tfor _, opt := range options.ClientOptions {\n\t\t\t\topt(o)\n\t\t\t}\n\t\t})\n\n\t\tretryable, err := options.Retryable(ctx, params, out, err)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif !retryable {\n\t\t\treturn out, nil\n\t\t}\n\n\t\tremainingTime -= time.Since(start)\n\t\tif remainingTime < options.MinDelay || remainingTime <= 0 {\n\t\t\tbreak\n\t\t}\n\n\t\t// compute exponential backoff between waiter retries\n\t\tdelay, err := smithywaiter.ComputeDelay(\n\t\t\tattempt, options.MinDelay, options.MaxDelay, remainingTime,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error computing waiter delay, %w\", err)\n\t\t}\n\n\t\tremainingTime -= delay\n\t\t// sleep for the delay amount before invoking a request\n\t\tif err := smithytime.SleepWithContext(ctx, delay); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"request cancelled while waiting, %w\", err)\n\t\t}\n\t}\n\treturn nil, fmt.Errorf(\"exceeded max wait time for ObjectNotExists waiter\")\n}\n\nfunc objectNotExistsStateRetryable(ctx context.Context, input *HeadObjectInput, output *HeadObjectOutput, err error) (bool, error) {\n\n\tif err != nil {\n\t\tvar errorType *types.NotFound\n\t\tif errors.As(err, &errorType) {\n\t\t\treturn false, nil\n\t\t}\n\t}\n\n\tif err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n\nfunc (v *HeadObjectInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\n// HeadObjectAPIClient is a client that implements the HeadObject operation.\ntype HeadObjectAPIClient interface {\n\tHeadObject(context.Context, *HeadObjectInput, ...func(*Options)) (*HeadObjectOutput, error)\n}\n\nvar _ HeadObjectAPIClient = (*Client)(nil)\n\nfunc newServiceMetadataMiddleware_opHeadObject(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"HeadObject\",\n\t}\n}\n\n// getHeadObjectBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getHeadObjectBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*HeadObjectInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addHeadObjectUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getHeadObjectBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n\n// PresignHeadObject is used to generate a presigned HTTP Request which contains\n// presigned URL, signed headers and HTTP method used.\nfunc (c *PresignClient) PresignHeadObject(ctx context.Context, params *HeadObjectInput, optFns ...func(*PresignOptions)) (*v4.PresignedHTTPRequest, error) {\n\tif params == nil {\n\t\tparams = &HeadObjectInput{}\n\t}\n\toptions := c.options.copy()\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\tclientOptFns := append(options.ClientOptions, withNopHTTPClientAPIOption)\n\n\tresult, _, err := c.client.invokeOperation(ctx, \"HeadObject\", params, clientOptFns,\n\t\tc.client.addOperationHeadObjectMiddlewares,\n\t\tpresignConverter(options).convertToPresignMiddleware,\n\t\taddHeadObjectPayloadAsUnsigned,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*v4.PresignedHTTPRequest)\n\treturn out, nil\n}\n\nfunc addHeadObjectPayloadAsUnsigned(stack *middleware.Stack, options Options) error {\n\tv4.RemoveContentSHA256HeaderMiddleware(stack)\n\tv4.RemoveComputePayloadSHA256Middleware(stack)\n\treturn v4.AddUnsignedPayloadMiddleware(stack)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListBucketAnalyticsConfigurations.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Lists the analytics configurations for the bucket. You can have up to 1,000\n// analytics configurations per bucket.\n//\n// This action supports list pagination and does not return more than 100\n// configurations at a time. You should always check the IsTruncated element in\n// the response. If there are no more configurations to list, IsTruncated is set\n// to false. If there are more configurations to list, IsTruncated is set to true,\n// and there will be a value in NextContinuationToken . You use the\n// NextContinuationToken value to continue the pagination of the list by passing\n// the value in continuation-token in the request to GET the next page.\n//\n// To use this operation, you must have permissions to perform the\n// s3:GetAnalyticsConfiguration action. The bucket owner has this permission by\n// default. The bucket owner can grant this permission to others. For more\n// information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources].\n//\n// For information about Amazon S3 analytics feature, see [Amazon S3 Analytics – Storage Class Analysis].\n//\n// The following operations are related to ListBucketAnalyticsConfigurations :\n//\n// [GetBucketAnalyticsConfiguration]\n//\n// [DeleteBucketAnalyticsConfiguration]\n//\n// [PutBucketAnalyticsConfiguration]\n//\n// [Amazon S3 Analytics – Storage Class Analysis]: https://docs.aws.amazon.com/AmazonS3/latest/dev/analytics-storage-class.html\n// [DeleteBucketAnalyticsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketAnalyticsConfiguration.html\n// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [GetBucketAnalyticsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketAnalyticsConfiguration.html\n// [PutBucketAnalyticsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAnalyticsConfiguration.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\nfunc (c *Client) ListBucketAnalyticsConfigurations(ctx context.Context, params *ListBucketAnalyticsConfigurationsInput, optFns ...func(*Options)) (*ListBucketAnalyticsConfigurationsOutput, error) {\n\tif params == nil {\n\t\tparams = &ListBucketAnalyticsConfigurationsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"ListBucketAnalyticsConfigurations\", params, optFns, c.addOperationListBucketAnalyticsConfigurationsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*ListBucketAnalyticsConfigurationsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype ListBucketAnalyticsConfigurationsInput struct {\n\n\t// The name of the bucket from which analytics configurations are retrieved.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The ContinuationToken that represents a placeholder from where this request\n\t// should begin.\n\tContinuationToken *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *ListBucketAnalyticsConfigurationsInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype ListBucketAnalyticsConfigurationsOutput struct {\n\n\t// The list of analytics configurations for a bucket.\n\tAnalyticsConfigurationList []types.AnalyticsConfiguration\n\n\t// The marker that is used as a starting point for this analytics configuration\n\t// list response. This value is present if it was sent in the request.\n\tContinuationToken *string\n\n\t// Indicates whether the returned list of analytics configurations is complete. A\n\t// value of true indicates that the list is not complete and the\n\t// NextContinuationToken will be provided for a subsequent request.\n\tIsTruncated *bool\n\n\t// NextContinuationToken is sent when isTruncated is true, which indicates that\n\t// there are more analytics configurations to list. The next request must include\n\t// this NextContinuationToken . The token is obfuscated and is not a usable value.\n\tNextContinuationToken *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationListBucketAnalyticsConfigurationsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpListBucketAnalyticsConfigurations{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpListBucketAnalyticsConfigurations{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"ListBucketAnalyticsConfigurations\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpListBucketAnalyticsConfigurationsValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opListBucketAnalyticsConfigurations(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addListBucketAnalyticsConfigurationsUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *ListBucketAnalyticsConfigurationsInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opListBucketAnalyticsConfigurations(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"ListBucketAnalyticsConfigurations\",\n\t}\n}\n\n// getListBucketAnalyticsConfigurationsBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getListBucketAnalyticsConfigurationsBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*ListBucketAnalyticsConfigurationsInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addListBucketAnalyticsConfigurationsUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getListBucketAnalyticsConfigurationsBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListBucketIntelligentTieringConfigurations.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Lists the S3 Intelligent-Tiering configuration from the specified bucket.\n//\n// The S3 Intelligent-Tiering storage class is designed to optimize storage costs\n// by automatically moving data to the most cost-effective storage access tier,\n// without performance impact or operational overhead. S3 Intelligent-Tiering\n// delivers automatic cost savings in three low latency and high throughput access\n// tiers. To get the lowest storage cost on data that can be accessed in minutes to\n// hours, you can choose to activate additional archiving capabilities.\n//\n// The S3 Intelligent-Tiering storage class is the ideal storage class for data\n// with unknown, changing, or unpredictable access patterns, independent of object\n// size or retention period. If the size of an object is less than 128 KB, it is\n// not monitored and not eligible for auto-tiering. Smaller objects can be stored,\n// but they are always charged at the Frequent Access tier rates in the S3\n// Intelligent-Tiering storage class.\n//\n// For more information, see [Storage class for automatically optimizing frequently and infrequently accessed objects].\n//\n// Operations related to ListBucketIntelligentTieringConfigurations include:\n//\n// [DeleteBucketIntelligentTieringConfiguration]\n//\n// [PutBucketIntelligentTieringConfiguration]\n//\n// [GetBucketIntelligentTieringConfiguration]\n//\n// [GetBucketIntelligentTieringConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketIntelligentTieringConfiguration.html\n// [PutBucketIntelligentTieringConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketIntelligentTieringConfiguration.html\n// [Storage class for automatically optimizing frequently and infrequently accessed objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html#sc-dynamic-data-access\n// [DeleteBucketIntelligentTieringConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketIntelligentTieringConfiguration.html\nfunc (c *Client) ListBucketIntelligentTieringConfigurations(ctx context.Context, params *ListBucketIntelligentTieringConfigurationsInput, optFns ...func(*Options)) (*ListBucketIntelligentTieringConfigurationsOutput, error) {\n\tif params == nil {\n\t\tparams = &ListBucketIntelligentTieringConfigurationsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"ListBucketIntelligentTieringConfigurations\", params, optFns, c.addOperationListBucketIntelligentTieringConfigurationsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*ListBucketIntelligentTieringConfigurationsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype ListBucketIntelligentTieringConfigurationsInput struct {\n\n\t// The name of the Amazon S3 bucket whose configuration you want to modify or\n\t// retrieve.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The ContinuationToken that represents a placeholder from where this request\n\t// should begin.\n\tContinuationToken *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *ListBucketIntelligentTieringConfigurationsInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype ListBucketIntelligentTieringConfigurationsOutput struct {\n\n\t// The ContinuationToken that represents a placeholder from where this request\n\t// should begin.\n\tContinuationToken *string\n\n\t// The list of S3 Intelligent-Tiering configurations for a bucket.\n\tIntelligentTieringConfigurationList []types.IntelligentTieringConfiguration\n\n\t// Indicates whether the returned list of analytics configurations is complete. A\n\t// value of true indicates that the list is not complete and the\n\t// NextContinuationToken will be provided for a subsequent request.\n\tIsTruncated *bool\n\n\t// The marker used to continue this inventory configuration listing. Use the\n\t// NextContinuationToken from this response to continue the listing in a subsequent\n\t// request. The continuation token is an opaque value that Amazon S3 understands.\n\tNextContinuationToken *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationListBucketIntelligentTieringConfigurationsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpListBucketIntelligentTieringConfigurations{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpListBucketIntelligentTieringConfigurations{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"ListBucketIntelligentTieringConfigurations\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpListBucketIntelligentTieringConfigurationsValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opListBucketIntelligentTieringConfigurations(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addListBucketIntelligentTieringConfigurationsUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *ListBucketIntelligentTieringConfigurationsInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opListBucketIntelligentTieringConfigurations(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"ListBucketIntelligentTieringConfigurations\",\n\t}\n}\n\n// getListBucketIntelligentTieringConfigurationsBucketMember returns a pointer to\n// string denoting a provided bucket member valueand a boolean indicating if the\n// input has a modeled bucket name,\nfunc getListBucketIntelligentTieringConfigurationsBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*ListBucketIntelligentTieringConfigurationsInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addListBucketIntelligentTieringConfigurationsUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getListBucketIntelligentTieringConfigurationsBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListBucketInventoryConfigurations.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Returns a list of inventory configurations for the bucket. You can have up to\n// 1,000 analytics configurations per bucket.\n//\n// This action supports list pagination and does not return more than 100\n// configurations at a time. Always check the IsTruncated element in the response.\n// If there are no more configurations to list, IsTruncated is set to false. If\n// there are more configurations to list, IsTruncated is set to true, and there is\n// a value in NextContinuationToken . You use the NextContinuationToken value to\n// continue the pagination of the list by passing the value in continuation-token\n// in the request to GET the next page.\n//\n// To use this operation, you must have permissions to perform the\n// s3:GetInventoryConfiguration action. The bucket owner has this permission by\n// default. The bucket owner can grant this permission to others. For more\n// information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources].\n//\n// For information about the Amazon S3 inventory feature, see [Amazon S3 Inventory]\n//\n// The following operations are related to ListBucketInventoryConfigurations :\n//\n// [GetBucketInventoryConfiguration]\n//\n// [DeleteBucketInventoryConfiguration]\n//\n// [PutBucketInventoryConfiguration]\n//\n// [Amazon S3 Inventory]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-inventory.html\n// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [DeleteBucketInventoryConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketInventoryConfiguration.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\n// [PutBucketInventoryConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketInventoryConfiguration.html\n// [GetBucketInventoryConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketInventoryConfiguration.html\nfunc (c *Client) ListBucketInventoryConfigurations(ctx context.Context, params *ListBucketInventoryConfigurationsInput, optFns ...func(*Options)) (*ListBucketInventoryConfigurationsOutput, error) {\n\tif params == nil {\n\t\tparams = &ListBucketInventoryConfigurationsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"ListBucketInventoryConfigurations\", params, optFns, c.addOperationListBucketInventoryConfigurationsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*ListBucketInventoryConfigurationsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype ListBucketInventoryConfigurationsInput struct {\n\n\t// The name of the bucket containing the inventory configurations to retrieve.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The marker used to continue an inventory configuration listing that has been\n\t// truncated. Use the NextContinuationToken from a previously truncated list\n\t// response to continue the listing. The continuation token is an opaque value that\n\t// Amazon S3 understands.\n\tContinuationToken *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *ListBucketInventoryConfigurationsInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype ListBucketInventoryConfigurationsOutput struct {\n\n\t// If sent in the request, the marker that is used as a starting point for this\n\t// inventory configuration list response.\n\tContinuationToken *string\n\n\t// The list of inventory configurations for a bucket.\n\tInventoryConfigurationList []types.InventoryConfiguration\n\n\t// Tells whether the returned list of inventory configurations is complete. A\n\t// value of true indicates that the list is not complete and the\n\t// NextContinuationToken is provided for a subsequent request.\n\tIsTruncated *bool\n\n\t// The marker used to continue this inventory configuration listing. Use the\n\t// NextContinuationToken from this response to continue the listing in a subsequent\n\t// request. The continuation token is an opaque value that Amazon S3 understands.\n\tNextContinuationToken *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationListBucketInventoryConfigurationsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpListBucketInventoryConfigurations{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpListBucketInventoryConfigurations{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"ListBucketInventoryConfigurations\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpListBucketInventoryConfigurationsValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opListBucketInventoryConfigurations(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addListBucketInventoryConfigurationsUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *ListBucketInventoryConfigurationsInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opListBucketInventoryConfigurations(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"ListBucketInventoryConfigurations\",\n\t}\n}\n\n// getListBucketInventoryConfigurationsBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getListBucketInventoryConfigurationsBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*ListBucketInventoryConfigurationsInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addListBucketInventoryConfigurationsUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getListBucketInventoryConfigurationsBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListBucketMetricsConfigurations.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Lists the metrics configurations for the bucket. The metrics configurations are\n// only for the request metrics of the bucket and do not provide information on\n// daily storage metrics. You can have up to 1,000 configurations per bucket.\n//\n// This action supports list pagination and does not return more than 100\n// configurations at a time. Always check the IsTruncated element in the response.\n// If there are no more configurations to list, IsTruncated is set to false. If\n// there are more configurations to list, IsTruncated is set to true, and there is\n// a value in NextContinuationToken . You use the NextContinuationToken value to\n// continue the pagination of the list by passing the value in continuation-token\n// in the request to GET the next page.\n//\n// To use this operation, you must have permissions to perform the\n// s3:GetMetricsConfiguration action. The bucket owner has this permission by\n// default. The bucket owner can grant this permission to others. For more\n// information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources].\n//\n// For more information about metrics configurations and CloudWatch request\n// metrics, see [Monitoring Metrics with Amazon CloudWatch].\n//\n// The following operations are related to ListBucketMetricsConfigurations :\n//\n// [PutBucketMetricsConfiguration]\n//\n// [GetBucketMetricsConfiguration]\n//\n// [DeleteBucketMetricsConfiguration]\n//\n// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [Monitoring Metrics with Amazon CloudWatch]: https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html\n// [GetBucketMetricsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetricsConfiguration.html\n// [PutBucketMetricsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketMetricsConfiguration.html\n// [DeleteBucketMetricsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetricsConfiguration.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\nfunc (c *Client) ListBucketMetricsConfigurations(ctx context.Context, params *ListBucketMetricsConfigurationsInput, optFns ...func(*Options)) (*ListBucketMetricsConfigurationsOutput, error) {\n\tif params == nil {\n\t\tparams = &ListBucketMetricsConfigurationsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"ListBucketMetricsConfigurations\", params, optFns, c.addOperationListBucketMetricsConfigurationsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*ListBucketMetricsConfigurationsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype ListBucketMetricsConfigurationsInput struct {\n\n\t// The name of the bucket containing the metrics configurations to retrieve.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The marker that is used to continue a metrics configuration listing that has\n\t// been truncated. Use the NextContinuationToken from a previously truncated list\n\t// response to continue the listing. The continuation token is an opaque value that\n\t// Amazon S3 understands.\n\tContinuationToken *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *ListBucketMetricsConfigurationsInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\n}\n\ntype ListBucketMetricsConfigurationsOutput struct {\n\n\t// The marker that is used as a starting point for this metrics configuration list\n\t// response. This value is present if it was sent in the request.\n\tContinuationToken *string\n\n\t// Indicates whether the returned list of metrics configurations is complete. A\n\t// value of true indicates that the list is not complete and the\n\t// NextContinuationToken will be provided for a subsequent request.\n\tIsTruncated *bool\n\n\t// The list of metrics configurations for a bucket.\n\tMetricsConfigurationList []types.MetricsConfiguration\n\n\t// The marker used to continue a metrics configuration listing that has been\n\t// truncated. Use the NextContinuationToken from a previously truncated list\n\t// response to continue the listing. The continuation token is an opaque value that\n\t// Amazon S3 understands.\n\tNextContinuationToken *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationListBucketMetricsConfigurationsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpListBucketMetricsConfigurations{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpListBucketMetricsConfigurations{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"ListBucketMetricsConfigurations\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpListBucketMetricsConfigurationsValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opListBucketMetricsConfigurations(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addListBucketMetricsConfigurationsUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *ListBucketMetricsConfigurationsInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opListBucketMetricsConfigurations(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"ListBucketMetricsConfigurations\",\n\t}\n}\n\n// getListBucketMetricsConfigurationsBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getListBucketMetricsConfigurationsBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*ListBucketMetricsConfigurationsInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addListBucketMetricsConfigurationsUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getListBucketMetricsConfigurationsBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListBuckets.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Returns a list of all buckets owned by the authenticated sender of the request.\n// To grant IAM permission to use this operation, you must add the\n// s3:ListAllMyBuckets policy action.\n//\n// For information about Amazon S3 buckets, see [Creating, configuring, and working with Amazon S3 buckets].\n//\n// We strongly recommend using only paginated ListBuckets requests. Unpaginated\n// ListBuckets requests are only supported for Amazon Web Services accounts set to\n// the default general purpose bucket quota of 10,000. If you have an approved\n// general purpose bucket quota above 10,000, you must send paginated ListBuckets\n// requests to list your account’s buckets. All unpaginated ListBuckets requests\n// will be rejected for Amazon Web Services accounts with a general purpose bucket\n// quota greater than 10,000.\n//\n// [Creating, configuring, and working with Amazon S3 buckets]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-buckets-s3.html\nfunc (c *Client) ListBuckets(ctx context.Context, params *ListBucketsInput, optFns ...func(*Options)) (*ListBucketsOutput, error) {\n\tif params == nil {\n\t\tparams = &ListBucketsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"ListBuckets\", params, optFns, c.addOperationListBucketsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*ListBucketsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype ListBucketsInput struct {\n\n\t// Limits the response to buckets that are located in the specified Amazon Web\n\t// Services Region. The Amazon Web Services Region must be expressed according to\n\t// the Amazon Web Services Region code, such as us-west-2 for the US West (Oregon)\n\t// Region. For a list of the valid values for all of the Amazon Web Services\n\t// Regions, see [Regions and Endpoints].\n\t//\n\t// Requests made to a Regional endpoint that is different from the bucket-region\n\t// parameter are not supported. For example, if you want to limit the response to\n\t// your buckets in Region us-west-2 , the request must be made to an endpoint in\n\t// Region us-west-2 .\n\t//\n\t// [Regions and Endpoints]: https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\n\tBucketRegion *string\n\n\t// ContinuationToken indicates to Amazon S3 that the list is being continued on\n\t// this bucket with a token. ContinuationToken is obfuscated and is not a real\n\t// key. You can use this ContinuationToken for pagination of the list results.\n\t//\n\t// Length Constraints: Minimum length of 0. Maximum length of 1024.\n\t//\n\t// Required: No.\n\t//\n\t// If you specify the bucket-region , prefix , or continuation-token query\n\t// parameters without using max-buckets to set the maximum number of buckets\n\t// returned in the response, Amazon S3 applies a default page size of 10,000 and\n\t// provides a continuation token if there are more buckets.\n\tContinuationToken *string\n\n\t// Maximum number of buckets to be returned in response. When the number is more\n\t// than the count of buckets that are owned by an Amazon Web Services account,\n\t// return all the buckets in response.\n\tMaxBuckets *int32\n\n\t// Limits the response to bucket names that begin with the specified bucket name\n\t// prefix.\n\tPrefix *string\n\n\tnoSmithyDocumentSerde\n}\n\ntype ListBucketsOutput struct {\n\n\t// The list of buckets owned by the requester.\n\tBuckets []types.Bucket\n\n\t// ContinuationToken is included in the response when there are more buckets that\n\t// can be listed with pagination. The next ListBuckets request to Amazon S3 can be\n\t// continued with this ContinuationToken . ContinuationToken is obfuscated and is\n\t// not a real bucket.\n\tContinuationToken *string\n\n\t// The owner of the buckets listed.\n\tOwner *types.Owner\n\n\t// If Prefix was sent with the request, it is included in the response.\n\t//\n\t// All bucket names in the response begin with the specified bucket name prefix.\n\tPrefix *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationListBucketsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpListBuckets{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpListBuckets{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"ListBuckets\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opListBuckets(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addListBucketsUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// ListBucketsPaginatorOptions is the paginator options for ListBuckets\ntype ListBucketsPaginatorOptions struct {\n\t// Maximum number of buckets to be returned in response. When the number is more\n\t// than the count of buckets that are owned by an Amazon Web Services account,\n\t// return all the buckets in response.\n\tLimit int32\n\n\t// Set to true if pagination should stop if the service returns a pagination token\n\t// that matches the most recent token provided to the service.\n\tStopOnDuplicateToken bool\n}\n\n// ListBucketsPaginator is a paginator for ListBuckets\ntype ListBucketsPaginator struct {\n\toptions   ListBucketsPaginatorOptions\n\tclient    ListBucketsAPIClient\n\tparams    *ListBucketsInput\n\tnextToken *string\n\tfirstPage bool\n}\n\n// NewListBucketsPaginator returns a new ListBucketsPaginator\nfunc NewListBucketsPaginator(client ListBucketsAPIClient, params *ListBucketsInput, optFns ...func(*ListBucketsPaginatorOptions)) *ListBucketsPaginator {\n\tif params == nil {\n\t\tparams = &ListBucketsInput{}\n\t}\n\n\toptions := ListBucketsPaginatorOptions{}\n\tif params.MaxBuckets != nil {\n\t\toptions.Limit = *params.MaxBuckets\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &ListBucketsPaginator{\n\t\toptions:   options,\n\t\tclient:    client,\n\t\tparams:    params,\n\t\tfirstPage: true,\n\t\tnextToken: params.ContinuationToken,\n\t}\n}\n\n// HasMorePages returns a boolean indicating whether more pages are available\nfunc (p *ListBucketsPaginator) HasMorePages() bool {\n\treturn p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0)\n}\n\n// NextPage retrieves the next ListBuckets page.\nfunc (p *ListBucketsPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*ListBucketsOutput, error) {\n\tif !p.HasMorePages() {\n\t\treturn nil, fmt.Errorf(\"no more pages available\")\n\t}\n\n\tparams := *p.params\n\tparams.ContinuationToken = p.nextToken\n\n\tvar limit *int32\n\tif p.options.Limit > 0 {\n\t\tlimit = &p.options.Limit\n\t}\n\tparams.MaxBuckets = limit\n\n\toptFns = append([]func(*Options){\n\t\taddIsPaginatorUserAgent,\n\t}, optFns...)\n\tresult, err := p.client.ListBuckets(ctx, &params, optFns...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.firstPage = false\n\n\tprevToken := p.nextToken\n\tp.nextToken = result.ContinuationToken\n\n\tif p.options.StopOnDuplicateToken &&\n\t\tprevToken != nil &&\n\t\tp.nextToken != nil &&\n\t\t*prevToken == *p.nextToken {\n\t\tp.nextToken = nil\n\t}\n\n\treturn result, nil\n}\n\n// ListBucketsAPIClient is a client that implements the ListBuckets operation.\ntype ListBucketsAPIClient interface {\n\tListBuckets(context.Context, *ListBucketsInput, ...func(*Options)) (*ListBucketsOutput, error)\n}\n\nvar _ ListBucketsAPIClient = (*Client)(nil)\n\nfunc newServiceMetadataMiddleware_opListBuckets(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"ListBuckets\",\n\t}\n}\n\nfunc addListBucketsUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: nopGetBucketAccessor,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             false,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListDirectoryBuckets.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Returns a list of all Amazon S3 directory buckets owned by the authenticated\n// sender of the request. For more information about directory buckets, see [Directory buckets]in the\n// Amazon S3 User Guide.\n//\n// Directory buckets - For directory buckets, you must make requests for this API\n// operation to the Regional endpoint. These endpoints support path-style requests\n// in the format https://s3express-control.region-code.amazonaws.com/bucket-name .\n// Virtual-hosted-style requests aren't supported. For more information about\n// endpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more\n// information about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// Permissions You must have the s3express:ListAllMyDirectoryBuckets permission in\n// an IAM identity-based policy instead of a bucket policy. Cross-account access to\n// this API operation isn't supported. This operation can only be performed by the\n// Amazon Web Services account that owns the resource. For more information about\n// directory bucket policies and permissions, see [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]in the Amazon S3 User Guide.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// s3express-control.region.amazonaws.com .\n//\n// The BucketRegion response element is not part of the ListDirectoryBuckets\n// Response Syntax.\n//\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [Directory buckets]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n// [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\nfunc (c *Client) ListDirectoryBuckets(ctx context.Context, params *ListDirectoryBucketsInput, optFns ...func(*Options)) (*ListDirectoryBucketsOutput, error) {\n\tif params == nil {\n\t\tparams = &ListDirectoryBucketsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"ListDirectoryBuckets\", params, optFns, c.addOperationListDirectoryBucketsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*ListDirectoryBucketsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype ListDirectoryBucketsInput struct {\n\n\t// ContinuationToken indicates to Amazon S3 that the list is being continued on\n\t// buckets in this account with a token. ContinuationToken is obfuscated and is\n\t// not a real bucket name. You can use this ContinuationToken for the pagination\n\t// of the list results.\n\tContinuationToken *string\n\n\t// Maximum number of buckets to be returned in response. When the number is more\n\t// than the count of buckets that are owned by an Amazon Web Services account,\n\t// return all the buckets in response.\n\tMaxDirectoryBuckets *int32\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *ListDirectoryBucketsInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype ListDirectoryBucketsOutput struct {\n\n\t// The list of buckets owned by the requester.\n\tBuckets []types.Bucket\n\n\t// If ContinuationToken was sent with the request, it is included in the response.\n\t// You can use the returned ContinuationToken for pagination of the list response.\n\tContinuationToken *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationListDirectoryBucketsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpListDirectoryBuckets{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpListDirectoryBuckets{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"ListDirectoryBuckets\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opListDirectoryBuckets(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addListDirectoryBucketsUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// ListDirectoryBucketsPaginatorOptions is the paginator options for\n// ListDirectoryBuckets\ntype ListDirectoryBucketsPaginatorOptions struct {\n\t// Maximum number of buckets to be returned in response. When the number is more\n\t// than the count of buckets that are owned by an Amazon Web Services account,\n\t// return all the buckets in response.\n\tLimit int32\n\n\t// Set to true if pagination should stop if the service returns a pagination token\n\t// that matches the most recent token provided to the service.\n\tStopOnDuplicateToken bool\n}\n\n// ListDirectoryBucketsPaginator is a paginator for ListDirectoryBuckets\ntype ListDirectoryBucketsPaginator struct {\n\toptions   ListDirectoryBucketsPaginatorOptions\n\tclient    ListDirectoryBucketsAPIClient\n\tparams    *ListDirectoryBucketsInput\n\tnextToken *string\n\tfirstPage bool\n}\n\n// NewListDirectoryBucketsPaginator returns a new ListDirectoryBucketsPaginator\nfunc NewListDirectoryBucketsPaginator(client ListDirectoryBucketsAPIClient, params *ListDirectoryBucketsInput, optFns ...func(*ListDirectoryBucketsPaginatorOptions)) *ListDirectoryBucketsPaginator {\n\tif params == nil {\n\t\tparams = &ListDirectoryBucketsInput{}\n\t}\n\n\toptions := ListDirectoryBucketsPaginatorOptions{}\n\tif params.MaxDirectoryBuckets != nil {\n\t\toptions.Limit = *params.MaxDirectoryBuckets\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &ListDirectoryBucketsPaginator{\n\t\toptions:   options,\n\t\tclient:    client,\n\t\tparams:    params,\n\t\tfirstPage: true,\n\t\tnextToken: params.ContinuationToken,\n\t}\n}\n\n// HasMorePages returns a boolean indicating whether more pages are available\nfunc (p *ListDirectoryBucketsPaginator) HasMorePages() bool {\n\treturn p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0)\n}\n\n// NextPage retrieves the next ListDirectoryBuckets page.\nfunc (p *ListDirectoryBucketsPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*ListDirectoryBucketsOutput, error) {\n\tif !p.HasMorePages() {\n\t\treturn nil, fmt.Errorf(\"no more pages available\")\n\t}\n\n\tparams := *p.params\n\tparams.ContinuationToken = p.nextToken\n\n\tvar limit *int32\n\tif p.options.Limit > 0 {\n\t\tlimit = &p.options.Limit\n\t}\n\tparams.MaxDirectoryBuckets = limit\n\n\toptFns = append([]func(*Options){\n\t\taddIsPaginatorUserAgent,\n\t}, optFns...)\n\tresult, err := p.client.ListDirectoryBuckets(ctx, &params, optFns...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.firstPage = false\n\n\tprevToken := p.nextToken\n\tp.nextToken = result.ContinuationToken\n\n\tif p.options.StopOnDuplicateToken &&\n\t\tprevToken != nil &&\n\t\tp.nextToken != nil &&\n\t\t*prevToken == *p.nextToken {\n\t\tp.nextToken = nil\n\t}\n\n\treturn result, nil\n}\n\n// ListDirectoryBucketsAPIClient is a client that implements the\n// ListDirectoryBuckets operation.\ntype ListDirectoryBucketsAPIClient interface {\n\tListDirectoryBuckets(context.Context, *ListDirectoryBucketsInput, ...func(*Options)) (*ListDirectoryBucketsOutput, error)\n}\n\nvar _ ListDirectoryBucketsAPIClient = (*Client)(nil)\n\nfunc newServiceMetadataMiddleware_opListDirectoryBuckets(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"ListDirectoryBuckets\",\n\t}\n}\n\nfunc addListDirectoryBucketsUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: nopGetBucketAccessor,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListMultipartUploads.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation lists in-progress multipart uploads in a bucket. An in-progress\n// multipart upload is a multipart upload that has been initiated by the\n// CreateMultipartUpload request, but has not yet been completed or aborted.\n//\n// Directory buckets - If multipart uploads in a directory bucket are in progress,\n// you can't delete the bucket until all the in-progress multipart uploads are\n// aborted or completed. To delete these in-progress multipart uploads, use the\n// ListMultipartUploads operation to list the in-progress multipart uploads in the\n// bucket and use the AbortMultipartUpload operation to abort all the in-progress\n// multipart uploads.\n//\n// The ListMultipartUploads operation returns a maximum of 1,000 multipart uploads\n// in the response. The limit of 1,000 multipart uploads is also the default value.\n// You can further limit the number of uploads in a response by specifying the\n// max-uploads request parameter. If there are more than 1,000 multipart uploads\n// that satisfy your ListMultipartUploads request, the response returns an\n// IsTruncated element with the value of true , a NextKeyMarker element, and a\n// NextUploadIdMarker element. To list the remaining multipart uploads, you need to\n// make subsequent ListMultipartUploads requests. In these requests, include two\n// query parameters: key-marker and upload-id-marker . Set the value of key-marker\n// to the NextKeyMarker value from the previous response. Similarly, set the value\n// of upload-id-marker to the NextUploadIdMarker value from the previous response.\n//\n// Directory buckets - The upload-id-marker element and the NextUploadIdMarker\n// element aren't supported by directory buckets. To list the additional multipart\n// uploads, you only need to set the value of key-marker to the NextKeyMarker\n// value from the previous response.\n//\n// For more information about multipart uploads, see [Uploading Objects Using Multipart Upload] in the Amazon S3 User Guide.\n//\n// Directory buckets - For directory buckets, you must make requests for this API\n// operation to the Zonal endpoint. These endpoints support virtual-hosted-style\n// requests in the format\n// https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name\n// . Path-style requests are not supported. For more information about endpoints\n// in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information\n// about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// Permissions\n//\n//   - General purpose bucket permissions - For information about permissions\n//     required to use the multipart upload API, see [Multipart Upload and Permissions]in the Amazon S3 User Guide.\n//\n//   - Directory bucket permissions - To grant access to this API operation on a\n//     directory bucket, we recommend that you use the [CreateSession]CreateSession API operation\n//     for session-based authorization. Specifically, you grant the\n//     s3express:CreateSession permission to the directory bucket in a bucket policy\n//     or an IAM identity-based policy. Then, you make the CreateSession API call on\n//     the bucket to obtain a session token. With the session token in your request\n//     header, you can make API requests to this operation. After the session token\n//     expires, you make another CreateSession API call to generate a new session\n//     token for use. Amazon Web Services CLI or SDKs create session and refresh the\n//     session token automatically to avoid service interruptions when a session\n//     expires. For more information about authorization, see [CreateSession]CreateSession .\n//\n// Sorting of multipart uploads in response\n//\n//   - General purpose bucket - In the ListMultipartUploads response, the multipart\n//     uploads are sorted based on two criteria:\n//\n//   - Key-based sorting - Multipart uploads are initially sorted in ascending\n//     order based on their object keys.\n//\n//   - Time-based sorting - For uploads that share the same object key, they are\n//     further sorted in ascending order based on the upload initiation time. Among\n//     uploads with the same key, the one that was initiated first will appear before\n//     the ones that were initiated later.\n//\n//   - Directory bucket - In the ListMultipartUploads response, the multipart\n//     uploads aren't sorted lexicographically based on the object keys.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// Bucket-name.s3express-zone-id.region-code.amazonaws.com .\n//\n// The following operations are related to ListMultipartUploads :\n//\n// [CreateMultipartUpload]\n//\n// [UploadPart]\n//\n// [CompleteMultipartUpload]\n//\n// [ListParts]\n//\n// [AbortMultipartUpload]\n//\n// [Uploading Objects Using Multipart Upload]: https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [ListParts]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html\n// [AbortMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html\n// [UploadPart]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\n// [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\n// [Multipart Upload and Permissions]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html\n// [CompleteMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n// [CreateMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html\nfunc (c *Client) ListMultipartUploads(ctx context.Context, params *ListMultipartUploadsInput, optFns ...func(*Options)) (*ListMultipartUploadsOutput, error) {\n\tif params == nil {\n\t\tparams = &ListMultipartUploadsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"ListMultipartUploads\", params, optFns, c.addOperationListMultipartUploadsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*ListMultipartUploadsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype ListMultipartUploadsInput struct {\n\n\t// The name of the bucket to which the multipart upload was initiated.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use virtual-hosted-style requests in the format\n\t// Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests\n\t// are not supported. Directory bucket names must be unique in the chosen Zone\n\t// (Availability Zone or Local Zone). Bucket names must follow the format\n\t// bucket-base-name--zone-id--x-s3 (for example,\n\t// amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// Object Lambda access points are not supported by directory buckets.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Character you use to group keys.\n\t//\n\t// All keys that contain the same string between the prefix, if specified, and the\n\t// first occurrence of the delimiter after the prefix are grouped under a single\n\t// result element, CommonPrefixes . If you don't specify the prefix parameter, then\n\t// the substring starts at the beginning of the key. The keys that are grouped\n\t// under CommonPrefixes result element are not returned elsewhere in the response.\n\t//\n\t// Directory buckets - For directory buckets, / is the only supported delimiter.\n\tDelimiter *string\n\n\t// Encoding type used by Amazon S3 to encode the [object keys] in the response. Responses are\n\t// encoded only in UTF-8. An object key can contain any Unicode character. However,\n\t// the XML 1.0 parser can't parse certain characters, such as characters with an\n\t// ASCII value from 0 to 10. For characters that aren't supported in XML 1.0, you\n\t// can add this parameter to request that Amazon S3 encode the keys in the\n\t// response. For more information about characters to avoid in object key names,\n\t// see [Object key naming guidelines].\n\t//\n\t// When using the URL encoding type, non-ASCII characters that are used in an\n\t// object's key name will be percent-encoded according to UTF-8 code values. For\n\t// example, the object test_file(3).png will appear as test_file%283%29.png .\n\t//\n\t// [Object key naming guidelines]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines\n\t// [object keys]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html\n\tEncodingType types.EncodingType\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Specifies the multipart upload after which listing should begin.\n\t//\n\t//   - General purpose buckets - For general purpose buckets, key-marker is an\n\t//   object key. Together with upload-id-marker , this parameter specifies the\n\t//   multipart upload after which listing should begin.\n\t//\n\t// If upload-id-marker is not specified, only the keys lexicographically greater\n\t//   than the specified key-marker will be included in the list.\n\t//\n\t// If upload-id-marker is specified, any multipart uploads for a key equal to the\n\t//   key-marker might also be included, provided those multipart uploads have\n\t//   upload IDs lexicographically greater than the specified upload-id-marker .\n\t//\n\t//   - Directory buckets - For directory buckets, key-marker is obfuscated and\n\t//   isn't a real object key. The upload-id-marker parameter isn't supported by\n\t//   directory buckets. To list the additional multipart uploads, you only need to\n\t//   set the value of key-marker to the NextKeyMarker value from the previous\n\t//   response.\n\t//\n\t// In the ListMultipartUploads response, the multipart uploads aren't sorted\n\t//   lexicographically based on the object keys.\n\tKeyMarker *string\n\n\t// Sets the maximum number of multipart uploads, from 1 to 1,000, to return in the\n\t// response body. 1,000 is the maximum number of uploads that can be returned in a\n\t// response.\n\tMaxUploads *int32\n\n\t// Lists in-progress uploads only for those keys that begin with the specified\n\t// prefix. You can use prefixes to separate a bucket into different grouping of\n\t// keys. (You can think of using prefix to make groups in the same way that you'd\n\t// use a folder in a file system.)\n\t//\n\t// Directory buckets - For directory buckets, only prefixes that end in a\n\t// delimiter ( / ) are supported.\n\tPrefix *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// Together with key-marker, specifies the multipart upload after which listing\n\t// should begin. If key-marker is not specified, the upload-id-marker parameter is\n\t// ignored. Otherwise, any multipart uploads for a key equal to the key-marker\n\t// might be included in the list only if they have an upload ID lexicographically\n\t// greater than the specified upload-id-marker .\n\t//\n\t// This functionality is not supported for directory buckets.\n\tUploadIdMarker *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *ListMultipartUploadsInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.Prefix = in.Prefix\n\n}\n\ntype ListMultipartUploadsOutput struct {\n\n\t// The name of the bucket to which the multipart upload was initiated. Does not\n\t// return the access point ARN or access point alias if used.\n\tBucket *string\n\n\t// If you specify a delimiter in the request, then the result returns each\n\t// distinct key prefix containing the delimiter in a CommonPrefixes element. The\n\t// distinct key prefixes are returned in the Prefix child element.\n\t//\n\t// Directory buckets - For directory buckets, only prefixes that end in a\n\t// delimiter ( / ) are supported.\n\tCommonPrefixes []types.CommonPrefix\n\n\t// Contains the delimiter you specified in the request. If you don't specify a\n\t// delimiter in your request, this element is absent from the response.\n\t//\n\t// Directory buckets - For directory buckets, / is the only supported delimiter.\n\tDelimiter *string\n\n\t// Encoding type used by Amazon S3 to encode object keys in the response.\n\t//\n\t// If you specify the encoding-type request parameter, Amazon S3 includes this\n\t// element in the response, and returns encoded key name values in the following\n\t// response elements:\n\t//\n\t// Delimiter , KeyMarker , Prefix , NextKeyMarker , Key .\n\tEncodingType types.EncodingType\n\n\t// Indicates whether the returned list of multipart uploads is truncated. A value\n\t// of true indicates that the list was truncated. The list can be truncated if the\n\t// number of multipart uploads exceeds the limit allowed or specified by max\n\t// uploads.\n\tIsTruncated *bool\n\n\t// The key at or after which the listing began.\n\tKeyMarker *string\n\n\t// Maximum number of multipart uploads that could have been included in the\n\t// response.\n\tMaxUploads *int32\n\n\t// When a list is truncated, this element specifies the value that should be used\n\t// for the key-marker request parameter in a subsequent request.\n\tNextKeyMarker *string\n\n\t// When a list is truncated, this element specifies the value that should be used\n\t// for the upload-id-marker request parameter in a subsequent request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tNextUploadIdMarker *string\n\n\t// When a prefix is provided in the request, this field contains the specified\n\t// prefix. The result contains only keys starting with the specified prefix.\n\t//\n\t// Directory buckets - For directory buckets, only prefixes that end in a\n\t// delimiter ( / ) are supported.\n\tPrefix *string\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// Together with key-marker, specifies the multipart upload after which listing\n\t// should begin. If key-marker is not specified, the upload-id-marker parameter is\n\t// ignored. Otherwise, any multipart uploads for a key equal to the key-marker\n\t// might be included in the list only if they have an upload ID lexicographically\n\t// greater than the specified upload-id-marker .\n\t//\n\t// This functionality is not supported for directory buckets.\n\tUploadIdMarker *string\n\n\t// Container for elements related to a particular multipart upload. A response can\n\t// contain zero or more Upload elements.\n\tUploads []types.MultipartUpload\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationListMultipartUploadsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpListMultipartUploads{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpListMultipartUploads{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"ListMultipartUploads\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpListMultipartUploadsValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opListMultipartUploads(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addListMultipartUploadsUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *ListMultipartUploadsInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opListMultipartUploads(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"ListMultipartUploads\",\n\t}\n}\n\n// getListMultipartUploadsBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getListMultipartUploadsBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*ListMultipartUploadsInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addListMultipartUploadsUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getListMultipartUploadsBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListObjectVersions.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Returns metadata about all versions of the objects in a bucket. You can also\n// use request parameters as selection criteria to return metadata about a subset\n// of all the object versions.\n//\n// To use this operation, you must have permission to perform the\n// s3:ListBucketVersions action. Be aware of the name difference.\n//\n// A 200 OK response can contain valid or invalid XML. Make sure to design your\n// application to parse the contents of the response and handle it appropriately.\n//\n// To use this operation, you must have READ access to the bucket.\n//\n// The following operations are related to ListObjectVersions :\n//\n// [ListObjectsV2]\n//\n// [GetObject]\n//\n// [PutObject]\n//\n// [DeleteObject]\n//\n// [DeleteObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html\n// [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\n// [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\n// [ListObjectsV2]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html\nfunc (c *Client) ListObjectVersions(ctx context.Context, params *ListObjectVersionsInput, optFns ...func(*Options)) (*ListObjectVersionsOutput, error) {\n\tif params == nil {\n\t\tparams = &ListObjectVersionsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"ListObjectVersions\", params, optFns, c.addOperationListObjectVersionsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*ListObjectVersionsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype ListObjectVersionsInput struct {\n\n\t// The bucket name that contains the objects.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// A delimiter is a character that you specify to group keys. All keys that\n\t// contain the same string between the prefix and the first occurrence of the\n\t// delimiter are grouped under a single result element in CommonPrefixes . These\n\t// groups are counted as one result against the max-keys limitation. These keys\n\t// are not returned elsewhere in the response.\n\tDelimiter *string\n\n\t// Encoding type used by Amazon S3 to encode the [object keys] in the response. Responses are\n\t// encoded only in UTF-8. An object key can contain any Unicode character. However,\n\t// the XML 1.0 parser can't parse certain characters, such as characters with an\n\t// ASCII value from 0 to 10. For characters that aren't supported in XML 1.0, you\n\t// can add this parameter to request that Amazon S3 encode the keys in the\n\t// response. For more information about characters to avoid in object key names,\n\t// see [Object key naming guidelines].\n\t//\n\t// When using the URL encoding type, non-ASCII characters that are used in an\n\t// object's key name will be percent-encoded according to UTF-8 code values. For\n\t// example, the object test_file(3).png will appear as test_file%283%29.png .\n\t//\n\t// [Object key naming guidelines]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines\n\t// [object keys]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html\n\tEncodingType types.EncodingType\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Specifies the key to start with when listing objects in a bucket.\n\tKeyMarker *string\n\n\t// Sets the maximum number of keys returned in the response. By default, the\n\t// action returns up to 1,000 key names. The response might contain fewer keys but\n\t// will never contain more. If additional keys satisfy the search criteria, but\n\t// were not returned because max-keys was exceeded, the response contains true . To\n\t// return the additional keys, see key-marker and version-id-marker .\n\tMaxKeys *int32\n\n\t// Specifies the optional fields that you want returned in the response. Fields\n\t// that you do not specify are not returned.\n\tOptionalObjectAttributes []types.OptionalObjectAttributes\n\n\t// Use this parameter to select only those keys that begin with the specified\n\t// prefix. You can use prefixes to separate a bucket into different groupings of\n\t// keys. (You can think of using prefix to make groups in the same way that you'd\n\t// use a folder in a file system.) You can use prefix with delimiter to roll up\n\t// numerous objects into a single result under CommonPrefixes .\n\tPrefix *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// Specifies the object version you want to start listing from.\n\tVersionIdMarker *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *ListObjectVersionsInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.Prefix = in.Prefix\n\n}\n\ntype ListObjectVersionsOutput struct {\n\n\t// All of the keys rolled up into a common prefix count as a single return when\n\t// calculating the number of returns.\n\tCommonPrefixes []types.CommonPrefix\n\n\t// Container for an object that is a delete marker. To learn more about delete\n\t// markers, see [Working with delete markers].\n\t//\n\t// [Working with delete markers]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeleteMarker.html\n\tDeleteMarkers []types.DeleteMarkerEntry\n\n\t// The delimiter grouping the included keys. A delimiter is a character that you\n\t// specify to group keys. All keys that contain the same string between the prefix\n\t// and the first occurrence of the delimiter are grouped under a single result\n\t// element in CommonPrefixes . These groups are counted as one result against the\n\t// max-keys limitation. These keys are not returned elsewhere in the response.\n\tDelimiter *string\n\n\t//  Encoding type used by Amazon S3 to encode object key names in the XML response.\n\t//\n\t// If you specify the encoding-type request parameter, Amazon S3 includes this\n\t// element in the response, and returns encoded key name values in the following\n\t// response elements:\n\t//\n\t// KeyMarker, NextKeyMarker, Prefix, Key , and Delimiter .\n\tEncodingType types.EncodingType\n\n\t// A flag that indicates whether Amazon S3 returned all of the results that\n\t// satisfied the search criteria. If your results were truncated, you can make a\n\t// follow-up paginated request by using the NextKeyMarker and NextVersionIdMarker\n\t// response parameters as a starting place in another request to return the rest of\n\t// the results.\n\tIsTruncated *bool\n\n\t// Marks the last key returned in a truncated response.\n\tKeyMarker *string\n\n\t// Specifies the maximum number of objects to return.\n\tMaxKeys *int32\n\n\t// The bucket name.\n\tName *string\n\n\t// When the number of responses exceeds the value of MaxKeys , NextKeyMarker\n\t// specifies the first key not returned that satisfies the search criteria. Use\n\t// this value for the key-marker request parameter in a subsequent request.\n\tNextKeyMarker *string\n\n\t// When the number of responses exceeds the value of MaxKeys , NextVersionIdMarker\n\t// specifies the first object version not returned that satisfies the search\n\t// criteria. Use this value for the version-id-marker request parameter in a\n\t// subsequent request.\n\tNextVersionIdMarker *string\n\n\t// Selects objects that start with the value supplied by this parameter.\n\tPrefix *string\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// Marks the last version of the key returned in a truncated response.\n\tVersionIdMarker *string\n\n\t// Container for version information.\n\tVersions []types.ObjectVersion\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationListObjectVersionsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpListObjectVersions{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpListObjectVersions{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"ListObjectVersions\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpListObjectVersionsValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opListObjectVersions(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addListObjectVersionsUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *ListObjectVersionsInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opListObjectVersions(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"ListObjectVersions\",\n\t}\n}\n\n// getListObjectVersionsBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getListObjectVersionsBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*ListObjectVersionsInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addListObjectVersionsUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getListObjectVersionsBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListObjects.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Returns some or all (up to 1,000) of the objects in a bucket. You can use the\n// request parameters as selection criteria to return a subset of the objects in a\n// bucket. A 200 OK response can contain valid or invalid XML. Be sure to design\n// your application to parse the contents of the response and handle it\n// appropriately.\n//\n// This action has been revised. We recommend that you use the newer version, [ListObjectsV2],\n// when developing applications. For backward compatibility, Amazon S3 continues to\n// support ListObjects .\n//\n// The following operations are related to ListObjects :\n//\n// [ListObjectsV2]\n//\n// [GetObject]\n//\n// [PutObject]\n//\n// [CreateBucket]\n//\n// [ListBuckets]\n//\n// [ListBuckets]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html\n// [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\n// [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\n// [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\n// [ListObjectsV2]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html\nfunc (c *Client) ListObjects(ctx context.Context, params *ListObjectsInput, optFns ...func(*Options)) (*ListObjectsOutput, error) {\n\tif params == nil {\n\t\tparams = &ListObjectsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"ListObjects\", params, optFns, c.addOperationListObjectsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*ListObjectsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype ListObjectsInput struct {\n\n\t// The name of the bucket containing the objects.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use virtual-hosted-style requests in the format\n\t// Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests\n\t// are not supported. Directory bucket names must be unique in the chosen Zone\n\t// (Availability Zone or Local Zone). Bucket names must follow the format\n\t// bucket-base-name--zone-id--x-s3 (for example,\n\t// amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// Object Lambda access points are not supported by directory buckets.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// A delimiter is a character that you use to group keys.\n\tDelimiter *string\n\n\t// Encoding type used by Amazon S3 to encode the [object keys] in the response. Responses are\n\t// encoded only in UTF-8. An object key can contain any Unicode character. However,\n\t// the XML 1.0 parser can't parse certain characters, such as characters with an\n\t// ASCII value from 0 to 10. For characters that aren't supported in XML 1.0, you\n\t// can add this parameter to request that Amazon S3 encode the keys in the\n\t// response. For more information about characters to avoid in object key names,\n\t// see [Object key naming guidelines].\n\t//\n\t// When using the URL encoding type, non-ASCII characters that are used in an\n\t// object's key name will be percent-encoded according to UTF-8 code values. For\n\t// example, the object test_file(3).png will appear as test_file%283%29.png .\n\t//\n\t// [Object key naming guidelines]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines\n\t// [object keys]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html\n\tEncodingType types.EncodingType\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Marker is where you want Amazon S3 to start listing from. Amazon S3 starts\n\t// listing after this specified key. Marker can be any key in the bucket.\n\tMarker *string\n\n\t// Sets the maximum number of keys returned in the response. By default, the\n\t// action returns up to 1,000 key names. The response might contain fewer keys but\n\t// will never contain more.\n\tMaxKeys *int32\n\n\t// Specifies the optional fields that you want returned in the response. Fields\n\t// that you do not specify are not returned.\n\tOptionalObjectAttributes []types.OptionalObjectAttributes\n\n\t// Limits the response to keys that begin with the specified prefix.\n\tPrefix *string\n\n\t// Confirms that the requester knows that she or he will be charged for the list\n\t// objects request. Bucket owners need not specify this parameter in their\n\t// requests.\n\tRequestPayer types.RequestPayer\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *ListObjectsInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.Prefix = in.Prefix\n\n}\n\ntype ListObjectsOutput struct {\n\n\t// All of the keys (up to 1,000) rolled up in a common prefix count as a single\n\t// return when calculating the number of returns.\n\t//\n\t// A response can contain CommonPrefixes only if you specify a delimiter.\n\t//\n\t// CommonPrefixes contains all (if there are any) keys between Prefix and the next\n\t// occurrence of the string specified by the delimiter.\n\t//\n\t// CommonPrefixes lists keys that act like subdirectories in the directory\n\t// specified by Prefix .\n\t//\n\t// For example, if the prefix is notes/ and the delimiter is a slash ( / ), as in\n\t// notes/summer/july , the common prefix is notes/summer/ . All of the keys that\n\t// roll up into a common prefix count as a single return when calculating the\n\t// number of returns.\n\tCommonPrefixes []types.CommonPrefix\n\n\t// Metadata about each object returned.\n\tContents []types.Object\n\n\t// Causes keys that contain the same string between the prefix and the first\n\t// occurrence of the delimiter to be rolled up into a single result element in the\n\t// CommonPrefixes collection. These rolled-up keys are not returned elsewhere in\n\t// the response. Each rolled-up result counts as only one return against the\n\t// MaxKeys value.\n\tDelimiter *string\n\n\t// Encoding type used by Amazon S3 to encode the [object keys] in the response. Responses are\n\t// encoded only in UTF-8. An object key can contain any Unicode character. However,\n\t// the XML 1.0 parser can't parse certain characters, such as characters with an\n\t// ASCII value from 0 to 10. For characters that aren't supported in XML 1.0, you\n\t// can add this parameter to request that Amazon S3 encode the keys in the\n\t// response. For more information about characters to avoid in object key names,\n\t// see [Object key naming guidelines].\n\t//\n\t// When using the URL encoding type, non-ASCII characters that are used in an\n\t// object's key name will be percent-encoded according to UTF-8 code values. For\n\t// example, the object test_file(3).png will appear as test_file%283%29.png .\n\t//\n\t// [Object key naming guidelines]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines\n\t// [object keys]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html\n\tEncodingType types.EncodingType\n\n\t// A flag that indicates whether Amazon S3 returned all of the results that\n\t// satisfied the search criteria.\n\tIsTruncated *bool\n\n\t// Indicates where in the bucket listing begins. Marker is included in the\n\t// response if it was sent with the request.\n\tMarker *string\n\n\t// The maximum number of keys returned in the response body.\n\tMaxKeys *int32\n\n\t// The bucket name.\n\tName *string\n\n\t// When the response is truncated (the IsTruncated element value in the response\n\t// is true ), you can use the key name in this field as the marker parameter in\n\t// the subsequent request to get the next set of objects. Amazon S3 lists objects\n\t// in alphabetical order.\n\t//\n\t// This element is returned only if you have the delimiter request parameter\n\t// specified. If the response does not include the NextMarker element and it is\n\t// truncated, you can use the value of the last Key element in the response as the\n\t// marker parameter in the subsequent request to get the next set of object keys.\n\tNextMarker *string\n\n\t// Keys that begin with the indicated prefix.\n\tPrefix *string\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationListObjectsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpListObjects{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpListObjects{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"ListObjects\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpListObjectsValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opListObjects(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addListObjectsUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *ListObjectsInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opListObjects(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"ListObjects\",\n\t}\n}\n\n// getListObjectsBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getListObjectsBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*ListObjectsInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addListObjectsUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getListObjectsBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListObjectsV2.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Returns some or all (up to 1,000) of the objects in a bucket with each request.\n// You can use the request parameters as selection criteria to return a subset of\n// the objects in a bucket. A 200 OK response can contain valid or invalid XML.\n// Make sure to design your application to parse the contents of the response and\n// handle it appropriately. For more information about listing objects, see [Listing object keys programmatically]in the\n// Amazon S3 User Guide. To get a list of your buckets, see [ListBuckets].\n//\n//   - General purpose bucket - For general purpose buckets, ListObjectsV2 doesn't\n//     return prefixes that are related only to in-progress multipart uploads.\n//\n//   - Directory buckets - For directory buckets, ListObjectsV2 response includes\n//     the prefixes that are related only to in-progress multipart uploads.\n//\n//   - Directory buckets - For directory buckets, you must make requests for this\n//     API operation to the Zonal endpoint. These endpoints support\n//     virtual-hosted-style requests in the format\n//     https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name\n//     . Path-style requests are not supported. For more information about endpoints\n//     in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information\n//     about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// Permissions\n//\n//   - General purpose bucket permissions - To use this operation, you must have\n//     READ access to the bucket. You must have permission to perform the\n//     s3:ListBucket action. The bucket owner has this permission by default and can\n//     grant this permission to others. For more information about permissions, see [Permissions Related to Bucket Subresource Operations]\n//     and [Managing Access Permissions to Your Amazon S3 Resources]in the Amazon S3 User Guide.\n//\n//   - Directory bucket permissions - To grant access to this API operation on a\n//     directory bucket, we recommend that you use the [CreateSession]CreateSession API operation\n//     for session-based authorization. Specifically, you grant the\n//     s3express:CreateSession permission to the directory bucket in a bucket policy\n//     or an IAM identity-based policy. Then, you make the CreateSession API call on\n//     the bucket to obtain a session token. With the session token in your request\n//     header, you can make API requests to this operation. After the session token\n//     expires, you make another CreateSession API call to generate a new session\n//     token for use. Amazon Web Services CLI or SDKs create session and refresh the\n//     session token automatically to avoid service interruptions when a session\n//     expires. For more information about authorization, see [CreateSession]CreateSession .\n//\n// Sorting order of returned objects\n//\n//   - General purpose bucket - For general purpose buckets, ListObjectsV2 returns\n//     objects in lexicographical order based on their key names.\n//\n//   - Directory bucket - For directory buckets, ListObjectsV2 does not return\n//     objects in lexicographical order.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// Bucket-name.s3express-zone-id.region-code.amazonaws.com .\n//\n// This section describes the latest revision of this action. We recommend that\n// you use this revised API operation for application development. For backward\n// compatibility, Amazon S3 continues to support the prior version of this API\n// operation, [ListObjects].\n//\n// The following operations are related to ListObjectsV2 :\n//\n// [GetObject]\n//\n// [PutObject]\n//\n// [CreateBucket]\n//\n// [ListObjects]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [Listing object keys programmatically]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/ListingKeysUsingAPIs.html\n// [ListBuckets]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html\n// [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\n// [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\n// [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\n// [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\nfunc (c *Client) ListObjectsV2(ctx context.Context, params *ListObjectsV2Input, optFns ...func(*Options)) (*ListObjectsV2Output, error) {\n\tif params == nil {\n\t\tparams = &ListObjectsV2Input{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"ListObjectsV2\", params, optFns, c.addOperationListObjectsV2Middlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*ListObjectsV2Output)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype ListObjectsV2Input struct {\n\n\t//  Directory buckets - When you use this operation with a directory bucket, you\n\t// must use virtual-hosted-style requests in the format\n\t// Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests\n\t// are not supported. Directory bucket names must be unique in the chosen Zone\n\t// (Availability Zone or Local Zone). Bucket names must follow the format\n\t// bucket-base-name--zone-id--x-s3 (for example,\n\t// amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// Object Lambda access points are not supported by directory buckets.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// ContinuationToken indicates to Amazon S3 that the list is being continued on\n\t// this bucket with a token. ContinuationToken is obfuscated and is not a real\n\t// key. You can use this ContinuationToken for pagination of the list results.\n\tContinuationToken *string\n\n\t// A delimiter is a character that you use to group keys.\n\t//\n\t//   - Directory buckets - For directory buckets, / is the only supported delimiter.\n\t//\n\t//   - Directory buckets - When you query ListObjectsV2 with a delimiter during\n\t//   in-progress multipart uploads, the CommonPrefixes response parameter contains\n\t//   the prefixes that are associated with the in-progress multipart uploads. For\n\t//   more information about multipart uploads, see [Multipart Upload Overview]in the Amazon S3 User Guide.\n\t//\n\t// [Multipart Upload Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html\n\tDelimiter *string\n\n\t// Encoding type used by Amazon S3 to encode the [object keys] in the response. Responses are\n\t// encoded only in UTF-8. An object key can contain any Unicode character. However,\n\t// the XML 1.0 parser can't parse certain characters, such as characters with an\n\t// ASCII value from 0 to 10. For characters that aren't supported in XML 1.0, you\n\t// can add this parameter to request that Amazon S3 encode the keys in the\n\t// response. For more information about characters to avoid in object key names,\n\t// see [Object key naming guidelines].\n\t//\n\t// When using the URL encoding type, non-ASCII characters that are used in an\n\t// object's key name will be percent-encoded according to UTF-8 code values. For\n\t// example, the object test_file(3).png will appear as test_file%283%29.png .\n\t//\n\t// [Object key naming guidelines]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines\n\t// [object keys]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html\n\tEncodingType types.EncodingType\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// The owner field is not present in ListObjectsV2 by default. If you want to\n\t// return the owner field with each key in the result, then set the FetchOwner\n\t// field to true .\n\t//\n\t// Directory buckets - For directory buckets, the bucket owner is returned as the\n\t// object owner for all objects.\n\tFetchOwner *bool\n\n\t// Sets the maximum number of keys returned in the response. By default, the\n\t// action returns up to 1,000 key names. The response might contain fewer keys but\n\t// will never contain more.\n\tMaxKeys *int32\n\n\t// Specifies the optional fields that you want returned in the response. Fields\n\t// that you do not specify are not returned.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tOptionalObjectAttributes []types.OptionalObjectAttributes\n\n\t// Limits the response to keys that begin with the specified prefix.\n\t//\n\t// Directory buckets - For directory buckets, only prefixes that end in a\n\t// delimiter ( / ) are supported.\n\tPrefix *string\n\n\t// Confirms that the requester knows that she or he will be charged for the list\n\t// objects request in V2 style. Bucket owners need not specify this parameter in\n\t// their requests.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestPayer types.RequestPayer\n\n\t// StartAfter is where you want Amazon S3 to start listing from. Amazon S3 starts\n\t// listing after this specified key. StartAfter can be any key in the bucket.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tStartAfter *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *ListObjectsV2Input) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.Prefix = in.Prefix\n\n}\n\ntype ListObjectsV2Output struct {\n\n\t// All of the keys (up to 1,000) that share the same prefix are grouped together.\n\t// When counting the total numbers of returns by this API operation, this group of\n\t// keys is considered as one item.\n\t//\n\t// A response can contain CommonPrefixes only if you specify a delimiter.\n\t//\n\t// CommonPrefixes contains all (if there are any) keys between Prefix and the next\n\t// occurrence of the string specified by a delimiter.\n\t//\n\t// CommonPrefixes lists keys that act like subdirectories in the directory\n\t// specified by Prefix .\n\t//\n\t// For example, if the prefix is notes/ and the delimiter is a slash ( / ) as in\n\t// notes/summer/july , the common prefix is notes/summer/ . All of the keys that\n\t// roll up into a common prefix count as a single return when calculating the\n\t// number of returns.\n\t//\n\t//   - Directory buckets - For directory buckets, only prefixes that end in a\n\t//   delimiter ( / ) are supported.\n\t//\n\t//   - Directory buckets - When you query ListObjectsV2 with a delimiter during\n\t//   in-progress multipart uploads, the CommonPrefixes response parameter contains\n\t//   the prefixes that are associated with the in-progress multipart uploads. For\n\t//   more information about multipart uploads, see [Multipart Upload Overview]in the Amazon S3 User Guide.\n\t//\n\t// [Multipart Upload Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html\n\tCommonPrefixes []types.CommonPrefix\n\n\t// Metadata about each object returned.\n\tContents []types.Object\n\n\t//  If ContinuationToken was sent with the request, it is included in the\n\t// response. You can use the returned ContinuationToken for pagination of the list\n\t// response. You can use this ContinuationToken for pagination of the list\n\t// results.\n\tContinuationToken *string\n\n\t// Causes keys that contain the same string between the prefix and the first\n\t// occurrence of the delimiter to be rolled up into a single result element in the\n\t// CommonPrefixes collection. These rolled-up keys are not returned elsewhere in\n\t// the response. Each rolled-up result counts as only one return against the\n\t// MaxKeys value.\n\t//\n\t// Directory buckets - For directory buckets, / is the only supported delimiter.\n\tDelimiter *string\n\n\t// Encoding type used by Amazon S3 to encode object key names in the XML response.\n\t//\n\t// If you specify the encoding-type request parameter, Amazon S3 includes this\n\t// element in the response, and returns encoded key name values in the following\n\t// response elements:\n\t//\n\t// Delimiter, Prefix, Key, and StartAfter .\n\tEncodingType types.EncodingType\n\n\t// Set to false if all of the results were returned. Set to true if more keys are\n\t// available to return. If the number of results exceeds that specified by MaxKeys\n\t// , all of the results might not be returned.\n\tIsTruncated *bool\n\n\t// KeyCount is the number of keys returned with this request. KeyCount will always\n\t// be less than or equal to the MaxKeys field. For example, if you ask for 50\n\t// keys, your result will include 50 keys or fewer.\n\tKeyCount *int32\n\n\t// Sets the maximum number of keys returned in the response. By default, the\n\t// action returns up to 1,000 key names. The response might contain fewer keys but\n\t// will never contain more.\n\tMaxKeys *int32\n\n\t// The bucket name.\n\tName *string\n\n\t// NextContinuationToken is sent when isTruncated is true, which means there are\n\t// more keys in the bucket that can be listed. The next list requests to Amazon S3\n\t// can be continued with this NextContinuationToken . NextContinuationToken is\n\t// obfuscated and is not a real key\n\tNextContinuationToken *string\n\n\t// Keys that begin with the indicated prefix.\n\t//\n\t// Directory buckets - For directory buckets, only prefixes that end in a\n\t// delimiter ( / ) are supported.\n\tPrefix *string\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// If StartAfter was sent with the request, it is included in the response.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tStartAfter *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationListObjectsV2Middlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpListObjectsV2{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpListObjectsV2{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"ListObjectsV2\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpListObjectsV2ValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opListObjectsV2(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addListObjectsV2UpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// ListObjectsV2PaginatorOptions is the paginator options for ListObjectsV2\ntype ListObjectsV2PaginatorOptions struct {\n\t// Sets the maximum number of keys returned in the response. By default, the\n\t// action returns up to 1,000 key names. The response might contain fewer keys but\n\t// will never contain more.\n\tLimit int32\n\n\t// Set to true if pagination should stop if the service returns a pagination token\n\t// that matches the most recent token provided to the service.\n\tStopOnDuplicateToken bool\n}\n\n// ListObjectsV2Paginator is a paginator for ListObjectsV2\ntype ListObjectsV2Paginator struct {\n\toptions   ListObjectsV2PaginatorOptions\n\tclient    ListObjectsV2APIClient\n\tparams    *ListObjectsV2Input\n\tnextToken *string\n\tfirstPage bool\n}\n\n// NewListObjectsV2Paginator returns a new ListObjectsV2Paginator\nfunc NewListObjectsV2Paginator(client ListObjectsV2APIClient, params *ListObjectsV2Input, optFns ...func(*ListObjectsV2PaginatorOptions)) *ListObjectsV2Paginator {\n\tif params == nil {\n\t\tparams = &ListObjectsV2Input{}\n\t}\n\n\toptions := ListObjectsV2PaginatorOptions{}\n\tif params.MaxKeys != nil {\n\t\toptions.Limit = *params.MaxKeys\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &ListObjectsV2Paginator{\n\t\toptions:   options,\n\t\tclient:    client,\n\t\tparams:    params,\n\t\tfirstPage: true,\n\t\tnextToken: params.ContinuationToken,\n\t}\n}\n\n// HasMorePages returns a boolean indicating whether more pages are available\nfunc (p *ListObjectsV2Paginator) HasMorePages() bool {\n\treturn p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0)\n}\n\n// NextPage retrieves the next ListObjectsV2 page.\nfunc (p *ListObjectsV2Paginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*ListObjectsV2Output, error) {\n\tif !p.HasMorePages() {\n\t\treturn nil, fmt.Errorf(\"no more pages available\")\n\t}\n\n\tparams := *p.params\n\tparams.ContinuationToken = p.nextToken\n\n\tvar limit *int32\n\tif p.options.Limit > 0 {\n\t\tlimit = &p.options.Limit\n\t}\n\tparams.MaxKeys = limit\n\n\toptFns = append([]func(*Options){\n\t\taddIsPaginatorUserAgent,\n\t}, optFns...)\n\tresult, err := p.client.ListObjectsV2(ctx, &params, optFns...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.firstPage = false\n\n\tprevToken := p.nextToken\n\tp.nextToken = nil\n\tif result.IsTruncated != nil && *result.IsTruncated {\n\t\tp.nextToken = result.NextContinuationToken\n\t}\n\n\tif p.options.StopOnDuplicateToken &&\n\t\tprevToken != nil &&\n\t\tp.nextToken != nil &&\n\t\t*prevToken == *p.nextToken {\n\t\tp.nextToken = nil\n\t}\n\n\treturn result, nil\n}\n\nfunc (v *ListObjectsV2Input) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\n// ListObjectsV2APIClient is a client that implements the ListObjectsV2 operation.\ntype ListObjectsV2APIClient interface {\n\tListObjectsV2(context.Context, *ListObjectsV2Input, ...func(*Options)) (*ListObjectsV2Output, error)\n}\n\nvar _ ListObjectsV2APIClient = (*Client)(nil)\n\nfunc newServiceMetadataMiddleware_opListObjectsV2(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"ListObjectsV2\",\n\t}\n}\n\n// getListObjectsV2BucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getListObjectsV2BucketMember(input interface{}) (*string, bool) {\n\tin := input.(*ListObjectsV2Input)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addListObjectsV2UpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getListObjectsV2BucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListParts.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"time\"\n)\n\n// Lists the parts that have been uploaded for a specific multipart upload.\n//\n// To use this operation, you must provide the upload ID in the request. You\n// obtain this uploadID by sending the initiate multipart upload request through [CreateMultipartUpload].\n//\n// The ListParts request returns a maximum of 1,000 uploaded parts. The limit of\n// 1,000 parts is also the default value. You can restrict the number of parts in a\n// response by specifying the max-parts request parameter. If your multipart\n// upload consists of more than 1,000 parts, the response returns an IsTruncated\n// field with the value of true , and a NextPartNumberMarker element. To list\n// remaining uploaded parts, in subsequent ListParts requests, include the\n// part-number-marker query string parameter and set its value to the\n// NextPartNumberMarker field value from the previous response.\n//\n// For more information on multipart uploads, see [Uploading Objects Using Multipart Upload] in the Amazon S3 User Guide.\n//\n// Directory buckets - For directory buckets, you must make requests for this API\n// operation to the Zonal endpoint. These endpoints support virtual-hosted-style\n// requests in the format\n// https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name\n// . Path-style requests are not supported. For more information about endpoints\n// in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information\n// about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// Permissions\n//   - General purpose bucket permissions - For information about permissions\n//     required to use the multipart upload API, see [Multipart Upload and Permissions]in the Amazon S3 User Guide.\n//\n// If the upload was created using server-side encryption with Key Management\n//\n//\tService (KMS) keys (SSE-KMS) or dual-layer server-side encryption with Amazon\n//\tWeb Services KMS keys (DSSE-KMS), you must have permission to the kms:Decrypt\n//\taction for the ListParts request to succeed.\n//\n//\t- Directory bucket permissions - To grant access to this API operation on a\n//\tdirectory bucket, we recommend that you use the [CreateSession]CreateSession API operation\n//\tfor session-based authorization. Specifically, you grant the\n//\ts3express:CreateSession permission to the directory bucket in a bucket policy\n//\tor an IAM identity-based policy. Then, you make the CreateSession API call on\n//\tthe bucket to obtain a session token. With the session token in your request\n//\theader, you can make API requests to this operation. After the session token\n//\texpires, you make another CreateSession API call to generate a new session\n//\ttoken for use. Amazon Web Services CLI or SDKs create session and refresh the\n//\tsession token automatically to avoid service interruptions when a session\n//\texpires. For more information about authorization, see [CreateSession]CreateSession .\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// Bucket-name.s3express-zone-id.region-code.amazonaws.com .\n//\n// The following operations are related to ListParts :\n//\n// [CreateMultipartUpload]\n//\n// [UploadPart]\n//\n// [CompleteMultipartUpload]\n//\n// [AbortMultipartUpload]\n//\n// [GetObjectAttributes]\n//\n// [ListMultipartUploads]\n//\n// [Uploading Objects Using Multipart Upload]: https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [AbortMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html\n// [UploadPart]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\n// [GetObjectAttributes]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html\n// [ListMultipartUploads]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html\n// [Multipart Upload and Permissions]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html\n// [CompleteMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html\n// [CreateMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n//\n// [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\nfunc (c *Client) ListParts(ctx context.Context, params *ListPartsInput, optFns ...func(*Options)) (*ListPartsOutput, error) {\n\tif params == nil {\n\t\tparams = &ListPartsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"ListParts\", params, optFns, c.addOperationListPartsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*ListPartsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype ListPartsInput struct {\n\n\t// The name of the bucket to which the parts are being uploaded.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use virtual-hosted-style requests in the format\n\t// Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests\n\t// are not supported. Directory bucket names must be unique in the chosen Zone\n\t// (Availability Zone or Local Zone). Bucket names must follow the format\n\t// bucket-base-name--zone-id--x-s3 (for example,\n\t// amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// Object Lambda access points are not supported by directory buckets.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Object key for which the multipart upload was initiated.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// Upload ID identifying the multipart upload whose parts are being listed.\n\t//\n\t// This member is required.\n\tUploadId *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Sets the maximum number of parts to return.\n\tMaxParts *int32\n\n\t// Specifies the part after which listing should begin. Only parts with higher\n\t// part numbers will be listed.\n\tPartNumberMarker *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// The server-side encryption (SSE) algorithm used to encrypt the object. This\n\t// parameter is needed only when the object was created using a checksum algorithm.\n\t// For more information, see [Protecting data using SSE-C keys]in the Amazon S3 User Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Protecting data using SSE-C keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\n\tSSECustomerAlgorithm *string\n\n\t// The server-side encryption (SSE) customer managed key. This parameter is needed\n\t// only when the object was created using a checksum algorithm. For more\n\t// information, see [Protecting data using SSE-C keys]in the Amazon S3 User Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Protecting data using SSE-C keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\n\tSSECustomerKey *string\n\n\t// The MD5 server-side encryption (SSE) customer managed key. This parameter is\n\t// needed only when the object was created using a checksum algorithm. For more\n\t// information, see [Protecting data using SSE-C keys]in the Amazon S3 User Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Protecting data using SSE-C keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\n\tSSECustomerKeyMD5 *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *ListPartsInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.Key = in.Key\n\n}\n\ntype ListPartsOutput struct {\n\n\t// If the bucket has a lifecycle rule configured with an action to abort\n\t// incomplete multipart uploads and the prefix in the lifecycle rule matches the\n\t// object name in the request, then the response includes this header indicating\n\t// when the initiated multipart upload will become eligible for abort operation.\n\t// For more information, see [Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration].\n\t//\n\t// The response will also include the x-amz-abort-rule-id header that will provide\n\t// the ID of the lifecycle configuration rule that defines this action.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config\n\tAbortDate *time.Time\n\n\t// This header is returned along with the x-amz-abort-date header. It identifies\n\t// applicable lifecycle configuration rule that defines the action to abort\n\t// incomplete multipart uploads.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tAbortRuleId *string\n\n\t// The name of the bucket to which the multipart upload was initiated. Does not\n\t// return the access point ARN or access point alias if used.\n\tBucket *string\n\n\t// The algorithm that was used to create a checksum of the object.\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The checksum type, which determines how part-level checksums are combined to\n\t// create an object-level checksum for multipart objects. You can use this header\n\t// response to verify that the checksum type that is received is the same checksum\n\t// type that was specified in CreateMultipartUpload request. For more information,\n\t// see [Checking object integrity in the Amazon S3 User Guide].\n\t//\n\t// [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumType types.ChecksumType\n\n\t// Container element that identifies who initiated the multipart upload. If the\n\t// initiator is an Amazon Web Services account, this element provides the same\n\t// information as the Owner element. If the initiator is an IAM User, this element\n\t// provides the user ARN and display name.\n\tInitiator *types.Initiator\n\n\t//  Indicates whether the returned list of parts is truncated. A true value\n\t// indicates that the list was truncated. A list can be truncated if the number of\n\t// parts exceeds the limit returned in the MaxParts element.\n\tIsTruncated *bool\n\n\t// Object key for which the multipart upload was initiated.\n\tKey *string\n\n\t// Maximum number of parts that were allowed in the response.\n\tMaxParts *int32\n\n\t// When a list is truncated, this element specifies the last part in the list, as\n\t// well as the value to use for the part-number-marker request parameter in a\n\t// subsequent request.\n\tNextPartNumberMarker *string\n\n\t// Container element that identifies the object owner, after the object is\n\t// created. If multipart upload is initiated by an IAM user, this element provides\n\t// the parent account ID and display name.\n\t//\n\t// Directory buckets - The bucket owner is returned as the object owner for all\n\t// the parts.\n\tOwner *types.Owner\n\n\t// Specifies the part after which listing should begin. Only parts with higher\n\t// part numbers will be listed.\n\tPartNumberMarker *string\n\n\t// Container for elements related to a particular part. A response can contain\n\t// zero or more Part elements.\n\tParts []types.Part\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// The class of storage used to store the uploaded object.\n\t//\n\t// Directory buckets - Directory buckets only support EXPRESS_ONEZONE (the S3\n\t// Express One Zone storage class) in Availability Zones and ONEZONE_IA (the S3\n\t// One Zone-Infrequent Access storage class) in Dedicated Local Zones.\n\tStorageClass types.StorageClass\n\n\t// Upload ID identifying the multipart upload whose parts are being listed.\n\tUploadId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationListPartsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpListParts{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpListParts{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"ListParts\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpListPartsValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opListParts(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addListPartsUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// ListPartsPaginatorOptions is the paginator options for ListParts\ntype ListPartsPaginatorOptions struct {\n\t// Sets the maximum number of parts to return.\n\tLimit int32\n\n\t// Set to true if pagination should stop if the service returns a pagination token\n\t// that matches the most recent token provided to the service.\n\tStopOnDuplicateToken bool\n}\n\n// ListPartsPaginator is a paginator for ListParts\ntype ListPartsPaginator struct {\n\toptions   ListPartsPaginatorOptions\n\tclient    ListPartsAPIClient\n\tparams    *ListPartsInput\n\tnextToken *string\n\tfirstPage bool\n}\n\n// NewListPartsPaginator returns a new ListPartsPaginator\nfunc NewListPartsPaginator(client ListPartsAPIClient, params *ListPartsInput, optFns ...func(*ListPartsPaginatorOptions)) *ListPartsPaginator {\n\tif params == nil {\n\t\tparams = &ListPartsInput{}\n\t}\n\n\toptions := ListPartsPaginatorOptions{}\n\tif params.MaxParts != nil {\n\t\toptions.Limit = *params.MaxParts\n\t}\n\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\n\treturn &ListPartsPaginator{\n\t\toptions:   options,\n\t\tclient:    client,\n\t\tparams:    params,\n\t\tfirstPage: true,\n\t\tnextToken: params.PartNumberMarker,\n\t}\n}\n\n// HasMorePages returns a boolean indicating whether more pages are available\nfunc (p *ListPartsPaginator) HasMorePages() bool {\n\treturn p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0)\n}\n\n// NextPage retrieves the next ListParts page.\nfunc (p *ListPartsPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*ListPartsOutput, error) {\n\tif !p.HasMorePages() {\n\t\treturn nil, fmt.Errorf(\"no more pages available\")\n\t}\n\n\tparams := *p.params\n\tparams.PartNumberMarker = p.nextToken\n\n\tvar limit *int32\n\tif p.options.Limit > 0 {\n\t\tlimit = &p.options.Limit\n\t}\n\tparams.MaxParts = limit\n\n\toptFns = append([]func(*Options){\n\t\taddIsPaginatorUserAgent,\n\t}, optFns...)\n\tresult, err := p.client.ListParts(ctx, &params, optFns...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.firstPage = false\n\n\tprevToken := p.nextToken\n\tp.nextToken = nil\n\tif result.IsTruncated != nil && *result.IsTruncated {\n\t\tp.nextToken = result.NextPartNumberMarker\n\t}\n\n\tif p.options.StopOnDuplicateToken &&\n\t\tprevToken != nil &&\n\t\tp.nextToken != nil &&\n\t\t*prevToken == *p.nextToken {\n\t\tp.nextToken = nil\n\t}\n\n\treturn result, nil\n}\n\nfunc (v *ListPartsInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\n// ListPartsAPIClient is a client that implements the ListParts operation.\ntype ListPartsAPIClient interface {\n\tListParts(context.Context, *ListPartsInput, ...func(*Options)) (*ListPartsOutput, error)\n}\n\nvar _ ListPartsAPIClient = (*Client)(nil)\n\nfunc newServiceMetadataMiddleware_opListParts(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"ListParts\",\n\t}\n}\n\n// getListPartsBucketMember returns a pointer to string denoting a provided bucket\n// member valueand a boolean indicating if the input has a modeled bucket name,\nfunc getListPartsBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*ListPartsInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addListPartsUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getListPartsBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketAccelerateConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Sets the accelerate configuration of an existing bucket. Amazon S3 Transfer\n// Acceleration is a bucket-level feature that enables you to perform faster data\n// transfers to Amazon S3.\n//\n// To use this operation, you must have permission to perform the\n// s3:PutAccelerateConfiguration action. The bucket owner has this permission by\n// default. The bucket owner can grant this permission to others. For more\n// information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources].\n//\n// The Transfer Acceleration state of a bucket can be set to one of the following\n// two values:\n//\n//   - Enabled – Enables accelerated data transfers to the bucket.\n//\n//   - Suspended – Disables accelerated data transfers to the bucket.\n//\n// The [GetBucketAccelerateConfiguration] action returns the transfer acceleration state of a bucket.\n//\n// After setting the Transfer Acceleration state of a bucket to Enabled, it might\n// take up to thirty minutes before the data transfer rates to the bucket increase.\n//\n// The name of the bucket used for Transfer Acceleration must be DNS-compliant and\n// must not contain periods (\".\").\n//\n// For more information about transfer acceleration, see [Transfer Acceleration].\n//\n// The following operations are related to PutBucketAccelerateConfiguration :\n//\n// [GetBucketAccelerateConfiguration]\n//\n// [CreateBucket]\n//\n// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [Transfer Acceleration]: https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html\n// [GetBucketAccelerateConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketAccelerateConfiguration.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\n// [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\nfunc (c *Client) PutBucketAccelerateConfiguration(ctx context.Context, params *PutBucketAccelerateConfigurationInput, optFns ...func(*Options)) (*PutBucketAccelerateConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &PutBucketAccelerateConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutBucketAccelerateConfiguration\", params, optFns, c.addOperationPutBucketAccelerateConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutBucketAccelerateConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutBucketAccelerateConfigurationInput struct {\n\n\t// Container for setting the transfer acceleration state.\n\t//\n\t// This member is required.\n\tAccelerateConfiguration *types.AccelerateConfiguration\n\n\t// The name of the bucket for which the accelerate configuration is set.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Indicates the algorithm used to create the checksum for the request when you\n\t// use the SDK. This header will not provide any additional functionality if you\n\t// don't use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutBucketAccelerateConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutBucketAccelerateConfigurationOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutBucketAccelerateConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketAccelerateConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketAccelerateConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutBucketAccelerateConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutBucketAccelerateConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketAccelerateConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketAccelerateConfigurationInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketAccelerateConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutBucketAccelerateConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutBucketAccelerateConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutBucketAccelerateConfiguration\",\n\t}\n}\n\n// getPutBucketAccelerateConfigurationRequestAlgorithmMember gets the request\n// checksum algorithm value provided as input.\nfunc getPutBucketAccelerateConfigurationRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutBucketAccelerateConfigurationInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutBucketAccelerateConfigurationInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutBucketAccelerateConfigurationRequestAlgorithmMember,\n\t\tRequireChecksum:                  false,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutBucketAccelerateConfigurationBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getPutBucketAccelerateConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutBucketAccelerateConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutBucketAccelerateConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutBucketAccelerateConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketAcl.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Sets the permissions on an existing bucket using access control lists (ACL).\n// For more information, see [Using ACLs]. To set the ACL of a bucket, you must have the\n// WRITE_ACP permission.\n//\n// You can use one of the following two ways to set a bucket's permissions:\n//\n//   - Specify the ACL in the request body\n//\n//   - Specify permissions using request headers\n//\n// You cannot specify access permission using both the body and the request\n// headers.\n//\n// Depending on your application needs, you may choose to set the ACL on a bucket\n// using either the request body or the headers. For example, if you have an\n// existing application that updates a bucket ACL using the request body, then you\n// can continue to use that approach.\n//\n// If your bucket uses the bucket owner enforced setting for S3 Object Ownership,\n// ACLs are disabled and no longer affect permissions. You must use policies to\n// grant access to your bucket and the objects in it. Requests to set ACLs or\n// update ACLs fail and return the AccessControlListNotSupported error code.\n// Requests to read ACLs are still supported. For more information, see [Controlling object ownership]in the\n// Amazon S3 User Guide.\n//\n// Permissions You can set access permissions by using one of the following\n// methods:\n//\n//   - Specify a canned ACL with the x-amz-acl request header. Amazon S3 supports a\n//     set of predefined ACLs, known as canned ACLs. Each canned ACL has a predefined\n//     set of grantees and permissions. Specify the canned ACL name as the value of\n//     x-amz-acl . If you use this header, you cannot use other access\n//     control-specific headers in your request. For more information, see [Canned ACL].\n//\n//   - Specify access permissions explicitly with the x-amz-grant-read ,\n//     x-amz-grant-read-acp , x-amz-grant-write-acp , and x-amz-grant-full-control\n//     headers. When using these headers, you specify explicit access permissions and\n//     grantees (Amazon Web Services accounts or Amazon S3 groups) who will receive the\n//     permission. If you use these ACL-specific headers, you cannot use the\n//     x-amz-acl header to set a canned ACL. These parameters map to the set of\n//     permissions that Amazon S3 supports in an ACL. For more information, see [Access Control List (ACL) Overview].\n//\n// You specify each grantee as a type=value pair, where the type is one of the\n//\n//\tfollowing:\n//\n//\t- id – if the value specified is the canonical user ID of an Amazon Web\n//\tServices account\n//\n//\t- uri – if you are granting permissions to a predefined group\n//\n//\t- emailAddress – if the value specified is the email address of an Amazon Web\n//\tServices account\n//\n// Using email addresses to specify a grantee is only supported in the following\n//\n//\tAmazon Web Services Regions:\n//\n//\t- US East (N. Virginia)\n//\n//\t- US West (N. California)\n//\n//\t- US West (Oregon)\n//\n//\t- Asia Pacific (Singapore)\n//\n//\t- Asia Pacific (Sydney)\n//\n//\t- Asia Pacific (Tokyo)\n//\n//\t- Europe (Ireland)\n//\n//\t- South America (São Paulo)\n//\n// For a list of all the Amazon S3 supported Regions and endpoints, see [Regions and Endpoints]in the\n//\n//\tAmazon Web Services General Reference.\n//\n// For example, the following x-amz-grant-write header grants create, overwrite,\n//\n//\tand delete objects permission to LogDelivery group predefined by Amazon S3 and\n//\ttwo Amazon Web Services accounts identified by their email addresses.\n//\n// x-amz-grant-write: uri=\"http://acs.amazonaws.com/groups/s3/LogDelivery\",\n//\n//\tid=\"111122223333\", id=\"555566667777\"\n//\n// You can use either a canned ACL or specify access permissions explicitly. You\n// cannot do both.\n//\n// Grantee Values You can specify the person (grantee) to whom you're assigning\n// access rights (using request elements) in the following ways:\n//\n//   - By the person's ID:\n//\n// <>ID<><>GranteesEmail<>\n//\n// DisplayName is optional and ignored in the request\n//\n//   - By URI:\n//\n// <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n//\n//   - By Email address:\n//\n// <>Grantees@email.com<>&\n//\n// The grantee is resolved to the CanonicalUser and, in a response to a GET Object\n//\n//\tacl request, appears as the CanonicalUser.\n//\n// Using email addresses to specify a grantee is only supported in the following\n//\n//\tAmazon Web Services Regions:\n//\n//\t- US East (N. Virginia)\n//\n//\t- US West (N. California)\n//\n//\t- US West (Oregon)\n//\n//\t- Asia Pacific (Singapore)\n//\n//\t- Asia Pacific (Sydney)\n//\n//\t- Asia Pacific (Tokyo)\n//\n//\t- Europe (Ireland)\n//\n//\t- South America (São Paulo)\n//\n// For a list of all the Amazon S3 supported Regions and endpoints, see [Regions and Endpoints]in the\n//\n//\tAmazon Web Services General Reference.\n//\n// The following operations are related to PutBucketAcl :\n//\n// [CreateBucket]\n//\n// [DeleteBucket]\n//\n// [GetObjectAcl]\n//\n// [Regions and Endpoints]: https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\n// [Access Control List (ACL) Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html\n// [Controlling object ownership]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html\n// [DeleteBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html\n// [Using ACLs]: https://docs.aws.amazon.com/AmazonS3/latest/dev/S3_ACLs_UsingACLs.html\n// [Canned ACL]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#CannedACL\n// [GetObjectAcl]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAcl.html\n// [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\nfunc (c *Client) PutBucketAcl(ctx context.Context, params *PutBucketAclInput, optFns ...func(*Options)) (*PutBucketAclOutput, error) {\n\tif params == nil {\n\t\tparams = &PutBucketAclInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutBucketAcl\", params, optFns, c.addOperationPutBucketAclMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutBucketAclOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutBucketAclInput struct {\n\n\t// The bucket to which to apply the ACL.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The canned ACL to apply to the bucket.\n\tACL types.BucketCannedACL\n\n\t// Contains the elements that set the ACL permissions for an object per grantee.\n\tAccessControlPolicy *types.AccessControlPolicy\n\n\t// Indicates the algorithm used to create the checksum for the request when you\n\t// use the SDK. This header will not provide any additional functionality if you\n\t// don't use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The Base64 encoded 128-bit MD5 digest of the data. This header must be used as\n\t// a message integrity check to verify that the request body was not corrupted in\n\t// transit. For more information, go to [RFC 1864.]\n\t//\n\t// For requests made using the Amazon Web Services Command Line Interface (CLI) or\n\t// Amazon Web Services SDKs, this field is calculated automatically.\n\t//\n\t// [RFC 1864.]: http://www.ietf.org/rfc/rfc1864.txt\n\tContentMD5 *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Allows grantee the read, write, read ACP, and write ACP permissions on the\n\t// bucket.\n\tGrantFullControl *string\n\n\t// Allows grantee to list the objects in the bucket.\n\tGrantRead *string\n\n\t// Allows grantee to read the bucket ACL.\n\tGrantReadACP *string\n\n\t// Allows grantee to create new objects in the bucket.\n\t//\n\t// For the bucket and object owners of existing objects, also allows deletions and\n\t// overwrites of those objects.\n\tGrantWrite *string\n\n\t// Allows grantee to write the ACL for the applicable bucket.\n\tGrantWriteACP *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutBucketAclInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutBucketAclOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutBucketAclMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketAcl{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketAcl{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutBucketAcl\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutBucketAclValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketAcl(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketAclInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketAclUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutBucketAclInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutBucketAcl(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutBucketAcl\",\n\t}\n}\n\n// getPutBucketAclRequestAlgorithmMember gets the request checksum algorithm value\n// provided as input.\nfunc getPutBucketAclRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutBucketAclInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutBucketAclInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutBucketAclRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutBucketAclBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getPutBucketAclBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutBucketAclInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutBucketAclUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutBucketAclBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketAnalyticsConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Sets an analytics configuration for the bucket (specified by the analytics\n// configuration ID). You can have up to 1,000 analytics configurations per bucket.\n//\n// You can choose to have storage class analysis export analysis reports sent to a\n// comma-separated values (CSV) flat file. See the DataExport request element.\n// Reports are updated daily and are based on the object filters that you\n// configure. When selecting data export, you specify a destination bucket and an\n// optional destination prefix where the file is written. You can export the data\n// to a destination bucket in a different account. However, the destination bucket\n// must be in the same Region as the bucket that you are making the PUT analytics\n// configuration to. For more information, see [Amazon S3 Analytics – Storage Class Analysis].\n//\n// You must create a bucket policy on the destination bucket where the exported\n// file is written to grant permissions to Amazon S3 to write objects to the\n// bucket. For an example policy, see [Granting Permissions for Amazon S3 Inventory and Storage Class Analysis].\n//\n// To use this operation, you must have permissions to perform the\n// s3:PutAnalyticsConfiguration action. The bucket owner has this permission by\n// default. The bucket owner can grant this permission to others. For more\n// information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources].\n//\n// PutBucketAnalyticsConfiguration has the following special errors:\n//\n//   - HTTP Error: HTTP 400 Bad Request\n//\n//   - Code: InvalidArgument\n//\n//   - Cause: Invalid argument.\n//\n//   - HTTP Error: HTTP 400 Bad Request\n//\n//   - Code: TooManyConfigurations\n//\n//   - Cause: You are attempting to create a new configuration but have already\n//     reached the 1,000-configuration limit.\n//\n//   - HTTP Error: HTTP 403 Forbidden\n//\n//   - Code: AccessDenied\n//\n//   - Cause: You are not the owner of the specified bucket, or you do not have\n//     the s3:PutAnalyticsConfiguration bucket permission to set the configuration on\n//     the bucket.\n//\n// The following operations are related to PutBucketAnalyticsConfiguration :\n//\n// [GetBucketAnalyticsConfiguration]\n//\n// [DeleteBucketAnalyticsConfiguration]\n//\n// [ListBucketAnalyticsConfigurations]\n//\n// [Amazon S3 Analytics – Storage Class Analysis]: https://docs.aws.amazon.com/AmazonS3/latest/dev/analytics-storage-class.html\n// [Granting Permissions for Amazon S3 Inventory and Storage Class Analysis]: https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html#example-bucket-policies-use-case-9\n// [DeleteBucketAnalyticsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketAnalyticsConfiguration.html\n// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [GetBucketAnalyticsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketAnalyticsConfiguration.html\n// [ListBucketAnalyticsConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketAnalyticsConfigurations.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\nfunc (c *Client) PutBucketAnalyticsConfiguration(ctx context.Context, params *PutBucketAnalyticsConfigurationInput, optFns ...func(*Options)) (*PutBucketAnalyticsConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &PutBucketAnalyticsConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutBucketAnalyticsConfiguration\", params, optFns, c.addOperationPutBucketAnalyticsConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutBucketAnalyticsConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutBucketAnalyticsConfigurationInput struct {\n\n\t// The configuration and any analyses for the analytics filter.\n\t//\n\t// This member is required.\n\tAnalyticsConfiguration *types.AnalyticsConfiguration\n\n\t// The name of the bucket to which an analytics configuration is stored.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The ID that identifies the analytics configuration.\n\t//\n\t// This member is required.\n\tId *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutBucketAnalyticsConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutBucketAnalyticsConfigurationOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutBucketAnalyticsConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketAnalyticsConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketAnalyticsConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutBucketAnalyticsConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutBucketAnalyticsConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketAnalyticsConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketAnalyticsConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutBucketAnalyticsConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutBucketAnalyticsConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutBucketAnalyticsConfiguration\",\n\t}\n}\n\n// getPutBucketAnalyticsConfigurationBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getPutBucketAnalyticsConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutBucketAnalyticsConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutBucketAnalyticsConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutBucketAnalyticsConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketCors.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Sets the cors configuration for your bucket. If the configuration exists,\n// Amazon S3 replaces it.\n//\n// To use this operation, you must be allowed to perform the s3:PutBucketCORS\n// action. By default, the bucket owner has this permission and can grant it to\n// others.\n//\n// You set this configuration on a bucket so that the bucket can service\n// cross-origin requests. For example, you might want to enable a request whose\n// origin is http://www.example.com to access your Amazon S3 bucket at\n// my.example.bucket.com by using the browser's XMLHttpRequest capability.\n//\n// To enable cross-origin resource sharing (CORS) on a bucket, you add the cors\n// subresource to the bucket. The cors subresource is an XML document in which you\n// configure rules that identify origins and the HTTP methods that can be executed\n// on your bucket. The document is limited to 64 KB in size.\n//\n// When Amazon S3 receives a cross-origin request (or a pre-flight OPTIONS\n// request) against a bucket, it evaluates the cors configuration on the bucket\n// and uses the first CORSRule rule that matches the incoming browser request to\n// enable a cross-origin request. For a rule to match, the following conditions\n// must be met:\n//\n//   - The request's Origin header must match AllowedOrigin elements.\n//\n//   - The request method (for example, GET, PUT, HEAD, and so on) or the\n//     Access-Control-Request-Method header in case of a pre-flight OPTIONS request\n//     must be one of the AllowedMethod elements.\n//\n//   - Every header specified in the Access-Control-Request-Headers request header\n//     of a pre-flight request must match an AllowedHeader element.\n//\n// For more information about CORS, go to [Enabling Cross-Origin Resource Sharing] in the Amazon S3 User Guide.\n//\n// The following operations are related to PutBucketCors :\n//\n// [GetBucketCors]\n//\n// [DeleteBucketCors]\n//\n// [RESTOPTIONSobject]\n//\n// [GetBucketCors]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketCors.html\n// [Enabling Cross-Origin Resource Sharing]: https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html\n// [RESTOPTIONSobject]: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTOPTIONSobject.html\n// [DeleteBucketCors]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketCors.html\nfunc (c *Client) PutBucketCors(ctx context.Context, params *PutBucketCorsInput, optFns ...func(*Options)) (*PutBucketCorsOutput, error) {\n\tif params == nil {\n\t\tparams = &PutBucketCorsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutBucketCors\", params, optFns, c.addOperationPutBucketCorsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutBucketCorsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutBucketCorsInput struct {\n\n\t// Specifies the bucket impacted by the cors configuration.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Describes the cross-origin access configuration for objects in an Amazon S3\n\t// bucket. For more information, see [Enabling Cross-Origin Resource Sharing]in the Amazon S3 User Guide.\n\t//\n\t// [Enabling Cross-Origin Resource Sharing]: https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html\n\t//\n\t// This member is required.\n\tCORSConfiguration *types.CORSConfiguration\n\n\t// Indicates the algorithm used to create the checksum for the request when you\n\t// use the SDK. This header will not provide any additional functionality if you\n\t// don't use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The Base64 encoded 128-bit MD5 digest of the data. This header must be used as\n\t// a message integrity check to verify that the request body was not corrupted in\n\t// transit. For more information, go to [RFC 1864.]\n\t//\n\t// For requests made using the Amazon Web Services Command Line Interface (CLI) or\n\t// Amazon Web Services SDKs, this field is calculated automatically.\n\t//\n\t// [RFC 1864.]: http://www.ietf.org/rfc/rfc1864.txt\n\tContentMD5 *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutBucketCorsInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutBucketCorsOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutBucketCorsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketCors{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketCors{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutBucketCors\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutBucketCorsValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketCors(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketCorsInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketCorsUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutBucketCorsInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutBucketCors(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutBucketCors\",\n\t}\n}\n\n// getPutBucketCorsRequestAlgorithmMember gets the request checksum algorithm\n// value provided as input.\nfunc getPutBucketCorsRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutBucketCorsInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutBucketCorsInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutBucketCorsRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutBucketCorsBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getPutBucketCorsBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutBucketCorsInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutBucketCorsUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutBucketCorsBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketEncryption.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation configures default encryption and Amazon S3 Bucket Keys for an\n// existing bucket.\n//\n// Directory buckets - For directory buckets, you must make requests for this API\n// operation to the Regional endpoint. These endpoints support path-style requests\n// in the format https://s3express-control.region-code.amazonaws.com/bucket-name .\n// Virtual-hosted-style requests aren't supported. For more information about\n// endpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more\n// information about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// By default, all buckets have a default encryption configuration that uses\n// server-side encryption with Amazon S3 managed keys (SSE-S3).\n//\n//   - General purpose buckets\n//\n//   - You can optionally configure default encryption for a bucket by using\n//     server-side encryption with Key Management Service (KMS) keys (SSE-KMS) or\n//     dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS).\n//     If you specify default encryption by using SSE-KMS, you can also configure [Amazon S3 Bucket Keys].\n//     For information about the bucket default encryption feature, see [Amazon S3 Bucket Default Encryption]in the\n//     Amazon S3 User Guide.\n//\n//   - If you use PutBucketEncryption to set your [default bucket encryption]to SSE-KMS, you should verify\n//     that your KMS key ID is correct. Amazon S3 doesn't validate the KMS key ID\n//     provided in PutBucketEncryption requests.\n//\n//   - Directory buckets - You can optionally configure default encryption for a\n//     bucket by using server-side encryption with Key Management Service (KMS) keys\n//     (SSE-KMS).\n//\n//   - We recommend that the bucket's default encryption uses the desired\n//     encryption configuration and you don't override the bucket default encryption in\n//     your CreateSession requests or PUT object requests. Then, new objects are\n//     automatically encrypted with the desired encryption settings. For more\n//     information about the encryption overriding behaviors in directory buckets, see [Specifying server-side encryption with KMS for new object uploads]\n//     .\n//\n//   - Your SSE-KMS configuration can only support 1 [customer managed key]per directory bucket's\n//     lifetime. The [Amazon Web Services managed key]( aws/s3 ) isn't supported.\n//\n//   - S3 Bucket Keys are always enabled for GET and PUT operations in a directory\n//     bucket and can’t be disabled. S3 Bucket Keys aren't supported, when you copy\n//     SSE-KMS encrypted objects from general purpose buckets to directory buckets,\n//     from directory buckets to general purpose buckets, or between directory buckets,\n//     through [CopyObject], [UploadPartCopy], [the Copy operation in Batch Operations], or [the import jobs]. In this case, Amazon S3 makes a call to KMS every time a\n//     copy request is made for a KMS-encrypted object.\n//\n//   - When you specify an [KMS customer managed key]for encryption in your directory bucket, only use the\n//     key ID or key ARN. The key alias format of the KMS key isn't supported.\n//\n//   - For directory buckets, if you use PutBucketEncryption to set your [default bucket encryption]to\n//     SSE-KMS, Amazon S3 validates the KMS key ID provided in PutBucketEncryption\n//     requests.\n//\n// If you're specifying a customer managed KMS key, we recommend using a fully\n// qualified KMS key ARN. If you use a KMS key alias instead, then KMS resolves the\n// key within the requester’s account. This behavior can result in data that's\n// encrypted with a KMS key that belongs to the requester, and not the bucket\n// owner.\n//\n// Also, this action requires Amazon Web Services Signature Version 4. For more\n// information, see [Authenticating Requests (Amazon Web Services Signature Version 4)].\n//\n// Permissions\n//\n//   - General purpose bucket permissions - The s3:PutEncryptionConfiguration\n//     permission is required in a policy. The bucket owner has this permission by\n//     default. The bucket owner can grant this permission to others. For more\n//     information about permissions, see [Permissions Related to Bucket Operations]and [Managing Access Permissions to Your Amazon S3 Resources]in the Amazon S3 User Guide.\n//\n//   - Directory bucket permissions - To grant access to this API operation, you\n//     must have the s3express:PutEncryptionConfiguration permission in an IAM\n//     identity-based policy instead of a bucket policy. Cross-account access to this\n//     API operation isn't supported. This operation can only be performed by the\n//     Amazon Web Services account that owns the resource. For more information about\n//     directory bucket policies and permissions, see [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]in the Amazon S3 User Guide.\n//\n// To set a directory bucket default encryption with SSE-KMS, you must also have\n//\n//\tthe kms:GenerateDataKey and the kms:Decrypt permissions in IAM identity-based\n//\tpolicies and KMS key policies for the target KMS key.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// s3express-control.region-code.amazonaws.com .\n//\n// The following operations are related to PutBucketEncryption :\n//\n// [GetBucketEncryption]\n//\n// [DeleteBucketEncryption]\n//\n// [Specifying server-side encryption with KMS for new object uploads]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [KMS customer managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\n// [Amazon S3 Bucket Default Encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html\n// [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\n// [Permissions Related to Bucket Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\n// [Amazon Web Services managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\n// [Authenticating Requests (Amazon Web Services Signature Version 4)]: https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html\n// [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\n// [Amazon S3 Bucket Keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-key.html\n// [GetBucketEncryption]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketEncryption.html\n// [DeleteBucketEncryption]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketEncryption.html\n// [customer managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\n// [default bucket encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html\n// [the import jobs]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-import-job\n// [the Copy operation in Batch Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-Batch-Ops\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\nfunc (c *Client) PutBucketEncryption(ctx context.Context, params *PutBucketEncryptionInput, optFns ...func(*Options)) (*PutBucketEncryptionOutput, error) {\n\tif params == nil {\n\t\tparams = &PutBucketEncryptionInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutBucketEncryption\", params, optFns, c.addOperationPutBucketEncryptionMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutBucketEncryptionOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutBucketEncryptionInput struct {\n\n\t// Specifies default encryption for a bucket using server-side encryption with\n\t// different key options.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use path-style requests in the format\n\t// https://s3express-control.region-code.amazonaws.com/bucket-name .\n\t// Virtual-hosted-style requests aren't supported. Directory bucket names must be\n\t// unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must\n\t// also follow the format bucket-base-name--zone-id--x-s3 (for example,\n\t// DOC-EXAMPLE-BUCKET--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Specifies the default server-side-encryption configuration.\n\t//\n\t// This member is required.\n\tServerSideEncryptionConfiguration *types.ServerSideEncryptionConfiguration\n\n\t// Indicates the algorithm used to create the checksum for the request when you\n\t// use the SDK. This header will not provide any additional functionality if you\n\t// don't use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// For directory buckets, when you use Amazon Web Services SDKs, CRC32 is the\n\t// default checksum algorithm that's used for performance.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The Base64 encoded 128-bit MD5 digest of the server-side encryption\n\t// configuration.\n\t//\n\t// For requests made using the Amazon Web Services Command Line Interface (CLI) or\n\t// Amazon Web Services SDKs, this field is calculated automatically.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tContentMD5 *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\t//\n\t// For directory buckets, this header is not supported in this API operation. If\n\t// you specify this header, the request fails with the HTTP status code 501 Not\n\t// Implemented .\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutBucketEncryptionInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutBucketEncryptionOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutBucketEncryptionMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketEncryption{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketEncryption{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutBucketEncryption\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutBucketEncryptionValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketEncryption(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketEncryptionInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketEncryptionUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutBucketEncryptionInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutBucketEncryption(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutBucketEncryption\",\n\t}\n}\n\n// getPutBucketEncryptionRequestAlgorithmMember gets the request checksum\n// algorithm value provided as input.\nfunc getPutBucketEncryptionRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutBucketEncryptionInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutBucketEncryptionInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutBucketEncryptionRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutBucketEncryptionBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getPutBucketEncryptionBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutBucketEncryptionInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutBucketEncryptionUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutBucketEncryptionBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketIntelligentTieringConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Puts a S3 Intelligent-Tiering configuration to the specified bucket. You can\n// have up to 1,000 S3 Intelligent-Tiering configurations per bucket.\n//\n// The S3 Intelligent-Tiering storage class is designed to optimize storage costs\n// by automatically moving data to the most cost-effective storage access tier,\n// without performance impact or operational overhead. S3 Intelligent-Tiering\n// delivers automatic cost savings in three low latency and high throughput access\n// tiers. To get the lowest storage cost on data that can be accessed in minutes to\n// hours, you can choose to activate additional archiving capabilities.\n//\n// The S3 Intelligent-Tiering storage class is the ideal storage class for data\n// with unknown, changing, or unpredictable access patterns, independent of object\n// size or retention period. If the size of an object is less than 128 KB, it is\n// not monitored and not eligible for auto-tiering. Smaller objects can be stored,\n// but they are always charged at the Frequent Access tier rates in the S3\n// Intelligent-Tiering storage class.\n//\n// For more information, see [Storage class for automatically optimizing frequently and infrequently accessed objects].\n//\n// Operations related to PutBucketIntelligentTieringConfiguration include:\n//\n// [DeleteBucketIntelligentTieringConfiguration]\n//\n// [GetBucketIntelligentTieringConfiguration]\n//\n// [ListBucketIntelligentTieringConfigurations]\n//\n// You only need S3 Intelligent-Tiering enabled on a bucket if you want to\n// automatically move objects stored in the S3 Intelligent-Tiering storage class to\n// the Archive Access or Deep Archive Access tier.\n//\n// PutBucketIntelligentTieringConfiguration has the following special errors:\n//\n// HTTP 400 Bad Request Error  Code: InvalidArgument\n//\n// Cause: Invalid Argument\n//\n// HTTP 400 Bad Request Error  Code: TooManyConfigurations\n//\n// Cause: You are attempting to create a new configuration but have already\n// reached the 1,000-configuration limit.\n//\n// HTTP 403 Forbidden Error  Cause: You are not the owner of the specified bucket,\n// or you do not have the s3:PutIntelligentTieringConfiguration bucket permission\n// to set the configuration on the bucket.\n//\n// [ListBucketIntelligentTieringConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketIntelligentTieringConfigurations.html\n// [GetBucketIntelligentTieringConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketIntelligentTieringConfiguration.html\n// [Storage class for automatically optimizing frequently and infrequently accessed objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html#sc-dynamic-data-access\n// [DeleteBucketIntelligentTieringConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketIntelligentTieringConfiguration.html\nfunc (c *Client) PutBucketIntelligentTieringConfiguration(ctx context.Context, params *PutBucketIntelligentTieringConfigurationInput, optFns ...func(*Options)) (*PutBucketIntelligentTieringConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &PutBucketIntelligentTieringConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutBucketIntelligentTieringConfiguration\", params, optFns, c.addOperationPutBucketIntelligentTieringConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutBucketIntelligentTieringConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutBucketIntelligentTieringConfigurationInput struct {\n\n\t// The name of the Amazon S3 bucket whose configuration you want to modify or\n\t// retrieve.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The ID used to identify the S3 Intelligent-Tiering configuration.\n\t//\n\t// This member is required.\n\tId *string\n\n\t// Container for S3 Intelligent-Tiering configuration.\n\t//\n\t// This member is required.\n\tIntelligentTieringConfiguration *types.IntelligentTieringConfiguration\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutBucketIntelligentTieringConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutBucketIntelligentTieringConfigurationOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutBucketIntelligentTieringConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketIntelligentTieringConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketIntelligentTieringConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutBucketIntelligentTieringConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutBucketIntelligentTieringConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketIntelligentTieringConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketIntelligentTieringConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutBucketIntelligentTieringConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutBucketIntelligentTieringConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutBucketIntelligentTieringConfiguration\",\n\t}\n}\n\n// getPutBucketIntelligentTieringConfigurationBucketMember returns a pointer to\n// string denoting a provided bucket member valueand a boolean indicating if the\n// input has a modeled bucket name,\nfunc getPutBucketIntelligentTieringConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutBucketIntelligentTieringConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutBucketIntelligentTieringConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutBucketIntelligentTieringConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketInventoryConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// This implementation of the PUT action adds an inventory configuration\n// (identified by the inventory ID) to the bucket. You can have up to 1,000\n// inventory configurations per bucket.\n//\n// Amazon S3 inventory generates inventories of the objects in the bucket on a\n// daily or weekly basis, and the results are published to a flat file. The bucket\n// that is inventoried is called the source bucket, and the bucket where the\n// inventory flat file is stored is called the destination bucket. The destination\n// bucket must be in the same Amazon Web Services Region as the source bucket.\n//\n// When you configure an inventory for a source bucket, you specify the\n// destination bucket where you want the inventory to be stored, and whether to\n// generate the inventory daily or weekly. You can also configure what object\n// metadata to include and whether to inventory all object versions or only current\n// versions. For more information, see [Amazon S3 Inventory]in the Amazon S3 User Guide.\n//\n// You must create a bucket policy on the destination bucket to grant permissions\n// to Amazon S3 to write objects to the bucket in the defined location. For an\n// example policy, see [Granting Permissions for Amazon S3 Inventory and Storage Class Analysis].\n//\n// Permissions To use this operation, you must have permission to perform the\n// s3:PutInventoryConfiguration action. The bucket owner has this permission by\n// default and can grant this permission to others.\n//\n// The s3:PutInventoryConfiguration permission allows a user to create an [S3 Inventory] report\n// that includes all object metadata fields available and to specify the\n// destination bucket to store the inventory. A user with read access to objects in\n// the destination bucket can also access all object metadata fields that are\n// available in the inventory report.\n//\n// To restrict access to an inventory report, see [Restricting access to an Amazon S3 Inventory report] in the Amazon S3 User Guide.\n// For more information about the metadata fields available in S3 Inventory, see [Amazon S3 Inventory lists]\n// in the Amazon S3 User Guide. For more information about permissions, see [Permissions related to bucket subresource operations]and [Identity and access management in Amazon S3]\n// in the Amazon S3 User Guide.\n//\n// PutBucketInventoryConfiguration has the following special errors:\n//\n// HTTP 400 Bad Request Error  Code: InvalidArgument\n//\n// Cause: Invalid Argument\n//\n// HTTP 400 Bad Request Error  Code: TooManyConfigurations\n//\n// Cause: You are attempting to create a new configuration but have already\n// reached the 1,000-configuration limit.\n//\n// HTTP 403 Forbidden Error  Cause: You are not the owner of the specified bucket,\n// or you do not have the s3:PutInventoryConfiguration bucket permission to set\n// the configuration on the bucket.\n//\n// The following operations are related to PutBucketInventoryConfiguration :\n//\n// [GetBucketInventoryConfiguration]\n//\n// [DeleteBucketInventoryConfiguration]\n//\n// [ListBucketInventoryConfigurations]\n//\n// [Granting Permissions for Amazon S3 Inventory and Storage Class Analysis]: https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html#example-bucket-policies-use-case-9\n// [Amazon S3 Inventory]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-inventory.html\n// [ListBucketInventoryConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketInventoryConfigurations.html\n// [S3 Inventory]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-inventory.html\n// [Permissions related to bucket subresource operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [DeleteBucketInventoryConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketInventoryConfiguration.html\n// [Identity and access management in Amazon S3]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\n// [Restricting access to an Amazon S3 Inventory report]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html#example-bucket-policies-use-case-10\n// [Amazon S3 Inventory lists]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-inventory.html#storage-inventory-contents\n// [GetBucketInventoryConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketInventoryConfiguration.html\nfunc (c *Client) PutBucketInventoryConfiguration(ctx context.Context, params *PutBucketInventoryConfigurationInput, optFns ...func(*Options)) (*PutBucketInventoryConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &PutBucketInventoryConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutBucketInventoryConfiguration\", params, optFns, c.addOperationPutBucketInventoryConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutBucketInventoryConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutBucketInventoryConfigurationInput struct {\n\n\t// The name of the bucket where the inventory configuration will be stored.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The ID used to identify the inventory configuration.\n\t//\n\t// This member is required.\n\tId *string\n\n\t// Specifies the inventory configuration.\n\t//\n\t// This member is required.\n\tInventoryConfiguration *types.InventoryConfiguration\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutBucketInventoryConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutBucketInventoryConfigurationOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutBucketInventoryConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketInventoryConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketInventoryConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutBucketInventoryConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutBucketInventoryConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketInventoryConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketInventoryConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutBucketInventoryConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutBucketInventoryConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutBucketInventoryConfiguration\",\n\t}\n}\n\n// getPutBucketInventoryConfigurationBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getPutBucketInventoryConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutBucketInventoryConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutBucketInventoryConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutBucketInventoryConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketLifecycleConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Creates a new lifecycle configuration for the bucket or replaces an existing\n// lifecycle configuration. Keep in mind that this will overwrite an existing\n// lifecycle configuration, so if you want to retain any configuration details,\n// they must be included in the new lifecycle configuration. For information about\n// lifecycle configuration, see [Managing your storage lifecycle].\n//\n// Bucket lifecycle configuration now supports specifying a lifecycle rule using\n// an object key name prefix, one or more object tags, object size, or any\n// combination of these. Accordingly, this section describes the latest API. The\n// previous version of the API supported filtering based only on an object key name\n// prefix, which is supported for backward compatibility. For the related API\n// description, see [PutBucketLifecycle].\n//\n// Rules Permissions HTTP Host header syntax You specify the lifecycle\n// configuration in your request body. The lifecycle configuration is specified as\n// XML consisting of one or more rules. An Amazon S3 Lifecycle configuration can\n// have up to 1,000 rules. This limit is not adjustable.\n//\n// Bucket lifecycle configuration supports specifying a lifecycle rule using an\n// object key name prefix, one or more object tags, object size, or any combination\n// of these. Accordingly, this section describes the latest API. The previous\n// version of the API supported filtering based only on an object key name prefix,\n// which is supported for backward compatibility for general purpose buckets. For\n// the related API description, see [PutBucketLifecycle].\n//\n// Lifecyle configurations for directory buckets only support expiring objects and\n// cancelling multipart uploads. Expiring of versioned objects,transitions and tag\n// filters are not supported.\n//\n// A lifecycle rule consists of the following:\n//\n//   - A filter identifying a subset of objects to which the rule applies. The\n//     filter can be based on a key name prefix, object tags, object size, or any\n//     combination of these.\n//\n//   - A status indicating whether the rule is in effect.\n//\n//   - One or more lifecycle transition and expiration actions that you want\n//     Amazon S3 to perform on the objects identified by the filter. If the state of\n//     your bucket is versioning-enabled or versioning-suspended, you can have many\n//     versions of the same object (one current version and zero or more noncurrent\n//     versions). Amazon S3 provides predefined actions that you can specify for\n//     current and noncurrent object versions.\n//\n// For more information, see [Object Lifecycle Management] and [Lifecycle Configuration Elements].\n//\n//   - General purpose bucket permissions - By default, all Amazon S3 resources\n//     are private, including buckets, objects, and related subresources (for example,\n//     lifecycle configuration and website configuration). Only the resource owner\n//     (that is, the Amazon Web Services account that created it) can access the\n//     resource. The resource owner can optionally grant access permissions to others\n//     by writing an access policy. For this operation, a user must have the\n//     s3:PutLifecycleConfiguration permission.\n//\n// You can also explicitly deny permissions. An explicit deny also supersedes any\n//\n//\tother permissions. If you want to block users or accounts from removing or\n//\tdeleting objects from your bucket, you must deny them permissions for the\n//\tfollowing actions:\n//\n//\t- s3:DeleteObject\n//\n//\t- s3:DeleteObjectVersion\n//\n//\t- s3:PutLifecycleConfiguration\n//\n// For more information about permissions, see [Managing Access Permissions to Your Amazon S3 Resources].\n//\n//   - Directory bucket permissions - You must have the\n//     s3express:PutLifecycleConfiguration permission in an IAM identity-based policy\n//     to use this operation. Cross-account access to this API operation isn't\n//     supported. The resource owner can optionally grant access permissions to others\n//     by creating a role or user for them as long as they are within the same account\n//     as the owner and resource.\n//\n// For more information about directory bucket policies and permissions, see [Authorizing Regional endpoint APIs with IAM]in\n//\n//\tthe Amazon S3 User Guide.\n//\n// Directory buckets - For directory buckets, you must make requests for this API\n//\n//\toperation to the Regional endpoint. These endpoints support path-style requests\n//\tin the format https://s3express-control.region-code.amazonaws.com/bucket-name\n//\t. Virtual-hosted-style requests aren't supported. For more information about\n//\tendpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more\n//\tinformation about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// Directory buckets - The HTTP Host header syntax is\n// s3express-control.region.amazonaws.com .\n//\n// The following operations are related to PutBucketLifecycleConfiguration :\n//\n// [GetBucketLifecycleConfiguration]\n//\n// [DeleteBucketLifecycle]\n//\n// [Object Lifecycle Management]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html\n// [Lifecycle Configuration Elements]: https://docs.aws.amazon.com/AmazonS3/latest/dev/intro-lifecycle-rules.html\n// [GetBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html\n// [Authorizing Regional endpoint APIs with IAM]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\n// [PutBucketLifecycle]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycle.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\n// [DeleteBucketLifecycle]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketLifecycle.html\n// [Managing your storage lifecycle]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html\n//\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\nfunc (c *Client) PutBucketLifecycleConfiguration(ctx context.Context, params *PutBucketLifecycleConfigurationInput, optFns ...func(*Options)) (*PutBucketLifecycleConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &PutBucketLifecycleConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutBucketLifecycleConfiguration\", params, optFns, c.addOperationPutBucketLifecycleConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutBucketLifecycleConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutBucketLifecycleConfigurationInput struct {\n\n\t// The name of the bucket for which to set the configuration.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Indicates the algorithm used to create the checksum for the request when you\n\t// use the SDK. This header will not provide any additional functionality if you\n\t// don't use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\t//\n\t// This parameter applies to general purpose buckets only. It is not supported for\n\t// directory bucket lifecycle configurations.\n\tExpectedBucketOwner *string\n\n\t// Container for lifecycle rules. You can add as many as 1,000 rules.\n\tLifecycleConfiguration *types.BucketLifecycleConfiguration\n\n\t// Indicates which default minimum object size behavior is applied to the\n\t// lifecycle configuration.\n\t//\n\t// This parameter applies to general purpose buckets only. It is not supported for\n\t// directory bucket lifecycle configurations.\n\t//\n\t//   - all_storage_classes_128K - Objects smaller than 128 KB will not transition\n\t//   to any storage class by default.\n\t//\n\t//   - varies_by_storage_class - Objects smaller than 128 KB will transition to\n\t//   Glacier Flexible Retrieval or Glacier Deep Archive storage classes. By default,\n\t//   all other storage classes will prevent transitions smaller than 128 KB.\n\t//\n\t// To customize the minimum object size for any transition you can add a filter\n\t// that specifies a custom ObjectSizeGreaterThan or ObjectSizeLessThan in the body\n\t// of your transition rule. Custom filters always take precedence over the default\n\t// transition behavior.\n\tTransitionDefaultMinimumObjectSize types.TransitionDefaultMinimumObjectSize\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutBucketLifecycleConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutBucketLifecycleConfigurationOutput struct {\n\n\t// Indicates which default minimum object size behavior is applied to the\n\t// lifecycle configuration.\n\t//\n\t// This parameter applies to general purpose buckets only. It is not supported for\n\t// directory bucket lifecycle configurations.\n\t//\n\t//   - all_storage_classes_128K - Objects smaller than 128 KB will not transition\n\t//   to any storage class by default.\n\t//\n\t//   - varies_by_storage_class - Objects smaller than 128 KB will transition to\n\t//   Glacier Flexible Retrieval or Glacier Deep Archive storage classes. By default,\n\t//   all other storage classes will prevent transitions smaller than 128 KB.\n\t//\n\t// To customize the minimum object size for any transition you can add a filter\n\t// that specifies a custom ObjectSizeGreaterThan or ObjectSizeLessThan in the body\n\t// of your transition rule. Custom filters always take precedence over the default\n\t// transition behavior.\n\tTransitionDefaultMinimumObjectSize types.TransitionDefaultMinimumObjectSize\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutBucketLifecycleConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketLifecycleConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketLifecycleConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutBucketLifecycleConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutBucketLifecycleConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketLifecycleConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketLifecycleConfigurationInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketLifecycleConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutBucketLifecycleConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutBucketLifecycleConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutBucketLifecycleConfiguration\",\n\t}\n}\n\n// getPutBucketLifecycleConfigurationRequestAlgorithmMember gets the request\n// checksum algorithm value provided as input.\nfunc getPutBucketLifecycleConfigurationRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutBucketLifecycleConfigurationInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutBucketLifecycleConfigurationInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutBucketLifecycleConfigurationRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutBucketLifecycleConfigurationBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getPutBucketLifecycleConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutBucketLifecycleConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutBucketLifecycleConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutBucketLifecycleConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketLogging.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Set the logging parameters for a bucket and to specify permissions for who can\n// view and modify the logging parameters. All logs are saved to buckets in the\n// same Amazon Web Services Region as the source bucket. To set the logging status\n// of a bucket, you must be the bucket owner.\n//\n// The bucket owner is automatically granted FULL_CONTROL to all logs. You use the\n// Grantee request element to grant access to other people. The Permissions\n// request element specifies the kind of access the grantee has to the logs.\n//\n// If the target bucket for log delivery uses the bucket owner enforced setting\n// for S3 Object Ownership, you can't use the Grantee request element to grant\n// access to others. Permissions can only be granted using policies. For more\n// information, see [Permissions for server access log delivery]in the Amazon S3 User Guide.\n//\n// Grantee Values You can specify the person (grantee) to whom you're assigning\n// access rights (by using request elements) in the following ways:\n//\n//   - By the person's ID:\n//\n// <>ID<><>GranteesEmail<>\n//\n// DisplayName is optional and ignored in the request.\n//\n//   - By Email address:\n//\n// <>Grantees@email.com<>\n//\n// The grantee is resolved to the CanonicalUser and, in a response to a\n//\n//\tGETObjectAcl request, appears as the CanonicalUser.\n//\n//\t- By URI:\n//\n// <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n//\n// To enable logging, you use LoggingEnabled and its children request elements. To\n// disable logging, you use an empty BucketLoggingStatus request element:\n//\n// For more information about server access logging, see [Server Access Logging] in the Amazon S3 User\n// Guide.\n//\n// For more information about creating a bucket, see [CreateBucket]. For more information about\n// returning the logging status of a bucket, see [GetBucketLogging].\n//\n// The following operations are related to PutBucketLogging :\n//\n// [PutObject]\n//\n// [DeleteBucket]\n//\n// [CreateBucket]\n//\n// [GetBucketLogging]\n//\n// [Permissions for server access log delivery]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-server-access-logging.html#grant-log-delivery-permissions-general\n// [DeleteBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html\n// [GetBucketLogging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLogging.html\n// [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\n// [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\n// [Server Access Logging]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerLogs.html\nfunc (c *Client) PutBucketLogging(ctx context.Context, params *PutBucketLoggingInput, optFns ...func(*Options)) (*PutBucketLoggingOutput, error) {\n\tif params == nil {\n\t\tparams = &PutBucketLoggingInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutBucketLogging\", params, optFns, c.addOperationPutBucketLoggingMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutBucketLoggingOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutBucketLoggingInput struct {\n\n\t// The name of the bucket for which to set the logging parameters.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Container for logging status information.\n\t//\n\t// This member is required.\n\tBucketLoggingStatus *types.BucketLoggingStatus\n\n\t// Indicates the algorithm used to create the checksum for the request when you\n\t// use the SDK. This header will not provide any additional functionality if you\n\t// don't use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The MD5 hash of the PutBucketLogging request body.\n\t//\n\t// For requests made using the Amazon Web Services Command Line Interface (CLI) or\n\t// Amazon Web Services SDKs, this field is calculated automatically.\n\tContentMD5 *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutBucketLoggingInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutBucketLoggingOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutBucketLoggingMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketLogging{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketLogging{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutBucketLogging\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutBucketLoggingValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketLogging(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketLoggingInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketLoggingUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutBucketLoggingInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutBucketLogging(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutBucketLogging\",\n\t}\n}\n\n// getPutBucketLoggingRequestAlgorithmMember gets the request checksum algorithm\n// value provided as input.\nfunc getPutBucketLoggingRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutBucketLoggingInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutBucketLoggingInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutBucketLoggingRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutBucketLoggingBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getPutBucketLoggingBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutBucketLoggingInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutBucketLoggingUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutBucketLoggingBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketMetricsConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Sets a metrics configuration (specified by the metrics configuration ID) for\n// the bucket. You can have up to 1,000 metrics configurations per bucket. If\n// you're updating an existing metrics configuration, note that this is a full\n// replacement of the existing metrics configuration. If you don't include the\n// elements you want to keep, they are erased.\n//\n// To use this operation, you must have permissions to perform the\n// s3:PutMetricsConfiguration action. The bucket owner has this permission by\n// default. The bucket owner can grant this permission to others. For more\n// information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources].\n//\n// For information about CloudWatch request metrics for Amazon S3, see [Monitoring Metrics with Amazon CloudWatch].\n//\n// The following operations are related to PutBucketMetricsConfiguration :\n//\n// [DeleteBucketMetricsConfiguration]\n//\n// [GetBucketMetricsConfiguration]\n//\n// [ListBucketMetricsConfigurations]\n//\n// PutBucketMetricsConfiguration has the following special error:\n//\n//   - Error code: TooManyConfigurations\n//\n//   - Description: You are attempting to create a new configuration but have\n//     already reached the 1,000-configuration limit.\n//\n//   - HTTP Status Code: HTTP 400 Bad Request\n//\n// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [Monitoring Metrics with Amazon CloudWatch]: https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html\n// [GetBucketMetricsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetricsConfiguration.html\n// [ListBucketMetricsConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketMetricsConfigurations.html\n// [DeleteBucketMetricsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetricsConfiguration.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\nfunc (c *Client) PutBucketMetricsConfiguration(ctx context.Context, params *PutBucketMetricsConfigurationInput, optFns ...func(*Options)) (*PutBucketMetricsConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &PutBucketMetricsConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutBucketMetricsConfiguration\", params, optFns, c.addOperationPutBucketMetricsConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutBucketMetricsConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutBucketMetricsConfigurationInput struct {\n\n\t// The name of the bucket for which the metrics configuration is set.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The ID used to identify the metrics configuration. The ID has a 64 character\n\t// limit and can only contain letters, numbers, periods, dashes, and underscores.\n\t//\n\t// This member is required.\n\tId *string\n\n\t// Specifies the metrics configuration.\n\t//\n\t// This member is required.\n\tMetricsConfiguration *types.MetricsConfiguration\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutBucketMetricsConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutBucketMetricsConfigurationOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutBucketMetricsConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketMetricsConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketMetricsConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutBucketMetricsConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutBucketMetricsConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketMetricsConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketMetricsConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutBucketMetricsConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutBucketMetricsConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutBucketMetricsConfiguration\",\n\t}\n}\n\n// getPutBucketMetricsConfigurationBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getPutBucketMetricsConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutBucketMetricsConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutBucketMetricsConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutBucketMetricsConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketNotificationConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Enables notifications of specified events for a bucket. For more information\n// about event notifications, see [Configuring Event Notifications].\n//\n// Using this API, you can replace an existing notification configuration. The\n// configuration is an XML file that defines the event types that you want Amazon\n// S3 to publish and the destination where you want Amazon S3 to publish an event\n// notification when it detects an event of the specified type.\n//\n// By default, your bucket has no event notifications configured. That is, the\n// notification configuration will be an empty NotificationConfiguration .\n//\n// This action replaces the existing notification configuration with the\n// configuration you include in the request body.\n//\n// After Amazon S3 receives this request, it first verifies that any Amazon Simple\n// Notification Service (Amazon SNS) or Amazon Simple Queue Service (Amazon SQS)\n// destination exists, and that the bucket owner has permission to publish to it by\n// sending a test notification. In the case of Lambda destinations, Amazon S3\n// verifies that the Lambda function permissions grant Amazon S3 permission to\n// invoke the function from the Amazon S3 bucket. For more information, see [Configuring Notifications for Amazon S3 Events].\n//\n// You can disable notifications by adding the empty NotificationConfiguration\n// element.\n//\n// For more information about the number of event notification configurations that\n// you can create per bucket, see [Amazon S3 service quotas]in Amazon Web Services General Reference.\n//\n// By default, only the bucket owner can configure notifications on a bucket.\n// However, bucket owners can use a bucket policy to grant permission to other\n// users to set this configuration with the required s3:PutBucketNotification\n// permission.\n//\n// The PUT notification is an atomic operation. For example, suppose your\n// notification configuration includes SNS topic, SQS queue, and Lambda function\n// configurations. When you send a PUT request with this configuration, Amazon S3\n// sends test messages to your SNS topic. If the message fails, the entire PUT\n// action will fail, and Amazon S3 will not add the configuration to your bucket.\n//\n// If the configuration in the request body includes only one TopicConfiguration\n// specifying only the s3:ReducedRedundancyLostObject event type, the response\n// will also include the x-amz-sns-test-message-id header containing the message\n// ID of the test notification sent to the topic.\n//\n// The following action is related to PutBucketNotificationConfiguration :\n//\n// [GetBucketNotificationConfiguration]\n//\n// [Configuring Notifications for Amazon S3 Events]: https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html\n// [Amazon S3 service quotas]: https://docs.aws.amazon.com/general/latest/gr/s3.html#limits_s3\n// [GetBucketNotificationConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketNotificationConfiguration.html\n// [Configuring Event Notifications]: https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html\nfunc (c *Client) PutBucketNotificationConfiguration(ctx context.Context, params *PutBucketNotificationConfigurationInput, optFns ...func(*Options)) (*PutBucketNotificationConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &PutBucketNotificationConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutBucketNotificationConfiguration\", params, optFns, c.addOperationPutBucketNotificationConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutBucketNotificationConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutBucketNotificationConfigurationInput struct {\n\n\t// The name of the bucket.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// A container for specifying the notification configuration of the bucket. If\n\t// this element is empty, notifications are turned off for the bucket.\n\t//\n\t// This member is required.\n\tNotificationConfiguration *types.NotificationConfiguration\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Skips validation of Amazon SQS, Amazon SNS, and Lambda destinations. True or\n\t// false value.\n\tSkipDestinationValidation *bool\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutBucketNotificationConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutBucketNotificationConfigurationOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutBucketNotificationConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketNotificationConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketNotificationConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutBucketNotificationConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutBucketNotificationConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketNotificationConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketNotificationConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutBucketNotificationConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutBucketNotificationConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutBucketNotificationConfiguration\",\n\t}\n}\n\n// getPutBucketNotificationConfigurationBucketMember returns a pointer to string\n// denoting a provided bucket member valueand a boolean indicating if the input has\n// a modeled bucket name,\nfunc getPutBucketNotificationConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutBucketNotificationConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutBucketNotificationConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutBucketNotificationConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketOwnershipControls.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Creates or modifies OwnershipControls for an Amazon S3 bucket. To use this\n// operation, you must have the s3:PutBucketOwnershipControls permission. For more\n// information about Amazon S3 permissions, see [Specifying permissions in a policy].\n//\n// For information about Amazon S3 Object Ownership, see [Using object ownership].\n//\n// The following operations are related to PutBucketOwnershipControls :\n//\n// # GetBucketOwnershipControls\n//\n// # DeleteBucketOwnershipControls\n//\n// [Specifying permissions in a policy]: https://docs.aws.amazon.com/AmazonS3/latest/user-guide/using-with-s3-actions.html\n// [Using object ownership]: https://docs.aws.amazon.com/AmazonS3/latest/user-guide/about-object-ownership.html\nfunc (c *Client) PutBucketOwnershipControls(ctx context.Context, params *PutBucketOwnershipControlsInput, optFns ...func(*Options)) (*PutBucketOwnershipControlsOutput, error) {\n\tif params == nil {\n\t\tparams = &PutBucketOwnershipControlsInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutBucketOwnershipControls\", params, optFns, c.addOperationPutBucketOwnershipControlsMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutBucketOwnershipControlsOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutBucketOwnershipControlsInput struct {\n\n\t// The name of the Amazon S3 bucket whose OwnershipControls you want to set.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The OwnershipControls (BucketOwnerEnforced, BucketOwnerPreferred, or\n\t// ObjectWriter) that you want to apply to this Amazon S3 bucket.\n\t//\n\t// This member is required.\n\tOwnershipControls *types.OwnershipControls\n\n\t// The MD5 hash of the OwnershipControls request body.\n\t//\n\t// For requests made using the Amazon Web Services Command Line Interface (CLI) or\n\t// Amazon Web Services SDKs, this field is calculated automatically.\n\tContentMD5 *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutBucketOwnershipControlsInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutBucketOwnershipControlsOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutBucketOwnershipControlsMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketOwnershipControls{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketOwnershipControls{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutBucketOwnershipControls\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutBucketOwnershipControlsValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketOwnershipControls(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketOwnershipControlsInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketOwnershipControlsUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutBucketOwnershipControlsInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutBucketOwnershipControls(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutBucketOwnershipControls\",\n\t}\n}\n\nfunc addPutBucketOwnershipControlsInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     nil,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutBucketOwnershipControlsBucketMember returns a pointer to string denoting\n// a provided bucket member valueand a boolean indicating if the input has a\n// modeled bucket name,\nfunc getPutBucketOwnershipControlsBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutBucketOwnershipControlsInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutBucketOwnershipControlsUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutBucketOwnershipControlsBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketPolicy.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// Applies an Amazon S3 bucket policy to an Amazon S3 bucket.\n//\n// Directory buckets - For directory buckets, you must make requests for this API\n// operation to the Regional endpoint. These endpoints support path-style requests\n// in the format https://s3express-control.region-code.amazonaws.com/bucket-name .\n// Virtual-hosted-style requests aren't supported. For more information about\n// endpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more\n// information about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// Permissions If you are using an identity other than the root user of the Amazon\n// Web Services account that owns the bucket, the calling identity must both have\n// the PutBucketPolicy permissions on the specified bucket and belong to the\n// bucket owner's account in order to use this operation.\n//\n// If you don't have PutBucketPolicy permissions, Amazon S3 returns a 403 Access\n// Denied error. If you have the correct permissions, but you're not using an\n// identity that belongs to the bucket owner's account, Amazon S3 returns a 405\n// Method Not Allowed error.\n//\n// To ensure that bucket owners don't inadvertently lock themselves out of their\n// own buckets, the root principal in a bucket owner's Amazon Web Services account\n// can perform the GetBucketPolicy , PutBucketPolicy , and DeleteBucketPolicy API\n// actions, even if their bucket policy explicitly denies the root principal's\n// access. Bucket owner root principals can only be blocked from performing these\n// API actions by VPC endpoint policies and Amazon Web Services Organizations\n// policies.\n//\n//   - General purpose bucket permissions - The s3:PutBucketPolicy permission is\n//     required in a policy. For more information about general purpose buckets bucket\n//     policies, see [Using Bucket Policies and User Policies]in the Amazon S3 User Guide.\n//\n//   - Directory bucket permissions - To grant access to this API operation, you\n//     must have the s3express:PutBucketPolicy permission in an IAM identity-based\n//     policy instead of a bucket policy. Cross-account access to this API operation\n//     isn't supported. This operation can only be performed by the Amazon Web Services\n//     account that owns the resource. For more information about directory bucket\n//     policies and permissions, see [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]in the Amazon S3 User Guide.\n//\n// Example bucket policies  General purpose buckets example bucket policies - See [Bucket policy examples]\n// in the Amazon S3 User Guide.\n//\n// Directory bucket example bucket policies - See [Example bucket policies for S3 Express One Zone] in the Amazon S3 User Guide.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// s3express-control.region-code.amazonaws.com .\n//\n// The following operations are related to PutBucketPolicy :\n//\n// [CreateBucket]\n//\n// [DeleteBucket]\n//\n// [Bucket policy examples]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [Example bucket policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-example-bucket-policies.html\n// [DeleteBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html\n// [Using Bucket Policies and User Policies]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html\n// [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n// [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\nfunc (c *Client) PutBucketPolicy(ctx context.Context, params *PutBucketPolicyInput, optFns ...func(*Options)) (*PutBucketPolicyOutput, error) {\n\tif params == nil {\n\t\tparams = &PutBucketPolicyInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutBucketPolicy\", params, optFns, c.addOperationPutBucketPolicyMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutBucketPolicyOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutBucketPolicyInput struct {\n\n\t// The name of the bucket.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use path-style requests in the format\n\t// https://s3express-control.region-code.amazonaws.com/bucket-name .\n\t// Virtual-hosted-style requests aren't supported. Directory bucket names must be\n\t// unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must\n\t// also follow the format bucket-base-name--zone-id--x-s3 (for example,\n\t// DOC-EXAMPLE-BUCKET--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The bucket policy as a JSON document.\n\t//\n\t// For directory buckets, the only IAM action supported in the bucket policy is\n\t// s3express:CreateSession .\n\t//\n\t// This member is required.\n\tPolicy *string\n\n\t// Indicates the algorithm used to create the checksum for the request when you\n\t// use the SDK. This header will not provide any additional functionality if you\n\t// don't use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum-algorithm or x-amz-trailer header sent. Otherwise, Amazon S3\n\t// fails the request with the HTTP status code 400 Bad Request .\n\t//\n\t// For the x-amz-checksum-algorithm  header, replace  algorithm  with the\n\t// supported algorithm from the following list:\n\t//\n\t//   - CRC32\n\t//\n\t//   - CRC32C\n\t//\n\t//   - CRC64NVME\n\t//\n\t//   - SHA1\n\t//\n\t//   - SHA256\n\t//\n\t// For more information, see [Checking object integrity] in the Amazon S3 User Guide.\n\t//\n\t// If the individual checksum value you provide through x-amz-checksum-algorithm\n\t// doesn't match the checksum algorithm you set through\n\t// x-amz-sdk-checksum-algorithm , Amazon S3 fails the request with a BadDigest\n\t// error.\n\t//\n\t// For directory buckets, when you use Amazon Web Services SDKs, CRC32 is the\n\t// default checksum algorithm that's used for performance.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// Set this parameter to true to confirm that you want to remove your permissions\n\t// to change this bucket policy in the future.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tConfirmRemoveSelfBucketAccess *bool\n\n\t// The MD5 hash of the request body.\n\t//\n\t// For requests made using the Amazon Web Services Command Line Interface (CLI) or\n\t// Amazon Web Services SDKs, this field is calculated automatically.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tContentMD5 *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\t//\n\t// For directory buckets, this header is not supported in this API operation. If\n\t// you specify this header, the request fails with the HTTP status code 501 Not\n\t// Implemented .\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutBucketPolicyInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutBucketPolicyOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutBucketPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketPolicy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutBucketPolicy\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutBucketPolicyValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketPolicy(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketPolicyInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketPolicyUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutBucketPolicyInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutBucketPolicy(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutBucketPolicy\",\n\t}\n}\n\n// getPutBucketPolicyRequestAlgorithmMember gets the request checksum algorithm\n// value provided as input.\nfunc getPutBucketPolicyRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutBucketPolicyInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutBucketPolicyInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutBucketPolicyRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutBucketPolicyBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getPutBucketPolicyBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutBucketPolicyInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutBucketPolicyUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutBucketPolicyBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketReplication.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Creates a replication configuration or replaces an existing one. For more\n// information, see [Replication]in the Amazon S3 User Guide.\n//\n// Specify the replication configuration in the request body. In the replication\n// configuration, you provide the name of the destination bucket or buckets where\n// you want Amazon S3 to replicate objects, the IAM role that Amazon S3 can assume\n// to replicate objects on your behalf, and other relevant information. You can\n// invoke this request for a specific Amazon Web Services Region by using the [aws:RequestedRegion]\n// aws:RequestedRegion condition key.\n//\n// A replication configuration must include at least one rule, and can contain a\n// maximum of 1,000. Each rule identifies a subset of objects to replicate by\n// filtering the objects in the source bucket. To choose additional subsets of\n// objects to replicate, add a rule for each subset.\n//\n// To specify a subset of the objects in the source bucket to apply a replication\n// rule to, add the Filter element as a child of the Rule element. You can filter\n// objects based on an object key prefix, one or more object tags, or both. When\n// you add the Filter element in the configuration, you must also add the following\n// elements: DeleteMarkerReplication , Status , and Priority .\n//\n// If you are using an earlier version of the replication configuration, Amazon S3\n// handles replication of delete markers differently. For more information, see [Backward Compatibility].\n//\n// For information about enabling versioning on a bucket, see [Using Versioning].\n//\n// Handling Replication of Encrypted Objects By default, Amazon S3 doesn't\n// replicate objects that are stored at rest using server-side encryption with KMS\n// keys. To replicate Amazon Web Services KMS-encrypted objects, add the following:\n// SourceSelectionCriteria , SseKmsEncryptedObjects , Status ,\n// EncryptionConfiguration , and ReplicaKmsKeyID . For information about\n// replication configuration, see [Replicating Objects Created with SSE Using KMS keys].\n//\n// For information on PutBucketReplication errors, see [List of replication-related error codes]\n//\n// Permissions To create a PutBucketReplication request, you must have\n// s3:PutReplicationConfiguration permissions for the bucket.\n//\n// By default, a resource owner, in this case the Amazon Web Services account that\n// created the bucket, can perform this operation. The resource owner can also\n// grant others permissions to perform the operation. For more information about\n// permissions, see [Specifying Permissions in a Policy]and [Managing Access Permissions to Your Amazon S3 Resources].\n//\n// To perform this operation, the user or role performing the action must have the [iam:PassRole]\n// permission.\n//\n// The following operations are related to PutBucketReplication :\n//\n// [GetBucketReplication]\n//\n// [DeleteBucketReplication]\n//\n// [iam:PassRole]: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html\n// [GetBucketReplication]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketReplication.html\n// [aws:RequestedRegion]: https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requestedregion\n// [Replicating Objects Created with SSE Using KMS keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-config-for-kms-objects.html\n// [Using Versioning]: https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html\n// [Replication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/replication.html\n// [List of replication-related error codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ReplicationErrorCodeList\n// [Backward Compatibility]: https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-add-config.html#replication-backward-compat-considerations\n// [DeleteBucketReplication]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketReplication.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\n// [Specifying Permissions in a Policy]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html\nfunc (c *Client) PutBucketReplication(ctx context.Context, params *PutBucketReplicationInput, optFns ...func(*Options)) (*PutBucketReplicationOutput, error) {\n\tif params == nil {\n\t\tparams = &PutBucketReplicationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutBucketReplication\", params, optFns, c.addOperationPutBucketReplicationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutBucketReplicationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutBucketReplicationInput struct {\n\n\t// The name of the bucket\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// A container for replication rules. You can add up to 1,000 rules. The maximum\n\t// size of a replication configuration is 2 MB.\n\t//\n\t// This member is required.\n\tReplicationConfiguration *types.ReplicationConfiguration\n\n\t// Indicates the algorithm used to create the checksum for the request when you\n\t// use the SDK. This header will not provide any additional functionality if you\n\t// don't use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The Base64 encoded 128-bit MD5 digest of the data. You must use this header as\n\t// a message integrity check to verify that the request body was not corrupted in\n\t// transit. For more information, see [RFC 1864].\n\t//\n\t// For requests made using the Amazon Web Services Command Line Interface (CLI) or\n\t// Amazon Web Services SDKs, this field is calculated automatically.\n\t//\n\t// [RFC 1864]: http://www.ietf.org/rfc/rfc1864.txt\n\tContentMD5 *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// A token to allow Object Lock to be enabled for an existing bucket.\n\tToken *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutBucketReplicationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutBucketReplicationOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutBucketReplicationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketReplication{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketReplication{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutBucketReplication\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutBucketReplicationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketReplication(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketReplicationInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketReplicationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutBucketReplicationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutBucketReplication(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutBucketReplication\",\n\t}\n}\n\n// getPutBucketReplicationRequestAlgorithmMember gets the request checksum\n// algorithm value provided as input.\nfunc getPutBucketReplicationRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutBucketReplicationInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutBucketReplicationInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutBucketReplicationRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutBucketReplicationBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getPutBucketReplicationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutBucketReplicationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutBucketReplicationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutBucketReplicationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketRequestPayment.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Sets the request payment configuration for a bucket. By default, the bucket\n// owner pays for downloads from the bucket. This configuration parameter enables\n// the bucket owner (only) to specify that the person requesting the download will\n// be charged for the download. For more information, see [Requester Pays Buckets].\n//\n// The following operations are related to PutBucketRequestPayment :\n//\n// [CreateBucket]\n//\n// [GetBucketRequestPayment]\n//\n// [GetBucketRequestPayment]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketRequestPayment.html\n// [Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RequesterPaysBuckets.html\n// [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\nfunc (c *Client) PutBucketRequestPayment(ctx context.Context, params *PutBucketRequestPaymentInput, optFns ...func(*Options)) (*PutBucketRequestPaymentOutput, error) {\n\tif params == nil {\n\t\tparams = &PutBucketRequestPaymentInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutBucketRequestPayment\", params, optFns, c.addOperationPutBucketRequestPaymentMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutBucketRequestPaymentOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutBucketRequestPaymentInput struct {\n\n\t// The bucket name.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Container for Payer.\n\t//\n\t// This member is required.\n\tRequestPaymentConfiguration *types.RequestPaymentConfiguration\n\n\t// Indicates the algorithm used to create the checksum for the request when you\n\t// use the SDK. This header will not provide any additional functionality if you\n\t// don't use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The Base64 encoded 128-bit MD5 digest of the data. You must use this header as\n\t// a message integrity check to verify that the request body was not corrupted in\n\t// transit. For more information, see [RFC 1864].\n\t//\n\t// For requests made using the Amazon Web Services Command Line Interface (CLI) or\n\t// Amazon Web Services SDKs, this field is calculated automatically.\n\t//\n\t// [RFC 1864]: http://www.ietf.org/rfc/rfc1864.txt\n\tContentMD5 *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutBucketRequestPaymentInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutBucketRequestPaymentOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutBucketRequestPaymentMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketRequestPayment{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketRequestPayment{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutBucketRequestPayment\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutBucketRequestPaymentValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketRequestPayment(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketRequestPaymentInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketRequestPaymentUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutBucketRequestPaymentInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutBucketRequestPayment(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutBucketRequestPayment\",\n\t}\n}\n\n// getPutBucketRequestPaymentRequestAlgorithmMember gets the request checksum\n// algorithm value provided as input.\nfunc getPutBucketRequestPaymentRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutBucketRequestPaymentInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutBucketRequestPaymentInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutBucketRequestPaymentRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutBucketRequestPaymentBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getPutBucketRequestPaymentBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutBucketRequestPaymentInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutBucketRequestPaymentUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutBucketRequestPaymentBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketTagging.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Sets the tags for a bucket.\n//\n// Use tags to organize your Amazon Web Services bill to reflect your own cost\n// structure. To do this, sign up to get your Amazon Web Services account bill with\n// tag key values included. Then, to see the cost of combined resources, organize\n// your billing information according to resources with the same tag key values.\n// For example, you can tag several resources with a specific application name, and\n// then organize your billing information to see the total cost of that application\n// across several services. For more information, see [Cost Allocation and Tagging]and [Using Cost Allocation in Amazon S3 Bucket Tags].\n//\n// When this operation sets the tags for a bucket, it will overwrite any current\n// tags the bucket already has. You cannot use this operation to add tags to an\n// existing list of tags.\n//\n// To use this operation, you must have permissions to perform the\n// s3:PutBucketTagging action. The bucket owner has this permission by default and\n// can grant this permission to others. For more information about permissions, see\n// [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources].\n//\n// PutBucketTagging has the following special errors. For more Amazon S3 errors\n// see, [Error Responses].\n//\n//   - InvalidTag - The tag provided was not a valid tag. This error can occur if\n//     the tag did not pass input validation. For more information, see [Using Cost Allocation in Amazon S3 Bucket Tags].\n//\n//   - MalformedXML - The XML provided does not match the schema.\n//\n//   - OperationAborted - A conflicting conditional action is currently in progress\n//     against this resource. Please try again.\n//\n//   - InternalError - The service was unable to apply the provided tag to the\n//     bucket.\n//\n// The following operations are related to PutBucketTagging :\n//\n// [GetBucketTagging]\n//\n// [DeleteBucketTagging]\n//\n// [Error Responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n// [GetBucketTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketTagging.html\n// [Cost Allocation and Tagging]: https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html\n// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [DeleteBucketTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketTagging.html\n// [Using Cost Allocation in Amazon S3 Bucket Tags]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/CostAllocTagging.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\nfunc (c *Client) PutBucketTagging(ctx context.Context, params *PutBucketTaggingInput, optFns ...func(*Options)) (*PutBucketTaggingOutput, error) {\n\tif params == nil {\n\t\tparams = &PutBucketTaggingInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutBucketTagging\", params, optFns, c.addOperationPutBucketTaggingMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutBucketTaggingOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutBucketTaggingInput struct {\n\n\t// The bucket name.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Container for the TagSet and Tag elements.\n\t//\n\t// This member is required.\n\tTagging *types.Tagging\n\n\t// Indicates the algorithm used to create the checksum for the request when you\n\t// use the SDK. This header will not provide any additional functionality if you\n\t// don't use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The Base64 encoded 128-bit MD5 digest of the data. You must use this header as\n\t// a message integrity check to verify that the request body was not corrupted in\n\t// transit. For more information, see [RFC 1864].\n\t//\n\t// For requests made using the Amazon Web Services Command Line Interface (CLI) or\n\t// Amazon Web Services SDKs, this field is calculated automatically.\n\t//\n\t// [RFC 1864]: http://www.ietf.org/rfc/rfc1864.txt\n\tContentMD5 *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutBucketTaggingInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutBucketTaggingOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutBucketTaggingMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketTagging{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketTagging{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutBucketTagging\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutBucketTaggingValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketTagging(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketTaggingInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketTaggingUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutBucketTaggingInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutBucketTagging(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutBucketTagging\",\n\t}\n}\n\n// getPutBucketTaggingRequestAlgorithmMember gets the request checksum algorithm\n// value provided as input.\nfunc getPutBucketTaggingRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutBucketTaggingInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutBucketTaggingInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutBucketTaggingRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutBucketTaggingBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getPutBucketTaggingBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutBucketTaggingInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutBucketTaggingUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutBucketTaggingBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketVersioning.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// When you enable versioning on a bucket for the first time, it might take a\n// short amount of time for the change to be fully propagated. While this change is\n// propagating, you might encounter intermittent HTTP 404 NoSuchKey errors for\n// requests to objects created or updated after enabling versioning. We recommend\n// that you wait for 15 minutes after enabling versioning before issuing write\n// operations ( PUT or DELETE ) on objects in the bucket.\n//\n// Sets the versioning state of an existing bucket.\n//\n// You can set the versioning state with one of the following values:\n//\n// Enabled—Enables versioning for the objects in the bucket. All objects added to\n// the bucket receive a unique version ID.\n//\n// Suspended—Disables versioning for the objects in the bucket. All objects added\n// to the bucket receive the version ID null.\n//\n// If the versioning state has never been set on a bucket, it has no versioning\n// state; a [GetBucketVersioning]request does not return a versioning state value.\n//\n// In order to enable MFA Delete, you must be the bucket owner. If you are the\n// bucket owner and want to enable MFA Delete in the bucket versioning\n// configuration, you must include the x-amz-mfa request header and the Status and\n// the MfaDelete request elements in a request to set the versioning state of the\n// bucket.\n//\n// If you have an object expiration lifecycle configuration in your non-versioned\n// bucket and you want to maintain the same permanent delete behavior when you\n// enable versioning, you must add a noncurrent expiration policy. The noncurrent\n// expiration lifecycle configuration will manage the deletes of the noncurrent\n// object versions in the version-enabled bucket. (A version-enabled bucket\n// maintains one current and zero or more noncurrent object versions.) For more\n// information, see [Lifecycle and Versioning].\n//\n// The following operations are related to PutBucketVersioning :\n//\n// [CreateBucket]\n//\n// [DeleteBucket]\n//\n// [GetBucketVersioning]\n//\n// [DeleteBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html\n// [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\n// [Lifecycle and Versioning]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html#lifecycle-and-other-bucket-config\n// [GetBucketVersioning]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketVersioning.html\nfunc (c *Client) PutBucketVersioning(ctx context.Context, params *PutBucketVersioningInput, optFns ...func(*Options)) (*PutBucketVersioningOutput, error) {\n\tif params == nil {\n\t\tparams = &PutBucketVersioningInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutBucketVersioning\", params, optFns, c.addOperationPutBucketVersioningMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutBucketVersioningOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutBucketVersioningInput struct {\n\n\t// The bucket name.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Container for setting the versioning state.\n\t//\n\t// This member is required.\n\tVersioningConfiguration *types.VersioningConfiguration\n\n\t// Indicates the algorithm used to create the checksum for the request when you\n\t// use the SDK. This header will not provide any additional functionality if you\n\t// don't use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// >The Base64 encoded 128-bit MD5 digest of the data. You must use this header as\n\t// a message integrity check to verify that the request body was not corrupted in\n\t// transit. For more information, see [RFC 1864].\n\t//\n\t// For requests made using the Amazon Web Services Command Line Interface (CLI) or\n\t// Amazon Web Services SDKs, this field is calculated automatically.\n\t//\n\t// [RFC 1864]: http://www.ietf.org/rfc/rfc1864.txt\n\tContentMD5 *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// The concatenation of the authentication device's serial number, a space, and\n\t// the value that is displayed on your authentication device.\n\tMFA *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutBucketVersioningInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutBucketVersioningOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutBucketVersioningMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketVersioning{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketVersioning{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutBucketVersioning\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutBucketVersioningValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketVersioning(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketVersioningInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketVersioningUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutBucketVersioningInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutBucketVersioning(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutBucketVersioning\",\n\t}\n}\n\n// getPutBucketVersioningRequestAlgorithmMember gets the request checksum\n// algorithm value provided as input.\nfunc getPutBucketVersioningRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutBucketVersioningInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutBucketVersioningInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutBucketVersioningRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutBucketVersioningBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getPutBucketVersioningBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutBucketVersioningInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutBucketVersioningUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutBucketVersioningBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketWebsite.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Sets the configuration of the website that is specified in the website\n// subresource. To configure a bucket as a website, you can add this subresource on\n// the bucket with website configuration information such as the file name of the\n// index document and any redirect rules. For more information, see [Hosting Websites on Amazon S3].\n//\n// This PUT action requires the S3:PutBucketWebsite permission. By default, only\n// the bucket owner can configure the website attached to a bucket; however, bucket\n// owners can allow other users to set the website configuration by writing a\n// bucket policy that grants them the S3:PutBucketWebsite permission.\n//\n// To redirect all website requests sent to the bucket's website endpoint, you add\n// a website configuration with the following elements. Because all requests are\n// sent to another website, you don't need to provide index document name for the\n// bucket.\n//\n//   - WebsiteConfiguration\n//\n//   - RedirectAllRequestsTo\n//\n//   - HostName\n//\n//   - Protocol\n//\n// If you want granular control over redirects, you can use the following elements\n// to add routing rules that describe conditions for redirecting requests and\n// information about the redirect destination. In this case, the website\n// configuration must provide an index document for the bucket, because some\n// requests might not be redirected.\n//\n//   - WebsiteConfiguration\n//\n//   - IndexDocument\n//\n//   - Suffix\n//\n//   - ErrorDocument\n//\n//   - Key\n//\n//   - RoutingRules\n//\n//   - RoutingRule\n//\n//   - Condition\n//\n//   - HttpErrorCodeReturnedEquals\n//\n//   - KeyPrefixEquals\n//\n//   - Redirect\n//\n//   - Protocol\n//\n//   - HostName\n//\n//   - ReplaceKeyPrefixWith\n//\n//   - ReplaceKeyWith\n//\n//   - HttpRedirectCode\n//\n// Amazon S3 has a limitation of 50 routing rules per website configuration. If\n// you require more than 50 routing rules, you can use object redirect. For more\n// information, see [Configuring an Object Redirect]in the Amazon S3 User Guide.\n//\n// The maximum request length is limited to 128 KB.\n//\n// [Hosting Websites on Amazon S3]: https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html\n// [Configuring an Object Redirect]: https://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html\nfunc (c *Client) PutBucketWebsite(ctx context.Context, params *PutBucketWebsiteInput, optFns ...func(*Options)) (*PutBucketWebsiteOutput, error) {\n\tif params == nil {\n\t\tparams = &PutBucketWebsiteInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutBucketWebsite\", params, optFns, c.addOperationPutBucketWebsiteMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutBucketWebsiteOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutBucketWebsiteInput struct {\n\n\t// The bucket name.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Container for the request.\n\t//\n\t// This member is required.\n\tWebsiteConfiguration *types.WebsiteConfiguration\n\n\t// Indicates the algorithm used to create the checksum for the request when you\n\t// use the SDK. This header will not provide any additional functionality if you\n\t// don't use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The Base64 encoded 128-bit MD5 digest of the data. You must use this header as\n\t// a message integrity check to verify that the request body was not corrupted in\n\t// transit. For more information, see [RFC 1864].\n\t//\n\t// For requests made using the Amazon Web Services Command Line Interface (CLI) or\n\t// Amazon Web Services SDKs, this field is calculated automatically.\n\t//\n\t// [RFC 1864]: http://www.ietf.org/rfc/rfc1864.txt\n\tContentMD5 *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutBucketWebsiteInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutBucketWebsiteOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutBucketWebsiteMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketWebsite{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketWebsite{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutBucketWebsite\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutBucketWebsiteValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketWebsite(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketWebsiteInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketWebsiteUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutBucketWebsiteInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutBucketWebsite(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutBucketWebsite\",\n\t}\n}\n\n// getPutBucketWebsiteRequestAlgorithmMember gets the request checksum algorithm\n// value provided as input.\nfunc getPutBucketWebsiteRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutBucketWebsiteInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutBucketWebsiteInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutBucketWebsiteRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutBucketWebsiteBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getPutBucketWebsiteBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutBucketWebsiteInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutBucketWebsiteUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutBucketWebsiteBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutObject.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tawshttp \"github.com/aws/aws-sdk-go-v2/aws/transport/http\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"io\"\n\t\"time\"\n)\n\n// Adds an object to a bucket.\n//\n//   - Amazon S3 never adds partial objects; if you receive a success response,\n//     Amazon S3 added the entire object to the bucket. You cannot use PutObject to\n//     only update a single piece of metadata for an existing object. You must put the\n//     entire object with updated metadata if you want to update some values.\n//\n//   - If your bucket uses the bucket owner enforced setting for Object Ownership,\n//     ACLs are disabled and no longer affect permissions. All objects written to the\n//     bucket by any account will be owned by the bucket owner.\n//\n//   - Directory buckets - For directory buckets, you must make requests for this\n//     API operation to the Zonal endpoint. These endpoints support\n//     virtual-hosted-style requests in the format\n//     https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name\n//     . Path-style requests are not supported. For more information about endpoints\n//     in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information\n//     about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// Amazon S3 is a distributed system. If it receives multiple write requests for\n// the same object simultaneously, it overwrites all but the last object written.\n// However, Amazon S3 provides features that can modify this behavior:\n//\n//   - S3 Object Lock - To prevent objects from being deleted or overwritten, you\n//     can use [Amazon S3 Object Lock]in the Amazon S3 User Guide.\n//\n// This functionality is not supported for directory buckets.\n//\n//   - If-None-Match - Uploads the object only if the object key name does not\n//     already exist in the specified bucket. Otherwise, Amazon S3 returns a 412\n//     Precondition Failed error. If a conflicting operation occurs during the\n//     upload, S3 returns a 409 ConditionalRequestConflict response. On a 409\n//     failure, retry the upload.\n//\n// Expects the * character (asterisk).\n//\n// For more information, see [Add preconditions to S3 operations with conditional requests]in the Amazon S3 User Guide or [RFC 7232].\n//\n// This functionality is not supported for S3 on Outposts.\n//\n//   - S3 Versioning - When you enable versioning for a bucket, if Amazon S3\n//     receives multiple write requests for the same object simultaneously, it stores\n//     all versions of the objects. For each write request that is made to the same\n//     object, Amazon S3 automatically generates a unique version ID of that object\n//     being stored in Amazon S3. You can retrieve, replace, or delete any version of\n//     the object. For more information about versioning, see [Adding Objects to Versioning-Enabled Buckets]in the Amazon S3 User\n//     Guide. For information about returning the versioning state of a bucket, see [GetBucketVersioning]\n//     .\n//\n// This functionality is not supported for directory buckets.\n//\n// Permissions\n//\n//   - General purpose bucket permissions - The following permissions are required\n//     in your policies when your PutObject request includes specific headers.\n//\n//   - s3:PutObject - To successfully complete the PutObject request, you must\n//     always have the s3:PutObject permission on a bucket to add an object to it.\n//\n//   - s3:PutObjectAcl - To successfully change the objects ACL of your PutObject\n//     request, you must have the s3:PutObjectAcl .\n//\n//   - s3:PutObjectTagging - To successfully set the tag-set with your PutObject\n//     request, you must have the s3:PutObjectTagging .\n//\n//   - Directory bucket permissions - To grant access to this API operation on a\n//     directory bucket, we recommend that you use the [CreateSession]CreateSession API operation\n//     for session-based authorization. Specifically, you grant the\n//     s3express:CreateSession permission to the directory bucket in a bucket policy\n//     or an IAM identity-based policy. Then, you make the CreateSession API call on\n//     the bucket to obtain a session token. With the session token in your request\n//     header, you can make API requests to this operation. After the session token\n//     expires, you make another CreateSession API call to generate a new session\n//     token for use. Amazon Web Services CLI or SDKs create session and refresh the\n//     session token automatically to avoid service interruptions when a session\n//     expires. For more information about authorization, see [CreateSession]CreateSession .\n//\n// If the object is encrypted with SSE-KMS, you must also have the\n//\n//\tkms:GenerateDataKey and kms:Decrypt permissions in IAM identity-based policies\n//\tand KMS key policies for the KMS key.\n//\n// Data integrity with Content-MD5\n//\n//   - General purpose bucket - To ensure that data is not corrupted traversing\n//     the network, use the Content-MD5 header. When you use this header, Amazon S3\n//     checks the object against the provided MD5 value and, if they do not match,\n//     Amazon S3 returns an error. Alternatively, when the object's ETag is its MD5\n//     digest, you can calculate the MD5 while putting the object to Amazon S3 and\n//     compare the returned ETag to the calculated MD5 value.\n//\n//   - Directory bucket - This functionality is not supported for directory\n//     buckets.\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// Bucket-name.s3express-zone-id.region-code.amazonaws.com .\n//\n// For more information about related Amazon S3 APIs, see the following:\n//\n// [CopyObject]\n//\n// [DeleteObject]\n//\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [Amazon S3 Object Lock]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html\n// [DeleteObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html\n// [Adding Objects to Versioning-Enabled Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/AddingObjectstoVersioningEnabledBuckets.html\n// [Add preconditions to S3 operations with conditional requests]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-requests.html\n// [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\n// [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\n// [RFC 7232]: https://datatracker.ietf.org/doc/rfc7232/\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n// [GetBucketVersioning]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketVersioning.html\nfunc (c *Client) PutObject(ctx context.Context, params *PutObjectInput, optFns ...func(*Options)) (*PutObjectOutput, error) {\n\tif params == nil {\n\t\tparams = &PutObjectInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutObject\", params, optFns, c.addOperationPutObjectMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutObjectOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutObjectInput struct {\n\n\t// The bucket name to which the PUT action was initiated.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use virtual-hosted-style requests in the format\n\t// Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests\n\t// are not supported. Directory bucket names must be unique in the chosen Zone\n\t// (Availability Zone or Local Zone). Bucket names must follow the format\n\t// bucket-base-name--zone-id--x-s3 (for example,\n\t// amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// Object Lambda access points are not supported by directory buckets.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Object key for which the PUT action was initiated.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// The canned ACL to apply to the object. For more information, see [Canned ACL] in the Amazon\n\t// S3 User Guide.\n\t//\n\t// When adding a new object, you can use headers to grant ACL-based permissions to\n\t// individual Amazon Web Services accounts or to predefined groups defined by\n\t// Amazon S3. These permissions are then added to the ACL on the object. By\n\t// default, all objects are private. Only the owner has full access control. For\n\t// more information, see [Access Control List (ACL) Overview]and [Managing ACLs Using the REST API] in the Amazon S3 User Guide.\n\t//\n\t// If the bucket that you're uploading objects to uses the bucket owner enforced\n\t// setting for S3 Object Ownership, ACLs are disabled and no longer affect\n\t// permissions. Buckets that use this setting only accept PUT requests that don't\n\t// specify an ACL or PUT requests that specify bucket owner full control ACLs, such\n\t// as the bucket-owner-full-control canned ACL or an equivalent form of this ACL\n\t// expressed in the XML format. PUT requests that contain other ACLs (for example,\n\t// custom grants to certain Amazon Web Services accounts) fail and return a 400\n\t// error with the error code AccessControlListNotSupported . For more information,\n\t// see [Controlling ownership of objects and disabling ACLs]in the Amazon S3 User Guide.\n\t//\n\t//   - This functionality is not supported for directory buckets.\n\t//\n\t//   - This functionality is not supported for Amazon S3 on Outposts.\n\t//\n\t// [Managing ACLs Using the REST API]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-using-rest-api.html\n\t// [Access Control List (ACL) Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html\n\t// [Canned ACL]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#CannedACL\n\t// [Controlling ownership of objects and disabling ACLs]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html\n\tACL types.ObjectCannedACL\n\n\t// Object data.\n\tBody io.Reader\n\n\t// Specifies whether Amazon S3 should use an S3 Bucket Key for object encryption\n\t// with server-side encryption using Key Management Service (KMS) keys (SSE-KMS).\n\t//\n\t// General purpose buckets - Setting this header to true causes Amazon S3 to use\n\t// an S3 Bucket Key for object encryption with SSE-KMS. Also, specifying this\n\t// header with a PUT action doesn't affect bucket-level settings for S3 Bucket Key.\n\t//\n\t// Directory buckets - S3 Bucket Keys are always enabled for GET and PUT\n\t// operations in a directory bucket and can’t be disabled. S3 Bucket Keys aren't\n\t// supported, when you copy SSE-KMS encrypted objects from general purpose buckets\n\t// to directory buckets, from directory buckets to general purpose buckets, or\n\t// between directory buckets, through [CopyObject], [UploadPartCopy], [the Copy operation in Batch Operations], or [the import jobs]. In this case, Amazon S3 makes a\n\t// call to KMS every time a copy request is made for a KMS-encrypted object.\n\t//\n\t// [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\n\t// [the import jobs]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-import-job\n\t// [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\n\t// [the Copy operation in Batch Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-Batch-Ops\n\tBucketKeyEnabled *bool\n\n\t// Can be used to specify caching behavior along the request/reply chain. For more\n\t// information, see [http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9].\n\t//\n\t// [http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9\n\tCacheControl *string\n\n\t// Indicates the algorithm used to create the checksum for the object when you use\n\t// the SDK. This header will not provide any additional functionality if you don't\n\t// use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum-algorithm or x-amz-trailer header sent. Otherwise, Amazon S3\n\t// fails the request with the HTTP status code 400 Bad Request .\n\t//\n\t// For the x-amz-checksum-algorithm  header, replace  algorithm  with the\n\t// supported algorithm from the following list:\n\t//\n\t//   - CRC32\n\t//\n\t//   - CRC32C\n\t//\n\t//   - CRC64NVME\n\t//\n\t//   - SHA1\n\t//\n\t//   - SHA256\n\t//\n\t// For more information, see [Checking object integrity] in the Amazon S3 User Guide.\n\t//\n\t// If the individual checksum value you provide through x-amz-checksum-algorithm\n\t// doesn't match the checksum algorithm you set through\n\t// x-amz-sdk-checksum-algorithm , Amazon S3 fails the request with a BadDigest\n\t// error.\n\t//\n\t// The Content-MD5 or x-amz-sdk-checksum-algorithm header is required for any\n\t// request to upload an object with a retention period configured using Amazon S3\n\t// Object Lock. For more information, see [Uploading objects to an Object Lock enabled bucket]in the Amazon S3 User Guide.\n\t//\n\t// For directory buckets, when you use Amazon Web Services SDKs, CRC32 is the\n\t// default checksum algorithm that's used for performance.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\t// [Uploading objects to an Object Lock enabled bucket]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock-managing.html#object-lock-put-object\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// This header can be used as a data integrity check to verify that the data\n\t// received is the same data that was originally sent. This header specifies the\n\t// Base64 encoded, 32-bit CRC32 checksum of the object. For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumCRC32 *string\n\n\t// This header can be used as a data integrity check to verify that the data\n\t// received is the same data that was originally sent. This header specifies the\n\t// Base64 encoded, 32-bit CRC32C checksum of the object. For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumCRC32C *string\n\n\t// This header can be used as a data integrity check to verify that the data\n\t// received is the same data that was originally sent. This header specifies the\n\t// Base64 encoded, 64-bit CRC64NVME checksum of the object. The CRC64NVME checksum\n\t// is always a full object checksum. For more information, see [Checking object integrity in the Amazon S3 User Guide].\n\t//\n\t// [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumCRC64NVME *string\n\n\t// This header can be used as a data integrity check to verify that the data\n\t// received is the same data that was originally sent. This header specifies the\n\t// Base64 encoded, 160-bit SHA1 digest of the object. For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumSHA1 *string\n\n\t// This header can be used as a data integrity check to verify that the data\n\t// received is the same data that was originally sent. This header specifies the\n\t// Base64 encoded, 256-bit SHA256 digest of the object. For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumSHA256 *string\n\n\t// Specifies presentational information for the object. For more information, see [https://www.rfc-editor.org/rfc/rfc6266#section-4].\n\t//\n\t// [https://www.rfc-editor.org/rfc/rfc6266#section-4]: https://www.rfc-editor.org/rfc/rfc6266#section-4\n\tContentDisposition *string\n\n\t// Specifies what content encodings have been applied to the object and thus what\n\t// decoding mechanisms must be applied to obtain the media-type referenced by the\n\t// Content-Type header field. For more information, see [https://www.rfc-editor.org/rfc/rfc9110.html#field.content-encoding].\n\t//\n\t// [https://www.rfc-editor.org/rfc/rfc9110.html#field.content-encoding]: https://www.rfc-editor.org/rfc/rfc9110.html#field.content-encoding\n\tContentEncoding *string\n\n\t// The language the content is in.\n\tContentLanguage *string\n\n\t// Size of the body in bytes. This parameter is useful when the size of the body\n\t// cannot be determined automatically. For more information, see [https://www.rfc-editor.org/rfc/rfc9110.html#name-content-length].\n\t//\n\t// [https://www.rfc-editor.org/rfc/rfc9110.html#name-content-length]: https://www.rfc-editor.org/rfc/rfc9110.html#name-content-length\n\tContentLength *int64\n\n\t// The Base64 encoded 128-bit MD5 digest of the message (without the headers)\n\t// according to RFC 1864. This header can be used as a message integrity check to\n\t// verify that the data is the same data that was originally sent. Although it is\n\t// optional, we recommend using the Content-MD5 mechanism as an end-to-end\n\t// integrity check. For more information about REST request authentication, see [REST Authentication].\n\t//\n\t// The Content-MD5 or x-amz-sdk-checksum-algorithm header is required for any\n\t// request to upload an object with a retention period configured using Amazon S3\n\t// Object Lock. For more information, see [Uploading objects to an Object Lock enabled bucket]in the Amazon S3 User Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n\t// [Uploading objects to an Object Lock enabled bucket]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock-managing.html#object-lock-put-object\n\tContentMD5 *string\n\n\t// A standard MIME type describing the format of the contents. For more\n\t// information, see [https://www.rfc-editor.org/rfc/rfc9110.html#name-content-type].\n\t//\n\t// [https://www.rfc-editor.org/rfc/rfc9110.html#name-content-type]: https://www.rfc-editor.org/rfc/rfc9110.html#name-content-type\n\tContentType *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// The date and time at which the object is no longer cacheable. For more\n\t// information, see [https://www.rfc-editor.org/rfc/rfc7234#section-5.3].\n\t//\n\t// [https://www.rfc-editor.org/rfc/rfc7234#section-5.3]: https://www.rfc-editor.org/rfc/rfc7234#section-5.3\n\tExpires *time.Time\n\n\t// Gives the grantee READ, READ_ACP, and WRITE_ACP permissions on the object.\n\t//\n\t//   - This functionality is not supported for directory buckets.\n\t//\n\t//   - This functionality is not supported for Amazon S3 on Outposts.\n\tGrantFullControl *string\n\n\t// Allows grantee to read the object data and its metadata.\n\t//\n\t//   - This functionality is not supported for directory buckets.\n\t//\n\t//   - This functionality is not supported for Amazon S3 on Outposts.\n\tGrantRead *string\n\n\t// Allows grantee to read the object ACL.\n\t//\n\t//   - This functionality is not supported for directory buckets.\n\t//\n\t//   - This functionality is not supported for Amazon S3 on Outposts.\n\tGrantReadACP *string\n\n\t// Allows grantee to write the ACL for the applicable object.\n\t//\n\t//   - This functionality is not supported for directory buckets.\n\t//\n\t//   - This functionality is not supported for Amazon S3 on Outposts.\n\tGrantWriteACP *string\n\n\t// Uploads the object only if the ETag (entity tag) value provided during the\n\t// WRITE operation matches the ETag of the object in S3. If the ETag values do not\n\t// match, the operation returns a 412 Precondition Failed error.\n\t//\n\t// If a conflicting operation occurs during the upload S3 returns a 409\n\t// ConditionalRequestConflict response. On a 409 failure you should fetch the\n\t// object's ETag and retry the upload.\n\t//\n\t// Expects the ETag value as a string.\n\t//\n\t// For more information about conditional requests, see [RFC 7232], or [Conditional requests] in the Amazon S3\n\t// User Guide.\n\t//\n\t// [Conditional requests]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-requests.html\n\t// [RFC 7232]: https://tools.ietf.org/html/rfc7232\n\tIfMatch *string\n\n\t// Uploads the object only if the object key name does not already exist in the\n\t// bucket specified. Otherwise, Amazon S3 returns a 412 Precondition Failed error.\n\t//\n\t// If a conflicting operation occurs during the upload S3 returns a 409\n\t// ConditionalRequestConflict response. On a 409 failure you should retry the\n\t// upload.\n\t//\n\t// Expects the '*' (asterisk) character.\n\t//\n\t// For more information about conditional requests, see [RFC 7232], or [Conditional requests] in the Amazon S3\n\t// User Guide.\n\t//\n\t// [Conditional requests]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-requests.html\n\t// [RFC 7232]: https://tools.ietf.org/html/rfc7232\n\tIfNoneMatch *string\n\n\t// A map of metadata to store with the object in S3.\n\tMetadata map[string]string\n\n\t// Specifies whether a legal hold will be applied to this object. For more\n\t// information about S3 Object Lock, see [Object Lock]in the Amazon S3 User Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Object Lock]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html\n\tObjectLockLegalHoldStatus types.ObjectLockLegalHoldStatus\n\n\t// The Object Lock mode that you want to apply to this object.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tObjectLockMode types.ObjectLockMode\n\n\t// The date and time when you want this object's Object Lock to expire. Must be\n\t// formatted as a timestamp parameter.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tObjectLockRetainUntilDate *time.Time\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// Specifies the algorithm to use when encrypting the object (for example, AES256 ).\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerAlgorithm *string\n\n\t// Specifies the customer-provided encryption key for Amazon S3 to use in\n\t// encrypting data. This value is used to store the object and then it is\n\t// discarded; Amazon S3 does not store the encryption key. The key must be\n\t// appropriate for use with the algorithm specified in the\n\t// x-amz-server-side-encryption-customer-algorithm header.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerKey *string\n\n\t// Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321.\n\t// Amazon S3 uses this header for a message integrity check to ensure that the\n\t// encryption key was transmitted without error.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerKeyMD5 *string\n\n\t// Specifies the Amazon Web Services KMS Encryption Context as an additional\n\t// encryption context to use for object encryption. The value of this header is a\n\t// Base64 encoded string of a UTF-8 encoded JSON, which contains the encryption\n\t// context as key-value pairs. This value is stored as object metadata and\n\t// automatically gets passed on to Amazon Web Services KMS for future GetObject\n\t// operations on this object.\n\t//\n\t// General purpose buckets - This value must be explicitly added during CopyObject\n\t// operations if you want an additional encryption context for your object. For\n\t// more information, see [Encryption context]in the Amazon S3 User Guide.\n\t//\n\t// Directory buckets - You can optionally provide an explicit encryption context\n\t// value. The value must match the default encryption context - the bucket Amazon\n\t// Resource Name (ARN). An additional encryption context value is not supported.\n\t//\n\t// [Encryption context]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html#encryption-context\n\tSSEKMSEncryptionContext *string\n\n\t// Specifies the KMS key ID (Key ID, Key ARN, or Key Alias) to use for object\n\t// encryption. If the KMS key doesn't exist in the same account that's issuing the\n\t// command, you must use the full Key ARN not the Key ID.\n\t//\n\t// General purpose buckets - If you specify x-amz-server-side-encryption with\n\t// aws:kms or aws:kms:dsse , this header specifies the ID (Key ID, Key ARN, or Key\n\t// Alias) of the KMS key to use. If you specify\n\t// x-amz-server-side-encryption:aws:kms or\n\t// x-amz-server-side-encryption:aws:kms:dsse , but do not provide\n\t// x-amz-server-side-encryption-aws-kms-key-id , Amazon S3 uses the Amazon Web\n\t// Services managed key ( aws/s3 ) to protect the data.\n\t//\n\t// Directory buckets - To encrypt data using SSE-KMS, it's recommended to specify\n\t// the x-amz-server-side-encryption header to aws:kms . Then, the\n\t// x-amz-server-side-encryption-aws-kms-key-id header implicitly uses the bucket's\n\t// default KMS customer managed key ID. If you want to explicitly set the\n\t// x-amz-server-side-encryption-aws-kms-key-id header, it must match the bucket's\n\t// default customer managed key (using key ID or ARN, not alias). Your SSE-KMS\n\t// configuration can only support 1 [customer managed key]per directory bucket's lifetime. The [Amazon Web Services managed key] ( aws/s3\n\t// ) isn't supported.\n\t//\n\t// Incorrect key specification results in an HTTP 400 Bad Request error.\n\t//\n\t// [customer managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\n\t// [Amazon Web Services managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\n\tSSEKMSKeyId *string\n\n\t// The server-side encryption algorithm that was used when you store this object\n\t// in Amazon S3 (for example, AES256 , aws:kms , aws:kms:dsse ).\n\t//\n\t//   - General purpose buckets - You have four mutually exclusive options to\n\t//   protect data using server-side encryption in Amazon S3, depending on how you\n\t//   choose to manage the encryption keys. Specifically, the encryption key options\n\t//   are Amazon S3 managed keys (SSE-S3), Amazon Web Services KMS keys (SSE-KMS or\n\t//   DSSE-KMS), and customer-provided keys (SSE-C). Amazon S3 encrypts data with\n\t//   server-side encryption by using Amazon S3 managed keys (SSE-S3) by default. You\n\t//   can optionally tell Amazon S3 to encrypt data at rest by using server-side\n\t//   encryption with other key options. For more information, see [Using Server-Side Encryption]in the Amazon S3\n\t//   User Guide.\n\t//\n\t//   - Directory buckets - For directory buckets, there are only two supported\n\t//   options for server-side encryption: server-side encryption with Amazon S3\n\t//   managed keys (SSE-S3) ( AES256 ) and server-side encryption with KMS keys\n\t//   (SSE-KMS) ( aws:kms ). We recommend that the bucket's default encryption uses\n\t//   the desired encryption configuration and you don't override the bucket default\n\t//   encryption in your CreateSession requests or PUT object requests. Then, new\n\t//   objects are automatically encrypted with the desired encryption settings. For\n\t//   more information, see [Protecting data with server-side encryption]in the Amazon S3 User Guide. For more information about\n\t//   the encryption overriding behaviors in directory buckets, see [Specifying server-side encryption with KMS for new object uploads].\n\t//\n\t// In the Zonal endpoint API calls (except [CopyObject]and [UploadPartCopy]) using the REST API, the\n\t//   encryption request headers must match the encryption settings that are specified\n\t//   in the CreateSession request. You can't override the values of the encryption\n\t//   settings ( x-amz-server-side-encryption ,\n\t//   x-amz-server-side-encryption-aws-kms-key-id ,\n\t//   x-amz-server-side-encryption-context , and\n\t//   x-amz-server-side-encryption-bucket-key-enabled ) that are specified in the\n\t//   CreateSession request. You don't need to explicitly specify these encryption\n\t//   settings values in Zonal endpoint API calls, and Amazon S3 will use the\n\t//   encryption settings values from the CreateSession request to protect new\n\t//   objects in the directory bucket.\n\t//\n\t// When you use the CLI or the Amazon Web Services SDKs, for CreateSession , the\n\t//   session token refreshes automatically to avoid service interruptions when a\n\t//   session expires. The CLI or the Amazon Web Services SDKs use the bucket's\n\t//   default encryption configuration for the CreateSession request. It's not\n\t//   supported to override the encryption settings values in the CreateSession\n\t//   request. So in the Zonal endpoint API calls (except [CopyObject]and [UploadPartCopy]), the encryption\n\t//   request headers must match the default encryption configuration of the directory\n\t//   bucket.\n\t//\n\t// [Using Server-Side Encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html\n\t// [Specifying server-side encryption with KMS for new object uploads]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html\n\t// [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\n\t// [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\n\t// [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\n\tServerSideEncryption types.ServerSideEncryption\n\n\t// By default, Amazon S3 uses the STANDARD Storage Class to store newly created\n\t// objects. The STANDARD storage class provides high durability and high\n\t// availability. Depending on performance needs, you can specify a different\n\t// Storage Class. For more information, see [Storage Classes]in the Amazon S3 User Guide.\n\t//\n\t//   - Directory buckets only support EXPRESS_ONEZONE (the S3 Express One Zone\n\t//   storage class) in Availability Zones and ONEZONE_IA (the S3 One\n\t//   Zone-Infrequent Access storage class) in Dedicated Local Zones.\n\t//\n\t//   - Amazon S3 on Outposts only uses the OUTPOSTS Storage Class.\n\t//\n\t// [Storage Classes]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html\n\tStorageClass types.StorageClass\n\n\t// The tag-set for the object. The tag-set must be encoded as URL Query\n\t// parameters. (For example, \"Key1=Value1\")\n\t//\n\t// This functionality is not supported for directory buckets.\n\tTagging *string\n\n\t// If the bucket is configured as a website, redirects requests for this object to\n\t// another object in the same bucket or to an external URL. Amazon S3 stores the\n\t// value of this header in the object metadata. For information about object\n\t// metadata, see [Object Key and Metadata]in the Amazon S3 User Guide.\n\t//\n\t// In the following example, the request header sets the redirect to an object\n\t// (anotherPage.html) in the same bucket:\n\t//\n\t//     x-amz-website-redirect-location: /anotherPage.html\n\t//\n\t// In the following example, the request header sets the object redirect to\n\t// another website:\n\t//\n\t//     x-amz-website-redirect-location: http://www.example.com/\n\t//\n\t// For more information about website hosting in Amazon S3, see [Hosting Websites on Amazon S3] and [How to Configure Website Page Redirects] in the\n\t// Amazon S3 User Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [How to Configure Website Page Redirects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html\n\t// [Hosting Websites on Amazon S3]: https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html\n\t// [Object Key and Metadata]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html\n\tWebsiteRedirectLocation *string\n\n\t//  Specifies the offset for appending data to existing objects in bytes. The\n\t// offset must be equal to the size of the existing object being appended to. If no\n\t// object exists, setting this header to 0 will create a new object.\n\t//\n\t// This functionality is only supported for objects in the Amazon S3 Express One\n\t// Zone storage class in directory buckets.\n\tWriteOffsetBytes *int64\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutObjectInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.Key = in.Key\n\n}\n\ntype PutObjectOutput struct {\n\n\t// Indicates whether the uploaded object uses an S3 Bucket Key for server-side\n\t// encryption with Key Management Service (KMS) keys (SSE-KMS).\n\tBucketKeyEnabled *bool\n\n\t// The Base64 encoded, 32-bit CRC32 checksum of the object. This checksum is only\n\t// be present if the checksum was uploaded with the object. When you use an API\n\t// operation on an object that was uploaded using multipart uploads, this value may\n\t// not be a direct checksum value of the full object. Instead, it's a calculation\n\t// based on the checksum values of each individual part. For more information about\n\t// how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\n\tChecksumCRC32 *string\n\n\t// The Base64 encoded, 32-bit CRC32C checksum of the object. This checksum is only\n\t// present if the checksum was uploaded with the object. When you use an API\n\t// operation on an object that was uploaded using multipart uploads, this value may\n\t// not be a direct checksum value of the full object. Instead, it's a calculation\n\t// based on the checksum values of each individual part. For more information about\n\t// how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\n\tChecksumCRC32C *string\n\n\t// The Base64 encoded, 64-bit CRC64NVME checksum of the object. This header is\n\t// present if the object was uploaded with the CRC64NVME checksum algorithm, or if\n\t// it was uploaded without a checksum (and Amazon S3 added the default checksum,\n\t// CRC64NVME , to the uploaded object). For more information about how checksums\n\t// are calculated with multipart uploads, see [Checking object integrity in the Amazon S3 User Guide].\n\t//\n\t// [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumCRC64NVME *string\n\n\t// The Base64 encoded, 160-bit SHA1 digest of the object. This will only be\n\t// present if the object was uploaded with the object. When you use the API\n\t// operation on an object that was uploaded using multipart uploads, this value may\n\t// not be a direct checksum value of the full object. Instead, it's a calculation\n\t// based on the checksum values of each individual part. For more information about\n\t// how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\n\tChecksumSHA1 *string\n\n\t// The Base64 encoded, 256-bit SHA256 digest of the object. This will only be\n\t// present if the object was uploaded with the object. When you use an API\n\t// operation on an object that was uploaded using multipart uploads, this value may\n\t// not be a direct checksum value of the full object. Instead, it's a calculation\n\t// based on the checksum values of each individual part. For more information about\n\t// how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\n\tChecksumSHA256 *string\n\n\t// This header specifies the checksum type of the object, which determines how\n\t// part-level checksums are combined to create an object-level checksum for\n\t// multipart objects. For PutObject uploads, the checksum type is always\n\t// FULL_OBJECT . You can use this header as a data integrity check to verify that\n\t// the checksum type that is received is the same checksum that was specified. For\n\t// more information, see [Checking object integrity]in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumType types.ChecksumType\n\n\t// Entity tag for the uploaded object.\n\t//\n\t// General purpose buckets - To ensure that data is not corrupted traversing the\n\t// network, for objects where the ETag is the MD5 digest of the object, you can\n\t// calculate the MD5 while putting an object to Amazon S3 and compare the returned\n\t// ETag to the calculated MD5 value.\n\t//\n\t// Directory buckets - The ETag for the object in a directory bucket isn't the MD5\n\t// digest of the object.\n\tETag *string\n\n\t// If the expiration is configured for the object (see [PutBucketLifecycleConfiguration]) in the Amazon S3 User\n\t// Guide, the response includes this header. It includes the expiry-date and\n\t// rule-id key-value pairs that provide information about object expiration. The\n\t// value of the rule-id is URL-encoded.\n\t//\n\t// Object expiration information is not returned in directory buckets and this\n\t// header returns the value \" NotImplemented \" in all responses for directory\n\t// buckets.\n\t//\n\t// [PutBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html\n\tExpiration *string\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// If server-side encryption with a customer-provided encryption key was\n\t// requested, the response will include this header to confirm the encryption\n\t// algorithm that's used.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerAlgorithm *string\n\n\t// If server-side encryption with a customer-provided encryption key was\n\t// requested, the response will include this header to provide the round-trip\n\t// message integrity verification of the customer-provided encryption key.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerKeyMD5 *string\n\n\t// If present, indicates the Amazon Web Services KMS Encryption Context to use for\n\t// object encryption. The value of this header is a Base64 encoded string of a\n\t// UTF-8 encoded JSON, which contains the encryption context as key-value pairs.\n\t// This value is stored as object metadata and automatically gets passed on to\n\t// Amazon Web Services KMS for future GetObject operations on this object.\n\tSSEKMSEncryptionContext *string\n\n\t// If present, indicates the ID of the KMS key that was used for object encryption.\n\tSSEKMSKeyId *string\n\n\t// The server-side encryption algorithm used when you store this object in Amazon\n\t// S3.\n\tServerSideEncryption types.ServerSideEncryption\n\n\t//  The size of the object in bytes. This value is only be present if you append\n\t// to an object.\n\t//\n\t// This functionality is only supported for objects in the Amazon S3 Express One\n\t// Zone storage class in directory buckets.\n\tSize *int64\n\n\t// Version ID of the object.\n\t//\n\t// If you enable versioning for a bucket, Amazon S3 automatically generates a\n\t// unique version ID for the object being stored. Amazon S3 returns this ID in the\n\t// response. When you enable versioning for a bucket, if Amazon S3 receives\n\t// multiple write requests for the same object simultaneously, it stores all of the\n\t// objects. For more information about versioning, see [Adding Objects to Versioning-Enabled Buckets]in the Amazon S3 User\n\t// Guide. For information about returning the versioning state of a bucket, see [GetBucketVersioning].\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Adding Objects to Versioning-Enabled Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/AddingObjectstoVersioningEnabledBuckets.html\n\t// [GetBucketVersioning]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketVersioning.html\n\tVersionId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutObjectMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutObject{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutObject{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutObject\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutObjectValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutObject(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = add100Continue(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutObjectInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutObjectUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.UseDynamicPayloadSigningMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutObjectInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutObject(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutObject\",\n\t}\n}\n\n// getPutObjectRequestAlgorithmMember gets the request checksum algorithm value\n// provided as input.\nfunc getPutObjectRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutObjectInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutObjectInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutObjectRequestAlgorithmMember,\n\t\tRequireChecksum:                  false,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           true,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutObjectBucketMember returns a pointer to string denoting a provided bucket\n// member valueand a boolean indicating if the input has a modeled bucket name,\nfunc getPutObjectBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutObjectInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutObjectUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutObjectBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n\n// PresignPutObject is used to generate a presigned HTTP Request which contains\n// presigned URL, signed headers and HTTP method used.\nfunc (c *PresignClient) PresignPutObject(ctx context.Context, params *PutObjectInput, optFns ...func(*PresignOptions)) (*v4.PresignedHTTPRequest, error) {\n\tif params == nil {\n\t\tparams = &PutObjectInput{}\n\t}\n\toptions := c.options.copy()\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\tclientOptFns := append(options.ClientOptions, withNopHTTPClientAPIOption)\n\n\tclientOptFns = append(options.ClientOptions, withNoDefaultChecksumAPIOption)\n\n\tresult, _, err := c.client.invokeOperation(ctx, \"PutObject\", params, clientOptFns,\n\t\tc.client.addOperationPutObjectMiddlewares,\n\t\tpresignConverter(options).convertToPresignMiddleware,\n\t\tfunc(stack *middleware.Stack, options Options) error {\n\t\t\treturn awshttp.RemoveContentTypeHeader(stack)\n\t\t},\n\t\taddPutObjectPayloadAsUnsigned,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*v4.PresignedHTTPRequest)\n\treturn out, nil\n}\n\nfunc addPutObjectPayloadAsUnsigned(stack *middleware.Stack, options Options) error {\n\tv4.RemoveContentSHA256HeaderMiddleware(stack)\n\tv4.RemoveComputePayloadSHA256Middleware(stack)\n\treturn v4.AddUnsignedPayloadMiddleware(stack)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutObjectAcl.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Uses the acl subresource to set the access control list (ACL) permissions for a\n// new or existing object in an S3 bucket. You must have the WRITE_ACP permission\n// to set the ACL of an object. For more information, see [What permissions can I grant?]in the Amazon S3 User\n// Guide.\n//\n// This functionality is not supported for Amazon S3 on Outposts.\n//\n// Depending on your application needs, you can choose to set the ACL on an object\n// using either the request body or the headers. For example, if you have an\n// existing application that updates a bucket ACL using the request body, you can\n// continue to use that approach. For more information, see [Access Control List (ACL) Overview]in the Amazon S3 User\n// Guide.\n//\n// If your bucket uses the bucket owner enforced setting for S3 Object Ownership,\n// ACLs are disabled and no longer affect permissions. You must use policies to\n// grant access to your bucket and the objects in it. Requests to set ACLs or\n// update ACLs fail and return the AccessControlListNotSupported error code.\n// Requests to read ACLs are still supported. For more information, see [Controlling object ownership]in the\n// Amazon S3 User Guide.\n//\n// Permissions You can set access permissions using one of the following methods:\n//\n//   - Specify a canned ACL with the x-amz-acl request header. Amazon S3 supports a\n//     set of predefined ACLs, known as canned ACLs. Each canned ACL has a predefined\n//     set of grantees and permissions. Specify the canned ACL name as the value of\n//     x-amz-ac l. If you use this header, you cannot use other access\n//     control-specific headers in your request. For more information, see [Canned ACL].\n//\n//   - Specify access permissions explicitly with the x-amz-grant-read ,\n//     x-amz-grant-read-acp , x-amz-grant-write-acp , and x-amz-grant-full-control\n//     headers. When using these headers, you specify explicit access permissions and\n//     grantees (Amazon Web Services accounts or Amazon S3 groups) who will receive the\n//     permission. If you use these ACL-specific headers, you cannot use x-amz-acl\n//     header to set a canned ACL. These parameters map to the set of permissions that\n//     Amazon S3 supports in an ACL. For more information, see [Access Control List (ACL) Overview].\n//\n// You specify each grantee as a type=value pair, where the type is one of the\n//\n//\tfollowing:\n//\n//\t- id – if the value specified is the canonical user ID of an Amazon Web\n//\tServices account\n//\n//\t- uri – if you are granting permissions to a predefined group\n//\n//\t- emailAddress – if the value specified is the email address of an Amazon Web\n//\tServices account\n//\n// Using email addresses to specify a grantee is only supported in the following\n//\n//\tAmazon Web Services Regions:\n//\n//\t- US East (N. Virginia)\n//\n//\t- US West (N. California)\n//\n//\t- US West (Oregon)\n//\n//\t- Asia Pacific (Singapore)\n//\n//\t- Asia Pacific (Sydney)\n//\n//\t- Asia Pacific (Tokyo)\n//\n//\t- Europe (Ireland)\n//\n//\t- South America (São Paulo)\n//\n// For a list of all the Amazon S3 supported Regions and endpoints, see [Regions and Endpoints]in the\n//\n//\tAmazon Web Services General Reference.\n//\n// For example, the following x-amz-grant-read header grants list objects\n//\n//\tpermission to the two Amazon Web Services accounts identified by their email\n//\taddresses.\n//\n// x-amz-grant-read: emailAddress=\"xyz@amazon.com\", emailAddress=\"abc@amazon.com\"\n//\n// You can use either a canned ACL or specify access permissions explicitly. You\n// cannot do both.\n//\n// Grantee Values You can specify the person (grantee) to whom you're assigning\n// access rights (using request elements) in the following ways:\n//\n//   - By the person's ID:\n//\n// <>ID<><>GranteesEmail<>\n//\n// DisplayName is optional and ignored in the request.\n//\n//   - By URI:\n//\n// <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n//\n//   - By Email address:\n//\n// <>Grantees@email.com<>lt;/Grantee>\n//\n// The grantee is resolved to the CanonicalUser and, in a response to a GET Object\n//\n//\tacl request, appears as the CanonicalUser.\n//\n// Using email addresses to specify a grantee is only supported in the following\n//\n//\tAmazon Web Services Regions:\n//\n//\t- US East (N. Virginia)\n//\n//\t- US West (N. California)\n//\n//\t- US West (Oregon)\n//\n//\t- Asia Pacific (Singapore)\n//\n//\t- Asia Pacific (Sydney)\n//\n//\t- Asia Pacific (Tokyo)\n//\n//\t- Europe (Ireland)\n//\n//\t- South America (São Paulo)\n//\n// For a list of all the Amazon S3 supported Regions and endpoints, see [Regions and Endpoints]in the\n//\n//\tAmazon Web Services General Reference.\n//\n// Versioning The ACL of an object is set at the object version level. By default,\n// PUT sets the ACL of the current version of an object. To set the ACL of a\n// different version, use the versionId subresource.\n//\n// The following operations are related to PutObjectAcl :\n//\n// [CopyObject]\n//\n// [GetObject]\n//\n// [Regions and Endpoints]: https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\n// [Access Control List (ACL) Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html\n// [Controlling object ownership]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html\n// [Canned ACL]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#CannedACL\n// [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\n// [What permissions can I grant?]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#permissions\n// [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\nfunc (c *Client) PutObjectAcl(ctx context.Context, params *PutObjectAclInput, optFns ...func(*Options)) (*PutObjectAclOutput, error) {\n\tif params == nil {\n\t\tparams = &PutObjectAclInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutObjectAcl\", params, optFns, c.addOperationPutObjectAclMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutObjectAclOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutObjectAclInput struct {\n\n\t// The bucket name that contains the object to which you want to attach the ACL.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Key for which the PUT action was initiated.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// The canned ACL to apply to the object. For more information, see [Canned ACL].\n\t//\n\t// [Canned ACL]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#CannedACL\n\tACL types.ObjectCannedACL\n\n\t// Contains the elements that set the ACL permissions for an object per grantee.\n\tAccessControlPolicy *types.AccessControlPolicy\n\n\t// Indicates the algorithm used to create the checksum for the object when you use\n\t// the SDK. This header will not provide any additional functionality if you don't\n\t// use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The Base64 encoded 128-bit MD5 digest of the data. This header must be used as\n\t// a message integrity check to verify that the request body was not corrupted in\n\t// transit. For more information, go to [RFC 1864.>]\n\t//\n\t// For requests made using the Amazon Web Services Command Line Interface (CLI) or\n\t// Amazon Web Services SDKs, this field is calculated automatically.\n\t//\n\t// [RFC 1864.>]: http://www.ietf.org/rfc/rfc1864.txt\n\tContentMD5 *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Allows grantee the read, write, read ACP, and write ACP permissions on the\n\t// bucket.\n\t//\n\t// This functionality is not supported for Amazon S3 on Outposts.\n\tGrantFullControl *string\n\n\t// Allows grantee to list the objects in the bucket.\n\t//\n\t// This functionality is not supported for Amazon S3 on Outposts.\n\tGrantRead *string\n\n\t// Allows grantee to read the bucket ACL.\n\t//\n\t// This functionality is not supported for Amazon S3 on Outposts.\n\tGrantReadACP *string\n\n\t// Allows grantee to create new objects in the bucket.\n\t//\n\t// For the bucket and object owners of existing objects, also allows deletions and\n\t// overwrites of those objects.\n\tGrantWrite *string\n\n\t// Allows grantee to write the ACL for the applicable bucket.\n\t//\n\t// This functionality is not supported for Amazon S3 on Outposts.\n\tGrantWriteACP *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// Version ID used to reference a specific version of the object.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tVersionId *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutObjectAclInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.Key = in.Key\n\n}\n\ntype PutObjectAclOutput struct {\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutObjectAclMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutObjectAcl{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutObjectAcl{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutObjectAcl\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutObjectAclValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutObjectAcl(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutObjectAclInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutObjectAclUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutObjectAclInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutObjectAcl(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutObjectAcl\",\n\t}\n}\n\n// getPutObjectAclRequestAlgorithmMember gets the request checksum algorithm value\n// provided as input.\nfunc getPutObjectAclRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutObjectAclInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutObjectAclInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutObjectAclRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutObjectAclBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getPutObjectAclBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutObjectAclInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutObjectAclUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutObjectAclBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutObjectLegalHold.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Applies a legal hold configuration to the specified object. For more\n// information, see [Locking Objects].\n//\n// This functionality is not supported for Amazon S3 on Outposts.\n//\n// [Locking Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html\nfunc (c *Client) PutObjectLegalHold(ctx context.Context, params *PutObjectLegalHoldInput, optFns ...func(*Options)) (*PutObjectLegalHoldOutput, error) {\n\tif params == nil {\n\t\tparams = &PutObjectLegalHoldInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutObjectLegalHold\", params, optFns, c.addOperationPutObjectLegalHoldMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutObjectLegalHoldOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutObjectLegalHoldInput struct {\n\n\t// The bucket name containing the object that you want to place a legal hold on.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The key name for the object that you want to place a legal hold on.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// Indicates the algorithm used to create the checksum for the object when you use\n\t// the SDK. This header will not provide any additional functionality if you don't\n\t// use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The MD5 hash for the request body.\n\t//\n\t// For requests made using the Amazon Web Services Command Line Interface (CLI) or\n\t// Amazon Web Services SDKs, this field is calculated automatically.\n\tContentMD5 *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Container element for the legal hold configuration you want to apply to the\n\t// specified object.\n\tLegalHold *types.ObjectLockLegalHold\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// The version ID of the object that you want to place a legal hold on.\n\tVersionId *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutObjectLegalHoldInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\n}\n\ntype PutObjectLegalHoldOutput struct {\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutObjectLegalHoldMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutObjectLegalHold{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutObjectLegalHold{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutObjectLegalHold\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutObjectLegalHoldValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutObjectLegalHold(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutObjectLegalHoldInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutObjectLegalHoldUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutObjectLegalHoldInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutObjectLegalHold(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutObjectLegalHold\",\n\t}\n}\n\n// getPutObjectLegalHoldRequestAlgorithmMember gets the request checksum algorithm\n// value provided as input.\nfunc getPutObjectLegalHoldRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutObjectLegalHoldInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutObjectLegalHoldInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutObjectLegalHoldRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutObjectLegalHoldBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getPutObjectLegalHoldBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutObjectLegalHoldInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutObjectLegalHoldUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutObjectLegalHoldBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutObjectLockConfiguration.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Places an Object Lock configuration on the specified bucket. The rule specified\n// in the Object Lock configuration will be applied by default to every new object\n// placed in the specified bucket. For more information, see [Locking Objects].\n//\n//   - The DefaultRetention settings require both a mode and a period.\n//\n//   - The DefaultRetention period can be either Days or Years but you must select\n//     one. You cannot specify Days and Years at the same time.\n//\n//   - You can enable Object Lock for new or existing buckets. For more\n//     information, see [Configuring Object Lock].\n//\n// [Configuring Object Lock]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock-configure.html\n// [Locking Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html\nfunc (c *Client) PutObjectLockConfiguration(ctx context.Context, params *PutObjectLockConfigurationInput, optFns ...func(*Options)) (*PutObjectLockConfigurationOutput, error) {\n\tif params == nil {\n\t\tparams = &PutObjectLockConfigurationInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutObjectLockConfiguration\", params, optFns, c.addOperationPutObjectLockConfigurationMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutObjectLockConfigurationOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutObjectLockConfigurationInput struct {\n\n\t// The bucket whose Object Lock configuration you want to create or replace.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Indicates the algorithm used to create the checksum for the object when you use\n\t// the SDK. This header will not provide any additional functionality if you don't\n\t// use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The MD5 hash for the request body.\n\t//\n\t// For requests made using the Amazon Web Services Command Line Interface (CLI) or\n\t// Amazon Web Services SDKs, this field is calculated automatically.\n\tContentMD5 *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// The Object Lock configuration that you want to apply to the specified bucket.\n\tObjectLockConfiguration *types.ObjectLockConfiguration\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// A token to allow Object Lock to be enabled for an existing bucket.\n\tToken *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutObjectLockConfigurationInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\n}\n\ntype PutObjectLockConfigurationOutput struct {\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutObjectLockConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutObjectLockConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutObjectLockConfiguration{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutObjectLockConfiguration\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutObjectLockConfigurationValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutObjectLockConfiguration(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutObjectLockConfigurationInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutObjectLockConfigurationUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutObjectLockConfigurationInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutObjectLockConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutObjectLockConfiguration\",\n\t}\n}\n\n// getPutObjectLockConfigurationRequestAlgorithmMember gets the request checksum\n// algorithm value provided as input.\nfunc getPutObjectLockConfigurationRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutObjectLockConfigurationInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutObjectLockConfigurationInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutObjectLockConfigurationRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutObjectLockConfigurationBucketMember returns a pointer to string denoting\n// a provided bucket member valueand a boolean indicating if the input has a\n// modeled bucket name,\nfunc getPutObjectLockConfigurationBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutObjectLockConfigurationInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutObjectLockConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutObjectLockConfigurationBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutObjectRetention.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Places an Object Retention configuration on an object. For more information,\n// see [Locking Objects]. Users or accounts require the s3:PutObjectRetention permission in order\n// to place an Object Retention configuration on objects. Bypassing a Governance\n// Retention configuration requires the s3:BypassGovernanceRetention permission.\n//\n// This functionality is not supported for Amazon S3 on Outposts.\n//\n// [Locking Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html\nfunc (c *Client) PutObjectRetention(ctx context.Context, params *PutObjectRetentionInput, optFns ...func(*Options)) (*PutObjectRetentionOutput, error) {\n\tif params == nil {\n\t\tparams = &PutObjectRetentionInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutObjectRetention\", params, optFns, c.addOperationPutObjectRetentionMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutObjectRetentionOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutObjectRetentionInput struct {\n\n\t// The bucket name that contains the object you want to apply this Object\n\t// Retention configuration to.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The key name for the object that you want to apply this Object Retention\n\t// configuration to.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// Indicates whether this action should bypass Governance-mode restrictions.\n\tBypassGovernanceRetention *bool\n\n\t// Indicates the algorithm used to create the checksum for the object when you use\n\t// the SDK. This header will not provide any additional functionality if you don't\n\t// use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The MD5 hash for the request body.\n\t//\n\t// For requests made using the Amazon Web Services Command Line Interface (CLI) or\n\t// Amazon Web Services SDKs, this field is calculated automatically.\n\tContentMD5 *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// The container element for the Object Retention configuration.\n\tRetention *types.ObjectLockRetention\n\n\t// The version ID for the object that you want to apply this Object Retention\n\t// configuration to.\n\tVersionId *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutObjectRetentionInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\n}\n\ntype PutObjectRetentionOutput struct {\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutObjectRetentionMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutObjectRetention{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutObjectRetention{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutObjectRetention\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutObjectRetentionValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutObjectRetention(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutObjectRetentionInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutObjectRetentionUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutObjectRetentionInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutObjectRetention(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutObjectRetention\",\n\t}\n}\n\n// getPutObjectRetentionRequestAlgorithmMember gets the request checksum algorithm\n// value provided as input.\nfunc getPutObjectRetentionRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutObjectRetentionInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutObjectRetentionInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutObjectRetentionRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutObjectRetentionBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getPutObjectRetentionBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutObjectRetentionInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutObjectRetentionUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutObjectRetentionBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutObjectTagging.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Sets the supplied tag-set to an object that already exists in a bucket. A tag\n// is a key-value pair. For more information, see [Object Tagging].\n//\n// You can associate tags with an object by sending a PUT request against the\n// tagging subresource that is associated with the object. You can retrieve tags by\n// sending a GET request. For more information, see [GetObjectTagging].\n//\n// For tagging-related restrictions related to characters and encodings, see [Tag Restrictions].\n// Note that Amazon S3 limits the maximum number of tags to 10 tags per object.\n//\n// To use this operation, you must have permission to perform the\n// s3:PutObjectTagging action. By default, the bucket owner has this permission and\n// can grant this permission to others.\n//\n// To put tags of any other version, use the versionId query parameter. You also\n// need permission for the s3:PutObjectVersionTagging action.\n//\n// PutObjectTagging has the following special errors. For more Amazon S3 errors\n// see, [Error Responses].\n//\n//   - InvalidTag - The tag provided was not a valid tag. This error can occur if\n//     the tag did not pass input validation. For more information, see [Object Tagging].\n//\n//   - MalformedXML - The XML provided does not match the schema.\n//\n//   - OperationAborted - A conflicting conditional action is currently in progress\n//     against this resource. Please try again.\n//\n//   - InternalError - The service was unable to apply the provided tag to the\n//     object.\n//\n// The following operations are related to PutObjectTagging :\n//\n// [GetObjectTagging]\n//\n// [DeleteObjectTagging]\n//\n// [Error Responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n// [DeleteObjectTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html\n// [Object Tagging]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-tagging.html\n// [Tag Restrictions]: https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/allocation-tag-restrictions.html\n// [GetObjectTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html\nfunc (c *Client) PutObjectTagging(ctx context.Context, params *PutObjectTaggingInput, optFns ...func(*Options)) (*PutObjectTaggingOutput, error) {\n\tif params == nil {\n\t\tparams = &PutObjectTaggingInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutObjectTagging\", params, optFns, c.addOperationPutObjectTaggingMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutObjectTaggingOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutObjectTaggingInput struct {\n\n\t// The bucket name containing the object.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Name of the object key.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// Container for the TagSet and Tag elements\n\t//\n\t// This member is required.\n\tTagging *types.Tagging\n\n\t// Indicates the algorithm used to create the checksum for the object when you use\n\t// the SDK. This header will not provide any additional functionality if you don't\n\t// use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The MD5 hash for the request body.\n\t//\n\t// For requests made using the Amazon Web Services Command Line Interface (CLI) or\n\t// Amazon Web Services SDKs, this field is calculated automatically.\n\tContentMD5 *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// The versionId of the object that the tag-set will be added to.\n\tVersionId *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutObjectTaggingInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\n}\n\ntype PutObjectTaggingOutput struct {\n\n\t// The versionId of the object the tag-set was added to.\n\tVersionId *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutObjectTaggingMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutObjectTagging{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutObjectTagging{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutObjectTagging\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutObjectTaggingValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutObjectTagging(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutObjectTaggingInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutObjectTaggingUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutObjectTaggingInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutObjectTagging(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutObjectTagging\",\n\t}\n}\n\n// getPutObjectTaggingRequestAlgorithmMember gets the request checksum algorithm\n// value provided as input.\nfunc getPutObjectTaggingRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutObjectTaggingInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutObjectTaggingInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutObjectTaggingRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutObjectTaggingBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getPutObjectTaggingBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutObjectTaggingInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutObjectTaggingUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutObjectTaggingBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutPublicAccessBlock.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// Creates or modifies the PublicAccessBlock configuration for an Amazon S3\n// bucket. To use this operation, you must have the s3:PutBucketPublicAccessBlock\n// permission. For more information about Amazon S3 permissions, see [Specifying Permissions in a Policy].\n//\n// When Amazon S3 evaluates the PublicAccessBlock configuration for a bucket or an\n// object, it checks the PublicAccessBlock configuration for both the bucket (or\n// the bucket that contains the object) and the bucket owner's account. If the\n// PublicAccessBlock configurations are different between the bucket and the\n// account, Amazon S3 uses the most restrictive combination of the bucket-level and\n// account-level settings.\n//\n// For more information about when Amazon S3 considers a bucket or an object\n// public, see [The Meaning of \"Public\"].\n//\n// The following operations are related to PutPublicAccessBlock :\n//\n// [GetPublicAccessBlock]\n//\n// [DeletePublicAccessBlock]\n//\n// [GetBucketPolicyStatus]\n//\n// [Using Amazon S3 Block Public Access]\n//\n// [GetPublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetPublicAccessBlock.html\n// [DeletePublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeletePublicAccessBlock.html\n// [Using Amazon S3 Block Public Access]: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html\n// [GetBucketPolicyStatus]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketPolicyStatus.html\n// [Specifying Permissions in a Policy]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html\n// [The Meaning of \"Public\"]: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status\nfunc (c *Client) PutPublicAccessBlock(ctx context.Context, params *PutPublicAccessBlockInput, optFns ...func(*Options)) (*PutPublicAccessBlockOutput, error) {\n\tif params == nil {\n\t\tparams = &PutPublicAccessBlockInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"PutPublicAccessBlock\", params, optFns, c.addOperationPutPublicAccessBlockMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*PutPublicAccessBlockOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype PutPublicAccessBlockInput struct {\n\n\t// The name of the Amazon S3 bucket whose PublicAccessBlock configuration you want\n\t// to set.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The PublicAccessBlock configuration that you want to apply to this Amazon S3\n\t// bucket. You can enable the configuration options in any combination. For more\n\t// information about when Amazon S3 considers a bucket or object public, see [The Meaning of \"Public\"]in\n\t// the Amazon S3 User Guide.\n\t//\n\t// [The Meaning of \"Public\"]: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status\n\t//\n\t// This member is required.\n\tPublicAccessBlockConfiguration *types.PublicAccessBlockConfiguration\n\n\t// Indicates the algorithm used to create the checksum for the object when you use\n\t// the SDK. This header will not provide any additional functionality if you don't\n\t// use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The MD5 hash of the PutPublicAccessBlock request body.\n\t//\n\t// For requests made using the Amazon Web Services Command Line Interface (CLI) or\n\t// Amazon Web Services SDKs, this field is calculated automatically.\n\tContentMD5 *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *PutPublicAccessBlockInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.UseS3ExpressControlEndpoint = ptr.Bool(true)\n}\n\ntype PutPublicAccessBlockOutput struct {\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationPutPublicAccessBlockMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpPutPublicAccessBlock{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpPutPublicAccessBlock{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"PutPublicAccessBlock\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpPutPublicAccessBlockValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutPublicAccessBlock(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutPublicAccessBlockInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutPublicAccessBlockUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *PutPublicAccessBlockInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opPutPublicAccessBlock(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"PutPublicAccessBlock\",\n\t}\n}\n\n// getPutPublicAccessBlockRequestAlgorithmMember gets the request checksum\n// algorithm value provided as input.\nfunc getPutPublicAccessBlockRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*PutPublicAccessBlockInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addPutPublicAccessBlockInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getPutPublicAccessBlockRequestAlgorithmMember,\n\t\tRequireChecksum:                  true,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getPutPublicAccessBlockBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getPutPublicAccessBlockBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*PutPublicAccessBlockInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addPutPublicAccessBlockUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getPutPublicAccessBlockBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_RestoreObject.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// # Restores an archived copy of an object back into Amazon S3\n//\n// This functionality is not supported for Amazon S3 on Outposts.\n//\n// This action performs the following types of requests:\n//\n//   - restore an archive - Restore an archived object\n//\n// For more information about the S3 structure in the request body, see the\n// following:\n//\n// [PutObject]\n//\n// [Managing Access with ACLs]\n//   - in the Amazon S3 User Guide\n//\n// [Protecting Data Using Server-Side Encryption]\n//   - in the Amazon S3 User Guide\n//\n// Permissions To use this operation, you must have permissions to perform the\n// s3:RestoreObject action. The bucket owner has this permission by default and can\n// grant this permission to others. For more information about permissions, see [Permissions Related to Bucket Subresource Operations]\n// and [Managing Access Permissions to Your Amazon S3 Resources]in the Amazon S3 User Guide.\n//\n// Restoring objects Objects that you archive to the S3 Glacier Flexible Retrieval\n// or S3 Glacier Deep Archive storage class, and S3 Intelligent-Tiering Archive or\n// S3 Intelligent-Tiering Deep Archive tiers, are not accessible in real time. For\n// objects in the S3 Glacier Flexible Retrieval or S3 Glacier Deep Archive storage\n// classes, you must first initiate a restore request, and then wait until a\n// temporary copy of the object is available. If you want a permanent copy of the\n// object, create a copy of it in the Amazon S3 Standard storage class in your S3\n// bucket. To access an archived object, you must restore the object for the\n// duration (number of days) that you specify. For objects in the Archive Access or\n// Deep Archive Access tiers of S3 Intelligent-Tiering, you must first initiate a\n// restore request, and then wait until the object is moved into the Frequent\n// Access tier.\n//\n// To restore a specific object version, you can provide a version ID. If you\n// don't provide a version ID, Amazon S3 restores the current version.\n//\n// When restoring an archived object, you can specify one of the following data\n// access tier options in the Tier element of the request body:\n//\n//   - Expedited - Expedited retrievals allow you to quickly access your data\n//     stored in the S3 Glacier Flexible Retrieval storage class or S3\n//     Intelligent-Tiering Archive tier when occasional urgent requests for restoring\n//     archives are required. For all but the largest archived objects (250 MB+), data\n//     accessed using Expedited retrievals is typically made available within 1–5\n//     minutes. Provisioned capacity ensures that retrieval capacity for Expedited\n//     retrievals is available when you need it. Expedited retrievals and provisioned\n//     capacity are not available for objects stored in the S3 Glacier Deep Archive\n//     storage class or S3 Intelligent-Tiering Deep Archive tier.\n//\n//   - Standard - Standard retrievals allow you to access any of your archived\n//     objects within several hours. This is the default option for retrieval requests\n//     that do not specify the retrieval option. Standard retrievals typically finish\n//     within 3–5 hours for objects stored in the S3 Glacier Flexible Retrieval storage\n//     class or S3 Intelligent-Tiering Archive tier. They typically finish within 12\n//     hours for objects stored in the S3 Glacier Deep Archive storage class or S3\n//     Intelligent-Tiering Deep Archive tier. Standard retrievals are free for objects\n//     stored in S3 Intelligent-Tiering.\n//\n//   - Bulk - Bulk retrievals free for objects stored in the S3 Glacier Flexible\n//     Retrieval and S3 Intelligent-Tiering storage classes, enabling you to retrieve\n//     large amounts, even petabytes, of data at no cost. Bulk retrievals typically\n//     finish within 5–12 hours for objects stored in the S3 Glacier Flexible Retrieval\n//     storage class or S3 Intelligent-Tiering Archive tier. Bulk retrievals are also\n//     the lowest-cost retrieval option when restoring objects from S3 Glacier Deep\n//     Archive. They typically finish within 48 hours for objects stored in the S3\n//     Glacier Deep Archive storage class or S3 Intelligent-Tiering Deep Archive tier.\n//\n// For more information about archive retrieval options and provisioned capacity\n// for Expedited data access, see [Restoring Archived Objects] in the Amazon S3 User Guide.\n//\n// You can use Amazon S3 restore speed upgrade to change the restore speed to a\n// faster speed while it is in progress. For more information, see [Upgrading the speed of an in-progress restore]in the Amazon\n// S3 User Guide.\n//\n// To get the status of object restoration, you can send a HEAD request.\n// Operations return the x-amz-restore header, which provides information about\n// the restoration status, in the response. You can use Amazon S3 event\n// notifications to notify you when a restore is initiated or completed. For more\n// information, see [Configuring Amazon S3 Event Notifications]in the Amazon S3 User Guide.\n//\n// After restoring an archived object, you can update the restoration period by\n// reissuing the request with a new period. Amazon S3 updates the restoration\n// period relative to the current time and charges only for the request-there are\n// no data transfer charges. You cannot update the restoration period when Amazon\n// S3 is actively processing your current restore request for the object.\n//\n// If your bucket has a lifecycle configuration with a rule that includes an\n// expiration action, the object expiration overrides the life span that you\n// specify in a restore request. For example, if you restore an object copy for 10\n// days, but the object is scheduled to expire in 3 days, Amazon S3 deletes the\n// object in 3 days. For more information about lifecycle configuration, see [PutBucketLifecycleConfiguration]and [Object Lifecycle Management]\n// in Amazon S3 User Guide.\n//\n// Responses A successful action returns either the 200 OK or 202 Accepted status\n// code.\n//\n//   - If the object is not previously restored, then Amazon S3 returns 202\n//     Accepted in the response.\n//\n//   - If the object is previously restored, Amazon S3 returns 200 OK in the\n//     response.\n//\n//   - Special errors:\n//\n//   - Code: RestoreAlreadyInProgress\n//\n//   - Cause: Object restore is already in progress.\n//\n//   - HTTP Status Code: 409 Conflict\n//\n//   - SOAP Fault Code Prefix: Client\n//\n//   - Code: GlacierExpeditedRetrievalNotAvailable\n//\n//   - Cause: expedited retrievals are currently not available. Try again later.\n//     (Returned if there is insufficient capacity to process the Expedited request.\n//     This error applies only to Expedited retrievals and not to S3 Standard or Bulk\n//     retrievals.)\n//\n//   - HTTP Status Code: 503\n//\n//   - SOAP Fault Code Prefix: N/A\n//\n// The following operations are related to RestoreObject :\n//\n// [PutBucketLifecycleConfiguration]\n//\n// [GetBucketNotificationConfiguration]\n//\n// [PutBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html\n// [Object Lifecycle Management]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html\n// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\n// [Configuring Amazon S3 Event Notifications]: https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html\n// [Managing Access with ACLs]: https://docs.aws.amazon.com/AmazonS3/latest/dev/S3_ACLs_UsingACLs.html\n// [Protecting Data Using Server-Side Encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/serv-side-encryption.html\n// [GetBucketNotificationConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketNotificationConfiguration.html\n// [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\n// [Restoring Archived Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/restoring-objects.html\n// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\n// [Upgrading the speed of an in-progress restore]: https://docs.aws.amazon.com/AmazonS3/latest/dev/restoring-objects.html#restoring-objects-upgrade-tier.title.html\nfunc (c *Client) RestoreObject(ctx context.Context, params *RestoreObjectInput, optFns ...func(*Options)) (*RestoreObjectOutput, error) {\n\tif params == nil {\n\t\tparams = &RestoreObjectInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"RestoreObject\", params, optFns, c.addOperationRestoreObjectMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*RestoreObjectOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype RestoreObjectInput struct {\n\n\t// The bucket name containing the object to restore.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Object key for which the action was initiated.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// Indicates the algorithm used to create the checksum for the object when you use\n\t// the SDK. This header will not provide any additional functionality if you don't\n\t// use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// Container for restore job parameters.\n\tRestoreRequest *types.RestoreRequest\n\n\t// VersionId used to reference a specific version of the object.\n\tVersionId *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *RestoreObjectInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\n}\n\ntype RestoreObjectOutput struct {\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// Indicates the path in the provided S3 output location where Select results will\n\t// be restored to.\n\tRestoreOutputPath *string\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationRestoreObjectMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpRestoreObject{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpRestoreObject{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"RestoreObject\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpRestoreObjectValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opRestoreObject(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRestoreObjectInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRestoreObjectUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *RestoreObjectInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opRestoreObject(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"RestoreObject\",\n\t}\n}\n\n// getRestoreObjectRequestAlgorithmMember gets the request checksum algorithm\n// value provided as input.\nfunc getRestoreObjectRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*RestoreObjectInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addRestoreObjectInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getRestoreObjectRequestAlgorithmMember,\n\t\tRequireChecksum:                  false,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           false,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getRestoreObjectBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getRestoreObjectBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*RestoreObjectInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addRestoreObjectUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getRestoreObjectBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_SelectObjectContent.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithysync \"github.com/aws/smithy-go/sync\"\n\t\"sync\"\n)\n\n// This operation is not supported for directory buckets.\n//\n// This action filters the contents of an Amazon S3 object based on a simple\n// structured query language (SQL) statement. In the request, along with the SQL\n// expression, you must also specify a data serialization format (JSON, CSV, or\n// Apache Parquet) of the object. Amazon S3 uses this format to parse object data\n// into records, and returns only records that match the specified SQL expression.\n// You must also specify the data serialization format for the response.\n//\n// This functionality is not supported for Amazon S3 on Outposts.\n//\n// For more information about Amazon S3 Select, see [Selecting Content from Objects] and [SELECT Command] in the Amazon S3 User\n// Guide.\n//\n// Permissions You must have the s3:GetObject permission for this operation.\n// Amazon S3 Select does not support anonymous access. For more information about\n// permissions, see [Specifying Permissions in a Policy]in the Amazon S3 User Guide.\n//\n// Object Data Formats You can use Amazon S3 Select to query objects that have the\n// following format properties:\n//\n//   - CSV, JSON, and Parquet - Objects must be in CSV, JSON, or Parquet format.\n//\n//   - UTF-8 - UTF-8 is the only encoding type Amazon S3 Select supports.\n//\n//   - GZIP or BZIP2 - CSV and JSON files can be compressed using GZIP or BZIP2.\n//     GZIP and BZIP2 are the only compression formats that Amazon S3 Select supports\n//     for CSV and JSON files. Amazon S3 Select supports columnar compression for\n//     Parquet using GZIP or Snappy. Amazon S3 Select does not support whole-object\n//     compression for Parquet objects.\n//\n//   - Server-side encryption - Amazon S3 Select supports querying objects that\n//     are protected with server-side encryption.\n//\n// For objects that are encrypted with customer-provided encryption keys (SSE-C),\n//\n//\tyou must use HTTPS, and you must use the headers that are documented in the [GetObject].\n//\tFor more information about SSE-C, see [Server-Side Encryption (Using Customer-Provided Encryption Keys)]in the Amazon S3 User Guide.\n//\n// For objects that are encrypted with Amazon S3 managed keys (SSE-S3) and Amazon\n//\n//\tWeb Services KMS keys (SSE-KMS), server-side encryption is handled\n//\ttransparently, so you don't need to specify anything. For more information about\n//\tserver-side encryption, including SSE-S3 and SSE-KMS, see [Protecting Data Using Server-Side Encryption]in the Amazon S3\n//\tUser Guide.\n//\n// Working with the Response Body Given the response size is unknown, Amazon S3\n// Select streams the response as a series of messages and includes a\n// Transfer-Encoding header with chunked as its value in the response. For more\n// information, see [Appendix: SelectObjectContent Response].\n//\n// GetObject Support The SelectObjectContent action does not support the following\n// GetObject functionality. For more information, see [GetObject].\n//\n//   - Range : Although you can specify a scan range for an Amazon S3 Select\n//     request (see [SelectObjectContentRequest - ScanRange]in the request parameters), you cannot specify the range of\n//     bytes of an object to return.\n//\n//   - The GLACIER , DEEP_ARCHIVE , and REDUCED_REDUNDANCY storage classes, or the\n//     ARCHIVE_ACCESS and DEEP_ARCHIVE_ACCESS access tiers of the INTELLIGENT_TIERING\n//     storage class: You cannot query objects in the GLACIER , DEEP_ARCHIVE , or\n//     REDUCED_REDUNDANCY storage classes, nor objects in the ARCHIVE_ACCESS or\n//     DEEP_ARCHIVE_ACCESS access tiers of the INTELLIGENT_TIERING storage class. For\n//     more information about storage classes, see [Using Amazon S3 storage classes]in the Amazon S3 User Guide.\n//\n// Special Errors For a list of special errors for this operation, see [List of SELECT Object Content Error Codes]\n//\n// The following operations are related to SelectObjectContent :\n//\n// [GetObject]\n//\n// [GetBucketLifecycleConfiguration]\n//\n// [PutBucketLifecycleConfiguration]\n//\n// [Appendix: SelectObjectContent Response]: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTSelectObjectAppendix.html\n// [Selecting Content from Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/selecting-content-from-objects.html\n// [PutBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html\n// [SelectObjectContentRequest - ScanRange]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_SelectObjectContent.html#AmazonS3-SelectObjectContent-request-ScanRange\n// [List of SELECT Object Content Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#SelectObjectContentErrorCodeList\n// [GetBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html\n// [Using Amazon S3 storage classes]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html\n// [SELECT Command]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-glacier-select-sql-reference-select.html\n// [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\n// [Specifying Permissions in a Policy]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html\n//\n// [Server-Side Encryption (Using Customer-Provided Encryption Keys)]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\n// [Protecting Data Using Server-Side Encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/serv-side-encryption.html\nfunc (c *Client) SelectObjectContent(ctx context.Context, params *SelectObjectContentInput, optFns ...func(*Options)) (*SelectObjectContentOutput, error) {\n\tif params == nil {\n\t\tparams = &SelectObjectContentInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"SelectObjectContent\", params, optFns, c.addOperationSelectObjectContentMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*SelectObjectContentOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\n// Learn Amazon S3 Select is no longer available to new customers. Existing\n// customers of Amazon S3 Select can continue to use the feature as usual. [Learn more]\n//\n// Request to filter the contents of an Amazon S3 object based on a simple\n// Structured Query Language (SQL) statement. In the request, along with the SQL\n// expression, you must specify a data serialization format (JSON or CSV) of the\n// object. Amazon S3 uses this to parse object data into records. It returns only\n// records that match the specified SQL expression. You must also specify the data\n// serialization format for the response. For more information, see [S3Select API Documentation].\n//\n// [Learn more]: http://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/\n// [S3Select API Documentation]: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectSELECTContent.html\ntype SelectObjectContentInput struct {\n\n\t// The S3 bucket.\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// The expression that is used to query the object.\n\t//\n\t// This member is required.\n\tExpression *string\n\n\t// The type of the provided expression (for example, SQL).\n\t//\n\t// This member is required.\n\tExpressionType types.ExpressionType\n\n\t// Describes the format of the data in the object that is being queried.\n\t//\n\t// This member is required.\n\tInputSerialization *types.InputSerialization\n\n\t// The object key.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// Describes the format of the data that you want Amazon S3 to return in response.\n\t//\n\t// This member is required.\n\tOutputSerialization *types.OutputSerialization\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Specifies if periodic request progress information should be enabled.\n\tRequestProgress *types.RequestProgress\n\n\t// The server-side encryption (SSE) algorithm used to encrypt the object. This\n\t// parameter is needed only when the object was created using a checksum algorithm.\n\t// For more information, see [Protecting data using SSE-C keys]in the Amazon S3 User Guide.\n\t//\n\t// [Protecting data using SSE-C keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\n\tSSECustomerAlgorithm *string\n\n\t// The server-side encryption (SSE) customer managed key. This parameter is needed\n\t// only when the object was created using a checksum algorithm. For more\n\t// information, see [Protecting data using SSE-C keys]in the Amazon S3 User Guide.\n\t//\n\t// [Protecting data using SSE-C keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\n\tSSECustomerKey *string\n\n\t// The MD5 server-side encryption (SSE) customer managed key. This parameter is\n\t// needed only when the object was created using a checksum algorithm. For more\n\t// information, see [Protecting data using SSE-C keys]in the Amazon S3 User Guide.\n\t//\n\t// [Protecting data using SSE-C keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\n\tSSECustomerKeyMD5 *string\n\n\t// Specifies the byte range of the object to get the records from. A record is\n\t// processed when its first byte is contained by the range. This parameter is\n\t// optional, but when specified, it must not be empty. See RFC 2616, Section\n\t// 14.35.1 about how to specify the start and end of the range.\n\t//\n\t// ScanRange may be used in the following ways:\n\t//\n\t//   - 50100 - process only the records starting between the bytes 50 and 100\n\t//   (inclusive, counting from zero)\n\t//\n\t//   - 50 - process only the records starting after the byte 50\n\t//\n\t//   - 50 - process only the records within the last 50 bytes of the file.\n\tScanRange *types.ScanRange\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *SelectObjectContentInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\n}\n\ntype SelectObjectContentOutput struct {\n\teventStream *SelectObjectContentEventStream\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\n// GetStream returns the type to interact with the event stream.\nfunc (o *SelectObjectContentOutput) GetStream() *SelectObjectContentEventStream {\n\treturn o.eventStream\n}\n\nfunc (c *Client) addOperationSelectObjectContentMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpSelectObjectContent{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpSelectObjectContent{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"SelectObjectContent\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addEventStreamSelectObjectContentMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpSelectObjectContentValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opSelectObjectContent(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSelectObjectContentUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *SelectObjectContentInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opSelectObjectContent(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"SelectObjectContent\",\n\t}\n}\n\n// getSelectObjectContentBucketMember returns a pointer to string denoting a\n// provided bucket member valueand a boolean indicating if the input has a modeled\n// bucket name,\nfunc getSelectObjectContentBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*SelectObjectContentInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addSelectObjectContentUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getSelectObjectContentBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n\n// SelectObjectContentEventStream provides the event stream handling for the SelectObjectContent operation.\n//\n// For testing and mocking the event stream this type should be initialized via\n// the NewSelectObjectContentEventStream constructor function. Using the functional options\n// to pass in nested mock behavior.\ntype SelectObjectContentEventStream struct {\n\t// SelectObjectContentEventStreamReader is the EventStream reader for the\n\t// SelectObjectContentEventStream events. This value is automatically set by the\n\t// SDK when the API call is made Use this member when unit testing your code with\n\t// the SDK to mock out the EventStream Reader.\n\t//\n\t// Must not be nil.\n\tReader SelectObjectContentEventStreamReader\n\n\tdone      chan struct{}\n\tcloseOnce sync.Once\n\terr       *smithysync.OnceErr\n}\n\n// NewSelectObjectContentEventStream initializes an SelectObjectContentEventStream.\n// This function should only be used for testing and mocking the SelectObjectContentEventStream\n// stream within your application.\n//\n// The Reader member must be set before reading events from the stream.\nfunc NewSelectObjectContentEventStream(optFns ...func(*SelectObjectContentEventStream)) *SelectObjectContentEventStream {\n\tes := &SelectObjectContentEventStream{\n\t\tdone: make(chan struct{}),\n\t\terr:  smithysync.NewOnceErr(),\n\t}\n\tfor _, fn := range optFns {\n\t\tfn(es)\n\t}\n\treturn es\n}\n\n// Events returns a channel to read events from.\nfunc (es *SelectObjectContentEventStream) Events() <-chan types.SelectObjectContentEventStream {\n\treturn es.Reader.Events()\n}\n\n// Close closes the stream. This will also cause the stream to be closed.\n// Close must be called when done using the stream API. Not calling Close\n// may result in resource leaks.\n//\n// Will close the underlying EventStream writer and reader, and no more events can be\n// sent or received.\nfunc (es *SelectObjectContentEventStream) Close() error {\n\tes.closeOnce.Do(es.safeClose)\n\treturn es.Err()\n}\n\nfunc (es *SelectObjectContentEventStream) safeClose() {\n\tclose(es.done)\n\n\tes.Reader.Close()\n}\n\n// Err returns any error that occurred while reading or writing EventStream Events\n// from the service API's response. Returns nil if there were no errors.\nfunc (es *SelectObjectContentEventStream) Err() error {\n\tif err := es.err.Err(); err != nil {\n\t\treturn err\n\t}\n\n\tif err := es.Reader.Err(); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (es *SelectObjectContentEventStream) waitStreamClose() {\n\ttype errorSet interface {\n\t\tErrorSet() <-chan struct{}\n\t}\n\n\tvar outputErrCh <-chan struct{}\n\tif v, ok := es.Reader.(errorSet); ok {\n\t\toutputErrCh = v.ErrorSet()\n\t}\n\tvar outputClosedCh <-chan struct{}\n\tif v, ok := es.Reader.(interface{ Closed() <-chan struct{} }); ok {\n\t\toutputClosedCh = v.Closed()\n\t}\n\n\tselect {\n\tcase <-es.done:\n\tcase <-outputErrCh:\n\t\tes.err.SetError(es.Reader.Err())\n\t\tes.Close()\n\n\tcase <-outputClosedCh:\n\t\tif err := es.Reader.Err(); err != nil {\n\t\t\tes.err.SetError(es.Reader.Err())\n\t\t}\n\t\tes.Close()\n\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_UploadPart.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\tawshttp \"github.com/aws/aws-sdk-go-v2/aws/transport/http\"\n\tinternalChecksum \"github.com/aws/aws-sdk-go-v2/service/internal/checksum\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"io\"\n)\n\n// Uploads a part in a multipart upload.\n//\n// In this operation, you provide new data as a part of an object in your request.\n// However, you have an option to specify your existing Amazon S3 object as a data\n// source for the part you are uploading. To upload a part from an existing object,\n// you use the [UploadPartCopy]operation.\n//\n// You must initiate a multipart upload (see [CreateMultipartUpload]) before you can upload any part. In\n// response to your initiate request, Amazon S3 returns an upload ID, a unique\n// identifier that you must include in your upload part request.\n//\n// Part numbers can be any number from 1 to 10,000, inclusive. A part number\n// uniquely identifies a part and also defines its position within the object being\n// created. If you upload a new part using the same part number that was used with\n// a previous part, the previously uploaded part is overwritten.\n//\n// For information about maximum and minimum part sizes and other multipart upload\n// specifications, see [Multipart upload limits]in the Amazon S3 User Guide.\n//\n// After you initiate multipart upload and upload one or more parts, you must\n// either complete or abort multipart upload in order to stop getting charged for\n// storage of the uploaded parts. Only after you either complete or abort multipart\n// upload, Amazon S3 frees up the parts storage and stops charging you for the\n// parts storage.\n//\n// For more information on multipart uploads, go to [Multipart Upload Overview] in the Amazon S3 User Guide .\n//\n// Directory buckets - For directory buckets, you must make requests for this API\n// operation to the Zonal endpoint. These endpoints support virtual-hosted-style\n// requests in the format\n// https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name\n// . Path-style requests are not supported. For more information about endpoints\n// in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information\n// about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// Permissions\n//   - General purpose bucket permissions - To perform a multipart upload with\n//     encryption using an Key Management Service key, the requester must have\n//     permission to the kms:Decrypt and kms:GenerateDataKey actions on the key. The\n//     requester must also have permissions for the kms:GenerateDataKey action for\n//     the CreateMultipartUpload API. Then, the requester needs permissions for the\n//     kms:Decrypt action on the UploadPart and UploadPartCopy APIs.\n//\n// These permissions are required because Amazon S3 must decrypt and read data\n//\n//\tfrom the encrypted file parts before it completes the multipart upload. For more\n//\tinformation about KMS permissions, see [Protecting data using server-side encryption with KMS]in the Amazon S3 User Guide. For\n//\tinformation about the permissions required to use the multipart upload API, see [Multipart upload and permissions]\n//\tand [Multipart upload API and permissions]in the Amazon S3 User Guide.\n//\n//\t- Directory bucket permissions - To grant access to this API operation on a\n//\tdirectory bucket, we recommend that you use the [CreateSession]CreateSession API operation\n//\tfor session-based authorization. Specifically, you grant the\n//\ts3express:CreateSession permission to the directory bucket in a bucket policy\n//\tor an IAM identity-based policy. Then, you make the CreateSession API call on\n//\tthe bucket to obtain a session token. With the session token in your request\n//\theader, you can make API requests to this operation. After the session token\n//\texpires, you make another CreateSession API call to generate a new session\n//\ttoken for use. Amazon Web Services CLI or SDKs create session and refresh the\n//\tsession token automatically to avoid service interruptions when a session\n//\texpires. For more information about authorization, see [CreateSession]CreateSession .\n//\n// If the object is encrypted with SSE-KMS, you must also have the\n//\n//\tkms:GenerateDataKey and kms:Decrypt permissions in IAM identity-based policies\n//\tand KMS key policies for the KMS key.\n//\n// Data integrity  General purpose bucket - To ensure that data is not corrupted\n// traversing the network, specify the Content-MD5 header in the upload part\n// request. Amazon S3 checks the part data against the provided MD5 value. If they\n// do not match, Amazon S3 returns an error. If the upload request is signed with\n// Signature Version 4, then Amazon Web Services S3 uses the x-amz-content-sha256\n// header as a checksum instead of Content-MD5 . For more information see [Authenticating Requests: Using the Authorization Header (Amazon Web Services Signature Version 4)].\n//\n// Directory buckets - MD5 is not supported by directory buckets. You can use\n// checksum algorithms to check object integrity.\n//\n// Encryption\n//   - General purpose bucket - Server-side encryption is for data encryption at\n//     rest. Amazon S3 encrypts your data as it writes it to disks in its data centers\n//     and decrypts it when you access it. You have mutually exclusive options to\n//     protect data using server-side encryption in Amazon S3, depending on how you\n//     choose to manage the encryption keys. Specifically, the encryption key options\n//     are Amazon S3 managed keys (SSE-S3), Amazon Web Services KMS keys (SSE-KMS), and\n//     Customer-Provided Keys (SSE-C). Amazon S3 encrypts data with server-side\n//     encryption using Amazon S3 managed keys (SSE-S3) by default. You can optionally\n//     tell Amazon S3 to encrypt data at rest using server-side encryption with other\n//     key options. The option you use depends on whether you want to use KMS keys\n//     (SSE-KMS) or provide your own encryption key (SSE-C).\n//\n// Server-side encryption is supported by the S3 Multipart Upload operations.\n//\n//\tUnless you are using a customer-provided encryption key (SSE-C), you don't need\n//\tto specify the encryption parameters in each UploadPart request. Instead, you\n//\tonly need to specify the server-side encryption parameters in the initial\n//\tInitiate Multipart request. For more information, see [CreateMultipartUpload].\n//\n// If you request server-side encryption using a customer-provided encryption key\n//\n//\t(SSE-C) in your initiate multipart upload request, you must provide identical\n//\tencryption information in each part upload using the following request headers.\n//\n//\t- x-amz-server-side-encryption-customer-algorithm\n//\n//\t- x-amz-server-side-encryption-customer-key\n//\n//\t- x-amz-server-side-encryption-customer-key-MD5\n//\n// For more information, see [Using Server-Side Encryption]in the Amazon S3 User Guide.\n//\n//   - Directory buckets - For directory buckets, there are only two supported\n//     options for server-side encryption: server-side encryption with Amazon S3\n//     managed keys (SSE-S3) ( AES256 ) and server-side encryption with KMS keys\n//     (SSE-KMS) ( aws:kms ).\n//\n// Special errors\n//\n//   - Error Code: NoSuchUpload\n//\n//   - Description: The specified multipart upload does not exist. The upload ID\n//     might be invalid, or the multipart upload might have been aborted or completed.\n//\n//   - HTTP Status Code: 404 Not Found\n//\n//   - SOAP Fault Code Prefix: Client\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// Bucket-name.s3express-zone-id.region-code.amazonaws.com .\n//\n// The following operations are related to UploadPart :\n//\n// [CreateMultipartUpload]\n//\n// [CompleteMultipartUpload]\n//\n// [AbortMultipartUpload]\n//\n// [ListParts]\n//\n// [ListMultipartUploads]\n//\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [ListParts]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html\n// [Authenticating Requests: Using the Authorization Header (Amazon Web Services Signature Version 4)]: https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-auth-using-authorization-header.html\n// [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\n// [CompleteMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html\n// [CreateMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html\n// [Using Server-Side Encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html\n// [Multipart upload limits]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html\n// [AbortMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html\n// [Multipart Upload Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html\n// [ListMultipartUploads]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n//\n// [Protecting data using server-side encryption with KMS]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html\n// [Multipart upload and permissions]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html\n// [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\n// [Multipart upload API and permissions]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpuAndPermissions\nfunc (c *Client) UploadPart(ctx context.Context, params *UploadPartInput, optFns ...func(*Options)) (*UploadPartOutput, error) {\n\tif params == nil {\n\t\tparams = &UploadPartInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"UploadPart\", params, optFns, c.addOperationUploadPartMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*UploadPartOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype UploadPartInput struct {\n\n\t// The name of the bucket to which the multipart upload was initiated.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use virtual-hosted-style requests in the format\n\t// Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests\n\t// are not supported. Directory bucket names must be unique in the chosen Zone\n\t// (Availability Zone or Local Zone). Bucket names must follow the format\n\t// bucket-base-name--zone-id--x-s3 (for example,\n\t// amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide.\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// Object Lambda access points are not supported by directory buckets.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Object key for which the multipart upload was initiated.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// Part number of part being uploaded. This is a positive integer between 1 and\n\t// 10,000.\n\t//\n\t// This member is required.\n\tPartNumber *int32\n\n\t// Upload ID identifying the multipart upload whose part is being uploaded.\n\t//\n\t// This member is required.\n\tUploadId *string\n\n\t// Object data.\n\tBody io.Reader\n\n\t// Indicates the algorithm used to create the checksum for the object when you use\n\t// the SDK. This header will not provide any additional functionality if you don't\n\t// use the SDK. When you send this header, there must be a corresponding\n\t// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the\n\t// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// If you provide an individual checksum, Amazon S3 ignores any provided\n\t// ChecksumAlgorithm parameter.\n\t//\n\t// This checksum algorithm must be the same for all parts and it match the\n\t// checksum value supplied in the CreateMultipartUpload request.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumAlgorithm types.ChecksumAlgorithm\n\n\t// This header can be used as a data integrity check to verify that the data\n\t// received is the same data that was originally sent. This header specifies the\n\t// Base64 encoded, 32-bit CRC32 checksum of the object. For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumCRC32 *string\n\n\t// This header can be used as a data integrity check to verify that the data\n\t// received is the same data that was originally sent. This header specifies the\n\t// Base64 encoded, 32-bit CRC32C checksum of the object. For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumCRC32C *string\n\n\t// This header can be used as a data integrity check to verify that the data\n\t// received is the same data that was originally sent. This header specifies the\n\t// Base64 encoded, 64-bit CRC64NVME checksum of the part. For more information,\n\t// see [Checking object integrity]in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumCRC64NVME *string\n\n\t// This header can be used as a data integrity check to verify that the data\n\t// received is the same data that was originally sent. This header specifies the\n\t// Base64 encoded, 160-bit SHA1 digest of the object. For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumSHA1 *string\n\n\t// This header can be used as a data integrity check to verify that the data\n\t// received is the same data that was originally sent. This header specifies the\n\t// Base64 encoded, 256-bit SHA256 digest of the object. For more information, see [Checking object integrity]\n\t// in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumSHA256 *string\n\n\t// Size of the body in bytes. This parameter is useful when the size of the body\n\t// cannot be determined automatically.\n\tContentLength *int64\n\n\t// The Base64 encoded 128-bit MD5 digest of the part data. This parameter is\n\t// auto-populated when using the command from the CLI. This parameter is required\n\t// if object lock parameters are specified.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tContentMD5 *string\n\n\t// The account ID of the expected bucket owner. If the account ID that you provide\n\t// does not match the actual owner of the bucket, the request fails with the HTTP\n\t// status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// Specifies the algorithm to use when encrypting the object (for example, AES256).\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerAlgorithm *string\n\n\t// Specifies the customer-provided encryption key for Amazon S3 to use in\n\t// encrypting data. This value is used to store the object and then it is\n\t// discarded; Amazon S3 does not store the encryption key. The key must be\n\t// appropriate for use with the algorithm specified in the\n\t// x-amz-server-side-encryption-customer-algorithm header . This must be the same\n\t// encryption key specified in the initiate multipart upload request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerKey *string\n\n\t// Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321.\n\t// Amazon S3 uses this header for a message integrity check to ensure that the\n\t// encryption key was transmitted without error.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerKeyMD5 *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *UploadPartInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.Key = in.Key\n\n}\n\ntype UploadPartOutput struct {\n\n\t// Indicates whether the multipart upload uses an S3 Bucket Key for server-side\n\t// encryption with Key Management Service (KMS) keys (SSE-KMS).\n\tBucketKeyEnabled *bool\n\n\t// The Base64 encoded, 32-bit CRC32 checksum of the object. This checksum is only\n\t// be present if the checksum was uploaded with the object. When you use an API\n\t// operation on an object that was uploaded using multipart uploads, this value may\n\t// not be a direct checksum value of the full object. Instead, it's a calculation\n\t// based on the checksum values of each individual part. For more information about\n\t// how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\n\tChecksumCRC32 *string\n\n\t// The Base64 encoded, 32-bit CRC32C checksum of the object. This checksum is only\n\t// present if the checksum was uploaded with the object. When you use an API\n\t// operation on an object that was uploaded using multipart uploads, this value may\n\t// not be a direct checksum value of the full object. Instead, it's a calculation\n\t// based on the checksum values of each individual part. For more information about\n\t// how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\n\tChecksumCRC32C *string\n\n\t// This header can be used as a data integrity check to verify that the data\n\t// received is the same data that was originally sent. This header specifies the\n\t// Base64 encoded, 64-bit CRC64NVME checksum of the part. For more information,\n\t// see [Checking object integrity]in the Amazon S3 User Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\n\tChecksumCRC64NVME *string\n\n\t// The Base64 encoded, 160-bit SHA1 digest of the object. This will only be\n\t// present if the object was uploaded with the object. When you use the API\n\t// operation on an object that was uploaded using multipart uploads, this value may\n\t// not be a direct checksum value of the full object. Instead, it's a calculation\n\t// based on the checksum values of each individual part. For more information about\n\t// how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\n\tChecksumSHA1 *string\n\n\t// The Base64 encoded, 256-bit SHA256 digest of the object. This will only be\n\t// present if the object was uploaded with the object. When you use an API\n\t// operation on an object that was uploaded using multipart uploads, this value may\n\t// not be a direct checksum value of the full object. Instead, it's a calculation\n\t// based on the checksum values of each individual part. For more information about\n\t// how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\n\tChecksumSHA256 *string\n\n\t// Entity tag for the uploaded object.\n\tETag *string\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// If server-side encryption with a customer-provided encryption key was\n\t// requested, the response will include this header to confirm the encryption\n\t// algorithm that's used.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerAlgorithm *string\n\n\t// If server-side encryption with a customer-provided encryption key was\n\t// requested, the response will include this header to provide the round-trip\n\t// message integrity verification of the customer-provided encryption key.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerKeyMD5 *string\n\n\t// If present, indicates the ID of the KMS key that was used for object encryption.\n\tSSEKMSKeyId *string\n\n\t// The server-side encryption algorithm used when you store this object in Amazon\n\t// S3 (for example, AES256 , aws:kms ).\n\tServerSideEncryption types.ServerSideEncryption\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationUploadPartMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpUploadPart{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpUploadPart{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"UploadPart\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestChecksumMetricsTracking(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpUploadPartValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opUploadPart(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = add100Continue(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addUploadPartInputChecksumMiddlewares(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addUploadPartUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.UseDynamicPayloadSigningMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *UploadPartInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opUploadPart(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"UploadPart\",\n\t}\n}\n\n// getUploadPartRequestAlgorithmMember gets the request checksum algorithm value\n// provided as input.\nfunc getUploadPartRequestAlgorithmMember(input interface{}) (string, bool) {\n\tin := input.(*UploadPartInput)\n\tif len(in.ChecksumAlgorithm) == 0 {\n\t\treturn \"\", false\n\t}\n\treturn string(in.ChecksumAlgorithm), true\n}\n\nfunc addUploadPartInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {\n\treturn addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{\n\t\tGetAlgorithm:                     getUploadPartRequestAlgorithmMember,\n\t\tRequireChecksum:                  false,\n\t\tRequestChecksumCalculation:       options.RequestChecksumCalculation,\n\t\tEnableTrailingChecksum:           true,\n\t\tEnableComputeSHA256PayloadHash:   true,\n\t\tEnableDecodedContentLengthHeader: true,\n\t})\n}\n\n// getUploadPartBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getUploadPartBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*UploadPartInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addUploadPartUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getUploadPartBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n\n// PresignUploadPart is used to generate a presigned HTTP Request which contains\n// presigned URL, signed headers and HTTP method used.\nfunc (c *PresignClient) PresignUploadPart(ctx context.Context, params *UploadPartInput, optFns ...func(*PresignOptions)) (*v4.PresignedHTTPRequest, error) {\n\tif params == nil {\n\t\tparams = &UploadPartInput{}\n\t}\n\toptions := c.options.copy()\n\tfor _, fn := range optFns {\n\t\tfn(&options)\n\t}\n\tclientOptFns := append(options.ClientOptions, withNopHTTPClientAPIOption)\n\n\tclientOptFns = append(options.ClientOptions, withNoDefaultChecksumAPIOption)\n\n\tresult, _, err := c.client.invokeOperation(ctx, \"UploadPart\", params, clientOptFns,\n\t\tc.client.addOperationUploadPartMiddlewares,\n\t\tpresignConverter(options).convertToPresignMiddleware,\n\t\tfunc(stack *middleware.Stack, options Options) error {\n\t\t\treturn awshttp.RemoveContentTypeHeader(stack)\n\t\t},\n\t\taddUploadPartPayloadAsUnsigned,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*v4.PresignedHTTPRequest)\n\treturn out, nil\n}\n\nfunc addUploadPartPayloadAsUnsigned(stack *middleware.Stack, options Options) error {\n\tv4.RemoveContentSHA256HeaderMiddleware(stack)\n\tv4.RemoveComputePayloadSHA256Middleware(stack)\n\treturn v4.AddUnsignedPayloadMiddleware(stack)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_UploadPartCopy.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"time\"\n)\n\n// Uploads a part by copying data from an existing object as data source. To\n// specify the data source, you add the request header x-amz-copy-source in your\n// request. To specify a byte range, you add the request header\n// x-amz-copy-source-range in your request.\n//\n// For information about maximum and minimum part sizes and other multipart upload\n// specifications, see [Multipart upload limits]in the Amazon S3 User Guide.\n//\n// Instead of copying data from an existing object as part data, you might use the [UploadPart]\n// action to upload new data as a part of an object in your request.\n//\n// You must initiate a multipart upload before you can upload any part. In\n// response to your initiate request, Amazon S3 returns the upload ID, a unique\n// identifier that you must include in your upload part request.\n//\n// For conceptual information about multipart uploads, see [Uploading Objects Using Multipart Upload] in the Amazon S3 User\n// Guide. For information about copying objects using a single atomic action vs. a\n// multipart upload, see [Operations on Objects]in the Amazon S3 User Guide.\n//\n// Directory buckets - For directory buckets, you must make requests for this API\n// operation to the Zonal endpoint. These endpoints support virtual-hosted-style\n// requests in the format\n// https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name\n// . Path-style requests are not supported. For more information about endpoints\n// in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information\n// about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide.\n//\n// Authentication and authorization All UploadPartCopy requests must be\n// authenticated and signed by using IAM credentials (access key ID and secret\n// access key for the IAM identities). All headers with the x-amz- prefix,\n// including x-amz-copy-source , must be signed. For more information, see [REST Authentication].\n//\n// Directory buckets - You must use IAM credentials to authenticate and authorize\n// your access to the UploadPartCopy API operation, instead of using the temporary\n// security credentials through the CreateSession API operation.\n//\n// Amazon Web Services CLI or SDKs handles authentication and authorization on\n// your behalf.\n//\n// Permissions You must have READ access to the source object and WRITE access to\n// the destination bucket.\n//\n//   - General purpose bucket permissions - You must have the permissions in a\n//     policy based on the bucket types of your source bucket and destination bucket in\n//     an UploadPartCopy operation.\n//\n//   - If the source object is in a general purpose bucket, you must have the\n//     s3:GetObject permission to read the source object that is being copied.\n//\n//   - If the destination bucket is a general purpose bucket, you must have the\n//     s3:PutObject permission to write the object copy to the destination bucket.\n//\n//   - To perform a multipart upload with encryption using an Key Management\n//     Service key, the requester must have permission to the kms:Decrypt and\n//     kms:GenerateDataKey actions on the key. The requester must also have\n//     permissions for the kms:GenerateDataKey action for the CreateMultipartUpload\n//     API. Then, the requester needs permissions for the kms:Decrypt action on the\n//     UploadPart and UploadPartCopy APIs. These permissions are required because\n//     Amazon S3 must decrypt and read data from the encrypted file parts before it\n//     completes the multipart upload. For more information about KMS permissions, see [Protecting data using server-side encryption with KMS]\n//     in the Amazon S3 User Guide. For information about the permissions required to\n//     use the multipart upload API, see [Multipart upload and permissions]and [Multipart upload API and permissions]in the Amazon S3 User Guide.\n//\n//   - Directory bucket permissions - You must have permissions in a bucket policy\n//     or an IAM identity-based policy based on the source and destination bucket types\n//     in an UploadPartCopy operation.\n//\n//   - If the source object that you want to copy is in a directory bucket, you\n//     must have the s3express:CreateSession permission in the Action element of a\n//     policy to read the object. By default, the session is in the ReadWrite mode.\n//     If you want to restrict the access, you can explicitly set the\n//     s3express:SessionMode condition key to ReadOnly on the copy source bucket.\n//\n//   - If the copy destination is a directory bucket, you must have the\n//     s3express:CreateSession permission in the Action element of a policy to write\n//     the object to the destination. The s3express:SessionMode condition key cannot\n//     be set to ReadOnly on the copy destination.\n//\n// If the object is encrypted with SSE-KMS, you must also have the\n//\n//\tkms:GenerateDataKey and kms:Decrypt permissions in IAM identity-based policies\n//\tand KMS key policies for the KMS key.\n//\n// For example policies, see [Example bucket policies for S3 Express One Zone]and [Amazon Web Services Identity and Access Management (IAM) identity-based policies for S3 Express One Zone]in the Amazon S3 User Guide.\n//\n// Encryption\n//\n//   - General purpose buckets - For information about using server-side\n//     encryption with customer-provided encryption keys with the UploadPartCopy\n//     operation, see [CopyObject]and [UploadPart].\n//\n//   - Directory buckets - For directory buckets, there are only two supported\n//     options for server-side encryption: server-side encryption with Amazon S3\n//     managed keys (SSE-S3) ( AES256 ) and server-side encryption with KMS keys\n//     (SSE-KMS) ( aws:kms ). For more information, see [Protecting data with server-side encryption]in the Amazon S3 User Guide.\n//\n// For directory buckets, when you perform a CreateMultipartUpload operation and an\n//\n//\tUploadPartCopy operation, the request headers you provide in the\n//\tCreateMultipartUpload request must match the default encryption configuration\n//\tof the destination bucket.\n//\n// S3 Bucket Keys aren't supported, when you copy SSE-KMS encrypted objects from\n//\n//\tgeneral purpose buckets to directory buckets, from directory buckets to general\n//\tpurpose buckets, or between directory buckets, through [UploadPartCopy]. In this case, Amazon\n//\tS3 makes a call to KMS every time a copy request is made for a KMS-encrypted\n//\tobject.\n//\n// Special errors\n//\n//   - Error Code: NoSuchUpload\n//\n//   - Description: The specified multipart upload does not exist. The upload ID\n//     might be invalid, or the multipart upload might have been aborted or completed.\n//\n//   - HTTP Status Code: 404 Not Found\n//\n//   - Error Code: InvalidRequest\n//\n//   - Description: The specified copy source is not supported as a byte-range\n//     copy source.\n//\n//   - HTTP Status Code: 400 Bad Request\n//\n// HTTP Host header syntax  Directory buckets - The HTTP Host header syntax is\n// Bucket-name.s3express-zone-id.region-code.amazonaws.com .\n//\n// The following operations are related to UploadPartCopy :\n//\n// [CreateMultipartUpload]\n//\n// [UploadPart]\n//\n// [CompleteMultipartUpload]\n//\n// [AbortMultipartUpload]\n//\n// [ListParts]\n//\n// [ListMultipartUploads]\n//\n// [Uploading Objects Using Multipart Upload]: https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html\n// [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\n// [ListParts]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html\n// [UploadPart]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\n// [Protecting data using server-side encryption with KMS]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html\n// [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\n// [Multipart upload and permissions]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html\n// [Multipart upload API and permissions]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpuAndPermissions\n// [CompleteMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html\n// [CreateMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html\n// [Multipart upload limits]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html\n// [Amazon Web Services Identity and Access Management (IAM) identity-based policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-identity-policies.html\n// [AbortMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html\n// [REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n// [Example bucket policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-example-bucket-policies.html\n// [Operations on Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectOperations.html\n// [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\n// [ListMultipartUploads]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html\n// [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\n//\n// [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\nfunc (c *Client) UploadPartCopy(ctx context.Context, params *UploadPartCopyInput, optFns ...func(*Options)) (*UploadPartCopyOutput, error) {\n\tif params == nil {\n\t\tparams = &UploadPartCopyInput{}\n\t}\n\n\tresult, metadata, err := c.invokeOperation(ctx, \"UploadPartCopy\", params, optFns, c.addOperationUploadPartCopyMiddlewares)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tout := result.(*UploadPartCopyOutput)\n\tout.ResultMetadata = metadata\n\treturn out, nil\n}\n\ntype UploadPartCopyInput struct {\n\n\t// The bucket name.\n\t//\n\t// Directory buckets - When you use this operation with a directory bucket, you\n\t// must use virtual-hosted-style requests in the format\n\t// Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests\n\t// are not supported. Directory bucket names must be unique in the chosen Zone\n\t// (Availability Zone or Local Zone). Bucket names must follow the format\n\t// bucket-base-name--zone-id--x-s3 (for example,\n\t// amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming\n\t// restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide.\n\t//\n\t// Copying objects across different Amazon Web Services Regions isn't supported\n\t// when the source or destination bucket is in Amazon Web Services Local Zones. The\n\t// source and destination buckets must have the same parent Amazon Web Services\n\t// Region. Otherwise, you get an HTTP 400 Bad Request error with the error code\n\t// InvalidRequest .\n\t//\n\t// Access points - When you use this action with an access point for general\n\t// purpose buckets, you must provide the alias of the access point in place of the\n\t// bucket name or specify the access point ARN. When you use this action with an\n\t// access point for directory buckets, you must provide the access point name in\n\t// place of the bucket name. When using the access point ARN, you must direct\n\t// requests to the access point hostname. The access point hostname takes the form\n\t// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this\n\t// action with an access point through the Amazon Web Services SDKs, you provide\n\t// the access point ARN in place of the bucket name. For more information about\n\t// access point ARNs, see [Using access points]in the Amazon S3 User Guide.\n\t//\n\t// Object Lambda access points are not supported by directory buckets.\n\t//\n\t// S3 on Outposts - When you use this action with S3 on Outposts, you must direct\n\t// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the\n\t// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When\n\t// you use this action with S3 on Outposts, the destination bucket must be the\n\t// Outposts access point ARN or the access point alias. For more information about\n\t// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.\n\t//\n\t// [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\n\t// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\n\t// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\n\t//\n\t// This member is required.\n\tBucket *string\n\n\t// Specifies the source object for the copy operation. You specify the value in\n\t// one of two formats, depending on whether you want to access the source object\n\t// through an [access point]:\n\t//\n\t//   - For objects not accessed through an access point, specify the name of the\n\t//   source bucket and key of the source object, separated by a slash (/). For\n\t//   example, to copy the object reports/january.pdf from the bucket\n\t//   awsexamplebucket , use awsexamplebucket/reports/january.pdf . The value must\n\t//   be URL-encoded.\n\t//\n\t//   - For objects accessed through access points, specify the Amazon Resource\n\t//   Name (ARN) of the object as accessed through the access point, in the format\n\t//   arn:aws:s3:::accesspoint//object/ . For example, to copy the object\n\t//   reports/january.pdf through access point my-access-point owned by account\n\t//   123456789012 in Region us-west-2 , use the URL encoding of\n\t//   arn:aws:s3:us-west-2:123456789012:accesspoint/my-access-point/object/reports/january.pdf\n\t//   . The value must be URL encoded.\n\t//\n\t//   - Amazon S3 supports copy operations using Access points only when the source\n\t//   and destination buckets are in the same Amazon Web Services Region.\n\t//\n\t//   - Access points are not supported by directory buckets.\n\t//\n\t// Alternatively, for objects accessed through Amazon S3 on Outposts, specify the\n\t//   ARN of the object as accessed in the format\n\t//   arn:aws:s3-outposts:::outpost//object/ . For example, to copy the object\n\t//   reports/january.pdf through outpost my-outpost owned by account 123456789012\n\t//   in Region us-west-2 , use the URL encoding of\n\t//   arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/object/reports/january.pdf\n\t//   . The value must be URL-encoded.\n\t//\n\t// If your bucket has versioning enabled, you could have multiple versions of the\n\t// same object. By default, x-amz-copy-source identifies the current version of\n\t// the source object to copy. To copy a specific version of the source object to\n\t// copy, append ?versionId= to the x-amz-copy-source request header (for example,\n\t// x-amz-copy-source:\n\t// /awsexamplebucket/reports/january.pdf?versionId=QUpfdndhfd8438MNFDN93jdnJFkdmqnh893\n\t// ).\n\t//\n\t// If the current version is a delete marker and you don't specify a versionId in\n\t// the x-amz-copy-source request header, Amazon S3 returns a 404 Not Found error,\n\t// because the object does not exist. If you specify versionId in the\n\t// x-amz-copy-source and the versionId is a delete marker, Amazon S3 returns an\n\t// HTTP 400 Bad Request error, because you are not allowed to specify a delete\n\t// marker as a version for the x-amz-copy-source .\n\t//\n\t// Directory buckets - S3 Versioning isn't enabled and supported for directory\n\t// buckets.\n\t//\n\t// [access point]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points.html\n\t//\n\t// This member is required.\n\tCopySource *string\n\n\t// Object key for which the multipart upload was initiated.\n\t//\n\t// This member is required.\n\tKey *string\n\n\t// Part number of part being copied. This is a positive integer between 1 and\n\t// 10,000.\n\t//\n\t// This member is required.\n\tPartNumber *int32\n\n\t// Upload ID identifying the multipart upload whose part is being copied.\n\t//\n\t// This member is required.\n\tUploadId *string\n\n\t// Copies the object if its entity tag (ETag) matches the specified tag.\n\t//\n\t// If both of the x-amz-copy-source-if-match and\n\t// x-amz-copy-source-if-unmodified-since headers are present in the request as\n\t// follows:\n\t//\n\t// x-amz-copy-source-if-match condition evaluates to true , and;\n\t//\n\t// x-amz-copy-source-if-unmodified-since condition evaluates to false ;\n\t//\n\t// Amazon S3 returns 200 OK and copies the data.\n\tCopySourceIfMatch *string\n\n\t// Copies the object if it has been modified since the specified time.\n\t//\n\t// If both of the x-amz-copy-source-if-none-match and\n\t// x-amz-copy-source-if-modified-since headers are present in the request as\n\t// follows:\n\t//\n\t// x-amz-copy-source-if-none-match condition evaluates to false , and;\n\t//\n\t// x-amz-copy-source-if-modified-since condition evaluates to true ;\n\t//\n\t// Amazon S3 returns 412 Precondition Failed response code.\n\tCopySourceIfModifiedSince *time.Time\n\n\t// Copies the object if its entity tag (ETag) is different than the specified ETag.\n\t//\n\t// If both of the x-amz-copy-source-if-none-match and\n\t// x-amz-copy-source-if-modified-since headers are present in the request as\n\t// follows:\n\t//\n\t// x-amz-copy-source-if-none-match condition evaluates to false , and;\n\t//\n\t// x-amz-copy-source-if-modified-since condition evaluates to true ;\n\t//\n\t// Amazon S3 returns 412 Precondition Failed response code.\n\tCopySourceIfNoneMatch *string\n\n\t// Copies the object if it hasn't been modified since the specified time.\n\t//\n\t// If both of the x-amz-copy-source-if-match and\n\t// x-amz-copy-source-if-unmodified-since headers are present in the request as\n\t// follows:\n\t//\n\t// x-amz-copy-source-if-match condition evaluates to true , and;\n\t//\n\t// x-amz-copy-source-if-unmodified-since condition evaluates to false ;\n\t//\n\t// Amazon S3 returns 200 OK and copies the data.\n\tCopySourceIfUnmodifiedSince *time.Time\n\n\t// The range of bytes to copy from the source object. The range value must use the\n\t// form bytes=first-last, where the first and last are the zero-based byte offsets\n\t// to copy. For example, bytes=0-9 indicates that you want to copy the first 10\n\t// bytes of the source. You can copy a range only if the source object is greater\n\t// than 5 MB.\n\tCopySourceRange *string\n\n\t// Specifies the algorithm to use when decrypting the source object (for example,\n\t// AES256 ).\n\t//\n\t// This functionality is not supported when the source object is in a directory\n\t// bucket.\n\tCopySourceSSECustomerAlgorithm *string\n\n\t// Specifies the customer-provided encryption key for Amazon S3 to use to decrypt\n\t// the source object. The encryption key provided in this header must be one that\n\t// was used when the source object was created.\n\t//\n\t// This functionality is not supported when the source object is in a directory\n\t// bucket.\n\tCopySourceSSECustomerKey *string\n\n\t// Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321.\n\t// Amazon S3 uses this header for a message integrity check to ensure that the\n\t// encryption key was transmitted without error.\n\t//\n\t// This functionality is not supported when the source object is in a directory\n\t// bucket.\n\tCopySourceSSECustomerKeyMD5 *string\n\n\t// The account ID of the expected destination bucket owner. If the account ID that\n\t// you provide does not match the actual owner of the destination bucket, the\n\t// request fails with the HTTP status code 403 Forbidden (access denied).\n\tExpectedBucketOwner *string\n\n\t// The account ID of the expected source bucket owner. If the account ID that you\n\t// provide does not match the actual owner of the source bucket, the request fails\n\t// with the HTTP status code 403 Forbidden (access denied).\n\tExpectedSourceBucketOwner *string\n\n\t// Confirms that the requester knows that they will be charged for the request.\n\t// Bucket owners need not specify this parameter in their requests. If either the\n\t// source or destination S3 bucket has Requester Pays enabled, the requester will\n\t// pay for corresponding charges to copy the object. For information about\n\t// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User\n\t// Guide.\n\t//\n\t// This functionality is not supported for directory buckets.\n\t//\n\t// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\tRequestPayer types.RequestPayer\n\n\t// Specifies the algorithm to use when encrypting the object (for example, AES256).\n\t//\n\t// This functionality is not supported when the destination bucket is a directory\n\t// bucket.\n\tSSECustomerAlgorithm *string\n\n\t// Specifies the customer-provided encryption key for Amazon S3 to use in\n\t// encrypting data. This value is used to store the object and then it is\n\t// discarded; Amazon S3 does not store the encryption key. The key must be\n\t// appropriate for use with the algorithm specified in the\n\t// x-amz-server-side-encryption-customer-algorithm header. This must be the same\n\t// encryption key specified in the initiate multipart upload request.\n\t//\n\t// This functionality is not supported when the destination bucket is a directory\n\t// bucket.\n\tSSECustomerKey *string\n\n\t// Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321.\n\t// Amazon S3 uses this header for a message integrity check to ensure that the\n\t// encryption key was transmitted without error.\n\t//\n\t// This functionality is not supported when the destination bucket is a directory\n\t// bucket.\n\tSSECustomerKeyMD5 *string\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (in *UploadPartCopyInput) bindEndpointParams(p *EndpointParameters) {\n\n\tp.Bucket = in.Bucket\n\tp.DisableS3ExpressSessionAuth = ptr.Bool(true)\n}\n\ntype UploadPartCopyOutput struct {\n\n\t// Indicates whether the multipart upload uses an S3 Bucket Key for server-side\n\t// encryption with Key Management Service (KMS) keys (SSE-KMS).\n\tBucketKeyEnabled *bool\n\n\t// Container for all response elements.\n\tCopyPartResult *types.CopyPartResult\n\n\t// The version of the source object that was copied, if you have enabled\n\t// versioning on the source bucket.\n\t//\n\t// This functionality is not supported when the source object is in a directory\n\t// bucket.\n\tCopySourceVersionId *string\n\n\t// If present, indicates that the requester was successfully charged for the\n\t// request.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tRequestCharged types.RequestCharged\n\n\t// If server-side encryption with a customer-provided encryption key was\n\t// requested, the response will include this header to confirm the encryption\n\t// algorithm that's used.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerAlgorithm *string\n\n\t// If server-side encryption with a customer-provided encryption key was\n\t// requested, the response will include this header to provide the round-trip\n\t// message integrity verification of the customer-provided encryption key.\n\t//\n\t// This functionality is not supported for directory buckets.\n\tSSECustomerKeyMD5 *string\n\n\t// If present, indicates the ID of the KMS key that was used for object encryption.\n\tSSEKMSKeyId *string\n\n\t// The server-side encryption algorithm used when you store this object in Amazon\n\t// S3 (for example, AES256 , aws:kms ).\n\tServerSideEncryption types.ServerSideEncryption\n\n\t// Metadata pertaining to the operation's result.\n\tResultMetadata middleware.Metadata\n\n\tnoSmithyDocumentSerde\n}\n\nfunc (c *Client) addOperationUploadPartCopyMiddlewares(stack *middleware.Stack, options Options) (err error) {\n\tif err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {\n\t\treturn err\n\t}\n\terr = stack.Serialize.Add(&awsRestxml_serializeOpUploadPartCopy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = stack.Deserialize.Add(&awsRestxml_deserializeOpUploadPartCopy{}, middleware.After)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := addProtocolFinalizerMiddlewares(stack, options, \"UploadPartCopy\"); err != nil {\n\t\treturn fmt.Errorf(\"add protocol finalizers: %v\", err)\n\t}\n\n\tif err = addlegacyEndpointContextSetter(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLoggerMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientRequestID(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputeContentLength(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addResolveEndpointMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addComputePayloadSHA256(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRetry(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addRawResponseToMetadata(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecordResponseTiming(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanRetryLoop(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addClientUserAgent(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addPutBucketContextMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addTimeOffsetBuild(stack, c); err != nil {\n\t\treturn err\n\t}\n\tif err = addUserAgentRetryMode(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addIsExpressUserAgent(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addCredentialSource(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addOpUploadPartCopyValidationMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = stack.Initialize.Add(newServiceMetadataMiddleware_opUploadPartCopy(options.Region), middleware.Before); err != nil {\n\t\treturn err\n\t}\n\tif err = addMetadataRetrieverMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRecursionDetection(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addUploadPartCopyUpdateEndpoint(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addResponseErrorMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = disableAcceptEncodingGzip(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = s3cust.HandleResponseErrorWith200Status(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addRequestResponseLogging(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addDisableHTTPSMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanInitializeEnd(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestStart(stack); err != nil {\n\t\treturn err\n\t}\n\tif err = addSpanBuildRequestEnd(stack); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (v *UploadPartCopyInput) bucket() (string, bool) {\n\tif v.Bucket == nil {\n\t\treturn \"\", false\n\t}\n\treturn *v.Bucket, true\n}\n\nfunc newServiceMetadataMiddleware_opUploadPartCopy(region string) *awsmiddleware.RegisterServiceMetadata {\n\treturn &awsmiddleware.RegisterServiceMetadata{\n\t\tRegion:        region,\n\t\tServiceID:     ServiceID,\n\t\tOperationName: \"UploadPartCopy\",\n\t}\n}\n\n// getUploadPartCopyBucketMember returns a pointer to string denoting a provided\n// bucket member valueand a boolean indicating if the input has a modeled bucket\n// name,\nfunc getUploadPartCopyBucketMember(input interface{}) (*string, bool) {\n\tin := input.(*UploadPartCopyInput)\n\tif in.Bucket == nil {\n\t\treturn nil, false\n\t}\n\treturn in.Bucket, true\n}\nfunc addUploadPartCopyUpdateEndpoint(stack *middleware.Stack, options Options) error {\n\treturn s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{\n\t\tAccessor: s3cust.UpdateEndpointParameterAccessor{\n\t\t\tGetBucketFromInput: getUploadPartCopyBucketMember,\n\t\t},\n\t\tUsePathStyle:                   options.UsePathStyle,\n\t\tUseAccelerate:                  options.UseAccelerate,\n\t\tSupportsAccelerate:             true,\n\t\tTargetS3ObjectLambda:           false,\n\t\tEndpointResolver:               options.EndpointResolver,\n\t\tEndpointResolverOptions:        options.EndpointOptions,\n\t\tUseARNRegion:                   options.UseARNRegion,\n\t\tDisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/auth.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\tsmithy \"github.com/aws/smithy-go\"\n\tsmithyauth \"github.com/aws/smithy-go/auth\"\n\t\"github.com/aws/smithy-go/metrics\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n)\n\nfunc bindAuthParamsRegion(_ interface{}, params *AuthResolverParameters, _ interface{}, options Options) {\n\tparams.Region = options.Region\n}\n\nfunc bindAuthEndpointParams(ctx context.Context, params *AuthResolverParameters, input interface{}, options Options) {\n\tparams.endpointParams = bindEndpointParams(ctx, input, options)\n}\n\ntype setLegacyContextSigningOptionsMiddleware struct {\n}\n\nfunc (*setLegacyContextSigningOptionsMiddleware) ID() string {\n\treturn \"setLegacyContextSigningOptions\"\n}\n\nfunc (m *setLegacyContextSigningOptionsMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\trscheme := getResolvedAuthScheme(ctx)\n\tschemeID := rscheme.Scheme.SchemeID()\n\n\tif sn := awsmiddleware.GetSigningName(ctx); sn != \"\" {\n\t\tif schemeID == \"aws.auth#sigv4\" {\n\t\t\tsmithyhttp.SetSigV4SigningName(&rscheme.SignerProperties, sn)\n\t\t} else if schemeID == \"aws.auth#sigv4a\" {\n\t\t\tsmithyhttp.SetSigV4ASigningName(&rscheme.SignerProperties, sn)\n\t\t}\n\t}\n\n\tif sr := awsmiddleware.GetSigningRegion(ctx); sr != \"\" {\n\t\tif schemeID == \"aws.auth#sigv4\" {\n\t\t\tsmithyhttp.SetSigV4SigningRegion(&rscheme.SignerProperties, sr)\n\t\t} else if schemeID == \"aws.auth#sigv4a\" {\n\t\t\tsmithyhttp.SetSigV4ASigningRegions(&rscheme.SignerProperties, []string{sr})\n\t\t}\n\t}\n\n\treturn next.HandleFinalize(ctx, in)\n}\n\nfunc addSetLegacyContextSigningOptionsMiddleware(stack *middleware.Stack) error {\n\treturn stack.Finalize.Insert(&setLegacyContextSigningOptionsMiddleware{}, \"Signing\", middleware.Before)\n}\n\ntype withAnonymous struct {\n\tresolver AuthSchemeResolver\n}\n\nvar _ AuthSchemeResolver = (*withAnonymous)(nil)\n\nfunc (v *withAnonymous) ResolveAuthSchemes(ctx context.Context, params *AuthResolverParameters) ([]*smithyauth.Option, error) {\n\topts, err := v.resolver.ResolveAuthSchemes(ctx, params)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\topts = append(opts, &smithyauth.Option{\n\t\tSchemeID: smithyauth.SchemeIDAnonymous,\n\t})\n\treturn opts, nil\n}\n\nfunc wrapWithAnonymousAuth(options *Options) {\n\tif _, ok := options.AuthSchemeResolver.(*defaultAuthSchemeResolver); !ok {\n\t\treturn\n\t}\n\n\toptions.AuthSchemeResolver = &withAnonymous{\n\t\tresolver: options.AuthSchemeResolver,\n\t}\n}\n\n// AuthResolverParameters contains the set of inputs necessary for auth scheme\n// resolution.\ntype AuthResolverParameters struct {\n\t// The name of the operation being invoked.\n\tOperation string\n\n\t// The endpoint resolver parameters for this operation. This service's default\n\t// resolver delegates to endpoint rules.\n\tendpointParams *EndpointParameters\n\n\t// The region in which the operation is being invoked.\n\tRegion string\n}\n\nfunc bindAuthResolverParams(ctx context.Context, operation string, input interface{}, options Options) *AuthResolverParameters {\n\tparams := &AuthResolverParameters{\n\t\tOperation: operation,\n\t}\n\n\tbindAuthEndpointParams(ctx, params, input, options)\n\tbindAuthParamsRegion(ctx, params, input, options)\n\n\treturn params\n}\n\n// AuthSchemeResolver returns a set of possible authentication options for an\n// operation.\ntype AuthSchemeResolver interface {\n\tResolveAuthSchemes(context.Context, *AuthResolverParameters) ([]*smithyauth.Option, error)\n}\n\ntype defaultAuthSchemeResolver struct{}\n\nvar _ AuthSchemeResolver = (*defaultAuthSchemeResolver)(nil)\n\nfunc (*defaultAuthSchemeResolver) ResolveAuthSchemes(ctx context.Context, params *AuthResolverParameters) ([]*smithyauth.Option, error) {\n\tif overrides, ok := operationAuthOptions[params.Operation]; ok {\n\t\treturn overrides(params), nil\n\t}\n\treturn serviceAuthOptions(params), nil\n}\n\nvar operationAuthOptions = map[string]func(*AuthResolverParameters) []*smithyauth.Option{\n\t\"WriteGetObjectResponse\": func(params *AuthResolverParameters) []*smithyauth.Option {\n\t\treturn []*smithyauth.Option{\n\t\t\t{\n\t\t\t\tSchemeID: smithyauth.SchemeIDSigV4,\n\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\tvar props smithy.Properties\n\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&props, \"s3\")\n\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&props, params.Region)\n\t\t\t\t\tsmithyhttp.SetIsUnsignedPayload(&props, true)\n\t\t\t\t\treturn props\n\t\t\t\t}(),\n\t\t\t},\n\t\t}\n\t},\n}\n\nfunc serviceAuthOptions(params *AuthResolverParameters) []*smithyauth.Option {\n\treturn []*smithyauth.Option{\n\t\t{\n\t\t\tSchemeID: smithyauth.SchemeIDSigV4,\n\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\tvar props smithy.Properties\n\t\t\t\tsmithyhttp.SetSigV4SigningName(&props, \"s3\")\n\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&props, params.Region)\n\t\t\t\treturn props\n\t\t\t}(),\n\t\t},\n\n\t\t{\n\t\t\tSchemeID: smithyauth.SchemeIDSigV4A,\n\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\tvar props smithy.Properties\n\t\t\t\tsmithyhttp.SetSigV4ASigningName(&props, \"s3\")\n\t\t\t\tsmithyhttp.SetSigV4ASigningRegions(&props, []string{params.Region})\n\t\t\t\treturn props\n\t\t\t}(),\n\t\t},\n\t}\n}\n\ntype resolveAuthSchemeMiddleware struct {\n\toperation string\n\toptions   Options\n}\n\nfunc (*resolveAuthSchemeMiddleware) ID() string {\n\treturn \"ResolveAuthScheme\"\n}\n\nfunc (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"ResolveAuthScheme\")\n\tdefer span.End()\n\n\tparams := bindAuthResolverParams(ctx, m.operation, getOperationInput(ctx), m.options)\n\toptions, err := m.options.AuthSchemeResolver.ResolveAuthSchemes(ctx, params)\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"resolve auth scheme: %w\", err)\n\t}\n\n\tscheme, ok := m.selectScheme(options)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"could not select an auth scheme\")\n\t}\n\n\tctx = setResolvedAuthScheme(ctx, scheme)\n\n\tspan.SetProperty(\"auth.scheme_id\", scheme.Scheme.SchemeID())\n\tspan.End()\n\treturn next.HandleFinalize(ctx, in)\n}\n\nfunc (m *resolveAuthSchemeMiddleware) selectScheme(options []*smithyauth.Option) (*resolvedAuthScheme, bool) {\n\tfor _, option := range options {\n\t\tif option.SchemeID == smithyauth.SchemeIDAnonymous {\n\t\t\treturn newResolvedAuthScheme(smithyhttp.NewAnonymousScheme(), option), true\n\t\t}\n\n\t\tfor _, scheme := range m.options.AuthSchemes {\n\t\t\tif scheme.SchemeID() != option.SchemeID {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif scheme.IdentityResolver(m.options) != nil {\n\t\t\t\treturn newResolvedAuthScheme(scheme, option), true\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil, false\n}\n\ntype resolvedAuthSchemeKey struct{}\n\ntype resolvedAuthScheme struct {\n\tScheme             smithyhttp.AuthScheme\n\tIdentityProperties smithy.Properties\n\tSignerProperties   smithy.Properties\n}\n\nfunc newResolvedAuthScheme(scheme smithyhttp.AuthScheme, option *smithyauth.Option) *resolvedAuthScheme {\n\treturn &resolvedAuthScheme{\n\t\tScheme:             scheme,\n\t\tIdentityProperties: option.IdentityProperties,\n\t\tSignerProperties:   option.SignerProperties,\n\t}\n}\n\nfunc setResolvedAuthScheme(ctx context.Context, scheme *resolvedAuthScheme) context.Context {\n\treturn middleware.WithStackValue(ctx, resolvedAuthSchemeKey{}, scheme)\n}\n\nfunc getResolvedAuthScheme(ctx context.Context) *resolvedAuthScheme {\n\tv, _ := middleware.GetStackValue(ctx, resolvedAuthSchemeKey{}).(*resolvedAuthScheme)\n\treturn v\n}\n\ntype getIdentityMiddleware struct {\n\toptions Options\n}\n\nfunc (*getIdentityMiddleware) ID() string {\n\treturn \"GetIdentity\"\n}\n\nfunc (m *getIdentityMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\tinnerCtx, span := tracing.StartSpan(ctx, \"GetIdentity\")\n\tdefer span.End()\n\n\trscheme := getResolvedAuthScheme(innerCtx)\n\tif rscheme == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no resolved auth scheme\")\n\t}\n\n\tresolver := rscheme.Scheme.IdentityResolver(m.options)\n\tif resolver == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no identity resolver\")\n\t}\n\n\tidentity, err := timeOperationMetric(ctx, \"client.call.resolve_identity_duration\",\n\t\tfunc() (smithyauth.Identity, error) {\n\t\t\treturn resolver.GetIdentity(innerCtx, rscheme.IdentityProperties)\n\t\t},\n\t\tfunc(o *metrics.RecordMetricOptions) {\n\t\t\to.Properties.Set(\"auth.scheme_id\", rscheme.Scheme.SchemeID())\n\t\t})\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"get identity: %w\", err)\n\t}\n\n\tctx = setIdentity(ctx, identity)\n\n\tspan.End()\n\treturn next.HandleFinalize(ctx, in)\n}\n\ntype identityKey struct{}\n\nfunc setIdentity(ctx context.Context, identity smithyauth.Identity) context.Context {\n\treturn middleware.WithStackValue(ctx, identityKey{}, identity)\n}\n\nfunc getIdentity(ctx context.Context) smithyauth.Identity {\n\tv, _ := middleware.GetStackValue(ctx, identityKey{}).(smithyauth.Identity)\n\treturn v\n}\n\ntype signRequestMiddleware struct {\n\toptions Options\n}\n\nfunc (*signRequestMiddleware) ID() string {\n\treturn \"Signing\"\n}\n\nfunc (m *signRequestMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"SignRequest\")\n\tdefer span.End()\n\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unexpected transport type %T\", in.Request)\n\t}\n\n\trscheme := getResolvedAuthScheme(ctx)\n\tif rscheme == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no resolved auth scheme\")\n\t}\n\n\tidentity := getIdentity(ctx)\n\tif identity == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no identity\")\n\t}\n\n\tsigner := rscheme.Scheme.Signer()\n\tif signer == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no signer\")\n\t}\n\n\t_, err = timeOperationMetric(ctx, \"client.call.signing_duration\", func() (any, error) {\n\t\treturn nil, signer.SignRequest(ctx, req, identity, rscheme.SignerProperties)\n\t}, func(o *metrics.RecordMetricOptions) {\n\t\to.Properties.Set(\"auth.scheme_id\", rscheme.Scheme.SchemeID())\n\t})\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"sign request: %w\", err)\n\t}\n\n\tspan.End()\n\treturn next.HandleFinalize(ctx, in)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/bucketer.go",
    "content": "package s3\n\n// implemented by all S3 input structures\ntype bucketer interface {\n\tbucket() (string, bool)\n}\n\nfunc bucketFromInput(params interface{}) (string, bool) {\n\tv, ok := params.(bucketer)\n\tif !ok {\n\t\treturn \"\", false\n\t}\n\n\treturn v.bucket()\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/create_mpu_checksum.go",
    "content": "package s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tinternalcontext \"github.com/aws/aws-sdk-go-v2/internal/context\"\n\t\"github.com/aws/smithy-go/middleware\"\n)\n\n// backfills checksum algorithm onto the context for CreateMultipart upload so\n// transfer manager can set a checksum header on the request accordingly for\n// s3express requests\ntype setCreateMPUChecksumAlgorithm struct{}\n\nfunc (*setCreateMPUChecksumAlgorithm) ID() string {\n\treturn \"setCreateMPUChecksumAlgorithm\"\n}\n\nfunc (*setCreateMPUChecksumAlgorithm) HandleSerialize(\n\tctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler,\n) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\tinput, ok := in.Parameters.(*CreateMultipartUploadInput)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unexpected input type %T\", in.Parameters)\n\t}\n\n\tctx = internalcontext.SetChecksumInputAlgorithm(ctx, string(input.ChecksumAlgorithm))\n\treturn next.HandleSerialize(ctx, in)\n}\n\nfunc addSetCreateMPUChecksumAlgorithm(s *middleware.Stack) error {\n\treturn s.Serialize.Add(&setCreateMPUChecksumAlgorithm{}, middleware.Before)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/deserializers.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"encoding/xml\"\n\t\"fmt\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi\"\n\tawsxml \"github.com/aws/aws-sdk-go-v2/aws/protocol/xml\"\n\t\"github.com/aws/aws-sdk-go-v2/service/internal/s3shared\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\tsmithy \"github.com/aws/smithy-go\"\n\tsmithyxml \"github.com/aws/smithy-go/encoding/xml\"\n\tsmithyio \"github.com/aws/smithy-go/io\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\tsmithytime \"github.com/aws/smithy-go/time\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n)\n\nfunc deserializeS3Expires(v string) (*time.Time, error) {\n\tt, err := smithytime.ParseHTTPDate(v)\n\tif err != nil {\n\t\treturn nil, nil\n\t}\n\treturn &t, nil\n}\n\ntype awsRestxml_deserializeOpAbortMultipartUpload struct {\n}\n\nfunc (*awsRestxml_deserializeOpAbortMultipartUpload) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpAbortMultipartUpload) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorAbortMultipartUpload(response, &metadata)\n\t}\n\toutput := &AbortMultipartUploadOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsAbortMultipartUploadOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorAbortMultipartUpload(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tcase strings.EqualFold(\"NoSuchUpload\", errorCode):\n\t\treturn awsRestxml_deserializeErrorNoSuchUpload(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsAbortMultipartUploadOutput(v *AbortMultipartUploadOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpCompleteMultipartUpload struct {\n}\n\nfunc (*awsRestxml_deserializeOpCompleteMultipartUpload) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpCompleteMultipartUpload) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorCompleteMultipartUpload(response, &metadata)\n\t}\n\toutput := &CompleteMultipartUploadOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsCompleteMultipartUploadOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentCompleteMultipartUploadOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorCompleteMultipartUpload(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsCompleteMultipartUploadOutput(v *CompleteMultipartUploadOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-bucket-key-enabled\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseBool(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.BucketKeyEnabled = ptr.Bool(vv)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-expiration\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.Expiration = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ServerSideEncryption = types.ServerSideEncryption(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-aws-kms-key-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSEKMSKeyId = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-version-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.VersionId = ptr.String(headerValues[0])\n\t}\n\n\treturn nil\n}\nfunc awsRestxml_deserializeOpDocumentCompleteMultipartUploadOutput(v **CompleteMultipartUploadOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *CompleteMultipartUploadOutput\n\tif *v == nil {\n\t\tsv = &CompleteMultipartUploadOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Bucket\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Bucket = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumCRC32\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumCRC32 = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumCRC32C\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumCRC32C = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumCRC64NVME\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumCRC64NVME = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumSHA1\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumSHA1 = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumSHA256\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumSHA256 = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumType\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumType = types.ChecksumType(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ETag\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ETag = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Key\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Key = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Location\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Location = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpCopyObject struct {\n}\n\nfunc (*awsRestxml_deserializeOpCopyObject) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpCopyObject) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorCopyObject(response, &metadata)\n\t}\n\toutput := &CopyObjectOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsCopyObjectOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentCopyObjectResult(&output.CopyObjectResult, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorCopyObject(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tcase strings.EqualFold(\"ObjectNotInActiveTierError\", errorCode):\n\t\treturn awsRestxml_deserializeErrorObjectNotInActiveTierError(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsCopyObjectOutput(v *CopyObjectOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-bucket-key-enabled\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseBool(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.BucketKeyEnabled = ptr.Bool(vv)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-copy-source-version-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.CopySourceVersionId = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-expiration\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.Expiration = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ServerSideEncryption = types.ServerSideEncryption(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-customer-algorithm\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSECustomerAlgorithm = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-customer-key-MD5\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSECustomerKeyMD5 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-context\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSEKMSEncryptionContext = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-aws-kms-key-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSEKMSKeyId = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-version-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.VersionId = ptr.String(headerValues[0])\n\t}\n\n\treturn nil\n}\nfunc awsRestxml_deserializeOpDocumentCopyObjectOutput(v **CopyObjectOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *CopyObjectOutput\n\tif *v == nil {\n\t\tsv = &CopyObjectOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"CopyObjectResult\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentCopyObjectResult(&sv.CopyObjectResult, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpCreateBucket struct {\n}\n\nfunc (*awsRestxml_deserializeOpCreateBucket) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpCreateBucket) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorCreateBucket(response, &metadata)\n\t}\n\toutput := &CreateBucketOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsCreateBucketOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorCreateBucket(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tcase strings.EqualFold(\"BucketAlreadyExists\", errorCode):\n\t\treturn awsRestxml_deserializeErrorBucketAlreadyExists(response, errorBody)\n\n\tcase strings.EqualFold(\"BucketAlreadyOwnedByYou\", errorCode):\n\t\treturn awsRestxml_deserializeErrorBucketAlreadyOwnedByYou(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsCreateBucketOutput(v *CreateBucketOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"Location\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.Location = ptr.String(headerValues[0])\n\t}\n\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpCreateBucketMetadataTableConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpCreateBucketMetadataTableConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpCreateBucketMetadataTableConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorCreateBucketMetadataTableConfiguration(response, &metadata)\n\t}\n\toutput := &CreateBucketMetadataTableConfigurationOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorCreateBucketMetadataTableConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpCreateMultipartUpload struct {\n}\n\nfunc (*awsRestxml_deserializeOpCreateMultipartUpload) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpCreateMultipartUpload) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorCreateMultipartUpload(response, &metadata)\n\t}\n\toutput := &CreateMultipartUploadOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsCreateMultipartUploadOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentCreateMultipartUploadOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorCreateMultipartUpload(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsCreateMultipartUploadOutput(v *CreateMultipartUploadOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-abort-date\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tt, err := smithytime.ParseHTTPDate(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.AbortDate = ptr.Time(t)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-abort-rule-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.AbortRuleId = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-bucket-key-enabled\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseBool(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.BucketKeyEnabled = ptr.Bool(vv)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-algorithm\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumAlgorithm = types.ChecksumAlgorithm(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-type\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumType = types.ChecksumType(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ServerSideEncryption = types.ServerSideEncryption(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-customer-algorithm\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSECustomerAlgorithm = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-customer-key-MD5\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSECustomerKeyMD5 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-context\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSEKMSEncryptionContext = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-aws-kms-key-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSEKMSKeyId = ptr.String(headerValues[0])\n\t}\n\n\treturn nil\n}\nfunc awsRestxml_deserializeOpDocumentCreateMultipartUploadOutput(v **CreateMultipartUploadOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *CreateMultipartUploadOutput\n\tif *v == nil {\n\t\tsv = &CreateMultipartUploadOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Bucket\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Bucket = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Key\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Key = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"UploadId\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.UploadId = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpCreateSession struct {\n}\n\nfunc (*awsRestxml_deserializeOpCreateSession) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpCreateSession) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorCreateSession(response, &metadata)\n\t}\n\toutput := &CreateSessionOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsCreateSessionOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentCreateSessionOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorCreateSession(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tcase strings.EqualFold(\"NoSuchBucket\", errorCode):\n\t\treturn awsRestxml_deserializeErrorNoSuchBucket(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsCreateSessionOutput(v *CreateSessionOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-bucket-key-enabled\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseBool(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.BucketKeyEnabled = ptr.Bool(vv)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ServerSideEncryption = types.ServerSideEncryption(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-context\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSEKMSEncryptionContext = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-aws-kms-key-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSEKMSKeyId = ptr.String(headerValues[0])\n\t}\n\n\treturn nil\n}\nfunc awsRestxml_deserializeOpDocumentCreateSessionOutput(v **CreateSessionOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *CreateSessionOutput\n\tif *v == nil {\n\t\tsv = &CreateSessionOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Credentials\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentSessionCredentials(&sv.Credentials, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpDeleteBucket struct {\n}\n\nfunc (*awsRestxml_deserializeOpDeleteBucket) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpDeleteBucket) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorDeleteBucket(response, &metadata)\n\t}\n\toutput := &DeleteBucketOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorDeleteBucket(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpDeleteBucketAnalyticsConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpDeleteBucketAnalyticsConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpDeleteBucketAnalyticsConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorDeleteBucketAnalyticsConfiguration(response, &metadata)\n\t}\n\toutput := &DeleteBucketAnalyticsConfigurationOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorDeleteBucketAnalyticsConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpDeleteBucketCors struct {\n}\n\nfunc (*awsRestxml_deserializeOpDeleteBucketCors) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpDeleteBucketCors) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorDeleteBucketCors(response, &metadata)\n\t}\n\toutput := &DeleteBucketCorsOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorDeleteBucketCors(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpDeleteBucketEncryption struct {\n}\n\nfunc (*awsRestxml_deserializeOpDeleteBucketEncryption) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpDeleteBucketEncryption) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorDeleteBucketEncryption(response, &metadata)\n\t}\n\toutput := &DeleteBucketEncryptionOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorDeleteBucketEncryption(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpDeleteBucketIntelligentTieringConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpDeleteBucketIntelligentTieringConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpDeleteBucketIntelligentTieringConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorDeleteBucketIntelligentTieringConfiguration(response, &metadata)\n\t}\n\toutput := &DeleteBucketIntelligentTieringConfigurationOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorDeleteBucketIntelligentTieringConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpDeleteBucketInventoryConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpDeleteBucketInventoryConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpDeleteBucketInventoryConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorDeleteBucketInventoryConfiguration(response, &metadata)\n\t}\n\toutput := &DeleteBucketInventoryConfigurationOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorDeleteBucketInventoryConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpDeleteBucketLifecycle struct {\n}\n\nfunc (*awsRestxml_deserializeOpDeleteBucketLifecycle) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpDeleteBucketLifecycle) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorDeleteBucketLifecycle(response, &metadata)\n\t}\n\toutput := &DeleteBucketLifecycleOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorDeleteBucketLifecycle(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpDeleteBucketMetadataTableConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpDeleteBucketMetadataTableConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpDeleteBucketMetadataTableConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorDeleteBucketMetadataTableConfiguration(response, &metadata)\n\t}\n\toutput := &DeleteBucketMetadataTableConfigurationOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorDeleteBucketMetadataTableConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpDeleteBucketMetricsConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpDeleteBucketMetricsConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpDeleteBucketMetricsConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorDeleteBucketMetricsConfiguration(response, &metadata)\n\t}\n\toutput := &DeleteBucketMetricsConfigurationOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorDeleteBucketMetricsConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpDeleteBucketOwnershipControls struct {\n}\n\nfunc (*awsRestxml_deserializeOpDeleteBucketOwnershipControls) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpDeleteBucketOwnershipControls) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorDeleteBucketOwnershipControls(response, &metadata)\n\t}\n\toutput := &DeleteBucketOwnershipControlsOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorDeleteBucketOwnershipControls(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpDeleteBucketPolicy struct {\n}\n\nfunc (*awsRestxml_deserializeOpDeleteBucketPolicy) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpDeleteBucketPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorDeleteBucketPolicy(response, &metadata)\n\t}\n\toutput := &DeleteBucketPolicyOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorDeleteBucketPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpDeleteBucketReplication struct {\n}\n\nfunc (*awsRestxml_deserializeOpDeleteBucketReplication) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpDeleteBucketReplication) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorDeleteBucketReplication(response, &metadata)\n\t}\n\toutput := &DeleteBucketReplicationOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorDeleteBucketReplication(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpDeleteBucketTagging struct {\n}\n\nfunc (*awsRestxml_deserializeOpDeleteBucketTagging) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpDeleteBucketTagging) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorDeleteBucketTagging(response, &metadata)\n\t}\n\toutput := &DeleteBucketTaggingOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorDeleteBucketTagging(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpDeleteBucketWebsite struct {\n}\n\nfunc (*awsRestxml_deserializeOpDeleteBucketWebsite) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpDeleteBucketWebsite) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorDeleteBucketWebsite(response, &metadata)\n\t}\n\toutput := &DeleteBucketWebsiteOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorDeleteBucketWebsite(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpDeleteObject struct {\n}\n\nfunc (*awsRestxml_deserializeOpDeleteObject) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpDeleteObject) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorDeleteObject(response, &metadata)\n\t}\n\toutput := &DeleteObjectOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsDeleteObjectOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorDeleteObject(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsDeleteObjectOutput(v *DeleteObjectOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-delete-marker\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseBool(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.DeleteMarker = ptr.Bool(vv)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-version-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.VersionId = ptr.String(headerValues[0])\n\t}\n\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpDeleteObjects struct {\n}\n\nfunc (*awsRestxml_deserializeOpDeleteObjects) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpDeleteObjects) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorDeleteObjects(response, &metadata)\n\t}\n\toutput := &DeleteObjectsOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsDeleteObjectsOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentDeleteObjectsOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorDeleteObjects(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsDeleteObjectsOutput(v *DeleteObjectsOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\treturn nil\n}\nfunc awsRestxml_deserializeOpDocumentDeleteObjectsOutput(v **DeleteObjectsOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *DeleteObjectsOutput\n\tif *v == nil {\n\t\tsv = &DeleteObjectsOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Deleted\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentDeletedObjectsUnwrapped(&sv.Deleted, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Error\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentErrorsUnwrapped(&sv.Errors, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpDeleteObjectTagging struct {\n}\n\nfunc (*awsRestxml_deserializeOpDeleteObjectTagging) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpDeleteObjectTagging) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorDeleteObjectTagging(response, &metadata)\n\t}\n\toutput := &DeleteObjectTaggingOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsDeleteObjectTaggingOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorDeleteObjectTagging(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsDeleteObjectTaggingOutput(v *DeleteObjectTaggingOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-version-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.VersionId = ptr.String(headerValues[0])\n\t}\n\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpDeletePublicAccessBlock struct {\n}\n\nfunc (*awsRestxml_deserializeOpDeletePublicAccessBlock) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpDeletePublicAccessBlock) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorDeletePublicAccessBlock(response, &metadata)\n\t}\n\toutput := &DeletePublicAccessBlockOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorDeletePublicAccessBlock(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpGetBucketAccelerateConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketAccelerateConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketAccelerateConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketAccelerateConfiguration(response, &metadata)\n\t}\n\toutput := &GetBucketAccelerateConfigurationOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsGetBucketAccelerateConfigurationOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentGetBucketAccelerateConfigurationOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketAccelerateConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsGetBucketAccelerateConfigurationOutput(v *GetBucketAccelerateConfigurationOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\treturn nil\n}\nfunc awsRestxml_deserializeOpDocumentGetBucketAccelerateConfigurationOutput(v **GetBucketAccelerateConfigurationOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketAccelerateConfigurationOutput\n\tif *v == nil {\n\t\tsv = &GetBucketAccelerateConfigurationOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Status\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Status = types.BucketAccelerateStatus(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketAcl struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketAcl) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketAcl) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketAcl(response, &metadata)\n\t}\n\toutput := &GetBucketAclOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentGetBucketAclOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketAcl(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketAclOutput(v **GetBucketAclOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketAclOutput\n\tif *v == nil {\n\t\tsv = &GetBucketAclOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"AccessControlList\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentGrants(&sv.Grants, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Owner\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentOwner(&sv.Owner, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketAnalyticsConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketAnalyticsConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketAnalyticsConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketAnalyticsConfiguration(response, &metadata)\n\t}\n\toutput := &GetBucketAnalyticsConfigurationOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentAnalyticsConfiguration(&output.AnalyticsConfiguration, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketAnalyticsConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketAnalyticsConfigurationOutput(v **GetBucketAnalyticsConfigurationOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketAnalyticsConfigurationOutput\n\tif *v == nil {\n\t\tsv = &GetBucketAnalyticsConfigurationOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"AnalyticsConfiguration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentAnalyticsConfiguration(&sv.AnalyticsConfiguration, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketCors struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketCors) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketCors) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketCors(response, &metadata)\n\t}\n\toutput := &GetBucketCorsOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentGetBucketCorsOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketCors(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketCorsOutput(v **GetBucketCorsOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketCorsOutput\n\tif *v == nil {\n\t\tsv = &GetBucketCorsOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"CORSRule\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentCORSRulesUnwrapped(&sv.CORSRules, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketEncryption struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketEncryption) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketEncryption) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketEncryption(response, &metadata)\n\t}\n\toutput := &GetBucketEncryptionOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentServerSideEncryptionConfiguration(&output.ServerSideEncryptionConfiguration, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketEncryption(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketEncryptionOutput(v **GetBucketEncryptionOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketEncryptionOutput\n\tif *v == nil {\n\t\tsv = &GetBucketEncryptionOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ServerSideEncryptionConfiguration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentServerSideEncryptionConfiguration(&sv.ServerSideEncryptionConfiguration, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketIntelligentTieringConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketIntelligentTieringConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketIntelligentTieringConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketIntelligentTieringConfiguration(response, &metadata)\n\t}\n\toutput := &GetBucketIntelligentTieringConfigurationOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentIntelligentTieringConfiguration(&output.IntelligentTieringConfiguration, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketIntelligentTieringConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketIntelligentTieringConfigurationOutput(v **GetBucketIntelligentTieringConfigurationOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketIntelligentTieringConfigurationOutput\n\tif *v == nil {\n\t\tsv = &GetBucketIntelligentTieringConfigurationOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"IntelligentTieringConfiguration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentIntelligentTieringConfiguration(&sv.IntelligentTieringConfiguration, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketInventoryConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketInventoryConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketInventoryConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketInventoryConfiguration(response, &metadata)\n\t}\n\toutput := &GetBucketInventoryConfigurationOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentInventoryConfiguration(&output.InventoryConfiguration, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketInventoryConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketInventoryConfigurationOutput(v **GetBucketInventoryConfigurationOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketInventoryConfigurationOutput\n\tif *v == nil {\n\t\tsv = &GetBucketInventoryConfigurationOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"InventoryConfiguration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentInventoryConfiguration(&sv.InventoryConfiguration, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketLifecycleConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketLifecycleConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketLifecycleConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketLifecycleConfiguration(response, &metadata)\n\t}\n\toutput := &GetBucketLifecycleConfigurationOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsGetBucketLifecycleConfigurationOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentGetBucketLifecycleConfigurationOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketLifecycleConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsGetBucketLifecycleConfigurationOutput(v *GetBucketLifecycleConfigurationOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-transition-default-minimum-object-size\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.TransitionDefaultMinimumObjectSize = types.TransitionDefaultMinimumObjectSize(headerValues[0])\n\t}\n\n\treturn nil\n}\nfunc awsRestxml_deserializeOpDocumentGetBucketLifecycleConfigurationOutput(v **GetBucketLifecycleConfigurationOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketLifecycleConfigurationOutput\n\tif *v == nil {\n\t\tsv = &GetBucketLifecycleConfigurationOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Rule\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentLifecycleRulesUnwrapped(&sv.Rules, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketLocation struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketLocation) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketLocation) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketLocation(response, &metadata)\n\t}\n\toutput := &GetBucketLocationOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentGetBucketLocationOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketLocation(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketLocationOutput(v **GetBucketLocationOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketLocationOutput\n\tif *v == nil {\n\t\tsv = &GetBucketLocationOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"LocationConstraint\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.LocationConstraint = types.BucketLocationConstraint(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketLogging struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketLogging) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketLogging) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketLogging(response, &metadata)\n\t}\n\toutput := &GetBucketLoggingOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentGetBucketLoggingOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketLogging(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketLoggingOutput(v **GetBucketLoggingOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketLoggingOutput\n\tif *v == nil {\n\t\tsv = &GetBucketLoggingOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"LoggingEnabled\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentLoggingEnabled(&sv.LoggingEnabled, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketMetadataTableConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketMetadataTableConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketMetadataTableConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketMetadataTableConfiguration(response, &metadata)\n\t}\n\toutput := &GetBucketMetadataTableConfigurationOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentGetBucketMetadataTableConfigurationResult(&output.GetBucketMetadataTableConfigurationResult, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketMetadataTableConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketMetadataTableConfigurationOutput(v **GetBucketMetadataTableConfigurationOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketMetadataTableConfigurationOutput\n\tif *v == nil {\n\t\tsv = &GetBucketMetadataTableConfigurationOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"GetBucketMetadataTableConfigurationResult\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentGetBucketMetadataTableConfigurationResult(&sv.GetBucketMetadataTableConfigurationResult, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketMetricsConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketMetricsConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketMetricsConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketMetricsConfiguration(response, &metadata)\n\t}\n\toutput := &GetBucketMetricsConfigurationOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentMetricsConfiguration(&output.MetricsConfiguration, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketMetricsConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketMetricsConfigurationOutput(v **GetBucketMetricsConfigurationOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketMetricsConfigurationOutput\n\tif *v == nil {\n\t\tsv = &GetBucketMetricsConfigurationOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"MetricsConfiguration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentMetricsConfiguration(&sv.MetricsConfiguration, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketNotificationConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketNotificationConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketNotificationConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketNotificationConfiguration(response, &metadata)\n\t}\n\toutput := &GetBucketNotificationConfigurationOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentGetBucketNotificationConfigurationOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketNotificationConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketNotificationConfigurationOutput(v **GetBucketNotificationConfigurationOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketNotificationConfigurationOutput\n\tif *v == nil {\n\t\tsv = &GetBucketNotificationConfigurationOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"EventBridgeConfiguration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentEventBridgeConfiguration(&sv.EventBridgeConfiguration, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"CloudFunctionConfiguration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentLambdaFunctionConfigurationListUnwrapped(&sv.LambdaFunctionConfigurations, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"QueueConfiguration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentQueueConfigurationListUnwrapped(&sv.QueueConfigurations, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"TopicConfiguration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentTopicConfigurationListUnwrapped(&sv.TopicConfigurations, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketOwnershipControls struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketOwnershipControls) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketOwnershipControls) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketOwnershipControls(response, &metadata)\n\t}\n\toutput := &GetBucketOwnershipControlsOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentOwnershipControls(&output.OwnershipControls, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketOwnershipControls(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketOwnershipControlsOutput(v **GetBucketOwnershipControlsOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketOwnershipControlsOutput\n\tif *v == nil {\n\t\tsv = &GetBucketOwnershipControlsOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"OwnershipControls\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentOwnershipControls(&sv.OwnershipControls, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketPolicy struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketPolicy) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketPolicy(response, &metadata)\n\t}\n\toutput := &GetBucketPolicyOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpDocumentGetBucketPolicyOutput(output, response.Body, response.ContentLength)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to deserialize response payload, %w\", err)}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketPolicyOutput(v *GetBucketPolicyOutput, body io.ReadCloser, contentLength int64) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization of nil %T\", v)\n\t}\n\tvar buf bytes.Buffer\n\tif contentLength > 0 {\n\t\tbuf.Grow(int(contentLength))\n\t} else {\n\t\tbuf.Grow(512)\n\t}\n\n\t_, err := buf.ReadFrom(body)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif buf.Len() > 0 {\n\t\tv.Policy = ptr.String(buf.String())\n\t}\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketPolicyStatus struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketPolicyStatus) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketPolicyStatus) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketPolicyStatus(response, &metadata)\n\t}\n\toutput := &GetBucketPolicyStatusOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentPolicyStatus(&output.PolicyStatus, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketPolicyStatus(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketPolicyStatusOutput(v **GetBucketPolicyStatusOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketPolicyStatusOutput\n\tif *v == nil {\n\t\tsv = &GetBucketPolicyStatusOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"PolicyStatus\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentPolicyStatus(&sv.PolicyStatus, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketReplication struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketReplication) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketReplication) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketReplication(response, &metadata)\n\t}\n\toutput := &GetBucketReplicationOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentReplicationConfiguration(&output.ReplicationConfiguration, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketReplication(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketReplicationOutput(v **GetBucketReplicationOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketReplicationOutput\n\tif *v == nil {\n\t\tsv = &GetBucketReplicationOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ReplicationConfiguration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentReplicationConfiguration(&sv.ReplicationConfiguration, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketRequestPayment struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketRequestPayment) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketRequestPayment) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketRequestPayment(response, &metadata)\n\t}\n\toutput := &GetBucketRequestPaymentOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentGetBucketRequestPaymentOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketRequestPayment(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketRequestPaymentOutput(v **GetBucketRequestPaymentOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketRequestPaymentOutput\n\tif *v == nil {\n\t\tsv = &GetBucketRequestPaymentOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Payer\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Payer = types.Payer(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketTagging struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketTagging) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketTagging) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketTagging(response, &metadata)\n\t}\n\toutput := &GetBucketTaggingOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentGetBucketTaggingOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketTagging(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketTaggingOutput(v **GetBucketTaggingOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketTaggingOutput\n\tif *v == nil {\n\t\tsv = &GetBucketTaggingOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"TagSet\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentTagSet(&sv.TagSet, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketVersioning struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketVersioning) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketVersioning) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketVersioning(response, &metadata)\n\t}\n\toutput := &GetBucketVersioningOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentGetBucketVersioningOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketVersioning(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketVersioningOutput(v **GetBucketVersioningOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketVersioningOutput\n\tif *v == nil {\n\t\tsv = &GetBucketVersioningOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"MfaDelete\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.MFADelete = types.MFADeleteStatus(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Status\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Status = types.BucketVersioningStatus(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetBucketWebsite struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetBucketWebsite) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetBucketWebsite) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetBucketWebsite(response, &metadata)\n\t}\n\toutput := &GetBucketWebsiteOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentGetBucketWebsiteOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetBucketWebsite(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetBucketWebsiteOutput(v **GetBucketWebsiteOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetBucketWebsiteOutput\n\tif *v == nil {\n\t\tsv = &GetBucketWebsiteOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ErrorDocument\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentErrorDocument(&sv.ErrorDocument, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"IndexDocument\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentIndexDocument(&sv.IndexDocument, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"RedirectAllRequestsTo\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentRedirectAllRequestsTo(&sv.RedirectAllRequestsTo, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"RoutingRules\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentRoutingRules(&sv.RoutingRules, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetObject struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetObject) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetObject) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetObject(response, &metadata)\n\t}\n\toutput := &GetObjectOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsGetObjectOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\terr = awsRestxml_deserializeOpDocumentGetObjectOutput(output, response.Body)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to deserialize response payload, %w\", err)}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetObject(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tcase strings.EqualFold(\"InvalidObjectState\", errorCode):\n\t\treturn awsRestxml_deserializeErrorInvalidObjectState(response, errorBody)\n\n\tcase strings.EqualFold(\"NoSuchKey\", errorCode):\n\t\treturn awsRestxml_deserializeErrorNoSuchKey(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsGetObjectOutput(v *GetObjectOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"accept-ranges\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.AcceptRanges = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-bucket-key-enabled\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseBool(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.BucketKeyEnabled = ptr.Bool(vv)\n\t}\n\n\tif headerValues := response.Header.Values(\"Cache-Control\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.CacheControl = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-crc32\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumCRC32 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-crc32c\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumCRC32C = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-crc64nvme\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumCRC64NVME = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-sha1\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumSHA1 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-sha256\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumSHA256 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-type\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumType = types.ChecksumType(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"Content-Disposition\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ContentDisposition = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"Content-Encoding\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ContentEncoding = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"Content-Language\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ContentLanguage = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"Content-Length\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseInt(headerValues[0], 0, 64)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.ContentLength = ptr.Int64(vv)\n\t}\n\n\tif headerValues := response.Header.Values(\"Content-Range\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ContentRange = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"Content-Type\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ContentType = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-delete-marker\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseBool(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.DeleteMarker = ptr.Bool(vv)\n\t}\n\n\tif headerValues := response.Header.Values(\"ETag\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ETag = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-expiration\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.Expiration = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"Expires\"); len(headerValues) != 0 {\n\t\tdeserOverride, err := deserializeS3Expires(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.Expires = deserOverride\n\n\t}\n\n\tif headerValues := response.Header.Values(\"Expires\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ExpiresString = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"Last-Modified\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tt, err := smithytime.ParseHTTPDate(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.LastModified = ptr.Time(t)\n\t}\n\n\tfor headerKey, headerValues := range response.Header {\n\t\tif lenPrefix := len(\"x-amz-meta-\"); len(headerKey) >= lenPrefix && strings.EqualFold(headerKey[:lenPrefix], \"x-amz-meta-\") {\n\t\t\tif v.Metadata == nil {\n\t\t\t\tv.Metadata = map[string]string{}\n\t\t\t}\n\t\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\t\tv.Metadata[strings.ToLower(headerKey[lenPrefix:])] = headerValues[0]\n\t\t}\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-missing-meta\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseInt(headerValues[0], 0, 32)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.MissingMeta = ptr.Int32(int32(vv))\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-object-lock-legal-hold\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ObjectLockLegalHoldStatus = types.ObjectLockLegalHoldStatus(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-object-lock-mode\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ObjectLockMode = types.ObjectLockMode(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-object-lock-retain-until-date\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tt, err := smithytime.ParseDateTime(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.ObjectLockRetainUntilDate = ptr.Time(t)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-mp-parts-count\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseInt(headerValues[0], 0, 32)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.PartsCount = ptr.Int32(int32(vv))\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-replication-status\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ReplicationStatus = types.ReplicationStatus(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-restore\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.Restore = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ServerSideEncryption = types.ServerSideEncryption(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-customer-algorithm\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSECustomerAlgorithm = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-customer-key-MD5\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSECustomerKeyMD5 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-aws-kms-key-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSEKMSKeyId = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-storage-class\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.StorageClass = types.StorageClass(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-tagging-count\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseInt(headerValues[0], 0, 32)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.TagCount = ptr.Int32(int32(vv))\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-version-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.VersionId = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-website-redirect-location\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.WebsiteRedirectLocation = ptr.String(headerValues[0])\n\t}\n\n\treturn nil\n}\nfunc awsRestxml_deserializeOpDocumentGetObjectOutput(v *GetObjectOutput, body io.ReadCloser) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization of nil %T\", v)\n\t}\n\tv.Body = body\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetObjectAcl struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetObjectAcl) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetObjectAcl) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetObjectAcl(response, &metadata)\n\t}\n\toutput := &GetObjectAclOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsGetObjectAclOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentGetObjectAclOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetObjectAcl(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tcase strings.EqualFold(\"NoSuchKey\", errorCode):\n\t\treturn awsRestxml_deserializeErrorNoSuchKey(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsGetObjectAclOutput(v *GetObjectAclOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\treturn nil\n}\nfunc awsRestxml_deserializeOpDocumentGetObjectAclOutput(v **GetObjectAclOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetObjectAclOutput\n\tif *v == nil {\n\t\tsv = &GetObjectAclOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"AccessControlList\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentGrants(&sv.Grants, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Owner\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentOwner(&sv.Owner, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetObjectAttributes struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetObjectAttributes) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetObjectAttributes) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetObjectAttributes(response, &metadata)\n\t}\n\toutput := &GetObjectAttributesOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsGetObjectAttributesOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentGetObjectAttributesOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetObjectAttributes(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tcase strings.EqualFold(\"NoSuchKey\", errorCode):\n\t\treturn awsRestxml_deserializeErrorNoSuchKey(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsGetObjectAttributesOutput(v *GetObjectAttributesOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-delete-marker\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseBool(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.DeleteMarker = ptr.Bool(vv)\n\t}\n\n\tif headerValues := response.Header.Values(\"Last-Modified\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tt, err := smithytime.ParseHTTPDate(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.LastModified = ptr.Time(t)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-version-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.VersionId = ptr.String(headerValues[0])\n\t}\n\n\treturn nil\n}\nfunc awsRestxml_deserializeOpDocumentGetObjectAttributesOutput(v **GetObjectAttributesOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetObjectAttributesOutput\n\tif *v == nil {\n\t\tsv = &GetObjectAttributesOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Checksum\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentChecksum(&sv.Checksum, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ETag\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ETag = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ObjectParts\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentGetObjectAttributesParts(&sv.ObjectParts, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ObjectSize\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.ObjectSize = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"StorageClass\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.StorageClass = types.StorageClass(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetObjectLegalHold struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetObjectLegalHold) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetObjectLegalHold) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetObjectLegalHold(response, &metadata)\n\t}\n\toutput := &GetObjectLegalHoldOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentObjectLockLegalHold(&output.LegalHold, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetObjectLegalHold(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetObjectLegalHoldOutput(v **GetObjectLegalHoldOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetObjectLegalHoldOutput\n\tif *v == nil {\n\t\tsv = &GetObjectLegalHoldOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"LegalHold\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentObjectLockLegalHold(&sv.LegalHold, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetObjectLockConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetObjectLockConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetObjectLockConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetObjectLockConfiguration(response, &metadata)\n\t}\n\toutput := &GetObjectLockConfigurationOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentObjectLockConfiguration(&output.ObjectLockConfiguration, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetObjectLockConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetObjectLockConfigurationOutput(v **GetObjectLockConfigurationOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetObjectLockConfigurationOutput\n\tif *v == nil {\n\t\tsv = &GetObjectLockConfigurationOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ObjectLockConfiguration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentObjectLockConfiguration(&sv.ObjectLockConfiguration, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetObjectRetention struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetObjectRetention) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetObjectRetention) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetObjectRetention(response, &metadata)\n\t}\n\toutput := &GetObjectRetentionOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentObjectLockRetention(&output.Retention, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetObjectRetention(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetObjectRetentionOutput(v **GetObjectRetentionOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetObjectRetentionOutput\n\tif *v == nil {\n\t\tsv = &GetObjectRetentionOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Retention\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentObjectLockRetention(&sv.Retention, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetObjectTagging struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetObjectTagging) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetObjectTagging) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetObjectTagging(response, &metadata)\n\t}\n\toutput := &GetObjectTaggingOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsGetObjectTaggingOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentGetObjectTaggingOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetObjectTagging(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsGetObjectTaggingOutput(v *GetObjectTaggingOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-version-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.VersionId = ptr.String(headerValues[0])\n\t}\n\n\treturn nil\n}\nfunc awsRestxml_deserializeOpDocumentGetObjectTaggingOutput(v **GetObjectTaggingOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetObjectTaggingOutput\n\tif *v == nil {\n\t\tsv = &GetObjectTaggingOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"TagSet\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentTagSet(&sv.TagSet, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetObjectTorrent struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetObjectTorrent) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetObjectTorrent) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetObjectTorrent(response, &metadata)\n\t}\n\toutput := &GetObjectTorrentOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsGetObjectTorrentOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\terr = awsRestxml_deserializeOpDocumentGetObjectTorrentOutput(output, response.Body)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to deserialize response payload, %w\", err)}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetObjectTorrent(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsGetObjectTorrentOutput(v *GetObjectTorrentOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\treturn nil\n}\nfunc awsRestxml_deserializeOpDocumentGetObjectTorrentOutput(v *GetObjectTorrentOutput, body io.ReadCloser) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization of nil %T\", v)\n\t}\n\tv.Body = body\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpGetPublicAccessBlock struct {\n}\n\nfunc (*awsRestxml_deserializeOpGetPublicAccessBlock) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpGetPublicAccessBlock) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorGetPublicAccessBlock(response, &metadata)\n\t}\n\toutput := &GetPublicAccessBlockOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentPublicAccessBlockConfiguration(&output.PublicAccessBlockConfiguration, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorGetPublicAccessBlock(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentGetPublicAccessBlockOutput(v **GetPublicAccessBlockOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *GetPublicAccessBlockOutput\n\tif *v == nil {\n\t\tsv = &GetPublicAccessBlockOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"PublicAccessBlockConfiguration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentPublicAccessBlockConfiguration(&sv.PublicAccessBlockConfiguration, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpHeadBucket struct {\n}\n\nfunc (*awsRestxml_deserializeOpHeadBucket) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpHeadBucket) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorHeadBucket(response, &metadata)\n\t}\n\toutput := &HeadBucketOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsHeadBucketOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorHeadBucket(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tcase strings.EqualFold(\"NotFound\", errorCode):\n\t\treturn awsRestxml_deserializeErrorNotFound(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsHeadBucketOutput(v *HeadBucketOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-access-point-alias\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseBool(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.AccessPointAlias = ptr.Bool(vv)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-bucket-location-name\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.BucketLocationName = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-bucket-location-type\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.BucketLocationType = types.LocationType(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-bucket-region\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.BucketRegion = ptr.String(headerValues[0])\n\t}\n\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpHeadObject struct {\n}\n\nfunc (*awsRestxml_deserializeOpHeadObject) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpHeadObject) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorHeadObject(response, &metadata)\n\t}\n\toutput := &HeadObjectOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsHeadObjectOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorHeadObject(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tcase strings.EqualFold(\"NotFound\", errorCode):\n\t\treturn awsRestxml_deserializeErrorNotFound(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsHeadObjectOutput(v *HeadObjectOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"accept-ranges\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.AcceptRanges = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-archive-status\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ArchiveStatus = types.ArchiveStatus(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-bucket-key-enabled\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseBool(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.BucketKeyEnabled = ptr.Bool(vv)\n\t}\n\n\tif headerValues := response.Header.Values(\"Cache-Control\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.CacheControl = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-crc32\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumCRC32 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-crc32c\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumCRC32C = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-crc64nvme\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumCRC64NVME = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-sha1\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumSHA1 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-sha256\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumSHA256 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-type\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumType = types.ChecksumType(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"Content-Disposition\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ContentDisposition = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"Content-Encoding\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ContentEncoding = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"Content-Language\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ContentLanguage = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"Content-Length\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseInt(headerValues[0], 0, 64)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.ContentLength = ptr.Int64(vv)\n\t}\n\n\tif headerValues := response.Header.Values(\"Content-Range\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ContentRange = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"Content-Type\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ContentType = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-delete-marker\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseBool(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.DeleteMarker = ptr.Bool(vv)\n\t}\n\n\tif headerValues := response.Header.Values(\"ETag\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ETag = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-expiration\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.Expiration = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"Expires\"); len(headerValues) != 0 {\n\t\tdeserOverride, err := deserializeS3Expires(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.Expires = deserOverride\n\n\t}\n\n\tif headerValues := response.Header.Values(\"Expires\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ExpiresString = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"Last-Modified\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tt, err := smithytime.ParseHTTPDate(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.LastModified = ptr.Time(t)\n\t}\n\n\tfor headerKey, headerValues := range response.Header {\n\t\tif lenPrefix := len(\"x-amz-meta-\"); len(headerKey) >= lenPrefix && strings.EqualFold(headerKey[:lenPrefix], \"x-amz-meta-\") {\n\t\t\tif v.Metadata == nil {\n\t\t\t\tv.Metadata = map[string]string{}\n\t\t\t}\n\t\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\t\tv.Metadata[strings.ToLower(headerKey[lenPrefix:])] = headerValues[0]\n\t\t}\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-missing-meta\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseInt(headerValues[0], 0, 32)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.MissingMeta = ptr.Int32(int32(vv))\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-object-lock-legal-hold\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ObjectLockLegalHoldStatus = types.ObjectLockLegalHoldStatus(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-object-lock-mode\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ObjectLockMode = types.ObjectLockMode(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-object-lock-retain-until-date\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tt, err := smithytime.ParseDateTime(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.ObjectLockRetainUntilDate = ptr.Time(t)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-mp-parts-count\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseInt(headerValues[0], 0, 32)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.PartsCount = ptr.Int32(int32(vv))\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-replication-status\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ReplicationStatus = types.ReplicationStatus(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-restore\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.Restore = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ServerSideEncryption = types.ServerSideEncryption(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-customer-algorithm\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSECustomerAlgorithm = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-customer-key-MD5\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSECustomerKeyMD5 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-aws-kms-key-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSEKMSKeyId = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-storage-class\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.StorageClass = types.StorageClass(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-version-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.VersionId = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-website-redirect-location\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.WebsiteRedirectLocation = ptr.String(headerValues[0])\n\t}\n\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpListBucketAnalyticsConfigurations struct {\n}\n\nfunc (*awsRestxml_deserializeOpListBucketAnalyticsConfigurations) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpListBucketAnalyticsConfigurations) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorListBucketAnalyticsConfigurations(response, &metadata)\n\t}\n\toutput := &ListBucketAnalyticsConfigurationsOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentListBucketAnalyticsConfigurationsOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorListBucketAnalyticsConfigurations(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentListBucketAnalyticsConfigurationsOutput(v **ListBucketAnalyticsConfigurationsOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *ListBucketAnalyticsConfigurationsOutput\n\tif *v == nil {\n\t\tsv = &ListBucketAnalyticsConfigurationsOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"AnalyticsConfiguration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentAnalyticsConfigurationListUnwrapped(&sv.AnalyticsConfigurationList, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ContinuationToken\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ContinuationToken = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"IsTruncated\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected IsTruncated to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.IsTruncated = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"NextContinuationToken\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.NextContinuationToken = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpListBucketIntelligentTieringConfigurations struct {\n}\n\nfunc (*awsRestxml_deserializeOpListBucketIntelligentTieringConfigurations) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpListBucketIntelligentTieringConfigurations) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorListBucketIntelligentTieringConfigurations(response, &metadata)\n\t}\n\toutput := &ListBucketIntelligentTieringConfigurationsOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentListBucketIntelligentTieringConfigurationsOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorListBucketIntelligentTieringConfigurations(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentListBucketIntelligentTieringConfigurationsOutput(v **ListBucketIntelligentTieringConfigurationsOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *ListBucketIntelligentTieringConfigurationsOutput\n\tif *v == nil {\n\t\tsv = &ListBucketIntelligentTieringConfigurationsOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ContinuationToken\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ContinuationToken = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"IntelligentTieringConfiguration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentIntelligentTieringConfigurationListUnwrapped(&sv.IntelligentTieringConfigurationList, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"IsTruncated\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected IsTruncated to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.IsTruncated = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"NextContinuationToken\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.NextContinuationToken = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpListBucketInventoryConfigurations struct {\n}\n\nfunc (*awsRestxml_deserializeOpListBucketInventoryConfigurations) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpListBucketInventoryConfigurations) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorListBucketInventoryConfigurations(response, &metadata)\n\t}\n\toutput := &ListBucketInventoryConfigurationsOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentListBucketInventoryConfigurationsOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorListBucketInventoryConfigurations(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentListBucketInventoryConfigurationsOutput(v **ListBucketInventoryConfigurationsOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *ListBucketInventoryConfigurationsOutput\n\tif *v == nil {\n\t\tsv = &ListBucketInventoryConfigurationsOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ContinuationToken\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ContinuationToken = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"InventoryConfiguration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentInventoryConfigurationListUnwrapped(&sv.InventoryConfigurationList, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"IsTruncated\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected IsTruncated to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.IsTruncated = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"NextContinuationToken\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.NextContinuationToken = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpListBucketMetricsConfigurations struct {\n}\n\nfunc (*awsRestxml_deserializeOpListBucketMetricsConfigurations) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpListBucketMetricsConfigurations) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorListBucketMetricsConfigurations(response, &metadata)\n\t}\n\toutput := &ListBucketMetricsConfigurationsOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentListBucketMetricsConfigurationsOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorListBucketMetricsConfigurations(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentListBucketMetricsConfigurationsOutput(v **ListBucketMetricsConfigurationsOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *ListBucketMetricsConfigurationsOutput\n\tif *v == nil {\n\t\tsv = &ListBucketMetricsConfigurationsOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ContinuationToken\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ContinuationToken = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"IsTruncated\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected IsTruncated to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.IsTruncated = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"MetricsConfiguration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentMetricsConfigurationListUnwrapped(&sv.MetricsConfigurationList, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"NextContinuationToken\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.NextContinuationToken = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpListBuckets struct {\n}\n\nfunc (*awsRestxml_deserializeOpListBuckets) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpListBuckets) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorListBuckets(response, &metadata)\n\t}\n\toutput := &ListBucketsOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentListBucketsOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorListBuckets(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentListBucketsOutput(v **ListBucketsOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *ListBucketsOutput\n\tif *v == nil {\n\t\tsv = &ListBucketsOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Buckets\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentBuckets(&sv.Buckets, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ContinuationToken\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ContinuationToken = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Owner\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentOwner(&sv.Owner, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpListDirectoryBuckets struct {\n}\n\nfunc (*awsRestxml_deserializeOpListDirectoryBuckets) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpListDirectoryBuckets) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorListDirectoryBuckets(response, &metadata)\n\t}\n\toutput := &ListDirectoryBucketsOutput{}\n\tout.Result = output\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentListDirectoryBucketsOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorListDirectoryBuckets(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpDocumentListDirectoryBucketsOutput(v **ListDirectoryBucketsOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *ListDirectoryBucketsOutput\n\tif *v == nil {\n\t\tsv = &ListDirectoryBucketsOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Buckets\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentBuckets(&sv.Buckets, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ContinuationToken\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ContinuationToken = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpListMultipartUploads struct {\n}\n\nfunc (*awsRestxml_deserializeOpListMultipartUploads) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpListMultipartUploads) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorListMultipartUploads(response, &metadata)\n\t}\n\toutput := &ListMultipartUploadsOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsListMultipartUploadsOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentListMultipartUploadsOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorListMultipartUploads(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsListMultipartUploadsOutput(v *ListMultipartUploadsOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\treturn nil\n}\nfunc awsRestxml_deserializeOpDocumentListMultipartUploadsOutput(v **ListMultipartUploadsOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *ListMultipartUploadsOutput\n\tif *v == nil {\n\t\tsv = &ListMultipartUploadsOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Bucket\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Bucket = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"CommonPrefixes\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentCommonPrefixListUnwrapped(&sv.CommonPrefixes, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Delimiter\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Delimiter = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"EncodingType\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.EncodingType = types.EncodingType(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"IsTruncated\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected IsTruncated to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.IsTruncated = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"KeyMarker\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.KeyMarker = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"MaxUploads\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.MaxUploads = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"NextKeyMarker\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.NextKeyMarker = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"NextUploadIdMarker\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.NextUploadIdMarker = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"UploadIdMarker\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.UploadIdMarker = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Upload\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentMultipartUploadListUnwrapped(&sv.Uploads, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpListObjects struct {\n}\n\nfunc (*awsRestxml_deserializeOpListObjects) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpListObjects) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorListObjects(response, &metadata)\n\t}\n\toutput := &ListObjectsOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsListObjectsOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentListObjectsOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorListObjects(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tcase strings.EqualFold(\"NoSuchBucket\", errorCode):\n\t\treturn awsRestxml_deserializeErrorNoSuchBucket(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsListObjectsOutput(v *ListObjectsOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\treturn nil\n}\nfunc awsRestxml_deserializeOpDocumentListObjectsOutput(v **ListObjectsOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *ListObjectsOutput\n\tif *v == nil {\n\t\tsv = &ListObjectsOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"CommonPrefixes\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentCommonPrefixListUnwrapped(&sv.CommonPrefixes, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Contents\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentObjectListUnwrapped(&sv.Contents, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Delimiter\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Delimiter = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"EncodingType\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.EncodingType = types.EncodingType(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"IsTruncated\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected IsTruncated to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.IsTruncated = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Marker\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Marker = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"MaxKeys\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.MaxKeys = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Name\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Name = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"NextMarker\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.NextMarker = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpListObjectsV2 struct {\n}\n\nfunc (*awsRestxml_deserializeOpListObjectsV2) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpListObjectsV2) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorListObjectsV2(response, &metadata)\n\t}\n\toutput := &ListObjectsV2Output{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsListObjectsV2Output(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentListObjectsV2Output(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorListObjectsV2(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tcase strings.EqualFold(\"NoSuchBucket\", errorCode):\n\t\treturn awsRestxml_deserializeErrorNoSuchBucket(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsListObjectsV2Output(v *ListObjectsV2Output, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\treturn nil\n}\nfunc awsRestxml_deserializeOpDocumentListObjectsV2Output(v **ListObjectsV2Output, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *ListObjectsV2Output\n\tif *v == nil {\n\t\tsv = &ListObjectsV2Output{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"CommonPrefixes\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentCommonPrefixListUnwrapped(&sv.CommonPrefixes, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Contents\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentObjectListUnwrapped(&sv.Contents, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ContinuationToken\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ContinuationToken = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Delimiter\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Delimiter = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"EncodingType\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.EncodingType = types.EncodingType(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"IsTruncated\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected IsTruncated to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.IsTruncated = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"KeyCount\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.KeyCount = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"MaxKeys\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.MaxKeys = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Name\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Name = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"NextContinuationToken\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.NextContinuationToken = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"StartAfter\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.StartAfter = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpListObjectVersions struct {\n}\n\nfunc (*awsRestxml_deserializeOpListObjectVersions) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpListObjectVersions) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorListObjectVersions(response, &metadata)\n\t}\n\toutput := &ListObjectVersionsOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsListObjectVersionsOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentListObjectVersionsOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorListObjectVersions(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsListObjectVersionsOutput(v *ListObjectVersionsOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\treturn nil\n}\nfunc awsRestxml_deserializeOpDocumentListObjectVersionsOutput(v **ListObjectVersionsOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *ListObjectVersionsOutput\n\tif *v == nil {\n\t\tsv = &ListObjectVersionsOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"CommonPrefixes\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentCommonPrefixListUnwrapped(&sv.CommonPrefixes, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"DeleteMarker\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentDeleteMarkersUnwrapped(&sv.DeleteMarkers, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Delimiter\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Delimiter = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"EncodingType\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.EncodingType = types.EncodingType(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"IsTruncated\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected IsTruncated to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.IsTruncated = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"KeyMarker\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.KeyMarker = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"MaxKeys\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.MaxKeys = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Name\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Name = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"NextKeyMarker\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.NextKeyMarker = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"NextVersionIdMarker\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.NextVersionIdMarker = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"VersionIdMarker\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.VersionIdMarker = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Version\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentObjectVersionListUnwrapped(&sv.Versions, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpListParts struct {\n}\n\nfunc (*awsRestxml_deserializeOpListParts) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpListParts) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorListParts(response, &metadata)\n\t}\n\toutput := &ListPartsOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsListPartsOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeOpDocumentListPartsOutput(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorListParts(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsListPartsOutput(v *ListPartsOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-abort-date\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tt, err := smithytime.ParseHTTPDate(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.AbortDate = ptr.Time(t)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-abort-rule-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.AbortRuleId = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\treturn nil\n}\nfunc awsRestxml_deserializeOpDocumentListPartsOutput(v **ListPartsOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *ListPartsOutput\n\tif *v == nil {\n\t\tsv = &ListPartsOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Bucket\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Bucket = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumAlgorithm\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumAlgorithm = types.ChecksumAlgorithm(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumType\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumType = types.ChecksumType(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Initiator\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentInitiator(&sv.Initiator, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"IsTruncated\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected IsTruncated to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.IsTruncated = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Key\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Key = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"MaxParts\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.MaxParts = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"NextPartNumberMarker\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.NextPartNumberMarker = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Owner\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentOwner(&sv.Owner, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"PartNumberMarker\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.PartNumberMarker = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Part\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentPartsUnwrapped(&sv.Parts, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"StorageClass\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.StorageClass = types.StorageClass(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"UploadId\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.UploadId = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpPutBucketAccelerateConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutBucketAccelerateConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutBucketAccelerateConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutBucketAccelerateConfiguration(response, &metadata)\n\t}\n\toutput := &PutBucketAccelerateConfigurationOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutBucketAccelerateConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpPutBucketAcl struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutBucketAcl) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutBucketAcl) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutBucketAcl(response, &metadata)\n\t}\n\toutput := &PutBucketAclOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutBucketAcl(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpPutBucketAnalyticsConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutBucketAnalyticsConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutBucketAnalyticsConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutBucketAnalyticsConfiguration(response, &metadata)\n\t}\n\toutput := &PutBucketAnalyticsConfigurationOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutBucketAnalyticsConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpPutBucketCors struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutBucketCors) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutBucketCors) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutBucketCors(response, &metadata)\n\t}\n\toutput := &PutBucketCorsOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutBucketCors(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpPutBucketEncryption struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutBucketEncryption) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutBucketEncryption) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutBucketEncryption(response, &metadata)\n\t}\n\toutput := &PutBucketEncryptionOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutBucketEncryption(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpPutBucketIntelligentTieringConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutBucketIntelligentTieringConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutBucketIntelligentTieringConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutBucketIntelligentTieringConfiguration(response, &metadata)\n\t}\n\toutput := &PutBucketIntelligentTieringConfigurationOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutBucketIntelligentTieringConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpPutBucketInventoryConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutBucketInventoryConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutBucketInventoryConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutBucketInventoryConfiguration(response, &metadata)\n\t}\n\toutput := &PutBucketInventoryConfigurationOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutBucketInventoryConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpPutBucketLifecycleConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutBucketLifecycleConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutBucketLifecycleConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutBucketLifecycleConfiguration(response, &metadata)\n\t}\n\toutput := &PutBucketLifecycleConfigurationOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsPutBucketLifecycleConfigurationOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutBucketLifecycleConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsPutBucketLifecycleConfigurationOutput(v *PutBucketLifecycleConfigurationOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-transition-default-minimum-object-size\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.TransitionDefaultMinimumObjectSize = types.TransitionDefaultMinimumObjectSize(headerValues[0])\n\t}\n\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpPutBucketLogging struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutBucketLogging) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutBucketLogging) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutBucketLogging(response, &metadata)\n\t}\n\toutput := &PutBucketLoggingOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutBucketLogging(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpPutBucketMetricsConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutBucketMetricsConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutBucketMetricsConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutBucketMetricsConfiguration(response, &metadata)\n\t}\n\toutput := &PutBucketMetricsConfigurationOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutBucketMetricsConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpPutBucketNotificationConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutBucketNotificationConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutBucketNotificationConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutBucketNotificationConfiguration(response, &metadata)\n\t}\n\toutput := &PutBucketNotificationConfigurationOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutBucketNotificationConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpPutBucketOwnershipControls struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutBucketOwnershipControls) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutBucketOwnershipControls) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutBucketOwnershipControls(response, &metadata)\n\t}\n\toutput := &PutBucketOwnershipControlsOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutBucketOwnershipControls(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpPutBucketPolicy struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutBucketPolicy) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutBucketPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutBucketPolicy(response, &metadata)\n\t}\n\toutput := &PutBucketPolicyOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutBucketPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpPutBucketReplication struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutBucketReplication) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutBucketReplication) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutBucketReplication(response, &metadata)\n\t}\n\toutput := &PutBucketReplicationOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutBucketReplication(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpPutBucketRequestPayment struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutBucketRequestPayment) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutBucketRequestPayment) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutBucketRequestPayment(response, &metadata)\n\t}\n\toutput := &PutBucketRequestPaymentOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutBucketRequestPayment(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpPutBucketTagging struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutBucketTagging) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutBucketTagging) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutBucketTagging(response, &metadata)\n\t}\n\toutput := &PutBucketTaggingOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutBucketTagging(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpPutBucketVersioning struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutBucketVersioning) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutBucketVersioning) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutBucketVersioning(response, &metadata)\n\t}\n\toutput := &PutBucketVersioningOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutBucketVersioning(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpPutBucketWebsite struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutBucketWebsite) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutBucketWebsite) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutBucketWebsite(response, &metadata)\n\t}\n\toutput := &PutBucketWebsiteOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutBucketWebsite(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpPutObject struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutObject) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutObject) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutObject(response, &metadata)\n\t}\n\toutput := &PutObjectOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsPutObjectOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutObject(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tcase strings.EqualFold(\"EncryptionTypeMismatch\", errorCode):\n\t\treturn awsRestxml_deserializeErrorEncryptionTypeMismatch(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidRequest\", errorCode):\n\t\treturn awsRestxml_deserializeErrorInvalidRequest(response, errorBody)\n\n\tcase strings.EqualFold(\"InvalidWriteOffset\", errorCode):\n\t\treturn awsRestxml_deserializeErrorInvalidWriteOffset(response, errorBody)\n\n\tcase strings.EqualFold(\"TooManyParts\", errorCode):\n\t\treturn awsRestxml_deserializeErrorTooManyParts(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsPutObjectOutput(v *PutObjectOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-bucket-key-enabled\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseBool(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.BucketKeyEnabled = ptr.Bool(vv)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-crc32\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumCRC32 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-crc32c\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumCRC32C = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-crc64nvme\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumCRC64NVME = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-sha1\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumSHA1 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-sha256\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumSHA256 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-type\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumType = types.ChecksumType(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"ETag\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ETag = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-expiration\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.Expiration = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ServerSideEncryption = types.ServerSideEncryption(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-object-size\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseInt(headerValues[0], 0, 64)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.Size = ptr.Int64(vv)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-customer-algorithm\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSECustomerAlgorithm = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-customer-key-MD5\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSECustomerKeyMD5 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-context\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSEKMSEncryptionContext = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-aws-kms-key-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSEKMSKeyId = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-version-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.VersionId = ptr.String(headerValues[0])\n\t}\n\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpPutObjectAcl struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutObjectAcl) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutObjectAcl) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutObjectAcl(response, &metadata)\n\t}\n\toutput := &PutObjectAclOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsPutObjectAclOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutObjectAcl(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tcase strings.EqualFold(\"NoSuchKey\", errorCode):\n\t\treturn awsRestxml_deserializeErrorNoSuchKey(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsPutObjectAclOutput(v *PutObjectAclOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpPutObjectLegalHold struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutObjectLegalHold) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutObjectLegalHold) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutObjectLegalHold(response, &metadata)\n\t}\n\toutput := &PutObjectLegalHoldOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsPutObjectLegalHoldOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutObjectLegalHold(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsPutObjectLegalHoldOutput(v *PutObjectLegalHoldOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpPutObjectLockConfiguration struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutObjectLockConfiguration) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutObjectLockConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutObjectLockConfiguration(response, &metadata)\n\t}\n\toutput := &PutObjectLockConfigurationOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsPutObjectLockConfigurationOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutObjectLockConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsPutObjectLockConfigurationOutput(v *PutObjectLockConfigurationOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpPutObjectRetention struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutObjectRetention) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutObjectRetention) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutObjectRetention(response, &metadata)\n\t}\n\toutput := &PutObjectRetentionOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsPutObjectRetentionOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutObjectRetention(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsPutObjectRetentionOutput(v *PutObjectRetentionOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpPutObjectTagging struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutObjectTagging) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutObjectTagging) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutObjectTagging(response, &metadata)\n\t}\n\toutput := &PutObjectTaggingOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsPutObjectTaggingOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutObjectTagging(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsPutObjectTaggingOutput(v *PutObjectTaggingOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-version-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.VersionId = ptr.String(headerValues[0])\n\t}\n\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpPutPublicAccessBlock struct {\n}\n\nfunc (*awsRestxml_deserializeOpPutPublicAccessBlock) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpPutPublicAccessBlock) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorPutPublicAccessBlock(response, &metadata)\n\t}\n\toutput := &PutPublicAccessBlockOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorPutPublicAccessBlock(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpRestoreObject struct {\n}\n\nfunc (*awsRestxml_deserializeOpRestoreObject) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpRestoreObject) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorRestoreObject(response, &metadata)\n\t}\n\toutput := &RestoreObjectOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsRestoreObjectOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorRestoreObject(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tcase strings.EqualFold(\"ObjectAlreadyInActiveTierError\", errorCode):\n\t\treturn awsRestxml_deserializeErrorObjectAlreadyInActiveTierError(response, errorBody)\n\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsRestoreObjectOutput(v *RestoreObjectOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-restore-output-path\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RestoreOutputPath = ptr.String(headerValues[0])\n\t}\n\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpSelectObjectContent struct {\n}\n\nfunc (*awsRestxml_deserializeOpSelectObjectContent) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpSelectObjectContent) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorSelectObjectContent(response, &metadata)\n\t}\n\toutput := &SelectObjectContentOutput{}\n\tout.Result = output\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorSelectObjectContent(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\ntype awsRestxml_deserializeOpUploadPart struct {\n}\n\nfunc (*awsRestxml_deserializeOpUploadPart) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpUploadPart) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorUploadPart(response, &metadata)\n\t}\n\toutput := &UploadPartOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsUploadPartOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorUploadPart(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsUploadPartOutput(v *UploadPartOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-bucket-key-enabled\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseBool(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.BucketKeyEnabled = ptr.Bool(vv)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-crc32\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumCRC32 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-crc32c\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumCRC32C = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-crc64nvme\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumCRC64NVME = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-sha1\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumSHA1 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-checksum-sha256\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ChecksumSHA256 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"ETag\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ETag = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ServerSideEncryption = types.ServerSideEncryption(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-customer-algorithm\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSECustomerAlgorithm = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-customer-key-MD5\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSECustomerKeyMD5 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-aws-kms-key-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSEKMSKeyId = ptr.String(headerValues[0])\n\t}\n\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpUploadPartCopy struct {\n}\n\nfunc (*awsRestxml_deserializeOpUploadPartCopy) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpUploadPartCopy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorUploadPartCopy(response, &metadata)\n\t}\n\toutput := &UploadPartCopyOutput{}\n\tout.Result = output\n\n\terr = awsRestxml_deserializeOpHttpBindingsUploadPartCopyOutput(output, response)\n\tif err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"failed to decode response with invalid Http bindings, %w\", err)}\n\t}\n\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(response.Body, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn out, metadata, nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentCopyPartResult(&output.CopyPartResult, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorUploadPartCopy(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeOpHttpBindingsUploadPartCopyOutput(v *UploadPartCopyOutput, response *smithyhttp.Response) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unsupported deserialization for nil %T\", v)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-bucket-key-enabled\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tvv, err := strconv.ParseBool(headerValues[0])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.BucketKeyEnabled = ptr.Bool(vv)\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-copy-source-version-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.CopySourceVersionId = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-request-charged\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.RequestCharged = types.RequestCharged(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.ServerSideEncryption = types.ServerSideEncryption(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-customer-algorithm\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSECustomerAlgorithm = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-customer-key-MD5\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSECustomerKeyMD5 = ptr.String(headerValues[0])\n\t}\n\n\tif headerValues := response.Header.Values(\"x-amz-server-side-encryption-aws-kms-key-id\"); len(headerValues) != 0 {\n\t\theaderValues[0] = strings.TrimSpace(headerValues[0])\n\t\tv.SSEKMSKeyId = ptr.String(headerValues[0])\n\t}\n\n\treturn nil\n}\nfunc awsRestxml_deserializeOpDocumentUploadPartCopyOutput(v **UploadPartCopyOutput, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *UploadPartCopyOutput\n\tif *v == nil {\n\t\tsv = &UploadPartCopyOutput{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"CopyPartResult\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentCopyPartResult(&sv.CopyPartResult, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\ntype awsRestxml_deserializeOpWriteGetObjectResponse struct {\n}\n\nfunc (*awsRestxml_deserializeOpWriteGetObjectResponse) ID() string {\n\treturn \"OperationDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpWriteGetObjectResponse) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\t_, span := tracing.StartSpan(ctx, \"OperationDeserializer\")\n\tendTimer := startMetricTimer(ctx, \"client.call.deserialization_duration\")\n\tdefer endTimer()\n\tdefer span.End()\n\tresponse, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, &smithy.DeserializationError{Err: fmt.Errorf(\"unknown transport type %T\", out.RawResponse)}\n\t}\n\n\tif response.StatusCode < 200 || response.StatusCode >= 300 {\n\t\treturn out, metadata, awsRestxml_deserializeOpErrorWriteGetObjectResponse(response, &metadata)\n\t}\n\toutput := &WriteGetObjectResponseOutput{}\n\tout.Result = output\n\n\tif _, err = io.Copy(ioutil.Discard, response.Body); err != nil {\n\t\treturn out, metadata, &smithy.DeserializationError{\n\t\t\tErr: fmt.Errorf(\"failed to discard response body, %w\", err),\n\t\t}\n\t}\n\n\tspan.End()\n\treturn out, metadata, err\n}\n\nfunc awsRestxml_deserializeOpErrorWriteGetObjectResponse(response *smithyhttp.Response, metadata *middleware.Metadata) error {\n\tvar errorBuffer bytes.Buffer\n\tif _, err := io.Copy(&errorBuffer, response.Body); err != nil {\n\t\treturn &smithy.DeserializationError{Err: fmt.Errorf(\"failed to copy error response body, %w\", err)}\n\t}\n\terrorBody := bytes.NewReader(errorBuffer.Bytes())\n\n\terrorCode := \"UnknownError\"\n\terrorMessage := errorCode\n\n\terrorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{\n\t\tUseStatusCode: true, StatusCode: response.StatusCode,\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif hostID := errorComponents.HostID; len(hostID) != 0 {\n\t\ts3shared.SetHostIDMetadata(metadata, hostID)\n\t}\n\tif reqID := errorComponents.RequestID; len(reqID) != 0 {\n\t\tawsmiddleware.SetRequestIDMetadata(metadata, reqID)\n\t}\n\tif len(errorComponents.Code) != 0 {\n\t\terrorCode = errorComponents.Code\n\t}\n\tif len(errorComponents.Message) != 0 {\n\t\terrorMessage = errorComponents.Message\n\t}\n\terrorBody.Seek(0, io.SeekStart)\n\tswitch {\n\tdefault:\n\t\tgenericError := &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\t\treturn genericError\n\n\t}\n}\n\nfunc awsRestxml_deserializeEventStreamSelectObjectContentEventStream(v *types.SelectObjectContentEventStream, msg *eventstream.Message) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected serialization of nil %T\", v)\n\t}\n\n\teventType := msg.Headers.Get(eventstreamapi.EventTypeHeader)\n\tif eventType == nil {\n\t\treturn fmt.Errorf(\"%s event header not present\", eventstreamapi.EventTypeHeader)\n\t}\n\n\tswitch {\n\tcase strings.EqualFold(\"Cont\", eventType.String()):\n\t\tvv := &types.SelectObjectContentEventStreamMemberCont{}\n\t\tif err := awsRestxml_deserializeEventMessageContinuationEvent(&vv.Value, msg); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*v = vv\n\t\treturn nil\n\n\tcase strings.EqualFold(\"End\", eventType.String()):\n\t\tvv := &types.SelectObjectContentEventStreamMemberEnd{}\n\t\tif err := awsRestxml_deserializeEventMessageEndEvent(&vv.Value, msg); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*v = vv\n\t\treturn nil\n\n\tcase strings.EqualFold(\"Progress\", eventType.String()):\n\t\tvv := &types.SelectObjectContentEventStreamMemberProgress{}\n\t\tif err := awsRestxml_deserializeEventMessageProgressEvent(&vv.Value, msg); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*v = vv\n\t\treturn nil\n\n\tcase strings.EqualFold(\"Records\", eventType.String()):\n\t\tvv := &types.SelectObjectContentEventStreamMemberRecords{}\n\t\tif err := awsRestxml_deserializeEventMessageRecordsEvent(&vv.Value, msg); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*v = vv\n\t\treturn nil\n\n\tcase strings.EqualFold(\"Stats\", eventType.String()):\n\t\tvv := &types.SelectObjectContentEventStreamMemberStats{}\n\t\tif err := awsRestxml_deserializeEventMessageStatsEvent(&vv.Value, msg); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*v = vv\n\t\treturn nil\n\n\tdefault:\n\t\tbuffer := bytes.NewBuffer(nil)\n\t\teventstream.NewEncoder().Encode(buffer, *msg)\n\t\t*v = &types.UnknownUnionMember{\n\t\t\tTag:   eventType.String(),\n\t\t\tValue: buffer.Bytes(),\n\t\t}\n\t\treturn nil\n\n\t}\n}\n\nfunc awsRestxml_deserializeEventStreamExceptionSelectObjectContentEventStream(msg *eventstream.Message) error {\n\texceptionType := msg.Headers.Get(eventstreamapi.ExceptionTypeHeader)\n\tif exceptionType == nil {\n\t\treturn fmt.Errorf(\"%s event header not present\", eventstreamapi.ExceptionTypeHeader)\n\t}\n\n\tswitch {\n\tdefault:\n\t\tbr := bytes.NewReader(msg.Payload)\n\t\tvar buff [1024]byte\n\t\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\n\t\tbody := io.TeeReader(br, ringBuffer)\n\t\tdecoder := json.NewDecoder(body)\n\t\tdecoder.UseNumber()\n\t\terrorComponents, err := awsxml.GetErrorResponseComponents(br, true)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\terrorCode := \"UnknownError\"\n\t\terrorMessage := errorCode\n\t\tif ev := exceptionType.String(); len(ev) > 0 {\n\t\t\terrorCode = ev\n\t\t} else if ev := errorComponents.Code; len(ev) > 0 {\n\t\t\terrorCode = ev\n\t\t}\n\t\tif ev := errorComponents.Message; len(ev) > 0 {\n\t\t\terrorMessage = ev\n\t\t}\n\t\treturn &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\n\t}\n}\n\nfunc awsRestxml_deserializeEventMessageRecordsEvent(v *types.RecordsEvent, msg *eventstream.Message) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected serialization of nil %T\", v)\n\t}\n\n\tif msg.Payload != nil {\n\t\tbsv := make([]byte, len(msg.Payload))\n\t\tcopy(bsv, msg.Payload)\n\n\t\tv.Payload = bsv\n\t}\n\treturn nil\n}\n\nfunc awsRestxml_deserializeEventMessageStatsEvent(v *types.StatsEvent, msg *eventstream.Message) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected serialization of nil %T\", v)\n\t}\n\n\tbr := bytes.NewReader(msg.Payload)\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(br, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentStats(&v.Details, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsRestxml_deserializeEventMessageProgressEvent(v *types.ProgressEvent, msg *eventstream.Message) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected serialization of nil %T\", v)\n\t}\n\n\tbr := bytes.NewReader(msg.Payload)\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(br, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentProgress(&v.Details, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsRestxml_deserializeEventMessageContinuationEvent(v *types.ContinuationEvent, msg *eventstream.Message) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected serialization of nil %T\", v)\n\t}\n\n\tbr := bytes.NewReader(msg.Payload)\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(br, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentContinuationEvent(&v, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsRestxml_deserializeEventMessageEndEvent(v *types.EndEvent, msg *eventstream.Message) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected serialization of nil %T\", v)\n\t}\n\n\tbr := bytes.NewReader(msg.Payload)\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(br, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn nil\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentEndEvent(&v, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentContinuationEvent(v **types.ContinuationEvent, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ContinuationEvent\n\tif *v == nil {\n\t\tsv = &types.ContinuationEvent{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentEndEvent(v **types.EndEvent, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.EndEvent\n\tif *v == nil {\n\t\tsv = &types.EndEvent{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentProgress(v **types.Progress, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.Progress\n\tif *v == nil {\n\t\tsv = &types.Progress{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"BytesProcessed\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.BytesProcessed = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"BytesReturned\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.BytesReturned = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"BytesScanned\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.BytesScanned = ptr.Int64(i64)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentStats(v **types.Stats, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.Stats\n\tif *v == nil {\n\t\tsv = &types.Stats{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"BytesProcessed\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.BytesProcessed = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"BytesReturned\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.BytesReturned = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"BytesScanned\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.BytesScanned = ptr.Int64(i64)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeErrorBucketAlreadyExists(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\toutput := &types.BucketAlreadyExists{}\n\treturn output\n}\n\nfunc awsRestxml_deserializeErrorBucketAlreadyOwnedByYou(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\toutput := &types.BucketAlreadyOwnedByYou{}\n\treturn output\n}\n\nfunc awsRestxml_deserializeErrorEncryptionTypeMismatch(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\toutput := &types.EncryptionTypeMismatch{}\n\treturn output\n}\n\nfunc awsRestxml_deserializeErrorInvalidObjectState(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\toutput := &types.InvalidObjectState{}\n\tvar buff [1024]byte\n\tringBuffer := smithyio.NewRingBuffer(buff[:])\n\tbody := io.TeeReader(errorBody, ringBuffer)\n\trootDecoder := xml.NewDecoder(body)\n\tt, err := smithyxml.FetchRootElement(rootDecoder)\n\tif err == io.EOF {\n\t\treturn output\n\t}\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\tdecoder := smithyxml.WrapNodeDecoder(rootDecoder, t)\n\terr = awsRestxml_deserializeDocumentInvalidObjectState(&output, decoder)\n\tif err != nil {\n\t\tvar snapshot bytes.Buffer\n\t\tio.Copy(&snapshot, ringBuffer)\n\t\treturn &smithy.DeserializationError{\n\t\t\tErr:      fmt.Errorf(\"failed to decode response body, %w\", err),\n\t\t\tSnapshot: snapshot.Bytes(),\n\t\t}\n\t}\n\n\treturn output\n}\n\nfunc awsRestxml_deserializeErrorInvalidRequest(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\toutput := &types.InvalidRequest{}\n\treturn output\n}\n\nfunc awsRestxml_deserializeErrorInvalidWriteOffset(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\toutput := &types.InvalidWriteOffset{}\n\treturn output\n}\n\nfunc awsRestxml_deserializeErrorNoSuchBucket(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\toutput := &types.NoSuchBucket{}\n\treturn output\n}\n\nfunc awsRestxml_deserializeErrorNoSuchKey(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\toutput := &types.NoSuchKey{}\n\treturn output\n}\n\nfunc awsRestxml_deserializeErrorNoSuchUpload(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\toutput := &types.NoSuchUpload{}\n\treturn output\n}\n\nfunc awsRestxml_deserializeErrorNotFound(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\toutput := &types.NotFound{}\n\treturn output\n}\n\nfunc awsRestxml_deserializeErrorObjectAlreadyInActiveTierError(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\toutput := &types.ObjectAlreadyInActiveTierError{}\n\treturn output\n}\n\nfunc awsRestxml_deserializeErrorObjectNotInActiveTierError(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\toutput := &types.ObjectNotInActiveTierError{}\n\treturn output\n}\n\nfunc awsRestxml_deserializeErrorTooManyParts(response *smithyhttp.Response, errorBody *bytes.Reader) error {\n\toutput := &types.TooManyParts{}\n\treturn output\n}\n\nfunc awsRestxml_deserializeDocumentAbortIncompleteMultipartUpload(v **types.AbortIncompleteMultipartUpload, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.AbortIncompleteMultipartUpload\n\tif *v == nil {\n\t\tsv = &types.AbortIncompleteMultipartUpload{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"DaysAfterInitiation\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.DaysAfterInitiation = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentAccessControlTranslation(v **types.AccessControlTranslation, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.AccessControlTranslation\n\tif *v == nil {\n\t\tsv = &types.AccessControlTranslation{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Owner\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Owner = types.OwnerOverride(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentAllowedHeaders(v *[]string, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []string\n\tif *v == nil {\n\t\tsv = make([]string, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tmemberDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdecoder = memberDecoder\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col string\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tcol = xtv\n\t\t\t}\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentAllowedHeadersUnwrapped(v *[]string, decoder smithyxml.NodeDecoder) error {\n\tvar sv []string\n\tif *v == nil {\n\t\tsv = make([]string, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv string\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tval, err := decoder.Value()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif val == nil {\n\t\t\tbreak\n\t\t}\n\t\t{\n\t\t\txtv := string(val)\n\t\t\tmv = xtv\n\t\t}\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentAllowedMethods(v *[]string, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []string\n\tif *v == nil {\n\t\tsv = make([]string, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tmemberDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdecoder = memberDecoder\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col string\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tcol = xtv\n\t\t\t}\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentAllowedMethodsUnwrapped(v *[]string, decoder smithyxml.NodeDecoder) error {\n\tvar sv []string\n\tif *v == nil {\n\t\tsv = make([]string, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv string\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tval, err := decoder.Value()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif val == nil {\n\t\t\tbreak\n\t\t}\n\t\t{\n\t\t\txtv := string(val)\n\t\t\tmv = xtv\n\t\t}\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentAllowedOrigins(v *[]string, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []string\n\tif *v == nil {\n\t\tsv = make([]string, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tmemberDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdecoder = memberDecoder\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col string\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tcol = xtv\n\t\t\t}\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentAllowedOriginsUnwrapped(v *[]string, decoder smithyxml.NodeDecoder) error {\n\tvar sv []string\n\tif *v == nil {\n\t\tsv = make([]string, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv string\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tval, err := decoder.Value()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif val == nil {\n\t\t\tbreak\n\t\t}\n\t\t{\n\t\t\txtv := string(val)\n\t\t\tmv = xtv\n\t\t}\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentAnalyticsAndOperator(v **types.AnalyticsAndOperator, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.AnalyticsAndOperator\n\tif *v == nil {\n\t\tsv = &types.AnalyticsAndOperator{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Tag\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentTagSetUnwrapped(&sv.Tags, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentAnalyticsConfiguration(v **types.AnalyticsConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.AnalyticsConfiguration\n\tif *v == nil {\n\t\tsv = &types.AnalyticsConfiguration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Filter\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentAnalyticsFilter(&sv.Filter, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Id\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Id = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"StorageClassAnalysis\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentStorageClassAnalysis(&sv.StorageClassAnalysis, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentAnalyticsConfigurationList(v *[]types.AnalyticsConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.AnalyticsConfiguration\n\tif *v == nil {\n\t\tsv = make([]types.AnalyticsConfiguration, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.AnalyticsConfiguration\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentAnalyticsConfiguration(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentAnalyticsConfigurationListUnwrapped(v *[]types.AnalyticsConfiguration, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.AnalyticsConfiguration\n\tif *v == nil {\n\t\tsv = make([]types.AnalyticsConfiguration, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.AnalyticsConfiguration\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentAnalyticsConfiguration(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentAnalyticsExportDestination(v **types.AnalyticsExportDestination, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.AnalyticsExportDestination\n\tif *v == nil {\n\t\tsv = &types.AnalyticsExportDestination{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"S3BucketDestination\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentAnalyticsS3BucketDestination(&sv.S3BucketDestination, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentAnalyticsFilter(v *types.AnalyticsFilter, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar uv types.AnalyticsFilter\n\tvar memberFound bool\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tif memberFound {\n\t\t\tif err = decoder.Decoder.Skip(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"And\", t.Name.Local):\n\t\t\tvar mv types.AnalyticsAndOperator\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &mv\n\t\t\tif err := awsRestxml_deserializeDocumentAnalyticsAndOperator(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tmv = *destAddr\n\t\t\tuv = &types.AnalyticsFilterMemberAnd{Value: mv}\n\t\t\tmemberFound = true\n\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tvar mv string\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tmv = xtv\n\t\t\t}\n\t\t\tuv = &types.AnalyticsFilterMemberPrefix{Value: mv}\n\t\t\tmemberFound = true\n\n\t\tcase strings.EqualFold(\"Tag\", t.Name.Local):\n\t\t\tvar mv types.Tag\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &mv\n\t\t\tif err := awsRestxml_deserializeDocumentTag(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tmv = *destAddr\n\t\t\tuv = &types.AnalyticsFilterMemberTag{Value: mv}\n\t\t\tmemberFound = true\n\n\t\tdefault:\n\t\t\tuv = &types.UnknownUnionMember{Tag: t.Name.Local}\n\t\t\tmemberFound = true\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = uv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentAnalyticsS3BucketDestination(v **types.AnalyticsS3BucketDestination, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.AnalyticsS3BucketDestination\n\tif *v == nil {\n\t\tsv = &types.AnalyticsS3BucketDestination{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Bucket\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Bucket = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"BucketAccountId\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.BucketAccountId = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Format\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Format = types.AnalyticsS3ExportFileFormat(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentBucket(v **types.Bucket, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.Bucket\n\tif *v == nil {\n\t\tsv = &types.Bucket{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"BucketRegion\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.BucketRegion = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"CreationDate\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tt, err := smithytime.ParseDateTime(xtv)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.CreationDate = ptr.Time(t)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Name\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Name = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentBucketAlreadyExists(v **types.BucketAlreadyExists, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.BucketAlreadyExists\n\tif *v == nil {\n\t\tsv = &types.BucketAlreadyExists{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentBucketAlreadyOwnedByYou(v **types.BucketAlreadyOwnedByYou, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.BucketAlreadyOwnedByYou\n\tif *v == nil {\n\t\tsv = &types.BucketAlreadyOwnedByYou{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentBuckets(v *[]types.Bucket, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.Bucket\n\tif *v == nil {\n\t\tsv = make([]types.Bucket, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Bucket\", t.Name.Local):\n\t\t\tvar col types.Bucket\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentBucket(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentBucketsUnwrapped(v *[]types.Bucket, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.Bucket\n\tif *v == nil {\n\t\tsv = make([]types.Bucket, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.Bucket\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentBucket(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentChecksum(v **types.Checksum, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.Checksum\n\tif *v == nil {\n\t\tsv = &types.Checksum{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ChecksumCRC32\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumCRC32 = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumCRC32C\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumCRC32C = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumCRC64NVME\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumCRC64NVME = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumSHA1\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumSHA1 = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumSHA256\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumSHA256 = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumType\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumType = types.ChecksumType(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentChecksumAlgorithmList(v *[]types.ChecksumAlgorithm, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.ChecksumAlgorithm\n\tif *v == nil {\n\t\tsv = make([]types.ChecksumAlgorithm, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tmemberDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdecoder = memberDecoder\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.ChecksumAlgorithm\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tcol = types.ChecksumAlgorithm(xtv)\n\t\t\t}\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentChecksumAlgorithmListUnwrapped(v *[]types.ChecksumAlgorithm, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.ChecksumAlgorithm\n\tif *v == nil {\n\t\tsv = make([]types.ChecksumAlgorithm, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.ChecksumAlgorithm\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tval, err := decoder.Value()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif val == nil {\n\t\t\tbreak\n\t\t}\n\t\t{\n\t\t\txtv := string(val)\n\t\t\tmv = types.ChecksumAlgorithm(xtv)\n\t\t}\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentCommonPrefix(v **types.CommonPrefix, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.CommonPrefix\n\tif *v == nil {\n\t\tsv = &types.CommonPrefix{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentCommonPrefixList(v *[]types.CommonPrefix, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.CommonPrefix\n\tif *v == nil {\n\t\tsv = make([]types.CommonPrefix, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.CommonPrefix\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentCommonPrefix(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentCommonPrefixListUnwrapped(v *[]types.CommonPrefix, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.CommonPrefix\n\tif *v == nil {\n\t\tsv = make([]types.CommonPrefix, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.CommonPrefix\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentCommonPrefix(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentCondition(v **types.Condition, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.Condition\n\tif *v == nil {\n\t\tsv = &types.Condition{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"HttpErrorCodeReturnedEquals\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.HttpErrorCodeReturnedEquals = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"KeyPrefixEquals\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.KeyPrefixEquals = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentCopyObjectResult(v **types.CopyObjectResult, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.CopyObjectResult\n\tif *v == nil {\n\t\tsv = &types.CopyObjectResult{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ChecksumCRC32\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumCRC32 = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumCRC32C\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumCRC32C = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumCRC64NVME\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumCRC64NVME = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumSHA1\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumSHA1 = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumSHA256\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumSHA256 = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumType\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumType = types.ChecksumType(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ETag\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ETag = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"LastModified\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tt, err := smithytime.ParseDateTime(xtv)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.LastModified = ptr.Time(t)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentCopyPartResult(v **types.CopyPartResult, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.CopyPartResult\n\tif *v == nil {\n\t\tsv = &types.CopyPartResult{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ChecksumCRC32\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumCRC32 = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumCRC32C\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumCRC32C = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumCRC64NVME\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumCRC64NVME = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumSHA1\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumSHA1 = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumSHA256\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumSHA256 = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ETag\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ETag = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"LastModified\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tt, err := smithytime.ParseDateTime(xtv)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.LastModified = ptr.Time(t)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentCORSRule(v **types.CORSRule, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.CORSRule\n\tif *v == nil {\n\t\tsv = &types.CORSRule{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"AllowedHeader\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentAllowedHeadersUnwrapped(&sv.AllowedHeaders, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"AllowedMethod\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentAllowedMethodsUnwrapped(&sv.AllowedMethods, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"AllowedOrigin\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentAllowedOriginsUnwrapped(&sv.AllowedOrigins, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ExposeHeader\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentExposeHeadersUnwrapped(&sv.ExposeHeaders, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ID\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ID = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"MaxAgeSeconds\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.MaxAgeSeconds = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentCORSRules(v *[]types.CORSRule, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.CORSRule\n\tif *v == nil {\n\t\tsv = make([]types.CORSRule, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.CORSRule\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentCORSRule(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentCORSRulesUnwrapped(v *[]types.CORSRule, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.CORSRule\n\tif *v == nil {\n\t\tsv = make([]types.CORSRule, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.CORSRule\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentCORSRule(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentDefaultRetention(v **types.DefaultRetention, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.DefaultRetention\n\tif *v == nil {\n\t\tsv = &types.DefaultRetention{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Days\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.Days = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Mode\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Mode = types.ObjectLockRetentionMode(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Years\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.Years = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentDeletedObject(v **types.DeletedObject, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.DeletedObject\n\tif *v == nil {\n\t\tsv = &types.DeletedObject{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"DeleteMarker\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected DeleteMarker to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.DeleteMarker = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"DeleteMarkerVersionId\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.DeleteMarkerVersionId = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Key\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Key = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"VersionId\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.VersionId = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentDeletedObjects(v *[]types.DeletedObject, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.DeletedObject\n\tif *v == nil {\n\t\tsv = make([]types.DeletedObject, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.DeletedObject\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentDeletedObject(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentDeletedObjectsUnwrapped(v *[]types.DeletedObject, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.DeletedObject\n\tif *v == nil {\n\t\tsv = make([]types.DeletedObject, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.DeletedObject\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentDeletedObject(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentDeleteMarkerEntry(v **types.DeleteMarkerEntry, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.DeleteMarkerEntry\n\tif *v == nil {\n\t\tsv = &types.DeleteMarkerEntry{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"IsLatest\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected IsLatest to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.IsLatest = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Key\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Key = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"LastModified\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tt, err := smithytime.ParseDateTime(xtv)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.LastModified = ptr.Time(t)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Owner\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentOwner(&sv.Owner, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"VersionId\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.VersionId = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentDeleteMarkerReplication(v **types.DeleteMarkerReplication, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.DeleteMarkerReplication\n\tif *v == nil {\n\t\tsv = &types.DeleteMarkerReplication{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Status\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Status = types.DeleteMarkerReplicationStatus(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentDeleteMarkers(v *[]types.DeleteMarkerEntry, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.DeleteMarkerEntry\n\tif *v == nil {\n\t\tsv = make([]types.DeleteMarkerEntry, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.DeleteMarkerEntry\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentDeleteMarkerEntry(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentDeleteMarkersUnwrapped(v *[]types.DeleteMarkerEntry, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.DeleteMarkerEntry\n\tif *v == nil {\n\t\tsv = make([]types.DeleteMarkerEntry, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.DeleteMarkerEntry\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentDeleteMarkerEntry(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentDestination(v **types.Destination, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.Destination\n\tif *v == nil {\n\t\tsv = &types.Destination{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"AccessControlTranslation\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentAccessControlTranslation(&sv.AccessControlTranslation, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Account\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Account = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Bucket\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Bucket = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"EncryptionConfiguration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentEncryptionConfiguration(&sv.EncryptionConfiguration, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Metrics\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentMetrics(&sv.Metrics, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ReplicationTime\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentReplicationTime(&sv.ReplicationTime, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"StorageClass\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.StorageClass = types.StorageClass(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentEncryptionConfiguration(v **types.EncryptionConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.EncryptionConfiguration\n\tif *v == nil {\n\t\tsv = &types.EncryptionConfiguration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ReplicaKmsKeyID\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ReplicaKmsKeyID = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentEncryptionTypeMismatch(v **types.EncryptionTypeMismatch, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.EncryptionTypeMismatch\n\tif *v == nil {\n\t\tsv = &types.EncryptionTypeMismatch{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentError(v **types.Error, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.Error\n\tif *v == nil {\n\t\tsv = &types.Error{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Code\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Code = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Key\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Key = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Message\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Message = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"VersionId\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.VersionId = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentErrorDetails(v **types.ErrorDetails, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ErrorDetails\n\tif *v == nil {\n\t\tsv = &types.ErrorDetails{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ErrorCode\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ErrorCode = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ErrorMessage\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ErrorMessage = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentErrorDocument(v **types.ErrorDocument, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ErrorDocument\n\tif *v == nil {\n\t\tsv = &types.ErrorDocument{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Key\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Key = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentErrors(v *[]types.Error, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.Error\n\tif *v == nil {\n\t\tsv = make([]types.Error, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.Error\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentError(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentErrorsUnwrapped(v *[]types.Error, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.Error\n\tif *v == nil {\n\t\tsv = make([]types.Error, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.Error\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentError(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentEventBridgeConfiguration(v **types.EventBridgeConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.EventBridgeConfiguration\n\tif *v == nil {\n\t\tsv = &types.EventBridgeConfiguration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentEventList(v *[]types.Event, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.Event\n\tif *v == nil {\n\t\tsv = make([]types.Event, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tmemberDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdecoder = memberDecoder\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.Event\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tcol = types.Event(xtv)\n\t\t\t}\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentEventListUnwrapped(v *[]types.Event, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.Event\n\tif *v == nil {\n\t\tsv = make([]types.Event, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.Event\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tval, err := decoder.Value()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif val == nil {\n\t\t\tbreak\n\t\t}\n\t\t{\n\t\t\txtv := string(val)\n\t\t\tmv = types.Event(xtv)\n\t\t}\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentExistingObjectReplication(v **types.ExistingObjectReplication, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ExistingObjectReplication\n\tif *v == nil {\n\t\tsv = &types.ExistingObjectReplication{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Status\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Status = types.ExistingObjectReplicationStatus(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentExposeHeaders(v *[]string, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []string\n\tif *v == nil {\n\t\tsv = make([]string, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tmemberDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdecoder = memberDecoder\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col string\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tcol = xtv\n\t\t\t}\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentExposeHeadersUnwrapped(v *[]string, decoder smithyxml.NodeDecoder) error {\n\tvar sv []string\n\tif *v == nil {\n\t\tsv = make([]string, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv string\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tval, err := decoder.Value()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif val == nil {\n\t\t\tbreak\n\t\t}\n\t\t{\n\t\t\txtv := string(val)\n\t\t\tmv = xtv\n\t\t}\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentFilterRule(v **types.FilterRule, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.FilterRule\n\tif *v == nil {\n\t\tsv = &types.FilterRule{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Name\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Name = types.FilterRuleName(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Value\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Value = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentFilterRuleList(v *[]types.FilterRule, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.FilterRule\n\tif *v == nil {\n\t\tsv = make([]types.FilterRule, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.FilterRule\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentFilterRule(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentFilterRuleListUnwrapped(v *[]types.FilterRule, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.FilterRule\n\tif *v == nil {\n\t\tsv = make([]types.FilterRule, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.FilterRule\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentFilterRule(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentGetBucketMetadataTableConfigurationResult(v **types.GetBucketMetadataTableConfigurationResult, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.GetBucketMetadataTableConfigurationResult\n\tif *v == nil {\n\t\tsv = &types.GetBucketMetadataTableConfigurationResult{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Error\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentErrorDetails(&sv.Error, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"MetadataTableConfigurationResult\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentMetadataTableConfigurationResult(&sv.MetadataTableConfigurationResult, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Status\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Status = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentGetObjectAttributesParts(v **types.GetObjectAttributesParts, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.GetObjectAttributesParts\n\tif *v == nil {\n\t\tsv = &types.GetObjectAttributesParts{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"IsTruncated\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected IsTruncated to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.IsTruncated = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"MaxParts\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.MaxParts = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"NextPartNumberMarker\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.NextPartNumberMarker = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"PartNumberMarker\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.PartNumberMarker = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Part\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentPartsListUnwrapped(&sv.Parts, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"PartsCount\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.TotalPartsCount = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentGrant(v **types.Grant, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.Grant\n\tif *v == nil {\n\t\tsv = &types.Grant{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Grantee\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentGrantee(&sv.Grantee, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Permission\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Permission = types.Permission(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentGrantee(v **types.Grantee, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.Grantee\n\tif *v == nil {\n\t\tsv = &types.Grantee{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor _, attr := range decoder.StartEl.Attr {\n\t\tname := attr.Name.Local\n\t\tif len(attr.Name.Space) != 0 {\n\t\t\tname = attr.Name.Space + `:` + attr.Name.Local\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"xsi:type\", name):\n\t\t\tval := []byte(attr.Value)\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Type = types.Type(xtv)\n\t\t\t}\n\n\t\t}\n\t}\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"DisplayName\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.DisplayName = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"EmailAddress\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.EmailAddress = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ID\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ID = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"URI\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.URI = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentGrants(v *[]types.Grant, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.Grant\n\tif *v == nil {\n\t\tsv = make([]types.Grant, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Grant\", t.Name.Local):\n\t\t\tvar col types.Grant\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentGrant(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentGrantsUnwrapped(v *[]types.Grant, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.Grant\n\tif *v == nil {\n\t\tsv = make([]types.Grant, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.Grant\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentGrant(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentIndexDocument(v **types.IndexDocument, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.IndexDocument\n\tif *v == nil {\n\t\tsv = &types.IndexDocument{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Suffix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Suffix = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentInitiator(v **types.Initiator, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.Initiator\n\tif *v == nil {\n\t\tsv = &types.Initiator{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"DisplayName\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.DisplayName = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ID\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ID = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentIntelligentTieringAndOperator(v **types.IntelligentTieringAndOperator, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.IntelligentTieringAndOperator\n\tif *v == nil {\n\t\tsv = &types.IntelligentTieringAndOperator{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Tag\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentTagSetUnwrapped(&sv.Tags, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentIntelligentTieringConfiguration(v **types.IntelligentTieringConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.IntelligentTieringConfiguration\n\tif *v == nil {\n\t\tsv = &types.IntelligentTieringConfiguration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Filter\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentIntelligentTieringFilter(&sv.Filter, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Id\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Id = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Status\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Status = types.IntelligentTieringStatus(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Tiering\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentTieringListUnwrapped(&sv.Tierings, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentIntelligentTieringConfigurationList(v *[]types.IntelligentTieringConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.IntelligentTieringConfiguration\n\tif *v == nil {\n\t\tsv = make([]types.IntelligentTieringConfiguration, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.IntelligentTieringConfiguration\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentIntelligentTieringConfiguration(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentIntelligentTieringConfigurationListUnwrapped(v *[]types.IntelligentTieringConfiguration, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.IntelligentTieringConfiguration\n\tif *v == nil {\n\t\tsv = make([]types.IntelligentTieringConfiguration, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.IntelligentTieringConfiguration\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentIntelligentTieringConfiguration(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentIntelligentTieringFilter(v **types.IntelligentTieringFilter, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.IntelligentTieringFilter\n\tif *v == nil {\n\t\tsv = &types.IntelligentTieringFilter{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"And\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentIntelligentTieringAndOperator(&sv.And, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Tag\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentTag(&sv.Tag, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentInvalidObjectState(v **types.InvalidObjectState, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.InvalidObjectState\n\tif *v == nil {\n\t\tsv = &types.InvalidObjectState{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"AccessTier\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.AccessTier = types.IntelligentTieringAccessTier(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"StorageClass\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.StorageClass = types.StorageClass(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentInvalidRequest(v **types.InvalidRequest, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.InvalidRequest\n\tif *v == nil {\n\t\tsv = &types.InvalidRequest{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentInvalidWriteOffset(v **types.InvalidWriteOffset, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.InvalidWriteOffset\n\tif *v == nil {\n\t\tsv = &types.InvalidWriteOffset{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentInventoryConfiguration(v **types.InventoryConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.InventoryConfiguration\n\tif *v == nil {\n\t\tsv = &types.InventoryConfiguration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Destination\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentInventoryDestination(&sv.Destination, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Filter\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentInventoryFilter(&sv.Filter, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Id\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Id = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"IncludedObjectVersions\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.IncludedObjectVersions = types.InventoryIncludedObjectVersions(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"IsEnabled\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected IsEnabled to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.IsEnabled = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"OptionalFields\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentInventoryOptionalFields(&sv.OptionalFields, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Schedule\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentInventorySchedule(&sv.Schedule, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentInventoryConfigurationList(v *[]types.InventoryConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.InventoryConfiguration\n\tif *v == nil {\n\t\tsv = make([]types.InventoryConfiguration, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.InventoryConfiguration\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentInventoryConfiguration(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentInventoryConfigurationListUnwrapped(v *[]types.InventoryConfiguration, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.InventoryConfiguration\n\tif *v == nil {\n\t\tsv = make([]types.InventoryConfiguration, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.InventoryConfiguration\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentInventoryConfiguration(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentInventoryDestination(v **types.InventoryDestination, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.InventoryDestination\n\tif *v == nil {\n\t\tsv = &types.InventoryDestination{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"S3BucketDestination\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentInventoryS3BucketDestination(&sv.S3BucketDestination, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentInventoryEncryption(v **types.InventoryEncryption, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.InventoryEncryption\n\tif *v == nil {\n\t\tsv = &types.InventoryEncryption{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"SSE-KMS\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentSSEKMS(&sv.SSEKMS, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"SSE-S3\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentSSES3(&sv.SSES3, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentInventoryFilter(v **types.InventoryFilter, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.InventoryFilter\n\tif *v == nil {\n\t\tsv = &types.InventoryFilter{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentInventoryOptionalFields(v *[]types.InventoryOptionalField, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.InventoryOptionalField\n\tif *v == nil {\n\t\tsv = make([]types.InventoryOptionalField, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tmemberDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdecoder = memberDecoder\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Field\", t.Name.Local):\n\t\t\tvar col types.InventoryOptionalField\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tcol = types.InventoryOptionalField(xtv)\n\t\t\t}\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentInventoryOptionalFieldsUnwrapped(v *[]types.InventoryOptionalField, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.InventoryOptionalField\n\tif *v == nil {\n\t\tsv = make([]types.InventoryOptionalField, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.InventoryOptionalField\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tval, err := decoder.Value()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif val == nil {\n\t\t\tbreak\n\t\t}\n\t\t{\n\t\t\txtv := string(val)\n\t\t\tmv = types.InventoryOptionalField(xtv)\n\t\t}\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentInventoryS3BucketDestination(v **types.InventoryS3BucketDestination, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.InventoryS3BucketDestination\n\tif *v == nil {\n\t\tsv = &types.InventoryS3BucketDestination{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"AccountId\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.AccountId = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Bucket\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Bucket = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Encryption\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentInventoryEncryption(&sv.Encryption, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Format\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Format = types.InventoryFormat(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentInventorySchedule(v **types.InventorySchedule, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.InventorySchedule\n\tif *v == nil {\n\t\tsv = &types.InventorySchedule{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Frequency\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Frequency = types.InventoryFrequency(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentLambdaFunctionConfiguration(v **types.LambdaFunctionConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.LambdaFunctionConfiguration\n\tif *v == nil {\n\t\tsv = &types.LambdaFunctionConfiguration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Event\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentEventListUnwrapped(&sv.Events, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Filter\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentNotificationConfigurationFilter(&sv.Filter, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Id\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Id = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"CloudFunction\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.LambdaFunctionArn = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentLambdaFunctionConfigurationList(v *[]types.LambdaFunctionConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.LambdaFunctionConfiguration\n\tif *v == nil {\n\t\tsv = make([]types.LambdaFunctionConfiguration, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.LambdaFunctionConfiguration\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentLambdaFunctionConfiguration(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentLambdaFunctionConfigurationListUnwrapped(v *[]types.LambdaFunctionConfiguration, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.LambdaFunctionConfiguration\n\tif *v == nil {\n\t\tsv = make([]types.LambdaFunctionConfiguration, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.LambdaFunctionConfiguration\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentLambdaFunctionConfiguration(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentLifecycleExpiration(v **types.LifecycleExpiration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.LifecycleExpiration\n\tif *v == nil {\n\t\tsv = &types.LifecycleExpiration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Date\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tt, err := smithytime.ParseDateTime(xtv)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.Date = ptr.Time(t)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Days\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.Days = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ExpiredObjectDeleteMarker\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected ExpiredObjectDeleteMarker to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.ExpiredObjectDeleteMarker = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentLifecycleRule(v **types.LifecycleRule, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.LifecycleRule\n\tif *v == nil {\n\t\tsv = &types.LifecycleRule{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"AbortIncompleteMultipartUpload\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentAbortIncompleteMultipartUpload(&sv.AbortIncompleteMultipartUpload, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Expiration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentLifecycleExpiration(&sv.Expiration, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Filter\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentLifecycleRuleFilter(&sv.Filter, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ID\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ID = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"NoncurrentVersionExpiration\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentNoncurrentVersionExpiration(&sv.NoncurrentVersionExpiration, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"NoncurrentVersionTransition\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentNoncurrentVersionTransitionListUnwrapped(&sv.NoncurrentVersionTransitions, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Status\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Status = types.ExpirationStatus(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Transition\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentTransitionListUnwrapped(&sv.Transitions, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentLifecycleRuleAndOperator(v **types.LifecycleRuleAndOperator, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.LifecycleRuleAndOperator\n\tif *v == nil {\n\t\tsv = &types.LifecycleRuleAndOperator{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ObjectSizeGreaterThan\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.ObjectSizeGreaterThan = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ObjectSizeLessThan\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.ObjectSizeLessThan = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Tag\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentTagSetUnwrapped(&sv.Tags, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentLifecycleRuleFilter(v **types.LifecycleRuleFilter, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.LifecycleRuleFilter\n\tif *v == nil {\n\t\tsv = &types.LifecycleRuleFilter{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"And\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentLifecycleRuleAndOperator(&sv.And, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ObjectSizeGreaterThan\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.ObjectSizeGreaterThan = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ObjectSizeLessThan\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.ObjectSizeLessThan = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Tag\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentTag(&sv.Tag, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentLifecycleRules(v *[]types.LifecycleRule, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.LifecycleRule\n\tif *v == nil {\n\t\tsv = make([]types.LifecycleRule, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.LifecycleRule\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentLifecycleRule(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentLifecycleRulesUnwrapped(v *[]types.LifecycleRule, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.LifecycleRule\n\tif *v == nil {\n\t\tsv = make([]types.LifecycleRule, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.LifecycleRule\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentLifecycleRule(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentLoggingEnabled(v **types.LoggingEnabled, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.LoggingEnabled\n\tif *v == nil {\n\t\tsv = &types.LoggingEnabled{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"TargetBucket\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.TargetBucket = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"TargetGrants\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentTargetGrants(&sv.TargetGrants, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"TargetObjectKeyFormat\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentTargetObjectKeyFormat(&sv.TargetObjectKeyFormat, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"TargetPrefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.TargetPrefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentMetadataTableConfigurationResult(v **types.MetadataTableConfigurationResult, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.MetadataTableConfigurationResult\n\tif *v == nil {\n\t\tsv = &types.MetadataTableConfigurationResult{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"S3TablesDestinationResult\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentS3TablesDestinationResult(&sv.S3TablesDestinationResult, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentMetrics(v **types.Metrics, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.Metrics\n\tif *v == nil {\n\t\tsv = &types.Metrics{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"EventThreshold\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentReplicationTimeValue(&sv.EventThreshold, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Status\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Status = types.MetricsStatus(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentMetricsAndOperator(v **types.MetricsAndOperator, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.MetricsAndOperator\n\tif *v == nil {\n\t\tsv = &types.MetricsAndOperator{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"AccessPointArn\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.AccessPointArn = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Tag\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentTagSetUnwrapped(&sv.Tags, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentMetricsConfiguration(v **types.MetricsConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.MetricsConfiguration\n\tif *v == nil {\n\t\tsv = &types.MetricsConfiguration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Filter\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentMetricsFilter(&sv.Filter, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Id\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Id = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentMetricsConfigurationList(v *[]types.MetricsConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.MetricsConfiguration\n\tif *v == nil {\n\t\tsv = make([]types.MetricsConfiguration, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.MetricsConfiguration\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentMetricsConfiguration(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentMetricsConfigurationListUnwrapped(v *[]types.MetricsConfiguration, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.MetricsConfiguration\n\tif *v == nil {\n\t\tsv = make([]types.MetricsConfiguration, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.MetricsConfiguration\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentMetricsConfiguration(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentMetricsFilter(v *types.MetricsFilter, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar uv types.MetricsFilter\n\tvar memberFound bool\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tif memberFound {\n\t\t\tif err = decoder.Decoder.Skip(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"AccessPointArn\", t.Name.Local):\n\t\t\tvar mv string\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tmv = xtv\n\t\t\t}\n\t\t\tuv = &types.MetricsFilterMemberAccessPointArn{Value: mv}\n\t\t\tmemberFound = true\n\n\t\tcase strings.EqualFold(\"And\", t.Name.Local):\n\t\t\tvar mv types.MetricsAndOperator\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &mv\n\t\t\tif err := awsRestxml_deserializeDocumentMetricsAndOperator(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tmv = *destAddr\n\t\t\tuv = &types.MetricsFilterMemberAnd{Value: mv}\n\t\t\tmemberFound = true\n\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tvar mv string\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tmv = xtv\n\t\t\t}\n\t\t\tuv = &types.MetricsFilterMemberPrefix{Value: mv}\n\t\t\tmemberFound = true\n\n\t\tcase strings.EqualFold(\"Tag\", t.Name.Local):\n\t\t\tvar mv types.Tag\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &mv\n\t\t\tif err := awsRestxml_deserializeDocumentTag(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tmv = *destAddr\n\t\t\tuv = &types.MetricsFilterMemberTag{Value: mv}\n\t\t\tmemberFound = true\n\n\t\tdefault:\n\t\t\tuv = &types.UnknownUnionMember{Tag: t.Name.Local}\n\t\t\tmemberFound = true\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = uv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentMultipartUpload(v **types.MultipartUpload, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.MultipartUpload\n\tif *v == nil {\n\t\tsv = &types.MultipartUpload{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ChecksumAlgorithm\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumAlgorithm = types.ChecksumAlgorithm(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumType\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumType = types.ChecksumType(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Initiated\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tt, err := smithytime.ParseDateTime(xtv)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.Initiated = ptr.Time(t)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Initiator\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentInitiator(&sv.Initiator, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Key\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Key = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Owner\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentOwner(&sv.Owner, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"StorageClass\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.StorageClass = types.StorageClass(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"UploadId\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.UploadId = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentMultipartUploadList(v *[]types.MultipartUpload, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.MultipartUpload\n\tif *v == nil {\n\t\tsv = make([]types.MultipartUpload, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.MultipartUpload\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentMultipartUpload(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentMultipartUploadListUnwrapped(v *[]types.MultipartUpload, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.MultipartUpload\n\tif *v == nil {\n\t\tsv = make([]types.MultipartUpload, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.MultipartUpload\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentMultipartUpload(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentNoncurrentVersionExpiration(v **types.NoncurrentVersionExpiration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.NoncurrentVersionExpiration\n\tif *v == nil {\n\t\tsv = &types.NoncurrentVersionExpiration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"NewerNoncurrentVersions\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.NewerNoncurrentVersions = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"NoncurrentDays\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.NoncurrentDays = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentNoncurrentVersionTransition(v **types.NoncurrentVersionTransition, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.NoncurrentVersionTransition\n\tif *v == nil {\n\t\tsv = &types.NoncurrentVersionTransition{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"NewerNoncurrentVersions\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.NewerNoncurrentVersions = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"NoncurrentDays\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.NoncurrentDays = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"StorageClass\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.StorageClass = types.TransitionStorageClass(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentNoncurrentVersionTransitionList(v *[]types.NoncurrentVersionTransition, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.NoncurrentVersionTransition\n\tif *v == nil {\n\t\tsv = make([]types.NoncurrentVersionTransition, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.NoncurrentVersionTransition\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentNoncurrentVersionTransition(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentNoncurrentVersionTransitionListUnwrapped(v *[]types.NoncurrentVersionTransition, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.NoncurrentVersionTransition\n\tif *v == nil {\n\t\tsv = make([]types.NoncurrentVersionTransition, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.NoncurrentVersionTransition\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentNoncurrentVersionTransition(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentNoSuchBucket(v **types.NoSuchBucket, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.NoSuchBucket\n\tif *v == nil {\n\t\tsv = &types.NoSuchBucket{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentNoSuchKey(v **types.NoSuchKey, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.NoSuchKey\n\tif *v == nil {\n\t\tsv = &types.NoSuchKey{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentNoSuchUpload(v **types.NoSuchUpload, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.NoSuchUpload\n\tif *v == nil {\n\t\tsv = &types.NoSuchUpload{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentNotFound(v **types.NotFound, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.NotFound\n\tif *v == nil {\n\t\tsv = &types.NotFound{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentNotificationConfigurationFilter(v **types.NotificationConfigurationFilter, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.NotificationConfigurationFilter\n\tif *v == nil {\n\t\tsv = &types.NotificationConfigurationFilter{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"S3Key\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentS3KeyFilter(&sv.Key, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentObject(v **types.Object, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.Object\n\tif *v == nil {\n\t\tsv = &types.Object{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ChecksumAlgorithm\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentChecksumAlgorithmListUnwrapped(&sv.ChecksumAlgorithm, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumType\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumType = types.ChecksumType(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ETag\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ETag = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Key\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Key = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"LastModified\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tt, err := smithytime.ParseDateTime(xtv)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.LastModified = ptr.Time(t)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Owner\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentOwner(&sv.Owner, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"RestoreStatus\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentRestoreStatus(&sv.RestoreStatus, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Size\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.Size = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"StorageClass\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.StorageClass = types.ObjectStorageClass(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentObjectAlreadyInActiveTierError(v **types.ObjectAlreadyInActiveTierError, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ObjectAlreadyInActiveTierError\n\tif *v == nil {\n\t\tsv = &types.ObjectAlreadyInActiveTierError{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentObjectList(v *[]types.Object, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.Object\n\tif *v == nil {\n\t\tsv = make([]types.Object, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.Object\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentObject(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentObjectListUnwrapped(v *[]types.Object, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.Object\n\tif *v == nil {\n\t\tsv = make([]types.Object, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.Object\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentObject(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentObjectLockConfiguration(v **types.ObjectLockConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ObjectLockConfiguration\n\tif *v == nil {\n\t\tsv = &types.ObjectLockConfiguration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ObjectLockEnabled\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ObjectLockEnabled = types.ObjectLockEnabled(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Rule\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentObjectLockRule(&sv.Rule, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentObjectLockLegalHold(v **types.ObjectLockLegalHold, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ObjectLockLegalHold\n\tif *v == nil {\n\t\tsv = &types.ObjectLockLegalHold{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Status\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Status = types.ObjectLockLegalHoldStatus(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentObjectLockRetention(v **types.ObjectLockRetention, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ObjectLockRetention\n\tif *v == nil {\n\t\tsv = &types.ObjectLockRetention{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Mode\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Mode = types.ObjectLockRetentionMode(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"RetainUntilDate\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tt, err := smithytime.ParseDateTime(xtv)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.RetainUntilDate = ptr.Time(t)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentObjectLockRule(v **types.ObjectLockRule, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ObjectLockRule\n\tif *v == nil {\n\t\tsv = &types.ObjectLockRule{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"DefaultRetention\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentDefaultRetention(&sv.DefaultRetention, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentObjectNotInActiveTierError(v **types.ObjectNotInActiveTierError, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ObjectNotInActiveTierError\n\tif *v == nil {\n\t\tsv = &types.ObjectNotInActiveTierError{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentObjectPart(v **types.ObjectPart, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ObjectPart\n\tif *v == nil {\n\t\tsv = &types.ObjectPart{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ChecksumCRC32\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumCRC32 = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumCRC32C\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumCRC32C = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumCRC64NVME\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumCRC64NVME = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumSHA1\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumSHA1 = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumSHA256\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumSHA256 = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"PartNumber\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.PartNumber = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Size\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.Size = ptr.Int64(i64)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentObjectVersion(v **types.ObjectVersion, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ObjectVersion\n\tif *v == nil {\n\t\tsv = &types.ObjectVersion{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ChecksumAlgorithm\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentChecksumAlgorithmListUnwrapped(&sv.ChecksumAlgorithm, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumType\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumType = types.ChecksumType(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ETag\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ETag = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"IsLatest\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected IsLatest to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.IsLatest = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Key\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Key = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"LastModified\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tt, err := smithytime.ParseDateTime(xtv)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.LastModified = ptr.Time(t)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Owner\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentOwner(&sv.Owner, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"RestoreStatus\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentRestoreStatus(&sv.RestoreStatus, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Size\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.Size = ptr.Int64(i64)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"StorageClass\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.StorageClass = types.ObjectVersionStorageClass(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"VersionId\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.VersionId = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentObjectVersionList(v *[]types.ObjectVersion, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.ObjectVersion\n\tif *v == nil {\n\t\tsv = make([]types.ObjectVersion, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.ObjectVersion\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentObjectVersion(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentObjectVersionListUnwrapped(v *[]types.ObjectVersion, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.ObjectVersion\n\tif *v == nil {\n\t\tsv = make([]types.ObjectVersion, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.ObjectVersion\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentObjectVersion(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentOwner(v **types.Owner, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.Owner\n\tif *v == nil {\n\t\tsv = &types.Owner{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"DisplayName\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.DisplayName = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ID\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ID = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentOwnershipControls(v **types.OwnershipControls, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.OwnershipControls\n\tif *v == nil {\n\t\tsv = &types.OwnershipControls{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Rule\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentOwnershipControlsRulesUnwrapped(&sv.Rules, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentOwnershipControlsRule(v **types.OwnershipControlsRule, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.OwnershipControlsRule\n\tif *v == nil {\n\t\tsv = &types.OwnershipControlsRule{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ObjectOwnership\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ObjectOwnership = types.ObjectOwnership(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentOwnershipControlsRules(v *[]types.OwnershipControlsRule, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.OwnershipControlsRule\n\tif *v == nil {\n\t\tsv = make([]types.OwnershipControlsRule, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.OwnershipControlsRule\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentOwnershipControlsRule(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentOwnershipControlsRulesUnwrapped(v *[]types.OwnershipControlsRule, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.OwnershipControlsRule\n\tif *v == nil {\n\t\tsv = make([]types.OwnershipControlsRule, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.OwnershipControlsRule\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentOwnershipControlsRule(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentPart(v **types.Part, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.Part\n\tif *v == nil {\n\t\tsv = &types.Part{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ChecksumCRC32\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumCRC32 = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumCRC32C\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumCRC32C = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumCRC64NVME\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumCRC64NVME = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumSHA1\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumSHA1 = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ChecksumSHA256\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ChecksumSHA256 = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ETag\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ETag = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"LastModified\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tt, err := smithytime.ParseDateTime(xtv)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.LastModified = ptr.Time(t)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"PartNumber\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.PartNumber = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Size\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.Size = ptr.Int64(i64)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentPartitionedPrefix(v **types.PartitionedPrefix, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.PartitionedPrefix\n\tif *v == nil {\n\t\tsv = &types.PartitionedPrefix{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"PartitionDateSource\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.PartitionDateSource = types.PartitionDateSource(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentParts(v *[]types.Part, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.Part\n\tif *v == nil {\n\t\tsv = make([]types.Part, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.Part\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentPart(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentPartsUnwrapped(v *[]types.Part, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.Part\n\tif *v == nil {\n\t\tsv = make([]types.Part, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.Part\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentPart(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentPartsList(v *[]types.ObjectPart, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.ObjectPart\n\tif *v == nil {\n\t\tsv = make([]types.ObjectPart, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.ObjectPart\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentObjectPart(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentPartsListUnwrapped(v *[]types.ObjectPart, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.ObjectPart\n\tif *v == nil {\n\t\tsv = make([]types.ObjectPart, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.ObjectPart\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentObjectPart(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentPolicyStatus(v **types.PolicyStatus, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.PolicyStatus\n\tif *v == nil {\n\t\tsv = &types.PolicyStatus{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"IsPublic\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected IsPublic to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.IsPublic = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentPublicAccessBlockConfiguration(v **types.PublicAccessBlockConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.PublicAccessBlockConfiguration\n\tif *v == nil {\n\t\tsv = &types.PublicAccessBlockConfiguration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"BlockPublicAcls\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected Setting to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.BlockPublicAcls = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"BlockPublicPolicy\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected Setting to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.BlockPublicPolicy = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"IgnorePublicAcls\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected Setting to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.IgnorePublicAcls = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"RestrictPublicBuckets\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected Setting to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.RestrictPublicBuckets = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentQueueConfiguration(v **types.QueueConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.QueueConfiguration\n\tif *v == nil {\n\t\tsv = &types.QueueConfiguration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Event\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentEventListUnwrapped(&sv.Events, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Filter\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentNotificationConfigurationFilter(&sv.Filter, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Id\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Id = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Queue\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.QueueArn = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentQueueConfigurationList(v *[]types.QueueConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.QueueConfiguration\n\tif *v == nil {\n\t\tsv = make([]types.QueueConfiguration, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.QueueConfiguration\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentQueueConfiguration(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentQueueConfigurationListUnwrapped(v *[]types.QueueConfiguration, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.QueueConfiguration\n\tif *v == nil {\n\t\tsv = make([]types.QueueConfiguration, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.QueueConfiguration\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentQueueConfiguration(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentRedirect(v **types.Redirect, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.Redirect\n\tif *v == nil {\n\t\tsv = &types.Redirect{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"HostName\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.HostName = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"HttpRedirectCode\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.HttpRedirectCode = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Protocol\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Protocol = types.Protocol(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ReplaceKeyPrefixWith\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ReplaceKeyPrefixWith = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ReplaceKeyWith\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ReplaceKeyWith = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentRedirectAllRequestsTo(v **types.RedirectAllRequestsTo, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.RedirectAllRequestsTo\n\tif *v == nil {\n\t\tsv = &types.RedirectAllRequestsTo{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"HostName\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.HostName = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Protocol\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Protocol = types.Protocol(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentReplicaModifications(v **types.ReplicaModifications, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ReplicaModifications\n\tif *v == nil {\n\t\tsv = &types.ReplicaModifications{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Status\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Status = types.ReplicaModificationsStatus(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentReplicationConfiguration(v **types.ReplicationConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ReplicationConfiguration\n\tif *v == nil {\n\t\tsv = &types.ReplicationConfiguration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Role\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Role = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Rule\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentReplicationRulesUnwrapped(&sv.Rules, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentReplicationRule(v **types.ReplicationRule, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ReplicationRule\n\tif *v == nil {\n\t\tsv = &types.ReplicationRule{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"DeleteMarkerReplication\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentDeleteMarkerReplication(&sv.DeleteMarkerReplication, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Destination\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentDestination(&sv.Destination, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ExistingObjectReplication\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentExistingObjectReplication(&sv.ExistingObjectReplication, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Filter\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentReplicationRuleFilter(&sv.Filter, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"ID\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.ID = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Priority\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.Priority = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"SourceSelectionCriteria\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentSourceSelectionCriteria(&sv.SourceSelectionCriteria, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Status\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Status = types.ReplicationRuleStatus(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentReplicationRuleAndOperator(v **types.ReplicationRuleAndOperator, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ReplicationRuleAndOperator\n\tif *v == nil {\n\t\tsv = &types.ReplicationRuleAndOperator{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Tag\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentTagSetUnwrapped(&sv.Tags, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentReplicationRuleFilter(v **types.ReplicationRuleFilter, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ReplicationRuleFilter\n\tif *v == nil {\n\t\tsv = &types.ReplicationRuleFilter{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"And\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentReplicationRuleAndOperator(&sv.And, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Prefix\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Prefix = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Tag\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentTag(&sv.Tag, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentReplicationRules(v *[]types.ReplicationRule, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.ReplicationRule\n\tif *v == nil {\n\t\tsv = make([]types.ReplicationRule, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.ReplicationRule\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentReplicationRule(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentReplicationRulesUnwrapped(v *[]types.ReplicationRule, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.ReplicationRule\n\tif *v == nil {\n\t\tsv = make([]types.ReplicationRule, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.ReplicationRule\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentReplicationRule(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentReplicationTime(v **types.ReplicationTime, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ReplicationTime\n\tif *v == nil {\n\t\tsv = &types.ReplicationTime{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Status\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Status = types.ReplicationTimeStatus(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Time\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentReplicationTimeValue(&sv.Time, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentReplicationTimeValue(v **types.ReplicationTimeValue, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ReplicationTimeValue\n\tif *v == nil {\n\t\tsv = &types.ReplicationTimeValue{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Minutes\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.Minutes = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentRestoreStatus(v **types.RestoreStatus, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.RestoreStatus\n\tif *v == nil {\n\t\tsv = &types.RestoreStatus{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"IsRestoreInProgress\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected IsRestoreInProgress to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.IsRestoreInProgress = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"RestoreExpiryDate\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tt, err := smithytime.ParseDateTime(xtv)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.RestoreExpiryDate = ptr.Time(t)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentRoutingRule(v **types.RoutingRule, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.RoutingRule\n\tif *v == nil {\n\t\tsv = &types.RoutingRule{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Condition\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentCondition(&sv.Condition, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Redirect\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentRedirect(&sv.Redirect, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentRoutingRules(v *[]types.RoutingRule, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.RoutingRule\n\tif *v == nil {\n\t\tsv = make([]types.RoutingRule, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"RoutingRule\", t.Name.Local):\n\t\t\tvar col types.RoutingRule\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentRoutingRule(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentRoutingRulesUnwrapped(v *[]types.RoutingRule, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.RoutingRule\n\tif *v == nil {\n\t\tsv = make([]types.RoutingRule, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.RoutingRule\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentRoutingRule(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentS3KeyFilter(v **types.S3KeyFilter, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.S3KeyFilter\n\tif *v == nil {\n\t\tsv = &types.S3KeyFilter{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"FilterRule\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentFilterRuleListUnwrapped(&sv.FilterRules, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentS3TablesDestinationResult(v **types.S3TablesDestinationResult, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.S3TablesDestinationResult\n\tif *v == nil {\n\t\tsv = &types.S3TablesDestinationResult{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"TableArn\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.TableArn = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"TableBucketArn\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.TableBucketArn = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"TableName\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.TableName = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"TableNamespace\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.TableNamespace = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentServerSideEncryptionByDefault(v **types.ServerSideEncryptionByDefault, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ServerSideEncryptionByDefault\n\tif *v == nil {\n\t\tsv = &types.ServerSideEncryptionByDefault{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"KMSMasterKeyID\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.KMSMasterKeyID = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"SSEAlgorithm\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.SSEAlgorithm = types.ServerSideEncryption(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentServerSideEncryptionConfiguration(v **types.ServerSideEncryptionConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ServerSideEncryptionConfiguration\n\tif *v == nil {\n\t\tsv = &types.ServerSideEncryptionConfiguration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Rule\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentServerSideEncryptionRulesUnwrapped(&sv.Rules, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentServerSideEncryptionRule(v **types.ServerSideEncryptionRule, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.ServerSideEncryptionRule\n\tif *v == nil {\n\t\tsv = &types.ServerSideEncryptionRule{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ApplyServerSideEncryptionByDefault\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentServerSideEncryptionByDefault(&sv.ApplyServerSideEncryptionByDefault, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"BucketKeyEnabled\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv, err := strconv.ParseBool(string(val))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"expected BucketKeyEnabled to be of type *bool, got %T instead\", val)\n\t\t\t\t}\n\t\t\t\tsv.BucketKeyEnabled = ptr.Bool(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentServerSideEncryptionRules(v *[]types.ServerSideEncryptionRule, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.ServerSideEncryptionRule\n\tif *v == nil {\n\t\tsv = make([]types.ServerSideEncryptionRule, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.ServerSideEncryptionRule\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentServerSideEncryptionRule(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentServerSideEncryptionRulesUnwrapped(v *[]types.ServerSideEncryptionRule, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.ServerSideEncryptionRule\n\tif *v == nil {\n\t\tsv = make([]types.ServerSideEncryptionRule, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.ServerSideEncryptionRule\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentServerSideEncryptionRule(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentSessionCredentials(v **types.SessionCredentials, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.SessionCredentials\n\tif *v == nil {\n\t\tsv = &types.SessionCredentials{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"AccessKeyId\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.AccessKeyId = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Expiration\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tt, err := smithytime.ParseDateTime(xtv)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.Expiration = ptr.Time(t)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"SecretAccessKey\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.SecretAccessKey = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"SessionToken\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.SessionToken = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentSimplePrefix(v **types.SimplePrefix, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.SimplePrefix\n\tif *v == nil {\n\t\tsv = &types.SimplePrefix{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentSourceSelectionCriteria(v **types.SourceSelectionCriteria, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.SourceSelectionCriteria\n\tif *v == nil {\n\t\tsv = &types.SourceSelectionCriteria{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"ReplicaModifications\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentReplicaModifications(&sv.ReplicaModifications, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"SseKmsEncryptedObjects\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentSseKmsEncryptedObjects(&sv.SseKmsEncryptedObjects, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentSSEKMS(v **types.SSEKMS, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.SSEKMS\n\tif *v == nil {\n\t\tsv = &types.SSEKMS{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"KeyId\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.KeyId = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentSseKmsEncryptedObjects(v **types.SseKmsEncryptedObjects, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.SseKmsEncryptedObjects\n\tif *v == nil {\n\t\tsv = &types.SseKmsEncryptedObjects{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Status\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Status = types.SseKmsEncryptedObjectsStatus(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentSSES3(v **types.SSES3, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.SSES3\n\tif *v == nil {\n\t\tsv = &types.SSES3{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentStorageClassAnalysis(v **types.StorageClassAnalysis, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.StorageClassAnalysis\n\tif *v == nil {\n\t\tsv = &types.StorageClassAnalysis{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"DataExport\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentStorageClassAnalysisDataExport(&sv.DataExport, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentStorageClassAnalysisDataExport(v **types.StorageClassAnalysisDataExport, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.StorageClassAnalysisDataExport\n\tif *v == nil {\n\t\tsv = &types.StorageClassAnalysisDataExport{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Destination\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentAnalyticsExportDestination(&sv.Destination, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"OutputSchemaVersion\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.OutputSchemaVersion = types.StorageClassAnalysisSchemaVersion(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentTag(v **types.Tag, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.Tag\n\tif *v == nil {\n\t\tsv = &types.Tag{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Key\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Key = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Value\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Value = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentTagSet(v *[]types.Tag, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.Tag\n\tif *v == nil {\n\t\tsv = make([]types.Tag, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Tag\", t.Name.Local):\n\t\t\tvar col types.Tag\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentTag(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentTagSetUnwrapped(v *[]types.Tag, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.Tag\n\tif *v == nil {\n\t\tsv = make([]types.Tag, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.Tag\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentTag(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentTargetGrant(v **types.TargetGrant, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.TargetGrant\n\tif *v == nil {\n\t\tsv = &types.TargetGrant{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Grantee\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentGrantee(&sv.Grantee, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Permission\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Permission = types.BucketLogsPermission(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentTargetGrants(v *[]types.TargetGrant, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.TargetGrant\n\tif *v == nil {\n\t\tsv = make([]types.TargetGrant, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Grant\", t.Name.Local):\n\t\t\tvar col types.TargetGrant\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentTargetGrant(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentTargetGrantsUnwrapped(v *[]types.TargetGrant, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.TargetGrant\n\tif *v == nil {\n\t\tsv = make([]types.TargetGrant, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.TargetGrant\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentTargetGrant(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentTargetObjectKeyFormat(v **types.TargetObjectKeyFormat, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.TargetObjectKeyFormat\n\tif *v == nil {\n\t\tsv = &types.TargetObjectKeyFormat{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"PartitionedPrefix\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentPartitionedPrefix(&sv.PartitionedPrefix, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"SimplePrefix\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentSimplePrefix(&sv.SimplePrefix, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentTiering(v **types.Tiering, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.Tiering\n\tif *v == nil {\n\t\tsv = &types.Tiering{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"AccessTier\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.AccessTier = types.IntelligentTieringAccessTier(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Days\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.Days = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentTieringList(v *[]types.Tiering, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.Tiering\n\tif *v == nil {\n\t\tsv = make([]types.Tiering, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.Tiering\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentTiering(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentTieringListUnwrapped(v *[]types.Tiering, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.Tiering\n\tif *v == nil {\n\t\tsv = make([]types.Tiering, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.Tiering\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentTiering(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentTooManyParts(v **types.TooManyParts, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.TooManyParts\n\tif *v == nil {\n\t\tsv = &types.TooManyParts{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentTopicConfiguration(v **types.TopicConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.TopicConfiguration\n\tif *v == nil {\n\t\tsv = &types.TopicConfiguration{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Event\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentEventListUnwrapped(&sv.Events, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Filter\", t.Name.Local):\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tif err := awsRestxml_deserializeDocumentNotificationConfigurationFilter(&sv.Filter, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Id\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.Id = ptr.String(xtv)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Topic\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.TopicArn = ptr.String(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentTopicConfigurationList(v *[]types.TopicConfiguration, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.TopicConfiguration\n\tif *v == nil {\n\t\tsv = make([]types.TopicConfiguration, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.TopicConfiguration\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentTopicConfiguration(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentTopicConfigurationListUnwrapped(v *[]types.TopicConfiguration, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.TopicConfiguration\n\tif *v == nil {\n\t\tsv = make([]types.TopicConfiguration, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.TopicConfiguration\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentTopicConfiguration(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\nfunc awsRestxml_deserializeDocumentTransition(v **types.Transition, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv *types.Transition\n\tif *v == nil {\n\t\tsv = &types.Transition{}\n\t} else {\n\t\tsv = *v\n\t}\n\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\toriginalDecoder := decoder\n\t\tdecoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t)\n\t\tswitch {\n\t\tcase strings.EqualFold(\"Date\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tt, err := smithytime.ParseDateTime(xtv)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.Date = ptr.Time(t)\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"Days\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\ti64, err := strconv.ParseInt(xtv, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsv.Days = ptr.Int32(int32(i64))\n\t\t\t}\n\n\t\tcase strings.EqualFold(\"StorageClass\", t.Name.Local):\n\t\t\tval, err := decoder.Value()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif val == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t{\n\t\t\t\txtv := string(val)\n\t\t\t\tsv.StorageClass = types.TransitionStorageClass(xtv)\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// Do nothing and ignore the unexpected tag element\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentTransitionList(v *[]types.Transition, decoder smithyxml.NodeDecoder) error {\n\tif v == nil {\n\t\treturn fmt.Errorf(\"unexpected nil of type %T\", v)\n\t}\n\tvar sv []types.Transition\n\tif *v == nil {\n\t\tsv = make([]types.Transition, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\toriginalDecoder := decoder\n\tfor {\n\t\tt, done, err := decoder.Token()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif done {\n\t\t\tbreak\n\t\t}\n\t\tswitch {\n\t\tcase strings.EqualFold(\"member\", t.Name.Local):\n\t\t\tvar col types.Transition\n\t\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\t\tdestAddr := &col\n\t\t\tif err := awsRestxml_deserializeDocumentTransition(&destAddr, nodeDecoder); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcol = *destAddr\n\t\t\tsv = append(sv, col)\n\n\t\tdefault:\n\t\t\terr = decoder.Decoder.Skip()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t}\n\t\tdecoder = originalDecoder\n\t}\n\t*v = sv\n\treturn nil\n}\n\nfunc awsRestxml_deserializeDocumentTransitionListUnwrapped(v *[]types.Transition, decoder smithyxml.NodeDecoder) error {\n\tvar sv []types.Transition\n\tif *v == nil {\n\t\tsv = make([]types.Transition, 0)\n\t} else {\n\t\tsv = *v\n\t}\n\n\tswitch {\n\tdefault:\n\t\tvar mv types.Transition\n\t\tt := decoder.StartEl\n\t\t_ = t\n\t\tnodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t)\n\t\tdestAddr := &mv\n\t\tif err := awsRestxml_deserializeDocumentTransition(&destAddr, nodeDecoder); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmv = *destAddr\n\t\tsv = append(sv, mv)\n\t}\n\t*v = sv\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/doc.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\n// Package s3 provides the API client, operations, and parameter types for Amazon\n// Simple Storage Service.\npackage s3\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/endpoints.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\tawsmiddleware \"github.com/aws/aws-sdk-go-v2/aws/middleware\"\n\tinternalConfig \"github.com/aws/aws-sdk-go-v2/internal/configsources\"\n\tinternalcontext \"github.com/aws/aws-sdk-go-v2/internal/context\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/endpoints\"\n\t\"github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn\"\n\ts3cust \"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n\tinternalendpoints \"github.com/aws/aws-sdk-go-v2/service/s3/internal/endpoints\"\n\tsmithy \"github.com/aws/smithy-go\"\n\tsmithyauth \"github.com/aws/smithy-go/auth\"\n\tsmithyendpoints \"github.com/aws/smithy-go/endpoints\"\n\t\"github.com/aws/smithy-go/endpoints/private/rulesfn\"\n\t\"github.com/aws/smithy-go/middleware\"\n\t\"github.com/aws/smithy-go/ptr\"\n\t\"github.com/aws/smithy-go/tracing\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"strings\"\n)\n\n// EndpointResolverOptions is the service endpoint resolver options\ntype EndpointResolverOptions = internalendpoints.Options\n\n// EndpointResolver interface for resolving service endpoints.\ntype EndpointResolver interface {\n\tResolveEndpoint(region string, options EndpointResolverOptions) (aws.Endpoint, error)\n}\n\nvar _ EndpointResolver = &internalendpoints.Resolver{}\n\n// NewDefaultEndpointResolver constructs a new service endpoint resolver\nfunc NewDefaultEndpointResolver() *internalendpoints.Resolver {\n\treturn internalendpoints.New()\n}\n\n// EndpointResolverFunc is a helper utility that wraps a function so it satisfies\n// the EndpointResolver interface. This is useful when you want to add additional\n// endpoint resolving logic, or stub out specific endpoints with custom values.\ntype EndpointResolverFunc func(region string, options EndpointResolverOptions) (aws.Endpoint, error)\n\nfunc (fn EndpointResolverFunc) ResolveEndpoint(region string, options EndpointResolverOptions) (endpoint aws.Endpoint, err error) {\n\treturn fn(region, options)\n}\n\n// EndpointResolverFromURL returns an EndpointResolver configured using the\n// provided endpoint url. By default, the resolved endpoint resolver uses the\n// client region as signing region, and the endpoint source is set to\n// EndpointSourceCustom.You can provide functional options to configure endpoint\n// values for the resolved endpoint.\nfunc EndpointResolverFromURL(url string, optFns ...func(*aws.Endpoint)) EndpointResolver {\n\te := aws.Endpoint{URL: url, Source: aws.EndpointSourceCustom}\n\tfor _, fn := range optFns {\n\t\tfn(&e)\n\t}\n\n\treturn EndpointResolverFunc(\n\t\tfunc(region string, options EndpointResolverOptions) (aws.Endpoint, error) {\n\t\t\tif len(e.SigningRegion) == 0 {\n\t\t\t\te.SigningRegion = region\n\t\t\t}\n\t\t\treturn e, nil\n\t\t},\n\t)\n}\n\ntype ResolveEndpoint struct {\n\tResolver EndpointResolver\n\tOptions  EndpointResolverOptions\n}\n\nfunc (*ResolveEndpoint) ID() string {\n\treturn \"ResolveEndpoint\"\n}\n\nfunc (m *ResolveEndpoint) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n) {\n\tif !awsmiddleware.GetRequiresLegacyEndpoints(ctx) {\n\t\treturn next.HandleSerialize(ctx, in)\n\t}\n\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type %T\", in.Request)\n\t}\n\n\tif m.Resolver == nil {\n\t\treturn out, metadata, fmt.Errorf(\"expected endpoint resolver to not be nil\")\n\t}\n\n\teo := m.Options\n\teo.Logger = middleware.GetLogger(ctx)\n\n\tvar endpoint aws.Endpoint\n\tendpoint, err = m.Resolver.ResolveEndpoint(awsmiddleware.GetRegion(ctx), eo)\n\tif err != nil {\n\t\tnf := (&aws.EndpointNotFoundError{})\n\t\tif errors.As(err, &nf) {\n\t\t\tctx = awsmiddleware.SetRequiresLegacyEndpoints(ctx, false)\n\t\t\treturn next.HandleSerialize(ctx, in)\n\t\t}\n\t\treturn out, metadata, fmt.Errorf(\"failed to resolve service endpoint, %w\", err)\n\t}\n\n\treq.URL, err = url.Parse(endpoint.URL)\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"failed to parse endpoint URL: %w\", err)\n\t}\n\n\tif len(awsmiddleware.GetSigningName(ctx)) == 0 {\n\t\tsigningName := endpoint.SigningName\n\t\tif len(signingName) == 0 {\n\t\t\tsigningName = \"s3\"\n\t\t}\n\t\tctx = awsmiddleware.SetSigningName(ctx, signingName)\n\t}\n\tctx = awsmiddleware.SetEndpointSource(ctx, endpoint.Source)\n\tctx = smithyhttp.SetHostnameImmutable(ctx, endpoint.HostnameImmutable)\n\tctx = awsmiddleware.SetSigningRegion(ctx, endpoint.SigningRegion)\n\tctx = awsmiddleware.SetPartitionID(ctx, endpoint.PartitionID)\n\treturn next.HandleSerialize(ctx, in)\n}\nfunc addResolveEndpointMiddleware(stack *middleware.Stack, o Options) error {\n\treturn stack.Serialize.Insert(&ResolveEndpoint{\n\t\tResolver: o.EndpointResolver,\n\t\tOptions:  o.EndpointOptions,\n\t}, \"OperationSerializer\", middleware.Before)\n}\n\nfunc removeResolveEndpointMiddleware(stack *middleware.Stack) error {\n\t_, err := stack.Serialize.Remove((&ResolveEndpoint{}).ID())\n\treturn err\n}\n\ntype wrappedEndpointResolver struct {\n\tawsResolver aws.EndpointResolverWithOptions\n}\n\nfunc (w *wrappedEndpointResolver) ResolveEndpoint(region string, options EndpointResolverOptions) (endpoint aws.Endpoint, err error) {\n\treturn w.awsResolver.ResolveEndpoint(ServiceID, region, options)\n}\n\ntype awsEndpointResolverAdaptor func(service, region string) (aws.Endpoint, error)\n\nfunc (a awsEndpointResolverAdaptor) ResolveEndpoint(service, region string, options ...interface{}) (aws.Endpoint, error) {\n\treturn a(service, region)\n}\n\nvar _ aws.EndpointResolverWithOptions = awsEndpointResolverAdaptor(nil)\n\n// withEndpointResolver returns an aws.EndpointResolverWithOptions that first delegates endpoint resolution to the awsResolver.\n// If awsResolver returns aws.EndpointNotFoundError error, the v1 resolver middleware will swallow the error,\n// and set an appropriate context flag such that fallback will occur when EndpointResolverV2 is invoked\n// via its middleware.\n//\n// If another error (besides aws.EndpointNotFoundError) is returned, then that error will be propagated.\nfunc withEndpointResolver(awsResolver aws.EndpointResolver, awsResolverWithOptions aws.EndpointResolverWithOptions) EndpointResolver {\n\tvar resolver aws.EndpointResolverWithOptions\n\n\tif awsResolverWithOptions != nil {\n\t\tresolver = awsResolverWithOptions\n\t} else if awsResolver != nil {\n\t\tresolver = awsEndpointResolverAdaptor(awsResolver.ResolveEndpoint)\n\t}\n\n\treturn &wrappedEndpointResolver{\n\t\tawsResolver: resolver,\n\t}\n}\n\nfunc finalizeClientEndpointResolverOptions(options *Options) {\n\toptions.EndpointOptions.LogDeprecated = options.ClientLogMode.IsDeprecatedUsage()\n\n\tif len(options.EndpointOptions.ResolvedRegion) == 0 {\n\t\tconst fipsInfix = \"-fips-\"\n\t\tconst fipsPrefix = \"fips-\"\n\t\tconst fipsSuffix = \"-fips\"\n\n\t\tif strings.Contains(options.Region, fipsInfix) ||\n\t\t\tstrings.Contains(options.Region, fipsPrefix) ||\n\t\t\tstrings.Contains(options.Region, fipsSuffix) {\n\t\t\toptions.EndpointOptions.ResolvedRegion = strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(\n\t\t\t\toptions.Region, fipsInfix, \"-\"), fipsPrefix, \"\"), fipsSuffix, \"\")\n\t\t\toptions.EndpointOptions.UseFIPSEndpoint = aws.FIPSEndpointStateEnabled\n\t\t}\n\t}\n\n\tif options.EndpointOptions.UseDualStackEndpoint == aws.DualStackEndpointStateUnset {\n\t\tif options.UseDualstack {\n\t\t\toptions.EndpointOptions.UseDualStackEndpoint = aws.DualStackEndpointStateEnabled\n\t\t} else {\n\t\t\toptions.EndpointOptions.UseDualStackEndpoint = aws.DualStackEndpointStateDisabled\n\t\t}\n\t}\n\n}\n\nfunc resolveEndpointResolverV2(options *Options) {\n\tif options.EndpointResolverV2 == nil {\n\t\toptions.EndpointResolverV2 = NewDefaultEndpointResolverV2()\n\t}\n}\n\nfunc resolveBaseEndpoint(cfg aws.Config, o *Options) {\n\tif cfg.BaseEndpoint != nil {\n\t\to.BaseEndpoint = cfg.BaseEndpoint\n\t}\n\n\t_, g := os.LookupEnv(\"AWS_ENDPOINT_URL\")\n\t_, s := os.LookupEnv(\"AWS_ENDPOINT_URL_S3\")\n\n\tif g && !s {\n\t\treturn\n\t}\n\n\tvalue, found, err := internalConfig.ResolveServiceBaseEndpoint(context.Background(), \"S3\", cfg.ConfigSources)\n\tif found && err == nil {\n\t\to.BaseEndpoint = &value\n\t}\n}\n\nfunc bindRegion(region string) *string {\n\tif region == \"\" {\n\t\treturn nil\n\t}\n\treturn aws.String(endpoints.MapFIPSRegion(region))\n}\n\n// EndpointParameters provides the parameters that influence how endpoints are\n// resolved.\ntype EndpointParameters struct {\n\t// The S3 bucket used to send the request. This is an optional parameter that will\n\t// be set automatically for operations that are scoped to an S3 bucket.\n\t//\n\t// Parameter\n\t// is required.\n\tBucket *string\n\n\t// The AWS region used to dispatch the request.\n\t//\n\t// Parameter is\n\t// required.\n\t//\n\t// AWS::Region\n\tRegion *string\n\n\t// When true, send this request to the FIPS-compliant regional endpoint. If the\n\t// configured endpoint does not have a FIPS compliant endpoint, dispatching the\n\t// request will return an error.\n\t//\n\t// Defaults to false if no value is\n\t// provided.\n\t//\n\t// AWS::UseFIPS\n\tUseFIPS *bool\n\n\t// When true, use the dual-stack endpoint. If the configured endpoint does not\n\t// support dual-stack, dispatching the request MAY return an error.\n\t//\n\t// Defaults to\n\t// false if no value is provided.\n\t//\n\t// AWS::UseDualStack\n\tUseDualStack *bool\n\n\t// Override the endpoint used to send this request\n\t//\n\t// Parameter is\n\t// required.\n\t//\n\t// SDK::Endpoint\n\tEndpoint *string\n\n\t// When true, force a path-style endpoint to be used where the bucket name is part\n\t// of the path.\n\t//\n\t// Defaults to false if no value is\n\t// provided.\n\t//\n\t// AWS::S3::ForcePathStyle\n\tForcePathStyle *bool\n\n\t// When true, use S3 Accelerate. NOTE: Not all regions support S3\n\t// accelerate.\n\t//\n\t// Defaults to false if no value is provided.\n\t//\n\t// AWS::S3::Accelerate\n\tAccelerate *bool\n\n\t// Whether the global endpoint should be used, rather then the regional endpoint\n\t// for us-east-1.\n\t//\n\t// Defaults to false if no value is\n\t// provided.\n\t//\n\t// AWS::S3::UseGlobalEndpoint\n\tUseGlobalEndpoint *bool\n\n\t// Internal parameter to use object lambda endpoint for an operation (eg:\n\t// WriteGetObjectResponse)\n\t//\n\t// Parameter is required.\n\tUseObjectLambdaEndpoint *bool\n\n\t// The S3 Key used to send the request. This is an optional parameter that will be\n\t// set automatically for operations that are scoped to an S3 Key.\n\t//\n\t// Parameter is\n\t// required.\n\tKey *string\n\n\t// The S3 Prefix used to send the request. This is an optional parameter that will\n\t// be set automatically for operations that are scoped to an S3 Prefix.\n\t//\n\t// Parameter\n\t// is required.\n\tPrefix *string\n\n\t// The Copy Source used for Copy Object request. This is an optional parameter that\n\t// will be set automatically for operations that are scoped to Copy\n\t// Source.\n\t//\n\t// Parameter is required.\n\tCopySource *string\n\n\t// Internal parameter to disable Access Point Buckets\n\t//\n\t// Parameter is required.\n\tDisableAccessPoints *bool\n\n\t// Whether multi-region access points (MRAP) should be disabled.\n\t//\n\t// Defaults to false\n\t// if no value is provided.\n\t//\n\t// AWS::S3::DisableMultiRegionAccessPoints\n\tDisableMultiRegionAccessPoints *bool\n\n\t// When an Access Point ARN is provided and this flag is enabled, the SDK MUST use\n\t// the ARN's region when constructing the endpoint instead of the client's\n\t// configured region.\n\t//\n\t// Parameter is required.\n\t//\n\t// AWS::S3::UseArnRegion\n\tUseArnRegion *bool\n\n\t// Internal parameter to indicate whether S3Express operation should use control\n\t// plane, (ex. CreateBucket)\n\t//\n\t// Parameter is required.\n\tUseS3ExpressControlEndpoint *bool\n\n\t// Parameter to indicate whether S3Express session auth should be\n\t// disabled\n\t//\n\t// Parameter is required.\n\tDisableS3ExpressSessionAuth *bool\n}\n\n// ValidateRequired validates required parameters are set.\nfunc (p EndpointParameters) ValidateRequired() error {\n\tif p.Accelerate == nil {\n\t\treturn fmt.Errorf(\"parameter Accelerate is required\")\n\t}\n\n\tif p.DisableMultiRegionAccessPoints == nil {\n\t\treturn fmt.Errorf(\"parameter DisableMultiRegionAccessPoints is required\")\n\t}\n\n\tif p.ForcePathStyle == nil {\n\t\treturn fmt.Errorf(\"parameter ForcePathStyle is required\")\n\t}\n\n\tif p.UseDualStack == nil {\n\t\treturn fmt.Errorf(\"parameter UseDualStack is required\")\n\t}\n\n\tif p.UseFIPS == nil {\n\t\treturn fmt.Errorf(\"parameter UseFIPS is required\")\n\t}\n\n\tif p.UseGlobalEndpoint == nil {\n\t\treturn fmt.Errorf(\"parameter UseGlobalEndpoint is required\")\n\t}\n\n\treturn nil\n}\n\n// WithDefaults returns a shallow copy of EndpointParameterswith default values\n// applied to members where applicable.\nfunc (p EndpointParameters) WithDefaults() EndpointParameters {\n\tif p.Accelerate == nil {\n\t\tp.Accelerate = ptr.Bool(false)\n\t}\n\n\tif p.DisableMultiRegionAccessPoints == nil {\n\t\tp.DisableMultiRegionAccessPoints = ptr.Bool(false)\n\t}\n\n\tif p.ForcePathStyle == nil {\n\t\tp.ForcePathStyle = ptr.Bool(false)\n\t}\n\n\tif p.UseDualStack == nil {\n\t\tp.UseDualStack = ptr.Bool(false)\n\t}\n\n\tif p.UseFIPS == nil {\n\t\tp.UseFIPS = ptr.Bool(false)\n\t}\n\n\tif p.UseGlobalEndpoint == nil {\n\t\tp.UseGlobalEndpoint = ptr.Bool(false)\n\t}\n\treturn p\n}\n\ntype stringSlice []string\n\nfunc (s stringSlice) Get(i int) *string {\n\tif i < 0 || i >= len(s) {\n\t\treturn nil\n\t}\n\n\tv := s[i]\n\treturn &v\n}\n\n// EndpointResolverV2 provides the interface for resolving service endpoints.\ntype EndpointResolverV2 interface {\n\t// ResolveEndpoint attempts to resolve the endpoint with the provided options,\n\t// returning the endpoint if found. Otherwise an error is returned.\n\tResolveEndpoint(ctx context.Context, params EndpointParameters) (\n\t\tsmithyendpoints.Endpoint, error,\n\t)\n}\n\n// resolver provides the implementation for resolving endpoints.\ntype resolver struct{}\n\nfunc NewDefaultEndpointResolverV2() EndpointResolverV2 {\n\treturn &resolver{}\n}\n\n// ResolveEndpoint attempts to resolve the endpoint with the provided options,\n// returning the endpoint if found. Otherwise an error is returned.\nfunc (r *resolver) ResolveEndpoint(\n\tctx context.Context, params EndpointParameters,\n) (\n\tendpoint smithyendpoints.Endpoint, err error,\n) {\n\tparams = params.WithDefaults()\n\tif err = params.ValidateRequired(); err != nil {\n\t\treturn endpoint, fmt.Errorf(\"endpoint parameters are not valid, %w\", err)\n\t}\n\t_UseFIPS := *params.UseFIPS\n\t_UseDualStack := *params.UseDualStack\n\t_ForcePathStyle := *params.ForcePathStyle\n\t_Accelerate := *params.Accelerate\n\t_UseGlobalEndpoint := *params.UseGlobalEndpoint\n\t_DisableMultiRegionAccessPoints := *params.DisableMultiRegionAccessPoints\n\n\tif exprVal := params.Region; exprVal != nil {\n\t\t_Region := *exprVal\n\t\t_ = _Region\n\t\tif _Accelerate == true {\n\t\t\tif _UseFIPS == true {\n\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Accelerate cannot be used with FIPS\")\n\t\t\t}\n\t\t}\n\t\tif _UseDualStack == true {\n\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t_ = _Endpoint\n\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Cannot set dual-stack in combination with a custom endpoint.\")\n\t\t\t}\n\t\t}\n\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t_Endpoint := *exprVal\n\t\t\t_ = _Endpoint\n\t\t\tif _UseFIPS == true {\n\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"A custom endpoint cannot be combined with FIPS\")\n\t\t\t}\n\t\t}\n\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t_Endpoint := *exprVal\n\t\t\t_ = _Endpoint\n\t\t\tif _Accelerate == true {\n\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"A custom endpoint cannot be combined with S3 Accelerate\")\n\t\t\t}\n\t\t}\n\t\tif _UseFIPS == true {\n\t\t\tif exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil {\n\t\t\t\t_partitionResult := *exprVal\n\t\t\t\t_ = _partitionResult\n\t\t\t\tif _partitionResult.Name == \"aws-cn\" {\n\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Partition does not support FIPS\")\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif exprVal := params.Bucket; exprVal != nil {\n\t\t\t_Bucket := *exprVal\n\t\t\t_ = _Bucket\n\t\t\tif exprVal := rulesfn.SubString(_Bucket, 0, 6, true); exprVal != nil {\n\t\t\t\t_bucketSuffix := *exprVal\n\t\t\t\t_ = _bucketSuffix\n\t\t\t\tif _bucketSuffix == \"--x-s3\" {\n\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3Express does not support Dual-stack.\")\n\t\t\t\t\t}\n\t\t\t\t\tif _Accelerate == true {\n\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3Express does not support S3 Accelerate.\")\n\t\t\t\t\t}\n\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\tif exprVal := params.DisableS3ExpressSessionAuth; exprVal != nil {\n\t\t\t\t\t\t\t\t_DisableS3ExpressSessionAuth := *exprVal\n\t\t\t\t\t\t\t\t_ = _DisableS3ExpressSessionAuth\n\t\t\t\t\t\t\t\tif _DisableS3ExpressSessionAuth == true {\n\t\t\t\t\t\t\t\t\tif _url.IsIp == true {\n\t\t\t\t\t\t\t\t\t\t_uri_encoded_bucket := rulesfn.URIEncode(_Bucket)\n\t\t\t\t\t\t\t\t\t\t_ = _uri_encoded_bucket\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif awsrulesfn.IsVirtualHostableS3Bucket(_Bucket, false) {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3Express bucket name is not a valid virtual hostable name.\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _url.IsIp == true {\n\t\t\t\t\t\t\t\t_uri_encoded_bucket := rulesfn.URIEncode(_Bucket)\n\t\t\t\t\t\t\t\t_ = _uri_encoded_bucket\n\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif awsrulesfn.IsVirtualHostableS3Bucket(_Bucket, false) {\n\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3Express bucket name is not a valid virtual hostable name.\")\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif exprVal := params.UseS3ExpressControlEndpoint; exprVal != nil {\n\t\t\t\t\t\t_UseS3ExpressControlEndpoint := *exprVal\n\t\t\t\t\t\t_ = _UseS3ExpressControlEndpoint\n\t\t\t\t\t\tif _UseS3ExpressControlEndpoint == true {\n\t\t\t\t\t\t\tif exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil {\n\t\t\t\t\t\t\t\t_partitionResult := *exprVal\n\t\t\t\t\t\t\t\t_ = _partitionResult\n\t\t\t\t\t\t\t\t_uri_encoded_bucket := rulesfn.URIEncode(_Bucket)\n\t\t\t\t\t\t\t\t_ = _uri_encoded_bucket\n\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3express-control-fips.\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3express-control.\")\n\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif awsrulesfn.IsVirtualHostableS3Bucket(_Bucket, false) {\n\t\t\t\t\t\tif exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil {\n\t\t\t\t\t\t\t_partitionResult := *exprVal\n\t\t\t\t\t\t\t_ = _partitionResult\n\t\t\t\t\t\t\tif exprVal := params.DisableS3ExpressSessionAuth; exprVal != nil {\n\t\t\t\t\t\t\t\t_DisableS3ExpressSessionAuth := *exprVal\n\t\t\t\t\t\t\t\t_ = _DisableS3ExpressSessionAuth\n\t\t\t\t\t\t\t\tif _DisableS3ExpressSessionAuth == true {\n\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 6, 14, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 14, 16, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 6, 15, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 15, 17, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 6, 19, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 19, 21, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 6, 20, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 20, 22, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 6, 26, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 26, 28, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Unrecognized S3Express bucket name format.\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 6, 14, true); exprVal != nil {\n\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 14, 16, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 6, 15, true); exprVal != nil {\n\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 15, 17, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 6, 19, true); exprVal != nil {\n\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 19, 21, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 6, 20, true); exprVal != nil {\n\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 20, 22, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 6, 26, true); exprVal != nil {\n\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 26, 28, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Unrecognized S3Express bucket name format.\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t\t}\n\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3Express bucket name is not a valid virtual hostable name.\")\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif exprVal := params.Bucket; exprVal != nil {\n\t\t\t_Bucket := *exprVal\n\t\t\t_ = _Bucket\n\t\t\tif exprVal := rulesfn.SubString(_Bucket, 0, 7, true); exprVal != nil {\n\t\t\t\t_accessPointSuffix := *exprVal\n\t\t\t\t_ = _accessPointSuffix\n\t\t\t\tif _accessPointSuffix == \"--xa-s3\" {\n\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3Express does not support Dual-stack.\")\n\t\t\t\t\t}\n\t\t\t\t\tif _Accelerate == true {\n\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3Express does not support S3 Accelerate.\")\n\t\t\t\t\t}\n\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\tif exprVal := params.DisableS3ExpressSessionAuth; exprVal != nil {\n\t\t\t\t\t\t\t\t_DisableS3ExpressSessionAuth := *exprVal\n\t\t\t\t\t\t\t\t_ = _DisableS3ExpressSessionAuth\n\t\t\t\t\t\t\t\tif _DisableS3ExpressSessionAuth == true {\n\t\t\t\t\t\t\t\t\tif _url.IsIp == true {\n\t\t\t\t\t\t\t\t\t\t_uri_encoded_bucket := rulesfn.URIEncode(_Bucket)\n\t\t\t\t\t\t\t\t\t\t_ = _uri_encoded_bucket\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif awsrulesfn.IsVirtualHostableS3Bucket(_Bucket, false) {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3Express bucket name is not a valid virtual hostable name.\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _url.IsIp == true {\n\t\t\t\t\t\t\t\t_uri_encoded_bucket := rulesfn.URIEncode(_Bucket)\n\t\t\t\t\t\t\t\t_ = _uri_encoded_bucket\n\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif awsrulesfn.IsVirtualHostableS3Bucket(_Bucket, false) {\n\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3Express bucket name is not a valid virtual hostable name.\")\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif awsrulesfn.IsVirtualHostableS3Bucket(_Bucket, false) {\n\t\t\t\t\t\tif exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil {\n\t\t\t\t\t\t\t_partitionResult := *exprVal\n\t\t\t\t\t\t\t_ = _partitionResult\n\t\t\t\t\t\t\tif exprVal := params.DisableS3ExpressSessionAuth; exprVal != nil {\n\t\t\t\t\t\t\t\t_DisableS3ExpressSessionAuth := *exprVal\n\t\t\t\t\t\t\t\t_ = _DisableS3ExpressSessionAuth\n\t\t\t\t\t\t\t\tif _DisableS3ExpressSessionAuth == true {\n\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 7, 15, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 15, 17, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 7, 16, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 16, 18, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 7, 20, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 20, 22, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 7, 21, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 21, 23, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 7, 27, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 27, 29, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Unrecognized S3Express bucket name format.\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 7, 15, true); exprVal != nil {\n\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 15, 17, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 7, 16, true); exprVal != nil {\n\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 16, 18, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 7, 20, true); exprVal != nil {\n\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 20, 22, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 7, 21, true); exprVal != nil {\n\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 21, 23, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 7, 27, true); exprVal != nil {\n\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneId := *exprVal\n\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneId\n\t\t\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 27, 29, true); exprVal != nil {\n\t\t\t\t\t\t\t\t\t_s3expressAvailabilityZoneDelim := *exprVal\n\t\t\t\t\t\t\t\t\t_ = _s3expressAvailabilityZoneDelim\n\t\t\t\t\t\t\t\t\tif _s3expressAvailabilityZoneDelim == \"--\" {\n\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-fips-\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3express-\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_s3expressAvailabilityZoneId)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"sigv4-s3express\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Unrecognized S3Express bucket name format.\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t\t}\n\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3Express bucket name is not a valid virtual hostable name.\")\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif !(params.Bucket != nil) {\n\t\t\tif exprVal := params.UseS3ExpressControlEndpoint; exprVal != nil {\n\t\t\t\t_UseS3ExpressControlEndpoint := *exprVal\n\t\t\t\t_ = _UseS3ExpressControlEndpoint\n\t\t\t\tif _UseS3ExpressControlEndpoint == true {\n\t\t\t\t\tif exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil {\n\t\t\t\t\t\t_partitionResult := *exprVal\n\t\t\t\t\t\t_ = _partitionResult\n\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\tout.WriteString(\"https://s3express-control-fips.\")\n\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t}\n\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\tout.WriteString(\"https://s3express-control.\")\n\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t}()\n\n\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\tout.Set(\"backend\", \"S3Express\")\n\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3express\")\n\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3express\")\n\n\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t}, nil\n\t\t\t\t\t}\n\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif exprVal := params.Bucket; exprVal != nil {\n\t\t\t_Bucket := *exprVal\n\t\t\t_ = _Bucket\n\t\t\tif exprVal := rulesfn.SubString(_Bucket, 49, 50, true); exprVal != nil {\n\t\t\t\t_hardwareType := *exprVal\n\t\t\t\t_ = _hardwareType\n\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 8, 12, true); exprVal != nil {\n\t\t\t\t\t_regionPrefix := *exprVal\n\t\t\t\t\t_ = _regionPrefix\n\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 0, 7, true); exprVal != nil {\n\t\t\t\t\t\t_bucketAliasSuffix := *exprVal\n\t\t\t\t\t\t_ = _bucketAliasSuffix\n\t\t\t\t\t\tif exprVal := rulesfn.SubString(_Bucket, 32, 49, true); exprVal != nil {\n\t\t\t\t\t\t\t_outpostId := *exprVal\n\t\t\t\t\t\t\t_ = _outpostId\n\t\t\t\t\t\t\tif exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil {\n\t\t\t\t\t\t\t\t_regionPartition := *exprVal\n\t\t\t\t\t\t\t\t_ = _regionPartition\n\t\t\t\t\t\t\t\tif _bucketAliasSuffix == \"--op-s3\" {\n\t\t\t\t\t\t\t\t\tif rulesfn.IsValidHostLabel(_outpostId, false) {\n\t\t\t\t\t\t\t\t\t\tif _hardwareType == \"e\" {\n\t\t\t\t\t\t\t\t\t\t\tif _regionPrefix == \"beta\" {\n\t\t\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Expected a endpoint to be specified but no endpoint was found\")\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".ec2.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4a\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3-outposts\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3-outposts\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningRegions(&sp, []string{\"*\"})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3-outposts\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3-outposts\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".ec2.s3-outposts.\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_regionPartition.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4a\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3-outposts\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3-outposts\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningRegions(&sp, []string{\"*\"})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3-outposts\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3-outposts\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif _hardwareType == \"o\" {\n\t\t\t\t\t\t\t\t\t\t\tif _regionPrefix == \"beta\" {\n\t\t\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Expected a endpoint to be specified but no endpoint was found\")\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".op-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_outpostId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4a\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3-outposts\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3-outposts\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningRegions(&sp, []string{\"*\"})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3-outposts\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3-outposts\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".op-\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_outpostId)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-outposts.\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_regionPartition.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4a\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3-outposts\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3-outposts\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningRegions(&sp, []string{\"*\"})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3-outposts\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3-outposts\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Unrecognized hardware type: \\\"Expected hardware type o or e but got \")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_hardwareType)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"\\\"\")\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`.\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif exprVal := params.Bucket; exprVal != nil {\n\t\t\t_Bucket := *exprVal\n\t\t\t_ = _Bucket\n\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t_ = _Endpoint\n\t\t\t\tif !(rulesfn.ParseURL(_Endpoint) != nil) {\n\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\tout.WriteString(\"Custom endpoint `\")\n\t\t\t\t\t\tout.WriteString(_Endpoint)\n\t\t\t\t\t\tout.WriteString(\"` was not a valid URI\")\n\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t}())\n\t\t\t\t}\n\t\t\t}\n\t\t\tif _ForcePathStyle == false {\n\t\t\t\tif awsrulesfn.IsVirtualHostableS3Bucket(_Bucket, false) {\n\t\t\t\t\tif exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil {\n\t\t\t\t\t\t_partitionResult := *exprVal\n\t\t\t\t\t\t_ = _partitionResult\n\t\t\t\t\t\tif rulesfn.IsValidHostLabel(_Region, false) {\n\t\t\t\t\t\t\tif _Accelerate == true {\n\t\t\t\t\t\t\t\tif _partitionResult.Name == \"aws-cn\" {\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3 Accelerate cannot be used in this region\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\tif _Region == \"aws-global\" {\n\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-fips.dualstack.us-east-1.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, \"us-east-1\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-fips.dualstack.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-fips.dualstack.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\tif _Region == \"aws-global\" {\n\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-fips.us-east-1.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, \"us-east-1\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-fips.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-fips.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Accelerate == true {\n\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\tif _Region == \"aws-global\" {\n\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-accelerate.dualstack.us-east-1.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, \"us-east-1\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Accelerate == true {\n\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-accelerate.dualstack.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Accelerate == true {\n\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-accelerate.dualstack.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\tif _Region == \"aws-global\" {\n\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3.dualstack.us-east-1.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, \"us-east-1\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3.dualstack.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3.dualstack.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\t\t\t\t\tif _url.IsIp == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif _Region == \"aws-global\" {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.NormalizedPath)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, \"us-east-1\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\t\t\t\t\tif _url.IsIp == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif _Region == \"aws-global\" {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, \"us-east-1\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\t\t\t\t\tif _url.IsIp == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _Region == \"us-east-1\" {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.NormalizedPath)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.NormalizedPath)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\t\t\t\t\tif _url.IsIp == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _Region == \"us-east-1\" {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\t\t\t\t\tif _url.IsIp == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.NormalizedPath)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\t\t\t\t\tif _url.IsIp == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Accelerate == true {\n\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\tif _Region == \"aws-global\" {\n\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-accelerate.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, \"us-east-1\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Accelerate == true {\n\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif _Region == \"us-east-1\" {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-accelerate.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-accelerate.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Accelerate == true {\n\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-accelerate.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\tif _Region == \"aws-global\" {\n\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, \"us-east-1\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif _Region == \"us-east-1\" {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid region: region was not a valid DNS name.\")\n\t\t\t\t\t}\n\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t}\n\t\t\t}\n\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t_ = _Endpoint\n\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t_ = _url\n\t\t\t\t\tif _url.Scheme == \"http\" {\n\t\t\t\t\t\tif awsrulesfn.IsVirtualHostableS3Bucket(_Bucket, true) {\n\t\t\t\t\t\t\tif _ForcePathStyle == false {\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\t\t\tif _Accelerate == false {\n\t\t\t\t\t\t\t\t\t\t\tif exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t_partitionResult := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t_ = _partitionResult\n\t\t\t\t\t\t\t\t\t\t\t\tif rulesfn.IsValidHostLabel(_Region, false) {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid region: region was not a valid DNS name.\")\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif _ForcePathStyle == false {\n\t\t\t\tif exprVal := awsrulesfn.ParseARN(_Bucket); exprVal != nil {\n\t\t\t\t\t_bucketArn := *exprVal\n\t\t\t\t\t_ = _bucketArn\n\t\t\t\t\tif exprVal := _bucketArn.ResourceId.Get(0); exprVal != nil {\n\t\t\t\t\t\t_arnType := *exprVal\n\t\t\t\t\t\t_ = _arnType\n\t\t\t\t\t\tif !(_arnType == \"\") {\n\t\t\t\t\t\t\tif _bucketArn.Service == \"s3-object-lambda\" {\n\t\t\t\t\t\t\t\tif _arnType == \"accesspoint\" {\n\t\t\t\t\t\t\t\t\tif exprVal := _bucketArn.ResourceId.Get(1); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t_accessPointName := *exprVal\n\t\t\t\t\t\t\t\t\t\t_ = _accessPointName\n\t\t\t\t\t\t\t\t\t\tif !(_accessPointName == \"\") {\n\t\t\t\t\t\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3 Object Lambda does not support Dual-stack\")\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif _Accelerate == true {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3 Object Lambda does not support S3 Accelerate\")\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif !(_bucketArn.Region == \"\") {\n\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := params.DisableAccessPoints; exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t_DisableAccessPoints := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _DisableAccessPoints\n\t\t\t\t\t\t\t\t\t\t\t\t\tif _DisableAccessPoints == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Access points are not supported for this operation\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tif !(_bucketArn.ResourceId.Get(2) != nil) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := params.UseArnRegion; exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t_UseArnRegion := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _UseArnRegion\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _UseArnRegion == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif !(_bucketArn.Region == _Region) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Invalid configuration: region from ARN `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"` does not match client region `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"` and UseArnRegion is `false`\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := awsrulesfn.GetPartition(_bucketArn.Region); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t_bucketPartition := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _bucketPartition\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_partitionResult := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _partitionResult\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _bucketPartition.Name == _partitionResult.Name {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif rulesfn.IsValidHostLabel(_bucketArn.Region, true) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _bucketArn.AccountId == \"\" {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid ARN: Missing account id\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif rulesfn.IsValidHostLabel(_bucketArn.AccountId, false) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif rulesfn.IsValidHostLabel(_accessPointName, false) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_accessPointName)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.AccountId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3-object-lambda\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3-object-lambda\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_accessPointName)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.AccountId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-object-lambda-fips.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketPartition.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3-object-lambda\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3-object-lambda\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_accessPointName)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.AccountId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-object-lambda.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketPartition.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3-object-lambda\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3-object-lambda\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_accessPointName)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"`\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.AccountId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"`\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Invalid region in ARN: `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"` (invalid DNS name)\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Client was configured for partition `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.Name)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"` but ARN (`\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"`) has `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketPartition.Name)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"`\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.\")\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid ARN: bucket ARN is missing a region\")\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid ARN: Expected a resource of the format `accesspoint:<accesspoint name>` but no name was provided\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\tout.WriteString(\"Invalid ARN: Object Lambda ARNs only support `accesspoint` arn types, but found: `\")\n\t\t\t\t\t\t\t\t\tout.WriteString(_arnType)\n\t\t\t\t\t\t\t\t\tout.WriteString(\"`\")\n\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _arnType == \"accesspoint\" {\n\t\t\t\t\t\t\t\tif exprVal := _bucketArn.ResourceId.Get(1); exprVal != nil {\n\t\t\t\t\t\t\t\t\t_accessPointName := *exprVal\n\t\t\t\t\t\t\t\t\t_ = _accessPointName\n\t\t\t\t\t\t\t\t\tif !(_accessPointName == \"\") {\n\t\t\t\t\t\t\t\t\t\tif !(_bucketArn.Region == \"\") {\n\t\t\t\t\t\t\t\t\t\t\tif _arnType == \"accesspoint\" {\n\t\t\t\t\t\t\t\t\t\t\t\tif !(_bucketArn.Region == \"\") {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := params.DisableAccessPoints; exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t_DisableAccessPoints := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _DisableAccessPoints\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _DisableAccessPoints == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Access points are not supported for this operation\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tif !(_bucketArn.ResourceId.Get(2) != nil) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := params.UseArnRegion; exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_UseArnRegion := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _UseArnRegion\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _UseArnRegion == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif !(_bucketArn.Region == _Region) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Invalid configuration: region from ARN `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"` does not match client region `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"` and UseArnRegion is `false`\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := awsrulesfn.GetPartition(_bucketArn.Region); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_bucketPartition := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _bucketPartition\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_partitionResult := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _partitionResult\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _bucketPartition.Name == _partitionResult.Name {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif rulesfn.IsValidHostLabel(_bucketArn.Region, true) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _bucketArn.Service == \"s3\" {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif rulesfn.IsValidHostLabel(_bucketArn.AccountId, false) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif rulesfn.IsValidHostLabel(_accessPointName, false) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _Accelerate == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Access Points do not support S3 Accelerate\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_accessPointName)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.AccountId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-accesspoint-fips.dualstack.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketPartition.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_accessPointName)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.AccountId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-accesspoint-fips.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketPartition.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_accessPointName)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.AccountId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-accesspoint.dualstack.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketPartition.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_accessPointName)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.AccountId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_accessPointName)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.AccountId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-accesspoint.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketPartition.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_accessPointName)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"`\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.AccountId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"`\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Invalid ARN: The ARN was not for the S3 service, found: \")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.Service)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Invalid region in ARN: `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"` (invalid DNS name)\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Client was configured for partition `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.Name)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"` but ARN (`\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"`) has `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketPartition.Name)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"`\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.\")\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif rulesfn.IsValidHostLabel(_accessPointName, true) {\n\t\t\t\t\t\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3 MRAP does not support dual-stack\")\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3 MRAP does not support FIPS\")\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif _Accelerate == true {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3 MRAP does not support S3 Accelerate\")\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif _DisableMultiRegionAccessPoints == true {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid configuration: Multi-Region Access Point ARNs are disabled.\")\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t_mrapPartition := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t_ = _mrapPartition\n\t\t\t\t\t\t\t\t\t\t\t\tif _mrapPartition.Name == _bucketArn.Partition {\n\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_accessPointName)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".accesspoint.s3-global.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_mrapPartition.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4a\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningRegions(&sp, []string{\"*\"})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Client was configured for partition `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_mrapPartition.Name)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"` but bucket referred to partition `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.Partition)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"`\")\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid Access Point Name\")\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid ARN: Expected a resource of the format `accesspoint:<accesspoint name>` but no name was provided\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif _bucketArn.Service == \"s3-outposts\" {\n\t\t\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3 Outposts does not support Dual-stack\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3 Outposts does not support FIPS\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif _Accelerate == true {\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3 Outposts does not support S3 Accelerate\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif exprVal := _bucketArn.ResourceId.Get(4); exprVal != nil {\n\t\t\t\t\t\t\t\t\t_var_321 := *exprVal\n\t\t\t\t\t\t\t\t\t_ = _var_321\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid Arn: Outpost Access Point ARN contains sub resources\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif exprVal := _bucketArn.ResourceId.Get(1); exprVal != nil {\n\t\t\t\t\t\t\t\t\t_outpostId := *exprVal\n\t\t\t\t\t\t\t\t\t_ = _outpostId\n\t\t\t\t\t\t\t\t\tif rulesfn.IsValidHostLabel(_outpostId, false) {\n\t\t\t\t\t\t\t\t\t\tif exprVal := params.UseArnRegion; exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t_UseArnRegion := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t_ = _UseArnRegion\n\t\t\t\t\t\t\t\t\t\t\tif _UseArnRegion == false {\n\t\t\t\t\t\t\t\t\t\t\t\tif !(_bucketArn.Region == _Region) {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Invalid configuration: region from ARN `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"` does not match client region `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"` and UseArnRegion is `false`\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif exprVal := awsrulesfn.GetPartition(_bucketArn.Region); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t_bucketPartition := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t_ = _bucketPartition\n\t\t\t\t\t\t\t\t\t\t\tif exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t_partitionResult := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t_ = _partitionResult\n\t\t\t\t\t\t\t\t\t\t\t\tif _bucketPartition.Name == _partitionResult.Name {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif rulesfn.IsValidHostLabel(_bucketArn.Region, true) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif rulesfn.IsValidHostLabel(_bucketArn.AccountId, false) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := _bucketArn.ResourceId.Get(2); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_outpostType := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _outpostType\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := _bucketArn.ResourceId.Get(3); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_accessPointName := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _accessPointName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif _outpostType == \"accesspoint\" {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_accessPointName)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.AccountId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_outpostId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4a\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3-outposts\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3-outposts\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningRegions(&sp, []string{\"*\"})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3-outposts\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3-outposts\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_accessPointName)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"-\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.AccountId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_outpostId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".s3-outposts.\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketPartition.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4a\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3-outposts\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3-outposts\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningRegions(&sp, []string{\"*\"})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3-outposts\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3-outposts\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Expected an outpost type `accesspoint`, found \")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_outpostType)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid ARN: expected an access point name\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid ARN: Expected a 4-component resource\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.AccountId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"`\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Invalid region in ARN: `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketArn.Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"` (invalid DNS name)\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Client was configured for partition `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.Name)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"` but ARN (`\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"`) has `\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_bucketPartition.Name)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"`\")\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\tout.WriteString(\"Invalid ARN: The outpost Id may only contain a-z, A-Z, 0-9 and `-`. Found: `\")\n\t\t\t\t\t\t\t\t\t\tout.WriteString(_outpostId)\n\t\t\t\t\t\t\t\t\t\tout.WriteString(\"`\")\n\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid ARN: The Outpost Id was not set\")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\tout.WriteString(\"Invalid ARN: Unrecognized format: \")\n\t\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\t\tout.WriteString(\" (type: \")\n\t\t\t\t\t\t\t\tout.WriteString(_arnType)\n\t\t\t\t\t\t\t\tout.WriteString(\")\")\n\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t}())\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid ARN: No ARN type specified\")\n\t\t\t\t}\n\t\t\t}\n\t\t\tif exprVal := rulesfn.SubString(_Bucket, 0, 4, false); exprVal != nil {\n\t\t\t\t_arnPrefix := *exprVal\n\t\t\t\t_ = _arnPrefix\n\t\t\t\tif _arnPrefix == \"arn:\" {\n\t\t\t\t\tif !(awsrulesfn.ParseARN(_Bucket) != nil) {\n\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", func() string {\n\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\tout.WriteString(\"Invalid ARN: `\")\n\t\t\t\t\t\t\tout.WriteString(_Bucket)\n\t\t\t\t\t\t\tout.WriteString(\"` was not a valid ARN\")\n\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t}())\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif _ForcePathStyle == true {\n\t\t\t\tif exprVal := awsrulesfn.ParseARN(_Bucket); exprVal != nil {\n\t\t\t\t\t_var_334 := *exprVal\n\t\t\t\t\t_ = _var_334\n\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Path-style addressing cannot be used with ARN buckets\")\n\t\t\t\t}\n\t\t\t}\n\t\t\t_uri_encoded_bucket := rulesfn.URIEncode(_Bucket)\n\t\t\t_ = _uri_encoded_bucket\n\t\t\tif exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil {\n\t\t\t\t_partitionResult := *exprVal\n\t\t\t\t_ = _partitionResult\n\t\t\t\tif _Accelerate == false {\n\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\tif _Region == \"aws-global\" {\n\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3-fips.dualstack.us-east-1.\")\n\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, \"us-east-1\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == true {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3-fips.dualstack.\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == false {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3-fips.dualstack.\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\tif _Region == \"aws-global\" {\n\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3-fips.us-east-1.\")\n\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, \"us-east-1\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == true {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3-fips.\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == false {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3-fips.\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\tif _Region == \"aws-global\" {\n\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3.dualstack.us-east-1.\")\n\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, \"us-east-1\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == true {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3.dualstack.\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == false {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3.dualstack.\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif _Region == \"aws-global\" {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.NormalizedPath)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, \"us-east-1\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == true {\n\t\t\t\t\t\t\t\t\t\t\tif _Region == \"us-east-1\" {\n\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.NormalizedPath)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.NormalizedPath)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == false {\n\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.NormalizedPath)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\tif _Region == \"aws-global\" {\n\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3.\")\n\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, \"us-east-1\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == true {\n\t\t\t\t\t\t\t\t\t\tif _Region == \"us-east-1\" {\n\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3.\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3.\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == false {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3.\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"/\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_uri_encoded_bucket)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t}\n\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Path-style addressing cannot be used with S3 Accelerate\")\n\t\t\t}\n\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t}\n\t\tif exprVal := params.UseObjectLambdaEndpoint; exprVal != nil {\n\t\t\t_UseObjectLambdaEndpoint := *exprVal\n\t\t\t_ = _UseObjectLambdaEndpoint\n\t\t\tif _UseObjectLambdaEndpoint == true {\n\t\t\t\tif exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil {\n\t\t\t\t\t_partitionResult := *exprVal\n\t\t\t\t\t_ = _partitionResult\n\t\t\t\t\tif rulesfn.IsValidHostLabel(_Region, true) {\n\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3 Object Lambda does not support Dual-stack\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif _Accelerate == true {\n\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"S3 Object Lambda does not support S3 Accelerate\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3-object-lambda\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3-object-lambda\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\tout.WriteString(\"https://s3-object-lambda-fips.\")\n\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3-object-lambda\")\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3-object-lambda\")\n\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t}\n\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\tout.WriteString(\"https://s3-object-lambda.\")\n\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t}()\n\n\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3-object-lambda\")\n\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3-object-lambda\")\n\n\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t}, nil\n\t\t\t\t\t}\n\t\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid region: region was not a valid DNS name.\")\n\t\t\t\t}\n\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t}\n\t\t}\n\t\tif !(params.Bucket != nil) {\n\t\t\tif exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil {\n\t\t\t\t_partitionResult := *exprVal\n\t\t\t\t_ = _partitionResult\n\t\t\t\tif rulesfn.IsValidHostLabel(_Region, true) {\n\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\tif _Region == \"aws-global\" {\n\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3-fips.dualstack.us-east-1.\")\n\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, \"us-east-1\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == true {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3-fips.dualstack.\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == false {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3-fips.dualstack.\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\tif _Region == \"aws-global\" {\n\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3-fips.us-east-1.\")\n\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, \"us-east-1\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == true {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3-fips.\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseFIPS == true {\n\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == false {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3-fips.\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\tif _Region == \"aws-global\" {\n\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3.dualstack.us-east-1.\")\n\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, \"us-east-1\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == true {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3.dualstack.\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\tif _UseDualStack == true {\n\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == false {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3.dualstack.\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\t\tif _Region == \"aws-global\" {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, \"us-east-1\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == true {\n\t\t\t\t\t\t\t\t\t\t\tif _Region == \"us-east-1\" {\n\t\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\tif exprVal := params.Endpoint; exprVal != nil {\n\t\t\t\t\t\t\t\t_Endpoint := *exprVal\n\t\t\t\t\t\t\t\t_ = _Endpoint\n\t\t\t\t\t\t\t\tif exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil {\n\t\t\t\t\t\t\t\t\t_url := *exprVal\n\t\t\t\t\t\t\t\t\t_ = _url\n\t\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == false {\n\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Scheme)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"://\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Authority)\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_url.Path)\n\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\tif _Region == \"aws-global\" {\n\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3.\")\n\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, \"us-east-1\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == true {\n\t\t\t\t\t\t\t\t\t\tif _Region == \"us-east-1\" {\n\t\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3.\")\n\t\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3.\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif _UseFIPS == false {\n\t\t\t\t\t\tif _UseDualStack == false {\n\t\t\t\t\t\t\tif !(params.Endpoint != nil) {\n\t\t\t\t\t\t\t\tif !(_Region == \"aws-global\") {\n\t\t\t\t\t\t\t\t\tif _UseGlobalEndpoint == false {\n\t\t\t\t\t\t\t\t\t\turiString := func() string {\n\t\t\t\t\t\t\t\t\t\t\tvar out strings.Builder\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\"https://s3.\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_Region)\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(\".\")\n\t\t\t\t\t\t\t\t\t\t\tout.WriteString(_partitionResult.DnsSuffix)\n\t\t\t\t\t\t\t\t\t\t\treturn out.String()\n\t\t\t\t\t\t\t\t\t\t}()\n\n\t\t\t\t\t\t\t\t\t\turi, err := url.Parse(uriString)\n\t\t\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\t\t\treturn endpoint, fmt.Errorf(\"Failed to parse uri: %s\", uriString)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn smithyendpoints.Endpoint{\n\t\t\t\t\t\t\t\t\t\t\tURI:     *uri,\n\t\t\t\t\t\t\t\t\t\t\tHeaders: http.Header{},\n\t\t\t\t\t\t\t\t\t\t\tProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\tvar out smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\tsmithyauth.SetAuthOptions(&out, []*smithyauth.Option{\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSchemeID: \"aws.auth#sigv4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSignerProperties: func() smithy.Properties {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar sp smithy.Properties\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetDisableDoubleEncoding(&sp, true)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningName(&sp, \"s3\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4ASigningName(&sp, \"s3\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsmithyhttp.SetSigV4SigningRegion(&sp, _Region)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn sp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\treturn out\n\t\t\t\t\t\t\t\t\t\t\t}(),\n\t\t\t\t\t\t\t\t\t\t}, nil\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t\t\t}\n\t\t\t\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"Invalid region: region was not a valid DNS name.\")\n\t\t\t}\n\t\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t\t}\n\t\treturn endpoint, fmt.Errorf(\"Endpoint resolution failed. Invalid operation or environment input.\")\n\t}\n\treturn endpoint, fmt.Errorf(\"endpoint rule error, %s\", \"A region must be set when sending requests to S3.\")\n}\n\ntype endpointParamsBinder interface {\n\tbindEndpointParams(*EndpointParameters)\n}\n\nfunc bindEndpointParams(ctx context.Context, input interface{}, options Options) *EndpointParameters {\n\tparams := &EndpointParameters{}\n\n\tparams.Region = bindRegion(options.Region)\n\tparams.UseFIPS = aws.Bool(options.EndpointOptions.UseFIPSEndpoint == aws.FIPSEndpointStateEnabled)\n\tparams.UseDualStack = aws.Bool(options.EndpointOptions.UseDualStackEndpoint == aws.DualStackEndpointStateEnabled)\n\tparams.Endpoint = options.BaseEndpoint\n\tparams.ForcePathStyle = aws.Bool(options.UsePathStyle)\n\tparams.Accelerate = aws.Bool(options.UseAccelerate)\n\tparams.DisableMultiRegionAccessPoints = aws.Bool(options.DisableMultiRegionAccessPoints)\n\tparams.UseArnRegion = aws.Bool(options.UseARNRegion)\n\n\tparams.DisableS3ExpressSessionAuth = options.DisableS3ExpressSessionAuth\n\n\tif b, ok := input.(endpointParamsBinder); ok {\n\t\tb.bindEndpointParams(params)\n\t}\n\n\treturn params\n}\n\ntype resolveEndpointV2Middleware struct {\n\toptions Options\n}\n\nfunc (*resolveEndpointV2Middleware) ID() string {\n\treturn \"ResolveEndpointV2\"\n}\n\nfunc (m *resolveEndpointV2Middleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n) {\n\t_, span := tracing.StartSpan(ctx, \"ResolveEndpoint\")\n\tdefer span.End()\n\n\tif awsmiddleware.GetRequiresLegacyEndpoints(ctx) {\n\t\treturn next.HandleFinalize(ctx, in)\n\t}\n\n\treq, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type %T\", in.Request)\n\t}\n\n\tif m.options.EndpointResolverV2 == nil {\n\t\treturn out, metadata, fmt.Errorf(\"expected endpoint resolver to not be nil\")\n\t}\n\n\tparams := bindEndpointParams(ctx, getOperationInput(ctx), m.options)\n\tendpt, err := timeOperationMetric(ctx, \"client.call.resolve_endpoint_duration\",\n\t\tfunc() (smithyendpoints.Endpoint, error) {\n\t\t\treturn m.options.EndpointResolverV2.ResolveEndpoint(ctx, *params)\n\t\t})\n\tif err != nil {\n\t\treturn out, metadata, fmt.Errorf(\"failed to resolve service endpoint, %w\", err)\n\t}\n\n\tspan.SetProperty(\"client.call.resolved_endpoint\", endpt.URI.String())\n\n\tif endpt.URI.RawPath == \"\" && req.URL.RawPath != \"\" {\n\t\tendpt.URI.RawPath = endpt.URI.Path\n\t}\n\treq.URL.Scheme = endpt.URI.Scheme\n\treq.URL.Host = endpt.URI.Host\n\treq.URL.Path = smithyhttp.JoinPath(endpt.URI.Path, req.URL.Path)\n\treq.URL.RawPath = smithyhttp.JoinPath(endpt.URI.RawPath, req.URL.RawPath)\n\tfor k := range endpt.Headers {\n\t\treq.Header.Set(k, endpt.Headers.Get(k))\n\t}\n\n\trscheme := getResolvedAuthScheme(ctx)\n\tif rscheme == nil {\n\t\treturn out, metadata, fmt.Errorf(\"no resolved auth scheme\")\n\t}\n\n\topts, _ := smithyauth.GetAuthOptions(&endpt.Properties)\n\tfor _, o := range opts {\n\t\trscheme.SignerProperties.SetAll(&o.SignerProperties)\n\t}\n\n\tctx = setS3ResolvedURI(ctx, endpt.URI.String())\n\n\tbackend := s3cust.GetPropertiesBackend(&endpt.Properties)\n\tctx = internalcontext.SetS3Backend(ctx, backend)\n\n\tspan.End()\n\treturn next.HandleFinalize(ctx, in)\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/eventstream.go",
    "content": "// Code generated by smithy-go-codegen DO NOT EDIT.\n\npackage s3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\tsmithy \"github.com/aws/smithy-go\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithysync \"github.com/aws/smithy-go/sync\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"sync\"\n)\n\n// SelectObjectContentEventStreamReader provides the interface for reading events\n// from a stream.\n//\n// The writer's Close method must allow multiple concurrent calls.\ntype SelectObjectContentEventStreamReader interface {\n\tEvents() <-chan types.SelectObjectContentEventStream\n\tClose() error\n\tErr() error\n}\n\ntype selectObjectContentEventStreamReader struct {\n\tstream      chan types.SelectObjectContentEventStream\n\tdecoder     *eventstream.Decoder\n\teventStream io.ReadCloser\n\terr         *smithysync.OnceErr\n\tpayloadBuf  []byte\n\tdone        chan struct{}\n\tcloseOnce   sync.Once\n}\n\nfunc newSelectObjectContentEventStreamReader(readCloser io.ReadCloser, decoder *eventstream.Decoder) *selectObjectContentEventStreamReader {\n\tw := &selectObjectContentEventStreamReader{\n\t\tstream:      make(chan types.SelectObjectContentEventStream),\n\t\tdecoder:     decoder,\n\t\teventStream: readCloser,\n\t\terr:         smithysync.NewOnceErr(),\n\t\tdone:        make(chan struct{}),\n\t\tpayloadBuf:  make([]byte, 10*1024),\n\t}\n\n\tgo w.readEventStream()\n\n\treturn w\n}\n\nfunc (r *selectObjectContentEventStreamReader) Events() <-chan types.SelectObjectContentEventStream {\n\treturn r.stream\n}\n\nfunc (r *selectObjectContentEventStreamReader) readEventStream() {\n\tdefer r.Close()\n\tdefer close(r.stream)\n\n\tfor {\n\t\tr.payloadBuf = r.payloadBuf[0:0]\n\t\tdecodedMessage, err := r.decoder.Decode(r.eventStream, r.payloadBuf)\n\t\tif err != nil {\n\t\t\tif err == io.EOF {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tselect {\n\t\t\tcase <-r.done:\n\t\t\t\treturn\n\t\t\tdefault:\n\t\t\t\tr.err.SetError(err)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tevent, err := r.deserializeEventMessage(&decodedMessage)\n\t\tif err != nil {\n\t\t\tr.err.SetError(err)\n\t\t\treturn\n\t\t}\n\n\t\tselect {\n\t\tcase r.stream <- event:\n\t\tcase <-r.done:\n\t\t\treturn\n\t\t}\n\n\t}\n}\n\nfunc (r *selectObjectContentEventStreamReader) deserializeEventMessage(msg *eventstream.Message) (types.SelectObjectContentEventStream, error) {\n\tmessageType := msg.Headers.Get(eventstreamapi.MessageTypeHeader)\n\tif messageType == nil {\n\t\treturn nil, fmt.Errorf(\"%s event header not present\", eventstreamapi.MessageTypeHeader)\n\t}\n\n\tswitch messageType.String() {\n\tcase eventstreamapi.EventMessageType:\n\t\tvar v types.SelectObjectContentEventStream\n\t\tif err := awsRestxml_deserializeEventStreamSelectObjectContentEventStream(&v, msg); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn v, nil\n\n\tcase eventstreamapi.ExceptionMessageType:\n\t\treturn nil, awsRestxml_deserializeEventStreamExceptionSelectObjectContentEventStream(msg)\n\n\tcase eventstreamapi.ErrorMessageType:\n\t\terrorCode := \"UnknownError\"\n\t\terrorMessage := errorCode\n\t\tif header := msg.Headers.Get(eventstreamapi.ErrorCodeHeader); header != nil {\n\t\t\terrorCode = header.String()\n\t\t}\n\t\tif header := msg.Headers.Get(eventstreamapi.ErrorMessageHeader); header != nil {\n\t\t\terrorMessage = header.String()\n\t\t}\n\t\treturn nil, &smithy.GenericAPIError{\n\t\t\tCode:    errorCode,\n\t\t\tMessage: errorMessage,\n\t\t}\n\n\tdefault:\n\t\tmc := msg.Clone()\n\t\treturn nil, &UnknownEventMessageError{\n\t\t\tType:    messageType.String(),\n\t\t\tMessage: &mc,\n\t\t}\n\n\t}\n}\n\nfunc (r *selectObjectContentEventStreamReader) ErrorSet() <-chan struct{} {\n\treturn r.err.ErrorSet()\n}\n\nfunc (r *selectObjectContentEventStreamReader) Close() error {\n\tr.closeOnce.Do(r.safeClose)\n\treturn r.Err()\n}\n\nfunc (r *selectObjectContentEventStreamReader) safeClose() {\n\tclose(r.done)\n\tr.eventStream.Close()\n\n}\n\nfunc (r *selectObjectContentEventStreamReader) Err() error {\n\treturn r.err.Err()\n}\n\nfunc (r *selectObjectContentEventStreamReader) Closed() <-chan struct{} {\n\treturn r.done\n}\n\ntype awsRestxml_deserializeOpEventStreamSelectObjectContent struct {\n\tLogEventStreamWrites bool\n\tLogEventStreamReads  bool\n}\n\nfunc (*awsRestxml_deserializeOpEventStreamSelectObjectContent) ID() string {\n\treturn \"OperationEventStreamDeserializer\"\n}\n\nfunc (m *awsRestxml_deserializeOpEventStreamSelectObjectContent) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (\n\tout middleware.DeserializeOutput, metadata middleware.Metadata, err error,\n) {\n\tdefer func() {\n\t\tif err == nil {\n\t\t\treturn\n\t\t}\n\t\tm.closeResponseBody(out)\n\t}()\n\n\tlogger := middleware.GetLogger(ctx)\n\n\trequest, ok := in.Request.(*smithyhttp.Request)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type: %T\", in.Request)\n\t}\n\t_ = request\n\n\tout, metadata, err = next.HandleDeserialize(ctx, in)\n\tif err != nil {\n\t\treturn out, metadata, err\n\t}\n\n\tdeserializeOutput, ok := out.RawResponse.(*smithyhttp.Response)\n\tif !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unknown transport type: %T\", out.RawResponse)\n\t}\n\t_ = deserializeOutput\n\n\toutput, ok := out.Result.(*SelectObjectContentOutput)\n\tif out.Result != nil && !ok {\n\t\treturn out, metadata, fmt.Errorf(\"unexpected output result type: %T\", out.Result)\n\t} else if out.Result == nil {\n\t\toutput = &SelectObjectContentOutput{}\n\t\tout.Result = output\n\t}\n\n\teventReader := newSelectObjectContentEventStreamReader(\n\t\tdeserializeOutput.Body,\n\t\teventstream.NewDecoder(func(options *eventstream.DecoderOptions) {\n\t\t\toptions.Logger = logger\n\t\t\toptions.LogMessages = m.LogEventStreamReads\n\n\t\t}),\n\t)\n\tdefer func() {\n\t\tif err == nil {\n\t\t\treturn\n\t\t}\n\t\t_ = eventReader.Close()\n\t}()\n\n\toutput.eventStream = NewSelectObjectContentEventStream(func(stream *SelectObjectContentEventStream) {\n\t\tstream.Reader = eventReader\n\t})\n\n\tgo output.eventStream.waitStreamClose()\n\n\treturn out, metadata, nil\n}\n\nfunc (*awsRestxml_deserializeOpEventStreamSelectObjectContent) closeResponseBody(out middleware.DeserializeOutput) {\n\tif resp, ok := out.RawResponse.(*smithyhttp.Response); ok && resp != nil && resp.Body != nil {\n\t\t_, _ = io.Copy(ioutil.Discard, resp.Body)\n\t\t_ = resp.Body.Close()\n\t}\n}\n\nfunc addEventStreamSelectObjectContentMiddleware(stack *middleware.Stack, options Options) error {\n\tif err := stack.Deserialize.Insert(&awsRestxml_deserializeOpEventStreamSelectObjectContent{\n\t\tLogEventStreamWrites: options.ClientLogMode.IsRequestEventMessage(),\n\t\tLogEventStreamReads:  options.ClientLogMode.IsResponseEventMessage(),\n\t}, \"OperationDeserializer\", middleware.Before); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n\n}\n\n// UnknownEventMessageError provides an error when a message is received from the stream,\n// but the reader is unable to determine what kind of message it is.\ntype UnknownEventMessageError struct {\n\tType    string\n\tMessage *eventstream.Message\n}\n\n// Error retruns the error message string.\nfunc (e *UnknownEventMessageError) Error() string {\n\treturn \"unknown event stream message type, \" + e.Type\n}\n\nfunc setSafeEventStreamClientLogMode(o *Options, operation string) {\n\tswitch operation {\n\tcase \"SelectObjectContent\":\n\t\ttoggleEventStreamClientLogMode(o, false, true)\n\t\treturn\n\n\tdefault:\n\t\treturn\n\n\t}\n}\nfunc toggleEventStreamClientLogMode(o *Options, request, response bool) {\n\tmode := o.ClientLogMode\n\n\tif request && mode.IsRequestWithBody() {\n\t\tmode.ClearRequestWithBody()\n\t\tmode |= aws.LogRequest\n\t}\n\n\tif response && mode.IsResponseWithBody() {\n\t\tmode.ClearResponseWithBody()\n\t\tmode |= aws.LogResponse\n\t}\n\n\to.ClientLogMode = mode\n\n}\n"
  },
  {
    "path": "vendor/github.com/aws/aws-sdk-go-v2/service/s3/express.go",
    "content": "package s3\n\nimport (\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations\"\n)\n\n// ExpressCredentialsProvider retrieves credentials for operations against the\n// S3Express storage class.\ntype ExpressCredentialsProvider = customizations.S3ExpressCredentialsProvider\n"
  },
  {
    "path": "vendor/github.com/docker/go-connections/sockets/README.md",
    "content": ""
  },
  {
    "path": "vendor/github.com/felixge/httpsnoop/.gitignore",
    "content": ""
  },
  {
    "path": "vendor/github.com/kevinburke/ssh_config/.gitignore",
    "content": ""
  },
  {
    "path": "vendor/github.com/klauspost/compress/s2sx.sum",
    "content": ""
  }
]